From 6a06907d49497be0fa370db58eb5d712226c42d0 Mon Sep 17 00:00:00 2001 From: Ximin Luo Date: Thu, 15 Apr 2021 23:27:12 +0100 Subject: [PATCH] New upstream version 1.52.0~beta.3+dfsg1 --- CONTRIBUTING.md | 30 +- Cargo.lock | 528 +- README.md | 4 +- RELEASES.md | 209 +- compiler/rustc/src/main.rs | 16 +- compiler/rustc_apfloat/Cargo.toml | 2 +- compiler/rustc_arena/Cargo.toml | 3 +- compiler/rustc_arena/src/lib.rs | 66 +- compiler/rustc_arena/src/tests.rs | 18 + compiler/rustc_ast/Cargo.toml | 2 +- compiler/rustc_ast/src/ast.rs | 174 +- compiler/rustc_ast/src/ast_like.rs | 198 + compiler/rustc_ast/src/attr/mod.rs | 111 +- compiler/rustc_ast/src/lib.rs | 3 +- compiler/rustc_ast/src/mut_visit.rs | 81 +- compiler/rustc_ast/src/node_id.rs | 14 +- compiler/rustc_ast/src/token.rs | 81 +- compiler/rustc_ast/src/tokenstream.rs | 2 +- compiler/rustc_ast/src/visit.rs | 56 +- compiler/rustc_ast_lowering/Cargo.toml | 2 +- compiler/rustc_ast_lowering/src/expr.rs | 305 +- compiler/rustc_ast_lowering/src/item.rs | 225 +- compiler/rustc_ast_lowering/src/lib.rs | 304 +- compiler/rustc_ast_lowering/src/pat.rs | 2 +- compiler/rustc_ast_lowering/src/path.rs | 13 +- .../rustc_ast_passes/src/ast_validation.rs | 6 +- compiler/rustc_ast_passes/src/feature_gate.rs | 47 +- compiler/rustc_ast_passes/src/node_count.rs | 8 +- compiler/rustc_ast_pretty/src/pprust/state.rs | 69 +- compiler/rustc_attr/src/builtin.rs | 37 +- compiler/rustc_builtin_macros/Cargo.toml | 3 +- compiler/rustc_builtin_macros/src/asm.rs | 73 +- compiler/rustc_builtin_macros/src/cfg_eval.rs | 157 + compiler/rustc_builtin_macros/src/derive.rs | 114 + .../src/deriving/cmp/ord.rs | 5 +- .../src/deriving/cmp/partial_ord.rs | 199 +- .../src/deriving/debug.rs | 21 +- .../src/deriving/decodable.rs | 47 +- .../src/deriving/encodable.rs | 57 +- .../src/deriving/generic/mod.rs | 2 +- compiler/rustc_builtin_macros/src/format.rs | 2 +- .../src/format_foreign.rs | 4 +- .../rustc_builtin_macros/src/global_asm.rs | 2 +- compiler/rustc_builtin_macros/src/lib.rs | 5 + .../src/proc_macro_harness.rs | 2 +- .../rustc_builtin_macros/src/source_util.rs | 11 +- .../src/standard_library_imports.rs | 39 +- .../rustc_builtin_macros/src/test_harness.rs | 15 +- compiler/rustc_codegen_cranelift/.cirrus.yml | 25 + .../.github/workflows/main.yml | 5 +- .../.vscode/settings.json | 2 +- compiler/rustc_codegen_cranelift/Cargo.lock | 128 +- compiler/rustc_codegen_cranelift/Cargo.toml | 5 +- compiler/rustc_codegen_cranelift/build.sh | 16 +- .../build_sysroot/Cargo.lock | 20 +- .../build_sysroot/Cargo.toml | 2 - .../build_sysroot/alloc_system/Cargo.toml | 13 - .../build_sysroot/build_sysroot.sh | 2 +- .../build_sysroot/prepare_sysroot_src.sh | 4 +- compiler/rustc_codegen_cranelift/clean_all.sh | 2 +- ...ins-Disable-128bit-atomic-operations.patch | 48 + .../example/alloc_example.rs | 2 +- .../lib.rs => example/alloc_system.rs} | 136 +- ...itrary_self_types_pointers_and_wrappers.rs | 31 +- .../example/mini_core.rs | 16 + .../example/mini_core_hello_world.rs | 3 + ...022-core-Disable-not-compiling-tests.patch | 16 - ...027-Disable-128bit-atomic-operations.patch | 103 + compiler/rustc_codegen_cranelift/prepare.sh | 2 +- .../rustc_codegen_cranelift/rust-toolchain | 2 +- compiler/rustc_codegen_cranelift/rustfmt.toml | 4 + .../rustc_codegen_cranelift/scripts/cargo.sh | 2 +- .../rustc_codegen_cranelift/scripts/config.sh | 4 +- .../rustc_codegen_cranelift/scripts/rustup.sh | 2 +- .../scripts/test_bootstrap.sh | 42 +- .../rustc_codegen_cranelift/scripts/tests.sh | 9 +- .../src/abi/comments.rs | 56 +- .../rustc_codegen_cranelift/src/abi/mod.rs | 141 +- .../src/abi/pass_mode.rs | 108 +- .../src/abi/returning.rs | 90 +- .../rustc_codegen_cranelift/src/allocator.rs | 29 +- .../rustc_codegen_cranelift/src/analyze.rs | 9 +- .../rustc_codegen_cranelift/src/archive.rs | 49 +- .../src/atomic_shim.rs | 185 - .../rustc_codegen_cranelift/src/backend.rs | 62 +- compiler/rustc_codegen_cranelift/src/base.rs | 296 +- .../src/bin/cg_clif.rs | 8 +- .../src/bin/cg_clif_build_sysroot.rs | 11 +- compiler/rustc_codegen_cranelift/src/cast.rs | 34 +- .../src/codegen_i128.rs | 85 +- .../rustc_codegen_cranelift/src/common.rs | 111 +- .../rustc_codegen_cranelift/src/constant.rs | 142 +- .../src/debuginfo/emit.rs | 14 +- .../src/debuginfo/line_info.rs | 75 +- .../src/debuginfo/mod.rs | 157 +- .../src/debuginfo/unwind.rs | 27 +- .../src/discriminant.rs | 45 +- .../rustc_codegen_cranelift/src/driver/aot.rs | 124 +- .../rustc_codegen_cranelift/src/driver/jit.rs | 126 +- .../rustc_codegen_cranelift/src/driver/mod.rs | 32 +- .../rustc_codegen_cranelift/src/inline_asm.rs | 57 +- .../src/intrinsics/cpuid.rs | 44 +- .../src/intrinsics/llvm.rs | 8 +- .../src/intrinsics/mod.rs | 276 +- .../src/intrinsics/simd.rs | 11 +- compiler/rustc_codegen_cranelift/src/lib.rs | 59 +- .../rustc_codegen_cranelift/src/main_shim.rs | 29 +- .../rustc_codegen_cranelift/src/metadata.rs | 4 +- compiler/rustc_codegen_cranelift/src/num.rs | 72 +- .../src/optimize/code_layout.rs | 10 +- .../src/optimize/mod.rs | 7 +- .../src/optimize/peephole.rs | 22 +- .../src/optimize/stack2reg.rs | 49 +- .../rustc_codegen_cranelift/src/pointer.rs | 123 +- .../src/pretty_clif.rs | 72 +- .../rustc_codegen_cranelift/src/toolchain.rs | 15 +- compiler/rustc_codegen_cranelift/src/trap.rs | 12 +- .../rustc_codegen_cranelift/src/unsize.rs | 75 +- .../src/value_and_place.rs | 187 +- .../rustc_codegen_cranelift/src/vtable.rs | 23 +- compiler/rustc_codegen_cranelift/test.sh | 2 +- compiler/rustc_codegen_llvm/Cargo.toml | 5 +- compiler/rustc_codegen_llvm/src/abi.rs | 19 +- compiler/rustc_codegen_llvm/src/allocator.rs | 2 +- compiler/rustc_codegen_llvm/src/asm.rs | 13 +- compiler/rustc_codegen_llvm/src/attributes.rs | 63 +- compiler/rustc_codegen_llvm/src/back/write.rs | 20 +- compiler/rustc_codegen_llvm/src/builder.rs | 8 +- compiler/rustc_codegen_llvm/src/consts.rs | 6 +- compiler/rustc_codegen_llvm/src/context.rs | 145 +- .../src/coverageinfo/mapgen.rs | 4 +- .../src/coverageinfo/mod.rs | 4 +- .../src/debuginfo/create_scope_map.rs | 6 +- .../src/debuginfo/metadata.rs | 38 +- .../rustc_codegen_llvm/src/debuginfo/mod.rs | 31 +- compiler/rustc_codegen_llvm/src/declare.rs | 24 +- compiler/rustc_codegen_llvm/src/intrinsic.rs | 180 +- compiler/rustc_codegen_llvm/src/llvm/ffi.rs | 16 +- compiler/rustc_codegen_llvm/src/llvm_util.rs | 66 +- compiler/rustc_codegen_llvm/src/metadata.rs | 4 +- compiler/rustc_codegen_ssa/Cargo.toml | 3 +- compiler/rustc_codegen_ssa/src/back/link.rs | 36 +- compiler/rustc_codegen_ssa/src/back/lto.rs | 2 +- compiler/rustc_codegen_ssa/src/back/rpath.rs | 2 +- compiler/rustc_codegen_ssa/src/back/write.rs | 233 +- compiler/rustc_codegen_ssa/src/base.rs | 2 +- compiler/rustc_codegen_ssa/src/common.rs | 1 + .../rustc_codegen_ssa/src/coverageinfo/map.rs | 21 +- compiler/rustc_codegen_ssa/src/lib.rs | 3 +- compiler/rustc_codegen_ssa/src/mir/analyze.rs | 17 +- compiler/rustc_codegen_ssa/src/mir/block.rs | 172 +- .../rustc_codegen_ssa/src/mir/constant.rs | 9 +- .../rustc_codegen_ssa/src/mir/coverageinfo.rs | 25 +- .../rustc_codegen_ssa/src/mir/debuginfo.rs | 32 +- .../rustc_codegen_ssa/src/mir/intrinsic.rs | 13 - compiler/rustc_codegen_ssa/src/mir/mod.rs | 2 - compiler/rustc_codegen_ssa/src/mir/rvalue.rs | 6 +- .../rustc_codegen_ssa/src/mir/statement.rs | 22 +- compiler/rustc_codegen_ssa/src/mono_item.rs | 4 +- .../rustc_codegen_ssa/src/traits/intrinsic.rs | 7 +- compiler/rustc_data_structures/Cargo.toml | 8 +- .../rustc_data_structures/src/const_cstr.rs | 30 - .../rustc_data_structures/src/fingerprint.rs | 28 +- .../src/graph/dominators/mod.rs | 4 + compiler/rustc_data_structures/src/lib.rs | 2 - compiler/rustc_data_structures/src/macros.rs | 8 +- .../rustc_data_structures/src/profiling.rs | 2 +- compiler/rustc_data_structures/src/sharded.rs | 30 +- .../src/stable_hasher.rs | 1 + .../rustc_data_structures/src/tiny_list.rs | 14 +- .../src/tiny_list/tests.rs | 11 + .../src/transitive_relation.rs | 10 +- .../src/transitive_relation/tests.rs | 8 + compiler/rustc_driver/Cargo.toml | 8 +- compiler/rustc_driver/src/args.rs | 16 +- compiler/rustc_driver/src/lib.rs | 21 +- compiler/rustc_driver/src/pretty.rs | 149 +- compiler/rustc_error_codes/src/error_codes.rs | 13 +- .../src/error_codes/E0074.md | 4 +- .../src/error_codes/E0076.md | 4 +- .../src/error_codes/E0077.md | 2 +- .../src/error_codes/E0162.md | 2 +- .../src/error_codes/E0165.md | 2 +- .../src/error_codes/E0202.md | 15 - .../src/error_codes/E0542.md | 47 + .../src/error_codes/E0543.md | 35 + .../src/error_codes/E0545.md | 35 + .../src/error_codes/E0546.md | 11 +- .../src/error_codes/E0547.md | 37 + .../src/error_codes/E0549.md | 37 + .../src/error_codes/E0761.md | 2 +- compiler/rustc_error_codes/src/lib.rs | 3 +- compiler/rustc_errors/src/diagnostic.rs | 30 + .../rustc_errors/src/diagnostic_builder.rs | 21 +- compiler/rustc_errors/src/emitter.rs | 27 +- compiler/rustc_errors/src/json.rs | 67 +- compiler/rustc_errors/src/lib.rs | 55 +- compiler/rustc_expand/Cargo.toml | 2 +- compiler/rustc_expand/src/base.rs | 231 +- compiler/rustc_expand/src/build.rs | 15 +- compiler/rustc_expand/src/config.rs | 201 +- compiler/rustc_expand/src/expand.rs | 616 +- compiler/rustc_expand/src/lib.rs | 1 + compiler/rustc_expand/src/module.rs | 394 +- compiler/rustc_expand/src/mut_visit/tests.rs | 8 +- compiler/rustc_expand/src/parse/tests.rs | 4 +- compiler/rustc_expand/src/placeholders.rs | 32 +- compiler/rustc_expand/src/proc_macro.rs | 97 +- .../rustc_expand/src/proc_macro_server.rs | 98 +- compiler/rustc_feature/src/accepted.rs | 4 +- compiler/rustc_feature/src/active.rs | 23 +- compiler/rustc_feature/src/builtin_attrs.rs | 2 +- compiler/rustc_feature/src/removed.rs | 2 +- compiler/rustc_hir/Cargo.toml | 2 +- compiler/rustc_hir/src/arena.rs | 6 +- compiler/rustc_hir/src/definitions.rs | 76 +- compiler/rustc_hir/src/hir.rs | 396 +- compiler/rustc_hir/src/hir_id.rs | 83 + compiler/rustc_hir/src/intravisit.rs | 135 +- compiler/rustc_hir/src/lang_items.rs | 51 +- compiler/rustc_hir/src/lib.rs | 4 + compiler/rustc_hir/src/stable_hash_impls.rs | 84 +- compiler/rustc_hir/src/target.rs | 2 + compiler/rustc_hir/src/tests.rs | 39 + compiler/rustc_hir_pretty/src/lib.rs | 75 +- .../rustc_incremental/src/assert_dep_graph.rs | 17 +- .../src/assert_module_sources.rs | 2 +- .../src/persist/dirty_clean.rs | 35 +- .../src/persist/file_format.rs | 2 +- compiler/rustc_incremental/src/persist/fs.rs | 4 +- .../rustc_incremental/src/persist/load.rs | 2 +- compiler/rustc_index/src/lib.rs | 4 + compiler/rustc_index/src/vec.rs | 15 +- compiler/rustc_infer/Cargo.toml | 2 +- compiler/rustc_infer/src/infer/at.rs | 25 +- .../src/infer/canonical/query_response.rs | 11 +- compiler/rustc_infer/src/infer/combine.rs | 1 + .../src/infer/error_reporting/mod.rs | 46 +- .../infer/error_reporting/need_type_info.rs | 4 +- .../nice_region_error/different_lifetimes.rs | 5 +- .../nice_region_error/find_anon_type.rs | 116 +- .../error_reporting/nice_region_error/mod.rs | 4 +- .../nice_region_error/named_anon_conflict.rs | 5 +- .../nice_region_error/placeholder_error.rs | 232 +- .../nice_region_error/static_impl_trait.rs | 25 +- .../infer/lexical_region_resolve/README.md | 1 - compiler/rustc_infer/src/infer/mod.rs | 2 +- .../rustc_infer/src/infer/nll_relate/mod.rs | 12 +- compiler/rustc_infer/src/infer/undo_log.rs | 2 +- compiler/rustc_infer/src/lib.rs | 2 +- .../src/traits/error_reporting/mod.rs | 2 +- compiler/rustc_infer/src/traits/mod.rs | 2 +- compiler/rustc_infer/src/traits/util.rs | 41 +- compiler/rustc_interface/Cargo.toml | 7 +- compiler/rustc_interface/src/interface.rs | 36 +- compiler/rustc_interface/src/passes.rs | 61 +- .../rustc_interface/src/proc_macro_decls.rs | 5 +- compiler/rustc_interface/src/queries.rs | 8 +- compiler/rustc_interface/src/tests.rs | 11 +- compiler/rustc_interface/src/util.rs | 78 +- compiler/rustc_lint/Cargo.toml | 1 + compiler/rustc_lint/src/builtin.rs | 193 +- compiler/rustc_lint/src/context.rs | 79 +- compiler/rustc_lint/src/early.rs | 15 +- compiler/rustc_lint/src/internal.rs | 2 +- compiler/rustc_lint/src/late.rs | 54 +- compiler/rustc_lint/src/levels.rs | 110 +- compiler/rustc_lint/src/lib.rs | 42 +- compiler/rustc_lint/src/non_fmt_panic.rs | 75 +- compiler/rustc_lint/src/nonstandard_style.rs | 8 +- compiler/rustc_lint/src/noop_method_call.rs | 111 + compiler/rustc_lint/src/passes.rs | 6 +- compiler/rustc_lint/src/traits.rs | 3 +- compiler/rustc_lint/src/types.rs | 81 +- compiler/rustc_lint/src/unused.rs | 35 +- compiler/rustc_lint_defs/src/builtin.rs | 254 +- compiler/rustc_lint_defs/src/lib.rs | 11 + .../llvm-wrapper/CoverageMappingWrapper.cpp | 24 +- .../rustc_llvm/llvm-wrapper/LLVMWrapper.h | 2 + .../rustc_llvm/llvm-wrapper/PassWrapper.cpp | 164 +- .../rustc_llvm/llvm-wrapper/RustWrapper.cpp | 57 +- compiler/rustc_macros/src/hash_stable.rs | 2 + compiler/rustc_macros/src/query.rs | 33 +- .../rustc_macros/src/session_diagnostic.rs | 6 +- compiler/rustc_metadata/Cargo.toml | 4 +- compiler/rustc_metadata/src/creader.rs | 57 +- .../rustc_metadata/src/foreign_modules.rs | 15 +- compiler/rustc_metadata/src/link_args.rs | 6 +- compiler/rustc_metadata/src/locator.rs | 12 +- compiler/rustc_metadata/src/native_libs.rs | 5 +- compiler/rustc_metadata/src/rmeta/decoder.rs | 4 + .../src/rmeta/decoder/cstore_impl.rs | 4 + compiler/rustc_metadata/src/rmeta/encoder.rs | 284 +- compiler/rustc_metadata/src/rmeta/mod.rs | 3 +- compiler/rustc_middle/Cargo.toml | 6 +- .../rustc_middle/src/dep_graph/dep_node.rs | 119 +- compiler/rustc_middle/src/dep_graph/mod.rs | 117 +- compiler/rustc_middle/src/hir/map/blocks.rs | 40 +- .../rustc_middle/src/hir/map/collector.rs | 103 +- compiler/rustc_middle/src/hir/map/mod.rs | 106 +- compiler/rustc_middle/src/hir/mod.rs | 51 +- compiler/rustc_middle/src/ich/hcx.rs | 7 - compiler/rustc_middle/src/ich/impls_hir.rs | 6 +- compiler/rustc_middle/src/ich/impls_syntax.rs | 6 +- compiler/rustc_middle/src/lib.rs | 4 +- compiler/rustc_middle/src/lint.rs | 8 +- compiler/rustc_middle/src/mir/coverage.rs | 17 +- .../src/mir/interpret/allocation.rs | 19 +- .../rustc_middle/src/mir/interpret/error.rs | 51 +- .../rustc_middle/src/mir/interpret/queries.rs | 1 + .../rustc_middle/src/mir/interpret/value.rs | 54 +- compiler/rustc_middle/src/mir/mod.rs | 303 +- compiler/rustc_middle/src/mir/mono.rs | 17 +- compiler/rustc_middle/src/mir/query.rs | 14 - compiler/rustc_middle/src/mir/tcx.rs | 9 +- compiler/rustc_middle/src/mir/terminator.rs | 20 +- .../rustc_middle/src/mir/type_foldable.rs | 29 +- compiler/rustc_middle/src/mir/visit.rs | 50 +- compiler/rustc_middle/src/query/mod.rs | 90 +- compiler/rustc_middle/src/traits/mod.rs | 22 +- compiler/rustc_middle/src/traits/select.rs | 3 + .../src/traits/structural_impls.rs | 3 + compiler/rustc_middle/src/ty/adjustment.rs | 2 +- compiler/rustc_middle/src/ty/adt.rs | 482 + compiler/rustc_middle/src/ty/assoc.rs | 170 + compiler/rustc_middle/src/ty/closure.rs | 388 + compiler/rustc_middle/src/ty/codec.rs | 18 +- compiler/rustc_middle/src/ty/consts.rs | 6 +- compiler/rustc_middle/src/ty/consts/int.rs | 19 + compiler/rustc_middle/src/ty/consts/kind.rs | 15 +- .../rustc_middle/src/ty/consts/valtree.rs | 34 + compiler/rustc_middle/src/ty/context.rs | 202 +- compiler/rustc_middle/src/ty/diagnostics.rs | 33 +- compiler/rustc_middle/src/ty/error.rs | 65 +- compiler/rustc_middle/src/ty/fold.rs | 115 +- compiler/rustc_middle/src/ty/generics.rs | 257 + compiler/rustc_middle/src/ty/instance.rs | 3 +- compiler/rustc_middle/src/ty/layout.rs | 83 +- compiler/rustc_middle/src/ty/mod.rs | 1302 +- compiler/rustc_middle/src/ty/print/pretty.rs | 123 +- compiler/rustc_middle/src/ty/query/job.rs | 26 - compiler/rustc_middle/src/ty/query/mod.rs | 227 +- .../src/ty/query/on_disk_cache.rs | 60 +- .../rustc_middle/src/ty/query/plumbing.rs | 576 - compiler/rustc_middle/src/ty/relate.rs | 173 +- compiler/rustc_middle/src/ty/sty.rs | 180 +- compiler/rustc_middle/src/ty/trait_def.rs | 9 +- compiler/rustc_middle/src/ty/walk.rs | 2 +- compiler/rustc_mir/Cargo.toml | 2 +- .../diagnostics/conflict_errors.rs | 79 +- .../src/borrow_check/diagnostics/mod.rs | 44 +- .../diagnostics/mutability_errors.rs | 187 +- .../borrow_check/diagnostics/region_name.rs | 13 +- .../src/borrow_check/invalidation.rs | 21 +- compiler/rustc_mir/src/borrow_check/mod.rs | 26 +- .../borrow_check/region_infer/opaque_types.rs | 11 +- .../borrow_check/type_check/input_output.rs | 7 +- .../src/borrow_check/type_check/mod.rs | 92 +- .../src/borrow_check/type_check/relate_tys.rs | 12 +- compiler/rustc_mir/src/const_eval/error.rs | 13 +- .../rustc_mir/src/const_eval/eval_queries.rs | 22 +- compiler/rustc_mir/src/const_eval/machine.rs | 30 +- compiler/rustc_mir/src/const_eval/mod.rs | 115 +- .../rustc_mir/src/dataflow/framework/mod.rs | 4 +- .../rustc_mir/src/dataflow/impls/borrows.rs | 180 +- .../rustc_mir/src/dataflow/impls/liveness.rs | 2 +- .../src/dataflow/impls/storage_liveness.rs | 1 + .../src/dataflow/move_paths/builder.rs | 5 +- compiler/rustc_mir/src/interpret/cast.rs | 24 +- .../rustc_mir/src/interpret/eval_context.rs | 65 +- compiler/rustc_mir/src/interpret/intern.rs | 28 +- .../rustc_mir/src/interpret/intrinsics.rs | 123 +- .../interpret/intrinsics/caller_location.rs | 6 +- compiler/rustc_mir/src/interpret/machine.rs | 16 +- compiler/rustc_mir/src/interpret/memory.rs | 14 +- compiler/rustc_mir/src/interpret/operand.rs | 111 +- compiler/rustc_mir/src/interpret/operator.rs | 26 +- compiler/rustc_mir/src/interpret/place.rs | 151 +- compiler/rustc_mir/src/interpret/step.rs | 104 +- .../rustc_mir/src/interpret/terminator.rs | 46 +- compiler/rustc_mir/src/interpret/traits.rs | 2 +- compiler/rustc_mir/src/interpret/validity.rs | 129 +- compiler/rustc_mir/src/interpret/visitor.rs | 60 +- compiler/rustc_mir/src/lib.rs | 9 +- .../rustc_mir/src/monomorphize/collector.rs | 35 +- .../src/monomorphize/partitioning/default.rs | 9 +- .../src/monomorphize/partitioning/mod.rs | 46 +- .../src/monomorphize/polymorphize.rs | 104 +- compiler/rustc_mir/src/shim.rs | 18 +- .../src/transform/check_consts/mod.rs | 3 +- .../src/transform/check_consts/ops.rs | 12 + .../src/transform/check_consts/qualifs.rs | 38 +- .../src/transform/check_consts/validation.rs | 44 +- .../rustc_mir/src/transform/check_unsafety.rs | 6 +- .../rustc_mir/src/transform/const_goto.rs | 122 + .../rustc_mir/src/transform/const_prop.rs | 135 +- .../rustc_mir/src/transform/coverage/debug.rs | 12 +- .../rustc_mir/src/transform/coverage/graph.rs | 6 +- .../rustc_mir/src/transform/coverage/query.rs | 41 +- .../rustc_mir/src/transform/coverage/spans.rs | 1 + .../rustc_mir/src/transform/coverage/tests.rs | 6 +- .../src/transform/deduplicate_blocks.rs | 193 + compiler/rustc_mir/src/transform/dest_prop.rs | 10 +- .../src/transform/early_otherwise_branch.rs | 13 +- .../src/transform/elaborate_drops.rs | 2 +- compiler/rustc_mir/src/transform/generator.rs | 22 +- compiler/rustc_mir/src/transform/inline.rs | 306 +- .../rustc_mir/src/transform/inline/cycle.rs | 18 +- .../rustc_mir/src/transform/instcombine.rs | 9 +- .../src/transform/lower_intrinsics.rs | 25 +- .../rustc_mir/src/transform/match_branches.rs | 20 +- compiler/rustc_mir/src/transform/mod.rs | 11 +- .../transform/multiple_return_terminators.rs | 2 +- compiler/rustc_mir/src/transform/nrvo.rs | 2 +- .../rustc_mir/src/transform/promote_consts.rs | 71 +- .../src/transform/remove_noop_landing_pads.rs | 1 + .../src/transform/remove_storage_markers.rs | 25 + .../src/transform/required_consts.rs | 8 +- .../rustc_mir/src/transform/rustc_peek.rs | 2 +- compiler/rustc_mir/src/transform/simplify.rs | 116 +- .../transform/simplify_comparison_integral.rs | 15 +- .../rustc_mir/src/transform/simplify_try.rs | 4 +- .../src/transform/unreachable_prop.rs | 4 +- compiler/rustc_mir/src/transform/validate.rs | 44 +- .../rustc_mir/src/util/elaborate_drops.rs | 16 +- compiler/rustc_mir/src/util/find_self_call.rs | 4 +- .../rustc_mir/src/util/generic_graphviz.rs | 8 +- compiler/rustc_mir/src/util/graphviz.rs | 23 +- compiler/rustc_mir/src/util/pretty.rs | 39 +- compiler/rustc_mir/src/util/spanview.rs | 1 + compiler/rustc_mir/src/util/storage.rs | 1 + compiler/rustc_mir_build/Cargo.toml | 2 +- compiler/rustc_mir_build/src/build/block.rs | 53 +- compiler/rustc_mir_build/src/build/cfg.rs | 2 +- .../src/build/expr/as_constant.rs | 24 +- .../src/build/expr/as_operand.rs | 69 +- .../src/build/expr/as_place.rs | 161 +- .../src/build/expr/as_rvalue.rs | 119 +- .../rustc_mir_build/src/build/expr/as_temp.rs | 28 +- .../src/build/expr/category.rs | 2 +- .../rustc_mir_build/src/build/expr/into.rs | 68 +- .../rustc_mir_build/src/build/expr/mod.rs | 4 +- .../rustc_mir_build/src/build/expr/stmt.rs | 46 +- compiler/rustc_mir_build/src/build/into.rs | 55 - .../rustc_mir_build/src/build/matches/mod.rs | 177 +- .../src/build/matches/simplify.rs | 34 +- .../rustc_mir_build/src/build/matches/test.rs | 101 +- .../rustc_mir_build/src/build/matches/util.rs | 39 +- compiler/rustc_mir_build/src/build/misc.rs | 15 +- compiler/rustc_mir_build/src/build/mod.rs | 226 +- compiler/rustc_mir_build/src/build/scope.rs | 26 +- compiler/rustc_mir_build/src/lib.rs | 2 +- compiler/rustc_mir_build/src/lints.rs | 2 +- compiler/rustc_mir_build/src/thir/arena.rs | 98 + compiler/rustc_mir_build/src/thir/constant.rs | 25 +- compiler/rustc_mir_build/src/thir/cx/block.rs | 150 +- compiler/rustc_mir_build/src/thir/cx/expr.rs | 1749 +- compiler/rustc_mir_build/src/thir/cx/mod.rs | 167 +- .../rustc_mir_build/src/thir/cx/to_ref.rs | 65 - compiler/rustc_mir_build/src/thir/mod.rs | 310 +- .../src/thir/pattern/check_match.rs | 49 +- .../src/thir/pattern/const_to_pat.rs | 2 +- .../src/thir/pattern/deconstruct_pat.rs | 6 +- .../rustc_mir_build/src/thir/pattern/mod.rs | 40 +- .../src/thir/pattern/usefulness.rs | 579 +- compiler/rustc_parse/Cargo.toml | 2 +- compiler/rustc_parse/src/lexer/mod.rs | 3 + compiler/rustc_parse/src/lib.rs | 3 +- compiler/rustc_parse/src/parser/attr.rs | 18 +- .../rustc_parse/src/parser/attr_wrapper.rs | 189 + .../rustc_parse/src/parser/diagnostics.rs | 110 +- compiler/rustc_parse/src/parser/expr.rs | 530 +- compiler/rustc_parse/src/parser/generics.rs | 139 +- compiler/rustc_parse/src/parser/item.rs | 388 +- compiler/rustc_parse/src/parser/mod.rs | 183 +- .../rustc_parse/src/parser/nonterminal.rs | 48 +- compiler/rustc_parse/src/parser/pat.rs | 321 +- compiler/rustc_parse/src/parser/path.rs | 2 +- compiler/rustc_parse/src/parser/stmt.rs | 83 +- compiler/rustc_parse/src/parser/ty.rs | 16 +- compiler/rustc_parse_format/src/lib.rs | 2 +- compiler/rustc_passes/Cargo.toml | 1 + compiler/rustc_passes/src/check_attr.rs | 429 +- compiler/rustc_passes/src/check_const.rs | 4 +- compiler/rustc_passes/src/dead.rs | 91 +- compiler/rustc_passes/src/diagnostic_items.rs | 17 +- compiler/rustc_passes/src/entry.rs | 29 +- compiler/rustc_passes/src/hir_id_validator.rs | 17 +- compiler/rustc_passes/src/hir_stats.rs | 53 +- compiler/rustc_passes/src/lang_items.rs | 20 +- compiler/rustc_passes/src/layout_test.rs | 6 +- compiler/rustc_passes/src/lib_features.rs | 6 +- compiler/rustc_passes/src/liveness.rs | 233 +- compiler/rustc_passes/src/naked_functions.rs | 5 +- compiler/rustc_passes/src/reachable.rs | 27 +- compiler/rustc_passes/src/region.rs | 2 +- compiler/rustc_passes/src/stability.rs | 138 +- compiler/rustc_passes/src/weak_lang_items.rs | 3 +- compiler/rustc_plugin_impl/src/build.rs | 13 +- compiler/rustc_privacy/src/lib.rs | 208 +- compiler/rustc_query_impl/Cargo.toml | 27 + .../query => rustc_query_impl/src}/README.md | 0 .../ty/query => rustc_query_impl/src}/keys.rs | 102 +- compiler/rustc_query_impl/src/lib.rs | 63 + compiler/rustc_query_impl/src/plumbing.rs | 616 + .../src}/profiling_support.rs | 57 +- .../query => rustc_query_impl/src}/stats.rs | 39 +- .../query => rustc_query_impl/src}/values.rs | 15 +- compiler/rustc_query_system/Cargo.toml | 5 +- compiler/rustc_query_system/src/cache.rs | 7 +- .../src/dep_graph/dep_node.rs | 7 +- .../rustc_query_system/src/dep_graph/graph.rs | 59 +- .../rustc_query_system/src/dep_graph/mod.rs | 50 +- .../rustc_query_system/src/query/caches.rs | 93 +- .../rustc_query_system/src/query/config.rs | 31 +- compiler/rustc_query_system/src/query/job.rs | 198 +- compiler/rustc_query_system/src/query/mod.rs | 77 +- .../rustc_query_system/src/query/plumbing.rs | 499 +- compiler/rustc_resolve/Cargo.toml | 2 +- .../rustc_resolve/src/build_reduced_graph.rs | 123 +- compiler/rustc_resolve/src/def_collector.rs | 107 +- compiler/rustc_resolve/src/diagnostics.rs | 6 +- compiler/rustc_resolve/src/imports.rs | 111 +- compiler/rustc_resolve/src/late.rs | 36 +- .../rustc_resolve/src/late/diagnostics.rs | 101 +- compiler/rustc_resolve/src/late/lifetimes.rs | 49 +- compiler/rustc_resolve/src/lib.rs | 207 +- compiler/rustc_resolve/src/macros.rs | 215 +- .../rustc_save_analysis/src/dump_visitor.rs | 198 +- compiler/rustc_save_analysis/src/lib.rs | 65 +- compiler/rustc_save_analysis/src/sig.rs | 38 +- compiler/rustc_serialize/Cargo.toml | 2 +- compiler/rustc_serialize/src/lib.rs | 1 - compiler/rustc_session/src/config.rs | 307 +- compiler/rustc_session/src/filesearch.rs | 2 +- compiler/rustc_session/src/lib.rs | 2 +- compiler/rustc_session/src/options.rs | 29 +- compiler/rustc_session/src/parse.rs | 4 - compiler/rustc_session/src/session.rs | 32 +- .../src/crate_disambiguator.rs | 0 compiler/rustc_span/src/def_id.rs | 91 + compiler/rustc_span/src/edition.rs | 2 +- compiler/rustc_span/src/hygiene.rs | 24 +- compiler/rustc_span/src/lib.rs | 24 +- compiler/rustc_span/src/source_map.rs | 101 +- compiler/rustc_span/src/source_map/tests.rs | 46 +- compiler/rustc_span/src/symbol.rs | 41 +- compiler/rustc_symbol_mangling/src/test.rs | 12 +- compiler/rustc_symbol_mangling/src/v0.rs | 2 +- compiler/rustc_target/src/abi/call/mod.rs | 7 + compiler/rustc_target/src/asm/mod.rs | 57 +- compiler/rustc_target/src/lib.rs | 1 - .../src/spec/aarch64_apple_ios_macabi.rs | 8 +- .../src/spec/aarch64_apple_ios_sim.rs | 39 + compiler/rustc_target/src/spec/abi.rs | 76 +- compiler/rustc_target/src/spec/apple_base.rs | 21 +- .../rustc_target/src/spec/apple_sdk_base.rs | 6 +- compiler/rustc_target/src/spec/arm_base.rs | 11 +- compiler/rustc_target/src/spec/crt_objects.rs | 31 +- .../rustc_target/src/spec/i386_apple_ios.rs | 3 +- .../src/spec/i686_apple_darwin.rs | 3 +- .../src/spec/i686_linux_android.rs | 3 +- .../src/spec/i686_unknown_freebsd.rs | 4 +- .../src/spec/i686_unknown_haiku.rs | 3 +- .../src/spec/i686_unknown_linux_gnu.rs | 3 +- .../src/spec/i686_unknown_linux_musl.rs | 3 +- .../src/spec/i686_unknown_netbsd.rs | 3 +- .../src/spec/i686_unknown_openbsd.rs | 3 +- .../rustc_target/src/spec/i686_wrs_vxworks.rs | 3 +- .../src/spec/linux_kernel_base.rs | 3 +- .../src/spec/mipsel_unknown_none.rs | 6 +- compiler/rustc_target/src/spec/mod.rs | 57 +- .../src/spec/nvptx64_nvidia_cuda.rs | 6 +- .../src/spec/powerpc64_unknown_linux_gnu.rs | 2 +- .../src/spec/powerpc64_unknown_linux_musl.rs | 2 +- .../src/spec/powerpc64_wrs_vxworks.rs | 2 +- .../src/spec/powerpc64le_unknown_linux_gnu.rs | 2 +- .../spec/powerpc64le_unknown_linux_musl.rs | 2 +- .../src/spec/powerpc_unknown_openbsd.rs | 16 + .../src/spec/riscv32gc_unknown_linux_musl.rs | 19 + .../src/spec/riscv64gc_unknown_linux_musl.rs | 19 + .../src/spec/riscv64gc_unknown_none_elf.rs | 1 + compiler/rustc_target/src/spec/riscv_base.rs | 6 +- .../src/spec/s390x_unknown_linux_musl.rs | 24 + .../rustc_target/src/spec/solaris_base.rs | 1 - .../src/spec/sparcv9_sun_solaris.rs | 1 + .../src/spec/x86_64_apple_darwin.rs | 3 +- .../rustc_target/src/spec/x86_64_apple_ios.rs | 3 +- .../src/spec/x86_64_apple_ios_macabi.rs | 3 +- .../src/spec/x86_64_apple_tvos.rs | 3 +- .../rustc_target/src/spec/x86_64_fuchsia.rs | 3 +- .../src/spec/x86_64_linux_android.rs | 3 +- .../src/spec/x86_64_pc_solaris.rs | 19 + .../src/spec/x86_64_rumprun_netbsd.rs | 26 - .../src/spec/x86_64_sun_solaris.rs | 4 +- .../src/spec/x86_64_unknown_dragonfly.rs | 3 +- .../src/spec/x86_64_unknown_freebsd.rs | 3 +- .../src/spec/x86_64_unknown_haiku.rs | 3 +- .../src/spec/x86_64_unknown_hermit.rs | 3 +- .../src/spec/x86_64_unknown_linux_gnu.rs | 3 +- .../src/spec/x86_64_unknown_linux_gnux32.rs | 3 +- .../src/spec/x86_64_unknown_linux_musl.rs | 4 +- .../src/spec/x86_64_unknown_netbsd.rs | 3 +- ...rs => x86_64_unknown_none_hermitkernel.rs} | 5 +- ....rs => x86_64_unknown_none_linuxkernel.rs} | 7 +- .../src/spec/x86_64_unknown_openbsd.rs | 3 +- .../src/spec/x86_64_unknown_redox.rs | 3 +- .../src/spec/x86_64_wrs_vxworks.rs | 3 +- compiler/rustc_trait_selection/Cargo.toml | 2 +- .../rustc_trait_selection/src/autoderef.rs | 10 +- compiler/rustc_trait_selection/src/infer.rs | 2 +- compiler/rustc_trait_selection/src/lib.rs | 2 +- .../rustc_trait_selection/src/opaque_types.rs | 5 +- .../src/traits/auto_trait.rs | 4 +- .../src/traits/codegen.rs | 2 +- .../src/traits/coherence.rs | 30 +- .../src/traits/const_evaluatable.rs | 26 +- .../src/traits/error_reporting/mod.rs | 42 +- .../error_reporting/on_unimplemented.rs | 25 +- .../src/traits/error_reporting/suggestions.rs | 46 +- .../src/traits/fulfill.rs | 63 +- .../rustc_trait_selection/src/traits/mod.rs | 4 +- .../src/traits/object_safety.rs | 6 +- .../src/traits/project.rs | 113 +- .../src/traits/query/normalize.rs | 2 +- .../src/traits/query/type_op/custom.rs | 4 +- .../src/traits/select/candidate_assembly.rs | 3 + .../src/traits/select/confirmation.rs | 5 +- .../src/traits/select/mod.rs | 38 +- .../src/traits/specialize/mod.rs | 9 +- compiler/rustc_traits/Cargo.toml | 2 +- compiler/rustc_traits/src/chalk/lowering.rs | 7 +- compiler/rustc_traits/src/chalk/mod.rs | 2 +- compiler/rustc_traits/src/dropck_outlives.rs | 4 +- compiler/rustc_ty_utils/src/instance.rs | 8 +- compiler/rustc_ty_utils/src/lib.rs | 2 + compiler/rustc_ty_utils/src/ty.rs | 81 +- compiler/rustc_type_ir/src/lib.rs | 2 +- compiler/rustc_typeck/Cargo.toml | 2 +- compiler/rustc_typeck/src/astconv/errors.rs | 2 +- compiler/rustc_typeck/src/astconv/generics.rs | 65 +- compiler/rustc_typeck/src/astconv/mod.rs | 155 +- compiler/rustc_typeck/src/check/_match.rs | 62 +- compiler/rustc_typeck/src/check/callee.rs | 178 +- compiler/rustc_typeck/src/check/cast.rs | 5 +- compiler/rustc_typeck/src/check/check.rs | 216 +- compiler/rustc_typeck/src/check/closure.rs | 14 +- compiler/rustc_typeck/src/check/coercion.rs | 30 +- .../rustc_typeck/src/check/compare_method.rs | 12 +- compiler/rustc_typeck/src/check/demand.rs | 37 +- compiler/rustc_typeck/src/check/dropck.rs | 2 +- .../rustc_typeck/src/check/expectation.rs | 11 +- compiler/rustc_typeck/src/check/expr.rs | 158 +- .../rustc_typeck/src/check/fn_ctxt/_impl.rs | 93 +- .../rustc_typeck/src/check/fn_ctxt/checks.rs | 30 +- .../rustc_typeck/src/check/fn_ctxt/mod.rs | 8 +- .../src/check/fn_ctxt/suggestions.rs | 48 +- .../rustc_typeck/src/check/gather_locals.rs | 13 +- compiler/rustc_typeck/src/check/inherited.rs | 2 +- compiler/rustc_typeck/src/check/intrinsic.rs | 17 +- .../rustc_typeck/src/check/method/confirm.rs | 71 +- .../rustc_typeck/src/check/method/probe.rs | 166 +- .../rustc_typeck/src/check/method/suggest.rs | 79 +- compiler/rustc_typeck/src/check/mod.rs | 25 +- compiler/rustc_typeck/src/check/op.rs | 12 +- compiler/rustc_typeck/src/check/pat.rs | 114 +- compiler/rustc_typeck/src/check/place_op.rs | 16 +- compiler/rustc_typeck/src/check/regionck.rs | 44 +- compiler/rustc_typeck/src/check/upvar.rs | 557 +- compiler/rustc_typeck/src/check/wfcheck.rs | 69 +- compiler/rustc_typeck/src/check/writeback.rs | 51 +- compiler/rustc_typeck/src/check_unused.rs | 39 +- .../rustc_typeck/src/coherence/builtin.rs | 7 +- .../src/coherence/inherent_impls.rs | 54 +- .../src/coherence/inherent_impls_overlap.rs | 3 +- compiler/rustc_typeck/src/coherence/mod.rs | 18 +- compiler/rustc_typeck/src/coherence/orphan.rs | 7 +- .../rustc_typeck/src/coherence/unsafety.rs | 3 +- compiler/rustc_typeck/src/collect.rs | 355 +- .../rustc_typeck/src/collect/item_bounds.rs | 8 +- compiler/rustc_typeck/src/collect/type_of.rs | 103 +- .../src/constrained_generic_params.rs | 2 +- compiler/rustc_typeck/src/errors.rs | 7 - compiler/rustc_typeck/src/expr_use_visitor.rs | 125 +- compiler/rustc_typeck/src/impl_wf_check.rs | 9 +- compiler/rustc_typeck/src/lib.rs | 39 +- .../rustc_typeck/src/mem_categorization.rs | 2 +- .../src/outlives/implicit_infer.rs | 9 +- compiler/rustc_typeck/src/outlives/test.rs | 6 +- .../rustc_typeck/src/variance/constraints.rs | 14 +- compiler/rustc_typeck/src/variance/terms.rs | 14 +- compiler/rustc_typeck/src/variance/test.rs | 6 +- config.toml.example | 21 +- git-commit-hash | 2 +- library/alloc/benches/btree/map.rs | 76 - library/alloc/benches/lib.rs | 1 + library/alloc/benches/vec.rs | 89 + library/alloc/src/borrow.rs | 1 + library/alloc/src/boxed.rs | 33 +- library/alloc/src/collections/binary_heap.rs | 167 +- library/alloc/src/collections/btree/append.rs | 23 +- library/alloc/src/collections/btree/fix.rs | 171 + library/alloc/src/collections/btree/map.rs | 273 +- .../alloc/src/collections/btree/map/entry.rs | 39 +- .../alloc/src/collections/btree/map/tests.rs | 315 +- library/alloc/src/collections/btree/mod.rs | 47 +- .../alloc/src/collections/btree/navigate.rs | 331 +- library/alloc/src/collections/btree/node.rs | 99 +- .../alloc/src/collections/btree/node/tests.rs | 16 +- library/alloc/src/collections/btree/remove.rs | 68 +- library/alloc/src/collections/btree/search.rs | 182 +- library/alloc/src/collections/btree/set.rs | 30 +- .../alloc/src/collections/btree/set/tests.rs | 92 +- library/alloc/src/collections/btree/split.rs | 143 +- .../collections/btree/testing/crash_test.rs | 119 + .../src/collections/btree/testing/mod.rs | 3 + .../btree/{map/tests => testing}/ord_chaos.rs | 0 .../src/collections/btree/testing/rng.rs | 28 + library/alloc/src/collections/linked_list.rs | 1 + .../alloc/src/collections/vec_deque/mod.rs | 39 +- .../alloc/src/collections/vec_deque/tests.rs | 15 + library/alloc/src/lib.rs | 15 +- library/alloc/src/macros.rs | 1 + library/alloc/src/rc.rs | 49 + library/alloc/src/slice.rs | 35 +- library/alloc/src/str.rs | 2 +- library/alloc/src/string.rs | 97 +- library/alloc/src/sync.rs | 49 + library/alloc/src/task.rs | 4 - library/alloc/src/vec/into_iter.rs | 4 +- library/alloc/src/vec/mod.rs | 327 +- library/alloc/tests/lib.rs | 4 +- library/alloc/tests/slice.rs | 2 +- library/alloc/tests/string.rs | 27 + library/alloc/tests/vec.rs | 244 + library/core/benches/ascii.rs | 6 +- library/core/benches/char/methods.rs | 40 + library/core/benches/slice.rs | 44 +- library/core/src/alloc/global.rs | 7 +- library/core/src/alloc/layout.rs | 1 - library/core/src/any.rs | 12 +- library/core/src/array/iter.rs | 2 - library/core/src/array/mod.rs | 176 +- library/core/src/borrow.rs | 2 + library/core/src/cell.rs | 23 +- library/core/src/char/methods.rs | 53 +- library/core/src/char/mod.rs | 3 +- library/core/src/clone.rs | 3 + library/core/src/cmp.rs | 1 + library/core/src/convert/mod.rs | 3 - library/core/src/convert/num.rs | 2 +- library/core/src/default.rs | 1 + library/core/src/ffi.rs | 1 - library/core/src/fmt/mod.rs | 6 +- library/core/src/hash/mod.rs | 93 +- library/core/src/intrinsics.rs | 399 +- library/core/src/iter/adapters/cloned.rs | 5 +- library/core/src/iter/adapters/copied.rs | 5 +- library/core/src/iter/adapters/enumerate.rs | 27 +- library/core/src/iter/adapters/filter.rs | 3 +- library/core/src/iter/adapters/flatten.rs | 55 +- library/core/src/iter/adapters/fuse.rs | 4 +- library/core/src/iter/adapters/map.rs | 9 +- library/core/src/iter/adapters/zip.rs | 45 +- library/core/src/iter/range.rs | 8 +- library/core/src/iter/traits/accum.rs | 50 +- library/core/src/iter/traits/exact_size.rs | 6 + library/core/src/iter/traits/iterator.rs | 52 +- library/core/src/lib.rs | 16 +- library/core/src/macros/mod.rs | 172 +- library/core/src/macros/panic.md | 15 +- library/core/src/mem/maybe_uninit.rs | 11 +- library/core/src/mem/mod.rs | 30 +- library/core/src/num/dec2flt/parse.rs | 7 +- library/core/src/num/dec2flt/table.rs | 2 +- library/core/src/num/error.rs | 5 +- library/core/src/num/f32.rs | 40 +- library/core/src/num/f64.rs | 40 +- library/core/src/num/int_macros.rs | 46 +- library/core/src/num/mod.rs | 33 +- library/core/src/num/shells/i128.rs | 2 +- library/core/src/num/shells/i16.rs | 2 +- library/core/src/num/shells/i32.rs | 2 +- library/core/src/num/shells/i64.rs | 2 +- library/core/src/num/shells/i8.rs | 2 +- library/core/src/num/shells/int_macros.rs | 6 +- library/core/src/num/shells/isize.rs | 2 +- library/core/src/num/shells/u128.rs | 2 +- library/core/src/num/shells/u16.rs | 2 +- library/core/src/num/shells/u32.rs | 2 +- library/core/src/num/shells/u64.rs | 2 +- library/core/src/num/shells/u8.rs | 2 +- library/core/src/num/shells/usize.rs | 2 +- library/core/src/num/uint_macros.rs | 48 +- library/core/src/ops/control_flow.rs | 86 +- library/core/src/ops/deref.rs | 3 + library/core/src/ops/function.rs | 6 +- library/core/src/ops/range.rs | 90 - library/core/src/option.rs | 49 +- library/core/src/panicking.rs | 74 + library/core/src/prelude/mod.rs | 36 + library/core/src/prelude/v1.rs | 22 +- library/core/src/ptr/const_ptr.rs | 50 +- library/core/src/ptr/metadata.rs | 265 + library/core/src/ptr/mod.rs | 84 +- library/core/src/ptr/mut_ptr.rs | 64 +- library/core/src/ptr/non_null.rs | 33 +- library/core/src/result.rs | 49 +- library/core/src/slice/index.rs | 105 +- library/core/src/slice/iter.rs | 162 +- library/core/src/slice/mod.rs | 236 +- library/core/src/slice/raw.rs | 2 - library/core/src/slice/specialize.rs | 58 + library/core/src/str/converts.rs | 4 +- library/core/src/str/iter.rs | 58 +- library/core/src/str/mod.rs | 8 +- library/core/src/str/traits.rs | 4 +- library/core/src/sync/atomic.rs | 60 +- library/core/src/time.rs | 11 + library/core/src/unicode/unicode_data.rs | 20 +- library/core/tests/atomic.rs | 40 + library/core/tests/const_ptr.rs | 50 + .../core/tests/iter/adapters/intersperse.rs | 4 +- library/core/tests/iter/adapters/zip.rs | 43 + library/core/tests/lib.rs | 13 +- library/core/tests/mem.rs | 1 - library/core/tests/ops.rs | 2 + library/core/tests/ops/control_flow.rs | 18 + library/core/tests/ptr.rs | 254 + library/core/tests/result.rs | 9 + library/core/tests/slice.rs | 21 +- library/proc_macro/src/lib.rs | 9 +- library/profiler_builtins/build.rs | 1 + library/std/Cargo.toml | 4 +- library/std/src/collections/hash/map.rs | 71 +- library/std/src/collections/hash/map/tests.rs | 8 +- library/std/src/collections/hash/set.rs | 3 +- library/std/src/collections/mod.rs | 2 + library/std/src/error.rs | 40 + library/std/src/f32.rs | 2 +- library/std/src/f64.rs | 2 +- library/std/src/ffi/c_str.rs | 6 +- library/std/src/ffi/os_str.rs | 96 + library/std/src/io/buffered/bufreader.rs | 17 +- library/std/src/io/copy.rs | 2 +- library/std/src/io/impls.rs | 3 +- library/std/src/io/mod.rs | 49 +- library/std/src/io/stdio.rs | 16 +- library/std/src/io/tests.rs | 49 +- library/std/src/io/util.rs | 10 +- library/std/src/keyword_docs.rs | 8 +- library/std/src/lazy.rs | 15 +- library/std/src/lazy/tests.rs | 5 + library/std/src/lib.rs | 44 +- library/std/src/macros.rs | 17 +- library/std/src/net/parser.rs | 32 +- library/std/src/os/haiku/raw.rs | 7 + library/std/src/os/mod.rs | 60 +- library/std/src/os/raw/mod.rs | 110 +- library/std/src/panic.rs | 2 +- library/std/src/path.rs | 40 +- library/std/src/prelude/mod.rs | 34 + library/std/src/prelude/v1.rs | 18 +- library/std/src/primitive_docs.rs | 6 +- library/std/src/process.rs | 58 +- library/std/src/sync/mpsc/mod.rs | 1 + library/std/src/sync/mutex.rs | 20 + library/std/src/sync/rwlock.rs | 4 +- library/std/src/sys/hermit/mod.rs | 1 + library/std/src/sys/hermit/pipe.rs | 38 - library/std/src/sys/mod.rs | 31 +- library/std/src/sys/sgx/abi/mem.rs | 42 +- library/std/src/sys/unix/ext/net/ancillary.rs | 10 +- library/std/src/sys/unix/ext/net/datagram.rs | 44 +- library/std/src/sys/unix/ext/net/stream.rs | 21 +- library/std/src/sys/unix/ext/net/tests.rs | 18 +- library/std/src/sys/unix/ext/process.rs | 46 +- library/std/src/sys/unix/net.rs | 8 +- library/std/src/sys/unix/os.rs | 19 +- .../src/sys/unix/process/process_common.rs | 22 +- .../std/src/sys/unix/process/process_unix.rs | 36 +- .../sys/unix/process/process_unix/tests.rs | 30 + library/std/src/sys/unix/stack_overflow.rs | 9 +- library/std/src/sys/unix/thread.rs | 9 +- library/std/src/sys/wasi/ext/fs.rs | 30 +- library/std/src/sys/wasi/ext/io.rs | 12 +- library/std/src/sys/wasi/ext/mod.rs | 36 +- library/std/src/sys/wasi/fs.rs | 10 +- library/std/src/sys/wasi/net.rs | 2 +- library/std/src/sys/wasi/stdio.rs | 2 +- library/std/src/sys/windows/c.rs | 2 +- library/std/src/sys/windows/ext/ffi.rs | 11 +- library/std/src/sys/windows/ext/process.rs | 40 +- library/std/src/sys/windows/mutex.rs | 2 - library/std/src/sys/windows/path.rs | 6 +- library/std/src/sys/windows/process.rs | 12 +- library/std/src/sys/windows/process/tests.rs | 26 +- library/std/src/sys_common/os_str_bytes.rs | 11 +- library/std/src/sys_common/rwlock.rs | 59 + .../std/src/sys_common/thread_local_dtor.rs | 2 +- library/std/src/thread/mod.rs | 9 + library/test/src/cli.rs | 27 +- library/test/src/event.rs | 2 - library/test/src/formatters/pretty.rs | 4 - library/test/src/lib.rs | 18 +- library/test/src/test_result.rs | 2 - library/test/src/tests.rs | 37 +- library/unwind/build.rs | 2 - library/unwind/src/lib.rs | 2 +- src/README.md | 1 + src/bootstrap/Cargo.toml | 2 +- src/bootstrap/bin/main.rs | 10 +- src/bootstrap/bin/rustc.rs | 174 +- src/bootstrap/bootstrap.py | 78 +- src/bootstrap/builder.rs | 81 +- src/bootstrap/builder/tests.rs | 3 + src/bootstrap/clean.rs | 40 +- src/bootstrap/compile.rs | 64 +- src/bootstrap/config.rs | 13 + src/bootstrap/configure.py | 2 +- src/bootstrap/dist.rs | 12 +- src/bootstrap/doc.rs | 13 + src/bootstrap/flags.rs | 2 +- src/bootstrap/format.rs | 81 +- src/bootstrap/install.rs | 2 +- src/bootstrap/lib.rs | 4 + src/bootstrap/mk/Makefile.in | 4 + src/bootstrap/native.rs | 4 +- src/bootstrap/sanity.rs | 7 + src/bootstrap/test.rs | 164 +- src/bootstrap/tool.rs | 8 +- src/bootstrap/util.rs | 6 + .../docker/host-x86_64/arm-android/Dockerfile | 3 + .../host-x86_64/dist-aarch64-linux/Dockerfile | 3 + .../host-x86_64/dist-android/Dockerfile | 5 + .../host-x86_64/dist-arm-linux/Dockerfile | 3 + .../host-x86_64/dist-armhf-linux/Dockerfile | 3 + .../host-x86_64/dist-armv7-linux/Dockerfile | 3 + .../dist-i586-gnu-i586-i686-musl/Dockerfile | 3 + .../host-x86_64/dist-i686-linux/Dockerfile | 8 +- .../host-x86_64/dist-mips-linux/Dockerfile | 3 + .../host-x86_64/dist-mips64-linux/Dockerfile | 3 + .../dist-mips64el-linux/Dockerfile | 3 + .../host-x86_64/dist-mipsel-linux/Dockerfile | 3 + .../host-x86_64/dist-powerpc-linux/Dockerfile | 3 + .../dist-powerpc64-linux/Dockerfile | 3 + .../dist-powerpc64le-linux/Dockerfile | 3 + .../host-x86_64/dist-riscv64-linux/Dockerfile | 3 + .../host-x86_64/dist-s390x-linux/Dockerfile | 3 + .../host-x86_64/dist-various-1/Dockerfile | 4 - .../dist-various-1/build-rumprun.sh | 29 - .../host-x86_64/dist-various-2/Dockerfile | 18 +- .../dist-various-2/build-solaris-toolchain.sh | 29 +- .../x86_64-fortanix-unknown-sgx-clang-wrap.sh | 14 - .../dist-x86_64-freebsd/Dockerfile | 3 + .../dist-x86_64-illumos/Dockerfile | 3 + .../host-x86_64/dist-x86_64-linux/Dockerfile | 8 +- .../dist-x86_64-linux/build-python.sh | 7 +- .../host-x86_64/dist-x86_64-musl/Dockerfile | 4 + .../host-x86_64/dist-x86_64-netbsd/Dockerfile | 3 + .../host-x86_64/i686-gnu-nopt/Dockerfile | 3 + src/ci/docker/host-x86_64/i686-gnu/Dockerfile | 3 + .../docker/host-x86_64/mingw-check/Dockerfile | 10 +- src/ci/docker/host-x86_64/wasm32/Dockerfile | 14 +- .../host-x86_64/x86_64-gnu-aux/Dockerfile | 27 +- .../x86_64-gnu-distcheck/Dockerfile | 3 + .../host-x86_64/x86_64-gnu-tools/Dockerfile | 3 + src/ci/docker/scripts/cmake.sh | 34 + src/ci/docker/scripts/illumos-toolchain.sh | 2 +- src/ci/github-actions/ci.yml | 5 +- src/ci/pgo.sh | 8 +- src/ci/run.sh | 2 +- src/doc/book/.github/workflows/main.yml | 4 +- src/doc/book/ADMIN_TASKS.md | 1 + .../listing-02-02/Cargo.lock | 86 +- .../listing-02-02/Cargo.toml | 2 +- .../listing-02-03/Cargo.lock | 86 +- .../listing-02-03/Cargo.toml | 2 +- .../listing-02-03/src/main.rs | 2 +- .../listing-02-04/Cargo.lock | 86 +- .../listing-02-04/Cargo.toml | 2 +- .../listing-02-04/output.txt | 11 +- .../listing-02-04/src/main.rs | 2 +- .../listing-02-05/Cargo.lock | 86 +- .../listing-02-05/Cargo.toml | 2 +- .../listing-02-05/src/main.rs | 2 +- .../listing-02-06/Cargo.lock | 86 +- .../listing-02-06/Cargo.toml | 2 +- .../listing-02-06/src/main.rs | 2 +- .../Cargo.lock | 86 +- .../Cargo.toml | 2 +- .../src/main.rs | 2 +- .../no-listing-04-looping/Cargo.lock | 86 +- .../no-listing-04-looping/Cargo.toml | 2 +- .../no-listing-04-looping/src/main.rs | 2 +- .../no-listing-05-quitting/Cargo.lock | 86 +- .../no-listing-05-quitting/Cargo.toml | 2 +- .../no-listing-05-quitting/src/main.rs | 2 +- .../listing-04-03/src/main.rs | 2 +- .../listing-05-08/Cargo.lock | 3 +- .../listing-05-08/Cargo.toml | 2 +- .../listing-05-08/output.txt | 4 +- .../listing-05-09/Cargo.lock | 3 +- .../listing-05-09/Cargo.toml | 2 +- .../listing-05-10/Cargo.lock | 3 +- .../listing-05-10/Cargo.toml | 2 +- .../listing-05-11/Cargo.lock | 3 +- .../listing-05-11/Cargo.toml | 2 +- .../listing-05-11/output.txt | 4 +- .../listing-05-12/Cargo.lock | 3 +- .../listing-05-12/Cargo.toml | 2 +- .../listing-05-12/output.txt | 4 +- .../listing-05-13/Cargo.lock | 3 +- .../listing-05-13/Cargo.toml | 2 +- .../listing-05-14/Cargo.lock | 3 +- .../listing-05-14/Cargo.toml | 2 +- .../listing-05-15/Cargo.lock | 3 +- .../listing-05-15/Cargo.toml | 2 +- .../listing-05-16/Cargo.lock | 3 +- .../listing-05-16/Cargo.toml | 2 +- .../Cargo.lock | 3 +- .../Cargo.toml | 2 +- .../output-only-01-debug/Cargo.lock | 3 +- .../output-only-01-debug/Cargo.toml | 2 +- .../output-only-01-debug/output.txt | 4 +- .../output-only-02-pretty-debug/Cargo.lock | 3 +- .../output-only-02-pretty-debug/Cargo.toml | 2 +- .../output-only-02-pretty-debug/output.txt | 4 +- .../listing-07-18/Cargo.lock | 86 +- .../listing-07-18/Cargo.toml | 2 +- .../listing-07-18/src/main.rs | 2 +- .../no-listing-01-use-std-unnested/Cargo.lock | 86 +- .../no-listing-01-use-std-unnested/Cargo.toml | 2 +- .../src/main.rs | 2 +- .../listing-09-10/Cargo.lock | 86 +- .../listing-09-10/Cargo.toml | 2 +- .../listing-09-10/src/main.rs | 2 +- .../Cargo.lock | 86 +- .../Cargo.toml | 2 +- .../src/main.rs | 2 +- .../listing-10-03/src/main.rs | 10 +- .../listing-10-04/src/main.rs | 16 +- .../listing-10-05/output.txt | 8 +- .../listing-10-05/src/main.rs | 6 +- .../listing-11-01/output.txt | 4 +- .../listing-11-03/output.txt | 2 +- .../listing-11-06/output.txt | 4 +- .../listing-11-07/output.txt | 4 +- .../listing-11-08/output.txt | 4 +- .../listing-11-10/output.txt | 2 +- .../listing-11-11/output.txt | 4 +- .../listing-11-13/output.txt | 12 +- .../output.txt | 4 +- .../output.txt | 4 +- .../output.txt | 2 +- .../no-listing-04-bug-in-add-two/output.txt | 2 +- .../no-listing-06-greeter-with-bug/output.txt | 4 +- .../output.txt | 2 +- .../no-listing-08-guess-with-bug/output.txt | 2 +- .../output.txt | 2 +- .../no-listing-11-ignore-a-test/output.txt | 4 +- .../output.txt | 8 +- .../output-only-01-show-output/output.txt | 2 +- .../output-only-02-single-test/output.txt | 2 +- .../output-only-03-multiple-tests/output.txt | 2 +- .../output-only-04-running-ignored/output.txt | 4 +- .../output.txt | 2 +- .../listing-12-16/output.txt | 2 +- .../listing-12-19/output.txt | 6 +- .../listing-12-21/output.txt | 6 +- .../listing-13-19/src/lib.rs | 4 +- .../output.txt | 2 +- .../add/Cargo.lock | 84 +- .../add/add-one/Cargo.toml | 2 +- .../output-only-03-use-rand/add/Cargo.lock | 84 +- .../add/add-one/Cargo.toml | 2 +- .../listing-15-23/output.txt | 2 +- .../ch20-web-server/listing-20-07/src/main.rs | 9 +- .../ch20-web-server/listing-20-08/src/main.rs | 9 +- .../ch20-web-server/listing-20-09/src/main.rs | 11 +- .../ch20-web-server/listing-20-10/src/main.rs | 13 +- .../ch20-web-server/listing-20-11/src/main.rs | 13 +- .../ch20-web-server/listing-20-12/src/main.rs | 13 +- .../listing-20-13/src/bin/main.rs | 13 +- .../listing-20-14/src/bin/main.rs | 13 +- .../listing-20-15/src/bin/main.rs | 13 +- .../listing-20-16/src/bin/main.rs | 13 +- .../listing-20-17/src/bin/main.rs | 13 +- .../listing-20-18/src/bin/main.rs | 13 +- .../listing-20-19/src/bin/main.rs | 13 +- .../listing-20-20/src/bin/main.rs | 13 +- .../listing-20-21/src/bin/main.rs | 13 +- .../listing-20-22/src/bin/main.rs | 13 +- .../listing-20-23/src/bin/main.rs | 13 +- .../listing-20-24/src/bin/main.rs | 13 +- .../listing-20-25/src/bin/main.rs | 13 +- .../src/bin/main.rs | 13 +- .../src/bin/main.rs | 13 +- .../src/bin/main.rs | 13 +- .../src/bin/main.rs | 13 +- .../src/bin/main.rs | 13 +- .../src/bin/main.rs | 13 +- .../src/bin/main.rs | 13 +- .../no-listing-08-final-code/src/bin/main.rs | 13 +- src/doc/book/rust-toolchain | 2 +- .../book/src/appendix-03-derivable-traits.md | 10 +- src/doc/book/src/ch01-01-installation.md | 3 +- src/doc/book/src/ch01-02-hello-world.md | 8 +- src/doc/book/src/ch01-03-hello-cargo.md | 3 +- .../src/ch02-00-guessing-game-tutorial.md | 87 +- .../src/ch03-01-variables-and-mutability.md | 9 +- src/doc/book/src/ch03-02-data-types.md | 14 +- src/doc/book/src/ch03-05-control-flow.md | 2 +- src/doc/book/src/ch05-02-example-structs.md | 6 +- src/doc/book/src/ch05-03-method-syntax.md | 2 +- src/doc/book/src/ch08-03-hash-maps.md | 4 +- ...ch09-01-unrecoverable-errors-with-panic.md | 28 +- .../ch09-02-recoverable-errors-with-result.md | 2 +- src/doc/book/src/ch10-00-generics.md | 8 +- src/doc/book/src/ch10-01-syntax.md | 4 +- src/doc/book/src/ch10-02-traits.md | 2 +- src/doc/book/src/ch11-01-writing-tests.md | 2 +- src/doc/book/src/ch11-03-test-organization.md | 4 +- ...h12-01-accepting-command-line-arguments.md | 2 +- src/doc/book/src/ch12-02-reading-a-file.md | 2 +- ...improving-error-handling-and-modularity.md | 6 +- ...2-04-testing-the-librarys-functionality.md | 4 +- ...-06-writing-to-stderr-instead-of-stdout.md | 2 +- src/doc/book/src/ch13-01-closures.md | 9 +- src/doc/book/src/ch13-02-iterators.md | 8 +- .../src/ch14-02-publishing-to-crates-io.md | 2 +- src/doc/book/src/ch14-03-cargo-workspaces.md | 14 +- .../book/src/ch15-05-interior-mutability.md | 20 +- src/doc/book/src/ch16-02-message-passing.md | 6 +- ...04-extensible-concurrency-sync-and-send.md | 2 +- src/doc/book/src/ch18-03-pattern-syntax.md | 2 +- src/doc/book/src/ch19-01-unsafe-rust.md | 11 +- src/doc/book/src/ch19-04-advanced-types.md | 2 +- src/doc/book/src/ch20-01-single-threaded.md | 10 +- .../book/src/img/ferris/does_not_compile.svg | 2 +- src/doc/book/src/title-page.md | 2 +- src/doc/book/tools/update-rustc.sh | 2 +- src/doc/edition-guide/README.md | 31 +- src/doc/edition-guide/book.toml | 3 + .../rust-2018/module-system/path-clarity.md | 2 +- .../musl-support-for-fully-static-binaries.md | 2 +- src/doc/embedded-book/.github/bors.toml | 2 +- .../embedded-book/.github/workflows/ci.yml | 57 + src/doc/embedded-book/.travis.yml | 20 - src/doc/embedded-book/CNAME | 1 - src/doc/embedded-book/ci/after-success.sh | 17 - src/doc/embedded-book/ci/install.sh | 17 - src/doc/embedded-book/ci/script.sh | 19 - .../embedded-book/src/intro/install/verify.md | 4 + src/doc/nomicon/src/ffi.md | 20 +- src/doc/nomicon/src/lifetime-mismatch.md | 26 +- src/doc/reference/README.md | 35 +- src/doc/reference/book.toml | 3 + src/doc/reference/src/SUMMARY.md | 2 - .../reference/src/attributes/type_system.md | 3 +- .../src/behavior-considered-undefined.md | 5 +- src/doc/reference/src/const_eval.md | 2 - src/doc/reference/src/expressions.md | 6 +- .../reference/src/expressions/array-expr.md | 50 +- .../reference/src/expressions/await-expr.md | 37 +- .../reference/src/expressions/block-expr.md | 107 +- .../reference/src/expressions/call-expr.md | 44 +- .../reference/src/expressions/closure-expr.md | 55 +- .../src/expressions/enum-variant-expr.md | 47 - .../reference/src/expressions/field-expr.md | 22 +- .../reference/src/expressions/grouped-expr.md | 12 +- src/doc/reference/src/expressions/if-expr.md | 39 +- .../reference/src/expressions/literal-expr.md | 5 +- .../reference/src/expressions/loop-expr.md | 101 +- .../reference/src/expressions/match-expr.md | 82 +- .../src/expressions/method-call-expr.md | 72 +- .../src/expressions/operator-expr.md | 231 +- .../reference/src/expressions/path-expr.md | 7 +- .../reference/src/expressions/range-expr.md | 4 +- .../reference/src/expressions/return-expr.md | 6 +- .../reference/src/expressions/struct-expr.md | 57 +- .../reference/src/expressions/tuple-expr.md | 37 +- src/doc/reference/src/glossary.md | 17 + src/doc/reference/src/introduction.md | 139 +- src/doc/reference/src/items/enumerations.md | 2 +- src/doc/reference/src/items/generics.md | 2 +- src/doc/reference/src/items/unions.md | 16 +- src/doc/reference/src/memory-ownership.md | 4 - src/doc/reference/src/paths.md | 19 +- src/doc/reference/src/subtyping.md | 1 + src/doc/reference/src/type-layout.md | 2 +- src/doc/reference/src/types/boolean.md | 127 +- src/doc/reference/src/types/enum.md | 5 +- .../rust-by-example/src/flow_control/for.md | 6 +- src/doc/rust-by-example/src/fn/diverging.md | 2 +- .../src/scope/lifetime/explicit.md | 2 +- src/doc/rust-by-example/src/std/arc.md | 2 +- src/doc/rust.css | 7 + .../rustc-dev-guide/.github/workflows/ci.yml | 77 + .../.github/workflows/date-check.yml | 44 + src/doc/rustc-dev-guide/.travis.yml | 30 - src/doc/rustc-dev-guide/CODE_OF_CONDUCT.md | 37 +- src/doc/rustc-dev-guide/README.md | 79 +- src/doc/rustc-dev-guide/book.toml | 11 +- src/doc/rustc-dev-guide/ci/check-in.sh | 35 + .../rustc-dev-guide/ci/check_line_lengths.sh | 18 +- .../rustc-dev-guide/ci/date-check/Cargo.lock | 147 + .../rustc-dev-guide/ci/date-check/Cargo.toml | 12 + .../rustc-dev-guide/ci/date-check/src/main.rs | 236 + src/doc/rustc-dev-guide/ci/linkcheck.sh | 31 + .../examples/rustc-driver-example.rs | 57 +- .../rustc-driver-getting-diagnostics.rs | 88 + .../rustc-driver-interacting-with-the-ast.rs | 89 + src/doc/rustc-dev-guide/src/SUMMARY.md | 268 +- .../rustc-dev-guide/src/about-this-guide.md | 39 +- .../src/appendix/background.md | 217 +- .../src/appendix/bibliography.md | 43 +- .../src/appendix/code-index.md | 49 +- .../src/appendix/compiler-lecture.md | 67 +- .../rustc-dev-guide/src/appendix/glossary.md | 173 +- .../rustc-dev-guide/src/appendix/humorust.md | 2 +- .../src/backend/backend-agnostic.md | 12 +- .../rustc-dev-guide/src/backend/codegen.md | 6 +- .../rustc-dev-guide/src/backend/debugging.md | 22 +- .../implicit-caller-location.md | 51 +- .../rustc-dev-guide/src/backend/inline-asm.md | 4 + .../src/backend/libs-and-metadata.md | 192 + .../src/backend/lowering-mir.md | 14 +- .../rustc-dev-guide/src/backend/monomorph.md | 104 +- .../src/backend/updating-llvm.md | 29 +- .../moves_and_initialization/move_paths.md | 14 +- .../src/borrow_check/region_inference.md | 4 +- .../constraint_propagation.md | 2 + .../region_inference/lifetime_parameters.md | 2 + .../region_inference/member_constraints.md | 19 +- .../placeholders_and_universes.md | 13 +- .../src/borrow_check/two_phase_borrows.md | 2 +- .../rustc-dev-guide/src/bug-fix-procedure.md | 19 +- .../src/building/bootstrapping.md | 485 +- .../src/building/compiler-documenting.md | 7 +- .../src/building/how-to-build-and-run.md | 170 +- .../src/building/new-target.md | 132 + .../src/building/prerequisites.md | 62 + .../rustc-dev-guide/src/building/suggested.md | 181 +- src/doc/rustc-dev-guide/src/cli.md | 33 + src/doc/rustc-dev-guide/src/closure.md | 34 +- .../rustc-dev-guide/src/compiler-debugging.md | 267 +- src/doc/rustc-dev-guide/src/compiler-src.md | 343 +- src/doc/rustc-dev-guide/src/compiler-team.md | 13 +- src/doc/rustc-dev-guide/src/compiletest.md | 104 +- src/doc/rustc-dev-guide/src/const-eval.md | 41 +- src/doc/rustc-dev-guide/src/contributing.md | 572 + src/doc/rustc-dev-guide/src/conventions.md | 26 +- src/doc/rustc-dev-guide/src/crates-io.md | 9 +- .../src/debugging-support-in-rustc.md | 47 +- src/doc/rustc-dev-guide/src/diagnostics.md | 407 +- .../src/diagnostics/diagnostic-codes.md | 30 +- .../src/diagnostics/lintstore.md | 17 +- .../src/diagnostics/sessiondiagnostic.md | 97 + .../rustc-dev-guide/src/early-late-bound.md | 107 + src/doc/rustc-dev-guide/src/feature-gates.md | 102 + .../rustc-dev-guide/src/getting-started.md | 546 + src/doc/rustc-dev-guide/src/git.md | 330 + src/doc/rustc-dev-guide/src/hir-debugging.md | 2 +- src/doc/rustc-dev-guide/src/hir.md | 76 +- .../rustc-dev-guide/src/ice-breaker/about.md | 83 - src/doc/rustc-dev-guide/src/identifiers.md | 108 + .../src/img/coverage-branch-counting-01.png | Bin 0 -> 11282 bytes .../src/img/coverage-graphviz-01.png | Bin 0 -> 340404 bytes .../src/img/coverage-spanview-01.png | Bin 0 -> 320657 bytes .../src/img/dataflow-graphviz-example.png | Bin 0 -> 81892 bytes .../src/img/llvm-cov-show-01.png | Bin 0 -> 416748 bytes .../rustc-dev-guide/src/img/rustc_stages.svg | 3 +- .../src/img/wpa-initial-memory.png | Bin 0 -> 312637 bytes src/doc/rustc-dev-guide/src/img/wpa-stack.png | Bin 0 -> 145576 bytes .../src/implementing_new_features.md | 44 +- .../rustc-dev-guide/src/incrcomp-debugging.md | 6 +- .../src/llvm-coverage-instrumentation.md | 628 + src/doc/rustc-dev-guide/src/lowering.md | 2 +- .../rustc-dev-guide/src/macro-expansion.md | 1236 +- src/doc/rustc-dev-guide/src/memory.md | 4 +- .../rustc-dev-guide/src/mir/construction.md | 34 +- src/doc/rustc-dev-guide/src/mir/dataflow.md | 234 + src/doc/rustc-dev-guide/src/mir/debugging.md | 30 +- src/doc/rustc-dev-guide/src/mir/index.md | 65 +- .../rustc-dev-guide/src/mir/optimizations.md | 38 +- src/doc/rustc-dev-guide/src/mir/visitor.md | 4 +- src/doc/rustc-dev-guide/src/miri.md | 53 +- .../rustc-dev-guide/src/name-resolution.md | 48 +- .../src/notification-groups/about.md | 99 + .../src/notification-groups/arm.md | 22 + .../cleanup-crew.md | 0 .../llvm.md | 17 +- .../src/notification-groups/risc-v.md | 22 + .../src/notification-groups/windows.md | 32 + .../src/opaque-types-type-alias-impl-trait.md | 5 +- src/doc/rustc-dev-guide/src/overview.md | 383 +- .../src/panic-implementation.md | 60 +- src/doc/rustc-dev-guide/src/parallel-rustc.md | 47 + src/doc/rustc-dev-guide/src/param_env.md | 4 +- src/doc/rustc-dev-guide/src/part-1-intro.md | 7 - src/doc/rustc-dev-guide/src/part-2-intro.md | 7 +- src/doc/rustc-dev-guide/src/part-3-intro.md | 6 +- src/doc/rustc-dev-guide/src/part-5-intro.md | 6 +- .../src/pat-exhaustive-checking.md | 83 +- .../src/profile-guided-optimization.md | 20 +- src/doc/rustc-dev-guide/src/profiling.md | 106 +- .../src/profiling/with_perf.md | 4 +- .../src/profiling/wpa_profiling.md | 108 + .../incremental-compilation-in-detail.md | 99 +- .../src/queries/incremental-compilation.md | 15 +- .../rustc-dev-guide/src/queries/profiling.md | 23 +- .../query-evaluation-model-in-detail.md | 21 +- src/doc/rustc-dev-guide/src/query.md | 38 +- src/doc/rustc-dev-guide/src/rustbot.md | 63 + .../src/rustc-driver-getting-diagnostics.md | 41 + .../rustc-driver-interacting-with-the-ast.md | 20 +- .../rustc-dev-guide/src/rustdoc-internals.md | 263 + src/doc/rustc-dev-guide/src/rustdoc.md | 204 +- src/doc/rustc-dev-guide/src/salsa.md | 24 +- src/doc/rustc-dev-guide/src/sanitizers.md | 6 +- src/doc/rustc-dev-guide/src/serialization.md | 164 + src/doc/rustc-dev-guide/src/stability.md | 63 +- .../src/stabilization_guide.md | 20 +- src/doc/rustc-dev-guide/src/syntax-intro.md | 5 + .../src/test-implementation.md | 30 +- src/doc/rustc-dev-guide/src/tests/adding.md | 215 +- src/doc/rustc-dev-guide/src/tests/intro.md | 185 +- src/doc/rustc-dev-guide/src/tests/running.md | 66 +- src/doc/rustc-dev-guide/src/the-parser.md | 29 +- src/doc/rustc-dev-guide/src/thir.md | 44 + .../src/traits/associated-types.md | 168 - .../src/traits/bibliography.md | 27 - .../src/traits/canonical-queries.md | 11 +- .../src/traits/canonicalization.md | 256 - .../src/traits/chalk-overview.md | 256 - src/doc/rustc-dev-guide/src/traits/chalk.md | 40 + .../src/traits/goals-and-clauses.md | 20 +- src/doc/rustc-dev-guide/src/traits/hrtb.md | 4 +- .../src/traits/implied-bounds.md | 502 - src/doc/rustc-dev-guide/src/traits/index.md | 64 - .../src/traits/lowering-module.md | 56 - .../src/traits/lowering-rules.md | 416 - .../src/traits/lowering-to-logic.md | 8 +- src/doc/rustc-dev-guide/src/traits/regions.md | 9 - .../rustc-dev-guide/src/traits/resolution.md | 26 +- src/doc/rustc-dev-guide/src/traits/slg.md | 302 - src/doc/rustc-dev-guide/src/traits/wf.md | 469 - src/doc/rustc-dev-guide/src/ty-fold.md | 2 +- src/doc/rustc-dev-guide/src/ty.md | 115 +- src/doc/rustc-dev-guide/src/type-checking.md | 8 +- src/doc/rustc-dev-guide/src/type-inference.md | 6 +- src/doc/rustc-dev-guide/src/variance.md | 2 + src/doc/rustc-dev-guide/src/walkthrough.md | 10 +- src/doc/rustc-dev-guide/triagebot.toml | 7 + src/doc/rustc/src/SUMMARY.md | 1 + src/doc/rustc/src/codegen-options/index.md | 6 +- src/doc/rustc/src/command-line-arguments.md | 5 +- src/doc/rustc/src/exploit-mitigations.md | 2 +- src/doc/rustc/src/lints/levels.md | 4 +- src/doc/rustc/src/lints/listing/index.md | 2 +- src/doc/rustc/src/platform-support.md | 14 +- src/doc/rustc/src/tests/index.md | 284 + src/doc/rustc/src/what-is-rustc.md | 4 +- src/doc/rustdoc/src/SUMMARY.md | 2 +- src/doc/rustdoc/src/advanced-features.md | 12 +- src/doc/rustdoc/src/command-line-arguments.md | 93 +- src/doc/rustdoc/src/documentation-tests.md | 20 +- .../rustdoc/src/how-to-write-documentation.md | 80 +- .../rustdoc/src/linking-to-items-by-name.md | 75 +- src/doc/rustdoc/src/lints.md | 36 +- src/doc/rustdoc/src/passes.md | 85 +- src/doc/rustdoc/src/references.md | 6 +- src/doc/rustdoc/src/the-doc-attribute.md | 38 +- src/doc/rustdoc/src/unstable-features.md | 24 + src/doc/rustdoc/src/what-is-rustdoc.md | 12 +- src/doc/rustdoc/src/what-to-include.md | 24 +- .../src/compiler-flags/codegen-backend.md | 2 +- .../src/compiler-flags/control-flow-guard.md | 4 +- .../src/compiler-flags/extern-location.md | 31 + .../src/compiler-flags/profile.md | 4 +- .../src/compiler-flags/report-time.md | 2 +- .../src/compiler-flags/sanitizer.md | 93 +- .../source-based-code-coverage.md | 2 +- .../src/compiler-flags/tls-model.md | 2 +- .../src/language-features/auto-traits.md | 13 +- .../src/language-features/c-unwind.md | 15 + .../src/language-features/cfg-version.md | 7 +- .../custom-test-frameworks.md | 1 - .../src/language-features/doc-spotlight.md | 4 +- .../infer-static-outlives-requirements.md | 1 - .../src/language-features/intrinsics.md | 1 - .../src/language-features/lang-items.md | 14 +- .../src/language-features/non-ascii-idents.md | 8 +- .../src/language-features/or-patterns.md | 2 +- .../src/language-features/plugin.md | 4 +- .../src/language-features/rustc-attrs.md | 2 +- .../src/language-features/unboxed-closures.md | 2 +- .../src/language-features/unsized-locals.md | 4 +- .../unsized-tuple-coercion.md | 2 +- .../unstable-book/src/library-features/asm.md | 2 +- .../src/library-features/concat-idents.md | 2 +- .../src/library-features/global-asm.md | 14 +- .../src/library-features/llvm-asm.md | 2 +- .../range-bounds-assert-len.md | 10 - .../src/library-features/test.md | 4 +- .../src/library-features/try-trait.md | 2 +- src/etc/check_missing_items.py | 2 +- src/etc/dec2flt_table.py | 2 +- src/etc/gdb_providers.py | 11 +- src/etc/lldb_providers.py | 6 +- src/etc/natvis/liballoc.natvis | 7 + src/etc/natvis/libcore.natvis | 15 + src/etc/natvis/libstd.natvis | 57 +- src/etc/pre-commit.sh | 2 +- src/librustdoc/Cargo.toml | 11 +- src/librustdoc/clean/auto_trait.rs | 315 +- src/librustdoc/clean/blanket_impl.rs | 21 +- src/librustdoc/clean/cfg.rs | 2 +- src/librustdoc/clean/cfg/tests.rs | 4 + src/librustdoc/clean/inline.rs | 84 +- src/librustdoc/clean/mod.rs | 439 +- src/librustdoc/clean/types.rs | 155 +- src/librustdoc/clean/utils.rs | 213 +- src/librustdoc/config.rs | 34 +- src/librustdoc/core.rs | 302 +- src/librustdoc/doctest.rs | 85 +- src/librustdoc/doctest/tests.rs | 8 +- src/librustdoc/fold.rs | 3 +- src/librustdoc/formats/cache.rs | 180 +- src/librustdoc/formats/item_type.rs | 2 +- src/librustdoc/formats/renderer.rs | 29 +- src/librustdoc/html/format.rs | 45 +- src/librustdoc/html/layout.rs | 11 +- src/librustdoc/html/markdown.rs | 49 +- src/librustdoc/html/markdown/tests.rs | 71 +- src/librustdoc/html/render/cache.rs | 211 +- src/librustdoc/html/render/context.rs | 635 + src/librustdoc/html/render/mod.rs | 2796 +-- src/librustdoc/html/render/print_item.rs | 1420 ++ src/librustdoc/html/render/tests.rs | 5 +- src/librustdoc/html/render/write_shared.rs | 551 + src/librustdoc/html/sources.rs | 4 +- .../html/static/FiraSans-Medium.woff2 | Bin 0 -> 132780 bytes .../html/static/FiraSans-Regular.woff2 | Bin 0 -> 129188 bytes src/librustdoc/html/static/main.js | 375 +- src/librustdoc/html/static/noscript.css | 10 + src/librustdoc/html/static/rustdoc.css | 29 +- src/librustdoc/html/static/storage.js | 33 +- src/librustdoc/html/static/themes/ayu.css | 2 +- src/librustdoc/html/static/themes/dark.css | 5 +- src/librustdoc/html/static/themes/light.css | 5 +- src/librustdoc/html/static_files.rs | 6 + src/librustdoc/json/conversions.rs | 186 +- src/librustdoc/json/mod.rs | 29 +- src/librustdoc/lib.rs | 123 +- src/librustdoc/lint.rs | 188 + .../passes/calculate_doc_coverage.rs | 14 +- .../passes/check_code_block_syntax.rs | 11 +- .../passes/collect_intra_doc_links.rs | 197 +- src/librustdoc/passes/collect_trait_impls.rs | 37 +- src/librustdoc/passes/doc_test_lints.rs | 64 +- src/librustdoc/passes/html_tags.rs | 22 +- src/librustdoc/passes/mod.rs | 7 +- src/librustdoc/passes/non_autolinks.rs | 18 +- src/librustdoc/passes/propagate_doc_cfg.rs | 2 +- src/librustdoc/passes/strip_hidden.rs | 2 +- src/librustdoc/passes/strip_priv_imports.rs | 2 +- src/librustdoc/passes/strip_private.rs | 5 +- src/librustdoc/passes/stripper.rs | 6 +- src/librustdoc/passes/unindent_comments.rs | 2 +- src/librustdoc/visit_ast.rs | 57 +- src/librustdoc/visit_lib.rs | 2 +- src/rustdoc-json-types/Cargo.toml | 3 + src/rustdoc-json-types/lib.rs | 99 +- src/rustdoc-json-types/tests.rs | 34 + src/stage0.txt | 4 +- src/test/assembly/asm/arm-types.rs | 9 + src/test/assembly/asm/riscv-types.rs | 29 +- src/test/assembly/stack-probes.rs | 42 + src/test/assembly/target-feature-multiple.rs | 41 + .../drop_in_place_intrinsic.rs | 8 +- .../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 +- .../partitioning/extern-drop-glue.rs | 6 +- .../partitioning/local-drop-glue.rs | 8 +- .../partitioning/vtable-through-const.rs | 2 +- src/test/codegen/asm-sanitize-llvm.rs | 32 + src/test/codegen/codemodels.rs | 20 + src/test/codegen/debug-compile-unit-path.rs | 9 + src/test/codegen/drop.rs | 2 +- .../codegen/enum-bounds-check-issue-82871.rs | 16 + src/test/codegen/function-arguments.rs | 3 +- src/test/codegen/issue-59352.rs | 4 +- src/test/codegen/issue-73031.rs | 27 + src/test/codegen/issue-75525-bounds-checks.rs | 27 + src/test/codegen/issue-75546.rs | 16 + src/test/codegen/issue-77812.rs | 33 + src/test/codegen/loop.rs | 15 - src/test/codegen/naked-noinline.rs | 2 +- .../codegen/non-terminate/infinite-loop-1.rs | 3 +- .../codegen/non-terminate/infinite-loop-2.rs | 3 +- .../non-terminate/infinite-recursion.rs | 3 +- .../non-terminate/nonempty-infinite-loop.rs | 29 + src/test/codegen/packed.rs | 4 +- .../codegen/repr-transparent-aggregates-1.rs | 18 +- .../codegen/repr-transparent-aggregates-2.rs | 18 +- .../codegen/repr-transparent-aggregates-3.rs | 18 +- .../codegen/sanitizer-no-sanitize-inlining.rs | 4 +- src/test/codegen/stack-probes.rs | 2 + src/test/codegen/target-feature-multiple.rs | 9 - .../codegen/target-feature-on-functions.rs | 9 - src/test/codegen/target-feature-overrides.rs | 47 + src/test/codegen/try_identity.rs | 2 +- .../unwind-abis/c-unwind-abi-panic-abort.rs | 18 + src/test/codegen/unwind-abis/c-unwind-abi.rs | 29 + .../codegen/unwind-abis/stdcall-unwind-abi.rs | 32 + .../codegen/unwind-abis/system-unwind-abi.rs | 29 + .../unwind-abis/thiscall-unwind-abi.rs | 33 + .../incremental/cyclic-trait-hierarchy.rs | 10 +- src/test/incremental/hashes/enum_defs.rs | 4 +- src/test/incremental/hashes/extern_mods.rs | 4 +- .../incremental/hashes/function_interfaces.rs | 8 +- src/test/incremental/hashes/inherent_impls.rs | 4 +- src/test/incremental/hashes/statics.rs | 6 +- src/test/incremental/hashes/struct_defs.rs | 8 +- src/test/incremental/hashes/trait_impls.rs | 4 +- .../issue-82920-predicate-order-miscompile.rs | 31 + .../const_goto.issue_77355_opt.ConstGoto.diff | 52 + src/test/mir-opt/const_goto.rs | 16 + ...onst_goto_const_eval_fail.f.ConstGoto.diff | 51 + .../mir-opt/const_goto_const_eval_fail.rs | 16 + .../mir-opt/const_prop/boolean_identities.rs | 2 +- ...simplification.hello.PreCodegen.before.mir | 1 - src/test/mir-opt/const_prop/issue-66971.rs | 2 +- src/test/mir-opt/const_prop/issue-67019.rs | 2 +- src/test/mir-opt/const_prop/mult_by_zero.rs | 2 +- ...riable.main.SimplifyLocals.after.32bit.mir | 1 - ...riable.main.SimplifyLocals.after.64bit.mir | 1 - ..._line_doc_comment_2.DeduplicateBlocks.diff | 107 + src/test/mir-opt/deduplicate_blocks.rs | 13 + src/test/mir-opt/dest-prop/branch.rs | 2 +- .../mir-opt/dest-prop/copy_propagation_arg.rs | 2 +- .../cycle.main.DestinationPropagation.diff | 1 - src/test/mir-opt/dest-prop/cycle.rs | 2 +- src/test/mir-opt/dest-prop/simple.rs | 2 +- .../union.main.DestinationPropagation.diff | 1 - src/test/mir-opt/dest-prop/union.rs | 2 +- src/test/mir-opt/early_otherwise_branch.rs | 2 +- .../early_otherwise_branch_3_element_tuple.rs | 2 +- .../mir-opt/early_otherwise_branch_68867.rs | 2 +- ...h.before-SimplifyBranches-final.after.diff | 2 +- ...ch_68867.try_sum.EarlyOtherwiseBranch.diff | 2 +- .../mir-opt/early_otherwise_branch_noopt.rs | 2 +- ...float_to_exponential_common.ConstProp.diff | 2 +- .../mir-opt/inline/inline-into-box-place.rs | 2 +- .../mir-opt/inline/inline-trait-method_2.rs | 2 +- ...line_closure_captures.foo.Inline.after.mir | 12 +- ...patibility.inlined_no_sanitize.Inline.diff | 1 - ...ibility.inlined_target_feature.Inline.diff | 1 - .../inline/inline_cycle.two.Inline.diff | 1 - .../inline/inline_diverging.h.Inline.diff | 19 +- .../inline/inline_generator.main.Inline.diff | 41 +- ...inline_instruction_set.default.Inline.diff | 1 - .../inline_instruction_set.t32.Inline.diff | 1 - .../inline_options.main.Inline.after.mir | 1 - .../inline/inline_shims.drop.Inline.diff | 10 +- ...ine_scopes_parenting.main.Inline.after.mir | 1 - .../issue_73223.main.PreCodegen.32bit.diff | 208 +- .../issue_73223.main.PreCodegen.64bit.diff | 208 +- ..._73223.main.SimplifyArmIdentity.32bit.diff | 228 +- ..._73223.main.SimplifyArmIdentity.64bit.diff | 228 +- src/test/mir-opt/issues/issue-59352.rs | 2 +- ...ue_59352.num_to_digit.PreCodegen.after.mir | 37 +- ...wer_intrinsics.f_u64.PreCodegen.before.mir | 5 +- ...er_intrinsics.f_unit.PreCodegen.before.mir | 1 - ...s.bar.MatchBranchSimplification.32bit.diff | 139 +- ...s.bar.MatchBranchSimplification.64bit.diff | 139 +- ...s.foo.MatchBranchSimplification.32bit.diff | 58 +- ...s.foo.MatchBranchSimplification.64bit.diff | 58 +- ...e_branches.foo.PreCodegen.before.32bit.mir | 10 + ...e_branches.foo.PreCodegen.before.64bit.mir | 10 + ...ed_if.MatchBranchSimplification.32bit.diff | 205 +- ...ed_if.MatchBranchSimplification.64bit.diff | 205 +- src/test/mir-opt/matches_reduce_branches.rs | 20 +- .../mir-opt/multiple_return_terminators.rs | 2 +- ...nators.test.MultipleReturnTerminators.diff | 2 - .../not_equal_false.opt.InstCombine.diff | 56 +- src/test/mir-opt/not_equal_false.rs | 6 +- src/test/mir-opt/receiver-ptr-mutability.rs | 20 + ...receiver_ptr_mutability.main.mir_map.0.mir | 96 + ...age_markers.main.RemoveStorageMarkers.diff | 115 + src/test/mir-opt/remove_storage_markers.rs | 11 + ...annot_opt_generic.RemoveUnneededDrops.diff | 1 - ...ed_drops.dont_opt.RemoveUnneededDrops.diff | 1 - ...nneeded_drops.opt.RemoveUnneededDrops.diff | 1 - ....opt_generic_copy.RemoveUnneededDrops.diff | 1 - ...place.Test.SimplifyCfg-make_shim.after.mir | 4 +- src/test/mir-opt/simplify-arm-identity.rs | 2 +- src/test/mir-opt/simplify-arm.rs | 2 +- ...ify_arm.id_result.SimplifyArmIdentity.diff | 2 +- ...lify_arm.id_result.SimplifyBranchSame.diff | 2 +- ...mplify_arm.id_try.SimplifyArmIdentity.diff | 6 +- ...implify_arm.id_try.SimplifyBranchSame.diff | 6 +- .../simplify_locals.c.SimplifyLocals.diff | 9 +- .../simplify_locals.d1.SimplifyLocals.diff | 2 +- .../simplify_locals.d2.SimplifyLocals.diff | 2 +- .../simplify_locals.r.SimplifyLocals.diff | 2 +- .../simplify_locals.t1.SimplifyLocals.diff | 2 +- .../simplify_locals.t2.SimplifyLocals.diff | 2 +- .../simplify_locals.t3.SimplifyLocals.diff | 2 +- ..._locals_fixedpoint.foo.SimplifyLocals.diff | 6 +- ...ves_unused_consts.main.SimplifyLocals.diff | 2 +- ...y.try_identity.DestinationPropagation.diff | 6 +- ..._try.try_identity.SimplifyArmIdentity.diff | 6 +- ....try_identity.SimplifyBranchSame.after.mir | 6 +- ..._try.try_identity.SimplifyLocals.after.mir | 6 +- ...g].AddMovesForPackedDrops.before.32bit.mir | 4 +- ...g].AddMovesForPackedDrops.before.64bit.mir | 4 +- ...enum.process_void.SimplifyLocals.after.mir | 1 - ...2_.AddMovesForPackedDrops.before.32bit.mir | 4 +- ...2_.AddMovesForPackedDrops.before.64bit.mir | 4 +- ...hange_loop_body.PreCodegen.after.32bit.mir | 1 - ...hange_loop_body.PreCodegen.after.64bit.mir | 1 - ...le_storage.while_loop.PreCodegen.after.mir | 2 - src/test/pretty/asm.pp | 2 +- src/test/pretty/cast-lt.pp | 2 +- src/test/pretty/dollar-crate.pp | 2 +- .../pretty/expanded-and-path-remap-80832.pp | 2 +- src/test/pretty/gat-bounds.rs | 2 + src/test/pretty/issue-12590-c.pp | 2 +- src/test/pretty/issue-4264.pp | 2 +- src/test/pretty/macro_rules.rs | 19 + .../c-unwind-abi-catch-lib-panic/Makefile | 30 + .../c-unwind-abi-catch-lib-panic/add.c | 12 + .../c-unwind-abi-catch-lib-panic/main.rs | 35 + .../c-unwind-abi-catch-lib-panic/panic.rs | 12 + .../c-unwind-abi-catch-panic/Makefile | 5 + .../c-unwind-abi-catch-panic/add.c | 12 + .../c-unwind-abi-catch-panic/main.rs | 44 + .../coverage-reports/Makefile | 9 +- .../expected_show_coverage.async.txt | 2 +- .../expected_show_coverage.inline.txt | 53 + .../expected_show_coverage.partial_eq.txt | 21 +- .../expected_show_coverage.uses_crate.txt | 7 +- .../coverage-spanview/Makefile | 10 +- ...ht_abort.-------.InstrumentCoverage.0.html | 28 +- ...l_assert.-------.InstrumentCoverage.0.html | 18 +- ...osure#0}.-------.InstrumentCoverage.0.html | 6 +- ...osure#1}.-------.InstrumentCoverage.0.html | 6 +- ...osure#2}.-------.InstrumentCoverage.0.html | 6 +- ...block_on.-------.InstrumentCoverage.0.html | 136 +- ...ync.main.-------.InstrumentCoverage.0.html | 54 +- ...osure#0}.-------.InstrumentCoverage.0.html | 4 +- ...sure#10}.-------.InstrumentCoverage.0.html | 4 +- ...sure#11}.-------.InstrumentCoverage.0.html | 4 +- ...osure#1}.-------.InstrumentCoverage.0.html | 4 +- ...osure#2}.-------.InstrumentCoverage.0.html | 12 +- ...osure#3}.-------.InstrumentCoverage.0.html | 4 +- ...osure#5}.-------.InstrumentCoverage.0.html | 84 +- ...osure#6}.-------.InstrumentCoverage.0.html | 4 +- ...osure#7}.-------.InstrumentCoverage.0.html | 12 +- ...osure#8}.-------.InstrumentCoverage.0.html | 4 +- ...osure#9}.-------.InstrumentCoverage.0.html | 4 +- ...ure.main.-------.InstrumentCoverage.0.html | 5870 +++--- ...ons.main.-------.InstrumentCoverage.0.html | 16 +- ...ode.main.-------.InstrumentCoverage.0.html | 32 +- ...nused_fn.-------.InstrumentCoverage.0.html | 32 +- ..._library.-------.InstrumentCoverage.0.html | 32 +- ...est.main.-------.InstrumentCoverage.0.html | 68 +- ...doctests.-------.InstrumentCoverage.0.html | 134 +- ...ait.main.-------.InstrumentCoverage.0.html | 8 +- ...#0}-drop.-------.InstrumentCoverage.0.html | 24 +- ...ics.main.-------.InstrumentCoverage.0.html | 8 +- ...#1}-drop.-------.InstrumentCoverage.0.html | 24 +- .../if.main.-------.InstrumentCoverage.0.html | 76 +- ...lse.main.-------.InstrumentCoverage.0.html | 36 +- ....display.-------.InstrumentCoverage.0.html | 161 + ...e.error.-------.InstrumentCoverage.0.html} | 19 +- ....length.-------.InstrumentCoverage.0.html} | 22 +- ...ne.main.-------.InstrumentCoverage.0.html} | 44 +- ...ermutate.-------.InstrumentCoverage.0.html | 183 + ...utations.-------.InstrumentCoverage.0.html | 113 + ...ine.swap.-------.InstrumentCoverage.0.html | 173 + ...ait_func.-------.InstrumentCoverage.0.html | 16 +- ...-in_func.-------.InstrumentCoverage.0.html | 40 +- ...ait_func.-------.InstrumentCoverage.0.html | 8 +- ...ems.main.-------.InstrumentCoverage.0.html | 46 +- ...ean.main.-------.InstrumentCoverage.0.html | 32 +- ...hes.main.-------.InstrumentCoverage.0.html | 32 +- ...l#0}-fmt.-------.InstrumentCoverage.0.html | 10 +- ...ern.main.-------.InstrumentCoverage.0.html | 36 +- ...ops.main.-------.InstrumentCoverage.0.html | 14 +- ...low.main.-------.InstrumentCoverage.0.html | 48 +- ...overflow.-------.InstrumentCoverage.0.html | 84 +- ...ht_panic.-------.InstrumentCoverage.0.html | 28 +- ..._eq.main.-------.InstrumentCoverage.0.html | 96 +- ...osure#0}.-------.InstrumentCoverage.0.html | 83 - ...osure#0}.-------.InstrumentCoverage.0.html | 83 - ...pl#2}-gt.-------.InstrumentCoverage.0.html | 92 - ...osure#0}.-------.InstrumentCoverage.0.html | 82 - ...osure#0}.-------.InstrumentCoverage.0.html | 83 - ...pl#2}-le.-------.InstrumentCoverage.0.html | 92 - ...osure#0}.-------.InstrumentCoverage.0.html | 82 - ...osure#0}.-------.InstrumentCoverage.0.html | 83 - ...pl#2}-lt.-------.InstrumentCoverage.0.html | 92 - ...l#7}-fmt.-------.InstrumentCoverage.0.html | 67 +- ...8}-clone.-------.InstrumentCoverage.0.html | 6 +- ...oop.main.-------.InstrumentCoverage.0.html | 40 +- ...tch.main.-------.InstrumentCoverage.0.html | 34 +- ...ult.main.-------.InstrumentCoverage.0.html | 8 +- ...function.-------.InstrumentCoverage.0.html | 16 +- ...function.-------.InstrumentCoverage.0.html | 24 +- ...function.-------.InstrumentCoverage.0.html | 16 +- ...ib_crate.-------.InstrumentCoverage.0.html | 36 +- ...function.-------.InstrumentCoverage.0.html | 24 +- ...function.-------.InstrumentCoverage.0.html | 12 +- ...function.-------.InstrumentCoverage.0.html | 24 +- ...function.-------.InstrumentCoverage.0.html | 24 +- ...function.-------.InstrumentCoverage.0.html | 24 +- ...ate.main.-------.InstrumentCoverage.0.html | 96 +- ...eld.main.-------.InstrumentCoverage.0.html | 38 +- src/test/run-make-fulldeps/coverage/async.rs | 2 +- .../coverage/coverage_tools.mk | 2 - src/test/run-make-fulldeps/coverage/inline.rs | 51 + .../run-make-fulldeps/coverage/partial_eq.rs | 19 +- src/test/run-make-fulldeps/issue-19371/foo.rs | 1 + src/test/run-make-fulldeps/pgo-use/Makefile | 9 +- .../print-unversioned-files/Makefile | 4 + .../unversioned-files.txt | 15 + .../rustdoc-map-file/Makefile | 5 + .../rustdoc-map-file/expected.json | 5 + .../run-make-fulldeps/rustdoc-map-file/foo.rs | 16 + .../rustdoc-map-file/validate_json.py | 41 + src/test/run-make-fulldeps/simd-ffi/simd.rs | 5 + .../split-debuginfo/Makefile | 2 + .../run-make-fulldeps/split-dwarf/Makefile | 3 +- src/test/run-make-fulldeps/tools.mk | 15 + .../treat-err-as-bug/Makefile | 7 - .../treat-err-as-bug/delay_span_bug.rs | 4 - .../run-make-fulldeps/treat-err-as-bug/err.rs | 3 - src/test/run-make/const_fn_mir/dump.mir | 3 - .../issue-83112-incr-test-moved-file/Makefile | 25 + .../issue-83112-incr-test-moved-file/main.rs | 1 + .../run-make/libtest-thread-limit/Makefile | 7 + .../run-make/libtest-thread-limit/test.rs | 16 + src/test/rustdoc-gui/basic-code.goml | 3 + src/test/rustdoc-gui/basic.goml | 4 + src/test/rustdoc-gui/code-sidebar-toggle.goml | 6 + src/test/rustdoc-gui/lib.rs | 72 + src/test/rustdoc-gui/list_code_block.goml | 3 + src/test/rustdoc-gui/nojs-attr-pos.goml | 5 + src/test/rustdoc-gui/search-input-mobile.goml | 11 + src/test/rustdoc-gui/shortcuts.goml | 26 + src/test/rustdoc-gui/theme-change.goml | 10 + src/test/rustdoc-gui/toggle-docs.goml | 7 + src/test/rustdoc-json/fn_pointer/header.rs | 5 + src/test/rustdoc-json/fns/header.rs | 22 + src/test/rustdoc-json/method_abi.rs | 25 + src/test/rustdoc-json/methods/header.rs | 26 + src/test/rustdoc-json/nested.rs | 26 +- src/test/rustdoc-json/reexport/glob_extern.rs | 17 + .../rustdoc-json/reexport/glob_private.rs | 27 + .../rustdoc-json/reexport/rename_public.rs | 17 + .../rustdoc-json/reexport/simple_private.rs | 13 + .../rustdoc-json/reexport/simple_public.rs | 18 + .../rustdoc-ui/assoc-item-not-in-scope.rs | 2 +- .../rustdoc-ui/assoc-item-not-in-scope.stderr | 4 +- src/test/rustdoc-ui/check-attr-test.rs | 2 +- src/test/rustdoc-ui/check-attr-test.stderr | 4 +- src/test/rustdoc-ui/check-attr.rs | 2 +- src/test/rustdoc-ui/check-attr.stderr | 4 +- src/test/rustdoc-ui/check-doc-alias-attr.rs | 14 +- .../rustdoc-ui/check-doc-alias-attr.stderr | 72 +- src/test/rustdoc-ui/check-fail.rs | 2 +- src/test/rustdoc-ui/check-fail.stderr | 12 +- src/test/rustdoc-ui/check.rs | 2 +- src/test/rustdoc-ui/check.stderr | 23 +- .../commandline-argfile-badutf8.args | 2 + .../rustdoc-ui/commandline-argfile-badutf8.rs | 12 + .../commandline-argfile-badutf8.stderr | 2 + .../rustdoc-ui/commandline-argfile-missing.rs | 15 + .../commandline-argfile-missing.stderr | 2 + src/test/rustdoc-ui/commandline-argfile.args | 2 + src/test/rustdoc-ui/commandline-argfile.rs | 13 + .../deny-intra-link-resolution-failure.rs | 2 +- .../deny-intra-link-resolution-failure.stderr | 4 +- src/test/rustdoc-ui/deprecated-attrs.rs | 20 +- src/test/rustdoc-ui/deprecated-attrs.stderr | 41 +- .../rustdoc-ui/doc-alias-crate-level.stderr | 2 +- src/test/rustdoc-ui/doc-attr.rs | 25 + src/test/rustdoc-ui/doc-attr.stderr | 71 + src/test/rustdoc-ui/doc-attr2.rs | 11 + src/test/rustdoc-ui/doc-attr2.stderr | 26 + src/test/rustdoc-ui/doc-without-codeblock.rs | 2 +- .../rustdoc-ui/doc-without-codeblock.stderr | 6 +- .../trait-alias-closure.rs | 2 +- .../error-in-impl-trait/trait-alias.rs | 2 +- src/test/rustdoc-ui/intra-doc/alias-ice.rs | 2 +- .../rustdoc-ui/intra-doc/alias-ice.stderr | 4 +- src/test/rustdoc-ui/intra-doc/ambiguity.rs | 2 +- .../rustdoc-ui/intra-doc/ambiguity.stderr | 4 +- src/test/rustdoc-ui/intra-doc/anchors.rs | 2 +- src/test/rustdoc-ui/intra-doc/anchors.stderr | 4 +- .../rustdoc-ui/intra-doc/broken-reexport.rs | 2 +- .../intra-doc/disambiguator-mismatch.rs | 2 +- .../intra-doc/disambiguator-mismatch.stderr | 4 +- .../rustdoc-ui/intra-doc/double-anchor.stderr | 2 +- src/test/rustdoc-ui/intra-doc/errors.rs | 2 +- src/test/rustdoc-ui/intra-doc/errors.stderr | 4 +- .../incompatible-primitive-disambiguator.rs | 2 +- ...ncompatible-primitive-disambiguator.stderr | 4 +- .../intra-doc/malformed-generics.rs | 2 +- .../intra-doc/malformed-generics.stderr | 4 +- .../intra-doc/non-path-primitives.rs | 2 +- .../intra-doc/non-path-primitives.stderr | 4 +- .../rustdoc-ui/intra-doc/prim-conflict.rs | 2 +- .../rustdoc-ui/intra-doc/prim-conflict.stderr | 4 +- .../intra-doc/private.private.stderr | 14 +- .../intra-doc/private.public.stderr | 14 +- src/test/rustdoc-ui/intra-doc/private.rs | 7 +- .../rustdoc-ui/intra-doc/span-ice-55723.rs | 2 +- .../intra-doc/span-ice-55723.stderr | 4 +- .../intra-doc/unused-extern-crate.rs | 2 +- .../intra-doc/unused-extern-crate.stderr | 4 +- .../rustdoc-ui/intra-doc/warning-crlf.stderr | 2 +- src/test/rustdoc-ui/intra-doc/warning.stderr | 2 +- src/test/rustdoc-ui/invalid-html-tags.rs | 2 +- src/test/rustdoc-ui/invalid-html-tags.stderr | 4 +- src/test/rustdoc-ui/issue-58473-2.rs | 2 +- .../rustdoc-ui/issue-74134.private.stderr | 2 +- src/test/rustdoc-ui/issue-74134.public.stderr | 2 +- src/test/rustdoc-ui/lint-group.rs | 2 +- src/test/rustdoc-ui/lint-group.stderr | 24 +- .../lint-missing-doc-code-example.rs | 25 +- .../lint-missing-doc-code-example.stderr | 6 +- .../rustdoc-ui/no-crate-level-doc-lint.rs | 4 +- .../rustdoc-ui/no-crate-level-doc-lint.stderr | 6 +- src/test/rustdoc-ui/private-doc-test.rs | 2 +- src/test/rustdoc-ui/private-item-doc-test.rs | 2 +- .../rustdoc-ui/private-item-doc-test.stderr | 4 +- src/test/rustdoc-ui/pub-export-lint.rs | 2 +- src/test/rustdoc-ui/pub-export-lint.stderr | 4 +- .../reference-link-reports-error-once.rs | 2 +- .../reference-link-reports-error-once.stderr | 4 +- src/test/rustdoc-ui/reference-links.rs | 2 +- src/test/rustdoc-ui/reference-links.stderr | 4 +- .../rustdoc-ui/renamed-lint-still-applies.rs | 6 + .../renamed-lint-still-applies.stderr | 16 + src/test/rustdoc-ui/rustc-check-passes.rs | 4 + src/test/rustdoc-ui/rustc-check-passes.stderr | 9 + src/test/rustdoc-ui/unknown-renamed-lints.rs | 15 +- .../rustdoc-ui/unknown-renamed-lints.stderr | 24 +- src/test/rustdoc-ui/url-improvements.rs | 4 +- src/test/rustdoc-ui/url-improvements.stderr | 4 +- src/test/rustdoc/asm-foreign.rs | 20 + src/test/rustdoc/asm-foreign2.rs | 11 + src/test/rustdoc/auxiliary/issue-73061.rs | 2 +- src/test/rustdoc/description.rs | 24 + src/test/rustdoc/description_default.rs | 14 + src/test/rustdoc/doc-cfg.rs | 32 + src/test/rustdoc/ensure-src-link.rs | 6 + src/test/rustdoc/extern-links.rs | 2 +- src/test/rustdoc/impl-trait-alias.rs | 2 +- .../rustdoc/implementor-stable-version.rs | 2 + src/test/rustdoc/inline_cross/add-docs.rs | 2 +- src/test/rustdoc/inline_cross/impl_trait.rs | 2 +- src/test/rustdoc/intra-doc/issue-82209.rs | 11 + .../rustdoc/intra-doc/libstd-re-export.rs | 1 + .../rustdoc/intra-doc/non-path-primitives.rs | 2 +- src/test/rustdoc/issue-28927.rs | 2 +- src/test/rustdoc/playground-arg.rs | 2 +- src/test/rustdoc/redirect-map-empty.rs | 6 + src/test/rustdoc/redirect-map.rs | 23 + src/test/rustdoc/return-impl-trait.rs | 2 +- src/test/rustdoc/sized_trait.rs | 17 + src/test/rustdoc/smart-punct.rs | 30 + src/test/rustdoc/spotlight-from-dependency.rs | 24 + src/test/rustdoc/src-links-auto-impls.rs | 12 + src/test/rustdoc/task-lists.rs | 13 + src/test/rustdoc/trait-self-link.rs | 2 +- src/test/rustdoc/unit-return.rs | 4 +- .../auxiliary/issue-40001-plugin.rs | 2 +- .../auxiliary/lint-for-crate-rpass.rs | 3 +- .../ui-fulldeps/auxiliary/lint-for-crate.rs | 3 +- src/test/ui-fulldeps/pprust-expr-roundtrip.rs | 4 +- .../{ => abi}/nullable-pointer-ffi-compat.rs | 0 .../no_std-alloc-error-handler-custom.rs | 9 +- .../no_std-alloc-error-handler-default.rs | 9 +- .../ui/anon-params/anon-params-denied-2018.rs | 14 + .../anon-params-denied-2018.stderr | 76 +- .../array-slice-vec/vector-cast-weirdness.rs | 14 +- .../vector-cast-weirdness.stderr | 22 +- src/test/ui/asm/inline-syntax.arm.stderr | 14 + src/test/ui/asm/inline-syntax.rs | 38 + src/test/ui/asm/inline-syntax.x86_64.stderr | 50 + src/test/ui/assoc-inherent.rs | 17 +- src/test/ui/assoc-inherent.stderr | 20 +- .../defaults-cyclic-fail.stderr | 2 +- .../ambiguous-associated-type2.rs | 12 + .../ambiguous-associated-type2.stderr | 16 + .../associated-item-through-where-clause.rs | 21 + .../bad-bounds-on-assoc-in-trait.stderr | 29 +- .../duplicate.full_tait.stderr | 572 + ...icate.stderr => duplicate.min_tait.stderr} | 140 +- .../ui/associated-type-bounds/duplicate.rs | 5 +- ...e-predicates-that-can-define-assoc-type.rs | 10 + .../missing-trait-bound-for-assoc-fails.rs | 10 + ...missing-trait-bound-for-assoc-fails.stderr | 16 + .../super-trait-referencing-self.rs | 12 + .../super-trait-referencing.rs | 19 + .../super-trait-where-referencing-self.rs | 27 + .../trait-alias-impl-trait.full_tait.stderr | 11 + .../trait-alias-impl-trait.rs | 5 +- .../traits-assoc-anonymized.rs | 33 + .../traits-assoc-type-macros.rs | 43 + ...rojection-from-multiple-supertraits.stderr | 20 +- .../associated-types-eq-hr.stderr | 65 +- .../defaults-unsound-62211-1.stderr | 28 +- .../defaults-unsound-62211-2.stderr | 28 +- .../issue-21726.rs | 0 .../issue-22560.rs | 0 .../issue-22560.stderr | 0 .../issue-23595-2.rs | 0 .../issue-23595-2.stderr | 0 .../issue-24204.rs | 0 .../issue-43784-associated-type.rs | 0 .../issue-43784-associated-type.stderr | 0 .../issue-63591.full_tait.stderr | 11 + src/test/ui/associated-types/issue-63591.rs | 5 +- .../issue-76179.rs | 0 .../project-defer-unification.rs | 0 .../ast-json/ast-json-noexpand-output.stdout | 2 +- src/test/ui/ast-json/ast-json-output.stdout | 2 +- ...block-control-flow-static-semantics.stderr | 8 +- .../dont-suggest-missing-await.stderr | 3 +- src/test/ui/async-await/generator-desc.rs | 16 + src/test/ui/async-await/generator-desc.stderr | 51 + src/test/ui/async-await/issue-61076.rs | 3 +- src/test/ui/async-await/issue-61076.stderr | 3 +- src/test/ui/{ => async-await}/issue-74047.rs | 0 .../ui/{ => async-await}/issue-74047.stderr | 2 +- .../{issues => async-await}/issue-77993-2.rs | 0 .../issue-77993-2.stderr | 0 ...e-60655-latebound-regions.full_tait.stderr | 11 + .../issues/issue-60655-latebound-regions.rs | 5 +- .../ui/async-await/issues/issue-67893.stderr | 6 +- src/test/ui/async-await/issues/issue-78600.rs | 12 + .../ui/async-await/issues/issue-78600.stderr | 11 + ...lly-recursive-async-impl-trait-type.stderr | 2 + .../recursive-async-impl-trait-type.stderr | 1 + .../repeat_count_const_in_async_fn.rs | 0 .../suggest-missing-await-closure.stderr | 3 +- .../ui/async-await/suggest-missing-await.rs | 2 +- .../async-await/suggest-missing-await.stderr | 8 +- src/test/ui/attributes/attrs-on-params.rs | 8 + src/test/ui/attributes/attrs-on-params.stderr | 17 + .../ui/attributes/const-stability-on-macro.rs | 13 + .../const-stability-on-macro.stderr | 20 + src/test/ui/attributes/doc-attr.rs | 25 + src/test/ui/attributes/doc-attr.stderr | 71 + src/test/ui/attributes/doc-attr2.rs | 11 + src/test/ui/attributes/doc-attr2.stderr | 26 + .../ui/auxiliary/legacy-const-generics.rs | 6 + src/test/ui/bad/bad-sized.rs | 1 + src/test/ui/bad/bad-sized.stderr | 15 +- src/test/ui/binding/if-let.rs | 4 +- src/test/ui/binop/issue-77910-1.stderr | 7 +- .../block-must-not-have-result-while.stderr | 4 +- .../unexpected-return-on-unit.stderr | 2 +- .../borrowck/borrowck-assign-to-subfield.rs | 1 + .../ui/{issues => borrowck}/issue-42344.rs | 0 .../{issues => borrowck}/issue-42344.stderr | 0 src/test/ui/borrowck/issue-81365-1.rs | 26 + src/test/ui/borrowck/issue-81365-1.stderr | 20 + src/test/ui/borrowck/issue-81365-10.rs | 26 + src/test/ui/borrowck/issue-81365-10.stderr | 13 + src/test/ui/borrowck/issue-81365-11.rs | 32 + src/test/ui/borrowck/issue-81365-11.stderr | 13 + src/test/ui/borrowck/issue-81365-2.rs | 30 + src/test/ui/borrowck/issue-81365-2.stderr | 20 + src/test/ui/borrowck/issue-81365-3.rs | 37 + src/test/ui/borrowck/issue-81365-3.stderr | 20 + src/test/ui/borrowck/issue-81365-4.rs | 38 + src/test/ui/borrowck/issue-81365-4.stderr | 20 + src/test/ui/borrowck/issue-81365-5.rs | 33 + src/test/ui/borrowck/issue-81365-5.stderr | 20 + src/test/ui/borrowck/issue-81365-6.rs | 23 + src/test/ui/borrowck/issue-81365-6.stderr | 20 + src/test/ui/borrowck/issue-81365-7.rs | 24 + src/test/ui/borrowck/issue-81365-7.stderr | 20 + src/test/ui/borrowck/issue-81365-8.rs | 26 + src/test/ui/borrowck/issue-81365-8.stderr | 20 + src/test/ui/borrowck/issue-81365-9.rs | 26 + src/test/ui/borrowck/issue-81365-9.stderr | 13 + src/test/ui/borrowck/issue-82032.rs | 16 + src/test/ui/borrowck/issue-82032.stderr | 14 + .../issue-82126-mismatched-subst-and-hir.rs | 25 + ...ssue-82126-mismatched-subst-and-hir.stderr | 43 + src/test/ui/check-doc-alias-attr.stderr | 58 - .../2229_closure_analysis/by_value.rs | 3 +- .../2229_closure_analysis/by_value.stderr | 11 +- .../closure-origin-array-diagnostics.rs | 16 + .../closure-origin-array-diagnostics.stderr | 23 + ...osure-origin-single-variant-diagnostics.rs | 8 +- ...e-origin-single-variant-diagnostics.stderr | 21 +- .../diagnostics/liveness.rs | 91 + .../diagnostics/liveness.stderr | 79 + .../liveness_unintentional_copy.rs | 42 + .../liveness_unintentional_copy.stderr | 47 + .../diagnostics/repr_packed.rs | 36 + .../diagnostics/repr_packed.stderr | 22 + .../migrations/precise.rs | 78 + .../migrations/precise.stderr | 49 + .../migrations/precise_no_migrations.rs | 105 + .../2229_closure_analysis/move_closure.rs | 101 +- .../2229_closure_analysis/move_closure.stderr | 197 +- .../pattern-matching-should-fail.rs | 84 + .../pattern-matching-should-fail.stderr | 72 + .../patterns-capture-analysis.rs | 139 + .../patterns-capture-analysis.stderr | 212 + .../2229_closure_analysis/repr_packed.rs | 103 + .../2229_closure_analysis/repr_packed.stderr | 165 + .../run_pass/capture_with_wildcard_match.rs | 28 + .../capture_with_wildcard_match.stderr | 11 + ...tructure-pattern-closure-within-closure.rs | 22 + ...ture-pattern-closure-within-closure.stderr | 30 + .../run_pass/destructure_patterns.rs | 123 + .../run_pass/destructure_patterns.stderr | 66 + .../run_pass/drop_then_use_fake_reads.rs | 12 + .../run_pass/drop_then_use_fake_reads.stderr | 11 + .../lit-pattern-matching-with-methods.rs | 31 + .../lit-pattern-matching-with-methods.stderr | 11 + .../run_pass/move_closure.rs | 41 + .../struct-pattern-matching-with-methods.rs | 49 + ...truct-pattern-matching-with-methods.stderr | 11 + ...le-struct-pattern-matching-with-methods.rs | 44 + ...truct-pattern-matching-with-methods.stderr | 11 + .../use_of_mutable_borrow_and_fake_reads.rs | 12 + ...se_of_mutable_borrow_and_fake_reads.stderr | 11 + .../closures/issue-82438-mut-without-upvar.rs | 28 + .../issue-82438-mut-without-upvar.stderr | 12 + src/test/ui/codemap_tests/unicode.stderr | 2 +- ...coercion-missing-tail-expected-type.stderr | 4 +- src/test/ui/command/command-pre-exec.rs | 14 - .../cfg-attr-multi-true.stderr | 2 +- .../inner-cfg-non-inline-mod.rs | 7 + .../module_with_cfg.rs | 3 + ...ly_uninhabited_uses_correct_param_env-1.rs | 27 + ...ly_uninhabited_uses_correct_param_env-2.rs | 20 + ...-argument-cross-crate-mismatch.full.stderr | 4 +- ...t-argument-cross-crate-mismatch.min.stderr | 4 +- .../const-argument-cross-crate-mismatch.rs | 2 + .../const-param-shadowing.stderr | 2 +- .../cross_crate_predicate.stderr | 8 +- .../different-fn.stderr | 2 +- src/test/ui/const-generics/diagnostics.rs | 18 + src/test/ui/const-generics/diagnostics.stderr | 52 + .../dont-evaluate-array-len-on-err-1.rs | 22 + .../dont-evaluate-array-len-on-err-1.stderr | 12 + src/test/ui/const-generics/invalid-enum.rs | 12 +- .../ui/const-generics/invalid-enum.stderr | 14 +- ...9518-default_trait_method_normalization.rs | 21 + ...-default_trait_method_normalization.stderr | 14 + .../issue-80561-incorrect-param-env.rs | 24 + .../ui/const-generics/issues/issue-75299.rs | 2 +- src/test/ui/const-generics/type_mismatch.rs | 9 + .../ui/const-generics/type_mismatch.stderr | 23 + .../ui/const-generics/type_not_in_scope.rs | 11 + .../const-generics/type_not_in_scope.stderr | 24 + .../ui/const-ptr/out_of_bounds_read.stderr | 55 +- src/test/ui/const-ptr/ptr_to_usize_cast.rs | 13 + .../ui/const-ptr/ptr_to_usize_cast.stderr | 14 + .../needs_where_clause.stderr | 2 +- .../const_evaluatable/no_where_clause.stderr | 2 +- src/test/ui/const_prop/inline_spans.rs | 2 +- .../const_prop/inline_spans_lint_attribute.rs | 2 +- .../auxiliary/issue-17718-aux.rs | 0 src/test/ui/consts/const-as-fn.rs | 5 + src/test/ui/consts/const-as-fn.stderr | 14 + .../const-blocks/fn-call-in-non-const.stderr | 2 + .../const-eval/const_raw_ptr_ops2.stderr | 2 +- .../consts/const-eval/simd/insert_extract.rs | 10 +- .../const-eval/{ub-ref.rs => ub-ref-ptr.rs} | 11 + .../{ub-ref.stderr => ub-ref-ptr.stderr} | 36 +- src/test/ui/consts/const-fn-in-vec.rs | 7 + src/test/ui/consts/const-fn-in-vec.stderr | 13 + src/test/ui/consts/const-int-arithmetic.rs | 5 - .../ui/consts/control-flow/issue-50577.stderr | 5 +- src/test/ui/consts/copy-intrinsic.rs | 45 + src/test/ui/consts/copy-intrinsic.stderr | 69 + src/test/ui/{issues => consts}/issue-13837.rs | 0 .../issue-17718-references.rs | 0 .../issue-17718-references.stderr | 0 src/test/ui/{issues => consts}/issue-17718.rs | 0 src/test/ui/{issues => consts}/issue-32829.rs | 0 .../ui/{issues => consts}/issue-32829.stderr | 0 src/test/ui/{issues => consts}/issue-33537.rs | 0 .../ui/{issues => consts}/issue-3521.fixed | 0 src/test/ui/{issues => consts}/issue-3521.rs | 0 .../ui/{issues => consts}/issue-3521.stderr | 0 src/test/ui/consts/issue-51559.stderr | 2 +- src/test/ui/consts/issue-52432.stderr | 2 +- src/test/ui/consts/issue-66345.rs | 4 +- .../consts/issue-66693-panic-in-array-len.rs | 17 + .../issue-66693-panic-in-array-len.stderr | 19 + src/test/ui/consts/issue-66693.rs | 24 + src/test/ui/consts/issue-66693.stderr | 26 + src/test/ui/consts/issue-67529.rs | 2 +- src/test/ui/consts/issue-67640.rs | 2 +- src/test/ui/consts/issue-67641.rs | 2 +- src/test/ui/consts/issue-67862.rs | 2 +- src/test/ui/consts/issue-76064.rs | 4 +- src/test/ui/consts/issue-76064.stderr | 6 +- src/test/ui/consts/issue-79690.stderr | 2 +- src/test/ui/consts/miri_unleashed/drop.stderr | 2 +- .../ui/consts/miri_unleashed/ptr_arith.rs | 2 +- .../ui/consts/miri_unleashed/ptr_arith.stderr | 2 +- src/test/ui/consts/miri_unleashed/tls.stderr | 4 +- src/test/ui/consts/ptr_comparisons.rs | 4 +- src/test/ui/consts/ptr_comparisons.stderr | 4 +- .../{ => consts}/rvalue-static-promotion.rs | 0 src/test/ui/consts/trait_specialization.rs | 2 +- .../write-to-static-mut-in-static.rs | 0 .../write-to-static-mut-in-static.stderr | 0 .../cycle-projection-based-on-where-clause.rs | 24 - ...le-projection-based-on-where-clause.stderr | 16 - .../cycle-trait-supertrait-direct.stderr | 11 +- .../cycle-trait-supertrait-indirect.stderr | 18 +- ...uginfo-emit-llvm-ir-and-split-debuginfo.rs | 7 + .../deprecation/deprecation-in-staged-api.rs | 8 +- .../deprecation-in-staged-api.stderr | 10 +- src/test/ui/derives/derive-deadlock.rs | 6 + src/test/ui/derives/derive-deadlock.stderr | 10 + .../ui/derives/derive-multiple-with-packed.rs | 10 + src/test/ui/derives/derive-partial-ord.rs | 60 + src/test/ui/derives/derive-renamed.rs | 11 + ...ves-span-PartialOrd-enum-struct-variant.rs | 4 - ...span-PartialOrd-enum-struct-variant.stderr | 42 +- .../derives/derives-span-PartialOrd-enum.rs | 4 - .../derives-span-PartialOrd-enum.stderr | 42 +- .../derives/derives-span-PartialOrd-struct.rs | 4 - .../derives-span-PartialOrd-struct.stderr | 42 +- .../derives-span-PartialOrd-tuple-struct.rs | 4 - ...erives-span-PartialOrd-tuple-struct.stderr | 42 +- .../derives/deriving-meta-empty-trait-list.rs | 4 +- .../deriving-meta-empty-trait-list.stderr | 15 - src/test/ui/derives/issue-36617.rs | 3 +- src/test/ui/derives/issue-36617.stderr | 15 +- src/test/ui/dest-prop/skeptic-miscompile.rs | 2 +- src/test/ui/did_you_mean/pub-macro-rules.rs | 16 - .../ui/did_you_mean/pub-macro-rules.stderr | 8 - .../directory_ownership/macro-expanded-mod.rs | 2 +- .../macro-expanded-mod.stderr | 2 +- .../non-inline-mod-restriction.rs | 2 +- .../non-inline-mod-restriction.stderr | 2 +- src/test/ui/editions-crate-root-2015.rs | 21 + src/test/ui/editions-crate-root-2015.stderr | 28 + src/test/ui/editions-crate-root-2018.rs | 21 + src/test/ui/editions-crate-root-2018.stderr | 28 + .../edition-imports-virtual-2015-gated.stderr | 2 +- .../ui/emit-artifact-notifications.nll.stderr | 1 - ...mit-artifact-notifications.polonius.stderr | 1 - .../ui/emit-artifact-notifications.stderr | 1 - .../ui/enum/enum-discrim-too-small2.stderr | 4 + src/test/ui/error-codes/E0063.rs | 2 +- src/test/ui/error-codes/E0063.stderr | 4 +- src/test/ui/error-codes/E0618.stderr | 2 +- .../if/expr-if-panic-pass.rs} | 0 src/test/ui/expr/if/if-let.rs | 16 +- src/test/ui/expr/if/if-let.stderr | 32 +- src/test/ui/{issues => expr/if}/issue-4201.rs | 0 .../ui/{issues => expr/if}/issue-4201.stderr | 0 .../feature-gate-exhaustive-patterns.stderr | 2 +- .../feature-gate-inherent_associated_types.rs | 10 + ...ture-gate-inherent_associated_types.stderr | 12 + .../feature-gate-min_type_alias_impl_trait.rs | 50 + ...ture-gate-min_type_alias_impl_trait.stderr | 118 + .../feature-gate-pub_macro_rules.rs | 10 + .../feature-gate-pub_macro_rules.stderr | 39 + .../feature-gate-type_alias_impl_trait.rs | 57 +- .../feature-gate-type_alias_impl_trait.stderr | 144 +- .../feature-gate-unsafe_block_in_unsafe_fn.rs | 6 - ...ture-gate-unsafe_block_in_unsafe_fn.stderr | 30 - ...issue-43106-gating-of-builtin-attrs.stderr | 194 +- .../issue-43106-gating-of-derive.rs | 1 + .../issue-43106-gating-of-derive.stderr | 22 +- .../unstable-attribute-allow-issue-0.stderr | 1 + src/test/ui/fmt/format-args-capture.rs | 11 + .../cleanup-rvalue-during-if-and-while.rs | 0 .../ui/generator/auto-trait-regions.stderr | 20 +- .../generator/layout-error.full_tait.stderr | 26 + .../ui/generator/layout-error.min_tait.stderr | 40 + src/test/ui/generator/layout-error.rs | 13 +- src/test/ui/generator/layout-error.stderr | 9 - ...ata-sufficient-for-layout.full_tait.stderr | 25 + ...data-sufficient-for-layout.min_tait.stderr | 24 + .../metadata-sufficient-for-layout.rs | 12 +- .../print/generator-print-verbose-1.stderr | 10 +- .../type-mismatch-signature-deduction.stderr | 10 +- .../yield-outside-generator-issue-78653.rs | 7 + ...yield-outside-generator-issue-78653.stderr | 21 + ...nst-generics-gat-in-trait-return-type-1.rs | 22 + ...nst-generics-gat-in-trait-return-type-2.rs | 22 + ...nst-generics-gat-in-trait-return-type-3.rs | 27 + .../constraint-assoc-type-suggestion.rs | 17 + .../constraint-assoc-type-suggestion.stderr | 27 + .../generic-associated-type-bounds.rs | 35 + .../generic-associated-types/issue-76535.rs | 6 +- .../issue-76535.stderr | 39 +- .../generic-associated-types/issue-79422.rs | 5 +- .../issue-79422.stderr | 40 +- .../issue-81712-cyclic-traits.rs | 21 + .../issue-81712-cyclic-traits.stderr | 19 + .../method-unsatified-assoc-type-predicate.rs | 35 + ...hod-unsatified-assoc-type-predicate.stderr | 29 + .../projection-type-lifetime-mismatch.rs | 36 + .../projection-type-lifetime-mismatch.stderr | 27 + .../unsatified-item-lifetime-bound.rs | 28 + .../unsatified-item-lifetime-bound.stderr | 50 + src/test/ui/generics/issue-32498.rs | 16 + src/test/ui/generics/wrong-number-of-args.rs | 2 +- .../ui/generics/wrong-number-of-args.stderr | 2 +- src/test/ui/hrtb/due-to-where-clause.stderr | 3 - .../ui/hrtb/hrtb-cache-issue-54302.stderr | 3 - src/test/ui/hrtb/hrtb-conflate-regions.stderr | 11 +- ...b-exists-forall-trait-contravariant.stderr | 5 +- .../hrtb-exists-forall-trait-invariant.stderr | 5 +- src/test/ui/hrtb/hrtb-just-for-static.stderr | 20 +- .../hrtb/hrtb-perfect-forwarding.nll.stderr | 38 +- src/test/ui/hrtb/hrtb-perfect-forwarding.rs | 39 +- .../ui/hrtb/hrtb-perfect-forwarding.stderr | 41 +- src/test/ui/hrtb/issue-46989.stderr | 3 - .../ui/{issues => hygiene}/issue-40847.rs | 0 ...-trait-type-generic-trait.full_tait.stderr | 11 + ...ssociated-impl-trait-type-generic-trait.rs | 5 +- ...d-impl-trait-type-trivial.full_tait.stderr | 11 + .../associated-impl-trait-type-trivial.rs | 5 +- ...ssociated-impl-trait-type.full_tait.stderr | 11 + .../impl-trait/associated-impl-trait-type.rs | 5 +- .../ui/impl-trait/auto-trait.full_tait.stderr | 21 + ...rait.stderr => auto-trait.min_tait.stderr} | 2 +- src/test/ui/impl-trait/auto-trait.rs | 5 +- .../ui/impl-trait/bound-normalization-pass.rs | 2 +- src/test/ui/impl-trait/impl-trait-in-macro.rs | 20 + .../ui/impl-trait/impl-trait-in-macro.stderr | 20 + .../impl-trait/issue-55872-1.full_tait.stderr | 57 + ...1.stderr => issue-55872-1.min_tait.stderr} | 8 +- src/test/ui/impl-trait/issue-55872-1.rs | 5 +- .../impl-trait/issue-55872-2.full_tait.stderr | 28 + ...2.stderr => issue-55872-2.min_tait.stderr} | 4 +- src/test/ui/impl-trait/issue-55872-2.rs | 7 +- .../impl-trait/issue-55872.full_tait.stderr | 21 + ...872.stderr => issue-55872.min_tait.stderr} | 2 +- src/test/ui/impl-trait/issue-55872.rs | 5 +- .../issues/issue-53457.full_tait.stderr | 11 + src/test/ui/impl-trait/issues/issue-53457.rs | 5 +- ...77.stderr => issue-70877.full_tait.stderr} | 2 +- .../issues/issue-70877.min_tait.stderr | 15 + src/test/ui/impl-trait/issues/issue-70877.rs | 4 +- .../issues/issue-78722.full_tait.stderr | 35 + ...722.stderr => issue-78722.min_tait.stderr} | 6 +- src/test/ui/impl-trait/issues/issue-78722.rs | 5 +- .../error-handling-2.full_tait.stderr | 24 + ...tderr => error-handling-2.min_tait.stderr} | 6 +- .../multiple-lifetimes/error-handling-2.rs | 5 +- .../error-handling.full_tait.stderr | 24 + ....stderr => error-handling.min_tait.stderr} | 2 +- .../multiple-lifetimes/error-handling.rs | 5 +- ...nds-pick-original-type-alias-impl-trait.rs | 3 +- .../negative-reasoning.full_tait.stderr | 23 + ...err => negative-reasoning.min_tait.stderr} | 2 +- src/test/ui/impl-trait/negative-reasoning.rs | 5 +- src/test/ui/impl-trait/trait_type.stderr | 8 +- .../type-alias-generic-param.full_tait.stderr | 11 + .../ui/impl-trait/type-alias-generic-param.rs | 5 +- ...ias-impl-trait-in-fn-body.full_tait.stderr | 11 + .../type-alias-impl-trait-in-fn-body.rs | 5 +- .../impl-trait/universal-two-impl-traits.rs | 9 +- src/test/ui/impl-trait/where-allowed.stderr | 6 +- ...e-extern-crate-restricted-shadowing.stderr | 6 +- .../auxiliary/inference_unstable_iterator.rs | 6 +- .../auxiliary/inference_unstable_itertools.rs | 6 +- .../cannot-infer-closure-circular.stderr | 4 +- .../ui/inference/cannot-infer-closure.stderr | 6 +- .../cannot-infer-partial-try-return.stderr | 6 +- src/test/ui/inference/inference_unstable.rs | 7 +- .../ui/inference/inference_unstable.stderr | 16 +- src/test/ui/inference/issue-72616.stderr | 2 +- .../ui/invalid/invalid-no-sanitize.stderr | 2 +- ...lid-rustc_args_required_const-arguments.rs | 0 ...rustc_args_required_const-arguments.stderr | 0 ...d-rustc_legacy_const_generics-arguments.rs | 38 + ...stc_legacy_const_generics-arguments.stderr | 87 + ...invalid_rustc_layout_scalar_valid_range.rs | 30 + ...lid_rustc_layout_scalar_valid_range.stderr | 37 + src/test/ui/issues/issue-10969.stderr | 4 +- src/test/ui/issues/issue-11844.stderr | 4 +- src/test/ui/issues/issue-12511.stderr | 16 +- src/test/ui/issues/issue-12552.stderr | 12 +- src/test/ui/issues/issue-13466.rs | 8 +- src/test/ui/issues/issue-13466.stderr | 8 +- src/test/ui/issues/issue-16683.stderr | 6 +- src/test/ui/issues/issue-17740.stderr | 12 +- src/test/ui/issues/issue-17758.stderr | 6 +- src/test/ui/issues/issue-17800.stderr | 7 +- src/test/ui/issues/issue-17905-2.stderr | 12 +- src/test/ui/issues/issue-18919.stderr | 2 +- src/test/ui/issues/issue-19991.rs | 2 +- src/test/ui/issues/issue-20772.stderr | 6 +- src/test/ui/issues/issue-20825.stderr | 6 +- .../ui/issues/issue-20831-debruijn.stderr | 6 +- src/test/ui/issues/issue-21332.rs | 2 +- src/test/ui/issues/issue-21332.stderr | 4 +- src/test/ui/issues/issue-21701.stderr | 2 +- src/test/ui/issues/issue-22468.stderr | 2 +- src/test/ui/issues/issue-22673.rs | 5 +- src/test/ui/issues/issue-22673.stderr | 16 - src/test/ui/issues/issue-23281.stderr | 2 +- src/test/ui/issues/issue-23458.rs | 2 +- src/test/ui/issues/issue-26237.stderr | 2 +- src/test/ui/issues/issue-2633-2.rs | 14 - src/test/ui/issues/issue-2633.rs | 31 - src/test/ui/issues/issue-27033.stderr | 6 +- src/test/ui/issues/issue-27942.stderr | 12 +- src/test/ui/issues/issue-29821.rs | 19 + src/test/ui/issues/issue-34229.rs | 4 - src/test/ui/issues/issue-34229.stderr | 42 +- src/test/ui/issues/issue-3680.rs | 4 +- src/test/ui/issues/issue-3680.stderr | 4 +- src/test/ui/issues/issue-40827.stderr | 12 +- src/test/ui/issues/issue-4736.stderr | 2 +- src/test/ui/issues/issue-49040.stderr | 6 +- src/test/ui/issues/issue-49934-errors.rs | 9 +- src/test/ui/issues/issue-49934-errors.stderr | 13 +- src/test/ui/issues/issue-49934.rs | 17 +- src/test/ui/issues/issue-49934.stderr | 31 +- .../result-as_deref.stderr | 2 +- .../result-as_deref_mut.stderr | 4 +- src/test/ui/issues/issue-50411.rs | 2 +- .../auxiliary/lib.rs | 2 +- ...1632-try-desugar-incompatible-types.stderr | 4 +- src/test/ui/issues/issue-54302-cases.stderr | 36 +- src/test/ui/issues/issue-54302.stderr | 3 - src/test/ui/issues/issue-55731.stderr | 9 +- src/test/ui/issues/issue-57843.nll.stderr | 2 +- src/test/ui/issues/issue-57843.rs | 6 +- src/test/ui/issues/issue-57843.stderr | 16 +- src/test/ui/issues/issue-59488.rs | 1 - src/test/ui/issues/issue-59488.stderr | 18 +- .../ui/issues/issue-60662.full_tait.stderr | 11 + ...62.stdout => issue-60662.full_tait.stdout} | 4 +- .../ui/issues/issue-60662.min_tait.stdout | 15 + src/test/ui/issues/issue-60662.rs | 5 +- src/test/ui/issues/issue-6458-4.stderr | 4 +- ...70724-add_type_neq_err_label-unwrap.stderr | 7 +- src/test/ui/issues/issue-74086.stderr | 5 +- src/test/ui/issues/issue-75307.stderr | 4 +- src/test/ui/issues/issue-77002.rs | 2 +- src/test/ui/issues/issue-78622.stderr | 2 +- src/test/ui/issues/issue-79593.rs | 2 +- src/test/ui/issues/issue-79593.stderr | 4 +- src/test/ui/issues/issue-79744.rs | 13 + src/test/ui/issues/issue-79744.stderr | 12 + src/test/ui/issues/issue-80607.stderr | 2 +- src/test/ui/issues/issue-81584.fixed | 8 + src/test/ui/issues/issue-81584.rs | 8 + src/test/ui/issues/issue-81584.stderr | 14 + src/test/ui/issues/issue-81885.rs | 10 + src/test/ui/issues/issue-81885.stderr | 15 + src/test/ui/issues/issue-81918.rs | 11 + .../ui/issues/issue-82833-slice-miscompile.rs | 17 + .../ui/issues/issue-82859-slice-miscompile.rs | 19 + src/test/ui/issues/issue-82869.rs | 23 + src/test/ui/issues/issue-82869.stderr | 24 + src/test/ui/layout/debug.rs | 2 +- src/test/ui/layout/hexagon-enum.rs | 34 + src/test/ui/layout/hexagon-enum.stderr | 442 + src/test/ui/legacy-const-generics-bad.rs | 16 + src/test/ui/legacy-const-generics-bad.stderr | 20 + src/test/ui/legacy-const-generics.rs | 18 + src/test/ui/lifetimes/issue-79187.rs | 2 +- src/test/ui/lifetimes/issue-79187.stderr | 19 +- .../lifetime-elision-return-type-trait.stderr | 4 +- ...ifetime-used-in-debug-macro-issue-70152.rs | 16 + ...ime-used-in-debug-macro-issue-70152.stderr | 40 + .../ui/{ => limits}/huge-array-simple-32.rs | 0 .../{ => limits}/huge-array-simple-32.stderr | 0 .../ui/{ => limits}/huge-array-simple-64.rs | 0 .../{ => limits}/huge-array-simple-64.stderr | 0 src/test/ui/{ => limits}/huge-array.rs | 0 src/test/ui/{ => limits}/huge-array.stderr | 0 src/test/ui/{ => limits}/huge-enum.rs | 0 src/test/ui/{ => limits}/huge-enum.stderr | 0 src/test/ui/{ => limits}/huge-struct.rs | 0 src/test/ui/{ => limits}/huge-struct.stderr | 0 .../ui/{issues => limits}/issue-15919-32.rs | 0 .../{issues => limits}/issue-15919-32.stderr | 0 .../ui/{issues => limits}/issue-15919-64.rs | 0 .../{issues => limits}/issue-15919-64.stderr | 0 src/test/ui/{issues => limits}/issue-17913.rs | 0 .../ui/{issues => limits}/issue-17913.stderr | 0 src/test/ui/{consts => limits}/issue-55878.rs | 0 .../ui/{consts => limits}/issue-55878.stderr | 0 src/test/ui/{consts => limits}/issue-56762.rs | 0 .../ui/{consts => limits}/issue-56762.stderr | 0 .../issue-69485-var-size-diffs-too-large.rs | 0 ...ssue-69485-var-size-diffs-too-large.stderr | 0 src/test/ui/limits/issue-75158-64.rs | 16 + src/test/ui/limits/issue-75158-64.stderr | 4 + .../lint/auxiliary/lint_stability_fields.rs | 23 +- .../unaligned_references_external_crate.rs | 28 + src/test/ui/lint/bare-trait-objects-path.rs | 18 + .../ui/lint/bare-trait-objects-path.stderr | 29 + src/test/ui/lint/clashing-extern-fn.rs | 34 + src/test/ui/lint/clashing-extern-fn.stderr | 77 +- .../ui/lint/dead-code/write-only-field.rs | 69 + .../ui/lint/dead-code/write-only-field.stderr | 44 + ...e-trait-and-foreign-items.full_tait.stderr | 81 + ...e-trait-and-foreign-items.min_tait.stderr} | 18 +- .../ui/lint/inline-trait-and-foreign-items.rs | 5 +- .../issue-31924-non-snake-ffi.rs | 0 ...0-unused-variable-in-struct-pattern.stderr | 12 +- .../lint/issue-81314-unused-span-ident.fixed | 12 + .../ui/lint/issue-81314-unused-span-ident.rs | 12 + .../lint/issue-81314-unused-span-ident.stderr | 21 + .../lint/lint-ctypes-73249-2.full_tait.stderr | 24 + ...rr => lint-ctypes-73249-2.min_tait.stderr} | 4 +- src/test/ui/lint/lint-ctypes-73249-2.rs | 5 +- .../lint/lint-ctypes-73249-3.full_tait.stderr | 24 + ...rr => lint-ctypes-73249-3.min_tait.stderr} | 4 +- src/test/ui/lint/lint-ctypes-73249-3.rs | 5 +- .../lint/lint-ctypes-73249-5.full_tait.stderr | 24 + ...rr => lint-ctypes-73249-5.min_tait.stderr} | 4 +- src/test/ui/lint/lint-ctypes-73249-5.rs | 5 +- .../lint/lint-ctypes-73251-1.full_tait.stderr | 24 + ...rr => lint-ctypes-73251-1.min_tait.stderr} | 4 +- src/test/ui/lint/lint-ctypes-73251-1.rs | 5 +- .../lint/lint-ctypes-73251-2.full_tait.stderr | 24 + ...rr => lint-ctypes-73251-2.min_tait.stderr} | 4 +- src/test/ui/lint/lint-ctypes-73251-2.rs | 5 +- .../lint/lint-ctypes-73251.full_tait.stderr | 11 + src/test/ui/lint/lint-ctypes-73251.rs | 5 +- src/test/ui/lint/lint-ctypes-enum.stderr | 2 +- src/test/ui/lint/lint-ctypes.rs | 6 + src/test/ui/lint/lint-ctypes.stderr | 76 +- .../lint-expr-stmt-attrs-for-early-lints.rs | 0 .../lint/lint-stability-fields-deprecated.rs | 11 +- .../lint-stability-fields-deprecated.stderr | 126 +- src/test/ui/lint/lint-stability-fields.rs | 20 +- src/test/ui/lint/lint-stability-fields.stderr | 86 +- src/test/ui/lint/lint-type-limits2.stderr | 1 + src/test/ui/lint/lint-type-limits3.stderr | 1 + src/test/ui/lint/lint-type-overflow.stderr | 16 + src/test/ui/lint/lint-type-overflow2.stderr | 1 + src/test/ui/lint/lint-unsafe-code.rs | 18 +- src/test/ui/lint/lint-unsafe-code.stderr | 115 +- src/test/ui/lint/must_use-tuple.rs | 10 +- src/test/ui/lint/must_use-tuple.stderr | 10 +- src/test/ui/lint/noop-method-call.rs | 54 + src/test/ui/lint/noop-method-call.stderr | 39 + .../opaque-ty-ffi-unsafe.full_tait.stderr | 24 + ...r => opaque-ty-ffi-unsafe.min_tait.stderr} | 4 +- src/test/ui/lint/opaque-ty-ffi-unsafe.rs | 5 +- src/test/ui/lint/recommend-literal.rs | 35 + src/test/ui/lint/recommend-literal.stderr | 72 + src/test/ui/lint/register-tool-lint.rs | 11 + src/test/ui/lint/register-tool-lint.stderr | 27 + src/test/ui/lint/renamed-lints-still-apply.rs | 9 + .../ui/lint/renamed-lints-still-apply.stderr | 28 + src/test/ui/lint/rustdoc-group.rs | 5 + src/test/ui/lint/rustdoc-group.stderr | 10 + src/test/ui/lint/rustdoc-renamed.rs | 15 + src/test/ui/lint/rustdoc-renamed.stderr | 14 + src/test/ui/lint/type-overflow.rs | 12 +- src/test/ui/lint/type-overflow.stderr | 28 +- .../unaligned_references_external_macro.rs | 14 + ...unaligned_references_external_macro.stderr | 26 + .../lint/unused_variables-issue-82488.fixed | 16 + .../ui/lint/unused_variables-issue-82488.rs | 16 + .../lint/unused_variables-issue-82488.stderr | 14 + src/test/ui/liveness/liveness-consts.stderr | 4 +- src/test/ui/liveness/liveness-dead.stderr | 8 +- src/test/ui/liveness/liveness-unused.stderr | 8 +- src/test/ui/loops/issue-82916.rs | 10 + src/test/ui/loops/issue-82916.stderr | 23 + src/test/ui/macros/assert-eq-macro-msg.rs | 9 + src/test/ui/macros/assert-format-lazy.rs | 12 + .../ui/macros/assert-matches-macro-msg.rs | 11 + src/test/ui/macros/assert-ne-macro-msg.rs | 9 + .../ui/macros/builtin-std-paths-fail.stderr | 44 +- src/test/ui/macros/empty-trailing-stmt.stderr | 5 + src/test/ui/{ => macros}/html-literals.rs | 0 .../macro-export-on-modularized-macros.rs | 11 + .../macro-export-on-modularized-macros.stderr | 14 + .../ui/macros/must-use-in-macro-55516.stderr | 2 +- src/test/ui/macros/pub-macro-rules-fail.rs | 28 + .../ui/macros/pub-macro-rules-fail.stderr | 48 + src/test/ui/macros/pub-macro-rules.rs | 20 + .../issue-69341-malformed-derive-inert.rs | 5 +- .../issue-69341-malformed-derive-inert.stderr | 21 +- .../malformed/malformed-derive-entry.stderr | 2 +- .../malformed/malformed-special-attrs.stderr | 4 +- src/test/ui/mir/auxiliary/issue_76375_aux.rs | 2 +- src/test/ui/mir/issue-66851.rs | 2 +- .../ui/mir/issue-67639-normalization-ice.rs | 2 +- .../ui/mir/issue-67710-inline-projection.rs | 2 +- src/test/ui/mir/issue-68841.rs | 2 +- .../ui/mir/issue-71793-inline-args-storage.rs | 2 +- src/test/ui/mir/issue-75053.full_tait.stderr | 21 + .../ui/mir/issue-75053.in_bindings.stderr | 24 + src/test/ui/mir/issue-75053.min_tait.stderr | 12 + src/test/ui/mir/issue-75053.rs | 13 +- src/test/ui/mir/issue-76248.rs | 2 +- src/test/ui/mir/issue-76375.rs | 2 +- .../ui/mir/issue-76740-copy-propagation.rs | 2 +- src/test/ui/mir/issue-77911.rs | 2 +- src/test/ui/mir/issue-78496.rs | 2 +- src/test/ui/mir/issue-80742.stderr | 2 +- src/test/ui/mir/issue66339.rs | 2 +- .../array-clone-with-generic-size.rs | 2 +- .../ui/mir/mir-inlining/ice-issue-45493.rs | 2 +- .../ui/mir/mir-inlining/ice-issue-45885.rs | 2 +- .../ui/mir/mir-inlining/ice-issue-68347.rs | 2 +- .../ui/mir/mir-inlining/ice-issue-77306-1.rs | 2 +- .../ui/mir/mir-inlining/ice-issue-77306-2.rs | 2 +- .../ui/mir/mir-inlining/ice-issue-77564.rs | 2 +- .../inline-instrument-coverage-fail.rs | 21 - .../inline-instrument-coverage-fail.stderr | 2 - .../no-trait-method-issue-40473.rs | 2 +- .../mir-inlining/var-debuginfo-issue-67586.rs | 2 +- .../mir/mir_const_prop_tuple_field_reorder.rs | 2 +- .../ui/mir/ssa-analysis-regression-50041.rs | 2 +- src/test/ui/mismatched_types/abridged.stderr | 10 +- src/test/ui/mismatched_types/binops.rs | 2 +- src/test/ui/mismatched_types/binops.stderr | 6 +- .../closure-arg-type-mismatch.rs | 4 +- .../closure-arg-type-mismatch.stderr | 36 +- .../issue-75361-mismatched-impl.stderr | 2 +- .../method-help-unsatisfied-bound.stderr | 4 +- .../missing-fields-in-struct-pattern.stderr | 7 +- src/test/ui/modules/path-no-file-name.rs | 7 + src/test/ui/modules/path-no-file-name.stderr | 8 + src/test/ui/nll/issue-52742.stderr | 6 +- src/test/ui/{issues => nll}/issue-52992.rs | 0 src/test/ui/nll/issue-54556-niconii.stderr | 2 +- src/test/ui/nll/issue-55394.stderr | 6 +- .../ui/nll/type-alias-free-regions.stderr | 12 +- src/test/ui/non-fmt-panic.rs | 11 + src/test/ui/non-fmt-panic.stderr | 69 +- src/test/ui/numeric/numeric-fields.stderr | 2 +- src/test/ui/or-patterns/already-bound-name.rs | 10 +- .../ui/or-patterns/already-bound-name.stderr | 66 +- .../ui/or-patterns/consistent-bindings.rs | 10 +- src/test/ui/or-patterns/const-fn.rs | 10 +- .../exhaustiveness-unreachable-pattern.rs | 23 +- .../exhaustiveness-unreachable-pattern.stderr | 56 +- .../feature-gate-or_patterns-leading-let.rs | 1 + ...eature-gate-or_patterns-leading-let.stderr | 8 +- .../or-patterns/feature-gate-or_patterns.rs | 2 + .../feature-gate-or_patterns.stderr | 44 +- .../ui/or-patterns/fn-param-wrap-parens.fixed | 2 +- .../ui/or-patterns/fn-param-wrap-parens.rs | 2 +- .../or-patterns/fn-param-wrap-parens.stderr | 4 +- src/test/ui/or-patterns/inconsistent-modes.rs | 12 +- .../ui/or-patterns/inconsistent-modes.stderr | 82 +- ...ve-been-expanded-earlier-non-exhaustive.rs | 2 +- ...een-expanded-earlier-non-exhaustive.stderr | 10 +- ...69875-should-have-been-expanded-earlier.rs | 2 +- src/test/ui/or-patterns/let-pattern.rs | 2 +- .../mismatched-bindings-async-fn.rs | 2 +- .../mismatched-bindings-async-fn.stderr | 20 +- src/test/ui/or-patterns/missing-bindings.rs | 20 +- .../ui/or-patterns/missing-bindings.stderr | 172 +- .../ui/or-patterns/multiple-pattern-typo.rs | 14 +- .../or-patterns/multiple-pattern-typo.stderr | 14 +- .../nested-undelimited-precedence.rs | 46 + .../nested-undelimited-precedence.stderr | 86 + .../or-patterns-binding-type-mismatch.rs | 4 +- .../or-patterns-binding-type-mismatch.stderr | 36 +- .../or-patterns-default-binding-modes.rs | 8 +- .../or-patterns/or-patterns-syntactic-fail.rs | 30 +- .../or-patterns-syntactic-fail.stderr | 97 +- .../or-patterns/or-patterns-syntactic-pass.rs | 22 +- .../ui/or-patterns/remove-leading-vert.fixed | 29 +- .../ui/or-patterns/remove-leading-vert.rs | 29 +- .../ui/or-patterns/remove-leading-vert.stderr | 78 +- src/test/ui/parser/circular_modules_main.rs | 6 +- .../ui/parser/circular_modules_main.stderr | 18 +- src/test/ui/{ => parser}/dotdotdot-expr.rs | 0 .../ui/{ => parser}/dotdotdot-expr.stderr | 0 src/test/ui/parser/duplicate-visibility.rs | 5 +- .../ui/parser/duplicate-visibility.stderr | 25 +- src/test/ui/parser/expr-as-stmt-2.stderr | 14 +- src/test/ui/parser/expr-as-stmt.stderr | 20 + .../ui/parser/fn-header-semantic-fail.stderr | 6 +- .../impl-item-type-no-body-semantic-fail.rs | 8 +- ...mpl-item-type-no-body-semantic-fail.stderr | 22 +- .../ui/{issues => parser}/issue-20616-3.rs | 0 .../{issues => parser}/issue-20616-3.stderr | 0 src/test/ui/{issues => parser}/issue-44406.rs | 0 .../ui/{issues => parser}/issue-44406.stderr | 0 src/test/ui/parser/issue-52496.rs | 2 +- src/test/ui/parser/issue-52496.stderr | 4 +- src/test/ui/parser/issue-66473.stderr | Bin 2660 -> 5260 bytes src/test/ui/parser/issue-68629.stderr | Bin 1441 -> 1831 bytes src/test/ui/parser/issue-68730.stderr | Bin 966 -> 1226 bytes src/test/ui/{issues => parser}/issue-7222.rs | 0 src/test/ui/parser/issue-76437-async.rs | 7 + src/test/ui/parser/issue-76437-async.stderr | 11 + .../parser/issue-76437-const-async-unsafe.rs | 7 + .../issue-76437-const-async-unsafe.stderr | 11 + src/test/ui/parser/issue-76437-const-async.rs | 7 + .../ui/parser/issue-76437-const-async.stderr | 11 + src/test/ui/parser/issue-76437-const.rs | 7 + src/test/ui/parser/issue-76437-const.stderr | 11 + .../ui/parser/issue-76437-pub-crate-unsafe.rs | 7 + .../issue-76437-pub-crate-unsafe.stderr | 11 + src/test/ui/parser/issue-76437-unsafe.rs | 7 + src/test/ui/parser/issue-76437-unsafe.stderr | 11 + src/test/ui/parser/issue-8537.stderr | 2 +- .../item-free-const-no-body-semantic-fail.rs | 1 - ...em-free-const-no-body-semantic-fail.stderr | 8 +- .../item-free-static-no-body-semantic-fail.rs | 2 - ...m-free-static-no-body-semantic-fail.stderr | 18 +- src/test/ui/parser/let-binop.stderr | 6 + .../lex-bare-cr-nondoc-comment.rs | 0 ...line-endings-string-literal-doc-comment.rs | 0 src/test/ui/parser/lifetime-in-pattern.stderr | 14 + .../ui/parser/match-arm-without-braces.rs | 87 + .../ui/parser/match-arm-without-braces.stderr | 135 + .../old-suffixes-are-really-forbidden.rs | 0 .../old-suffixes-are-really-forbidden.stderr | 0 src/test/ui/parser/parse-error-correct.stderr | 2 +- .../ui/parser/recover-from-bad-variant.stderr | 7 +- .../parser/struct-field-numeric-shorthand.rs | 2 +- .../struct-field-numeric-shorthand.stderr | 4 +- .../struct-literal-variant-in-if.rs | 0 .../struct-literal-variant-in-if.stderr | 2 +- .../parser/unclosed-delimiter-in-dep.stderr | 4 +- src/test/ui/parser/utf16-be-without-bom.rs | Bin 0 -> 125 bytes .../ui/parser/utf16-be-without-bom.stderr | Bin 0 -> 3537 bytes src/test/ui/parser/utf16-le-without-bom.rs | Bin 0 -> 126 bytes .../ui/parser/utf16-le-without-bom.stderr | Bin 0 -> 3500 bytes src/test/ui/partialeq_help.stderr | 4 + .../borrowck-move-and-move.stderr | 4 +- .../borrowck-pat-ref-mut-and-ref.stderr | 4 +- src/test/ui/pattern/issue-82290.rs | 7 + src/test/ui/pattern/issue-82290.stderr | 19 + .../pat-struct-field-expr-has-type.stderr | 4 +- .../ui/pattern/pat-type-err-let-stmt.stderr | 12 +- .../deny-irrefutable-let-patterns.rs | 12 +- .../deny-irrefutable-let-patterns.stderr | 26 +- src/test/ui/pattern/usefulness/issue-72377.rs | 17 + .../ui/pattern/usefulness/issue-72377.stderr | 12 + .../issue-80501-or-pat-and-macro.rs | 27 + .../non-exhaustive-match-nested.stderr | 2 +- .../polymorphization/promoted-function-3.rs | 2 +- .../associated-item-privacy-inherent.stderr | 2 +- ...sue-46209-private-enum-variant-reexport.rs | 11 +- ...46209-private-enum-variant-reexport.stderr | 51 +- ...rivate-in-public-assoc-ty.full_tait.stderr | 77 + ...rivate-in-public-assoc-ty.min_tait.stderr} | 14 +- .../ui/privacy/private-in-public-assoc-ty.rs | 5 +- ...lic-type-alias-impl-trait.full_tait.stderr | 11 + ...private-in-public-type-alias-impl-trait.rs | 5 +- .../ui/privacy/private-inferred-type.stderr | 2 +- .../ui/privacy/private-variant-reexport.rs | 9 +- .../privacy/private-variant-reexport.stderr | 37 +- .../ui/proc-macro/ambiguous-builtin-attrs.rs | 2 +- .../proc-macro/ambiguous-builtin-attrs.stderr | 10 +- src/test/ui/proc-macro/attr-complex-fn.rs | 26 + src/test/ui/proc-macro/attr-complex-fn.stdout | 171 + .../attribute-after-derive-feature-gate.rs | 37 + ...attribute-after-derive-feature-gate.stderr | 30 + .../ui/proc-macro/attribute-after-derive.rs | 30 + .../proc-macro/attribute-after-derive.stdout | 148 + .../proc-macro/attribute-order-restricted.rs | 14 - .../attribute-order-restricted.stderr | 8 - .../ui/proc-macro/auxiliary/test-macros.rs | 36 +- src/test/ui/proc-macro/cfg-eval-fail.rs | 9 + src/test/ui/proc-macro/cfg-eval-fail.stderr | 20 + src/test/ui/proc-macro/cfg-eval.rs | 32 + src/test/ui/proc-macro/cfg-eval.stdout | 135 + .../proc-macro/derive-helper-legacy-limits.rs | 21 + .../derive-helper-legacy-limits.stderr | 8 + .../derive-helper-legacy-spurious.rs | 12 + .../derive-helper-legacy-spurious.stderr | 22 + .../ui/proc-macro/derive-helper-shadowing.rs | 2 + .../proc-macro/derive-helper-shadowing.stderr | 27 +- .../ui/proc-macro/derive-helper-vs-legacy.rs | 12 + .../proc-macro/derive-multiple-with-packed.rs | 11 + src/test/ui/proc-macro/expand-to-derive.rs | 34 + .../ui/proc-macro/expand-to-derive.stdout | 109 + ...-hack.rs => pin-project-internal-0.4.0.rs} | 4 + .../group-compat-hack/group-compat-hack.rs | 14 +- .../group-compat-hack.stderr | 136 + .../group-compat-hack.stdout | 18 +- .../helper-attr-blocked-by-import-ambig.rs | 4 +- ...helper-attr-blocked-by-import-ambig.stderr | 19 +- .../ui/proc-macro/inert-attribute-order.rs | 23 + .../proc-macro/inert-attribute-order.stdout | 7 + .../proc-macro/inner-attr-non-inline-mod.rs | 18 + .../inner-attr-non-inline-mod.stderr | 40 + .../inner-attr-non-inline-mod.stdout | 76 + src/test/ui/proc-macro/inner-attrs.rs | 47 + src/test/ui/proc-macro/inner-attrs.stdout | 520 + src/test/ui/proc-macro/issue-37788.stderr | 2 +- .../issue-73933-procedural-masquerade.rs | 13 + .../issue-73933-procedural-masquerade.stderr | 25 + .../issue-73933-procedural-masquerade.stdout | 22 + .../ui/proc-macro/issue-75930-derive-cfg.rs | 10 +- .../proc-macro/issue-75930-derive-cfg.stderr | 15 + .../proc-macro/issue-75930-derive-cfg.stdout | 847 +- .../ui/proc-macro/macro-rules-derive-cfg.rs | 31 + .../proc-macro/macro-rules-derive-cfg.stdout | 176 + .../ui/proc-macro/meta-macro-hygiene.stdout | 2 +- src/test/ui/proc-macro/module_with_attrs.rs | 4 + src/test/ui/proc-macro/nested-derive-cfg.rs | 23 + .../ui/proc-macro/nested-derive-cfg.stdout | 94 + .../nonterminal-token-hygiene.stdout | 2 +- .../ui/proc-macro/proc-macro-attributes.rs | 8 + .../proc-macro/proc-macro-attributes.stderr | 67 +- .../ui/proc-macro/reserved-macro-names.rs | 6 - .../ui/proc-macro/reserved-macro-names.stderr | 8 +- src/test/ui/proc-macro/weird-braces.rs | 23 + src/test/ui/proc-macro/weird-braces.stdout | 524 + .../ui/pub/pub-reexport-priv-extern-crate.rs | 8 +- .../pub/pub-reexport-priv-extern-crate.stderr | 39 +- src/test/ui/range/range_traits-1.rs | 24 - src/test/ui/range/range_traits-1.stderr | 262 +- src/test/ui/range_inclusive_gate.rs | 14 - ...-38591-non-regular-dropck-recursion.stderr | 4 +- ...recursive-types-are-not-uninhabited.stderr | 2 +- src/test/ui/regions/issue-28848.stderr | 2 +- src/test/ui/{issues => regions}/issue-6157.rs | 0 ...fn-subtyping-return-static-fail.nll.stderr | 0 ...regions-fn-subtyping-return-static-fail.rs | 0 ...ons-fn-subtyping-return-static-fail.stderr | 0 .../regions-infer-paramd-indirect.stderr | 6 +- src/test/ui/{issues => resolve}/issue-2330.rs | 0 .../ui/{issues => resolve}/issue-2330.stderr | 0 ...0736-async-fn-no-body-def-collector.stderr | 3 +- src/test/ui/resolve/raw-ident-in-path.rs | 2 +- src/test/ui/resolve/raw-ident-in-path.stderr | 4 +- .../issue-82612-return-mutable-reference.rs | 24 + ...ssue-82612-return-mutable-reference.stderr | 28 + src/test/ui/return/return-type.stderr | 2 +- .../return/tail-expr-as-potential-return.rs | 10 + .../tail-expr-as-potential-return.stderr | 19 + .../termination-trait-test-wrong-type.stderr | 4 +- .../caller-location-intrinsic.rs | 2 +- .../const-caller-location.rs | 2 +- .../intrinsic-wrapper.rs | 2 +- src/test/ui/rfc-2091-track-caller/pass.rs | 2 +- .../std-panic-locations.rs | 2 +- .../track-caller-attribute.rs | 2 +- .../tracked-fn-ptr-with-arg.rs | 2 +- .../rfc-2091-track-caller/tracked-fn-ptr.rs | 2 +- .../non-existent-2.rs | 2 +- .../non-existent-2.stderr | 4 +- .../rfc-2294-if-let-guard/feature-gate.stderr | 66 +- .../ui/rfc-2294-if-let-guard/typeck.stderr | 4 +- src/test/ui/rfc-2294-if-let-guard/warns.rs | 2 +- .../ui/rfc-2294-if-let-guard/warns.stderr | 4 +- .../ast-pretty-check.stdout | 2 +- .../disallowed-positions.stderr | 168 +- .../ui/rfc-2497-if-let-chains/feature-gate.rs | 6 +- .../feature-gate.stderr | 155 +- src/test/ui/rfc1623.rs | 2 +- src/test/ui/rfc1623.stderr | 9 +- .../emit-artifact-notifications.nll.stderr | 1 + ...mit-artifact-notifications.polonius.stderr | 1 + .../emit-artifact-notifications.rs | 0 .../rmeta/emit-artifact-notifications.stderr | 1 + src/test/ui/{ => rmeta}/emit-metadata-obj.rs | 0 src/test/ui/rustdoc/README.md | 3 + src/test/ui/{ => rustdoc}/cfg-rustdoc.rs | 0 src/test/ui/{ => rustdoc}/cfg-rustdoc.stderr | 0 .../check-doc-alias-attr-location.rs | 0 .../check-doc-alias-attr-location.stderr | 0 .../ui/{ => rustdoc}/check-doc-alias-attr.rs | 14 +- .../ui/rustdoc/check-doc-alias-attr.stderr | 108 + .../ui/{ => rustdoc}/doc-alias-crate-level.rs | 0 .../doc-alias-crate-level.stderr | 2 +- .../ui/{ => rustdoc}/doc-alias-same-name.rs | 0 .../{ => rustdoc}/doc-alias-same-name.stderr | 0 src/test/ui/{ => rustdoc}/doc_keyword.rs | 0 src/test/ui/{ => rustdoc}/doc_keyword.stderr | 2 +- .../{ => rustdoc}/unterminated-doc-comment.rs | 0 .../unterminated-doc-comment.stderr | 0 src/test/ui/sanitize/hwaddress.rs | 19 + .../issue-68621.full_tait.stderr | 17 + ...621.stderr => issue-68621.min_tait.stderr} | 2 +- src/test/ui/save-analysis/issue-68621.rs | 5 +- .../simd-intrinsic-generic-arithmetic.rs | 8 + .../simd-intrinsic-generic-arithmetic.stderr | 36 +- .../simd-intrinsic-generic-elements.rs | 19 +- .../simd-intrinsic-generic-elements.stderr | 48 +- .../simd-intrinsic-inlining-issue67557-ice.rs | 2 +- .../simd-intrinsic-inlining-issue67557.rs | 2 +- src/test/ui/simd-type.rs | 20 - src/test/ui/{issues => simd}/issue-17170.rs | 0 src/test/ui/{issues => simd}/issue-39720.rs | 0 .../simd/simd-intrinsic-generic-arithmetic.rs | 7 + .../simd/simd-intrinsic-generic-elements.rs | 24 - src/test/ui/simd/simd-size-align.rs | 103 +- ...imd-type-generic-monomorphisation-empty.rs | 12 + ...type-generic-monomorphisation-empty.stderr | 4 + ...type-generic-monomorphisation-oversized.rs | 12 + ...-generic-monomorphisation-oversized.stderr | 4 + ...e-generic-monomorphisation-power-of-two.rs | 10 + .../simd-type-generic-monomorphisation.rs | 0 .../simd-type-generic-monomorphisation.stderr | 0 src/test/ui/simd/simd-type.rs | 34 +- src/test/ui/{ => simd}/simd-type.stderr | 20 +- .../one-use-in-fn-argument-in-band.stderr | 24 +- .../ui/span/impl-wrong-item-for-trait.stderr | 2 +- .../ui/span/issue-43927-non-ADT-derive.rs | 7 +- .../ui/span/issue-43927-non-ADT-derive.stderr | 31 +- src/test/ui/span/issue-81800.rs | 2 + src/test/ui/span/issue-81800.stderr | 19 + src/test/ui/span/macro-ty-params.rs | 2 +- src/test/ui/span/macro-ty-params.stderr | 2 +- .../deafult-associated-type-bound-2.stderr | 4 + .../specialization-default-projection.stderr | 2 +- .../generics-default-stability.stderr | 8 +- .../stability-attribute-issue-43027.rs | 9 +- .../stability-attribute-issue-43027.stderr | 8 - .../stability-attribute-sanity-2.stderr | 2 +- .../stability-attribute-sanity.rs | 7 +- .../stability-attribute-sanity.stderr | 22 +- .../ui/static/static-reference-to-fn-2.stderr | 2 + .../ui/{issues => statics}/issue-15261.rs | 0 .../ui/{issues => statics}/issue-44373-2.rs | 0 .../ui/{issues => statics}/issue-44373.rs | 0 .../ui/{issues => statics}/issue-44373.stderr | 0 src/test/ui/{ => structs-enums}/type-sizes.rs | 0 src/test/ui/structs/issue-80853.rs | 7 + src/test/ui/structs/issue-80853.stderr | 13 + .../struct-path-associated-type.stderr | 4 +- .../ui/structs/struct-tuple-field-names.rs | 15 + .../structs/struct-tuple-field-names.stderr | 25 + .../ui/structs/struct-variant-privacy-xc.rs | 3 +- .../structs/struct-variant-privacy-xc.stderr | 2 +- src/test/ui/structs/struct-variant-privacy.rs | 5 +- .../ui/structs/struct-variant-privacy.stderr | 2 +- ...adt-param-with-implicit-sized-bound.stderr | 4 +- src/test/ui/suggestions/as-ref.stderr | 12 +- .../ui/suggestions/auxiliary/issue-81839.rs | 9 + ...empt-to-add-suggestions-with-no-changes.rs | 5 + ...-to-add-suggestions-with-no-changes.stderr | 20 + ...ng-semicolon-between-call-and-tuple.stderr | 2 +- src/test/ui/suggestions/issue-81839.rs | 17 + src/test/ui/suggestions/issue-81839.stderr | 28 + src/test/ui/suggestions/issue-82361.fixed | 24 + src/test/ui/suggestions/issue-82361.rs | 24 + src/test/ui/suggestions/issue-82361.stderr | 48 + src/test/ui/suggestions/issue-82566-1.rs | 21 + src/test/ui/suggestions/issue-82566-1.stderr | 35 + src/test/ui/suggestions/issue-82566-2.rs | 31 + src/test/ui/suggestions/issue-82566-2.stderr | 35 + ...issing-lifetimes-in-signature-2.nll.stderr | 17 + .../missing-lifetimes-in-signature-2.rs | 26 + .../missing-lifetimes-in-signature-2.stderr | 21 + .../missing-lifetimes-in-signature.nll.stderr | 41 +- .../missing-lifetimes-in-signature.stderr | 30 +- .../ui/suggestions/match-needing-semi.fixed | 18 - src/test/ui/suggestions/match-needing-semi.rs | 7 +- .../ui/suggestions/match-needing-semi.stderr | 21 +- .../match-prev-arm-needing-semi.rs | 9 +- .../match-prev-arm-needing-semi.stderr | 22 +- ...erent-arm-types-as-stmt-instead-of-expr.rs | 30 + ...t-arm-types-as-stmt-instead-of-expr.stderr | 51 + ...issing-trait-bounds-for-method-call.stderr | 4 +- .../mut-borrow-needed-by-trait.stderr | 2 +- .../suggestions/mut-ref-reassignment.stderr | 2 +- .../ui/suggestions/option-content-move.stderr | 2 +- src/test/ui/suggestions/suggest-box.stderr | 2 +- src/test/ui/suggestions/suggest-change-mut.rs | 21 + .../ui/suggestions/suggest-change-mut.stderr | 39 + .../suggest-mut-method-for-loop.rs | 17 + .../suggest-mut-method-for-loop.stderr | 15 + .../suggest-std-when-using-type.stderr | 4 +- src/test/ui/symbol-names/basic.legacy.stderr | 4 +- src/test/ui/symbol-names/basic.rs | 4 +- src/test/ui/symbol-names/basic.v0.stderr | 4 +- .../symbol-names/const-generics-demangling.rs | 16 +- .../const-generics-demangling.stderr | 16 +- src/test/ui/symbol-names/impl1.legacy.stderr | 36 +- src/test/ui/symbol-names/impl1.rs | 15 +- src/test/ui/symbol-names/impl1.v0.stderr | 36 +- .../ui/symbol-names/issue-60925.legacy.stderr | 4 +- src/test/ui/symbol-names/issue-60925.rs | 4 +- .../ui/symbol-names/issue-60925.v0.stderr | 4 +- .../ui/symbol-names/issue-75326.legacy.stderr | 6 +- src/test/ui/symbol-names/issue-75326.rs | 7 +- .../ui/symbol-names/issue-75326.v0.stderr | 10 +- .../ui/test-attrs/test-filter-multiple.rs | 17 + .../test-filter-multiple.run.stdout | 7 + src/test/ui/tool_lints.rs | 6 +- src/test/ui/tool_lints.stderr | 12 +- .../ambiguous.rs} | 0 .../ambiguous.stderr} | 6 +- .../auxiliary/greeter.rs} | 0 .../auxiliary/send_sync.rs} | 0 .../trait-alias.rs => alias/basic.rs} | 0 .../trait-alias-bounds.rs => alias/bounds.rs} | 0 .../cross-crate.rs} | 6 +- .../cross-crate.stderr} | 4 +- .../trait-alias-impl.rs => alias/impl.rs} | 0 .../impl.stderr} | 2 +- .../import-cross-crate.rs} | 6 +- .../import.rs} | 0 .../issue-60021-assoc-method-resolve.rs | 0 .../issue-72415-assoc-const-resolve.rs | 0 .../{trait-alias => alias}/issue-75983.rs | 0 .../maybe-bound.rs} | 0 .../no-duplicates.rs} | 0 .../no-duplicates.stderr} | 54 +- .../no-extra-traits.rs} | 0 .../no-extra-traits.stderr} | 56 +- .../object-fail.rs} | 0 .../object-fail.stderr} | 4 +- .../object-wf.rs} | 0 .../trait-alias-object.rs => alias/object.rs} | 0 .../only-maybe-bound.rs} | 0 .../only-maybe-bound.stderr} | 4 +- .../syntax-fail.rs} | 0 .../syntax-fail.stderr} | 8 +- .../trait-alias-syntax.rs => alias/syntax.rs} | 0 .../trait-alias-wf.rs => alias/wf.rs} | 0 .../trait-alias-wf.stderr => alias/wf.stderr} | 2 +- ...static-method.rs => anon-static-method.rs} | 0 ...onstructor.rs => as-struct-constructor.rs} | 0 ...or.stderr => as-struct-constructor.stderr} | 2 +- ...trait-bad.rs => assoc-type-in-superbad.rs} | 0 ...d.stderr => assoc-type-in-superbad.stderr} | 2 +- ...ertrait.rs => assoc-type-in-supertrait.rs} | 0 .../assoc_type_bound_with_struct.rs | 0 .../assoc_type_bound_with_struct.stderr | 0 .../check-trait-object-bounds-1.rs | 0 .../check-trait-object-bounds-1.stderr | 0 .../check-trait-object-bounds-2-ok.rs | 0 .../check-trait-object-bounds-2.rs | 0 .../check-trait-object-bounds-2.stderr | 0 .../check-trait-object-bounds-3.rs | 0 .../check-trait-object-bounds-3.stderr | 0 .../check-trait-object-bounds-4.rs | 0 .../check-trait-object-bounds-4.stderr | 0 .../check-trait-object-bounds-5.rs | 0 .../check-trait-object-bounds-5.stderr | 0 .../check-trait-object-bounds-6.rs | 0 .../check-trait-object-bounds-6.stderr | 0 ...e.rs => astconv-cycle-between-and-type.rs} | 0 .../traits/{ => bound}/auxiliary/crate_a1.rs | 0 .../traits/{ => bound}/auxiliary/crate_a2.rs | 0 .../auxiliary/on_structs_and_enums_xc.rs} | 0 .../{trait-bounds-basic.rs => bound/basic.rs} | 0 .../generic_trait.rs} | 0 .../impl-comparison-duplicates.rs} | 0 .../in-arc.rs} | 0 .../multiple.rs} | 0 .../not-on-bare-trait.rs} | 0 .../not-on-bare-trait.stderr} | 4 +- .../not-on-struct.rs} | 0 .../not-on-struct.stderr} | 38 +- .../on-structs-and-enums-in-fns.rs} | 0 .../on-structs-and-enums-in-fns.stderr} | 4 +- .../on-structs-and-enums-in-impls.rs} | 0 .../on-structs-and-enums-in-impls.stderr} | 2 +- .../on-structs-and-enums-locals.rs} | 0 .../on-structs-and-enums-locals.stderr} | 4 +- .../on-structs-and-enums-rpass.rs} | 0 .../on-structs-and-enums-static.rs} | 0 .../on-structs-and-enums-static.stderr} | 2 +- .../traits/bound/on-structs-and-enums-xc.rs | 14 + .../on-structs-and-enums-xc.stderr} | 8 +- .../traits/bound/on-structs-and-enums-xc1.rs | 15 + .../on-structs-and-enums-xc1.stderr} | 6 +- .../on-structs-and-enums.rs} | 0 .../on-structs-and-enums.stderr} | 14 +- .../recursion.rs} | 0 .../same-crate-name.rs} | 0 .../same-crate-name.stderr} | 8 +- .../{trait-bounds-sugar.rs => bound/sugar.rs} | 0 .../sugar.stderr} | 2 +- ...he-issue-18209.rs => cache-issue-18209.rs} | 0 ...generic-bad.rs => coercion-generic-bad.rs} | 0 ...bad.stderr => coercion-generic-bad.stderr} | 2 +- ...regions.rs => coercion-generic-regions.rs} | 0 ...stderr => coercion-generic-regions.stderr} | 2 +- ...oercion-generic.rs => coercion-generic.rs} | 0 .../traits/{trait-coercion.rs => coercion.rs} | 0 ...tion-trivial.rs => composition-trivial.rs} | 0 ...al-dispatch.rs => conditional-dispatch.rs} | 0 ...al-model-fn.rs => conditional-model-fn.rs} | 0 ...rait-copy-guessing.rs => copy-guessing.rs} | 0 ...rait-type-trait.rs => cycle-type-trait.rs} | 0 .../auxiliary/xc.rs} | 0 .../auxiliary/xc_2.rs} | 4 +- .../bound-subst.rs} | 0 .../bound-subst2.rs} | 0 .../bound-subst3.rs} | 0 .../bound-subst4.rs} | 0 .../bound.rs} | 0 .../macro.rs} | 0 .../mut.rs} | 0 .../self.rs} | 0 .../supervtable.rs} | 0 .../trivial.rs} | 0 .../xc-2.rs} | 8 +- .../xc.rs} | 4 +- ...licate-methods.rs => duplicate-methods.rs} | 0 ...ethods.stderr => duplicate-methods.stderr} | 2 +- ...ype-region.rs => elaborate-type-region.rs} | 0 ...e-ambiguity-where-clause-builtin-bound.rs} | 0 .../traits/{trait-generic.rs => generic.rs} | 0 .../ui/traits/{trait-impl-1.rs => impl-1.rs} | 0 .../{trait-impl-1.stderr => impl-1.stderr} | 2 +- .../ui/traits/{trait-impl-2.rs => impl-2.rs} | 0 .../ui/{ => traits}/impl-bounds-checking.rs | 0 .../{ => traits}/impl-bounds-checking.stderr | 0 ... => impl-can-not-have-untraitful-items.rs} | 0 ...impl-can-not-have-untraitful-items.stderr} | 6 +- ...params.rs => impl-different-num-params.rs} | 0 ...tderr => impl-different-num-params.stderr} | 2 +- ...-impl-for-module.rs => impl-for-module.rs} | 0 ...r-module.stderr => impl-for-module.stderr} | 2 +- ...od-mismatch.rs => impl-method-mismatch.rs} | 0 ...tch.stderr => impl-method-mismatch.stderr} | 2 +- ....rs => impl-object-overlap-issue-23853.rs} | 0 ...pertrait-has-wrong-lifetime-parameters.rs} | 0 ...rait-has-wrong-lifetime-parameters.stderr} | 8 +- src/test/ui/traits/{trait-impl.rs => impl.rs} | 4 +- .../lifetime.rs} | 0 .../lifetime.stderr} | 2 +- .../simultaneous.rs} | 0 .../simultaneous.stderr} | 4 +- .../supertrait-auto-trait.rs} | 0 .../supertrait-auto-trait.stderr} | 4 +- .../supertrait.rs} | 0 .../supertrait.stderr} | 2 +- .../two-traits.rs} | 0 .../two-traits.stderr} | 4 +- ...52.rs => infer-from-object-issue-26952.rs} | 0 ...thod-order.rs => inherent-method-order.rs} | 0 .../auto-xc-2.rs} | 4 +- .../auto-xc.rs} | 4 +- .../auto.rs} | 0 .../auxiliary/auto_xc.rs} | 0 .../auxiliary/auto_xc_2.rs} | 0 .../auxiliary/overloading_xc.rs} | 0 .../auxiliary/xc_call.rs} | 0 .../basic.rs} | 0 .../call-bound-inherited.rs} | 0 .../call-bound-inherited2.rs} | 0 .../cast-without-call-to-supertrait.rs} | 0 .../cast.rs} | 0 .../cross-trait-call-xc.rs} | 4 +- .../cross-trait-call.rs} | 0 .../diamond.rs} | 0 .../multiple-inheritors.rs} | 0 .../multiple-params.rs} | 0 .../num.rs} | 0 .../num0.rs} | 0 .../num1.rs} | 0 .../num2.rs} | 0 .../num3.rs} | 0 .../num5.rs} | 0 .../overloading-simple.rs} | 0 .../overloading-xc-exe.rs} | 6 +- .../overloading.rs} | 0 .../repeated-supertrait-ambig.rs} | 2 +- .../repeated-supertrait-ambig.stderr} | 14 +- .../repeated-supertrait.rs} | 2 +- .../self-in-supertype.rs} | 0 .../self.rs} | 0 .../simple.rs} | 0 .../static.rs} | 0 .../static2.rs} | 0 .../subst.rs} | 0 .../subst2.rs} | 0 .../visibility.rs} | 0 .../{traits-issue-22019.rs => issue-22019.rs} | 0 .../{traits-issue-22110.rs => issue-22110.rs} | 0 .../{traits-issue-22655.rs => issue-22655.rs} | 0 ...03-overflow.rs => issue-23003-overflow.rs} | 0 .../{traits-issue-23003.rs => issue-23003.rs} | 0 .../{traits-issue-26339.rs => issue-26339.rs} | 0 src/test/ui/{issues => traits}/issue-28576.rs | 0 .../ui/{issues => traits}/issue-28576.stderr | 0 src/test/ui/{issues => traits}/issue-33140.rs | 0 .../ui/{issues => traits}/issue-33140.stderr | 0 .../{traits-issue-71136.rs => issue-71136.rs} | 0 ...-issue-71136.stderr => issue-71136.stderr} | 2 +- ...calls.rs => issue-9394-inherited-calls.rs} | 0 ...m-inside-macro.rs => item-inside-macro.rs} | 0 ...{trait-item-privacy.rs => item-privacy.rs} | 10 +- ...tem-privacy.stderr => item-privacy.stderr} | 50 +- ...ntains-1.rs => kindck-owned-contains-1.rs} | 0 ...ing-lifetimes.rs => matching-lifetimes.rs} | 0 ...times.stderr => matching-lifetimes.stderr} | 12 +- ...it-method-private.rs => method-private.rs} | 0 ...d-private.stderr => method-private.stderr} | 2 +- ...tidispatch-bad.rs => multidispatch-bad.rs} | 0 ...ch-bad.stderr => multidispatch-bad.stderr} | 2 +- ...rs => multidispatch-convert-ambig-dest.rs} | 0 ...> multidispatch-convert-ambig-dest.stderr} | 2 +- ... => multidispatch-infer-convert-target.rs} | 0 .../auto-dedup-in-impl.rs} | 0 .../auto-dedup-in-impl.stderr} | 2 +- .../auto-dedup.rs} | 0 .../bounds-cycle-1.rs} | 0 .../bounds-cycle-2.rs} | 0 .../bounds-cycle-3.rs} | 0 .../bounds-cycle-4.rs} | 0 .../exclusion.rs} | 0 .../generics.rs} | 0 .../object}/issue-33140-traitobject-crate.rs | 0 .../issue-33140-traitobject-crate.stderr | 0 .../lifetime-first.rs} | 0 .../macro-matcher.rs} | 0 .../macro-matcher.stderr} | 4 +- .../safety.rs} | 0 .../safety.stderr} | 8 +- .../supertrait-lifetime-bound.rs} | 0 .../vs-lifetime-2.rs} | 0 .../vs-lifetime-2.stderr} | 2 +- .../vs-lifetime.rs} | 0 .../vs-lifetime.stderr} | 14 +- .../with-lifetime-bound.rs} | 0 .../with-self-in-projection-output-bad.rs} | 0 ...with-self-in-projection-output-bad.stderr} | 4 +- .../with-self-in-projection-output-good.rs} | 0 ...-projection-output-repeated-supertrait.rs} | 0 ...s => param-without-lifetime-constraint.rs} | 0 ... param-without-lifetime-constraint.stderr} | 4 +- ...bounds.rs => parameterized-with-bounds.rs} | 0 ...t-objects.rs => principal-less-objects.rs} | 0 .../traits/{trait-privacy.rs => privacy.rs} | 0 ...ter-simple.rs => region-pointer-simple.rs} | 0 .../coherence-conflict.rs} | 0 .../coherence-conflict.stderr} | 2 +- .../no-use.rs} | 0 .../no-use.stderr} | 2 +- .../non-lattice-ok.rs} | 0 .../ok.rs} | 0 ...d-op.rs => resolution-in-overloaded-op.rs} | 0 ...err => resolution-in-overloaded-op.stderr} | 2 +- ...it-safety-fn-body.rs => safety-fn-body.rs} | 0 ...y-fn-body.stderr => safety-fn-body.stderr} | 2 +- ...herent-impl.rs => safety-inherent-impl.rs} | 0 ...mpl.stderr => safety-inherent-impl.stderr} | 2 +- ...{trait-safety-ok-cc.rs => safety-ok-cc.rs} | 0 .../{trait-safety-ok.rs => safety-ok.rs} | 0 ...ait-impl-cc.rs => safety-trait-impl-cc.rs} | 0 ...-cc.stderr => safety-trait-impl-cc.stderr} | 2 +- ...ety-trait-impl.rs => safety-trait-impl.rs} | 0 ...t-impl.stderr => safety-trait-impl.stderr} | 4 +- .../self-without-lifetime-constraint.stderr | 8 +- ....rs => static-method-generic-inference.rs} | 0 ...=> static-method-generic-inference.stderr} | 2 +- ...riting.rs => static-method-overwriting.rs} | 0 ...e.rs => static-outlives-a-where-clause.rs} | 0 .../issue-39029.fixed} | 0 .../issue-39029.rs} | 0 .../issue-39029.stderr} | 2 +- .../issue-62530.fixed} | 0 .../issue-62530.rs} | 0 .../issue-62530.stderr} | 2 +- .../multiple-0.fixed} | 0 .../multiple-0.rs} | 0 .../multiple-0.stderr} | 2 +- .../multiple-1.rs} | 0 .../multiple-1.stderr} | 2 +- ...here-clause.rs => suggest-where-clause.rs} | 0 ...use.stderr => suggest-where-clause.stderr} | 22 +- ...t-generics.rs => superdefault-generics.rs} | 0 ...x-trait-polarity.rs => syntax-polarity.rs} | 0 .../ui/traits/{trait-test-2.rs => test-2.rs} | 0 .../{trait-test-2.stderr => test-2.stderr} | 16 +- src/test/ui/traits/{trait-test.rs => test.rs} | 0 .../traits/{trait-test.stderr => test.stderr} | 2 +- .../ui/traits/{trait-to-str.rs => to-str.rs} | 0 .../trait-bounds-on-structs-and-enums-xc.rs | 14 - .../trait-bounds-on-structs-and-enums-xc1.rs | 15 - .../{ufcs-trait-object.rs => ufcs-object.rs} | 0 ...-trait-before-def.rs => use-before-def.rs} | 0 .../maybe-bound.rs} | 0 .../maybe-bound.stderr} | 10 +- .../no-duplicates.rs} | 0 .../no-duplicates.stderr} | 10 +- .../only-maybe-bound.rs} | 0 .../only-maybe-bound.stderr} | 4 +- .../reverse-order.rs} | 0 ...use-vs-impl.rs => where-clause-vs-impl.rs} | 0 ...unds-default.rs => with-bounds-default.rs} | 0 .../traits/{trait-with-dst.rs => with-dst.rs} | 0 .../ui/treat-err-as-bug/delay_span_bug.rs | 12 + .../ui/treat-err-as-bug/delay_span_bug.stderr | 11 + src/test/ui/treat-err-as-bug/err.rs | 12 + src/test/ui/treat-err-as-bug/err.stderr | 12 + src/test/ui/try-block/try-block-bad-type.rs | 2 +- .../ui/try-block/try-block-bad-type.stderr | 14 +- src/test/ui/{ => try-block}/try-block.rs | 0 src/test/ui/{ => tuple}/one-tuple.rs | 0 src/test/ui/{ => tuple}/tup.rs | 0 .../assoc-type-const.full_tait.stderr | 19 + ...tderr => assoc-type-const.min_tait.stderr} | 2 +- .../type-alias-impl-trait/assoc-type-const.rs | 5 +- ...pe-lifetime-unconstrained.full_tait.stderr | 18 + ...pe-lifetime-unconstrained.min_tait.stderr} | 2 +- .../assoc-type-lifetime-unconstrained.rs | 5 +- .../assoc-type-lifetime.full_tait.stderr | 11 + .../assoc-type-lifetime.rs | 5 +- ...ted-type-alias-impl-trait.full_tait.stderr | 11 + .../associated-type-alias-impl-trait.rs | 5 +- .../associated-type-lifetime-ice.rs | 33 + .../associated-type-lifetime-ice.stderr | 13 + .../auxiliary/cross_crate_ice.rs | 8 +- .../auxiliary/cross_crate_ice2.rs | 8 +- .../type-alias-impl-trait/bound_reduction.rs | 5 +- .../bound_reduction2.full_tait.stderr | 23 + ...tderr => bound_reduction2.min_tait.stderr} | 4 +- .../type-alias-impl-trait/bound_reduction2.rs | 5 +- .../bounds-are-checked-2.full_tait.stderr | 23 + ...r => bounds-are-checked-2.min_tait.stderr} | 2 +- .../bounds-are-checked-2.rs | 5 +- .../bounds-are-checked.full_tait.stderr | 35 + ...err => bounds-are-checked.min_tait.stderr} | 8 +- .../bounds-are-checked.rs | 5 +- .../coherence.full_tait.stderr | 18 + ...rence.stderr => coherence.min_tait.stderr} | 2 +- .../ui/type-alias-impl-trait/coherence.rs | 5 +- ...eclared_but_never_defined.full_tait.stderr | 17 + ...eclared_but_never_defined.min_tait.stderr} | 2 +- .../declared_but_never_defined.rs | 5 +- ..._but_not_defined_in_scope.full_tait.stderr | 32 + ..._but_not_defined_in_scope.min_tait.stderr} | 4 +- .../declared_but_not_defined_in_scope.rs | 5 +- .../different_defining_uses.full_tait.stderr | 23 + ...> different_defining_uses.min_tait.stderr} | 4 +- .../different_defining_uses.rs | 5 +- ..._defining_uses_never_type.full_tait.stderr | 35 + ..._defining_uses_never_type.min_tait.stderr} | 8 +- .../different_defining_uses_never_type.rs | 5 +- ...defining_uses_never_type2.full_tait.stderr | 11 + .../different_defining_uses_never_type2.rs | 5 +- .../fallback.full_tait.stderr | 11 + src/test/ui/type-alias-impl-trait/fallback.rs | 5 +- ...c_different_defining_uses.full_tait.stderr | 23 + ...c_different_defining_uses.min_tait.stderr} | 4 +- .../generic_different_defining_uses.rs | 5 +- ..._duplicate_lifetime_param.full_tait.stderr | 23 + ..._duplicate_lifetime_param.min_tait.stderr} | 4 +- .../generic_duplicate_lifetime_param.rs | 5 +- ...eric_duplicate_param_use.full_tait.stderr} | 12 +- ...eneric_duplicate_param_use.min_tait.stderr | 38 + .../generic_duplicate_param_use.rs | 5 +- ...ric_duplicate_param_use10.full_tait.stderr | 11 + .../generic_duplicate_param_use10.rs | 5 +- ...eric_duplicate_param_use2.full_tait.stderr | 23 + ...eric_duplicate_param_use2.min_tait.stderr} | 4 +- .../generic_duplicate_param_use2.rs | 5 +- ...eric_duplicate_param_use3.full_tait.stderr | 23 + ...eric_duplicate_param_use3.min_tait.stderr} | 4 +- .../generic_duplicate_param_use3.rs | 5 +- ...eric_duplicate_param_use4.full_tait.stderr | 23 + ...eric_duplicate_param_use4.min_tait.stderr} | 4 +- .../generic_duplicate_param_use4.rs | 5 +- ...eric_duplicate_param_use5.full_tait.stderr | 48 + ...eric_duplicate_param_use5.min_tait.stderr} | 8 +- .../generic_duplicate_param_use5.rs | 5 +- ...eric_duplicate_param_use6.full_tait.stderr | 36 + ...eric_duplicate_param_use6.min_tait.stderr} | 6 +- .../generic_duplicate_param_use6.rs | 5 +- ...eric_duplicate_param_use7.full_tait.stderr | 11 + .../generic_duplicate_param_use7.rs | 5 +- ...eric_duplicate_param_use8.full_tait.stderr | 36 + ...eric_duplicate_param_use8.min_tait.stderr} | 6 +- .../generic_duplicate_param_use8.rs | 5 +- ...eric_duplicate_param_use9.full_tait.stderr | 60 + ...eric_duplicate_param_use9.min_tait.stderr} | 10 +- .../generic_duplicate_param_use9.rs | 5 +- .../generic_lifetime_param.full_tait.stderr | 11 + .../generic_lifetime_param.rs | 5 +- ... generic_nondefining_use.full_tait.stderr} | 10 +- .../generic_nondefining_use.min_tait.stderr | 35 + .../generic_nondefining_use.rs | 5 +- .../generic_not_used.full_tait.stderr | 27 + ...tderr => generic_not_used.min_tait.stderr} | 4 +- .../type-alias-impl-trait/generic_not_used.rs | 5 +- ..._not_live_long_enough.full_tait.nll.stderr | 50 + ...does_not_live_long_enough.full_tait.stderr | 51 + ..._not_live_long_enough.min_tait.nll.stderr} | 8 +- ...does_not_live_long_enough.min_tait.stderr} | 8 +- .../generic_type_does_not_live_long_enough.rs | 5 +- .../generic_underconstrained.full_tait.stderr | 32 + ... generic_underconstrained.min_tait.stderr} | 4 +- .../generic_underconstrained.rs | 5 +- ...generic_underconstrained2.full_tait.stderr | 52 + ...generic_underconstrained2.min_tait.stderr} | 8 +- .../generic_underconstrained2.rs | 5 +- ...-with-unconstrained-param.full_tait.stderr | 18 + ...-with-unconstrained-param.min_tait.stderr} | 2 +- .../impl-with-unconstrained-param.rs | 5 +- ...ncoherent-assoc-imp-trait.full_tait.stderr | 32 + ...ncoherent-assoc-imp-trait.min_tait.stderr} | 4 +- .../incoherent-assoc-imp-trait.rs | 5 +- ...e-52843-closure-constrain.full_tait.stderr | 23 + ...ue-52843-closure-constrain.min_tait.stderr | 24 + .../issue-52843-closure-constrain.rs | 7 +- .../issue-52843-closure-constrain.stderr | 14 - .../issue-52843.full_tait.stderr | 23 + ...843.stderr => issue-52843.min_tait.stderr} | 2 +- .../ui/type-alias-impl-trait/issue-52843.rs | 5 +- .../issue-53096.full_tait.stderr | 25 + .../issue-53096.min_tait.stderr | 12 + .../ui/type-alias-impl-trait/issue-53096.rs | 13 +- .../issue-53598.full_tait.stderr | 21 + ...598.stderr => issue-53598.min_tait.stderr} | 2 +- .../ui/type-alias-impl-trait/issue-53598.rs | 5 +- ...78-generator-and-const-fn.full_tait.stderr | 25 + ...678-generator-and-const-fn.min_tait.stderr | 12 + .../issue-53678-generator-and-const-fn.rs | 14 +- ...-55099-lifetime-inference.full_tait.stderr | 11 + .../issue-55099-lifetime-inference.rs | 5 +- ...88-associate-impl-capture.full_tait.stderr | 11 + .../issue-57188-associate-impl-capture.rs | 5 +- ...sue-57611-trait-alias.full_tait.nll.stderr | 47 + .../issue-57611-trait-alias.full_tait.stderr | 67 + ...sue-57611-trait-alias.min_tait.nll.stderr} | 23 +- .../issue-57611-trait-alias.min_tait.stderr | 58 + .../issue-57611-trait-alias.rs | 11 +- .../issue-57611-trait-alias.stderr | 73 - .../issue-57700.full_tait.stderr | 21 + ...700.stderr => issue-57700.min_tait.stderr} | 2 +- .../ui/type-alias-impl-trait/issue-57700.rs | 5 +- ...sue-57807-associated-type.full_tait.stderr | 11 + .../issue-57807-associated-type.rs | 5 +- .../issue-58887.full_tait.stderr | 11 + .../ui/type-alias-impl-trait/issue-58887.rs | 5 +- .../issue-58951.full_tait.stderr | 11 + .../ui/type-alias-impl-trait/issue-58951.rs | 5 +- .../ui/type-alias-impl-trait/issue-60371.rs | 1 + .../type-alias-impl-trait/issue-60371.stderr | 13 +- .../issue-60407.full_tait.stderr | 25 + .../issue-60407.min_tait.stderr | 24 + .../ui/type-alias-impl-trait/issue-60407.rs | 15 +- .../issue-60564.full_tait.stderr | 23 + ...564.stderr => issue-60564.min_tait.stderr} | 4 +- .../ui/type-alias-impl-trait/issue-60564.rs | 5 +- ...iate-impl-trait-lifetimes.full_tait.stderr | 11 + ...ue-62000-associate-impl-trait-lifetimes.rs | 5 +- ...ssue-63263-closure-return.full_tait.stderr | 11 + .../issue-63263-closure-return.rs | 3 +- .../issue-63263-closure-return.stderr | 11 + .../issue-63279.full_tait.stderr | 21 + .../issue-63279.min_tait.stderr | 22 + .../ui/type-alias-impl-trait/issue-63279.rs | 7 +- .../type-alias-impl-trait/issue-63279.stderr | 12 - ...3677-type-alias-coherence.full_tait.stderr | 11 + .../issue-63677-type-alias-coherence.rs | 5 +- ...-opaque-ty-from-val-twice.full_tait.stderr | 25 + ...t-opaque-ty-from-val-twice.min_tait.stderr | 21 + ...sue-65679-inst-opaque-ty-from-val-twice.rs | 12 +- .../ui/type-alias-impl-trait/issue-65918.rs | 5 +- ...e-66580-closure-coherence.full_tait.stderr | 11 + .../issue-66580-closure-coherence.rs | 5 +- ...issue-67844-nested-opaque.full_tait.stderr | 11 + .../issue-67844-nested-opaque.rs | 5 +- ...ue-68368-non-defining-use.full_tait.stderr | 23 + ...ue-68368-non-defining-use.min_tait.stderr} | 4 +- .../issue-68368-non-defining-use.rs | 5 +- ...er-lifetime-resolve-error.full_tait.stderr | 20 + ...er-lifetime-resolve-error.min_tait.stderr} | 2 +- ...ssue-69136-inner-lifetime-resolve-error.rs | 5 +- ...inner-lifetime-resolve-ok.full_tait.stderr | 11 + .../issue-69136-inner-lifetime-resolve-ok.rs | 5 +- .../issue-70121.full_tait.stderr | 11 + .../ui/type-alias-impl-trait/issue-70121.rs | 5 +- .../issue-74244.full_tait.stderr | 18 + ...244.stderr => issue-74244.min_tait.stderr} | 2 +- .../ui/type-alias-impl-trait/issue-74244.rs | 5 +- .../issue-74761.full_tait.stderr | 24 + ...761.stderr => issue-74761.min_tait.stderr} | 4 +- .../ui/type-alias-impl-trait/issue-74761.rs | 5 +- ...76202-trait-impl-for-tait.full_tait.stderr | 23 + ...76202-trait-impl-for-tait.min_tait.stderr} | 4 +- .../issue-76202-trait-impl-for-tait.rs | 5 +- ...ted_type_alias_impl_trait.full_tait.stderr | 11 + .../nested_type_alias_impl_trait.rs | 5 +- ...ever_reveal_concrete_type.full_tait.stderr | 33 + ...ever_reveal_concrete_type.min_tait.stderr} | 4 +- .../never_reveal_concrete_type.rs | 5 +- ..._inferrable_concrete_type.full_tait.stderr | 25 + ...o_inferrable_concrete_type.min_tait.stderr | 18 + .../no_inferrable_concrete_type.rs | 8 +- .../no_inferrable_concrete_type.stderr | 8 - ...g_outside_defining_module.full_tait.stderr | 40 + ...g_outside_defining_module.min_tait.stderr} | 4 +- .../no_revealing_outside_defining_module.rs | 5 +- .../not_a_defining_use.full_tait.stderr | 23 + ...err => not_a_defining_use.min_tait.stderr} | 4 +- .../not_a_defining_use.rs | 5 +- .../not_well_formed.full_tait.stderr | 18 + ...stderr => not_well_formed.min_tait.stderr} | 2 +- .../type-alias-impl-trait/not_well_formed.rs | 5 +- .../structural-match-no-leak.full_tait.stderr | 25 + .../structural-match-no-leak.min_tait.stderr | 12 + .../structural-match-no-leak.rs | 11 +- .../structural-match-no-leak.stderr | 8 - .../structural-match.full_tait.stderr | 25 + .../structural-match.min_tait.stderr | 12 + .../type-alias-impl-trait/structural-match.rs | 11 +- .../structural-match.stderr | 8 - ...pe-alias-impl-trait-const.full_tait.stderr | 19 + ...pe-alias-impl-trait-const.min_tait.stderr} | 2 +- .../type-alias-impl-trait-const.rs | 5 +- ...type-alias-impl-trait-fns.full_tait.stderr | 11 + .../type-alias-impl-trait-fns.rs | 5 +- ...pe-alias-impl-trait-sized.full_tait.stderr | 11 + .../type-alias-impl-trait-sized.rs | 5 +- ...pe-alias-impl-trait-tuple.full_tait.stderr | 11 + .../type-alias-impl-trait-tuple.rs | 5 +- ...it-unconstrained-lifetime.full_tait.stderr | 18 + ...it-unconstrained-lifetime.min_tait.stderr} | 2 +- ...alias-impl-trait-unconstrained-lifetime.rs | 5 +- ...pl-trait-with-cycle-error.full_tait.stderr | 17 + ...pl-trait-with-cycle-error.min_tait.stderr} | 2 +- .../type-alias-impl-trait-with-cycle-error.rs | 5 +- ...l-trait-with-cycle-error2.full_tait.stderr | 17 + ...l-trait-with-cycle-error2.min_tait.stderr} | 2 +- ...type-alias-impl-trait-with-cycle-error2.rs | 5 +- ...impl-trait-with-no-traits.full_tait.stderr | 23 + ...impl-trait-with-no-traits.min_tait.stderr} | 4 +- .../type-alias-impl-trait-with-no-traits.rs | 5 +- .../type-alias-impl-trait.full_tait.stderr | 11 + .../type-alias-impl-trait.rs | 5 +- ...e-alias-nested-impl-trait.full_tait.stderr | 11 + .../type-alias-nested-impl-trait.rs | 5 +- .../unused_generic_param.full_tait.stderr | 23 + ...r => unused_generic_param.min_tait.stderr} | 4 +- .../unused_generic_param.rs | 5 +- .../ui/type/type-check/issue-41314.stderr | 7 +- .../ui/typeck/auxiliary/issue-81943-lib.rs | 7 + src/test/ui/typeck/issue-79040.rs | 5 + src/test/ui/typeck/issue-79040.stderr | 19 + src/test/ui/typeck/issue-81943.rs | 13 + src/test/ui/typeck/issue-81943.stderr | 51 + src/test/ui/typeck/issue-82772.rs | 13 + src/test/ui/typeck/issue-82772.stderr | 21 + ...eck_type_placeholder_item.full_tait.stderr | 647 + ...eck_type_placeholder_item.min_tait.stderr} | 138 +- .../ui/typeck/typeck_type_placeholder_item.rs | 6 +- .../typeck_type_placeholder_item_help.stderr | 5 +- .../ui/ufcs/ufcs-explicit-self-bad.stderr | 24 +- .../issue-18661.rs | 0 .../unboxed-closures/issue-30906.nll.stderr | 2 +- src/test/ui/unboxed-closures/issue-30906.rs | 12 +- .../ui/unboxed-closures/issue-30906.stderr | 16 +- .../type-id-higher-rank.rs | 0 src/test/ui/underscore-imports/hygiene-2.rs | 1 + .../uninhabited-matches-feature-gated.stderr | 6 +- src/test/ui/unknown-lint-tool-name.rs | 12 +- src/test/ui/unknown-lint-tool-name.stderr | 24 +- .../unsafe/rfc-2585-unsafe_op_in_unsafe_fn.rs | 1 - .../rfc-2585-unsafe_op_in_unsafe_fn.stderr | 32 +- src/test/ui/unsized/unsized-enum.stderr | 2 +- .../unsized-inherent-impl-self-type.stderr | 2 +- src/test/ui/unsized/unsized-struct.stderr | 2 +- .../unsized-trait-impl-self-type.stderr | 2 +- .../ui/unspecified-self-in-trait-ref.stderr | 2 +- .../extern-loc-bad-loctype.rs | 8 + .../extern-loc-bad-loctype.stderr | 2 + .../unused-crate-deps/extern-loc-defl-json.rs | 10 + .../extern-loc-defl-json.stderr | 17 + .../extern-loc-json-bad-json.rs | 8 + .../extern-loc-json-bad-json.stderr | 2 + .../unused-crate-deps/extern-loc-json-json.rs | 10 + .../extern-loc-json-json.stderr | 17 + .../ui/unused-crate-deps/extern-loc-json.rs | 10 + .../unused-crate-deps/extern-loc-json.stderr | 15 + .../extern-loc-missing-loc.rs | 8 + .../extern-loc-missing-loc.stderr | 2 + .../extern-loc-missing-loctype.rs | 8 + .../extern-loc-missing-loctype.stderr | 2 + .../unused-crate-deps/extern-loc-raw-json.rs | 10 + .../extern-loc-raw-json.stderr | 17 + .../extern-loc-raw-missing-loc.rs | 8 + .../extern-loc-raw-missing-loc.stderr | 2 + .../ui/unused-crate-deps/extern-loc-raw.rs | 10 + .../unused-crate-deps/extern-loc-raw.stderr | 15 + src/test/ui/unused-crate-deps/libfib.stderr | 1 + src/test/ui/unused-crate-deps/test.mk | 7 + .../unused-crate-deps/unused-aliases.stderr | 1 + .../ui/unused-crate-deps/warn-attr.stderr | 1 + .../warn-cmdline-static.stderr | 1 + .../ui/unused-crate-deps/warn-cmdline.stderr | 1 + src/test/ui/unused/unused-attr.stderr | 50 +- .../feature-gate-c-unwind-enabled.rs | 12 + .../ui/unwind-abis/feature-gate-c-unwind.rs | 9 + .../unwind-abis/feature-gate-c-unwind.stderr | 12 + .../feature-gate-stdcall-unwind.rs | 13 + .../feature-gate-stdcall-unwind.stderr | 12 + .../unwind-abis/feature-gate-system-unwind.rs | 9 + .../feature-gate-system-unwind.stderr | 12 + .../feature-gate-thiscall-unwind.rs | 13 + .../feature-gate-thiscall-unwind.stderr | 12 + src/test/ui/variants/variant-namespacing.rs | 2 +- src/test/ui/wf/wf-fn-where-clause.stderr | 2 +- src/test/ui/wf/wf-static-method.stderr | 2 +- .../ui/where-clauses/where-for-self-2.stderr | 13 +- src/test/ui/while-let.rs | 6 +- src/test/ui/while-let.stderr | 13 +- src/tools/build-manifest/src/main.rs | 31 +- src/tools/compiletest/Cargo.toml | 4 +- src/tools/compiletest/src/common.rs | 6 +- src/tools/compiletest/src/header.rs | 16 + src/tools/compiletest/src/main.rs | 28 +- src/tools/compiletest/src/runtest.rs | 112 +- src/tools/compiletest/src/util.rs | 3 + src/tools/expand-yaml-anchors/src/main.rs | 6 +- src/tools/jsondocck/src/cache.rs | 2 + src/tools/jsondocck/src/main.rs | 89 +- src/tools/linkchecker/main.rs | 7 +- src/tools/publish_toolstate.py | 50 +- src/tools/rustc-workspace-hack/Cargo.toml | 4 +- src/tools/rustdoc-gui/tester.js | 89 + src/tools/tidy/Cargo.toml | 5 + src/tools/tidy/src/deps.rs | 4 + src/tools/tidy/src/lib.rs | 2 +- src/tools/tidy/src/style.rs | 69 +- src/tools/tidy/src/ui_tests.rs | 4 +- src/version | 2 +- vendor/adler/.cargo-checksum.json | 2 +- vendor/adler/CHANGELOG.md | 30 + vendor/adler/Cargo.toml | 11 +- vendor/adler/README.md | 5 +- vendor/adler/src/lib.rs | 88 +- vendor/byteorder/.cargo-checksum.json | 2 +- vendor/byteorder/Cargo.toml | 2 +- vendor/byteorder/README.md | 4 +- vendor/byteorder/src/io.rs | 3 +- vendor/byteorder/src/lib.rs | 94 +- vendor/cc/.cargo-checksum.json | 2 +- vendor/cc/Cargo.lock | 2 +- vendor/cc/Cargo.toml | 2 +- vendor/cc/README.md | 14 +- vendor/cc/src/lib.rs | 38 +- .../.cargo-checksum.json | 0 .../Cargo.toml | 0 .../README.md | 0 .../src/lib.rs | 0 .../.cargo-checksum.json | 0 .../{chalk-ir => chalk-ir-0.55.0}/Cargo.toml | 0 .../{chalk-ir => chalk-ir-0.55.0}/README.md | 0 .../{chalk-ir => chalk-ir-0.55.0}/src/cast.rs | 0 .../src/could_match.rs | 0 .../src/debug.rs | 0 .../{chalk-ir => chalk-ir-0.55.0}/src/fold.rs | 0 .../src/fold/binder_impls.rs | 0 .../src/fold/boring_impls.rs | 0 .../src/fold/in_place.rs | 0 .../src/fold/shift.rs | 0 .../src/fold/subst.rs | 0 .../src/interner.rs | 0 .../{chalk-ir => chalk-ir-0.55.0}/src/lib.rs | 0 .../src/visit.rs | 0 .../src/visit/binder_impls.rs | 0 .../src/visit/boring_impls.rs | 0 .../src/visit/visitors.rs | 0 .../{chalk-ir => chalk-ir-0.55.0}/src/zip.rs | 0 .../.cargo-checksum.json | 0 .../Cargo.toml | 0 .../README.md | 0 .../src/clauses.rs | 0 .../src/clauses/builder.rs | 0 .../src/clauses/builtin_traits.rs | 0 .../src/clauses/builtin_traits/clone.rs | 0 .../src/clauses/builtin_traits/copy.rs | 0 .../builtin_traits/discriminant_kind.rs | 0 .../src/clauses/builtin_traits/fn_family.rs | 0 .../src/clauses/builtin_traits/sized.rs | 0 .../src/clauses/builtin_traits/unsize.rs | 0 .../src/clauses/dyn_ty.rs | 0 .../src/clauses/env_elaborator.rs | 0 .../src/clauses/generalize.rs | 0 .../src/clauses/program_clauses.rs | 0 .../src/coherence.rs | 0 .../src/coherence/orphan.rs | 0 .../src/coherence/solve.rs | 0 .../src/coinductive_goal.rs | 0 .../src/display.rs | 0 .../src/display/bounds.rs | 0 .../src/display/identifiers.rs | 0 .../src/display/items.rs | 0 .../src/display/render_trait.rs | 0 .../src/display/state.rs | 0 .../src/display/stub.rs | 0 .../src/display/ty.rs | 0 .../src/display/utils.rs | 0 .../src/ext.rs | 0 .../src/goal_builder.rs | 0 .../src/infer.rs | 0 .../src/infer/canonicalize.rs | 0 .../src/infer/instantiate.rs | 0 .../src/infer/invert.rs | 0 .../src/infer/test.rs | 0 .../src/infer/ucanonicalize.rs | 0 .../src/infer/unify.rs | 0 .../src/infer/var.rs | 0 .../src/lib.rs | 0 .../src/logging.rs | 0 .../src/logging_db.rs | 0 .../src/logging_db/id_collector.rs | 0 .../src/rust_ir.rs | 0 .../src/solve.rs | 0 .../src/solve/test/bench.rs | 0 .../src/solve/truncate.rs | 0 .../src/split.rs | 0 .../src/wf.rs | 0 vendor/cmake/.cargo-checksum.json | 2 +- vendor/cmake/Cargo.toml | 2 +- vendor/cmake/src/lib.rs | 135 +- vendor/colored/.cargo-checksum.json | 1 + vendor/colored/CHANGELOG.md | 88 + vendor/colored/Cargo.lock | 83 + vendor/colored/Cargo.toml | 39 + vendor/colored/Dockerfile | 9 + vendor/colored/LICENSE | 373 + vendor/colored/README.md | 184 + vendor/colored/examples/control.rs | 53 + vendor/colored/examples/dynamic_colors.rs | 14 + vendor/colored/examples/most_simple.rs | 24 + vendor/colored/examples/nested_colors.rs | 16 + vendor/colored/src/color.rs | 215 + vendor/colored/src/control.rs | 411 + vendor/colored/src/formatters.rs | 15 + vendor/colored/src/lib.rs | 841 + vendor/colored/src/style.rs | 293 + vendor/colored/tests/ansi_term_compat.rs | 146 + vendor/const_fn/.cargo-checksum.json | 1 - vendor/const_fn/CHANGELOG.md | 149 - vendor/const_fn/LICENSE-APACHE | 177 - vendor/const_fn/README.md | 71 - vendor/const_fn/build.rs | 102 - vendor/const_fn/src/ast.rs | 141 - vendor/const_fn/src/error.rs | 37 - vendor/const_fn/src/iter.rs | 39 - vendor/const_fn/src/lib.rs | 233 - vendor/const_fn/src/to_tokens.rs | 36 - vendor/const_fn/src/utils.rs | 46 - vendor/crossbeam-epoch/.cargo-checksum.json | 2 +- vendor/crossbeam-epoch/CHANGELOG.md | 11 + vendor/crossbeam-epoch/Cargo.lock | 122 +- vendor/crossbeam-epoch/Cargo.toml | 18 +- vendor/crossbeam-epoch/README.md | 4 +- vendor/crossbeam-epoch/examples/sanitize.rs | 2 +- .../crossbeam-epoch/examples/treiber_stack.rs | 107 - vendor/crossbeam-epoch/src/atomic.rs | 233 +- vendor/crossbeam-epoch/src/collector.rs | 11 +- vendor/crossbeam-epoch/src/default.rs | 4 +- vendor/crossbeam-epoch/src/deferred.rs | 8 +- vendor/crossbeam-epoch/src/epoch.rs | 55 +- vendor/crossbeam-epoch/src/internal.rs | 89 +- vendor/crossbeam-epoch/src/lib.rs | 104 +- vendor/crossbeam-epoch/src/sync/list.rs | 24 +- vendor/crossbeam-epoch/src/sync/mod.rs | 4 +- vendor/crossbeam-epoch/src/sync/queue.rs | 44 +- vendor/crossbeam-epoch/tests/loom.rs | 157 + .../.cargo-checksum.json | 1 - vendor/crossbeam-queue-0.1.2/CHANGELOG.md | 11 - vendor/crossbeam-queue-0.1.2/src/lib.rs | 22 - vendor/crossbeam-queue/.cargo-checksum.json | 1 + vendor/crossbeam-queue/CHANGELOG.md | 28 + .../Cargo.toml | 20 +- .../LICENSE-APACHE | 0 .../LICENSE-MIT | 0 .../LICENSE-THIRD-PARTY | 0 .../README.md | 7 +- .../src/array_queue.rs | 57 +- .../src/err.rs | 9 +- vendor/crossbeam-queue/src/lib.rs | 42 + .../src/seg_queue.rs | 71 +- .../tests/array_queue.rs | 15 +- .../tests/seg_queue.rs | 9 +- .../.cargo-checksum.json | 1 - vendor/crossbeam-utils-0.6.6/CHANGELOG.md | 97 - vendor/crossbeam-utils-0.6.6/Cargo.toml | 38 - vendor/crossbeam-utils-0.6.6/README.md | 73 - .../benches/atomic_cell.rs | 157 - .../src/atomic/atomic_cell.rs | 968 - .../src/atomic/consume.rs | 82 - .../crossbeam-utils-0.6.6/src/atomic/mod.rs | 7 - vendor/crossbeam-utils-0.6.6/src/backoff.rs | 292 - .../crossbeam-utils-0.6.6/src/cache_padded.rs | 131 - vendor/crossbeam-utils-0.6.6/src/lib.rs | 67 - vendor/crossbeam-utils-0.6.6/src/sync/mod.rs | 17 - .../crossbeam-utils-0.6.6/src/sync/parker.rs | 311 - .../src/sync/sharded_lock.rs | 600 - .../src/sync/wait_group.rs | 139 - vendor/crossbeam-utils-0.6.6/src/thread.rs | 529 - .../tests/atomic_cell.rs | 225 - .../tests/cache_padded.rs | 112 - vendor/crossbeam-utils-0.6.6/tests/parker.rs | 43 - .../tests/sharded_lock.rs | 255 - vendor/crossbeam-utils-0.6.6/tests/thread.rs | 181 - .../crossbeam-utils-0.6.6/tests/wait_group.rs | 66 - vendor/crossbeam-utils/.cargo-checksum.json | 2 +- vendor/crossbeam-utils/CHANGELOG.md | 13 +- vendor/crossbeam-utils/Cargo.toml | 8 +- vendor/crossbeam-utils/README.md | 2 +- vendor/crossbeam-utils/benches/atomic_cell.rs | 8 +- .../crossbeam-utils/src/atomic/atomic_cell.rs | 27 +- vendor/crossbeam-utils/src/atomic/consume.rs | 14 +- vendor/crossbeam-utils/src/atomic/mod.rs | 5 + vendor/crossbeam-utils/src/atomic/seq_lock.rs | 14 +- .../src/atomic/seq_lock_wide.rs | 14 +- vendor/crossbeam-utils/src/backoff.rs | 15 +- vendor/crossbeam-utils/src/cache_padded.rs | 60 +- vendor/crossbeam-utils/src/lib.rs | 65 +- vendor/crossbeam-utils/src/sync/mod.rs | 2 + vendor/crossbeam-utils/src/sync/parker.rs | 110 +- vendor/crossbeam-utils/src/sync/wait_group.rs | 2 +- vendor/crossbeam-utils/src/thread.rs | 3 - vendor/crossbeam-utils/tests/cache_padded.rs | 4 +- vendor/crossbeam-utils/tests/parker.rs | 4 +- vendor/crossbeam-utils/tests/sharded_lock.rs | 7 +- vendor/cstr/.cargo-checksum.json | 1 + vendor/{const_fn => cstr}/Cargo.toml | 29 +- vendor/cstr/LICENSE | 25 + vendor/cstr/README.md | 30 + vendor/cstr/src/lib.rs | 65 + vendor/cstr/src/parse.rs | 225 + vendor/cstr/tests/clippy_lints.rs | 10 + vendor/cstr/tests/compile_fail/empty.rs | 5 + vendor/cstr/tests/compile_fail/empty.stderr | 7 + .../cstr/tests/compile_fail/interior-nul.rs | 5 + .../tests/compile_fail/interior-nul.stderr | 5 + vendor/cstr/tests/compile_fail/non-str.rs | 7 + vendor/cstr/tests/compile_fail/non-str.stderr | 17 + vendor/cstr/tests/compile_fail/trash-after.rs | 5 + .../tests/compile_fail/trash-after.stderr | 5 + vendor/cstr/tests/compile_test.rs | 6 + vendor/cstr/tests/pass/byte_str_lit.rs | 7 + vendor/cstr/tests/pass/const.rs | 10 + vendor/cstr/tests/pass/ident.rs | 9 + vendor/cstr/tests/pass/macro.rs | 21 + vendor/cstr/tests/pass/str_lit.rs | 8 + vendor/form_urlencoded/.cargo-checksum.json | 2 +- vendor/form_urlencoded/Cargo.toml | 3 +- vendor/form_urlencoded/src/lib.rs | 117 +- vendor/form_urlencoded/src/query_encoding.rs | 35 - .../generic-array-0.12.3/.cargo-checksum.json | 1 - vendor/generic-array-0.12.3/src/arr.rs | 57 - .../generic-array-0.12.4/.cargo-checksum.json | 1 + .../CHANGELOG.md | 99 +- .../Cargo.toml | 2 +- .../LICENSE | 40 +- .../README.md | 68 +- .../rustfmt.toml | 6 +- vendor/generic-array-0.12.4/src/arr.rs | 126 + .../src/functional.rs | 188 +- .../src/hex.rs | 204 +- .../src/impl_serde.rs | 216 +- .../src/impls.rs | 364 +- .../src/iter.rs | 378 +- .../src/lib.rs | 1264 +- .../src/sequence.rs | 640 +- .../tests/arr.rs | 54 +- .../tests/generics.rs | 194 +- .../tests/hex.rs | 122 +- .../tests/import_name.rs | 20 +- .../tests/iter.rs | 326 +- .../tests/mod.rs | 574 +- vendor/hashbrown-0.9.1/.cargo-checksum.json | 1 + vendor/hashbrown-0.9.1/CHANGELOG.md | 294 + vendor/hashbrown-0.9.1/Cargo.toml | 80 + .../LICENSE-APACHE | 0 .../LICENSE-MIT | 2 + vendor/hashbrown-0.9.1/README.md | 126 + vendor/hashbrown-0.9.1/benches/bench.rs | 260 + vendor/hashbrown-0.9.1/clippy.toml | 1 + .../src/external_trait_impls/mod.rs | 4 + .../src/external_trait_impls/rayon/helpers.rs | 26 + .../src/external_trait_impls/rayon/map.rs | 666 + .../src/external_trait_impls/rayon/mod.rs | 4 + .../src/external_trait_impls/rayon/raw.rs | 199 + .../src/external_trait_impls/rayon/set.rs | 646 + .../src/external_trait_impls/serde.rs | 200 + vendor/hashbrown-0.9.1/src/lib.rs | 112 + vendor/hashbrown-0.9.1/src/macros.rs | 69 + vendor/hashbrown-0.9.1/src/map.rs | 4524 ++++ vendor/hashbrown-0.9.1/src/raw/bitmask.rs | 122 + vendor/hashbrown-0.9.1/src/raw/generic.rs | 151 + vendor/hashbrown-0.9.1/src/raw/mod.rs | 1924 ++ vendor/hashbrown-0.9.1/src/raw/sse2.rs | 144 + vendor/hashbrown-0.9.1/src/rustc_entry.rs | 618 + vendor/hashbrown-0.9.1/src/scopeguard.rs | 49 + vendor/hashbrown-0.9.1/src/set.rs | 2119 ++ vendor/hashbrown-0.9.1/tests/hasher.rs | 65 + vendor/hashbrown-0.9.1/tests/rayon.rs | 533 + vendor/hashbrown-0.9.1/tests/serde.rs | 65 + vendor/hashbrown-0.9.1/tests/set.rs | 30 + vendor/hashbrown/.cargo-checksum.json | 2 +- vendor/hashbrown/CHANGELOG.md | 36 +- vendor/hashbrown/Cargo.toml | 16 +- vendor/hashbrown/README.md | 98 +- vendor/hashbrown/benches/bench.rs | 101 +- .../src/external_trait_impls/rayon/map.rs | 220 +- .../src/external_trait_impls/rayon/raw.rs | 58 +- .../src/external_trait_impls/rayon/set.rs | 141 +- vendor/hashbrown/src/lib.rs | 53 +- vendor/hashbrown/src/map.rs | 724 +- vendor/hashbrown/src/raw/alloc.rs | 72 + vendor/hashbrown/src/raw/generic.rs | 8 +- vendor/hashbrown/src/raw/mod.rs | 1224 +- vendor/hashbrown/src/raw/sse2.rs | 9 +- vendor/hashbrown/src/rustc_entry.rs | 58 +- vendor/hashbrown/src/scopeguard.rs | 8 +- vendor/hashbrown/src/set.rs | 426 +- vendor/hashbrown/tests/serde.rs | 22 +- vendor/idna/.cargo-checksum.json | 2 +- vendor/idna/Cargo.toml | 16 +- vendor/idna/benches/all.rs | 53 + vendor/idna/src/IdnaMappingTable.txt | 17132 ++++++++-------- vendor/idna/src/lib.rs | 4 +- vendor/idna/src/make_uts46_mapping_table.py | 47 +- vendor/idna/src/punycode.rs | 255 +- vendor/idna/src/uts46.rs | 683 +- vendor/idna/src/uts46_mapping_table.rs | 12901 ++++++------ vendor/idna/tests/IdnaTest.txt | 7848 ------- vendor/idna/tests/IdnaTestV2.txt | 6334 ++++++ vendor/idna/tests/punycode.rs | 20 +- vendor/idna/tests/tests.rs | 4 +- vendor/idna/tests/unit.rs | 137 +- vendor/idna/tests/uts46.rs | 199 +- vendor/indexmap/.cargo-checksum.json | 2 +- vendor/indexmap/Cargo.toml | 2 +- vendor/indexmap/README.rst | 11 + vendor/indexmap/src/map.rs | 30 +- vendor/indexmap/src/map/core.rs | 32 +- vendor/indexmap/src/map/core/raw.rs | 16 +- vendor/indexmap/src/set.rs | 8 +- vendor/libc/.cargo-checksum.json | 2 +- vendor/libc/Cargo.toml | 2 +- vendor/libc/build.rs | 7 + vendor/libc/src/cloudabi/aarch64.rs | 4 - vendor/libc/src/cloudabi/arm.rs | 4 - vendor/libc/src/cloudabi/mod.rs | 375 - vendor/libc/src/cloudabi/x86.rs | 4 - vendor/libc/src/cloudabi/x86_64.rs | 4 - vendor/libc/src/lib.rs | 6 - vendor/libc/src/unix/bsd/apple/mod.rs | 35 + .../src/unix/bsd/freebsdlike/dragonfly/mod.rs | 21 +- vendor/libc/src/unix/bsd/freebsdlike/mod.rs | 62 +- .../src/unix/bsd/netbsdlike/netbsd/mod.rs | 15 + vendor/libc/src/unix/haiku/mod.rs | 161 +- vendor/libc/src/unix/haiku/native.rs | 1146 ++ .../src/unix/linux_like/android/b32/arm.rs | 16 + .../unix/linux_like/android/b32/x86/mod.rs | 29 + .../src/unix/linux_like/android/b64/mod.rs | 16 + .../libc/src/unix/linux_like/android/mod.rs | 89 +- .../libc/src/unix/linux_like/linux/gnu/mod.rs | 67 +- vendor/libc/src/unix/linux_like/linux/mod.rs | 373 +- .../unix/linux_like/linux/musl/b64/mips64.rs | 62 +- .../src/unix/linux_like/linux/musl/b64/mod.rs | 3 + .../unix/linux_like/linux/musl/b64/s390x.rs | 763 + .../src/unix/linux_like/linux/musl/mod.rs | 48 +- .../src/unix/linux_like/linux/uclibc/align.rs | 28 + .../linux}/uclibc/arm/align.rs | 0 .../{ => linux_like/linux}/uclibc/arm/mod.rs | 311 +- .../linux}/uclibc/arm/no_align.rs | 0 .../linux}/uclibc/mips/mips32/align.rs | 0 .../linux}/uclibc/mips/mips32/mod.rs | 46 +- .../linux}/uclibc/mips/mips32/no_align.rs | 0 .../linux}/uclibc/mips/mips64/align.rs | 0 .../linux}/uclibc/mips/mips64/mod.rs | 0 .../linux}/uclibc/mips/mips64/no_align.rs | 0 .../{ => linux_like/linux}/uclibc/mips/mod.rs | 82 - .../src/unix/linux_like/linux/uclibc/mod.rs | 304 + .../{ => linux_like/linux}/uclibc/no_align.rs | 0 .../linux}/uclibc/x86_64/l4re.rs | 0 .../linux}/uclibc/x86_64/mod.rs | 81 +- .../linux}/uclibc/x86_64/other.rs | 0 vendor/libc/src/unix/linux_like/mod.rs | 124 +- vendor/libc/src/unix/mod.rs | 55 +- vendor/libc/src/unix/solarish/illumos.rs | 6 + vendor/libc/src/unix/solarish/mod.rs | 20 +- vendor/libc/src/unix/uclibc/align.rs | 66 - vendor/libc/src/unix/uclibc/mod.rs | 2365 --- vendor/libc/src/unix/uclibc/x86_64/align.rs | 77 - .../libc/src/unix/uclibc/x86_64/no_align.rs | 59 - vendor/libc/src/vxworks/mod.rs | 0 vendor/libc/src/wasi.rs | 111 +- vendor/mdbook/.cargo-checksum.json | 2 +- vendor/mdbook/CHANGELOG.md | 14 + vendor/mdbook/Cargo.lock | 6 +- vendor/mdbook/Cargo.toml | 4 +- .../renderer/html_handlebars/hbs_renderer.rs | 14 +- vendor/mdbook/src/theme/css/chrome.css | 2 +- vendor/mdbook/src/theme/css/general.css | 19 +- vendor/mdbook/src/theme/css/variables.css | 16 +- vendor/mdbook/tests/rendered_output.rs | 6 +- vendor/measureme/.cargo-checksum.json | 2 +- vendor/measureme/Cargo.toml | 13 +- vendor/measureme/src/counters.rs | 1012 + vendor/measureme/src/event_id.rs | 194 +- vendor/measureme/src/file_header.rs | 272 +- vendor/measureme/src/lib.rs | 114 +- vendor/measureme/src/profiler.rs | 341 +- vendor/measureme/src/raw_event.rs | 684 +- vendor/measureme/src/rustc.rs | 22 +- vendor/measureme/src/serialization.rs | 996 +- vendor/measureme/src/stringtable.rs | 656 +- vendor/memmap2/.cargo-checksum.json | 1 + vendor/memmap2/CHANGELOG.md | 31 + vendor/memmap2/Cargo.lock | 99 + vendor/memmap2/Cargo.toml | 26 + vendor/memmap2/LICENSE-APACHE | 201 + vendor/memmap2/LICENSE-MIT | 26 + vendor/memmap2/README.md | 33 + vendor/memmap2/examples/cat.rs | 23 + vendor/memmap2/src/lib.rs | 1199 ++ vendor/memmap2/src/unix.rs | 224 + vendor/memmap2/src/windows.rs | 426 + vendor/minifier/.cargo-checksum.json | 2 +- vendor/minifier/Cargo.lock | 99 +- vendor/minifier/Cargo.toml | 2 +- vendor/minifier/README.md | 2 - vendor/minifier/appveyor.yml | 27 - vendor/minifier/src/css/mod.rs | 24 +- vendor/minifier/src/css/{css.rs => tests.rs} | 47 +- vendor/minifier/src/css/token.rs | 622 +- vendor/minifier/src/html.rs | 146 +- vendor/minifier/src/js/mod.rs | 31 +- vendor/minifier/src/js/token.rs | 778 +- vendor/minifier/src/js/{js.rs => tools.rs} | 298 +- vendor/minifier/src/js/utils.rs | 126 +- vendor/minifier/src/json/json_minifier.rs | 6 +- vendor/minifier/src/json/mod.rs | 16 +- vendor/minifier/src/json/read/byte_to_char.rs | 24 +- .../minifier/src/json/read/internal_buffer.rs | 2 +- .../minifier/src/json/read/internal_reader.rs | 5 +- vendor/minifier/src/json/read/json_read.rs | 37 +- vendor/minifier/src/json/string.rs | 24 +- vendor/minifier/src/main.rs | 65 +- vendor/minifier/tests/js_minify.rs | 8 +- vendor/miniz_oxide/.cargo-checksum.json | 2 +- vendor/miniz_oxide/Cargo.toml | 4 +- vendor/miniz_oxide/src/deflate/core.rs | 8 +- vendor/miniz_oxide/src/inflate/core.rs | 2 +- .../miniz_oxide/src/inflate/output_buffer.rs | 4 +- vendor/miniz_oxide/src/inflate/stream.rs | 2 +- vendor/once_cell/.cargo-checksum.json | 2 +- vendor/once_cell/CHANGELOG.md | 22 + vendor/once_cell/Cargo.lock | 67 +- vendor/once_cell/Cargo.toml | 5 +- vendor/once_cell/README.md | 2 +- vendor/once_cell/src/imp_pl.rs | 45 +- vendor/once_cell/src/imp_std.rs | 20 +- vendor/once_cell/src/lib.rs | 45 +- vendor/once_cell/src/race.rs | 61 +- vendor/once_cell/tests/it.rs | 30 +- vendor/parking_lot_core/.cargo-checksum.json | 2 +- vendor/parking_lot_core/Cargo.toml | 6 +- .../perf-event-open-sys/.cargo-checksum.json | 1 + vendor/perf-event-open-sys/Cargo.toml | 23 + .../LICENSE-APACHE | 0 .../LICENSE-MIT | 0 vendor/perf-event-open-sys/README.md | 47 + vendor/perf-event-open-sys/regenerate.sh | 12 + vendor/perf-event-open-sys/src/bindings.rs | 2897 +++ vendor/perf-event-open-sys/src/lib.rs | 260 + vendor/perf-event-open-sys/wrapper.h | 23 + vendor/pin-project-lite/.cargo-checksum.json | 2 +- vendor/pin-project-lite/CHANGELOG.md | 51 +- vendor/pin-project-lite/Cargo.toml | 8 +- vendor/pin-project-lite/README.md | 8 +- vendor/pin-project-lite/src/lib.rs | 230 +- .../pin-project-lite/tests/auxiliary/mod.rs | 2 - vendor/pin-project-lite/tests/compiletest.rs | 2 +- vendor/pin-project-lite/tests/drop_order.rs | 3 +- .../pin-project-lite/tests/expand/README.md | 17 + .../tests/expand/default/enum.expanded.rs | 127 + .../tests/expand/default/enum.rs | 17 + .../tests/expand/default/struct.expanded.rs | 84 + .../tests/expand/default/struct.rs | 11 + .../tests/expand/multifields/enum.expanded.rs | 88 + .../tests/expand/multifields/enum.rs | 18 + .../expand/multifields/struct.expanded.rs | 152 + .../tests/expand/multifields/struct.rs | 15 + .../tests/expand/naming/enum-all.expanded.rs | 127 + .../tests/expand/naming/enum-all.rs | 17 + .../tests/expand/naming/enum-mut.expanded.rs | 57 + .../tests/expand/naming/enum-mut.rs | 15 + .../tests/expand/naming/enum-none.expanded.rs | 26 + .../tests/expand/naming/enum-none.rs | 14 + .../tests/expand/naming/enum-ref.expanded.rs | 57 + .../tests/expand/naming/enum-ref.rs | 15 + .../expand/naming/struct-all.expanded.rs | 117 + .../tests/expand/naming/struct-all.rs | 14 + .../expand/naming/struct-mut.expanded.rs | 84 + .../tests/expand/naming/struct-mut.rs | 12 + .../expand/naming/struct-none.expanded.rs | 84 + .../tests/expand/naming/struct-none.rs | 11 + .../expand/naming/struct-ref.expanded.rs | 84 + .../tests/expand/naming/struct-ref.rs | 12 + .../tests/expand/pub/enum.expanded.rs | 87 + .../pin-project-lite/tests/expand/pub/enum.rs | 16 + .../tests/expand/pub/struct.expanded.rs | 84 + .../tests/expand/pub/struct.rs | 11 + vendor/pin-project-lite/tests/expandtest.rs | 41 + vendor/pin-project-lite/tests/lint.rs | 5 +- vendor/pin-project-lite/tests/proper_unpin.rs | 3 +- vendor/pin-project-lite/tests/test.rs | 17 + vendor/pin-project-lite/tests/ui/packed.rs | 19 - .../pin-project-lite/tests/ui/packed.stderr | 55 - .../ui/{ => pin_project}/conflict-drop.rs | 0 .../ui/{ => pin_project}/conflict-drop.stderr | 0 .../ui/{ => pin_project}/conflict-unpin.rs | 0 .../{ => pin_project}/conflict-unpin.stderr | 0 .../ui/{ => pin_project}/invalid-bounds.rs | 0 .../{ => pin_project}/invalid-bounds.stderr | 0 .../tests/ui/{ => pin_project}/invalid.rs | 0 .../tests/ui/{ => pin_project}/invalid.stderr | 0 .../overlapping_lifetime_names.rs | 0 .../overlapping_lifetime_names.stderr | 0 .../overlapping_unpin_struct.rs | 0 .../overlapping_unpin_struct.stderr | 0 .../tests/ui/pin_project/packed.rs | 19 + .../tests/ui/pin_project/packed.stderr | 107 + .../ui/{ => pin_project}/unpin_sneaky.rs | 0 .../ui/{ => pin_project}/unpin_sneaky.stderr | 0 .../tests/ui/{ => pin_project}/unsupported.rs | 0 .../ui/{ => pin_project}/unsupported.stderr | 0 vendor/quote/.cargo-checksum.json | 2 +- vendor/quote/Cargo.toml | 2 +- vendor/quote/src/lib.rs | 9 +- .../{rand => rand-0.7.3}/.cargo-checksum.json | 0 vendor/{rand => rand-0.7.3}/CHANGELOG.md | 0 vendor/{rand => rand-0.7.3}/COPYRIGHT | 0 vendor/{rand => rand-0.7.3}/Cargo.lock | 0 vendor/{rand => rand-0.7.3}/Cargo.toml | 0 vendor/{rand => rand-0.7.3}/LICENSE-APACHE | 0 vendor/{rand => rand-0.7.3}/LICENSE-MIT | 0 vendor/{rand => rand-0.7.3}/README.md | 0 vendor/{rand => rand-0.7.3}/SECURITY.md | 0 .../benches/generators.rs | 0 vendor/{rand => rand-0.7.3}/benches/misc.rs | 0 vendor/{rand => rand-0.7.3}/benches/seq.rs | 0 .../{rand => rand-0.7.3}/benches/weighted.rs | 0 .../examples/monte-carlo.rs | 0 .../examples/monty-hall.rs | 0 vendor/{rand => rand-0.7.3}/rustfmt.toml | 0 .../src/distributions/bernoulli.rs | 0 .../src/distributions/binomial.rs | 0 .../src/distributions/cauchy.rs | 0 .../src/distributions/dirichlet.rs | 0 .../src/distributions/exponential.rs | 0 .../src/distributions/float.rs | 0 .../src/distributions/gamma.rs | 0 .../src/distributions/integer.rs | 0 .../src/distributions/mod.rs | 0 .../src/distributions/normal.rs | 0 .../src/distributions/other.rs | 0 .../src/distributions/pareto.rs | 0 .../src/distributions/poisson.rs | 0 .../src/distributions/triangular.rs | 0 .../src/distributions/uniform.rs | 0 .../src/distributions/unit_circle.rs | 0 .../src/distributions/unit_sphere.rs | 0 .../src/distributions/utils.rs | 0 .../src/distributions/weibull.rs | 0 .../distributions/weighted/alias_method.rs | 0 .../src/distributions/weighted/mod.rs | 0 .../src/distributions/ziggurat_tables.rs | 0 vendor/{rand => rand-0.7.3}/src/lib.rs | 0 vendor/{rand => rand-0.7.3}/src/prelude.rs | 0 .../src/rngs/adapter/mod.rs | 0 .../src/rngs/adapter/read.rs | 0 .../src/rngs/adapter/reseeding.rs | 0 .../{rand => rand-0.7.3}/src/rngs/entropy.rs | 0 vendor/{rand => rand-0.7.3}/src/rngs/mock.rs | 0 vendor/{rand => rand-0.7.3}/src/rngs/mod.rs | 0 vendor/{rand => rand-0.7.3}/src/rngs/small.rs | 0 vendor/{rand => rand-0.7.3}/src/rngs/std.rs | 0 .../{rand => rand-0.7.3}/src/rngs/thread.rs | 0 vendor/{rand => rand-0.7.3}/src/seq/index.rs | 0 vendor/{rand => rand-0.7.3}/src/seq/mod.rs | 0 .../.cargo-checksum.json | 0 .../CHANGELOG.md | 0 .../COPYRIGHT | 0 .../Cargo.toml | 0 .../LICENSE-APACHE | 0 .../LICENSE-MIT | 0 .../README.md | 0 .../src/chacha.rs | 0 .../src/guts.rs | 0 .../src/lib.rs | 0 .../.cargo-checksum.json | 0 .../CHANGELOG.md | 0 .../{rand_core => rand_core-0.5.1}/COPYRIGHT | 0 .../{rand_core => rand_core-0.5.1}/Cargo.toml | 0 .../LICENSE-APACHE | 0 .../LICENSE-MIT | 0 .../{rand_core => rand_core-0.5.1}/README.md | 0 .../src/block.rs | 0 .../src/error.rs | 0 .../src/impls.rs | 0 .../{rand_core => rand_core-0.5.1}/src/le.rs | 0 .../{rand_core => rand_core-0.5.1}/src/lib.rs | 0 .../{rand_core => rand_core-0.5.1}/src/os.rs | 0 .../.cargo-checksum.json | 0 .../{rand_hc => rand_hc-0.2.0}/CHANGELOG.md | 0 vendor/{rand_hc => rand_hc-0.2.0}/COPYRIGHT | 0 vendor/{rand_hc => rand_hc-0.2.0}/Cargo.toml | 0 .../{rand_hc => rand_hc-0.2.0}/LICENSE-APACHE | 0 vendor/{rand_hc => rand_hc-0.2.0}/LICENSE-MIT | 0 vendor/{rand_hc => rand_hc-0.2.0}/README.md | 0 .../{rand_hc => rand_hc-0.2.0}/src/hc128.rs | 0 vendor/{rand_hc => rand_hc-0.2.0}/src/lib.rs | 0 vendor/redox_syscall/.cargo-checksum.json | 2 +- vendor/redox_syscall/Cargo.toml | 2 +- vendor/redox_syscall/src/call.rs | 12 +- vendor/redox_syscall/src/scheme/mod.rs | 7 + vendor/redox_syscall/src/scheme/scheme.rs | 41 +- .../redox_syscall/src/scheme/scheme_block.rs | 41 +- .../src/scheme/scheme_block_mut.rs | 41 +- vendor/redox_syscall/src/scheme/scheme_mut.rs | 41 +- vendor/rustc-rayon-core/.cargo-checksum.json | 2 +- vendor/rustc-rayon-core/Cargo.toml | 13 +- vendor/rustc-rayon-core/README.md | 2 +- vendor/rustc-rayon-core/src/internal/mod.rs | 8 - vendor/rustc-rayon-core/src/internal/task.rs | 83 - .../rustc-rayon-core/src/internal/worker.rs | 67 - vendor/rustc-rayon-core/src/job.rs | 6 +- vendor/rustc-rayon-core/src/join/mod.rs | 15 +- vendor/rustc-rayon-core/src/join/test.rs | 10 +- vendor/rustc-rayon-core/src/latch.rs | 2 +- vendor/rustc-rayon-core/src/lib.rs | 51 +- vendor/rustc-rayon-core/src/log.rs | 2 +- vendor/rustc-rayon-core/src/private.rs | 6 +- vendor/rustc-rayon-core/src/registry.rs | 80 +- vendor/rustc-rayon-core/src/scope/internal.rs | 61 - vendor/rustc-rayon-core/src/scope/mod.rs | 15 +- vendor/rustc-rayon-core/src/scope/test.rs | 6 +- vendor/rustc-rayon-core/src/sleep/mod.rs | 6 +- vendor/rustc-rayon-core/src/spawn/mod.rs | 6 +- vendor/rustc-rayon-core/src/spawn/test.rs | 4 +- vendor/rustc-rayon-core/src/test.rs | 6 +- .../src/thread_pool/internal.rs | 65 - .../rustc-rayon-core/src/thread_pool/mod.rs | 40 +- .../rustc-rayon-core/src/thread_pool/test.rs | 12 +- vendor/rustc-rayon-core/src/worker_local.rs | 12 +- .../tests/double_init_fail.rs | 2 - .../tests/init_zero_threads.rs | 2 - vendor/rustc-rayon-core/tests/scope_join.rs | 2 - .../tests/scoped_threadpool.rs | 8 +- vendor/rustc-rayon-core/tests/simple_panic.rs | 2 - .../tests/stack_overflow_crash.rs | 4 - vendor/rustc-rayon/.cargo-checksum.json | 2 +- vendor/rustc-rayon/Cargo.lock | 424 +- vendor/rustc-rayon/Cargo.toml | 18 +- vendor/rustc-rayon/RELEASES.md | 55 + vendor/rustc-rayon/examples/cpu_monitor.rs | 8 +- .../src/collections/binary_heap.rs | 8 +- .../rustc-rayon/src/collections/btree_map.rs | 10 +- .../rustc-rayon/src/collections/btree_set.rs | 8 +- .../rustc-rayon/src/collections/hash_map.rs | 10 +- .../rustc-rayon/src/collections/hash_set.rs | 8 +- .../src/collections/linked_list.rs | 10 +- .../rustc-rayon/src/collections/vec_deque.rs | 12 +- vendor/rustc-rayon/src/iter/chunks.rs | 2 +- .../rustc-rayon/src/iter/collect/consumer.rs | 4 +- vendor/rustc-rayon/src/iter/collect/mod.rs | 2 +- vendor/rustc-rayon/src/iter/collect/test.rs | 2 +- vendor/rustc-rayon/src/iter/empty.rs | 5 +- vendor/rustc-rayon/src/iter/extend.rs | 7 +- vendor/rustc-rayon/src/iter/filter.rs | 4 +- vendor/rustc-rayon/src/iter/filter_map.rs | 4 +- vendor/rustc-rayon/src/iter/find.rs | 4 +- .../src/iter/find_first_last/mod.rs | 4 +- vendor/rustc-rayon/src/iter/flat_map.rs | 4 +- vendor/rustc-rayon/src/iter/fold.rs | 6 +- vendor/rustc-rayon/src/iter/for_each.rs | 2 +- vendor/rustc-rayon/src/iter/inspect.rs | 6 +- vendor/rustc-rayon/src/iter/map.rs | 6 +- vendor/rustc-rayon/src/iter/map_with.rs | 12 +- vendor/rustc-rayon/src/iter/mod.rs | 17 +- vendor/rustc-rayon/src/iter/multizip.rs | 338 + vendor/rustc-rayon/src/iter/once.rs | 4 +- vendor/rustc-rayon/src/iter/panic_fuse.rs | 2 +- vendor/rustc-rayon/src/iter/par_bridge.rs | 8 +- vendor/rustc-rayon/src/iter/plumbing/mod.rs | 8 +- vendor/rustc-rayon/src/iter/reduce.rs | 4 +- vendor/rustc-rayon/src/iter/splitter.rs | 2 +- vendor/rustc-rayon/src/iter/test.rs | 12 +- vendor/rustc-rayon/src/iter/try_fold.rs | 6 +- vendor/rustc-rayon/src/iter/try_reduce.rs | 4 +- .../rustc-rayon/src/iter/try_reduce_with.rs | 4 +- vendor/rustc-rayon/src/iter/unzip.rs | 6 +- vendor/rustc-rayon/src/iter/update.rs | 6 +- vendor/rustc-rayon/src/lib.rs | 24 +- vendor/rustc-rayon/src/option.rs | 9 +- vendor/rustc-rayon/src/par_either.rs | 6 +- vendor/rustc-rayon/src/prelude.rs | 22 +- vendor/rustc-rayon/src/private.rs | 6 +- vendor/rustc-rayon/src/range.rs | 6 +- vendor/rustc-rayon/src/range_inclusive.rs | 6 +- vendor/rustc-rayon/src/result.rs | 10 +- vendor/rustc-rayon/src/slice/mergesort.rs | 5 +- vendor/rustc-rayon/src/slice/mod.rs | 30 +- vendor/rustc-rayon/src/slice/quicksort.rs | 7 +- vendor/rustc-rayon/src/split_producer.rs | 4 +- vendor/rustc-rayon/src/str.rs | 14 +- vendor/rustc-rayon/src/vec.rs | 9 +- vendor/rustc-rayon/tests/clones.rs | 19 +- vendor/rustc-rayon/tests/debug.rs | 19 +- vendor/rustc-rayon/tests/intersperse.rs | 2 - vendor/rustc-rayon/tests/issue671-unzip.rs | 2 - vendor/rustc-rayon/tests/issue671.rs | 2 - vendor/rustc-rayon/tests/iter_panic.rs | 2 - vendor/rustc-rayon/tests/named-threads.rs | 2 - vendor/rustc-rayon/tests/octillion.rs | 2 - vendor/rustc-rayon/tests/producer_split_at.rs | 2 - vendor/rustc-rayon/tests/sort-panic-safe.rs | 7 +- vendor/rustc-rayon/tests/str.rs | 6 +- vendor/serde/.cargo-checksum.json | 2 +- vendor/serde/Cargo.toml | 4 +- vendor/serde/build.rs | 4 +- vendor/serde/src/de/impls.rs | 21 +- vendor/serde/src/lib.rs | 5 +- vendor/serde/src/private/de.rs | 37 +- vendor/serde_derive/.cargo-checksum.json | 2 +- vendor/serde_derive/Cargo.toml | 2 +- vendor/serde_derive/src/lib.rs | 5 +- vendor/serde_json/.cargo-checksum.json | 2 +- vendor/serde_json/Cargo.toml | 2 +- vendor/serde_json/src/de.rs | 6 +- vendor/serde_json/src/lib.rs | 2 +- vendor/serde_json/src/map.rs | 34 + vendor/serde_json/src/read.rs | 10 +- vendor/serde_json/src/value/mod.rs | 47 +- vendor/shlex/.cargo-checksum.json | 2 +- vendor/shlex/Cargo.toml | 22 +- vendor/shlex/LICENSE-APACHE | 13 + vendor/shlex/LICENSE-MIT | 21 + vendor/shlex/README.md | 25 + vendor/shlex/src/lib.rs | 32 +- vendor/snap/.cargo-checksum.json | 2 +- vendor/snap/Cargo.lock | 6 +- vendor/snap/Cargo.toml | 3 +- vendor/snap/README.md | 4 +- vendor/snap/data/COPYING | 23 - vendor/snap/data/Mark.Twain-Tom.Sawyer.txt | 396 - .../data/Mark.Twain-Tom.Sawyer.txt.rawsnappy | Bin 9871 -> 0 bytes vendor/snap/data/alice29.txt | 3609 ---- vendor/snap/data/asyoulik.txt | 4122 ---- vendor/snap/data/baddata1.snappy | Bin 27512 -> 0 bytes vendor/snap/data/baddata2.snappy | Bin 27483 -> 0 bytes vendor/snap/data/baddata3.snappy | Bin 28384 -> 0 bytes vendor/snap/data/fireworks.jpeg | Bin 123093 -> 0 bytes vendor/snap/data/geo.protodata | Bin 118588 -> 0 bytes vendor/snap/data/html | 1 - vendor/snap/data/html_x_4 | 1 - vendor/snap/data/kppkn.gtb | Bin 184320 -> 0 bytes vendor/snap/data/lcet10.txt | 7519 ------- vendor/snap/data/paper-100k.pdf | 598 - vendor/snap/data/plrabn12.txt | 10699 ---------- vendor/snap/data/urls.10K | 10000 --------- vendor/snap/src/error.rs | 2 +- vendor/snap/src/lib.rs | 2 +- vendor/snap/src/read.rs | 2 +- vendor/syn/.cargo-checksum.json | 2 +- vendor/syn/Cargo.toml | 2 +- vendor/syn/src/expr.rs | 12 +- vendor/syn/src/item.rs | 34 +- vendor/syn/src/lib.rs | 4 +- vendor/syn/src/lifetime.rs | 11 + vendor/syn/src/lit.rs | 18 + vendor/syn/src/punctuated.rs | 23 +- vendor/syn/tests/common/eq.rs | 87 +- vendor/syn/tests/repo/mod.rs | 4 +- vendor/syn/tests/test_item.rs | 25 + vendor/thread_local/.cargo-checksum.json | 2 +- vendor/thread_local/Cargo.toml | 2 +- vendor/thread_local/src/lib.rs | 27 + vendor/time/.cargo-checksum.json | 2 +- vendor/time/Cargo.toml | 4 +- vendor/time/src/lib.rs | 2 - vendor/time/src/sys.rs | 82 +- .../tracing-attributes/.cargo-checksum.json | 2 +- vendor/tracing-attributes/CHANGELOG.md | 37 +- vendor/tracing-attributes/Cargo.toml | 5 +- vendor/tracing-attributes/README.md | 8 +- vendor/tracing-attributes/src/lib.rs | 242 +- vendor/tracing-attributes/tests/async_fn.rs | 2 +- vendor/tracing-attributes/tests/err.rs | 85 + vendor/tracing-attributes/tests/instrument.rs | 29 + vendor/tracing-log/.cargo-checksum.json | 2 +- vendor/tracing-log/CHANGELOG.md | 26 + vendor/tracing-log/Cargo.toml | 14 +- vendor/tracing-log/LICENSE | 25 + vendor/tracing-log/README.md | 33 +- vendor/tracing-log/src/env_logger.rs | 2 - vendor/tracing-log/src/lib.rs | 243 +- vendor/tracing-log/src/log_tracer.rs | 61 +- vendor/tracing-log/src/trace_logger.rs | 8 +- vendor/tracing-log/tests/log_tracer.rs | 14 +- .../tracing-log/tests/reexport_log_crate.rs | 10 + .../tracing-subscriber/.cargo-checksum.json | 2 +- vendor/tracing-subscriber/CHANGELOG.md | 23 + vendor/tracing-subscriber/Cargo.toml | 12 +- vendor/tracing-subscriber/README.md | 2 +- .../src/filter/env/directive.rs | 67 +- .../tracing-subscriber/src/fmt/format/mod.rs | 68 + vendor/tracing-subscriber/src/fmt/mod.rs | 12 +- vendor/tracing-subscriber/src/lib.rs | 2 +- vendor/tracing-subscriber/src/util.rs | 17 +- vendor/tracing-subscriber/tests/filter_log.rs | 59 +- .../tests/fmt_max_level_hint.rs | 9 + .../tests/registry_max_level_hint.rs | 10 + vendor/tracing-tree/.cargo-checksum.json | 2 +- vendor/tracing-tree/Cargo.lock | 60 +- vendor/tracing-tree/Cargo.toml | 5 +- vendor/tracing-tree/examples/basic.stdout | 4 +- vendor/tracing-tree/examples/quiet.stdout | 4 +- vendor/tracing-tree/examples/stderr.stderr | 4 +- .../tracing-tree/examples/wraparound.stdout | 28 +- vendor/tracing-tree/src/format.rs | 48 +- vendor/tracing-tree/src/lib.rs | 14 +- vendor/tracing/.cargo-checksum.json | 2 +- vendor/tracing/CHANGELOG.md | 64 + vendor/tracing/Cargo.toml | 4 +- vendor/tracing/README.md | 19 +- vendor/tracing/src/level_filters.rs | 17 +- vendor/tracing/src/lib.rs | 14 +- vendor/tracing/src/macros.rs | 118 +- vendor/tracing/src/span.rs | 295 +- vendor/tracing/tests/macros.rs | 30 + vendor/tracing/tests/span.rs | 38 + vendor/tracing/tests/support/subscriber.rs | 2 +- .../.cargo-checksum.json | 2 +- vendor/unicode-normalization/Cargo.toml | 2 +- .../unicode-normalization/scripts/unicode.py | 62 +- vendor/unicode-normalization/src/lib.rs | 28 +- vendor/unicode-normalization/src/lookups.rs | 11 + .../src/no_std_prelude.rs | 0 vendor/unicode-normalization/src/normalize.rs | 36 +- vendor/unicode-normalization/src/replace.rs | 61 + .../unicode-normalization/src/stream_safe.rs | 22 +- vendor/unicode-normalization/src/tables.rs | 2009 ++ vendor/unified-diff/.cargo-checksum.json | 1 + vendor/unified-diff/Cargo.lock | 16 + vendor/unified-diff/Cargo.toml | 26 + vendor/unified-diff/LICENSE-APACHE | 176 + .../LICENSE-MIT | 0 vendor/unified-diff/README.md | 41 + vendor/unified-diff/src/lib.rs | 782 + vendor/unified-diff/src/main.rs | 55 + vendor/url/.cargo-checksum.json | 2 +- vendor/url/Cargo.toml | 4 +- vendor/url/src/host.rs | 28 +- vendor/url/src/lib.rs | 52 +- vendor/url/src/parser.rs | 10 +- vendor/url/src/path_segments.rs | 6 + vendor/url/src/quirks.rs | 6 + vendor/url/tests/data.rs | 233 + vendor/url/tests/setters_tests.json | 1876 ++ vendor/url/tests/unit.rs | 681 + vendor/url/tests/urltestdata.json | 6991 +++++++ .../.cargo-checksum.json | 1 - .../CODE_OF_CONDUCT.md | 49 - .../CONTRIBUTING.md | 8 - .../Cargo.toml | 43 - .../LICENSE-Apache-2.0_WITH_LLVM-exception | 220 - .../ORG_CODE_OF_CONDUCT.md | 143 - .../README.md | 76 - .../SECURITY.md | 29 - .../src/error.rs | 51 - .../src/lib.rs | 36 - .../src/lib_generated.rs | 1853 -- vendor/wasi/.cargo-checksum.json | 2 +- vendor/wasi/Cargo.toml | 2 +- .../old-bitflags.patch | 0 vendor/wasi/src/lib.rs | 12 - vendor/wasi/src/lib_generated.rs | 137 +- version | 2 +- 4395 files changed, 151740 insertions(+), 124653 deletions(-) create mode 100644 compiler/rustc_ast/src/ast_like.rs create mode 100644 compiler/rustc_builtin_macros/src/cfg_eval.rs create mode 100644 compiler/rustc_builtin_macros/src/derive.rs create mode 100644 compiler/rustc_codegen_cranelift/.cirrus.yml delete mode 100644 compiler/rustc_codegen_cranelift/build_sysroot/alloc_system/Cargo.toml create mode 100644 compiler/rustc_codegen_cranelift/crate_patches/0002-compiler-builtins-Disable-128bit-atomic-operations.patch rename compiler/rustc_codegen_cranelift/{build_sysroot/alloc_system/lib.rs => example/alloc_system.rs} (62%) create mode 100644 compiler/rustc_codegen_cranelift/patches/0027-Disable-128bit-atomic-operations.patch create mode 100644 compiler/rustc_codegen_cranelift/rustfmt.toml delete mode 100644 compiler/rustc_codegen_cranelift/src/atomic_shim.rs delete mode 100644 compiler/rustc_data_structures/src/const_cstr.rs delete mode 100644 compiler/rustc_error_codes/src/error_codes/E0202.md create mode 100644 compiler/rustc_error_codes/src/error_codes/E0542.md create mode 100644 compiler/rustc_error_codes/src/error_codes/E0543.md create mode 100644 compiler/rustc_error_codes/src/error_codes/E0545.md create mode 100644 compiler/rustc_error_codes/src/error_codes/E0547.md create mode 100644 compiler/rustc_error_codes/src/error_codes/E0549.md create mode 100644 compiler/rustc_hir/src/tests.rs create mode 100644 compiler/rustc_lint/src/noop_method_call.rs create mode 100644 compiler/rustc_middle/src/ty/adt.rs create mode 100644 compiler/rustc_middle/src/ty/assoc.rs create mode 100644 compiler/rustc_middle/src/ty/closure.rs create mode 100644 compiler/rustc_middle/src/ty/consts/valtree.rs create mode 100644 compiler/rustc_middle/src/ty/generics.rs delete mode 100644 compiler/rustc_middle/src/ty/query/job.rs delete mode 100644 compiler/rustc_middle/src/ty/query/plumbing.rs create mode 100644 compiler/rustc_mir/src/transform/const_goto.rs create mode 100644 compiler/rustc_mir/src/transform/deduplicate_blocks.rs create mode 100644 compiler/rustc_mir/src/transform/remove_storage_markers.rs delete mode 100644 compiler/rustc_mir_build/src/build/into.rs create mode 100644 compiler/rustc_mir_build/src/thir/arena.rs delete mode 100644 compiler/rustc_mir_build/src/thir/cx/to_ref.rs create mode 100644 compiler/rustc_parse/src/parser/attr_wrapper.rs create mode 100644 compiler/rustc_query_impl/Cargo.toml rename compiler/{rustc_middle/src/ty/query => rustc_query_impl/src}/README.md (100%) rename compiler/{rustc_middle/src/ty/query => rustc_query_impl/src}/keys.rs (79%) create mode 100644 compiler/rustc_query_impl/src/lib.rs create mode 100644 compiler/rustc_query_impl/src/plumbing.rs rename compiler/{rustc_middle/src/ty/query => rustc_query_impl/src}/profiling_support.rs (86%) rename compiler/{rustc_middle/src/ty/query => rustc_query_impl/src}/stats.rs (74%) rename compiler/{rustc_middle/src/ty/query => rustc_query_impl/src}/values.rs (75%) rename compiler/{rustc_ast => rustc_span}/src/crate_disambiguator.rs (100%) create mode 100644 compiler/rustc_target/src/spec/aarch64_apple_ios_sim.rs create mode 100644 compiler/rustc_target/src/spec/powerpc_unknown_openbsd.rs create mode 100644 compiler/rustc_target/src/spec/riscv32gc_unknown_linux_musl.rs create mode 100644 compiler/rustc_target/src/spec/riscv64gc_unknown_linux_musl.rs create mode 100644 compiler/rustc_target/src/spec/s390x_unknown_linux_musl.rs create mode 100644 compiler/rustc_target/src/spec/x86_64_pc_solaris.rs delete mode 100644 compiler/rustc_target/src/spec/x86_64_rumprun_netbsd.rs rename compiler/rustc_target/src/spec/{x86_64_unknown_hermit_kernel.rs => x86_64_unknown_none_hermitkernel.rs} (75%) rename compiler/rustc_target/src/spec/{x86_64_linux_kernel.rs => x86_64_unknown_none_linuxkernel.rs} (76%) create mode 100644 library/alloc/src/collections/btree/fix.rs create mode 100644 library/alloc/src/collections/btree/testing/crash_test.rs create mode 100644 library/alloc/src/collections/btree/testing/mod.rs rename library/alloc/src/collections/btree/{map/tests => testing}/ord_chaos.rs (100%) create mode 100644 library/alloc/src/collections/btree/testing/rng.rs create mode 100644 library/core/src/ptr/metadata.rs create mode 100644 library/core/src/slice/specialize.rs create mode 100644 library/core/tests/ops/control_flow.rs delete mode 100644 library/std/src/sys/hermit/pipe.rs create mode 100644 library/std/src/sys/unix/process/process_unix/tests.rs delete mode 100755 src/ci/docker/host-x86_64/dist-various-1/build-rumprun.sh delete mode 100755 src/ci/docker/host-x86_64/dist-various-2/x86_64-fortanix-unknown-sgx-clang-wrap.sh create mode 100755 src/ci/docker/scripts/cmake.sh create mode 100644 src/doc/embedded-book/.github/workflows/ci.yml delete mode 100644 src/doc/embedded-book/.travis.yml delete mode 100644 src/doc/embedded-book/CNAME delete mode 100644 src/doc/embedded-book/ci/after-success.sh delete mode 100644 src/doc/embedded-book/ci/install.sh delete mode 100644 src/doc/embedded-book/ci/script.sh delete mode 100644 src/doc/reference/src/expressions/enum-variant-expr.md delete mode 100644 src/doc/reference/src/memory-ownership.md create mode 100644 src/doc/rustc-dev-guide/.github/workflows/ci.yml create mode 100644 src/doc/rustc-dev-guide/.github/workflows/date-check.yml delete mode 100644 src/doc/rustc-dev-guide/.travis.yml create mode 100755 src/doc/rustc-dev-guide/ci/check-in.sh create mode 100644 src/doc/rustc-dev-guide/ci/date-check/Cargo.lock create mode 100644 src/doc/rustc-dev-guide/ci/date-check/Cargo.toml create mode 100644 src/doc/rustc-dev-guide/ci/date-check/src/main.rs create mode 100755 src/doc/rustc-dev-guide/ci/linkcheck.sh create mode 100644 src/doc/rustc-dev-guide/examples/rustc-driver-getting-diagnostics.rs create mode 100644 src/doc/rustc-dev-guide/examples/rustc-driver-interacting-with-the-ast.rs rename src/doc/rustc-dev-guide/src/{codegen => backend}/implicit-caller-location.md (94%) create mode 100644 src/doc/rustc-dev-guide/src/backend/inline-asm.md create mode 100644 src/doc/rustc-dev-guide/src/backend/libs-and-metadata.md create mode 100644 src/doc/rustc-dev-guide/src/building/new-target.md create mode 100644 src/doc/rustc-dev-guide/src/building/prerequisites.md create mode 100644 src/doc/rustc-dev-guide/src/cli.md create mode 100644 src/doc/rustc-dev-guide/src/contributing.md create mode 100644 src/doc/rustc-dev-guide/src/diagnostics/sessiondiagnostic.md create mode 100644 src/doc/rustc-dev-guide/src/early-late-bound.md create mode 100644 src/doc/rustc-dev-guide/src/feature-gates.md create mode 100644 src/doc/rustc-dev-guide/src/getting-started.md create mode 100644 src/doc/rustc-dev-guide/src/git.md delete mode 100644 src/doc/rustc-dev-guide/src/ice-breaker/about.md create mode 100644 src/doc/rustc-dev-guide/src/identifiers.md create mode 100644 src/doc/rustc-dev-guide/src/img/coverage-branch-counting-01.png create mode 100644 src/doc/rustc-dev-guide/src/img/coverage-graphviz-01.png create mode 100644 src/doc/rustc-dev-guide/src/img/coverage-spanview-01.png create mode 100644 src/doc/rustc-dev-guide/src/img/dataflow-graphviz-example.png create mode 100644 src/doc/rustc-dev-guide/src/img/llvm-cov-show-01.png create mode 100644 src/doc/rustc-dev-guide/src/img/wpa-initial-memory.png create mode 100644 src/doc/rustc-dev-guide/src/img/wpa-stack.png create mode 100644 src/doc/rustc-dev-guide/src/llvm-coverage-instrumentation.md create mode 100644 src/doc/rustc-dev-guide/src/mir/dataflow.md create mode 100644 src/doc/rustc-dev-guide/src/notification-groups/about.md create mode 100644 src/doc/rustc-dev-guide/src/notification-groups/arm.md rename src/doc/rustc-dev-guide/src/{ice-breaker => notification-groups}/cleanup-crew.md (100%) rename src/doc/rustc-dev-guide/src/{ice-breaker => notification-groups}/llvm.md (66%) create mode 100644 src/doc/rustc-dev-guide/src/notification-groups/risc-v.md create mode 100644 src/doc/rustc-dev-guide/src/notification-groups/windows.md create mode 100644 src/doc/rustc-dev-guide/src/parallel-rustc.md delete mode 100644 src/doc/rustc-dev-guide/src/part-1-intro.md create mode 100644 src/doc/rustc-dev-guide/src/profiling/wpa_profiling.md create mode 100644 src/doc/rustc-dev-guide/src/rustbot.md create mode 100644 src/doc/rustc-dev-guide/src/rustc-driver-getting-diagnostics.md create mode 100644 src/doc/rustc-dev-guide/src/rustdoc-internals.md create mode 100644 src/doc/rustc-dev-guide/src/serialization.md create mode 100644 src/doc/rustc-dev-guide/src/thir.md delete mode 100644 src/doc/rustc-dev-guide/src/traits/associated-types.md delete mode 100644 src/doc/rustc-dev-guide/src/traits/bibliography.md delete mode 100644 src/doc/rustc-dev-guide/src/traits/canonicalization.md delete mode 100644 src/doc/rustc-dev-guide/src/traits/chalk-overview.md create mode 100644 src/doc/rustc-dev-guide/src/traits/chalk.md delete mode 100644 src/doc/rustc-dev-guide/src/traits/implied-bounds.md delete mode 100644 src/doc/rustc-dev-guide/src/traits/index.md delete mode 100644 src/doc/rustc-dev-guide/src/traits/lowering-module.md delete mode 100644 src/doc/rustc-dev-guide/src/traits/lowering-rules.md delete mode 100644 src/doc/rustc-dev-guide/src/traits/regions.md delete mode 100644 src/doc/rustc-dev-guide/src/traits/slg.md delete mode 100644 src/doc/rustc-dev-guide/src/traits/wf.md create mode 100644 src/doc/rustc/src/tests/index.md create mode 100644 src/doc/unstable-book/src/compiler-flags/extern-location.md create mode 100644 src/doc/unstable-book/src/language-features/c-unwind.md delete mode 100644 src/doc/unstable-book/src/library-features/range-bounds-assert-len.md create mode 100644 src/librustdoc/html/render/context.rs create mode 100644 src/librustdoc/html/render/print_item.rs create mode 100644 src/librustdoc/html/render/write_shared.rs create mode 100644 src/librustdoc/html/static/FiraSans-Medium.woff2 create mode 100644 src/librustdoc/html/static/FiraSans-Regular.woff2 create mode 100644 src/librustdoc/lint.rs create mode 100644 src/rustdoc-json-types/tests.rs create mode 100644 src/test/assembly/stack-probes.rs create mode 100644 src/test/assembly/target-feature-multiple.rs create mode 100644 src/test/codegen/asm-sanitize-llvm.rs create mode 100644 src/test/codegen/codemodels.rs create mode 100644 src/test/codegen/debug-compile-unit-path.rs create mode 100644 src/test/codegen/enum-bounds-check-issue-82871.rs create mode 100644 src/test/codegen/issue-73031.rs create mode 100644 src/test/codegen/issue-75525-bounds-checks.rs create mode 100644 src/test/codegen/issue-75546.rs create mode 100644 src/test/codegen/issue-77812.rs delete mode 100644 src/test/codegen/loop.rs create mode 100644 src/test/codegen/non-terminate/nonempty-infinite-loop.rs delete mode 100644 src/test/codegen/target-feature-multiple.rs delete mode 100644 src/test/codegen/target-feature-on-functions.rs create mode 100644 src/test/codegen/target-feature-overrides.rs create mode 100644 src/test/codegen/unwind-abis/c-unwind-abi-panic-abort.rs create mode 100644 src/test/codegen/unwind-abis/c-unwind-abi.rs create mode 100644 src/test/codegen/unwind-abis/stdcall-unwind-abi.rs create mode 100644 src/test/codegen/unwind-abis/system-unwind-abi.rs create mode 100644 src/test/codegen/unwind-abis/thiscall-unwind-abi.rs create mode 100644 src/test/incremental/issue-82920-predicate-order-miscompile.rs create mode 100644 src/test/mir-opt/const_goto.issue_77355_opt.ConstGoto.diff create mode 100644 src/test/mir-opt/const_goto.rs create mode 100644 src/test/mir-opt/const_goto_const_eval_fail.f.ConstGoto.diff create mode 100644 src/test/mir-opt/const_goto_const_eval_fail.rs create mode 100644 src/test/mir-opt/deduplicate_blocks.is_line_doc_comment_2.DeduplicateBlocks.diff create mode 100644 src/test/mir-opt/deduplicate_blocks.rs create mode 100644 src/test/mir-opt/matches_reduce_branches.foo.PreCodegen.before.32bit.mir create mode 100644 src/test/mir-opt/matches_reduce_branches.foo.PreCodegen.before.64bit.mir create mode 100644 src/test/mir-opt/receiver-ptr-mutability.rs create mode 100644 src/test/mir-opt/receiver_ptr_mutability.main.mir_map.0.mir create mode 100644 src/test/mir-opt/remove_storage_markers.main.RemoveStorageMarkers.diff create mode 100644 src/test/mir-opt/remove_storage_markers.rs create mode 100644 src/test/pretty/macro_rules.rs create mode 100644 src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/Makefile create mode 100644 src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/add.c create mode 100644 src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/main.rs create mode 100644 src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/panic.rs create mode 100644 src/test/run-make-fulldeps/c-unwind-abi-catch-panic/Makefile create mode 100644 src/test/run-make-fulldeps/c-unwind-abi-catch-panic/add.c create mode 100644 src/test/run-make-fulldeps/c-unwind-abi-catch-panic/main.rs create mode 100644 src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.inline.txt create mode 100644 src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.display.-------.InstrumentCoverage.0.html rename src/test/run-make-fulldeps/coverage-spanview/{expected_mir_dump.partial_eq/partial_eq.{impl#2}-gt-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html => expected_mir_dump.inline/inline.error.-------.InstrumentCoverage.0.html} (62%) rename src/test/run-make-fulldeps/coverage-spanview/{expected_mir_dump.partial_eq/partial_eq.{impl#2}-ge-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html => expected_mir_dump.inline/inline.length.-------.InstrumentCoverage.0.html} (62%) rename src/test/run-make-fulldeps/coverage-spanview/{expected_mir_dump.partial_eq/partial_eq.{impl#2}-ge.-------.InstrumentCoverage.0.html => expected_mir_dump.inline/inline.main.-------.InstrumentCoverage.0.html} (54%) create mode 100644 src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.permutate.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.permutations.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.swap.-------.InstrumentCoverage.0.html delete mode 100644 src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-ge-{closure#0}.-------.InstrumentCoverage.0.html delete mode 100644 src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-gt-{closure#0}.-------.InstrumentCoverage.0.html delete mode 100644 src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-gt.-------.InstrumentCoverage.0.html delete mode 100644 src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-le-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html delete mode 100644 src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-le-{closure#0}.-------.InstrumentCoverage.0.html delete mode 100644 src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-le.-------.InstrumentCoverage.0.html delete mode 100644 src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-lt-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html delete mode 100644 src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-lt-{closure#0}.-------.InstrumentCoverage.0.html delete mode 100644 src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-lt.-------.InstrumentCoverage.0.html create mode 100644 src/test/run-make-fulldeps/coverage/inline.rs create mode 100644 src/test/run-make-fulldeps/print-unversioned-files/Makefile create mode 100644 src/test/run-make-fulldeps/print-unversioned-files/unversioned-files.txt create mode 100644 src/test/run-make-fulldeps/rustdoc-map-file/Makefile create mode 100644 src/test/run-make-fulldeps/rustdoc-map-file/expected.json create mode 100644 src/test/run-make-fulldeps/rustdoc-map-file/foo.rs create mode 100755 src/test/run-make-fulldeps/rustdoc-map-file/validate_json.py delete mode 100644 src/test/run-make-fulldeps/treat-err-as-bug/Makefile delete mode 100644 src/test/run-make-fulldeps/treat-err-as-bug/delay_span_bug.rs delete mode 100644 src/test/run-make-fulldeps/treat-err-as-bug/err.rs create mode 100644 src/test/run-make/issue-83112-incr-test-moved-file/Makefile create mode 100644 src/test/run-make/issue-83112-incr-test-moved-file/main.rs create mode 100644 src/test/run-make/libtest-thread-limit/Makefile create mode 100644 src/test/run-make/libtest-thread-limit/test.rs create mode 100644 src/test/rustdoc-gui/basic-code.goml create mode 100644 src/test/rustdoc-gui/basic.goml create mode 100644 src/test/rustdoc-gui/code-sidebar-toggle.goml create mode 100644 src/test/rustdoc-gui/lib.rs create mode 100644 src/test/rustdoc-gui/list_code_block.goml create mode 100644 src/test/rustdoc-gui/nojs-attr-pos.goml create mode 100644 src/test/rustdoc-gui/search-input-mobile.goml create mode 100644 src/test/rustdoc-gui/shortcuts.goml create mode 100644 src/test/rustdoc-gui/theme-change.goml create mode 100644 src/test/rustdoc-gui/toggle-docs.goml create mode 100644 src/test/rustdoc-json/fn_pointer/header.rs create mode 100644 src/test/rustdoc-json/fns/header.rs create mode 100644 src/test/rustdoc-json/method_abi.rs create mode 100644 src/test/rustdoc-json/methods/header.rs create mode 100644 src/test/rustdoc-json/reexport/glob_extern.rs create mode 100644 src/test/rustdoc-json/reexport/glob_private.rs create mode 100644 src/test/rustdoc-json/reexport/rename_public.rs create mode 100644 src/test/rustdoc-json/reexport/simple_private.rs create mode 100644 src/test/rustdoc-json/reexport/simple_public.rs create mode 100644 src/test/rustdoc-ui/commandline-argfile-badutf8.args create mode 100644 src/test/rustdoc-ui/commandline-argfile-badutf8.rs create mode 100644 src/test/rustdoc-ui/commandline-argfile-badutf8.stderr create mode 100644 src/test/rustdoc-ui/commandline-argfile-missing.rs create mode 100644 src/test/rustdoc-ui/commandline-argfile-missing.stderr create mode 100644 src/test/rustdoc-ui/commandline-argfile.args create mode 100644 src/test/rustdoc-ui/commandline-argfile.rs create mode 100644 src/test/rustdoc-ui/doc-attr.rs create mode 100644 src/test/rustdoc-ui/doc-attr.stderr create mode 100644 src/test/rustdoc-ui/doc-attr2.rs create mode 100644 src/test/rustdoc-ui/doc-attr2.stderr create mode 100644 src/test/rustdoc-ui/renamed-lint-still-applies.rs create mode 100644 src/test/rustdoc-ui/renamed-lint-still-applies.stderr create mode 100644 src/test/rustdoc-ui/rustc-check-passes.rs create mode 100644 src/test/rustdoc-ui/rustc-check-passes.stderr create mode 100644 src/test/rustdoc/asm-foreign.rs create mode 100644 src/test/rustdoc/asm-foreign2.rs create mode 100644 src/test/rustdoc/description.rs create mode 100644 src/test/rustdoc/description_default.rs create mode 100644 src/test/rustdoc/ensure-src-link.rs create mode 100644 src/test/rustdoc/intra-doc/issue-82209.rs create mode 100644 src/test/rustdoc/redirect-map-empty.rs create mode 100644 src/test/rustdoc/redirect-map.rs create mode 100644 src/test/rustdoc/sized_trait.rs create mode 100644 src/test/rustdoc/smart-punct.rs create mode 100644 src/test/rustdoc/spotlight-from-dependency.rs create mode 100644 src/test/rustdoc/src-links-auto-impls.rs create mode 100644 src/test/rustdoc/task-lists.rs rename src/test/ui/{ => abi}/nullable-pointer-ffi-compat.rs (100%) create mode 100644 src/test/ui/asm/inline-syntax.arm.stderr create mode 100644 src/test/ui/asm/inline-syntax.rs create mode 100644 src/test/ui/asm/inline-syntax.x86_64.stderr create mode 100644 src/test/ui/associated-type-bounds/ambiguous-associated-type2.rs create mode 100644 src/test/ui/associated-type-bounds/ambiguous-associated-type2.stderr create mode 100644 src/test/ui/associated-type-bounds/associated-item-through-where-clause.rs create mode 100644 src/test/ui/associated-type-bounds/duplicate.full_tait.stderr rename src/test/ui/associated-type-bounds/{duplicate.stderr => duplicate.min_tait.stderr} (91%) create mode 100644 src/test/ui/associated-type-bounds/handle-predicates-that-can-define-assoc-type.rs create mode 100644 src/test/ui/associated-type-bounds/missing-trait-bound-for-assoc-fails.rs create mode 100644 src/test/ui/associated-type-bounds/missing-trait-bound-for-assoc-fails.stderr create mode 100644 src/test/ui/associated-type-bounds/super-trait-referencing-self.rs create mode 100644 src/test/ui/associated-type-bounds/super-trait-referencing.rs create mode 100644 src/test/ui/associated-type-bounds/super-trait-where-referencing-self.rs create mode 100644 src/test/ui/associated-type-bounds/trait-alias-impl-trait.full_tait.stderr create mode 100644 src/test/ui/associated-type-bounds/traits-assoc-anonymized.rs create mode 100644 src/test/ui/associated-type-bounds/traits-assoc-type-macros.rs rename src/test/ui/{issues => associated-types}/issue-21726.rs (100%) rename src/test/ui/{issues => associated-types}/issue-22560.rs (100%) rename src/test/ui/{issues => associated-types}/issue-22560.stderr (100%) rename src/test/ui/{issues => associated-types}/issue-23595-2.rs (100%) rename src/test/ui/{issues => associated-types}/issue-23595-2.stderr (100%) rename src/test/ui/{issues => associated-types}/issue-24204.rs (100%) rename src/test/ui/{issues => associated-types}/issue-43784-associated-type.rs (100%) rename src/test/ui/{issues => associated-types}/issue-43784-associated-type.stderr (100%) create mode 100644 src/test/ui/associated-types/issue-63591.full_tait.stderr rename src/test/ui/{issues => associated-types}/issue-76179.rs (100%) rename src/test/ui/{ => associated-types}/project-defer-unification.rs (100%) create mode 100644 src/test/ui/async-await/generator-desc.rs create mode 100644 src/test/ui/async-await/generator-desc.stderr rename src/test/ui/{ => async-await}/issue-74047.rs (100%) rename src/test/ui/{ => async-await}/issue-74047.stderr (76%) rename src/test/ui/{issues => async-await}/issue-77993-2.rs (100%) rename src/test/ui/{issues => async-await}/issue-77993-2.stderr (100%) create mode 100644 src/test/ui/async-await/issues/issue-60655-latebound-regions.full_tait.stderr create mode 100644 src/test/ui/async-await/issues/issue-78600.rs create mode 100644 src/test/ui/async-await/issues/issue-78600.stderr rename src/test/ui/{ => async-await}/repeat_count_const_in_async_fn.rs (100%) create mode 100644 src/test/ui/attributes/attrs-on-params.rs create mode 100644 src/test/ui/attributes/attrs-on-params.stderr create mode 100644 src/test/ui/attributes/const-stability-on-macro.rs create mode 100644 src/test/ui/attributes/const-stability-on-macro.stderr create mode 100644 src/test/ui/attributes/doc-attr.rs create mode 100644 src/test/ui/attributes/doc-attr.stderr create mode 100644 src/test/ui/attributes/doc-attr2.rs create mode 100644 src/test/ui/attributes/doc-attr2.stderr create mode 100644 src/test/ui/auxiliary/legacy-const-generics.rs rename src/test/ui/{issues => borrowck}/issue-42344.rs (100%) rename src/test/ui/{issues => borrowck}/issue-42344.stderr (100%) create mode 100644 src/test/ui/borrowck/issue-81365-1.rs create mode 100644 src/test/ui/borrowck/issue-81365-1.stderr create mode 100644 src/test/ui/borrowck/issue-81365-10.rs create mode 100644 src/test/ui/borrowck/issue-81365-10.stderr create mode 100644 src/test/ui/borrowck/issue-81365-11.rs create mode 100644 src/test/ui/borrowck/issue-81365-11.stderr create mode 100644 src/test/ui/borrowck/issue-81365-2.rs create mode 100644 src/test/ui/borrowck/issue-81365-2.stderr create mode 100644 src/test/ui/borrowck/issue-81365-3.rs create mode 100644 src/test/ui/borrowck/issue-81365-3.stderr create mode 100644 src/test/ui/borrowck/issue-81365-4.rs create mode 100644 src/test/ui/borrowck/issue-81365-4.stderr create mode 100644 src/test/ui/borrowck/issue-81365-5.rs create mode 100644 src/test/ui/borrowck/issue-81365-5.stderr create mode 100644 src/test/ui/borrowck/issue-81365-6.rs create mode 100644 src/test/ui/borrowck/issue-81365-6.stderr create mode 100644 src/test/ui/borrowck/issue-81365-7.rs create mode 100644 src/test/ui/borrowck/issue-81365-7.stderr create mode 100644 src/test/ui/borrowck/issue-81365-8.rs create mode 100644 src/test/ui/borrowck/issue-81365-8.stderr create mode 100644 src/test/ui/borrowck/issue-81365-9.rs create mode 100644 src/test/ui/borrowck/issue-81365-9.stderr create mode 100644 src/test/ui/borrowck/issue-82032.rs create mode 100644 src/test/ui/borrowck/issue-82032.stderr create mode 100644 src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.rs create mode 100644 src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.stderr delete mode 100644 src/test/ui/check-doc-alias-attr.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-array-diagnostics.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-array-diagnostics.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/diagnostics/liveness.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/diagnostics/liveness.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/diagnostics/liveness_unintentional_copy.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/diagnostics/liveness_unintentional_copy.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/diagnostics/repr_packed.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/diagnostics/repr_packed.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/migrations/precise.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/migrations/precise.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/migrations/precise_no_migrations.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/pattern-matching-should-fail.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/pattern-matching-should-fail.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/patterns-capture-analysis.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/patterns-capture-analysis.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/repr_packed.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/repr_packed.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/capture_with_wildcard_match.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/capture_with_wildcard_match.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/destructure-pattern-closure-within-closure.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/destructure-pattern-closure-within-closure.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/destructure_patterns.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/destructure_patterns.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/drop_then_use_fake_reads.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/drop_then_use_fake_reads.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/lit-pattern-matching-with-methods.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/lit-pattern-matching-with-methods.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/struct-pattern-matching-with-methods.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/struct-pattern-matching-with-methods.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/tuple-struct-pattern-matching-with-methods.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/tuple-struct-pattern-matching-with-methods.stderr create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/use_of_mutable_borrow_and_fake_reads.rs create mode 100644 src/test/ui/closures/2229_closure_analysis/run_pass/use_of_mutable_borrow_and_fake_reads.stderr create mode 100644 src/test/ui/closures/issue-82438-mut-without-upvar.rs create mode 100644 src/test/ui/closures/issue-82438-mut-without-upvar.stderr create mode 100644 src/test/ui/conditional-compilation/inner-cfg-non-inline-mod.rs create mode 100644 src/test/ui/conditional-compilation/module_with_cfg.rs create mode 100644 src/test/ui/const-generics/conservative_is_privately_uninhabited_uses_correct_param_env-1.rs create mode 100644 src/test/ui/const-generics/conservative_is_privately_uninhabited_uses_correct_param_env-2.rs create mode 100644 src/test/ui/const-generics/diagnostics.rs create mode 100644 src/test/ui/const-generics/diagnostics.stderr create mode 100644 src/test/ui/const-generics/dont-evaluate-array-len-on-err-1.rs create mode 100644 src/test/ui/const-generics/dont-evaluate-array-len-on-err-1.stderr create mode 100644 src/test/ui/const-generics/issue-79518-default_trait_method_normalization.rs create mode 100644 src/test/ui/const-generics/issue-79518-default_trait_method_normalization.stderr create mode 100644 src/test/ui/const-generics/issue-80561-incorrect-param-env.rs create mode 100644 src/test/ui/const-generics/type_mismatch.rs create mode 100644 src/test/ui/const-generics/type_mismatch.stderr create mode 100644 src/test/ui/const-generics/type_not_in_scope.rs create mode 100644 src/test/ui/const-generics/type_not_in_scope.stderr create mode 100644 src/test/ui/const-ptr/ptr_to_usize_cast.rs create mode 100644 src/test/ui/const-ptr/ptr_to_usize_cast.stderr rename src/test/ui/{issues => consts}/auxiliary/issue-17718-aux.rs (100%) create mode 100644 src/test/ui/consts/const-as-fn.rs create mode 100644 src/test/ui/consts/const-as-fn.stderr rename src/test/ui/consts/const-eval/{ub-ref.rs => ub-ref-ptr.rs} (83%) rename src/test/ui/consts/const-eval/{ub-ref.stderr => ub-ref-ptr.stderr} (77%) create mode 100644 src/test/ui/consts/const-fn-in-vec.rs create mode 100644 src/test/ui/consts/const-fn-in-vec.stderr create mode 100644 src/test/ui/consts/copy-intrinsic.rs create mode 100644 src/test/ui/consts/copy-intrinsic.stderr rename src/test/ui/{issues => consts}/issue-13837.rs (100%) rename src/test/ui/{issues => consts}/issue-17718-references.rs (100%) rename src/test/ui/{issues => consts}/issue-17718-references.stderr (100%) rename src/test/ui/{issues => consts}/issue-17718.rs (100%) rename src/test/ui/{issues => consts}/issue-32829.rs (100%) rename src/test/ui/{issues => consts}/issue-32829.stderr (100%) rename src/test/ui/{issues => consts}/issue-33537.rs (100%) rename src/test/ui/{issues => consts}/issue-3521.fixed (100%) rename src/test/ui/{issues => consts}/issue-3521.rs (100%) rename src/test/ui/{issues => consts}/issue-3521.stderr (100%) create mode 100644 src/test/ui/consts/issue-66693-panic-in-array-len.rs create mode 100644 src/test/ui/consts/issue-66693-panic-in-array-len.stderr create mode 100644 src/test/ui/consts/issue-66693.rs create mode 100644 src/test/ui/consts/issue-66693.stderr rename src/test/ui/{ => consts}/rvalue-static-promotion.rs (100%) rename src/test/ui/{ => consts}/write-to-static-mut-in-static.rs (100%) rename src/test/ui/{ => consts}/write-to-static-mut-in-static.stderr (100%) delete mode 100644 src/test/ui/cycle-projection-based-on-where-clause.rs delete mode 100644 src/test/ui/cycle-projection-based-on-where-clause.stderr create mode 100644 src/test/ui/debuginfo-emit-llvm-ir-and-split-debuginfo.rs create mode 100644 src/test/ui/derives/derive-deadlock.rs create mode 100644 src/test/ui/derives/derive-deadlock.stderr create mode 100644 src/test/ui/derives/derive-multiple-with-packed.rs create mode 100644 src/test/ui/derives/derive-partial-ord.rs create mode 100644 src/test/ui/derives/derive-renamed.rs delete mode 100644 src/test/ui/derives/deriving-meta-empty-trait-list.stderr delete mode 100644 src/test/ui/did_you_mean/pub-macro-rules.rs delete mode 100644 src/test/ui/did_you_mean/pub-macro-rules.stderr create mode 100644 src/test/ui/editions-crate-root-2015.rs create mode 100644 src/test/ui/editions-crate-root-2015.stderr create mode 100644 src/test/ui/editions-crate-root-2018.rs create mode 100644 src/test/ui/editions-crate-root-2018.stderr delete mode 100644 src/test/ui/emit-artifact-notifications.nll.stderr delete mode 100644 src/test/ui/emit-artifact-notifications.polonius.stderr delete mode 100644 src/test/ui/emit-artifact-notifications.stderr rename src/test/ui/{expr-if-panic.rs => expr/if/expr-if-panic-pass.rs} (100%) rename src/test/ui/{issues => expr/if}/issue-4201.rs (100%) rename src/test/ui/{issues => expr/if}/issue-4201.stderr (100%) create mode 100644 src/test/ui/feature-gates/feature-gate-inherent_associated_types.rs create mode 100644 src/test/ui/feature-gates/feature-gate-inherent_associated_types.stderr create mode 100644 src/test/ui/feature-gates/feature-gate-min_type_alias_impl_trait.rs create mode 100644 src/test/ui/feature-gates/feature-gate-min_type_alias_impl_trait.stderr create mode 100644 src/test/ui/feature-gates/feature-gate-pub_macro_rules.rs create mode 100644 src/test/ui/feature-gates/feature-gate-pub_macro_rules.stderr delete mode 100644 src/test/ui/feature-gates/feature-gate-unsafe_block_in_unsafe_fn.rs delete mode 100644 src/test/ui/feature-gates/feature-gate-unsafe_block_in_unsafe_fn.stderr rename src/test/ui/{ => for-loop-while}/cleanup-rvalue-during-if-and-while.rs (100%) create mode 100644 src/test/ui/generator/layout-error.full_tait.stderr create mode 100644 src/test/ui/generator/layout-error.min_tait.stderr delete mode 100644 src/test/ui/generator/layout-error.stderr create mode 100644 src/test/ui/generator/metadata-sufficient-for-layout.full_tait.stderr create mode 100644 src/test/ui/generator/metadata-sufficient-for-layout.min_tait.stderr create mode 100644 src/test/ui/generator/yield-outside-generator-issue-78653.rs create mode 100644 src/test/ui/generator/yield-outside-generator-issue-78653.stderr create mode 100644 src/test/ui/generic-associated-types/const-generics-gat-in-trait-return-type-1.rs create mode 100644 src/test/ui/generic-associated-types/const-generics-gat-in-trait-return-type-2.rs create mode 100644 src/test/ui/generic-associated-types/const-generics-gat-in-trait-return-type-3.rs create mode 100644 src/test/ui/generic-associated-types/constraint-assoc-type-suggestion.rs create mode 100644 src/test/ui/generic-associated-types/constraint-assoc-type-suggestion.stderr create mode 100644 src/test/ui/generic-associated-types/generic-associated-type-bounds.rs create mode 100644 src/test/ui/generic-associated-types/issue-81712-cyclic-traits.rs create mode 100644 src/test/ui/generic-associated-types/issue-81712-cyclic-traits.stderr create mode 100644 src/test/ui/generic-associated-types/method-unsatified-assoc-type-predicate.rs create mode 100644 src/test/ui/generic-associated-types/method-unsatified-assoc-type-predicate.stderr create mode 100644 src/test/ui/generic-associated-types/projection-type-lifetime-mismatch.rs create mode 100644 src/test/ui/generic-associated-types/projection-type-lifetime-mismatch.stderr create mode 100644 src/test/ui/generic-associated-types/unsatified-item-lifetime-bound.rs create mode 100644 src/test/ui/generic-associated-types/unsatified-item-lifetime-bound.stderr create mode 100644 src/test/ui/generics/issue-32498.rs rename src/test/ui/{issues => hygiene}/issue-40847.rs (100%) create mode 100644 src/test/ui/impl-trait/associated-impl-trait-type-generic-trait.full_tait.stderr create mode 100644 src/test/ui/impl-trait/associated-impl-trait-type-trivial.full_tait.stderr create mode 100644 src/test/ui/impl-trait/associated-impl-trait-type.full_tait.stderr create mode 100644 src/test/ui/impl-trait/auto-trait.full_tait.stderr rename src/test/ui/impl-trait/{auto-trait.stderr => auto-trait.min_tait.stderr} (93%) create mode 100644 src/test/ui/impl-trait/impl-trait-in-macro.rs create mode 100644 src/test/ui/impl-trait/impl-trait-in-macro.stderr create mode 100644 src/test/ui/impl-trait/issue-55872-1.full_tait.stderr rename src/test/ui/impl-trait/{issue-55872-1.stderr => issue-55872-1.min_tait.stderr} (91%) create mode 100644 src/test/ui/impl-trait/issue-55872-2.full_tait.stderr rename src/test/ui/impl-trait/{issue-55872-2.stderr => issue-55872-2.min_tait.stderr} (89%) create mode 100644 src/test/ui/impl-trait/issue-55872.full_tait.stderr rename src/test/ui/impl-trait/{issue-55872.stderr => issue-55872.min_tait.stderr} (89%) create mode 100644 src/test/ui/impl-trait/issues/issue-53457.full_tait.stderr rename src/test/ui/impl-trait/issues/{issue-70877.stderr => issue-70877.full_tait.stderr} (95%) create mode 100644 src/test/ui/impl-trait/issues/issue-70877.min_tait.stderr create mode 100644 src/test/ui/impl-trait/issues/issue-78722.full_tait.stderr rename src/test/ui/impl-trait/issues/{issue-78722.stderr => issue-78722.min_tait.stderr} (89%) create mode 100644 src/test/ui/impl-trait/multiple-lifetimes/error-handling-2.full_tait.stderr rename src/test/ui/impl-trait/multiple-lifetimes/{error-handling-2.stderr => error-handling-2.min_tait.stderr} (82%) create mode 100644 src/test/ui/impl-trait/multiple-lifetimes/error-handling.full_tait.stderr rename src/test/ui/impl-trait/multiple-lifetimes/{error-handling.stderr => error-handling.min_tait.stderr} (92%) create mode 100644 src/test/ui/impl-trait/negative-reasoning.full_tait.stderr rename src/test/ui/impl-trait/{negative-reasoning.stderr => negative-reasoning.min_tait.stderr} (94%) create mode 100644 src/test/ui/impl-trait/type-alias-generic-param.full_tait.stderr create mode 100644 src/test/ui/impl-trait/type-alias-impl-trait-in-fn-body.full_tait.stderr rename src/test/ui/{ => invalid}/invalid-rustc_args_required_const-arguments.rs (100%) rename src/test/ui/{ => invalid}/invalid-rustc_args_required_const-arguments.stderr (100%) create mode 100644 src/test/ui/invalid/invalid-rustc_legacy_const_generics-arguments.rs create mode 100644 src/test/ui/invalid/invalid-rustc_legacy_const_generics-arguments.stderr create mode 100644 src/test/ui/invalid/invalid_rustc_layout_scalar_valid_range.rs create mode 100644 src/test/ui/invalid/invalid_rustc_layout_scalar_valid_range.stderr delete mode 100644 src/test/ui/issues/issue-22673.stderr delete mode 100644 src/test/ui/issues/issue-2633-2.rs delete mode 100644 src/test/ui/issues/issue-2633.rs create mode 100644 src/test/ui/issues/issue-29821.rs create mode 100644 src/test/ui/issues/issue-60662.full_tait.stderr rename src/test/ui/issues/{issue-60662.stdout => issue-60662.full_tait.stdout} (68%) create mode 100644 src/test/ui/issues/issue-60662.min_tait.stdout create mode 100644 src/test/ui/issues/issue-79744.rs create mode 100644 src/test/ui/issues/issue-79744.stderr create mode 100644 src/test/ui/issues/issue-81584.fixed create mode 100644 src/test/ui/issues/issue-81584.rs create mode 100644 src/test/ui/issues/issue-81584.stderr create mode 100644 src/test/ui/issues/issue-81885.rs create mode 100644 src/test/ui/issues/issue-81885.stderr create mode 100644 src/test/ui/issues/issue-81918.rs create mode 100644 src/test/ui/issues/issue-82833-slice-miscompile.rs create mode 100644 src/test/ui/issues/issue-82859-slice-miscompile.rs create mode 100644 src/test/ui/issues/issue-82869.rs create mode 100644 src/test/ui/issues/issue-82869.stderr create mode 100644 src/test/ui/layout/hexagon-enum.rs create mode 100644 src/test/ui/layout/hexagon-enum.stderr create mode 100644 src/test/ui/legacy-const-generics-bad.rs create mode 100644 src/test/ui/legacy-const-generics-bad.stderr create mode 100644 src/test/ui/legacy-const-generics.rs create mode 100644 src/test/ui/lifetimes/undeclared-lifetime-used-in-debug-macro-issue-70152.rs create mode 100644 src/test/ui/lifetimes/undeclared-lifetime-used-in-debug-macro-issue-70152.stderr rename src/test/ui/{ => limits}/huge-array-simple-32.rs (100%) rename src/test/ui/{ => limits}/huge-array-simple-32.stderr (100%) rename src/test/ui/{ => limits}/huge-array-simple-64.rs (100%) rename src/test/ui/{ => limits}/huge-array-simple-64.stderr (100%) rename src/test/ui/{ => limits}/huge-array.rs (100%) rename src/test/ui/{ => limits}/huge-array.stderr (100%) rename src/test/ui/{ => limits}/huge-enum.rs (100%) rename src/test/ui/{ => limits}/huge-enum.stderr (100%) rename src/test/ui/{ => limits}/huge-struct.rs (100%) rename src/test/ui/{ => limits}/huge-struct.stderr (100%) rename src/test/ui/{issues => limits}/issue-15919-32.rs (100%) rename src/test/ui/{issues => limits}/issue-15919-32.stderr (100%) rename src/test/ui/{issues => limits}/issue-15919-64.rs (100%) rename src/test/ui/{issues => limits}/issue-15919-64.stderr (100%) rename src/test/ui/{issues => limits}/issue-17913.rs (100%) rename src/test/ui/{issues => limits}/issue-17913.stderr (100%) rename src/test/ui/{consts => limits}/issue-55878.rs (100%) rename src/test/ui/{consts => limits}/issue-55878.stderr (100%) rename src/test/ui/{consts => limits}/issue-56762.rs (100%) rename src/test/ui/{consts => limits}/issue-56762.stderr (100%) rename src/test/ui/{lint => limits}/issue-69485-var-size-diffs-too-large.rs (100%) rename src/test/ui/{lint => limits}/issue-69485-var-size-diffs-too-large.stderr (100%) create mode 100644 src/test/ui/limits/issue-75158-64.rs create mode 100644 src/test/ui/limits/issue-75158-64.stderr create mode 100644 src/test/ui/lint/auxiliary/unaligned_references_external_crate.rs create mode 100644 src/test/ui/lint/bare-trait-objects-path.rs create mode 100644 src/test/ui/lint/bare-trait-objects-path.stderr create mode 100644 src/test/ui/lint/dead-code/write-only-field.rs create mode 100644 src/test/ui/lint/dead-code/write-only-field.stderr create mode 100644 src/test/ui/lint/inline-trait-and-foreign-items.full_tait.stderr rename src/test/ui/lint/{inline-trait-and-foreign-items.stderr => inline-trait-and-foreign-items.min_tait.stderr} (85%) rename src/test/ui/{issues => lint}/issue-31924-non-snake-ffi.rs (100%) create mode 100644 src/test/ui/lint/issue-81314-unused-span-ident.fixed create mode 100644 src/test/ui/lint/issue-81314-unused-span-ident.rs create mode 100644 src/test/ui/lint/issue-81314-unused-span-ident.stderr create mode 100644 src/test/ui/lint/lint-ctypes-73249-2.full_tait.stderr rename src/test/ui/lint/{lint-ctypes-73249-2.stderr => lint-ctypes-73249-2.min_tait.stderr} (81%) create mode 100644 src/test/ui/lint/lint-ctypes-73249-3.full_tait.stderr rename src/test/ui/lint/{lint-ctypes-73249-3.stderr => lint-ctypes-73249-3.min_tait.stderr} (81%) create mode 100644 src/test/ui/lint/lint-ctypes-73249-5.full_tait.stderr rename src/test/ui/lint/{lint-ctypes-73249-5.stderr => lint-ctypes-73249-5.min_tait.stderr} (81%) create mode 100644 src/test/ui/lint/lint-ctypes-73251-1.full_tait.stderr rename src/test/ui/lint/{lint-ctypes-73251-1.stderr => lint-ctypes-73251-1.min_tait.stderr} (82%) create mode 100644 src/test/ui/lint/lint-ctypes-73251-2.full_tait.stderr rename src/test/ui/lint/{lint-ctypes-73251-2.stderr => lint-ctypes-73251-2.min_tait.stderr} (83%) create mode 100644 src/test/ui/lint/lint-ctypes-73251.full_tait.stderr rename src/test/ui/{ => lint}/lint-expr-stmt-attrs-for-early-lints.rs (100%) create mode 100644 src/test/ui/lint/noop-method-call.rs create mode 100644 src/test/ui/lint/noop-method-call.stderr create mode 100644 src/test/ui/lint/opaque-ty-ffi-unsafe.full_tait.stderr rename src/test/ui/lint/{opaque-ty-ffi-unsafe.stderr => opaque-ty-ffi-unsafe.min_tait.stderr} (80%) create mode 100644 src/test/ui/lint/recommend-literal.rs create mode 100644 src/test/ui/lint/recommend-literal.stderr create mode 100644 src/test/ui/lint/register-tool-lint.rs create mode 100644 src/test/ui/lint/register-tool-lint.stderr create mode 100644 src/test/ui/lint/renamed-lints-still-apply.rs create mode 100644 src/test/ui/lint/renamed-lints-still-apply.stderr create mode 100644 src/test/ui/lint/rustdoc-group.rs create mode 100644 src/test/ui/lint/rustdoc-group.stderr create mode 100644 src/test/ui/lint/rustdoc-renamed.rs create mode 100644 src/test/ui/lint/rustdoc-renamed.stderr create mode 100644 src/test/ui/lint/unaligned_references_external_macro.rs create mode 100644 src/test/ui/lint/unaligned_references_external_macro.stderr create mode 100644 src/test/ui/lint/unused_variables-issue-82488.fixed create mode 100644 src/test/ui/lint/unused_variables-issue-82488.rs create mode 100644 src/test/ui/lint/unused_variables-issue-82488.stderr create mode 100644 src/test/ui/loops/issue-82916.rs create mode 100644 src/test/ui/loops/issue-82916.stderr create mode 100644 src/test/ui/macros/assert-eq-macro-msg.rs create mode 100644 src/test/ui/macros/assert-format-lazy.rs create mode 100644 src/test/ui/macros/assert-matches-macro-msg.rs create mode 100644 src/test/ui/macros/assert-ne-macro-msg.rs rename src/test/ui/{ => macros}/html-literals.rs (100%) create mode 100644 src/test/ui/macros/macro-export-on-modularized-macros.rs create mode 100644 src/test/ui/macros/macro-export-on-modularized-macros.stderr create mode 100644 src/test/ui/macros/pub-macro-rules-fail.rs create mode 100644 src/test/ui/macros/pub-macro-rules-fail.stderr create mode 100644 src/test/ui/macros/pub-macro-rules.rs create mode 100644 src/test/ui/mir/issue-75053.full_tait.stderr create mode 100644 src/test/ui/mir/issue-75053.in_bindings.stderr create mode 100644 src/test/ui/mir/issue-75053.min_tait.stderr delete mode 100644 src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.rs delete mode 100644 src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.stderr create mode 100644 src/test/ui/modules/path-no-file-name.rs create mode 100644 src/test/ui/modules/path-no-file-name.stderr rename src/test/ui/{issues => nll}/issue-52992.rs (100%) create mode 100644 src/test/ui/or-patterns/nested-undelimited-precedence.rs create mode 100644 src/test/ui/or-patterns/nested-undelimited-precedence.stderr rename src/test/ui/{ => parser}/dotdotdot-expr.rs (100%) rename src/test/ui/{ => parser}/dotdotdot-expr.stderr (100%) rename src/test/ui/{issues => parser}/issue-20616-3.rs (100%) rename src/test/ui/{issues => parser}/issue-20616-3.stderr (100%) rename src/test/ui/{issues => parser}/issue-44406.rs (100%) rename src/test/ui/{issues => parser}/issue-44406.stderr (100%) rename src/test/ui/{issues => parser}/issue-7222.rs (100%) create mode 100644 src/test/ui/parser/issue-76437-async.rs create mode 100644 src/test/ui/parser/issue-76437-async.stderr create mode 100644 src/test/ui/parser/issue-76437-const-async-unsafe.rs create mode 100644 src/test/ui/parser/issue-76437-const-async-unsafe.stderr create mode 100644 src/test/ui/parser/issue-76437-const-async.rs create mode 100644 src/test/ui/parser/issue-76437-const-async.stderr create mode 100644 src/test/ui/parser/issue-76437-const.rs create mode 100644 src/test/ui/parser/issue-76437-const.stderr create mode 100644 src/test/ui/parser/issue-76437-pub-crate-unsafe.rs create mode 100644 src/test/ui/parser/issue-76437-pub-crate-unsafe.stderr create mode 100644 src/test/ui/parser/issue-76437-unsafe.rs create mode 100644 src/test/ui/parser/issue-76437-unsafe.stderr rename src/test/ui/{ => parser}/lex-bare-cr-nondoc-comment.rs (100%) rename src/test/ui/{ => parser}/lexer-crlf-line-endings-string-literal-doc-comment.rs (100%) create mode 100644 src/test/ui/parser/match-arm-without-braces.rs create mode 100644 src/test/ui/parser/match-arm-without-braces.stderr rename src/test/ui/{ => parser}/old-suffixes-are-really-forbidden.rs (100%) rename src/test/ui/{ => parser}/old-suffixes-are-really-forbidden.stderr (100%) rename src/test/ui/{ => parser}/struct-literal-variant-in-if.rs (100%) rename src/test/ui/{ => parser}/struct-literal-variant-in-if.stderr (96%) create mode 100644 src/test/ui/parser/utf16-be-without-bom.rs create mode 100644 src/test/ui/parser/utf16-be-without-bom.stderr create mode 100644 src/test/ui/parser/utf16-le-without-bom.rs create mode 100644 src/test/ui/parser/utf16-le-without-bom.stderr create mode 100644 src/test/ui/pattern/issue-82290.rs create mode 100644 src/test/ui/pattern/issue-82290.stderr create mode 100644 src/test/ui/pattern/usefulness/issue-72377.rs create mode 100644 src/test/ui/pattern/usefulness/issue-72377.stderr create mode 100644 src/test/ui/pattern/usefulness/issue-80501-or-pat-and-macro.rs create mode 100644 src/test/ui/privacy/private-in-public-assoc-ty.full_tait.stderr rename src/test/ui/privacy/{private-in-public-assoc-ty.stderr => private-in-public-assoc-ty.min_tait.stderr} (93%) create mode 100644 src/test/ui/privacy/private-in-public-type-alias-impl-trait.full_tait.stderr create mode 100644 src/test/ui/proc-macro/attr-complex-fn.rs create mode 100644 src/test/ui/proc-macro/attr-complex-fn.stdout create mode 100644 src/test/ui/proc-macro/attribute-after-derive-feature-gate.rs create mode 100644 src/test/ui/proc-macro/attribute-after-derive-feature-gate.stderr create mode 100644 src/test/ui/proc-macro/attribute-after-derive.rs create mode 100644 src/test/ui/proc-macro/attribute-after-derive.stdout delete mode 100644 src/test/ui/proc-macro/attribute-order-restricted.rs delete mode 100644 src/test/ui/proc-macro/attribute-order-restricted.stderr create mode 100644 src/test/ui/proc-macro/cfg-eval-fail.rs create mode 100644 src/test/ui/proc-macro/cfg-eval-fail.stderr create mode 100644 src/test/ui/proc-macro/cfg-eval.rs create mode 100644 src/test/ui/proc-macro/cfg-eval.stdout create mode 100644 src/test/ui/proc-macro/derive-helper-legacy-limits.rs create mode 100644 src/test/ui/proc-macro/derive-helper-legacy-limits.stderr create mode 100644 src/test/ui/proc-macro/derive-helper-legacy-spurious.rs create mode 100644 src/test/ui/proc-macro/derive-helper-legacy-spurious.stderr create mode 100644 src/test/ui/proc-macro/derive-helper-vs-legacy.rs create mode 100644 src/test/ui/proc-macro/derive-multiple-with-packed.rs create mode 100644 src/test/ui/proc-macro/expand-to-derive.rs create mode 100644 src/test/ui/proc-macro/expand-to-derive.stdout rename src/test/ui/proc-macro/group-compat-hack/auxiliary/{group-compat-hack.rs => pin-project-internal-0.4.0.rs} (68%) create mode 100644 src/test/ui/proc-macro/group-compat-hack/group-compat-hack.stderr create mode 100644 src/test/ui/proc-macro/inert-attribute-order.rs create mode 100644 src/test/ui/proc-macro/inert-attribute-order.stdout create mode 100644 src/test/ui/proc-macro/inner-attr-non-inline-mod.rs create mode 100644 src/test/ui/proc-macro/inner-attr-non-inline-mod.stderr create mode 100644 src/test/ui/proc-macro/inner-attr-non-inline-mod.stdout create mode 100644 src/test/ui/proc-macro/inner-attrs.rs create mode 100644 src/test/ui/proc-macro/inner-attrs.stdout create mode 100644 src/test/ui/proc-macro/issue-73933-procedural-masquerade.rs create mode 100644 src/test/ui/proc-macro/issue-73933-procedural-masquerade.stderr create mode 100644 src/test/ui/proc-macro/issue-73933-procedural-masquerade.stdout create mode 100644 src/test/ui/proc-macro/issue-75930-derive-cfg.stderr create mode 100644 src/test/ui/proc-macro/macro-rules-derive-cfg.rs create mode 100644 src/test/ui/proc-macro/macro-rules-derive-cfg.stdout create mode 100644 src/test/ui/proc-macro/module_with_attrs.rs create mode 100644 src/test/ui/proc-macro/nested-derive-cfg.rs create mode 100644 src/test/ui/proc-macro/nested-derive-cfg.stdout create mode 100644 src/test/ui/proc-macro/weird-braces.rs create mode 100644 src/test/ui/proc-macro/weird-braces.stdout delete mode 100644 src/test/ui/range_inclusive_gate.rs rename src/test/ui/{issues => regions}/issue-6157.rs (100%) rename src/test/ui/{ => regions}/regions-fn-subtyping-return-static-fail.nll.stderr (100%) rename src/test/ui/{ => regions}/regions-fn-subtyping-return-static-fail.rs (100%) rename src/test/ui/{ => regions}/regions-fn-subtyping-return-static-fail.stderr (100%) rename src/test/ui/{issues => resolve}/issue-2330.rs (100%) rename src/test/ui/{issues => resolve}/issue-2330.stderr (100%) create mode 100644 src/test/ui/return/issue-82612-return-mutable-reference.rs create mode 100644 src/test/ui/return/issue-82612-return-mutable-reference.stderr create mode 100644 src/test/ui/return/tail-expr-as-potential-return.rs create mode 100644 src/test/ui/return/tail-expr-as-potential-return.stderr create mode 100644 src/test/ui/rmeta/emit-artifact-notifications.nll.stderr create mode 100644 src/test/ui/rmeta/emit-artifact-notifications.polonius.stderr rename src/test/ui/{ => rmeta}/emit-artifact-notifications.rs (100%) create mode 100644 src/test/ui/rmeta/emit-artifact-notifications.stderr rename src/test/ui/{ => rmeta}/emit-metadata-obj.rs (100%) create mode 100644 src/test/ui/rustdoc/README.md rename src/test/ui/{ => rustdoc}/cfg-rustdoc.rs (100%) rename src/test/ui/{ => rustdoc}/cfg-rustdoc.stderr (100%) rename src/test/ui/{ => rustdoc}/check-doc-alias-attr-location.rs (100%) rename src/test/ui/{ => rustdoc}/check-doc-alias-attr-location.stderr (100%) rename src/test/ui/{ => rustdoc}/check-doc-alias-attr.rs (50%) create mode 100644 src/test/ui/rustdoc/check-doc-alias-attr.stderr rename src/test/ui/{ => rustdoc}/doc-alias-crate-level.rs (100%) rename src/test/ui/{ => rustdoc}/doc-alias-crate-level.stderr (84%) rename src/test/ui/{ => rustdoc}/doc-alias-same-name.rs (100%) rename src/test/ui/{ => rustdoc}/doc-alias-same-name.stderr (100%) rename src/test/ui/{ => rustdoc}/doc_keyword.rs (100%) rename src/test/ui/{ => rustdoc}/doc_keyword.stderr (87%) rename src/test/ui/{ => rustdoc}/unterminated-doc-comment.rs (100%) rename src/test/ui/{ => rustdoc}/unterminated-doc-comment.stderr (100%) create mode 100644 src/test/ui/sanitize/hwaddress.rs create mode 100644 src/test/ui/save-analysis/issue-68621.full_tait.stderr rename src/test/ui/save-analysis/{issue-68621.stderr => issue-68621.min_tait.stderr} (82%) delete mode 100644 src/test/ui/simd-type.rs rename src/test/ui/{issues => simd}/issue-17170.rs (100%) rename src/test/ui/{issues => simd}/issue-39720.rs (100%) create mode 100644 src/test/ui/simd/simd-type-generic-monomorphisation-empty.rs create mode 100644 src/test/ui/simd/simd-type-generic-monomorphisation-empty.stderr create mode 100644 src/test/ui/simd/simd-type-generic-monomorphisation-oversized.rs create mode 100644 src/test/ui/simd/simd-type-generic-monomorphisation-oversized.stderr create mode 100644 src/test/ui/simd/simd-type-generic-monomorphisation-power-of-two.rs rename src/test/ui/{ => simd}/simd-type-generic-monomorphisation.rs (100%) rename src/test/ui/{ => simd}/simd-type-generic-monomorphisation.stderr (100%) rename src/test/ui/{ => simd}/simd-type.stderr (64%) create mode 100644 src/test/ui/span/issue-81800.rs create mode 100644 src/test/ui/span/issue-81800.stderr delete mode 100644 src/test/ui/stability-attribute/stability-attribute-issue-43027.stderr rename src/test/ui/{issues => statics}/issue-15261.rs (100%) rename src/test/ui/{issues => statics}/issue-44373-2.rs (100%) rename src/test/ui/{issues => statics}/issue-44373.rs (100%) rename src/test/ui/{issues => statics}/issue-44373.stderr (100%) rename src/test/ui/{ => structs-enums}/type-sizes.rs (100%) create mode 100644 src/test/ui/structs/issue-80853.rs create mode 100644 src/test/ui/structs/issue-80853.stderr create mode 100644 src/test/ui/structs/struct-tuple-field-names.rs create mode 100644 src/test/ui/structs/struct-tuple-field-names.stderr create mode 100644 src/test/ui/suggestions/auxiliary/issue-81839.rs create mode 100644 src/test/ui/suggestions/do-not-attempt-to-add-suggestions-with-no-changes.rs create mode 100644 src/test/ui/suggestions/do-not-attempt-to-add-suggestions-with-no-changes.stderr create mode 100644 src/test/ui/suggestions/issue-81839.rs create mode 100644 src/test/ui/suggestions/issue-81839.stderr create mode 100644 src/test/ui/suggestions/issue-82361.fixed create mode 100644 src/test/ui/suggestions/issue-82361.rs create mode 100644 src/test/ui/suggestions/issue-82361.stderr create mode 100644 src/test/ui/suggestions/issue-82566-1.rs create mode 100644 src/test/ui/suggestions/issue-82566-1.stderr create mode 100644 src/test/ui/suggestions/issue-82566-2.rs create mode 100644 src/test/ui/suggestions/issue-82566-2.stderr create mode 100644 src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.nll.stderr create mode 100644 src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.rs create mode 100644 src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.stderr delete mode 100644 src/test/ui/suggestions/match-needing-semi.fixed create mode 100644 src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.rs create mode 100644 src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.stderr create mode 100644 src/test/ui/suggestions/suggest-change-mut.rs create mode 100644 src/test/ui/suggestions/suggest-change-mut.stderr create mode 100644 src/test/ui/suggestions/suggest-mut-method-for-loop.rs create mode 100644 src/test/ui/suggestions/suggest-mut-method-for-loop.stderr create mode 100644 src/test/ui/test-attrs/test-filter-multiple.rs create mode 100644 src/test/ui/test-attrs/test-filter-multiple.run.stdout rename src/test/ui/traits/{trait-alias-ambiguous.rs => alias/ambiguous.rs} (100%) rename src/test/ui/traits/{trait-alias-ambiguous.stderr => alias/ambiguous.stderr} (85%) rename src/test/ui/traits/{auxiliary/trait_alias.rs => alias/auxiliary/greeter.rs} (100%) rename src/test/ui/traits/{trait-alias/auxiliary/trait_alias.rs => alias/auxiliary/send_sync.rs} (100%) rename src/test/ui/traits/{trait-alias/trait-alias.rs => alias/basic.rs} (100%) rename src/test/ui/traits/{trait-alias/trait-alias-bounds.rs => alias/bounds.rs} (100%) rename src/test/ui/traits/{trait-alias/trait-alias-cross-crate.rs => alias/cross-crate.rs} (78%) rename src/test/ui/traits/{trait-alias/trait-alias-cross-crate.stderr => alias/cross-crate.stderr} (90%) rename src/test/ui/traits/{trait-alias/trait-alias-impl.rs => alias/impl.rs} (100%) rename src/test/ui/traits/{trait-alias/trait-alias-impl.stderr => alias/impl.stderr} (87%) rename src/test/ui/traits/{trait-alias-import-cross-crate.rs => alias/import-cross-crate.rs} (66%) rename src/test/ui/traits/{trait-alias-import.rs => alias/import.rs} (100%) rename src/test/ui/traits/{trait-alias => alias}/issue-60021-assoc-method-resolve.rs (100%) rename src/test/ui/traits/{trait-alias => alias}/issue-72415-assoc-const-resolve.rs (100%) rename src/test/ui/traits/{trait-alias => alias}/issue-75983.rs (100%) rename src/test/ui/traits/{trait-alias/trait-alias-maybe-bound.rs => alias/maybe-bound.rs} (100%) rename src/test/ui/traits/{trait-alias/trait-alias-no-duplicates.rs => alias/no-duplicates.rs} (100%) rename src/test/ui/traits/{trait-alias/trait-alias-no-duplicates.stderr => alias/no-duplicates.stderr} (95%) rename src/test/ui/traits/{trait-alias/trait-alias-no-extra-traits.rs => alias/no-extra-traits.rs} (100%) rename src/test/ui/traits/{trait-alias/trait-alias-no-extra-traits.stderr => alias/no-extra-traits.stderr} (95%) rename src/test/ui/traits/{trait-alias/trait-alias-object-fail.rs => alias/object-fail.rs} (100%) rename src/test/ui/traits/{trait-alias/trait-alias-object-fail.stderr => alias/object-fail.stderr} (92%) rename src/test/ui/traits/{trait-alias/trait-alias-object-wf.rs => alias/object-wf.rs} (100%) rename src/test/ui/traits/{trait-alias/trait-alias-object.rs => alias/object.rs} (100%) rename src/test/ui/traits/{trait-alias/trait-alias-only-maybe-bound.rs => alias/only-maybe-bound.rs} (100%) rename src/test/ui/traits/{trait-alias/trait-alias-only-maybe-bound.stderr => alias/only-maybe-bound.stderr} (77%) rename src/test/ui/traits/{trait-alias/trait-alias-syntax-fail.rs => alias/syntax-fail.rs} (100%) rename src/test/ui/traits/{trait-alias/trait-alias-syntax-fail.stderr => alias/syntax-fail.stderr} (74%) rename src/test/ui/traits/{trait-alias/trait-alias-syntax.rs => alias/syntax.rs} (100%) rename src/test/ui/traits/{trait-alias/trait-alias-wf.rs => alias/wf.rs} (100%) rename src/test/ui/traits/{trait-alias/trait-alias-wf.stderr => alias/wf.stderr} (92%) rename src/test/ui/traits/{anon-trait-static-method.rs => anon-static-method.rs} (100%) rename src/test/ui/traits/{trait-as-struct-constructor.rs => as-struct-constructor.rs} (100%) rename src/test/ui/traits/{trait-as-struct-constructor.stderr => as-struct-constructor.stderr} (86%) rename src/test/ui/traits/{traits-assoc-type-in-supertrait-bad.rs => assoc-type-in-superbad.rs} (100%) rename src/test/ui/traits/{traits-assoc-type-in-supertrait-bad.stderr => assoc-type-in-superbad.stderr} (83%) rename src/test/ui/traits/{traits-assoc-type-in-supertrait.rs => assoc-type-in-supertrait.rs} (100%) rename src/test/ui/traits/{ => associated_type_bound}/assoc_type_bound_with_struct.rs (100%) rename src/test/ui/traits/{ => associated_type_bound}/assoc_type_bound_with_struct.stderr (100%) rename src/test/ui/traits/{ => associated_type_bound}/check-trait-object-bounds-1.rs (100%) rename src/test/ui/traits/{ => associated_type_bound}/check-trait-object-bounds-1.stderr (100%) rename src/test/ui/traits/{ => associated_type_bound}/check-trait-object-bounds-2-ok.rs (100%) rename src/test/ui/traits/{ => associated_type_bound}/check-trait-object-bounds-2.rs (100%) rename src/test/ui/traits/{ => associated_type_bound}/check-trait-object-bounds-2.stderr (100%) rename src/test/ui/traits/{ => associated_type_bound}/check-trait-object-bounds-3.rs (100%) rename src/test/ui/traits/{ => associated_type_bound}/check-trait-object-bounds-3.stderr (100%) rename src/test/ui/traits/{ => associated_type_bound}/check-trait-object-bounds-4.rs (100%) rename src/test/ui/traits/{ => associated_type_bound}/check-trait-object-bounds-4.stderr (100%) rename src/test/ui/traits/{ => associated_type_bound}/check-trait-object-bounds-5.rs (100%) rename src/test/ui/traits/{ => associated_type_bound}/check-trait-object-bounds-5.stderr (100%) rename src/test/ui/traits/{ => associated_type_bound}/check-trait-object-bounds-6.rs (100%) rename src/test/ui/traits/{ => associated_type_bound}/check-trait-object-bounds-6.stderr (100%) rename src/test/ui/traits/{astconv-cycle-between-trait-and-type.rs => astconv-cycle-between-and-type.rs} (100%) rename src/test/ui/traits/{ => bound}/auxiliary/crate_a1.rs (100%) rename src/test/ui/traits/{ => bound}/auxiliary/crate_a2.rs (100%) rename src/test/ui/traits/{auxiliary/trait_bounds_on_structs_and_enums_xc.rs => bound/auxiliary/on_structs_and_enums_xc.rs} (100%) rename src/test/ui/traits/{trait-bounds-basic.rs => bound/basic.rs} (100%) rename src/test/ui/traits/{trait-bounds.rs => bound/generic_trait.rs} (100%) rename src/test/ui/traits/{trait-bounds-impl-comparison-duplicates.rs => bound/impl-comparison-duplicates.rs} (100%) rename src/test/ui/traits/{trait-bounds-in-arc.rs => bound/in-arc.rs} (100%) rename src/test/ui/traits/{multiple-trait-bounds.rs => bound/multiple.rs} (100%) rename src/test/ui/traits/{trait-bounds-not-on-bare-trait.rs => bound/not-on-bare-trait.rs} (100%) rename src/test/ui/traits/{trait-bounds-not-on-bare-trait.stderr => bound/not-on-bare-trait.stderr} (89%) rename src/test/ui/traits/{trait-bounds-not-on-struct.rs => bound/not-on-struct.rs} (100%) rename src/test/ui/traits/{trait-bounds-not-on-struct.stderr => bound/not-on-struct.stderr} (86%) rename src/test/ui/traits/{trait-bounds-on-structs-and-enums-in-fns.rs => bound/on-structs-and-enums-in-fns.rs} (100%) rename src/test/ui/traits/{trait-bounds-on-structs-and-enums-in-fns.stderr => bound/on-structs-and-enums-in-fns.stderr} (83%) rename src/test/ui/traits/{trait-bounds-on-structs-and-enums-in-impls.rs => bound/on-structs-and-enums-in-impls.rs} (100%) rename src/test/ui/traits/{trait-bounds-on-structs-and-enums-in-impls.stderr => bound/on-structs-and-enums-in-impls.stderr} (85%) rename src/test/ui/traits/{trait-bounds-on-structs-and-enums-locals.rs => bound/on-structs-and-enums-locals.rs} (100%) rename src/test/ui/traits/{trait-bounds-on-structs-and-enums-locals.stderr => bound/on-structs-and-enums-locals.stderr} (83%) rename src/test/ui/traits/{trait-bounds-on-structs-and-enums-rpass.rs => bound/on-structs-and-enums-rpass.rs} (100%) rename src/test/ui/traits/{trait-bounds-on-structs-and-enums-static.rs => bound/on-structs-and-enums-static.rs} (100%) rename src/test/ui/traits/{trait-bounds-on-structs-and-enums-static.stderr => bound/on-structs-and-enums-static.stderr} (86%) create mode 100644 src/test/ui/traits/bound/on-structs-and-enums-xc.rs rename src/test/ui/traits/{trait-bounds-on-structs-and-enums-xc.stderr => bound/on-structs-and-enums-xc.stderr} (72%) create mode 100644 src/test/ui/traits/bound/on-structs-and-enums-xc1.rs rename src/test/ui/traits/{trait-bounds-on-structs-and-enums-xc1.stderr => bound/on-structs-and-enums-xc1.stderr} (76%) rename src/test/ui/traits/{trait-bounds-on-structs-and-enums.rs => bound/on-structs-and-enums.rs} (100%) rename src/test/ui/traits/{trait-bounds-on-structs-and-enums.stderr => bound/on-structs-and-enums.stderr} (85%) rename src/test/ui/traits/{trait-bounds-recursion.rs => bound/recursion.rs} (100%) rename src/test/ui/traits/{trait-bounds-same-crate-name.rs => bound/same-crate-name.rs} (100%) rename src/test/ui/traits/{trait-bounds-same-crate-name.stderr => bound/same-crate-name.stderr} (92%) rename src/test/ui/traits/{trait-bounds-sugar.rs => bound/sugar.rs} (100%) rename src/test/ui/traits/{trait-bounds-sugar.stderr => bound/sugar.stderr} (90%) rename src/test/ui/traits/{trait-cache-issue-18209.rs => cache-issue-18209.rs} (100%) rename src/test/ui/traits/{trait-coercion-generic-bad.rs => coercion-generic-bad.rs} (100%) rename src/test/ui/traits/{trait-coercion-generic-bad.stderr => coercion-generic-bad.stderr} (92%) rename src/test/ui/traits/{trait-coercion-generic-regions.rs => coercion-generic-regions.rs} (100%) rename src/test/ui/traits/{trait-coercion-generic-regions.stderr => coercion-generic-regions.stderr} (91%) rename src/test/ui/traits/{trait-coercion-generic.rs => coercion-generic.rs} (100%) rename src/test/ui/traits/{trait-coercion.rs => coercion.rs} (100%) rename src/test/ui/traits/{trait-composition-trivial.rs => composition-trivial.rs} (100%) rename src/test/ui/traits/{traits-conditional-dispatch.rs => conditional-dispatch.rs} (100%) rename src/test/ui/traits/{traits-conditional-model-fn.rs => conditional-model-fn.rs} (100%) rename src/test/ui/traits/{trait-copy-guessing.rs => copy-guessing.rs} (100%) rename src/test/ui/traits/{cycle-trait-type-trait.rs => cycle-type-trait.rs} (100%) rename src/test/ui/traits/{auxiliary/trait_default_method_xc_aux.rs => default-method/auxiliary/xc.rs} (100%) rename src/test/ui/traits/{auxiliary/trait_default_method_xc_aux_2.rs => default-method/auxiliary/xc_2.rs} (73%) rename src/test/ui/traits/{trait-default-method-bound-subst.rs => default-method/bound-subst.rs} (100%) rename src/test/ui/traits/{trait-default-method-bound-subst2.rs => default-method/bound-subst2.rs} (100%) rename src/test/ui/traits/{trait-default-method-bound-subst3.rs => default-method/bound-subst3.rs} (100%) rename src/test/ui/traits/{trait-default-method-bound-subst4.rs => default-method/bound-subst4.rs} (100%) rename src/test/ui/traits/{trait-default-method-bound.rs => default-method/bound.rs} (100%) rename src/test/ui/traits/{traits-default-method-macro.rs => default-method/macro.rs} (100%) rename src/test/ui/traits/{traits-default-method-mut.rs => default-method/mut.rs} (100%) rename src/test/ui/traits/{traits-default-method-self.rs => default-method/self.rs} (100%) rename src/test/ui/traits/{default-method-supertrait-vtable.rs => default-method/supervtable.rs} (100%) rename src/test/ui/traits/{traits-default-method-trivial.rs => default-method/trivial.rs} (100%) rename src/test/ui/traits/{trait-default-method-xc-2.rs => default-method/xc-2.rs} (63%) rename src/test/ui/traits/{trait-default-method-xc.rs => default-method/xc.rs} (94%) rename src/test/ui/traits/{trait-duplicate-methods.rs => duplicate-methods.rs} (100%) rename src/test/ui/traits/{trait-duplicate-methods.stderr => duplicate-methods.stderr} (91%) rename src/test/ui/traits/{traits-elaborate-type-region.rs => elaborate-type-region.rs} (100%) rename src/test/ui/traits/{trait-false-ambiguity-where-clause-builtin-bound.rs => false-ambiguity-where-clause-builtin-bound.rs} (100%) rename src/test/ui/traits/{trait-generic.rs => generic.rs} (100%) rename src/test/ui/traits/{trait-impl-1.rs => impl-1.rs} (100%) rename src/test/ui/traits/{trait-impl-1.stderr => impl-1.stderr} (88%) rename src/test/ui/traits/{trait-impl-2.rs => impl-2.rs} (100%) rename src/test/ui/{ => traits}/impl-bounds-checking.rs (100%) rename src/test/ui/{ => traits}/impl-bounds-checking.stderr (100%) rename src/test/ui/traits/{trait-impl-can-not-have-untraitful-items.rs => impl-can-not-have-untraitful-items.rs} (100%) rename src/test/ui/traits/{trait-impl-can-not-have-untraitful-items.stderr => impl-can-not-have-untraitful-items.stderr} (76%) rename src/test/ui/traits/{trait-impl-different-num-params.rs => impl-different-num-params.rs} (100%) rename src/test/ui/traits/{trait-impl-different-num-params.stderr => impl-different-num-params.stderr} (88%) rename src/test/ui/traits/{trait-impl-for-module.rs => impl-for-module.rs} (100%) rename src/test/ui/traits/{trait-impl-for-module.stderr => impl-for-module.stderr} (88%) rename src/test/ui/traits/{trait-impl-method-mismatch.rs => impl-method-mismatch.rs} (100%) rename src/test/ui/traits/{trait-impl-method-mismatch.stderr => impl-method-mismatch.stderr} (92%) rename src/test/ui/traits/{traits-impl-object-overlap-issue-23853.rs => impl-object-overlap-issue-23853.rs} (100%) rename src/test/ui/traits/{trait-impl-of-supertrait-has-wrong-lifetime-parameters.rs => impl-of-supertrait-has-wrong-lifetime-parameters.rs} (100%) rename src/test/ui/traits/{trait-impl-of-supertrait-has-wrong-lifetime-parameters.stderr => impl-of-supertrait-has-wrong-lifetime-parameters.stderr} (72%) rename src/test/ui/traits/{trait-impl.rs => impl.rs} (93%) rename src/test/ui/traits/{traits-inductive-overflow-lifetime.rs => inductive-overflow/lifetime.rs} (100%) rename src/test/ui/traits/{traits-inductive-overflow-lifetime.stderr => inductive-overflow/lifetime.stderr} (89%) rename src/test/ui/traits/{traits-inductive-overflow-simultaneous.rs => inductive-overflow/simultaneous.rs} (100%) rename src/test/ui/traits/{traits-inductive-overflow-simultaneous.stderr => inductive-overflow/simultaneous.stderr} (85%) rename src/test/ui/traits/{traits-inductive-overflow-supertrait-auto-trait.rs => inductive-overflow/supertrait-auto-trait.rs} (100%) rename src/test/ui/traits/{traits-inductive-overflow-supertrait-auto-trait.stderr => inductive-overflow/supertrait-auto-trait.stderr} (85%) rename src/test/ui/traits/{traits-inductive-overflow-supertrait.rs => inductive-overflow/supertrait.rs} (100%) rename src/test/ui/traits/{traits-inductive-overflow-supertrait.stderr => inductive-overflow/supertrait.stderr} (88%) rename src/test/ui/traits/{traits-inductive-overflow-two-traits.rs => inductive-overflow/two-traits.rs} (100%) rename src/test/ui/traits/{traits-inductive-overflow-two-traits.stderr => inductive-overflow/two-traits.stderr} (87%) rename src/test/ui/traits/{infer-from-object-trait-issue-26952.rs => infer-from-object-issue-26952.rs} (100%) rename src/test/ui/traits/{inherent-trait-method-order.rs => inherent-method-order.rs} (100%) rename src/test/ui/traits/{trait-inheritance-auto-xc-2.rs => inheritance/auto-xc-2.rs} (78%) rename src/test/ui/traits/{trait-inheritance-auto-xc.rs => inheritance/auto-xc.rs} (80%) rename src/test/ui/traits/{trait-inheritance-auto.rs => inheritance/auto.rs} (100%) rename src/test/ui/traits/{auxiliary/trait_inheritance_auto_xc_aux.rs => inheritance/auxiliary/auto_xc.rs} (100%) rename src/test/ui/traits/{auxiliary/trait_inheritance_auto_xc_2_aux.rs => inheritance/auxiliary/auto_xc_2.rs} (100%) rename src/test/ui/traits/{auxiliary/trait_inheritance_overloading_xc.rs => inheritance/auxiliary/overloading_xc.rs} (100%) rename src/test/ui/traits/{auxiliary/trait_xc_call_aux.rs => inheritance/auxiliary/xc_call.rs} (100%) rename src/test/ui/traits/{trait-inheritance2.rs => inheritance/basic.rs} (100%) rename src/test/ui/traits/{trait-inheritance-call-bound-inherited.rs => inheritance/call-bound-inherited.rs} (100%) rename src/test/ui/traits/{trait-inheritance-call-bound-inherited2.rs => inheritance/call-bound-inherited2.rs} (100%) rename src/test/ui/traits/{trait-inheritance-cast-without-call-to-supertrait.rs => inheritance/cast-without-call-to-supertrait.rs} (100%) rename src/test/ui/traits/{trait-inheritance-cast.rs => inheritance/cast.rs} (100%) rename src/test/ui/traits/{trait-inheritance-cross-trait-call-xc.rs => inheritance/cross-trait-call-xc.rs} (74%) rename src/test/ui/traits/{trait-inheritance-cross-trait-call.rs => inheritance/cross-trait-call.rs} (100%) rename src/test/ui/traits/{trait-inheritance-diamond.rs => inheritance/diamond.rs} (100%) rename src/test/ui/traits/{trait-inheritance-multiple-inheritors.rs => inheritance/multiple-inheritors.rs} (100%) rename src/test/ui/traits/{trait-inheritance-multiple-params.rs => inheritance/multiple-params.rs} (100%) rename src/test/ui/traits/{trait-inheritance-num.rs => inheritance/num.rs} (100%) rename src/test/ui/traits/{trait-inheritance-num0.rs => inheritance/num0.rs} (100%) rename src/test/ui/traits/{trait-inheritance-num1.rs => inheritance/num1.rs} (100%) rename src/test/ui/traits/{trait-inheritance-num2.rs => inheritance/num2.rs} (100%) rename src/test/ui/traits/{trait-inheritance-num3.rs => inheritance/num3.rs} (100%) rename src/test/ui/traits/{trait-inheritance-num5.rs => inheritance/num5.rs} (100%) rename src/test/ui/traits/{trait-inheritance-overloading-simple.rs => inheritance/overloading-simple.rs} (100%) rename src/test/ui/traits/{trait-inheritance-overloading-xc-exe.rs => inheritance/overloading-xc-exe.rs} (68%) rename src/test/ui/traits/{trait-inheritance-overloading.rs => inheritance/overloading.rs} (100%) rename src/test/ui/traits/{traits-repeated-supertrait-ambig.rs => inheritance/repeated-supertrait-ambig.rs} (92%) rename src/test/ui/traits/{traits-repeated-supertrait-ambig.stderr => inheritance/repeated-supertrait-ambig.stderr} (80%) rename src/test/ui/traits/{traits-repeated-supertrait.rs => inheritance/repeated-supertrait.rs} (93%) rename src/test/ui/traits/{trait-inheritance-self-in-supertype.rs => inheritance/self-in-supertype.rs} (100%) rename src/test/ui/traits/{trait-inheritance-self.rs => inheritance/self.rs} (100%) rename src/test/ui/traits/{trait-inheritance-simple.rs => inheritance/simple.rs} (100%) rename src/test/ui/traits/{trait-inheritance-static.rs => inheritance/static.rs} (100%) rename src/test/ui/traits/{trait-inheritance-static2.rs => inheritance/static2.rs} (100%) rename src/test/ui/traits/{trait-inheritance-subst.rs => inheritance/subst.rs} (100%) rename src/test/ui/traits/{trait-inheritance-subst2.rs => inheritance/subst2.rs} (100%) rename src/test/ui/traits/{trait-inheritance-visibility.rs => inheritance/visibility.rs} (100%) rename src/test/ui/traits/{traits-issue-22019.rs => issue-22019.rs} (100%) rename src/test/ui/traits/{traits-issue-22110.rs => issue-22110.rs} (100%) rename src/test/ui/traits/{traits-issue-22655.rs => issue-22655.rs} (100%) rename src/test/ui/traits/{traits-issue-23003-overflow.rs => issue-23003-overflow.rs} (100%) rename src/test/ui/traits/{traits-issue-23003.rs => issue-23003.rs} (100%) rename src/test/ui/traits/{traits-issue-26339.rs => issue-26339.rs} (100%) rename src/test/ui/{issues => traits}/issue-28576.rs (100%) rename src/test/ui/{issues => traits}/issue-28576.stderr (100%) rename src/test/ui/{issues => traits}/issue-33140.rs (100%) rename src/test/ui/{issues => traits}/issue-33140.stderr (100%) rename src/test/ui/traits/{traits-issue-71136.rs => issue-71136.rs} (100%) rename src/test/ui/traits/{traits-issue-71136.stderr => issue-71136.stderr} (93%) rename src/test/ui/traits/{issue-9394-inherited-trait-calls.rs => issue-9394-inherited-calls.rs} (100%) rename src/test/ui/traits/{trait-item-inside-macro.rs => item-inside-macro.rs} (100%) rename src/test/ui/traits/{trait-item-privacy.rs => item-privacy.rs} (90%) rename src/test/ui/traits/{trait-item-privacy.stderr => item-privacy.stderr} (82%) rename src/test/ui/traits/{kindck-owned-trait-contains-1.rs => kindck-owned-contains-1.rs} (100%) rename src/test/ui/traits/{trait-matching-lifetimes.rs => matching-lifetimes.rs} (100%) rename src/test/ui/traits/{trait-matching-lifetimes.stderr => matching-lifetimes.stderr} (80%) rename src/test/ui/traits/{trait-method-private.rs => method-private.rs} (100%) rename src/test/ui/traits/{trait-method-private.stderr => method-private.stderr} (91%) rename src/test/ui/traits/{traits-multidispatch-bad.rs => multidispatch-bad.rs} (100%) rename src/test/ui/traits/{traits-multidispatch-bad.stderr => multidispatch-bad.stderr} (88%) rename src/test/ui/traits/{traits-multidispatch-convert-ambig-dest.rs => multidispatch-convert-ambig-dest.rs} (100%) rename src/test/ui/traits/{traits-multidispatch-convert-ambig-dest.stderr => multidispatch-convert-ambig-dest.stderr} (83%) rename src/test/ui/traits/{traits-multidispatch-infer-convert-target.rs => multidispatch-infer-convert-target.rs} (100%) rename src/test/ui/traits/{trait-object-auto-dedup-in-impl.rs => object/auto-dedup-in-impl.rs} (100%) rename src/test/ui/traits/{trait-object-auto-dedup-in-impl.stderr => object/auto-dedup-in-impl.stderr} (87%) rename src/test/ui/traits/{trait-object-auto-dedup.rs => object/auto-dedup.rs} (100%) rename src/test/ui/traits/{trait-object-bounds-cycle-1.rs => object/bounds-cycle-1.rs} (100%) rename src/test/ui/traits/{trait-object-bounds-cycle-2.rs => object/bounds-cycle-2.rs} (100%) rename src/test/ui/traits/{trait-object-bounds-cycle-3.rs => object/bounds-cycle-3.rs} (100%) rename src/test/ui/traits/{trait-object-bounds-cycle-4.rs => object/bounds-cycle-4.rs} (100%) rename src/test/ui/traits/{trait-object-exclusion.rs => object/exclusion.rs} (100%) rename src/test/ui/traits/{trait-object-generics.rs => object/generics.rs} (100%) rename src/test/ui/{issues => traits/object}/issue-33140-traitobject-crate.rs (100%) rename src/test/ui/{issues => traits/object}/issue-33140-traitobject-crate.stderr (100%) rename src/test/ui/traits/{trait-object-lifetime-first.rs => object/lifetime-first.rs} (100%) rename src/test/ui/traits/{trait-object-macro-matcher.rs => object/macro-matcher.rs} (100%) rename src/test/ui/traits/{trait-object-macro-matcher.stderr => object/macro-matcher.stderr} (89%) rename src/test/ui/traits/{trait-object-safety.rs => object/safety.rs} (100%) rename src/test/ui/traits/{trait-object-safety.stderr => object/safety.stderr} (92%) rename src/test/ui/traits/{trait-object-supertrait-lifetime-bound.rs => object/supertrait-lifetime-bound.rs} (100%) rename src/test/ui/traits/{trait-object-vs-lifetime-2.rs => object/vs-lifetime-2.rs} (100%) rename src/test/ui/traits/{trait-object-vs-lifetime-2.stderr => object/vs-lifetime-2.stderr} (84%) rename src/test/ui/traits/{trait-object-vs-lifetime.rs => object/vs-lifetime.rs} (100%) rename src/test/ui/traits/{trait-object-vs-lifetime.stderr => object/vs-lifetime.stderr} (81%) rename src/test/ui/traits/{trait-object-with-lifetime-bound.rs => object/with-lifetime-bound.rs} (100%) rename src/test/ui/traits/{trait-object-with-self-in-projection-output-bad.rs => object/with-self-in-projection-output-bad.rs} (100%) rename src/test/ui/traits/{trait-object-with-self-in-projection-output-bad.stderr => object/with-self-in-projection-output-bad.stderr} (86%) rename src/test/ui/traits/{trait-object-with-self-in-projection-output-good.rs => object/with-self-in-projection-output-good.rs} (100%) rename src/test/ui/traits/{trait-object-with-self-in-projection-output-repeated-supertrait.rs => object/with-self-in-projection-output-repeated-supertrait.rs} (100%) rename src/test/ui/traits/{trait-param-without-lifetime-constraint.rs => param-without-lifetime-constraint.rs} (100%) rename src/test/ui/traits/{trait-param-without-lifetime-constraint.stderr => param-without-lifetime-constraint.stderr} (85%) rename src/test/ui/traits/{parameterized-trait-with-bounds.rs => parameterized-with-bounds.rs} (100%) rename src/test/ui/traits/{principal-less-trait-objects.rs => principal-less-objects.rs} (100%) rename src/test/ui/traits/{trait-privacy.rs => privacy.rs} (100%) rename src/test/ui/traits/{trait-region-pointer-simple.rs => region-pointer-simple.rs} (100%) rename src/test/ui/traits/{reservation-impls/reservation-impl-coherence-conflict.rs => reservation-impl/coherence-conflict.rs} (100%) rename src/test/ui/traits/{reservation-impls/reservation-impl-coherence-conflict.stderr => reservation-impl/coherence-conflict.stderr} (88%) rename src/test/ui/traits/{reservation-impls/reservation-impl-no-use.rs => reservation-impl/no-use.rs} (100%) rename src/test/ui/traits/{reservation-impls/reservation-impl-no-use.stderr => reservation-impl/no-use.stderr} (91%) rename src/test/ui/traits/{reservation-impls/reservation-impl-non-lattice-ok.rs => reservation-impl/non-lattice-ok.rs} (100%) rename src/test/ui/traits/{reservation-impls/reservation-impl-ok.rs => reservation-impl/ok.rs} (100%) rename src/test/ui/traits/{trait-resolution-in-overloaded-op.rs => resolution-in-overloaded-op.rs} (100%) rename src/test/ui/traits/{trait-resolution-in-overloaded-op.stderr => resolution-in-overloaded-op.stderr} (88%) rename src/test/ui/traits/{trait-safety-fn-body.rs => safety-fn-body.rs} (100%) rename src/test/ui/traits/{trait-safety-fn-body.stderr => safety-fn-body.stderr} (91%) rename src/test/ui/traits/{trait-safety-inherent-impl.rs => safety-inherent-impl.rs} (100%) rename src/test/ui/traits/{trait-safety-inherent-impl.stderr => safety-inherent-impl.stderr} (85%) rename src/test/ui/traits/{trait-safety-ok-cc.rs => safety-ok-cc.rs} (100%) rename src/test/ui/traits/{trait-safety-ok.rs => safety-ok.rs} (100%) rename src/test/ui/traits/{trait-safety-trait-impl-cc.rs => safety-trait-impl-cc.rs} (100%) rename src/test/ui/traits/{trait-safety-trait-impl-cc.stderr => safety-trait-impl-cc.stderr} (87%) rename src/test/ui/traits/{trait-safety-trait-impl.rs => safety-trait-impl.rs} (100%) rename src/test/ui/traits/{trait-safety-trait-impl.stderr => safety-trait-impl.stderr} (84%) rename src/test/ui/traits/{trait-static-method-generic-inference.rs => static-method-generic-inference.rs} (100%) rename src/test/ui/traits/{trait-static-method-generic-inference.stderr => static-method-generic-inference.stderr} (87%) rename src/test/ui/traits/{trait-static-method-overwriting.rs => static-method-overwriting.rs} (100%) rename src/test/ui/traits/{traits-static-outlives-a-where-clause.rs => static-outlives-a-where-clause.rs} (100%) rename src/test/ui/traits/{trait-suggest-deferences-issue-39029.fixed => suggest-deferences/issue-39029.fixed} (100%) rename src/test/ui/traits/{trait-suggest-deferences-issue-39029.rs => suggest-deferences/issue-39029.rs} (100%) rename src/test/ui/traits/{trait-suggest-deferences-issue-39029.stderr => suggest-deferences/issue-39029.stderr} (93%) rename src/test/ui/traits/{trait-suggest-deferences-issue-62530.fixed => suggest-deferences/issue-62530.fixed} (100%) rename src/test/ui/traits/{trait-suggest-deferences-issue-62530.rs => suggest-deferences/issue-62530.rs} (100%) rename src/test/ui/traits/{trait-suggest-deferences-issue-62530.stderr => suggest-deferences/issue-62530.stderr} (91%) rename src/test/ui/traits/{trait-suggest-deferences-multiple-0.fixed => suggest-deferences/multiple-0.fixed} (100%) rename src/test/ui/traits/{trait-suggest-deferences-multiple-0.rs => suggest-deferences/multiple-0.rs} (100%) rename src/test/ui/traits/{trait-suggest-deferences-multiple-0.stderr => suggest-deferences/multiple-0.stderr} (89%) rename src/test/ui/traits/{trait-suggest-deferences-multiple-1.rs => suggest-deferences/multiple-1.rs} (100%) rename src/test/ui/traits/{trait-suggest-deferences-multiple-1.stderr => suggest-deferences/multiple-1.stderr} (87%) rename src/test/ui/traits/{trait-suggest-where-clause.rs => suggest-where-clause.rs} (100%) rename src/test/ui/traits/{trait-suggest-where-clause.stderr => suggest-where-clause.stderr} (77%) rename src/test/ui/traits/{supertrait-default-generics.rs => superdefault-generics.rs} (100%) rename src/test/ui/traits/{syntax-trait-polarity.rs => syntax-polarity.rs} (100%) rename src/test/ui/traits/{trait-test-2.rs => test-2.rs} (100%) rename src/test/ui/traits/{trait-test-2.stderr => test-2.stderr} (91%) rename src/test/ui/traits/{trait-test.rs => test.rs} (100%) rename src/test/ui/traits/{trait-test.stderr => test.stderr} (89%) rename src/test/ui/traits/{trait-to-str.rs => to-str.rs} (100%) delete mode 100644 src/test/ui/traits/trait-bounds-on-structs-and-enums-xc.rs delete mode 100644 src/test/ui/traits/trait-bounds-on-structs-and-enums-xc1.rs rename src/test/ui/traits/{ufcs-trait-object.rs => ufcs-object.rs} (100%) rename src/test/ui/traits/{use-trait-before-def.rs => use-before-def.rs} (100%) rename src/test/ui/traits/{wf-trait-object-maybe-bound.rs => wf-object/maybe-bound.rs} (100%) rename src/test/ui/traits/{wf-trait-object-maybe-bound.stderr => wf-object/maybe-bound.stderr} (74%) rename src/test/ui/traits/{wf-trait-object-no-duplicates.rs => wf-object/no-duplicates.rs} (100%) rename src/test/ui/traits/{wf-trait-object-no-duplicates.stderr => wf-object/no-duplicates.stderr} (92%) rename src/test/ui/traits/{wf-trait-object-only-maybe-bound.rs => wf-object/only-maybe-bound.rs} (100%) rename src/test/ui/traits/{wf-trait-object-only-maybe-bound.stderr => wf-object/only-maybe-bound.stderr} (76%) rename src/test/ui/traits/{wf-trait-object-reverse-order.rs => wf-object/reverse-order.rs} (100%) rename src/test/ui/traits/{trait-where-clause-vs-impl.rs => where-clause-vs-impl.rs} (100%) rename src/test/ui/traits/{trait-with-bounds-default.rs => with-bounds-default.rs} (100%) rename src/test/ui/traits/{trait-with-dst.rs => with-dst.rs} (100%) create mode 100644 src/test/ui/treat-err-as-bug/delay_span_bug.rs create mode 100644 src/test/ui/treat-err-as-bug/delay_span_bug.stderr create mode 100644 src/test/ui/treat-err-as-bug/err.rs create mode 100644 src/test/ui/treat-err-as-bug/err.stderr rename src/test/ui/{ => try-block}/try-block.rs (100%) rename src/test/ui/{ => tuple}/one-tuple.rs (100%) rename src/test/ui/{ => tuple}/tup.rs (100%) create mode 100644 src/test/ui/type-alias-impl-trait/assoc-type-const.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{assoc-type-const.stderr => assoc-type-const.min_tait.stderr} (91%) create mode 100644 src/test/ui/type-alias-impl-trait/assoc-type-lifetime-unconstrained.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{assoc-type-lifetime-unconstrained.stderr => assoc-type-lifetime-unconstrained.min_tait.stderr} (85%) create mode 100644 src/test/ui/type-alias-impl-trait/assoc-type-lifetime.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/associated-type-alias-impl-trait.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.rs create mode 100644 src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.stderr create mode 100644 src/test/ui/type-alias-impl-trait/bound_reduction2.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{bound_reduction2.stderr => bound_reduction2.min_tait.stderr} (83%) create mode 100644 src/test/ui/type-alias-impl-trait/bounds-are-checked-2.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{bounds-are-checked-2.stderr => bounds-are-checked-2.min_tait.stderr} (90%) create mode 100644 src/test/ui/type-alias-impl-trait/bounds-are-checked.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{bounds-are-checked.stderr => bounds-are-checked.min_tait.stderr} (81%) create mode 100644 src/test/ui/type-alias-impl-trait/coherence.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{coherence.stderr => coherence.min_tait.stderr} (91%) create mode 100644 src/test/ui/type-alias-impl-trait/declared_but_never_defined.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{declared_but_never_defined.stderr => declared_but_never_defined.min_tait.stderr} (77%) create mode 100644 src/test/ui/type-alias-impl-trait/declared_but_not_defined_in_scope.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{declared_but_not_defined_in_scope.stderr => declared_but_not_defined_in_scope.min_tait.stderr} (86%) create mode 100644 src/test/ui/type-alias-impl-trait/different_defining_uses.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{different_defining_uses.stderr => different_defining_uses.min_tait.stderr} (75%) create mode 100644 src/test/ui/type-alias-impl-trait/different_defining_uses_never_type.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{different_defining_uses_never_type.stderr => different_defining_uses_never_type.min_tait.stderr} (69%) create mode 100644 src/test/ui/type-alias-impl-trait/different_defining_uses_never_type2.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/fallback.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/generic_different_defining_uses.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{generic_different_defining_uses.stderr => generic_different_defining_uses.min_tait.stderr} (78%) create mode 100644 src/test/ui/type-alias-impl-trait/generic_duplicate_lifetime_param.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{generic_duplicate_lifetime_param.stderr => generic_duplicate_lifetime_param.min_tait.stderr} (73%) rename src/test/ui/type-alias-impl-trait/{generic_duplicate_param_use.stderr => generic_duplicate_param_use.full_tait.stderr} (76%) create mode 100644 src/test/ui/type-alias-impl-trait/generic_duplicate_param_use.min_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/generic_duplicate_param_use10.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/generic_duplicate_param_use2.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{generic_duplicate_param_use2.stderr => generic_duplicate_param_use2.min_tait.stderr} (73%) create mode 100644 src/test/ui/type-alias-impl-trait/generic_duplicate_param_use3.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{generic_duplicate_param_use3.stderr => generic_duplicate_param_use3.min_tait.stderr} (73%) create mode 100644 src/test/ui/type-alias-impl-trait/generic_duplicate_param_use4.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{generic_duplicate_param_use4.stderr => generic_duplicate_param_use4.min_tait.stderr} (73%) create mode 100644 src/test/ui/type-alias-impl-trait/generic_duplicate_param_use5.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{generic_duplicate_param_use5.stderr => generic_duplicate_param_use5.min_tait.stderr} (86%) create mode 100644 src/test/ui/type-alias-impl-trait/generic_duplicate_param_use6.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{generic_duplicate_param_use6.stderr => generic_duplicate_param_use6.min_tait.stderr} (86%) create mode 100644 src/test/ui/type-alias-impl-trait/generic_duplicate_param_use7.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/generic_duplicate_param_use8.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{generic_duplicate_param_use8.stderr => generic_duplicate_param_use8.min_tait.stderr} (85%) create mode 100644 src/test/ui/type-alias-impl-trait/generic_duplicate_param_use9.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{generic_duplicate_param_use9.stderr => generic_duplicate_param_use9.min_tait.stderr} (87%) create mode 100644 src/test/ui/type-alias-impl-trait/generic_lifetime_param.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{generic_nondefining_use.stderr => generic_nondefining_use.full_tait.stderr} (80%) create mode 100644 src/test/ui/type-alias-impl-trait/generic_nondefining_use.min_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/generic_not_used.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{generic_not_used.stderr => generic_not_used.min_tait.stderr} (87%) create mode 100644 src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.full_tait.nll.stderr create mode 100644 src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{generic_type_does_not_live_long_enough.nll.stderr => generic_type_does_not_live_long_enough.min_tait.nll.stderr} (83%) rename src/test/ui/type-alias-impl-trait/{generic_type_does_not_live_long_enough.stderr => generic_type_does_not_live_long_enough.min_tait.stderr} (84%) create mode 100644 src/test/ui/type-alias-impl-trait/generic_underconstrained.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{generic_underconstrained.stderr => generic_underconstrained.min_tait.stderr} (89%) create mode 100644 src/test/ui/type-alias-impl-trait/generic_underconstrained2.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{generic_underconstrained2.stderr => generic_underconstrained2.min_tait.stderr} (89%) create mode 100644 src/test/ui/type-alias-impl-trait/impl-with-unconstrained-param.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{impl-with-unconstrained-param.stderr => impl-with-unconstrained-param.min_tait.stderr} (85%) create mode 100644 src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{incoherent-assoc-imp-trait.stderr => incoherent-assoc-imp-trait.min_tait.stderr} (90%) create mode 100644 src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.min_tait.stderr delete mode 100644 src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-52843.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{issue-52843.stderr => issue-52843.min_tait.stderr} (92%) create mode 100644 src/test/ui/type-alias-impl-trait/issue-53096.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-53096.min_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-53598.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{issue-53598.stderr => issue-53598.min_tait.stderr} (91%) create mode 100644 src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.min_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-55099-lifetime-inference.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-57188-associate-impl-capture.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.full_tait.nll.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{issue-57611-trait-alias.nll.stderr => issue-57611-trait-alias.min_tait.nll.stderr} (54%) create mode 100644 src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.min_tait.stderr delete 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-57700.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{issue-57700.stderr => issue-57700.min_tait.stderr} (92%) create mode 100644 src/test/ui/type-alias-impl-trait/issue-57807-associated-type.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-58887.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-58951.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-60407.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-60407.min_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-60564.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{issue-60564.stderr => issue-60564.min_tait.stderr} (85%) create mode 100644 src/test/ui/type-alias-impl-trait/issue-62000-associate-impl-trait-lifetimes.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-63263-closure-return.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-63263-closure-return.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-63279.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-63279.min_tait.stderr delete mode 100644 src/test/ui/type-alias-impl-trait/issue-63279.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-63677-type-alias-coherence.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.min_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-66580-closure-coherence.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-67844-nested-opaque.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-68368-non-defining-use.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{issue-68368-non-defining-use.stderr => issue-68368-non-defining-use.min_tait.stderr} (75%) create mode 100644 src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-error.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{issue-69136-inner-lifetime-resolve-error.stderr => issue-69136-inner-lifetime-resolve-error.min_tait.stderr} (87%) create mode 100644 src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-ok.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-70121.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/issue-74244.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{issue-74244.stderr => issue-74244.min_tait.stderr} (90%) create mode 100644 src/test/ui/type-alias-impl-trait/issue-74761.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{issue-74761.stderr => issue-74761.min_tait.stderr} (88%) create mode 100644 src/test/ui/type-alias-impl-trait/issue-76202-trait-impl-for-tait.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{issue-76202-trait-impl-for-tait.stderr => issue-76202-trait-impl-for-tait.min_tait.stderr} (70%) create mode 100644 src/test/ui/type-alias-impl-trait/nested_type_alias_impl_trait.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/never_reveal_concrete_type.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{never_reveal_concrete_type.stderr => never_reveal_concrete_type.min_tait.stderr} (89%) create mode 100644 src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.min_tait.stderr delete mode 100644 src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.stderr create mode 100644 src/test/ui/type-alias-impl-trait/no_revealing_outside_defining_module.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{no_revealing_outside_defining_module.stderr => no_revealing_outside_defining_module.min_tait.stderr} (89%) create mode 100644 src/test/ui/type-alias-impl-trait/not_a_defining_use.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{not_a_defining_use.stderr => not_a_defining_use.min_tait.stderr} (79%) create mode 100644 src/test/ui/type-alias-impl-trait/not_well_formed.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{not_well_formed.stderr => not_well_formed.min_tait.stderr} (88%) create mode 100644 src/test/ui/type-alias-impl-trait/structural-match-no-leak.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/structural-match-no-leak.min_tait.stderr delete mode 100644 src/test/ui/type-alias-impl-trait/structural-match-no-leak.stderr create mode 100644 src/test/ui/type-alias-impl-trait/structural-match.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/structural-match.min_tait.stderr delete mode 100644 src/test/ui/type-alias-impl-trait/structural-match.stderr create mode 100644 src/test/ui/type-alias-impl-trait/type-alias-impl-trait-const.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{type-alias-impl-trait-const.stderr => type-alias-impl-trait-const.min_tait.stderr} (89%) create mode 100644 src/test/ui/type-alias-impl-trait/type-alias-impl-trait-fns.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/type-alias-impl-trait-sized.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/type-alias-impl-trait-tuple.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/type-alias-impl-trait-unconstrained-lifetime.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{type-alias-impl-trait-unconstrained-lifetime.stderr => type-alias-impl-trait-unconstrained-lifetime.min_tait.stderr} (83%) create mode 100644 src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{type-alias-impl-trait-with-cycle-error.stderr => type-alias-impl-trait-with-cycle-error.min_tait.stderr} (71%) create mode 100644 src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error2.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{type-alias-impl-trait-with-cycle-error2.stderr => type-alias-impl-trait-with-cycle-error2.min_tait.stderr} (73%) create mode 100644 src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-no-traits.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{type-alias-impl-trait-with-no-traits.stderr => type-alias-impl-trait-with-no-traits.min_tait.stderr} (69%) create mode 100644 src/test/ui/type-alias-impl-trait/type-alias-impl-trait.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/type-alias-nested-impl-trait.full_tait.stderr create mode 100644 src/test/ui/type-alias-impl-trait/unused_generic_param.full_tait.stderr rename src/test/ui/type-alias-impl-trait/{unused_generic_param.stderr => unused_generic_param.min_tait.stderr} (80%) create mode 100644 src/test/ui/typeck/auxiliary/issue-81943-lib.rs create mode 100644 src/test/ui/typeck/issue-79040.rs create mode 100644 src/test/ui/typeck/issue-79040.stderr create mode 100644 src/test/ui/typeck/issue-81943.rs create mode 100644 src/test/ui/typeck/issue-81943.stderr create mode 100644 src/test/ui/typeck/issue-82772.rs create mode 100644 src/test/ui/typeck/issue-82772.stderr create mode 100644 src/test/ui/typeck/typeck_type_placeholder_item.full_tait.stderr rename src/test/ui/typeck/{typeck_type_placeholder_item.stderr => typeck_type_placeholder_item.min_tait.stderr} (86%) rename src/test/ui/{issues => unboxed-closures}/issue-18661.rs (100%) rename src/test/ui/{ => unboxed-closures}/type-id-higher-rank.rs (100%) create mode 100644 src/test/ui/unused-crate-deps/extern-loc-bad-loctype.rs create mode 100644 src/test/ui/unused-crate-deps/extern-loc-bad-loctype.stderr create mode 100644 src/test/ui/unused-crate-deps/extern-loc-defl-json.rs create mode 100644 src/test/ui/unused-crate-deps/extern-loc-defl-json.stderr create mode 100644 src/test/ui/unused-crate-deps/extern-loc-json-bad-json.rs create mode 100644 src/test/ui/unused-crate-deps/extern-loc-json-bad-json.stderr create mode 100644 src/test/ui/unused-crate-deps/extern-loc-json-json.rs create mode 100644 src/test/ui/unused-crate-deps/extern-loc-json-json.stderr create mode 100644 src/test/ui/unused-crate-deps/extern-loc-json.rs create mode 100644 src/test/ui/unused-crate-deps/extern-loc-json.stderr create mode 100644 src/test/ui/unused-crate-deps/extern-loc-missing-loc.rs create mode 100644 src/test/ui/unused-crate-deps/extern-loc-missing-loc.stderr create mode 100644 src/test/ui/unused-crate-deps/extern-loc-missing-loctype.rs create mode 100644 src/test/ui/unused-crate-deps/extern-loc-missing-loctype.stderr create mode 100644 src/test/ui/unused-crate-deps/extern-loc-raw-json.rs create mode 100644 src/test/ui/unused-crate-deps/extern-loc-raw-json.stderr create mode 100644 src/test/ui/unused-crate-deps/extern-loc-raw-missing-loc.rs create mode 100644 src/test/ui/unused-crate-deps/extern-loc-raw-missing-loc.stderr create mode 100644 src/test/ui/unused-crate-deps/extern-loc-raw.rs create mode 100644 src/test/ui/unused-crate-deps/extern-loc-raw.stderr create mode 100644 src/test/ui/unused-crate-deps/test.mk create mode 100644 src/test/ui/unwind-abis/feature-gate-c-unwind-enabled.rs create mode 100644 src/test/ui/unwind-abis/feature-gate-c-unwind.rs create mode 100644 src/test/ui/unwind-abis/feature-gate-c-unwind.stderr create mode 100644 src/test/ui/unwind-abis/feature-gate-stdcall-unwind.rs create mode 100644 src/test/ui/unwind-abis/feature-gate-stdcall-unwind.stderr create mode 100644 src/test/ui/unwind-abis/feature-gate-system-unwind.rs create mode 100644 src/test/ui/unwind-abis/feature-gate-system-unwind.stderr create mode 100644 src/test/ui/unwind-abis/feature-gate-thiscall-unwind.rs create mode 100644 src/test/ui/unwind-abis/feature-gate-thiscall-unwind.stderr create mode 100644 src/tools/rustdoc-gui/tester.js rename vendor/{chalk-derive => chalk-derive-0.55.0}/.cargo-checksum.json (100%) rename vendor/{chalk-derive => chalk-derive-0.55.0}/Cargo.toml (100%) rename vendor/{chalk-derive => chalk-derive-0.55.0}/README.md (100%) rename vendor/{chalk-derive => chalk-derive-0.55.0}/src/lib.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/.cargo-checksum.json (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/Cargo.toml (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/README.md (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/cast.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/could_match.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/debug.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/fold.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/fold/binder_impls.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/fold/boring_impls.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/fold/in_place.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/fold/shift.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/fold/subst.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/interner.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/lib.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/visit.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/visit/binder_impls.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/visit/boring_impls.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/visit/visitors.rs (100%) rename vendor/{chalk-ir => chalk-ir-0.55.0}/src/zip.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/.cargo-checksum.json (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/Cargo.toml (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/README.md (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/clauses.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/clauses/builder.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/clauses/builtin_traits.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/clauses/builtin_traits/clone.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/clauses/builtin_traits/copy.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/clauses/builtin_traits/discriminant_kind.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/clauses/builtin_traits/fn_family.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/clauses/builtin_traits/sized.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/clauses/builtin_traits/unsize.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/clauses/dyn_ty.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/clauses/env_elaborator.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/clauses/generalize.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/clauses/program_clauses.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/coherence.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/coherence/orphan.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/coherence/solve.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/coinductive_goal.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/display.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/display/bounds.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/display/identifiers.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/display/items.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/display/render_trait.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/display/state.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/display/stub.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/display/ty.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/display/utils.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/ext.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/goal_builder.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/infer.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/infer/canonicalize.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/infer/instantiate.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/infer/invert.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/infer/test.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/infer/ucanonicalize.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/infer/unify.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/infer/var.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/lib.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/logging.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/logging_db.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/logging_db/id_collector.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/rust_ir.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/solve.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/solve/test/bench.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/solve/truncate.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/split.rs (100%) rename vendor/{chalk-solve => chalk-solve-0.55.0}/src/wf.rs (100%) create mode 100644 vendor/colored/.cargo-checksum.json create mode 100755 vendor/colored/CHANGELOG.md create mode 100644 vendor/colored/Cargo.lock create mode 100644 vendor/colored/Cargo.toml create mode 100755 vendor/colored/Dockerfile create mode 100755 vendor/colored/LICENSE create mode 100755 vendor/colored/README.md create mode 100755 vendor/colored/examples/control.rs create mode 100755 vendor/colored/examples/dynamic_colors.rs create mode 100755 vendor/colored/examples/most_simple.rs create mode 100755 vendor/colored/examples/nested_colors.rs create mode 100755 vendor/colored/src/color.rs create mode 100755 vendor/colored/src/control.rs create mode 100755 vendor/colored/src/formatters.rs create mode 100755 vendor/colored/src/lib.rs create mode 100755 vendor/colored/src/style.rs create mode 100755 vendor/colored/tests/ansi_term_compat.rs delete mode 100644 vendor/const_fn/.cargo-checksum.json delete mode 100644 vendor/const_fn/CHANGELOG.md delete mode 100644 vendor/const_fn/LICENSE-APACHE delete mode 100644 vendor/const_fn/README.md delete mode 100644 vendor/const_fn/build.rs delete mode 100644 vendor/const_fn/src/ast.rs delete mode 100644 vendor/const_fn/src/error.rs delete mode 100644 vendor/const_fn/src/iter.rs delete mode 100644 vendor/const_fn/src/lib.rs delete mode 100644 vendor/const_fn/src/to_tokens.rs delete mode 100644 vendor/const_fn/src/utils.rs delete mode 100644 vendor/crossbeam-epoch/examples/treiber_stack.rs create mode 100644 vendor/crossbeam-epoch/tests/loom.rs delete mode 100644 vendor/crossbeam-queue-0.1.2/.cargo-checksum.json delete mode 100644 vendor/crossbeam-queue-0.1.2/CHANGELOG.md delete mode 100644 vendor/crossbeam-queue-0.1.2/src/lib.rs create mode 100644 vendor/crossbeam-queue/.cargo-checksum.json create mode 100644 vendor/crossbeam-queue/CHANGELOG.md rename vendor/{crossbeam-queue-0.1.2 => crossbeam-queue}/Cargo.toml (76%) rename vendor/{crossbeam-queue-0.1.2 => crossbeam-queue}/LICENSE-APACHE (100%) rename vendor/{crossbeam-utils-0.6.6 => crossbeam-queue}/LICENSE-MIT (100%) rename vendor/{crossbeam-queue-0.1.2 => crossbeam-queue}/LICENSE-THIRD-PARTY (100%) rename vendor/{crossbeam-queue-0.1.2 => crossbeam-queue}/README.md (88%) rename vendor/{crossbeam-queue-0.1.2 => crossbeam-queue}/src/array_queue.rs (90%) rename vendor/{crossbeam-queue-0.1.2 => crossbeam-queue}/src/err.rs (86%) create mode 100644 vendor/crossbeam-queue/src/lib.rs rename vendor/{crossbeam-queue-0.1.2 => crossbeam-queue}/src/seg_queue.rs (90%) rename vendor/{crossbeam-queue-0.1.2 => crossbeam-queue}/tests/array_queue.rs (97%) rename vendor/{crossbeam-queue-0.1.2 => crossbeam-queue}/tests/seg_queue.rs (97%) delete mode 100644 vendor/crossbeam-utils-0.6.6/.cargo-checksum.json delete mode 100644 vendor/crossbeam-utils-0.6.6/CHANGELOG.md delete mode 100644 vendor/crossbeam-utils-0.6.6/Cargo.toml delete mode 100644 vendor/crossbeam-utils-0.6.6/README.md delete mode 100644 vendor/crossbeam-utils-0.6.6/benches/atomic_cell.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/src/atomic/atomic_cell.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/src/atomic/consume.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/src/atomic/mod.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/src/backoff.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/src/cache_padded.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/src/lib.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/src/sync/mod.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/src/sync/parker.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/src/sync/sharded_lock.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/src/sync/wait_group.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/src/thread.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/tests/atomic_cell.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/tests/cache_padded.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/tests/parker.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/tests/sharded_lock.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/tests/thread.rs delete mode 100644 vendor/crossbeam-utils-0.6.6/tests/wait_group.rs create mode 100644 vendor/cstr/.cargo-checksum.json rename vendor/{const_fn => cstr}/Cargo.toml (54%) create mode 100644 vendor/cstr/LICENSE create mode 100644 vendor/cstr/README.md create mode 100644 vendor/cstr/src/lib.rs create mode 100644 vendor/cstr/src/parse.rs create mode 100644 vendor/cstr/tests/clippy_lints.rs create mode 100644 vendor/cstr/tests/compile_fail/empty.rs create mode 100644 vendor/cstr/tests/compile_fail/empty.stderr create mode 100644 vendor/cstr/tests/compile_fail/interior-nul.rs create mode 100644 vendor/cstr/tests/compile_fail/interior-nul.stderr create mode 100644 vendor/cstr/tests/compile_fail/non-str.rs create mode 100644 vendor/cstr/tests/compile_fail/non-str.stderr create mode 100644 vendor/cstr/tests/compile_fail/trash-after.rs create mode 100644 vendor/cstr/tests/compile_fail/trash-after.stderr create mode 100644 vendor/cstr/tests/compile_test.rs create mode 100644 vendor/cstr/tests/pass/byte_str_lit.rs create mode 100644 vendor/cstr/tests/pass/const.rs create mode 100644 vendor/cstr/tests/pass/ident.rs create mode 100644 vendor/cstr/tests/pass/macro.rs create mode 100644 vendor/cstr/tests/pass/str_lit.rs delete mode 100644 vendor/form_urlencoded/src/query_encoding.rs delete mode 100644 vendor/generic-array-0.12.3/.cargo-checksum.json delete mode 100644 vendor/generic-array-0.12.3/src/arr.rs create mode 100644 vendor/generic-array-0.12.4/.cargo-checksum.json rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/CHANGELOG.md (97%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/Cargo.toml (98%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/LICENSE (97%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/README.md (97%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/rustfmt.toml (96%) create mode 100644 vendor/generic-array-0.12.4/src/arr.rs rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/src/functional.rs (97%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/src/hex.rs (97%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/src/impl_serde.rs (96%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/src/impls.rs (95%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/src/iter.rs (95%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/src/lib.rs (96%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/src/sequence.rs (96%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/tests/arr.rs (95%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/tests/generics.rs (97%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/tests/hex.rs (96%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/tests/import_name.rs (96%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/tests/iter.rs (96%) rename vendor/{generic-array-0.12.3 => generic-array-0.12.4}/tests/mod.rs (95%) create mode 100644 vendor/hashbrown-0.9.1/.cargo-checksum.json create mode 100644 vendor/hashbrown-0.9.1/CHANGELOG.md create mode 100644 vendor/hashbrown-0.9.1/Cargo.toml rename vendor/{crossbeam-utils-0.6.6 => hashbrown-0.9.1}/LICENSE-APACHE (100%) rename vendor/{wasi-0.9.0+wasi-snapshot-preview1 => hashbrown-0.9.1}/LICENSE-MIT (96%) create mode 100644 vendor/hashbrown-0.9.1/README.md create mode 100644 vendor/hashbrown-0.9.1/benches/bench.rs create mode 100644 vendor/hashbrown-0.9.1/clippy.toml create mode 100644 vendor/hashbrown-0.9.1/src/external_trait_impls/mod.rs create mode 100644 vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/helpers.rs create mode 100644 vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/map.rs create mode 100644 vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/mod.rs create mode 100644 vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/raw.rs create mode 100644 vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/set.rs create mode 100644 vendor/hashbrown-0.9.1/src/external_trait_impls/serde.rs create mode 100644 vendor/hashbrown-0.9.1/src/lib.rs create mode 100644 vendor/hashbrown-0.9.1/src/macros.rs create mode 100644 vendor/hashbrown-0.9.1/src/map.rs create mode 100644 vendor/hashbrown-0.9.1/src/raw/bitmask.rs create mode 100644 vendor/hashbrown-0.9.1/src/raw/generic.rs create mode 100644 vendor/hashbrown-0.9.1/src/raw/mod.rs create mode 100644 vendor/hashbrown-0.9.1/src/raw/sse2.rs create mode 100644 vendor/hashbrown-0.9.1/src/rustc_entry.rs create mode 100644 vendor/hashbrown-0.9.1/src/scopeguard.rs create mode 100644 vendor/hashbrown-0.9.1/src/set.rs create mode 100644 vendor/hashbrown-0.9.1/tests/hasher.rs create mode 100644 vendor/hashbrown-0.9.1/tests/rayon.rs create mode 100644 vendor/hashbrown-0.9.1/tests/serde.rs create mode 100644 vendor/hashbrown-0.9.1/tests/set.rs create mode 100644 vendor/hashbrown/src/raw/alloc.rs create mode 100644 vendor/idna/benches/all.rs delete mode 100644 vendor/idna/tests/IdnaTest.txt create mode 100644 vendor/idna/tests/IdnaTestV2.txt delete mode 100644 vendor/libc/src/cloudabi/aarch64.rs delete mode 100644 vendor/libc/src/cloudabi/arm.rs delete mode 100644 vendor/libc/src/cloudabi/mod.rs delete mode 100644 vendor/libc/src/cloudabi/x86.rs delete mode 100644 vendor/libc/src/cloudabi/x86_64.rs create mode 100644 vendor/libc/src/unix/haiku/native.rs create mode 100644 vendor/libc/src/unix/linux_like/linux/musl/b64/s390x.rs create mode 100644 vendor/libc/src/unix/linux_like/linux/uclibc/align.rs rename vendor/libc/src/unix/{ => linux_like/linux}/uclibc/arm/align.rs (100%) rename vendor/libc/src/unix/{ => linux_like/linux}/uclibc/arm/mod.rs (78%) rename vendor/libc/src/unix/{ => linux_like/linux}/uclibc/arm/no_align.rs (100%) rename vendor/libc/src/unix/{ => linux_like/linux}/uclibc/mips/mips32/align.rs (100%) rename vendor/libc/src/unix/{ => linux_like/linux}/uclibc/mips/mips32/mod.rs (95%) rename vendor/libc/src/unix/{ => linux_like/linux}/uclibc/mips/mips32/no_align.rs (100%) rename vendor/libc/src/unix/{ => linux_like/linux}/uclibc/mips/mips64/align.rs (100%) rename vendor/libc/src/unix/{ => linux_like/linux}/uclibc/mips/mips64/mod.rs (100%) rename vendor/libc/src/unix/{ => linux_like/linux}/uclibc/mips/mips64/no_align.rs (100%) rename vendor/libc/src/unix/{ => linux_like/linux}/uclibc/mips/mod.rs (78%) create mode 100644 vendor/libc/src/unix/linux_like/linux/uclibc/mod.rs rename vendor/libc/src/unix/{ => linux_like/linux}/uclibc/no_align.rs (100%) rename vendor/libc/src/unix/{ => linux_like/linux}/uclibc/x86_64/l4re.rs (100%) rename vendor/libc/src/unix/{ => linux_like/linux}/uclibc/x86_64/mod.rs (84%) rename vendor/libc/src/unix/{ => linux_like/linux}/uclibc/x86_64/other.rs (100%) delete mode 100644 vendor/libc/src/unix/uclibc/align.rs delete mode 100644 vendor/libc/src/unix/uclibc/mod.rs delete mode 100644 vendor/libc/src/unix/uclibc/x86_64/align.rs delete mode 100644 vendor/libc/src/unix/uclibc/x86_64/no_align.rs mode change 100755 => 100644 vendor/libc/src/vxworks/mod.rs create mode 100644 vendor/measureme/src/counters.rs create mode 100644 vendor/memmap2/.cargo-checksum.json create mode 100644 vendor/memmap2/CHANGELOG.md create mode 100644 vendor/memmap2/Cargo.lock create mode 100644 vendor/memmap2/Cargo.toml create mode 100644 vendor/memmap2/LICENSE-APACHE create mode 100644 vendor/memmap2/LICENSE-MIT create mode 100644 vendor/memmap2/README.md create mode 100644 vendor/memmap2/examples/cat.rs create mode 100644 vendor/memmap2/src/lib.rs create mode 100644 vendor/memmap2/src/unix.rs create mode 100644 vendor/memmap2/src/windows.rs delete mode 100644 vendor/minifier/appveyor.yml rename vendor/minifier/src/css/{css.rs => tests.rs} (90%) rename vendor/minifier/src/js/{js.rs => tools.rs} (82%) create mode 100644 vendor/perf-event-open-sys/.cargo-checksum.json create mode 100644 vendor/perf-event-open-sys/Cargo.toml rename vendor/{wasi-0.9.0+wasi-snapshot-preview1 => perf-event-open-sys}/LICENSE-APACHE (100%) rename vendor/{const_fn => perf-event-open-sys}/LICENSE-MIT (100%) create mode 100644 vendor/perf-event-open-sys/README.md create mode 100755 vendor/perf-event-open-sys/regenerate.sh create mode 100644 vendor/perf-event-open-sys/src/bindings.rs create mode 100644 vendor/perf-event-open-sys/src/lib.rs create mode 100644 vendor/perf-event-open-sys/wrapper.h create mode 100644 vendor/pin-project-lite/tests/expand/README.md create mode 100644 vendor/pin-project-lite/tests/expand/default/enum.expanded.rs create mode 100644 vendor/pin-project-lite/tests/expand/default/enum.rs create mode 100644 vendor/pin-project-lite/tests/expand/default/struct.expanded.rs create mode 100644 vendor/pin-project-lite/tests/expand/default/struct.rs create mode 100644 vendor/pin-project-lite/tests/expand/multifields/enum.expanded.rs create mode 100644 vendor/pin-project-lite/tests/expand/multifields/enum.rs create mode 100644 vendor/pin-project-lite/tests/expand/multifields/struct.expanded.rs create mode 100644 vendor/pin-project-lite/tests/expand/multifields/struct.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/enum-all.expanded.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/enum-all.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/enum-mut.expanded.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/enum-mut.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/enum-none.expanded.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/enum-none.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/enum-ref.expanded.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/enum-ref.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/struct-all.expanded.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/struct-all.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/struct-mut.expanded.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/struct-mut.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/struct-none.expanded.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/struct-none.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/struct-ref.expanded.rs create mode 100644 vendor/pin-project-lite/tests/expand/naming/struct-ref.rs create mode 100644 vendor/pin-project-lite/tests/expand/pub/enum.expanded.rs create mode 100644 vendor/pin-project-lite/tests/expand/pub/enum.rs create mode 100644 vendor/pin-project-lite/tests/expand/pub/struct.expanded.rs create mode 100644 vendor/pin-project-lite/tests/expand/pub/struct.rs create mode 100644 vendor/pin-project-lite/tests/expandtest.rs delete mode 100644 vendor/pin-project-lite/tests/ui/packed.rs delete mode 100644 vendor/pin-project-lite/tests/ui/packed.stderr rename vendor/pin-project-lite/tests/ui/{ => pin_project}/conflict-drop.rs (100%) rename vendor/pin-project-lite/tests/ui/{ => pin_project}/conflict-drop.stderr (100%) rename vendor/pin-project-lite/tests/ui/{ => pin_project}/conflict-unpin.rs (100%) rename vendor/pin-project-lite/tests/ui/{ => pin_project}/conflict-unpin.stderr (100%) rename vendor/pin-project-lite/tests/ui/{ => pin_project}/invalid-bounds.rs (100%) rename vendor/pin-project-lite/tests/ui/{ => pin_project}/invalid-bounds.stderr (100%) rename vendor/pin-project-lite/tests/ui/{ => pin_project}/invalid.rs (100%) rename vendor/pin-project-lite/tests/ui/{ => pin_project}/invalid.stderr (100%) rename vendor/pin-project-lite/tests/ui/{ => pin_project}/overlapping_lifetime_names.rs (100%) rename vendor/pin-project-lite/tests/ui/{ => pin_project}/overlapping_lifetime_names.stderr (100%) rename vendor/pin-project-lite/tests/ui/{ => pin_project}/overlapping_unpin_struct.rs (100%) rename vendor/pin-project-lite/tests/ui/{ => pin_project}/overlapping_unpin_struct.stderr (100%) create mode 100644 vendor/pin-project-lite/tests/ui/pin_project/packed.rs create mode 100644 vendor/pin-project-lite/tests/ui/pin_project/packed.stderr rename vendor/pin-project-lite/tests/ui/{ => pin_project}/unpin_sneaky.rs (100%) rename vendor/pin-project-lite/tests/ui/{ => pin_project}/unpin_sneaky.stderr (100%) rename vendor/pin-project-lite/tests/ui/{ => pin_project}/unsupported.rs (100%) rename vendor/pin-project-lite/tests/ui/{ => pin_project}/unsupported.stderr (100%) rename vendor/{rand => rand-0.7.3}/.cargo-checksum.json (100%) rename vendor/{rand => rand-0.7.3}/CHANGELOG.md (100%) rename vendor/{rand => rand-0.7.3}/COPYRIGHT (100%) rename vendor/{rand => rand-0.7.3}/Cargo.lock (100%) rename vendor/{rand => rand-0.7.3}/Cargo.toml (100%) rename vendor/{rand => rand-0.7.3}/LICENSE-APACHE (100%) rename vendor/{rand => rand-0.7.3}/LICENSE-MIT (100%) rename vendor/{rand => rand-0.7.3}/README.md (100%) rename vendor/{rand => rand-0.7.3}/SECURITY.md (100%) rename vendor/{rand => rand-0.7.3}/benches/generators.rs (100%) rename vendor/{rand => rand-0.7.3}/benches/misc.rs (100%) rename vendor/{rand => rand-0.7.3}/benches/seq.rs (100%) rename vendor/{rand => rand-0.7.3}/benches/weighted.rs (100%) rename vendor/{rand => rand-0.7.3}/examples/monte-carlo.rs (100%) rename vendor/{rand => rand-0.7.3}/examples/monty-hall.rs (100%) rename vendor/{rand => rand-0.7.3}/rustfmt.toml (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/bernoulli.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/binomial.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/cauchy.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/dirichlet.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/exponential.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/float.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/gamma.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/integer.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/mod.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/normal.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/other.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/pareto.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/poisson.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/triangular.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/uniform.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/unit_circle.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/unit_sphere.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/utils.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/weibull.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/weighted/alias_method.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/weighted/mod.rs (100%) rename vendor/{rand => rand-0.7.3}/src/distributions/ziggurat_tables.rs (100%) rename vendor/{rand => rand-0.7.3}/src/lib.rs (100%) rename vendor/{rand => rand-0.7.3}/src/prelude.rs (100%) rename vendor/{rand => rand-0.7.3}/src/rngs/adapter/mod.rs (100%) rename vendor/{rand => rand-0.7.3}/src/rngs/adapter/read.rs (100%) rename vendor/{rand => rand-0.7.3}/src/rngs/adapter/reseeding.rs (100%) rename vendor/{rand => rand-0.7.3}/src/rngs/entropy.rs (100%) rename vendor/{rand => rand-0.7.3}/src/rngs/mock.rs (100%) rename vendor/{rand => rand-0.7.3}/src/rngs/mod.rs (100%) rename vendor/{rand => rand-0.7.3}/src/rngs/small.rs (100%) rename vendor/{rand => rand-0.7.3}/src/rngs/std.rs (100%) rename vendor/{rand => rand-0.7.3}/src/rngs/thread.rs (100%) rename vendor/{rand => rand-0.7.3}/src/seq/index.rs (100%) rename vendor/{rand => rand-0.7.3}/src/seq/mod.rs (100%) rename vendor/{rand_chacha => rand_chacha-0.2.2}/.cargo-checksum.json (100%) rename vendor/{rand_chacha => rand_chacha-0.2.2}/CHANGELOG.md (100%) rename vendor/{rand_chacha => rand_chacha-0.2.2}/COPYRIGHT (100%) rename vendor/{rand_chacha => rand_chacha-0.2.2}/Cargo.toml (100%) rename vendor/{rand_chacha => rand_chacha-0.2.2}/LICENSE-APACHE (100%) rename vendor/{rand_chacha => rand_chacha-0.2.2}/LICENSE-MIT (100%) rename vendor/{rand_chacha => rand_chacha-0.2.2}/README.md (100%) rename vendor/{rand_chacha => rand_chacha-0.2.2}/src/chacha.rs (100%) rename vendor/{rand_chacha => rand_chacha-0.2.2}/src/guts.rs (100%) rename vendor/{rand_chacha => rand_chacha-0.2.2}/src/lib.rs (100%) rename vendor/{rand_core => rand_core-0.5.1}/.cargo-checksum.json (100%) rename vendor/{rand_core => rand_core-0.5.1}/CHANGELOG.md (100%) rename vendor/{rand_core => rand_core-0.5.1}/COPYRIGHT (100%) rename vendor/{rand_core => rand_core-0.5.1}/Cargo.toml (100%) rename vendor/{rand_core => rand_core-0.5.1}/LICENSE-APACHE (100%) rename vendor/{rand_core => rand_core-0.5.1}/LICENSE-MIT (100%) rename vendor/{rand_core => rand_core-0.5.1}/README.md (100%) rename vendor/{rand_core => rand_core-0.5.1}/src/block.rs (100%) rename vendor/{rand_core => rand_core-0.5.1}/src/error.rs (100%) rename vendor/{rand_core => rand_core-0.5.1}/src/impls.rs (100%) rename vendor/{rand_core => rand_core-0.5.1}/src/le.rs (100%) rename vendor/{rand_core => rand_core-0.5.1}/src/lib.rs (100%) rename vendor/{rand_core => rand_core-0.5.1}/src/os.rs (100%) rename vendor/{rand_hc => rand_hc-0.2.0}/.cargo-checksum.json (100%) rename vendor/{rand_hc => rand_hc-0.2.0}/CHANGELOG.md (100%) rename vendor/{rand_hc => rand_hc-0.2.0}/COPYRIGHT (100%) rename vendor/{rand_hc => rand_hc-0.2.0}/Cargo.toml (100%) rename vendor/{rand_hc => rand_hc-0.2.0}/LICENSE-APACHE (100%) rename vendor/{rand_hc => rand_hc-0.2.0}/LICENSE-MIT (100%) rename vendor/{rand_hc => rand_hc-0.2.0}/README.md (100%) rename vendor/{rand_hc => rand_hc-0.2.0}/src/hc128.rs (100%) rename vendor/{rand_hc => rand_hc-0.2.0}/src/lib.rs (100%) delete mode 100644 vendor/rustc-rayon-core/src/internal/mod.rs delete mode 100644 vendor/rustc-rayon-core/src/internal/task.rs delete mode 100644 vendor/rustc-rayon-core/src/internal/worker.rs delete mode 100644 vendor/rustc-rayon-core/src/scope/internal.rs delete mode 100644 vendor/rustc-rayon-core/src/thread_pool/internal.rs create mode 100644 vendor/rustc-rayon/src/iter/multizip.rs create mode 100644 vendor/shlex/LICENSE-APACHE create mode 100644 vendor/shlex/LICENSE-MIT create mode 100644 vendor/shlex/README.md delete mode 100644 vendor/snap/data/COPYING delete mode 100644 vendor/snap/data/Mark.Twain-Tom.Sawyer.txt delete mode 100644 vendor/snap/data/Mark.Twain-Tom.Sawyer.txt.rawsnappy delete mode 100644 vendor/snap/data/alice29.txt delete mode 100644 vendor/snap/data/asyoulik.txt delete mode 100644 vendor/snap/data/baddata1.snappy delete mode 100644 vendor/snap/data/baddata2.snappy delete mode 100644 vendor/snap/data/baddata3.snappy delete mode 100644 vendor/snap/data/fireworks.jpeg delete mode 100644 vendor/snap/data/geo.protodata delete mode 100644 vendor/snap/data/html delete mode 100644 vendor/snap/data/html_x_4 delete mode 100644 vendor/snap/data/kppkn.gtb delete mode 100644 vendor/snap/data/lcet10.txt delete mode 100644 vendor/snap/data/paper-100k.pdf delete mode 100644 vendor/snap/data/plrabn12.txt delete mode 100644 vendor/snap/data/urls.10K create mode 100644 vendor/tracing-log/LICENSE create mode 100644 vendor/tracing-log/tests/reexport_log_crate.rs create mode 100644 vendor/tracing-subscriber/tests/fmt_max_level_hint.rs create mode 100644 vendor/tracing-subscriber/tests/registry_max_level_hint.rs mode change 100644 => 100755 vendor/unicode-normalization/src/no_std_prelude.rs create mode 100644 vendor/unicode-normalization/src/replace.rs create mode 100644 vendor/unified-diff/.cargo-checksum.json create mode 100644 vendor/unified-diff/Cargo.lock create mode 100644 vendor/unified-diff/Cargo.toml create mode 100644 vendor/unified-diff/LICENSE-APACHE rename vendor/{crossbeam-queue-0.1.2 => unified-diff}/LICENSE-MIT (100%) create mode 100644 vendor/unified-diff/README.md create mode 100644 vendor/unified-diff/src/lib.rs create mode 100644 vendor/unified-diff/src/main.rs create mode 100644 vendor/url/tests/data.rs create mode 100644 vendor/url/tests/setters_tests.json create mode 100644 vendor/url/tests/unit.rs create mode 100644 vendor/url/tests/urltestdata.json delete mode 100644 vendor/wasi-0.9.0+wasi-snapshot-preview1/.cargo-checksum.json delete mode 100644 vendor/wasi-0.9.0+wasi-snapshot-preview1/CODE_OF_CONDUCT.md delete mode 100644 vendor/wasi-0.9.0+wasi-snapshot-preview1/CONTRIBUTING.md delete mode 100644 vendor/wasi-0.9.0+wasi-snapshot-preview1/Cargo.toml delete mode 100644 vendor/wasi-0.9.0+wasi-snapshot-preview1/LICENSE-Apache-2.0_WITH_LLVM-exception delete mode 100644 vendor/wasi-0.9.0+wasi-snapshot-preview1/ORG_CODE_OF_CONDUCT.md delete mode 100644 vendor/wasi-0.9.0+wasi-snapshot-preview1/README.md delete mode 100644 vendor/wasi-0.9.0+wasi-snapshot-preview1/SECURITY.md delete mode 100644 vendor/wasi-0.9.0+wasi-snapshot-preview1/src/error.rs delete mode 100644 vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib.rs delete mode 100644 vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib_generated.rs rename vendor/{wasi-0.9.0+wasi-snapshot-preview1 => wasi}/old-bitflags.patch (100%) diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index b600074c19..2827a46ae6 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -1,8 +1,31 @@ # Contributing to Rust -Thank you for your interest in contributing to Rust! +Thank you for your interest in contributing to Rust! There are many ways to contribute +and we appreciate all of them. -To get started, read the [Contributing to Rust] chapter of the [rustc-dev-guide]. +Documentation for contributing to Rust is located in the [Guide to Rustc Development](https://rustc-dev-guide.rust-lang.org/), +commonly known as the [rustc-dev-guide]. Despite the name, this guide documents +not just how to develop rustc (the Rust compiler), but also how to contribute to any part +of the Rust project. + +To get started with contributing, please read the [Contributing to Rust] chapter of the guide. +That chapter explains how to get your development environment set up and how to get help. + +## About the [rustc-dev-guide] + +The [rustc-dev-guide] is meant to help document how rustc –the Rust compiler– works, +as well as to help new contributors get involved in rustc development. It is recommend +to read and understand the [rustc-dev-guide] before making a contribution. This guide +talks about the different bots in the Rust ecosystem, the Rust development tools, +bootstrapping, the compiler architecture, source code representation, and more. + +## [Getting help](https://rustc-dev-guide.rust-lang.org/getting-started.html#asking-questions) + +There are many ways you can get help when you're stuck. Rust has many platforms for this: +[internals], [rust-zulip], and [rust-discord]. It is recommended to ask for help on +the [rust-zulip], but any of these platforms are a great way to seek help and even +find a mentor! You can learn more about asking questions and getting help in the +[Asking Questions](https://rustc-dev-guide.rust-lang.org/getting-started.html#asking-questions) chapter of the [rustc-dev-guide]. ## Bug reports @@ -13,3 +36,6 @@ refer to [this section][contributing-bug-reports] and [open an issue][issue temp [rustc-dev-guide]: https://rustc-dev-guide.rust-lang.org/ [contributing-bug-reports]: https://rustc-dev-guide.rust-lang.org/contributing.html#bug-reports [issue template]: https://github.com/rust-lang/rust/issues/new/choose +[internals]: https://internals.rust-lang.org +[rust-discord]: http://discord.gg/rust-lang +[rust-zulip]: https://rust-lang.zulipchat.com diff --git a/Cargo.lock b/Cargo.lock index 2b68f72581..e5a7b7d9b6 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -37,7 +37,7 @@ version = "0.0.0" dependencies = [ "compiler_builtins", "core", - "rand", + "rand 0.7.3", "rand_xorshift", ] @@ -95,12 +95,6 @@ version = "1.0.34" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bf8dcb5b4bbaa28653b647d8c77bd4ed40183b48882e130c1f1ffb73de069fd7" -[[package]] -name = "arc-swap" -version = "0.4.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d25d88fd6b8041580a654f9d0c581a047baee2b3efee13275f2fc392fc75034" - [[package]] name = "array_tool" version = "1.0.3" @@ -177,7 +171,7 @@ dependencies = [ "block-padding", "byte-tools", "byteorder", - "generic-array 0.12.3", + "generic-array 0.12.4", ] [[package]] @@ -285,7 +279,7 @@ checksum = "81a18687293a1546b67c246452202bbbf143d239cb43494cc163da14979082da" [[package]] name = "cargo" -version = "0.52.0" +version = "0.53.0" dependencies = [ "anyhow", "atty", @@ -325,6 +319,7 @@ dependencies = [ "openssl", "percent-encoding 2.1.0", "pretty_env_logger", + "rand 0.8.3", "rustc-workspace-hack", "rustfix", "same-file", @@ -533,13 +528,15 @@ dependencies = [ [[package]] name = "chrono" -version = "0.4.15" +version = "0.4.19" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "942f72db697d8767c22d46a598e01f2d3b475501ea43d0db4f16d90259182d0b" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" dependencies = [ + "libc", "num-integer", "num-traits", "time", + "winapi 0.3.9", ] [[package]] @@ -560,19 +557,20 @@ dependencies = [ [[package]] name = "clippy" -version = "0.1.51" +version = "0.1.52" dependencies = [ "cargo_metadata 0.12.0", "clippy-mini-macro-test", "clippy_lints", - "compiletest_rs", + "compiletest_rs 0.6.0", "derive-new", + "regex", "rustc-workspace-hack", "rustc_tools_util 0.2.0", "semver 0.11.0", "serde", "tempfile", - "tester", + "tester 0.9.0", ] [[package]] @@ -581,9 +579,10 @@ version = "0.2.0" [[package]] name = "clippy_lints" -version = "0.1.51" +version = "0.1.52" dependencies = [ "cargo_metadata 0.12.0", + "clippy_utils", "if_chain", "itertools 0.9.0", "pulldown-cmark 0.8.0", @@ -593,13 +592,27 @@ dependencies = [ "rustc-semver", "semver 0.11.0", "serde", - "smallvec 1.4.2", + "smallvec 1.6.1", "syn", "toml", "unicode-normalization", "url 2.1.1", ] +[[package]] +name = "clippy_utils" +version = "0.1.52" +dependencies = [ + "if_chain", + "itertools 0.9.0", + "regex-syntax", + "rustc-semver", + "serde", + "smallvec 1.6.1", + "toml", + "unicode-normalization", +] + [[package]] name = "cloudabi" version = "0.1.0" @@ -661,6 +674,7 @@ dependencies = [ name = "compiletest" version = "0.0.0" dependencies = [ + "colored", "diff", "getopts", "glob", @@ -673,6 +687,7 @@ dependencies = [ "serde_json", "tracing", "tracing-subscriber", + "unified-diff", "walkdir", "winapi 0.3.9", ] @@ -695,15 +710,38 @@ dependencies = [ "serde_derive", "serde_json", "tempfile", - "tester", + "tester 0.7.0", + "winapi 0.3.9", +] + +[[package]] +name = "compiletest_rs" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0086d6ad78cf409c3061618cd98e2789d5c9ce598fc9651611cf62eae0a599cb" +dependencies = [ + "diff", + "filetime", + "getopts", + "lazy_static", + "libc", + "log", + "miow 0.3.6", + "regex", + "rustfix", + "serde", + "serde_derive", + "serde_json", + "tempfile", + "tester 0.9.0", "winapi 0.3.9", ] [[package]] name = "const_fn" -version = "0.4.2" +version = "0.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ce90df4c658c62f12d78f7508cf92f9173e5184a539c10bfe54a3107b3ffd0f2" +checksum = "c478836e029dcef17fb47c89023448c64f781a046e0300e257ad8225ae59afab" [[package]] name = "constant_time_eq" @@ -715,7 +753,7 @@ checksum = "245097e9a4535ee1e3e3931fcfcd55a796a44c643e8596ff6566d68f09b87bbc" name = "core" version = "0.0.0" dependencies = [ - "rand", + "rand 0.7.3", ] [[package]] @@ -801,15 +839,6 @@ dependencies = [ "scopeguard", ] -[[package]] -name = "crossbeam-queue" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" -dependencies = [ - "crossbeam-utils 0.6.6", -] - [[package]] name = "crossbeam-queue" version = "0.2.3" @@ -821,16 +850,6 @@ dependencies = [ "maybe-uninit", ] -[[package]] -name = "crossbeam-utils" -version = "0.6.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" -dependencies = [ - "cfg-if 0.1.10", - "lazy_static", -] - [[package]] name = "crossbeam-utils" version = "0.7.2" @@ -866,6 +885,16 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "cstr" +version = "0.2.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c11a39d776a3b35896711da8a04dc1835169dcd36f710878187637314e47941b" +dependencies = [ + "proc-macro2", + "quote", +] + [[package]] name = "ctor" version = "0.1.15" @@ -953,7 +982,7 @@ version = "0.8.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" dependencies = [ - "generic-array 0.12.3", + "generic-array 0.12.4", ] [[package]] @@ -984,6 +1013,16 @@ dependencies = [ "dirs-sys", ] +[[package]] +name = "dirs-next" +version = "2.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b98cf8ebf19c3d1b223e151f99a4f9f0690dca41414773390fc824184ac833e1" +dependencies = [ + "cfg-if 1.0.0", + "dirs-sys-next", +] + [[package]] name = "dirs-sys" version = "0.3.5" @@ -991,7 +1030,18 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8e93d7f5705de3e49895a2b5e0b8855a1c27f080192ae9c32a6432d50741a57a" dependencies = [ "libc", - "redox_users", + "redox_users 0.3.4", + "winapi 0.3.9", +] + +[[package]] +name = "dirs-sys-next" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4ebda144c4fe02d1f7ea1a7d9641b6fc6b580adcfa024ae48797ecdeb6825b4d" +dependencies = [ + "libc", + "redox_users 0.4.0", "winapi 0.3.9", ] @@ -1115,7 +1165,7 @@ checksum = "3ed85775dcc68644b5c950ac06a2b23768d3bc9390464151aaf27136998dcf9e" dependencies = [ "cfg-if 0.1.10", "libc", - "redox_syscall", + "redox_syscall 0.1.57", "winapi 0.3.9", ] @@ -1325,9 +1375,9 @@ dependencies = [ [[package]] name = "generic-array" -version = "0.12.3" +version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec" +checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" dependencies = [ "typenum", ] @@ -1457,9 +1507,15 @@ dependencies = [ [[package]] name = "hashbrown" -version = "0.9.0" +version = "0.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "00d63df3d41950fb462ed38308eea019113ad1508da725bbedcd0fa5a85ef5f7" +checksum = "d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04" + +[[package]] +name = "hashbrown" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "362385356d610bd1e5a408ddf8d022041774b683f345a1d2cfcb4f60f8ae2db5" dependencies = [ "compiler_builtins", "rustc-std-workspace-alloc", @@ -1589,7 +1645,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3ca8957e71f04a205cb162508f9326aea04676c8dfd0711220190d6b83664f3f" dependencies = [ "bitmaps", - "rand_core", + "rand_core 0.5.1", "rand_xoshiro", "sized-chunks", "typenum", @@ -1603,7 +1659,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "55e2e4c765aa53a0424761bf9f41aa7a6ac1efa87238f59560640e27fca028f2" dependencies = [ "autocfg", - "hashbrown", + "hashbrown 0.9.1", ] [[package]] @@ -1698,7 +1754,7 @@ dependencies = [ "regex", "serde", "serde_json", - "shlex", + "shlex 0.1.1", ] [[package]] @@ -1794,7 +1850,7 @@ dependencies = [ "lazy_static", "log", "parking_lot", - "rand", + "rand 0.7.3", "serde", ] @@ -1839,9 +1895,9 @@ checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" [[package]] name = "libc" -version = "0.2.85" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7ccac4b00700875e6a07c6cde370d44d32fa01c5a65cdd2fca6858c479d28bb3" +checksum = "03b07a082330a35e43f63177cc01689da34fbffa0105e1246cf0311472cac73a" dependencies = [ "rustc-std-workspace-core", ] @@ -2053,9 +2109,9 @@ dependencies = [ [[package]] name = "mdbook" -version = "0.4.6" +version = "0.4.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b3d948b64449003363127ed6c6139f03273982c3fe97da4cb3dee933e38ce38f" +checksum = "28f6a882f3880ec68e96f60d6b543c34941e2f307ad10e2992e4db9acfe96529" dependencies = [ "ammonia", "anyhow", @@ -2073,20 +2129,23 @@ dependencies = [ "serde", "serde_derive", "serde_json", - "shlex", + "shlex 1.0.0", "tempfile", "toml", ] [[package]] name = "measureme" -version = "9.0.0" +version = "9.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22bf8d885d073610aee20e7fa205c4341ed32a761dbde96da5fd96301a8d3e82" +checksum = "4a98e07fe802486895addb2b5467f33f205e82c426bfaf350f5d8109b137767c" dependencies = [ + "log", + "memmap", "parking_lot", + "perf-event-open-sys", "rustc-hash", - "smallvec 1.4.2", + "smallvec 1.6.1", ] [[package]] @@ -2105,6 +2164,15 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "memmap2" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04e3e85b970d650e2ae6d70592474087051c11c54da7f7b4949725c5735fbcc6" +dependencies = [ + "libc", +] + [[package]] name = "memoffset" version = "0.5.5" @@ -2138,9 +2206,9 @@ dependencies = [ [[package]] name = "minifier" -version = "0.0.33" +version = "0.0.39" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70bf0db2475f5e627787da77ca52fe33c294063f49f4134b8bc662eedb5e7332" +checksum = "6cdf618de5c9c98d4a7b2e0d1f1e44f82a19196cfd94040bb203621c25d28d98" dependencies = [ "macro-utils", ] @@ -2226,17 +2294,17 @@ name = "miri" version = "0.1.0" dependencies = [ "colored", - "compiletest_rs", + "compiletest_rs 0.5.0", "env_logger 0.7.1", "getrandom 0.2.0", "hex 0.4.2", "libc", "log", - "rand", + "rand 0.7.3", "rustc-workspace-hack", "rustc_version", "shell-escape", - "smallvec 1.4.2", + "smallvec 1.6.1", ] [[package]] @@ -2298,9 +2366,9 @@ dependencies = [ [[package]] name = "once_cell" -version = "1.4.1" +version = "1.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "260e51e7efe62b592207e9e13a68e43692a7a279171d6ba57abd208bf23645ad" +checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" [[package]] name = "opaque-debug" @@ -2432,7 +2500,7 @@ dependencies = [ "log", "mio-named-pipes", "miow 0.3.6", - "rand", + "rand 0.7.3", "tokio", "winapi 0.3.9", ] @@ -2458,8 +2526,8 @@ dependencies = [ "cloudabi", "instant", "libc", - "redox_syscall", - "smallvec 1.4.2", + "redox_syscall 0.1.57", + "smallvec 1.6.1", "winapi 0.3.9", ] @@ -2481,6 +2549,15 @@ version = "2.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e" +[[package]] +name = "perf-event-open-sys" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ce9bedf5da2c234fdf2391ede2b90fabf585355f33100689bc364a3ea558561a" +dependencies = [ + "libc", +] + [[package]] name = "pest" version = "2.1.3" @@ -2560,7 +2637,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "17367f0cc86f2d25802b2c26ee58a7b23faeccf78a396094c13dced0d0182526" dependencies = [ "phf_shared", - "rand", + "rand 0.7.3", ] [[package]] @@ -2807,12 +2884,24 @@ checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ "getrandom 0.1.14", "libc", - "rand_chacha", - "rand_core", - "rand_hc", + "rand_chacha 0.2.2", + "rand_core 0.5.1", + "rand_hc 0.2.0", "rand_pcg", ] +[[package]] +name = "rand" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" +dependencies = [ + "libc", + "rand_chacha 0.3.0", + "rand_core 0.6.2", + "rand_hc 0.3.0", +] + [[package]] name = "rand_chacha" version = "0.2.2" @@ -2820,7 +2909,17 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ "ppv-lite86", - "rand_core", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_chacha" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" +dependencies = [ + "ppv-lite86", + "rand_core 0.6.2", ] [[package]] @@ -2832,13 +2931,31 @@ dependencies = [ "getrandom 0.1.14", ] +[[package]] +name = "rand_core" +version = "0.6.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" +dependencies = [ + "getrandom 0.2.0", +] + [[package]] name = "rand_hc" version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core", + "rand_core 0.5.1", +] + +[[package]] +name = "rand_hc" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core 0.6.2", ] [[package]] @@ -2847,7 +2964,7 @@ version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "16abd0c1b639e9eb4d7c50c0b8100b0d0f849be2349829c740fe8e6eb4816429" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -2856,7 +2973,7 @@ version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "77d416b86801d23dde1aa643023b775c3a462efc0ed96443add11546cdf1dca8" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -2865,7 +2982,7 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a9fcdd2e881d02f1d9390ae47ad8e5696a9e4be7b547a1da2afbc61973217004" dependencies = [ - "rand_core", + "rand_core 0.5.1", ] [[package]] @@ -2887,7 +3004,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e92e15d89083484e11353891f1af602cc661426deb9564c298b270c726973280" dependencies = [ "crossbeam-deque", - "crossbeam-queue 0.2.3", + "crossbeam-queue", "crossbeam-utils 0.7.2", "lazy_static", "num_cpus", @@ -2899,6 +3016,15 @@ version = "0.1.57" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" +[[package]] +name = "redox_syscall" +version = "0.2.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9" +dependencies = [ + "bitflags", +] + [[package]] name = "redox_users" version = "0.3.4" @@ -2906,10 +3032,20 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09b23093265f8d200fa7b4c2c76297f47e681c655f6f1285a8780d6a022f7431" dependencies = [ "getrandom 0.1.14", - "redox_syscall", + "redox_syscall 0.1.57", "rust-argon2", ] +[[package]] +name = "redox_users" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +dependencies = [ + "getrandom 0.2.0", + "redox_syscall 0.2.5", +] + [[package]] name = "regex" version = "1.4.3" @@ -2978,7 +3114,7 @@ dependencies = [ "num_cpus", "ordslice", "racer", - "rand", + "rand 0.7.3", "rayon", "regex", "rls-analysis", @@ -3049,7 +3185,7 @@ dependencies = [ "env_logger 0.7.1", "futures 0.3.12", "log", - "rand", + "rand 0.7.3", "rls-data", "rls-ipc", "serde", @@ -3110,7 +3246,7 @@ version = "705.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "93575affa286089b92c8208aea4e60fe9fdd251a619a09b566d6e4e2cc123212" dependencies = [ - "smallvec 1.4.2", + "smallvec 1.6.1", ] [[package]] @@ -3126,7 +3262,7 @@ dependencies = [ "rustc-ap-rustc_macros", "rustc-ap-rustc_serialize", "rustc-ap-rustc_span", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -3201,7 +3337,7 @@ dependencies = [ "rustc-hash", "rustc-rayon", "rustc-rayon-core", - "smallvec 1.4.2", + "smallvec 1.6.1", "stable_deref_trait", "stacker", "tempfile", @@ -3249,7 +3385,7 @@ dependencies = [ "rustc-ap-rustc_serialize", "rustc-ap-rustc_session", "rustc-ap-rustc_span", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -3337,7 +3473,7 @@ dependencies = [ "rustc-ap-rustc_lexer", "rustc-ap-rustc_session", "rustc-ap-rustc_span", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", "unicode-normalization", ] @@ -3349,7 +3485,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bc232e2a351d8131c8f1386ce372ee22ef7b1b0b897bbf817a8ce4792029a564" dependencies = [ "indexmap", - "smallvec 1.4.2", + "smallvec 1.6.1", ] [[package]] @@ -3436,9 +3572,9 @@ dependencies = [ [[package]] name = "rustc-rayon" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f32767f90d938f1b7199a174ef249ae1924f6e5bbdb9d112fea141e016f25b3a" +checksum = "ed7d6a39f8bfd4421ce720918234d1e672b83824c91345b47c93746839cf1629" dependencies = [ "crossbeam-deque", "either", @@ -3447,13 +3583,13 @@ dependencies = [ [[package]] name = "rustc-rayon-core" -version = "0.3.0" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ea2427831f0053ea3ea73559c8eabd893133a51b251d142bacee53c62a288cb3" +checksum = "e94187d9ea3e8c38fafdbc38acb94eafa7ce155867f6ccb13830466a0d0db8c6" dependencies = [ "crossbeam-deque", - "crossbeam-queue 0.1.2", - "crossbeam-utils 0.6.6", + "crossbeam-queue", + "crossbeam-utils 0.7.2", "lazy_static", "num_cpus", ] @@ -3497,8 +3633,8 @@ dependencies = [ "quote", "serde", "serde_json", - "smallvec 0.6.13", - "smallvec 1.4.2", + "smallvec 0.6.14", + "smallvec 1.6.1", "syn", "url 2.1.1", "winapi 0.3.9", @@ -3509,14 +3645,15 @@ name = "rustc_apfloat" version = "0.0.0" dependencies = [ "bitflags", - "smallvec 1.4.2", + "smallvec 1.6.1", ] [[package]] name = "rustc_arena" version = "0.0.0" dependencies = [ - "smallvec 1.4.2", + "rustc_data_structures", + "smallvec 1.6.1", ] [[package]] @@ -3530,7 +3667,7 @@ dependencies = [ "rustc_macros", "rustc_serialize", "rustc_span", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -3548,7 +3685,7 @@ dependencies = [ "rustc_session", "rustc_span", "rustc_target", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -3605,12 +3742,13 @@ dependencies = [ "rustc_errors", "rustc_expand", "rustc_feature", + "rustc_lexer", "rustc_parse", "rustc_parse_format", "rustc_session", "rustc_span", "rustc_target", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -3619,6 +3757,7 @@ name = "rustc_codegen_llvm" version = "0.0.0" dependencies = [ "bitflags", + "cstr", "libc", "measureme", "rustc-demangle", @@ -3638,7 +3777,7 @@ dependencies = [ "rustc_session", "rustc_span", "rustc_target", - "smallvec 1.4.2", + "smallvec 1.6.1", "snap", "tracing", ] @@ -3652,8 +3791,7 @@ dependencies = [ "itertools 0.9.0", "jobserver", "libc", - "memmap", - "num_cpus", + "memmap2", "pathdiff", "rustc_apfloat", "rustc_ast", @@ -3696,7 +3834,7 @@ dependencies = [ "rustc_index", "rustc_macros", "rustc_serialize", - "smallvec 1.4.2", + "smallvec 1.6.1", "stable_deref_trait", "stacker", "tempfile", @@ -3724,6 +3862,7 @@ dependencies = [ "rustc_metadata", "rustc_middle", "rustc_mir", + "rustc_mir_build", "rustc_parse", "rustc_plugin_impl", "rustc_save_analysis", @@ -3731,6 +3870,7 @@ dependencies = [ "rustc_session", "rustc_span", "rustc_target", + "rustc_typeck", "tracing", "tracing-subscriber", "tracing-tree", @@ -3777,7 +3917,7 @@ dependencies = [ "rustc_serialize", "rustc_session", "rustc_span", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -3809,7 +3949,7 @@ dependencies = [ "rustc_serialize", "rustc_span", "rustc_target", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -3828,7 +3968,7 @@ dependencies = [ name = "rustc_incremental" version = "0.0.0" dependencies = [ - "rand", + "rand 0.7.3", "rustc_ast", "rustc_data_structures", "rustc_fs_util", @@ -3867,7 +4007,7 @@ dependencies = [ "rustc_session", "rustc_span", "rustc_target", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -3877,6 +4017,7 @@ version = "0.0.0" dependencies = [ "libc", "rustc-rayon", + "rustc-rayon-core", "rustc_ast", "rustc_ast_lowering", "rustc_ast_passes", @@ -3889,6 +4030,7 @@ dependencies = [ "rustc_expand", "rustc_hir", "rustc_incremental", + "rustc_index", "rustc_lint", "rustc_metadata", "rustc_middle", @@ -3898,6 +4040,7 @@ dependencies = [ "rustc_passes", "rustc_plugin_impl", "rustc_privacy", + "rustc_query_impl", "rustc_resolve", "rustc_serialize", "rustc_session", @@ -3908,7 +4051,7 @@ dependencies = [ "rustc_traits", "rustc_ty_utils", "rustc_typeck", - "smallvec 1.4.2", + "smallvec 1.6.1", "tempfile", "tracing", "winapi 0.3.9", @@ -3936,6 +4079,7 @@ dependencies = [ "rustc_index", "rustc_middle", "rustc_parse_format", + "rustc_serialize", "rustc_session", "rustc_span", "rustc_target", @@ -3981,7 +4125,7 @@ name = "rustc_metadata" version = "0.0.0" dependencies = [ "libc", - "memmap", + "memmap2", "rustc_ast", "rustc_attr", "rustc_data_structures", @@ -3997,7 +4141,7 @@ dependencies = [ "rustc_session", "rustc_span", "rustc_target", - "smallvec 1.4.2", + "smallvec 1.6.1", "snap", "stable_deref_trait", "tracing", @@ -4029,7 +4173,7 @@ dependencies = [ "rustc_span", "rustc_target", "rustc_type_ir", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -4060,7 +4204,7 @@ dependencies = [ "rustc_span", "rustc_target", "rustc_trait_selection", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -4083,7 +4227,7 @@ dependencies = [ "rustc_span", "rustc_target", "rustc_trait_selection", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -4100,7 +4244,7 @@ dependencies = [ "rustc_lexer", "rustc_session", "rustc_span", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", "unicode-normalization", ] @@ -4118,6 +4262,7 @@ name = "rustc_passes" version = "0.0.0" dependencies = [ "rustc_ast", + "rustc_ast_pretty", "rustc_attr", "rustc_data_structures", "rustc_errors", @@ -4163,6 +4308,29 @@ dependencies = [ "tracing", ] +[[package]] +name = "rustc_query_impl" +version = "0.0.0" +dependencies = [ + "measureme", + "rustc-rayon-core", + "rustc_ast", + "rustc_attr", + "rustc_data_structures", + "rustc_errors", + "rustc_feature", + "rustc_hir", + "rustc_index", + "rustc_macros", + "rustc_middle", + "rustc_query_system", + "rustc_serialize", + "rustc_session", + "rustc_span", + "rustc_target", + "tracing", +] + [[package]] name = "rustc_query_system" version = "0.0.0" @@ -4175,8 +4343,9 @@ dependencies = [ "rustc_index", "rustc_macros", "rustc_serialize", + "rustc_session", "rustc_span", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -4200,7 +4369,7 @@ dependencies = [ "rustc_middle", "rustc_session", "rustc_span", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -4229,7 +4398,7 @@ version = "0.0.0" dependencies = [ "indexmap", "rustc_macros", - "smallvec 1.4.2", + "smallvec 1.6.1", ] [[package]] @@ -4326,7 +4495,7 @@ dependencies = [ "rustc_session", "rustc_span", "rustc_target", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -4346,7 +4515,7 @@ dependencies = [ "rustc_middle", "rustc_span", "rustc_trait_selection", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -4396,7 +4565,7 @@ dependencies = [ "rustc_span", "rustc_target", "rustc_trait_selection", - "smallvec 1.4.2", + "smallvec 1.6.1", "tracing", ] @@ -4423,8 +4592,11 @@ dependencies = [ "rustdoc-json-types", "serde", "serde_json", - "smallvec 1.4.2", + "smallvec 1.6.1", "tempfile", + "tracing", + "tracing-subscriber", + "tracing-tree", ] [[package]] @@ -4432,6 +4604,7 @@ name = "rustdoc-json-types" version = "0.1.0" dependencies = [ "serde", + "serde_json", ] [[package]] @@ -4507,6 +4680,12 @@ dependencies = [ "unicode_categories", ] +[[package]] +name = "rustversion" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5d2a036dc6d2d8fd16fde3498b04306e29bd193bf306a57427019b823d5acd" + [[package]] name = "ryu" version = "1.0.5" @@ -4593,7 +4772,7 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "f301af10236f6df4160f7c3f04eec6dbc70ace82d23326abad5edee88801c6b6" dependencies = [ - "semver-parser 0.10.1", + "semver-parser 0.10.2", "serde", ] @@ -4605,9 +4784,9 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" [[package]] name = "semver-parser" -version = "0.10.1" +version = "0.10.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42ef146c2ad5e5f4b037cd6ce2ebb775401729b19a82040c1beac9d36c7d1428" +checksum = "00b0bef5b7f9e0df16536d3961cfb6e84331c065b4066afb39768d0e319411f7" dependencies = [ "pest", ] @@ -4704,9 +4883,9 @@ dependencies = [ [[package]] name = "sharded-slab" -version = "0.0.9" +version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "06d5a3f5166fb5b42a5439f2eee8b9de149e235961e3eb21c5808fc3ea17ff3e" +checksum = "79c719719ee05df97490f80a45acfc99e5a30ce98a1e4fb67aee422745ae14e3" dependencies = [ "lazy_static", ] @@ -4723,13 +4902,18 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" +[[package]] +name = "shlex" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "42a568c8f2cd051a4d283bd6eb0343ac214c1b0f1ac19f93e1175b2dee38c73d" + [[package]] name = "signal-hook-registry" -version = "1.2.1" +version = "1.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a3e12110bc539e657a646068aaf5eb5b63af9d0c1f7b29c97113fad80e15f035" +checksum = "ce32ea0c6c56d5eacaeb814fbed9960547021d3edd010ded1425f180536b20ab" dependencies = [ - "arc-swap", "libc", ] @@ -4741,9 +4925,9 @@ checksum = "fa8f3741c7372e75519bd9346068370c9cdaabcc1f9599cbcf2a2719352286b7" [[package]] name = "sized-chunks" -version = "0.6.2" +version = "0.6.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ec31ceca5644fa6d444cc77548b88b67f46db6f7c71683b0f9336e671830d2f" +checksum = "65e65d6a9f13cd78f361ea5a2cf53a45d67cdda421ba0316b9be101560f3d207" dependencies = [ "bitmaps", "typenum", @@ -4757,18 +4941,18 @@ checksum = "c111b5bd5695e56cffe5129854aa230b39c93a305372fdbb2668ca2394eea9f8" [[package]] name = "smallvec" -version = "0.6.13" +version = "0.6.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7b0758c52e15a8b5e3691eae6cc559f08eee9406e548a4477ba4e67770a82b6" +checksum = "b97fcaeba89edba30f044a10c6a3cc39df9c3f17d7cd829dd1446cab35f890e0" dependencies = [ "maybe-uninit", ] [[package]] name = "smallvec" -version = "1.4.2" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252" +checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "snap" @@ -4784,7 +4968,7 @@ checksum = "7fd8b795c389288baa5f355489c65e71fd48a02104600d15c4cfbc561e9e429d" dependencies = [ "cfg-if 0.1.10", "libc", - "redox_syscall", + "redox_syscall 0.1.57", "winapi 0.3.9", ] @@ -4818,7 +5002,7 @@ dependencies = [ "core", "dlmalloc", "fortanix-sgx-abi", - "hashbrown", + "hashbrown 0.11.0", "hermit-abi", "libc", "miniz_oxide", @@ -4826,7 +5010,7 @@ dependencies = [ "panic_abort", "panic_unwind", "profiler_builtins", - "rand", + "rand 0.7.3", "rustc-demangle", "unwind", "wasi", @@ -4945,7 +5129,7 @@ checksum = "c8a4c1d0bee3230179544336c15eefb563cf0302955d962e456542323e8c2e8a" dependencies = [ "filetime", "libc", - "redox_syscall", + "redox_syscall 0.1.57", "xattr", ] @@ -4957,8 +5141,8 @@ checksum = "7a6e24d9338a0a5be79593e2fa15a648add6138caa803e2d5bc782c371732ca9" dependencies = [ "cfg-if 0.1.10", "libc", - "rand", - "redox_syscall", + "rand 0.7.3", + "redox_syscall 0.1.57", "remove_dir_all", "winapi 0.3.9", ] @@ -4992,6 +5176,17 @@ dependencies = [ "winapi 0.3.9", ] +[[package]] +name = "term" +version = "0.7.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c59df8ac95d96ff9bede18eb7300b0fda5e5d8d90960e76f8e14ae765eedbf1f" +dependencies = [ + "dirs-next", + "rustversion", + "winapi 0.3.9", +] + [[package]] name = "termcolor" version = "1.1.0" @@ -5037,6 +5232,19 @@ dependencies = [ "term 0.6.1", ] +[[package]] +name = "tester" +version = "0.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0639d10d8f4615f223a57275cf40f9bdb7cfbb806bcb7f7cc56e3beb55a576eb" +dependencies = [ + "cfg-if 1.0.0", + "getopts", + "libc", + "num_cpus", + "term 0.7.0", +] + [[package]] name = "textwrap" version = "0.11.0" @@ -5170,20 +5378,21 @@ checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6" [[package]] name = "tracing" -version = "0.1.19" +version = "0.1.25" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6d79ca061b032d6ce30c660fded31189ca0b9922bf483cd70759f13a2d86786c" +checksum = "01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f" dependencies = [ - "cfg-if 0.1.10", + "cfg-if 1.0.0", + "pin-project-lite 0.2.4", "tracing-attributes", "tracing-core", ] [[package]] name = "tracing-attributes" -version = "0.1.11" +version = "0.1.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "80e0ccfc3378da0cce270c946b676a376943f5cd16aeba64568e7939806f4ada" +checksum = "a8a9bd1db7706f2373a190b0d067146caa39350c486f3d455b0e33b431f94c07" dependencies = [ "proc-macro2", "quote", @@ -5201,9 +5410,9 @@ dependencies = [ [[package]] name = "tracing-log" -version = "0.1.1" +version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e0f8c7178e13481ff6765bd169b33e8d554c5d2bbede5e32c356194be02b9b9" +checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3" dependencies = [ "lazy_static", "log", @@ -5222,9 +5431,9 @@ dependencies = [ [[package]] name = "tracing-subscriber" -version = "0.2.13" +version = "0.2.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ef0a5e15477aa303afbfac3a44cba9b6430fdaad52423b1e6c0dbbe28c3eedd" +checksum = "8ab8966ac3ca27126141f7999361cc97dd6fb4b71da04c02044fa9045d98bb96" dependencies = [ "ansi_term 0.12.1", "chrono", @@ -5235,7 +5444,7 @@ dependencies = [ "serde", "serde_json", "sharded-slab", - "smallvec 1.4.2", + "smallvec 1.6.1", "thread_local", "tracing", "tracing-core", @@ -5245,15 +5454,15 @@ dependencies = [ [[package]] name = "tracing-tree" -version = "0.1.6" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "43aac8afb493b08e1e1904956f7407c1e671b9c83b26a17e1bd83d6a3520e350" +checksum = "1712b40907f8d9bc2bc66763ab61dec914b7123d7149e59feb0d4e2a95fc4967" dependencies = [ "ansi_term 0.12.1", "atty", - "chrono", "termcolor", "tracing", + "tracing-log", "tracing-subscriber", ] @@ -5358,6 +5567,15 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" +[[package]] +name = "unified-diff" +version = "0.2.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "496a3d395ed0c30f411ceace4a91f7d93b148fb5a9b383d5d4cff7850f048d5f" +dependencies = [ + "diff", +] + [[package]] name = "unstable-book-gen" version = "0.1.0" diff --git a/README.md b/README.md index 6ab11e7e2b..5ec94e189f 100644 --- a/README.md +++ b/README.md @@ -31,7 +31,7 @@ by running `./x.py --help` or reading the [rustc dev guide][rustcguidebuild]. * `g++` 5.1 or later or `clang++` 3.5 or later * `python` 3 or 2.7 * GNU `make` 3.81 or later - * `cmake` 3.4.3 or later + * `cmake` 3.13.4 or later * `ninja` * `curl` * `git` @@ -90,7 +90,7 @@ build. [MSYS2][msys2] can be used to easily build Rust on Windows: -[msys2]: https://msys2.github.io/ +[msys2]: https://www.msys2.org/ 1. Grab the latest [MSYS2 installer][msys2] and go through the installer. diff --git a/RELEASES.md b/RELEASES.md index 314482c971..5dca7abcb2 100644 --- a/RELEASES.md +++ b/RELEASES.md @@ -1,174 +1,3 @@ -Version 1.51.0 (2021-03-25) -============================ - -Language --------- -- [You can now parameterize items such as functions, traits, and `struct`s by constant - values in addition to by types and lifetimes.][79135] Also known as "const generics" - E.g. you can now write the following. Note: Only values of primitive integers, - `bool`, or `char` types are currently permitted. - ```rust - struct GenericArray { - inner: [T; LENGTH] - } - - impl GenericArray { - const fn last(&self) -> Option<&T> { - if LENGTH == 0 { - None - } else { - Some(&self.inner[LENGTH - 1]) - } - } - } - ``` - - -Compiler --------- - -- [Added the `-Csplit-debuginfo` codegen option for macOS platforms.][79570] - This option controls whether debug information is split across multiple files - or packed into a single file. **Note** This option is unstable on other platforms. -- [Added tier 3\* support for `aarch64_be-unknown-linux-gnu`, - `aarch64-unknown-linux-gnu_ilp32`, and `aarch64_be-unknown-linux-gnu_ilp32` targets.][81455] -- [Added tier 3 support for `i386-unknown-linux-gnu` and `i486-unknown-linux-gnu` targets.][80662] -- [The `target-cpu=native` option will now detect individual features of CPUs.][80749] -- [Rust now uses `inline-asm` for stack probes when used with LLVM 11.0.1+][77885] - -\* Refer to Rust's [platform support page][forge-platform-support] for more -information on Rust's tiered platform support. - -Libraries ---------- - -- [`Box::downcast` is now also implemented for any `dyn Any + Send + Sync` object.][80945] -- [`str` now implements `AsMut`.][80279] -- [`u64` and `u128` now implement `From`.][79502] -- [`Error` is now implemented for `&T` where `T` implements `Error`.][75180] -- [`Poll::{map_ok, map_err}` are now implemented for `Poll>>`.][80968] -- [`unsigned_abs` is now implemented for all signed integer types.][80959] -- [`io::Empty` now implements `io::Seek`.][78044] -- [`rc::Weak` and `sync::Weak`'s methods such as `as_ptr` are now implemented for - `T: ?Sized` types.][80764] - -Stabilized APIs ---------------- - -- [`Arc::decrement_strong_count`] -- [`Arc::increment_strong_count`] -- [`Once::call_once_force`] -- [`Peekable::next_if_eq`] -- [`Peekable::next_if`] -- [`Seek::stream_position`] -- [`array::IntoIter`] -- [`panic::panic_any`] -- [`ptr::addr_of!`] -- [`ptr::addr_of_mut!`] -- [`slice::fill_with`] -- [`slice::split_inclusive_mut`] -- [`slice::split_inclusive`] -- [`slice::strip_prefix`] -- [`slice::strip_suffix`] -- [`str::split_inclusive`] -- [`sync::OnceState`] -- [`task::Wake`] - -Cargo ------ -- [Added the `split-debuginfo` profile option to control the -Csplit-debuginfo - codegen option.][cargo/9112] -- [Added the `resolver` field to `Cargo.toml` to enable the new feature resolver - and CLI option behavior.][cargo/8997] Version 2 of the feature resolver will try - to avoid unifying features of dependencies where that unification could be unwanted. - Such as using the same dependency with a `std` feature in a build scripts and - proc-macros, while using the `no-std` feature in the final binary. See the - [Cargo book documentation][feature-resolver@2.0] for more information on the feature. - -Rustdoc -------- - -- [Rustdoc will now include documentation for methods available from `Deref` traits.][80653] -- [You can now provide a `--default-theme` flag which sets the default theme to use for - documentation.][79642] - -Various improvements to intra-doc links: - -- [You can link to non-path primitives such as `slice`.][80181] -- [You can link to associated items.][74489] -- [You can now include generic parameters when linking to items, like `Vec`.][76934] - -Misc ----- -- [You can now pass `--include-ignored` to tests (e.g. with - `cargo test -- --include-ignored`) to include testing tests marked `#[ignore]`.][80053] - -Compatibility Notes -------------------- - -- [WASI platforms no longer use the `wasm-bindgen` ABI, and instead use the wasm32 ABI.][79998] -- [`rustc` no longer promotes division, modulo and indexing operations to `const` that - could fail.][80579] -- [The minimum version of glibc for the following platforms has been bumped to version 2.31 - for the distributed artifacts.][81521] - - `armv5te-unknown-linux-gnueabi` - - `sparc64-unknown-linux-gnu` - - `thumbv7neon-unknown-linux-gnueabihf` - - `armv7-unknown-linux-gnueabi` - - `x86_64-unknown-linux-gnux32` - -Internal Only -------------- - -- [Consistently avoid constructing optimized MIR when not doing codegen][80718] - -[79135]: https://github.com/rust-lang/rust/pull/79135 -[74489]: https://github.com/rust-lang/rust/pull/74489 -[76934]: https://github.com/rust-lang/rust/pull/76934 -[79570]: https://github.com/rust-lang/rust/pull/79570 -[80181]: https://github.com/rust-lang/rust/pull/80181 -[79642]: https://github.com/rust-lang/rust/pull/79642 -[80945]: https://github.com/rust-lang/rust/pull/80945 -[80279]: https://github.com/rust-lang/rust/pull/80279 -[80053]: https://github.com/rust-lang/rust/pull/80053 -[79502]: https://github.com/rust-lang/rust/pull/79502 -[75180]: https://github.com/rust-lang/rust/pull/75180 -[79135]: https://github.com/rust-lang/rust/pull/79135 -[81521]: https://github.com/rust-lang/rust/pull/81521 -[80968]: https://github.com/rust-lang/rust/pull/80968 -[80959]: https://github.com/rust-lang/rust/pull/80959 -[80718]: https://github.com/rust-lang/rust/pull/80718 -[80653]: https://github.com/rust-lang/rust/pull/80653 -[80579]: https://github.com/rust-lang/rust/pull/80579 -[79998]: https://github.com/rust-lang/rust/pull/79998 -[78044]: https://github.com/rust-lang/rust/pull/78044 -[81455]: https://github.com/rust-lang/rust/pull/81455 -[80764]: https://github.com/rust-lang/rust/pull/80764 -[80749]: https://github.com/rust-lang/rust/pull/80749 -[80662]: https://github.com/rust-lang/rust/pull/80662 -[77885]: https://github.com/rust-lang/rust/pull/77885 -[cargo/8997]: https://github.com/rust-lang/cargo/pull/8997 -[cargo/9112]: https://github.com/rust-lang/cargo/pull/9112 -[feature-resolver@2.0]: https://doc.rust-lang.org/nightly/cargo/reference/features.html#feature-resolver-version-2 -[`Once::call_once_force`]: https://doc.rust-lang.org/stable/std/sync/struct.Once.html#method.call_once_force -[`sync::OnceState`]: https://doc.rust-lang.org/stable/std/sync/struct.OnceState.html -[`panic::panic_any`]: https://doc.rust-lang.org/stable/std/panic/fn.panic_any.html -[`slice::strip_prefix`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.strip_prefix -[`slice::strip_suffix`]: https://doc.rust-lang.org/stable/std/primitive.slice.html#method.strip_prefix -[`Arc::increment_strong_count`]: https://doc.rust-lang.org/nightly/std/sync/struct.Arc.html#method.increment_strong_count -[`Arc::decrement_strong_count`]: https://doc.rust-lang.org/nightly/std/sync/struct.Arc.html#method.decrement_strong_count -[`slice::fill_with`]: https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.fill_with -[`ptr::addr_of!`]: https://doc.rust-lang.org/nightly/std/ptr/macro.addr_of.html -[`ptr::addr_of_mut!`]: https://doc.rust-lang.org/nightly/std/ptr/macro.addr_of_mut.html -[`array::IntoIter`]: https://doc.rust-lang.org/nightly/std/array/struct.IntoIter.html -[`slice::split_inclusive`]: https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_inclusive -[`slice::split_inclusive_mut`]: https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.split_inclusive_mut -[`str::split_inclusive`]: https://doc.rust-lang.org/nightly/std/primitive.str.html#method.split_inclusive -[`task::Wake`]: https://doc.rust-lang.org/nightly/std/task/trait.Wake.html -[`Seek::stream_position`]: https://doc.rust-lang.org/nightly/std/io/trait.Seek.html#method.stream_position -[`Peekable::next_if`]: https://doc.rust-lang.org/nightly/std/iter/struct.Peekable.html#method.next_if -[`Peekable::next_if_eq`]: https://doc.rust-lang.org/nightly/std/iter/struct.Peekable.html#method.next_if_eq - Version 1.50.0 (2021-02-11) ============================ @@ -183,6 +12,7 @@ Compiler - [Added tier 3\* support for the `armv5te-unknown-linux-uclibceabi` target.][78142] - [Added tier 3 support for the `aarch64-apple-ios-macabi` target.][77484] - [The `x86_64-unknown-freebsd` is now built with the full toolset.][79484] +- [Dropped support for all cloudabi targets.][78439] \* Refer to Rust's [platform support page][forge-platform-support] for more information on Rust's tiered platform support. @@ -213,6 +43,23 @@ The following previously stable methods are now `const`. - [`IpAddr::is_ipv4`] - [`IpAddr::is_ipv6`] +- [`IpAddr::is_unspecified`] +- [`IpAddr::is_loopback`] +- [`IpAddr::is_multicast`] +- [`Ipv4Addr::octets`] +- [`Ipv4Addr::is_loopback`] +- [`Ipv4Addr::is_private`] +- [`Ipv4Addr::is_link_local`] +- [`Ipv4Addr::is_multicast`] +- [`Ipv4Addr::is_broadcast`] +- [`Ipv4Addr::is_documentation`] +- [`Ipv4Addr::to_ipv6_compatible`] +- [`Ipv4Addr::to_ipv6_mapped`] +- [`Ipv6Addr::segments`] +- [`Ipv6Addr::is_unspecified`] +- [`Ipv6Addr::is_loopback`] +- [`Ipv6Addr::is_multicast`] +- [`Ipv6Addr::to_ipv4`] - [`Layout::size`] - [`Layout::align`] - [`Layout::from_size_align`] @@ -221,7 +68,7 @@ The following previously stable methods are now `const`. - `saturating_pow` for all integer types. - `wrapping_pow` for all integer types. - `next_power_of_two` for all unsigned integer types. -- `checked_power_of_two` for all unsigned integer types. +- `checked_next_power_of_two` for all unsigned integer types. Cargo ----------------------- @@ -248,7 +95,6 @@ Compatibility Notes - [`#![test]` as an inner attribute is now considered unstable like other inner macro attributes, and reports an error by default through the `soft_unstable` lint.][79003] - [Overriding a `forbid` lint at the same level that it was set is now a hard error.][78864] -- [Dropped support for all cloudabi targets.][78439] - [You can no longer intercept `panic!` calls by supplying your own macro.][78343] It's recommended to use the `#[panic_handler]` attribute to provide your own implementation. - [Semi-colons after item statements (e.g. `struct Foo {};`) now produce a warning.][78296] @@ -275,6 +121,23 @@ Compatibility Notes [cargo/8725]: https://github.com/rust-lang/cargo/pull/8725 [`IpAddr::is_ipv4`]: https://doc.rust-lang.org/stable/std/net/enum.IpAddr.html#method.is_ipv4 [`IpAddr::is_ipv6`]: https://doc.rust-lang.org/stable/std/net/enum.IpAddr.html#method.is_ipv6 +[`IpAddr::is_unspecified`]: https://doc.rust-lang.org/stable/std/net/enum.IpAddr.html#method.is_unspecified +[`IpAddr::is_loopback`]: https://doc.rust-lang.org/stable/std/net/enum.IpAddr.html#method.is_loopback +[`IpAddr::is_multicast`]: https://doc.rust-lang.org/stable/std/net/enum.IpAddr.html#method.is_multicast +[`Ipv4Addr::octets`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.octets +[`Ipv4Addr::is_loopback`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.is_loopback +[`Ipv4Addr::is_private`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.is_private +[`Ipv4Addr::is_link_local`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.is_link_local +[`Ipv4Addr::is_multicast`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.is_multicast +[`Ipv4Addr::is_broadcast`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.is_broadcast +[`Ipv4Addr::is_documentation`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.is_documentation +[`Ipv4Addr::to_ipv6_compatible`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.to_ipv6_compatible +[`Ipv4Addr::to_ipv6_mapped`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv4Addr.html#method.to_ipv6_mapped +[`Ipv6Addr::segments`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html#method.segments +[`Ipv6Addr::is_unspecified`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html#method.is_unspecified +[`Ipv6Addr::is_loopback`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html#method.is_loopback +[`Ipv6Addr::is_multicast`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html#method.is_multicast +[`Ipv6Addr::to_ipv4`]: https://doc.rust-lang.org/stable/std/net/struct.Ipv6Addr.html#method.to_ipv4 [`Layout::align`]: https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.align [`Layout::from_size_align`]: https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.from_size_align [`Layout::size`]: https://doc.rust-lang.org/stable/std/alloc/struct.Layout.html#method.size diff --git a/compiler/rustc/src/main.rs b/compiler/rustc/src/main.rs index 6bc5aa6382..859028957d 100644 --- a/compiler/rustc/src/main.rs +++ b/compiler/rustc/src/main.rs @@ -4,7 +4,7 @@ fn main() { // Note that we're pulling in a static copy of jemalloc which means that to // pull it in we need to actually reference its symbols for it to get // linked. The two crates we link to here, std and rustc_driver, are both - // dynamic libraries. That means to pull in jemalloc we need to actually + // dynamic libraries. That means to pull in jemalloc we actually need to // reference allocation symbols one way or another (as this file is the only // object code in the rustc executable). #[cfg(feature = "jemalloc-sys")] @@ -24,6 +24,20 @@ fn main() { static _F5: unsafe extern "C" fn(*mut c_void, usize) -> *mut c_void = jemalloc_sys::realloc; #[used] static _F6: unsafe extern "C" fn(*mut c_void) = jemalloc_sys::free; + + // On OSX, jemalloc doesn't directly override malloc/free, but instead + // registers itself with the allocator's zone APIs in a ctor. However, + // the linker doesn't seem to consider ctors as "used" when statically + // linking, so we need to explicitly depend on the function. + #[cfg(target_os = "macos")] + { + extern "C" { + fn _rjem_je_zone_register(); + } + + #[used] + static _F7: unsafe extern "C" fn() = _rjem_je_zone_register; + } } rustc_driver::set_sigpipe_handler(); diff --git a/compiler/rustc_apfloat/Cargo.toml b/compiler/rustc_apfloat/Cargo.toml index 306513f1a7..103e64be5a 100644 --- a/compiler/rustc_apfloat/Cargo.toml +++ b/compiler/rustc_apfloat/Cargo.toml @@ -6,4 +6,4 @@ edition = "2018" [dependencies] bitflags = "1.2.1" -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } diff --git a/compiler/rustc_arena/Cargo.toml b/compiler/rustc_arena/Cargo.toml index 29caa852ed..5d4d47527d 100644 --- a/compiler/rustc_arena/Cargo.toml +++ b/compiler/rustc_arena/Cargo.toml @@ -5,4 +5,5 @@ version = "0.0.0" edition = "2018" [dependencies] -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +rustc_data_structures = { path = "../rustc_data_structures" } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } diff --git a/compiler/rustc_arena/src/lib.rs b/compiler/rustc_arena/src/lib.rs index 651f4c6fab..c3198fb104 100644 --- a/compiler/rustc_arena/src/lib.rs +++ b/compiler/rustc_arena/src/lib.rs @@ -14,10 +14,10 @@ #![feature(dropck_eyepatch)] #![feature(new_uninit)] #![feature(maybe_uninit_slice)] -#![cfg_attr(bootstrap, feature(min_const_generics))] #![feature(min_specialization)] #![cfg_attr(test, feature(test))] +use rustc_data_structures::sync; use smallvec::SmallVec; use std::alloc::Layout; @@ -298,22 +298,6 @@ impl TypedArena { } } - /// Clears the arena. Deallocates all but the longest chunk which may be reused. - pub fn clear(&mut self) { - unsafe { - // Clear the last chunk, which is partially filled. - let mut chunks_borrow = self.chunks.borrow_mut(); - if let Some(mut last_chunk) = chunks_borrow.last_mut() { - 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) { - chunk.destroy(chunk.entries); - } - } - } - } - // Drops the contents of the last chunk. The last chunk is partially empty, unlike all other // chunks. fn clear_last_chunk(&self, last_chunk: &mut TypedArenaChunk) { @@ -557,8 +541,19 @@ struct DropType { obj: *mut u8, } -unsafe fn drop_for_type(to_drop: *mut u8) { - std::ptr::drop_in_place(to_drop as *mut T) +// SAFETY: we require `T: Send` before type-erasing into `DropType`. +#[cfg(parallel_compiler)] +unsafe impl sync::Send for DropType {} + +impl DropType { + #[inline] + unsafe fn new(obj: *mut T) -> Self { + unsafe fn drop_for_type(to_drop: *mut u8) { + std::ptr::drop_in_place(to_drop as *mut T) + } + + DropType { drop_fn: drop_for_type::, obj: obj as *mut u8 } + } } impl Drop for DropType { @@ -568,10 +563,13 @@ impl Drop for DropType { } /// An arena which can be used to allocate any type. +/// +/// # Safety +/// /// Allocating in this arena is unsafe since the type system /// doesn't know which types it contains. In order to -/// allocate safely, you must store a PhantomData -/// alongside this arena for each type T you allocate. +/// allocate safely, you must store a `PhantomData` +/// alongside this arena for each type `T` you allocate. #[derive(Default)] pub struct DropArena { /// A list of destructors to run when the arena drops. @@ -583,21 +581,26 @@ pub struct DropArena { impl DropArena { #[inline] - pub unsafe fn alloc(&self, object: T) -> &mut T { + pub unsafe fn alloc(&self, object: T) -> &mut T + where + T: sync::Send, + { let mem = self.arena.alloc_raw(Layout::new::()) 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 destructor 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 }); + // and would cause `object`'s destructor to run twice if it was recorded before. + self.destructors.borrow_mut().push(DropType::new(result)); result } #[inline] - pub unsafe fn alloc_from_iter>(&self, iter: I) -> &mut [T] { + pub unsafe fn alloc_from_iter(&self, iter: I) -> &mut [T] + where + T: sync::Send, + I: IntoIterator, + { let mut vec: SmallVec<[_; 8]> = iter.into_iter().collect(); if vec.is_empty() { return &mut []; @@ -607,19 +610,18 @@ impl DropArena { let start_ptr = self.arena.alloc_raw(Layout::array::(len).unwrap()) as *mut T; let mut destructors = self.destructors.borrow_mut(); - // Reserve space for the destructors so we can't panic while adding them + // Reserve space for the destructors so we can't panic while adding them. destructors.reserve(len); // Move the content to the arena by copying it and then forgetting - // the content of the SmallVec + // the content of the SmallVec. vec.as_ptr().copy_to_nonoverlapping(start_ptr, len); mem::forget(vec.drain(..)); // Record the destructors after doing the allocation as that may panic - // and would cause `object`'s destructor to run twice if it was recorded before + // and would cause `object`'s destructor to run twice if it was recorded before. for i in 0..len { - destructors - .push(DropType { drop_fn: drop_for_type::, obj: start_ptr.add(i) as *mut u8 }); + destructors.push(DropType::new(start_ptr.add(i))); } slice::from_raw_parts_mut(start_ptr, len) diff --git a/compiler/rustc_arena/src/tests.rs b/compiler/rustc_arena/src/tests.rs index e8a1f2db1a..911e577c1e 100644 --- a/compiler/rustc_arena/src/tests.rs +++ b/compiler/rustc_arena/src/tests.rs @@ -11,6 +11,24 @@ struct Point { z: i32, } +impl TypedArena { + /// Clears the arena. Deallocates all but the longest chunk which may be reused. + fn clear(&mut self) { + unsafe { + // Clear the last chunk, which is partially filled. + let mut chunks_borrow = self.chunks.borrow_mut(); + if let Some(mut last_chunk) = chunks_borrow.last_mut() { + 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) { + chunk.destroy(chunk.entries); + } + } + } + } +} + #[test] pub fn test_unused() { let arena: TypedArena = TypedArena::default(); diff --git a/compiler/rustc_ast/Cargo.toml b/compiler/rustc_ast/Cargo.toml index 13e17a807c..6b9b9e8155 100644 --- a/compiler/rustc_ast/Cargo.toml +++ b/compiler/rustc_ast/Cargo.toml @@ -15,5 +15,5 @@ rustc_data_structures = { path = "../rustc_data_structures" } rustc_index = { path = "../rustc_index" } rustc_lexer = { path = "../rustc_lexer" } rustc_macros = { path = "../rustc_macros" } -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } bitflags = "1.2.1" diff --git a/compiler/rustc_ast/src/ast.rs b/compiler/rustc_ast/src/ast.rs index 2ddcb9ef84..7e82d7ff77 100644 --- a/compiler/rustc_ast/src/ast.rs +++ b/compiler/rustc_ast/src/ast.rs @@ -149,9 +149,17 @@ impl PathSegment { pub fn from_ident(ident: Ident) -> Self { PathSegment { ident, id: DUMMY_NODE_ID, args: None } } + pub fn path_root(span: Span) -> Self { PathSegment::from_ident(Ident::new(kw::PathRoot, span)) } + + pub fn span(&self) -> Span { + match &self.args { + Some(args) => self.ident.span.to(args.span()), + None => self.ident.span, + } + } } /// The arguments of a path segment. @@ -486,8 +494,8 @@ pub struct WhereEqPredicate { #[derive(Clone, Encodable, Decodable, Debug)] pub struct Crate { - pub module: Mod, pub attrs: Vec, + pub items: Vec>, pub span: Span, /// The order of items in the HIR is unrelated to the order of /// items in the AST. However, we generate proc macro harnesses @@ -647,7 +655,7 @@ impl Pat { /// are treated the same as `x: x, y: ref y, z: ref mut z`, /// except when `is_shorthand` is true. #[derive(Clone, Encodable, Decodable, Debug)] -pub struct FieldPat { +pub struct PatField { /// The identifier for the field. pub ident: Ident, /// The pattern the field is destructured to. @@ -692,7 +700,7 @@ pub enum PatKind { /// A struct or struct variant pattern (e.g., `Variant {x, y, ..}`). /// The `bool` is `true` in the presence of a `..`. - Struct(Path, Vec, /* recovered */ bool), + Struct(Path, Vec, /* recovered */ bool), /// A tuple struct/variant pattern (`Variant(x, y, .., z)`). TupleStruct(Path, Vec>), @@ -915,16 +923,6 @@ impl Stmt { } } - pub fn tokens_mut(&mut self) -> Option<&mut LazyTokenStream> { - match self.kind { - StmtKind::Local(ref mut local) => local.tokens.as_mut(), - StmtKind::Item(ref mut item) => item.tokens.as_mut(), - StmtKind::Expr(ref mut expr) | StmtKind::Semi(ref mut expr) => expr.tokens.as_mut(), - StmtKind::Empty => None, - StmtKind::MacCall(ref mut mac) => mac.tokens.as_mut(), - } - } - pub fn has_trailing_semicolon(&self) -> bool { match &self.kind { StmtKind::Semi(_) => true, @@ -1037,9 +1035,9 @@ pub struct Arm { pub is_placeholder: bool, } -/// Access of a named (e.g., `obj.foo`) or unnamed (e.g., `obj.0`) struct field. +/// A single field in a struct expression, e.g. `x: value` and `y` in `Foo { x: value, y }`. #[derive(Clone, Encodable, Decodable, Debug)] -pub struct Field { +pub struct ExprField { pub attrs: AttrVec, pub id: NodeId, pub span: Span, @@ -1083,8 +1081,8 @@ pub struct Expr { } // `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, 120); +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +rustc_data_structures::static_assert_size!(Expr, 104); impl Expr { /// Returns `true` if this expression would be valid somewhere that expects a value; @@ -1139,6 +1137,14 @@ impl Expr { } } + pub fn peel_parens(&self) -> &Expr { + let mut expr = self; + while let ExprKind::Paren(inner) = &expr.kind { + expr = &inner; + } + expr + } + /// Attempts to reparse as `Ty` (for diagnostic purposes). pub fn to_ty(&self) -> Option> { let kind = match &self.kind { @@ -1246,6 +1252,13 @@ pub enum StructRest { None, } +#[derive(Clone, Encodable, Decodable, Debug)] +pub struct StructExpr { + pub path: Path, + pub fields: Vec, + pub rest: StructRest, +} + #[derive(Clone, Encodable, Decodable, Debug)] pub enum ExprKind { /// A `box x` expression. @@ -1371,7 +1384,7 @@ pub enum ExprKind { /// A struct literal expression. /// /// E.g., `Foo {x: 1, y: 2}`, or `Foo {x: 1, .. rest}`. - Struct(Path, Vec, StructRest), + Struct(P), /// An array literal constructed from one repeated element. /// @@ -1951,7 +1964,7 @@ impl TyKind { } /// Syntax used to declare a trait object. -#[derive(Clone, Copy, PartialEq, Encodable, Decodable, Debug)] +#[derive(Clone, Copy, PartialEq, Encodable, Decodable, Debug, HashStable_Generic)] pub enum TraitObjectSyntax { Dyn, None, @@ -1979,7 +1992,7 @@ bitflags::bitflags! { } } -#[derive(Clone, PartialEq, Encodable, Decodable, Debug, HashStable_Generic)] +#[derive(Clone, PartialEq, PartialOrd, Encodable, Decodable, Debug, Hash, HashStable_Generic)] pub enum InlineAsmTemplatePiece { String(String), Placeholder { operand_idx: usize, modifier: Option, span: Span }, @@ -2067,7 +2080,7 @@ pub struct InlineAsm { /// Inline assembly dialect. /// /// E.g., `"intel"` as in `llvm_asm!("mov eax, 2" : "={eax}"(result) : : : "intel")`. -#[derive(Clone, PartialEq, Encodable, Decodable, Debug, Copy, HashStable_Generic)] +#[derive(Clone, PartialEq, Encodable, Decodable, Debug, Copy, Hash, HashStable_Generic)] pub enum LlvmAsmDialect { Att, Intel, @@ -2299,21 +2312,22 @@ impl FnRetTy { } } -/// Module declaration. -/// -/// E.g., `mod foo;` or `mod foo { .. }`. +#[derive(Clone, Copy, PartialEq, Encodable, Decodable, Debug)] +pub enum Inline { + Yes, + No, +} + +/// Module item kind. #[derive(Clone, Encodable, Decodable, Debug)] -pub struct Mod { - /// A span from the first token past `{` to the last token until `}`. - /// For `mod foo;`, the inner span ranges from the first token - /// to the last token in the external file. - pub inner: Span, - /// `unsafe` keyword accepted syntactically for macro DSLs, but not - /// semantically by Rust. - pub unsafety: Unsafe, - pub items: Vec>, - /// `true` for `mod foo { .. }`; `false` for `mod foo;`. - pub inline: bool, +pub enum ModKind { + /// Module with inlined definition `mod foo { ... }`, + /// or with definition outlined to a separate file `mod foo;` and already loaded from it. + /// The inner span is from the first token past `{` to the last token until `}`, + /// or from the first to the last token in the loaded file. + Loaded(Vec>, Inline, Span), + /// Module with definition outlined to a separate file `mod foo;` but not yet loaded from it. + Unloaded, } /// Foreign module declaration. @@ -2520,11 +2534,11 @@ impl VisibilityKind { } } -/// Field of a struct. +/// Field definition in a struct, variant or union. /// /// E.g., `bar: usize` as in `struct Foo { bar: usize }`. #[derive(Clone, Encodable, Decodable, Debug)] -pub struct StructField { +pub struct FieldDef { pub attrs: Vec, pub id: NodeId, pub span: Span, @@ -2541,11 +2555,11 @@ pub enum VariantData { /// Struct variant. /// /// E.g., `Bar { .. }` as in `enum Foo { Bar { .. } }`. - Struct(Vec, bool), + Struct(Vec, bool), /// Tuple variant. /// /// E.g., `Bar(..)` as in `enum Foo { Bar(..) }`. - Tuple(Vec, NodeId), + Tuple(Vec, NodeId), /// Unit variant. /// /// E.g., `Bar = ..` as in `enum Foo { Bar = .. }`. @@ -2554,7 +2568,7 @@ pub enum VariantData { impl VariantData { /// Return the fields of this variant. - pub fn fields(&self) -> &[StructField] { + pub fn fields(&self) -> &[FieldDef] { match *self { VariantData::Struct(ref fields, ..) | VariantData::Tuple(ref fields, _) => fields, _ => &[], @@ -2694,7 +2708,7 @@ pub enum ItemKind { /// A use declaration item (`use`). /// /// E.g., `use foo;`, `use foo::bar;` or `use foo::bar as FooBar;`. - Use(P), + Use(UseTree), /// A static item (`static`). /// /// E.g., `static FOO: i32 = 42;` or `static FOO: &'static str = "bar";`. @@ -2710,13 +2724,15 @@ pub enum ItemKind { /// A module declaration (`mod`). /// /// E.g., `mod foo;` or `mod foo { .. }`. - Mod(Mod), + /// `unsafe` keyword on modules is accepted syntactically for macro DSLs, but not + /// semantically by Rust. + Mod(Unsafe, ModKind), /// An external module (`extern`). /// /// E.g., `extern {}` or `extern "C" {}`. ForeignMod(ForeignMod), /// Module-level inline assembly (from `global_asm!()`). - GlobalAsm(P), + GlobalAsm(GlobalAsm), /// A type alias (`type`). /// /// E.g., `type Foo = Bar;`. @@ -2754,7 +2770,7 @@ pub enum ItemKind { MacroDef(MacroDef), } -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] rustc_data_structures::static_assert_size!(ItemKind, 112); impl ItemKind { @@ -2828,7 +2844,7 @@ pub enum AssocItemKind { MacCall(MacCall), } -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] rustc_data_structures::static_assert_size!(AssocItemKind, 72); impl AssocItemKind { @@ -2880,7 +2896,7 @@ pub enum ForeignItemKind { MacCall(MacCall), } -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] rustc_data_structures::static_assert_size!(ForeignItemKind, 72); impl From for ItemKind { @@ -2909,69 +2925,3 @@ impl TryFrom for ForeignItemKind { } pub type ForeignItem = Item; - -pub trait HasTokens { - /// Called by `Parser::collect_tokens` to store the collected - /// tokens inside an AST node - fn finalize_tokens(&mut self, tokens: LazyTokenStream); -} - -impl HasTokens for P { - fn finalize_tokens(&mut self, tokens: LazyTokenStream) { - (**self).finalize_tokens(tokens); - } -} - -impl HasTokens for Option { - fn finalize_tokens(&mut self, tokens: LazyTokenStream) { - if let Some(inner) = self { - inner.finalize_tokens(tokens); - } - } -} - -impl HasTokens for Attribute { - fn finalize_tokens(&mut self, tokens: LazyTokenStream) { - match &mut self.kind { - AttrKind::Normal(_, attr_tokens) => { - if attr_tokens.is_none() { - *attr_tokens = Some(tokens); - } - } - AttrKind::DocComment(..) => { - panic!("Called finalize_tokens on doc comment attr {:?}", self) - } - } - } -} - -impl HasTokens for Stmt { - fn finalize_tokens(&mut self, tokens: LazyTokenStream) { - let stmt_tokens = match self.kind { - StmtKind::Local(ref mut local) => &mut local.tokens, - StmtKind::Item(ref mut item) => &mut item.tokens, - StmtKind::Expr(ref mut expr) | StmtKind::Semi(ref mut expr) => &mut expr.tokens, - StmtKind::Empty => return, - StmtKind::MacCall(ref mut mac) => &mut mac.tokens, - }; - if stmt_tokens.is_none() { - *stmt_tokens = Some(tokens); - } - } -} - -macro_rules! derive_has_tokens { - ($($ty:path),*) => { $( - impl HasTokens for $ty { - fn finalize_tokens(&mut self, tokens: LazyTokenStream) { - if self.tokens.is_none() { - self.tokens = Some(tokens); - } - } - } - )* } -} - -derive_has_tokens! { - Item, Expr, Ty, AttrItem, Visibility, Path, Block, Pat -} diff --git a/compiler/rustc_ast/src/ast_like.rs b/compiler/rustc_ast/src/ast_like.rs new file mode 100644 index 0000000000..63bc7c49a9 --- /dev/null +++ b/compiler/rustc_ast/src/ast_like.rs @@ -0,0 +1,198 @@ +use super::ptr::P; +use super::tokenstream::LazyTokenStream; +use super::{Arm, ExprField, FieldDef, GenericParam, Param, PatField, Variant}; +use super::{AssocItem, Expr, ForeignItem, Item, Local}; +use super::{AttrItem, AttrKind, Block, Pat, Path, Ty, Visibility}; +use super::{AttrVec, Attribute, Stmt, StmtKind}; + +/// An `AstLike` represents an AST node (or some wrapper around +/// and AST node) which stores some combination of attributes +/// and tokens. +pub trait AstLike: Sized { + fn attrs(&self) -> &[Attribute]; + fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)); + fn tokens_mut(&mut self) -> Option<&mut Option>; +} + +impl AstLike for P { + fn attrs(&self) -> &[Attribute] { + (**self).attrs() + } + fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)) { + (**self).visit_attrs(f); + } + fn tokens_mut(&mut self) -> Option<&mut Option> { + (**self).tokens_mut() + } +} + +fn visit_attrvec(attrs: &mut AttrVec, f: impl FnOnce(&mut Vec)) { + crate::mut_visit::visit_clobber(attrs, |attrs| { + let mut vec = attrs.into(); + f(&mut vec); + vec.into() + }); +} + +impl AstLike for StmtKind { + fn attrs(&self) -> &[Attribute] { + match self { + StmtKind::Local(local) => local.attrs(), + StmtKind::Expr(expr) | StmtKind::Semi(expr) => expr.attrs(), + StmtKind::Item(item) => item.attrs(), + StmtKind::Empty => &[], + StmtKind::MacCall(mac) => &mac.attrs, + } + } + + fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)) { + match self { + StmtKind::Local(local) => local.visit_attrs(f), + StmtKind::Expr(expr) | StmtKind::Semi(expr) => expr.visit_attrs(f), + StmtKind::Item(item) => item.visit_attrs(f), + StmtKind::Empty => {} + StmtKind::MacCall(mac) => visit_attrvec(&mut mac.attrs, f), + } + } + fn tokens_mut(&mut self) -> Option<&mut Option> { + Some(match self { + StmtKind::Local(local) => &mut local.tokens, + StmtKind::Item(item) => &mut item.tokens, + StmtKind::Expr(expr) | StmtKind::Semi(expr) => &mut expr.tokens, + StmtKind::Empty => return None, + StmtKind::MacCall(mac) => &mut mac.tokens, + }) + } +} + +impl AstLike for Stmt { + fn attrs(&self) -> &[Attribute] { + self.kind.attrs() + } + + fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)) { + self.kind.visit_attrs(f); + } + fn tokens_mut(&mut self) -> Option<&mut Option> { + self.kind.tokens_mut() + } +} + +impl AstLike for Attribute { + fn attrs(&self) -> &[Attribute] { + &[] + } + fn visit_attrs(&mut self, _f: impl FnOnce(&mut Vec)) {} + fn tokens_mut(&mut self) -> Option<&mut Option> { + Some(match &mut self.kind { + AttrKind::Normal(_, tokens) => tokens, + kind @ AttrKind::DocComment(..) => { + panic!("Called tokens_mut on doc comment attr {:?}", kind) + } + }) + } +} + +impl AstLike for Option { + fn attrs(&self) -> &[Attribute] { + self.as_ref().map(|inner| inner.attrs()).unwrap_or(&[]) + } + fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)) { + if let Some(inner) = self.as_mut() { + inner.visit_attrs(f); + } + } + fn tokens_mut(&mut self) -> Option<&mut Option> { + self.as_mut().and_then(|inner| inner.tokens_mut()) + } +} + +/// Helper trait for the macros below. Abstracts over +/// the two types of attribute fields that AST nodes +/// may have (`Vec` or `AttrVec`) +trait VecOrAttrVec { + fn visit(&mut self, f: impl FnOnce(&mut Vec)); +} + +impl VecOrAttrVec for Vec { + fn visit(&mut self, f: impl FnOnce(&mut Vec)) { + f(self) + } +} + +impl VecOrAttrVec for AttrVec { + fn visit(&mut self, f: impl FnOnce(&mut Vec)) { + visit_attrvec(self, f) + } +} + +macro_rules! derive_has_tokens_and_attrs { + ($($ty:path),*) => { $( + impl AstLike for $ty { + fn attrs(&self) -> &[Attribute] { + &self.attrs + } + + fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)) { + VecOrAttrVec::visit(&mut self.attrs, f) + } + + fn tokens_mut(&mut self) -> Option<&mut Option> { + Some(&mut self.tokens) + } + } + )* } +} + +macro_rules! derive_has_attrs_no_tokens { + ($($ty:path),*) => { $( + impl AstLike for $ty { + fn attrs(&self) -> &[Attribute] { + &self.attrs + } + + fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)) { + VecOrAttrVec::visit(&mut self.attrs, f) + } + + fn tokens_mut(&mut self) -> Option<&mut Option> { + None + } + } + )* } +} + +macro_rules! derive_has_tokens_no_attrs { + ($($ty:path),*) => { $( + impl AstLike for $ty { + fn attrs(&self) -> &[Attribute] { + &[] + } + + fn visit_attrs(&mut self, _f: impl FnOnce(&mut Vec)) {} + + fn tokens_mut(&mut self) -> Option<&mut Option> { + Some(&mut self.tokens) + } + } + )* } +} + +// These AST nodes support both inert and active +// attributes, so they also have tokens. +derive_has_tokens_and_attrs! { + Item, Expr, Local, AssocItem, ForeignItem +} + +// These ast nodes only support inert attributes, so they don't +// store tokens (since nothing can observe them) +derive_has_attrs_no_tokens! { + FieldDef, Arm, ExprField, PatField, Variant, Param, GenericParam +} + +// These AST nodes don't support attributes, but can +// be captured by a `macro_rules!` matcher. Therefore, +// they need to store tokens. +derive_has_tokens_no_attrs! { + Ty, Block, AttrItem, Pat, Path, Visibility +} diff --git a/compiler/rustc_ast/src/attr/mod.rs b/compiler/rustc_ast/src/attr/mod.rs index 4dcbe4831b..2c5e180f80 100644 --- a/compiler/rustc_ast/src/attr/mod.rs +++ b/compiler/rustc_ast/src/attr/mod.rs @@ -1,17 +1,15 @@ //! Functions dealing with attributes and meta items. use crate::ast; -use crate::ast::{AttrId, AttrItem, AttrKind, AttrStyle, AttrVec, Attribute}; -use crate::ast::{Expr, GenericParam, Item, Lit, LitKind, Local, Stmt, StmtKind}; +use crate::ast::{AttrId, AttrItem, AttrKind, AttrStyle, Attribute}; +use crate::ast::{Lit, LitKind}; use crate::ast::{MacArgs, MacDelimiter, MetaItem, MetaItemKind, NestedMetaItem}; use crate::ast::{Path, PathSegment}; -use crate::mut_visit::visit_clobber; -use crate::ptr::P; use crate::token::{self, CommentKind, Token}; use crate::tokenstream::{DelimSpan, LazyTokenStream, TokenStream, TokenTree, TreeAndSpacing}; use rustc_index::bit_set::GrowableBitSet; -use rustc_span::source_map::{BytePos, Spanned}; +use rustc_span::source_map::BytePos; use rustc_span::symbol::{sym, Ident, Symbol}; use rustc_span::Span; @@ -35,10 +33,6 @@ impl MarkedAttrs { } } -pub fn is_known_lint_tool(m_item: Ident) -> bool { - [sym::clippy, sym::rustc].contains(&m_item.name) -} - impl NestedMetaItem { /// Returns the `MetaItem` if `self` is a `NestedMetaItem::MetaItem`. pub fn meta_item(&self) -> Option<&MetaItem> { @@ -122,6 +116,7 @@ impl NestedMetaItem { } impl Attribute { + #[inline] pub fn has_name(&self, name: Symbol) -> bool { match self.kind { AttrKind::Normal(ref item, _) => item.path == name, @@ -617,101 +612,3 @@ impl NestedMetaItem { MetaItem::from_tokens(tokens).map(NestedMetaItem::MetaItem) } } - -pub trait HasAttrs: Sized { - fn attrs(&self) -> &[Attribute]; - fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)); -} - -impl HasAttrs for Spanned { - fn attrs(&self) -> &[Attribute] { - self.node.attrs() - } - fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)) { - self.node.visit_attrs(f); - } -} - -impl HasAttrs for Vec { - fn attrs(&self) -> &[Attribute] { - self - } - fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)) { - f(self) - } -} - -impl HasAttrs for AttrVec { - fn attrs(&self) -> &[Attribute] { - self - } - fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)) { - visit_clobber(self, |this| { - let mut vec = this.into(); - f(&mut vec); - vec.into() - }); - } -} - -impl HasAttrs for P { - fn attrs(&self) -> &[Attribute] { - (**self).attrs() - } - fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)) { - (**self).visit_attrs(f); - } -} - -impl HasAttrs for StmtKind { - fn attrs(&self) -> &[Attribute] { - match *self { - StmtKind::Local(ref local) => local.attrs(), - StmtKind::Expr(ref expr) | StmtKind::Semi(ref expr) => expr.attrs(), - StmtKind::Item(ref item) => item.attrs(), - StmtKind::Empty => &[], - StmtKind::MacCall(ref mac) => mac.attrs.attrs(), - } - } - - fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)) { - match self { - StmtKind::Local(local) => local.visit_attrs(f), - StmtKind::Expr(expr) | StmtKind::Semi(expr) => expr.visit_attrs(f), - StmtKind::Item(item) => item.visit_attrs(f), - StmtKind::Empty => {} - StmtKind::MacCall(mac) => { - mac.attrs.visit_attrs(f); - } - } - } -} - -impl HasAttrs for Stmt { - fn attrs(&self) -> &[ast::Attribute] { - self.kind.attrs() - } - - fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)) { - self.kind.visit_attrs(f); - } -} - -macro_rules! derive_has_attrs { - ($($ty:path),*) => { $( - impl HasAttrs for $ty { - fn attrs(&self) -> &[Attribute] { - &self.attrs - } - - fn visit_attrs(&mut self, f: impl FnOnce(&mut Vec)) { - self.attrs.visit_attrs(f); - } - } - )* } -} - -derive_has_attrs! { - Item, Expr, Local, ast::AssocItem, ast::ForeignItem, ast::StructField, ast::Arm, - ast::Field, ast::FieldPat, ast::Variant, ast::Param, GenericParam -} diff --git a/compiler/rustc_ast/src/lib.rs b/compiler/rustc_ast/src/lib.rs index ddf52caed0..03ec4b8a44 100644 --- a/compiler/rustc_ast/src/lib.rs +++ b/compiler/rustc_ast/src/lib.rs @@ -40,8 +40,8 @@ pub mod util { } pub mod ast; +pub mod ast_like; pub mod attr; -pub mod crate_disambiguator; pub mod entry; pub mod expand; pub mod mut_visit; @@ -52,6 +52,7 @@ pub mod tokenstream; pub mod visit; pub use self::ast::*; +pub use self::ast_like::AstLike; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; diff --git a/compiler/rustc_ast/src/mut_visit.rs b/compiler/rustc_ast/src/mut_visit.rs index 024d9687f3..f426f2c7fe 100644 --- a/compiler/rustc_ast/src/mut_visit.rs +++ b/compiler/rustc_ast/src/mut_visit.rs @@ -102,8 +102,8 @@ pub trait MutVisitor: Sized { noop_visit_fn_header(header, self); } - fn flat_map_struct_field(&mut self, sf: StructField) -> SmallVec<[StructField; 1]> { - noop_flat_map_struct_field(sf, self) + fn flat_map_field_def(&mut self, fd: FieldDef) -> SmallVec<[FieldDef; 1]> { + noop_flat_map_field_def(fd, self) } fn visit_item_kind(&mut self, i: &mut ItemKind) { @@ -170,10 +170,6 @@ pub trait MutVisitor: Sized { noop_visit_ty_constraint(t, self); } - fn visit_mod(&mut self, m: &mut Mod) { - noop_visit_mod(m, self); - } - fn visit_foreign_mod(&mut self, nm: &mut ForeignMod) { noop_visit_foreign_mod(nm, self); } @@ -258,8 +254,8 @@ pub trait MutVisitor: Sized { noop_visit_mt(mt, self); } - fn flat_map_field(&mut self, f: Field) -> SmallVec<[Field; 1]> { - noop_flat_map_field(f, self) + fn flat_map_expr_field(&mut self, f: ExprField) -> SmallVec<[ExprField; 1]> { + noop_flat_map_expr_field(f, self) } fn visit_where_clause(&mut self, where_clause: &mut WhereClause) { @@ -282,8 +278,8 @@ pub trait MutVisitor: Sized { // Do nothing. } - fn flat_map_field_pattern(&mut self, fp: FieldPat) -> SmallVec<[FieldPat; 1]> { - noop_flat_map_field_pattern(fp, self) + fn flat_map_pat_field(&mut self, fp: PatField) -> SmallVec<[PatField; 1]> { + noop_flat_map_pat_field(fp, self) } } @@ -389,11 +385,11 @@ pub fn visit_delim_span(dspan: &mut DelimSpan, vis: &mut T) { vis.visit_span(&mut dspan.close); } -pub fn noop_flat_map_field_pattern( - mut fp: FieldPat, +pub fn noop_flat_map_pat_field( + mut fp: PatField, vis: &mut T, -) -> SmallVec<[FieldPat; 1]> { - let FieldPat { attrs, id, ident, is_placeholder: _, is_shorthand: _, pat, span } = &mut fp; +) -> SmallVec<[PatField; 1]> { + let PatField { attrs, id, ident, is_placeholder: _, is_shorthand: _, pat, span } = &mut fp; vis.visit_id(id); vis.visit_ident(ident); vis.visit_pat(pat); @@ -846,10 +842,10 @@ pub fn noop_visit_where_predicate(pred: &mut WherePredicate, vis: pub fn noop_visit_variant_data(vdata: &mut VariantData, vis: &mut T) { match vdata { VariantData::Struct(fields, ..) => { - fields.flat_map_in_place(|field| vis.flat_map_struct_field(field)); + fields.flat_map_in_place(|field| vis.flat_map_field_def(field)); } VariantData::Tuple(fields, id) => { - fields.flat_map_in_place(|field| vis.flat_map_struct_field(field)); + fields.flat_map_in_place(|field| vis.flat_map_field_def(field)); vis.visit_id(id); } VariantData::Unit(id) => vis.visit_id(id), @@ -868,22 +864,25 @@ pub fn noop_visit_poly_trait_ref(p: &mut PolyTraitRef, vis: &mut vis.visit_span(span); } -pub fn noop_flat_map_struct_field( - mut sf: StructField, +pub fn noop_flat_map_field_def( + mut fd: FieldDef, visitor: &mut T, -) -> SmallVec<[StructField; 1]> { - let StructField { span, ident, vis, id, ty, attrs, is_placeholder: _ } = &mut sf; +) -> SmallVec<[FieldDef; 1]> { + let FieldDef { span, ident, vis, id, ty, attrs, is_placeholder: _ } = &mut fd; visitor.visit_span(span); visit_opt(ident, |ident| visitor.visit_ident(ident)); visitor.visit_vis(vis); visitor.visit_id(id); visitor.visit_ty(ty); visit_attrs(attrs, visitor); - smallvec![sf] + smallvec![fd] } -pub fn noop_flat_map_field(mut f: Field, vis: &mut T) -> SmallVec<[Field; 1]> { - let Field { ident, expr, span, is_shorthand: _, attrs, id, is_placeholder: _ } = &mut f; +pub fn noop_flat_map_expr_field( + mut f: ExprField, + vis: &mut T, +) -> SmallVec<[ExprField; 1]> { + let ExprField { ident, expr, span, is_shorthand: _, attrs, id, is_placeholder: _ } = &mut f; vis.visit_ident(ident); vis.visit_expr(expr); vis.visit_id(id); @@ -917,7 +916,13 @@ pub fn noop_visit_item_kind(kind: &mut ItemKind, vis: &mut T) { vis.visit_generics(generics); visit_opt(body, |body| vis.visit_block(body)); } - ItemKind::Mod(m) => vis.visit_mod(m), + ItemKind::Mod(_unsafety, mod_kind) => match mod_kind { + ModKind::Loaded(items, _inline, inner_span) => { + vis.visit_span(inner_span); + items.flat_map_in_place(|item| vis.flat_map_item(item)); + } + ModKind::Unloaded => {} + }, ItemKind::ForeignMod(nm) => vis.visit_foreign_mod(nm), ItemKind::GlobalAsm(_ga) => {} ItemKind::TyAlias(box TyAliasKind(_, generics, bounds, ty)) => { @@ -998,14 +1003,10 @@ pub fn noop_visit_fn_header(header: &mut FnHeader, vis: &mut T) { vis.visit_asyncness(asyncness); } -pub fn noop_visit_mod(module: &mut Mod, vis: &mut T) { - let Mod { inner, unsafety: _, items, inline: _ } = module; - vis.visit_span(inner); - items.flat_map_in_place(|item| vis.flat_map_item(item)); -} - +// FIXME: Avoid visiting the crate as a `Mod` item, flat map only the inner items if possible, +// or make crate visiting first class if necessary. pub fn noop_visit_crate(krate: &mut Crate, vis: &mut T) { - visit_clobber(krate, |Crate { module, attrs, span, proc_macros }| { + visit_clobber(krate, |Crate { attrs, items, span, proc_macros }| { let item_vis = Visibility { kind: VisibilityKind::Public, span: span.shrink_to_lo(), tokens: None }; let item = P(Item { @@ -1014,19 +1015,20 @@ pub fn noop_visit_crate(krate: &mut Crate, vis: &mut T) { id: DUMMY_NODE_ID, vis: item_vis, span, - kind: ItemKind::Mod(module), + kind: ItemKind::Mod(Unsafe::No, ModKind::Loaded(items, Inline::Yes, span)), tokens: None, }); let items = vis.flat_map_item(item); let len = items.len(); if len == 0 { - let module = Mod { inner: span, unsafety: Unsafe::No, items: vec![], inline: true }; - Crate { module, attrs: vec![], span, proc_macros } + Crate { attrs: vec![], items: vec![], span, proc_macros } } else if len == 1 { let Item { attrs, span, kind, .. } = items.into_iter().next().unwrap().into_inner(); match kind { - ItemKind::Mod(module) => Crate { module, attrs, span, proc_macros }, + ItemKind::Mod(_, ModKind::Loaded(items, ..)) => { + Crate { attrs, items, span, proc_macros } + } _ => panic!("visitor converted a module to not a module"), } } else { @@ -1103,7 +1105,7 @@ pub fn noop_visit_pat(pat: &mut P, vis: &mut T) { } PatKind::Struct(path, fields, _etc) => { vis.visit_path(path); - fields.flat_map_in_place(|field| vis.flat_map_field_pattern(field)); + fields.flat_map_in_place(|field| vis.flat_map_pat_field(field)); } PatKind::Box(inner) => vis.visit_pat(inner), PatKind::Ref(inner, _mutbl) => vis.visit_pat(inner), @@ -1284,10 +1286,11 @@ pub fn noop_visit_expr( visit_vec(inputs, |(_c, expr)| vis.visit_expr(expr)); } ExprKind::MacCall(mac) => vis.visit_mac_call(mac), - ExprKind::Struct(path, fields, expr) => { + ExprKind::Struct(se) => { + let StructExpr { path, fields, rest } = se.deref_mut(); vis.visit_path(path); - fields.flat_map_in_place(|field| vis.flat_map_field(field)); - match expr { + fields.flat_map_in_place(|field| vis.flat_map_expr_field(field)); + match rest { StructRest::Base(expr) => vis.visit_expr(expr), StructRest::Rest(_span) => {} StructRest::None => {} diff --git a/compiler/rustc_ast/src/node_id.rs b/compiler/rustc_ast/src/node_id.rs index 6e7d2bab28..d20bace608 100644 --- a/compiler/rustc_ast/src/node_id.rs +++ b/compiler/rustc_ast/src/node_id.rs @@ -2,6 +2,12 @@ use rustc_span::ExpnId; use std::fmt; rustc_index::newtype_index! { + /// Identifies an AST node. + /// + /// This identifies top-level definitions, expressions, and everything in between. + /// This is later turned into [`DefId`] and `HirId` for the HIR. + /// + /// [`DefId`]: rustc_span::def_id::DefId pub struct NodeId { DEBUG_FORMAT = "NodeId({})" } @@ -9,12 +15,12 @@ rustc_index::newtype_index! { rustc_data_structures::define_id_collections!(NodeMap, NodeSet, NodeId); -/// `NodeId` used to represent the root of the crate. +/// The [`NodeId`] used to represent the root of the crate. pub const CRATE_NODE_ID: NodeId = NodeId::from_u32(0); -/// When parsing and doing expansions, we initially give all AST nodes this AST -/// node value. Then later, during expansion, we renumber them to have small, -/// positive ids. +/// When parsing and at the beginning of doing expansions, we initially give all AST nodes +/// this dummy AST [`NodeId`]. Then, during a later phase of expansion, we renumber them +/// to have small, positive IDs. pub const DUMMY_NODE_ID: NodeId = NodeId::MAX; impl NodeId { diff --git a/compiler/rustc_ast/src/token.rs b/compiler/rustc_ast/src/token.rs index 90bfb01d6c..7e58426d27 100644 --- a/compiler/rustc_ast/src/token.rs +++ b/compiler/rustc_ast/src/token.rs @@ -11,11 +11,9 @@ use crate::tokenstream::TokenTree; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; use rustc_data_structures::sync::Lrc; use rustc_macros::HashStable_Generic; -use rustc_span::hygiene::ExpnKind; -use rustc_span::source_map::SourceMap; use rustc_span::symbol::{kw, sym}; use rustc_span::symbol::{Ident, Symbol}; -use rustc_span::{self, edition::Edition, FileName, RealFileName, Span, DUMMY_SP}; +use rustc_span::{self, edition::Edition, Span, DUMMY_SP}; use std::borrow::Cow; use std::{fmt, mem}; @@ -244,7 +242,7 @@ pub enum TokenKind { } // `TokenKind` is used a lot. Make sure it doesn't unintentionally get bigger. -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] rustc_data_structures::static_assert_size!(TokenKind, 16); #[derive(Clone, PartialEq, Encodable, Decodable, Debug, HashStable_Generic)] @@ -682,7 +680,7 @@ pub enum Nonterminal { } // `Nonterminal` is used a lot. Make sure it doesn't unintentionally get bigger. -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] rustc_data_structures::static_assert_size!(Nonterminal, 48); #[derive(Debug, Copy, Clone, PartialEq, Encodable, Decodable)] @@ -786,79 +784,6 @@ impl Nonterminal { NtTT(tt) => tt.span(), } } - - /// This nonterminal looks like some specific enums from - /// `proc-macro-hack` and `procedural-masquerade` crates. - /// We need to maintain some special pretty-printing behavior for them due to incorrect - /// asserts in old versions of those crates and their wide use in the ecosystem. - /// See issue #73345 for more details. - /// FIXME(#73933): Remove this eventually. - pub fn pretty_printing_compatibility_hack(&self) -> bool { - let item = match self { - NtItem(item) => item, - NtStmt(stmt) => match &stmt.kind { - ast::StmtKind::Item(item) => item, - _ => return false, - }, - _ => return false, - }; - - let name = item.ident.name; - if name == sym::ProceduralMasqueradeDummyType || name == sym::ProcMacroHack { - if let ast::ItemKind::Enum(enum_def, _) = &item.kind { - if let [variant] = &*enum_def.variants { - return variant.ident.name == sym::Input; - } - } - } - false - } - - // See issue #74616 for details - pub fn ident_name_compatibility_hack( - &self, - orig_span: Span, - source_map: &SourceMap, - ) -> Option<(Ident, bool)> { - if let NtIdent(ident, is_raw) = self { - if let ExpnKind::Macro(_, macro_name) = orig_span.ctxt().outer_expn_data().kind { - let filename = source_map.span_to_filename(orig_span); - if let FileName::Real(RealFileName::Named(path)) = filename { - let matches_prefix = |prefix, filename| { - // Check for a path that ends with 'prefix*/src/' - let mut iter = path.components().rev(); - iter.next().and_then(|p| p.as_os_str().to_str()) == Some(filename) - && iter.next().and_then(|p| p.as_os_str().to_str()) == Some("src") - && iter - .next() - .and_then(|p| p.as_os_str().to_str()) - .map_or(false, |p| p.starts_with(prefix)) - }; - - if (macro_name == sym::impl_macros - && matches_prefix("time-macros-impl", "lib.rs")) - || (macro_name == sym::arrays && matches_prefix("js-sys", "lib.rs")) - { - let snippet = source_map.span_to_snippet(orig_span); - if snippet.as_deref() == Ok("$name") { - return Some((*ident, *is_raw)); - } - } - - if macro_name == sym::tuple_from_req - && (matches_prefix("actix-web", "extract.rs") - || matches_prefix("actori-web", "extract.rs")) - { - let snippet = source_map.span_to_snippet(orig_span); - if snippet.as_deref() == Ok("$T") { - return Some((*ident, *is_raw)); - } - } - } - } - } - None - } } impl PartialEq for Nonterminal { diff --git a/compiler/rustc_ast/src/tokenstream.rs b/compiler/rustc_ast/src/tokenstream.rs index 9ac05f316f..c5c3142602 100644 --- a/compiler/rustc_ast/src/tokenstream.rs +++ b/compiler/rustc_ast/src/tokenstream.rs @@ -189,7 +189,7 @@ pub struct TokenStream(pub(crate) Lrc>); pub type TreeAndSpacing = (TokenTree, Spacing); // `TokenStream` is used a lot. Make sure it doesn't unintentionally get bigger. -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] rustc_data_structures::static_assert_size!(TokenStream, 8); #[derive(Clone, Copy, Debug, PartialEq, Encodable, Decodable)] diff --git a/compiler/rustc_ast/src/visit.rs b/compiler/rustc_ast/src/visit.rs index c37d4cd9f7..b1ad29e4ad 100644 --- a/compiler/rustc_ast/src/visit.rs +++ b/compiler/rustc_ast/src/visit.rs @@ -74,7 +74,7 @@ impl<'a> FnKind<'a> { /// Each method of the `Visitor` trait is a hook to be potentially /// overridden. Each method's default implementation recursively visits /// the substructure of the input via the corresponding `walk` method; -/// e.g., the `visit_mod` method by default calls `visit::walk_mod`. +/// e.g., the `visit_item` method by default calls `visit::walk_item`. /// /// If you want to ensure that your code handles every variant /// explicitly, you need to override each method. (And you also need @@ -87,9 +87,6 @@ pub trait Visitor<'ast>: Sized { fn visit_ident(&mut self, ident: Ident) { walk_ident(self, ident); } - 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) } @@ -154,8 +151,8 @@ 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_field_def(&mut self, s: &'ast FieldDef) { + walk_field_def(self, s) } fn visit_enum_def( &mut self, @@ -211,11 +208,11 @@ pub trait Visitor<'ast>: Sized { fn visit_fn_header(&mut self, _header: &'ast FnHeader) { // Nothing to do } - fn visit_field(&mut self, f: &'ast Field) { - walk_field(self, f) + fn visit_expr_field(&mut self, f: &'ast ExprField) { + walk_expr_field(self, f) } - fn visit_field_pattern(&mut self, fp: &'ast FieldPat) { - walk_field_pattern(self, fp) + fn visit_pat_field(&mut self, fp: &'ast PatField) { + walk_pat_field(self, fp) } } @@ -238,14 +235,10 @@ pub fn walk_ident<'a, V: Visitor<'a>>(visitor: &mut V, ident: Ident) { } pub fn walk_crate<'a, V: Visitor<'a>>(visitor: &mut V, krate: &'a Crate) { - visitor.visit_mod(&krate.module, krate.span, &krate.attrs, CRATE_NODE_ID); + walk_list!(visitor, visit_item, &krate.items); walk_list!(visitor, visit_attribute, &krate.attrs); } -pub fn walk_mod<'a, V: Visitor<'a>>(visitor: &mut V, module: &'a Mod) { - walk_list!(visitor, visit_item, &module.items); -} - pub fn walk_local<'a, V: Visitor<'a>>(visitor: &mut V, local: &'a Local) { for attr in local.attrs.iter() { visitor.visit_attribute(attr); @@ -297,7 +290,12 @@ pub fn walk_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a Item) { let kind = FnKind::Fn(FnCtxt::Free, item.ident, sig, &item.vis, body.as_deref()); visitor.visit_fn(kind, item.span, item.id) } - ItemKind::Mod(ref module) => visitor.visit_mod(module, item.span, &item.attrs, item.id), + ItemKind::Mod(_unsafety, ref mod_kind) => match mod_kind { + ModKind::Loaded(items, _inline, _inner_span) => { + walk_list!(visitor, visit_item, items) + } + ModKind::Unloaded => {} + }, ItemKind::ForeignMod(ref foreign_module) => { walk_list!(visitor, visit_foreign_item, &foreign_module.items); } @@ -366,13 +364,13 @@ where walk_list!(visitor, visit_attribute, &variant.attrs); } -pub fn walk_field<'a, V: Visitor<'a>>(visitor: &mut V, f: &'a Field) { +pub fn walk_expr_field<'a, V: Visitor<'a>>(visitor: &mut V, f: &'a ExprField) { visitor.visit_expr(&f.expr); visitor.visit_ident(f.ident); walk_list!(visitor, visit_attribute, f.attrs.iter()); } -pub fn walk_field_pattern<'a, V: Visitor<'a>>(visitor: &mut V, fp: &'a FieldPat) { +pub fn walk_pat_field<'a, V: Visitor<'a>>(visitor: &mut V, fp: &'a PatField) { visitor.visit_ident(fp.ident); visitor.visit_pat(&fp.pat); walk_list!(visitor, visit_attribute, fp.attrs.iter()); @@ -511,7 +509,7 @@ pub fn walk_pat<'a, V: Visitor<'a>>(visitor: &mut V, pattern: &'a Pat) { } PatKind::Struct(ref path, ref fields, _) => { visitor.visit_path(path, pattern.id); - walk_list!(visitor, visit_field_pattern, fields); + walk_list!(visitor, visit_pat_field, fields); } PatKind::Box(ref subpattern) | PatKind::Ref(ref subpattern, _) @@ -670,16 +668,16 @@ pub fn walk_assoc_item<'a, V: Visitor<'a>>(visitor: &mut V, item: &'a AssocItem, } pub fn walk_struct_def<'a, V: Visitor<'a>>(visitor: &mut V, struct_definition: &'a VariantData) { - walk_list!(visitor, visit_struct_field, struct_definition.fields()); + walk_list!(visitor, visit_field_def, struct_definition.fields()); } -pub fn walk_struct_field<'a, V: Visitor<'a>>(visitor: &mut V, struct_field: &'a StructField) { - visitor.visit_vis(&struct_field.vis); - if let Some(ident) = struct_field.ident { +pub fn walk_field_def<'a, V: Visitor<'a>>(visitor: &mut V, field: &'a FieldDef) { + visitor.visit_vis(&field.vis); + if let Some(ident) = field.ident { visitor.visit_ident(ident); } - visitor.visit_ty(&struct_field.ty); - walk_list!(visitor, visit_attribute, &struct_field.attrs); + visitor.visit_ty(&field.ty); + walk_list!(visitor, visit_attribute, &field.attrs); } pub fn walk_block<'a, V: Visitor<'a>>(visitor: &mut V, block: &'a Block) { @@ -723,10 +721,10 @@ pub fn walk_expr<'a, V: Visitor<'a>>(visitor: &mut V, expression: &'a Expr) { visitor.visit_expr(element); visitor.visit_anon_const(count) } - ExprKind::Struct(ref path, ref fields, ref optional_base) => { - visitor.visit_path(path, expression.id); - walk_list!(visitor, visit_field, fields); - match optional_base { + ExprKind::Struct(ref se) => { + visitor.visit_path(&se.path, expression.id); + walk_list!(visitor, visit_expr_field, &se.fields); + match &se.rest { StructRest::Base(expr) => visitor.visit_expr(expr), StructRest::Rest(_span) => {} StructRest::None => {} diff --git a/compiler/rustc_ast_lowering/Cargo.toml b/compiler/rustc_ast_lowering/Cargo.toml index 177a9066ed..0cced00189 100644 --- a/compiler/rustc_ast_lowering/Cargo.toml +++ b/compiler/rustc_ast_lowering/Cargo.toml @@ -19,4 +19,4 @@ rustc_span = { path = "../rustc_span" } rustc_errors = { path = "../rustc_errors" } rustc_session = { path = "../rustc_session" } rustc_ast = { path = "../rustc_ast" } -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } diff --git a/compiler/rustc_ast_lowering/src/expr.rs b/compiler/rustc_ast_lowering/src/expr.rs index 4d6afd2fe0..32fb8d1c8f 100644 --- a/compiler/rustc_ast_lowering/src/expr.rs +++ b/compiler/rustc_ast_lowering/src/expr.rs @@ -9,7 +9,9 @@ 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_hir::definitions::DefPathData; use rustc_session::parse::feature_err; +use rustc_span::hygiene::ExpnId; use rustc_span::source_map::{respan, DesugaringKind, Span, Spanned}; use rustc_span::symbol::{sym, Ident, Symbol}; use rustc_span::{hygiene::ForLoopLoc, DUMMY_SP}; @@ -42,8 +44,12 @@ impl<'hir> LoweringContext<'_, 'hir> { } ExprKind::Tup(ref elts) => hir::ExprKind::Tup(self.lower_exprs(elts)), ExprKind::Call(ref f, ref args) => { - let f = self.lower_expr(f); - hir::ExprKind::Call(f, self.lower_exprs(args)) + if let Some(legacy_args) = self.resolver.legacy_const_generic_args(f) { + self.lower_legacy_const_generics((**f).clone(), args.clone(), &legacy_args) + } else { + let f = self.lower_expr(f); + hir::ExprKind::Call(f, self.lower_exprs(args)) + } } ExprKind::MethodCall(ref seg, ref args, span) => { let hir_seg = self.arena.alloc(self.lower_path_segment( @@ -91,6 +97,23 @@ impl<'hir> LoweringContext<'_, 'hir> { ExprKind::Let(ref pat, ref scrutinee) => { self.lower_expr_if_let(e.span, pat, scrutinee, then, else_opt.as_deref()) } + ExprKind::Paren(ref paren) => match paren.peel_parens().kind { + ExprKind::Let(ref pat, ref scrutinee) => { + // A user has written `if (let Some(x) = foo) {`, we want to avoid + // confusing them with mentions of nightly features. + // If this logic is changed, you will also likely need to touch + // `unused::UnusedParens::check_expr`. + self.if_let_expr_with_parens(cond, &paren.peel_parens()); + self.lower_expr_if_let( + e.span, + pat, + scrutinee, + then, + else_opt.as_deref(), + ) + } + _ => self.lower_expr_if(cond, then, else_opt.as_deref()), + }, _ => self.lower_expr_if(cond, then, else_opt.as_deref()), }, ExprKind::While(ref cond, ref body, opt_label) => self @@ -201,8 +224,8 @@ impl<'hir> LoweringContext<'_, 'hir> { } ExprKind::InlineAsm(ref asm) => self.lower_expr_asm(e.span, asm), ExprKind::LlvmInlineAsm(ref asm) => self.lower_expr_llvm_asm(asm), - ExprKind::Struct(ref path, ref fields, ref rest) => { - let rest = match rest { + ExprKind::Struct(ref se) => { + let rest = match &se.rest { StructRest::Base(e) => Some(self.lower_expr(e)), StructRest::Rest(sp) => { self.sess @@ -217,11 +240,12 @@ impl<'hir> LoweringContext<'_, 'hir> { self.arena.alloc(self.lower_qpath( e.id, &None, - path, + &se.path, ParamMode::Optional, ImplTraitContext::disallowed(), )), - self.arena.alloc_from_iter(fields.iter().map(|x| self.lower_field(x))), + self.arena + .alloc_from_iter(se.fields.iter().map(|x| self.lower_expr_field(x))), rest, ) } @@ -235,9 +259,18 @@ impl<'hir> LoweringContext<'_, 'hir> { ex.span = e.span; } // Merge attributes into the inner expression. - let mut attrs: Vec<_> = e.attrs.iter().map(|a| self.lower_attr(a)).collect(); - attrs.extend::>(ex.attrs.into()); - ex.attrs = attrs.into(); + if !e.attrs.is_empty() { + let old_attrs = self.attrs.get(&ex.hir_id).map(|la| *la).unwrap_or(&[]); + self.attrs.insert( + ex.hir_id, + &*self.arena.alloc_from_iter( + e.attrs + .iter() + .map(|a| self.lower_attr(a)) + .chain(old_attrs.iter().cloned()), + ), + ); + } return ex; } @@ -249,20 +282,17 @@ impl<'hir> LoweringContext<'_, 'hir> { ExprKind::MacCall(_) => panic!("{:?} shouldn't exist here", e.span), }; - hir::Expr { - hir_id: self.lower_node_id(e.id), - kind, - span: e.span, - attrs: e.attrs.iter().map(|a| self.lower_attr(a)).collect::>().into(), - } + let hir_id = self.lower_node_id(e.id); + self.lower_attrs(hir_id, &e.attrs); + hir::Expr { hir_id, kind, span: e.span } }) } fn lower_unop(&mut self, u: UnOp) -> hir::UnOp { match u { - UnOp::Deref => hir::UnOp::UnDeref, - UnOp::Not => hir::UnOp::UnNot, - UnOp::Neg => hir::UnOp::UnNeg, + UnOp::Deref => hir::UnOp::Deref, + UnOp::Not => hir::UnOp::Not, + UnOp::Neg => hir::UnOp::Neg, } } @@ -292,6 +322,73 @@ impl<'hir> LoweringContext<'_, 'hir> { } } + fn lower_legacy_const_generics( + &mut self, + mut f: Expr, + args: Vec>, + legacy_args_idx: &[usize], + ) -> hir::ExprKind<'hir> { + let path = match f.kind { + ExprKind::Path(None, ref mut path) => path, + _ => unreachable!(), + }; + + // Split the arguments into const generics and normal arguments + let mut real_args = vec![]; + let mut generic_args = vec![]; + for (idx, arg) in args.into_iter().enumerate() { + if legacy_args_idx.contains(&idx) { + let parent_def_id = self.current_hir_id_owner.last().unwrap().0; + let node_id = self.resolver.next_node_id(); + + // Add a definition for the in-band const def. + self.resolver.create_def( + parent_def_id, + node_id, + DefPathData::AnonConst, + ExpnId::root(), + arg.span, + ); + + let anon_const = AnonConst { id: node_id, value: arg }; + generic_args.push(AngleBracketedArg::Arg(GenericArg::Const(anon_const))); + } else { + real_args.push(arg); + } + } + + // Add generic args to the last element of the path. + let last_segment = path.segments.last_mut().unwrap(); + assert!(last_segment.args.is_none()); + last_segment.args = Some(AstP(GenericArgs::AngleBracketed(AngleBracketedArgs { + span: DUMMY_SP, + args: generic_args, + }))); + + // Now lower everything as normal. + let f = self.lower_expr(&f); + hir::ExprKind::Call(f, self.lower_exprs(&real_args)) + } + + fn if_let_expr_with_parens(&mut self, cond: &Expr, paren: &Expr) { + let start = cond.span.until(paren.span); + let end = paren.span.shrink_to_hi().until(cond.span.shrink_to_hi()); + self.sess + .struct_span_err( + vec![start, end], + "invalid parentheses around `let` expression in `if let`", + ) + .multipart_suggestion( + "`if let` needs to be written without parentheses", + vec![(start, String::new()), (end, String::new())], + rustc_errors::Applicability::MachineApplicable, + ) + .emit(); + // Ideally, we'd remove the feature gating of a `let` expression since we are already + // complaining about it here, but `feature_gate::check_crate` has already run by now: + // self.sess.parse_sess.gated_spans.ungate_last(sym::let_chains, paren.span); + } + /// Emit an error and lower `ast::ExprKind::Let(pat, scrutinee)` into: /// ```rust /// match scrutinee { pats => true, _ => false } @@ -302,8 +399,10 @@ impl<'hir> LoweringContext<'_, 'hir> { if self.sess.opts.unstable_features.is_nightly_build() { self.sess .struct_span_err(span, "`let` expressions are not supported here") - .note("only supported directly in conditions of `if`- and `while`-expressions") - .note("as well as when nested within `&&` and parenthesis in those conditions") + .note( + "only supported directly without parentheses in conditions of `if`- and \ + `while`-expressions, as well as in `let` chains within parentheses", + ) .emit(); } else { self.sess @@ -347,8 +446,9 @@ impl<'hir> LoweringContext<'_, 'hir> { ) -> hir::ExprKind<'hir> { macro_rules! make_if { ($opt:expr) => {{ + let cond = self.lower_expr(cond); let then_expr = self.lower_block_expr(then); - hir::ExprKind::If(self.lower_expr(cond), self.arena.alloc(then_expr), $opt) + hir::ExprKind::If(cond, self.arena.alloc(then_expr), $opt) }}; } if let Some(rslt) = else_opt { @@ -525,14 +625,9 @@ impl<'hir> LoweringContext<'_, 'hir> { hir::Guard::If(self.lower_expr(cond)) } }); - hir::Arm { - hir_id: self.next_id(), - attrs: self.lower_attrs(&arm.attrs), - pat, - guard, - body: self.lower_expr(&arm.body), - span: arm.span, - } + let hir_id = self.next_id(); + self.lower_attrs(hir_id, &arm.attrs); + hir::Arm { hir_id, pat, guard, body: self.lower_expr(&arm.body), span: arm.span } } /// Lower an `async` construct to a generator that is then wrapped so it implements `Future`. @@ -576,7 +671,7 @@ impl<'hir> LoweringContext<'_, 'hir> { Ident::with_dummy_span(sym::_task_context), hir::BindingAnnotation::Mutable, ); - let param = hir::Param { attrs: &[], hir_id: self.next_id(), pat, ty_span: span, span }; + let param = hir::Param { hir_id: self.next_id(), pat, ty_span: span, span }; let params = arena_vec![self; param]; let body_id = self.lower_body(move |this| { @@ -597,12 +692,8 @@ impl<'hir> LoweringContext<'_, 'hir> { span, Some(hir::Movability::Static), ); - let generator = hir::Expr { - hir_id: self.lower_node_id(closure_node_id), - kind: generator_kind, - span, - attrs: ThinVec::new(), - }; + let generator = + hir::Expr { hir_id: self.lower_node_id(closure_node_id), kind: generator_kind, span }; // `future::from_generator`: let unstable_span = @@ -756,7 +847,6 @@ impl<'hir> LoweringContext<'_, 'hir> { hir_id: loop_hir_id, kind: hir::ExprKind::Loop(loop_block, None, hir::LoopSource::Loop, span), span, - attrs: ThinVec::new(), }); // mut pinned => loop { ... } @@ -933,7 +1023,7 @@ impl<'hir> LoweringContext<'_, 'hir> { // Introduce a `let` for destructuring: `let (lhs1, lhs2) = t`. let destructure_let = self.stmt_let_pat( - ThinVec::new(), + None, whole_span, Some(rhs), pat, @@ -1021,10 +1111,10 @@ impl<'hir> LoweringContext<'_, 'hir> { } } // Structs. - ExprKind::Struct(path, fields, rest) => { - let field_pats = self.arena.alloc_from_iter(fields.iter().map(|f| { + ExprKind::Struct(se) => { + let field_pats = self.arena.alloc_from_iter(se.fields.iter().map(|f| { let pat = self.destructure_assign(&f.expr, eq_sign_span, assignments); - hir::FieldPat { + hir::PatField { hir_id: self.next_id(), ident: f.ident, pat, @@ -1035,11 +1125,11 @@ impl<'hir> LoweringContext<'_, 'hir> { let qpath = self.lower_qpath( lhs.id, &None, - path, + &se.path, ParamMode::Optional, ImplTraitContext::disallowed(), ); - let fields_omitted = match rest { + let fields_omitted = match &se.rest { StructRest::Base(e) => { self.sess .struct_span_err( @@ -1155,7 +1245,7 @@ impl<'hir> LoweringContext<'_, 'hir> { e1.iter().map(|e| ("start", e)).chain(e2.iter().map(|e| ("end", e))).map(|(s, e)| { let expr = self.lower_expr(&e); let ident = Ident::new(Symbol::intern(s), e.span); - self.field(ident, expr, e.span) + self.expr_field(ident, expr, e.span) }), ); @@ -1242,84 +1332,83 @@ impl<'hir> LoweringContext<'_, 'hir> { } fn lower_expr_asm(&mut self, sp: Span, asm: &InlineAsm) -> hir::ExprKind<'hir> { - if self.sess.asm_arch.is_none() { + // Rustdoc needs to support asm! from foriegn architectures: don't try + // lowering the register contraints in this case. + let asm_arch = if self.sess.opts.actually_rustdoc { None } else { self.sess.asm_arch }; + if asm_arch.is_none() && !self.sess.opts.actually_rustdoc { struct_span_err!(self.sess, sp, E0472, "asm! is unsupported on this target").emit(); } if asm.options.contains(InlineAsmOptions::ATT_SYNTAX) - && !matches!( - self.sess.asm_arch, - Some(asm::InlineAsmArch::X86 | asm::InlineAsmArch::X86_64) - ) + && !matches!(asm_arch, Some(asm::InlineAsmArch::X86 | asm::InlineAsmArch::X86_64)) + && !self.sess.opts.actually_rustdoc { self.sess .struct_span_err(sp, "the `att_syntax` option is only supported on x86") .emit(); } - // Lower operands to HIR, filter_map skips any operands with invalid - // register classes. + // Lower operands to HIR. We use dummy register classes if an error + // occurs during lowering because we still need to be able to produce a + // valid HIR. let sess = self.sess; let operands: Vec<_> = asm .operands .iter() - .filter_map(|(op, op_sp)| { - let lower_reg = |reg| { - Some(match reg { - InlineAsmRegOrRegClass::Reg(s) => asm::InlineAsmRegOrRegClass::Reg( + .map(|(op, op_sp)| { + let lower_reg = |reg| match reg { + InlineAsmRegOrRegClass::Reg(s) => { + asm::InlineAsmRegOrRegClass::Reg(if let Some(asm_arch) = asm_arch { asm::InlineAsmReg::parse( - sess.asm_arch?, + asm_arch, |feature| sess.target_features.contains(&Symbol::intern(feature)), &sess.target, s, ) - .map_err(|e| { + .unwrap_or_else(|e| { let msg = format!("invalid register `{}`: {}", s.as_str(), e); sess.struct_span_err(*op_sp, &msg).emit(); + asm::InlineAsmReg::Err }) - .ok()?, - ), - InlineAsmRegOrRegClass::RegClass(s) => { - asm::InlineAsmRegOrRegClass::RegClass( - asm::InlineAsmRegClass::parse(sess.asm_arch?, s) - .map_err(|e| { - let msg = format!( - "invalid register class `{}`: {}", - s.as_str(), - e - ); - sess.struct_span_err(*op_sp, &msg).emit(); - }) - .ok()?, - ) - } - }) + } else { + asm::InlineAsmReg::Err + }) + } + InlineAsmRegOrRegClass::RegClass(s) => { + asm::InlineAsmRegOrRegClass::RegClass(if let Some(asm_arch) = asm_arch { + asm::InlineAsmRegClass::parse(asm_arch, s).unwrap_or_else(|e| { + let msg = format!("invalid register class `{}`: {}", s.as_str(), e); + sess.struct_span_err(*op_sp, &msg).emit(); + asm::InlineAsmRegClass::Err + }) + } else { + asm::InlineAsmRegClass::Err + }) + } }; - // lower_reg is executed last because we need to lower all - // sub-expressions even if we throw them away later. let op = match *op { InlineAsmOperand::In { reg, ref expr } => hir::InlineAsmOperand::In { + reg: lower_reg(reg), expr: self.lower_expr_mut(expr), - reg: lower_reg(reg)?, }, InlineAsmOperand::Out { reg, late, ref expr } => hir::InlineAsmOperand::Out { + reg: lower_reg(reg), late, expr: expr.as_ref().map(|expr| self.lower_expr_mut(expr)), - reg: lower_reg(reg)?, }, InlineAsmOperand::InOut { reg, late, ref expr } => { hir::InlineAsmOperand::InOut { + reg: lower_reg(reg), late, expr: self.lower_expr_mut(expr), - reg: lower_reg(reg)?, } } InlineAsmOperand::SplitInOut { reg, late, ref in_expr, ref out_expr } => { hir::InlineAsmOperand::SplitInOut { + reg: lower_reg(reg), late, in_expr: self.lower_expr_mut(in_expr), out_expr: out_expr.as_ref().map(|expr| self.lower_expr_mut(expr)), - reg: lower_reg(reg)?, } } InlineAsmOperand::Const { ref expr } => { @@ -1329,17 +1418,11 @@ impl<'hir> LoweringContext<'_, 'hir> { hir::InlineAsmOperand::Sym { expr: self.lower_expr_mut(expr) } } }; - Some((op, *op_sp)) + (op, *op_sp) }) .collect(); - // Stop if there were any errors when lowering the register classes - if operands.len() != asm.operands.len() || sess.asm_arch.is_none() { - return hir::ExprKind::Err; - } - // Validate template modifiers against the register classes for the operands - let asm_arch = sess.asm_arch.unwrap(); for p in &asm.template { if let InlineAsmTemplatePiece::Placeholder { operand_idx, @@ -1354,7 +1437,10 @@ impl<'hir> LoweringContext<'_, 'hir> { | hir::InlineAsmOperand::InOut { reg, .. } | hir::InlineAsmOperand::SplitInOut { reg, .. } => { let class = reg.reg_class(); - let valid_modifiers = class.valid_modifiers(asm_arch); + if class == asm::InlineAsmRegClass::Err { + continue; + } + let valid_modifiers = class.valid_modifiers(asm_arch.unwrap()); if !valid_modifiers.contains(&modifier) { let mut err = sess.struct_span_err( placeholder_span, @@ -1417,7 +1503,10 @@ impl<'hir> LoweringContext<'_, 'hir> { // features. We check that at least one type is available for // the current target. let reg_class = reg.reg_class(); - for &(_, feature) in reg_class.supported_types(asm_arch) { + if reg_class == asm::InlineAsmRegClass::Err { + continue; + } + for &(_, feature) in reg_class.supported_types(asm_arch.unwrap()) { if let Some(feature) = feature { if self.sess.target_features.contains(&Symbol::intern(feature)) { required_features.clear(); @@ -1569,8 +1658,8 @@ impl<'hir> LoweringContext<'_, 'hir> { hir::ExprKind::LlvmInlineAsm(self.arena.alloc(hir_asm)) } - fn lower_field(&mut self, f: &Field) -> hir::Field<'hir> { - hir::Field { + fn lower_expr_field(&mut self, f: &ExprField) -> hir::ExprField<'hir> { + hir::ExprField { hir_id: self.next_id(), ident: f.ident, expr: self.lower_expr(&f.expr), @@ -1692,7 +1781,7 @@ impl<'hir> LoweringContext<'_, 'hir> { // `let mut __next` let next_let = self.stmt_let_pat( - ThinVec::new(), + None, desugared_span, None, next_pat, @@ -1702,7 +1791,7 @@ impl<'hir> LoweringContext<'_, 'hir> { // `let = __next` let pat = self.lower_pat(pat); let pat_let = self.stmt_let_pat( - ThinVec::new(), + None, desugared_span, Some(next_expr), pat, @@ -1726,12 +1815,8 @@ impl<'hir> LoweringContext<'_, 'hir> { hir::LoopSource::ForLoop, e.span.with_hi(orig_head_span.hi()), ); - let loop_expr = self.arena.alloc(hir::Expr { - hir_id: self.lower_node_id(e.id), - kind, - span: e.span, - attrs: ThinVec::new(), - }); + let loop_expr = + self.arena.alloc(hir::Expr { hir_id: self.lower_node_id(e.id), kind, span: e.span }); // `mut iter => { ... }` let iter_arm = self.arm(iter_pat, loop_expr); @@ -2066,21 +2151,21 @@ impl<'hir> LoweringContext<'_, 'hir> { kind: hir::ExprKind<'hir>, attrs: AttrVec, ) -> hir::Expr<'hir> { - hir::Expr { hir_id: self.next_id(), kind, span, attrs } + let hir_id = self.next_id(); + self.lower_attrs(hir_id, &attrs); + hir::Expr { hir_id, kind, span } } - fn field(&mut self, ident: Ident, expr: &'hir hir::Expr<'hir>, span: Span) -> hir::Field<'hir> { - hir::Field { hir_id: self.next_id(), ident, span, expr, is_shorthand: false } + fn expr_field( + &mut self, + ident: Ident, + expr: &'hir hir::Expr<'hir>, + span: Span, + ) -> hir::ExprField<'hir> { + hir::ExprField { hir_id: self.next_id(), ident, span, expr, is_shorthand: false } } fn arm(&mut self, pat: &'hir hir::Pat<'hir>, expr: &'hir hir::Expr<'hir>) -> hir::Arm<'hir> { - hir::Arm { - hir_id: self.next_id(), - attrs: &[], - pat, - guard: None, - span: expr.span, - body: expr, - } + hir::Arm { hir_id: self.next_id(), pat, guard: None, span: expr.span, body: expr } } } diff --git a/compiler/rustc_ast_lowering/src/item.rs b/compiler/rustc_ast_lowering/src/item.rs index 1efe83cace..edd0c5fb96 100644 --- a/compiler/rustc_ast_lowering/src/item.rs +++ b/compiler/rustc_ast_lowering/src/item.rs @@ -15,11 +15,11 @@ use rustc_span::source_map::{respan, DesugaringKind}; use rustc_span::symbol::{kw, sym, Ident}; use rustc_span::Span; use rustc_target::spec::abi; - use smallvec::{smallvec, SmallVec}; -use std::collections::BTreeSet; use tracing::debug; +use std::mem; + pub(super) struct ItemLowerer<'a, 'lowering, 'hir> { pub(super) lctx: &'a mut LoweringContext<'lowering, 'hir>, } @@ -34,32 +34,13 @@ impl ItemLowerer<'_, '_, '_> { } impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> { - fn visit_mod(&mut self, m: &'a Mod, _s: Span, _attrs: &[Attribute], n: NodeId) { - let hir_id = self.lctx.lower_node_id(n); - - self.lctx.modules.insert( - hir_id, - hir::ModuleItems { - items: BTreeSet::new(), - trait_items: BTreeSet::new(), - impl_items: BTreeSet::new(), - foreign_items: BTreeSet::new(), - }, - ); - - let old = self.lctx.current_module; - self.lctx.current_module = hir_id; - visit::walk_mod(self, m); - self.lctx.current_module = old; - } - fn visit_item(&mut self, item: &'a Item) { let mut item_hir_id = None; self.lctx.with_hir_id_owner(item.id, |lctx| { lctx.without_in_scope_lifetime_defs(|lctx| { if let Some(hir_item) = lctx.lower_item(item) { - item_hir_id = Some(hir_item.hir_id); - lctx.insert_item(hir_item); + let id = lctx.insert_item(hir_item); + item_hir_id = Some(id); } }) }); @@ -67,10 +48,18 @@ impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> { if let Some(hir_id) = item_hir_id { self.lctx.with_parent_item_lifetime_defs(hir_id, |this| { let this = &mut ItemLowerer { lctx: this }; - if let ItemKind::Impl(box ImplKind { ref of_trait, .. }) = item.kind { - this.with_trait_impl_ref(of_trait, |this| visit::walk_item(this, item)); - } else { - visit::walk_item(this, item); + match item.kind { + ItemKind::Mod(..) => { + let def_id = this.lctx.lower_node_id(item.id).expect_owner(); + let old_current_module = + mem::replace(&mut this.lctx.current_module, def_id); + visit::walk_item(this, item); + this.lctx.current_module = old_current_module; + } + ItemKind::Impl(box ImplKind { ref of_trait, .. }) => { + this.with_trait_impl_ref(of_trait, |this| visit::walk_item(this, item)); + } + _ => visit::walk_item(this, item), } }); } @@ -92,15 +81,15 @@ impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> { self.lctx.with_hir_id_owner(item.id, |lctx| match ctxt { AssocCtxt::Trait => { let hir_item = lctx.lower_trait_item(item); - let id = hir::TraitItemId { hir_id: hir_item.hir_id }; + let id = hir_item.trait_item_id(); lctx.trait_items.insert(id, hir_item); - lctx.modules.get_mut(&lctx.current_module).unwrap().trait_items.insert(id); + lctx.modules.entry(lctx.current_module).or_default().trait_items.insert(id); } AssocCtxt::Impl => { let hir_item = lctx.lower_impl_item(item); - let id = hir::ImplItemId { hir_id: hir_item.hir_id }; + let id = hir_item.impl_item_id(); lctx.impl_items.insert(id, hir_item); - lctx.modules.get_mut(&lctx.current_module).unwrap().impl_items.insert(id); + lctx.modules.entry(lctx.current_module).or_default().impl_items.insert(id); } }); @@ -111,9 +100,9 @@ impl<'a> Visitor<'a> for ItemLowerer<'a, '_, '_> { self.lctx.allocate_hir_id_counter(item.id); self.lctx.with_hir_id_owner(item.id, |lctx| { let hir_item = lctx.lower_foreign_item(item); - let id = hir::ForeignItemId { hir_id: hir_item.hir_id }; + let id = hir_item.foreign_item_id(); lctx.foreign_items.insert(id, hir_item); - lctx.modules.get_mut(&lctx.current_module).unwrap().foreign_items.insert(id); + lctx.modules.entry(lctx.current_module).or_default().foreign_items.insert(id); }); visit::walk_foreign_item(self, item); @@ -128,14 +117,14 @@ impl<'hir> LoweringContext<'_, 'hir> { // only used when lowering a child item of a trait or impl. fn with_parent_item_lifetime_defs( &mut self, - parent_hir_id: hir::HirId, + parent_hir_id: hir::ItemId, f: impl FnOnce(&mut LoweringContext<'_, '_>) -> T, ) -> T { let old_len = self.in_scope_lifetimes.len(); let parent_generics = match self.items.get(&parent_hir_id).unwrap().kind { hir::ItemKind::Impl(hir::Impl { ref generics, .. }) - | hir::ItemKind::Trait(_, _, ref generics, ..) => &generics.params[..], + | hir::ItemKind::Trait(_, _, ref generics, ..) => generics.params, _ => &[], }; let lt_def_names = parent_generics.iter().filter_map(|param| match param.kind { @@ -157,7 +146,7 @@ impl<'hir> LoweringContext<'_, 'hir> { &mut self, f: impl FnOnce(&mut LoweringContext<'_, '_>) -> T, ) -> T { - let old_in_scope_lifetimes = std::mem::replace(&mut self.in_scope_lifetimes, vec![]); + let old_in_scope_lifetimes = mem::replace(&mut self.in_scope_lifetimes, vec![]); // this vector is only used when walking over impl headers, // input types, and the like, and should not be non-empty in @@ -172,12 +161,10 @@ impl<'hir> LoweringContext<'_, 'hir> { res } - pub(super) fn lower_mod(&mut self, m: &Mod) -> hir::Mod<'hir> { + pub(super) fn lower_mod(&mut self, items: &[P], inner: Span) -> hir::Mod<'hir> { hir::Mod { - inner: m.inner, - item_ids: self - .arena - .alloc_from_iter(m.items.iter().flat_map(|x| self.lower_item_id(x))), + inner, + item_ids: self.arena.alloc_from_iter(items.iter().flat_map(|x| self.lower_item_id(x))), } } @@ -197,7 +184,9 @@ impl<'hir> LoweringContext<'_, 'hir> { node_ids .into_iter() - .map(|node_id| hir::ItemId { id: self.allocate_hir_id_counter(node_id) }) + .map(|node_id| hir::ItemId { + def_id: self.allocate_hir_id_counter(node_id).expect_owner(), + }) .collect() } @@ -228,37 +217,41 @@ impl<'hir> LoweringContext<'_, 'hir> { pub fn lower_item(&mut self, i: &Item) -> Option> { let mut ident = i.ident; let mut vis = self.lower_visibility(&i.vis, None); - let attrs = self.lower_attrs(&i.attrs); if let ItemKind::MacroDef(MacroDef { ref body, macro_rules }) = i.kind { if !macro_rules || self.sess.contains_name(&i.attrs, sym::macro_export) { let hir_id = self.lower_node_id(i.id); + self.lower_attrs(hir_id, &i.attrs); let body = P(self.lower_mac_args(body)); self.exported_macros.push(hir::MacroDef { ident, vis, - attrs, - hir_id, + def_id: hir_id.expect_owner(), span: i.span, ast: MacroDef { body, macro_rules }, }); } else { - self.non_exported_macro_attrs.extend(attrs.iter().cloned()); + for a in i.attrs.iter() { + let a = self.lower_attr(a); + self.non_exported_macro_attrs.push(a); + } } return None; } - let kind = self.lower_item_kind(i.span, i.id, &mut ident, attrs, &mut vis, &i.kind); - - Some(hir::Item { hir_id: self.lower_node_id(i.id), ident, attrs, kind, vis, span: i.span }) + let hir_id = self.lower_node_id(i.id); + let attrs = self.lower_attrs(hir_id, &i.attrs); + let kind = self.lower_item_kind(i.span, i.id, hir_id, &mut ident, attrs, &mut vis, &i.kind); + Some(hir::Item { def_id: hir_id.expect_owner(), ident, kind, vis, span: i.span }) } fn lower_item_kind( &mut self, span: Span, id: NodeId, + hir_id: hir::HirId, ident: &mut Ident, - attrs: &'hir [Attribute], + attrs: Option<&'hir [Attribute]>, vis: &mut hir::Visibility<'hir>, i: &ItemKind, ) -> hir::ItemKind<'hir> { @@ -318,13 +311,18 @@ impl<'hir> LoweringContext<'_, 'hir> { hir::ItemKind::Fn(sig, generics, body_id) }) } - ItemKind::Mod(ref m) => hir::ItemKind::Mod(self.lower_mod(m)), + ItemKind::Mod(_, ref mod_kind) => match mod_kind { + ModKind::Loaded(items, _, inner_span) => { + hir::ItemKind::Mod(self.lower_mod(items, *inner_span)) + } + ModKind::Unloaded => panic!("`mod` items should have been loaded by now"), + }, ItemKind::ForeignMod(ref fm) => { if fm.abi.is_none() { - self.maybe_lint_missing_abi(span, id, abi::Abi::C); + self.maybe_lint_missing_abi(span, id, abi::Abi::C { unwind: false }); } hir::ItemKind::ForeignMod { - abi: fm.abi.map_or(abi::Abi::C, |abi| self.lower_abi(abi)), + abi: fm.abi.map_or(abi::Abi::C { unwind: false }, |abi| self.lower_abi(abi)), items: self .arena .alloc_from_iter(fm.items.iter().map(|x| self.lower_foreign_item_ref(x))), @@ -344,7 +342,7 @@ impl<'hir> LoweringContext<'_, 'hir> { ty, ImplTraitContext::OtherOpaqueTy { capturable_lifetimes: &mut FxHashSet::default(), - origin: hir::OpaqueTyOrigin::Misc, + origin: hir::OpaqueTyOrigin::TyAlias, }, ); let generics = self.lower_generics(gen, ImplTraitContext::disallowed()); @@ -364,14 +362,14 @@ impl<'hir> LoweringContext<'_, 'hir> { self.lower_generics(generics, ImplTraitContext::disallowed()), ), ItemKind::Struct(ref struct_def, ref generics) => { - let struct_def = self.lower_variant_data(struct_def); + let struct_def = self.lower_variant_data(hir_id, struct_def); hir::ItemKind::Struct( struct_def, self.lower_generics(generics, ImplTraitContext::disallowed()), ) } ItemKind::Union(ref vdata, ref generics) => { - let vdata = self.lower_variant_data(vdata); + let vdata = self.lower_variant_data(hir_id, vdata); hir::ItemKind::Union( vdata, self.lower_generics(generics, ImplTraitContext::disallowed()), @@ -387,8 +385,6 @@ impl<'hir> LoweringContext<'_, 'hir> { self_ty: ref ty, items: ref impl_items, }) => { - let def_id = self.resolver.local_def_id(id); - // Lower the "impl header" first. This ordering is important // for in-band lifetimes! Consider `'a` here: // @@ -402,10 +398,10 @@ impl<'hir> LoweringContext<'_, 'hir> { // method, it will not be considered an in-band // lifetime to be added, but rather a reference to a // parent lifetime. - let lowered_trait_impl_id = self.lower_node_id(id); + let lowered_trait_def_id = self.lower_node_id(id).expect_owner(); let (generics, (trait_ref, lowered_ty)) = self.add_in_band_defs( ast_generics, - def_id, + lowered_trait_def_id, AnonymousLifetimeMode::CreateParameter, |this, _| { let trait_ref = trait_ref.as_ref().map(|trait_ref| { @@ -417,7 +413,7 @@ impl<'hir> LoweringContext<'_, 'hir> { this.trait_impls .entry(def_id) .or_default() - .push(lowered_trait_impl_id); + .push(lowered_trait_def_id); } } @@ -506,7 +502,7 @@ impl<'hir> LoweringContext<'_, 'hir> { id: NodeId, vis: &mut hir::Visibility<'hir>, ident: &mut Ident, - attrs: &'hir [Attribute], + attrs: Option<&'hir [Attribute]>, ) -> hir::ItemKind<'hir> { debug!("lower_use_tree(tree={:?})", tree); debug!("lower_use_tree: vis = {:?}", vis); @@ -555,11 +551,13 @@ impl<'hir> LoweringContext<'_, 'hir> { let path = this.lower_path_extra(res, &path, ParamMode::Explicit, None); let kind = hir::ItemKind::Use(path, hir::UseKind::Single); let vis = this.rebuild_vis(&vis); + if let Some(attrs) = attrs { + this.attrs.insert(new_id, attrs); + } this.insert_item(hir::Item { - hir_id: new_id, + def_id: new_id.expect_owner(), ident, - attrs, kind, vis, span, @@ -627,11 +625,13 @@ impl<'hir> LoweringContext<'_, 'hir> { let kind = this.lower_use_tree(use_tree, &prefix, id, &mut vis, &mut ident, attrs); + if let Some(attrs) = attrs { + this.attrs.insert(new_hir_id, attrs); + } this.insert_item(hir::Item { - hir_id: new_hir_id, + def_id: new_hir_id.expect_owner(), ident, - attrs, kind, vis, span: use_tree.span, @@ -700,11 +700,12 @@ impl<'hir> LoweringContext<'_, 'hir> { } fn lower_foreign_item(&mut self, i: &ForeignItem) -> hir::ForeignItem<'hir> { - let def_id = self.resolver.local_def_id(i.id); + let hir_id = self.lower_node_id(i.id); + let def_id = hir_id.expect_owner(); + self.lower_attrs(hir_id, &i.attrs); hir::ForeignItem { - hir_id: self.lower_node_id(i.id), + def_id, ident: i.ident, - attrs: self.lower_attrs(&i.attrs), kind: match i.kind { ForeignItemKind::Fn(box FnKind(_, ref sig, ref generics, _)) => { let fdec = &sig.decl; @@ -737,7 +738,7 @@ impl<'hir> LoweringContext<'_, 'hir> { fn lower_foreign_item_ref(&mut self, i: &ForeignItem) -> hir::ForeignItemRef<'hir> { hir::ForeignItemRef { - id: hir::ForeignItemId { hir_id: self.lower_node_id(i.id) }, + id: hir::ForeignItemId { def_id: self.lower_node_id(i.id).expect_owner() }, ident: i.ident, span: i.span, vis: self.lower_visibility(&i.vis, Some(i.id)), @@ -749,33 +750,47 @@ impl<'hir> LoweringContext<'_, 'hir> { } fn lower_variant(&mut self, v: &Variant) -> hir::Variant<'hir> { + let id = self.lower_node_id(v.id); + self.lower_attrs(id, &v.attrs); hir::Variant { - attrs: self.lower_attrs(&v.attrs), - data: self.lower_variant_data(&v.data), + id, + data: self.lower_variant_data(id, &v.data), disr_expr: v.disr_expr.as_ref().map(|e| self.lower_anon_const(e)), - id: self.lower_node_id(v.id), ident: v.ident, span: v.span, } } - fn lower_variant_data(&mut self, vdata: &VariantData) -> hir::VariantData<'hir> { + fn lower_variant_data( + &mut self, + parent_id: hir::HirId, + vdata: &VariantData, + ) -> hir::VariantData<'hir> { match *vdata { VariantData::Struct(ref fields, recovered) => hir::VariantData::Struct( self.arena - .alloc_from_iter(fields.iter().enumerate().map(|f| self.lower_struct_field(f))), + .alloc_from_iter(fields.iter().enumerate().map(|f| self.lower_field_def(f))), recovered, ), - VariantData::Tuple(ref fields, id) => hir::VariantData::Tuple( - self.arena - .alloc_from_iter(fields.iter().enumerate().map(|f| self.lower_struct_field(f))), - self.lower_node_id(id), - ), - VariantData::Unit(id) => hir::VariantData::Unit(self.lower_node_id(id)), + VariantData::Tuple(ref fields, id) => { + let ctor_id = self.lower_node_id(id); + self.alias_attrs(ctor_id, parent_id); + hir::VariantData::Tuple( + self.arena.alloc_from_iter( + fields.iter().enumerate().map(|f| self.lower_field_def(f)), + ), + ctor_id, + ) + } + VariantData::Unit(id) => { + let ctor_id = self.lower_node_id(id); + self.alias_attrs(ctor_id, parent_id); + hir::VariantData::Unit(ctor_id) + } } } - fn lower_struct_field(&mut self, (index, f): (usize, &StructField)) -> hir::StructField<'hir> { + fn lower_field_def(&mut self, (index, f): (usize, &FieldDef)) -> hir::FieldDef<'hir> { let ty = if let TyKind::Path(ref qself, ref path) = f.ty.kind { let t = self.lower_path_ty( &f.ty, @@ -788,9 +803,11 @@ impl<'hir> LoweringContext<'_, 'hir> { } else { self.lower_ty(&f.ty, ImplTraitContext::disallowed()) }; - hir::StructField { + let hir_id = self.lower_node_id(f.id); + self.lower_attrs(hir_id, &f.attrs); + hir::FieldDef { span: f.span, - hir_id: self.lower_node_id(f.id), + hir_id, ident: match f.ident { Some(ident) => ident, // FIXME(jseyfried): positional field hygiene. @@ -798,12 +815,12 @@ impl<'hir> LoweringContext<'_, 'hir> { }, vis: self.lower_visibility(&f.vis, None), ty, - attrs: self.lower_attrs(&f.attrs), } } fn lower_trait_item(&mut self, i: &AssocItem) -> hir::TraitItem<'hir> { - let trait_item_def_id = self.resolver.local_def_id(i.id); + let hir_id = self.lower_node_id(i.id); + let trait_item_def_id = hir_id.expect_owner(); let (generics, kind) = match i.kind { AssocItemKind::Const(_, ref ty, ref default) => { @@ -836,14 +853,8 @@ impl<'hir> LoweringContext<'_, 'hir> { AssocItemKind::MacCall(..) => panic!("macro item shouldn't exist at this point"), }; - hir::TraitItem { - hir_id: self.lower_node_id(i.id), - ident: i.ident, - attrs: self.lower_attrs(&i.attrs), - generics, - kind, - span: i.span, - } + self.lower_attrs(hir_id, &i.attrs); + hir::TraitItem { def_id: trait_item_def_id, ident: i.ident, generics, kind, span: i.span } } fn lower_trait_item_ref(&mut self, i: &AssocItem) -> hir::TraitItemRef { @@ -857,7 +868,7 @@ impl<'hir> LoweringContext<'_, 'hir> { } AssocItemKind::MacCall(..) => unimplemented!(), }; - let id = hir::TraitItemId { hir_id: self.lower_node_id(i.id) }; + let id = hir::TraitItemId { def_id: self.lower_node_id(i.id).expect_owner() }; let defaultness = hir::Defaultness::Default { has_value: has_default }; hir::TraitItemRef { id, ident: i.ident, span: i.span, defaultness, kind } } @@ -907,7 +918,7 @@ impl<'hir> LoweringContext<'_, 'hir> { ty, ImplTraitContext::OtherOpaqueTy { capturable_lifetimes: &mut FxHashSet::default(), - origin: hir::OpaqueTyOrigin::Misc, + origin: hir::OpaqueTyOrigin::TyAlias, }, ); hir::ImplItemKind::TyAlias(ty) @@ -921,10 +932,11 @@ impl<'hir> LoweringContext<'_, 'hir> { // Since `default impl` is not yet implemented, this is always true in impls. let has_value = true; let (defaultness, _) = self.lower_defaultness(i.kind.defaultness(), has_value); + let hir_id = self.lower_node_id(i.id); + self.lower_attrs(hir_id, &i.attrs); hir::ImplItem { - hir_id: self.lower_node_id(i.id), + def_id: hir_id.expect_owner(), ident: i.ident, - attrs: self.lower_attrs(&i.attrs), generics, vis: self.lower_visibility(&i.vis, None), defaultness, @@ -938,7 +950,7 @@ impl<'hir> LoweringContext<'_, 'hir> { let has_value = true; let (defaultness, _) = self.lower_defaultness(i.kind.defaultness(), has_value); hir::ImplItemRef { - id: hir::ImplItemId { hir_id: self.lower_node_id(i.id) }, + id: hir::ImplItemId { def_id: self.lower_node_id(i.id).expect_owner() }, ident: i.ident, span: i.span, vis: self.lower_visibility(&i.vis, Some(i.id)), @@ -1025,9 +1037,10 @@ impl<'hir> LoweringContext<'_, 'hir> { } fn lower_param(&mut self, param: &Param) -> hir::Param<'hir> { + let hir_id = self.lower_node_id(param.id); + self.lower_attrs(hir_id, ¶m.attrs); hir::Param { - attrs: self.lower_attrs(¶m.attrs), - hir_id: self.lower_node_id(param.id), + hir_id, pat: self.lower_pat(¶m.pat), ty_span: param.ty.span, span: param.span, @@ -1159,11 +1172,9 @@ impl<'hir> LoweringContext<'_, 'hir> { // // If this is the simple case, this parameter will end up being the same as the // original parameter, but with a different pattern id. - let mut stmt_attrs = AttrVec::new(); - stmt_attrs.extend(parameter.attrs.iter().cloned()); + let stmt_attrs = this.attrs.get(¶meter.hir_id).copied(); let (new_parameter_pat, new_parameter_id) = this.pat_ident(desugared_span, ident); let new_parameter = hir::Param { - attrs: parameter.attrs, hir_id: parameter.hir_id, pat: new_parameter_pat, ty_span: parameter.ty_span, @@ -1206,7 +1217,7 @@ impl<'hir> LoweringContext<'_, 'hir> { ); let move_expr = this.expr_ident(desugared_span, ident, new_parameter_id); let move_stmt = this.stmt_let_pat( - AttrVec::new(), + None, desugared_span, Some(move_expr), move_pat, @@ -1323,8 +1334,8 @@ impl<'hir> LoweringContext<'_, 'hir> { match ext { Extern::None => abi::Abi::Rust, Extern::Implicit => { - self.maybe_lint_missing_abi(span, id, abi::Abi::C); - abi::Abi::C + self.maybe_lint_missing_abi(span, id, abi::Abi::C { unwind: false }); + abi::Abi::C { unwind: false } } Extern::Explicit(abi) => self.lower_abi(abi), } diff --git a/compiler/rustc_ast_lowering/src/lib.rs b/compiler/rustc_ast_lowering/src/lib.rs index f076dca5cf..f9872f84e1 100644 --- a/compiler/rustc_ast_lowering/src/lib.rs +++ b/compiler/rustc_ast_lowering/src/lib.rs @@ -12,7 +12,7 @@ //! For the simpler lowering steps, IDs and spans should be preserved. Unlike //! expansion we do not preserve the process of lowering in the spans, so spans //! should not be modified here. When creating a new node (as opposed to -//! 'folding' an existing one), then you create a new ID using `next_id()`. +//! "folding" an existing one), create a new ID using `next_id()`. //! //! You must ensure that IDs are unique. That means that you should only use the //! ID from an AST node in a single HIR node (you can assume that AST node-IDs @@ -26,7 +26,7 @@ //! span and spans don't need to be kept in order, etc. Where code is preserved //! by lowering, it should have the same span as in the AST. Where HIR nodes are //! new it is probably best to give a span for the whole AST node being lowered. -//! All nodes should have real spans, don't use dummy spans. Tools are likely to +//! All nodes should have real spans; don't use dummy spans. Tools are likely to //! get confused if the spans from leaf AST nodes occur in multiple places //! in the HIR, especially for multiple identifiers. @@ -48,7 +48,7 @@ use rustc_data_structures::sync::Lrc; use rustc_errors::struct_span_err; use rustc_hir as hir; use rustc_hir::def::{DefKind, Namespace, PartialRes, PerNS, Res}; -use rustc_hir::def_id::{DefId, DefIdMap, LocalDefId, CRATE_DEF_INDEX}; +use rustc_hir::def_id::{DefId, DefIdMap, LocalDefId, CRATE_DEF_ID}; use rustc_hir::definitions::{DefKey, DefPathData, Definitions}; use rustc_hir::intravisit; use rustc_hir::{ConstArg, GenericArg, ParamName}; @@ -95,11 +95,11 @@ struct LoweringContext<'a, 'hir: 'a> { /// librustc_middle is independent of the parser, we use dynamic dispatch here. nt_to_tokenstream: NtToTokenstream, - /// Used to allocate HIR nodes + /// Used to allocate HIR nodes. arena: &'hir Arena<'hir>, /// The items being lowered are collected here. - items: BTreeMap>, + items: BTreeMap>, trait_items: BTreeMap>, impl_items: BTreeMap>, @@ -108,12 +108,14 @@ struct LoweringContext<'a, 'hir: 'a> { exported_macros: Vec>, non_exported_macro_attrs: Vec, - trait_impls: BTreeMap>, + trait_impls: BTreeMap>, - modules: BTreeMap, + modules: BTreeMap, generator_kind: Option, + attrs: BTreeMap, + /// When inside an `async` context, this is the `HirId` of the /// `task_context` local bound to the resume argument of the generator. task_context: Option, @@ -128,7 +130,7 @@ struct LoweringContext<'a, 'hir: 'a> { is_in_trait_impl: bool, is_in_dyn_type: bool, - /// What to do when we encounter either an "anonymous lifetime + /// What to do when we encounter an "anonymous lifetime /// reference". The term "anonymous" is meant to encompass both /// `'_` lifetimes as well as fully elided cases where nothing is /// written at all (e.g., `&T` or `std::cell::Ref`). @@ -158,7 +160,7 @@ struct LoweringContext<'a, 'hir: 'a> { /// vector. in_scope_lifetimes: Vec, - current_module: hir::HirId, + current_module: LocalDefId, type_def_lifetime_params: DefIdMap, @@ -175,6 +177,8 @@ pub trait ResolverAstLowering { fn item_generics_num_lifetimes(&self, def: DefId, sess: &Session) -> usize; + fn legacy_const_generic_args(&mut self, expr: &Expr) -> Option>; + /// Obtains resolution for a `NodeId` with a single resolution. fn get_partial_res(&mut self, id: NodeId) -> Option; @@ -219,7 +223,7 @@ enum ImplTraitContext<'b, 'a> { /// equivalent to a fresh universal parameter like `fn foo(x: T)`. /// /// Newly generated parameters should be inserted into the given `Vec`. - Universal(&'b mut Vec>), + Universal(&'b mut Vec>, LocalDefId), /// Treat `impl Trait` as shorthand for a new opaque type. /// Example: `fn foo() -> impl Debug`, where `impl Debug` is conceptually @@ -236,11 +240,13 @@ enum ImplTraitContext<'b, 'a> { OtherOpaqueTy { /// Set of lifetimes that this opaque type can capture, if it uses /// them. This includes lifetimes bound since we entered this context. - /// For example, in + /// For example: /// + /// ``` /// type A<'b> = impl for<'a> Trait<'a, Out = impl Sized + 'a>; + /// ``` /// - /// the inner opaque type captures `'a` because it uses it. It doesn't + /// Here the inner opaque type captures `'a` because it uses it. It doesn't /// need to capture `'b` because it already inherits the lifetime /// parameter from `A`. // FIXME(impl_trait): but `required_region_bounds` will ICE later @@ -272,7 +278,7 @@ impl<'a> ImplTraitContext<'_, 'a> { fn reborrow<'this>(&'this mut self) -> ImplTraitContext<'this, 'a> { use self::ImplTraitContext::*; match self { - Universal(params) => Universal(params), + Universal(params, parent) => Universal(params, *parent), ReturnPositionOpaqueTy { fn_def_id, origin } => { ReturnPositionOpaqueTy { fn_def_id: *fn_def_id, origin: *origin } } @@ -305,6 +311,7 @@ pub fn lower_crate<'a, 'hir>( bodies: BTreeMap::new(), trait_impls: BTreeMap::new(), modules: BTreeMap::new(), + attrs: BTreeMap::default(), exported_macros: Vec::new(), non_exported_macro_attrs: Vec::new(), catch_scopes: Vec::new(), @@ -314,8 +321,8 @@ pub fn lower_crate<'a, 'hir>( is_in_dyn_type: false, anonymous_lifetime_mode: AnonymousLifetimeMode::PassThrough, type_def_lifetime_params: Default::default(), - current_module: hir::CRATE_HIR_ID, - current_hir_id_owner: vec![(LocalDefId { local_def_index: CRATE_DEF_INDEX }, 0)], + current_module: CRATE_DEF_ID, + current_hir_id_owner: vec![(CRATE_DEF_ID, 0)], item_local_id_counters: Default::default(), node_id_to_hir_id: IndexVec::new(), generator_kind: None, @@ -431,31 +438,6 @@ impl<'a> TokenStreamLowering<'a> { } } -struct ImplTraitTypeIdVisitor<'a> { - ids: &'a mut SmallVec<[NodeId; 1]>, -} - -impl Visitor<'_> for ImplTraitTypeIdVisitor<'_> { - fn visit_ty(&mut self, ty: &Ty) { - match ty.kind { - TyKind::Typeof(_) | TyKind::BareFn(_) => return, - - TyKind::ImplTrait(id, _) => self.ids.push(id), - _ => {} - } - visit::walk_ty(self, ty); - } - - fn visit_path_segment(&mut self, path_span: Span, path_segment: &PathSegment) { - if let Some(ref p) = path_segment.args { - if let GenericArgs::Parenthesized(_) = **p { - return; - } - } - visit::walk_path_segment(self, path_span, path_segment) - } -} - impl<'a, 'hir> LoweringContext<'a, 'hir> { fn lower_crate(mut self, c: &Crate) -> hir::Crate<'hir> { /// Full-crate AST visitor that inserts into a fresh @@ -468,25 +450,18 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { } impl MiscCollector<'_, '_, '_> { - fn allocate_use_tree_hir_id_counters(&mut self, tree: &UseTree, owner: LocalDefId) { + fn allocate_use_tree_hir_id_counters(&mut self, tree: &UseTree) { match tree.kind { UseTreeKind::Simple(_, id1, id2) => { for &id in &[id1, id2] { - self.lctx.resolver.create_def( - owner, - id, - DefPathData::Misc, - ExpnId::root(), - tree.prefix.span, - ); self.lctx.allocate_hir_id_counter(id); } } UseTreeKind::Glob => (), UseTreeKind::Nested(ref trees) => { for &(ref use_tree, id) in trees { - let hir_id = self.lctx.allocate_hir_id_counter(id); - self.allocate_use_tree_hir_id_counters(use_tree, hir_id.owner); + self.lctx.allocate_hir_id_counter(id); + self.allocate_use_tree_hir_id_counters(use_tree); } } } @@ -495,7 +470,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { impl<'tcx> Visitor<'tcx> for MiscCollector<'tcx, '_, '_> { fn visit_item(&mut self, item: &'tcx Item) { - let hir_id = self.lctx.allocate_hir_id_counter(item.id); + self.lctx.allocate_hir_id_counter(item.id); match item.kind { ItemKind::Struct(_, ref generics) @@ -514,7 +489,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { self.lctx.type_def_lifetime_params.insert(def_id.to_def_id(), count); } ItemKind::Use(ref use_tree) => { - self.allocate_use_tree_hir_id_counters(use_tree, hir_id.owner); + self.allocate_use_tree_hir_id_counters(use_tree); } _ => {} } @@ -560,8 +535,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { visit::walk_crate(&mut MiscCollector { lctx: &mut self }, c); visit::walk_crate(&mut item::ItemLowerer { lctx: &mut self }, c); - let module = self.lower_mod(&c.module); - let attrs = self.lower_attrs(&c.attrs); + let module = self.lower_mod(&c.items, c.span); + self.lower_attrs(hir::CRATE_HIR_ID, &c.attrs); let body_ids = body_ids(&self.bodies); let proc_macros = c.proc_macros.iter().map(|id| self.node_id_to_hir_id[*id].unwrap()).collect(); @@ -588,8 +563,16 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { self.resolver.definitions().init_def_id_to_hir_id_mapping(def_id_to_hir_id); + #[cfg(debug_assertions)] + for (&id, attrs) in self.attrs.iter() { + // Verify that we do not store empty slices in the map. + if attrs.is_empty() { + panic!("Stored empty attributes for {:?}", id); + } + } + hir::Crate { - item: hir::CrateItem { module, attrs, span: c.span }, + item: hir::CrateItem { module, span: c.span }, exported_macros: self.arena.alloc_from_iter(self.exported_macros), non_exported_macro_attrs: self.arena.alloc_from_iter(self.non_exported_macro_attrs), items: self.items, @@ -602,15 +585,15 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { modules: self.modules, proc_macros, trait_map, + attrs: self.attrs, } } - fn insert_item(&mut self, item: hir::Item<'hir>) { - let id = item.hir_id; - // FIXME: Use `debug_asset-rt`. - assert_eq!(id.local_id, hir::ItemLocalId::from_u32(0)); + fn insert_item(&mut self, item: hir::Item<'hir>) -> hir::ItemId { + let id = hir::ItemId { def_id: item.def_id }; self.items.insert(id, item); - self.modules.get_mut(&self.current_module).unwrap().items.insert(id); + self.modules.entry(self.current_module).or_default().items.insert(id); + id } fn allocate_hir_id_counter(&mut self, owner: NodeId) -> hir::HirId { @@ -831,7 +814,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { hir::GenericParam { hir_id: self.lower_node_id(node_id), name: hir_name, - attrs: &[], bounds: &[], span, pure_wrt_drop: false, @@ -925,8 +907,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { // `lifetimes_to_define`. If we swapped the order of these two, // in-band-lifetimes introduced by generics or where-clauses // wouldn't have been added yet. - let generics = - this.lower_generics_mut(generics, ImplTraitContext::Universal(&mut params)); + let generics = this.lower_generics_mut( + generics, + ImplTraitContext::Universal( + &mut params, + this.current_hir_id_owner.last().unwrap().0, + ), + ); let res = f(this, &mut params); (params, (generics, res)) }) @@ -964,11 +951,18 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { ret } - fn lower_attrs(&mut self, attrs: &[Attribute]) -> &'hir [Attribute] { - self.arena.alloc_from_iter(attrs.iter().map(|a| self.lower_attr(a))) + fn lower_attrs(&mut self, id: hir::HirId, attrs: &[Attribute]) -> Option<&'hir [Attribute]> { + if attrs.is_empty() { + None + } else { + let ret = self.arena.alloc_from_iter(attrs.iter().map(|a| self.lower_attr(a))); + debug_assert!(!ret.is_empty()); + self.attrs.insert(id, ret); + Some(ret) + } } - fn lower_attr(&mut self, attr: &Attribute) -> Attribute { + fn lower_attr(&self, attr: &Attribute) -> Attribute { // Note that we explicitly do not walk the path. Since we don't really // lower attributes (we use the AST version) there is nowhere to keep // the `HirId`s. We don't actually need HIR version of attributes anyway. @@ -988,7 +982,14 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { Attribute { kind, id: attr.id, style: attr.style, span: attr.span } } - fn lower_mac_args(&mut self, args: &MacArgs) -> MacArgs { + fn alias_attrs(&mut self, id: hir::HirId, target_id: hir::HirId) { + if let Some(&a) = self.attrs.get(&target_id) { + debug_assert!(!a.is_empty()); + self.attrs.insert(id, a); + } + } + + fn lower_mac_args(&self, args: &MacArgs) -> MacArgs { match *args { MacArgs::Empty => MacArgs::Empty, MacArgs::Delimited(dspan, delim, ref tokens) => { @@ -1117,6 +1118,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { } AssocTyConstraintKind::Bound { ref bounds } => { let mut capturable_lifetimes; + let mut parent_def_id = self.current_hir_id_owner.last().unwrap().0; // Piggy-back on the `impl Trait` context to figure out the correct behavior. let (desugar_to_impl_trait, itctx) = match itctx { // We are in the return position: @@ -1136,7 +1138,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { // so desugar to // // fn foo(x: dyn Iterator) - ImplTraitContext::Universal(..) if self.is_in_dyn_type => (true, itctx), + ImplTraitContext::Universal(_, parent) if self.is_in_dyn_type => { + parent_def_id = parent; + (true, itctx) + } // In `type Foo = dyn Iterator` we desugar to // `type Foo = dyn Iterator` but we have to override the @@ -1170,7 +1175,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { // constructing the HIR for `impl bounds...` and then lowering that. let impl_trait_node_id = self.resolver.next_node_id(); - let parent_def_id = self.current_hir_id_owner.last().unwrap().0; self.resolver.create_def( parent_def_id, impl_trait_node_id, @@ -1392,7 +1396,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { if kind != TraitObjectSyntax::Dyn { self.maybe_lint_bare_trait(t.span, t.id, false); } - hir::TyKind::TraitObject(bounds, lifetime_bound) + hir::TyKind::TraitObject(bounds, lifetime_bound, kind) } TyKind::ImplTrait(def_node_id, ref bounds) => { let span = t.span; @@ -1423,7 +1427,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { |this| this.lower_param_bounds(bounds, nested_itctx), ) } - ImplTraitContext::Universal(in_band_ty_params) => { + ImplTraitContext::Universal(in_band_ty_params, parent_def_id) => { // Add a definition for the in-band `Param`. let def_id = self.resolver.local_def_id(def_node_id); @@ -1432,7 +1436,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { let hir_bounds = self.with_hir_id_owner(def_node_id, |this| { this.lower_param_bounds( bounds, - ImplTraitContext::Universal(in_band_ty_params), + ImplTraitContext::Universal(in_band_ty_params, parent_def_id), ) }); // Set the name to `impl Bound1 + Bound2`. @@ -1441,7 +1445,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { hir_id: self.lower_node_id(def_node_id), name: ParamName::Plain(ident), pure_wrt_drop: false, - attrs: &[], bounds: hir_bounds, span, kind: hir::GenericParamKind::Type { @@ -1547,11 +1550,10 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { }; trace!("lower_opaque_impl_trait: {:#?}", opaque_ty_def_id); - let opaque_ty_id = - lctx.generate_opaque_type(opaque_ty_node_id, opaque_ty_item, span, opaque_ty_span); + lctx.generate_opaque_type(opaque_ty_def_id, opaque_ty_item, span, opaque_ty_span); // `impl Trait` now just becomes `Foo<'a, 'b, ..>`. - hir::TyKind::OpaqueDef(hir::ItemId { id: opaque_ty_id }, lifetimes) + hir::TyKind::OpaqueDef(hir::ItemId { def_id: opaque_ty_def_id }, lifetimes) }) } @@ -1559,19 +1561,17 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { /// returns the lowered node-ID for the opaque type. fn generate_opaque_type( &mut self, - opaque_ty_node_id: NodeId, + opaque_ty_id: LocalDefId, opaque_ty_item: hir::OpaqueTy<'hir>, span: Span, opaque_ty_span: Span, - ) -> hir::HirId { + ) { let opaque_ty_item_kind = hir::ItemKind::OpaqueTy(opaque_ty_item); - let opaque_ty_id = self.lower_node_id(opaque_ty_node_id); // Generate an `type Foo = impl Trait;` declaration. trace!("registering opaque type with id {:#?}", opaque_ty_id); let opaque_ty_item = hir::Item { - hir_id: opaque_ty_id, + def_id: opaque_ty_id, ident: Ident::invalid(), - attrs: Default::default(), kind: opaque_ty_item_kind, vis: respan(span.shrink_to_lo(), hir::VisibilityKind::Inherited), span: opaque_ty_span, @@ -1581,7 +1581,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { // automatically for all AST items. But this opaque type item // does not actually exist in the AST. self.insert_item(opaque_ty_item); - opaque_ty_id } fn lifetimes_from_impl_trait_bounds( @@ -1733,7 +1732,6 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { name, span: lifetime.span, pure_wrt_drop: false, - attrs: &[], bounds: &[], kind: hir::GenericParamKind::Lifetime { kind }, }); @@ -1766,14 +1764,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { ) } - fn lower_local(&mut self, l: &Local) -> (hir::Local<'hir>, SmallVec<[NodeId; 1]>) { - let mut ids = SmallVec::<[NodeId; 1]>::new(); - if self.sess.features_untracked().impl_trait_in_bindings { - if let Some(ref ty) = l.ty { - let mut visitor = ImplTraitTypeIdVisitor { ids: &mut ids }; - visitor.visit_ty(ty); - } - } + fn lower_local(&mut self, l: &Local) -> hir::Local<'hir> { let ty = l.ty.as_ref().map(|t| { let mut capturable_lifetimes; self.lower_ty( @@ -1790,18 +1781,16 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { ) }); let init = l.init.as_ref().map(|e| self.lower_expr(e)); - ( - hir::Local { - hir_id: self.lower_node_id(l.id), - ty, - pat: self.lower_pat(&l.pat), - init, - span: l.span, - attrs: l.attrs.iter().map(|a| self.lower_attr(a)).collect::>().into(), - source: hir::LocalSource::Normal, - }, - ids, - ) + let hir_id = self.lower_node_id(l.id); + self.lower_attrs(hir_id, &l.attrs); + hir::Local { + hir_id, + ty, + pat: self.lower_pat(&l.pat), + init, + span: l.span, + source: hir::LocalSource::Normal, + } } fn lower_fn_params_to_names(&mut self, decl: &FnDecl) -> &'hir [Ident] { @@ -1868,7 +1857,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { } this.arena.alloc_from_iter(inputs.iter().map(|param| { if let Some((_, ibty)) = &mut in_band_ty_params { - this.lower_ty_direct(¶m.ty, ImplTraitContext::Universal(ibty)) + this.lower_ty_direct( + ¶m.ty, + ImplTraitContext::Universal( + ibty, + this.current_hir_id_owner.last().unwrap().0, + ), + ) } else { this.lower_ty_direct(¶m.ty, ImplTraitContext::disallowed()) } @@ -2010,7 +2005,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { // grow. let input_lifetimes_count = self.in_scope_lifetimes.len() + self.lifetimes_to_define.len(); - let (opaque_ty_id, lifetime_params) = self.with_hir_id_owner(opaque_ty_node_id, |this| { + let lifetime_params = self.with_hir_id_owner(opaque_ty_node_id, |this| { // We have to be careful to get elision right here. The // idea is that we create a lifetime parameter for each // lifetime in the return type. So, given a return type @@ -2061,10 +2056,9 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { }; trace!("exist ty from async fn def id: {:#?}", opaque_ty_def_id); - let opaque_ty_id = - this.generate_opaque_type(opaque_ty_node_id, opaque_ty_item, span, opaque_ty_span); + this.generate_opaque_type(opaque_ty_def_id, opaque_ty_item, span, opaque_ty_span); - (opaque_ty_id, lifetime_params) + lifetime_params }); // As documented above on the variable @@ -2107,12 +2101,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { // Foo = impl Trait` is, internally, created as a child of the // async fn, so the *type parameters* are inherited. It's // only the lifetime parameters that we must supply. - let opaque_ty_ref = hir::TyKind::OpaqueDef(hir::ItemId { id: opaque_ty_id }, generic_args); + let opaque_ty_ref = + hir::TyKind::OpaqueDef(hir::ItemId { def_id: opaque_ty_def_id }, generic_args); let opaque_ty = self.ty(opaque_ty_span, opaque_ty_ref); hir::FnRetTy::Return(self.arena.alloc(opaque_ty)) } - /// Transforms `-> T` into `Future` + /// Transforms `-> T` into `Future`. fn lower_async_fn_output_type_to_future_bound( &mut self, output: &FnRetTy, @@ -2300,12 +2295,13 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { } }; + let hir_id = self.lower_node_id(param.id); + self.lower_attrs(hir_id, ¶m.attrs); hir::GenericParam { - hir_id: self.lower_node_id(param.id), + hir_id, name, span: param.ident.span, pure_wrt_drop: self.sess.contains_name(¶m.attrs, sym::may_dangle), - attrs: self.lower_attrs(¶m.attrs), bounds: self.arena.alloc_from_iter(bounds), kind, } @@ -2385,26 +2381,12 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { } fn lower_block_noalloc(&mut self, b: &Block, targeted_by_break: bool) -> hir::Block<'hir> { - let mut expr: Option<&'hir _> = None; - - let stmts = self.arena.alloc_from_iter( - b.stmts - .iter() - .enumerate() - .filter_map(|(index, stmt)| { - if index == b.stmts.len() - 1 { - if let StmtKind::Expr(ref e) = stmt.kind { - expr = Some(self.lower_expr(e)); - None - } else { - Some(self.lower_stmt(stmt)) - } - } else { - Some(self.lower_stmt(stmt)) - } - }) - .flatten(), - ); + let (stmts, expr) = match &*b.stmts { + [stmts @ .., Stmt { kind: StmtKind::Expr(e), .. }] => (stmts, Some(&*e)), + stmts => (stmts, None), + }; + let stmts = self.arena.alloc_from_iter(stmts.iter().flat_map(|stmt| self.lower_stmt(stmt))); + let expr = expr.map(|e| self.lower_expr(e)); let rules = self.lower_block_check_mode(&b.rules); let hir_id = self.lower_node_id(b.id); @@ -2426,24 +2408,16 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { } fn lower_stmt(&mut self, s: &Stmt) -> SmallVec<[hir::Stmt<'hir>; 1]> { - let kind = match s.kind { + let (hir_id, kind) = match s.kind { StmtKind::Local(ref l) => { - let (l, item_ids) = self.lower_local(l); - let mut ids: SmallVec<[hir::Stmt<'hir>; 1]> = item_ids - .into_iter() - .map(|item_id| { - let item_id = hir::ItemId { id: self.lower_node_id(item_id) }; - self.stmt(s.span, hir::StmtKind::Item(item_id)) - }) - .collect(); - ids.push({ - hir::Stmt { - hir_id: self.lower_node_id(s.id), - kind: hir::StmtKind::Local(self.arena.alloc(l)), - span: s.span, - } - }); - return ids; + let l = self.lower_local(l); + let hir_id = self.lower_node_id(s.id); + self.alias_attrs(hir_id, l.hir_id); + return smallvec![hir::Stmt { + hir_id, + kind: hir::StmtKind::Local(self.arena.alloc(l)), + span: s.span, + }]; } StmtKind::Item(ref it) => { // Can only use the ID once. @@ -2461,12 +2435,22 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { }) .collect(); } - StmtKind::Expr(ref e) => hir::StmtKind::Expr(self.lower_expr(e)), - StmtKind::Semi(ref e) => hir::StmtKind::Semi(self.lower_expr(e)), + StmtKind::Expr(ref e) => { + let e = self.lower_expr(e); + let hir_id = self.lower_node_id(s.id); + self.alias_attrs(hir_id, e.hir_id); + (hir_id, hir::StmtKind::Expr(e)) + } + StmtKind::Semi(ref e) => { + let e = self.lower_expr(e); + let hir_id = self.lower_node_id(s.id); + self.alias_attrs(hir_id, e.hir_id); + (hir_id, hir::StmtKind::Semi(e)) + } StmtKind::Empty => return smallvec![], StmtKind::MacCall(..) => panic!("shouldn't exist here"), }; - smallvec![hir::Stmt { hir_id: self.lower_node_id(s.id), kind, span: s.span }] + smallvec![hir::Stmt { hir_id, kind, span: s.span }] } fn lower_block_check_mode(&mut self, b: &BlockCheckMode) -> hir::BlockCheckMode { @@ -2510,13 +2494,18 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { fn stmt_let_pat( &mut self, - attrs: AttrVec, + attrs: Option<&'hir [Attribute]>, span: Span, init: Option<&'hir hir::Expr<'hir>>, pat: &'hir hir::Pat<'hir>, source: hir::LocalSource, ) -> hir::Stmt<'hir> { - let local = hir::Local { attrs, hir_id: self.next_id(), init, pat, source, span, ty: None }; + let hir_id = self.next_id(); + if let Some(a) = attrs { + debug_assert!(!a.is_empty()); + self.attrs.insert(hir_id, a); + } + let local = hir::Local { hir_id, init, pat, source, span, ty: None }; self.stmt(span, hir::StmtKind::Local(self.arena.alloc(local))) } @@ -2570,8 +2559,8 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { &mut self, span: Span, pat: &'hir hir::Pat<'hir>, - ) -> &'hir [hir::FieldPat<'hir>] { - let field = hir::FieldPat { + ) -> &'hir [hir::PatField<'hir>] { + let field = hir::PatField { hir_id: self.next_id(), ident: Ident::new(sym::integer(0), span), is_shorthand: false, @@ -2585,7 +2574,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { &mut self, span: Span, lang_item: hir::LangItem, - fields: &'hir [hir::FieldPat<'hir>], + fields: &'hir [hir::PatField<'hir>], ) -> &'hir hir::Pat<'hir> { let qpath = hir::QPath::LangItem(lang_item, span); self.pat(span, hir::PatKind::Struct(qpath, fields, false)) @@ -2659,6 +2648,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { hir::TyKind::TraitObject( arena_vec![self; principal], self.elided_dyn_bound(span), + TraitObjectSyntax::None, ) } _ => hir::TyKind::Path(hir::QPath::Resolved(None, path)), diff --git a/compiler/rustc_ast_lowering/src/pat.rs b/compiler/rustc_ast_lowering/src/pat.rs index e4e7b24d29..2451409aac 100644 --- a/compiler/rustc_ast_lowering/src/pat.rs +++ b/compiler/rustc_ast_lowering/src/pat.rs @@ -56,7 +56,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { ImplTraitContext::disallowed(), ); - let fs = self.arena.alloc_from_iter(fields.iter().map(|f| hir::FieldPat { + let fs = self.arena.alloc_from_iter(fields.iter().map(|f| hir::PatField { hir_id: self.next_id(), ident: f.ident, pat: self.lower_pat(&f.pat), diff --git a/compiler/rustc_ast_lowering/src/path.rs b/compiler/rustc_ast_lowering/src/path.rs index cb4d5ea6ee..46dac2f1af 100644 --- a/compiler/rustc_ast_lowering/src/path.rs +++ b/compiler/rustc_ast_lowering/src/path.rs @@ -30,6 +30,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { let partial_res = self.resolver.get_partial_res(id).unwrap_or_else(|| PartialRes::new(Res::Err)); + let path_span_lo = p.span.shrink_to_lo(); let proj_start = p.segments.len() - partial_res.unresolved_segments(); let path = self.arena.alloc(hir::Path { res: self.lower_res(partial_res.base_res()), @@ -108,7 +109,9 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { ) }, )), - span: p.span, + span: p.segments[..proj_start] + .last() + .map_or(path_span_lo, |segment| path_span_lo.to(segment.span())), }); // Simple case, either no projections, or only fully-qualified. @@ -127,7 +130,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { // e.g., `Vec` in `Vec::new` or `::Item` in // `::Item::default`. let new_id = self.next_id(); - self.arena.alloc(self.ty_path(new_id, p.span, hir::QPath::Resolved(qself, path))) + self.arena.alloc(self.ty_path(new_id, path.span, hir::QPath::Resolved(qself, path))) }; // Anything after the base path are associated "extensions", @@ -141,7 +144,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { // 3. `<>::IntoIter>::Item` // * final path is `<<>::IntoIter>::Item>::clone` for (i, segment) in p.segments.iter().enumerate().skip(proj_start) { - let segment = self.arena.alloc(self.lower_path_segment( + let hir_segment = self.arena.alloc(self.lower_path_segment( p.span, segment, param_mode, @@ -150,7 +153,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { itctx.reborrow(), None, )); - let qpath = hir::QPath::TypeRelative(ty, segment); + let qpath = hir::QPath::TypeRelative(ty, hir_segment); // It's finished, return the extension of the right node type. if i == p.segments.len() - 1 { @@ -159,7 +162,7 @@ impl<'a, 'hir> LoweringContext<'a, 'hir> { // Wrap the associated extension in another type node. let new_id = self.next_id(); - ty = self.arena.alloc(self.ty_path(new_id, p.span, qpath)); + ty = self.arena.alloc(self.ty_path(new_id, path_span_lo.to(segment.span()), qpath)); } // We should've returned in the for loop above. diff --git a/compiler/rustc_ast_passes/src/ast_validation.rs b/compiler/rustc_ast_passes/src/ast_validation.rs index 8defd91c68..563bcda519 100644 --- a/compiler/rustc_ast_passes/src/ast_validation.rs +++ b/compiler/rustc_ast_passes/src/ast_validation.rs @@ -1054,12 +1054,14 @@ impl<'a> Visitor<'a> for AstValidator<'a> { walk_list!(self, visit_attribute, &item.attrs); return; } - ItemKind::Mod(Mod { inline, unsafety, .. }) => { + ItemKind::Mod(unsafety, ref mod_kind) => { if let Unsafe::Yes(span) = unsafety { self.err_handler().span_err(span, "module cannot be declared unsafe"); } // Ensure that `path` attributes on modules are recorded as used (cf. issue #35584). - if !inline && !self.session.contains_name(&item.attrs, sym::path) { + if !matches!(mod_kind, ModKind::Loaded(_, Inline::Yes, _)) + && !self.session.contains_name(&item.attrs, sym::path) + { self.check_mod_file_item_asciionly(item.ident); } } diff --git a/compiler/rustc_ast_passes/src/feature_gate.rs b/compiler/rustc_ast_passes/src/feature_gate.rs index 6514de2b81..0ca9c12f4c 100644 --- a/compiler/rustc_ast_passes/src/feature_gate.rs +++ b/compiler/rustc_ast_passes/src/feature_gate.rs @@ -164,6 +164,38 @@ impl<'a> PostExpansionVisitor<'a> { "C-cmse-nonsecure-call ABI is experimental and subject to change" ); } + "C-unwind" => { + gate_feature_post!( + &self, + c_unwind, + span, + "C-unwind ABI is experimental and subject to change" + ); + } + "stdcall-unwind" => { + gate_feature_post!( + &self, + c_unwind, + span, + "stdcall-unwind ABI is experimental and subject to change" + ); + } + "system-unwind" => { + gate_feature_post!( + &self, + c_unwind, + span, + "system-unwind ABI is experimental and subject to change" + ); + } + "thiscall-unwind" => { + gate_feature_post!( + &self, + c_unwind, + span, + "thiscall-unwind ABI is experimental and subject to change" + ); + } abi => self .sess .parse_sess @@ -247,7 +279,7 @@ impl<'a> PostExpansionVisitor<'a> { if let ast::TyKind::ImplTrait(..) = ty.kind { gate_feature_post!( &self.vis, - type_alias_impl_trait, + min_type_alias_impl_trait, ty.span, "`impl Trait` in type aliases is unstable" ); @@ -638,8 +670,16 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session) { } }; } - gate_all!(if_let_guard, "`if let` guards are experimental"); - gate_all!(let_chains, "`let` expressions in this position are experimental"); + gate_all!( + if_let_guard, + "`if let` guards are experimental", + "you can write `if matches!(, )` instead of `if let = `" + ); + gate_all!( + let_chains, + "`let` expressions in this position are experimental", + "you can write `matches!(, )` instead of `let = `" + ); gate_all!( async_closure, "async closures are unstable", @@ -665,6 +705,7 @@ pub fn check_crate(krate: &ast::Crate, sess: &Session) { // involved, so we only emit errors where there are no other parsing errors. gate_all!(destructuring_assignment, "destructuring assignments are unstable"); } + gate_all!(pub_macro_rules, "`pub` on `macro_rules` items is unstable"); // All uses of `gate_all!` below this point were added in #65742, // and subsequently disabled (with the non-early gating readded). diff --git a/compiler/rustc_ast_passes/src/node_count.rs b/compiler/rustc_ast_passes/src/node_count.rs index 2971fa435c..3980e6da68 100644 --- a/compiler/rustc_ast_passes/src/node_count.rs +++ b/compiler/rustc_ast_passes/src/node_count.rs @@ -20,10 +20,6 @@ impl<'ast> Visitor<'ast> for NodeCounter { self.count += 1; walk_ident(self, ident); } - fn visit_mod(&mut self, m: &Mod, _s: Span, _a: &[Attribute], _n: NodeId) { - self.count += 1; - walk_mod(self, m) - } fn visit_foreign_item(&mut self, i: &ForeignItem) { self.count += 1; walk_foreign_item(self, i) @@ -92,9 +88,9 @@ impl<'ast> Visitor<'ast> for NodeCounter { self.count += 1; walk_struct_def(self, s) } - fn visit_struct_field(&mut self, s: &StructField) { + fn visit_field_def(&mut self, s: &FieldDef) { self.count += 1; - walk_struct_field(self, s) + walk_field_def(self, s) } fn visit_enum_def( &mut self, diff --git a/compiler/rustc_ast_pretty/src/pprust/state.rs b/compiler/rustc_ast_pretty/src/pprust/state.rs index 7f4775bf41..cb6f567c55 100644 --- a/compiler/rustc_ast_pretty/src/pprust/state.rs +++ b/compiler/rustc_ast_pretty/src/pprust/state.rs @@ -9,7 +9,7 @@ use rustc_ast::util::classify; use rustc_ast::util::comments::{gather_comments, Comment, CommentStyle}; use rustc_ast::util::parser::{self, AssocOp, Fixity}; use rustc_ast::{self as ast, BlockCheckMode, PatKind, RangeEnd, RangeSyntax}; -use rustc_ast::{GenericArg, MacArgs}; +use rustc_ast::{GenericArg, MacArgs, ModKind}; use rustc_ast::{GenericBound, SelfKind, TraitBoundModifier}; use rustc_ast::{InlineAsmOperand, InlineAsmRegOrRegClass}; use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece}; @@ -87,7 +87,6 @@ pub struct State<'a> { pub s: pp::Printer, comments: Option>, ann: &'a (dyn PpAnn + 'a), - is_expanded: bool, } crate const INDENT_UNIT: usize = 4; @@ -103,12 +102,8 @@ pub fn print_crate<'a>( is_expanded: bool, edition: Edition, ) -> String { - let mut s = State { - s: pp::mk_printer(), - comments: Some(Comments::new(sm, filename, input)), - ann, - is_expanded, - }; + let mut s = + State { s: pp::mk_printer(), comments: Some(Comments::new(sm, filename, input)), ann }; if is_expanded && !krate.attrs.iter().any(|attr| attr.has_name(sym::no_core)) { // We need to print `#![no_std]` (and its feature gate) so that @@ -132,7 +127,10 @@ pub fn print_crate<'a>( } } - s.print_mod(&krate.module, &krate.attrs); + s.print_inner_attributes(&krate.attrs); + for item in &krate.items { + s.print_item(item); + } s.print_remaining_comments(); s.ann.post(&mut s, AnnNode::Crate(krate)); s.s.eof() @@ -853,7 +851,7 @@ impl<'a> PrintState<'a> for State<'a> { impl<'a> State<'a> { pub fn new() -> State<'a> { - State { s: pp::mk_printer(), comments: None, ann: &NoAnn, is_expanded: false } + State { s: pp::mk_printer(), comments: None, ann: &NoAnn } } // Synthesizes a comment that was not textually present in the original source @@ -891,13 +889,6 @@ impl<'a> State<'a> { 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]) { - 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]) { self.print_inner_attributes(attrs); for item in &nmod.items { @@ -914,6 +905,7 @@ impl<'a> State<'a> { pub fn print_assoc_constraint(&mut self, constraint: &ast::AssocTyConstraint) { self.print_ident(constraint.ident); + constraint.gen_args.as_ref().map(|args| self.print_generic_args(args, false)); self.s.space(); match &constraint.kind { ast::AssocTyConstraintKind::Equality { ty } => { @@ -1138,23 +1130,29 @@ impl<'a> State<'a> { let body = body.as_deref(); self.print_fn_full(sig, item.ident, gen, &item.vis, def, body, &item.attrs); } - ast::ItemKind::Mod(ref _mod) => { + ast::ItemKind::Mod(unsafety, ref mod_kind) => { self.head(self.to_string(|s| { s.print_visibility(&item.vis); - s.print_unsafety(_mod.unsafety); + s.print_unsafety(unsafety); s.word("mod"); })); self.print_ident(item.ident); - if _mod.inline || self.is_expanded { - self.nbsp(); - self.bopen(); - self.print_mod(_mod, &item.attrs); - self.bclose(item.span); - } else { - self.s.word(";"); - self.end(); // end inner head-block - self.end(); // end outer head-block + match mod_kind { + ModKind::Loaded(items, ..) => { + self.nbsp(); + self.bopen(); + self.print_inner_attributes(&item.attrs); + for item in items { + self.print_item(item); + } + self.bclose(item.span); + } + ModKind::Unloaded => { + self.s.word(";"); + self.end(); // end inner head-block + self.end(); // end outer head-block + } } } ast::ItemKind::ForeignMod(ref nmod) => { @@ -1311,6 +1309,9 @@ impl<'a> State<'a> { true, item.span, ); + if macro_def.body.need_semicolon() { + self.word(";"); + } } } self.ann.post(self, AnnNode::Item(item)) @@ -1678,7 +1679,7 @@ impl<'a> State<'a> { self.ibox(INDENT_UNIT); self.s.word("["); self.print_inner_attributes_inline(attrs); - self.commasep_exprs(Inconsistent, &exprs[..]); + self.commasep_exprs(Inconsistent, exprs); self.s.word("]"); self.end(); } @@ -1710,7 +1711,7 @@ impl<'a> State<'a> { fn print_expr_struct( &mut self, path: &ast::Path, - fields: &[ast::Field], + fields: &[ast::ExprField], rest: &ast::StructRest, attrs: &[ast::Attribute], ) { @@ -1719,7 +1720,7 @@ impl<'a> State<'a> { self.print_inner_attributes_inline(attrs); self.commasep_cmnt( Consistent, - &fields[..], + fields, |s, field| { s.print_outer_attributes(&field.attrs); s.ibox(INDENT_UNIT); @@ -1754,7 +1755,7 @@ impl<'a> State<'a> { fn print_expr_tup(&mut self, exprs: &[P], attrs: &[ast::Attribute]) { self.popen(); self.print_inner_attributes_inline(attrs); - self.commasep_exprs(Inconsistent, &exprs[..]); + self.commasep_exprs(Inconsistent, exprs); if exprs.len() == 1 { self.s.word(","); } @@ -1872,8 +1873,8 @@ impl<'a> State<'a> { ast::ExprKind::Repeat(ref element, ref count) => { self.print_expr_repeat(element, count, attrs); } - ast::ExprKind::Struct(ref path, ref fields, ref rest) => { - self.print_expr_struct(path, &fields[..], rest, attrs); + ast::ExprKind::Struct(ref se) => { + self.print_expr_struct(&se.path, &se.fields, &se.rest, attrs); } ast::ExprKind::Tup(ref exprs) => { self.print_expr_tup(&exprs[..], attrs); diff --git a/compiler/rustc_attr/src/builtin.rs b/compiler/rustc_attr/src/builtin.rs index aca3fbbca1..e58b266fdb 100644 --- a/compiler/rustc_attr/src/builtin.rs +++ b/compiler/rustc_attr/src/builtin.rs @@ -176,7 +176,7 @@ pub fn find_stability( sess: &Session, attrs: &[Attribute], item_sp: Span, -) -> (Option, Option) { +) -> (Option<(Stability, Span)>, Option<(ConstStability, Span)>) { find_stability_generic(sess, attrs.iter(), item_sp) } @@ -184,15 +184,16 @@ fn find_stability_generic<'a, I>( sess: &Session, attrs_iter: I, item_sp: Span, -) -> (Option, Option) +) -> (Option<(Stability, Span)>, Option<(ConstStability, Span)>) where I: Iterator, { use StabilityLevel::*; - let mut stab: Option = None; - let mut const_stab: Option = None; + let mut stab: Option<(Stability, Span)> = None; + let mut const_stab: Option<(ConstStability, Span)> = None; let mut promotable = false; + let diagnostic = &sess.parse_sess.span_diagnostic; 'outer: for attr in attrs_iter { @@ -356,10 +357,12 @@ where } let level = Unstable { reason, issue: issue_num, is_soft }; if sym::unstable == meta_name { - stab = Some(Stability { level, feature }); + stab = Some((Stability { level, feature }, attr.span)); } else { - const_stab = - Some(ConstStability { level, feature, promotable: false }); + const_stab = Some(( + ConstStability { level, feature, promotable: false }, + attr.span, + )); } } (None, _, _) => { @@ -432,10 +435,12 @@ where (Some(feature), Some(since)) => { let level = Stable { since }; if sym::stable == meta_name { - stab = Some(Stability { level, feature }); + stab = Some((Stability { level, feature }, attr.span)); } else { - const_stab = - Some(ConstStability { level, feature, promotable: false }); + const_stab = Some(( + ConstStability { level, feature, promotable: false }, + attr.span, + )); } } (None, _) => { @@ -455,7 +460,7 @@ where // Merge the const-unstable info into the stability info if promotable { - if let Some(ref mut stab) = const_stab { + if let Some((ref mut stab, _)) = const_stab { stab.promotable = promotable; } else { struct_span_err!( @@ -1035,14 +1040,14 @@ pub fn find_transparency( pub fn allow_internal_unstable<'a>( sess: &'a Session, attrs: &'a [Attribute], -) -> Option + 'a> { +) -> impl Iterator + 'a { allow_unstable(sess, attrs, sym::allow_internal_unstable) } pub fn rustc_allow_const_fn_unstable<'a>( sess: &'a Session, attrs: &'a [Attribute], -) -> Option + 'a> { +) -> impl Iterator + 'a { allow_unstable(sess, attrs, sym::rustc_allow_const_fn_unstable) } @@ -1050,7 +1055,7 @@ fn allow_unstable<'a>( sess: &'a Session, attrs: &'a [Attribute], symbol: Symbol, -) -> Option + 'a> { +) -> impl Iterator + 'a { let attrs = sess.filter_by_name(attrs, symbol); let list = attrs .filter_map(move |attr| { @@ -1064,7 +1069,7 @@ fn allow_unstable<'a>( }) .flatten(); - Some(list.into_iter().filter_map(move |it| { + list.into_iter().filter_map(move |it| { let name = it.ident().map(|ident| ident.name); if name.is_none() { sess.diagnostic().span_err( @@ -1073,5 +1078,5 @@ fn allow_unstable<'a>( ); } name - })) + }) } diff --git a/compiler/rustc_builtin_macros/Cargo.toml b/compiler/rustc_builtin_macros/Cargo.toml index c397a85412..962dfbac93 100644 --- a/compiler/rustc_builtin_macros/Cargo.toml +++ b/compiler/rustc_builtin_macros/Cargo.toml @@ -15,10 +15,11 @@ rustc_attr = { path = "../rustc_attr" } rustc_data_structures = { path = "../rustc_data_structures" } rustc_errors = { path = "../rustc_errors" } rustc_feature = { path = "../rustc_feature" } +rustc_lexer = { path = "../rustc_lexer" } rustc_parse = { path = "../rustc_parse" } rustc_target = { path = "../rustc_target" } rustc_session = { path = "../rustc_session" } -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } rustc_ast = { path = "../rustc_ast" } rustc_expand = { path = "../rustc_expand" } rustc_span = { path = "../rustc_span" } diff --git a/compiler/rustc_builtin_macros/src/asm.rs b/compiler/rustc_builtin_macros/src/asm.rs index 36cd6c281b..8d8b3f4f6a 100644 --- a/compiler/rustc_builtin_macros/src/asm.rs +++ b/compiler/rustc_builtin_macros/src/asm.rs @@ -7,7 +7,10 @@ use rustc_errors::{Applicability, DiagnosticBuilder}; use rustc_expand::base::{self, *}; use rustc_parse::parser::Parser; use rustc_parse_format as parse; -use rustc_span::symbol::{kw, sym, Symbol}; +use rustc_span::{ + symbol::{kw, sym, Symbol}, + BytePos, +}; use rustc_span::{InnerSpan, Span}; struct AsmArgs { @@ -399,6 +402,8 @@ fn expand_preparsed_asm(ecx: &mut ExtCtxt<'_>, sp: Span, args: AsmArgs) -> P, sp: Span, args: AsmArgs) -> P { + if let Some(span) = check_syntax_directive(snippet, ".intel_syntax") { + let span = template_span.from_inner(span); + let mut err = ecx.struct_span_err(span, "intel syntax is the default syntax on this target, and trying to use this directive may cause issues"); + err.span_suggestion( + span, + "remove this assembler directive", + "".to_string(), + Applicability::MachineApplicable, + ); + err.emit(); + } + + if let Some(span) = check_syntax_directive(snippet, ".att_syntax") { + let span = template_span.from_inner(span); + let mut err = ecx.struct_span_err(span, "using the .att_syntax directive may cause issues, use the att_syntax option instead"); + let asm_end = sp.hi() - BytePos(2); + let suggestions = vec![ + (span, "".to_string()), + ( + Span::new(asm_end, asm_end, sp.ctxt()), + ", options(att_syntax)".to_string(), + ), + ]; + err.multipart_suggestion( + "remove the assembler directive and replace it with options(att_syntax)", + suggestions, + Applicability::MachineApplicable, + ); + err.emit(); + } + } + ast::LlvmAsmDialect::Att => { + if let Some(span) = check_syntax_directive(snippet, ".att_syntax") { + let span = template_span.from_inner(span); + let mut err = ecx.struct_span_err(span, "att syntax is the default syntax on this target, and trying to use this directive may cause issues"); + err.span_suggestion( + span, + "remove this assembler directive", + "".to_string(), + Applicability::MachineApplicable, + ); + err.emit(); + } + + // Use of .intel_syntax is ignored + } + } + } + let mut parser = parse::Parser::new( template_str, str_style, @@ -631,3 +690,15 @@ pub fn expand_asm<'cx>( } } } + +fn check_syntax_directive>(piece: S, syntax: &str) -> Option { + let piece = piece.as_ref(); + if let Some(idx) = piece.find(syntax) { + let end = + idx + &piece[idx..].find(|c| matches!(c, '\n' | ';')).unwrap_or(piece[idx..].len()); + // Offset by one because these represent the span with the " removed + Some(InnerSpan::new(idx + 1, end + 1)) + } else { + None + } +} diff --git a/compiler/rustc_builtin_macros/src/cfg_eval.rs b/compiler/rustc_builtin_macros/src/cfg_eval.rs new file mode 100644 index 0000000000..025872df01 --- /dev/null +++ b/compiler/rustc_builtin_macros/src/cfg_eval.rs @@ -0,0 +1,157 @@ +use crate::util::check_builtin_macro_attribute; + +use rustc_ast::mut_visit::{self, MutVisitor}; +use rustc_ast::ptr::P; +use rustc_ast::{self as ast, AstLike}; +use rustc_expand::base::{Annotatable, ExtCtxt}; +use rustc_expand::config::StripUnconfigured; +use rustc_expand::configure; +use rustc_span::symbol::sym; +use rustc_span::Span; +use smallvec::SmallVec; + +crate fn expand( + ecx: &mut ExtCtxt<'_>, + _span: Span, + meta_item: &ast::MetaItem, + annotatable: Annotatable, +) -> Vec { + check_builtin_macro_attribute(ecx, meta_item, sym::cfg_eval); + cfg_eval(ecx, annotatable) +} + +crate fn cfg_eval(ecx: &ExtCtxt<'_>, annotatable: Annotatable) -> Vec { + let mut visitor = CfgEval { + cfg: StripUnconfigured { sess: ecx.sess, features: ecx.ecfg.features, modified: false }, + }; + let mut annotatable = visitor.configure_annotatable(annotatable); + if visitor.cfg.modified { + // Erase the tokens if cfg-stripping modified the item + // This will cause us to synthesize fake tokens + // when `nt_to_tokenstream` is called on this item. + if let Some(tokens) = annotatable.tokens_mut() { + *tokens = None; + } + } + vec![annotatable] +} + +struct CfgEval<'a> { + cfg: StripUnconfigured<'a>, +} + +impl CfgEval<'_> { + fn configure(&mut self, node: T) -> Option { + self.cfg.configure(node) + } + + fn configure_annotatable(&mut self, annotatable: Annotatable) -> Annotatable { + // Since the item itself has already been configured by the InvocationCollector, + // we know that fold result vector will contain exactly one element + match annotatable { + Annotatable::Item(item) => Annotatable::Item(self.flat_map_item(item).pop().unwrap()), + Annotatable::TraitItem(item) => { + Annotatable::TraitItem(self.flat_map_trait_item(item).pop().unwrap()) + } + Annotatable::ImplItem(item) => { + Annotatable::ImplItem(self.flat_map_impl_item(item).pop().unwrap()) + } + Annotatable::ForeignItem(item) => { + Annotatable::ForeignItem(self.flat_map_foreign_item(item).pop().unwrap()) + } + Annotatable::Stmt(stmt) => { + Annotatable::Stmt(stmt.map(|stmt| self.flat_map_stmt(stmt).pop().unwrap())) + } + Annotatable::Expr(mut expr) => Annotatable::Expr({ + self.visit_expr(&mut expr); + expr + }), + Annotatable::Arm(arm) => Annotatable::Arm(self.flat_map_arm(arm).pop().unwrap()), + Annotatable::ExprField(field) => { + Annotatable::ExprField(self.flat_map_expr_field(field).pop().unwrap()) + } + Annotatable::PatField(fp) => { + Annotatable::PatField(self.flat_map_pat_field(fp).pop().unwrap()) + } + Annotatable::GenericParam(param) => { + Annotatable::GenericParam(self.flat_map_generic_param(param).pop().unwrap()) + } + Annotatable::Param(param) => { + Annotatable::Param(self.flat_map_param(param).pop().unwrap()) + } + Annotatable::FieldDef(sf) => { + Annotatable::FieldDef(self.flat_map_field_def(sf).pop().unwrap()) + } + Annotatable::Variant(v) => { + Annotatable::Variant(self.flat_map_variant(v).pop().unwrap()) + } + } + } +} + +impl MutVisitor for CfgEval<'_> { + fn visit_expr(&mut self, expr: &mut P) { + self.cfg.configure_expr(expr); + mut_visit::noop_visit_expr(expr, self); + } + + fn filter_map_expr(&mut self, expr: P) -> Option> { + let mut expr = configure!(self, expr); + mut_visit::noop_visit_expr(&mut expr, self); + Some(expr) + } + + fn flat_map_generic_param( + &mut self, + param: ast::GenericParam, + ) -> SmallVec<[ast::GenericParam; 1]> { + mut_visit::noop_flat_map_generic_param(configure!(self, param), self) + } + + fn flat_map_stmt(&mut self, stmt: ast::Stmt) -> SmallVec<[ast::Stmt; 1]> { + mut_visit::noop_flat_map_stmt(configure!(self, stmt), self) + } + + fn flat_map_item(&mut self, item: P) -> SmallVec<[P; 1]> { + mut_visit::noop_flat_map_item(configure!(self, item), self) + } + + fn flat_map_impl_item(&mut self, item: P) -> SmallVec<[P; 1]> { + mut_visit::noop_flat_map_assoc_item(configure!(self, item), self) + } + + fn flat_map_trait_item(&mut self, item: P) -> SmallVec<[P; 1]> { + mut_visit::noop_flat_map_assoc_item(configure!(self, item), self) + } + + fn flat_map_foreign_item( + &mut self, + foreign_item: P, + ) -> SmallVec<[P; 1]> { + mut_visit::noop_flat_map_foreign_item(configure!(self, foreign_item), self) + } + + fn flat_map_arm(&mut self, arm: ast::Arm) -> SmallVec<[ast::Arm; 1]> { + mut_visit::noop_flat_map_arm(configure!(self, arm), self) + } + + fn flat_map_expr_field(&mut self, field: ast::ExprField) -> SmallVec<[ast::ExprField; 1]> { + mut_visit::noop_flat_map_expr_field(configure!(self, field), self) + } + + fn flat_map_pat_field(&mut self, fp: ast::PatField) -> SmallVec<[ast::PatField; 1]> { + mut_visit::noop_flat_map_pat_field(configure!(self, fp), self) + } + + fn flat_map_param(&mut self, p: ast::Param) -> SmallVec<[ast::Param; 1]> { + mut_visit::noop_flat_map_param(configure!(self, p), self) + } + + fn flat_map_field_def(&mut self, sf: ast::FieldDef) -> SmallVec<[ast::FieldDef; 1]> { + mut_visit::noop_flat_map_field_def(configure!(self, sf), self) + } + + fn flat_map_variant(&mut self, variant: ast::Variant) -> SmallVec<[ast::Variant; 1]> { + mut_visit::noop_flat_map_variant(configure!(self, variant), self) + } +} diff --git a/compiler/rustc_builtin_macros/src/derive.rs b/compiler/rustc_builtin_macros/src/derive.rs new file mode 100644 index 0000000000..0da2c1c102 --- /dev/null +++ b/compiler/rustc_builtin_macros/src/derive.rs @@ -0,0 +1,114 @@ +use crate::cfg_eval::cfg_eval; + +use rustc_ast::{self as ast, token, ItemKind, MetaItemKind, NestedMetaItem, StmtKind}; +use rustc_errors::{struct_span_err, Applicability}; +use rustc_expand::base::{Annotatable, ExpandResult, ExtCtxt, Indeterminate, MultiItemModifier}; +use rustc_feature::AttributeTemplate; +use rustc_parse::validate_attr; +use rustc_session::Session; +use rustc_span::symbol::sym; +use rustc_span::Span; + +crate struct Expander; + +impl MultiItemModifier for Expander { + fn expand( + &self, + ecx: &mut ExtCtxt<'_>, + span: Span, + meta_item: &ast::MetaItem, + item: Annotatable, + ) -> ExpandResult, Annotatable> { + let sess = ecx.sess; + if report_bad_target(sess, &item, span) { + // We don't want to pass inappropriate targets to derive macros to avoid + // follow up errors, all other errors below are recoverable. + return ExpandResult::Ready(vec![item]); + } + + let template = + AttributeTemplate { list: Some("Trait1, Trait2, ..."), ..Default::default() }; + let attr = ecx.attribute(meta_item.clone()); + validate_attr::check_builtin_attribute(&sess.parse_sess, &attr, sym::derive, template); + + let derives: Vec<_> = attr + .meta_item_list() + .unwrap_or_default() + .into_iter() + .filter_map(|nested_meta| match nested_meta { + NestedMetaItem::MetaItem(meta) => Some(meta), + NestedMetaItem::Literal(lit) => { + // Reject `#[derive("Debug")]`. + report_unexpected_literal(sess, &lit); + None + } + }) + .map(|meta| { + // Reject `#[derive(Debug = "value", Debug(abc))]`, but recover the paths. + report_path_args(sess, &meta); + meta.path + }) + .collect(); + + // FIXME: Try to cache intermediate results to avoid collecting same paths multiple times. + match ecx.resolver.resolve_derives(ecx.current_expansion.id, derives, ecx.force_mode) { + Ok(()) => ExpandResult::Ready(cfg_eval(ecx, item)), + Err(Indeterminate) => ExpandResult::Retry(item), + } + } +} + +fn report_bad_target(sess: &Session, item: &Annotatable, span: Span) -> bool { + let item_kind = match item { + Annotatable::Item(item) => Some(&item.kind), + Annotatable::Stmt(stmt) => match &stmt.kind { + StmtKind::Item(item) => Some(&item.kind), + _ => None, + }, + _ => None, + }; + + let bad_target = + !matches!(item_kind, Some(ItemKind::Struct(..) | ItemKind::Enum(..) | ItemKind::Union(..))); + if bad_target { + struct_span_err!( + sess, + span, + E0774, + "`derive` may only be applied to structs, enums and unions", + ) + .emit(); + } + bad_target +} + +fn report_unexpected_literal(sess: &Session, lit: &ast::Lit) { + let help_msg = match lit.token.kind { + token::Str if rustc_lexer::is_ident(&lit.token.symbol.as_str()) => { + format!("try using `#[derive({})]`", lit.token.symbol) + } + _ => "for example, write `#[derive(Debug)]` for `Debug`".to_string(), + }; + struct_span_err!(sess, lit.span, E0777, "expected path to a trait, found literal",) + .help(&help_msg) + .emit(); +} + +fn report_path_args(sess: &Session, meta: &ast::MetaItem) { + let report_error = |title, action| { + let span = meta.span.with_lo(meta.path.span.hi()); + sess.struct_span_err(span, title) + .span_suggestion(span, action, String::new(), Applicability::MachineApplicable) + .emit(); + }; + match meta.kind { + MetaItemKind::Word => {} + MetaItemKind::List(..) => report_error( + "traits in `#[derive(...)]` don't accept arguments", + "remove the arguments", + ), + MetaItemKind::NameValue(..) => { + report_error("traits in `#[derive(...)]` don't accept values", "remove the value") + } + } +} diff --git a/compiler/rustc_builtin_macros/src/deriving/cmp/ord.rs b/compiler/rustc_builtin_macros/src/deriving/cmp/ord.rs index c1473e2409..f84e6e0762 100644 --- a/compiler/rustc_builtin_macros/src/deriving/cmp/ord.rs +++ b/compiler/rustc_builtin_macros/src/deriving/cmp/ord.rs @@ -47,9 +47,10 @@ pub fn ordering_collapsed( span: Span, self_arg_tags: &[Ident], ) -> P { - let lft = cx.expr_ident(span, self_arg_tags[0]); + let lft = cx.expr_addr_of(span, 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, Ident::new(sym::cmp, span), vec![rgt]) + let fn_cmp_path = cx.std_path(&[sym::cmp, sym::Ord, sym::cmp]); + cx.expr_call_global(span, fn_cmp_path, vec![lft, rgt]) } pub fn cs_cmp(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>) -> P { diff --git a/compiler/rustc_builtin_macros/src/deriving/cmp/partial_ord.rs b/compiler/rustc_builtin_macros/src/deriving/cmp/partial_ord.rs index 21174ca4c8..151a919e02 100644 --- a/compiler/rustc_builtin_macros/src/deriving/cmp/partial_ord.rs +++ b/compiler/rustc_builtin_macros/src/deriving/cmp/partial_ord.rs @@ -1,13 +1,11 @@ -pub use OrderingOp::*; - use crate::deriving::generic::ty::*; use crate::deriving::generic::*; -use crate::deriving::{path_local, path_std, pathvec_std}; +use crate::deriving::{path_std, pathvec_std}; use rustc_ast::ptr::P; -use rustc_ast::{self as ast, BinOpKind, Expr, MetaItem}; +use rustc_ast::{Expr, MetaItem}; use rustc_expand::base::{Annotatable, ExtCtxt}; -use rustc_span::symbol::{sym, Ident, Symbol}; +use rustc_span::symbol::{sym, Ident}; use rustc_span::Span; pub fn expand_deriving_partial_ord( @@ -17,26 +15,6 @@ pub fn expand_deriving_partial_ord( item: &Annotatable, push: &mut dyn FnMut(Annotatable), ) { - macro_rules! md { - ($name:expr, $op:expr, $equal:expr) => {{ - let inline = cx.meta_word(span, sym::inline); - let attrs = vec![cx.attribute(inline)]; - MethodDef { - name: $name, - generics: Bounds::empty(), - explicit_self: borrowed_explicit_self(), - args: vec![(borrowed_self(), sym::other)], - ret_ty: Literal(path_local!(bool)), - attributes: attrs, - is_unsafe: false, - unify_fieldless_variants: true, - combine_substructure: combine_substructure(Box::new(|cx, span, substr| { - cs_op($op, $equal, cx, span, substr) - })), - } - }}; - } - let ordering_ty = Literal(path_std!(cmp::Ordering)); let ret_ty = Literal(Path::new_( pathvec_std!(option::Option), @@ -62,21 +40,6 @@ pub fn expand_deriving_partial_ord( })), }; - // avoid defining extra methods if we can - // c-like enums, enums without any fields and structs without fields - // can safely define only `partial_cmp`. - let methods = if is_type_without_fields(item) { - vec![partial_cmp_def] - } else { - vec![ - partial_cmp_def, - md!(sym::lt, true, false), - md!(sym::le, true, true), - md!(sym::gt, false, false), - md!(sym::ge, false, true), - ] - }; - let trait_def = TraitDef { span, attributes: vec![], @@ -85,39 +48,12 @@ pub fn expand_deriving_partial_ord( generics: Bounds::empty(), is_unsafe: false, supports_unions: false, - methods, + methods: vec![partial_cmp_def], associated_types: Vec::new(), }; trait_def.expand(cx, mitem, item, push) } -#[derive(Copy, Clone)] -pub enum OrderingOp { - PartialCmpOp, - LtOp, - LeOp, - GtOp, - GeOp, -} - -pub fn some_ordering_collapsed( - cx: &mut ExtCtxt<'_>, - span: Span, - op: OrderingOp, - self_arg_tags: &[Ident], -) -> P { - 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])); - let op_sym = match op { - PartialCmpOp => sym::partial_cmp, - LtOp => sym::lt, - LeOp => sym::le, - GtOp => sym::gt, - GeOp => sym::ge, - }; - cx.expr_method_call(span, lft, Ident::new(op_sym, span), vec![rgt]) -} - pub fn cs_partial_cmp(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_>) -> P { let test_id = Ident::new(sym::cmp, span); let ordering = cx.path_global(span, cx.std_path(&[sym::cmp, sym::Ordering, sym::Equal])); @@ -171,7 +107,11 @@ pub fn cs_partial_cmp(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_ if self_args.len() != 2 { cx.span_bug(span, "not exactly 2 arguments in `derive(PartialOrd)`") } else { - some_ordering_collapsed(cx, span, PartialCmpOp, tag_tuple) + let lft = cx.expr_addr_of(span, cx.expr_ident(span, tag_tuple[0])); + let rgt = cx.expr_addr_of(span, cx.expr_ident(span, tag_tuple[1])); + let fn_partial_cmp_path = + cx.std_path(&[sym::cmp, sym::PartialOrd, sym::partial_cmp]); + cx.expr_call_global(span, fn_partial_cmp_path, vec![lft, rgt]) } }), cx, @@ -179,124 +119,3 @@ pub fn cs_partial_cmp(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_ substr, ) } - -/// Strict inequality. -fn cs_op( - less: bool, - inclusive: bool, - cx: &mut ExtCtxt<'_>, - span: Span, - substr: &Substructure<'_>, -) -> P { - let ordering_path = |cx: &mut ExtCtxt<'_>, name: &str| { - cx.expr_path( - cx.path_global(span, cx.std_path(&[sym::cmp, sym::Ordering, Symbol::intern(name)])), - ) - }; - - let par_cmp = |cx: &mut ExtCtxt<'_>, span, self_f: P, other_fs: &[P], default| { - let other_f = match other_fs { - [o_f] => o_f, - _ => cx.span_bug(span, "not exactly 2 arguments in `derive(PartialOrd)`"), - }; - - // `PartialOrd::partial_cmp(self.fi, other.fi)` - let cmp_path = cx.expr_path( - cx.path_global(span, cx.std_path(&[sym::cmp, sym::PartialOrd, sym::partial_cmp])), - ); - let cmp = cx.expr_call( - span, - cmp_path, - vec![cx.expr_addr_of(span, self_f), cx.expr_addr_of(span, other_f.clone())], - ); - - let default = ordering_path(cx, default); - // `Option::unwrap_or(_, Ordering::Equal)` - let unwrap_path = cx.expr_path( - cx.path_global(span, cx.std_path(&[sym::option, sym::Option, sym::unwrap_or])), - ); - cx.expr_call(span, unwrap_path, vec![cmp, default]) - }; - - let fold = cs_fold1( - false, // need foldr - |cx, span, subexpr, self_f, other_fs| { - // build up a series of `partial_cmp`s from the inside - // out (hence foldr) to get lexical ordering, i.e., for op == - // `ast::lt` - // - // ``` - // Ordering::then_with( - // Option::unwrap_or( - // PartialOrd::partial_cmp(self.f1, other.f1), Ordering::Equal) - // ), - // Option::unwrap_or( - // PartialOrd::partial_cmp(self.f2, other.f2), Ordering::Greater) - // ) - // ) - // == Ordering::Less - // ``` - // - // and for op == - // `ast::le` - // - // ``` - // Ordering::then_with( - // Option::unwrap_or( - // PartialOrd::partial_cmp(self.f1, other.f1), Ordering::Equal) - // ), - // Option::unwrap_or( - // PartialOrd::partial_cmp(self.f2, other.f2), Ordering::Greater) - // ) - // ) - // != Ordering::Greater - // ``` - // - // The optimiser should remove the redundancy. We explicitly - // get use the binops to avoid auto-deref dereferencing too many - // layers of pointers, if the type includes pointers. - - // `Option::unwrap_or(PartialOrd::partial_cmp(self.fi, other.fi), Ordering::Equal)` - let par_cmp = par_cmp(cx, span, self_f, other_fs, "Equal"); - - // `Ordering::then_with(Option::unwrap_or(..), ..)` - let then_with_path = cx.expr_path( - cx.path_global(span, cx.std_path(&[sym::cmp, sym::Ordering, sym::then_with])), - ); - cx.expr_call(span, then_with_path, vec![par_cmp, cx.lambda0(span, subexpr)]) - }, - |cx, args| match args { - Some((span, self_f, other_fs)) => { - let opposite = if less { "Greater" } else { "Less" }; - par_cmp(cx, span, self_f, other_fs, opposite) - } - None => cx.expr_bool(span, inclusive), - }, - 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(PartialOrd)`") - } else { - let op = match (less, inclusive) { - (false, false) => GtOp, - (false, true) => GeOp, - (true, false) => LtOp, - (true, true) => LeOp, - }; - some_ordering_collapsed(cx, span, op, tag_tuple) - } - }), - cx, - span, - substr, - ); - - match *substr.fields { - EnumMatching(.., ref all_fields) | Struct(.., ref all_fields) if !all_fields.is_empty() => { - let ordering = ordering_path(cx, if less ^ inclusive { "Less" } else { "Greater" }); - let comp_op = if inclusive { BinOpKind::Ne } else { BinOpKind::Eq }; - - cx.expr_binary(span, comp_op, fold, ordering) - } - _ => fold, - } -} diff --git a/compiler/rustc_builtin_macros/src/deriving/debug.rs b/compiler/rustc_builtin_macros/src/deriving/debug.rs index ba43be6ae9..cc6dac52d7 100644 --- a/compiler/rustc_builtin_macros/src/deriving/debug.rs +++ b/compiler/rustc_builtin_macros/src/deriving/debug.rs @@ -77,7 +77,8 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_> // tuple struct/"normal" variant let fn_path_debug_tuple = cx.std_path(&[sym::fmt, sym::Formatter, sym::debug_tuple]); let expr = cx.expr_call_global(span, fn_path_debug_tuple, vec![fmt, name]); - stmts.push(cx.stmt_let(span, true, builder, expr)); + let expr = make_mut_borrow(cx, span, expr); + stmts.push(cx.stmt_let(span, false, builder, expr)); for field in fields { // Use double indirection to make sure this works for unsized types @@ -85,8 +86,8 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_> let field = cx.expr_addr_of(field.span, field); let fn_path_field = cx.std_path(&[sym::fmt, sym::DebugTuple, sym::field]); - let builder_recv = make_mut_borrow(cx, span, builder_expr.clone()); - let expr = cx.expr_call_global(span, fn_path_field, vec![builder_recv, field]); + let expr = + cx.expr_call_global(span, fn_path_field, vec![builder_expr.clone(), field]); // Use `let _ = expr;` to avoid triggering the // unused_results lint. @@ -99,7 +100,8 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_> // normal struct/struct variant let fn_path_debug_struct = cx.std_path(&[sym::fmt, sym::Formatter, sym::debug_struct]); let expr = cx.expr_call_global(span, fn_path_debug_struct, vec![fmt, name]); - stmts.push(cx.stmt_let(DUMMY_SP, true, builder, expr)); + let expr = make_mut_borrow(cx, span, expr); + stmts.push(cx.stmt_let(DUMMY_SP, false, builder, expr)); for field in fields { let name = cx.expr_lit( @@ -111,17 +113,18 @@ fn show_substructure(cx: &mut ExtCtxt<'_>, span: Span, substr: &Substructure<'_> let fn_path_field = cx.std_path(&[sym::fmt, sym::DebugStruct, sym::field]); let field = cx.expr_addr_of(field.span, field.self_.clone()); let field = cx.expr_addr_of(field.span, field); - let builder_recv = make_mut_borrow(cx, span, builder_expr.clone()); - let expr = - cx.expr_call_global(span, fn_path_field, vec![builder_recv, name, field]); + let expr = cx.expr_call_global( + span, + fn_path_field, + vec![builder_expr.clone(), name, field], + ); stmts.push(stmt_let_underscore(cx, span, expr)); } fn_path_finish = cx.std_path(&[sym::fmt, sym::DebugStruct, sym::finish]); } } - let builder_recv = make_mut_borrow(cx, span, builder_expr); - let expr = cx.expr_call_global(span, fn_path_finish, vec![builder_recv]); + let expr = cx.expr_call_global(span, fn_path_finish, vec![builder_expr]); stmts.push(cx.stmt_expr(expr)); let block = cx.block(span, stmts); diff --git a/compiler/rustc_builtin_macros/src/deriving/decodable.rs b/compiler/rustc_builtin_macros/src/deriving/decodable.rs index df69f6c90d..1d892b2072 100644 --- a/compiler/rustc_builtin_macros/src/deriving/decodable.rs +++ b/compiler/rustc_builtin_macros/src/deriving/decodable.rs @@ -91,18 +91,19 @@ fn decodable_substructure( Unnamed(ref fields, _) => fields.len(), Named(ref fields) => fields.len(), }; - let read_struct_field = Ident::new(sym::read_struct_field, trait_span); + let fn_read_struct_field_path: Vec<_> = + cx.def_site_path(&[sym::rustc_serialize, sym::Decoder, sym::read_struct_field]); 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( + cx.expr_call_global( span, - blkdecoder.clone(), - read_struct_field, + fn_read_struct_field_path.clone(), vec![ + blkdecoder.clone(), cx.expr_str(span, name), cx.expr_usize(span, field), exprdecode.clone(), @@ -111,11 +112,14 @@ fn decodable_substructure( ) }); let result = cx.expr_ok(trait_span, result); - cx.expr_method_call( + let fn_read_struct_path: Vec<_> = + cx.def_site_path(&[sym::rustc_serialize, sym::Decoder, sym::read_struct]); + + cx.expr_call_global( trait_span, - decoder, - Ident::new(sym::read_struct, trait_span), + fn_read_struct_path, vec![ + decoder, cx.expr_str(trait_span, substr.type_ident.name), cx.expr_usize(trait_span, nfields), cx.lambda1(trait_span, result, blkarg), @@ -127,7 +131,9 @@ fn decodable_substructure( let mut arms = Vec::with_capacity(fields.len() + 1); let mut variants = Vec::with_capacity(fields.len()); - let rvariant_arg = Ident::new(sym::read_enum_variant_arg, trait_span); + + let fn_read_enum_variant_arg_path: Vec<_> = + cx.def_site_path(&[sym::rustc_serialize, sym::Decoder, sym::read_enum_variant_arg]); for (i, &(ident, v_span, ref parts)) in fields.iter().enumerate() { variants.push(cx.expr_str(v_span, ident.name)); @@ -138,11 +144,10 @@ fn decodable_substructure( let idx = cx.expr_usize(span, field); cx.expr_try( span, - cx.expr_method_call( + cx.expr_call_global( span, - blkdecoder.clone(), - rvariant_arg, - vec![idx, exprdecode.clone()], + fn_read_enum_variant_arg_path.clone(), + vec![blkdecoder.clone(), idx, exprdecode.clone()], ), ) }); @@ -159,17 +164,21 @@ fn decodable_substructure( 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( + let fn_read_enum_variant_path: Vec<_> = + cx.def_site_path(&[sym::rustc_serialize, sym::Decoder, sym::read_enum_variant]); + let result = cx.expr_call_global( trait_span, - blkdecoder, - Ident::new(sym::read_enum_variant, trait_span), - vec![variant_vec, lambda], + fn_read_enum_variant_path, + vec![blkdecoder, variant_vec, lambda], ); - cx.expr_method_call( + let fn_read_enum_path: Vec<_> = + cx.def_site_path(&[sym::rustc_serialize, sym::Decoder, sym::read_enum]); + + cx.expr_call_global( trait_span, - decoder, - Ident::new(sym::read_enum, trait_span), + fn_read_enum_path, vec![ + decoder, cx.expr_str(trait_span, substr.type_ident.name), cx.lambda1(trait_span, result, blkarg), ], diff --git a/compiler/rustc_builtin_macros/src/deriving/encodable.rs b/compiler/rustc_builtin_macros/src/deriving/encodable.rs index 62aa1cbfbf..01a57bea14 100644 --- a/compiler/rustc_builtin_macros/src/deriving/encodable.rs +++ b/compiler/rustc_builtin_macros/src/deriving/encodable.rs @@ -179,7 +179,8 @@ fn encodable_substructure( match *substr.fields { Struct(_, ref fields) => { - let emit_struct_field = Ident::new(sym::emit_struct_field, trait_span); + let fn_emit_struct_field_path = + cx.def_site_path(&[sym::rustc_serialize, sym::Encoder, sym::emit_struct_field]); let mut stmts = Vec::new(); for (i, &FieldInfo { name, ref self_, span, .. }) in fields.iter().enumerate() { let name = match name { @@ -189,11 +190,15 @@ fn encodable_substructure( let self_ref = cx.expr_addr_of(span, self_.clone()); let enc = cx.expr_call(span, fn_path.clone(), vec![self_ref, blkencoder.clone()]); let lambda = cx.lambda1(span, enc, blkarg); - let call = cx.expr_method_call( + let call = cx.expr_call_global( span, - blkencoder.clone(), - emit_struct_field, - vec![cx.expr_str(span, name), cx.expr_usize(span, i), lambda], + fn_emit_struct_field_path.clone(), + vec![ + blkencoder.clone(), + cx.expr_str(span, name), + cx.expr_usize(span, i), + lambda, + ], ); // last call doesn't need a try! @@ -216,11 +221,14 @@ fn encodable_substructure( cx.lambda_stmts_1(trait_span, stmts, blkarg) }; - cx.expr_method_call( + let fn_emit_struct_path = + cx.def_site_path(&[sym::rustc_serialize, sym::Encoder, sym::emit_struct]); + + cx.expr_call_global( trait_span, - encoder, - Ident::new(sym::emit_struct, trait_span), + fn_emit_struct_path, vec![ + encoder, cx.expr_str(trait_span, substr.type_ident.name), cx.expr_usize(trait_span, fields.len()), blk, @@ -235,7 +243,10 @@ fn encodable_substructure( // actually exist. let me = cx.stmt_let(trait_span, false, blkarg, encoder); let encoder = cx.expr_ident(trait_span, blkarg); - let emit_variant_arg = Ident::new(sym::emit_enum_variant_arg, trait_span); + + let fn_emit_enum_variant_arg_path: Vec<_> = + cx.def_site_path(&[sym::rustc_serialize, sym::Encoder, sym::emit_enum_variant_arg]); + let mut stmts = Vec::new(); if !fields.is_empty() { let last = fields.len() - 1; @@ -244,11 +255,11 @@ fn encodable_substructure( let enc = cx.expr_call(span, fn_path.clone(), vec![self_ref, blkencoder.clone()]); let lambda = cx.lambda1(span, enc, blkarg); - let call = cx.expr_method_call( + + let call = cx.expr_call_global( span, - blkencoder.clone(), - emit_variant_arg, - vec![cx.expr_usize(span, i), lambda], + fn_emit_enum_variant_arg_path.clone(), + vec![blkencoder.clone(), cx.expr_usize(span, i), lambda], ); let call = if i != last { cx.expr_try(span, call) @@ -265,23 +276,29 @@ fn encodable_substructure( let blk = cx.lambda_stmts_1(trait_span, stmts, blkarg); let name = cx.expr_str(trait_span, variant.ident.name); - let call = cx.expr_method_call( + + let fn_emit_enum_variant_path: Vec<_> = + cx.def_site_path(&[sym::rustc_serialize, sym::Encoder, sym::emit_enum_variant]); + + let call = cx.expr_call_global( trait_span, - blkencoder, - Ident::new(sym::emit_enum_variant, trait_span), + fn_emit_enum_variant_path, vec![ + blkencoder, name, cx.expr_usize(trait_span, idx), cx.expr_usize(trait_span, fields.len()), blk, ], ); + let blk = cx.lambda1(trait_span, call, blkarg); - let ret = cx.expr_method_call( + let fn_emit_enum_path: Vec<_> = + cx.def_site_path(&[sym::rustc_serialize, sym::Encoder, sym::emit_enum]); + let ret = cx.expr_call_global( trait_span, - encoder, - Ident::new(sym::emit_enum, trait_span), - vec![cx.expr_str(trait_span, substr.type_ident.name), blk], + fn_emit_enum_path, + vec![encoder, cx.expr_str(trait_span, substr.type_ident.name), blk], ); cx.expr_block(cx.block(trait_span, vec![me, cx.stmt_expr(ret)])) } diff --git a/compiler/rustc_builtin_macros/src/deriving/generic/mod.rs b/compiler/rustc_builtin_macros/src/deriving/generic/mod.rs index d498c8e172..da85cc73ff 100644 --- a/compiler/rustc_builtin_macros/src/deriving/generic/mod.rs +++ b/compiler/rustc_builtin_macros/src/deriving/generic/mod.rs @@ -1578,7 +1578,7 @@ impl<'a> TraitDef<'a> { if ident.is_none() { cx.span_bug(sp, "a braced struct with unnamed fields in `derive`"); } - ast::FieldPat { + ast::PatField { ident: ident.unwrap(), is_shorthand: false, attrs: ast::AttrVec::new(), diff --git a/compiler/rustc_builtin_macros/src/format.rs b/compiler/rustc_builtin_macros/src/format.rs index 85ca1da6f1..7e88b58c0e 100644 --- a/compiler/rustc_builtin_macros/src/format.rs +++ b/compiler/rustc_builtin_macros/src/format.rs @@ -270,7 +270,7 @@ impl<'a, 'b> Context<'a, 'b> { parse::ArgumentNamed(s) => Named(s), }; - let ty = Placeholder(match &arg.format.ty[..] { + let ty = Placeholder(match arg.format.ty { "" => "Display", "?" => "Debug", "e" => "LowerExp", diff --git a/compiler/rustc_builtin_macros/src/format_foreign.rs b/compiler/rustc_builtin_macros/src/format_foreign.rs index 0496c72cb0..0cc520e5bd 100644 --- a/compiler/rustc_builtin_macros/src/format_foreign.rs +++ b/compiler/rustc_builtin_macros/src/format_foreign.rs @@ -312,7 +312,7 @@ pub mod printf { return Some((Substitution::Escape, &s[start + 2..])); } - Cur::new_at(&s[..], start) + Cur::new_at(s, start) }; // This is meant to be a translation of the following regex: @@ -673,7 +673,7 @@ pub mod shell { _ => { /* fall-through */ } } - Cur::new_at(&s[..], start) + Cur::new_at(s, start) }; let at = at.at_next_cp()?; diff --git a/compiler/rustc_builtin_macros/src/global_asm.rs b/compiler/rustc_builtin_macros/src/global_asm.rs index 3689e33be6..76d8745292 100644 --- a/compiler/rustc_builtin_macros/src/global_asm.rs +++ b/compiler/rustc_builtin_macros/src/global_asm.rs @@ -28,7 +28,7 @@ pub fn expand_global_asm<'cx>( ident: Ident::invalid(), attrs: Vec::new(), id: ast::DUMMY_NODE_ID, - kind: ast::ItemKind::GlobalAsm(P(global_asm)), + kind: ast::ItemKind::GlobalAsm(global_asm), vis: ast::Visibility { span: sp.shrink_to_lo(), kind: ast::VisibilityKind::Inherited, diff --git a/compiler/rustc_builtin_macros/src/lib.rs b/compiler/rustc_builtin_macros/src/lib.rs index 59844b6c69..a46a5502b2 100644 --- a/compiler/rustc_builtin_macros/src/lib.rs +++ b/compiler/rustc_builtin_macros/src/lib.rs @@ -11,6 +11,7 @@ #![feature(or_patterns)] #![feature(proc_macro_internals)] #![feature(proc_macro_quote)] +#![recursion_limit = "256"] extern crate proc_macro; @@ -24,9 +25,11 @@ mod asm; mod assert; mod cfg; mod cfg_accessible; +mod cfg_eval; mod compile_error; mod concat; mod concat_idents; +mod derive; mod deriving; mod env; mod format; @@ -88,6 +91,8 @@ pub fn register_builtin_macros(resolver: &mut dyn ResolverExpand) { register_attr! { bench: test::expand_bench, cfg_accessible: cfg_accessible::Expander, + cfg_eval: cfg_eval::expand, + derive: derive::Expander, global_allocator: global_allocator::expand, test: test::expand_test, test_case: test::expand_test_case, diff --git a/compiler/rustc_builtin_macros/src/proc_macro_harness.rs b/compiler/rustc_builtin_macros/src/proc_macro_harness.rs index 7582d98053..71bbae1161 100644 --- a/compiler/rustc_builtin_macros/src/proc_macro_harness.rs +++ b/compiler/rustc_builtin_macros/src/proc_macro_harness.rs @@ -91,7 +91,7 @@ pub fn inject( } let decls = mk_decls(&mut krate, &mut cx, ¯os); - krate.module.items.push(decls); + krate.items.push(decls); krate } diff --git a/compiler/rustc_builtin_macros/src/source_util.rs b/compiler/rustc_builtin_macros/src/source_util.rs index 28efd483c8..4aafcb2fb6 100644 --- a/compiler/rustc_builtin_macros/src/source_util.rs +++ b/compiler/rustc_builtin_macros/src/source_util.rs @@ -4,7 +4,7 @@ use rustc_ast::token; use rustc_ast::tokenstream::TokenStream; use rustc_ast_pretty::pprust; use rustc_expand::base::{self, *}; -use rustc_expand::module::DirectoryOwnership; +use rustc_expand::module::DirOwnership; use rustc_parse::parser::{ForceCollect, Parser}; use rustc_parse::{self, new_parser_from_file}; use rustc_session::lint::builtin::INCOMPLETE_INCLUDE; @@ -101,7 +101,7 @@ pub fn expand_include<'cx>( None => return DummyResult::any(sp), }; // The file will be added to the code map by the parser - let mut file = match cx.resolve_path(file, sp) { + let file = match cx.resolve_path(file, sp) { Ok(f) => f, Err(mut err) => { err.emit(); @@ -114,10 +114,9 @@ pub fn expand_include<'cx>( // then the path of `bar.rs` should be relative to the directory of `file`. // See https://github.com/rust-lang/rust/pull/69838/files#r395217057 for a discussion. // `MacroExpander::fully_expand_fragment` later restores, so "stack discipline" is maintained. - file.pop(); - cx.current_expansion.directory_ownership = DirectoryOwnership::Owned { relative: None }; - let mod_path = cx.current_expansion.module.mod_path.clone(); - cx.current_expansion.module = Rc::new(ModuleData { mod_path, directory: file }); + let dir_path = file.parent().unwrap_or(&file).to_owned(); + cx.current_expansion.module = Rc::new(cx.current_expansion.module.with_dir_path(dir_path)); + cx.current_expansion.dir_ownership = DirOwnership::Owned { relative: None }; struct ExpandResult<'a> { p: Parser<'a>, diff --git a/compiler/rustc_builtin_macros/src/standard_library_imports.rs b/compiler/rustc_builtin_macros/src/standard_library_imports.rs index 91566ec1ef..fbd8be22a9 100644 --- a/compiler/rustc_builtin_macros/src/standard_library_imports.rs +++ b/compiler/rustc_builtin_macros/src/standard_library_imports.rs @@ -1,9 +1,8 @@ use rustc_ast as ast; -use rustc_ast::ptr::P; use rustc_expand::base::{ExtCtxt, ResolverExpand}; use rustc_expand::expand::ExpansionConfig; use rustc_session::Session; -use rustc_span::edition::Edition; +use rustc_span::edition::Edition::*; use rustc_span::hygiene::AstPass; use rustc_span::symbol::{kw, sym, Ident, Symbol}; use rustc_span::DUMMY_SP; @@ -14,7 +13,7 @@ pub fn inject( sess: &Session, alt_std_name: Option, ) -> ast::Crate { - let rust_2018 = sess.parse_sess.edition >= Edition::Edition2018; + let edition = sess.parse_sess.edition; // the first name in this list is the crate name of the crate with the prelude let names: &[Symbol] = if sess.contains_name(&krate.attrs, sym::no_core) { @@ -43,8 +42,12 @@ pub fn inject( // .rev() to preserve ordering above in combination with insert(0, ...) for &name in names.iter().rev() { - let ident = if rust_2018 { Ident::new(name, span) } else { Ident::new(name, call_site) }; - krate.module.items.insert( + let ident = if edition >= Edition2018 { + Ident::new(name, span) + } else { + Ident::new(name, call_site) + }; + krate.items.insert( 0, cx.item( span, @@ -59,27 +62,31 @@ pub fn inject( // the one with the prelude. let name = names[0]; - let import_path = if rust_2018 { - [name, sym::prelude, sym::v1].iter().map(|symbol| Ident::new(*symbol, span)).collect() - } else { - [kw::PathRoot, name, sym::prelude, sym::v1] - .iter() - .map(|symbol| Ident::new(*symbol, span)) - .collect() - }; + let root = (edition == Edition2015).then(|| kw::PathRoot); + + let import_path = root + .iter() + .chain(&[name, sym::prelude]) + .chain(&[match edition { + Edition2015 => sym::rust_2015, + Edition2018 => sym::rust_2018, + Edition2021 => sym::rust_2021, + }]) + .map(|&symbol| Ident::new(symbol, span)) + .collect(); let use_item = cx.item( span, Ident::invalid(), vec![cx.attribute(cx.meta_word(span, sym::prelude_import))], - ast::ItemKind::Use(P(ast::UseTree { + ast::ItemKind::Use(ast::UseTree { prefix: cx.path(span, import_path), kind: ast::UseTreeKind::Glob, span, - })), + }), ); - krate.module.items.insert(0, use_item); + krate.items.insert(0, use_item); krate } diff --git a/compiler/rustc_builtin_macros/src/test_harness.rs b/compiler/rustc_builtin_macros/src/test_harness.rs index 4ac22be3c2..28e8259784 100644 --- a/compiler/rustc_builtin_macros/src/test_harness.rs +++ b/compiler/rustc_builtin_macros/src/test_harness.rs @@ -1,10 +1,10 @@ // Code that generates a test runner to run all the tests in a crate use rustc_ast as ast; -use rustc_ast::attr; use rustc_ast::entry::EntryPointType; use rustc_ast::mut_visit::{ExpectOne, *}; use rustc_ast::ptr::P; +use rustc_ast::{attr, ModKind}; use rustc_expand::base::{ExtCtxt, ResolverExpand}; use rustc_expand::expand::{AstFragment, ExpansionConfig}; use rustc_feature::Features; @@ -89,7 +89,7 @@ impl<'a> MutVisitor for TestHarnessGenerator<'a> { noop_visit_crate(c, self); // Create a main function to run our tests - c.module.items.push(mk_main(&mut self.cx)); + c.items.push(mk_main(&mut self.cx)); } fn flat_map_item(&mut self, i: P) -> SmallVec<[P; 1]> { @@ -103,9 +103,9 @@ impl<'a> MutVisitor for TestHarnessGenerator<'a> { // We don't want to recurse into anything other than mods, since // mods or tests inside of functions will break things - if let ast::ItemKind::Mod(mut module) = item.kind { + if let ast::ItemKind::Mod(..) = item.kind { let tests = mem::take(&mut self.tests); - noop_visit_mod(&mut module, self); + noop_visit_item_kind(&mut item.kind, self); let mut tests = mem::replace(&mut self.tests, tests); if !tests.is_empty() { @@ -113,8 +113,12 @@ impl<'a> MutVisitor for TestHarnessGenerator<'a> { if item.id == ast::DUMMY_NODE_ID { ast::CRATE_NODE_ID } else { item.id }; // Create an identifier that will hygienically resolve the test // case name, even in another module. + let inner_span = match item.kind { + ast::ItemKind::Mod(_, ModKind::Loaded(.., span)) => span, + _ => unreachable!(), + }; let expn_id = self.cx.ext_cx.resolver.expansion_for_ast_pass( - module.inner, + inner_span, AstPass::TestHarness, &[], Some(parent), @@ -126,7 +130,6 @@ impl<'a> MutVisitor for TestHarnessGenerator<'a> { } self.cx.test_cases.extend(tests); } - item.kind = ast::ItemKind::Mod(module); } smallvec![P(item)] } diff --git a/compiler/rustc_codegen_cranelift/.cirrus.yml b/compiler/rustc_codegen_cranelift/.cirrus.yml new file mode 100644 index 0000000000..e173df423a --- /dev/null +++ b/compiler/rustc_codegen_cranelift/.cirrus.yml @@ -0,0 +1,25 @@ +task: + name: freebsd + freebsd_instance: + image: freebsd-12-1-release-amd64 + setup_rust_script: + - pkg install -y curl git bash + - curl https://sh.rustup.rs -sSf --output rustup.sh + - sh rustup.sh --default-toolchain none -y --profile=minimal + cargo_bin_cache: + folder: ~/.cargo/bin + target_cache: + folder: target + prepare_script: + - . $HOME/.cargo/env + - git config --global user.email "user@example.com" + - git config --global user.name "User" + - ./prepare.sh + test_script: + - . $HOME/.cargo/env + - # Enable backtraces for easier debugging + - export RUST_BACKTRACE=1 + - # Reduce amount of benchmark runs as they are slow + - export COMPILE_RUNS=2 + - export RUN_RUNS=2 + - ./test.sh diff --git a/compiler/rustc_codegen_cranelift/.github/workflows/main.yml b/compiler/rustc_codegen_cranelift/.github/workflows/main.yml index 20c58423a0..e6d3375fb1 100644 --- a/compiler/rustc_codegen_cranelift/.github/workflows/main.yml +++ b/compiler/rustc_codegen_cranelift/.github/workflows/main.yml @@ -12,9 +12,6 @@ jobs: fail-fast: false matrix: os: [ubuntu-latest, macos-latest] - env: - - BACKEND: "" - - BACKEND: --oldbe steps: - uses: actions/checkout@v2 @@ -54,7 +51,7 @@ jobs: export COMPILE_RUNS=2 export RUN_RUNS=2 - ./test.sh $BACKEND + ./test.sh - name: Package prebuilt cg_clif run: tar cvfJ cg_clif.tar.xz build diff --git a/compiler/rustc_codegen_cranelift/.vscode/settings.json b/compiler/rustc_codegen_cranelift/.vscode/settings.json index 19ea41563d..a13d5931ff 100644 --- a/compiler/rustc_codegen_cranelift/.vscode/settings.json +++ b/compiler/rustc_codegen_cranelift/.vscode/settings.json @@ -1,6 +1,6 @@ { // source for rustc_* is not included in the rust-src component; disable the errors about this - "rust-analyzer.diagnostics.disabled": ["unresolved-extern-crate"], + "rust-analyzer.diagnostics.disabled": ["unresolved-extern-crate", "macro-error"], "rust-analyzer.assist.importMergeBehavior": "last", "rust-analyzer.cargo.loadOutDirsFromCheck": true, "rust-analyzer.linkedProjects": [ diff --git a/compiler/rustc_codegen_cranelift/Cargo.lock b/compiler/rustc_codegen_cranelift/Cargo.lock index 5495cfa5ea..76d9f0d27c 100644 --- a/compiler/rustc_codegen_cranelift/Cargo.lock +++ b/compiler/rustc_codegen_cranelift/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "anyhow" version = "1.0.38" @@ -29,18 +31,6 @@ version = "1.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b" -[[package]] -name = "cc" -version = "1.0.66" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48" - -[[package]] -name = "cfg-if" -version = "0.1.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" - [[package]] name = "cfg-if" version = "1.0.0" @@ -49,16 +39,16 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "cranelift-bforest" -version = "0.69.0" -source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#986b5768f9e68f1564b43f32b8a4080a6582c8ca" +version = "0.70.0" +source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#cdb60ec5a9df087262ae8960a31067e88cd80058" dependencies = [ "cranelift-entity", ] [[package]] name = "cranelift-codegen" -version = "0.69.0" -source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#986b5768f9e68f1564b43f32b8a4080a6582c8ca" +version = "0.70.0" +source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#cdb60ec5a9df087262ae8960a31067e88cd80058" dependencies = [ "byteorder", "cranelift-bforest", @@ -75,8 +65,8 @@ dependencies = [ [[package]] name = "cranelift-codegen-meta" -version = "0.69.0" -source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#986b5768f9e68f1564b43f32b8a4080a6582c8ca" +version = "0.70.0" +source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#cdb60ec5a9df087262ae8960a31067e88cd80058" dependencies = [ "cranelift-codegen-shared", "cranelift-entity", @@ -84,18 +74,18 @@ dependencies = [ [[package]] name = "cranelift-codegen-shared" -version = "0.69.0" -source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#986b5768f9e68f1564b43f32b8a4080a6582c8ca" +version = "0.70.0" +source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#cdb60ec5a9df087262ae8960a31067e88cd80058" [[package]] name = "cranelift-entity" -version = "0.69.0" -source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#986b5768f9e68f1564b43f32b8a4080a6582c8ca" +version = "0.70.0" +source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#cdb60ec5a9df087262ae8960a31067e88cd80058" [[package]] name = "cranelift-frontend" -version = "0.69.0" -source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#986b5768f9e68f1564b43f32b8a4080a6582c8ca" +version = "0.70.0" +source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#cdb60ec5a9df087262ae8960a31067e88cd80058" dependencies = [ "cranelift-codegen", "log", @@ -105,8 +95,8 @@ dependencies = [ [[package]] name = "cranelift-jit" -version = "0.69.0" -source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#986b5768f9e68f1564b43f32b8a4080a6582c8ca" +version = "0.70.0" +source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#cdb60ec5a9df087262ae8960a31067e88cd80058" dependencies = [ "anyhow", "cranelift-codegen", @@ -123,8 +113,8 @@ dependencies = [ [[package]] name = "cranelift-module" -version = "0.69.0" -source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#986b5768f9e68f1564b43f32b8a4080a6582c8ca" +version = "0.70.0" +source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#cdb60ec5a9df087262ae8960a31067e88cd80058" dependencies = [ "anyhow", "cranelift-codegen", @@ -135,18 +125,17 @@ dependencies = [ [[package]] name = "cranelift-native" -version = "0.69.0" -source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#986b5768f9e68f1564b43f32b8a4080a6582c8ca" +version = "0.70.0" +source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#cdb60ec5a9df087262ae8960a31067e88cd80058" dependencies = [ "cranelift-codegen", - "raw-cpuid", "target-lexicon", ] [[package]] name = "cranelift-object" -version = "0.69.0" -source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#986b5768f9e68f1564b43f32b8a4080a6582c8ca" +version = "0.70.0" +source = "git+https://github.com/bytecodealliance/wasmtime/?branch=main#cdb60ec5a9df087262ae8960a31067e88cd80058" dependencies = [ "anyhow", "cranelift-codegen", @@ -162,7 +151,7 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "81156fece84ab6a9f2afdb109ce3ae577e42b1228441eded99bd77f627953b1a" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", ] [[package]] @@ -219,9 +208,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.82" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "89203f3fba0a3795506acaad8ebce3c80c0af93f994d5a1d7a0b1eeb23271929" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" [[package]] name = "libloading" @@ -229,17 +218,17 @@ version = "0.6.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "351a32417a12d5f7e82c368a66781e307834dae04c6ce0cd4456d52989229883" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "winapi", ] [[package]] name = "log" -version = "0.4.13" +version = "0.4.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fcf3805d4480bb5b86070dcfeb9e2cb2ebc148adb753c5cca5f884d1d65a42b2" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" dependencies = [ - "cfg-if 0.1.10", + "cfg-if", ] [[package]] @@ -253,9 +242,9 @@ dependencies = [ [[package]] name = "object" -version = "0.22.0" +version = "0.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8d3b63360ec3cb337817c2dbd47ab4a0f170d285d8e5a2064600f3def1402397" +checksum = "a9a7ab5d64814df0fe4a4b5ead45ed6c5f181ee3ff04ba344313a6c80446c5d4" dependencies = [ "crc32fast", "indexmap", @@ -272,24 +261,13 @@ dependencies = [ [[package]] name = "quote" -version = "1.0.8" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ "proc-macro2", ] -[[package]] -name = "raw-cpuid" -version = "8.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1fdf7d9dbd43f3d81d94a49c1c3df73cc2b3827995147e6cf7f89d4ec5483e73" -dependencies = [ - "bitflags", - "cc", - "rustc_version", -] - [[package]] name = "regalloc" version = "0.0.31" @@ -337,30 +315,6 @@ dependencies = [ "target-lexicon", ] -[[package]] -name = "rustc_version" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -dependencies = [ - "semver", -] - -[[package]] -name = "semver" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1d7eb9ef2c18661902cc47e535f9bc51b78acd254da71d375c2f6720d9a40403" -dependencies = [ - "semver-parser", -] - -[[package]] -name = "semver-parser" -version = "0.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3" - [[package]] name = "smallvec" version = "1.6.1" @@ -369,9 +323,9 @@ checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" [[package]] name = "syn" -version = "1.0.58" +version = "1.0.60" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cc60a3d73ea6594cd712d830cc1f0390fd71542d8c8cd24e70cc54cdfd5e05d5" +checksum = "c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081" dependencies = [ "proc-macro2", "quote", @@ -380,24 +334,24 @@ dependencies = [ [[package]] name = "target-lexicon" -version = "0.11.1" +version = "0.11.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ee5a98e506fb7231a304c3a1bd7c132a55016cf65001e0282480665870dfcb9" +checksum = "422045212ea98508ae3d28025bc5aaa2bd4a9cdaecd442a08da2ee620ee9ea95" [[package]] name = "thiserror" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76cc616c6abf8c8928e2fdcc0dbfab37175edd8fb49a4641066ad1364fdab146" +checksum = "e0f4a65597094d4483ddaed134f409b2cb7c1beccf25201a9f73c719254fa98e" dependencies = [ "thiserror-impl", ] [[package]] name = "thiserror-impl" -version = "1.0.23" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9be73a2caec27583d0046ef3796c3794f868a5bc813db689eed00c7631275cd1" +checksum = "7765189610d8241a44529806d6fd1f2e0a08734313a35d5b3a556f92b381f3c0" dependencies = [ "proc-macro2", "quote", diff --git a/compiler/rustc_codegen_cranelift/Cargo.toml b/compiler/rustc_codegen_cranelift/Cargo.toml index 3820fce6d1..9861af1f8e 100644 --- a/compiler/rustc_codegen_cranelift/Cargo.toml +++ b/compiler/rustc_codegen_cranelift/Cargo.toml @@ -9,14 +9,14 @@ crate-type = ["dylib"] [dependencies] # These have to be in sync with each other -cranelift-codegen = { git = "https://github.com/bytecodealliance/wasmtime/", branch = "main", features = ["unwind", "x86", "x64"] } +cranelift-codegen = { git = "https://github.com/bytecodealliance/wasmtime/", branch = "main", features = ["unwind", "x64"] } cranelift-frontend = { git = "https://github.com/bytecodealliance/wasmtime/", branch = "main" } cranelift-module = { git = "https://github.com/bytecodealliance/wasmtime/", branch = "main" } cranelift-jit = { git = "https://github.com/bytecodealliance/wasmtime/", branch = "main", optional = true } cranelift-object = { git = "https://github.com/bytecodealliance/wasmtime/", branch = "main" } target-lexicon = "0.11.0" gimli = { version = "0.23.0", default-features = false, features = ["write"]} -object = { version = "0.22.0", default-features = false, features = ["std", "read_core", "write", "coff", "elf", "macho", "pe"] } +object = { version = "0.23.0", default-features = false, features = ["std", "read_core", "write", "coff", "elf", "macho", "pe"] } ar = { git = "https://github.com/bjorn3/rust-ar.git", branch = "do_not_remove_cg_clif_ranlib" } indexmap = "1.0.2" @@ -38,7 +38,6 @@ smallvec = "1.6.1" default = ["jit", "inline_asm"] jit = ["cranelift-jit", "libloading"] inline_asm = [] -oldbe = [] [profile.dev] # By compiling dependencies with optimizations, performing tests gets much faster. diff --git a/compiler/rustc_codegen_cranelift/build.sh b/compiler/rustc_codegen_cranelift/build.sh index 598ce35ece..090349e54b 100755 --- a/compiler/rustc_codegen_cranelift/build.sh +++ b/compiler/rustc_codegen_cranelift/build.sh @@ -1,11 +1,10 @@ -#!/bin/bash +#!/usr/bin/env bash set -e # Settings export CHANNEL="release" build_sysroot="clif" target_dir='build' -oldbe='' while [[ $# != 0 ]]; do case $1 in "--debug") @@ -19,12 +18,9 @@ while [[ $# != 0 ]]; do target_dir=$2 shift ;; - "--oldbe") - oldbe='--features oldbe' - ;; *) echo "Unknown flag '$1'" - echo "Usage: ./build.sh [--debug] [--sysroot none|clif|llvm] [--target-dir DIR] [--oldbe]" + echo "Usage: ./build.sh [--debug] [--sysroot none|clif|llvm] [--target-dir DIR]" exit 1 ;; esac @@ -34,19 +30,19 @@ done # Build cg_clif unset CARGO_TARGET_DIR unamestr=$(uname) -if [[ "$unamestr" == 'Linux' ]]; then +if [[ "$unamestr" == 'Linux' || "$unamestr" == "FreeBSD" ]]; then export RUSTFLAGS='-Clink-arg=-Wl,-rpath=$ORIGIN/../lib '$RUSTFLAGS elif [[ "$unamestr" == 'Darwin' ]]; then export RUSTFLAGS='-Csplit-debuginfo=unpacked -Clink-arg=-Wl,-rpath,@loader_path/../lib -Zosx-rpath-install-name '$RUSTFLAGS dylib_ext='dylib' else - echo "Unsupported os" + echo "Unsupported os $unamestr" exit 1 fi if [[ "$CHANNEL" == "release" ]]; then - cargo build $oldbe --release + cargo build --release else - cargo build $oldbe + cargo build fi source scripts/ext_config.sh diff --git a/compiler/rustc_codegen_cranelift/build_sysroot/Cargo.lock b/compiler/rustc_codegen_cranelift/build_sysroot/Cargo.lock index 0da9999c17..a7650ab995 100644 --- a/compiler/rustc_codegen_cranelift/build_sysroot/Cargo.lock +++ b/compiler/rustc_codegen_cranelift/build_sysroot/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "addr2line" version = "0.14.1" @@ -30,15 +32,6 @@ dependencies = [ "core", ] -[[package]] -name = "alloc_system" -version = "0.0.0" -dependencies = [ - "compiler_builtins", - "core", - "libc", -] - [[package]] name = "autocfg" version = "1.0.1" @@ -47,9 +40,9 @@ checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "cc" -version = "1.0.66" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48" +checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" [[package]] name = "cfg-if" @@ -139,9 +132,9 @@ dependencies = [ [[package]] name = "libc" -version = "0.2.84" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1cca32fa0182e8c0989459524dc356b8f2b5c10f1b9eb521b7d182c03cf8c5ff" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" dependencies = [ "rustc-std-workspace-core", ] @@ -258,7 +251,6 @@ name = "sysroot" version = "0.0.0" dependencies = [ "alloc", - "alloc_system", "compiler_builtins", "core", "std", diff --git a/compiler/rustc_codegen_cranelift/build_sysroot/Cargo.toml b/compiler/rustc_codegen_cranelift/build_sysroot/Cargo.toml index 82516c98af..04748d5dba 100644 --- a/compiler/rustc_codegen_cranelift/build_sysroot/Cargo.toml +++ b/compiler/rustc_codegen_cranelift/build_sysroot/Cargo.toml @@ -9,8 +9,6 @@ alloc = { path = "./sysroot_src/library/alloc" } std = { path = "./sysroot_src/library/std", features = ["panic_unwind", "backtrace"] } test = { path = "./sysroot_src/library/test" } -alloc_system = { path = "./alloc_system" } - compiler_builtins = { version = "0.1.39", default-features = false, features = ["no-asm"] } [patch.crates-io] diff --git a/compiler/rustc_codegen_cranelift/build_sysroot/alloc_system/Cargo.toml b/compiler/rustc_codegen_cranelift/build_sysroot/alloc_system/Cargo.toml deleted file mode 100644 index 9fffca8430..0000000000 --- a/compiler/rustc_codegen_cranelift/build_sysroot/alloc_system/Cargo.toml +++ /dev/null @@ -1,13 +0,0 @@ -[package] -authors = ["The Rust Project Developers", "bjorn3 (edited to be usable outside the rust source)"] -name = "alloc_system" -version = "0.0.0" -[lib] -name = "alloc_system" -path = "lib.rs" -test = false -doc = false -[dependencies] -core = { path = "../sysroot_src/library/core" } -libc = { version = "0.2.43", features = ['rustc-dep-of-std'], default-features = false } -compiler_builtins = "0.1" diff --git a/compiler/rustc_codegen_cranelift/build_sysroot/build_sysroot.sh b/compiler/rustc_codegen_cranelift/build_sysroot/build_sysroot.sh index 282ce4a582..636aa5f3f3 100755 --- a/compiler/rustc_codegen_cranelift/build_sysroot/build_sysroot.sh +++ b/compiler/rustc_codegen_cranelift/build_sysroot/build_sysroot.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash # Requires the CHANNEL env var to be set to `debug` or `release.` diff --git a/compiler/rustc_codegen_cranelift/build_sysroot/prepare_sysroot_src.sh b/compiler/rustc_codegen_cranelift/build_sysroot/prepare_sysroot_src.sh index d3b87e02ba..c90205db0f 100755 --- a/compiler/rustc_codegen_cranelift/build_sysroot/prepare_sysroot_src.sh +++ b/compiler/rustc_codegen_cranelift/build_sysroot/prepare_sysroot_src.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -e cd "$(dirname "$0")" @@ -33,7 +33,7 @@ git clone https://github.com/rust-lang/compiler-builtins.git || echo "rust-lang/ pushd compiler-builtins git checkout -- . git checkout 0.1.39 -git apply ../../crate_patches/0001-compiler-builtins-Remove-rotate_left-from-Int.patch +git apply ../../crate_patches/000*-compiler-builtins-*.patch popd echo "Successfully prepared sysroot source for building" diff --git a/compiler/rustc_codegen_cranelift/clean_all.sh b/compiler/rustc_codegen_cranelift/clean_all.sh index b47efe72bc..a7bbeb05ca 100755 --- a/compiler/rustc_codegen_cranelift/clean_all.sh +++ b/compiler/rustc_codegen_cranelift/clean_all.sh @@ -1,4 +1,4 @@ -#!/bin/bash --verbose +#!/usr/bin/env bash set -e rm -rf target/ build/ build_sysroot/{sysroot_src/,target/,compiler-builtins/} perf.data{,.old} diff --git a/compiler/rustc_codegen_cranelift/crate_patches/0002-compiler-builtins-Disable-128bit-atomic-operations.patch b/compiler/rustc_codegen_cranelift/crate_patches/0002-compiler-builtins-Disable-128bit-atomic-operations.patch new file mode 100644 index 0000000000..7daea99f57 --- /dev/null +++ b/compiler/rustc_codegen_cranelift/crate_patches/0002-compiler-builtins-Disable-128bit-atomic-operations.patch @@ -0,0 +1,48 @@ +From 1d574bf5e32d51641dcacaf8ef777e95b44f6f2a Mon Sep 17 00:00:00 2001 +From: bjorn3 +Date: Thu, 18 Feb 2021 18:30:55 +0100 +Subject: [PATCH] Disable 128bit atomic operations + +Cranelift doesn't support them yet +--- + src/mem/mod.rs | 12 ------------ + 1 file changed, 12 deletions(-) + +diff --git a/src/mem/mod.rs b/src/mem/mod.rs +index 107762c..2d1ae10 100644 +--- a/src/mem/mod.rs ++++ b/src/mem/mod.rs +@@ -137,10 +137,6 @@ intrinsics! { + pub extern "C" fn __llvm_memcpy_element_unordered_atomic_8(dest: *mut u64, src: *const u64, bytes: usize) -> () { + memcpy_element_unordered_atomic(dest, src, bytes); + } +- #[cfg(target_has_atomic_load_store = "128")] +- pub extern "C" fn __llvm_memcpy_element_unordered_atomic_16(dest: *mut u128, src: *const u128, bytes: usize) -> () { +- memcpy_element_unordered_atomic(dest, src, bytes); +- } + + #[cfg(target_has_atomic_load_store = "8")] + pub extern "C" fn __llvm_memmove_element_unordered_atomic_1(dest: *mut u8, src: *const u8, bytes: usize) -> () { +@@ -158,10 +154,6 @@ intrinsics! { + pub extern "C" fn __llvm_memmove_element_unordered_atomic_8(dest: *mut u64, src: *const u64, bytes: usize) -> () { + memmove_element_unordered_atomic(dest, src, bytes); + } +- #[cfg(target_has_atomic_load_store = "128")] +- pub extern "C" fn __llvm_memmove_element_unordered_atomic_16(dest: *mut u128, src: *const u128, bytes: usize) -> () { +- memmove_element_unordered_atomic(dest, src, bytes); +- } + + #[cfg(target_has_atomic_load_store = "8")] + pub extern "C" fn __llvm_memset_element_unordered_atomic_1(s: *mut u8, c: u8, bytes: usize) -> () { +@@ -179,8 +171,4 @@ intrinsics! { + pub extern "C" fn __llvm_memset_element_unordered_atomic_8(s: *mut u64, c: u8, bytes: usize) -> () { + memset_element_unordered_atomic(s, c, bytes); + } +- #[cfg(target_has_atomic_load_store = "128")] +- pub extern "C" fn __llvm_memset_element_unordered_atomic_16(s: *mut u128, c: u8, bytes: usize) -> () { +- memset_element_unordered_atomic(s, c, bytes); +- } + } +-- +2.26.2.7.g19db9cfb68 + diff --git a/compiler/rustc_codegen_cranelift/example/alloc_example.rs b/compiler/rustc_codegen_cranelift/example/alloc_example.rs index f59600ebb3..71e93e87b6 100644 --- a/compiler/rustc_codegen_cranelift/example/alloc_example.rs +++ b/compiler/rustc_codegen_cranelift/example/alloc_example.rs @@ -1,4 +1,4 @@ -#![feature(start, box_syntax, alloc_system, core_intrinsics, alloc_prelude, alloc_error_handler)] +#![feature(start, box_syntax, core_intrinsics, alloc_prelude, alloc_error_handler)] #![no_std] extern crate alloc; diff --git a/compiler/rustc_codegen_cranelift/build_sysroot/alloc_system/lib.rs b/compiler/rustc_codegen_cranelift/example/alloc_system.rs similarity index 62% rename from compiler/rustc_codegen_cranelift/build_sysroot/alloc_system/lib.rs rename to compiler/rustc_codegen_cranelift/example/alloc_system.rs index c832d5e5eb..5f66ca67f2 100644 --- a/compiler/rustc_codegen_cranelift/build_sysroot/alloc_system/lib.rs +++ b/compiler/rustc_codegen_cranelift/example/alloc_system.rs @@ -8,66 +8,24 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. #![no_std] -#![allow(unused_attributes)] -#![unstable(feature = "alloc_system", - reason = "this library is unlikely to be stabilized in its current \ - form or name", - issue = "32838")] -#![feature(allocator_api)] -#![feature(core_intrinsics)] -#![feature(nll)] -#![feature(staged_api)] -#![feature(rustc_attrs)] -#![feature(alloc_layout_extra)] -#![cfg_attr( - all(target_arch = "wasm32", not(target_os = "emscripten")), - feature(integer_atomics, stdsimd) -)] +#![feature(allocator_api, rustc_private)] #![cfg_attr(any(unix, target_os = "redox"), feature(libc))] + // The minimum alignment guaranteed by the architecture. This value is used to // add fast paths for low alignment values. #[cfg(all(any(target_arch = "x86", target_arch = "arm", target_arch = "mips", target_arch = "powerpc", - target_arch = "powerpc64", - target_arch = "asmjs", - target_arch = "wasm32")))] -#[allow(dead_code)] + target_arch = "powerpc64")))] const MIN_ALIGN: usize = 8; #[cfg(all(any(target_arch = "x86_64", target_arch = "aarch64", target_arch = "mips64", target_arch = "s390x", target_arch = "sparc64")))] -#[allow(dead_code)] const MIN_ALIGN: usize = 16; -/// The default memory allocator provided by the operating system. -/// -/// This is based on `malloc` on Unix platforms and `HeapAlloc` on Windows, -/// plus related functions. -/// -/// This type can be used in a `static` item -/// with the `#[global_allocator]` attribute -/// to force the global allocator to be the system’s one. -/// (The default is jemalloc for executables, on some platforms.) -/// -/// ```rust -/// use std::alloc::System; -/// -/// #[global_allocator] -/// static A: System = System; -/// -/// fn main() { -/// let a = Box::new(4); // Allocates from the system allocator. -/// println!("{}", a); -/// } -/// ``` -/// -/// It can also be used directly to allocate memory -/// independently of the standard library’s global allocator. -#[stable(feature = "alloc_system_type", since = "1.28.0")] pub struct System; #[cfg(any(windows, unix, target_os = "redox"))] mod realloc_fallback { @@ -96,7 +54,6 @@ mod platform { use MIN_ALIGN; use System; use core::alloc::{GlobalAlloc, Layout}; - #[stable(feature = "alloc_system_type", since = "1.28.0")] unsafe impl GlobalAlloc for System { #[inline] unsafe fn alloc(&self, layout: Layout) -> *mut u8 { @@ -221,7 +178,6 @@ mod platform { }; ptr as *mut u8 } - #[stable(feature = "alloc_system_type", since = "1.28.0")] unsafe impl GlobalAlloc for System { #[inline] unsafe fn alloc(&self, layout: Layout) -> *mut u8 { @@ -254,89 +210,3 @@ mod platform { } } } -// This is an implementation of a global allocator on the wasm32 platform when -// emscripten is not in use. In that situation there's no actual runtime for us -// to lean on for allocation, so instead we provide our own! -// -// The wasm32 instruction set has two instructions for getting the current -// amount of memory and growing the amount of memory. These instructions are the -// foundation on which we're able to build an allocator, so we do so! Note that -// the instructions are also pretty "global" and this is the "global" allocator -// after all! -// -// The current allocator here is the `dlmalloc` crate which we've got included -// in the rust-lang/rust repository as a submodule. The crate is a port of -// dlmalloc.c from C to Rust and is basically just so we can have "pure Rust" -// for now which is currently technically required (can't link with C yet). -// -// The crate itself provides a global allocator which on wasm has no -// synchronization as there are no threads! -#[cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))] -mod platform { - extern crate dlmalloc; - use core::alloc::{GlobalAlloc, Layout}; - use System; - static mut DLMALLOC: dlmalloc::Dlmalloc = dlmalloc::DLMALLOC_INIT; - #[stable(feature = "alloc_system_type", since = "1.28.0")] - unsafe impl GlobalAlloc for System { - #[inline] - unsafe fn alloc(&self, layout: Layout) -> *mut u8 { - let _lock = lock::lock(); - DLMALLOC.malloc(layout.size(), layout.align()) - } - #[inline] - unsafe fn alloc_zeroed(&self, layout: Layout) -> *mut u8 { - let _lock = lock::lock(); - DLMALLOC.calloc(layout.size(), layout.align()) - } - #[inline] - unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout) { - let _lock = lock::lock(); - DLMALLOC.free(ptr, layout.size(), layout.align()) - } - #[inline] - unsafe fn realloc(&self, ptr: *mut u8, layout: Layout, new_size: usize) -> *mut u8 { - let _lock = lock::lock(); - DLMALLOC.realloc(ptr, layout.size(), layout.align(), new_size) - } - } - #[cfg(target_feature = "atomics")] - mod lock { - use core::arch::wasm32; - use core::sync::atomic::{AtomicI32, Ordering::SeqCst}; - static LOCKED: AtomicI32 = AtomicI32::new(0); - pub struct DropLock; - pub fn lock() -> DropLock { - loop { - if LOCKED.swap(1, SeqCst) == 0 { - return DropLock - } - unsafe { - let r = wasm32::atomic::wait_i32( - &LOCKED as *const AtomicI32 as *mut i32, - 1, // expected value - -1, // timeout - ); - debug_assert!(r == 0 || r == 1); - } - } - } - impl Drop for DropLock { - fn drop(&mut self) { - let r = LOCKED.swap(0, SeqCst); - debug_assert_eq!(r, 1); - unsafe { - wasm32::atomic::wake( - &LOCKED as *const AtomicI32 as *mut i32, - 1, // only one thread - ); - } - } - } - } - #[cfg(not(target_feature = "atomics"))] - mod lock { - #[inline] - pub fn lock() {} // no atomics, no threads, that's easy! - } -} diff --git a/compiler/rustc_codegen_cranelift/example/arbitrary_self_types_pointers_and_wrappers.rs b/compiler/rustc_codegen_cranelift/example/arbitrary_self_types_pointers_and_wrappers.rs index 0b0039a137..ddeb752f93 100644 --- a/compiler/rustc_codegen_cranelift/example/arbitrary_self_types_pointers_and_wrappers.rs +++ b/compiler/rustc_codegen_cranelift/example/arbitrary_self_types_pointers_and_wrappers.rs @@ -1,22 +1,12 @@ // Adapted from rustc run-pass test suite -#![feature(no_core, arbitrary_self_types, box_syntax)] +#![feature(arbitrary_self_types, unsize, coerce_unsized, dispatch_from_dyn)] #![feature(rustc_attrs)] -#![feature(start, lang_items)] -#![no_core] - -extern crate mini_core; - -use mini_core::*; - -macro_rules! assert_eq { - ($l:expr, $r: expr) => { - if $l != $r { - panic(stringify!($l != $r)); - } - } -} +use std::{ + ops::{Deref, CoerceUnsized, DispatchFromDyn}, + marker::Unsize, +}; struct Ptr(Box); @@ -67,16 +57,13 @@ impl Trait for i32 { } } -#[start] -fn main(_: isize, _: *const *const u8) -> isize { - let pw = Ptr(box Wrapper(5)) as Ptr>; +fn main() { + let pw = Ptr(Box::new(Wrapper(5))) as Ptr>; assert_eq!(pw.ptr_wrapper(), 5); - let wp = Wrapper(Ptr(box 6)) as Wrapper>; + let wp = Wrapper(Ptr(Box::new(6))) as Wrapper>; assert_eq!(wp.wrapper_ptr(), 6); - let wpw = Wrapper(Ptr(box Wrapper(7))) as Wrapper>>; + let wpw = Wrapper(Ptr(Box::new(Wrapper(7)))) as Wrapper>>; assert_eq!(wpw.wrapper_ptr_wrapper(), 7); - - 0 } diff --git a/compiler/rustc_codegen_cranelift/example/mini_core.rs b/compiler/rustc_codegen_cranelift/example/mini_core.rs index 002ec7e2e3..7c6d7fc106 100644 --- a/compiler/rustc_codegen_cranelift/example/mini_core.rs +++ b/compiler/rustc_codegen_cranelift/example/mini_core.rs @@ -365,6 +365,22 @@ impl PartialEq for Option { } } +#[lang = "shl"] +pub trait Shl { + type Output; + + #[must_use] + fn shl(self, rhs: RHS) -> Self::Output; +} + +impl Shl for u128 { + type Output = u128; + + fn shl(self, rhs: u128) -> u128 { + self << rhs + } +} + #[lang = "neg"] pub trait Neg { type Output; diff --git a/compiler/rustc_codegen_cranelift/example/mini_core_hello_world.rs b/compiler/rustc_codegen_cranelift/example/mini_core_hello_world.rs index 4a8375afac..237f4d11d5 100644 --- a/compiler/rustc_codegen_cranelift/example/mini_core_hello_world.rs +++ b/compiler/rustc_codegen_cranelift/example/mini_core_hello_world.rs @@ -264,6 +264,9 @@ fn main() { assert_eq!(f2 as i8, -128); assert_eq!(f2 as u8, 0); + let amount = 0; + assert_eq!(1u128 << amount, 1); + static ANOTHER_STATIC: &u8 = &A_STATIC; assert_eq!(*ANOTHER_STATIC, 42); diff --git a/compiler/rustc_codegen_cranelift/patches/0022-core-Disable-not-compiling-tests.patch b/compiler/rustc_codegen_cranelift/patches/0022-core-Disable-not-compiling-tests.patch index 3eb10069ad..8cfffe580a 100644 --- a/compiler/rustc_codegen_cranelift/patches/0022-core-Disable-not-compiling-tests.patch +++ b/compiler/rustc_codegen_cranelift/patches/0022-core-Disable-not-compiling-tests.patch @@ -119,21 +119,5 @@ index 6609bc3..241b497 100644 #[test] #[should_panic(expected = "index 0 greater than length of slice")] -diff --git a/library/core/tests/num/ops.rs b/library/core/tests/num/ops.rs -index 9979cc8..d5d1d83 100644 ---- a/library/core/tests/num/ops.rs -+++ b/library/core/tests/num/ops.rs -@@ -238,7 +238,7 @@ macro_rules! test_shift_assign { - } - }; - } --test_shift!(test_shl_defined, Shl::shl); --test_shift_assign!(test_shl_assign_defined, ShlAssign::shl_assign); --test_shift!(test_shr_defined, Shr::shr); --test_shift_assign!(test_shr_assign_defined, ShrAssign::shr_assign); -+//test_shift!(test_shl_defined, Shl::shl); -+//test_shift_assign!(test_shl_assign_defined, ShlAssign::shl_assign); -+//test_shift!(test_shr_defined, Shr::shr); -+//test_shift_assign!(test_shr_assign_defined, ShrAssign::shr_assign); -- 2.21.0 (Apple Git-122) diff --git a/compiler/rustc_codegen_cranelift/patches/0027-Disable-128bit-atomic-operations.patch b/compiler/rustc_codegen_cranelift/patches/0027-Disable-128bit-atomic-operations.patch new file mode 100644 index 0000000000..32e5930969 --- /dev/null +++ b/compiler/rustc_codegen_cranelift/patches/0027-Disable-128bit-atomic-operations.patch @@ -0,0 +1,103 @@ +From 894e07dfec2624ba539129b1c1d63e1d7d812bda Mon Sep 17 00:00:00 2001 +From: bjorn3 +Date: Thu, 18 Feb 2021 18:45:28 +0100 +Subject: [PATCH] Disable 128bit atomic operations + +Cranelift doesn't support them yet +--- + library/core/src/sync/atomic.rs | 38 --------------------------------- + library/core/tests/atomic.rs | 4 ---- + library/std/src/panic.rs | 6 ------ + 3 files changed, 48 deletions(-) + +diff --git a/library/core/src/sync/atomic.rs b/library/core/src/sync/atomic.rs +index 81c9e1d..65c9503 100644 +--- a/library/core/src/sync/atomic.rs ++++ b/library/core/src/sync/atomic.rs +@@ -2228,44 +2228,6 @@ atomic_int! { + "AtomicU64::new(0)", + u64 AtomicU64 ATOMIC_U64_INIT + } +-#[cfg(target_has_atomic_load_store = "128")] +-atomic_int! { +- cfg(target_has_atomic = "128"), +- cfg(target_has_atomic_equal_alignment = "128"), +- unstable(feature = "integer_atomics", issue = "32976"), +- unstable(feature = "integer_atomics", issue = "32976"), +- unstable(feature = "integer_atomics", issue = "32976"), +- unstable(feature = "integer_atomics", issue = "32976"), +- unstable(feature = "integer_atomics", issue = "32976"), +- unstable(feature = "integer_atomics", issue = "32976"), +- rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), +- unstable(feature = "integer_atomics", issue = "32976"), +- "i128", +- "#![feature(integer_atomics)]\n\n", +- atomic_min, atomic_max, +- 16, +- "AtomicI128::new(0)", +- i128 AtomicI128 ATOMIC_I128_INIT +-} +-#[cfg(target_has_atomic_load_store = "128")] +-atomic_int! { +- cfg(target_has_atomic = "128"), +- cfg(target_has_atomic_equal_alignment = "128"), +- unstable(feature = "integer_atomics", issue = "32976"), +- unstable(feature = "integer_atomics", issue = "32976"), +- unstable(feature = "integer_atomics", issue = "32976"), +- unstable(feature = "integer_atomics", issue = "32976"), +- unstable(feature = "integer_atomics", issue = "32976"), +- unstable(feature = "integer_atomics", issue = "32976"), +- rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), +- unstable(feature = "integer_atomics", issue = "32976"), +- "u128", +- "#![feature(integer_atomics)]\n\n", +- atomic_umin, atomic_umax, +- 16, +- "AtomicU128::new(0)", +- u128 AtomicU128 ATOMIC_U128_INIT +-} + + macro_rules! atomic_int_ptr_sized { + ( $($target_pointer_width:literal $align:literal)* ) => { $( +diff --git a/library/core/tests/atomic.rs b/library/core/tests/atomic.rs +index 2d1e449..cb6da5d 100644 +--- a/library/core/tests/atomic.rs ++++ b/library/core/tests/atomic.rs +@@ -145,10 +145,6 @@ fn atomic_alignment() { + assert_eq!(align_of::(), size_of::()); + #[cfg(target_has_atomic = "64")] + assert_eq!(align_of::(), size_of::()); +- #[cfg(target_has_atomic = "128")] +- assert_eq!(align_of::(), size_of::()); +- #[cfg(target_has_atomic = "128")] +- assert_eq!(align_of::(), size_of::()); + #[cfg(target_has_atomic = "ptr")] + assert_eq!(align_of::(), size_of::()); + #[cfg(target_has_atomic = "ptr")] +diff --git a/library/std/src/panic.rs b/library/std/src/panic.rs +index 89a822a..779fd88 100644 +--- a/library/std/src/panic.rs ++++ b/library/std/src/panic.rs +@@ -279,9 +279,6 @@ impl RefUnwindSafe for atomic::AtomicI32 {} + #[cfg(target_has_atomic_load_store = "64")] + #[stable(feature = "integer_atomics_stable", since = "1.34.0")] + impl RefUnwindSafe for atomic::AtomicI64 {} +-#[cfg(target_has_atomic_load_store = "128")] +-#[unstable(feature = "integer_atomics", issue = "32976")] +-impl RefUnwindSafe for atomic::AtomicI128 {} + + #[cfg(target_has_atomic_load_store = "ptr")] + #[stable(feature = "unwind_safe_atomic_refs", since = "1.14.0")] +@@ -298,9 +295,6 @@ impl RefUnwindSafe for atomic::AtomicU32 {} + #[cfg(target_has_atomic_load_store = "64")] + #[stable(feature = "integer_atomics_stable", since = "1.34.0")] + impl RefUnwindSafe for atomic::AtomicU64 {} +-#[cfg(target_has_atomic_load_store = "128")] +-#[unstable(feature = "integer_atomics", issue = "32976")] +-impl RefUnwindSafe for atomic::AtomicU128 {} + + #[cfg(target_has_atomic_load_store = "8")] + #[stable(feature = "unwind_safe_atomic_refs", since = "1.14.0")] +-- +2.26.2.7.g19db9cfb68 + diff --git a/compiler/rustc_codegen_cranelift/prepare.sh b/compiler/rustc_codegen_cranelift/prepare.sh index 08e7cb1802..ee995ffcfa 100755 --- a/compiler/rustc_codegen_cranelift/prepare.sh +++ b/compiler/rustc_codegen_cranelift/prepare.sh @@ -1,4 +1,4 @@ -#!/bin/bash --verbose +#!/usr/bin/env bash set -e rustup component add rust-src rustc-dev llvm-tools-preview diff --git a/compiler/rustc_codegen_cranelift/rust-toolchain b/compiler/rustc_codegen_cranelift/rust-toolchain index a08f00d19c..908ca52135 100644 --- a/compiler/rustc_codegen_cranelift/rust-toolchain +++ b/compiler/rustc_codegen_cranelift/rust-toolchain @@ -1 +1 @@ -nightly-2021-01-30 +nightly-2021-03-05 diff --git a/compiler/rustc_codegen_cranelift/rustfmt.toml b/compiler/rustc_codegen_cranelift/rustfmt.toml new file mode 100644 index 0000000000..2bd8f7d1bc --- /dev/null +++ b/compiler/rustc_codegen_cranelift/rustfmt.toml @@ -0,0 +1,4 @@ +# Matches rustfmt.toml of rustc +version = "Two" +use_small_heuristics = "Max" +merge_derives = false diff --git a/compiler/rustc_codegen_cranelift/scripts/cargo.sh b/compiler/rustc_codegen_cranelift/scripts/cargo.sh index a3d6d30305..669d2d45b7 100755 --- a/compiler/rustc_codegen_cranelift/scripts/cargo.sh +++ b/compiler/rustc_codegen_cranelift/scripts/cargo.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash dir=$(dirname "$0") source "$dir/config.sh" diff --git a/compiler/rustc_codegen_cranelift/scripts/config.sh b/compiler/rustc_codegen_cranelift/scripts/config.sh index 834708aa9a..c2ed2bf256 100644 --- a/compiler/rustc_codegen_cranelift/scripts/config.sh +++ b/compiler/rustc_codegen_cranelift/scripts/config.sh @@ -3,7 +3,7 @@ set -e unamestr=$(uname) -if [[ "$unamestr" == 'Linux' ]]; then +if [[ "$unamestr" == 'Linux' || "$unamestr" == 'FreeBSD' ]]; then dylib_ext='so' elif [[ "$unamestr" == 'Darwin' ]]; then dylib_ext='dylib' @@ -26,7 +26,7 @@ export RUSTC=$dir"/bin/cg_clif" export RUSTDOCFLAGS=$linker' -Cpanic=abort -Zpanic-abort-tests '\ '-Zcodegen-backend='$dir'/lib/librustc_codegen_cranelift.'$dylib_ext' --sysroot '$dir -# FIXME remove once the atomic shim is gone +# FIXME fix `#[linkage = "extern_weak"]` without this if [[ "$unamestr" == 'Darwin' ]]; then export RUSTFLAGS="$RUSTFLAGS -Clink-arg=-undefined -Clink-arg=dynamic_lookup" fi diff --git a/compiler/rustc_codegen_cranelift/scripts/rustup.sh b/compiler/rustc_codegen_cranelift/scripts/rustup.sh index 430f5c469b..694945a87c 100755 --- a/compiler/rustc_codegen_cranelift/scripts/rustup.sh +++ b/compiler/rustc_codegen_cranelift/scripts/rustup.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -e diff --git a/compiler/rustc_codegen_cranelift/scripts/test_bootstrap.sh b/compiler/rustc_codegen_cranelift/scripts/test_bootstrap.sh index db69541b22..6473c6ad67 100755 --- a/compiler/rustc_codegen_cranelift/scripts/test_bootstrap.sh +++ b/compiler/rustc_codegen_cranelift/scripts/test_bootstrap.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -e cd "$(dirname "$0")/../" @@ -14,21 +14,18 @@ git checkout -- . git checkout "$(rustc -V | cut -d' ' -f3 | tr -d '(')" git apply - < config.toml <) { +pub(super) fn add_args_header_comment(fx: &mut FunctionCx<'_, '_, '_>) { fx.add_global_comment( "kind loc.idx param pass mode ty".to_string(), ); } pub(super) fn add_arg_comment<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, kind: &str, local: Option, local_field: Option, @@ -42,11 +42,7 @@ pub(super) fn add_arg_comment<'tcx>( [param_a, param_b] => Cow::Owned(format!("= {:?},{:?}", param_a, param_b)), params => Cow::Owned(format!( "= {}", - params - .iter() - .map(ToString::to_string) - .collect::>() - .join(",") + params.iter().map(ToString::to_string).collect::>().join(",") )), }; @@ -62,7 +58,7 @@ pub(super) fn add_arg_comment<'tcx>( )); } -pub(super) fn add_locals_header_comment(fx: &mut FunctionCx<'_, '_, impl Module>) { +pub(super) fn add_locals_header_comment(fx: &mut FunctionCx<'_, '_, '_>) { fx.add_global_comment(String::new()); fx.add_global_comment( "kind local ty size align (abi,pref)".to_string(), @@ -70,19 +66,13 @@ pub(super) fn add_locals_header_comment(fx: &mut FunctionCx<'_, '_, impl Module> } pub(super) fn add_local_place_comments<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, place: CPlace<'tcx>, local: Local, ) { let TyAndLayout { ty, layout } = place.layout(); - let rustc_target::abi::Layout { - size, - align, - abi: _, - variants: _, - fields: _, - largest_niche: _, - } = layout; + let rustc_target::abi::Layout { size, align, abi: _, variants: _, fields: _, largest_niche: _ } = + layout; let (kind, extra) = match *place.inner() { CPlaceInner::Var(place_local, var) => { @@ -91,10 +81,7 @@ pub(super) fn add_local_place_comments<'tcx>( } CPlaceInner::VarPair(place_local, var1, var2) => { assert_eq!(local, place_local); - ( - "ssa", - Cow::Owned(format!(",var=({}, {})", var1.index(), var2.index())), - ) + ("ssa", Cow::Owned(format!(",var=({}, {})", var1.index(), var2.index()))) } CPlaceInner::VarLane(_local, _var, _lane) => unreachable!(), CPlaceInner::Addr(ptr, meta) => { @@ -104,18 +91,15 @@ pub(super) fn add_local_place_comments<'tcx>( Cow::Borrowed("") }; match ptr.base_and_offset() { - (crate::pointer::PointerBase::Addr(addr), offset) => ( - "reuse", - format!("storage={}{}{}", addr, offset, meta).into(), - ), - (crate::pointer::PointerBase::Stack(stack_slot), offset) => ( - "stack", - format!("storage={}{}{}", stack_slot, offset, meta).into(), - ), - (crate::pointer::PointerBase::Dangling(align), offset) => ( - "zst", - format!("align={},offset={}", align.bytes(), offset).into(), - ), + (crate::pointer::PointerBase::Addr(addr), offset) => { + ("reuse", format!("storage={}{}{}", addr, offset, meta).into()) + } + (crate::pointer::PointerBase::Stack(stack_slot), offset) => { + ("stack", format!("storage={}{}{}", stack_slot, offset, meta).into()) + } + (crate::pointer::PointerBase::Dangling(align), offset) => { + ("zst", format!("align={},offset={}", align.bytes(), offset).into()) + } } } }; @@ -128,11 +112,7 @@ pub(super) fn add_local_place_comments<'tcx>( size.bytes(), align.abi.bytes(), align.pref.bytes(), - if extra.is_empty() { - "" - } else { - " " - }, + if extra.is_empty() { "" } else { " " }, extra, )); } diff --git a/compiler/rustc_codegen_cranelift/src/abi/mod.rs b/compiler/rustc_codegen_cranelift/src/abi/mod.rs index b2647e6c8d..b158d73f3a 100644 --- a/compiler/rustc_codegen_cranelift/src/abi/mod.rs +++ b/compiler/rustc_codegen_cranelift/src/abi/mod.rs @@ -38,25 +38,15 @@ fn clif_sig_from_fn_abi<'tcx>( | Conv::X86VectorCall | Conv::AmdGpuKernel | Conv::AvrInterrupt - | Conv::AvrNonBlockingInterrupt => { - todo!("{:?}", fn_abi.conv) - } + | Conv::AvrNonBlockingInterrupt => todo!("{:?}", fn_abi.conv), }; - let inputs = fn_abi - .args - .iter() - .map(|arg_abi| arg_abi.get_abi_param(tcx).into_iter()) - .flatten(); + let inputs = fn_abi.args.iter().map(|arg_abi| arg_abi.get_abi_param(tcx).into_iter()).flatten(); let (return_ptr, returns) = fn_abi.ret.get_abi_return(tcx); // Sometimes the first param is an pointer to the place where the return value needs to be stored. let params: Vec<_> = return_ptr.into_iter().chain(inputs).collect(); - Signature { - params, - returns, - call_conv, - } + Signature { params, returns, call_conv } } pub(crate) fn get_function_sig<'tcx>( @@ -65,34 +55,25 @@ pub(crate) fn get_function_sig<'tcx>( inst: Instance<'tcx>, ) -> Signature { assert!(!inst.substs.needs_infer()); - clif_sig_from_fn_abi( - tcx, - triple, - &FnAbi::of_instance(&RevealAllLayoutCx(tcx), inst, &[]), - ) + clif_sig_from_fn_abi(tcx, triple, &FnAbi::of_instance(&RevealAllLayoutCx(tcx), inst, &[])) } /// Instance must be monomorphized pub(crate) fn import_function<'tcx>( tcx: TyCtxt<'tcx>, - module: &mut impl Module, + module: &mut dyn Module, inst: Instance<'tcx>, ) -> FuncId { let name = tcx.symbol_name(inst).name.to_string(); let sig = get_function_sig(tcx, module.isa().triple(), inst); - module - .declare_function(&name, Linkage::Import, &sig) - .unwrap() + module.declare_function(&name, Linkage::Import, &sig).unwrap() } -impl<'tcx, M: Module> FunctionCx<'_, 'tcx, M> { +impl<'tcx> FunctionCx<'_, '_, 'tcx> { /// Instance must be monomorphized pub(crate) fn get_function_ref(&mut self, inst: Instance<'tcx>) -> FuncRef { - let func_id = import_function(self.tcx, &mut self.cx.module, inst); - let func_ref = self - .cx - .module - .declare_func_in_func(func_id, &mut self.bcx.func); + let func_id = import_function(self.tcx, self.cx.module, inst); + let func_ref = self.cx.module.declare_func_in_func(func_id, &mut self.bcx.func); #[cfg(debug_assertions)] self.add_comment(func_ref, format!("{:?}", inst)); @@ -107,20 +88,9 @@ impl<'tcx, M: Module> FunctionCx<'_, 'tcx, M> { returns: Vec, args: &[Value], ) -> &[Value] { - let sig = Signature { - params, - returns, - call_conv: CallConv::triple_default(self.triple()), - }; - let func_id = self - .cx - .module - .declare_function(&name, Linkage::Import, &sig) - .unwrap(); - let func_ref = self - .cx - .module - .declare_func_in_func(func_id, &mut self.bcx.func); + let sig = Signature { params, returns, call_conv: CallConv::triple_default(self.triple()) }; + let func_id = self.cx.module.declare_function(&name, Linkage::Import, &sig).unwrap(); + let func_ref = self.cx.module.declare_func_in_func(func_id, &mut self.bcx.func); let call_inst = self.bcx.ins().call(func_ref, args); #[cfg(debug_assertions)] { @@ -140,17 +110,12 @@ impl<'tcx, M: Module> FunctionCx<'_, 'tcx, M> { let (input_tys, args): (Vec<_>, Vec<_>) = args .iter() .map(|arg| { - ( - AbiParam::new(self.clif_type(arg.layout().ty).unwrap()), - arg.load_scalar(self), - ) + (AbiParam::new(self.clif_type(arg.layout().ty).unwrap()), arg.load_scalar(self)) }) .unzip(); let return_layout = self.layout_of(return_ty); let return_tys = if let ty::Tuple(tup) = return_ty.kind() { - tup.types() - .map(|ty| AbiParam::new(self.clif_type(ty).unwrap())) - .collect() + tup.types().map(|ty| AbiParam::new(self.clif_type(ty).unwrap())).collect() } else { vec![AbiParam::new(self.clif_type(return_ty).unwrap())] }; @@ -169,7 +134,7 @@ impl<'tcx, M: Module> FunctionCx<'_, 'tcx, M> { /// Make a [`CPlace`] capable of holding value of the specified type. fn make_local_place<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, local: Local, layout: TyAndLayout<'tcx>, is_ssa: bool, @@ -190,10 +155,7 @@ fn make_local_place<'tcx>( place } -pub(crate) fn codegen_fn_prelude<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, - start_block: Block, -) { +pub(crate) fn codegen_fn_prelude<'tcx>(fx: &mut FunctionCx<'_, '_, 'tcx>, start_block: Block) { fx.bcx.append_block_params_for_function_params(start_block); fx.bcx.switch_to_block(start_block); @@ -204,13 +166,7 @@ pub(crate) fn codegen_fn_prelude<'tcx>( #[cfg(debug_assertions)] self::comments::add_args_header_comment(fx); - let mut block_params_iter = fx - .bcx - .func - .dfg - .block_params(start_block) - .to_vec() - .into_iter(); + let mut block_params_iter = fx.bcx.func.dfg.block_params(start_block).to_vec().into_iter(); let ret_place = self::returning::codegen_return_param(fx, &ssa_analyzed, &mut block_params_iter); assert_eq!(fx.local_map.push(ret_place), RETURN_PLACE); @@ -286,10 +242,10 @@ pub(crate) fn codegen_fn_prelude<'tcx>( if let Some((addr, meta)) = val.try_to_ptr() { let local_decl = &fx.mir.local_decls[local]; // v this ! is important - let internally_mutable = !val.layout().ty.is_freeze( - fx.tcx.at(local_decl.source_info.span), - ParamEnv::reveal_all(), - ); + let internally_mutable = !val + .layout() + .ty + .is_freeze(fx.tcx.at(local_decl.source_info.span), ParamEnv::reveal_all()); if local_decl.mutability == mir::Mutability::Not && !internally_mutable { // We wont mutate this argument, so it is fine to borrow the backing storage // of this argument, to prevent a copy. @@ -321,9 +277,7 @@ pub(crate) fn codegen_fn_prelude<'tcx>( ArgKind::Spread(params) => { for (i, param) in params.into_iter().enumerate() { if let Some(param) = param { - place - .place_field(fx, mir::Field::new(i)) - .write_cvalue(fx, param); + place.place_field(fx, mir::Field::new(i)).write_cvalue(fx, param); } } } @@ -340,13 +294,11 @@ pub(crate) fn codegen_fn_prelude<'tcx>( assert_eq!(fx.local_map.push(place), local); } - fx.bcx - .ins() - .jump(*fx.block_map.get(START_BLOCK).unwrap(), &[]); + fx.bcx.ins().jump(*fx.block_map.get(START_BLOCK).unwrap(), &[]); } pub(crate) fn codegen_terminator_call<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, span: Span, current_block: Block, func: &Operand<'tcx>, @@ -354,9 +306,8 @@ pub(crate) fn codegen_terminator_call<'tcx>( destination: Option<(Place<'tcx>, BasicBlock)>, ) { let fn_ty = fx.monomorphize(func.ty(fx.mir, fx.tcx)); - let fn_sig = fx - .tcx - .normalize_erasing_late_bound_regions(ParamEnv::reveal_all(), fn_ty.fn_sig(fx.tcx)); + let fn_sig = + fx.tcx.normalize_erasing_late_bound_regions(ParamEnv::reveal_all(), fn_ty.fn_sig(fx.tcx)); let destination = destination.map(|(place, bb)| (codegen_place(fx, place), bb)); @@ -404,20 +355,11 @@ pub(crate) fn codegen_terminator_call<'tcx>( let fn_abi = if let Some(instance) = instance { FnAbi::of_instance(&RevealAllLayoutCx(fx.tcx), instance, &extra_args) } else { - FnAbi::of_fn_ptr( - &RevealAllLayoutCx(fx.tcx), - fn_ty.fn_sig(fx.tcx), - &extra_args, - ) + FnAbi::of_fn_ptr(&RevealAllLayoutCx(fx.tcx), fn_ty.fn_sig(fx.tcx), &extra_args) }; let is_cold = instance - .map(|inst| { - fx.tcx - .codegen_fn_attrs(inst.def_id()) - .flags - .contains(CodegenFnAttrFlags::COLD) - }) + .map(|inst| fx.tcx.codegen_fn_attrs(inst.def_id()).flags.contains(CodegenFnAttrFlags::COLD)) .unwrap_or(false); if is_cold { fx.cold_blocks.insert(current_block); @@ -441,9 +383,7 @@ pub(crate) fn codegen_terminator_call<'tcx>( } args } else { - args.iter() - .map(|arg| codegen_operand(fx, arg)) - .collect::>() + args.iter().map(|arg| codegen_operand(fx, arg)).collect::>() }; // | indirect call target @@ -451,10 +391,7 @@ pub(crate) fn codegen_terminator_call<'tcx>( // v v let (func_ref, first_arg) = match instance { // Trait object call - Some(Instance { - def: InstanceDef::Virtual(_, idx), - .. - }) => { + Some(Instance { def: InstanceDef::Virtual(_, idx), .. }) => { #[cfg(debug_assertions)] { let nop_inst = fx.bcx.ins().nop(); @@ -511,10 +448,7 @@ pub(crate) fn codegen_terminator_call<'tcx>( ) .collect::>(); - if instance - .map(|inst| inst.def.requires_caller_location(fx.tcx)) - .unwrap_or(false) - { + if instance.map(|inst| inst.def.requires_caller_location(fx.tcx)).unwrap_or(false) { // Pass the caller location for `#[track_caller]`. let caller_location = fx.get_caller_location(span); call_args.extend( @@ -542,7 +476,7 @@ pub(crate) fn codegen_terminator_call<'tcx>( // FIXME find a cleaner way to support varargs if fn_sig.c_variadic { - if fn_sig.abi != Abi::C { + if !matches!(fn_sig.abi, Abi::C { .. }) { fx.tcx.sess.span_fatal( span, &format!("Variadic call for non-C abi {:?}", fn_sig.abi), @@ -555,9 +489,7 @@ pub(crate) fn codegen_terminator_call<'tcx>( let ty = fx.bcx.func.dfg.value_type(arg); if !ty.is_int() { // FIXME set %al to upperbound on float args once floats are supported - fx.tcx - .sess - .span_fatal(span, &format!("Non int ty {:?} for variadic call", ty)); + fx.tcx.sess.span_fatal(span, &format!("Non int ty {:?} for variadic call", ty)); } AbiParam::new(ty) }) @@ -574,7 +506,7 @@ pub(crate) fn codegen_terminator_call<'tcx>( } pub(crate) fn codegen_drop<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, span: Span, drop_place: CPlace<'tcx>, ) { @@ -611,10 +543,7 @@ pub(crate) fn codegen_drop<'tcx>( fx, fx.layout_of(fx.tcx.mk_ref( &ty::RegionKind::ReErased, - TypeAndMut { - ty, - mutbl: crate::rustc_hir::Mutability::Mut, - }, + TypeAndMut { ty, mutbl: crate::rustc_hir::Mutability::Mut }, )), ); let arg_value = adjust_arg_for_abi(fx, arg_value, &fn_abi.args[0]); diff --git a/compiler/rustc_codegen_cranelift/src/abi/pass_mode.rs b/compiler/rustc_codegen_cranelift/src/abi/pass_mode.rs index 1202c23dbe..d58f952f53 100644 --- a/compiler/rustc_codegen_cranelift/src/abi/pass_mode.rs +++ b/compiler/rustc_codegen_cranelift/src/abi/pass_mode.rs @@ -71,12 +71,7 @@ fn cast_target_to_abi_params(cast: CastTarget) -> SmallVec<[AbiParam; 2]> { .prefix .iter() .flatten() - .map(|&kind| { - reg_to_abi_param(Reg { - kind, - size: cast.prefix_chunk_size, - }) - }) + .map(|&kind| reg_to_abi_param(Reg { kind, size: cast.prefix_chunk_size })) .chain((0..rest_count).map(|_| reg_to_abi_param(cast.rest.unit))) .collect::>(); @@ -98,12 +93,10 @@ impl<'tcx> ArgAbiExt<'tcx> for ArgAbi<'tcx, Ty<'tcx>> { match self.mode { PassMode::Ignore => smallvec![], PassMode::Direct(attrs) => match &self.layout.abi { - Abi::Scalar(scalar) => { - smallvec![apply_arg_attrs_to_abi_param( - AbiParam::new(scalar_to_clif_type(tcx, scalar.clone())), - attrs - )] - } + Abi::Scalar(scalar) => smallvec![apply_arg_attrs_to_abi_param( + AbiParam::new(scalar_to_clif_type(tcx, scalar.clone())), + attrs + )], Abi::Vector { .. } => { let vector_ty = crate::intrinsics::clif_vector_type(tcx, self.layout).unwrap(); smallvec![AbiParam::new(vector_ty)] @@ -122,11 +115,7 @@ impl<'tcx> ArgAbiExt<'tcx> for ArgAbi<'tcx, Ty<'tcx>> { _ => unreachable!("{:?}", self.layout.abi), }, PassMode::Cast(cast) => cast_target_to_abi_params(cast), - PassMode::Indirect { - attrs, - extra_attrs: None, - on_stack, - } => { + PassMode::Indirect { attrs, extra_attrs: None, on_stack } => { if on_stack { let size = u32::try_from(self.layout.size.bytes()).unwrap(); smallvec![apply_arg_attrs_to_abi_param( @@ -134,17 +123,10 @@ impl<'tcx> ArgAbiExt<'tcx> for ArgAbi<'tcx, Ty<'tcx>> { attrs )] } else { - smallvec![apply_arg_attrs_to_abi_param( - AbiParam::new(pointer_ty(tcx)), - attrs - )] + smallvec![apply_arg_attrs_to_abi_param(AbiParam::new(pointer_ty(tcx)), attrs)] } } - PassMode::Indirect { - attrs, - extra_attrs: Some(extra_attrs), - on_stack, - } => { + PassMode::Indirect { attrs, extra_attrs: Some(extra_attrs), on_stack } => { assert!(!on_stack); smallvec![ apply_arg_attrs_to_abi_param(AbiParam::new(pointer_ty(tcx)), attrs), @@ -158,10 +140,9 @@ impl<'tcx> ArgAbiExt<'tcx> for ArgAbi<'tcx, Ty<'tcx>> { match self.mode { PassMode::Ignore => (None, vec![]), PassMode::Direct(_) => match &self.layout.abi { - Abi::Scalar(scalar) => ( - None, - vec![AbiParam::new(scalar_to_clif_type(tcx, scalar.clone()))], - ), + Abi::Scalar(scalar) => { + (None, vec![AbiParam::new(scalar_to_clif_type(tcx, scalar.clone()))]) + } Abi::Vector { .. } => { let vector_ty = crate::intrinsics::clif_vector_type(tcx, self.layout).unwrap(); (None, vec![AbiParam::new(vector_ty)]) @@ -177,31 +158,19 @@ impl<'tcx> ArgAbiExt<'tcx> for ArgAbi<'tcx, Ty<'tcx>> { _ => unreachable!("{:?}", self.layout.abi), }, PassMode::Cast(cast) => (None, cast_target_to_abi_params(cast).into_iter().collect()), - PassMode::Indirect { - attrs: _, - extra_attrs: None, - on_stack, - } => { + PassMode::Indirect { attrs: _, extra_attrs: None, on_stack } => { assert!(!on_stack); - ( - Some(AbiParam::special( - pointer_ty(tcx), - ArgumentPurpose::StructReturn, - )), - vec![], - ) + (Some(AbiParam::special(pointer_ty(tcx), ArgumentPurpose::StructReturn)), vec![]) + } + PassMode::Indirect { attrs: _, extra_attrs: Some(_), on_stack: _ } => { + unreachable!("unsized return value") } - PassMode::Indirect { - attrs: _, - extra_attrs: Some(_), - on_stack: _, - } => unreachable!("unsized return value"), } } } pub(super) fn to_casted_value<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, arg: CValue<'tcx>, cast: CastTarget, ) -> SmallVec<[Value; 2]> { @@ -211,9 +180,7 @@ pub(super) fn to_casted_value<'tcx>( cast_target_to_abi_params(cast) .into_iter() .map(|param| { - let val = ptr - .offset_i64(fx, offset) - .load(fx, param.value_type, MemFlags::new()); + let val = ptr.offset_i64(fx, offset).load(fx, param.value_type, MemFlags::new()); offset += i64::from(param.value_type.bytes()); val }) @@ -221,16 +188,13 @@ pub(super) fn to_casted_value<'tcx>( } pub(super) fn from_casted_value<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, block_params: &[Value], layout: TyAndLayout<'tcx>, cast: CastTarget, ) -> CValue<'tcx> { let abi_params = cast_target_to_abi_params(cast); - let abi_param_size: u32 = abi_params - .iter() - .map(|param| param.value_type.bytes()) - .sum(); + let abi_param_size: u32 = abi_params.iter().map(|param| param.value_type.bytes()).sum(); let layout_size = u32::try_from(layout.size.bytes()).unwrap(); let stack_slot = fx.bcx.create_stack_slot(StackSlotData { kind: StackSlotKind::ExplicitSlot, @@ -260,7 +224,7 @@ pub(super) fn from_casted_value<'tcx>( /// Get a set of values to be passed as function arguments. pub(super) fn adjust_arg_for_abi<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, arg: CValue<'tcx>, arg_abi: &ArgAbi<'tcx, Ty<'tcx>>, ) -> SmallVec<[Value; 2]> { @@ -283,7 +247,7 @@ pub(super) fn adjust_arg_for_abi<'tcx>( /// Create a [`CValue`] containing the value of a function parameter adding clif function parameters /// as necessary. pub(super) fn cvalue_for_param<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, #[cfg_attr(not(debug_assertions), allow(unused_variables))] local: Option, #[cfg_attr(not(debug_assertions), allow(unused_variables))] local_field: Option, arg_abi: &ArgAbi<'tcx, Ty<'tcx>>, @@ -294,10 +258,7 @@ pub(super) fn cvalue_for_param<'tcx>( .into_iter() .map(|abi_param| { let block_param = block_params_iter.next().unwrap(); - assert_eq!( - fx.bcx.func.dfg.value_type(block_param), - abi_param.value_type - ); + assert_eq!(fx.bcx.func.dfg.value_type(block_param), abi_param.value_type); block_param }) .collect::>(); @@ -321,29 +282,14 @@ pub(super) fn cvalue_for_param<'tcx>( } PassMode::Pair(_, _) => { assert_eq!(block_params.len(), 2, "{:?}", block_params); - Some(CValue::by_val_pair( - block_params[0], - block_params[1], - arg_abi.layout, - )) + Some(CValue::by_val_pair(block_params[0], block_params[1], arg_abi.layout)) } PassMode::Cast(cast) => Some(from_casted_value(fx, &block_params, arg_abi.layout, cast)), - PassMode::Indirect { - attrs: _, - extra_attrs: None, - on_stack: _, - } => { + PassMode::Indirect { attrs: _, extra_attrs: None, on_stack: _ } => { assert_eq!(block_params.len(), 1, "{:?}", block_params); - Some(CValue::by_ref( - Pointer::new(block_params[0]), - arg_abi.layout, - )) + Some(CValue::by_ref(Pointer::new(block_params[0]), arg_abi.layout)) } - PassMode::Indirect { - attrs: _, - extra_attrs: Some(_), - on_stack: _, - } => { + PassMode::Indirect { attrs: _, extra_attrs: Some(_), on_stack: _ } => { assert_eq!(block_params.len(), 2, "{:?}", block_params); Some(CValue::by_ref_unsized( Pointer::new(block_params[0]), diff --git a/compiler/rustc_codegen_cranelift/src/abi/returning.rs b/compiler/rustc_codegen_cranelift/src/abi/returning.rs index a382963bf1..9fa066df69 100644 --- a/compiler/rustc_codegen_cranelift/src/abi/returning.rs +++ b/compiler/rustc_codegen_cranelift/src/abi/returning.rs @@ -8,14 +8,13 @@ use smallvec::{smallvec, SmallVec}; /// Can the given type be returned into an ssa var or does it need to be returned on the stack. pub(crate) fn can_return_to_ssa_var<'tcx>( - fx: &FunctionCx<'_, 'tcx, impl Module>, + fx: &FunctionCx<'_, '_, 'tcx>, func: &mir::Operand<'tcx>, args: &[mir::Operand<'tcx>], ) -> bool { let fn_ty = fx.monomorphize(func.ty(fx.mir, fx.tcx)); - let fn_sig = fx - .tcx - .normalize_erasing_late_bound_regions(ParamEnv::reveal_all(), fn_ty.fn_sig(fx.tcx)); + let fn_sig = + fx.tcx.normalize_erasing_late_bound_regions(ParamEnv::reveal_all(), fn_ty.fn_sig(fx.tcx)); // Handle special calls like instrinsics and empty drop glue. let instance = if let ty::FnDef(def_id, substs) = *fn_ty.kind() { @@ -42,11 +41,7 @@ pub(crate) fn can_return_to_ssa_var<'tcx>( let fn_abi = if let Some(instance) = instance { FnAbi::of_instance(&RevealAllLayoutCx(fx.tcx), instance, &extra_args) } else { - FnAbi::of_fn_ptr( - &RevealAllLayoutCx(fx.tcx), - fn_ty.fn_sig(fx.tcx), - &extra_args, - ) + FnAbi::of_fn_ptr(&RevealAllLayoutCx(fx.tcx), fn_ty.fn_sig(fx.tcx), &extra_args) }; match fn_abi.ret.mode { PassMode::Ignore | PassMode::Direct(_) | PassMode::Pair(_, _) => true, @@ -58,15 +53,12 @@ pub(crate) fn can_return_to_ssa_var<'tcx>( /// Return a place where the return value of the current function can be written to. If necessary /// this adds an extra parameter pointing to where the return value needs to be stored. pub(super) fn codegen_return_param<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, ssa_analyzed: &rustc_index::vec::IndexVec, block_params_iter: &mut impl Iterator, ) -> CPlace<'tcx> { let (ret_place, ret_param): (_, SmallVec<[_; 2]>) = match fx.fn_abi.as_ref().unwrap().ret.mode { - PassMode::Ignore => ( - CPlace::no_place(fx.fn_abi.as_ref().unwrap().ret.layout), - smallvec![], - ), + PassMode::Ignore => (CPlace::no_place(fx.fn_abi.as_ref().unwrap().ret.layout), smallvec![]), PassMode::Direct(_) | PassMode::Pair(_, _) | PassMode::Cast(_) => { let is_ssa = ssa_analyzed[RETURN_PLACE] == crate::analyze::SsaKind::Ssa; ( @@ -79,26 +71,17 @@ pub(super) fn codegen_return_param<'tcx>( smallvec![], ) } - PassMode::Indirect { - attrs: _, - extra_attrs: None, - on_stack: _, - } => { + PassMode::Indirect { attrs: _, extra_attrs: None, on_stack: _ } => { let ret_param = block_params_iter.next().unwrap(); assert_eq!(fx.bcx.func.dfg.value_type(ret_param), pointer_ty(fx.tcx)); ( - CPlace::for_ptr( - Pointer::new(ret_param), - fx.fn_abi.as_ref().unwrap().ret.layout, - ), + CPlace::for_ptr(Pointer::new(ret_param), fx.fn_abi.as_ref().unwrap().ret.layout), smallvec![ret_param], ) } - PassMode::Indirect { - attrs: _, - extra_attrs: Some(_), - on_stack: _, - } => unreachable!("unsized return value"), + PassMode::Indirect { attrs: _, extra_attrs: Some(_), on_stack: _ } => { + unreachable!("unsized return value") + } }; #[cfg(not(debug_assertions))] @@ -120,27 +103,21 @@ pub(super) fn codegen_return_param<'tcx>( /// Invokes the closure with if necessary a value representing the return pointer. When the closure /// returns the call return value(s) if any are written to the correct place. -pub(super) fn codegen_with_call_return_arg<'tcx, M: Module, T>( - fx: &mut FunctionCx<'_, 'tcx, M>, +pub(super) fn codegen_with_call_return_arg<'tcx, T>( + fx: &mut FunctionCx<'_, '_, 'tcx>, ret_arg_abi: &ArgAbi<'tcx, Ty<'tcx>>, ret_place: Option>, - f: impl FnOnce(&mut FunctionCx<'_, 'tcx, M>, Option) -> (Inst, T), + f: impl FnOnce(&mut FunctionCx<'_, '_, 'tcx>, Option) -> (Inst, T), ) -> (Inst, T) { let return_ptr = match ret_arg_abi.mode { PassMode::Ignore => None, - PassMode::Indirect { - attrs: _, - extra_attrs: None, - on_stack: _, - } => match ret_place { + PassMode::Indirect { attrs: _, extra_attrs: None, on_stack: _ } => match ret_place { Some(ret_place) => Some(ret_place.to_ptr().get_addr(fx)), None => Some(fx.bcx.ins().iconst(fx.pointer_type, 43)), // FIXME allocate temp stack slot }, - PassMode::Indirect { - attrs: _, - extra_attrs: Some(_), - on_stack: _, - } => unreachable!("unsized return value"), + PassMode::Indirect { attrs: _, extra_attrs: Some(_), on_stack: _ } => { + unreachable!("unsized return value") + } PassMode::Direct(_) | PassMode::Pair(_, _) | PassMode::Cast(_) => None, }; @@ -177,37 +154,24 @@ pub(super) fn codegen_with_call_return_arg<'tcx, M: Module, T>( ret_place.write_cvalue(fx, result); } } - PassMode::Indirect { - attrs: _, - extra_attrs: None, - on_stack: _, - } => {} - PassMode::Indirect { - attrs: _, - extra_attrs: Some(_), - on_stack: _, - } => unreachable!("unsized return value"), + PassMode::Indirect { attrs: _, extra_attrs: None, on_stack: _ } => {} + PassMode::Indirect { attrs: _, extra_attrs: Some(_), on_stack: _ } => { + unreachable!("unsized return value") + } } (call_inst, meta) } /// Codegen a return instruction with the right return value(s) if any. -pub(crate) fn codegen_return(fx: &mut FunctionCx<'_, '_, impl Module>) { +pub(crate) fn codegen_return(fx: &mut FunctionCx<'_, '_, '_>) { match fx.fn_abi.as_ref().unwrap().ret.mode { - PassMode::Ignore - | PassMode::Indirect { - attrs: _, - extra_attrs: None, - on_stack: _, - } => { + PassMode::Ignore | PassMode::Indirect { attrs: _, extra_attrs: None, on_stack: _ } => { fx.bcx.ins().return_(&[]); } - PassMode::Indirect { - attrs: _, - extra_attrs: Some(_), - on_stack: _, - } => unreachable!("unsized return value"), + PassMode::Indirect { attrs: _, extra_attrs: Some(_), on_stack: _ } => { + unreachable!("unsized return value") + } PassMode::Direct(_) => { let place = fx.get_local_place(RETURN_PLACE); let ret_val = place.to_cvalue(fx).load_scalar(fx); diff --git a/compiler/rustc_codegen_cranelift/src/allocator.rs b/compiler/rustc_codegen_cranelift/src/allocator.rs index 6c5916550f..efb64233ef 100644 --- a/compiler/rustc_codegen_cranelift/src/allocator.rs +++ b/compiler/rustc_codegen_cranelift/src/allocator.rs @@ -66,13 +66,9 @@ fn codegen_inner( let callee_name = kind.fn_name(method.name); //eprintln!("Codegen allocator shim {} -> {} ({:?} -> {:?})", caller_name, callee_name, sig.params, sig.returns); - let func_id = module - .declare_function(&caller_name, Linkage::Export, &sig) - .unwrap(); + let func_id = module.declare_function(&caller_name, Linkage::Export, &sig).unwrap(); - let callee_func_id = module - .declare_function(&callee_name, Linkage::Import, &sig) - .unwrap(); + let callee_func_id = module.declare_function(&callee_name, Linkage::Import, &sig).unwrap(); let mut ctx = Context::new(); ctx.func = Function::with_name_signature(ExternalName::user(0, 0), sig.clone()); @@ -96,11 +92,7 @@ fn codegen_inner( bcx.finalize(); } module - .define_function( - func_id, - &mut ctx, - &mut cranelift_codegen::binemit::NullTrapSink {}, - ) + .define_function(func_id, &mut ctx, &mut cranelift_codegen::binemit::NullTrapSink {}) .unwrap(); unwind_context.add_function(func_id, &ctx, module.isa()); } @@ -114,13 +106,10 @@ fn codegen_inner( let callee_name = kind.fn_name(sym::oom); //eprintln!("Codegen allocator shim {} -> {} ({:?} -> {:?})", caller_name, callee_name, sig.params, sig.returns); - let func_id = module - .declare_function("__rust_alloc_error_handler", Linkage::Export, &sig) - .unwrap(); + let func_id = + module.declare_function("__rust_alloc_error_handler", Linkage::Export, &sig).unwrap(); - let callee_func_id = module - .declare_function(&callee_name, Linkage::Import, &sig) - .unwrap(); + let callee_func_id = module.declare_function(&callee_name, Linkage::Import, &sig).unwrap(); let mut ctx = Context::new(); ctx.func = Function::with_name_signature(ExternalName::user(0, 0), sig); @@ -143,11 +132,7 @@ fn codegen_inner( bcx.finalize(); } module - .define_function( - func_id, - &mut ctx, - &mut cranelift_codegen::binemit::NullTrapSink {}, - ) + .define_function(func_id, &mut ctx, &mut cranelift_codegen::binemit::NullTrapSink {}) .unwrap(); unwind_context.add_function(func_id, &ctx, module.isa()); } diff --git a/compiler/rustc_codegen_cranelift/src/analyze.rs b/compiler/rustc_codegen_cranelift/src/analyze.rs index 62fbcfe3f7..efead25552 100644 --- a/compiler/rustc_codegen_cranelift/src/analyze.rs +++ b/compiler/rustc_codegen_cranelift/src/analyze.rs @@ -11,7 +11,7 @@ pub(crate) enum SsaKind { Ssa, } -pub(crate) fn analyze(fx: &FunctionCx<'_, '_, impl Module>) -> IndexVec { +pub(crate) fn analyze(fx: &FunctionCx<'_, '_, '_>) -> IndexVec { let mut flag_map = fx .mir .local_decls @@ -40,12 +40,7 @@ pub(crate) fn analyze(fx: &FunctionCx<'_, '_, impl Module>) -> IndexVec { + TerminatorKind::Call { destination, func, args, .. } => { if let Some((dest_place, _dest_bb)) = destination { if !crate::abi::can_return_to_ssa_var(fx, func, args) { not_ssa(&mut flag_map, dest_place.local) diff --git a/compiler/rustc_codegen_cranelift/src/archive.rs b/compiler/rustc_codegen_cranelift/src/archive.rs index 9657905438..7583fc4240 100644 --- a/compiler/rustc_codegen_cranelift/src/archive.rs +++ b/compiler/rustc_codegen_cranelift/src/archive.rs @@ -12,10 +12,7 @@ use object::{Object, ObjectSymbol, SymbolKind}; #[derive(Debug)] enum ArchiveEntry { - FromArchive { - archive_index: usize, - entry_index: usize, - }, + FromArchive { archive_index: usize, entry_index: usize }, File(PathBuf), } @@ -30,7 +27,6 @@ pub(crate) struct ArArchiveBuilder<'a> { // Don't use `HashMap` here, as the order is important. `rust.metadata.bin` must always be at // the end of an archive for linkers to not get confused. entries: Vec<(String, ArchiveEntry)>, - update_symbols: bool, } impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> { @@ -46,10 +42,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> { let entry = entry.unwrap(); entries.push(( String::from_utf8(entry.header().identifier().to_vec()).unwrap(), - ArchiveEntry::FromArchive { - archive_index: 0, - entry_index: i, - }, + ArchiveEntry::FromArchive { archive_index: 0, entry_index: i }, )); i += 1; } @@ -69,7 +62,6 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> { src_archives, entries, - update_symbols: false, } } @@ -95,14 +87,9 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> { fn add_native_library(&mut self, name: rustc_span::symbol::Symbol) { let location = find_library(name, &self.lib_search_paths, self.sess); - self.add_archive(location.clone(), |_| false) - .unwrap_or_else(|e| { - panic!( - "failed to add native library {}: {}", - location.to_string_lossy(), - e - ); - }); + self.add_archive(location.clone(), |_| false).unwrap_or_else(|e| { + panic!("failed to add native library {}: {}", location.to_string_lossy(), e); + }); } fn add_rlib( @@ -136,9 +123,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> { }) } - fn update_symbols(&mut self) { - self.update_symbols = true; - } + fn update_symbols(&mut self) {} fn build(mut self) { enum BuilderKind { @@ -156,10 +141,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> { // FIXME only read the symbol table of the object files to avoid having to keep all // object files in memory at once, or read them twice. let data = match entry { - ArchiveEntry::FromArchive { - archive_index, - entry_index, - } => { + ArchiveEntry::FromArchive { archive_index, entry_index } => { // FIXME read symbols from symtab use std::io::Read; let (ref _src_archive_path, ref mut src_archive) = @@ -225,10 +207,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> { err )); }), - entries - .iter() - .map(|(name, _)| name.as_bytes().to_vec()) - .collect(), + entries.iter().map(|(name, _)| name.as_bytes().to_vec()).collect(), ar::GnuSymbolTableFormat::Size32, symbol_table, ) @@ -271,8 +250,7 @@ impl<'a> ArchiveBuilder<'a> for ArArchiveBuilder<'a> { .expect("Couldn't run ranlib"); if !status.success() { - self.sess - .fatal(&format!("Ranlib exited with code {:?}", status.code())); + self.sess.fatal(&format!("Ranlib exited with code {:?}", status.code())); } } } @@ -292,13 +270,8 @@ impl<'a> ArArchiveBuilder<'a> { let file_name = String::from_utf8(entry.header().identifier().to_vec()) .map_err(|err| std::io::Error::new(std::io::ErrorKind::InvalidData, err))?; if !skip(&file_name) { - self.entries.push(( - file_name, - ArchiveEntry::FromArchive { - archive_index, - entry_index: i, - }, - )); + self.entries + .push((file_name, ArchiveEntry::FromArchive { archive_index, entry_index: i })); } i += 1; } diff --git a/compiler/rustc_codegen_cranelift/src/atomic_shim.rs b/compiler/rustc_codegen_cranelift/src/atomic_shim.rs deleted file mode 100644 index 674e6d9075..0000000000 --- a/compiler/rustc_codegen_cranelift/src/atomic_shim.rs +++ /dev/null @@ -1,185 +0,0 @@ -//! Atomic intrinsics are implemented using a global lock for now, as Cranelift doesn't support -//! atomic operations yet. - -// FIXME implement atomic instructions in Cranelift. - -use crate::prelude::*; - -#[cfg(all(feature = "jit", unix))] -#[no_mangle] -static mut __cg_clif_global_atomic_mutex: libc::pthread_mutex_t = libc::PTHREAD_MUTEX_INITIALIZER; - -pub(crate) fn init_global_lock( - module: &mut impl Module, - bcx: &mut FunctionBuilder<'_>, - use_jit: bool, -) { - if use_jit { - // When using JIT, dylibs won't find the __cg_clif_global_atomic_mutex data object defined here, - // so instead we define it in the cg_clif dylib. - - return; - } - - let mut data_ctx = DataContext::new(); - data_ctx.define_zeroinit(1024); // 1024 bytes should be big enough on all platforms. - data_ctx.set_align(16); - let atomic_mutex = module - .declare_data( - "__cg_clif_global_atomic_mutex", - Linkage::Export, - true, - false, - ) - .unwrap(); - module.define_data(atomic_mutex, &data_ctx).unwrap(); - - let pthread_mutex_init = module - .declare_function( - "pthread_mutex_init", - Linkage::Import, - &cranelift_codegen::ir::Signature { - call_conv: module.target_config().default_call_conv, - params: vec![ - AbiParam::new( - module.target_config().pointer_type(), /* *mut pthread_mutex_t */ - ), - AbiParam::new( - module.target_config().pointer_type(), /* *const pthread_mutex_attr_t */ - ), - ], - returns: vec![AbiParam::new(types::I32 /* c_int */)], - }, - ) - .unwrap(); - - let pthread_mutex_init = module.declare_func_in_func(pthread_mutex_init, bcx.func); - - let atomic_mutex = module.declare_data_in_func(atomic_mutex, bcx.func); - let atomic_mutex = bcx - .ins() - .global_value(module.target_config().pointer_type(), atomic_mutex); - - let nullptr = bcx.ins().iconst(module.target_config().pointer_type(), 0); - - bcx.ins().call(pthread_mutex_init, &[atomic_mutex, nullptr]); -} - -pub(crate) fn init_global_lock_constructor( - module: &mut impl Module, - constructor_name: &str, -) -> FuncId { - let sig = Signature::new(CallConv::SystemV); - let init_func_id = module - .declare_function(constructor_name, Linkage::Export, &sig) - .unwrap(); - - let mut ctx = Context::new(); - ctx.func = Function::with_name_signature(ExternalName::user(0, 0), sig); - { - let mut func_ctx = FunctionBuilderContext::new(); - let mut bcx = FunctionBuilder::new(&mut ctx.func, &mut func_ctx); - - let block = bcx.create_block(); - bcx.switch_to_block(block); - - crate::atomic_shim::init_global_lock(module, &mut bcx, false); - - bcx.ins().return_(&[]); - bcx.seal_all_blocks(); - bcx.finalize(); - } - module - .define_function( - init_func_id, - &mut ctx, - &mut cranelift_codegen::binemit::NullTrapSink {}, - ) - .unwrap(); - - init_func_id -} - -pub(crate) fn lock_global_lock(fx: &mut FunctionCx<'_, '_, impl Module>) { - let atomic_mutex = fx - .cx - .module - .declare_data( - "__cg_clif_global_atomic_mutex", - Linkage::Import, - true, - false, - ) - .unwrap(); - - let pthread_mutex_lock = fx - .cx - .module - .declare_function( - "pthread_mutex_lock", - Linkage::Import, - &cranelift_codegen::ir::Signature { - call_conv: fx.cx.module.target_config().default_call_conv, - params: vec![AbiParam::new( - fx.cx.module.target_config().pointer_type(), /* *mut pthread_mutex_t */ - )], - returns: vec![AbiParam::new(types::I32 /* c_int */)], - }, - ) - .unwrap(); - - let pthread_mutex_lock = fx - .cx - .module - .declare_func_in_func(pthread_mutex_lock, fx.bcx.func); - - let atomic_mutex = fx.cx.module.declare_data_in_func(atomic_mutex, fx.bcx.func); - let atomic_mutex = fx - .bcx - .ins() - .global_value(fx.cx.module.target_config().pointer_type(), atomic_mutex); - - fx.bcx.ins().call(pthread_mutex_lock, &[atomic_mutex]); -} - -pub(crate) fn unlock_global_lock(fx: &mut FunctionCx<'_, '_, impl Module>) { - let atomic_mutex = fx - .cx - .module - .declare_data( - "__cg_clif_global_atomic_mutex", - Linkage::Import, - true, - false, - ) - .unwrap(); - - let pthread_mutex_unlock = fx - .cx - .module - .declare_function( - "pthread_mutex_unlock", - Linkage::Import, - &cranelift_codegen::ir::Signature { - call_conv: fx.cx.module.target_config().default_call_conv, - params: vec![AbiParam::new( - fx.cx.module.target_config().pointer_type(), /* *mut pthread_mutex_t */ - )], - returns: vec![AbiParam::new(types::I32 /* c_int */)], - }, - ) - .unwrap(); - - let pthread_mutex_unlock = fx - .cx - .module - .declare_func_in_func(pthread_mutex_unlock, fx.bcx.func); - - let atomic_mutex = fx.cx.module.declare_data_in_func(atomic_mutex, fx.bcx.func); - let atomic_mutex = fx - .bcx - .ins() - .global_value(fx.cx.module.target_config().pointer_type(), atomic_mutex); - - fx.bcx.ins().call(pthread_mutex_unlock, &[atomic_mutex]); -} diff --git a/compiler/rustc_codegen_cranelift/src/backend.rs b/compiler/rustc_codegen_cranelift/src/backend.rs index 0ce34c904b..eb7927fc4a 100644 --- a/compiler/rustc_codegen_cranelift/src/backend.rs +++ b/compiler/rustc_codegen_cranelift/src/backend.rs @@ -8,7 +8,7 @@ use rustc_session::Session; use cranelift_module::FuncId; use object::write::*; -use object::{RelocationEncoding, RelocationKind, SectionKind, SymbolFlags}; +use object::{RelocationEncoding, SectionKind, SymbolFlags}; use cranelift_object::{ObjectBuilder, ObjectModule, ObjectProduct}; @@ -22,9 +22,7 @@ pub(crate) trait WriteMetadata { impl WriteMetadata for object::write::Object { fn add_rustc_section(&mut self, symbol_name: String, data: Vec, _is_like_osx: bool) { - let segment = self - .segment_name(object::write::StandardSegment::Data) - .to_vec(); + let segment = self.segment_name(object::write::StandardSegment::Data).to_vec(); let section_id = self.add_section(segment, b".rustc".to_vec(), object::SectionKind::Data); let offset = self.append_section_data(section_id, &data, 1); // For MachO and probably PE this is necessary to prevent the linker from throwing away the @@ -74,11 +72,7 @@ impl WriteDebugInfo for ObjectProduct { let section_id = self.object.add_section( segment, name, - if id == SectionId::EhFrame { - SectionKind::ReadOnlyData - } else { - SectionKind::Debug - }, + if id == SectionId::EhFrame { SectionKind::ReadOnlyData } else { SectionKind::Debug }, ); self.object .section_mut(section_id) @@ -118,49 +112,6 @@ impl WriteDebugInfo for ObjectProduct { } } -// FIXME remove once atomic instructions are implemented in Cranelift. -pub(crate) trait AddConstructor { - fn add_constructor(&mut self, func_id: FuncId); -} - -impl AddConstructor for ObjectProduct { - fn add_constructor(&mut self, func_id: FuncId) { - let symbol = self.function_symbol(func_id); - let segment = self - .object - .segment_name(object::write::StandardSegment::Data); - let init_array_section = - self.object - .add_section(segment.to_vec(), b".init_array".to_vec(), SectionKind::Data); - let address_size = self - .object - .architecture() - .address_size() - .expect("address_size must be known") - .bytes(); - self.object.append_section_data( - init_array_section, - &std::iter::repeat(0) - .take(address_size.into()) - .collect::>(), - 8, - ); - self.object - .add_relocation( - init_array_section, - object::write::Relocation { - offset: 0, - size: address_size * 8, - kind: RelocationKind::Absolute, - encoding: RelocationEncoding::Generic, - symbol, - addend: 0, - }, - ) - .unwrap(); - } -} - pub(crate) fn with_object(sess: &Session, name: &str, f: impl FnOnce(&mut Object)) -> Vec { let triple = crate::build_isa(sess).triple().clone(); @@ -175,10 +126,9 @@ pub(crate) fn with_object(sess: &Session, name: &str, f: impl FnOnce(&mut Object target_lexicon::Architecture::X86_64 => object::Architecture::X86_64, target_lexicon::Architecture::Arm(_) => object::Architecture::Arm, target_lexicon::Architecture::Aarch64(_) => object::Architecture::Aarch64, - architecture => sess.fatal(&format!( - "target architecture {:?} is unsupported", - architecture, - )), + architecture => { + sess.fatal(&format!("target architecture {:?} is unsupported", architecture,)) + } }; let endian = match triple.endianness().unwrap() { target_lexicon::Endianness::Little => object::Endianness::Little, diff --git a/compiler/rustc_codegen_cranelift/src/base.rs b/compiler/rustc_codegen_cranelift/src/base.rs index 4842628a99..8b5ae9e054 100644 --- a/compiler/rustc_codegen_cranelift/src/base.rs +++ b/compiler/rustc_codegen_cranelift/src/base.rs @@ -8,7 +8,7 @@ use rustc_target::abi::call::FnAbi; use crate::prelude::*; pub(crate) fn codegen_fn<'tcx>( - cx: &mut crate::CodegenCx<'tcx, impl Module>, + cx: &mut crate::CodegenCx<'_, 'tcx>, instance: Instance<'tcx>, linkage: Linkage, ) { @@ -38,9 +38,8 @@ pub(crate) fn codegen_fn<'tcx>( // Predefine blocks let start_block = bcx.create_block(); - let block_map: IndexVec = (0..mir.basic_blocks().len()) - .map(|_| bcx.create_block()) - .collect(); + let block_map: IndexVec = + (0..mir.basic_blocks().len()).map(|_| bcx.create_block()).collect(); // Make FunctionCx let pointer_type = cx.module.target_config().pointer_type(); @@ -68,22 +67,23 @@ pub(crate) fn codegen_fn<'tcx>( inline_asm_index: 0, }; - let arg_uninhabited = fx.mir.args_iter().any(|arg| { - fx.layout_of(fx.monomorphize(&fx.mir.local_decls[arg].ty)) - .abi - .is_uninhabited() - }); + let arg_uninhabited = fx + .mir + .args_iter() + .any(|arg| fx.layout_of(fx.monomorphize(&fx.mir.local_decls[arg].ty)).abi.is_uninhabited()); - if arg_uninhabited { - fx.bcx - .append_block_params_for_function_params(fx.block_map[START_BLOCK]); + if !crate::constant::check_constants(&mut fx) { + fx.bcx.append_block_params_for_function_params(fx.block_map[START_BLOCK]); + fx.bcx.switch_to_block(fx.block_map[START_BLOCK]); + crate::trap::trap_unreachable(&mut fx, "compilation should have been aborted"); + } else if arg_uninhabited { + fx.bcx.append_block_params_for_function_params(fx.block_map[START_BLOCK]); fx.bcx.switch_to_block(fx.block_map[START_BLOCK]); crate::trap::trap_unreachable(&mut fx, "function has uninhabited argument"); } else { tcx.sess.time("codegen clif ir", || { - tcx.sess.time("codegen prelude", || { - crate::abi::codegen_fn_prelude(&mut fx, start_block) - }); + tcx.sess + .time("codegen prelude", || crate::abi::codegen_fn_prelude(&mut fx, start_block)); codegen_fn_content(&mut fx); }); } @@ -131,11 +131,7 @@ pub(crate) fn codegen_fn<'tcx>( let module = &mut cx.module; tcx.sess.time("define function", || { module - .define_function( - func_id, - context, - &mut cranelift_codegen::binemit::NullTrapSink {}, - ) + .define_function(func_id, context, &mut cranelift_codegen::binemit::NullTrapSink {}) .unwrap() }); @@ -149,14 +145,12 @@ pub(crate) fn codegen_fn<'tcx>( &clif_comments, ); - if let Some(mach_compile_result) = &context.mach_compile_result { - if let Some(disasm) = &mach_compile_result.disasm { - crate::pretty_clif::write_ir_file( - tcx, - &format!("{}.vcode", tcx.symbol_name(instance).name), - |file| file.write_all(disasm.as_bytes()), - ) - } + if let Some(disasm) = &context.mach_compile_result.as_ref().unwrap().disasm { + crate::pretty_clif::write_ir_file( + tcx, + &format!("{}.vcode", tcx.symbol_name(instance).name), + |file| file.write_all(disasm.as_bytes()), + ) } // Define debuginfo for function @@ -199,16 +193,13 @@ pub(crate) fn verify_func( Some(Box::new(writer)), err, ); - tcx.sess - .fatal(&format!("cranelift verify error:\n{}", pretty_error)); + tcx.sess.fatal(&format!("cranelift verify error:\n{}", pretty_error)); } } }); } -fn codegen_fn_content(fx: &mut FunctionCx<'_, '_, impl Module>) { - crate::constant::check_constants(fx); - +fn codegen_fn_content(fx: &mut FunctionCx<'_, '_, '_>) { for (bb, bb_data) in fx.mir.basic_blocks().iter_enumerated() { let block = fx.get_block(bb); fx.bcx.switch_to_block(block); @@ -231,11 +222,7 @@ fn codegen_fn_content(fx: &mut FunctionCx<'_, '_, impl Module>) { #[cfg(debug_assertions)] { let mut terminator_head = "\n".to_string(); - bb_data - .terminator() - .kind - .fmt_head(&mut terminator_head) - .unwrap(); + bb_data.terminator().kind.fmt_head(&mut terminator_head).unwrap(); let inst = fx.bcx.func.layout.last_inst(block).unwrap(); fx.add_comment(inst, terminator_head); } @@ -267,13 +254,7 @@ fn codegen_fn_content(fx: &mut FunctionCx<'_, '_, impl Module>) { TerminatorKind::Return => { crate::abi::codegen_return(fx); } - TerminatorKind::Assert { - cond, - expected, - msg, - target, - cleanup: _, - } => { + TerminatorKind::Assert { cond, expected, msg, target, cleanup: _ } => { if !fx.tcx.sess.overflow_checks() { if let mir::AssertKind::OverflowNeg(_) = *msg { let target = fx.get_block(*target); @@ -319,11 +300,7 @@ fn codegen_fn_content(fx: &mut FunctionCx<'_, '_, impl Module>) { } } - TerminatorKind::SwitchInt { - discr, - switch_ty, - targets, - } => { + TerminatorKind::SwitchInt { discr, switch_ty, targets } => { let discr = codegen_operand(fx, discr).load_scalar(fx); let use_bool_opt = switch_ty.kind() == fx.tcx.types.bool.kind() @@ -433,11 +410,7 @@ fn codegen_fn_content(fx: &mut FunctionCx<'_, '_, impl Module>) { | TerminatorKind::GeneratorDrop => { bug!("shouldn't exist at codegen {:?}", bb_data.terminator()); } - TerminatorKind::Drop { - place, - target, - unwind: _, - } => { + TerminatorKind::Drop { place, target, unwind: _ } => { let drop_place = codegen_place(fx, *place); crate::abi::codegen_drop(fx, bb_data.terminator().source_info.span, drop_place); @@ -452,7 +425,7 @@ fn codegen_fn_content(fx: &mut FunctionCx<'_, '_, impl Module>) { } fn codegen_stmt<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, #[allow(unused_variables)] cur_block: Block, stmt: &Statement<'tcx>, ) { @@ -470,10 +443,7 @@ fn codegen_stmt<'tcx>( } match &stmt.kind { - StatementKind::SetDiscriminant { - place, - variant_index, - } => { + StatementKind::SetDiscriminant { place, variant_index } => { let place = codegen_place(fx, **place); crate::discriminant::codegen_set_discriminant(fx, place, *variant_index); } @@ -494,14 +464,14 @@ fn codegen_stmt<'tcx>( let val = crate::constant::codegen_tls_ref(fx, def_id, lval.layout()); lval.write_cvalue(fx, val); } - Rvalue::BinaryOp(bin_op, ref lhs, ref rhs) => { + Rvalue::BinaryOp(bin_op, box (ref lhs, ref rhs)) => { let lhs = codegen_operand(fx, lhs); let rhs = codegen_operand(fx, rhs); let res = crate::num::codegen_binop(fx, bin_op, lhs, rhs); lval.write_cvalue(fx, res); } - Rvalue::CheckedBinaryOp(bin_op, ref lhs, ref rhs) => { + Rvalue::CheckedBinaryOp(bin_op, box (ref lhs, ref rhs)) => { let lhs = codegen_operand(fx, lhs); let rhs = codegen_operand(fx, rhs); @@ -594,19 +564,11 @@ fn codegen_stmt<'tcx>( let from_ty = operand.layout().ty; let to_ty = fx.monomorphize(to_ty); - fn is_fat_ptr<'tcx>( - fx: &FunctionCx<'_, 'tcx, impl Module>, - ty: Ty<'tcx>, - ) -> bool { + fn is_fat_ptr<'tcx>(fx: &FunctionCx<'_, '_, 'tcx>, ty: Ty<'tcx>) -> bool { ty.builtin_deref(true) - .map( - |ty::TypeAndMut { - ty: pointee_ty, - mutbl: _, - }| { - has_ptr_meta(fx.tcx, pointee_ty) - }, - ) + .map(|ty::TypeAndMut { ty: pointee_ty, mutbl: _ }| { + has_ptr_meta(fx.tcx, pointee_ty) + }) .unwrap_or(false) } @@ -626,50 +588,22 @@ fn codegen_stmt<'tcx>( ty::Uint(_) | ty::Int(_) => {} _ => unreachable!("cast adt {} -> {}", from_ty, to_ty), } + let to_clif_ty = fx.clif_type(to_ty).unwrap(); - use rustc_target::abi::{Int, TagEncoding, Variants}; - - match operand.layout().variants { - Variants::Single { index } => { - let discr = operand - .layout() - .ty - .discriminant_for_variant(fx.tcx, index) - .unwrap(); - let discr = if discr.ty.is_signed() { - fx.layout_of(discr.ty).size.sign_extend(discr.val) - } else { - discr.val - }; - let discr = discr.into(); - - let discr = CValue::const_val(fx, fx.layout_of(to_ty), discr); - lval.write_cvalue(fx, discr); - } - Variants::Multiple { - ref tag, - tag_field, - tag_encoding: TagEncoding::Direct, - variants: _, - } => { - let cast_to = fx.clif_type(dest_layout.ty).unwrap(); - - // Read the tag/niche-encoded discriminant from memory. - let encoded_discr = - operand.value_field(fx, mir::Field::new(tag_field)); - let encoded_discr = encoded_discr.load_scalar(fx); - - // Decode the discriminant (specifically if it's niche-encoded). - let signed = match tag.value { - Int(_, signed) => signed, - _ => false, - }; - let val = clif_intcast(fx, encoded_discr, cast_to, signed); - let val = CValue::by_val(val, dest_layout); - lval.write_cvalue(fx, val); - } - Variants::Multiple { .. } => unreachable!(), - } + let discriminant = crate::discriminant::codegen_get_discriminant( + fx, + operand, + fx.layout_of(operand.layout().ty.discriminant_ty(fx.tcx)), + ) + .load_scalar(fx); + + let res = crate::cast::clif_intcast( + fx, + discriminant, + to_clif_ty, + to_ty.is_signed(), + ); + lval.write_cvalue(fx, CValue::by_val(res, dest_layout)); } else { let to_clif_ty = fx.clif_type(to_ty).unwrap(); let from = operand.load_scalar(fx); @@ -730,8 +664,7 @@ fn codegen_stmt<'tcx>( // FIXME use emit_small_memset where possible let addr = lval.to_ptr().get_addr(fx); let val = operand.load_scalar(fx); - fx.bcx - .call_memset(fx.cx.module.target_config(), addr, val, times); + fx.bcx.call_memset(fx.cx.module.target_config(), addr, val, times); } else { let loop_block = fx.bcx.create_block(); let loop_block2 = fx.bcx.create_block(); @@ -766,25 +699,19 @@ fn codegen_stmt<'tcx>( let content_ty = fx.monomorphize(content_ty); let layout = fx.layout_of(content_ty); let llsize = fx.bcx.ins().iconst(usize_type, layout.size.bytes() as i64); - let llalign = fx - .bcx - .ins() - .iconst(usize_type, layout.align.abi.bytes() as i64); + let llalign = fx.bcx.ins().iconst(usize_type, layout.align.abi.bytes() as i64); let box_layout = fx.layout_of(fx.tcx.mk_box(content_ty)); // Allocate space: - let def_id = match fx - .tcx - .lang_items() - .require(rustc_hir::LangItem::ExchangeMalloc) - { - Ok(id) => id, - Err(s) => { - fx.tcx - .sess - .fatal(&format!("allocation of `{}` {}", box_layout.ty, s)); - } - }; + let def_id = + match fx.tcx.lang_items().require(rustc_hir::LangItem::ExchangeMalloc) { + Ok(id) => id, + Err(s) => { + fx.tcx + .sess + .fatal(&format!("allocation of `{}` {}", box_layout.ty, s)); + } + }; let instance = ty::Instance::mono(fx.tcx, def_id).polymorphize(fx.tcx); let func_ref = fx.get_function_ref(instance); let call = fx.bcx.ins().call(func_ref, &[llsize, llalign]); @@ -792,10 +719,11 @@ fn codegen_stmt<'tcx>( lval.write_cvalue(fx, CValue::by_val(ptr, box_layout)); } Rvalue::NullaryOp(NullOp::SizeOf, ty) => { - assert!(lval - .layout() - .ty - .is_sized(fx.tcx.at(stmt.source_info.span), ParamEnv::reveal_all())); + assert!( + lval.layout() + .ty + .is_sized(fx.tcx.at(stmt.source_info.span), ParamEnv::reveal_all()) + ); let ty_size = fx.layout_of(fx.monomorphize(ty)).size.bytes(); let val = CValue::const_val(fx, fx.layout_of(fx.tcx.types.usize), ty_size.into()); @@ -823,11 +751,7 @@ fn codegen_stmt<'tcx>( StatementKind::LlvmInlineAsm(asm) => { use rustc_span::symbol::Symbol; - let LlvmInlineAsm { - asm, - outputs, - inputs, - } = &**asm; + let LlvmInlineAsm { asm, outputs, inputs } = &**asm; let rustc_hir::LlvmInlineAsmInner { asm: asm_code, // Name outputs: output_names, // Vec @@ -843,15 +767,9 @@ fn codegen_stmt<'tcx>( // Black box } "mov %rbx, %rsi\n cpuid\n xchg %rbx, %rsi" => { - assert_eq!( - input_names, - &[Symbol::intern("{eax}"), Symbol::intern("{ecx}")] - ); + assert_eq!(input_names, &[Symbol::intern("{eax}"), Symbol::intern("{ecx}")]); assert_eq!(output_names.len(), 4); - for (i, c) in (&["={eax}", "={esi}", "={ecx}", "={edx}"]) - .iter() - .enumerate() - { + for (i, c) in (&["={eax}", "={esi}", "={ecx}", "={edx}"]).iter().enumerate() { assert_eq!(&output_names[i].constraint.as_str(), c); assert!(!output_names[i].is_rw); assert!(!output_names[i].is_indirect); @@ -897,12 +815,7 @@ fn codegen_stmt<'tcx>( crate::trap::trap_unimplemented(fx, "_xgetbv arch intrinsic is not supported"); } // ___chkstk, ___chkstk_ms and __alloca are only used on Windows - _ if fx - .tcx - .symbol_name(fx.instance) - .name - .starts_with("___chkstk") => - { + _ if fx.tcx.symbol_name(fx.instance).name.starts_with("___chkstk") => { crate::trap::trap_unimplemented(fx, "Stack probes are not supported"); } _ if fx.tcx.symbol_name(fx.instance).name == "__alloca" => { @@ -919,30 +832,45 @@ fn codegen_stmt<'tcx>( } } StatementKind::Coverage { .. } => fx.tcx.sess.fatal("-Zcoverage is unimplemented"), + StatementKind::CopyNonOverlapping(box rustc_middle::mir::CopyNonOverlapping { + src, + dst, + count, + }) => { + let dst = codegen_operand(fx, dst); + let pointee = dst + .layout() + .pointee_info_at(fx, rustc_target::abi::Size::ZERO) + .expect("Expected pointer"); + let dst = dst.load_scalar(fx); + let src = codegen_operand(fx, src).load_scalar(fx); + let count = codegen_operand(fx, count).load_scalar(fx); + let elem_size: u64 = pointee.size.bytes(); + let bytes = if elem_size != 1 { + fx.bcx.ins().imul_imm(count, elem_size as i64) + } else { + count + }; + fx.bcx.call_memcpy(fx.cx.module.target_config(), dst, src, bytes); + } } } -fn codegen_array_len<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, - place: CPlace<'tcx>, -) -> Value { +fn codegen_array_len<'tcx>(fx: &mut FunctionCx<'_, '_, 'tcx>, place: CPlace<'tcx>) -> Value { match *place.layout().ty.kind() { ty::Array(_elem_ty, len) => { - let len = fx - .monomorphize(len) - .eval_usize(fx.tcx, ParamEnv::reveal_all()) as i64; + let len = fx.monomorphize(len).eval_usize(fx.tcx, ParamEnv::reveal_all()) as i64; fx.bcx.ins().iconst(fx.pointer_type, len) } - ty::Slice(_elem_ty) => place - .to_ptr_maybe_unsized() - .1 - .expect("Length metadata for slice place"), + ty::Slice(_elem_ty) => { + place.to_ptr_maybe_unsized().1.expect("Length metadata for slice place") + } _ => bug!("Rvalue::Len({:?})", place), } } pub(crate) fn codegen_place<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, place: Place<'tcx>, ) -> CPlace<'tcx> { let mut cplace = fx.get_local_place(place.local); @@ -959,11 +887,7 @@ pub(crate) fn codegen_place<'tcx>( let index = fx.get_local_place(local).to_cvalue(fx).load_scalar(fx); cplace = cplace.place_index(fx, index); } - PlaceElem::ConstantIndex { - offset, - min_length: _, - from_end, - } => { + PlaceElem::ConstantIndex { offset, min_length: _, from_end } => { let offset: u64 = offset; let index = if !from_end { fx.bcx.ins().iconst(fx.pointer_type, offset as i64) @@ -1014,7 +938,7 @@ pub(crate) fn codegen_place<'tcx>( } pub(crate) fn codegen_operand<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, operand: &Operand<'tcx>, ) -> CValue<'tcx> { match operand { @@ -1026,34 +950,24 @@ pub(crate) fn codegen_operand<'tcx>( } } -pub(crate) fn codegen_panic<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, - msg_str: &str, - span: Span, -) { +pub(crate) fn codegen_panic<'tcx>(fx: &mut FunctionCx<'_, '_, 'tcx>, msg_str: &str, span: Span) { let location = fx.get_caller_location(span).load_scalar(fx); let msg_ptr = fx.anonymous_str("assert", msg_str); - let msg_len = fx - .bcx - .ins() - .iconst(fx.pointer_type, i64::try_from(msg_str.len()).unwrap()); + let msg_len = fx.bcx.ins().iconst(fx.pointer_type, i64::try_from(msg_str.len()).unwrap()); let args = [msg_ptr, msg_len, location]; codegen_panic_inner(fx, rustc_hir::LangItem::Panic, &args, span); } pub(crate) fn codegen_panic_inner<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, lang_item: rustc_hir::LangItem, args: &[Value], span: Span, ) { - let def_id = fx - .tcx - .lang_items() - .require(lang_item) - .unwrap_or_else(|s| fx.tcx.sess.span_fatal(span, &s)); + let def_id = + fx.tcx.lang_items().require(lang_item).unwrap_or_else(|s| fx.tcx.sess.span_fatal(span, &s)); let instance = Instance::mono(fx.tcx, def_id).polymorphize(fx.tcx); let symbol_name = fx.tcx.symbol_name(instance).name; diff --git a/compiler/rustc_codegen_cranelift/src/bin/cg_clif.rs b/compiler/rustc_codegen_cranelift/src/bin/cg_clif.rs index be369b07fd..983839d48d 100644 --- a/compiler/rustc_codegen_cranelift/src/bin/cg_clif.rs +++ b/compiler/rustc_codegen_cranelift/src/bin/cg_clif.rs @@ -27,13 +27,7 @@ impl rustc_driver::Callbacks for CraneliftPassesCallbacks { config.opts.cg.panic = Some(PanicStrategy::Abort); config.opts.debugging_opts.panic_abort_tests = true; config.opts.maybe_sysroot = Some(config.opts.maybe_sysroot.clone().unwrap_or_else(|| { - std::env::current_exe() - .unwrap() - .parent() - .unwrap() - .parent() - .unwrap() - .to_owned() + std::env::current_exe().unwrap().parent().unwrap().parent().unwrap().to_owned() })); } } diff --git a/compiler/rustc_codegen_cranelift/src/bin/cg_clif_build_sysroot.rs b/compiler/rustc_codegen_cranelift/src/bin/cg_clif_build_sysroot.rs index 83e5dc6e67..e7cd5edbbf 100644 --- a/compiler/rustc_codegen_cranelift/src/bin/cg_clif_build_sysroot.rs +++ b/compiler/rustc_codegen_cranelift/src/bin/cg_clif_build_sysroot.rs @@ -46,15 +46,8 @@ impl rustc_driver::Callbacks for CraneliftPassesCallbacks { config.opts.cg.panic = Some(PanicStrategy::Abort); config.opts.debugging_opts.panic_abort_tests = true; - config.opts.maybe_sysroot = Some( - std::env::current_exe() - .unwrap() - .parent() - .unwrap() - .parent() - .unwrap() - .to_owned(), - ); + config.opts.maybe_sysroot = + Some(std::env::current_exe().unwrap().parent().unwrap().parent().unwrap().to_owned()); } } diff --git a/compiler/rustc_codegen_cranelift/src/cast.rs b/compiler/rustc_codegen_cranelift/src/cast.rs index 57204de113..74c5e09f08 100644 --- a/compiler/rustc_codegen_cranelift/src/cast.rs +++ b/compiler/rustc_codegen_cranelift/src/cast.rs @@ -3,7 +3,7 @@ use crate::prelude::*; pub(crate) fn clif_intcast( - fx: &mut FunctionCx<'_, '_, impl Module>, + fx: &mut FunctionCx<'_, '_, '_>, val: Value, to: Type, signed: bool, @@ -40,18 +40,14 @@ pub(crate) fn clif_intcast( // reduce (types::I128, _) => { let (lsb, _msb) = fx.bcx.ins().isplit(val); - if to == types::I64 { - lsb - } else { - fx.bcx.ins().ireduce(to, lsb) - } + if to == types::I64 { lsb } else { fx.bcx.ins().ireduce(to, lsb) } } (_, _) => fx.bcx.ins().ireduce(to, val), } } pub(crate) fn clif_int_or_float_cast( - fx: &mut FunctionCx<'_, '_, impl Module>, + fx: &mut FunctionCx<'_, '_, '_>, from: Value, from_signed: bool, to_ty: Type, @@ -87,11 +83,7 @@ pub(crate) fn clif_int_or_float_cast( }, ); - let from_rust_ty = if from_signed { - fx.tcx.types.i128 - } else { - fx.tcx.types.u128 - }; + let from_rust_ty = if from_signed { fx.tcx.types.i128 } else { fx.tcx.types.u128 }; let to_rust_ty = match to_ty { types::F32 => fx.tcx.types.f32, @@ -100,11 +92,7 @@ pub(crate) fn clif_int_or_float_cast( }; return fx - .easy_call( - &name, - &[CValue::by_val(from, fx.layout_of(from_rust_ty))], - to_rust_ty, - ) + .easy_call(&name, &[CValue::by_val(from, fx.layout_of(from_rust_ty))], to_rust_ty) .load_scalar(fx); } @@ -138,18 +126,10 @@ pub(crate) fn clif_int_or_float_cast( _ => unreachable!(), }; - let to_rust_ty = if to_signed { - fx.tcx.types.i128 - } else { - fx.tcx.types.u128 - }; + let to_rust_ty = if to_signed { fx.tcx.types.i128 } else { fx.tcx.types.u128 }; return fx - .easy_call( - &name, - &[CValue::by_val(from, fx.layout_of(from_rust_ty))], - to_rust_ty, - ) + .easy_call(&name, &[CValue::by_val(from, fx.layout_of(from_rust_ty))], to_rust_ty) .load_scalar(fx); } diff --git a/compiler/rustc_codegen_cranelift/src/codegen_i128.rs b/compiler/rustc_codegen_cranelift/src/codegen_i128.rs index 866ba90e4a..ae75e6508c 100644 --- a/compiler/rustc_codegen_cranelift/src/codegen_i128.rs +++ b/compiler/rustc_codegen_cranelift/src/codegen_i128.rs @@ -5,13 +5,17 @@ use cranelift_codegen::ir::ArgumentPurpose; use crate::prelude::*; pub(crate) fn maybe_codegen<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, bin_op: BinOp, checked: bool, lhs: CValue<'tcx>, rhs: CValue<'tcx>, ) -> Option> { - if lhs.layout().ty != fx.tcx.types.u128 && lhs.layout().ty != fx.tcx.types.i128 { + if lhs.layout().ty != fx.tcx.types.u128 + && lhs.layout().ty != fx.tcx.types.i128 + && rhs.layout().ty != fx.tcx.types.u128 + && rhs.layout().ty != fx.tcx.types.i128 + { return None; } @@ -27,11 +31,7 @@ pub(crate) fn maybe_codegen<'tcx>( } BinOp::Add | BinOp::Sub if !checked => None, BinOp::Mul if !checked => { - let val_ty = if is_signed { - fx.tcx.types.i128 - } else { - fx.tcx.types.u128 - }; + let val_ty = if is_signed { fx.tcx.types.i128 } else { fx.tcx.types.u128 }; Some(fx.easy_call("__multi3", &[lhs, rhs], val_ty)) } BinOp::Add | BinOp::Sub | BinOp::Mul => { @@ -43,11 +43,7 @@ pub(crate) fn maybe_codegen<'tcx>( AbiParam::new(types::I128), AbiParam::new(types::I128), ]; - let args = [ - out_place.to_ptr().get_addr(fx), - lhs.load_scalar(fx), - rhs.load_scalar(fx), - ]; + let args = [out_place.to_ptr().get_addr(fx), lhs.load_scalar(fx), rhs.load_scalar(fx)]; let name = match (bin_op, is_signed) { (BinOp::Add, false) => "__rust_u128_addo", (BinOp::Add, true) => "__rust_i128_addo", @@ -97,70 +93,23 @@ pub(crate) fn maybe_codegen<'tcx>( None }; - // Optimize `val >> 64`, because compiler_builtins uses it to deconstruct an 128bit - // integer into its lsb and msb. - // https://github.com/rust-lang-nursery/compiler-builtins/blob/79a6a1603d5672cbb9187ff41ff4d9b5048ac1cb/src/int/mod.rs#L217 - if resolve_value_imm(fx.bcx.func, rhs_val) == Some(64) { - let (lhs_lsb, lhs_msb) = fx.bcx.ins().isplit(lhs_val); - let all_zeros = fx.bcx.ins().iconst(types::I64, 0); - let val = match (bin_op, is_signed) { - (BinOp::Shr, false) => { - let val = fx.bcx.ins().iconcat(lhs_msb, all_zeros); - Some(CValue::by_val(val, fx.layout_of(fx.tcx.types.u128))) - } - (BinOp::Shr, true) => { - let sign = fx.bcx.ins().icmp_imm(IntCC::SignedLessThan, lhs_msb, 0); - let all_ones = fx.bcx.ins().iconst(types::I64, u64::MAX as i64); - let all_sign_bits = fx.bcx.ins().select(sign, all_zeros, all_ones); - - let val = fx.bcx.ins().iconcat(lhs_msb, all_sign_bits); - Some(CValue::by_val(val, fx.layout_of(fx.tcx.types.i128))) - } - (BinOp::Shl, _) => { - let val_ty = if is_signed { - fx.tcx.types.i128 - } else { - fx.tcx.types.u128 - }; - let val = fx.bcx.ins().iconcat(all_zeros, lhs_lsb); - Some(CValue::by_val(val, fx.layout_of(val_ty))) - } - _ => None, - }; - if let Some(val) = val { - if let Some(is_overflow) = is_overflow { - let out_ty = fx.tcx.mk_tup([lhs.layout().ty, fx.tcx.types.bool].iter()); - let val = val.load_scalar(fx); - return Some(CValue::by_val_pair(val, is_overflow, fx.layout_of(out_ty))); + let truncated_rhs = clif_intcast(fx, rhs_val, types::I32, false); + let val = match bin_op { + BinOp::Shl => fx.bcx.ins().ishl(lhs_val, truncated_rhs), + BinOp::Shr => { + if is_signed { + fx.bcx.ins().sshr(lhs_val, truncated_rhs) } else { - return Some(val); + fx.bcx.ins().ushr(lhs_val, truncated_rhs) } } - } - - let truncated_rhs = clif_intcast(fx, rhs_val, types::I32, false); - let truncated_rhs = CValue::by_val(truncated_rhs, fx.layout_of(fx.tcx.types.u32)); - let val = match (bin_op, is_signed) { - (BinOp::Shl, false) => { - fx.easy_call("__ashlti3", &[lhs, truncated_rhs], fx.tcx.types.u128) - } - (BinOp::Shl, true) => { - fx.easy_call("__ashlti3", &[lhs, truncated_rhs], fx.tcx.types.i128) - } - (BinOp::Shr, false) => { - fx.easy_call("__lshrti3", &[lhs, truncated_rhs], fx.tcx.types.u128) - } - (BinOp::Shr, true) => { - fx.easy_call("__ashrti3", &[lhs, truncated_rhs], fx.tcx.types.i128) - } - (_, _) => unreachable!(), + _ => unreachable!(), }; if let Some(is_overflow) = is_overflow { let out_ty = fx.tcx.mk_tup([lhs.layout().ty, fx.tcx.types.bool].iter()); - let val = val.load_scalar(fx); Some(CValue::by_val_pair(val, is_overflow, fx.layout_of(out_ty))) } else { - Some(val) + Some(CValue::by_val(val, lhs.layout())) } } } diff --git a/compiler/rustc_codegen_cranelift/src/common.rs b/compiler/rustc_codegen_cranelift/src/common.rs index fbee84e09f..6a4a6744a5 100644 --- a/compiler/rustc_codegen_cranelift/src/common.rs +++ b/compiler/rustc_codegen_cranelift/src/common.rs @@ -3,8 +3,6 @@ use rustc_target::abi::call::FnAbi; use rustc_target::abi::{Integer, Primitive}; use rustc_target::spec::{HasTargetSpec, Target}; -use cranelift_codegen::ir::{InstructionData, Opcode, ValueDef}; - use crate::prelude::*; pub(crate) fn pointer_ty(tcx: TyCtxt<'_>) -> types::Type { @@ -56,11 +54,7 @@ fn clif_type_from_ty<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> Option types::F64, }, ty::FnPtr(_) => pointer_ty(tcx), - ty::RawPtr(TypeAndMut { - ty: pointee_ty, - mutbl: _, - }) - | ty::Ref(_, pointee_ty, _) => { + ty::RawPtr(TypeAndMut { ty: pointee_ty, mutbl: _ }) | ty::Ref(_, pointee_ty, _) => { if has_ptr_meta(tcx, pointee_ty) { return None; } else { @@ -99,11 +93,7 @@ fn clif_pair_type_from_ty<'tcx>( } (a, b) } - ty::RawPtr(TypeAndMut { - ty: pointee_ty, - mutbl: _, - }) - | ty::Ref(_, pointee_ty, _) => { + ty::RawPtr(TypeAndMut { ty: pointee_ty, mutbl: _ }) | ty::Ref(_, pointee_ty, _) => { if has_ptr_meta(tcx, pointee_ty) { (pointer_ty(tcx), pointer_ty(tcx)) } else { @@ -116,15 +106,8 @@ fn clif_pair_type_from_ty<'tcx>( /// Is a pointer to this type a fat ptr? pub(crate) fn has_ptr_meta<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> bool { - let ptr_ty = tcx.mk_ptr(TypeAndMut { - ty, - mutbl: rustc_hir::Mutability::Not, - }); - match &tcx - .layout_of(ParamEnv::reveal_all().and(ptr_ty)) - .unwrap() - .abi - { + let ptr_ty = tcx.mk_ptr(TypeAndMut { ty, mutbl: rustc_hir::Mutability::Not }); + match &tcx.layout_of(ParamEnv::reveal_all().and(ptr_ty)).unwrap().abi { Abi::Scalar(_) => false, Abi::ScalarPair(_, _) => true, abi => unreachable!("Abi of ptr to {:?} is {:?}???", ty, abi), @@ -132,7 +115,7 @@ pub(crate) fn has_ptr_meta<'tcx>(tcx: TyCtxt<'tcx>, ty: Ty<'tcx>) -> bool { } pub(crate) fn codegen_icmp_imm( - fx: &mut FunctionCx<'_, '_, impl Module>, + fx: &mut FunctionCx<'_, '_, '_>, intcc: IntCC, lhs: Value, rhs: i128, @@ -175,51 +158,6 @@ pub(crate) fn codegen_icmp_imm( } } -fn resolve_normal_value_imm(func: &Function, val: Value) -> Option { - if let ValueDef::Result(inst, 0 /*param*/) = func.dfg.value_def(val) { - if let InstructionData::UnaryImm { - opcode: Opcode::Iconst, - imm, - } = func.dfg[inst] - { - Some(imm.into()) - } else { - None - } - } else { - None - } -} - -fn resolve_128bit_value_imm(func: &Function, val: Value) -> Option { - let (lsb, msb) = if let ValueDef::Result(inst, 0 /*param*/) = func.dfg.value_def(val) { - if let InstructionData::Binary { - opcode: Opcode::Iconcat, - args: [lsb, msb], - } = func.dfg[inst] - { - (lsb, msb) - } else { - return None; - } - } else { - return None; - }; - - let lsb = u128::from(resolve_normal_value_imm(func, lsb)? as u64); - let msb = u128::from(resolve_normal_value_imm(func, msb)? as u64); - - Some(msb << 64 | lsb) -} - -pub(crate) fn resolve_value_imm(func: &Function, val: Value) -> Option { - if func.dfg.value_type(val) == types::I128 { - resolve_128bit_value_imm(func, val) - } else { - resolve_normal_value_imm(func, val).map(|imm| u128::from(imm as u64)) - } -} - pub(crate) fn type_min_max_value( bcx: &mut FunctionBuilder<'_>, ty: Type, @@ -288,8 +226,8 @@ pub(crate) fn type_sign(ty: Ty<'_>) -> bool { } } -pub(crate) struct FunctionCx<'clif, 'tcx, M: Module> { - pub(crate) cx: &'clif mut crate::CodegenCx<'tcx, M>, +pub(crate) struct FunctionCx<'m, 'clif, 'tcx> { + pub(crate) cx: &'clif mut crate::CodegenCx<'m, 'tcx>, pub(crate) tcx: TyCtxt<'tcx>, pub(crate) pointer_type: Type, // Cached from module @@ -316,7 +254,7 @@ pub(crate) struct FunctionCx<'clif, 'tcx, M: Module> { pub(crate) inline_asm_index: u32, } -impl<'tcx, M: Module> LayoutOf for FunctionCx<'_, 'tcx, M> { +impl<'tcx> LayoutOf for FunctionCx<'_, '_, 'tcx> { type Ty = Ty<'tcx>; type TyAndLayout = TyAndLayout<'tcx>; @@ -325,31 +263,31 @@ impl<'tcx, M: Module> LayoutOf for FunctionCx<'_, 'tcx, M> { } } -impl<'tcx, M: Module> layout::HasTyCtxt<'tcx> for FunctionCx<'_, 'tcx, M> { +impl<'tcx> layout::HasTyCtxt<'tcx> for FunctionCx<'_, '_, 'tcx> { fn tcx<'b>(&'b self) -> TyCtxt<'tcx> { self.tcx } } -impl<'tcx, M: Module> rustc_target::abi::HasDataLayout for FunctionCx<'_, 'tcx, M> { +impl<'tcx> rustc_target::abi::HasDataLayout for FunctionCx<'_, '_, 'tcx> { fn data_layout(&self) -> &rustc_target::abi::TargetDataLayout { &self.tcx.data_layout } } -impl<'tcx, M: Module> layout::HasParamEnv<'tcx> for FunctionCx<'_, 'tcx, M> { +impl<'tcx> layout::HasParamEnv<'tcx> for FunctionCx<'_, '_, 'tcx> { fn param_env(&self) -> ParamEnv<'tcx> { ParamEnv::reveal_all() } } -impl<'tcx, M: Module> HasTargetSpec for FunctionCx<'_, 'tcx, M> { +impl<'tcx> HasTargetSpec for FunctionCx<'_, '_, 'tcx> { fn target_spec(&self) -> &Target { &self.tcx.sess.target } } -impl<'tcx, M: Module> FunctionCx<'_, 'tcx, M> { +impl<'tcx> FunctionCx<'_, '_, 'tcx> { pub(crate) fn monomorphize(&self, value: T) -> T where T: TypeFoldable<'tcx> + Copy, @@ -416,12 +354,7 @@ impl<'tcx, M: Module> FunctionCx<'_, 'tcx, M> { let msg_id = self .cx .module - .declare_data( - &format!("__{}_{:08x}", prefix, msg_hash), - Linkage::Local, - false, - false, - ) + .declare_data(&format!("__{}_{:08x}", prefix, msg_hash), Linkage::Local, false, false) .unwrap(); // Ignore DuplicateDefinition error, as the data will be the same @@ -444,15 +377,13 @@ impl<'tcx> LayoutOf for RevealAllLayoutCx<'tcx> { fn layout_of(&self, ty: Ty<'tcx>) -> TyAndLayout<'tcx> { assert!(!ty.still_further_specializable()); - self.0 - .layout_of(ParamEnv::reveal_all().and(&ty)) - .unwrap_or_else(|e| { - if let layout::LayoutError::SizeOverflow(_) = e { - self.0.sess.fatal(&e.to_string()) - } else { - bug!("failed to get layout for `{}`: {}", ty, e) - } - }) + self.0.layout_of(ParamEnv::reveal_all().and(&ty)).unwrap_or_else(|e| { + if let layout::LayoutError::SizeOverflow(_) = e { + self.0.sess.fatal(&e.to_string()) + } else { + bug!("failed to get layout for `{}`: {}", ty, e) + } + }) } } diff --git a/compiler/rustc_codegen_cranelift/src/constant.rs b/compiler/rustc_codegen_cranelift/src/constant.rs index 5702832bcb..9d93370b7d 100644 --- a/compiler/rustc_codegen_cranelift/src/constant.rs +++ b/compiler/rustc_codegen_cranelift/src/constant.rs @@ -8,7 +8,7 @@ use rustc_middle::middle::codegen_fn_attrs::CodegenFnAttrFlags; use rustc_middle::mir::interpret::{ read_target_uint, AllocId, Allocation, ConstValue, ErrorHandled, GlobalAlloc, Pointer, Scalar, }; -use rustc_middle::ty::{Const, ConstKind}; +use rustc_middle::ty::ConstKind; use cranelift_codegen::ir::GlobalValueData; use cranelift_module::*; @@ -28,7 +28,7 @@ enum TodoItem { } impl ConstantCx { - pub(crate) fn finalize(mut self, tcx: TyCtxt<'_>, module: &mut impl Module) { + pub(crate) fn finalize(mut self, tcx: TyCtxt<'_>, module: &mut dyn Module) { //println!("todo {:?}", self.todo); define_all_allocs(tcx, module, &mut self); //println!("done {:?}", self.done); @@ -36,21 +36,23 @@ impl ConstantCx { } } -pub(crate) fn check_constants(fx: &mut FunctionCx<'_, '_, impl Module>) { +pub(crate) fn check_constants(fx: &mut FunctionCx<'_, '_, '_>) -> bool { + let mut all_constants_ok = true; for constant in &fx.mir.required_consts { - let const_ = fx.monomorphize(constant.literal); + let const_ = match fx.monomorphize(constant.literal) { + ConstantKind::Ty(ct) => ct, + ConstantKind::Val(..) => continue, + }; match const_.val { ConstKind::Value(_) => {} ConstKind::Unevaluated(def, ref substs, promoted) => { if let Err(err) = - fx.tcx - .const_eval_resolve(ParamEnv::reveal_all(), def, substs, promoted, None) + fx.tcx.const_eval_resolve(ParamEnv::reveal_all(), def, substs, promoted, None) { + all_constants_ok = false; match err { ErrorHandled::Reported(ErrorReported) | ErrorHandled::Linted => { - fx.tcx - .sess - .span_err(constant.span, "erroneous constant encountered"); + fx.tcx.sess.span_err(constant.span, "erroneous constant encountered"); } ErrorHandled::TooGeneric => { span_bug!( @@ -69,6 +71,7 @@ pub(crate) fn check_constants(fx: &mut FunctionCx<'_, '_, impl Module>) { | ConstKind::Error(_) => unreachable!("{:?}", const_), } } + all_constants_ok } pub(crate) fn codegen_static(constants_cx: &mut ConstantCx, def_id: DefId) { @@ -76,11 +79,11 @@ pub(crate) fn codegen_static(constants_cx: &mut ConstantCx, def_id: DefId) { } pub(crate) fn codegen_tls_ref<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, def_id: DefId, layout: TyAndLayout<'tcx>, ) -> CValue<'tcx> { - let data_id = data_id_for_static(fx.tcx, &mut fx.cx.module, def_id, false); + let data_id = data_id_for_static(fx.tcx, fx.cx.module, def_id, false); let local_data_id = fx.cx.module.declare_data_in_func(data_id, &mut fx.bcx.func); #[cfg(debug_assertions)] fx.add_comment(local_data_id, format!("tls {:?}", def_id)); @@ -89,11 +92,11 @@ pub(crate) fn codegen_tls_ref<'tcx>( } fn codegen_static_ref<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, def_id: DefId, layout: TyAndLayout<'tcx>, ) -> CPlace<'tcx> { - let data_id = data_id_for_static(fx.tcx, &mut fx.cx.module, def_id, false); + let data_id = data_id_for_static(fx.tcx, fx.cx.module, def_id, false); let local_data_id = fx.cx.module.declare_data_in_func(data_id, &mut fx.bcx.func); #[cfg(debug_assertions)] fx.add_comment(local_data_id, format!("{:?}", def_id)); @@ -110,38 +113,26 @@ fn codegen_static_ref<'tcx>( } pub(crate) fn codegen_constant<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, constant: &Constant<'tcx>, ) -> CValue<'tcx> { - let const_ = fx.monomorphize(constant.literal); + let const_ = match fx.monomorphize(constant.literal) { + ConstantKind::Ty(ct) => ct, + ConstantKind::Val(val, ty) => return codegen_const_value(fx, val, ty), + }; let const_val = match const_.val { ConstKind::Value(const_val) => const_val, ConstKind::Unevaluated(def, ref substs, promoted) if fx.tcx.is_static(def.did) => { assert!(substs.is_empty()); assert!(promoted.is_none()); - return codegen_static_ref( - fx, - def.did, - fx.layout_of(fx.monomorphize(&constant.literal.ty)), - ) - .to_cvalue(fx); + return codegen_static_ref(fx, def.did, fx.layout_of(const_.ty)).to_cvalue(fx); } ConstKind::Unevaluated(def, ref substs, promoted) => { - match fx - .tcx - .const_eval_resolve(ParamEnv::reveal_all(), def, substs, promoted, None) - { + match fx.tcx.const_eval_resolve(ParamEnv::reveal_all(), def, substs, promoted, None) { Ok(const_val) => const_val, Err(_) => { - fx.tcx - .sess - .span_err(constant.span, "erroneous constant encountered"); - return crate::trap::trap_unreachable_ret_value( - fx, - fx.layout_of(const_.ty), - "erroneous constant encountered", - ); + span_bug!(constant.span, "erroneous constant not captured by required_consts"); } } } @@ -156,7 +147,7 @@ pub(crate) fn codegen_constant<'tcx>( } pub(crate) fn codegen_const_value<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, const_val: ConstValue<'tcx>, ty: Ty<'tcx>, ) -> CValue<'tcx> { @@ -172,9 +163,7 @@ pub(crate) fn codegen_const_value<'tcx>( if fx.clif_type(layout.ty).is_none() { let (size, align) = (layout.size, layout.align.pref); let mut alloc = Allocation::from_bytes( - std::iter::repeat(0) - .take(size.bytes_usize()) - .collect::>(), + std::iter::repeat(0).take(size.bytes_usize()).collect::>(), align, ); let ptr = Pointer::new(AllocId(!0), Size::ZERO); // The alloc id is never used @@ -190,11 +179,8 @@ pub(crate) fn codegen_const_value<'tcx>( let base_addr = match alloc_kind { Some(GlobalAlloc::Memory(alloc)) => { fx.cx.constants_cx.todo.push(TodoItem::Alloc(ptr.alloc_id)); - let data_id = data_id_for_alloc_id( - &mut fx.cx.module, - ptr.alloc_id, - alloc.mutability, - ); + let data_id = + data_id_for_alloc_id(fx.cx.module, ptr.alloc_id, alloc.mutability); let local_data_id = fx.cx.module.declare_data_in_func(data_id, &mut fx.bcx.func); #[cfg(debug_assertions)] @@ -203,15 +189,14 @@ pub(crate) fn codegen_const_value<'tcx>( } Some(GlobalAlloc::Function(instance)) => { let func_id = - crate::abi::import_function(fx.tcx, &mut fx.cx.module, instance); + crate::abi::import_function(fx.tcx, fx.cx.module, instance); let local_func_id = fx.cx.module.declare_func_in_func(func_id, &mut fx.bcx.func); fx.bcx.ins().func_addr(fx.pointer_type, local_func_id) } Some(GlobalAlloc::Static(def_id)) => { assert!(fx.tcx.is_static(def_id)); - let data_id = - data_id_for_static(fx.tcx, &mut fx.cx.module, def_id, false); + let data_id = data_id_for_static(fx.tcx, fx.cx.module, def_id, false); let local_data_id = fx.cx.module.declare_data_in_func(data_id, &mut fx.bcx.func); #[cfg(debug_assertions)] @@ -221,9 +206,7 @@ pub(crate) fn codegen_const_value<'tcx>( None => bug!("missing allocation {:?}", ptr.alloc_id), }; let val = if ptr.offset.bytes() != 0 { - fx.bcx - .ins() - .iadd_imm(base_addr, i64::try_from(ptr.offset.bytes()).unwrap()) + fx.bcx.ins().iadd_imm(base_addr, i64::try_from(ptr.offset.bytes()).unwrap()) } else { base_addr }; @@ -240,22 +223,22 @@ pub(crate) fn codegen_const_value<'tcx>( let ptr = pointer_for_allocation(fx, data) .offset_i64(fx, i64::try_from(start).unwrap()) .get_addr(fx); - let len = fx.bcx.ins().iconst( - fx.pointer_type, - i64::try_from(end.checked_sub(start).unwrap()).unwrap(), - ); + let len = fx + .bcx + .ins() + .iconst(fx.pointer_type, i64::try_from(end.checked_sub(start).unwrap()).unwrap()); CValue::by_val_pair(ptr, len, layout) } } } fn pointer_for_allocation<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, alloc: &'tcx Allocation, ) -> crate::pointer::Pointer { let alloc_id = fx.tcx.create_memory_alloc(alloc); fx.cx.constants_cx.todo.push(TodoItem::Alloc(alloc_id)); - let data_id = data_id_for_alloc_id(&mut fx.cx.module, alloc_id, alloc.mutability); + let data_id = data_id_for_alloc_id(fx.cx.module, alloc_id, alloc.mutability); let local_data_id = fx.cx.module.declare_data_in_func(data_id, &mut fx.bcx.func); #[cfg(debug_assertions)] @@ -265,7 +248,7 @@ fn pointer_for_allocation<'tcx>( } fn data_id_for_alloc_id( - module: &mut impl Module, + module: &mut dyn Module, alloc_id: AllocId, mutability: rustc_hir::Mutability, ) -> DataId { @@ -281,7 +264,7 @@ fn data_id_for_alloc_id( fn data_id_for_static( tcx: TyCtxt<'_>, - module: &mut impl Module, + module: &mut dyn Module, def_id: DefId, definition: bool, ) -> DataId { @@ -304,12 +287,7 @@ fn data_id_for_static( } else { !ty.is_freeze(tcx.at(DUMMY_SP), ParamEnv::reveal_all()) }; - let align = tcx - .layout_of(ParamEnv::reveal_all().and(ty)) - .unwrap() - .align - .pref - .bytes(); + let align = tcx.layout_of(ParamEnv::reveal_all().and(ty)).unwrap().align.pref.bytes(); let attrs = tcx.codegen_fn_attrs(def_id); @@ -332,17 +310,11 @@ fn data_id_for_static( // zero. let ref_name = format!("_rust_extern_with_linkage_{}", symbol_name); - let ref_data_id = module - .declare_data(&ref_name, Linkage::Local, false, false) - .unwrap(); + let ref_data_id = module.declare_data(&ref_name, Linkage::Local, false, false).unwrap(); let mut data_ctx = DataContext::new(); data_ctx.set_align(align); let data = module.declare_data_in_data(data_id, &mut data_ctx); - data_ctx.define( - std::iter::repeat(0) - .take(pointer_ty(tcx).bytes() as usize) - .collect(), - ); + data_ctx.define(std::iter::repeat(0).take(pointer_ty(tcx).bytes() as usize).collect()); data_ctx.write_data_addr(0, data, 0); match module.define_data(ref_data_id, &data_ctx) { // Every time the static is referenced there will be another definition of this global, @@ -356,7 +328,7 @@ fn data_id_for_static( } } -fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut impl Module, cx: &mut ConstantCx) { +fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut dyn Module, cx: &mut ConstantCx) { while let Some(todo_item) = cx.todo.pop() { let (data_id, alloc, section_name) = match todo_item { TodoItem::Alloc(alloc_id) => { @@ -371,10 +343,7 @@ fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut impl Module, cx: &mut Constan TodoItem::Static(def_id) => { //println!("static {:?}", def_id); - let section_name = tcx - .codegen_fn_attrs(def_id) - .link_section - .map(|s| s.as_str()); + let section_name = tcx.codegen_fn_attrs(def_id).link_section.map(|s| s.as_str()); let alloc = tcx.eval_static_initializer(def_id).unwrap(); @@ -396,9 +365,7 @@ fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut impl Module, cx: &mut Constan data_ctx.set_segment_section("", &*section_name); } - let bytes = alloc - .inspect_with_uninit_and_ptr_outside_interpreter(0..alloc.len()) - .to_vec(); + let bytes = alloc.inspect_with_uninit_and_ptr_outside_interpreter(0..alloc.len()).to_vec(); data_ctx.define(bytes.into_boxed_slice()); for &(offset, (_tag, reloc)) in alloc.relocations().iter() { @@ -426,10 +393,7 @@ fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut impl Module, cx: &mut Constan data_id_for_alloc_id(module, reloc, target_alloc.mutability) } GlobalAlloc::Static(def_id) => { - if tcx - .codegen_fn_attrs(def_id) - .flags - .contains(CodegenFnAttrFlags::THREAD_LOCAL) + if tcx.codegen_fn_attrs(def_id).flags.contains(CodegenFnAttrFlags::THREAD_LOCAL) { tcx.sess.fatal(&format!( "Allocation {:?} contains reference to TLS value {:?}", @@ -457,14 +421,16 @@ fn define_all_allocs(tcx: TyCtxt<'_>, module: &mut impl Module, cx: &mut Constan } pub(crate) fn mir_operand_get_const_val<'tcx>( - fx: &FunctionCx<'_, 'tcx, impl Module>, + fx: &FunctionCx<'_, '_, 'tcx>, operand: &Operand<'tcx>, -) -> Option<&'tcx Const<'tcx>> { +) -> Option> { match operand { Operand::Copy(_) | Operand::Move(_) => None, - Operand::Constant(const_) => Some( - fx.monomorphize(const_.literal) - .eval(fx.tcx, ParamEnv::reveal_all()), - ), + Operand::Constant(const_) => match const_.literal { + ConstantKind::Ty(const_) => { + fx.monomorphize(const_).eval(fx.tcx, ParamEnv::reveal_all()).val.try_to_value() + } + ConstantKind::Val(val, _) => Some(val), + }, } } diff --git a/compiler/rustc_codegen_cranelift/src/debuginfo/emit.rs b/compiler/rustc_codegen_cranelift/src/debuginfo/emit.rs index 6160f9b78d..6018eefcd4 100644 --- a/compiler/rustc_codegen_cranelift/src/debuginfo/emit.rs +++ b/compiler/rustc_codegen_cranelift/src/debuginfo/emit.rs @@ -14,10 +14,7 @@ impl DebugContext<'_> { let unit_range_list_id = self.dwarf.unit.ranges.add(self.unit_range_list.clone()); let root = self.dwarf.unit.root(); let root = self.dwarf.unit.get_mut(root); - root.set( - gimli::DW_AT_ranges, - AttributeValue::RangeListRef(unit_range_list_id), - ); + root.set(gimli::DW_AT_ranges, AttributeValue::RangeListRef(unit_range_list_id)); let mut sections = Sections::new(WriterRelocate::new(self.endian)); self.dwarf.write(&mut sections).unwrap(); @@ -66,10 +63,7 @@ pub(super) struct WriterRelocate { impl WriterRelocate { pub(super) fn new(endian: RunTimeEndian) -> Self { - WriterRelocate { - relocs: Vec::new(), - writer: EndianVec::new(endian), - } + WriterRelocate { relocs: Vec::new(), writer: EndianVec::new(endian) } } /// Perform the collected relocations to be usable for JIT usage. @@ -85,9 +79,7 @@ impl WriterRelocate { cranelift_module::FuncId::from_u32(sym.try_into().unwrap()), ); let val = (addr as u64 as i64 + reloc.addend) as u64; - self.writer - .write_udata_at(reloc.offset as usize, val, reloc.size) - .unwrap(); + self.writer.write_udata_at(reloc.offset as usize, val, reloc.size).unwrap(); } } } diff --git a/compiler/rustc_codegen_cranelift/src/debuginfo/line_info.rs b/compiler/rustc_codegen_cranelift/src/debuginfo/line_info.rs index d226755d85..30ed356c76 100644 --- a/compiler/rustc_codegen_cranelift/src/debuginfo/line_info.rs +++ b/compiler/rustc_codegen_cranelift/src/debuginfo/line_info.rs @@ -53,11 +53,7 @@ pub(crate) fn make_file_info(hash: SourceFileHash) -> Option { if hash.kind == SourceFileHashAlgorithm::Md5 { let mut buf = [0u8; MD5_LEN]; buf.copy_from_slice(hash.hash_bytes()); - Some(FileInfo { - timestamp: 0, - size: 0, - md5: buf, - }) + Some(FileInfo { timestamp: 0, size: 0, md5: buf }) } else { None } @@ -112,24 +108,14 @@ impl<'tcx> DebugContext<'tcx> { let entry = self.dwarf.unit.get_mut(entry_id); - entry.set( - gimli::DW_AT_decl_file, - AttributeValue::FileIndex(Some(file_id)), - ); - entry.set( - gimli::DW_AT_decl_line, - AttributeValue::Udata(loc.line as u64), - ); + entry.set(gimli::DW_AT_decl_file, AttributeValue::FileIndex(Some(file_id))); + entry.set(gimli::DW_AT_decl_line, AttributeValue::Udata(loc.line as u64)); // FIXME: probably omit this - entry.set( - gimli::DW_AT_decl_column, - AttributeValue::Udata(loc.col.to_usize() as u64), - ); + entry.set(gimli::DW_AT_decl_column, AttributeValue::Udata(loc.col.to_usize() as u64)); } pub(super) fn create_debug_lines( &mut self, - isa: &dyn cranelift_codegen::isa::TargetIsa, symbol: usize, entry_id: UnitEntryId, context: &Context, @@ -138,7 +124,6 @@ impl<'tcx> DebugContext<'tcx> { ) -> CodeOffset { let tcx = self.tcx; let line_program = &mut self.dwarf.unit.line_program; - let func = &context.func; let line_strings = &mut self.dwarf.line_strings; let mut last_span = None; @@ -202,43 +187,22 @@ impl<'tcx> DebugContext<'tcx> { let mut func_end = 0; - if let Some(ref mcr) = &context.mach_compile_result { - for &MachSrcLoc { start, end, loc } in mcr.buffer.get_srclocs_sorted() { - line_program.row().address_offset = u64::from(start); - if !loc.is_default() { - let source_info = *source_info_set.get_index(loc.bits() as usize).unwrap(); - create_row_for_span(line_program, source_info.span); - } else { - create_row_for_span(line_program, function_span); - } - func_end = end; - } - - line_program.end_sequence(u64::from(func_end)); - - func_end = mcr.buffer.total_size(); - } else { - let encinfo = isa.encoding_info(); - let mut blocks = func.layout.blocks().collect::>(); - blocks.sort_by_key(|block| func.offsets[*block]); // Ensure inst offsets always increase - - for block in blocks { - for (offset, inst, size) in func.inst_offsets(block, &encinfo) { - let srcloc = func.srclocs[inst]; - line_program.row().address_offset = u64::from(offset); - if !srcloc.is_default() { - let source_info = - *source_info_set.get_index(srcloc.bits() as usize).unwrap(); - create_row_for_span(line_program, source_info.span); - } else { - create_row_for_span(line_program, function_span); - } - func_end = offset + size; - } + let mcr = context.mach_compile_result.as_ref().unwrap(); + for &MachSrcLoc { start, end, loc } in mcr.buffer.get_srclocs_sorted() { + line_program.row().address_offset = u64::from(start); + if !loc.is_default() { + let source_info = *source_info_set.get_index(loc.bits() as usize).unwrap(); + create_row_for_span(line_program, source_info.span); + } else { + create_row_for_span(line_program, function_span); } - line_program.end_sequence(u64::from(func_end)); + func_end = end; } + line_program.end_sequence(u64::from(func_end)); + + let func_end = mcr.buffer.total_size(); + assert_ne!(func_end, 0); let entry = self.dwarf.unit.get_mut(entry_id); @@ -246,10 +210,7 @@ impl<'tcx> DebugContext<'tcx> { gimli::DW_AT_low_pc, AttributeValue::Address(Address::Symbol { symbol, addend: 0 }), ); - entry.set( - gimli::DW_AT_high_pc, - AttributeValue::Udata(u64::from(func_end)), - ); + entry.set(gimli::DW_AT_high_pc, AttributeValue::Udata(u64::from(func_end))); self.emit_location(entry_id, function_span); diff --git a/compiler/rustc_codegen_cranelift/src/debuginfo/mod.rs b/compiler/rustc_codegen_cranelift/src/debuginfo/mod.rs index a6f4ded41b..dc8bc8d9cb 100644 --- a/compiler/rustc_codegen_cranelift/src/debuginfo/mod.rs +++ b/compiler/rustc_codegen_cranelift/src/debuginfo/mod.rs @@ -9,7 +9,7 @@ use crate::prelude::*; use rustc_index::vec::IndexVec; use cranelift_codegen::entity::EntityRef; -use cranelift_codegen::ir::{StackSlots, ValueLabel, ValueLoc}; +use cranelift_codegen::ir::{LabelValueLoc, StackSlots, ValueLabel, ValueLoc}; use cranelift_codegen::isa::TargetIsa; use cranelift_codegen::ValueLocRange; @@ -39,7 +39,6 @@ pub(crate) struct DebugContext<'tcx> { dwarf: DwarfUnit, unit_range_list: RangeList, - clif_types: FxHashMap, types: FxHashMap, UnitEntryId>, } @@ -91,20 +90,11 @@ impl<'tcx> DebugContext<'tcx> { let root = dwarf.unit.root(); let root = dwarf.unit.get_mut(root); - root.set( - gimli::DW_AT_producer, - AttributeValue::StringRef(dwarf.strings.add(producer)), - ); - root.set( - gimli::DW_AT_language, - AttributeValue::Language(gimli::DW_LANG_Rust), - ); + root.set(gimli::DW_AT_producer, AttributeValue::StringRef(dwarf.strings.add(producer))); + root.set(gimli::DW_AT_language, AttributeValue::Language(gimli::DW_LANG_Rust)); root.set(gimli::DW_AT_name, AttributeValue::StringRef(name)); root.set(gimli::DW_AT_comp_dir, AttributeValue::StringRef(comp_dir)); - root.set( - gimli::DW_AT_low_pc, - AttributeValue::Address(Address::Constant(0)), - ); + root.set(gimli::DW_AT_low_pc, AttributeValue::Address(Address::Constant(0))); } DebugContext { @@ -115,48 +105,10 @@ impl<'tcx> DebugContext<'tcx> { dwarf, unit_range_list: RangeList(Vec::new()), - clif_types: FxHashMap::default(), types: FxHashMap::default(), } } - fn dwarf_ty_for_clif_ty(&mut self, ty: Type) -> UnitEntryId { - if let Some(type_id) = self.clif_types.get(&ty) { - return *type_id; - } - - let new_entry = |dwarf: &mut DwarfUnit, tag| dwarf.unit.add(dwarf.unit.root(), tag); - - let primitive = |dwarf: &mut DwarfUnit, ate| { - let type_id = new_entry(dwarf, gimli::DW_TAG_base_type); - let type_entry = dwarf.unit.get_mut(type_id); - type_entry.set(gimli::DW_AT_encoding, AttributeValue::Encoding(ate)); - type_id - }; - - let type_id = if ty.is_bool() { - primitive(&mut self.dwarf, gimli::DW_ATE_boolean) - } else if ty.is_int() { - primitive(&mut self.dwarf, gimli::DW_ATE_address) - } else if ty.is_float() { - primitive(&mut self.dwarf, gimli::DW_ATE_float) - } else { - new_entry(&mut self.dwarf, gimli::DW_TAG_structure_type) - }; - - let type_entry = self.dwarf.unit.get_mut(type_id); - type_entry.set( - gimli::DW_AT_name, - AttributeValue::String(format!("{}", ty).replace('i', "u").into_bytes()), - ); - type_entry.set( - gimli::DW_AT_byte_size, - AttributeValue::Udata(u64::from(ty.bytes())), - ); - - type_id - } - fn dwarf_ty(&mut self, ty: Ty<'tcx>) -> UnitEntryId { if let Some(type_id) = self.types.get(ty) { return *type_id; @@ -181,10 +133,7 @@ impl<'tcx> DebugContext<'tcx> { ty::Int(_) => primitive(&mut self.dwarf, gimli::DW_ATE_signed), ty::Float(_) => primitive(&mut self.dwarf, gimli::DW_ATE_float), ty::Ref(_, pointee_ty, _mutbl) - | ty::RawPtr(ty::TypeAndMut { - ty: pointee_ty, - mutbl: _mutbl, - }) => { + | ty::RawPtr(ty::TypeAndMut { ty: pointee_ty, mutbl: _mutbl }) => { let type_id = new_entry(&mut self.dwarf, gimli::DW_TAG_pointer_type); // Ensure that type is inserted before recursing to avoid duplicates @@ -211,10 +160,7 @@ impl<'tcx> DebugContext<'tcx> { let field_offset = layout.fields.offset(field_idx); let field_layout = layout .field( - &layout::LayoutCx { - tcx: self.tcx, - param_env: ParamEnv::reveal_all(), - }, + &layout::LayoutCx { tcx: self.tcx, param_env: ParamEnv::reveal_all() }, field_idx, ) .unwrap(); @@ -243,10 +189,7 @@ impl<'tcx> DebugContext<'tcx> { let type_entry = self.dwarf.unit.get_mut(type_id); type_entry.set(gimli::DW_AT_name, AttributeValue::String(name.into_bytes())); - type_entry.set( - gimli::DW_AT_byte_size, - AttributeValue::Udata(layout.size.bytes()), - ); + type_entry.set(gimli::DW_AT_byte_size, AttributeValue::Udata(layout.size.bytes())); self.types.insert(ty, type_id); @@ -286,23 +229,15 @@ impl<'tcx> DebugContext<'tcx> { let name_id = self.dwarf.strings.add(name); // Gdb requires DW_AT_name. Otherwise the DW_TAG_subprogram is skipped. entry.set(gimli::DW_AT_name, AttributeValue::StringRef(name_id)); - entry.set( - gimli::DW_AT_linkage_name, - AttributeValue::StringRef(name_id), - ); + entry.set(gimli::DW_AT_linkage_name, AttributeValue::StringRef(name_id)); - let end = - self.create_debug_lines(isa, symbol, entry_id, context, mir.span, source_info_set); + let end = self.create_debug_lines(symbol, entry_id, context, mir.span, source_info_set); self.unit_range_list.0.push(Range::StartLength { begin: Address::Symbol { symbol, addend: 0 }, length: u64::from(end), }); - if isa.get_mach_backend().is_some() { - return; // Not yet implemented for the AArch64 backend. - } - let func_entry = self.dwarf.unit.get_mut(entry_id); // Gdb requires both DW_AT_low_pc and DW_AT_high_pc. Otherwise the DW_TAG_subprogram is skipped. func_entry.set( @@ -312,51 +247,6 @@ impl<'tcx> DebugContext<'tcx> { // Using Udata for DW_AT_high_pc requires at least DWARF4 func_entry.set(gimli::DW_AT_high_pc, AttributeValue::Udata(u64::from(end))); - // FIXME Remove once actual debuginfo for locals works. - for (i, (param, &val)) in context - .func - .signature - .params - .iter() - .zip( - context - .func - .dfg - .block_params(context.func.layout.entry_block().unwrap()), - ) - .enumerate() - { - use cranelift_codegen::ir::ArgumentPurpose; - let base_name = match param.purpose { - ArgumentPurpose::Normal => "arg", - ArgumentPurpose::StructArgument(_) => "struct_arg", - ArgumentPurpose::StructReturn => "sret", - ArgumentPurpose::Link - | ArgumentPurpose::FramePointer - | ArgumentPurpose::CalleeSaved => continue, - ArgumentPurpose::VMContext - | ArgumentPurpose::SignatureId - | ArgumentPurpose::CallerTLS - | ArgumentPurpose::CalleeTLS - | ArgumentPurpose::StackLimit => unreachable!(), - }; - let name = format!("{}{}", base_name, i); - - let dw_ty = self.dwarf_ty_for_clif_ty(param.value_type); - let loc = - translate_loc(isa, context.func.locations[val], &context.func.stack_slots).unwrap(); - - let arg_id = self - .dwarf - .unit - .add(entry_id, gimli::DW_TAG_formal_parameter); - let var_entry = self.dwarf.unit.get_mut(arg_id); - - var_entry.set(gimli::DW_AT_name, AttributeValue::String(name.into_bytes())); - var_entry.set(gimli::DW_AT_type, AttributeValue::UnitRef(dw_ty)); - var_entry.set(gimli::DW_AT_location, AttributeValue::Exprloc(loc)); - } - // FIXME make it more reliable and implement scopes before re-enabling this. if false { let value_labels_ranges = context.build_value_labels_ranges(isa).unwrap(); @@ -376,10 +266,7 @@ impl<'tcx> DebugContext<'tcx> { context, &local_map, &value_labels_ranges, - Place { - local, - projection: ty::List::empty(), - }, + Place { local, projection: ty::List::empty() }, ); let var_entry = self.dwarf.unit.get_mut(var_id); @@ -417,10 +304,7 @@ fn place_location<'tcx>( symbol, addend: i64::from(value_loc_range.start), }, - end: Address::Symbol { - symbol, - addend: i64::from(value_loc_range.end), - }, + end: Address::Symbol { symbol, addend: i64::from(value_loc_range.end) }, data: translate_loc( isa, value_loc_range.loc, @@ -463,17 +347,17 @@ fn place_location<'tcx>( // Adapted from https://github.com/CraneStation/wasmtime/blob/5a1845b4caf7a5dba8eda1fef05213a532ed4259/crates/debug/src/transform/expression.rs#L59-L137 fn translate_loc( isa: &dyn TargetIsa, - loc: ValueLoc, + loc: LabelValueLoc, stack_slots: &StackSlots, ) -> Option { match loc { - ValueLoc::Reg(reg) => { + LabelValueLoc::ValueLoc(ValueLoc::Reg(reg)) => { let machine_reg = isa.map_dwarf_register(reg).unwrap(); let mut expr = Expression::new(); expr.op_reg(gimli::Register(machine_reg)); Some(expr) } - ValueLoc::Stack(ss) => { + LabelValueLoc::ValueLoc(ValueLoc::Stack(ss)) => { if let Some(ss_offset) = stack_slots[ss].offset { let mut expr = Expression::new(); expr.op_breg(X86_64::RBP, i64::from(ss_offset) + 16); @@ -482,6 +366,17 @@ fn translate_loc( None } } - _ => None, + LabelValueLoc::ValueLoc(ValueLoc::Unassigned) => unreachable!(), + LabelValueLoc::Reg(reg) => { + let machine_reg = isa.map_regalloc_reg_to_dwarf(reg).unwrap(); + let mut expr = Expression::new(); + expr.op_reg(gimli::Register(machine_reg)); + Some(expr) + } + LabelValueLoc::SPOffset(offset) => { + let mut expr = Expression::new(); + expr.op_breg(X86_64::RSP, offset); + Some(expr) + } } } diff --git a/compiler/rustc_codegen_cranelift/src/debuginfo/unwind.rs b/compiler/rustc_codegen_cranelift/src/debuginfo/unwind.rs index 49de927cdb..357c9fe6ed 100644 --- a/compiler/rustc_codegen_cranelift/src/debuginfo/unwind.rs +++ b/compiler/rustc_codegen_cranelift/src/debuginfo/unwind.rs @@ -28,11 +28,7 @@ impl<'tcx> UnwindContext<'tcx> { None }; - UnwindContext { - tcx, - frame_table, - cie_id, - } + UnwindContext { tcx, frame_table, cie_id } } pub(crate) fn add_function(&mut self, func_id: FuncId, context: &Context, isa: &dyn TargetIsa) { @@ -46,10 +42,8 @@ impl<'tcx> UnwindContext<'tcx> { UnwindInfo::SystemV(unwind_info) => { self.frame_table.add_fde( self.cie_id.unwrap(), - unwind_info.to_fde(Address::Symbol { - symbol: func_id.as_u32() as usize, - addend: 0, - }), + unwind_info + .to_fde(Address::Symbol { symbol: func_id.as_u32() as usize, addend: 0 }), ); } UnwindInfo::WindowsX64(_) => { @@ -60,9 +54,8 @@ impl<'tcx> UnwindContext<'tcx> { } pub(crate) fn emit(self, product: &mut P) { - let mut eh_frame = EhFrame::from(super::emit::WriterRelocate::new(super::target_endian( - self.tcx, - ))); + let mut eh_frame = + EhFrame::from(super::emit::WriterRelocate::new(super::target_endian(self.tcx))); self.frame_table.write_eh_frame(&mut eh_frame).unwrap(); if !eh_frame.0.writer.slice().is_empty() { @@ -82,9 +75,8 @@ impl<'tcx> UnwindContext<'tcx> { self, jit_module: &cranelift_jit::JITModule, ) -> Option { - let mut eh_frame = EhFrame::from(super::emit::WriterRelocate::new(super::target_endian( - self.tcx, - ))); + let mut eh_frame = + EhFrame::from(super::emit::WriterRelocate::new(super::target_endian(self.tcx))); self.frame_table.write_eh_frame(&mut eh_frame).unwrap(); if eh_frame.0.writer.slice().is_empty() { @@ -130,10 +122,7 @@ impl<'tcx> UnwindContext<'tcx> { registrations.push(ptr as usize); } - Some(UnwindRegistry { - _frame_table: eh_frame, - registrations, - }) + Some(UnwindRegistry { _frame_table: eh_frame, registrations }) } } diff --git a/compiler/rustc_codegen_cranelift/src/discriminant.rs b/compiler/rustc_codegen_cranelift/src/discriminant.rs index ad635016a9..3326f87f00 100644 --- a/compiler/rustc_codegen_cranelift/src/discriminant.rs +++ b/compiler/rustc_codegen_cranelift/src/discriminant.rs @@ -7,7 +7,7 @@ use rustc_target::abi::{Int, TagEncoding, Variants}; use crate::prelude::*; pub(crate) fn codegen_set_discriminant<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, place: CPlace<'tcx>, variant_index: VariantIdx, ) { @@ -26,11 +26,7 @@ pub(crate) fn codegen_set_discriminant<'tcx>( variants: _, } => { let ptr = place.place_field(fx, mir::Field::new(tag_field)); - let to = layout - .ty - .discriminant_for_variant(fx.tcx, variant_index) - .unwrap() - .val; + let to = layout.ty.discriminant_for_variant(fx.tcx, variant_index).unwrap().val; let to = if ptr.layout().abi.is_signed() { ty::ScalarInt::try_from_int( ptr.layout().size.sign_extend(to) as i128, @@ -46,12 +42,7 @@ pub(crate) fn codegen_set_discriminant<'tcx>( Variants::Multiple { tag: _, tag_field, - tag_encoding: - TagEncoding::Niche { - dataful_variant, - ref niche_variants, - niche_start, - }, + tag_encoding: TagEncoding::Niche { dataful_variant, ref niche_variants, niche_start }, variants: _, } => { if variant_index != dataful_variant { @@ -70,7 +61,7 @@ pub(crate) fn codegen_set_discriminant<'tcx>( } pub(crate) fn codegen_get_discriminant<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, value: CValue<'tcx>, dest_layout: TyAndLayout<'tcx>, ) -> CValue<'tcx> { @@ -101,12 +92,9 @@ pub(crate) fn codegen_get_discriminant<'tcx>( }; return CValue::const_val(fx, dest_layout, discr_val); } - Variants::Multiple { - tag, - tag_field, - tag_encoding, - variants: _, - } => (tag, *tag_field, tag_encoding), + Variants::Multiple { tag, tag_field, tag_encoding, variants: _ } => { + (tag, *tag_field, tag_encoding) + } }; let cast_to = fx.clif_type(dest_layout.ty).unwrap(); @@ -125,11 +113,7 @@ pub(crate) fn codegen_get_discriminant<'tcx>( let val = clif_intcast(fx, tag, cast_to, signed); CValue::by_val(val, dest_layout) } - TagEncoding::Niche { - dataful_variant, - ref niche_variants, - niche_start, - } => { + TagEncoding::Niche { dataful_variant, ref niche_variants, niche_start } => { // Rebase from niche values to discriminants, and check // whether the result is in range for the niche variants. @@ -146,9 +130,7 @@ pub(crate) fn codegen_get_discriminant<'tcx>( tag } else { // FIXME handle niche_start > i64::MAX - fx.bcx - .ins() - .iadd_imm(tag, -i64::try_from(niche_start).unwrap()) + fx.bcx.ins().iadd_imm(tag, -i64::try_from(niche_start).unwrap()) }; let relative_max = niche_variants.end().as_u32() - niche_variants.start().as_u32(); let is_niche = { @@ -176,15 +158,10 @@ pub(crate) fn codegen_get_discriminant<'tcx>( } else { clif_intcast(fx, relative_discr, cast_to, false) }; - fx.bcx - .ins() - .iadd_imm(relative_discr, i64::from(niche_variants.start().as_u32())) + fx.bcx.ins().iadd_imm(relative_discr, i64::from(niche_variants.start().as_u32())) }; - let dataful_variant = fx - .bcx - .ins() - .iconst(cast_to, i64::from(dataful_variant.as_u32())); + let dataful_variant = fx.bcx.ins().iconst(cast_to, i64::from(dataful_variant.as_u32())); let discr = fx.bcx.ins().select(is_niche, niche_discr, dataful_variant); CValue::by_val(discr, dest_layout) } diff --git a/compiler/rustc_codegen_cranelift/src/driver/aot.rs b/compiler/rustc_codegen_cranelift/src/driver/aot.rs index df89883f0b..b87dcc4192 100644 --- a/compiler/rustc_codegen_cranelift/src/driver/aot.rs +++ b/compiler/rustc_codegen_cranelift/src/driver/aot.rs @@ -12,11 +12,9 @@ use rustc_middle::mir::mono::{CodegenUnit, MonoItem}; use rustc_session::cgu_reuse_tracker::CguReuse; use rustc_session::config::{DebugInfo, OutputType}; -use cranelift_object::{ObjectModule, ObjectProduct}; +use cranelift_object::ObjectModule; -use crate::prelude::*; - -use crate::backend::AddConstructor; +use crate::{prelude::*, BackendConfig}; fn new_module(tcx: TyCtxt<'_>, name: String) -> ObjectModule { let module = crate::backend::make_module(tcx.sess, name); @@ -39,7 +37,6 @@ fn emit_module( module: ObjectModule, debug: Option>, unwind_context: UnwindContext<'_>, - map_product: impl FnOnce(ObjectProduct) -> ObjectProduct, ) -> ModuleCodegenResult { let mut product = module.finish(); @@ -49,15 +46,10 @@ fn emit_module( unwind_context.emit(&mut product); - let product = map_product(product); - - let tmp_file = tcx - .output_filenames(LOCAL_CRATE) - .temp_path(OutputType::Object, Some(&name)); + let tmp_file = tcx.output_filenames(LOCAL_CRATE).temp_path(OutputType::Object, Some(&name)); let obj = product.object.write().unwrap(); if let Err(err) = std::fs::write(&tmp_file, obj) { - tcx.sess - .fatal(&format!("error writing object file: {}", err)); + tcx.sess.fatal(&format!("error writing object file: {}", err)); } let work_product = if std::env::var("CG_CLIF_INCR_CACHE_DISABLED").is_ok() { @@ -71,13 +63,7 @@ fn emit_module( }; ModuleCodegenResult( - CompiledModule { - name, - kind, - object: Some(tmp_file), - dwarf_object: None, - bytecode: None, - }, + CompiledModule { name, kind, object: Some(tmp_file), dwarf_object: None, bytecode: None }, work_product, ) } @@ -117,55 +103,33 @@ fn reuse_workproduct_for_cgu( } } -fn module_codegen(tcx: TyCtxt<'_>, cgu_name: rustc_span::Symbol) -> ModuleCodegenResult { +fn module_codegen( + tcx: TyCtxt<'_>, + (backend_config, cgu_name): (BackendConfig, rustc_span::Symbol), +) -> ModuleCodegenResult { let cgu = tcx.codegen_unit(cgu_name); let mono_items = cgu.items_in_deterministic_order(tcx); let mut module = new_module(tcx, cgu_name.as_str().to_string()); - // Initialize the global atomic mutex using a constructor for proc-macros. - // FIXME implement atomic instructions in Cranelift. - let mut init_atomics_mutex_from_constructor = None; - if tcx - .sess - .crate_types() - .contains(&rustc_session::config::CrateType::ProcMacro) - { - if mono_items.iter().any(|(mono_item, _)| match mono_item { - rustc_middle::mir::mono::MonoItem::Static(def_id) => tcx - .symbol_name(Instance::mono(tcx, *def_id)) - .name - .contains("__rustc_proc_macro_decls_"), - _ => false, - }) { - init_atomics_mutex_from_constructor = - Some(crate::atomic_shim::init_global_lock_constructor( - &mut module, - &format!("{}_init_atomics_mutex", cgu_name.as_str()), - )); - } - } - let mut cx = crate::CodegenCx::new( tcx, - module, + backend_config, + &mut module, tcx.sess.opts.debuginfo != DebugInfo::None, - true, ); super::predefine_mono_items(&mut cx, &mono_items); for (mono_item, (linkage, visibility)) in mono_items { let linkage = crate::linkage::get_clif_linkage(mono_item, linkage, visibility); match mono_item { MonoItem::Fn(inst) => { - cx.tcx.sess.time("codegen fn", || { - crate::base::codegen_fn(&mut cx, inst, linkage) - }); + cx.tcx.sess.time("codegen fn", || crate::base::codegen_fn(&mut cx, inst, linkage)); } MonoItem::Static(def_id) => { crate::constant::codegen_static(&mut cx.constants_cx, def_id) } - MonoItem::GlobalAsm(hir_id) => { - let item = cx.tcx.hir().expect_item(hir_id); + MonoItem::GlobalAsm(item_id) => { + let item = cx.tcx.hir().item(item_id); if let rustc_hir::ItemKind::GlobalAsm(rustc_hir::GlobalAsm { asm }) = item.kind { cx.global_asm.push_str(&*asm.as_str()); cx.global_asm.push_str("\n\n"); @@ -175,9 +139,9 @@ fn module_codegen(tcx: TyCtxt<'_>, cgu_name: rustc_span::Symbol) -> ModuleCodege } } } - let (mut module, global_asm, debug, mut unwind_context) = + let (global_asm, debug, mut unwind_context) = tcx.sess.time("finalize CodegenCx", || cx.finalize()); - crate::main_shim::maybe_create_entry_wrapper(tcx, &mut module, &mut unwind_context, false); + crate::main_shim::maybe_create_entry_wrapper(tcx, &mut module, &mut unwind_context); let codegen_result = emit_module( tcx, @@ -186,13 +150,6 @@ fn module_codegen(tcx: TyCtxt<'_>, cgu_name: rustc_span::Symbol) -> ModuleCodege module, debug, unwind_context, - |mut product| { - if let Some(func_id) = init_atomics_mutex_from_constructor { - product.add_constructor(func_id); - } - - product - }, ); codegen_global_asm(tcx, &cgu.name().as_str(), &global_asm); @@ -202,6 +159,7 @@ fn module_codegen(tcx: TyCtxt<'_>, cgu_name: rustc_span::Symbol) -> ModuleCodege pub(super) fn run_aot( tcx: TyCtxt<'_>, + backend_config: BackendConfig, metadata: EncodedMetadata, need_metadata_module: bool, ) -> Box<(CodegenResults, FxHashMap)> { @@ -225,9 +183,7 @@ pub(super) fn run_aot( cgus.iter() .map(|cgu| { let cgu_reuse = determine_cgu_reuse(tcx, cgu); - tcx.sess - .cgu_reuse_tracker - .set_actual_reuse(&cgu.name().as_str(), cgu_reuse); + tcx.sess.cgu_reuse_tracker.set_actual_reuse(&cgu.name().as_str(), cgu_reuse); match cgu_reuse { _ if std::env::var("CG_CLIF_INCR_CACHE_DISABLED").is_ok() => {} @@ -242,7 +198,7 @@ pub(super) fn run_aot( let (ModuleCodegenResult(module, work_product), _) = tcx.dep_graph.with_task( dep_node, tcx, - cgu.name(), + (backend_config, cgu.name()), module_codegen, rustc_middle::dep_graph::hash_result, ); @@ -271,7 +227,6 @@ pub(super) fn run_aot( allocator_module, None, allocator_unwind_context, - |product| product, ); if let Some((id, product)) = work_product { work_products.insert(id, product); @@ -301,8 +256,7 @@ pub(super) fn run_aot( }); if let Err(err) = std::fs::write(&tmp_file, obj) { - tcx.sess - .fatal(&format!("error writing metadata object file: {}", err)); + tcx.sess.fatal(&format!("error writing metadata object file: {}", err)); } (metadata_cgu_name, tmp_file) @@ -356,8 +310,7 @@ fn codegen_global_asm(tcx: TyCtxt<'_>, cgu_name: &str, global_asm: &str) { "asm! and global_asm! support is disabled while compiling rustc_codegen_cranelift", ); } else { - tcx.sess - .fatal("asm! and global_asm! are not yet supported on macOS and Windows"); + tcx.sess.fatal("asm! and global_asm! are not yet supported on macOS and Windows"); } } @@ -367,19 +320,12 @@ fn codegen_global_asm(tcx: TyCtxt<'_>, cgu_name: &str, global_asm: &str) { // Remove all LLVM style comments let global_asm = global_asm .lines() - .map(|line| { - if let Some(index) = line.find("//") { - &line[0..index] - } else { - line - } - }) + .map(|line| if let Some(index) = line.find("//") { &line[0..index] } else { line }) .collect::>() .join("\n"); - let output_object_file = tcx - .output_filenames(LOCAL_CRATE) - .temp_path(OutputType::Object, Some(cgu_name)); + let output_object_file = + tcx.output_filenames(LOCAL_CRATE).temp_path(OutputType::Object, Some(cgu_name)); // Assemble `global_asm` let global_asm_object_file = add_file_stem_postfix(output_object_file.clone(), ".asm"); @@ -389,16 +335,10 @@ fn codegen_global_asm(tcx: TyCtxt<'_>, cgu_name: &str, global_asm: &str) { .stdin(Stdio::piped()) .spawn() .expect("Failed to spawn `as`."); - child - .stdin - .take() - .unwrap() - .write_all(global_asm.as_bytes()) - .unwrap(); + child.stdin.take().unwrap().write_all(global_asm.as_bytes()).unwrap(); let status = child.wait().expect("Failed to wait for `as`."); if !status.success() { - tcx.sess - .fatal(&format!("Failed to assemble `{}`", global_asm)); + tcx.sess.fatal(&format!("Failed to assemble `{}`", global_asm)); } // Link the global asm and main object file together @@ -442,11 +382,7 @@ fn determine_cgu_reuse<'tcx>(tcx: TyCtxt<'tcx>, cgu: &CodegenUnit<'tcx>) -> CguR } let work_product_id = &cgu.work_product_id(); - if tcx - .dep_graph - .previous_work_product(work_product_id) - .is_none() - { + if tcx.dep_graph.previous_work_product(work_product_id).is_none() { // We don't have anything cached for this CGU. This can happen // if the CGU did not exist in the previous session. return CguReuse::No; @@ -465,9 +401,5 @@ fn determine_cgu_reuse<'tcx>(tcx: TyCtxt<'tcx>, cgu: &CodegenUnit<'tcx>) -> CguR cgu.name() ); - if tcx.dep_graph.try_mark_green(tcx, &dep_node).is_some() { - CguReuse::PreLto - } else { - CguReuse::No - } + if tcx.try_mark_green(&dep_node) { CguReuse::PreLto } else { CguReuse::No } } diff --git a/compiler/rustc_codegen_cranelift/src/driver/jit.rs b/compiler/rustc_codegen_cranelift/src/driver/jit.rs index 2d14ff2c02..245df03ffb 100644 --- a/compiler/rustc_codegen_cranelift/src/driver/jit.rs +++ b/compiler/rustc_codegen_cranelift/src/driver/jit.rs @@ -10,43 +10,24 @@ use rustc_middle::mir::mono::MonoItem; use cranelift_jit::{JITBuilder, JITModule}; -use crate::prelude::*; +use crate::{prelude::*, BackendConfig}; use crate::{CodegenCx, CodegenMode}; thread_local! { + pub static BACKEND_CONFIG: RefCell> = RefCell::new(None); pub static CURRENT_MODULE: RefCell> = RefCell::new(None); } -pub(super) fn run_jit(tcx: TyCtxt<'_>, codegen_mode: CodegenMode) -> ! { +pub(super) fn run_jit(tcx: TyCtxt<'_>, backend_config: BackendConfig) -> ! { if !tcx.sess.opts.output_types.should_codegen() { tcx.sess.fatal("JIT mode doesn't work with `cargo check`."); } - #[cfg(unix)] - unsafe { - // When not using our custom driver rustc will open us without the RTLD_GLOBAL flag, so - // __cg_clif_global_atomic_mutex will not be exported. We fix this by opening ourself again - // as global. - // FIXME remove once atomic_shim is gone - - let mut dl_info: libc::Dl_info = std::mem::zeroed(); - assert_ne!( - libc::dladdr(run_jit as *const libc::c_void, &mut dl_info), - 0 - ); - assert_ne!( - libc::dlopen(dl_info.dli_fname, libc::RTLD_NOW | libc::RTLD_GLOBAL), - std::ptr::null_mut(), - ); - } - let imported_symbols = load_imported_symbols_for_jit(tcx); - let mut jit_builder = JITBuilder::with_isa( - crate::build_isa(tcx.sess), - cranelift_module::default_libcall_names(), - ); - jit_builder.hotswap(matches!(codegen_mode, CodegenMode::JitLazy)); + let mut jit_builder = + JITBuilder::with_isa(crate::build_isa(tcx.sess), cranelift_module::default_libcall_names()); + jit_builder.hotswap(matches!(backend_config.codegen_mode, CodegenMode::JitLazy)); jit_builder.symbols(imported_symbols); let mut jit_module = JITModule::new(jit_builder); assert_eq!(pointer_ty(tcx), jit_module.target_config().pointer_type()); @@ -56,14 +37,10 @@ pub(super) fn run_jit(tcx: TyCtxt<'_>, codegen_mode: CodegenMode) -> ! { AbiParam::new(jit_module.target_config().pointer_type()), AbiParam::new(jit_module.target_config().pointer_type()), ], - returns: vec![AbiParam::new( - jit_module.target_config().pointer_type(), /*isize*/ - )], + returns: vec![AbiParam::new(jit_module.target_config().pointer_type() /*isize*/)], call_conv: CallConv::triple_default(&crate::target_triple(tcx.sess)), }; - let main_func_id = jit_module - .declare_function("main", Linkage::Import, &sig) - .unwrap(); + let main_func_id = jit_module.declare_function("main", Linkage::Import, &sig).unwrap(); let (_, cgus) = tcx.collect_and_partition_mono_items(LOCAL_CRATE); let mono_items = cgus @@ -74,35 +51,34 @@ pub(super) fn run_jit(tcx: TyCtxt<'_>, codegen_mode: CodegenMode) -> ! { .into_iter() .collect::>(); - let mut cx = crate::CodegenCx::new(tcx, jit_module, false, false); + let mut cx = crate::CodegenCx::new(tcx, backend_config, &mut jit_module, false); super::time(tcx, "codegen mono items", || { super::predefine_mono_items(&mut cx, &mono_items); for (mono_item, (linkage, visibility)) in mono_items { let linkage = crate::linkage::get_clif_linkage(mono_item, linkage, visibility); match mono_item { - MonoItem::Fn(inst) => match codegen_mode { + MonoItem::Fn(inst) => match backend_config.codegen_mode { CodegenMode::Aot => unreachable!(), CodegenMode::Jit => { - cx.tcx.sess.time("codegen fn", || { - crate::base::codegen_fn(&mut cx, inst, linkage) - }); + cx.tcx + .sess + .time("codegen fn", || crate::base::codegen_fn(&mut cx, inst, linkage)); } CodegenMode::JitLazy => codegen_shim(&mut cx, inst), }, MonoItem::Static(def_id) => { crate::constant::codegen_static(&mut cx.constants_cx, def_id); } - MonoItem::GlobalAsm(hir_id) => { - let item = cx.tcx.hir().expect_item(hir_id); - tcx.sess - .span_fatal(item.span, "Global asm is not supported in JIT mode"); + MonoItem::GlobalAsm(item_id) => { + let item = cx.tcx.hir().item(item_id); + tcx.sess.span_fatal(item.span, "Global asm is not supported in JIT mode"); } } } }); - let (mut jit_module, global_asm, _debug, mut unwind_context) = + let (global_asm, _debug, mut unwind_context) = tcx.sess.time("finalize CodegenCx", || cx.finalize()); jit_module.finalize_definitions(); @@ -110,7 +86,7 @@ pub(super) fn run_jit(tcx: TyCtxt<'_>, codegen_mode: CodegenMode) -> ! { tcx.sess.fatal("Inline asm is not supported in JIT mode"); } - crate::main_shim::maybe_create_entry_wrapper(tcx, &mut jit_module, &mut unwind_context, true); + crate::main_shim::maybe_create_entry_wrapper(tcx, &mut jit_module, &mut unwind_context); crate::allocator::codegen(tcx, &mut jit_module, &mut unwind_context); tcx.sess.abort_if_errors(); @@ -121,7 +97,9 @@ pub(super) fn run_jit(tcx: TyCtxt<'_>, codegen_mode: CodegenMode) -> ! { let finalized_main: *const u8 = jit_module.get_finalized_function(main_func_id); - println!("Rustc codegen cranelift will JIT run the executable, because -Cllvm-args=mode=jit was passed"); + println!( + "Rustc codegen cranelift will JIT run the executable, because -Cllvm-args=mode=jit was passed" + ); let f: extern "C" fn(c_int, *const *const c_char) -> c_int = unsafe { ::std::mem::transmute(finalized_main) }; @@ -137,6 +115,9 @@ pub(super) fn run_jit(tcx: TyCtxt<'_>, codegen_mode: CodegenMode) -> ! { // useful as some dynamic linkers use it as a marker to jump over. argv.push(std::ptr::null()); + BACKEND_CONFIG.with(|tls_backend_config| { + assert!(tls_backend_config.borrow_mut().replace(backend_config).is_none()) + }); CURRENT_MODULE .with(|current_module| assert!(current_module.borrow_mut().replace(jit_module).is_none())); @@ -154,21 +135,19 @@ extern "C" fn __clif_jit_fn(instance_ptr: *const Instance<'static>) -> *const u8 CURRENT_MODULE.with(|jit_module| { let mut jit_module = jit_module.borrow_mut(); let jit_module = jit_module.as_mut().unwrap(); - let mut cx = crate::CodegenCx::new(tcx, jit_module, false, false); + let backend_config = + BACKEND_CONFIG.with(|backend_config| backend_config.borrow().clone().unwrap()); let name = tcx.symbol_name(instance).name.to_string(); - let sig = crate::abi::get_function_sig(tcx, cx.module.isa().triple(), instance); - let func_id = cx - .module - .declare_function(&name, Linkage::Export, &sig) - .unwrap(); - cx.module.prepare_for_function_redefine(func_id).unwrap(); - - tcx.sess.time("codegen fn", || { - crate::base::codegen_fn(&mut cx, instance, Linkage::Export) - }); - - let (jit_module, global_asm, _debug_context, unwind_context) = cx.finalize(); + let sig = crate::abi::get_function_sig(tcx, jit_module.isa().triple(), instance); + let func_id = jit_module.declare_function(&name, Linkage::Export, &sig).unwrap(); + jit_module.prepare_for_function_redefine(func_id).unwrap(); + + let mut cx = crate::CodegenCx::new(tcx, backend_config, jit_module, false); + tcx.sess + .time("codegen fn", || crate::base::codegen_fn(&mut cx, instance, Linkage::Export)); + + let (global_asm, _debug_context, unwind_context) = cx.finalize(); assert!(global_asm.is_empty()); jit_module.finalize_definitions(); std::mem::forget(unsafe { unwind_context.register_jit(&jit_module) }); @@ -195,9 +174,8 @@ fn load_imported_symbols_for_jit(tcx: TyCtxt<'_>) -> Vec<(String, *const u8)> { Linkage::NotLinked | Linkage::IncludedFromDylib => {} Linkage::Static => { let name = tcx.crate_name(cnum); - let mut err = tcx - .sess - .struct_err(&format!("Can't load static lib {}", name.as_str())); + let mut err = + tcx.sess.struct_err(&format!("Can't load static lib {}", name.as_str())); err.note("rustc_codegen_cranelift can only load dylibs in JIT mode."); err.emit(); } @@ -218,6 +196,11 @@ fn load_imported_symbols_for_jit(tcx: TyCtxt<'_>) -> Vec<(String, *const u8)> { if name.is_empty() || !symbol.is_global() || symbol.is_undefined() { return None; } + if name.starts_with("rust_metadata_") { + // The metadata is part of a section that is not loaded by the dynamic linker in + // case of cg_llvm. + return None; + } let dlsym_name = if cfg!(target_os = "macos") { // On macOS `dlsym` expects the name without leading `_`. assert!(name.starts_with('_'), "{:?}", name); @@ -237,17 +220,14 @@ fn load_imported_symbols_for_jit(tcx: TyCtxt<'_>) -> Vec<(String, *const u8)> { imported_symbols } -pub(super) fn codegen_shim<'tcx>(cx: &mut CodegenCx<'tcx, impl Module>, inst: Instance<'tcx>) { +pub(super) fn codegen_shim<'tcx>(cx: &mut CodegenCx<'_, 'tcx>, inst: Instance<'tcx>) { let tcx = cx.tcx; let pointer_type = cx.module.target_config().pointer_type(); let name = tcx.symbol_name(inst).name.to_string(); let sig = crate::abi::get_function_sig(tcx, cx.module.isa().triple(), inst); - let func_id = cx - .module - .declare_function(&name, Linkage::Export, &sig) - .unwrap(); + let func_id = cx.module.declare_function(&name, Linkage::Export, &sig).unwrap(); let instance_ptr = Box::into_raw(Box::new(inst)); @@ -268,28 +248,18 @@ pub(super) fn codegen_shim<'tcx>(cx: &mut CodegenCx<'tcx, impl Module>, inst: In let mut builder_ctx = FunctionBuilderContext::new(); let mut trampoline_builder = FunctionBuilder::new(&mut trampoline, &mut builder_ctx); - let jit_fn = cx - .module - .declare_func_in_func(jit_fn, trampoline_builder.func); + let jit_fn = cx.module.declare_func_in_func(jit_fn, trampoline_builder.func); let sig_ref = trampoline_builder.func.import_signature(sig); let entry_block = trampoline_builder.create_block(); trampoline_builder.append_block_params_for_function_params(entry_block); - let fn_args = trampoline_builder - .func - .dfg - .block_params(entry_block) - .to_vec(); + let fn_args = trampoline_builder.func.dfg.block_params(entry_block).to_vec(); trampoline_builder.switch_to_block(entry_block); - let instance_ptr = trampoline_builder - .ins() - .iconst(pointer_type, instance_ptr as u64 as i64); + let instance_ptr = trampoline_builder.ins().iconst(pointer_type, instance_ptr as u64 as i64); let jitted_fn = trampoline_builder.ins().call(jit_fn, &[instance_ptr]); let jitted_fn = trampoline_builder.func.dfg.inst_results(jitted_fn)[0]; - let call_inst = trampoline_builder - .ins() - .call_indirect(sig_ref, jitted_fn, &fn_args); + let call_inst = trampoline_builder.ins().call_indirect(sig_ref, jitted_fn, &fn_args); let ret_vals = trampoline_builder.func.dfg.inst_results(call_inst).to_vec(); trampoline_builder.ins().return_(&ret_vals); diff --git a/compiler/rustc_codegen_cranelift/src/driver/mod.rs b/compiler/rustc_codegen_cranelift/src/driver/mod.rs index 2497f9dfdf..b994f28ffe 100644 --- a/compiler/rustc_codegen_cranelift/src/driver/mod.rs +++ b/compiler/rustc_codegen_cranelift/src/driver/mod.rs @@ -17,33 +17,30 @@ pub(crate) fn codegen_crate( tcx: TyCtxt<'_>, metadata: EncodedMetadata, need_metadata_module: bool, - config: crate::BackendConfig, + backend_config: crate::BackendConfig, ) -> Box { tcx.sess.abort_if_errors(); - match config.codegen_mode { - CodegenMode::Aot => aot::run_aot(tcx, metadata, need_metadata_module), + match backend_config.codegen_mode { + CodegenMode::Aot => aot::run_aot(tcx, backend_config, metadata, need_metadata_module), CodegenMode::Jit | CodegenMode::JitLazy => { - let is_executable = tcx - .sess - .crate_types() - .contains(&rustc_session::config::CrateType::Executable); + let is_executable = + tcx.sess.crate_types().contains(&rustc_session::config::CrateType::Executable); if !is_executable { tcx.sess.fatal("can't jit non-executable crate"); } #[cfg(feature = "jit")] - let _: ! = jit::run_jit(tcx, config.codegen_mode); + let _: ! = jit::run_jit(tcx, backend_config); #[cfg(not(feature = "jit"))] - tcx.sess - .fatal("jit support was disabled when compiling rustc_codegen_cranelift"); + tcx.sess.fatal("jit support was disabled when compiling rustc_codegen_cranelift"); } } } fn predefine_mono_items<'tcx>( - cx: &mut crate::CodegenCx<'tcx, impl Module>, + cx: &mut crate::CodegenCx<'_, 'tcx>, mono_items: &[(MonoItem<'tcx>, (RLinkage, Visibility))], ) { cx.tcx.sess.time("predefine functions", || { @@ -63,21 +60,12 @@ fn predefine_mono_items<'tcx>( } fn time(tcx: TyCtxt<'_>, name: &'static str, f: impl FnOnce() -> R) -> R { - if std::env::var("CG_CLIF_DISPLAY_CG_TIME") - .as_ref() - .map(|val| &**val) - == Ok("1") - { + if std::env::var("CG_CLIF_DISPLAY_CG_TIME").as_ref().map(|val| &**val) == Ok("1") { println!("[{:<30}: {}] start", tcx.crate_name(LOCAL_CRATE), name); let before = std::time::Instant::now(); let res = tcx.sess.time(name, f); let after = std::time::Instant::now(); - println!( - "[{:<30}: {}] end time: {:?}", - tcx.crate_name(LOCAL_CRATE), - name, - after - before - ); + println!("[{:<30}: {}] end time: {:?}", tcx.crate_name(LOCAL_CRATE), name, after - before); res } else { tcx.sess.time(name, f) diff --git a/compiler/rustc_codegen_cranelift/src/inline_asm.rs b/compiler/rustc_codegen_cranelift/src/inline_asm.rs index 04aac78012..5b3df2bd38 100644 --- a/compiler/rustc_codegen_cranelift/src/inline_asm.rs +++ b/compiler/rustc_codegen_cranelift/src/inline_asm.rs @@ -9,7 +9,7 @@ use rustc_middle::mir::InlineAsmOperand; use rustc_target::asm::*; pub(crate) fn codegen_inline_asm<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, _span: Span, template: &[InlineAsmTemplatePiece], operands: &[InlineAsmOperand<'tcx>], @@ -53,11 +53,7 @@ pub(crate) fn codegen_inline_asm<'tcx>( crate::base::codegen_operand(fx, value).load_scalar(fx), )); } - InlineAsmOperand::Out { - reg, - late: _, - place, - } => { + InlineAsmOperand::Out { reg, late: _, place } => { let reg = expect_reg(reg); clobbered_regs.push((reg, new_slot(reg.reg_class()))); if let Some(place) = place { @@ -68,12 +64,7 @@ pub(crate) fn codegen_inline_asm<'tcx>( )); } } - InlineAsmOperand::InOut { - reg, - late: _, - ref in_value, - out_place, - } => { + InlineAsmOperand::InOut { reg, late: _, ref in_value, out_place } => { let reg = expect_reg(reg); clobbered_regs.push((reg, new_slot(reg.reg_class()))); inputs.push(( @@ -97,11 +88,8 @@ pub(crate) fn codegen_inline_asm<'tcx>( let inline_asm_index = fx.inline_asm_index; fx.inline_asm_index += 1; - let asm_name = format!( - "{}__inline_asm_{}", - fx.tcx.symbol_name(fx.instance).name, - inline_asm_index - ); + let asm_name = + format!("{}__inline_asm_{}", fx.tcx.symbol_name(fx.instance).name, inline_asm_index); let generated_asm = generate_asm_wrapper( &asm_name, @@ -129,12 +117,7 @@ fn generate_asm_wrapper( let mut generated_asm = String::new(); writeln!(generated_asm, ".globl {}", asm_name).unwrap(); writeln!(generated_asm, ".type {},@function", asm_name).unwrap(); - writeln!( - generated_asm, - ".section .text.{},\"ax\",@progbits", - asm_name - ) - .unwrap(); + writeln!(generated_asm, ".section .text.{},\"ax\",@progbits", asm_name).unwrap(); writeln!(generated_asm, "{}:", asm_name).unwrap(); generated_asm.push_str(".intel_syntax noprefix\n"); @@ -164,11 +147,7 @@ fn generate_asm_wrapper( InlineAsmTemplatePiece::String(s) => { generated_asm.push_str(s); } - InlineAsmTemplatePiece::Placeholder { - operand_idx: _, - modifier: _, - span: _, - } => todo!(), + InlineAsmTemplatePiece::Placeholder { operand_idx: _, modifier: _, span: _ } => todo!(), } } generated_asm.push('\n'); @@ -203,7 +182,7 @@ fn generate_asm_wrapper( } fn call_inline_asm<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, asm_name: &str, slot_size: Size, inputs: Vec<(InlineAsmReg, Size, Value)>, @@ -230,17 +209,12 @@ fn call_inline_asm<'tcx>( }, ) .unwrap(); - let inline_asm_func = fx - .cx - .module - .declare_func_in_func(inline_asm_func, &mut fx.bcx.func); + let inline_asm_func = fx.cx.module.declare_func_in_func(inline_asm_func, &mut fx.bcx.func); #[cfg(debug_assertions)] fx.add_comment(inline_asm_func, asm_name); for (_reg, offset, value) in inputs { - fx.bcx - .ins() - .stack_store(value, stack_slot, i32::try_from(offset.bytes()).unwrap()); + fx.bcx.ins().stack_store(value, stack_slot, i32::try_from(offset.bytes()).unwrap()); } let stack_slot_addr = fx.bcx.ins().stack_addr(fx.pointer_type, stack_slot, 0); @@ -248,10 +222,7 @@ fn call_inline_asm<'tcx>( for (_reg, offset, place) in outputs { let ty = fx.clif_type(place.layout().ty).unwrap(); - let value = fx - .bcx - .ins() - .stack_load(ty, stack_slot, i32::try_from(offset.bytes()).unwrap()); + let value = fx.bcx.ins().stack_load(ty, stack_slot, i32::try_from(offset.bytes()).unwrap()); place.write_cvalue(fx, CValue::by_val(value, place.layout())); } } @@ -267,8 +238,7 @@ fn save_register(generated_asm: &mut String, arch: InlineAsmArch, reg: InlineAsm match arch { InlineAsmArch::X86_64 => { write!(generated_asm, " mov [rbp+0x{:x}], ", offset.bytes()).unwrap(); - reg.emit(generated_asm, InlineAsmArch::X86_64, None) - .unwrap(); + reg.emit(generated_asm, InlineAsmArch::X86_64, None).unwrap(); generated_asm.push('\n'); } _ => unimplemented!("save_register for {:?}", arch), @@ -284,8 +254,7 @@ fn restore_register( match arch { InlineAsmArch::X86_64 => { generated_asm.push_str(" mov "); - reg.emit(generated_asm, InlineAsmArch::X86_64, None) - .unwrap(); + reg.emit(generated_asm, InlineAsmArch::X86_64, None).unwrap(); writeln!(generated_asm, ", [rbp+0x{:x}]", offset.bytes()).unwrap(); } _ => unimplemented!("restore_register for {:?}", arch), diff --git a/compiler/rustc_codegen_cranelift/src/intrinsics/cpuid.rs b/compiler/rustc_codegen_cranelift/src/intrinsics/cpuid.rs index c1a1cdbe4e..b27b0eddfb 100644 --- a/compiler/rustc_codegen_cranelift/src/intrinsics/cpuid.rs +++ b/compiler/rustc_codegen_cranelift/src/intrinsics/cpuid.rs @@ -6,7 +6,7 @@ use crate::prelude::*; /// /// This emulates an intel cpu with sse and sse2 support, but which doesn't support anything else. pub(crate) fn codegen_cpuid_call<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, leaf: Value, _subleaf: Value, ) -> (Value, Value, Value, Value) { @@ -31,54 +31,28 @@ pub(crate) fn codegen_cpuid_call<'tcx>( fx.bcx.switch_to_block(leaf_0); let max_basic_leaf = fx.bcx.ins().iconst(types::I32, 1); - let vend0 = fx - .bcx - .ins() - .iconst(types::I32, i64::from(u32::from_le_bytes(*b"Genu"))); - let vend2 = fx - .bcx - .ins() - .iconst(types::I32, i64::from(u32::from_le_bytes(*b"ineI"))); - let vend1 = fx - .bcx - .ins() - .iconst(types::I32, i64::from(u32::from_le_bytes(*b"ntel"))); - fx.bcx - .ins() - .jump(dest, &[max_basic_leaf, vend0, vend1, vend2]); + let vend0 = fx.bcx.ins().iconst(types::I32, i64::from(u32::from_le_bytes(*b"Genu"))); + let vend2 = fx.bcx.ins().iconst(types::I32, i64::from(u32::from_le_bytes(*b"ineI"))); + let vend1 = fx.bcx.ins().iconst(types::I32, i64::from(u32::from_le_bytes(*b"ntel"))); + fx.bcx.ins().jump(dest, &[max_basic_leaf, vend0, vend1, vend2]); fx.bcx.switch_to_block(leaf_1); let cpu_signature = fx.bcx.ins().iconst(types::I32, 0); let additional_information = fx.bcx.ins().iconst(types::I32, 0); let ecx_features = fx.bcx.ins().iconst(types::I32, 0); - let edx_features = fx - .bcx - .ins() - .iconst(types::I32, 1 << 25 /* sse */ | 1 << 26 /* sse2 */); - fx.bcx.ins().jump( - dest, - &[ - cpu_signature, - additional_information, - ecx_features, - edx_features, - ], - ); + let edx_features = fx.bcx.ins().iconst(types::I32, 1 << 25 /* sse */ | 1 << 26 /* sse2 */); + fx.bcx.ins().jump(dest, &[cpu_signature, additional_information, ecx_features, edx_features]); fx.bcx.switch_to_block(leaf_8000_0000); let extended_max_basic_leaf = fx.bcx.ins().iconst(types::I32, 0); let zero = fx.bcx.ins().iconst(types::I32, 0); - fx.bcx - .ins() - .jump(dest, &[extended_max_basic_leaf, zero, zero, zero]); + fx.bcx.ins().jump(dest, &[extended_max_basic_leaf, zero, zero, zero]); fx.bcx.switch_to_block(leaf_8000_0001); let zero = fx.bcx.ins().iconst(types::I32, 0); let proc_info_ecx = fx.bcx.ins().iconst(types::I32, 0); let proc_info_edx = fx.bcx.ins().iconst(types::I32, 0); - fx.bcx - .ins() - .jump(dest, &[zero, zero, proc_info_ecx, proc_info_edx]); + fx.bcx.ins().jump(dest, &[zero, zero, proc_info_ecx, proc_info_edx]); fx.bcx.switch_to_block(unsupported_leaf); crate::trap::trap_unreachable( diff --git a/compiler/rustc_codegen_cranelift/src/intrinsics/llvm.rs b/compiler/rustc_codegen_cranelift/src/intrinsics/llvm.rs index d58e4d4995..83c91f789c 100644 --- a/compiler/rustc_codegen_cranelift/src/intrinsics/llvm.rs +++ b/compiler/rustc_codegen_cranelift/src/intrinsics/llvm.rs @@ -6,7 +6,7 @@ use crate::prelude::*; use rustc_middle::ty::subst::SubstsRef; pub(crate) fn codegen_llvm_intrinsic_call<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, intrinsic: &str, substs: SubstsRef<'tcx>, args: &[mir::Operand<'tcx>], @@ -53,7 +53,7 @@ pub(crate) fn codegen_llvm_intrinsic_call<'tcx>( }; llvm.x86.sse2.cmp.ps | llvm.x86.sse2.cmp.pd, (c x, c y, o kind) { let kind_const = crate::constant::mir_operand_get_const_val(fx, kind).expect("llvm.x86.sse2.cmp.* kind not const"); - let flt_cc = match kind_const.val.try_to_bits(Size::from_bytes(1)).unwrap_or_else(|| panic!("kind not scalar: {:?}", kind_const)) { + let flt_cc = match kind_const.try_to_bits(Size::from_bytes(1)).unwrap_or_else(|| panic!("kind not scalar: {:?}", kind_const)) { 0 => FloatCC::Equal, 1 => FloatCC::LessThan, 2 => FloatCC::LessThanOrEqual, @@ -84,7 +84,7 @@ pub(crate) fn codegen_llvm_intrinsic_call<'tcx>( llvm.x86.sse2.psrli.d, (c a, o imm8) { let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8).expect("llvm.x86.sse2.psrli.d imm8 not const"); simd_for_each_lane(fx, a, ret, |fx, _lane_layout, res_lane_layout, lane| { - let res_lane = match imm8.val.try_to_bits(Size::from_bytes(4)).unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8)) { + let res_lane = match imm8.try_to_bits(Size::from_bytes(4)).unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8)) { imm8 if imm8 < 32 => fx.bcx.ins().ushr_imm(lane, i64::from(imm8 as u8)), _ => fx.bcx.ins().iconst(types::I32, 0), }; @@ -94,7 +94,7 @@ pub(crate) fn codegen_llvm_intrinsic_call<'tcx>( llvm.x86.sse2.pslli.d, (c a, o imm8) { let imm8 = crate::constant::mir_operand_get_const_val(fx, imm8).expect("llvm.x86.sse2.psrli.d imm8 not const"); simd_for_each_lane(fx, a, ret, |fx, _lane_layout, res_lane_layout, lane| { - let res_lane = match imm8.val.try_to_bits(Size::from_bytes(4)).unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8)) { + let res_lane = match imm8.try_to_bits(Size::from_bytes(4)).unwrap_or_else(|| panic!("imm8 not scalar: {:?}", imm8)) { imm8 if imm8 < 32 => fx.bcx.ins().ishl_imm(lane, i64::from(imm8 as u8)), _ => fx.bcx.ins().iconst(types::I32, 0), }; diff --git a/compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs b/compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs index 8946ac43bc..39e047a98f 100644 --- a/compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs +++ b/compiler/rustc_codegen_cranelift/src/intrinsics/mod.rs @@ -9,6 +9,7 @@ pub(crate) use cpuid::codegen_cpuid_call; pub(crate) use llvm::codegen_llvm_intrinsic_call; use crate::prelude::*; +use cranelift_codegen::ir::AtomicRmwOp; use rustc_middle::ty::print::with_no_trimmed_paths; macro intrinsic_pat { @@ -112,38 +113,6 @@ macro call_intrinsic_match { } } -macro atomic_binop_return_old($fx:expr, $op:ident<$T:ident>($ptr:ident, $src:ident) -> $ret:ident) { - crate::atomic_shim::lock_global_lock($fx); - - let clif_ty = $fx.clif_type($T).unwrap(); - let old = $fx.bcx.ins().load(clif_ty, MemFlags::new(), $ptr, 0); - let new = $fx.bcx.ins().$op(old, $src); - $fx.bcx.ins().store(MemFlags::new(), new, $ptr, 0); - $ret.write_cvalue($fx, CValue::by_val(old, $fx.layout_of($T))); - - crate::atomic_shim::unlock_global_lock($fx); -} - -macro atomic_minmax($fx:expr, $cc:expr, <$T:ident> ($ptr:ident, $src:ident) -> $ret:ident) { - crate::atomic_shim::lock_global_lock($fx); - - // Read old - let clif_ty = $fx.clif_type($T).unwrap(); - let old = $fx.bcx.ins().load(clif_ty, MemFlags::new(), $ptr, 0); - - // Compare - let is_eq = $fx.bcx.ins().icmp(IntCC::SignedGreaterThan, old, $src); - let new = $fx.bcx.ins().select(is_eq, old, $src); - - // Write new - $fx.bcx.ins().store(MemFlags::new(), new, $ptr, 0); - - let ret_val = CValue::by_val(old, $ret.layout()); - $ret.write_cvalue($fx, ret_val); - - crate::atomic_shim::unlock_global_lock($fx); -} - macro validate_atomic_type($fx:ident, $intrinsic:ident, $span:ident, $ty:expr) { match $ty.kind() { ty::Uint(_) | ty::Int(_) | ty::RawPtr(..) => {} @@ -184,12 +153,12 @@ pub(crate) fn clif_vector_type<'tcx>(tcx: TyCtxt<'tcx>, layout: TyAndLayout<'tcx } } -fn simd_for_each_lane<'tcx, M: Module>( - fx: &mut FunctionCx<'_, 'tcx, M>, +fn simd_for_each_lane<'tcx>( + fx: &mut FunctionCx<'_, '_, 'tcx>, val: CValue<'tcx>, ret: CPlace<'tcx>, f: impl Fn( - &mut FunctionCx<'_, 'tcx, M>, + &mut FunctionCx<'_, '_, 'tcx>, TyAndLayout<'tcx>, TyAndLayout<'tcx>, Value, @@ -213,13 +182,13 @@ fn simd_for_each_lane<'tcx, M: Module>( } } -fn simd_pair_for_each_lane<'tcx, M: Module>( - fx: &mut FunctionCx<'_, 'tcx, M>, +fn simd_pair_for_each_lane<'tcx>( + fx: &mut FunctionCx<'_, '_, 'tcx>, x: CValue<'tcx>, y: CValue<'tcx>, ret: CPlace<'tcx>, f: impl Fn( - &mut FunctionCx<'_, 'tcx, M>, + &mut FunctionCx<'_, '_, 'tcx>, TyAndLayout<'tcx>, TyAndLayout<'tcx>, Value, @@ -246,11 +215,11 @@ fn simd_pair_for_each_lane<'tcx, M: Module>( } } -fn simd_reduce<'tcx, M: Module>( - fx: &mut FunctionCx<'_, 'tcx, M>, +fn simd_reduce<'tcx>( + fx: &mut FunctionCx<'_, '_, 'tcx>, val: CValue<'tcx>, ret: CPlace<'tcx>, - f: impl Fn(&mut FunctionCx<'_, 'tcx, M>, TyAndLayout<'tcx>, Value, Value) -> Value, + f: impl Fn(&mut FunctionCx<'_, '_, 'tcx>, TyAndLayout<'tcx>, Value, Value) -> Value, ) { let (lane_count, lane_ty) = val.layout().ty.simd_size_and_type(fx.tcx); let lane_layout = fx.layout_of(lane_ty); @@ -258,20 +227,19 @@ fn simd_reduce<'tcx, M: Module>( let mut res_val = val.value_field(fx, mir::Field::new(0)).load_scalar(fx); for lane_idx in 1..lane_count { - let lane = val - .value_field(fx, mir::Field::new(lane_idx.try_into().unwrap())) - .load_scalar(fx); + let lane = + val.value_field(fx, mir::Field::new(lane_idx.try_into().unwrap())).load_scalar(fx); res_val = f(fx, lane_layout, res_val, lane); } let res = CValue::by_val(res_val, lane_layout); ret.write_cvalue(fx, res); } -fn simd_reduce_bool<'tcx, M: Module>( - fx: &mut FunctionCx<'_, 'tcx, M>, +fn simd_reduce_bool<'tcx>( + fx: &mut FunctionCx<'_, '_, 'tcx>, val: CValue<'tcx>, ret: CPlace<'tcx>, - f: impl Fn(&mut FunctionCx<'_, 'tcx, M>, Value, Value) -> Value, + f: impl Fn(&mut FunctionCx<'_, '_, 'tcx>, Value, Value) -> Value, ) { let (lane_count, _lane_ty) = val.layout().ty.simd_size_and_type(fx.tcx); assert!(ret.layout().ty.is_bool()); @@ -279,9 +247,8 @@ fn simd_reduce_bool<'tcx, M: Module>( let res_val = val.value_field(fx, mir::Field::new(0)).load_scalar(fx); let mut res_val = fx.bcx.ins().band_imm(res_val, 1); // mask to boolean for lane_idx in 1..lane_count { - let lane = val - .value_field(fx, mir::Field::new(lane_idx.try_into().unwrap())) - .load_scalar(fx); + let lane = + val.value_field(fx, mir::Field::new(lane_idx.try_into().unwrap())).load_scalar(fx); let lane = fx.bcx.ins().band_imm(lane, 1); // mask to boolean res_val = f(fx, res_val, lane); } @@ -290,7 +257,7 @@ fn simd_reduce_bool<'tcx, M: Module>( } fn bool_to_zero_or_max_uint<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, layout: TyAndLayout<'tcx>, val: Value, ) -> CValue<'tcx> { @@ -424,7 +391,7 @@ macro simd_flt_binop($fx:expr, $op:ident($x:ident, $y:ident) -> $ret:ident) { } pub(crate) fn codegen_intrinsic_call<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, instance: Instance<'tcx>, args: &[mir::Operand<'tcx>], destination: Option<(CPlace<'tcx>, BasicBlock)>, @@ -912,136 +879,175 @@ pub(crate) fn codegen_intrinsic_call<'tcx>( }; _ if intrinsic.starts_with("atomic_fence"), () { - crate::atomic_shim::lock_global_lock(fx); - crate::atomic_shim::unlock_global_lock(fx); + fx.bcx.ins().fence(); }; _ if intrinsic.starts_with("atomic_singlethreadfence"), () { - crate::atomic_shim::lock_global_lock(fx); - crate::atomic_shim::unlock_global_lock(fx); + // FIXME use a compiler fence once Cranelift supports it + fx.bcx.ins().fence(); }; - _ if intrinsic.starts_with("atomic_load"), (c ptr) { - crate::atomic_shim::lock_global_lock(fx); + _ if intrinsic.starts_with("atomic_load"), (v ptr) { + validate_atomic_type!(fx, intrinsic, span, T); + let ty = fx.clif_type(T).unwrap(); - let inner_layout = - fx.layout_of(ptr.layout().ty.builtin_deref(true).unwrap().ty); - validate_atomic_type!(fx, intrinsic, span, inner_layout.ty); - let val = CValue::by_ref(Pointer::new(ptr.load_scalar(fx)), inner_layout); - ret.write_cvalue(fx, val); + let val = fx.bcx.ins().atomic_load(ty, MemFlags::trusted(), ptr); - crate::atomic_shim::unlock_global_lock(fx); + let val = CValue::by_val(val, fx.layout_of(T)); + ret.write_cvalue(fx, val); }; _ if intrinsic.starts_with("atomic_store"), (v ptr, c val) { validate_atomic_type!(fx, intrinsic, span, val.layout().ty); - crate::atomic_shim::lock_global_lock(fx); - - let dest = CPlace::for_ptr(Pointer::new(ptr), val.layout()); - dest.write_cvalue(fx, val); + let val = val.load_scalar(fx); - crate::atomic_shim::unlock_global_lock(fx); + fx.bcx.ins().atomic_store(MemFlags::trusted(), val, ptr); }; - _ if intrinsic.starts_with("atomic_xchg"), (v ptr, c src) { - validate_atomic_type!(fx, intrinsic, span, T); - - crate::atomic_shim::lock_global_lock(fx); + _ if intrinsic.starts_with("atomic_xchg"), (v ptr, c new) { + let layout = new.layout(); + validate_atomic_type!(fx, intrinsic, span, layout.ty); + let ty = fx.clif_type(layout.ty).unwrap(); - // Read old - let clif_ty = fx.clif_type(T).unwrap(); - let old = fx.bcx.ins().load(clif_ty, MemFlags::new(), ptr, 0); - ret.write_cvalue(fx, CValue::by_val(old, fx.layout_of(T))); + let new = new.load_scalar(fx); - // Write new - let dest = CPlace::for_ptr(Pointer::new(ptr), src.layout()); - dest.write_cvalue(fx, src); + let old = fx.bcx.ins().atomic_rmw(ty, MemFlags::trusted(), AtomicRmwOp::Xchg, ptr, new); - crate::atomic_shim::unlock_global_lock(fx); + let old = CValue::by_val(old, layout); + ret.write_cvalue(fx, old); }; - _ if intrinsic.starts_with("atomic_cxchg"), (v ptr, c test_old, c new) { // both atomic_cxchg_* and atomic_cxchgweak_* - validate_atomic_type!(fx, intrinsic, span, T); + _ if intrinsic.starts_with("atomic_cxchg"), (v ptr, c test_old, c new) { // both atomic_cxchg_* and atomic_cxchgweak_* + let layout = new.layout(); + validate_atomic_type!(fx, intrinsic, span, layout.ty); let test_old = test_old.load_scalar(fx); let new = new.load_scalar(fx); - crate::atomic_shim::lock_global_lock(fx); - - // Read old - let clif_ty = fx.clif_type(T).unwrap(); - let old = fx.bcx.ins().load(clif_ty, MemFlags::new(), ptr, 0); - - // Compare + let old = fx.bcx.ins().atomic_cas(MemFlags::trusted(), ptr, test_old, new); let is_eq = fx.bcx.ins().icmp(IntCC::Equal, old, test_old); - let new = fx.bcx.ins().select(is_eq, new, old); // Keep old if not equal to test_old - - // Write new - fx.bcx.ins().store(MemFlags::new(), new, ptr, 0); let ret_val = CValue::by_val_pair(old, fx.bcx.ins().bint(types::I8, is_eq), ret.layout()); - ret.write_cvalue(fx, ret_val); - - crate::atomic_shim::unlock_global_lock(fx); + ret.write_cvalue(fx, ret_val) }; - _ if intrinsic.starts_with("atomic_xadd"), (v ptr, c amount) { - validate_atomic_type!(fx, intrinsic, span, ret.layout().ty); + _ if intrinsic.starts_with("atomic_xadd"), (v ptr, c amount) { + let layout = amount.layout(); + validate_atomic_type!(fx, intrinsic, span, layout.ty); + let ty = fx.clif_type(layout.ty).unwrap(); + let amount = amount.load_scalar(fx); - atomic_binop_return_old! (fx, iadd(ptr, amount) -> ret); + + let old = fx.bcx.ins().atomic_rmw(ty, MemFlags::trusted(), AtomicRmwOp::Add, ptr, amount); + + let old = CValue::by_val(old, layout); + ret.write_cvalue(fx, old); }; - _ if intrinsic.starts_with("atomic_xsub"), (v ptr, c amount) { - validate_atomic_type!(fx, intrinsic, span, ret.layout().ty); + _ if intrinsic.starts_with("atomic_xsub"), (v ptr, c amount) { + let layout = amount.layout(); + validate_atomic_type!(fx, intrinsic, span, layout.ty); + let ty = fx.clif_type(layout.ty).unwrap(); + let amount = amount.load_scalar(fx); - atomic_binop_return_old! (fx, isub(ptr, amount) -> ret); + + let old = fx.bcx.ins().atomic_rmw(ty, MemFlags::trusted(), AtomicRmwOp::Sub, ptr, amount); + + let old = CValue::by_val(old, layout); + ret.write_cvalue(fx, old); }; - _ if intrinsic.starts_with("atomic_and"), (v ptr, c src) { - validate_atomic_type!(fx, intrinsic, span, ret.layout().ty); + _ if intrinsic.starts_with("atomic_and"), (v ptr, c src) { + let layout = src.layout(); + validate_atomic_type!(fx, intrinsic, span, layout.ty); + let ty = fx.clif_type(layout.ty).unwrap(); + let src = src.load_scalar(fx); - atomic_binop_return_old! (fx, band(ptr, src) -> ret); + + let old = fx.bcx.ins().atomic_rmw(ty, MemFlags::trusted(), AtomicRmwOp::And, ptr, src); + + let old = CValue::by_val(old, layout); + ret.write_cvalue(fx, old); }; - _ if intrinsic.starts_with("atomic_nand"), (v ptr, c src) { - validate_atomic_type!(fx, intrinsic, span, T); + _ if intrinsic.starts_with("atomic_or"), (v ptr, c src) { + let layout = src.layout(); + validate_atomic_type!(fx, intrinsic, span, layout.ty); + let ty = fx.clif_type(layout.ty).unwrap(); let src = src.load_scalar(fx); - crate::atomic_shim::lock_global_lock(fx); - - let clif_ty = fx.clif_type(T).unwrap(); - let old = fx.bcx.ins().load(clif_ty, MemFlags::new(), ptr, 0); - let and = fx.bcx.ins().band(old, src); - let new = fx.bcx.ins().bnot(and); - fx.bcx.ins().store(MemFlags::new(), new, ptr, 0); - ret.write_cvalue(fx, CValue::by_val(old, fx.layout_of(T))); + let old = fx.bcx.ins().atomic_rmw(ty, MemFlags::trusted(), AtomicRmwOp::Or, ptr, src); - crate::atomic_shim::unlock_global_lock(fx); + let old = CValue::by_val(old, layout); + ret.write_cvalue(fx, old); }; - _ if intrinsic.starts_with("atomic_or"), (v ptr, c src) { - validate_atomic_type!(fx, intrinsic, span, ret.layout().ty); + _ if intrinsic.starts_with("atomic_xor"), (v ptr, c src) { + let layout = src.layout(); + validate_atomic_type!(fx, intrinsic, span, layout.ty); + let ty = fx.clif_type(layout.ty).unwrap(); + let src = src.load_scalar(fx); - atomic_binop_return_old! (fx, bor(ptr, src) -> ret); + + let old = fx.bcx.ins().atomic_rmw(ty, MemFlags::trusted(), AtomicRmwOp::Xor, ptr, src); + + let old = CValue::by_val(old, layout); + ret.write_cvalue(fx, old); }; - _ if intrinsic.starts_with("atomic_xor"), (v ptr, c src) { - validate_atomic_type!(fx, intrinsic, span, ret.layout().ty); + + // FIXME https://github.com/bytecodealliance/wasmtime/issues/2647 + _ if intrinsic.starts_with("atomic_nand"), (v ptr, c src) { + let layout = src.layout(); + validate_atomic_type!(fx, intrinsic, span, layout.ty); + let ty = fx.clif_type(layout.ty).unwrap(); + let src = src.load_scalar(fx); - atomic_binop_return_old! (fx, bxor(ptr, src) -> ret); + + let old = fx.bcx.ins().atomic_rmw(ty, MemFlags::trusted(), AtomicRmwOp::Nand, ptr, src); + + let old = CValue::by_val(old, layout); + ret.write_cvalue(fx, old); }; + _ if intrinsic.starts_with("atomic_max"), (v ptr, c src) { + let layout = src.layout(); + validate_atomic_type!(fx, intrinsic, span, layout.ty); + let ty = fx.clif_type(layout.ty).unwrap(); - _ if intrinsic.starts_with("atomic_max"), (v ptr, c src) { - validate_atomic_type!(fx, intrinsic, span, ret.layout().ty); let src = src.load_scalar(fx); - atomic_minmax!(fx, IntCC::SignedGreaterThan, (ptr, src) -> ret); + + let old = fx.bcx.ins().atomic_rmw(ty, MemFlags::trusted(), AtomicRmwOp::Smax, ptr, src); + + let old = CValue::by_val(old, layout); + ret.write_cvalue(fx, old); }; - _ if intrinsic.starts_with("atomic_umax"), (v ptr, c src) { - validate_atomic_type!(fx, intrinsic, span, ret.layout().ty); + _ if intrinsic.starts_with("atomic_umax"), (v ptr, c src) { + let layout = src.layout(); + validate_atomic_type!(fx, intrinsic, span, layout.ty); + let ty = fx.clif_type(layout.ty).unwrap(); + let src = src.load_scalar(fx); - atomic_minmax!(fx, IntCC::UnsignedGreaterThan, (ptr, src) -> ret); + + let old = fx.bcx.ins().atomic_rmw(ty, MemFlags::trusted(), AtomicRmwOp::Umax, ptr, src); + + let old = CValue::by_val(old, layout); + ret.write_cvalue(fx, old); }; - _ if intrinsic.starts_with("atomic_min"), (v ptr, c src) { - validate_atomic_type!(fx, intrinsic, span, ret.layout().ty); + _ if intrinsic.starts_with("atomic_min"), (v ptr, c src) { + let layout = src.layout(); + validate_atomic_type!(fx, intrinsic, span, layout.ty); + let ty = fx.clif_type(layout.ty).unwrap(); + let src = src.load_scalar(fx); - atomic_minmax!(fx, IntCC::SignedLessThan, (ptr, src) -> ret); + + let old = fx.bcx.ins().atomic_rmw(ty, MemFlags::trusted(), AtomicRmwOp::Smin, ptr, src); + + let old = CValue::by_val(old, layout); + ret.write_cvalue(fx, old); }; - _ if intrinsic.starts_with("atomic_umin"), (v ptr, c src) { - validate_atomic_type!(fx, intrinsic, span, ret.layout().ty); + _ if intrinsic.starts_with("atomic_umin"), (v ptr, c src) { + let layout = src.layout(); + validate_atomic_type!(fx, intrinsic, span, layout.ty); + let ty = fx.clif_type(layout.ty).unwrap(); + let src = src.load_scalar(fx); - atomic_minmax!(fx, IntCC::UnsignedLessThan, (ptr, src) -> ret); + + let old = fx.bcx.ins().atomic_rmw(ty, MemFlags::trusted(), AtomicRmwOp::Umin, ptr, src); + + let old = CValue::by_val(old, layout); + ret.write_cvalue(fx, old); }; minnumf32, (v a, v b) { diff --git a/compiler/rustc_codegen_cranelift/src/intrinsics/simd.rs b/compiler/rustc_codegen_cranelift/src/intrinsics/simd.rs index e0eb5c5959..86df71a0df 100644 --- a/compiler/rustc_codegen_cranelift/src/intrinsics/simd.rs +++ b/compiler/rustc_codegen_cranelift/src/intrinsics/simd.rs @@ -4,7 +4,7 @@ use super::*; use crate::prelude::*; pub(super) fn codegen_simd_intrinsic_call<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, instance: Instance<'tcx>, args: &[mir::Operand<'tcx>], ret: CPlace<'tcx>, @@ -85,8 +85,8 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>( use rustc_middle::mir::interpret::*; let idx_const = crate::constant::mir_operand_get_const_val(fx, idx).expect("simd_shuffle* idx not const"); - let idx_bytes = match idx_const.val { - ty::ConstKind::Value(ConstValue::ByRef { alloc, offset }) => { + let idx_bytes = match idx_const { + ConstValue::ByRef { alloc, offset } => { let ptr = Pointer::new(AllocId(0 /* dummy */), offset); let size = Size::from_bytes(4 * u64::from(ret_lane_count) /* size_of([u32; ret_lane_count]) */); alloc.get_bytes(fx, ptr, size).unwrap() @@ -130,7 +130,7 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>( ); }; - let idx = idx_const.val.try_to_bits(Size::from_bytes(4 /* u32*/)).unwrap_or_else(|| panic!("kind not scalar: {:?}", idx_const)); + let idx = idx_const.try_to_bits(Size::from_bytes(4 /* u32*/)).unwrap_or_else(|| panic!("kind not scalar: {:?}", idx_const)); let (lane_count, _lane_ty) = base.layout().ty.simd_size_and_type(fx.tcx); if idx >= lane_count.into() { fx.tcx.sess.span_fatal(fx.mir.span, &format!("[simd_insert] idx {} >= lane_count {}", idx, lane_count)); @@ -159,7 +159,7 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>( return; }; - let idx = idx_const.val.try_to_bits(Size::from_bytes(4 /* u32*/)).unwrap_or_else(|| panic!("kind not scalar: {:?}", idx_const)); + let idx = idx_const.try_to_bits(Size::from_bytes(4 /* u32*/)).unwrap_or_else(|| panic!("kind not scalar: {:?}", idx_const)); let (lane_count, _lane_ty) = v.layout().ty.simd_size_and_type(fx.tcx); if idx >= lane_count.into() { fx.tcx.sess.span_fatal(fx.mir.span, &format!("[simd_extract] idx {} >= lane_count {}", idx, lane_count)); @@ -276,5 +276,6 @@ pub(super) fn codegen_simd_intrinsic_call<'tcx>( // simd_bitmask // simd_select // simd_rem + // simd_neg } } diff --git a/compiler/rustc_codegen_cranelift/src/lib.rs b/compiler/rustc_codegen_cranelift/src/lib.rs index 170750461c..8edb883ccb 100644 --- a/compiler/rustc_codegen_cranelift/src/lib.rs +++ b/compiler/rustc_codegen_cranelift/src/lib.rs @@ -5,15 +5,13 @@ associated_type_bounds, never_type, try_blocks, - hash_drain_filter, - str_split_once + box_patterns, + hash_drain_filter )] #![warn(rust_2018_idioms)] #![warn(unused_lifetimes)] #![warn(unreachable_pub)] -#[cfg(feature = "jit")] -extern crate libc; extern crate snap; #[macro_use] extern crate rustc_middle; @@ -54,7 +52,6 @@ mod abi; mod allocator; mod analyze; mod archive; -mod atomic_shim; mod backend; mod base; mod cast; @@ -130,9 +127,9 @@ impl String> Drop for PrintOnPanic { } } -struct CodegenCx<'tcx, M: Module> { +struct CodegenCx<'m, 'tcx: 'm> { tcx: TyCtxt<'tcx>, - module: M, + module: &'m mut dyn Module, global_asm: String, constants_cx: ConstantCx, cached_context: Context, @@ -141,14 +138,20 @@ struct CodegenCx<'tcx, M: Module> { unwind_context: UnwindContext<'tcx>, } -impl<'tcx, M: Module> CodegenCx<'tcx, M> { - fn new(tcx: TyCtxt<'tcx>, module: M, debug_info: bool, pic_eh_frame: bool) -> Self { - let unwind_context = UnwindContext::new(tcx, module.isa(), pic_eh_frame); - let debug_context = if debug_info { - Some(DebugContext::new(tcx, module.isa())) - } else { - None - }; +impl<'m, 'tcx> CodegenCx<'m, 'tcx> { + fn new( + tcx: TyCtxt<'tcx>, + backend_config: BackendConfig, + module: &'m mut dyn Module, + debug_info: bool, + ) -> Self { + let unwind_context = UnwindContext::new( + tcx, + module.isa(), + matches!(backend_config.codegen_mode, CodegenMode::Aot), + ); + let debug_context = + if debug_info { Some(DebugContext::new(tcx, module.isa())) } else { None }; CodegenCx { tcx, module, @@ -161,14 +164,9 @@ impl<'tcx, M: Module> CodegenCx<'tcx, M> { } } - fn finalize(mut self) -> (M, String, Option>, UnwindContext<'tcx>) { - self.constants_cx.finalize(self.tcx, &mut self.module); - ( - self.module, - self.global_asm, - self.debug_context, - self.unwind_context, - ) + fn finalize(self) -> (String, Option>, UnwindContext<'tcx>) { + self.constants_cx.finalize(self.tcx, self.module); + (self.global_asm, self.debug_context, self.unwind_context) } } @@ -303,14 +301,7 @@ fn build_isa(sess: &Session) -> Box { flags_builder.enable("is_pic").unwrap(); flags_builder.set("enable_probestack", "false").unwrap(); // __cranelift_probestack is not provided flags_builder - .set( - "enable_verifier", - if cfg!(debug_assertions) { - "true" - } else { - "false" - }, - ) + .set("enable_verifier", if cfg!(debug_assertions) { "true" } else { "false" }) .unwrap(); let tls_model = match target_triple.binary_format { @@ -339,11 +330,7 @@ fn build_isa(sess: &Session) -> Box { let flags = settings::Flags::new(flags_builder); - let variant = if cfg!(feature = "oldbe") { - cranelift_codegen::isa::BackendVariant::Legacy - } else { - cranelift_codegen::isa::BackendVariant::MachInst - }; + let variant = cranelift_codegen::isa::BackendVariant::MachInst; let mut isa_builder = cranelift_codegen::isa::lookup_variant(target_triple, variant).unwrap(); // Don't use "haswell", as it implies `has_lzcnt`.macOS CI is still at Ivy Bridge EP, so `lzcnt` // is interpreted as `bsr`. diff --git a/compiler/rustc_codegen_cranelift/src/main_shim.rs b/compiler/rustc_codegen_cranelift/src/main_shim.rs index b193cea877..62e551b186 100644 --- a/compiler/rustc_codegen_cranelift/src/main_shim.rs +++ b/compiler/rustc_codegen_cranelift/src/main_shim.rs @@ -9,7 +9,6 @@ pub(crate) fn maybe_create_entry_wrapper( tcx: TyCtxt<'_>, module: &mut impl Module, unwind_context: &mut UnwindContext<'_>, - use_jit: bool, ) { let (main_def_id, use_start_lang_item) = match tcx.entry_fn(LOCAL_CRATE) { Some((def_id, entry_ty)) => ( @@ -27,14 +26,7 @@ pub(crate) fn maybe_create_entry_wrapper( return; } - create_entry_fn( - tcx, - module, - unwind_context, - main_def_id, - use_start_lang_item, - use_jit, - ); + create_entry_fn(tcx, module, unwind_context, main_def_id, use_start_lang_item); fn create_entry_fn( tcx: TyCtxt<'_>, @@ -42,7 +34,6 @@ pub(crate) fn maybe_create_entry_wrapper( unwind_context: &mut UnwindContext<'_>, rust_main_def_id: DefId, use_start_lang_item: bool, - use_jit: bool, ) { let main_ret_ty = tcx.fn_sig(rust_main_def_id).output(); // Given that `main()` has no arguments, @@ -57,23 +48,17 @@ pub(crate) fn maybe_create_entry_wrapper( AbiParam::new(m.target_config().pointer_type()), AbiParam::new(m.target_config().pointer_type()), ], - returns: vec![AbiParam::new( - m.target_config().pointer_type(), /*isize*/ - )], + returns: vec![AbiParam::new(m.target_config().pointer_type() /*isize*/)], call_conv: CallConv::triple_default(m.isa().triple()), }; - let cmain_func_id = m - .declare_function("main", Linkage::Export, &cmain_sig) - .unwrap(); + let cmain_func_id = m.declare_function("main", Linkage::Export, &cmain_sig).unwrap(); let instance = Instance::mono(tcx, rust_main_def_id).polymorphize(tcx); let main_name = tcx.symbol_name(instance).name.to_string(); let main_sig = get_function_sig(tcx, m.isa().triple(), instance); - let main_func_id = m - .declare_function(&main_name, Linkage::Import, &main_sig) - .unwrap(); + let main_func_id = m.declare_function(&main_name, Linkage::Import, &main_sig).unwrap(); let mut ctx = Context::new(); ctx.func = Function::with_name_signature(ExternalName::user(0, 0), cmain_sig); @@ -86,8 +71,6 @@ pub(crate) fn maybe_create_entry_wrapper( let arg_argc = bcx.append_block_param(block, m.target_config().pointer_type()); let arg_argv = bcx.append_block_param(block, m.target_config().pointer_type()); - crate::atomic_shim::init_global_lock(m, &mut bcx, use_jit); - let main_func_ref = m.declare_func_in_func(main_func_id, &mut bcx.func); let call_inst = if use_start_lang_item { @@ -103,9 +86,7 @@ pub(crate) fn maybe_create_entry_wrapper( .polymorphize(tcx); let start_func_id = import_function(tcx, m, start_instance); - let main_val = bcx - .ins() - .func_addr(m.target_config().pointer_type(), main_func_ref); + let main_val = bcx.ins().func_addr(m.target_config().pointer_type(), main_func_ref); let func_ref = m.declare_func_in_func(start_func_id, &mut bcx.func); bcx.ins().call(func_ref, &[main_val, arg_argc, arg_argv]) diff --git a/compiler/rustc_codegen_cranelift/src/metadata.rs b/compiler/rustc_codegen_cranelift/src/metadata.rs index 2e3b9fb836..190c4f45cc 100644 --- a/compiler/rustc_codegen_cranelift/src/metadata.rs +++ b/compiler/rustc_codegen_cranelift/src/metadata.rs @@ -94,9 +94,7 @@ pub(crate) fn write_metadata( assert!(kind == MetadataKind::Compressed); let mut compressed = tcx.metadata_encoding_version(); - FrameEncoder::new(&mut compressed) - .write_all(&metadata.raw_data) - .unwrap(); + FrameEncoder::new(&mut compressed).write_all(&metadata.raw_data).unwrap(); product.add_rustc_section( rustc_middle::middle::exported_symbols::metadata_symbol_name(tcx), diff --git a/compiler/rustc_codegen_cranelift/src/num.rs b/compiler/rustc_codegen_cranelift/src/num.rs index d1d2b3b872..da49e1c6c9 100644 --- a/compiler/rustc_codegen_cranelift/src/num.rs +++ b/compiler/rustc_codegen_cranelift/src/num.rs @@ -41,7 +41,7 @@ pub(crate) fn bin_op_to_intcc(bin_op: BinOp, signed: bool) -> Option { } fn codegen_compare_bin_op<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, bin_op: BinOp, signed: bool, lhs: Value, @@ -54,7 +54,7 @@ fn codegen_compare_bin_op<'tcx>( } pub(crate) fn codegen_binop<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, bin_op: BinOp, in_lhs: CValue<'tcx>, in_rhs: CValue<'tcx>, @@ -93,17 +93,12 @@ pub(crate) fn codegen_binop<'tcx>( ty::Uint(_) | ty::Int(_) => crate::num::codegen_int_binop(fx, bin_op, in_lhs, in_rhs), ty::Float(_) => crate::num::codegen_float_binop(fx, bin_op, in_lhs, in_rhs), ty::RawPtr(..) | ty::FnPtr(..) => crate::num::codegen_ptr_binop(fx, bin_op, in_lhs, in_rhs), - _ => unreachable!( - "{:?}({:?}, {:?})", - bin_op, - in_lhs.layout().ty, - in_rhs.layout().ty - ), + _ => unreachable!("{:?}({:?}, {:?})", bin_op, in_lhs.layout().ty, in_rhs.layout().ty), } } pub(crate) fn codegen_bool_binop<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, bin_op: BinOp, in_lhs: CValue<'tcx>, in_rhs: CValue<'tcx>, @@ -124,7 +119,7 @@ pub(crate) fn codegen_bool_binop<'tcx>( } pub(crate) fn codegen_int_binop<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, bin_op: BinOp, in_lhs: CValue<'tcx>, in_rhs: CValue<'tcx>, @@ -185,19 +180,14 @@ pub(crate) fn codegen_int_binop<'tcx>( } } // Compare binops handles by `codegen_binop`. - _ => unreachable!( - "{:?}({:?}, {:?})", - bin_op, - in_lhs.layout().ty, - in_rhs.layout().ty - ), + _ => unreachable!("{:?}({:?}, {:?})", bin_op, in_lhs.layout().ty, in_rhs.layout().ty), }; CValue::by_val(val, in_lhs.layout()) } pub(crate) fn codegen_checked_int_binop<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, bin_op: BinOp, in_lhs: CValue<'tcx>, in_rhs: CValue<'tcx>, @@ -268,9 +258,7 @@ pub(crate) fn codegen_checked_int_binop<'tcx>( let rhs = fx.bcx.ins().sextend(ty.double_width().unwrap(), rhs); let val = fx.bcx.ins().imul(lhs, rhs); let has_underflow = - fx.bcx - .ins() - .icmp_imm(IntCC::SignedLessThan, val, -(1 << (ty.bits() - 1))); + fx.bcx.ins().icmp_imm(IntCC::SignedLessThan, val, -(1 << (ty.bits() - 1))); let has_overflow = fx.bcx.ins().icmp_imm( IntCC::SignedGreaterThan, val, @@ -309,10 +297,7 @@ pub(crate) fn codegen_checked_int_binop<'tcx>( let val = fx.bcx.ins().ishl(lhs, actual_shift); let ty = fx.bcx.func.dfg.value_type(val); let max_shift = i64::from(ty.bits()) - 1; - let has_overflow = fx - .bcx - .ins() - .icmp_imm(IntCC::UnsignedGreaterThan, rhs, max_shift); + let has_overflow = fx.bcx.ins().icmp_imm(IntCC::UnsignedGreaterThan, rhs, max_shift); (val, has_overflow) } BinOp::Shr => { @@ -326,38 +311,20 @@ pub(crate) fn codegen_checked_int_binop<'tcx>( }; let ty = fx.bcx.func.dfg.value_type(val); let max_shift = i64::from(ty.bits()) - 1; - let has_overflow = fx - .bcx - .ins() - .icmp_imm(IntCC::UnsignedGreaterThan, rhs, max_shift); + let has_overflow = fx.bcx.ins().icmp_imm(IntCC::UnsignedGreaterThan, rhs, max_shift); (val, has_overflow) } - _ => bug!( - "binop {:?} on checked int/uint lhs: {:?} rhs: {:?}", - bin_op, - in_lhs, - in_rhs - ), + _ => bug!("binop {:?} on checked int/uint lhs: {:?} rhs: {:?}", bin_op, in_lhs, in_rhs), }; let has_overflow = fx.bcx.ins().bint(types::I8, has_overflow); - // FIXME directly write to result place instead - let out_place = CPlace::new_stack_slot( - fx, - fx.layout_of( - fx.tcx - .mk_tup([in_lhs.layout().ty, fx.tcx.types.bool].iter()), - ), - ); - let out_layout = out_place.layout(); - out_place.write_cvalue(fx, CValue::by_val_pair(res, has_overflow, out_layout)); - - out_place.to_cvalue(fx) + let out_layout = fx.layout_of(fx.tcx.mk_tup([in_lhs.layout().ty, fx.tcx.types.bool].iter())); + CValue::by_val_pair(res, has_overflow, out_layout) } pub(crate) fn codegen_float_binop<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, bin_op: BinOp, in_lhs: CValue<'tcx>, in_rhs: CValue<'tcx>, @@ -402,7 +369,7 @@ pub(crate) fn codegen_float_binop<'tcx>( } pub(crate) fn codegen_ptr_binop<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, bin_op: BinOp, in_lhs: CValue<'tcx>, in_rhs: CValue<'tcx>, @@ -452,9 +419,7 @@ pub(crate) fn codegen_ptr_binop<'tcx>( let ptr_eq = fx.bcx.ins().icmp(IntCC::Equal, lhs_ptr, rhs_ptr); let ptr_cmp = - fx.bcx - .ins() - .icmp(bin_op_to_intcc(bin_op, false).unwrap(), lhs_ptr, rhs_ptr); + fx.bcx.ins().icmp(bin_op_to_intcc(bin_op, false).unwrap(), lhs_ptr, rhs_ptr); let extra_cmp = fx.bcx.ins().icmp( bin_op_to_intcc(bin_op, false).unwrap(), lhs_extra, @@ -466,9 +431,6 @@ pub(crate) fn codegen_ptr_binop<'tcx>( _ => panic!("bin_op {:?} on ptr", bin_op), }; - CValue::by_val( - fx.bcx.ins().bint(types::I8, res), - fx.layout_of(fx.tcx.types.bool), - ) + CValue::by_val(fx.bcx.ins().bint(types::I8, res), fx.layout_of(fx.tcx.types.bool)) } } diff --git a/compiler/rustc_codegen_cranelift/src/optimize/code_layout.rs b/compiler/rustc_codegen_cranelift/src/optimize/code_layout.rs index f02732014d..ca9ff15ec1 100644 --- a/compiler/rustc_codegen_cranelift/src/optimize/code_layout.rs +++ b/compiler/rustc_codegen_cranelift/src/optimize/code_layout.rs @@ -15,10 +15,7 @@ pub(super) fn optimize_function(ctx: &mut Context, cold_blocks: &EntitySet>(); for &inst in &insts { ctx.func.layout.remove_inst(inst); @@ -28,10 +25,7 @@ pub(super) fn optimize_function(ctx: &mut Context, cold_blocks: &EntitySet( if tcx.sess.opts.optimize == rustc_session::config::OptLevel::No { return; // FIXME classify optimizations over opt levels } - self::stack2reg::optimize_function(ctx, clif_comments); + + // FIXME(#1142) stack2reg miscompiles lewton + if false { + self::stack2reg::optimize_function(ctx, clif_comments); + } + crate::pretty_clif::write_clif_file(tcx, "stack2reg", None, instance, &ctx, &*clif_comments); crate::base::verify_func(tcx, &*clif_comments, &ctx.func); } diff --git a/compiler/rustc_codegen_cranelift/src/optimize/peephole.rs b/compiler/rustc_codegen_cranelift/src/optimize/peephole.rs index a575ed8dc3..b95e2d7287 100644 --- a/compiler/rustc_codegen_cranelift/src/optimize/peephole.rs +++ b/compiler/rustc_codegen_cranelift/src/optimize/peephole.rs @@ -10,10 +10,7 @@ use cranelift_frontend::FunctionBuilder; pub(crate) fn maybe_unwrap_bint(bcx: &mut FunctionBuilder<'_>, arg: Value) -> Value { if let ValueDef::Result(arg_inst, 0) = bcx.func.dfg.value_def(arg) { match bcx.func.dfg[arg_inst] { - InstructionData::Unary { - opcode: Opcode::Bint, - arg, - } => arg, + InstructionData::Unary { opcode: Opcode::Bint, arg } => arg, _ => arg, } } else { @@ -54,12 +51,7 @@ pub(crate) fn make_branchable_value(bcx: &mut FunctionBuilder<'_>, arg: Value) - match bcx.func.dfg[arg_inst] { // This is the lowering of Rvalue::Not - InstructionData::Load { - opcode: Opcode::Load, - arg: ptr, - flags, - offset, - } => { + InstructionData::Load { opcode: Opcode::Load, arg: ptr, flags, offset } => { // Using `load.i8 + uextend.i32` would legalize to `uload8 + ireduce.i8 + // uextend.i32`. Just `uload8` is much faster. match bcx.func.dfg.ctrl_typevar(arg_inst) { @@ -95,20 +87,14 @@ pub(crate) fn maybe_known_branch_taken( }; match bcx.func.dfg[arg_inst] { - InstructionData::UnaryBool { - opcode: Opcode::Bconst, - imm, - } => { + InstructionData::UnaryBool { opcode: Opcode::Bconst, imm } => { if test_zero { Some(!imm) } else { Some(imm) } } - InstructionData::UnaryImm { - opcode: Opcode::Iconst, - imm, - } => { + InstructionData::UnaryImm { opcode: Opcode::Iconst, imm } => { if test_zero { Some(imm.bits() == 0) } else { diff --git a/compiler/rustc_codegen_cranelift/src/optimize/stack2reg.rs b/compiler/rustc_codegen_cranelift/src/optimize/stack2reg.rs index 3c939d5a58..d111f37f5e 100644 --- a/compiler/rustc_codegen_cranelift/src/optimize/stack2reg.rs +++ b/compiler/rustc_codegen_cranelift/src/optimize/stack2reg.rs @@ -175,16 +175,14 @@ impl<'a> OptimizeContext<'a> { } } - OptimizeContext { - ctx, - stack_slot_usage_map, - } + OptimizeContext { ctx, stack_slot_usage_map } } } pub(super) fn optimize_function( ctx: &mut Context, - #[cfg_attr(not(debug_assertions), allow(unused_variables))] clif_comments: &mut crate::pretty_clif::CommentWriter, + #[cfg_attr(not(debug_assertions), allow(unused_variables))] + clif_comments: &mut crate::pretty_clif::CommentWriter, ) { combine_stack_addr_with_load_store(&mut ctx.func); @@ -296,12 +294,7 @@ fn combine_stack_addr_with_load_store(func: &mut Function) { while let Some(_block) = cursor.next_block() { while let Some(inst) = cursor.next_inst() { match cursor.func.dfg[inst] { - InstructionData::Load { - opcode: Opcode::Load, - arg: addr, - flags: _, - offset, - } => { + InstructionData::Load { opcode: Opcode::Load, arg: addr, flags: _, offset } => { if cursor.func.dfg.ctrl_typevar(inst) == types::I128 || cursor.func.dfg.ctrl_typevar(inst).is_vector() { @@ -391,20 +384,14 @@ fn remove_unused_stack_addr_and_stack_load(opt_ctx: &mut OptimizeContext<'_>) { stack_slot_users .stack_addr .drain_filter(|inst| { - stack_addr_load_insts_users - .get(inst) - .map(|users| users.is_empty()) - .unwrap_or(true) + stack_addr_load_insts_users.get(inst).map(|users| users.is_empty()).unwrap_or(true) }) .for_each(|inst| StackSlotUsage::remove_unused_stack_addr(&mut func, inst)); stack_slot_users .stack_load .drain_filter(|inst| { - stack_addr_load_insts_users - .get(inst) - .map(|users| users.is_empty()) - .unwrap_or(true) + stack_addr_load_insts_users.get(inst).map(|users| users.is_empty()).unwrap_or(true) }) .for_each(|inst| StackSlotUsage::remove_unused_load(&mut func, inst)); } @@ -415,11 +402,8 @@ fn try_get_stack_slot_and_offset_for_addr( addr: Value, ) -> Option<(StackSlot, Offset32)> { if let ValueDef::Result(addr_inst, 0) = func.dfg.value_def(addr) { - if let InstructionData::StackLoad { - opcode: Opcode::StackAddr, - stack_slot, - offset, - } = func.dfg[addr_inst] + if let InstructionData::StackLoad { opcode: Opcode::StackAddr, stack_slot, offset } = + func.dfg[addr_inst] { return Some((stack_slot, offset)); } @@ -437,16 +421,8 @@ enum SpatialOverlap { fn spatial_overlap(func: &Function, src: Inst, dest: Inst) -> SpatialOverlap { fn inst_info(func: &Function, inst: Inst) -> (StackSlot, Offset32, u32) { match func.dfg[inst] { - InstructionData::StackLoad { - opcode: Opcode::StackAddr, - stack_slot, - offset, - } - | InstructionData::StackLoad { - opcode: Opcode::StackLoad, - stack_slot, - offset, - } + InstructionData::StackLoad { opcode: Opcode::StackAddr, stack_slot, offset } + | InstructionData::StackLoad { opcode: Opcode::StackLoad, stack_slot, offset } | InstructionData::StackStore { opcode: Opcode::StackStore, stack_slot, @@ -471,10 +447,7 @@ fn spatial_overlap(func: &Function, src: Inst, dest: Inst) -> SpatialOverlap { } let src_end: i64 = src_offset.try_add_i64(i64::from(src_size)).unwrap().into(); - let dest_end: i64 = dest_offset - .try_add_i64(i64::from(dest_size)) - .unwrap() - .into(); + let dest_end: i64 = dest_offset.try_add_i64(i64::from(dest_size)).unwrap().into(); if src_end <= dest_offset.into() || dest_end <= src_offset.into() { return SpatialOverlap::No; } diff --git a/compiler/rustc_codegen_cranelift/src/pointer.rs b/compiler/rustc_codegen_cranelift/src/pointer.rs index b2036d7bcd..88a78f3214 100644 --- a/compiler/rustc_codegen_cranelift/src/pointer.rs +++ b/compiler/rustc_codegen_cranelift/src/pointer.rs @@ -23,35 +23,20 @@ pub(crate) enum PointerBase { impl Pointer { pub(crate) fn new(addr: Value) -> Self { - Pointer { - base: PointerBase::Addr(addr), - offset: Offset32::new(0), - } + Pointer { base: PointerBase::Addr(addr), offset: Offset32::new(0) } } pub(crate) fn stack_slot(stack_slot: StackSlot) -> Self { - Pointer { - base: PointerBase::Stack(stack_slot), - offset: Offset32::new(0), - } + Pointer { base: PointerBase::Stack(stack_slot), offset: Offset32::new(0) } } - pub(crate) fn const_addr<'a, 'tcx>( - fx: &mut FunctionCx<'a, 'tcx, impl Module>, - addr: i64, - ) -> Self { + pub(crate) fn const_addr(fx: &mut FunctionCx<'_, '_, '_>, addr: i64) -> Self { let addr = fx.bcx.ins().iconst(fx.pointer_type, addr); - Pointer { - base: PointerBase::Addr(addr), - offset: Offset32::new(0), - } + Pointer { base: PointerBase::Addr(addr), offset: Offset32::new(0) } } pub(crate) fn dangling(align: Align) -> Self { - Pointer { - base: PointerBase::Dangling(align), - offset: Offset32::new(0), - } + Pointer { base: PointerBase::Dangling(align), offset: Offset32::new(0) } } #[cfg(debug_assertions)] @@ -59,46 +44,28 @@ impl Pointer { (self.base, self.offset) } - pub(crate) fn get_addr<'a, 'tcx>(self, fx: &mut FunctionCx<'a, 'tcx, impl Module>) -> Value { + pub(crate) fn get_addr(self, fx: &mut FunctionCx<'_, '_, '_>) -> Value { match self.base { PointerBase::Addr(base_addr) => { let offset: i64 = self.offset.into(); - if offset == 0 { - base_addr - } else { - fx.bcx.ins().iadd_imm(base_addr, offset) - } + if offset == 0 { base_addr } else { fx.bcx.ins().iadd_imm(base_addr, offset) } } PointerBase::Stack(stack_slot) => { - fx.bcx - .ins() - .stack_addr(fx.pointer_type, stack_slot, self.offset) + fx.bcx.ins().stack_addr(fx.pointer_type, stack_slot, self.offset) + } + PointerBase::Dangling(align) => { + fx.bcx.ins().iconst(fx.pointer_type, i64::try_from(align.bytes()).unwrap()) } - PointerBase::Dangling(align) => fx - .bcx - .ins() - .iconst(fx.pointer_type, i64::try_from(align.bytes()).unwrap()), } } - pub(crate) fn offset<'a, 'tcx>( - self, - fx: &mut FunctionCx<'a, 'tcx, impl Module>, - extra_offset: Offset32, - ) -> Self { + pub(crate) fn offset(self, fx: &mut FunctionCx<'_, '_, '_>, extra_offset: Offset32) -> Self { self.offset_i64(fx, extra_offset.into()) } - pub(crate) fn offset_i64<'a, 'tcx>( - self, - fx: &mut FunctionCx<'a, 'tcx, impl Module>, - extra_offset: i64, - ) -> Self { + pub(crate) fn offset_i64(self, fx: &mut FunctionCx<'_, '_, '_>, extra_offset: i64) -> Self { if let Some(new_offset) = self.offset.try_add_i64(extra_offset) { - Pointer { - base: self.base, - offset: new_offset, - } + Pointer { base: self.base, offset: new_offset } } else { let base_offset: i64 = self.offset.into(); if let Some(new_offset) = base_offset.checked_add(extra_offset) { @@ -107,16 +74,12 @@ impl Pointer { PointerBase::Stack(stack_slot) => { fx.bcx.ins().stack_addr(fx.pointer_type, stack_slot, 0) } - PointerBase::Dangling(align) => fx - .bcx - .ins() - .iconst(fx.pointer_type, i64::try_from(align.bytes()).unwrap()), + PointerBase::Dangling(align) => { + fx.bcx.ins().iconst(fx.pointer_type, i64::try_from(align.bytes()).unwrap()) + } }; let addr = fx.bcx.ins().iadd_imm(base_addr, new_offset); - Pointer { - base: PointerBase::Addr(addr), - offset: Offset32::new(0), - } + Pointer { base: PointerBase::Addr(addr), offset: Offset32::new(0) } } else { panic!( "self.offset ({}) + extra_offset ({}) not representable in i64", @@ -126,31 +89,22 @@ impl Pointer { } } - pub(crate) fn offset_value<'a, 'tcx>( - self, - fx: &mut FunctionCx<'a, 'tcx, impl Module>, - extra_offset: Value, - ) -> Self { + pub(crate) fn offset_value(self, fx: &mut FunctionCx<'_, '_, '_>, extra_offset: Value) -> Self { match self.base { PointerBase::Addr(addr) => Pointer { base: PointerBase::Addr(fx.bcx.ins().iadd(addr, extra_offset)), offset: self.offset, }, PointerBase::Stack(stack_slot) => { - let base_addr = fx - .bcx - .ins() - .stack_addr(fx.pointer_type, stack_slot, self.offset); + let base_addr = fx.bcx.ins().stack_addr(fx.pointer_type, stack_slot, self.offset); Pointer { base: PointerBase::Addr(fx.bcx.ins().iadd(base_addr, extra_offset)), offset: Offset32::new(0), } } PointerBase::Dangling(align) => { - let addr = fx - .bcx - .ins() - .iconst(fx.pointer_type, i64::try_from(align.bytes()).unwrap()); + let addr = + fx.bcx.ins().iconst(fx.pointer_type, i64::try_from(align.bytes()).unwrap()); Pointer { base: PointerBase::Addr(fx.bcx.ins().iadd(addr, extra_offset)), offset: self.offset, @@ -159,46 +113,21 @@ impl Pointer { } } - pub(crate) fn load<'a, 'tcx>( - self, - fx: &mut FunctionCx<'a, 'tcx, impl Module>, - ty: Type, - flags: MemFlags, - ) -> Value { + pub(crate) fn load(self, fx: &mut FunctionCx<'_, '_, '_>, ty: Type, flags: MemFlags) -> Value { match self.base { PointerBase::Addr(base_addr) => fx.bcx.ins().load(ty, flags, base_addr, self.offset), - PointerBase::Stack(stack_slot) => { - if ty == types::I128 || ty.is_vector() { - // WORKAROUND for stack_load.i128 and stack_load.iXxY not being implemented - let base_addr = fx.bcx.ins().stack_addr(fx.pointer_type, stack_slot, 0); - fx.bcx.ins().load(ty, flags, base_addr, self.offset) - } else { - fx.bcx.ins().stack_load(ty, stack_slot, self.offset) - } - } + PointerBase::Stack(stack_slot) => fx.bcx.ins().stack_load(ty, stack_slot, self.offset), PointerBase::Dangling(_align) => unreachable!(), } } - pub(crate) fn store<'a, 'tcx>( - self, - fx: &mut FunctionCx<'a, 'tcx, impl Module>, - value: Value, - flags: MemFlags, - ) { + pub(crate) fn store(self, fx: &mut FunctionCx<'_, '_, '_>, value: Value, flags: MemFlags) { match self.base { PointerBase::Addr(base_addr) => { fx.bcx.ins().store(flags, value, base_addr, self.offset); } PointerBase::Stack(stack_slot) => { - let val_ty = fx.bcx.func.dfg.value_type(value); - if val_ty == types::I128 || val_ty.is_vector() { - // WORKAROUND for stack_store.i128 and stack_store.iXxY not being implemented - let base_addr = fx.bcx.ins().stack_addr(fx.pointer_type, stack_slot, 0); - fx.bcx.ins().store(flags, value, base_addr, self.offset); - } else { - fx.bcx.ins().stack_store(value, stack_slot, self.offset); - } + fx.bcx.ins().stack_store(value, stack_slot, self.offset); } PointerBase::Dangling(_align) => unreachable!(), } diff --git a/compiler/rustc_codegen_cranelift/src/pretty_clif.rs b/compiler/rustc_codegen_cranelift/src/pretty_clif.rs index f4a15ab12d..9c91b92e51 100644 --- a/compiler/rustc_codegen_cranelift/src/pretty_clif.rs +++ b/compiler/rustc_codegen_cranelift/src/pretty_clif.rs @@ -79,20 +79,14 @@ impl CommentWriter { vec![ format!("symbol {}", tcx.symbol_name(instance).name), format!("instance {:?}", instance), - format!( - "abi {:?}", - FnAbi::of_instance(&RevealAllLayoutCx(tcx), instance, &[]) - ), + format!("abi {:?}", FnAbi::of_instance(&RevealAllLayoutCx(tcx), instance, &[])), String::new(), ] } else { vec![] }; - CommentWriter { - global_comments, - entity_comments: FxHashMap::default(), - } + CommentWriter { global_comments, entity_comments: FxHashMap::default() } } } @@ -186,7 +180,7 @@ impl FuncWriter for &'_ CommentWriter { } #[cfg(debug_assertions)] -impl FunctionCx<'_, '_, M> { +impl FunctionCx<'_, '_, '_> { pub(crate) fn add_global_comment>(&mut self, comment: S) { self.clif_comments.add_global_comment(comment); } @@ -201,12 +195,7 @@ impl FunctionCx<'_, '_, M> { } pub(crate) fn should_write_ir(tcx: TyCtxt<'_>) -> bool { - cfg!(debug_assertions) - || tcx - .sess - .opts - .output_types - .contains_key(&OutputType::LlvmAssembly) + tcx.sess.opts.output_types.contains_key(&OutputType::LlvmAssembly) } pub(crate) fn write_ir_file<'tcx>( @@ -245,40 +234,33 @@ pub(crate) fn write_clif_file<'tcx>( context: &cranelift_codegen::Context, mut clif_comments: &CommentWriter, ) { - write_ir_file( - tcx, - &format!("{}.{}.clif", tcx.symbol_name(instance).name, postfix), - |file| { - let value_ranges = isa.map(|isa| { - context - .build_value_labels_ranges(isa) - .expect("value location ranges") - }); + write_ir_file(tcx, &format!("{}.{}.clif", tcx.symbol_name(instance).name, postfix), |file| { + let value_ranges = + isa.map(|isa| context.build_value_labels_ranges(isa).expect("value location ranges")); - let mut clif = String::new(); - cranelift_codegen::write::decorate_function( - &mut clif_comments, - &mut clif, - &context.func, - &DisplayFunctionAnnotations { - isa: Some(&*crate::build_isa(tcx.sess)), - value_ranges: value_ranges.as_ref(), - }, - ) - .unwrap(); + let mut clif = String::new(); + cranelift_codegen::write::decorate_function( + &mut clif_comments, + &mut clif, + &context.func, + &DisplayFunctionAnnotations { + isa: Some(&*crate::build_isa(tcx.sess)), + value_ranges: value_ranges.as_ref(), + }, + ) + .unwrap(); - writeln!(file, "test compile")?; - writeln!(file, "set is_pic")?; - writeln!(file, "set enable_simd")?; - writeln!(file, "target {} haswell", crate::target_triple(tcx.sess))?; - writeln!(file)?; - file.write_all(clif.as_bytes())?; - Ok(()) - }, - ); + writeln!(file, "test compile")?; + writeln!(file, "set is_pic")?; + writeln!(file, "set enable_simd")?; + writeln!(file, "target {} haswell", crate::target_triple(tcx.sess))?; + writeln!(file)?; + file.write_all(clif.as_bytes())?; + Ok(()) + }); } -impl fmt::Debug for FunctionCx<'_, '_, M> { +impl fmt::Debug for FunctionCx<'_, '_, '_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { writeln!(f, "{:?}", self.instance.substs)?; writeln!(f, "{:?}", self.local_map)?; diff --git a/compiler/rustc_codegen_cranelift/src/toolchain.rs b/compiler/rustc_codegen_cranelift/src/toolchain.rs index 735c59d70c..484a9b699a 100644 --- a/compiler/rustc_codegen_cranelift/src/toolchain.rs +++ b/compiler/rustc_codegen_cranelift/src/toolchain.rs @@ -71,12 +71,9 @@ fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) { flavor, )), (Some(linker), None) => { - let stem = linker - .file_stem() - .and_then(|stem| stem.to_str()) - .unwrap_or_else(|| { - sess.fatal("couldn't extract file stem from specified linker") - }); + let stem = linker.file_stem().and_then(|stem| stem.to_str()).unwrap_or_else(|| { + sess.fatal("couldn't extract file stem from specified linker") + }); let flavor = if stem == "emcc" { LinkerFlavor::Em @@ -105,11 +102,7 @@ fn linker_and_flavor(sess: &Session) -> (PathBuf, LinkerFlavor) { // linker and linker flavor specified via command line have precedence over what the target // specification specifies - if let Some(ret) = infer_from( - sess, - sess.opts.cg.linker.clone(), - sess.opts.cg.linker_flavor, - ) { + if let Some(ret) = infer_from(sess, sess.opts.cg.linker.clone(), sess.opts.cg.linker_flavor) { return ret; } diff --git a/compiler/rustc_codegen_cranelift/src/trap.rs b/compiler/rustc_codegen_cranelift/src/trap.rs index 67495c7414..bb63d72add 100644 --- a/compiler/rustc_codegen_cranelift/src/trap.rs +++ b/compiler/rustc_codegen_cranelift/src/trap.rs @@ -2,7 +2,7 @@ use crate::prelude::*; -fn codegen_print(fx: &mut FunctionCx<'_, '_, impl Module>, msg: &str) { +fn codegen_print(fx: &mut FunctionCx<'_, '_, '_>, msg: &str) { let puts = fx .cx .module @@ -29,7 +29,7 @@ fn codegen_print(fx: &mut FunctionCx<'_, '_, impl Module>, msg: &str) { } /// Trap code: user1 -pub(crate) fn trap_abort(fx: &mut FunctionCx<'_, '_, impl Module>, msg: impl AsRef) { +pub(crate) fn trap_abort(fx: &mut FunctionCx<'_, '_, '_>, msg: impl AsRef) { codegen_print(fx, msg.as_ref()); fx.bcx.ins().trap(TrapCode::User(1)); } @@ -38,7 +38,7 @@ pub(crate) fn trap_abort(fx: &mut FunctionCx<'_, '_, impl Module>, msg: impl AsR /// so you can **not** add instructions to it afterwards. /// /// Trap code: user65535 -pub(crate) fn trap_unreachable(fx: &mut FunctionCx<'_, '_, impl Module>, msg: impl AsRef) { +pub(crate) fn trap_unreachable(fx: &mut FunctionCx<'_, '_, '_>, msg: impl AsRef) { codegen_print(fx, msg.as_ref()); fx.bcx.ins().trap(TrapCode::UnreachableCodeReached); } @@ -47,7 +47,7 @@ pub(crate) fn trap_unreachable(fx: &mut FunctionCx<'_, '_, impl Module>, msg: im /// /// Trap code: user65535 pub(crate) fn trap_unreachable_ret_value<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, dest_layout: TyAndLayout<'tcx>, msg: impl AsRef, ) -> CValue<'tcx> { @@ -62,7 +62,7 @@ pub(crate) fn trap_unreachable_ret_value<'tcx>( /// to it afterwards. /// /// Trap code: user65535 -pub(crate) fn trap_unimplemented(fx: &mut FunctionCx<'_, '_, impl Module>, msg: impl AsRef) { +pub(crate) fn trap_unimplemented(fx: &mut FunctionCx<'_, '_, '_>, msg: impl AsRef) { codegen_print(fx, msg.as_ref()); let true_ = fx.bcx.ins().iconst(types::I32, 1); fx.bcx.ins().trapnz(true_, TrapCode::User(!0)); @@ -72,7 +72,7 @@ pub(crate) fn trap_unimplemented(fx: &mut FunctionCx<'_, '_, impl Module>, msg: /// /// Trap code: user65535 pub(crate) fn trap_unimplemented_ret_value<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, dest_layout: TyAndLayout<'tcx>, msg: impl AsRef, ) -> CValue<'tcx> { diff --git a/compiler/rustc_codegen_cranelift/src/unsize.rs b/compiler/rustc_codegen_cranelift/src/unsize.rs index c77ff5d56b..042583cd57 100644 --- a/compiler/rustc_codegen_cranelift/src/unsize.rs +++ b/compiler/rustc_codegen_cranelift/src/unsize.rs @@ -13,19 +13,18 @@ use crate::prelude::*; /// in an upcast, where the new vtable for an object will be derived /// from the old one. pub(crate) fn unsized_info<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, source: Ty<'tcx>, target: Ty<'tcx>, old_info: Option, ) -> Value { let (source, target) = - fx.tcx - .struct_lockstep_tails_erasing_lifetimes(source, target, ParamEnv::reveal_all()); + fx.tcx.struct_lockstep_tails_erasing_lifetimes(source, target, ParamEnv::reveal_all()); match (&source.kind(), &target.kind()) { - (&ty::Array(_, len), &ty::Slice(_)) => fx.bcx.ins().iconst( - fx.pointer_type, - len.eval_usize(fx.tcx, ParamEnv::reveal_all()) as i64, - ), + (&ty::Array(_, len), &ty::Slice(_)) => fx + .bcx + .ins() + .iconst(fx.pointer_type, len.eval_usize(fx.tcx, ParamEnv::reveal_all()) as i64), (&ty::Dynamic(..), &ty::Dynamic(..)) => { // For now, upcasts are limited to changes in marker // traits, and hence never actually require an actual @@ -35,17 +34,13 @@ pub(crate) fn unsized_info<'tcx>( (_, &ty::Dynamic(ref data, ..)) => { crate::vtable::get_vtable(fx, fx.layout_of(source), data.principal()) } - _ => bug!( - "unsized_info: invalid unsizing {:?} -> {:?}", - source, - target - ), + _ => bug!("unsized_info: invalid unsizing {:?} -> {:?}", source, target), } } /// Coerce `src` to `dst_ty`. `src_ty` must be a thin pointer. fn unsize_thin_ptr<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, src: Value, src_layout: TyAndLayout<'tcx>, dst_layout: TyAndLayout<'tcx>, @@ -89,24 +84,22 @@ fn unsize_thin_ptr<'tcx>( /// Coerce `src`, which is a reference to a value of type `src_ty`, /// to a value of type `dst_ty` and store the result in `dst` pub(crate) fn coerce_unsized_into<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, src: CValue<'tcx>, dst: CPlace<'tcx>, ) { let src_ty = src.layout().ty; let dst_ty = dst.layout().ty; let mut coerce_ptr = || { - let (base, info) = if fx - .layout_of(src.layout().ty.builtin_deref(true).unwrap().ty) - .is_unsized() - { - // fat-ptr to fat-ptr unsize preserves the vtable - // i.e., &'a fmt::Debug+Send => &'a fmt::Debug - src.load_scalar_pair(fx) - } else { - let base = src.load_scalar(fx); - unsize_thin_ptr(fx, base, src.layout(), dst.layout()) - }; + let (base, info) = + if fx.layout_of(src.layout().ty.builtin_deref(true).unwrap().ty).is_unsized() { + // fat-ptr to fat-ptr unsize preserves the vtable + // i.e., &'a fmt::Debug+Send => &'a fmt::Debug + src.load_scalar_pair(fx) + } else { + let base = src.load_scalar(fx); + unsize_thin_ptr(fx, base, src.layout(), dst.layout()) + }; dst.write_cvalue(fx, CValue::by_val_pair(base, info, dst.layout())); }; match (&src_ty.kind(), &dst_ty.kind()) { @@ -131,39 +124,26 @@ pub(crate) fn coerce_unsized_into<'tcx>( } } } - _ => bug!( - "coerce_unsized_into: invalid coercion {:?} -> {:?}", - src_ty, - dst_ty - ), + _ => bug!("coerce_unsized_into: invalid coercion {:?} -> {:?}", src_ty, dst_ty), } } // Adapted from https://github.com/rust-lang/rust/blob/2a663555ddf36f6b041445894a8c175cd1bc718c/src/librustc_codegen_ssa/glue.rs pub(crate) fn size_and_align_of_dst<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, layout: TyAndLayout<'tcx>, info: Value, ) -> (Value, Value) { if !layout.is_unsized() { - let size = fx - .bcx - .ins() - .iconst(fx.pointer_type, layout.size.bytes() as i64); - let align = fx - .bcx - .ins() - .iconst(fx.pointer_type, layout.align.abi.bytes() as i64); + let size = fx.bcx.ins().iconst(fx.pointer_type, layout.size.bytes() as i64); + let align = fx.bcx.ins().iconst(fx.pointer_type, layout.align.abi.bytes() as i64); return (size, align); } match layout.ty.kind() { ty::Dynamic(..) => { // load size/align from vtable - ( - crate::vtable::size_of_obj(fx, info), - crate::vtable::min_align_of_obj(fx, info), - ) + (crate::vtable::size_of_obj(fx, info), crate::vtable::min_align_of_obj(fx, info)) } ty::Slice(_) | ty::Str => { let unit = layout.field(fx, 0); @@ -171,9 +151,7 @@ pub(crate) fn size_and_align_of_dst<'tcx>( // times the unit size. ( fx.bcx.ins().imul_imm(info, unit.size.bytes() as i64), - fx.bcx - .ins() - .iconst(fx.pointer_type, unit.align.abi.bytes() as i64), + fx.bcx.ins().iconst(fx.pointer_type, unit.align.abi.bytes() as i64), ) } _ => { @@ -211,10 +189,7 @@ pub(crate) fn size_and_align_of_dst<'tcx>( // Choose max of two known alignments (combined value must // be aligned according to more restrictive of the two). - let cmp = fx - .bcx - .ins() - .icmp(IntCC::UnsignedGreaterThan, sized_align, unsized_align); + let cmp = fx.bcx.ins().icmp(IntCC::UnsignedGreaterThan, sized_align, unsized_align); let align = fx.bcx.ins().select(cmp, sized_align, unsized_align); // Issue #27023: must add any necessary padding to `size` diff --git a/compiler/rustc_codegen_cranelift/src/value_and_place.rs b/compiler/rustc_codegen_cranelift/src/value_and_place.rs index 765604e0f9..cffaf79ded 100644 --- a/compiler/rustc_codegen_cranelift/src/value_and_place.rs +++ b/compiler/rustc_codegen_cranelift/src/value_and_place.rs @@ -6,7 +6,7 @@ use cranelift_codegen::entity::EntityRef; use cranelift_codegen::ir::immediates::Offset32; fn codegen_field<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, base: Pointer, extra: Option, layout: TyAndLayout<'tcx>, @@ -15,11 +15,8 @@ fn codegen_field<'tcx>( let field_offset = layout.fields.offset(field.index()); let field_layout = layout.field(&*fx, field.index()); - let simple = |fx: &mut FunctionCx<'_, '_, _>| { - ( - base.offset_i64(fx, i64::try_from(field_offset.bytes()).unwrap()), - field_layout, - ) + let simple = |fx: &mut FunctionCx<'_, '_, '_>| { + (base.offset_i64(fx, i64::try_from(field_offset.bytes()).unwrap()), field_layout) }; if let Some(extra) = extra { @@ -58,10 +55,7 @@ fn scalar_pair_calculate_b_offset( a_scalar: &Scalar, b_scalar: &Scalar, ) -> Offset32 { - let b_offset = a_scalar - .value - .size(&tcx) - .align_to(b_scalar.value.align(&tcx).abi); + let b_offset = a_scalar.value.size(&tcx).align_to(b_scalar.value.align(&tcx).abi); Offset32::new(b_offset.bytes().try_into().unwrap()) } @@ -106,10 +100,7 @@ impl<'tcx> CValue<'tcx> { } // FIXME remove - pub(crate) fn force_stack( - self, - fx: &mut FunctionCx<'_, 'tcx, impl Module>, - ) -> (Pointer, Option) { + pub(crate) fn force_stack(self, fx: &mut FunctionCx<'_, '_, 'tcx>) -> (Pointer, Option) { let layout = self.1; match self.0 { CValueInner::ByRef(ptr, meta) => (ptr, meta), @@ -129,7 +120,7 @@ impl<'tcx> CValue<'tcx> { } /// Load a value with layout.abi of scalar - pub(crate) fn load_scalar(self, fx: &mut FunctionCx<'_, 'tcx, impl Module>) -> Value { + pub(crate) fn load_scalar(self, fx: &mut FunctionCx<'_, '_, 'tcx>) -> Value { let layout = self.1; match self.0 { CValueInner::ByRef(ptr, None) => { @@ -153,10 +144,7 @@ impl<'tcx> CValue<'tcx> { } /// Load a value pair with layout.abi of scalar pair - pub(crate) fn load_scalar_pair( - self, - fx: &mut FunctionCx<'_, 'tcx, impl Module>, - ) -> (Value, Value) { + pub(crate) fn load_scalar_pair(self, fx: &mut FunctionCx<'_, '_, 'tcx>) -> (Value, Value) { let layout = self.1; match self.0 { CValueInner::ByRef(ptr, None) => { @@ -183,7 +171,7 @@ impl<'tcx> CValue<'tcx> { pub(crate) fn value_field( self, - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, field: mir::Field, ) -> CValue<'tcx> { let layout = self.1; @@ -219,21 +207,17 @@ impl<'tcx> CValue<'tcx> { } } - pub(crate) fn unsize_value( - self, - fx: &mut FunctionCx<'_, 'tcx, impl Module>, - dest: CPlace<'tcx>, - ) { + pub(crate) fn unsize_value(self, fx: &mut FunctionCx<'_, '_, 'tcx>, dest: CPlace<'tcx>) { crate::unsize::coerce_unsized_into(fx, self, dest); } /// If `ty` is signed, `const_val` must already be sign extended. pub(crate) fn const_val( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, layout: TyAndLayout<'tcx>, const_val: ty::ScalarInt, ) -> CValue<'tcx> { - assert_eq!(const_val.size(), layout.size); + assert_eq!(const_val.size(), layout.size, "{:#?}: {:?}", const_val, layout); use cranelift_codegen::ir::immediates::{Ieee32, Ieee64}; let clif_ty = fx.clif_type(layout.ty).unwrap(); @@ -250,18 +234,11 @@ impl<'tcx> CValue<'tcx> { ty::Uint(UintTy::U128) | ty::Int(IntTy::I128) => { let const_val = const_val.to_bits(layout.size).unwrap(); let lsb = fx.bcx.ins().iconst(types::I64, const_val as u64 as i64); - let msb = fx - .bcx - .ins() - .iconst(types::I64, (const_val >> 64) as u64 as i64); + let msb = fx.bcx.ins().iconst(types::I64, (const_val >> 64) as u64 as i64); fx.bcx.ins().iconcat(lsb, msb) } - ty::Bool | ty::Char | ty::Uint(_) | ty::Int(_) | ty::Ref(..) - | ty::RawPtr(..) => { - fx - .bcx - .ins() - .iconst(clif_ty, const_val.to_bits(layout.size).unwrap() as i64) + ty::Bool | ty::Char | ty::Uint(_) | ty::Int(_) | ty::Ref(..) | ty::RawPtr(..) => { + fx.bcx.ins().iconst(clif_ty, const_val.to_bits(layout.size).unwrap() as i64) } ty::Float(FloatTy::F32) => { fx.bcx.ins().f32const(Ieee32::with_bits(u32::try_from(const_val).unwrap())) @@ -279,14 +256,8 @@ impl<'tcx> CValue<'tcx> { } pub(crate) fn cast_pointer_to(self, layout: TyAndLayout<'tcx>) -> Self { - assert!(matches!( - self.layout().ty.kind(), - ty::Ref(..) | ty::RawPtr(..) | ty::FnPtr(..) - )); - assert!(matches!( - layout.ty.kind(), - ty::Ref(..) | ty::RawPtr(..) | ty::FnPtr(..) - )); + assert!(matches!(self.layout().ty.kind(), ty::Ref(..) | ty::RawPtr(..) | ty::FnPtr(..))); + assert!(matches!(layout.ty.kind(), ty::Ref(..) | ty::RawPtr(..) | ty::FnPtr(..))); assert_eq!(self.layout().abi, layout.abi); CValue(self.0, layout) } @@ -317,14 +288,11 @@ impl<'tcx> CPlace<'tcx> { } pub(crate) fn no_place(layout: TyAndLayout<'tcx>) -> CPlace<'tcx> { - CPlace { - inner: CPlaceInner::Addr(Pointer::dangling(layout.align.pref), None), - layout, - } + CPlace { inner: CPlaceInner::Addr(Pointer::dangling(layout.align.pref), None), layout } } pub(crate) fn new_stack_slot( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, layout: TyAndLayout<'tcx>, ) -> CPlace<'tcx> { assert!(!layout.is_unsized()); @@ -339,28 +307,22 @@ impl<'tcx> CPlace<'tcx> { size: (u32::try_from(layout.size.bytes()).unwrap() + 15) / 16 * 16, offset: None, }); - CPlace { - inner: CPlaceInner::Addr(Pointer::stack_slot(stack_slot), None), - layout, - } + CPlace { inner: CPlaceInner::Addr(Pointer::stack_slot(stack_slot), None), layout } } pub(crate) fn new_var( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, local: Local, layout: TyAndLayout<'tcx>, ) -> CPlace<'tcx> { let var = Variable::with_u32(fx.next_ssa_var); fx.next_ssa_var += 1; fx.bcx.declare_var(var, fx.clif_type(layout.ty).unwrap()); - CPlace { - inner: CPlaceInner::Var(local, var), - layout, - } + CPlace { inner: CPlaceInner::Var(local, var), layout } } pub(crate) fn new_var_pair( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, local: Local, layout: TyAndLayout<'tcx>, ) -> CPlace<'tcx> { @@ -372,17 +334,11 @@ impl<'tcx> CPlace<'tcx> { let (ty1, ty2) = fx.clif_pair_type(layout.ty).unwrap(); fx.bcx.declare_var(var1, ty1); fx.bcx.declare_var(var2, ty2); - CPlace { - inner: CPlaceInner::VarPair(local, var1, var2), - layout, - } + CPlace { inner: CPlaceInner::VarPair(local, var1, var2), layout } } pub(crate) fn for_ptr(ptr: Pointer, layout: TyAndLayout<'tcx>) -> CPlace<'tcx> { - CPlace { - inner: CPlaceInner::Addr(ptr, None), - layout, - } + CPlace { inner: CPlaceInner::Addr(ptr, None), layout } } pub(crate) fn for_ptr_with_extra( @@ -390,34 +346,27 @@ impl<'tcx> CPlace<'tcx> { extra: Value, layout: TyAndLayout<'tcx>, ) -> CPlace<'tcx> { - CPlace { - inner: CPlaceInner::Addr(ptr, Some(extra)), - layout, - } + CPlace { inner: CPlaceInner::Addr(ptr, Some(extra)), layout } } - pub(crate) fn to_cvalue(self, fx: &mut FunctionCx<'_, 'tcx, impl Module>) -> CValue<'tcx> { + pub(crate) fn to_cvalue(self, fx: &mut FunctionCx<'_, '_, 'tcx>) -> CValue<'tcx> { let layout = self.layout(); match self.inner { CPlaceInner::Var(_local, var) => { let val = fx.bcx.use_var(var); - fx.bcx - .set_val_label(val, cranelift_codegen::ir::ValueLabel::new(var.index())); + //fx.bcx.set_val_label(val, cranelift_codegen::ir::ValueLabel::new(var.index())); CValue::by_val(val, layout) } CPlaceInner::VarPair(_local, var1, var2) => { let val1 = fx.bcx.use_var(var1); - fx.bcx - .set_val_label(val1, cranelift_codegen::ir::ValueLabel::new(var1.index())); + //fx.bcx.set_val_label(val1, cranelift_codegen::ir::ValueLabel::new(var1.index())); let val2 = fx.bcx.use_var(var2); - fx.bcx - .set_val_label(val2, cranelift_codegen::ir::ValueLabel::new(var2.index())); + //fx.bcx.set_val_label(val2, cranelift_codegen::ir::ValueLabel::new(var2.index())); CValue::by_val_pair(val1, val2, layout) } CPlaceInner::VarLane(_local, var, lane) => { let val = fx.bcx.use_var(var); - fx.bcx - .set_val_label(val, cranelift_codegen::ir::ValueLabel::new(var.index())); + //fx.bcx.set_val_label(val, cranelift_codegen::ir::ValueLabel::new(var.index())); let val = fx.bcx.ins().extractlane(val, lane); CValue::by_val(val, layout) } @@ -447,11 +396,7 @@ impl<'tcx> CPlace<'tcx> { } } - pub(crate) fn write_cvalue( - self, - fx: &mut FunctionCx<'_, 'tcx, impl Module>, - from: CValue<'tcx>, - ) { + pub(crate) fn write_cvalue(self, fx: &mut FunctionCx<'_, '_, 'tcx>, from: CValue<'tcx>) { assert_assignable(fx, from.layout().ty, self.layout().ty); self.write_cvalue_maybe_transmute(fx, from, "write_cvalue"); @@ -459,7 +404,7 @@ impl<'tcx> CPlace<'tcx> { pub(crate) fn write_cvalue_transmute( self, - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, from: CValue<'tcx>, ) { self.write_cvalue_maybe_transmute(fx, from, "write_cvalue_transmute"); @@ -467,12 +412,12 @@ impl<'tcx> CPlace<'tcx> { fn write_cvalue_maybe_transmute( self, - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, from: CValue<'tcx>, #[cfg_attr(not(debug_assertions), allow(unused_variables))] method: &'static str, ) { fn transmute_value<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, var: Variable, data: Value, dst_ty: Type, @@ -511,8 +456,7 @@ impl<'tcx> CPlace<'tcx> { } _ => unreachable!("write_cvalue_transmute: {:?} -> {:?}", src_ty, dst_ty), }; - fx.bcx - .set_val_label(data, cranelift_codegen::ir::ValueLabel::new(var.index())); + //fx.bcx.set_val_label(data, cranelift_codegen::ir::ValueLabel::new(var.index())); fx.bcx.def_var(var, data); } @@ -558,15 +502,13 @@ impl<'tcx> CPlace<'tcx> { // First get the old vector let vector = fx.bcx.use_var(var); - fx.bcx - .set_val_label(vector, cranelift_codegen::ir::ValueLabel::new(var.index())); + //fx.bcx.set_val_label(vector, cranelift_codegen::ir::ValueLabel::new(var.index())); // Next insert the written lane into the vector let vector = fx.bcx.ins().insertlane(vector, data, lane); // Finally write the new vector - fx.bcx - .set_val_label(vector, cranelift_codegen::ir::ValueLabel::new(var.index())); + //fx.bcx.set_val_label(vector, cranelift_codegen::ir::ValueLabel::new(var.index())); fx.bcx.def_var(var, vector); return; @@ -604,10 +546,7 @@ impl<'tcx> CPlace<'tcx> { to_ptr.store(fx, val, flags); } CValueInner::ByValPair(_, _) => { - bug!( - "Non ScalarPair abi {:?} for ByValPair CValue", - dst_layout.abi - ); + bug!("Non ScalarPair abi {:?} for ByValPair CValue", dst_layout.abi); } CValueInner::ByRef(from_ptr, None) => { let from_addr = from_ptr.get_addr(fx); @@ -632,7 +571,7 @@ impl<'tcx> CPlace<'tcx> { pub(crate) fn place_field( self, - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, field: mir::Field, ) -> CPlace<'tcx> { let layout = self.layout(); @@ -650,18 +589,8 @@ impl<'tcx> CPlace<'tcx> { let layout = layout.field(&*fx, field.index()); match field.as_u32() { - 0 => { - return CPlace { - inner: CPlaceInner::Var(local, var1), - layout, - } - } - 1 => { - return CPlace { - inner: CPlaceInner::Var(local, var2), - layout, - } - } + 0 => return CPlace { inner: CPlaceInner::Var(local, var1), layout }, + 1 => return CPlace { inner: CPlaceInner::Var(local, var2), layout }, _ => unreachable!("field should be 0 or 1"), } } @@ -680,7 +609,7 @@ impl<'tcx> CPlace<'tcx> { pub(crate) fn place_index( self, - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, index: Value, ) -> CPlace<'tcx> { let (elem_layout, ptr) = match self.layout().ty.kind() { @@ -689,30 +618,24 @@ impl<'tcx> CPlace<'tcx> { _ => bug!("place_index({:?})", self.layout().ty), }; - let offset = fx - .bcx - .ins() - .imul_imm(index, elem_layout.size.bytes() as i64); + let offset = fx.bcx.ins().imul_imm(index, elem_layout.size.bytes() as i64); CPlace::for_ptr(ptr.offset_value(fx, offset), elem_layout) } - pub(crate) fn place_deref(self, fx: &mut FunctionCx<'_, 'tcx, impl Module>) -> CPlace<'tcx> { + pub(crate) fn place_deref(self, fx: &mut FunctionCx<'_, '_, 'tcx>) -> CPlace<'tcx> { let inner_layout = fx.layout_of(self.layout().ty.builtin_deref(true).unwrap().ty); if has_ptr_meta(fx.tcx, inner_layout.ty) { let (addr, extra) = self.to_cvalue(fx).load_scalar_pair(fx); CPlace::for_ptr_with_extra(Pointer::new(addr), extra, inner_layout) } else { - CPlace::for_ptr( - Pointer::new(self.to_cvalue(fx).load_scalar(fx)), - inner_layout, - ) + CPlace::for_ptr(Pointer::new(self.to_cvalue(fx).load_scalar(fx)), inner_layout) } } pub(crate) fn place_ref( self, - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, layout: TyAndLayout<'tcx>, ) -> CValue<'tcx> { if has_ptr_meta(fx.tcx, self.layout().ty) { @@ -729,21 +652,18 @@ impl<'tcx> CPlace<'tcx> { pub(crate) fn downcast_variant( self, - fx: &FunctionCx<'_, 'tcx, impl Module>, + fx: &FunctionCx<'_, '_, 'tcx>, variant: VariantIdx, ) -> Self { assert!(!self.layout().is_unsized()); let layout = self.layout().for_variant(fx, variant); - CPlace { - inner: self.inner, - layout, - } + CPlace { inner: self.inner, layout } } } #[track_caller] pub(crate) fn assert_assignable<'tcx>( - fx: &FunctionCx<'_, 'tcx, impl Module>, + fx: &FunctionCx<'_, '_, 'tcx>, from_ty: Ty<'tcx>, to_ty: Ty<'tcx>, ) { @@ -776,12 +696,9 @@ pub(crate) fn assert_assignable<'tcx>( } (&ty::Dynamic(from_traits, _), &ty::Dynamic(to_traits, _)) => { for (from, to) in from_traits.iter().zip(to_traits) { - let from = fx - .tcx - .normalize_erasing_late_bound_regions(ParamEnv::reveal_all(), from); - let to = fx - .tcx - .normalize_erasing_late_bound_regions(ParamEnv::reveal_all(), to); + let from = + fx.tcx.normalize_erasing_late_bound_regions(ParamEnv::reveal_all(), from); + let to = fx.tcx.normalize_erasing_late_bound_regions(ParamEnv::reveal_all(), to); assert_eq!( from, to, "Can't write trait object of incompatible traits {:?} to place with traits {:?}\n\n{:#?}", diff --git a/compiler/rustc_codegen_cranelift/src/vtable.rs b/compiler/rustc_codegen_cranelift/src/vtable.rs index 8f15586a9d..4d2551a061 100644 --- a/compiler/rustc_codegen_cranelift/src/vtable.rs +++ b/compiler/rustc_codegen_cranelift/src/vtable.rs @@ -15,7 +15,7 @@ fn vtable_memflags() -> MemFlags { flags } -pub(crate) fn drop_fn_of_obj(fx: &mut FunctionCx<'_, '_, impl Module>, vtable: Value) -> Value { +pub(crate) fn drop_fn_of_obj(fx: &mut FunctionCx<'_, '_, '_>, vtable: Value) -> Value { let usize_size = fx.layout_of(fx.tcx.types.usize).size.bytes() as usize; fx.bcx.ins().load( pointer_ty(fx.tcx), @@ -25,7 +25,7 @@ pub(crate) fn drop_fn_of_obj(fx: &mut FunctionCx<'_, '_, impl Module>, vtable: V ) } -pub(crate) fn size_of_obj(fx: &mut FunctionCx<'_, '_, impl Module>, vtable: Value) -> Value { +pub(crate) fn size_of_obj(fx: &mut FunctionCx<'_, '_, '_>, vtable: Value) -> Value { let usize_size = fx.layout_of(fx.tcx.types.usize).size.bytes() as usize; fx.bcx.ins().load( pointer_ty(fx.tcx), @@ -35,7 +35,7 @@ pub(crate) fn size_of_obj(fx: &mut FunctionCx<'_, '_, impl Module>, vtable: Valu ) } -pub(crate) fn min_align_of_obj(fx: &mut FunctionCx<'_, '_, impl Module>, vtable: Value) -> Value { +pub(crate) fn min_align_of_obj(fx: &mut FunctionCx<'_, '_, '_>, vtable: Value) -> Value { let usize_size = fx.layout_of(fx.tcx.types.usize).size.bytes() as usize; fx.bcx.ins().load( pointer_ty(fx.tcx), @@ -46,7 +46,7 @@ pub(crate) fn min_align_of_obj(fx: &mut FunctionCx<'_, '_, impl Module>, vtable: } pub(crate) fn get_ptr_and_method_ref<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, arg: CValue<'tcx>, idx: usize, ) -> (Value, Value) { @@ -68,7 +68,7 @@ pub(crate) fn get_ptr_and_method_ref<'tcx>( } pub(crate) fn get_vtable<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, layout: TyAndLayout<'tcx>, trait_ref: Option>, ) -> Value { @@ -85,7 +85,7 @@ pub(crate) fn get_vtable<'tcx>( } fn build_vtable<'tcx>( - fx: &mut FunctionCx<'_, 'tcx, impl Module>, + fx: &mut FunctionCx<'_, '_, 'tcx>, layout: TyAndLayout<'tcx>, trait_ref: Option>, ) -> DataId { @@ -94,7 +94,7 @@ fn build_vtable<'tcx>( let drop_in_place_fn = import_function( tcx, - &mut fx.cx.module, + fx.cx.module, Instance::resolve_drop_in_place(tcx, layout.ty).polymorphize(fx.tcx), ); @@ -111,7 +111,7 @@ fn build_vtable<'tcx>( opt_mth.map(|(def_id, substs)| { import_function( tcx, - &mut fx.cx.module, + fx.cx.module, Instance::resolve_for_vtable(tcx, ParamEnv::reveal_all(), def_id, substs) .unwrap() .polymorphize(fx.tcx), @@ -165,11 +165,8 @@ fn build_vtable<'tcx>( } fn write_usize(tcx: TyCtxt<'_>, buf: &mut [u8], idx: usize, num: u64) { - let pointer_size = tcx - .layout_of(ParamEnv::reveal_all().and(tcx.types.usize)) - .unwrap() - .size - .bytes() as usize; + let pointer_size = + tcx.layout_of(ParamEnv::reveal_all().and(tcx.types.usize)).unwrap().size.bytes() as usize; let target = &mut buf[idx * pointer_size..(idx + 1) * pointer_size]; match tcx.data_layout.endian { diff --git a/compiler/rustc_codegen_cranelift/test.sh b/compiler/rustc_codegen_cranelift/test.sh index 5ab10e0e90..e222adc7b8 100755 --- a/compiler/rustc_codegen_cranelift/test.sh +++ b/compiler/rustc_codegen_cranelift/test.sh @@ -1,4 +1,4 @@ -#!/bin/bash +#!/usr/bin/env bash set -e ./build.sh --sysroot none "$@" diff --git a/compiler/rustc_codegen_llvm/Cargo.toml b/compiler/rustc_codegen_llvm/Cargo.toml index f9373640dc..4999cb3c7a 100644 --- a/compiler/rustc_codegen_llvm/Cargo.toml +++ b/compiler/rustc_codegen_llvm/Cargo.toml @@ -10,8 +10,9 @@ doctest = false [dependencies] bitflags = "1.0" +cstr = "0.2" libc = "0.2" -measureme = "9.0.0" +measureme = "9.1.0" snap = "1" tracing = "0.1" rustc_middle = { path = "../rustc_middle" } @@ -29,6 +30,6 @@ rustc_llvm = { path = "../rustc_llvm" } rustc_session = { path = "../rustc_session" } rustc_serialize = { path = "../rustc_serialize" } rustc_target = { path = "../rustc_target" } -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } rustc_ast = { path = "../rustc_ast" } rustc_span = { path = "../rustc_span" } diff --git a/compiler/rustc_codegen_llvm/src/abi.rs b/compiler/rustc_codegen_llvm/src/abi.rs index a69241e456..d9393ffe53 100644 --- a/compiler/rustc_codegen_llvm/src/abi.rs +++ b/compiler/rustc_codegen_llvm/src/abi.rs @@ -430,7 +430,13 @@ impl<'tcx> FnAbiLlvmExt<'tcx> for FnAbi<'tcx, Ty<'tcx>> { PassMode::Indirect { ref attrs, extra_attrs: _, on_stack } => { assert!(!on_stack); let i = apply(attrs); - llvm::Attribute::StructRet.apply_llfn(llvm::AttributePlace::Argument(i), llfn); + unsafe { + llvm::LLVMRustAddStructRetAttr( + llfn, + llvm::AttributePlace::Argument(i).as_uint(), + self.ret.layout.llvm_type(cx), + ); + } } _ => {} } @@ -486,8 +492,13 @@ impl<'tcx> FnAbiLlvmExt<'tcx> for FnAbi<'tcx, Ty<'tcx>> { PassMode::Indirect { ref attrs, extra_attrs: _, on_stack } => { assert!(!on_stack); let i = apply(attrs); - llvm::Attribute::StructRet - .apply_callsite(llvm::AttributePlace::Argument(i), callsite); + unsafe { + llvm::LLVMRustAddStructRetCallSiteAttr( + callsite, + llvm::AttributePlace::Argument(i).as_uint(), + self.ret.layout.llvm_type(bx), + ); + } } _ => {} } @@ -554,7 +565,7 @@ impl<'tcx> FnAbiLlvmExt<'tcx> for FnAbi<'tcx, Ty<'tcx>> { llvm::AddCallSiteAttrString( callsite, llvm::AttributePlace::Function, - rustc_data_structures::const_cstr!("cmse_nonsecure_call"), + cstr::cstr!("cmse_nonsecure_call"), ); } } diff --git a/compiler/rustc_codegen_llvm/src/allocator.rs b/compiler/rustc_codegen_llvm/src/allocator.rs index a5ea0b2a74..068e5e99ef 100644 --- a/compiler/rustc_codegen_llvm/src/allocator.rs +++ b/compiler/rustc_codegen_llvm/src/allocator.rs @@ -93,7 +93,7 @@ pub(crate) unsafe fn codegen( let args = [usize, usize]; // size, align let ty = llvm::LLVMFunctionType(void, args.as_ptr(), args.len() as c_uint, False); - let name = "__rust_alloc_error_handler".to_string(); + let name = "__rust_alloc_error_handler"; let llfn = llvm::LLVMRustGetOrInsertFunction(llmod, name.as_ptr().cast(), name.len(), ty); // -> ! DIFlagNoReturn llvm::Attribute::NoReturn.apply_llfn(llvm::AttributePlace::Function, llfn); diff --git a/compiler/rustc_codegen_llvm/src/asm.rs b/compiler/rustc_codegen_llvm/src/asm.rs index 8801211d51..e7d359c4f1 100644 --- a/compiler/rustc_codegen_llvm/src/asm.rs +++ b/compiler/rustc_codegen_llvm/src/asm.rs @@ -61,9 +61,9 @@ impl AsmBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> { // Default per-arch clobbers // Basically what clang does let arch_clobbers = match &self.sess().target.arch[..] { - "x86" | "x86_64" => vec!["~{dirflag}", "~{fpsr}", "~{flags}"], - "mips" | "mips64" => vec!["~{$1}"], - _ => Vec::new(), + "x86" | "x86_64" => &["~{dirflag}", "~{fpsr}", "~{flags}"][..], + "mips" | "mips64" => &["~{$1}"], + _ => &[], }; let all_constraints = ia @@ -304,6 +304,7 @@ impl AsmBuilderMethods<'tcx> for Builder<'a, 'll, 'tcx> { } else if options.contains(InlineAsmOptions::READONLY) { llvm::Attribute::ReadOnly.apply_callsite(llvm::AttributePlace::Function, result); } + llvm::Attribute::WillReturn.apply_callsite(llvm::AttributePlace::Function, result); } else if options.contains(InlineAsmOptions::NOMEM) { llvm::Attribute::InaccessibleMemOnly .apply_callsite(llvm::AttributePlace::Function, result); @@ -487,6 +488,9 @@ fn reg_to_llvm(reg: InlineAsmRegOrRegClass, layout: Option<&TyAndLayout<'tcx>>) } else if reg == InlineAsmReg::AArch64(AArch64InlineAsmReg::x30) { // LLVM doesn't recognize x30 "{lr}".to_string() + } else if reg == InlineAsmReg::Arm(ArmInlineAsmReg::r14) { + // LLVM doesn't recognize r14 + "{lr}".to_string() } else { format!("{{{}}}", reg.name()) } @@ -524,6 +528,7 @@ fn reg_to_llvm(reg: InlineAsmRegOrRegClass, layout: Option<&TyAndLayout<'tcx>>) InlineAsmRegClass::SpirV(SpirVInlineAsmRegClass::reg) => { bug!("LLVM backend does not support SPIR-V") } + InlineAsmRegClass::Err => unreachable!(), } .to_string(), } @@ -590,6 +595,7 @@ fn modifier_to_llvm( InlineAsmRegClass::SpirV(SpirVInlineAsmRegClass::reg) => { bug!("LLVM backend does not support SPIR-V") } + InlineAsmRegClass::Err => unreachable!(), } } @@ -633,6 +639,7 @@ fn dummy_output_type(cx: &CodegenCx<'ll, 'tcx>, reg: InlineAsmRegClass) -> &'ll InlineAsmRegClass::SpirV(SpirVInlineAsmRegClass::reg) => { bug!("LLVM backend does not support SPIR-V") } + InlineAsmRegClass::Err => unreachable!(), } } diff --git a/compiler/rustc_codegen_llvm/src/attributes.rs b/compiler/rustc_codegen_llvm/src/attributes.rs index a78d692aaa..64ebe585dd 100644 --- a/compiler/rustc_codegen_llvm/src/attributes.rs +++ b/compiler/rustc_codegen_llvm/src/attributes.rs @@ -2,8 +2,8 @@ use std::ffi::CString; +use cstr::cstr; use rustc_codegen_ssa::traits::*; -use rustc_data_structures::const_cstr; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::small_c_str::SmallCStr; use rustc_hir::def_id::DefId; @@ -53,6 +53,9 @@ pub fn sanitize(cx: &CodegenCx<'ll, '_>, no_sanitize: SanitizerSet, llfn: &'ll V if enabled.contains(SanitizerSet::THREAD) { llvm::Attribute::SanitizeThread.apply_llfn(Function, llfn); } + if enabled.contains(SanitizerSet::HWADDRESS) { + llvm::Attribute::SanitizeHWAddress.apply_llfn(Function, llfn); + } } /// Tell LLVM to emit or not emit the information necessary to unwind the stack for the function. @@ -72,8 +75,8 @@ pub fn set_frame_pointer_elimination(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) llvm::AddFunctionAttrStringValue( llfn, llvm::AttributePlace::Function, - const_cstr!("frame-pointer"), - const_cstr!("all"), + cstr!("frame-pointer"), + cstr!("all"), ); } } @@ -92,7 +95,7 @@ fn set_instrument_function(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) { llvm::AddFunctionAttrStringValue( llfn, llvm::AttributePlace::Function, - const_cstr!("instrument-function-entry-inlined"), + cstr!("instrument-function-entry-inlined"), &mcount_name, ); } @@ -126,16 +129,16 @@ fn set_probestack(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) { StackProbeType::None => None, // Request LLVM to generate the probes inline. If the given LLVM version does not support // this, no probe is generated at all (even if the attribute is specified). - StackProbeType::Inline => Some(const_cstr!("inline-asm")), + StackProbeType::Inline => Some(cstr!("inline-asm")), // Flag our internal `__rust_probestack` function as the stack probe symbol. // This is defined in the `compiler-builtins` crate for each architecture. - StackProbeType::Call => Some(const_cstr!("__rust_probestack")), + StackProbeType::Call => Some(cstr!("__rust_probestack")), // Pick from the two above based on the LLVM version. StackProbeType::InlineOrCall { min_llvm_version_for_inline } => { if llvm_util::get_version() < min_llvm_version_for_inline { - Some(const_cstr!("__rust_probestack")) + Some(cstr!("__rust_probestack")) } else { - Some(const_cstr!("inline-asm")) + Some(cstr!("inline-asm")) } } }; @@ -143,30 +146,18 @@ fn set_probestack(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) { llvm::AddFunctionAttrStringValue( llfn, llvm::AttributePlace::Function, - const_cstr!("probe-stack"), + cstr!("probe-stack"), attr_value, ); } } -pub fn llvm_target_features(sess: &Session) -> impl Iterator { - const RUSTC_SPECIFIC_FEATURES: &[&str] = &["crt-static"]; - - let cmdline = sess - .opts - .cg - .target_feature - .split(',') - .filter(|f| !RUSTC_SPECIFIC_FEATURES.iter().any(|s| f.contains(s))); - sess.target.features.split(',').chain(cmdline).filter(|l| !l.is_empty()) -} - pub fn apply_target_cpu_attr(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) { let target_cpu = SmallCStr::new(llvm_util::target_cpu(cx.tcx.sess)); llvm::AddFunctionAttrStringValue( llfn, llvm::AttributePlace::Function, - const_cstr!("target-cpu"), + cstr!("target-cpu"), target_cpu.as_c_str(), ); } @@ -177,7 +168,7 @@ pub fn apply_tune_cpu_attr(cx: &CodegenCx<'ll, '_>, llfn: &'ll Value) { llvm::AddFunctionAttrStringValue( llfn, llvm::AttributePlace::Function, - const_cstr!("tune-cpu"), + cstr!("tune-cpu"), tune_cpu.as_c_str(), ); } @@ -286,7 +277,7 @@ pub fn from_fn_attrs(cx: &CodegenCx<'ll, 'tcx>, llfn: &'ll Value, instance: ty:: Attribute::NoAlias.apply_llfn(llvm::AttributePlace::ReturnValue, llfn); } if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::CMSE_NONSECURE_ENTRY) { - llvm::AddFunctionAttrString(llfn, Function, const_cstr!("cmse_nonsecure_entry")); + llvm::AddFunctionAttrString(llfn, Function, cstr!("cmse_nonsecure_entry")); } sanitize(cx, codegen_fn_attrs.no_sanitize, llfn); @@ -298,25 +289,27 @@ pub fn from_fn_attrs(cx: &CodegenCx<'ll, 'tcx>, llfn: &'ll Value, instance: ty:: // The target doesn't care; the subtarget reads our attribute. apply_tune_cpu_attr(cx, llfn); - let features = llvm_target_features(cx.tcx.sess) - .map(|s| s.to_string()) - .chain(codegen_fn_attrs.target_features.iter().map(|f| { + let function_features = codegen_fn_attrs + .target_features + .iter() + .map(|f| { let feature = &f.as_str(); format!("+{}", llvm_util::to_llvm_feature(cx.tcx.sess, feature)) - })) + }) .chain(codegen_fn_attrs.instruction_set.iter().map(|x| match x { InstructionSetAttr::ArmA32 => "-thumb-mode".to_string(), InstructionSetAttr::ArmT32 => "+thumb-mode".to_string(), })) - .collect::>() - .join(","); - - if !features.is_empty() { + .collect::>(); + if !function_features.is_empty() { + let mut global_features = llvm_util::llvm_global_features(cx.tcx.sess); + global_features.extend(function_features.into_iter()); + let features = global_features.join(","); let val = CString::new(features).unwrap(); llvm::AddFunctionAttrStringValue( llfn, llvm::AttributePlace::Function, - const_cstr!("target-features"), + cstr!("target-features"), &val, ); } @@ -329,7 +322,7 @@ pub fn from_fn_attrs(cx: &CodegenCx<'ll, 'tcx>, llfn: &'ll Value, instance: ty:: llvm::AddFunctionAttrStringValue( llfn, llvm::AttributePlace::Function, - const_cstr!("wasm-import-module"), + cstr!("wasm-import-module"), &module, ); @@ -339,7 +332,7 @@ pub fn from_fn_attrs(cx: &CodegenCx<'ll, 'tcx>, llfn: &'ll Value, instance: ty:: llvm::AddFunctionAttrStringValue( llfn, llvm::AttributePlace::Function, - const_cstr!("wasm-import-name"), + cstr!("wasm-import-name"), &name, ); } diff --git a/compiler/rustc_codegen_llvm/src/back/write.rs b/compiler/rustc_codegen_llvm/src/back/write.rs index 326ae354cc..388dd7ce81 100644 --- a/compiler/rustc_codegen_llvm/src/back/write.rs +++ b/compiler/rustc_codegen_llvm/src/back/write.rs @@ -1,4 +1,3 @@ -use crate::attributes; use crate::back::lto::ThinBuffer; use crate::back::profiling::{ selfprofile_after_pass_callback, selfprofile_before_pass_callback, LlvmSelfProfiler, @@ -11,6 +10,7 @@ use crate::llvm_util; use crate::type_::Type; use crate::LlvmCodegenBackend; use crate::ModuleLlvm; +use rustc_codegen_ssa::back::link::ensure_removed; use rustc_codegen_ssa::back::write::{ BitcodeSection, CodegenContext, EmitObj, ModuleConfig, TargetMachineFactoryConfig, TargetMachineFactoryFn, @@ -93,7 +93,7 @@ pub fn create_informational_target_machine(sess: &Session) -> &'static mut llvm: pub fn create_target_machine(tcx: TyCtxt<'_>, mod_name: &str) -> &'static mut llvm::TargetMachine { let split_dwarf_file = if tcx.sess.target_can_use_split_dwarf() { tcx.output_filenames(LOCAL_CRATE) - .split_dwarf_filename(tcx.sess.split_debuginfo(), Some(mod_name)) + .split_dwarf_path(tcx.sess.split_debuginfo(), Some(mod_name)) } else { None }; @@ -139,7 +139,7 @@ fn to_llvm_relocation_model(relocation_model: RelocModel) -> llvm::RelocModel { } } -fn to_llvm_code_model(code_model: Option) -> llvm::CodeModel { +pub(crate) fn to_llvm_code_model(code_model: Option) -> llvm::CodeModel { match code_model { Some(CodeModel::Tiny) => llvm::CodeModel::Tiny, Some(CodeModel::Small) => llvm::CodeModel::Small, @@ -165,8 +165,6 @@ pub fn target_machine_factory( let code_model = to_llvm_code_model(sess.code_model()); - let mut features = llvm_util::handle_native_features(sess); - features.extend(attributes::llvm_target_features(sess).map(|s| s.to_owned())); let mut singlethread = sess.target.singlethread; // On the wasm target once the `atomics` feature is enabled that means that @@ -181,7 +179,7 @@ pub fn target_machine_factory( let triple = SmallCStr::new(&sess.target.llvm_target); let cpu = SmallCStr::new(llvm_util::target_cpu(sess)); - let features = features.join(","); + let features = llvm_util::llvm_global_features(sess).join(","); let features = CString::new(features).unwrap(); let abi = SmallCStr::new(&sess.target.llvm_abiname); let trap_unreachable = @@ -440,6 +438,8 @@ pub(crate) unsafe fn optimize_with_new_llvm_pass_manager( sanitize_memory_recover: config.sanitizer_recover.contains(SanitizerSet::MEMORY), sanitize_memory_track_origins: config.sanitizer_memory_track_origins as c_int, sanitize_thread: config.sanitizer.contains(SanitizerSet::THREAD), + sanitize_hwaddress: config.sanitizer.contains(SanitizerSet::HWADDRESS), + sanitize_hwaddress_recover: config.sanitizer_recover.contains(SanitizerSet::HWADDRESS), }) } else { None @@ -652,6 +652,10 @@ unsafe fn add_sanitizer_passes(config: &ModuleConfig, passes: &mut Vec<&'static if config.sanitizer.contains(SanitizerSet::THREAD) { passes.push(llvm::LLVMRustCreateThreadSanitizerPass()); } + if config.sanitizer.contains(SanitizerSet::HWADDRESS) { + let recover = config.sanitizer_recover.contains(SanitizerSet::HWADDRESS); + passes.push(llvm::LLVMRustCreateHWAddressSanitizerPass(recover)); + } } pub(crate) fn link( @@ -873,9 +877,7 @@ pub(crate) unsafe fn codegen( if !config.emit_bc { debug!("removing_bitcode {:?}", bc_out); - if let Err(e) = fs::remove_file(&bc_out) { - diag_handler.err(&format!("failed to remove bitcode: {}", e)); - } + ensure_removed(diag_handler, &bc_out); } } diff --git a/compiler/rustc_codegen_llvm/src/builder.rs b/compiler/rustc_codegen_llvm/src/builder.rs index d2f4d3edc2..f4852c91e5 100644 --- a/compiler/rustc_codegen_llvm/src/builder.rs +++ b/compiler/rustc_codegen_llvm/src/builder.rs @@ -5,13 +5,13 @@ use crate::llvm::{AtomicOrdering, AtomicRmwBinOp, SynchronizationScope}; use crate::type_::Type; use crate::type_of::LayoutLlvmExt; use crate::value::Value; +use cstr::cstr; use libc::{c_char, c_uint}; use rustc_codegen_ssa::common::{IntPredicate, RealPredicate, TypeKind}; use rustc_codegen_ssa::mir::operand::{OperandRef, OperandValue}; use rustc_codegen_ssa::mir::place::PlaceRef; use rustc_codegen_ssa::traits::*; use rustc_codegen_ssa::MemFlags; -use rustc_data_structures::const_cstr; use rustc_data_structures::small_c_str::SmallCStr; use rustc_hir::def_id::DefId; use rustc_middle::ty::layout::TyAndLayout; @@ -979,7 +979,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> { } fn cleanup_pad(&mut self, parent: Option<&'ll Value>, args: &[&'ll Value]) -> Funclet<'ll> { - let name = const_cstr!("cleanuppad"); + let name = cstr!("cleanuppad"); let ret = unsafe { llvm::LLVMRustBuildCleanupPad( self.llbuilder, @@ -1003,7 +1003,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> { } fn catch_pad(&mut self, parent: &'ll Value, args: &[&'ll Value]) -> Funclet<'ll> { - let name = const_cstr!("catchpad"); + let name = cstr!("catchpad"); let ret = unsafe { llvm::LLVMRustBuildCatchPad( self.llbuilder, @@ -1022,7 +1022,7 @@ impl BuilderMethods<'a, 'tcx> for Builder<'a, 'll, 'tcx> { unwind: Option<&'ll BasicBlock>, num_handlers: usize, ) -> &'ll Value { - let name = const_cstr!("catchswitch"); + let name = cstr!("catchswitch"); let ret = unsafe { llvm::LLVMRustBuildCatchSwitch( self.llbuilder, diff --git a/compiler/rustc_codegen_llvm/src/consts.rs b/compiler/rustc_codegen_llvm/src/consts.rs index 16e1a8a124..9904683997 100644 --- a/compiler/rustc_codegen_llvm/src/consts.rs +++ b/compiler/rustc_codegen_llvm/src/consts.rs @@ -5,9 +5,9 @@ use crate::llvm::{self, True}; use crate::type_::Type; use crate::type_of::LayoutLlvmExt; use crate::value::Value; +use cstr::cstr; use libc::c_uint; use rustc_codegen_ssa::traits::*; -use rustc_data_structures::const_cstr; use rustc_hir::def_id::DefId; use rustc_middle::middle::codegen_fn_attrs::{CodegenFnAttrFlags, CodegenFnAttrs}; use rustc_middle::mir::interpret::{ @@ -419,9 +419,9 @@ impl StaticMethods for CodegenCx<'ll, 'tcx> { .all(|&byte| byte == 0); let sect_name = if all_bytes_are_zero { - const_cstr!("__DATA,__thread_bss") + cstr!("__DATA,__thread_bss") } else { - const_cstr!("__DATA,__thread_data") + cstr!("__DATA,__thread_data") }; llvm::LLVMSetSection(g, sect_name.as_ptr()); } diff --git a/compiler/rustc_codegen_llvm/src/context.rs b/compiler/rustc_codegen_llvm/src/context.rs index 6acd26bd41..21473f3b11 100644 --- a/compiler/rustc_codegen_llvm/src/context.rs +++ b/compiler/rustc_codegen_llvm/src/context.rs @@ -1,4 +1,5 @@ use crate::attributes; +use crate::back::write::to_llvm_code_model; use crate::callee::get_fn; use crate::coverageinfo; use crate::debuginfo; @@ -7,10 +8,10 @@ use crate::llvm_util; use crate::type_::Type; use crate::value::Value; +use cstr::cstr; use rustc_codegen_ssa::base::wants_msvc_seh; use rustc_codegen_ssa::traits::*; use rustc_data_structures::base_n; -use rustc_data_structures::const_cstr; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::small_c_str::SmallCStr; use rustc_middle::bug; @@ -104,6 +105,10 @@ fn strip_x86_address_spaces(data_layout: String) -> String { data_layout.replace("-p270:32:32-p271:32:32-p272:64:64-", "-") } +fn strip_powerpc64_vectors(data_layout: String) -> String { + data_layout.replace("-v256:256:256-v512:512:512", "") +} + pub unsafe fn create_module( tcx: TyCtxt<'_>, llcx: &'ll llvm::Context, @@ -119,6 +124,9 @@ pub unsafe fn create_module( { target_data_layout = strip_x86_address_spaces(target_data_layout); } + if llvm_util::get_version() < (12, 0, 0) && sess.target.arch == "powerpc64" { + target_data_layout = strip_powerpc64_vectors(target_data_layout); + } // Ensure the data-layout values hardcoded remain the defaults. if sess.target.is_builtin { @@ -174,6 +182,13 @@ pub unsafe fn create_module( } } + // Linking object files with different code models is undefined behavior + // because the compiler would have to generate additional code (to span + // longer jumps) if a larger code model is used with a smaller one. + // + // See https://reviews.llvm.org/D52322 and https://reviews.llvm.org/D52323. + llvm::LLVMRustSetModuleCodeModel(llmod, to_llvm_code_model(sess.code_model())); + // If skipping the PLT is enabled, we need to add some module metadata // to ensure intrinsic calls don't use it. if !sess.needs_plt() { @@ -380,7 +395,7 @@ impl MiscMethods<'tcx> for CodegenCx<'ll, 'tcx> { "rust_eh_personality" }; let fty = self.type_variadic_func(&[], self.type_i32()); - self.declare_cfn(name, fty) + self.declare_cfn(name, llvm::UnnamedAddr::Global, fty) } }; attributes::apply_target_cpu_attr(self, llfn); @@ -414,8 +429,8 @@ impl MiscMethods<'tcx> for CodegenCx<'ll, 'tcx> { } fn create_used_variable(&self) { - let name = const_cstr!("llvm.used"); - let section = const_cstr!("llvm.metadata"); + let name = cstr!("llvm.used"); + let section = cstr!("llvm.metadata"); let array = self.const_array(&self.type_ptr_to(self.type_i8()), &*self.used_statics.borrow()); @@ -429,7 +444,7 @@ impl MiscMethods<'tcx> for CodegenCx<'ll, 'tcx> { fn declare_c_main(&self, fn_type: Self::Type) -> Option { if self.get_declared_value("main").is_none() { - Some(self.declare_cfn("main", fn_type)) + Some(self.declare_cfn("main", llvm::UnnamedAddr::Global, fn_type)) } else { // If the symbol already exists, it is an error: for example, the user wrote // #[no_mangle] extern "C" fn main(..) {..} @@ -459,8 +474,7 @@ impl CodegenCx<'b, 'tcx> { } else { self.type_variadic_func(&[], ret) }; - let f = self.declare_cfn(name, fn_ty); - llvm::SetUnnamedAddress(f, llvm::UnnamedAddr::No); + let f = self.declare_cfn(name, llvm::UnnamedAddr::No, fn_ty); self.intrinsics.borrow_mut().insert(name, f); f } @@ -498,25 +512,6 @@ impl CodegenCx<'b, 'tcx> { let t_f32 = self.type_f32(); let t_f64 = self.type_f64(); - macro_rules! vector_types { - ($id_out:ident: $elem_ty:ident, $len:expr) => { - let $id_out = self.type_vector($elem_ty, $len); - }; - ($($id_out:ident: $elem_ty:ident, $len:expr;)*) => { - $(vector_types!($id_out: $elem_ty, $len);)* - } - } - vector_types! { - t_v2f32: t_f32, 2; - t_v4f32: t_f32, 4; - t_v8f32: t_f32, 8; - t_v16f32: t_f32, 16; - - t_v2f64: t_f64, 2; - t_v4f64: t_f64, 4; - t_v8f64: t_f64, 8; - } - ifn!("llvm.wasm.trunc.saturate.unsigned.i32.f32", fn(t_f32) -> t_i32); ifn!("llvm.wasm.trunc.saturate.unsigned.i32.f64", fn(t_f64) -> t_i32); ifn!("llvm.wasm.trunc.saturate.unsigned.i64.f32", fn(t_f32) -> t_i64); @@ -540,124 +535,40 @@ impl CodegenCx<'b, 'tcx> { ifn!("llvm.sideeffect", fn() -> void); ifn!("llvm.powi.f32", fn(t_f32, t_i32) -> t_f32); - ifn!("llvm.powi.v2f32", fn(t_v2f32, t_i32) -> t_v2f32); - ifn!("llvm.powi.v4f32", fn(t_v4f32, t_i32) -> t_v4f32); - ifn!("llvm.powi.v8f32", fn(t_v8f32, t_i32) -> t_v8f32); - ifn!("llvm.powi.v16f32", fn(t_v16f32, t_i32) -> t_v16f32); ifn!("llvm.powi.f64", fn(t_f64, t_i32) -> t_f64); - ifn!("llvm.powi.v2f64", fn(t_v2f64, t_i32) -> t_v2f64); - ifn!("llvm.powi.v4f64", fn(t_v4f64, t_i32) -> t_v4f64); - ifn!("llvm.powi.v8f64", fn(t_v8f64, t_i32) -> t_v8f64); ifn!("llvm.pow.f32", fn(t_f32, t_f32) -> t_f32); - ifn!("llvm.pow.v2f32", fn(t_v2f32, t_v2f32) -> t_v2f32); - ifn!("llvm.pow.v4f32", fn(t_v4f32, t_v4f32) -> t_v4f32); - ifn!("llvm.pow.v8f32", fn(t_v8f32, t_v8f32) -> t_v8f32); - ifn!("llvm.pow.v16f32", fn(t_v16f32, t_v16f32) -> t_v16f32); ifn!("llvm.pow.f64", fn(t_f64, t_f64) -> t_f64); - ifn!("llvm.pow.v2f64", fn(t_v2f64, t_v2f64) -> t_v2f64); - ifn!("llvm.pow.v4f64", fn(t_v4f64, t_v4f64) -> t_v4f64); - ifn!("llvm.pow.v8f64", fn(t_v8f64, t_v8f64) -> t_v8f64); ifn!("llvm.sqrt.f32", fn(t_f32) -> t_f32); - ifn!("llvm.sqrt.v2f32", fn(t_v2f32) -> t_v2f32); - ifn!("llvm.sqrt.v4f32", fn(t_v4f32) -> t_v4f32); - ifn!("llvm.sqrt.v8f32", fn(t_v8f32) -> t_v8f32); - ifn!("llvm.sqrt.v16f32", fn(t_v16f32) -> t_v16f32); ifn!("llvm.sqrt.f64", fn(t_f64) -> t_f64); - ifn!("llvm.sqrt.v2f64", fn(t_v2f64) -> t_v2f64); - ifn!("llvm.sqrt.v4f64", fn(t_v4f64) -> t_v4f64); - ifn!("llvm.sqrt.v8f64", fn(t_v8f64) -> t_v8f64); ifn!("llvm.sin.f32", fn(t_f32) -> t_f32); - ifn!("llvm.sin.v2f32", fn(t_v2f32) -> t_v2f32); - ifn!("llvm.sin.v4f32", fn(t_v4f32) -> t_v4f32); - ifn!("llvm.sin.v8f32", fn(t_v8f32) -> t_v8f32); - ifn!("llvm.sin.v16f32", fn(t_v16f32) -> t_v16f32); ifn!("llvm.sin.f64", fn(t_f64) -> t_f64); - ifn!("llvm.sin.v2f64", fn(t_v2f64) -> t_v2f64); - ifn!("llvm.sin.v4f64", fn(t_v4f64) -> t_v4f64); - ifn!("llvm.sin.v8f64", fn(t_v8f64) -> t_v8f64); ifn!("llvm.cos.f32", fn(t_f32) -> t_f32); - ifn!("llvm.cos.v2f32", fn(t_v2f32) -> t_v2f32); - ifn!("llvm.cos.v4f32", fn(t_v4f32) -> t_v4f32); - ifn!("llvm.cos.v8f32", fn(t_v8f32) -> t_v8f32); - ifn!("llvm.cos.v16f32", fn(t_v16f32) -> t_v16f32); ifn!("llvm.cos.f64", fn(t_f64) -> t_f64); - ifn!("llvm.cos.v2f64", fn(t_v2f64) -> t_v2f64); - ifn!("llvm.cos.v4f64", fn(t_v4f64) -> t_v4f64); - ifn!("llvm.cos.v8f64", fn(t_v8f64) -> t_v8f64); ifn!("llvm.exp.f32", fn(t_f32) -> t_f32); - ifn!("llvm.exp.v2f32", fn(t_v2f32) -> t_v2f32); - ifn!("llvm.exp.v4f32", fn(t_v4f32) -> t_v4f32); - ifn!("llvm.exp.v8f32", fn(t_v8f32) -> t_v8f32); - ifn!("llvm.exp.v16f32", fn(t_v16f32) -> t_v16f32); ifn!("llvm.exp.f64", fn(t_f64) -> t_f64); - ifn!("llvm.exp.v2f64", fn(t_v2f64) -> t_v2f64); - ifn!("llvm.exp.v4f64", fn(t_v4f64) -> t_v4f64); - ifn!("llvm.exp.v8f64", fn(t_v8f64) -> t_v8f64); ifn!("llvm.exp2.f32", fn(t_f32) -> t_f32); - ifn!("llvm.exp2.v2f32", fn(t_v2f32) -> t_v2f32); - ifn!("llvm.exp2.v4f32", fn(t_v4f32) -> t_v4f32); - ifn!("llvm.exp2.v8f32", fn(t_v8f32) -> t_v8f32); - ifn!("llvm.exp2.v16f32", fn(t_v16f32) -> t_v16f32); ifn!("llvm.exp2.f64", fn(t_f64) -> t_f64); - ifn!("llvm.exp2.v2f64", fn(t_v2f64) -> t_v2f64); - ifn!("llvm.exp2.v4f64", fn(t_v4f64) -> t_v4f64); - ifn!("llvm.exp2.v8f64", fn(t_v8f64) -> t_v8f64); ifn!("llvm.log.f32", fn(t_f32) -> t_f32); - ifn!("llvm.log.v2f32", fn(t_v2f32) -> t_v2f32); - ifn!("llvm.log.v4f32", fn(t_v4f32) -> t_v4f32); - ifn!("llvm.log.v8f32", fn(t_v8f32) -> t_v8f32); - ifn!("llvm.log.v16f32", fn(t_v16f32) -> t_v16f32); ifn!("llvm.log.f64", fn(t_f64) -> t_f64); - ifn!("llvm.log.v2f64", fn(t_v2f64) -> t_v2f64); - ifn!("llvm.log.v4f64", fn(t_v4f64) -> t_v4f64); - ifn!("llvm.log.v8f64", fn(t_v8f64) -> t_v8f64); ifn!("llvm.log10.f32", fn(t_f32) -> t_f32); - ifn!("llvm.log10.v2f32", fn(t_v2f32) -> t_v2f32); - ifn!("llvm.log10.v4f32", fn(t_v4f32) -> t_v4f32); - ifn!("llvm.log10.v8f32", fn(t_v8f32) -> t_v8f32); - ifn!("llvm.log10.v16f32", fn(t_v16f32) -> t_v16f32); ifn!("llvm.log10.f64", fn(t_f64) -> t_f64); - ifn!("llvm.log10.v2f64", fn(t_v2f64) -> t_v2f64); - ifn!("llvm.log10.v4f64", fn(t_v4f64) -> t_v4f64); - ifn!("llvm.log10.v8f64", fn(t_v8f64) -> t_v8f64); ifn!("llvm.log2.f32", fn(t_f32) -> t_f32); - ifn!("llvm.log2.v2f32", fn(t_v2f32) -> t_v2f32); - ifn!("llvm.log2.v4f32", fn(t_v4f32) -> t_v4f32); - ifn!("llvm.log2.v8f32", fn(t_v8f32) -> t_v8f32); - ifn!("llvm.log2.v16f32", fn(t_v16f32) -> t_v16f32); ifn!("llvm.log2.f64", fn(t_f64) -> t_f64); - ifn!("llvm.log2.v2f64", fn(t_v2f64) -> t_v2f64); - ifn!("llvm.log2.v4f64", fn(t_v4f64) -> t_v4f64); - ifn!("llvm.log2.v8f64", fn(t_v8f64) -> t_v8f64); ifn!("llvm.fma.f32", fn(t_f32, t_f32, t_f32) -> t_f32); - ifn!("llvm.fma.v2f32", fn(t_v2f32, t_v2f32, t_v2f32) -> t_v2f32); - ifn!("llvm.fma.v4f32", fn(t_v4f32, t_v4f32, t_v4f32) -> t_v4f32); - ifn!("llvm.fma.v8f32", fn(t_v8f32, t_v8f32, t_v8f32) -> t_v8f32); - ifn!("llvm.fma.v16f32", fn(t_v16f32, t_v16f32, t_v16f32) -> t_v16f32); ifn!("llvm.fma.f64", fn(t_f64, t_f64, t_f64) -> t_f64); - ifn!("llvm.fma.v2f64", fn(t_v2f64, t_v2f64, t_v2f64) -> t_v2f64); - ifn!("llvm.fma.v4f64", fn(t_v4f64, t_v4f64, t_v4f64) -> t_v4f64); - ifn!("llvm.fma.v8f64", fn(t_v8f64, t_v8f64, t_v8f64) -> t_v8f64); ifn!("llvm.fabs.f32", fn(t_f32) -> t_f32); - ifn!("llvm.fabs.v2f32", fn(t_v2f32) -> t_v2f32); - ifn!("llvm.fabs.v4f32", fn(t_v4f32) -> t_v4f32); - ifn!("llvm.fabs.v8f32", fn(t_v8f32) -> t_v8f32); - ifn!("llvm.fabs.v16f32", fn(t_v16f32) -> t_v16f32); ifn!("llvm.fabs.f64", fn(t_f64) -> t_f64); - ifn!("llvm.fabs.v2f64", fn(t_v2f64) -> t_v2f64); - ifn!("llvm.fabs.v4f64", fn(t_v4f64) -> t_v4f64); - ifn!("llvm.fabs.v8f64", fn(t_v8f64) -> t_v8f64); ifn!("llvm.minnum.f32", fn(t_f32, t_f32) -> t_f32); ifn!("llvm.minnum.f64", fn(t_f64, t_f64) -> t_f64); @@ -665,24 +576,10 @@ impl CodegenCx<'b, 'tcx> { ifn!("llvm.maxnum.f64", fn(t_f64, t_f64) -> t_f64); ifn!("llvm.floor.f32", fn(t_f32) -> t_f32); - ifn!("llvm.floor.v2f32", fn(t_v2f32) -> t_v2f32); - ifn!("llvm.floor.v4f32", fn(t_v4f32) -> t_v4f32); - ifn!("llvm.floor.v8f32", fn(t_v8f32) -> t_v8f32); - ifn!("llvm.floor.v16f32", fn(t_v16f32) -> t_v16f32); ifn!("llvm.floor.f64", fn(t_f64) -> t_f64); - ifn!("llvm.floor.v2f64", fn(t_v2f64) -> t_v2f64); - ifn!("llvm.floor.v4f64", fn(t_v4f64) -> t_v4f64); - ifn!("llvm.floor.v8f64", fn(t_v8f64) -> t_v8f64); ifn!("llvm.ceil.f32", fn(t_f32) -> t_f32); - ifn!("llvm.ceil.v2f32", fn(t_v2f32) -> t_v2f32); - ifn!("llvm.ceil.v4f32", fn(t_v4f32) -> t_v4f32); - ifn!("llvm.ceil.v8f32", fn(t_v8f32) -> t_v8f32); - ifn!("llvm.ceil.v16f32", fn(t_v16f32) -> t_v16f32); ifn!("llvm.ceil.f64", fn(t_f64) -> t_f64); - ifn!("llvm.ceil.v2f64", fn(t_v2f64) -> t_v2f64); - ifn!("llvm.ceil.v4f64", fn(t_v4f64) -> t_v4f64); - ifn!("llvm.ceil.v8f64", fn(t_v8f64) -> t_v8f64); ifn!("llvm.trunc.f32", fn(t_f32) -> t_f32); ifn!("llvm.trunc.f64", fn(t_f64) -> t_f64); diff --git a/compiler/rustc_codegen_llvm/src/coverageinfo/mapgen.rs b/compiler/rustc_codegen_llvm/src/coverageinfo/mapgen.rs index 444a9d4ba0..352638aa88 100644 --- a/compiler/rustc_codegen_llvm/src/coverageinfo/mapgen.rs +++ b/compiler/rustc_codegen_llvm/src/coverageinfo/mapgen.rs @@ -254,7 +254,7 @@ fn save_function_record( /// /// 1. The file name of an "Unreachable" function must match the file name of the existing /// codegenned (covered) function to which the unreachable code regions will be added. -/// 2. The function to which the unreachable code regions will be added must not be a genaric +/// 2. The function to which the unreachable code regions will be added must not be a generic /// function (must not have type parameters) because the coverage tools will get confused /// if the codegenned function has more than one instantiation and additional `CodeRegion`s /// attached to only one of those instantiations. @@ -284,7 +284,7 @@ fn add_unreachable_coverage<'tcx>( let all_def_ids: DefIdSet = tcx.mir_keys(LOCAL_CRATE).iter().map(|local_def_id| local_def_id.to_def_id()).collect(); - let (codegenned_def_ids, _) = tcx.collect_and_partition_mono_items(LOCAL_CRATE); + let codegenned_def_ids = tcx.codegened_and_inlined_items(LOCAL_CRATE); let mut unreachable_def_ids_by_file: FxHashMap> = FxHashMap::default(); for &non_codegenned_def_id in all_def_ids.difference(codegenned_def_ids) { diff --git a/compiler/rustc_codegen_llvm/src/coverageinfo/mod.rs b/compiler/rustc_codegen_llvm/src/coverageinfo/mod.rs index e777f363eb..e47b8fde40 100644 --- a/compiler/rustc_codegen_llvm/src/coverageinfo/mod.rs +++ b/compiler/rustc_codegen_llvm/src/coverageinfo/mod.rs @@ -162,7 +162,7 @@ pub(crate) fn write_filenames_section_to_buffer<'a>( pub(crate) fn write_mapping_to_buffer( virtual_file_mapping: Vec, expressions: Vec, - mut mapping_regions: Vec, + mapping_regions: Vec, buffer: &RustString, ) { unsafe { @@ -171,7 +171,7 @@ pub(crate) fn write_mapping_to_buffer( virtual_file_mapping.len() as c_uint, expressions.as_ptr(), expressions.len() as c_uint, - mapping_regions.as_mut_ptr(), + mapping_regions.as_ptr(), mapping_regions.len() as c_uint, buffer, ); diff --git a/compiler/rustc_codegen_llvm/src/debuginfo/create_scope_map.rs b/compiler/rustc_codegen_llvm/src/debuginfo/create_scope_map.rs index 7673dfb744..c2725b83f5 100644 --- a/compiler/rustc_codegen_llvm/src/debuginfo/create_scope_map.rs +++ b/compiler/rustc_codegen_llvm/src/debuginfo/create_scope_map.rs @@ -1,4 +1,4 @@ -use super::metadata::{file_metadata, UNKNOWN_COLUMN_NUMBER, UNKNOWN_LINE_NUMBER}; +use super::metadata::file_metadata; use super::utils::DIB; use rustc_codegen_ssa::mir::debuginfo::{DebugScope, FunctionDebugContext}; use rustc_codegen_ssa::traits::*; @@ -102,8 +102,8 @@ fn make_mir_scope( DIB(cx), parent_scope.dbg_scope.unwrap(), file_metadata, - loc.line.unwrap_or(UNKNOWN_LINE_NUMBER), - loc.col.unwrap_or(UNKNOWN_COLUMN_NUMBER), + loc.line, + loc.col, ) }, }; diff --git a/compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs b/compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs index 6e7c0b3e34..d5b32e58cc 100644 --- a/compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs +++ b/compiler/rustc_codegen_llvm/src/debuginfo/metadata.rs @@ -18,8 +18,8 @@ use crate::llvm::debuginfo::{ }; use crate::value::Value; +use cstr::cstr; use rustc_codegen_ssa::traits::*; -use rustc_data_structures::const_cstr; use rustc_data_structures::fingerprint::Fingerprint; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; @@ -979,7 +979,7 @@ pub fn compile_unit_metadata( // The OSX linker has an idiosyncrasy where it will ignore some debuginfo // if multiple object files with the same `DW_AT_name` are linked together. // As a workaround we generate unique names for each object file. Those do - // not correspond to an actual source file but that should be harmless. + // not correspond to an actual source file but that is harmless. if tcx.sess.target.is_like_osx { name_in_debuginfo.push("@"); name_in_debuginfo.push(codegen_unit_name); @@ -992,17 +992,17 @@ pub fn compile_unit_metadata( let producer = format!("clang LLVM ({})", rustc_producer); let name_in_debuginfo = name_in_debuginfo.to_string_lossy(); + let work_dir = tcx.sess.working_dir.0.to_string_lossy(); let flags = "\0"; - let out_dir = &tcx.output_filenames(LOCAL_CRATE).out_directory; let split_name = if tcx.sess.target_can_use_split_dwarf() { tcx.output_filenames(LOCAL_CRATE) - .split_dwarf_filename(tcx.sess.split_debuginfo(), Some(codegen_unit_name)) + .split_dwarf_path(tcx.sess.split_debuginfo(), Some(codegen_unit_name)) + .map(|f| out_dir.join(f)) } else { None } .unwrap_or_default(); - let out_dir = out_dir.to_str().unwrap(); let split_name = split_name.to_str().unwrap(); // FIXME(#60020): @@ -1024,12 +1024,12 @@ pub fn compile_unit_metadata( assert!(tcx.sess.opts.debuginfo != DebugInfo::None); unsafe { - let file_metadata = llvm::LLVMRustDIBuilderCreateFile( + let compile_unit_file = llvm::LLVMRustDIBuilderCreateFile( debug_context.builder, name_in_debuginfo.as_ptr().cast(), name_in_debuginfo.len(), - out_dir.as_ptr().cast(), - out_dir.len(), + work_dir.as_ptr().cast(), + work_dir.len(), llvm::ChecksumKind::None, ptr::null(), 0, @@ -1038,12 +1038,15 @@ pub fn compile_unit_metadata( let unit_metadata = llvm::LLVMRustDIBuilderCreateCompileUnit( debug_context.builder, DW_LANG_RUST, - file_metadata, + compile_unit_file, producer.as_ptr().cast(), producer.len(), tcx.sess.opts.optimize != config::OptLevel::No, flags.as_ptr().cast(), 0, + // NB: this doesn't actually have any perceptible effect, it seems. LLVM will instead + // put the path supplied to `MCSplitDwarfFile` into the debug info of the final + // output(s). split_name.as_ptr().cast(), split_name.len(), kind, @@ -1072,7 +1075,7 @@ pub fn compile_unit_metadata( gcov_cu_info.len() as c_uint, ); - let llvm_gcov_ident = const_cstr!("llvm.gcov"); + let llvm_gcov_ident = cstr!("llvm.gcov"); llvm::LLVMAddNamedMetadataOperand( debug_context.llmod, llvm_gcov_ident.as_ptr(), @@ -1090,7 +1093,7 @@ pub fn compile_unit_metadata( ); llvm::LLVMAddNamedMetadataOperand( debug_context.llmod, - const_cstr!("llvm.ident").as_ptr(), + cstr!("llvm.ident").as_ptr(), llvm::LLVMMDNodeInContext(debug_context.llcontext, &name_metadata, 1), ); } @@ -1414,7 +1417,7 @@ fn generator_layout_and_saved_local_names( def_id: DefId, ) -> (&'tcx GeneratorLayout<'tcx>, IndexVec>) { let body = tcx.optimized_mir(def_id); - let generator_layout = body.generator_layout.as_ref().unwrap(); + let generator_layout = body.generator_layout().unwrap(); let mut generator_saved_local_names = IndexVec::from_elem(None, &generator_layout.field_tys); let state_arg = mir::Local::new(1); @@ -1839,10 +1842,7 @@ impl<'tcx> VariantInfo<'_, 'tcx> { .span; if !span.is_dummy() { let loc = cx.lookup_debug_loc(span.lo()); - return Some(SourceInfo { - file: file_metadata(cx, &loc.file), - line: loc.line.unwrap_or(UNKNOWN_LINE_NUMBER), - }); + return Some(SourceInfo { file: file_metadata(cx, &loc.file), line: loc.line }); } } _ => {} @@ -2369,7 +2369,7 @@ fn compute_type_parameters(cx: &CodegenCx<'ll, 'tcx>, ty: Ty<'tcx>) -> &'ll DIAr fn get_parameter_names(cx: &CodegenCx<'_, '_>, generics: &ty::Generics) -> Vec { let mut names = generics .parent - .map_or(vec![], |def_id| get_parameter_names(cx, cx.tcx.generics_of(def_id))); + .map_or_else(Vec::new, |def_id| get_parameter_names(cx, cx.tcx.generics_of(def_id))); names.extend(generics.params.iter().map(|param| param.name)); names } @@ -2481,7 +2481,7 @@ pub fn create_global_var_metadata(cx: &CodegenCx<'ll, '_>, def_id: DefId, global let loc = cx.lookup_debug_loc(span.lo()); (file_metadata(cx, &loc.file), loc.line) } else { - (unknown_file_metadata(cx), None) + (unknown_file_metadata(cx), UNKNOWN_LINE_NUMBER) }; let is_local_to_unit = is_node_local_to_unit(cx, def_id); @@ -2504,7 +2504,7 @@ pub fn create_global_var_metadata(cx: &CodegenCx<'ll, '_>, def_id: DefId, global linkage_name.as_ptr().cast(), linkage_name.len(), file_metadata, - line_number.unwrap_or(UNKNOWN_LINE_NUMBER), + line_number, type_metadata, is_local_to_unit, global, diff --git a/compiler/rustc_codegen_llvm/src/debuginfo/mod.rs b/compiler/rustc_codegen_llvm/src/debuginfo/mod.rs index 955e739b2c..440e4d505f 100644 --- a/compiler/rustc_codegen_llvm/src/debuginfo/mod.rs +++ b/compiler/rustc_codegen_llvm/src/debuginfo/mod.rs @@ -224,9 +224,9 @@ pub struct DebugLoc { /// Information about the original source file. pub file: Lrc, /// The (1-based) line number. - pub line: Option, + pub line: u32, /// The (1-based) column number. - pub col: Option, + pub col: u32, } impl CodegenCx<'ll, '_> { @@ -243,16 +243,16 @@ impl CodegenCx<'ll, '_> { let line = (line + 1) as u32; let col = (pos - line_pos).to_u32() + 1; - (file, Some(line), Some(col)) + (file, line, col) } - Err(file) => (file, None, None), + Err(file) => (file, UNKNOWN_LINE_NUMBER, UNKNOWN_COLUMN_NUMBER), }; // For MSVC, omit the column number. // Otherwise, emit it. This mimics clang behaviour. // See discussion in https://github.com/rust-lang/rust/issues/42921 if self.sess().target.is_like_msvc { - DebugLoc { file, line, col: None } + DebugLoc { file, line, col: UNKNOWN_COLUMN_NUMBER } } else { DebugLoc { file, line, col } } @@ -358,9 +358,9 @@ impl DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> { linkage_name.as_ptr().cast(), linkage_name.len(), file_metadata, - loc.line.unwrap_or(UNKNOWN_LINE_NUMBER), + loc.line, function_type_metadata, - scope_line.unwrap_or(UNKNOWN_LINE_NUMBER), + scope_line, flags, spflags, maybe_definition_llfn, @@ -481,9 +481,9 @@ impl DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> { } fn get_parameter_names(cx: &CodegenCx<'_, '_>, generics: &ty::Generics) -> Vec { - let mut names = generics - .parent - .map_or(vec![], |def_id| get_parameter_names(cx, cx.tcx.generics_of(def_id))); + let mut names = generics.parent.map_or_else(Vec::new, |def_id| { + get_parameter_names(cx, cx.tcx.generics_of(def_id)) + }); names.extend(generics.params.iter().map(|param| param.name)); names } @@ -550,14 +550,7 @@ impl DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> { ) -> &'ll DILocation { let DebugLoc { line, col, .. } = self.lookup_debug_loc(span.lo()); - unsafe { - llvm::LLVMRustDIBuilderCreateDebugLocation( - line.unwrap_or(UNKNOWN_LINE_NUMBER), - col.unwrap_or(UNKNOWN_COLUMN_NUMBER), - scope, - inlined_at, - ) - } + unsafe { llvm::LLVMRustDIBuilderCreateDebugLocation(line, col, scope, inlined_at) } } fn create_vtable_metadata(&self, ty: Ty<'tcx>, vtable: Self::Value) { @@ -606,7 +599,7 @@ impl DebugInfoMethods<'tcx> for CodegenCx<'ll, 'tcx> { name.as_ptr().cast(), name.len(), file_metadata, - loc.line.unwrap_or(UNKNOWN_LINE_NUMBER), + loc.line, type_metadata, true, DIFlags::FlagZero, diff --git a/compiler/rustc_codegen_llvm/src/declare.rs b/compiler/rustc_codegen_llvm/src/declare.rs index 0591e0a5c1..8977fa085b 100644 --- a/compiler/rustc_codegen_llvm/src/declare.rs +++ b/compiler/rustc_codegen_llvm/src/declare.rs @@ -30,6 +30,7 @@ fn declare_raw_fn( cx: &CodegenCx<'ll, '_>, name: &str, callconv: llvm::CallConv, + unnamed: llvm::UnnamedAddr, ty: &'ll Type, ) -> &'ll Value { debug!("declare_raw_fn(name={:?}, ty={:?})", name, ty); @@ -38,9 +39,7 @@ fn declare_raw_fn( }; llvm::SetFunctionCallConv(llfn, callconv); - // Function addresses in Rust are never significant, allowing functions to - // be merged. - llvm::SetUnnamedAddress(llfn, llvm::UnnamedAddr::Global); + llvm::SetUnnamedAddress(llfn, unnamed); if cx.tcx.sess.opts.cg.no_redzone.unwrap_or(cx.tcx.sess.target.disable_redzone) { llvm::Attribute::NoRedZone.apply_llfn(Function, llfn); @@ -68,8 +67,13 @@ impl CodegenCx<'ll, 'tcx> { /// /// If there’s a value with the same name already declared, the function will /// update the declaration and return existing Value instead. - pub fn declare_cfn(&self, name: &str, fn_type: &'ll Type) -> &'ll Value { - declare_raw_fn(self, name, llvm::CCallConv, fn_type) + pub fn declare_cfn( + &self, + name: &str, + unnamed: llvm::UnnamedAddr, + fn_type: &'ll Type, + ) -> &'ll Value { + declare_raw_fn(self, name, llvm::CCallConv, unnamed, fn_type) } /// Declare a Rust function. @@ -79,7 +83,15 @@ impl CodegenCx<'ll, 'tcx> { pub fn declare_fn(&self, name: &str, fn_abi: &FnAbi<'tcx, Ty<'tcx>>) -> &'ll Value { debug!("declare_rust_fn(name={:?}, fn_abi={:?})", name, fn_abi); - let llfn = declare_raw_fn(self, name, fn_abi.llvm_cconv(), fn_abi.llvm_type(self)); + // Function addresses in Rust are never significant, allowing functions to + // be merged. + let llfn = declare_raw_fn( + self, + name, + fn_abi.llvm_cconv(), + llvm::UnnamedAddr::Global, + fn_abi.llvm_type(self), + ); fn_abi.apply_attrs_llfn(self, llfn); llfn } diff --git a/compiler/rustc_codegen_llvm/src/intrinsic.rs b/compiler/rustc_codegen_llvm/src/intrinsic.rs index bf0d499e6c..af366f93b9 100644 --- a/compiler/rustc_codegen_llvm/src/intrinsic.rs +++ b/compiler/rustc_codegen_llvm/src/intrinsic.rs @@ -334,8 +334,11 @@ impl IntrinsicCallMethods<'tcx> for Builder<'a, 'll, 'tcx> { self.call(expect, &[cond, self.const_bool(expected)], None) } - fn sideeffect(&mut self, unconditional: bool) { - if unconditional || self.tcx.sess.opts.debugging_opts.insert_sideeffect { + fn sideeffect(&mut self) { + // This kind of check would make a ton of sense in the caller, but currently the only + // caller of this function is in `rustc_codegen_ssa`, which is agnostic to whether LLVM + // codegen backend being used, and so is unable to check the LLVM version. + if unsafe { llvm::LLVMRustVersionMajor() } < 12 { let fnname = self.get_intrinsic(&("llvm.sideeffect")); self.call(fnname, &[], None); } @@ -390,7 +393,6 @@ fn codegen_msvc_try( ) { let llfn = get_rust_try_fn(bx, &mut |mut bx| { bx.set_personality_fn(bx.eh_personality()); - bx.sideeffect(false); let mut normal = bx.build_sibling_block("normal"); let mut catchswitch = bx.build_sibling_block("catchswitch"); @@ -552,9 +554,6 @@ fn codegen_gnu_try( // (%ptr, _) = landingpad // call %catch_func(%data, %ptr) // ret 1 - - bx.sideeffect(false); - let mut then = bx.build_sibling_block("then"); let mut catch = bx.build_sibling_block("catch"); @@ -614,9 +613,6 @@ fn codegen_emcc_try( // %catch_data[1] = %is_rust_panic // call %catch_func(%data, %catch_data) // ret 1 - - bx.sideeffect(false); - let mut then = bx.build_sibling_block("then"); let mut catch = bx.build_sibling_block("catch"); @@ -1009,7 +1005,7 @@ fn generic_simd_intrinsic( } fn simd_simple_float_intrinsic( - name: &str, + name: Symbol, in_elem: &::rustc_middle::ty::TyS<'_>, in_ty: &::rustc_middle::ty::TyS<'_>, in_len: u64, @@ -1036,93 +1032,69 @@ fn generic_simd_intrinsic( } } } - let ety = match in_elem.kind() { - ty::Float(f) if f.bit_width() == 32 => { - if in_len < 2 || in_len > 16 { - return_error!( - "unsupported floating-point vector `{}` with length `{}` \ - out-of-range [2, 16]", - in_ty, - in_len - ); - } - "f32" - } - ty::Float(f) if f.bit_width() == 64 => { - if in_len < 2 || in_len > 8 { + + let (elem_ty_str, elem_ty) = if let ty::Float(f) = in_elem.kind() { + let elem_ty = bx.cx.type_float_from_ty(*f); + match f.bit_width() { + 32 => ("f32", elem_ty), + 64 => ("f64", elem_ty), + _ => { return_error!( - "unsupported floating-point vector `{}` with length `{}` \ - out-of-range [2, 8]", - in_ty, - in_len + "unsupported element type `{}` of floating-point vector `{}`", + f.name_str(), + in_ty ); } - "f64" - } - ty::Float(f) => { - return_error!( - "unsupported element type `{}` of floating-point vector `{}`", - f.name_str(), - in_ty - ); - } - _ => { - return_error!("`{}` is not a floating-point type", in_ty); } + } else { + return_error!("`{}` is not a floating-point type", in_ty); }; - let llvm_name = &format!("llvm.{0}.v{1}{2}", name, in_len, ety); - let intrinsic = bx.get_intrinsic(&llvm_name); - let c = - bx.call(intrinsic, &args.iter().map(|arg| arg.immediate()).collect::>(), None); + let vec_ty = bx.type_vector(elem_ty, in_len); + + let (intr_name, fn_ty) = match name { + sym::simd_fsqrt => ("sqrt", bx.type_func(&[vec_ty], vec_ty)), + sym::simd_fsin => ("sin", bx.type_func(&[vec_ty], vec_ty)), + sym::simd_fcos => ("cos", bx.type_func(&[vec_ty], vec_ty)), + sym::simd_fabs => ("fabs", bx.type_func(&[vec_ty], vec_ty)), + sym::simd_floor => ("floor", bx.type_func(&[vec_ty], vec_ty)), + sym::simd_ceil => ("ceil", bx.type_func(&[vec_ty], vec_ty)), + sym::simd_fexp => ("exp", bx.type_func(&[vec_ty], vec_ty)), + sym::simd_fexp2 => ("exp2", bx.type_func(&[vec_ty], vec_ty)), + sym::simd_flog10 => ("log10", bx.type_func(&[vec_ty], vec_ty)), + sym::simd_flog2 => ("log2", bx.type_func(&[vec_ty], vec_ty)), + sym::simd_flog => ("log", bx.type_func(&[vec_ty], vec_ty)), + sym::simd_fpowi => ("powi", bx.type_func(&[vec_ty, bx.type_i32()], vec_ty)), + sym::simd_fpow => ("pow", bx.type_func(&[vec_ty, vec_ty], vec_ty)), + sym::simd_fma => ("fma", bx.type_func(&[vec_ty, vec_ty, vec_ty], vec_ty)), + _ => return_error!("unrecognized intrinsic `{}`", name), + }; + + let llvm_name = &format!("llvm.{0}.v{1}{2}", intr_name, in_len, elem_ty_str); + let f = bx.declare_cfn(&llvm_name, llvm::UnnamedAddr::No, fn_ty); + let c = bx.call(f, &args.iter().map(|arg| arg.immediate()).collect::>(), None); unsafe { llvm::LLVMRustSetHasUnsafeAlgebra(c) }; Ok(c) } - match name { - sym::simd_fsqrt => { - return simd_simple_float_intrinsic("sqrt", in_elem, in_ty, in_len, bx, span, args); - } - sym::simd_fsin => { - return simd_simple_float_intrinsic("sin", in_elem, in_ty, in_len, bx, span, args); - } - sym::simd_fcos => { - return simd_simple_float_intrinsic("cos", in_elem, in_ty, in_len, bx, span, args); - } - sym::simd_fabs => { - return simd_simple_float_intrinsic("fabs", in_elem, in_ty, in_len, bx, span, args); - } - sym::simd_floor => { - return simd_simple_float_intrinsic("floor", in_elem, in_ty, in_len, bx, span, args); - } - sym::simd_ceil => { - return simd_simple_float_intrinsic("ceil", in_elem, in_ty, in_len, bx, span, args); - } - sym::simd_fexp => { - return simd_simple_float_intrinsic("exp", in_elem, in_ty, in_len, bx, span, args); - } - sym::simd_fexp2 => { - return simd_simple_float_intrinsic("exp2", in_elem, in_ty, in_len, bx, span, args); - } - sym::simd_flog10 => { - return simd_simple_float_intrinsic("log10", in_elem, in_ty, in_len, bx, span, args); - } - sym::simd_flog2 => { - return simd_simple_float_intrinsic("log2", in_elem, in_ty, in_len, bx, span, args); - } - sym::simd_flog => { - return simd_simple_float_intrinsic("log", in_elem, in_ty, in_len, bx, span, args); - } - sym::simd_fpowi => { - return simd_simple_float_intrinsic("powi", in_elem, in_ty, in_len, bx, span, args); - } - sym::simd_fpow => { - return simd_simple_float_intrinsic("pow", in_elem, in_ty, in_len, bx, span, args); - } - sym::simd_fma => { - return simd_simple_float_intrinsic("fma", in_elem, in_ty, in_len, bx, span, args); - } - _ => { /* fallthrough */ } + if std::matches!( + name, + sym::simd_fsqrt + | sym::simd_fsin + | sym::simd_fcos + | sym::simd_fabs + | sym::simd_floor + | sym::simd_ceil + | sym::simd_fexp + | sym::simd_fexp2 + | sym::simd_flog10 + | sym::simd_flog2 + | sym::simd_flog + | sym::simd_fpowi + | sym::simd_fpow + | sym::simd_fma + ) { + return simd_simple_float_intrinsic(name, in_elem, in_ty, in_len, bx, span, args); } // FIXME: use: @@ -1278,12 +1250,12 @@ fn generic_simd_intrinsic( format!("llvm.masked.gather.{}.{}", llvm_elem_vec_str, llvm_pointer_vec_str); let f = bx.declare_cfn( &llvm_intrinsic, + llvm::UnnamedAddr::No, bx.type_func( &[llvm_pointer_vec_ty, alignment_ty, mask_ty, llvm_elem_vec_ty], llvm_elem_vec_ty, ), ); - llvm::SetUnnamedAddress(f, llvm::UnnamedAddr::No); let v = bx.call(f, &[args[1].immediate(), alignment, mask, args[0].immediate()], None); return Ok(v); } @@ -1408,9 +1380,9 @@ fn generic_simd_intrinsic( format!("llvm.masked.scatter.{}.{}", llvm_elem_vec_str, llvm_pointer_vec_str); let f = bx.declare_cfn( &llvm_intrinsic, + llvm::UnnamedAddr::No, bx.type_func(&[llvm_elem_vec_ty, llvm_pointer_vec_ty, alignment_ty, mask_ty], ret_t), ); - llvm::SetUnnamedAddress(f, llvm::UnnamedAddr::No); let v = bx.call(f, &[args[0].immediate(), args[1].immediate(), alignment, mask], None); return Ok(v); } @@ -1656,7 +1628,7 @@ unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#, out_elem ); } - macro_rules! arith { + macro_rules! arith_binary { ($($name: ident: $($($p: ident),* => $call: ident),*;)*) => { $(if name == sym::$name { match in_elem.kind() { @@ -1672,7 +1644,7 @@ unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#, })* } } - arith! { + arith_binary! { simd_add: Uint, Int => add, Float => fadd; simd_sub: Uint, Int => sub, Float => fsub; simd_mul: Uint, Int => mul, Float => fmul; @@ -1687,6 +1659,25 @@ unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#, simd_fmin: Float => minnum; } + macro_rules! arith_unary { + ($($name: ident: $($($p: ident),* => $call: ident),*;)*) => { + $(if name == sym::$name { + match in_elem.kind() { + $($(ty::$p(_))|* => { + return Ok(bx.$call(args[0].immediate())) + })* + _ => {}, + } + require!(false, + "unsupported operation on `{}` with element `{}`", + in_ty, + in_elem) + })* + } + } + arith_unary! { + simd_neg: Int => neg, Float => fneg; + } if name == sym::simd_saturating_add || name == sym::simd_saturating_sub { let lhs = args[0].immediate(); @@ -1714,8 +1705,11 @@ unsupported {} from `{}` with element `{}` of size `{}` to `{}`"#, ); let vec_ty = bx.cx.type_vector(elem_ty, in_len as u64); - let f = bx.declare_cfn(&llvm_intrinsic, bx.type_func(&[vec_ty, vec_ty], vec_ty)); - llvm::SetUnnamedAddress(f, llvm::UnnamedAddr::No); + let f = bx.declare_cfn( + &llvm_intrinsic, + llvm::UnnamedAddr::No, + bx.type_func(&[vec_ty, vec_ty], vec_ty), + ); let v = bx.call(f, &[lhs, rhs], None); return Ok(v); } diff --git a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs index e82198f8f0..82cd1be3b3 100644 --- a/compiler/rustc_codegen_llvm/src/llvm/ffi.rs +++ b/compiler/rustc_codegen_llvm/src/llvm/ffi.rs @@ -131,6 +131,8 @@ pub enum Attribute { ReturnsTwice = 25, ReadNone = 26, InaccessibleMemOnly = 27, + SanitizeHWAddress = 28, + WillReturn = 29, } /// LLVMIntPredicate @@ -238,6 +240,7 @@ pub enum TypeKind { Token = 16, ScalableVector = 17, BFloat = 18, + X86_AMX = 19, } impl TypeKind { @@ -262,6 +265,7 @@ impl TypeKind { TypeKind::Token => rustc_codegen_ssa::common::TypeKind::Token, TypeKind::ScalableVector => rustc_codegen_ssa::common::TypeKind::ScalableVector, TypeKind::BFloat => rustc_codegen_ssa::common::TypeKind::BFloat, + TypeKind::X86_AMX => rustc_codegen_ssa::common::TypeKind::X86_AMX, } } } @@ -439,6 +443,8 @@ pub struct SanitizerOptions { pub sanitize_memory_recover: bool, pub sanitize_memory_track_origins: c_int, pub sanitize_thread: bool, + pub sanitize_hwaddress: bool, + pub sanitize_hwaddress_recover: bool, } /// LLVMRelocMode @@ -671,9 +677,7 @@ pub mod coverageinfo { /// array", encoded separately), and source location (start and end positions of the represented /// code region). /// - /// Aligns with [llvm::coverage::CounterMappingRegion](https://github.com/rust-lang/llvm-project/blob/rustc/11.0-2020-10-12/llvm/include/llvm/ProfileData/Coverage/CoverageMapping.h#L224-L227) - /// Important: The Rust struct layout (order and types of fields) must match its C++ - /// counterpart. + /// Matches LLVMRustCounterMappingRegion. #[derive(Copy, Clone, Debug)] #[repr(C)] pub struct CounterMappingRegion { @@ -1070,6 +1074,7 @@ extern "C" { pub fn LLVMRustAddDereferenceableAttr(Fn: &Value, index: c_uint, bytes: u64); pub fn LLVMRustAddDereferenceableOrNullAttr(Fn: &Value, index: c_uint, bytes: u64); pub fn LLVMRustAddByValAttr(Fn: &Value, index: c_uint, ty: &Type); + pub fn LLVMRustAddStructRetAttr(Fn: &Value, index: c_uint, ty: &Type); pub fn LLVMRustAddFunctionAttribute(Fn: &Value, index: c_uint, attr: Attribute); pub fn LLVMRustAddFunctionAttrStringValue( Fn: &Value, @@ -1105,6 +1110,7 @@ extern "C" { pub fn LLVMRustAddDereferenceableCallSiteAttr(Instr: &Value, index: c_uint, bytes: u64); pub fn LLVMRustAddDereferenceableOrNullCallSiteAttr(Instr: &Value, index: c_uint, bytes: u64); pub fn LLVMRustAddByValCallSiteAttr(Instr: &Value, index: c_uint, ty: &Type); + pub fn LLVMRustAddStructRetCallSiteAttr(Instr: &Value, index: c_uint, ty: &Type); // Operations on load/store instructions (only) pub fn LLVMSetVolatile(MemoryAccessInst: &Value, volatile: Bool); @@ -1789,7 +1795,7 @@ extern "C" { NumVirtualFileMappingIDs: c_uint, Expressions: *const coverage_map::CounterExpression, NumExpressions: c_uint, - MappingRegions: *mut coverageinfo::CounterMappingRegion, + MappingRegions: *const coverageinfo::CounterMappingRegion, NumMappingRegions: c_uint, BufferOut: &RustString, ); @@ -2128,6 +2134,7 @@ extern "C" { Recover: bool, ) -> &'static mut Pass; pub fn LLVMRustCreateThreadSanitizerPass() -> &'static mut Pass; + pub fn LLVMRustCreateHWAddressSanitizerPass(Recover: bool) -> &'static mut Pass; pub fn LLVMRustAddPass(PM: &PassManager<'_>, Pass: &'static mut Pass); pub fn LLVMRustAddLastExtensionPasses( PMB: &PassManagerBuilder, @@ -2319,6 +2326,7 @@ extern "C" { pub fn LLVMRustUnsetComdat(V: &Value); pub fn LLVMRustSetModulePICLevel(M: &Module); pub fn LLVMRustSetModulePIELevel(M: &Module); + pub fn LLVMRustSetModuleCodeModel(M: &Module, Model: CodeModel); pub fn LLVMRustModuleBufferCreate(M: &Module) -> &'static mut ModuleBuffer; pub fn LLVMRustModuleBufferPtr(p: &ModuleBuffer) -> *const u8; pub fn LLVMRustModuleBufferLen(p: &ModuleBuffer) -> usize; diff --git a/compiler/rustc_codegen_llvm/src/llvm_util.rs b/compiler/rustc_codegen_llvm/src/llvm_util.rs index 544ef38c12..c7dff41955 100644 --- a/compiler/rustc_codegen_llvm/src/llvm_util.rs +++ b/compiler/rustc_codegen_llvm/src/llvm_util.rs @@ -218,13 +218,39 @@ pub fn target_cpu(sess: &Session) -> &str { handle_native(name) } -pub fn handle_native_features(sess: &Session) -> Vec { +/// The list of LLVM features computed from CLI flags (`-Ctarget-cpu`, `-Ctarget-feature`, +/// `--target` and similar). +// FIXME(nagisa): Cache the output of this somehow? Maybe make this a query? We're calling this +// for every function that has `#[target_feature]` on it. The global features won't change between +// the functions; only crates, maybe… +pub fn llvm_global_features(sess: &Session) -> Vec { + // FIXME(nagisa): this should definitely be available more centrally and to other codegen backends. + /// These features control behaviour of rustc rather than llvm. + const RUSTC_SPECIFIC_FEATURES: &[&str] = &["crt-static"]; + + // Features that come earlier are overriden by conflicting features later in the string. + // Typically we'll want more explicit settings to override the implicit ones, so: + // + // * Features from -Ctarget-cpu=*; are overriden by [^1] + // * Features implied by --target; are overriden by + // * Features from -Ctarget-feature; are overriden by + // * function specific features. + // + // [^1]: target-cpu=native is handled here, other target-cpu values are handled implicitly + // through LLVM TargetMachine implementation. + // + // FIXME(nagisa): it isn't clear what's the best interaction between features implied by + // `-Ctarget-cpu` and `--target` are. On one hand, you'd expect CLI arguments to always + // override anything that's implicit, so e.g. when there's no `--target` flag, features implied + // the host target are overriden by `-Ctarget-cpu=*`. On the other hand, what about when both + // `--target` and `-Ctarget-cpu=*` are specified? Both then imply some target features and both + // flags are specified by the user on the CLI. It isn't as clear-cut which order of precedence + // should be taken in cases like these. + let mut features = vec![]; + + // -Ctarget-cpu=native match sess.opts.cg.target_cpu { - Some(ref s) => { - if s != "native" { - return vec![]; - } - + Some(ref s) if s == "native" => { let features_string = unsafe { let ptr = llvm::LLVMGetHostCPUFeatures(); let features_string = if !ptr.is_null() { @@ -242,11 +268,31 @@ pub fn handle_native_features(sess: &Session) -> Vec { features_string }; - - features_string.split(",").map(|s| s.to_owned()).collect() + features.extend(features_string.split(",").map(String::from)); } - None => vec![], - } + Some(_) | None => {} + }; + + // Features implied by an implicit or explicit `--target`. + features.extend( + sess.target + .features + .split(',') + .filter(|f| !f.is_empty() && !RUSTC_SPECIFIC_FEATURES.iter().any(|s| f.contains(s))) + .map(String::from), + ); + + // -Ctarget-features + features.extend( + sess.opts + .cg + .target_feature + .split(',') + .filter(|f| !f.is_empty() && !RUSTC_SPECIFIC_FEATURES.iter().any(|s| f.contains(s))) + .map(String::from), + ); + + features } pub fn tune_cpu(sess: &Session) -> Option<&str> { diff --git a/compiler/rustc_codegen_llvm/src/metadata.rs b/compiler/rustc_codegen_llvm/src/metadata.rs index 3912d6a3a4..b007df5730 100644 --- a/compiler/rustc_codegen_llvm/src/metadata.rs +++ b/compiler/rustc_codegen_llvm/src/metadata.rs @@ -65,8 +65,8 @@ fn search_meta_section<'a>( while llvm::LLVMIsSectionIteratorAtEnd(of.llof, si.llsi) == False { let mut name_buf = None; let name_len = llvm::LLVMRustGetSectionName(si.llsi, &mut name_buf); - let name = name_buf.map_or( - String::new(), // We got a NULL ptr, ignore `name_len`. + let name = name_buf.map_or_else( + String::new, // We got a NULL ptr, ignore `name_len`. |buf| { String::from_utf8( slice::from_raw_parts(buf.as_ptr() as *const u8, name_len as usize) diff --git a/compiler/rustc_codegen_ssa/Cargo.toml b/compiler/rustc_codegen_ssa/Cargo.toml index 835f906239..15dbbbd49a 100644 --- a/compiler/rustc_codegen_ssa/Cargo.toml +++ b/compiler/rustc_codegen_ssa/Cargo.toml @@ -11,8 +11,7 @@ test = false bitflags = "1.2.1" cc = "1.0.1" itertools = "0.9" -num_cpus = "1.0" -memmap = "0.7" +memmap2 = "0.2.1" tracing = "0.1" libc = "0.2.50" jobserver = "0.1.11" diff --git a/compiler/rustc_codegen_ssa/src/back/link.rs b/compiler/rustc_codegen_ssa/src/back/link.rs index 8bc4e64422..b11821b7db 100644 --- a/compiler/rustc_codegen_ssa/src/back/link.rs +++ b/compiler/rustc_codegen_ssa/src/back/link.rs @@ -1,5 +1,6 @@ use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::temp_dir::MaybeTempDir; +use rustc_errors::Handler; use rustc_fs_util::fix_windows_verbatim_for_gcc; use rustc_hir::def_id::CrateNum; use rustc_middle::middle::cstore::{EncodedMetadata, LibSource}; @@ -34,9 +35,11 @@ use std::path::{Path, PathBuf}; use std::process::{ExitStatus, Output, Stdio}; use std::{ascii, char, env, fmt, fs, io, mem, str}; -pub fn remove(sess: &Session, path: &Path) { +pub fn ensure_removed(diag_handler: &Handler, path: &Path) { if let Err(e) = fs::remove_file(path) { - sess.err(&format!("failed to remove {}: {}", path.display(), e)); + if e.kind() != io::ErrorKind::NotFound { + diag_handler.err(&format!("failed to remove {}: {}", path.display(), e)); + } } } @@ -112,11 +115,11 @@ pub fn link_binary<'a, B: ArchiveBuilder<'a>>( if !sess.opts.cg.save_temps { let remove_temps_from_module = |module: &CompiledModule| { if let Some(ref obj) = module.object { - remove(sess, obj); + ensure_removed(sess.diagnostic(), obj); } if let Some(ref obj) = module.dwarf_object { - remove(sess, obj); + ensure_removed(sess.diagnostic(), obj); } }; @@ -178,16 +181,16 @@ fn get_linker( let original_path = tool.path(); if let Some(ref root_lib_path) = original_path.ancestors().nth(4) { let arch = match t.arch.as_str() { - "x86_64" => Some("x64".to_string()), - "x86" => Some("x86".to_string()), - "aarch64" => Some("arm64".to_string()), - "arm" => Some("arm".to_string()), + "x86_64" => Some("x64"), + "x86" => Some("x86"), + "aarch64" => Some("arm64"), + "arm" => Some("arm"), _ => None, }; if let Some(ref a) = arch { // FIXME: Move this to `fn linker_with_args`. let mut arg = OsString::from("/LIBPATH:"); - arg.push(format!("{}\\lib\\{}\\store", root_lib_path.display(), a.to_string())); + arg.push(format!("{}\\lib\\{}\\store", root_lib_path.display(), a)); cmd.arg(&arg); } else { warn!("arch is not supported"); @@ -708,7 +711,7 @@ fn link_natively<'a, B: ArchiveBuilder<'a>>( status.signal() == Some(libc::SIGILL) } - #[cfg(windows)] + #[cfg(not(unix))] fn is_illegal_instruction(_status: &ExitStatus) -> bool { false } @@ -893,6 +896,9 @@ fn link_sanitizers(sess: &Session, crate_type: CrateType, linker: &mut dyn Linke if sanitizer.contains(SanitizerSet::THREAD) { link_sanitizer_runtime(sess, linker, "tsan"); } + if sanitizer.contains(SanitizerSet::HWADDRESS) { + link_sanitizer_runtime(sess, linker, "hwasan"); + } } fn link_sanitizer_runtime(sess: &Session, linker: &mut dyn Linker, name: &str) { @@ -1192,7 +1198,7 @@ fn exec_linker( flush_linked_file(&output, out_filename)?; return output; - #[cfg(unix)] + #[cfg(not(windows))] fn flush_linked_file(_: &io::Result, _: &Path) -> io::Result<()> { Ok(()) } @@ -1232,6 +1238,11 @@ fn exec_linker( err.raw_os_error() == Some(ERROR_FILENAME_EXCED_RANGE) } + #[cfg(not(any(unix, windows)))] + fn command_line_too_big(_: &io::Error) -> bool { + false + } + struct Escape<'a> { arg: &'a str, is_like_msvc: bool, @@ -2076,7 +2087,7 @@ fn add_upstream_rust_crates<'a, B: ArchiveBuilder<'a>>( let filestem = cratepath.file_stem().unwrap().to_str().unwrap(); cmd.link_rust_dylib( Symbol::intern(&unlib(&sess.target, filestem)), - parent.unwrap_or(Path::new("")), + parent.unwrap_or_else(|| Path::new("")), ); } } @@ -2187,6 +2198,7 @@ fn add_apple_sdk(cmd: &mut dyn Linker, sess: &Session, flavor: LinkerFlavor) { ("x86_64", "tvos") => "appletvsimulator", ("arm", "ios") => "iphoneos", ("aarch64", "ios") if llvm_target.contains("macabi") => "macosx", + ("aarch64", "ios") if llvm_target.contains("sim") => "iphonesimulator", ("aarch64", "ios") => "iphoneos", ("x86", "ios") => "iphonesimulator", ("x86_64", "ios") if llvm_target.contains("macabi") => "macosx", diff --git a/compiler/rustc_codegen_ssa/src/back/lto.rs b/compiler/rustc_codegen_ssa/src/back/lto.rs index 0d7f444769..c6aea22a63 100644 --- a/compiler/rustc_codegen_ssa/src/back/lto.rs +++ b/compiler/rustc_codegen_ssa/src/back/lto.rs @@ -93,7 +93,7 @@ impl LtoModuleCodegen { pub enum SerializedModule { Local(M), FromRlib(Vec), - FromUncompressedFile(memmap::Mmap), + FromUncompressedFile(memmap2::Mmap), } impl SerializedModule { diff --git a/compiler/rustc_codegen_ssa/src/back/rpath.rs b/compiler/rustc_codegen_ssa/src/back/rpath.rs index 005d2efdd3..5f21046b05 100644 --- a/compiler/rustc_codegen_ssa/src/back/rpath.rs +++ b/compiler/rustc_codegen_ssa/src/back/rpath.rs @@ -24,7 +24,7 @@ pub fn get_rpath_flags(config: &mut RPathConfig<'_>) -> Vec { debug!("preparing the RPATH!"); - let libs = config.used_crates.clone(); + let libs = config.used_crates; let libs = libs.iter().filter_map(|&(_, ref l)| l.option()).collect::>(); let rpaths = get_rpaths(config, &libs); let mut flags = rpaths_to_flags(&rpaths); diff --git a/compiler/rustc_codegen_ssa/src/back/write.rs b/compiler/rustc_codegen_ssa/src/back/write.rs index 6aef5cb535..490b3d3311 100644 --- a/compiler/rustc_codegen_ssa/src/back/write.rs +++ b/compiler/rustc_codegen_ssa/src/back/write.rs @@ -1,4 +1,4 @@ -use super::link::{self, remove}; +use super::link::{self, ensure_removed}; use super::linker::LinkerInfo; use super::lto::{self, SerializedModule}; use super::symbol_export::symbol_name_for_instance_in_crate; @@ -288,7 +288,7 @@ impl TargetMachineFactoryConfig { module_name: &str, ) -> TargetMachineFactoryConfig { let split_dwarf_file = if cgcx.target_can_use_split_dwarf { - cgcx.output_filenames.split_dwarf_filename(cgcx.split_debuginfo, Some(module_name)) + cgcx.output_filenames.split_dwarf_path(cgcx.split_debuginfo, Some(module_name)) } else { None }; @@ -433,12 +433,10 @@ pub fn start_async_codegen( let sess = tcx.sess; let crate_name = tcx.crate_name(LOCAL_CRATE); - let no_builtins = tcx.sess.contains_name(&tcx.hir().krate().item.attrs, sym::no_builtins); - let is_compiler_builtins = - tcx.sess.contains_name(&tcx.hir().krate().item.attrs, sym::compiler_builtins); - let subsystem = tcx - .sess - .first_attr_value_str_by_name(&tcx.hir().krate().item.attrs, sym::windows_subsystem); + let crate_attrs = tcx.hir().attrs(rustc_hir::CRATE_HIR_ID); + let no_builtins = tcx.sess.contains_name(crate_attrs, sym::no_builtins); + let is_compiler_builtins = tcx.sess.contains_name(crate_attrs, sym::compiler_builtins); + let subsystem = tcx.sess.first_attr_value_str_by_name(crate_attrs, sym::windows_subsystem); let windows_subsystem = subsystem.map(|subsystem| { if subsystem != sym::windows && subsystem != sym::console { tcx.sess.fatal(&format!( @@ -543,7 +541,7 @@ fn produce_final_output_artifacts( copy_gracefully(&path, &crate_output.path(output_type)); if !sess.opts.cg.save_temps && !keep_numbered { // The user just wants `foo.x`, not `foo.#module-name#.x`. - remove(sess, &path); + ensure_removed(sess.diagnostic(), &path); } } else { let ext = crate_output @@ -642,19 +640,19 @@ fn produce_final_output_artifacts( for module in compiled_modules.modules.iter() { if let Some(ref path) = module.object { if !keep_numbered_objects { - remove(sess, path); + ensure_removed(sess.diagnostic(), path); } } if let Some(ref path) = module.dwarf_object { if !keep_numbered_objects { - remove(sess, path); + ensure_removed(sess.diagnostic(), path); } } if let Some(ref path) = module.bytecode { if !keep_numbered_bitcode { - remove(sess, path); + ensure_removed(sess.diagnostic(), path); } } } @@ -662,13 +660,13 @@ fn produce_final_output_artifacts( if !user_wants_bitcode { if let Some(ref metadata_module) = compiled_modules.metadata_module { if let Some(ref path) = metadata_module.bytecode { - remove(sess, &path); + ensure_removed(sess.diagnostic(), &path); } } if let Some(ref allocator_module) = compiled_modules.allocator_module { if let Some(ref path) = allocator_module.bytecode { - remove(sess, path); + ensure_removed(sess.diagnostic(), path); } } } @@ -712,6 +710,33 @@ impl WorkItem { } } } + + /// Generate a short description of this work item suitable for use as a thread name. + fn short_description(&self) -> String { + // `pthread_setname()` on *nix is limited to 15 characters and longer names are ignored. + // Use very short descriptions in this case to maximize the space available for the module name. + // Windows does not have that limitation so use slightly more descriptive names there. + match self { + WorkItem::Optimize(m) => { + #[cfg(windows)] + return format!("optimize module {}", m.name); + #[cfg(not(windows))] + return format!("opt {}", m.name); + } + WorkItem::CopyPostLtoArtifacts(m) => { + #[cfg(windows)] + return format!("copy LTO artifacts for {}", m.name); + #[cfg(not(windows))] + return format!("copy {}", m.name); + } + WorkItem::LTO(m) => { + #[cfg(windows)] + return format!("LTO module {}", m.name()); + #[cfg(not(windows))] + return format!("LTO {}", m.name()); + } + } + } } enum WorkItemResult { @@ -735,7 +760,7 @@ fn execute_work_item( match work_item { WorkItem::Optimize(module) => execute_optimize_work_item(cgcx, module, module_config), WorkItem::CopyPostLtoArtifacts(module) => { - execute_copy_from_cache_work_item(cgcx, module, module_config) + Ok(execute_copy_from_cache_work_item(cgcx, module, module_config)) } WorkItem::LTO(module) => execute_lto_work_item(cgcx, module, module_config), } @@ -844,7 +869,7 @@ fn execute_copy_from_cache_work_item( cgcx: &CodegenContext, module: CachedModuleCodegen, module_config: &ModuleConfig, -) -> Result, FatalError> { +) -> WorkItemResult { let incr_comp_session_dir = cgcx.incr_comp_session_dir.as_ref().unwrap(); let mut object = None; if let Some(saved_file) = module.source.saved_file { @@ -870,13 +895,13 @@ fn execute_copy_from_cache_work_item( assert_eq!(object.is_some(), module_config.emit_obj != EmitObj::None); - Ok(WorkItemResult::Compiled(CompiledModule { + WorkItemResult::Compiled(CompiledModule { name: module.name, kind: ModuleKind::Regular, object, dwarf_object: None, bytecode: None, - })) + }) } fn execute_lto_work_item( @@ -1193,7 +1218,6 @@ fn start_executing_work( // necessary. There's already optimizations in place to avoid sending work // back to the coordinator if LTO isn't requested. return thread::spawn(move || { - let max_workers = num_cpus::get(); let mut worker_id_counter = 0; let mut free_worker_ids = Vec::new(); let mut get_worker_id = |free_worker_ids: &mut Vec| { @@ -1253,7 +1277,17 @@ fn start_executing_work( // For codegenning more CGU or for running them through LLVM. if !codegen_done { if main_thread_worker_state == MainThreadWorkerState::Idle { - if !queue_full_enough(work_items.len(), running, max_workers) { + // Compute the number of workers that will be running once we've taken as many + // items from the work queue as we can, plus one for the main thread. It's not + // critically important that we use this instead of just `running`, but it + // prevents the `queue_full_enough` heuristic from fluctuating just because a + // worker finished up and we decreased the `running` count, even though we're + // just going to increase it right after this when we put a new worker to work. + let extra_tokens = tokens.len().checked_sub(running).unwrap(); + let additional_running = std::cmp::min(extra_tokens, work_items.len()); + let anticipated_running = running + additional_running + 1; + + if !queue_full_enough(work_items.len(), anticipated_running) { // The queue is not full enough, codegen more items: if codegen_worker_send.send(Message::CodegenItem).is_err() { panic!("Could not send Message::CodegenItem to main thread") @@ -1529,13 +1563,59 @@ fn start_executing_work( // A heuristic that determines if we have enough LLVM WorkItems in the // queue so that the main thread can do LLVM work instead of codegen - fn queue_full_enough( - items_in_queue: usize, - workers_running: usize, - max_workers: usize, - ) -> bool { - // Tune me, plz. - items_in_queue > 0 && items_in_queue >= max_workers.saturating_sub(workers_running / 2) + fn queue_full_enough(items_in_queue: usize, workers_running: usize) -> bool { + // This heuristic scales ahead-of-time codegen according to available + // concurrency, as measured by `workers_running`. The idea is that the + // more concurrency we have available, the more demand there will be for + // work items, and the fuller the queue should be kept to meet demand. + // An important property of this approach is that we codegen ahead of + // time only as much as necessary, so as to keep fewer LLVM modules in + // memory at once, thereby reducing memory consumption. + // + // When the number of workers running is less than the max concurrency + // available to us, this heuristic can cause us to instruct the main + // thread to work on an LLVM item (that is, tell it to "LLVM") instead + // of codegen, even though it seems like it *should* be codegenning so + // that we can create more work items and spawn more LLVM workers. + // + // But this is not a problem. When the main thread is told to LLVM, + // according to this heuristic and how work is scheduled, there is + // always at least one item in the queue, and therefore at least one + // pending jobserver token request. If there *is* more concurrency + // available, we will immediately receive a token, which will upgrade + // the main thread's LLVM worker to a real one (conceptually), and free + // up the main thread to codegen if necessary. On the other hand, if + // there isn't more concurrency, then the main thread working on an LLVM + // item is appropriate, as long as the queue is full enough for demand. + // + // Speaking of which, how full should we keep the queue? Probably less + // full than you'd think. A lot has to go wrong for the queue not to be + // full enough and for that to have a negative effect on compile times. + // + // Workers are unlikely to finish at exactly the same time, so when one + // finishes and takes another work item off the queue, we often have + // ample time to codegen at that point before the next worker finishes. + // But suppose that codegen takes so long that the workers exhaust the + // queue, and we have one or more workers that have nothing to work on. + // Well, it might not be so bad. Of all the LLVM modules we create and + // optimize, one has to finish last. It's not necessarily the case that + // by losing some concurrency for a moment, we delay the point at which + // that last LLVM module is finished and the rest of compilation can + // proceed. Also, when we can't take advantage of some concurrency, we + // give tokens back to the job server. That enables some other rustc to + // potentially make use of the available concurrency. That could even + // *decrease* overall compile time if we're lucky. But yes, if no other + // rustc can make use of the concurrency, then we've squandered it. + // + // However, keeping the queue full is also beneficial when we have a + // surge in available concurrency. Then items can be taken from the + // queue immediately, without having to wait for codegen. + // + // So, the heuristic below tries to keep one item in the queue for every + // four running workers. Based on limited benchmarking, this appears to + // be more than sufficient to avoid increasing compilation times. + let quarter_of_workers = workers_running - 3 * workers_running / 4; + items_in_queue > 0 && items_in_queue >= quarter_of_workers } fn maybe_start_llvm_timer<'a>( @@ -1554,56 +1634,59 @@ fn start_executing_work( pub struct WorkerFatalError; fn spawn_work(cgcx: CodegenContext, work: WorkItem) { - thread::spawn(move || { - // Set up a destructor which will fire off a message that we're done as - // we exit. - struct Bomb { - coordinator_send: Sender>, - result: Option, FatalError>>, - worker_id: usize, - } - impl Drop for Bomb { - fn drop(&mut self) { - let worker_id = self.worker_id; - let msg = match self.result.take() { - Some(Ok(WorkItemResult::Compiled(m))) => { - Message::Done:: { result: Ok(m), worker_id } - } - Some(Ok(WorkItemResult::NeedsLink(m))) => { - Message::NeedsLink:: { module: m, worker_id } - } - Some(Ok(WorkItemResult::NeedsFatLTO(m))) => { - Message::NeedsFatLTO:: { result: m, worker_id } - } - Some(Ok(WorkItemResult::NeedsThinLTO(name, thin_buffer))) => { - Message::NeedsThinLTO:: { name, thin_buffer, worker_id } - } - Some(Err(FatalError)) => { - Message::Done:: { result: Err(Some(WorkerFatalError)), worker_id } - } - None => Message::Done:: { result: Err(None), worker_id }, - }; - drop(self.coordinator_send.send(Box::new(msg))); + let builder = thread::Builder::new().name(work.short_description()); + builder + .spawn(move || { + // Set up a destructor which will fire off a message that we're done as + // we exit. + struct Bomb { + coordinator_send: Sender>, + result: Option, FatalError>>, + worker_id: usize, + } + impl Drop for Bomb { + fn drop(&mut self) { + let worker_id = self.worker_id; + let msg = match self.result.take() { + Some(Ok(WorkItemResult::Compiled(m))) => { + Message::Done:: { result: Ok(m), worker_id } + } + Some(Ok(WorkItemResult::NeedsLink(m))) => { + Message::NeedsLink:: { module: m, worker_id } + } + Some(Ok(WorkItemResult::NeedsFatLTO(m))) => { + Message::NeedsFatLTO:: { result: m, worker_id } + } + Some(Ok(WorkItemResult::NeedsThinLTO(name, thin_buffer))) => { + Message::NeedsThinLTO:: { name, thin_buffer, worker_id } + } + Some(Err(FatalError)) => { + Message::Done:: { result: Err(Some(WorkerFatalError)), worker_id } + } + None => Message::Done:: { result: Err(None), worker_id }, + }; + drop(self.coordinator_send.send(Box::new(msg))); + } } - } - let mut bomb = Bomb:: { - coordinator_send: cgcx.coordinator_send.clone(), - result: None, - worker_id: cgcx.worker, - }; + let mut bomb = Bomb:: { + coordinator_send: cgcx.coordinator_send.clone(), + result: None, + worker_id: cgcx.worker, + }; - // Execute the work itself, and if it finishes successfully then flag - // ourselves as a success as well. - // - // Note that we ignore any `FatalError` coming out of `execute_work_item`, - // as a diagnostic was already sent off to the main thread - just - // surface that there was an error in this worker. - bomb.result = { - let _prof_timer = work.start_profiling(&cgcx); - Some(execute_work_item(&cgcx, work)) - }; - }); + // Execute the work itself, and if it finishes successfully then flag + // ourselves as a success as well. + // + // Note that we ignore any `FatalError` coming out of `execute_work_item`, + // as a diagnostic was already sent off to the main thread - just + // surface that there was an error in this worker. + bomb.result = { + let _prof_timer = work.start_profiling(&cgcx); + Some(execute_work_item(&cgcx, work)) + }; + }) + .expect("failed to spawn thread"); } enum SharedEmitterMessage { @@ -1875,7 +1958,7 @@ pub fn submit_pre_lto_module_to_llvm( .unwrap_or_else(|e| panic!("failed to open bitcode file `{}`: {}", bc_path.display(), e)); let mmap = unsafe { - memmap::Mmap::map(&file).unwrap_or_else(|e| { + memmap2::Mmap::map(&file).unwrap_or_else(|e| { panic!("failed to mmap bitcode file `{}`: {}", bc_path.display(), e) }) }; diff --git a/compiler/rustc_codegen_ssa/src/base.rs b/compiler/rustc_codegen_ssa/src/base.rs index 658ad3c375..08e31c3b37 100644 --- a/compiler/rustc_codegen_ssa/src/base.rs +++ b/compiler/rustc_codegen_ssa/src/base.rs @@ -867,7 +867,7 @@ fn determine_cgu_reuse<'tcx>(tcx: TyCtxt<'tcx>, cgu: &CodegenUnit<'tcx>) -> CguR cgu.name() ); - if tcx.dep_graph.try_mark_green(tcx, &dep_node).is_some() { + if tcx.try_mark_green(&dep_node) { // We can re-use either the pre- or the post-thinlto state. If no LTO is // being performed then we can use post-LTO artifacts, otherwise we must // reuse pre-LTO artifacts diff --git a/compiler/rustc_codegen_ssa/src/common.rs b/compiler/rustc_codegen_ssa/src/common.rs index 780b1d2cd9..afd83bfcb5 100644 --- a/compiler/rustc_codegen_ssa/src/common.rs +++ b/compiler/rustc_codegen_ssa/src/common.rs @@ -95,6 +95,7 @@ pub enum TypeKind { Token, ScalableVector, BFloat, + X86_AMX, } // FIXME(mw): Anything that is produced via DepGraph::with_task() must implement diff --git a/compiler/rustc_codegen_ssa/src/coverageinfo/map.rs b/compiler/rustc_codegen_ssa/src/coverageinfo/map.rs index 549b8d41f5..af6482fdbc 100644 --- a/compiler/rustc_codegen_ssa/src/coverageinfo/map.rs +++ b/compiler/rustc_codegen_ssa/src/coverageinfo/map.rs @@ -8,7 +8,7 @@ use rustc_middle::mir::coverage::{ use rustc_middle::ty::Instance; use rustc_middle::ty::TyCtxt; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, PartialEq)] pub struct Expression { lhs: ExpressionOperandId, op: Op, @@ -64,7 +64,9 @@ impl<'tcx> FunctionCoverage<'tcx> { /// Adds a code region to be counted by an injected counter intrinsic. pub fn add_counter(&mut self, id: CounterValueReference, region: CodeRegion) { - self.counters[id].replace(region).expect_none("add_counter called with duplicate `id`"); + if let Some(previous_region) = self.counters[id].replace(region.clone()) { + assert_eq!(previous_region, region, "add_counter: code region for id changed"); + } } /// Both counters and "counter expressions" (or simply, "expressions") can be operands in other @@ -94,9 +96,18 @@ impl<'tcx> FunctionCoverage<'tcx> { expression_id, lhs, op, rhs, region ); let expression_index = self.expression_index(u32::from(expression_id)); - self.expressions[expression_index] - .replace(Expression { lhs, op, rhs, region }) - .expect_none("add_counter_expression called with duplicate `id_descending_from_max`"); + if let Some(previous_expression) = self.expressions[expression_index].replace(Expression { + lhs, + op, + rhs, + region: region.clone(), + }) { + assert_eq!( + previous_expression, + Expression { lhs, op, rhs, region }, + "add_counter_expression: expression for id changed" + ); + } } /// Add a region that will be marked as "unreachable", with a constant "zero counter". diff --git a/compiler/rustc_codegen_ssa/src/lib.rs b/compiler/rustc_codegen_ssa/src/lib.rs index 0307117e1c..dd04d3e548 100644 --- a/compiler/rustc_codegen_ssa/src/lib.rs +++ b/compiler/rustc_codegen_ssa/src/lib.rs @@ -1,6 +1,6 @@ #![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")] +#![feature(assert_matches)] #![feature(bool_to_option)] -#![feature(option_expect_none)] #![feature(box_patterns)] #![feature(drain_filter)] #![feature(try_blocks)] @@ -9,6 +9,7 @@ #![feature(or_patterns)] #![feature(associated_type_bounds)] #![recursion_limit = "256"] +#![feature(box_syntax)] //! This crate contains codegen code that is used by all codegen backends (LLVM and others). //! The backend-agnostic functions of this crate use functions defined in various traits that diff --git a/compiler/rustc_codegen_ssa/src/mir/analyze.rs b/compiler/rustc_codegen_ssa/src/mir/analyze.rs index fd0ff5b66e..38e928145a 100644 --- a/compiler/rustc_codegen_ssa/src/mir/analyze.rs +++ b/compiler/rustc_codegen_ssa/src/mir/analyze.rs @@ -199,7 +199,7 @@ impl> LocalAnalyzer<'mir, 'a, 'tcx, Bx> { } self.visit_local(&place_ref.local, context, location); - self.visit_projection(place_ref.local, place_ref.projection, context, location); + self.visit_projection(*place_ref, context, location); } } } @@ -231,7 +231,7 @@ impl<'mir, 'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> Visitor<'tcx> fn visit_terminator(&mut self, terminator: &mir::Terminator<'tcx>, location: Location) { let check = match terminator.kind { mir::TerminatorKind::Call { func: mir::Operand::Constant(ref c), ref args, .. } => { - match *c.literal.ty.kind() { + match *c.ty().kind() { ty::FnDef(did, _) => Some((did, args)), _ => None, } @@ -281,7 +281,18 @@ impl<'mir, 'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> Visitor<'tcx> Some(assignment_location) => { assignment_location.dominates(location, &self.dominators) } - None => false, + None => { + debug!("No first assignment found for {:?}", local); + // We have not seen any assignment to the local yet, + // but before marking not_ssa, check if it is a ZST, + // in which case we don't need to initialize the local. + let ty = self.fx.mir.local_decls[local].ty; + let ty = self.fx.monomorphize(ty); + + let is_zst = self.fx.cx.layout_of(ty).is_zst(); + debug!("is_zst: {}", is_zst); + is_zst + } }; if !ssa_read { self.not_ssa(local); diff --git a/compiler/rustc_codegen_ssa/src/mir/block.rs b/compiler/rustc_codegen_ssa/src/mir/block.rs index c821908167..04225ddd36 100644 --- a/compiler/rustc_codegen_ssa/src/mir/block.rs +++ b/compiler/rustc_codegen_ssa/src/mir/block.rs @@ -146,24 +146,6 @@ impl<'a, 'tcx> TerminatorCodegenHelper<'tcx> { } } } - - // Generate sideeffect intrinsic if jumping to any of the targets can form - // a loop. - fn maybe_sideeffect>( - &self, - mir: &'tcx mir::Body<'tcx>, - bx: &mut Bx, - targets: &[mir::BasicBlock], - ) { - if bx.tcx().sess.opts.debugging_opts.insert_sideeffect { - if targets.iter().any(|&target| { - target <= self.bb - && target.start_location().is_predecessor_of(self.bb.start_location(), mir) - }) { - bx.sideeffect(false); - } - } - } } /// Codegen implementations for some terminator variants. @@ -198,8 +180,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { let discr = self.codegen_operand(&mut bx, &discr); // `switch_ty` is redundant, sanity-check that. assert_eq!(discr.layout.ty, switch_ty); - helper.maybe_sideeffect(self.mir, &mut bx, targets.all_targets()); - let mut target_iter = targets.iter(); if target_iter.len() == 1 { // If there are two targets (one conditional, one fallback), emit br instead of switch @@ -308,7 +288,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { if let ty::InstanceDef::DropGlue(_, None) = drop_fn.def { // we don't actually need to drop anything. - helper.maybe_sideeffect(self.mir, &mut bx, &[target]); helper.funclet_br(self, &mut bx, target); return; } @@ -337,7 +316,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { } _ => (bx.get_fn_addr(drop_fn), FnAbi::of_instance(&bx, drop_fn, &[])), }; - helper.maybe_sideeffect(self.mir, &mut bx, &[target]); helper.do_call( self, &mut bx, @@ -379,7 +357,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { // Don't codegen the panic block if success if known. if const_cond == Some(expected) { - helper.maybe_sideeffect(self.mir, &mut bx, &[target]); helper.funclet_br(self, &mut bx, target); return; } @@ -390,7 +367,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { // Create the failure block and the conditional branch to it. let lltarget = helper.llblock(self, target); let panic_block = self.new_block("panic"); - helper.maybe_sideeffect(self.mir, &mut bx, &[target]); if expected { bx.cond_br(cond, lltarget, panic_block.llbb()); } else { @@ -491,9 +467,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { let fn_abi = FnAbi::of_instance(bx, instance, &[]); let llfn = bx.get_fn_addr(instance); - if let Some((_, target)) = destination.as_ref() { - helper.maybe_sideeffect(self.mir, bx, &[*target]); - } // Codegen the actual panic invoke/call. helper.do_call( self, @@ -507,7 +480,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { } else { // a NOP let target = destination.as_ref().unwrap().1; - helper.maybe_sideeffect(self.mir, bx, &[target]); helper.funclet_br(self, bx, target) } true @@ -551,7 +523,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { if let Some(ty::InstanceDef::DropGlue(_, None)) = def { // Empty drop glue; a no-op. let &(_, target) = destination.as_ref().unwrap(); - helper.maybe_sideeffect(self.mir, &mut bx, &[target]); helper.funclet_br(self, &mut bx, target); return; } @@ -586,7 +557,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { if let Some(destination_ref) = destination.as_ref() { let &(dest, target) = destination_ref; self.codegen_transmute(&mut bx, &args[0], dest); - helper.maybe_sideeffect(self.mir, &mut bx, &[target]); helper.funclet_br(self, &mut bx, target); } else { // If we are trying to transmute to an uninhabited type, @@ -634,74 +604,73 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { location.val.store(&mut bx, tmp); } self.store_return(&mut bx, ret_dest, &fn_abi.ret, location.immediate()); - - helper.maybe_sideeffect(self.mir, &mut bx, &[*target]); helper.funclet_br(self, &mut bx, *target); } return; } - if intrinsic.is_some() && intrinsic != Some(sym::drop_in_place) { - let intrinsic = intrinsic.unwrap(); - let dest = match ret_dest { - _ if fn_abi.ret.is_indirect() => llargs[0], - ReturnDest::Nothing => { - bx.const_undef(bx.type_ptr_to(bx.arg_memory_ty(&fn_abi.ret))) - } - ReturnDest::IndirectOperand(dst, _) | ReturnDest::Store(dst) => dst.llval, - ReturnDest::DirectOperand(_) => { - bug!("Cannot use direct operand with an intrinsic call") - } - }; + match intrinsic { + None | Some(sym::drop_in_place) => {} + Some(sym::copy_nonoverlapping) => unreachable!(), + Some(intrinsic) => { + let dest = match ret_dest { + _ if fn_abi.ret.is_indirect() => llargs[0], + ReturnDest::Nothing => { + bx.const_undef(bx.type_ptr_to(bx.arg_memory_ty(&fn_abi.ret))) + } + ReturnDest::IndirectOperand(dst, _) | ReturnDest::Store(dst) => dst.llval, + ReturnDest::DirectOperand(_) => { + bug!("Cannot use direct operand with an intrinsic call") + } + }; - let args: Vec<_> = args - .iter() - .enumerate() - .map(|(i, arg)| { - // The indices passed to simd_shuffle* in the - // third argument must be constant. This is - // checked by const-qualification, which also - // promotes any complex rvalues to constants. - if i == 2 && intrinsic.as_str().starts_with("simd_shuffle") { - if let mir::Operand::Constant(constant) = arg { - let c = self.eval_mir_constant(constant); - let (llval, ty) = self.simd_shuffle_indices( - &bx, - constant.span, - constant.literal.ty, - c, - ); - return OperandRef { val: Immediate(llval), layout: bx.layout_of(ty) }; - } else { - span_bug!(span, "shuffle indices must be constant"); + let args: Vec<_> = args + .iter() + .enumerate() + .map(|(i, arg)| { + // The indices passed to simd_shuffle* in the + // third argument must be constant. This is + // checked by const-qualification, which also + // promotes any complex rvalues to constants. + if i == 2 && intrinsic.as_str().starts_with("simd_shuffle") { + if let mir::Operand::Constant(constant) = arg { + let c = self.eval_mir_constant(constant); + let (llval, ty) = + self.simd_shuffle_indices(&bx, constant.span, constant.ty(), c); + return OperandRef { + val: Immediate(llval), + layout: bx.layout_of(ty), + }; + } else { + span_bug!(span, "shuffle indices must be constant"); + } } - } - self.codegen_operand(&mut bx, arg) - }) - .collect(); + self.codegen_operand(&mut bx, arg) + }) + .collect(); + + Self::codegen_intrinsic_call( + &mut bx, + *instance.as_ref().unwrap(), + &fn_abi, + &args, + dest, + span, + ); - Self::codegen_intrinsic_call( - &mut bx, - *instance.as_ref().unwrap(), - &fn_abi, - &args, - dest, - span, - ); + if let ReturnDest::IndirectOperand(dst, _) = ret_dest { + self.store_return(&mut bx, ret_dest, &fn_abi.ret, dst.llval); + } - if let ReturnDest::IndirectOperand(dst, _) = ret_dest { - self.store_return(&mut bx, ret_dest, &fn_abi.ret, dst.llval); - } + if let Some((_, target)) = *destination { + helper.funclet_br(self, &mut bx, target); + } else { + bx.unreachable(); + } - if let Some((_, target)) = *destination { - helper.maybe_sideeffect(self.mir, &mut bx, &[target]); - helper.funclet_br(self, &mut bx, target); - } else { - bx.unreachable(); + return; } - - return; } // Split the rust-call tupled arguments off. @@ -709,7 +678,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { let (tup, args) = args.split_last().unwrap(); (args, Some(tup)) } else { - (&args[..], None) + (args, None) }; 'make_args: for (i, arg) in first_args.iter().enumerate() { @@ -811,9 +780,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { _ => span_bug!(span, "no llfn for call"), }; - if let Some((_, target)) = destination.as_ref() { - helper.maybe_sideeffect(self.mir, &mut bx, &[*target]); - } helper.do_call( self, &mut bx, @@ -860,7 +826,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { let const_value = self .eval_mir_constant(constant) .unwrap_or_else(|_| span_bug!(span, "asm const cannot be resolved")); - let ty = constant.literal.ty; + let ty = constant.ty(); let size = bx.layout_of(ty).size; let scalar = match const_value { ConstValue::Scalar(s) => s, @@ -894,7 +860,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { } mir::InlineAsmOperand::SymFn { ref value } => { let literal = self.monomorphize(value.literal); - if let ty::FnDef(def_id, substs) = *literal.ty.kind() { + if let ty::FnDef(def_id, substs) = *literal.ty().kind() { let instance = ty::Instance::resolve_for_fn_ptr( bx.tcx(), ty::ParamEnv::reveal_all(), @@ -963,22 +929,16 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { mir::TerminatorKind::Goto { target } => { if bb == target { - // This is an unconditional branch back to this same basic - // block. That means we have something like a `loop {}` - // statement. Currently LLVM miscompiles this because it - // assumes forward progress. We want to prevent this in all - // cases, but that has a fairly high cost to compile times - // currently. Instead, try to handle this specific case - // which comes up commonly in practice (e.g., in embedded - // code). + // This is an unconditional branch back to this same basic block. That means we + // have something like a `loop {}` statement. LLVM versions before 12.0 + // miscompile this because they assume forward progress. For older versions + // try to handle just this specific case which comes up commonly in practice + // (e.g., in embedded code). // - // The `true` here means we insert side effects regardless - // of -Zinsert-sideeffect being passed on unconditional - // branching to the same basic block. - bx.sideeffect(true); - } else { - helper.maybe_sideeffect(self.mir, &mut bx, &[target]); + // NB: the `sideeffect` currently checks for the LLVM version used internally. + bx.sideeffect(); } + helper.funclet_br(self, &mut bx, target); } diff --git a/compiler/rustc_codegen_ssa/src/mir/constant.rs b/compiler/rustc_codegen_ssa/src/mir/constant.rs index b79a221a0e..aa41acc357 100644 --- a/compiler/rustc_codegen_ssa/src/mir/constant.rs +++ b/compiler/rustc_codegen_ssa/src/mir/constant.rs @@ -16,7 +16,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { constant: &mir::Constant<'tcx>, ) -> Result, ErrorHandled> { let val = self.eval_mir_constant(constant)?; - let ty = self.monomorphize(constant.literal.ty); + let ty = self.monomorphize(constant.ty()); Ok(OperandRef::from_const(bx, val, ty)) } @@ -24,7 +24,12 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { &self, constant: &mir::Constant<'tcx>, ) -> Result, ErrorHandled> { - match self.monomorphize(constant.literal).val { + let ct = self.monomorphize(constant.literal); + let ct = match ct { + mir::ConstantKind::Ty(ct) => ct, + mir::ConstantKind::Val(val, _) => return Ok(val), + }; + match ct.val { ty::ConstKind::Unevaluated(def, substs, promoted) => self .cx .tcx() diff --git a/compiler/rustc_codegen_ssa/src/mir/coverageinfo.rs b/compiler/rustc_codegen_ssa/src/mir/coverageinfo.rs index a115d35866..5ab1baafb5 100644 --- a/compiler/rustc_codegen_ssa/src/mir/coverageinfo.rs +++ b/compiler/rustc_codegen_ssa/src/mir/coverageinfo.rs @@ -2,27 +2,38 @@ use crate::traits::*; use rustc_middle::mir::coverage::*; use rustc_middle::mir::Coverage; +use rustc_middle::mir::SourceScope; use super::FunctionCx; impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { - pub fn codegen_coverage(&self, bx: &mut Bx, coverage: Coverage) { + pub fn codegen_coverage(&self, bx: &mut Bx, coverage: Coverage, scope: SourceScope) { + // Determine the instance that coverage data was originally generated for. + let scope_data = &self.mir.source_scopes[scope]; + let instance = if let Some((inlined_instance, _)) = scope_data.inlined { + self.monomorphize(inlined_instance) + } else if let Some(inlined_scope) = scope_data.inlined_parent_scope { + self.monomorphize(self.mir.source_scopes[inlined_scope].inlined.unwrap().0) + } else { + self.instance + }; + let Coverage { kind, code_region } = coverage; match kind { CoverageKind::Counter { function_source_hash, id } => { - if bx.set_function_source_hash(self.instance, function_source_hash) { + if bx.set_function_source_hash(instance, function_source_hash) { // If `set_function_source_hash()` returned true, the coverage map is enabled, // so continue adding the counter. if let Some(code_region) = code_region { // Note: Some counters do not have code regions, but may still be referenced // from expressions. In that case, don't add the counter to the coverage map, // but do inject the counter intrinsic. - bx.add_coverage_counter(self.instance, id, code_region); + bx.add_coverage_counter(instance, id, code_region); } - let coverageinfo = bx.tcx().coverageinfo(self.instance.def_id()); + let coverageinfo = bx.tcx().coverageinfo(instance.def_id()); - let fn_name = bx.create_pgo_func_name_var(self.instance); + let fn_name = bx.create_pgo_func_name_var(instance); let hash = bx.const_u64(function_source_hash); let num_counters = bx.const_u32(coverageinfo.num_counters); let index = bx.const_u32(u32::from(id)); @@ -34,11 +45,11 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { } } CoverageKind::Expression { id, lhs, op, rhs } => { - bx.add_coverage_counter_expression(self.instance, id, lhs, op, rhs, code_region); + bx.add_coverage_counter_expression(instance, id, lhs, op, rhs, code_region); } CoverageKind::Unreachable => { bx.add_coverage_unreachable( - self.instance, + instance, code_region.expect("unreachable regions always have code regions"), ); } diff --git a/compiler/rustc_codegen_ssa/src/mir/debuginfo.rs b/compiler/rustc_codegen_ssa/src/mir/debuginfo.rs index f1eae605da..a3f20abc82 100644 --- a/compiler/rustc_codegen_ssa/src/mir/debuginfo.rs +++ b/compiler/rustc_codegen_ssa/src/mir/debuginfo.rs @@ -320,6 +320,8 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { ) -> Option>>> { let full_debug_info = self.cx.sess().opts.debuginfo == DebugInfo::Full; + let target_is_msvc = self.cx.sess().target.is_like_msvc; + if !full_debug_info && self.cx.sess().fewer_names() { return None; } @@ -341,18 +343,36 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { && var.source_info.scope == mir::OUTERMOST_SOURCE_SCOPE { let arg_index = place.local.index() - 1; - - // FIXME(eddyb) shouldn't `ArgumentVariable` indices be - // offset in closures to account for the hidden environment? - // Also, is this `+ 1` needed at all? - VariableKind::ArgumentVariable(arg_index + 1) + if target_is_msvc { + // Rust compiler decomposes every &str or slice argument into two components: + // a pointer to the memory address where the data is stored and a usize representing + // the length of the str (or slice). These components will later be used to reconstruct + // the original argument inside the body of the function that owns it (see the + // definition of debug_introduce_local for more details). + // + // Since the original argument is declared inside a function rather than being passed + // in as an argument, it must be marked as a LocalVariable for MSVC debuggers to visualize + // its data correctly. (See issue #81894 for an in-depth description of the problem). + match *var_ty.kind() { + ty::Ref(_, inner_type, _) => match *inner_type.kind() { + ty::Slice(_) | ty::Str => VariableKind::LocalVariable, + _ => VariableKind::ArgumentVariable(arg_index + 1), + }, + _ => VariableKind::ArgumentVariable(arg_index + 1), + } + } else { + // FIXME(eddyb) shouldn't `ArgumentVariable` indices be + // offset in closures to account for the hidden environment? + // Also, is this `+ 1` needed at all? + VariableKind::ArgumentVariable(arg_index + 1) + } } else { VariableKind::LocalVariable }; (var_ty, var_kind) } mir::VarDebugInfoContents::Const(c) => { - let ty = self.monomorphize(c.literal.ty); + let ty = self.monomorphize(c.ty()); (ty, VariableKind::LocalVariable) } }; diff --git a/compiler/rustc_codegen_ssa/src/mir/intrinsic.rs b/compiler/rustc_codegen_ssa/src/mir/intrinsic.rs index 80e3ed75b8..8502309b90 100644 --- a/compiler/rustc_codegen_ssa/src/mir/intrinsic.rs +++ b/compiler/rustc_codegen_ssa/src/mir/intrinsic.rs @@ -125,19 +125,6 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { let offset = args[1].immediate(); bx.gep(ptr, &[offset]) } - - sym::copy_nonoverlapping => { - copy_intrinsic( - bx, - false, - false, - substs.type_at(0), - args[1].immediate(), - args[0].immediate(), - args[2].immediate(), - ); - return; - } sym::copy => { copy_intrinsic( bx, diff --git a/compiler/rustc_codegen_ssa/src/mir/mod.rs b/compiler/rustc_codegen_ssa/src/mir/mod.rs index d31ececf13..3f94547821 100644 --- a/compiler/rustc_codegen_ssa/src/mir/mod.rs +++ b/compiler/rustc_codegen_ssa/src/mir/mod.rs @@ -149,8 +149,6 @@ pub fn codegen_mir<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>>( bx.set_personality_fn(cx.eh_personality()); } - bx.sideeffect(false); - let cleanup_kinds = analyze::cleanup_kinds(&mir); // Allocate a `Block` for every basic block, except // the start block, if nothing loops back to it. diff --git a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs index e3a6cabd60..629cb64d43 100644 --- a/compiler/rustc_codegen_ssa/src/mir/rvalue.rs +++ b/compiler/rustc_codegen_ssa/src/mir/rvalue.rs @@ -325,7 +325,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { let er = scalar.valid_range_exclusive(bx.cx()); if er.end != er.start - && scalar.valid_range.end() > scalar.valid_range.start() + && scalar.valid_range.end() >= scalar.valid_range.start() { // We want `table[e as usize ± k]` to not // have bound checks, and this is the most @@ -424,7 +424,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { (bx, operand) } - mir::Rvalue::BinaryOp(op, ref lhs, ref rhs) => { + mir::Rvalue::BinaryOp(op, box (ref lhs, ref rhs)) => { let lhs = self.codegen_operand(&mut bx, lhs); let rhs = self.codegen_operand(&mut bx, rhs); let llresult = match (lhs.val, rhs.val) { @@ -453,7 +453,7 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { }; (bx, operand) } - mir::Rvalue::CheckedBinaryOp(op, ref lhs, ref rhs) => { + mir::Rvalue::CheckedBinaryOp(op, box (ref lhs, ref rhs)) => { let lhs = self.codegen_operand(&mut bx, lhs); let rhs = self.codegen_operand(&mut bx, rhs); let result = self.codegen_scalar_checked_binop( diff --git a/compiler/rustc_codegen_ssa/src/mir/statement.rs b/compiler/rustc_codegen_ssa/src/mir/statement.rs index 6f74ba77d4..fe7f6288ad 100644 --- a/compiler/rustc_codegen_ssa/src/mir/statement.rs +++ b/compiler/rustc_codegen_ssa/src/mir/statement.rs @@ -112,7 +112,27 @@ impl<'a, 'tcx, Bx: BuilderMethods<'a, 'tcx>> FunctionCx<'a, 'tcx, Bx> { bx } mir::StatementKind::Coverage(box ref coverage) => { - self.codegen_coverage(&mut bx, coverage.clone()); + self.codegen_coverage(&mut bx, coverage.clone(), statement.source_info.scope); + bx + } + mir::StatementKind::CopyNonOverlapping(box mir::CopyNonOverlapping { + ref src, + ref dst, + ref count, + }) => { + let dst_val = self.codegen_operand(&mut bx, dst); + let src_val = self.codegen_operand(&mut bx, src); + let count = self.codegen_operand(&mut bx, count).immediate(); + let pointee_layout = dst_val + .layout + .pointee_info_at(&mut bx, rustc_target::abi::Size::ZERO) + .expect("Expected pointer"); + let bytes = bx.mul(count, bx.const_usize(pointee_layout.size.bytes())); + + let align = pointee_layout.align; + let dst = dst_val.immediate(); + let src = src_val.immediate(); + bx.memcpy(dst, align, src, align, bytes, crate::MemFlags::empty()); bx } mir::StatementKind::FakeRead(..) diff --git a/compiler/rustc_codegen_ssa/src/mono_item.rs b/compiler/rustc_codegen_ssa/src/mono_item.rs index 607b545967..8e79193759 100644 --- a/compiler/rustc_codegen_ssa/src/mono_item.rs +++ b/compiler/rustc_codegen_ssa/src/mono_item.rs @@ -30,8 +30,8 @@ impl<'a, 'tcx: 'a> MonoItemExt<'a, 'tcx> for MonoItem<'tcx> { MonoItem::Static(def_id) => { cx.codegen_static(def_id, cx.tcx().is_mutable_static(def_id)); } - MonoItem::GlobalAsm(hir_id) => { - let item = cx.tcx().hir().expect_item(hir_id); + MonoItem::GlobalAsm(item_id) => { + let item = cx.tcx().hir().item(item_id); if let hir::ItemKind::GlobalAsm(ref ga) = item.kind { cx.codegen_global_asm(ga); } else { diff --git a/compiler/rustc_codegen_ssa/src/traits/intrinsic.rs b/compiler/rustc_codegen_ssa/src/traits/intrinsic.rs index ac3c99f9c9..777436ad2a 100644 --- a/compiler/rustc_codegen_ssa/src/traits/intrinsic.rs +++ b/compiler/rustc_codegen_ssa/src/traits/intrinsic.rs @@ -20,9 +20,10 @@ pub trait IntrinsicCallMethods<'tcx>: BackendTypes { fn abort(&mut self); fn assume(&mut self, val: Self::Value); fn expect(&mut self, cond: Self::Value, expected: bool) -> Self::Value; - /// Normally, sideeffect is only emitted if -Zinsert-sideeffect is passed; - /// in some cases though we want to emit it regardless. - fn sideeffect(&mut self, unconditional: bool); + /// Emits a forced side effect. + /// + /// Currently has any effect only when LLVM versions prior to 12.0 are used as the backend. + fn sideeffect(&mut self); /// Trait method used to inject `va_start` on the "spoofed" `VaListImpl` in /// Rust defined C-variadic functions. fn va_start(&mut self, val: Self::Value) -> Self::Value; diff --git a/compiler/rustc_data_structures/Cargo.toml b/compiler/rustc_data_structures/Cargo.toml index 23e689fcae..2e5a86b14c 100644 --- a/compiler/rustc_data_structures/Cargo.toml +++ b/compiler/rustc_data_structures/Cargo.toml @@ -19,13 +19,13 @@ rustc_graphviz = { path = "../rustc_graphviz" } cfg-if = "0.1.2" crossbeam-utils = { version = "0.7", features = ["nightly"] } stable_deref_trait = "1.0.0" -rayon = { version = "0.3.0", package = "rustc-rayon" } -rayon-core = { version = "0.3.0", package = "rustc-rayon-core" } +rayon = { version = "0.3.1", package = "rustc-rayon" } +rayon-core = { version = "0.3.1", package = "rustc-rayon-core" } rustc-hash = "1.1.0" -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } rustc_index = { path = "../rustc_index", package = "rustc_index" } bitflags = "1.2.1" -measureme = "9.0.0" +measureme = "9.1.0" libc = "0.2" stacker = "0.1.12" tempfile = "3.0.5" diff --git a/compiler/rustc_data_structures/src/const_cstr.rs b/compiler/rustc_data_structures/src/const_cstr.rs deleted file mode 100644 index 1ebcb87818..0000000000 --- a/compiler/rustc_data_structures/src/const_cstr.rs +++ /dev/null @@ -1,30 +0,0 @@ -/// This macro creates a zero-overhead &CStr by adding a NUL terminator to -/// the string literal passed into it at compile-time. Use it like: -/// -/// ``` -/// let some_const_cstr = const_cstr!("abc"); -/// ``` -/// -/// The above is roughly equivalent to: -/// -/// ``` -/// let some_const_cstr = CStr::from_bytes_with_nul(b"abc\0").unwrap() -/// ``` -/// -/// Note that macro only checks the string literal for internal NULs if -/// debug-assertions are enabled in order to avoid runtime overhead in release -/// builds. -#[macro_export] -macro_rules! const_cstr { - ($s:expr) => {{ - use std::ffi::CStr; - - let str_plus_nul = concat!($s, "\0"); - - if cfg!(debug_assertions) { - CStr::from_bytes_with_nul(str_plus_nul.as_bytes()).unwrap() - } else { - unsafe { CStr::from_bytes_with_nul_unchecked(str_plus_nul.as_bytes()) } - } - }}; -} diff --git a/compiler/rustc_data_structures/src/fingerprint.rs b/compiler/rustc_data_structures/src/fingerprint.rs index 08c3419a84..681b49e2ea 100644 --- a/compiler/rustc_data_structures/src/fingerprint.rs +++ b/compiler/rustc_data_structures/src/fingerprint.rs @@ -7,11 +7,17 @@ use std::hash::{Hash, Hasher}; use std::mem::{self, MaybeUninit}; #[derive(Eq, PartialEq, Ord, PartialOrd, Debug, Clone, Copy)] +#[repr(C)] pub struct Fingerprint(u64, u64); impl Fingerprint { pub const ZERO: Fingerprint = Fingerprint(0, 0); + #[inline] + pub fn new(_0: u64, _1: u64) -> Fingerprint { + Fingerprint(_0, _1) + } + #[inline] pub fn from_smaller_hash(hash: u64) -> Fingerprint { Fingerprint(hash, hash) @@ -19,7 +25,12 @@ impl Fingerprint { #[inline] pub fn to_smaller_hash(&self) -> u64 { - self.0 + // Even though both halves of the fingerprint are expected to be good + // quality hash values, let's still combine the two values because the + // Fingerprints in DefPathHash have the StableCrateId portion which is + // the same for all DefPathHashes from the same crate. Combining the + // two halfs makes sure we get a good quality hash in such cases too. + self.0.wrapping_mul(3).wrapping_add(self.1) } #[inline] @@ -92,8 +103,19 @@ impl FingerprintHasher for H { impl FingerprintHasher for crate::unhash::Unhasher { #[inline] fn write_fingerprint(&mut self, fingerprint: &Fingerprint) { - // `Unhasher` only wants a single `u64` - self.write_u64(fingerprint.0); + // Even though both halves of the fingerprint are expected to be good + // quality hash values, let's still combine the two values because the + // Fingerprints in DefPathHash have the StableCrateId portion which is + // the same for all DefPathHashes from the same crate. Combining the + // two halfs makes sure we get a good quality hash in such cases too. + // + // Since `Unhasher` is used only in the context of HashMaps, it is OK + // to combine the two components in an order-independent way (which is + // cheaper than the more robust Fingerprint::to_smaller_hash()). For + // HashMaps we don't really care if Fingerprint(x,y) and + // Fingerprint(y, x) result in the same hash value. Collision + // probability will still be much better than with FxHash. + self.write_u64(fingerprint.0.wrapping_add(fingerprint.1)); } } diff --git a/compiler/rustc_data_structures/src/graph/dominators/mod.rs b/compiler/rustc_data_structures/src/graph/dominators/mod.rs index ad62e3c9fc..1cd170599b 100644 --- a/compiler/rustc_data_structures/src/graph/dominators/mod.rs +++ b/compiler/rustc_data_structures/src/graph/dominators/mod.rs @@ -85,6 +85,10 @@ pub struct Dominators { } impl Dominators { + pub fn dummy() -> Self { + Self { post_order_rank: IndexVec::new(), immediate_dominators: IndexVec::new() } + } + pub fn is_reachable(&self, node: Node) -> bool { self.immediate_dominators[node].is_some() } diff --git a/compiler/rustc_data_structures/src/lib.rs b/compiler/rustc_data_structures/src/lib.rs index 5880bbd3de..fcb2bca7b4 100644 --- a/compiler/rustc_data_structures/src/lib.rs +++ b/compiler/rustc_data_structures/src/lib.rs @@ -26,7 +26,6 @@ #![feature(thread_id_value)] #![feature(extend_one)] #![feature(const_panic)] -#![cfg_attr(bootstrap, feature(min_const_generics))] #![feature(new_uninit)] #![feature(once_cell)] #![feature(maybe_uninit_uninit_array)] @@ -70,7 +69,6 @@ pub mod base_n; pub mod binary_search_util; pub mod box_region; pub mod captures; -pub mod const_cstr; pub mod flock; pub mod functor; pub mod fx; diff --git a/compiler/rustc_data_structures/src/macros.rs b/compiler/rustc_data_structures/src/macros.rs index b918ed9458..48dfbba750 100644 --- a/compiler/rustc_data_structures/src/macros.rs +++ b/compiler/rustc_data_structures/src/macros.rs @@ -9,11 +9,11 @@ macro_rules! static_assert_size { #[macro_export] macro_rules! enum_from_u32 { ($(#[$attr:meta])* pub enum $name:ident { - $($variant:ident = $e:expr,)* + $($(#[$var_attr:meta])* $variant:ident = $e:expr,)* }) => { $(#[$attr])* pub enum $name { - $($variant = $e),* + $($(#[$var_attr])* $variant = $e),* } impl $name { @@ -26,11 +26,11 @@ macro_rules! enum_from_u32 { } }; ($(#[$attr:meta])* pub enum $name:ident { - $($variant:ident,)* + $($(#[$var_attr:meta])* $variant:ident,)* }) => { $(#[$attr])* pub enum $name { - $($variant,)* + $($(#[$var_attr])* $variant,)* } impl $name { diff --git a/compiler/rustc_data_structures/src/profiling.rs b/compiler/rustc_data_structures/src/profiling.rs index f0b413c795..51f851dc94 100644 --- a/compiler/rustc_data_structures/src/profiling.rs +++ b/compiler/rustc_data_structures/src/profiling.rs @@ -608,7 +608,7 @@ pub fn print_time_passes_entry( (None, None) => String::new(), }; - println!("time: {:>7}{}\t{}", duration_to_secs_str(dur), mem_string, what); + eprintln!("time: {:>7}{}\t{}", duration_to_secs_str(dur), mem_string, what); } // Hack up our own formatting for the duration to make it easier for scripts diff --git a/compiler/rustc_data_structures/src/sharded.rs b/compiler/rustc_data_structures/src/sharded.rs index 485719c517..14db71cb8f 100644 --- a/compiler/rustc_data_structures/src/sharded.rs +++ b/compiler/rustc_data_structures/src/sharded.rs @@ -63,23 +63,9 @@ impl Sharded { if SHARDS == 1 { &self.shards[0].0 } else { self.get_shard_by_hash(make_hash(val)) } } - /// Get a shard with a pre-computed hash value. If `get_shard_by_value` is - /// ever used in combination with `get_shard_by_hash` on a single `Sharded` - /// instance, then `hash` must be computed with `FxHasher`. Otherwise, - /// `hash` can be computed with any hasher, so long as that hasher is used - /// consistently for each `Sharded` instance. - #[inline] - pub fn get_shard_index_by_hash(&self, hash: u64) -> usize { - let hash_len = mem::size_of::(); - // Ignore the top 7 bits as hashbrown uses these and get the next SHARD_BITS highest bits. - // hashbrown also uses the lowest bits, so we can't use those - let bits = (hash >> (hash_len * 8 - 7 - SHARD_BITS)) as usize; - bits % SHARDS - } - #[inline] pub fn get_shard_by_hash(&self, hash: u64) -> &Lock { - &self.shards[self.get_shard_index_by_hash(hash)].0 + &self.shards[get_shard_index_by_hash(hash)].0 } #[inline] @@ -166,3 +152,17 @@ fn make_hash(val: &K) -> u64 { val.hash(&mut state); state.finish() } + +/// Get a shard with a pre-computed hash value. If `get_shard_by_value` is +/// ever used in combination with `get_shard_by_hash` on a single `Sharded` +/// instance, then `hash` must be computed with `FxHasher`. Otherwise, +/// `hash` can be computed with any hasher, so long as that hasher is used +/// consistently for each `Sharded` instance. +#[inline] +pub fn get_shard_index_by_hash(hash: u64) -> usize { + let hash_len = mem::size_of::(); + // Ignore the top 7 bits as hashbrown uses these and get the next SHARD_BITS highest bits. + // hashbrown also uses the lowest bits, so we can't use those + let bits = (hash >> (hash_len * 8 - 7 - SHARD_BITS)) as usize; + bits % SHARDS +} diff --git a/compiler/rustc_data_structures/src/stable_hasher.rs b/compiler/rustc_data_structures/src/stable_hasher.rs index 3850c9b74f..ff28784a1d 100644 --- a/compiler/rustc_data_structures/src/stable_hasher.rs +++ b/compiler/rustc_data_structures/src/stable_hasher.rs @@ -35,6 +35,7 @@ impl StableHasher { StableHasher { state: SipHasher128::new_with_keys(0, 0) } } + #[inline] pub fn finish(self) -> W { W::finish(self) } diff --git a/compiler/rustc_data_structures/src/tiny_list.rs b/compiler/rustc_data_structures/src/tiny_list.rs index e94a0c6eb5..f88bcc2948 100644 --- a/compiler/rustc_data_structures/src/tiny_list.rs +++ b/compiler/rustc_data_structures/src/tiny_list.rs @@ -15,7 +15,7 @@ mod tests; #[derive(Clone)] -pub struct TinyList { +pub struct TinyList { head: Option>, } @@ -56,20 +56,10 @@ impl TinyList { } false } - - #[inline] - pub fn len(&self) -> usize { - let (mut elem, mut count) = (self.head.as_ref(), 0); - while let Some(ref e) = elem { - count += 1; - elem = e.next.as_deref(); - } - count - } } #[derive(Clone)] -struct Element { +struct Element { data: T, next: Option>>, } diff --git a/compiler/rustc_data_structures/src/tiny_list/tests.rs b/compiler/rustc_data_structures/src/tiny_list/tests.rs index a8ae2bc872..c0334d2e23 100644 --- a/compiler/rustc_data_structures/src/tiny_list/tests.rs +++ b/compiler/rustc_data_structures/src/tiny_list/tests.rs @@ -3,6 +3,17 @@ use super::*; extern crate test; use test::{black_box, Bencher}; +impl TinyList { + fn len(&self) -> usize { + let (mut elem, mut count) = (self.head.as_ref(), 0); + while let Some(ref e) = elem { + count += 1; + elem = e.next.as_deref(); + } + count + } +} + #[test] fn test_contains_and_insert() { fn do_insert(i: u32) -> bool { diff --git a/compiler/rustc_data_structures/src/transitive_relation.rs b/compiler/rustc_data_structures/src/transitive_relation.rs index 2e1512b392..ccf8bd69eb 100644 --- a/compiler/rustc_data_structures/src/transitive_relation.rs +++ b/compiler/rustc_data_structures/src/transitive_relation.rs @@ -9,7 +9,7 @@ use std::mem; mod tests; #[derive(Clone, Debug)] -pub struct TransitiveRelation { +pub struct TransitiveRelation { // List of elements. This is used to map from a T to a usize. elements: FxIndexSet, @@ -49,7 +49,7 @@ struct Edge { target: Index, } -impl TransitiveRelation { +impl TransitiveRelation { pub fn is_empty(&self) -> bool { self.edges.is_empty() } @@ -322,12 +322,6 @@ impl TransitiveRelation { .collect() } - /// A "best" parent in some sense. See `parents` and - /// `postdom_upper_bound` for more details. - pub fn postdom_parent(&self, a: &T) -> Option<&T> { - self.mutual_immediate_postdominator(self.parents(a)) - } - fn with_closure(&self, op: OP) -> R where OP: FnOnce(&BitMatrix) -> R, diff --git a/compiler/rustc_data_structures/src/transitive_relation/tests.rs b/compiler/rustc_data_structures/src/transitive_relation/tests.rs index ca90ba176a..9fa7224376 100644 --- a/compiler/rustc_data_structures/src/transitive_relation/tests.rs +++ b/compiler/rustc_data_structures/src/transitive_relation/tests.rs @@ -1,5 +1,13 @@ use super::*; +impl TransitiveRelation { + /// A "best" parent in some sense. See `parents` and + /// `postdom_upper_bound` for more details. + fn postdom_parent(&self, a: &T) -> Option<&T> { + self.mutual_immediate_postdominator(self.parents(a)) + } +} + #[test] fn test_one_step() { let mut relation = TransitiveRelation::default(); diff --git a/compiler/rustc_driver/Cargo.toml b/compiler/rustc_driver/Cargo.toml index b88b556d14..c521f2041d 100644 --- a/compiler/rustc_driver/Cargo.toml +++ b/compiler/rustc_driver/Cargo.toml @@ -10,9 +10,9 @@ crate-type = ["dylib"] [dependencies] libc = "0.2" atty = "0.2" -tracing = { version = "0.1.18" } -tracing-subscriber = { version = "0.2.13", default-features = false, features = ["fmt", "env-filter", "smallvec", "parking_lot", "ansi"] } -tracing-tree = "0.1.6" +tracing = { version = "0.1.25" } +tracing-subscriber = { version = "0.2.16", default-features = false, features = ["fmt", "env-filter", "smallvec", "parking_lot", "ansi"] } +tracing-tree = "0.1.9" rustc_middle = { path = "../rustc_middle" } rustc_ast_pretty = { path = "../rustc_ast_pretty" } rustc_target = { path = "../rustc_target" } @@ -34,6 +34,8 @@ rustc_interface = { path = "../rustc_interface" } rustc_serialize = { path = "../rustc_serialize" } rustc_ast = { path = "../rustc_ast" } rustc_span = { path = "../rustc_span" } +rustc_mir_build = { path = "../rustc_mir_build" } +rustc_typeck = { path = "../rustc_typeck" } [target.'cfg(windows)'.dependencies] winapi = { version = "0.3", features = ["consoleapi", "debugapi", "processenv"] } diff --git a/compiler/rustc_driver/src/args.rs b/compiler/rustc_driver/src/args.rs index 4f2febf04b..01338359f1 100644 --- a/compiler/rustc_driver/src/args.rs +++ b/compiler/rustc_driver/src/args.rs @@ -3,7 +3,7 @@ use std::fmt; use std::fs; use std::io; -pub fn arg_expand(arg: String) -> Result, Error> { +fn arg_expand(arg: String) -> Result, Error> { if let Some(path) = arg.strip_prefix('@') { let file = match fs::read_to_string(path) { Ok(file) => file, @@ -18,6 +18,20 @@ pub fn arg_expand(arg: String) -> Result, Error> { } } +pub fn arg_expand_all(at_args: &[String]) -> Vec { + let mut args = Vec::new(); + for arg in at_args { + match arg_expand(arg.clone()) { + Ok(arg) => args.extend(arg), + Err(err) => rustc_session::early_error( + rustc_session::config::ErrorOutputType::default(), + &format!("Failed to load argument file: {}", err), + ), + } + } + args +} + #[derive(Debug)] pub enum Error { Utf8Error(Option), diff --git a/compiler/rustc_driver/src/lib.rs b/compiler/rustc_driver/src/lib.rs index 8295e88f75..25a78041c0 100644 --- a/compiler/rustc_driver/src/lib.rs +++ b/compiler/rustc_driver/src/lib.rs @@ -27,7 +27,6 @@ use rustc_interface::{interface, Queries}; use rustc_lint::LintStore; use rustc_metadata::locator; use rustc_middle::middle::cstore::MetadataLoader; -use rustc_middle::ty::TyCtxt; use rustc_save_analysis as save; use rustc_save_analysis::DumpHandler; use rustc_serialize::json::{self, ToJson}; @@ -55,7 +54,7 @@ use std::process::{self, Command, Stdio}; use std::str; use std::time::Instant; -mod args; +pub mod args; pub mod pretty; /// Exit status code used for successful compilation and help output. @@ -188,16 +187,8 @@ fn run_compiler( Box Box + Send>, >, ) -> interface::Result<()> { - let mut args = Vec::new(); - for arg in at_args { - match args::arg_expand(arg.clone()) { - Ok(arg) => args.extend(arg), - Err(err) => early_error( - ErrorOutputType::default(), - &format!("Failed to load argument file: {}", err), - ), - } - } + let args = args::arg_expand_all(at_args); + let diagnostic_output = emitter.map_or(DiagnosticOutput::Default, DiagnosticOutput::Raw); let matches = match handle_options(&args) { Some(matches) => matches, @@ -224,6 +215,7 @@ fn run_compiler( diagnostic_output, stderr: None, lint_caps: Default::default(), + parse_sess_created: None, register_lints: None, override_queries: None, make_codegen_backend: make_codegen_backend.take().unwrap(), @@ -307,6 +299,7 @@ fn run_compiler( diagnostic_output, stderr: None, lint_caps: Default::default(), + parse_sess_created: None, register_lints: None, override_queries: None, make_codegen_backend: make_codegen_backend.unwrap(), @@ -821,7 +814,7 @@ fn usage(verbose: bool, include_unstable_options: bool, nightly_build: bool) { } else { "\n --help -v Print the full set of options rustc accepts" }; - let at_path = if verbose && nightly_build { + let at_path = if verbose { " @path Read newline separated options from `path`\n" } else { "" @@ -1240,7 +1233,7 @@ pub fn report_ice(info: &panic::PanicInfo<'_>, bug_report_url: &str) { let num_frames = if backtrace { None } else { Some(2) }; - TyCtxt::try_print_query_stack(&handler, num_frames); + interface::try_print_query_stack(&handler, num_frames); #[cfg(windows)] unsafe { diff --git a/compiler/rustc_driver/src/pretty.rs b/compiler/rustc_driver/src/pretty.rs index b7edc24bc4..5512bd7445 100644 --- a/compiler/rustc_driver/src/pretty.rs +++ b/compiler/rustc_driver/src/pretty.rs @@ -9,14 +9,14 @@ use rustc_hir_pretty as pprust_hir; use rustc_middle::hir::map as hir_map; use rustc_middle::ty::{self, TyCtxt}; use rustc_mir::util::{write_mir_graphviz, write_mir_pretty}; -use rustc_session::config::{Input, PpMode, PpSourceMode}; +use rustc_mir_build::thir; +use rustc_session::config::{Input, PpAstTreeMode, PpHirMode, PpMode, PpSourceMode}; use rustc_session::Session; use rustc_span::symbol::Ident; use rustc_span::FileName; use std::cell::Cell; -use std::fs::File; -use std::io::Write; +use std::fmt::Write; use std::path::Path; pub use self::PpMode::*; @@ -44,43 +44,41 @@ where F: FnOnce(&dyn PrinterSupport) -> A, { match *ppmode { - PpmNormal | PpmEveryBodyLoops | PpmExpanded => { + Normal | EveryBodyLoops | Expanded => { let annotation = NoAnn { sess, tcx }; f(&annotation) } - PpmIdentified | PpmExpandedIdentified => { + Identified | ExpandedIdentified => { let annotation = IdentifiedAnnotation { sess, tcx }; f(&annotation) } - PpmExpandedHygiene => { + ExpandedHygiene => { let annotation = HygieneAnnotation { sess }; f(&annotation) } - _ => panic!("Should use call_with_pp_support_hir"), } } -fn call_with_pp_support_hir(ppmode: &PpSourceMode, tcx: TyCtxt<'_>, f: F) -> A +fn call_with_pp_support_hir(ppmode: &PpHirMode, tcx: TyCtxt<'_>, f: F) -> A where F: FnOnce(&dyn HirPrinterSupport<'_>, &hir::Crate<'_>) -> A, { match *ppmode { - PpmNormal => { + PpHirMode::Normal => { let annotation = NoAnn { sess: tcx.sess, tcx: Some(tcx) }; f(&annotation, tcx.hir().krate()) } - PpmIdentified => { + PpHirMode::Identified => { let annotation = IdentifiedAnnotation { sess: tcx.sess, tcx: Some(tcx) }; f(&annotation, tcx.hir().krate()) } - PpmTyped => { + PpHirMode::Typed => { abort_on_err(tcx.analysis(LOCAL_CRATE), tcx.sess); let annotation = TypedAnnotation { tcx, maybe_typeck_results: Cell::new(None) }; tcx.dep_graph.with_ignore(|| f(&annotation, tcx.hir().krate())) } - _ => panic!("Should use call_with_pp_support"), } } @@ -237,7 +235,7 @@ impl<'hir> pprust_hir::PpAnn for IdentifiedAnnotation<'hir> { pprust_hir::AnnNode::Name(_) => {} pprust_hir::AnnNode::Item(item) => { s.s.space(); - s.synth_comment(format!("hir_id: {}", item.hir_id)); + s.synth_comment(format!("hir_id: {}", item.hir_id())); } pprust_hir::AnnNode::SubItem(id) => { s.s.space(); @@ -375,13 +373,14 @@ fn get_source(input: &Input, sess: &Session) -> (String, FileName) { (src, src_name) } -fn write_output(out: Vec, ofile: Option<&Path>) { +fn write_or_print(out: &str, ofile: Option<&Path>) { match ofile { - None => print!("{}", String::from_utf8(out).unwrap()), - Some(p) => match File::create(p) { - Ok(mut w) => w.write_all(&out).unwrap(), - Err(e) => panic!("print-print failed to open {} due to {}", p.display(), e), - }, + None => print!("{}", out), + Some(p) => { + if let Err(e) = std::fs::write(p, out) { + panic!("print-print failed to write {} due to {}", p.display(), e); + } + } } } @@ -394,30 +393,32 @@ pub fn print_after_parsing( ) { let (src, src_name) = get_source(input, sess); - let mut out = String::new(); - - if let PpmSource(s) = ppm { - // Silently ignores an identified node. - let out = &mut out; - call_with_pp_support(&s, sess, None, move |annotation| { - debug!("pretty printing source code {:?}", s); - let sess = annotation.sess(); - let parse = &sess.parse_sess; - *out = pprust::print_crate( - sess.source_map(), - krate, - src_name, - src, - annotation.pp_ann(), - false, - parse.edition, - ) - }) - } else { - unreachable!(); + let out = match ppm { + Source(s) => { + // Silently ignores an identified node. + call_with_pp_support(&s, sess, None, move |annotation| { + debug!("pretty printing source code {:?}", s); + let sess = annotation.sess(); + let parse = &sess.parse_sess; + pprust::print_crate( + sess.source_map(), + krate, + src_name, + src, + annotation.pp_ann(), + false, + parse.edition, + ) + }) + } + AstTree(PpAstTreeMode::Normal) => { + debug!("pretty printing AST tree"); + format!("{:#?}", krate) + } + _ => unreachable!(), }; - write_output(out.into_bytes(), ofile); + write_or_print(&out, ofile); } pub fn print_after_hir_lowering<'tcx>( @@ -434,17 +435,14 @@ pub fn print_after_hir_lowering<'tcx>( let (src, src_name) = get_source(input, tcx.sess); - let mut out = String::new(); - - match ppm { - PpmSource(s) => { + let out = match ppm { + Source(s) => { // Silently ignores an identified node. - let out = &mut out; call_with_pp_support(&s, tcx.sess, Some(tcx), move |annotation| { debug!("pretty printing source code {:?}", s); let sess = annotation.sess(); let parse = &sess.parse_sess; - *out = pprust::print_crate( + pprust::print_crate( sess.source_map(), krate, src_name, @@ -456,28 +454,42 @@ pub fn print_after_hir_lowering<'tcx>( }) } - PpmHir(s) => { - let out = &mut out; - call_with_pp_support_hir(&s, tcx, move |annotation, krate| { - debug!("pretty printing source code {:?}", s); - let sess = annotation.sess(); - let sm = sess.source_map(); - *out = pprust_hir::print_crate(sm, krate, src_name, src, annotation.pp_ann()) - }) + AstTree(PpAstTreeMode::Expanded) => { + debug!("pretty-printing expanded AST"); + format!("{:#?}", krate) } - PpmHirTree(s) => { - let out = &mut out; - call_with_pp_support_hir(&s, tcx, move |_annotation, krate| { - debug!("pretty printing source code {:?}", s); - *out = format!("{:#?}", krate); - }); + Hir(s) => call_with_pp_support_hir(&s, tcx, move |annotation, krate| { + debug!("pretty printing HIR {:?}", s); + let sess = annotation.sess(); + let sm = sess.source_map(); + pprust_hir::print_crate(sm, krate, src_name, src, annotation.pp_ann()) + }), + + HirTree => call_with_pp_support_hir(&PpHirMode::Normal, tcx, move |_annotation, krate| { + debug!("pretty printing HIR tree"); + format!("{:#?}", krate) + }), + + ThirTree => { + let mut out = String::new(); + abort_on_err(rustc_typeck::check_crate(tcx), tcx.sess); + debug!("pretty printing THIR tree"); + for did in tcx.body_owners() { + let hir = tcx.hir(); + let body = hir.body(hir.body_owned_by(hir.local_def_id_to_hir_id(did))); + let arena = thir::Arena::default(); + let thir = + thir::build_thir(tcx, ty::WithOptConstParam::unknown(did), &arena, &body.value); + let _ = writeln!(out, "{:?}:\n{:#?}\n", did, thir); + } + out } _ => unreachable!(), - } + }; - write_output(out.into_bytes(), ofile); + write_or_print(&out, ofile); } // In an ideal world, this would be a public function called by the driver after @@ -494,16 +506,13 @@ fn print_with_analysis( tcx.analysis(LOCAL_CRATE)?; match ppm { - PpmMir | PpmMirCFG => match ppm { - PpmMir => write_mir_pretty(tcx, None, &mut out), - PpmMirCFG => write_mir_graphviz(tcx, None, &mut out), - _ => unreachable!(), - }, + Mir => write_mir_pretty(tcx, None, &mut out).unwrap(), + MirCFG => write_mir_graphviz(tcx, None, &mut out).unwrap(), _ => unreachable!(), } - .unwrap(); - write_output(out, ofile); + let out = std::str::from_utf8(&out).unwrap(); + write_or_print(out, ofile); Ok(()) } diff --git a/compiler/rustc_error_codes/src/error_codes.rs b/compiler/rustc_error_codes/src/error_codes.rs index 1ed43669ad..4b52973432 100644 --- a/compiler/rustc_error_codes/src/error_codes.rs +++ b/compiler/rustc_error_codes/src/error_codes.rs @@ -103,7 +103,6 @@ E0198: include_str!("./error_codes/E0198.md"), E0199: include_str!("./error_codes/E0199.md"), E0200: include_str!("./error_codes/E0200.md"), E0201: include_str!("./error_codes/E0201.md"), -E0202: include_str!("./error_codes/E0202.md"), E0203: include_str!("./error_codes/E0203.md"), E0204: include_str!("./error_codes/E0204.md"), E0205: include_str!("./error_codes/E0205.md"), @@ -285,7 +284,12 @@ E0537: include_str!("./error_codes/E0537.md"), E0538: include_str!("./error_codes/E0538.md"), E0539: include_str!("./error_codes/E0539.md"), E0541: include_str!("./error_codes/E0541.md"), +E0542: include_str!("./error_codes/E0542.md"), +E0543: include_str!("./error_codes/E0543.md"), +E0545: include_str!("./error_codes/E0545.md"), E0546: include_str!("./error_codes/E0546.md"), +E0547: include_str!("./error_codes/E0547.md"), +E0549: include_str!("./error_codes/E0549.md"), E0550: include_str!("./error_codes/E0550.md"), E0551: include_str!("./error_codes/E0551.md"), E0552: include_str!("./error_codes/E0552.md"), @@ -602,15 +606,8 @@ E0781: include_str!("./error_codes/E0781.md"), E0523, // E0526, // shuffle indices are not constant // E0540, // multiple rustc_deprecated attributes - E0542, // missing 'since' - E0543, // missing 'reason' E0544, // multiple stability levels - E0545, // incorrect 'issue' - E0547, // missing 'issue' // E0548, // replaced with a generic attribute input check - // rustc_deprecated attribute must be paired with either stable or unstable - // attribute - E0549, E0553, // multiple rustc_const_unstable attributes // E0555, // replaced with a generic attribute input check // E0558, // replaced with a generic attribute input check diff --git a/compiler/rustc_error_codes/src/error_codes/E0074.md b/compiler/rustc_error_codes/src/error_codes/E0074.md index e25dec7681..785d6de226 100644 --- a/compiler/rustc_error_codes/src/error_codes/E0074.md +++ b/compiler/rustc_error_codes/src/error_codes/E0074.md @@ -11,7 +11,7 @@ This will cause an error: #![feature(repr_simd)] #[repr(simd)] -struct Bad(T, T, T); +struct Bad(T, T, T, T); ``` This will not: @@ -20,5 +20,5 @@ This will not: #![feature(repr_simd)] #[repr(simd)] -struct Good(u32, u32, u32); +struct Good(u32, u32, u32, u32); ``` diff --git a/compiler/rustc_error_codes/src/error_codes/E0076.md b/compiler/rustc_error_codes/src/error_codes/E0076.md index f293a2a577..1da8caa950 100644 --- a/compiler/rustc_error_codes/src/error_codes/E0076.md +++ b/compiler/rustc_error_codes/src/error_codes/E0076.md @@ -7,7 +7,7 @@ Erroneous code example: #![feature(repr_simd)] #[repr(simd)] -struct Bad(u16, u32, u32); // error! +struct Bad(u16, u32, u32 u32); // error! ``` When using the `#[simd]` attribute to automatically use SIMD operations in tuple @@ -20,5 +20,5 @@ Fixed example: #![feature(repr_simd)] #[repr(simd)] -struct Good(u32, u32, u32); // ok! +struct Good(u32, u32, u32, u32); // ok! ``` diff --git a/compiler/rustc_error_codes/src/error_codes/E0077.md b/compiler/rustc_error_codes/src/error_codes/E0077.md index b14513c6cc..91aa24d1f5 100644 --- a/compiler/rustc_error_codes/src/error_codes/E0077.md +++ b/compiler/rustc_error_codes/src/error_codes/E0077.md @@ -19,5 +19,5 @@ Fixed example: #![feature(repr_simd)] #[repr(simd)] -struct Good(u32, u32, u32); // ok! +struct Good(u32, u32, u32, u32); // ok! ``` diff --git a/compiler/rustc_error_codes/src/error_codes/E0162.md b/compiler/rustc_error_codes/src/error_codes/E0162.md index 98146147f3..0161c9325c 100644 --- a/compiler/rustc_error_codes/src/error_codes/E0162.md +++ b/compiler/rustc_error_codes/src/error_codes/E0162.md @@ -1,6 +1,6 @@ #### Note: this error code is no longer emitted by the compiler. -An if-let pattern attempts to match the pattern, and enters the body if the +An `if let` pattern attempts to match the pattern, and enters the body if the match was successful. If the match is irrefutable (when it cannot fail to match), use a regular `let`-binding instead. For instance: diff --git a/compiler/rustc_error_codes/src/error_codes/E0165.md b/compiler/rustc_error_codes/src/error_codes/E0165.md index 92243db455..7bcd6c0cbf 100644 --- a/compiler/rustc_error_codes/src/error_codes/E0165.md +++ b/compiler/rustc_error_codes/src/error_codes/E0165.md @@ -1,6 +1,6 @@ #### Note: this error code is no longer emitted by the compiler. -A while-let pattern attempts to match the pattern, and enters the body if the +A `while let` pattern attempts to match the pattern, and enters the body if the match was successful. If the match is irrefutable (when it cannot fail to match), use a regular `let`-binding inside a `loop` instead. For instance: diff --git a/compiler/rustc_error_codes/src/error_codes/E0202.md b/compiler/rustc_error_codes/src/error_codes/E0202.md deleted file mode 100644 index afc61ec2e4..0000000000 --- a/compiler/rustc_error_codes/src/error_codes/E0202.md +++ /dev/null @@ -1,15 +0,0 @@ -Inherent associated types were part of [RFC 195] but are not yet implemented. -See [the tracking issue][iss8995] for the status of this implementation. - -Erroneous code example: - -```compile_fail,E0202 -struct Foo; - -impl Foo { - type Bar = isize; // error! -} -``` - -[RFC 195]: https://github.com/rust-lang/rfcs/blob/master/text/0195-associated-items.md -[iss8995]: https://github.com/rust-lang/rust/issues/8995 diff --git a/compiler/rustc_error_codes/src/error_codes/E0542.md b/compiler/rustc_error_codes/src/error_codes/E0542.md new file mode 100644 index 0000000000..7cb58f9d0c --- /dev/null +++ b/compiler/rustc_error_codes/src/error_codes/E0542.md @@ -0,0 +1,47 @@ +The `since` value is missing in a stability attribute. + +Erroneous code example: + +```compile_fail,E0542 +#![feature(staged_api)] +#![stable(since = "1.0.0", feature = "test")] + +#[stable(feature = "_stable_fn")] // invalid +fn _stable_fn() {} + +#[rustc_const_stable(feature = "_stable_const_fn")] // invalid +fn _stable_const_fn() {} + +#[stable(feature = "_deprecated_fn", since = "0.1.0")] +#[rustc_deprecated( + reason = "explanation for deprecation" +)] // invalid +fn _deprecated_fn() {} +``` + +To fix this issue, you need to provide the `since` field. Example: + +``` +#![feature(staged_api)] +#![stable(since = "1.0.0", feature = "test")] + +#[stable(feature = "_stable_fn", since = "1.0.0")] // ok! +fn _stable_fn() {} + +#[rustc_const_stable(feature = "_stable_const_fn", since = "1.0.0")] // ok! +fn _stable_const_fn() {} + +#[stable(feature = "_deprecated_fn", since = "0.1.0")] +#[rustc_deprecated( + since = "1.0.0", + reason = "explanation for deprecation" +)] // ok! +fn _deprecated_fn() {} +``` + +See the [How Rust is Made and “Nightly Rust”][how-rust-made-nightly] appendix +of the Book and the [Stability attributes][stability-attributes] section of the +Rustc Dev Guide for more details. + +[how-rust-made-nightly]: https://doc.rust-lang.org/book/appendix-07-nightly-rust.html +[stability-attributes]: https://rustc-dev-guide.rust-lang.org/stability.html diff --git a/compiler/rustc_error_codes/src/error_codes/E0543.md b/compiler/rustc_error_codes/src/error_codes/E0543.md new file mode 100644 index 0000000000..ba26f92e89 --- /dev/null +++ b/compiler/rustc_error_codes/src/error_codes/E0543.md @@ -0,0 +1,35 @@ +The `reason` value is missing in a stability attribute. + +Erroneous code example: + +```compile_fail,E0543 +#![feature(staged_api)] +#![stable(since = "1.0.0", feature = "test")] + +#[stable(since = "0.1.0", feature = "_deprecated_fn")] +#[rustc_deprecated( + since = "1.0.0" +)] // invalid +fn _deprecated_fn() {} +``` + +To fix this issue, you need to provide the `reason` field. Example: + +``` +#![feature(staged_api)] +#![stable(since = "1.0.0", feature = "test")] + +#[stable(since = "0.1.0", feature = "_deprecated_fn")] +#[rustc_deprecated( + since = "1.0.0", + reason = "explanation for deprecation" +)] // ok! +fn _deprecated_fn() {} +``` + +See the [How Rust is Made and “Nightly Rust”][how-rust-made-nightly] appendix +of the Book and the [Stability attributes][stability-attributes] section of the +Rustc Dev Guide for more details. + +[how-rust-made-nightly]: https://doc.rust-lang.org/book/appendix-07-nightly-rust.html +[stability-attributes]: https://rustc-dev-guide.rust-lang.org/stability.html diff --git a/compiler/rustc_error_codes/src/error_codes/E0545.md b/compiler/rustc_error_codes/src/error_codes/E0545.md new file mode 100644 index 0000000000..9fb935a3ab --- /dev/null +++ b/compiler/rustc_error_codes/src/error_codes/E0545.md @@ -0,0 +1,35 @@ +The `issue` value is incorrect in a stability attribute. + +Erroneous code example: + +```compile_fail,E0545 +#![feature(staged_api)] +#![stable(since = "1.0.0", feature = "test")] + +#[unstable(feature = "_unstable_fn", issue = "0")] // invalid +fn _unstable_fn() {} + +#[rustc_const_unstable(feature = "_unstable_const_fn", issue = "0")] // invalid +fn _unstable_const_fn() {} +``` + +To fix this issue, you need to provide a correct value in the `issue` field. +Example: + +``` +#![feature(staged_api)] +#![stable(since = "1.0.0", feature = "test")] + +#[unstable(feature = "_unstable_fn", issue = "none")] // ok! +fn _unstable_fn() {} + +#[rustc_const_unstable(feature = "_unstable_const_fn", issue = "1")] // ok! +fn _unstable_const_fn() {} +``` + +See the [How Rust is Made and “Nightly Rust”][how-rust-made-nightly] appendix +of the Book and the [Stability attributes][stability-attributes] section of the +Rustc Dev Guide for more details. + +[how-rust-made-nightly]: https://doc.rust-lang.org/book/appendix-07-nightly-rust.html +[stability-attributes]: https://rustc-dev-guide.rust-lang.org/stability.html diff --git a/compiler/rustc_error_codes/src/error_codes/E0546.md b/compiler/rustc_error_codes/src/error_codes/E0546.md index b2df22c0f8..a33dcb7a9a 100644 --- a/compiler/rustc_error_codes/src/error_codes/E0546.md +++ b/compiler/rustc_error_codes/src/error_codes/E0546.md @@ -1,4 +1,4 @@ -A feature name is missing. +The `feature` value is missing in a stability attribute. Erroneous code example: @@ -13,7 +13,7 @@ fn unstable_fn() {} fn stable_fn() {} ``` -To fix the issue you need to provide a feature name. +To fix this issue, you need to provide the `feature` field. Example: ``` #![feature(staged_api)] @@ -25,3 +25,10 @@ fn unstable_fn() {} #[stable(feature = "stable_fn", since = "1.0.0")] // ok! fn stable_fn() {} ``` + +See the [How Rust is Made and “Nightly Rust”][how-rust-made-nightly] appendix +of the Book and the [Stability attributes][stability-attributes] section of the +Rustc Dev Guide for more details. + +[how-rust-made-nightly]: https://doc.rust-lang.org/book/appendix-07-nightly-rust.html +[stability-attributes]: https://rustc-dev-guide.rust-lang.org/stability.html diff --git a/compiler/rustc_error_codes/src/error_codes/E0547.md b/compiler/rustc_error_codes/src/error_codes/E0547.md new file mode 100644 index 0000000000..1aa4b35424 --- /dev/null +++ b/compiler/rustc_error_codes/src/error_codes/E0547.md @@ -0,0 +1,37 @@ +The `issue` value is missing in a stability attribute. + +Erroneous code example: + +```compile_fail,E0547 +#![feature(staged_api)] +#![stable(since = "1.0.0", feature = "test")] + +#[unstable(feature = "_unstable_fn")] // invalid +fn _unstable_fn() {} + +#[rustc_const_unstable(feature = "_unstable_const_fn")] // invalid +fn _unstable_const_fn() {} +``` + +To fix this issue, you need to provide the `issue` field. Example: + +``` +#![feature(staged_api)] +#![stable(since = "1.0.0", feature = "test")] + +#[unstable(feature = "_unstable_fn", issue = "none")] // ok! +fn _unstable_fn() {} + +#[rustc_const_unstable( + feature = "_unstable_const_fn", + issue = "none" +)] // ok! +fn _unstable_const_fn() {} +``` + +See the [How Rust is Made and “Nightly Rust”][how-rust-made-nightly] appendix +of the Book and the [Stability attributes][stability-attributes] section of the +Rustc Dev Guide for more details. + +[how-rust-made-nightly]: https://doc.rust-lang.org/book/appendix-07-nightly-rust.html +[stability-attributes]: https://rustc-dev-guide.rust-lang.org/stability.html diff --git a/compiler/rustc_error_codes/src/error_codes/E0549.md b/compiler/rustc_error_codes/src/error_codes/E0549.md new file mode 100644 index 0000000000..d4b78e7e0d --- /dev/null +++ b/compiler/rustc_error_codes/src/error_codes/E0549.md @@ -0,0 +1,37 @@ +A `rustc_deprecated` attribute wasn't paired with a `stable`/`unstable` +attribute. + +Erroneous code example: + +```compile_fail,E0549 +#![feature(staged_api)] +#![stable(since = "1.0.0", feature = "test")] + +#[rustc_deprecated( + since = "1.0.1", + reason = "explanation for deprecation" +)] // invalid +fn _deprecated_fn() {} +``` + +To fix this issue, you need to add also an attribute `stable` or `unstable`. +Example: + +``` +#![feature(staged_api)] +#![stable(since = "1.0.0", feature = "test")] + +#[stable(since = "1.0.0", feature = "test")] +#[rustc_deprecated( + since = "1.0.1", + reason = "explanation for deprecation" +)] // ok! +fn _deprecated_fn() {} +``` + +See the [How Rust is Made and “Nightly Rust”][how-rust-made-nightly] appendix +of the Book and the [Stability attributes][stability-attributes] section of the +Rustc Dev Guide for more details. + +[how-rust-made-nightly]: https://doc.rust-lang.org/book/appendix-07-nightly-rust.html +[stability-attributes]: https://rustc-dev-guide.rust-lang.org/stability.html diff --git a/compiler/rustc_error_codes/src/error_codes/E0761.md b/compiler/rustc_error_codes/src/error_codes/E0761.md index e112674fbc..760c589769 100644 --- a/compiler/rustc_error_codes/src/error_codes/E0761.md +++ b/compiler/rustc_error_codes/src/error_codes/E0761.md @@ -2,7 +2,7 @@ Multiple candidate files were found for an out-of-line module. Erroneous code example: -```ignore (multiple source files required for compile_fail) +```ignore (Multiple source files are required for compile_fail.) // file: ambiguous_module/mod.rs fn foo() {} diff --git a/compiler/rustc_error_codes/src/lib.rs b/compiler/rustc_error_codes/src/lib.rs index e4a7025314..14ddb3e207 100644 --- a/compiler/rustc_error_codes/src/lib.rs +++ b/compiler/rustc_error_codes/src/lib.rs @@ -1,4 +1,5 @@ -#![deny(invalid_codeblock_attributes)] +#![cfg_attr(bootstrap, deny(invalid_codeblock_attributes))] +#![cfg_attr(not(bootstrap), deny(rustdoc::invalid_codeblock_attributes))] //! This library is used to gather all error codes into one place, //! the goal being to make their maintenance easier. diff --git a/compiler/rustc_errors/src/diagnostic.rs b/compiler/rustc_errors/src/diagnostic.rs index e61476bf23..ce5b130dd9 100644 --- a/compiler/rustc_errors/src/diagnostic.rs +++ b/compiler/rustc_errors/src/diagnostic.rs @@ -4,7 +4,9 @@ use crate::Level; use crate::Substitution; use crate::SubstitutionPart; use crate::SuggestionStyle; +use crate::ToolMetadata; use rustc_lint_defs::Applicability; +use rustc_serialize::json::Json; use rustc_span::{MultiSpan, Span, DUMMY_SP}; use std::fmt; @@ -293,6 +295,7 @@ impl Diagnostic { suggestion: Vec<(Span, String)>, applicability: Applicability, ) -> &mut Self { + assert!(!suggestion.is_empty()); self.suggestions.push(CodeSuggestion { substitutions: vec![Substitution { parts: suggestion @@ -303,6 +306,7 @@ impl Diagnostic { msg: msg.to_owned(), style: SuggestionStyle::ShowCode, applicability, + tool_metadata: Default::default(), }); self } @@ -315,6 +319,10 @@ impl Diagnostic { suggestions: Vec>, applicability: Applicability, ) -> &mut Self { + assert!(!suggestions.is_empty()); + for s in &suggestions { + assert!(!s.is_empty()); + } self.suggestions.push(CodeSuggestion { substitutions: suggestions .into_iter() @@ -328,6 +336,7 @@ impl Diagnostic { msg: msg.to_owned(), style: SuggestionStyle::ShowCode, applicability, + tool_metadata: Default::default(), }); self } @@ -344,6 +353,7 @@ impl Diagnostic { suggestion: Vec<(Span, String)>, applicability: Applicability, ) -> &mut Self { + assert!(!suggestion.is_empty()); self.suggestions.push(CodeSuggestion { substitutions: vec![Substitution { parts: suggestion @@ -354,6 +364,7 @@ impl Diagnostic { msg: msg.to_owned(), style: SuggestionStyle::CompletelyHidden, applicability, + tool_metadata: Default::default(), }); self } @@ -408,6 +419,7 @@ impl Diagnostic { msg: msg.to_owned(), style, applicability, + tool_metadata: Default::default(), }); self } @@ -446,6 +458,7 @@ impl Diagnostic { msg: msg.to_owned(), style: SuggestionStyle::ShowCode, applicability, + tool_metadata: Default::default(), }); self } @@ -515,6 +528,23 @@ impl Diagnostic { self } + /// Adds a suggestion intended only for a tool. The intent is that the metadata encodes + /// the suggestion in a tool-specific way, as it may not even directly involve Rust code. + pub fn tool_only_suggestion_with_metadata( + &mut self, + msg: &str, + applicability: Applicability, + tool_metadata: Json, + ) { + self.suggestions.push(CodeSuggestion { + substitutions: vec![], + msg: msg.to_owned(), + style: SuggestionStyle::CompletelyHidden, + applicability, + tool_metadata: ToolMetadata::new(tool_metadata), + }) + } + pub fn set_span>(&mut self, sp: S) -> &mut Self { self.span = sp.into(); if let Some(span) = self.span.primary_span() { diff --git a/compiler/rustc_errors/src/diagnostic_builder.rs b/compiler/rustc_errors/src/diagnostic_builder.rs index c09cce21bf..79507e6152 100644 --- a/compiler/rustc_errors/src/diagnostic_builder.rs +++ b/compiler/rustc_errors/src/diagnostic_builder.rs @@ -30,15 +30,6 @@ struct DiagnosticBuilderInner<'a> { allow_suggestions: bool, } -/// This is a helper macro for [`forward!`] that allows automatically adding documentation -/// that uses tokens from [`forward!`]'s input. -macro_rules! forward_inner_docs { - ($e:expr => $i:item) => { - #[doc = $e] - $i - }; -} - /// In general, the `DiagnosticBuilder` uses deref to allow access to /// the fields and methods of the embedded `diagnostic` in a /// transparent way. *However,* many of the methods are intended to @@ -54,11 +45,11 @@ macro_rules! forward { pub fn $n:ident(&self, $($name:ident: $ty:ty),* $(,)?) -> &Self ) => { $(#[$attrs])* - forward_inner_docs!(concat!("See [`Diagnostic::", stringify!($n), "()`].") => + #[doc = concat!("See [`Diagnostic::", stringify!($n), "()`].")] pub fn $n(&self, $($name: $ty),*) -> &Self { self.diagnostic.$n($($name),*); self - }); + } }; // Forward pattern for &mut self -> &mut Self @@ -67,11 +58,11 @@ macro_rules! forward { pub fn $n:ident(&mut self, $($name:ident: $ty:ty),* $(,)?) -> &mut Self ) => { $(#[$attrs])* - forward_inner_docs!(concat!("See [`Diagnostic::", stringify!($n), "()`].") => + #[doc = concat!("See [`Diagnostic::", stringify!($n), "()`].")] pub fn $n(&mut self, $($name: $ty),*) -> &mut Self { self.0.diagnostic.$n($($name),*); self - }); + } }; // Forward pattern for &mut self -> &mut Self, with generic parameters. @@ -84,11 +75,11 @@ macro_rules! forward { ) -> &mut Self ) => { $(#[$attrs])* - forward_inner_docs!(concat!("See [`Diagnostic::", stringify!($n), "()`].") => + #[doc = concat!("See [`Diagnostic::", stringify!($n), "()`].")] pub fn $n<$($generic: $bound),*>(&mut self, $($name: $ty),*) -> &mut Self { self.0.diagnostic.$n($($name),*); self - }); + } }; } diff --git a/compiler/rustc_errors/src/emitter.rs b/compiler/rustc_errors/src/emitter.rs index ea62e21523..9b6f67166b 100644 --- a/compiler/rustc_errors/src/emitter.rs +++ b/compiler/rustc_errors/src/emitter.rs @@ -1713,7 +1713,8 @@ impl EmitterWriter { let max_line_num_len = if self.ui_testing { ANONYMIZED_LINE_NUM.len() } else { - self.get_max_line_num(span, children).to_string().len() + let n = self.get_max_line_num(span, children); + num_decimal_digits(n) }; match self.emit_message_default(span, message, code, level, max_line_num_len, false) { @@ -1941,6 +1942,30 @@ impl FileWithAnnotatedLines { } } +// instead of taking the String length or dividing by 10 while > 0, we multiply a limit by 10 until +// we're higher. If the loop isn't exited by the `return`, the last multiplication will wrap, which +// is OK, because while we cannot fit a higher power of 10 in a usize, the loop will end anyway. +// This is also why we need the max number of decimal digits within a `usize`. +fn num_decimal_digits(num: usize) -> usize { + #[cfg(target_pointer_width = "64")] + const MAX_DIGITS: usize = 20; + + #[cfg(target_pointer_width = "32")] + const MAX_DIGITS: usize = 10; + + #[cfg(target_pointer_width = "16")] + const MAX_DIGITS: usize = 5; + + let mut lim = 10; + for num_digits in 1..MAX_DIGITS { + if num < lim { + return num_digits; + } + lim = lim.wrapping_mul(10); + } + MAX_DIGITS +} + fn replace_tabs(str: &str) -> String { str.replace('\t', " ") } diff --git a/compiler/rustc_errors/src/json.rs b/compiler/rustc_errors/src/json.rs index d57beb1148..c27b39a9d6 100644 --- a/compiler/rustc_errors/src/json.rs +++ b/compiler/rustc_errors/src/json.rs @@ -14,6 +14,7 @@ use rustc_span::source_map::{FilePathMapping, SourceMap}; use crate::emitter::{Emitter, HumanReadableErrorType}; use crate::registry::Registry; use crate::DiagnosticId; +use crate::ToolMetadata; use crate::{CodeSuggestion, SubDiagnostic}; use rustc_lint_defs::{Applicability, FutureBreakage}; @@ -26,6 +27,7 @@ use std::sync::{Arc, Mutex}; use std::vec; use rustc_serialize::json::{as_json, as_pretty_json}; +use rustc_serialize::{Encodable, Encoder}; #[cfg(test)] mod tests; @@ -168,7 +170,8 @@ impl Emitter for JsonEmitter { // The following data types are provided just for serialisation. -#[derive(Encodable)] +// NOTE: this has a manual implementation of Encodable which needs to be updated in +// parallel. struct Diagnostic { /// The primary error message. message: String, @@ -180,6 +183,65 @@ struct Diagnostic { children: Vec, /// The message as rustc would render it. rendered: Option, + /// Extra tool metadata + tool_metadata: ToolMetadata, +} + +macro_rules! encode_fields { + ( + $enc:expr, // encoder + $idx:expr, // starting field index + $struct:expr, // struct we're serializing + $struct_name:ident, // struct name + [ $($name:ident),+$(,)? ], // fields to encode + [ $($ignore:ident),+$(,)? ] // fields we're skipping + ) => { + { + // Pattern match to make sure all fields are accounted for + let $struct_name { $($name,)+ $($ignore: _,)+ } = $struct; + let mut idx = $idx; + $( + $enc.emit_struct_field( + stringify!($name), + idx, + |enc| $name.encode(enc), + )?; + idx += 1; + )+ + idx + } + }; +} + +// Special-case encoder to skip tool_metadata if not set +impl Encodable for Diagnostic { + fn encode(&self, s: &mut E) -> Result<(), E::Error> { + s.emit_struct("diagnostic", 7, |s| { + let mut idx = 0; + + idx = encode_fields!( + s, + idx, + self, + Self, + [message, code, level, spans, children, rendered], + [tool_metadata] + ); + if self.tool_metadata.is_set() { + idx = encode_fields!( + s, + idx, + self, + Self, + [tool_metadata], + [message, code, level, spans, children, rendered] + ); + } + + let _ = idx; + Ok(()) + }) + } } #[derive(Encodable)] @@ -269,6 +331,7 @@ impl Diagnostic { spans: DiagnosticSpan::from_suggestion(sugg, je), children: vec![], rendered: None, + tool_metadata: sugg.tool_metadata.clone(), }); // generate regular command line output and store it in the json @@ -312,6 +375,7 @@ impl Diagnostic { .chain(sugg) .collect(), rendered: Some(output), + tool_metadata: ToolMetadata::default(), } } @@ -327,6 +391,7 @@ impl Diagnostic { .unwrap_or_else(|| DiagnosticSpan::from_multispan(&diag.span, je)), children: vec![], rendered: None, + tool_metadata: ToolMetadata::default(), } } } diff --git a/compiler/rustc_errors/src/lib.rs b/compiler/rustc_errors/src/lib.rs index aa88233209..fa855f544e 100644 --- a/compiler/rustc_errors/src/lib.rs +++ b/compiler/rustc_errors/src/lib.rs @@ -5,6 +5,7 @@ #![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")] #![feature(crate_visibility_modifier)] #![feature(backtrace)] +#![feature(extended_key_value_attributes)] #![feature(nll)] #[macro_use] @@ -23,10 +24,14 @@ use rustc_data_structures::sync::{self, Lock, Lrc}; use rustc_data_structures::AtomicRef; use rustc_lint_defs::FutureBreakage; pub use rustc_lint_defs::{pluralize, Applicability}; +use rustc_serialize::json::Json; +use rustc_serialize::{Decodable, Decoder, Encodable, Encoder}; use rustc_span::source_map::SourceMap; use rustc_span::{Loc, MultiSpan, Span}; use std::borrow::Cow; +use std::hash::{Hash, Hasher}; +use std::num::NonZeroUsize; use std::panic; use std::path::Path; use std::{error, fmt}; @@ -48,7 +53,7 @@ pub type PResult<'a, T> = Result>; // `PResult` is used a lot. Make sure it doesn't unintentionally get bigger. // (See also the comment on `DiagnosticBuilderInner`.) -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] rustc_data_structures::static_assert_size!(PResult<'_, bool>, 16); #[derive(Debug, PartialEq, Eq, Clone, Copy, Hash, Encodable, Decodable)] @@ -73,6 +78,39 @@ impl SuggestionStyle { } } +#[derive(Clone, Debug, PartialEq, Default)] +pub struct ToolMetadata(pub Option); + +impl ToolMetadata { + fn new(json: Json) -> Self { + ToolMetadata(Some(json)) + } + + fn is_set(&self) -> bool { + self.0.is_some() + } +} + +impl Hash for ToolMetadata { + fn hash(&self, _state: &mut H) {} +} + +// Doesn't really need to round-trip +impl Decodable for ToolMetadata { + fn decode(_d: &mut D) -> Result { + Ok(ToolMetadata(None)) + } +} + +impl Encodable for ToolMetadata { + fn encode(&self, e: &mut S) -> Result<(), S::Error> { + match &self.0 { + None => e.emit_unit(), + Some(json) => json.encode(e), + } + } +} + #[derive(Clone, Debug, PartialEq, Hash, Encodable, Decodable)] pub struct CodeSuggestion { /// Each substitute can have multiple variants due to multiple @@ -106,6 +144,8 @@ pub struct CodeSuggestion { /// which are useful for users but not useful for /// tools like rustfix pub applicability: Applicability, + /// Tool-specific metadata + pub tool_metadata: ToolMetadata, } #[derive(Clone, Debug, PartialEq, Hash, Encodable, Decodable)] @@ -321,7 +361,7 @@ pub struct HandlerFlags { pub can_emit_warnings: bool, /// If true, error-level diagnostics are upgraded to bug-level. /// (rustc: see `-Z treat-err-as-bug`) - pub treat_err_as_bug: Option, + pub treat_err_as_bug: Option, /// If true, immediately emit diagnostics that would otherwise be buffered. /// (rustc: see `-Z dont-buffer-diagnostics` and `-Z treat-err-as-bug`) pub dont_buffer_diagnostics: bool, @@ -358,7 +398,7 @@ impl Handler { pub fn with_tty_emitter( color_config: ColorConfig, can_emit_warnings: bool, - treat_err_as_bug: Option, + treat_err_as_bug: Option, sm: Option>, ) -> Self { Self::with_tty_emitter_and_flags( @@ -386,7 +426,7 @@ impl Handler { pub fn with_emitter( can_emit_warnings: bool, - treat_err_as_bug: Option, + treat_err_as_bug: Option, emitter: Box, ) -> Self { Handler::with_emitter_and_flags( @@ -775,7 +815,6 @@ impl HandlerInner { } let already_emitted = |this: &mut Self| { - use std::hash::Hash; let mut hasher = StableHasher::new(); diagnostic.hash(&mut hasher); let diagnostic_hash = hasher.finish(); @@ -804,7 +843,7 @@ impl HandlerInner { } fn treat_err_as_bug(&self) -> bool { - self.flags.treat_err_as_bug.map_or(false, |c| self.err_count() >= c) + self.flags.treat_err_as_bug.map_or(false, |c| self.err_count() >= c.get()) } fn print_error_count(&mut self, registry: &Registry) { @@ -913,7 +952,7 @@ impl HandlerInner { // This is technically `self.treat_err_as_bug()` but `delay_span_bug` is called before // incrementing `err_count` by one, so we need to +1 the comparing. // FIXME: Would be nice to increment err_count in a more coherent way. - if self.flags.treat_err_as_bug.map_or(false, |c| self.err_count() + 1 >= c) { + if self.flags.treat_err_as_bug.map_or(false, |c| self.err_count() + 1 >= c.get()) { // FIXME: don't abort here if report_delayed_bugs is off self.span_bug(sp, msg); } @@ -986,7 +1025,7 @@ impl HandlerInner { fn panic_if_treat_err_as_bug(&self) { if self.treat_err_as_bug() { - match (self.err_count(), self.flags.treat_err_as_bug.unwrap_or(0)) { + match (self.err_count(), self.flags.treat_err_as_bug.map(|c| c.get()).unwrap_or(0)) { (1, 1) => panic!("aborting due to `-Z treat-err-as-bug=1`"), (0, _) | (1, _) => {} (count, as_bug) => panic!( diff --git a/compiler/rustc_expand/Cargo.toml b/compiler/rustc_expand/Cargo.toml index 7413b0d943..59c1604e84 100644 --- a/compiler/rustc_expand/Cargo.toml +++ b/compiler/rustc_expand/Cargo.toml @@ -23,5 +23,5 @@ rustc_macros = { path = "../rustc_macros" } rustc_lexer = { path = "../rustc_lexer" } rustc_parse = { path = "../rustc_parse" } rustc_session = { path = "../rustc_session" } -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } rustc_ast = { path = "../rustc_ast" } diff --git a/compiler/rustc_expand/src/base.rs b/compiler/rustc_expand/src/base.rs index 08543d1622..594b9a82ad 100644 --- a/compiler/rustc_expand/src/base.rs +++ b/compiler/rustc_expand/src/base.rs @@ -1,15 +1,17 @@ use crate::expand::{self, AstFragment, Invocation}; -use crate::module::DirectoryOwnership; +use crate::module::DirOwnership; use rustc_ast::ptr::P; use rustc_ast::token::{self, Nonterminal}; -use rustc_ast::tokenstream::{CanSynthesizeMissingTokens, TokenStream}; +use rustc_ast::tokenstream::{CanSynthesizeMissingTokens, LazyTokenStream, TokenStream}; use rustc_ast::visit::{AssocCtxt, Visitor}; -use rustc_ast::{self as ast, Attribute, NodeId, PatKind}; -use rustc_attr::{self as attr, Deprecation, HasAttrs, Stability}; +use rustc_ast::{self as ast, AstLike, Attribute, Item, NodeId, PatKind}; +use rustc_attr::{self as attr, Deprecation, Stability}; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::sync::{self, Lrc}; use rustc_errors::{DiagnosticBuilder, ErrorReported}; +use rustc_lint_defs::builtin::PROC_MACRO_BACK_COMPAT; +use rustc_lint_defs::BuiltinLintDiagnostics; use rustc_parse::{self, nt_to_tokenstream, parser, MACRO_ARGUMENTS}; use rustc_session::{parse::ParseSess, Limit, Session}; use rustc_span::def_id::DefId; @@ -36,15 +38,15 @@ pub enum Annotatable { Stmt(P), Expr(P), Arm(ast::Arm), - Field(ast::Field), - FieldPat(ast::FieldPat), + ExprField(ast::ExprField), + PatField(ast::PatField), GenericParam(ast::GenericParam), Param(ast::Param), - StructField(ast::StructField), + FieldDef(ast::FieldDef), Variant(ast::Variant), } -impl HasAttrs for Annotatable { +impl AstLike for Annotatable { fn attrs(&self) -> &[Attribute] { match *self { Annotatable::Item(ref item) => &item.attrs, @@ -54,11 +56,11 @@ impl HasAttrs for Annotatable { Annotatable::Stmt(ref stmt) => stmt.attrs(), Annotatable::Expr(ref expr) => &expr.attrs, Annotatable::Arm(ref arm) => &arm.attrs, - Annotatable::Field(ref field) => &field.attrs, - Annotatable::FieldPat(ref fp) => &fp.attrs, + Annotatable::ExprField(ref field) => &field.attrs, + Annotatable::PatField(ref fp) => &fp.attrs, Annotatable::GenericParam(ref gp) => &gp.attrs, Annotatable::Param(ref p) => &p.attrs, - Annotatable::StructField(ref sf) => &sf.attrs, + Annotatable::FieldDef(ref sf) => &sf.attrs, Annotatable::Variant(ref v) => &v.attrs(), } } @@ -72,14 +74,32 @@ impl HasAttrs for Annotatable { Annotatable::Stmt(stmt) => stmt.visit_attrs(f), Annotatable::Expr(expr) => expr.visit_attrs(f), Annotatable::Arm(arm) => arm.visit_attrs(f), - Annotatable::Field(field) => field.visit_attrs(f), - Annotatable::FieldPat(fp) => fp.visit_attrs(f), + Annotatable::ExprField(field) => field.visit_attrs(f), + Annotatable::PatField(fp) => fp.visit_attrs(f), Annotatable::GenericParam(gp) => gp.visit_attrs(f), Annotatable::Param(p) => p.visit_attrs(f), - Annotatable::StructField(sf) => sf.visit_attrs(f), + Annotatable::FieldDef(sf) => sf.visit_attrs(f), Annotatable::Variant(v) => v.visit_attrs(f), } } + + fn tokens_mut(&mut self) -> Option<&mut Option> { + match self { + Annotatable::Item(item) => item.tokens_mut(), + Annotatable::TraitItem(trait_item) => trait_item.tokens_mut(), + Annotatable::ImplItem(impl_item) => impl_item.tokens_mut(), + Annotatable::ForeignItem(foreign_item) => foreign_item.tokens_mut(), + Annotatable::Stmt(stmt) => stmt.tokens_mut(), + Annotatable::Expr(expr) => expr.tokens_mut(), + Annotatable::Arm(arm) => arm.tokens_mut(), + Annotatable::ExprField(field) => field.tokens_mut(), + Annotatable::PatField(fp) => fp.tokens_mut(), + Annotatable::GenericParam(gp) => gp.tokens_mut(), + Annotatable::Param(p) => p.tokens_mut(), + Annotatable::FieldDef(sf) => sf.tokens_mut(), + Annotatable::Variant(v) => v.tokens_mut(), + } + } } impl Annotatable { @@ -92,11 +112,11 @@ impl Annotatable { Annotatable::Stmt(ref stmt) => stmt.span, Annotatable::Expr(ref expr) => expr.span, Annotatable::Arm(ref arm) => arm.span, - Annotatable::Field(ref field) => field.span, - Annotatable::FieldPat(ref fp) => fp.pat.span, + Annotatable::ExprField(ref field) => field.span, + Annotatable::PatField(ref fp) => fp.pat.span, Annotatable::GenericParam(ref gp) => gp.ident.span, Annotatable::Param(ref p) => p.span, - Annotatable::StructField(ref sf) => sf.span, + Annotatable::FieldDef(ref sf) => sf.span, Annotatable::Variant(ref v) => v.span, } } @@ -110,11 +130,11 @@ impl Annotatable { Annotatable::Stmt(stmt) => visitor.visit_stmt(stmt), Annotatable::Expr(expr) => visitor.visit_expr(expr), Annotatable::Arm(arm) => visitor.visit_arm(arm), - Annotatable::Field(field) => visitor.visit_field(field), - Annotatable::FieldPat(fp) => visitor.visit_field_pattern(fp), + Annotatable::ExprField(field) => visitor.visit_expr_field(field), + Annotatable::PatField(fp) => visitor.visit_pat_field(fp), Annotatable::GenericParam(gp) => visitor.visit_generic_param(gp), Annotatable::Param(p) => visitor.visit_param(p), - Annotatable::StructField(sf) => visitor.visit_struct_field(sf), + Annotatable::FieldDef(sf) => visitor.visit_field_def(sf), Annotatable::Variant(v) => visitor.visit_variant(v), } } @@ -131,17 +151,20 @@ impl Annotatable { Annotatable::Stmt(stmt) => token::NtStmt(stmt.into_inner()), Annotatable::Expr(expr) => token::NtExpr(expr), Annotatable::Arm(..) - | Annotatable::Field(..) - | Annotatable::FieldPat(..) + | Annotatable::ExprField(..) + | Annotatable::PatField(..) | Annotatable::GenericParam(..) | Annotatable::Param(..) - | Annotatable::StructField(..) + | Annotatable::FieldDef(..) | Annotatable::Variant(..) => panic!("unexpected annotatable"), } } crate fn into_tokens(self, sess: &ParseSess) -> TokenStream { - nt_to_tokenstream(&self.into_nonterminal(), sess, CanSynthesizeMissingTokens::No) + // Tokens of an attribute target may be invalidated by some outer `#[derive]` performing + // "full configuration" (attributes following derives on the same item should be the most + // common case), that's why synthesizing tokens is allowed. + nt_to_tokenstream(&self.into_nonterminal(), sess, CanSynthesizeMissingTokens::Yes) } pub fn expect_item(self) -> P { @@ -193,16 +216,16 @@ impl Annotatable { } } - pub fn expect_field(self) -> ast::Field { + pub fn expect_expr_field(self) -> ast::ExprField { match self { - Annotatable::Field(field) => field, + Annotatable::ExprField(field) => field, _ => panic!("expected field"), } } - pub fn expect_field_pattern(self) -> ast::FieldPat { + pub fn expect_pat_field(self) -> ast::PatField { match self { - Annotatable::FieldPat(fp) => fp, + Annotatable::PatField(fp) => fp, _ => panic!("expected field pattern"), } } @@ -221,9 +244,9 @@ impl Annotatable { } } - pub fn expect_struct_field(self) -> ast::StructField { + pub fn expect_field_def(self) -> ast::FieldDef { match self { - Annotatable::StructField(sf) => sf, + Annotatable::FieldDef(sf) => sf, _ => panic!("expected struct field"), } } @@ -234,25 +257,6 @@ impl Annotatable { _ => panic!("expected variant"), } } - - pub fn derive_allowed(&self) -> bool { - match *self { - Annotatable::Stmt(ref stmt) => match stmt.kind { - ast::StmtKind::Item(ref item) => matches!( - item.kind, - ast::ItemKind::Struct(..) | ast::ItemKind::Enum(..) | ast::ItemKind::Union(..) - ), - _ => false, - }, - Annotatable::Item(ref item) => match item.kind { - ast::ItemKind::Struct(..) | ast::ItemKind::Enum(..) | ast::ItemKind::Union(..) => { - true - } - _ => false, - }, - _ => false, - } - } } /// Result of an expansion that may need to be retried. @@ -428,11 +432,11 @@ pub trait MacResult { None } - fn make_fields(self: Box) -> Option> { + fn make_expr_fields(self: Box) -> Option> { None } - fn make_field_patterns(self: Box) -> Option> { + fn make_pat_fields(self: Box) -> Option> { None } @@ -444,7 +448,7 @@ pub trait MacResult { None } - fn make_struct_fields(self: Box) -> Option> { + fn make_field_defs(self: Box) -> Option> { None } @@ -628,11 +632,11 @@ impl MacResult for DummyResult { Some(SmallVec::new()) } - fn make_fields(self: Box) -> Option> { + fn make_expr_fields(self: Box) -> Option> { Some(SmallVec::new()) } - fn make_field_patterns(self: Box) -> Option> { + fn make_pat_fields(self: Box) -> Option> { Some(SmallVec::new()) } @@ -644,7 +648,7 @@ impl MacResult for DummyResult { Some(SmallVec::new()) } - fn make_struct_fields(self: Box) -> Option> { + fn make_field_defs(self: Box) -> Option> { Some(SmallVec::new()) } @@ -772,8 +776,8 @@ impl SyntaxExtension { name: Symbol, attrs: &[ast::Attribute], ) -> SyntaxExtension { - let allow_internal_unstable = attr::allow_internal_unstable(sess, &attrs) - .map(|features| features.collect::>().into()); + let allow_internal_unstable = + attr::allow_internal_unstable(sess, &attrs).collect::>(); let mut local_inner_macros = false; if let Some(macro_export) = sess.find_by_name(attrs, sym::macro_export) { @@ -786,19 +790,26 @@ impl SyntaxExtension { .find_by_name(attrs, sym::rustc_builtin_macro) .map(|a| a.value_str().unwrap_or(name)); let (stability, const_stability) = attr::find_stability(&sess, attrs, span); - if const_stability.is_some() { + if let Some((_, sp)) = const_stability { sess.parse_sess .span_diagnostic - .span_err(span, "macros cannot have const stability attributes"); + .struct_span_err(sp, "macros cannot have const stability attributes") + .span_label(sp, "invalid const stability attribute") + .span_label( + sess.source_map().guess_head_span(span), + "const stability attribute affects this macro", + ) + .emit(); } SyntaxExtension { kind, span, - allow_internal_unstable, + allow_internal_unstable: (!allow_internal_unstable.is_empty()) + .then(|| allow_internal_unstable.into()), allow_internal_unsafe: sess.contains_name(attrs, sym::allow_internal_unsafe), local_inner_macros, - stability, + stability: stability.map(|(s, _)| s), deprecation: attr::find_deprecation(&sess, attrs).map(|(d, _)| d), helper_attrs, edition, @@ -854,12 +865,6 @@ impl SyntaxExtension { } } -/// Result of resolving a macro invocation. -pub enum InvocationRes { - Single(Lrc), - DeriveContainer(Vec>), -} - /// Error type that denotes indeterminacy. pub struct Indeterminate; @@ -885,24 +890,53 @@ pub trait ResolverExpand { invoc: &Invocation, eager_expansion_root: ExpnId, force: bool, - ) -> Result; + ) -> Result, Indeterminate>; fn check_unused_macros(&mut self); /// Some parent node that is close enough to the given macro call. - fn lint_node_id(&mut self, expn_id: ExpnId) -> NodeId; + fn lint_node_id(&self, expn_id: ExpnId) -> NodeId; // Resolver interfaces for specific built-in macros. /// Does `#[derive(...)]` attribute with the given `ExpnId` have built-in `Copy` inside it? fn has_derive_copy(&self, expn_id: ExpnId) -> bool; + /// Resolve paths inside the `#[derive(...)]` attribute with the given `ExpnId`. + fn resolve_derives( + &mut self, + expn_id: ExpnId, + derives: Vec, + force: bool, + ) -> Result<(), Indeterminate>; + /// Take resolutions for paths inside the `#[derive(...)]` attribute with the given `ExpnId` + /// back from resolver. + fn take_derive_resolutions( + &mut self, + expn_id: ExpnId, + ) -> Option, ast::Path)>>; /// Path resolution logic for `#[cfg_accessible(path)]`. fn cfg_accessible(&mut self, expn_id: ExpnId, path: &ast::Path) -> Result; } -#[derive(Clone)] +#[derive(Clone, Default)] pub struct ModuleData { + /// Path to the module starting from the crate name, like `my_crate::foo::bar`. pub mod_path: Vec, - pub directory: PathBuf, + /// Stack of paths to files loaded by out-of-line module items, + /// used to detect and report recursive module inclusions. + pub file_path_stack: Vec, + /// Directory to search child module files in, + /// often (but not necessarily) the parent of the top file path on the `file_path_stack`. + pub dir_path: PathBuf, +} + +impl ModuleData { + pub fn with_dir_path(&self, dir_path: PathBuf) -> ModuleData { + ModuleData { + mod_path: self.mod_path.clone(), + file_path_stack: self.file_path_stack.clone(), + dir_path, + } + } } #[derive(Clone)] @@ -910,10 +944,13 @@ pub struct ExpansionData { pub id: ExpnId, pub depth: usize, pub module: Rc, - pub directory_ownership: DirectoryOwnership, + pub dir_ownership: DirOwnership, pub prior_type_ascription: Option<(Span, bool)>, } +type OnExternModLoaded<'a> = + Option<&'a dyn Fn(Ident, Vec, Vec>, Span) -> (Vec, Vec>)>; + /// One of these is made during expansion and incrementally updated as we go; /// when a macro expansion occurs, the resulting nodes have the `backtrace() /// -> expn_data` of their expansion context stored into their span. @@ -931,7 +968,7 @@ pub struct ExtCtxt<'a> { /// Called directly after having parsed an external `mod foo;` in expansion. /// /// `Ident` is the module name. - pub(super) extern_mod_loaded: Option<&'a dyn Fn(&ast::Crate, Ident)>, + pub(super) extern_mod_loaded: OnExternModLoaded<'a>, } impl<'a> ExtCtxt<'a> { @@ -939,7 +976,7 @@ impl<'a> ExtCtxt<'a> { sess: &'a Session, ecfg: expand::ExpansionConfig<'a>, resolver: &'a mut dyn ResolverExpand, - extern_mod_loaded: Option<&'a dyn Fn(&ast::Crate, Ident)>, + extern_mod_loaded: OnExternModLoaded<'a>, ) -> ExtCtxt<'a> { ExtCtxt { sess, @@ -951,8 +988,8 @@ impl<'a> ExtCtxt<'a> { current_expansion: ExpansionData { id: ExpnId::root(), depth: 0, - module: Rc::new(ModuleData { mod_path: Vec::new(), directory: PathBuf::new() }), - directory_ownership: DirectoryOwnership::Owned { relative: None }, + module: Default::default(), + dir_ownership: DirOwnership::Owned { relative: None }, prior_type_ascription: None, }, force_mode: false, @@ -1052,6 +1089,10 @@ impl<'a> ExtCtxt<'a> { .chain(components.iter().map(|&s| Ident::with_dummy_span(s))) .collect() } + pub fn def_site_path(&self, components: &[Symbol]) -> Vec { + let def_site = self.with_def_site_ctxt(DUMMY_SP); + components.iter().map(|&s| Ident::new(s, def_site)).collect() + } pub fn check_unused_macros(&mut self) { self.resolver.check_unused_macros(); @@ -1202,3 +1243,41 @@ pub fn get_exprs_from_tts( } Some(es) } + +/// This nonterminal looks like some specific enums from +/// `proc-macro-hack` and `procedural-masquerade` crates. +/// We need to maintain some special pretty-printing behavior for them due to incorrect +/// asserts in old versions of those crates and their wide use in the ecosystem. +/// See issue #73345 for more details. +/// FIXME(#73933): Remove this eventually. +pub(crate) fn pretty_printing_compatibility_hack(nt: &Nonterminal, sess: &ParseSess) -> bool { + let item = match nt { + Nonterminal::NtItem(item) => item, + Nonterminal::NtStmt(stmt) => match &stmt.kind { + ast::StmtKind::Item(item) => item, + _ => return false, + }, + _ => return false, + }; + + let name = item.ident.name; + if name == sym::ProceduralMasqueradeDummyType { + if let ast::ItemKind::Enum(enum_def, _) = &item.kind { + if let [variant] = &*enum_def.variants { + if variant.ident.name == sym::Input { + sess.buffer_lint_with_diagnostic( + &PROC_MACRO_BACK_COMPAT, + item.ident.span, + ast::CRATE_NODE_ID, + "using `procedural-masquerade` crate", + BuiltinLintDiagnostics::ProcMacroBackCompat( + "The `procedural-masquerade` crate has been unnecessary since Rust 1.30.0. \ + Versions of this crate below 0.1.7 will eventually stop compiling.".to_string()) + ); + return true; + } + } + } + } + false +} diff --git a/compiler/rustc_expand/src/build.rs b/compiler/rustc_expand/src/build.rs index fe67b401fc..3664ff3ae8 100644 --- a/compiler/rustc_expand/src/build.rs +++ b/compiler/rustc_expand/src/build.rs @@ -267,8 +267,8 @@ impl<'a> ExtCtxt<'a> { pub fn expr_block(&self, b: P) -> P { self.expr(b.span, ast::ExprKind::Block(b, None)) } - pub fn field_imm(&self, span: Span, ident: Ident, e: P) -> ast::Field { - ast::Field { + pub fn field_imm(&self, span: Span, ident: Ident, e: P) -> ast::ExprField { + ast::ExprField { ident: ident.with_span_pos(span), expr: e, span, @@ -282,15 +282,18 @@ impl<'a> ExtCtxt<'a> { &self, span: Span, path: ast::Path, - fields: Vec, + fields: Vec, ) -> P { - self.expr(span, ast::ExprKind::Struct(path, fields, ast::StructRest::None)) + self.expr( + span, + ast::ExprKind::Struct(P(ast::StructExpr { path, fields, rest: ast::StructRest::None })), + ) } pub fn expr_struct_ident( &self, span: Span, id: Ident, - fields: Vec, + fields: Vec, ) -> P { self.expr_struct(span, self.path_ident(span, id), fields) } @@ -419,7 +422,7 @@ impl<'a> ExtCtxt<'a> { &self, span: Span, path: ast::Path, - field_pats: Vec, + field_pats: Vec, ) -> P { self.pat(span, PatKind::Struct(path, field_pats, false)) } diff --git a/compiler/rustc_expand/src/config.rs b/compiler/rustc_expand/src/config.rs index b07bce9487..a23731cf30 100644 --- a/compiler/rustc_expand/src/config.rs +++ b/compiler/rustc_expand/src/config.rs @@ -1,13 +1,9 @@ //! Conditional compilation stripping. -use crate::base::Annotatable; - -use rustc_ast::attr::HasAttrs; -use rustc_ast::mut_visit::*; use rustc_ast::ptr::P; use rustc_ast::token::{DelimToken, Token, TokenKind}; use rustc_ast::tokenstream::{DelimSpan, LazyTokenStream, Spacing, TokenStream, TokenTree}; -use rustc_ast::{self as ast, AttrItem, Attribute, MetaItem}; +use rustc_ast::{self as ast, AstLike, AttrItem, Attribute, MetaItem}; use rustc_attr as attr; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::map_in_place::MapInPlace; @@ -23,8 +19,6 @@ use rustc_span::edition::{Edition, ALL_EDITIONS}; use rustc_span::symbol::{sym, Symbol}; use rustc_span::{Span, DUMMY_SP}; -use smallvec::SmallVec; - /// A folder that strips out items that do not belong in the current configuration. pub struct StripUnconfigured<'a> { pub sess: &'a Session, @@ -205,11 +199,11 @@ pub fn features(sess: &Session, mut krate: ast::Crate) -> (ast::Crate, Features) let unconfigured_attrs = krate.attrs.clone(); let diag = &sess.parse_sess.span_diagnostic; let err_count = diag.err_count(); - let features = match strip_unconfigured.configure(krate.attrs) { + let features = match strip_unconfigured.configure_krate_attrs(krate.attrs) { None => { // The entire crate is unconfigured. krate.attrs = Vec::new(); - krate.module.items = Vec::new(); + krate.items = Vec::new(); Features::default() } Some(attrs) => { @@ -218,7 +212,9 @@ pub fn features(sess: &Session, mut krate: ast::Crate) -> (ast::Crate, Features) if err_count == diag.err_count() { // Avoid reconfiguring malformed `cfg_attr`s. strip_unconfigured.features = Some(&features); - strip_unconfigured.configure(unconfigured_attrs); + // Run configuration again, this time with features available + // so that we can perform feature-gating. + strip_unconfigured.configure_krate_attrs(unconfigured_attrs); } features } @@ -242,7 +238,7 @@ const CFG_ATTR_NOTE_REF: &str = "for more information, visit \ #the-cfg_attr-attribute>"; impl<'a> StripUnconfigured<'a> { - pub fn configure(&mut self, mut node: T) -> Option { + pub fn configure(&mut self, mut node: T) -> Option { self.process_cfg_attrs(&mut node); if self.in_cfg(node.attrs()) { Some(node) @@ -252,13 +248,26 @@ impl<'a> StripUnconfigured<'a> { } } + fn configure_krate_attrs( + &mut self, + mut attrs: Vec, + ) -> Option> { + attrs.flat_map_in_place(|attr| self.process_cfg_attr(attr)); + if self.in_cfg(&attrs) { + Some(attrs) + } else { + self.modified = true; + None + } + } + /// Parse and expand all `cfg_attr` attributes into a list of attributes /// that are within each `cfg_attr` that has a true configuration predicate. /// /// Gives compiler warnings if any `cfg_attr` does not contain any /// attributes and is in the original source code. Gives compiler errors if /// the syntax of any `cfg_attr` is incorrect. - pub fn process_cfg_attrs(&mut self, node: &mut T) { + fn process_cfg_attrs(&mut self, node: &mut T) { node.visit_attrs(|attrs| { attrs.flat_map_in_place(|attr| self.process_cfg_attr(attr)); }); @@ -373,7 +382,7 @@ impl<'a> StripUnconfigured<'a> { } /// Determines if a node with the given attributes should be included in this configuration. - pub fn in_cfg(&self, attrs: &[Attribute]) -> bool { + fn in_cfg(&self, attrs: &[Attribute]) -> bool { attrs.iter().all(|attr| { if !is_cfg(self.sess, attr) { return true; @@ -413,16 +422,8 @@ impl<'a> StripUnconfigured<'a> { }) } - /// Visit attributes on expression and statements (but not attributes on items in blocks). - fn visit_expr_attrs(&mut self, attrs: &[Attribute]) { - // flag the offending attributes - for attr in attrs.iter() { - self.maybe_emit_expr_attr_err(attr); - } - } - /// If attributes are not allowed on expressions, emit an error for `attr` - pub fn maybe_emit_expr_attr_err(&self, attr: &Attribute) { + crate fn maybe_emit_expr_attr_err(&self, attr: &Attribute) { if !self.features.map_or(true, |features| features.stmt_expr_attributes) { let mut err = feature_err( &self.sess.parse_sess, @@ -439,49 +440,10 @@ impl<'a> StripUnconfigured<'a> { } } - pub fn configure_foreign_mod(&mut self, foreign_mod: &mut ast::ForeignMod) { - let ast::ForeignMod { unsafety: _, abi: _, items } = foreign_mod; - items.flat_map_in_place(|item| self.configure(item)); - } - - 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::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::Enum(ast::EnumDef { variants }, _generics) => { - variants.flat_map_in_place(|variant| self.configure(variant)); - for variant in variants { - self.configure_variant_data(&mut variant.data); - } - } - _ => {} - } - } - - pub fn configure_expr_kind(&mut self, expr_kind: &mut ast::ExprKind) { - match expr_kind { - ast::ExprKind::Match(_m, arms) => { - arms.flat_map_in_place(|arm| self.configure(arm)); - } - ast::ExprKind::Struct(_path, fields, _base) => { - fields.flat_map_in_place(|field| self.configure(field)); - } - _ => {} - } - } - pub fn configure_expr(&mut self, expr: &mut P) { - self.visit_expr_attrs(expr.attrs()); + for attr in expr.attrs.iter() { + self.maybe_emit_expr_attr_err(attr); + } // If an expr is valid to cfg away it will have been removed by the // outer stmt or expression folder before descending in here. @@ -497,117 +459,6 @@ impl<'a> StripUnconfigured<'a> { self.process_cfg_attrs(expr) } - - pub fn configure_pat(&mut self, pat: &mut P) { - if let ast::PatKind::Struct(_path, fields, _etc) = &mut pat.kind { - fields.flat_map_in_place(|field| self.configure(field)); - } - } - - pub fn configure_fn_decl(&mut self, fn_decl: &mut ast::FnDecl) { - fn_decl.inputs.flat_map_in_place(|arg| self.configure(arg)); - } - - pub fn fully_configure(&mut self, item: Annotatable) -> Annotatable { - // Since the item itself has already been configured by the InvocationCollector, - // we know that fold result vector will contain exactly one element - match item { - Annotatable::Item(item) => Annotatable::Item(self.flat_map_item(item).pop().unwrap()), - Annotatable::TraitItem(item) => { - Annotatable::TraitItem(self.flat_map_trait_item(item).pop().unwrap()) - } - Annotatable::ImplItem(item) => { - Annotatable::ImplItem(self.flat_map_impl_item(item).pop().unwrap()) - } - Annotatable::ForeignItem(item) => { - Annotatable::ForeignItem(self.flat_map_foreign_item(item).pop().unwrap()) - } - Annotatable::Stmt(stmt) => { - Annotatable::Stmt(stmt.map(|stmt| self.flat_map_stmt(stmt).pop().unwrap())) - } - Annotatable::Expr(mut expr) => Annotatable::Expr({ - self.visit_expr(&mut expr); - expr - }), - Annotatable::Arm(arm) => Annotatable::Arm(self.flat_map_arm(arm).pop().unwrap()), - Annotatable::Field(field) => { - Annotatable::Field(self.flat_map_field(field).pop().unwrap()) - } - Annotatable::FieldPat(fp) => { - Annotatable::FieldPat(self.flat_map_field_pattern(fp).pop().unwrap()) - } - Annotatable::GenericParam(param) => { - Annotatable::GenericParam(self.flat_map_generic_param(param).pop().unwrap()) - } - Annotatable::Param(param) => { - Annotatable::Param(self.flat_map_param(param).pop().unwrap()) - } - Annotatable::StructField(sf) => { - Annotatable::StructField(self.flat_map_struct_field(sf).pop().unwrap()) - } - Annotatable::Variant(v) => { - Annotatable::Variant(self.flat_map_variant(v).pop().unwrap()) - } - } - } -} - -impl<'a> MutVisitor for StripUnconfigured<'a> { - fn visit_foreign_mod(&mut self, foreign_mod: &mut ast::ForeignMod) { - self.configure_foreign_mod(foreign_mod); - noop_visit_foreign_mod(foreign_mod, self); - } - - fn visit_item_kind(&mut self, item: &mut ast::ItemKind) { - self.configure_item_kind(item); - noop_visit_item_kind(item, self); - } - - fn visit_expr(&mut self, expr: &mut P) { - self.configure_expr(expr); - self.configure_expr_kind(&mut expr.kind); - noop_visit_expr(expr, self); - } - - fn filter_map_expr(&mut self, expr: P) -> Option> { - let mut expr = configure!(self, expr); - self.configure_expr_kind(&mut expr.kind); - noop_visit_expr(&mut expr, self); - Some(expr) - } - - fn flat_map_generic_param( - &mut self, - param: ast::GenericParam, - ) -> SmallVec<[ast::GenericParam; 1]> { - noop_flat_map_generic_param(configure!(self, param), self) - } - - fn flat_map_stmt(&mut self, stmt: ast::Stmt) -> SmallVec<[ast::Stmt; 1]> { - noop_flat_map_stmt(configure!(self, stmt), self) - } - - fn flat_map_item(&mut self, item: P) -> SmallVec<[P; 1]> { - noop_flat_map_item(configure!(self, item), self) - } - - fn flat_map_impl_item(&mut self, item: P) -> SmallVec<[P; 1]> { - noop_flat_map_assoc_item(configure!(self, item), self) - } - - fn flat_map_trait_item(&mut self, item: P) -> SmallVec<[P; 1]> { - noop_flat_map_assoc_item(configure!(self, item), self) - } - - fn visit_pat(&mut self, pat: &mut P) { - self.configure_pat(pat); - noop_visit_pat(pat, self) - } - - fn visit_fn_decl(&mut self, mut fn_decl: &mut P) { - self.configure_fn_decl(&mut fn_decl); - noop_visit_fn_decl(fn_decl, self); - } } fn is_cfg(sess: &Session, attr: &Attribute) -> bool { diff --git a/compiler/rustc_expand/src/expand.rs b/compiler/rustc_expand/src/expand.rs index 5fdb7fc591..0992f59843 100644 --- a/compiler/rustc_expand/src/expand.rs +++ b/compiler/rustc_expand/src/expand.rs @@ -1,26 +1,28 @@ use crate::base::*; use crate::config::StripUnconfigured; use crate::configure; -use crate::hygiene::{ExpnData, ExpnKind, SyntaxContext}; +use crate::hygiene::SyntaxContext; use crate::mbe::macro_rules::annotate_err_with_kind; -use crate::module::{parse_external_mod, push_directory, Directory, DirectoryOwnership}; +use crate::module::{mod_dir_path, parse_external_mod, DirOwnership, ParsedExternalMod}; use crate::placeholders::{placeholder, PlaceholderExpander}; -use crate::proc_macro::collect_derives; +use rustc_ast as ast; use rustc_ast::mut_visit::*; use rustc_ast::ptr::P; use rustc_ast::token; use rustc_ast::tokenstream::TokenStream; use rustc_ast::visit::{self, AssocCtxt, Visitor}; -use rustc_ast::{self as ast, AttrItem, AttrStyle, Block, LitKind, NodeId, PatKind, Path}; -use rustc_ast::{ItemKind, MacArgs, MacCallStmt, MacStmtStyle, StmtKind, Unsafe}; +use rustc_ast::{AstLike, AttrItem, AttrStyle, Block, Inline, ItemKind, LitKind, MacArgs}; +use rustc_ast::{MacCallStmt, MacStmtStyle, MetaItemKind, ModKind, NestedMetaItem}; +use rustc_ast::{NodeId, PatKind, Path, StmtKind, Unsafe}; use rustc_ast_pretty::pprust; -use rustc_attr::{self as attr, is_builtin_attr, HasAttrs}; +use rustc_attr::{self as attr, is_builtin_attr}; use rustc_data_structures::map_in_place::MapInPlace; use rustc_data_structures::stack::ensure_sufficient_stack; -use rustc_errors::{struct_span_err, Applicability, PResult}; +use rustc_data_structures::sync::Lrc; +use rustc_errors::{Applicability, PResult}; use rustc_feature::Features; -use rustc_parse::parser::{AttemptLocalParseRecovery, ForceCollect, Parser}; +use rustc_parse::parser::{AttemptLocalParseRecovery, ForceCollect, GateOr, Parser, RecoverComma}; use rustc_parse::validate_attr; use rustc_session::lint::builtin::UNUSED_DOC_COMMENTS; use rustc_session::lint::BuiltinLintDiagnostics; @@ -175,14 +177,14 @@ ast_fragments! { Arms(SmallVec<[ast::Arm; 1]>) { "match arm"; many fn flat_map_arm; fn visit_arm(); fn make_arms; } - Fields(SmallVec<[ast::Field; 1]>) { - "field expression"; many fn flat_map_field; fn visit_field(); fn make_fields; + Fields(SmallVec<[ast::ExprField; 1]>) { + "field expression"; many fn flat_map_expr_field; fn visit_expr_field(); fn make_expr_fields; } - FieldPats(SmallVec<[ast::FieldPat; 1]>) { + FieldPats(SmallVec<[ast::PatField; 1]>) { "field pattern"; - many fn flat_map_field_pattern; - fn visit_field_pattern(); - fn make_field_patterns; + many fn flat_map_pat_field; + fn visit_pat_field(); + fn make_pat_fields; } GenericParams(SmallVec<[ast::GenericParam; 1]>) { "generic parameter"; @@ -193,11 +195,11 @@ ast_fragments! { Params(SmallVec<[ast::Param; 1]>) { "function parameter"; many fn flat_map_param; fn visit_param(); fn make_params; } - StructFields(SmallVec<[ast::StructField; 1]>) { + StructFields(SmallVec<[ast::FieldDef; 1]>) { "field"; - many fn flat_map_struct_field; - fn visit_struct_field(); - fn make_struct_fields; + many fn flat_map_field_def; + fn visit_field_def(); + fn make_field_defs; } Variants(SmallVec<[ast::Variant; 1]>) { "variant"; many fn flat_map_variant; fn visit_variant(); fn make_variants; @@ -241,10 +243,10 @@ impl AstFragmentKind { AstFragment::Arms(items.map(Annotatable::expect_arm).collect()) } AstFragmentKind::Fields => { - AstFragment::Fields(items.map(Annotatable::expect_field).collect()) + AstFragment::Fields(items.map(Annotatable::expect_expr_field).collect()) } AstFragmentKind::FieldPats => { - AstFragment::FieldPats(items.map(Annotatable::expect_field_pattern).collect()) + AstFragment::FieldPats(items.map(Annotatable::expect_pat_field).collect()) } AstFragmentKind::GenericParams => { AstFragment::GenericParams(items.map(Annotatable::expect_generic_param).collect()) @@ -253,7 +255,7 @@ impl AstFragmentKind { AstFragment::Params(items.map(Annotatable::expect_param).collect()) } AstFragmentKind::StructFields => { - AstFragment::StructFields(items.map(Annotatable::expect_struct_field).collect()) + AstFragment::StructFields(items.map(Annotatable::expect_field_def).collect()) } AstFragmentKind::Variants => { AstFragment::Variants(items.map(Annotatable::expect_variant).collect()) @@ -299,23 +301,16 @@ pub enum InvocationKind { }, Attr { attr: ast::Attribute, + // Re-insertion position for inert attributes. + pos: usize, item: Annotatable, // Required for resolving derive helper attributes. derives: Vec, - // We temporarily report errors for attribute macros placed after derives - after_derive: bool, }, Derive { path: Path, item: Annotatable, }, - /// "Invocation" that contains all derives from an item, - /// broken into multiple `Derive` invocations when expanded. - /// FIXME: Find a way to remove it. - DeriveContainer { - derives: Vec, - item: Annotatable, - }, } impl InvocationKind { @@ -326,9 +321,8 @@ impl InvocationKind { // The assumption is that the attribute expansion cannot change field visibilities, // and it holds because only inert attributes are supported in this position. match self { - InvocationKind::Attr { item: Annotatable::StructField(field), .. } - | InvocationKind::Derive { item: Annotatable::StructField(field), .. } - | InvocationKind::DeriveContainer { item: Annotatable::StructField(field), .. } + InvocationKind::Attr { item: Annotatable::FieldDef(field), .. } + | InvocationKind::Derive { item: Annotatable::FieldDef(field), .. } if field.ident.is_none() => { Some(field.vis.clone()) @@ -344,7 +338,6 @@ impl Invocation { InvocationKind::Bang { span, .. } => *span, InvocationKind::Attr { attr, .. } => attr.span, InvocationKind::Derive { path, .. } => path.span, - InvocationKind::DeriveContainer { item, .. } => item.span(), } } } @@ -359,24 +352,28 @@ impl<'a, 'b> MacroExpander<'a, 'b> { MacroExpander { cx, monotonic } } + // FIXME: Avoid visiting the crate as a `Mod` item, + // make crate a first class expansion target instead. pub fn expand_crate(&mut self, mut krate: ast::Crate) -> ast::Crate { - let mut module = ModuleData { - mod_path: vec![Ident::from_str(&self.cx.ecfg.crate_name)], - directory: match self.cx.source_map().span_to_unmapped_path(krate.span) { - FileName::Real(name) => name.into_local_path(), - other => PathBuf::from(other.to_string()), - }, + let file_path = match self.cx.source_map().span_to_unmapped_path(krate.span) { + FileName::Real(name) => name.into_local_path(), + other => PathBuf::from(other.to_string()), }; - module.directory.pop(); - self.cx.root_path = module.directory.clone(); - self.cx.current_expansion.module = Rc::new(module); - - let orig_mod_span = krate.module.inner; + let dir_path = file_path.parent().unwrap_or(&file_path).to_owned(); + self.cx.root_path = dir_path.clone(); + self.cx.current_expansion.module = Rc::new(ModuleData { + mod_path: vec![Ident::from_str(&self.cx.ecfg.crate_name)], + file_path_stack: vec![file_path], + dir_path, + }); let krate_item = AstFragment::Items(smallvec![P(ast::Item { attrs: krate.attrs, span: krate.span, - kind: ast::ItemKind::Mod(krate.module), + kind: ast::ItemKind::Mod( + Unsafe::No, + ModKind::Loaded(krate.items, Inline::Yes, krate.span) + ), ident: Ident::invalid(), id: ast::DUMMY_NODE_ID, vis: ast::Visibility { @@ -388,28 +385,22 @@ impl<'a, 'b> MacroExpander<'a, 'b> { })]); match self.fully_expand_fragment(krate_item).make_items().pop().map(P::into_inner) { - Some(ast::Item { attrs, kind: ast::ItemKind::Mod(module), .. }) => { + Some(ast::Item { + attrs, + kind: ast::ItemKind::Mod(_, ModKind::Loaded(items, ..)), + .. + }) => { krate.attrs = attrs; - krate.module = module; + krate.items = items; } None => { // Resolution failed so we return an empty expansion krate.attrs = vec![]; - krate.module = ast::Mod { - inner: orig_mod_span, - unsafety: Unsafe::No, - items: vec![], - inline: true, - }; + krate.items = vec![]; } Some(ast::Item { span, kind, .. }) => { krate.attrs = vec![]; - krate.module = ast::Mod { - inner: orig_mod_span, - unsafety: Unsafe::No, - items: vec![], - inline: true, - }; + krate.items = vec![]; self.cx.span_err( span, &format!( @@ -446,7 +437,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> { let mut undetermined_invocations = Vec::new(); let (mut progress, mut force) = (false, !self.monotonic); loop { - let (invoc, res) = if let Some(invoc) = invocations.pop() { + let (invoc, ext) = if let Some(invoc) = invocations.pop() { invoc } else { self.resolve_imports(); @@ -464,8 +455,8 @@ impl<'a, 'b> MacroExpander<'a, 'b> { continue; }; - let res = match res { - Some(res) => res, + let ext = match ext { + Some(ext) => ext, None => { let eager_expansion_root = if self.monotonic { invoc.expansion_data.id @@ -477,7 +468,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> { eager_expansion_root, force, ) { - Ok(res) => res, + Ok(ext) => ext, Err(Indeterminate) => { // Cannot resolve, will retry this invocation later. undetermined_invocations.push((invoc, None)); @@ -491,86 +482,78 @@ impl<'a, 'b> MacroExpander<'a, 'b> { self.cx.current_expansion = invoc.expansion_data.clone(); self.cx.force_mode = force; - // FIXME(jseyfried): Refactor out the following logic let fragment_kind = invoc.fragment_kind; - let (expanded_fragment, new_invocations) = match res { - InvocationRes::Single(ext) => match self.expand_invoc(invoc, &ext.kind) { - ExpandResult::Ready(fragment) => self.collect_invocations(fragment, &[]), - ExpandResult::Retry(invoc) => { - if force { - self.cx.span_bug( - invoc.span(), - "expansion entered force mode but is still stuck", - ); - } else { - // Cannot expand, will retry this invocation later. - undetermined_invocations - .push((invoc, Some(InvocationRes::Single(ext)))); - continue; - } - } - }, - InvocationRes::DeriveContainer(_exts) => { - // FIXME: Consider using the derive resolutions (`_exts`) immediately, - // instead of enqueuing the derives to be resolved again later. - let (derives, mut item) = match invoc.kind { - InvocationKind::DeriveContainer { derives, item } => (derives, item), - _ => unreachable!(), - }; - let (item, derive_placeholders) = if !item.derive_allowed() { - self.error_derive_forbidden_on_non_adt(&derives, &item); - item.visit_attrs(|attrs| attrs.retain(|a| !a.has_name(sym::derive))); - (item, Vec::new()) - } else { - let mut visitor = StripUnconfigured { - sess: self.cx.sess, - features: self.cx.ecfg.features, - modified: false, - }; - let mut item = visitor.fully_configure(item); - item.visit_attrs(|attrs| attrs.retain(|a| !a.has_name(sym::derive))); - if visitor.modified && !derives.is_empty() { - // Erase the tokens if cfg-stripping modified the item - // This will cause us to synthesize fake tokens - // when `nt_to_tokenstream` is called on this item. - match &mut item { - Annotatable::Item(item) => item.tokens = None, - Annotatable::Stmt(stmt) => { - if let StmtKind::Item(item) = &mut stmt.kind { - item.tokens = None - } else { - panic!("Unexpected stmt {:?}", stmt); - } - } - _ => panic!("Unexpected annotatable {:?}", item), + let (expanded_fragment, new_invocations) = match self.expand_invoc(invoc, &ext.kind) { + ExpandResult::Ready(fragment) => { + let derive_placeholders = self + .cx + .resolver + .take_derive_resolutions(expn_id) + .map(|derives| { + enum AnnotatableRef<'a> { + Item(&'a P), + Stmt(&'a ast::Stmt), } - } + let item = match &fragment { + AstFragment::Items(items) => match &items[..] { + [item] => AnnotatableRef::Item(item), + _ => unreachable!(), + }, + AstFragment::Stmts(stmts) => match &stmts[..] { + [stmt] => AnnotatableRef::Stmt(stmt), + _ => unreachable!(), + }, + _ => unreachable!(), + }; - invocations.reserve(derives.len()); - let derive_placeholders = derives - .into_iter() - .map(|path| { - let expn_id = ExpnId::fresh(None); - invocations.push(( - Invocation { - kind: InvocationKind::Derive { path, item: item.clone() }, - fragment_kind, - expansion_data: ExpansionData { - id: expn_id, - ..self.cx.current_expansion.clone() + invocations.reserve(derives.len()); + derives + .into_iter() + .map(|(_exts, path)| { + // FIXME: Consider using the derive resolutions (`_exts`) + // instead of enqueuing the derives to be resolved again later. + let expn_id = ExpnId::fresh(None); + invocations.push(( + Invocation { + kind: InvocationKind::Derive { + path, + item: match item { + AnnotatableRef::Item(item) => { + Annotatable::Item(item.clone()) + } + AnnotatableRef::Stmt(stmt) => { + Annotatable::Stmt(P(stmt.clone())) + } + }, + }, + fragment_kind, + expansion_data: ExpansionData { + id: expn_id, + ..self.cx.current_expansion.clone() + }, }, - }, - None, - )); - NodeId::placeholder_from_expn_id(expn_id) - }) - .collect::>(); - (item, derive_placeholders) - }; + None, + )); + NodeId::placeholder_from_expn_id(expn_id) + }) + .collect::>() + }) + .unwrap_or_default(); - let fragment = fragment_kind.expect_from_annotatables(::std::iter::once(item)); self.collect_invocations(fragment, &derive_placeholders) } + ExpandResult::Retry(invoc) => { + if force { + self.cx.span_bug( + invoc.span(), + "expansion entered force mode but is still stuck", + ); + } else { + // Cannot expand, will retry this invocation later. + undetermined_invocations.push((invoc, Some(ext))); + continue; + } + } }; progress = true; @@ -596,29 +579,6 @@ impl<'a, 'b> MacroExpander<'a, 'b> { fragment_with_placeholders } - fn error_derive_forbidden_on_non_adt(&self, derives: &[Path], item: &Annotatable) { - let attr = self.cx.sess.find_by_name(item.attrs(), sym::derive); - let span = attr.map_or(item.span(), |attr| attr.span); - let mut err = struct_span_err!( - self.cx.sess, - span, - E0774, - "`derive` may only be applied to structs, enums and unions", - ); - if let Some(ast::Attribute { style: ast::AttrStyle::Inner, .. }) = attr { - let trait_list = derives.iter().map(|t| pprust::path_to_string(t)).collect::>(); - let suggestion = format!("#[derive({})]", trait_list.join(", ")); - err.span_suggestion( - span, - "try an outer attribute", - suggestion, - // We don't 𝑘𝑛𝑜𝑤 that the following item is an ADT - Applicability::MaybeIncorrect, - ); - } - err.emit(); - } - fn resolve_imports(&mut self) { if self.monotonic { self.cx.resolver.resolve_imports(); @@ -633,7 +593,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> { &mut self, mut fragment: AstFragment, extra_placeholders: &[NodeId], - ) -> (AstFragment, Vec<(Invocation, Option)>) { + ) -> (AstFragment, Vec<(Invocation, Option>)>) { // Resolve `$crate`s in the fragment for pretty-printing. self.cx.resolver.resolve_dollar_crates(); @@ -733,7 +693,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> { } _ => unreachable!(), }, - InvocationKind::Attr { attr, mut item, derives, after_derive } => match ext { + InvocationKind::Attr { attr, pos, mut item, derives } => match ext { SyntaxExtensionKind::Attr(expander) => { self.gate_proc_macro_input(&item); self.gate_proc_macro_attr_item(span, &item); @@ -764,12 +724,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> { ExpandResult::Retry(item) => { // Reassemble the original invocation for retrying. return ExpandResult::Retry(Invocation { - kind: InvocationKind::Attr { - attr, - item, - derives, - after_derive, - }, + kind: InvocationKind::Attr { attr, pos, item, derives }, ..invoc }); } @@ -787,7 +742,7 @@ impl<'a, 'b> MacroExpander<'a, 'b> { if *mark_used { self.cx.sess.mark_attr_used(&attr); } - item.visit_attrs(|attrs| attrs.push(attr)); + item.visit_attrs(|attrs| attrs.insert(pos, attr)); fragment_kind.expect_from_annotatables(iter::once(item)) } _ => unreachable!(), @@ -813,7 +768,6 @@ impl<'a, 'b> MacroExpander<'a, 'b> { } _ => unreachable!(), }, - InvocationKind::DeriveContainer { .. } => unreachable!(), }) } @@ -833,11 +787,11 @@ impl<'a, 'b> MacroExpander<'a, 'b> { } Annotatable::Expr(_) => "expressions", Annotatable::Arm(..) - | Annotatable::Field(..) - | Annotatable::FieldPat(..) + | Annotatable::ExprField(..) + | Annotatable::PatField(..) | Annotatable::GenericParam(..) | Annotatable::Param(..) - | Annotatable::StructField(..) + | Annotatable::FieldDef(..) | Annotatable::Variant(..) => panic!("unexpected annotatable"), }; if self.cx.ecfg.proc_macro_hygiene() { @@ -860,7 +814,9 @@ impl<'a, 'b> MacroExpander<'a, 'b> { impl<'ast, 'a> Visitor<'ast> for GateProcMacroInput<'a> { fn visit_item(&mut self, item: &'ast ast::Item) { match &item.kind { - ast::ItemKind::Mod(module) if !module.inline => { + ast::ItemKind::Mod(_, mod_kind) + if !matches!(mod_kind, ModKind::Loaded(_, Inline::Yes, _)) => + { feature_err( self.parse_sess, sym::proc_macro_hygiene, @@ -960,7 +916,9 @@ pub fn parse_ast_fragment<'a>( } } AstFragmentKind::Ty => AstFragment::Ty(this.parse_ty()?), - AstFragmentKind::Pat => AstFragment::Pat(this.parse_pat(None)?), + AstFragmentKind::Pat => { + AstFragment::Pat(this.parse_pat_allow_top_alt(None, GateOr::Yes, RecoverComma::No)?) + } AstFragmentKind::Arms | AstFragmentKind::Fields | AstFragmentKind::FieldPats @@ -1011,29 +969,13 @@ pub fn ensure_complete_parse<'a>( struct InvocationCollector<'a, 'b> { cx: &'a mut ExtCtxt<'b>, cfg: StripUnconfigured<'a>, - invocations: Vec<(Invocation, Option)>, + invocations: Vec<(Invocation, Option>)>, monotonic: bool, } impl<'a, 'b> InvocationCollector<'a, 'b> { fn collect(&mut self, fragment_kind: AstFragmentKind, kind: InvocationKind) -> AstFragment { - // Expansion data for all the collected invocations is set upon their resolution, - // with exception of the derive container case which is not resolved and can get - // its expansion data immediately. - let expn_data = match &kind { - InvocationKind::DeriveContainer { item, .. } => { - let mut expn_data = ExpnData::default( - ExpnKind::Macro(MacroKind::Attr, sym::derive), - item.span(), - self.cx.sess.parse_sess.edition, - None, - ); - expn_data.parent = self.cx.current_expansion.id; - Some(expn_data) - } - _ => None, - }; - let expn_id = ExpnId::fresh(expn_data); + let expn_id = ExpnId::fresh(None); let vis = kind.placeholder_visibility(); self.invocations.push(( Invocation { @@ -1061,67 +1003,50 @@ impl<'a, 'b> InvocationCollector<'a, 'b> { fn collect_attr( &mut self, - (attr, derives, after_derive): (Option, Vec, bool), + (attr, pos, derives): (ast::Attribute, usize, Vec), item: Annotatable, kind: AstFragmentKind, ) -> AstFragment { - self.collect( - kind, - match attr { - Some(attr) => InvocationKind::Attr { attr, item, derives, after_derive }, - None => InvocationKind::DeriveContainer { derives, item }, - }, - ) + self.collect(kind, InvocationKind::Attr { attr, pos, item, derives }) } - fn find_attr_invoc( - &self, - attrs: &mut Vec, - after_derive: &mut bool, - ) -> Option { - attrs - .iter() - .position(|a| { - if a.has_name(sym::derive) { - *after_derive = true; - } - !self.cx.sess.is_attr_known(a) && !is_builtin_attr(a) - }) - .map(|i| attrs.remove(i)) - } - - /// If `item` is an attr invocation, remove and return the macro attribute and derive traits. + /// If `item` is an attribute invocation, remove the attribute and return it together with + /// its position and derives following it. We have to collect the derives in order to resolve + /// legacy derive helpers (helpers written before derives that introduce them). fn take_first_attr( &mut self, - item: &mut impl HasAttrs, - ) -> Option<(Option, Vec, /* after_derive */ bool)> { - let (mut attr, mut traits, mut after_derive) = (None, Vec::new(), false); - - item.visit_attrs(|mut attrs| { - attr = self.find_attr_invoc(&mut attrs, &mut after_derive); - traits = collect_derives(&mut self.cx, &mut attrs); - }); - - if attr.is_some() || !traits.is_empty() { Some((attr, traits, after_derive)) } else { None } - } - - /// Alternative to `take_first_attr()` that ignores `#[derive]` so invocations fallthrough - /// to the unused-attributes lint (making it an error on statements and expressions - /// is a breaking change) - fn take_first_attr_no_derive( - &mut self, - nonitem: &mut impl HasAttrs, - ) -> Option<(Option, Vec, /* after_derive */ bool)> { - let (mut attr, mut after_derive) = (None, false); - - nonitem.visit_attrs(|mut attrs| { - attr = self.find_attr_invoc(&mut attrs, &mut after_derive); + item: &mut impl AstLike, + ) -> Option<(ast::Attribute, usize, Vec)> { + let mut attr = None; + + item.visit_attrs(|attrs| { + attr = attrs + .iter() + .position(|a| !self.cx.sess.is_attr_known(a) && !is_builtin_attr(a)) + .map(|attr_pos| { + let attr = attrs.remove(attr_pos); + let following_derives = attrs[attr_pos..] + .iter() + .filter(|a| a.has_name(sym::derive)) + .flat_map(|a| a.meta_item_list().unwrap_or_default()) + .filter_map(|nested_meta| match nested_meta { + NestedMetaItem::MetaItem(ast::MetaItem { + kind: MetaItemKind::Word, + path, + .. + }) => Some(path), + _ => None, + }) + .collect(); + + (attr, attr_pos, following_derives) + }) }); - attr.map(|attr| (Some(attr), Vec::new(), after_derive)) + attr } - fn configure(&mut self, node: T) -> Option { + fn configure(&mut self, node: T) -> Option { self.cfg.configure(node) } @@ -1132,17 +1057,6 @@ impl<'a, 'b> InvocationCollector<'a, 'b> { for attr in attrs.iter() { rustc_ast_passes::feature_gate::check_attribute(attr, self.cx.sess, features); validate_attr::check_meta(&self.cx.sess.parse_sess, attr); - - // macros are expanded before any lint passes so this warning has to be hardcoded - if attr.has_name(sym::derive) { - self.cx - .parse_sess() - .span_diagnostic - .struct_span_warn(attr.span, "`#[derive]` does nothing on macro invocations") - .note("this may become a hard error in a future release") - .emit(); - } - if attr.doc_str().is_some() { self.cx.sess.parse_sess.buffer_lint_with_diagnostic( &UNUSED_DOC_COMMENTS, @@ -1160,14 +1074,10 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { fn visit_expr(&mut self, expr: &mut P) { self.cfg.configure_expr(expr); visit_clobber(expr.deref_mut(), |mut expr| { - self.cfg.configure_expr_kind(&mut expr.kind); - - if let Some(attr) = self.take_first_attr_no_derive(&mut expr) { + if let Some(attr) = self.take_first_attr(&mut expr) { // Collect the invoc regardless of whether or not attributes are permitted here // expansion will eat the attribute so it won't error later. - if let Some(attr) = attr.0.as_ref() { - self.cfg.maybe_emit_expr_attr_err(attr) - } + self.cfg.maybe_emit_expr_attr_err(&attr.0); // AstFragmentKind::Expr requires the macro to emit an expression. return self @@ -1198,28 +1108,28 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { noop_flat_map_arm(arm, self) } - fn flat_map_field(&mut self, field: ast::Field) -> SmallVec<[ast::Field; 1]> { + fn flat_map_expr_field(&mut self, field: ast::ExprField) -> SmallVec<[ast::ExprField; 1]> { let mut field = configure!(self, field); if let Some(attr) = self.take_first_attr(&mut field) { return self - .collect_attr(attr, Annotatable::Field(field), AstFragmentKind::Fields) - .make_fields(); + .collect_attr(attr, Annotatable::ExprField(field), AstFragmentKind::Fields) + .make_expr_fields(); } - noop_flat_map_field(field, self) + noop_flat_map_expr_field(field, self) } - fn flat_map_field_pattern(&mut self, fp: ast::FieldPat) -> SmallVec<[ast::FieldPat; 1]> { + fn flat_map_pat_field(&mut self, fp: ast::PatField) -> SmallVec<[ast::PatField; 1]> { let mut fp = configure!(self, fp); if let Some(attr) = self.take_first_attr(&mut fp) { return self - .collect_attr(attr, Annotatable::FieldPat(fp), AstFragmentKind::FieldPats) - .make_field_patterns(); + .collect_attr(attr, Annotatable::PatField(fp), AstFragmentKind::FieldPats) + .make_pat_fields(); } - noop_flat_map_field_pattern(fp, self) + noop_flat_map_pat_field(fp, self) } fn flat_map_param(&mut self, p: ast::Param) -> SmallVec<[ast::Param; 1]> { @@ -1234,16 +1144,16 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { noop_flat_map_param(p, self) } - fn flat_map_struct_field(&mut self, sf: ast::StructField) -> SmallVec<[ast::StructField; 1]> { + fn flat_map_field_def(&mut self, sf: ast::FieldDef) -> SmallVec<[ast::FieldDef; 1]> { let mut sf = configure!(self, sf); if let Some(attr) = self.take_first_attr(&mut sf) { return self - .collect_attr(attr, Annotatable::StructField(sf), AstFragmentKind::StructFields) - .make_struct_fields(); + .collect_attr(attr, Annotatable::FieldDef(sf), AstFragmentKind::StructFields) + .make_field_defs(); } - noop_flat_map_struct_field(sf, self) + noop_flat_map_field_def(sf, self) } fn flat_map_variant(&mut self, variant: ast::Variant) -> SmallVec<[ast::Variant; 1]> { @@ -1261,12 +1171,8 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { fn filter_map_expr(&mut self, expr: P) -> Option> { let expr = configure!(self, expr); expr.filter_map(|mut expr| { - self.cfg.configure_expr_kind(&mut expr.kind); - - if let Some(attr) = self.take_first_attr_no_derive(&mut expr) { - if let Some(attr) = attr.0.as_ref() { - self.cfg.maybe_emit_expr_attr_err(attr) - } + if let Some(attr) = self.take_first_attr(&mut expr) { + self.cfg.maybe_emit_expr_attr_err(&attr.0); return self .collect_attr(attr, Annotatable::Expr(P(expr)), AstFragmentKind::OptExpr) @@ -1289,7 +1195,6 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { } fn visit_pat(&mut self, pat: &mut P) { - self.cfg.configure_pat(pat); match pat.kind { PatKind::MacCall(_) => {} _ => return noop_visit_pat(pat, self), @@ -1308,15 +1213,7 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { // we'll expand attributes on expressions separately if !stmt.is_expr() { - let attr = if stmt.is_item() { - self.take_first_attr(&mut stmt) - } else { - // Ignore derives on non-item statements for backwards compatibility. - // This will result in a unused attribute warning - self.take_first_attr_no_derive(&mut stmt) - }; - - if let Some(attr) = attr { + if let Some(attr) = self.take_first_attr(&mut stmt) { return self .collect_attr(attr, Annotatable::Stmt(P(stmt)), AstFragmentKind::Stmts) .make_stmts(); @@ -1349,10 +1246,12 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { } fn visit_block(&mut self, block: &mut P) { - let old_directory_ownership = self.cx.current_expansion.directory_ownership; - self.cx.current_expansion.directory_ownership = DirectoryOwnership::UnownedViaBlock; + let orig_dir_ownership = mem::replace( + &mut self.cx.current_expansion.dir_ownership, + DirOwnership::UnownedViaBlock, + ); noop_visit_block(block, self); - self.cx.current_expansion.directory_ownership = old_directory_ownership; + self.cx.current_expansion.dir_ownership = orig_dir_ownership; } fn flat_map_item(&mut self, item: P) -> SmallVec<[P; 1]> { @@ -1379,69 +1278,83 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { _ => unreachable!(), }) } - ast::ItemKind::Mod(ref mut old_mod @ ast::Mod { .. }) if ident != Ident::invalid() => { - let sess = &self.cx.sess.parse_sess; - let orig_ownership = self.cx.current_expansion.directory_ownership; - let mut module = (*self.cx.current_expansion.module).clone(); - - let pushed = &mut false; // Record `parse_external_mod` pushing so we can pop. - let dir = Directory { ownership: orig_ownership, path: module.directory }; - let Directory { ownership, path } = if old_mod.inline { - // Inline `mod foo { ... }`, but we still need to push directories. - item.attrs = attrs; - push_directory(&self.cx.sess, ident, &item.attrs, dir) - } else { - // We have an outline `mod foo;` so we need to parse the file. - let (new_mod, dir) = parse_external_mod( - &self.cx.sess, - ident, - span, - old_mod.unsafety, - dir, - &mut attrs, - pushed, - ); - - let krate = ast::Crate { - span: new_mod.inner, - module: new_mod, - attrs, - proc_macros: vec![], - }; - if let Some(extern_mod_loaded) = self.cx.extern_mod_loaded { - extern_mod_loaded(&krate, ident); + ast::ItemKind::Mod(_, ref mut mod_kind) if ident != Ident::invalid() => { + let (file_path, dir_path, dir_ownership) = match mod_kind { + ModKind::Loaded(_, inline, _) => { + // Inline `mod foo { ... }`, but we still need to push directories. + let (dir_path, dir_ownership) = mod_dir_path( + &self.cx.sess, + ident, + &attrs, + &self.cx.current_expansion.module, + self.cx.current_expansion.dir_ownership, + *inline, + ); + item.attrs = attrs; + (None, dir_path, dir_ownership) } + ModKind::Unloaded => { + // We have an outline `mod foo;` so we need to parse the file. + let old_attrs_len = attrs.len(); + let ParsedExternalMod { + mut items, + inner_span, + file_path, + dir_path, + dir_ownership, + } = parse_external_mod( + &self.cx.sess, + ident, + span, + &self.cx.current_expansion.module, + self.cx.current_expansion.dir_ownership, + &mut attrs, + ); + + if let Some(extern_mod_loaded) = self.cx.extern_mod_loaded { + (attrs, items) = extern_mod_loaded(ident, attrs, items, inner_span); + } - *old_mod = krate.module; - item.attrs = krate.attrs; - // File can have inline attributes, e.g., `#![cfg(...)]` & co. => Reconfigure. - item = match self.configure(item) { - Some(node) => node, - None => { - if *pushed { - sess.included_mod_stack.borrow_mut().pop(); + *mod_kind = ModKind::Loaded(items, Inline::No, inner_span); + item.attrs = attrs; + if item.attrs.len() > old_attrs_len { + // If we loaded an out-of-line module and added some inner attributes, + // then we need to re-configure it and re-collect attributes for + // resolution and expansion. + item = configure!(self, item); + + if let Some(attr) = self.take_first_attr(&mut item) { + return self + .collect_attr( + attr, + Annotatable::Item(item), + AstFragmentKind::Items, + ) + .make_items(); } - return Default::default(); } - }; - dir + (Some(file_path), dir_path, dir_ownership) + } }; // Set the module info before we flat map. - self.cx.current_expansion.directory_ownership = ownership; - module.directory = path; + let mut module = self.cx.current_expansion.module.with_dir_path(dir_path); module.mod_path.push(ident); + if let Some(file_path) = file_path { + module.file_path_stack.push(file_path); + } + let orig_module = mem::replace(&mut self.cx.current_expansion.module, Rc::new(module)); + let orig_dir_ownership = + mem::replace(&mut self.cx.current_expansion.dir_ownership, dir_ownership); let result = noop_flat_map_item(item, self); // Restore the module info. + self.cx.current_expansion.dir_ownership = orig_dir_ownership; self.cx.current_expansion.module = orig_module; - self.cx.current_expansion.directory_ownership = orig_ownership; - if *pushed { - sess.included_mod_stack.borrow_mut().pop(); - } + result } _ => { @@ -1511,15 +1424,12 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { }); } - fn visit_foreign_mod(&mut self, foreign_mod: &mut ast::ForeignMod) { - self.cfg.configure_foreign_mod(foreign_mod); - noop_visit_foreign_mod(foreign_mod, self); - } - fn flat_map_foreign_item( &mut self, - mut foreign_item: P, + foreign_item: P, ) -> SmallVec<[P; 1]> { + let mut foreign_item = configure!(self, foreign_item); + if let Some(attr) = self.take_first_attr(&mut foreign_item) { return self .collect_attr( @@ -1544,11 +1454,6 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { } } - fn visit_item_kind(&mut self, item: &mut ast::ItemKind) { - self.cfg.configure_item_kind(item); - noop_visit_item_kind(item, self); - } - fn flat_map_generic_param( &mut self, param: ast::GenericParam, @@ -1707,11 +1612,6 @@ impl<'a, 'b> MutVisitor for InvocationCollector<'a, 'b> { *id = self.cx.resolver.next_node_id() } } - - fn visit_fn_decl(&mut self, mut fn_decl: &mut P) { - self.cfg.configure_fn_decl(&mut fn_decl); - noop_visit_fn_decl(fn_decl, self); - } } pub struct ExpansionConfig<'feat> { @@ -1719,9 +1619,8 @@ pub struct ExpansionConfig<'feat> { pub features: Option<&'feat Features>, pub recursion_limit: Limit, pub trace_mac: bool, - pub should_test: bool, // If false, strip `#[test]` nodes - pub keep_macs: bool, - pub span_debug: bool, // If true, use verbose debugging for `proc_macro::Span` + pub should_test: bool, // If false, strip `#[test]` nodes + pub span_debug: bool, // If true, use verbose debugging for `proc_macro::Span` pub proc_macro_backtrace: bool, // If true, show backtraces for proc-macro panics } @@ -1733,7 +1632,6 @@ impl<'feat> ExpansionConfig<'feat> { recursion_limit: Limit::new(1024), trace_mac: false, should_test: false, - keep_macs: false, span_debug: false, proc_macro_backtrace: false, } diff --git a/compiler/rustc_expand/src/lib.rs b/compiler/rustc_expand/src/lib.rs index 3b722c04cb..1a93975533 100644 --- a/compiler/rustc_expand/src/lib.rs +++ b/compiler/rustc_expand/src/lib.rs @@ -1,6 +1,7 @@ #![feature(bool_to_option)] #![feature(crate_visibility_modifier)] #![feature(decl_macro)] +#![feature(destructuring_assignment)] #![feature(or_patterns)] #![feature(proc_macro_diagnostic)] #![feature(proc_macro_internals)] diff --git a/compiler/rustc_expand/src/module.rs b/compiler/rustc_expand/src/module.rs index 171cb3fa8e..c5ce0baaa8 100644 --- a/compiler/rustc_expand/src/module.rs +++ b/compiler/rustc_expand/src/module.rs @@ -1,236 +1,175 @@ -use rustc_ast::{token, Attribute, Mod, Unsafe}; -use rustc_errors::{struct_span_err, PResult}; +use crate::base::ModuleData; +use rustc_ast::ptr::P; +use rustc_ast::{token, Attribute, Inline, Item}; +use rustc_errors::{struct_span_err, DiagnosticBuilder}; use rustc_parse::new_parser_from_file; use rustc_session::parse::ParseSess; use rustc_session::Session; -use rustc_span::source_map::{FileName, Span}; use rustc_span::symbol::{sym, Ident}; +use rustc_span::Span; use std::path::{self, Path, PathBuf}; -#[derive(Clone)] -pub struct Directory { - pub path: PathBuf, - pub ownership: DirectoryOwnership, -} - #[derive(Copy, Clone)] -pub enum DirectoryOwnership { +pub enum DirOwnership { Owned { // None if `mod.rs`, `Some("foo")` if we're in `foo.rs`. relative: Option, }, UnownedViaBlock, - UnownedViaMod, } -/// Information about the path to a module. // Public for rustfmt usage. -pub struct ModulePath<'a> { - name: String, - path_exists: bool, - pub result: PResult<'a, ModulePathSuccess>, +pub struct ModulePathSuccess { + pub file_path: PathBuf, + pub dir_ownership: DirOwnership, } -// Public for rustfmt usage. -pub struct ModulePathSuccess { - pub path: PathBuf, - pub ownership: DirectoryOwnership, +crate struct ParsedExternalMod { + pub items: Vec>, + pub inner_span: Span, + pub file_path: PathBuf, + pub dir_path: PathBuf, + pub dir_ownership: DirOwnership, +} + +pub enum ModError<'a> { + CircularInclusion(Vec), + ModInBlock(Option), + FileNotFound(Ident, PathBuf), + MultipleCandidates(Ident, String, String), + ParserError(DiagnosticBuilder<'a>), } crate fn parse_external_mod( sess: &Session, - id: Ident, + ident: Ident, span: Span, // The span to blame on errors. - unsafety: Unsafe, - Directory { mut ownership, path }: Directory, + module: &ModuleData, + mut dir_ownership: DirOwnership, attrs: &mut Vec, - pop_mod_stack: &mut bool, -) -> (Mod, Directory) { +) -> ParsedExternalMod { // We bail on the first error, but that error does not cause a fatal error... (1) - let result: PResult<'_, _> = try { + let result: Result<_, ModError<'_>> = try { // Extract the file path and the new ownership. - let mp = submod_path(sess, id, span, &attrs, ownership, &path)?; - ownership = mp.ownership; + let mp = mod_file_path(sess, ident, &attrs, &module.dir_path, dir_ownership)?; + dir_ownership = mp.dir_ownership; // Ensure file paths are acyclic. - let mut included_mod_stack = sess.parse_sess.included_mod_stack.borrow_mut(); - error_on_circular_module(&sess.parse_sess, span, &mp.path, &included_mod_stack)?; - included_mod_stack.push(mp.path.clone()); - *pop_mod_stack = true; // We have pushed, so notify caller. - drop(included_mod_stack); + if let Some(pos) = module.file_path_stack.iter().position(|p| p == &mp.file_path) { + Err(ModError::CircularInclusion(module.file_path_stack[pos..].to_vec()))?; + } // Actually parse the external file as a module. - let mut parser = new_parser_from_file(&sess.parse_sess, &mp.path, Some(span)); - let mut module = parser.parse_mod(&token::Eof, unsafety)?; - module.0.inline = false; - module + let mut parser = new_parser_from_file(&sess.parse_sess, &mp.file_path, Some(span)); + let (mut inner_attrs, items, inner_span) = + parser.parse_mod(&token::Eof).map_err(|err| ModError::ParserError(err))?; + attrs.append(&mut inner_attrs); + (items, inner_span, mp.file_path) }; // (1) ...instead, we return a dummy module. - let (module, mut new_attrs) = result.map_err(|mut err| err.emit()).unwrap_or_else(|_| { - let module = Mod { inner: Span::default(), unsafety, items: Vec::new(), inline: false }; - (module, Vec::new()) - }); - attrs.append(&mut new_attrs); - - // Extract the directory path for submodules of `module`. - let path = sess.source_map().span_to_unmapped_path(module.inner); - let mut path = match path { - FileName::Real(name) => name.into_local_path(), - other => PathBuf::from(other.to_string()), - }; - path.pop(); + let (items, inner_span, file_path) = + result.map_err(|err| err.report(sess, span)).unwrap_or_default(); - (module, Directory { ownership, path }) -} + // Extract the directory path for submodules of the module. + let dir_path = file_path.parent().unwrap_or(&file_path).to_owned(); -fn error_on_circular_module<'a>( - sess: &'a ParseSess, - span: Span, - path: &Path, - included_mod_stack: &[PathBuf], -) -> PResult<'a, ()> { - if let Some(i) = included_mod_stack.iter().position(|p| *p == path) { - let mut err = String::from("circular modules: "); - for p in &included_mod_stack[i..] { - err.push_str(&p.to_string_lossy()); - err.push_str(" -> "); - } - err.push_str(&path.to_string_lossy()); - return Err(sess.span_diagnostic.struct_span_err(span, &err[..])); - } - Ok(()) + ParsedExternalMod { items, inner_span, file_path, dir_path, dir_ownership } } -crate fn push_directory( +crate fn mod_dir_path( sess: &Session, - id: Ident, + ident: Ident, attrs: &[Attribute], - Directory { mut ownership, mut path }: Directory, -) -> Directory { - if let Some(filename) = sess.first_attr_value_str_by_name(attrs, sym::path) { - path.push(&*filename.as_str()); - ownership = DirectoryOwnership::Owned { relative: None }; - } else { - // We have to push on the current module name in the case of relative - // paths in order to ensure that any additional module paths from inline - // `mod x { ... }` come after the relative extension. - // - // For example, a `mod z { ... }` inside `x/y.rs` should set the current - // directory path to `/x/y/z`, not `/x/z` with a relative offset of `y`. - if let DirectoryOwnership::Owned { relative } = &mut ownership { - if let Some(ident) = relative.take() { - // Remove the relative offset. - path.push(&*ident.as_str()); + module: &ModuleData, + mut dir_ownership: DirOwnership, + inline: Inline, +) -> (PathBuf, DirOwnership) { + match inline { + Inline::Yes => { + if let Some(file_path) = mod_file_path_from_attr(sess, attrs, &module.dir_path) { + // For inline modules file path from `#[path]` is actually the directory path + // for historical reasons, so we don't pop the last segment here. + return (file_path, DirOwnership::Owned { relative: None }); } - } - path.push(&*id.as_str()); - } - Directory { ownership, path } -} -fn submod_path<'a>( - sess: &'a Session, - id: Ident, - span: Span, - attrs: &[Attribute], - ownership: DirectoryOwnership, - dir_path: &Path, -) -> PResult<'a, ModulePathSuccess> { - if let Some(path) = submod_path_from_attr(sess, attrs, dir_path) { - let ownership = match path.file_name().and_then(|s| s.to_str()) { - // All `#[path]` files are treated as though they are a `mod.rs` file. - // This means that `mod foo;` declarations inside `#[path]`-included - // files are siblings, + // We have to push on the current module name in the case of relative + // paths in order to ensure that any additional module paths from inline + // `mod x { ... }` come after the relative extension. // - // Note that this will produce weirdness when a file named `foo.rs` is - // `#[path]` included and contains a `mod foo;` declaration. - // If you encounter this, it's your own darn fault :P - Some(_) => DirectoryOwnership::Owned { relative: None }, - _ => DirectoryOwnership::UnownedViaMod, - }; - return Ok(ModulePathSuccess { ownership, path }); - } + // For example, a `mod z { ... }` inside `x/y.rs` should set the current + // directory path to `/x/y/z`, not `/x/z` with a relative offset of `y`. + let mut dir_path = module.dir_path.clone(); + if let DirOwnership::Owned { relative } = &mut dir_ownership { + if let Some(ident) = relative.take() { + // Remove the relative offset. + dir_path.push(&*ident.as_str()); + } + } + dir_path.push(&*ident.as_str()); - let relative = match ownership { - DirectoryOwnership::Owned { relative } => relative, - DirectoryOwnership::UnownedViaBlock | DirectoryOwnership::UnownedViaMod => None, - }; - let ModulePath { path_exists, name, result } = - default_submod_path(&sess.parse_sess, id, span, relative, dir_path); - match ownership { - DirectoryOwnership::Owned { .. } => Ok(result?), - DirectoryOwnership::UnownedViaBlock => { - let _ = result.map_err(|mut err| err.cancel()); - error_decl_mod_in_block(&sess.parse_sess, span, path_exists, &name) + (dir_path, dir_ownership) } - DirectoryOwnership::UnownedViaMod => { - let _ = result.map_err(|mut err| err.cancel()); - error_cannot_declare_mod_here(&sess.parse_sess, span, path_exists, &name) + Inline::No => { + // FIXME: This is a subset of `parse_external_mod` without actual parsing, + // check whether the logic for unloaded, loaded and inline modules can be unified. + let file_path = mod_file_path(sess, ident, &attrs, &module.dir_path, dir_ownership) + .map(|mp| { + dir_ownership = mp.dir_ownership; + mp.file_path + }) + .unwrap_or_default(); + + // Extract the directory path for submodules of the module. + let dir_path = file_path.parent().unwrap_or(&file_path).to_owned(); + + (dir_path, dir_ownership) } } } -fn error_decl_mod_in_block<'a, T>( - sess: &'a ParseSess, - span: Span, - path_exists: bool, - name: &str, -) -> PResult<'a, T> { - let msg = "Cannot declare a non-inline module inside a block unless it has a path attribute"; - let mut err = sess.span_diagnostic.struct_span_err(span, msg); - if path_exists { - let msg = format!("Maybe `use` the module `{}` instead of redeclaring it", name); - err.span_note(span, &msg); +fn mod_file_path<'a>( + sess: &'a Session, + ident: Ident, + attrs: &[Attribute], + dir_path: &Path, + dir_ownership: DirOwnership, +) -> Result> { + if let Some(file_path) = mod_file_path_from_attr(sess, attrs, dir_path) { + // All `#[path]` files are treated as though they are a `mod.rs` file. + // This means that `mod foo;` declarations inside `#[path]`-included + // files are siblings, + // + // Note that this will produce weirdness when a file named `foo.rs` is + // `#[path]` included and contains a `mod foo;` declaration. + // If you encounter this, it's your own darn fault :P + let dir_ownership = DirOwnership::Owned { relative: None }; + return Ok(ModulePathSuccess { file_path, dir_ownership }); } - Err(err) -} -fn error_cannot_declare_mod_here<'a, T>( - sess: &'a ParseSess, - span: Span, - path_exists: bool, - name: &str, -) -> PResult<'a, T> { - let mut err = - sess.span_diagnostic.struct_span_err(span, "cannot declare a new module at this location"); - if !span.is_dummy() { - if let FileName::Real(src_name) = sess.source_map().span_to_filename(span) { - let src_path = src_name.into_local_path(); - if let Some(stem) = src_path.file_stem() { - let mut dest_path = src_path.clone(); - dest_path.set_file_name(stem); - dest_path.push("mod.rs"); - err.span_note( - span, - &format!( - "maybe move this module `{}` to its own directory via `{}`", - src_path.display(), - dest_path.display() - ), - ); - } - } - } - if path_exists { - err.span_note( - span, - &format!("... or maybe `use` the module `{}` instead of possibly redeclaring it", name), - ); + let relative = match dir_ownership { + DirOwnership::Owned { relative } => relative, + DirOwnership::UnownedViaBlock => None, + }; + let result = default_submod_path(&sess.parse_sess, ident, relative, dir_path); + match dir_ownership { + DirOwnership::Owned { .. } => result, + DirOwnership::UnownedViaBlock => Err(ModError::ModInBlock(match result { + Ok(_) | Err(ModError::MultipleCandidates(..)) => Some(ident), + _ => None, + })), } - Err(err) } /// Derive a submodule path from the first found `#[path = "path_string"]`. /// The provided `dir_path` is joined with the `path_string`. -pub(super) fn submod_path_from_attr( +fn mod_file_path_from_attr( sess: &Session, attrs: &[Attribute], dir_path: &Path, ) -> Option { // Extract path string from first `#[path = "path_string"]` attribute. - let path_string = sess.first_attr_value_str_by_name(attrs, sym::path)?; - let path_string = path_string.as_str(); + let path_string = sess.first_attr_value_str_by_name(attrs, sym::path)?.as_str(); // On windows, the base path might have the form // `\\?\foo\bar` in which case it does not tolerate @@ -246,15 +185,14 @@ pub(super) fn submod_path_from_attr( // Public for rustfmt usage. pub fn default_submod_path<'a>( sess: &'a ParseSess, - id: Ident, - span: Span, + ident: Ident, relative: Option, dir_path: &Path, -) -> ModulePath<'a> { +) -> Result> { // If we're in a foo.rs file instead of a mod.rs file, // we need to look for submodules in - // `./foo/.rs` and `./foo//mod.rs` rather than - // `./.rs` and `.//mod.rs`. + // `./foo/.rs` and `./foo//mod.rs` rather than + // `./.rs` and `.//mod.rs`. let relative_prefix_string; let relative_prefix = if let Some(ident) = relative { relative_prefix_string = format!("{}{}", ident.name, path::MAIN_SEPARATOR); @@ -263,7 +201,7 @@ pub fn default_submod_path<'a>( "" }; - let mod_name = id.name.to_string(); + let mod_name = ident.name.to_string(); let default_path_str = format!("{}{}.rs", relative_prefix, mod_name); let secondary_path_str = format!("{}{}{}mod.rs", relative_prefix, mod_name, path::MAIN_SEPARATOR); @@ -272,44 +210,74 @@ pub fn default_submod_path<'a>( let default_exists = sess.source_map().file_exists(&default_path); let secondary_exists = sess.source_map().file_exists(&secondary_path); - let result = match (default_exists, secondary_exists) { + match (default_exists, secondary_exists) { (true, false) => Ok(ModulePathSuccess { - path: default_path, - ownership: DirectoryOwnership::Owned { relative: Some(id) }, + file_path: default_path, + dir_ownership: DirOwnership::Owned { relative: Some(ident) }, }), (false, true) => Ok(ModulePathSuccess { - path: secondary_path, - ownership: DirectoryOwnership::Owned { relative: None }, + file_path: secondary_path, + dir_ownership: DirOwnership::Owned { relative: None }, }), - (false, false) => { - let mut err = struct_span_err!( - sess.span_diagnostic, - span, - E0583, - "file not found for module `{}`", - mod_name, - ); - err.help(&format!( - "to create the module `{}`, create file \"{}\"", - mod_name, - default_path.display(), - )); - Err(err) - } + (false, false) => Err(ModError::FileNotFound(ident, default_path)), (true, true) => { - let mut err = struct_span_err!( - sess.span_diagnostic, - span, - E0761, - "file for module `{}` found at both {} and {}", - mod_name, - default_path_str, - secondary_path_str, - ); - err.help("delete or rename one of them to remove the ambiguity"); - Err(err) + Err(ModError::MultipleCandidates(ident, default_path_str, secondary_path_str)) } - }; + } +} - ModulePath { name: mod_name, path_exists: default_exists || secondary_exists, result } +impl ModError<'_> { + fn report(self, sess: &Session, span: Span) { + let diag = &sess.parse_sess.span_diagnostic; + match self { + ModError::CircularInclusion(file_paths) => { + let mut msg = String::from("circular modules: "); + for file_path in &file_paths { + msg.push_str(&file_path.display().to_string()); + msg.push_str(" -> "); + } + msg.push_str(&file_paths[0].display().to_string()); + diag.struct_span_err(span, &msg) + } + ModError::ModInBlock(ident) => { + let msg = "cannot declare a non-inline module inside a block unless it has a path attribute"; + let mut err = diag.struct_span_err(span, msg); + if let Some(ident) = ident { + let note = + format!("maybe `use` the module `{}` instead of redeclaring it", ident); + err.span_note(span, ¬e); + } + err + } + ModError::FileNotFound(ident, default_path) => { + let mut err = struct_span_err!( + diag, + span, + E0583, + "file not found for module `{}`", + ident, + ); + err.help(&format!( + "to create the module `{}`, create file \"{}\"", + ident, + default_path.display(), + )); + err + } + ModError::MultipleCandidates(ident, default_path_short, secondary_path_short) => { + let mut err = struct_span_err!( + diag, + span, + E0761, + "file for module `{}` found at both {} and {}", + ident, + default_path_short, + secondary_path_short, + ); + err.help("delete or rename one of them to remove the ambiguity"); + err + } + ModError::ParserError(err) => err, + }.emit() + } } diff --git a/compiler/rustc_expand/src/mut_visit/tests.rs b/compiler/rustc_expand/src/mut_visit/tests.rs index be0300bad9..7e7155ad27 100644 --- a/compiler/rustc_expand/src/mut_visit/tests.rs +++ b/compiler/rustc_expand/src/mut_visit/tests.rs @@ -7,8 +7,8 @@ use rustc_span::symbol::Ident; use rustc_span::with_default_session_globals; // This version doesn't care about getting comments or doc-strings in. -fn fake_print_crate(s: &mut pprust::State<'_>, krate: &ast::Crate) { - s.print_mod(&krate.module, &krate.attrs) +fn print_crate_items(krate: &ast::Crate) -> String { + krate.items.iter().map(|i| pprust::item_to_string(i)).collect::>().join(" ") } // Change every identifier to "zz". @@ -46,7 +46,7 @@ fn ident_transformation() { assert_pred!( matches_codepattern, "matches_codepattern", - pprust::to_string(|s| fake_print_crate(s, &krate)), + print_crate_items(&krate), "#[zz]mod zz{fn zz(zz:zz,zz:zz){zz!(zz,zz,zz);zz;zz}}".to_string() ); }) @@ -66,7 +66,7 @@ fn ident_transformation_in_defs() { assert_pred!( matches_codepattern, "matches_codepattern", - pprust::to_string(|s| fake_print_crate(s, &krate)), + print_crate_items(&krate), "macro_rules! zz{(zz$zz:zz$(zz $zz:zz)zz+=>(zz$(zz$zz$zz)+))}".to_string() ); }) diff --git a/compiler/rustc_expand/src/parse/tests.rs b/compiler/rustc_expand/src/parse/tests.rs index f4fcaf5c0a..56f25ffdb0 100644 --- a/compiler/rustc_expand/src/parse/tests.rs +++ b/compiler/rustc_expand/src/parse/tests.rs @@ -309,8 +309,8 @@ fn out_of_line_mod() { .unwrap() .unwrap(); - if let ast::ItemKind::Mod(ref m) = item.kind { - assert!(m.items.len() == 2); + if let ast::ItemKind::Mod(_, ref mod_kind) = item.kind { + assert!(matches!(mod_kind, ast::ModKind::Loaded(items, ..) if items.len() == 2)); } else { panic!(); } diff --git a/compiler/rustc_expand/src/placeholders.rs b/compiler/rustc_expand/src/placeholders.rs index d040539cd7..6586ba138f 100644 --- a/compiler/rustc_expand/src/placeholders.rs +++ b/compiler/rustc_expand/src/placeholders.rs @@ -117,7 +117,7 @@ pub fn placeholder( span, is_placeholder: true, }]), - AstFragmentKind::Fields => AstFragment::Fields(smallvec![ast::Field { + AstFragmentKind::Fields => AstFragment::Fields(smallvec![ast::ExprField { attrs: Default::default(), expr: expr_placeholder(), id, @@ -126,7 +126,7 @@ pub fn placeholder( span, is_placeholder: true, }]), - AstFragmentKind::FieldPats => AstFragment::FieldPats(smallvec![ast::FieldPat { + AstFragmentKind::FieldPats => AstFragment::FieldPats(smallvec![ast::PatField { attrs: Default::default(), id, ident, @@ -153,7 +153,7 @@ pub fn placeholder( ty: ty(), is_placeholder: true, }]), - AstFragmentKind::StructFields => AstFragment::StructFields(smallvec![ast::StructField { + AstFragmentKind::StructFields => AstFragment::StructFields(smallvec![ast::FieldDef { attrs: Default::default(), id, ident: None, @@ -205,19 +205,19 @@ impl<'a, 'b> MutVisitor for PlaceholderExpander<'a, 'b> { } } - fn flat_map_field(&mut self, field: ast::Field) -> SmallVec<[ast::Field; 1]> { + fn flat_map_expr_field(&mut self, field: ast::ExprField) -> SmallVec<[ast::ExprField; 1]> { if field.is_placeholder { - self.remove(field.id).make_fields() + self.remove(field.id).make_expr_fields() } else { - noop_flat_map_field(field, self) + noop_flat_map_expr_field(field, self) } } - fn flat_map_field_pattern(&mut self, fp: ast::FieldPat) -> SmallVec<[ast::FieldPat; 1]> { + fn flat_map_pat_field(&mut self, fp: ast::PatField) -> SmallVec<[ast::PatField; 1]> { if fp.is_placeholder { - self.remove(fp.id).make_field_patterns() + self.remove(fp.id).make_pat_fields() } else { - noop_flat_map_field_pattern(fp, self) + noop_flat_map_pat_field(fp, self) } } @@ -240,11 +240,11 @@ impl<'a, 'b> MutVisitor for PlaceholderExpander<'a, 'b> { } } - fn flat_map_struct_field(&mut self, sf: ast::StructField) -> SmallVec<[ast::StructField; 1]> { + fn flat_map_field_def(&mut self, sf: ast::FieldDef) -> SmallVec<[ast::FieldDef; 1]> { if sf.is_placeholder { - self.remove(sf.id).make_struct_fields() + self.remove(sf.id).make_field_defs() } else { - noop_flat_map_struct_field(sf, self) + noop_flat_map_field_def(sf, self) } } @@ -371,12 +371,4 @@ impl<'a, 'b> MutVisitor for PlaceholderExpander<'a, 'b> { } } } - - fn visit_mod(&mut self, module: &mut ast::Mod) { - noop_visit_mod(module, self); - // remove macro definitions - module.items.retain( - |item| !matches!(item.kind, ast::ItemKind::MacCall(_) if !self.cx.ecfg.keep_macs), - ); - } } diff --git a/compiler/rustc_expand/src/proc_macro.rs b/compiler/rustc_expand/src/proc_macro.rs index 6779734cfc..61b776ff2d 100644 --- a/compiler/rustc_expand/src/proc_macro.rs +++ b/compiler/rustc_expand/src/proc_macro.rs @@ -1,16 +1,14 @@ use crate::base::{self, *}; use crate::proc_macro_server; +use rustc_ast as ast; use rustc_ast::ptr::P; use rustc_ast::token; use rustc_ast::tokenstream::{CanSynthesizeMissingTokens, TokenStream, TokenTree}; -use rustc_ast::{self as ast, *}; use rustc_data_structures::sync::Lrc; -use rustc_errors::{struct_span_err, Applicability, ErrorReported}; -use rustc_lexer::is_ident; +use rustc_errors::ErrorReported; use rustc_parse::nt_to_tokenstream; use rustc_parse::parser::ForceCollect; -use rustc_span::symbol::sym; use rustc_span::{Span, DUMMY_SP}; const EXEC_STRATEGY: pm::bridge::server::SameThread = pm::bridge::server::SameThread; @@ -92,7 +90,8 @@ impl MultiItemModifier for ProcMacroDerive { } _ => unreachable!(), }; - let input = if item.pretty_printing_compatibility_hack() { + let input = if crate::base::pretty_printing_compatibility_hack(&item, &ecx.sess.parse_sess) + { TokenTree::token(token::Interpolated(Lrc::new(item)), DUMMY_SP).into() } else { nt_to_tokenstream(&item, &ecx.sess.parse_sess, CanSynthesizeMissingTokens::Yes) @@ -142,91 +141,3 @@ impl MultiItemModifier for ProcMacroDerive { ExpandResult::Ready(items) } } - -crate fn collect_derives(cx: &mut ExtCtxt<'_>, attrs: &mut Vec) -> Vec { - let mut result = Vec::new(); - attrs.retain(|attr| { - if !attr.has_name(sym::derive) { - return true; - } - - // 1) First let's ensure that it's a meta item. - let nmis = match attr.meta_item_list() { - None => { - cx.struct_span_err(attr.span, "malformed `derive` attribute input") - .span_suggestion( - attr.span, - "missing traits to be derived", - "#[derive(Trait1, Trait2, ...)]".to_owned(), - Applicability::HasPlaceholders, - ) - .emit(); - return false; - } - Some(x) => x, - }; - - let mut error_reported_filter_map = false; - let mut error_reported_map = false; - let traits = nmis - .into_iter() - // 2) Moreover, let's ensure we have a path and not `#[derive("foo")]`. - .filter_map(|nmi| match nmi { - NestedMetaItem::Literal(lit) => { - error_reported_filter_map = true; - let mut err = struct_span_err!( - cx.sess, - lit.span, - E0777, - "expected path to a trait, found literal", - ); - let token = lit.token.to_string(); - if token.starts_with('"') - && token.len() > 2 - && is_ident(&token[1..token.len() - 1]) - { - err.help(&format!("try using `#[derive({})]`", &token[1..token.len() - 1])); - } else { - err.help("for example, write `#[derive(Debug)]` for `Debug`"); - } - err.emit(); - None - } - NestedMetaItem::MetaItem(mi) => Some(mi), - }) - // 3) Finally, we only accept `#[derive($path_0, $path_1, ..)]` - // but not e.g. `#[derive($path_0 = "value", $path_1(abc))]`. - // In this case we can still at least determine that the user - // wanted this trait to be derived, so let's keep it. - .map(|mi| { - let mut traits_dont_accept = |title, action| { - error_reported_map = true; - let sp = mi.span.with_lo(mi.path.span.hi()); - cx.struct_span_err(sp, title) - .span_suggestion( - sp, - action, - String::new(), - Applicability::MachineApplicable, - ) - .emit(); - }; - match &mi.kind { - MetaItemKind::List(..) => traits_dont_accept( - "traits in `#[derive(...)]` don't accept arguments", - "remove the arguments", - ), - MetaItemKind::NameValue(..) => traits_dont_accept( - "traits in `#[derive(...)]` don't accept values", - "remove the value", - ), - MetaItemKind::Word => {} - } - mi.path - }); - - result.extend(traits); - !error_reported_filter_map && !error_reported_map - }); - result -} diff --git a/compiler/rustc_expand/src/proc_macro_server.rs b/compiler/rustc_expand/src/proc_macro_server.rs index b6195d3bbc..cb41bc8122 100644 --- a/compiler/rustc_expand/src/proc_macro_server.rs +++ b/compiler/rustc_expand/src/proc_macro_server.rs @@ -2,16 +2,21 @@ use crate::base::ExtCtxt; use rustc_ast as ast; use rustc_ast::token; +use rustc_ast::token::Nonterminal; +use rustc_ast::token::NtIdent; use rustc_ast::tokenstream::{self, CanSynthesizeMissingTokens}; use rustc_ast::tokenstream::{DelimSpan, Spacing::*, TokenStream, TreeAndSpacing}; use rustc_ast_pretty::pprust; use rustc_data_structures::sync::Lrc; use rustc_errors::Diagnostic; +use rustc_lint_defs::builtin::PROC_MACRO_BACK_COMPAT; +use rustc_lint_defs::BuiltinLintDiagnostics; use rustc_parse::lexer::nfc_normalize; use rustc_parse::{nt_to_tokenstream, parse_stream_from_source_str}; use rustc_session::parse::ParseSess; +use rustc_span::hygiene::ExpnKind; use rustc_span::symbol::{self, kw, sym, Symbol}; -use rustc_span::{BytePos, FileName, MultiSpan, Pos, SourceFile, Span}; +use rustc_span::{BytePos, FileName, MultiSpan, Pos, RealFileName, SourceFile, Span}; use pm::bridge::{server, TokenTree}; use pm::{Delimiter, Level, LineColumn, Spacing}; @@ -48,11 +53,11 @@ impl ToInternal for Delimiter { } } -impl FromInternal<(TreeAndSpacing, &'_ ParseSess, &'_ mut Vec)> +impl FromInternal<(TreeAndSpacing, &'_ mut Vec, &mut Rustc<'_>)> for TokenTree { fn from_internal( - ((tree, spacing), sess, stack): (TreeAndSpacing, &ParseSess, &mut Vec), + ((tree, spacing), stack, rustc): (TreeAndSpacing, &mut Vec, &mut Rustc<'_>), ) -> Self { use rustc_ast::token::*; @@ -141,10 +146,10 @@ impl FromInternal<(TreeAndSpacing, &'_ ParseSess, &'_ mut Vec)> SingleQuote => op!('\''), Ident(name, false) if name == kw::DollarCrate => tt!(Ident::dollar_crate()), - Ident(name, is_raw) => tt!(Ident::new(sess, name, is_raw)), + Ident(name, is_raw) => tt!(Ident::new(rustc.sess, name, is_raw)), Lifetime(name) => { let ident = symbol::Ident::new(name, span).without_first_quote(); - stack.push(tt!(Ident::new(sess, ident.name, false))); + stack.push(tt!(Ident::new(rustc.sess, ident.name, false))); tt!(Punct::new('\'', true)) } Literal(lit) => tt!(Literal { lit }), @@ -174,17 +179,15 @@ impl FromInternal<(TreeAndSpacing, &'_ ParseSess, &'_ mut Vec)> } Interpolated(nt) => { - if let Some((name, is_raw)) = - nt.ident_name_compatibility_hack(span, sess.source_map()) - { - TokenTree::Ident(Ident::new(sess, name.name, is_raw, name.span)) + if let Some((name, is_raw)) = ident_name_compatibility_hack(&nt, span, rustc) { + TokenTree::Ident(Ident::new(rustc.sess, name.name, is_raw, name.span)) } else { - let stream = nt_to_tokenstream(&nt, sess, CanSynthesizeMissingTokens::No); + let stream = nt_to_tokenstream(&nt, rustc.sess, CanSynthesizeMissingTokens::No); TokenTree::Group(Group { delimiter: Delimiter::None, stream, span: DelimSpan::from_single(span), - flatten: nt.pretty_printing_compatibility_hack(), + flatten: crate::base::pretty_printing_compatibility_hack(&nt, rustc.sess), }) } } @@ -446,7 +449,7 @@ impl server::TokenStreamIter for Rustc<'_> { loop { let tree = iter.stack.pop().or_else(|| { let next = iter.cursor.next_with_spacing()?; - Some(TokenTree::from_internal((next, self.sess, &mut iter.stack))) + Some(TokenTree::from_internal((next, &mut iter.stack, self))) })?; // A hack used to pass AST fragments to attribute and derive macros // as a single nonterminal token instead of a token stream. @@ -711,3 +714,74 @@ impl server::Span for Rustc<'_> { self.sess.source_map().span_to_snippet(span).ok() } } + +// See issue #74616 for details +fn ident_name_compatibility_hack( + nt: &Nonterminal, + orig_span: Span, + rustc: &mut Rustc<'_>, +) -> Option<(rustc_span::symbol::Ident, bool)> { + if let NtIdent(ident, is_raw) = nt { + if let ExpnKind::Macro(_, macro_name) = orig_span.ctxt().outer_expn_data().kind { + let source_map = rustc.sess.source_map(); + let filename = source_map.span_to_filename(orig_span); + if let FileName::Real(RealFileName::Named(path)) = filename { + let matches_prefix = |prefix, filename| { + // Check for a path that ends with 'prefix*/src/' + let mut iter = path.components().rev(); + iter.next().and_then(|p| p.as_os_str().to_str()) == Some(filename) + && iter.next().and_then(|p| p.as_os_str().to_str()) == Some("src") + && iter + .next() + .and_then(|p| p.as_os_str().to_str()) + .map_or(false, |p| p.starts_with(prefix)) + }; + + let time_macros_impl = + macro_name == sym::impl_macros && matches_prefix("time-macros-impl", "lib.rs"); + if time_macros_impl + || (macro_name == sym::arrays && matches_prefix("js-sys", "lib.rs")) + { + let snippet = source_map.span_to_snippet(orig_span); + if snippet.as_deref() == Ok("$name") { + if time_macros_impl { + rustc.sess.buffer_lint_with_diagnostic( + &PROC_MACRO_BACK_COMPAT, + orig_span, + ast::CRATE_NODE_ID, + "using an old version of `time-macros-impl`", + BuiltinLintDiagnostics::ProcMacroBackCompat( + "the `time-macros-impl` crate will stop compiling in futures version of Rust. \ + Please update to the latest version of the `time` crate to avoid breakage".to_string()) + ); + } + return Some((*ident, *is_raw)); + } + } + + if macro_name == sym::tuple_from_req && matches_prefix("actix-web", "extract.rs") { + let snippet = source_map.span_to_snippet(orig_span); + if snippet.as_deref() == Ok("$T") { + if let FileName::Real(RealFileName::Named(macro_path)) = + source_map.span_to_filename(rustc.def_site) + { + if macro_path.to_string_lossy().contains("pin-project-internal-0.") { + rustc.sess.buffer_lint_with_diagnostic( + &PROC_MACRO_BACK_COMPAT, + orig_span, + ast::CRATE_NODE_ID, + "using an old version of `actix-web`", + BuiltinLintDiagnostics::ProcMacroBackCompat( + "the version of `actix-web` you are using might stop compiling in future versions of Rust; \ + please update to the latest version of the `actix-web` crate to avoid breakage".to_string()) + ); + return Some((*ident, *is_raw)); + } + } + } + } + } + } + } + None +} diff --git a/compiler/rustc_feature/src/accepted.rs b/compiler/rustc_feature/src/accepted.rs index aa54ffb132..9902b6cc9e 100644 --- a/compiler/rustc_feature/src/accepted.rs +++ b/compiler/rustc_feature/src/accepted.rs @@ -272,9 +272,11 @@ declare_features! ( (accepted, doc_alias, "1.48.0", Some(50146), None), /// Allows patterns with concurrent by-move and by-ref bindings. /// For example, you can write `Foo(a, ref b)` where `a` is by-move and `b` is by-ref. - (accepted, move_ref_pattern, "1.48.0", Some(68354), None), + (accepted, move_ref_pattern, "1.49.0", Some(68354), None), /// The smallest useful subset of `const_generics`. (accepted, min_const_generics, "1.51.0", Some(74878), None), + /// The `unsafe_op_in_unsafe_fn` lint (allowed by default): no longer treat an unsafe function as an unsafe block. + (accepted, unsafe_block_in_unsafe_fn, "1.51.0", Some(71668), None), // ------------------------------------------------------------------------- // feature-group-end: accepted features diff --git a/compiler/rustc_feature/src/active.rs b/compiler/rustc_feature/src/active.rs index 4f38e06002..79ec9c2649 100644 --- a/compiler/rustc_feature/src/active.rs +++ b/compiler/rustc_feature/src/active.rs @@ -557,9 +557,6 @@ declare_features! ( /// Allows the use of `#[ffi_const]` on foreign functions. (active, ffi_const, "1.45.0", Some(58328), None), - /// No longer treat an unsafe function as an unsafe block. - (active, unsafe_block_in_unsafe_fn, "1.45.0", Some(71668), None), - /// Allows `extern "avr-interrupt" fn()` and `extern "avr-non-blocking-interrupt" fn()`. (active, abi_avr_interrupt, "1.45.0", Some(69664), None), @@ -633,7 +630,23 @@ declare_features! ( (active, abi_c_cmse_nonsecure_call, "1.51.0", Some(81391), None), /// Lessens the requirements for structs to implement `Unsize`. - (active, relaxed_struct_unsize, "1.51.0", Some(1), None), + (active, relaxed_struct_unsize, "1.51.0", Some(81793), None), + + /// Allows macro attributes to observe output of `#[derive]`. + (active, macro_attributes_in_derive_output, "1.51.0", Some(81119), None), + + /// Allows `pub` on `macro_rules` items. + (active, pub_macro_rules, "1.52.0", Some(78855), None), + + /// Allows the use of type alias impl trait in function return positions + (active, min_type_alias_impl_trait, "1.52.0", Some(63063), None), + + /// Allows associated types in inherent impls. + (active, inherent_associated_types, "1.52.0", Some(8995), None), + + /// Allows `extern "C-unwind" fn` to enable unwinding across ABI boundaries. + (active, c_unwind, "1.52.0", Some(74990), None), + // ------------------------------------------------------------------------- // feature-group-end: actual feature gates // ------------------------------------------------------------------------- @@ -659,6 +672,8 @@ pub const INCOMPLETE_FEATURES: &[Symbol] = &[ sym::unsized_locals, sym::capture_disjoint_fields, sym::const_generics_defaults, + sym::inherent_associated_types, + sym::type_alias_impl_trait, ]; /// Some features are not allowed to be used together at the same time, if diff --git a/compiler/rustc_feature/src/builtin_attrs.rs b/compiler/rustc_feature/src/builtin_attrs.rs index 3ed5320da7..072062dd61 100644 --- a/compiler/rustc_feature/src/builtin_attrs.rs +++ b/compiler/rustc_feature/src/builtin_attrs.rs @@ -188,7 +188,6 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ ungated!(reexport_test_harness_main, Normal, template!(NameValueStr: "name")), // Macros: - ungated!(derive, Normal, template!(List: "Trait1, Trait2, ...")), ungated!(automatically_derived, Normal, template!(Word)), // FIXME(#14407) ungated!(macro_use, Normal, template!(Word, List: "name1, name2, ...")), @@ -471,6 +470,7 @@ pub const BUILTIN_ATTRIBUTES: &[BuiltinAttribute] = &[ rustc_attr!(rustc_promotable, AssumedUsed, template!(Word), IMPL_DETAIL), rustc_attr!(rustc_args_required_const, AssumedUsed, template!(List: "N"), INTERNAL_UNSTABLE), + rustc_attr!(rustc_legacy_const_generics, AssumedUsed, template!(List: "N"), INTERNAL_UNSTABLE), // ========================================================================== // Internal attributes, Layout related: diff --git a/compiler/rustc_feature/src/removed.rs b/compiler/rustc_feature/src/removed.rs index 38a3a4e3d4..aff66053c9 100644 --- a/compiler/rustc_feature/src/removed.rs +++ b/compiler/rustc_feature/src/removed.rs @@ -106,7 +106,7 @@ declare_features! ( Some("subsumed by `.await` syntax")), /// Allows defining `existential type`s. (removed, existential_type, "1.38.0", Some(63063), None, - Some("removed in favor of `#![feature(type_alias_impl_trait)]`")), + Some("removed in favor of `#![feature(min_type_alias_impl_trait)]`")), /// Allows using the macros: /// + `__diagnostic_used` /// + `__register_diagnostic` diff --git a/compiler/rustc_hir/Cargo.toml b/compiler/rustc_hir/Cargo.toml index c14165454e..d41b81f8f2 100644 --- a/compiler/rustc_hir/Cargo.toml +++ b/compiler/rustc_hir/Cargo.toml @@ -17,4 +17,4 @@ rustc_span = { path = "../rustc_span" } rustc_serialize = { path = "../rustc_serialize" } rustc_ast = { path = "../rustc_ast" } tracing = "0.1" -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } diff --git a/compiler/rustc_hir/src/arena.rs b/compiler/rustc_hir/src/arena.rs index c7dc66b70f..ddf8218616 100644 --- a/compiler/rustc_hir/src/arena.rs +++ b/compiler/rustc_hir/src/arena.rs @@ -25,8 +25,8 @@ macro_rules! arena_types { [] 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>, + [] expr_field: rustc_hir::ExprField<$tcx>, + [] pat_field: rustc_hir::PatField<$tcx>, [] fn_decl: rustc_hir::FnDecl<$tcx>, [] foreign_item: rustc_hir::ForeignItem<$tcx>, [few] foreign_item_ref: rustc_hir::ForeignItemRef<$tcx>, @@ -42,7 +42,7 @@ macro_rules! arena_types { [] poly_trait_ref: rustc_hir::PolyTraitRef<$tcx>, [] qpath: rustc_hir::QPath<$tcx>, [] stmt: rustc_hir::Stmt<$tcx>, - [] struct_field: rustc_hir::StructField<$tcx>, + [] field_def: rustc_hir::FieldDef<$tcx>, [] trait_item_ref: rustc_hir::TraitItemRef, [] ty: rustc_hir::Ty<$tcx>, [] type_binding: rustc_hir::TypeBinding<$tcx>, diff --git a/compiler/rustc_hir/src/definitions.rs b/compiler/rustc_hir/src/definitions.rs index 6a1b9bdbb9..3266dfac70 100644 --- a/compiler/rustc_hir/src/definitions.rs +++ b/compiler/rustc_hir/src/definitions.rs @@ -5,13 +5,16 @@ //! expressions) that are mostly just leftovers. pub use crate::def_id::DefPathHash; -use crate::def_id::{CrateNum, DefId, DefIndex, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE}; +use crate::def_id::{ + CrateNum, DefId, DefIndex, LocalDefId, StableCrateId, CRATE_DEF_INDEX, LOCAL_CRATE, +}; use crate::hir; -use rustc_ast::crate_disambiguator::CrateDisambiguator; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::stable_hasher::StableHasher; +use rustc_data_structures::unhash::UnhashMap; use rustc_index::vec::IndexVec; +use rustc_span::crate_disambiguator::CrateDisambiguator; use rustc_span::hygiene::ExpnId; use rustc_span::symbol::{kw, sym, Symbol}; @@ -27,6 +30,7 @@ use tracing::debug; pub struct DefPathTable { index_to_key: IndexVec, def_path_hashes: IndexVec, + def_path_hash_to_index: UnhashMap, } impl DefPathTable { @@ -39,6 +43,35 @@ impl DefPathTable { }; self.def_path_hashes.push(def_path_hash); debug_assert!(self.def_path_hashes.len() == self.index_to_key.len()); + + // Check for hash collisions of DefPathHashes. These should be + // exceedingly rare. + if let Some(existing) = self.def_path_hash_to_index.insert(def_path_hash, index) { + let def_path1 = DefPath::make(LOCAL_CRATE, existing, |idx| self.def_key(idx)); + let def_path2 = DefPath::make(LOCAL_CRATE, index, |idx| self.def_key(idx)); + + // Continuing with colliding DefPathHashes can lead to correctness + // issues. We must abort compilation. + // + // The likelyhood of such a collision is very small, so actually + // running into one could be indicative of a poor hash function + // being used. + // + // See the documentation for DefPathHash for more information. + panic!( + "found DefPathHash collsion between {:?} and {:?}. \ + Compilation cannot continue.", + def_path1, def_path2 + ); + } + + // Assert that all DefPathHashes correctly contain the local crate's + // StableCrateId + #[cfg(debug_assertions)] + if let Some(root) = self.def_path_hashes.get(CRATE_DEF_INDEX) { + assert!(def_path_hash.stable_crate_id() == root.stable_crate_id()); + } + index } @@ -108,13 +141,10 @@ pub struct DefKey { } impl DefKey { - fn compute_stable_hash(&self, parent_hash: DefPathHash) -> DefPathHash { + pub(crate) fn compute_stable_hash(&self, parent: DefPathHash) -> DefPathHash { let mut hasher = StableHasher::new(); - // We hash a `0u8` here to disambiguate between regular `DefPath` hashes, - // and the special "root_parent" below. - 0u8.hash(&mut hasher); - parent_hash.hash(&mut hasher); + parent.hash(&mut hasher); let DisambiguatedDefPathData { ref data, disambiguator } = self.disambiguated_data; @@ -127,19 +157,13 @@ impl DefKey { disambiguator.hash(&mut hasher); - DefPathHash(hasher.finish()) - } + let local_hash: u64 = hasher.finish(); - fn root_parent_stable_hash( - crate_name: &str, - crate_disambiguator: CrateDisambiguator, - ) -> DefPathHash { - let mut hasher = StableHasher::new(); - // Disambiguate this from a regular `DefPath` hash; see `compute_stable_hash()` above. - 1u8.hash(&mut hasher); - crate_name.hash(&mut hasher); - crate_disambiguator.hash(&mut hasher); - DefPathHash(hasher.finish()) + // Construct the new DefPathHash, making sure that the `crate_id` + // portion of the hash is properly copied from the parent. This way the + // `crate_id` part will be recursively propagated from the root to all + // DefPathHashes in this DefPathTable. + DefPathHash::new(parent.stable_crate_id(), local_hash) } } @@ -295,6 +319,12 @@ impl Definitions { self.table.def_path_hash(id.local_def_index) } + #[inline] + pub fn def_path_hash_to_def_id(&self, def_path_hash: DefPathHash) -> LocalDefId { + let local_def_index = self.table.def_path_hash_to_index[&def_path_hash]; + LocalDefId { local_def_index } + } + /// Returns the path from the crate root to `index`. The root /// nodes are not included in the path (i.e., this will be an /// empty vector for the crate root). For an inlined item, this @@ -312,11 +342,6 @@ impl Definitions { self.def_id_to_hir_id[id].unwrap() } - #[inline] - pub fn opt_local_def_id_to_hir_id(&self, id: LocalDefId) -> Option { - self.def_id_to_hir_id[id] - } - #[inline] pub fn opt_hir_id_to_local_def_id(&self, hir_id: hir::HirId) -> Option { self.hir_id_to_def_id.get(&hir_id).copied() @@ -332,7 +357,8 @@ impl Definitions { }, }; - let parent_hash = DefKey::root_parent_stable_hash(crate_name, crate_disambiguator); + let stable_crate_id = StableCrateId::new(crate_name, crate_disambiguator); + let parent_hash = DefPathHash::new(stable_crate_id, 0); let def_path_hash = key.compute_stable_hash(parent_hash); // Create the root definition. diff --git a/compiler/rustc_hir/src/hir.rs b/compiler/rustc_hir/src/hir.rs index 67a15418ea..d03584d49a 100644 --- a/compiler/rustc_hir/src/hir.rs +++ b/compiler/rustc_hir/src/hir.rs @@ -1,11 +1,12 @@ -use crate::def::{DefKind, Namespace, Res}; +// ignore-tidy-filelength +use crate::def::{CtorKind, DefKind, Namespace, Res}; use crate::def_id::DefId; crate use crate::hir_id::HirId; use crate::{itemlikevisit, LangItem}; use rustc_ast::util::parser::ExprPrecedence; use rustc_ast::{self as ast, CrateSugar, LlvmAsmDialect}; -use rustc_ast::{AttrVec, Attribute, FloatTy, IntTy, Label, LitKind, StrStyle, UintTy}; +use rustc_ast::{Attribute, FloatTy, IntTy, Label, LitKind, StrStyle, TraitObjectSyntax, UintTy}; pub use rustc_ast::{BorrowKind, ImplPolarity, IsAuto}; pub use rustc_ast::{CaptureBy, Movability, Mutability}; use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece}; @@ -468,7 +469,6 @@ pub enum GenericParamKind<'hir> { 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, @@ -615,11 +615,11 @@ pub struct WhereEqPredicate<'hir> { pub rhs_ty: &'hir Ty<'hir>, } -#[derive(Encodable, Debug, HashStable_Generic)] +#[derive(Default, Encodable, Debug, HashStable_Generic)] 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 items: BTreeSet, pub trait_items: BTreeSet, pub impl_items: BTreeSet, pub foreign_items: BTreeSet, @@ -629,7 +629,6 @@ pub struct ModuleItems { #[derive(Encodable, Debug, HashStable_Generic)] pub struct CrateItem<'hir> { pub module: Mod<'hir>, - pub attrs: &'hir [Attribute], pub span: Span, } @@ -652,13 +651,13 @@ pub struct Crate<'hir> { // does, because it can affect the order in which errors are // detected, which in turn can make UI tests yield // slightly different results. - pub items: BTreeMap>, + pub items: BTreeMap>, pub trait_items: BTreeMap>, pub impl_items: BTreeMap>, pub foreign_items: BTreeMap>, pub bodies: BTreeMap>, - pub trait_impls: 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 @@ -668,16 +667,19 @@ pub struct Crate<'hir> { /// 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, + pub modules: BTreeMap, /// A list of proc macro HirIds, written out in the order in which /// they are declared in the static array generated by proc_macro_harness. pub proc_macros: Vec, pub trait_map: BTreeMap>, + + /// Collected attributes from HIR nodes. + pub attrs: BTreeMap, } impl Crate<'hir> { - pub fn item(&self, id: HirId) -> &Item<'hir> { + pub fn item(&self, id: ItemId) -> &Item<'hir> { &self.items[&id] } @@ -761,16 +763,22 @@ impl Crate<'_> { /// A macro definition, in this crate or imported from another. /// /// Not parsed directly, but created on macro import or `macro_rules!` expansion. -#[derive(Debug, HashStable_Generic)] +#[derive(Debug)] pub struct MacroDef<'hir> { pub ident: Ident, pub vis: Visibility<'hir>, - pub attrs: &'hir [Attribute], - pub hir_id: HirId, + pub def_id: LocalDefId, pub span: Span, pub ast: ast::MacroDef, } +impl MacroDef<'_> { + #[inline] + pub fn hir_id(&self) -> HirId { + HirId::make_owner(self.def_id) + } +} + /// 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`. @@ -874,7 +882,7 @@ impl<'hir> Pat<'hir> { /// are treated the same as` x: x, y: ref y, z: ref mut z`, /// except `is_shorthand` is true. #[derive(Debug, HashStable_Generic)] -pub struct FieldPat<'hir> { +pub struct PatField<'hir> { #[stable_hasher(ignore)] pub hir_id: HirId, /// The identifier for the field. @@ -938,7 +946,7 @@ pub enum PatKind<'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), + Struct(QPath<'hir>, &'hir [PatField<'hir>], bool), /// A tuple struct/variant pattern `Variant(x, y, .., z)`. /// If the `..` pattern fragment is present, then `Option` denotes its position. @@ -1112,25 +1120,25 @@ pub type BinOp = Spanned; #[derive(Copy, Clone, PartialEq, Encodable, Debug, HashStable_Generic)] pub enum UnOp { /// The `*` operator (deferencing). - UnDeref, + Deref, /// The `!` operator (logical negation). - UnNot, + Not, /// The `-` operator (negation). - UnNeg, + Neg, } impl UnOp { pub fn as_str(self) -> &'static str { match self { - Self::UnDeref => "*", - Self::UnNot => "!", - Self::UnNeg => "-", + Self::Deref => "*", + Self::Not => "!", + Self::Neg => "-", } } /// Returns `true` if the unary operator takes its argument by value. pub fn is_by_value(self) -> bool { - matches!(self, Self::UnNeg | Self::UnNot) + matches!(self, Self::Neg | Self::Not) } } @@ -1158,16 +1166,6 @@ pub enum StmtKind<'hir> { Semi(&'hir Expr<'hir>), } -impl<'hir> StmtKind<'hir> { - pub fn attrs(&self, get_item: impl FnOnce(ItemId) -> &'hir Item<'hir>) -> &'hir [Attribute] { - match *self { - StmtKind::Local(ref l) => &l.attrs, - StmtKind::Item(ref item_id) => &get_item(*item_id).attrs, - StmtKind::Expr(ref e) | StmtKind::Semi(ref e) => &e.attrs, - } - } -} - /// Represents a `let` statement (i.e., `let : = ;`). #[derive(Debug, HashStable_Generic)] pub struct Local<'hir> { @@ -1178,7 +1176,6 @@ pub struct Local<'hir> { 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, @@ -1191,7 +1188,6 @@ 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. @@ -1207,7 +1203,7 @@ pub enum Guard<'hir> { } #[derive(Debug, HashStable_Generic)] -pub struct Field<'hir> { +pub struct ExprField<'hir> { #[stable_hasher(ignore)] pub hir_id: HirId, pub ident: Ident, @@ -1274,7 +1270,18 @@ impl Body<'hir> { } /// The type of source expression that caused this generator to be created. -#[derive(Clone, PartialEq, Eq, HashStable_Generic, Encodable, Decodable, Debug, Copy)] +#[derive( + Clone, + PartialEq, + PartialOrd, + Eq, + Hash, + HashStable_Generic, + Encodable, + Decodable, + Debug, + Copy +)] pub enum GeneratorKind { /// An explicit `async` block or the body of an async function. Async(AsyncGeneratorKind), @@ -1292,12 +1299,32 @@ impl fmt::Display for GeneratorKind { } } +impl GeneratorKind { + pub fn descr(&self) -> &'static str { + match self { + GeneratorKind::Async(ask) => ask.descr(), + GeneratorKind::Gen => "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, Encodable, Decodable, Debug, Copy)] +#[derive( + Clone, + PartialEq, + PartialOrd, + Eq, + Hash, + HashStable_Generic, + Encodable, + Decodable, + Debug, + Copy +)] pub enum AsyncGeneratorKind { /// An explicit `async` block written by the user. Block, @@ -1319,6 +1346,16 @@ impl fmt::Display for AsyncGeneratorKind { } } +impl AsyncGeneratorKind { + pub fn descr(&self) -> &'static 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. @@ -1409,14 +1446,9 @@ pub struct AnonConst { 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>, 72); - impl Expr<'_> { pub fn precedence(&self) -> ExprPrecedence { match self.kind { @@ -1477,7 +1509,7 @@ impl Expr<'_> { // 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::Unary(UnOp::Deref, _) => true, ExprKind::Field(ref base, _) | ExprKind::Index(ref base, _) => { allow_projections_from(base) || base.is_place_expr(allow_projections_from) @@ -1532,6 +1564,71 @@ impl Expr<'_> { } expr } + + pub fn peel_blocks(&self) -> &Self { + let mut expr = self; + while let ExprKind::Block(Block { expr: Some(inner), .. }, _) = &expr.kind { + expr = inner; + } + expr + } + + pub fn can_have_side_effects(&self) -> bool { + match self.peel_drop_temps().kind { + ExprKind::Path(_) | ExprKind::Lit(_) => false, + ExprKind::Type(base, _) + | ExprKind::Unary(_, base) + | ExprKind::Field(base, _) + | ExprKind::Index(base, _) + | ExprKind::AddrOf(.., base) + | ExprKind::Cast(base, _) => { + // This isn't exactly true for `Index` and all `Unnary`, but we are using this + // method exclusively for diagnostics and there's a *cultural* pressure against + // them being used only for its side-effects. + base.can_have_side_effects() + } + ExprKind::Struct(_, fields, init) => fields + .iter() + .map(|field| field.expr) + .chain(init.into_iter()) + .all(|e| e.can_have_side_effects()), + + ExprKind::Array(args) + | ExprKind::Tup(args) + | ExprKind::Call( + Expr { + kind: + ExprKind::Path(QPath::Resolved( + None, + Path { res: Res::Def(DefKind::Ctor(_, CtorKind::Fn), _), .. }, + )), + .. + }, + args, + ) => args.iter().all(|arg| arg.can_have_side_effects()), + ExprKind::If(..) + | ExprKind::Match(..) + | ExprKind::MethodCall(..) + | ExprKind::Call(..) + | ExprKind::Closure(..) + | ExprKind::Block(..) + | ExprKind::Repeat(..) + | ExprKind::Break(..) + | ExprKind::Continue(..) + | ExprKind::Ret(..) + | ExprKind::Loop(..) + | ExprKind::Assign(..) + | ExprKind::InlineAsm(..) + | ExprKind::LlvmInlineAsm(..) + | ExprKind::AssignOp(..) + | ExprKind::ConstBlock(..) + | ExprKind::Box(..) + | ExprKind::Binary(..) + | ExprKind::Yield(..) + | ExprKind::DropTemps(..) + | ExprKind::Err => true, + } + } } /// Checks if the specified expression is a built-in range literal. @@ -1665,7 +1762,7 @@ pub enum ExprKind<'hir> { /// /// E.g., `Foo {x: 1, y: 2}`, or `Foo {x: 1, .. base}`, /// where `base` is the `Option`. - Struct(&'hir QPath<'hir>, &'hir [Field<'hir>], Option<&'hir Expr<'hir>>), + Struct(&'hir QPath<'hir>, &'hir [ExprField<'hir>], Option<&'hir Expr<'hir>>), /// An array literal constructed from one repeated element. /// @@ -1712,7 +1809,7 @@ impl<'hir> QPath<'hir> { pub fn span(&self) -> Span { match *self { QPath::Resolved(_, path) => path.span, - QPath::TypeRelative(_, ps) => ps.ident.span, + QPath::TypeRelative(qself, ps) => qself.span.to(ps.ident.span), QPath::LangItem(_, span) => span, } } @@ -1911,7 +2008,15 @@ pub struct FnSig<'hir> { // so it can fetched later. #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Encodable, Debug)] pub struct TraitItemId { - pub hir_id: HirId, + pub def_id: LocalDefId, +} + +impl TraitItemId { + #[inline] + pub fn hir_id(&self) -> HirId { + // Items are always HIR owners. + HirId::make_owner(self.def_id) + } } /// Represents an item declaration within a trait declaration, @@ -1921,13 +2026,24 @@ pub struct TraitItemId { #[derive(Debug)] pub struct TraitItem<'hir> { pub ident: Ident, - pub hir_id: HirId, - pub attrs: &'hir [Attribute], + pub def_id: LocalDefId, pub generics: Generics<'hir>, pub kind: TraitItemKind<'hir>, pub span: Span, } +impl TraitItem<'_> { + #[inline] + pub fn hir_id(&self) -> HirId { + // Items are always HIR owners. + HirId::make_owner(self.def_id) + } + + pub fn trait_item_id(&self) -> TraitItemId { + TraitItemId { def_id: self.def_id } + } +} + /// Represents a trait method's body (or just argument names). #[derive(Encodable, Debug, HashStable_Generic)] pub enum TraitFn<'hir> { @@ -1955,22 +2071,41 @@ pub enum TraitItemKind<'hir> { // so it can fetched later. #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Encodable, Debug)] pub struct ImplItemId { - pub hir_id: HirId, + pub def_id: LocalDefId, +} + +impl ImplItemId { + #[inline] + pub fn hir_id(&self) -> HirId { + // Items are always HIR owners. + HirId::make_owner(self.def_id) + } } /// Represents anything within an `impl` block. #[derive(Debug)] pub struct ImplItem<'hir> { pub ident: Ident, - pub hir_id: HirId, + pub def_id: LocalDefId, pub vis: Visibility<'hir>, pub defaultness: Defaultness, - pub attrs: &'hir [Attribute], pub generics: Generics<'hir>, pub kind: ImplItemKind<'hir>, pub span: Span, } +impl ImplItem<'_> { + #[inline] + pub fn hir_id(&self) -> HirId { + // Items are always HIR owners. + HirId::make_owner(self.def_id) + } + + pub fn impl_item_id(&self) -> ImplItemId { + ImplItemId { def_id: self.def_id } + } +} + /// Represents various kinds of content within an `impl`. #[derive(Debug, HashStable_Generic)] pub enum ImplItemKind<'hir> { @@ -2058,6 +2193,28 @@ pub enum PrimTy { } impl PrimTy { + /// All of the primitive types + pub const ALL: [Self; 17] = [ + // any changes here should also be reflected in `PrimTy::from_name` + Self::Int(IntTy::I8), + Self::Int(IntTy::I16), + Self::Int(IntTy::I32), + Self::Int(IntTy::I64), + Self::Int(IntTy::I128), + Self::Int(IntTy::Isize), + Self::Uint(UintTy::U8), + Self::Uint(UintTy::U16), + Self::Uint(UintTy::U32), + Self::Uint(UintTy::U64), + Self::Uint(UintTy::U128), + Self::Uint(UintTy::Usize), + Self::Float(FloatTy::F32), + Self::Float(FloatTy::F64), + Self::Bool, + Self::Char, + Self::Str, + ]; + pub fn name_str(self) -> &'static str { match self { PrimTy::Int(i) => i.name_str(), @@ -2079,6 +2236,33 @@ impl PrimTy { PrimTy::Char => sym::char, } } + + /// Returns the matching `PrimTy` for a `Symbol` such as "str" or "i32". + /// Returns `None` if no matching type is found. + pub fn from_name(name: Symbol) -> Option { + let ty = match name { + // any changes here should also be reflected in `PrimTy::ALL` + sym::i8 => Self::Int(IntTy::I8), + sym::i16 => Self::Int(IntTy::I16), + sym::i32 => Self::Int(IntTy::I32), + sym::i64 => Self::Int(IntTy::I64), + sym::i128 => Self::Int(IntTy::I128), + sym::isize => Self::Int(IntTy::Isize), + sym::u8 => Self::Uint(UintTy::U8), + sym::u16 => Self::Uint(UintTy::U16), + sym::u32 => Self::Uint(UintTy::U32), + sym::u64 => Self::Uint(UintTy::U64), + sym::u128 => Self::Uint(UintTy::U128), + sym::usize => Self::Uint(UintTy::Usize), + sym::f32 => Self::Float(FloatTy::F32), + sym::f64 => Self::Float(FloatTy::F64), + sym::bool => Self::Bool, + sym::char => Self::Char, + sym::str => Self::Str, + _ => return None, + }; + Some(ty) + } } #[derive(Debug, HashStable_Generic)] @@ -2107,7 +2291,9 @@ pub enum OpaqueTyOrigin { AsyncFn, /// `let _: impl Trait = ...` Binding, - /// Impl trait in type aliases, consts, statics, bounds. + /// type aliases: `type Foo = impl Trait;` + TyAlias, + /// Impl trait consts, statics, bounds. Misc, } @@ -2141,7 +2327,7 @@ pub enum TyKind<'hir> { OpaqueDef(ItemId, &'hir [GenericArg<'hir>]), /// A trait object type `Bound1 + Bound2 + Bound3` /// where `Bound` is a trait or a lifetime. - TraitObject(&'hir [PolyTraitRef<'hir>], Lifetime), + TraitObject(&'hir [PolyTraitRef<'hir>], Lifetime, TraitObjectSyntax), /// Unused for now. Typeof(AnonConst), /// `TyKind::Infer` means the type should be inferred instead of it having been @@ -2201,7 +2387,7 @@ pub struct InlineAsm<'hir> { pub line_spans: &'hir [Span], } -#[derive(Copy, Clone, Encodable, Decodable, Debug, HashStable_Generic, PartialEq)] +#[derive(Copy, Clone, Encodable, Decodable, Debug, Hash, HashStable_Generic, PartialEq)] pub struct LlvmInlineAsmOutput { pub constraint: Symbol, pub is_rw: bool, @@ -2212,7 +2398,7 @@ pub struct LlvmInlineAsmOutput { // NOTE(eddyb) This is used within MIR as well, so unlike the rest of the HIR, // it needs to be `Clone` and `Decodable` and use plain `Vec` instead of // arena-allocated slice. -#[derive(Clone, Encodable, Decodable, Debug, HashStable_Generic, PartialEq)] +#[derive(Clone, Encodable, Decodable, Debug, Hash, HashStable_Generic, PartialEq)] pub struct LlvmInlineAsmInner { pub asm: Symbol, pub asm_str_style: StrStyle, @@ -2234,7 +2420,6 @@ pub struct LlvmInlineAsm<'hir> { /// Represents a parameter in a function header. #[derive(Debug, HashStable_Generic)] pub struct Param<'hir> { - pub attrs: &'hir [Attribute], pub hir_id: HirId, pub pat: &'hir Pat<'hir>, pub ty_span: Span, @@ -2352,8 +2537,6 @@ pub struct Variant<'hir> { /// Name of the variant. #[stable_hasher(project(name))] pub ident: Ident, - /// Attributes of the variant. - pub attrs: &'hir [Attribute], /// Id of the variant (not the constructor, see `VariantData::ctor_hir_id()`). pub id: HirId, /// Fields and constructor id of the variant. @@ -2440,17 +2623,16 @@ impl VisibilityKind<'_> { } #[derive(Debug, HashStable_Generic)] -pub struct StructField<'hir> { +pub struct FieldDef<'hir> { pub span: Span, #[stable_hasher(project(name))] pub ident: Ident, pub vis: Visibility<'hir>, pub hir_id: HirId, pub ty: &'hir Ty<'hir>, - pub attrs: &'hir [Attribute], } -impl StructField<'_> { +impl FieldDef<'_> { // Still necessary in couple of places pub fn is_positional(&self) -> bool { let first = self.ident.as_str().as_bytes()[0]; @@ -2464,11 +2646,11 @@ pub enum VariantData<'hir> { /// A struct variant. /// /// E.g., `Bar { .. }` as in `enum Foo { Bar { .. } }`. - Struct(&'hir [StructField<'hir>], /* recovered */ bool), + Struct(&'hir [FieldDef<'hir>], /* recovered */ bool), /// A tuple variant. /// /// E.g., `Bar(..)` as in `enum Foo { Bar(..) }`. - Tuple(&'hir [StructField<'hir>], HirId), + Tuple(&'hir [FieldDef<'hir>], HirId), /// A unit variant. /// /// E.g., `Bar = ..` as in `enum Foo { Bar = .. }`. @@ -2477,7 +2659,7 @@ pub enum VariantData<'hir> { impl VariantData<'hir> { /// Return the fields of this variant. - pub fn fields(&self) -> &'hir [StructField<'hir>] { + pub fn fields(&self) -> &'hir [FieldDef<'hir>] { match *self { VariantData::Struct(ref fields, ..) | VariantData::Tuple(ref fields, ..) => fields, _ => &[], @@ -2496,9 +2678,17 @@ impl VariantData<'hir> { // The bodies for items are stored "out of line", in a separate // hashmap in the `Crate`. Here we just record the hir-id of the item // so it can fetched later. -#[derive(Copy, Clone, Encodable, Debug)] +#[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Encodable, Debug, Hash)] pub struct ItemId { - pub id: HirId, + pub def_id: LocalDefId, +} + +impl ItemId { + #[inline] + pub fn hir_id(&self) -> HirId { + // Items are always HIR owners. + HirId::make_owner(self.def_id) + } } /// An item @@ -2507,13 +2697,24 @@ pub struct ItemId { #[derive(Debug)] pub struct Item<'hir> { pub ident: Ident, - pub hir_id: HirId, - pub attrs: &'hir [Attribute], + pub def_id: LocalDefId, pub kind: ItemKind<'hir>, pub vis: Visibility<'hir>, pub span: Span, } +impl Item<'_> { + #[inline] + pub fn hir_id(&self) -> HirId { + // Items are always HIR owners. + HirId::make_owner(self.def_id) + } + + pub fn item_id(&self) -> ItemId { + ItemId { def_id: self.def_id } + } +} + #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Hash, Debug)] #[derive(Encodable, Decodable, HashStable_Generic)] pub enum Unsafety { @@ -2684,7 +2885,15 @@ pub enum AssocItemKind { // so it can fetched later. #[derive(Copy, Clone, PartialEq, Eq, PartialOrd, Ord, Encodable, Debug)] pub struct ForeignItemId { - pub hir_id: HirId, + pub def_id: LocalDefId, +} + +impl ForeignItemId { + #[inline] + pub fn hir_id(&self) -> HirId { + // Items are always HIR owners. + HirId::make_owner(self.def_id) + } } /// A reference from a foreign block to one of its items. This @@ -2702,17 +2911,27 @@ pub struct ForeignItemRef<'hir> { pub vis: Visibility<'hir>, } -#[derive(Debug, HashStable_Generic)] +#[derive(Debug)] pub struct ForeignItem<'hir> { - #[stable_hasher(project(name))] pub ident: Ident, - pub attrs: &'hir [Attribute], pub kind: ForeignItemKind<'hir>, - pub hir_id: HirId, + pub def_id: LocalDefId, pub span: Span, pub vis: Visibility<'hir>, } +impl ForeignItem<'_> { + #[inline] + pub fn hir_id(&self) -> HirId { + // Items are always HIR owners. + HirId::make_owner(self.def_id) + } + + pub fn foreign_item_id(&self) -> ForeignItemId { + ForeignItemId { def_id: self.def_id } + } +} + /// An item within an `extern` block. #[derive(Debug, HashStable_Generic)] pub enum ForeignItemKind<'hir> { @@ -2748,7 +2967,7 @@ pub enum Node<'hir> { TraitItem(&'hir TraitItem<'hir>), ImplItem(&'hir ImplItem<'hir>), Variant(&'hir Variant<'hir>), - Field(&'hir StructField<'hir>), + Field(&'hir FieldDef<'hir>), AnonConst(&'hir AnonConst), Expr(&'hir Expr<'hir>), Stmt(&'hir Stmt<'hir>), @@ -2779,7 +2998,7 @@ impl<'hir> Node<'hir> { Node::TraitItem(TraitItem { ident, .. }) | Node::ImplItem(ImplItem { ident, .. }) | Node::ForeignItem(ForeignItem { ident, .. }) - | Node::Field(StructField { ident, .. }) + | Node::Field(FieldDef { ident, .. }) | Node::Variant(Variant { ident, .. }) | Node::MacroDef(MacroDef { ident, .. }) | Node::Item(Item { ident, .. }) => Some(*ident), @@ -2822,11 +3041,12 @@ impl<'hir> Node<'hir> { pub fn hir_id(&self) -> Option { match self { - Node::Item(Item { hir_id, .. }) - | Node::ForeignItem(ForeignItem { hir_id, .. }) - | Node::TraitItem(TraitItem { hir_id, .. }) - | Node::ImplItem(ImplItem { hir_id, .. }) - | Node::Field(StructField { hir_id, .. }) + Node::Item(Item { def_id, .. }) + | Node::TraitItem(TraitItem { def_id, .. }) + | Node::ImplItem(ImplItem { def_id, .. }) + | Node::ForeignItem(ForeignItem { def_id, .. }) + | Node::MacroDef(MacroDef { def_id, .. }) => Some(HirId::make_owner(*def_id)), + Node::Field(FieldDef { hir_id, .. }) | Node::AnonConst(AnonConst { hir_id, .. }) | Node::Expr(Expr { hir_id, .. }) | Node::Stmt(Stmt { hir_id, .. }) @@ -2836,7 +3056,6 @@ impl<'hir> Node<'hir> { | Node::Arm(Arm { hir_id, .. }) | Node::Block(Block { hir_id, .. }) | Node::Local(Local { hir_id, .. }) - | Node::MacroDef(MacroDef { hir_id, .. }) | Node::Lifetime(Lifetime { hir_id, .. }) | Node::Param(Param { hir_id, .. }) | Node::GenericParam(GenericParam { hir_id, .. }) => Some(*hir_id), @@ -2848,3 +3067,18 @@ impl<'hir> Node<'hir> { } } } + +// Some nodes are used a lot. Make sure they don't unintentionally get bigger. +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +mod size_asserts { + rustc_data_structures::static_assert_size!(super::Block<'static>, 48); + rustc_data_structures::static_assert_size!(super::Expr<'static>, 64); + rustc_data_structures::static_assert_size!(super::Pat<'static>, 88); + rustc_data_structures::static_assert_size!(super::QPath<'static>, 24); + rustc_data_structures::static_assert_size!(super::Ty<'static>, 72); + + rustc_data_structures::static_assert_size!(super::Item<'static>, 184); + rustc_data_structures::static_assert_size!(super::TraitItem<'static>, 128); + rustc_data_structures::static_assert_size!(super::ImplItem<'static>, 152); + rustc_data_structures::static_assert_size!(super::ForeignItem<'static>, 136); +} diff --git a/compiler/rustc_hir/src/hir_id.rs b/compiler/rustc_hir/src/hir_id.rs index cc8ac4cf5b..e0b3d9026a 100644 --- a/compiler/rustc_hir/src/hir_id.rs +++ b/compiler/rustc_hir/src/hir_id.rs @@ -1,4 +1,5 @@ use crate::def_id::{LocalDefId, CRATE_DEF_INDEX}; +use rustc_index::vec::IndexVec; use std::fmt; /// Uniquely identifies a node in the HIR of the current crate. It is @@ -18,6 +19,22 @@ pub struct HirId { pub local_id: ItemLocalId, } +impl HirId { + pub fn expect_owner(self) -> LocalDefId { + assert_eq!(self.local_id.index(), 0); + self.owner + } + + pub fn as_owner(self) -> Option { + if self.local_id.index() == 0 { Some(self.owner) } else { None } + } + + #[inline] + pub fn make_owner(owner: LocalDefId) -> Self { + Self { owner, local_id: ItemLocalId::from_u32(0) } + } +} + impl fmt::Display for HirId { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{:?}", self) @@ -45,3 +62,69 @@ pub const CRATE_HIR_ID: HirId = HirId { owner: LocalDefId { local_def_index: CRATE_DEF_INDEX }, local_id: ItemLocalId::from_u32(0), }; + +#[derive(Clone, Default, Debug, Encodable, Decodable)] +pub struct HirIdVec { + map: IndexVec>, +} + +impl HirIdVec { + pub fn push_owner(&mut self, id: LocalDefId) { + self.map.ensure_contains_elem(id, IndexVec::new); + } + + pub fn push(&mut self, id: HirId, value: T) { + if id.local_id == ItemLocalId::from_u32(0) { + self.push_owner(id.owner); + } + let submap = &mut self.map[id.owner]; + let _ret_id = submap.push(value); + debug_assert_eq!(_ret_id, id.local_id); + } + + pub fn push_sparse(&mut self, id: HirId, value: T) + where + T: Default, + { + self.map.ensure_contains_elem(id.owner, IndexVec::new); + let submap = &mut self.map[id.owner]; + let i = id.local_id.index(); + let len = submap.len(); + if i >= len { + submap.extend(std::iter::repeat_with(T::default).take(i - len + 1)); + } + submap[id.local_id] = value; + } + + pub fn get(&self, id: HirId) -> Option<&T> { + self.map.get(id.owner)?.get(id.local_id) + } + + pub fn get_owner(&self, id: LocalDefId) -> &IndexVec { + &self.map[id] + } + + pub fn iter(&self) -> impl Iterator { + self.map.iter().flat_map(|la| la.iter()) + } + + pub fn iter_enumerated(&self) -> impl Iterator { + self.map.iter_enumerated().flat_map(|(owner, la)| { + la.iter_enumerated().map(move |(local_id, attr)| (HirId { owner, local_id }, attr)) + }) + } +} + +impl std::ops::Index for HirIdVec { + type Output = T; + + fn index(&self, id: HirId) -> &T { + &self.map[id.owner][id.local_id] + } +} + +impl std::ops::IndexMut for HirIdVec { + fn index_mut(&mut self, id: HirId) -> &mut T { + &mut self.map[id.owner][id.local_id] + } +} diff --git a/compiler/rustc_hir/src/intravisit.rs b/compiler/rustc_hir/src/intravisit.rs index f8b3f0d9b6..701e4a6329 100644 --- a/compiler/rustc_hir/src/intravisit.rs +++ b/compiler/rustc_hir/src/intravisit.rs @@ -101,29 +101,21 @@ where #[derive(Copy, Clone)] pub enum FnKind<'a> { /// `#[xxx] pub async/const/extern "Abi" fn foo()` - ItemFn(Ident, &'a Generics<'a>, FnHeader, &'a Visibility<'a>, &'a [Attribute]), + ItemFn(Ident, &'a Generics<'a>, FnHeader, &'a Visibility<'a>), /// `fn foo(&self)` - Method(Ident, &'a FnSig<'a>, Option<&'a Visibility<'a>>, &'a [Attribute]), + Method(Ident, &'a FnSig<'a>, Option<&'a Visibility<'a>>), /// `|x, y| {}` - Closure(&'a [Attribute]), + Closure, } impl<'a> FnKind<'a> { - pub fn attrs(&self) -> &'a [Attribute] { - match *self { - FnKind::ItemFn(.., attrs) => attrs, - FnKind::Method(.., attrs) => attrs, - FnKind::Closure(attrs) => attrs, - } - } - pub fn header(&self) -> Option<&FnHeader> { match *self { - FnKind::ItemFn(_, _, ref header, _, _) => Some(header), - FnKind::Method(_, ref sig, _, _) => Some(&sig.header), - FnKind::Closure(_) => None, + FnKind::ItemFn(_, _, ref header, _) => Some(header), + FnKind::Method(_, ref sig, _) => Some(&sig.header), + FnKind::Closure => None, } } } @@ -133,7 +125,7 @@ pub trait Map<'hir> { /// Retrieves the `Node` corresponding to `id`, returning `None` if cannot be found. fn find(&self, hir_id: HirId) -> Option>; fn body(&self, id: BodyId) -> &'hir Body<'hir>; - fn item(&self, id: HirId) -> &'hir Item<'hir>; + fn item(&self, id: ItemId) -> &'hir Item<'hir>; fn trait_item(&self, id: TraitItemId) -> &'hir TraitItem<'hir>; fn impl_item(&self, id: ImplItemId) -> &'hir ImplItem<'hir>; fn foreign_item(&self, id: ForeignItemId) -> &'hir ForeignItem<'hir>; @@ -150,7 +142,7 @@ impl<'hir> Map<'hir> for ErasedMap<'hir> { fn body(&self, id: BodyId) -> &'hir Body<'hir> { self.0.body(id) } - fn item(&self, id: HirId) -> &'hir Item<'hir> { + fn item(&self, id: ItemId) -> &'hir Item<'hir> { self.0.item(id) } fn trait_item(&self, id: TraitItemId) -> &'hir TraitItem<'hir> { @@ -269,7 +261,7 @@ pub trait Visitor<'v>: Sized { /// reason to override this method is if you want a nested pattern /// but cannot supply a `Map`; see `nested_visit_map` for advice. fn visit_nested_item(&mut self, id: ItemId) { - let opt_item = self.nested_visit_map().inter().map(|map| map.item(id.id)); + let opt_item = self.nested_visit_map().inter().map(|map| map.item(id)); walk_list!(self, visit_item, opt_item); } @@ -423,8 +415,8 @@ pub trait Visitor<'v>: Sized { ) { walk_struct_def(self, s) } - fn visit_struct_field(&mut self, s: &'v StructField<'v>) { - walk_struct_field(self, s) + fn visit_field_def(&mut self, s: &'v FieldDef<'v>) { + walk_field_def(self, s) } fn visit_enum_def( &mut self, @@ -466,7 +458,7 @@ pub trait Visitor<'v>: Sized { 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_attribute(&mut self, _id: HirId, _attr: &'v Attribute) {} fn visit_macro_def(&mut self, macro_def: &'v MacroDef<'v>) { walk_macro_def(self, macro_def) } @@ -484,14 +476,17 @@ 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<'v>) { visitor.visit_mod(&krate.item.module, krate.item.span, CRATE_HIR_ID); - walk_list!(visitor, visit_attribute, krate.item.attrs); walk_list!(visitor, visit_macro_def, krate.exported_macros); + for (&id, attrs) in krate.attrs.iter() { + for a in *attrs { + visitor.visit_attribute(id, a) + } + } } 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_id(macro_def.hir_id()); visitor.visit_ident(macro_def.ident); - walk_list!(visitor, visit_attribute, macro_def.attrs); } pub fn walk_mod<'v, V: Visitor<'v>>(visitor: &mut V, module: &'v Mod<'v>, mod_hir_id: HirId) { @@ -510,7 +505,6 @@ 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); - walk_list!(visitor, visit_attribute, local.attrs.iter()); visitor.visit_id(local.hir_id); visitor.visit_pat(&local.pat); walk_list!(visitor, visit_ty, &local.ty); @@ -557,7 +551,6 @@ pub fn walk_trait_ref<'v, V: Visitor<'v>>(visitor: &mut V, trait_ref: &'v TraitR 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, param.attrs); } pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item<'v>) { @@ -565,51 +558,51 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item<'v>) { visitor.visit_ident(item.ident); match item.kind { ItemKind::ExternCrate(orig_name) => { - visitor.visit_id(item.hir_id); + visitor.visit_id(item.hir_id()); if let Some(orig_name) = orig_name { visitor.visit_name(item.span, orig_name); } } ItemKind::Use(ref path, _) => { - visitor.visit_use(path, item.hir_id); + visitor.visit_use(path, item.hir_id()); } ItemKind::Static(ref typ, _, body) | ItemKind::Const(ref typ, body) => { - visitor.visit_id(item.hir_id); + 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), + FnKind::ItemFn(item.ident, generics, sig.header, &item.vis), &sig.decl, body_id, item.span, - item.hir_id, + 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) + visitor.visit_mod(module, item.span, item.hir_id()) } ItemKind::ForeignMod { abi: _, items } => { - visitor.visit_id(item.hir_id); + visitor.visit_id(item.hir_id()); walk_list!(visitor, visit_foreign_item_ref, items); } ItemKind::GlobalAsm(_) => { - visitor.visit_id(item.hir_id); + visitor.visit_id(item.hir_id()); } ItemKind::TyAlias(ref ty, ref generics) => { - visitor.visit_id(item.hir_id); + visitor.visit_id(item.hir_id()); visitor.visit_ty(ty); visitor.visit_generics(generics) } ItemKind::OpaqueTy(OpaqueTy { ref generics, bounds, .. }) => { - visitor.visit_id(item.hir_id); + visitor.visit_id(item.hir_id()); walk_generics(visitor, generics); walk_list!(visitor, visit_param_bound, bounds); } ItemKind::Enum(ref enum_definition, ref generics) => { visitor.visit_generics(generics); // `visit_enum_def()` takes care of visiting the `Item`'s `HirId`. - visitor.visit_enum_def(enum_definition, generics, item.hir_id, item.span) + visitor.visit_enum_def(enum_definition, generics, item.hir_id(), item.span) } ItemKind::Impl(Impl { unsafety: _, @@ -622,7 +615,7 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item<'v>) { ref self_ty, items, }) => { - visitor.visit_id(item.hir_id); + visitor.visit_id(item.hir_id()); visitor.visit_generics(generics); walk_list!(visitor, visit_trait_ref, of_trait); visitor.visit_ty(self_ty); @@ -631,28 +624,27 @@ pub fn walk_item<'v, V: Visitor<'v>>(visitor: &mut V, item: &'v Item<'v>) { 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_id(item.hir_id()); visitor.visit_variant_data( struct_definition, item.ident.name, generics, - item.hir_id, + item.hir_id(), item.span, ); } ItemKind::Trait(.., ref generics, bounds, trait_item_refs) => { - visitor.visit_id(item.hir_id); + 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, bounds) => { - visitor.visit_id(item.hir_id); + visitor.visit_id(item.hir_id()); visitor.visit_generics(generics); walk_list!(visitor, visit_param_bound, bounds); } } - walk_list!(visitor, visit_attribute, item.attrs); } pub fn walk_use<'v, V: Visitor<'v>>(visitor: &mut V, path: &'v Path<'v>, hir_id: HirId) { @@ -686,7 +678,6 @@ pub fn walk_variant<'v, V: Visitor<'v>>( variant.span, ); walk_list!(visitor, visit_anon_const, &variant.disr_expr); - walk_list!(visitor, visit_attribute, variant.attrs); } pub fn walk_ty<'v, V: Visitor<'v>>(visitor: &mut V, typ: &'v Ty<'v>) { @@ -718,7 +709,7 @@ pub fn walk_ty<'v, V: Visitor<'v>>(visitor: &mut V, typ: &'v Ty<'v>) { visitor.visit_ty(ty); visitor.visit_anon_const(length) } - TyKind::TraitObject(bounds, ref lifetime) => { + TyKind::TraitObject(bounds, ref lifetime, _syntax) => { for bound in bounds { visitor.visit_poly_trait_ref(bound, TraitBoundModifier::None); } @@ -836,7 +827,7 @@ pub fn walk_pat<'v, V: Visitor<'v>>(visitor: &mut V, pattern: &'v Pat<'v>) { } 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_id(foreign_item.hir_id()); visitor.visit_vis(&foreign_item.vis); visitor.visit_ident(foreign_item.ident); @@ -851,8 +842,6 @@ pub fn walk_foreign_item<'v, V: Visitor<'v>>(visitor: &mut V, foreign_item: &'v ForeignItemKind::Static(ref typ, _) => visitor.visit_ty(typ), ForeignItemKind::Type => (), } - - walk_list!(visitor, visit_attribute, foreign_item.attrs); } pub fn walk_param_bound<'v, V: Visitor<'v>>(visitor: &mut V, bound: &'v GenericBound<'v>) { @@ -870,7 +859,6 @@ 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<'v>) { visitor.visit_id(param.hir_id); - walk_list!(visitor, visit_attribute, param.attrs); match param.name { ParamName::Plain(ident) => visitor.visit_ident(ident), ParamName::Error | ParamName::Fresh(_) => {} @@ -940,7 +928,7 @@ 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 => {} } } @@ -960,16 +948,15 @@ pub fn walk_fn<'v, V: Visitor<'v>>( 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); visitor.visit_generics(&trait_item.generics); match trait_item.kind { TraitItemKind::Const(ref ty, default) => { - visitor.visit_id(trait_item.hir_id); + visitor.visit_id(trait_item.hir_id()); visitor.visit_ty(ty); walk_list!(visitor, visit_nested_body, default); } TraitItemKind::Fn(ref sig, TraitFn::Required(param_names)) => { - visitor.visit_id(trait_item.hir_id); + visitor.visit_id(trait_item.hir_id()); visitor.visit_fn_decl(&sig.decl); for ¶m_name in param_names { visitor.visit_ident(param_name); @@ -977,15 +964,15 @@ pub fn walk_trait_item<'v, V: Visitor<'v>>(visitor: &mut V, trait_item: &'v Trai } TraitItemKind::Fn(ref sig, TraitFn::Provided(body_id)) => { visitor.visit_fn( - FnKind::Method(trait_item.ident, sig, None, &trait_item.attrs), + FnKind::Method(trait_item.ident, sig, None), &sig.decl, body_id, trait_item.span, - trait_item.hir_id, + trait_item.hir_id(), ); } TraitItemKind::Type(bounds, ref default) => { - visitor.visit_id(trait_item.hir_id); + visitor.visit_id(trait_item.hir_id()); walk_list!(visitor, visit_param_bound, bounds); walk_list!(visitor, visit_ty, default); } @@ -1003,39 +990,30 @@ pub fn walk_trait_item_ref<'v, V: Visitor<'v>>(visitor: &mut V, trait_item_ref: 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, - attrs, - ref generics, - ref kind, - span: _, - } = *impl_item; + let ImplItem { def_id: _, ident, ref vis, ref defaultness, ref generics, ref kind, span: _ } = + *impl_item; visitor.visit_ident(ident); visitor.visit_vis(vis); visitor.visit_defaultness(defaultness); - walk_list!(visitor, visit_attribute, attrs); visitor.visit_generics(generics); match *kind { ImplItemKind::Const(ref ty, body) => { - visitor.visit_id(impl_item.hir_id); + visitor.visit_id(impl_item.hir_id()); visitor.visit_ty(ty); visitor.visit_nested_body(body); } ImplItemKind::Fn(ref sig, body_id) => { visitor.visit_fn( - FnKind::Method(impl_item.ident, sig, Some(&impl_item.vis), &impl_item.attrs), + FnKind::Method(impl_item.ident, sig, Some(&impl_item.vis)), &sig.decl, body_id, impl_item.span, - impl_item.hir_id, + impl_item.hir_id(), ); } ImplItemKind::TyAlias(ref ty) => { - visitor.visit_id(impl_item.hir_id); + visitor.visit_id(impl_item.hir_id()); visitor.visit_ty(ty); } } @@ -1067,15 +1045,14 @@ pub fn walk_struct_def<'v, V: Visitor<'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()); + walk_list!(visitor, visit_field_def, struct_definition.fields()); } -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); +pub fn walk_field_def<'v, V: Visitor<'v>>(visitor: &mut V, field: &'v FieldDef<'v>) { + visitor.visit_id(field.hir_id); + visitor.visit_vis(&field.vis); + visitor.visit_ident(field.ident); + visitor.visit_ty(&field.ty); } pub fn walk_block<'v, V: Visitor<'v>>(visitor: &mut V, block: &'v Block<'v>) { @@ -1102,7 +1079,6 @@ pub fn walk_anon_const<'v, V: Visitor<'v>>(visitor: &mut V, constant: &'v AnonCo 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(subexpressions) => { @@ -1162,7 +1138,7 @@ pub fn walk_expr<'v, V: Visitor<'v>>(visitor: &mut V, expression: &'v Expr<'v>) } ExprKind::Closure(_, ref function_declaration, body, _fn_decl_span, _gen) => visitor .visit_fn( - FnKind::Closure(&expression.attrs), + FnKind::Closure, function_declaration, body, expression.span, @@ -1246,7 +1222,6 @@ pub fn walk_arm<'v, V: Visitor<'v>>(visitor: &mut V, arm: &'v Arm<'v>) { } } visitor.visit_expr(&arm.body); - walk_list!(visitor, visit_attribute, arm.attrs); } pub fn walk_vis<'v, V: Visitor<'v>>(visitor: &mut V, vis: &'v Visibility<'v>) { diff --git a/compiler/rustc_hir/src/lang_items.rs b/compiler/rustc_hir/src/lang_items.rs index 26ce30cb51..498000db50 100644 --- a/compiler/rustc_hir/src/lang_items.rs +++ b/compiler/rustc_hir/src/lang_items.rs @@ -38,27 +38,34 @@ macro_rules! expand_group { // So you probably just want to nip down to the end. macro_rules! language_item_table { ( - $( $variant:ident $($group:expr)?, $name:expr, $method:ident, $target:expr; )* + $( $(#[$attr:meta])* $variant:ident $($group:expr)?, $module:ident :: $name:ident, $method:ident, $target:expr; )* ) => { enum_from_u32! { /// A representation of all the valid language items in Rust. #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash, Encodable, Decodable)] pub enum LangItem { - $($variant,)* + $( + #[doc = concat!("The `", stringify!($name), "` lang item.")] + /// + $(#[$attr])* + $variant, + )* } } impl LangItem { /// Returns the `name` symbol in `#[lang = "$name"]`. - /// For example, `LangItem::EqTraitLangItem`, - /// that is `#[lang = "eq"]` would result in `sym::eq`. + /// For example, [`LangItem::PartialEq`]`.name()` + /// would result in [`sym::eq`] since it is `#[lang = "eq"]`. pub fn name(self) -> Symbol { match self { - $( LangItem::$variant => $name, )* + $( LangItem::$variant => $module::$name, )* } } + /// The [group](LangItemGroup) that this lang item belongs to, + /// or `None` if it doesn't belong to a group. pub fn group(self) -> Option { use LangItemGroup::*; match self { @@ -67,15 +74,17 @@ macro_rules! language_item_table { } } + /// All of the language items, defined or not. + /// Defined lang items can come from the current crate or its dependencies. #[derive(HashStable_Generic, Debug)] pub struct LanguageItems { - /// Mappings from lang items to their possibly found `DefId`s. - /// The index corresponds to the order in `LangItem`. + /// Mappings from lang items to their possibly found [`DefId`]s. + /// The index corresponds to the order in [`LangItem`]. pub items: Vec>, /// Lang items that were not found during collection. pub missing: Vec, - /// Mapping from `LangItemGroup` discriminants to all - /// `DefId`s of lang items in that group. + /// Mapping from [`LangItemGroup`] discriminants to all + /// [`DefId`]s of lang items in that group. pub groups: [Vec; NUM_GROUPS], } @@ -103,14 +112,13 @@ macro_rules! language_item_table { self.items[it as usize].ok_or_else(|| format!("requires `{}` lang_item", it.name())) } + /// Returns the [`DefId`]s of all lang items in a group. pub fn group(&self, group: LangItemGroup) -> &[DefId] { self.groups[group as usize].as_ref() } $( - /// Returns the corresponding `DefId` for the lang item if it - /// exists. - #[allow(dead_code)] + #[doc = concat!("Returns the [`DefId`] of the `", stringify!($name), "` lang item if it is defined.")] pub fn $method(&self) -> Option { self.items[LangItem::$variant as usize] } @@ -120,7 +128,7 @@ macro_rules! language_item_table { /// A mapping from the name of the lang item to its order and the form it must be of. pub static ITEM_REFS: SyncLazy> = SyncLazy::new(|| { let mut item_refs = FxHashMap::default(); - $( item_refs.insert($name, (LangItem::$variant as usize, $target)); )* + $( item_refs.insert($module::$name, (LangItem::$variant as usize, $target)); )* item_refs }); @@ -140,7 +148,7 @@ impl HashStable for LangItem { /// /// About the `check_name` argument: passing in a `Session` would be simpler, /// because then we could call `Session::check_name` directly. But we want to -/// avoid the need for `librustc_hir` to depend on `librustc_session`, so we +/// avoid the need for `rustc_hir` to depend on `rustc_session`, so we /// use a closure instead. pub fn extract<'a, F>(check_name: F, attrs: &'a [ast::Attribute]) -> Option<(Symbol, Span)> where @@ -190,17 +198,21 @@ language_item_table! { Sized, sym::sized, sized_trait, Target::Trait; Unsize, sym::unsize, unsize_trait, Target::Trait; - // Trait injected by #[derive(PartialEq)], (i.e. "Partial EQ"). + /// Trait injected by `#[derive(PartialEq)]`, (i.e. "Partial EQ"). StructuralPeq, sym::structural_peq, structural_peq_trait, Target::Trait; - // Trait injected by #[derive(Eq)], (i.e. "Total EQ"; no, I will not apologize). + /// Trait injected by `#[derive(Eq)]`, (i.e. "Total EQ"; no, I will not apologize). StructuralTeq, sym::structural_teq, structural_teq_trait, Target::Trait; Copy, sym::copy, copy_trait, Target::Trait; Clone, sym::clone, clone_trait, Target::Trait; Sync, sym::sync, sync_trait, Target::Trait; DiscriminantKind, sym::discriminant_kind, discriminant_kind_trait, Target::Trait; - // The associated item of `trait DiscriminantKind`. + /// The associated item of the [`DiscriminantKind`] trait. Discriminant, sym::discriminant_type, discriminant_type, Target::AssocTy; + PointeeTrait, sym::pointee_trait, pointee_trait, Target::Trait; + Metadata, sym::metadata_type, metadata_type, Target::AssocTy; + DynMetadata, sym::dyn_metadata, dyn_metadata, Target::Struct; + Freeze, sym::freeze, freeze_trait, Target::Trait; Drop, sym::drop, drop_trait, Target::Trait; @@ -238,6 +250,7 @@ language_item_table! { Deref, sym::deref, deref_trait, Target::Trait; DerefMut, sym::deref_mut, deref_mut_trait, Target::Trait; + DerefTarget, sym::deref_target, deref_target, Target::AssocTy; Receiver, sym::receiver, receiver_trait, Target::Trait; Fn, kw::Fn, fn_trait, Target::Trait; @@ -268,7 +281,7 @@ language_item_table! { PanicInfo, sym::panic_info, panic_info, Target::Struct; PanicLocation, sym::panic_location, panic_location, Target::Struct; PanicImpl, sym::panic_impl, panic_impl, Target::Fn; - // libstd panic entry point. Necessary for const eval to be able to catch it + /// libstd panic entry point. Necessary for const eval to be able to catch it BeginPanic, sym::begin_panic, begin_panic_fn, Target::Fn; ExchangeMalloc, sym::exchange_malloc, exchange_malloc_fn, Target::Fn; @@ -290,7 +303,7 @@ language_item_table! { MaybeUninit, sym::maybe_uninit, maybe_uninit, Target::Union; - // Align offset for stride != 1; must not panic. + /// Align offset for stride != 1; must not panic. AlignOffset, sym::align_offset, align_offset_fn, Target::Fn; Termination, sym::termination, termination, Target::Trait; diff --git a/compiler/rustc_hir/src/lib.rs b/compiler/rustc_hir/src/lib.rs index c69a9b063a..45bb911130 100644 --- a/compiler/rustc_hir/src/lib.rs +++ b/compiler/rustc_hir/src/lib.rs @@ -5,6 +5,7 @@ #![feature(crate_visibility_modifier)] #![feature(const_fn)] // For the unsizing cast on `&[]` #![feature(const_panic)] +#![feature(extended_key_value_attributes)] #![feature(in_band_lifetimes)] #![feature(once_cell)] #![feature(or_patterns)] @@ -30,6 +31,9 @@ mod stable_hash_impls; mod target; pub mod weak_lang_items; +#[cfg(test)] +mod tests; + pub use hir::*; pub use hir_id::*; pub use lang_items::{LangItem, LanguageItems}; diff --git a/compiler/rustc_hir/src/stable_hash_impls.rs b/compiler/rustc_hir/src/stable_hash_impls.rs index 439fb88039..55e87663a1 100644 --- a/compiler/rustc_hir/src/stable_hash_impls.rs +++ b/compiler/rustc_hir/src/stable_hash_impls.rs @@ -1,8 +1,8 @@ use rustc_data_structures::stable_hasher::{HashStable, StableHasher, ToStableHashKey}; use crate::hir::{ - BodyId, Expr, ForeignItemId, ImplItem, ImplItemId, Item, ItemId, Mod, TraitItem, TraitItemId, - Ty, VisibilityKind, + BodyId, Expr, ForeignItem, ForeignItemId, ImplItem, ImplItemId, Item, ItemId, MacroDef, Mod, + TraitItem, TraitItemId, Ty, VisibilityKind, }; use crate::hir_id::{HirId, ItemLocalId}; use rustc_span::def_id::{DefPathHash, LocalDefId}; @@ -34,30 +34,39 @@ impl ToStableHashKey for HirId { } } +impl ToStableHashKey for ItemId { + type KeyType = DefPathHash; + + #[inline] + fn to_stable_hash_key(&self, hcx: &HirCtx) -> DefPathHash { + hcx.local_def_path_hash(self.def_id) + } +} + impl ToStableHashKey for TraitItemId { - type KeyType = (DefPathHash, ItemLocalId); + type KeyType = DefPathHash; #[inline] - fn to_stable_hash_key(&self, hcx: &HirCtx) -> (DefPathHash, ItemLocalId) { - self.hir_id.to_stable_hash_key(hcx) + fn to_stable_hash_key(&self, hcx: &HirCtx) -> DefPathHash { + hcx.local_def_path_hash(self.def_id) } } impl ToStableHashKey for ImplItemId { - type KeyType = (DefPathHash, ItemLocalId); + type KeyType = DefPathHash; #[inline] - fn to_stable_hash_key(&self, hcx: &HirCtx) -> (DefPathHash, ItemLocalId) { - self.hir_id.to_stable_hash_key(hcx) + fn to_stable_hash_key(&self, hcx: &HirCtx) -> DefPathHash { + hcx.local_def_path_hash(self.def_id) } } impl ToStableHashKey for ForeignItemId { - type KeyType = (DefPathHash, ItemLocalId); + type KeyType = DefPathHash; #[inline] - fn to_stable_hash_key(&self, hcx: &HirCtx) -> (DefPathHash, ItemLocalId) { - self.hir_id.to_stable_hash_key(hcx) + fn to_stable_hash_key(&self, hcx: &HirCtx) -> DefPathHash { + hcx.local_def_path_hash(self.def_id) } } @@ -82,25 +91,25 @@ impl HashStable for BodyId { impl HashStable for ItemId { fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { - hcx.hash_reference_to_item(self.id, hasher) + hcx.hash_reference_to_item(self.hir_id(), hasher) } } impl HashStable for ForeignItemId { fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { - hcx.hash_reference_to_item(self.hir_id, hasher) + hcx.hash_reference_to_item(self.hir_id(), hasher) } } impl HashStable for ImplItemId { fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { - hcx.hash_reference_to_item(self.hir_id, hasher) + hcx.hash_reference_to_item(self.hir_id(), hasher) } } impl HashStable for TraitItemId { fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { - hcx.hash_reference_to_item(self.hir_id, hasher) + hcx.hash_reference_to_item(self.hir_id(), hasher) } } @@ -130,11 +139,10 @@ impl HashStable for VisibilityKind<'_> impl HashStable for TraitItem<'_> { fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { - let TraitItem { hir_id: _, ident, ref attrs, ref generics, ref kind, span } = *self; + let TraitItem { def_id: _, ident, ref generics, ref kind, span } = *self; hcx.hash_hir_item_like(|hcx| { ident.name.hash_stable(hcx, hasher); - attrs.hash_stable(hcx, hasher); generics.hash_stable(hcx, hasher); kind.hash_stable(hcx, hasher); span.hash_stable(hcx, hasher); @@ -144,22 +152,13 @@ impl HashStable for TraitItem<'_> { impl HashStable for ImplItem<'_> { fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { - let ImplItem { - hir_id: _, - ident, - ref vis, - defaultness, - ref attrs, - ref generics, - ref kind, - span, - } = *self; + let ImplItem { def_id: _, ident, ref vis, defaultness, ref generics, ref kind, span } = + *self; hcx.hash_hir_item_like(|hcx| { ident.name.hash_stable(hcx, hasher); vis.hash_stable(hcx, hasher); defaultness.hash_stable(hcx, hasher); - attrs.hash_stable(hcx, hasher); generics.hash_stable(hcx, hasher); kind.hash_stable(hcx, hasher); span.hash_stable(hcx, hasher); @@ -167,16 +166,41 @@ impl HashStable for ImplItem<'_> { } } +impl HashStable for ForeignItem<'_> { + fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { + let ForeignItem { def_id: _, ident, ref kind, span, ref vis } = *self; + + hcx.hash_hir_item_like(|hcx| { + ident.name.hash_stable(hcx, hasher); + kind.hash_stable(hcx, hasher); + span.hash_stable(hcx, hasher); + vis.hash_stable(hcx, hasher); + }); + } +} + impl HashStable for Item<'_> { fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { - let Item { ident, ref attrs, hir_id: _, ref kind, ref vis, span } = *self; + let Item { ident, def_id: _, ref kind, ref vis, span } = *self; hcx.hash_hir_item_like(|hcx| { ident.name.hash_stable(hcx, hasher); - attrs.hash_stable(hcx, hasher); kind.hash_stable(hcx, hasher); vis.hash_stable(hcx, hasher); span.hash_stable(hcx, hasher); }); } } + +impl HashStable for MacroDef<'_> { + fn hash_stable(&self, hcx: &mut HirCtx, hasher: &mut StableHasher) { + let MacroDef { ident, def_id: _, ref ast, ref vis, span } = *self; + + hcx.hash_hir_item_like(|hcx| { + ident.name.hash_stable(hcx, hasher); + ast.hash_stable(hcx, hasher); + vis.hash_stable(hcx, hasher); + span.hash_stable(hcx, hasher); + }); + } +} diff --git a/compiler/rustc_hir/src/target.rs b/compiler/rustc_hir/src/target.rs index 6dbcfb963e..473477bf22 100644 --- a/compiler/rustc_hir/src/target.rs +++ b/compiler/rustc_hir/src/target.rs @@ -54,6 +54,7 @@ pub enum Target { ForeignTy, GenericParam(GenericParamKind), MacroDef, + Param, } impl Display for Target { @@ -96,6 +97,7 @@ impl Display for Target { GenericParamKind::Const => "const parameter", }, Target::MacroDef => "macro def", + Target::Param => "function param", } ) } diff --git a/compiler/rustc_hir/src/tests.rs b/compiler/rustc_hir/src/tests.rs new file mode 100644 index 0000000000..2aafc6afa2 --- /dev/null +++ b/compiler/rustc_hir/src/tests.rs @@ -0,0 +1,39 @@ +use crate::definitions::{DefKey, DefPathData, DisambiguatedDefPathData}; +use rustc_data_structures::fingerprint::Fingerprint; +use rustc_span::crate_disambiguator::CrateDisambiguator; +use rustc_span::def_id::{DefPathHash, StableCrateId}; + +#[test] +fn def_path_hash_depends_on_crate_id() { + // This test makes sure that *both* halves of a DefPathHash depend on + // the crate-id of the defining crate. This is a desirable property + // because the crate-id can be more easily changed than the DefPath + // of an item, so, in the case of a crate-local DefPathHash collision, + // the user can simply "role the dice again" for all DefPathHashes in + // the crate by changing the crate disambiguator (e.g. via bumping the + // crate's version number). + + let d0 = CrateDisambiguator::from(Fingerprint::new(12, 34)); + let d1 = CrateDisambiguator::from(Fingerprint::new(56, 78)); + + let h0 = mk_test_hash("foo", d0); + let h1 = mk_test_hash("foo", d1); + + assert_ne!(h0.stable_crate_id(), h1.stable_crate_id()); + assert_ne!(h0.local_hash(), h1.local_hash()); + + fn mk_test_hash(crate_name: &str, crate_disambiguator: CrateDisambiguator) -> DefPathHash { + let stable_crate_id = StableCrateId::new(crate_name, crate_disambiguator); + let parent_hash = DefPathHash::new(stable_crate_id, 0); + + let key = DefKey { + parent: None, + disambiguated_data: DisambiguatedDefPathData { + data: DefPathData::CrateRoot, + disambiguator: 0, + }, + }; + + key.compute_stable_hash(parent_hash) + } +} diff --git a/compiler/rustc_hir_pretty/src/lib.rs b/compiler/rustc_hir_pretty/src/lib.rs index 4595855309..b37a3e19b8 100644 --- a/compiler/rustc_hir_pretty/src/lib.rs +++ b/compiler/rustc_hir_pretty/src/lib.rs @@ -16,6 +16,7 @@ use rustc_target::spec::abi::Abi; use std::borrow::Cow; use std::cell::Cell; +use std::collections::BTreeMap; use std::vec; pub fn id_to_string(map: &dyn rustc_hir::intravisit::Map<'_>, hir_id: hir::HirId) -> String { @@ -54,7 +55,7 @@ pub const NO_ANN: &dyn PpAnn = &NoAnn; impl PpAnn for hir::Crate<'_> { fn nested(&self, state: &mut State<'_>, nested: Nested) { match nested { - Nested::Item(id) => state.print_item(self.item(id.id)), + Nested::Item(id) => state.print_item(self.item(id)), Nested::TraitItem(id) => state.print_trait_item(self.trait_item(id)), Nested::ImplItem(id) => state.print_impl_item(self.impl_item(id)), Nested::ForeignItem(id) => state.print_foreign_item(self.foreign_item(id)), @@ -69,7 +70,7 @@ impl PpAnn for hir::Crate<'_> { impl PpAnn for &dyn rustc_hir::intravisit::Map<'_> { fn nested(&self, state: &mut State<'_>, nested: Nested) { match nested { - Nested::Item(id) => state.print_item(self.item(id.id)), + Nested::Item(id) => state.print_item(self.item(id)), Nested::TraitItem(id) => state.print_trait_item(self.trait_item(id)), Nested::ImplItem(id) => state.print_impl_item(self.impl_item(id)), Nested::ForeignItem(id) => state.print_foreign_item(self.foreign_item(id)), @@ -82,6 +83,7 @@ impl PpAnn for &dyn rustc_hir::intravisit::Map<'_> { pub struct State<'a> { pub s: pp::Printer, comments: Option>, + attrs: &'a BTreeMap, ann: &'a (dyn PpAnn + 'a), } @@ -112,7 +114,7 @@ impl<'a> State<'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"), + Node::Field(_) => panic!("cannot print Node::Field"), // These cases do not carry enough information in the // `hir_map` to reconstruct their full structure for pretty // printing. @@ -163,12 +165,12 @@ pub fn print_crate<'a>( input: String, ann: &'a dyn PpAnn, ) -> String { - let mut s = State::new_from_input(sm, filename, input, ann); + let mut s = State::new_from_input(sm, filename, input, &krate.attrs, ann); // When printing the AST, we sometimes need to inject `#[no_std]` here. // Since you can't compile the HIR, it's not necessary. - s.print_mod(&krate.item.module, &krate.item.attrs); + s.print_mod(&krate.item.module, s.attrs(hir::CRATE_HIR_ID)); s.print_remaining_comments(); s.s.eof() } @@ -178,9 +180,19 @@ impl<'a> State<'a> { sm: &'a SourceMap, filename: FileName, input: String, + attrs: &'a BTreeMap, ann: &'a dyn PpAnn, ) -> State<'a> { - State { s: pp::mk_printer(), comments: Some(Comments::new(sm, filename, input)), ann } + State { + s: pp::mk_printer(), + comments: Some(Comments::new(sm, filename, input)), + attrs, + ann, + } + } + + fn attrs(&self, id: hir::HirId) -> &'a [ast::Attribute] { + self.attrs.get(&id).map_or(&[], |la| *la) } } @@ -188,7 +200,8 @@ pub fn to_string(ann: &dyn PpAnn, f: F) -> String 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, attrs: &BTreeMap::default(), ann }; f(&mut printer); printer.s.eof() } @@ -392,12 +405,15 @@ impl<'a> State<'a> { &f.decl, None, &f.generic_params, - &f.param_names[..], + f.param_names, ); } hir::TyKind::OpaqueDef(..) => self.s.word("/*impl Trait*/"), hir::TyKind::Path(ref qpath) => self.print_qpath(qpath, false), - hir::TyKind::TraitObject(bounds, ref lifetime) => { + hir::TyKind::TraitObject(bounds, ref lifetime, syntax) => { + if syntax == ast::TraitObjectSyntax::Dyn { + self.word_space("dyn"); + } let mut first = true; for bound in bounds { if first { @@ -441,7 +457,7 @@ impl<'a> State<'a> { 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); + self.print_outer_attributes(self.attrs(item.hir_id())); match item.kind { hir::ForeignItemKind::Fn(ref decl, ref arg_names, ref generics) => { self.head(""); @@ -549,7 +565,8 @@ impl<'a> State<'a> { 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); + let attrs = self.attrs(item.hir_id()); + self.print_outer_attributes(attrs); self.ann.pre(self, AnnNode::Item(item)); match item.kind { hir::ItemKind::ExternCrate(orig_name) => { @@ -634,14 +651,14 @@ impl<'a> State<'a> { self.print_ident(item.ident); self.nbsp(); self.bopen(); - self.print_mod(_mod, &item.attrs); + self.print_mod(_mod, attrs); self.bclose(item.span); } hir::ItemKind::ForeignMod { abi, items } => { self.head("extern"); self.word_nbsp(abi.to_string()); self.bopen(); - self.print_inner_attributes(item.attrs); + self.print_inner_attributes(self.attrs(item.hir_id())); for item in items { self.ann.nested(self, Nested::ForeignItem(item.id)); } @@ -725,7 +742,7 @@ impl<'a> State<'a> { self.s.space(); self.bopen(); - self.print_inner_attributes(&item.attrs); + self.print_inner_attributes(attrs); for impl_item in items { self.ann.nested(self, Nested::ImplItem(impl_item.id)); } @@ -822,7 +839,7 @@ impl<'a> State<'a> { for v in variants { self.space_if_not_bol(); self.maybe_print_comment(v.span.lo()); - self.print_outer_attributes(&v.attrs); + self.print_outer_attributes(self.attrs(v.id)); self.ibox(INDENT_UNIT); self.print_variant(v); self.s.word(","); @@ -876,7 +893,7 @@ impl<'a> State<'a> { 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_outer_attributes(s.attrs(field.hir_id)); s.print_visibility(&field.vis); s.print_type(&field.ty) }); @@ -898,7 +915,7 @@ impl<'a> State<'a> { for field in struct_def.fields() { self.hardbreak_if_not_bol(); self.maybe_print_comment(field.span.lo()); - self.print_outer_attributes(&field.attrs); + self.print_outer_attributes(self.attrs(field.hir_id)); self.print_visibility(&field.vis); self.print_ident(field.ident); self.word_nbsp(":"); @@ -934,10 +951,10 @@ impl<'a> State<'a> { } pub fn print_trait_item(&mut self, ti: &hir::TraitItem<'_>) { - self.ann.pre(self, AnnNode::SubItem(ti.hir_id)); + 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); + self.print_outer_attributes(self.attrs(ti.hir_id())); match ti.kind { hir::TraitItemKind::Const(ref ty, default) => { let vis = @@ -969,14 +986,14 @@ impl<'a> State<'a> { ); } } - self.ann.post(self, AnnNode::SubItem(ti.hir_id)) + self.ann.post(self, AnnNode::SubItem(ti.hir_id())) } pub fn print_impl_item(&mut self, ii: &hir::ImplItem<'_>) { - self.ann.pre(self, AnnNode::SubItem(ii.hir_id)); + self.ann.pre(self, AnnNode::SubItem(ii.hir_id())); self.hardbreak_if_not_bol(); self.maybe_print_comment(ii.span.lo()); - self.print_outer_attributes(&ii.attrs); + self.print_outer_attributes(self.attrs(ii.hir_id())); self.print_defaultness(ii.defaultness); match ii.kind { @@ -995,7 +1012,7 @@ impl<'a> State<'a> { self.print_associated_type(ii.ident, &ii.generics, None, Some(ty)); } } - self.ann.post(self, AnnNode::SubItem(ii.hir_id)) + self.ann.post(self, AnnNode::SubItem(ii.hir_id())) } pub fn print_local(&mut self, init: Option<&hir::Expr<'_>>, decl: impl Fn(&mut Self)) { @@ -1193,14 +1210,14 @@ impl<'a> State<'a> { fn print_expr_struct( &mut self, qpath: &hir::QPath<'_>, - fields: &[hir::Field<'_>], + fields: &[hir::ExprField<'_>], wth: &Option<&hir::Expr<'_>>, ) { self.print_qpath(qpath, true); self.s.word("{"); self.commasep_cmnt( Consistent, - &fields[..], + fields, |s, field| { s.ibox(INDENT_UNIT); if !field.is_shorthand { @@ -1321,7 +1338,7 @@ impl<'a> State<'a> { pub fn print_expr(&mut self, expr: &hir::Expr<'_>) { self.maybe_print_comment(expr.span.lo()); - self.print_outer_attributes(&expr.attrs); + self.print_outer_attributes(self.attrs(expr.hir_id)); self.ibox(INDENT_UNIT); self.ann.pre(self, AnnNode::Expr(expr)); match expr.kind { @@ -2020,20 +2037,20 @@ impl<'a> State<'a> { } pub fn print_param(&mut self, arg: &hir::Param<'_>) { - self.print_outer_attributes(&arg.attrs); + self.print_outer_attributes(self.attrs(arg.hir_id)); self.print_pat(&arg.pat); } 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() { + if self.attrs(arm.hir_id).is_empty() { self.s.space(); } self.cbox(INDENT_UNIT); self.ann.pre(self, AnnNode::Arm(arm)); self.ibox(0); - self.print_outer_attributes(&arm.attrs); + self.print_outer_attributes(&self.attrs(arm.hir_id)); self.print_pat(&arm.pat); self.s.space(); if let Some(ref g) = arm.guard { diff --git a/compiler/rustc_incremental/src/assert_dep_graph.rs b/compiler/rustc_incremental/src/assert_dep_graph.rs index f39a92b9a3..f1f69f1510 100644 --- a/compiler/rustc_incremental/src/assert_dep_graph.rs +++ b/compiler/rustc_incremental/src/assert_dep_graph.rs @@ -68,7 +68,7 @@ pub fn assert_dep_graph(tcx: TyCtxt<'_>) { let (if_this_changed, then_this_would_need) = { let mut visitor = IfThisChanged { tcx, if_this_changed: vec![], then_this_would_need: vec![] }; - visitor.process_attrs(hir::CRATE_HIR_ID, &tcx.hir().krate().item.attrs); + visitor.process_attrs(hir::CRATE_HIR_ID); tcx.hir().krate().visit_all_item_likes(&mut visitor.as_deep_visitor()); (visitor.if_this_changed, visitor.then_this_would_need) }; @@ -113,9 +113,10 @@ impl IfThisChanged<'tcx> { value } - fn process_attrs(&mut self, hir_id: hir::HirId, attrs: &[ast::Attribute]) { + fn process_attrs(&mut self, hir_id: hir::HirId) { let def_id = self.tcx.hir().local_def_id(hir_id); let def_path_hash = self.tcx.def_path_hash(def_id.to_def_id()); + let attrs = self.tcx.hir().attrs(hir_id); for attr in attrs { if self.tcx.sess.check_name(attr, sym::rustc_if_this_changed) { let dep_node_interned = self.argument(attr); @@ -167,23 +168,23 @@ impl Visitor<'tcx> for IfThisChanged<'tcx> { } fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { - self.process_attrs(item.hir_id, &item.attrs); + self.process_attrs(item.hir_id()); intravisit::walk_item(self, item); } fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem<'tcx>) { - self.process_attrs(trait_item.hir_id, &trait_item.attrs); + self.process_attrs(trait_item.hir_id()); intravisit::walk_trait_item(self, trait_item); } fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem<'tcx>) { - self.process_attrs(impl_item.hir_id, &impl_item.attrs); + self.process_attrs(impl_item.hir_id()); intravisit::walk_impl_item(self, impl_item); } - 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); + fn visit_field_def(&mut self, s: &'tcx hir::FieldDef<'tcx>) { + self.process_attrs(s.hir_id); + intravisit::walk_field_def(self, s); } } diff --git a/compiler/rustc_incremental/src/assert_module_sources.rs b/compiler/rustc_incremental/src/assert_module_sources.rs index 17d8ac9c88..5fb2c1cb9c 100644 --- a/compiler/rustc_incremental/src/assert_module_sources.rs +++ b/compiler/rustc_incremental/src/assert_module_sources.rs @@ -44,7 +44,7 @@ pub fn assert_module_sources(tcx: TyCtxt<'_>) { let ams = AssertModuleSource { tcx, available_cgus }; - for attr in tcx.hir().krate().item.attrs { + for attr in tcx.hir().attrs(rustc_hir::CRATE_HIR_ID) { ams.check_attr(attr); } }) diff --git a/compiler/rustc_incremental/src/persist/dirty_clean.rs b/compiler/rustc_incremental/src/persist/dirty_clean.rs index e1c60050d9..0b544b8ab4 100644 --- a/compiler/rustc_incremental/src/persist/dirty_clean.rs +++ b/compiler/rustc_incremental/src/persist/dirty_clean.rs @@ -17,7 +17,7 @@ use rustc_ast::{self as ast, Attribute, NestedMetaItem}; 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::def_id::{DefId, LocalDefId}; use rustc_hir::intravisit; use rustc_hir::itemlikevisit::ItemLikeVisitor; use rustc_hir::Node as HirNode; @@ -168,7 +168,7 @@ pub fn check_dirty_clean_annotations(tcx: TyCtxt<'_>) { // Note that we cannot use the existing "unused attribute"-infrastructure // here, since that is running before codegen. This is also the reason why // all codegen-specific attributes are `AssumedUsed` in rustc_ast::feature_gate. - all_attrs.report_unchecked_attrs(&dirty_clean_visitor.checked_attrs); + all_attrs.report_unchecked_attrs(dirty_clean_visitor.checked_attrs); }) } @@ -179,7 +179,7 @@ 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 { + fn assertion_maybe(&mut self, item_id: LocalDefId, attr: &Attribute) -> Option { let is_clean = if self.tcx.sess.check_name(attr, sym::rustc_dirty) { false } else if self.tcx.sess.check_name(attr, sym::rustc_clean) { @@ -207,7 +207,7 @@ 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, + item_id: LocalDefId, attr: &Attribute, is_clean: bool, ) -> Assertion { @@ -253,8 +253,9 @@ impl DirtyCleanVisitor<'tcx> { /// Return all DepNode labels that should be asserted for this item. /// index=0 is the "name" used for error messages - fn auto_labels(&mut self, item_id: hir::HirId, attr: &Attribute) -> (&'static str, Labels) { - let node = self.tcx.hir().get(item_id); + fn auto_labels(&mut self, item_id: LocalDefId, attr: &Attribute) -> (&'static str, Labels) { + let hir_id = self.tcx.hir().local_def_id_to_hir_id(item_id); + let node = self.tcx.hir().get(hir_id); let (name, labels) = match node { HirNode::Item(item) => { match item.kind { @@ -430,18 +431,17 @@ impl DirtyCleanVisitor<'tcx> { } } - fn check_item(&mut self, item_id: hir::HirId, item_span: Span) { - let def_id = self.tcx.hir().local_def_id(item_id); - for attr in self.tcx.get_attrs(def_id.to_def_id()).iter() { + fn check_item(&mut self, item_id: LocalDefId, item_span: Span) { + for attr in self.tcx.get_attrs(item_id.to_def_id()).iter() { let assertion = match self.assertion_maybe(item_id, attr) { Some(a) => a, None => continue, }; self.checked_attrs.insert(attr.id); - for dep_node in self.dep_nodes(&assertion.clean, def_id.to_def_id()) { + for dep_node in self.dep_nodes(&assertion.clean, item_id.to_def_id()) { self.assert_clean(item_span, dep_node); } - for dep_node in self.dep_nodes(&assertion.dirty, def_id.to_def_id()) { + for dep_node in self.dep_nodes(&assertion.dirty, item_id.to_def_id()) { self.assert_dirty(item_span, dep_node); } } @@ -450,19 +450,19 @@ impl DirtyCleanVisitor<'tcx> { impl ItemLikeVisitor<'tcx> for DirtyCleanVisitor<'tcx> { fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { - self.check_item(item.hir_id, item.span); + self.check_item(item.def_id, item.span); } fn visit_trait_item(&mut self, item: &hir::TraitItem<'_>) { - self.check_item(item.hir_id, item.span); + self.check_item(item.def_id, item.span); } fn visit_impl_item(&mut self, item: &hir::ImplItem<'_>) { - self.check_item(item.hir_id, item.span); + self.check_item(item.def_id, item.span); } fn visit_foreign_item(&mut self, item: &hir::ForeignItem<'_>) { - self.check_item(item.hir_id, item.span); + self.check_item(item.def_id, item.span); } } @@ -535,13 +535,14 @@ impl FindAllAttrs<'_, 'tcx> { false } - fn report_unchecked_attrs(&self, checked_attrs: &FxHashSet) { + fn report_unchecked_attrs(&self, mut checked_attrs: FxHashSet) { for attr in &self.found_attrs { if !checked_attrs.contains(&attr.id) { self.tcx.sess.span_err( attr.span, "found unchecked `#[rustc_dirty]` / `#[rustc_clean]` attribute", ); + checked_attrs.insert(attr.id); } } } @@ -554,7 +555,7 @@ impl intravisit::Visitor<'tcx> for FindAllAttrs<'_, 'tcx> { intravisit::NestedVisitorMap::All(self.tcx.hir()) } - fn visit_attribute(&mut self, attr: &'tcx Attribute) { + fn visit_attribute(&mut self, _: hir::HirId, attr: &'tcx Attribute) { if self.is_active_attr(attr) { self.found_attrs.push(attr); } diff --git a/compiler/rustc_incremental/src/persist/file_format.rs b/compiler/rustc_incremental/src/persist/file_format.rs index 087f83c247..374a9eb41e 100644 --- a/compiler/rustc_incremental/src/persist/file_format.rs +++ b/compiler/rustc_incremental/src/persist/file_format.rs @@ -109,7 +109,7 @@ fn report_format_mismatch(report_incremental_info: bool, file: &Path, message: & debug!("read_file: {}", message); if report_incremental_info { - println!( + eprintln!( "[incremental] ignoring cache artifact `{}`: {}", file.file_name().unwrap().to_string_lossy(), message diff --git a/compiler/rustc_incremental/src/persist/fs.rs b/compiler/rustc_incremental/src/persist/fs.rs index 7a1976bed4..c7a6c1195c 100644 --- a/compiler/rustc_incremental/src/persist/fs.rs +++ b/compiler/rustc_incremental/src/persist/fs.rs @@ -440,12 +440,12 @@ fn copy_files(sess: &Session, target_dir: &Path, source_dir: &Path) -> Result DepGraphFuture { if prev_commandline_args_hash != expected_hash { if report_incremental_info { - println!( + eprintln!( "[incremental] completely ignoring cache because of \ differing commandline arguments" ); diff --git a/compiler/rustc_index/src/lib.rs b/compiler/rustc_index/src/lib.rs index eaef4c7b54..995034e81d 100644 --- a/compiler/rustc_index/src/lib.rs +++ b/compiler/rustc_index/src/lib.rs @@ -8,3 +8,7 @@ pub mod bit_set; pub mod vec; + +// FIXME(#56935): Work around ICEs during cross-compilation. +#[allow(unused)] +extern crate rustc_macros; diff --git a/compiler/rustc_index/src/vec.rs b/compiler/rustc_index/src/vec.rs index 2420f82c04..3882818952 100644 --- a/compiler/rustc_index/src/vec.rs +++ b/compiler/rustc_index/src/vec.rs @@ -111,6 +111,7 @@ macro_rules! newtype_index { } impl Clone for $type { + #[inline] fn clone(&self) -> Self { *self } @@ -694,9 +695,7 @@ impl IndexVec { pub fn convert_index_type(self) -> IndexVec { IndexVec { raw: self.raw, _marker: PhantomData } } -} -impl IndexVec { /// Grows the index vector so that it contains an entry for /// `elem`; if that is already true, then has no /// effect. Otherwise, inserts new values as needed by invoking @@ -709,11 +708,6 @@ impl IndexVec { } } - #[inline] - pub fn resize(&mut self, new_len: usize, value: T) { - self.raw.resize(new_len, value) - } - #[inline] pub fn resize_to_elem(&mut self, elem: I, fill_value: impl FnMut() -> T) { let min_new_len = elem.index() + 1; @@ -721,6 +715,13 @@ impl IndexVec { } } +impl IndexVec { + #[inline] + pub fn resize(&mut self, new_len: usize, value: T) { + self.raw.resize(new_len, value) + } +} + impl IndexVec { #[inline] pub fn binary_search(&self, value: &T) -> Result { diff --git a/compiler/rustc_infer/Cargo.toml b/compiler/rustc_infer/Cargo.toml index 5dba4106c9..a75ad7b31a 100644 --- a/compiler/rustc_infer/Cargo.toml +++ b/compiler/rustc_infer/Cargo.toml @@ -20,5 +20,5 @@ rustc_session = { path = "../rustc_session" } rustc_serialize = { path = "../rustc_serialize" } rustc_span = { path = "../rustc_span" } rustc_target = { path = "../rustc_target" } -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } rustc_ast = { path = "../rustc_ast" } diff --git a/compiler/rustc_infer/src/infer/at.rs b/compiler/rustc_infer/src/infer/at.rs index a7749d33b7..11ee8fb17a 100644 --- a/compiler/rustc_infer/src/infer/at.rs +++ b/compiler/rustc_infer/src/infer/at.rs @@ -55,6 +55,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { pub trait ToTrace<'tcx>: Relate<'tcx> + Copy { fn to_trace( + tcx: TyCtxt<'tcx>, cause: &ObligationCause<'tcx>, a_is_expected: bool, a: Self, @@ -178,7 +179,7 @@ impl<'a, 'tcx> At<'a, 'tcx> { where T: ToTrace<'tcx>, { - let trace = ToTrace::to_trace(self.cause, a_is_expected, a, b); + let trace = ToTrace::to_trace(self.infcx.tcx, self.cause, a_is_expected, a, b); Trace { at: self, trace, a_is_expected } } } @@ -251,6 +252,7 @@ impl<'a, 'tcx> Trace<'a, 'tcx> { impl<'tcx> ToTrace<'tcx> for Ty<'tcx> { fn to_trace( + _: TyCtxt<'tcx>, cause: &ObligationCause<'tcx>, a_is_expected: bool, a: Self, @@ -262,6 +264,7 @@ impl<'tcx> ToTrace<'tcx> for Ty<'tcx> { impl<'tcx> ToTrace<'tcx> for ty::Region<'tcx> { fn to_trace( + _: TyCtxt<'tcx>, cause: &ObligationCause<'tcx>, a_is_expected: bool, a: Self, @@ -273,6 +276,7 @@ impl<'tcx> ToTrace<'tcx> for ty::Region<'tcx> { impl<'tcx> ToTrace<'tcx> for &'tcx Const<'tcx> { fn to_trace( + _: TyCtxt<'tcx>, cause: &ObligationCause<'tcx>, a_is_expected: bool, a: Self, @@ -284,6 +288,7 @@ impl<'tcx> ToTrace<'tcx> for &'tcx Const<'tcx> { impl<'tcx> ToTrace<'tcx> for ty::TraitRef<'tcx> { fn to_trace( + _: TyCtxt<'tcx>, cause: &ObligationCause<'tcx>, a_is_expected: bool, a: Self, @@ -298,6 +303,7 @@ impl<'tcx> ToTrace<'tcx> for ty::TraitRef<'tcx> { impl<'tcx> ToTrace<'tcx> for ty::PolyTraitRef<'tcx> { fn to_trace( + _: TyCtxt<'tcx>, cause: &ObligationCause<'tcx>, a_is_expected: bool, a: Self, @@ -309,3 +315,20 @@ impl<'tcx> ToTrace<'tcx> for ty::PolyTraitRef<'tcx> { } } } + +impl<'tcx> ToTrace<'tcx> for ty::ProjectionTy<'tcx> { + fn to_trace( + tcx: TyCtxt<'tcx>, + cause: &ObligationCause<'tcx>, + a_is_expected: bool, + a: Self, + b: Self, + ) -> TypeTrace<'tcx> { + let a_ty = tcx.mk_projection(a.item_def_id, a.substs); + let b_ty = tcx.mk_projection(b.item_def_id, b.substs); + TypeTrace { + cause: cause.clone(), + values: Types(ExpectedFound::new(a_is_expected, a_ty, b_ty)), + } + } +} diff --git a/compiler/rustc_infer/src/infer/canonical/query_response.rs b/compiler/rustc_infer/src/infer/canonical/query_response.rs index 1546c1e559..2ec9b9e0be 100644 --- a/compiler/rustc_infer/src/infer/canonical/query_response.rs +++ b/compiler/rustc_infer/src/infer/canonical/query_response.rs @@ -507,12 +507,7 @@ impl<'cx, 'tcx> InferCtxt<'cx, 'tcx> { // Unify the original value for each variable with the value // taken from `query_response` (after applying `result_subst`). - Ok(self.unify_canonical_vars( - cause, - param_env, - original_values, - substituted_query_response, - )?) + self.unify_canonical_vars(cause, param_env, original_values, substituted_query_response) } /// Converts the region constraints resulting from a query into an @@ -639,6 +634,10 @@ struct QueryTypeRelatingDelegate<'a, 'tcx> { } impl<'tcx> TypeRelatingDelegate<'tcx> for QueryTypeRelatingDelegate<'_, 'tcx> { + fn param_env(&self) -> ty::ParamEnv<'tcx> { + self.param_env + } + fn create_next_universe(&mut self) -> ty::UniverseIndex { self.infcx.create_next_universe() } diff --git a/compiler/rustc_infer/src/infer/combine.rs b/compiler/rustc_infer/src/infer/combine.rs index e034ac5e8f..5e11932eaf 100644 --- a/compiler/rustc_infer/src/infer/combine.rs +++ b/compiler/rustc_infer/src/infer/combine.rs @@ -221,6 +221,7 @@ impl<'infcx, 'tcx> InferCtxt<'infcx, 'tcx> { /// As `3 + 4` contains `N` in its substs, this must not succeed. /// /// See `src/test/ui/const-generics/occurs-check/` for more examples where this is relevant. + #[instrument(level = "debug", skip(self))] fn unify_const_variable( &self, param_env: ty::ParamEnv<'tcx>, diff --git a/compiler/rustc_infer/src/infer/error_reporting/mod.rs b/compiler/rustc_infer/src/infer/error_reporting/mod.rs index 84aa19aede..eeff48a639 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/mod.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/mod.rs @@ -50,6 +50,7 @@ use super::region_constraints::GenericKind; use super::{InferCtxt, RegionVariableOrigin, SubregionOrigin, TypeTrace, ValuePairs}; use crate::infer; +use crate::infer::error_reporting::nice_region_error::find_anon_type::find_anon_type; use crate::traits::error_reporting::report_object_safety_error; use crate::traits::{ IfExpressionCause, MatchExpressionArmCause, ObligationCause, ObligationCauseCode, @@ -179,7 +180,14 @@ fn msg_span_from_early_bound_and_free_regions( } ty::ReFree(ref fr) => match fr.bound_region { ty::BrAnon(idx) => { - (format!("the anonymous lifetime #{} defined on", idx + 1), tcx.hir().span(node)) + if let Some((ty, _)) = find_anon_type(tcx, region, &fr.bound_region) { + ("the anonymous lifetime defined on".to_string(), ty.span) + } else { + ( + format!("the anonymous lifetime #{} defined on", idx + 1), + tcx.hir().span(node), + ) + } } _ => ( format!("the lifetime `{}` as defined on", region), @@ -1484,13 +1492,16 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { for (key, values) in types.iter() { let count = values.len(); let kind = key.descr(); + let mut returned_async_output_error = false; for sp in values { err.span_label( *sp, format!( "{}{}{} {}{}", - if sp.is_desugaring(DesugaringKind::Async) { - "the `Output` of this `async fn`'s " + if sp.is_desugaring(DesugaringKind::Async) + && !returned_async_output_error + { + "checked the `Output` of this `async fn`, " } else if count == 1 { "the " } else { @@ -1502,6 +1513,12 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { pluralize!(count), ), ); + if sp.is_desugaring(DesugaringKind::Async) + && returned_async_output_error == false + { + err.note("while checking the return type of the `async fn`"); + returned_async_output_error = true; + } } } } @@ -1509,7 +1526,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { impl<'tcx> ty::fold::TypeVisitor<'tcx> for OpaqueTypesVisitor<'tcx> { fn visit_ty(&mut self, t: Ty<'tcx>) -> ControlFlow { - if let Some((kind, def_id)) = TyCategory::from_ty(t) { + if let Some((kind, def_id)) = TyCategory::from_ty(self.tcx, t) { let span = self.tcx.def_span(def_id); // Avoid cluttering the output when the "found" and error span overlap: // @@ -1582,11 +1599,11 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { }; if let Some((expected, found)) = expected_found { let expected_label = match exp_found { - Mismatch::Variable(ef) => ef.expected.prefix_string(), + Mismatch::Variable(ef) => ef.expected.prefix_string(self.tcx), Mismatch::Fixed(s) => s.into(), }; let found_label = match exp_found { - Mismatch::Variable(ef) => ef.found.prefix_string(), + Mismatch::Variable(ef) => ef.found.prefix_string(self.tcx), Mismatch::Fixed(s) => s.into(), }; let exp_found = match exp_found { @@ -2248,13 +2265,18 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { "...", ); if let Some(infer::RelateParamBound(_, t)) = origin { + let return_impl_trait = self + .in_progress_typeck_results + .map(|typeck_results| typeck_results.borrow().hir_owner) + .and_then(|owner| self.tcx.return_type_impl_trait(owner)) + .is_some(); let t = self.resolve_vars_if_possible(t); match t.kind() { // We've got: // fn get_later(g: G, dest: &mut T) -> impl FnOnce() + '_ // suggest: // fn get_later<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a - ty::Closure(_, _substs) | ty::Opaque(_, _substs) => { + ty::Closure(_, _substs) | ty::Opaque(_, _substs) if return_impl_trait => { new_binding_suggestion(&mut err, type_param_span, bound_kind); } _ => { @@ -2484,7 +2506,7 @@ impl<'tcx> ObligationCauseExt<'tcx> for ObligationCause<'tcx> { pub enum TyCategory { Closure, Opaque, - Generator, + Generator(hir::GeneratorKind), Foreign, } @@ -2493,16 +2515,18 @@ impl TyCategory { match self { Self::Closure => "closure", Self::Opaque => "opaque type", - Self::Generator => "generator", + Self::Generator(gk) => gk.descr(), Self::Foreign => "foreign type", } } - pub fn from_ty(ty: Ty<'_>) -> Option<(Self, DefId)> { + pub fn from_ty(tcx: TyCtxt<'_>, 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::Generator(def_id, ..) => { + Some((Self::Generator(tcx.generator_kind(def_id).unwrap()), def_id)) + } ty::Foreign(def_id) => Some((Self::Foreign, def_id)), _ => None, } diff --git a/compiler/rustc_infer/src/infer/error_reporting/need_type_info.rs b/compiler/rustc_infer/src/infer/error_reporting/need_type_info.rs index bd43d3c01e..d533e267fd 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/need_type_info.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/need_type_info.rs @@ -383,7 +383,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { InferenceDiagnosticsData { name: s, span: None, - kind: UnderspecifiedArgKind::Type { prefix: ty.prefix_string() }, + kind: UnderspecifiedArgKind::Type { prefix: ty.prefix_string(self.tcx) }, parent: None, } } @@ -671,7 +671,7 @@ impl<'a, 'tcx> InferCtxt<'a, 'tcx> { if !impl_candidates.is_empty() && e.span.contains(span) { if let Some(expr) = exprs.first() { if let ExprKind::Path(hir::QPath::Resolved(_, path)) = expr.kind { - if let [path_segment] = &path.segments[..] { + if let [path_segment] = path.segments { let candidate_len = impl_candidates.len(); let suggestions = impl_candidates.iter().map(|candidate| { format!( diff --git a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/different_lifetimes.rs b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/different_lifetimes.rs index cdd68d83f2..1b35c4032f 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/different_lifetimes.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/different_lifetimes.rs @@ -1,6 +1,7 @@ //! Error Reporting for Anonymous Region Lifetime Errors //! where both the regions are anonymous. +use crate::infer::error_reporting::nice_region_error::find_anon_type::find_anon_type; use crate::infer::error_reporting::nice_region_error::util::AnonymousParamInfo; use crate::infer::error_reporting::nice_region_error::NiceRegionError; use crate::infer::lexical_region_resolve::RegionResolutionError; @@ -66,9 +67,9 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { let scope_def_id_sub = anon_reg_sub.def_id; let bregion_sub = anon_reg_sub.boundregion; - let ty_sup = self.find_anon_type(sup, &bregion_sup)?; + let ty_sup = find_anon_type(self.tcx(), sup, &bregion_sup)?; - let ty_sub = self.find_anon_type(sub, &bregion_sub)?; + let ty_sub = find_anon_type(self.tcx(), sub, &bregion_sub)?; debug!( "try_report_anon_anon_conflict: found_param1={:?} sup={:?} br1={:?}", diff --git a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/find_anon_type.rs b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/find_anon_type.rs index b014b9832e..35b9bc96f1 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/find_anon_type.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/find_anon_type.rs @@ -1,4 +1,3 @@ -use crate::infer::error_reporting::nice_region_error::NiceRegionError; use rustc_hir as hir; use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; use rustc_hir::Node; @@ -6,67 +5,64 @@ use rustc_middle::hir::map::Map; use rustc_middle::middle::resolve_lifetime as rl; use rustc_middle::ty::{self, Region, TyCtxt}; -impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { - /// This function calls the `visit_ty` method for the parameters - /// corresponding to the anonymous regions. The `nested_visitor.found_type` - /// contains the anonymous type. - /// - /// # Arguments - /// region - the anonymous region corresponding to the anon_anon conflict - /// br - the bound region corresponding to the above region which is of type `BrAnon(_)` - /// - /// # Example - /// ``` - /// fn foo(x: &mut Vec<&u8>, y: &u8) - /// { x.push(y); } - /// ``` - /// The function returns the nested type corresponding to the anonymous region - /// for e.g., `&u8` and Vec<`&u8`. - pub(super) fn find_anon_type( - &self, - region: Region<'tcx>, - br: &ty::BoundRegionKind, - ) -> Option<(&hir::Ty<'tcx>, &hir::FnDecl<'tcx>)> { - if let Some(anon_reg) = self.tcx().is_suitable_region(region) { - let hir_id = self.tcx().hir().local_def_id_to_hir_id(anon_reg.def_id); - let fndecl = match self.tcx().hir().get(hir_id) { - Node::Item(&hir::Item { kind: hir::ItemKind::Fn(ref m, ..), .. }) - | Node::TraitItem(&hir::TraitItem { - kind: hir::TraitItemKind::Fn(ref m, ..), - .. - }) - | Node::ImplItem(&hir::ImplItem { - kind: hir::ImplItemKind::Fn(ref m, ..), .. - }) => &m.decl, - _ => return None, - }; +/// This function calls the `visit_ty` method for the parameters +/// corresponding to the anonymous regions. The `nested_visitor.found_type` +/// contains the anonymous type. +/// +/// # Arguments +/// region - the anonymous region corresponding to the anon_anon conflict +/// br - the bound region corresponding to the above region which is of type `BrAnon(_)` +/// +/// # Example +/// ``` +/// fn foo(x: &mut Vec<&u8>, y: &u8) +/// { x.push(y); } +/// ``` +/// The function returns the nested type corresponding to the anonymous region +/// for e.g., `&u8` and `Vec<&u8>`. +pub(crate) fn find_anon_type( + tcx: TyCtxt<'tcx>, + region: Region<'tcx>, + br: &ty::BoundRegionKind, +) -> Option<(&'tcx hir::Ty<'tcx>, &'tcx hir::FnDecl<'tcx>)> { + if let Some(anon_reg) = tcx.is_suitable_region(region) { + let hir_id = tcx.hir().local_def_id_to_hir_id(anon_reg.def_id); + let fndecl = match tcx.hir().get(hir_id) { + Node::Item(&hir::Item { kind: hir::ItemKind::Fn(ref m, ..), .. }) + | Node::TraitItem(&hir::TraitItem { + kind: hir::TraitItemKind::Fn(ref m, ..), .. + }) + | Node::ImplItem(&hir::ImplItem { kind: hir::ImplItemKind::Fn(ref m, ..), .. }) => { + &m.decl + } + _ => return None, + }; - fndecl - .inputs - .iter() - .find_map(|arg| self.find_component_for_bound_region(arg, br)) - .map(|ty| (ty, &**fndecl)) - } else { - None - } + fndecl + .inputs + .iter() + .find_map(|arg| find_component_for_bound_region(tcx, arg, br)) + .map(|ty| (ty, &**fndecl)) + } else { + None } +} - // This method creates a FindNestedTypeVisitor which returns the type corresponding - // to the anonymous region. - fn find_component_for_bound_region( - &self, - arg: &'tcx hir::Ty<'tcx>, - br: &ty::BoundRegionKind, - ) -> Option<&'tcx hir::Ty<'tcx>> { - let mut nested_visitor = FindNestedTypeVisitor { - tcx: self.tcx(), - bound_region: *br, - found_type: None, - current_index: ty::INNERMOST, - }; - nested_visitor.visit_ty(arg); - nested_visitor.found_type - } +// This method creates a FindNestedTypeVisitor which returns the type corresponding +// to the anonymous region. +fn find_component_for_bound_region( + tcx: TyCtxt<'tcx>, + arg: &'tcx hir::Ty<'tcx>, + br: &ty::BoundRegionKind, +) -> Option<&'tcx hir::Ty<'tcx>> { + let mut nested_visitor = FindNestedTypeVisitor { + tcx, + bound_region: *br, + found_type: None, + current_index: ty::INNERMOST, + }; + nested_visitor.visit_ty(arg); + nested_visitor.found_type } // The FindNestedTypeVisitor captures the corresponding `hir::Ty` of the @@ -103,7 +99,7 @@ impl Visitor<'tcx> for FindNestedTypeVisitor<'tcx> { return; } - hir::TyKind::TraitObject(bounds, _) => { + hir::TyKind::TraitObject(bounds, ..) => { for bound in bounds { self.current_index.shift_in(1); self.visit_poly_trait_ref(bound, hir::TraitBoundModifier::None); diff --git a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/mod.rs b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/mod.rs index cc8f1816bc..e20436690b 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/mod.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/mod.rs @@ -6,7 +6,7 @@ use rustc_middle::ty::{self, TyCtxt}; use rustc_span::source_map::Span; mod different_lifetimes; -mod find_anon_type; +pub mod find_anon_type; mod named_anon_conflict; mod placeholder_error; mod static_impl_trait; @@ -43,7 +43,7 @@ impl<'cx, 'tcx> NiceRegionError<'cx, 'tcx> { self.infcx.tcx } - pub fn try_report_from_nll(&self) -> Option> { + 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()) diff --git a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/named_anon_conflict.rs b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/named_anon_conflict.rs index e3c613b1d6..2f3c0d6957 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/named_anon_conflict.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/named_anon_conflict.rs @@ -1,5 +1,6 @@ //! 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::find_anon_type::find_anon_type; use crate::infer::error_reporting::nice_region_error::NiceRegionError; use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder}; use rustc_hir::intravisit::Visitor; @@ -9,7 +10,7 @@ use rustc_middle::ty; impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { /// When given a `ConcreteFailure` for a function with parameters containing a named region and /// an anonymous region, emit an descriptive diagnostic error. - pub(super) fn try_report_named_anon_conflict(&self) -> Option> { + pub(super) fn try_report_named_anon_conflict(&self) -> Option> { let (span, sub, sup) = self.regions()?; debug!( @@ -74,7 +75,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { return None; } - if let Some((_, fndecl)) = self.find_anon_type(anon, &br) { + if let Some((_, fndecl)) = find_anon_type(self.tcx(), anon, &br) { if self.is_self_anon(is_first, scope_def_id) { return None; } diff --git a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/placeholder_error.rs b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/placeholder_error.rs index e8e0326d97..4aecc2f40b 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/placeholder_error.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/placeholder_error.rs @@ -16,7 +16,7 @@ use std::fmt::{self, Write}; impl NiceRegionError<'me, 'tcx> { /// When given a `ConcreteFailure` for a function with arguments containing a named region and /// an anonymous region, emit a descriptive diagnostic error. - pub(super) fn try_report_placeholder_conflict(&self) -> Option> { + pub(super) fn try_report_placeholder_conflict(&self) -> Option> { match &self.error { /////////////////////////////////////////////////////////////////////////// // NB. The ordering of cases in this match is very @@ -30,157 +30,153 @@ impl NiceRegionError<'me, 'tcx> { Some(RegionResolutionError::SubSupConflict( vid, _, - SubregionOrigin::Subtype(box TypeTrace { - cause, - values: ValuePairs::TraitRefs(ExpectedFound { expected, found }), - }), + SubregionOrigin::Subtype(box TypeTrace { cause, values }), sub_placeholder @ ty::RePlaceholder(_), _, sup_placeholder @ ty::RePlaceholder(_), - )) if expected.def_id == found.def_id => Some(self.try_report_placeholders_trait( + )) => self.try_report_trait_placeholder_mismatch( Some(self.tcx().mk_region(ty::ReVar(*vid))), cause, Some(sub_placeholder), Some(sup_placeholder), - expected.def_id, - expected.substs, - found.substs, - )), + values, + ), Some(RegionResolutionError::SubSupConflict( vid, _, - SubregionOrigin::Subtype(box TypeTrace { - cause, - values: ValuePairs::TraitRefs(ExpectedFound { expected, found }), - }), + SubregionOrigin::Subtype(box TypeTrace { cause, values }), sub_placeholder @ ty::RePlaceholder(_), _, _, - )) if expected.def_id == found.def_id => Some(self.try_report_placeholders_trait( + )) => self.try_report_trait_placeholder_mismatch( Some(self.tcx().mk_region(ty::ReVar(*vid))), cause, Some(sub_placeholder), None, - expected.def_id, - expected.substs, - found.substs, - )), + values, + ), Some(RegionResolutionError::SubSupConflict( vid, _, - SubregionOrigin::Subtype(box TypeTrace { - cause, - values: ValuePairs::TraitRefs(ExpectedFound { expected, found }), - }), + SubregionOrigin::Subtype(box TypeTrace { cause, values }), _, _, sup_placeholder @ ty::RePlaceholder(_), - )) if expected.def_id == found.def_id => Some(self.try_report_placeholders_trait( + )) => self.try_report_trait_placeholder_mismatch( Some(self.tcx().mk_region(ty::ReVar(*vid))), cause, None, Some(*sup_placeholder), - expected.def_id, - expected.substs, - found.substs, - )), + values, + ), Some(RegionResolutionError::SubSupConflict( vid, _, _, _, - SubregionOrigin::Subtype(box TypeTrace { - cause, - values: ValuePairs::TraitRefs(ExpectedFound { expected, found }), - }), + SubregionOrigin::Subtype(box TypeTrace { cause, values }), sup_placeholder @ ty::RePlaceholder(_), - )) if expected.def_id == found.def_id => Some(self.try_report_placeholders_trait( + )) => self.try_report_trait_placeholder_mismatch( Some(self.tcx().mk_region(ty::ReVar(*vid))), cause, None, Some(*sup_placeholder), - expected.def_id, - expected.substs, - found.substs, - )), + values, + ), Some(RegionResolutionError::UpperBoundUniverseConflict( vid, _, _, - SubregionOrigin::Subtype(box TypeTrace { - cause, - values: ValuePairs::TraitRefs(ExpectedFound { expected, found }), - }), + SubregionOrigin::Subtype(box TypeTrace { cause, values }), sup_placeholder @ ty::RePlaceholder(_), - )) if expected.def_id == found.def_id => Some(self.try_report_placeholders_trait( + )) => self.try_report_trait_placeholder_mismatch( Some(self.tcx().mk_region(ty::ReVar(*vid))), cause, None, Some(*sup_placeholder), - expected.def_id, - expected.substs, - found.substs, - )), + values, + ), Some(RegionResolutionError::ConcreteFailure( - SubregionOrigin::Subtype(box TypeTrace { - cause, - values: ValuePairs::TraitRefs(ExpectedFound { expected, found }), - }), + SubregionOrigin::Subtype(box TypeTrace { cause, values }), sub_region @ ty::RePlaceholder(_), sup_region @ ty::RePlaceholder(_), - )) if expected.def_id == found.def_id => Some(self.try_report_placeholders_trait( + )) => self.try_report_trait_placeholder_mismatch( None, cause, Some(*sub_region), Some(*sup_region), - expected.def_id, - expected.substs, - found.substs, - )), + values, + ), Some(RegionResolutionError::ConcreteFailure( - SubregionOrigin::Subtype(box TypeTrace { - cause, - values: ValuePairs::TraitRefs(ExpectedFound { expected, found }), - }), + SubregionOrigin::Subtype(box TypeTrace { cause, values }), sub_region @ ty::RePlaceholder(_), sup_region, - )) if expected.def_id == found.def_id => Some(self.try_report_placeholders_trait( - Some(sup_region), + )) => self.try_report_trait_placeholder_mismatch( + (!sup_region.has_name()).then_some(sup_region), cause, - Some(*sub_region), + Some(sub_region), None, - expected.def_id, - expected.substs, - found.substs, - )), + values, + ), Some(RegionResolutionError::ConcreteFailure( - SubregionOrigin::Subtype(box TypeTrace { - cause, - values: ValuePairs::TraitRefs(ExpectedFound { expected, found }), - }), + SubregionOrigin::Subtype(box TypeTrace { cause, values }), sub_region, sup_region @ ty::RePlaceholder(_), - )) if expected.def_id == found.def_id => Some(self.try_report_placeholders_trait( - Some(sub_region), + )) => self.try_report_trait_placeholder_mismatch( + (!sub_region.has_name()).then_some(sub_region), cause, None, - Some(*sup_region), - expected.def_id, - expected.substs, - found.substs, - )), + Some(sup_region), + values, + ), _ => None, } } + fn try_report_trait_placeholder_mismatch( + &self, + vid: Option>, + cause: &ObligationCause<'tcx>, + sub_placeholder: Option>, + sup_placeholder: Option>, + value_pairs: &ValuePairs<'tcx>, + ) -> Option> { + let (expected_substs, found_substs, trait_def_id) = match value_pairs { + ValuePairs::TraitRefs(ExpectedFound { expected, found }) + if expected.def_id == found.def_id => + { + (expected.substs, found.substs, expected.def_id) + } + ValuePairs::PolyTraitRefs(ExpectedFound { expected, found }) + if expected.def_id() == found.def_id() => + { + // It's possible that the placeholders come from a binder + // outside of this value pair. Use `no_bound_vars` as a + // simple heuristic for that. + (expected.no_bound_vars()?.substs, found.no_bound_vars()?.substs, expected.def_id()) + } + _ => return None, + }; + + Some(self.report_trait_placeholder_mismatch( + vid, + cause, + sub_placeholder, + sup_placeholder, + trait_def_id, + expected_substs, + found_substs, + )) + } + // error[E0308]: implementation of `Foo` does not apply to enough lifetimes // --> /home/nmatsakis/tmp/foo.rs:12:5 // | @@ -190,7 +186,8 @@ impl NiceRegionError<'me, 'tcx> { // = note: Due to a where-clause on the function `all`, // = note: `T` must implement `...` for any two lifetimes `'1` and `'2`. // = note: However, the type `T` only implements `...` for some specific lifetime `'2`. - fn try_report_placeholders_trait( + #[instrument(level = "debug", skip(self))] + fn report_trait_placeholder_mismatch( &self, vid: Option>, cause: &ObligationCause<'tcx>, @@ -199,28 +196,13 @@ impl NiceRegionError<'me, 'tcx> { trait_def_id: DefId, expected_substs: SubstsRef<'tcx>, actual_substs: SubstsRef<'tcx>, - ) -> DiagnosticBuilder<'me> { - debug!( - "try_report_placeholders_trait(\ - vid={:?}, \ - sub_placeholder={:?}, \ - sup_placeholder={:?}, \ - trait_def_id={:?}, \ - expected_substs={:?}, \ - actual_substs={:?})", - vid, sub_placeholder, sup_placeholder, trait_def_id, expected_substs, actual_substs - ); - + ) -> DiagnosticBuilder<'tcx> { let span = cause.span(self.tcx()); let msg = format!( "implementation of `{}` is not general enough", self.tcx().def_path_str(trait_def_id), ); let mut err = self.tcx().sess.struct_span_err(span, &msg); - err.span_label( - self.tcx().def_span(trait_def_id), - format!("trait `{}` defined here", self.tcx().def_path_str(trait_def_id)), - ); let leading_ellipsis = if let ObligationCauseCode::ItemObligation(def_id) = cause.code { err.span_label(span, "doesn't satisfy where-clause"); @@ -285,17 +267,13 @@ impl NiceRegionError<'me, 'tcx> { 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: has_sub={:?}", has_sub); - debug!("try_report_placeholders_trait: has_sup={:?}", has_sup); debug!( - "try_report_placeholders_trait: actual_self_ty_has_vid={:?}", - actual_self_ty_has_vid - ); - debug!( - "try_report_placeholders_trait: expected_self_ty_has_vid={:?}", - expected_self_ty_has_vid + ?actual_has_vid, + ?expected_has_vid, + ?has_sub, + ?has_sup, + ?actual_self_ty_has_vid, + ?expected_self_ty_has_vid, ); self.explain_actual_impl_that_was_found( @@ -388,6 +366,8 @@ impl NiceRegionError<'me, 'tcx> { value: trait_ref, }; + let same_self_type = actual_trait_ref.self_ty() == expected_trait_ref.self_ty(); + let mut expected_trait_ref = highlight_trait_ref(expected_trait_ref); expected_trait_ref.highlight.maybe_highlighting_region(sub_placeholder, has_sub); expected_trait_ref.highlight.maybe_highlighting_region(sup_placeholder, has_sup); @@ -403,7 +383,42 @@ impl NiceRegionError<'me, 'tcx> { } }; - let mut note = if passive_voice { + let mut note = if same_self_type { + let mut self_ty = expected_trait_ref.map(|tr| tr.self_ty()); + self_ty.highlight.maybe_highlighting_region(vid, actual_has_vid); + + if self_ty.value.is_closure() + && self + .tcx() + .fn_trait_kind_from_lang_item(expected_trait_ref.value.def_id) + .is_some() + { + let closure_sig = self_ty.map(|closure| { + if let ty::Closure(_, substs) = closure.kind() { + self.tcx().signature_unclosure( + substs.as_closure().sig(), + rustc_hir::Unsafety::Normal, + ) + } else { + bug!("type is not longer closure"); + } + }); + + format!( + "{}closure with signature `{}` must implement `{}`", + if leading_ellipsis { "..." } else { "" }, + closure_sig, + expected_trait_ref.map(|tr| tr.print_only_trait_path()), + ) + } else { + format!( + "{}`{}` must implement `{}`", + if leading_ellipsis { "..." } else { "" }, + self_ty, + expected_trait_ref.map(|tr| tr.print_only_trait_path()), + ) + } + } else if passive_voice { format!( "{}`{}` would have to be implemented for the type `{}`", if leading_ellipsis { "..." } else { "" }, @@ -449,7 +464,12 @@ impl NiceRegionError<'me, 'tcx> { None => true, }; - let mut note = if passive_voice { + let mut note = if same_self_type { + format!( + "...but it actually implements `{}`", + actual_trait_ref.map(|tr| tr.print_only_trait_path()), + ) + } else if passive_voice { format!( "...but `{}` is actually implemented for the type `{}`", actual_trait_ref.map(|tr| tr.print_only_trait_path()), diff --git a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/static_impl_trait.rs b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/static_impl_trait.rs index c6ae71ba33..1e92698926 100644 --- a/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/static_impl_trait.rs +++ b/compiler/rustc_infer/src/infer/error_reporting/nice_region_error/static_impl_trait.rs @@ -7,10 +7,7 @@ use crate::traits::{ObligationCauseCode, UnifyReceiverContext}; use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder, ErrorReported}; use rustc_hir::def_id::DefId; use rustc_hir::intravisit::{walk_ty, ErasedMap, NestedVisitorMap, Visitor}; -use rustc_hir::{ - self as hir, GenericBound, ImplItem, Item, ItemKind, Lifetime, LifetimeName, Node, TraitItem, - TyKind, -}; +use rustc_hir::{self as hir, GenericBound, Item, ItemKind, Lifetime, LifetimeName, Node, TyKind}; use rustc_middle::ty::{self, AssocItemContainer, RegionKind, Ty, TypeFoldable, TypeVisitor}; use rustc_span::symbol::Ident; use rustc_span::{MultiSpan, Span}; @@ -234,7 +231,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { } match fn_return.kind { TyKind::OpaqueDef(item_id, _) => { - let item = tcx.hir().item(item_id.id); + let item = tcx.hir().item(item_id); let opaque = if let ItemKind::OpaqueTy(opaque) = &item.kind { opaque } else { @@ -295,7 +292,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { ); } } - TyKind::TraitObject(_, lt) => match lt.name { + TyKind::TraitObject(_, lt, _) => match lt.name { LifetimeName::ImplicitObjectLifetimeDefault => { err.span_suggestion_verbose( fn_return.span.shrink_to_hi(), @@ -343,17 +340,17 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { ) -> Option<(Ident, &'tcx hir::Ty<'tcx>)> { let tcx = self.tcx(); match tcx.hir().get_if_local(def_id) { - Some(Node::ImplItem(ImplItem { ident, hir_id, .. })) => { - match tcx.hir().find(tcx.hir().get_parent_item(*hir_id)) { + Some(Node::ImplItem(impl_item)) => { + match tcx.hir().find(tcx.hir().get_parent_item(impl_item.hir_id())) { Some(Node::Item(Item { kind: ItemKind::Impl(hir::Impl { self_ty, .. }), .. - })) => Some((*ident, self_ty)), + })) => Some((impl_item.ident, self_ty)), _ => None, } } - Some(Node::TraitItem(TraitItem { ident, hir_id, .. })) => { - let parent_id = tcx.hir().get_parent_item(*hir_id); + Some(Node::TraitItem(trait_item)) => { + let parent_id = tcx.hir().get_parent_item(trait_item.hir_id()); match tcx.hir().find(parent_id) { Some(Node::Item(Item { kind: ItemKind::Trait(..), .. })) => { // The method being called is defined in the `trait`, but the `'static` @@ -364,8 +361,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { .hir() .trait_impls(trait_did) .iter() - .filter_map(|impl_node| { - let impl_did = tcx.hir().local_def_id(*impl_node); + .filter_map(|&impl_did| { match tcx.hir().get_if_local(impl_did.to_def_id()) { Some(Node::Item(Item { kind: ItemKind::Impl(hir::Impl { self_ty, .. }), @@ -389,7 +385,7 @@ impl<'a, 'tcx> NiceRegionError<'a, 'tcx> { }) .next() { - Some(self_ty) => Some((*ident, self_ty)), + Some(self_ty) => Some((trait_item.ident, self_ty)), _ => None, } } @@ -502,6 +498,7 @@ impl<'tcx> Visitor<'tcx> for HirTraitObjectVisitor { if let TyKind::TraitObject( poly_trait_refs, Lifetime { name: LifetimeName::ImplicitObjectLifetimeDefault, .. }, + _, ) = t.kind { for ptr in poly_trait_refs { diff --git a/compiler/rustc_infer/src/infer/lexical_region_resolve/README.md b/compiler/rustc_infer/src/infer/lexical_region_resolve/README.md index e0b2c0bffe..0a7da8c806 100644 --- a/compiler/rustc_infer/src/infer/lexical_region_resolve/README.md +++ b/compiler/rustc_infer/src/infer/lexical_region_resolve/README.md @@ -1,4 +1,3 @@ - Lexical Region Resolution was removed in https://github.com/rust-lang/rust/pull/64790. Rust now uses Non-lexical lifetimes. For more info, please see the [borrowck diff --git a/compiler/rustc_infer/src/infer/mod.rs b/compiler/rustc_infer/src/infer/mod.rs index 09eecd715f..3df58cb785 100644 --- a/compiler/rustc_infer/src/infer/mod.rs +++ b/compiler/rustc_infer/src/infer/mod.rs @@ -408,7 +408,7 @@ pub enum SubregionOrigin<'tcx> { } // `SubregionOrigin` is used a lot. Make sure it doesn't unintentionally get bigger. -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(SubregionOrigin<'_>, 32); /// Times when we replace late-bound regions with variables: diff --git a/compiler/rustc_infer/src/infer/nll_relate/mod.rs b/compiler/rustc_infer/src/infer/nll_relate/mod.rs index 97ef685cf6..e5eb771603 100644 --- a/compiler/rustc_infer/src/infer/nll_relate/mod.rs +++ b/compiler/rustc_infer/src/infer/nll_relate/mod.rs @@ -44,7 +44,7 @@ where { infcx: &'me InferCtxt<'me, 'tcx>, - /// Callback to use when we deduce an outlives relationship + /// Callback to use when we deduce an outlives relationship. delegate: D, /// How are we relating `a` and `b`? @@ -72,6 +72,8 @@ where } pub trait TypeRelatingDelegate<'tcx> { + fn param_env(&self) -> ty::ParamEnv<'tcx>; + /// Push a constraint `sup: sub` -- this constraint must be /// satisfied for the two types to be related. `sub` and `sup` may /// be regions from the type or new variables created through the @@ -473,9 +475,8 @@ where self.infcx.tcx } - // FIXME(oli-obk): not sure how to get the correct ParamEnv fn param_env(&self) -> ty::ParamEnv<'tcx> { - ty::ParamEnv::empty() + self.delegate.param_env() } fn tag(&self) -> &'static str { @@ -767,7 +768,7 @@ impl<'me, 'tcx> TypeVisitor<'tcx> for ScopeInstantiator<'me, 'tcx> { } } -/// The "type generalize" is used when handling inference variables. +/// The "type generalizer" is used when handling inference variables. /// /// The basic strategy for handling a constraint like `?A <: B` is to /// apply a "generalization strategy" to the type `B` -- this replaces @@ -819,9 +820,8 @@ where self.infcx.tcx } - // FIXME(oli-obk): not sure how to get the correct ParamEnv fn param_env(&self) -> ty::ParamEnv<'tcx> { - ty::ParamEnv::empty() + self.delegate.param_env() } fn tag(&self) -> &'static str { diff --git a/compiler/rustc_infer/src/infer/undo_log.rs b/compiler/rustc_infer/src/infer/undo_log.rs index 2cfd6bb904..4be0e7948f 100644 --- a/compiler/rustc_infer/src/infer/undo_log.rs +++ b/compiler/rustc_infer/src/infer/undo_log.rs @@ -15,7 +15,7 @@ pub struct Snapshot<'tcx> { _marker: PhantomData<&'tcx ()>, } -/// Records the 'undo' data fora single operation that affects some form of inference variable. +/// Records the "undo" data for a single operation that affects some form of inference variable. pub(crate) enum UndoLog<'tcx> { TypeVariables(type_variable::UndoLog<'tcx>), ConstUnificationTable(sv::UndoLog>>), diff --git a/compiler/rustc_infer/src/lib.rs b/compiler/rustc_infer/src/lib.rs index 3690a88c0d..f9170ef5dc 100644 --- a/compiler/rustc_infer/src/lib.rs +++ b/compiler/rustc_infer/src/lib.rs @@ -27,7 +27,7 @@ #[macro_use] extern crate rustc_macros; -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] #[macro_use] extern crate rustc_data_structures; #[macro_use] diff --git a/compiler/rustc_infer/src/traits/error_reporting/mod.rs b/compiler/rustc_infer/src/traits/error_reporting/mod.rs index 835f75ec8e..ad15af9ab3 100644 --- a/compiler/rustc_infer/src/traits/error_reporting/mod.rs +++ b/compiler/rustc_infer/src/traits/error_reporting/mod.rs @@ -104,7 +104,7 @@ pub fn report_object_safety_error( ", ); - if tcx.sess.trait_methods_not_found.borrow().contains(&span) { + if tcx.sess.trait_methods_not_found.borrow().iter().any(|full_span| full_span.contains(span)) { // Avoid emitting error caused by non-existing method (#58734) err.cancel(); } diff --git a/compiler/rustc_infer/src/traits/mod.rs b/compiler/rustc_infer/src/traits/mod.rs index aaf5e958c2..0882d682e1 100644 --- a/compiler/rustc_infer/src/traits/mod.rs +++ b/compiler/rustc_infer/src/traits/mod.rs @@ -56,7 +56,7 @@ pub type PredicateObligation<'tcx> = Obligation<'tcx, ty::Predicate<'tcx>>; pub type TraitObligation<'tcx> = Obligation<'tcx, ty::PolyTraitPredicate<'tcx>>; // `PredicateObligation` is used a lot. Make sure it doesn't unintentionally get bigger. -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(PredicateObligation<'_>, 32); pub type PredicateObligations<'tcx> = Vec>; diff --git a/compiler/rustc_infer/src/traits/util.rs b/compiler/rustc_infer/src/traits/util.rs index 13cf1e1083..87684c2715 100644 --- a/compiler/rustc_infer/src/traits/util.rs +++ b/compiler/rustc_infer/src/traits/util.rs @@ -1,9 +1,10 @@ use smallvec::smallvec; use crate::traits::{Obligation, ObligationCause, PredicateObligation}; -use rustc_data_structures::fx::FxHashSet; +use rustc_data_structures::fx::{FxHashSet, FxIndexSet}; use rustc_middle::ty::outlives::Component; use rustc_middle::ty::{self, ToPredicate, TyCtxt, WithConstness}; +use rustc_span::symbol::Ident; pub fn anonymize_predicate<'tcx>( tcx: TyCtxt<'tcx>, @@ -282,6 +283,44 @@ pub fn transitive_bounds<'tcx>( elaborate_trait_refs(tcx, bounds).filter_to_traits() } +/// A specialized variant of `elaborate_trait_refs` that only elaborates trait references that may +/// define the given associated type `assoc_name`. It uses the +/// `super_predicates_that_define_assoc_type` query to avoid enumerating super-predicates that +/// aren't related to `assoc_item`. This is used when resolving types like `Self::Item` or +/// `T::Item` and helps to avoid cycle errors (see e.g. #35237). +pub fn transitive_bounds_that_define_assoc_type<'tcx>( + tcx: TyCtxt<'tcx>, + bounds: impl Iterator>, + assoc_name: Ident, +) -> impl Iterator> { + let mut stack: Vec<_> = bounds.collect(); + let mut visited = FxIndexSet::default(); + + std::iter::from_fn(move || { + while let Some(trait_ref) = stack.pop() { + let anon_trait_ref = tcx.anonymize_late_bound_regions(trait_ref); + if visited.insert(anon_trait_ref) { + let super_predicates = tcx.super_predicates_that_define_assoc_type(( + trait_ref.def_id(), + Some(assoc_name), + )); + for (super_predicate, _) in super_predicates.predicates { + let bound_predicate = super_predicate.kind(); + let subst_predicate = super_predicate + .subst_supertrait(tcx, &bound_predicate.rebind(trait_ref.skip_binder())); + if let Some(binder) = subst_predicate.to_opt_poly_trait_ref() { + stack.push(binder.value); + } + } + + return Some(trait_ref); + } + } + + return None; + }) +} + /////////////////////////////////////////////////////////////////////////// // Other /////////////////////////////////////////////////////////////////////////// diff --git a/compiler/rustc_interface/Cargo.toml b/compiler/rustc_interface/Cargo.toml index 2481a27dee..3bfe8da505 100644 --- a/compiler/rustc_interface/Cargo.toml +++ b/compiler/rustc_interface/Cargo.toml @@ -10,8 +10,9 @@ doctest = false [dependencies] libc = "0.2" tracing = "0.1" -rayon = { version = "0.3.0", package = "rustc-rayon" } -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +rustc-rayon-core = "0.3.1" +rayon = { version = "0.3.1", package = "rustc-rayon" } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } rustc_ast = { path = "../rustc_ast" } rustc_attr = { path = "../rustc_attr" } rustc_builtin_macros = { path = "../rustc_builtin_macros" } @@ -30,6 +31,7 @@ rustc_codegen_ssa = { path = "../rustc_codegen_ssa" } rustc_symbol_mangling = { path = "../rustc_symbol_mangling" } rustc_codegen_llvm = { path = "../rustc_codegen_llvm", optional = true } rustc_hir = { path = "../rustc_hir" } +rustc_index = { path = "../rustc_index" } rustc_metadata = { path = "../rustc_metadata" } rustc_mir = { path = "../rustc_mir" } rustc_mir_build = { path = "../rustc_mir_build" } @@ -39,6 +41,7 @@ rustc_lint = { path = "../rustc_lint" } rustc_errors = { path = "../rustc_errors" } rustc_plugin_impl = { path = "../rustc_plugin_impl" } rustc_privacy = { path = "../rustc_privacy" } +rustc_query_impl = { path = "../rustc_query_impl" } rustc_resolve = { path = "../rustc_resolve" } rustc_trait_selection = { path = "../rustc_trait_selection" } rustc_ty_utils = { path = "../rustc_ty_utils" } diff --git a/compiler/rustc_interface/src/interface.rs b/compiler/rustc_interface/src/interface.rs index 28eb1fed6a..a1090ee316 100644 --- a/compiler/rustc_interface/src/interface.rs +++ b/compiler/rustc_interface/src/interface.rs @@ -8,7 +8,7 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::sync::Lrc; use rustc_data_structures::OnDrop; use rustc_errors::registry::Registry; -use rustc_errors::ErrorReported; +use rustc_errors::{ErrorReported, Handler}; use rustc_lint::LintStore; use rustc_middle::ty; use rustc_parse::new_parser_from_source_str; @@ -142,6 +142,9 @@ pub struct Config { pub lint_caps: FxHashMap, + /// This is a callback from the driver that is called when [`ParseSess`] is created. + pub parse_sess_created: Option>, + /// This is a callback from the driver that is called when we're registering lints; /// it is called during plugin registration when we have the LintStore in a non-shared state. /// @@ -166,7 +169,7 @@ pub struct Config { pub fn create_compiler_and_run(config: Config, f: impl FnOnce(&Compiler) -> R) -> R { let registry = &config.registry; - let (sess, codegen_backend) = util::create_session( + let (mut sess, codegen_backend) = util::create_session( config.opts, config.crate_cfg, config.diagnostic_output, @@ -177,6 +180,14 @@ pub fn create_compiler_and_run(config: Config, f: impl FnOnce(&Compiler) -> R registry.clone(), ); + if let Some(parse_sess_created) = config.parse_sess_created { + parse_sess_created( + &mut Lrc::get_mut(&mut sess) + .expect("create_session() should never share the returned session") + .parse_sess, + ); + } + let compiler = Compiler { sess, codegen_backend, @@ -213,3 +224,24 @@ pub fn run_compiler(mut config: Config, f: impl FnOnce(&Compiler) -> R || create_compiler_and_run(config, f), ) } + +pub fn try_print_query_stack(handler: &Handler, num_frames: Option) { + eprintln!("query stack during panic:"); + + // Be careful relying on global state here: this code is called from + // a panic hook, which means that the global `Handler` may be in a weird + // state if it was responsible for triggering the panic. + let i = ty::tls::with_context_opt(|icx| { + if let Some(icx) = icx { + icx.tcx.queries.try_print_query_stack(icx.tcx, icx.query, handler, num_frames) + } else { + 0 + } + }); + + if num_frames == None || num_frames >= Some(i) { + eprintln!("end of query stack"); + } else { + eprintln!("we're just showing a limited slice of the query stack"); + } +} diff --git a/compiler/rustc_interface/src/passes.rs b/compiler/rustc_interface/src/passes.rs index 56aa3939b2..94be7a03a9 100644 --- a/compiler/rustc_interface/src/passes.rs +++ b/compiler/rustc_interface/src/passes.rs @@ -15,6 +15,7 @@ use rustc_expand::base::ExtCtxt; use rustc_hir::def_id::{CrateNum, LOCAL_CRATE}; use rustc_hir::definitions::Definitions; use rustc_hir::Crate; +use rustc_index::vec::IndexVec; use rustc_lint::LintStore; use rustc_middle::arena::Arena; use rustc_middle::dep_graph::DepGraph; @@ -27,6 +28,7 @@ use rustc_mir_build as mir_build; use rustc_parse::{parse_crate_from_file, parse_crate_from_source_str}; use rustc_passes::{self, hir_stats, layout_test}; use rustc_plugin_impl as plugin; +use rustc_query_impl::Queries as TcxQueries; use rustc_resolve::{Resolver, ResolverArenas}; use rustc_session::config::{CrateType, Input, OutputFilenames, OutputType, PpMode, PpSourceMode}; use rustc_session::lint; @@ -64,8 +66,8 @@ pub fn parse<'a>(sess: &'a Session, input: &Input) -> PResult<'a, ast::Crate> { } if sess.opts.debugging_opts.input_stats { - println!("Lines of code: {}", sess.source_map().count_lines()); - println!("Pre-expansion node count: {}", count_nodes(&krate)); + eprintln!("Lines of code: {}", sess.source_map().count_lines()); + eprintln!("Pre-expansion node count: {}", count_nodes(&krate)); } if let Some(ref s) = sess.opts.debugging_opts.show_span { @@ -300,8 +302,10 @@ fn configure_and_expand_inner<'a>( ..rustc_expand::expand::ExpansionConfig::default(crate_name.to_string()) }; - let extern_mod_loaded = |k: &ast::Crate, ident: Ident| { - pre_expansion_lint(sess, lint_store, k, &*ident.name.as_str()) + let extern_mod_loaded = |ident: Ident, attrs, items, span| { + let krate = ast::Crate { attrs, items, span, proc_macros: vec![] }; + pre_expansion_lint(sess, lint_store, &krate, &ident.name.as_str()); + (krate.attrs, krate.items) }; let mut ecx = ExtCtxt::new(&sess, cfg, &mut resolver, Some(&extern_mod_loaded)); @@ -348,7 +352,7 @@ fn configure_and_expand_inner<'a>( rustc_builtin_macros::test_harness::inject(&sess, &mut resolver, &mut krate) }); - if let Some(PpMode::PpmSource(PpSourceMode::PpmEveryBodyLoops)) = sess.opts.pretty { + if let Some(PpMode::Source(PpSourceMode::EveryBodyLoops)) = sess.opts.pretty { tracing::debug!("replacing bodies with loop {{}}"); util::ReplaceBodyWithLoop::new(&mut resolver).visit_crate(&mut krate); } @@ -394,7 +398,7 @@ fn configure_and_expand_inner<'a>( // Done with macro expansion! if sess.opts.debugging_opts.input_stats { - println!("Post-expansion node count: {}", count_nodes(&krate)); + eprintln!("Post-expansion node count: {}", count_nodes(&krate)); } if sess.opts.debugging_opts.hir_stats { @@ -738,20 +742,18 @@ pub static DEFAULT_EXTERN_QUERY_PROVIDERS: SyncLazy = SyncLazy::new(| extern_providers }); -pub struct QueryContext<'tcx>(&'tcx GlobalCtxt<'tcx>); +pub struct QueryContext<'tcx> { + gcx: &'tcx GlobalCtxt<'tcx>, +} impl<'tcx> QueryContext<'tcx> { pub fn enter(&mut self, f: F) -> R where F: FnOnce(TyCtxt<'tcx>) -> R, { - let icx = ty::tls::ImplicitCtxt::new(self.0); + let icx = ty::tls::ImplicitCtxt::new(self.gcx); ty::tls::enter_context(&icx, |_| f(icx.tcx)) } - - pub fn print_stats(&mut self) { - self.enter(ty::query::print_stats) - } } pub fn create_global_ctxt<'tcx>( @@ -762,6 +764,7 @@ pub fn create_global_ctxt<'tcx>( mut resolver_outputs: ResolverOutputs, outputs: OutputFilenames, crate_name: &str, + queries: &'tcx OnceCell>, global_ctxt: &'tcx OnceCell>, arena: &'tcx WorkerLocal>, ) -> QueryContext<'tcx> { @@ -785,26 +788,33 @@ pub fn create_global_ctxt<'tcx>( callback(sess, &mut local_providers, &mut extern_providers); } + let queries = { + let crates = resolver_outputs.cstore.crates_untracked(); + let max_cnum = crates.iter().map(|c| c.as_usize()).max().unwrap_or(0); + let mut providers = IndexVec::from_elem_n(extern_providers, max_cnum + 1); + providers[LOCAL_CRATE] = local_providers; + queries.get_or_init(|| TcxQueries::new(providers, extern_providers)) + }; + let gcx = sess.time("setup_global_ctxt", || { global_ctxt.get_or_init(|| { TyCtxt::create_global_ctxt( sess, lint_store, - local_providers, - extern_providers, arena, resolver_outputs, krate, defs, dep_graph, query_result_on_disk_cache, + queries.as_dyn(), &crate_name, &outputs, ) }) }); - QueryContext(gcx) + QueryContext { gcx } } /// Runs the resolution, type-checking, region checking and other @@ -831,12 +841,11 @@ fn analysis(tcx: TyCtxt<'_>, cnum: CrateNum) -> Result<()> { }, { 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_naked_functions(local_def_id); - tcx.ensure().check_mod_unstable_api_usage(local_def_id); - tcx.ensure().check_mod_const_bodies(local_def_id); + tcx.ensure().check_mod_loops(module); + tcx.ensure().check_mod_attrs(module); + tcx.ensure().check_mod_naked_functions(module); + tcx.ensure().check_mod_unstable_api_usage(module); + tcx.ensure().check_mod_const_bodies(module); }); } ); @@ -861,10 +870,8 @@ fn analysis(tcx: TyCtxt<'_>, cnum: CrateNum) -> Result<()> { // "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); + tcx.ensure().check_mod_liveness(module); + tcx.ensure().check_mod_intrinsics(module); }); }); } @@ -926,7 +933,7 @@ fn analysis(tcx: TyCtxt<'_>, cnum: CrateNum) -> Result<()> { { 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)); + tcx.ensure().check_mod_privacy(module); }); }); } @@ -983,7 +990,7 @@ fn encode_and_write_metadata( .unwrap_or_else(|err| tcx.sess.fatal(&format!("couldn't create a temp dir: {}", err))); let metadata_tmpdir = MaybeTempDir::new(metadata_tmpdir, tcx.sess.opts.cg.save_temps); let metadata_filename = emit_metadata(tcx.sess, &metadata, &metadata_tmpdir); - if let Err(e) = fs::rename(&metadata_filename, &out_filename) { + if let Err(e) = util::non_durable_rename(&metadata_filename, &out_filename) { tcx.sess.fatal(&format!("failed to write {}: {}", out_filename.display(), e)); } if tcx.sess.opts.json_artifact_notifications { diff --git a/compiler/rustc_interface/src/proc_macro_decls.rs b/compiler/rustc_interface/src/proc_macro_decls.rs index de08a4c824..4637055a82 100644 --- a/compiler/rustc_interface/src/proc_macro_decls.rs +++ b/compiler/rustc_interface/src/proc_macro_decls.rs @@ -25,8 +25,9 @@ struct Finder<'tcx> { impl<'v> ItemLikeVisitor<'v> for Finder<'_> { fn visit_item(&mut self, item: &hir::Item<'_>) { - if self.tcx.sess.contains_name(&item.attrs, sym::rustc_proc_macro_decls) { - self.decls = Some(item.hir_id); + let attrs = self.tcx.hir().attrs(item.hir_id()); + if self.tcx.sess.contains_name(attrs, sym::rustc_proc_macro_decls) { + self.decls = Some(item.hir_id()); } } diff --git a/compiler/rustc_interface/src/queries.rs b/compiler/rustc_interface/src/queries.rs index ac6b6d0311..9c38d2b91a 100644 --- a/compiler/rustc_interface/src/queries.rs +++ b/compiler/rustc_interface/src/queries.rs @@ -14,6 +14,7 @@ use rustc_lint::LintStore; use rustc_middle::arena::Arena; use rustc_middle::dep_graph::DepGraph; use rustc_middle::ty::{GlobalCtxt, ResolverOutputs, TyCtxt}; +use rustc_query_impl::Queries as TcxQueries; use rustc_serialize::json; use rustc_session::config::{self, OutputFilenames, OutputType}; use rustc_session::{output::find_crate_name, Session}; @@ -71,6 +72,7 @@ impl Default for Query { pub struct Queries<'tcx> { compiler: &'tcx Compiler, gcx: OnceCell>, + queries: OnceCell>, arena: WorkerLocal>, hir_arena: WorkerLocal>, @@ -92,6 +94,7 @@ impl<'tcx> Queries<'tcx> { Queries { compiler, gcx: OnceCell::new(), + queries: OnceCell::new(), arena: WorkerLocal::new(|_| Arena::default()), hir_arena: WorkerLocal::new(|_| rustc_ast_lowering::Arena::default()), dep_graph_future: Default::default(), @@ -265,6 +268,7 @@ impl<'tcx> Queries<'tcx> { resolver_outputs.steal(), outputs, &crate_name, + &self.queries, &self.gcx, &self.arena, )) @@ -425,11 +429,11 @@ impl Compiler { { let _prof_timer = queries.session().prof.generic_activity("self_profile_alloc_query_strings"); - gcx.enter(|tcx| tcx.alloc_self_profile_query_strings()); + gcx.enter(rustc_query_impl::alloc_self_profile_query_strings); } if self.session().opts.debugging_opts.query_stats { - gcx.print_stats(); + gcx.enter(rustc_query_impl::print_stats); } } diff --git a/compiler/rustc_interface/src/tests.rs b/compiler/rustc_interface/src/tests.rs index f9c3406d3b..93ba2e6a4f 100644 --- a/compiler/rustc_interface/src/tests.rs +++ b/compiler/rustc_interface/src/tests.rs @@ -20,6 +20,7 @@ use rustc_target::spec::{CodeModel, LinkerFlavor, MergeFunctions, PanicStrategy} use rustc_target::spec::{RelocModel, RelroLevel, SplitDebuginfo, TlsModel}; use std::collections::{BTreeMap, BTreeSet}; use std::iter::FromIterator; +use std::num::NonZeroUsize; use std::path::{Path, PathBuf}; type CfgSpecs = FxHashSet<(String, Option)>; @@ -556,15 +557,15 @@ fn test_debugging_options_tracking_hash() { tracked!(function_sections, Some(false)); tracked!(human_readable_cgu_names, true); tracked!(inline_in_all_cgus, Some(true)); - tracked!(inline_mir_threshold, 123); - tracked!(inline_mir_hint_threshold, 123); - tracked!(insert_sideeffect, true); + tracked!(inline_mir, Some(true)); + tracked!(inline_mir_threshold, Some(123)); + tracked!(inline_mir_hint_threshold, Some(123)); tracked!(instrument_coverage, true); tracked!(instrument_mcount, true); tracked!(link_only, true); tracked!(merge_functions, Some(MergeFunctions::Disabled)); tracked!(mir_emit_retag, true); - tracked!(mir_opt_level, 3); + tracked!(mir_opt_level, Some(4)); tracked!(mutable_noalias, true); tracked!(new_llvm_pass_manager, true); tracked!(no_codegen, true); @@ -595,7 +596,7 @@ fn test_debugging_options_tracking_hash() { tracked!(tune_cpu, Some(String::from("abc"))); tracked!(tls_model, Some(TlsModel::GeneralDynamic)); tracked!(trap_unreachable, Some(false)); - tracked!(treat_err_as_bug, Some(1)); + tracked!(treat_err_as_bug, NonZeroUsize::new(1)); tracked!(unleash_the_miri_inside_of_you, true); tracked!(use_ctors_section, Some(true)); tracked!(verify_llvm_ir, true); diff --git a/compiler/rustc_interface/src/util.rs b/compiler/rustc_interface/src/util.rs index b7dc539c6d..341cfa4790 100644 --- a/compiler/rustc_interface/src/util.rs +++ b/compiler/rustc_interface/src/util.rs @@ -10,6 +10,8 @@ use rustc_data_structures::stable_hasher::StableHasher; use rustc_data_structures::sync::Lrc; use rustc_errors::registry::Registry; use rustc_metadata::dynamic_lib::DynamicLibrary; +#[cfg(parallel_compiler)] +use rustc_middle::ty::tls; use rustc_resolve::{self, Resolver}; use rustc_session as session; use rustc_session::config::{self, CrateType}; @@ -29,11 +31,12 @@ use std::io; use std::lazy::SyncOnceCell; use std::mem; use std::ops::DerefMut; +#[cfg(not(parallel_compiler))] +use std::panic; use std::path::{Path, PathBuf}; use std::sync::atomic::{AtomicBool, Ordering}; use std::sync::{Arc, Mutex, Once}; -#[cfg(not(parallel_compiler))] -use std::{panic, thread}; +use std::thread; use tracing::info; /// Adds `target_feature = "..."` cfgs for a variety of platform @@ -156,6 +159,28 @@ pub fn setup_callbacks_and_run_in_thread_pool_with_globals R + Se scoped_thread(cfg, main_handler) } +/// Creates a new thread and forwards information in thread locals to it. +/// The new thread runs the deadlock handler. +/// Must only be called when a deadlock is about to happen. +#[cfg(parallel_compiler)] +unsafe fn handle_deadlock() { + let registry = rustc_rayon_core::Registry::current(); + + let context = tls::get_tlv(); + assert!(context != 0); + rustc_data_structures::sync::assert_sync::>(); + let icx: &tls::ImplicitCtxt<'_, '_> = &*(context as *const tls::ImplicitCtxt<'_, '_>); + + let session_globals = rustc_span::SESSION_GLOBALS.with(|sg| sg as *const _); + let session_globals = &*session_globals; + thread::spawn(move || { + tls::enter_context(icx, |_| { + rustc_span::SESSION_GLOBALS + .set(session_globals, || tls::with(|tcx| tcx.queries.deadlock(tcx, ®istry))) + }); + }); +} + #[cfg(parallel_compiler)] pub fn setup_callbacks_and_run_in_thread_pool_with_globals R + Send, R: Send>( edition: Edition, @@ -163,7 +188,6 @@ pub fn setup_callbacks_and_run_in_thread_pool_with_globals R + Se stderr: &Option>>>, f: F, ) -> R { - use rustc_middle::ty; crate::callbacks::setup_callbacks(); let mut config = rayon::ThreadPoolBuilder::new() @@ -171,7 +195,7 @@ pub fn setup_callbacks_and_run_in_thread_pool_with_globals R + Se .acquire_thread_handler(jobserver::acquire_thread) .release_thread_handler(jobserver::release_thread) .num_threads(threads) - .deadlock_handler(|| unsafe { ty::query::handle_deadlock() }); + .deadlock_handler(|| unsafe { handle_deadlock() }); if let Some(size) = get_stack_size() { config = config.stack_size(size); @@ -670,16 +694,42 @@ pub fn build_output_filenames( } } -// Note: Also used by librustdoc, see PR #43348. Consider moving this struct elsewhere. -// -// FIXME: Currently the `everybody_loops` transformation is not applied to: -// * `const fn`, due to issue #43636 that `loop` is not supported for const evaluation. We are -// waiting for miri to fix that. -// * `impl Trait`, due to issue #43869 that functions returning impl Trait cannot be diverging. -// Solving this may require `!` to implement every trait, which relies on the an even more -// ambitious form of the closed RFC #1637. See also [#34511]. -// -// [#34511]: https://github.com/rust-lang/rust/issues/34511#issuecomment-322340401 +#[cfg(not(target_os = "linux"))] +pub fn non_durable_rename(src: &Path, dst: &Path) -> std::io::Result<()> { + std::fs::rename(src, dst) +} + +/// This function attempts to bypass the auto_da_alloc heuristic implemented by some filesystems +/// such as btrfs and ext4. When renaming over a file that already exists then they will "helpfully" +/// write back the source file before committing the rename in case a developer forgot some of +/// the fsyncs in the open/write/fsync(file)/rename/fsync(dir) dance for atomic file updates. +/// +/// To avoid triggering this heuristic we delete the destination first, if it exists. +/// The cost of an extra syscall is much lower than getting descheduled for the sync IO. +#[cfg(target_os = "linux")] +pub fn non_durable_rename(src: &Path, dst: &Path) -> std::io::Result<()> { + let _ = std::fs::remove_file(dst); + std::fs::rename(src, dst) +} + +/// Replaces function bodies with `loop {}` (an infinite loop). This gets rid of +/// all semantic errors in the body while still satisfying the return type, +/// except in certain cases, see below for more. +/// +/// This pass is known as `everybody_loops`. Very punny. +/// +/// As of March 2021, `everybody_loops` is only used for the +/// `-Z unpretty=everybody_loops` debugging option. +/// +/// FIXME: Currently the `everybody_loops` transformation is not applied to: +/// * `const fn`; support could be added, but hasn't. Originally `const fn` +/// was skipped due to issue #43636 that `loop` was not supported for +/// const evaluation. +/// * `impl Trait`, due to issue #43869 that functions returning impl Trait cannot be diverging. +/// Solving this may require `!` to implement every trait, which relies on the an even more +/// ambitious form of the closed RFC #1637. See also [#34511]. +/// +/// [#34511]: https://github.com/rust-lang/rust/issues/34511#issuecomment-322340401 pub struct ReplaceBodyWithLoop<'a, 'b> { within_static_or_const: bool, nested_blocks: Option>, diff --git a/compiler/rustc_lint/Cargo.toml b/compiler/rustc_lint/Cargo.toml index c56eb09b63..90badd3d57 100644 --- a/compiler/rustc_lint/Cargo.toml +++ b/compiler/rustc_lint/Cargo.toml @@ -19,5 +19,6 @@ rustc_data_structures = { path = "../rustc_data_structures" } rustc_feature = { path = "../rustc_feature" } rustc_index = { path = "../rustc_index" } rustc_session = { path = "../rustc_session" } +rustc_serialize = { path = "../rustc_serialize" } rustc_trait_selection = { path = "../rustc_trait_selection" } rustc_parse_format = { path = "../rustc_parse_format" } diff --git a/compiler/rustc_lint/src/builtin.rs b/compiler/rustc_lint/src/builtin.rs index 2cedef6251..1a8bbb67cf 100644 --- a/compiler/rustc_lint/src/builtin.rs +++ b/compiler/rustc_lint/src/builtin.rs @@ -24,7 +24,7 @@ use crate::{ types::{transparent_newtype_field, CItemKind}, EarlyContext, EarlyLintPass, LateContext, LateLintPass, LintContext, }; -use rustc_ast::attr::{self, HasAttrs}; +use rustc_ast::attr; use rustc_ast::tokenstream::{TokenStream, TokenTree}; use rustc_ast::visit::{FnCtxt, FnKind}; use rustc_ast::{self as ast, *}; @@ -36,9 +36,9 @@ use rustc_feature::{deprecated_attributes, AttributeGate, AttributeTemplate, Att use rustc_feature::{GateIssue, Stability}; use rustc_hir as hir; use rustc_hir::def::{DefKind, Res}; -use rustc_hir::def_id::DefId; +use rustc_hir::def_id::{DefId, LocalDefId, LocalDefIdSet}; use rustc_hir::{ForeignItemKind, GenericParamKind, PatKind}; -use rustc_hir::{HirId, HirIdSet, Node}; +use rustc_hir::{HirId, Node}; use rustc_index::vec::Idx; use rustc_middle::lint::LintDiagnosticBuilder; use rustc_middle::ty::print::with_no_trimmed_paths; @@ -173,8 +173,7 @@ impl<'tcx> LateLintPass<'tcx> for BoxPointers { | 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)) + self.check_heap_type(cx, it.span, cx.tcx.type_of(it.def_id)) } _ => (), } @@ -328,6 +327,18 @@ impl UnsafeCode { cx.struct_span_lint(UNSAFE_CODE, span, decorate); } + + fn report_overriden_symbol_name(&self, cx: &EarlyContext<'_>, span: Span, msg: &str) { + self.report_unsafe(cx, span, |lint| { + lint.build(msg) + .note( + "the linker's behavior with multiple libraries exporting duplicate symbol \ + names is undefined and Rust cannot provide guarantees when you manually \ + override them", + ) + .emit(); + }) + } } impl EarlyLintPass for UnsafeCode { @@ -367,6 +378,40 @@ impl EarlyLintPass for UnsafeCode { lint.build("implementation of an `unsafe` trait").emit() }), + ast::ItemKind::Fn(..) => { + if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::no_mangle) { + self.report_overriden_symbol_name( + cx, + attr.span, + "declaration of a `no_mangle` function", + ); + } + if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::export_name) { + self.report_overriden_symbol_name( + cx, + attr.span, + "declaration of a function with `export_name`", + ); + } + } + + ast::ItemKind::Static(..) => { + if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::no_mangle) { + self.report_overriden_symbol_name( + cx, + attr.span, + "declaration of a `no_mangle` static", + ); + } + if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::export_name) { + self.report_overriden_symbol_name( + cx, + attr.span, + "declaration of a static with `export_name`", + ); + } + } + _ => {} } } @@ -463,8 +508,7 @@ impl MissingDoc { fn check_missing_docs_attrs( &self, cx: &LateContext<'_>, - id: Option, - attrs: &[ast::Attribute], + id: hir::HirId, sp: Span, article: &'static str, desc: &'static str, @@ -483,12 +527,13 @@ impl MissingDoc { // Only check publicly-visible items, using the result from the privacy pass. // It's an option so the crate root can also use this function (it doesn't // have a `NodeId`). - if let Some(id) = id { + if id != hir::CRATE_HIR_ID { if !cx.access_levels.is_exported(id) { return; } } + let attrs = cx.tcx.hir().attrs(id); let has_doc = attrs.iter().any(|a| has_doc(cx.sess(), a)); if !has_doc { cx.struct_span_lint( @@ -520,10 +565,11 @@ impl<'tcx> LateLintPass<'tcx> for MissingDoc { } fn check_crate(&mut self, cx: &LateContext<'_>, krate: &hir::Crate<'_>) { - self.check_missing_docs_attrs(cx, None, &krate.item.attrs, krate.item.span, "the", "crate"); + self.check_missing_docs_attrs(cx, hir::CRATE_HIR_ID, krate.item.span, "the", "crate"); for macro_def in krate.exported_macros { - let has_doc = macro_def.attrs.iter().any(|a| has_doc(cx.sess(), a)); + let attrs = cx.tcx.hir().attrs(macro_def.hir_id()); + let has_doc = attrs.iter().any(|a| has_doc(cx.sess(), a)); if !has_doc { cx.struct_span_lint( MISSING_DOCS, @@ -539,9 +585,9 @@ impl<'tcx> LateLintPass<'tcx> for MissingDoc { 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); + self.private_traits.insert(it.hir_id()); for trait_item_ref in trait_item_refs { - self.private_traits.insert(trait_item_ref.id.hir_id); + self.private_traits.insert(trait_item_ref.id.hir_id()); } return; } @@ -555,7 +601,7 @@ impl<'tcx> LateLintPass<'tcx> for MissingDoc { if let Some(Node::Item(item)) = cx.tcx.hir().find(hir_id) { if let hir::VisibilityKind::Inherited = item.vis.node { for impl_item_ref in items { - self.private_traits.insert(impl_item_ref.id.hir_id); + self.private_traits.insert(impl_item_ref.id.hir_id()); } } } @@ -575,76 +621,44 @@ impl<'tcx> LateLintPass<'tcx> for MissingDoc { _ => return, }; - let def_id = cx.tcx.hir().local_def_id(it.hir_id); - let (article, desc) = cx.tcx.article_and_description(def_id.to_def_id()); + let (article, desc) = cx.tcx.article_and_description(it.def_id.to_def_id()); - self.check_missing_docs_attrs(cx, Some(it.hir_id), &it.attrs, it.span, article, desc); + self.check_missing_docs_attrs(cx, it.hir_id(), it.span, article, desc); } fn check_trait_item(&mut self, cx: &LateContext<'_>, trait_item: &hir::TraitItem<'_>) { - if self.private_traits.contains(&trait_item.hir_id) { + if self.private_traits.contains(&trait_item.hir_id()) { return; } - let def_id = cx.tcx.hir().local_def_id(trait_item.hir_id); - let (article, desc) = cx.tcx.article_and_description(def_id.to_def_id()); + let (article, desc) = cx.tcx.article_and_description(trait_item.def_id.to_def_id()); - self.check_missing_docs_attrs( - cx, - Some(trait_item.hir_id), - &trait_item.attrs, - trait_item.span, - article, - desc, - ); + self.check_missing_docs_attrs(cx, trait_item.hir_id(), trait_item.span, article, desc); } 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 { + if method_context(cx, impl_item.hir_id()) == MethodLateContext::TraitImpl { return; } - let def_id = cx.tcx.hir().local_def_id(impl_item.hir_id); - let (article, desc) = cx.tcx.article_and_description(def_id.to_def_id()); - self.check_missing_docs_attrs( - cx, - Some(impl_item.hir_id), - &impl_item.attrs, - impl_item.span, - article, - desc, - ); + let (article, desc) = cx.tcx.article_and_description(impl_item.def_id.to_def_id()); + self.check_missing_docs_attrs(cx, impl_item.hir_id(), impl_item.span, article, desc); } fn check_foreign_item(&mut self, cx: &LateContext<'_>, foreign_item: &hir::ForeignItem<'_>) { - let def_id = cx.tcx.hir().local_def_id(foreign_item.hir_id); - let (article, desc) = cx.tcx.article_and_description(def_id.to_def_id()); - self.check_missing_docs_attrs( - cx, - Some(foreign_item.hir_id), - &foreign_item.attrs, - foreign_item.span, - article, - desc, - ); + let (article, desc) = cx.tcx.article_and_description(foreign_item.def_id.to_def_id()); + self.check_missing_docs_attrs(cx, foreign_item.hir_id(), foreign_item.span, article, desc); } - fn check_struct_field(&mut self, cx: &LateContext<'_>, sf: &hir::StructField<'_>) { + fn check_field_def(&mut self, cx: &LateContext<'_>, sf: &hir::FieldDef<'_>) { 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, sf.hir_id, 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"); + self.check_missing_docs_attrs(cx, v.id, v.span, "a", "variant"); } } @@ -686,7 +700,7 @@ declare_lint_pass!(MissingCopyImplementations => [MISSING_COPY_IMPLEMENTATIONS]) impl<'tcx> LateLintPass<'tcx> for MissingCopyImplementations { fn check_item(&mut self, cx: &LateContext<'_>, item: &hir::Item<'_>) { - if !cx.access_levels.is_reachable(item.hir_id) { + if !cx.access_levels.is_reachable(item.hir_id()) { return; } let (def, ty) = match item.kind { @@ -694,21 +708,21 @@ impl<'tcx> LateLintPass<'tcx> for MissingCopyImplementations { if !ast_generics.params.is_empty() { return; } - let def = cx.tcx.adt_def(cx.tcx.hir().local_def_id(item.hir_id)); + let def = cx.tcx.adt_def(item.def_id); (def, cx.tcx.mk_adt(def, cx.tcx.intern_substs(&[]))) } hir::ItemKind::Union(_, ref ast_generics) => { if !ast_generics.params.is_empty() { return; } - let def = cx.tcx.adt_def(cx.tcx.hir().local_def_id(item.hir_id)); + let def = cx.tcx.adt_def(item.def_id); (def, cx.tcx.mk_adt(def, cx.tcx.intern_substs(&[]))) } hir::ItemKind::Enum(_, ref ast_generics) => { if !ast_generics.params.is_empty() { return; } - let def = cx.tcx.adt_def(cx.tcx.hir().local_def_id(item.hir_id)); + let def = cx.tcx.adt_def(item.def_id); (def, cx.tcx.mk_adt(def, cx.tcx.intern_substs(&[]))) } _ => return, @@ -766,14 +780,14 @@ declare_lint! { #[derive(Default)] pub struct MissingDebugImplementations { - impling_types: Option, + impling_types: Option, } impl_lint_pass!(MissingDebugImplementations => [MISSING_DEBUG_IMPLEMENTATIONS]); impl<'tcx> LateLintPass<'tcx> for MissingDebugImplementations { fn check_item(&mut self, cx: &LateContext<'_>, item: &hir::Item<'_>) { - if !cx.access_levels.is_reachable(item.hir_id) { + if !cx.access_levels.is_reachable(item.hir_id()) { return; } @@ -788,11 +802,11 @@ impl<'tcx> LateLintPass<'tcx> for MissingDebugImplementations { }; if self.impling_types.is_none() { - let mut impls = HirIdSet::default(); + let mut impls = LocalDefIdSet::default(); cx.tcx.for_each_impl(debug, |d| { if let Some(ty_def) = cx.tcx.type_of(d).ty_adt_def() { if let Some(def_id) = ty_def.did.as_local() { - impls.insert(cx.tcx.hir().local_def_id_to_hir_id(def_id)); + impls.insert(def_id); } } }); @@ -801,7 +815,7 @@ impl<'tcx> LateLintPass<'tcx> for MissingDebugImplementations { debug!("{:?}", self.impling_types); } - if !self.impling_types.as_ref().unwrap().contains(&item.hir_id) { + if !self.impling_types.as_ref().unwrap().contains(&item.def_id) { cx.struct_span_lint(MISSING_DEBUG_IMPLEMENTATIONS, item.span, |lint| { lint.build(&format!( "type does not implement `{}`; consider adding `#[derive(Debug)]` \ @@ -1078,9 +1092,10 @@ declare_lint_pass!(InvalidNoMangleItems => [NO_MANGLE_CONST_ITEMS, NO_MANGLE_GEN impl<'tcx> LateLintPass<'tcx> for InvalidNoMangleItems { fn check_item(&mut self, cx: &LateContext<'_>, it: &hir::Item<'_>) { + let attrs = cx.tcx.hir().attrs(it.hir_id()); match it.kind { hir::ItemKind::Fn(.., ref generics, _) => { - if let Some(no_mangle_attr) = cx.sess().find_by_name(&it.attrs, sym::no_mangle) { + if let Some(no_mangle_attr) = cx.sess().find_by_name(attrs, sym::no_mangle) { for param in generics.params { match param.kind { GenericParamKind::Lifetime { .. } => {} @@ -1106,7 +1121,7 @@ impl<'tcx> LateLintPass<'tcx> for InvalidNoMangleItems { } } hir::ItemKind::Const(..) => { - if cx.sess().contains_name(&it.attrs, sym::no_mangle) { + if cx.sess().contains_name(attrs, sym::no_mangle) { // Const items do not refer to a particular location in memory, and therefore // don't have anything to attach a symbol to cx.struct_span_lint(NO_MANGLE_CONST_ITEMS, it.span, |lint| { @@ -1316,26 +1331,26 @@ impl UnreachablePub { impl<'tcx> LateLintPass<'tcx> for UnreachablePub { fn check_item(&mut self, cx: &LateContext<'_>, item: &hir::Item<'_>) { - self.perform_lint(cx, "item", item.hir_id, &item.vis, item.span, true); + 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<'tcx>) { self.perform_lint( cx, "item", - foreign_item.hir_id, + foreign_item.hir_id(), &foreign_item.vis, foreign_item.span, true, ); } - fn check_struct_field(&mut self, cx: &LateContext<'_>, field: &hir::StructField<'_>) { + fn check_field_def(&mut self, cx: &LateContext<'_>, field: &hir::FieldDef<'_>) { 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<'_>) { - self.perform_lint(cx, "item", impl_item.hir_id, &impl_item.vis, impl_item.span, false); + self.perform_lint(cx, "item", impl_item.hir_id(), &impl_item.vis, impl_item.span, false); } } @@ -1557,8 +1572,7 @@ impl<'tcx> LateLintPass<'tcx> for TrivialConstraints { use rustc_middle::ty::PredicateKind::*; if cx.tcx.features().trivial_bounds { - let def_id = cx.tcx.hir().local_def_id(item.hir_id); - let predicates = cx.tcx.predicates_of(def_id); + let predicates = cx.tcx.predicates_of(item.def_id); for &(predicate, span) in predicates.predicates { let predicate_kind_name = match predicate.kind().skip_binder() { Trait(..) => "Trait", @@ -1764,7 +1778,7 @@ declare_lint! { } pub struct UnnameableTestItems { - boundary: Option, // HirId of the item under which things are not nameable + boundary: Option, // Id of the item under which things are not nameable items_nameable: bool, } @@ -1782,12 +1796,13 @@ impl<'tcx> LateLintPass<'tcx> for UnnameableTestItems { if let hir::ItemKind::Mod(..) = it.kind { } else { self.items_nameable = false; - self.boundary = Some(it.hir_id); + self.boundary = Some(it.def_id); } return; } - if let Some(attr) = cx.sess().find_by_name(&it.attrs, sym::rustc_test_marker) { + let attrs = cx.tcx.hir().attrs(it.hir_id()); + if let Some(attr) = cx.sess().find_by_name(attrs, sym::rustc_test_marker) { cx.struct_span_lint(UNNAMEABLE_TEST_ITEMS, attr.span, |lint| { lint.build("cannot test inner items").emit() }); @@ -1795,7 +1810,7 @@ impl<'tcx> LateLintPass<'tcx> for UnnameableTestItems { } fn check_item_post(&mut self, _cx: &LateContext<'_>, it: &hir::Item<'_>) { - if !self.items_nameable && self.boundary == Some(it.hir_id) { + if !self.items_nameable && self.boundary == Some(it.def_id) { self.items_nameable = true; } } @@ -2079,7 +2094,7 @@ impl<'tcx> LateLintPass<'tcx> for ExplicitOutlivesRequirements { use rustc_middle::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); + let def_id = item.def_id; if let hir::ItemKind::Struct(_, ref hir_generics) | hir::ItemKind::Enum(_, ref hir_generics) | hir::ItemKind::Union(_, ref hir_generics) = item.kind @@ -2634,10 +2649,7 @@ impl ClashingExternDeclarations { /// Insert a new foreign item into the seen set. If a symbol with the same name already exists /// for the item, return its HirId without updating the set. fn insert(&mut self, tcx: TyCtxt<'_>, fi: &hir::ForeignItem<'_>) -> Option { - let hid = fi.hir_id; - - let local_did = tcx.hir().local_def_id(fi.hir_id); - let did = local_did.to_def_id(); + let did = fi.def_id.to_def_id(); let instance = Instance::new(did, ty::List::identity_for_item(tcx, did)); let name = Symbol::intern(tcx.symbol_name(instance).name); if let Some(&hir_id) = self.seen_decls.get(&name) { @@ -2646,7 +2658,7 @@ impl ClashingExternDeclarations { // This lets us avoid emitting "knock-on" diagnostics. Some(hir_id) } else { - self.seen_decls.insert(name, hid) + self.seen_decls.insert(name, fi.hir_id()) } } @@ -2654,16 +2666,15 @@ impl ClashingExternDeclarations { /// the name specified in a #[link_name = ...] attribute if one was specified, else, just the /// symbol's name. fn name_of_extern_decl(tcx: TyCtxt<'_>, fi: &hir::ForeignItem<'_>) -> SymbolName { - let did = tcx.hir().local_def_id(fi.hir_id); if let Some((overridden_link_name, overridden_link_name_span)) = - tcx.codegen_fn_attrs(did).link_name.map(|overridden_link_name| { + tcx.codegen_fn_attrs(fi.def_id).link_name.map(|overridden_link_name| { // FIXME: Instead of searching through the attributes again to get span // information, we could have codegen_fn_attrs also give span information back for // where the attribute was defined. However, until this is found to be a // bottleneck, this does just fine. ( overridden_link_name, - tcx.get_attrs(did.to_def_id()) + tcx.get_attrs(fi.def_id.to_def_id()) .iter() .find(|at| tcx.sess.check_name(at, sym::link_name)) .unwrap() @@ -2891,10 +2902,10 @@ impl<'tcx> LateLintPass<'tcx> for ClashingExternDeclarations { let tcx = cx.tcx; if let Some(existing_hid) = self.insert(tcx, this_fi) { let existing_decl_ty = tcx.type_of(tcx.hir().local_def_id(existing_hid)); - let this_decl_ty = tcx.type_of(tcx.hir().local_def_id(this_fi.hir_id)); + let this_decl_ty = tcx.type_of(this_fi.def_id); debug!( "ClashingExternDeclarations: Comparing existing {:?}: {:?} to this {:?}: {:?}", - existing_hid, existing_decl_ty, this_fi.hir_id, this_decl_ty + existing_hid, existing_decl_ty, this_fi.def_id, this_decl_ty ); // Check that the declarations match. if !Self::structurally_same_type( @@ -2916,7 +2927,7 @@ impl<'tcx> LateLintPass<'tcx> for ClashingExternDeclarations { // Finally, emit the diagnostic. tcx.struct_span_lint_hir( CLASHING_EXTERN_DECLARATIONS, - this_fi.hir_id, + this_fi.hir_id(), get_relevant_span(this_fi), |lint| { let mut expected_str = DiagnosticStyledString::new(); diff --git a/compiler/rustc_lint/src/context.rs b/compiler/rustc_lint/src/context.rs index 58a9064b91..c9de85a2f1 100644 --- a/compiler/rustc_lint/src/context.rs +++ b/compiler/rustc_lint/src/context.rs @@ -21,7 +21,9 @@ use crate::passes::{EarlyLintPassObject, LateLintPassObject}; use rustc_ast as ast; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::sync; -use rustc_errors::{add_elided_lifetime_in_path_suggestion, struct_span_err, Applicability}; +use rustc_errors::{ + add_elided_lifetime_in_path_suggestion, struct_span_err, Applicability, SuggestionStyle, +}; use rustc_hir as hir; use rustc_hir::def::Res; use rustc_hir::def_id::{CrateNum, DefId}; @@ -32,7 +34,8 @@ use rustc_middle::middle::stability; use rustc_middle::ty::layout::{LayoutError, TyAndLayout}; use rustc_middle::ty::print::with_no_trimmed_paths; use rustc_middle::ty::{self, print::Printer, subst::GenericArg, Ty, TyCtxt}; -use rustc_session::lint::BuiltinLintDiagnostics; +use rustc_serialize::json::Json; +use rustc_session::lint::{BuiltinLintDiagnostics, ExternDepSpec}; use rustc_session::lint::{FutureIncompatibleInfo, Level, Lint, LintBuffer, LintId}; use rustc_session::Session; use rustc_session::SessionLintStore; @@ -86,6 +89,7 @@ impl SessionLintStore for LintStore { } /// The target of the `by_name` map, which accounts for renaming/deprecation. +#[derive(Debug)] enum TargetLint { /// A direct lint target Id(LintId), @@ -96,6 +100,11 @@ enum TargetLint { /// Lint with this name existed previously, but has been removed/deprecated. /// The string argument is the reason for removal. Removed(String), + + /// A lint name that should give no warnings and have no effect. + /// + /// This is used by rustc to avoid warning about old rustdoc lints before rustdoc registers them as tool lints. + Ignored, } pub enum FindLintError { @@ -262,6 +271,33 @@ impl LintStore { } } + /// This lint should be available with either the old or the new name. + /// + /// Using the old name will not give a warning. + /// You must register a lint with the new name before calling this function. + #[track_caller] + pub fn register_alias(&mut self, old_name: &str, new_name: &str) { + let target = match self.by_name.get(new_name) { + Some(&Id(lint_id)) => lint_id, + _ => bug!("cannot add alias {} for lint {} that does not exist", old_name, new_name), + }; + match self.by_name.insert(old_name.to_string(), Id(target)) { + None | Some(Ignored) => {} + Some(x) => bug!("duplicate specification of lint {} (was {:?})", old_name, x), + } + } + + /// This lint should give no warning and have no effect. + /// + /// This is used by rustc to avoid warning about old rustdoc lints before rustdoc registers them as tool lints. + #[track_caller] + pub fn register_ignored(&mut self, name: &str) { + if self.by_name.insert(name.to_string(), Ignored).is_some() { + bug!("duplicate specification of lint {}", name); + } + } + + /// This lint has been renamed; warn about using the new name and apply the lint. #[track_caller] pub fn register_renamed(&mut self, old_name: &str, new_name: &str) { let target = match self.by_name.get(new_name) { @@ -280,6 +316,7 @@ impl LintStore { Some(&Id(lint_id)) => Ok(vec![lint_id]), Some(&Renamed(_, lint_id)) => Ok(vec![lint_id]), Some(&Removed(_)) => Err(FindLintError::Removed), + Some(&Ignored) => Ok(vec![]), None => loop { return match self.lint_groups.get(lint_name) { Some(LintGroup { lint_ids, depr, .. }) => { @@ -423,6 +460,7 @@ impl LintStore { } }, Some(&Id(ref id)) => CheckLintNameResult::Ok(slice::from_ref(id)), + Some(&Ignored) => CheckLintNameResult::Ok(&[]), } } @@ -467,7 +505,10 @@ impl LintStore { Some(&Id(ref id)) => { CheckLintNameResult::Tool(Err((Some(slice::from_ref(id)), complete_name))) } - _ => CheckLintNameResult::NoLint(None), + Some(other) => { + tracing::debug!("got renamed lint {:?}", other); + CheckLintNameResult::NoLint(None) + } } } } @@ -636,6 +677,36 @@ pub trait LintContext: Sized { db.span_label(span, "ABI should be specified here"); db.help(&format!("the default ABI is {}", default_abi.name())); } + BuiltinLintDiagnostics::LegacyDeriveHelpers(span) => { + db.span_label(span, "the attribute is introduced here"); + } + BuiltinLintDiagnostics::ExternDepSpec(krate, loc) => { + let json = match loc { + ExternDepSpec::Json(json) => { + db.help(&format!("remove unnecessary dependency `{}`", krate)); + json + } + ExternDepSpec::Raw(raw) => { + db.help(&format!("remove unnecessary dependency `{}` at `{}`", krate, raw)); + db.span_suggestion_with_style( + DUMMY_SP, + "raw extern location", + raw.clone(), + Applicability::Unspecified, + SuggestionStyle::CompletelyHidden, + ); + Json::String(raw) + } + }; + db.tool_only_suggestion_with_metadata( + "json extern location", + Applicability::Unspecified, + json + ); + } + BuiltinLintDiagnostics::ProcMacroBackCompat(note) => { + db.note(¬e); + } } // Rewrap `db`, and pass control to the user. decorate(LintDiagnosticBuilder::new(db)); @@ -677,7 +748,7 @@ impl<'a> EarlyContext<'a> { sess, krate, lint_store, - builder: LintLevelsBuilder::new(sess, warn_about_weird_lints, lint_store), + builder: LintLevelsBuilder::new(sess, warn_about_weird_lints, lint_store, &krate.attrs), buffered, } } diff --git a/compiler/rustc_lint/src/early.rs b/compiler/rustc_lint/src/early.rs index 231edf442e..647ecad046 100644 --- a/compiler/rustc_lint/src/early.rs +++ b/compiler/rustc_lint/src/early.rs @@ -18,7 +18,7 @@ use crate::context::{EarlyContext, LintContext, LintStore}; use crate::passes::{EarlyLintPass, EarlyLintPassObject}; use rustc_ast as ast; use rustc_ast::visit as ast_visit; -use rustc_attr::HasAttrs; +use rustc_ast::AstLike; use rustc_session::lint::{BufferedEarlyLint, LintBuffer, LintPass}; use rustc_session::Session; use rustc_span::symbol::Ident; @@ -163,10 +163,10 @@ impl<'a, T: EarlyLintPass> ast_visit::Visitor<'a> for EarlyContextAndPass<'a, T> run_early_pass!(self, check_struct_def_post, s); } - fn visit_struct_field(&mut self, s: &'a ast::StructField) { + fn visit_field_def(&mut self, s: &'a ast::FieldDef) { self.with_lint_attrs(s.id, &s.attrs, |cx| { - run_early_pass!(cx, check_struct_field, s); - ast_visit::walk_struct_field(cx, s); + run_early_pass!(cx, check_field_def, s); + ast_visit::walk_field_def(cx, s); }) } @@ -188,13 +188,6 @@ impl<'a, T: EarlyLintPass> ast_visit::Visitor<'a> for EarlyContextAndPass<'a, T> 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); diff --git a/compiler/rustc_lint/src/internal.rs b/compiler/rustc_lint/src/internal.rs index 26e536e8f1..9b1a339572 100644 --- a/compiler/rustc_lint/src/internal.rs +++ b/compiler/rustc_lint/src/internal.rs @@ -283,7 +283,7 @@ fn is_doc_keyword(s: Symbol) -> bool { impl<'tcx> LateLintPass<'tcx> for ExistingDocKeyword { fn check_item(&mut self, cx: &LateContext<'_>, item: &rustc_hir::Item<'_>) { - for attr in item.attrs { + for attr in cx.tcx.hir().attrs(item.hir_id()) { if !attr.has_name(sym::doc) { continue; } diff --git a/compiler/rustc_lint/src/late.rs b/compiler/rustc_lint/src/late.rs index 3821a393ef..d325b5fe7f 100644 --- a/compiler/rustc_lint/src/late.rs +++ b/compiler/rustc_lint/src/late.rs @@ -16,7 +16,6 @@ use crate::{passes::LateLintPassObject, LateContext, LateLintPass, LintStore}; use rustc_ast as ast; -use rustc_ast::walk_list; use rustc_data_structures::sync::{join, par_iter, ParallelIterator}; use rustc_hir as hir; use rustc_hir::def_id::{LocalDefId, LOCAL_CRATE}; @@ -53,10 +52,11 @@ impl<'tcx, T: LateLintPass<'tcx>> LateContextAndPass<'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) + fn with_lint_attrs(&mut self, id: hir::HirId, f: F) where F: FnOnce(&mut Self), { + let attrs = self.context.tcx.hir().attrs(id); let prev = self.context.last_node_with_lint_attrs; self.context.last_node_with_lint_attrs = id; self.enter_attrs(attrs); @@ -125,7 +125,7 @@ impl<'tcx, T: LateLintPass<'tcx>> hir_visit::Visitor<'tcx> for LateContextAndPas } fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) { - self.with_lint_attrs(param.hir_id, ¶m.attrs, |cx| { + self.with_lint_attrs(param.hir_id, |cx| { lint_callback!(cx, check_param, param); hir_visit::walk_param(cx, param); }); @@ -142,8 +142,8 @@ impl<'tcx, T: LateLintPass<'tcx>> hir_visit::Visitor<'tcx> for LateContextAndPas self.context.generics = it.kind.generics(); let old_cached_typeck_results = self.context.cached_typeck_results.take(); let old_enclosing_body = self.context.enclosing_body.take(); - self.with_lint_attrs(it.hir_id, &it.attrs, |cx| { - cx.with_param_env(it.hir_id, |cx| { + self.with_lint_attrs(it.hir_id(), |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); @@ -155,8 +155,8 @@ impl<'tcx, T: LateLintPass<'tcx>> hir_visit::Visitor<'tcx> for LateContextAndPas } 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| { + self.with_lint_attrs(it.hir_id(), |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); @@ -170,7 +170,7 @@ impl<'tcx, T: LateLintPass<'tcx>> hir_visit::Visitor<'tcx> for LateContextAndPas } fn visit_expr(&mut self, e: &'tcx hir::Expr<'tcx>) { - self.with_lint_attrs(e.hir_id, &e.attrs, |cx| { + self.with_lint_attrs(e.hir_id, |cx| { lint_callback!(cx, check_expr, e); hir_visit::walk_expr(cx, e); lint_callback!(cx, check_expr_post, e); @@ -178,11 +178,9 @@ impl<'tcx, T: LateLintPass<'tcx>> hir_visit::Visitor<'tcx> for LateContextAndPas } fn visit_stmt(&mut self, s: &'tcx hir::Stmt<'tcx>) { - let get_item = |id: hir::ItemId| self.context.tcx.hir().item(id.id); - let attrs = &s.kind.attrs(get_item); // See `EarlyContextAndPass::visit_stmt` for an explanation // of why we call `walk_stmt` outside of `with_lint_attrs` - self.with_lint_attrs(s.hir_id, attrs, |cx| { + self.with_lint_attrs(s.hir_id, |cx| { lint_callback!(cx, check_stmt, s); }); hir_visit::walk_stmt(self, s); @@ -221,10 +219,10 @@ impl<'tcx, T: LateLintPass<'tcx>> hir_visit::Visitor<'tcx> for LateContextAndPas 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_field_def(&mut self, s: &'tcx hir::FieldDef<'tcx>) { + self.with_lint_attrs(s.hir_id, |cx| { + lint_callback!(cx, check_field_def, s); + hir_visit::walk_field_def(cx, s); }) } @@ -234,7 +232,7 @@ impl<'tcx, T: LateLintPass<'tcx>> hir_visit::Visitor<'tcx> for LateContextAndPas g: &'tcx hir::Generics<'tcx>, item_id: hir::HirId, ) { - self.with_lint_attrs(v.id, &v.attrs, |cx| { + self.with_lint_attrs(v.id, |cx| { lint_callback!(cx, check_variant, v); hir_visit::walk_variant(cx, v, g, item_id); lint_callback!(cx, check_variant_post, v); @@ -257,7 +255,7 @@ impl<'tcx, T: LateLintPass<'tcx>> hir_visit::Visitor<'tcx> for LateContextAndPas } fn visit_local(&mut self, l: &'tcx hir::Local<'tcx>) { - self.with_lint_attrs(l.hir_id, &l.attrs, |cx| { + self.with_lint_attrs(l.hir_id, |cx| { lint_callback!(cx, check_local, l); hir_visit::walk_local(cx, l); }) @@ -301,8 +299,8 @@ impl<'tcx, T: LateLintPass<'tcx>> hir_visit::Visitor<'tcx> for LateContextAndPas 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| { + self.with_lint_attrs(trait_item.hir_id(), |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); @@ -314,8 +312,8 @@ impl<'tcx, T: LateLintPass<'tcx>> hir_visit::Visitor<'tcx> for LateContextAndPas 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| { + self.with_lint_attrs(impl_item.hir_id(), |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); @@ -334,8 +332,10 @@ impl<'tcx, T: LateLintPass<'tcx>> hir_visit::Visitor<'tcx> for LateContextAndPas hir_visit::walk_path(self, p); } - fn visit_attribute(&mut self, attr: &'tcx ast::Attribute) { - lint_callback!(self, check_attribute, attr); + fn visit_attribute(&mut self, hir_id: hir::HirId, attr: &'tcx ast::Attribute) { + self.with_lint_attrs(hir_id, |cx| { + lint_callback!(cx, check_attribute, attr); + }) } } @@ -396,7 +396,9 @@ fn late_lint_mod_pass<'tcx, T: LateLintPass<'tcx>>( // Visit the crate attributes if hir_id == hir::CRATE_HIR_ID { - walk_list!(cx, visit_attribute, tcx.hir().attrs(hir::CRATE_HIR_ID)); + for attr in tcx.hir().attrs(hir::CRATE_HIR_ID).iter() { + cx.visit_attribute(hir_id, attr) + } } } @@ -440,7 +442,7 @@ fn late_lint_pass_crate<'tcx, T: LateLintPass<'tcx>>(tcx: TyCtxt<'tcx>, pass: T) let mut cx = LateContextAndPass { context, pass }; // Visit the whole crate. - cx.with_lint_attrs(hir::CRATE_HIR_ID, &krate.item.attrs, |cx| { + cx.with_lint_attrs(hir::CRATE_HIR_ID, |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); @@ -496,7 +498,7 @@ pub fn check_crate<'tcx, T: LateLintPass<'tcx>>( 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)); + tcx.ensure().lint_mod(module); }); }); }, diff --git a/compiler/rustc_lint/src/levels.rs b/compiler/rustc_lint/src/levels.rs index 1fc2bd0916..a332c30078 100644 --- a/compiler/rustc_lint/src/levels.rs +++ b/compiler/rustc_lint/src/levels.rs @@ -1,13 +1,12 @@ use crate::context::{CheckLintNameResult, LintStore}; use crate::late::unerased_lint_store; use rustc_ast as ast; -use rustc_ast::attr; use rustc_ast::unwrap_or; use rustc_ast_pretty::pprust; 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::def_id::{CrateNum, DefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::{intravisit, HirId}; use rustc_middle::hir::map::Map; use rustc_middle::lint::LevelAndSource; @@ -32,16 +31,17 @@ use std::cmp; 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 crate_attrs = tcx.get_attrs(DefId { krate: cnum, index: CRATE_DEF_INDEX }); + let levels = LintLevelsBuilder::new(tcx.sess, false, &store, crate_attrs); let mut builder = LintLevelMapBuilder { levels, tcx, store }; let krate = tcx.hir().krate(); builder.levels.id_to_set.reserve(krate.exported_macros.len() + 1); - let push = builder.levels.push(&krate.item.attrs, &store, true); + let push = builder.levels.push(tcx.hir().attrs(hir::CRATE_HIR_ID), &store, true); builder.levels.register_id(hir::CRATE_HIR_ID); for macro_def in krate.exported_macros { - builder.levels.register_id(macro_def.hir_id); + builder.levels.register_id(macro_def.hir_id()); } intravisit::walk_crate(&mut builder, krate); builder.levels.pop(push); @@ -56,6 +56,7 @@ pub struct LintLevelsBuilder<'s> { cur: u32, warn_about_weird_lints: bool, store: &'s LintStore, + crate_attrs: &'s [ast::Attribute], } pub struct BuilderPush { @@ -64,7 +65,12 @@ pub struct BuilderPush { } impl<'s> LintLevelsBuilder<'s> { - pub fn new(sess: &'s Session, warn_about_weird_lints: bool, store: &'s LintStore) -> Self { + pub fn new( + sess: &'s Session, + warn_about_weird_lints: bool, + store: &'s LintStore, + crate_attrs: &'s [ast::Attribute], + ) -> Self { let mut builder = LintLevelsBuilder { sess, sets: LintLevelSets::new(), @@ -72,6 +78,7 @@ impl<'s> LintLevelsBuilder<'s> { id_to_set: Default::default(), warn_about_weird_lints, store, + crate_attrs, }; builder.process_command_line(sess, store); assert_eq!(builder.sets.list.len(), 1); @@ -304,15 +311,22 @@ impl<'s> LintLevelsBuilder<'s> { }; 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) { - struct_span_err!( + if !is_known_lint_tool(tool_ident.name, sess, &self.crate_attrs) { + let mut err = struct_span_err!( sess, tool_ident.span, E0710, - "an unknown tool name found in scoped lint: `{}`", + "unknown tool name `{}` found in scoped lint: `{}`", + tool_ident.name, pprust::path_to_string(&meta_item.path), - ) - .emit(); + ); + if sess.is_nightly_build() { + err.help(&format!( + "add `#![register_tool({})]` to the crate root", + tool_ident.name + )); + } + err.emit(); continue; } @@ -321,17 +335,18 @@ impl<'s> LintLevelsBuilder<'s> { None }; let name = meta_item.path.segments.last().expect("empty lint name").ident.name; - match store.check_lint_name(&name.as_str(), tool_name) { + let lint_result = store.check_lint_name(&name.as_str(), tool_name); + match &lint_result { CheckLintNameResult::Ok(ids) => { let src = LintLevelSource::Node(name, li.span(), reason); - for &id in ids { + for &id in *ids { self.check_gated_lint(id, attr.span); self.insert_spec(&mut specs, id, (level, src)); } } CheckLintNameResult::Tool(result) => { - match result { + match *result { Ok(ids) => { let complete_name = &format!("{}::{}", tool_name.unwrap(), name); let src = LintLevelSource::Node( @@ -343,7 +358,7 @@ impl<'s> LintLevelsBuilder<'s> { self.insert_spec(&mut specs, *id, (level, src)); } } - Err((Some(ids), new_lint_name)) => { + Err((Some(ids), ref new_lint_name)) => { let lint = builtin::RENAMED_AND_REMOVED_LINTS; let (lvl, src) = self.sets.get_lint_level(lint, self.cur, Some(&specs), &sess); @@ -392,21 +407,21 @@ impl<'s> LintLevelsBuilder<'s> { CheckLintNameResult::Warning(msg, renamed) => { let lint = builtin::RENAMED_AND_REMOVED_LINTS; - let (level, src) = + let (renamed_lint_level, src) = self.sets.get_lint_level(lint, self.cur, Some(&specs), &sess); struct_lint_level( self.sess, lint, - level, + renamed_lint_level, src, Some(li.span().into()), |lint| { let mut err = lint.build(&msg); - if let Some(new_name) = renamed { + if let Some(new_name) = &renamed { err.span_suggestion( li.span(), "use the new name", - new_name, + new_name.to_string(), Applicability::MachineApplicable, ); } @@ -444,6 +459,22 @@ impl<'s> LintLevelsBuilder<'s> { ); } } + // If this lint was renamed, apply the new lint instead of ignoring the attribute. + // This happens outside of the match because the new lint should be applied even if + // we don't warn about the name change. + if let CheckLintNameResult::Warning(_, Some(new_name)) = lint_result { + // Ignore any errors or warnings that happen because the new name is inaccurate + if let CheckLintNameResult::Ok(ids) = + store.check_lint_name(&new_name, tool_name) + { + let src = + LintLevelSource::Node(Symbol::intern(&new_name), li.span(), reason); + for &id in ids { + self.check_gated_lint(id, attr.span); + self.insert_spec(&mut specs, id, (level, src)); + } + } + } } } @@ -542,6 +573,20 @@ impl<'s> LintLevelsBuilder<'s> { } } +fn is_known_lint_tool(m_item: Symbol, sess: &Session, attrs: &[ast::Attribute]) -> bool { + if [sym::clippy, sym::rustc, sym::rustdoc].contains(&m_item) { + return true; + } + // Look for registered tools + // NOTE: does no error handling; error handling is done by rustc_resolve. + sess.filter_by_name(attrs, sym::register_tool) + .filter_map(|attr| attr.meta_item_list()) + .flat_map(std::convert::identity) + .filter_map(|nested_meta| nested_meta.ident()) + .map(|ident| ident.name) + .any(|name| name == m_item) +} + struct LintLevelMapBuilder<'a, 'tcx> { levels: LintLevelsBuilder<'tcx>, tcx: TyCtxt<'tcx>, @@ -549,11 +594,12 @@ struct LintLevelMapBuilder<'a, 'tcx> { } impl LintLevelMapBuilder<'_, '_> { - fn with_lint_attrs(&mut self, id: hir::HirId, attrs: &[ast::Attribute], f: F) + fn with_lint_attrs(&mut self, id: hir::HirId, f: F) where F: FnOnce(&mut Self), { let is_crate_hir = id == hir::CRATE_HIR_ID; + let attrs = self.tcx.hir().attrs(id); let push = self.levels.push(attrs, self.store, is_crate_hir); if push.changed { self.levels.register_id(id); @@ -571,19 +617,19 @@ impl<'tcx> intravisit::Visitor<'tcx> for LintLevelMapBuilder<'_, 'tcx> { } fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) { - self.with_lint_attrs(param.hir_id, ¶m.attrs, |builder| { + self.with_lint_attrs(param.hir_id, |builder| { intravisit::walk_param(builder, param); }); } fn visit_item(&mut self, it: &'tcx hir::Item<'tcx>) { - self.with_lint_attrs(it.hir_id, &it.attrs, |builder| { + self.with_lint_attrs(it.hir_id(), |builder| { intravisit::walk_item(builder, it); }); } fn visit_foreign_item(&mut self, it: &'tcx hir::ForeignItem<'tcx>) { - self.with_lint_attrs(it.hir_id, &it.attrs, |builder| { + self.with_lint_attrs(it.hir_id(), |builder| { intravisit::walk_foreign_item(builder, it); }) } @@ -596,14 +642,14 @@ impl<'tcx> intravisit::Visitor<'tcx> for LintLevelMapBuilder<'_, 'tcx> { } fn visit_expr(&mut self, e: &'tcx hir::Expr<'tcx>) { - self.with_lint_attrs(e.hir_id, &e.attrs, |builder| { + self.with_lint_attrs(e.hir_id, |builder| { intravisit::walk_expr(builder, e); }) } - 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); + fn visit_field_def(&mut self, s: &'tcx hir::FieldDef<'tcx>) { + self.with_lint_attrs(s.hir_id, |builder| { + intravisit::walk_field_def(builder, s); }) } @@ -613,31 +659,31 @@ impl<'tcx> intravisit::Visitor<'tcx> for LintLevelMapBuilder<'_, 'tcx> { g: &'tcx hir::Generics<'tcx>, item_id: hir::HirId, ) { - self.with_lint_attrs(v.id, &v.attrs, |builder| { + self.with_lint_attrs(v.id, |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| { + self.with_lint_attrs(l.hir_id, |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| { + self.with_lint_attrs(a.hir_id, |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| { + self.with_lint_attrs(trait_item.hir_id(), |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| { + self.with_lint_attrs(impl_item.hir_id(), |builder| { intravisit::walk_impl_item(builder, impl_item); }); } diff --git a/compiler/rustc_lint/src/lib.rs b/compiler/rustc_lint/src/lib.rs index 638b73c27a..4c3dbcabc8 100644 --- a/compiler/rustc_lint/src/lib.rs +++ b/compiler/rustc_lint/src/lib.rs @@ -57,6 +57,7 @@ mod methods; mod non_ascii_idents; mod non_fmt_panic; mod nonstandard_style; +mod noop_method_call; mod passes; mod redundant_semicolon; mod traits; @@ -69,9 +70,7 @@ use rustc_hir::def_id::LocalDefId; use rustc_middle::ty::query::Providers; use rustc_middle::ty::TyCtxt; use rustc_session::lint::builtin::{ - BARE_TRAIT_OBJECTS, BROKEN_INTRA_DOC_LINKS, ELIDED_LIFETIMES_IN_PATHS, - EXPLICIT_OUTLIVES_REQUIREMENTS, INVALID_CODEBLOCK_ATTRIBUTES, INVALID_HTML_TAGS, - MISSING_DOC_CODE_EXAMPLES, NON_AUTOLINKS, PRIVATE_DOC_TESTS, + BARE_TRAIT_OBJECTS, ELIDED_LIFETIMES_IN_PATHS, EXPLICIT_OUTLIVES_REQUIREMENTS, }; use rustc_span::symbol::{Ident, Symbol}; use rustc_span::Span; @@ -83,6 +82,7 @@ use methods::*; use non_ascii_idents::*; use non_fmt_panic::NonPanicFmt; use nonstandard_style::*; +use noop_method_call::*; use redundant_semicolon::*; use traits::*; use types::*; @@ -170,6 +170,7 @@ macro_rules! late_lint_passes { DropTraitConstraints: DropTraitConstraints, TemporaryCStringAsPtr: TemporaryCStringAsPtr, NonPanicFmt: NonPanicFmt, + NoopMethodCall: NoopMethodCall, ] ); }; @@ -314,17 +315,6 @@ fn register_builtins(store: &mut LintStore, no_interleave_lints: bool) { // MACRO_USE_EXTERN_CRATE ); - add_lint_group!( - "rustdoc", - NON_AUTOLINKS, - BROKEN_INTRA_DOC_LINKS, - PRIVATE_INTRA_DOC_LINKS, - INVALID_CODEBLOCK_ATTRIBUTES, - MISSING_DOC_CODE_EXAMPLES, - PRIVATE_DOC_TESTS, - INVALID_HTML_TAGS - ); - // Register renamed and removed lints. store.register_renamed("single_use_lifetime", "single_use_lifetimes"); store.register_renamed("elided_lifetime_in_path", "elided_lifetimes_in_paths"); @@ -334,8 +324,30 @@ fn register_builtins(store: &mut LintStore, no_interleave_lints: bool) { store.register_renamed("async_idents", "keyword_idents"); store.register_renamed("exceeding_bitshifts", "arithmetic_overflow"); store.register_renamed("redundant_semicolon", "redundant_semicolons"); - store.register_renamed("intra_doc_link_resolution_failure", "broken_intra_doc_links"); store.register_renamed("overlapping_patterns", "overlapping_range_endpoints"); + + // These were moved to tool lints, but rustc still sees them when compiling normally, before + // tool lints are registered, so `check_tool_name_for_backwards_compat` doesn't work. Use + // `register_removed` explicitly. + const RUSTDOC_LINTS: &[&str] = &[ + "broken_intra_doc_links", + "private_intra_doc_links", + "missing_crate_level_docs", + "missing_doc_code_examples", + "private_doc_tests", + "invalid_codeblock_attributes", + "invalid_html_tags", + "non_autolinks", + ]; + for rustdoc_lint in RUSTDOC_LINTS { + store.register_ignored(rustdoc_lint); + } + store.register_removed( + "intra_doc_link_resolution_failure", + "use `rustdoc::broken_intra_doc_links` instead", + ); + store.register_removed("rustdoc", "use `rustdoc::all` instead"); + store.register_removed("unknown_features", "replaced by an error"); store.register_removed("unsigned_negation", "replaced by negate_unsigned feature gate"); store.register_removed("negate_unsigned", "cast a signed value instead"); diff --git a/compiler/rustc_lint/src/non_fmt_panic.rs b/compiler/rustc_lint/src/non_fmt_panic.rs index e98297b692..5a27135581 100644 --- a/compiler/rustc_lint/src/non_fmt_panic.rs +++ b/compiler/rustc_lint/src/non_fmt_panic.rs @@ -69,23 +69,65 @@ fn check_panic<'tcx>(cx: &LateContext<'tcx>, f: &'tcx hir::Expr<'tcx>, arg: &'tc let (span, panic) = panic_call(cx, f); - cx.struct_span_lint(NON_FMT_PANIC, arg.span, |lint| { + // Find the span of the argument to `panic!()`, before expansion in the + // case of `panic!(some_macro!())`. + // We don't use source_callsite(), because this `panic!(..)` might itself + // be expanded from another macro, in which case we want to stop at that + // expansion. + let mut arg_span = arg.span; + let mut arg_macro = None; + while !span.contains(arg_span) { + let expn = arg_span.ctxt().outer_expn_data(); + if expn.is_root() { + break; + } + arg_macro = expn.macro_def_id; + arg_span = expn.call_site; + } + + cx.struct_span_lint(NON_FMT_PANIC, arg_span, |lint| { let mut l = lint.build("panic message is not a string literal"); l.note("this is no longer accepted in Rust 2021"); - if span.contains(arg.span) { + if !span.contains(arg_span) { + // No clue where this argument is coming from. + l.emit(); + return; + } + if arg_macro.map_or(false, |id| cx.tcx.is_diagnostic_item(sym::format_macro, id)) { + // A case of `panic!(format!(..))`. + l.note("the panic!() macro supports formatting, so there's no need for the format!() macro here"); + if let Some((open, close, _)) = find_delimiters(cx, arg_span) { + l.multipart_suggestion( + "remove the `format!(..)` macro call", + vec![ + (arg_span.until(open.shrink_to_hi()), "".into()), + (close.until(arg_span.shrink_to_hi()), "".into()), + ], + Applicability::MachineApplicable, + ); + } + } else { l.span_suggestion_verbose( - arg.span.shrink_to_lo(), + arg_span.shrink_to_lo(), "add a \"{}\" format string to Display the message", "\"{}\", ".into(), Applicability::MaybeIncorrect, ); if panic == sym::std_panic_macro { - l.span_suggestion_verbose( - span.until(arg.span), - "or use std::panic::panic_any instead", - "std::panic::panic_any(".into(), - Applicability::MachineApplicable, - ); + if let Some((open, close, del)) = find_delimiters(cx, span) { + l.multipart_suggestion( + "or use std::panic::panic_any instead", + if del == '(' { + vec![(span.until(open), "std::panic::panic_any".into())] + } else { + vec![ + (span.until(open.shrink_to_hi()), "std::panic::panic_any(".into()), + (close, ")".into()), + ] + }, + Applicability::MachineApplicable, + ); + } } } l.emit(); @@ -159,7 +201,7 @@ fn check_panic_str<'tcx>( Some(v) if v.len() == 1 => "panic message contains a brace", _ => "panic message contains braces", }; - cx.struct_span_lint(NON_FMT_PANIC, brace_spans.unwrap_or(vec![span]), |lint| { + cx.struct_span_lint(NON_FMT_PANIC, brace_spans.unwrap_or_else(|| vec![span]), |lint| { let mut l = lint.build(msg); l.note("this message is not used as a format string, but will be in Rust 2021"); if span.contains(arg.span) { @@ -175,6 +217,19 @@ fn check_panic_str<'tcx>( } } +/// Given the span of `some_macro!(args);`, gives the span of `(` and `)`, +/// and the type of (opening) delimiter used. +fn find_delimiters<'tcx>(cx: &LateContext<'tcx>, span: Span) -> Option<(Span, Span, char)> { + let snippet = cx.sess().parse_sess.source_map().span_to_snippet(span).ok()?; + let (open, open_ch) = snippet.char_indices().find(|&(_, c)| "([{".contains(c))?; + let close = snippet.rfind(|c| ")]}".contains(c))?; + Some(( + span.from_inner(InnerSpan { start: open, end: open + 1 }), + span.from_inner(InnerSpan { start: close, end: close + 1 }), + open_ch, + )) +} + fn panic_call<'tcx>(cx: &LateContext<'tcx>, f: &'tcx hir::Expr<'tcx>) -> (Span, Symbol) { let mut expn = f.span.ctxt().outer_expn_data(); diff --git a/compiler/rustc_lint/src/nonstandard_style.rs b/compiler/rustc_lint/src/nonstandard_style.rs index 121dde325f..be9c6eafb6 100644 --- a/compiler/rustc_lint/src/nonstandard_style.rs +++ b/compiler/rustc_lint/src/nonstandard_style.rs @@ -400,14 +400,15 @@ impl<'tcx> LateLintPass<'tcx> for NonSnakeCase { } _ => (), }, - FnKind::ItemFn(ident, _, header, _, attrs) => { + FnKind::ItemFn(ident, _, header, _) => { + let attrs = cx.tcx.hir().attrs(id); // Skip foreign-ABI #[no_mangle] functions (Issue #31924) if header.abi != Abi::Rust && cx.sess().contains_name(attrs, sym::no_mangle) { return; } self.check_snake_case(cx, "function", ident); } - FnKind::Closure(_) => (), + FnKind::Closure => (), } } @@ -504,8 +505,9 @@ impl NonUpperCaseGlobals { impl<'tcx> LateLintPass<'tcx> for NonUpperCaseGlobals { fn check_item(&mut self, cx: &LateContext<'_>, it: &hir::Item<'_>) { + let attrs = cx.tcx.hir().attrs(it.hir_id()); match it.kind { - hir::ItemKind::Static(..) if !cx.sess().contains_name(&it.attrs, sym::no_mangle) => { + hir::ItemKind::Static(..) if !cx.sess().contains_name(attrs, sym::no_mangle) => { NonUpperCaseGlobals::check_upper_case(cx, "static variable", &it.ident); } hir::ItemKind::Const(..) => { diff --git a/compiler/rustc_lint/src/noop_method_call.rs b/compiler/rustc_lint/src/noop_method_call.rs new file mode 100644 index 0000000000..479cc00199 --- /dev/null +++ b/compiler/rustc_lint/src/noop_method_call.rs @@ -0,0 +1,111 @@ +use crate::context::LintContext; +use crate::rustc_middle::ty::TypeFoldable; +use crate::LateContext; +use crate::LateLintPass; +use rustc_hir::def::DefKind; +use rustc_hir::{Expr, ExprKind}; +use rustc_middle::ty; +use rustc_span::symbol::sym; + +declare_lint! { + /// The `noop_method_call` lint detects specific calls to noop methods + /// such as a calling `<&T as Clone>::clone` where `T: !Clone`. + /// + /// ### Example + /// + /// ```rust + /// # #![allow(unused)] + /// #![warn(noop_method_call)] + /// struct Foo; + /// let foo = &Foo; + /// let clone: &Foo = foo.clone(); + /// ``` + /// + /// {{produces}} + /// + /// ### Explanation + /// + /// Some method calls are noops meaning that they do nothing. Usually such methods + /// are the result of blanket implementations that happen to create some method invocations + /// that end up not doing anything. For instance, `Clone` is implemented on all `&T`, but + /// calling `clone` on a `&T` where `T` does not implement clone, actually doesn't do anything + /// as references are copy. This lint detects these calls and warns the user about them. + pub NOOP_METHOD_CALL, + Allow, + "detects the use of well-known noop methods" +} + +declare_lint_pass!(NoopMethodCall => [NOOP_METHOD_CALL]); + +impl<'tcx> LateLintPass<'tcx> for NoopMethodCall { + fn check_expr(&mut self, cx: &LateContext<'tcx>, expr: &'tcx Expr<'_>) { + // We only care about method calls. + let (call, elements) = match expr.kind { + ExprKind::MethodCall(call, _, elements, _) => (call, elements), + _ => return, + }; + // We only care about method calls corresponding to the `Clone`, `Deref` and `Borrow` + // traits and ignore any other method call. + let (trait_id, did) = match cx.typeck_results().type_dependent_def(expr.hir_id) { + // Verify we are dealing with a method/associated function. + Some((DefKind::AssocFn, did)) => match cx.tcx.trait_of_item(did) { + // Check that we're dealing with a trait method for one of the traits we care about. + Some(trait_id) + if [sym::Clone, sym::Deref, sym::Borrow] + .iter() + .any(|s| cx.tcx.is_diagnostic_item(*s, trait_id)) => + { + (trait_id, did) + } + _ => return, + }, + _ => return, + }; + let substs = cx.typeck_results().node_substs(expr.hir_id); + if substs.needs_subst() { + // We can't resolve on types that require monomorphization, so we don't handle them if + // we need to perfom substitution. + return; + } + let param_env = cx.tcx.param_env(trait_id); + // Resolve the trait method instance. + let i = match ty::Instance::resolve(cx.tcx, param_env, did, substs) { + Ok(Some(i)) => i, + _ => return, + }; + // (Re)check that it implements the noop diagnostic. + for s in [sym::noop_method_clone, sym::noop_method_deref, sym::noop_method_borrow].iter() { + if cx.tcx.is_diagnostic_item(*s, i.def_id()) { + let method = &call.ident.name; + let receiver = &elements[0]; + let receiver_ty = cx.typeck_results().expr_ty(receiver); + let expr_ty = cx.typeck_results().expr_ty_adjusted(expr); + if receiver_ty != expr_ty { + // This lint will only trigger if the receiver type and resulting expression \ + // type are the same, implying that the method call is unnecessary. + return; + } + let expr_span = expr.span; + let note = format!( + "the type `{:?}` which `{}` is being called on is the same as \ + the type returned from `{}`, so the method call does not do \ + anything and can be removed", + receiver_ty, method, method, + ); + + let span = expr_span.with_lo(receiver.span.hi()); + cx.struct_span_lint(NOOP_METHOD_CALL, span, |lint| { + let method = &call.ident.name; + let message = format!( + "call to `.{}()` on a reference in this situation does nothing", + &method, + ); + lint.build(&message) + .span_label(span, "unnecessary method call") + .note(¬e) + .emit() + }); + } + } + } +} diff --git a/compiler/rustc_lint/src/passes.rs b/compiler/rustc_lint/src/passes.rs index 828f283d2a..bbe17dcf4b 100644 --- a/compiler/rustc_lint/src/passes.rs +++ b/compiler/rustc_lint/src/passes.rs @@ -57,7 +57,7 @@ macro_rules! late_lint_methods { 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_field_def(a: &$hir hir::FieldDef<$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); @@ -160,8 +160,6 @@ macro_rules! early_lint_methods { fn check_ident(a: 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); @@ -195,7 +193,7 @@ macro_rules! early_lint_methods { 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_field_def(a: &ast::FieldDef); fn check_variant(a: &ast::Variant); fn check_variant_post(a: &ast::Variant); fn check_lifetime(a: &ast::Lifetime); diff --git a/compiler/rustc_lint/src/traits.rs b/compiler/rustc_lint/src/traits.rs index b031c1108c..e632f29e67 100644 --- a/compiler/rustc_lint/src/traits.rs +++ b/compiler/rustc_lint/src/traits.rs @@ -47,8 +47,7 @@ impl<'tcx> LateLintPass<'tcx> for DropTraitConstraints { fn check_item(&mut self, cx: &LateContext<'tcx>, item: &'tcx hir::Item<'tcx>) { use rustc_middle::ty::PredicateKind::*; - let def_id = cx.tcx.hir().local_def_id(item.hir_id); - let predicates = cx.tcx.explicit_predicates_of(def_id); + let predicates = cx.tcx.explicit_predicates_of(item.def_id); for &(predicate, span) in predicates.predicates { let trait_predicate = match predicate.kind().skip_binder() { Trait(trait_predicate, _constness) => trait_predicate, diff --git a/compiler/rustc_lint/src/types.rs b/compiler/rustc_lint/src/types.rs index 1e879d2937..2d311cc32f 100644 --- a/compiler/rustc_lint/src/types.rs +++ b/compiler/rustc_lint/src/types.rs @@ -217,7 +217,11 @@ fn report_bin_hex_error( cx.struct_span_lint(OVERFLOWING_LITERALS, expr.span, |lint| { let (t, actually) = match ty { attr::IntType::SignedInt(t) => { - let actually = size.sign_extend(val) as i128; + let actually = if negative { + -(size.sign_extend(val) as i128) + } else { + size.sign_extend(val) as i128 + }; (t.name_str(), actually.to_string()) } attr::IntType::UnsignedInt(t) => { @@ -225,12 +229,23 @@ fn report_bin_hex_error( (t.name_str(), actually.to_string()) } }; - let mut err = lint.build(&format!("literal out of range for {}", t)); - err.note(&format!( - "the literal `{}` (decimal `{}`) does not fit into \ - the type `{}` and will become `{}{}`", - repr_str, val, t, actually, t - )); + let mut err = lint.build(&format!("literal out of range for `{}`", t)); + if negative { + // If the value is negative, + // emits a note about the value itself, apart from the literal. + err.note(&format!( + "the literal `{}` (decimal `{}`) does not fit into \ + the type `{}`", + repr_str, val, t + )); + err.note(&format!("and the value `-{}` will become `{}{}`", repr_str, actually, t)); + } else { + err.note(&format!( + "the literal `{}` (decimal `{}`) does not fit into \ + the type `{}` and will become `{}{}`", + repr_str, val, t, actually, t + )); + } if let Some(sugg_ty) = get_type_suggestion(&cx.typeck_results().node_type(expr.hir_id), val, negative) { @@ -238,12 +253,12 @@ fn report_bin_hex_error( let (sans_suffix, _) = repr_str.split_at(pos); err.span_suggestion( expr.span, - &format!("consider using `{}` instead", sugg_ty), + &format!("consider using the type `{}` instead", sugg_ty), format!("{}{}", sans_suffix, sugg_ty), Applicability::MachineApplicable, ); } else { - err.help(&format!("consider using `{}` instead", sugg_ty)); + err.help(&format!("consider using the type `{}` instead", sugg_ty)); } } err.emit(); @@ -338,18 +353,23 @@ fn lint_int_literal<'tcx>( } cx.struct_span_lint(OVERFLOWING_LITERALS, e.span, |lint| { - lint.build(&format!("literal out of range for `{}`", t.name_str())) - .note(&format!( - "the literal `{}` does not fit into the type `{}` whose range is `{}..={}`", - cx.sess() - .source_map() - .span_to_snippet(lit.span) - .expect("must get snippet from literal"), - t.name_str(), - min, - max, - )) - .emit(); + let mut err = lint.build(&format!("literal out of range for `{}`", t.name_str())); + err.note(&format!( + "the literal `{}` does not fit into the type `{}` whose range is `{}..={}`", + cx.sess() + .source_map() + .span_to_snippet(lit.span) + .expect("must get snippet from literal"), + t.name_str(), + min, + max, + )); + if let Some(sugg_ty) = + get_type_suggestion(&cx.typeck_results().node_type(e.hir_id), v, negative) + { + err.help(&format!("consider using the type `{}` instead", sugg_ty)); + } + err.emit(); }); } } @@ -472,7 +492,7 @@ fn lint_literal<'tcx>( impl<'tcx> LateLintPass<'tcx> for TypeLimits { fn check_expr(&mut self, cx: &LateContext<'tcx>, e: &'tcx hir::Expr<'tcx>) { match e.kind { - hir::ExprKind::Unary(hir::UnOp::UnNeg, ref expr) => { + hir::ExprKind::Unary(hir::UnOp::Neg, ref expr) => { // propagate negation, if the negation itself isn't negated if self.negated_expr_id != Some(e.hir_id) { self.negated_expr_id = Some(expr.hir_id); @@ -672,7 +692,7 @@ pub fn transparent_newtype_field<'a, 'tcx>( } /// Is type known to be non-null? -crate fn ty_is_known_nonnull<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>, mode: CItemKind) -> bool { +fn ty_is_known_nonnull<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>, mode: CItemKind) -> bool { let tcx = cx.tcx; match ty.kind() { ty::FnPtr(_) => true, @@ -685,6 +705,12 @@ crate fn ty_is_known_nonnull<'tcx>(cx: &LateContext<'tcx>, ty: Ty<'tcx>, mode: C return true; } + // Types with a `#[repr(no_niche)]` attribute have their niche hidden. + // The attribute is used by the UnsafeCell for example (the only use so far). + if def.repr.hide_niche() { + return false; + } + for variant in &def.variants { if let Some(field) = transparent_newtype_field(cx.tcx, variant) { if ty_is_known_nonnull(cx, field.ty(tcx, substs), mode) { @@ -1256,15 +1282,15 @@ impl<'a, 'tcx> ImproperCTypesVisitor<'a, 'tcx> { impl<'tcx> LateLintPass<'tcx> for ImproperCTypesDeclarations { fn check_foreign_item(&mut self, cx: &LateContext<'_>, it: &hir::ForeignItem<'_>) { let mut vis = ImproperCTypesVisitor { cx, mode: CItemKind::Declaration }; - let abi = cx.tcx.hir().get_foreign_abi(it.hir_id); + let abi = cx.tcx.hir().get_foreign_abi(it.hir_id()); if !vis.is_internal_abi(abi) { match it.kind { hir::ForeignItemKind::Fn(ref decl, _, _) => { - vis.check_foreign_fn(it.hir_id, decl); + vis.check_foreign_fn(it.hir_id(), decl); } hir::ForeignItemKind::Static(ref ty, _) => { - vis.check_foreign_static(it.hir_id, ty.span); + vis.check_foreign_static(it.hir_id(), ty.span); } hir::ForeignItemKind::Type => (), } @@ -1302,8 +1328,7 @@ declare_lint_pass!(VariantSizeDifferences => [VARIANT_SIZE_DIFFERENCES]); impl<'tcx> LateLintPass<'tcx> for VariantSizeDifferences { 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); + let t = cx.tcx.type_of(it.def_id); let ty = cx.tcx.erase_regions(t); let layout = match cx.layout_of(ty) { Ok(layout) => layout, diff --git a/compiler/rustc_lint/src/unused.rs b/compiler/rustc_lint/src/unused.rs index b611aebad0..67946dfb29 100644 --- a/compiler/rustc_lint/src/unused.rs +++ b/compiler/rustc_lint/src/unused.rs @@ -406,6 +406,8 @@ impl<'tcx> LateLintPass<'tcx> for UnusedAttributes { if !cx.sess().is_attr_used(attr) { debug!("emitting warning for: {:?}", attr); cx.struct_span_lint(UNUSED_ATTRIBUTES, attr.span, |lint| { + // Mark as used to avoid duplicate warnings. + cx.sess().mark_attr_used(attr); lint.build("unused attribute").emit() }); // Is it a builtin attribute that must be used at the crate level? @@ -602,7 +604,7 @@ trait UnusedDelimLint { use rustc_ast::ExprKind::*; let (value, ctx, followed_by_block, left_pos, right_pos) = match e.kind { // Do not lint `unused_braces` in `if let` expressions. - If(ref cond, ref block, ..) + If(ref cond, ref block, _) if !matches!(cond.kind, Let(_, _)) || Self::LINT_EXPR_IN_PATTERN_MATCHING_CTX => { let left = e.span.lo() + rustc_span::BytePos(2); @@ -816,8 +818,33 @@ impl UnusedParens { impl EarlyLintPass for UnusedParens { fn check_expr(&mut self, cx: &EarlyContext<'_>, e: &ast::Expr) { - if let ExprKind::Let(ref pat, ..) | ExprKind::ForLoop(ref pat, ..) = e.kind { - self.check_unused_parens_pat(cx, pat, false, false); + match e.kind { + ExprKind::Let(ref pat, _) | ExprKind::ForLoop(ref pat, ..) => { + self.check_unused_parens_pat(cx, pat, false, false); + } + // We ignore parens in cases like `if (((let Some(0) = Some(1))))` because we already + // handle a hard error for them during AST lowering in `lower_expr_mut`, but we still + // want to complain about things like `if let 42 = (42)`. + ExprKind::If(ref cond, ref block, ref else_) + if matches!(cond.peel_parens().kind, ExprKind::Let(..)) => + { + self.check_unused_delims_expr( + cx, + cond.peel_parens(), + UnusedDelimsCtx::LetScrutineeExpr, + true, + None, + None, + ); + for stmt in &block.stmts { + ::check_stmt(self, cx, stmt); + } + if let Some(e) = else_ { + ::check_expr(self, cx, e); + } + return; + } + _ => {} } ::check_expr(self, cx, e) @@ -847,7 +874,7 @@ impl EarlyLintPass for UnusedParens { fn check_stmt(&mut self, cx: &EarlyContext<'_>, s: &ast::Stmt) { if let StmtKind::Local(ref local) = s.kind { - self.check_unused_parens_pat(cx, &local.pat, false, false); + self.check_unused_parens_pat(cx, &local.pat, true, false); } ::check_stmt(self, cx, s) diff --git a/compiler/rustc_lint_defs/src/builtin.rs b/compiler/rustc_lint_defs/src/builtin.rs index da62ad3a6b..005c4f9f6e 100644 --- a/compiler/rustc_lint_defs/src/builtin.rs +++ b/compiler/rustc_lint_defs/src/builtin.rs @@ -1,15 +1,13 @@ // ignore-tidy-filelength + //! Some lints that are built in to the compiler. //! //! These are the built-in lints that are emitted direct in the main //! compiler code, rather than using their own custom pass. Those //! lints are all available in `rustc_lint::builtin`. -// ignore-tidy-filelength - -use crate::{declare_lint, declare_lint_pass}; +use crate::{declare_lint, declare_lint_pass, FutureBreakage}; use rustc_span::edition::Edition; -use rustc_span::symbol::sym; declare_lint! { /// The `forbidden_lint_groups` lint detects violations of @@ -1081,6 +1079,7 @@ declare_lint! { pub UNALIGNED_REFERENCES, Allow, "detects unaligned references to fields of packed structs", + report_in_external_macro } declare_lint! { @@ -1815,14 +1814,12 @@ declare_lint! { } declare_lint! { - /// The `irrefutable_let_patterns` lint detects detects [irrefutable - /// patterns] in [if-let] and [while-let] statements. - /// - /// + /// The `irrefutable_let_patterns` lint detects [irrefutable patterns] + /// in [`if let`]s, [`while let`]s, and `if let` guards. /// /// ### Example /// - /// ```rust + /// ``` /// if let _ = 123 { /// println!("always runs!"); /// } @@ -1833,7 +1830,7 @@ declare_lint! { /// ### Explanation /// /// There usually isn't a reason to have an irrefutable pattern in an - /// if-let or while-let statement, because the pattern will always match + /// `if let` or `while let` statement, because the pattern will always match /// successfully. A [`let`] or [`loop`] statement will suffice. However, /// when generating code with a macro, forbidding irrefutable patterns /// would require awkward workarounds in situations where the macro @@ -1844,14 +1841,14 @@ declare_lint! { /// See [RFC 2086] for more details. /// /// [irrefutable patterns]: https://doc.rust-lang.org/reference/patterns.html#refutability - /// [if-let]: https://doc.rust-lang.org/reference/expressions/if-expr.html#if-let-expressions - /// [while-let]: https://doc.rust-lang.org/reference/expressions/loop-expr.html#predicate-pattern-loops + /// [`if let`]: https://doc.rust-lang.org/reference/expressions/if-expr.html#if-let-expressions + /// [`while let`]: https://doc.rust-lang.org/reference/expressions/loop-expr.html#predicate-pattern-loops /// [`let`]: https://doc.rust-lang.org/reference/statements.html#let-statements /// [`loop`]: https://doc.rust-lang.org/reference/expressions/loop-expr.html#infinite-loops /// [RFC 2086]: https://github.com/rust-lang/rfcs/blob/master/text/2086-allow-if-let-irrefutables.md pub IRREFUTABLE_LET_PATTERNS, Warn, - "detects irrefutable patterns in if-let and while-let statements" + "detects irrefutable patterns in `if let` and `while let` statements" } declare_lint! { @@ -1877,93 +1874,6 @@ declare_lint! { "detects labels that are never used" } -declare_lint! { - /// The `broken_intra_doc_links` lint detects failures in resolving - /// intra-doc link targets. This is a `rustdoc` only lint, see the - /// documentation in the [rustdoc book]. - /// - /// [rustdoc book]: ../../../rustdoc/lints.html#broken_intra_doc_links - pub BROKEN_INTRA_DOC_LINKS, - Warn, - "failures in resolving intra-doc link targets" -} - -declare_lint! { - /// This is a subset of `broken_intra_doc_links` that warns when linking from - /// a public item to a private one. This is a `rustdoc` only lint, see the - /// documentation in the [rustdoc book]. - /// - /// [rustdoc book]: ../../../rustdoc/lints.html#private_intra_doc_links - pub PRIVATE_INTRA_DOC_LINKS, - Warn, - "linking from a public item to a private one" -} - -declare_lint! { - /// The `invalid_codeblock_attributes` lint detects code block attributes - /// in documentation examples that have potentially mis-typed values. This - /// is a `rustdoc` only lint, see the documentation in the [rustdoc book]. - /// - /// [rustdoc book]: ../../../rustdoc/lints.html#invalid_codeblock_attributes - pub INVALID_CODEBLOCK_ATTRIBUTES, - Warn, - "codeblock attribute looks a lot like a known one" -} - -declare_lint! { - /// The `missing_crate_level_docs` lint detects if documentation is - /// missing at the crate root. This is a `rustdoc` only lint, see the - /// documentation in the [rustdoc book]. - /// - /// [rustdoc book]: ../../../rustdoc/lints.html#missing_crate_level_docs - pub MISSING_CRATE_LEVEL_DOCS, - Allow, - "detects crates with no crate-level documentation" -} - -declare_lint! { - /// The `missing_doc_code_examples` lint detects publicly-exported items - /// without code samples in their documentation. This is a `rustdoc` only - /// lint, see the documentation in the [rustdoc book]. - /// - /// [rustdoc book]: ../../../rustdoc/lints.html#missing_doc_code_examples - pub MISSING_DOC_CODE_EXAMPLES, - Allow, - "detects publicly-exported items without code samples in their documentation" -} - -declare_lint! { - /// The `private_doc_tests` lint detects code samples in docs of private - /// items not documented by `rustdoc`. This is a `rustdoc` only lint, see - /// the documentation in the [rustdoc book]. - /// - /// [rustdoc book]: ../../../rustdoc/lints.html#private_doc_tests - pub PRIVATE_DOC_TESTS, - Allow, - "detects code samples in docs of private items not documented by rustdoc" -} - -declare_lint! { - /// The `invalid_html_tags` lint detects invalid HTML tags. This is a - /// `rustdoc` only lint, see the documentation in the [rustdoc book]. - /// - /// [rustdoc book]: ../../../rustdoc/lints.html#invalid_html_tags - pub INVALID_HTML_TAGS, - Allow, - "detects invalid HTML tags in doc comments" -} - -declare_lint! { - /// The `non_autolinks` lint detects when a URL could be written using - /// only angle brackets. This is a `rustdoc` only lint, see the - /// documentation in the [rustdoc book]. - /// - /// [rustdoc book]: ../../../rustdoc/lints.html#non_autolinks - pub NON_AUTOLINKS, - Warn, - "detects URLs that could be written using only angle brackets" -} - declare_lint! { /// The `where_clauses_object_safety` lint detects for [object safety] of /// [where clauses]. @@ -2578,16 +2488,11 @@ declare_lint! { declare_lint! { /// The `unsafe_op_in_unsafe_fn` lint detects unsafe operations in unsafe - /// functions without an explicit unsafe block. This lint only works on - /// the [**nightly channel**] with the - /// `#![feature(unsafe_block_in_unsafe_fn)]` feature. - /// - /// [**nightly channel**]: https://doc.rust-lang.org/book/appendix-07-nightly-rust.html + /// functions without an explicit unsafe block. /// /// ### Example /// /// ```rust,compile_fail - /// #![feature(unsafe_block_in_unsafe_fn)] /// #![deny(unsafe_op_in_unsafe_fn)] /// /// unsafe fn foo() {} @@ -2625,7 +2530,6 @@ declare_lint! { pub UNSAFE_OP_IN_UNSAFE_FN, Allow, "unsafe operations in unsafe functions without an explicit unsafe block are deprecated", - @feature_gate = sym::unsafe_block_in_unsafe_fn; } declare_lint! { @@ -2922,6 +2826,52 @@ declare_lint! { }; } +declare_lint! { + /// The `legacy_derive_helpers` lint detects derive helper attributes + /// that are used before they are introduced. + /// + /// ### Example + /// + /// ```rust,ignore (needs extern crate) + /// #[serde(rename_all = "camelCase")] + /// #[derive(Deserialize)] + /// struct S { /* fields */ } + /// ``` + /// + /// produces: + /// + /// ```text + /// warning: derive helper attribute is used before it is introduced + /// --> $DIR/legacy-derive-helpers.rs:1:3 + /// | + /// 1 | #[serde(rename_all = "camelCase")] + /// | ^^^^^ + /// ... + /// 2 | #[derive(Deserialize)] + /// | ----------- the attribute is introduced here + /// ``` + /// + /// ### Explanation + /// + /// Attributes like this work for historical reasons, but attribute expansion works in + /// left-to-right order in general, so, to resolve `#[serde]`, compiler has to try to "look + /// into the future" at not yet expanded part of the item , but such attempts are not always + /// reliable. + /// + /// To fix the warning place the helper attribute after its corresponding derive. + /// ```rust,ignore (needs extern crate) + /// #[derive(Deserialize)] + /// #[serde(rename_all = "camelCase")] + /// struct S { /* fields */ } + /// ``` + pub LEGACY_DERIVE_HELPERS, + Warn, + "detects derive helper attributes that are used before they are introduced", + @future_incompatible = FutureIncompatibleInfo { + reference: "issue #79202 ", + }; +} + declare_lint_pass! { /// Does nothing as a lint pass, but registers some `Lint`s /// that are used by other parts of the compiler. @@ -2976,14 +2926,6 @@ declare_lint_pass! { ABSOLUTE_PATHS_NOT_STARTING_WITH_CRATE, UNSTABLE_NAME_COLLISIONS, IRREFUTABLE_LET_PATTERNS, - BROKEN_INTRA_DOC_LINKS, - PRIVATE_INTRA_DOC_LINKS, - INVALID_CODEBLOCK_ATTRIBUTES, - MISSING_CRATE_LEVEL_DOCS, - MISSING_DOC_CODE_EXAMPLES, - INVALID_HTML_TAGS, - PRIVATE_DOC_TESTS, - NON_AUTOLINKS, WHERE_CLAUSES_OBJECT_SAFETY, PROC_MACRO_DERIVE_RESOLUTION_FALLBACK, MACRO_USE_EXTERN_CRATE, @@ -3012,6 +2954,8 @@ declare_lint_pass! { MISSING_ABI, SEMICOLON_IN_EXPRESSIONS_FROM_MACROS, DISJOINT_CAPTURE_DROP_REORDER, + LEGACY_DERIVE_HELPERS, + PROC_MACRO_BACK_COMPAT, ] } @@ -3109,3 +3053,83 @@ declare_lint! { Allow, "No declared ABI for extern declaration" } + +declare_lint! { + /// The `invalid_doc_attributes` lint detects when the `#[doc(...)]` is + /// misused. + /// + /// ### Example + /// + /// ```rust,compile_fail + /// #![deny(warnings)] + /// + /// pub mod submodule { + /// #![doc(test(no_crate_inject))] + /// } + /// ``` + /// + /// {{produces}} + /// + /// ### Explanation + /// + /// Previously, there were very like checks being performed on `#[doc(..)]` + /// unlike the other attributes. It'll now catch all the issues that it + /// silently ignored previously. + pub INVALID_DOC_ATTRIBUTES, + Warn, + "detects invalid `#[doc(...)]` attributes", + @future_incompatible = FutureIncompatibleInfo { + reference: "issue #82730 ", + edition: None, + }; +} + +declare_lint! { + /// The `proc_macro_back_compat` lint detects uses of old versions of certain + /// proc-macro crates, which have hardcoded workarounds in the compiler. + /// + /// ### Example + /// + /// ```rust,ignore (needs-dependency) + /// + /// use time_macros_impl::impl_macros; + /// struct Foo; + /// impl_macros!(Foo); + /// ``` + /// + /// This will produce: + /// + /// ```text + /// warning: using an old version of `time-macros-impl` + /// ::: $DIR/group-compat-hack.rs:27:5 + /// | + /// LL | impl_macros!(Foo); + /// | ------------------ in this macro invocation + /// | + /// = note: `#[warn(proc_macro_back_compat)]` 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 #83125 + /// = note: the `time-macros-impl` crate will stop compiling in futures version of Rust. Please update to the latest version of the `time` crate to avoid breakage + /// = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + /// ``` + /// + /// ### Explanation + /// + /// Eventually, the backwards-compatibility hacks present in the compiler will be removed, + /// causing older versions of certain crates to stop compiling. + /// This is a [future-incompatible] lint to ease the transition to an error. + /// See [issue #83125] for more details. + /// + /// [issue #83125]: https://github.com/rust-lang/rust/issues/83125 + /// [future-incompatible]: ../index.md#future-incompatible-lints + pub PROC_MACRO_BACK_COMPAT, + Warn, + "detects usage of old versions of certain proc-macro crates", + @future_incompatible = FutureIncompatibleInfo { + reference: "issue #83125 ", + edition: None, + future_breakage: Some(FutureBreakage { + date: None + }) + }; +} diff --git a/compiler/rustc_lint_defs/src/lib.rs b/compiler/rustc_lint_defs/src/lib.rs index 9d60a51a0a..400b367095 100644 --- a/compiler/rustc_lint_defs/src/lib.rs +++ b/compiler/rustc_lint_defs/src/lib.rs @@ -4,6 +4,7 @@ extern crate rustc_macros; pub use self::Level::*; use rustc_ast::node_id::{NodeId, NodeMap}; use rustc_data_structures::stable_hasher::{HashStable, StableHasher, ToStableHashKey}; +use rustc_serialize::json::Json; use rustc_span::edition::Edition; use rustc_span::{sym, symbol::Ident, MultiSpan, Span, Symbol}; use rustc_target::spec::abi::Abi; @@ -239,6 +240,13 @@ impl ToStableHashKey for LintId { } } +// Duplicated from rustc_session::config::ExternDepSpec to avoid cyclic dependency +#[derive(PartialEq)] +pub enum ExternDepSpec { + Json(Json), + Raw(String), +} + // This could be a closure, but then implementing derive trait // becomes hacky (and it gets allocated). #[derive(PartialEq)] @@ -256,6 +264,9 @@ pub enum BuiltinLintDiagnostics { MissingAbi(Span, Abi), UnusedDocComment(Span), PatternsInFnsWithoutBody(Span, Ident), + LegacyDeriveHelpers(Span), + ExternDepSpec(String, ExternDepSpec), + ProcMacroBackCompat(String), } /// Lints that are buffered up early on in the `Session` before the diff --git a/compiler/rustc_llvm/llvm-wrapper/CoverageMappingWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/CoverageMappingWrapper.cpp index 25badc3f4e..e97d96e3a4 100644 --- a/compiler/rustc_llvm/llvm-wrapper/CoverageMappingWrapper.cpp +++ b/compiler/rustc_llvm/llvm-wrapper/CoverageMappingWrapper.cpp @@ -8,6 +8,17 @@ using namespace llvm; +struct LLVMRustCounterMappingRegion { + coverage::Counter Count; + uint32_t FileID; + uint32_t ExpandedFileID; + uint32_t LineStart; + uint32_t ColumnStart; + uint32_t LineEnd; + uint32_t ColumnEnd; + coverage::CounterMappingRegion::RegionKind Kind; +}; + extern "C" void LLVMRustCoverageWriteFilenamesSectionToBuffer( const char* const Filenames[], size_t FilenamesLen, @@ -27,13 +38,22 @@ extern "C" void LLVMRustCoverageWriteMappingToBuffer( unsigned NumVirtualFileMappingIDs, const coverage::CounterExpression *Expressions, unsigned NumExpressions, - coverage::CounterMappingRegion *MappingRegions, + LLVMRustCounterMappingRegion *RustMappingRegions, unsigned NumMappingRegions, RustStringRef BufferOut) { + // Convert from FFI representation to LLVM representation. + SmallVector MappingRegions; + MappingRegions.reserve(NumMappingRegions); + for (const auto &Region : makeArrayRef(RustMappingRegions, NumMappingRegions)) { + MappingRegions.emplace_back( + Region.Count, Region.FileID, Region.ExpandedFileID, + Region.LineStart, Region.ColumnStart, Region.LineEnd, Region.ColumnEnd, + Region.Kind); + } auto CoverageMappingWriter = coverage::CoverageMappingWriter( makeArrayRef(VirtualFileMappingIDs, NumVirtualFileMappingIDs), makeArrayRef(Expressions, NumExpressions), - makeMutableArrayRef(MappingRegions, NumMappingRegions)); + MappingRegions); RawRustStringOstream OS(BufferOut); CoverageMappingWriter.write(OS); } diff --git a/compiler/rustc_llvm/llvm-wrapper/LLVMWrapper.h b/compiler/rustc_llvm/llvm-wrapper/LLVMWrapper.h index 57b8664d3b..f67e06706e 100644 --- a/compiler/rustc_llvm/llvm-wrapper/LLVMWrapper.h +++ b/compiler/rustc_llvm/llvm-wrapper/LLVMWrapper.h @@ -85,6 +85,8 @@ enum LLVMRustAttribute { ReturnsTwice = 25, ReadNone = 26, InaccessibleMemOnly = 27, + SanitizeHWAddress = 28, + WillReturn = 29, }; typedef struct OpaqueRustString *RustStringRef; diff --git a/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp index 2264908995..51c80cf7df 100644 --- a/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp +++ b/compiler/rustc_llvm/llvm-wrapper/PassWrapper.cpp @@ -5,6 +5,7 @@ #include "LLVMWrapper.h" +#include "llvm/Analysis/AliasAnalysis.h" #include "llvm/Analysis/TargetLibraryInfo.h" #include "llvm/Analysis/TargetTransformInfo.h" #include "llvm/CodeGen/TargetSubtargetInfo.h" @@ -33,6 +34,7 @@ #include "llvm/Support/TimeProfiler.h" #include "llvm/Transforms/Instrumentation/ThreadSanitizer.h" #include "llvm/Transforms/Instrumentation/MemorySanitizer.h" +#include "llvm/Transforms/Instrumentation/HWAddressSanitizer.h" #include "llvm/Transforms/Utils/CanonicalizeAliases.h" #include "llvm/Transforms/Utils/NameAnonGlobals.h" @@ -133,6 +135,12 @@ extern "C" LLVMPassRef LLVMRustCreateThreadSanitizerPass() { return wrap(createThreadSanitizerLegacyPassPass()); } +extern "C" LLVMPassRef LLVMRustCreateHWAddressSanitizerPass(bool Recover) { + const bool CompileKernel = false; + + return wrap(createHWAddressSanitizerLegacyPassPass(CompileKernel, Recover)); +} + extern "C" LLVMRustPassKind LLVMRustPassKind(LLVMPassRef RustPass) { assert(RustPass); Pass *Pass = unwrap(RustPass); @@ -676,6 +684,25 @@ void LLVMSelfProfileInitializeCallbacks( PassInstrumentationCallbacks& PIC, void* LlvmSelfProfiler, LLVMRustSelfProfileBeforePassCallback BeforePassCallback, LLVMRustSelfProfileAfterPassCallback AfterPassCallback) { +#if LLVM_VERSION_GE(12, 0) + PIC.registerBeforeNonSkippedPassCallback([LlvmSelfProfiler, BeforePassCallback]( + StringRef Pass, llvm::Any Ir) { + std::string PassName = Pass.str(); + std::string IrName = LLVMRustwrappedIrGetName(Ir); + BeforePassCallback(LlvmSelfProfiler, PassName.c_str(), IrName.c_str()); + }); + + PIC.registerAfterPassCallback( + [LlvmSelfProfiler, AfterPassCallback](StringRef Pass, llvm::Any IR, + const PreservedAnalyses &Preserved) { + AfterPassCallback(LlvmSelfProfiler); + }); + + PIC.registerAfterPassInvalidatedCallback( + [LlvmSelfProfiler, AfterPassCallback](StringRef Pass, const PreservedAnalyses &Preserved) { + AfterPassCallback(LlvmSelfProfiler); + }); +#else PIC.registerBeforePassCallback([LlvmSelfProfiler, BeforePassCallback]( StringRef Pass, llvm::Any Ir) { std::string PassName = Pass.str(); @@ -693,6 +720,7 @@ void LLVMSelfProfileInitializeCallbacks( [LlvmSelfProfiler, AfterPassCallback](StringRef Pass) { AfterPassCallback(LlvmSelfProfiler); }); +#endif PIC.registerBeforeAnalysisCallback([LlvmSelfProfiler, BeforePassCallback]( StringRef Pass, llvm::Any Ir) { @@ -722,6 +750,8 @@ struct LLVMRustSanitizerOptions { bool SanitizeMemoryRecover; int SanitizeMemoryTrackOrigins; bool SanitizeThread; + bool SanitizeHWAddress; + bool SanitizeHWAddressRecover; }; extern "C" void @@ -742,17 +772,28 @@ LLVMRustOptimizeWithNewPassManager( TargetMachine *TM = unwrap(TMRef); PassBuilder::OptimizationLevel OptLevel = fromRust(OptLevelRust); - // FIXME: MergeFunctions is not supported by NewPM yet. - (void) MergeFunctions; PipelineTuningOptions PTO; PTO.LoopUnrolling = UnrollLoops; PTO.LoopInterleaving = UnrollLoops; PTO.LoopVectorization = LoopVectorize; PTO.SLPVectorization = SLPVectorize; +#if LLVM_VERSION_GE(12, 0) + PTO.MergeFunctions = MergeFunctions; +#else + // MergeFunctions is not supported by NewPM in older LLVM versions. + (void) MergeFunctions; +#endif + + // FIXME: We may want to expose this as an option. + bool DebugPassManager = false; PassInstrumentationCallbacks PIC; +#if LLVM_VERSION_GE(12, 0) + StandardInstrumentations SI(DebugPassManager); +#else StandardInstrumentations SI; +#endif SI.registerCallbacks(PIC); if (LlvmSelfProfiler){ @@ -768,10 +809,12 @@ LLVMRustOptimizeWithNewPassManager( PGOOpt = PGOOptions(PGOUsePath, "", "", PGOOptions::IRUse); } +#if LLVM_VERSION_GE(12, 0) + PassBuilder PB(DebugPassManager, TM, PTO, PGOOpt, &PIC); +#else PassBuilder PB(TM, PTO, PGOOpt, &PIC); +#endif - // FIXME: We may want to expose this as an option. - bool DebugPassManager = false; LoopAnalysisManager LAM(DebugPassManager); FunctionAnalysisManager FAM(DebugPassManager); CGSCCAnalysisManager CGAM(DebugPassManager); @@ -793,7 +836,8 @@ LLVMRustOptimizeWithNewPassManager( // We manually collect pipeline callbacks so we can apply them at O0, where the // PassBuilder does not create a pipeline. - std::vector> PipelineStartEPCallbacks; + std::vector> + PipelineStartEPCallbacks; #if LLVM_VERSION_GE(11, 0) std::vector> OptimizerLastEPCallbacks; @@ -803,9 +847,11 @@ LLVMRustOptimizeWithNewPassManager( #endif if (VerifyIR) { - PipelineStartEPCallbacks.push_back([VerifyIR](ModulePassManager &MPM) { + PipelineStartEPCallbacks.push_back( + [VerifyIR](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) { MPM.addPass(VerifierPass()); - }); + } + ); } if (SanitizerOptions) { @@ -823,9 +869,11 @@ LLVMRustOptimizeWithNewPassManager( ); #else #if LLVM_VERSION_GE(10, 0) - PipelineStartEPCallbacks.push_back([Options](ModulePassManager &MPM) { - MPM.addPass(MemorySanitizerPass(Options)); - }); + PipelineStartEPCallbacks.push_back( + [Options](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) { + MPM.addPass(MemorySanitizerPass(Options)); + } + ); #endif OptimizerLastEPCallbacks.push_back( [Options](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) { @@ -845,9 +893,11 @@ LLVMRustOptimizeWithNewPassManager( ); #else #if LLVM_VERSION_GE(10, 0) - PipelineStartEPCallbacks.push_back([](ModulePassManager &MPM) { - MPM.addPass(ThreadSanitizerPass()); - }); + PipelineStartEPCallbacks.push_back( + [](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) { + MPM.addPass(ThreadSanitizerPass()); + } + ); #endif OptimizerLastEPCallbacks.push_back( [](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) { @@ -870,9 +920,11 @@ LLVMRustOptimizeWithNewPassManager( } ); #else - PipelineStartEPCallbacks.push_back([&](ModulePassManager &MPM) { - MPM.addPass(RequireAnalysisPass()); - }); + PipelineStartEPCallbacks.push_back( + [&](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) { + MPM.addPass(RequireAnalysisPass()); + } + ); OptimizerLastEPCallbacks.push_back( [SanitizerOptions](FunctionPassManager &FPM, PassBuilder::OptimizationLevel Level) { FPM.addPass(AddressSanitizerPass( @@ -881,45 +933,80 @@ LLVMRustOptimizeWithNewPassManager( } ); PipelineStartEPCallbacks.push_back( - [SanitizerOptions](ModulePassManager &MPM) { + [SanitizerOptions](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) { MPM.addPass(ModuleAddressSanitizerPass( /*CompileKernel=*/false, SanitizerOptions->SanitizeAddressRecover)); } ); +#endif + } + if (SanitizerOptions->SanitizeHWAddress) { +#if LLVM_VERSION_GE(11, 0) + OptimizerLastEPCallbacks.push_back( + [SanitizerOptions](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) { + MPM.addPass(HWAddressSanitizerPass( + /*CompileKernel=*/false, SanitizerOptions->SanitizeHWAddressRecover)); + } + ); +#else + PipelineStartEPCallbacks.push_back( + [SanitizerOptions](ModulePassManager &MPM, PassBuilder::OptimizationLevel Level) { + MPM.addPass(HWAddressSanitizerPass( + /*CompileKernel=*/false, SanitizerOptions->SanitizeHWAddressRecover)); + } + ); #endif } } ModulePassManager MPM(DebugPassManager); + bool NeedThinLTOBufferPasses = UseThinLTOBuffers; if (!NoPrepopulatePasses) { if (OptLevel == PassBuilder::OptimizationLevel::O0) { +#if LLVM_VERSION_GE(12, 0) for (const auto &C : PipelineStartEPCallbacks) - C(MPM); + PB.registerPipelineStartEPCallback(C); + for (const auto &C : OptimizerLastEPCallbacks) + PB.registerOptimizerLastEPCallback(C); -#if LLVM_VERSION_GE(11, 0) + // Pass false as we manually schedule ThinLTOBufferPasses below. + MPM = PB.buildO0DefaultPipeline(OptLevel, /* PreLinkLTO */ false); +#else + for (const auto &C : PipelineStartEPCallbacks) + C(MPM, OptLevel); + +# if LLVM_VERSION_GE(11, 0) for (const auto &C : OptimizerLastEPCallbacks) C(MPM, OptLevel); -#else +# else if (!OptimizerLastEPCallbacks.empty()) { FunctionPassManager FPM(DebugPassManager); for (const auto &C : OptimizerLastEPCallbacks) C(FPM, OptLevel); MPM.addPass(createModuleToFunctionPassAdaptor(std::move(FPM))); } -#endif +# endif MPM.addPass(AlwaysInlinerPass(EmitLifetimeMarkers)); -#if LLVM_VERSION_GE(10, 0) +# if LLVM_VERSION_GE(10, 0) if (PGOOpt) { PB.addPGOInstrPassesForO0( MPM, DebugPassManager, PGOOpt->Action == PGOOptions::IRInstr, /*IsCS=*/false, PGOOpt->ProfileFile, PGOOpt->ProfileRemappingFile); } +# endif #endif } else { +#if LLVM_VERSION_GE(12, 0) for (const auto &C : PipelineStartEPCallbacks) PB.registerPipelineStartEPCallback(C); +#else + for (const auto &C : PipelineStartEPCallbacks) + PB.registerPipelineStartEPCallback([C, OptLevel](ModulePassManager &MPM) { + C(MPM, OptLevel); + }); +#endif if (OptStage != LLVMRustOptStage::PreLinkThinLTO) { for (const auto &C : OptimizerLastEPCallbacks) PB.registerOptimizerLastEPCallback(C); @@ -930,7 +1017,17 @@ LLVMRustOptimizeWithNewPassManager( MPM = PB.buildPerModuleDefaultPipeline(OptLevel, DebugPassManager); break; case LLVMRustOptStage::PreLinkThinLTO: +#if LLVM_VERSION_GE(12, 0) + MPM = PB.buildThinLTOPreLinkDefaultPipeline(OptLevel); + // The ThinLTOPreLink pipeline already includes ThinLTOBuffer passes. However, callback + // passes may still run afterwards. This means we need to run the buffer passes again. + // FIXME: In LLVM 13, the ThinLTOPreLink pipeline also runs OptimizerLastEPCallbacks + // before the RequiredLTOPreLinkPasses, in which case we can remove these hacks. + if (OptimizerLastEPCallbacks.empty()) + NeedThinLTOBufferPasses = false; +#else MPM = PB.buildThinLTOPreLinkDefaultPipeline(OptLevel, DebugPassManager); +#endif #if LLVM_VERSION_GE(11, 0) for (const auto &C : OptimizerLastEPCallbacks) C(MPM, OptLevel); @@ -944,21 +1041,34 @@ LLVMRustOptimizeWithNewPassManager( #endif break; case LLVMRustOptStage::PreLinkFatLTO: +#if LLVM_VERSION_GE(12, 0) + MPM = PB.buildLTOPreLinkDefaultPipeline(OptLevel); + NeedThinLTOBufferPasses = false; +#else MPM = PB.buildLTOPreLinkDefaultPipeline(OptLevel, DebugPassManager); +#endif break; case LLVMRustOptStage::ThinLTO: // FIXME: Does it make sense to pass the ModuleSummaryIndex? // It only seems to be needed for C++ specific optimizations. +#if LLVM_VERSION_GE(12, 0) + MPM = PB.buildThinLTODefaultPipeline(OptLevel, nullptr); +#else MPM = PB.buildThinLTODefaultPipeline(OptLevel, DebugPassManager, nullptr); +#endif break; case LLVMRustOptStage::FatLTO: +#if LLVM_VERSION_GE(12, 0) + MPM = PB.buildLTODefaultPipeline(OptLevel, nullptr); +#else MPM = PB.buildLTODefaultPipeline(OptLevel, DebugPassManager, nullptr); +#endif break; } } } - if (UseThinLTOBuffers) { + if (NeedThinLTOBufferPasses) { MPM.addPass(CanonicalizeAliasesPass()); MPM.addPass(NameAnonGlobalPass()); } @@ -1154,6 +1264,14 @@ extern "C" void LLVMRustSetModulePIELevel(LLVMModuleRef M) { unwrap(M)->setPIELevel(PIELevel::Level::Large); } +extern "C" void LLVMRustSetModuleCodeModel(LLVMModuleRef M, + LLVMRustCodeModel Model) { + auto CM = fromRust(Model); + if (!CM.hasValue()) + return; + unwrap(M)->setCodeModel(*CM); +} + // Here you'll find an implementation of ThinLTO as used by the Rust compiler // right now. This ThinLTO support is only enabled on "recent ish" versions of // LLVM, and otherwise it's just blanket rejected from other compilers. diff --git a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp index 4118e93074..a853659540 100644 --- a/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp +++ b/compiler/rustc_llvm/llvm-wrapper/RustWrapper.cpp @@ -205,6 +205,10 @@ static Attribute::AttrKind fromRust(LLVMRustAttribute Kind) { return Attribute::ReadNone; case InaccessibleMemOnly: return Attribute::InaccessibleMemOnly; + case SanitizeHWAddress: + return Attribute::SanitizeHWAddress; + case WillReturn: + return Attribute::WillReturn; } report_fatal_error("bad AttributeKind"); } @@ -261,6 +265,17 @@ extern "C" void LLVMRustAddByValCallSiteAttr(LLVMValueRef Instr, unsigned Index, Call->addAttribute(Index, Attr); } +extern "C" void LLVMRustAddStructRetCallSiteAttr(LLVMValueRef Instr, unsigned Index, + LLVMTypeRef Ty) { + CallBase *Call = unwrap(Instr); +#if LLVM_VERSION_GE(12, 0) + Attribute Attr = Attribute::getWithStructRetType(Call->getContext(), unwrap(Ty)); +#else + Attribute Attr = Attribute::get(Call->getContext(), Attribute::StructRet); +#endif + Call->addAttribute(Index, Attr); +} + extern "C" void LLVMRustAddFunctionAttribute(LLVMValueRef Fn, unsigned Index, LLVMRustAttribute RustAttr) { Function *A = unwrap(Fn); @@ -302,6 +317,17 @@ extern "C" void LLVMRustAddByValAttr(LLVMValueRef Fn, unsigned Index, F->addAttribute(Index, Attr); } +extern "C" void LLVMRustAddStructRetAttr(LLVMValueRef Fn, unsigned Index, + LLVMTypeRef Ty) { + Function *F = unwrap(Fn); +#if LLVM_VERSION_GE(12, 0) + Attribute Attr = Attribute::getWithStructRetType(F->getContext(), unwrap(Ty)); +#else + Attribute Attr = Attribute::get(F->getContext(), Attribute::StructRet); +#endif + F->addAttribute(Index, Attr); +} + extern "C" void LLVMRustAddFunctionAttrStringValue(LLVMValueRef Fn, unsigned Index, const char *Name, @@ -1005,12 +1031,19 @@ LLVMRustDICompositeTypeReplaceArrays(LLVMRustDIBuilderRef Builder, extern "C" LLVMMetadataRef LLVMRustDIBuilderCreateDebugLocation(unsigned Line, unsigned Column, - LLVMMetadataRef Scope, + LLVMMetadataRef ScopeRef, LLVMMetadataRef InlinedAt) { - DebugLoc debug_loc = DebugLoc::get(Line, Column, unwrapDIPtr(Scope), +#if LLVM_VERSION_GE(12, 0) + MDNode *Scope = unwrapDIPtr(ScopeRef); + DILocation *Loc = DILocation::get( + Scope->getContext(), Line, Column, Scope, + unwrapDIPtr(InlinedAt)); + return wrap(Loc); +#else + DebugLoc debug_loc = DebugLoc::get(Line, Column, unwrapDIPtr(ScopeRef), unwrapDIPtr(InlinedAt)); - return wrap(debug_loc.getAsMDNode()); +#endif } extern "C" int64_t LLVMRustDIBuilderCreateOpDeref() { @@ -1260,6 +1293,10 @@ extern "C" LLVMTypeKind LLVMRustGetTypeKind(LLVMTypeRef Ty) { return LLVMScalableVectorTypeKind; case Type::BFloatTyID: return LLVMBFloatTypeKind; +#endif +#if LLVM_VERSION_GE(12, 0) + case Type::X86_AMXTyID: + return LLVMX86_AMXTypeKind; #endif } report_fatal_error("Unhandled TypeID."); @@ -1706,11 +1743,23 @@ LLVMRustBuildVectorReduceMax(LLVMBuilderRef B, LLVMValueRef Src, bool IsSigned) } extern "C" LLVMValueRef LLVMRustBuildVectorReduceFMin(LLVMBuilderRef B, LLVMValueRef Src, bool NoNaN) { - return wrap(unwrap(B)->CreateFPMinReduce(unwrap(Src), NoNaN)); +#if LLVM_VERSION_GE(12, 0) + Instruction *I = unwrap(B)->CreateFPMinReduce(unwrap(Src)); + I->setHasNoNaNs(NoNaN); + return wrap(I); +#else + return wrap(unwrap(B)->CreateFPMinReduce(unwrap(Src), NoNaN)); +#endif } extern "C" LLVMValueRef LLVMRustBuildVectorReduceFMax(LLVMBuilderRef B, LLVMValueRef Src, bool NoNaN) { +#if LLVM_VERSION_GE(12, 0) + Instruction *I = unwrap(B)->CreateFPMaxReduce(unwrap(Src)); + I->setHasNoNaNs(NoNaN); + return wrap(I); +#else return wrap(unwrap(B)->CreateFPMaxReduce(unwrap(Src), NoNaN)); +#endif } extern "C" LLVMValueRef diff --git a/compiler/rustc_macros/src/hash_stable.rs b/compiler/rustc_macros/src/hash_stable.rs index c955c13778..30569f2079 100644 --- a/compiler/rustc_macros/src/hash_stable.rs +++ b/compiler/rustc_macros/src/hash_stable.rs @@ -74,6 +74,7 @@ pub fn hash_stable_generic_derive(mut s: synstructure::Structure<'_>) -> proc_ma s.bound_impl( quote!(::rustc_data_structures::stable_hasher::HashStable<__CTX>), quote! { + #[inline] fn hash_stable( &self, __hcx: &mut __CTX, @@ -119,6 +120,7 @@ pub fn hash_stable_derive(mut s: synstructure::Structure<'_>) -> proc_macro2::To > ), quote! { + #[inline] fn hash_stable( &self, __hcx: &mut ::rustc_middle::ich::StableHashingContext<'__ctx>, diff --git a/compiler/rustc_macros/src/query.rs b/compiler/rustc_macros/src/query.rs index cff8e98331..291e7ef045 100644 --- a/compiler/rustc_macros/src/query.rs +++ b/compiler/rustc_macros/src/query.rs @@ -97,7 +97,7 @@ impl Parse for QueryModifier { Ok(QueryModifier::Cache(args, block)) } else if modifier == "load_cached" { // Parse a load_cached modifier like: - // `load_cached(tcx, id) { tcx.queries.on_disk_cache.try_load_query_result(tcx, id) }` + // `load_cached(tcx, id) { tcx.on_disk_cache.try_load_query_result(tcx, id) }` let args; parenthesized!(args in input); let tcx = args.parse()?; @@ -344,7 +344,6 @@ fn add_query_description_impl( impls: &mut proc_macro2::TokenStream, ) { let name = &query.name; - let arg = &query.arg; let key = &query.key.0; // Find out if we should cache the query on disk @@ -354,7 +353,7 @@ fn add_query_description_impl( quote! { #[inline] fn try_load_from_disk( - #tcx: TyCtxt<'tcx>, + #tcx: QueryCtxt<'tcx>, #id: SerializedDepNodeIndex ) -> Option { #block @@ -365,10 +364,10 @@ fn add_query_description_impl( quote! { #[inline] fn try_load_from_disk( - tcx: TyCtxt<'tcx>, + tcx: QueryCtxt<'tcx>, id: SerializedDepNodeIndex ) -> Option { - tcx.queries.on_disk_cache.as_ref().and_then(|c| c.try_load_query_result(tcx, id)) + tcx.on_disk_cache.as_ref()?.try_load_query_result(*tcx, id) } } }; @@ -379,21 +378,21 @@ fn add_query_description_impl( let t = &(t.0).0; quote! { #t } }) - .unwrap_or(quote! { _ }); + .unwrap_or_else(|| quote! { _ }); let value = args .as_ref() .map(|t| { let t = &(t.1).0; quote! { #t } }) - .unwrap_or(quote! { _ }); + .unwrap_or_else(|| quote! { _ }); // expr is a `Block`, meaning that `{ #expr }` gets expanded // to `{ { stmts... } }`, which triggers the `unused_braces` lint. quote! { #[inline] #[allow(unused_variables, unused_braces)] fn cache_on_disk( - #tcx: TyCtxt<'tcx>, + #tcx: QueryCtxt<'tcx>, #key: &Self::Key, #value: Option<&Self::Value> ) -> bool { @@ -410,20 +409,18 @@ fn add_query_description_impl( }; let (tcx, desc) = modifiers.desc; - let tcx = tcx.as_ref().map_or(quote! { _ }, |t| quote! { #t }); + let tcx = tcx.as_ref().map_or_else(|| quote! { _ }, |t| quote! { #t }); let desc = quote! { #[allow(unused_variables)] - fn describe( - #tcx: TyCtxt<'tcx>, - #key: #arg, - ) -> Cow<'static, str> { + fn describe(tcx: QueryCtxt<'tcx>, key: Self::Key) -> String { + let (#tcx, #key) = (*tcx, key); ::rustc_middle::ty::print::with_no_trimmed_paths(|| format!(#desc).into()) } }; impls.extend(quote! { - impl<'tcx> QueryDescription> for queries::#name<'tcx> { + impl<'tcx> QueryDescription> for queries::#name<'tcx> { #desc #cache } @@ -498,6 +495,7 @@ pub fn rustc_queries(input: TokenStream) -> TokenStream { } TokenStream::from(quote! { + #[macro_export] macro_rules! rustc_query_append { ([$($macro:tt)*][$($other:tt)*]) => { $($macro)* { @@ -517,12 +515,15 @@ pub fn rustc_queries(input: TokenStream) -> TokenStream { ); } } + #[macro_export] macro_rules! rustc_cached_queries { ($($macro:tt)*) => { $($macro)*(#cached_queries); } } - - #query_description_stream + #[macro_export] + macro_rules! rustc_query_description { + () => { #query_description_stream } + } }) } diff --git a/compiler/rustc_macros/src/session_diagnostic.rs b/compiler/rustc_macros/src/session_diagnostic.rs index 5c061a9d3c..8a0fce209b 100644 --- a/compiler/rustc_macros/src/session_diagnostic.rs +++ b/compiler/rustc_macros/src/session_diagnostic.rs @@ -473,9 +473,9 @@ impl<'a> SessionDiagnosticDeriveBuilder<'a> { .map( |applicability_idx| quote!(#binding.#applicability_idx), ) - .unwrap_or(quote!( - rustc_errors::Applicability::Unspecified - )); + .unwrap_or_else(|| { + quote!(rustc_errors::Applicability::Unspecified) + }); return Ok((span, applicability)); } throw_span_err!( diff --git a/compiler/rustc_metadata/Cargo.toml b/compiler/rustc_metadata/Cargo.toml index f1975e7880..48effed927 100644 --- a/compiler/rustc_metadata/Cargo.toml +++ b/compiler/rustc_metadata/Cargo.toml @@ -11,8 +11,8 @@ doctest = false libc = "0.2" snap = "1" tracing = "0.1" -memmap = "0.7" -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +memmap2 = "0.2.1" +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } rustc_middle = { path = "../rustc_middle" } rustc_attr = { path = "../rustc_attr" } rustc_data_structures = { path = "../rustc_data_structures" } diff --git a/compiler/rustc_metadata/src/creader.rs b/compiler/rustc_metadata/src/creader.rs index e3fbd1a2b2..b5506acf73 100644 --- a/compiler/rustc_metadata/src/creader.rs +++ b/compiler/rustc_metadata/src/creader.rs @@ -6,18 +6,19 @@ use crate::rmeta::{CrateDep, CrateMetadata, CrateNumMap, CrateRoot, MetadataBlob use rustc_ast::expand::allocator::AllocatorKind; use rustc_ast::{self as ast, *}; -use rustc_data_structures::fx::FxHashSet; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::svh::Svh; use rustc_data_structures::sync::Lrc; use rustc_expand::base::SyntaxExtension; -use rustc_hir::def_id::{CrateNum, LocalDefId, LOCAL_CRATE}; +use rustc_hir::def_id::{CrateNum, LocalDefId, StableCrateId, LOCAL_CRATE}; use rustc_hir::definitions::Definitions; use rustc_index::vec::IndexVec; use rustc_middle::middle::cstore::{CrateDepKind, CrateSource, ExternCrate}; use rustc_middle::middle::cstore::{ExternCrateSource, MetadataLoaderDyn}; use rustc_middle::ty::TyCtxt; +use rustc_serialize::json::ToJson; use rustc_session::config::{self, CrateType, ExternLocation}; -use rustc_session::lint; +use rustc_session::lint::{self, BuiltinLintDiagnostics, ExternDepSpec}; use rustc_session::output::validate_crate_name; use rustc_session::search_paths::PathKind; use rustc_session::{CrateDisambiguator, Session}; @@ -27,6 +28,7 @@ use rustc_span::{Span, DUMMY_SP}; use rustc_target::spec::{PanicStrategy, TargetTriple}; use proc_macro::bridge::client::ProcMacro; +use std::collections::BTreeMap; use std::path::Path; use std::{cmp, env}; use tracing::{debug, info}; @@ -40,6 +42,10 @@ pub struct CStore { allocator_kind: Option, /// This crate has a `#[global_allocator]` item. has_global_allocator: bool, + + /// This map is used to verify we get no hash conflicts between + /// `StableCrateId` values. + stable_crate_ids: FxHashMap, } pub struct CrateLoader<'a> { @@ -192,6 +198,11 @@ impl<'a> CrateLoader<'a> { metadata_loader: &'a MetadataLoaderDyn, local_crate_name: &str, ) -> Self { + let local_crate_stable_id = + StableCrateId::new(local_crate_name, sess.local_crate_disambiguator()); + let mut stable_crate_ids = FxHashMap::default(); + stable_crate_ids.insert(local_crate_stable_id, LOCAL_CRATE); + CrateLoader { sess, metadata_loader, @@ -205,6 +216,7 @@ impl<'a> CrateLoader<'a> { injected_panic_runtime: None, allocator_kind: None, has_global_allocator: false, + stable_crate_ids, }, used_extern_options: Default::default(), } @@ -311,6 +323,20 @@ impl<'a> CrateLoader<'a> { res } + fn verify_no_stable_crate_id_hash_conflicts( + &mut self, + root: &CrateRoot<'_>, + cnum: CrateNum, + ) -> Result<(), CrateError> { + if let Some(existing) = self.cstore.stable_crate_ids.insert(root.stable_crate_id(), cnum) { + let crate_name0 = root.name(); + let crate_name1 = self.cstore.get_crate_data(existing).name(); + return Err(CrateError::StableCrateIdCollision(crate_name0, crate_name1)); + } + + Ok(()) + } + fn register_crate( &mut self, host_lib: Option, @@ -332,6 +358,8 @@ impl<'a> CrateLoader<'a> { // Claim this crate number and cache it let cnum = self.cstore.alloc_new_crate_num(); + self.verify_no_stable_crate_id_hash_conflicts(&crate_root, cnum)?; + info!( "register crate `{}` (cnum = {}. private_dep = {})", crate_root.name(), @@ -871,8 +899,25 @@ impl<'a> CrateLoader<'a> { // Don't worry about pathless `--extern foo` sysroot references continue; } - if !self.used_extern_options.contains(&Symbol::intern(name)) { - self.sess.parse_sess.buffer_lint( + if self.used_extern_options.contains(&Symbol::intern(name)) { + continue; + } + + // Got a real unused --extern + let diag = match self.sess.opts.extern_dep_specs.get(name) { + Some(loc) => BuiltinLintDiagnostics::ExternDepSpec(name.clone(), loc.into()), + None => { + // If we don't have a specific location, provide a json encoding of the `--extern` + // option. + let meta: BTreeMap = + std::iter::once(("name".to_string(), name.to_string())).collect(); + BuiltinLintDiagnostics::ExternDepSpec( + name.clone(), + ExternDepSpec::Json(meta.to_json()), + ) + } + }; + self.sess.parse_sess.buffer_lint_with_diagnostic( lint::builtin::UNUSED_CRATE_DEPENDENCIES, span, ast::CRATE_NODE_ID, @@ -881,8 +926,8 @@ impl<'a> CrateLoader<'a> { name, self.local_crate_name, name), + diag, ); - } } } diff --git a/compiler/rustc_metadata/src/foreign_modules.rs b/compiler/rustc_metadata/src/foreign_modules.rs index 4785b6c379..3d3071c18f 100644 --- a/compiler/rustc_metadata/src/foreign_modules.rs +++ b/compiler/rustc_metadata/src/foreign_modules.rs @@ -4,29 +4,24 @@ use rustc_middle::middle::cstore::ForeignModule; use rustc_middle::ty::TyCtxt; crate fn collect(tcx: TyCtxt<'_>) -> Vec { - let mut collector = Collector { tcx, modules: Vec::new() }; + let mut collector = Collector { modules: Vec::new() }; tcx.hir().krate().visit_all_item_likes(&mut collector); collector.modules } -struct Collector<'tcx> { - tcx: TyCtxt<'tcx>, +struct Collector { modules: Vec, } -impl ItemLikeVisitor<'tcx> for Collector<'tcx> { +impl ItemLikeVisitor<'tcx> for Collector { fn visit_item(&mut self, it: &'tcx hir::Item<'tcx>) { let items = match it.kind { hir::ItemKind::ForeignMod { items, .. } => items, _ => return, }; - let foreign_items = - items.iter().map(|it| self.tcx.hir().local_def_id(it.id.hir_id).to_def_id()).collect(); - self.modules.push(ForeignModule { - foreign_items, - def_id: self.tcx.hir().local_def_id(it.hir_id).to_def_id(), - }); + let foreign_items = items.iter().map(|it| it.id.def_id.to_def_id()).collect(); + self.modules.push(ForeignModule { foreign_items, def_id: it.def_id.to_def_id() }); } fn visit_trait_item(&mut self, _it: &'tcx hir::TraitItem<'tcx>) {} diff --git a/compiler/rustc_metadata/src/link_args.rs b/compiler/rustc_metadata/src/link_args.rs index d088288c50..9e1ac33368 100644 --- a/compiler/rustc_metadata/src/link_args.rs +++ b/compiler/rustc_metadata/src/link_args.rs @@ -8,7 +8,7 @@ crate fn collect(tcx: TyCtxt<'_>) -> Vec { let mut collector = Collector { tcx, args: Vec::new() }; tcx.hir().krate().visit_all_item_likes(&mut collector); - for attr in tcx.hir().krate().item.attrs.iter() { + for attr in tcx.hir().attrs(hir::CRATE_HIR_ID).iter() { if attr.has_name(sym::link_args) { if let Some(linkarg) = attr.value_str() { collector.add_link_args(linkarg); @@ -36,7 +36,9 @@ impl<'tcx> ItemLikeVisitor<'tcx> for Collector<'tcx> { // First, add all of the custom #[link_args] attributes let sess = &self.tcx.sess; - for m in it.attrs.iter().filter(|a| sess.check_name(a, sym::link_args)) { + for m in + self.tcx.hir().attrs(it.hir_id()).iter().filter(|a| sess.check_name(a, sym::link_args)) + { if let Some(linkarg) = m.value_str() { self.add_link_args(linkarg); } diff --git a/compiler/rustc_metadata/src/locator.rs b/compiler/rustc_metadata/src/locator.rs index b66c6cffb1..39a39917f5 100644 --- a/compiler/rustc_metadata/src/locator.rs +++ b/compiler/rustc_metadata/src/locator.rs @@ -728,7 +728,7 @@ impl<'a> CrateLocator<'a> { } /// A trivial wrapper for `Mmap` that implements `StableDeref`. -struct StableDerefMmap(memmap::Mmap); +struct StableDerefMmap(memmap2::Mmap); impl Deref for StableDerefMmap { type Target = [u8]; @@ -779,7 +779,7 @@ fn get_metadata_section( // 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 mmap = unsafe { memmap::Mmap::map(&file) }; + let mmap = unsafe { memmap2::Mmap::map(&file) }; let mmap = mmap .map_err(|_| format!("failed to mmap rmeta metadata: '{}'", filename.display()))?; @@ -888,6 +888,7 @@ crate enum CrateError { MultipleMatchingCrates(Symbol, FxHashMap), SymbolConflictsCurrent(Symbol), SymbolConflictsOthers(Symbol), + StableCrateIdCollision(Symbol, Symbol), DlOpen(String), DlSym(String), LocatorCombined(CombinedLocatorError), @@ -970,6 +971,13 @@ impl CrateError { `-C metadata`. This will result in symbol conflicts between the two.", root_name, ), + CrateError::StableCrateIdCollision(crate_name0, crate_name1) => { + let msg = format!( + "found crates (`{}` and `{}`) with colliding StableCrateId values.", + crate_name0, crate_name1 + ); + sess.struct_span_err(span, &msg) + } CrateError::DlOpen(s) | CrateError::DlSym(s) => sess.struct_span_err(span, &s), CrateError::LocatorCombined(locator) => { let crate_name = locator.crate_name; diff --git a/compiler/rustc_metadata/src/native_libs.rs b/compiler/rustc_metadata/src/native_libs.rs index 8d0994320e..523e016eeb 100644 --- a/compiler/rustc_metadata/src/native_libs.rs +++ b/compiler/rustc_metadata/src/native_libs.rs @@ -44,7 +44,8 @@ impl ItemLikeVisitor<'tcx> for Collector<'tcx> { // Process all of the #[link(..)]-style arguments let sess = &self.tcx.sess; - for m in it.attrs.iter().filter(|a| sess.check_name(a, sym::link)) { + for m in self.tcx.hir().attrs(it.hir_id()).iter().filter(|a| sess.check_name(a, sym::link)) + { let items = match m.meta_item_list() { Some(item) => item, None => continue, @@ -53,7 +54,7 @@ impl ItemLikeVisitor<'tcx> for Collector<'tcx> { name: None, kind: NativeLibKind::Unspecified, cfg: None, - foreign_module: Some(self.tcx.hir().local_def_id(it.hir_id).to_def_id()), + foreign_module: Some(it.def_id.to_def_id()), wasm_import_module: None, }; let mut kind_specified = false; diff --git a/compiler/rustc_metadata/src/rmeta/decoder.rs b/compiler/rustc_metadata/src/rmeta/decoder.rs index e3c3539079..e9b8388c1c 100644 --- a/compiler/rustc_metadata/src/rmeta/decoder.rs +++ b/compiler/rustc_metadata/src/rmeta/decoder.rs @@ -635,6 +635,10 @@ impl CrateRoot<'_> { self.hash } + crate fn stable_crate_id(&self) -> StableCrateId { + self.stable_crate_id + } + crate fn triple(&self) -> &TargetTriple { &self.triple } diff --git a/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs b/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs index 828c025d38..0f860d11dc 100644 --- a/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs +++ b/compiler/rustc_metadata/src/rmeta/decoder/cstore_impl.rs @@ -468,6 +468,10 @@ impl CStore { pub fn num_def_ids(&self, cnum: CrateNum) -> usize { self.get_crate_data(cnum).num_def_ids() } + + pub fn item_attrs(&self, def_id: DefId, sess: &Session) -> Vec { + self.get_crate_data(def_id.krate).get_item_attrs(def_id.index, sess).collect() + } } impl CrateStore for CStore { diff --git a/compiler/rustc_metadata/src/rmeta/encoder.rs b/compiler/rustc_metadata/src/rmeta/encoder.rs index dd6a6fe624..254954c837 100644 --- a/compiler/rustc_metadata/src/rmeta/encoder.rs +++ b/compiler/rustc_metadata/src/rmeta/encoder.rs @@ -7,7 +7,9 @@ use rustc_data_structures::stable_hasher::StableHasher; use rustc_data_structures::sync::{join, par_iter, Lrc, ParallelIterator}; use rustc_hir as hir; use rustc_hir::def::{CtorOf, DefKind}; -use rustc_hir::def_id::{CrateNum, DefId, DefIndex, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE}; +use rustc_hir::def_id::{ + CrateNum, DefId, DefIndex, LocalDefId, CRATE_DEF_ID, CRATE_DEF_INDEX, LOCAL_CRATE, +}; use rustc_hir::definitions::DefPathData; use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; use rustc_hir::itemlikevisit::ItemLikeVisitor; @@ -431,7 +433,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { fn encode_info_for_items(&mut self) { let krate = self.tcx.hir().krate(); - self.encode_info_for_mod(hir::CRATE_HIR_ID, &krate.item.module); + self.encode_info_for_mod(CRATE_DEF_ID, &krate.item.module); // Proc-macro crates only export proc-macro items, which are looked // up using `proc_macro_data` @@ -572,10 +574,14 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { let tcx = self.tcx; + // Encode MIR. + i = self.position(); + self.encode_mir(); + let mir_bytes = self.position() - i; + // Encode the items. i = self.position(); self.encode_def_ids(); - self.encode_mir(); self.encode_info_for_items(); let item_bytes = self.position() - i; @@ -647,6 +653,7 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { triple: tcx.sess.opts.target_triple.clone(), hash: tcx.crate_hash(LOCAL_CRATE), disambiguator: tcx.sess.local_crate_disambiguator(), + stable_crate_id: tcx.def_path_hash(LOCAL_CRATE.as_def_id()).stable_crate_id(), panic_strategy: tcx.sess.panic_strategy(), edition: tcx.sess.edition(), has_global_allocator: tcx.has_global_allocator(LOCAL_CRATE), @@ -689,22 +696,23 @@ impl<'a, 'tcx> EncodeContext<'a, 'tcx> { } } - println!("metadata stats:"); - println!(" dep bytes: {}", dep_bytes); - println!(" lib feature bytes: {}", lib_feature_bytes); - println!(" lang item bytes: {}", lang_item_bytes); - println!(" diagnostic item bytes: {}", diagnostic_item_bytes); - println!(" native bytes: {}", native_lib_bytes); - println!(" source_map bytes: {}", source_map_bytes); - println!(" impl bytes: {}", impl_bytes); - println!(" exp. symbols bytes: {}", exported_symbols_bytes); - println!(" def-path table bytes: {}", def_path_table_bytes); - println!(" proc-macro-data-bytes: {}", proc_macro_data_bytes); - println!(" item bytes: {}", item_bytes); - println!(" table bytes: {}", tables_bytes); - println!(" hygiene bytes: {}", hygiene_bytes); - println!(" zero bytes: {}", zero_bytes); - println!(" total bytes: {}", total_bytes); + eprintln!("metadata stats:"); + eprintln!(" dep bytes: {}", dep_bytes); + eprintln!(" lib feature bytes: {}", lib_feature_bytes); + eprintln!(" lang item bytes: {}", lang_item_bytes); + eprintln!(" diagnostic item bytes: {}", diagnostic_item_bytes); + eprintln!(" native bytes: {}", native_lib_bytes); + eprintln!(" source_map bytes: {}", source_map_bytes); + eprintln!(" impl bytes: {}", impl_bytes); + eprintln!(" exp. symbols bytes: {}", exported_symbols_bytes); + eprintln!(" def-path table bytes: {}", def_path_table_bytes); + eprintln!(" proc-macro-data-bytes: {}", proc_macro_data_bytes); + eprintln!(" mir bytes: {}", mir_bytes); + eprintln!(" item bytes: {}", item_bytes); + eprintln!(" table bytes: {}", tables_bytes); + eprintln!(" hygiene bytes: {}", hygiene_bytes); + eprintln!(" zero bytes: {}", zero_bytes); + eprintln!(" total bytes: {}", total_bytes); } root @@ -828,6 +836,76 @@ fn should_encode_mir(tcx: TyCtxt<'_>, def_id: LocalDefId) -> (bool, bool) { } } +fn should_encode_variances(def_kind: DefKind) -> bool { + match def_kind { + DefKind::Struct + | DefKind::Union + | DefKind::Enum + | DefKind::Variant + | DefKind::Fn + | DefKind::Ctor(..) + | DefKind::AssocFn => true, + DefKind::Mod + | DefKind::Field + | DefKind::AssocTy + | DefKind::AssocConst + | DefKind::TyParam + | DefKind::ConstParam + | DefKind::Static + | DefKind::Const + | DefKind::ForeignMod + | DefKind::TyAlias + | DefKind::OpaqueTy + | DefKind::Impl + | DefKind::Trait + | DefKind::TraitAlias + | DefKind::Macro(..) + | DefKind::ForeignTy + | DefKind::Use + | DefKind::LifetimeParam + | DefKind::AnonConst + | DefKind::GlobalAsm + | DefKind::Closure + | DefKind::Generator + | DefKind::ExternCrate => false, + } +} + +fn should_encode_generics(def_kind: DefKind) -> bool { + match def_kind { + DefKind::Struct + | DefKind::Union + | DefKind::Enum + | DefKind::Variant + | DefKind::Trait + | DefKind::TyAlias + | DefKind::ForeignTy + | DefKind::TraitAlias + | DefKind::AssocTy + | DefKind::Fn + | DefKind::Const + | DefKind::Static + | DefKind::Ctor(..) + | DefKind::AssocFn + | DefKind::AssocConst + | DefKind::AnonConst + | DefKind::OpaqueTy + | DefKind::Impl + | DefKind::Closure + | DefKind::Generator => true, + DefKind::Mod + | DefKind::Field + | DefKind::ForeignMod + | DefKind::TyParam + | DefKind::ConstParam + | DefKind::Macro(..) + | DefKind::Use + | DefKind::LifetimeParam + | DefKind::GlobalAsm + | DefKind::ExternCrate => false, + } +} + impl EncodeContext<'a, 'tcx> { fn encode_def_ids(&mut self) { if self.is_proc_macro { @@ -856,12 +934,34 @@ impl EncodeContext<'a, 'tcx> { self.encode_const_stability(def_id); self.encode_deprecation(def_id); } + if should_encode_variances(def_kind) { + let v = self.tcx.variances_of(def_id); + record!(self.tables.variances[def_id] <- v); + } + if should_encode_generics(def_kind) { + let g = tcx.generics_of(def_id); + record!(self.tables.generics[def_id] <- g); + record!(self.tables.explicit_predicates[def_id] <- self.tcx.explicit_predicates_of(def_id)); + let inferred_outlives = self.tcx.inferred_outlives_of(def_id); + if !inferred_outlives.is_empty() { + record!(self.tables.inferred_outlives[def_id] <- inferred_outlives); + } + } + if let DefKind::Trait | DefKind::TraitAlias = def_kind { + record!(self.tables.super_predicates[def_id] <- self.tcx.super_predicates_of(def_id)); + } + } + let inherent_impls = tcx.crate_inherent_impls(LOCAL_CRATE); + for (def_id, implementations) in inherent_impls.inherent_impls.iter() { + assert!(def_id.is_local()); + if implementations.is_empty() { + continue; + } + record!(self.tables.inherent_impls[def_id] <- implementations.iter().map(|&def_id| { + assert!(def_id.is_local()); + def_id.index + })); } - } - - fn encode_variances_of(&mut self, def_id: DefId) { - debug!("EncodeContext::encode_variances_of({:?})", def_id); - record!(self.tables.variances[def_id] <- &self.tcx.variances_of(def_id)[..]); } fn encode_item_type(&mut self, def_id: DefId) { @@ -894,12 +994,7 @@ impl EncodeContext<'a, 'tcx> { if let Some(ctor_def_id) = variant.ctor_def_id { record!(self.tables.fn_sig[def_id] <- tcx.fn_sig(ctor_def_id)); } - // FIXME(eddyb) is this ever used? - self.encode_variances_of(def_id); } - self.encode_generics(def_id); - self.encode_explicit_predicates(def_id); - self.encode_inferred_outlives(def_id); } fn encode_enum_variant_ctor(&mut self, def: &ty::AdtDef, index: VariantIdx) { @@ -920,16 +1015,11 @@ impl EncodeContext<'a, 'tcx> { self.encode_item_type(def_id); if variant.ctor_kind == CtorKind::Fn { record!(self.tables.fn_sig[def_id] <- tcx.fn_sig(def_id)); - self.encode_variances_of(def_id); } - self.encode_generics(def_id); - self.encode_explicit_predicates(def_id); - self.encode_inferred_outlives(def_id); } - fn encode_info_for_mod(&mut self, id: hir::HirId, md: &hir::Mod<'_>) { + fn encode_info_for_mod(&mut self, local_def_id: LocalDefId, md: &hir::Mod<'_>) { let tcx = self.tcx; - let local_def_id = tcx.hir().local_def_id(id); let def_id = local_def_id.to_def_id(); debug!("EncodeContext::encode_info_for_mod({:?})", def_id); @@ -964,7 +1054,7 @@ impl EncodeContext<'a, 'tcx> { record!(self.tables.children[def_id] <- &[]); } else { record!(self.tables.children[def_id] <- md.item_ids.iter().map(|item_id| { - tcx.hir().local_def_id(item_id.id).local_def_index + item_id.def_id.local_def_index })); } } @@ -984,9 +1074,6 @@ impl EncodeContext<'a, 'tcx> { record!(self.tables.kind[def_id] <- EntryKind::Field); self.encode_ident_span(def_id, field.ident); self.encode_item_type(def_id); - self.encode_generics(def_id); - self.encode_explicit_predicates(def_id); - self.encode_inferred_outlives(def_id); } fn encode_struct_ctor(&mut self, adt_def: &ty::AdtDef, def_id: DefId) { @@ -1005,35 +1092,7 @@ impl EncodeContext<'a, 'tcx> { self.encode_item_type(def_id); if variant.ctor_kind == CtorKind::Fn { record!(self.tables.fn_sig[def_id] <- tcx.fn_sig(def_id)); - self.encode_variances_of(def_id); } - self.encode_generics(def_id); - self.encode_explicit_predicates(def_id); - self.encode_inferred_outlives(def_id); - } - - fn encode_generics(&mut self, def_id: DefId) { - debug!("EncodeContext::encode_generics({:?})", def_id); - record!(self.tables.generics[def_id] <- self.tcx.generics_of(def_id)); - } - - fn encode_explicit_predicates(&mut self, def_id: DefId) { - debug!("EncodeContext::encode_explicit_predicates({:?})", def_id); - record!(self.tables.explicit_predicates[def_id] <- - self.tcx.explicit_predicates_of(def_id)); - } - - fn encode_inferred_outlives(&mut self, def_id: DefId) { - debug!("EncodeContext::encode_inferred_outlives({:?})", def_id); - let inferred_outlives = self.tcx.inferred_outlives_of(def_id); - if !inferred_outlives.is_empty() { - record!(self.tables.inferred_outlives[def_id] <- inferred_outlives); - } - } - - fn encode_super_predicates(&mut self, def_id: DefId) { - debug!("EncodeContext::encode_super_predicates({:?})", def_id); - record!(self.tables.super_predicates[def_id] <- self.tcx.super_predicates_of(def_id)); } fn encode_explicit_item_bounds(&mut self, def_id: DefId) { @@ -1110,11 +1169,7 @@ impl EncodeContext<'a, 'tcx> { } if trait_item.kind == ty::AssocKind::Fn { record!(self.tables.fn_sig[def_id] <- tcx.fn_sig(def_id)); - self.encode_variances_of(def_id); } - self.encode_generics(def_id); - self.encode_explicit_predicates(def_id); - self.encode_inferred_outlives(def_id); } fn encode_info_for_impl_item(&mut self, def_id: DefId) { @@ -1171,11 +1226,7 @@ impl EncodeContext<'a, 'tcx> { self.encode_item_type(def_id); if impl_item.kind == ty::AssocKind::Fn { record!(self.tables.fn_sig[def_id] <- tcx.fn_sig(def_id)); - self.encode_variances_of(def_id); } - self.encode_generics(def_id); - self.encode_explicit_predicates(def_id); - self.encode_inferred_outlives(def_id); } fn encode_fn_param_names_for_body(&mut self, body_id: hir::BodyId) -> Lazy<[Ident]> { @@ -1230,18 +1281,6 @@ impl EncodeContext<'a, 'tcx> { } } - // Encodes the inherent implementations of a structure, enumeration, or trait. - fn encode_inherent_implementations(&mut self, def_id: DefId) { - debug!("EncodeContext::encode_inherent_implementations({:?})", def_id); - let implementations = self.tcx.inherent_impls(def_id); - if !implementations.is_empty() { - record!(self.tables.inherent_impls[def_id] <- implementations.iter().map(|&def_id| { - assert!(def_id.is_local()); - def_id.index - })); - } - } - fn encode_stability(&mut self, def_id: DefId) { debug!("EncodeContext::encode_stability({:?})", def_id); @@ -1307,7 +1346,7 @@ impl EncodeContext<'a, 'tcx> { EntryKind::Fn(self.lazy(data)) } hir::ItemKind::Mod(ref m) => { - return self.encode_info_for_mod(item.hir_id, m); + return self.encode_info_for_mod(item.def_id, m); } hir::ItemKind::ForeignMod { .. } => EntryKind::ForeignMod, hir::ItemKind::GlobalAsm(..) => EntryKind::GlobalAsm, @@ -1405,8 +1444,7 @@ impl EncodeContext<'a, 'tcx> { hir::ItemKind::ForeignMod { items, .. } => record!(self.tables.children[def_id] <- items .iter() - .map(|foreign_item| tcx.hir().local_def_id( - foreign_item.id.hir_id).local_def_index) + .map(|foreign_item| foreign_item.id.def_id.local_def_index) ), hir::ItemKind::Enum(..) => record!(self.tables.children[def_id] <- self.tcx.adt_def(def_id).variants.iter().map(|v| { @@ -1453,43 +1491,11 @@ impl EncodeContext<'a, 'tcx> { record!(self.tables.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), - _ => {} - } - 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(..) => { - self.encode_generics(def_id); - self.encode_explicit_predicates(def_id); - self.encode_inferred_outlives(def_id); - } - _ => {} - } - match item.kind { - hir::ItemKind::Trait(..) | hir::ItemKind::TraitAlias(..) => { - self.encode_super_predicates(def_id); - } - _ => {} - } } /// Serialize the text of exported macros fn encode_info_for_macro_def(&mut self, macro_def: &hir::MacroDef<'_>) { - let def_id = self.tcx.hir().local_def_id(macro_def.hir_id).to_def_id(); + let def_id = macro_def.def_id.to_def_id(); record!(self.tables.kind[def_id] <- EntryKind::MacroDef(self.lazy(macro_def.ast.clone()))); self.encode_ident_span(def_id, macro_def.ident); } @@ -1525,7 +1531,6 @@ impl EncodeContext<'a, 'tcx> { if let ty::Closure(def_id, substs) = *ty.kind() { record!(self.tables.fn_sig[def_id] <- substs.as_closure().sig()); } - self.encode_generics(def_id.to_def_id()); } fn encode_info_for_anon_const(&mut self, def_id: LocalDefId) { @@ -1537,9 +1542,6 @@ impl EncodeContext<'a, 'tcx> { record!(self.tables.kind[def_id.to_def_id()] <- EntryKind::AnonConst(qualifs, const_data)); self.encode_item_type(def_id.to_def_id()); - self.encode_generics(def_id.to_def_id()); - self.encode_explicit_predicates(def_id.to_def_id()); - self.encode_inferred_outlives(def_id.to_def_id()); } fn encode_native_libraries(&mut self) -> Lazy<[NativeLib]> { @@ -1816,14 +1818,9 @@ impl EncodeContext<'a, 'tcx> { } self.encode_ident_span(def_id, nitem.ident); self.encode_item_type(def_id); - self.encode_inherent_implementations(def_id); if let hir::ForeignItemKind::Fn(..) = nitem.kind { record!(self.tables.fn_sig[def_id] <- tcx.fn_sig(def_id)); - self.encode_variances_of(def_id); } - self.encode_generics(def_id); - self.encode_explicit_predicates(def_id); - self.encode_inferred_outlives(def_id); } } @@ -1845,17 +1842,15 @@ impl Visitor<'tcx> for EncodeContext<'a, 'tcx> { } 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 - _ => self.encode_info_for_item(def_id.to_def_id(), item), + _ => self.encode_info_for_item(item.def_id.to_def_id(), item), } self.encode_addl_info_for_item(item); } 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.to_def_id(), ni); + self.encode_info_for_foreign_item(ni.def_id.to_def_id(), ni); } fn visit_generics(&mut self, generics: &'tcx hir::Generics<'tcx>) { intravisit::walk_generics(self, generics); @@ -1915,7 +1910,6 @@ impl EncodeContext<'a, 'tcx> { /// 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<'_>) { - let def_id = self.tcx.hir().local_def_id(item.hir_id); match item.kind { hir::ItemKind::Static(..) | hir::ItemKind::Const(..) @@ -1931,7 +1925,7 @@ impl EncodeContext<'a, 'tcx> { // no sub-item recording needed in these cases } hir::ItemKind::Enum(..) => { - let def = self.tcx.adt_def(def_id.to_def_id()); + let def = self.tcx.adt_def(item.def_id.to_def_id()); self.encode_fields(def); for (i, variant) in def.variants.iter_enumerated() { @@ -1943,7 +1937,7 @@ impl EncodeContext<'a, 'tcx> { } } hir::ItemKind::Struct(ref struct_def, _) => { - let def = self.tcx.adt_def(def_id.to_def_id()); + let def = self.tcx.adt_def(item.def_id.to_def_id()); self.encode_fields(def); // If the struct has a constructor, encode it. @@ -1953,18 +1947,19 @@ impl EncodeContext<'a, 'tcx> { } } hir::ItemKind::Union(..) => { - let def = self.tcx.adt_def(def_id.to_def_id()); + let def = self.tcx.adt_def(item.def_id.to_def_id()); self.encode_fields(def); } hir::ItemKind::Impl { .. } => { for &trait_item_def_id in - self.tcx.associated_item_def_ids(def_id.to_def_id()).iter() + self.tcx.associated_item_def_ids(item.def_id.to_def_id()).iter() { self.encode_info_for_impl_item(trait_item_def_id); } } hir::ItemKind::Trait(..) => { - for &item_def_id in self.tcx.associated_item_def_ids(def_id.to_def_id()).iter() { + for &item_def_id in self.tcx.associated_item_def_ids(item.def_id.to_def_id()).iter() + { self.encode_info_for_trait_item(item_def_id); } } @@ -1980,15 +1975,14 @@ 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 { - let impl_id = self.tcx.hir().local_def_id(item.hir_id); - if let Some(trait_ref) = self.tcx.impl_trait_ref(impl_id.to_def_id()) { + if let Some(trait_ref) = self.tcx.impl_trait_ref(item.def_id.to_def_id()) { let simplified_self_ty = ty::fast_reject::simplify_type(self.tcx, trait_ref.self_ty(), false); self.impls .entry(trait_ref.def_id) .or_default() - .push((impl_id.local_def_index, simplified_self_ty)); + .push((item.def_id.local_def_index, simplified_self_ty)); } } } diff --git a/compiler/rustc_metadata/src/rmeta/mod.rs b/compiler/rustc_metadata/src/rmeta/mod.rs index b44c3bfcac..610528956d 100644 --- a/compiler/rustc_metadata/src/rmeta/mod.rs +++ b/compiler/rustc_metadata/src/rmeta/mod.rs @@ -7,7 +7,7 @@ use rustc_data_structures::svh::Svh; use rustc_data_structures::sync::MetadataRef; use rustc_hir as hir; use rustc_hir::def::{CtorKind, DefKind}; -use rustc_hir::def_id::{DefId, DefIndex, DefPathHash}; +use rustc_hir::def_id::{DefId, DefIndex, DefPathHash, StableCrateId}; use rustc_hir::definitions::DefKey; use rustc_hir::lang_items; use rustc_index::{bit_set::FiniteBitSet, vec::IndexVec}; @@ -203,6 +203,7 @@ crate struct CrateRoot<'tcx> { extra_filename: String, hash: Svh, disambiguator: CrateDisambiguator, + stable_crate_id: StableCrateId, panic_strategy: PanicStrategy, edition: Edition, has_global_allocator: bool, diff --git a/compiler/rustc_middle/Cargo.toml b/compiler/rustc_middle/Cargo.toml index d33aad3b71..8cb30e72f7 100644 --- a/compiler/rustc_middle/Cargo.toml +++ b/compiler/rustc_middle/Cargo.toml @@ -11,7 +11,7 @@ doctest = false rustc_arena = { path = "../rustc_arena" } bitflags = "1.2.1" tracing = "0.1" -rustc-rayon-core = "0.3.0" +rustc-rayon-core = "0.3.1" polonius-engine = "0.12.0" rustc_apfloat = { path = "../rustc_apfloat" } rustc_attr = { path = "../rustc_attr" } @@ -27,7 +27,7 @@ rustc_serialize = { path = "../rustc_serialize" } rustc_ast = { path = "../rustc_ast" } rustc_span = { path = "../rustc_span" } chalk-ir = "0.55.0" -smallvec = { version = "1.0", features = ["union", "may_dangle"] } -measureme = "9.0.0" +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } +measureme = "9.1.0" rustc_session = { path = "../rustc_session" } rustc_type_ir = { path = "../rustc_type_ir" } diff --git a/compiler/rustc_middle/src/dep_graph/dep_node.rs b/compiler/rustc_middle/src/dep_graph/dep_node.rs index 1cb7575737..ba9d0a4073 100644 --- a/compiler/rustc_middle/src/dep_graph/dep_node.rs +++ b/compiler/rustc_middle/src/dep_graph/dep_node.rs @@ -62,7 +62,6 @@ use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, CRATE_DEF_INDEX}; use rustc_hir::definitions::DefPathHash; use rustc_hir::HirId; use rustc_span::symbol::Symbol; -use rustc_span::DUMMY_SP; use std::hash::Hash; pub use rustc_query_system::dep_graph::{DepContext, DepNodeParams}; @@ -91,53 +90,6 @@ pub struct DepKindStruct { // FIXME: Make this a simple boolean once DepNodeParams::can_reconstruct_query_key // can be made a specialized associated const. can_reconstruct_query_key: fn() -> bool, - - /// 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` - /// where we don't know if it is red or green and we therefore actually have - /// to recompute its value in order to find out. Since the only piece of - /// information that we have at that point is the `DepNode` we are trying to - /// re-evaluate, we need some way to re-run a query from just that. This is what - /// `force_from_dep_node()` implements. - /// - /// In the general case, a `DepNode` consists of a `DepKind` and an opaque - /// GUID/fingerprint that will uniquely identify the node. This GUID/fingerprint - /// is usually constructed by computing a stable hash of the query-key that the - /// `DepNode` corresponds to. Consequently, it is not in general possible to go - /// back from hash to query-key (since hash functions are not reversible). For - /// this reason `force_from_dep_node()` is expected to fail from time to time - /// because we just cannot find out, from the `DepNode` alone, what the - /// corresponding query-key is and therefore cannot re-run the query. - /// - /// The system deals with this case letting `try_mark_green` fail which forces - /// the root query to be re-evaluated. - /// - /// Now, if `force_from_dep_node()` would always fail, it would be pretty useless. - /// Fortunately, we can use some contextual information that will allow us to - /// reconstruct query-keys for certain kinds of `DepNode`s. In particular, we - /// enforce by construction that the GUID/fingerprint of certain `DepNode`s is a - /// valid `DefPathHash`. Since we also always build a huge table that maps every - /// `DefPathHash` in the current codebase to the corresponding `DefId`, we have - /// everything we need to re-run the query. - /// - /// Take the `mir_promoted` query as an example. Like many other queries, it - /// just has a single parameter: the `DefId` of the item it will compute the - /// validated MIR for. Now, when we call `force_from_dep_node()` on a `DepNode` - /// with kind `MirValidated`, we know that the GUID/fingerprint of the `DepNode` - /// is actually a `DefPathHash`, and can therefore just look up the corresponding - /// `DefId` in `tcx.def_path_hash_to_def_id`. - /// - /// When you implement a new query, it will likely have a corresponding new - /// `DepKind`, and you'll have to support it here in `force_from_dep_node()`. As - /// a rule of thumb, if your query takes a `DefId` or `LocalDefId` as sole parameter, - /// then `force_from_dep_node()` should not fail for it. Otherwise, you can just - /// add it to the "We don't have enough information to reconstruct..." group in - /// the match below. - pub(super) force_from_dep_node: fn(tcx: TyCtxt<'_>, dep_node: &DepNode) -> bool, - - /// Invoke a query to put the on-disk cached value in memory. - pub(super) try_load_from_on_disk_cache: fn(TyCtxt<'_>, &DepNode), } impl std::ops::Deref for DepKind { @@ -196,8 +148,7 @@ macro_rules! contains_eval_always_attr { #[allow(non_upper_case_globals)] pub mod dep_kind { use super::*; - use crate::ty::query::{queries, query_keys}; - use rustc_query_system::query::{force_query, QueryDescription}; + use crate::ty::query::query_keys; // We use this for most things when incr. comp. is turned off. pub const Null: DepKindStruct = DepKindStruct { @@ -206,8 +157,6 @@ pub mod dep_kind { is_eval_always: false, can_reconstruct_query_key: || true, - force_from_dep_node: |_, dep_node| bug!("force_from_dep_node: encountered {:?}", dep_node), - try_load_from_on_disk_cache: |_, _| {}, }; pub const TraitSelect: DepKindStruct = DepKindStruct { @@ -216,8 +165,6 @@ pub mod dep_kind { is_eval_always: false, can_reconstruct_query_key: || true, - force_from_dep_node: |_, _| false, - try_load_from_on_disk_cache: |_, _| {}, }; pub const CompileCodegenUnit: DepKindStruct = DepKindStruct { @@ -226,8 +173,6 @@ pub mod dep_kind { is_eval_always: false, can_reconstruct_query_key: || false, - force_from_dep_node: |_, _| false, - try_load_from_on_disk_cache: |_, _| {}, }; macro_rules! define_query_dep_kinds { @@ -246,59 +191,11 @@ pub mod dep_kind { ::can_reconstruct_query_key() } - fn recover<'tcx>(tcx: TyCtxt<'tcx>, dep_node: &DepNode) -> Option> { - as DepNodeParams>>::recover(tcx, dep_node) - } - - fn force_from_dep_node(tcx: TyCtxt<'_>, dep_node: &DepNode) -> bool { - if is_anon { - return false; - } - - if !can_reconstruct_query_key() { - return false; - } - - if let Some(key) = recover(tcx, dep_node) { - force_query::, _>( - tcx, - key, - DUMMY_SP, - *dep_node - ); - return true; - } - - false - } - - fn try_load_from_on_disk_cache(tcx: TyCtxt<'_>, dep_node: &DepNode) { - if is_anon { - return - } - - if !can_reconstruct_query_key() { - return - } - - debug_assert!(tcx.dep_graph - .node_color(dep_node) - .map(|c| c.is_green()) - .unwrap_or(false)); - - let key = recover(tcx, dep_node).unwrap_or_else(|| panic!("Failed to recover key for {:?} with hash {}", dep_node, dep_node.hash)); - if queries::$variant::cache_on_disk(tcx, &key, None) { - let _ = tcx.$variant(key); - } - } - DepKindStruct { has_params, is_anon, is_eval_always, can_reconstruct_query_key, - force_from_dep_node, - try_load_from_on_disk_cache, } };)* ); @@ -314,7 +211,12 @@ macro_rules! define_dep_nodes { $variant:ident $(( $tuple_arg_ty:ty $(,)? ))* ,)* ) => ( - static DEP_KINDS: &[DepKindStruct] = &[ $(dep_kind::$variant),* ]; + #[macro_export] + macro_rules! make_dep_kind_array { + ($mod:ident) => {[ $(($mod::$variant),)* ]}; + } + + static DEP_KINDS: &[DepKindStruct] = &make_dep_kind_array!(dep_kind); /// This enum serves as an index into the `DEP_KINDS` array. #[derive(Clone, Copy, Debug, PartialEq, Eq, Hash, Encodable, Decodable)] @@ -414,10 +316,7 @@ impl DepNodeExt for DepNode { /// has been removed. fn extract_def_id(&self, tcx: TyCtxt<'tcx>) -> Option { if self.kind.can_reconstruct_query_key() { - tcx.queries - .on_disk_cache - .as_ref()? - .def_path_hash_to_def_id(tcx, DefPathHash(self.hash.into())) + tcx.on_disk_cache.as_ref()?.def_path_hash_to_def_id(tcx, DefPathHash(self.hash.into())) } else { None } @@ -472,7 +371,7 @@ impl<'tcx> DepNodeParams> for DefId { // we will use the old DefIndex as an initial guess for // a lookup into the crate metadata. if !self.is_local() { - if let Some(cache) = &tcx.queries.on_disk_cache { + if let Some(cache) = &tcx.on_disk_cache { cache.store_foreign_def_id_hash(*self, hash); } } diff --git a/compiler/rustc_middle/src/dep_graph/mod.rs b/compiler/rustc_middle/src/dep_graph/mod.rs index b88ffa2bb7..c688b23be1 100644 --- a/compiler/rustc_middle/src/dep_graph/mod.rs +++ b/compiler/rustc_middle/src/dep_graph/mod.rs @@ -2,10 +2,9 @@ use crate::ich::StableHashingContext; use crate::ty::{self, TyCtxt}; use rustc_data_structures::profiling::SelfProfilerRef; use rustc_data_structures::sync::Lock; -use rustc_data_structures::thin_vec::ThinVec; -use rustc_errors::Diagnostic; -use rustc_hir::def_id::LocalDefId; +use rustc_session::Session; +#[macro_use] mod dep_node; pub use rustc_query_system::dep_graph::{ @@ -94,7 +93,7 @@ impl<'tcx> DepContext for TyCtxt<'tcx> { type StableHashingContext = StableHashingContext<'tcx>; fn register_reused_dep_node(&self, dep_node: &DepNode) { - if let Some(cache) = self.queries.on_disk_cache.as_ref() { + if let Some(cache) = self.on_disk_cache.as_ref() { cache.register_reused_dep_node(*self, dep_node) } } @@ -103,112 +102,18 @@ impl<'tcx> DepContext for TyCtxt<'tcx> { TyCtxt::create_stable_hashing_context(*self) } - fn debug_dep_tasks(&self) -> bool { - self.sess.opts.debugging_opts.dep_tasks - } - fn debug_dep_node(&self) -> bool { - self.sess.opts.debugging_opts.incremental_info - || self.sess.opts.debugging_opts.query_dep_graph - } - - fn try_force_from_dep_node(&self, dep_node: &DepNode) -> bool { - // FIXME: This match is just a workaround for incremental bugs and should - // be removed. https://github.com/rust-lang/rust/issues/62649 is one such - // bug that must be fixed before removing this. - match dep_node.kind { - DepKind::hir_owner | DepKind::hir_owner_nodes => { - if let Some(def_id) = dep_node.extract_def_id(*self) { - if !def_id_corresponds_to_hir_dep_node(*self, def_id.expect_local()) { - // This `DefPath` does not have a - // corresponding `DepNode` (e.g. a - // struct field), and the ` DefPath` - // collided with the `DefPath` of a - // proper item that existed in the - // previous compilation session. - // - // Since the given `DefPath` does not - // denote the item that previously - // existed, we just fail to mark green. - return false; - } - } else { - // If the node does not exist anymore, we - // just fail to mark green. - return false; - } - } - _ => { - // For other kinds of nodes it's OK to be - // forced. - } - } - - debug!("try_force_from_dep_node({:?}) --- trying to force", dep_node); - - // We must avoid ever having to call `force_from_dep_node()` for a - // `DepNode::codegen_unit`: - // Since we cannot reconstruct the query key of a `DepNode::codegen_unit`, we - // would always end up having to evaluate the first caller of the - // `codegen_unit` query that *is* reconstructible. This might very well be - // the `compile_codegen_unit` query, thus re-codegenning the whole CGU just - // to re-trigger calling the `codegen_unit` query with the right key. At - // that point we would already have re-done all the work we are trying to - // avoid doing in the first place. - // The solution is simple: Just explicitly call the `codegen_unit` query for - // 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" - ); - - (dep_node.kind.force_from_dep_node)(*self, dep_node) - } - - fn has_errors_or_delayed_span_bugs(&self) -> bool { - self.sess.has_errors_or_delayed_span_bugs() - } - - fn diagnostic(&self) -> &rustc_errors::Handler { - self.sess.diagnostic() - } - - // Interactions with on_disk_cache - fn try_load_from_on_disk_cache(&self, dep_node: &DepNode) { - (dep_node.kind.try_load_from_on_disk_cache)(*self, dep_node) - } - - fn load_diagnostics(&self, prev_dep_node_index: SerializedDepNodeIndex) -> Vec { - self.queries - .on_disk_cache - .as_ref() - .map(|c| c.load_diagnostics(*self, prev_dep_node_index)) - .unwrap_or_default() - } - - fn store_diagnostics(&self, dep_node_index: DepNodeIndex, diagnostics: ThinVec) { - if let Some(c) = self.queries.on_disk_cache.as_ref() { - c.store_diagnostics(dep_node_index, diagnostics) - } - } - - fn store_diagnostics_for_anon_node( - &self, - dep_node_index: DepNodeIndex, - diagnostics: ThinVec, - ) { - if let Some(c) = self.queries.on_disk_cache.as_ref() { - c.store_diagnostics_for_anon_node(dep_node_index, diagnostics) - } + #[inline] + fn dep_graph(&self) -> &DepGraph { + &self.dep_graph } + #[inline(always)] fn profiler(&self) -> &SelfProfilerRef { &self.prof } -} -fn def_id_corresponds_to_hir_dep_node(tcx: TyCtxt<'_>, def_id: LocalDefId) -> bool { - let hir_id = tcx.hir().local_def_id_to_hir_id(def_id); - def_id == hir_id.owner + #[inline(always)] + fn sess(&self) -> &Session { + self.sess + } } diff --git a/compiler/rustc_middle/src/hir/map/blocks.rs b/compiler/rustc_middle/src/hir/map/blocks.rs index 9d392c7b26..706c790094 100644 --- a/compiler/rustc_middle/src/hir/map/blocks.rs +++ b/compiler/rustc_middle/src/hir/map/blocks.rs @@ -12,7 +12,6 @@ //! for the `Code` associated with a particular NodeId. use crate::hir::map::Map; -use rustc_ast::Attribute; use rustc_hir as hir; use rustc_hir::intravisit::FnKind; use rustc_hir::{Expr, FnDecl, Node}; @@ -105,7 +104,6 @@ struct ItemFnParts<'a> { body: hir::BodyId, id: hir::HirId, span: Span, - attrs: &'a [Attribute], } /// These are all the components one can extract from a closure expr @@ -115,18 +113,11 @@ struct ClosureParts<'a> { body: hir::BodyId, id: hir::HirId, span: Span, - attrs: &'a [Attribute], } impl<'a> ClosureParts<'a> { - 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 } + fn new(d: &'a FnDecl<'a>, b: hir::BodyId, id: hir::HirId, s: Span) -> Self { + ClosureParts { decl: d, body: b, id, span: s } } } @@ -146,7 +137,7 @@ impl<'a> FnLikeNode<'a> { pub fn body(self) -> hir::BodyId { self.handle( |i: ItemFnParts<'a>| i.body, - |_, _, _: &'a hir::FnSig<'a>, _, body: hir::BodyId, _, _| body, + |_, _, _: &'a hir::FnSig<'a>, _, body: hir::BodyId, _| body, |c: ClosureParts<'a>| c.body, ) } @@ -154,7 +145,7 @@ impl<'a> FnLikeNode<'a> { pub fn decl(self) -> &'a FnDecl<'a> { self.handle( |i: ItemFnParts<'a>| &*i.decl, - |_, _, sig: &'a hir::FnSig<'a>, _, _, _, _| &sig.decl, + |_, _, sig: &'a hir::FnSig<'a>, _, _, _| &sig.decl, |c: ClosureParts<'a>| c.decl, ) } @@ -162,7 +153,7 @@ impl<'a> FnLikeNode<'a> { pub fn span(self) -> Span { self.handle( |i: ItemFnParts<'_>| i.span, - |_, _, _: &'a hir::FnSig<'a>, _, _, span, _| span, + |_, _, _: &'a hir::FnSig<'a>, _, _, span| span, |c: ClosureParts<'_>| c.span, ) } @@ -170,7 +161,7 @@ impl<'a> FnLikeNode<'a> { pub fn id(self) -> hir::HirId { self.handle( |i: ItemFnParts<'_>| i.id, - |id, _, _: &'a hir::FnSig<'a>, _, _, _, _| id, + |id, _, _: &'a hir::FnSig<'a>, _, _, _| id, |c: ClosureParts<'_>| c.id, ) } @@ -189,12 +180,11 @@ impl<'a> FnLikeNode<'a> { pub fn kind(self) -> FnKind<'a> { let item = |p: ItemFnParts<'a>| -> FnKind<'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 hir::FnSig<'a>, vis, _, _, attrs| { - FnKind::Method(ident, sig, vis, attrs) + FnKind::ItemFn(p.ident, p.generics, p.header, p.vis) }; + let closure = |_: ClosureParts<'a>| FnKind::Closure; + let method = + |_, ident: Ident, sig: &'a hir::FnSig<'a>, vis, _, _| FnKind::Method(ident, sig, vis); self.handle(item, method, closure) } @@ -208,20 +198,18 @@ impl<'a> FnLikeNode<'a> { Option<&'a hir::Visibility<'a>>, hir::BodyId, Span, - &'a [Attribute], ) -> A, C: FnOnce(ClosureParts<'a>) -> A, { match self.node { Node::Item(i) => match i.kind { hir::ItemKind::Fn(ref sig, ref generics, block) => item_fn(ItemFnParts { - id: i.hir_id, + id: i.hir_id(), ident: i.ident, decl: &sig.decl, body: block, vis: &i.vis, span: i.span, - attrs: &i.attrs, header: sig.header, generics, }), @@ -229,19 +217,19 @@ impl<'a> FnLikeNode<'a> { }, Node::TraitItem(ti) => match ti.kind { hir::TraitItemKind::Fn(ref sig, hir::TraitFn::Provided(body)) => { - method(ti.hir_id, ti.ident, sig, None, body, ti.span, &ti.attrs) + method(ti.hir_id(), ti.ident, sig, None, body, ti.span) } _ => bug!("trait method FnLikeNode that is not fn-like"), }, Node::ImplItem(ii) => match ii.kind { hir::ImplItemKind::Fn(ref sig, body) => { - method(ii.hir_id, ii.ident, sig, Some(&ii.vis), body, ii.span, &ii.attrs) + method(ii.hir_id(), ii.ident, sig, Some(&ii.vis), body, ii.span) } _ => bug!("impl method FnLikeNode that is not fn-like"), }, 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)) + closure(ClosureParts::new(&decl, block, e.hir_id, e.span)) } _ => bug!("expr FnLikeNode that is not fn-like"), }, diff --git a/compiler/rustc_middle/src/hir/map/collector.rs b/compiler/rustc_middle/src/hir/map/collector.rs index 872fcb0f58..a3d891fd1b 100644 --- a/compiler/rustc_middle/src/hir/map/collector.rs +++ b/compiler/rustc_middle/src/hir/map/collector.rs @@ -52,25 +52,23 @@ fn insert_vec_map(map: &mut IndexVec>, k: K, v: V if i >= len { map.extend(repeat(None).take(i - len + 1)); } + debug_assert!(map[k].is_none()); map[k] = Some(v); } -fn hash( - hcx: &mut StableHashingContext<'_>, - input: impl for<'a> HashStable>, -) -> Fingerprint { - let mut stable_hasher = StableHasher::new(); - input.hash_stable(hcx, &mut stable_hasher); - stable_hasher.finish() -} - fn hash_body( hcx: &mut StableHashingContext<'_>, def_path_hash: DefPathHash, item_like: impl for<'a> HashStable>, hir_body_nodes: &mut Vec<(DefPathHash, Fingerprint)>, ) -> Fingerprint { - let hash = hash(hcx, HirItemLike { item_like: &item_like }); + let hash = { + let mut stable_hasher = StableHasher::new(); + hcx.while_hashing_hir_bodies(true, |hcx| { + item_like.hash_stable(hcx, &mut stable_hasher); + }); + stable_hasher.finish() + }; hir_body_nodes.push((def_path_hash, hash)); hash } @@ -119,6 +117,7 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> { modules: _, proc_macros: _, trait_map: _, + attrs: _, } = *krate; hash_body(&mut hcx, root_mod_def_path_hash, item, &mut hir_body_nodes) @@ -218,11 +217,21 @@ impl<'a, 'hir> NodeCollector<'a, 'hir> { // Overwrite the dummy hash with the real HIR owner hash. nodes.hash = hash; - // FIXME: feature(impl_trait_in_bindings) broken and trigger this assert - //assert!(data.signature.is_none()); - + debug_assert!(data.signature.is_none()); data.signature = Some(self.arena.alloc(Owner { parent: entry.parent, node: entry.node })); + + let dk_parent = self.definitions.def_key(id.owner).parent; + if let Some(dk_parent) = dk_parent { + let dk_parent = LocalDefId { local_def_index: dk_parent }; + let dk_parent = self.definitions.local_def_id_to_hir_id(dk_parent); + if dk_parent.owner != entry.parent.owner { + panic!( + "Different parents for {:?} => dk_parent={:?} actual={:?}", + id.owner, dk_parent, entry.parent, + ) + } + } } else { assert_eq!(entry.parent.owner, id.owner); insert_vec_map( @@ -309,7 +318,7 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { fn visit_nested_item(&mut self, item: ItemId) { debug!("visit_nested_item: {:?}", item); - self.visit_item(self.krate.item(item.id)); + self.visit_item(self.krate.item(item)); } fn visit_nested_trait_item(&mut self, item_id: TraitItemId) { @@ -338,13 +347,10 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { fn visit_item(&mut self, i: &'hir Item<'hir>) { debug!("visit_item: {:?}", i); - debug_assert_eq!( - i.hir_id.owner, - self.definitions.opt_hir_id_to_local_def_id(i.hir_id).unwrap() - ); - self.with_dep_node_owner(i.hir_id.owner, i, |this, hash| { - this.insert_with_hash(i.span, i.hir_id, Node::Item(i), hash); - this.with_parent(i.hir_id, |this| { + self.with_dep_node_owner(i.def_id, i, |this, hash| { + let hir_id = i.hir_id(); + this.insert_with_hash(i.span, hir_id, Node::Item(i), hash); + this.with_parent(hir_id, |this| { if let ItemKind::Struct(ref struct_def, _) = i.kind { // If this is a tuple or unit-like struct, register the constructor. if let Some(ctor_hir_id) = struct_def.ctor_hir_id() { @@ -357,14 +363,10 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { } fn visit_foreign_item(&mut self, fi: &'hir ForeignItem<'hir>) { - debug_assert_eq!( - fi.hir_id.owner, - self.definitions.opt_hir_id_to_local_def_id(fi.hir_id).unwrap() - ); - self.with_dep_node_owner(fi.hir_id.owner, fi, |this, hash| { - this.insert_with_hash(fi.span, fi.hir_id, Node::ForeignItem(fi), hash); + self.with_dep_node_owner(fi.def_id, fi, |this, hash| { + this.insert_with_hash(fi.span, fi.hir_id(), Node::ForeignItem(fi), hash); - this.with_parent(fi.hir_id, |this| { + this.with_parent(fi.hir_id(), |this| { intravisit::walk_foreign_item(this, fi); }); }); @@ -394,28 +396,20 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { } fn visit_trait_item(&mut self, ti: &'hir TraitItem<'hir>) { - debug_assert_eq!( - ti.hir_id.owner, - self.definitions.opt_hir_id_to_local_def_id(ti.hir_id).unwrap() - ); - self.with_dep_node_owner(ti.hir_id.owner, ti, |this, hash| { - this.insert_with_hash(ti.span, ti.hir_id, Node::TraitItem(ti), hash); + self.with_dep_node_owner(ti.def_id, ti, |this, hash| { + this.insert_with_hash(ti.span, ti.hir_id(), Node::TraitItem(ti), hash); - this.with_parent(ti.hir_id, |this| { + this.with_parent(ti.hir_id(), |this| { intravisit::walk_trait_item(this, ti); }); }); } fn visit_impl_item(&mut self, ii: &'hir ImplItem<'hir>) { - debug_assert_eq!( - ii.hir_id.owner, - self.definitions.opt_hir_id_to_local_def_id(ii.hir_id).unwrap() - ); - self.with_dep_node_owner(ii.hir_id.owner, ii, |this, hash| { - this.insert_with_hash(ii.span, ii.hir_id, Node::ImplItem(ii), hash); + self.with_dep_node_owner(ii.def_id, ii, |this, hash| { + this.insert_with_hash(ii.span, ii.hir_id(), Node::ImplItem(ii), hash); - this.with_parent(ii.hir_id, |this| { + this.with_parent(ii.hir_id(), |this| { intravisit::walk_impl_item(this, ii); }); }); @@ -532,15 +526,15 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { // Exported macros are visited directly from the crate root, // so they do not have `parent_node` set. // Find the correct enclosing module from their DefKey. - let def_key = self.definitions.def_key(macro_def.hir_id.owner); + let def_key = self.definitions.def_key(macro_def.def_id); let parent = def_key.parent.map_or(hir::CRATE_HIR_ID, |local_def_index| { self.definitions.local_def_id_to_hir_id(LocalDefId { local_def_index }) }); self.with_parent(parent, |this| { - this.with_dep_node_owner(macro_def.hir_id.owner, macro_def, |this, hash| { + this.with_dep_node_owner(macro_def.def_id, macro_def, |this, hash| { this.insert_with_hash( macro_def.span, - macro_def.hir_id, + macro_def.hir_id(), Node::MacroDef(macro_def), hash, ); @@ -559,10 +553,10 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { }); } - fn visit_struct_field(&mut self, field: &'hir StructField<'hir>) { + fn visit_field_def(&mut self, field: &'hir FieldDef<'hir>) { self.insert(field.span, field.hir_id, Node::Field(field)); self.with_parent(field.hir_id, |this| { - intravisit::walk_struct_field(this, field); + intravisit::walk_field_def(this, field); }); } @@ -590,18 +584,3 @@ impl<'a, 'hir> Visitor<'hir> for NodeCollector<'a, 'hir> { self.visit_nested_foreign_item(id); } } - -struct HirItemLike { - item_like: T, -} - -impl<'hir, T> HashStable> for HirItemLike -where - T: HashStable>, -{ - fn hash_stable(&self, hcx: &mut StableHashingContext<'hir>, hasher: &mut StableHasher) { - hcx.while_hashing_hir_bodies(true, |hcx| { - self.item_like.hash_stable(hcx, hasher); - }); - } -} diff --git a/compiler/rustc_middle/src/hir/map/mod.rs b/compiler/rustc_middle/src/hir/map/mod.rs index ee12c0e786..9d00f0715a 100644 --- a/compiler/rustc_middle/src/hir/map/mod.rs +++ b/compiler/rustc_middle/src/hir/map/mod.rs @@ -180,11 +180,6 @@ impl<'hir> Map<'hir> { self.tcx.definitions.local_def_id_to_hir_id(def_id) } - #[inline] - pub fn opt_local_def_id_to_hir_id(&self, def_id: LocalDefId) -> Option { - self.tcx.definitions.opt_local_def_id_to_hir_id(def_id) - } - pub fn iter_local_def_id(&self) -> impl Iterator + '_ { self.tcx.definitions.iter_local_def_id() } @@ -285,7 +280,7 @@ impl<'hir> Map<'hir> { let owner = self.tcx.hir_owner_nodes(id.owner); owner.and_then(|owner| { let node = owner.nodes[id.local_id].as_ref(); - // FIXME(eddyb) use a single generic type insted of having both + // FIXME(eddyb) use a single generic type instead of having both // `Entry` and `ParentedNode`, which are effectively the same. // Alternatively, rewrite code using `Entry` to use `ParentedNode`. node.map(|node| Entry { @@ -300,29 +295,29 @@ impl<'hir> Map<'hir> { self.find_entry(id).unwrap() } - pub fn item(&self, id: HirId) -> &'hir Item<'hir> { - match self.find(id).unwrap() { + pub fn item(&self, id: ItemId) -> &'hir Item<'hir> { + match self.find(id.hir_id()).unwrap() { Node::Item(item) => item, _ => bug!(), } } pub fn trait_item(&self, id: TraitItemId) -> &'hir TraitItem<'hir> { - match self.find(id.hir_id).unwrap() { + match self.find(id.hir_id()).unwrap() { Node::TraitItem(item) => item, _ => bug!(), } } pub fn impl_item(&self, id: ImplItemId) -> &'hir ImplItem<'hir> { - match self.find(id.hir_id).unwrap() { + match self.find(id.hir_id()).unwrap() { Node::ImplItem(item) => item, _ => bug!(), } } pub fn foreign_item(&self, id: ForeignItemId) -> &'hir ForeignItem<'hir> { - match self.find(id.hir_id).unwrap() { + match self.find(id.hir_id()).unwrap() { Node::ForeignItem(item) => item, _ => bug!(), } @@ -449,7 +444,7 @@ impl<'hir> Map<'hir> { } } - pub fn trait_impls(&self, trait_did: DefId) -> &'hir [HirId] { + pub fn trait_impls(&self, trait_did: DefId) -> &'hir [LocalDefId] { self.tcx.all_local_trait_impls(LOCAL_CRATE).get(&trait_did).map_or(&[], |xs| &xs[..]) } @@ -457,10 +452,7 @@ impl<'hir> Map<'hir> { /// invoking `krate.attrs` because it registers a tighter /// dep-graph access. pub fn krate_attrs(&self) -> &'hir [ast::Attribute] { - match self.get_entry(CRATE_HIR_ID).node { - Node::Crate(item) => item.attrs, - _ => bug!(), - } + self.attrs(CRATE_HIR_ID) } pub fn get_module(&self, module: LocalDefId) -> (&'hir Mod<'hir>, Span, HirId) { @@ -479,19 +471,19 @@ impl<'hir> Map<'hir> { let module = self.tcx.hir_module_items(module); for id in &module.items { - visitor.visit_item(self.expect_item(*id)); + visitor.visit_item(self.item(*id)); } for id in &module.trait_items { - visitor.visit_trait_item(self.expect_trait_item(id.hir_id)); + visitor.visit_trait_item(self.trait_item(*id)); } for id in &module.impl_items { - visitor.visit_impl_item(self.expect_impl_item(id.hir_id)); + visitor.visit_impl_item(self.impl_item(*id)); } for id in &module.foreign_items { - visitor.visit_foreign_item(self.expect_foreign_item(id.hir_id)); + visitor.visit_foreign_item(self.foreign_item(*id)); } } @@ -500,7 +492,7 @@ impl<'hir> Map<'hir> { V: Visitor<'hir>, { for id in self.krate().exported_macros { - visitor.visit_macro_def(self.expect_macro_def(id.hir_id)); + visitor.visit_macro_def(self.expect_macro_def(id.hir_id())); } } @@ -853,34 +845,7 @@ impl<'hir> Map<'hir> { /// Given a node ID, gets a list of attributes associated with the AST /// corresponding to the node-ID. pub fn attrs(&self, id: HirId) -> &'hir [ast::Attribute] { - self.find_entry(id).map_or(&[], |entry| match entry.node { - Node::Param(a) => &a.attrs[..], - Node::Local(l) => &l.attrs[..], - Node::Item(i) => &i.attrs[..], - Node::ForeignItem(fi) => &fi.attrs[..], - Node::TraitItem(ref ti) => &ti.attrs[..], - Node::ImplItem(ref ii) => &ii.attrs[..], - Node::Variant(ref v) => &v.attrs[..], - Node::Field(ref f) => &f.attrs[..], - Node::Expr(ref e) => &*e.attrs, - Node::Stmt(ref s) => s.kind.attrs(|id| self.item(id.id)), - Node::Arm(ref a) => &*a.attrs, - Node::GenericParam(param) => ¶m.attrs[..], - // Unit/tuple structs/variants take the attributes straight from - // the struct/variant definition. - Node::Ctor(..) => self.attrs(self.get_parent_item(id)), - Node::Crate(item) => &item.attrs[..], - Node::MacroDef(def) => def.attrs, - Node::AnonConst(..) - | Node::PathSegment(..) - | Node::Ty(..) - | Node::Pat(..) - | Node::Binding(..) - | Node::TraitRef(..) - | Node::Block(..) - | Node::Lifetime(..) - | Node::Visibility(..) => &[], - }) + self.tcx.hir_attrs(id.owner).get(id.local_id) } /// Gets the span of the definition of the specified HIR node. @@ -977,7 +942,7 @@ impl<'hir> intravisit::Map<'hir> for Map<'hir> { self.body(id) } - fn item(&self, id: HirId) -> &'hir Item<'hir> { + fn item(&self, id: ItemId) -> &'hir Item<'hir> { self.item(id) } @@ -994,47 +959,6 @@ impl<'hir> intravisit::Map<'hir> for Map<'hir> { } } -trait Named { - fn name(&self) -> Symbol; -} - -impl Named for Spanned { - fn name(&self) -> Symbol { - self.node.name() - } -} - -impl Named for Item<'_> { - fn name(&self) -> Symbol { - self.ident.name - } -} -impl Named for ForeignItem<'_> { - fn name(&self) -> Symbol { - self.ident.name - } -} -impl Named for Variant<'_> { - fn name(&self) -> Symbol { - self.ident.name - } -} -impl Named for StructField<'_> { - fn name(&self) -> Symbol { - self.ident.name - } -} -impl Named for TraitItem<'_> { - fn name(&self) -> Symbol { - self.ident.name - } -} -impl Named for ImplItem<'_> { - fn name(&self) -> Symbol { - self.ident.name - } -} - pub(super) fn index_hir<'tcx>(tcx: TyCtxt<'tcx>, cnum: CrateNum) -> &'tcx IndexedHir<'tcx> { assert_eq!(cnum, LOCAL_CRATE); diff --git a/compiler/rustc_middle/src/hir/mod.rs b/compiler/rustc_middle/src/hir/mod.rs index 6934e06d4c..cf4e473d8a 100644 --- a/compiler/rustc_middle/src/hir/mod.rs +++ b/compiler/rustc_middle/src/hir/mod.rs @@ -9,6 +9,7 @@ pub mod place; use crate::ich::StableHashingContext; use crate::ty::query::Providers; use crate::ty::TyCtxt; +use rustc_ast::Attribute; use rustc_data_structures::fingerprint::Fingerprint; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; @@ -16,6 +17,7 @@ use rustc_hir::def_id::{LocalDefId, LOCAL_CRATE}; use rustc_hir::*; use rustc_index::vec::IndexVec; use rustc_span::DUMMY_SP; +use std::collections::BTreeMap; #[derive(Debug)] pub struct Owner<'tcx> { @@ -55,6 +57,48 @@ impl<'a, 'tcx> HashStable> for OwnerNodes<'tcx> { } } +#[derive(Copy, Clone)] +pub struct AttributeMap<'tcx> { + map: &'tcx BTreeMap, + prefix: LocalDefId, +} + +impl<'a, 'tcx> HashStable> for AttributeMap<'tcx> { + fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { + let range = self.range(); + + range.clone().count().hash_stable(hcx, hasher); + for (key, value) in range { + key.hash_stable(hcx, hasher); + value.hash_stable(hcx, hasher); + } + } +} + +impl<'tcx> std::fmt::Debug for AttributeMap<'tcx> { + fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { + f.debug_struct("AttributeMap") + .field("prefix", &self.prefix) + .field("range", &&self.range().collect::>()[..]) + .finish() + } +} + +impl<'tcx> AttributeMap<'tcx> { + fn get(&self, id: ItemLocalId) -> &'tcx [Attribute] { + self.map.get(&HirId { owner: self.prefix, local_id: id }).copied().unwrap_or(&[]) + } + + fn range(&self) -> std::collections::btree_map::Range<'_, rustc_hir::HirId, &[Attribute]> { + let local_zero = ItemLocalId::from_u32(0); + let range = HirId { owner: self.prefix, local_id: local_zero }..HirId { + owner: LocalDefId { local_def_index: self.prefix.local_def_index + 1 }, + local_id: local_zero, + }; + self.map.range(range) + } +} + impl<'tcx> TyCtxt<'tcx> { #[inline(always)] pub fn hir(self) -> map::Map<'tcx> { @@ -73,13 +117,10 @@ pub fn provide(providers: &mut Providers) { }; providers.hir_crate = |tcx, _| tcx.untracked_crate; providers.index_hir = map::index_hir; - providers.hir_module_items = |tcx, id| { - let hir = tcx.hir(); - let module = hir.local_def_id_to_hir_id(id); - &tcx.untracked_crate.modules[&module] - }; + providers.hir_module_items = |tcx, id| &tcx.untracked_crate.modules[&id]; providers.hir_owner = |tcx, id| tcx.index_hir(LOCAL_CRATE).map[id].signature; providers.hir_owner_nodes = |tcx, id| tcx.index_hir(LOCAL_CRATE).map[id].with_bodies.as_deref(); + providers.hir_attrs = |tcx, id| AttributeMap { map: &tcx.untracked_crate.attrs, prefix: id }; providers.def_span = |tcx, def_id| tcx.hir().span_if_local(def_id).unwrap_or(DUMMY_SP); providers.fn_arg_names = |tcx, id| { let hir = tcx.hir(); diff --git a/compiler/rustc_middle/src/ich/hcx.rs b/compiler/rustc_middle/src/ich/hcx.rs index 51b650e5ad..cf29d21927 100644 --- a/compiler/rustc_middle/src/ich/hcx.rs +++ b/compiler/rustc_middle/src/ich/hcx.rs @@ -250,13 +250,6 @@ impl<'a> rustc_span::HashStableContext for StableHashingContext<'a> { &CACHE } - 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) - } - fn span_data_to_lines_and_cols( &mut self, span: &SpanData, diff --git a/compiler/rustc_middle/src/ich/impls_hir.rs b/compiler/rustc_middle/src/ich/impls_hir.rs index d6c6cef175..abf5683232 100644 --- a/compiler/rustc_middle/src/ich/impls_hir.rs +++ b/compiler/rustc_middle/src/ich/impls_hir.rs @@ -55,8 +55,7 @@ impl<'ctx> rustc_hir::HashStableContext for StableHashingContext<'ctx> { 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)); + let def_path_hash = id.to_stable_hash_key(hcx); def_path_hash.0 }) .fold(Fingerprint::ZERO, |a, b| a.combine_commutative(b)); @@ -67,11 +66,10 @@ impl<'ctx> rustc_hir::HashStableContext for StableHashingContext<'ctx> { 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; + let hir::Expr { hir_id: _, ref span, ref kind } = *expr; span.hash_stable(hcx, hasher); kind.hash_stable(hcx, hasher); - attrs.hash_stable(hcx, hasher); }) } diff --git a/compiler/rustc_middle/src/ich/impls_syntax.rs b/compiler/rustc_middle/src/ich/impls_syntax.rs index bfbe15749e..3137442994 100644 --- a/compiler/rustc_middle/src/ich/impls_syntax.rs +++ b/compiler/rustc_middle/src/ich/impls_syntax.rs @@ -45,7 +45,11 @@ impl<'ctx> rustc_ast::HashStableContext for StableHashingContext<'ctx> { item.hash_stable(self, hasher); style.hash_stable(self, hasher); span.hash_stable(self, hasher); - tokens.as_ref().expect_none("Tokens should have been removed during lowering!"); + assert_matches!( + tokens.as_ref(), + None, + "Tokens should have been removed during lowering!" + ); } else { unreachable!(); } diff --git a/compiler/rustc_middle/src/lib.rs b/compiler/rustc_middle/src/lib.rs index 6ae83a7f66..6ddc38b006 100644 --- a/compiler/rustc_middle/src/lib.rs +++ b/compiler/rustc_middle/src/lib.rs @@ -24,7 +24,7 @@ #![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")] #![feature(array_windows)] -#![feature(assoc_char_funcs)] +#![feature(assert_matches)] #![feature(backtrace)] #![feature(bool_to_option)] #![feature(box_patterns)] @@ -38,7 +38,6 @@ #![feature(extern_types)] #![feature(nll)] #![feature(once_cell)] -#![feature(option_expect_none)] #![feature(or_patterns)] #![feature(min_specialization)] #![feature(trusted_len)] @@ -76,6 +75,7 @@ pub mod query; #[macro_use] pub mod arena; +#[macro_use] pub mod dep_graph; pub mod hir; pub mod ich; diff --git a/compiler/rustc_middle/src/lint.rs b/compiler/rustc_middle/src/lint.rs index ca73481b21..26e61ec8cf 100644 --- a/compiler/rustc_middle/src/lint.rs +++ b/compiler/rustc_middle/src/lint.rs @@ -353,12 +353,12 @@ pub fn struct_lint_level<'s, 'd>( 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!" + "once this associated item 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" + "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) diff --git a/compiler/rustc_middle/src/mir/coverage.rs b/compiler/rustc_middle/src/mir/coverage.rs index 95096d0fb7..eae02a8cbf 100644 --- a/compiler/rustc_middle/src/mir/coverage.rs +++ b/compiler/rustc_middle/src/mir/coverage.rs @@ -92,7 +92,7 @@ impl From for ExpressionOperandId { } } -#[derive(Clone, PartialEq, TyEncodable, TyDecodable, HashStable, TypeFoldable)] +#[derive(Clone, PartialEq, TyEncodable, TyDecodable, Hash, HashStable, TypeFoldable)] pub enum CoverageKind { Counter { function_source_hash: u64, @@ -148,7 +148,18 @@ impl Debug for CoverageKind { } } -#[derive(Clone, TyEncodable, TyDecodable, HashStable, TypeFoldable, PartialEq, Eq, PartialOrd, Ord)] +#[derive( + Clone, + TyEncodable, + TyDecodable, + Hash, + HashStable, + TypeFoldable, + PartialEq, + Eq, + PartialOrd, + Ord +)] pub struct CodeRegion { pub file_name: Symbol, pub start_line: u32, @@ -167,7 +178,7 @@ impl Debug for CodeRegion { } } -#[derive(Copy, Clone, Debug, PartialEq, TyEncodable, TyDecodable, HashStable, TypeFoldable)] +#[derive(Copy, Clone, Debug, PartialEq, TyEncodable, TyDecodable, Hash, HashStable, TypeFoldable)] pub enum Op { Subtract, Add, diff --git a/compiler/rustc_middle/src/mir/interpret/allocation.rs b/compiler/rustc_middle/src/mir/interpret/allocation.rs index 5ebe38b2d7..766d6a06f7 100644 --- a/compiler/rustc_middle/src/mir/interpret/allocation.rs +++ b/compiler/rustc_middle/src/mir/interpret/allocation.rs @@ -266,7 +266,7 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { let range = self.check_bounds(ptr.offset, size); self.mark_init(ptr, size, true); - self.clear_relocations(cx, ptr, size)?; + self.clear_relocations(cx, ptr, size); AllocationExtra::memory_written(self, ptr, size)?; @@ -339,7 +339,7 @@ impl<'tcx, Tag: Copy, Extra: AllocationExtra> Allocation { for dest in bytes { *dest = src.next().expect("iterator was shorter than it said it would be"); } - src.next().expect_none("iterator was longer than it said it would be"); + assert_matches!(src.next(), None, "iterator was longer than it said it would be"); Ok(()) } @@ -484,18 +484,13 @@ impl<'tcx, Tag: Copy, Extra> Allocation { /// uninitialized. This is a somewhat odd "spooky action at a distance", /// but it allows strictly more code to run than if we would just error /// immediately in that case. - fn clear_relocations( - &mut self, - cx: &impl HasDataLayout, - ptr: Pointer, - size: Size, - ) -> InterpResult<'tcx> { + fn clear_relocations(&mut self, cx: &impl HasDataLayout, ptr: Pointer, size: Size) { // Find the start and end of the given range and its outermost relocations. let (first, last) = { // Find all relocations overlapping the given range. let relocations = self.get_relocations(cx, ptr, size); if relocations.is_empty() { - return Ok(()); + return; } ( @@ -517,8 +512,6 @@ impl<'tcx, Tag: Copy, Extra> Allocation { // Forget all the relocations. self.relocations.remove_range(first..last); - - Ok(()) } /// Errors if there are relocations overlapping with the edges of the @@ -550,12 +543,12 @@ impl<'tcx, Tag: Copy, Extra> Allocation { /// error which will report the first range of bytes which is uninitialized. fn check_init(&self, ptr: Pointer, size: Size) -> InterpResult<'tcx> { self.is_init(ptr, size).or_else(|idx_range| { - throw_ub!(InvalidUninitBytes(Some(Box::new(UninitBytesAccess { + throw_ub!(InvalidUninitBytes(Some(UninitBytesAccess { access_ptr: ptr.erase_tag(), access_size: size, uninit_ptr: Pointer::new(ptr.alloc_id, idx_range.start), uninit_size: idx_range.end - idx_range.start, // `Size` subtraction - })))) + }))) }) } diff --git a/compiler/rustc_middle/src/mir/interpret/error.rs b/compiler/rustc_middle/src/mir/interpret/error.rs index cf931ece71..b2b969e9b3 100644 --- a/compiler/rustc_middle/src/mir/interpret/error.rs +++ b/compiler/rustc_middle/src/mir/interpret/error.rs @@ -9,7 +9,7 @@ use rustc_macros::HashStable; use rustc_session::CtfeBacktrace; use rustc_span::def_id::DefId; use rustc_target::abi::{Align, Size}; -use std::{any::Any, backtrace::Backtrace, fmt, mem}; +use std::{any::Any, backtrace::Backtrace, fmt}; #[derive(Debug, Copy, Clone, PartialEq, Eq, HashStable, TyEncodable, TyDecodable)] pub enum ErrorHandled { @@ -40,29 +40,45 @@ pub fn struct_error<'tcx>(tcx: TyCtxtAt<'tcx>, msg: &str) -> DiagnosticBuilder<' struct_span_err!(tcx.sess, tcx.span, E0080, "{}", msg) } +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +static_assert_size!(InterpErrorInfo<'_>, 8); + /// Packages the kind of error we got from the const code interpreter /// up with a Rust-level backtrace of where the error occurred. /// Thsese should always be constructed by calling `.into()` on /// a `InterpError`. In `librustc_mir::interpret`, we have `throw_err_*` /// macros for this. #[derive(Debug)] -pub struct InterpErrorInfo<'tcx> { - pub kind: InterpError<'tcx>, +pub struct InterpErrorInfo<'tcx>(Box>); + +#[derive(Debug)] +struct InterpErrorInfoInner<'tcx> { + kind: InterpError<'tcx>, backtrace: Option>, } impl fmt::Display for InterpErrorInfo<'_> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "{}", self.kind) + write!(f, "{}", self.0.kind) } } -impl InterpErrorInfo<'_> { +impl InterpErrorInfo<'tcx> { pub fn print_backtrace(&self) { - if let Some(backtrace) = self.backtrace.as_ref() { + if let Some(backtrace) = self.0.backtrace.as_ref() { print_backtrace(backtrace); } } + + pub fn into_kind(self) -> InterpError<'tcx> { + let InterpErrorInfo(box InterpErrorInfoInner { kind, .. }) = self; + kind + } + + #[inline] + pub fn kind(&self) -> &InterpError<'tcx> { + &self.0.kind + } } fn print_backtrace(backtrace: &Backtrace) { @@ -108,7 +124,7 @@ impl<'tcx> From> for InterpErrorInfo<'tcx> { } }; - InterpErrorInfo { kind, backtrace } + InterpErrorInfo(Box::new(InterpErrorInfoInner { kind, backtrace })) } } @@ -247,7 +263,7 @@ pub enum UndefinedBehaviorInfo<'tcx> { /// Using a string that is not valid UTF-8, InvalidStr(std::str::Utf8Error), /// Using uninitialized data where it is not allowed. - InvalidUninitBytes(Option>), + InvalidUninitBytes(Option), /// Working with a local that is not currently live. DeadLocal, /// Data size is not equal to target size. @@ -428,8 +444,8 @@ impl dyn MachineStopType { } } -#[cfg(target_arch = "x86_64")] -static_assert_size!(InterpError<'_>, 40); +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +static_assert_size!(InterpError<'_>, 72); pub enum InterpError<'tcx> { /// The program caused undefined behavior. @@ -470,19 +486,14 @@ impl fmt::Debug for InterpError<'_> { } impl InterpError<'_> { - /// Some errors allocate to be created as they contain free-form strings. - /// And sometimes we want to be sure that did not happen as it is a - /// waste of resources. - pub fn allocates(&self) -> bool { + /// Some errors to string formatting even if the error is never printed. + /// To avoid performance issues, there are places where we want to be sure to never raise these formatting errors, + /// so this method lets us detect them and `bug!` on unexpected errors. + pub fn formatted_string(&self) -> bool { match self { - // Zero-sized boxes do not allocate. - InterpError::MachineStop(b) => mem::size_of_val::(&**b) > 0, InterpError::Unsupported(UnsupportedOpInfo::Unsupported(_)) | InterpError::UndefinedBehavior(UndefinedBehaviorInfo::ValidationFailure(_)) - | InterpError::UndefinedBehavior(UndefinedBehaviorInfo::Ub(_)) - | InterpError::UndefinedBehavior(UndefinedBehaviorInfo::InvalidUninitBytes(Some(_))) => { - true - } + | InterpError::UndefinedBehavior(UndefinedBehaviorInfo::Ub(_)) => true, _ => false, } } diff --git a/compiler/rustc_middle/src/mir/interpret/queries.rs b/compiler/rustc_middle/src/mir/interpret/queries.rs index 0517ec5bb1..3e7b93b32a 100644 --- a/compiler/rustc_middle/src/mir/interpret/queries.rs +++ b/compiler/rustc_middle/src/mir/interpret/queries.rs @@ -31,6 +31,7 @@ impl<'tcx> TyCtxt<'tcx> { /// 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. + #[instrument(level = "debug", skip(self))] pub fn const_eval_resolve( self, param_env: ty::ParamEnv<'tcx>, diff --git a/compiler/rustc_middle/src/mir/interpret/value.rs b/compiler/rustc_middle/src/mir/interpret/value.rs index 4bb39fe4a5..5172dfd041 100644 --- a/compiler/rustc_middle/src/mir/interpret/value.rs +++ b/compiler/rustc_middle/src/mir/interpret/value.rs @@ -1,4 +1,4 @@ -use std::convert::TryFrom; +use std::convert::{TryFrom, TryInto}; use std::fmt; use rustc_apfloat::{ @@ -8,12 +8,12 @@ use rustc_apfloat::{ use rustc_macros::HashStable; use rustc_target::abi::{HasDataLayout, Size, TargetDataLayout}; -use crate::ty::{ParamEnv, ScalarInt, Ty, TyCtxt}; +use crate::ty::{Lift, ParamEnv, ScalarInt, Ty, TyCtxt}; use super::{AllocId, Allocation, InterpResult, Pointer, PointerArithmetic}; /// Represents the result of const evaluation via the `eval_to_allocation` query. -#[derive(Clone, HashStable, TyEncodable, TyDecodable, Debug)] +#[derive(Copy, Clone, HashStable, TyEncodable, TyDecodable, Debug, Hash, Eq, PartialEq)] pub struct ConstAlloc<'tcx> { // the value lives here, at offset 0, and that allocation definitely is a `AllocKind::Memory` // (so you can use `AllocMap::unwrap_memory`). @@ -44,9 +44,30 @@ pub enum ConstValue<'tcx> { }, } -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(ConstValue<'_>, 32); +impl From for ConstValue<'tcx> { + fn from(s: Scalar) -> Self { + Self::Scalar(s) + } +} + +impl<'a, 'tcx> Lift<'tcx> for ConstValue<'a> { + type Lifted = ConstValue<'tcx>; + fn lift_to_tcx(self, tcx: TyCtxt<'tcx>) -> Option> { + Some(match self { + ConstValue::Scalar(s) => ConstValue::Scalar(s), + ConstValue::Slice { data, start, end } => { + ConstValue::Slice { data: tcx.lift(data)?, start, end } + } + ConstValue::ByRef { alloc, offset } => { + ConstValue::ByRef { alloc: tcx.lift(alloc)?, offset } + } + }) + } +} + impl<'tcx> ConstValue<'tcx> { #[inline] pub fn try_to_scalar(&self) -> Option { @@ -56,20 +77,20 @@ impl<'tcx> ConstValue<'tcx> { } } + pub fn try_to_scalar_int(&self) -> Option { + Some(self.try_to_scalar()?.assert_int()) + } + pub fn try_to_bits(&self, size: Size) -> Option { - self.try_to_scalar()?.to_bits(size).ok() + self.try_to_scalar_int()?.to_bits(size).ok() } pub fn try_to_bool(&self) -> Option { - match self.try_to_bits(Size::from_bytes(1))? { - 0 => Some(false), - 1 => Some(true), - _ => None, - } + self.try_to_scalar_int()?.try_into().ok() } pub fn try_to_machine_usize(&self, tcx: TyCtxt<'tcx>) -> Option { - Some(self.try_to_bits(tcx.data_layout.pointer_size)? as u64) + self.try_to_scalar_int()?.try_to_machine_usize(tcx).ok() } pub fn try_to_bits_for_ty( @@ -111,7 +132,7 @@ pub enum Scalar { Ptr(Pointer), } -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(Scalar, 24); // We want the `Debug` output to be readable as it is used by `derive(Debug)` for @@ -503,13 +524,20 @@ impl From> for Scalar { } } +impl From for Scalar { + #[inline(always)] + fn from(ptr: ScalarInt) -> Self { + Scalar::Int(ptr) + } +} + #[derive(Clone, Copy, Eq, PartialEq, TyEncodable, TyDecodable, HashStable, Hash)] pub enum ScalarMaybeUninit { Scalar(Scalar), Uninit, } -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(ScalarMaybeUninit, 24); impl From> for ScalarMaybeUninit { diff --git a/compiler/rustc_middle/src/mir/mod.rs b/compiler/rustc_middle/src/mir/mod.rs index 718e81c84e..90fda9ec91 100644 --- a/compiler/rustc_middle/src/mir/mod.rs +++ b/compiler/rustc_middle/src/mir/mod.rs @@ -11,12 +11,12 @@ use crate::ty::fold::{TypeFoldable, TypeFolder, TypeVisitor}; use crate::ty::print::{FmtPrinter, Printer}; use crate::ty::subst::{Subst, SubstsRef}; use crate::ty::{self, List, Ty, TyCtxt}; -use crate::ty::{AdtDef, InstanceDef, Region, UserTypeAnnotationIndex}; +use crate::ty::{AdtDef, InstanceDef, Region, ScalarInt, UserTypeAnnotationIndex}; use rustc_hir as hir; use rustc_hir::def::{CtorKind, Namespace}; use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX}; use rustc_hir::{self, GeneratorKind}; -use rustc_target::abi::VariantIdx; +use rustc_target::abi::{Size, VariantIdx}; use polonius_engine::Atom; pub use rustc_ast::Mutability; @@ -30,6 +30,7 @@ use rustc_span::symbol::Symbol; use rustc_span::{Span, DUMMY_SP}; use rustc_target::asm::InlineAsmRegOrRegClass; use std::borrow::Cow; +use std::convert::TryInto; use std::fmt::{self, Debug, Display, Formatter, Write}; use std::ops::{ControlFlow, Index, IndexMut}; use std::slice; @@ -61,12 +62,14 @@ pub trait HasLocalDecls<'tcx> { } impl<'tcx> HasLocalDecls<'tcx> for LocalDecls<'tcx> { + #[inline] fn local_decls(&self) -> &LocalDecls<'tcx> { self } } impl<'tcx> HasLocalDecls<'tcx> for Body<'tcx> { + #[inline] fn local_decls(&self) -> &LocalDecls<'tcx> { &self.local_decls } @@ -144,6 +147,22 @@ impl<'tcx> MirSource<'tcx> { } } +#[derive(Clone, TyEncodable, TyDecodable, Debug, HashStable, TypeFoldable)] +pub struct GeneratorInfo<'tcx> { + /// The yield type of the function, if it is a generator. + pub yield_ty: Option>, + + /// Generator drop glue. + pub generator_drop: Option>, + + /// The layout of a generator. Produced by the state transformation. + pub generator_layout: Option>, + + /// If this is a generator then record the type of source expression that caused this generator + /// to be created. + pub generator_kind: GeneratorKind, +} + /// The lowered representation of a single function. #[derive(Clone, TyEncodable, TyDecodable, Debug, HashStable, TypeFoldable)] pub struct Body<'tcx> { @@ -164,18 +183,7 @@ pub struct Body<'tcx> { /// and used for debuginfo. Indexed by a `SourceScope`. pub source_scopes: IndexVec>, - /// The yield type of the function, if it is a generator. - pub yield_ty: Option>, - - /// Generator drop glue. - pub generator_drop: Option>>, - - /// The layout of a generator. Produced by the state transformation. - pub generator_layout: Option>, - - /// If this is a generator then record the type of source expression that caused this generator - /// to be created. - pub generator_kind: Option, + pub generator: Option>>, /// Declarations of locals. /// @@ -257,10 +265,14 @@ impl<'tcx> Body<'tcx> { source, basic_blocks, source_scopes, - yield_ty: None, - generator_drop: None, - generator_layout: None, - generator_kind, + generator: generator_kind.map(|generator_kind| { + Box::new(GeneratorInfo { + yield_ty: None, + generator_drop: None, + generator_layout: None, + generator_kind, + }) + }), local_decls, user_type_annotations, arg_count, @@ -287,16 +299,13 @@ impl<'tcx> Body<'tcx> { source: MirSource::item(DefId::local(CRATE_DEF_INDEX)), basic_blocks, source_scopes: IndexVec::new(), - yield_ty: None, - generator_drop: None, - generator_layout: None, + generator: None, local_decls: IndexVec::new(), user_type_annotations: IndexVec::new(), arg_count: 0, spread_arg: None, span: DUMMY_SP, required_consts: Vec::new(), - generator_kind: None, var_debug_info: Vec::new(), is_polymorphic: false, predecessor_cache: PredecessorCache::new(), @@ -478,6 +487,26 @@ impl<'tcx> Body<'tcx> { pub fn dominators(&self) -> Dominators { dominators(self) } + + #[inline] + pub fn yield_ty(&self) -> Option> { + self.generator.as_ref().and_then(|generator| generator.yield_ty) + } + + #[inline] + pub fn generator_layout(&self) -> Option<&GeneratorLayout<'tcx>> { + self.generator.as_ref().and_then(|generator| generator.generator_layout.as_ref()) + } + + #[inline] + pub fn generator_drop(&self) -> Option<&Body<'tcx>> { + self.generator.as_ref().and_then(|generator| generator.generator_drop.as_ref()) + } + + #[inline] + pub fn generator_kind(&self) -> Option { + self.generator.as_ref().map(|generator| generator.generator_kind) + } } #[derive(Copy, Clone, PartialEq, Eq, Debug, TyEncodable, TyDecodable, HashStable)] @@ -594,7 +623,7 @@ impl SourceInfo { // Borrow kinds #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, TyEncodable, TyDecodable)] -#[derive(HashStable)] +#[derive(Hash, HashStable)] pub enum BorrowKind { /// Data must be immutable and is aliasable. Shared, @@ -923,7 +952,7 @@ pub struct LocalDecl<'tcx> { } // `LocalDecl` is used a lot. Make sure it doesn't unintentionally get bigger. -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(LocalDecl<'_>, 56); /// Extra information about a some locals that's used for diagnostics and for @@ -1163,7 +1192,7 @@ pub struct BasicBlockData<'tcx> { } /// Information about an assertion failure. -#[derive(Clone, TyEncodable, TyDecodable, HashStable, PartialEq)] +#[derive(Clone, TyEncodable, TyDecodable, Hash, HashStable, PartialEq, PartialOrd)] pub enum AssertKind { BoundsCheck { len: O, index: O }, Overflow(BinOp, O, O), @@ -1174,7 +1203,17 @@ pub enum AssertKind { ResumedAfterPanic(GeneratorKind), } -#[derive(Clone, Debug, PartialEq, TyEncodable, TyDecodable, HashStable, TypeFoldable)] +#[derive( + Clone, + Debug, + PartialEq, + PartialOrd, + TyEncodable, + TyDecodable, + Hash, + HashStable, + TypeFoldable +)] pub enum InlineAsmOperand<'tcx> { In { reg: InlineAsmRegOrRegClass, @@ -1430,7 +1469,7 @@ pub struct Statement<'tcx> { } // `Statement` is used a lot. Make sure it doesn't unintentionally get bigger. -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(Statement<'_>, 32); impl Statement<'_> { @@ -1449,7 +1488,7 @@ impl Statement<'_> { } } -#[derive(Clone, Debug, PartialEq, TyEncodable, TyDecodable, HashStable, TypeFoldable)] +#[derive(Clone, Debug, PartialEq, TyEncodable, TyDecodable, Hash, HashStable, TypeFoldable)] pub enum StatementKind<'tcx> { /// Write the RHS Rvalue to the LHS Place. Assign(Box<(Place<'tcx>, Rvalue<'tcx>)>), @@ -1503,12 +1542,24 @@ pub enum StatementKind<'tcx> { /// counter varible at runtime, each time the code region is executed. Coverage(Box), + /// Denotes a call to the intrinsic function copy_overlapping, where `src_dst` denotes the + /// memory being read from and written to(one field to save memory), and size + /// indicates how many bytes are being copied over. + CopyNonOverlapping(Box>), + /// No-op. Useful for deleting instructions without affecting statement indices. Nop, } impl<'tcx> StatementKind<'tcx> { - pub fn as_assign_mut(&mut self) -> Option<&mut Box<(Place<'tcx>, Rvalue<'tcx>)>> { + pub fn as_assign_mut(&mut self) -> Option<&mut (Place<'tcx>, Rvalue<'tcx>)> { + match self { + StatementKind::Assign(x) => Some(x), + _ => None, + } + } + + pub fn as_assign(&self) -> Option<&(Place<'tcx>, Rvalue<'tcx>)> { match self { StatementKind::Assign(x) => Some(x), _ => None, @@ -1517,7 +1568,7 @@ impl<'tcx> StatementKind<'tcx> { } /// Describes what kind of retag is to be performed. -#[derive(Copy, Clone, TyEncodable, TyDecodable, Debug, PartialEq, Eq, HashStable)] +#[derive(Copy, Clone, TyEncodable, TyDecodable, Debug, PartialEq, Eq, Hash, HashStable)] pub enum RetagKind { /// The initial retag when entering a function. FnEntry, @@ -1530,7 +1581,7 @@ pub enum RetagKind { } /// The `FakeReadCause` describes the type of pattern why a FakeRead statement exists. -#[derive(Copy, Clone, TyEncodable, TyDecodable, Debug, HashStable, PartialEq)] +#[derive(Copy, Clone, TyEncodable, TyDecodable, Debug, Hash, HashStable, PartialEq)] pub enum FakeReadCause { /// Inject a fake read of the borrowed input at the end of each guards /// code. @@ -1572,7 +1623,7 @@ pub enum FakeReadCause { ForIndex, } -#[derive(Clone, Debug, PartialEq, TyEncodable, TyDecodable, HashStable, TypeFoldable)] +#[derive(Clone, Debug, PartialEq, TyEncodable, TyDecodable, Hash, HashStable, TypeFoldable)] pub struct LlvmInlineAsm<'tcx> { pub asm: hir::LlvmInlineAsmInner, pub outputs: Box<[Place<'tcx>]>, @@ -1614,17 +1665,32 @@ impl Debug for Statement<'_> { write!(fmt, "Coverage::{:?}", coverage.kind) } } + CopyNonOverlapping(box crate::mir::CopyNonOverlapping { + ref src, + ref dst, + ref count, + }) => { + write!(fmt, "copy_nonoverlapping(src={:?}, dst={:?}, count={:?})", src, dst, count) + } Nop => write!(fmt, "nop"), } } } -#[derive(Clone, Debug, PartialEq, TyEncodable, TyDecodable, HashStable, TypeFoldable)] +#[derive(Clone, Debug, PartialEq, TyEncodable, TyDecodable, Hash, HashStable, TypeFoldable)] pub struct Coverage { pub kind: CoverageKind, pub code_region: Option, } +#[derive(Clone, Debug, PartialEq, TyEncodable, TyDecodable, Hash, HashStable, TypeFoldable)] +pub struct CopyNonOverlapping<'tcx> { + pub src: Operand<'tcx>, + pub dst: Operand<'tcx>, + /// Number of elements to copy from src to dest, not bytes. + pub count: Operand<'tcx>, +} + /////////////////////////////////////////////////////////////////////////// // Places @@ -1638,6 +1704,9 @@ pub struct Place<'tcx> { pub projection: &'tcx List>, } +#[cfg(target_arch = "x86_64")] +static_assert_size!(Place<'_>, 16); + #[derive(Copy, Clone, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)] #[derive(TyEncodable, TyDecodable, HashStable)] pub enum ProjectionElem { @@ -1707,7 +1776,7 @@ impl ProjectionElem { pub type PlaceElem<'tcx> = ProjectionElem>; // At least on 64 bit systems, `PlaceElem` should not be larger than two pointers. -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(PlaceElem<'_>, 24); /// Alias for projections as they appear in `UserTypeProjection`, where we @@ -1755,6 +1824,7 @@ impl<'tcx> Place<'tcx> { self.as_ref().as_local() } + #[inline] pub fn as_ref(&self) -> PlaceRef<'tcx> { PlaceRef { local: self.local, projection: &self.projection } } @@ -1766,6 +1836,7 @@ impl<'tcx> Place<'tcx> { /// - (a.b, .c) /// /// Given a place without projections, the iterator is empty. + #[inline] pub fn iter_projections( self, ) -> impl Iterator, PlaceElem<'tcx>)> + DoubleEndedIterator { @@ -1915,7 +1986,7 @@ pub struct SourceScopeLocalData { /// These are values that can appear inside an rvalue. They are intentionally /// limited to prevent rvalues from being nested in one another. -#[derive(Clone, PartialEq, TyEncodable, TyDecodable, HashStable)] +#[derive(Clone, PartialEq, PartialOrd, TyEncodable, TyDecodable, Hash, HashStable)] pub enum Operand<'tcx> { /// Copy: The value must be available for use afterwards. /// @@ -1934,6 +2005,9 @@ pub enum Operand<'tcx> { Constant(Box>), } +#[cfg(target_arch = "x86_64")] +static_assert_size!(Operand<'_>, 24); + impl<'tcx> Debug for Operand<'tcx> { fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result { use self::Operand::*; @@ -1959,7 +2033,7 @@ impl<'tcx> Operand<'tcx> { Operand::Constant(box Constant { span, user_ty: None, - literal: ty::Const::zero_sized(tcx, ty), + literal: ConstantKind::Ty(ty::Const::zero_sized(tcx, ty)), }) } @@ -1990,7 +2064,7 @@ impl<'tcx> Operand<'tcx> { Operand::Constant(box Constant { span, user_ty: None, - literal: ty::Const::from_scalar(tcx, val, ty), + literal: ConstantKind::Val(val.into(), ty), }) } @@ -2023,7 +2097,7 @@ impl<'tcx> Operand<'tcx> { /////////////////////////////////////////////////////////////////////////// /// Rvalues -#[derive(Clone, TyEncodable, TyDecodable, HashStable, PartialEq)] +#[derive(Clone, TyEncodable, TyDecodable, Hash, HashStable, PartialEq)] pub enum Rvalue<'tcx> { /// x (either a move or copy, depending on type of x) Use(Operand<'tcx>), @@ -2049,8 +2123,8 @@ pub enum Rvalue<'tcx> { Cast(CastKind, Operand<'tcx>, Ty<'tcx>), - BinaryOp(BinOp, Operand<'tcx>, Operand<'tcx>), - CheckedBinaryOp(BinOp, Operand<'tcx>, Operand<'tcx>), + BinaryOp(BinOp, Box<(Operand<'tcx>, Operand<'tcx>)>), + CheckedBinaryOp(BinOp, Box<(Operand<'tcx>, Operand<'tcx>)>), NullaryOp(NullOp, Ty<'tcx>), UnaryOp(UnOp, Operand<'tcx>), @@ -2069,13 +2143,16 @@ pub enum Rvalue<'tcx> { Aggregate(Box>, Vec>), } -#[derive(Clone, Copy, Debug, PartialEq, Eq, TyEncodable, TyDecodable, HashStable)] +#[cfg(target_arch = "x86_64")] +static_assert_size!(Rvalue<'_>, 40); + +#[derive(Clone, Copy, Debug, PartialEq, Eq, TyEncodable, TyDecodable, Hash, HashStable)] pub enum CastKind { Misc, Pointer(PointerCast), } -#[derive(Clone, Debug, PartialEq, Eq, TyEncodable, TyDecodable, HashStable)] +#[derive(Clone, Debug, PartialEq, Eq, TyEncodable, TyDecodable, Hash, HashStable)] pub enum AggregateKind<'tcx> { /// The type is of the element Array(Ty<'tcx>), @@ -2092,7 +2169,10 @@ pub enum AggregateKind<'tcx> { Generator(DefId, SubstsRef<'tcx>, hir::Movability), } -#[derive(Copy, Clone, Debug, PartialEq, Eq, TyEncodable, TyDecodable, HashStable)] +#[cfg(target_arch = "x86_64")] +static_assert_size!(AggregateKind<'_>, 48); + +#[derive(Copy, Clone, Debug, PartialEq, PartialOrd, Eq, TyEncodable, TyDecodable, Hash, HashStable)] pub enum BinOp { /// The `+` operator (addition) Add, @@ -2137,7 +2217,7 @@ impl BinOp { } } -#[derive(Copy, Clone, Debug, PartialEq, Eq, TyEncodable, TyDecodable, HashStable)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, TyEncodable, TyDecodable, Hash, HashStable)] pub enum NullOp { /// Returns the size of a value of that type SizeOf, @@ -2145,7 +2225,7 @@ pub enum NullOp { Box, } -#[derive(Copy, Clone, Debug, PartialEq, Eq, TyEncodable, TyDecodable, HashStable)] +#[derive(Copy, Clone, Debug, PartialEq, Eq, TyEncodable, TyDecodable, Hash, HashStable)] pub enum UnOp { /// The `!` operator for logical inversion Not, @@ -2168,8 +2248,8 @@ impl<'tcx> Debug for Rvalue<'tcx> { Cast(ref kind, ref place, ref ty) => { write!(fmt, "{:?} as {:?} ({:?})", place, ty, kind) } - BinaryOp(ref op, ref a, ref b) => write!(fmt, "{:?}({:?}, {:?})", op, a, b), - CheckedBinaryOp(ref op, ref a, ref b) => { + BinaryOp(ref op, box (ref a, ref b)) => write!(fmt, "{:?}({:?}, {:?})", op, a, b), + CheckedBinaryOp(ref op, box (ref a, ref b)) => { write!(fmt, "Checked{:?}({:?}, {:?})", op, a, b) } UnaryOp(ref op, ref a) => write!(fmt, "{:?}({:?})", op, a), @@ -2315,7 +2395,7 @@ impl<'tcx> Debug for Rvalue<'tcx> { /// this does not necessarily mean that they are `==` in Rust. In /// particular, one must be wary of `NaN`! -#[derive(Clone, Copy, PartialEq, TyEncodable, TyDecodable, HashStable)] +#[derive(Clone, Copy, PartialEq, PartialOrd, TyEncodable, TyDecodable, Hash, HashStable)] pub struct Constant<'tcx> { pub span: Span, @@ -2326,12 +2406,21 @@ pub struct Constant<'tcx> { /// Needed for NLL to impose user-given type constraints. pub user_ty: Option, - pub literal: &'tcx ty::Const<'tcx>, + pub literal: ConstantKind<'tcx>, +} + +#[derive(Clone, Copy, PartialEq, PartialOrd, TyEncodable, TyDecodable, Hash, HashStable, Debug)] +pub enum ConstantKind<'tcx> { + /// This constant came from the type system + Ty(&'tcx ty::Const<'tcx>), + /// This constant cannot go back into the type system, as it represents + /// something the type system cannot handle (e.g. pointers). + Val(interpret::ConstValue<'tcx>, Ty<'tcx>), } impl Constant<'tcx> { pub fn check_static_ptr(&self, tcx: TyCtxt<'_>) -> Option { - match self.literal.val.try_to_scalar() { + match self.literal.const_for_ty()?.val.try_to_scalar() { Some(Scalar::Ptr(ptr)) => match tcx.global_alloc(ptr.alloc_id) { GlobalAlloc::Static(def_id) => { assert!(!tcx.is_thread_local_static(def_id)); @@ -2342,6 +2431,94 @@ impl Constant<'tcx> { _ => None, } } + pub fn ty(&self) -> Ty<'tcx> { + self.literal.ty() + } +} + +impl From<&'tcx ty::Const<'tcx>> for ConstantKind<'tcx> { + fn from(ct: &'tcx ty::Const<'tcx>) -> Self { + Self::Ty(ct) + } +} + +impl ConstantKind<'tcx> { + /// Returns `None` if the constant is not trivially safe for use in the type system. + pub fn const_for_ty(&self) -> Option<&'tcx ty::Const<'tcx>> { + match self { + ConstantKind::Ty(c) => Some(c), + ConstantKind::Val(..) => None, + } + } + + pub fn ty(&self) -> Ty<'tcx> { + match self { + ConstantKind::Ty(c) => c.ty, + ConstantKind::Val(_, ty) => ty, + } + } + + #[inline] + pub fn try_to_value(self) -> Option> { + match self { + ConstantKind::Ty(c) => c.val.try_to_value(), + ConstantKind::Val(val, _) => Some(val), + } + } + + #[inline] + pub fn try_to_scalar(self) -> Option { + self.try_to_value()?.try_to_scalar() + } + + #[inline] + pub fn try_to_scalar_int(self) -> Option { + Some(self.try_to_value()?.try_to_scalar()?.assert_int()) + } + + #[inline] + pub fn try_to_bits(self, size: Size) -> Option { + self.try_to_scalar_int()?.to_bits(size).ok() + } + + #[inline] + pub fn try_to_bool(self) -> Option { + self.try_to_scalar_int()?.try_into().ok() + } + + #[inline] + pub fn try_eval_bits( + &self, + tcx: TyCtxt<'tcx>, + param_env: ty::ParamEnv<'tcx>, + ty: Ty<'tcx>, + ) -> Option { + match self { + Self::Ty(ct) => ct.try_eval_bits(tcx, param_env, ty), + Self::Val(val, t) => { + assert_eq!(*t, ty); + let size = + tcx.layout_of(param_env.with_reveal_all_normalized(tcx).and(ty)).ok()?.size; + val.try_to_bits(size) + } + } + } + + #[inline] + pub fn try_eval_bool(&self, tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>) -> Option { + match self { + Self::Ty(ct) => ct.try_eval_bool(tcx, param_env), + Self::Val(val, _) => val.try_to_bool(), + } + } + + #[inline] + pub fn try_eval_usize(&self, tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>) -> Option { + match self { + Self::Ty(ct) => ct.try_eval_usize(tcx, param_env), + Self::Val(val, _) => val.try_to_machine_usize(tcx), + } + } } /// A collection of projections into user types. @@ -2449,7 +2626,7 @@ impl<'tcx> UserTypeProjections { /// * `let (x, _): T = ...` -- here, the `projs` vector would contain /// `field[0]` (aka `.0`), indicating that the type of `s` is /// determined by finding the type of the `.0` field from `T`. -#[derive(Clone, Debug, TyEncodable, TyDecodable, HashStable, PartialEq)] +#[derive(Clone, Debug, TyEncodable, TyDecodable, Hash, HashStable, PartialEq)] pub struct UserTypeProjection { pub base: UserTypeAnnotationIndex, pub projs: Vec, @@ -2527,11 +2704,14 @@ impl<'tcx> Debug for Constant<'tcx> { impl<'tcx> Display for Constant<'tcx> { fn fmt(&self, fmt: &mut Formatter<'_>) -> fmt::Result { - match self.literal.ty.kind() { + match self.ty().kind() { ty::FnDef(..) => {} _ => write!(fmt, "const ")?, } - pretty_print_const(self.literal, fmt, true) + match self.literal { + ConstantKind::Ty(c) => pretty_print_const(c, fmt, true), + ConstantKind::Val(val, ty) => pretty_print_const_value(val, ty, fmt, true), + } } } @@ -2550,6 +2730,23 @@ fn pretty_print_const( }) } +fn pretty_print_const_value( + val: interpret::ConstValue<'tcx>, + ty: Ty<'tcx>, + fmt: &mut Formatter<'_>, + print_types: bool, +) -> fmt::Result { + use crate::ty::print::PrettyPrinter; + ty::tls::with(|tcx| { + let val = tcx.lift(val).unwrap(); + let ty = tcx.lift(ty).unwrap(); + let mut cx = FmtPrinter::new(tcx, fmt, Namespace::ValueNS); + cx.print_alloc_ids = true; + cx.pretty_print_const_value(val, ty, print_types)?; + Ok(()) + }) +} + impl<'tcx> graph::DirectedGraph for Body<'tcx> { type Node = BasicBlock; } diff --git a/compiler/rustc_middle/src/mir/mono.rs b/compiler/rustc_middle/src/mir/mono.rs index eb13c89544..6c2468b9ff 100644 --- a/compiler/rustc_middle/src/mir/mono.rs +++ b/compiler/rustc_middle/src/mir/mono.rs @@ -7,7 +7,7 @@ use rustc_data_structures::fingerprint::Fingerprint; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LOCAL_CRATE}; -use rustc_hir::HirId; +use rustc_hir::{HirId, ItemId}; use rustc_session::config::OptLevel; use rustc_span::source_map::Span; use rustc_span::symbol::Symbol; @@ -43,7 +43,7 @@ pub enum InstantiationMode { pub enum MonoItem<'tcx> { Fn(Instance<'tcx>), Static(DefId), - GlobalAsm(HirId), + GlobalAsm(ItemId), } impl<'tcx> MonoItem<'tcx> { @@ -71,9 +71,8 @@ impl<'tcx> MonoItem<'tcx> { match *self { MonoItem::Fn(instance) => tcx.symbol_name(instance), 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::new(tcx, &format!("global_asm_{:?}", def_id)) + MonoItem::GlobalAsm(item_id) => { + SymbolName::new(tcx, &format!("global_asm_{:?}", item_id.def_id)) } } } @@ -178,7 +177,7 @@ impl<'tcx> MonoItem<'tcx> { MonoItem::Static(def_id) => { def_id.as_local().map(|def_id| tcx.hir().local_def_id_to_hir_id(def_id)) } - MonoItem::GlobalAsm(hir_id) => Some(hir_id), + MonoItem::GlobalAsm(item_id) => Some(item_id.hir_id()), } .map(|hir_id| tcx.hir().span(hir_id)) } @@ -195,9 +194,9 @@ impl<'a, 'tcx> HashStable> for MonoItem<'tcx> { MonoItem::Static(def_id) => { def_id.hash_stable(hcx, hasher); } - MonoItem::GlobalAsm(node_id) => { + MonoItem::GlobalAsm(item_id) => { hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| { - node_id.hash_stable(hcx, hasher); + item_id.hash_stable(hcx, hasher); }) } } @@ -351,7 +350,7 @@ impl<'tcx> CodegenUnit<'tcx> { MonoItem::Static(def_id) => { def_id.as_local().map(|def_id| tcx.hir().local_def_id_to_hir_id(def_id)) } - MonoItem::GlobalAsm(hir_id) => Some(hir_id), + MonoItem::GlobalAsm(item_id) => Some(item_id.hir_id()), }, item.symbol_name(tcx), ) diff --git a/compiler/rustc_middle/src/mir/query.rs b/compiler/rustc_middle/src/mir/query.rs index c293fbe4ef..bde4801801 100644 --- a/compiler/rustc_middle/src/mir/query.rs +++ b/compiler/rustc_middle/src/mir/query.rs @@ -28,11 +28,9 @@ pub enum UnsafetyViolationKind { BorrowPacked, /// Unsafe operation in an `unsafe fn` but outside an `unsafe` block. /// Has to be handled as a lint for backwards compatibility. - /// Should stay gated under `#![feature(unsafe_block_in_unsafe_fn)]`. UnsafeFn, /// Borrow of packed field in an `unsafe fn` but outside an `unsafe` block. /// Has to be handled as a lint for backwards compatibility. - /// Should stay gated under `#![feature(unsafe_block_in_unsafe_fn)]`. UnsafeFnBorrowPacked, } @@ -438,18 +436,6 @@ impl<'tcx> TyCtxt<'tcx> { } } - #[inline] - pub fn optimized_mir_or_const_arg_mir( - self, - def: ty::WithOptConstParam, - ) -> &'tcx Body<'tcx> { - if let Some((did, param_did)) = def.as_const_arg() { - self.mir_for_ctfe_of_const_arg((did, param_did)) - } else { - self.optimized_mir(def.did) - } - } - #[inline] pub fn mir_for_ctfe_opt_const_arg(self, def: ty::WithOptConstParam) -> &'tcx Body<'tcx> { if let Some((did, param_did)) = def.as_const_arg() { diff --git a/compiler/rustc_middle/src/mir/tcx.rs b/compiler/rustc_middle/src/mir/tcx.rs index 1b2c1076a6..6e81914597 100644 --- a/compiler/rustc_middle/src/mir/tcx.rs +++ b/compiler/rustc_middle/src/mir/tcx.rs @@ -17,10 +17,11 @@ pub struct PlaceTy<'tcx> { } // At least on 64 bit systems, `PlaceTy` should not be larger than two or three pointers. -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(PlaceTy<'_>, 16); impl<'tcx> PlaceTy<'tcx> { + #[inline] pub fn from_ty(ty: Ty<'tcx>) -> PlaceTy<'tcx> { PlaceTy { ty, variant_index: None } } @@ -181,12 +182,12 @@ impl<'tcx> Rvalue<'tcx> { } Rvalue::Len(..) => tcx.types.usize, Rvalue::Cast(.., ty) => ty, - Rvalue::BinaryOp(op, ref lhs, ref rhs) => { + Rvalue::BinaryOp(op, box (ref lhs, ref rhs)) => { let lhs_ty = lhs.ty(local_decls, tcx); let rhs_ty = rhs.ty(local_decls, tcx); op.ty(tcx, lhs_ty, rhs_ty) } - Rvalue::CheckedBinaryOp(op, ref lhs, ref rhs) => { + Rvalue::CheckedBinaryOp(op, box (ref lhs, ref rhs)) => { let lhs_ty = lhs.ty(local_decls, tcx); let rhs_ty = rhs.ty(local_decls, tcx); let ty = op.ty(tcx, lhs_ty, rhs_ty); @@ -226,7 +227,7 @@ impl<'tcx> Operand<'tcx> { { match self { &Operand::Copy(ref l) | &Operand::Move(ref l) => l.ty(local_decls, tcx).ty, - &Operand::Constant(ref c) => c.literal.ty, + &Operand::Constant(ref c) => c.literal.ty(), } } } diff --git a/compiler/rustc_middle/src/mir/terminator.rs b/compiler/rustc_middle/src/mir/terminator.rs index 709ffc3049..887dbefa9f 100644 --- a/compiler/rustc_middle/src/mir/terminator.rs +++ b/compiler/rustc_middle/src/mir/terminator.rs @@ -17,7 +17,7 @@ use std::slice; pub use super::query::*; -#[derive(Debug, Clone, TyEncodable, TyDecodable, HashStable, PartialEq)] +#[derive(Debug, Clone, TyEncodable, TyDecodable, Hash, HashStable, PartialEq, PartialOrd)] pub struct SwitchTargets { /// Possible values. The locations to branch to in each case /// are found in the corresponding indices from the `targets` vector. @@ -98,7 +98,7 @@ impl<'a> Iterator for SwitchTargetsIter<'a> { impl<'a> ExactSizeIterator for SwitchTargetsIter<'a> {} -#[derive(Clone, TyEncodable, TyDecodable, HashStable, PartialEq)] +#[derive(Clone, TyEncodable, TyDecodable, Hash, HashStable, PartialEq, PartialOrd)] pub enum TerminatorKind<'tcx> { /// Block should have one successor in the graph; we jump there. Goto { target: BasicBlock }, @@ -407,6 +407,22 @@ impl<'tcx> TerminatorKind<'tcx> { | TerminatorKind::FalseUnwind { ref mut unwind, .. } => Some(unwind), } } + + pub fn as_switch(&self) -> Option<(&Operand<'tcx>, Ty<'tcx>, &SwitchTargets)> { + match self { + TerminatorKind::SwitchInt { discr, switch_ty, targets } => { + Some((discr, switch_ty, targets)) + } + _ => None, + } + } + + pub fn as_goto(&self) -> Option { + match self { + TerminatorKind::Goto { target } => Some(*target), + _ => None, + } + } } impl<'tcx> Debug for TerminatorKind<'tcx> { diff --git a/compiler/rustc_middle/src/mir/type_foldable.rs b/compiler/rustc_middle/src/mir/type_foldable.rs index da8e189ba9..cb59927727 100644 --- a/compiler/rustc_middle/src/mir/type_foldable.rs +++ b/compiler/rustc_middle/src/mir/type_foldable.rs @@ -181,9 +181,11 @@ impl<'tcx> TypeFoldable<'tcx> for Rvalue<'tcx> { AddressOf(mutability, place) => AddressOf(mutability, place.fold_with(folder)), Len(place) => Len(place.fold_with(folder)), Cast(kind, op, ty) => Cast(kind, op.fold_with(folder), ty.fold_with(folder)), - BinaryOp(op, rhs, lhs) => BinaryOp(op, rhs.fold_with(folder), lhs.fold_with(folder)), - CheckedBinaryOp(op, rhs, lhs) => { - CheckedBinaryOp(op, rhs.fold_with(folder), lhs.fold_with(folder)) + BinaryOp(op, box (rhs, lhs)) => { + BinaryOp(op, box (rhs.fold_with(folder), lhs.fold_with(folder))) + } + CheckedBinaryOp(op, box (rhs, lhs)) => { + CheckedBinaryOp(op, box (rhs.fold_with(folder), lhs.fold_with(folder))) } UnaryOp(op, val) => UnaryOp(op, val.fold_with(folder)), Discriminant(place) => Discriminant(place.fold_with(folder)), @@ -227,7 +229,7 @@ impl<'tcx> TypeFoldable<'tcx> for Rvalue<'tcx> { op.visit_with(visitor)?; ty.visit_with(visitor) } - BinaryOp(_, ref rhs, ref lhs) | CheckedBinaryOp(_, ref rhs, ref lhs) => { + BinaryOp(_, box (ref rhs, ref lhs)) | CheckedBinaryOp(_, box (ref rhs, ref lhs)) => { rhs.visit_with(visitor)?; lhs.visit_with(visitor) } @@ -340,6 +342,23 @@ impl<'tcx> TypeFoldable<'tcx> for Constant<'tcx> { } } fn super_visit_with>(&self, visitor: &mut V) -> ControlFlow { - self.literal.visit_with(visitor) + self.literal.visit_with(visitor)?; + self.user_ty.visit_with(visitor) + } +} + +impl<'tcx> TypeFoldable<'tcx> for ConstantKind<'tcx> { + fn super_fold_with>(self, folder: &mut F) -> Self { + match self { + ConstantKind::Ty(c) => ConstantKind::Ty(c.fold_with(folder)), + ConstantKind::Val(v, t) => ConstantKind::Val(v, t.fold_with(folder)), + } + } + + fn super_visit_with>(&self, visitor: &mut V) -> ControlFlow { + match *self { + ConstantKind::Ty(c) => c.visit_with(visitor), + ConstantKind::Val(_, t) => t.visit_with(visitor), + } } } diff --git a/compiler/rustc_middle/src/mir/visit.rs b/compiler/rustc_middle/src/mir/visit.rs index 023555d91c..be248ccabd 100644 --- a/compiler/rustc_middle/src/mir/visit.rs +++ b/compiler/rustc_middle/src/mir/visit.rs @@ -241,11 +241,13 @@ macro_rules! make_mir_visitor { body: &$($mutability)? Body<'tcx>, ) { let span = body.span; - if let Some(yield_ty) = &$($mutability)? body.yield_ty { - self.visit_ty( - yield_ty, - TyContext::YieldTy(SourceInfo::outermost(span)) - ); + if let Some(gen) = &$($mutability)? body.generator { + if let Some(yield_ty) = &$($mutability)? gen.yield_ty { + self.visit_ty( + yield_ty, + TyContext::YieldTy(SourceInfo::outermost(span)) + ); + } } // for best performance, we want to use an iterator rather @@ -434,6 +436,15 @@ macro_rules! make_mir_visitor { location ) } + StatementKind::CopyNonOverlapping(box crate::mir::CopyNonOverlapping{ + ref $($mutability)? src, + ref $($mutability)? dst, + ref $($mutability)? count, + }) => { + self.visit_operand(src, location); + self.visit_operand(dst, location); + self.visit_operand(count, location) + } StatementKind::Nop => {} } } @@ -685,8 +696,8 @@ macro_rules! make_mir_visitor { self.visit_ty(ty, TyContext::Location(location)); } - Rvalue::BinaryOp(_bin_op, lhs, rhs) - | Rvalue::CheckedBinaryOp(_bin_op, lhs, rhs) => { + Rvalue::BinaryOp(_bin_op, box(lhs, rhs)) + | Rvalue::CheckedBinaryOp(_bin_op, box(lhs, rhs)) => { self.visit_operand(lhs, location); self.visit_operand(rhs, location); } @@ -860,7 +871,10 @@ macro_rules! make_mir_visitor { self.visit_span(span); drop(user_ty); // no visit method for this - self.visit_const(literal, location); + match literal { + ConstantKind::Ty(ct) => self.visit_const(ct, location), + ConstantKind::Val(_, t) => self.visit_ty(t, TyContext::Location(location)), + } } fn super_span(&mut self, _span: & $($mutability)? Span) { @@ -998,12 +1012,11 @@ macro_rules! visit_place_fns { () => { fn visit_projection( &mut self, - local: Local, - projection: &[PlaceElem<'tcx>], + place_ref: PlaceRef<'tcx>, context: PlaceContext, location: Location, ) { - self.super_projection(local, projection, context, location); + self.super_projection(place_ref, context, location); } fn visit_projection_elem( @@ -1033,20 +1046,20 @@ macro_rules! visit_place_fns { self.visit_local(&place.local, context, location); - self.visit_projection(place.local, &place.projection, context, location); + self.visit_projection(place.as_ref(), context, location); } fn super_projection( &mut self, - local: Local, - projection: &[PlaceElem<'tcx>], + place_ref: PlaceRef<'tcx>, context: PlaceContext, location: Location, ) { - let mut cursor = projection; + // FIXME: Use PlaceRef::iter_projections, once that exists. + let mut cursor = place_ref.projection; while let &[ref proj_base @ .., elem] = cursor { cursor = proj_base; - self.visit_projection_elem(local, cursor, elem, context, location); + self.visit_projection_elem(place_ref.local, cursor, elem, context, location); } } @@ -1202,6 +1215,7 @@ pub enum PlaceContext { impl PlaceContext { /// Returns `true` if this place context represents a drop. + #[inline] pub fn is_drop(&self) -> bool { matches!(self, PlaceContext::MutatingUse(MutatingUseContext::Drop)) } @@ -1219,6 +1233,7 @@ impl PlaceContext { } /// Returns `true` if this place context represents a storage live or storage dead marker. + #[inline] pub fn is_storage_marker(&self) -> bool { matches!( self, @@ -1227,16 +1242,19 @@ impl PlaceContext { } /// Returns `true` if this place context represents a use that potentially changes the value. + #[inline] pub fn is_mutating_use(&self) -> bool { matches!(self, PlaceContext::MutatingUse(..)) } /// Returns `true` if this place context represents a use that does not change the value. + #[inline] pub fn is_nonmutating_use(&self) -> bool { matches!(self, PlaceContext::NonMutatingUse(..)) } /// Returns `true` if this place context represents a use. + #[inline] pub fn is_use(&self) -> bool { !matches!(self, PlaceContext::NonUse(..)) } diff --git a/compiler/rustc_middle/src/query/mod.rs b/compiler/rustc_middle/src/query/mod.rs index ca528b2f09..ae367db019 100644 --- a/compiler/rustc_middle/src/query/mod.rs +++ b/compiler/rustc_middle/src/query/mod.rs @@ -1,28 +1,3 @@ -use crate::dep_graph::SerializedDepNodeIndex; -use crate::mir::interpret::{GlobalId, LitToConstInput}; -use crate::traits; -use crate::traits::query::{ - CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal, - CanonicalTypeOpAscribeUserTypeGoal, CanonicalTypeOpEqGoal, CanonicalTypeOpNormalizeGoal, - CanonicalTypeOpProvePredicateGoal, CanonicalTypeOpSubtypeGoal, -}; -use crate::ty::query::queries; -use crate::ty::subst::{GenericArg, SubstsRef}; -use crate::ty::{self, ParamEnvAnd, Ty, TyCtxt}; -use rustc_hir::def_id::{CrateNum, DefId, LocalDefId}; -use rustc_query_system::query::QueryDescription; - -use rustc_span::symbol::Symbol; -use std::borrow::Cow; - -fn describe_as_module(def_id: LocalDefId, tcx: TyCtxt<'_>) -> String { - if def_id.is_top_level_module() { - "top-level module".to_string() - } else { - format!("module `{}`", tcx.def_path_str(def_id.to_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 // on `tcx: TyCtxt` (and `tcx.at(span)`) for doing that request in a way @@ -86,6 +61,15 @@ rustc_queries! { desc { |tcx| "HIR owner items in `{}`", tcx.def_path_str(key.to_def_id()) } } + /// Gives access to the HIR attributes inside the HIR owner `key`. + /// + /// This can be conveniently accessed by methods on `tcx.hir()`. + /// Avoid calling this query directly. + query hir_attrs(key: LocalDefId) -> rustc_middle::hir::AttributeMap<'tcx> { + eval_always + desc { |tcx| "HIR owner attributes in `{}`", tcx.def_path_str(key.to_def_id()) } + } + /// Computes the `DefId` of the corresponding const parameter in case the `key` is a /// const argument and returns `None` otherwise. /// @@ -126,11 +110,6 @@ rustc_queries! { desc { |tcx| "computing generics of `{}`", tcx.def_path_str(key) } storage(ArenaCacheSelector<'tcx>) cache_on_disk_if { key.is_local() } - load_cached(tcx, id) { - let generics: Option = tcx.queries.on_disk_cache.as_ref() - .and_then(|c| c.try_load_query_result(tcx, id)); - generics - } } /// Maps from the `DefId` of an item (trait/struct/enum/fn) to the @@ -443,12 +422,23 @@ rustc_queries! { /// full predicates are available (note that supertraits have /// additional acyclicity requirements). query super_predicates_of(key: DefId) -> ty::GenericPredicates<'tcx> { - desc { |tcx| "computing the supertraits of `{}`", tcx.def_path_str(key) } + desc { |tcx| "computing the super predicates of `{}`", tcx.def_path_str(key) } + } + + /// The `Option` is the name of an associated type. If it is `None`, then this query + /// returns the full set of predicates. If `Some`, then the query returns only the + /// subset of super-predicates that reference traits that define the given associated type. + /// This is used to avoid cycles in resolving types like `T::Item`. + query super_predicates_that_define_assoc_type(key: (DefId, Option)) -> ty::GenericPredicates<'tcx> { + desc { |tcx| "computing the super traits of `{}`{}", + tcx.def_path_str(key.0), + if let Some(assoc_name) = key.1 { format!(" with associated type name `{}`", assoc_name) } else { "".to_string() }, + } } /// To avoid cycles within the predicates of a single item we compute /// per-type-parameter predicates for resolving `T::AssocTy`. - query type_param_predicates(key: (DefId, LocalDefId)) -> ty::GenericPredicates<'tcx> { + query type_param_predicates(key: (DefId, LocalDefId, rustc_span::symbol::Ident)) -> ty::GenericPredicates<'tcx> { desc { |tcx| "computing the bounds for type parameter `{}`", { let id = tcx.hir().local_def_id_to_hir_id(key.1); tcx.hir().ty_param_name(id) @@ -692,8 +682,8 @@ rustc_queries! { cache_on_disk_if { true } load_cached(tcx, id) { let typeck_results: Option> = tcx - .queries.on_disk_cache.as_ref() - .and_then(|c| c.try_load_query_result(tcx, id)); + .on_disk_cache.as_ref() + .and_then(|c| c.try_load_query_result(*tcx, id)); typeck_results.map(|x| &*tcx.arena.alloc(x)) } @@ -795,6 +785,14 @@ rustc_queries! { cache_on_disk_if { true } } + /// Convert an evaluated constant to a type level constant or + /// return `None` if that is not possible. + query const_to_valtree( + key: ty::ParamEnvAnd<'tcx, ConstAlloc<'tcx>> + ) -> Option> { + desc { "destructure constant" } + } + /// Destructure a constant ADT or array into its variant index and its /// field values. query destructure_const( @@ -946,7 +944,7 @@ rustc_queries! { /// Passing in any other crate will cause an ICE. /// /// [`LOCAL_CRATE`]: rustc_hir::def_id::LOCAL_CRATE - query all_local_trait_impls(local_crate: CrateNum) -> &'tcx BTreeMap> { + query all_local_trait_impls(local_crate: CrateNum) -> &'tcx BTreeMap> { desc { "local trait impls" } } @@ -975,7 +973,7 @@ rustc_queries! { desc { |tcx| "computing normalized predicates of `{}`", tcx.def_path_str(def_id) } } - /// Like `param_env`, but returns the `ParamEnv in `Reveal::All` mode. + /// Like `param_env`, but returns the `ParamEnv` in `Reveal::All` mode. /// Prefer this over `tcx.param_env(def_id).with_reveal_all_normalized(tcx)`, /// as this method is more efficient. query param_env_reveal_all_normalized(def_id: DefId) -> ty::ParamEnv<'tcx> { @@ -1288,6 +1286,8 @@ rustc_queries! { desc { |tcx| "collecting child items of `{}`", tcx.def_path_str(def_id) } } query extern_mod_stmt_cnum(def_id: LocalDefId) -> Option { + // This depends on untracked global state (`tcx.extern_crate_map`) + eval_always desc { |tcx| "computing crate imported by `{}`", tcx.def_path_str(def_id.to_def_id()) } } @@ -1407,6 +1407,14 @@ rustc_queries! { query is_codegened_item(def_id: DefId) -> bool { desc { |tcx| "determining whether `{}` needs codegen", tcx.def_path_str(def_id) } } + + /// All items participating in code generation together with items inlined into them. + query codegened_and_inlined_items(_: CrateNum) + -> &'tcx DefIdSet { + eval_always + desc { "codegened_and_inlined_items" } + } + query codegen_unit(_: Symbol) -> &'tcx CodegenUnit<'tcx> { desc { "codegen_unit" } } @@ -1622,4 +1630,14 @@ rustc_queries! { query normalize_opaque_types(key: &'tcx ty::List>) -> &'tcx ty::List> { desc { "normalizing opaque types in {:?}", key } } + + /// Checks whether a type is definitely uninhabited. This is + /// conservative: for some types that are uninhabited we return `false`, + /// but we only return `true` for types that are definitely uninhabited. + /// `ty.conservative_is_privately_uninhabited` implies that any value of type `ty` + /// will be `Abi::Uninhabited`. (Note that uninhabited types may have nonzero + /// size, to account for partial initialisation. See #49298 for details.) + query conservative_is_privately_uninhabited(key: ty::ParamEnvAnd<'tcx, Ty<'tcx>>) -> bool { + desc { "conservatively checking if {:?} is privately uninhabited", key } + } } diff --git a/compiler/rustc_middle/src/traits/mod.rs b/compiler/rustc_middle/src/traits/mod.rs index 163b400973..0bd0a701fb 100644 --- a/compiler/rustc_middle/src/traits/mod.rs +++ b/compiler/rustc_middle/src/traits/mod.rs @@ -228,7 +228,10 @@ pub enum ObligationCauseCode<'tcx> { /// Inline asm operand type must be `Sized`. InlineAsmSized, /// `[T, ..n]` implies that `T` must be `Copy`. - RepeatVec, + /// If the function in the array repeat expression is a `const fn`, + /// display a help message suggesting to move the function call to a + /// new `const` item while saying that `T` doesn't implement `Copy`. + RepeatVec(bool), /// Types of fields (other than the last, except for packed structs) in a struct must be sized. FieldSized { @@ -337,7 +340,7 @@ impl ObligationCauseCode<'_> { } // `ObligationCauseCode` is used a lot. Make sure it doesn't unintentionally get bigger. -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(ObligationCauseCode<'_>, 32); #[derive(Copy, Clone, Debug, PartialEq, Eq, Hash)] @@ -476,6 +479,9 @@ pub enum ImplSource<'tcx, N> { /// ImplSource for a builtin `DeterminantKind` trait implementation. DiscriminantKind(ImplSourceDiscriminantKindData), + /// ImplSource for a builtin `Pointee` trait implementation. + Pointee(ImplSourcePointeeData), + /// ImplSource automatically generated for a generator. Generator(ImplSourceGeneratorData<'tcx, N>), @@ -494,7 +500,8 @@ impl<'tcx, N> ImplSource<'tcx, N> { ImplSource::Generator(c) => c.nested, ImplSource::Object(d) => d.nested, ImplSource::FnPointer(d) => d.nested, - ImplSource::DiscriminantKind(ImplSourceDiscriminantKindData) => Vec::new(), + ImplSource::DiscriminantKind(ImplSourceDiscriminantKindData) + | ImplSource::Pointee(ImplSourcePointeeData) => Vec::new(), ImplSource::TraitAlias(d) => d.nested, } } @@ -509,7 +516,8 @@ impl<'tcx, N> ImplSource<'tcx, N> { ImplSource::Generator(c) => &c.nested[..], ImplSource::Object(d) => &d.nested[..], ImplSource::FnPointer(d) => &d.nested[..], - ImplSource::DiscriminantKind(ImplSourceDiscriminantKindData) => &[], + ImplSource::DiscriminantKind(ImplSourceDiscriminantKindData) + | ImplSource::Pointee(ImplSourcePointeeData) => &[], ImplSource::TraitAlias(d) => &d.nested[..], } } @@ -554,6 +562,9 @@ impl<'tcx, N> ImplSource<'tcx, N> { ImplSource::DiscriminantKind(ImplSourceDiscriminantKindData) => { ImplSource::DiscriminantKind(ImplSourceDiscriminantKindData) } + ImplSource::Pointee(ImplSourcePointeeData) => { + ImplSource::Pointee(ImplSourcePointeeData) + } ImplSource::TraitAlias(d) => ImplSource::TraitAlias(ImplSourceTraitAliasData { alias_def_id: d.alias_def_id, substs: d.substs, @@ -632,6 +643,9 @@ pub struct ImplSourceFnPointerData<'tcx, N> { #[derive(Clone, Debug, PartialEq, Eq, TyEncodable, TyDecodable, HashStable)] pub struct ImplSourceDiscriminantKindData; +#[derive(Clone, Debug, PartialEq, Eq, TyEncodable, TyDecodable, HashStable)] +pub struct ImplSourcePointeeData; + #[derive(Clone, PartialEq, Eq, TyEncodable, TyDecodable, HashStable, TypeFoldable, Lift)] pub struct ImplSourceTraitAliasData<'tcx, N> { pub alias_def_id: DefId, diff --git a/compiler/rustc_middle/src/traits/select.rs b/compiler/rustc_middle/src/traits/select.rs index e056240f94..ab08517576 100644 --- a/compiler/rustc_middle/src/traits/select.rs +++ b/compiler/rustc_middle/src/traits/select.rs @@ -125,6 +125,9 @@ pub enum SelectionCandidate<'tcx> { /// Builtin implementation of `DiscriminantKind`. DiscriminantKindCandidate, + /// Builtin implementation of `Pointee`. + PointeeCandidate, + TraitAliasCandidate(DefId), /// Matching `dyn Trait` with a supertrait of `Trait`. The index is the diff --git a/compiler/rustc_middle/src/traits/structural_impls.rs b/compiler/rustc_middle/src/traits/structural_impls.rs index 5a17d38c73..4f978e6363 100644 --- a/compiler/rustc_middle/src/traits/structural_impls.rs +++ b/compiler/rustc_middle/src/traits/structural_impls.rs @@ -19,6 +19,8 @@ impl<'tcx, N: fmt::Debug> fmt::Debug for traits::ImplSource<'tcx, N> { super::ImplSource::DiscriminantKind(ref d) => write!(f, "{:?}", d), + super::ImplSource::Pointee(ref d) => write!(f, "{:?}", d), + super::ImplSource::Object(ref d) => write!(f, "{:?}", d), super::ImplSource::Param(ref n, ct) => { @@ -110,4 +112,5 @@ impl<'tcx, N: fmt::Debug> fmt::Debug for traits::ImplSourceTraitAliasData<'tcx, TrivialTypeFoldableAndLiftImpls! { super::IfExpressionCause, super::ImplSourceDiscriminantKindData, + super::ImplSourcePointeeData, } diff --git a/compiler/rustc_middle/src/ty/adjustment.rs b/compiler/rustc_middle/src/ty/adjustment.rs index 89d0e13955..a50dda69a0 100644 --- a/compiler/rustc_middle/src/ty/adjustment.rs +++ b/compiler/rustc_middle/src/ty/adjustment.rs @@ -6,7 +6,7 @@ use rustc_hir::lang_items::LangItem; use rustc_macros::HashStable; use rustc_span::Span; -#[derive(Clone, Copy, Debug, PartialEq, Eq, TyEncodable, TyDecodable, HashStable)] +#[derive(Clone, Copy, Debug, PartialEq, Eq, TyEncodable, TyDecodable, Hash, HashStable)] pub enum PointerCast { /// Go from a fn-item type to a fn-pointer type. ReifyFnPointer, diff --git a/compiler/rustc_middle/src/ty/adt.rs b/compiler/rustc_middle/src/ty/adt.rs new file mode 100644 index 0000000000..95159ea46a --- /dev/null +++ b/compiler/rustc_middle/src/ty/adt.rs @@ -0,0 +1,482 @@ +use crate::ich::StableHashingContext; +use crate::mir::interpret::ErrorHandled; +use crate::ty; +use crate::ty::util::{Discr, IntTypeExt}; +use rustc_data_structures::captures::Captures; +use rustc_data_structures::fingerprint::Fingerprint; +use rustc_data_structures::fx::FxHashMap; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use rustc_errors::ErrorReported; +use rustc_hir::def::{DefKind, Res}; +use rustc_hir::def_id::DefId; +use rustc_index::vec::{Idx, IndexVec}; +use rustc_serialize::{self, Encodable, Encoder}; +use rustc_session::DataTypeKind; +use rustc_span::symbol::sym; +use rustc_target::abi::VariantIdx; + +use std::cell::RefCell; +use std::cmp::Ordering; +use std::hash::{Hash, Hasher}; +use std::ops::Range; +use std::{ptr, str}; + +use super::{ + Destructor, FieldDef, GenericPredicates, ReprOptions, Ty, TyCtxt, VariantDef, VariantDiscr, +}; + +#[derive(Clone, HashStable, Debug)] +pub struct AdtSizedConstraint<'tcx>(pub &'tcx [Ty<'tcx>]); + +bitflags! { + #[derive(HashStable)] + pub struct AdtFlags: u32 { + const NO_ADT_FLAGS = 0; + /// Indicates whether the ADT is an enum. + const IS_ENUM = 1 << 0; + /// Indicates whether the ADT is a union. + const IS_UNION = 1 << 1; + /// Indicates whether the ADT is a struct. + const IS_STRUCT = 1 << 2; + /// Indicates whether the ADT is a struct and has a constructor. + const HAS_CTOR = 1 << 3; + /// Indicates whether the type is `PhantomData`. + const IS_PHANTOM_DATA = 1 << 4; + /// Indicates whether the type has a `#[fundamental]` attribute. + const IS_FUNDAMENTAL = 1 << 5; + /// Indicates whether the type is `Box`. + const IS_BOX = 1 << 6; + /// Indicates whether the type is `ManuallyDrop`. + const IS_MANUALLY_DROP = 1 << 7; + /// Indicates whether the variant list of this ADT is `#[non_exhaustive]`. + /// (i.e., this flag is never set unless this ADT is an enum). + const IS_VARIANT_LIST_NON_EXHAUSTIVE = 1 << 8; + } +} + +/// The definition of a user-defined type, e.g., a `struct`, `enum`, or `union`. +/// +/// These are all interned (by `alloc_adt_def`) into the global arena. +/// +/// The initialism *ADT* stands for an [*algebraic data type (ADT)*][adt]. +/// This is slightly wrong because `union`s are not ADTs. +/// Moreover, Rust only allows recursive data types through indirection. +/// +/// [adt]: https://en.wikipedia.org/wiki/Algebraic_data_type +pub struct AdtDef { + /// The `DefId` of the struct, enum or union item. + pub did: DefId, + /// Variants of the ADT. If this is a struct or union, then there will be a single variant. + pub variants: IndexVec, + /// Flags of the ADT (e.g., is this a struct? is this non-exhaustive?). + flags: AdtFlags, + /// Repr options provided by the user. + pub repr: ReprOptions, +} + +impl PartialOrd for AdtDef { + fn partial_cmp(&self, other: &AdtDef) -> Option { + Some(self.cmp(&other)) + } +} + +/// There should be only one AdtDef for each `did`, therefore +/// it is fine to implement `Ord` only based on `did`. +impl Ord for AdtDef { + fn cmp(&self, other: &AdtDef) -> Ordering { + self.did.cmp(&other.did) + } +} + +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) + } +} + +impl Eq for AdtDef {} + +impl Hash for AdtDef { + #[inline] + fn hash(&self, s: &mut H) { + (self as *const AdtDef).hash(s) + } +} + +impl Encodable for AdtDef { + fn encode(&self, s: &mut S) -> Result<(), S::Error> { + self.did.encode(s) + } +} + +impl<'a> HashStable> for AdtDef { + fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { + thread_local! { + static CACHE: RefCell> = Default::default(); + } + + 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 mut hasher = StableHasher::new(); + did.hash_stable(hcx, &mut hasher); + variants.hash_stable(hcx, &mut hasher); + flags.hash_stable(hcx, &mut hasher); + repr.hash_stable(hcx, &mut hasher); + + hasher.finish() + }) + }); + + hash.hash_stable(hcx, hasher); + } +} + +#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] +pub enum AdtKind { + Struct, + Union, + Enum, +} + +impl Into for AdtKind { + fn into(self) -> DataTypeKind { + match self { + AdtKind::Struct => DataTypeKind::Struct, + AdtKind::Union => DataTypeKind::Union, + AdtKind::Enum => DataTypeKind::Enum, + } + } +} + +impl<'tcx> AdtDef { + /// Creates a new `AdtDef`. + pub(super) fn new( + tcx: TyCtxt<'_>, + did: DefId, + kind: AdtKind, + variants: IndexVec, + repr: ReprOptions, + ) -> Self { + debug!("AdtDef::new({:?}, {:?}, {:?}, {:?})", did, kind, variants, repr); + let mut flags = AdtFlags::NO_ADT_FLAGS; + + if kind == AdtKind::Enum && tcx.has_attr(did, sym::non_exhaustive) { + debug!("found non-exhaustive variant list for {:?}", did); + flags = flags | AdtFlags::IS_VARIANT_LIST_NON_EXHAUSTIVE; + } + + flags |= match kind { + AdtKind::Enum => AdtFlags::IS_ENUM, + AdtKind::Union => AdtFlags::IS_UNION, + AdtKind::Struct => AdtFlags::IS_STRUCT, + }; + + if kind == AdtKind::Struct && variants[VariantIdx::new(0)].ctor_def_id.is_some() { + flags |= AdtFlags::HAS_CTOR; + } + + let attrs = tcx.get_attrs(did); + if tcx.sess.contains_name(&attrs, sym::fundamental) { + flags |= AdtFlags::IS_FUNDAMENTAL; + } + if Some(did) == tcx.lang_items().phantom_data() { + flags |= AdtFlags::IS_PHANTOM_DATA; + } + if Some(did) == tcx.lang_items().owned_box() { + flags |= AdtFlags::IS_BOX; + } + if Some(did) == tcx.lang_items().manually_drop() { + flags |= AdtFlags::IS_MANUALLY_DROP; + } + + AdtDef { did, variants, flags, repr } + } + + /// Returns `true` if this is a struct. + #[inline] + pub fn is_struct(&self) -> bool { + self.flags.contains(AdtFlags::IS_STRUCT) + } + + /// Returns `true` if this is a union. + #[inline] + pub fn is_union(&self) -> bool { + self.flags.contains(AdtFlags::IS_UNION) + } + + /// Returns `true` if this is a enum. + #[inline] + pub fn is_enum(&self) -> bool { + self.flags.contains(AdtFlags::IS_ENUM) + } + + /// Returns `true` if the variant list of this ADT is `#[non_exhaustive]`. + #[inline] + pub fn is_variant_list_non_exhaustive(&self) -> bool { + self.flags.contains(AdtFlags::IS_VARIANT_LIST_NON_EXHAUSTIVE) + } + + /// Returns the kind of the ADT. + #[inline] + pub fn adt_kind(&self) -> AdtKind { + if self.is_enum() { + AdtKind::Enum + } else if self.is_union() { + AdtKind::Union + } else { + AdtKind::Struct + } + } + + /// Returns a description of this abstract data type. + pub fn descr(&self) -> &'static str { + match self.adt_kind() { + AdtKind::Struct => "struct", + AdtKind::Union => "union", + AdtKind::Enum => "enum", + } + } + + /// Returns a description of a variant of this abstract data type. + #[inline] + pub fn variant_descr(&self) -> &'static str { + match self.adt_kind() { + AdtKind::Struct => "struct", + AdtKind::Union => "union", + AdtKind::Enum => "variant", + } + } + + /// If this function returns `true`, it implies that `is_struct` must return `true`. + #[inline] + pub fn has_ctor(&self) -> bool { + self.flags.contains(AdtFlags::HAS_CTOR) + } + + /// Returns `true` if this type is `#[fundamental]` for the purposes + /// of coherence checking. + #[inline] + pub fn is_fundamental(&self) -> bool { + self.flags.contains(AdtFlags::IS_FUNDAMENTAL) + } + + /// Returns `true` if this is `PhantomData`. + #[inline] + pub fn is_phantom_data(&self) -> bool { + self.flags.contains(AdtFlags::IS_PHANTOM_DATA) + } + + /// Returns `true` if this is Box. + #[inline] + pub fn is_box(&self) -> bool { + self.flags.contains(AdtFlags::IS_BOX) + } + + /// Returns `true` if this is `ManuallyDrop`. + #[inline] + pub fn is_manually_drop(&self) -> bool { + self.flags.contains(AdtFlags::IS_MANUALLY_DROP) + } + + /// Returns `true` if this type has a destructor. + pub fn has_dtor(&self, tcx: TyCtxt<'tcx>) -> bool { + self.destructor(tcx).is_some() + } + + /// Asserts this is a struct or union and returns its unique variant. + pub fn non_enum_variant(&self) -> &VariantDef { + assert!(self.is_struct() || self.is_union()); + &self.variants[VariantIdx::new(0)] + } + + #[inline] + pub fn predicates(&self, tcx: TyCtxt<'tcx>) -> GenericPredicates<'tcx> { + tcx.predicates_of(self.did) + } + + /// Returns an iterator over all fields contained + /// by this ADT. + #[inline] + pub fn all_fields(&self) -> impl Iterator + Clone { + self.variants.iter().flat_map(|v| v.fields.iter()) + } + + /// Whether the ADT lacks fields. Note that this includes uninhabited enums, + /// e.g., `enum Void {}` is considered payload free as well. + pub fn is_payloadfree(&self) -> bool { + 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") + } + + /// 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)) + .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 + } + + /// 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 + } + + 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), + } + } + + #[inline] + pub fn eval_explicit_discr(&self, tcx: TyCtxt<'tcx>, expr_did: DefId) -> Option> { + assert!(self.is_enum()); + let param_env = tcx.param_env(expr_did); + let repr_type = self.repr.discr_type(); + match tcx.const_eval_poly(expr_did) { + Ok(val) => { + let ty = repr_type.to_ty(tcx); + if let Some(b) = val.try_to_bits_for_ty(tcx, param_env, ty) { + trace!("discriminants: {} ({:?})", b, repr_type); + Some(Discr { val: b, 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(); + None + } + } + Err(err) => { + let msg = match err { + ErrorHandled::Reported(ErrorReported) | ErrorHandled::Linted => { + "enum discriminant evaluation failed" + } + ErrorHandled::TooGeneric => "enum discriminant depends on generics", + }; + tcx.sess.delay_span_bug(tcx.def_span(expr_did), msg); + None + } + } + } + + #[inline] + pub fn discriminants( + &'tcx self, + tcx: TyCtxt<'tcx>, + ) -> impl Iterator)> + Captures<'tcx> { + assert!(self.is_enum()); + let repr_type = self.repr.discr_type(); + let initial = repr_type.initial_discriminant(tcx); + let mut prev_discr = None::>; + self.variants.iter_enumerated().map(move |(i, v)| { + let mut discr = prev_discr.map_or(initial, |d| d.wrap_incr(tcx)); + if let VariantDiscr::Explicit(expr_did) = v.discr { + if let Some(new_discr) = self.eval_explicit_discr(tcx, expr_did) { + discr = new_discr; + } + } + prev_discr = Some(discr); + + (i, discr) + }) + } + + #[inline] + pub fn variant_range(&self) -> Range { + VariantIdx::new(0)..VariantIdx::new(self.variants.len()) + } + + /// Computes the discriminant value used by a specific variant. + /// Unlike `discriminants`, this is (amortized) constant-time, + /// only doing at most one query for evaluating an explicit + /// discriminant (the last one before the requested variant), + /// assuming there are no constant-evaluation errors there. + #[inline] + pub fn discriminant_for_variant( + &self, + tcx: TyCtxt<'tcx>, + variant_index: VariantIdx, + ) -> Discr<'tcx> { + assert!(self.is_enum()); + let (val, offset) = self.discriminant_def_for_variant(variant_index); + let explicit_value = val + .and_then(|expr_did| self.eval_explicit_discr(tcx, expr_did)) + .unwrap_or_else(|| self.repr.discr_type().initial_discriminant(tcx)); + explicit_value.checked_add(tcx, offset as u128).0 + } + + /// 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) { + assert!(!self.variants.is_empty()); + let mut explicit_index = variant_index.as_u32(); + let expr_did; + loop { + match self.variants[VariantIdx::from_u32(explicit_index)].discr { + ty::VariantDiscr::Relative(0) => { + expr_did = None; + break; + } + ty::VariantDiscr::Relative(distance) => { + explicit_index -= distance; + } + ty::VariantDiscr::Explicit(did) => { + expr_did = Some(did); + break; + } + } + } + (expr_did, variant_index.as_u32() - explicit_index) + } + + pub fn destructor(&self, tcx: TyCtxt<'tcx>) -> Option { + tcx.adt_destructor(self.did) + } + + /// Returns a list of types such that `Self: Sized` if and only + /// if that type is `Sized`, or `TyErr` if this type is recursive. + /// + /// Oddly enough, checking that the sized-constraint is `Sized` is + /// actually more expressive than checking all members: + /// the `Sized` trait is inductive, so an associated type that references + /// `Self` would prevent its containing ADT from being `Sized`. + /// + /// Due to normalization being eager, this applies even if + /// the associated type is behind a pointer (e.g., issue #31299). + pub fn sized_constraint(&self, tcx: TyCtxt<'tcx>) -> &'tcx [Ty<'tcx>] { + tcx.adt_sized_constraint(self.did).0 + } +} diff --git a/compiler/rustc_middle/src/ty/assoc.rs b/compiler/rustc_middle/src/ty/assoc.rs new file mode 100644 index 0000000000..d3770fa416 --- /dev/null +++ b/compiler/rustc_middle/src/ty/assoc.rs @@ -0,0 +1,170 @@ +pub use self::AssocItemContainer::*; + +use crate::ty; +use rustc_data_structures::sorted_map::SortedIndexMultiMap; +use rustc_hir as hir; +use rustc_hir::def::{DefKind, Namespace}; +use rustc_hir::def_id::DefId; +use rustc_span::symbol::{Ident, Symbol}; + +use super::{TyCtxt, Visibility}; + +#[derive(Clone, Copy, PartialEq, Eq, Debug, HashStable, Hash)] +pub enum AssocItemContainer { + TraitContainer(DefId), + ImplContainer(DefId), +} + +impl AssocItemContainer { + /// Asserts that this is the `DefId` of an associated item declared + /// in a trait, and returns the trait `DefId`. + pub fn assert_trait(&self) -> DefId { + match *self { + TraitContainer(id) => id, + _ => bug!("associated item has wrong container type: {:?}", self), + } + } + + pub fn id(&self) -> DefId { + match *self { + TraitContainer(id) => id, + ImplContainer(id) => id, + } + } +} + +#[derive(Copy, Clone, Debug, PartialEq, HashStable, Eq, Hash)] +pub struct AssocItem { + pub def_id: DefId, + #[stable_hasher(project(name))] + pub ident: Ident, + pub kind: AssocKind, + pub vis: Visibility, + pub defaultness: hir::Defaultness, + pub container: AssocItemContainer, + + /// Whether this is a method with an explicit self + /// as its first parameter, allowing method calls. + pub fn_has_self_parameter: bool, +} + +impl AssocItem { + pub fn signature(&self, tcx: TyCtxt<'_>) -> String { + match self.kind { + ty::AssocKind::Fn => { + // We skip the binder here because the binder would deanonymize all + // late-bound regions, and we don't want method signatures to show up + // `as for<'r> fn(&'r MyType)`. Pretty-printing handles late-bound + // regions just fine, showing `fn(&MyType)`. + tcx.fn_sig(self.def_id).skip_binder().to_string() + } + ty::AssocKind::Type => format!("type {};", self.ident), + ty::AssocKind::Const => { + format!("const {}: {:?};", self.ident, tcx.type_of(self.def_id)) + } + } + } +} + +#[derive(Copy, Clone, PartialEq, Debug, HashStable, Eq, Hash)] +pub enum AssocKind { + Const, + Fn, + Type, +} + +impl AssocKind { + pub fn namespace(&self) -> Namespace { + match *self { + ty::AssocKind::Type => Namespace::TypeNS, + ty::AssocKind::Const | ty::AssocKind::Fn => Namespace::ValueNS, + } + } + + pub fn as_def_kind(&self) -> DefKind { + match self { + AssocKind::Const => DefKind::AssocConst, + AssocKind::Fn => DefKind::AssocFn, + AssocKind::Type => DefKind::AssocTy, + } + } +} + +/// A list of `ty::AssocItem`s in definition order that allows for efficient lookup by name. +/// +/// When doing lookup by name, we try to postpone hygienic comparison for as long as possible since +/// it is relatively expensive. Instead, items are indexed by `Symbol` and hygienic comparison is +/// done only on items with the same name. +#[derive(Debug, Clone, PartialEq, HashStable)] +pub struct AssociatedItems<'tcx> { + pub(super) items: SortedIndexMultiMap, +} + +impl<'tcx> AssociatedItems<'tcx> { + /// Constructs an `AssociatedItems` map from a series of `ty::AssocItem`s in definition order. + pub fn new(items_in_def_order: impl IntoIterator) -> Self { + let items = items_in_def_order.into_iter().map(|item| (item.ident.name, item)).collect(); + AssociatedItems { items } + } + + /// Returns a slice of associated items in the order they were defined. + /// + /// New code should avoid relying on definition order. If you need a particular associated item + /// for a known trait, make that trait a lang item instead of indexing this array. + pub fn in_definition_order(&self) -> impl '_ + Iterator { + self.items.iter().map(|(_, v)| *v) + } + + pub fn len(&self) -> usize { + self.items.len() + } + + /// Returns an iterator over all associated items with the given name, ignoring hygiene. + pub fn filter_by_name_unhygienic( + &self, + name: Symbol, + ) -> impl '_ + Iterator { + self.items.get_by_key(&name).copied() + } + + /// Returns an iterator over all associated items with the given name. + /// + /// Multiple items may have the same name if they are in different `Namespace`s. For example, + /// an associated type can have the same name as a method. Use one of the `find_by_name_and_*` + /// methods below if you know which item you are looking for. + pub fn filter_by_name( + &'a self, + tcx: TyCtxt<'a>, + ident: Ident, + parent_def_id: DefId, + ) -> impl 'a + Iterator { + self.filter_by_name_unhygienic(ident.name) + .filter(move |item| tcx.hygienic_eq(ident, item.ident, parent_def_id)) + } + + /// Returns the associated item with the given name and `AssocKind`, if one exists. + pub fn find_by_name_and_kind( + &self, + tcx: TyCtxt<'_>, + ident: Ident, + kind: AssocKind, + parent_def_id: DefId, + ) -> Option<&ty::AssocItem> { + self.filter_by_name_unhygienic(ident.name) + .filter(|item| item.kind == kind) + .find(|item| tcx.hygienic_eq(ident, item.ident, parent_def_id)) + } + + /// Returns the associated item with the given name in the given `Namespace`, if one exists. + pub fn find_by_name_and_namespace( + &self, + tcx: TyCtxt<'_>, + ident: Ident, + ns: Namespace, + parent_def_id: DefId, + ) -> Option<&ty::AssocItem> { + self.filter_by_name_unhygienic(ident.name) + .filter(|item| item.kind.namespace() == ns) + .find(|item| tcx.hygienic_eq(ident, item.ident, parent_def_id)) + } +} diff --git a/compiler/rustc_middle/src/ty/closure.rs b/compiler/rustc_middle/src/ty/closure.rs new file mode 100644 index 0000000000..c31a882c27 --- /dev/null +++ b/compiler/rustc_middle/src/ty/closure.rs @@ -0,0 +1,388 @@ +use crate::hir::place::{ + Place as HirPlace, PlaceBase as HirPlaceBase, ProjectionKind as HirProjectionKind, +}; +use crate::ty; + +use rustc_data_structures::fx::{FxHashMap, FxIndexMap}; +use rustc_hir as hir; +use rustc_hir::def_id::{DefId, LocalDefId}; +use rustc_hir::lang_items::LangItem; +use rustc_span::Span; + +use super::{Ty, TyCtxt}; + +use self::BorrowKind::*; + +#[derive( + Clone, + Copy, + Debug, + PartialEq, + Eq, + Hash, + TyEncodable, + TyDecodable, + TypeFoldable, + HashStable +)] +pub struct UpvarPath { + pub hir_id: hir::HirId, +} + +/// Upvars do not get their own `NodeId`. Instead, we use the pair of +/// the original var ID (that is, the root variable that is referenced +/// by the upvar) and the ID of the closure expression. +#[derive(Clone, Copy, PartialEq, Eq, Hash, TyEncodable, TyDecodable, TypeFoldable, HashStable)] +pub struct UpvarId { + pub var_path: UpvarPath, + pub closure_expr_id: LocalDefId, +} + +impl UpvarId { + pub fn new(var_hir_id: hir::HirId, closure_def_id: LocalDefId) -> UpvarId { + UpvarId { var_path: UpvarPath { hir_id: var_hir_id }, closure_expr_id: closure_def_id } + } +} + +/// Information describing the capture of an upvar. This is computed +/// during `typeck`, specifically by `regionck`. +#[derive(PartialEq, Clone, Debug, Copy, TyEncodable, TyDecodable, TypeFoldable, HashStable)] +pub enum UpvarCapture<'tcx> { + /// Upvar is captured by value. This is always true when the + /// closure is labeled `move`, but can also be true in other cases + /// depending on inference. + /// + /// If the upvar was inferred to be captured by value (e.g. `move` + /// was not used), then the `Span` points to a usage that + /// required it. There may be more than one such usage + /// (e.g. `|| { a; a; }`), in which case we pick an + /// arbitrary one. + ByValue(Option), + + /// Upvar is captured by reference. + ByRef(UpvarBorrow<'tcx>), +} + +#[derive(PartialEq, Clone, Copy, TyEncodable, TyDecodable, TypeFoldable, HashStable)] +pub struct UpvarBorrow<'tcx> { + /// The kind of borrow: by-ref upvars have access to shared + /// immutable borrows, which are not part of the normal language + /// syntax. + pub kind: BorrowKind, + + /// Region of the resulting reference. + pub region: ty::Region<'tcx>, +} + +pub type UpvarListMap = FxHashMap>; +pub type UpvarCaptureMap<'tcx> = FxHashMap>; + +/// Given the closure DefId this map provides a map of root variables to minimum +/// set of `CapturedPlace`s that need to be tracked to support all captures of that closure. +pub type MinCaptureInformationMap<'tcx> = FxHashMap>; + +/// Part of `MinCaptureInformationMap`; Maps a root variable to the list of `CapturedPlace`. +/// Used to track the minimum set of `Place`s that need to be captured to support all +/// Places captured by the closure starting at a given root variable. +/// +/// This provides a convenient and quick way of checking if a variable being used within +/// a closure is a capture of a local variable. +pub type RootVariableMinCaptureList<'tcx> = FxIndexMap>; + +/// Part of `MinCaptureInformationMap`; List of `CapturePlace`s. +pub type MinCaptureList<'tcx> = Vec>; + +/// Represents the various closure traits in the language. This +/// will determine the type of the environment (`self`, in the +/// desugaring) argument that the closure expects. +/// +/// You can get the environment type of a closure using +/// `tcx.closure_env_ty()`. +#[derive(Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Hash, Debug, TyEncodable, TyDecodable)] +#[derive(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 + // hence we order it so that Fn < FnMut < FnOnce. + Fn, + FnMut, + FnOnce, +} + +impl<'tcx> ClosureKind { + // This is the initial value used when doing upvar inference. + pub const LATTICE_BOTTOM: ClosureKind = ClosureKind::Fn; + + pub fn trait_did(&self, tcx: TyCtxt<'tcx>) -> DefId { + match *self { + ClosureKind::Fn => tcx.require_lang_item(LangItem::Fn, None), + ClosureKind::FnMut => tcx.require_lang_item(LangItem::FnMut, None), + ClosureKind::FnOnce => tcx.require_lang_item(LangItem::FnOnce, None), + } + } + + /// Returns `true` if a type that impls this closure kind + /// must also implement `other`. + pub fn extends(self, other: ty::ClosureKind) -> bool { + matches!( + (self, other), + (ClosureKind::Fn, ClosureKind::Fn) + | (ClosureKind::Fn, ClosureKind::FnMut) + | (ClosureKind::Fn, ClosureKind::FnOnce) + | (ClosureKind::FnMut, ClosureKind::FnMut) + | (ClosureKind::FnMut, ClosureKind::FnOnce) + | (ClosureKind::FnOnce, ClosureKind::FnOnce) + ) + } + + /// Returns the representative scalar type for this closure kind. + /// See `TyS::to_opt_closure_kind` for more details. + pub fn to_ty(self, tcx: TyCtxt<'tcx>) -> Ty<'tcx> { + match self { + ty::ClosureKind::Fn => tcx.types.i8, + ty::ClosureKind::FnMut => tcx.types.i16, + ty::ClosureKind::FnOnce => tcx.types.i32, + } + } +} + +/// A composite describing a `Place` that is captured by a closure. +#[derive(PartialEq, Clone, Debug, TyEncodable, TyDecodable, TypeFoldable, HashStable)] +pub struct CapturedPlace<'tcx> { + /// The `Place` that is captured. + pub place: HirPlace<'tcx>, + + /// `CaptureKind` and expression(s) that resulted in such capture of `place`. + pub info: CaptureInfo<'tcx>, + + /// Represents if `place` can be mutated or not. + pub mutability: hir::Mutability, +} + +impl CapturedPlace<'tcx> { + /// Returns the hir-id of the root variable for the captured place. + /// e.g., if `a.b.c` was captured, would return the hir-id for `a`. + pub fn get_root_variable(&self) -> hir::HirId { + match self.place.base { + HirPlaceBase::Upvar(upvar_id) => upvar_id.var_path.hir_id, + base => bug!("Expected upvar, found={:?}", base), + } + } + + /// Returns the `LocalDefId` of the closure that captureed this Place + pub fn get_closure_local_def_id(&self) -> LocalDefId { + match self.place.base { + HirPlaceBase::Upvar(upvar_id) => upvar_id.closure_expr_id, + base => bug!("expected upvar, found={:?}", base), + } + } + + /// Return span pointing to use that resulted in selecting the current capture kind + pub fn get_capture_kind_span(&self, tcx: TyCtxt<'tcx>) -> Span { + if let Some(capture_kind_expr_id) = self.info.capture_kind_expr_id { + tcx.hir().span(capture_kind_expr_id) + } else if let Some(path_expr_id) = self.info.path_expr_id { + tcx.hir().span(path_expr_id) + } else { + // Fallback on upvars mentioned if neither path or capture expr id is captured + + // Safe to unwrap since we know this place is captured by the closure, therefore the closure must have upvars. + tcx.upvars_mentioned(self.get_closure_local_def_id()).unwrap() + [&self.get_root_variable()] + .span + } + } +} + +/// Return true if the `proj_possible_ancestor` represents an ancestor path +/// to `proj_capture` or `proj_possible_ancestor` is same as `proj_capture`, +/// assuming they both start off of the same root variable. +/// +/// **Note:** It's the caller's responsibility to ensure that both lists of projections +/// start off of the same root variable. +/// +/// Eg: 1. `foo.x` which is represented using `projections=[Field(x)]` is an ancestor of +/// `foo.x.y` which is represented using `projections=[Field(x), Field(y)]`. +/// Note both `foo.x` and `foo.x.y` start off of the same root variable `foo`. +/// 2. Since we only look at the projections here function will return `bar.x` as an a valid +/// ancestor of `foo.x.y`. It's the caller's responsibility to ensure that both projections +/// list are being applied to the same root variable. +pub fn is_ancestor_or_same_capture( + proj_possible_ancestor: &[HirProjectionKind], + proj_capture: &[HirProjectionKind], +) -> bool { + // We want to make sure `is_ancestor_or_same_capture("x.0.0", "x.0")` to return false. + // Therefore we can't just check if all projections are same in the zipped iterator below. + if proj_possible_ancestor.len() > proj_capture.len() { + return false; + } + + proj_possible_ancestor.iter().zip(proj_capture).all(|(a, b)| a == b) +} + +/// Part of `MinCaptureInformationMap`; describes the capture kind (&, &mut, move) +/// for a particular capture as well as identifying the part of the source code +/// that triggered this capture to occur. +#[derive(PartialEq, Clone, Debug, Copy, TyEncodable, TyDecodable, TypeFoldable, HashStable)] +pub struct CaptureInfo<'tcx> { + /// Expr Id pointing to use that resulted in selecting the current capture kind + /// + /// Eg: + /// ```rust,no_run + /// let mut t = (0,1); + /// + /// let c = || { + /// println!("{}",t); // L1 + /// t.1 = 4; // L2 + /// }; + /// ``` + /// `capture_kind_expr_id` will point to the use on L2 and `path_expr_id` will point to the + /// use on L1. + /// + /// If the user doesn't enable feature `capture_disjoint_fields` (RFC 2229) then, it is + /// possible that we don't see the use of a particular place resulting in capture_kind_expr_id being + /// None. In such case we fallback on uvpars_mentioned for span. + /// + /// Eg: + /// ```rust,no_run + /// let x = 5; + /// + /// let c = || { + /// let _ = x + /// }; + /// ``` + /// + /// In this example, if `capture_disjoint_fields` is **not** set, then x will be captured, + /// but we won't see it being used during capture analysis, since it's essentially a discard. + pub capture_kind_expr_id: Option, + /// Expr Id pointing to use that resulted the corresponding place being captured + /// + /// See `capture_kind_expr_id` for example. + /// + pub path_expr_id: Option, + + /// Capture mode that was selected + pub capture_kind: UpvarCapture<'tcx>, +} + +pub fn place_to_string_for_capture(tcx: TyCtxt<'tcx>, place: &HirPlace<'tcx>) -> String { + let name = match place.base { + HirPlaceBase::Upvar(upvar_id) => tcx.hir().name(upvar_id.var_path.hir_id).to_string(), + _ => bug!("Capture_information should only contain upvars"), + }; + let mut curr_string = name; + + for (i, proj) in place.projections.iter().enumerate() { + match proj.kind { + HirProjectionKind::Deref => { + curr_string = format!("*{}", curr_string); + } + HirProjectionKind::Field(idx, variant) => match place.ty_before_projection(i).kind() { + ty::Adt(def, ..) => { + curr_string = format!( + "{}.{}", + curr_string, + def.variants[variant].fields[idx as usize].ident.name.as_str() + ); + } + ty::Tuple(_) => { + curr_string = format!("{}.{}", curr_string, idx); + } + _ => { + bug!( + "Field projection applied to a type other than Adt or Tuple: {:?}.", + place.ty_before_projection(i).kind() + ) + } + }, + proj => bug!("{:?} unexpected because it isn't captured", proj), + } + } + + curr_string.to_string() +} + +#[derive(Clone, PartialEq, Debug, TyEncodable, TyDecodable, TypeFoldable, Copy, HashStable)] +pub enum BorrowKind { + /// Data must be immutable and is aliasable. + ImmBorrow, + + /// Data must be immutable but not aliasable. This kind of borrow + /// cannot currently be expressed by the user and is used only in + /// implicit closure bindings. It is needed when the closure + /// is borrowing or mutating a mutable referent, e.g.: + /// + /// ``` + /// let x: &mut isize = ...; + /// let y = || *x += 5; + /// ``` + /// + /// If we were to try to translate this closure into a more explicit + /// form, we'd encounter an error with the code as written: + /// + /// ``` + /// struct Env { x: & &mut isize } + /// let x: &mut isize = ...; + /// let y = (&mut Env { &x }, fn_ptr); // Closure is pair of env and fn + /// fn fn_ptr(env: &mut Env) { **env.x += 5; } + /// ``` + /// + /// This is then illegal because you cannot mutate a `&mut` found + /// in an aliasable location. To solve, you'd have to translate with + /// an `&mut` borrow: + /// + /// ``` + /// struct Env { x: & &mut isize } + /// let x: &mut isize = ...; + /// let y = (&mut Env { &mut x }, fn_ptr); // changed from &x to &mut x + /// fn fn_ptr(env: &mut Env) { **env.x += 5; } + /// ``` + /// + /// Now the assignment to `**env.x` is legal, but creating a + /// mutable pointer to `x` is not because `x` is not mutable. We + /// could fix this by declaring `x` as `let mut x`. This is ok in + /// user code, if awkward, but extra weird for closures, since the + /// borrow is hidden. + /// + /// So we introduce a "unique imm" borrow -- the referent is + /// immutable, but not aliasable. This solves the problem. For + /// simplicity, we don't give users the way to express this + /// borrow, it's just used when translating closures. + UniqueImmBorrow, + + /// Data is mutable and not aliasable. + MutBorrow, +} + +impl BorrowKind { + pub fn from_mutbl(m: hir::Mutability) -> BorrowKind { + match m { + hir::Mutability::Mut => MutBorrow, + hir::Mutability::Not => ImmBorrow, + } + } + + /// Returns a mutability `m` such that an `&m T` pointer could be used to obtain this borrow + /// kind. Because borrow kinds are richer than mutabilities, we sometimes have to pick a + /// mutability that is stronger than necessary so that it at least *would permit* the borrow in + /// question. + pub fn to_mutbl_lossy(self) -> hir::Mutability { + match self { + 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::Mut, + } + } + + pub fn to_user_str(&self) -> &'static str { + match *self { + MutBorrow => "mutable", + ImmBorrow => "immutable", + UniqueImmBorrow => "uniquely immutable", + } + } +} diff --git a/compiler/rustc_middle/src/ty/codec.rs b/compiler/rustc_middle/src/ty/codec.rs index 0dad5df485..f796534c2e 100644 --- a/compiler/rustc_middle/src/ty/codec.rs +++ b/compiler/rustc_middle/src/ty/codec.rs @@ -253,7 +253,7 @@ impl<'tcx, D: TyDecoder<'tcx>> Decodable for SubstsRef<'tcx> { fn decode(decoder: &mut D) -> Result { let len = decoder.read_usize()?; let tcx = decoder.tcx(); - Ok(tcx.mk_substs((0..len).map(|_| Decodable::decode(decoder)))?) + tcx.mk_substs((0..len).map(|_| Decodable::decode(decoder))) } } @@ -314,7 +314,7 @@ impl<'tcx, D: TyDecoder<'tcx>> RefDecodable<'tcx, D> for ty::AdtDef { impl<'tcx, D: TyDecoder<'tcx>> RefDecodable<'tcx, D> for ty::List> { fn decode(decoder: &mut D) -> Result<&'tcx Self, D::Error> { let len = decoder.read_usize()?; - Ok(decoder.tcx().mk_type_list((0..len).map(|_| Decodable::decode(decoder)))?) + decoder.tcx().mk_type_list((0..len).map(|_| Decodable::decode(decoder))) } } @@ -323,9 +323,7 @@ impl<'tcx, D: TyDecoder<'tcx>> RefDecodable<'tcx, D> { fn decode(decoder: &mut D) -> Result<&'tcx Self, D::Error> { let len = decoder.read_usize()?; - Ok(decoder - .tcx() - .mk_poly_existential_predicates((0..len).map(|_| Decodable::decode(decoder)))?) + decoder.tcx().mk_poly_existential_predicates((0..len).map(|_| Decodable::decode(decoder))) } } @@ -335,6 +333,16 @@ impl<'tcx, D: TyDecoder<'tcx>> RefDecodable<'tcx, D> for ty::Const<'tcx> { } } +impl<'tcx, D: TyDecoder<'tcx>> RefDecodable<'tcx, D> for [ty::ValTree<'tcx>] { + fn decode(decoder: &mut D) -> Result<&'tcx Self, D::Error> { + Ok(decoder.tcx().arena.alloc_from_iter( + (0..decoder.read_usize()?) + .map(|_| Decodable::decode(decoder)) + .collect::, _>>()?, + )) + } +} + impl<'tcx, D: TyDecoder<'tcx>> RefDecodable<'tcx, D> for Allocation { fn decode(decoder: &mut D) -> Result<&'tcx Self, D::Error> { Ok(decoder.tcx().intern_const_alloc(Decodable::decode(decoder)?)) diff --git a/compiler/rustc_middle/src/ty/consts.rs b/compiler/rustc_middle/src/ty/consts.rs index 041c040f0b..622f8e8ff6 100644 --- a/compiler/rustc_middle/src/ty/consts.rs +++ b/compiler/rustc_middle/src/ty/consts.rs @@ -10,9 +10,11 @@ use rustc_macros::HashStable; mod int; mod kind; +mod valtree; pub use int::*; pub use kind::*; +pub use valtree::*; /// Typed constant value. #[derive(Copy, Clone, Debug, Hash, TyEncodable, TyDecodable, Eq, PartialEq, Ord, PartialOrd)] @@ -23,7 +25,7 @@ pub struct Const<'tcx> { pub val: ConstKind<'tcx>, } -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(Const<'_>, 48); impl<'tcx> Const<'tcx> { @@ -55,7 +57,7 @@ impl<'tcx> Const<'tcx> { let lit_input = match expr.kind { hir::ExprKind::Lit(ref lit) => Some(LitToConstInput { lit: &lit.node, ty, neg: false }), - hir::ExprKind::Unary(hir::UnOp::UnNeg, ref expr) => match expr.kind { + hir::ExprKind::Unary(hir::UnOp::Neg, ref expr) => match expr.kind { hir::ExprKind::Lit(ref lit) => { Some(LitToConstInput { lit: &lit.node, ty, neg: true }) } diff --git a/compiler/rustc_middle/src/ty/consts/int.rs b/compiler/rustc_middle/src/ty/consts/int.rs index 63e95f25bb..8ed8ea6a0b 100644 --- a/compiler/rustc_middle/src/ty/consts/int.rs +++ b/compiler/rustc_middle/src/ty/consts/int.rs @@ -5,6 +5,8 @@ use rustc_target::abi::{Size, TargetDataLayout}; use std::convert::{TryFrom, TryInto}; use std::fmt; +use crate::ty::TyCtxt; + #[derive(Copy, Clone)] /// A type for representing any integer. Only used for printing. pub struct ConstInt { @@ -239,6 +241,11 @@ impl ScalarInt { Err(self.size()) } } + + #[inline] + pub fn try_to_machine_usize(&self, tcx: TyCtxt<'tcx>) -> Result { + Ok(self.to_bits(tcx.data_layout.pointer_size)? as u64) + } } macro_rules! from { @@ -277,6 +284,18 @@ macro_rules! try_from { from!(u8, u16, u32, u64, u128, bool); try_from!(u8, u16, u32, u64, u128); +impl TryFrom for bool { + type Error = Size; + #[inline] + fn try_from(int: ScalarInt) -> Result { + int.to_bits(Size::from_bytes(1)).and_then(|u| match u { + 0 => Ok(false), + 1 => Ok(true), + _ => Err(Size::from_bytes(1)), + }) + } +} + impl From for ScalarInt { #[inline] fn from(c: char) -> Self { diff --git a/compiler/rustc_middle/src/ty/consts/kind.rs b/compiler/rustc_middle/src/ty/consts/kind.rs index a2638d8bdd..43e22ce8f8 100644 --- a/compiler/rustc_middle/src/ty/consts/kind.rs +++ b/compiler/rustc_middle/src/ty/consts/kind.rs @@ -1,3 +1,5 @@ +use std::convert::TryInto; + use crate::mir::interpret::ConstValue; use crate::mir::interpret::Scalar; use crate::mir::Promoted; @@ -9,6 +11,8 @@ use rustc_hir::def_id::DefId; use rustc_macros::HashStable; use rustc_target::abi::Size; +use super::ScalarInt; + /// Represents a constant in Rust. #[derive(Copy, Clone, Debug, Eq, PartialEq, PartialOrd, Ord, TyEncodable, TyDecodable, Hash)] #[derive(HashStable)] @@ -37,7 +41,7 @@ pub enum ConstKind<'tcx> { Error(ty::DelaySpanBugEmitted), } -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(ConstKind<'_>, 40); impl<'tcx> ConstKind<'tcx> { @@ -51,14 +55,19 @@ impl<'tcx> ConstKind<'tcx> { self.try_to_value()?.try_to_scalar() } + #[inline] + pub fn try_to_scalar_int(self) -> Option { + Some(self.try_to_value()?.try_to_scalar()?.assert_int()) + } + #[inline] pub fn try_to_bits(self, size: Size) -> Option { - self.try_to_value()?.try_to_bits(size) + self.try_to_scalar_int()?.to_bits(size).ok() } #[inline] pub fn try_to_bool(self) -> Option { - self.try_to_value()?.try_to_bool() + self.try_to_scalar_int()?.try_into().ok() } #[inline] diff --git a/compiler/rustc_middle/src/ty/consts/valtree.rs b/compiler/rustc_middle/src/ty/consts/valtree.rs new file mode 100644 index 0000000000..f1b78c8763 --- /dev/null +++ b/compiler/rustc_middle/src/ty/consts/valtree.rs @@ -0,0 +1,34 @@ +use super::ScalarInt; +use rustc_macros::HashStable; + +#[derive(Copy, Clone, Debug, Hash, TyEncodable, TyDecodable, Eq, PartialEq, Ord, PartialOrd)] +#[derive(HashStable)] +/// This datastructure is used to represent the value of constants used in the type system. +/// +/// We explicitly choose a different datastructure from the way values are processed within +/// CTFE, as in the type system equal values (according to their `PartialEq`) must also have +/// equal representation (`==` on the rustc data structure, e.g. `ValTree`) and vice versa. +/// Since CTFE uses `AllocId` to represent pointers, it often happens that two different +/// `AllocId`s point to equal values. So we may end up with different representations for +/// two constants whose value is `&42`. Furthermore any kind of struct that has padding will +/// have arbitrary values within that padding, even if the values of the struct are the same. +/// +/// `ValTree` does not have this problem with representation, as it only contains integers or +/// lists of (nested) `ValTree`. +pub enum ValTree<'tcx> { + /// ZSTs, integers, `bool`, `char` are represented as scalars. + /// See the `ScalarInt` documentation for how `ScalarInt` guarantees that equal values + /// of these types have the same representation. + Leaf(ScalarInt), + /// The fields of any kind of aggregate. Structs, tuples and arrays are represented by + /// listing their fields' values in order. + /// Enums are represented by storing their discriminant as a field, followed by all + /// the fields of the variant. + Branch(&'tcx [ValTree<'tcx>]), +} + +impl ValTree<'tcx> { + pub fn zst() -> Self { + Self::Branch(&[]) + } +} diff --git a/compiler/rustc_middle/src/ty/context.rs b/compiler/rustc_middle/src/ty/context.rs index 1255302f74..41a8bc10c8 100644 --- a/compiler/rustc_middle/src/ty/context.rs +++ b/compiler/rustc_middle/src/ty/context.rs @@ -14,7 +14,7 @@ use crate::middle::stability; use crate::mir::interpret::{self, Allocation, ConstValue, Scalar}; use crate::mir::{Body, Field, Local, Place, PlaceElem, ProjectionKind, Promoted}; use crate::traits; -use crate::ty::query::{self, TyCtxtAt}; +use crate::ty::query::{self, OnDiskCache, TyCtxtAt}; use crate::ty::subst::{GenericArg, GenericArgKind, InternalSubsts, Subst, SubstsRef, UserSubsts}; use crate::ty::TyKind::*; use crate::ty::{ @@ -30,9 +30,7 @@ use rustc_attr as attr; 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::{ - hash_stable_hashmap, HashStable, StableHasher, StableVec, -}; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher, StableVec}; use rustc_data_structures::steal::Steal; use rustc_data_structures::sync::{self, Lock, Lrc, WorkerLocal}; use rustc_errors::ErrorReported; @@ -47,12 +45,13 @@ use rustc_hir::{ }; use rustc_index::vec::{Idx, IndexVec}; use rustc_macros::HashStable; +use rustc_middle::mir::FakeReadCause; use rustc_serialize::opaque::{FileEncodeResult, FileEncoder}; use rustc_session::config::{BorrowckMode, CrateType, OutputFilenames}; use rustc_session::lint::{Level, Lint}; use rustc_session::Session; use rustc_span::source_map::MultiSpan; -use rustc_span::symbol::{kw, sym, Symbol}; +use rustc_span::symbol::{kw, sym, Ident, Symbol}; use rustc_span::{Span, DUMMY_SP}; use rustc_target::abi::{Layout, TargetDataLayout, VariantIdx}; use rustc_target::spec::abi; @@ -94,6 +93,8 @@ pub struct CtxtInterners<'tcx> { projs: InternedSet<'tcx, List>, place_elems: InternedSet<'tcx, List>>, const_: InternedSet<'tcx, Const<'tcx>>, + /// Const allocations. + allocation: InternedSet<'tcx, Allocation>, } impl<'tcx> CtxtInterners<'tcx> { @@ -111,6 +112,7 @@ impl<'tcx> CtxtInterners<'tcx> { projs: Default::default(), place_elems: Default::default(), const_: Default::default(), + allocation: Default::default(), } } @@ -206,19 +208,26 @@ 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. +#[inline] fn validate_hir_id_for_typeck_results(hir_owner: LocalDefId, hir_id: hir::HirId) { if hir_id.owner != hir_owner { - ty::tls::with(|tcx| { - bug!( - "node {} with HirId::owner {:?} cannot be placed in TypeckResults with hir_owner {:?}", - tcx.hir().node_to_string(hir_id), - hir_id.owner, - hir_owner - ) - }); + invalid_hir_id_for_typeck_results(hir_owner, hir_id); } } +#[cold] +#[inline(never)] +fn invalid_hir_id_for_typeck_results(hir_owner: LocalDefId, hir_id: hir::HirId) { + ty::tls::with(|tcx| { + bug!( + "node {} with HirId::owner {:?} cannot be placed in TypeckResults with hir_owner {:?}", + tcx.hir().node_to_string(hir_id), + hir_id.owner, + hir_owner + ) + }); +} + impl<'a, V> LocalTableInContext<'a, V> { pub fn contains_key(&self, id: hir::HirId) -> bool { validate_hir_id_for_typeck_results(self.hir_owner, id); @@ -375,9 +384,6 @@ pub struct TypeckResults<'tcx> { /// pat_adjustments: ItemLocalMap>>, - /// Borrows - pub upvar_capture_map: ty::UpvarCaptureMap<'tcx>, - /// Records the reasons that we picked the kind of each closure; /// not all closures are present in the map. closure_kind_origins: ItemLocalMap<(Span, HirPlace<'tcx>)>, @@ -413,16 +419,34 @@ pub struct TypeckResults<'tcx> { /// by this function. pub concrete_opaque_types: FxHashMap>, - /// Given the closure ID this map provides the list of UpvarIDs used by it. - /// The upvarID contains the HIR node ID and it also contains the full path - /// leading to the member of the struct or tuple that is used instead of the - /// entire variable. - pub closure_captures: ty::UpvarListMap, - /// Tracks the minimum captures required for a closure; /// see `MinCaptureInformationMap` for more details. pub closure_min_captures: ty::MinCaptureInformationMap<'tcx>, + /// Tracks the fake reads required for a closure and the reason for the fake read. + /// When performing pattern matching for closures, there are times we don't end up + /// reading places that are mentioned in a closure (because of _ patterns). However, + /// to ensure the places are initialized, we introduce fake reads. + /// Consider these two examples: + /// ``` (discriminant matching with only wildcard arm) + /// let x: u8; + /// let c = || match x { _ => () }; + /// ``` + /// In this example, we don't need to actually read/borrow `x` in `c`, and so we don't + /// want to capture it. However, we do still want an error here, because `x` should have + /// to be initialized at the point where c is created. Therefore, we add a "fake read" + /// instead. + /// ``` (destructured assignments) + /// let c = || { + /// let (t1, t2) = t; + /// } + /// ``` + /// In the second example, we capture the disjoint fields of `t` (`t.0` & `t.1`), but + /// we never capture `t`. This becomes an issue when we build MIR as we require + /// information on `t` in order to create place `t.0` and `t.1`. We can solve this + /// issue by fake reading `t`. + pub closure_fake_reads: FxHashMap, FakeReadCause, hir::HirId)>>, + /// 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: ty::Binder>>, @@ -447,7 +471,6 @@ impl<'tcx> TypeckResults<'tcx> { adjustments: Default::default(), pat_binding_modes: Default::default(), pat_adjustments: Default::default(), - upvar_capture_map: Default::default(), closure_kind_origins: Default::default(), liberated_fn_sigs: Default::default(), fru_field_types: Default::default(), @@ -455,8 +478,8 @@ impl<'tcx> TypeckResults<'tcx> { used_trait_imports: Lrc::new(Default::default()), tainted_by_errors: None, concrete_opaque_types: Default::default(), - closure_captures: Default::default(), closure_min_captures: Default::default(), + closure_fake_reads: Default::default(), generator_interior_types: ty::Binder::dummy(Default::default()), treat_byte_string_as_slice: Default::default(), } @@ -639,10 +662,6 @@ impl<'tcx> TypeckResults<'tcx> { .flatten() } - pub fn upvar_capture(&self, upvar_id: ty::UpvarId) -> ty::UpvarCapture<'tcx> { - self.upvar_capture_map[&upvar_id] - } - pub fn closure_kind_origins(&self) -> LocalTableInContext<'_, (Span, HirPlace<'tcx>)> { LocalTableInContext { hir_owner: self.hir_owner, data: &self.closure_kind_origins } } @@ -696,23 +715,22 @@ impl<'a, 'tcx> HashStable> for TypeckResults<'tcx> { ref adjustments, ref pat_binding_modes, ref pat_adjustments, - ref upvar_capture_map, ref closure_kind_origins, ref liberated_fn_sigs, ref fru_field_types, - ref coercion_casts, - ref used_trait_imports, tainted_by_errors, ref concrete_opaque_types, - ref closure_captures, ref closure_min_captures, + ref closure_fake_reads, ref generator_interior_types, ref treat_byte_string_as_slice, } = *self; hcx.with_node_id_hashing_mode(NodeIdHashingMode::HashDefPath, |hcx| { + hcx.local_def_path_hash(hir_owner); + type_dependent_defs.hash_stable(hcx, hasher); field_indices.hash_stable(hcx, hasher); user_provided_types.hash_stable(hcx, hasher); @@ -722,17 +740,6 @@ impl<'a, 'tcx> HashStable> for TypeckResults<'tcx> { adjustments.hash_stable(hcx, hasher); 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; - - assert_eq!(var_path.hir_id.owner, hir_owner); - - ( - hcx.local_def_path_hash(var_path.hir_id.owner), - var_path.hir_id.local_id, - hcx.local_def_path_hash(closure_expr_id), - ) - }); closure_kind_origins.hash_stable(hcx, hasher); liberated_fn_sigs.hash_stable(hcx, hasher); @@ -741,8 +748,8 @@ impl<'a, 'tcx> HashStable> for TypeckResults<'tcx> { used_trait_imports.hash_stable(hcx, hasher); tainted_by_errors.hash_stable(hcx, hasher); concrete_opaque_types.hash_stable(hcx, hasher); - closure_captures.hash_stable(hcx, hasher); closure_min_captures.hash_stable(hcx, hasher); + closure_fake_reads.hash_stable(hcx, hasher); generator_interior_types.hash_stable(hcx, hasher); treat_byte_string_as_slice.hash_stable(hcx, hasher); }) @@ -962,7 +969,14 @@ pub struct GlobalCtxt<'tcx> { pub(crate) untracked_crate: &'tcx hir::Crate<'tcx>, pub(crate) definitions: &'tcx Definitions, - pub queries: query::Queries<'tcx>, + /// This provides access to the incremental compilation on-disk cache for query results. + /// Do not access this directly. It is only meant to be used by + /// `DepGraph::try_mark_green()` and the query infrastructure. + /// This is `None` if we are not incremental compilation mode + pub on_disk_cache: Option>, + + pub queries: &'tcx dyn query::QueryEngine<'tcx>, + pub query_caches: query::QueryCaches<'tcx>, maybe_unused_trait_imports: FxHashSet, maybe_unused_extern_crates: Vec<(LocalDefId, Span)>, @@ -999,9 +1013,6 @@ pub struct GlobalCtxt<'tcx> { /// `#[rustc_const_stable]` and `#[rustc_const_unstable]` attributes const_stability_interner: ShardedHashMap<&'tcx attr::ConstStability, ()>, - /// Stores the value of constants (and deduplicates the actual memory) - allocation_interner: ShardedHashMap<&'tcx Allocation, ()>, - /// Stores memory for globals (statics/consts). pub(crate) alloc_map: Lock>, @@ -1044,7 +1055,10 @@ 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.interners + .allocation + .intern(alloc, |alloc| Interned(self.interners.arena.alloc(alloc))) + .0 } /// Allocates a read-only byte or string literal for `mir::interpret`. @@ -1077,13 +1091,16 @@ impl<'tcx> TyCtxt<'tcx> { None => return Bound::Unbounded, }; debug!("layout_scalar_valid_range: attr={:?}", attr); - for meta in attr.meta_item_list().expect("rustc_layout_scalar_valid_range takes args") { - match meta.literal().expect("attribute takes lit").kind { - ast::LitKind::Int(a, _) => return Bound::Included(a), - _ => span_bug!(attr.span, "rustc_layout_scalar_valid_range expects int arg"), - } + if let Some( + &[ast::NestedMetaItem::Literal(ast::Lit { kind: ast::LitKind::Int(a, _), .. })], + ) = attr.meta_item_list().as_deref() + { + Bound::Included(a) + } else { + self.sess + .delay_span_bug(attr.span, "invalid rustc_layout_scalar_valid_range attribute"); + Bound::Unbounded } - span_bug!(attr.span, "no arguments to `rustc_layout_scalar_valid_range` attribute"); }; ( get(sym::rustc_layout_scalar_valid_range_start), @@ -1102,14 +1119,13 @@ impl<'tcx> TyCtxt<'tcx> { pub fn create_global_ctxt( s: &'tcx Session, lint_store: Lrc, - local_providers: ty::query::Providers, - extern_providers: ty::query::Providers, arena: &'tcx WorkerLocal>, resolutions: ty::ResolverOutputs, krate: &'tcx hir::Crate<'tcx>, definitions: &'tcx Definitions, dep_graph: DepGraph, - on_disk_query_result_cache: Option>, + on_disk_cache: Option>, + queries: &'tcx dyn query::QueryEngine<'tcx>, crate_name: &str, output_filenames: &OutputFilenames, ) -> GlobalCtxt<'tcx> { @@ -1121,10 +1137,6 @@ impl<'tcx> TyCtxt<'tcx> { let common_lifetimes = CommonLifetimes::new(&interners); let common_consts = CommonConsts::new(&interners, &common_types); let cstore = resolutions.cstore; - let crates = cstore.crates_untracked(); - let max_cnum = crates.iter().map(|c| c.as_usize()).max().unwrap_or(0); - let mut providers = IndexVec::from_elem_n(extern_providers, max_cnum + 1); - providers[LOCAL_CRATE] = local_providers; let mut trait_map: FxHashMap<_, FxHashMap<_, _>> = FxHashMap::default(); for (hir_id, v) in krate.trait_map.iter() { @@ -1153,7 +1165,9 @@ impl<'tcx> TyCtxt<'tcx> { extern_prelude: resolutions.extern_prelude, untracked_crate: krate, definitions, - queries: query::Queries::new(providers, extern_providers, on_disk_query_result_cache), + on_disk_cache, + queries, + query_caches: query::QueryCaches::default(), ty_rcache: Default::default(), pred_rcache: Default::default(), selection_cache: Default::default(), @@ -1163,7 +1177,6 @@ impl<'tcx> TyCtxt<'tcx> { layout_interner: Default::default(), stability_interner: Default::default(), const_stability_interner: Default::default(), - allocation_interner: Default::default(), alloc_map: Lock::new(interpret::AllocMap::new()), output_filenames: Arc::new(output_filenames.clone()), } @@ -1318,7 +1331,7 @@ impl<'tcx> TyCtxt<'tcx> { } pub fn serialize_query_result_cache(self, encoder: &mut FileEncoder) -> FileEncodeResult { - self.queries.on_disk_cache.as_ref().map_or(Ok(()), |c| c.serialize(self, encoder)) + self.on_disk_cache.as_ref().map_or(Ok(()), |c| c.serialize(self, encoder)) } /// If `true`, we should use the MIR-based borrowck, but also @@ -1599,6 +1612,7 @@ macro_rules! nop_list_lift { nop_lift! {type_; Ty<'a> => Ty<'tcx>} nop_lift! {region; Region<'a> => Region<'tcx>} nop_lift! {const_; &'a Const<'a> => &'tcx Const<'tcx>} +nop_lift! {allocation; &'a Allocation => &'tcx Allocation} nop_lift! {predicate; &'a PredicateInner<'a> => &'tcx PredicateInner<'tcx>} nop_list_lift! {type_list; Ty<'a> => Ty<'tcx>} @@ -1889,7 +1903,7 @@ impl<'tcx> TyCtxt<'tcx> { "Const Stability interner: #{}", self.0.const_stability_interner.len() )?; - writeln!(fmt, "Allocation interner: #{}", self.0.allocation_interner.len())?; + writeln!(fmt, "Allocation interner: #{}", self.0.interners.allocation.len())?; writeln!(fmt, "Layout interner: #{}", self.0.layout_interner.len())?; Ok(()) @@ -1990,6 +2004,26 @@ impl<'tcx> Borrow> for Interned<'tcx, Const<'tcx>> { } } +impl<'tcx> Borrow for Interned<'tcx, Allocation> { + fn borrow<'a>(&'a self) -> &'a Allocation { + &self.0 + } +} + +impl<'tcx> PartialEq for Interned<'tcx, Allocation> { + fn eq(&self, other: &Self) -> bool { + self.0 == other.0 + } +} + +impl<'tcx> Eq for Interned<'tcx, Allocation> {} + +impl<'tcx> Hash for Interned<'tcx, Allocation> { + fn hash(&self, s: &mut H) { + self.0.hash(s) + } +} + macro_rules! direct_interners { ($($name:ident: $method:ident($ty:ty),)+) => { $(impl<'tcx> PartialEq for Interned<'tcx, $ty> { @@ -2053,6 +2087,42 @@ impl<'tcx> TyCtxt<'tcx> { self.mk_fn_ptr(sig.map_bound(|sig| ty::FnSig { unsafety: hir::Unsafety::Unsafe, ..sig })) } + /// Given the def_id of a Trait `trait_def_id` and the name of an associated item `assoc_name` + /// returns true if the `trait_def_id` defines an associated item of name `assoc_name`. + pub fn trait_may_define_assoc_type(self, trait_def_id: DefId, assoc_name: Ident) -> bool { + self.super_traits_of(trait_def_id).any(|trait_did| { + self.associated_items(trait_did) + .find_by_name_and_kind(self, assoc_name, ty::AssocKind::Type, trait_did) + .is_some() + }) + } + + /// Computes the def-ids of the transitive super-traits of `trait_def_id`. This (intentionally) + /// does not compute the full elaborated super-predicates but just the set of def-ids. It is used + /// to identify which traits may define a given associated type to help avoid cycle errors. + /// Returns a `DefId` iterator. + fn super_traits_of(self, trait_def_id: DefId) -> impl Iterator + 'tcx { + let mut set = FxHashSet::default(); + let mut stack = vec![trait_def_id]; + + set.insert(trait_def_id); + + iter::from_fn(move || -> Option { + let trait_did = stack.pop()?; + let generic_predicates = self.super_predicates_of(trait_did); + + for (predicate, _) in generic_predicates.predicates { + if let ty::PredicateKind::Trait(data, _) = predicate.kind().skip_binder() { + if set.insert(data.def_id()) { + stack.push(data.def_id()); + } + } + } + + Some(trait_did) + }) + } + /// Given a closure signature, returns an equivalent fn signature. Detuples /// and so forth -- so e.g., if we have a sig with `Fn<(u32, i32)>` then /// you would get a `fn(u32, i32)`. diff --git a/compiler/rustc_middle/src/ty/diagnostics.rs b/compiler/rustc_middle/src/ty/diagnostics.rs index 4a131a4ec0..982c8a354b 100644 --- a/compiler/rustc_middle/src/ty/diagnostics.rs +++ b/compiler/rustc_middle/src/ty/diagnostics.rs @@ -75,6 +75,36 @@ impl<'tcx> TyS<'tcx> { } } +pub fn suggest_arbitrary_trait_bound( + generics: &hir::Generics<'_>, + err: &mut DiagnosticBuilder<'_>, + param_name: &str, + constraint: &str, +) -> bool { + let param = generics.params.iter().find(|p| p.name.ident().as_str() == param_name); + match (param, param_name) { + (Some(_), "Self") => return false, + _ => {} + } + // Suggest a where clause bound for a non-type paremeter. + let (action, prefix) = if generics.where_clause.predicates.is_empty() { + ("introducing a", " where ") + } else { + ("extending the", ", ") + }; + err.span_suggestion_verbose( + generics.where_clause.tail_span_for_suggestion(), + &format!( + "consider {} `where` bound, but there might be an alternative better way to express \ + this requirement", + action, + ), + format!("{}{}: {}", prefix, param_name, constraint), + Applicability::MaybeIncorrect, + ); + true +} + /// Suggest restricting a type param with a new bound. pub fn suggest_constraining_type_param( tcx: TyCtxt<'_>, @@ -284,12 +314,13 @@ impl<'v> hir::intravisit::Visitor<'v> for TraitObjectVisitor<'v> { hir::LifetimeName::ImplicitObjectLifetimeDefault | hir::LifetimeName::Static, .. }, + _, ) => { self.0.push(ty); } hir::TyKind::OpaqueDef(item_id, _) => { self.0.push(ty); - let item = self.1.expect_item(item_id.id); + let item = self.1.item(item_id); hir::intravisit::walk_item(self, item); } _ => {} diff --git a/compiler/rustc_middle/src/ty/error.rs b/compiler/rustc_middle/src/ty/error.rs index 1669c59d7f..f19cc99844 100644 --- a/compiler/rustc_middle/src/ty/error.rs +++ b/compiler/rustc_middle/src/ty/error.rs @@ -1,5 +1,6 @@ use crate::traits::{ObligationCause, ObligationCauseCode}; use crate::ty::diagnostics::suggest_constraining_type_param; +use crate::ty::print::{FmtPrinter, Printer}; use crate::ty::{self, BoundRegionKind, Region, Ty, TyCtxt}; use rustc_errors::Applicability::{MachineApplicable, MaybeIncorrect}; use rustc_errors::{pluralize, DiagnosticBuilder}; @@ -11,7 +12,6 @@ use rustc_target::spec::abi; use std::borrow::Cow; use std::fmt; -use std::ops::Deref; #[derive(Clone, Copy, Debug, PartialEq, Eq, TypeFoldable)] pub struct ExpectedFound { @@ -228,12 +228,17 @@ impl<'tcx> ty::TyS<'tcx> { ty::Adt(def, _) => format!("{} `{}`", def.descr(), tcx.def_path_str(def.did)).into(), ty::Foreign(def_id) => format!("extern type `{}`", tcx.def_path_str(def_id)).into(), ty::Array(t, n) => { + if t.is_simple_ty() { + return format!("array `{}`", self).into(); + } + let n = tcx.lift(n).unwrap(); - match n.try_eval_usize(tcx, ty::ParamEnv::empty()) { - _ if t.is_simple_ty() => format!("array `{}`", self).into(), - Some(n) => format!("array of {} element{}", n, pluralize!(n)).into(), - None => "array".into(), + if let ty::ConstKind::Value(v) = n.val { + if let Some(n) = v.try_to_machine_usize(tcx) { + return format!("array of {} element{}", n, pluralize!(n)).into(); + } } + "array".into() } ty::Slice(ty) if ty.is_simple_ty() => format!("slice `{}`", self).into(), ty::Slice(_) => "slice".into(), @@ -264,7 +269,7 @@ impl<'tcx> ty::TyS<'tcx> { } } ty::Closure(..) => "closure".into(), - ty::Generator(..) => "generator".into(), + ty::Generator(def_id, ..) => tcx.generator_kind(def_id).unwrap().descr().into(), ty::GeneratorWitness(..) => "generator witness".into(), ty::Tuple(..) => "tuple".into(), ty::Infer(ty::TyVar(_)) => "inferred type".into(), @@ -282,7 +287,7 @@ impl<'tcx> ty::TyS<'tcx> { } } - pub fn prefix_string(&self) -> Cow<'static, str> { + pub fn prefix_string(&self, tcx: TyCtxt<'_>) -> Cow<'static, str> { match *self.kind() { ty::Infer(_) | ty::Error(_) @@ -308,7 +313,7 @@ impl<'tcx> ty::TyS<'tcx> { ty::FnPtr(_) => "fn pointer".into(), ty::Dynamic(..) => "trait object".into(), ty::Closure(..) => "closure".into(), - ty::Generator(..) => "generator".into(), + ty::Generator(def_id, ..) => tcx.generator_kind(def_id).unwrap().descr().into(), ty::GeneratorWitness(..) => "generator witness".into(), ty::Tuple(..) => "tuple".into(), ty::Placeholder(..) => "higher-ranked type".into(), @@ -400,14 +405,22 @@ impl<'tcx> TyCtxt<'tcx> { { // Synthesize the associated type restriction `Add`. // FIXME: extract this logic for use in other diagnostics. - let trait_ref = proj.trait_ref(self); + let (trait_ref, assoc_substs) = proj.trait_ref_and_own_substs(self); let path = self.def_path_str_with_substs(trait_ref.def_id, trait_ref.substs); let item_name = self.item_name(proj.item_def_id); + let item_args = self.format_generic_args(assoc_substs); + let path = if path.ends_with('>') { - format!("{}, {} = {}>", &path[..path.len() - 1], item_name, p) + format!( + "{}, {}{} = {}>", + &path[..path.len() - 1], + item_name, + item_args, + p + ) } else { - format!("{}<{} = {}>", path, item_name, p) + format!("{}<{}{} = {}>", path, item_name, item_args, p) }; note = !suggest_constraining_type_param( self, @@ -534,7 +547,6 @@ impl Trait for X { TargetFeatureCast(def_id) => { let attrs = self.get_attrs(*def_id); let target_spans = attrs - .deref() .iter() .filter(|attr| attr.has_name(sym::target_feature)) .map(|attr| attr.span); @@ -556,7 +568,7 @@ impl Trait for X { ty: Ty<'tcx>, ) -> bool { let assoc = self.associated_item(proj_ty.item_def_id); - let trait_ref = proj_ty.trait_ref(self); + let (trait_ref, assoc_substs) = proj_ty.trait_ref_and_own_substs(self); if let Some(item) = self.hir().get_if_local(body_owner_def_id) { if let Some(hir_generics) = item.generics() { // Get the `DefId` for the type parameter corresponding to `A` in `::Foo`. @@ -590,6 +602,7 @@ impl Trait for X { &trait_ref, pred.bounds, &assoc, + assoc_substs, ty, msg, ) { @@ -607,6 +620,7 @@ impl Trait for X { &trait_ref, param.bounds, &assoc, + assoc_substs, ty, msg, ); @@ -692,6 +706,7 @@ impl Trait for X { db, self.def_span(def_id), &assoc, + proj_ty.trait_ref_and_own_substs(self).1, values.found, &msg, ) { @@ -816,7 +831,7 @@ fn foo(&self) -> Self::T { String::new() } // an assoc type as a return type (#72076). if let hir::Defaultness::Default { has_value: true } = item.defaultness { - if self.type_of(self.hir().local_def_id(item.id.hir_id)) == found { + if self.type_of(item.id.def_id) == found { db.span_label( item.span, "associated type defaults can't be assumed inside the \ @@ -836,7 +851,7 @@ fn foo(&self) -> Self::T { String::new() } })) => { for item in &items[..] { if let hir::AssocItemKind::Type = item.kind { - if self.type_of(self.hir().local_def_id(item.id.hir_id)) == found { + if self.type_of(item.id.def_id) == found { db.span_label(item.span, "expected this associated type"); return true; } @@ -856,6 +871,7 @@ fn foo(&self) -> Self::T { String::new() } trait_ref: &ty::TraitRef<'tcx>, bounds: hir::GenericBounds<'_>, assoc: &ty::AssocItem, + assoc_substs: &[ty::GenericArg<'tcx>], ty: Ty<'tcx>, msg: &str, ) -> bool { @@ -865,7 +881,12 @@ fn foo(&self) -> Self::T { String::new() } // Relate the type param against `T` in `::Foo`. ptr.trait_ref.trait_def_id() == Some(trait_ref.def_id) && self.constrain_associated_type_structured_suggestion( - db, ptr.span, assoc, ty, msg, + db, + ptr.span, + assoc, + assoc_substs, + ty, + msg, ) } _ => false, @@ -879,6 +900,7 @@ fn foo(&self) -> Self::T { String::new() } db: &mut DiagnosticBuilder<'_>, span: Span, assoc: &ty::AssocItem, + assoc_substs: &[ty::GenericArg<'tcx>], ty: Ty<'tcx>, msg: &str, ) -> bool { @@ -890,11 +912,20 @@ fn foo(&self) -> Self::T { String::new() } let span = Span::new(pos, pos, span.ctxt()); (span, format!(", {} = {}", assoc.ident, ty)) } else { - (span.shrink_to_hi(), format!("<{} = {}>", assoc.ident, ty)) + let item_args = self.format_generic_args(assoc_substs); + (span.shrink_to_hi(), format!("<{}{} = {}>", assoc.ident, item_args, ty)) }; db.span_suggestion_verbose(span, msg, sugg, MaybeIncorrect); return true; } false } + + fn format_generic_args(self, args: &[ty::GenericArg<'tcx>]) -> String { + let mut item_args = String::new(); + FmtPrinter::new(self, &mut item_args, hir::def::Namespace::TypeNS) + .path_generic_args(Ok, args) + .expect("could not write to `String`."); + item_args + } } diff --git a/compiler/rustc_middle/src/ty/fold.rs b/compiler/rustc_middle/src/ty/fold.rs index 382f3708c3..a6a1d1f73b 100644 --- a/compiler/rustc_middle/src/ty/fold.rs +++ b/compiler/rustc_middle/src/ty/fold.rs @@ -439,18 +439,18 @@ struct BoundVarReplacer<'a, 'tcx> { /// the ones we have visited. current_index: ty::DebruijnIndex, - fld_r: &'a mut (dyn FnMut(ty::BoundRegion) -> ty::Region<'tcx> + 'a), - fld_t: &'a mut (dyn FnMut(ty::BoundTy) -> Ty<'tcx> + 'a), - fld_c: &'a mut (dyn FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::Const<'tcx> + 'a), + fld_r: Option<&'a mut (dyn FnMut(ty::BoundRegion) -> ty::Region<'tcx> + 'a)>, + fld_t: Option<&'a mut (dyn FnMut(ty::BoundTy) -> Ty<'tcx> + 'a)>, + fld_c: Option<&'a mut (dyn FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::Const<'tcx> + 'a)>, } impl<'a, 'tcx> BoundVarReplacer<'a, 'tcx> { - fn new(tcx: TyCtxt<'tcx>, fld_r: &'a mut F, fld_t: &'a mut G, fld_c: &'a mut H) -> Self - where - F: FnMut(ty::BoundRegion) -> ty::Region<'tcx>, - G: FnMut(ty::BoundTy) -> Ty<'tcx>, - H: FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::Const<'tcx>, - { + fn new( + tcx: TyCtxt<'tcx>, + fld_r: Option<&'a mut (dyn FnMut(ty::BoundRegion) -> ty::Region<'tcx> + 'a)>, + fld_t: Option<&'a mut (dyn FnMut(ty::BoundTy) -> Ty<'tcx> + 'a)>, + fld_c: Option<&'a mut (dyn FnMut(ty::BoundVar, Ty<'tcx>) -> &'tcx ty::Const<'tcx> + 'a)>, + ) -> Self { BoundVarReplacer { tcx, current_index: ty::INNERMOST, fld_r, fld_t, fld_c } } } @@ -469,63 +469,58 @@ impl<'a, 'tcx> TypeFolder<'tcx> for BoundVarReplacer<'a, 'tcx> { fn fold_ty(&mut self, t: Ty<'tcx>) -> Ty<'tcx> { match *t.kind() { - ty::Bound(debruijn, bound_ty) => { - if debruijn == self.current_index { - let fld_t = &mut self.fld_t; + ty::Bound(debruijn, bound_ty) if debruijn == self.current_index => { + if let Some(fld_t) = self.fld_t.as_mut() { let ty = fld_t(bound_ty); - ty::fold::shift_vars(self.tcx, &ty, self.current_index.as_u32()) - } else { - t + return ty::fold::shift_vars(self.tcx, &ty, self.current_index.as_u32()); } } - _ => { - if !t.has_vars_bound_at_or_above(self.current_index) { - // Nothing more to substitute. - t - } else { - t.super_fold_with(self) - } + _ if t.has_vars_bound_at_or_above(self.current_index) => { + return t.super_fold_with(self); } + _ => {} } + t } fn fold_region(&mut self, r: ty::Region<'tcx>) -> ty::Region<'tcx> { match *r { ty::ReLateBound(debruijn, br) if debruijn == self.current_index => { - let fld_r = &mut self.fld_r; - let region = fld_r(br); - if let ty::ReLateBound(debruijn1, br) = *region { - // If the callback returns a late-bound region, - // that region should always use the INNERMOST - // debruijn index. Then we adjust it to the - // correct depth. - assert_eq!(debruijn1, ty::INNERMOST); - self.tcx.mk_region(ty::ReLateBound(debruijn, br)) - } else { - region + if let Some(fld_r) = self.fld_r.as_mut() { + let region = fld_r(br); + return if let ty::ReLateBound(debruijn1, br) = *region { + // If the callback returns a late-bound region, + // that region should always use the INNERMOST + // debruijn index. Then we adjust it to the + // correct depth. + assert_eq!(debruijn1, ty::INNERMOST); + self.tcx.mk_region(ty::ReLateBound(debruijn, br)) + } else { + region + }; } } - _ => r, + _ => {} } + r } fn fold_const(&mut self, ct: &'tcx ty::Const<'tcx>) -> &'tcx ty::Const<'tcx> { - if let ty::Const { val: ty::ConstKind::Bound(debruijn, bound_const), ty } = *ct { - 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()) - } else { - ct + match *ct { + ty::Const { val: ty::ConstKind::Bound(debruijn, bound_const), ty } + if debruijn == self.current_index => + { + if let Some(fld_c) = self.fld_c.as_mut() { + let ct = fld_c(bound_const, ty); + return ty::fold::shift_vars(self.tcx, &ct, self.current_index.as_u32()); + } } - } else { - if !ct.has_vars_bound_at_or_above(self.current_index) { - // Nothing more to substitute. - ct - } else { - ct.super_fold_with(self) + _ if ct.has_vars_bound_at_or_above(self.current_index) => { + return ct.super_fold_with(self); } + _ => {} } + ct } } @@ -550,14 +545,16 @@ impl<'tcx> TyCtxt<'tcx> { 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 }) - }; let mut region_map = BTreeMap::new(); - let real_fld_r = |br: ty::BoundRegion| *region_map.entry(br).or_insert_with(|| fld_r(br)); - let value = self.replace_escaping_bound_vars(value.skip_binder(), real_fld_r, fld_t, fld_c); + let mut real_fld_r = + |br: ty::BoundRegion| *region_map.entry(br).or_insert_with(|| fld_r(br)); + let value = value.skip_binder(); + let value = if !value.has_escaping_bound_vars() { + value + } else { + let mut replacer = BoundVarReplacer::new(self, Some(&mut real_fld_r), None, None); + value.fold_with(&mut replacer) + }; (value, region_map) } @@ -580,7 +577,8 @@ impl<'tcx> TyCtxt<'tcx> { if !value.has_escaping_bound_vars() { value } else { - let mut replacer = BoundVarReplacer::new(self, &mut fld_r, &mut fld_t, &mut fld_c); + let mut replacer = + BoundVarReplacer::new(self, Some(&mut fld_r), Some(&mut fld_t), Some(&mut fld_c)); value.fold_with(&mut replacer) } } @@ -837,6 +835,7 @@ impl<'tcx> TypeVisitor<'tcx> for HasEscapingVarsVisitor { result } + #[inline] fn visit_ty(&mut self, t: Ty<'tcx>) -> ControlFlow { // If the outer-exclusive-binder is *strictly greater* than // `outer_index`, that means that `t` contains some content @@ -850,6 +849,7 @@ impl<'tcx> TypeVisitor<'tcx> for HasEscapingVarsVisitor { } } + #[inline] fn visit_region(&mut self, r: ty::Region<'tcx>) -> ControlFlow { // If the region is bound by `outer_index` or anything outside // of outer index, then it escapes the binders we have @@ -875,6 +875,7 @@ impl<'tcx> TypeVisitor<'tcx> for HasEscapingVarsVisitor { } } + #[inline] fn visit_predicate(&mut self, predicate: ty::Predicate<'tcx>) -> ControlFlow { if predicate.inner.outer_exclusive_binder > self.outer_index { ControlFlow::Break(FoundEscapingVars) @@ -895,6 +896,7 @@ struct HasTypeFlagsVisitor { impl<'tcx> TypeVisitor<'tcx> for HasTypeFlagsVisitor { type BreakTy = FoundFlags; + #[inline] fn visit_ty(&mut self, t: Ty<'_>) -> ControlFlow { debug!( "HasTypeFlagsVisitor: t={:?} t.flags={:?} self.flags={:?}", @@ -909,6 +911,7 @@ impl<'tcx> TypeVisitor<'tcx> for HasTypeFlagsVisitor { } } + #[inline] fn visit_region(&mut self, r: ty::Region<'tcx>) -> ControlFlow { let flags = r.type_flags(); debug!("HasTypeFlagsVisitor: r={:?} r.flags={:?} self.flags={:?}", r, flags, self.flags); @@ -919,6 +922,7 @@ impl<'tcx> TypeVisitor<'tcx> for HasTypeFlagsVisitor { } } + #[inline] fn visit_const(&mut self, c: &'tcx ty::Const<'tcx>) -> ControlFlow { let flags = FlagComputation::for_const(c); debug!("HasTypeFlagsVisitor: c={:?} c.flags={:?} self.flags={:?}", c, flags, self.flags); @@ -929,6 +933,7 @@ impl<'tcx> TypeVisitor<'tcx> for HasTypeFlagsVisitor { } } + #[inline] fn visit_predicate(&mut self, predicate: ty::Predicate<'tcx>) -> ControlFlow { debug!( "HasTypeFlagsVisitor: predicate={:?} predicate.flags={:?} self.flags={:?}", diff --git a/compiler/rustc_middle/src/ty/generics.rs b/compiler/rustc_middle/src/ty/generics.rs new file mode 100644 index 0000000000..79cd26f566 --- /dev/null +++ b/compiler/rustc_middle/src/ty/generics.rs @@ -0,0 +1,257 @@ +use crate::middle::resolve_lifetime::ObjectLifetimeDefault; +use crate::ty; +use crate::ty::subst::{Subst, SubstsRef}; +use rustc_ast as ast; +use rustc_data_structures::fx::FxHashMap; +use rustc_hir as hir; +use rustc_hir::def_id::DefId; +use rustc_span::symbol::Symbol; +use rustc_span::Span; + +use super::{EarlyBoundRegion, InstantiatedPredicates, ParamConst, ParamTy, Predicate, TyCtxt}; + +#[derive(Clone, Debug, TyEncodable, TyDecodable, HashStable)] +pub enum GenericParamDefKind { + Lifetime, + Type { + has_default: bool, + object_lifetime_default: ObjectLifetimeDefault, + synthetic: Option, + }, + Const, +} + +impl GenericParamDefKind { + pub fn descr(&self) -> &'static str { + match self { + GenericParamDefKind::Lifetime => "lifetime", + GenericParamDefKind::Type { .. } => "type", + GenericParamDefKind::Const => "constant", + } + } + pub fn to_ord(&self, tcx: TyCtxt<'_>) -> ast::ParamKindOrd { + match self { + GenericParamDefKind::Lifetime => ast::ParamKindOrd::Lifetime, + GenericParamDefKind::Type { .. } => ast::ParamKindOrd::Type, + GenericParamDefKind::Const => { + ast::ParamKindOrd::Const { unordered: tcx.features().const_generics } + } + } + } +} + +#[derive(Clone, Debug, TyEncodable, TyDecodable, HashStable)] +pub struct GenericParamDef { + pub name: Symbol, + pub def_id: DefId, + pub index: u32, + + /// `pure_wrt_drop`, set by the (unsafe) `#[may_dangle]` attribute + /// on generic parameter `'a`/`T`, asserts data behind the parameter + /// `'a`/`T` won't be accessed during the parent type's `Drop` impl. + pub pure_wrt_drop: bool, + + pub kind: GenericParamDefKind, +} + +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 } + } else { + bug!("cannot convert a non-lifetime parameter def to an early bound region") + } + } +} + +#[derive(Default)] +pub struct GenericParamCount { + pub lifetimes: usize, + pub types: usize, + pub consts: usize, +} + +/// Information about the formal type/lifetime parameters associated +/// with an item or method. Analogous to `hir::Generics`. +/// +/// The ordering of parameters is the same as in `Subst` (excluding child generics): +/// `Self` (optionally), `Lifetime` params..., `Type` params... +#[derive(Clone, Debug, TyEncodable, TyDecodable, HashStable)] +pub struct Generics { + pub parent: Option, + pub parent_count: usize, + pub params: Vec, + + /// Reverse map to the `index` field of each `GenericParamDef`. + #[stable_hasher(ignore)] + pub param_def_id_to_index: FxHashMap, + + pub has_self: bool, + pub has_late_bound_regions: Option, +} + +impl<'tcx> Generics { + pub fn count(&self) -> usize { + self.parent_count + self.params.len() + } + + 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(); + + for param in &self.params { + match param.kind { + GenericParamDefKind::Lifetime => own_counts.lifetimes += 1, + GenericParamDefKind::Type { .. } => own_counts.types += 1, + GenericParamDefKind::Const => own_counts.consts += 1, + } + } + + own_counts + } + + pub fn own_defaults(&self) -> GenericParamCount { + let mut own_defaults = GenericParamCount::default(); + + for param in &self.params { + match param.kind { + GenericParamDefKind::Lifetime => (), + GenericParamDefKind::Type { has_default, .. } => { + own_defaults.types += has_default as usize; + } + GenericParamDefKind::Const => { + // FIXME(const_generics:defaults) + } + } + } + + own_defaults + } + + pub fn requires_monomorphization(&self, tcx: TyCtxt<'tcx>) -> bool { + if self.own_requires_monomorphization() { + return true; + } + + if let Some(parent_def_id) = self.parent { + let parent = tcx.generics_of(parent_def_id); + parent.requires_monomorphization(tcx) + } else { + false + } + } + + pub fn own_requires_monomorphization(&self) -> bool { + for param in &self.params { + match param.kind { + GenericParamDefKind::Type { .. } | GenericParamDefKind::Const => return true, + GenericParamDefKind::Lifetime => {} + } + } + false + } + + /// Returns the `GenericParamDef` with the given index. + pub fn param_at(&'tcx self, param_index: usize, tcx: TyCtxt<'tcx>) -> &'tcx GenericParamDef { + if let Some(index) = param_index.checked_sub(self.parent_count) { + &self.params[index] + } else { + tcx.generics_of(self.parent.expect("parent_count > 0 but no parent?")) + .param_at(param_index, tcx) + } + } + + /// Returns the `GenericParamDef` associated with this `EarlyBoundRegion`. + pub fn region_param( + &'tcx self, + param: &EarlyBoundRegion, + tcx: TyCtxt<'tcx>, + ) -> &'tcx GenericParamDef { + let param = self.param_at(param.index as usize, tcx); + match param.kind { + GenericParamDefKind::Lifetime => param, + _ => bug!("expected lifetime parameter, but found another generic parameter"), + } + } + + /// Returns the `GenericParamDef` associated with this `ParamTy`. + pub fn type_param(&'tcx self, param: &ParamTy, tcx: TyCtxt<'tcx>) -> &'tcx GenericParamDef { + let param = self.param_at(param.index as usize, tcx); + match param.kind { + GenericParamDefKind::Type { .. } => param, + _ => bug!("expected type parameter, but found another generic parameter"), + } + } + + /// Returns the `GenericParamDef` associated with this `ParamConst`. + pub fn const_param(&'tcx self, param: &ParamConst, tcx: TyCtxt<'tcx>) -> &GenericParamDef { + let param = self.param_at(param.index as usize, tcx); + match param.kind { + GenericParamDefKind::Const => param, + _ => bug!("expected const parameter, but found another generic parameter"), + } + } +} + +/// Bounds on generics. +#[derive(Copy, Clone, Default, Debug, TyEncodable, TyDecodable, HashStable)] +pub struct GenericPredicates<'tcx> { + pub parent: Option, + pub predicates: &'tcx [(Predicate<'tcx>, Span)], +} + +impl<'tcx> GenericPredicates<'tcx> { + pub fn instantiate( + &self, + tcx: TyCtxt<'tcx>, + substs: SubstsRef<'tcx>, + ) -> InstantiatedPredicates<'tcx> { + let mut instantiated = InstantiatedPredicates::empty(); + self.instantiate_into(tcx, &mut instantiated, substs); + instantiated + } + + pub fn instantiate_own( + &self, + tcx: TyCtxt<'tcx>, + substs: SubstsRef<'tcx>, + ) -> InstantiatedPredicates<'tcx> { + InstantiatedPredicates { + predicates: self.predicates.iter().map(|(p, _)| p.subst(tcx, substs)).collect(), + spans: self.predicates.iter().map(|(_, sp)| *sp).collect(), + } + } + + fn instantiate_into( + &self, + tcx: TyCtxt<'tcx>, + instantiated: &mut InstantiatedPredicates<'tcx>, + substs: SubstsRef<'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.spans.extend(self.predicates.iter().map(|(_, sp)| *sp)); + } + + pub fn instantiate_identity(&self, tcx: TyCtxt<'tcx>) -> InstantiatedPredicates<'tcx> { + let mut instantiated = InstantiatedPredicates::empty(); + self.instantiate_identity_into(tcx, &mut instantiated); + instantiated + } + + fn instantiate_identity_into( + &self, + tcx: TyCtxt<'tcx>, + instantiated: &mut InstantiatedPredicates<'tcx>, + ) { + if let Some(def_id) = self.parent { + tcx.predicates_of(def_id).instantiate_identity_into(tcx, instantiated); + } + instantiated.predicates.extend(self.predicates.iter().map(|(p, _)| p)); + instantiated.spans.extend(self.predicates.iter().map(|(_, s)| s)); + } +} diff --git a/compiler/rustc_middle/src/ty/instance.rs b/compiler/rustc_middle/src/ty/instance.rs index 6ca5dcc532..23cedfd499 100644 --- a/compiler/rustc_middle/src/ty/instance.rs +++ b/compiler/rustc_middle/src/ty/instance.rs @@ -347,6 +347,7 @@ impl<'tcx> Instance<'tcx> { } // This should be kept up to date with `resolve`. + #[instrument(level = "debug", skip(tcx))] pub fn resolve_opt_const_arg( tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>, @@ -498,7 +499,7 @@ impl<'tcx> Instance<'tcx> { } /// Returns a new `Instance` where generic parameters in `instance.substs` are replaced by - /// identify parameters if they are determined to be unused in `instance.def`. + /// identity parameters if they are determined to be unused in `instance.def`. pub fn polymorphize(self, tcx: TyCtxt<'tcx>) -> Self { debug!("polymorphize: running polymorphization analysis"); if !tcx.sess.opts.debugging_opts.polymorphize { diff --git a/compiler/rustc_middle/src/ty/layout.rs b/compiler/rustc_middle/src/ty/layout.rs index 596e4f6717..814581a6cf 100644 --- a/compiler/rustc_middle/src/ty/layout.rs +++ b/compiler/rustc_middle/src/ty/layout.rs @@ -130,6 +130,7 @@ impl IntegerExt for Integer { if repr.c() { match &tcx.sess.target.arch[..] { + "hexagon" => min_from_extern = Some(I8), // WARNING: the ARM EABI has two variants; the one corresponding // to `at_least == I32` appears to be used on Linux and NetBSD, // but some systems may use the variant corresponding to no @@ -188,6 +189,13 @@ pub const FAT_PTR_ADDR: usize = 0; /// - For a slice, this is the length. pub const FAT_PTR_EXTRA: usize = 1; +/// The maximum supported number of lanes in a SIMD vector. +/// +/// This value is selected based on backend support: +/// * LLVM does not appear to have a vector width limit. +/// * Cranelift stores the base-2 log of the lane count in a 4 bit integer. +pub const MAX_SIMD_LANES: u64 = 1 << 0xF; + #[derive(Copy, Clone, Debug, TyEncodable, TyDecodable)] pub enum LayoutError<'tcx> { Unknown(Ty<'tcx>), @@ -224,7 +232,7 @@ fn layout_raw<'tcx>( let layout = cx.layout_raw_uncached(ty); // Type-level uninhabitedness should always imply ABI uninhabitedness. if let Ok(layout) = layout { - if ty.conservative_is_privately_uninhabited(tcx) { + if tcx.conservative_is_privately_uninhabited(param_env.and(ty)) { assert!(layout.abi.is_uninhabited()); } } @@ -576,11 +584,12 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { 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 - } else { - Abi::Aggregate { sized: true } - }; + let abi = + if count != 0 && tcx.conservative_is_privately_uninhabited(param_env.and(ty)) { + Abi::Uninhabited + } else { + Abi::Aggregate { sized: true } + }; let largest_niche = if count != 0 { element.largest_niche.clone() } else { None }; @@ -717,10 +726,17 @@ impl<'tcx> LayoutCx<'tcx, TyCtxt<'tcx>> { }; // SIMD vectors of zero length are not supported. + // Additionally, lengths are capped at 2^16 as a fixed maximum backends must + // support. // // Can't be caught in typeck if the array length is generic. if e_len == 0 { tcx.sess.fatal(&format!("monomorphising SIMD type `{}` of zero length", ty)); + } else if e_len > MAX_SIMD_LANES { + tcx.sess.fatal(&format!( + "monomorphising SIMD type `{}` of length greater than {}", + ty, MAX_SIMD_LANES, + )); } // Compute the ABI of the element type: @@ -2546,6 +2562,7 @@ fn fn_can_unwind( panic_strategy: PanicStrategy, codegen_fn_attr_flags: CodegenFnAttrFlags, call_conv: Conv, + abi: SpecAbi, ) -> bool { if panic_strategy != PanicStrategy::Unwind { // In panic=abort mode we assume nothing can unwind anywhere, so @@ -2570,17 +2587,34 @@ fn fn_can_unwind( // // 2. A Rust item using a non-Rust ABI (like `extern "C" fn foo() { ... }`). // - // Foreign items (case 1) are assumed to not unwind; it is - // UB otherwise. (At least for now; see also - // rust-lang/rust#63909 and Rust RFC 2753.) - // - // Items defined in Rust with non-Rust ABIs (case 2) are also - // not supposed to unwind. Whether this should be enforced - // (versus stating it is UB) and *how* it would be enforced - // is currently under discussion; see rust-lang/rust#58794. - // - // In either case, we mark item as explicitly nounwind. - false + // In both of these cases, we should refer to the ABI to determine whether or not we + // should unwind. See Rust RFC 2945 for more information on this behavior, here: + // https://github.com/rust-lang/rfcs/blob/master/text/2945-c-unwind-abi.md + use SpecAbi::*; + match abi { + C { unwind } | Stdcall { unwind } | System { unwind } | Thiscall { unwind } => { + unwind + } + Cdecl + | Fastcall + | Vectorcall + | Aapcs + | Win64 + | SysV64 + | PtxKernel + | Msp430Interrupt + | X86Interrupt + | AmdGpuKernel + | EfiApi + | AvrInterrupt + | AvrNonBlockingInterrupt + | CCmseNonSecureCall + | RustIntrinsic + | PlatformIntrinsic + | Unadjusted => false, + // In the `if` above, we checked for functions with the Rust calling convention. + Rust | RustCall => unreachable!(), + } } } } @@ -2638,14 +2672,14 @@ where RustIntrinsic | PlatformIntrinsic | Rust | RustCall => Conv::Rust, // It's the ABI's job to select this, not ours. - System => bug!("system abi should be selected elsewhere"), + System { .. } => bug!("system abi should be selected elsewhere"), EfiApi => bug!("eficall abi should be selected elsewhere"), - Stdcall => Conv::X86Stdcall, + Stdcall { .. } => Conv::X86Stdcall, Fastcall => Conv::X86Fastcall, Vectorcall => Conv::X86VectorCall, - Thiscall => Conv::X86ThisCall, - C => Conv::C, + Thiscall { .. } => Conv::X86ThisCall, + C { .. } => Conv::C, Unadjusted => Conv::C, Win64 => Conv::X86_64Win64, SysV64 => Conv::X86_64SysV, @@ -2807,7 +2841,12 @@ where c_variadic: sig.c_variadic, fixed_count: inputs.len(), conv, - can_unwind: fn_can_unwind(cx.tcx().sess.panic_strategy(), codegen_fn_attr_flags, conv), + can_unwind: fn_can_unwind( + cx.tcx().sess.panic_strategy(), + codegen_fn_attr_flags, + conv, + sig.abi, + ), }; fn_abi.adjust_for_abi(cx, sig.abi); debug!("FnAbi::new_internal = {:?}", fn_abi); diff --git a/compiler/rustc_middle/src/ty/mod.rs b/compiler/rustc_middle/src/ty/mod.rs index babab005ed..5bbf7b35d3 100644 --- a/compiler/rustc_middle/src/ty/mod.rs +++ b/compiler/rustc_middle/src/ty/mod.rs @@ -9,107 +9,78 @@ //! //! ["The `ty` module: representing types"]: https://rustc-dev-guide.rust-lang.org/ty.html -// ignore-tidy-filelength pub use self::fold::{TypeFoldable, TypeFolder, TypeVisitor}; pub use self::AssocItemContainer::*; pub use self::BorrowKind::*; pub use self::IntVarValue::*; pub use self::Variance::*; +pub use adt::*; +pub use assoc::*; +pub use closure::*; +pub use generics::*; use crate::hir::exports::ExportMap; -use crate::hir::place::{ - Place as HirPlace, PlaceBase as HirPlaceBase, ProjectionKind as HirProjectionKind, -}; use crate::ich::StableHashingContext; use crate::middle::cstore::CrateStoreDyn; -use crate::middle::resolve_lifetime::ObjectLifetimeDefault; -use crate::mir::interpret::ErrorHandled; -use crate::mir::Body; -use crate::mir::GeneratorLayout; +use crate::mir::{Body, GeneratorLayout}; use crate::traits::{self, Reveal}; use crate::ty; use crate::ty::subst::{GenericArg, InternalSubsts, Subst, SubstsRef}; -use crate::ty::util::{Discr, IntTypeExt}; +use crate::ty::util::Discr; use rustc_ast as ast; use rustc_attr as attr; use rustc_data_structures::captures::Captures; -use rustc_data_structures::fingerprint::Fingerprint; -use rustc_data_structures::fx::FxHashMap; -use rustc_data_structures::fx::FxHashSet; -use rustc_data_structures::fx::FxIndexMap; -use rustc_data_structures::sorted_map::SortedIndexMultiMap; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; use rustc_data_structures::sync::{self, par_iter, ParallelIterator}; use rustc_data_structures::tagged_ptr::CopyTaggedPtr; -use rustc_errors::ErrorReported; use rustc_hir as hir; -use rustc_hir::def::{CtorKind, CtorOf, DefKind, Namespace, Res}; +use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res}; use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, CRATE_DEF_INDEX}; -use rustc_hir::lang_items::LangItem; use rustc_hir::{Constness, Node}; -use rustc_index::vec::{Idx, IndexVec}; use rustc_macros::HashStable; -use rustc_serialize::{self, Encodable, Encoder}; -use rustc_session::DataTypeKind; use rustc_span::hygiene::ExpnId; -use rustc_span::symbol::{kw, sym, Ident, Symbol}; +use rustc_span::symbol::{kw, Ident, Symbol}; use rustc_span::Span; -use rustc_target::abi::{Align, VariantIdx}; +use rustc_target::abi::Align; -use std::cell::RefCell; use std::cmp::Ordering; -use std::fmt; use std::hash::{Hash, Hasher}; -use std::ops::{ControlFlow, Range}; -use std::ptr; -use std::str; +use std::ops::ControlFlow; +use std::{fmt, ptr, str}; -pub use self::sty::BoundRegionKind::*; -pub use self::sty::RegionKind; -pub use self::sty::RegionKind::*; -pub use self::sty::TyKind::*; -pub use self::sty::{Binder, BoundTy, BoundTyKind, BoundVar}; -pub use self::sty::{BoundRegion, BoundRegionKind, EarlyBoundRegion, FreeRegion, Region}; -pub use self::sty::{CanonicalPolyFnSig, FnSig, GenSig, PolyFnSig, PolyGenSig}; -pub use self::sty::{ClosureSubsts, GeneratorSubsts, TypeAndMut, UpvarSubsts}; -pub use self::sty::{ClosureSubstsParts, GeneratorSubstsParts}; -pub use self::sty::{ConstVid, RegionVid}; -pub use self::sty::{ExistentialPredicate, ParamConst, ParamTy, ProjectionTy}; -pub use self::sty::{ExistentialProjection, PolyExistentialProjection}; -pub use self::sty::{ExistentialTraitRef, PolyExistentialTraitRef}; -pub use self::sty::{PolyTraitRef, TraitRef, TyKind}; pub use crate::ty::diagnostics::*; pub use rustc_type_ir::InferTy::*; pub use rustc_type_ir::*; pub use self::binding::BindingMode; pub use self::binding::BindingMode::*; - -pub use self::context::{tls, FreeRegionInfo, TyCtxt}; -pub use self::context::{ - CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, - DelaySpanBugEmitted, ResolvedOpaqueTy, UserType, UserTypeAnnotationIndex, -}; +pub use self::consts::{Const, ConstInt, ConstKind, InferConst, ScalarInt, ValTree}; pub use self::context::{ - CtxtInterners, GeneratorInteriorTypeCause, GlobalCtxt, Lift, TypeckResults, + tls, CanonicalUserType, CanonicalUserTypeAnnotation, CanonicalUserTypeAnnotations, + CtxtInterners, DelaySpanBugEmitted, FreeRegionInfo, GeneratorInteriorTypeCause, GlobalCtxt, + Lift, ResolvedOpaqueTy, TyCtxt, TypeckResults, UserType, UserTypeAnnotationIndex, }; - pub use self::instance::{Instance, InstanceDef}; - pub use self::list::List; - +pub use self::sty::BoundRegionKind::*; +pub use self::sty::RegionKind::*; +pub use self::sty::TyKind::*; +pub use self::sty::{ + Binder, BoundRegion, BoundRegionKind, BoundTy, BoundTyKind, BoundVar, CanonicalPolyFnSig, + ClosureSubsts, ClosureSubstsParts, ConstVid, EarlyBoundRegion, ExistentialPredicate, + ExistentialProjection, ExistentialTraitRef, FnSig, FreeRegion, GenSig, GeneratorSubsts, + GeneratorSubstsParts, ParamConst, ParamTy, PolyExistentialProjection, PolyExistentialTraitRef, + PolyFnSig, PolyGenSig, PolyTraitRef, ProjectionTy, Region, RegionKind, RegionVid, TraitRef, + TyKind, TypeAndMut, UpvarSubsts, +}; pub use self::trait_def::TraitDef; -pub use self::query::queries; - -pub use self::consts::{Const, ConstInt, ConstKind, InferConst, ScalarInt}; - pub mod _match; pub mod adjustment; pub mod binding; pub mod cast; pub mod codec; -mod erase_regions; pub mod error; pub mod fast_reject; pub mod flags; @@ -126,9 +97,14 @@ pub mod trait_def; pub mod util; pub mod walk; +mod adt; +mod assoc; +mod closure; mod consts; mod context; mod diagnostics; +mod erase_regions; +mod generics; mod instance; mod list; mod structural_impls; @@ -150,30 +126,6 @@ pub struct ResolverOutputs { pub extern_prelude: FxHashMap, } -#[derive(Clone, Copy, PartialEq, Eq, Debug, HashStable, Hash)] -pub enum AssocItemContainer { - TraitContainer(DefId), - ImplContainer(DefId), -} - -impl AssocItemContainer { - /// Asserts that this is the `DefId` of an associated item declared - /// in a trait, and returns the trait `DefId`. - pub fn assert_trait(&self) -> DefId { - match *self { - TraitContainer(id) => id, - _ => bug!("associated item has wrong container type: {:?}", self), - } - } - - pub fn id(&self) -> DefId { - match *self { - TraitContainer(id) => id, - ImplContainer(id) => id, - } - } -} - /// The "header" of an impl is everything outside the body: a Self type, a trait /// ref (in the case of a trait impl), and a set of predicates (from the /// bounds / where-clauses). @@ -198,142 +150,6 @@ pub enum ImplPolarity { Reservation, } -#[derive(Copy, Clone, Debug, PartialEq, HashStable, Eq, Hash)] -pub struct AssocItem { - pub def_id: DefId, - #[stable_hasher(project(name))] - pub ident: Ident, - pub kind: AssocKind, - pub vis: Visibility, - pub defaultness: hir::Defaultness, - pub container: AssocItemContainer, - - /// Whether this is a method with an explicit self - /// as its first parameter, allowing method calls. - pub fn_has_self_parameter: bool, -} - -#[derive(Copy, Clone, PartialEq, Debug, HashStable, Eq, Hash)] -pub enum AssocKind { - Const, - Fn, - Type, -} - -impl AssocKind { - pub fn namespace(&self) -> Namespace { - match *self { - ty::AssocKind::Type => Namespace::TypeNS, - ty::AssocKind::Const | ty::AssocKind::Fn => Namespace::ValueNS, - } - } - - pub fn as_def_kind(&self) -> DefKind { - match self { - AssocKind::Const => DefKind::AssocConst, - AssocKind::Fn => DefKind::AssocFn, - AssocKind::Type => DefKind::AssocTy, - } - } -} - -impl AssocItem { - pub fn signature(&self, tcx: TyCtxt<'_>) -> String { - match self.kind { - ty::AssocKind::Fn => { - // We skip the binder here because the binder would deanonymize all - // late-bound regions, and we don't want method signatures to show up - // `as for<'r> fn(&'r MyType)`. Pretty-printing handles late-bound - // regions just fine, showing `fn(&MyType)`. - tcx.fn_sig(self.def_id).skip_binder().to_string() - } - ty::AssocKind::Type => format!("type {};", self.ident), - ty::AssocKind::Const => { - format!("const {}: {:?};", self.ident, tcx.type_of(self.def_id)) - } - } - } -} - -/// A list of `ty::AssocItem`s in definition order that allows for efficient lookup by name. -/// -/// When doing lookup by name, we try to postpone hygienic comparison for as long as possible since -/// it is relatively expensive. Instead, items are indexed by `Symbol` and hygienic comparison is -/// done only on items with the same name. -#[derive(Debug, Clone, PartialEq, HashStable)] -pub struct AssociatedItems<'tcx> { - items: SortedIndexMultiMap, -} - -impl<'tcx> AssociatedItems<'tcx> { - /// Constructs an `AssociatedItems` map from a series of `ty::AssocItem`s in definition order. - pub fn new(items_in_def_order: impl IntoIterator) -> Self { - let items = items_in_def_order.into_iter().map(|item| (item.ident.name, item)).collect(); - AssociatedItems { items } - } - - /// Returns a slice of associated items in the order they were defined. - /// - /// New code should avoid relying on definition order. If you need a particular associated item - /// for a known trait, make that trait a lang item instead of indexing this array. - pub fn in_definition_order(&self) -> impl '_ + Iterator { - self.items.iter().map(|(_, v)| *v) - } - - pub fn len(&self) -> usize { - self.items.len() - } - - /// Returns an iterator over all associated items with the given name, ignoring hygiene. - pub fn filter_by_name_unhygienic( - &self, - name: Symbol, - ) -> impl '_ + Iterator { - self.items.get_by_key(&name).copied() - } - - /// Returns an iterator over all associated items with the given name. - /// - /// Multiple items may have the same name if they are in different `Namespace`s. For example, - /// an associated type can have the same name as a method. Use one of the `find_by_name_and_*` - /// methods below if you know which item you are looking for. - pub fn filter_by_name( - &'a self, - tcx: TyCtxt<'a>, - ident: Ident, - parent_def_id: DefId, - ) -> impl 'a + Iterator { - self.filter_by_name_unhygienic(ident.name) - .filter(move |item| tcx.hygienic_eq(ident, item.ident, parent_def_id)) - } - - /// Returns the associated item with the given name and `AssocKind`, if one exists. - pub fn find_by_name_and_kind( - &self, - tcx: TyCtxt<'_>, - ident: Ident, - kind: AssocKind, - parent_def_id: DefId, - ) -> Option<&ty::AssocItem> { - self.filter_by_name_unhygienic(ident.name) - .filter(|item| item.kind == kind) - .find(|item| tcx.hygienic_eq(ident, item.ident, parent_def_id)) - } - - /// Returns the associated item with the given name in the given `Namespace`, if one exists. - pub fn find_by_name_and_namespace( - &self, - tcx: TyCtxt<'_>, - ident: Ident, - ns: Namespace, - parent_def_id: DefId, - ) -> Option<&ty::AssocItem> { - self.filter_by_name_unhygienic(ident.name) - .filter(|item| item.kind.namespace() == ns) - .find(|item| tcx.hygienic_eq(ident, item.ident, parent_def_id)) - } -} - #[derive(Clone, Debug, PartialEq, Eq, Copy, Hash, TyEncodable, TyDecodable, HashStable)] pub enum Visibility { /// Visible everywhere (including in other crates). @@ -485,7 +301,7 @@ impl<'tcx> TyS<'tcx> { } // `TyS` is used a lot. Make sure it doesn't unintentionally get bigger. -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(TyS<'_>, 32); impl<'tcx> Ord for TyS<'tcx> { @@ -533,243 +349,6 @@ impl<'a, 'tcx> HashStable> for TyS<'tcx> { #[rustc_diagnostic_item = "Ty"] pub type Ty<'tcx> = &'tcx TyS<'tcx>; -#[derive( - Clone, - Copy, - Debug, - PartialEq, - Eq, - Hash, - TyEncodable, - TyDecodable, - TypeFoldable, - HashStable -)] -pub struct UpvarPath { - pub hir_id: hir::HirId, -} - -/// Upvars do not get their own `NodeId`. Instead, we use the pair of -/// the original var ID (that is, the root variable that is referenced -/// by the upvar) and the ID of the closure expression. -#[derive(Clone, Copy, PartialEq, Eq, Hash, TyEncodable, TyDecodable, TypeFoldable, HashStable)] -pub struct UpvarId { - pub var_path: UpvarPath, - pub closure_expr_id: LocalDefId, -} - -impl UpvarId { - pub fn new(var_hir_id: hir::HirId, closure_def_id: LocalDefId) -> UpvarId { - UpvarId { var_path: UpvarPath { hir_id: var_hir_id }, closure_expr_id: closure_def_id } - } -} - -#[derive(Clone, PartialEq, Debug, TyEncodable, TyDecodable, TypeFoldable, Copy, HashStable)] -pub enum BorrowKind { - /// Data must be immutable and is aliasable. - ImmBorrow, - - /// Data must be immutable but not aliasable. This kind of borrow - /// cannot currently be expressed by the user and is used only in - /// implicit closure bindings. It is needed when the closure - /// is borrowing or mutating a mutable referent, e.g.: - /// - /// ``` - /// let x: &mut isize = ...; - /// let y = || *x += 5; - /// ``` - /// - /// If we were to try to translate this closure into a more explicit - /// form, we'd encounter an error with the code as written: - /// - /// ``` - /// struct Env { x: & &mut isize } - /// let x: &mut isize = ...; - /// let y = (&mut Env { &x }, fn_ptr); // Closure is pair of env and fn - /// fn fn_ptr(env: &mut Env) { **env.x += 5; } - /// ``` - /// - /// This is then illegal because you cannot mutate a `&mut` found - /// in an aliasable location. To solve, you'd have to translate with - /// an `&mut` borrow: - /// - /// ``` - /// struct Env { x: & &mut isize } - /// let x: &mut isize = ...; - /// let y = (&mut Env { &mut x }, fn_ptr); // changed from &x to &mut x - /// fn fn_ptr(env: &mut Env) { **env.x += 5; } - /// ``` - /// - /// Now the assignment to `**env.x` is legal, but creating a - /// mutable pointer to `x` is not because `x` is not mutable. We - /// could fix this by declaring `x` as `let mut x`. This is ok in - /// user code, if awkward, but extra weird for closures, since the - /// borrow is hidden. - /// - /// So we introduce a "unique imm" borrow -- the referent is - /// immutable, but not aliasable. This solves the problem. For - /// simplicity, we don't give users the way to express this - /// borrow, it's just used when translating closures. - UniqueImmBorrow, - - /// Data is mutable and not aliasable. - MutBorrow, -} - -/// Information describing the capture of an upvar. This is computed -/// during `typeck`, specifically by `regionck`. -#[derive(PartialEq, Clone, Debug, Copy, TyEncodable, TyDecodable, TypeFoldable, HashStable)] -pub enum UpvarCapture<'tcx> { - /// Upvar is captured by value. This is always true when the - /// closure is labeled `move`, but can also be true in other cases - /// depending on inference. - /// - /// If the upvar was inferred to be captured by value (e.g. `move` - /// was not used), then the `Span` points to a usage that - /// required it. There may be more than one such usage - /// (e.g. `|| { a; a; }`), in which case we pick an - /// arbitrary one. - ByValue(Option), - - /// Upvar is captured by reference. - ByRef(UpvarBorrow<'tcx>), -} - -#[derive(PartialEq, Clone, Copy, TyEncodable, TyDecodable, TypeFoldable, HashStable)] -pub struct UpvarBorrow<'tcx> { - /// The kind of borrow: by-ref upvars have access to shared - /// immutable borrows, which are not part of the normal language - /// syntax. - pub kind: BorrowKind, - - /// Region of the resulting reference. - pub region: ty::Region<'tcx>, -} - -/// Given the closure DefId this map provides a map of root variables to minimum -/// set of `CapturedPlace`s that need to be tracked to support all captures of that closure. -pub type MinCaptureInformationMap<'tcx> = FxHashMap>; - -/// Part of `MinCaptureInformationMap`; Maps a root variable to the list of `CapturedPlace`. -/// Used to track the minimum set of `Place`s that need to be captured to support all -/// Places captured by the closure starting at a given root variable. -/// -/// This provides a convenient and quick way of checking if a variable being used within -/// a closure is a capture of a local variable. -pub type RootVariableMinCaptureList<'tcx> = FxIndexMap>; - -/// Part of `MinCaptureInformationMap`; List of `CapturePlace`s. -pub type MinCaptureList<'tcx> = Vec>; - -/// A composite describing a `Place` that is captured by a closure. -#[derive(PartialEq, Clone, Debug, TyEncodable, TyDecodable, TypeFoldable, HashStable)] -pub struct CapturedPlace<'tcx> { - /// The `Place` that is captured. - pub place: HirPlace<'tcx>, - - /// `CaptureKind` and expression(s) that resulted in such capture of `place`. - pub info: CaptureInfo<'tcx>, - - /// Represents if `place` can be mutated or not. - pub mutability: hir::Mutability, -} - -impl CapturedPlace<'tcx> { - /// Returns the hir-id of the root variable for the captured place. - /// e.g., if `a.b.c` was captured, would return the hir-id for `a`. - pub fn get_root_variable(&self) -> hir::HirId { - match self.place.base { - HirPlaceBase::Upvar(upvar_id) => upvar_id.var_path.hir_id, - base => bug!("Expected upvar, found={:?}", base), - } - } -} - -pub fn place_to_string_for_capture(tcx: TyCtxt<'tcx>, place: &HirPlace<'tcx>) -> String { - let name = match place.base { - HirPlaceBase::Upvar(upvar_id) => tcx.hir().name(upvar_id.var_path.hir_id).to_string(), - _ => bug!("Capture_information should only contain upvars"), - }; - let mut curr_string = name; - - for (i, proj) in place.projections.iter().enumerate() { - match proj.kind { - HirProjectionKind::Deref => { - curr_string = format!("*{}", curr_string); - } - HirProjectionKind::Field(idx, variant) => match place.ty_before_projection(i).kind() { - ty::Adt(def, ..) => { - curr_string = format!( - "{}.{}", - curr_string, - def.variants[variant].fields[idx as usize].ident.name.as_str() - ); - } - ty::Tuple(_) => { - curr_string = format!("{}.{}", curr_string, idx); - } - _ => { - bug!( - "Field projection applied to a type other than Adt or Tuple: {:?}.", - place.ty_before_projection(i).kind() - ) - } - }, - proj => bug!("{:?} unexpected because it isn't captured", proj), - } - } - - curr_string.to_string() -} - -/// Part of `MinCaptureInformationMap`; describes the capture kind (&, &mut, move) -/// for a particular capture as well as identifying the part of the source code -/// that triggered this capture to occur. -#[derive(PartialEq, Clone, Debug, Copy, TyEncodable, TyDecodable, TypeFoldable, HashStable)] -pub struct CaptureInfo<'tcx> { - /// Expr Id pointing to use that resulted in selecting the current capture kind - /// - /// Eg: - /// ```rust,no_run - /// let mut t = (0,1); - /// - /// let c = || { - /// println!("{}",t); // L1 - /// t.1 = 4; // L2 - /// }; - /// ``` - /// `capture_kind_expr_id` will point to the use on L2 and `path_expr_id` will point to the - /// use on L1. - /// - /// If the user doesn't enable feature `capture_disjoint_fields` (RFC 2229) then, it is - /// possible that we don't see the use of a particular place resulting in capture_kind_expr_id being - /// None. In such case we fallback on uvpars_mentioned for span. - /// - /// Eg: - /// ```rust,no_run - /// let x = 5; - /// - /// let c = || { - /// let _ = x - /// }; - /// ``` - /// - /// In this example, if `capture_disjoint_fields` is **not** set, then x will be captured, - /// but we won't see it being used during capture analysis, since it's essentially a discard. - pub capture_kind_expr_id: Option, - /// Expr Id pointing to use that resulted the corresponding place being captured - /// - /// See `capture_kind_expr_id` for example. - /// - pub path_expr_id: Option, - - /// Capture mode that was selected - pub capture_kind: UpvarCapture<'tcx>, -} - -pub type UpvarListMap = FxHashMap>; -pub type UpvarCaptureMap<'tcx> = FxHashMap>; - impl ty::EarlyBoundRegion { /// Does this early bound region have a name? Early bound regions normally /// always have names except when using anonymous lifetimes (`'_`). @@ -778,252 +357,6 @@ impl ty::EarlyBoundRegion { } } -#[derive(Clone, Debug, TyEncodable, TyDecodable, HashStable)] -pub enum GenericParamDefKind { - Lifetime, - Type { - has_default: bool, - object_lifetime_default: ObjectLifetimeDefault, - synthetic: Option, - }, - Const, -} - -impl GenericParamDefKind { - pub fn descr(&self) -> &'static str { - match self { - GenericParamDefKind::Lifetime => "lifetime", - GenericParamDefKind::Type { .. } => "type", - GenericParamDefKind::Const => "constant", - } - } - pub fn to_ord(&self, tcx: TyCtxt<'_>) -> ast::ParamKindOrd { - match self { - GenericParamDefKind::Lifetime => ast::ParamKindOrd::Lifetime, - GenericParamDefKind::Type { .. } => ast::ParamKindOrd::Type, - GenericParamDefKind::Const => { - ast::ParamKindOrd::Const { unordered: tcx.features().const_generics } - } - } - } -} - -#[derive(Clone, Debug, TyEncodable, TyDecodable, HashStable)] -pub struct GenericParamDef { - pub name: Symbol, - pub def_id: DefId, - pub index: u32, - - /// `pure_wrt_drop`, set by the (unsafe) `#[may_dangle]` attribute - /// on generic parameter `'a`/`T`, asserts data behind the parameter - /// `'a`/`T` won't be accessed during the parent type's `Drop` impl. - pub pure_wrt_drop: bool, - - pub kind: GenericParamDefKind, -} - -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 } - } else { - bug!("cannot convert a non-lifetime parameter def to an early bound region") - } - } -} - -#[derive(Default)] -pub struct GenericParamCount { - pub lifetimes: usize, - pub types: usize, - pub consts: usize, -} - -/// Information about the formal type/lifetime parameters associated -/// with an item or method. Analogous to `hir::Generics`. -/// -/// The ordering of parameters is the same as in `Subst` (excluding child generics): -/// `Self` (optionally), `Lifetime` params..., `Type` params... -#[derive(Clone, Debug, TyEncodable, TyDecodable, HashStable)] -pub struct Generics { - pub parent: Option, - pub parent_count: usize, - pub params: Vec, - - /// Reverse map to the `index` field of each `GenericParamDef`. - #[stable_hasher(ignore)] - pub param_def_id_to_index: FxHashMap, - - pub has_self: bool, - pub has_late_bound_regions: Option, -} - -impl<'tcx> Generics { - pub fn count(&self) -> usize { - self.parent_count + self.params.len() - } - - 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(); - - for param in &self.params { - match param.kind { - GenericParamDefKind::Lifetime => own_counts.lifetimes += 1, - GenericParamDefKind::Type { .. } => own_counts.types += 1, - GenericParamDefKind::Const => own_counts.consts += 1, - } - } - - own_counts - } - - pub fn own_defaults(&self) -> GenericParamCount { - let mut own_defaults = GenericParamCount::default(); - - for param in &self.params { - match param.kind { - GenericParamDefKind::Lifetime => (), - GenericParamDefKind::Type { has_default, .. } => { - own_defaults.types += has_default as usize; - } - GenericParamDefKind::Const => { - // FIXME(const_generics:defaults) - } - } - } - - own_defaults - } - - pub fn requires_monomorphization(&self, tcx: TyCtxt<'tcx>) -> bool { - if self.own_requires_monomorphization() { - return true; - } - - if let Some(parent_def_id) = self.parent { - let parent = tcx.generics_of(parent_def_id); - parent.requires_monomorphization(tcx) - } else { - false - } - } - - pub fn own_requires_monomorphization(&self) -> bool { - for param in &self.params { - match param.kind { - GenericParamDefKind::Type { .. } | GenericParamDefKind::Const => return true, - GenericParamDefKind::Lifetime => {} - } - } - false - } - - /// Returns the `GenericParamDef` with the given index. - pub fn param_at(&'tcx self, param_index: usize, tcx: TyCtxt<'tcx>) -> &'tcx GenericParamDef { - if let Some(index) = param_index.checked_sub(self.parent_count) { - &self.params[index] - } else { - tcx.generics_of(self.parent.expect("parent_count > 0 but no parent?")) - .param_at(param_index, tcx) - } - } - - /// Returns the `GenericParamDef` associated with this `EarlyBoundRegion`. - pub fn region_param( - &'tcx self, - param: &EarlyBoundRegion, - tcx: TyCtxt<'tcx>, - ) -> &'tcx GenericParamDef { - let param = self.param_at(param.index as usize, tcx); - match param.kind { - GenericParamDefKind::Lifetime => param, - _ => bug!("expected lifetime parameter, but found another generic parameter"), - } - } - - /// Returns the `GenericParamDef` associated with this `ParamTy`. - pub fn type_param(&'tcx self, param: &ParamTy, tcx: TyCtxt<'tcx>) -> &'tcx GenericParamDef { - let param = self.param_at(param.index as usize, tcx); - match param.kind { - GenericParamDefKind::Type { .. } => param, - _ => bug!("expected type parameter, but found another generic parameter"), - } - } - - /// Returns the `GenericParamDef` associated with this `ParamConst`. - pub fn const_param(&'tcx self, param: &ParamConst, tcx: TyCtxt<'tcx>) -> &GenericParamDef { - let param = self.param_at(param.index as usize, tcx); - match param.kind { - GenericParamDefKind::Const => param, - _ => bug!("expected const parameter, but found another generic parameter"), - } - } -} - -/// Bounds on generics. -#[derive(Copy, Clone, Default, Debug, TyEncodable, TyDecodable, HashStable)] -pub struct GenericPredicates<'tcx> { - pub parent: Option, - pub predicates: &'tcx [(Predicate<'tcx>, Span)], -} - -impl<'tcx> GenericPredicates<'tcx> { - pub fn instantiate( - &self, - tcx: TyCtxt<'tcx>, - substs: SubstsRef<'tcx>, - ) -> InstantiatedPredicates<'tcx> { - let mut instantiated = InstantiatedPredicates::empty(); - self.instantiate_into(tcx, &mut instantiated, substs); - instantiated - } - - pub fn instantiate_own( - &self, - tcx: TyCtxt<'tcx>, - substs: SubstsRef<'tcx>, - ) -> InstantiatedPredicates<'tcx> { - InstantiatedPredicates { - predicates: self.predicates.iter().map(|(p, _)| p.subst(tcx, substs)).collect(), - spans: self.predicates.iter().map(|(_, sp)| *sp).collect(), - } - } - - fn instantiate_into( - &self, - tcx: TyCtxt<'tcx>, - instantiated: &mut InstantiatedPredicates<'tcx>, - substs: SubstsRef<'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.spans.extend(self.predicates.iter().map(|(_, sp)| *sp)); - } - - pub fn instantiate_identity(&self, tcx: TyCtxt<'tcx>) -> InstantiatedPredicates<'tcx> { - let mut instantiated = InstantiatedPredicates::empty(); - self.instantiate_identity_into(tcx, &mut instantiated); - instantiated - } - - fn instantiate_identity_into( - &self, - tcx: TyCtxt<'tcx>, - instantiated: &mut InstantiatedPredicates<'tcx>, - ) { - if let Some(def_id) = self.parent { - tcx.predicates_of(def_id).instantiate_identity_into(tcx, instantiated); - } - instantiated.predicates.extend(self.predicates.iter().map(|(p, _)| p)); - instantiated.spans.extend(self.predicates.iter().map(|(_, s)| s)); - } -} - #[derive(Debug)] crate struct PredicateInner<'tcx> { kind: Binder>, @@ -1032,7 +365,7 @@ crate struct PredicateInner<'tcx> { outer_exclusive_binder: ty::DebruijnIndex, } -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(PredicateInner<'_>, 40); #[derive(Clone, Copy, Lift)] @@ -1057,6 +390,7 @@ impl<'tcx> Eq for Predicate<'tcx> {} impl<'tcx> Predicate<'tcx> { /// Gets the inner `Binder>`. + #[inline] pub fn kind(self) -> Binder> { self.inner.kind } @@ -1289,8 +623,22 @@ impl<'tcx> PolyProjectionPredicate<'tcx> { self.skip_binder().projection_ty.item_def_id } + /// Returns the `DefId` of the trait of the associated item being projected. + #[inline] + pub fn trait_def_id(&self, tcx: TyCtxt<'tcx>) -> DefId { + self.skip_binder().projection_ty.trait_def_id(tcx) + } + + #[inline] + pub fn projection_self_ty(&self) -> Binder> { + self.map_bound(|predicate| predicate.projection_ty.self_ty()) + } + + /// Get the [PolyTraitRef] required for this projection to be well formed. + /// Note that for generic associated types the predicates of the associated + /// type also need to be checked. #[inline] - pub fn to_poly_trait_ref(&self, tcx: TyCtxt<'tcx>) -> PolyTraitRef<'tcx> { + pub fn required_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 @@ -1917,32 +1265,6 @@ pub struct Destructor { pub did: DefId, } -bitflags! { - #[derive(HashStable)] - pub struct AdtFlags: u32 { - const NO_ADT_FLAGS = 0; - /// Indicates whether the ADT is an enum. - const IS_ENUM = 1 << 0; - /// Indicates whether the ADT is a union. - const IS_UNION = 1 << 1; - /// Indicates whether the ADT is a struct. - const IS_STRUCT = 1 << 2; - /// Indicates whether the ADT is a struct and has a constructor. - const HAS_CTOR = 1 << 3; - /// Indicates whether the type is `PhantomData`. - const IS_PHANTOM_DATA = 1 << 4; - /// Indicates whether the type has a `#[fundamental]` attribute. - const IS_FUNDAMENTAL = 1 << 5; - /// Indicates whether the type is `Box`. - const IS_BOX = 1 << 6; - /// Indicates whether the type is `ManuallyDrop`. - const IS_MANUALLY_DROP = 1 << 7; - /// Indicates whether the variant list of this ADT is `#[non_exhaustive]`. - /// (i.e., this flag is never set unless this ADT is an enum). - const IS_VARIANT_LIST_NON_EXHAUSTIVE = 1 << 8; - } -} - bitflags! { #[derive(HashStable)] pub struct VariantFlags: u32 { @@ -2066,105 +1388,6 @@ pub struct FieldDef { pub vis: Visibility, } -/// The definition of a user-defined type, e.g., a `struct`, `enum`, or `union`. -/// -/// These are all interned (by `alloc_adt_def`) into the global arena. -/// -/// The initialism *ADT* stands for an [*algebraic data type (ADT)*][adt]. -/// This is slightly wrong because `union`s are not ADTs. -/// Moreover, Rust only allows recursive data types through indirection. -/// -/// [adt]: https://en.wikipedia.org/wiki/Algebraic_data_type -pub struct AdtDef { - /// The `DefId` of the struct, enum or union item. - pub did: DefId, - /// Variants of the ADT. If this is a struct or union, then there will be a single variant. - pub variants: IndexVec, - /// Flags of the ADT (e.g., is this a struct? is this non-exhaustive?). - flags: AdtFlags, - /// Repr options provided by the user. - pub repr: ReprOptions, -} - -impl PartialOrd for AdtDef { - fn partial_cmp(&self, other: &AdtDef) -> Option { - Some(self.cmp(&other)) - } -} - -/// There should be only one AdtDef for each `did`, therefore -/// it is fine to implement `Ord` only based on `did`. -impl Ord for AdtDef { - fn cmp(&self, other: &AdtDef) -> Ordering { - self.did.cmp(&other.did) - } -} - -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) - } -} - -impl Eq for AdtDef {} - -impl Hash for AdtDef { - #[inline] - fn hash(&self, s: &mut H) { - (self as *const AdtDef).hash(s) - } -} - -impl Encodable for AdtDef { - fn encode(&self, s: &mut S) -> Result<(), S::Error> { - self.did.encode(s) - } -} - -impl<'a> HashStable> for AdtDef { - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - thread_local! { - static CACHE: RefCell> = Default::default(); - } - - 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 mut hasher = StableHasher::new(); - did.hash_stable(hcx, &mut hasher); - variants.hash_stable(hcx, &mut hasher); - flags.hash_stable(hcx, &mut hasher); - repr.hash_stable(hcx, &mut hasher); - - hasher.finish() - }) - }); - - hash.hash_stable(hcx, hasher); - } -} - -#[derive(Copy, Clone, Debug, Eq, PartialEq, Hash)] -pub enum AdtKind { - Struct, - Union, - Enum, -} - -impl Into for AdtKind { - fn into(self) -> DataTypeKind { - match self { - AdtKind::Struct => DataTypeKind::Struct, - AdtKind::Union => DataTypeKind::Union, - AdtKind::Enum => DataTypeKind::Enum, - } - } -} - bitflags! { #[derive(TyEncodable, TyDecodable, Default, HashStable)] pub struct ReprFlags: u8 { @@ -2287,334 +1510,6 @@ impl ReprOptions { } } -impl<'tcx> AdtDef { - /// Creates a new `AdtDef`. - fn new( - tcx: TyCtxt<'_>, - did: DefId, - kind: AdtKind, - variants: IndexVec, - repr: ReprOptions, - ) -> Self { - debug!("AdtDef::new({:?}, {:?}, {:?}, {:?})", did, kind, variants, repr); - let mut flags = AdtFlags::NO_ADT_FLAGS; - - if kind == AdtKind::Enum && tcx.has_attr(did, sym::non_exhaustive) { - debug!("found non-exhaustive variant list for {:?}", did); - flags = flags | AdtFlags::IS_VARIANT_LIST_NON_EXHAUSTIVE; - } - - flags |= match kind { - AdtKind::Enum => AdtFlags::IS_ENUM, - AdtKind::Union => AdtFlags::IS_UNION, - AdtKind::Struct => AdtFlags::IS_STRUCT, - }; - - if kind == AdtKind::Struct && variants[VariantIdx::new(0)].ctor_def_id.is_some() { - flags |= AdtFlags::HAS_CTOR; - } - - let attrs = tcx.get_attrs(did); - if tcx.sess.contains_name(&attrs, sym::fundamental) { - flags |= AdtFlags::IS_FUNDAMENTAL; - } - if Some(did) == tcx.lang_items().phantom_data() { - flags |= AdtFlags::IS_PHANTOM_DATA; - } - if Some(did) == tcx.lang_items().owned_box() { - flags |= AdtFlags::IS_BOX; - } - if Some(did) == tcx.lang_items().manually_drop() { - flags |= AdtFlags::IS_MANUALLY_DROP; - } - - AdtDef { did, variants, flags, repr } - } - - /// Returns `true` if this is a struct. - #[inline] - pub fn is_struct(&self) -> bool { - self.flags.contains(AdtFlags::IS_STRUCT) - } - - /// Returns `true` if this is a union. - #[inline] - pub fn is_union(&self) -> bool { - self.flags.contains(AdtFlags::IS_UNION) - } - - /// Returns `true` if this is a enum. - #[inline] - pub fn is_enum(&self) -> bool { - self.flags.contains(AdtFlags::IS_ENUM) - } - - /// Returns `true` if the variant list of this ADT is `#[non_exhaustive]`. - #[inline] - pub fn is_variant_list_non_exhaustive(&self) -> bool { - self.flags.contains(AdtFlags::IS_VARIANT_LIST_NON_EXHAUSTIVE) - } - - /// Returns the kind of the ADT. - #[inline] - pub fn adt_kind(&self) -> AdtKind { - if self.is_enum() { - AdtKind::Enum - } else if self.is_union() { - AdtKind::Union - } else { - AdtKind::Struct - } - } - - /// Returns a description of this abstract data type. - pub fn descr(&self) -> &'static str { - match self.adt_kind() { - AdtKind::Struct => "struct", - AdtKind::Union => "union", - AdtKind::Enum => "enum", - } - } - - /// Returns a description of a variant of this abstract data type. - #[inline] - pub fn variant_descr(&self) -> &'static str { - match self.adt_kind() { - AdtKind::Struct => "struct", - AdtKind::Union => "union", - AdtKind::Enum => "variant", - } - } - - /// If this function returns `true`, it implies that `is_struct` must return `true`. - #[inline] - pub fn has_ctor(&self) -> bool { - self.flags.contains(AdtFlags::HAS_CTOR) - } - - /// Returns `true` if this type is `#[fundamental]` for the purposes - /// of coherence checking. - #[inline] - pub fn is_fundamental(&self) -> bool { - self.flags.contains(AdtFlags::IS_FUNDAMENTAL) - } - - /// Returns `true` if this is `PhantomData`. - #[inline] - pub fn is_phantom_data(&self) -> bool { - self.flags.contains(AdtFlags::IS_PHANTOM_DATA) - } - - /// Returns `true` if this is Box. - #[inline] - pub fn is_box(&self) -> bool { - self.flags.contains(AdtFlags::IS_BOX) - } - - /// Returns `true` if this is `ManuallyDrop`. - #[inline] - pub fn is_manually_drop(&self) -> bool { - self.flags.contains(AdtFlags::IS_MANUALLY_DROP) - } - - /// Returns `true` if this type has a destructor. - pub fn has_dtor(&self, tcx: TyCtxt<'tcx>) -> bool { - self.destructor(tcx).is_some() - } - - /// Asserts this is a struct or union and returns its unique variant. - pub fn non_enum_variant(&self) -> &VariantDef { - assert!(self.is_struct() || self.is_union()); - &self.variants[VariantIdx::new(0)] - } - - #[inline] - pub fn predicates(&self, tcx: TyCtxt<'tcx>) -> GenericPredicates<'tcx> { - tcx.predicates_of(self.did) - } - - /// Returns an iterator over all fields contained - /// by this ADT. - #[inline] - pub fn all_fields(&self) -> impl Iterator + Clone { - self.variants.iter().flat_map(|v| v.fields.iter()) - } - - /// Whether the ADT lacks fields. Note that this includes uninhabited enums, - /// e.g., `enum Void {}` is considered payload free as well. - pub fn is_payloadfree(&self) -> bool { - 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") - } - - /// 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)) - .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 - } - - /// 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 - } - - 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), - } - } - - #[inline] - pub fn eval_explicit_discr(&self, tcx: TyCtxt<'tcx>, expr_did: DefId) -> Option> { - assert!(self.is_enum()); - let param_env = tcx.param_env(expr_did); - let repr_type = self.repr.discr_type(); - match tcx.const_eval_poly(expr_did) { - Ok(val) => { - let ty = repr_type.to_ty(tcx); - if let Some(b) = val.try_to_bits_for_ty(tcx, param_env, ty) { - trace!("discriminants: {} ({:?})", b, repr_type); - Some(Discr { val: b, 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(); - None - } - } - Err(err) => { - let msg = match err { - ErrorHandled::Reported(ErrorReported) | ErrorHandled::Linted => { - "enum discriminant evaluation failed" - } - ErrorHandled::TooGeneric => "enum discriminant depends on generics", - }; - tcx.sess.delay_span_bug(tcx.def_span(expr_did), msg); - None - } - } - } - - #[inline] - pub fn discriminants( - &'tcx self, - tcx: TyCtxt<'tcx>, - ) -> impl Iterator)> + Captures<'tcx> { - assert!(self.is_enum()); - let repr_type = self.repr.discr_type(); - let initial = repr_type.initial_discriminant(tcx); - let mut prev_discr = None::>; - self.variants.iter_enumerated().map(move |(i, v)| { - let mut discr = prev_discr.map_or(initial, |d| d.wrap_incr(tcx)); - if let VariantDiscr::Explicit(expr_did) = v.discr { - if let Some(new_discr) = self.eval_explicit_discr(tcx, expr_did) { - discr = new_discr; - } - } - prev_discr = Some(discr); - - (i, discr) - }) - } - - #[inline] - pub fn variant_range(&self) -> Range { - VariantIdx::new(0)..VariantIdx::new(self.variants.len()) - } - - /// Computes the discriminant value used by a specific variant. - /// Unlike `discriminants`, this is (amortized) constant-time, - /// only doing at most one query for evaluating an explicit - /// discriminant (the last one before the requested variant), - /// assuming there are no constant-evaluation errors there. - #[inline] - pub fn discriminant_for_variant( - &self, - tcx: TyCtxt<'tcx>, - variant_index: VariantIdx, - ) -> Discr<'tcx> { - assert!(self.is_enum()); - let (val, offset) = self.discriminant_def_for_variant(variant_index); - let explicit_value = val - .and_then(|expr_did| self.eval_explicit_discr(tcx, expr_did)) - .unwrap_or_else(|| self.repr.discr_type().initial_discriminant(tcx)); - explicit_value.checked_add(tcx, offset as u128).0 - } - - /// 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) { - assert!(!self.variants.is_empty()); - let mut explicit_index = variant_index.as_u32(); - let expr_did; - loop { - match self.variants[VariantIdx::from_u32(explicit_index)].discr { - ty::VariantDiscr::Relative(0) => { - expr_did = None; - break; - } - ty::VariantDiscr::Relative(distance) => { - explicit_index -= distance; - } - ty::VariantDiscr::Explicit(did) => { - expr_did = Some(did); - break; - } - } - } - (expr_did, variant_index.as_u32() - explicit_index) - } - - pub fn destructor(&self, tcx: TyCtxt<'tcx>) -> Option { - tcx.adt_destructor(self.did) - } - - /// Returns a list of types such that `Self: Sized` if and only - /// if that type is `Sized`, or `TyErr` if this type is recursive. - /// - /// Oddly enough, checking that the sized-constraint is `Sized` is - /// actually more expressive than checking all members: - /// the `Sized` trait is inductive, so an associated type that references - /// `Self` would prevent its containing ADT from being `Sized`. - /// - /// Due to normalization being eager, this applies even if - /// the associated type is behind a pointer (e.g., issue #31299). - pub fn sized_constraint(&self, tcx: TyCtxt<'tcx>) -> &'tcx [Ty<'tcx>] { - tcx.adt_sized_constraint(self.did).0 - } -} - impl<'tcx> FieldDef { /// Returns the type of this field. The `subst` is typically obtained /// via the second field of `TyKind::AdtDef`. @@ -2623,93 +1518,6 @@ impl<'tcx> FieldDef { } } -/// Represents the various closure traits in the language. This -/// will determine the type of the environment (`self`, in the -/// desugaring) argument that the closure expects. -/// -/// You can get the environment type of a closure using -/// `tcx.closure_env_ty()`. -#[derive(Clone, Copy, PartialOrd, Ord, PartialEq, Eq, Hash, Debug, TyEncodable, TyDecodable)] -#[derive(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 - // hence we order it so that Fn < FnMut < FnOnce. - Fn, - FnMut, - FnOnce, -} - -impl<'tcx> ClosureKind { - // This is the initial value used when doing upvar inference. - pub const LATTICE_BOTTOM: ClosureKind = ClosureKind::Fn; - - pub fn trait_did(&self, tcx: TyCtxt<'tcx>) -> DefId { - match *self { - ClosureKind::Fn => tcx.require_lang_item(LangItem::Fn, None), - ClosureKind::FnMut => tcx.require_lang_item(LangItem::FnMut, None), - ClosureKind::FnOnce => tcx.require_lang_item(LangItem::FnOnce, None), - } - } - - /// Returns `true` if a type that impls this closure kind - /// must also implement `other`. - pub fn extends(self, other: ty::ClosureKind) -> bool { - matches!( - (self, other), - (ClosureKind::Fn, ClosureKind::Fn) - | (ClosureKind::Fn, ClosureKind::FnMut) - | (ClosureKind::Fn, ClosureKind::FnOnce) - | (ClosureKind::FnMut, ClosureKind::FnMut) - | (ClosureKind::FnMut, ClosureKind::FnOnce) - | (ClosureKind::FnOnce, ClosureKind::FnOnce) - ) - } - - /// Returns the representative scalar type for this closure kind. - /// See `TyS::to_opt_closure_kind` for more details. - pub fn to_ty(self, tcx: TyCtxt<'tcx>) -> Ty<'tcx> { - match self { - ty::ClosureKind::Fn => tcx.types.i8, - ty::ClosureKind::FnMut => tcx.types.i16, - ty::ClosureKind::FnOnce => tcx.types.i32, - } - } -} - -impl BorrowKind { - pub fn from_mutbl(m: hir::Mutability) -> BorrowKind { - match m { - hir::Mutability::Mut => MutBorrow, - hir::Mutability::Not => ImmBorrow, - } - } - - /// Returns a mutability `m` such that an `&m T` pointer could be used to obtain this borrow - /// kind. Because borrow kinds are richer than mutabilities, we sometimes have to pick a - /// mutability that is stronger than necessary so that it at least *would permit* the borrow in - /// question. - pub fn to_mutbl_lossy(self) -> hir::Mutability { - match self { - 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::Mut, - } - } - - pub fn to_user_str(&self) -> &'static str { - match *self { - MutBorrow => "mutable", - ImmBorrow => "immutable", - UniqueImmBorrow => "uniquely immutable", - } - } -} - pub type Attributes<'tcx> = &'tcx [ast::Attribute]; #[derive(Debug, PartialEq, Eq)] @@ -2950,7 +1758,10 @@ impl<'tcx> TyCtxt<'tcx> { | DefKind::AnonConst => self.mir_for_ctfe_opt_const_arg(def), // If the caller wants `mir_for_ctfe` of a function they should not be using // `instance_mir`, so we'll assume const fn also wants the optimized version. - _ => self.optimized_mir_or_const_arg_mir(def), + _ => { + assert_eq!(def.const_param_did, None); + self.optimized_mir(def.did) + } }, ty::InstanceDef::VtableShim(..) | ty::InstanceDef::ReifyShim(..) @@ -2985,7 +1796,7 @@ impl<'tcx> TyCtxt<'tcx> { /// Returns layout of a generator. Layout might be unavailable if the /// generator is tainted by errors. pub fn generator_layout(self, def_id: DefId) -> Option<&'tcx GeneratorLayout<'tcx>> { - self.optimized_mir(def_id).generator_layout.as_ref() + self.optimized_mir(def_id).generator_layout() } /// Given the `DefId` of an impl, returns the `DefId` of the trait it implements. @@ -3064,9 +1875,6 @@ impl<'tcx> TyCtxt<'tcx> { } } -#[derive(Clone, HashStable, Debug)] -pub struct AdtSizedConstraint<'tcx>(pub &'tcx [Ty<'tcx>]); - /// 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(def_id) = def_id.as_local() { diff --git a/compiler/rustc_middle/src/ty/print/pretty.rs b/compiler/rustc_middle/src/ty/print/pretty.rs index 4937fdd731..7946d17006 100644 --- a/compiler/rustc_middle/src/ty/print/pretty.rs +++ b/compiler/rustc_middle/src/ty/print/pretty.rs @@ -607,7 +607,7 @@ pub trait PrettyPrinter<'tcx>: return Ok(self); } - return Ok(with_no_queries(|| { + return 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)); @@ -649,7 +649,7 @@ pub trait PrettyPrinter<'tcx>: p!(" Sized"); } Ok(self) - })?); + }); } ty::Str => p!("str"), ty::Generator(did, substs, movability) => { @@ -956,32 +956,40 @@ pub trait PrettyPrinter<'tcx>: } fn pretty_print_const_scalar( - mut self, + self, scalar: Scalar, ty: Ty<'tcx>, print_ty: bool, + ) -> Result { + match scalar { + Scalar::Ptr(ptr) => self.pretty_print_const_scalar_ptr(ptr, ty, print_ty), + Scalar::Int(int) => self.pretty_print_const_scalar_int(int, ty, print_ty), + } + } + + fn pretty_print_const_scalar_ptr( + mut self, + ptr: Pointer, + ty: Ty<'tcx>, + print_ty: bool, ) -> Result { define_scoped_cx!(self); - match (scalar, &ty.kind()) { + match ty.kind() { // Byte strings (&[u8; N]) - ( - Scalar::Ptr(ptr), - ty::Ref( - _, - ty::TyS { - kind: - ty::Array( - ty::TyS { kind: ty::Uint(ty::UintTy::U8), .. }, - ty::Const { - val: ty::ConstKind::Value(ConstValue::Scalar(int)), - .. - }, - ), - .. - }, - _, - ), + ty::Ref( + _, + ty::TyS { + kind: + ty::Array( + ty::TyS { kind: ty::Uint(ty::UintTy::U8), .. }, + ty::Const { + val: ty::ConstKind::Value(ConstValue::Scalar(int)), .. + }, + ), + .. + }, + _, ) => match self.tcx().get_global_alloc(ptr.alloc_id) { Some(GlobalAlloc::Memory(alloc)) => { let bytes = int.assert_bits(self.tcx().data_layout.pointer_size); @@ -997,28 +1005,59 @@ pub trait PrettyPrinter<'tcx>: Some(GlobalAlloc::Function(_)) => p!(""), None => p!(""), }, + ty::FnPtr(_) => { + // FIXME: We should probably have a helper method to share code with the "Byte strings" + // printing above (which also has to handle pointers to all sorts of things). + match self.tcx().get_global_alloc(ptr.alloc_id) { + Some(GlobalAlloc::Function(instance)) => { + self = self.typed_value( + |this| this.print_value_path(instance.def_id(), instance.substs), + |this| this.print_type(ty), + " as ", + )?; + } + _ => self = self.pretty_print_const_pointer(ptr, ty, print_ty)?, + } + } + // Any pointer values not covered by a branch above + _ => { + self = self.pretty_print_const_pointer(ptr, ty, print_ty)?; + } + } + Ok(self) + } + + fn pretty_print_const_scalar_int( + mut self, + int: ScalarInt, + ty: Ty<'tcx>, + print_ty: bool, + ) -> Result { + define_scoped_cx!(self); + + match ty.kind() { // Bool - (Scalar::Int(int), ty::Bool) if int == ScalarInt::FALSE => p!("false"), - (Scalar::Int(int), ty::Bool) if int == ScalarInt::TRUE => p!("true"), + ty::Bool if int == ScalarInt::FALSE => p!("false"), + ty::Bool if int == ScalarInt::TRUE => p!("true"), // Float - (Scalar::Int(int), ty::Float(ty::FloatTy::F32)) => { + ty::Float(ty::FloatTy::F32) => { p!(write("{}f32", Single::try_from(int).unwrap())) } - (Scalar::Int(int), ty::Float(ty::FloatTy::F64)) => { + ty::Float(ty::FloatTy::F64) => { p!(write("{}f64", Double::try_from(int).unwrap())) } // Int - (Scalar::Int(int), ty::Uint(_) | ty::Int(_)) => { + ty::Uint(_) | ty::Int(_) => { let int = ConstInt::new(int, matches!(ty.kind(), ty::Int(_)), ty.is_ptr_sized_integral()); if print_ty { p!(write("{:#?}", int)) } else { p!(write("{:?}", int)) } } // Char - (Scalar::Int(int), ty::Char) if char::try_from(int).is_ok() => { + ty::Char if char::try_from(int).is_ok() => { p!(write("{:?}", char::try_from(int).unwrap())) } // Raw pointers - (Scalar::Int(int), ty::RawPtr(_)) => { + ty::RawPtr(_) | ty::FnPtr(_) => { let data = int.assert_bits(self.tcx().data_layout.pointer_size); self = self.typed_value( |mut this| { @@ -1029,23 +1068,12 @@ pub trait PrettyPrinter<'tcx>: " as ", )?; } - (Scalar::Ptr(ptr), ty::FnPtr(_)) => { - // FIXME: this can ICE when the ptr is dangling or points to a non-function. - // We should probably have a helper method to share code with the "Byte strings" - // printing above (which also has to handle pointers to all sorts of things). - let instance = self.tcx().global_alloc(ptr.alloc_id).unwrap_fn(); - self = self.typed_value( - |this| this.print_value_path(instance.def_id(), instance.substs), - |this| this.print_type(ty), - " as ", - )?; - } // For function type zsts just printing the path is enough - (Scalar::Int(int), ty::FnDef(d, s)) if int == ScalarInt::ZST => { + ty::FnDef(d, s) if int == ScalarInt::ZST => { p!(print_value_path(*d, s)) } // Nontrivial types with scalar bit representation - (Scalar::Int(int), _) => { + _ => { let print = |mut this: Self| { if int.size() == Size::ZERO { write!(this, "transmute(())")?; @@ -1060,10 +1088,6 @@ pub trait PrettyPrinter<'tcx>: print(self)? }; } - // Any pointer values not covered by a branch above - (Scalar::Ptr(p), _) => { - self = self.pretty_print_const_pointer(p, ty, print_ty)?; - } } Ok(self) } @@ -2107,11 +2131,9 @@ fn for_each_def(tcx: TyCtxt<'_>, mut collect_fn: impl for<'b> FnMut(&'b Ident, N continue; } - if let Some(local_def_id) = hir.definitions().opt_hir_id_to_local_def_id(item.hir_id) { - let def_id = local_def_id.to_def_id(); - let ns = tcx.def_kind(def_id).ns().unwrap_or(Namespace::TypeNS); - collect_fn(&item.ident, ns, def_id); - } + let def_id = item.def_id.to_def_id(); + let ns = tcx.def_kind(def_id).ns().unwrap_or(Namespace::TypeNS); + collect_fn(&item.ident, ns, def_id); } // Now take care of extern crate items. @@ -2143,6 +2165,7 @@ fn for_each_def(tcx: TyCtxt<'_>, mut collect_fn: impl for<'b> FnMut(&'b Ident, N match child.res { def::Res::Def(DefKind::AssocTy, _) => {} + def::Res::Def(DefKind::TyAlias, _) => {} def::Res::Def(defkind, def_id) => { if let Some(ns) = defkind.ns() { collect_fn(&child.ident, ns, def_id); diff --git a/compiler/rustc_middle/src/ty/query/job.rs b/compiler/rustc_middle/src/ty/query/job.rs deleted file mode 100644 index bd2e7747b7..0000000000 --- a/compiler/rustc_middle/src/ty/query/job.rs +++ /dev/null @@ -1,26 +0,0 @@ -use crate::ty::tls; - -use rustc_query_system::query::deadlock; -use rustc_rayon_core as rayon_core; -use std::thread; - -/// Creates a new thread and forwards information in thread locals to it. -/// The new thread runs the deadlock handler. -/// Must only be called when a deadlock is about to happen. -pub unsafe fn handle_deadlock() { - let registry = rayon_core::Registry::current(); - - let context = tls::get_tlv(); - assert!(context != 0); - rustc_data_structures::sync::assert_sync::>(); - let icx: &tls::ImplicitCtxt<'_, '_> = &*(context as *const tls::ImplicitCtxt<'_, '_>); - - let session_globals = rustc_span::SESSION_GLOBALS.with(|sg| sg as *const _); - let session_globals = &*session_globals; - thread::spawn(move || { - tls::enter_context(icx, |_| { - rustc_span::SESSION_GLOBALS - .set(session_globals, || tls::with(|tcx| deadlock(tcx, ®istry))) - }) - }); -} diff --git a/compiler/rustc_middle/src/ty/query/mod.rs b/compiler/rustc_middle/src/ty/query/mod.rs index f580cb14dc..48e777f715 100644 --- a/compiler/rustc_middle/src/ty/query/mod.rs +++ b/compiler/rustc_middle/src/ty/query/mod.rs @@ -14,8 +14,8 @@ use crate::middle::resolve_lifetime::{ObjectLifetimeDefault, Region, ResolveLife use crate::middle::stability::{self, DeprecationEntry}; use crate::mir; use crate::mir::interpret::GlobalId; +use crate::mir::interpret::{ConstAlloc, LitToConstError, LitToConstInput}; use crate::mir::interpret::{ConstValue, EvalToAllocationRawResult, EvalToConstValueResult}; -use crate::mir::interpret::{LitToConstError, LitToConstInput}; use crate::mir::mono::CodegenUnit; use crate::traits::query::{ CanonicalPredicateGoal, CanonicalProjectionGoal, CanonicalTyGoal, @@ -31,19 +31,19 @@ use crate::traits::{self, ImplSource}; use crate::ty::subst::{GenericArg, SubstsRef}; use crate::ty::util::AlwaysRequiresDrop; use crate::ty::{self, AdtSizedConstraint, CrateInherentImpls, ParamEnvAnd, Ty, TyCtxt}; -use rustc_data_structures::fingerprint::Fingerprint; use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap}; use rustc_data_structures::stable_hasher::StableVec; use rustc_data_structures::steal::Steal; use rustc_data_structures::svh::Svh; use rustc_data_structures::sync::Lrc; -use rustc_errors::ErrorReported; +use rustc_errors::{ErrorReported, Handler}; use rustc_hir as hir; use rustc_hir::def::DefKind; use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, DefIdSet, LocalDefId}; use rustc_hir::lang_items::{LangItem, LanguageItems}; use rustc_hir::{Crate, ItemLocalId, TraitCandidate}; use rustc_index::{bit_set::FiniteBitSet, vec::IndexVec}; +use rustc_serialize::opaque; use rustc_session::config::{EntryFnType, OptLevel, OutputFilenames, SymbolManglingVersion}; use rustc_session::utils::NativeLibKind; use rustc_session::CrateDisambiguator; @@ -53,41 +53,216 @@ use rustc_ast as ast; use rustc_attr as attr; use rustc_span::symbol::Symbol; use rustc_span::{Span, DUMMY_SP}; -use std::borrow::Cow; use std::collections::BTreeMap; use std::ops::Deref; use std::path::PathBuf; use std::sync::Arc; -#[macro_use] -mod plumbing; -pub(crate) use rustc_query_system::query::CycleError; +pub(crate) use rustc_query_system::query::QueryJobId; use rustc_query_system::query::*; -mod stats; -pub use self::stats::print_stats; +pub mod on_disk_cache; +pub use self::on_disk_cache::OnDiskCache; -#[cfg(parallel_compiler)] -mod job; -#[cfg(parallel_compiler)] -pub use self::job::handle_deadlock; -pub use rustc_query_system::query::{QueryInfo, QueryJob, QueryJobId}; +#[derive(Copy, Clone)] +pub struct TyCtxtAt<'tcx> { + pub tcx: TyCtxt<'tcx>, + pub span: Span, +} -mod keys; -use self::keys::Key; +impl Deref for TyCtxtAt<'tcx> { + type Target = TyCtxt<'tcx>; + #[inline(always)] + fn deref(&self) -> &Self::Target { + &self.tcx + } +} -mod values; -use self::values::Value; +#[derive(Copy, Clone)] +pub struct TyCtxtEnsure<'tcx> { + pub tcx: TyCtxt<'tcx>, +} -use rustc_query_system::query::QueryAccessors; -pub use rustc_query_system::query::QueryConfig; -pub(crate) use rustc_query_system::query::QueryDescription; +impl TyCtxt<'tcx> { + /// Returns a transparent wrapper for `TyCtxt`, which ensures queries + /// are executed instead of just returning their results. + #[inline(always)] + pub fn ensure(self) -> TyCtxtEnsure<'tcx> { + TyCtxtEnsure { tcx: self } + } -mod on_disk_cache; -pub use self::on_disk_cache::OnDiskCache; + /// Returns a transparent wrapper for `TyCtxt` which uses + /// `span` as the location of queries performed through it. + #[inline(always)] + pub fn at(self, span: Span) -> TyCtxtAt<'tcx> { + TyCtxtAt { tcx: self, span } + } + + pub fn try_mark_green(self, dep_node: &dep_graph::DepNode) -> bool { + self.queries.try_mark_green(self, dep_node) + } +} + +macro_rules! query_helper_param_ty { + (DefId) => { impl IntoQueryParam }; + ($K:ty) => { $K }; +} + +macro_rules! query_storage { + ([][$K:ty, $V:ty]) => { + >::Cache + }; + ([storage($ty:ty) $($rest:tt)*][$K:ty, $V:ty]) => { + <$ty as CacheSelector<$K, $V>>::Cache + }; + ([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*][$($args:tt)*]) => { + query_storage!([$($($modifiers)*)*][$($args)*]) + }; +} + +macro_rules! define_callbacks { + (<$tcx:tt> + $($(#[$attr:meta])* + [$($modifiers:tt)*] fn $name:ident($($K:tt)*) -> $V:ty,)*) => { + + // HACK(eddyb) this is like the `impl QueryConfig for queries::$name` + // below, but using type aliases instead of associated types, to bypass + // the limitations around normalizing under HRTB - for example, this: + // `for<'tcx> fn(...) -> as QueryConfig>>::Value` + // doesn't currently normalize to `for<'tcx> fn(...) -> query_values::$name<'tcx>`. + // This is primarily used by the `provide!` macro in `rustc_metadata`. + #[allow(nonstandard_style, unused_lifetimes)] + pub mod query_keys { + use super::*; + + $(pub type $name<$tcx> = $($K)*;)* + } + #[allow(nonstandard_style, unused_lifetimes)] + pub mod query_values { + use super::*; + + $(pub type $name<$tcx> = $V;)* + } + #[allow(nonstandard_style, unused_lifetimes)] + pub mod query_storage { + use super::*; + + $(pub type $name<$tcx> = query_storage!([$($modifiers)*][$($K)*, $V]);)* + } + #[allow(nonstandard_style, unused_lifetimes)] + pub mod query_stored { + use super::*; + + $(pub type $name<$tcx> = as QueryStorage>::Stored;)* + } -mod profiling_support; -pub use self::profiling_support::{IntoSelfProfilingString, QueryKeyStringBuilder}; + #[derive(Default)] + pub struct QueryCaches<$tcx> { + $($(#[$attr])* pub $name: QueryCacheStore>,)* + } + + impl TyCtxtEnsure<$tcx> { + $($(#[$attr])* + #[inline(always)] + pub fn $name(self, key: query_helper_param_ty!($($K)*)) { + let key = key.into_query_param(); + let cached = try_get_cached(self.tcx, &self.tcx.query_caches.$name, &key, |_| {}); + + let lookup = match cached { + Ok(()) => return, + Err(lookup) => lookup, + }; + + self.tcx.queries.$name(self.tcx, DUMMY_SP, key, lookup, QueryMode::Ensure); + })* + } + + impl TyCtxt<$tcx> { + $($(#[$attr])* + #[inline(always)] + #[must_use] + pub fn $name(self, key: query_helper_param_ty!($($K)*)) -> query_stored::$name<$tcx> + { + self.at(DUMMY_SP).$name(key) + })* + } + + impl TyCtxtAt<$tcx> { + $($(#[$attr])* + #[inline(always)] + pub fn $name(self, key: query_helper_param_ty!($($K)*)) -> query_stored::$name<$tcx> + { + let key = key.into_query_param(); + let cached = try_get_cached(self.tcx, &self.tcx.query_caches.$name, &key, |value| { + value.clone() + }); + + let lookup = match cached { + Ok(value) => return value, + Err(lookup) => lookup, + }; + + self.tcx.queries.$name(self.tcx, self.span, key, lookup, QueryMode::Get).unwrap() + })* + } + + pub struct Providers { + $(pub $name: for<'tcx> fn( + TyCtxt<'tcx>, + query_keys::$name<'tcx>, + ) -> query_values::$name<'tcx>,)* + } + + impl Default for Providers { + fn default() -> Self { + Providers { + $($name: |_, key| bug!( + "`tcx.{}({:?})` unsupported by its crate", + stringify!($name), key + ),)* + } + } + } + + impl Copy for Providers {} + impl Clone for Providers { + fn clone(&self) -> Self { *self } + } + + pub trait QueryEngine<'tcx>: rustc_data_structures::sync::Sync { + unsafe fn deadlock(&'tcx self, tcx: TyCtxt<'tcx>, registry: &rustc_rayon_core::Registry); + + fn encode_query_results( + &'tcx self, + tcx: TyCtxt<'tcx>, + encoder: &mut on_disk_cache::CacheEncoder<'a, 'tcx, opaque::FileEncoder>, + query_result_index: &mut on_disk_cache::EncodedQueryResultIndex, + ) -> opaque::FileEncodeResult; + + fn exec_cache_promotions(&'tcx self, tcx: TyCtxt<'tcx>); + + fn try_mark_green(&'tcx self, tcx: TyCtxt<'tcx>, dep_node: &dep_graph::DepNode) -> bool; + + fn try_print_query_stack( + &'tcx self, + tcx: TyCtxt<'tcx>, + query: Option>, + handler: &Handler, + num_frames: Option, + ) -> usize; + + $($(#[$attr])* + fn $name( + &'tcx self, + tcx: TyCtxt<$tcx>, + span: Span, + key: query_keys::$name<$tcx>, + lookup: QueryLookup, + mode: QueryMode, + ) -> Option>;)* + } + }; +} // Each of these queries corresponds to a function pointer field in the // `Providers` struct for requesting a value of that type, and a method @@ -101,7 +276,7 @@ pub use self::profiling_support::{IntoSelfProfilingString, QueryKeyStringBuilder // Queries marked with `fatal_cycle` do not need the latter implementation, // as they will raise an fatal error on query cycles instead. -rustc_query_append! { [define_queries!][<'tcx>] } +rustc_query_append! { [define_callbacks!][<'tcx>] } mod sealed { use super::{DefId, LocalDefId}; diff --git a/compiler/rustc_middle/src/ty/query/on_disk_cache.rs b/compiler/rustc_middle/src/ty/query/on_disk_cache.rs index cfe47004e0..78193acc74 100644 --- a/compiler/rustc_middle/src/ty/query/on_disk_cache.rs +++ b/compiler/rustc_middle/src/ty/query/on_disk_cache.rs @@ -14,6 +14,8 @@ use rustc_hir::def_id::{CrateNum, DefId, DefIndex, LocalDefId, LOCAL_CRATE}; use rustc_hir::definitions::DefPathHash; use rustc_hir::definitions::Definitions; use rustc_index::vec::{Idx, IndexVec}; +use rustc_query_system::dep_graph::DepContext; +use rustc_query_system::query::QueryContext; use rustc_serialize::{ opaque::{self, FileEncodeResult, FileEncoder}, Decodable, Decoder, Encodable, Encoder, @@ -132,7 +134,7 @@ struct Footer { foreign_def_path_hashes: UnhashMap, } -type EncodedQueryResultIndex = Vec<(SerializedDepNodeIndex, AbsoluteBytePos)>; +pub type EncodedQueryResultIndex = Vec<(SerializedDepNodeIndex, AbsoluteBytePos)>; type EncodedDiagnosticsIndex = Vec<(SerializedDepNodeIndex, AbsoluteBytePos)>; type EncodedDiagnostics = Vec; @@ -140,7 +142,7 @@ type EncodedDiagnostics = Vec; struct SourceFileIndex(u32); #[derive(Copy, Clone, Debug, Hash, Eq, PartialEq, Encodable, Decodable)] -struct AbsoluteBytePos(u32); +pub struct AbsoluteBytePos(u32); impl AbsoluteBytePos { fn new(pos: usize) -> AbsoluteBytePos { @@ -284,7 +286,7 @@ impl<'sess> OnDiskCache<'sess> { // Do this *before* we clone 'latest_foreign_def_path_hashes', since // loading existing queries may cause us to create new DepNodes, which // may in turn end up invoking `store_foreign_def_id_hash` - tcx.dep_graph.exec_cache_promotions(tcx); + tcx.queries.exec_cache_promotions(tcx); let latest_foreign_def_path_hashes = self.latest_foreign_def_path_hashes.lock().clone(); let hygiene_encode_context = HygieneEncodeContext::default(); @@ -307,22 +309,7 @@ impl<'sess> OnDiskCache<'sess> { tcx.sess.time("encode_query_results", || -> FileEncodeResult { let enc = &mut encoder; let qri = &mut query_result_index; - - macro_rules! encode_queries { - ($($query:ident,)*) => { - $( - encode_query_results::>( - tcx, - enc, - qri - )?; - )* - } - } - - rustc_cached_queries!(encode_queries!); - - Ok(()) + tcx.queries.encode_query_results(tcx, enc, qri) })?; // Encode diagnostics. @@ -427,7 +414,7 @@ impl<'sess> OnDiskCache<'sess> { fn sorted_cnums_including_local_crate(tcx: TyCtxt<'_>) -> Vec { let mut cnums = vec![LOCAL_CRATE]; - cnums.extend_from_slice(&tcx.crates()[..]); + cnums.extend_from_slice(tcx.crates()); cnums.sort_unstable(); // Just to be sure... cnums.dedup(); @@ -515,7 +502,7 @@ impl<'sess> OnDiskCache<'sess> { /// Returns the cached query result if there is something in the cache for /// the given `SerializedDepNodeIndex`; otherwise returns `None`. - crate fn try_load_query_result<'tcx, T>( + pub fn try_load_query_result<'tcx, T>( &self, tcx: TyCtxt<'tcx>, dep_node_index: SerializedDepNodeIndex, @@ -678,7 +665,7 @@ impl<'sess> OnDiskCache<'sess> { /// A decoder that can read from the incremental compilation cache. It is similar to the one /// we use for crate metadata decoding in that it can rebase spans and eventually /// will also handle things that contain `Ty` instances. -crate struct CacheDecoder<'a, 'tcx> { +pub struct CacheDecoder<'a, 'tcx> { tcx: TyCtxt<'tcx>, opaque: opaque::Decoder<'a>, source_map: &'a SourceMap, @@ -918,7 +905,6 @@ impl<'a, 'tcx> Decodable> for DefId { // which means that the definition with this hash is guaranteed to // still exist in the current compilation session. Ok(d.tcx() - .queries .on_disk_cache .as_ref() .unwrap() @@ -973,7 +959,7 @@ impl<'a, 'tcx> Decodable> for &'tcx [Span] { //- ENCODING ------------------------------------------------------------------- -trait OpaqueEncoder: Encoder { +pub trait OpaqueEncoder: Encoder { fn position(&self) -> usize; } @@ -985,7 +971,7 @@ impl OpaqueEncoder for FileEncoder { } /// An encoder that can write to the incremental compilation cache. -struct CacheEncoder<'a, 'tcx, E: OpaqueEncoder> { +pub struct CacheEncoder<'a, 'tcx, E: OpaqueEncoder> { tcx: TyCtxt<'tcx>, encoder: &'a mut E, type_shorthands: FxHashMap, usize>, @@ -1059,12 +1045,12 @@ where E: 'a + OpaqueEncoder, { fn encode(&self, s: &mut CacheEncoder<'a, 'tcx, E>) -> Result<(), E::Error> { - if *self == DUMMY_SP { + let span_data = self.data(); + if self.is_dummy() { TAG_PARTIAL_SPAN.encode(s)?; - return SyntaxContext::root().encode(s); + return span_data.ctxt.encode(s); } - let span_data = self.data(); let pos = s.source_map.byte_pos_to_line_and_col(span_data.lo); let partial_span = match &pos { Some((file_lo, _, _)) => !file_lo.contains(span_data.hi), @@ -1230,24 +1216,24 @@ impl<'a> Decodable> for IntEncodedWithFixedSize { } } -fn encode_query_results<'a, 'tcx, Q>( - tcx: TyCtxt<'tcx>, +pub fn encode_query_results<'a, 'tcx, CTX, Q>( + tcx: CTX, encoder: &mut CacheEncoder<'a, 'tcx, FileEncoder>, query_result_index: &mut EncodedQueryResultIndex, ) -> FileEncodeResult where - Q: super::QueryDescription> + super::QueryAccessors>, + CTX: QueryContext + 'tcx, + Q: super::QueryDescription + super::QueryAccessors, Q::Value: Encodable>, { let _timer = tcx - .sess - .prof + .dep_context() + .profiler() .extra_verbose_generic_activity("encode_query_results_for", std::any::type_name::()); - let state = Q::query_state(tcx); - assert!(state.all_inactive()); - - state.iter_results(|results| { + assert!(Q::query_state(tcx).all_inactive()); + let cache = Q::query_cache(tcx); + cache.iter_results(|results| { for (key, value, dep_node) in results { if Q::cache_on_disk(tcx, &key, Some(value)) { let dep_node = SerializedDepNodeIndex::new(dep_node.index()); diff --git a/compiler/rustc_middle/src/ty/query/plumbing.rs b/compiler/rustc_middle/src/ty/query/plumbing.rs deleted file mode 100644 index d0730bd121..0000000000 --- a/compiler/rustc_middle/src/ty/query/plumbing.rs +++ /dev/null @@ -1,576 +0,0 @@ -//! The implementation of the query system itself. This defines the macros that -//! generate the actual methods on tcx which find and execute the provider, -//! manage the caches, and so forth. - -use crate::dep_graph::DepGraph; -use crate::ty::query::Query; -use crate::ty::tls::{self, ImplicitCtxt}; -use crate::ty::{self, TyCtxt}; -use rustc_query_system::query::QueryContext; -use rustc_query_system::query::{CycleError, QueryJobId, QueryJobInfo}; - -use rustc_data_structures::fx::FxHashMap; -use rustc_data_structures::sync::Lock; -use rustc_data_structures::thin_vec::ThinVec; -use rustc_errors::{struct_span_err, Diagnostic, DiagnosticBuilder, Handler, Level}; -use rustc_span::def_id::DefId; -use rustc_span::Span; - -impl QueryContext for TyCtxt<'tcx> { - type Query = Query<'tcx>; - - fn incremental_verify_ich(&self) -> bool { - self.sess.opts.debugging_opts.incremental_verify_ich - } - fn verbose(&self) -> bool { - self.sess.verbose() - } - - fn def_path_str(&self, def_id: DefId) -> String { - TyCtxt::def_path_str(*self, def_id) - } - - fn dep_graph(&self) -> &DepGraph { - &self.dep_graph - } - - fn current_query_job(&self) -> Option> { - tls::with_related_context(*self, |icx| icx.query) - } - - fn try_collect_active_jobs( - &self, - ) -> Option, QueryJobInfo>> - { - self.queries.try_collect_active_jobs() - } - - /// Executes a job by changing the `ImplicitCtxt` to point to the - /// new query job while it executes. It returns the diagnostics - /// captured during execution and the actual result. - #[inline(always)] - fn start_query( - &self, - token: QueryJobId, - diagnostics: Option<&Lock>>, - compute: impl FnOnce(Self) -> R, - ) -> R { - // The `TyCtxt` stored in TLS has the same global interner lifetime - // as `self`, so we use `with_related_context` to relate the 'tcx lifetimes - // when accessing the `ImplicitCtxt`. - tls::with_related_context(*self, move |current_icx| { - // Update the `ImplicitCtxt` to point to our new query job. - let new_icx = ImplicitCtxt { - tcx: *self, - query: Some(token), - diagnostics, - layout_depth: current_icx.layout_depth, - task_deps: current_icx.task_deps, - }; - - // Use the `ImplicitCtxt` while we execute the query. - tls::enter_context(&new_icx, |_| { - rustc_data_structures::stack::ensure_sufficient_stack(|| compute(*self)) - }) - }) - } -} - -impl<'tcx> TyCtxt<'tcx> { - #[inline(never)] - #[cold] - pub(super) fn report_cycle( - self, - CycleError { usage, cycle: stack }: CycleError>, - ) -> DiagnosticBuilder<'tcx> { - assert!(!stack.is_empty()); - - let fix_span = |span: Span, query: &Query<'tcx>| { - self.sess.source_map().guess_head_span(query.default_span(self, span)) - }; - - // Disable naming impls with types in this path, since that - // sometimes cycles itself, leading to extra cycle errors. - // (And cycle errors around impls tend to occur during the - // 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) - ); - - for i in 1..stack.len() { - let query = &stack[i].query; - let span = fix_span(stack[(i + 1) % stack.len()].span, query); - err.span_note(span, &format!("...which requires {}...", 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 - }) - } - - pub fn try_print_query_stack(handler: &Handler, num_frames: Option) { - eprintln!("query stack during panic:"); - - // Be careful relying on global state here: this code is called from - // a panic hook, which means that the global `Handler` may be in a weird - // state if it was responsible for triggering the panic. - let mut i = 0; - ty::tls::with_context_opt(|icx| { - if let Some(icx) = icx { - let query_map = icx.tcx.queries.try_collect_active_jobs(); - - let mut current_query = icx.query; - - while let Some(query) = current_query { - if Some(i) == num_frames { - break; - } - let query_info = - if let Some(info) = query_map.as_ref().and_then(|map| map.get(&query)) { - info - } else { - break; - }; - let mut diag = Diagnostic::new( - Level::FailureNote, - &format!( - "#{} [{}] {}", - i, - query_info.info.query.name(), - query_info.info.query.describe(icx.tcx) - ), - ); - diag.span = - icx.tcx.sess.source_map().guess_head_span(query_info.info.span).into(); - handler.force_print_diagnostic(diag); - - current_query = query_info.job.parent; - i += 1; - } - } - }); - - if num_frames == None || num_frames >= Some(i) { - eprintln!("end of query stack"); - } else { - eprintln!("we're just showing a limited slice of the query stack"); - } - } -} - -macro_rules! handle_cycle_error { - ([][$tcx: expr, $error:expr]) => {{ - $tcx.report_cycle($error).emit(); - Value::from_cycle_error($tcx) - }}; - ([fatal_cycle $($rest:tt)*][$tcx:expr, $error:expr]) => {{ - $tcx.report_cycle($error).emit(); - $tcx.sess.abort_if_errors(); - unreachable!() - }}; - ([cycle_delay_bug $($rest:tt)*][$tcx:expr, $error:expr]) => {{ - $tcx.report_cycle($error).delay_as_bug(); - Value::from_cycle_error($tcx) - }}; - ([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*][$($args:tt)*]) => { - handle_cycle_error!([$($($modifiers)*)*][$($args)*]) - }; -} - -macro_rules! is_anon { - ([]) => {{ - false - }}; - ([anon $($rest:tt)*]) => {{ - true - }}; - ([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*]) => { - is_anon!([$($($modifiers)*)*]) - }; -} - -macro_rules! is_eval_always { - ([]) => {{ - false - }}; - ([eval_always $($rest:tt)*]) => {{ - true - }}; - ([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*]) => { - is_eval_always!([$($($modifiers)*)*]) - }; -} - -macro_rules! query_storage { - ([][$K:ty, $V:ty]) => { - <<$K as Key>::CacheSelector as CacheSelector<$K, $V>>::Cache - }; - ([storage($ty:ty) $($rest:tt)*][$K:ty, $V:ty]) => { - <$ty as CacheSelector<$K, $V>>::Cache - }; - ([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*][$($args:tt)*]) => { - query_storage!([$($($modifiers)*)*][$($args)*]) - }; -} - -macro_rules! hash_result { - ([][$hcx:expr, $result:expr]) => {{ - dep_graph::hash_result($hcx, &$result) - }}; - ([no_hash $($rest:tt)*][$hcx:expr, $result:expr]) => {{ - None - }}; - ([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*][$($args:tt)*]) => { - hash_result!([$($($modifiers)*)*][$($args)*]) - }; -} - -macro_rules! query_helper_param_ty { - (DefId) => { impl IntoQueryParam }; - ($K:ty) => { $K }; -} - -macro_rules! define_queries { - (<$tcx:tt> - $($(#[$attr:meta])* - [$($modifiers:tt)*] fn $name:ident($($K:tt)*) -> $V:ty,)*) => { - - use std::mem; - use crate::{ - rustc_data_structures::stable_hasher::HashStable, - rustc_data_structures::stable_hasher::StableHasher, - ich::StableHashingContext - }; - - define_queries_struct! { - tcx: $tcx, - input: ($(([$($modifiers)*] [$($attr)*] [$name]))*) - } - - #[allow(nonstandard_style)] - #[derive(Clone, Debug)] - pub enum Query<$tcx> { - $($(#[$attr])* $name($($K)*)),* - } - - impl<$tcx> Query<$tcx> { - pub fn name(&self) -> &'static str { - match *self { - $(Query::$name(_) => stringify!($name),)* - } - } - - pub fn describe(&self, tcx: TyCtxt<$tcx>) -> Cow<'static, str> { - let (r, name) = match *self { - $(Query::$name(key) => { - (queries::$name::describe(tcx, key), stringify!($name)) - })* - }; - if tcx.sess.verbose() { - format!("{} [{}]", r, name).into() - } else { - r - } - } - - // FIXME(eddyb) Get more valid `Span`s on queries. - pub fn default_span(&self, tcx: TyCtxt<$tcx>, span: Span) -> Span { - if !span.is_dummy() { - return span; - } - // The `def_span` query is used to calculate `default_span`, - // so exit to avoid infinite recursion. - if let Query::def_span(..) = *self { - return span - } - match *self { - $(Query::$name(key) => key.default_span(tcx),)* - } - } - } - - impl<'a, $tcx> HashStable> for Query<$tcx> { - fn hash_stable(&self, hcx: &mut StableHashingContext<'a>, hasher: &mut StableHasher) { - mem::discriminant(self).hash_stable(hcx, hasher); - match *self { - $(Query::$name(key) => key.hash_stable(hcx, hasher),)* - } - } - } - - #[allow(nonstandard_style)] - pub mod queries { - use std::marker::PhantomData; - - $(pub struct $name<$tcx> { - data: PhantomData<&$tcx ()> - })* - } - - // HACK(eddyb) this is like the `impl QueryConfig for queries::$name` - // below, but using type aliases instead of associated types, to bypass - // the limitations around normalizing under HRTB - for example, this: - // `for<'tcx> fn(...) -> as QueryConfig>>::Value` - // doesn't currently normalize to `for<'tcx> fn(...) -> query_values::$name<'tcx>`. - // This is primarily used by the `provide!` macro in `rustc_metadata`. - #[allow(nonstandard_style, unused_lifetimes)] - pub mod query_keys { - use super::*; - - $(pub type $name<$tcx> = $($K)*;)* - } - #[allow(nonstandard_style, unused_lifetimes)] - pub mod query_values { - use super::*; - - $(pub type $name<$tcx> = $V;)* - } - - $(impl<$tcx> QueryConfig for queries::$name<$tcx> { - type Key = $($K)*; - type Value = $V; - type Stored = < - query_storage!([$($modifiers)*][$($K)*, $V]) - as QueryStorage - >::Stored; - const NAME: &'static str = stringify!($name); - } - - impl<$tcx> QueryAccessors> for queries::$name<$tcx> { - const ANON: bool = is_anon!([$($modifiers)*]); - const EVAL_ALWAYS: bool = is_eval_always!([$($modifiers)*]); - const DEP_KIND: dep_graph::DepKind = dep_graph::DepKind::$name; - - type Cache = query_storage!([$($modifiers)*][$($K)*, $V]); - - #[inline(always)] - fn query_state<'a>(tcx: TyCtxt<$tcx>) -> &'a QueryState as QueryContext>::Query, Self::Cache> { - &tcx.queries.$name - } - - #[inline] - fn compute(tcx: TyCtxt<'tcx>, key: Self::Key) -> Self::Value { - let provider = tcx.queries.providers.get(key.query_crate()) - // HACK(eddyb) it's possible crates may be loaded after - // the query engine is created, and because crate loading - // is not yet integrated with the query engine, such crates - // would be missing appropriate entries in `providers`. - .unwrap_or(&tcx.queries.fallback_extern_providers) - .$name; - provider(tcx, key) - } - - fn hash_result( - _hcx: &mut StableHashingContext<'_>, - _result: &Self::Value - ) -> Option { - hash_result!([$($modifiers)*][_hcx, _result]) - } - - fn handle_cycle_error( - tcx: TyCtxt<'tcx>, - error: CycleError> - ) -> Self::Value { - handle_cycle_error!([$($modifiers)*][tcx, error]) - } - })* - - #[derive(Copy, Clone)] - pub struct TyCtxtEnsure<'tcx> { - pub tcx: TyCtxt<'tcx>, - } - - impl TyCtxtEnsure<$tcx> { - $($(#[$attr])* - #[inline(always)] - pub fn $name(self, key: query_helper_param_ty!($($K)*)) { - ensure_query::, _>(self.tcx, key.into_query_param()) - })* - } - - #[derive(Copy, Clone)] - pub struct TyCtxtAt<'tcx> { - pub tcx: TyCtxt<'tcx>, - pub span: Span, - } - - impl Deref for TyCtxtAt<'tcx> { - type Target = TyCtxt<'tcx>; - #[inline(always)] - fn deref(&self) -> &Self::Target { - &self.tcx - } - } - - impl TyCtxt<$tcx> { - /// Returns a transparent wrapper for `TyCtxt`, which ensures queries - /// are executed instead of just returning their results. - #[inline(always)] - pub fn ensure(self) -> TyCtxtEnsure<$tcx> { - TyCtxtEnsure { - tcx: self, - } - } - - /// Returns a transparent wrapper for `TyCtxt` which uses - /// `span` as the location of queries performed through it. - #[inline(always)] - pub fn at(self, span: Span) -> TyCtxtAt<$tcx> { - TyCtxtAt { - tcx: self, - span - } - } - - $($(#[$attr])* - #[inline(always)] - #[must_use] - pub fn $name(self, key: query_helper_param_ty!($($K)*)) - -> as QueryConfig>::Stored - { - self.at(DUMMY_SP).$name(key.into_query_param()) - })* - - /// 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> { - $($(#[$attr])* - #[inline(always)] - pub fn $name(self, key: query_helper_param_ty!($($K)*)) - -> as QueryConfig>::Stored - { - get_query::, _>(self.tcx, self.span, key.into_query_param()) - })* - } - - define_provider_struct! { - tcx: $tcx, - input: ($(([$($modifiers)*] [$name] [$($K)*] [$V]))*) - } - - impl Copy for Providers {} - impl Clone for Providers { - fn clone(&self) -> Self { *self } - } - } -} - -// FIXME(eddyb) this macro (and others?) use `$tcx` and `'tcx` interchangeably. -// We should either not take `$tcx` at all and use `'tcx` everywhere, or use -// `$tcx` everywhere (even if that isn't necessary due to lack of hygiene). -macro_rules! define_queries_struct { - (tcx: $tcx:tt, - input: ($(([$($modifiers:tt)*] [$($attr:tt)*] [$name:ident]))*)) => { - pub struct Queries<$tcx> { - /// This provides access to the incremental compilation on-disk cache for query results. - /// Do not access this directly. It is only meant to be used by - /// `DepGraph::try_mark_green()` and the query infrastructure. - /// This is `None` if we are not incremental compilation mode - pub(crate) on_disk_cache: Option>, - - providers: IndexVec, - fallback_extern_providers: Box, - - $($(#[$attr])* $name: QueryState< - crate::dep_graph::DepKind, - as QueryContext>::Query, - as QueryAccessors>>::Cache, - >,)* - } - - impl<$tcx> Queries<$tcx> { - pub(crate) fn new( - providers: IndexVec, - fallback_extern_providers: Providers, - on_disk_cache: Option>, - ) -> Self { - Queries { - providers, - fallback_extern_providers: Box::new(fallback_extern_providers), - on_disk_cache, - $($name: Default::default()),* - } - } - - pub(crate) fn try_collect_active_jobs( - &self - ) -> Option, QueryJobInfo as QueryContext>::Query>>> { - let mut jobs = FxHashMap::default(); - - $( - self.$name.try_collect_active_jobs( - as QueryAccessors>>::DEP_KIND, - Query::$name, - &mut jobs, - )?; - )* - - Some(jobs) - } - } - }; -} - -macro_rules! define_provider_struct { - (tcx: $tcx:tt, - input: ($(([$($modifiers:tt)*] [$name:ident] [$K:ty] [$R:ty]))*)) => { - pub struct Providers { - $(pub $name: for<$tcx> fn(TyCtxt<$tcx>, $K) -> $R,)* - } - - impl Default for Providers { - fn default() -> Self { - $(fn $name<$tcx>(_: TyCtxt<$tcx>, key: $K) -> $R { - bug!("`tcx.{}({:?})` unsupported by its crate", - stringify!($name), key); - })* - Providers { $($name),* } - } - } - }; -} diff --git a/compiler/rustc_middle/src/ty/relate.rs b/compiler/rustc_middle/src/ty/relate.rs index 293b3c6b04..b41bf70e88 100644 --- a/compiler/rustc_middle/src/ty/relate.rs +++ b/compiler/rustc_middle/src/ty/relate.rs @@ -4,7 +4,7 @@ //! types or regions but can be other things. Examples of type relations are //! subtyping, type equality, etc. -use crate::mir::interpret::{get_slice_bytes, ConstValue}; +use crate::mir::interpret::{get_slice_bytes, ConstValue, GlobalAlloc, Scalar}; use crate::ty::error::{ExpectedFound, TypeError}; use crate::ty::subst::{GenericArg, GenericArgKind, SubstsRef}; use crate::ty::{self, Ty, TyCtxt, TypeFoldable}; @@ -154,7 +154,7 @@ pub fn relate_substs>( relation.relate_with_variance(variance, a, b) }); - Ok(tcx.mk_substs(params)?) + tcx.mk_substs(params) } impl<'tcx> Relate<'tcx> for ty::FnSig<'tcx> { @@ -421,12 +421,14 @@ pub fn super_relate_tys>( 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))), - // FIXME(#72219) Implement improved diagnostics for mismatched array - // length? - Err(err) if relation.tcx().lazy_normalization() => Err(err), Err(err) => { // Check whether the lengths are both concrete/known values, // but are unequal, for better diagnostics. + // + // It might seem dubious to eagerly evaluate these constants here, + // we however cannot end up with errors in `Relate` during both + // `type_of` and `predicates_of`. This means that evaluating the + // constants should not cause cycle errors here. 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) { @@ -496,104 +498,44 @@ pub fn super_relate_consts>( debug!("{}.super_relate_consts(a = {:?}, b = {:?})", relation.tag(), a, b); let tcx = relation.tcx(); - let eagerly_eval = |x: &'tcx ty::Const<'tcx>| x.eval(tcx, relation.param_env()).val; + // FIXME(oli-obk): once const generics can have generic types, this assertion + // will likely get triggered. Move to `normalize_erasing_regions` at that point. + let a_ty = tcx.erase_regions(a.ty); + let b_ty = tcx.erase_regions(b.ty); + if a_ty != b_ty { + relation.tcx().sess.delay_span_bug( + DUMMY_SP, + &format!("cannot relate constants of different types: {} != {}", a_ty, b_ty), + ); + } - // FIXME(eddyb) doesn't look like everything below checks that `a.ty == b.ty`. - // We could probably always assert it early, as const generic parameters - // are not allowed to depend on other generic parameters, i.e. are concrete. - // (although there could be normalization differences) + let eagerly_eval = |x: &'tcx ty::Const<'tcx>| x.eval(tcx, relation.param_env()); + let a = eagerly_eval(a); + let b = eagerly_eval(b); // Currently, the values that can be unified are primitive types, // and those that derive both `PartialEq` and `Eq`, corresponding // to structural-match types. - let new_const_val = match (eagerly_eval(a), eagerly_eval(b)) { + let is_match = match (a.val, b.val) { (ty::ConstKind::Infer(_), _) | (_, ty::ConstKind::Infer(_)) => { // The caller should handle these cases! bug!("var types encountered in super_relate_consts: {:?} {:?}", a, b) } - (ty::ConstKind::Error(d), _) | (_, ty::ConstKind::Error(d)) => Ok(ty::ConstKind::Error(d)), + (ty::ConstKind::Error(_), _) => return Ok(a), + (_, ty::ConstKind::Error(_)) => return Ok(b), - (ty::ConstKind::Param(a_p), ty::ConstKind::Param(b_p)) if a_p.index == b_p.index => { - return Ok(a); - } - (ty::ConstKind::Placeholder(p1), ty::ConstKind::Placeholder(p2)) if p1 == p2 => { - return Ok(a); - } + (ty::ConstKind::Param(a_p), ty::ConstKind::Param(b_p)) => a_p.index == b_p.index, + (ty::ConstKind::Placeholder(p1), ty::ConstKind::Placeholder(p2)) => p1 == p2, (ty::ConstKind::Value(a_val), ty::ConstKind::Value(b_val)) => { - let new_val = match (a_val, b_val) { - (ConstValue::Scalar(a_val), ConstValue::Scalar(b_val)) if a.ty == b.ty => { - if a_val == b_val { - Ok(ConstValue::Scalar(a_val)) - } else if let ty::FnPtr(_) = a.ty.kind() { - let a_instance = tcx.global_alloc(a_val.assert_ptr().alloc_id).unwrap_fn(); - let b_instance = tcx.global_alloc(b_val.assert_ptr().alloc_id).unwrap_fn(); - if a_instance == b_instance { - Ok(ConstValue::Scalar(a_val)) - } else { - Err(TypeError::ConstMismatch(expected_found(relation, a, b))) - } - } else { - Err(TypeError::ConstMismatch(expected_found(relation, a, b))) - } - } - - (ConstValue::Slice { .. }, ConstValue::Slice { .. }) => { - let a_bytes = get_slice_bytes(&tcx, a_val); - let b_bytes = get_slice_bytes(&tcx, b_val); - if a_bytes == b_bytes { - Ok(a_val) - } else { - Err(TypeError::ConstMismatch(expected_found(relation, a, b))) - } - } - - (ConstValue::ByRef { .. }, ConstValue::ByRef { .. }) => { - match a.ty.kind() { - ty::Array(..) | ty::Adt(..) | ty::Tuple(..) => { - let a_destructured = tcx.destructure_const(relation.param_env().and(a)); - let b_destructured = tcx.destructure_const(relation.param_env().and(b)); - - // Both the variant and each field have to be equal. - if a_destructured.variant == b_destructured.variant { - for (a_field, b_field) in - a_destructured.fields.iter().zip(b_destructured.fields.iter()) - { - relation.consts(a_field, b_field)?; - } - - Ok(a_val) - } else { - Err(TypeError::ConstMismatch(expected_found(relation, a, b))) - } - } - // FIXME(const_generics): There are probably some `TyKind`s - // which should be handled here. - _ => { - tcx.sess.delay_span_bug( - DUMMY_SP, - &format!("unexpected consts: a: {:?}, b: {:?}", a, b), - ); - Err(TypeError::ConstMismatch(expected_found(relation, a, b))) - } - } - } - - _ => Err(TypeError::ConstMismatch(expected_found(relation, a, b))), - }; - - new_val.map(ty::ConstKind::Value) + check_const_value_eq(relation, a_val, b_val, a, b)? } ( ty::ConstKind::Unevaluated(a_def, a_substs, None), ty::ConstKind::Unevaluated(b_def, b_substs, None), ) if tcx.features().const_evaluatable_checked && !relation.visit_ct_substs() => { - if tcx.try_unify_abstract_consts(((a_def, a_substs), (b_def, b_substs))) { - Ok(a.val) - } else { - Err(TypeError::ConstMismatch(expected_found(relation, a, b))) - } + tcx.try_unify_abstract_consts(((a_def, a_substs), (b_def, b_substs))) } // While this is slightly incorrect, it shouldn't matter for `min_const_generics` @@ -605,11 +547,64 @@ pub fn super_relate_consts>( ) if a_def == b_def && a_promoted == b_promoted => { let substs = relation.relate_with_variance(ty::Variance::Invariant, a_substs, b_substs)?; - Ok(ty::ConstKind::Unevaluated(a_def, substs, a_promoted)) + return Ok(tcx.mk_const(ty::Const { + val: ty::ConstKind::Unevaluated(a_def, substs, a_promoted), + ty: a.ty, + })); } - _ => Err(TypeError::ConstMismatch(expected_found(relation, a, b))), + _ => false, }; - new_const_val.map(|val| tcx.mk_const(ty::Const { val, ty: a.ty })) + if is_match { Ok(a) } else { Err(TypeError::ConstMismatch(expected_found(relation, a, b))) } +} + +fn check_const_value_eq>( + relation: &mut R, + a_val: ConstValue<'tcx>, + b_val: ConstValue<'tcx>, + // FIXME(oli-obk): these arguments should go away with valtrees + a: &'tcx ty::Const<'tcx>, + b: &'tcx ty::Const<'tcx>, + // FIXME(oli-obk): this should just be `bool` with valtrees +) -> RelateResult<'tcx, bool> { + let tcx = relation.tcx(); + Ok(match (a_val, b_val) { + (ConstValue::Scalar(Scalar::Int(a_val)), ConstValue::Scalar(Scalar::Int(b_val))) => { + a_val == b_val + } + (ConstValue::Scalar(Scalar::Ptr(a_val)), ConstValue::Scalar(Scalar::Ptr(b_val))) => { + a_val == b_val + || match (tcx.global_alloc(a_val.alloc_id), tcx.global_alloc(b_val.alloc_id)) { + (GlobalAlloc::Function(a_instance), GlobalAlloc::Function(b_instance)) => { + a_instance == b_instance + } + _ => false, + } + } + + (ConstValue::Slice { .. }, ConstValue::Slice { .. }) => { + get_slice_bytes(&tcx, a_val) == get_slice_bytes(&tcx, b_val) + } + + (ConstValue::ByRef { .. }, ConstValue::ByRef { .. }) => { + let a_destructured = tcx.destructure_const(relation.param_env().and(a)); + let b_destructured = tcx.destructure_const(relation.param_env().and(b)); + + // Both the variant and each field have to be equal. + if a_destructured.variant == b_destructured.variant { + for (a_field, b_field) in + a_destructured.fields.iter().zip(b_destructured.fields.iter()) + { + relation.consts(a_field, b_field)?; + } + + true + } else { + false + } + } + + _ => false, + }) } impl<'tcx> Relate<'tcx> for &'tcx ty::List>> { @@ -647,7 +642,7 @@ impl<'tcx> Relate<'tcx> for &'tcx ty::List Err(TypeError::ExistentialMismatch(expected_found(relation, a, b))), } }); - Ok(tcx.mk_poly_existential_predicates(v)?) + tcx.mk_poly_existential_predicates(v) } } diff --git a/compiler/rustc_middle/src/ty/sty.rs b/compiler/rustc_middle/src/ty/sty.rs index c1fa84dcb2..2cd969d7a1 100644 --- a/compiler/rustc_middle/src/ty/sty.rs +++ b/compiler/rustc_middle/src/ty/sty.rs @@ -17,7 +17,7 @@ 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, Ident, Symbol}; +use rustc_span::symbol::{kw, Symbol}; use rustc_target::abi::VariantIdx; use rustc_target::spec::abi; use std::borrow::Cow; @@ -231,7 +231,7 @@ impl TyKind<'tcx> { } // `TyKind` is used a lot. Make sure it doesn't unintentionally get bigger. -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(TyKind<'_>, 24); /// A closure can be modeled as a struct that looks like: @@ -1112,36 +1112,35 @@ pub struct ProjectionTy<'tcx> { } impl<'tcx> ProjectionTy<'tcx> { - /// Construct a `ProjectionTy` by searching the trait from `trait_ref` for the - /// associated item named `item_name`. - pub fn from_ref_and_name( - tcx: TyCtxt<'_>, - trait_ref: ty::TraitRef<'tcx>, - item_name: Ident, - ) -> ProjectionTy<'tcx> { - let item_def_id = tcx - .associated_items(trait_ref.def_id) - .find_by_name_and_kind(tcx, item_name, ty::AssocKind::Type, trait_ref.def_id) - .unwrap() - .def_id; + pub fn trait_def_id(&self, tcx: TyCtxt<'tcx>) -> DefId { + tcx.associated_item(self.item_def_id).container.id() + } - ProjectionTy { substs: trait_ref.substs, item_def_id } + /// Extracts the underlying trait reference and own substs from this projection. + /// For example, if this is a projection of `::Item<'a>`, + /// then this function would return a `T: Iterator` trait reference and `['a]` as the own substs + pub fn trait_ref_and_own_substs( + &self, + tcx: TyCtxt<'tcx>, + ) -> (ty::TraitRef<'tcx>, &'tcx [ty::GenericArg<'tcx>]) { + let def_id = tcx.associated_item(self.item_def_id).container.id(); + let trait_generics = tcx.generics_of(def_id); + ( + ty::TraitRef { def_id, substs: self.substs.truncate_to(tcx, trait_generics) }, + &self.substs[trait_generics.count()..], + ) } /// 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. + /// + /// WARNING: This will drop the substs for generic associated types + /// consider calling [Self::trait_ref_and_own_substs] to get those + /// as well. pub fn trait_ref(&self, tcx: TyCtxt<'tcx>) -> ty::TraitRef<'tcx> { - // FIXME: This method probably shouldn't exist at all, since it's not - // clear what this method really intends to do. Be careful when - // using this method since the resulting TraitRef additionally - // contains the substs for the assoc_item, which strictly speaking - // is not correct - let def_id = tcx.associated_item(self.item_def_id).container.id(); - // Include substitutions for generic arguments of associated types - let assoc_item = tcx.associated_item(self.item_def_id); - let substs_assoc_item = self.substs.truncate_to(tcx, tcx.generics_of(assoc_item.def_id)); - ty::TraitRef { def_id, substs: substs_assoc_item } + let def_id = self.trait_def_id(tcx); + ty::TraitRef { def_id, substs: self.substs.truncate_to(tcx, tcx.generics_of(def_id)) } } pub fn self_ty(&self) -> Ty<'tcx> { @@ -1257,6 +1256,7 @@ impl<'tcx> ParamTy { ParamTy::new(def.index, def.name) } + #[inline] pub fn to_ty(self, tcx: TyCtxt<'tcx>) -> Ty<'tcx> { tcx.mk_ty_param(self.index, self.name) } @@ -1493,12 +1493,11 @@ impl<'tcx> ExistentialProjection<'tcx> { /// For example, if this is a projection of `exists T. ::Item == X`, /// then this function would return a `exists T. T: Iterator` existential trait /// reference. - pub fn trait_ref(&self, tcx: TyCtxt<'_>) -> ty::ExistentialTraitRef<'tcx> { - // FIXME(generic_associated_types): substs is the substs of the - // associated type, which should be truncated to get the correct substs - // for the trait. + pub fn trait_ref(&self, tcx: TyCtxt<'tcx>) -> ty::ExistentialTraitRef<'tcx> { let def_id = tcx.associated_item(self.item_def_id).container.id(); - ty::ExistentialTraitRef { def_id, substs: self.substs } + let subst_count = tcx.generics_of(def_id).count() - 1; + let substs = tcx.intern_substs(&self.substs[..subst_count]); + ty::ExistentialTraitRef { def_id, substs } } pub fn with_self_ty( @@ -1517,6 +1516,20 @@ impl<'tcx> ExistentialProjection<'tcx> { ty: self.ty, } } + + pub fn erase_self_ty( + tcx: TyCtxt<'tcx>, + projection_predicate: ty::ProjectionPredicate<'tcx>, + ) -> Self { + // Assert there is a Self. + projection_predicate.projection_ty.substs.type_at(0); + + Self { + item_def_id: projection_predicate.projection_ty.item_def_id, + substs: tcx.intern_substs(&projection_predicate.projection_ty.substs[1..]), + ty: projection_predicate.ty, + } + } } impl<'tcx> PolyExistentialProjection<'tcx> { @@ -1549,14 +1562,17 @@ impl RegionKind { } } + #[inline] pub fn is_late_bound(&self) -> bool { matches!(*self, ty::ReLateBound(..)) } + #[inline] pub fn is_placeholder(&self) -> bool { matches!(*self, ty::RePlaceholder(..)) } + #[inline] pub fn bound_at_or_above_binder(&self, index: ty::DebruijnIndex) -> bool { match *self { ty::ReLateBound(debruijn, _) => debruijn >= index, @@ -1685,53 +1701,6 @@ impl<'tcx> TyS<'tcx> { matches!(self.kind(), Never) } - /// Checks whether a type is definitely uninhabited. This is - /// conservative: for some types that are uninhabited we return `false`, - /// but we only return `true` for types that are definitely uninhabited. - /// `ty.conservative_is_privately_uninhabited` implies that any value of type `ty` - /// will be `Abi::Uninhabited`. (Note that uninhabited types may have nonzero - /// size, to account for partial initialisation. See #49298 for details.) - pub fn conservative_is_privately_uninhabited(&self, tcx: TyCtxt<'tcx>) -> bool { - // FIXME(varkor): we can make this less conversative by substituting concrete - // type arguments. - match self.kind() { - ty::Never => true, - ty::Adt(def, _) if def.is_union() => { - // For now, `union`s are never considered uninhabited. - false - } - ty::Adt(def, _) => { - // Any ADT is uninhabited if either: - // (a) It has no variants (i.e. an empty `enum`); - // (b) Each of its variants (a single one in the case of a `struct`) has at least - // one uninhabited field. - def.variants.iter().all(|var| { - var.fields.iter().any(|field| { - tcx.type_of(field.did).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()) { - Some(0) | None => false, - // If the array is definitely non-empty, it's uninhabited if - // the type of its elements is uninhabited. - Some(1..) => ty.conservative_is_privately_uninhabited(tcx), - } - } - ty::Ref(..) => { - // References to uninitialised memory is valid for any type, including - // uninhabited types, in unsafe code, so we treat all references as - // inhabited. - false - } - _ => false, - } - } - #[inline] pub fn is_primitive(&self) -> bool { self.kind().is_primitive() @@ -1845,6 +1814,15 @@ impl<'tcx> TyS<'tcx> { ) } + /// Get the mutability of the reference or `None` when not a reference + #[inline] + pub fn ref_mutability(&self) -> Option { + match self.kind() { + Ref(_, _, mutability) => Some(*mutability), + _ => None, + } + } + #[inline] pub fn is_unsafe_ptr(&self) -> bool { matches!(self.kind(), RawPtr(_)) @@ -2124,6 +2102,54 @@ impl<'tcx> TyS<'tcx> { } } + /// Returns the type of metadata for (potentially fat) pointers to this type. + pub fn ptr_metadata_ty(&'tcx self, tcx: TyCtxt<'tcx>) -> Ty<'tcx> { + // FIXME: should this normalize? + let tail = tcx.struct_tail_without_normalization(self); + match tail.kind() { + // Sized types + ty::Infer(ty::IntVar(_) | 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(_) + | ty::Foreign(..) + // If returned by `struct_tail_without_normalization` this is a unit struct + // without any fields, or not a struct, and therefore is Sized. + | ty::Adt(..) + // If returned by `struct_tail_without_normalization` this is the empty tuple, + // a.k.a. unit type, which is Sized + | ty::Tuple(..) => tcx.types.unit, + + ty::Str | ty::Slice(_) => tcx.types.usize, + ty::Dynamic(..) => { + let dyn_metadata = tcx.lang_items().dyn_metadata().unwrap(); + tcx.type_of(dyn_metadata).subst(tcx, &[tail.into()]) + }, + + ty::Projection(_) + | ty::Param(_) + | ty::Opaque(..) + | ty::Infer(ty::TyVar(_)) + | ty::Bound(..) + | ty::Placeholder(..) + | ty::Infer(ty::FreshTy(_) | ty::FreshIntTy(_) | ty::FreshFloatTy(_)) => { + bug!("`ptr_metadata_ty` applied to unexpected type: {:?}", tail) + } + } + } + /// When we create a closure, we record its kind (i.e., what trait /// it implements) into its `ClosureSubsts` using a type /// parameter. This is kind of a phantom type, except that the diff --git a/compiler/rustc_middle/src/ty/trait_def.rs b/compiler/rustc_middle/src/ty/trait_def.rs index f4d7eac0ae..ce17a724e2 100644 --- a/compiler/rustc_middle/src/ty/trait_def.rs +++ b/compiler/rustc_middle/src/ty/trait_def.rs @@ -4,9 +4,8 @@ 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::{CrateNum, DefId}; +use rustc_hir::def_id::{CrateNum, DefId, LocalDefId}; use rustc_hir::definitions::DefPathHash; -use rustc_hir::HirId; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; @@ -201,7 +200,7 @@ impl<'tcx> TyCtxt<'tcx> { pub(super) fn all_local_trait_impls<'tcx>( tcx: TyCtxt<'tcx>, krate: CrateNum, -) -> &'tcx BTreeMap> { +) -> &'tcx BTreeMap> { &tcx.hir_crate(krate).trait_impls } @@ -229,8 +228,8 @@ pub(super) fn trait_impls_of_provider(tcx: TyCtxt<'_>, trait_id: DefId) -> Trait } } - for &hir_id in tcx.hir().trait_impls(trait_id) { - let impl_def_id = tcx.hir().local_def_id(hir_id).to_def_id(); + for &impl_def_id in tcx.hir().trait_impls(trait_id) { + let impl_def_id = impl_def_id.to_def_id(); let impl_self_ty = tcx.type_of(impl_def_id); if impl_self_ty.references_error() { diff --git a/compiler/rustc_middle/src/ty/walk.rs b/compiler/rustc_middle/src/ty/walk.rs index 357a0dd65c..bb7fc661d2 100644 --- a/compiler/rustc_middle/src/ty/walk.rs +++ b/compiler/rustc_middle/src/ty/walk.rs @@ -13,7 +13,7 @@ type TypeWalkerStack<'tcx> = SmallVec<[GenericArg<'tcx>; 8]>; pub struct TypeWalker<'tcx> { stack: TypeWalkerStack<'tcx>, last_subtree: usize, - visited: SsoHashSet>, + pub visited: SsoHashSet>, } /// An iterator for walking the type tree. diff --git a/compiler/rustc_mir/Cargo.toml b/compiler/rustc_mir/Cargo.toml index 10dbf35fed..59a0c9a5dd 100644 --- a/compiler/rustc_mir/Cargo.toml +++ b/compiler/rustc_mir/Cargo.toml @@ -31,7 +31,7 @@ rustc_trait_selection = { path = "../rustc_trait_selection" } rustc_ast = { path = "../rustc_ast" } rustc_span = { path = "../rustc_span" } rustc_apfloat = { path = "../rustc_apfloat" } -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } [dev-dependencies] coverage_test_macros = { path = "src/transform/coverage/test_macros" } diff --git a/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs b/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs index cd16a88e5f..eb942b195b 100644 --- a/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs +++ b/compiler/rustc_mir/src/borrow_check/diagnostics/conflict_errors.rs @@ -8,19 +8,20 @@ use rustc_index::vec::Idx; use rustc_middle::mir::{ self, AggregateKind, BindingForm, BorrowKind, ClearCrossCrate, ConstraintCategory, FakeReadCause, Local, LocalDecl, LocalInfo, LocalKind, Location, Operand, Place, PlaceRef, - ProjectionElem, Rvalue, Statement, StatementKind, TerminatorKind, VarBindingForm, + ProjectionElem, Rvalue, Statement, StatementKind, Terminator, TerminatorKind, VarBindingForm, }; -use rustc_middle::ty::{self, suggest_constraining_type_param, Ty}; +use rustc_middle::ty::{self, suggest_constraining_type_param, Ty, TypeFoldable}; use rustc_span::source_map::DesugaringKind; -use rustc_span::Span; +use rustc_span::symbol::sym; +use rustc_span::{Span, DUMMY_SP}; use crate::dataflow::drop_flag_effects; use crate::dataflow::indexes::{MoveOutIndex, MovePathIndex}; use crate::util::borrowck_errors; use crate::borrow_check::{ - borrow_set::BorrowData, prefixes::IsPrefixOf, InitializationRequiringAction, MirBorrowckCtxt, - PrefixSet, WriteKind, + borrow_set::BorrowData, diagnostics::Instance, prefixes::IsPrefixOf, + InitializationRequiringAction, MirBorrowckCtxt, PrefixSet, WriteKind, }; use super::{ @@ -215,12 +216,13 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { ); } // Avoid pointing to the same function in multiple different - // error messages - if self.fn_self_span_reported.insert(self_arg.span) { + // error messages. + if span != DUMMY_SP && self.fn_self_span_reported.insert(self_arg.span) + { err.span_note( - self_arg.span, - &format!("this function takes ownership of the receiver `self`, which moves {}", place_name) - ); + self_arg.span, + &format!("this function takes ownership of the receiver `self`, which moves {}", place_name) + ); } } // Deref::deref takes &self, which cannot cause a move @@ -1268,6 +1270,29 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { if return_span != borrow_span { err.span_label(borrow_span, note); + + let tcx = self.infcx.tcx; + let ty_params = ty::List::empty(); + + let return_ty = self.regioncx.universal_regions().unnormalized_output_ty; + let return_ty = tcx.erase_regions(return_ty); + + // to avoid panics + if !return_ty.has_infer_types() { + if let Some(iter_trait) = tcx.get_diagnostic_item(sym::Iterator) { + if tcx.type_implements_trait((iter_trait, return_ty, ty_params, self.param_env)) + { + if let Ok(snippet) = tcx.sess.source_map().span_to_snippet(return_span) { + err.span_suggestion_hidden( + return_span, + "use `.collect()` to allocate the iterator", + format!("{}{}", snippet, ".collect::>()"), + Applicability::MaybeIncorrect, + ); + } + } + } + } } Some(err) @@ -1543,9 +1568,43 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { None, ); + self.explain_deref_coercion(loan, &mut err); + err.buffer(&mut self.errors_buffer); } + fn explain_deref_coercion(&mut self, loan: &BorrowData<'tcx>, err: &mut DiagnosticBuilder<'_>) { + let tcx = self.infcx.tcx; + if let ( + Some(Terminator { kind: TerminatorKind::Call { from_hir_call: false, .. }, .. }), + Some((method_did, method_substs)), + ) = ( + &self.body[loan.reserve_location.block].terminator, + crate::util::find_self_call( + tcx, + self.body, + loan.assigned_place.local, + loan.reserve_location.block, + ), + ) { + if tcx.is_diagnostic_item(sym::deref_method, method_did) { + let deref_target = + tcx.get_diagnostic_item(sym::deref_target).and_then(|deref_target| { + Instance::resolve(tcx, self.param_env, deref_target, method_substs) + .transpose() + }); + if let Some(Ok(instance)) = deref_target { + let deref_target_ty = instance.ty(tcx, self.param_env); + err.note(&format!( + "borrow occurs due to deref coercion to `{}`", + deref_target_ty + )); + err.span_note(tcx.def_span(instance.def_id()), "deref defined here"); + } + } + } + } + /// Reports an illegal reassignment; for example, an assignment to /// (part of) a non-`mut` local that occurs potentially after that /// local has already been initialized. `place` is the path being diff --git a/compiler/rustc_mir/src/borrow_check/diagnostics/mod.rs b/compiler/rustc_mir/src/borrow_check/diagnostics/mod.rs index 04ea3cbd8b..ec561fa385 100644 --- a/compiler/rustc_mir/src/borrow_check/diagnostics/mod.rs +++ b/compiler/rustc_mir/src/borrow_check/diagnostics/mod.rs @@ -81,12 +81,12 @@ 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: const_ty, .. }, .. }), + func: Operand::Constant(box Constant { literal, .. }), args, .. } = &terminator.kind { - if let ty::FnDef(id, _) = *const_ty.kind() { + if let ty::FnDef(id, _) = *literal.ty().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() { @@ -388,10 +388,14 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // so it's safe to call `expect_local`. // // We know the field exists so it's safe to call operator[] and `unwrap` here. - let (&var_id, _) = - self.infcx.tcx.typeck(def_id.expect_local()).closure_captures[&def_id] - .get_index(field.index()) - .unwrap(); + let var_id = self + .infcx + .tcx + .typeck(def_id.expect_local()) + .closure_min_captures_flattened(def_id) + .nth(field.index()) + .unwrap() + .get_root_variable(); self.infcx.tcx.hir().name(var_id).to_string() } @@ -966,12 +970,16 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { 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 { - for (upvar_hir_id, place) in - self.infcx.tcx.typeck(def_id.expect_local()).closure_captures[&def_id] - .keys() - .zip(places) + for (captured_place, place) in self + .infcx + .tcx + .typeck(def_id.expect_local()) + .closure_min_captures_flattened(def_id) + .zip(places) { - let span = self.infcx.tcx.upvars_mentioned(local_did)?[upvar_hir_id].span; + let upvar_hir_id = captured_place.get_root_variable(); + //FIXME(project-rfc-2229#8): Use better span from captured_place + let span = self.infcx.tcx.upvars_mentioned(local_did)?[&upvar_hir_id].span; match place { Operand::Copy(place) | Operand::Move(place) if target_place == place.as_ref() => @@ -979,10 +987,6 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { debug!("closure_span: found captured local {:?}", place); let body = self.infcx.tcx.hir().body(*body_id); let generator_kind = body.generator_kind(); - let upvar_id = ty::UpvarId { - var_path: ty::UpvarPath { hir_id: *upvar_hir_id }, - closure_expr_id: local_did, - }; // If we have a more specific span available, point to that. // We do this even though this span might be part of a borrow error @@ -990,11 +994,11 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { // to a span that shows why the upvar is used in the closure, // so a move-related span is as good as any (and potentially better, // if the overall error is due to a move of the upvar). - let usage_span = - match self.infcx.tcx.typeck(local_did).upvar_capture(upvar_id) { - ty::UpvarCapture::ByValue(Some(span)) => span, - _ => span, - }; + + let usage_span = match captured_place.info.capture_kind { + ty::UpvarCapture::ByValue(Some(span)) => span, + _ => span, + }; return Some((*args_span, generator_kind, usage_span)); } _ => {} diff --git a/compiler/rustc_mir/src/borrow_check/diagnostics/mutability_errors.rs b/compiler/rustc_mir/src/borrow_check/diagnostics/mutability_errors.rs index 333ac0738d..28f6508cab 100644 --- a/compiler/rustc_mir/src/borrow_check/diagnostics/mutability_errors.rs +++ b/compiler/rustc_mir/src/borrow_check/diagnostics/mutability_errors.rs @@ -1,6 +1,7 @@ use rustc_hir as hir; use rustc_hir::Node; use rustc_index::vec::Idx; +use rustc_middle::hir::map::Map; use rustc_middle::mir::{Mutability, Place, PlaceRef, ProjectionElem}; use rustc_middle::ty::{self, Ty, TyCtxt}; use rustc_middle::{ @@ -376,15 +377,18 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { opt_assignment_rhs_span.and_then(|span| span.desugaring_kind()); match opt_desugaring_kind { // on for loops, RHS points to the iterator part - Some(DesugaringKind::ForLoop(_)) => Some(( - false, - opt_assignment_rhs_span.unwrap(), - format!( - "this iterator yields `{SIGIL}` {DESC}s", - SIGIL = pointer_sigil, - DESC = pointer_desc - ), - )), + Some(DesugaringKind::ForLoop(_)) => { + self.suggest_similar_mut_method_for_for_loop(&mut err); + Some(( + false, + opt_assignment_rhs_span.unwrap(), + format!( + "this iterator yields `{SIGIL}` {DESC}s", + SIGIL = pointer_sigil, + DESC = pointer_desc + ), + )) + } // don't create labels for compiler-generated spans Some(_) => None, None => { @@ -506,35 +510,150 @@ impl<'a, 'tcx> MirBorrowckCtxt<'a, 'tcx> { the_place_err: PlaceRef<'tcx>, err: &mut DiagnosticBuilder<'_>, ) { - let id = id.expect_local(); - let tables = tcx.typeck(id); - let hir_id = tcx.hir().local_def_id_to_hir_id(id); - let (span, place) = &tables.closure_kind_origins()[hir_id]; - let reason = if let PlaceBase::Upvar(upvar_id) = place.base { - let upvar = ty::place_to_string_for_capture(tcx, place); - match tables.upvar_capture(upvar_id) { - ty::UpvarCapture::ByRef(ty::UpvarBorrow { - kind: ty::BorrowKind::MutBorrow | ty::BorrowKind::UniqueImmBorrow, - .. - }) => { - format!("mutable borrow of `{}`", upvar) + let closure_local_def_id = id.expect_local(); + let tables = tcx.typeck(closure_local_def_id); + let closure_hir_id = tcx.hir().local_def_id_to_hir_id(closure_local_def_id); + if let Some((span, closure_kind_origin)) = + &tables.closure_kind_origins().get(closure_hir_id) + { + let reason = if let PlaceBase::Upvar(upvar_id) = closure_kind_origin.base { + let upvar = ty::place_to_string_for_capture(tcx, closure_kind_origin); + let root_hir_id = upvar_id.var_path.hir_id; + // we have a origin for this closure kind starting at this root variable so it's safe to unwrap here + let captured_places = tables.closure_min_captures[id].get(&root_hir_id).unwrap(); + + let origin_projection = closure_kind_origin + .projections + .iter() + .map(|proj| proj.kind) + .collect::>(); + let mut capture_reason = String::new(); + for captured_place in captured_places { + let captured_place_kinds = captured_place + .place + .projections + .iter() + .map(|proj| proj.kind) + .collect::>(); + if rustc_middle::ty::is_ancestor_or_same_capture( + &captured_place_kinds, + &origin_projection, + ) { + match captured_place.info.capture_kind { + ty::UpvarCapture::ByRef(ty::UpvarBorrow { + kind: ty::BorrowKind::MutBorrow | ty::BorrowKind::UniqueImmBorrow, + .. + }) => { + capture_reason = format!("mutable borrow of `{}`", upvar); + } + ty::UpvarCapture::ByValue(_) => { + capture_reason = format!("possible mutation of `{}`", upvar); + } + _ => bug!("upvar `{}` borrowed, but not mutably", upvar), + } + break; + } + } + if capture_reason.is_empty() { + bug!("upvar `{}` borrowed, but cannot find reason", upvar); } - ty::UpvarCapture::ByValue(_) => { - format!("possible mutation of `{}`", upvar) + capture_reason + } else { + bug!("not an upvar") + }; + err.span_label( + *span, + format!( + "calling `{}` requires mutable binding due to {}", + self.describe_place(the_place_err).unwrap(), + reason + ), + ); + } + } + + // Attempt to search similar mutable associated items for suggestion. + // In the future, attempt in all path but initially for RHS of for_loop + fn suggest_similar_mut_method_for_for_loop(&self, err: &mut DiagnosticBuilder<'_>) { + use hir::{ + BodyId, Expr, + ExprKind::{Block, Call, DropTemps, Match, MethodCall}, + HirId, ImplItem, ImplItemKind, Item, ItemKind, + }; + + fn maybe_body_id_of_fn(hir_map: &Map<'tcx>, id: HirId) -> Option { + match hir_map.find(id) { + Some(Node::Item(Item { kind: ItemKind::Fn(_, _, body_id), .. })) + | Some(Node::ImplItem(ImplItem { kind: ImplItemKind::Fn(_, body_id), .. })) => { + Some(*body_id) + } + _ => None, + } + } + let hir_map = self.infcx.tcx.hir(); + let mir_body_hir_id = self.mir_hir_id(); + if let Some(fn_body_id) = maybe_body_id_of_fn(&hir_map, mir_body_hir_id) { + if let Block( + hir::Block { + expr: + Some(Expr { + kind: + DropTemps(Expr { + kind: + Match( + Expr { + kind: + Call( + _, + [Expr { + kind: MethodCall(path_segment, ..), + hir_id, + .. + }, ..], + ), + .. + }, + .., + ), + .. + }), + .. + }), + .. + }, + _, + ) = hir_map.body(fn_body_id).value.kind + { + let opt_suggestions = path_segment + .hir_id + .map(|path_hir_id| self.infcx.tcx.typeck(path_hir_id.owner)) + .and_then(|typeck| typeck.type_dependent_def_id(*hir_id)) + .and_then(|def_id| self.infcx.tcx.impl_of_method(def_id)) + .map(|def_id| self.infcx.tcx.associated_items(def_id)) + .map(|assoc_items| { + assoc_items + .in_definition_order() + .map(|assoc_item_def| assoc_item_def.ident) + .filter(|&ident| { + let original_method_ident = path_segment.ident; + original_method_ident != ident + && ident + .as_str() + .starts_with(&original_method_ident.name.to_string()) + }) + .map(|ident| format!("{}()", ident)) + }); + + if let Some(suggestions) = opt_suggestions { + err.span_suggestions( + path_segment.ident.span, + &format!("use mutable method"), + suggestions, + Applicability::MaybeIncorrect, + ); } - val => bug!("upvar `{}` borrowed, but not mutably: {:?}", upvar, val), } - } else { - bug!("not an upvar") }; - err.span_label( - *span, - format!( - "calling `{}` requires mutable binding due to {}", - self.describe_place(the_place_err).unwrap(), - reason - ), - ); } /// Targeted error when encountering an `FnMut` closure where an `Fn` closure was expected. diff --git a/compiler/rustc_mir/src/borrow_check/diagnostics/region_name.rs b/compiler/rustc_mir/src/borrow_check/diagnostics/region_name.rs index cbca012824..03738f1b40 100644 --- a/compiler/rustc_mir/src/borrow_check/diagnostics/region_name.rs +++ b/compiler/rustc_mir/src/borrow_check/diagnostics/region_name.rs @@ -634,14 +634,11 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> { | GenericArgKind::Const(_), _, ) => { - // I *think* that HIR lowering should ensure this - // doesn't happen, even in erroneous - // programs. Else we should use delay-span-bug. - span_bug!( + // HIR lowering sometimes doesn't catch this in erroneous + // programs, so we need to use delay_span_bug here. See #82126. + self.infcx.tcx.sess.delay_span_bug( hir_arg.span(), - "unmatched subst and hir arg: found {:?} vs {:?}", - kind, - hir_arg, + &format!("unmatched subst and hir arg: found {:?} vs {:?}", kind, hir_arg), ); } } @@ -767,7 +764,7 @@ impl<'tcx> MirBorrowckCtxt<'_, 'tcx> { let hir = self.infcx.tcx.hir(); if let hir::TyKind::OpaqueDef(id, _) = hir_ty.kind { - let opaque_ty = hir.item(id.id); + let opaque_ty = hir.item(id); if let hir::ItemKind::OpaqueTy(hir::OpaqueTy { bounds: [hir::GenericBound::LangItemTrait( diff --git a/compiler/rustc_mir/src/borrow_check/invalidation.rs b/compiler/rustc_mir/src/borrow_check/invalidation.rs index 8c05e6fd5d..17c4f3c649 100644 --- a/compiler/rustc_mir/src/borrow_check/invalidation.rs +++ b/compiler/rustc_mir/src/borrow_check/invalidation.rs @@ -92,6 +92,15 @@ impl<'cx, 'tcx> Visitor<'tcx> for InvalidationGenerator<'cx, 'tcx> { self.consume_operand(location, input); } } + StatementKind::CopyNonOverlapping(box rustc_middle::mir::CopyNonOverlapping { + ref src, + ref dst, + ref count, + }) => { + self.consume_operand(location, src); + self.consume_operand(location, dst); + self.consume_operand(location, count); + } StatementKind::Nop | StatementKind::Coverage(..) | StatementKind::AscribeUserType(..) @@ -165,7 +174,7 @@ impl<'cx, 'tcx> Visitor<'tcx> for InvalidationGenerator<'cx, 'tcx> { self.consume_operand(location, value); // Invalidate all borrows of local places - let borrow_set = self.borrow_set.clone(); + let borrow_set = self.borrow_set; let resume = self.location_table.start_index(resume.start_location()); for (i, data) in borrow_set.iter_enumerated() { if borrow_of_local_data(data.borrowed_place) { @@ -177,7 +186,7 @@ impl<'cx, 'tcx> Visitor<'tcx> for InvalidationGenerator<'cx, 'tcx> { } TerminatorKind::Resume | TerminatorKind::Return | TerminatorKind::GeneratorDrop => { // Invalidate all borrows of local places - let borrow_set = self.borrow_set.clone(); + let borrow_set = self.borrow_set; let start = self.location_table.start_index(location); for (i, data) in borrow_set.iter_enumerated() { if borrow_of_local_data(data.borrowed_place) { @@ -326,8 +335,8 @@ impl<'cx, 'tcx> InvalidationGenerator<'cx, 'tcx> { ); } - Rvalue::BinaryOp(_bin_op, ref operand1, ref operand2) - | Rvalue::CheckedBinaryOp(_bin_op, ref operand1, ref operand2) => { + Rvalue::BinaryOp(_bin_op, box (ref operand1, ref operand2)) + | Rvalue::CheckedBinaryOp(_bin_op, box (ref operand1, ref operand2)) => { self.consume_operand(location, operand1); self.consume_operand(location, operand2); } @@ -369,7 +378,7 @@ impl<'cx, 'tcx> InvalidationGenerator<'cx, 'tcx> { ); let tcx = self.tcx; let body = self.body; - let borrow_set = self.borrow_set.clone(); + let borrow_set = self.borrow_set; let indices = self.borrow_set.indices(); each_borrow_involving_path( self, @@ -377,7 +386,7 @@ impl<'cx, 'tcx> InvalidationGenerator<'cx, 'tcx> { body, location, (sd, place), - &borrow_set.clone(), + borrow_set, indices, |this, borrow_index, borrow| { match (rw, borrow.kind) { diff --git a/compiler/rustc_mir/src/borrow_check/mod.rs b/compiler/rustc_mir/src/borrow_check/mod.rs index 5db52db70a..5b8bb7257e 100644 --- a/compiler/rustc_mir/src/borrow_check/mod.rs +++ b/compiler/rustc_mir/src/borrow_check/mod.rs @@ -243,7 +243,7 @@ fn do_mir_borrowck<'a, 'tcx>( let regioncx = Rc::new(regioncx); - let flow_borrows = Borrows::new(tcx, &body, regioncx.clone(), &borrow_set) + let flow_borrows = Borrows::new(tcx, &body, ®ioncx, &borrow_set) .into_engine(tcx, &body) .pass_name("borrowck") .iterate_to_fixpoint(); @@ -266,7 +266,6 @@ fn do_mir_borrowck<'a, 'tcx>( for (idx, move_data_results) in promoted_errors { let promoted_body = &promoted[idx]; - let dominators = promoted_body.dominators(); if let Err((move_data, move_errors)) = move_data_results { let mut promoted_mbcx = MirBorrowckCtxt { @@ -274,7 +273,7 @@ fn do_mir_borrowck<'a, 'tcx>( param_env, body: promoted_body, move_data: &move_data, - location_table: &LocationTable::new(promoted_body), + location_table, // no need to create a real one for the promoted, it is not used movable_generator, fn_self_span_reported: Default::default(), locals_are_invalidated_at_exit, @@ -287,8 +286,8 @@ fn do_mir_borrowck<'a, 'tcx>( regioncx: regioncx.clone(), used_mut: Default::default(), used_mut_upvars: SmallVec::new(), - borrow_set: borrow_set.clone(), - dominators, + borrow_set: Rc::clone(&borrow_set), + dominators: Dominators::dummy(), // not used upvars: Vec::new(), local_names: IndexVec::from_elem(None, &promoted_body.local_decls), region_names: RefCell::default(), @@ -317,10 +316,10 @@ fn do_mir_borrowck<'a, 'tcx>( move_error_reported: BTreeMap::new(), uninitialized_error_reported: Default::default(), errors_buffer, - regioncx, + regioncx: Rc::clone(®ioncx), used_mut: Default::default(), used_mut_upvars: SmallVec::new(), - borrow_set, + borrow_set: Rc::clone(&borrow_set), dominators, upvars, local_names, @@ -627,6 +626,15 @@ impl<'cx, 'tcx> dataflow::ResultsVisitor<'cx, 'tcx> for MirBorrowckCtxt<'cx, 'tc self.consume_operand(location, (input, span), flow_state); } } + + StatementKind::CopyNonOverlapping(box rustc_middle::mir::CopyNonOverlapping { + .. + }) => { + span_bug!( + span, + "Unexpected CopyNonOverlapping, should only appear after lower_intrinsics", + ) + } StatementKind::Nop | StatementKind::Coverage(..) | StatementKind::AscribeUserType(..) @@ -1317,8 +1325,8 @@ impl<'cx, 'tcx> MirBorrowckCtxt<'cx, 'tcx> { ); } - Rvalue::BinaryOp(_bin_op, ref operand1, ref operand2) - | Rvalue::CheckedBinaryOp(_bin_op, ref operand1, ref operand2) => { + Rvalue::BinaryOp(_bin_op, box (ref operand1, ref operand2)) + | Rvalue::CheckedBinaryOp(_bin_op, box (ref operand1, ref operand2)) => { self.consume_operand(location, (operand1, span), flow_state); self.consume_operand(location, (operand2, span), flow_state); } diff --git a/compiler/rustc_mir/src/borrow_check/region_infer/opaque_types.rs b/compiler/rustc_mir/src/borrow_check/region_infer/opaque_types.rs index f7c902355c..0d1d255104 100644 --- a/compiler/rustc_mir/src/borrow_check/region_infer/opaque_types.rs +++ b/compiler/rustc_mir/src/borrow_check/region_infer/opaque_types.rs @@ -47,6 +47,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { /// Calling `universal_upper_bound` for such a region gives `fr_fn_body`, /// which has no `external_name` in which case we use `'empty` as the /// region to pass to `infer_opaque_definition_from_instantiation`. + #[instrument(skip(self, infcx))] pub(in crate::borrow_check) fn infer_opaque_types( &self, infcx: &InferCtxt<'_, 'tcx>, @@ -56,10 +57,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { opaque_ty_decls .into_iter() .map(|(opaque_def_id, ty::ResolvedOpaqueTy { concrete_type, substs })| { - debug!( - "infer_opaque_types(concrete_type = {:?}, substs = {:?})", - concrete_type, substs - ); + debug!(?concrete_type, ?substs); let mut subst_regions = vec![self.universal_regions.fr_static]; let universal_substs = @@ -110,10 +108,7 @@ impl<'tcx> RegionInferenceContext<'tcx> { } }); - debug!( - "infer_opaque_types(universal_concrete_type = {:?}, universal_substs = {:?})", - universal_concrete_type, universal_substs - ); + debug!(?universal_concrete_type, ?universal_substs); let remapped_type = infcx.infer_opaque_definition_from_instantiation( opaque_def_id, diff --git a/compiler/rustc_mir/src/borrow_check/type_check/input_output.rs b/compiler/rustc_mir/src/borrow_check/type_check/input_output.rs index 157959b115..77d9136622 100644 --- a/compiler/rustc_mir/src/borrow_check/type_check/input_output.rs +++ b/compiler/rustc_mir/src/borrow_check/type_check/input_output.rs @@ -103,11 +103,8 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { } } - assert!( - body.yield_ty.is_some() && universal_regions.yield_ty.is_some() - || body.yield_ty.is_none() && universal_regions.yield_ty.is_none() - ); - if let Some(mir_yield_ty) = body.yield_ty { + assert!(body.yield_ty().is_some() == universal_regions.yield_ty.is_some()); + if let Some(mir_yield_ty) = body.yield_ty() { let ur_yield_ty = universal_regions.yield_ty.unwrap(); let yield_span = body.local_decls[RETURN_PLACE].source_info.span; self.equate_normalized_input_or_output(ur_yield_ty, mir_yield_ty, yield_span); diff --git a/compiler/rustc_mir/src/borrow_check/type_check/mod.rs b/compiler/rustc_mir/src/borrow_check/type_check/mod.rs index 3ba06bdd6e..cce1549cb2 100644 --- a/compiler/rustc_mir/src/borrow_check/type_check/mod.rs +++ b/compiler/rustc_mir/src/borrow_check/type_check/mod.rs @@ -43,6 +43,9 @@ use rustc_trait_selection::traits::{self, ObligationCause, PredicateObligations} use crate::dataflow::impls::MaybeInitializedPlaces; use crate::dataflow::move_paths::MoveData; use crate::dataflow::ResultsCursor; +use crate::transform::{ + check_consts::ConstCx, promote_consts::is_const_fn_in_array_repeat_expression, +}; use crate::borrow_check::{ borrow_set::BorrowSet, @@ -279,7 +282,7 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> { fn visit_constant(&mut self, constant: &Constant<'tcx>, location: Location) { self.super_constant(constant, location); - let ty = self.sanitize_type(constant, constant.literal.ty); + let ty = self.sanitize_type(constant, constant.literal.ty()); self.cx.infcx.tcx.for_each_free_region(&ty, |live_region| { let live_region_vid = @@ -293,7 +296,7 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> { if let Some(annotation_index) = constant.user_ty { if let Err(terr) = self.cx.relate_type_and_user_type( - constant.literal.ty, + constant.literal.ty(), ty::Variance::Invariant, &UserTypeProjection { base: annotation_index, projs: vec![] }, location.to_locations(), @@ -305,13 +308,22 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> { constant, "bad constant user type {:?} vs {:?}: {:?}", annotation, - constant.literal.ty, + constant.literal.ty(), terr, ); } } else { let tcx = self.tcx(); - if let ty::ConstKind::Unevaluated(def, substs, promoted) = constant.literal.val { + let maybe_uneval = match constant.literal { + ConstantKind::Ty(ct) => match ct.val { + ty::ConstKind::Unevaluated(def, substs, promoted) => { + Some((def, substs, promoted)) + } + _ => None, + }, + _ => None, + }; + if let Some((def, substs, promoted)) = maybe_uneval { if let Some(promoted) = promoted { let check_err = |verifier: &mut TypeVerifier<'a, 'b, 'tcx>, promoted: &Body<'tcx>, @@ -346,7 +358,7 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> { location.to_locations(), ConstraintCategory::Boring, self.cx.param_env.and(type_op::ascribe_user_type::AscribeUserType::new( - constant.literal.ty, + constant.literal.ty(), def.did, UserSubsts { substs, user_self_ty: None }, )), @@ -364,7 +376,7 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> { let unnormalized_ty = tcx.type_of(static_def_id); let locations = location.to_locations(); let normalized_ty = self.cx.normalize(unnormalized_ty, locations); - let literal_ty = constant.literal.ty.builtin_deref(true).unwrap().ty; + let literal_ty = constant.literal.ty().builtin_deref(true).unwrap().ty; if let Err(terr) = self.cx.eq_types( normalized_ty, @@ -376,7 +388,7 @@ impl<'a, 'b, 'tcx> Visitor<'tcx> for TypeVerifier<'a, 'b, 'tcx> { } } - if let ty::FnDef(def_id, substs) = *constant.literal.ty.kind() { + if let ty::FnDef(def_id, substs) = *constant.literal.ty().kind() { let instantiated_predicates = tcx.predicates_of(def_id).instantiate(tcx, substs); self.cx.normalize_and_prove_instantiated_predicates( instantiated_predicates, @@ -1098,6 +1110,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { ) -> Fallible<()> { relate_tys::relate_types( self.infcx, + self.param_env, a, v, b, @@ -1516,6 +1529,12 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { ); } } + StatementKind::CopyNonOverlapping(box rustc_middle::mir::CopyNonOverlapping { + .. + }) => span_bug!( + stmt.source_info.span, + "Unexpected StatementKind::CopyNonOverlapping, should only appear after lowering_intrinsics", + ), StatementKind::FakeRead(..) | StatementKind::StorageLive(..) | StatementKind::StorageDead(..) @@ -1647,7 +1666,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { } TerminatorKind::Yield { ref value, .. } => { let value_ty = value.ty(body, tcx); - match body.yield_ty { + match body.yield_ty() { None => span_mirbug!(self, term, "yield in non-generator"), Some(ty) => { if let Err(terr) = self.sub_types( @@ -1730,7 +1749,10 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { } } None => { - if !sig.output().conservative_is_privately_uninhabited(self.tcx()) { + if !self + .tcx() + .conservative_is_privately_uninhabited(self.param_env.and(sig.output())) + { span_mirbug!(self, term, "call to converging function {:?} w/o dest", sig); } } @@ -1988,18 +2010,24 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { Operand::Copy(..) | Operand::Constant(..) => { // These are always okay: direct use of a const, or a value that can evidently be copied. } - Operand::Move(_) => { + Operand::Move(place) => { // 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) { + let ccx = ConstCx::new_with_param_env(tcx, body, self.param_env); + let is_const_fn = + is_const_fn_in_array_repeat_expression(&ccx, &place, &body); + + debug!("check_rvalue: is_const_fn={:?}", is_const_fn); + let def_id = body.source.def_id().expect_local(); self.infcx.report_selection_error( &traits::Obligation::new( ObligationCause::new( span, self.tcx().hir().local_def_id_to_hir_id(def_id), - traits::ObligationCauseCode::RepeatVec, + traits::ObligationCauseCode::RepeatVec(is_const_fn), ), self.param_env, ty::Binder::bind(ty::TraitRef::new( @@ -2191,19 +2219,18 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { 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::Not, - ty: array_ty, - }) => match array_ty.kind() { - ty::Array(ty_elem, _) => Some(ty_elem), - _ => None, - }, + let opt_ty_elem_mut = match ty_from.kind() { + ty::RawPtr(ty::TypeAndMut { mutbl: array_mut, ty: array_ty }) => { + match array_ty.kind() { + ty::Array(ty_elem, _) => Some((ty_elem, *array_mut)), + _ => None, + } + } _ => None, }; - let ty_elem = match opt_ty_elem { - Some(ty_elem) => ty_elem, + let (ty_elem, ty_mut) = match opt_ty_elem_mut { + Some(ty_elem_mut) => ty_elem_mut, None => { span_mirbug!( self, @@ -2215,11 +2242,10 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { } }; - let ty_to = match ty.kind() { - ty::RawPtr(ty::TypeAndMut { - mutbl: hir::Mutability::Not, - ty: ty_to, - }) => ty_to, + let (ty_to, ty_to_mut) = match ty.kind() { + ty::RawPtr(ty::TypeAndMut { mutbl: ty_to_mut, ty: ty_to }) => { + (ty_to, *ty_to_mut) + } _ => { span_mirbug!( self, @@ -2231,6 +2257,17 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { } }; + if ty_to_mut == Mutability::Mut && ty_mut == Mutability::Not { + span_mirbug!( + self, + rvalue, + "ArrayToPointer cast from const {:?} to mut {:?}", + ty, + ty_to + ); + return; + } + if let Err(terr) = self.sub_types( ty_elem, ty_to, @@ -2277,8 +2314,7 @@ impl<'a, 'tcx> TypeChecker<'a, 'tcx> { Rvalue::BinaryOp( BinOp::Eq | BinOp::Ne | BinOp::Lt | BinOp::Le | BinOp::Gt | BinOp::Ge, - left, - right, + box (left, right), ) => { let ty_left = left.ty(body, tcx); match ty_left.kind() { diff --git a/compiler/rustc_mir/src/borrow_check/type_check/relate_tys.rs b/compiler/rustc_mir/src/borrow_check/type_check/relate_tys.rs index 6665eb5ad5..249945f04b 100644 --- a/compiler/rustc_mir/src/borrow_check/type_check/relate_tys.rs +++ b/compiler/rustc_mir/src/borrow_check/type_check/relate_tys.rs @@ -18,6 +18,7 @@ use crate::borrow_check::type_check::{BorrowCheckContext, Locations}; /// variables, but not the type `b`. pub(super) fn relate_types<'tcx>( infcx: &InferCtxt<'_, 'tcx>, + param_env: ty::ParamEnv<'tcx>, a: Ty<'tcx>, v: ty::Variance, b: Ty<'tcx>, @@ -28,7 +29,7 @@ pub(super) fn relate_types<'tcx>( debug!("relate_types(a={:?}, v={:?}, b={:?}, locations={:?})", a, v, b, locations); TypeRelating::new( infcx, - NllTypeRelatingDelegate::new(infcx, borrowck_context, locations, category), + NllTypeRelatingDelegate::new(infcx, borrowck_context, param_env, locations, category), v, ) .relate(a, b)?; @@ -39,6 +40,8 @@ struct NllTypeRelatingDelegate<'me, 'bccx, 'tcx> { infcx: &'me InferCtxt<'me, 'tcx>, borrowck_context: Option<&'me mut BorrowCheckContext<'bccx, 'tcx>>, + param_env: ty::ParamEnv<'tcx>, + /// Where (and why) is this relation taking place? locations: Locations, @@ -50,14 +53,19 @@ impl NllTypeRelatingDelegate<'me, 'bccx, 'tcx> { fn new( infcx: &'me InferCtxt<'me, 'tcx>, borrowck_context: Option<&'me mut BorrowCheckContext<'bccx, 'tcx>>, + param_env: ty::ParamEnv<'tcx>, locations: Locations, category: ConstraintCategory, ) -> Self { - Self { infcx, borrowck_context, locations, category } + Self { infcx, borrowck_context, param_env, locations, category } } } impl TypeRelatingDelegate<'tcx> for NllTypeRelatingDelegate<'_, '_, 'tcx> { + fn param_env(&self) -> ty::ParamEnv<'tcx> { + self.param_env + } + fn create_next_universe(&mut self) -> ty::UniverseIndex { self.infcx.create_next_universe() } diff --git a/compiler/rustc_mir/src/const_eval/error.rs b/compiler/rustc_mir/src/const_eval/error.rs index 0e610e3755..754ed0bea8 100644 --- a/compiler/rustc_mir/src/const_eval/error.rs +++ b/compiler/rustc_mir/src/const_eval/error.rs @@ -16,6 +16,7 @@ use crate::interpret::{ #[derive(Clone, Debug)] pub enum ConstEvalErrKind { NeedsRfc(String), + PtrToIntCast, ConstAccessesStatic, ModifiedGlobal, AssertFailure(AssertKind), @@ -39,6 +40,12 @@ impl fmt::Display for ConstEvalErrKind { NeedsRfc(ref msg) => { write!(f, "\"{}\" needs an rfc before being allowed inside constants", msg) } + PtrToIntCast => { + write!( + f, + "cannot cast pointer to integer because it was not created by cast from integer" + ) + } ConstAccessesStatic => write!(f, "constant accesses static"), ModifiedGlobal => { write!(f, "modifying a static's initial value from another static's initializer") @@ -77,7 +84,11 @@ impl<'tcx> ConstEvalErr<'tcx> { { error.print_backtrace(); let stacktrace = ecx.generate_stacktrace(); - ConstEvalErr { error: error.kind, stacktrace, span: span.unwrap_or_else(|| ecx.cur_span()) } + ConstEvalErr { + error: error.into_kind(), + stacktrace, + span: span.unwrap_or_else(|| ecx.cur_span()), + } } pub fn struct_error( diff --git a/compiler/rustc_mir/src/const_eval/eval_queries.rs b/compiler/rustc_mir/src/const_eval/eval_queries.rs index 252f5e7ef2..fa234ff5fe 100644 --- a/compiler/rustc_mir/src/const_eval/eval_queries.rs +++ b/compiler/rustc_mir/src/const_eval/eval_queries.rs @@ -50,13 +50,13 @@ fn eval_body_using_ecx<'mir, 'tcx>( let name = with_no_trimmed_paths(|| ty::tls::with(|tcx| tcx.def_path_str(cid.instance.def_id()))); - let prom = cid.promoted.map_or(String::new(), |p| format!("::promoted[{:?}]", p)); + let prom = cid.promoted.map_or_else(String::new, |p| format!("::promoted[{:?}]", p)); trace!("eval_body_using_ecx: pushing stack frame for global: {}{}", name, prom); ecx.push_stack_frame( cid.instance, body, - Some(ret.into()), + Some(&ret.into()), StackPopCleanup::None { cleanup: false }, )?; @@ -72,7 +72,7 @@ fn eval_body_using_ecx<'mir, 'tcx>( None => InternKind::Constant, } }; - intern_const_alloc_recursive(ecx, intern_kind, ret)?; + intern_const_alloc_recursive(ecx, intern_kind, &ret)?; debug!("eval_body_using_ecx done: {:?}", *ret); Ok(ret) @@ -105,7 +105,7 @@ pub(super) fn mk_eval_cx<'mir, 'tcx>( /// type system. pub(super) fn op_to_const<'tcx>( ecx: &CompileTimeEvalContext<'_, 'tcx>, - op: OpTy<'tcx>, + op: &OpTy<'tcx>, ) -> ConstValue<'tcx> { // We do not have value optimizations for everything. // Only scalars and slices, since they are very common. @@ -137,7 +137,7 @@ pub(super) fn op_to_const<'tcx>( op.try_as_mplace(ecx) }; - let to_const_value = |mplace: MPlaceTy<'_>| match mplace.ptr { + let to_const_value = |mplace: &MPlaceTy<'_>| match mplace.ptr { Scalar::Ptr(ptr) => { let alloc = ecx.tcx.global_alloc(ptr.alloc_id).unwrap_memory(); ConstValue::ByRef { alloc, offset: ptr.offset } @@ -155,12 +155,12 @@ pub(super) fn op_to_const<'tcx>( } }; match immediate { - Ok(mplace) => to_const_value(mplace), + Ok(ref mplace) => to_const_value(mplace), // see comment on `let try_as_immediate` above Err(imm) => match *imm { Immediate::Scalar(x) => match x { ScalarMaybeUninit::Scalar(s) => ConstValue::Scalar(s), - ScalarMaybeUninit::Uninit => to_const_value(op.assert_mem_place(ecx)), + ScalarMaybeUninit::Uninit => to_const_value(&op.assert_mem_place(ecx)), }, Immediate::ScalarPair(a, b) => { let (data, start) = match a.check_init().unwrap() { @@ -201,14 +201,14 @@ fn turn_into_const_value<'tcx>( "the `eval_to_const_value_raw` query should not be used for statics, use `eval_to_allocation` instead" ); // Turn this into a proper constant. - op_to_const(&ecx, mplace.into()) + op_to_const(&ecx, &mplace.into()) } pub fn eval_to_const_value_raw_provider<'tcx>( tcx: TyCtxt<'tcx>, key: ty::ParamEnvAnd<'tcx, GlobalId<'tcx>>, ) -> ::rustc_middle::mir::interpret::EvalToConstValueResult<'tcx> { - // see comment in const_eval_raw_provider for what we're doing here + // see comment in eval_to_allocation_raw_provider for what we're doing here if key.param_env.reveal() == Reveal::All { let mut key = key; key.param_env = key.param_env.with_user_facing(); @@ -230,7 +230,7 @@ pub fn eval_to_const_value_raw_provider<'tcx>( }; 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 }; + let error = ConstEvalErr { error: error.into_kind(), stacktrace: vec![], span }; error.report_as_error(tcx.at(span), "could not evaluate nullary intrinsic") }); } @@ -348,7 +348,7 @@ pub fn eval_to_allocation_raw_provider<'tcx>( Some(_) => CtfeValidationMode::Regular, // a `static` None => CtfeValidationMode::Const { inner, allow_static_ptrs: false }, }; - ecx.const_validate_operand(mplace.into(), path, &mut ref_tracking, mode)?; + ecx.const_validate_operand(&mplace.into(), path, &mut ref_tracking, mode)?; inner = true; } }; diff --git a/compiler/rustc_mir/src/const_eval/machine.rs b/compiler/rustc_mir/src/const_eval/machine.rs index 49126cfec6..61785a5272 100644 --- a/compiler/rustc_mir/src/const_eval/machine.rs +++ b/compiler/rustc_mir/src/const_eval/machine.rs @@ -39,8 +39,8 @@ impl<'mir, 'tcx> InterpCx<'mir, 'tcx, CompileTimeInterpreter<'mir, 'tcx>> { // &str assert!(args.len() == 1); - let msg_place = self.deref_operand(args[0])?; - let msg = Symbol::intern(self.read_str(msg_place)?); + let msg_place = self.deref_operand(&args[0])?; + let msg = Symbol::intern(self.read_str(&msg_place)?); let span = self.find_closest_untracked_caller_location(); let (file, line, col) = self.location_triple_for_span(span); Err(ConstEvalErrKind::Panic { msg, file, line, col }.into()) @@ -222,7 +222,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir, instance: ty::Instance<'tcx>, _abi: Abi, args: &[OpTy<'tcx>], - _ret: Option<(PlaceTy<'tcx>, mir::BasicBlock)>, + _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); @@ -245,8 +245,8 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir, Ok(Some(match ecx.load_mir(instance.def, None) { Ok(body) => body, Err(err) => { - if let err_unsup!(NoMirFor(did)) = err.kind { - let path = ecx.tcx.def_path_str(did); + if let err_unsup!(NoMirFor(did)) = err.kind() { + let path = ecx.tcx.def_path_str(*did); return Err(ConstEvalErrKind::NeedsRfc(format!( "calling extern function `{}`", path @@ -262,7 +262,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir, ecx: &mut InterpCx<'mir, 'tcx, Self>, instance: ty::Instance<'tcx>, args: &[OpTy<'tcx>], - ret: Option<(PlaceTy<'tcx>, mir::BasicBlock)>, + ret: Option<(&PlaceTy<'tcx>, mir::BasicBlock)>, _unwind: Option, ) -> InterpResult<'tcx> { // Shared intrinsics. @@ -284,8 +284,8 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir, }; match intrinsic_name { sym::ptr_guaranteed_eq | sym::ptr_guaranteed_ne => { - let a = ecx.read_immediate(args[0])?.to_scalar()?; - let b = ecx.read_immediate(args[1])?.to_scalar()?; + let a = ecx.read_immediate(&args[0])?.to_scalar()?; + let b = ecx.read_immediate(&args[1])?.to_scalar()?; let cmp = if intrinsic_name == sym::ptr_guaranteed_eq { ecx.guaranteed_eq(a, b) } else { @@ -294,8 +294,8 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir, ecx.write_scalar(Scalar::from_bool(cmp), dest)?; } sym::const_allocate => { - let size = ecx.read_scalar(args[0])?.to_machine_usize(ecx)?; - let align = ecx.read_scalar(args[1])?.to_machine_usize(ecx)?; + let size = ecx.read_scalar(&args[0])?.to_machine_usize(ecx)?; + let align = ecx.read_scalar(&args[1])?.to_machine_usize(ecx)?; let align = match Align::from_bytes(align) { Ok(a) => a, @@ -330,7 +330,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir, use rustc_middle::mir::AssertKind::*; // Convert `AssertKind` to `AssertKind`. let eval_to_int = - |op| ecx.read_immediate(ecx.eval_operand(op, None)?).map(|x| x.to_const_int()); + |op| ecx.read_immediate(&ecx.eval_operand(op, None)?).map(|x| x.to_const_int()); let err = match msg { BoundsCheck { ref len, ref index } => { let len = eval_to_int(len)?; @@ -352,21 +352,21 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for CompileTimeInterpreter<'mir, } fn ptr_to_int(_mem: &Memory<'mir, 'tcx, Self>, _ptr: Pointer) -> InterpResult<'tcx, u64> { - Err(ConstEvalErrKind::NeedsRfc("pointer-to-integer cast".to_string()).into()) + Err(ConstEvalErrKind::PtrToIntCast.into()) } fn binary_ptr_op( _ecx: &InterpCx<'mir, 'tcx, Self>, _bin_op: mir::BinOp, - _left: ImmTy<'tcx>, - _right: ImmTy<'tcx>, + _left: &ImmTy<'tcx>, + _right: &ImmTy<'tcx>, ) -> InterpResult<'tcx, (Scalar, bool, Ty<'tcx>)> { Err(ConstEvalErrKind::NeedsRfc("pointer arithmetic or comparison".to_string()).into()) } fn box_alloc( _ecx: &mut InterpCx<'mir, 'tcx, Self>, - _dest: PlaceTy<'tcx>, + _dest: &PlaceTy<'tcx>, ) -> InterpResult<'tcx> { Err(ConstEvalErrKind::NeedsRfc("heap allocations via `box` keyword".to_string()).into()) } diff --git a/compiler/rustc_mir/src/const_eval/mod.rs b/compiler/rustc_mir/src/const_eval/mod.rs index 9dd2a8592a..77531ae2c5 100644 --- a/compiler/rustc_mir/src/const_eval/mod.rs +++ b/compiler/rustc_mir/src/const_eval/mod.rs @@ -3,12 +3,15 @@ use std::convert::TryFrom; use rustc_hir::Mutability; -use rustc_middle::mir; use rustc_middle::ty::{self, TyCtxt}; +use rustc_middle::{ + mir::{self, interpret::ConstAlloc}, + ty::ScalarInt, +}; use rustc_span::{source_map::DUMMY_SP, symbol::Symbol}; use crate::interpret::{ - intern_const_alloc_recursive, ConstValue, InternKind, InterpCx, MemPlaceMeta, Scalar, + intern_const_alloc_recursive, ConstValue, InternKind, InterpCx, MPlaceTy, MemPlaceMeta, Scalar, }; mod error; @@ -29,12 +32,106 @@ pub(crate) fn const_caller_location( let mut ecx = mk_eval_cx(tcx, DUMMY_SP, ty::ParamEnv::reveal_all(), false); let loc_place = ecx.alloc_caller_location(file, line, col); - if intern_const_alloc_recursive(&mut ecx, InternKind::Constant, loc_place).is_err() { + if intern_const_alloc_recursive(&mut ecx, InternKind::Constant, &loc_place).is_err() { bug!("intern_const_alloc_recursive should not error in this case") } ConstValue::Scalar(loc_place.ptr) } +/// Convert an evaluated constant to a type level constant +pub(crate) fn const_to_valtree<'tcx>( + tcx: TyCtxt<'tcx>, + param_env: ty::ParamEnv<'tcx>, + raw: ConstAlloc<'tcx>, +) -> Option> { + let ecx = mk_eval_cx( + tcx, DUMMY_SP, param_env, + // It is absolutely crucial for soundness that + // we do not read from static items or other mutable memory. + false, + ); + let place = ecx.raw_const_to_mplace(raw).unwrap(); + const_to_valtree_inner(&ecx, &place) +} + +fn const_to_valtree_inner<'tcx>( + ecx: &CompileTimeEvalContext<'tcx, 'tcx>, + place: &MPlaceTy<'tcx>, +) -> Option> { + let branches = |n, variant| { + let place = match variant { + Some(variant) => ecx.mplace_downcast(&place, variant).unwrap(), + None => *place, + }; + let variant = + variant.map(|variant| Some(ty::ValTree::Leaf(ScalarInt::from(variant.as_u32())))); + let fields = (0..n).map(|i| { + let field = ecx.mplace_field(&place, i).unwrap(); + const_to_valtree_inner(ecx, &field) + }); + // For enums, we preped their variant index before the variant's fields so we can figure out + // the variant again when just seeing a valtree. + let branches = variant.into_iter().chain(fields); + Some(ty::ValTree::Branch( + ecx.tcx.arena.alloc_from_iter(branches.collect::>>()?), + )) + }; + match place.layout.ty.kind() { + ty::FnDef(..) => Some(ty::ValTree::zst()), + ty::Bool | ty::Int(_) | ty::Uint(_) | ty::Float(_) | ty::Char => { + let val = ecx.read_immediate(&place.into()).unwrap(); + let val = val.to_scalar().unwrap(); + Some(ty::ValTree::Leaf(val.assert_int())) + } + + // Raw pointers are not allowed in type level constants, as we cannot properly test them for + // equality at compile-time (see `ptr_guaranteed_eq`/`_ne`). + // Technically we could allow function pointers (represented as `ty::Instance`), but this is not guaranteed to + // agree with runtime equality tests. + ty::FnPtr(_) | ty::RawPtr(_) => None, + ty::Ref(..) => unimplemented!("need to use deref_const"), + + // Trait objects are not allowed in type level constants, as we have no concept for + // resolving their backing type, even if we can do that at const eval time. We may + // hypothetically be able to allow `dyn StructuralEq` trait objects in the future, + // but it is unclear if this is useful. + ty::Dynamic(..) => None, + + ty::Slice(_) | ty::Str => { + unimplemented!("need to find the backing data of the slice/str and recurse on that") + } + ty::Tuple(substs) => branches(substs.len(), None), + ty::Array(_, len) => branches(usize::try_from(len.eval_usize(ecx.tcx.tcx, ecx.param_env)).unwrap(), None), + + ty::Adt(def, _) => { + if def.variants.is_empty() { + bug!("uninhabited types should have errored and never gotten converted to valtree") + } + + let variant = ecx.read_discriminant(&place.into()).unwrap().1; + + branches(def.variants[variant].fields.len(), Some(variant)) + } + + ty::Never + | ty::Error(_) + | ty::Foreign(..) + | ty::Infer(ty::FreshIntTy(_)) + | ty::Infer(ty::FreshFloatTy(_)) + | ty::Projection(..) + | ty::Param(_) + | ty::Bound(..) + | ty::Placeholder(..) + // FIXME(oli-obk): we could look behind opaque types + | ty::Opaque(..) + | ty::Infer(_) + // FIXME(oli-obk): we can probably encode closures just like structs + | ty::Closure(..) + | ty::Generator(..) + | ty::GeneratorWitness(..) => None, + } +} + /// This function uses `unwrap` copiously, because an already validated constant /// must have valid fields and can thus never fail outside of compiler bugs. However, it is /// invoked from the pretty printer, where it can receive enums with no variants and e.g. @@ -55,8 +152,8 @@ pub(crate) fn destructure_const<'tcx>( return mir::DestructuredConst { variant: None, fields: &[] }; } ty::Adt(def, _) => { - let variant = ecx.read_discriminant(op).unwrap().1; - let down = ecx.operand_downcast(op, variant).unwrap(); + let variant = ecx.read_discriminant(&op).unwrap().1; + let down = ecx.operand_downcast(&op, variant).unwrap(); (def.variants[variant].fields.len(), Some(variant), down) } ty::Tuple(substs) => (substs.len(), None, op), @@ -64,8 +161,8 @@ pub(crate) fn destructure_const<'tcx>( }; let fields_iter = (0..field_count).map(|i| { - let field_op = ecx.operand_field(down, i).unwrap(); - let val = op_to_const(&ecx, field_op); + let field_op = ecx.operand_field(&down, i).unwrap(); + let val = op_to_const(&ecx, &field_op); ty::Const::from_value(tcx, val, field_op.layout.ty) }); let fields = tcx.arena.alloc_from_iter(fields_iter); @@ -81,7 +178,7 @@ pub(crate) fn deref_const<'tcx>( trace!("deref_const: {:?}", val); let ecx = mk_eval_cx(tcx, DUMMY_SP, param_env, false); let op = ecx.const_to_op(val, None).unwrap(); - let mplace = ecx.deref_operand(op).unwrap(); + let mplace = ecx.deref_operand(&op).unwrap(); if let Scalar::Ptr(ptr) = mplace.ptr { assert_eq!( ecx.memory.get_raw(ptr.alloc_id).unwrap().mutability, @@ -106,5 +203,5 @@ pub(crate) fn deref_const<'tcx>( }, }; - tcx.mk_const(ty::Const { val: ty::ConstKind::Value(op_to_const(&ecx, mplace.into())), ty }) + tcx.mk_const(ty::Const { val: ty::ConstKind::Value(op_to_const(&ecx, &mplace.into())), ty }) } diff --git a/compiler/rustc_mir/src/dataflow/framework/mod.rs b/compiler/rustc_mir/src/dataflow/framework/mod.rs index 524ad0af1a..3f7808c209 100644 --- a/compiler/rustc_mir/src/dataflow/framework/mod.rs +++ b/compiler/rustc_mir/src/dataflow/framework/mod.rs @@ -10,7 +10,7 @@ //! fixpoint solution to your dataflow problem, or implement the `ResultsVisitor` interface and use //! `visit_results`. The following example uses the `ResultsCursor` approach. //! -//! ```ignore(cross-crate-imports) +//! ```ignore (cross-crate-imports) //! use rustc_mir::dataflow::Analysis; // Makes `into_engine` available. //! //! fn do_my_analysis(tcx: TyCtxt<'tcx>, body: &mir::Body<'tcx>) { @@ -211,7 +211,7 @@ pub trait Analysis<'tcx>: AnalysisDomain<'tcx> { /// default impl and the one for all `A: GenKillAnalysis` will do the right thing. /// Its purpose is to enable method chaining like so: /// - /// ```ignore(cross-crate-imports) + /// ```ignore (cross-crate-imports) /// let results = MyAnalysis::new(tcx, body) /// .into_engine(tcx, body, def_id) /// .iterate_to_fixpoint() diff --git a/compiler/rustc_mir/src/dataflow/impls/borrows.rs b/compiler/rustc_mir/src/dataflow/impls/borrows.rs index 6b7889c4d9..f24d0f0266 100644 --- a/compiler/rustc_mir/src/dataflow/impls/borrows.rs +++ b/compiler/rustc_mir/src/dataflow/impls/borrows.rs @@ -11,7 +11,6 @@ use crate::borrow_check::{ use crate::dataflow::{self, fmt::DebugWithContext, GenKill}; use std::fmt; -use std::rc::Rc; rustc_index::newtype_index! { pub struct BorrowIndex { @@ -30,101 +29,113 @@ pub struct Borrows<'a, 'tcx> { tcx: TyCtxt<'tcx>, body: &'a Body<'tcx>, - borrow_set: Rc>, + borrow_set: &'a BorrowSet<'tcx>, borrows_out_of_scope_at_location: FxHashMap>, - - /// NLL region inference context with which NLL queries should be resolved - _nonlexical_regioncx: Rc>, } struct StackEntry { bb: mir::BasicBlock, lo: usize, hi: usize, - first_part_only: bool, } -fn precompute_borrows_out_of_scope<'tcx>( - body: &Body<'tcx>, - regioncx: &Rc>, - borrows_out_of_scope_at_location: &mut FxHashMap>, - borrow_index: BorrowIndex, - borrow_region: RegionVid, - location: Location, -) { - // We visit one BB at a time. The complication is that we may start in the - // middle of the first BB visited (the one containing `location`), in which - // case we may have to later on process the first part of that BB if there - // is a path back to its start. - - // For visited BBs, we record the index of the first statement processed. - // (In fully processed BBs this index is 0.) Note also that we add BBs to - // `visited` once they are added to `stack`, before they are actually - // processed, because this avoids the need to look them up again on - // completion. - let mut visited = FxHashMap::default(); - visited.insert(location.block, location.statement_index); - - let mut stack = vec![]; - stack.push(StackEntry { - bb: location.block, - lo: location.statement_index, - hi: body[location.block].statements.len(), - first_part_only: false, - }); - - while let Some(StackEntry { bb, lo, hi, first_part_only }) = stack.pop() { - let mut finished_early = first_part_only; - 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); - finished_early = true; - break; - } +struct OutOfScopePrecomputer<'a, 'tcx> { + visited: BitSet, + visit_stack: Vec, + body: &'a Body<'tcx>, + regioncx: &'a RegionInferenceContext<'tcx>, + borrows_out_of_scope_at_location: FxHashMap>, +} + +impl<'a, 'tcx> OutOfScopePrecomputer<'a, 'tcx> { + fn new(body: &'a Body<'tcx>, regioncx: &'a RegionInferenceContext<'tcx>) -> Self { + OutOfScopePrecomputer { + visited: BitSet::new_empty(body.basic_blocks().len()), + visit_stack: vec![], + body, + regioncx, + borrows_out_of_scope_at_location: FxHashMap::default(), } + } +} - if !finished_early { - // Add successor BBs to the work list, if necessary. - let bb_data = &body[bb]; - assert!(hi == bb_data.statements.len()); - for &succ_bb in bb_data.terminator().successors() { - 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` - // for processing. - if *lo > 0 { - stack.push(StackEntry { +impl<'tcx> OutOfScopePrecomputer<'_, 'tcx> { + fn precompute_borrows_out_of_scope( + &mut self, + borrow_index: BorrowIndex, + borrow_region: RegionVid, + location: Location, + ) { + // We visit one BB at a time. The complication is that we may start in the + // middle of the first BB visited (the one containing `location`), in which + // case we may have to later on process the first part of that BB if there + // is a path back to its start. + + // For visited BBs, we record the index of the first statement processed. + // (In fully processed BBs this index is 0.) Note also that we add BBs to + // `visited` once they are added to `stack`, before they are actually + // processed, because this avoids the need to look them up again on + // completion. + self.visited.insert(location.block); + + let mut first_lo = location.statement_index; + let first_hi = self.body[location.block].statements.len(); + + self.visit_stack.push(StackEntry { bb: location.block, lo: first_lo, hi: first_hi }); + + while let Some(StackEntry { bb, lo, hi }) = self.visit_stack.pop() { + // If we process the first part of the first basic block (i.e. we encounter that block + // for the second time), we no longer have to visit its successors again. + let mut finished_early = bb == location.block && hi != first_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 !self.regioncx.region_contains(borrow_region, location) { + debug!("borrow {:?} gets killed at {:?}", borrow_index, location); + self.borrows_out_of_scope_at_location + .entry(location) + .or_default() + .push(borrow_index); + finished_early = true; + break; + } + } + + if !finished_early { + // Add successor BBs to the work list, if necessary. + let bb_data = &self.body[bb]; + debug_assert!(hi == bb_data.statements.len()); + for &succ_bb in bb_data.terminator().successors() { + if self.visited.insert(succ_bb) == false { + if succ_bb == location.block && first_lo > 0 { + // `succ_bb` has been seen before. If it wasn't + // fully processed, add its first part to `stack` + // for processing. + self.visit_stack.push(StackEntry { bb: succ_bb, lo: 0, - hi: *lo - 1, - first_part_only: true, + hi: first_lo - 1, }); + + // And update this entry with 0, to represent the + // whole BB being processed. + first_lo = 0; } - // And update this entry with 0, to represent the - // whole BB being processed. - *lo = 0; - }) - .or_insert_with(|| { + } else { // succ_bb hasn't been seen before. Add it to // `stack` for processing. - stack.push(StackEntry { + self.visit_stack.push(StackEntry { bb: succ_bb, lo: 0, - hi: body[succ_bb].statements.len(), - first_part_only: false, + hi: self.body[succ_bb].statements.len(), }); - // Insert 0 for this BB, to represent the whole BB - // being processed. - 0 - }); + } + } } } + + self.visited.clear(); } } @@ -132,30 +143,22 @@ impl<'a, 'tcx> Borrows<'a, 'tcx> { crate fn new( tcx: TyCtxt<'tcx>, body: &'a Body<'tcx>, - nonlexical_regioncx: Rc>, - borrow_set: &Rc>, + nonlexical_regioncx: &'a RegionInferenceContext<'tcx>, + borrow_set: &'a BorrowSet<'tcx>, ) -> Self { - let mut borrows_out_of_scope_at_location = FxHashMap::default(); + let mut prec = OutOfScopePrecomputer::new(body, nonlexical_regioncx); for (borrow_index, borrow_data) in borrow_set.iter_enumerated() { let borrow_region = borrow_data.region.to_region_vid(); let location = borrow_data.reserve_location; - precompute_borrows_out_of_scope( - body, - &nonlexical_regioncx, - &mut borrows_out_of_scope_at_location, - borrow_index, - borrow_region, - location, - ); + prec.precompute_borrows_out_of_scope(borrow_index, borrow_region, location); } Borrows { tcx, body, - borrow_set: borrow_set.clone(), - borrows_out_of_scope_at_location, - _nonlexical_regioncx: nonlexical_regioncx, + borrow_set, + borrows_out_of_scope_at_location: prec.borrows_out_of_scope_at_location, } } @@ -302,6 +305,7 @@ impl<'tcx> dataflow::GenKillAnalysis<'tcx> for Borrows<'_, 'tcx> { | mir::StatementKind::Retag { .. } | mir::StatementKind::AscribeUserType(..) | mir::StatementKind::Coverage(..) + | mir::StatementKind::CopyNonOverlapping(..) | mir::StatementKind::Nop => {} } } diff --git a/compiler/rustc_mir/src/dataflow/impls/liveness.rs b/compiler/rustc_mir/src/dataflow/impls/liveness.rs index 85aaff5ab7..2d20f0d954 100644 --- a/compiler/rustc_mir/src/dataflow/impls/liveness.rs +++ b/compiler/rustc_mir/src/dataflow/impls/liveness.rs @@ -95,7 +95,7 @@ where // We purposefully do not call `super_place` here to avoid calling `visit_local` for this // place with one of the `Projection` variants of `PlaceContext`. - self.visit_projection(local, projection, context, location); + self.visit_projection(place.as_ref(), context, location); match DefUse::for_place(context) { // Treat derefs as a use of the base local. `*p = 4` is not a def of `p` but a use. diff --git a/compiler/rustc_mir/src/dataflow/impls/storage_liveness.rs b/compiler/rustc_mir/src/dataflow/impls/storage_liveness.rs index 9250cd4084..792664597f 100644 --- a/compiler/rustc_mir/src/dataflow/impls/storage_liveness.rs +++ b/compiler/rustc_mir/src/dataflow/impls/storage_liveness.rs @@ -149,6 +149,7 @@ impl<'mir, 'tcx> dataflow::GenKillAnalysis<'tcx> for MaybeRequiresStorage<'mir, | StatementKind::FakeRead(..) | StatementKind::Nop | StatementKind::Retag(..) + | StatementKind::CopyNonOverlapping(..) | StatementKind::StorageLive(..) => {} } } diff --git a/compiler/rustc_mir/src/dataflow/move_paths/builder.rs b/compiler/rustc_mir/src/dataflow/move_paths/builder.rs index ee78ff00c9..1ddd81e779 100644 --- a/compiler/rustc_mir/src/dataflow/move_paths/builder.rs +++ b/compiler/rustc_mir/src/dataflow/move_paths/builder.rs @@ -318,6 +318,7 @@ impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> { StatementKind::Retag { .. } | StatementKind::AscribeUserType(..) | StatementKind::Coverage(..) + | StatementKind::CopyNonOverlapping(..) | StatementKind::Nop => {} } } @@ -329,8 +330,8 @@ impl<'b, 'a, 'tcx> Gatherer<'b, 'a, 'tcx> { | Rvalue::Repeat(ref operand, _) | Rvalue::Cast(_, ref operand, _) | Rvalue::UnaryOp(_, ref operand) => self.gather_operand(operand), - Rvalue::BinaryOp(ref _binop, ref lhs, ref rhs) - | Rvalue::CheckedBinaryOp(ref _binop, ref lhs, ref rhs) => { + Rvalue::BinaryOp(ref _binop, box (ref lhs, ref rhs)) + | Rvalue::CheckedBinaryOp(ref _binop, box (ref lhs, ref rhs)) => { self.gather_operand(lhs); self.gather_operand(rhs); } diff --git a/compiler/rustc_mir/src/interpret/cast.rs b/compiler/rustc_mir/src/interpret/cast.rs index 128d8cff95..2d9e6df0ab 100644 --- a/compiler/rustc_mir/src/interpret/cast.rs +++ b/compiler/rustc_mir/src/interpret/cast.rs @@ -17,10 +17,10 @@ use super::{ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { pub fn cast( &mut self, - src: OpTy<'tcx, M::PointerTag>, + src: &OpTy<'tcx, M::PointerTag>, cast_kind: CastKind, cast_ty: Ty<'tcx>, - dest: PlaceTy<'tcx, M::PointerTag>, + dest: &PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { use rustc_middle::mir::CastKind::*; // FIXME: In which cases should we trigger UB when the source is uninit? @@ -32,7 +32,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { Misc => { let src = self.read_immediate(src)?; - let res = self.misc_cast(src, cast_ty)?; + let res = self.misc_cast(&src, cast_ty)?; self.write_immediate(res, dest)?; } @@ -107,7 +107,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { fn misc_cast( &self, - src: ImmTy<'tcx, M::PointerTag>, + src: &ImmTy<'tcx, M::PointerTag>, cast_ty: Ty<'tcx>, ) -> InterpResult<'tcx, Immediate> { use rustc_middle::ty::TyKind::*; @@ -158,13 +158,13 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let dest_layout = self.layout_of(cast_ty)?; if dest_layout.size == src.layout.size { // Thin or fat pointer that just hast the ptr kind of target type changed. - return Ok(*src); + return Ok(**src); } else { // Casting the metadata away from a fat ptr. assert_eq!(src.layout.size, 2 * self.memory.pointer_size()); assert_eq!(dest_layout.size, self.memory.pointer_size()); assert!(src.layout.ty.is_unsafe_ptr()); - return match *src { + return match **src { Immediate::ScalarPair(data, _) => Ok(data.into()), Immediate::Scalar(..) => span_bug!( self.cur_span(), @@ -259,8 +259,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { fn unsize_into_ptr( &mut self, - src: OpTy<'tcx, M::PointerTag>, - dest: PlaceTy<'tcx, M::PointerTag>, + src: &OpTy<'tcx, M::PointerTag>, + dest: &PlaceTy<'tcx, M::PointerTag>, // The pointee types source_ty: Ty<'tcx>, cast_ty: Ty<'tcx>, @@ -300,9 +300,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { fn unsize_into( &mut self, - src: OpTy<'tcx, M::PointerTag>, + src: &OpTy<'tcx, M::PointerTag>, cast_ty: TyAndLayout<'tcx>, - dest: PlaceTy<'tcx, M::PointerTag>, + dest: &PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { trace!("Unsizing {:?} of type {} into {:?}", *src, src.layout.ty, cast_ty.ty); match (&src.layout.ty.kind(), &cast_ty.ty.kind()) { @@ -340,9 +340,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let src_field = self.operand_field(src, i)?; let dst_field = self.place_field(dest, i)?; if src_field.layout.ty == cast_ty_field.ty { - self.copy_op(src_field, dst_field)?; + self.copy_op(&src_field, &dst_field)?; } else { - self.unsize_into(src_field, cast_ty_field, dst_field)?; + self.unsize_into(&src_field, cast_ty_field, &dst_field)?; } } Ok(()) diff --git a/compiler/rustc_mir/src/interpret/eval_context.rs b/compiler/rustc_mir/src/interpret/eval_context.rs index 7e9594dd6b..149a9f81ea 100644 --- a/compiler/rustc_mir/src/interpret/eval_context.rs +++ b/compiler/rustc_mir/src/interpret/eval_context.rs @@ -226,6 +226,16 @@ impl<'mir, 'tcx, Tag> Frame<'mir, 'tcx, Tag> { } impl<'mir, 'tcx, Tag, Extra> Frame<'mir, 'tcx, Tag, Extra> { + /// Get the current location within the Frame. + /// + /// If this is `Err`, we are not currently executing any particular statement in + /// this frame (can happen e.g. during frame initialization, and during unwinding on + /// frames without cleanup code). + /// We basically abuse `Result` as `Either`. + pub fn current_loc(&self) -> Result { + self.loc + } + /// Return the `SourceInfo` of the current instruction. pub fn current_source_info(&self) -> Option<&mir::SourceInfo> { self.loc.ok().map(|loc| self.body.source_info(loc)) @@ -548,8 +558,8 @@ impl<'mir, 'tcx: 'mir, 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: MemPlaceMeta, - layout: TyAndLayout<'tcx>, + metadata: &MemPlaceMeta, + layout: &TyAndLayout<'tcx>, ) -> InterpResult<'tcx, Option<(Size, Align)>> { if !layout.is_unsized() { return Ok(Some((layout.size, layout.align.abi))); @@ -577,24 +587,25 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // the last field). Can't have foreign types here, how would we // adjust alignment and size for them? let field = layout.field(self, layout.fields.count() - 1)?; - let (unsized_size, unsized_align) = match self.size_and_align_of(metadata, field)? { - Some(size_and_align) => size_and_align, - None => { - // A field with extern type. If this field is at offset 0, we behave - // like the underlying extern type. - // 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. - if sized_size == Size::ZERO { - return Ok(None); - } else { - span_bug!( - self.cur_span(), - "Fields cannot be extern types, unless they are at offset 0" - ) + let (unsized_size, unsized_align) = + match self.size_and_align_of(metadata, &field)? { + Some(size_and_align) => size_and_align, + None => { + // A field with extern type. If this field is at offset 0, we behave + // like the underlying extern type. + // 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. + if sized_size == Size::ZERO { + return Ok(None); + } else { + span_bug!( + self.cur_span(), + "Fields cannot be extern types, unless they are at offset 0" + ) + } } - } - }; + }; // FIXME (#26403, #27023): We should be adding padding // to `sized_size` (to accommodate the `unsized_align` @@ -645,16 +656,16 @@ impl<'mir, 'tcx: 'mir, 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) + self.size_and_align_of(&mplace.meta, &mplace.layout) } pub fn push_stack_frame( &mut self, instance: ty::Instance<'tcx>, body: &'mir mir::Body<'tcx>, - return_place: Option>, + return_place: Option<&PlaceTy<'tcx, M::PointerTag>>, return_to_block: StackPopCleanup, ) -> InterpResult<'tcx> { // first push a stack frame so we have access to the local substs @@ -662,7 +673,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { body, loc: Err(body.span), // Span used for errors caused during preamble. return_to_block, - return_place, + return_place: return_place.copied(), // empty local array, we fill it in below, after we are inside the stack frame and // all methods actually know about the frame locals: IndexVec::new(), @@ -678,7 +689,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let span = const_.span; let const_ = self.subst_from_current_frame_and_normalize_erasing_regions(const_.literal); - self.const_to_op(const_, None).map_err(|err| { + self.mir_const_to_op(&const_, None).map_err(|err| { // If there was an error, set the span of the current frame to this constant. // Avoiding doing this when evaluation succeeds. self.frame_mut().loc = Err(span); @@ -777,10 +788,10 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { if !unwinding { // Copy the return value to the caller's stack frame. - if let Some(return_place) = frame.return_place { + if let Some(ref return_place) = frame.return_place { let op = self.access_local(&frame, mir::RETURN_PLACE, None)?; - self.copy_op_transmute(op, return_place)?; - trace!("{:?}", self.dump_place(*return_place)); + self.copy_op_transmute(&op, return_place)?; + trace!("{:?}", self.dump_place(**return_place)); } else { throw_ub!(Unreachable); } diff --git a/compiler/rustc_mir/src/interpret/intern.rs b/compiler/rustc_mir/src/interpret/intern.rs index 01d58c47e3..95464da145 100644 --- a/compiler/rustc_mir/src/interpret/intern.rs +++ b/compiler/rustc_mir/src/interpret/intern.rs @@ -167,7 +167,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: CompileTimeMachine<'mir, 'tcx, const_eval::Memory fn visit_aggregate( &mut self, - mplace: MPlaceTy<'tcx>, + mplace: &MPlaceTy<'tcx>, fields: impl Iterator>, ) -> InterpResult<'tcx> { // ZSTs cannot contain pointers, so we can skip them. @@ -191,14 +191,14 @@ impl<'rt, 'mir, 'tcx: 'mir, M: CompileTimeMachine<'mir, 'tcx, const_eval::Memory self.walk_aggregate(mplace, fields) } - fn visit_value(&mut self, mplace: MPlaceTy<'tcx>) -> InterpResult<'tcx> { + fn visit_value(&mut self, mplace: &MPlaceTy<'tcx>) -> InterpResult<'tcx> { // Handle Reference types, as these are the only relocations supported by const eval. // Raw pointers (and boxes) are handled by the `leftover_relocations` logic. let tcx = self.ecx.tcx; let ty = mplace.layout.ty; if let ty::Ref(_, referenced_ty, ref_mutability) = *ty.kind() { - let value = self.ecx.read_immediate(mplace.into())?; - let mplace = self.ecx.ref_to_mplace(value)?; + let value = self.ecx.read_immediate(&(*mplace).into())?; + let mplace = self.ecx.ref_to_mplace(&value)?; assert_eq!(mplace.layout.ty, referenced_ty); // Handle trait object vtables. if let ty::Dynamic(..) = @@ -292,11 +292,11 @@ pub enum InternKind { /// tracks where in the value we are and thus can show much better error messages. /// Any errors here would anyway be turned into `const_err` lints, whereas validation failures /// are hard errors. -#[tracing::instrument(skip(ecx))] +#[tracing::instrument(level = "debug", skip(ecx))] pub fn intern_const_alloc_recursive>( ecx: &mut InterpCx<'mir, 'tcx, M>, intern_kind: InternKind, - ret: MPlaceTy<'tcx>, + ret: &MPlaceTy<'tcx>, ) -> Result<(), ErrorReported> where 'tcx: 'mir, @@ -328,7 +328,7 @@ where Some(ret.layout.ty), ); - ref_tracking.track((ret, base_intern_mode), || ()); + ref_tracking.track((*ret, base_intern_mode), || ()); while let Some(((mplace, mode), _)) = ref_tracking.todo.pop() { let res = InternVisitor { @@ -338,7 +338,7 @@ where leftover_allocations, inside_unsafe_cell: false, } - .visit_value(mplace); + .visit_value(&mplace); // We deliberately *ignore* interpreter errors here. When there is a problem, the remaining // references are "leftover"-interned, and later validation will show a proper error // and point at the right part of the value causing the problem. @@ -352,14 +352,6 @@ where error ), ); - // Some errors shouldn't come up because creating them causes - // an allocation, which we should avoid. When that happens, - // dedicated error variants should be introduced instead. - assert!( - !error.kind.allocates(), - "interning encountered allocating error: {}", - error - ); } } } @@ -435,11 +427,11 @@ impl<'mir, 'tcx: 'mir, M: super::intern::CompileTimeMachine<'mir, 'tcx, !>> layout: TyAndLayout<'tcx>, f: impl FnOnce( &mut InterpCx<'mir, 'tcx, M>, - MPlaceTy<'tcx, M::PointerTag>, + &MPlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, ()>, ) -> InterpResult<'tcx, &'tcx Allocation> { let dest = self.allocate(layout, MemoryKind::Stack); - f(self, dest)?; + f(self, &dest)?; let ptr = dest.ptr.assert_ptr(); assert_eq!(ptr.offset, Size::ZERO); let mut alloc = self.memory.alloc_map.remove(&ptr.alloc_id).unwrap().1; diff --git a/compiler/rustc_mir/src/interpret/intrinsics.rs b/compiler/rustc_mir/src/interpret/intrinsics.rs index f4309c9cd9..25c3c2c632 100644 --- a/compiler/rustc_mir/src/interpret/intrinsics.rs +++ b/compiler/rustc_mir/src/interpret/intrinsics.rs @@ -23,11 +23,7 @@ use super::{ mod caller_location; mod type_name; -fn numeric_intrinsic<'tcx, Tag>( - name: Symbol, - bits: u128, - kind: Primitive, -) -> InterpResult<'tcx, Scalar> { +fn numeric_intrinsic(name: Symbol, bits: u128, kind: Primitive) -> Scalar { let size = match kind { Primitive::Int(integer, _) => integer.size(), _ => bug!("invalid `{}` argument: {:?}", name, bits), @@ -41,7 +37,7 @@ fn numeric_intrinsic<'tcx, Tag>( sym::bitreverse => (bits << extra).reverse_bits(), _ => bug!("not a numeric intrinsic: {}", name), }; - Ok(Scalar::from_uint(bits_out, size)) + Scalar::from_uint(bits_out, size) } /// The logic for all nullary intrinsics is implemented here. These intrinsics don't get evaluated @@ -115,7 +111,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { &mut self, instance: ty::Instance<'tcx>, args: &[OpTy<'tcx, M::PointerTag>], - ret: Option<(PlaceTy<'tcx, M::PointerTag>, mir::BasicBlock)>, + ret: Option<(&PlaceTy<'tcx, M::PointerTag>, mir::BasicBlock)>, ) -> InterpResult<'tcx, bool> { let substs = instance.substs; let intrinsic_name = self.tcx.item_name(instance.def_id()); @@ -143,9 +139,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { sym::min_align_of_val | sym::size_of_val => { // Avoid `deref_operand` -- this is not a deref, the ptr does not have to be // dereferencable! - let place = self.ref_to_mplace(self.read_immediate(args[0])?)?; + let place = self.ref_to_mplace(&self.read_immediate(&args[0])?)?; let (size, align) = self - .size_and_align_of_mplace(place)? + .size_and_align_of_mplace(&place)? .ok_or_else(|| err_unsup_format!("`extern type` does not have known layout"))?; let result = match intrinsic_name { @@ -177,7 +173,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { self.tcx.const_eval_global_id(self.param_env, gid, Some(self.tcx.span))?; let const_ = ty::Const { val: ty::ConstKind::Value(val), ty }; let val = self.const_to_op(&const_, None)?; - self.copy_op(val, dest)?; + self.copy_op(&val, dest)?; } sym::ctpop @@ -189,7 +185,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { | sym::bitreverse => { let ty = substs.type_at(0); let layout_of = self.layout_of(ty)?; - let val = self.read_scalar(args[0])?.check_init()?; + let val = self.read_scalar(&args[0])?.check_init()?; let bits = self.force_bits(val, layout_of.size)?; let kind = match layout_of.abi { Abi::Scalar(ref scalar) => scalar.value, @@ -208,26 +204,29 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { if nonzero && bits == 0 { throw_ub_format!("`{}_nonzero` called on 0", intrinsic_name); } - let out_val = numeric_intrinsic(intrinsic_name, bits, kind)?; + let out_val = numeric_intrinsic(intrinsic_name, bits, kind); self.write_scalar(out_val, dest)?; } sym::add_with_overflow | sym::sub_with_overflow | sym::mul_with_overflow => { - let lhs = self.read_immediate(args[0])?; - let rhs = self.read_immediate(args[1])?; + let lhs = self.read_immediate(&args[0])?; + let rhs = self.read_immediate(&args[1])?; let bin_op = match intrinsic_name { sym::add_with_overflow => BinOp::Add, sym::sub_with_overflow => BinOp::Sub, sym::mul_with_overflow => BinOp::Mul, _ => bug!("Already checked for int ops"), }; - self.binop_with_overflow(bin_op, lhs, rhs, dest)?; + self.binop_with_overflow(bin_op, &lhs, &rhs, dest)?; } sym::saturating_add | sym::saturating_sub => { - let l = self.read_immediate(args[0])?; - let r = self.read_immediate(args[1])?; + 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() { @@ -269,8 +268,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { self.write_scalar(val, dest)?; } sym::discriminant_value => { - let place = self.deref_operand(args[0])?; - let discr_val = self.read_discriminant(place.into())?.0; + let place = self.deref_operand(&args[0])?; + let discr_val = self.read_discriminant(&place.into())?.0; self.write_scalar(discr_val, dest)?; } sym::unchecked_shl @@ -280,8 +279,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { | sym::unchecked_mul | sym::unchecked_div | sym::unchecked_rem => { - let l = self.read_immediate(args[0])?; - let r = self.read_immediate(args[1])?; + let l = self.read_immediate(&args[0])?; + let r = self.read_immediate(&args[1])?; let bin_op = match intrinsic_name { sym::unchecked_shl => BinOp::Shl, sym::unchecked_shr => BinOp::Shr, @@ -292,7 +291,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { sym::unchecked_rem => BinOp::Rem, _ => bug!("Already checked for int ops"), }; - let (val, overflowed, _ty) = self.overflowing_binary_op(bin_op, l, r)?; + let (val, overflowed, _ty) = self.overflowing_binary_op(bin_op, &l, &r)?; if overflowed { let layout = self.layout_of(substs.type_at(0))?; let r_val = self.force_bits(r.to_scalar()?, layout.size)?; @@ -308,9 +307,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // rotate_left: (X << (S % BW)) | (X >> ((BW - S) % BW)) // rotate_right: (X << ((BW - S) % BW)) | (X >> (S % BW)) let layout = self.layout_of(substs.type_at(0))?; - let val = self.read_scalar(args[0])?.check_init()?; + let val = self.read_scalar(&args[0])?.check_init()?; let val_bits = self.force_bits(val, layout.size)?; - let raw_shift = self.read_scalar(args[1])?.check_init()?; + let raw_shift = self.read_scalar(&args[1])?.check_init()?; let raw_shift_bits = self.force_bits(raw_shift, layout.size)?; let width_bits = u128::from(layout.size.bits()); let shift_bits = raw_shift_bits % width_bits; @@ -324,40 +323,20 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let result = Scalar::from_uint(truncated_bits, layout.size); self.write_scalar(result, dest)?; } - sym::copy | sym::copy_nonoverlapping => { - let elem_ty = instance.substs.type_at(0); - let elem_layout = self.layout_of(elem_ty)?; - let count = self.read_scalar(args[2])?.to_machine_usize(self)?; - let elem_align = elem_layout.align.abi; - - let size = elem_layout.size.checked_mul(count, self).ok_or_else(|| { - err_ub_format!("overflow computing total size of `{}`", intrinsic_name) - })?; - let src = self.read_scalar(args[0])?.check_init()?; - let src = self.memory.check_ptr_access(src, size, elem_align)?; - let dest = self.read_scalar(args[1])?.check_init()?; - let dest = self.memory.check_ptr_access(dest, size, elem_align)?; - - if let (Some(src), Some(dest)) = (src, dest) { - self.memory.copy( - src, - dest, - size, - intrinsic_name == sym::copy_nonoverlapping, - )?; - } + sym::copy => { + self.copy(&args[0], &args[1], &args[2], /*nonoverlapping*/ false)?; } sym::offset => { - let ptr = self.read_scalar(args[0])?.check_init()?; - let offset_count = self.read_scalar(args[1])?.to_machine_isize(self)?; + let ptr = self.read_scalar(&args[0])?.check_init()?; + let offset_count = self.read_scalar(&args[1])?.to_machine_isize(self)?; let pointee_ty = substs.type_at(0); let offset_ptr = self.ptr_offset_inbounds(ptr, pointee_ty, offset_count)?; self.write_scalar(offset_ptr, dest)?; } sym::arith_offset => { - let ptr = self.read_scalar(args[0])?.check_init()?; - let offset_count = self.read_scalar(args[1])?.to_machine_isize(self)?; + let ptr = self.read_scalar(&args[0])?.check_init()?; + let offset_count = self.read_scalar(&args[1])?.to_machine_isize(self)?; let pointee_ty = substs.type_at(0); let pointee_size = i64::try_from(self.layout_of(pointee_ty)?.size.bytes()).unwrap(); @@ -366,8 +345,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { self.write_scalar(offset_ptr, dest)?; } sym::ptr_offset_from => { - let a = self.read_immediate(args[0])?.to_scalar()?; - let b = self.read_immediate(args[1])?.to_scalar()?; + let a = self.read_immediate(&args[0])?.to_scalar()?; + let b = self.read_immediate(&args[1])?.to_scalar()?; // Special case: if both scalars are *equal integers* // and not NULL, we pretend there is an allocation of size 0 right there, @@ -406,16 +385,16 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { 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)?; + 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); - self.exact_div(val, size, dest)?; + self.exact_div(&val, &size, dest)?; } } sym::transmute => { - self.copy_op_transmute(args[0], dest)?; + self.copy_op_transmute(&args[0], dest)?; } sym::assert_inhabited => { let ty = instance.substs.type_at(0); @@ -434,9 +413,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } } sym::simd_insert => { - let index = u64::from(self.read_scalar(args[1])?.to_u32()?); - let elem = args[2]; - let input = args[0]; + let index = u64::from(self.read_scalar(&args[1])?.to_u32()?); + let elem = &args[2]; + let input = &args[0]; let (len, e_ty) = input.layout.ty.simd_size_and_type(*self.tcx); assert!( index < len, @@ -458,12 +437,12 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { for i in 0..len { let place = self.place_index(dest, i)?; - let value = if i == index { elem } else { self.operand_index(input, i)? }; - self.copy_op(value, place)?; + let value = if i == index { *elem } else { self.operand_index(input, i)? }; + self.copy_op(&value, &place)?; } } sym::simd_extract => { - let index = u64::from(self.read_scalar(args[1])?.to_u32()?); + let index = u64::from(self.read_scalar(&args[1])?.to_u32()?); let (len, e_ty) = args[0].layout.ty.simd_size_and_type(*self.tcx); assert!( index < len, @@ -477,14 +456,14 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { "Return type `{}` must match vector element type `{}`", dest.layout.ty, e_ty ); - self.copy_op(self.operand_index(args[0], index)?, dest)?; + self.copy_op(&self.operand_index(&args[0], index)?, dest)?; } sym::likely | sym::unlikely => { // These just return their argument - self.copy_op(args[0], dest)?; + self.copy_op(&args[0], dest)?; } sym::assume => { - let cond = self.read_scalar(args[0])?.check_init()?.to_bool()?; + let cond = self.read_scalar(&args[0])?.check_init()?.to_bool()?; if !cond { throw_ub_format!("`assume` intrinsic called with `false`"); } @@ -492,21 +471,21 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { _ => return Ok(false), } - trace!("{:?}", self.dump_place(*dest)); + trace!("{:?}", self.dump_place(**dest)); self.go_to_block(ret); Ok(true) } pub fn exact_div( &mut self, - a: ImmTy<'tcx, M::PointerTag>, - b: ImmTy<'tcx, M::PointerTag>, - dest: PlaceTy<'tcx, M::PointerTag>, + a: &ImmTy<'tcx, M::PointerTag>, + b: &ImmTy<'tcx, M::PointerTag>, + dest: &PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { // Performs an exact division, resulting in undefined behavior where // `x % y != 0` or `y == 0` or `x == T::MIN && y == -1`. // First, check x % y != 0 (or if that computation overflows). - let (res, overflow, _ty) = self.overflowing_binary_op(BinOp::Rem, a, b)?; + let (res, overflow, _ty) = self.overflowing_binary_op(BinOp::Rem, &a, &b)?; if overflow || res.assert_bits(a.layout.size) != 0 { // Then, check if `b` is -1, which is the "MIN / -1" case. let minus1 = Scalar::from_int(-1, dest.layout.size); @@ -518,7 +497,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } } // `Rem` says this is all right, so we can let `Div` do its job. - self.binop_ignore_overflow(BinOp::Div, a, b, dest) + self.binop_ignore_overflow(BinOp::Div, &a, &b, dest) } /// Offsets a pointer by some multiple of its type, returning an error if the pointer leaves its diff --git a/compiler/rustc_mir/src/interpret/intrinsics/caller_location.rs b/compiler/rustc_mir/src/interpret/intrinsics/caller_location.rs index 5c917f00d1..4dfdc08b87 100644 --- a/compiler/rustc_mir/src/interpret/intrinsics/caller_location.rs +++ b/compiler/rustc_mir/src/interpret/intrinsics/caller_location.rs @@ -92,11 +92,11 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let location = self.allocate(loc_layout, MemoryKind::CallerLocation); // Initialize fields. - self.write_immediate(file.to_ref(), self.mplace_field(location, 0).unwrap().into()) + self.write_immediate(file.to_ref(), &self.mplace_field(&location, 0).unwrap().into()) .expect("writing to memory we just allocated cannot fail"); - self.write_scalar(line, self.mplace_field(location, 1).unwrap().into()) + self.write_scalar(line, &self.mplace_field(&location, 1).unwrap().into()) .expect("writing to memory we just allocated cannot fail"); - self.write_scalar(col, self.mplace_field(location, 2).unwrap().into()) + self.write_scalar(col, &self.mplace_field(&location, 2).unwrap().into()) .expect("writing to memory we just allocated cannot fail"); location diff --git a/compiler/rustc_mir/src/interpret/machine.rs b/compiler/rustc_mir/src/interpret/machine.rs index 53ac62d435..65869f9563 100644 --- a/compiler/rustc_mir/src/interpret/machine.rs +++ b/compiler/rustc_mir/src/interpret/machine.rs @@ -157,7 +157,7 @@ pub trait Machine<'mir, 'tcx>: Sized { instance: ty::Instance<'tcx>, abi: Abi, args: &[OpTy<'tcx, Self::PointerTag>], - ret: Option<(PlaceTy<'tcx, Self::PointerTag>, mir::BasicBlock)>, + ret: Option<(&PlaceTy<'tcx, Self::PointerTag>, mir::BasicBlock)>, unwind: Option, ) -> InterpResult<'tcx, Option<&'mir mir::Body<'tcx>>>; @@ -168,7 +168,7 @@ pub trait Machine<'mir, 'tcx>: Sized { fn_val: Self::ExtraFnVal, abi: Abi, args: &[OpTy<'tcx, Self::PointerTag>], - ret: Option<(PlaceTy<'tcx, Self::PointerTag>, mir::BasicBlock)>, + ret: Option<(&PlaceTy<'tcx, Self::PointerTag>, mir::BasicBlock)>, unwind: Option, ) -> InterpResult<'tcx>; @@ -178,7 +178,7 @@ pub trait Machine<'mir, 'tcx>: Sized { ecx: &mut InterpCx<'mir, 'tcx, Self>, instance: ty::Instance<'tcx>, args: &[OpTy<'tcx, Self::PointerTag>], - ret: Option<(PlaceTy<'tcx, Self::PointerTag>, mir::BasicBlock)>, + ret: Option<(&PlaceTy<'tcx, Self::PointerTag>, mir::BasicBlock)>, unwind: Option, ) -> InterpResult<'tcx>; @@ -200,14 +200,14 @@ pub trait Machine<'mir, 'tcx>: Sized { fn binary_ptr_op( ecx: &InterpCx<'mir, 'tcx, Self>, bin_op: mir::BinOp, - left: ImmTy<'tcx, Self::PointerTag>, - right: ImmTy<'tcx, Self::PointerTag>, + left: &ImmTy<'tcx, Self::PointerTag>, + right: &ImmTy<'tcx, Self::PointerTag>, ) -> InterpResult<'tcx, (Scalar, bool, Ty<'tcx>)>; /// Heap allocations via the `box` keyword. fn box_alloc( ecx: &mut InterpCx<'mir, 'tcx, Self>, - dest: PlaceTy<'tcx, Self::PointerTag>, + dest: &PlaceTy<'tcx, Self::PointerTag>, ) -> InterpResult<'tcx>; /// Called to read the specified `local` from the `frame`. @@ -327,7 +327,7 @@ pub trait Machine<'mir, 'tcx>: Sized { fn retag( _ecx: &mut InterpCx<'mir, 'tcx, Self>, _kind: mir::RetagKind, - _place: PlaceTy<'tcx, Self::PointerTag>, + _place: &PlaceTy<'tcx, Self::PointerTag>, ) -> InterpResult<'tcx> { Ok(()) } @@ -420,7 +420,7 @@ pub macro compile_time_machine(<$mir: lifetime, $tcx: lifetime>) { fn_val: !, _abi: Abi, _args: &[OpTy<$tcx>], - _ret: Option<(PlaceTy<$tcx>, mir::BasicBlock)>, + _ret: Option<(&PlaceTy<$tcx>, mir::BasicBlock)>, _unwind: Option, ) -> InterpResult<$tcx> { match fn_val {} diff --git a/compiler/rustc_mir/src/interpret/memory.rs b/compiler/rustc_mir/src/interpret/memory.rs index f3e373813c..fe5ebf0b6f 100644 --- a/compiler/rustc_mir/src/interpret/memory.rs +++ b/compiler/rustc_mir/src/interpret/memory.rs @@ -854,7 +854,11 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { Some(ptr) => ptr, None => { // zero-sized access - src.next().expect_none("iterator said it was empty but returned an element"); + assert_matches!( + src.next(), + None, + "iterator said it was empty but returned an element" + ); return Ok(()); } }; @@ -880,7 +884,11 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { Some(ptr) => ptr, None => { // zero-sized access - src.next().expect_none("iterator said it was empty but returned an element"); + assert_matches!( + src.next(), + None, + "iterator said it was empty but returned an element" + ); return Ok(()); } }; @@ -894,7 +902,7 @@ impl<'mir, 'tcx, M: Machine<'mir, 'tcx>> Memory<'mir, 'tcx, M> { let offset_ptr = ptr.offset(Size::from_bytes(idx) * 2, &tcx)?; // `Size` multiplication allocation.write_scalar(&tcx, offset_ptr, val.into(), Size::from_bytes(2))?; } - src.next().expect_none("iterator was longer than it said it would be"); + assert_matches!(src.next(), None, "iterator was longer than it said it would be"); Ok(()) } diff --git a/compiler/rustc_mir/src/interpret/operand.rs b/compiler/rustc_mir/src/interpret/operand.rs index 88236458a2..28933493a2 100644 --- a/compiler/rustc_mir/src/interpret/operand.rs +++ b/compiler/rustc_mir/src/interpret/operand.rs @@ -32,6 +32,9 @@ pub enum Immediate { ScalarPair(ScalarMaybeUninit, ScalarMaybeUninit), } +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +rustc_data_structures::static_assert_size!(Immediate, 56); + impl From> for Immediate { #[inline(always)] fn from(val: ScalarMaybeUninit) -> Self { @@ -92,6 +95,9 @@ pub struct ImmTy<'tcx, Tag = ()> { pub layout: TyAndLayout<'tcx>, } +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +rustc_data_structures::static_assert_size!(ImmTy<'_>, 72); + impl std::fmt::Display for ImmTy<'tcx, Tag> { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { /// Helper function for printing a scalar to a FmtPrinter @@ -106,7 +112,7 @@ impl std::fmt::Display for ImmTy<'tcx, Tag> { } ScalarMaybeUninit::Uninit => cx.typed_value( |mut this| { - this.write_str("{uninit ")?; + this.write_str("uninit ")?; Ok(this) }, |this| this.print_type(ty), @@ -156,6 +162,9 @@ pub struct OpTy<'tcx, Tag = ()> { pub layout: TyAndLayout<'tcx>, } +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +rustc_data_structures::static_assert_size!(OpTy<'_, ()>, 80); + impl<'tcx, Tag> std::ops::Deref for OpTy<'tcx, Tag> { type Target = Operand; #[inline(always)] @@ -171,6 +180,13 @@ impl<'tcx, Tag: Copy> From> for OpTy<'tcx, Tag> { } } +impl<'tcx, Tag: Copy> From<&'_ MPlaceTy<'tcx, Tag>> for OpTy<'tcx, Tag> { + #[inline(always)] + fn from(mplace: &MPlaceTy<'tcx, Tag>) -> Self { + 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 { @@ -222,7 +238,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { #[inline] pub fn force_op_ptr( &self, - op: OpTy<'tcx, M::PointerTag>, + op: &OpTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { match op.try_as_mplace(self) { Ok(mplace) => Ok(self.force_mplace_ptr(mplace)?.into()), @@ -234,7 +250,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { /// Returns `None` if the layout does not permit loading this as a value. fn try_read_immediate_from_mplace( &self, - mplace: MPlaceTy<'tcx, M::PointerTag>, + mplace: &MPlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, Option>> { if mplace.layout.is_unsized() { // Don't touch unsized @@ -295,14 +311,14 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { /// in a `Immediate`, not on which data is stored there currently. pub(crate) fn try_read_immediate( &self, - src: OpTy<'tcx, M::PointerTag>, + src: &OpTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, Result, MPlaceTy<'tcx, M::PointerTag>>> { Ok(match src.try_as_mplace(self) { - Ok(mplace) => { + Ok(ref mplace) => { if let Some(val) = self.try_read_immediate_from_mplace(mplace)? { Ok(val) } else { - Err(mplace) + Err(*mplace) } } Err(val) => Ok(val), @@ -313,7 +329,7 @@ impl<'mir, 'tcx: 'mir, 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) @@ -325,13 +341,13 @@ impl<'mir, 'tcx: 'mir, 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, ScalarMaybeUninit> { Ok(self.read_immediate(op)?.to_scalar_or_uninit()) } // 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))?; let str = std::str::from_utf8(bytes).map_err(|err| err_ub!(InvalidStr(err)))?; @@ -341,11 +357,11 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { /// Projection functions pub fn operand_field( &self, - op: OpTy<'tcx, M::PointerTag>, + op: &OpTy<'tcx, M::PointerTag>, field: usize, ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { let base = match op.try_as_mplace(self) { - Ok(mplace) => { + Ok(ref mplace) => { // We can reuse the mplace field computation logic for indirect operands. let field = self.mplace_field(mplace, field)?; return Ok(field.into()); @@ -379,7 +395,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { pub fn operand_index( &self, - op: OpTy<'tcx, M::PointerTag>, + op: &OpTy<'tcx, M::PointerTag>, index: u64, ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { if let Ok(index) = usize::try_from(index) { @@ -388,28 +404,28 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { } else { // Indexing into a big array. This must be an mplace. let mplace = op.assert_mem_place(self); - Ok(self.mplace_index(mplace, index)?.into()) + Ok(self.mplace_index(&mplace, index)?.into()) } } pub fn operand_downcast( &self, - op: OpTy<'tcx, M::PointerTag>, + op: &OpTy<'tcx, M::PointerTag>, variant: VariantIdx, ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { // Downcasts only change the layout Ok(match op.try_as_mplace(self) { - Ok(mplace) => self.mplace_downcast(mplace, variant)?.into(), + Ok(ref mplace) => self.mplace_downcast(mplace, variant)?.into(), Err(..) => { let layout = op.layout.for_variant(self, variant); - OpTy { layout, ..op } + OpTy { layout, ..*op } } }) } pub fn operand_projection( &self, - base: OpTy<'tcx, M::PointerTag>, + base: &OpTy<'tcx, M::PointerTag>, proj_elem: mir::PlaceElem<'tcx>, ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { use rustc_middle::mir::ProjectionElem::*; @@ -421,7 +437,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // 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(self); - self.mplace_projection(mplace, proj_elem)?.into() + self.mplace_projection(&mplace, proj_elem)?.into() } }) } @@ -453,9 +469,9 @@ impl<'mir, 'tcx: 'mir, 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 { + let op = match **place { Place::Ptr(mplace) => Operand::Indirect(mplace), Place::Local { frame, local } => { *self.access_local(&self.stack()[frame], local, None)? @@ -480,7 +496,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let op = place .projection .iter() - .try_fold(base_op, |op, elem| self.operand_projection(op, elem))?; + .try_fold(base_op, |op, elem| self.operand_projection(&op, elem))?; trace!("eval_place_to_op: got {:?}", *op); // Sanity-check the type we ended up with. @@ -498,6 +514,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { /// Evaluate the operand, returning a place where you can then find the data. /// If you already know the layout, you can save two table lookups /// by passing it in here. + #[inline] pub fn eval_operand( &self, mir_op: &mir::Operand<'tcx>, @@ -515,7 +532,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // * During ConstProp, with `TooGeneric` or since the `requried_consts` were not all // checked yet. // * During CTFE, since promoteds in `const`/`static` initializer bodies can fail. - self.const_to_op(val, layout)? + + self.mir_const_to_op(&val, layout)? } }; trace!("{:?}: {:?}", mir_op, *op); @@ -539,28 +557,45 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { val: &ty::Const<'tcx>, layout: Option>, ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { - let tag_scalar = |scalar| -> InterpResult<'tcx, _> { - Ok(match scalar { - Scalar::Ptr(ptr) => Scalar::Ptr(self.global_base_pointer(ptr)?), - Scalar::Int(int) => Scalar::Int(int), - }) - }; - // Early-return cases. - let val_val = match val.val { + match val.val { ty::ConstKind::Param(_) | ty::ConstKind::Bound(..) => throw_inval!(TooGeneric), ty::ConstKind::Error(_) => throw_inval!(AlreadyReported(ErrorReported)), ty::ConstKind::Unevaluated(def, substs, promoted) => { let instance = self.resolve(def, substs)?; - return Ok(self.eval_to_allocation(GlobalId { instance, promoted })?.into()); + Ok(self.eval_to_allocation(GlobalId { instance, promoted })?.into()) } ty::ConstKind::Infer(..) | ty::ConstKind::Placeholder(..) => { span_bug!(self.cur_span(), "const_to_op: Unexpected ConstKind {:?}", val) } - ty::ConstKind::Value(val_val) => val_val, - }; + ty::ConstKind::Value(val_val) => self.const_val_to_op(val_val, val.ty, layout), + } + } + + crate fn mir_const_to_op( + &self, + val: &mir::ConstantKind<'tcx>, + layout: Option>, + ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { + match val { + mir::ConstantKind::Ty(ct) => self.const_to_op(ct, layout), + mir::ConstantKind::Val(val, ty) => self.const_val_to_op(*val, ty, None), + } + } + + crate fn const_val_to_op( + &self, + val_val: ConstValue<'tcx>, + ty: Ty<'tcx>, + layout: Option>, + ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { // Other cases need layout. - let layout = - from_known_layout(self.tcx, self.param_env, layout, || self.layout_of(val.ty))?; + let tag_scalar = |scalar| -> InterpResult<'tcx, _> { + Ok(match scalar { + Scalar::Ptr(ptr) => Scalar::Ptr(self.global_base_pointer(ptr)?), + Scalar::Int(int) => Scalar::Int(int), + }) + }; + let layout = from_known_layout(self.tcx, self.param_env, layout, || self.layout_of(ty))?; let op = match val_val { ConstValue::ByRef { alloc, offset } => { let id = self.tcx.create_memory_alloc(alloc); @@ -590,7 +625,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { /// Read discriminant, return the runtime value as well as the variant index. pub fn read_discriminant( &self, - op: OpTy<'tcx, M::PointerTag>, + op: &OpTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, (Scalar, VariantIdx)> { trace!("read_discriminant_value {:#?}", op.layout); // Get type and layout of the discriminant. @@ -636,7 +671,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let tag_layout = self.layout_of(tag_scalar_layout.value.to_int_ty(*self.tcx))?; // Read tag and sanity-check `tag_layout`. - let tag_val = self.read_immediate(self.operand_field(op, tag_field)?)?; + let tag_val = self.read_immediate(&self.operand_field(op, tag_field)?)?; assert_eq!(tag_layout.size, tag_val.layout.size); assert_eq!(tag_layout.abi.is_signed(), tag_val.layout.abi.is_signed()); let tag_val = tag_val.to_scalar()?; @@ -690,7 +725,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let tag_val = ImmTy::from_uint(tag_bits, tag_layout); let niche_start_val = ImmTy::from_uint(niche_start, tag_layout); let variant_index_relative_val = - self.binary_op(mir::BinOp::Sub, tag_val, niche_start_val)?; + self.binary_op(mir::BinOp::Sub, &tag_val, &niche_start_val)?; let variant_index_relative = variant_index_relative_val .to_scalar()? .assert_bits(tag_val.layout.size); diff --git a/compiler/rustc_mir/src/interpret/operator.rs b/compiler/rustc_mir/src/interpret/operator.rs index f508165501..3737f8781c 100644 --- a/compiler/rustc_mir/src/interpret/operator.rs +++ b/compiler/rustc_mir/src/interpret/operator.rs @@ -14,11 +14,11 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { pub fn binop_with_overflow( &mut self, op: mir::BinOp, - left: ImmTy<'tcx, M::PointerTag>, - right: ImmTy<'tcx, M::PointerTag>, - dest: PlaceTy<'tcx, M::PointerTag>, + left: &ImmTy<'tcx, M::PointerTag>, + right: &ImmTy<'tcx, M::PointerTag>, + dest: &PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { - let (val, overflowed, ty) = self.overflowing_binary_op(op, left, right)?; + let (val, overflowed, ty) = self.overflowing_binary_op(op, &left, &right)?; debug_assert_eq!( self.tcx.intern_tup(&[ty, self.tcx.types.bool]), dest.layout.ty, @@ -34,9 +34,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { pub fn binop_ignore_overflow( &mut self, op: mir::BinOp, - left: ImmTy<'tcx, M::PointerTag>, - right: ImmTy<'tcx, M::PointerTag>, - dest: PlaceTy<'tcx, M::PointerTag>, + left: &ImmTy<'tcx, M::PointerTag>, + right: &ImmTy<'tcx, M::PointerTag>, + dest: &PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { let (val, _overflowed, ty) = self.overflowing_binary_op(op, left, right)?; assert_eq!(ty, dest.layout.ty, "type mismatch for result of {:?}", op); @@ -269,8 +269,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { pub fn overflowing_binary_op( &self, bin_op: mir::BinOp, - left: ImmTy<'tcx, M::PointerTag>, - right: ImmTy<'tcx, M::PointerTag>, + left: &ImmTy<'tcx, M::PointerTag>, + right: &ImmTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, (Scalar, bool, Ty<'tcx>)> { trace!( "Running binary op {:?}: {:?} ({:?}), {:?} ({:?})", @@ -347,8 +347,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { pub fn binary_op( &self, bin_op: mir::BinOp, - left: ImmTy<'tcx, M::PointerTag>, - right: ImmTy<'tcx, M::PointerTag>, + left: &ImmTy<'tcx, M::PointerTag>, + right: &ImmTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, ImmTy<'tcx, M::PointerTag>> { let (val, _overflow, ty) = self.overflowing_binary_op(bin_op, left, right)?; Ok(ImmTy::from_scalar(val, self.layout_of(ty)?)) @@ -359,7 +359,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { pub fn overflowing_unary_op( &self, un_op: mir::UnOp, - val: ImmTy<'tcx, M::PointerTag>, + val: &ImmTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, (Scalar, bool, Ty<'tcx>)> { use rustc_middle::mir::UnOp::*; @@ -409,7 +409,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { pub fn unary_op( &self, un_op: mir::UnOp, - val: ImmTy<'tcx, M::PointerTag>, + val: &ImmTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, ImmTy<'tcx, M::PointerTag>> { let (val, _overflow, ty) = self.overflowing_unary_op(un_op, val)?; Ok(ImmTy::from_scalar(val, self.layout_of(ty)?)) diff --git a/compiler/rustc_mir/src/interpret/place.rs b/compiler/rustc_mir/src/interpret/place.rs index efde7fe694..699b531f50 100644 --- a/compiler/rustc_mir/src/interpret/place.rs +++ b/compiler/rustc_mir/src/interpret/place.rs @@ -33,6 +33,9 @@ pub enum MemPlaceMeta { Poison, } +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +rustc_data_structures::static_assert_size!(MemPlaceMeta, 24); + impl MemPlaceMeta { pub fn unwrap_meta(self) -> Scalar { match self { @@ -71,6 +74,9 @@ pub struct MemPlace { pub meta: MemPlaceMeta, } +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +rustc_data_structures::static_assert_size!(MemPlace, 56); + #[derive(Copy, Clone, Debug, Hash, PartialEq, Eq, HashStable)] pub enum Place { /// A place referring to a value allocated in the `Memory` system. @@ -81,12 +87,18 @@ pub enum Place { Local { frame: usize, local: mir::Local }, } +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +rustc_data_structures::static_assert_size!(Place, 64); + #[derive(Copy, Clone, Debug)] pub struct PlaceTy<'tcx, Tag = ()> { place: Place, // Keep this private; it helps enforce invariants. pub layout: TyAndLayout<'tcx>, } +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +rustc_data_structures::static_assert_size!(PlaceTy<'_>, 80); + impl<'tcx, Tag> std::ops::Deref for PlaceTy<'tcx, Tag> { type Target = Place; #[inline(always)] @@ -102,6 +114,9 @@ pub struct MPlaceTy<'tcx, Tag = ()> { pub layout: TyAndLayout<'tcx>, } +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +rustc_data_structures::static_assert_size!(MPlaceTy<'_>, 72); + impl<'tcx, Tag> std::ops::Deref for MPlaceTy<'tcx, Tag> { type Target = MemPlace; #[inline(always)] @@ -168,7 +183,7 @@ impl MemPlace { } } -impl<'tcx, Tag> MPlaceTy<'tcx, Tag> { +impl<'tcx, Tag: Copy> MPlaceTy<'tcx, Tag> { /// Produces a MemPlace that works for ZST but nothing else #[inline] pub fn dangling(layout: TyAndLayout<'tcx>, cx: &impl HasDataLayout) -> Self { @@ -180,13 +195,13 @@ impl<'tcx, Tag> MPlaceTy<'tcx, Tag> { /// Replace ptr tag, maintain vtable tag (if any) #[inline] - pub fn replace_tag(self, new_tag: Tag) -> Self { + pub fn replace_tag(&self, new_tag: Tag) -> Self { MPlaceTy { mplace: self.mplace.replace_tag(new_tag), layout: self.layout } } #[inline] pub fn offset( - self, + &self, offset: Size, meta: MemPlaceMeta, layout: TyAndLayout<'tcx>, @@ -201,7 +216,7 @@ impl<'tcx, Tag> MPlaceTy<'tcx, Tag> { } #[inline] - pub(super) fn len(self, cx: &impl HasDataLayout) -> InterpResult<'tcx, u64> { + pub(super) fn len(&self, cx: &impl HasDataLayout) -> InterpResult<'tcx, u64> { if self.layout.is_unsized() { // We need to consult `meta` metadata match self.layout.ty.kind() { @@ -219,7 +234,7 @@ impl<'tcx, Tag> MPlaceTy<'tcx, Tag> { } #[inline] - pub(super) fn vtable(self) -> Scalar { + pub(super) fn vtable(&self) -> Scalar { match self.layout.ty.kind() { ty::Dynamic(..) => self.mplace.meta.unwrap_meta(), _ => bug!("vtable not supported on type {:?}", self.layout.ty), @@ -233,10 +248,10 @@ impl<'tcx, Tag: Debug + Copy> OpTy<'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, + &self, cx: &impl HasDataLayout, ) -> Result, ImmTy<'tcx, Tag>> { - match *self { + match **self { Operand::Indirect(mplace) => Ok(MPlaceTy { mplace, layout: self.layout }), Operand::Immediate(_) if self.layout.is_zst() => { Ok(MPlaceTy::dangling(self.layout, cx)) @@ -248,7 +263,7 @@ impl<'tcx, Tag: Debug + Copy> OpTy<'tcx, Tag> { #[inline(always)] /// 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> { + pub fn assert_mem_place(&self, cx: &impl HasDataLayout) -> MPlaceTy<'tcx, Tag> { self.try_as_mplace(cx).unwrap() } } @@ -288,12 +303,12 @@ where /// Generally prefer `deref_operand`. pub fn ref_to_mplace( &self, - val: ImmTy<'tcx, M::PointerTag>, + 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 layout = self.layout_of(pointee_type)?; - let (ptr, meta) = match *val { + let (ptr, meta) = match **val { Immediate::Scalar(ptr) => (ptr.check_init()?, MemPlaceMeta::None), Immediate::ScalarPair(ptr, meta) => { (ptr.check_init()?, MemPlaceMeta::Meta(meta.check_init()?)) @@ -316,11 +331,11 @@ where /// will always be a MemPlace. Lives in `place.rs` because it creates a place. pub fn deref_operand( &self, - src: OpTy<'tcx, M::PointerTag>, + src: &OpTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { let val = self.read_immediate(src)?; trace!("deref to {} on {:?}", val.layout.ty, *val); - let place = self.ref_to_mplace(val)?; + let place = self.ref_to_mplace(&val)?; self.mplace_access_checked(place, None) } @@ -333,7 +348,7 @@ where #[inline] pub(super) fn check_mplace_access( &self, - place: MPlaceTy<'tcx, M::PointerTag>, + place: &MPlaceTy<'tcx, M::PointerTag>, size: Option, ) -> InterpResult<'tcx, Option>> { let size = size.unwrap_or_else(|| { @@ -355,13 +370,13 @@ where force_align: Option, ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { let (size, align) = self - .size_and_align_of_mplace(place)? + .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?"); // Check (stricter) dynamic alignment, unless forced otherwise. place.mplace.align = force_align.unwrap_or(align); // When dereferencing a pointer, it must be non-NULL, aligned, and live. - if let Some(ptr) = self.check_mplace_access(place, Some(size))? { + if let Some(ptr) = self.check_mplace_access(&place, Some(size))? { place.mplace.ptr = ptr.into(); } Ok(place) @@ -386,7 +401,7 @@ where #[inline(always)] pub fn mplace_field( &self, - base: MPlaceTy<'tcx, M::PointerTag>, + base: &MPlaceTy<'tcx, M::PointerTag>, field: usize, ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { let offset = base.layout.fields.offset(field); @@ -397,7 +412,7 @@ where // Re-use parent metadata to determine dynamic field layout. // With custom DSTS, this *will* execute user-defined code, but the same // happens at run-time so that's okay. - let align = match self.size_and_align_of(base.meta, field_layout)? { + let align = match self.size_and_align_of(&base.meta, &field_layout)? { Some((_, align)) => align, None if offset == Size::ZERO => { // An extern type at offset 0, we fall back to its static alignment. @@ -427,7 +442,7 @@ where #[inline(always)] pub fn mplace_index( &self, - base: MPlaceTy<'tcx, M::PointerTag>, + base: &MPlaceTy<'tcx, M::PointerTag>, index: u64, ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { // Not using the layout method because we want to compute on u64 @@ -457,8 +472,8 @@ where // same by repeatedly calling `mplace_array`. pub(super) fn mplace_array_fields( &self, - base: MPlaceTy<'tcx, Tag>, - ) -> InterpResult<'tcx, impl Iterator>> + 'tcx> + base: &'a MPlaceTy<'tcx, Tag>, + ) -> InterpResult<'tcx, impl Iterator>> + 'a> { let len = base.len(self)?; // also asserts that we have a type where this makes sense let stride = match base.layout.fields { @@ -473,7 +488,7 @@ where fn mplace_subslice( &self, - base: MPlaceTy<'tcx, M::PointerTag>, + base: &MPlaceTy<'tcx, M::PointerTag>, from: u64, to: u64, from_end: bool, @@ -516,32 +531,32 @@ where base.offset(from_offset, meta, layout, self) } - pub(super) fn mplace_downcast( + pub(crate) fn mplace_downcast( &self, - base: MPlaceTy<'tcx, M::PointerTag>, + base: &MPlaceTy<'tcx, M::PointerTag>, variant: VariantIdx, ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { // Downcasts only change the layout assert!(!base.meta.has_meta()); - Ok(MPlaceTy { layout: base.layout.for_variant(self, variant), ..base }) + Ok(MPlaceTy { layout: base.layout.for_variant(self, variant), ..*base }) } /// Project into an mplace pub(super) fn mplace_projection( &self, - base: MPlaceTy<'tcx, M::PointerTag>, + base: &MPlaceTy<'tcx, M::PointerTag>, proj_elem: mir::PlaceElem<'tcx>, ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { use rustc_middle::mir::ProjectionElem::*; Ok(match proj_elem { Field(field, _) => self.mplace_field(base, field.index())?, Downcast(_, variant) => self.mplace_downcast(base, variant)?, - Deref => self.deref_operand(base.into())?, + Deref => self.deref_operand(&base.into())?, Index(local) => { let layout = self.layout_of(self.tcx.types.usize)?; let n = self.access_local(self.frame(), local, Some(layout))?; - let n = self.read_scalar(n)?; + let n = self.read_scalar(&n)?; let n = u64::try_from( self.force_bits(n.check_init()?, self.tcx.data_layout.pointer_size)?, ) @@ -577,37 +592,37 @@ where /// into the field of a local `ScalarPair`, we have to first allocate it. pub fn place_field( &mut self, - base: PlaceTy<'tcx, M::PointerTag>, + base: &PlaceTy<'tcx, M::PointerTag>, field: usize, ) -> InterpResult<'tcx, PlaceTy<'tcx, M::PointerTag>> { // FIXME: We could try to be smarter and avoid allocation for fields that span the // entire place. let mplace = self.force_allocation(base)?; - Ok(self.mplace_field(mplace, field)?.into()) + Ok(self.mplace_field(&mplace, field)?.into()) } pub fn place_index( &mut self, - base: PlaceTy<'tcx, M::PointerTag>, + base: &PlaceTy<'tcx, M::PointerTag>, index: u64, ) -> InterpResult<'tcx, PlaceTy<'tcx, M::PointerTag>> { let mplace = self.force_allocation(base)?; - Ok(self.mplace_index(mplace, index)?.into()) + Ok(self.mplace_index(&mplace, index)?.into()) } pub fn place_downcast( &self, - base: PlaceTy<'tcx, M::PointerTag>, + base: &PlaceTy<'tcx, M::PointerTag>, variant: VariantIdx, ) -> 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() + self.mplace_downcast(&MPlaceTy { mplace, layout: base.layout }, variant)?.into() } Place::Local { .. } => { let layout = base.layout.for_variant(self, variant); - PlaceTy { layout, ..base } + PlaceTy { layout, ..*base } } }) } @@ -615,19 +630,19 @@ where /// Projects into a place. pub fn place_projection( &mut self, - base: PlaceTy<'tcx, M::PointerTag>, + base: &PlaceTy<'tcx, M::PointerTag>, &proj_elem: &mir::ProjectionElem>, ) -> InterpResult<'tcx, PlaceTy<'tcx, M::PointerTag>> { use rustc_middle::mir::ProjectionElem::*; Ok(match proj_elem { Field(field, _) => self.place_field(base, field.index())?, Downcast(_, variant) => self.place_downcast(base, variant)?, - Deref => self.deref_operand(self.place_to_op(base)?)?.into(), + Deref => self.deref_operand(&self.place_to_op(base)?)?.into(), // For the other variants, we have to force an allocation. // This matches `operand_projection`. Subslice { .. } | ConstantIndex { .. } | Index(_) => { let mplace = self.force_allocation(base)?; - self.mplace_projection(mplace, proj_elem)?.into() + self.mplace_projection(&mplace, proj_elem)?.into() } }) } @@ -645,7 +660,7 @@ where }; for elem in place.projection.iter() { - place_ty = self.place_projection(place_ty, &elem)? + place_ty = self.place_projection(&place_ty, &elem)? } trace!("{:?}", self.dump_place(place_ty.place)); @@ -666,7 +681,7 @@ where pub fn write_scalar( &mut self, val: impl Into>, - dest: PlaceTy<'tcx, M::PointerTag>, + dest: &PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { self.write_immediate(Immediate::Scalar(val.into()), dest) } @@ -676,13 +691,13 @@ where pub fn write_immediate( &mut self, src: Immediate, - dest: PlaceTy<'tcx, M::PointerTag>, + dest: &PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { self.write_immediate_no_validate(src, dest)?; if M::enforce_validity(self) { // Data got changed, better make sure it matches the type! - self.validate_operand(self.place_to_op(dest)?)?; + self.validate_operand(&self.place_to_op(dest)?)?; } Ok(()) @@ -693,13 +708,13 @@ where pub fn write_immediate_to_mplace( &mut self, src: Immediate, - dest: MPlaceTy<'tcx, M::PointerTag>, + dest: &MPlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { self.write_immediate_to_mplace_no_validate(src, dest)?; if M::enforce_validity(self) { // Data got changed, better make sure it matches the type! - self.validate_operand(dest.into())?; + self.validate_operand(&dest.into())?; } Ok(()) @@ -711,7 +726,7 @@ where fn write_immediate_no_validate( &mut self, src: Immediate, - dest: PlaceTy<'tcx, M::PointerTag>, + dest: &PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { if cfg!(debug_assertions) { // This is a very common path, avoid some checks in release mode @@ -754,7 +769,7 @@ where let dest = MPlaceTy { mplace, layout: dest.layout }; // This is already in memory, write there. - self.write_immediate_to_mplace_no_validate(src, dest) + self.write_immediate_to_mplace_no_validate(src, &dest) } /// Write an immediate to memory. @@ -763,7 +778,7 @@ where fn write_immediate_to_mplace_no_validate( &mut self, value: Immediate, - dest: MPlaceTy<'tcx, M::PointerTag>, + dest: &MPlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { // Note that it is really important that the type here is the right one, and matches the // type things are read at. In case `src_val` is a `ScalarPair`, we don't do any magic here @@ -828,14 +843,14 @@ where #[inline(always)] pub fn copy_op( &mut self, - src: OpTy<'tcx, M::PointerTag>, - dest: PlaceTy<'tcx, M::PointerTag>, + src: &OpTy<'tcx, M::PointerTag>, + dest: &PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { self.copy_op_no_validate(src, dest)?; if M::enforce_validity(self) { // Data got changed, better make sure it matches the type! - self.validate_operand(self.place_to_op(dest)?)?; + self.validate_operand(&self.place_to_op(dest)?)?; } Ok(()) @@ -847,8 +862,8 @@ where /// right type. fn copy_op_no_validate( &mut self, - src: OpTy<'tcx, M::PointerTag>, - dest: PlaceTy<'tcx, M::PointerTag>, + src: &OpTy<'tcx, M::PointerTag>, + dest: &PlaceTy<'tcx, M::PointerTag>, ) -> 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. @@ -888,10 +903,10 @@ where assert_eq!(src.meta, dest.meta, "Can only copy between equally-sized instances"); let src = self - .check_mplace_access(src, Some(size)) + .check_mplace_access(&src, Some(size)) .expect("places should be checked on creation"); let dest = self - .check_mplace_access(dest, Some(size)) + .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), @@ -906,8 +921,8 @@ where /// have the same size. pub fn copy_op_transmute( &mut self, - src: OpTy<'tcx, M::PointerTag>, - dest: PlaceTy<'tcx, M::PointerTag>, + src: &OpTy<'tcx, M::PointerTag>, + dest: &PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { if mir_assign_valid_types(*self.tcx, self.param_env, src.layout, dest.layout) { // Fast path: Just use normal `copy_op` @@ -944,12 +959,12 @@ where let dest = self.force_allocation(dest)?; self.copy_op_no_validate( src, - PlaceTy::from(MPlaceTy { mplace: *dest, layout: src.layout }), + &PlaceTy::from(MPlaceTy { mplace: *dest, layout: src.layout }), )?; if M::enforce_validity(self) { // Data got changed, better make sure it matches the type! - self.validate_operand(dest.into())?; + self.validate_operand(&dest.into())?; } Ok(()) @@ -965,7 +980,7 @@ where /// version. pub fn force_allocation_maybe_sized( &mut self, - place: PlaceTy<'tcx, M::PointerTag>, + place: &PlaceTy<'tcx, M::PointerTag>, meta: MemPlaceMeta, ) -> InterpResult<'tcx, (MPlaceTy<'tcx, M::PointerTag>, Option)> { let (mplace, size) = match place.place { @@ -981,7 +996,7 @@ where self.layout_of_local(&self.stack()[frame], local, None)?; // We also need to support unsized types, and hence cannot use `allocate`. let (size, align) = self - .size_and_align_of(meta, local_layout)? + .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 }; @@ -990,7 +1005,7 @@ where // We don't have to validate as we can assume the local // was already valid for its type. let mplace = MPlaceTy { mplace, layout: local_layout }; - self.write_immediate_to_mplace_no_validate(value, mplace)?; + self.write_immediate_to_mplace_no_validate(value, &mplace)?; } // Now we can call `access_mut` again, asserting it goes well, // and actually overwrite things. @@ -1010,7 +1025,7 @@ where #[inline(always)] pub fn force_allocation( &mut self, - place: PlaceTy<'tcx, M::PointerTag>, + place: &PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, MPlaceTy<'tcx, M::PointerTag>> { Ok(self.force_allocation_maybe_sized(place, MemPlaceMeta::None)?.0) } @@ -1046,7 +1061,7 @@ where pub fn write_discriminant( &mut self, variant_index: VariantIdx, - dest: PlaceTy<'tcx, M::PointerTag>, + 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. @@ -1077,7 +1092,7 @@ where let tag_val = size.truncate(discr_val); let tag_dest = self.place_field(dest, tag_field)?; - self.write_scalar(Scalar::from_uint(tag_val, size), tag_dest)?; + self.write_scalar(Scalar::from_uint(tag_val, size), &tag_dest)?; } Variants::Multiple { tag_encoding: @@ -1103,12 +1118,12 @@ where ImmTy::from_uint(variant_index_relative, tag_layout); let tag_val = self.binary_op( mir::BinOp::Add, - variant_index_relative_val, - niche_start_val, + &variant_index_relative_val, + &niche_start_val, )?; // Write result. let niche_dest = self.place_field(dest, tag_field)?; - self.write_immediate(*tag_val, niche_dest)?; + self.write_immediate(*tag_val, &niche_dest)?; } } } @@ -1131,7 +1146,7 @@ where /// 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>, + 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)?; @@ -1145,7 +1160,7 @@ where assert_eq!(align, layout.align.abi); } - let mplace = MPlaceTy { mplace: MemPlace { meta: MemPlaceMeta::None, ..*mplace }, layout }; + let mplace = MPlaceTy { mplace: MemPlace { meta: MemPlaceMeta::None, ..**mplace }, layout }; Ok((instance, mplace)) } } diff --git a/compiler/rustc_mir/src/interpret/step.rs b/compiler/rustc_mir/src/interpret/step.rs index fbc72ad8ad..6084f67abd 100644 --- a/compiler/rustc_mir/src/interpret/step.rs +++ b/compiler/rustc_mir/src/interpret/step.rs @@ -2,6 +2,7 @@ //! //! The main entry point is the `step` method. +use crate::interpret::OpTy; use rustc_middle::mir; use rustc_middle::mir::interpret::{InterpResult, Scalar}; use rustc_target::abi::LayoutOf; @@ -90,7 +91,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { SetDiscriminant { place, variant_index } => { let dest = self.eval_place(**place)?; - self.write_discriminant(*variant_index, dest)?; + self.write_discriminant(*variant_index, &dest)?; } // Mark locals as alive @@ -110,7 +111,15 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // Stacked Borrows. Retag(kind, place) => { let dest = self.eval_place(**place)?; - M::retag(self, *kind, dest)?; + M::retag(self, *kind, &dest)?; + } + + // Call CopyNonOverlapping + CopyNonOverlapping(box rustc_middle::mir::CopyNonOverlapping { src, dst, count }) => { + let src = self.eval_operand(src, None)?; + let dst = self.eval_operand(dst, None)?; + let count = self.eval_operand(count, None)?; + self.copy(&src, &dst, &count, /* nonoverlapping */ true)?; } // Statements we do not track. @@ -140,6 +149,37 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { Ok(()) } + pub(crate) fn copy( + &mut self, + src: &OpTy<'tcx, >::PointerTag>, + dst: &OpTy<'tcx, >::PointerTag>, + count: &OpTy<'tcx, >::PointerTag>, + nonoverlapping: bool, + ) -> InterpResult<'tcx> { + let count = self.read_scalar(&count)?.to_machine_usize(self)?; + let layout = self.layout_of(src.layout.ty.builtin_deref(true).unwrap().ty)?; + let (size, align) = (layout.size, layout.align.abi); + let size = size.checked_mul(count, self).ok_or_else(|| { + err_ub_format!( + "overflow computing total size of `{}`", + if nonoverlapping { "copy_nonoverlapping" } else { "copy" } + ) + })?; + + // Make sure we check both pointers for an access of the total size and aligment, + // *even if* the total size is 0. + let src = + self.memory.check_ptr_access(self.read_scalar(&src)?.check_init()?, size, align)?; + + let dst = + self.memory.check_ptr_access(self.read_scalar(&dst)?.check_init()?, size, align)?; + + if let (Some(src), Some(dst)) = (src, dst) { + self.memory.copy(src, dst, size, nonoverlapping)?; + } + Ok(()) + } + /// Evaluate an assignment statement. /// /// There is no separate `eval_rvalue` function. Instead, the code for handling each rvalue @@ -156,45 +196,45 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { ThreadLocalRef(did) => { let id = M::thread_local_static_alloc_id(self, did)?; let val = self.global_base_pointer(id.into())?; - self.write_scalar(val, dest)?; + self.write_scalar(val, &dest)?; } Use(ref operand) => { // Avoid recomputing the layout let op = self.eval_operand(operand, Some(dest.layout))?; - self.copy_op(op, dest)?; + self.copy_op(&op, &dest)?; } - BinaryOp(bin_op, ref left, ref right) => { + BinaryOp(bin_op, box (ref left, ref right)) => { let layout = binop_left_homogeneous(bin_op).then_some(dest.layout); - let left = self.read_immediate(self.eval_operand(left, layout)?)?; + 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)?; + let right = self.read_immediate(&self.eval_operand(right, layout)?)?; + self.binop_ignore_overflow(bin_op, &left, &right, &dest)?; } - CheckedBinaryOp(bin_op, ref left, ref right) => { + CheckedBinaryOp(bin_op, box (ref left, ref right)) => { // Due to the extra boolean in the result, we can never reuse the `dest.layout`. - let left = self.read_immediate(self.eval_operand(left, None)?)?; + 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)?; + let right = self.read_immediate(&self.eval_operand(right, layout)?)?; + self.binop_with_overflow(bin_op, &left, &right, &dest)?; } UnaryOp(un_op, ref operand) => { // The operand always has the same type as the result. - let val = self.read_immediate(self.eval_operand(operand, Some(dest.layout))?)?; - let val = self.unary_op(un_op, val)?; + let val = self.read_immediate(&self.eval_operand(operand, Some(dest.layout))?)?; + let val = self.unary_op(un_op, &val)?; assert_eq!(val.layout, dest.layout, "layout mismatch for result of {:?}", un_op); - self.write_immediate(*val, dest)?; + self.write_immediate(*val, &dest)?; } Aggregate(ref kind, ref operands) => { let (dest, active_field_index) = match **kind { mir::AggregateKind::Adt(adt_def, variant_index, _, _, active_field_index) => { - self.write_discriminant(variant_index, dest)?; + self.write_discriminant(variant_index, &dest)?; if adt_def.is_enum() { - (self.place_downcast(dest, variant_index)?, active_field_index) + (self.place_downcast(&dest, variant_index)?, active_field_index) } else { (dest, active_field_index) } @@ -207,21 +247,21 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { // Ignore zero-sized fields. if !op.layout.is_zst() { let field_index = active_field_index.unwrap_or(i); - let field_dest = self.place_field(dest, field_index)?; - self.copy_op(op, field_dest)?; + let field_dest = self.place_field(&dest, field_index)?; + self.copy_op(&op, &field_dest)?; } } } Repeat(ref operand, _) => { let op = self.eval_operand(operand, None)?; - let dest = self.force_allocation(dest)?; + let dest = self.force_allocation(&dest)?; let length = dest.len(self)?; - if let Some(first_ptr) = self.check_mplace_access(dest, None)? { + if let Some(first_ptr) = self.check_mplace_access(&dest, None)? { // Write the first. - let first = self.mplace_field(dest, 0)?; - self.copy_op(op, first.into())?; + let first = self.mplace_field(&dest, 0)?; + self.copy_op(&op, &first.into())?; if length > 1 { let elem_size = first.layout.size; @@ -242,23 +282,23 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { Len(place) => { // FIXME(CTFE): don't allow computing the length of arrays in const eval let src = self.eval_place(place)?; - let mplace = self.force_allocation(src)?; + let mplace = self.force_allocation(&src)?; let len = mplace.len(self)?; - self.write_scalar(Scalar::from_machine_usize(len, self), dest)?; + self.write_scalar(Scalar::from_machine_usize(len, self), &dest)?; } AddressOf(_, place) | Ref(_, _, place) => { let src = self.eval_place(place)?; - let place = self.force_allocation(src)?; + let place = self.force_allocation(&src)?; if place.layout.size.bytes() > 0 { // definitely not a ZST assert!(place.ptr.is_ptr(), "non-ZST places should be normalized to `Pointer`"); } - self.write_immediate(place.to_ref(), dest)?; + self.write_immediate(place.to_ref(), &dest)?; } NullaryOp(mir::NullOp::Box, _) => { - M::box_alloc(self, dest)?; + M::box_alloc(self, &dest)?; } NullaryOp(mir::NullOp::SizeOf, ty) => { @@ -272,19 +312,19 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { ); throw_inval!(SizeOfUnsizedType(ty)); } - self.write_scalar(Scalar::from_machine_usize(layout.size.bytes(), self), dest)?; + self.write_scalar(Scalar::from_machine_usize(layout.size.bytes(), self), &dest)?; } Cast(cast_kind, ref operand, cast_ty) => { let src = self.eval_operand(operand, None)?; let cast_ty = self.subst_from_current_frame_and_normalize_erasing_regions(cast_ty); - self.cast(src, cast_kind, cast_ty, dest)?; + self.cast(&src, cast_kind, cast_ty, &dest)?; } Discriminant(place) => { let op = self.eval_place_to_op(place, None)?; - let discr_val = self.read_discriminant(op)?.0; - self.write_scalar(discr_val, dest)?; + let discr_val = self.read_discriminant(&op)?.0; + self.write_scalar(discr_val, &dest)?; } } diff --git a/compiler/rustc_mir/src/interpret/terminator.rs b/compiler/rustc_mir/src/interpret/terminator.rs index 575667f9a9..4aa1360d53 100644 --- a/compiler/rustc_mir/src/interpret/terminator.rs +++ b/compiler/rustc_mir/src/interpret/terminator.rs @@ -25,7 +25,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { Goto { target } => self.go_to_block(target), SwitchInt { ref discr, ref targets, switch_ty } => { - let discr = self.read_immediate(self.eval_operand(discr, None)?)?; + let discr = self.read_immediate(&self.eval_operand(discr, None)?)?; trace!("SwitchInt({:?})", *discr); assert_eq!(discr.layout.ty, switch_ty); @@ -38,8 +38,8 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let res = self .overflowing_binary_op( mir::BinOp::Eq, - discr, - ImmTy::from_uint(const_int, discr.layout), + &discr, + &ImmTy::from_uint(const_int, discr.layout), )? .0; if res.to_bool()? { @@ -58,7 +58,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let (fn_val, abi) = match *func.layout.ty.kind() { ty::FnPtr(sig) => { let caller_abi = sig.abi(); - let fn_ptr = self.read_scalar(func)?.check_init()?; + let fn_ptr = self.read_scalar(&func)?.check_init()?; let fn_val = self.memory.get_fn(fn_ptr)?; (fn_val, caller_abi) } @@ -78,8 +78,12 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { ), }; let args = self.eval_operands(args)?; + let dest_place; let ret = match destination { - Some((dest, ret)) => Some((self.eval_place(dest)?, ret)), + Some((dest, ret)) => { + dest_place = self.eval_place(dest)?; + Some((&dest_place, ret)) + } None => None, }; self.eval_fn_call(fn_val, abi, &args[..], ret, *cleanup)?; @@ -96,12 +100,12 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { trace!("TerminatorKind::drop: {:?}, type {}", place, ty); let instance = Instance::resolve_drop_in_place(*self.tcx, ty); - self.drop_in_place(place, instance, target, unwind)?; + self.drop_in_place(&place, instance, 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()?; + self.read_immediate(&self.eval_operand(cond, None)?)?.to_scalar()?.to_bool()?; if expected == cond_val { self.go_to_block(target); } else { @@ -180,7 +184,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { &mut self, rust_abi: bool, caller_arg: &mut impl Iterator>, - callee_arg: PlaceTy<'tcx, M::PointerTag>, + callee_arg: &PlaceTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { if rust_abi && callee_arg.layout.is_zst() { // Nothing to do. @@ -202,7 +206,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { ) } // We allow some transmutes here - self.copy_op_transmute(caller_arg, callee_arg) + self.copy_op_transmute(&caller_arg, callee_arg) } /// Call this function -- pushing the stack frame and initializing the arguments. @@ -211,7 +215,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { fn_val: FnVal<'tcx, M::ExtraFnVal>, caller_abi: Abi, args: &[OpTy<'tcx, M::PointerTag>], - ret: Option<(PlaceTy<'tcx, M::PointerTag>, mir::BasicBlock)>, + ret: Option<(&PlaceTy<'tcx, M::PointerTag>, mir::BasicBlock)>, unwind: Option, ) -> InterpResult<'tcx> { trace!("eval_fn_call: {:#?}", fn_val); @@ -244,9 +248,9 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { }; if normalize_abi(caller_abi) != normalize_abi(callee_abi) { throw_ub_format!( - "calling a function with ABI {:?} using caller ABI {:?}", - callee_abi, - caller_abi + "calling a function with ABI {} using caller ABI {}", + callee_abi.name(), + caller_abi.name() ) } } @@ -314,7 +318,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { 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(); + let (untuple_arg, args) = args.split_last().unwrap(); trace!("eval_fn_call: Will pass last argument by untupling"); Cow::from( args.iter() @@ -344,12 +348,12 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { 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)?; - self.pass_argument(rust_abi, &mut caller_iter, dest)?; + let dest = self.place_field(&dest, i)?; + self.pass_argument(rust_abi, &mut caller_iter, &dest)?; } } else { // Normal argument - self.pass_argument(rust_abi, &mut caller_iter, dest)?; + self.pass_argument(rust_abi, &mut caller_iter, &dest)?; } } // Now we should have no more caller args @@ -397,7 +401,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let receiver_place = match args[0].layout.ty.builtin_deref(true) { Some(_) => { // Built-in pointer. - self.deref_operand(args[0])? + self.deref_operand(&args[0])? } None => { // Unsized self. @@ -426,7 +430,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { fn drop_in_place( &mut self, - place: PlaceTy<'tcx, M::PointerTag>, + place: &PlaceTy<'tcx, M::PointerTag>, instance: ty::Instance<'tcx>, target: mir::BasicBlock, unwind: Option, @@ -440,7 +444,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let (instance, place) = match place.layout.ty.kind() { ty::Dynamic(..) => { // Dropping a trait object. - self.unpack_dyn_trait(place)? + self.unpack_dyn_trait(&place)? } _ => (instance, place), }; @@ -457,7 +461,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { FnVal::Instance(instance), Abi::Rust, &[arg.into()], - Some((dest.into(), target)), + Some((&dest.into(), target)), unwind, ) } diff --git a/compiler/rustc_mir/src/interpret/traits.rs b/compiler/rustc_mir/src/interpret/traits.rs index 09ce6bc0fb..50603bdd45 100644 --- a/compiler/rustc_mir/src/interpret/traits.rs +++ b/compiler/rustc_mir/src/interpret/traits.rs @@ -118,7 +118,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { .get_raw(vtable_slot.alloc_id)? .read_ptr_sized(self, vtable_slot)? .check_init()?; - Ok(self.memory.get_fn(fn_ptr)?) + self.memory.get_fn(fn_ptr) } /// Returns the drop fn instance as well as the actual dynamic type. diff --git a/compiler/rustc_mir/src/interpret/validity.rs b/compiler/rustc_mir/src/interpret/validity.rs index 0b7492631c..062ef7d8b4 100644 --- a/compiler/rustc_mir/src/interpret/validity.rs +++ b/compiler/rustc_mir/src/interpret/validity.rs @@ -11,7 +11,7 @@ use std::ops::RangeInclusive; use rustc_data_structures::fx::FxHashSet; use rustc_hir as hir; -use rustc_middle::mir::interpret::{InterpError, InterpErrorInfo}; +use rustc_middle::mir::interpret::InterpError; use rustc_middle::ty; use rustc_middle::ty::layout::TyAndLayout; use rustc_span::symbol::{sym, Symbol}; @@ -21,7 +21,7 @@ use std::hash::Hash; use super::{ CheckInAllocMsg, GlobalAlloc, InterpCx, InterpResult, MPlaceTy, Machine, MemPlaceMeta, OpTy, - ValueVisitor, + ScalarMaybeUninit, ValueVisitor, }; macro_rules! throw_validation_failure { @@ -77,20 +77,23 @@ macro_rules! throw_validation_failure { /// macro_rules! try_validation { ($e:expr, $where:expr, - $( $( $p:pat )|+ => { $( $what_fmt:expr ),+ } $( expected { $( $expected_fmt:expr ),+ } )? ),+ $(,)? + $( $( $p:pat )|+ => { $( $what_fmt:expr ),+ } $( expected { $( $expected_fmt:expr ),+ } )? ),+ $(,)? ) => {{ match $e { Ok(x) => x, // We catch the error and turn it into a validation failure. We are okay with // allocation here as this can only slow down builds that fail anyway. - $( $( Err(InterpErrorInfo { kind: $p, .. }) )|+ => - throw_validation_failure!( - $where, - { $( $what_fmt ),+ } $( expected { $( $expected_fmt ),+ } )? - ), - )+ - #[allow(unreachable_patterns)] - Err(e) => Err::(e)?, + Err(e) => match e.kind() { + $( + $($p)|+ => + throw_validation_failure!( + $where, + { $( $what_fmt ),+ } $( expected { $( $expected_fmt ),+ } )? + ) + ),+, + #[allow(unreachable_patterns)] + _ => Err::(e)?, + } } }}; } @@ -241,17 +244,20 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, ' // generators and closures. ty::Closure(def_id, _) | ty::Generator(def_id, _, _) => { let mut name = None; - if let Some(def_id) = def_id.as_local() { - let tables = self.ecx.tcx.typeck(def_id); - if let Some(upvars) = tables.closure_captures.get(&def_id.to_def_id()) { + // FIXME this should be more descriptive i.e. CapturePlace instead of CapturedVar + // https://github.com/rust-lang/project-rfc-2229/issues/46 + if let Some(local_def_id) = def_id.as_local() { + let tables = self.ecx.tcx.typeck(local_def_id); + if let Some(captured_place) = + tables.closure_min_captures_flattened(*def_id).nth(field) + { // Sometimes the index is beyond the number of upvars (seen // for a generator). - if let Some((&var_hir_id, _)) = upvars.get_index(field) { - let node = self.ecx.tcx.hir().get(var_hir_id); - if let hir::Node::Binding(pat) = node { - if let hir::PatKind::Binding(_, _, ident, _) = pat.kind { - name = Some(ident.name); - } + let var_hir_id = captured_place.get_root_variable(); + let node = self.ecx.tcx.hir().get(var_hir_id); + if let hir::Node::Binding(pat) = node { + if let hir::PatKind::Binding(_, _, ident, _) = pat.kind { + name = Some(ident.name); } } } @@ -375,14 +381,18 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, ' /// Check a reference or `Box`. fn check_safe_pointer( &mut self, - value: OpTy<'tcx, M::PointerTag>, + value: &OpTy<'tcx, M::PointerTag>, kind: &str, ) -> InterpResult<'tcx> { - let value = self.ecx.read_immediate(value)?; + let value = try_validation!( + self.ecx.read_immediate(value), + self.path, + err_unsup!(ReadPointerAsBytes) => { "part of a pointer" } expected { "a proper pointer or integer value" }, + ); // Handle wide pointers. // Check metadata early, for better diagnostics let place = try_validation!( - self.ecx.ref_to_mplace(value), + self.ecx.ref_to_mplace(&value), self.path, err_ub!(InvalidUninitBytes(None)) => { "uninitialized {}", kind }, ); @@ -391,7 +401,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, ' } // Make sure this is dereferenceable and all. let size_and_align = try_validation!( - self.ecx.size_and_align_of_mplace(place), + self.ecx.size_and_align_of_mplace(&place), self.path, err_ub!(InvalidMeta(msg)) => { "invalid {} metadata: {}", kind, msg }, ); @@ -485,17 +495,28 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, ' Ok(()) } + fn read_scalar( + &self, + op: &OpTy<'tcx, M::PointerTag>, + ) -> InterpResult<'tcx, ScalarMaybeUninit> { + Ok(try_validation!( + self.ecx.read_scalar(op), + self.path, + err_unsup!(ReadPointerAsBytes) => { "(potentially part of) a pointer" } expected { "plain (non-pointer) bytes" }, + )) + } + /// Check if this is a value of primitive type, and if yes check the validity of the value /// at that type. Return `true` if the type is indeed primitive. fn try_visit_primitive( &mut self, - value: OpTy<'tcx, M::PointerTag>, + value: &OpTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, bool> { // Go over all the primitive types let ty = value.layout.ty; match ty.kind() { ty::Bool => { - let value = self.ecx.read_scalar(value)?; + let value = self.read_scalar(value)?; try_validation!( value.to_bool(), self.path, @@ -505,7 +526,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, ' Ok(true) } ty::Char => { - let value = self.ecx.read_scalar(value)?; + let value = self.read_scalar(value)?; try_validation!( value.to_char(), self.path, @@ -515,11 +536,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, ' Ok(true) } ty::Float(_) | ty::Int(_) | ty::Uint(_) => { - let value = try_validation!( - self.ecx.read_scalar(value), - self.path, - err_unsup!(ReadPointerAsBytes) => { "read of part of a pointer" }, - ); + let value = self.read_scalar(value)?; // NOTE: Keep this in sync with the array optimization for int/float // types below! if self.ctfe_mode.is_some() { @@ -541,9 +558,10 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, ' // actually enforce the strict rules for raw pointers (mostly because // that lets us re-use `ref_to_mplace`). let place = try_validation!( - self.ecx.ref_to_mplace(self.ecx.read_immediate(value)?), + self.ecx.read_immediate(value).and_then(|ref i| self.ecx.ref_to_mplace(i)), self.path, err_ub!(InvalidUninitBytes(None)) => { "uninitialized raw pointer" }, + err_unsup!(ReadPointerAsBytes) => { "part of a pointer" } expected { "a proper pointer or integer value" }, ); if place.layout.is_unsized() { self.check_wide_ptr_meta(place.meta, place.layout)?; @@ -569,7 +587,14 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, ' Ok(true) } ty::FnPtr(_sig) => { - let value = self.ecx.read_scalar(value)?; + let value = try_validation!( + self.ecx.read_immediate(value), + self.path, + err_unsup!(ReadPointerAsBytes) => { "part of a pointer" } expected { "a proper pointer or integer value" }, + ); + // Make sure we print a `ScalarMaybeUninit` (and not an `ImmTy`) in the error + // message below. + let value = value.to_scalar_or_uninit(); let _fn = try_validation!( value.check_init().and_then(|ptr| self.ecx.memory.get_fn(ptr)), self.path, @@ -612,10 +637,10 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValidityVisitor<'rt, 'mir, ' fn visit_scalar( &mut self, - op: OpTy<'tcx, M::PointerTag>, + op: &OpTy<'tcx, M::PointerTag>, scalar_layout: &Scalar, ) -> InterpResult<'tcx> { - let value = self.ecx.read_scalar(op)?; + let value = self.read_scalar(op)?; let valid_range = &scalar_layout.valid_range; let (lo, hi) = valid_range.clone().into_inner(); // Determine the allowed range @@ -686,7 +711,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M> fn read_discriminant( &mut self, - op: OpTy<'tcx, M::PointerTag>, + op: &OpTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, VariantIdx> { self.with_elem(PathElem::EnumTag, move |this| { Ok(try_validation!( @@ -706,9 +731,9 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M> #[inline] fn visit_field( &mut self, - old_op: OpTy<'tcx, M::PointerTag>, + old_op: &OpTy<'tcx, M::PointerTag>, field: usize, - new_op: OpTy<'tcx, M::PointerTag>, + new_op: &OpTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { let elem = self.aggregate_field_path_elem(old_op.layout, field); self.with_elem(elem, move |this| this.visit_value(new_op)) @@ -717,9 +742,9 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M> #[inline] fn visit_variant( &mut self, - old_op: OpTy<'tcx, M::PointerTag>, + old_op: &OpTy<'tcx, M::PointerTag>, variant_id: VariantIdx, - new_op: OpTy<'tcx, M::PointerTag>, + new_op: &OpTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx> { let name = match old_op.layout.ty.kind() { ty::Adt(adt, _) => PathElem::Variant(adt.variants[variant_id].ident.name), @@ -733,14 +758,14 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M> #[inline(always)] fn visit_union( &mut self, - _op: OpTy<'tcx, M::PointerTag>, + _op: &OpTy<'tcx, M::PointerTag>, _fields: NonZeroUsize, ) -> InterpResult<'tcx> { Ok(()) } #[inline] - fn visit_value(&mut self, op: OpTy<'tcx, M::PointerTag>) -> InterpResult<'tcx> { + fn visit_value(&mut self, op: &OpTy<'tcx, M::PointerTag>) -> InterpResult<'tcx> { trace!("visit_value: {:?}, {:?}", *op, op.layout); // Check primitive types -- the leafs of our recursive descend. @@ -797,7 +822,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M> fn visit_aggregate( &mut self, - op: OpTy<'tcx, M::PointerTag>, + op: &OpTy<'tcx, M::PointerTag>, fields: impl Iterator>, ) -> InterpResult<'tcx> { match op.layout.ty.kind() { @@ -858,7 +883,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M> Err(err) => { // For some errors we might be able to provide extra information. // (This custom logic does not fit the `try_validation!` macro.) - match err.kind { + match err.kind() { err_ub!(InvalidUninitBytes(Some(access))) => { // Some byte was uninitialized, determine which // element that byte belongs to so we can @@ -899,7 +924,7 @@ impl<'rt, 'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> ValueVisitor<'mir, 'tcx, M> impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { fn validate_operand_internal( &self, - op: OpTy<'tcx, M::PointerTag>, + op: &OpTy<'tcx, M::PointerTag>, path: Vec, ref_tracking: Option<&mut RefTracking, Vec>>, ctfe_mode: Option, @@ -910,16 +935,16 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { let mut visitor = ValidityVisitor { path, ref_tracking, ctfe_mode, ecx: self }; // Try to cast to ptr *once* instead of all the time. - let op = self.force_op_ptr(op).unwrap_or(op); + let op = self.force_op_ptr(&op).unwrap_or(*op); // Run it. - match visitor.visit_value(op) { + match visitor.visit_value(&op) { Ok(()) => Ok(()), // Pass through validation failures. - Err(err) if matches!(err.kind, err_ub!(ValidationFailure { .. })) => Err(err), + Err(err) if matches!(err.kind(), err_ub!(ValidationFailure { .. })) => Err(err), // Also pass through InvalidProgram, those just indicate that we could not // validate and each caller will know best what to do with them. - Err(err) if matches!(err.kind, InterpError::InvalidProgram(_)) => Err(err), + Err(err) if matches!(err.kind(), InterpError::InvalidProgram(_)) => Err(err), // Avoid other errors as those do not show *where* in the value the issue lies. Err(err) => { err.print_backtrace(); @@ -941,7 +966,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { #[inline(always)] pub fn const_validate_operand( &self, - op: OpTy<'tcx, M::PointerTag>, + op: &OpTy<'tcx, M::PointerTag>, path: Vec, ref_tracking: &mut RefTracking, Vec>, ctfe_mode: CtfeValidationMode, @@ -953,7 +978,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> InterpCx<'mir, 'tcx, M> { /// `op` is assumed to cover valid memory if it is an indirect operand. /// It will error if the bits at the destination do not match the ones described by the layout. #[inline(always)] - pub fn validate_operand(&self, op: OpTy<'tcx, M::PointerTag>) -> InterpResult<'tcx> { + pub fn validate_operand(&self, op: &OpTy<'tcx, M::PointerTag>) -> InterpResult<'tcx> { self.validate_operand_internal(op, vec![], None, None) } } diff --git a/compiler/rustc_mir/src/interpret/visitor.rs b/compiler/rustc_mir/src/interpret/visitor.rs index 097b9ae6ca..32edca6f3d 100644 --- a/compiler/rustc_mir/src/interpret/visitor.rs +++ b/compiler/rustc_mir/src/interpret/visitor.rs @@ -18,21 +18,25 @@ pub trait Value<'mir, 'tcx, M: Machine<'mir, 'tcx>>: Copy { fn layout(&self) -> TyAndLayout<'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; /// Projects to the given enum variant. fn project_downcast( - self, + &self, ecx: &InterpCx<'mir, 'tcx, M>, variant: VariantIdx, ) -> InterpResult<'tcx, Self>; /// Projects to the n-th field. - fn project_field(self, ecx: &InterpCx<'mir, 'tcx, M>, field: usize) - -> InterpResult<'tcx, Self>; + fn project_field( + &self, + ecx: &InterpCx<'mir, 'tcx, M>, + field: usize, + ) -> InterpResult<'tcx, Self>; } // Operands and memory-places are both values. @@ -45,10 +49,10 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> Value<'mir, 'tcx, M> for OpTy<'tc #[inline(always)] fn to_op( - self, + &self, _ecx: &InterpCx<'mir, 'tcx, M>, ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { - Ok(self) + Ok(*self) } #[inline(always)] @@ -58,7 +62,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> Value<'mir, 'tcx, M> for OpTy<'tc #[inline(always)] fn project_downcast( - self, + &self, ecx: &InterpCx<'mir, 'tcx, M>, variant: VariantIdx, ) -> InterpResult<'tcx, Self> { @@ -67,7 +71,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> Value<'mir, 'tcx, M> for OpTy<'tc #[inline(always)] fn project_field( - self, + &self, ecx: &InterpCx<'mir, 'tcx, M>, field: usize, ) -> InterpResult<'tcx, Self> { @@ -85,10 +89,10 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> Value<'mir, 'tcx, M> #[inline(always)] fn to_op( - self, + &self, _ecx: &InterpCx<'mir, 'tcx, M>, ) -> InterpResult<'tcx, OpTy<'tcx, M::PointerTag>> { - Ok(self.into()) + Ok((*self).into()) } #[inline(always)] @@ -98,7 +102,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> Value<'mir, 'tcx, M> #[inline(always)] fn project_downcast( - self, + &self, ecx: &InterpCx<'mir, 'tcx, M>, variant: VariantIdx, ) -> InterpResult<'tcx, Self> { @@ -107,7 +111,7 @@ impl<'mir, 'tcx: 'mir, M: Machine<'mir, 'tcx>> Value<'mir, 'tcx, M> #[inline(always)] fn project_field( - self, + &self, ecx: &InterpCx<'mir, 'tcx, M>, field: usize, ) -> InterpResult<'tcx, Self> { @@ -129,7 +133,7 @@ macro_rules! make_value_visitor { #[inline(always)] fn read_discriminant( &mut self, - op: OpTy<'tcx, M::PointerTag>, + op: &OpTy<'tcx, M::PointerTag>, ) -> InterpResult<'tcx, VariantIdx> { Ok(self.ecx().read_discriminant(op)?.1) } @@ -137,13 +141,13 @@ macro_rules! make_value_visitor { // Recursive actions, ready to be overloaded. /// Visits the given value, dispatching as appropriate to more specialized visitors. #[inline(always)] - fn visit_value(&mut self, v: Self::V) -> InterpResult<'tcx> + fn visit_value(&mut self, v: &Self::V) -> InterpResult<'tcx> { self.walk_value(v) } /// Visits the given value as a union. No automatic recursion can happen here. #[inline(always)] - fn visit_union(&mut self, _v: Self::V, _fields: NonZeroUsize) -> InterpResult<'tcx> + fn visit_union(&mut self, _v: &Self::V, _fields: NonZeroUsize) -> InterpResult<'tcx> { Ok(()) } @@ -153,7 +157,7 @@ macro_rules! make_value_visitor { #[inline(always)] fn visit_aggregate( &mut self, - v: Self::V, + v: &Self::V, fields: impl Iterator>, ) -> InterpResult<'tcx> { self.walk_aggregate(v, fields) @@ -167,9 +171,9 @@ macro_rules! make_value_visitor { #[inline(always)] fn visit_field( &mut self, - _old_val: Self::V, + _old_val: &Self::V, _field: usize, - new_val: Self::V, + new_val: &Self::V, ) -> InterpResult<'tcx> { self.visit_value(new_val) } @@ -179,9 +183,9 @@ macro_rules! make_value_visitor { #[inline(always)] fn visit_variant( &mut self, - _old_val: Self::V, + _old_val: &Self::V, _variant: VariantIdx, - new_val: Self::V, + new_val: &Self::V, ) -> InterpResult<'tcx> { self.visit_value(new_val) } @@ -189,16 +193,16 @@ macro_rules! make_value_visitor { // Default recursors. Not meant to be overloaded. fn walk_aggregate( &mut self, - v: Self::V, + v: &Self::V, fields: impl Iterator>, ) -> InterpResult<'tcx> { // Now iterate over it. for (idx, field_val) in fields.enumerate() { - self.visit_field(v, idx, field_val?)?; + self.visit_field(v, idx, &field_val?)?; } Ok(()) } - fn walk_value(&mut self, v: Self::V) -> InterpResult<'tcx> + fn walk_value(&mut self, v: &Self::V) -> InterpResult<'tcx> { trace!("walk_value: type: {}", v.layout().ty); @@ -208,10 +212,10 @@ macro_rules! make_value_visitor { ty::Dynamic(..) => { // immediate trait objects are not a thing let dest = v.to_op(self.ecx())?.assert_mem_place(self.ecx()); - let inner = self.ecx().unpack_dyn_trait(dest)?.1; + let inner = self.ecx().unpack_dyn_trait(&dest)?.1; trace!("walk_value: dyn object layout: {:#?}", inner.layout); // recurse with the inner type - return self.visit_field(v, 0, Value::from_mem_place(inner)); + return self.visit_field(&v, 0, &Value::from_mem_place(inner)); }, // Slices do not need special handling here: they have `Array` field // placement with length 0, so we enter the `Array` case below which @@ -241,7 +245,7 @@ macro_rules! make_value_visitor { // Now we can go over all the fields. // This uses the *run-time length*, i.e., if we are a slice, // the dynamic info from the metadata is used. - let iter = self.ecx().mplace_array_fields(mplace)? + let iter = self.ecx().mplace_array_fields(&mplace)? .map(|f| f.and_then(|f| { Ok(Value::from_mem_place(f)) })); @@ -254,11 +258,11 @@ macro_rules! make_value_visitor { // with *its* fields. Variants::Multiple { .. } => { let op = v.to_op(self.ecx())?; - let idx = self.read_discriminant(op)?; + let idx = self.read_discriminant(&op)?; let inner = v.project_downcast(self.ecx(), idx)?; trace!("walk_value: variant layout: {:#?}", inner.layout()); // recurse with the inner type - self.visit_variant(v, idx, inner) + self.visit_variant(v, idx, &inner) } // For single-variant layouts, we already did anything there is to do. Variants::Single { .. } => Ok(()) diff --git a/compiler/rustc_mir/src/lib.rs b/compiler/rustc_mir/src/lib.rs index 8b3881ef9d..f73d5dc0c1 100644 --- a/compiler/rustc_mir/src/lib.rs +++ b/compiler/rustc_mir/src/lib.rs @@ -7,6 +7,7 @@ Rust MIR: a lowered representation of Rust. #![feature(nll)] #![feature(in_band_lifetimes)] #![feature(array_windows)] +#![feature(assert_matches)] #![feature(bindings_after_at)] #![feature(bool_to_option)] #![feature(box_patterns)] @@ -18,17 +19,17 @@ Rust MIR: a lowered representation of Rust. #![feature(exact_size_is_empty)] #![feature(exhaustive_patterns)] #![feature(never_type)] +#![feature(map_try_insert)] #![feature(min_specialization)] #![feature(trusted_len)] #![feature(try_blocks)] #![feature(associated_type_defaults)] #![feature(stmt_expr_attributes)] #![feature(trait_alias)] -#![feature(option_expect_none)] +#![feature(option_get_or_insert_default)] #![feature(or_patterns)] #![feature(once_cell)] #![feature(control_flow_enum)] -#![feature(str_split_once)] #![recursion_limit = "256"] #[macro_use] @@ -63,6 +64,10 @@ pub fn provide(providers: &mut Providers) { let (param_env, value) = param_env_and_value.into_parts(); const_eval::destructure_const(tcx, param_env, value) }; + providers.const_to_valtree = |tcx, param_env_and_value| { + let (param_env, raw) = param_env_and_value.into_parts(); + const_eval::const_to_valtree(tcx, param_env, raw) + }; providers.deref_const = |tcx, param_env_and_value| { let (param_env, value) = param_env_and_value.into_parts(); const_eval::deref_const(tcx, param_env, value) diff --git a/compiler/rustc_mir/src/monomorphize/collector.rs b/compiler/rustc_mir/src/monomorphize/collector.rs index 75f80f69be..911224d8c1 100644 --- a/compiler/rustc_mir/src/monomorphize/collector.rs +++ b/compiler/rustc_mir/src/monomorphize/collector.rs @@ -684,7 +684,7 @@ impl<'a, 'tcx> MirVisitor<'tcx> for MirNeighborCollector<'a, 'tcx> { for op in operands { match *op { mir::InlineAsmOperand::SymFn { ref value } => { - let fn_ty = self.monomorphize(value.literal.ty); + let fn_ty = self.monomorphize(value.literal.ty()); visit_fn_use(self.tcx, fn_ty, false, source, &mut self.output); } mir::InlineAsmOperand::SymStatic { def_id } => { @@ -1013,13 +1013,12 @@ impl ItemLikeVisitor<'v> for RootCollector<'_, 'v> { | 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 {}", - self.tcx.def_path_str(def_id.to_def_id()) + self.tcx.def_path_str(item.def_id.to_def_id()) ); - let ty = Instance::new(def_id.to_def_id(), InternalSubsts::empty()) + let ty = Instance::new(item.def_id.to_def_id(), InternalSubsts::empty()) .ty(self.tcx, ty::ParamEnv::reveal_all()); visit_drop_use(self.tcx, ty, true, DUMMY_SP, self.output); } @@ -1028,29 +1027,28 @@ impl ItemLikeVisitor<'v> for RootCollector<'_, 'v> { hir::ItemKind::GlobalAsm(..) => { debug!( "RootCollector: ItemKind::GlobalAsm({})", - self.tcx.def_path_str(self.tcx.hir().local_def_id(item.hir_id).to_def_id()) + self.tcx.def_path_str(item.def_id.to_def_id()) ); - self.output.push(dummy_spanned(MonoItem::GlobalAsm(item.hir_id))); + self.output.push(dummy_spanned(MonoItem::GlobalAsm(item.item_id()))); } hir::ItemKind::Static(..) => { - let def_id = self.tcx.hir().local_def_id(item.hir_id).to_def_id(); - debug!("RootCollector: ItemKind::Static({})", self.tcx.def_path_str(def_id)); - self.output.push(dummy_spanned(MonoItem::Static(def_id))); + debug!( + "RootCollector: ItemKind::Static({})", + self.tcx.def_path_str(item.def_id.to_def_id()) + ); + self.output.push(dummy_spanned(MonoItem::Static(item.def_id.to_def_id()))); } hir::ItemKind::Const(..) => { // const items only generate mono items if they are // actually used somewhere. Just declaring them is insufficient. // but even just declaring them must collect the items they refer to - let def_id = self.tcx.hir().local_def_id(item.hir_id); - - if let Ok(val) = self.tcx.const_eval_poly(def_id.to_def_id()) { + if let Ok(val) = self.tcx.const_eval_poly(item.def_id.to_def_id()) { collect_const_value(self.tcx, val, &mut self.output); } } hir::ItemKind::Fn(..) => { - let def_id = self.tcx.hir().local_def_id(item.hir_id); - self.push_if_root(def_id); + self.push_if_root(item.def_id); } } } @@ -1062,8 +1060,7 @@ impl ItemLikeVisitor<'v> for RootCollector<'_, 'v> { fn visit_impl_item(&mut self, ii: &'v hir::ImplItem<'v>) { if let hir::ImplItemKind::Fn(hir::FnSig { .. }, _) = ii.kind { - let def_id = self.tcx.hir().local_def_id(ii.hir_id); - self.push_if_root(def_id); + self.push_if_root(ii.def_id); } } @@ -1156,14 +1153,12 @@ fn create_mono_items_for_default_impls<'tcx>( } } - let impl_def_id = tcx.hir().local_def_id(item.hir_id); - debug!( "create_mono_items_for_default_impls(item={})", - tcx.def_path_str(impl_def_id.to_def_id()) + tcx.def_path_str(item.def_id.to_def_id()) ); - if let Some(trait_ref) = tcx.impl_trait_ref(impl_def_id) { + if let Some(trait_ref) = tcx.impl_trait_ref(item.def_id) { let param_env = ty::ParamEnv::reveal_all(); let trait_ref = tcx.normalize_erasing_regions(param_env, trait_ref); let overridden_methods: FxHashSet<_> = diff --git a/compiler/rustc_mir/src/monomorphize/partitioning/default.rs b/compiler/rustc_mir/src/monomorphize/partitioning/default.rs index d5a845dd76..edd46310f2 100644 --- a/compiler/rustc_mir/src/monomorphize/partitioning/default.rs +++ b/compiler/rustc_mir/src/monomorphize/partitioning/default.rs @@ -314,7 +314,7 @@ fn characteristic_def_id_of_mono_item<'tcx>( Some(def_id) } MonoItem::Static(def_id) => Some(def_id), - MonoItem::GlobalAsm(hir_id) => Some(tcx.hir().local_def_id(hir_id).to_def_id()), + MonoItem::GlobalAsm(item_id) => Some(item_id.def_id.to_def_id()), } } @@ -405,11 +405,10 @@ fn mono_item_visibility( Visibility::Hidden }; } - MonoItem::GlobalAsm(hir_id) => { - let def_id = tcx.hir().local_def_id(*hir_id); - return if tcx.is_reachable_non_generic(def_id) { + MonoItem::GlobalAsm(item_id) => { + return if tcx.is_reachable_non_generic(item_id.def_id) { *can_be_internalized = false; - default_visibility(tcx, def_id.to_def_id(), false) + default_visibility(tcx, item_id.def_id.to_def_id(), false) } else { Visibility::Hidden }; diff --git a/compiler/rustc_mir/src/monomorphize/partitioning/mod.rs b/compiler/rustc_mir/src/monomorphize/partitioning/mod.rs index b9fcd32250..dc2379fd92 100644 --- a/compiler/rustc_mir/src/monomorphize/partitioning/mod.rs +++ b/compiler/rustc_mir/src/monomorphize/partitioning/mod.rs @@ -239,17 +239,22 @@ where I: Iterator>, 'tcx: 'a, { - if cfg!(debug_assertions) { - debug!("{}", label); + let dump = move || { + use std::fmt::Write; + + let s = &mut String::new(); + let _ = writeln!(s, "{}", label); for cgu in cgus { - debug!("CodegenUnit {} estimated size {} :", cgu.name(), cgu.size_estimate()); + let _ = + writeln!(s, "CodegenUnit {} estimated size {} :", cgu.name(), cgu.size_estimate()); for (mono_item, linkage) in cgu.items() { let symbol_name = mono_item.symbol_name(tcx).name; let symbol_hash_start = symbol_name.rfind('h'); let symbol_hash = symbol_hash_start.map_or("", |i| &symbol_name[i..]); - debug!( + let _ = writeln!( + s, " - {} [{:?}] [{}] estimated size {}", mono_item, linkage, @@ -258,9 +263,13 @@ where ); } - debug!(""); + let _ = writeln!(s, ""); } - } + + std::mem::take(s) + }; + + debug!("{}", dump()); } #[inline(never)] // give this a place in the profiler @@ -415,8 +424,33 @@ fn collect_and_partition_mono_items<'tcx>( (tcx.arena.alloc(mono_items), codegen_units) } +fn codegened_and_inlined_items<'tcx>(tcx: TyCtxt<'tcx>, cnum: CrateNum) -> &'tcx DefIdSet { + let (items, cgus) = tcx.collect_and_partition_mono_items(cnum); + let mut visited = DefIdSet::default(); + let mut result = items.clone(); + + for cgu in cgus { + for (item, _) in cgu.items() { + if let MonoItem::Fn(ref instance) = item { + let did = instance.def_id(); + if !visited.insert(did) { + continue; + } + for scope in &tcx.instance_mir(instance.def).source_scopes { + if let Some((ref inlined, _)) = scope.inlined { + result.insert(inlined.def_id()); + } + } + } + } + } + + tcx.arena.alloc(result) +} + pub fn provide(providers: &mut Providers) { providers.collect_and_partition_mono_items = collect_and_partition_mono_items; + providers.codegened_and_inlined_items = codegened_and_inlined_items; providers.is_codegened_item = |tcx, def_id| { let (all_mono_items, _) = tcx.collect_and_partition_mono_items(LOCAL_CRATE); diff --git a/compiler/rustc_mir/src/monomorphize/polymorphize.rs b/compiler/rustc_mir/src/monomorphize/polymorphize.rs index 4ad71ab491..05b0e3a7da 100644 --- a/compiler/rustc_mir/src/monomorphize/polymorphize.rs +++ b/compiler/rustc_mir/src/monomorphize/polymorphize.rs @@ -30,9 +30,8 @@ pub fn provide(providers: &mut Providers) { /// Determine which generic parameters are used by the function/method/closure represented by /// `def_id`. Returns a bitset where bits representing unused parameters are set (`is_empty` /// indicates all parameters are used). +#[instrument(skip(tcx))] fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet { - debug!("unused_generic_params({:?})", def_id); - if !tcx.sess.opts.debugging_opts.polymorphize { // If polymorphization disabled, then all parameters are used. return FiniteBitSet::new_empty(); @@ -46,7 +45,7 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet { } let generics = tcx.generics_of(def_id); - debug!("unused_generic_params: generics={:?}", generics); + debug!(?generics); // Exit early when there are no parameters to be unused. if generics.count() == 0 { @@ -57,11 +56,11 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet { let context = tcx.hir().body_const_context(def_id.expect_local()); match context { Some(ConstContext::ConstFn) | None if !tcx.is_mir_available(def_id) => { - debug!("unused_generic_params: (no mir available) def_id={:?}", def_id); + debug!("no mir available"); return FiniteBitSet::new_empty(); } Some(_) if !tcx.is_ctfe_mir_available(def_id) => { - debug!("unused_generic_params: (no ctfe mir available) def_id={:?}", def_id); + debug!("no ctfe mir available"); return FiniteBitSet::new_empty(); } _ => {} @@ -72,9 +71,9 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet { generics.count().try_into().expect("more generic parameters than can fit into a `u32`"); let mut unused_parameters = FiniteBitSet::::new_empty(); unused_parameters.set_range(0..generics_count); - debug!("unused_generic_params: (start) unused_parameters={:?}", unused_parameters); + debug!(?unused_parameters, "(start)"); mark_used_by_default_parameters(tcx, def_id, generics, &mut unused_parameters); - debug!("unused_generic_params: (after default) unused_parameters={:?}", unused_parameters); + debug!(?unused_parameters, "(after default)"); // Visit MIR and accumululate used generic parameters. let body = match context { @@ -85,10 +84,10 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet { }; let mut vis = MarkUsedGenericParams { tcx, def_id, unused_parameters: &mut unused_parameters }; vis.visit_body(body); - debug!("unused_generic_params: (after visitor) unused_parameters={:?}", unused_parameters); + debug!(?unused_parameters, "(after visitor)"); mark_used_by_predicates(tcx, def_id, &mut unused_parameters); - debug!("unused_generic_params: (end) unused_parameters={:?}", unused_parameters); + debug!(?unused_parameters, "(end)"); // Emit errors for debugging and testing if enabled. if !unused_parameters.is_empty() { @@ -101,24 +100,55 @@ fn unused_generic_params(tcx: TyCtxt<'_>, def_id: DefId) -> FiniteBitSet { /// Some parameters are considered used-by-default, such as non-generic parameters and the dummy /// generic parameters from closures, this function marks them as used. `leaf_is_closure` should /// be `true` if the item that `unused_generic_params` was invoked on is a closure. +#[instrument(skip(tcx, def_id, generics, unused_parameters))] fn mark_used_by_default_parameters<'tcx>( tcx: TyCtxt<'tcx>, def_id: DefId, generics: &'tcx ty::Generics, unused_parameters: &mut FiniteBitSet, ) { - if !tcx.is_trait(def_id) && (tcx.is_closure(def_id) || tcx.type_of(def_id).is_generator()) { - for param in &generics.params { - debug!("mark_used_by_default_parameters: (closure/gen) param={:?}", param); - unused_parameters.clear(param.index); - } - } else { - for param in &generics.params { - debug!("mark_used_by_default_parameters: (other) param={:?}", param); - if let ty::GenericParamDefKind::Lifetime = param.kind { + match tcx.def_kind(def_id) { + DefKind::Closure | DefKind::Generator => { + for param in &generics.params { + debug!(?param, "(closure/gen)"); unused_parameters.clear(param.index); } } + DefKind::Mod + | DefKind::Struct + | DefKind::Union + | DefKind::Enum + | DefKind::Variant + | DefKind::Trait + | DefKind::TyAlias + | DefKind::ForeignTy + | DefKind::TraitAlias + | DefKind::AssocTy + | DefKind::TyParam + | DefKind::Fn + | DefKind::Const + | DefKind::ConstParam + | DefKind::Static + | DefKind::Ctor(_, _) + | DefKind::AssocFn + | DefKind::AssocConst + | DefKind::Macro(_) + | DefKind::ExternCrate + | DefKind::Use + | DefKind::ForeignMod + | DefKind::AnonConst + | DefKind::OpaqueTy + | DefKind::Field + | DefKind::LifetimeParam + | DefKind::GlobalAsm + | DefKind::Impl => { + for param in &generics.params { + debug!(?param, "(other)"); + if let ty::GenericParamDefKind::Lifetime = param.kind { + unused_parameters.clear(param.index); + } + } + } } if let Some(parent) = generics.parent { @@ -128,6 +158,7 @@ fn mark_used_by_default_parameters<'tcx>( /// Search the predicates on used generic parameters for any unused generic parameters, and mark /// those as used. +#[instrument(skip(tcx, def_id))] fn mark_used_by_predicates<'tcx>( tcx: TyCtxt<'tcx>, def_id: DefId, @@ -135,16 +166,12 @@ fn mark_used_by_predicates<'tcx>( ) { let def_id = tcx.closure_base_def_id(def_id); let predicates = tcx.explicit_predicates_of(def_id); - debug!("mark_used_by_predicates: predicates_of={:?}", predicates); let mut current_unused_parameters = FiniteBitSet::new_empty(); // Run to a fixed point to support `where T: Trait, U: Trait`, starting with an empty // bit set so that this is skipped if all parameters are already used. while current_unused_parameters != *unused_parameters { - debug!( - "mark_used_by_predicates: current_unused_parameters={:?} = unused_parameters={:?}", - current_unused_parameters, unused_parameters - ); + debug!(?current_unused_parameters, ?unused_parameters); current_unused_parameters = *unused_parameters; for (predicate, _) in predicates.predicates { @@ -169,13 +196,13 @@ fn mark_used_by_predicates<'tcx>( /// Emit errors for the function annotated by `#[rustc_polymorphize_error]`, labelling each generic /// parameter which was unused. +#[instrument(skip(tcx, generics))] fn emit_unused_generic_params_error<'tcx>( tcx: TyCtxt<'tcx>, def_id: DefId, generics: &'tcx ty::Generics, unused_parameters: &FiniteBitSet, ) { - debug!("emit_unused_generic_params_error: def_id={:?}", def_id); let base_def_id = tcx.closure_base_def_id(def_id); if !tcx .get_attrs(base_def_id) @@ -185,7 +212,6 @@ fn emit_unused_generic_params_error<'tcx>( return; } - debug!("emit_unused_generic_params_error: unused_parameters={:?}", unused_parameters); let fn_span = match tcx.opt_item_name(def_id) { Some(ident) => ident.span, _ => tcx.def_span(def_id), @@ -197,7 +223,7 @@ fn emit_unused_generic_params_error<'tcx>( while let Some(generics) = next_generics { for param in &generics.params { if unused_parameters.contains(param.index).unwrap_or(false) { - debug!("emit_unused_generic_params_error: param={:?}", param); + debug!(?param); let def_span = tcx.def_span(param.def_id); err.span_label(def_span, &format!("generic parameter `{}` is unused", param.name)); } @@ -219,25 +245,23 @@ struct MarkUsedGenericParams<'a, 'tcx> { impl<'a, 'tcx> MarkUsedGenericParams<'a, 'tcx> { /// Invoke `unused_generic_params` on a body contained within the current item (e.g. /// a closure, generator or constant). + #[instrument(skip(self, def_id, substs))] fn visit_child_body(&mut self, def_id: DefId, substs: SubstsRef<'tcx>) { let unused = self.tcx.unused_generic_params(def_id); - debug!( - "visit_child_body: unused_parameters={:?} unused={:?}", - self.unused_parameters, unused - ); + debug!(?self.unused_parameters, ?unused); for (i, arg) in substs.iter().enumerate() { let i = i.try_into().unwrap(); if !unused.contains(i).unwrap_or(false) { arg.visit_with(self); } } - debug!("visit_child_body: unused_parameters={:?}", self.unused_parameters); + debug!(?self.unused_parameters); } } impl<'a, 'tcx> Visitor<'tcx> for MarkUsedGenericParams<'a, 'tcx> { + #[instrument(skip(self, local))] fn visit_local_decl(&mut self, local: Local, local_decl: &LocalDecl<'tcx>) { - debug!("visit_local_decl: local_decl={:?}", local_decl); if local == Local::from_usize(1) { let def_kind = self.tcx.def_kind(self.def_id); if matches!(def_kind, DefKind::Closure | DefKind::Generator) { @@ -245,7 +269,7 @@ impl<'a, 'tcx> Visitor<'tcx> for MarkUsedGenericParams<'a, 'tcx> { // happens because the first argument to the closure is a reference to itself and // that will call `visit_substs`, resulting in each generic parameter captured being // considered used by default. - debug!("visit_local_decl: skipping closure substs"); + debug!("skipping closure substs"); return; } } @@ -263,15 +287,15 @@ impl<'a, 'tcx> Visitor<'tcx> for MarkUsedGenericParams<'a, 'tcx> { } impl<'a, 'tcx> TypeVisitor<'tcx> for MarkUsedGenericParams<'a, 'tcx> { + #[instrument(skip(self))] fn visit_const(&mut self, c: &'tcx Const<'tcx>) -> ControlFlow { - debug!("visit_const: c={:?}", c); if !c.has_param_types_or_consts() { return ControlFlow::CONTINUE; } match c.val { ty::ConstKind::Param(param) => { - debug!("visit_const: param={:?}", param); + debug!(?param); self.unused_parameters.clear(param.index); ControlFlow::CONTINUE } @@ -296,15 +320,15 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for MarkUsedGenericParams<'a, 'tcx> { } } + #[instrument(skip(self))] fn visit_ty(&mut self, ty: Ty<'tcx>) -> ControlFlow { - debug!("visit_ty: ty={:?}", ty); if !ty.has_param_types_or_consts() { return ControlFlow::CONTINUE; } match *ty.kind() { ty::Closure(def_id, substs) | ty::Generator(def_id, substs, ..) => { - debug!("visit_ty: def_id={:?}", def_id); + debug!(?def_id); // Avoid cycle errors with generators. if def_id == self.def_id { return ControlFlow::CONTINUE; @@ -316,7 +340,7 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for MarkUsedGenericParams<'a, 'tcx> { ControlFlow::CONTINUE } ty::Param(param) => { - debug!("visit_ty: param={:?}", param); + debug!(?param); self.unused_parameters.clear(param.index); ControlFlow::CONTINUE } @@ -333,8 +357,8 @@ struct HasUsedGenericParams<'a> { impl<'a, 'tcx> TypeVisitor<'tcx> for HasUsedGenericParams<'a> { type BreakTy = (); + #[instrument(skip(self))] fn visit_const(&mut self, c: &'tcx Const<'tcx>) -> ControlFlow { - debug!("visit_const: c={:?}", c); if !c.has_param_types_or_consts() { return ControlFlow::CONTINUE; } @@ -351,8 +375,8 @@ impl<'a, 'tcx> TypeVisitor<'tcx> for HasUsedGenericParams<'a> { } } + #[instrument(skip(self))] fn visit_ty(&mut self, ty: Ty<'tcx>) -> ControlFlow { - debug!("visit_ty: ty={:?}", ty); if !ty.has_param_types_or_consts() { return ControlFlow::CONTINUE; } diff --git a/compiler/rustc_mir/src/shim.rs b/compiler/rustc_mir/src/shim.rs index 6aaf27bdcb..796d024771 100644 --- a/compiler/rustc_mir/src/shim.rs +++ b/compiler/rustc_mir/src/shim.rs @@ -134,7 +134,7 @@ fn build_drop_shim<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId, ty: Option>) // Check if this is a generator, if so, return the drop glue for it if let Some(&ty::Generator(gen_def_id, substs, _)) = ty.map(|ty| ty.kind()) { - let body = &**tcx.optimized_mir(gen_def_id).generator_drop.as_ref().unwrap(); + let body = tcx.optimized_mir(gen_def_id).generator_drop().unwrap(); return body.clone().subst(tcx, substs); } @@ -421,7 +421,7 @@ impl CloneShimBuilder<'tcx> { let func = Operand::Constant(box Constant { span: self.span, user_ty: None, - literal: ty::Const::zero_sized(tcx, func_ty), + literal: ty::Const::zero_sized(tcx, func_ty).into(), }); let ref_loc = self.make_place( @@ -463,7 +463,7 @@ impl CloneShimBuilder<'tcx> { let cond = self.make_place(Mutability::Mut, tcx.types.bool); let compute_cond = self.make_statement(StatementKind::Assign(box ( cond, - Rvalue::BinaryOp(BinOp::Ne, Operand::Copy(end), Operand::Copy(beg)), + Rvalue::BinaryOp(BinOp::Ne, box (Operand::Copy(end), Operand::Copy(beg))), ))); // `if end != beg { goto loop_body; } else { goto loop_end; }` @@ -478,7 +478,7 @@ impl CloneShimBuilder<'tcx> { box Constant { span: self.span, user_ty: None, - literal: ty::Const::from_usize(self.tcx, value), + literal: ty::Const::from_usize(self.tcx, value).into(), } } @@ -509,7 +509,7 @@ impl CloneShimBuilder<'tcx> { Rvalue::Use(Operand::Constant(box Constant { span: self.span, user_ty: None, - literal: len, + literal: len.into(), })), ))), ]; @@ -536,8 +536,7 @@ impl CloneShimBuilder<'tcx> { Place::from(beg), Rvalue::BinaryOp( BinOp::Add, - Operand::Copy(Place::from(beg)), - Operand::Constant(self.make_usize(1)), + box (Operand::Copy(Place::from(beg)), Operand::Constant(self.make_usize(1))), ), )))]; self.block(statements, TerminatorKind::Goto { target: BasicBlock::new(1) }, false); @@ -590,8 +589,7 @@ impl CloneShimBuilder<'tcx> { Place::from(beg), Rvalue::BinaryOp( BinOp::Add, - Operand::Copy(Place::from(beg)), - Operand::Constant(self.make_usize(1)), + box (Operand::Copy(Place::from(beg)), Operand::Constant(self.make_usize(1))), ), ))); self.block(vec![statement], TerminatorKind::Goto { target: BasicBlock::new(6) }, true); @@ -770,7 +768,7 @@ fn build_call_shim<'tcx>( Operand::Constant(box Constant { span, user_ty: None, - literal: ty::Const::zero_sized(tcx, ty), + literal: ty::Const::zero_sized(tcx, ty).into(), }), rcvr.into_iter().collect::>(), ) diff --git a/compiler/rustc_mir/src/transform/check_consts/mod.rs b/compiler/rustc_mir/src/transform/check_consts/mod.rs index ba7bea4ac5..19aee033a6 100644 --- a/compiler/rustc_mir/src/transform/check_consts/mod.rs +++ b/compiler/rustc_mir/src/transform/check_consts/mod.rs @@ -85,8 +85,7 @@ pub fn rustc_allow_const_fn_unstable( feature_gate: Symbol, ) -> bool { let attrs = tcx.get_attrs(def_id); - attr::rustc_allow_const_fn_unstable(&tcx.sess, attrs) - .map_or(false, |mut features| features.any(|name| name == feature_gate)) + attr::rustc_allow_const_fn_unstable(&tcx.sess, attrs).any(|name| name == feature_gate) } // Returns `true` if the given `const fn` is "const-stable". diff --git a/compiler/rustc_mir/src/transform/check_consts/ops.rs b/compiler/rustc_mir/src/transform/check_consts/ops.rs index 6f98760a7b..a18c1f7452 100644 --- a/compiler/rustc_mir/src/transform/check_consts/ops.rs +++ b/compiler/rustc_mir/src/transform/check_consts/ops.rs @@ -377,6 +377,18 @@ impl NonConstOp for Panic { } } +/// A call to a `panic()` lang item where the first argument is _not_ a `&str`. +#[derive(Debug)] +pub struct PanicNonStr; +impl NonConstOp for PanicNonStr { + fn build_error(&self, ccx: &ConstCx<'_, 'tcx>, span: Span) -> DiagnosticBuilder<'tcx> { + ccx.tcx.sess.struct_span_err( + span, + "argument to `panic!()` in a const context must have type `&str`", + ) + } +} + #[derive(Debug)] pub struct RawPtrComparison; impl NonConstOp for RawPtrComparison { diff --git a/compiler/rustc_mir/src/transform/check_consts/qualifs.rs b/compiler/rustc_mir/src/transform/check_consts/qualifs.rs index 0ce1980f10..748f65cba2 100644 --- a/compiler/rustc_mir/src/transform/check_consts/qualifs.rs +++ b/compiler/rustc_mir/src/transform/check_consts/qualifs.rs @@ -168,7 +168,7 @@ where | Rvalue::UnaryOp(_, operand) | Rvalue::Cast(_, operand, _) => in_operand::(cx, in_local, operand), - Rvalue::BinaryOp(_, lhs, rhs) | Rvalue::CheckedBinaryOp(_, lhs, rhs) => { + Rvalue::BinaryOp(_, box (lhs, rhs)) | Rvalue::CheckedBinaryOp(_, box (lhs, rhs)) => { in_operand::(cx, in_local, lhs) || in_operand::(cx, in_local, rhs) } @@ -246,25 +246,27 @@ where }; // Check the qualifs of the value of `const` items. - if let ty::ConstKind::Unevaluated(def, _, promoted) = constant.literal.val { - assert!(promoted.is_none()); - // Don't peek inside trait associated constants. - if cx.tcx.trait_of_item(def.did).is_none() { - let qualifs = if let Some((did, param_did)) = def.as_const_arg() { - cx.tcx.at(constant.span).mir_const_qualif_const_arg((did, param_did)) - } else { - cx.tcx.at(constant.span).mir_const_qualif(def.did) - }; - - if !Q::in_qualifs(&qualifs) { - return false; - } + if let Some(ct) = constant.literal.const_for_ty() { + if let ty::ConstKind::Unevaluated(def, _, promoted) = ct.val { + assert!(promoted.is_none()); + // Don't peek inside trait associated constants. + if cx.tcx.trait_of_item(def.did).is_none() { + let qualifs = if let Some((did, param_did)) = def.as_const_arg() { + cx.tcx.at(constant.span).mir_const_qualif_const_arg((did, param_did)) + } else { + cx.tcx.at(constant.span).mir_const_qualif(def.did) + }; + + if !Q::in_qualifs(&qualifs) { + return false; + } - // Just in case the type is more specific than - // the definition, e.g., impl associated const - // with type parameters, take it into account. + // Just in case the type is more specific than + // the definition, e.g., impl associated const + // with type parameters, take it into account. + } } } // Otherwise use the qualifs of the type. - Q::in_any_value_of_ty(cx, constant.literal.ty) + Q::in_any_value_of_ty(cx, constant.literal.ty()) } diff --git a/compiler/rustc_mir/src/transform/check_consts/validation.rs b/compiler/rustc_mir/src/transform/check_consts/validation.rs index a92997ddda..1ad7b8fbbd 100644 --- a/compiler/rustc_mir/src/transform/check_consts/validation.rs +++ b/compiler/rustc_mir/src/transform/check_consts/validation.rs @@ -222,7 +222,7 @@ impl Validator<'mir, 'tcx> { // `async` functions cannot be `const fn`. This is checked during AST lowering, so there's // no need to emit duplicate errors here. - if is_async_fn(self.ccx) || body.generator_kind.is_some() { + if is_async_fn(self.ccx) || body.generator.is_some() { tcx.sess.delay_span_bug(body.span, "`async` functions cannot be `const fn`"); return; } @@ -515,7 +515,7 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> { // Special-case reborrows to be more like a copy of a reference. match *rvalue { Rvalue::Ref(_, kind, place) => { - if let Some(reborrowed_proj) = place_as_reborrow(self.tcx, self.body, place) { + if let Some(reborrowed_place_ref) = place_as_reborrow(self.tcx, self.body, place) { let ctx = match kind { BorrowKind::Shared => { PlaceContext::NonMutatingUse(NonMutatingUseContext::SharedBorrow) @@ -530,21 +530,21 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> { PlaceContext::MutatingUse(MutatingUseContext::Borrow) } }; - self.visit_local(&place.local, ctx, location); - self.visit_projection(place.local, reborrowed_proj, ctx, location); + self.visit_local(&reborrowed_place_ref.local, ctx, location); + self.visit_projection(reborrowed_place_ref, ctx, location); return; } } Rvalue::AddressOf(mutbl, place) => { - if let Some(reborrowed_proj) = place_as_reborrow(self.tcx, self.body, place) { + if let Some(reborrowed_place_ref) = 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_local(&place.local, ctx, location); - self.visit_projection(place.local, reborrowed_proj, ctx, location); + self.visit_local(&reborrowed_place_ref.local, ctx, location); + self.visit_projection(reborrowed_place_ref, ctx, location); return; } } @@ -684,8 +684,8 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> { } } - Rvalue::BinaryOp(op, ref lhs, ref rhs) - | Rvalue::CheckedBinaryOp(op, ref lhs, ref rhs) => { + Rvalue::BinaryOp(op, box (ref lhs, ref rhs)) + | Rvalue::CheckedBinaryOp(op, box (ref lhs, ref rhs)) => { let lhs_ty = lhs.ty(self.body, self.tcx); let rhs_ty = rhs.ty(self.body, self.tcx); @@ -808,18 +808,19 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> { | StatementKind::Retag { .. } | StatementKind::AscribeUserType(..) | StatementKind::Coverage(..) + | StatementKind::CopyNonOverlapping(..) | StatementKind::Nop => {} } } - #[instrument(skip(self))] + #[instrument(level = "debug", skip(self))] fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, location: Location) { use rustc_target::spec::abi::Abi::RustIntrinsic; self.super_terminator(terminator, location); match &terminator.kind { - TerminatorKind::Call { func, .. } => { + TerminatorKind::Call { func, args, .. } => { let ConstCx { tcx, body, param_env, .. } = *self.ccx; let caller = self.def_id().to_def_id(); @@ -881,9 +882,17 @@ impl Visitor<'tcx> for Validator<'mir, 'tcx> { } // At this point, we are calling a function, `callee`, whose `DefId` is known... - if is_lang_panic_fn(tcx, callee) { self.check_op(ops::Panic); + + // const-eval of the `begin_panic` fn assumes the argument is `&str` + if Some(callee) == tcx.lang_items().begin_panic_fn() { + match args[0].ty(&self.ccx.body.local_decls, tcx).kind() { + ty::Ref(_, ty, _) if ty.is_str() => (), + _ => self.check_op(ops::PanicNonStr), + } + } + return; } @@ -1039,7 +1048,7 @@ fn place_as_reborrow( tcx: TyCtxt<'tcx>, body: &Body<'tcx>, place: Place<'tcx>, -) -> Option<&'a [PlaceElem<'tcx>]> { +) -> Option> { match place.as_ref().last_projection() { Some((place_base, ProjectionElem::Deref)) => { // A borrow of a `static` also looks like `&(*_1)` in the MIR, but `_1` is a `const` @@ -1048,13 +1057,14 @@ fn place_as_reborrow( None } else { // 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_base.ty(body, tcx).ty; - match inner_ty.kind() { - ty::Ref(..) => Some(place_base.projection), - _ => None, + + if let ty::Ref(..) = inner_ty.kind() { + return Some(place_base); + } else { + return None; } } } diff --git a/compiler/rustc_mir/src/transform/check_unsafety.rs b/compiler/rustc_mir/src/transform/check_unsafety.rs index f0472758df..532d201e05 100644 --- a/compiler/rustc_mir/src/transform/check_unsafety.rs +++ b/compiler/rustc_mir/src/transform/check_unsafety.rs @@ -123,6 +123,7 @@ impl<'a, 'tcx> Visitor<'tcx> for UnsafetyChecker<'a, 'tcx> { UnsafetyViolationKind::General, UnsafetyViolationDetails::UseOfInlineAssembly, ), + StatementKind::CopyNonOverlapping(..) => unreachable!(), } self.super_statement(statement, location); } @@ -340,7 +341,7 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> { false } // With the RFC 2585, no longer allow `unsafe` operations in `unsafe fn`s - Safety::FnUnsafe if self.tcx.features().unsafe_block_in_unsafe_fn => { + Safety::FnUnsafe => { for violation in violations { let mut violation = *violation; @@ -355,8 +356,7 @@ impl<'a, 'tcx> UnsafetyChecker<'a, 'tcx> { } false } - // `unsafe` function bodies allow unsafe without additional unsafe blocks (before RFC 2585) - Safety::BuiltinUnsafe | Safety::FnUnsafe => true, + Safety::BuiltinUnsafe => true, Safety::ExplicitUnsafe(hir_id) => { // mark unsafe block as used if there are any unsafe operations inside if !violations.is_empty() { diff --git a/compiler/rustc_mir/src/transform/const_goto.rs b/compiler/rustc_mir/src/transform/const_goto.rs new file mode 100644 index 0000000000..b5c8b4bebc --- /dev/null +++ b/compiler/rustc_mir/src/transform/const_goto.rs @@ -0,0 +1,122 @@ +//! This pass optimizes the following sequence +//! ```rust,ignore (example) +//! bb2: { +//! _2 = const true; +//! goto -> bb3; +//! } +//! +//! bb3: { +//! switchInt(_2) -> [false: bb4, otherwise: bb5]; +//! } +//! ``` +//! into +//! ```rust,ignore (example) +//! bb2: { +//! _2 = const true; +//! goto -> bb5; +//! } +//! ``` + +use crate::transform::MirPass; +use rustc_middle::mir::*; +use rustc_middle::ty::TyCtxt; +use rustc_middle::{mir::visit::Visitor, ty::ParamEnv}; + +use super::simplify::{simplify_cfg, simplify_locals}; + +pub struct ConstGoto; + +impl<'tcx> MirPass<'tcx> for ConstGoto { + fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { + if tcx.sess.mir_opt_level() < 4 { + return; + } + trace!("Running ConstGoto on {:?}", body.source); + let param_env = tcx.param_env_reveal_all_normalized(body.source.def_id()); + let mut opt_finder = + ConstGotoOptimizationFinder { tcx, body, optimizations: vec![], param_env }; + opt_finder.visit_body(body); + let should_simplify = !opt_finder.optimizations.is_empty(); + for opt in opt_finder.optimizations { + let terminator = body.basic_blocks_mut()[opt.bb_with_goto].terminator_mut(); + let new_goto = TerminatorKind::Goto { target: opt.target_to_use_in_goto }; + debug!("SUCCESS: replacing `{:?}` with `{:?}`", terminator.kind, new_goto); + terminator.kind = new_goto; + } + + // if we applied optimizations, we potentially have some cfg to cleanup to + // make it easier for further passes + if should_simplify { + simplify_cfg(body); + simplify_locals(body, tcx); + } + } +} + +impl<'a, 'tcx> Visitor<'tcx> for ConstGotoOptimizationFinder<'a, 'tcx> { + fn visit_terminator(&mut self, terminator: &Terminator<'tcx>, location: Location) { + let _: Option<_> = try { + let target = terminator.kind.as_goto()?; + // We only apply this optimization if the last statement is a const assignment + let last_statement = self.body.basic_blocks()[location.block].statements.last()?; + + if let (place, Rvalue::Use(Operand::Constant(_const))) = + last_statement.kind.as_assign()? + { + // We found a constant being assigned to `place`. + // Now check that the target of this Goto switches on this place. + let target_bb = &self.body.basic_blocks()[target]; + + // FIXME(simonvandel): We are conservative here when we don't allow + // any statements in the target basic block. + // This could probably be relaxed to allow `StorageDead`s which could be + // copied to the predecessor of this block. + if !target_bb.statements.is_empty() { + None? + } + + let target_bb_terminator = target_bb.terminator(); + let (discr, switch_ty, targets) = target_bb_terminator.kind.as_switch()?; + if discr.place() == Some(*place) { + // We now know that the Switch matches on the const place, and it is statementless + // Now find which value in the Switch matches the const value. + let const_value = + _const.literal.try_eval_bits(self.tcx, self.param_env, switch_ty)?; + let found_value_idx_option = targets + .iter() + .enumerate() + .find(|(_, (value, _))| const_value == *value) + .map(|(idx, _)| idx); + + let target_to_use_in_goto = + if let Some(found_value_idx) = found_value_idx_option { + targets.iter().nth(found_value_idx).unwrap().1 + } else { + // If we did not find the const value in values, it must be the otherwise case + targets.otherwise() + }; + + self.optimizations.push(OptimizationToApply { + bb_with_goto: location.block, + target_to_use_in_goto, + }); + } + } + Some(()) + }; + + self.super_terminator(terminator, location); + } +} + +struct OptimizationToApply { + bb_with_goto: BasicBlock, + target_to_use_in_goto: BasicBlock, +} + +pub struct ConstGotoOptimizationFinder<'a, 'tcx> { + tcx: TyCtxt<'tcx>, + body: &'a Body<'tcx>, + param_env: ParamEnv<'tcx>, + optimizations: Vec, +} diff --git a/compiler/rustc_mir/src/transform/const_prop.rs b/compiler/rustc_mir/src/transform/const_prop.rs index fd5c223690..cc8669d970 100644 --- a/compiler/rustc_mir/src/transform/const_prop.rs +++ b/compiler/rustc_mir/src/transform/const_prop.rs @@ -13,9 +13,9 @@ use rustc_middle::mir::visit::{ MutVisitor, MutatingUseContext, NonMutatingUseContext, PlaceContext, Visitor, }; use rustc_middle::mir::{ - AssertKind, BasicBlock, BinOp, Body, ClearCrossCrate, Constant, Local, LocalDecl, LocalKind, - Location, Operand, Place, Rvalue, SourceInfo, SourceScope, SourceScopeData, Statement, - StatementKind, Terminator, TerminatorKind, UnOp, RETURN_PLACE, + AssertKind, BasicBlock, BinOp, Body, ClearCrossCrate, Constant, ConstantKind, Local, LocalDecl, + LocalKind, Location, Operand, Place, Rvalue, SourceInfo, SourceScope, SourceScopeData, + Statement, StatementKind, Terminator, TerminatorKind, UnOp, RETURN_PLACE, }; use rustc_middle::ty::layout::{HasTyCtxt, LayoutError, TyAndLayout}; use rustc_middle::ty::subst::{InternalSubsts, Subst}; @@ -140,7 +140,7 @@ impl<'tcx> MirPass<'tcx> for ConstProp { body.arg_count, Default::default(), body.span, - body.generator_kind, + body.generator_kind(), ); // FIXME(oli-obk, eddyb) Optimize locals (or even local paths) to hold @@ -197,7 +197,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine<'mir, 'tcx> _instance: ty::Instance<'tcx>, _abi: Abi, _args: &[OpTy<'tcx>], - _ret: Option<(PlaceTy<'tcx>, BasicBlock)>, + _ret: Option<(&PlaceTy<'tcx>, BasicBlock)>, _unwind: Option, ) -> InterpResult<'tcx, Option<&'mir Body<'tcx>>> { Ok(None) @@ -207,7 +207,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine<'mir, 'tcx> _ecx: &mut InterpCx<'mir, 'tcx, Self>, _instance: ty::Instance<'tcx>, _args: &[OpTy<'tcx>], - _ret: Option<(PlaceTy<'tcx>, BasicBlock)>, + _ret: Option<(&PlaceTy<'tcx>, BasicBlock)>, _unwind: Option, ) -> InterpResult<'tcx> { throw_machine_stop_str!("calling intrinsics isn't supported in ConstProp") @@ -228,8 +228,8 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine<'mir, 'tcx> fn binary_ptr_op( _ecx: &InterpCx<'mir, 'tcx, Self>, _bin_op: BinOp, - _left: ImmTy<'tcx>, - _right: ImmTy<'tcx>, + _left: &ImmTy<'tcx>, + _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_machine_stop_str!("pointer arithmetic or comparisons aren't supported in ConstProp") @@ -237,7 +237,7 @@ impl<'mir, 'tcx> interpret::Machine<'mir, 'tcx> for ConstPropMachine<'mir, 'tcx> fn box_alloc( _ecx: &mut InterpCx<'mir, 'tcx, Self>, - _dest: PlaceTy<'tcx>, + _dest: &PlaceTy<'tcx>, ) -> InterpResult<'tcx> { throw_machine_stop_str!("can't const prop heap allocations") } @@ -392,12 +392,12 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { .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)); + .map(|ret_layout| ecx.allocate(ret_layout, MemoryKind::Stack).into()); ecx.push_stack_frame( Instance::new(def_id, substs), dummy_body, - ret.map(Into::into), + ret.as_ref(), StackPopCleanup::None { cleanup: false }, ) .expect("failed to push initial stack frame"); @@ -426,7 +426,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { // Try to read the local 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. - Some(match self.ecx.try_read_immediate(op) { + Some(match self.ecx.try_read_immediate(&op) { Ok(Ok(imm)) => imm.into(), _ => op, }) @@ -466,8 +466,8 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { // an allocation, which we should avoid. When that happens, // dedicated error variants should be introduced instead. assert!( - !error.kind.allocates(), - "const-prop encountered allocating error: {}", + !error.kind().formatted_string(), + "const-prop encountered formatting error: {}", error ); None @@ -482,18 +482,21 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { return None; } - match self.ecx.const_to_op(c.literal, None) { + match self.ecx.mir_const_to_op(&c.literal, None) { Ok(op) => Some(op), Err(error) => { let tcx = self.ecx.tcx.at(c.span); let err = ConstEvalErr::new(&self.ecx, error, Some(c.span)); 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(), + let lint_only = match c.literal { + ConstantKind::Ty(ct) => match ct.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(), + }, + ConstantKind::Val(_, ty) => ty.needs_subst(), }; if lint_only { // Out of backwards compatibility we cannot report hard errors in unused @@ -548,8 +551,8 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { source_info: SourceInfo, ) -> Option<()> { if let (val, true) = self.use_ecx(|this| { - let val = this.ecx.read_immediate(this.ecx.eval_operand(arg, None)?)?; - let (_res, overflow, _ty) = this.ecx.overflowing_unary_op(op, val)?; + let val = this.ecx.read_immediate(&this.ecx.eval_operand(arg, None)?)?; + let (_res, overflow, _ty) = this.ecx.overflowing_unary_op(op, &val)?; Ok((val, overflow)) })? { // `AssertKind` only has an `OverflowNeg` variant, so make sure that is @@ -573,8 +576,8 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { right: &Operand<'tcx>, source_info: SourceInfo, ) -> Option<()> { - let r = self.use_ecx(|this| this.ecx.read_immediate(this.ecx.eval_operand(right, None)?)); - let l = self.use_ecx(|this| this.ecx.read_immediate(this.ecx.eval_operand(left, None)?)); + let r = self.use_ecx(|this| this.ecx.read_immediate(&this.ecx.eval_operand(right, None)?)); + let l = self.use_ecx(|this| this.ecx.read_immediate(&this.ecx.eval_operand(left, None)?)); // Check for exceeding shifts *even if* we cannot evaluate the LHS. if op == BinOp::Shr || op == BinOp::Shl { let r = r?; @@ -609,7 +612,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { } } - if let (Some(l), Some(r)) = (l, r) { + if let (Some(l), Some(r)) = (&l, &r) { // The remaining operators are handled through `overflowing_binary_op`. if self.use_ecx(|this| { let (_res, overflow, _ty) = this.ecx.overflowing_binary_op(op, l, r)?; @@ -630,7 +633,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { match *operand { Operand::Copy(l) | Operand::Move(l) => { if let Some(value) = self.get_const(l) { - if self.should_const_prop(value) { + if self.should_const_prop(&value) { // FIXME(felix91gr): this code only handles `Scalar` cases. // For now, we're not handling `ScalarPair` cases because // doing so here would require a lot of code duplication. @@ -676,11 +679,11 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { trace!("checking UnaryOp(op = {:?}, arg = {:?})", op, arg); self.check_unary_op(*op, arg, source_info)?; } - Rvalue::BinaryOp(op, left, right) => { + Rvalue::BinaryOp(op, box (left, right)) => { trace!("checking BinaryOp(op = {:?}, left = {:?}, right = {:?})", op, left, right); self.check_binary_op(*op, left, right, source_info)?; } - Rvalue::CheckedBinaryOp(op, left, right) => { + Rvalue::CheckedBinaryOp(op, box (left, right)) => { trace!( "checking CheckedBinaryOp(op = {:?}, left = {:?}, right = {:?})", op, @@ -725,7 +728,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { return None; } - if self.tcx.sess.opts.debugging_opts.mir_opt_level >= 3 { + if self.tcx.sess.mir_opt_level() >= 4 { self.eval_rvalue_with_identities(rvalue, place) } else { self.use_ecx(|this| this.ecx.eval_rvalue_into_place(rvalue, place)) @@ -740,12 +743,13 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { ) -> Option<()> { self.use_ecx(|this| { match rvalue { - Rvalue::BinaryOp(op, left, right) | Rvalue::CheckedBinaryOp(op, left, right) => { + Rvalue::BinaryOp(op, box (left, right)) + | Rvalue::CheckedBinaryOp(op, box (left, right)) => { let l = this.ecx.eval_operand(left, None); let r = this.ecx.eval_operand(right, None); let const_arg = match (l, r) { - (Ok(x), Err(_)) | (Err(_), Ok(x)) => this.ecx.read_immediate(x)?, + (Ok(ref x), Err(_)) | (Err(_), Ok(ref x)) => this.ecx.read_immediate(x)?, (Err(e), Err(_)) => return Err(e), (Ok(_), Ok(_)) => { this.ecx.eval_rvalue_into_place(rvalue, place)?; @@ -760,26 +764,26 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { match op { BinOp::BitAnd => { if arg_value == 0 { - this.ecx.write_immediate(*const_arg, dest)?; + this.ecx.write_immediate(*const_arg, &dest)?; } } BinOp::BitOr => { if arg_value == const_arg.layout.size.truncate(u128::MAX) || (const_arg.layout.ty.is_bool() && arg_value == 1) { - this.ecx.write_immediate(*const_arg, dest)?; + this.ecx.write_immediate(*const_arg, &dest)?; } } BinOp::Mul => { if const_arg.layout.ty.is_integral() && arg_value == 0 { - if let Rvalue::CheckedBinaryOp(_, _, _) = rvalue { + if let Rvalue::CheckedBinaryOp(_, _) = rvalue { let val = Immediate::ScalarPair( const_arg.to_scalar()?.into(), Scalar::from_bool(false).into(), ); - this.ecx.write_immediate(val, dest)?; + this.ecx.write_immediate(val, &dest)?; } else { - this.ecx.write_immediate(*const_arg, dest)?; + this.ecx.write_immediate(*const_arg, &dest)?; } } } @@ -802,20 +806,23 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { Operand::Constant(Box::new(Constant { span, user_ty: None, - literal: ty::Const::from_scalar(self.tcx, scalar, ty), + literal: ty::Const::from_scalar(self.tcx, scalar, ty).into(), })) } fn replace_with_const( &mut self, rval: &mut Rvalue<'tcx>, - value: OpTy<'tcx>, + value: &OpTy<'tcx>, source_info: SourceInfo, ) { if let Rvalue::Use(Operand::Constant(c)) = rval { - if !matches!(c.literal.val, ConstKind::Unevaluated(..)) { - trace!("skipping replace of Rvalue::Use({:?} because it is already a const", c); - return; + match c.literal { + ConstantKind::Ty(c) if matches!(c.val, ConstKind::Unevaluated(..)) => {} + _ => { + trace!("skipping replace of Rvalue::Use({:?} because it is already a const", c); + return; + } } } @@ -882,13 +889,17 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { *rval = Rvalue::Use(Operand::Constant(Box::new(Constant { span: source_info.span, user_ty: None, - literal: self.ecx.tcx.mk_const(ty::Const { - ty, - val: ty::ConstKind::Value(ConstValue::ByRef { - alloc, - offset: Size::ZERO, - }), - }), + literal: self + .ecx + .tcx + .mk_const(ty::Const { + ty, + val: ty::ConstKind::Value(ConstValue::ByRef { + alloc, + offset: Size::ZERO, + }), + }) + .into(), }))); } } @@ -902,8 +913,8 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { } /// Returns `true` if and only if this `op` should be const-propagated into. - fn should_const_prop(&mut self, op: OpTy<'tcx>) -> bool { - let mir_opt_level = self.tcx.sess.opts.debugging_opts.mir_opt_level; + fn should_const_prop(&mut self, op: &OpTy<'tcx>) -> bool { + let mir_opt_level = self.tcx.sess.mir_opt_level(); if mir_opt_level == 0 { return false; @@ -913,7 +924,7 @@ impl<'mir, 'tcx> ConstPropagator<'mir, 'tcx> { return false; } - match *op { + match **op { interpret::Operand::Immediate(Immediate::Scalar(ScalarMaybeUninit::Scalar(s))) => { s.is_bits() } @@ -1071,9 +1082,9 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> { fn visit_operand(&mut self, operand: &mut Operand<'tcx>, location: Location) { self.super_operand(operand, location); - // Only const prop copies and moves on `mir_opt_level=2` as doing so + // Only const prop copies and moves on `mir_opt_level=3` as doing so // currently slightly increases compile time in some cases. - if self.tcx.sess.opts.debugging_opts.mir_opt_level >= 2 { + if self.tcx.sess.mir_opt_level() >= 3 { self.propagate_operand(operand) } } @@ -1094,7 +1105,7 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> { // This will return None if the above `const_prop` invocation only "wrote" a // type whose creation requires no write. E.g. a generator whose initial state // consists solely of uninitialized memory (so it doesn't capture any locals). - if let Some(value) = self.get_const(place) { + if let Some(ref value) = self.get_const(place) { if self.should_const_prop(value) { trace!("replacing {:?} with {:?}", rval, value); self.replace_with_const(rval, value, source_info); @@ -1177,10 +1188,10 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> { 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) { + if let Some(ref value) = self.eval_operand(&cond, source_info) { trace!("assertion on {:?} should be {:?}", value, expected); let expected = ScalarMaybeUninit::from(Scalar::from_bool(*expected)); - let value_const = self.ecx.read_scalar(value).unwrap(); + let value_const = self.ecx.read_scalar(&value).unwrap(); if expected != value_const { enum DbgVal { Val(T), @@ -1198,9 +1209,9 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> { // This can be `None` if the lhs wasn't const propagated and we just // triggered the assert on the value of the rhs. match self.eval_operand(op, source_info) { - Some(op) => { - DbgVal::Val(self.ecx.read_immediate(op).unwrap().to_const_int()) - } + Some(op) => DbgVal::Val( + self.ecx.read_immediate(&op).unwrap().to_const_int(), + ), None => DbgVal::Underscore, } }; @@ -1253,7 +1264,7 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> { TerminatorKind::SwitchInt { ref mut discr, .. } => { // FIXME: This is currently redundant with `visit_operand`, but sadly // always visiting operands currently causes a perf regression in LLVM codegen, so - // `visit_operand` currently only runs for propagates places for `mir_opt_level=3`. + // `visit_operand` currently only runs for propagates places for `mir_opt_level=4`. self.propagate_operand(discr) } // None of these have Operands to const-propagate. @@ -1272,7 +1283,7 @@ impl<'mir, 'tcx> MutVisitor<'tcx> for ConstPropagator<'mir, 'tcx> { // Every argument in our function calls have already been propagated in `visit_operand`. // // NOTE: because LLVM codegen gives slight performance regressions with it, so this is - // gated on `mir_opt_level=2`. + // gated on `mir_opt_level=3`. TerminatorKind::Call { .. } => {} } diff --git a/compiler/rustc_mir/src/transform/coverage/debug.rs b/compiler/rustc_mir/src/transform/coverage/debug.rs index 2cd0dc6b1f..aabfee53ac 100644 --- a/compiler/rustc_mir/src/transform/coverage/debug.rs +++ b/compiler/rustc_mir/src/transform/coverage/debug.rs @@ -285,10 +285,8 @@ impl DebugCounters { ), }; counters - .insert(id, DebugCounter::new(counter_kind.clone(), some_block_label)) - .expect_none( - "attempt to add the same counter_kind to DebugCounters more than once", - ); + .try_insert(id, DebugCounter::new(counter_kind.clone(), some_block_label)) + .expect("attempt to add the same counter_kind to DebugCounters more than once"); } } @@ -479,9 +477,9 @@ impl GraphvizData { counter_kind: &CoverageKind, ) { if let Some(edge_to_counter) = self.some_edge_to_counter.as_mut() { - edge_to_counter.insert((from_bcb, to_bb), counter_kind.clone()).expect_none( - "invalid attempt to insert more than one edge counter for the same edge", - ); + edge_to_counter + .try_insert((from_bcb, to_bb), counter_kind.clone()) + .expect("invalid attempt to insert more than one edge counter for the same edge"); } } diff --git a/compiler/rustc_mir/src/transform/coverage/graph.rs b/compiler/rustc_mir/src/transform/coverage/graph.rs index e58b915f12..6f5fa858e2 100644 --- a/compiler/rustc_mir/src/transform/coverage/graph.rs +++ b/compiler/rustc_mir/src/transform/coverage/graph.rs @@ -392,10 +392,8 @@ impl BasicCoverageBlockData { } } let operand = counter_kind.as_operand_id(); - if let Some(replaced) = self - .edge_from_bcbs - .get_or_insert_with(FxHashMap::default) - .insert(from_bcb, counter_kind) + if let Some(replaced) = + self.edge_from_bcbs.get_or_insert_default().insert(from_bcb, counter_kind) { Error::from_string(format!( "attempt to set an edge counter more than once; from_bcb: \ diff --git a/compiler/rustc_mir/src/transform/coverage/query.rs b/compiler/rustc_mir/src/transform/coverage/query.rs index 4b455a6a1b..de8447f197 100644 --- a/compiler/rustc_mir/src/transform/coverage/query.rs +++ b/compiler/rustc_mir/src/transform/coverage/query.rs @@ -1,8 +1,7 @@ use super::*; use rustc_middle::mir::coverage::*; -use rustc_middle::mir::visit::Visitor; -use rustc_middle::mir::{self, Coverage, CoverageInfo, Location}; +use rustc_middle::mir::{self, Body, Coverage, CoverageInfo}; use rustc_middle::ty::query::Providers; use rustc_middle::ty::{self, TyCtxt}; use rustc_span::def_id::DefId; @@ -85,10 +84,21 @@ impl CoverageVisitor { } } } -} -impl Visitor<'_> for CoverageVisitor { - fn visit_coverage(&mut self, coverage: &Coverage, _location: Location) { + fn visit_body(&mut self, body: &Body<'_>) { + for bb_data in body.basic_blocks().iter() { + for statement in bb_data.statements.iter() { + if let StatementKind::Coverage(box ref coverage) = statement.kind { + if is_inlined(body, statement) { + continue; + } + self.visit_coverage(coverage); + } + } + } + } + + fn visit_coverage(&mut self, coverage: &Coverage) { if self.add_missing_operands { match coverage.kind { CoverageKind::Expression { lhs, rhs, .. } => { @@ -129,10 +139,14 @@ fn coverageinfo_from_mir<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> CoverageInfo } fn covered_file_name<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Option { - for bb_data in mir_body(tcx, def_id).basic_blocks().iter() { + let body = mir_body(tcx, def_id); + for bb_data in body.basic_blocks().iter() { for statement in bb_data.statements.iter() { if let StatementKind::Coverage(box ref coverage) = statement.kind { if let Some(code_region) = coverage.code_region.as_ref() { + if is_inlined(body, statement) { + continue; + } return Some(code_region.file_name); } } @@ -151,13 +165,17 @@ fn mir_body<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> &'tcx mir::Body<'tcx> { } fn covered_code_regions<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Vec<&'tcx CodeRegion> { - mir_body(tcx, def_id) - .basic_blocks() + let body = mir_body(tcx, def_id); + body.basic_blocks() .iter() .map(|data| { data.statements.iter().filter_map(|statement| match statement.kind { StatementKind::Coverage(box ref coverage) => { - coverage.code_region.as_ref() // may be None + if is_inlined(body, statement) { + None + } else { + coverage.code_region.as_ref() // may be None + } } _ => None, }) @@ -165,3 +183,8 @@ fn covered_code_regions<'tcx>(tcx: TyCtxt<'tcx>, def_id: DefId) -> Vec<&'tcx Cod .flatten() .collect() } + +fn is_inlined(body: &Body<'_>, statement: &Statement<'_>) -> bool { + let scope_data = &body.source_scopes[statement.source_info.scope]; + scope_data.inlined.is_some() || scope_data.inlined_parent_scope.is_some() +} diff --git a/compiler/rustc_mir/src/transform/coverage/spans.rs b/compiler/rustc_mir/src/transform/coverage/spans.rs index fd3e782f6d..e7097ce861 100644 --- a/compiler/rustc_mir/src/transform/coverage/spans.rs +++ b/compiler/rustc_mir/src/transform/coverage/spans.rs @@ -687,6 +687,7 @@ pub(super) fn filtered_statement_span( // Retain spans from all other statements StatementKind::FakeRead(_, _) // Not including `ForGuardBinding` + | StatementKind::CopyNonOverlapping(..) | StatementKind::Assign(_) | StatementKind::SetDiscriminant { .. } | StatementKind::LlvmInlineAsm(_) diff --git a/compiler/rustc_mir/src/transform/coverage/tests.rs b/compiler/rustc_mir/src/transform/coverage/tests.rs index d36f1b8e5f..7a9bfaad88 100644 --- a/compiler/rustc_mir/src/transform/coverage/tests.rs +++ b/compiler/rustc_mir/src/transform/coverage/tests.rs @@ -327,7 +327,7 @@ macro_rules! assert_successors { fn test_covgraph_goto_switchint() { let mir_body = goto_switchint(); if false { - println!("basic_blocks = {}", debug_basic_blocks(&mir_body)); + eprintln!("basic_blocks = {}", debug_basic_blocks(&mir_body)); } let basic_coverage_blocks = graph::CoverageGraph::from_mir(&mir_body); print_coverage_graphviz("covgraph_goto_switchint ", &mir_body, &basic_coverage_blocks); @@ -583,11 +583,11 @@ fn test_find_loop_backedges_none() { let mir_body = goto_switchint(); let basic_coverage_blocks = graph::CoverageGraph::from_mir(&mir_body); if false { - println!( + eprintln!( "basic_coverage_blocks = {:?}", basic_coverage_blocks.iter_enumerated().collect::>() ); - println!("successors = {:?}", basic_coverage_blocks.successors); + eprintln!("successors = {:?}", basic_coverage_blocks.successors); } let backedges = graph::find_loop_backedges(&basic_coverage_blocks); assert_eq!( diff --git a/compiler/rustc_mir/src/transform/deduplicate_blocks.rs b/compiler/rustc_mir/src/transform/deduplicate_blocks.rs new file mode 100644 index 0000000000..e102512e1f --- /dev/null +++ b/compiler/rustc_mir/src/transform/deduplicate_blocks.rs @@ -0,0 +1,193 @@ +//! This pass finds basic blocks that are completely equal, +//! and replaces all uses with just one of them. + +use std::{collections::hash_map::Entry, hash::Hash, hash::Hasher}; + +use crate::transform::MirPass; + +use rustc_data_structures::fx::FxHashMap; +use rustc_middle::mir::visit::MutVisitor; +use rustc_middle::mir::*; +use rustc_middle::ty::TyCtxt; + +use super::simplify::simplify_cfg; + +pub struct DeduplicateBlocks; + +impl<'tcx> MirPass<'tcx> for DeduplicateBlocks { + fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { + if tcx.sess.mir_opt_level() < 4 { + return; + } + debug!("Running DeduplicateBlocks on `{:?}`", body.source); + let duplicates = find_duplicates(body); + let has_opts_to_apply = !duplicates.is_empty(); + + if has_opts_to_apply { + let mut opt_applier = OptApplier { tcx, duplicates }; + opt_applier.visit_body(body); + simplify_cfg(body); + } + } +} + +struct OptApplier<'tcx> { + tcx: TyCtxt<'tcx>, + duplicates: FxHashMap, +} + +impl<'tcx> MutVisitor<'tcx> for OptApplier<'tcx> { + fn tcx(&self) -> TyCtxt<'tcx> { + self.tcx + } + + fn visit_terminator(&mut self, terminator: &mut Terminator<'tcx>, location: Location) { + for target in terminator.successors_mut() { + if let Some(replacement) = self.duplicates.get(target) { + debug!("SUCCESS: Replacing: `{:?}` with `{:?}`", target, replacement); + *target = *replacement; + } + } + + self.super_terminator(terminator, location); + } +} + +fn find_duplicates<'a, 'tcx>(body: &'a Body<'tcx>) -> FxHashMap { + let mut duplicates = FxHashMap::default(); + + let bbs_to_go_through = + body.basic_blocks().iter_enumerated().filter(|(_, bbd)| !bbd.is_cleanup).count(); + + let mut same_hashes = + FxHashMap::with_capacity_and_hasher(bbs_to_go_through, Default::default()); + + // Go through the basic blocks backwards. This means that in case of duplicates, + // we can use the basic block with the highest index as the replacement for all lower ones. + // For example, if bb1, bb2 and bb3 are duplicates, we will first insert bb3 in same_hashes. + // Then we will see that bb2 is a duplicate of bb3, + // and insert bb2 with the replacement bb3 in the duplicates list. + // When we see bb1, we see that it is a duplicate of bb3, and therefore insert it in the duplicates list + // with replacement bb3. + // When the duplicates are removed, we will end up with only bb3. + for (bb, bbd) in body.basic_blocks().iter_enumerated().rev().filter(|(_, bbd)| !bbd.is_cleanup) + { + // Basic blocks can get really big, so to avoid checking for duplicates in basic blocks + // that are unlikely to have duplicates, we stop early. The early bail number has been + // found experimentally by eprintln while compiling the crates in the rustc-perf suite. + if bbd.statements.len() > 10 { + continue; + } + + let to_hash = BasicBlockHashable { basic_block_data: bbd }; + let entry = same_hashes.entry(to_hash); + match entry { + Entry::Occupied(occupied) => { + // The basic block was already in the hashmap, which means we have a duplicate + let value = *occupied.get(); + debug!("Inserting {:?} -> {:?}", bb, value); + duplicates.try_insert(bb, value).expect("key was already inserted"); + } + Entry::Vacant(vacant) => { + vacant.insert(bb); + } + } + } + + duplicates +} + +struct BasicBlockHashable<'tcx, 'a> { + basic_block_data: &'a BasicBlockData<'tcx>, +} + +impl<'tcx, 'a> Hash for BasicBlockHashable<'tcx, 'a> { + fn hash(&self, state: &mut H) { + hash_statements(state, self.basic_block_data.statements.iter()); + // Note that since we only hash the kind, we lose span information if we deduplicate the blocks + self.basic_block_data.terminator().kind.hash(state); + } +} + +impl<'tcx, 'a> Eq for BasicBlockHashable<'tcx, 'a> {} + +impl<'tcx, 'a> PartialEq for BasicBlockHashable<'tcx, 'a> { + fn eq(&self, other: &Self) -> bool { + self.basic_block_data.statements.len() == other.basic_block_data.statements.len() + && &self.basic_block_data.terminator().kind == &other.basic_block_data.terminator().kind + && self + .basic_block_data + .statements + .iter() + .zip(&other.basic_block_data.statements) + .all(|(x, y)| statement_eq(&x.kind, &y.kind)) + } +} + +fn hash_statements<'a, 'tcx, H: Hasher>( + hasher: &mut H, + iter: impl Iterator>, +) where + 'tcx: 'a, +{ + for stmt in iter { + statement_hash(hasher, &stmt.kind); + } +} + +fn statement_hash<'tcx, H: Hasher>(hasher: &mut H, stmt: &StatementKind<'tcx>) { + match stmt { + StatementKind::Assign(box (place, rvalue)) => { + place.hash(hasher); + rvalue_hash(hasher, rvalue) + } + x => x.hash(hasher), + }; +} + +fn rvalue_hash(hasher: &mut H, rvalue: &Rvalue<'tcx>) { + match rvalue { + Rvalue::Use(op) => operand_hash(hasher, op), + x => x.hash(hasher), + }; +} + +fn operand_hash(hasher: &mut H, operand: &Operand<'tcx>) { + match operand { + Operand::Constant(box Constant { user_ty: _, literal, span: _ }) => literal.hash(hasher), + x => x.hash(hasher), + }; +} + +fn statement_eq<'tcx>(lhs: &StatementKind<'tcx>, rhs: &StatementKind<'tcx>) -> bool { + let res = match (lhs, rhs) { + ( + StatementKind::Assign(box (place, rvalue)), + StatementKind::Assign(box (place2, rvalue2)), + ) => place == place2 && rvalue_eq(rvalue, rvalue2), + (x, y) => x == y, + }; + debug!("statement_eq lhs: `{:?}` rhs: `{:?}` result: {:?}", lhs, rhs, res); + res +} + +fn rvalue_eq(lhs: &Rvalue<'tcx>, rhs: &Rvalue<'tcx>) -> bool { + let res = match (lhs, rhs) { + (Rvalue::Use(op1), Rvalue::Use(op2)) => operand_eq(op1, op2), + (x, y) => x == y, + }; + debug!("rvalue_eq lhs: `{:?}` rhs: `{:?}` result: {:?}", lhs, rhs, res); + res +} + +fn operand_eq(lhs: &Operand<'tcx>, rhs: &Operand<'tcx>) -> bool { + let res = match (lhs, rhs) { + ( + Operand::Constant(box Constant { user_ty: _, literal, span: _ }), + Operand::Constant(box Constant { user_ty: _, literal: literal2, span: _ }), + ) => literal == literal2, + (x, y) => x == y, + }; + debug!("operand_eq lhs: `{:?}` rhs: `{:?}` result: {:?}", lhs, rhs, res); + res +} diff --git a/compiler/rustc_mir/src/transform/dest_prop.rs b/compiler/rustc_mir/src/transform/dest_prop.rs index 46de5dba6e..6656deac96 100644 --- a/compiler/rustc_mir/src/transform/dest_prop.rs +++ b/compiler/rustc_mir/src/transform/dest_prop.rs @@ -127,9 +127,14 @@ pub struct DestinationPropagation; impl<'tcx> MirPass<'tcx> for DestinationPropagation { fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { - // Only run at mir-opt-level=2 or higher for now (we don't fix up debuginfo and remove + // FIXME(#79191, #82678) + if !tcx.sess.opts.debugging_opts.unsound_mir_opts { + return; + } + + // Only run at mir-opt-level=3 or higher for now (we don't fix up debuginfo and remove // storage statements at the moment). - if tcx.sess.opts.debugging_opts.mir_opt_level <= 1 { + if tcx.sess.mir_opt_level() < 3 { return; } @@ -582,6 +587,7 @@ impl Conflicts<'a> { | StatementKind::FakeRead(..) | StatementKind::AscribeUserType(..) | StatementKind::Coverage(..) + | StatementKind::CopyNonOverlapping(..) | StatementKind::Nop => {} } } diff --git a/compiler/rustc_mir/src/transform/early_otherwise_branch.rs b/compiler/rustc_mir/src/transform/early_otherwise_branch.rs index b16a99d7f0..f7ea9faec4 100644 --- a/compiler/rustc_mir/src/transform/early_otherwise_branch.rs +++ b/compiler/rustc_mir/src/transform/early_otherwise_branch.rs @@ -26,7 +26,12 @@ pub struct EarlyOtherwiseBranch; impl<'tcx> MirPass<'tcx> for EarlyOtherwiseBranch { fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { - if tcx.sess.opts.debugging_opts.mir_opt_level < 2 { + // FIXME(#78496) + if !tcx.sess.opts.debugging_opts.unsound_mir_opts { + return; + } + + if tcx.sess.mir_opt_level() < 3 { return; } trace!("running EarlyOtherwiseBranch on {:?}", body.source); @@ -91,8 +96,10 @@ impl<'tcx> MirPass<'tcx> for EarlyOtherwiseBranch { opt_to_apply.infos[0].first_switch_info.discr_used_in_switch; let not_equal_rvalue = Rvalue::BinaryOp( not_equal, - Operand::Copy(Place::from(second_discriminant_temp)), - Operand::Copy(first_descriminant_place), + box ( + Operand::Copy(Place::from(second_discriminant_temp)), + Operand::Copy(first_descriminant_place), + ), ); patch.add_statement( end_of_block_location, diff --git a/compiler/rustc_mir/src/transform/elaborate_drops.rs b/compiler/rustc_mir/src/transform/elaborate_drops.rs index 3d435f6d0e..c0fcfb620f 100644 --- a/compiler/rustc_mir/src/transform/elaborate_drops.rs +++ b/compiler/rustc_mir/src/transform/elaborate_drops.rs @@ -471,7 +471,7 @@ impl<'b, 'tcx> ElaborateDropsCtxt<'b, 'tcx> { Rvalue::Use(Operand::Constant(Box::new(Constant { span, user_ty: None, - literal: ty::Const::from_bool(self.tcx, val), + literal: ty::Const::from_bool(self.tcx, val).into(), }))) } diff --git a/compiler/rustc_mir/src/transform/generator.rs b/compiler/rustc_mir/src/transform/generator.rs index dc413f8dd2..c85e9b9b93 100644 --- a/compiler/rustc_mir/src/transform/generator.rs +++ b/compiler/rustc_mir/src/transform/generator.rs @@ -989,7 +989,7 @@ fn insert_panic_block<'tcx>( cond: Operand::Constant(box Constant { span: body.span, user_ty: None, - literal: ty::Const::from_bool(tcx, false), + literal: ty::Const::from_bool(tcx, false).into(), }), expected: true, msg: message, @@ -1007,9 +1007,9 @@ fn insert_panic_block<'tcx>( assert_block } -fn can_return<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>) -> bool { +fn can_return<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>, param_env: ty::ParamEnv<'tcx>) -> bool { // Returning from a function with an uninhabited return type is undefined behavior. - if body.return_ty().conservative_is_privately_uninhabited(tcx) { + if tcx.conservative_is_privately_uninhabited(param_env.and(body.return_ty())) { return false; } @@ -1111,7 +1111,7 @@ fn create_generator_resume_function<'tcx>( cases.insert(0, (UNRESUMED, BasicBlock::new(0))); // Panic when resumed on the returned or poisoned state - let generator_kind = body.generator_kind.unwrap(); + let generator_kind = body.generator_kind().unwrap(); if can_unwind { cases.insert( @@ -1236,14 +1236,14 @@ fn create_cases<'tcx>( impl<'tcx> MirPass<'tcx> for StateTransform { fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { - let yield_ty = if let Some(yield_ty) = body.yield_ty { + let yield_ty = if let Some(yield_ty) = body.yield_ty() { yield_ty } else { // This only applies to generators return; }; - assert!(body.generator_drop.is_none()); + assert!(body.generator_drop().is_none()); // The first argument is the generator type passed by value let gen_ty = body.local_decls.raw[1].ty; @@ -1320,7 +1320,7 @@ impl<'tcx> MirPass<'tcx> for StateTransform { // `storage_liveness` tells us which locals have live storage at suspension points let (remap, layout, storage_liveness) = compute_layout(liveness_info, body); - let can_return = can_return(tcx, body); + let can_return = can_return(tcx, body, tcx.param_env(body.source.def_id())); // Run the transformation which converts Places from Local to generator struct // accesses for locals in `remap`. @@ -1340,10 +1340,11 @@ impl<'tcx> MirPass<'tcx> for StateTransform { transform.visit_body(body); // Update our MIR struct to reflect the changes we've made - body.yield_ty = None; body.arg_count = 2; // self, resume arg body.spread_arg = None; - body.generator_layout = Some(layout); + + body.generator.as_mut().unwrap().yield_ty = None; + body.generator.as_mut().unwrap().generator_layout = Some(layout); // Insert `drop(generator_struct)` which is used to drop upvars for generators in // the unresumed state. @@ -1362,7 +1363,7 @@ impl<'tcx> MirPass<'tcx> for StateTransform { // 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, gen_ty, body, drop_clean); - body.generator_drop = Some(box drop_shim); + body.generator.as_mut().unwrap().generator_drop = Some(drop_shim); // Create the Generator::resume function create_generator_resume_function(tcx, transform, body, can_return); @@ -1453,6 +1454,7 @@ impl Visitor<'tcx> for EnsureGeneratorFieldAssignmentsNeverAlias<'_> { | StatementKind::Retag(..) | StatementKind::AscribeUserType(..) | StatementKind::Coverage(..) + | StatementKind::CopyNonOverlapping(..) | StatementKind::Nop => {} } } diff --git a/compiler/rustc_mir/src/transform/inline.rs b/compiler/rustc_mir/src/transform/inline.rs index 1635a95f46..12fdbd6582 100644 --- a/compiler/rustc_mir/src/transform/inline.rs +++ b/compiler/rustc_mir/src/transform/inline.rs @@ -1,6 +1,6 @@ //! Inlining pass for MIR functions -use rustc_attr as attr; +use rustc_attr::InlineAttr; use rustc_hir as hir; use rustc_index::bit_set::BitSet; use rustc_index::vec::Idx; @@ -37,21 +37,18 @@ struct CallSite<'tcx> { source_info: SourceInfo, } +/// Returns true if MIR inlining is enabled in the current compilation session. +crate fn is_enabled(tcx: TyCtxt<'_>) -> bool { + if let Some(enabled) = tcx.sess.opts.debugging_opts.inline_mir { + return enabled; + } + + tcx.sess.mir_opt_level() >= 3 +} + impl<'tcx> MirPass<'tcx> for Inline { fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { - // If you change this optimization level, also change the level in - // `mir_drops_elaborated_and_const_checked` for the call to `mir_inliner_callees`. - // Otherwise you will get an ICE about stolen MIR. - if tcx.sess.opts.debugging_opts.mir_opt_level < 2 { - return; - } - - if tcx.sess.opts.debugging_opts.instrument_coverage { - // Since `Inline` happens after `InstrumentCoverage`, the function-specific coverage - // counters can be invalidated, such as by merging coverage counter statements from - // a pre-inlined function into a different function. This kind of change is invalid, - // so inlining must be skipped. Note: This check is performed here so inlining can - // be disabled without preventing other optimizations (regardless of `mir_opt_level`). + if !is_enabled(tcx) { return; } @@ -106,72 +103,90 @@ struct Inliner<'tcx> { impl Inliner<'tcx> { fn process_blocks(&mut self, caller_body: &mut Body<'tcx>, blocks: Range) { for bb in blocks { - let callsite = match self.get_valid_function_call(bb, &caller_body[bb], caller_body) { + let bb_data = &caller_body[bb]; + if bb_data.is_cleanup { + continue; + } + + let callsite = match self.resolve_callsite(caller_body, bb, bb_data) { None => continue, Some(it) => it, }; + let span = trace_span!("process_blocks", %callsite.callee, ?bb); let _guard = span.enter(); - trace!( - "checking for self recursion ({:?} vs body_source: {:?})", - callsite.callee.def_id(), - caller_body.source.def_id() - ); - if callsite.callee.def_id() == caller_body.source.def_id() { - debug!("Not inlining a function into itself"); - continue; - } - - if !self.is_mir_available(callsite.callee, caller_body) { - debug!("MIR unavailable {}", callsite.callee); - continue; + match self.try_inlining(caller_body, &callsite) { + Err(reason) => { + debug!("not-inlined {} [{}]", callsite.callee, reason); + continue; + } + Ok(new_blocks) => { + debug!("inlined {}", callsite.callee); + self.changed = true; + self.history.push(callsite.callee); + self.process_blocks(caller_body, new_blocks); + self.history.pop(); + } } + } + } - let span = trace_span!("instance_mir", %callsite.callee); - let instance_mir_guard = span.enter(); - let callee_body = self.tcx.instance_mir(callsite.callee.def); - drop(instance_mir_guard); - if !self.should_inline(callsite, callee_body) { - continue; - } + /// Attempts to inline a callsite into the caller body. When successful returns basic blocks + /// containing the inlined body. Otherwise returns an error describing why inlining didn't take + /// place. + fn try_inlining( + &self, + caller_body: &mut Body<'tcx>, + callsite: &CallSite<'tcx>, + ) -> Result, &'static str> { + let callee_attrs = self.tcx.codegen_fn_attrs(callsite.callee.def_id()); + self.check_codegen_attributes(callsite, callee_attrs)?; + self.check_mir_is_available(caller_body, &callsite.callee)?; + let callee_body = self.tcx.instance_mir(callsite.callee.def); + self.check_mir_body(callsite, callee_body, callee_attrs)?; + + if !self.tcx.consider_optimizing(|| { + format!("Inline {:?} into {}", callee_body.span, callsite.callee) + }) { + return Err("optimization fuel exhausted"); + } - if !self.tcx.consider_optimizing(|| { - format!("Inline {:?} into {}", callee_body.span, callsite.callee) - }) { - return; - } + let callee_body = callsite.callee.subst_mir_and_normalize_erasing_regions( + self.tcx, + self.param_env, + callee_body.clone(), + ); - let callee_body = callsite.callee.subst_mir_and_normalize_erasing_regions( - self.tcx, - self.param_env, - callee_body.clone(), - ); + let old_blocks = caller_body.basic_blocks().next_index(); + self.inline_call(caller_body, &callsite, callee_body); + let new_blocks = old_blocks..caller_body.basic_blocks().next_index(); - let old_blocks = caller_body.basic_blocks().next_index(); - self.inline_call(callsite, caller_body, callee_body); - let new_blocks = old_blocks..caller_body.basic_blocks().next_index(); - self.changed = true; + Ok(new_blocks) + } - self.history.push(callsite.callee); - self.process_blocks(caller_body, new_blocks); - self.history.pop(); + fn check_mir_is_available( + &self, + caller_body: &Body<'tcx>, + callee: &Instance<'tcx>, + ) -> Result<(), &'static str> { + if callee.def_id() == caller_body.source.def_id() { + return Err("self-recursion"); } - } - #[instrument(skip(self, caller_body))] - fn is_mir_available(&self, callee: Instance<'tcx>, caller_body: &Body<'tcx>) -> bool { match callee.def { InstanceDef::Item(_) => { // If there is no MIR available (either because it was not in metadata or // because it has no MIR because it's an extern function), then the inliner // won't cause cycles on this. if !self.tcx.is_mir_available(callee.def_id()) { - return false; + return Err("item MIR unavailable"); } } // These have no own callable MIR. - InstanceDef::Intrinsic(_) | InstanceDef::Virtual(..) => return false, + InstanceDef::Intrinsic(_) | InstanceDef::Virtual(..) => { + return Err("instance without MIR (intrinsic / virtual)"); + } // This cannot result in an immediate cycle since the callee MIR is a shim, which does // not get any optimizations run on it. Any subsequent inlining may cause cycles, but we // do not need to catch this here, we can wait until the inliner decides to continue @@ -181,13 +196,13 @@ impl Inliner<'tcx> { | InstanceDef::FnPtrShim(..) | InstanceDef::ClosureOnceShim { .. } | InstanceDef::DropGlue(..) - | InstanceDef::CloneShim(..) => return true, + | InstanceDef::CloneShim(..) => return Ok(()), } if self.tcx.is_constructor(callee.def_id()) { trace!("constructors always have MIR"); // Constructor functions cannot cause a query cycle. - return true; + return Ok(()); } if let Some(callee_def_id) = callee.def_id().as_local() { @@ -196,39 +211,44 @@ impl Inliner<'tcx> { // since their `optimized_mir` is used for layout computation, which can // create a cycle, even when no attempt is made to inline the function // in the other direction. - caller_body.generator_kind.is_none() - && ( - // Avoid a cycle here by only using `instance_mir` only if we have - // a lower `HirId` than the callee. This ensures that the callee will - // not inline us. This trick only works without incremental compilation. - // So don't do it if that is enabled. - !self.tcx.dep_graph.is_fully_enabled() - && self.hir_id < callee_hir_id - // If we know for sure that the function we're calling will itself try to - // call us, then we avoid inlining that function. - || !self.tcx.mir_callgraph_reachable((callee, caller_body.source.def_id().expect_local())) - ) + if caller_body.generator.is_some() { + return Err("local generator (query cycle avoidance)"); + } + + // Avoid a cycle here by only using `instance_mir` only if we have + // a lower `HirId` than the callee. This ensures that the callee will + // 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.hir_id < callee_hir_id { + return Ok(()); + } + + // If we know for sure that the function we're calling will itself try to + // call us, then we avoid inlining that function. + if self + .tcx + .mir_callgraph_reachable((*callee, caller_body.source.def_id().expect_local())) + { + return Err("caller might be reachable from callee (query cycle avoidance)"); + } + + Ok(()) } else { // This cannot result in an immediate cycle since the callee MIR is from another crate // and is already optimized. Any subsequent inlining may cause cycles, but we do // not need to catch this here, we can wait until the inliner decides to continue // inlining a second time. trace!("functions from other crates always have MIR"); - true + Ok(()) } } - fn get_valid_function_call( + fn resolve_callsite( &self, + caller_body: &Body<'tcx>, bb: BasicBlock, bb_data: &BasicBlockData<'tcx>, - caller_body: &Body<'tcx>, ) -> Option> { - // Don't inline calls that are in cleanup blocks. - if bb_data.is_cleanup { - return None; - } - // Only consider direct calls to functions let terminator = bb_data.terminator(); if let TerminatorKind::Call { ref func, ref destination, .. } = terminator.kind { @@ -258,72 +278,72 @@ impl Inliner<'tcx> { None } - #[instrument(skip(self, callee_body))] - fn should_inline(&self, callsite: CallSite<'tcx>, callee_body: &Body<'tcx>) -> bool { - let tcx = self.tcx; + /// Returns an error if inlining is not possible based on codegen attributes alone. A success + /// indicates that inlining decision should be based on other criteria. + fn check_codegen_attributes( + &self, + callsite: &CallSite<'tcx>, + callee_attrs: &CodegenFnAttrs, + ) -> Result<(), &'satic str> { + if let InlineAttr::Never = callee_attrs.inline { + return Err("never inline hint"); + } - if callsite.fn_sig.c_variadic() { - debug!("callee is variadic - not inlining"); - return false; + // Only inline local functions if they would be eligible for cross-crate + // inlining. This is to ensure that the final crate doesn't have MIR that + // reference unexported symbols + if callsite.callee.def_id().is_local() { + let is_generic = callsite.callee.substs.non_erasable_generics().next().is_some(); + if !is_generic && !callee_attrs.requests_inline() { + return Err("not exported"); + } } - let codegen_fn_attrs = tcx.codegen_fn_attrs(callsite.callee.def_id()); + if callsite.fn_sig.c_variadic() { + return Err("C variadic"); + } - let self_features = &self.codegen_fn_attrs.target_features; - let callee_features = &codegen_fn_attrs.target_features; - if callee_features.iter().any(|feature| !self_features.contains(feature)) { - debug!("`callee has extra target features - not inlining"); - return false; + if callee_attrs.flags.contains(CodegenFnAttrFlags::NAKED) { + return Err("naked"); } - if self.codegen_fn_attrs.no_sanitize != codegen_fn_attrs.no_sanitize { - debug!("`callee has incompatible no_sanitize attribute - not inlining"); - return false; + if callee_attrs.flags.contains(CodegenFnAttrFlags::COLD) { + return Err("cold"); } - if self.codegen_fn_attrs.instruction_set != codegen_fn_attrs.instruction_set { - debug!("`callee has incompatible instruction set - not inlining"); - return false; + if callee_attrs.no_sanitize != self.codegen_fn_attrs.no_sanitize { + return Err("incompatible sanitizer set"); } - let hinted = match codegen_fn_attrs.inline { - // Just treat inline(always) as a hint for now, - // there are cases that prevent inlining that we - // need to check for first. - attr::InlineAttr::Always => true, - attr::InlineAttr::Never => { - debug!("`#[inline(never)]` present - not inlining"); - return false; - } - attr::InlineAttr::Hint => true, - attr::InlineAttr::None => false, - }; + if callee_attrs.instruction_set != self.codegen_fn_attrs.instruction_set { + return Err("incompatible instruction set"); + } - // Only inline local functions if they would be eligible for cross-crate - // inlining. This is to ensure that the final crate doesn't have MIR that - // reference unexported symbols - if callsite.callee.def_id().is_local() { - if callsite.callee.substs.non_erasable_generics().count() == 0 && !hinted { - debug!(" callee is an exported function - not inlining"); - return false; + for feature in &callee_attrs.target_features { + if !self.codegen_fn_attrs.target_features.contains(feature) { + return Err("incompatible target feature"); } } - let mut threshold = if hinted { - self.tcx.sess.opts.debugging_opts.inline_mir_hint_threshold - } else { - self.tcx.sess.opts.debugging_opts.inline_mir_threshold - }; + Ok(()) + } - if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::NAKED) { - debug!("#[naked] present - not inlining"); - return false; - } + /// Returns inlining decision that is based on the examination of callee MIR body. + /// Assumes that codegen attributes have been checked for compatibility already. + #[instrument(level = "debug", skip(self, callee_body))] + fn check_mir_body( + &self, + callsite: &CallSite<'tcx>, + callee_body: &Body<'tcx>, + callee_attrs: &CodegenFnAttrs, + ) -> Result<(), &'static str> { + let tcx = self.tcx; - if codegen_fn_attrs.flags.contains(CodegenFnAttrFlags::COLD) { - debug!("#[cold] present - not inlining"); - return false; - } + let mut threshold = if callee_attrs.requests_inline() { + self.tcx.sess.opts.debugging_opts.inline_mir_hint_threshold.unwrap_or(100) + } else { + self.tcx.sess.opts.debugging_opts.inline_mir_threshold.unwrap_or(50) + }; // Give a bonus functions with a small number of blocks, // We normally have two or three blocks for even @@ -387,17 +407,16 @@ impl Inliner<'tcx> { TerminatorKind::Call { func: Operand::Constant(ref f), cleanup, .. } => { if let ty::FnDef(def_id, substs) = - *callsite.callee.subst_mir(self.tcx, &f.literal.ty).kind() + *callsite.callee.subst_mir(self.tcx, &f.literal.ty()).kind() { let substs = self.tcx.normalize_erasing_regions(self.param_env, substs); if let Ok(Some(instance)) = Instance::resolve(self.tcx, self.param_env, def_id, substs) { - if callsite.callee.def_id() == instance.def_id() - || self.history.contains(&instance) - { - debug!("`callee is recursive - not inlining"); - return false; + if callsite.callee.def_id() == instance.def_id() { + return Err("self-recursion"); + } else if self.history.contains(&instance) { + return Err("already inlined"); } } // Don't give intrinsics the extra penalty for calls @@ -450,24 +469,24 @@ impl Inliner<'tcx> { } } - if let attr::InlineAttr::Always = codegen_fn_attrs.inline { + if let InlineAttr::Always = callee_attrs.inline { debug!("INLINING {:?} because inline(always) [cost={}]", callsite, cost); - true + Ok(()) } else { if cost <= threshold { debug!("INLINING {:?} [cost={} <= threshold={}]", callsite, cost, threshold); - true + Ok(()) } else { debug!("NOT inlining {:?} [cost={} > threshold={}]", callsite, cost, threshold); - false + Err("cost above threshold") } } } fn inline_call( &self, - callsite: CallSite<'tcx>, caller_body: &mut Body<'tcx>, + callsite: &CallSite<'tcx>, mut callee_body: Body<'tcx>, ) { let terminator = caller_body[callsite.block].terminator.take().unwrap(); @@ -609,8 +628,11 @@ impl Inliner<'tcx> { // `required_consts`, here we may not only have `ConstKind::Unevaluated` // because we are calling `subst_and_normalize_erasing_regions`. caller_body.required_consts.extend( - callee_body.required_consts.iter().copied().filter(|&constant| { - matches!(constant.literal.val, ConstKind::Unevaluated(_, _, _)) + callee_body.required_consts.iter().copied().filter(|&ct| { + match ct.literal.const_for_ty() { + Some(ct) => matches!(ct.val, ConstKind::Unevaluated(_, _, _)), + None => true, + } }), ); } diff --git a/compiler/rustc_mir/src/transform/inline/cycle.rs b/compiler/rustc_mir/src/transform/inline/cycle.rs index e4d403fbf6..295f3ec70d 100644 --- a/compiler/rustc_mir/src/transform/inline/cycle.rs +++ b/compiler/rustc_mir/src/transform/inline/cycle.rs @@ -1,4 +1,5 @@ use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_data_structures::sso::SsoHashSet; use rustc_data_structures::stack::ensure_sufficient_stack; use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_middle::mir::TerminatorKind; @@ -7,7 +8,7 @@ use rustc_middle::ty::{self, subst::SubstsRef, InstanceDef, TyCtxt}; // FIXME: check whether it is cheaper to precompute the entire call graph instead of invoking // this query riddiculously often. -#[instrument(skip(tcx, root, target))] +#[instrument(level = "debug", skip(tcx, root, target))] crate fn mir_callgraph_reachable( tcx: TyCtxt<'tcx>, (root, target): (ty::Instance<'tcx>, LocalDefId), @@ -27,7 +28,10 @@ crate fn mir_callgraph_reachable( !tcx.is_constructor(root.def_id()), "you should not call `mir_callgraph_reachable` on enum/struct constructor functions" ); - #[instrument(skip(tcx, param_env, target, stack, seen, recursion_limiter, caller))] + #[instrument( + level = "debug", + skip(tcx, param_env, target, stack, seen, recursion_limiter, caller) + )] fn process( tcx: TyCtxt<'tcx>, param_env: ty::ParamEnv<'tcx>, @@ -137,7 +141,7 @@ crate fn mir_inliner_callees<'tcx>( // Functions from other crates and MIR shims _ => tcx.instance_mir(instance), }; - let mut calls = Vec::new(); + let mut calls = SsoHashSet::new(); for bb_data in body.basic_blocks() { let terminator = bb_data.terminator(); if let TerminatorKind::Call { func, .. } = &terminator.kind { @@ -146,12 +150,8 @@ crate fn mir_inliner_callees<'tcx>( ty::FnDef(def_id, substs) => (*def_id, *substs), _ => continue, }; - // We've seen this before - if calls.contains(&call) { - continue; - } - calls.push(call); + calls.insert(call); } } - tcx.arena.alloc_slice(&calls) + tcx.arena.alloc_from_iter(calls.iter().copied()) } diff --git a/compiler/rustc_mir/src/transform/instcombine.rs b/compiler/rustc_mir/src/transform/instcombine.rs index 74dadb2572..7aaf022416 100644 --- a/compiler/rustc_mir/src/transform/instcombine.rs +++ b/compiler/rustc_mir/src/transform/instcombine.rs @@ -44,7 +44,7 @@ impl<'tcx, 'a> InstCombineContext<'tcx, 'a> { /// Transform boolean comparisons into logical operations. fn combine_bool_cmp(&self, source_info: &SourceInfo, rvalue: &mut Rvalue<'tcx>) { match rvalue { - Rvalue::BinaryOp(op @ (BinOp::Eq | BinOp::Ne), a, b) => { + Rvalue::BinaryOp(op @ (BinOp::Eq | BinOp::Ne), box (a, b)) => { let new = match (op, self.try_eval_bool(a), self.try_eval_bool(b)) { // Transform "Eq(a, true)" ==> "a" (BinOp::Eq, _, Some(true)) => Some(a.clone()), @@ -79,7 +79,7 @@ impl<'tcx, 'a> InstCombineContext<'tcx, 'a> { fn try_eval_bool(&self, a: &Operand<'_>) -> Option { let a = a.constant()?; - if a.literal.ty.is_bool() { a.literal.val.try_to_bool() } else { None } + if a.literal.ty().is_bool() { a.literal.try_to_bool() } else { None } } /// Transform "&(*a)" ==> "a". @@ -110,12 +110,13 @@ impl<'tcx, 'a> InstCombineContext<'tcx, 'a> { fn combine_len(&self, source_info: &SourceInfo, rvalue: &mut Rvalue<'tcx>) { if let Rvalue::Len(ref place) = *rvalue { let place_ty = place.ty(self.local_decls, self.tcx).ty; - if let ty::Array(_, len) = place_ty.kind() { + if let ty::Array(_, len) = *place_ty.kind() { if !self.should_combine(source_info, rvalue) { return; } - let constant = Constant { span: source_info.span, literal: len, user_ty: None }; + let constant = + Constant { span: source_info.span, literal: len.into(), user_ty: None }; *rvalue = Rvalue::Use(Operand::Constant(box constant)); } } diff --git a/compiler/rustc_mir/src/transform/lower_intrinsics.rs b/compiler/rustc_mir/src/transform/lower_intrinsics.rs index f5968532eb..e6ee474285 100644 --- a/compiler/rustc_mir/src/transform/lower_intrinsics.rs +++ b/compiler/rustc_mir/src/transform/lower_intrinsics.rs @@ -33,13 +33,34 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics { Rvalue::Use(Operand::Constant(box Constant { span: terminator.source_info.span, user_ty: None, - literal: ty::Const::zero_sized(tcx, tcx.types.unit), + literal: ty::Const::zero_sized(tcx, tcx.types.unit).into(), })), )), }); terminator.kind = TerminatorKind::Goto { target }; } } + sym::copy_nonoverlapping => { + let target = destination.unwrap().1; + let mut args = args.drain(..); + block.statements.push(Statement { + source_info: terminator.source_info, + kind: StatementKind::CopyNonOverlapping( + box rustc_middle::mir::CopyNonOverlapping { + src: args.next().unwrap(), + dst: args.next().unwrap(), + count: args.next().unwrap(), + }, + ), + }); + assert_eq!( + args.next(), + None, + "Extra argument for copy_non_overlapping intrinsic" + ); + drop(args); + terminator.kind = TerminatorKind::Goto { target }; + } sym::wrapping_add | sym::wrapping_sub | sym::wrapping_mul => { if let Some((destination, target)) = *destination { let lhs; @@ -59,7 +80,7 @@ impl<'tcx> MirPass<'tcx> for LowerIntrinsics { source_info: terminator.source_info, kind: StatementKind::Assign(box ( destination, - Rvalue::BinaryOp(bin_op, lhs, rhs), + Rvalue::BinaryOp(bin_op, box (lhs, rhs)), )), }); terminator.kind = TerminatorKind::Goto { target }; diff --git a/compiler/rustc_mir/src/transform/match_branches.rs b/compiler/rustc_mir/src/transform/match_branches.rs index 53eeecc780..d04a7011ab 100644 --- a/compiler/rustc_mir/src/transform/match_branches.rs +++ b/compiler/rustc_mir/src/transform/match_branches.rs @@ -2,6 +2,8 @@ use crate::transform::MirPass; use rustc_middle::mir::*; use rustc_middle::ty::TyCtxt; +use super::simplify::simplify_cfg; + pub struct MatchBranchSimplification; /// If a source block is found that switches between two blocks that are exactly @@ -38,13 +40,15 @@ pub struct MatchBranchSimplification; impl<'tcx> MirPass<'tcx> for MatchBranchSimplification { fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { - if tcx.sess.opts.debugging_opts.mir_opt_level <= 1 { + if tcx.sess.mir_opt_level() < 3 { return; } - let param_env = tcx.param_env(body.source.def_id()); let def_id = body.source.def_id(); + let param_env = tcx.param_env(def_id); + let (bbs, local_decls) = body.basic_blocks_and_local_decls_mut(); + let mut should_cleanup = false; 'outer: for bb_idx in bbs.indices() { if !tcx.consider_optimizing(|| format!("MatchBranchSimplification {:?} ", def_id)) { continue; @@ -89,8 +93,8 @@ impl<'tcx> MirPass<'tcx> for MatchBranchSimplification { StatementKind::Assign(box (lhs_f, Rvalue::Use(Operand::Constant(f_c)))), StatementKind::Assign(box (lhs_s, Rvalue::Use(Operand::Constant(s_c)))), ) if lhs_f == lhs_s - && f_c.literal.ty.is_bool() - && s_c.literal.ty.is_bool() + && f_c.literal.ty().is_bool() + && s_c.literal.ty().is_bool() && f_c.literal.try_eval_bool(tcx, param_env).is_some() && s_c.literal.try_eval_bool(tcx, param_env).is_some() => {} @@ -135,8 +139,7 @@ impl<'tcx> MirPass<'tcx> for MatchBranchSimplification { let op = if f_b { BinOp::Eq } else { BinOp::Ne }; let rhs = Rvalue::BinaryOp( op, - Operand::Copy(Place::from(discr_local)), - const_cmp, + box (Operand::Copy(Place::from(discr_local)), const_cmp), ); Statement { source_info: f.source_info, @@ -159,6 +162,11 @@ impl<'tcx> MirPass<'tcx> for MatchBranchSimplification { from.statements .push(Statement { source_info, kind: StatementKind::StorageDead(discr_local) }); from.terminator_mut().kind = first.terminator().kind.clone(); + should_cleanup = true; + } + + if should_cleanup { + simplify_cfg(body); } } } diff --git a/compiler/rustc_mir/src/transform/mod.rs b/compiler/rustc_mir/src/transform/mod.rs index 2786127513..13546442f6 100644 --- a/compiler/rustc_mir/src/transform/mod.rs +++ b/compiler/rustc_mir/src/transform/mod.rs @@ -22,9 +22,11 @@ pub mod check_packed_ref; pub mod check_unsafety; pub mod cleanup_post_borrowck; pub mod const_debuginfo; +pub mod const_goto; pub mod const_prop; pub mod coverage; pub mod deaggregator; +pub mod deduplicate_blocks; pub mod dest_prop; pub mod dump_mir; pub mod early_otherwise_branch; @@ -40,6 +42,7 @@ pub mod no_landing_pads; pub mod nrvo; pub mod promote_consts; pub mod remove_noop_landing_pads; +pub mod remove_storage_markers; pub mod remove_unneeded_drops; pub mod required_consts; pub mod rustc_peek; @@ -427,8 +430,7 @@ fn mir_drops_elaborated_and_const_checked<'tcx>( let def = ty::WithOptConstParam::unknown(did); // Do not compute the mir call graph without said call graph actually being used. - // Keep this in sync with the mir inliner's optimization level. - if tcx.sess.opts.debugging_opts.mir_opt_level >= 2 { + if inline::is_enabled(tcx) { let _ = tcx.mir_inliner_callees(ty::InstanceDef::Item(def)); } } @@ -473,7 +475,7 @@ fn run_post_borrowck_cleanup_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tc } fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { - let mir_opt_level = tcx.sess.opts.debugging_opts.mir_opt_level; + let mir_opt_level = tcx.sess.mir_opt_level(); // Lowering generator control-flow and variables has to happen before we do anything else // to them. We run some optimizations before that, because they may be harder to do on the state @@ -491,6 +493,8 @@ fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { // The main optimizations that we do on MIR. let optimizations: &[&dyn MirPass<'tcx>] = &[ + &remove_storage_markers::RemoveStorageMarkers, + &const_goto::ConstGoto, &remove_unneeded_drops::RemoveUnneededDrops, &match_branches::MatchBranchSimplification, // inst combine is after MatchBranchSimplification to clean up Ne(_1, false) @@ -510,6 +514,7 @@ fn run_optimization_passes<'tcx>(tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { &const_debuginfo::ConstDebugInfo, &simplify::SimplifyLocals, &multiple_return_terminators::MultipleReturnTerminators, + &deduplicate_blocks::DeduplicateBlocks, ]; // Optimizations to run even if mir optimizations have been disabled. diff --git a/compiler/rustc_mir/src/transform/multiple_return_terminators.rs b/compiler/rustc_mir/src/transform/multiple_return_terminators.rs index 617086622c..4aaa0baa9f 100644 --- a/compiler/rustc_mir/src/transform/multiple_return_terminators.rs +++ b/compiler/rustc_mir/src/transform/multiple_return_terminators.rs @@ -10,7 +10,7 @@ pub struct MultipleReturnTerminators; impl<'tcx> MirPass<'tcx> for MultipleReturnTerminators { fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { - if tcx.sess.opts.debugging_opts.mir_opt_level < 3 { + if tcx.sess.mir_opt_level() < 4 { return; } diff --git a/compiler/rustc_mir/src/transform/nrvo.rs b/compiler/rustc_mir/src/transform/nrvo.rs index ce02fb261d..445dc12909 100644 --- a/compiler/rustc_mir/src/transform/nrvo.rs +++ b/compiler/rustc_mir/src/transform/nrvo.rs @@ -34,7 +34,7 @@ pub struct RenameReturnPlace; impl<'tcx> MirPass<'tcx> for RenameReturnPlace { fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut mir::Body<'tcx>) { - if tcx.sess.opts.debugging_opts.mir_opt_level == 0 { + if tcx.sess.mir_opt_level() == 0 { return; } diff --git a/compiler/rustc_mir/src/transform/promote_consts.rs b/compiler/rustc_mir/src/transform/promote_consts.rs index b4504a0e22..7db790cf32 100644 --- a/compiler/rustc_mir/src/transform/promote_consts.rs +++ b/compiler/rustc_mir/src/transform/promote_consts.rs @@ -643,7 +643,7 @@ impl<'tcx> Validator<'_, 'tcx> { self.validate_operand(operand)?; } - Rvalue::BinaryOp(op, lhs, rhs) | Rvalue::CheckedBinaryOp(op, lhs, rhs) => { + Rvalue::BinaryOp(op, box (lhs, rhs)) | Rvalue::CheckedBinaryOp(op, box (lhs, rhs)) => { let op = *op; let lhs_ty = lhs.ty(self.body, self.tcx); @@ -921,7 +921,7 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> { let unit = Rvalue::Use(Operand::Constant(box Constant { span: statement.source_info.span, user_ty: None, - literal: ty::Const::zero_sized(self.tcx, self.tcx.types.unit), + literal: ty::Const::zero_sized(self.tcx, self.tcx.types.unit).into(), })); mem::replace(rhs, unit) }, @@ -998,20 +998,22 @@ impl<'a, 'tcx> Promoter<'a, 'tcx> { Operand::Constant(Box::new(Constant { span, user_ty: None, - literal: tcx.mk_const(ty::Const { - ty, - val: ty::ConstKind::Unevaluated( - def, - InternalSubsts::for_item(tcx, def.did, |param, _| { - if let ty::GenericParamDefKind::Lifetime = param.kind { - tcx.lifetimes.re_erased.into() - } else { - tcx.mk_param_from_def(param) - } - }), - Some(promoted_id), - ), - }), + literal: tcx + .mk_const(ty::Const { + ty, + val: ty::ConstKind::Unevaluated( + def, + InternalSubsts::for_item(tcx, def.did, |param, _| { + if let ty::GenericParamDefKind::Lifetime = param.kind { + tcx.lifetimes.re_erased.into() + } else { + tcx.mk_param_from_def(param) + } + }), + Some(promoted_id), + ), + }) + .into(), })) }; let (blocks, local_decls) = self.source.basic_blocks_and_local_decls_mut(); @@ -1177,7 +1179,7 @@ pub fn promote_candidates<'tcx>( 0, vec![], body.span, - body.generator_kind, + body.generator_kind(), ); let promoter = Promoter { @@ -1231,3 +1233,38 @@ pub fn promote_candidates<'tcx>( promotions } + +/// This function returns `true` if the function being called in the array +/// repeat expression is a `const` function. +crate fn is_const_fn_in_array_repeat_expression<'tcx>( + ccx: &ConstCx<'_, 'tcx>, + place: &Place<'tcx>, + body: &Body<'tcx>, +) -> bool { + match place.as_local() { + // rule out cases such as: `let my_var = some_fn(); [my_var; N]` + Some(local) if body.local_decls[local].is_user_variable() => return false, + None => return false, + _ => {} + } + + for block in body.basic_blocks() { + if let Some(Terminator { kind: TerminatorKind::Call { func, destination, .. }, .. }) = + &block.terminator + { + if let Operand::Constant(box Constant { literal, .. }) = func { + if let ty::FnDef(def_id, _) = *literal.ty().kind() { + if let Some((destination_place, _)) = destination { + if destination_place == place { + if is_const_fn(ccx.tcx, def_id) { + return true; + } + } + } + } + } + } + } + + false +} diff --git a/compiler/rustc_mir/src/transform/remove_noop_landing_pads.rs b/compiler/rustc_mir/src/transform/remove_noop_landing_pads.rs index 31e201c3a5..5347846a4b 100644 --- a/compiler/rustc_mir/src/transform/remove_noop_landing_pads.rs +++ b/compiler/rustc_mir/src/transform/remove_noop_landing_pads.rs @@ -55,6 +55,7 @@ impl RemoveNoopLandingPads { StatementKind::Assign { .. } | StatementKind::SetDiscriminant { .. } | StatementKind::LlvmInlineAsm { .. } + | StatementKind::CopyNonOverlapping(..) | StatementKind::Retag { .. } => { return false; } diff --git a/compiler/rustc_mir/src/transform/remove_storage_markers.rs b/compiler/rustc_mir/src/transform/remove_storage_markers.rs new file mode 100644 index 0000000000..2d529feb07 --- /dev/null +++ b/compiler/rustc_mir/src/transform/remove_storage_markers.rs @@ -0,0 +1,25 @@ +//! This pass removes storage markers if they won't be emitted during codegen. + +use crate::transform::MirPass; +use rustc_middle::mir::*; +use rustc_middle::ty::TyCtxt; + +pub struct RemoveStorageMarkers; + +impl<'tcx> MirPass<'tcx> for RemoveStorageMarkers { + fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { + if tcx.sess.emit_lifetime_markers() { + return; + } + + trace!("Running RemoveStorageMarkers on {:?}", body.source); + for data in body.basic_blocks_mut() { + data.statements.retain(|statement| match statement.kind { + StatementKind::StorageLive(..) + | StatementKind::StorageDead(..) + | StatementKind::Nop => false, + _ => true, + }) + } + } +} diff --git a/compiler/rustc_mir/src/transform/required_consts.rs b/compiler/rustc_mir/src/transform/required_consts.rs index a63ab30a68..2b518bd3a4 100644 --- a/compiler/rustc_mir/src/transform/required_consts.rs +++ b/compiler/rustc_mir/src/transform/required_consts.rs @@ -14,10 +14,10 @@ impl<'a, 'tcx> RequiredConstsVisitor<'a, 'tcx> { impl<'a, 'tcx> Visitor<'tcx> for RequiredConstsVisitor<'a, 'tcx> { fn visit_constant(&mut self, constant: &Constant<'tcx>, _: Location) { - let const_kind = constant.literal.val; - - if let ConstKind::Unevaluated(_, _, _) = const_kind { - self.required_consts.push(*constant); + if let Some(ct) = constant.literal.const_for_ty() { + if let ConstKind::Unevaluated(_, _, _) = ct.val { + self.required_consts.push(*constant); + } } } } diff --git a/compiler/rustc_mir/src/transform/rustc_peek.rs b/compiler/rustc_mir/src/transform/rustc_peek.rs index 7598be4e4a..a6b8f20f6d 100644 --- a/compiler/rustc_mir/src/transform/rustc_peek.rs +++ b/compiler/rustc_mir/src/transform/rustc_peek.rs @@ -205,7 +205,7 @@ impl PeekCall { if let mir::TerminatorKind::Call { func: Operand::Constant(func), args, .. } = &terminator.kind { - if let ty::FnDef(def_id, substs) = *func.literal.ty.kind() { + if let ty::FnDef(def_id, substs) = *func.literal.ty().kind() { let sig = tcx.fn_sig(def_id); let name = tcx.item_name(def_id); if sig.abi() != Abi::RustIntrinsic || name != sym::rustc_peek { diff --git a/compiler/rustc_mir/src/transform/simplify.rs b/compiler/rustc_mir/src/transform/simplify.rs index 11539d3ef3..d2314a9ba1 100644 --- a/compiler/rustc_mir/src/transform/simplify.rs +++ b/compiler/rustc_mir/src/transform/simplify.rs @@ -31,10 +31,10 @@ use crate::transform::MirPass; use rustc_index::vec::{Idx, IndexVec}; use rustc_middle::mir::visit::{MutVisitor, MutatingUseContext, PlaceContext, Visitor}; use rustc_middle::mir::*; +use rustc_middle::ty::ParamEnv; use rustc_middle::ty::TyCtxt; use smallvec::SmallVec; -use std::borrow::Cow; -use std::convert::TryInto; +use std::{borrow::Cow, convert::TryInto}; pub struct SimplifyCfg { label: String, @@ -320,80 +320,91 @@ pub struct SimplifyLocals; impl<'tcx> MirPass<'tcx> for SimplifyLocals { fn run_pass(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'tcx>) { trace!("running SimplifyLocals on {:?}", body.source); + simplify_locals(body, tcx); + } +} - // First, we're going to get a count of *actual* uses for every `Local`. - let mut used_locals = UsedLocals::new(body); +pub fn simplify_locals<'tcx>(body: &mut Body<'tcx>, tcx: TyCtxt<'tcx>) { + // First, we're going to get a count of *actual* uses for every `Local`. + let mut used_locals = UsedLocals::new(body, tcx); - // Next, we're going to remove any `Local` with zero actual uses. When we remove those - // `Locals`, we're also going to subtract any uses of other `Locals` from the `used_locals` - // count. For example, if we removed `_2 = discriminant(_1)`, then we'll subtract one from - // `use_counts[_1]`. That in turn might make `_1` unused, so we loop until we hit a - // fixedpoint where there are no more unused locals. - remove_unused_definitions(&mut used_locals, body); + // Next, we're going to remove any `Local` with zero actual uses. When we remove those + // `Locals`, we're also going to subtract any uses of other `Locals` from the `used_locals` + // count. For example, if we removed `_2 = discriminant(_1)`, then we'll subtract one from + // `use_counts[_1]`. That in turn might make `_1` unused, so we loop until we hit a + // fixedpoint where there are no more unused locals. + remove_unused_definitions(&mut used_locals, body); - // Finally, we'll actually do the work of shrinking `body.local_decls` and remapping the `Local`s. - let map = make_local_map(&mut body.local_decls, &used_locals); + // Finally, we'll actually do the work of shrinking `body.local_decls` and remapping the `Local`s. + let arg_count = body.arg_count.try_into().unwrap(); + let map = make_local_map(&mut body.local_decls, &used_locals, arg_count); - // Only bother running the `LocalUpdater` if we actually found locals to remove. - if map.iter().any(Option::is_none) { - // Update references to all vars and tmps now - let mut updater = LocalUpdater { map, tcx }; - updater.visit_body(body); + // Only bother running the `LocalUpdater` if we actually found locals to remove. + if map.iter().any(Option::is_none) { + // Update references to all vars and tmps now + let mut updater = LocalUpdater { map, tcx }; + updater.visit_body(body); - body.local_decls.shrink_to_fit(); - } + body.local_decls.shrink_to_fit(); } } /// Construct the mapping while swapping out unused stuff out from the `vec`. -fn make_local_map( +fn make_local_map<'tcx, V>( local_decls: &mut IndexVec, - used_locals: &UsedLocals, + used_locals: &UsedLocals<'tcx>, + arg_count: u32, ) -> IndexVec> { - let mut map: IndexVec> = IndexVec::from_elem(None, &*local_decls); + let mut map: IndexVec> = IndexVec::from_elem(None, local_decls); let mut used = Local::new(0); for alive_index in local_decls.indices() { - // `is_used` treats the `RETURN_PLACE` and arguments as used. - if !used_locals.is_used(alive_index) { - continue; - } - - map[alive_index] = Some(used); - if alive_index != used { - local_decls.swap(alive_index, used); + // When creating the local map treat the `RETURN_PLACE` and arguments as used. + if alive_index.as_u32() <= arg_count || used_locals.is_used(alive_index) { + map[alive_index] = Some(used); + if alive_index != used { + local_decls.swap(alive_index, used); + } + used.increment_by(1); } - used.increment_by(1); } local_decls.truncate(used.index()); map } /// Keeps track of used & unused locals. -struct UsedLocals { +struct UsedLocals<'tcx> { increment: bool, - arg_count: u32, use_count: IndexVec, + is_static: bool, + local_decls: IndexVec>, + param_env: ParamEnv<'tcx>, + tcx: TyCtxt<'tcx>, } -impl UsedLocals { +impl UsedLocals<'tcx> { /// Determines which locals are used & unused in the given body. - fn new(body: &Body<'_>) -> Self { + fn new(body: &Body<'tcx>, tcx: TyCtxt<'tcx>) -> Self { + let def_id = body.source.def_id(); + let is_static = tcx.is_static(def_id); + let param_env = tcx.param_env(def_id); + let local_decls = body.local_decls.clone(); let mut this = Self { increment: true, - arg_count: body.arg_count.try_into().unwrap(), use_count: IndexVec::from_elem(0, &body.local_decls), + is_static, + local_decls, + param_env, + tcx, }; this.visit_body(body); this } /// Checks if local is used. - /// - /// Return place and arguments are always considered used. fn is_used(&self, local: Local) -> bool { trace!("is_used({:?}): use_count: {:?}", local, self.use_count[local]); - local.as_u32() <= self.arg_count || self.use_count[local] != 0 + self.use_count[local] != 0 } /// Updates the use counts to reflect the removal of given statement. @@ -413,8 +424,7 @@ impl UsedLocals { } else { // A definition. Although, it still might use other locals for indexing. self.super_projection( - place.local, - &place.projection, + place.as_ref(), PlaceContext::MutatingUse(MutatingUseContext::Projection), location, ); @@ -422,10 +432,11 @@ impl UsedLocals { } } -impl Visitor<'_> for UsedLocals { +impl Visitor<'tcx> for UsedLocals<'tcx> { fn visit_statement(&mut self, statement: &Statement<'tcx>, location: Location) { match statement.kind { StatementKind::LlvmInlineAsm(..) + | StatementKind::CopyNonOverlapping(..) | StatementKind::Retag(..) | StatementKind::Coverage(..) | StatementKind::FakeRead(..) @@ -448,7 +459,21 @@ impl Visitor<'_> for UsedLocals { } } - fn visit_local(&mut self, local: &Local, _ctx: PlaceContext, _location: Location) { + fn visit_local(&mut self, local: &Local, ctx: PlaceContext, _location: Location) { + debug!("local: {:?} is_static: {:?}, ctx: {:?}", local, self.is_static, ctx); + // Do not count _0 as a used in `return;` if it is a ZST. + let return_place = *local == RETURN_PLACE + && matches!(ctx, PlaceContext::NonMutatingUse(visit::NonMutatingUseContext::Move)); + if !self.is_static && return_place { + let ty = self.local_decls[*local].ty; + let param_env_and = self.param_env.and(ty); + if let Ok(layout) = self.tcx.layout_of(param_env_and) { + debug!("layout.is_zst: {:?}", layout.is_zst()); + if layout.is_zst() { + return; + } + } + } if self.increment { self.use_count[*local] += 1; } else { @@ -459,7 +484,10 @@ impl Visitor<'_> for UsedLocals { } /// Removes unused definitions. Updates the used locals to reflect the changes made. -fn remove_unused_definitions<'a, 'tcx>(used_locals: &'a mut UsedLocals, body: &mut Body<'tcx>) { +fn remove_unused_definitions<'a, 'tcx>( + used_locals: &'a mut UsedLocals<'tcx>, + body: &mut Body<'tcx>, +) { // The use counts are updated as we remove the statements. A local might become unused // during the retain operation, leading to a temporary inconsistency (storage statements or // definitions referencing the local might remain). For correctness it is crucial that this diff --git a/compiler/rustc_mir/src/transform/simplify_comparison_integral.rs b/compiler/rustc_mir/src/transform/simplify_comparison_integral.rs index ea56080c75..9f473f3bae 100644 --- a/compiler/rustc_mir/src/transform/simplify_comparison_integral.rs +++ b/compiler/rustc_mir/src/transform/simplify_comparison_integral.rs @@ -80,14 +80,14 @@ impl<'tcx> MirPass<'tcx> for SimplifyComparisonIntegral { // we convert the move in the comparison statement to a copy. // unwrap is safe as we know this statement is an assign - let box (_, rhs) = bb.statements[opt.bin_op_stmt_idx].kind.as_assign_mut().unwrap(); + let (_, rhs) = bb.statements[opt.bin_op_stmt_idx].kind.as_assign_mut().unwrap(); use Operand::*; match rhs { - Rvalue::BinaryOp(_, ref mut left @ Move(_), Constant(_)) => { + Rvalue::BinaryOp(_, box (ref mut left @ Move(_), Constant(_))) => { *left = Copy(opt.to_switch_on); } - Rvalue::BinaryOp(_, Constant(_), ref mut right @ Move(_)) => { + Rvalue::BinaryOp(_, box (Constant(_), ref mut right @ Move(_))) => { *right = Copy(opt.to_switch_on); } _ => (), @@ -166,7 +166,10 @@ impl<'a, 'tcx> OptimizationFinder<'a, 'tcx> { if *lhs == place_switched_on => { match rhs { - Rvalue::BinaryOp(op @ (BinOp::Eq | BinOp::Ne), left, right) => { + Rvalue::BinaryOp( + op @ (BinOp::Eq | BinOp::Ne), + box (left, right), + ) => { let (branch_value_scalar, branch_value_ty, to_switch_on) = find_branch_value_info(left, right)?; @@ -202,12 +205,12 @@ fn find_branch_value_info<'tcx>( match (left, right) { (Constant(branch_value), Copy(to_switch_on) | Move(to_switch_on)) | (Copy(to_switch_on) | Move(to_switch_on), Constant(branch_value)) => { - let branch_value_ty = branch_value.literal.ty; + let branch_value_ty = branch_value.literal.ty(); // we only want to apply this optimization if we are matching on integrals (and chars), as it is not possible to switch on floats if !branch_value_ty.is_integral() && !branch_value_ty.is_char() { return None; }; - let branch_value_scalar = branch_value.literal.val.try_to_scalar()?; + let branch_value_scalar = branch_value.literal.try_to_scalar()?; Some((branch_value_scalar, branch_value_ty, *to_switch_on)) } _ => None, diff --git a/compiler/rustc_mir/src/transform/simplify_try.rs b/compiler/rustc_mir/src/transform/simplify_try.rs index 05a8882807..b42543c04e 100644 --- a/compiler/rustc_mir/src/transform/simplify_try.rs +++ b/compiler/rustc_mir/src/transform/simplify_try.rs @@ -696,8 +696,8 @@ impl<'a, 'tcx> SimplifyBranchSameOptimizationFinder<'a, 'tcx> { /// _0 = move _1; // bb2 /// ``` /// In this case the two statements are equal iff - /// 1: _0 is an enum where the variant index 0 is fieldless, and - /// 2: bb1 was targeted by a switch where the discriminant of _1 was switched on + /// - `_0` is an enum where the variant index 0 is fieldless, and + /// - bb1 was targeted by a switch where the discriminant of `_1` was switched on fn statement_equality( &self, adt_matched_on: Place<'tcx>, diff --git a/compiler/rustc_mir/src/transform/unreachable_prop.rs b/compiler/rustc_mir/src/transform/unreachable_prop.rs index e39c865602..658c6b6e9d 100644 --- a/compiler/rustc_mir/src/transform/unreachable_prop.rs +++ b/compiler/rustc_mir/src/transform/unreachable_prop.rs @@ -12,8 +12,8 @@ pub struct UnreachablePropagation; impl MirPass<'_> for UnreachablePropagation { fn run_pass<'tcx>(&self, tcx: TyCtxt<'tcx>, body: &mut Body<'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 + if tcx.sess.mir_opt_level() < 4 { + // Enable only under -Zmir-opt-level=4 as in some cases (check the deeply-nested-opt // perf benchmark) LLVM may spend quite a lot of time optimizing the generated code. return; } diff --git a/compiler/rustc_mir/src/transform/validate.rs b/compiler/rustc_mir/src/transform/validate.rs index 29b90bff21..d009b0b1b2 100644 --- a/compiler/rustc_mir/src/transform/validate.rs +++ b/compiler/rustc_mir/src/transform/validate.rs @@ -294,7 +294,49 @@ impl<'a, 'tcx> Visitor<'tcx> for TypeChecker<'a, 'tcx> { ); } } - _ => {} + StatementKind::CopyNonOverlapping(box rustc_middle::mir::CopyNonOverlapping { + ref src, + ref dst, + ref count, + }) => { + let src_ty = src.ty(&self.body.local_decls, self.tcx); + let op_src_ty = if let Some(src_deref) = src_ty.builtin_deref(true) { + src_deref.ty + } else { + self.fail( + location, + format!("Expected src to be ptr in copy_nonoverlapping, got: {}", src_ty), + ); + return; + }; + let dst_ty = dst.ty(&self.body.local_decls, self.tcx); + let op_dst_ty = if let Some(dst_deref) = dst_ty.builtin_deref(true) { + dst_deref.ty + } else { + self.fail( + location, + format!("Expected dst to be ptr in copy_nonoverlapping, got: {}", dst_ty), + ); + return; + }; + // since CopyNonOverlapping is parametrized by 1 type, + // we only need to check that they are equal and not keep an extra parameter. + if op_src_ty != op_dst_ty { + self.fail(location, format!("bad arg ({:?} != {:?})", op_src_ty, op_dst_ty)); + } + + let op_cnt_ty = count.ty(&self.body.local_decls, self.tcx); + if op_cnt_ty != self.tcx.types.usize { + self.fail(location, format!("bad arg ({:?} != usize)", op_cnt_ty)) + } + } + StatementKind::SetDiscriminant { .. } + | StatementKind::StorageLive(..) + | StatementKind::StorageDead(..) + | StatementKind::LlvmInlineAsm(..) + | StatementKind::Retag(_, _) + | StatementKind::Coverage(_) + | StatementKind::Nop => {} } self.super_statement(statement, location); diff --git a/compiler/rustc_mir/src/util/elaborate_drops.rs b/compiler/rustc_mir/src/util/elaborate_drops.rs index 0e2d8e5495..e9190d7ebe 100644 --- a/compiler/rustc_mir/src/util/elaborate_drops.rs +++ b/compiler/rustc_mir/src/util/elaborate_drops.rs @@ -678,11 +678,14 @@ where let one = self.constant_usize(1); let (ptr_next, cur_next) = if ptr_based { - (Rvalue::Use(copy(cur.into())), Rvalue::BinaryOp(BinOp::Offset, move_(cur.into()), one)) + ( + Rvalue::Use(copy(cur.into())), + Rvalue::BinaryOp(BinOp::Offset, box (move_(cur.into()), one)), + ) } else { ( Rvalue::AddressOf(Mutability::Mut, tcx.mk_place_index(self.place, cur)), - Rvalue::BinaryOp(BinOp::Add, move_(cur.into()), one), + Rvalue::BinaryOp(BinOp::Add, box (move_(cur.into()), one)), ) }; @@ -700,7 +703,7 @@ where let loop_block = BasicBlockData { statements: vec![self.assign( can_go, - Rvalue::BinaryOp(BinOp::Eq, copy(Place::from(cur)), copy(length_or_end)), + Rvalue::BinaryOp(BinOp::Eq, box (copy(Place::from(cur)), copy(length_or_end))), )], is_cleanup: unwind.is_cleanup(), terminator: Some(Terminator { @@ -816,7 +819,10 @@ where 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, + box (Operand::Copy(cur), Operand::Move(length)), + ), ), ] } else { @@ -1029,7 +1035,7 @@ where Operand::Constant(box Constant { span: self.source_info.span, user_ty: None, - literal: ty::Const::from_usize(self.tcx(), val.into()), + literal: ty::Const::from_usize(self.tcx(), val.into()).into(), }) } diff --git a/compiler/rustc_mir/src/util/find_self_call.rs b/compiler/rustc_mir/src/util/find_self_call.rs index 5b146eeb87..ddda98d161 100644 --- a/compiler/rustc_mir/src/util/find_self_call.rs +++ b/compiler/rustc_mir/src/util/find_self_call.rs @@ -17,8 +17,8 @@ pub fn find_self_call<'tcx>( &body[block].terminator { debug!("find_self_call: func={:?}", func); - if let Operand::Constant(box Constant { literal: ty::Const { ty, .. }, .. }) = func { - if let ty::FnDef(def_id, substs) = *ty.kind() { + if let Operand::Constant(box Constant { literal, .. }) = func { + if let ty::FnDef(def_id, substs) = *literal.ty().kind() { if let Some(ty::AssocItem { fn_has_self_parameter: true, .. }) = tcx.opt_associated_item(def_id) { diff --git a/compiler/rustc_mir/src/util/generic_graphviz.rs b/compiler/rustc_mir/src/util/generic_graphviz.rs index fd55a4dfc4..fd41e28226 100644 --- a/compiler/rustc_mir/src/util/generic_graphviz.rs +++ b/compiler/rustc_mir/src/util/generic_graphviz.rs @@ -6,8 +6,8 @@ use std::io::{self, Write}; pub struct GraphvizWriter< 'a, G: graph::DirectedGraph + graph::WithSuccessors + graph::WithStartNode + graph::WithNumNodes, - NodeContentFn: Fn(::Node) -> Vec, - EdgeLabelsFn: Fn(::Node) -> Vec, + NodeContentFn: Fn(::Node) -> Vec, + EdgeLabelsFn: Fn(::Node) -> Vec, > { graph: &'a G, is_subgraph: bool, @@ -20,8 +20,8 @@ pub struct GraphvizWriter< impl< 'a, G: graph::DirectedGraph + graph::WithSuccessors + graph::WithStartNode + graph::WithNumNodes, - NodeContentFn: Fn(::Node) -> Vec, - EdgeLabelsFn: Fn(::Node) -> Vec, + NodeContentFn: Fn(::Node) -> Vec, + EdgeLabelsFn: Fn(::Node) -> Vec, > GraphvizWriter<'a, G, NodeContentFn, EdgeLabelsFn> { pub fn new( diff --git a/compiler/rustc_mir/src/util/graphviz.rs b/compiler/rustc_mir/src/util/graphviz.rs index 37498e50c0..92c7a358c0 100644 --- a/compiler/rustc_mir/src/util/graphviz.rs +++ b/compiler/rustc_mir/src/util/graphviz.rs @@ -2,7 +2,7 @@ use gsgdt::GraphvizSettings; use rustc_graphviz as dot; use rustc_hir::def_id::DefId; use rustc_middle::mir::*; -use rustc_middle::ty::TyCtxt; +use rustc_middle::ty::{self, TyCtxt}; use std::fmt::Debug; use std::io::{self, Write}; @@ -16,14 +16,27 @@ where { let def_ids = dump_mir_def_ids(tcx, single); - let use_subgraphs = def_ids.len() > 1; + let mirs = + def_ids + .iter() + .flat_map(|def_id| { + if tcx.is_const_fn_raw(*def_id) { + vec![tcx.optimized_mir(*def_id), tcx.mir_for_ctfe(*def_id)] + } else { + vec![tcx.instance_mir(ty::InstanceDef::Item(ty::WithOptConstParam::unknown( + *def_id, + )))] + } + }) + .collect::>(); + + let use_subgraphs = mirs.len() > 1; if use_subgraphs { writeln!(w, "digraph __crate__ {{")?; } - for def_id in def_ids { - let body = &tcx.optimized_mir(def_id); - write_mir_fn_graphviz(tcx, body, use_subgraphs, w)?; + for mir in mirs { + write_mir_fn_graphviz(tcx, mir, use_subgraphs, w)?; } if use_subgraphs { diff --git a/compiler/rustc_mir/src/util/pretty.rs b/compiler/rustc_mir/src/util/pretty.rs index 7fc1c3a73a..1bf010ffca 100644 --- a/compiler/rustc_mir/src/util/pretty.rs +++ b/compiler/rustc_mir/src/util/pretty.rs @@ -131,7 +131,7 @@ fn dump_matched_mir_node<'tcx, F>( Some(promoted) => write!(file, "::{:?}`", promoted)?, } writeln!(file, " {} {}", disambiguator, pass_name)?; - if let Some(ref layout) = body.generator_layout { + if let Some(ref layout) = body.generator_layout() { writeln!(file, "/* generator_layout = {:#?} */", layout)?; } writeln!(file)?; @@ -289,19 +289,19 @@ pub fn write_mir_pretty<'tcx>( } Ok(()) }; - match tcx.hir().body_const_context(def_id.expect_local()) { - None => render_body(w, tcx.optimized_mir(def_id))?, - // For `const fn` we want to render the optimized MIR. If you want the mir used in - // ctfe, you can dump the MIR after the `Deaggregator` optimization pass. - Some(rustc_hir::ConstContext::ConstFn) => { - render_body(w, tcx.optimized_mir(def_id))?; - writeln!(w)?; - writeln!(w, "// MIR FOR CTFE")?; - // Do not use `render_body`, as that would render the promoteds again, but these - // are shared between mir_for_ctfe and optimized_mir - write_mir_fn(tcx, tcx.mir_for_ctfe(def_id), &mut |_, _| Ok(()), w)?; - } - Some(_) => render_body(w, tcx.mir_for_ctfe(def_id))?, + + // For `const fn` we want to render both the optimized MIR and the MIR for ctfe. + if tcx.is_const_fn_raw(def_id) { + render_body(w, tcx.optimized_mir(def_id))?; + writeln!(w)?; + writeln!(w, "// MIR FOR CTFE")?; + // Do not use `render_body`, as that would render the promoteds again, but these + // are shared between mir_for_ctfe and optimized_mir + write_mir_fn(tcx, tcx.mir_for_ctfe(def_id), &mut |_, _| Ok(()), w)?; + } else { + let instance_mir = + tcx.instance_mir(ty::InstanceDef::Item(ty::WithOptConstParam::unknown(def_id))); + render_body(w, instance_mir)?; } } Ok(()) @@ -439,7 +439,7 @@ impl Visitor<'tcx> for ExtraComments<'tcx> { fn visit_constant(&mut self, constant: &Constant<'tcx>, location: Location) { self.super_constant(constant, location); let Constant { span, user_ty, literal } = constant; - match literal.ty.kind() { + match literal.ty().kind() { ty::Int(_) | ty::Uint(_) | ty::Bool | ty::Char => {} // Unit type ty::Tuple(tys) if tys.is_empty() => {} @@ -449,7 +449,12 @@ impl Visitor<'tcx> for ExtraComments<'tcx> { if let Some(user_ty) = user_ty { self.push(&format!("+ user_ty: {:?}", user_ty)); } - self.push(&format!("+ literal: {:?}", literal)); + match literal { + ConstantKind::Ty(literal) => self.push(&format!("+ literal: {:?}", literal)), + ConstantKind::Val(val, ty) => { + self.push(&format!("+ literal: {:?}, {}", val, ty)) + } + } } } } @@ -956,7 +961,7 @@ fn write_mir_sig(tcx: TyCtxt<'_>, body: &Body<'_>, w: &mut dyn Write) -> io::Res write!(w, ": {} =", body.return_ty())?; } - if let Some(yield_ty) = body.yield_ty { + if let Some(yield_ty) = body.yield_ty() { writeln!(w)?; writeln!(w, "yields {}", yield_ty)?; } diff --git a/compiler/rustc_mir/src/util/spanview.rs b/compiler/rustc_mir/src/util/spanview.rs index d3ef8c6456..a9a30e407b 100644 --- a/compiler/rustc_mir/src/util/spanview.rs +++ b/compiler/rustc_mir/src/util/spanview.rs @@ -245,6 +245,7 @@ pub fn statement_kind_name(statement: &Statement<'_>) -> &'static str { Retag(..) => "Retag", AscribeUserType(..) => "AscribeUserType", Coverage(..) => "Coverage", + CopyNonOverlapping(..) => "CopyNonOverlapping", Nop => "Nop", } } diff --git a/compiler/rustc_mir/src/util/storage.rs b/compiler/rustc_mir/src/util/storage.rs index 4e1696cd71..18b8ef557d 100644 --- a/compiler/rustc_mir/src/util/storage.rs +++ b/compiler/rustc_mir/src/util/storage.rs @@ -34,6 +34,7 @@ impl AlwaysLiveLocals { impl std::ops::Deref for AlwaysLiveLocals { type Target = BitSet; + #[inline] fn deref(&self) -> &Self::Target { &self.0 } diff --git a/compiler/rustc_mir_build/Cargo.toml b/compiler/rustc_mir_build/Cargo.toml index 2dd894a67a..b75221bb5d 100644 --- a/compiler/rustc_mir_build/Cargo.toml +++ b/compiler/rustc_mir_build/Cargo.toml @@ -24,4 +24,4 @@ rustc_span = { path = "../rustc_span" } rustc_target = { path = "../rustc_target" } rustc_trait_selection = { path = "../rustc_trait_selection" } rustc_ast = { path = "../rustc_ast" } -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } diff --git a/compiler/rustc_mir_build/src/build/block.rs b/compiler/rustc_mir_build/src/build/block.rs index d5f72e6f22..808c6e3ff6 100644 --- a/compiler/rustc_mir_build/src/build/block.rs +++ b/compiler/rustc_mir_build/src/build/block.rs @@ -2,7 +2,6 @@ use crate::build::matches::ArmHasGuard; use crate::build::ForGuard::OutsideGuard; use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder}; use crate::thir::*; -use rustc_hir as hir; use rustc_middle::mir::*; use rustc_session::lint::builtin::UNSAFE_OP_IN_UNSAFE_FN; use rustc_session::lint::Level; @@ -13,7 +12,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { &mut self, destination: Place<'tcx>, block: BasicBlock, - ast_block: &'tcx hir::Block<'tcx>, + ast_block: &Block<'_, 'tcx>, source_info: SourceInfo, ) -> BlockAnd<()> { let Block { @@ -24,7 +23,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { expr, targeted_by_break, safety_mode, - } = self.hir.mirror(ast_block); + } = *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 { @@ -50,8 +49,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { destination: Place<'tcx>, mut block: BasicBlock, span: Span, - stmts: Vec>, - expr: Option>, + stmts: &[Stmt<'_, 'tcx>], + expr: Option<&Expr<'_, 'tcx>>, safety_mode: BlockSafety, ) -> BlockAnd<()> { let this = self; @@ -79,10 +78,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { this.update_source_scope_for_safety_mode(span, safety_mode); let source_info = this.source_info(span); - for stmt in stmts { - let Stmt { kind, opt_destruction_scope } = this.hir.mirror(stmt); + for Stmt { kind, opt_destruction_scope } in stmts { match kind { - StmtKind::Expr { scope, expr } => { + &StmtKind::Expr { scope, expr } => { this.block_context.push(BlockFrame::Statement { ignores_expr_result: true }); unpack!( block = this.in_opt_scope( @@ -90,7 +88,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { |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)) }) } @@ -102,45 +99,44 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { this.block_context.push(BlockFrame::Statement { ignores_expr_result }); // Enter the remainder scope, i.e., the bindings' destruction scope. - this.push_scope((remainder_scope, source_info)); + this.push_scope((*remainder_scope, source_info)); 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.tcx, this.region_scope_tree); let visibility_scope = Some(this.new_source_scope(remainder_span, LintLevel::Inherited, None)); // Evaluate the initializer, if present. if let Some(init) = initializer { - let initializer_span = init.span(); + 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| { + let scope = (*init_scope, source_info); + this.in_scope(scope, *lint_level, |this| { this.declare_bindings( visibility_scope, remainder_span, - &pattern, + pattern, ArmHasGuard(false), Some((None, initializer_span)), ); - this.expr_into_pattern(block, pattern, init) + this.expr_into_pattern(block, pattern.clone(), init) }) } ) ); } else { - let scope = (init_scope, source_info); - unpack!(this.in_scope(scope, lint_level, |this| { + let scope = (*init_scope, source_info); + unpack!(this.in_scope(scope, *lint_level, |this| { this.declare_bindings( visibility_scope, remainder_span, - &pattern, + pattern, ArmHasGuard(false), None, ); @@ -171,18 +167,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // Then, the block may have an optional trailing expression which is a “return” value // of the block, which is stored into `destination`. - let tcx = this.hir.tcx(); + let tcx = this.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 span = match expr { - ExprRef::Thir(expr) => expr.span, - ExprRef::Mirror(ref expr) => expr.span, - }; - this.block_context.push(BlockFrame::TailExpr { tail_result_is_ignored, span }); + this.block_context + .push(BlockFrame::TailExpr { tail_result_is_ignored, span: expr.span }); - unpack!(block = this.into(destination, block, expr)); + unpack!(block = this.expr_into_dest(destination, block, expr)); let popped = this.block_context.pop(); assert!(popped.map_or(false, |bf| bf.is_tail_expr())); @@ -194,13 +187,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { if destination_ty.is_unit() { // We only want to assign an implicit `()` as the return value of the block if the // block does not diverge. (Otherwise, we may try to assign a unit to a `!`-type.) - this.cfg.push_assign_unit(block, source_info, destination, this.hir.tcx()); + this.cfg.push_assign_unit(block, source_info, destination, this.tcx); } } // Finally, we pop all the let scopes before exiting out from the scope of block // itself. for scope in let_scope_stack.into_iter().rev() { - unpack!(block = this.pop_scope((scope, source_info), block)); + unpack!(block = this.pop_scope((*scope, source_info), block)); } // Restore the original source scope. this.source_scope = outer_source_scope; @@ -220,7 +213,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { Safety::Safe => {} // no longer treat `unsafe fn`s as `unsafe` contexts (see RFC #2585) Safety::FnUnsafe - if self.hir.tcx().lint_level_at_node(UNSAFE_OP_IN_UNSAFE_FN, hir_id).0 + if self.tcx.lint_level_at_node(UNSAFE_OP_IN_UNSAFE_FN, hir_id).0 != Level::Allow => {} _ => return, } diff --git a/compiler/rustc_mir_build/src/build/cfg.rs b/compiler/rustc_mir_build/src/build/cfg.rs index 42e2b242d7..e562e52f84 100644 --- a/compiler/rustc_mir_build/src/build/cfg.rs +++ b/compiler/rustc_mir_build/src/build/cfg.rs @@ -68,7 +68,7 @@ impl<'tcx> CFG<'tcx> { Rvalue::Use(Operand::Constant(box Constant { span: source_info.span, user_ty: None, - literal: ty::Const::zero_sized(tcx, tcx.types.unit), + literal: ty::Const::zero_sized(tcx, tcx.types.unit).into(), })), ); } diff --git a/compiler/rustc_mir_build/src/build/expr/as_constant.rs b/compiler/rustc_mir_build/src/build/expr/as_constant.rs index 3a36ad590c..57f56e2d09 100644 --- a/compiler/rustc_mir_build/src/build/expr/as_constant.rs +++ b/compiler/rustc_mir_build/src/build/expr/as_constant.rs @@ -8,18 +8,10 @@ use rustc_middle::ty::CanonicalUserTypeAnnotation; impl<'a, 'tcx> Builder<'a, 'tcx> { /// Compile `expr`, yielding a compile-time constant. Assumes that /// `expr` is a valid compile-time constant! - crate fn as_constant(&mut self, expr: M) -> Constant<'tcx> - where - M: Mirror<'tcx, Output = Expr<'tcx>>, - { - let expr = self.hir.mirror(expr); - self.expr_as_constant(expr) - } - - fn expr_as_constant(&mut self, expr: Expr<'tcx>) -> Constant<'tcx> { + crate fn as_constant(&mut self, expr: &Expr<'_, 'tcx>) -> Constant<'tcx> { let this = self; - let Expr { ty, temp_lifetime: _, span, kind } = expr; - match kind { + let Expr { ty, temp_lifetime: _, span, ref kind } = *expr; + match *kind { ExprKind::Scope { region_scope: _, lint_level: _, value } => this.as_constant(value), ExprKind::Literal { literal, user_ty, const_id: _ } => { let user_ty = user_ty.map(|user_ty| { @@ -30,10 +22,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { }) }); assert_eq!(literal.ty, ty); - Constant { span, user_ty, literal } + Constant { span, user_ty, literal: literal.into() } + } + ExprKind::StaticRef { literal, .. } => { + Constant { span, user_ty: None, literal: literal.into() } + } + ExprKind::ConstBlock { value } => { + Constant { span: span, user_ty: None, literal: value.into() } } - ExprKind::StaticRef { literal, .. } => Constant { span, user_ty: None, literal }, - ExprKind::ConstBlock { value } => Constant { span, user_ty: None, literal: value }, _ => span_bug!(span, "expression is not a valid constant {:?}", kind), } } diff --git a/compiler/rustc_mir_build/src/build/expr/as_operand.rs b/compiler/rustc_mir_build/src/build/expr/as_operand.rs index 60f8d8c8a9..c393878e0b 100644 --- a/compiler/rustc_mir_build/src/build/expr/as_operand.rs +++ b/compiler/rustc_mir_build/src/build/expr/as_operand.rs @@ -14,10 +14,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// after the current enclosing `ExprKind::Scope` has ended, so /// please do *not* return it from functions to avoid bad /// miscompiles. - crate fn as_local_operand(&mut self, block: BasicBlock, expr: M) -> BlockAnd> - where - M: Mirror<'tcx, Output = Expr<'tcx>>, - { + crate fn as_local_operand( + &mut self, + block: BasicBlock, + expr: &Expr<'_, 'tcx>, + ) -> BlockAnd> { let local_scope = self.local_scope(); self.as_operand(block, Some(local_scope), expr) } @@ -70,14 +71,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// value to the stack. /// /// See #68034 for more details. - crate fn as_local_call_operand( + crate fn as_local_call_operand( &mut self, block: BasicBlock, - expr: M, - ) -> BlockAnd> - where - M: Mirror<'tcx, Output = Expr<'tcx>>, - { + expr: &Expr<'_, 'tcx>, + ) -> BlockAnd> { let local_scope = self.local_scope(); self.as_call_operand(block, Some(local_scope), expr) } @@ -88,41 +86,16 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// this time. /// /// The operand is known to be live until the end of `scope`. - crate fn as_operand( - &mut self, - block: BasicBlock, - scope: Option, - expr: M, - ) -> BlockAnd> - where - M: Mirror<'tcx, Output = Expr<'tcx>>, - { - let expr = self.hir.mirror(expr); - self.expr_as_operand(block, scope, expr) - } - + /// /// Like `as_local_call_operand`, except that the argument will /// not be valid once `scope` ends. - fn as_call_operand( - &mut self, - block: BasicBlock, - scope: Option, - expr: M, - ) -> BlockAnd> - where - M: Mirror<'tcx, Output = Expr<'tcx>>, - { - let expr = self.hir.mirror(expr); - self.expr_as_call_operand(block, scope, expr) - } - - fn expr_as_operand( + crate fn as_operand( &mut self, mut block: BasicBlock, scope: Option, - expr: Expr<'tcx>, + expr: &Expr<'_, 'tcx>, ) -> BlockAnd> { - debug!("expr_as_operand(block={:?}, expr={:?})", block, expr); + debug!("as_operand(block={:?}, expr={:?})", block, expr); let this = self; if let ExprKind::Scope { region_scope, lint_level, value } = expr.kind { @@ -133,7 +106,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } let category = Category::of(&expr.kind).unwrap(); - debug!("expr_as_operand: category={:?} for={:?}", category, expr.kind); + debug!("as_operand: category={:?} for={:?}", category, expr.kind); match category { Category::Constant => { let constant = this.as_constant(expr); @@ -146,13 +119,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } } - fn expr_as_call_operand( + crate fn as_call_operand( &mut self, mut block: BasicBlock, scope: Option, - expr: Expr<'tcx>, + expr: &Expr<'_, 'tcx>, ) -> BlockAnd> { - debug!("expr_as_call_operand(block={:?}, expr={:?})", block, expr); + debug!("as_call_operand(block={:?}, expr={:?})", block, expr); let this = self; if let ExprKind::Scope { region_scope, lint_level, value } = expr.kind { @@ -163,12 +136,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { }); } - let tcx = this.hir.tcx(); + let tcx = this.tcx; if tcx.features().unsized_fn_params { let ty = expr.ty; let span = expr.span; - let param_env = this.hir.param_env; + let param_env = this.param_env; if !ty.is_sized(tcx.at(span), param_env) { // !sized means !copy, so this is an unsized move @@ -176,9 +149,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // As described above, detect the case where we are passing a value of unsized // type, and that value is coming from the deref of a box. - if let ExprKind::Deref { ref arg } = expr.kind { - let arg = this.hir.mirror(arg.clone()); - + if let ExprKind::Deref { arg } = expr.kind { // Generate let tmp0 = arg0 let operand = unpack!(block = this.as_temp(block, scope, arg, Mutability::Mut)); @@ -193,6 +164,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } } - this.expr_as_operand(block, scope, expr) + this.as_operand(block, scope, expr) } } diff --git a/compiler/rustc_mir_build/src/build/expr/as_place.rs b/compiler/rustc_mir_build/src/build/expr/as_place.rs index 3308a243a3..fbc9c30fe5 100644 --- a/compiler/rustc_mir_build/src/build/expr/as_place.rs +++ b/compiler/rustc_mir_build/src/build/expr/as_place.rs @@ -10,6 +10,7 @@ use rustc_middle::hir::place::ProjectionKind as HirProjectionKind; use rustc_middle::middle::region; use rustc_middle::mir::AssertKind::BoundsCheck; use rustc_middle::mir::*; +use rustc_middle::ty::AdtDef; use rustc_middle::ty::{self, CanonicalUserTypeAnnotation, Ty, TyCtxt, Variance}; use rustc_span::Span; use rustc_target::abi::VariantIdx; @@ -17,7 +18,7 @@ use rustc_target::abi::VariantIdx; use rustc_index::vec::Idx; /// The "outermost" place that holds this value. -#[derive(Copy, Clone)] +#[derive(Copy, Clone, Debug, PartialEq)] crate enum PlaceBase { /// Denotes the start of a `Place`. Local(Local), @@ -67,7 +68,7 @@ crate enum PlaceBase { /// /// This is used internally when building a place for an expression like `a.b.c`. The fields `b` /// and `c` can be progressively pushed onto the place builder that is created when converting `a`. -#[derive(Clone)] +#[derive(Clone, Debug, PartialEq)] crate struct PlaceBuilder<'tcx> { base: PlaceBase, projection: Vec>, @@ -83,20 +84,23 @@ fn convert_to_hir_projections_and_truncate_for_capture<'tcx>( mir_projections: &[PlaceElem<'tcx>], ) -> Vec { let mut hir_projections = Vec::new(); + let mut variant = None; for mir_projection in mir_projections { let hir_projection = match mir_projection { ProjectionElem::Deref => HirProjectionKind::Deref, ProjectionElem::Field(field, _) => { - // We will never encouter this for multivariant enums, - // read the comment for `Downcast`. - HirProjectionKind::Field(field.index() as u32, VariantIdx::new(0)) + let variant = variant.unwrap_or(VariantIdx::new(0)); + HirProjectionKind::Field(field.index() as u32, variant) } - ProjectionElem::Downcast(..) => { - // This projections exist only for enums that have - // multiple variants. Since such enums that are captured - // completely, we can stop here. - break; + ProjectionElem::Downcast(.., idx) => { + // We don't expect to see multi-variant enums here, as earlier + // phases will have truncated them already. However, there can + // still be downcasts, thanks to single-variant enums. + // We keep track of VariantIdx so we can use this information + // if the next ProjectionElem is a Field. + variant = Some(*idx); + continue; } ProjectionElem::Index(..) | ProjectionElem::ConstantIndex { .. } @@ -106,7 +110,7 @@ fn convert_to_hir_projections_and_truncate_for_capture<'tcx>( break; } }; - + variant = None; hir_projections.push(hir_projection); } @@ -194,12 +198,12 @@ fn find_capture_matching_projections<'a, 'tcx>( /// Takes a PlaceBuilder and resolves the upvar (if any) within it, so that the /// `PlaceBuilder` now starts from `PlaceBase::Local`. /// -/// Returns a Result with the error being the HirId of the Upvar that was not found. +/// Returns a Result with the error being the PlaceBuilder (`from_builder`) that was not found. fn to_upvars_resolved_place_builder<'a, 'tcx>( from_builder: PlaceBuilder<'tcx>, tcx: TyCtxt<'tcx>, typeck_results: &'a ty::TypeckResults<'tcx>, -) -> Result, HirId> { +) -> Result, PlaceBuilder<'tcx>> { match from_builder.base { PlaceBase::Local(_) => Ok(from_builder), PlaceBase::Upvar { var_hir_id, closure_def_id, closure_kind } => { @@ -230,13 +234,12 @@ fn to_upvars_resolved_place_builder<'a, 'tcx>( from_builder.projection ) } else { - // FIXME(project-rfc-2229#24): Handle this case properly debug!( "No associated capture found for {:?}[{:#?}]", var_hir_id, from_builder.projection, ); } - return Err(var_hir_id); + return Err(from_builder); }; let closure_ty = typeck_results @@ -300,6 +303,25 @@ impl<'tcx> PlaceBuilder<'tcx> { to_upvars_resolved_place_builder(self, tcx, typeck_results).unwrap() } + /// Attempts to resolve the `PlaceBuilder`. + /// On success, it will return the resolved `PlaceBuilder`. + /// On failure, it will return itself. + /// + /// Upvars resolve may fail for a `PlaceBuilder` when attempting to + /// resolve a disjoint field whose root variable is not captured + /// (destructured assignments) or when attempting to resolve a root + /// variable (discriminant matching with only wildcard arm) that is + /// not captured. This can happen because the final mir that will be + /// generated doesn't require a read for this place. Failures will only + /// happen inside closures. + crate fn try_upvars_resolved<'a>( + self, + tcx: TyCtxt<'tcx>, + typeck_results: &'a ty::TypeckResults<'tcx>, + ) -> Result, PlaceBuilder<'tcx>> { + to_upvars_resolved_place_builder(self, tcx, typeck_results) + } + crate fn base(&self) -> PlaceBase { self.base } @@ -308,15 +330,22 @@ impl<'tcx> PlaceBuilder<'tcx> { self.project(PlaceElem::Field(f, ty)) } - fn deref(self) -> Self { + crate fn deref(self) -> Self { self.project(PlaceElem::Deref) } + crate fn downcast(self, adt_def: &'tcx AdtDef, variant_index: VariantIdx) -> Self { + self.project(PlaceElem::Downcast( + Some(adt_def.variants[variant_index].ident.name), + variant_index, + )) + } + fn index(self, index: Local) -> Self { self.project(PlaceElem::Index(index)) } - fn project(mut self, elem: PlaceElem<'tcx>) -> Self { + crate fn project(mut self, elem: PlaceElem<'tcx>) -> Self { self.projection.push(elem); self } @@ -347,25 +376,22 @@ 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. - crate fn as_place(&mut self, mut block: BasicBlock, expr: M) -> BlockAnd> - where - M: Mirror<'tcx, Output = Expr<'tcx>>, - { + crate fn as_place( + &mut self, + mut block: BasicBlock, + expr: &Expr<'_, 'tcx>, + ) -> BlockAnd> { let place_builder = unpack!(block = self.as_place_builder(block, expr)); - block.and(place_builder.into_place(self.hir.tcx(), self.hir.typeck_results())) + block.and(place_builder.into_place(self.tcx, self.typeck_results)) } /// This is used when constructing a compound `Place`, so that we can avoid creating /// intermediate `Place` values until we know the full set of projections. - crate fn as_place_builder( + crate fn as_place_builder( &mut self, block: BasicBlock, - expr: M, - ) -> BlockAnd> - where - M: Mirror<'tcx, Output = Expr<'tcx>>, - { - let expr = self.hir.mirror(expr); + expr: &Expr<'_, 'tcx>, + ) -> BlockAnd> { self.expr_as_place(block, expr, Mutability::Mut, None) } @@ -374,16 +400,13 @@ 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. - crate fn as_read_only_place( + crate fn as_read_only_place( &mut self, mut block: BasicBlock, - expr: M, - ) -> BlockAnd> - where - M: Mirror<'tcx, Output = Expr<'tcx>>, - { + expr: &Expr<'_, 'tcx>, + ) -> BlockAnd> { let place_builder = unpack!(block = self.as_read_only_place_builder(block, expr)); - block.and(place_builder.into_place(self.hir.tcx(), self.hir.typeck_results())) + block.and(place_builder.into_place(self.tcx, self.typeck_results)) } /// This is used when constructing a compound `Place`, so that we can avoid creating @@ -392,22 +415,18 @@ 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. - fn as_read_only_place_builder( + fn as_read_only_place_builder( &mut self, block: BasicBlock, - expr: M, - ) -> BlockAnd> - where - M: Mirror<'tcx, Output = Expr<'tcx>>, - { - let expr = self.hir.mirror(expr); + expr: &Expr<'_, 'tcx>, + ) -> BlockAnd> { self.expr_as_place(block, expr, Mutability::Not, None) } fn expr_as_place( &mut self, mut block: BasicBlock, - expr: Expr<'tcx>, + expr: &Expr<'_, 'tcx>, mutability: Mutability, fake_borrow_temps: Option<&mut Vec>, ) -> BlockAnd> { @@ -419,18 +438,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { 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::Field { lhs, name } => { - let lhs = this.hir.mirror(lhs); 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,)); block.and(place_builder.deref()) @@ -462,7 +478,6 @@ 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,) ); @@ -474,8 +489,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { inferred_ty: expr.ty, }); - let place = - place_builder.clone().into_place(this.hir.tcx(), this.hir.typeck_results()); + let place = place_builder.clone().into_place(this.tcx, this.typeck_results); this.cfg.push( block, Statement { @@ -493,7 +507,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { block.and(place_builder) } ExprKind::ValueTypeAscription { source, user_ty } => { - let source = this.hir.mirror(source); let temp = unpack!(block = this.as_temp(block, source.temp_lifetime, source, mutability)); if let Some(user_ty) = user_ty { @@ -570,12 +583,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { upvar_id: ty::UpvarId, ) -> BlockAnd> { let closure_ty = self - .hir - .typeck_results() - .node_type(self.hir.tcx().hir().local_def_id_to_hir_id(upvar_id.closure_expr_id)); + .typeck_results + .node_type(self.tcx.hir().local_def_id_to_hir_id(upvar_id.closure_expr_id)); let closure_kind = if let ty::Closure(_, closure_substs) = closure_ty.kind() { - self.hir.infcx().closure_kind(closure_substs).unwrap() + self.infcx.closure_kind(closure_substs).unwrap() } else { // Generators are considered FnOnce. ty::ClosureKind::FnOnce @@ -599,41 +611,32 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { fn lower_index_expression( &mut self, mut block: BasicBlock, - base: ExprRef<'tcx>, - index: ExprRef<'tcx>, + base: &Expr<'_, 'tcx>, + index: &Expr<'_, 'tcx>, mutability: Mutability, fake_borrow_temps: Option<&mut Vec>, temp_lifetime: Option, expr_span: Span, source_info: SourceInfo, ) -> BlockAnd> { - let lhs = self.hir.mirror(base); - let base_fake_borrow_temps = &mut Vec::new(); let is_outermost_index = fake_borrow_temps.is_none(); let fake_borrow_temps = fake_borrow_temps.unwrap_or(base_fake_borrow_temps); let mut base_place = - unpack!(block = self.expr_as_place(block, lhs, mutability, Some(fake_borrow_temps),)); + unpack!(block = self.expr_as_place(block, base, 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,)); - block = self.bounds_check( - block, - base_place.clone().into_place(self.hir.tcx(), self.hir.typeck_results()), - idx, - expr_span, - source_info, - ); + block = self.bounds_check(block, base_place.clone(), idx, expr_span, source_info); if is_outermost_index { self.read_fake_borrows(block, fake_borrow_temps, source_info) } else { - base_place = - base_place.expect_upvars_resolved(self.hir.tcx(), self.hir.typeck_results()); + base_place = base_place.expect_upvars_resolved(self.tcx, self.typeck_results); self.add_fake_borrows_of_base( &base_place, block, @@ -649,25 +652,33 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { fn bounds_check( &mut self, block: BasicBlock, - slice: Place<'tcx>, + slice: PlaceBuilder<'tcx>, index: Local, expr_span: Span, source_info: SourceInfo, ) -> BasicBlock { - let usize_ty = self.hir.usize_ty(); - let bool_ty = self.hir.bool_ty(); + let usize_ty = self.tcx.types.usize; + let bool_ty = self.tcx.types.bool; // bounds check: let len = self.temp(usize_ty, expr_span); 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.into_place(self.tcx, self.typeck_results)), + ); // lt = idx < len self.cfg.push_assign( block, source_info, lt, - Rvalue::BinaryOp(BinOp::Lt, Operand::Copy(Place::from(index)), Operand::Copy(len)), + Rvalue::BinaryOp( + BinOp::Lt, + box (Operand::Copy(Place::from(index)), Operand::Copy(len)), + ), ); let msg = BoundsCheck { len: Operand::Move(len), index: Operand::Copy(Place::from(index)) }; // assert!(lt, "...") @@ -682,7 +693,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { expr_span: Span, source_info: SourceInfo, ) { - let tcx = self.hir.tcx(); + let tcx = self.tcx; let local = match base_place.base { PlaceBase::Local(local) => local, PlaceBase::Upvar { .. } => bug!("Expected PlacseBase::Local found Upvar"), diff --git a/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs b/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs index e602f4dd71..7f24a41b00 100644 --- a/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs +++ b/compiler/rustc_mir_build/src/build/expr/as_rvalue.rs @@ -8,6 +8,7 @@ use crate::build::{BlockAnd, BlockAndExtension, Builder}; use crate::thir::*; use rustc_middle::middle::region; use rustc_middle::mir::AssertKind; +use rustc_middle::mir::Place; use rustc_middle::mir::*; use rustc_middle::ty::{self, Ty, UpvarSubsts}; use rustc_span::Span; @@ -19,33 +20,21 @@ 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. - crate fn as_local_rvalue(&mut self, block: BasicBlock, expr: M) -> BlockAnd> - where - M: Mirror<'tcx, Output = Expr<'tcx>>, - { + crate fn as_local_rvalue( + &mut self, + block: BasicBlock, + expr: &Expr<'_, 'tcx>, + ) -> BlockAnd> { let local_scope = self.local_scope(); self.as_rvalue(block, Some(local_scope), expr) } /// Compile `expr`, yielding an rvalue. - fn as_rvalue( - &mut self, - block: BasicBlock, - scope: Option, - expr: M, - ) -> BlockAnd> - where - M: Mirror<'tcx, Output = Expr<'tcx>>, - { - let expr = self.hir.mirror(expr); - self.expr_as_rvalue(block, scope, expr) - } - - fn expr_as_rvalue( + crate fn as_rvalue( &mut self, mut block: BasicBlock, scope: Option, - expr: Expr<'tcx>, + expr: &Expr<'_, 'tcx>, ) -> BlockAnd> { debug!("expr_as_rvalue(block={:?}, scope={:?}, expr={:?})", block, scope, expr); @@ -71,8 +60,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { ExprKind::Unary { op, arg } => { let arg = unpack!(block = this.as_operand(block, scope, arg)); // Check for -MIN on signed integers - if this.hir.check_overflow() && op == UnOp::Neg && expr.ty.is_signed() { - let bool_ty = this.hir.bool_ty(); + if this.check_overflow && op == UnOp::Neg && expr.ty.is_signed() { + let bool_ty = this.tcx.types.bool; let minval = this.minval_literal(expr_span, expr.ty); let is_min = this.temp(bool_ty, expr_span); @@ -81,7 +70,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { block, source_info, is_min, - Rvalue::BinaryOp(BinOp::Eq, arg.to_copy(), minval), + Rvalue::BinaryOp(BinOp::Eq, box (arg.to_copy(), minval)), ); block = this.assert( @@ -95,7 +84,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { block.and(Rvalue::UnaryOp(op, arg)) } ExprKind::Box { value } => { - let value = this.hir.mirror(value); // The `Box` temporary created here is not a part of the HIR, // and therefore is not considered during generator auto-trait // determination. See the comment about `box` at `yield_in_scope`. @@ -115,8 +103,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // initialize the box contents: unpack!( - block = - this.into(this.hir.tcx().mk_place_deref(Place::from(result)), block, value) + block = this.expr_into_dest( + this.tcx.mk_place_deref(Place::from(result)), + block, + value + ) ); block.and(Rvalue::Use(Operand::Move(Place::from(result)))) } @@ -156,7 +147,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // to the same MIR as `let x = ();`. // first process the set of fields - let el_ty = expr.ty.sequence_element_type(this.hir.tcx()); + let el_ty = expr.ty.sequence_element_type(this.tcx); let fields: Vec<_> = fields .into_iter() .map(|f| unpack!(block = this.as_operand(block, scope, f))) @@ -174,12 +165,45 @@ 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, ref fake_reads } => { + // Convert the closure fake reads, if any, from `ExprRef` to mir `Place` + // and push the fake reads. + // This must come before creating the operands. This is required in case + // there is a fake read and a borrow of the same path, since otherwise the + // fake read might interfere with the borrow. Consider an example like this + // one: + // ``` + // let mut x = 0; + // let c = || { + // &mut x; // mutable borrow of `x` + // match x { _ => () } // fake read of `x` + // }; + // ``` + // FIXME(RFC2229): Remove feature gate once diagnostics are improved + if this.tcx.features().capture_disjoint_fields { + for (thir_place, cause, hir_id) in fake_reads.into_iter() { + let place_builder = + unpack!(block = this.as_place_builder(block, thir_place)); + + if let Ok(place_builder_resolved) = + place_builder.try_upvars_resolved(this.tcx, this.typeck_results) + { + let mir_place = + place_builder_resolved.into_place(this.tcx, this.typeck_results); + this.cfg.push_fake_read( + block, + this.source_info(this.tcx.hir().span(*hir_id)), + *cause, + mir_place, + ); + } + } + } + // see (*) above let operands: Vec<_> = upvars .into_iter() .map(|upvar| { - let upvar = this.hir.mirror(upvar); match Category::of(&upvar.kind) { // Use as_place to avoid creating a temporary when // moving a variable into a closure, so that @@ -214,6 +238,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } }) .collect(); + let result = match substs { UpvarSubsts::Generator(substs) => { // We implicitly set the discriminant to 0. See @@ -230,7 +255,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { block.and(Rvalue::Use(Operand::Constant(box Constant { span: expr_span, user_ty: None, - literal: ty::Const::zero_sized(this.hir.tcx(), this.hir.tcx().types.unit), + literal: ty::Const::zero_sized(this.tcx, this.tcx.types.unit).into(), }))) } ExprKind::Yield { .. } @@ -282,21 +307,21 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { rhs: Operand<'tcx>, ) -> BlockAnd> { let source_info = self.source_info(span); - let bool_ty = self.hir.bool_ty(); - if self.hir.check_overflow() && op.is_checkable() && ty.is_integral() { - let result_tup = self.hir.tcx().intern_tup(&[ty, bool_ty]); + let bool_ty = self.tcx.types.bool; + if self.check_overflow && op.is_checkable() && ty.is_integral() { + let result_tup = self.tcx.intern_tup(&[ty, bool_ty]); let result_value = self.temp(result_tup, span); self.cfg.push_assign( block, source_info, result_value, - Rvalue::CheckedBinaryOp(op, lhs.to_copy(), rhs.to_copy()), + Rvalue::CheckedBinaryOp(op, box (lhs.to_copy(), rhs.to_copy())), ); let val_fld = Field::new(0); let of_fld = Field::new(1); - let tcx = self.hir.tcx(); + let tcx = self.tcx; let val = tcx.mk_place_field(result_value, val_fld, ty); let of = tcx.mk_place_field(result_value, of_fld, bool_ty); @@ -324,7 +349,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { block, source_info, is_zero, - Rvalue::BinaryOp(BinOp::Eq, rhs.to_copy(), zero), + Rvalue::BinaryOp(BinOp::Eq, box (rhs.to_copy(), zero)), ); block = self.assert(block, Operand::Move(is_zero), false, zero_err, span); @@ -345,13 +370,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { block, source_info, is_neg_1, - Rvalue::BinaryOp(BinOp::Eq, rhs.to_copy(), neg_1), + Rvalue::BinaryOp(BinOp::Eq, box (rhs.to_copy(), neg_1)), ); self.cfg.push_assign( block, source_info, is_min, - Rvalue::BinaryOp(BinOp::Eq, lhs.to_copy(), min), + Rvalue::BinaryOp(BinOp::Eq, box (lhs.to_copy(), min)), ); let is_neg_1 = Operand::Move(is_neg_1); @@ -360,14 +385,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { block, source_info, of, - Rvalue::BinaryOp(BinOp::BitAnd, is_neg_1, is_min), + Rvalue::BinaryOp(BinOp::BitAnd, box (is_neg_1, is_min)), ); block = self.assert(block, Operand::Move(of), false, overflow_err, span); } } - block.and(Rvalue::BinaryOp(op, lhs, rhs)) + block.and(Rvalue::BinaryOp(op, box (lhs, rhs))) } } @@ -377,7 +402,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { upvar_ty: Ty<'tcx>, temp_lifetime: Option, mut block: BasicBlock, - arg: ExprRef<'tcx>, + arg: &Expr<'_, 'tcx>, ) -> BlockAnd> { let this = self; @@ -398,7 +423,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // is same as that of the capture in the parent closure. PlaceBase::Upvar { .. } => { let enclosing_upvars_resolved = - arg_place_builder.clone().into_place(this.hir.tcx(), this.hir.typeck_results()); + arg_place_builder.clone().into_place(this.tcx, this.typeck_results); match enclosing_upvars_resolved.as_ref() { PlaceRef { @@ -435,13 +460,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { Mutability::Mut => BorrowKind::Mut { allow_two_phase_borrow: false }, }; - let arg_place = arg_place_builder.into_place(this.hir.tcx(), this.hir.typeck_results()); + let arg_place = arg_place_builder.into_place(this.tcx, this.typeck_results); this.cfg.push_assign( block, source_info, Place::from(temp), - Rvalue::Ref(this.hir.tcx().lifetimes.re_erased, borrow_kind, arg_place), + Rvalue::Ref(this.tcx.lifetimes.re_erased, borrow_kind, arg_place), ); // See the comment in `expr_as_temp` and on the `rvalue_scopes` field for why @@ -456,9 +481,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // Helper to get a `-1` value of the appropriate type fn neg_1_literal(&mut self, span: Span, ty: Ty<'tcx>) -> Operand<'tcx> { let param_ty = ty::ParamEnv::empty().and(ty); - let bits = self.hir.tcx().layout_of(param_ty).unwrap().size.bits(); + let bits = self.tcx.layout_of(param_ty).unwrap().size.bits(); let n = (!0u128) >> (128 - bits); - let literal = ty::Const::from_bits(self.hir.tcx(), n, param_ty); + let literal = ty::Const::from_bits(self.tcx, n, param_ty); self.literal_operand(span, literal) } @@ -467,9 +492,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { fn minval_literal(&mut self, span: Span, ty: Ty<'tcx>) -> Operand<'tcx> { assert!(ty.is_signed()); let param_ty = ty::ParamEnv::empty().and(ty); - let bits = self.hir.tcx().layout_of(param_ty).unwrap().size.bits(); + let bits = self.tcx.layout_of(param_ty).unwrap().size.bits(); let n = 1 << (bits - 1); - let literal = ty::Const::from_bits(self.hir.tcx(), n, param_ty); + let literal = ty::Const::from_bits(self.tcx, n, param_ty); self.literal_operand(span, literal) } diff --git a/compiler/rustc_mir_build/src/build/expr/as_temp.rs b/compiler/rustc_mir_build/src/build/expr/as_temp.rs index 9984b527ff..98b910ab21 100644 --- a/compiler/rustc_mir_build/src/build/expr/as_temp.rs +++ b/compiler/rustc_mir_build/src/build/expr/as_temp.rs @@ -4,40 +4,34 @@ use crate::build::scope::DropKind; use crate::build::{BlockAnd, BlockAndExtension, Builder}; use crate::thir::*; use rustc_data_structures::stack::ensure_sufficient_stack; -use rustc_hir as hir; use rustc_middle::middle::region; use rustc_middle::mir::*; 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. - crate fn as_temp( + crate fn as_temp( &mut self, block: BasicBlock, temp_lifetime: Option, - expr: M, + expr: &Expr<'_, 'tcx>, mutability: Mutability, - ) -> BlockAnd - where - M: Mirror<'tcx, Output = Expr<'tcx>>, - { - let expr = self.hir.mirror(expr); - // + ) -> BlockAnd { // this is the only place in mir building that we need to truly need to worry about // infinite recursion. Everything else does recurse, too, but it always gets broken up // at some point by inserting an intermediate temporary - ensure_sufficient_stack(|| self.expr_as_temp(block, temp_lifetime, expr, mutability)) + ensure_sufficient_stack(|| self.as_temp_inner(block, temp_lifetime, expr, mutability)) } - fn expr_as_temp( + fn as_temp_inner( &mut self, mut block: BasicBlock, temp_lifetime: Option, - expr: Expr<'tcx>, + expr: &Expr<'_, 'tcx>, mutability: Mutability, ) -> BlockAnd { debug!( - "expr_as_temp(block={:?}, temp_lifetime={:?}, expr={:?}, mutability={:?})", + "as_temp(block={:?}, temp_lifetime={:?}, expr={:?}, mutability={:?})", block, temp_lifetime, expr, mutability ); let this = self; @@ -65,13 +59,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } match expr.kind { ExprKind::StaticRef { def_id, .. } => { - assert!(!this.hir.tcx().is_thread_local_static(def_id)); + assert!(!this.tcx.is_thread_local_static(def_id)); local_decl.internal = true; local_decl.local_info = Some(box LocalInfo::StaticRef { def_id, is_thread_local: false }); } ExprKind::ThreadLocalRef(def_id) => { - assert!(this.hir.tcx().is_thread_local_static(def_id)); + assert!(this.tcx.is_thread_local_static(def_id)); local_decl.internal = true; local_decl.local_info = Some(box LocalInfo::StaticRef { def_id, is_thread_local: true }); @@ -89,7 +83,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // 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, .. } } + ExprKind::Block { body: Block { expr: None, targeted_by_break: false, .. } } if expr_ty.is_never() => {} _ => { this.cfg @@ -114,7 +108,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } } - unpack!(block = this.into(temp_place, block, expr)); + unpack!(block = this.expr_into_dest(temp_place, block, expr)); if let Some(temp_lifetime) = temp_lifetime { this.schedule_drop(expr_span, temp_lifetime, temp, DropKind::Value); diff --git a/compiler/rustc_mir_build/src/build/expr/category.rs b/compiler/rustc_mir_build/src/build/expr/category.rs index 9320b5810e..0cadfa2f0a 100644 --- a/compiler/rustc_mir_build/src/build/expr/category.rs +++ b/compiler/rustc_mir_build/src/build/expr/category.rs @@ -31,7 +31,7 @@ crate enum RvalueFunc { /// Determines the category for a given expression. Note that scope /// and paren expressions have no category. impl Category { - crate fn of(ek: &ExprKind<'_>) -> Option { + crate fn of(ek: &ExprKind<'_, '_>) -> Option { match *ek { ExprKind::Scope { .. } => None, diff --git a/compiler/rustc_mir_build/src/build/expr/into.rs b/compiler/rustc_mir_build/src/build/expr/into.rs index 235fe14cbf..fc92e8019c 100644 --- a/compiler/rustc_mir_build/src/build/expr/into.rs +++ b/compiler/rustc_mir_build/src/build/expr/into.rs @@ -7,19 +7,20 @@ use rustc_ast::InlineAsmOptions; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::stack::ensure_sufficient_stack; use rustc_hir as hir; +use rustc_index::vec::Idx; use rustc_middle::mir::*; -use rustc_middle::ty::CanonicalUserTypeAnnotation; +use rustc_middle::ty::{self, CanonicalUserTypeAnnotation}; impl<'a, 'tcx> Builder<'a, 'tcx> { /// Compile `expr`, storing the result into `destination`, which /// is assumed to be uninitialized. - crate fn into_expr( + crate fn expr_into_dest( &mut self, destination: Place<'tcx>, mut block: BasicBlock, - expr: Expr<'tcx>, + expr: &Expr<'_, 'tcx>, ) -> BlockAnd<()> { - debug!("into_expr(destination={:?}, block={:?}, expr={:?})", destination, block, expr); + debug!("expr_into_dest(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 @@ -40,11 +41,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let region_scope = (region_scope, source_info); ensure_sufficient_stack(|| { this.in_scope(region_scope, lint_level, |this| { - this.into(destination, block, value) + this.expr_into_dest(destination, block, value) }) }) } - ExprKind::Block { body: ast_block } => { + ExprKind::Block { body: ref ast_block } => { this.ast_block(destination, block, ast_block, source_info) } ExprKind::Match { scrutinee, arms } => { @@ -58,17 +59,17 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let mut then_block = this.cfg.start_new_block(); let mut else_block = this.cfg.start_new_block(); - let term = TerminatorKind::if_(this.hir.tcx(), operand, then_block, else_block); + let term = TerminatorKind::if_(this.tcx, operand, then_block, else_block); this.cfg.terminate(block, source_info, term); - unpack!(then_block = this.into(destination, then_block, then)); + unpack!(then_block = this.expr_into_dest(destination, then_block, then)); else_block = if let Some(else_opt) = else_opt { - unpack!(this.into(destination, else_block, else_opt)) + unpack!(this.expr_into_dest(destination, else_block, else_opt)) } else { // Body of the `if` expression without an `else` clause must return `()`, thus // we implicitly generate a `else {}` if it is not specified. let correct_si = this.source_info(expr_span.shrink_to_hi()); - this.cfg.push_assign_unit(else_block, correct_si, destination, this.hir.tcx()); + this.cfg.push_assign_unit(else_block, correct_si, destination, this.tcx); else_block }; @@ -87,7 +88,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { join_block.unit() } ExprKind::NeverToAny { source } => { - let source = this.hir.mirror(source); let is_call = matches!(source.kind, ExprKind::Call { .. } | ExprKind::InlineAsm { .. }); @@ -132,25 +132,33 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { LogicalOp::And => (else_block, false_block), LogicalOp::Or => (true_block, else_block), }; - let term = TerminatorKind::if_(this.hir.tcx(), lhs, blocks.0, blocks.1); + let term = TerminatorKind::if_(this.tcx, lhs, blocks.0, blocks.1); this.cfg.terminate(block, source_info, term); let rhs = unpack!(else_block = this.as_local_operand(else_block, rhs)); - let term = TerminatorKind::if_(this.hir.tcx(), rhs, true_block, false_block); + let term = TerminatorKind::if_(this.tcx, rhs, true_block, false_block); this.cfg.terminate(else_block, source_info, term); this.cfg.push_assign_constant( 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: ty::Const::from_bool(this.tcx, true).into(), + }, ); this.cfg.push_assign_constant( false_block, source_info, destination, - Constant { span: expr_span, user_ty: None, literal: this.hir.false_literal() }, + Constant { + span: expr_span, + user_ty: None, + literal: ty::Const::from_bool(this.tcx, false).into(), + }, ); // Link up both branches: @@ -188,7 +196,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // introduce a unit temporary as the destination for the loop body. 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)); + let body_block_end = unpack!(this.expr_into_dest(tmp, body_block, body)); this.cfg.goto(body_block_end, source_info, loop_block); // Loops are only exited by `break` expressions. @@ -206,7 +214,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { this.record_operands_moved(&args); - debug!("into_expr: fn_span={:?}", fn_span); + debug!("expr_into_dest: fn_span={:?}", fn_span); this.cfg.terminate( block, @@ -230,7 +238,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { this.diverge_from(block); success.unit() } - ExprKind::Use { source } => this.into(destination, block, source), + ExprKind::Use { source } => this.expr_into_dest(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 @@ -241,8 +249,7 @@ 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.tcx.lifetimes.re_erased, borrow_kind, arg_place); this.cfg.push_assign(block, source_info, destination, borrow); block.unit() } @@ -255,7 +262,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { this.cfg.push_assign(block, source_info, destination, address_of); block.unit() } - ExprKind::Adt { adt_def, variant_index, substs, user_ty, fields, base } => { + ExprKind::Adt { adt_def, variant_index, substs, user_ty, fields, ref base } => { // See the notes for `ExprKind::Array` in `as_rvalue` and for // `ExprKind::Borrow` above. let is_union = adt_def.is_union(); @@ -270,7 +277,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { .map(|f| (f.name, unpack!(block = this.as_operand(block, Some(scope), f.expr)))) .collect(); - let field_names = this.hir.all_fields(adt_def, variant_index); + let field_names: Vec<_> = + (0..adt_def.variants[variant_index].fields.len()).map(Field::new).collect(); let fields: Vec<_> = if let Some(FruInfo { base, field_types }) = base { let place_builder = unpack!(block = this.as_place_builder(block, base)); @@ -288,7 +296,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { this.consume_by_copy_or_move( place_builder .field(n, ty) - .into_place(this.hir.tcx(), this.hir.typeck_results()), + .into_place(this.tcx, this.typeck_results), ) } }) @@ -325,7 +333,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { use rustc_middle::mir; let operands = operands .into_iter() - .map(|op| match op { + .map(|op| match *op { thir::InlineAsmOperand::In { reg, expr } => mir::InlineAsmOperand::In { reg, value: unpack!(block = this.as_local_operand(block, expr)), @@ -334,7 +342,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { mir::InlineAsmOperand::Out { reg, late, - place: expr.map(|expr| unpack!(block = this.as_place(block, expr))), + place: expr + .as_ref() + .map(|expr| unpack!(block = this.as_place(block, expr))), } } thir::InlineAsmOperand::InOut { reg, late, expr } => { @@ -352,7 +362,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { reg, late, in_value: unpack!(block = this.as_local_operand(block, in_expr)), - out_place: out_expr.map(|out_expr| { + out_place: out_expr.as_ref().map(|out_expr| { unpack!(block = this.as_place(block, out_expr)) }), } @@ -394,7 +404,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { | ExprKind::AssignOp { .. } | ExprKind::LlvmInlineAsm { .. } => { unpack!(block = this.stmt_expr(block, expr, None)); - this.cfg.push_assign_unit(block, source_info, destination, this.hir.tcx()); + this.cfg.push_assign_unit(block, source_info, destination, this.tcx); block.unit() } @@ -417,7 +427,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { block.unit() } ExprKind::Index { .. } | ExprKind::Deref { .. } | ExprKind::Field { .. } => { - debug_assert!(Category::of(&expr.kind) == Some(Category::Place)); + debug_assert_eq!(Category::of(&expr.kind), Some(Category::Place)); // Create a "fake" temporary variable so that we check that the // value is Sized. Usually, this is caught in type checking, but @@ -426,8 +436,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { this.local_decls.push(LocalDecl::new(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); diff --git a/compiler/rustc_mir_build/src/build/expr/mod.rs b/compiler/rustc_mir_build/src/build/expr/mod.rs index ac8c7e725e..539de80cab 100644 --- a/compiler/rustc_mir_build/src/build/expr/mod.rs +++ b/compiler/rustc_mir_build/src/build/expr/mod.rs @@ -9,7 +9,7 @@ //! a type that is not `Copy`, then using any of these functions will //! "move" the value out of its current home (if any). //! -//! - `into` -- writes the value into a specific location, which +//! - `expr_into_dest` -- writes the value into a specific location, which //! should be uninitialized //! - `as_operand` -- evaluates the value and yields an `Operand`, //! suitable for use as an argument to an `Rvalue` @@ -62,7 +62,7 @@ mod as_constant; mod as_operand; -mod as_place; +pub mod as_place; mod as_rvalue; mod as_temp; mod category; diff --git a/compiler/rustc_mir_build/src/build/expr/stmt.rs b/compiler/rustc_mir_build/src/build/expr/stmt.rs index f117689d94..f01315fc5d 100644 --- a/compiler/rustc_mir_build/src/build/expr/stmt.rs +++ b/compiler/rustc_mir_build/src/build/expr/stmt.rs @@ -13,7 +13,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { crate fn stmt_expr( &mut self, mut block: BasicBlock, - expr: Expr<'tcx>, + expr: &Expr<'_, 'tcx>, statement_scope: Option, ) -> BlockAnd<()> { let this = self; @@ -21,29 +21,25 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let source_info = this.source_info(expr.span); // Handle a number of expressions that don't need a destination at all. This // avoids needing a mountain of temporary `()` variables. - let expr2 = expr.clone(); match expr.kind { 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) }) } ExprKind::Assign { lhs, rhs } => { - let lhs = this.hir.mirror(lhs); - let rhs = this.hir.mirror(rhs); let lhs_span = lhs.span; // Note: we evaluate assignments right-to-left. This // is better for borrowck interaction with overloaded // operators like x[j] = x[i]. - debug!("stmt_expr Assign block_context.push(SubExpr) : {:?}", expr2); + debug!("stmt_expr Assign block_context.push(SubExpr) : {:?}", expr); this.block_context.push(BlockFrame::SubExpr); // Generate better code for things that don't need to be // dropped. - if this.hir.needs_drop(lhs.ty) { + if lhs.ty.needs_drop(this.tcx, this.param_env) { let rhs = unpack!(block = this.as_local_operand(block, rhs)); let lhs = unpack!(block = this.as_place(block, lhs)); unpack!(block = this.build_drop_and_replace(block, lhs_span, lhs, rhs)); @@ -65,10 +61,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // only affects weird things like `x += {x += 1; x}` // -- is that equal to `x + (x + 1)` or `2*(x+1)`? - let lhs = this.hir.mirror(lhs); let lhs_ty = lhs.ty; - debug!("stmt_expr AssignOp block_context.push(SubExpr) : {:?}", expr2); + debug!("stmt_expr AssignOp block_context.push(SubExpr) : {:?}", expr); this.block_context.push(BlockFrame::SubExpr); // As above, RTL. @@ -90,24 +85,27 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { ExprKind::Continue { label } => { this.break_scope(block, None, BreakableTarget::Continue(label), source_info) } - ExprKind::Break { label, value } => { - this.break_scope(block, value, BreakableTarget::Break(label), source_info) - } + ExprKind::Break { label, value } => this.break_scope( + block, + value.as_deref(), + BreakableTarget::Break(label), + source_info, + ), ExprKind::Return { value } => { - this.break_scope(block, value, BreakableTarget::Return, source_info) + this.break_scope(block, value.as_deref(), BreakableTarget::Return, source_info) } ExprKind::LlvmInlineAsm { asm, outputs, inputs } => { - debug!("stmt_expr LlvmInlineAsm block_context.push(SubExpr) : {:?}", expr2); + debug!("stmt_expr LlvmInlineAsm block_context.push(SubExpr) : {:?}", expr); this.block_context.push(BlockFrame::SubExpr); let outputs = outputs .into_iter() - .map(|output| unpack!(block = this.as_place(block, output))) + .map(|output| unpack!(block = this.as_place(block, &output))) .collect::>() .into_boxed_slice(); let inputs = inputs .into_iter() .map(|input| { - (input.span(), unpack!(block = this.as_local_operand(block, input))) + (input.span, unpack!(block = this.as_local_operand(block, &input))) }) .collect::>() .into_boxed_slice(); @@ -140,15 +138,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // it is usually better to focus on `the_value` rather // than the entirety of block(s) surrounding it. let adjusted_span = (|| { - if let ExprKind::Block { body } = expr.kind { + 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 { - if let Some(subtail_expr) = &subblock.expr { - expr = subtail_expr - } else { - break; - } + let mut expr = &*tail_expr; + while let ExprKind::Block { + body: Block { expr: Some(nested_expr), .. }, + } + | ExprKind::Scope { value: nested_expr, .. } = &expr.kind + { + expr = nested_expr; } this.block_context.push(BlockFrame::TailExpr { tail_result_is_ignored: true, diff --git a/compiler/rustc_mir_build/src/build/into.rs b/compiler/rustc_mir_build/src/build/into.rs deleted file mode 100644 index 7264e495b8..0000000000 --- a/compiler/rustc_mir_build/src/build/into.rs +++ /dev/null @@ -1,55 +0,0 @@ -//! In general, there are a number of things for which it's convenient -//! to just call `builder.into` and have it emit its result into a -//! given location. This is basically for expressions or things that can be -//! wrapped up as expressions (e.g., blocks). To make this ergonomic, we use this -//! latter `EvalInto` trait. - -use crate::build::{BlockAnd, Builder}; -use crate::thir::*; -use rustc_middle::mir::*; - -pub(in crate::build) trait EvalInto<'tcx> { - fn eval_into( - self, - builder: &mut Builder<'_, 'tcx>, - destination: Place<'tcx>, - block: BasicBlock, - ) -> BlockAnd<()>; -} - -impl<'a, 'tcx> Builder<'a, 'tcx> { - crate fn into( - &mut self, - destination: Place<'tcx>, - block: BasicBlock, - expr: E, - ) -> BlockAnd<()> - where - E: EvalInto<'tcx>, - { - expr.eval_into(self, destination, block) - } -} - -impl<'tcx> EvalInto<'tcx> for ExprRef<'tcx> { - fn eval_into( - self, - builder: &mut Builder<'_, 'tcx>, - destination: Place<'tcx>, - block: BasicBlock, - ) -> BlockAnd<()> { - let expr = builder.hir.mirror(self); - builder.into_expr(destination, block, expr) - } -} - -impl<'tcx> EvalInto<'tcx> for Expr<'tcx> { - fn eval_into( - self, - builder: &mut Builder<'_, 'tcx>, - destination: Place<'tcx>, - block: BasicBlock, - ) -> BlockAnd<()> { - builder.into_expr(destination, block, self) - } -} diff --git a/compiler/rustc_mir_build/src/build/matches/mod.rs b/compiler/rustc_mir_build/src/build/matches/mod.rs index fde007ec01..73fd3f0feb 100644 --- a/compiler/rustc_mir_build/src/build/matches/mod.rs +++ b/compiler/rustc_mir_build/src/build/matches/mod.rs @@ -5,6 +5,7 @@ //! This also includes code for pattern bindings in `let` statements and //! function parameters. +use crate::build::expr::as_place::PlaceBuilder; use crate::build::scope::DropKind; use crate::build::ForGuard::{self, OutsideGuard, RefWithinGuard}; use crate::build::{BlockAnd, BlockAndExtension, Builder}; @@ -89,14 +90,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { destination: Place<'tcx>, span: Span, mut block: BasicBlock, - scrutinee: ExprRef<'tcx>, - arms: Vec>, + scrutinee: &Expr<'_, 'tcx>, + arms: &[Arm<'_, 'tcx>], ) -> BlockAnd<()> { - let scrutinee_span = scrutinee.span(); + let scrutinee_span = scrutinee.span; let scrutinee_place = unpack!(block = self.lower_scrutinee(block, scrutinee, scrutinee_span,)); - let mut arm_candidates = self.create_match_candidates(scrutinee_place, &arms); + let mut arm_candidates = self.create_match_candidates(scrutinee_place.clone(), &arms); let match_has_guard = arms.iter().any(|arm| arm.guard.is_some()); let mut candidates = @@ -119,10 +120,10 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { fn lower_scrutinee( &mut self, mut block: BasicBlock, - scrutinee: ExprRef<'tcx>, + scrutinee: &Expr<'_, 'tcx>, scrutinee_span: Span, - ) -> BlockAnd> { - let scrutinee_place = unpack!(block = self.as_place(block, scrutinee)); + ) -> BlockAnd> { + let scrutinee_place_builder = unpack!(block = self.as_place_builder(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 @@ -140,23 +141,29 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // check safety. 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); - block.and(scrutinee_place) + if let Ok(scrutinee_builder) = + scrutinee_place_builder.clone().try_upvars_resolved(self.tcx, self.typeck_results) + { + let scrutinee_place = scrutinee_builder.into_place(self.tcx, self.typeck_results); + self.cfg.push_fake_read(block, source_info, cause_matched_place, scrutinee_place); + } + + block.and(scrutinee_place_builder) } /// 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>, Candidate<'pat, 'tcx>)> { + scrutinee: PlaceBuilder<'tcx>, + arms: &'pat [Arm<'pat, 'tcx>], + ) -> Vec<(&'pat Arm<'pat, 'tcx>, Candidate<'pat, 'tcx>)> { // Assemble a list of candidates: there is one candidate per pattern, // which means there may be more than one candidate *per arm*. arms.iter() .map(|arm| { let arm_has_guard = arm.guard.is_some(); - let arm_candidate = Candidate::new(scrutinee, &arm.pattern, arm_has_guard); + let arm_candidate = Candidate::new(scrutinee.clone(), &arm.pattern, arm_has_guard); (arm, arm_candidate) }) .collect() @@ -222,9 +229,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { fn lower_match_arms( &mut self, destination: Place<'tcx>, - scrutinee_place: Place<'tcx>, + scrutinee_place_builder: PlaceBuilder<'tcx>, scrutinee_span: Span, - arm_candidates: Vec<(&'_ Arm<'tcx>, Candidate<'_, 'tcx>)>, + arm_candidates: Vec<(&'_ Arm<'_, 'tcx>, Candidate<'_, 'tcx>)>, outer_source_info: SourceInfo, fake_borrow_temps: Vec<(Place<'tcx>, Local)>, ) -> BlockAnd<()> { @@ -236,13 +243,33 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { 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()); + // `try_upvars_resolved` may fail if it is unable to resolve the given + // `PlaceBuilder` inside a closure. In this case, we don't want to include + // a scrutinee place. `scrutinee_place_builder` will fail to be resolved + // if the only match arm is a wildcard (`_`). + // Example: + // ``` + // let foo = (0, 1); + // let c = || { + // match foo { _ => () }; + // }; + // ``` + let mut opt_scrutinee_place: Option<(Option<&Place<'tcx>>, Span)> = None; + let scrutinee_place: Place<'tcx>; + if let Ok(scrutinee_builder) = scrutinee_place_builder + .clone() + .try_upvars_resolved(this.tcx, this.typeck_results) + { + scrutinee_place = + scrutinee_builder.into_place(this.tcx, this.typeck_results); + opt_scrutinee_place = Some((Some(&scrutinee_place), scrutinee_span)); + } let scope = this.declare_bindings( None, arm.span, &arm.pattern, ArmHasGuard(arm.guard.is_some()), - Some((Some(&scrutinee_place), scrutinee_span)), + opt_scrutinee_place, ); let arm_block = this.bind_pattern( @@ -259,7 +286,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { this.source_scope = source_scope; } - this.into(destination, arm_block, body) + this.expr_into_dest(destination, arm_block, &arm.body) }) }) .collect(); @@ -286,7 +313,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { &mut self, outer_source_info: SourceInfo, candidate: Candidate<'_, 'tcx>, - guard: Option<&Guard<'tcx>>, + guard: Option<&Guard<'_, 'tcx>>, fake_borrow_temps: &Vec<(Place<'tcx>, Local)>, scrutinee_span: Span, arm_span: Option, @@ -362,14 +389,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { &mut self, mut block: BasicBlock, irrefutable_pat: Pat<'tcx>, - initializer: ExprRef<'tcx>, + initializer: &Expr<'_, '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, .. } => { let place = self.storage_live_binding(block, var, irrefutable_pat.span, OutsideGuard, true); - unpack!(block = self.into(place, block, initializer)); + unpack!(block = self.expr_into_dest(place, block, initializer)); // Inject a fake read, see comments on `FakeReadCause::ForLet`. let source_info = self.source_info(irrefutable_pat.span); @@ -404,7 +431,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } => { let place = self.storage_live_binding(block, var, irrefutable_pat.span, OutsideGuard, true); - unpack!(block = self.into(place, block, initializer)); + unpack!(block = self.expr_into_dest(place, block, initializer)); // Inject a fake read, see comments on `FakeReadCause::ForLet`. let pattern_source_info = self.source_info(irrefutable_pat.span); @@ -414,7 +441,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let ty_source_info = self.source_info(user_ty_span); let user_ty = pat_ascription_ty.user_ty( &mut self.canonical_user_type_annotations, - place.ty(&self.local_decls, self.hir.tcx()).ty, + place.ty(&self.local_decls, self.tcx).ty, ty_source_info.span, ); self.cfg.push( @@ -447,8 +474,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } _ => { - let place = unpack!(block = self.as_place(block, initializer)); - self.place_into_pattern(block, irrefutable_pat, place, true) + let place_builder = unpack!(block = self.as_place_builder(block, initializer)); + self.place_into_pattern(block, irrefutable_pat, place_builder, true) } } } @@ -457,14 +484,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { &mut self, block: BasicBlock, irrefutable_pat: Pat<'tcx>, - initializer: Place<'tcx>, + initializer: PlaceBuilder<'tcx>, set_match_place: bool, ) -> BlockAnd<()> { - let mut candidate = Candidate::new(initializer, &irrefutable_pat, false); - + let mut candidate = Candidate::new(initializer.clone(), &irrefutable_pat, false); let fake_borrow_temps = self.lower_match_tree(block, irrefutable_pat.span, false, &mut [&mut candidate]); - // For matches and function arguments, the place that is being matched // can be set when creating the variables. But the place for // let PATTERN = ... might not even exist until we do the assignment. @@ -479,7 +504,27 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { VarBindingForm { opt_match_place: Some((ref mut match_place, _)), .. }, )))) = self.local_decls[local].local_info { - *match_place = Some(initializer); + // `try_upvars_resolved` may fail if it is unable to resolve the given + // `PlaceBuilder` inside a closure. In this case, we don't want to include + // a scrutinee place. `scrutinee_place_builder` will fail for destructured + // assignments. This is because a closure only captures the precise places + // that it will read and as a result a closure may not capture the entire + // tuple/struct and rather have individual places that will be read in the + // final MIR. + // Example: + // ``` + // let foo = (0, 1); + // let c = || { + // let (v1, v2) = foo; + // }; + // ``` + if let Ok(match_pair_resolved) = + initializer.clone().try_upvars_resolved(self.tcx, self.typeck_results) + { + let place = + match_pair_resolved.into_place(self.tcx, self.typeck_results); + *match_place = Some(place); + } } else { bug!("Let binding to non-user variable.") } @@ -556,7 +601,7 @@ impl<'a, 'tcx> Builder<'a, '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) }); - let region_scope = self.hir.region_scope_tree.var_scope(var.local_id); + let region_scope = self.region_scope_tree.var_scope(var.local_id); if schedule_drop { self.schedule_drop(span, region_scope, local_id, DropKind::Storage); } @@ -565,7 +610,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { 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); + let region_scope = self.region_scope_tree.var_scope(var.local_id); self.schedule_drop(span, region_scope, local_id, DropKind::Value); } @@ -718,7 +763,7 @@ struct Candidate<'pat, 'tcx> { } impl<'tcx, 'pat> Candidate<'pat, 'tcx> { - fn new(place: Place<'tcx>, pattern: &'pat Pat<'tcx>, has_guard: bool) -> Self { + fn new(place: PlaceBuilder<'tcx>, pattern: &'pat Pat<'tcx>, has_guard: bool) -> Self { Candidate { span: pattern.span, has_guard, @@ -792,7 +837,7 @@ struct Ascription<'tcx> { #[derive(Clone, Debug)] crate struct MatchPair<'pat, 'tcx> { // this place... - place: Place<'tcx>, + place: PlaceBuilder<'tcx>, // ... must match this pattern. pattern: &'pat Pat<'tcx>, @@ -1071,7 +1116,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { fake_borrows.insert(Place { local: source.local, - projection: self.hir.tcx().intern_place_elems(proj_base), + projection: self.tcx.intern_place_elems(proj_base), }); } } @@ -1199,7 +1244,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { &mut otherwise, pats, or_span, - place, + place.clone(), fake_borrows, ); }); @@ -1225,12 +1270,14 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { otherwise: &mut Option, pats: &'pat [Pat<'tcx>], or_span: Span, - place: Place<'tcx>, + place: PlaceBuilder<'tcx>, fake_borrows: &mut Option>>, ) { debug!("test_or_pattern:\ncandidate={:#?}\npats={:#?}", candidate, pats); - let mut or_candidates: Vec<_> = - pats.iter().map(|pat| Candidate::new(place, pat, candidate.has_guard)).collect(); + let mut or_candidates: Vec<_> = pats + .iter() + .map(|pat| Candidate::new(place.clone(), pat, candidate.has_guard)) + .collect(); let mut or_candidate_refs: Vec<_> = or_candidates.iter_mut().collect(); let otherwise = if candidate.otherwise_block.is_some() { &mut candidate.otherwise_block @@ -1413,7 +1460,7 @@ 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; + let match_place = match_pair.place.clone(); // most of the time, the test to perform is simply a function // of the main candidate; but for a test like SwitchInt, we @@ -1439,7 +1486,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // Insert a Shallow borrow of any places that is switched on. if let Some(fb) = fake_borrows { - fb.insert(match_place); + if let Ok(match_place_resolved) = + match_place.clone().try_upvars_resolved(self.tcx, self.typeck_results) + { + let resolved_place = match_place_resolved.into_place(self.tcx, self.typeck_results); + fb.insert(resolved_place); + } } // perform the test, branching to one of N blocks. For each of @@ -1457,7 +1509,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // encounter a candidate where the test is not relevant; at // that point, we stop sorting. while let Some(candidate) = candidates.first_mut() { - if let Some(idx) = self.sort_candidate(&match_place, &test, candidate) { + if let Some(idx) = self.sort_candidate(&match_place.clone(), &test, candidate) { let (candidate, rest) = candidates.split_first_mut().unwrap(); target_candidates[idx].push(candidate); candidates = rest; @@ -1550,7 +1602,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { fake_borrows: &'b FxHashSet>, temp_span: Span, ) -> Vec<(Place<'tcx>, Local)> { - let tcx = self.hir.tcx(); + let tcx = self.tcx; debug!("add_fake_borrows fake_borrows = {:?}", fake_borrows); @@ -1613,7 +1665,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { &mut self, candidate: Candidate<'pat, 'tcx>, parent_bindings: &[(Vec>, Vec>)], - guard: Option<&Guard<'tcx>>, + guard: Option<&Guard<'_, 'tcx>>, fake_borrows: &Vec<(Place<'tcx>, Local)>, scrutinee_span: Span, arm_span: Option, @@ -1727,7 +1779,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // * So we eagerly create the reference for the arm and then take a // reference to that. if let Some(guard) = guard { - let tcx = self.hir.tcx(); + let tcx = self.tcx; let bindings = parent_bindings .iter() .flat_map(|(bindings, _)| bindings) @@ -1749,37 +1801,46 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let (guard_span, (post_guard_block, otherwise_post_guard_block)) = match guard { Guard::If(e) => { - let e = self.hir.mirror(e.clone()); let source_info = self.source_info(e.span); (e.span, self.test_bool(block, e, source_info)) } Guard::IfLet(pat, scrutinee) => { - let scrutinee_span = scrutinee.span(); - let scrutinee_place = unpack!( - block = self.lower_scrutinee(block, scrutinee.clone(), scrutinee_span) - ); - let mut guard_candidate = Candidate::new(scrutinee_place, &pat, false); + let scrutinee_span = scrutinee.span; + let scrutinee_place_builder = + unpack!(block = self.lower_scrutinee(block, scrutinee, scrutinee_span)); + let mut guard_candidate = + Candidate::new(scrutinee_place_builder.clone(), &pat, false); let wildcard = Pat::wildcard_from_ty(pat.ty); - let mut otherwise_candidate = Candidate::new(scrutinee_place, &wildcard, false); + let mut otherwise_candidate = + Candidate::new(scrutinee_place_builder.clone(), &wildcard, false); let fake_borrow_temps = self.lower_match_tree( block, pat.span, false, &mut [&mut guard_candidate, &mut otherwise_candidate], ); + let mut opt_scrutinee_place: Option<(Option<&Place<'tcx>>, Span)> = None; + let scrutinee_place: Place<'tcx>; + if let Ok(scrutinee_builder) = + scrutinee_place_builder.try_upvars_resolved(self.tcx, self.typeck_results) + { + scrutinee_place = + scrutinee_builder.into_place(self.tcx, self.typeck_results); + opt_scrutinee_place = Some((Some(&scrutinee_place), scrutinee_span)); + } self.declare_bindings( None, pat.span.to(arm_span.unwrap()), pat, ArmHasGuard(false), - Some((Some(&scrutinee_place), scrutinee.span())), + opt_scrutinee_place, ); let post_guard_block = self.bind_pattern( self.source_info(pat.span), guard_candidate, None, &fake_borrow_temps, - scrutinee.span(), + scrutinee.span, None, None, ); @@ -1888,7 +1949,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { 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, + ascription.source.ty(&self.local_decls, self.tcx).ty, source_info.span, ); self.cfg.push( @@ -1917,7 +1978,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // Assign each of the bindings. Since we are binding for a // guard expression, this will never trigger moves out of the // candidate. - let re_erased = self.hir.tcx().lifetimes.re_erased; + let re_erased = self.tcx.lifetimes.re_erased; for binding in bindings { debug!("bind_matched_candidate_for_guard(binding={:?})", binding); let source_info = self.source_info(binding.span); @@ -1966,7 +2027,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { { debug!("bind_matched_candidate_for_arm_body(block={:?})", block); - let re_erased = self.hir.tcx().lifetimes.re_erased; + let re_erased = self.tcx.lifetimes.re_erased; // Assign each of the bindings. This may trigger moves out of the candidate. for binding in bindings { let source_info = self.source_info(binding.span); @@ -2015,7 +2076,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { var_id, name, mode, var_ty, visibility_scope, source_info ); - let tcx = self.hir.tcx(); + let tcx = self.tcx; let debug_source_info = SourceInfo { span: source_info.span, scope: visibility_scope }; let binding_mode = match mode { BindingMode::ByValue => ty::BindingMode::BindByValue(mutability), diff --git a/compiler/rustc_mir_build/src/build/matches/simplify.rs b/compiler/rustc_mir_build/src/build/matches/simplify.rs index ddfaeafc07..3ad143a57f 100644 --- a/compiler/rustc_mir_build/src/build/matches/simplify.rs +++ b/compiler/rustc_mir_build/src/build/matches/simplify.rs @@ -12,11 +12,11 @@ //! sort of test: for example, testing which variant an enum is, or //! testing a value against a constant. +use crate::build::expr::as_place::PlaceBuilder; use crate::build::matches::{Ascription, Binding, Candidate, MatchPair}; use crate::build::Builder; use crate::thir::{self, *}; use rustc_hir::RangeEnd; -use rustc_middle::mir::Place; use rustc_middle::ty; use rustc_middle::ty::layout::IntegerExt; use rustc_target::abi::{Integer, Size}; @@ -68,11 +68,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let match_pairs = mem::take(&mut candidate.match_pairs); if let [MatchPair { pattern: Pat { kind: box PatKind::Or { pats }, .. }, place }] = - *match_pairs + &*match_pairs { existing_bindings.extend_from_slice(&new_bindings); mem::swap(&mut candidate.bindings, &mut existing_bindings); - candidate.subcandidates = self.create_or_subcandidates(candidate, place, pats); + candidate.subcandidates = + self.create_or_subcandidates(candidate, place.clone(), pats); return true; } @@ -125,12 +126,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { fn create_or_subcandidates<'pat>( &mut self, candidate: &Candidate<'pat, 'tcx>, - place: Place<'tcx>, + place: PlaceBuilder<'tcx>, pats: &'pat [Pat<'tcx>], ) -> Vec> { pats.iter() .map(|pat| { - let mut candidate = Candidate::new(place, pat, candidate.has_guard); + let mut candidate = Candidate::new(place.clone(), pat, candidate.has_guard); self.simplify_candidate(&mut candidate); candidate }) @@ -147,18 +148,17 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { match_pair: MatchPair<'pat, 'tcx>, candidate: &mut Candidate<'pat, 'tcx>, ) -> Result<(), MatchPair<'pat, 'tcx>> { - let tcx = self.hir.tcx(); + let tcx = self.tcx; match *match_pair.pattern.kind { PatKind::AscribeUserType { ref subpattern, ascription: thir::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, - source: match_pair.place, + source: match_pair.place.clone().into_place(self.tcx, self.typeck_results), variance, }); @@ -177,7 +177,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { name, mutability, span: match_pair.pattern.span, - source: match_pair.place, + source: match_pair.place.clone().into_place(self.tcx, self.typeck_results), var_id: var, var_ty: ty, binding_mode: mode, @@ -251,21 +251,23 @@ 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 + self.tcx.features().exhaustive_patterns && !v .uninhabited_from( - self.hir.tcx(), + self.tcx, substs, adt_def.adt_kind(), - self.hir.param_env, + self.param_env, ) .is_empty() } }) && (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)); + let place_builder = match_pair.place.downcast(adt_def, variant_index); + candidate + .match_pairs + .extend(self.field_match_pairs(place_builder, subpatterns)); Ok(()) } else { Err(match_pair) @@ -290,8 +292,8 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } PatKind::Deref { ref subpattern } => { - let place = tcx.mk_place_deref(match_pair.place); - candidate.match_pairs.push(MatchPair::new(place, subpattern)); + let place_builder = match_pair.place.deref(); + candidate.match_pairs.push(MatchPair::new(place_builder, subpattern)); Ok(()) } diff --git a/compiler/rustc_mir_build/src/build/matches/test.rs b/compiler/rustc_mir_build/src/build/matches/test.rs index 126fb957a6..b082169cd6 100644 --- a/compiler/rustc_mir_build/src/build/matches/test.rs +++ b/compiler/rustc_mir_build/src/build/matches/test.rs @@ -5,6 +5,7 @@ // identify what tests are needed, perform the tests, and then filter // the candidates based on the result. +use crate::build::expr::as_place::PlaceBuilder; use crate::build::matches::{Candidate, MatchPair, Test, TestKind}; use crate::build::Builder; use crate::thir::pattern::compare_const_vals; @@ -13,9 +14,11 @@ use rustc_data_structures::fx::FxIndexMap; use rustc_hir::{LangItem, RangeEnd}; use rustc_index::bit_set::BitSet; use rustc_middle::mir::*; +use rustc_middle::ty::subst::{GenericArg, Subst}; use rustc_middle::ty::util::IntTypeExt; -use rustc_middle::ty::{self, adjustment::PointerCast, Ty}; -use rustc_span::symbol::sym; +use rustc_middle::ty::{self, adjustment::PointerCast, Ty, TyCtxt}; +use rustc_span::def_id::DefId; +use rustc_span::symbol::{sym, Symbol}; use rustc_target::abi::VariantIdx; use std::cmp::Ordering; @@ -51,7 +54,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { PatKind::Constant { value } => Test { span: match_pair.pattern.span, - kind: TestKind::Eq { value, ty: match_pair.pattern.ty.clone() }, + kind: TestKind::Eq { value, ty: match_pair.pattern.ty }, }, PatKind::Range(range) => { @@ -79,7 +82,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { pub(super) fn add_cases_to_switch<'pat>( &mut self, - test_place: &Place<'tcx>, + test_place: &PlaceBuilder<'tcx>, candidate: &Candidate<'pat, 'tcx>, switch_ty: Ty<'tcx>, options: &mut FxIndexMap<&'tcx ty::Const<'tcx>, u128>, @@ -93,9 +96,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { match *match_pair.pattern.kind { PatKind::Constant { value } => { - options.entry(value).or_insert_with(|| { - value.eval_bits(self.hir.tcx(), self.hir.param_env, switch_ty) - }); + options + .entry(value) + .or_insert_with(|| value.eval_bits(self.tcx, self.param_env, switch_ty)); true } PatKind::Variant { .. } => { @@ -121,7 +124,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { pub(super) fn add_variants_to_switch<'pat>( &mut self, - test_place: &Place<'tcx>, + test_place: &PlaceBuilder<'tcx>, candidate: &Candidate<'pat, 'tcx>, variants: &mut BitSet, ) -> bool { @@ -149,15 +152,23 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { pub(super) fn perform_test( &mut self, block: BasicBlock, - place: Place<'tcx>, + place_builder: PlaceBuilder<'tcx>, test: &Test<'tcx>, make_target_blocks: impl FnOnce(&mut Self) -> Vec, ) { + let place: Place<'tcx>; + if let Ok(test_place_builder) = + place_builder.try_upvars_resolved(self.tcx, self.typeck_results) + { + place = test_place_builder.into_place(self.tcx, self.typeck_results); + } else { + return; + } debug!( "perform_test({:?}, {:?}: {:?}, {:?})", block, place, - place.ty(&self.local_decls, self.hir.tcx()), + place.ty(&self.local_decls, self.tcx), test ); @@ -169,7 +180,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let num_enum_variants = adt_def.variants.len(); debug_assert_eq!(target_blocks.len(), num_enum_variants + 1); let otherwise_block = *target_blocks.last().unwrap(); - let tcx = self.hir.tcx(); + let tcx = self.tcx; let switch_targets = SwitchTargets::new( adt_def.discriminants(tcx).filter_map(|(idx, discr)| { if variants.contains(idx) { @@ -217,7 +228,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { 0 => (second_bb, first_bb), v => span_bug!(test.span, "expected boolean value but got {:?}", v), }; - TerminatorKind::if_(self.hir.tcx(), Operand::Copy(place), true_bb, false_bb) + TerminatorKind::if_(self.tcx, Operand::Copy(place), true_bb, false_bb) } else { bug!("`TestKind::SwitchInt` on `bool` should have two targets") } @@ -292,7 +303,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { TestKind::Len { len, op } => { let target_blocks = make_target_blocks(self); - let usize_ty = self.hir.usize_ty(); + let usize_ty = self.tcx.types.usize; let actual = self.temp(usize_ty, test.span); // actual = len(place) @@ -331,17 +342,17 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { left: Operand<'tcx>, right: Operand<'tcx>, ) { - let bool_ty = self.hir.bool_ty(); + let bool_ty = self.tcx.types.bool; 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, box (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.tcx, Operand::Move(result), success_block, fail_block), ); } @@ -377,7 +388,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // nothing to do, neither is an array (None, None) => {} (Some((region, elem_ty, _)), _) | (None, Some((region, elem_ty, _))) => { - let tcx = self.hir.tcx(); + let tcx = self.tcx; // make both a slice ty = tcx.mk_imm_ref(region, tcx.mk_slice(elem_ty)); if opt_ref_ty.is_some() { @@ -408,10 +419,10 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { _ => bug!("non_scalar_compare called on non-reference type: {}", ty), }; - let eq_def_id = self.hir.tcx().require_lang_item(LangItem::PartialEq, None); - let method = self.hir.trait_method(eq_def_id, sym::eq, deref_ty, &[deref_ty.into()]); + let eq_def_id = self.tcx.require_lang_item(LangItem::PartialEq, None); + let method = trait_method(self.tcx, eq_def_id, sym::eq, deref_ty, &[deref_ty.into()]); - let bool_ty = self.hir.bool_ty(); + let bool_ty = self.tcx.types.bool; let eq_result = self.temp(bool_ty, source_info.span); let eq_block = self.cfg.start_new_block(); self.cfg.terminate( @@ -427,7 +438,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // Need to experiment. user_ty: None, - literal: method, + literal: method.into(), }), args: vec![val, expect], destination: Some((eq_result, eq_block)), @@ -443,12 +454,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { self.cfg.terminate( eq_block, source_info, - TerminatorKind::if_( - self.hir.tcx(), - Operand::Move(eq_result), - success_block, - fail_block, - ), + TerminatorKind::if_(self.tcx, Operand::Move(eq_result), success_block, fail_block), ); } else { bug!("`TestKind::Eq` should have two target blocks") @@ -484,7 +490,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { /// tighter match code if we do something a bit different. pub(super) fn sort_candidate<'pat>( &mut self, - test_place: &Place<'tcx>, + test_place: &PlaceBuilder<'tcx>, test: &Test<'tcx>, candidate: &mut Candidate<'pat, 'tcx>, ) -> Option { @@ -632,11 +638,11 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { use rustc_hir::RangeEnd::*; use std::cmp::Ordering::*; - let tcx = self.hir.tcx(); + let tcx = self.tcx; let test_ty = test.lo.ty; - let lo = compare_const_vals(tcx, test.lo, pat.hi, self.hir.param_env, test_ty)?; - let hi = compare_const_vals(tcx, test.hi, pat.lo, self.hir.param_env, test_ty)?; + let lo = compare_const_vals(tcx, test.lo, pat.hi, self.param_env, test_ty)?; + let hi = compare_const_vals(tcx, test.hi, pat.lo, self.param_env, test_ty)?; match (test.end, pat.end, lo, hi) { // pat < test @@ -731,7 +737,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { candidate: &mut Candidate<'pat, 'tcx>, ) { let match_pair = candidate.match_pairs.remove(match_pair_index); - let tcx = self.hir.tcx(); // So, if we have a match-pattern like `x @ Enum::Variant(P1, P2)`, // we want to create a set of derived match-patterns like @@ -740,10 +745,10 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { 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 downcast_place = match_pair.place.project(elem); // `(x as Variant)` let consequent_match_pairs = subpatterns.iter().map(|subpattern| { // e.g., `(x as Variant).0` - let place = tcx.mk_place_field(downcast_place, subpattern.field, subpattern.pattern.ty); + let place = downcast_place.clone().field(subpattern.field, subpattern.pattern.ty); // e.g., `(x as Variant).0 @ P1` MatchPair::new(place, &subpattern.pattern) }); @@ -762,10 +767,10 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { ) -> Option { use std::cmp::Ordering::*; - let tcx = self.hir.tcx(); + let tcx = self.tcx; - let a = compare_const_vals(tcx, range.lo, value, self.hir.param_env, range.lo.ty)?; - let b = compare_const_vals(tcx, value, range.hi, self.hir.param_env, range.lo.ty)?; + let a = compare_const_vals(tcx, range.lo, value, self.param_env, range.lo.ty)?; + let b = compare_const_vals(tcx, value, range.hi, self.param_env, range.lo.ty)?; match (b, range.end) { (Less, _) | (Equal, RangeEnd::Included) if a != Greater => Some(true), @@ -815,3 +820,25 @@ impl Test<'_> { fn is_switch_ty(ty: Ty<'_>) -> bool { ty.is_integral() || ty.is_char() || ty.is_bool() } + +fn trait_method<'tcx>( + tcx: TyCtxt<'tcx>, + trait_def_id: DefId, + method_name: Symbol, + self_ty: Ty<'tcx>, + params: &[GenericArg<'tcx>], +) -> &'tcx ty::Const<'tcx> { + let substs = tcx.mk_substs_trait(self_ty, params); + + // The unhygienic comparison here is acceptable because this is only + // used on known traits. + let item = tcx + .associated_items(trait_def_id) + .filter_by_name_unhygienic(method_name) + .find(|item| item.kind == ty::AssocKind::Fn) + .expect("trait method not found"); + + let method_ty = tcx.type_of(item.def_id); + let method_ty = method_ty.subst(tcx, substs); + ty::Const::zero_sized(tcx, method_ty) +} diff --git a/compiler/rustc_mir_build/src/build/matches/util.rs b/compiler/rustc_mir_build/src/build/matches/util.rs index db1f678a5c..d49a00a566 100644 --- a/compiler/rustc_mir_build/src/build/matches/util.rs +++ b/compiler/rustc_mir_build/src/build/matches/util.rs @@ -1,3 +1,4 @@ +use crate::build::expr::as_place::PlaceBuilder; use crate::build::matches::MatchPair; use crate::build::Builder; use crate::thir::*; @@ -9,14 +10,13 @@ use std::convert::TryInto; impl<'a, 'tcx> Builder<'a, 'tcx> { crate fn field_match_pairs<'pat>( &mut self, - place: Place<'tcx>, + place: PlaceBuilder<'tcx>, subpatterns: &'pat [FieldPat<'tcx>], ) -> Vec> { subpatterns .iter() .map(|fieldpat| { - let place = - self.hir.tcx().mk_place_field(place, fieldpat.field, fieldpat.pattern.ty); + let place = place.clone().field(fieldpat.field, fieldpat.pattern.ty); MatchPair::new(place, &fieldpat.pattern) }) .collect() @@ -25,34 +25,37 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { crate fn prefix_slice_suffix<'pat>( &mut self, match_pairs: &mut SmallVec<[MatchPair<'pat, 'tcx>; 1]>, - place: &Place<'tcx>, + place: &PlaceBuilder<'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), true), + let tcx = self.tcx; + let (min_length, exact_size) = match place + .clone() + .into_place(tcx, self.typeck_results) + .ty(&self.local_decls, tcx) + .ty + .kind() + { + ty::Array(_, length) => (length.eval_usize(tcx, self.param_env), 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 u64, min_length, from_end: false }; - let place = tcx.mk_place_elem(*place, elem); + let place = place.clone().project(elem); MatchPair::new(place, subpattern) })); if let Some(subslice_pat) = opt_slice { let suffix_len = suffix.len() as u64; - let subslice = tcx.mk_place_elem( - *place, - ProjectionElem::Subslice { - from: prefix.len() as u64, - to: if exact_size { min_length - suffix_len } else { suffix_len }, - from_end: !exact_size, - }, - ); + let subslice = place.clone().project(ProjectionElem::Subslice { + from: prefix.len() as u64, + to: if exact_size { min_length - suffix_len } else { suffix_len }, + from_end: !exact_size, + }); match_pairs.push(MatchPair::new(subslice, subslice_pat)); } @@ -63,7 +66,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { min_length, from_end: !exact_size, }; - let place = tcx.mk_place_elem(*place, elem); + let place = place.clone().project(elem); MatchPair::new(place, subpattern) })); } @@ -92,7 +95,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } impl<'pat, 'tcx> MatchPair<'pat, 'tcx> { - crate fn new(place: Place<'tcx>, pattern: &'pat Pat<'tcx>) -> MatchPair<'pat, 'tcx> { + crate fn new(place: PlaceBuilder<'tcx>, pattern: &'pat Pat<'tcx>) -> MatchPair<'pat, 'tcx> { MatchPair { place, pattern } } } diff --git a/compiler/rustc_mir_build/src/build/misc.rs b/compiler/rustc_mir_build/src/build/misc.rs index 29651d9bc6..a1126d1c3d 100644 --- a/compiler/rustc_mir_build/src/build/misc.rs +++ b/compiler/rustc_mir_build/src/build/misc.rs @@ -3,10 +3,10 @@ use crate::build::Builder; -use rustc_middle::ty::{self, Ty}; - use rustc_middle::mir::*; +use rustc_middle::ty::{self, Ty}; use rustc_span::{Span, DUMMY_SP}; +use rustc_trait_selection::infer::InferCtxtExt; impl<'a, 'tcx> Builder<'a, 'tcx> { /// Adds a new temporary value of type `ty` storing the result of @@ -30,6 +30,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { span: Span, literal: &'tcx ty::Const<'tcx>, ) -> Operand<'tcx> { + let literal = literal.into(); let constant = box Constant { span, user_ty: None, literal }; Operand::Constant(constant) } @@ -37,7 +38,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { // Returns a zero literal operand for the appropriate type, works for // bool, char and integers. 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)); + let literal = ty::Const::from_bits(self.tcx, 0, ty::ParamEnv::empty().and(ty)); self.literal_operand(span, literal) } @@ -48,7 +49,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { source_info: SourceInfo, value: u64, ) -> Place<'tcx> { - let usize_ty = self.hir.usize_ty(); + let usize_ty = self.tcx.types.usize; let temp = self.temp(usize_ty, source_info.span); self.cfg.push_assign_constant( block, @@ -57,16 +58,16 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { Constant { span: source_info.span, user_ty: None, - literal: self.hir.usize_literal(value), + literal: ty::Const::from_usize(self.tcx, value).into(), }, ); temp } crate fn consume_by_copy_or_move(&self, place: Place<'tcx>) -> Operand<'tcx> { - let tcx = self.hir.tcx(); + let tcx = self.tcx; let ty = place.ty(&self.local_decls, tcx).ty; - if !self.hir.type_is_copy_modulo_regions(ty, DUMMY_SP) { + if !self.infcx.type_is_copy_modulo_regions(self.param_env, ty, DUMMY_SP) { Operand::Move(place) } else { Operand::Copy(place) diff --git a/compiler/rustc_mir_build/src/build/mod.rs b/compiler/rustc_mir_build/src/build/mod.rs index 5f6c8d2640..9f1de3349a 100644 --- a/compiler/rustc_mir_build/src/build/mod.rs +++ b/compiler/rustc_mir_build/src/build/mod.rs @@ -1,7 +1,7 @@ use crate::build; +use crate::build::expr::as_place::PlaceBuilder; use crate::build::scope::DropKind; -use crate::thir::cx::Cx; -use crate::thir::{BindingMode, LintLevel, PatKind}; +use crate::thir::{build_thir, Arena, BindingMode, Expr, LintLevel, Pat, PatKind}; use rustc_attr::{self as attr, UnwindAttr}; use rustc_errors::ErrorReported; use rustc_hir as hir; @@ -9,13 +9,13 @@ use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_hir::lang_items::LangItem; use rustc_hir::{GeneratorKind, HirIdMap, Node}; use rustc_index::vec::{Idx, IndexVec}; -use rustc_infer::infer::TyCtxtInferExt; +use rustc_infer::infer::{InferCtxt, TyCtxtInferExt}; use rustc_middle::hir::place::PlaceBase as HirPlaceBase; use rustc_middle::middle::region; use rustc_middle::mir::*; use rustc_middle::ty::subst::Subst; -use rustc_middle::ty::{self, Ty, TyCtxt, TypeFoldable}; -use rustc_span::symbol::kw; +use rustc_middle::ty::{self, Ty, TyCtxt, TypeFoldable, TypeckResults}; +use rustc_span::symbol::{kw, sym}; use rustc_span::Span; use rustc_target::spec::abi::Abi; use rustc_target::spec::PanicStrategy; @@ -42,6 +42,8 @@ crate fn mir_built<'tcx>( /// Construct the MIR for a given `DefId`. fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam) -> Body<'_> { let id = tcx.hir().local_def_id_to_hir_id(def.did); + let body_owner_kind = tcx.hir().body_owner_kind(id); + let typeck_results = tcx.typeck_opt_const_arg(def); // Figure out what primary body this item has. let (body_id, return_ty_span, span_with_body) = match tcx.hir().get(id) { @@ -86,15 +88,15 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam) -> Body<'_ // If we don't have a specialized span for the body, just use the // normal def span. let span_with_body = span_with_body.unwrap_or_else(|| tcx.hir().span(id)); + let arena = Arena::default(); tcx.infer_ctxt().enter(|infcx| { - let cx = Cx::new(&infcx, def, id); - let body = if let Some(ErrorReported) = cx.typeck_results().tainted_by_errors { - build::construct_error(cx, body_id) - } else if cx.body_owner_kind.is_fn_or_closure() { + let body = if let Some(ErrorReported) = typeck_results.tainted_by_errors { + build::construct_error(&infcx, def, id, body_id, body_owner_kind) + } else if body_owner_kind.is_fn_or_closure() { // fetch the fully liberated fn signature (that is, all bound // types/lifetimes replaced) - let fn_sig = cx.typeck_results().liberated_fn_sigs()[id]; + let fn_sig = typeck_results.liberated_fn_sigs()[id]; let fn_def_id = tcx.hir().local_def_id(id); let safety = match fn_sig.unsafety { @@ -103,6 +105,7 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam) -> Body<'_ }; let body = tcx.hir().body(body_id); + let thir = build_thir(tcx, def, &arena, &body.value); let ty = tcx.type_of(fn_def_id); let mut abi = fn_sig.abi; let implicit_argument = match ty.kind() { @@ -178,7 +181,8 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam) -> Body<'_ }; let mut mir = build::construct_fn( - cx, + &infcx, + def, id, arguments, safety, @@ -186,9 +190,12 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam) -> Body<'_ return_ty, return_ty_span, body, + thir, span_with_body, ); - mir.yield_ty = yield_ty; + if yield_ty.is_some() { + mir.generator.as_mut().unwrap().yield_ty = yield_ty; + } mir } else { // Get the revealed type of this const. This is *not* the adjusted @@ -203,9 +210,12 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam) -> Body<'_ // place to be the type of the constant because NLL typeck will // equate them. - let return_ty = cx.typeck_results().node_type(id); + let return_ty = typeck_results.node_type(id); + + let ast_expr = &tcx.hir().body(body_id).value; + let thir = build_thir(tcx, def, &arena, ast_expr); - build::construct_const(cx, body_id, return_ty, return_ty_span) + build::construct_const(&infcx, thir, def, id, return_ty, return_ty_span) }; lints::check(tcx, &body); @@ -218,7 +228,7 @@ fn mir_build(tcx: TyCtxt<'_>, def: ty::WithOptConstParam) -> Body<'_ !(body.local_decls.has_free_regions() || body.basic_blocks().has_free_regions() || body.var_debug_info.has_free_regions() - || body.yield_ty.has_free_regions()), + || body.yield_ty().has_free_regions()), "Unexpected free regions in MIR: {:?}", body, ); @@ -302,10 +312,17 @@ impl BlockFrame { struct BlockContext(Vec); struct Builder<'a, 'tcx> { - hir: Cx<'a, 'tcx>, + tcx: TyCtxt<'tcx>, + infcx: &'a InferCtxt<'a, 'tcx>, + typeck_results: &'tcx TypeckResults<'tcx>, + region_scope_tree: &'tcx region::ScopeTree, + param_env: ty::ParamEnv<'tcx>, + cfg: CFG<'tcx>, def_id: DefId, + hir_id: hir::HirId, + check_overflow: bool, fn_span: Span, arg_count: usize, generator_kind: Option, @@ -546,7 +563,7 @@ macro_rules! unpack { }}; } -fn should_abort_on_panic(tcx: TyCtxt<'_>, fn_def_id: LocalDefId, _abi: Abi) -> bool { +fn should_abort_on_panic(tcx: TyCtxt<'_>, fn_def_id: LocalDefId, abi: Abi) -> bool { // Validate `#[unwind]` syntax regardless of platform-specific panic strategy. let attrs = &tcx.get_attrs(fn_def_id.to_def_id()); let unwind_attr = attr::find_unwind_attr(&tcx.sess, attrs); @@ -556,12 +573,42 @@ fn should_abort_on_panic(tcx: TyCtxt<'_>, fn_def_id: LocalDefId, _abi: Abi) -> b return false; } - // This is a special case: some functions have a C abi but are meant to - // unwind anyway. Don't stop them. match unwind_attr { - None => false, // FIXME(#58794); should be `!(abi == Abi::Rust || abi == Abi::RustCall)` + // If an `#[unwind]` attribute was found, we should adhere to it. Some(UnwindAttr::Allowed) => false, Some(UnwindAttr::Aborts) => true, + // If no attribute was found and the panic strategy is `unwind`, then we should examine + // the function's ABI string to determine whether it should abort upon panic. + None => { + use Abi::*; + match abi { + // In the case of ABI's that have an `-unwind` equivalent, check whether the ABI + // permits unwinding. If so, we should not abort. Otherwise, we should. + C { unwind } | Stdcall { unwind } | System { unwind } | Thiscall { unwind } => { + !unwind + } + // Rust and `rust-call` functions are allowed to unwind, and should not abort. + Rust | RustCall => false, + // Other ABI's should abort. + Cdecl + | Fastcall + | Vectorcall + | Aapcs + | Win64 + | SysV64 + | PtxKernel + | Msp430Interrupt + | X86Interrupt + | AmdGpuKernel + | EfiApi + | AvrInterrupt + | AvrNonBlockingInterrupt + | CCmseNonSecureCall + | RustIntrinsic + | PlatformIntrinsic + | Unadjusted => true, + } + } } } @@ -575,8 +622,9 @@ struct ArgInfo<'tcx>( Option, ); -fn construct_fn<'a, 'tcx, A>( - hir: Cx<'a, 'tcx>, +fn construct_fn<'tcx, A>( + infcx: &InferCtxt<'_, 'tcx>, + fn_def: ty::WithOptConstParam, fn_id: hir::HirId, arguments: A, safety: Safety, @@ -584,6 +632,7 @@ fn construct_fn<'a, 'tcx, A>( return_ty: Ty<'tcx>, return_ty_span: Span, body: &'tcx hir::Body<'tcx>, + expr: &Expr<'_, 'tcx>, span_with_body: Span, ) -> Body<'tcx> where @@ -591,15 +640,13 @@ where { let arguments: Vec<_> = arguments.collect(); - let tcx = hir.tcx(); - let tcx_hir = tcx.hir(); - let span = tcx_hir.span(fn_id); - - let fn_def_id = tcx_hir.local_def_id(fn_id); + let tcx = infcx.tcx; + let span = tcx.hir().span(fn_id); let mut builder = Builder::new( - hir, - fn_def_id.to_def_id(), + infcx, + fn_def, + fn_id, span_with_body, arguments.len(), safety, @@ -623,16 +670,16 @@ where Some(builder.in_scope(arg_scope_s, LintLevel::Inherited, |builder| { builder.args_and_body( START_BLOCK, - fn_def_id.to_def_id(), + fn_def.did.to_def_id(), &arguments, arg_scope, - &body.value, + expr, ) })) })); let source_info = builder.source_info(fn_end); builder.cfg.terminate(return_block, source_info, TerminatorKind::Return); - let should_abort = should_abort_on_panic(tcx, fn_def_id, abi); + let should_abort = should_abort_on_panic(tcx, fn_def.did, abi); builder.build_drop_trees(should_abort); return_block.unit() })); @@ -643,7 +690,7 @@ where } else { None }; - debug!("fn_id {:?} has attrs {:?}", fn_def_id, tcx.get_attrs(fn_def_id.to_def_id())); + debug!("fn_id {:?} has attrs {:?}", fn_def, tcx.get_attrs(fn_def.did.to_def_id())); let mut body = builder.finish(); body.spread_arg = spread_arg; @@ -651,22 +698,20 @@ where } fn construct_const<'a, 'tcx>( - hir: Cx<'a, 'tcx>, - body_id: hir::BodyId, + infcx: &'a InferCtxt<'a, 'tcx>, + expr: &Expr<'_, 'tcx>, + def: ty::WithOptConstParam, + hir_id: hir::HirId, const_ty: Ty<'tcx>, const_ty_span: Span, ) -> Body<'tcx> { - let tcx = hir.tcx(); - let owner_id = tcx.hir().body_owner(body_id); - let def_id = tcx.hir().local_def_id(owner_id); - let span = tcx.hir().span(owner_id); + let tcx = infcx.tcx; + let span = tcx.hir().span(hir_id); let mut builder = - Builder::new(hir, def_id.to_def_id(), span, 0, Safety::Safe, const_ty, const_ty_span, None); + Builder::new(infcx, def, hir_id, span, 0, Safety::Safe, const_ty, const_ty_span, None); let mut block = START_BLOCK; - let ast_expr = &tcx.hir().body(body_id).value; - let expr = builder.hir.mirror(ast_expr); - unpack!(block = builder.into_expr(Place::return_place(), block, expr)); + unpack!(block = builder.expr_into_dest(Place::return_place(), block, &expr)); let source_info = builder.source_info(span); builder.cfg.terminate(block, source_info, TerminatorKind::Return); @@ -680,29 +725,34 @@ fn construct_const<'a, 'tcx>( /// /// This is required because we may still want to run MIR passes on an item /// with type errors, but normal MIR construction can't handle that in general. -fn construct_error<'a, 'tcx>(hir: Cx<'a, 'tcx>, body_id: hir::BodyId) -> Body<'tcx> { - let tcx = hir.tcx(); - let owner_id = tcx.hir().body_owner(body_id); - let def_id = tcx.hir().local_def_id(owner_id); - let span = tcx.hir().span(owner_id); +fn construct_error<'a, 'tcx>( + infcx: &'a InferCtxt<'a, 'tcx>, + def: ty::WithOptConstParam, + hir_id: hir::HirId, + body_id: hir::BodyId, + body_owner_kind: hir::BodyOwnerKind, +) -> Body<'tcx> { + let tcx = infcx.tcx; + let span = tcx.hir().span(hir_id); let ty = tcx.ty_error(); - let num_params = match hir.body_owner_kind { - hir::BodyOwnerKind::Fn => tcx.hir().fn_decl_by_hir_id(owner_id).unwrap().inputs.len(), + let generator_kind = tcx.hir().body(body_id).generator_kind; + let num_params = match body_owner_kind { + hir::BodyOwnerKind::Fn => tcx.hir().fn_decl_by_hir_id(hir_id).unwrap().inputs.len(), hir::BodyOwnerKind::Closure => { - if tcx.hir().body(body_id).generator_kind().is_some() { + if generator_kind.is_some() { // Generators have an implicit `self` parameter *and* a possibly // implicit resume parameter. 2 } else { // The implicit self parameter adds another local in MIR. - 1 + tcx.hir().fn_decl_by_hir_id(owner_id).unwrap().inputs.len() + 1 + tcx.hir().fn_decl_by_hir_id(hir_id).unwrap().inputs.len() } } hir::BodyOwnerKind::Const => 0, hir::BodyOwnerKind::Static(_) => 0, }; let mut builder = - Builder::new(hir, def_id.to_def_id(), span, num_params, Safety::Safe, ty, span, None); + Builder::new(infcx, def, hir_id, span, num_params, Safety::Safe, ty, span, generator_kind); let source_info = builder.source_info(span); // Some MIR passes will expect the number of parameters to match the // function declaration. @@ -711,16 +761,15 @@ fn construct_error<'a, 'tcx>(hir: Cx<'a, 'tcx>, body_id: hir::BodyId) -> Body<'t } builder.cfg.terminate(START_BLOCK, source_info, TerminatorKind::Unreachable); let mut body = builder.finish(); - if tcx.hir().body(body_id).generator_kind.is_some() { - body.yield_ty = Some(ty); - } + body.generator.as_mut().map(|gen| gen.yield_ty = Some(ty)); body } impl<'a, 'tcx> Builder<'a, 'tcx> { fn new( - hir: Cx<'a, 'tcx>, - def_id: DefId, + infcx: &'a InferCtxt<'a, 'tcx>, + def: ty::WithOptConstParam, + hir_id: hir::HirId, span: Span, arg_count: usize, safety: Safety, @@ -728,10 +777,30 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { return_span: Span, generator_kind: Option, ) -> Builder<'a, 'tcx> { - let lint_level = LintLevel::Explicit(hir.root_lint_level); + let tcx = infcx.tcx; + let attrs = tcx.hir().attrs(hir_id); + // Some functions always have overflow checks enabled, + // however, they may not get codegen'd, depending on + // the settings for the crate they are codegened in. + let mut check_overflow = tcx.sess.contains_name(attrs, sym::rustc_inherit_overflow_checks); + // Respect -C overflow-checks. + check_overflow |= tcx.sess.overflow_checks(); + // Constants always need overflow checks. + check_overflow |= matches!( + tcx.hir().body_owner_kind(hir_id), + hir::BodyOwnerKind::Const | hir::BodyOwnerKind::Static(_) + ); + + let lint_level = LintLevel::Explicit(hir_id); let mut builder = Builder { - hir, - def_id, + tcx, + infcx, + typeck_results: tcx.typeck_opt_const_arg(def), + region_scope_tree: tcx.region_scope_tree(def.did), + param_env: tcx.param_env(def.did), + def_id: def.did.to_def_id(), + hir_id, + check_overflow, cfg: CFG { basic_blocks: IndexVec::new() }, fn_span: span, arg_count, @@ -787,7 +856,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { fn_def_id: DefId, arguments: &[ArgInfo<'tcx>], argument_scope: region::Scope, - ast_body: &'tcx hir::Expr<'tcx>, + expr: &Expr<'_, 'tcx>, ) -> BlockAnd<()> { // Allocate locals for the function arguments for &ArgInfo(ty, _, arg_opt, _) in arguments.iter() { @@ -807,12 +876,12 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } } - let tcx = self.hir.tcx(); + let tcx = self.tcx; let tcx_hir = tcx.hir(); - let hir_typeck_results = self.hir.typeck_results(); + let hir_typeck_results = self.typeck_results; // In analyze_closure() in upvar.rs we gathered a list of upvars used by a - // indexed closure and we stored in a map called closure_captures in TypeckResults + // indexed closure and we stored in a map called closure_min_captures in TypeckResults // with the closure's DefId. Here, we run through that vec of UpvarIds for // the given closure and use the necessary information to create upvar // debuginfo and to fill `self.upvar_mutbls`. @@ -885,14 +954,18 @@ 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), + arg_opt.as_ref().map_or(expr.span, |arg| arg.pat.span), argument_scope, local, DropKind::Value, ); if let Some(arg) = arg_opt { - let pattern = self.hir.pattern_from_hir(&arg.pat); + let pat = match tcx.hir().get(arg.pat.hir_id) { + Node::Pat(pat) | Node::Binding(pat) => pat, + node => bug!("pattern became {:?}", node), + }; + let pattern = Pat::from_hir(tcx, self.param_env, self.typeck_results, pat); let original_source_scope = self.source_scope; let span = pattern.span; self.set_correct_source_scope_for_arg(arg.hir_id, original_source_scope, span); @@ -927,12 +1000,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { _ => { scope = self.declare_bindings( scope, - ast_body.span, + expr.span, &pattern, matches::ArmHasGuard(false), Some((Some(&place), span)), ); - unpack!(block = self.place_into_pattern(block, pattern, place, false)); + let place_builder = PlaceBuilder::from(local); + unpack!( + block = self.place_into_pattern(block, pattern, place_builder, false) + ); } } self.source_scope = original_source_scope; @@ -944,8 +1020,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { self.source_scope = source_scope; } - let body = self.hir.mirror(ast_body); - self.into(Place::return_place(), block, body) + self.expr_into_dest(Place::return_place(), block, &expr) } fn set_correct_source_scope_for_arg( @@ -954,15 +1029,15 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { original_source_scope: SourceScope, 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 tcx = self.tcx; + let current_root = tcx.maybe_lint_level_root_bounded(arg_hir_id, self.hir_id); let parent_root = tcx.maybe_lint_level_root_bounded( self.source_scopes[original_source_scope] .local_data .as_ref() .assert_crate_local() .lint_root, - self.hir.root_lint_level, + self.hir_id, ); if current_root != parent_root { self.source_scope = @@ -974,7 +1049,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { match self.unit_temp { Some(tmp) => tmp, None => { - let ty = self.hir.unit_ty(); + let ty = self.tcx.mk_unit(); let fn_span = self.fn_span; let tmp = self.temp(ty, fn_span); self.unit_temp = Some(tmp); @@ -992,7 +1067,6 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { mod block; mod cfg; mod expr; -mod into; mod matches; mod misc; mod scope; diff --git a/compiler/rustc_mir_build/src/build/scope.rs b/compiler/rustc_mir_build/src/build/scope.rs index 5e9d780d17..b637b9b70b 100644 --- a/compiler/rustc_mir_build/src/build/scope.rs +++ b/compiler/rustc_mir_build/src/build/scope.rs @@ -82,7 +82,7 @@ that contains only loops and breakable blocks. It tracks where a `break`, */ use crate::build::{BlockAnd, BlockAndExtension, BlockFrame, Builder, CFG}; -use crate::thir::{Expr, ExprRef, LintLevel}; +use crate::thir::{Expr, LintLevel}; use rustc_data_structures::fx::FxHashMap; use rustc_index::vec::IndexVec; use rustc_middle::middle::region; @@ -516,7 +516,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { { debug!("in_scope(region_scope={:?})", region_scope); let source_scope = self.source_scope; - let tcx = self.hir.tcx(); + let tcx = self.tcx; if let LintLevel::Explicit(current_hir_id) = lint_level { // Use `maybe_lint_level_root_bounded` with `root_lint_level` as a bound // to avoid adding Hir dependences on our parents. @@ -524,10 +524,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { let parent_root = tcx.maybe_lint_level_root_bounded( self.source_scopes[source_scope].local_data.as_ref().assert_crate_local().lint_root, - self.hir.root_lint_level, + self.hir_id, ); - 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_id); if parent_root != current_root { self.source_scope = self.new_source_scope( @@ -575,7 +574,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { crate fn break_scope( &mut self, mut block: BasicBlock, - value: Option>, + value: Option<&Expr<'_, 'tcx>>, target: BreakableTarget, source_info: SourceInfo, ) -> BlockAnd<()> { @@ -612,10 +611,10 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { if let Some(value) = value { debug!("stmt_expr Break val block_context.push(SubExpr)"); self.block_context.push(BlockFrame::SubExpr); - unpack!(block = self.into(destination, block, value)); + unpack!(block = self.expr_into_dest(destination, block, value)); self.block_context.pop(); } else { - self.cfg.push_assign_unit(block, source_info, destination, self.hir.tcx()) + self.cfg.push_assign_unit(block, source_info, destination, self.tcx) } } else { assert!(value.is_none(), "`return` and `break` should have a destination"); @@ -763,7 +762,7 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { ) { let needs_drop = match drop_kind { DropKind::Value => { - if !self.hir.needs_drop(self.local_decls[local].ty) { + if !self.local_decls[local].ty.needs_drop(self.tcx, self.param_env) { return; } true @@ -834,10 +833,9 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { } if scope.region_scope == region_scope { - let region_scope_span = - region_scope.span(self.hir.tcx(), &self.hir.region_scope_tree); + let region_scope_span = region_scope.span(self.tcx, &self.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); + let scope_end = self.tcx.sess.source_map().end_point(region_scope_span); scope.drops.push(DropData { source_info: SourceInfo { span: scope_end, scope: scope.source_scope }, @@ -920,13 +918,13 @@ impl<'a, 'tcx> Builder<'a, 'tcx> { crate fn test_bool( &mut self, mut block: BasicBlock, - condition: Expr<'tcx>, + condition: &Expr<'_, 'tcx>, source_info: SourceInfo, ) -> (BasicBlock, BasicBlock) { 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.tcx, cond.clone(), true_block, false_block); self.cfg.terminate(block, source_info, term); match cond { diff --git a/compiler/rustc_mir_build/src/lib.rs b/compiler/rustc_mir_build/src/lib.rs index 0866892265..b1591d8ba3 100644 --- a/compiler/rustc_mir_build/src/lib.rs +++ b/compiler/rustc_mir_build/src/lib.rs @@ -20,7 +20,7 @@ extern crate rustc_middle; mod build; mod lints; -mod thir; +pub mod thir; use rustc_middle::ty::query::Providers; diff --git a/compiler/rustc_mir_build/src/lints.rs b/compiler/rustc_mir_build/src/lints.rs index 576b537c01..ef8bd20d51 100644 --- a/compiler/rustc_mir_build/src/lints.rs +++ b/compiler/rustc_mir_build/src/lints.rs @@ -15,7 +15,7 @@ crate fn check<'tcx>(tcx: TyCtxt<'tcx>, body: &Body<'tcx>) { let hir_id = tcx.hir().local_def_id_to_hir_id(def_id); if let Some(fn_like_node) = FnLikeNode::from_node(tcx.hir().get(hir_id)) { - if let FnKind::Closure(_) = fn_like_node.kind() { + if let FnKind::Closure = fn_like_node.kind() { // closures can't recur, so they don't matter. return; } diff --git a/compiler/rustc_mir_build/src/thir/arena.rs b/compiler/rustc_mir_build/src/thir/arena.rs new file mode 100644 index 0000000000..aacc7b12a4 --- /dev/null +++ b/compiler/rustc_mir_build/src/thir/arena.rs @@ -0,0 +1,98 @@ +use crate::thir::*; + +macro_rules! declare_arena { + ([], [$($a:tt $name:ident: $ty:ty,)*]) => { + #[derive(Default)] + pub struct Arena<'thir, 'tcx> { + pub dropless: rustc_arena::DroplessArena, + drop: rustc_arena::DropArena, + $($name: rustc_arena::arena_for_type!($a[$ty]),)* + } + + pub trait ArenaAllocatable<'thir, 'tcx, T = Self>: Sized { + fn allocate_on(self, arena: &'thir Arena<'thir, 'tcx>) -> &'thir mut Self; + fn allocate_from_iter( + arena: &'thir Arena<'thir, 'tcx>, + iter: impl ::std::iter::IntoIterator, + ) -> &'thir mut [Self]; + } + + impl<'thir, 'tcx, T: Copy> ArenaAllocatable<'thir, 'tcx, ()> for T { + #[inline] + fn allocate_on(self, arena: &'thir Arena<'thir, 'tcx>) -> &'thir mut Self { + arena.dropless.alloc(self) + } + #[inline] + fn allocate_from_iter( + arena: &'thir Arena<'thir, 'tcx>, + iter: impl ::std::iter::IntoIterator, + ) -> &'thir mut [Self] { + arena.dropless.alloc_from_iter(iter) + } + + } + $( + impl<'thir, 'tcx> ArenaAllocatable<'thir, 'tcx, $ty> for $ty { + #[inline] + fn allocate_on(self, arena: &'thir Arena<'thir, 'tcx>) -> &'thir mut Self { + if !::std::mem::needs_drop::() { + return arena.dropless.alloc(self); + } + match rustc_arena::which_arena_for_type!($a[&arena.$name]) { + ::std::option::Option::<&rustc_arena::TypedArena>::Some(ty_arena) => { + ty_arena.alloc(self) + } + ::std::option::Option::None => unsafe { arena.drop.alloc(self) }, + } + } + + #[inline] + fn allocate_from_iter( + arena: &'thir Arena<'thir, 'tcx>, + iter: impl ::std::iter::IntoIterator, + ) -> &'thir mut [Self] { + if !::std::mem::needs_drop::() { + return arena.dropless.alloc_from_iter(iter); + } + match rustc_arena::which_arena_for_type!($a[&arena.$name]) { + ::std::option::Option::<&rustc_arena::TypedArena>::Some(ty_arena) => { + ty_arena.alloc_from_iter(iter) + } + ::std::option::Option::None => unsafe { arena.drop.alloc_from_iter(iter) }, + } + } + } + )* + + impl<'thir, 'tcx> Arena<'thir, 'tcx> { + #[inline] + pub fn alloc, U>(&'thir self, value: T) -> &'thir mut T { + value.allocate_on(self) + } + + #[allow(dead_code)] // function is never used + #[inline] + pub fn alloc_slice(&'thir self, value: &[T]) -> &'thir mut [T] { + if value.is_empty() { + return &mut []; + } + self.dropless.alloc_slice(value) + } + + pub fn alloc_from_iter, U>( + &'thir self, + iter: impl ::std::iter::IntoIterator, + ) -> &'thir mut [T] { + T::allocate_from_iter(self, iter) + } + } + } +} + +declare_arena!([], [ + [] arm: Arm<'thir, 'tcx>, + [] expr: Expr<'thir, 'tcx>, + [] field_expr: FieldExpr<'thir, 'tcx>, + [few] inline_asm_operand: InlineAsmOperand<'thir, 'tcx>, + [] stmt: Stmt<'thir, 'tcx>, +]); diff --git a/compiler/rustc_mir_build/src/thir/constant.rs b/compiler/rustc_mir_build/src/thir/constant.rs index 969f7d1e3a..ac93d04297 100644 --- a/compiler/rustc_mir_build/src/thir/constant.rs +++ b/compiler/rustc_mir_build/src/thir/constant.rs @@ -1,3 +1,4 @@ +use rustc_apfloat::Float; use rustc_ast as ast; use rustc_middle::mir::interpret::{ Allocation, ConstValue, LitToConstError, LitToConstInput, Scalar, @@ -61,20 +62,40 @@ fn parse_float<'tcx>(num: Symbol, fty: ty::FloatTy, neg: bool) -> Result { - num.parse::().map_err(|_| ())?; + let rust_f = num.parse::().map_err(|_| ())?; let mut f = num.parse::().unwrap_or_else(|e| { panic!("apfloat::ieee::Single failed to parse `{}`: {:?}", num, e) }); + assert!( + u128::from(rust_f.to_bits()) == f.to_bits(), + "apfloat::ieee::Single gave different result for `{}`: \ + {}({:#x}) vs Rust's {}({:#x})", + rust_f, + f, + f.to_bits(), + Single::from_bits(rust_f.to_bits().into()), + rust_f.to_bits() + ); if neg { f = -f; } Scalar::from_f32(f) } ty::FloatTy::F64 => { - num.parse::().map_err(|_| ())?; + let rust_f = num.parse::().map_err(|_| ())?; let mut f = num.parse::().unwrap_or_else(|e| { panic!("apfloat::ieee::Double failed to parse `{}`: {:?}", num, e) }); + assert!( + u128::from(rust_f.to_bits()) == f.to_bits(), + "apfloat::ieee::Double gave different result for `{}`: \ + {}({:#x}) vs Rust's {}({:#x})", + rust_f, + f, + f.to_bits(), + Double::from_bits(rust_f.to_bits().into()), + rust_f.to_bits() + ); if neg { f = -f; } diff --git a/compiler/rustc_mir_build/src/thir/cx/block.rs b/compiler/rustc_mir_build/src/thir/cx/block.rs index 980888df7f..d450f8a265 100644 --- a/compiler/rustc_mir_build/src/thir/cx/block.rs +++ b/compiler/rustc_mir_build/src/thir/cx/block.rs @@ -1,4 +1,3 @@ -use crate::thir::cx::to_ref::ToRef; use crate::thir::cx::Cx; use crate::thir::{self, *}; @@ -8,110 +7,95 @@ use rustc_middle::ty; use rustc_index::vec::Idx; -impl<'tcx> Mirror<'tcx> for &'tcx hir::Block<'tcx> { - type Output = Block<'tcx>; - - fn make_mirror(self, cx: &mut Cx<'_, 'tcx>) -> Block<'tcx> { +impl<'thir, 'tcx> Cx<'thir, 'tcx> { + crate fn mirror_block(&mut self, block: &'tcx hir::Block<'tcx>) -> Block<'thir, 'tcx> { // We have to eagerly lower the "spine" of the statements // in order to get the lexical scoping correctly. - let stmts = mirror_stmts(cx, self.hir_id.local_id, &*self.stmts); + let stmts = self.mirror_stmts(block.hir_id.local_id, block.stmts); let opt_destruction_scope = - cx.region_scope_tree.opt_destruction_scope(self.hir_id.local_id); + self.region_scope_tree.opt_destruction_scope(block.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 }, + targeted_by_break: block.targeted_by_break, + region_scope: region::Scope { + id: block.hir_id.local_id, + data: region::ScopeData::Node, + }, opt_destruction_scope, - span: self.span, + span: block.span, stmts, - expr: self.expr.to_ref(), - safety_mode: match self.rules { + expr: block.expr.map(|expr| self.mirror_expr(expr)), + safety_mode: match block.rules { hir::BlockCheckMode::DefaultBlock => BlockSafety::Safe, - hir::BlockCheckMode::UnsafeBlock(..) => BlockSafety::ExplicitUnsafe(self.hir_id), + hir::BlockCheckMode::UnsafeBlock(..) => BlockSafety::ExplicitUnsafe(block.hir_id), hir::BlockCheckMode::PushUnsafeBlock(..) => BlockSafety::PushUnsafe, hir::BlockCheckMode::PopUnsafeBlock(..) => BlockSafety::PopUnsafe, }, } } -} -fn mirror_stmts<'a, 'tcx>( - cx: &mut Cx<'a, 'tcx>, - block_id: hir::ItemLocalId, - 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) => { - result.push(StmtRef::Mirror(Box::new(Stmt { + fn mirror_stmts( + &mut self, + block_id: hir::ItemLocalId, + stmts: &'tcx [hir::Stmt<'tcx>], + ) -> &'thir [Stmt<'thir, 'tcx>] { + self.arena.alloc_from_iter(stmts.iter().enumerate().filter_map(|(index, stmt)| { + let hir_id = stmt.hir_id; + let opt_dxn_ext = self.region_scope_tree.opt_destruction_scope(hir_id.local_id); + match stmt.kind { + hir::StmtKind::Expr(ref expr) | hir::StmtKind::Semi(ref expr) => Some(Stmt { kind: StmtKind::Expr { scope: region::Scope { id: hir_id.local_id, data: region::ScopeData::Node }, - expr: expr.to_ref(), + expr: self.mirror_expr(expr), }, opt_destruction_scope: opt_dxn_ext, - }))) - } - hir::StmtKind::Item(..) => { - // ignore for purposes of the MIR - } - hir::StmtKind::Local(ref local) => { - let remainder_scope = region::Scope { - id: block_id, - data: region::ScopeData::Remainder(region::FirstStatementIndex::new(index)), - }; + }), + hir::StmtKind::Item(..) => { + // ignore for purposes of the MIR + None + } + hir::StmtKind::Local(ref local) => { + let remainder_scope = region::Scope { + id: block_id, + data: region::ScopeData::Remainder(region::FirstStatementIndex::new(index)), + }; - let mut pattern = cx.pattern_from_hir(&local.pat); + let mut pattern = self.pattern_from_hir(local.pat); - if let Some(ty) = &local.ty { - if let Some(&user_ty) = cx.typeck_results.user_provided_types().get(ty.hir_id) { - debug!("mirror_stmts: user_ty={:?}", user_ty); - pattern = Pat { - ty: pattern.ty, - span: pattern.span, - kind: Box::new(PatKind::AscribeUserType { - ascription: thir::pattern::Ascription { - user_ty: PatTyProj::from_user_type(user_ty), - user_ty_span: ty.span, - variance: ty::Variance::Covariant, - }, - subpattern: pattern, - }), - }; + if let Some(ty) = &local.ty { + if let Some(&user_ty) = + self.typeck_results.user_provided_types().get(ty.hir_id) + { + debug!("mirror_stmts: user_ty={:?}", user_ty); + pattern = Pat { + ty: pattern.ty, + span: pattern.span, + kind: Box::new(PatKind::AscribeUserType { + ascription: thir::pattern::Ascription { + user_ty: PatTyProj::from_user_type(user_ty), + user_ty_span: ty.span, + variance: ty::Variance::Covariant, + }, + subpattern: pattern, + }), + }; + } } - } - result.push(StmtRef::Mirror(Box::new(Stmt { - kind: StmtKind::Let { - remainder_scope, - init_scope: region::Scope { - id: hir_id.local_id, - data: region::ScopeData::Node, + Some(Stmt { + kind: StmtKind::Let { + remainder_scope, + init_scope: region::Scope { + id: hir_id.local_id, + data: region::ScopeData::Node, + }, + pattern, + initializer: local.init.map(|init| self.mirror_expr(init)), + lint_level: LintLevel::Explicit(local.hir_id), }, - pattern, - initializer: local.init.to_ref(), - lint_level: LintLevel::Explicit(local.hir_id), - }, - opt_destruction_scope: opt_dxn_ext, - }))); + opt_destruction_scope: opt_dxn_ext, + }) + } } - } + })) } - result -} - -crate fn to_expr_ref<'a, 'tcx>( - cx: &mut Cx<'a, 'tcx>, - block: &'tcx hir::Block<'tcx>, -) -> ExprRef<'tcx> { - let block_ty = cx.typeck_results().node_type(block.hir_id); - let temp_lifetime = cx.region_scope_tree.temporary_scope(block.hir_id.local_id); - let expr = Expr { - ty: block_ty, - temp_lifetime, - span: block.span, - kind: ExprKind::Block { body: block }, - }; - expr.to_ref() } diff --git a/compiler/rustc_mir_build/src/thir/cx/expr.rs b/compiler/rustc_mir_build/src/thir/cx/expr.rs index 2962cbe815..200a5fc104 100644 --- a/compiler/rustc_mir_build/src/thir/cx/expr.rs +++ b/compiler/rustc_mir_build/src/thir/cx/expr.rs @@ -1,11 +1,11 @@ -use crate::thir::cx::block; -use crate::thir::cx::to_ref::ToRef; use crate::thir::cx::Cx; use crate::thir::util::UserAnnotatedTyHelpers; use crate::thir::*; +use rustc_data_structures::stack::ensure_sufficient_stack; use rustc_hir as hir; use rustc_hir::def::{CtorKind, CtorOf, DefKind, Res}; use rustc_index::vec::Idx; +use rustc_middle::hir::place::Place as HirPlace; use rustc_middle::hir::place::PlaceBase as HirPlaceBase; use rustc_middle::hir::place::ProjectionKind as HirProjectionKind; use rustc_middle::mir::interpret::Scalar; @@ -17,45 +17,71 @@ use rustc_middle::ty::subst::{InternalSubsts, SubstsRef}; use rustc_middle::ty::{self, AdtKind, Ty}; use rustc_span::Span; -impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr<'tcx> { - type Output = Expr<'tcx>; +use std::iter; - 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 }; +impl<'thir, 'tcx> Cx<'thir, 'tcx> { + /// Mirrors and allocates a single [`hir::Expr`]. If you need to mirror a whole slice + /// of expressions, prefer using [`mirror_exprs`]. + /// + /// [`mirror_exprs`]: Self::mirror_exprs + crate fn mirror_expr(&mut self, expr: &'tcx hir::Expr<'tcx>) -> &'thir Expr<'thir, 'tcx> { + // `mirror_expr` is recursing very deep. Make sure the stack doesn't overflow. + ensure_sufficient_stack(|| self.arena.alloc(self.mirror_expr_inner(expr))) + } + + /// Mirrors and allocates a slice of [`hir::Expr`]s. They will be allocated as a + /// contiguous sequence in memory. + crate fn mirror_exprs(&mut self, exprs: &'tcx [hir::Expr<'tcx>]) -> &'thir [Expr<'thir, 'tcx>] { + self.arena.alloc_from_iter(exprs.iter().map(|expr| self.mirror_expr_inner(expr))) + } - debug!("Expr::make_mirror(): id={}, span={:?}", self.hir_id, self.span); + /// Mirrors a [`hir::Expr`] without allocating it into the arena. + /// This is a separate, private function so that [`mirror_expr`] and [`mirror_exprs`] can + /// decide how to allocate this expression (alone or within a slice). + /// + /// [`mirror_expr`]: Self::mirror_expr + /// [`mirror_exprs`]: Self::mirror_exprs + pub(super) fn mirror_expr_inner( + &mut self, + hir_expr: &'tcx hir::Expr<'tcx>, + ) -> Expr<'thir, 'tcx> { + let temp_lifetime = self.region_scope_tree.temporary_scope(hir_expr.hir_id.local_id); + let expr_scope = + region::Scope { id: hir_expr.hir_id.local_id, data: region::ScopeData::Node }; - let mut expr = make_mirror_unadjusted(cx, self); + debug!("Expr::make_mirror(): id={}, span={:?}", hir_expr.hir_id, hir_expr.span); + + let mut expr = self.make_mirror_unadjusted(hir_expr); // Now apply adjustments, if any. - for adjustment in cx.typeck_results().expr_adjustments(self) { + for adjustment in self.typeck_results.expr_adjustments(hir_expr) { debug!("make_mirror: expr={:?} applying adjustment={:?}", expr, adjustment); - expr = apply_adjustment(cx, self, expr, adjustment); + expr = self.apply_adjustment(hir_expr, expr, adjustment); } // Next, wrap this up in the expr's scope. expr = Expr { temp_lifetime, ty: expr.ty, - span: self.span, + span: hir_expr.span, kind: ExprKind::Scope { region_scope: expr_scope, - value: expr.to_ref(), - lint_level: LintLevel::Explicit(self.hir_id), + value: self.arena.alloc(expr), + lint_level: LintLevel::Explicit(hir_expr.hir_id), }, }; // Finally, create a destruction scope, if any. - if let Some(region_scope) = cx.region_scope_tree.opt_destruction_scope(self.hir_id.local_id) + if let Some(region_scope) = + self.region_scope_tree.opt_destruction_scope(hir_expr.hir_id.local_id) { expr = Expr { temp_lifetime, ty: expr.ty, - span: self.span, + span: hir_expr.span, kind: ExprKind::Scope { region_scope, - value: expr.to_ref(), + value: self.arena.alloc(expr), lint_level: LintLevel::Inherited, }, }; @@ -64,364 +90,407 @@ impl<'tcx> Mirror<'tcx> for &'tcx hir::Expr<'tcx> { // OK, all done! expr } -} -fn apply_adjustment<'a, 'tcx>( - cx: &mut Cx<'a, 'tcx>, - hir_expr: &'tcx hir::Expr<'tcx>, - mut expr: Expr<'tcx>, - adjustment: &Adjustment<'tcx>, -) -> Expr<'tcx> { - let Expr { temp_lifetime, mut span, .. } = expr; - - // Adjust the span from the block, to the last expression of the - // block. This is a better span when returning a mutable reference - // with too short a lifetime. The error message will use the span - // from the assignment to the return place, which should only point - // at the returned value, not the entire function body. - // - // fn return_short_lived<'a>(x: &'a mut i32) -> &'static mut i32 { - // x - // // ^ error message points at this expression. - // } - let mut adjust_span = |expr: &mut Expr<'tcx>| { - if let ExprKind::Block { body } = expr.kind { - if let Some(ref last_expr) = body.expr { - span = last_expr.span; - expr.span = span; + fn apply_adjustment( + &mut self, + hir_expr: &'tcx hir::Expr<'tcx>, + mut expr: Expr<'thir, 'tcx>, + adjustment: &Adjustment<'tcx>, + ) -> Expr<'thir, 'tcx> { + let Expr { temp_lifetime, mut span, .. } = expr; + + // Adjust the span from the block, to the last expression of the + // block. This is a better span when returning a mutable reference + // with too short a lifetime. The error message will use the span + // from the assignment to the return place, which should only point + // at the returned value, not the entire function body. + // + // fn return_short_lived<'a>(x: &'a mut i32) -> &'static mut i32 { + // x + // // ^ error message points at this expression. + // } + let mut adjust_span = |expr: &mut Expr<'thir, 'tcx>| { + if let ExprKind::Block { body } = &expr.kind { + if let Some(ref last_expr) = body.expr { + span = last_expr.span; + expr.span = span; + } } - } - }; + }; - let kind = match adjustment.kind { - Adjust::Pointer(PointerCast::Unsize) => { - 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::Deref(None) => { - adjust_span(&mut expr); - ExprKind::Deref { arg: expr.to_ref() } - } - Adjust::Deref(Some(deref)) => { - // We don't need to do call adjust_span here since - // deref coercions always start with a built-in deref. - let call = deref.method_call(cx.tcx(), expr.ty); + let kind = match adjustment.kind { + Adjust::Pointer(PointerCast::Unsize) => { + adjust_span(&mut expr); + ExprKind::Pointer { cast: PointerCast::Unsize, source: self.arena.alloc(expr) } + } + Adjust::Pointer(cast) => ExprKind::Pointer { cast, source: self.arena.alloc(expr) }, + Adjust::NeverToAny => ExprKind::NeverToAny { source: self.arena.alloc(expr) }, + Adjust::Deref(None) => { + adjust_span(&mut expr); + ExprKind::Deref { arg: self.arena.alloc(expr) } + } + Adjust::Deref(Some(deref)) => { + // We don't need to do call adjust_span here since + // deref coercions always start with a built-in deref. + let call = deref.method_call(self.tcx(), expr.ty); - expr = Expr { - temp_lifetime, - 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(), - arg: expr.to_ref(), - }, - }; + expr = Expr { + temp_lifetime, + ty: self + .tcx + .mk_ref(deref.region, ty::TypeAndMut { ty: expr.ty, mutbl: deref.mutbl }), + span, + kind: ExprKind::Borrow { + borrow_kind: deref.mutbl.to_borrow_kind(), + arg: self.arena.alloc(expr), + }, + }; - overloaded_place( - cx, - hir_expr, - adjustment.target, - Some(call), - vec![expr.to_ref()], - deref.span, - ) - } - Adjust::Borrow(AutoBorrow::Ref(_, m)) => { - ExprKind::Borrow { borrow_kind: m.to_borrow_kind(), arg: expr.to_ref() } - } - Adjust::Borrow(AutoBorrow::RawPtr(mutability)) => { - ExprKind::AddressOf { mutability, arg: expr.to_ref() } - } - }; + self.overloaded_place( + hir_expr, + adjustment.target, + Some(call), + self.arena.alloc_from_iter(iter::once(expr)), + deref.span, + ) + } + Adjust::Borrow(AutoBorrow::Ref(_, m)) => { + ExprKind::Borrow { borrow_kind: m.to_borrow_kind(), arg: self.arena.alloc(expr) } + } + Adjust::Borrow(AutoBorrow::RawPtr(mutability)) => { + ExprKind::AddressOf { mutability, arg: self.arena.alloc(expr) } + } + }; - 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<'tcx>, -) -> Expr<'tcx> { - let expr_ty = cx.typeck_results().expr_ty(expr); - let temp_lifetime = cx.region_scope_tree.temporary_scope(expr.hir_id.local_id); - - let kind = match expr.kind { - // Here comes the interesting stuff: - hir::ExprKind::MethodCall(_, method_span, ref args, fn_span) => { - // 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, fn_span } - } + fn make_mirror_unadjusted(&mut self, expr: &'tcx hir::Expr<'tcx>) -> Expr<'thir, 'tcx> { + let expr_ty = self.typeck_results().expr_ty(expr); + let temp_lifetime = self.region_scope_tree.temporary_scope(expr.hir_id.local_id); - hir::ExprKind::Call(ref fun, ref args) => { - if cx.typeck_results().is_method_call(expr) { - // The callee is something implementing Fn, FnMut, or FnOnce. - // Find the actual method implementation being called and - // build the appropriate UFCS call expression with the - // callee-object as expr parameter. + let kind = match expr.kind { + // Here comes the interesting stuff: + hir::ExprKind::MethodCall(_, method_span, ref args, fn_span) => { + // Rewrite a.b(c) into UFCS form like Trait::b(a, c) + let expr = self.method_callee(expr, method_span, None); + let args = self.mirror_exprs(args); + ExprKind::Call { + ty: expr.ty, + fun: self.arena.alloc(expr), + args, + from_hir_call: true, + fn_span, + } + } - // rewrite f(u, v) into FnOnce::call_once(f, (u, v)) + hir::ExprKind::Call(ref fun, ref args) => { + if self.typeck_results().is_method_call(expr) { + // The callee is something implementing Fn, FnMut, or FnOnce. + // Find the actual method implementation being called and + // build the appropriate UFCS call expression with the + // callee-object as expr parameter. - let method = method_callee(cx, expr, fun.span, None); + // rewrite f(u, v) into FnOnce::call_once(f, (u, v)) - let arg_tys = args.iter().map(|e| cx.typeck_results().expr_ty_adjusted(e)); - let tupled_args = Expr { - ty: cx.tcx.mk_tup(arg_tys), - temp_lifetime, - span: expr.span, - kind: ExprKind::Tuple { fields: args.iter().map(ToRef::to_ref).collect() }, - }; + let method = self.method_callee(expr, fun.span, None); - ExprKind::Call { - ty: method.ty, - fun: method.to_ref(), - args: vec![fun.to_ref(), tupled_args.to_ref()], - from_hir_call: true, - fn_span: expr.span, - } - } 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))) - } - Res::SelfCtor(..) => Some((adt_def, VariantIdx::new(0))), - _ => None, - }) - } else { - None + let arg_tys = args.iter().map(|e| self.typeck_results().expr_ty_adjusted(e)); + let tupled_args = Expr { + ty: self.tcx.mk_tup(arg_tys), + temp_lifetime, + span: expr.span, + kind: ExprKind::Tuple { fields: self.mirror_exprs(args) }, }; - if let Some((adt_def, index)) = adt_data { - let substs = cx.typeck_results().node_substs(fun.hir_id); - let user_provided_types = cx.typeck_results().user_provided_types(); - let user_ty = user_provided_types.get(fun.hir_id).copied().map(|mut u_ty| { - if let UserType::TypeOf(ref mut did, _) = &mut u_ty.value { - *did = adt_def.did; - } - u_ty - }); - debug!("make_mirror_unadjusted: (call) user_ty={:?}", user_ty); - let field_refs = args - .iter() - .enumerate() - .map(|(idx, e)| FieldExprRef { name: Field::new(idx), expr: e.to_ref() }) - .collect(); - ExprKind::Adt { - adt_def, - substs, - variant_index: index, - fields: field_refs, - user_ty, - base: None, - } - } else { ExprKind::Call { - ty: cx.typeck_results().node_type(fun.hir_id), - fun: fun.to_ref(), - args: args.to_ref(), + ty: method.ty, + fun: self.arena.alloc(method), + args: self + .arena + .alloc_from_iter(vec![self.mirror_expr_inner(fun), tupled_args]), from_hir_call: true, fn_span: expr.span, } + } 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))) + } + Res::SelfCtor(..) => Some((adt_def, VariantIdx::new(0))), + _ => None, + }) + } else { + None + }; + if let Some((adt_def, index)) = adt_data { + let substs = self.typeck_results().node_substs(fun.hir_id); + let user_provided_types = self.typeck_results().user_provided_types(); + let user_ty = + user_provided_types.get(fun.hir_id).copied().map(|mut u_ty| { + if let UserType::TypeOf(ref mut did, _) = &mut u_ty.value { + *did = adt_def.did; + } + u_ty + }); + debug!("make_mirror_unadjusted: (call) user_ty={:?}", user_ty); + + let field_refs = + self.arena.alloc_from_iter(args.iter().enumerate().map(|(idx, e)| { + FieldExpr { name: Field::new(idx), expr: self.mirror_expr(e) } + })); + ExprKind::Adt { + adt_def, + substs, + variant_index: index, + fields: field_refs, + user_ty, + base: None, + } + } else { + ExprKind::Call { + ty: self.typeck_results().node_type(fun.hir_id), + fun: self.mirror_expr(fun), + args: self.mirror_exprs(args), + from_hir_call: true, + fn_span: expr.span, + } + } } } - } - hir::ExprKind::AddrOf(hir::BorrowKind::Ref, mutbl, ref arg) => { - ExprKind::Borrow { borrow_kind: mutbl.to_borrow_kind(), arg: arg.to_ref() } - } + hir::ExprKind::AddrOf(hir::BorrowKind::Ref, mutbl, ref arg) => { + ExprKind::Borrow { borrow_kind: mutbl.to_borrow_kind(), arg: self.mirror_expr(arg) } + } - hir::ExprKind::AddrOf(hir::BorrowKind::Raw, mutability, ref arg) => { - ExprKind::AddressOf { mutability, arg: arg.to_ref() } - } + hir::ExprKind::AddrOf(hir::BorrowKind::Raw, mutability, ref arg) => { + ExprKind::AddressOf { mutability, arg: self.mirror_expr(arg) } + } - hir::ExprKind::Block(ref blk, _) => ExprKind::Block { body: &blk }, + hir::ExprKind::Block(ref blk, _) => ExprKind::Block { body: self.mirror_block(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: self.mirror_expr(lhs), rhs: self.mirror_expr(rhs) } + } - hir::ExprKind::AssignOp(op, ref lhs, ref rhs) => { - if cx.typeck_results().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() } + hir::ExprKind::AssignOp(op, ref lhs, ref rhs) => { + if self.typeck_results().is_method_call(expr) { + let lhs = self.mirror_expr_inner(lhs); + let rhs = self.mirror_expr_inner(rhs); + self.overloaded_operator(expr, self.arena.alloc_from_iter(vec![lhs, rhs])) + } else { + ExprKind::AssignOp { + op: bin_op(op.node), + lhs: self.mirror_expr(lhs), + rhs: self.mirror_expr(rhs), + } + } } - } - hir::ExprKind::Lit(ref lit) => ExprKind::Literal { - literal: cx.const_eval_literal(&lit.node, expr_ty, lit.span, false), - user_ty: None, - const_id: None, - }, - - hir::ExprKind::Binary(op, ref lhs, ref rhs) => { - if cx.typeck_results().is_method_call(expr) { - overloaded_operator(cx, expr, vec![lhs.to_ref(), rhs.to_ref()]) - } else { - // FIXME overflow - match (op.node, cx.constness) { - (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::ExprKind::Lit(ref lit) => ExprKind::Literal { + literal: self.const_eval_literal(&lit.node, expr_ty, lit.span, false), + user_ty: None, + const_id: None, + }, - _ => { - let op = bin_op(op.node); - ExprKind::Binary { op, lhs: lhs.to_ref(), rhs: rhs.to_ref() } + hir::ExprKind::Binary(op, ref lhs, ref rhs) => { + if self.typeck_results().is_method_call(expr) { + let lhs = self.mirror_expr_inner(lhs); + let rhs = self.mirror_expr_inner(rhs); + self.overloaded_operator(expr, self.arena.alloc_from_iter(vec![lhs, rhs])) + } else { + // FIXME overflow + match op.node { + hir::BinOpKind::And => ExprKind::LogicalOp { + op: LogicalOp::And, + lhs: self.mirror_expr(lhs), + rhs: self.mirror_expr(rhs), + }, + hir::BinOpKind::Or => ExprKind::LogicalOp { + op: LogicalOp::Or, + lhs: self.mirror_expr(lhs), + rhs: self.mirror_expr(rhs), + }, + + _ => { + let op = bin_op(op.node); + ExprKind::Binary { + op, + lhs: self.mirror_expr(lhs), + rhs: self.mirror_expr(rhs), + } + } } } } - } - hir::ExprKind::Index(ref lhs, ref index) => { - if cx.typeck_results().is_method_call(expr) { - overloaded_place( - cx, - expr, - expr_ty, - None, - vec![lhs.to_ref(), index.to_ref()], - expr.span, - ) - } else { - ExprKind::Index { lhs: lhs.to_ref(), index: index.to_ref() } + hir::ExprKind::Index(ref lhs, ref index) => { + if self.typeck_results().is_method_call(expr) { + let lhs = self.mirror_expr_inner(lhs); + let index = self.mirror_expr_inner(index); + self.overloaded_place( + expr, + expr_ty, + None, + self.arena.alloc_from_iter(vec![lhs, index]), + expr.span, + ) + } else { + ExprKind::Index { lhs: self.mirror_expr(lhs), index: self.mirror_expr(index) } + } } - } - hir::ExprKind::Unary(hir::UnOp::UnDeref, ref arg) => { - if cx.typeck_results().is_method_call(expr) { - overloaded_place(cx, expr, expr_ty, None, vec![arg.to_ref()], expr.span) - } else { - ExprKind::Deref { arg: arg.to_ref() } + hir::ExprKind::Unary(hir::UnOp::Deref, ref arg) => { + if self.typeck_results().is_method_call(expr) { + let arg = self.mirror_expr_inner(arg); + self.overloaded_place( + expr, + expr_ty, + None, + self.arena.alloc_from_iter(iter::once(arg)), + expr.span, + ) + } else { + ExprKind::Deref { arg: self.mirror_expr(arg) } + } } - } - hir::ExprKind::Unary(hir::UnOp::UnNot, ref arg) => { - if cx.typeck_results().is_method_call(expr) { - overloaded_operator(cx, expr, vec![arg.to_ref()]) - } else { - ExprKind::Unary { op: UnOp::Not, arg: arg.to_ref() } + hir::ExprKind::Unary(hir::UnOp::Not, ref arg) => { + if self.typeck_results().is_method_call(expr) { + let arg = self.mirror_expr_inner(arg); + self.overloaded_operator(expr, self.arena.alloc_from_iter(iter::once(arg))) + } else { + ExprKind::Unary { op: UnOp::Not, arg: self.mirror_expr(arg) } + } } - } - hir::ExprKind::Unary(hir::UnOp::UnNeg, ref arg) => { - if cx.typeck_results().is_method_call(expr) { - overloaded_operator(cx, expr, vec![arg.to_ref()]) - } else if let hir::ExprKind::Lit(ref lit) = arg.kind { - ExprKind::Literal { - literal: cx.const_eval_literal(&lit.node, expr_ty, lit.span, true), - user_ty: None, - const_id: None, + hir::ExprKind::Unary(hir::UnOp::Neg, ref arg) => { + if self.typeck_results().is_method_call(expr) { + let arg = self.mirror_expr_inner(arg); + self.overloaded_operator(expr, self.arena.alloc_from_iter(iter::once(arg))) + } else if let hir::ExprKind::Lit(ref lit) = arg.kind { + ExprKind::Literal { + literal: self.const_eval_literal(&lit.node, expr_ty, lit.span, true), + user_ty: None, + const_id: None, + } + } else { + ExprKind::Unary { op: UnOp::Neg, arg: self.mirror_expr(arg) } } - } else { - 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 => { - let user_provided_types = cx.typeck_results().user_provided_types(); - let user_ty = user_provided_types.get(expr.hir_id).copied(); - 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.typeck_results().fru_field_types()[expr.hir_id].clone(), - }), + 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 = self.typeck_results().user_provided_types(); + let user_ty = user_provided_types.get(expr.hir_id).copied(); + debug!("make_mirror_unadjusted: (struct/union) user_ty={:?}", user_ty); + ExprKind::Adt { + adt_def: adt, + variant_index: VariantIdx::new(0), + substs, + user_ty, + fields: self.field_refs(fields), + base: base.as_ref().map(|base| FruInfo { + base: self.mirror_expr(base), + field_types: self.arena.alloc_from_iter( + self.typeck_results().fru_field_types()[expr.hir_id] + .iter() + .cloned(), + ), + }), + } } - } - AdtKind::Enum => { - let res = cx.typeck_results().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.typeck_results().user_provided_types(); - let user_ty = user_provided_types.get(expr.hir_id).copied(); - 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, + AdtKind::Enum => { + let res = self.typeck_results().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 = + self.typeck_results().user_provided_types(); + let user_ty = user_provided_types.get(expr.hir_id).copied(); + debug!("make_mirror_unadjusted: (variant) user_ty={:?}", user_ty); + ExprKind::Adt { + adt_def: adt, + variant_index: index, + substs, + user_ty, + fields: self.field_refs(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); - } - }, - - hir::ExprKind::Closure(..) => { - let closure_ty = cx.typeck_results().expr_ty(expr); - let (def_id, substs, movability) = match *closure_ty.kind() { - ty::Closure(def_id, substs) => (def_id, UpvarSubsts::Closure(substs), None), - ty::Generator(def_id, substs, movability) => { - (def_id, UpvarSubsts::Generator(substs), Some(movability)) - } + }, _ => { - span_bug!(expr.span, "closure expr w/o closure type: {:?}", closure_ty); + span_bug!(expr.span, "unexpected type for struct literal: {:?}", expr_ty); } - }; + }, - let upvars = cx - .typeck_results() - .closure_min_captures_flattened(def_id) - .zip(substs.upvar_tys()) - .map(|(captured_place, ty)| capture_upvar(cx, expr, captured_place, ty)) - .collect(); - ExprKind::Closure { closure_id: def_id, substs, upvars, movability } - } + hir::ExprKind::Closure(..) => { + let closure_ty = self.typeck_results().expr_ty(expr); + let (def_id, substs, movability) = match *closure_ty.kind() { + ty::Closure(def_id, substs) => (def_id, UpvarSubsts::Closure(substs), None), + ty::Generator(def_id, substs, movability) => { + (def_id, UpvarSubsts::Generator(substs), Some(movability)) + } + _ => { + span_bug!(expr.span, "closure expr w/o closure type: {:?}", closure_ty); + } + }; - hir::ExprKind::Path(ref qpath) => { - let res = cx.typeck_results().qpath_res(qpath, expr.hir_id); - convert_path_expr(cx, expr, res) - } + let upvars = self.arena.alloc_from_iter( + self.typeck_results + .closure_min_captures_flattened(def_id) + .zip(substs.upvar_tys()) + .map(|(captured_place, ty)| self.capture_upvar(expr, captured_place, ty)), + ); + + // Convert the closure fake reads, if any, from hir `Place` to ExprRef + let fake_reads = match self.typeck_results.closure_fake_reads.get(&def_id) { + Some(fake_reads) => fake_reads + .iter() + .map(|(place, cause, hir_id)| { + let expr = self.convert_captured_hir_place(expr, place.clone()); + let expr_ref: &'thir Expr<'thir, 'tcx> = self.arena.alloc(expr); + (expr_ref, *cause, *hir_id) + }) + .collect(), + None => Vec::new(), + }; - hir::ExprKind::InlineAsm(ref asm) => ExprKind::InlineAsm { - template: asm.template, - operands: asm - .operands - .iter() - .map(|(op, _op_sp)| { + ExprKind::Closure { closure_id: def_id, substs, upvars, movability, fake_reads } + } + + hir::ExprKind::Path(ref qpath) => { + let res = self.typeck_results().qpath_res(qpath, expr.hir_id); + self.convert_path_expr(expr, res) + } + + hir::ExprKind::InlineAsm(ref asm) => ExprKind::InlineAsm { + template: asm.template, + operands: self.arena.alloc_from_iter(asm.operands.iter().map(|(op, _op_sp)| { match *op { hir::InlineAsmOperand::In { reg, ref expr } => { - InlineAsmOperand::In { reg, expr: expr.to_ref() } + InlineAsmOperand::In { reg, expr: self.mirror_expr(expr) } } hir::InlineAsmOperand::Out { reg, late, ref expr } => { InlineAsmOperand::Out { reg, late, - expr: expr.as_ref().map(|expr| expr.to_ref()), + expr: expr.as_ref().map(|expr| self.mirror_expr(expr)), } } hir::InlineAsmOperand::InOut { reg, late, ref expr } => { - InlineAsmOperand::InOut { reg, late, expr: expr.to_ref() } + InlineAsmOperand::InOut { reg, late, expr: self.mirror_expr(expr) } } hir::InlineAsmOperand::SplitInOut { reg, @@ -431,11 +500,11 @@ fn make_mirror_unadjusted<'a, 'tcx>( } => InlineAsmOperand::SplitInOut { reg, late, - in_expr: in_expr.to_ref(), - out_expr: out_expr.as_ref().map(|expr| expr.to_ref()), + in_expr: self.mirror_expr(in_expr), + out_expr: out_expr.as_ref().map(|expr| self.mirror_expr(expr)), }, hir::InlineAsmOperand::Const { ref expr } => { - InlineAsmOperand::Const { expr: expr.to_ref() } + InlineAsmOperand::Const { expr: self.mirror_expr(expr) } } hir::InlineAsmOperand::Sym { ref expr } => { let qpath = match expr.kind { @@ -447,25 +516,24 @@ fn make_mirror_unadjusted<'a, 'tcx>( ), }; let temp_lifetime = - cx.region_scope_tree.temporary_scope(expr.hir_id.local_id); - let res = cx.typeck_results().qpath_res(qpath, expr.hir_id); + self.region_scope_tree.temporary_scope(expr.hir_id.local_id); + let res = self.typeck_results().qpath_res(qpath, expr.hir_id); let ty; match res { Res::Def(DefKind::Fn, _) | Res::Def(DefKind::AssocFn, _) => { - ty = cx.typeck_results().node_type(expr.hir_id); - let user_ty = user_substs_applied_to_res(cx, expr.hir_id, res); + ty = self.typeck_results().node_type(expr.hir_id); + let user_ty = self.user_substs_applied_to_res(expr.hir_id, res); InlineAsmOperand::SymFn { - expr: Expr { + expr: self.arena.alloc(Expr { ty, temp_lifetime, span: expr.span, kind: ExprKind::Literal { - literal: ty::Const::zero_sized(cx.tcx, ty), + literal: ty::Const::zero_sized(self.tcx, ty), user_ty, const_id: None, }, - } - .to_ref(), + }), } } @@ -474,277 +542,583 @@ fn make_mirror_unadjusted<'a, 'tcx>( } _ => { - cx.tcx.sess.span_err( + self.tcx.sess.span_err( expr.span, "asm `sym` operand must point to a fn or static", ); // Not a real fn, but we're not reaching codegen anyways... - ty = cx.tcx.ty_error(); + ty = self.tcx.ty_error(); InlineAsmOperand::SymFn { - expr: Expr { + expr: self.arena.alloc(Expr { ty, temp_lifetime, span: expr.span, kind: ExprKind::Literal { - literal: ty::Const::zero_sized(cx.tcx, ty), + literal: ty::Const::zero_sized(self.tcx, ty), user_ty: None, const_id: None, }, - } - .to_ref(), + }), } } } } } - }) - .collect(), - options: asm.options, - line_spans: asm.line_spans, - }, - - hir::ExprKind::LlvmInlineAsm(ref asm) => ExprKind::LlvmInlineAsm { - asm: &asm.inner, - outputs: asm.outputs_exprs.to_ref(), - inputs: asm.inputs_exprs.to_ref(), - }, - - hir::ExprKind::ConstBlock(ref anon_const) => { - let anon_const_def_id = cx.tcx.hir().local_def_id(anon_const.hir_id); - let value = ty::Const::from_anon_const(cx.tcx, anon_const_def_id); - - ExprKind::ConstBlock { value } - } - // Now comes the rote stuff: - hir::ExprKind::Repeat(ref v, ref count) => { - let count_def_id = cx.tcx.hir().local_def_id(count.hir_id); - let count = ty::Const::from_anon_const(cx.tcx, count_def_id); + })), + options: asm.options, + line_spans: asm.line_spans, + }, - 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(), + hir::ExprKind::LlvmInlineAsm(ref asm) => ExprKind::LlvmInlineAsm { + asm: &asm.inner, + outputs: self.mirror_exprs(asm.outputs_exprs), + inputs: self.mirror_exprs(asm.inputs_exprs), + }, + + hir::ExprKind::ConstBlock(ref anon_const) => { + let anon_const_def_id = self.tcx.hir().local_def_id(anon_const.hir_id); + let value = ty::Const::from_anon_const(self.tcx, anon_const_def_id); + + ExprKind::ConstBlock { value } + } + // Now comes the rote stuff: + hir::ExprKind::Repeat(ref v, ref count) => { + let count_def_id = self.tcx.hir().local_def_id(count.hir_id); + let count = ty::Const::from_anon_const(self.tcx, count_def_id); + + ExprKind::Repeat { value: self.mirror_expr(v), count } + } + hir::ExprKind::Ret(ref v) => { + ExprKind::Return { value: v.as_ref().map(|v| self.mirror_expr(v)) } + } + 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.as_ref().map(|value| self.mirror_expr(value)), + }, + Err(err) => bug!("invalid loop id for break: {}", err), }, - 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 }, + 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), }, - Err(err) => bug!("invalid loop id for continue: {}", err), - }, - hir::ExprKind::If(cond, then, else_opt) => ExprKind::If { - cond: cond.to_ref(), - then: then.to_ref(), - else_opt: else_opt.map(|el| el.to_ref()), - }, - 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.typeck_results)), - }, - hir::ExprKind::Cast(ref source, ref cast_ty) => { - // Check for a user-given type annotation on this `cast` - let user_provided_types = cx.typeck_results.user_provided_types(); - let user_ty = user_provided_types.get(cast_ty.hir_id); - - debug!( - "cast({:?}) has ty w/ hir_id {:?} and user provided ty {:?}", - expr, cast_ty.hir_id, user_ty, - ); - - // Check to see if this cast is a "coercion cast", where the cast is actually done - // using a coercion (or is a no-op). - let cast = if cx.typeck_results().is_coercion_cast(source.hir_id) { - // Convert the lexpr to a vexpr. - ExprKind::Use { source: source.to_ref() } - } else if cx.typeck_results().expr_ty(source).is_region_ptr() { - // Special cased so that we can type check that the element - // type of the source matches the pointed to type of the - // destination. - ExprKind::Pointer { source: source.to_ref(), cast: PointerCast::ArrayToPointer } - } else { - // check whether this is casting an enum variant discriminant - // to prevent cycles, we refer to the discriminant initializer - // which is always an integer and thus doesn't need to know the - // enum's layout (or its tag type) to compute it during const eval - // Example: - // enum Foo { - // A, - // B = A as isize + 4, - // } - // The correct solution would be to add symbolic computations to miri, - // 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.typeck_results().qpath_res(qpath, source.hir_id); - cx.typeck_results().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, - ) => { - let idx = adt_def.variant_index_with_ctor_id(variant_ctor_id); - let (d, o) = adt_def.discriminant_def_for_variant(idx); - use rustc_middle::ty::util::IntTypeExt; - let ty = adt_def.repr.discr_type(); - let ty = ty.to_ty(cx.tcx()); - Some((d, o, ty)) - } - _ => None, - } - }) + hir::ExprKind::If(cond, then, else_opt) => ExprKind::If { + cond: self.mirror_expr(cond), + then: self.mirror_expr(then), + else_opt: else_opt.map(|el| self.mirror_expr(el)), + }, + hir::ExprKind::Match(ref discr, ref arms, _) => ExprKind::Match { + scrutinee: self.mirror_expr(discr), + arms: self.arena.alloc_from_iter(arms.iter().map(|a| self.convert_arm(a))), + }, + hir::ExprKind::Loop(ref body, ..) => { + let block_ty = self.typeck_results().node_type(body.hir_id); + let temp_lifetime = self.region_scope_tree.temporary_scope(body.hir_id.local_id); + let block = self.mirror_block(body); + let body = self.arena.alloc(Expr { + ty: block_ty, + temp_lifetime, + span: block.span, + kind: ExprKind::Block { body: block }, + }); + ExprKind::Loop { body } + } + hir::ExprKind::Field(ref source, ..) => ExprKind::Field { + lhs: self.mirror_expr(source), + name: Field::new(self.tcx.field_index(expr.hir_id, self.typeck_results)), + }, + hir::ExprKind::Cast(ref source, ref cast_ty) => { + // Check for a user-given type annotation on this `cast` + let user_provided_types = self.typeck_results.user_provided_types(); + let user_ty = user_provided_types.get(cast_ty.hir_id); + + debug!( + "cast({:?}) has ty w/ hir_id {:?} and user provided ty {:?}", + expr, cast_ty.hir_id, user_ty, + ); + + // Check to see if this cast is a "coercion cast", where the cast is actually done + // using a coercion (or is a no-op). + let cast = if self.typeck_results().is_coercion_cast(source.hir_id) { + // Convert the lexpr to a vexpr. + ExprKind::Use { source: self.mirror_expr(source) } + } else if self.typeck_results().expr_ty(source).is_region_ptr() { + // Special cased so that we can type check that the element + // type of the source matches the pointed to type of the + // destination. + ExprKind::Pointer { + source: self.mirror_expr(source), + cast: PointerCast::ArrayToPointer, + } } 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, const_id: None }, - } - .to_ref() + // check whether this is casting an enum variant discriminant + // to prevent cycles, we refer to the discriminant initializer + // which is always an integer and thus doesn't need to know the + // enum's layout (or its tag type) to compute it during const eval + // Example: + // enum Foo { + // A, + // B = A as isize + 4, + // } + // The correct solution would be to add symbolic computations to miri, + // 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 = self.typeck_results().qpath_res(qpath, source.hir_id); + self.typeck_results().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, + ) => { + let idx = adt_def.variant_index_with_ctor_id(variant_ctor_id); + let (d, o) = adt_def.discriminant_def_for_variant(idx); + use rustc_middle::ty::util::IntTypeExt; + let ty = adt_def.repr.discr_type(); + let ty = ty.to_ty(self.tcx()); + Some((d, o, ty)) + } + _ => None, + }, + ) + } else { + None }; - let offset = mk_const(ty::Const::from_bits( - cx.tcx, - offset as u128, - cx.param_env.and(var_ty), - )); - match did { - Some(did) => { - // in case we are offsetting from a computed discriminant - // 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( - ty::WithOptConstParam::unknown(did), - substs, - None, - ), + + let source = if let Some((did, offset, var_ty)) = var { + let mk_const = |literal| { + self.arena.alloc(Expr { + temp_lifetime, 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() + span: expr.span, + kind: ExprKind::Literal { literal, user_ty: None, const_id: None }, + }) + }; + let offset = mk_const(ty::Const::from_bits( + self.tcx, + offset as u128, + self.param_env.and(var_ty), + )); + match did { + Some(did) => { + // in case we are offsetting from a computed discriminant + // and not the beginning of discriminants (which is always `0`) + let substs = InternalSubsts::identity_for_item(self.tcx(), did); + let lhs = mk_const(self.tcx().mk_const(ty::Const { + val: ty::ConstKind::Unevaluated( + ty::WithOptConstParam::unknown(did), + substs, + None, + ), + ty: var_ty, + })); + let bin = + ExprKind::Binary { op: BinOp::Add, lhs: lhs, rhs: offset }; + self.arena.alloc(Expr { + temp_lifetime, + ty: var_ty, + span: expr.span, + kind: bin, + }) + } + None => offset, } - None => offset, - } - } else { - source.to_ref() - }; + } else { + self.mirror_expr(source) + }; - ExprKind::Cast { source } - }; + ExprKind::Cast { source: source } + }; - 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 }; - debug!("make_mirror_unadjusted: (cast) user_ty={:?}", user_ty); + 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 = self.arena.alloc(Expr { + temp_lifetime, + ty: expr_ty, + span: expr.span, + kind: cast, + }); + debug!("make_mirror_unadjusted: (cast) user_ty={:?}", user_ty); - ExprKind::ValueTypeAscription { - source: cast_expr.to_ref(), - user_ty: Some(*user_ty), + ExprKind::ValueTypeAscription { source: cast_expr, user_ty: Some(*user_ty) } + } else { + cast } - } else { - cast } - } - hir::ExprKind::Type(ref source, ref ty) => { - let user_provided_types = cx.typeck_results.user_provided_types(); - let user_ty = user_provided_types.get(ty.hir_id).copied(); - debug!("make_mirror_unadjusted: (type) user_ty={:?}", user_ty); - if source.is_syntactic_place_expr() { - ExprKind::PlaceTypeAscription { source: source.to_ref(), user_ty } - } else { - ExprKind::ValueTypeAscription { source: source.to_ref(), user_ty } + hir::ExprKind::Type(ref source, ref ty) => { + let user_provided_types = self.typeck_results.user_provided_types(); + let user_ty = user_provided_types.get(ty.hir_id).copied(); + debug!("make_mirror_unadjusted: (type) user_ty={:?}", user_ty); + let mirrored = self.mirror_expr(source); + if source.is_syntactic_place_expr() { + ExprKind::PlaceTypeAscription { source: mirrored, user_ty } + } else { + ExprKind::ValueTypeAscription { source: mirrored, user_ty } + } + } + hir::ExprKind::DropTemps(ref source) => { + ExprKind::Use { source: self.mirror_expr(source) } + } + hir::ExprKind::Box(ref value) => ExprKind::Box { value: self.mirror_expr(value) }, + hir::ExprKind::Array(ref fields) => { + ExprKind::Array { fields: self.mirror_exprs(fields) } } + hir::ExprKind::Tup(ref fields) => ExprKind::Tuple { fields: self.mirror_exprs(fields) }, + + hir::ExprKind::Yield(ref v, _) => ExprKind::Yield { value: self.mirror_expr(v) }, + hir::ExprKind::Err => unreachable!(), + }; + + Expr { temp_lifetime, ty: expr_ty, span: expr.span, kind } + } + + fn user_substs_applied_to_res( + &mut self, + hir_id: hir::HirId, + res: Res, + ) -> Option> { + debug!("user_substs_applied_to_res: res={:?}", res); + let user_provided_type = match 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::AssocFn, _) + | Res::Def(DefKind::Ctor(_, CtorKind::Fn), _) + | Res::Def(DefKind::Const, _) + | Res::Def(DefKind::AssocConst, _) => { + self.typeck_results().user_provided_types().get(hir_id).copied() + } + + // 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), _) => { + self.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(_) => self.user_substs_applied_to_ty_of_hir_id(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 + } + + fn method_callee( + &mut self, + expr: &hir::Expr<'_>, + span: Span, + overloaded_callee: Option<(DefId, SubstsRef<'tcx>)>, + ) -> Expr<'thir, 'tcx> { + let temp_lifetime = self.region_scope_tree.temporary_scope(expr.hir_id.local_id); + let (def_id, substs, user_ty) = match overloaded_callee { + Some((def_id, substs)) => (def_id, substs, None), + None => { + let (kind, def_id) = + self.typeck_results().type_dependent_def(expr.hir_id).unwrap_or_else(|| { + span_bug!(expr.span, "no type-dependent def for method callee") + }); + let user_ty = self.user_substs_applied_to_res(expr.hir_id, Res::Def(kind, def_id)); + debug!("method_callee: user_ty={:?}", user_ty); + (def_id, self.typeck_results().node_substs(expr.hir_id), user_ty) + } + }; + let ty = self.tcx().mk_fn_def(def_id, substs); + Expr { + temp_lifetime, + ty, + span, + kind: ExprKind::Literal { + literal: ty::Const::zero_sized(self.tcx(), ty), + user_ty, + const_id: None, + }, } - 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() }, + } - hir::ExprKind::Yield(ref v, _) => ExprKind::Yield { value: v.to_ref() }, - hir::ExprKind::Err => unreachable!(), - }; + fn convert_arm(&mut self, arm: &'tcx hir::Arm<'tcx>) -> Arm<'thir, 'tcx> { + Arm { + pattern: self.pattern_from_hir(&arm.pat), + guard: arm.guard.as_ref().map(|g| match g { + hir::Guard::If(ref e) => Guard::If(self.mirror_expr(e)), + hir::Guard::IfLet(ref pat, ref e) => { + Guard::IfLet(self.pattern_from_hir(pat), self.mirror_expr(e)) + } + }), + body: self.mirror_expr(arm.body), + lint_level: LintLevel::Explicit(arm.hir_id), + scope: region::Scope { id: arm.hir_id.local_id, data: region::ScopeData::Node }, + span: arm.span, + } + } - Expr { temp_lifetime, ty: expr_ty, span: expr.span, kind } -} + fn convert_path_expr( + &mut self, + expr: &'tcx hir::Expr<'tcx>, + res: Res, + ) -> ExprKind<'thir, 'tcx> { + let substs = self.typeck_results().node_substs(expr.hir_id); + match res { + // A regular function, constructor function or a constant. + Res::Def(DefKind::Fn, _) + | Res::Def(DefKind::AssocFn, _) + | Res::Def(DefKind::Ctor(_, CtorKind::Fn), _) + | Res::SelfCtor(..) => { + let user_ty = self.user_substs_applied_to_res(expr.hir_id, res); + debug!("convert_path_expr: user_ty={:?}", user_ty); + ExprKind::Literal { + literal: ty::Const::zero_sized( + self.tcx, + self.typeck_results().node_type(expr.hir_id), + ), + user_ty, + const_id: None, + } + } + + Res::Def(DefKind::ConstParam, def_id) => { + let hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id.expect_local()); + let item_id = self.tcx.hir().get_parent_node(hir_id); + let item_def_id = self.tcx.hir().local_def_id(item_id); + let generics = self.tcx.generics_of(item_def_id); + let index = generics.param_def_id_to_index[&def_id]; + let name = self.tcx.hir().name(hir_id); + let val = ty::ConstKind::Param(ty::ParamConst::new(index, name)); + ExprKind::Literal { + literal: self.tcx.mk_const(ty::Const { + val, + ty: self.typeck_results().node_type(expr.hir_id), + }), + user_ty: None, + const_id: Some(def_id), + } + } + + Res::Def(DefKind::Const, def_id) | Res::Def(DefKind::AssocConst, def_id) => { + let user_ty = self.user_substs_applied_to_res(expr.hir_id, res); + debug!("convert_path_expr: (const) user_ty={:?}", user_ty); + ExprKind::Literal { + literal: self.tcx.mk_const(ty::Const { + val: ty::ConstKind::Unevaluated( + ty::WithOptConstParam::unknown(def_id), + substs, + None, + ), + ty: self.typeck_results().node_type(expr.hir_id), + }), + user_ty, + const_id: Some(def_id), + } + } + + Res::Def(DefKind::Ctor(_, CtorKind::Const), def_id) => { + let user_provided_types = self.typeck_results.user_provided_types(); + let user_provided_type = user_provided_types.get(expr.hir_id).copied(); + debug!("convert_path_expr: user_provided_type={:?}", user_provided_type); + let ty = self.typeck_results().node_type(expr.hir_id); + 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: self.arena.alloc_from_iter(iter::empty()), + base: None, + }, + _ => bug!("unexpected ty: {:?}", ty), + } + } + + // We encode uses of statics as a `*&STATIC` where the `&STATIC` part is + // a constant reference (or constant raw pointer for `static mut`) in MIR + Res::Def(DefKind::Static, id) => { + let ty = self.tcx.static_ptr_ty(id); + let temp_lifetime = self.region_scope_tree.temporary_scope(expr.hir_id.local_id); + let kind = if self.tcx.is_thread_local_static(id) { + ExprKind::ThreadLocalRef(id) + } else { + let ptr = self.tcx.create_static_alloc(id); + ExprKind::StaticRef { + literal: ty::Const::from_scalar(self.tcx, Scalar::Ptr(ptr.into()), ty), + def_id: id, + } + }; + ExprKind::Deref { + arg: self.arena.alloc(Expr { ty, temp_lifetime, span: expr.span, kind }), + } + } + + Res::Local(var_hir_id) => self.convert_var(var_hir_id), -fn user_substs_applied_to_res<'tcx>( - cx: &mut Cx<'_, 'tcx>, - hir_id: hir::HirId, - res: Res, -) -> Option> { - debug!("user_substs_applied_to_res: res={:?}", res); - let user_provided_type = match 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::AssocFn, _) - | Res::Def(DefKind::Ctor(_, CtorKind::Fn), _) - | Res::Def(DefKind::Const, _) - | Res::Def(DefKind::AssocConst, _) => { - cx.typeck_results().user_provided_types().get(hir_id).copied() + _ => span_bug!(expr.span, "res `{:?}` not yet implemented", res), } + } - // 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) + fn convert_var(&mut self, var_hir_id: hir::HirId) -> ExprKind<'thir, 'tcx> { + // We want upvars here not captures. + // Captures will be handled in MIR. + let is_upvar = self + .tcx + .upvars_mentioned(self.body_owner) + .map_or(false, |upvars| upvars.contains_key(&var_hir_id)); + + debug!( + "convert_var({:?}): is_upvar={}, body_owner={:?}", + var_hir_id, is_upvar, self.body_owner + ); + + if is_upvar { + ExprKind::UpvarRef { closure_def_id: self.body_owner, var_hir_id } + } else { + ExprKind::VarRef { id: var_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), + fn overloaded_operator( + &mut self, + expr: &'tcx hir::Expr<'tcx>, + args: &'thir [Expr<'thir, 'tcx>], + ) -> ExprKind<'thir, 'tcx> { + let fun = self.arena.alloc(self.method_callee(expr, expr.span, None)); + ExprKind::Call { ty: fun.ty, fun, args, from_hir_call: false, fn_span: expr.span } + } - _ => 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 -} + fn overloaded_place( + &mut self, + expr: &'tcx hir::Expr<'tcx>, + place_ty: Ty<'tcx>, + overloaded_callee: Option<(DefId, SubstsRef<'tcx>)>, + args: &'thir [Expr<'thir, 'tcx>], + span: Span, + ) -> ExprKind<'thir, 'tcx> { + // For an overloaded *x or x[y] expression of type T, the method + // call returns an &T and we must add the deref so that the types + // line up (this is because `*x` and `x[y]` represent places): + + // Reconstruct the output assuming it's a reference with the + // same region and mutability as the receiver. This holds for + // `Deref(Mut)::Deref(_mut)` and `Index(Mut)::index(_mut)`. + let (region, mutbl) = match *args[0].ty.kind() { + ty::Ref(region, _, mutbl) => (region, mutbl), + _ => span_bug!(span, "overloaded_place: receiver is not a reference"), + }; + let ref_ty = self.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 + let temp_lifetime = self.region_scope_tree.temporary_scope(expr.hir_id.local_id); + let fun = self.arena.alloc(self.method_callee(expr, span, overloaded_callee)); + let ref_expr = self.arena.alloc(Expr { + temp_lifetime, + ty: ref_ty, + span, + kind: ExprKind::Call { ty: fun.ty, fun, args, from_hir_call: false, fn_span: span }, + }); -fn method_callee<'a, 'tcx>( - cx: &mut Cx<'a, 'tcx>, - expr: &hir::Expr<'_>, - span: Span, - overloaded_callee: Option<(DefId, SubstsRef<'tcx>)>, -) -> Expr<'tcx> { - let temp_lifetime = cx.region_scope_tree.temporary_scope(expr.hir_id.local_id); - let (def_id, substs, user_ty) = match overloaded_callee { - Some((def_id, substs)) => (def_id, substs, None), - None => { - let (kind, def_id) = cx - .typeck_results() - .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.typeck_results().node_substs(expr.hir_id), user_ty) + // construct and return a deref wrapper `*foo()` + ExprKind::Deref { arg: ref_expr } + } + + fn convert_captured_hir_place( + &mut self, + closure_expr: &'tcx hir::Expr<'tcx>, + place: HirPlace<'tcx>, + ) -> Expr<'thir, 'tcx> { + let temp_lifetime = self.region_scope_tree.temporary_scope(closure_expr.hir_id.local_id); + let var_ty = place.base_ty; + + // The result of capture analysis in `rustc_typeck/check/upvar.rs`represents a captured path + // as it's seen for use within the closure and not at the time of closure creation. + // + // That is we see expect to see it start from a captured upvar and not something that is local + // to the closure's parent. + let var_hir_id = match place.base { + HirPlaceBase::Upvar(upvar_id) => upvar_id.var_path.hir_id, + base => bug!("Expected an upvar, found {:?}", base), + }; + + let mut captured_place_expr = Expr { + temp_lifetime, + ty: var_ty, + span: closure_expr.span, + kind: self.convert_var(var_hir_id), + }; + + for proj in place.projections.iter() { + let kind = match proj.kind { + HirProjectionKind::Deref => { + ExprKind::Deref { arg: self.arena.alloc(captured_place_expr) } + } + HirProjectionKind::Field(field, ..) => { + // Variant index will always be 0, because for multi-variant + // enums, we capture the enum entirely. + ExprKind::Field { + lhs: self.arena.alloc(captured_place_expr), + name: Field::new(field as usize), + } + } + HirProjectionKind::Index | HirProjectionKind::Subslice => { + // We don't capture these projections, so we can ignore them here + continue; + } + }; + + captured_place_expr = + Expr { temp_lifetime, ty: proj.ty, span: closure_expr.span, kind }; + } + + captured_place_expr + } + + fn capture_upvar( + &mut self, + closure_expr: &'tcx hir::Expr<'tcx>, + captured_place: &'tcx ty::CapturedPlace<'tcx>, + upvar_ty: Ty<'tcx>, + ) -> Expr<'thir, 'tcx> { + let upvar_capture = captured_place.info.capture_kind; + let captured_place_expr = + self.convert_captured_hir_place(closure_expr, captured_place.place.clone()); + let temp_lifetime = self.region_scope_tree.temporary_scope(closure_expr.hir_id.local_id); + + match upvar_capture { + ty::UpvarCapture::ByValue(_) => captured_place_expr, + ty::UpvarCapture::ByRef(upvar_borrow) => { + 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 }, + }; + Expr { + temp_lifetime, + ty: upvar_ty, + span: closure_expr.span, + kind: ExprKind::Borrow { + borrow_kind, + arg: self.arena.alloc(captured_place_expr), + }, + } + } } - }; - let ty = cx.tcx().mk_fn_def(def_id, substs); - Expr { - temp_lifetime, - ty, - span, - kind: ExprKind::Literal { - literal: ty::Const::zero_sized(cx.tcx(), ty), - user_ty, - const_id: None, - }, + } + + /// Converts a list of named fields (i.e., for struct-like struct/enum ADTs) into FieldExpr. + fn field_refs( + &mut self, + fields: &'tcx [hir::ExprField<'tcx>], + ) -> &'thir [FieldExpr<'thir, 'tcx>] { + self.arena.alloc_from_iter(fields.iter().map(|field| FieldExpr { + name: Field::new(self.tcx.field_index(field.hir_id, self.typeck_results)), + expr: self.mirror_expr(field.expr), + })) } } @@ -776,135 +1150,6 @@ impl ToBorrowKind for hir::Mutability { } } -fn convert_arm<'tcx>(cx: &mut Cx<'_, 'tcx>, arm: &'tcx hir::Arm<'tcx>) -> Arm<'tcx> { - Arm { - pattern: cx.pattern_from_hir(&arm.pat), - guard: arm.guard.as_ref().map(|g| match g { - hir::Guard::If(ref e) => Guard::If(e.to_ref()), - hir::Guard::IfLet(ref pat, ref e) => Guard::IfLet(cx.pattern_from_hir(pat), e.to_ref()), - }), - 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 }, - span: arm.span, - } -} - -fn convert_path_expr<'a, 'tcx>( - cx: &mut Cx<'a, 'tcx>, - expr: &'tcx hir::Expr<'tcx>, - res: Res, -) -> ExprKind<'tcx> { - let substs = cx.typeck_results().node_substs(expr.hir_id); - match res { - // A regular function, constructor function or a constant. - Res::Def(DefKind::Fn, _) - | Res::Def(DefKind::AssocFn, _) - | 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.typeck_results().node_type(expr.hir_id)), - user_ty, - const_id: None, - } - } - - Res::Def(DefKind::ConstParam, def_id) => { - let hir_id = cx.tcx.hir().local_def_id_to_hir_id(def_id.expect_local()); - let item_id = cx.tcx.hir().get_parent_node(hir_id); - let item_def_id = cx.tcx.hir().local_def_id(item_id); - let generics = cx.tcx.generics_of(item_def_id); - let index = generics.param_def_id_to_index[&def_id]; - 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.typeck_results().node_type(expr.hir_id) }), - user_ty: None, - const_id: Some(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( - ty::WithOptConstParam::unknown(def_id), - substs, - None, - ), - ty: cx.typeck_results().node_type(expr.hir_id), - }), - user_ty, - const_id: Some(def_id), - } - } - - Res::Def(DefKind::Ctor(_, CtorKind::Const), def_id) => { - let user_provided_types = cx.typeck_results.user_provided_types(); - let user_provided_type = user_provided_types.get(expr.hir_id).copied(); - debug!("convert_path_expr: user_provided_type={:?}", user_provided_type); - let ty = cx.typeck_results().node_type(expr.hir_id); - 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, - }, - _ => bug!("unexpected ty: {:?}", ty), - } - } - - // We encode uses of statics as a `*&STATIC` where the `&STATIC` part is - // a constant reference (or constant raw pointer for `static mut`) in MIR - Res::Def(DefKind::Static, id) => { - let ty = cx.tcx.static_ptr_ty(id); - let temp_lifetime = cx.region_scope_tree.temporary_scope(expr.hir_id.local_id); - let kind = if cx.tcx.is_thread_local_static(id) { - ExprKind::ThreadLocalRef(id) - } else { - let ptr = cx.tcx.create_static_alloc(id); - 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 }.to_ref() } - } - - Res::Local(var_hir_id) => convert_var(cx, var_hir_id), - - _ => span_bug!(expr.span, "res `{:?}` not yet implemented", res), - } -} - -fn convert_var<'tcx>(cx: &mut Cx<'_, 'tcx>, var_hir_id: hir::HirId) -> ExprKind<'tcx> { - // We want upvars here not captures. - // Captures will be handled in MIR. - let is_upvar = cx - .tcx - .upvars_mentioned(cx.body_owner) - .map_or(false, |upvars| upvars.contains_key(&var_hir_id)); - - debug!("convert_var({:?}): is_upvar={}, body_owner={:?}", var_hir_id, is_upvar, cx.body_owner); - - if is_upvar { - ExprKind::UpvarRef { closure_def_id: cx.body_owner, var_hir_id } - } else { - ExprKind::VarRef { id: var_hir_id } - } -} - fn bin_op(op: hir::BinOpKind) -> BinOp { match op { hir::BinOpKind::Add => BinOp::Add, @@ -926,139 +1171,3 @@ fn bin_op(op: hir::BinOpKind) -> BinOp { _ => bug!("no equivalent for ast binop {:?}", op), } } - -fn overloaded_operator<'a, 'tcx>( - cx: &mut Cx<'a, 'tcx>, - 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, fn_span: expr.span } -} - -fn overloaded_place<'a, 'tcx>( - cx: &mut Cx<'a, 'tcx>, - expr: &'tcx hir::Expr<'tcx>, - place_ty: Ty<'tcx>, - overloaded_callee: Option<(DefId, SubstsRef<'tcx>)>, - args: Vec>, - span: Span, -) -> ExprKind<'tcx> { - // For an overloaded *x or x[y] expression of type T, the method - // call returns an &T and we must add the deref so that the types - // line up (this is because `*x` and `x[y]` represent places): - - let recv_ty = match args[0] { - ExprRef::Thir(e) => cx.typeck_results().expr_ty_adjusted(e), - ExprRef::Mirror(ref e) => e.ty, - }; - - // Reconstruct the output assuming it's a reference with the - // same region and mutability as the receiver. This holds for - // `Deref(Mut)::Deref(_mut)` and `Index(Mut)::index(_mut)`. - let (region, mutbl) = match *recv_ty.kind() { - ty::Ref(region, _, mutbl) => (region, mutbl), - _ => span_bug!(span, "overloaded_place: receiver is not a reference"), - }; - 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 - let temp_lifetime = cx.region_scope_tree.temporary_scope(expr.hir_id.local_id); - let fun = method_callee(cx, expr, span, overloaded_callee); - let ref_expr = Expr { - temp_lifetime, - ty: ref_ty, - span, - kind: ExprKind::Call { - ty: fun.ty, - fun: fun.to_ref(), - args, - from_hir_call: false, - fn_span: span, - }, - }; - - // construct and return a deref wrapper `*foo()` - ExprKind::Deref { arg: ref_expr.to_ref() } -} - -fn capture_upvar<'a, 'tcx>( - cx: &mut Cx<'_, 'tcx>, - closure_expr: &'tcx hir::Expr<'tcx>, - captured_place: &'a ty::CapturedPlace<'tcx>, - upvar_ty: Ty<'tcx>, -) -> ExprRef<'tcx> { - let upvar_capture = captured_place.info.capture_kind; - let temp_lifetime = cx.region_scope_tree.temporary_scope(closure_expr.hir_id.local_id); - let var_ty = captured_place.place.base_ty; - - // The result of capture analysis in `rustc_typeck/check/upvar.rs`represents a captured path - // as it's seen for use within the closure and not at the time of closure creation. - // - // That is we see expect to see it start from a captured upvar and not something that is local - // to the closure's parent. - let var_hir_id = match captured_place.place.base { - HirPlaceBase::Upvar(upvar_id) => upvar_id.var_path.hir_id, - base => bug!("Expected an upvar, found {:?}", base), - }; - - let mut captured_place_expr = Expr { - temp_lifetime, - ty: var_ty, - span: closure_expr.span, - kind: convert_var(cx, var_hir_id), - }; - - for proj in captured_place.place.projections.iter() { - let kind = match proj.kind { - HirProjectionKind::Deref => ExprKind::Deref { arg: captured_place_expr.to_ref() }, - HirProjectionKind::Field(field, ..) => { - // Variant index will always be 0, because for multi-variant - // enums, we capture the enum entirely. - ExprKind::Field { - lhs: captured_place_expr.to_ref(), - name: Field::new(field as usize), - } - } - HirProjectionKind::Index | HirProjectionKind::Subslice => { - // We don't capture these projections, so we can ignore them here - continue; - } - }; - - captured_place_expr = Expr { temp_lifetime, ty: proj.ty, span: closure_expr.span, kind }; - } - - match upvar_capture { - ty::UpvarCapture::ByValue(_) => captured_place_expr.to_ref(), - ty::UpvarCapture::ByRef(upvar_borrow) => { - 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 }, - }; - Expr { - temp_lifetime, - ty: upvar_ty, - span: closure_expr.span, - kind: ExprKind::Borrow { borrow_kind, arg: captured_place_expr.to_ref() }, - } - .to_ref() - } - } -} - -/// 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<'tcx>], -) -> Vec> { - fields - .iter() - .map(|field| FieldExprRef { - name: Field::new(cx.tcx.field_index(field.hir_id, cx.typeck_results)), - expr: field.expr.to_ref(), - }) - .collect() -} diff --git a/compiler/rustc_mir_build/src/thir/cx/mod.rs b/compiler/rustc_mir_build/src/thir/cx/mod.rs index 465808cea9..c0433604f8 100644 --- a/compiler/rustc_mir_build/src/thir/cx/mod.rs +++ b/compiler/rustc_mir_build/src/thir/cx/mod.rs @@ -2,6 +2,7 @@ //! structures into the THIR. The `builder` is generally ignorant of the tcx, //! etc., and instead goes through the `Cx` for most of its work. +use crate::thir::arena::Arena; use crate::thir::util::UserAnnotatedTyHelpers; use crate::thir::*; @@ -9,118 +10,48 @@ use rustc_ast as ast; use rustc_hir as hir; use rustc_hir::def_id::{DefId, LocalDefId}; use rustc_hir::Node; -use rustc_index::vec::Idx; -use rustc_infer::infer::InferCtxt; use rustc_middle::middle::region; use rustc_middle::mir::interpret::{LitToConstError, LitToConstInput}; -use rustc_middle::ty::subst::Subst; -use rustc_middle::ty::subst::{GenericArg, InternalSubsts}; use rustc_middle::ty::{self, Ty, TyCtxt}; -use rustc_span::symbol::{sym, Symbol}; -use rustc_target::abi::VariantIdx; -use rustc_trait_selection::infer::InferCtxtExt; -#[derive(Clone)] -crate struct Cx<'a, 'tcx> { +pub fn build_thir<'thir, 'tcx>( tcx: TyCtxt<'tcx>, - infcx: &'a InferCtxt<'a, 'tcx>, + owner_def: ty::WithOptConstParam, + arena: &'thir Arena<'thir, 'tcx>, + expr: &'tcx hir::Expr<'tcx>, +) -> &'thir Expr<'thir, 'tcx> { + Cx::new(tcx, owner_def, &arena).mirror_expr(expr) +} - crate root_lint_level: hir::HirId, - crate param_env: ty::ParamEnv<'tcx>, +struct Cx<'thir, 'tcx> { + tcx: TyCtxt<'tcx>, + arena: &'thir Arena<'thir, 'tcx>, - /// Identity `InternalSubsts` for use with const-evaluation. - crate identity_substs: &'tcx InternalSubsts<'tcx>, + crate param_env: ty::ParamEnv<'tcx>, crate region_scope_tree: &'tcx region::ScopeTree, - crate typeck_results: &'a ty::TypeckResults<'tcx>, - - /// This is `Constness::Const` if we are compiling a `static`, - /// `const`, or the body of a `const fn`. - constness: hir::Constness, + crate typeck_results: &'tcx ty::TypeckResults<'tcx>, /// The `DefId` of the owner of this body. body_owner: DefId, - - /// What kind of body is being compiled. - crate body_owner_kind: hir::BodyOwnerKind, - - /// Whether this constant/function needs overflow checks. - check_overflow: bool, } -impl<'a, 'tcx> Cx<'a, 'tcx> { - crate fn new( - infcx: &'a InferCtxt<'a, 'tcx>, +impl<'thir, 'tcx> Cx<'thir, 'tcx> { + fn new( + tcx: TyCtxt<'tcx>, def: ty::WithOptConstParam, - src_id: hir::HirId, - ) -> Cx<'a, 'tcx> { - let tcx = infcx.tcx; + arena: &'thir Arena<'thir, 'tcx>, + ) -> Cx<'thir, 'tcx> { let typeck_results = tcx.typeck_opt_const_arg(def); - 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, - }; - - let attrs = tcx.hir().attrs(src_id); - - // Some functions always have overflow checks enabled, - // however, they may not get codegen'd, depending on - // the settings for the crate they are codegened in. - let mut check_overflow = tcx.sess.contains_name(attrs, sym::rustc_inherit_overflow_checks); - - // Respect -C overflow-checks. - check_overflow |= tcx.sess.overflow_checks(); - - // Constants always need overflow checks. - check_overflow |= constness == hir::Constness::Const; - Cx { tcx, - infcx, - root_lint_level: src_id, + arena, param_env: tcx.param_env(def.did), - identity_substs: InternalSubsts::identity_for_item(tcx, def.did.to_def_id()), region_scope_tree: tcx.region_scope_tree(def.did), typeck_results, - constness, body_owner: def.did.to_def_id(), - body_owner_kind, - check_overflow, } } -} - -impl<'a, 'tcx> Cx<'a, 'tcx> { - /// Normalizes `ast` into the appropriate "mirror" type. - crate fn mirror>(&mut self, ast: M) -> M::Output { - ast.make_mirror(self) - } - - crate fn usize_ty(&mut self) -> Ty<'tcx> { - self.tcx.types.usize - } - - crate fn usize_literal(&mut self, value: u64) -> &'tcx ty::Const<'tcx> { - ty::Const::from_usize(self.tcx, value) - } - - crate fn bool_ty(&mut self) -> Ty<'tcx> { - self.tcx.types.bool - } - - crate fn unit_ty(&mut self) -> Ty<'tcx> { - self.tcx.mk_unit() - } - - crate fn true_literal(&mut self) -> &'tcx ty::Const<'tcx> { - ty::Const::from_bool(self.tcx, true) - } - - crate fn false_literal(&mut self) -> &'tcx ty::Const<'tcx> { - ty::Const::from_bool(self.tcx, false) - } crate fn const_eval_literal( &mut self, @@ -137,11 +68,11 @@ impl<'a, 'tcx> Cx<'a, 'tcx> { // 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)) + self.tcx.const_error(ty) } Err(LitToConstError::Reported) => { // create a dummy value and continue compiling - Const::from_bits(self.tcx, 0, self.param_env.and(ty)) + self.tcx.const_error(ty) } Err(LitToConstError::TypeError) => bug!("const_eval_literal: had type error"), } @@ -154,69 +85,17 @@ impl<'a, 'tcx> Cx<'a, 'tcx> { }; Pat::from_hir(self.tcx, self.param_env, self.typeck_results(), p) } - - 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); - - // The unhygienic comparison here is acceptable because this is only - // used on known traits. - let item = self - .tcx - .associated_items(trait_def_id) - .filter_by_name_unhygienic(method_name) - .find(|item| item.kind == ty::AssocKind::Fn) - .expect("trait method not found"); - - let method_ty = self.tcx.type_of(item.def_id); - let method_ty = method_ty.subst(self.tcx, substs); - ty::Const::zero_sized(self.tcx, method_ty) - } - - 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() - } - - crate fn needs_drop(&mut self, ty: Ty<'tcx>) -> bool { - ty.needs_drop(self.tcx, self.param_env) - } - - crate fn infcx(&self) -> &'a InferCtxt<'a, 'tcx> { - self.infcx - } - - crate fn tcx(&self) -> TyCtxt<'tcx> { - self.tcx - } - - crate fn typeck_results(&self) -> &'a ty::TypeckResults<'tcx> { - self.typeck_results - } - - crate fn check_overflow(&self) -> bool { - self.check_overflow - } - - 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<'tcx> UserAnnotatedTyHelpers<'tcx> for Cx<'_, 'tcx> { fn tcx(&self) -> TyCtxt<'tcx> { - self.tcx() + self.tcx } fn typeck_results(&self) -> &ty::TypeckResults<'tcx> { - self.typeck_results() + self.typeck_results } } mod block; mod expr; -mod to_ref; diff --git a/compiler/rustc_mir_build/src/thir/cx/to_ref.rs b/compiler/rustc_mir_build/src/thir/cx/to_ref.rs deleted file mode 100644 index 53a988ebb7..0000000000 --- a/compiler/rustc_mir_build/src/thir/cx/to_ref.rs +++ /dev/null @@ -1,65 +0,0 @@ -use crate::thir::*; - -use rustc_hir as hir; - -crate trait ToRef { - type Output; - fn to_ref(self) -> Self::Output; -} - -impl<'tcx> ToRef for &'tcx hir::Expr<'tcx> { - type Output = ExprRef<'tcx>; - - fn to_ref(self) -> ExprRef<'tcx> { - ExprRef::Thir(self) - } -} - -impl<'tcx> ToRef for &'tcx &'tcx hir::Expr<'tcx> { - type Output = ExprRef<'tcx>; - - fn to_ref(self) -> ExprRef<'tcx> { - ExprRef::Thir(&**self) - } -} - -impl<'tcx> ToRef for Expr<'tcx> { - type Output = ExprRef<'tcx>; - - fn to_ref(self) -> ExprRef<'tcx> { - ExprRef::Mirror(Box::new(self)) - } -} - -impl<'tcx, T, U> ToRef for &'tcx Option -where - &'tcx T: ToRef, -{ - type Output = Option; - - fn to_ref(self) -> Option { - self.as_ref().map(|expr| expr.to_ref()) - } -} - -impl<'tcx, T, U> ToRef for &'tcx Vec -where - &'tcx T: ToRef, -{ - type Output = Vec; - - fn to_ref(self) -> Vec { - self.iter().map(|expr| expr.to_ref()).collect() - } -} - -impl<'tcx, T, U> ToRef for &'tcx [T] -where - &'tcx T: ToRef, -{ - type Output = Vec; - - fn to_ref(self) -> Vec { - self.iter().map(|expr| expr.to_ref()).collect() - } -} diff --git a/compiler/rustc_mir_build/src/thir/mod.rs b/compiler/rustc_mir_build/src/thir/mod.rs index ed3d392782..6f20195db0 100644 --- a/compiler/rustc_mir_build/src/thir/mod.rs +++ b/compiler/rustc_mir_build/src/thir/mod.rs @@ -4,13 +4,12 @@ //! unit-tested and separated from the Rust source and compiler data //! structures. -use self::cx::Cx; use rustc_ast::{InlineAsmOptions, InlineAsmTemplatePiece}; use rustc_hir as hir; use rustc_hir::def_id::DefId; use rustc_middle::infer::canonical::Canonical; use rustc_middle::middle::region; -use rustc_middle::mir::{BinOp, BorrowKind, Field, UnOp}; +use rustc_middle::mir::{BinOp, BorrowKind, FakeReadCause, Field, UnOp}; use rustc_middle::ty::adjustment::PointerCast; use rustc_middle::ty::subst::SubstsRef; use rustc_middle::ty::{AdtDef, Const, Ty, UpvarSubsts, UserType}; @@ -19,58 +18,57 @@ use rustc_target::abi::VariantIdx; use rustc_target::asm::InlineAsmRegOrRegClass; crate mod constant; + crate mod cx; +pub use cx::build_thir; crate mod pattern; -crate use self::pattern::PatTyProj; -crate use self::pattern::{BindingMode, FieldPat, Pat, PatKind, PatRange}; +pub use self::pattern::{Ascription, BindingMode, FieldPat, Pat, PatKind, PatRange, PatTyProj}; + +mod arena; +pub use arena::Arena; mod util; #[derive(Copy, Clone, Debug)] -crate enum LintLevel { +pub enum LintLevel { Inherited, Explicit(hir::HirId), } -#[derive(Clone, Debug)] -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(Debug)] +pub struct Block<'thir, 'tcx> { + pub targeted_by_break: bool, + pub region_scope: region::Scope, + pub opt_destruction_scope: Option, + pub span: Span, + pub stmts: &'thir [Stmt<'thir, 'tcx>], + pub expr: Option<&'thir Expr<'thir, 'tcx>>, + pub safety_mode: BlockSafety, } #[derive(Copy, Clone, Debug)] -crate enum BlockSafety { +pub enum BlockSafety { Safe, ExplicitUnsafe(hir::HirId), PushUnsafe, PopUnsafe, } -#[derive(Clone, Debug)] -crate enum StmtRef<'tcx> { - Mirror(Box>), -} - -#[derive(Clone, Debug)] -crate struct Stmt<'tcx> { - crate kind: StmtKind<'tcx>, - crate opt_destruction_scope: Option, +#[derive(Debug)] +pub struct Stmt<'thir, 'tcx> { + pub kind: StmtKind<'thir, 'tcx>, + pub opt_destruction_scope: Option, } -#[derive(Clone, Debug)] -crate enum StmtKind<'tcx> { +#[derive(Debug)] +pub enum StmtKind<'thir, 'tcx> { Expr { /// scope for this statement; may be used as lifetime of temporaries scope: region::Scope, /// expression being evaluated in this statement - expr: ExprRef<'tcx>, + expr: &'thir Expr<'thir, 'tcx>, }, Let { @@ -88,7 +86,7 @@ crate enum StmtKind<'tcx> { pattern: Pat<'tcx>, /// let pat: ty = ... - initializer: Option>, + initializer: Option<&'thir Expr<'thir, 'tcx>>, /// the lint level for this let-statement lint_level: LintLevel, @@ -96,13 +94,13 @@ crate enum StmtKind<'tcx> { } // `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<'_>, 168); +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] +rustc_data_structures::static_assert_size!(Expr<'_, '_>, 144); /// The Thir trait implementor lowers their expressions (`&'tcx H::Expr`) /// into instances of this `Expr` enum. This lowering can be done /// basically as lazily or as eagerly as desired: every recursive -/// reference to an expression in this enum is an `ExprRef<'tcx>`, which +/// reference to an expression in this enum is an `&'thir Expr<'thir, 'tcx>`, which /// may in turn be another instance of this enum (boxed), or else an /// unlowered `&'tcx H::Expr`. Note that instances of `Expr` are very /// short-lived. They are created by `Thir::to_expr`, analyzed and @@ -113,105 +111,105 @@ rustc_data_structures::static_assert_size!(Expr<'_>, 168); /// MIR simplifications are already done in the impl of `Thir`. For /// example, method calls and overloaded operators are absent: they are /// expected to be converted into `Expr::Call` instances. -#[derive(Clone, Debug)] -crate struct Expr<'tcx> { +#[derive(Debug)] +pub struct Expr<'thir, 'tcx> { /// type of this expression - crate ty: Ty<'tcx>, + pub ty: Ty<'tcx>, /// lifetime of this expression if it should be spilled into a /// temporary; should be None only if in a constant context - crate temp_lifetime: Option, + pub temp_lifetime: Option, /// span of the expression in the source - crate span: Span, + pub span: Span, /// kind of expression - crate kind: ExprKind<'tcx>, + pub kind: ExprKind<'thir, 'tcx>, } -#[derive(Clone, Debug)] -crate enum ExprKind<'tcx> { +#[derive(Debug)] +pub enum ExprKind<'thir, 'tcx> { Scope { region_scope: region::Scope, lint_level: LintLevel, - value: ExprRef<'tcx>, + value: &'thir Expr<'thir, 'tcx>, }, Box { - value: ExprRef<'tcx>, + value: &'thir Expr<'thir, 'tcx>, }, If { - cond: ExprRef<'tcx>, - then: ExprRef<'tcx>, - else_opt: Option>, + cond: &'thir Expr<'thir, 'tcx>, + then: &'thir Expr<'thir, 'tcx>, + else_opt: Option<&'thir Expr<'thir, 'tcx>>, }, Call { ty: Ty<'tcx>, - fun: ExprRef<'tcx>, - args: Vec>, - // Whether this is from a call in HIR, rather than from an overloaded - // operator. True for overloaded function call. + fun: &'thir Expr<'thir, 'tcx>, + args: &'thir [Expr<'thir, 'tcx>], + /// Whether this is from a call in HIR, rather than from an overloaded + /// operator. `true` for overloaded function call. from_hir_call: bool, /// This `Span` is the span of the function, without the dot and receiver /// (e.g. `foo(a, b)` in `x.foo(a, b)` fn_span: Span, }, Deref { - arg: ExprRef<'tcx>, + arg: &'thir Expr<'thir, 'tcx>, }, // NOT overloaded! Binary { op: BinOp, - lhs: ExprRef<'tcx>, - rhs: ExprRef<'tcx>, + lhs: &'thir Expr<'thir, 'tcx>, + rhs: &'thir Expr<'thir, 'tcx>, }, // NOT overloaded! LogicalOp { op: LogicalOp, - lhs: ExprRef<'tcx>, - rhs: ExprRef<'tcx>, + lhs: &'thir Expr<'thir, 'tcx>, + rhs: &'thir Expr<'thir, 'tcx>, }, // NOT overloaded! // LogicalOp is distinct from BinaryOp because of lazy evaluation of the operands. Unary { op: UnOp, - arg: ExprRef<'tcx>, + arg: &'thir Expr<'thir, 'tcx>, }, // NOT overloaded! Cast { - source: ExprRef<'tcx>, + source: &'thir Expr<'thir, 'tcx>, }, Use { - source: ExprRef<'tcx>, + source: &'thir Expr<'thir, 'tcx>, }, // Use a lexpr to get a vexpr. NeverToAny { - source: ExprRef<'tcx>, + source: &'thir Expr<'thir, 'tcx>, }, Pointer { cast: PointerCast, - source: ExprRef<'tcx>, + source: &'thir Expr<'thir, 'tcx>, }, Loop { - body: ExprRef<'tcx>, + body: &'thir Expr<'thir, 'tcx>, }, Match { - scrutinee: ExprRef<'tcx>, - arms: Vec>, + scrutinee: &'thir Expr<'thir, 'tcx>, + arms: &'thir [Arm<'thir, 'tcx>], }, Block { - body: &'tcx hir::Block<'tcx>, + body: Block<'thir, 'tcx>, }, Assign { - lhs: ExprRef<'tcx>, - rhs: ExprRef<'tcx>, + lhs: &'thir Expr<'thir, 'tcx>, + rhs: &'thir Expr<'thir, 'tcx>, }, AssignOp { op: BinOp, - lhs: ExprRef<'tcx>, - rhs: ExprRef<'tcx>, + lhs: &'thir Expr<'thir, 'tcx>, + rhs: &'thir Expr<'thir, 'tcx>, }, Field { - lhs: ExprRef<'tcx>, + lhs: &'thir Expr<'thir, 'tcx>, name: Field, }, Index { - lhs: ExprRef<'tcx>, - index: ExprRef<'tcx>, + lhs: &'thir Expr<'thir, 'tcx>, + index: &'thir Expr<'thir, 'tcx>, }, VarRef { id: hir::HirId, @@ -226,35 +224,35 @@ crate enum ExprKind<'tcx> { }, Borrow { borrow_kind: BorrowKind, - arg: ExprRef<'tcx>, + arg: &'thir Expr<'thir, 'tcx>, }, /// A `&raw [const|mut] $place_expr` raw borrow resulting in type `*[const|mut] T`. AddressOf { mutability: hir::Mutability, - arg: ExprRef<'tcx>, + arg: &'thir Expr<'thir, 'tcx>, }, Break { label: region::Scope, - value: Option>, + value: Option<&'thir Expr<'thir, 'tcx>>, }, Continue { label: region::Scope, }, Return { - value: Option>, + value: Option<&'thir Expr<'thir, 'tcx>>, }, ConstBlock { value: &'tcx Const<'tcx>, }, Repeat { - value: ExprRef<'tcx>, + value: &'thir Expr<'thir, 'tcx>, count: &'tcx Const<'tcx>, }, Array { - fields: Vec>, + fields: &'thir [Expr<'thir, 'tcx>], }, Tuple { - fields: Vec>, + fields: &'thir [Expr<'thir, 'tcx>], }, Adt { adt_def: &'tcx AdtDef, @@ -265,24 +263,25 @@ crate enum ExprKind<'tcx> { /// Bar:: { ... }`. user_ty: Option>>, - fields: Vec>, - base: Option>, + fields: &'thir [FieldExpr<'thir, 'tcx>], + base: Option>, }, PlaceTypeAscription { - source: ExprRef<'tcx>, + source: &'thir Expr<'thir, 'tcx>, /// Type that the user gave to this expression user_ty: Option>>, }, ValueTypeAscription { - source: ExprRef<'tcx>, + source: &'thir Expr<'thir, 'tcx>, /// Type that the user gave to this expression user_ty: Option>>, }, Closure { closure_id: DefId, substs: UpvarSubsts<'tcx>, - upvars: Vec>, + upvars: &'thir [Expr<'thir, 'tcx>], movability: Option, + fake_reads: Vec<(&'thir Expr<'thir, 'tcx>, FakeReadCause, hir::HirId)>, }, Literal { literal: &'tcx Const<'tcx>, @@ -302,7 +301,7 @@ crate enum ExprKind<'tcx> { }, InlineAsm { template: &'tcx [InlineAsmTemplatePiece], - operands: Vec>, + operands: &'thir [InlineAsmOperand<'thir, 'tcx>], options: InlineAsmOptions, line_spans: &'tcx [Span], }, @@ -310,158 +309,77 @@ crate enum ExprKind<'tcx> { ThreadLocalRef(DefId), LlvmInlineAsm { asm: &'tcx hir::LlvmInlineAsmInner, - outputs: Vec>, - inputs: Vec>, + outputs: &'thir [Expr<'thir, 'tcx>], + inputs: &'thir [Expr<'thir, 'tcx>], }, Yield { - value: ExprRef<'tcx>, + value: &'thir Expr<'thir, 'tcx>, }, } -#[derive(Clone, Debug)] -crate enum ExprRef<'tcx> { - Thir(&'tcx hir::Expr<'tcx>), - Mirror(Box>), +#[derive(Debug)] +pub struct FieldExpr<'thir, 'tcx> { + pub name: Field, + pub expr: &'thir Expr<'thir, 'tcx>, } -#[derive(Clone, Debug)] -crate struct FieldExprRef<'tcx> { - crate name: Field, - crate expr: ExprRef<'tcx>, +#[derive(Debug)] +pub struct FruInfo<'thir, 'tcx> { + pub base: &'thir Expr<'thir, 'tcx>, + pub field_types: &'thir [Ty<'tcx>], } -#[derive(Clone, Debug)] -crate struct FruInfo<'tcx> { - crate base: ExprRef<'tcx>, - crate field_types: Vec>, +#[derive(Debug)] +pub struct Arm<'thir, 'tcx> { + pub pattern: Pat<'tcx>, + pub guard: Option>, + pub body: &'thir Expr<'thir, 'tcx>, + pub lint_level: LintLevel, + pub scope: region::Scope, + pub span: Span, } -#[derive(Clone, Debug)] -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, -} - -#[derive(Clone, Debug)] -crate enum Guard<'tcx> { - If(ExprRef<'tcx>), - IfLet(Pat<'tcx>, ExprRef<'tcx>), +#[derive(Debug)] +pub enum Guard<'thir, 'tcx> { + If(&'thir Expr<'thir, 'tcx>), + IfLet(Pat<'tcx>, &'thir Expr<'thir, 'tcx>), } #[derive(Copy, Clone, Debug)] -crate enum LogicalOp { +pub enum LogicalOp { And, Or, } -impl<'tcx> ExprRef<'tcx> { - crate fn span(&self) -> Span { - match self { - ExprRef::Thir(expr) => expr.span, - ExprRef::Mirror(expr) => expr.span, - } - } -} - -#[derive(Clone, Debug)] -crate enum InlineAsmOperand<'tcx> { +#[derive(Debug)] +pub enum InlineAsmOperand<'thir, 'tcx> { In { reg: InlineAsmRegOrRegClass, - expr: ExprRef<'tcx>, + expr: &'thir Expr<'thir, 'tcx>, }, Out { reg: InlineAsmRegOrRegClass, late: bool, - expr: Option>, + expr: Option<&'thir Expr<'thir, 'tcx>>, }, InOut { reg: InlineAsmRegOrRegClass, late: bool, - expr: ExprRef<'tcx>, + expr: &'thir Expr<'thir, 'tcx>, }, SplitInOut { reg: InlineAsmRegOrRegClass, late: bool, - in_expr: ExprRef<'tcx>, - out_expr: Option>, + in_expr: &'thir Expr<'thir, 'tcx>, + out_expr: Option<&'thir Expr<'thir, 'tcx>>, }, Const { - expr: ExprRef<'tcx>, + expr: &'thir Expr<'thir, 'tcx>, }, SymFn { - expr: ExprRef<'tcx>, + expr: &'thir Expr<'thir, 'tcx>, }, SymStatic { def_id: DefId, }, } - -/////////////////////////////////////////////////////////////////////////// -// The Mirror trait - -/// "Mirroring" is the process of converting from a HIR type into one -/// of the THIR types defined in this file. This is basically a "on -/// the fly" desugaring step that hides a lot of the messiness in the -/// tcx. For example, the mirror of a `&'tcx hir::Expr` is an -/// `Expr<'tcx>`. -/// -/// Mirroring is gradual: when you mirror an outer expression like `e1 -/// + e2`, the references to the inner expressions `e1` and `e2` are -/// `ExprRef<'tcx>` instances, and they may or may not be eagerly -/// mirrored. This allows a single AST node from the compiler to -/// expand into one or more Thir nodes, which lets the Thir nodes be -/// simpler. -crate trait Mirror<'tcx> { - type Output; - - fn make_mirror(self, cx: &mut Cx<'_, 'tcx>) -> Self::Output; -} - -impl<'tcx> Mirror<'tcx> for Expr<'tcx> { - type Output = Expr<'tcx>; - - fn make_mirror(self, _: &mut Cx<'_, 'tcx>) -> Expr<'tcx> { - self - } -} - -impl<'tcx> Mirror<'tcx> for ExprRef<'tcx> { - type Output = Expr<'tcx>; - - fn make_mirror(self, hir: &mut Cx<'_, 'tcx>) -> Expr<'tcx> { - match self { - ExprRef::Thir(h) => h.make_mirror(hir), - ExprRef::Mirror(m) => *m, - } - } -} - -impl<'tcx> Mirror<'tcx> for Stmt<'tcx> { - type Output = Stmt<'tcx>; - - fn make_mirror(self, _: &mut Cx<'_, 'tcx>) -> Stmt<'tcx> { - self - } -} - -impl<'tcx> Mirror<'tcx> for StmtRef<'tcx> { - type Output = Stmt<'tcx>; - - fn make_mirror(self, _: &mut Cx<'_, 'tcx>) -> Stmt<'tcx> { - match self { - StmtRef::Mirror(m) => *m, - } - } -} - -impl<'tcx> Mirror<'tcx> for Block<'tcx> { - type Output = Block<'tcx>; - - fn make_mirror(self, _: &mut Cx<'_, 'tcx>) -> Block<'tcx> { - self - } -} diff --git a/compiler/rustc_mir_build/src/thir/pattern/check_match.rs b/compiler/rustc_mir_build/src/thir/pattern/check_match.rs index 397706851c..fdecbb9478 100644 --- a/compiler/rustc_mir_build/src/thir/pattern/check_match.rs +++ b/compiler/rustc_mir_build/src/thir/pattern/check_match.rs @@ -1,6 +1,6 @@ -use super::usefulness::Usefulness::*; use super::usefulness::{ - compute_match_usefulness, expand_pattern, MatchArm, MatchCheckCtxt, UsefulnessReport, + compute_match_usefulness, expand_pattern, MatchArm, MatchCheckCtxt, Reachability, + UsefulnessReport, }; use super::{PatCtxt, PatKind, PatternError}; @@ -366,14 +366,31 @@ fn unreachable_pattern(tcx: TyCtxt<'_>, span: Span, id: HirId, catchall: Option< } fn irrefutable_let_pattern(tcx: TyCtxt<'_>, span: Span, id: HirId, source: hir::MatchSource) { - tcx.struct_span_lint_hir(IRREFUTABLE_LET_PATTERNS, id, span, |lint| { - let msg = match source { - hir::MatchSource::IfLetDesugar { .. } => "irrefutable if-let pattern", - hir::MatchSource::WhileLetDesugar => "irrefutable while-let pattern", - hir::MatchSource::IfLetGuardDesugar => "irrefutable if-let guard", - _ => bug!(), - }; - lint.build(msg).emit() + tcx.struct_span_lint_hir(IRREFUTABLE_LET_PATTERNS, id, span, |lint| match source { + hir::MatchSource::IfLetDesugar { .. } => { + let mut diag = lint.build("irrefutable `if let` pattern"); + diag.note("this pattern will always match, so the `if let` is useless"); + diag.help("consider replacing the `if let` with a `let`"); + diag.emit() + } + hir::MatchSource::WhileLetDesugar => { + let mut diag = lint.build("irrefutable `while let` pattern"); + diag.note("this pattern will always match, so the loop will never exit"); + diag.help("consider instead using a `loop { ... }` with a `let` inside it"); + diag.emit() + } + hir::MatchSource::IfLetGuardDesugar => { + let mut diag = lint.build("irrefutable `if let` guard pattern"); + diag.note("this pattern will always match, so the guard is useless"); + diag.help("consider removing the guard and adding a `let` inside the match arm"); + diag.emit() + } + _ => { + bug!( + "expected `if let`, `while let`, or `if let` guard HIR match source, found {:?}", + source, + ) + } }); } @@ -387,7 +404,7 @@ fn check_if_let_guard<'p, 'tcx>( report_arm_reachability(&cx, &report, hir::MatchSource::IfLetGuardDesugar); if report.non_exhaustiveness_witnesses.is_empty() { - // The match is exhaustive, i.e. the if let pattern is irrefutable. + // The match is exhaustive, i.e. the `if let` pattern is irrefutable. irrefutable_let_pattern(cx.tcx, pat.span, pat_id, hir::MatchSource::IfLetGuardDesugar) } } @@ -398,10 +415,11 @@ fn report_arm_reachability<'p, 'tcx>( report: &UsefulnessReport<'p, 'tcx>, source: hir::MatchSource, ) { + use Reachability::*; let mut catchall = None; for (arm_index, (arm, is_useful)) in report.arm_usefulness.iter().enumerate() { match is_useful { - NotUseful => { + Unreachable => { match source { hir::MatchSource::WhileDesugar => bug!(), @@ -430,17 +448,16 @@ fn report_arm_reachability<'p, 'tcx>( hir::MatchSource::AwaitDesugar | hir::MatchSource::TryDesugar => {} } } - Useful(unreachables) if unreachables.is_empty() => {} + Reachable(unreachables) if unreachables.is_empty() => {} // The arm is reachable, but contains unreachable subpatterns (from or-patterns). - Useful(unreachables) => { - let mut unreachables: Vec<_> = unreachables.iter().collect(); + Reachable(unreachables) => { + let mut unreachables = unreachables.clone(); // Emit lints in the order in which they occur in the file. unreachables.sort_unstable(); for span in unreachables { unreachable_pattern(cx.tcx, span, arm.hir_id, None); } } - UsefulWithWitness(_) => bug!(), } if !arm.has_guard && catchall.is_none() && pat_is_catchall(arm.pat) { catchall = Some(arm.pat.span); diff --git a/compiler/rustc_mir_build/src/thir/pattern/const_to_pat.rs b/compiler/rustc_mir_build/src/thir/pattern/const_to_pat.rs index 32fc0f008e..ef1419b5b7 100644 --- a/compiler/rustc_mir_build/src/thir/pattern/const_to_pat.rs +++ b/compiler/rustc_mir_build/src/thir/pattern/const_to_pat.rs @@ -18,7 +18,7 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { /// Converts an evaluated constant to a pattern (if possible). /// This means aggregate values (like structs and enums) are converted /// to a pattern that matches the value (as if you'd compared via structural equality). - #[instrument(skip(self))] + #[instrument(level = "debug", skip(self))] pub(super) fn const_to_pat( &self, cv: &'tcx ty::Const<'tcx>, diff --git a/compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs b/compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs index e67166c99c..8c740a7ec1 100644 --- a/compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs +++ b/compiler/rustc_mir_build/src/thir/pattern/deconstruct_pat.rs @@ -723,8 +723,6 @@ impl<'tcx> Constructor<'tcx> { where 'tcx: 'a, { - debug!("Constructor::split({:#?})", self); - match self { Wildcard => { let mut split_wildcard = SplitWildcard::new(pcx); @@ -1345,7 +1343,9 @@ impl<'p, 'tcx> Fields<'p, 'tcx> { match &mut fields { Fields::Vec(pats) => { for (i, pat) in new_pats { - pats[i] = pat + if let Some(p) = pats.get_mut(i) { + *p = pat; + } } } Fields::Filtered { fields, .. } => { diff --git a/compiler/rustc_mir_build/src/thir/pattern/mod.rs b/compiler/rustc_mir_build/src/thir/pattern/mod.rs index 7186e26be8..9ac79a37ac 100644 --- a/compiler/rustc_mir_build/src/thir/pattern/mod.rs +++ b/compiler/rustc_mir_build/src/thir/pattern/mod.rs @@ -40,22 +40,22 @@ crate enum PatternError { } #[derive(Copy, Clone, Debug, PartialEq)] -crate enum BindingMode { +pub enum BindingMode { ByValue, ByRef(BorrowKind), } #[derive(Clone, Debug, PartialEq)] -crate struct FieldPat<'tcx> { - crate field: Field, - crate pattern: Pat<'tcx>, +pub struct FieldPat<'tcx> { + pub field: Field, + pub pattern: Pat<'tcx>, } #[derive(Clone, Debug, PartialEq)] -crate struct Pat<'tcx> { - crate ty: Ty<'tcx>, - crate span: Span, - crate kind: Box>, +pub struct Pat<'tcx> { + pub ty: Ty<'tcx>, + pub span: Span, + pub kind: Box>, } impl<'tcx> Pat<'tcx> { @@ -65,8 +65,8 @@ impl<'tcx> Pat<'tcx> { } #[derive(Copy, Clone, Debug, PartialEq)] -crate struct PatTyProj<'tcx> { - crate user_ty: CanonicalUserType<'tcx>, +pub struct PatTyProj<'tcx> { + pub user_ty: CanonicalUserType<'tcx>, } impl<'tcx> PatTyProj<'tcx> { @@ -92,8 +92,8 @@ impl<'tcx> PatTyProj<'tcx> { } #[derive(Copy, Clone, Debug, PartialEq)] -crate struct Ascription<'tcx> { - crate user_ty: PatTyProj<'tcx>, +pub struct Ascription<'tcx> { + pub 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. @@ -112,12 +112,12 @@ crate 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. - crate variance: ty::Variance, - crate user_ty_span: Span, + pub variance: ty::Variance, + pub user_ty_span: Span, } #[derive(Clone, Debug, PartialEq)] -crate enum PatKind<'tcx> { +pub enum PatKind<'tcx> { Wild, AscribeUserType { @@ -195,10 +195,10 @@ crate enum PatKind<'tcx> { } #[derive(Copy, Clone, Debug, PartialEq)] -crate struct PatRange<'tcx> { - crate lo: &'tcx ty::Const<'tcx>, - crate hi: &'tcx ty::Const<'tcx>, - crate end: RangeEnd, +pub struct PatRange<'tcx> { + pub lo: &'tcx ty::Const<'tcx>, + pub hi: &'tcx ty::Const<'tcx>, + pub end: RangeEnd, } impl<'tcx> fmt::Display for Pat<'tcx> { @@ -866,7 +866,7 @@ impl<'a, 'tcx> PatCtxt<'a, 'tcx> { return *self.const_to_pat(value, expr.hir_id, expr.span, false).kind; } hir::ExprKind::Lit(ref lit) => (lit, false), - hir::ExprKind::Unary(hir::UnOp::UnNeg, ref expr) => { + hir::ExprKind::Unary(hir::UnOp::Neg, ref expr) => { let lit = match expr.kind { hir::ExprKind::Lit(ref lit) => lit, _ => span_bug!(expr.span, "not a literal: {:?}", expr), diff --git a/compiler/rustc_mir_build/src/thir/pattern/usefulness.rs b/compiler/rustc_mir_build/src/thir/pattern/usefulness.rs index d7c08a2d1a..dce0df8473 100644 --- a/compiler/rustc_mir_build/src/thir/pattern/usefulness.rs +++ b/compiler/rustc_mir_build/src/thir/pattern/usefulness.rs @@ -288,7 +288,7 @@ use super::{Pat, PatKind}; use super::{PatternFoldable, PatternFolder}; use rustc_data_structures::captures::Captures; -use rustc_data_structures::sync::OnceCell; +use rustc_data_structures::fx::FxHashMap; use rustc_arena::TypedArena; use rustc_hir::def_id::DefId; @@ -299,6 +299,7 @@ use rustc_span::Span; use smallvec::{smallvec, SmallVec}; use std::fmt; use std::iter::{FromIterator, IntoIterator}; +use std::lazy::OnceCell; crate struct MatchCheckCtxt<'a, 'tcx> { crate tcx: TyCtxt<'tcx>, @@ -344,6 +345,12 @@ pub(super) struct PatCtxt<'a, 'p, 'tcx> { pub(super) is_top_level: bool, } +impl<'a, 'p, 'tcx> fmt::Debug for PatCtxt<'a, 'p, 'tcx> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("PatCtxt").field("ty", &self.ty).finish() + } +} + crate fn expand_pattern<'tcx>(pat: Pat<'tcx>) -> Pat<'tcx> { LiteralExpander.fold_pattern(&pat) } @@ -379,11 +386,32 @@ impl<'tcx> Pat<'tcx> { pub(super) fn is_wildcard(&self) -> bool { matches!(*self.kind, PatKind::Binding { subpattern: None, .. } | PatKind::Wild) } + + fn is_or_pat(&self) -> bool { + matches!(*self.kind, PatKind::Or { .. }) + } + + /// Recursively expand this pattern into its subpatterns. Only useful for or-patterns. + fn expand_or_pat(&self) -> Vec<&Self> { + fn expand<'p, 'tcx>(pat: &'p Pat<'tcx>, vec: &mut Vec<&'p Pat<'tcx>>) { + if let PatKind::Or { pats } = pat.kind.as_ref() { + for pat in pats { + expand(pat, vec); + } + } else { + vec.push(pat) + } + } + + let mut pats = Vec::new(); + expand(self, &mut pats); + pats + } } /// A row of a matrix. Rows of len 1 are very common, which is why `SmallVec[_; 2]` /// works well. -#[derive(Debug, Clone)] +#[derive(Clone)] struct PatStack<'p, 'tcx> { pats: SmallVec<[&'p Pat<'tcx>; 2]>, /// Cache for the constructor of the head @@ -411,6 +439,7 @@ impl<'p, 'tcx> PatStack<'p, 'tcx> { self.pats[0] } + #[inline] fn head_ctor<'a>(&'a self, cx: &MatchCheckCtxt<'p, 'tcx>) -> &'a Constructor<'tcx> { self.head_ctor.get_or_init(|| Constructor::from_pat(cx, self.head())) } @@ -419,23 +448,14 @@ impl<'p, 'tcx> PatStack<'p, 'tcx> { self.pats.iter().copied() } - // If the first pattern is an or-pattern, expand this pattern. Otherwise, return `None`. - fn expand_or_pat(&self) -> Option> { - if self.is_empty() { - None - } else if let PatKind::Or { pats } = &*self.head().kind { - Some( - pats.iter() - .map(|pat| { - let mut new_patstack = PatStack::from_pattern(pat); - new_patstack.pats.extend_from_slice(&self.pats[1..]); - new_patstack - }) - .collect(), - ) - } else { - None - } + // Recursively expand the first pattern into its subpatterns. Only useful if the pattern is an + // or-pattern. Panics if `self` is empty. + fn expand_or_pat<'a>(&'a self) -> impl Iterator> + Captures<'a> { + self.head().expand_or_pat().into_iter().map(move |pat| { + let mut new_patstack = PatStack::from_pattern(pat); + new_patstack.pats.extend_from_slice(&self.pats[1..]); + new_patstack + }) } /// This computes `S(self.head_ctor(), self)`. See top of the file for explanations. @@ -475,6 +495,17 @@ impl<'p, 'tcx> FromIterator<&'p Pat<'tcx>> for PatStack<'p, 'tcx> { } } +/// Pretty-printing for matrix row. +impl<'p, 'tcx> fmt::Debug for PatStack<'p, 'tcx> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!(f, "+")?; + for pat in self.iter() { + write!(f, " {} +", pat)?; + } + Ok(()) + } +} + /// A 2D matrix. #[derive(Clone, PartialEq)] pub(super) struct Matrix<'p, 'tcx> { @@ -491,13 +522,12 @@ impl<'p, 'tcx> Matrix<'p, 'tcx> { self.patterns.get(0).map(|r| r.len()) } - /// Pushes a new row to the matrix. If the row starts with an or-pattern, this expands it. + /// Pushes a new row to the matrix. If the row starts with an or-pattern, this recursively + /// expands it. fn push(&mut self, row: PatStack<'p, 'tcx>) { - if let Some(rows) = row.expand_or_pat() { - for row in rows { - // We recursively expand the or-patterns of the new rows. - // This is necessary as we might have `0 | (1 | 2)` or e.g., `x @ 0 | x @ (1 | 2)`. - self.push(row) + if !row.is_empty() && row.head().is_or_pat() { + for row in row.expand_or_pat() { + self.patterns.push(row); } } else { self.patterns.push(row); @@ -543,17 +573,11 @@ impl<'p, 'tcx> Matrix<'p, 'tcx> { /// Pretty-printer for matrices of patterns, example: /// /// ```text -/// +++++++++++++++++++++++++++++ /// + _ + [] + -/// +++++++++++++++++++++++++++++ /// + true + [First] + -/// +++++++++++++++++++++++++++++ /// + true + [Second(true)] + -/// +++++++++++++++++++++++++++++ /// + false + [_] + -/// +++++++++++++++++++++++++++++ /// + _ + [_, _, tail @ ..] + -/// +++++++++++++++++++++++++++++ /// ``` impl<'p, 'tcx> fmt::Debug for Matrix<'p, 'tcx> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { @@ -561,17 +585,14 @@ impl<'p, 'tcx> fmt::Debug for Matrix<'p, 'tcx> { let Matrix { patterns: m, .. } = self; let pretty_printed_matrix: Vec> = - m.iter().map(|row| row.iter().map(|pat| format!("{:?}", pat)).collect()).collect(); + m.iter().map(|row| row.iter().map(|pat| format!("{}", pat)).collect()).collect(); - let column_count = m.iter().map(|row| row.len()).max().unwrap_or(0); + let column_count = m.iter().map(|row| row.len()).next().unwrap_or(0); assert!(m.iter().all(|row| row.len() == column_count)); let column_widths: Vec = (0..column_count) .map(|col| pretty_printed_matrix.iter().map(|row| row[col].len()).max().unwrap_or(0)) .collect(); - let total_width = column_widths.iter().cloned().sum::() + column_count * 3 + 1; - let br = "+".repeat(total_width); - write!(f, "{}\n", br)?; for row in pretty_printed_matrix { write!(f, "+")?; for (column, pat_str) in row.into_iter().enumerate() { @@ -580,7 +601,6 @@ impl<'p, 'tcx> fmt::Debug for Matrix<'p, 'tcx> { write!(f, " +")?; } write!(f, "\n")?; - write!(f, "{}\n", br)?; } Ok(()) } @@ -600,183 +620,318 @@ impl<'p, 'tcx> FromIterator> for Matrix<'p, 'tcx> { } } -/// Represents a set of `Span`s closed under the containment relation. That is, if a `Span` is -/// contained in the set then all `Span`s contained in it are also implicitly contained in the set. -/// In particular this means that when intersecting two sets, taking the intersection of some span -/// and one of its subspans returns the subspan, whereas a simple `HashSet` would have returned an -/// empty intersection. -/// It is assumed that two spans don't overlap without one being contained in the other; in other -/// words, that the inclusion structure forms a tree and not a DAG. -/// Intersection is not very efficient. It compares everything pairwise. If needed it could be made -/// faster by sorting the `Span`s and merging cleverly. -#[derive(Debug, Clone, Default)] -pub(crate) struct SpanSet { - /// The minimal set of `Span`s required to represent the whole set. If A and B are `Span`s in - /// the `SpanSet`, and A is a descendant of B, then only B will be in `root_spans`. - /// Invariant: the spans are disjoint. - root_spans: Vec, +/// Given a pattern or a pattern-stack, this struct captures a set of its subpatterns. We use that +/// to track reachable sub-patterns arising from or-patterns. In the absence of or-patterns this +/// will always be either `Empty` (the whole pattern is unreachable) or `Full` (the whole pattern +/// is reachable). When there are or-patterns, some subpatterns may be reachable while others +/// aren't. In this case the whole pattern still counts as reachable, but we will lint the +/// unreachable subpatterns. +/// +/// This supports a limited set of operations, so not all possible sets of subpatterns can be +/// represented. That's ok, we only want the ones that make sense for our usage. +/// +/// What we're doing is illustrated by this: +/// ``` +/// match (true, 0) { +/// (true, 0) => {} +/// (_, 1) => {} +/// (true | false, 0 | 1) => {} +/// } +/// ``` +/// When we try the alternatives of the `true | false` or-pattern, the last `0` is reachable in the +/// `false` alternative but not the `true`. So overall it is reachable. By contrast, the last `1` +/// is not reachable in either alternative, so we want to signal this to the user. +/// Therefore we take the union of sets of reachable patterns coming from different alternatives in +/// order to figure out which subpatterns are overall reachable. +/// +/// Invariant: we try to construct the smallest representation we can. In particular if +/// `self.is_empty()` we ensure that `self` is `Empty`, and same with `Full`. This is not important +/// for correctness currently. +#[derive(Debug, Clone)] +enum SubPatSet<'p, 'tcx> { + /// The empty set. This means the pattern is unreachable. + Empty, + /// The set containing the full pattern. + Full, + /// If the pattern is a pattern with a constructor or a pattern-stack, we store a set for each + /// of its subpatterns. Missing entries in the map are implicitly full, because that's the + /// common case. + Seq { subpats: FxHashMap> }, + /// If the pattern is an or-pattern, we store a set for each of its alternatives. Missing + /// entries in the map are implicitly empty. Note: we always flatten nested or-patterns. + Alt { + subpats: FxHashMap>, + /// Counts the total number of alternatives in the pattern + alt_count: usize, + /// We keep the pattern around to retrieve spans. + pat: &'p Pat<'tcx>, + }, } -impl SpanSet { - /// Creates an empty set. - fn new() -> Self { - Self::default() - } - - /// Tests whether the set is empty. - pub(crate) fn is_empty(&self) -> bool { - self.root_spans.is_empty() +impl<'p, 'tcx> SubPatSet<'p, 'tcx> { + fn full() -> Self { + SubPatSet::Full } - - /// Iterate over the disjoint list of spans at the roots of this set. - pub(crate) fn iter<'a>(&'a self) -> impl Iterator + Captures<'a> { - self.root_spans.iter().copied() + fn empty() -> Self { + SubPatSet::Empty } - /// Tests whether the set contains a given Span. - fn contains(&self, span: Span) -> bool { - self.iter().any(|root_span| root_span.contains(span)) + fn is_empty(&self) -> bool { + match self { + SubPatSet::Empty => true, + SubPatSet::Full => false, + // If any subpattern in a sequence is unreachable, the whole pattern is unreachable. + SubPatSet::Seq { subpats } => subpats.values().any(|set| set.is_empty()), + // An or-pattern is reachable if any of its alternatives is. + SubPatSet::Alt { subpats, .. } => subpats.values().all(|set| set.is_empty()), + } } - /// Add a span to the set if we know the span has no intersection in this set. - fn push_nonintersecting(&mut self, new_span: Span) { - self.root_spans.push(new_span); + fn is_full(&self) -> bool { + match self { + SubPatSet::Empty => false, + SubPatSet::Full => true, + // The whole pattern is reachable only when all its alternatives are. + SubPatSet::Seq { subpats } => subpats.values().all(|sub_set| sub_set.is_full()), + // The whole or-pattern is reachable only when all its alternatives are. + SubPatSet::Alt { subpats, alt_count, .. } => { + subpats.len() == *alt_count && subpats.values().all(|set| set.is_full()) + } + } } - fn intersection_mut(&mut self, other: &Self) { - if self.is_empty() || other.is_empty() { - *self = Self::new(); + /// Union `self` with `other`, mutating `self`. + fn union(&mut self, other: Self) { + use SubPatSet::*; + // Union with full stays full; union with empty changes nothing. + if self.is_full() || other.is_empty() { + return; + } else if self.is_empty() { + *self = other; + return; + } else if other.is_full() { + *self = Full; return; } - // Those that were in `self` but not contained in `other` - let mut leftover = SpanSet::new(); - // We keep the elements in `self` that are also in `other`. - self.root_spans.retain(|span| { - let retain = other.contains(*span); - if !retain { - leftover.root_spans.push(*span); + + match (&mut *self, other) { + (Seq { subpats: s_set }, Seq { subpats: mut o_set }) => { + s_set.retain(|i, s_sub_set| { + // Missing entries count as full. + let o_sub_set = o_set.remove(&i).unwrap_or(Full); + s_sub_set.union(o_sub_set); + // We drop full entries. + !s_sub_set.is_full() + }); + // Everything left in `o_set` is missing from `s_set`, i.e. counts as full. Since + // unioning with full returns full, we can drop those entries. } - retain - }); - // We keep the elements in `other` that are also in the original `self`. You might think - // this is not needed because `self` already contains the intersection. But those aren't - // just sets of things. If `self = [a]`, `other = [b]` and `a` contains `b`, then `b` - // belongs in the intersection but we didn't catch it in the filtering above. We look at - // `leftover` instead of the full original `self` to avoid duplicates. - for span in other.iter() { - if leftover.contains(span) { - self.root_spans.push(span); + (Alt { subpats: s_set, .. }, Alt { subpats: mut o_set, .. }) => { + s_set.retain(|i, s_sub_set| { + // Missing entries count as empty. + let o_sub_set = o_set.remove(&i).unwrap_or(Empty); + s_sub_set.union(o_sub_set); + // We drop empty entries. + !s_sub_set.is_empty() + }); + // Everything left in `o_set` is missing from `s_set`, i.e. counts as empty. Since + // unioning with empty changes nothing, we can take those entries as is. + s_set.extend(o_set); + } + _ => bug!(), + } + + if self.is_full() { + *self = Full; + } + } + + /// Returns a list of the spans of the unreachable subpatterns. If `self` is empty (i.e. the + /// whole pattern is unreachable) we return `None`. + fn list_unreachable_spans(&self) -> Option> { + /// Panics if `set.is_empty()`. + fn fill_spans(set: &SubPatSet<'_, '_>, spans: &mut Vec) { + match set { + SubPatSet::Empty => bug!(), + SubPatSet::Full => {} + SubPatSet::Seq { subpats } => { + for (_, sub_set) in subpats { + fill_spans(sub_set, spans); + } + } + SubPatSet::Alt { subpats, pat, alt_count, .. } => { + let expanded = pat.expand_or_pat(); + for i in 0..*alt_count { + let sub_set = subpats.get(&i).unwrap_or(&SubPatSet::Empty); + if sub_set.is_empty() { + // Found a unreachable subpattern. + spans.push(expanded[i].span); + } else { + fill_spans(sub_set, spans); + } + } + } } } + + if self.is_empty() { + return None; + } + if self.is_full() { + // No subpatterns are unreachable. + return Some(Vec::new()); + } + let mut spans = Vec::new(); + fill_spans(self, &mut spans); + Some(spans) + } + + /// When `self` refers to a patstack that was obtained from specialization, after running + /// `unspecialize` it will refer to the original patstack before specialization. + fn unspecialize(self, arity: usize) -> Self { + use SubPatSet::*; + match self { + Full => Full, + Empty => Empty, + Seq { subpats } => { + // We gather the first `arity` subpatterns together and shift the remaining ones. + let mut new_subpats = FxHashMap::default(); + let mut new_subpats_first_col = FxHashMap::default(); + for (i, sub_set) in subpats { + if i < arity { + // The first `arity` indices are now part of the pattern in the first + // column. + new_subpats_first_col.insert(i, sub_set); + } else { + // Indices after `arity` are simply shifted + new_subpats.insert(i - arity + 1, sub_set); + } + } + // If `new_subpats_first_col` has no entries it counts as full, so we can omit it. + if !new_subpats_first_col.is_empty() { + new_subpats.insert(0, Seq { subpats: new_subpats_first_col }); + } + Seq { subpats: new_subpats } + } + Alt { .. } => bug!(), // `self` is a patstack + } + } + + /// When `self` refers to a patstack that was obtained from splitting an or-pattern, after + /// running `unspecialize` it will refer to the original patstack before splitting. + /// + /// For example: + /// ``` + /// match Some(true) { + /// Some(true) => {} + /// None | Some(true | false) => {} + /// } + /// ``` + /// Here `None` would return the full set and `Some(true | false)` would return the set + /// containing `false`. After `unsplit_or_pat`, we want the set to contain `None` and `false`. + /// This is what this function does. + fn unsplit_or_pat(mut self, alt_id: usize, alt_count: usize, pat: &'p Pat<'tcx>) -> Self { + use SubPatSet::*; + if self.is_empty() { + return Empty; + } + + // Subpatterns coming from inside the or-pattern alternative itself, e.g. in `None | Some(0 + // | 1)`. + let set_first_col = match &mut self { + Full => Full, + Seq { subpats } => subpats.remove(&0).unwrap_or(Full), + Empty => unreachable!(), + Alt { .. } => bug!(), // `self` is a patstack + }; + let mut subpats_first_col = FxHashMap::default(); + subpats_first_col.insert(alt_id, set_first_col); + let set_first_col = Alt { subpats: subpats_first_col, pat, alt_count }; + + let mut subpats = match self { + Full => FxHashMap::default(), + Seq { subpats } => subpats, + Empty => unreachable!(), + Alt { .. } => bug!(), // `self` is a patstack + }; + subpats.insert(0, set_first_col); + Seq { subpats } } } +/// This carries the results of computing usefulness, as described at the top of the file. When +/// checking usefulness of a match branch, we use the `NoWitnesses` variant, which also keeps track +/// of potential unreachable sub-patterns (in the presence of or-patterns). When checking +/// exhaustiveness of a whole match, we use the `WithWitnesses` variant, which carries a list of +/// witnesses of non-exhaustiveness when there are any. +/// Which variant to use is dictated by `WitnessPreference`. #[derive(Clone, Debug)] -crate enum Usefulness<'tcx> { - /// Pontentially carries a set of sub-branches that have been found to be unreachable. Used - /// only in the presence of or-patterns, otherwise it stays empty. - Useful(SpanSet), - /// Carries a list of witnesses of non-exhaustiveness. - UsefulWithWitness(Vec>), - NotUseful, +enum Usefulness<'p, 'tcx> { + /// Carries a set of subpatterns that have been found to be reachable. If empty, this indicates + /// the whole pattern is unreachable. If not, this indicates that the pattern is reachable but + /// that some sub-patterns may be unreachable (due to or-patterns). In the absence of + /// or-patterns this will always be either `Empty` (the whole pattern is unreachable) or `Full` + /// (the whole pattern is reachable). + NoWitnesses(SubPatSet<'p, 'tcx>), + /// Carries a list of witnesses of non-exhaustiveness. If empty, indicates that the whole + /// pattern is unreachable. + WithWitnesses(Vec>), } -impl<'tcx> Usefulness<'tcx> { +impl<'p, 'tcx> Usefulness<'p, 'tcx> { fn new_useful(preference: WitnessPreference) -> Self { match preference { - ConstructWitness => UsefulWithWitness(vec![Witness(vec![])]), - LeaveOutWitness => Useful(Default::default()), + ConstructWitness => WithWitnesses(vec![Witness(vec![])]), + LeaveOutWitness => NoWitnesses(SubPatSet::full()), + } + } + fn new_not_useful(preference: WitnessPreference) -> Self { + match preference { + ConstructWitness => WithWitnesses(vec![]), + LeaveOutWitness => NoWitnesses(SubPatSet::empty()), + } + } + + /// Combine usefulnesses from two branches. This is an associative operation. + fn extend(&mut self, other: Self) { + match (&mut *self, other) { + (WithWitnesses(_), WithWitnesses(o)) if o.is_empty() => {} + (WithWitnesses(s), WithWitnesses(o)) if s.is_empty() => *self = WithWitnesses(o), + (WithWitnesses(s), WithWitnesses(o)) => s.extend(o), + (NoWitnesses(s), NoWitnesses(o)) => s.union(o), + _ => unreachable!(), } } /// When trying several branches and each returns a `Usefulness`, we need to combine the /// results together. - fn merge(usefulnesses: impl Iterator) -> Self { - // If we have detected some unreachable sub-branches, we only want to keep them when they - // were unreachable in _all_ branches. Eg. in the following, the last `true` is unreachable - // in the second branch of the first or-pattern, but not otherwise. Therefore we don't want - // to lint that it is unreachable. - // ``` - // match (true, true) { - // (true, true) => {} - // (false | true, false | true) => {} - // } - // ``` - // Here however we _do_ want to lint that the last `false` is unreachable. So we don't want - // to intersect the spans that come directly from the or-pattern, since each branch of the - // or-pattern brings a new disjoint pattern. - // ``` - // match None { - // Some(false) => {} - // None | Some(true | false) => {} - // } - // ``` - - // Is `None` when no branch was useful. Will often be `Some(Spanset::new())` because the - // sets are only non-empty in the presence of or-patterns. - let mut unreachables: Option = None; - // Witnesses of usefulness, if any. - let mut witnesses = Vec::new(); - + fn merge(pref: WitnessPreference, usefulnesses: impl Iterator) -> Self { + let mut ret = Self::new_not_useful(pref); for u in usefulnesses { - match u { - Useful(spans) if spans.is_empty() => { - // Once we reach the empty set, more intersections won't change the result. - return Useful(SpanSet::new()); - } - Useful(spans) => { - if let Some(unreachables) = &mut unreachables { - if !unreachables.is_empty() { - unreachables.intersection_mut(&spans); - } - if unreachables.is_empty() { - return Useful(SpanSet::new()); - } - } else { - unreachables = Some(spans); - } - } - NotUseful => {} - UsefulWithWitness(wits) => { - witnesses.extend(wits); + ret.extend(u); + if let NoWitnesses(subpats) = &ret { + if subpats.is_full() { + // Once we reach the full set, more unions won't change the result. + return ret; } } } - - if !witnesses.is_empty() { - UsefulWithWitness(witnesses) - } else if let Some(unreachables) = unreachables { - Useful(unreachables) - } else { - NotUseful - } + ret } /// After calculating the usefulness for a branch of an or-pattern, call this to make this /// usefulness mergeable with those from the other branches. - fn unsplit_or_pat(self, this_span: Span, or_pat_spans: &[Span]) -> Self { + fn unsplit_or_pat(self, alt_id: usize, alt_count: usize, pat: &'p Pat<'tcx>) -> Self { match self { - Useful(mut spans) => { - // We register the spans of the other branches of this or-pattern as being - // unreachable from this one. This ensures that intersecting together the sets of - // spans returns what we want. - // Until we optimize `SpanSet` however, intersecting this entails a number of - // comparisons quadratic in the number of branches. - for &span in or_pat_spans { - if span != this_span { - spans.push_nonintersecting(span); - } - } - Useful(spans) - } - x => x, + NoWitnesses(subpats) => NoWitnesses(subpats.unsplit_or_pat(alt_id, alt_count, pat)), + WithWitnesses(_) => bug!(), } } /// After calculating usefulness after a specialization, call this to recontruct a usefulness /// that makes sense for the matrix pre-specialization. This new usefulness can then be merged /// with the results of specializing with the other constructors. - fn apply_constructor<'p>( + fn apply_constructor( self, pcx: PatCtxt<'_, 'p, 'tcx>, matrix: &Matrix<'p, 'tcx>, // used to compute missing ctors @@ -784,7 +939,8 @@ impl<'tcx> Usefulness<'tcx> { ctor_wild_subpatterns: &Fields<'p, 'tcx>, ) -> Self { match self { - UsefulWithWitness(witnesses) => { + WithWitnesses(witnesses) if witnesses.is_empty() => WithWitnesses(witnesses), + WithWitnesses(witnesses) => { let new_witnesses = if matches!(ctor, Constructor::Missing) { let mut split_wildcard = SplitWildcard::new(pcx); split_wildcard.split(pcx, matrix.head_ctors(pcx.cx)); @@ -814,9 +970,9 @@ impl<'tcx> Usefulness<'tcx> { .map(|witness| witness.apply_constructor(pcx, &ctor, ctor_wild_subpatterns)) .collect() }; - UsefulWithWitness(new_witnesses) + WithWitnesses(new_witnesses) } - x => x, + NoWitnesses(subpats) => NoWitnesses(subpats.unspecialize(ctor_wild_subpatterns.len())), } } } @@ -924,6 +1080,10 @@ impl<'tcx> Witness<'tcx> { /// `is_under_guard` is used to inform if the pattern has a guard. If it /// has one it must not be inserted into the matrix. This shouldn't be /// relied on for soundness. +#[instrument( + level = "debug", + skip(cx, matrix, witness_preference, hir_id, is_under_guard, is_top_level) +)] fn is_useful<'p, 'tcx>( cx: &MatchCheckCtxt<'p, 'tcx>, matrix: &Matrix<'p, 'tcx>, @@ -932,9 +1092,9 @@ fn is_useful<'p, 'tcx>( hir_id: HirId, is_under_guard: bool, is_top_level: bool, -) -> Usefulness<'tcx> { +) -> Usefulness<'p, 'tcx> { + debug!("matrix,v={:?}{:?}", matrix, v); let Matrix { patterns: rows, .. } = matrix; - debug!("is_useful({:#?}, {:#?})", matrix, v); // The base case. We are pattern-matching on () and the return value is // based on whether our matrix has a row or not. @@ -942,12 +1102,14 @@ fn is_useful<'p, 'tcx>( // first and then, if v is non-empty, the return value is based on whether // the type of the tuple we're checking is inhabited or not. if v.is_empty() { - return if rows.is_empty() { + let ret = if rows.is_empty() { Usefulness::new_useful(witness_preference) } else { - NotUseful + Usefulness::new_not_useful(witness_preference) }; - }; + debug!(?ret); + return ret; + } assert!(rows.iter().all(|r| r.len() == v.len())); @@ -955,16 +1117,15 @@ fn is_useful<'p, 'tcx>( let ty = matrix.heads().next().map_or(v.head().ty, |r| r.ty); let pcx = PatCtxt { cx, ty, span: v.head().span, is_top_level }; - debug!("is_useful_expand_first_col: ty={:#?}, expanding {:#?}", pcx.ty, v.head()); - // If the first pattern is an or-pattern, expand it. - let ret = if let Some(vs) = v.expand_or_pat() { - let subspans: Vec<_> = vs.iter().map(|v| v.head().span).collect(); - // We expand the or pattern, trying each of its branches in turn and keeping careful track - // of possible unreachable sub-branches. + let ret = if v.head().is_or_pat() { + debug!("expanding or-pattern"); + let v_head = v.head(); + let vs: Vec<_> = v.expand_or_pat().collect(); + let alt_count = vs.len(); + // We try each or-pattern branch in turn. let mut matrix = matrix.clone(); - let usefulnesses = vs.into_iter().map(|v| { - let v_span = v.head().span; + let usefulnesses = vs.into_iter().enumerate().map(|(i, v)| { let usefulness = is_useful(cx, &matrix, &v, witness_preference, hir_id, is_under_guard, false); // If pattern has a guard don't add it to the matrix. @@ -973,9 +1134,9 @@ fn is_useful<'p, 'tcx>( // branches like `Some(_) | Some(0)`. matrix.push(v); } - usefulness.unsplit_or_pat(v_span, &subspans) + usefulness.unsplit_or_pat(i, alt_count, v_head) }); - Usefulness::merge(usefulnesses) + Usefulness::merge(witness_preference, usefulnesses) } else { let v_ctor = v.head_ctor(cx); if let Constructor::IntRange(ctor_range) = &v_ctor { @@ -993,6 +1154,7 @@ fn is_useful<'p, 'tcx>( // witness the usefulness of `v`. let start_matrix = &matrix; let usefulnesses = split_ctors.into_iter().map(|ctor| { + debug!("specialize({:?})", ctor); // We cache the result of `Fields::wildcards` because it is used a lot. let ctor_wild_subpatterns = Fields::wildcards(pcx, &ctor); let spec_matrix = @@ -1002,9 +1164,9 @@ fn is_useful<'p, 'tcx>( is_useful(cx, &spec_matrix, &v, witness_preference, hir_id, is_under_guard, false); usefulness.apply_constructor(pcx, start_matrix, &ctor, &ctor_wild_subpatterns) }); - Usefulness::merge(usefulnesses) + Usefulness::merge(witness_preference, usefulnesses) }; - debug!("is_useful::returns({:#?}, {:#?}) = {:?}", matrix, v, ret); + debug!(?ret); ret } @@ -1017,10 +1179,21 @@ crate struct MatchArm<'p, 'tcx> { crate has_guard: bool, } +/// Indicates whether or not a given arm is reachable. +#[derive(Clone, Debug)] +crate enum Reachability { + /// The arm is reachable. This additionally carries a set of or-pattern branches that have been + /// found to be unreachable despite the overall arm being reachable. Used only in the presence + /// of or-patterns, otherwise it stays empty. + Reachable(Vec), + /// The arm is unreachable. + Unreachable, +} + /// The output of checking a match for exhaustiveness and arm reachability. crate struct UsefulnessReport<'p, 'tcx> { /// For each arm of the input, whether that arm is reachable after the arms above it. - crate arm_usefulness: Vec<(MatchArm<'p, 'tcx>, Usefulness<'tcx>)>, + crate arm_usefulness: Vec<(MatchArm<'p, 'tcx>, Reachability)>, /// If the match is exhaustive, this is empty. If not, this contains witnesses for the lack of /// exhaustiveness. crate non_exhaustiveness_witnesses: Vec>, @@ -1048,7 +1221,14 @@ crate fn compute_match_usefulness<'p, 'tcx>( if !arm.has_guard { matrix.push(v); } - (arm, usefulness) + let reachability = match usefulness { + NoWitnesses(subpats) if subpats.is_empty() => Reachability::Unreachable, + NoWitnesses(subpats) => { + Reachability::Reachable(subpats.list_unreachable_spans().unwrap()) + } + WithWitnesses(..) => bug!(), + }; + (arm, reachability) }) .collect(); @@ -1056,15 +1236,8 @@ crate fn compute_match_usefulness<'p, 'tcx>( let v = PatStack::from_pattern(wild_pattern); let usefulness = is_useful(cx, &matrix, &v, ConstructWitness, scrut_hir_id, false, true); let non_exhaustiveness_witnesses = match usefulness { - NotUseful => vec![], // Wildcard pattern isn't useful, so the match is exhaustive. - UsefulWithWitness(pats) => { - if pats.is_empty() { - bug!("Exhaustiveness check returned no witnesses") - } else { - pats.into_iter().map(|w| w.single_pattern()).collect() - } - } - Useful(_) => bug!(), + WithWitnesses(pats) => pats.into_iter().map(|w| w.single_pattern()).collect(), + NoWitnesses(_) => bug!(), }; UsefulnessReport { arm_usefulness, non_exhaustiveness_witnesses } } diff --git a/compiler/rustc_parse/Cargo.toml b/compiler/rustc_parse/Cargo.toml index 52835e5c8a..c887729c35 100644 --- a/compiler/rustc_parse/Cargo.toml +++ b/compiler/rustc_parse/Cargo.toml @@ -19,4 +19,4 @@ rustc_session = { path = "../rustc_session" } rustc_span = { path = "../rustc_span" } rustc_ast = { path = "../rustc_ast" } unicode-normalization = "0.1.11" -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } diff --git a/compiler/rustc_parse/src/lexer/mod.rs b/compiler/rustc_parse/src/lexer/mod.rs index 4a638ec3f8..4bf870eb7c 100644 --- a/compiler/rustc_parse/src/lexer/mod.rs +++ b/compiler/rustc_parse/src/lexer/mod.rs @@ -268,6 +268,9 @@ impl<'a> StringReader<'a> { // tokens like `<<` from `rustc_lexer`, and then add fancier error recovery to it, // as there will be less overall work to do this way. let token = unicode_chars::check_for_substitution(self, start, c, &mut err); + if c == '\x00' { + err.help("source files must contain UTF-8 encoded text, unexpected null bytes might occur when a different encoding is used"); + } err.emit(); token? } diff --git a/compiler/rustc_parse/src/lib.rs b/compiler/rustc_parse/src/lib.rs index f155f3a94e..001b52b56f 100644 --- a/compiler/rustc_parse/src/lib.rs +++ b/compiler/rustc_parse/src/lib.rs @@ -6,11 +6,12 @@ #![feature(or_patterns)] #![feature(box_syntax)] #![feature(box_patterns)] +#![recursion_limit = "256"] use rustc_ast as ast; -use rustc_ast::attr::HasAttrs; use rustc_ast::token::{self, Nonterminal}; use rustc_ast::tokenstream::{self, CanSynthesizeMissingTokens, LazyTokenStream, TokenStream}; +use rustc_ast::AstLike; use rustc_ast_pretty::pprust; use rustc_data_structures::sync::Lrc; use rustc_errors::{Diagnostic, FatalError, Level, PResult}; diff --git a/compiler/rustc_parse/src/parser/attr.rs b/compiler/rustc_parse/src/parser/attr.rs index 1b26fb3337..95d4a48b84 100644 --- a/compiler/rustc_parse/src/parser/attr.rs +++ b/compiler/rustc_parse/src/parser/attr.rs @@ -1,4 +1,4 @@ -use super::{Parser, PathStyle}; +use super::{AttrWrapper, Parser, PathStyle}; use rustc_ast as ast; use rustc_ast::attr; use rustc_ast::token::{self, Nonterminal}; @@ -26,7 +26,7 @@ pub(super) const DEFAULT_INNER_ATTR_FORBIDDEN: InnerAttrPolicy<'_> = InnerAttrPo impl<'a> Parser<'a> { /// Parses attributes that appear before an item. - pub(super) fn parse_outer_attributes(&mut self) -> PResult<'a, Vec> { + pub(super) fn parse_outer_attributes(&mut self) -> PResult<'a, AttrWrapper> { let mut attrs: Vec = Vec::new(); let mut just_parsed_doc_comment = false; loop { @@ -74,7 +74,7 @@ impl<'a> Parser<'a> { break; } } - Ok(attrs) + Ok(AttrWrapper::new(attrs)) } /// Matches `attribute = # ! [ meta_item ]`. @@ -89,7 +89,8 @@ impl<'a> Parser<'a> { inner_parse_policy, self.token ); let lo = self.token.span; - self.collect_tokens(|this| { + // Attributse can't have attributes of their own + self.collect_tokens_no_attrs(|this| { if this.eat(&token::Pound) { let style = if this.eat(&token::Not) { ast::AttrStyle::Inner @@ -163,7 +164,8 @@ impl<'a> Parser<'a> { let args = this.parse_attr_args()?; Ok(ast::AttrItem { path, args, tokens: None }) }; - if capture_tokens { self.collect_tokens(do_parse) } else { do_parse(self) }? + // Attr items don't have attributes + if capture_tokens { self.collect_tokens_no_attrs(do_parse) } else { do_parse(self) }? }) } @@ -306,13 +308,11 @@ impl<'a> Parser<'a> { } pub fn maybe_needs_tokens(attrs: &[ast::Attribute]) -> bool { - // One of the attributes may either itself be a macro, or apply derive macros (`derive`), + // One of the attributes may either itself be a macro, // or expand to macro attributes (`cfg_attr`). attrs.iter().any(|attr| { attr.ident().map_or(true, |ident| { - ident.name == sym::derive - || ident.name == sym::cfg_attr - || !rustc_feature::is_builtin_attr_name(ident.name) + ident.name == sym::cfg_attr || !rustc_feature::is_builtin_attr_name(ident.name) }) }) } diff --git a/compiler/rustc_parse/src/parser/attr_wrapper.rs b/compiler/rustc_parse/src/parser/attr_wrapper.rs new file mode 100644 index 0000000000..7512f46988 --- /dev/null +++ b/compiler/rustc_parse/src/parser/attr_wrapper.rs @@ -0,0 +1,189 @@ +use super::attr; +use super::{ForceCollect, Parser, TokenCursor, TrailingToken}; +use rustc_ast::token::{self, Token, TokenKind}; +use rustc_ast::tokenstream::{CreateTokenStream, TokenStream, TokenTree, TreeAndSpacing}; +use rustc_ast::tokenstream::{DelimSpan, LazyTokenStream, Spacing}; +use rustc_ast::AstLike; +use rustc_ast::{self as ast}; +use rustc_errors::PResult; +use rustc_span::{Span, DUMMY_SP}; + +/// A wrapper type to ensure that the parser handles outer attributes correctly. +/// When we parse outer attributes, we need to ensure that we capture tokens +/// for the attribute target. This allows us to perform cfg-expansion on +/// a token stream before we invoke a derive proc-macro. +/// +/// This wrapper prevents direct access to the underlying `Vec`. +/// Parsing code can only get access to the underlying attributes +/// by passing an `AttrWrapper` to `collect_tokens_trailing_tokens`. +/// This makes it difficult to accidentally construct an AST node +/// (which stores a `Vec`) without first collecting tokens. +/// +/// This struct has its own module, to ensure that the parser code +/// cannot directly access the `attrs` field +#[derive(Debug, Clone)] +pub struct AttrWrapper { + attrs: Vec, +} + +impl AttrWrapper { + pub fn empty() -> AttrWrapper { + AttrWrapper { attrs: vec![] } + } + pub fn new(attrs: Vec) -> AttrWrapper { + AttrWrapper { attrs } + } + // FIXME: Delay span bug here? + pub(crate) fn take_for_recovery(self) -> Vec { + self.attrs + } + pub fn is_empty(&self) -> bool { + self.attrs.is_empty() + } +} + +impl<'a> Parser<'a> { + /// Records all tokens consumed by the provided callback, + /// including the current token. These tokens are collected + /// into a `LazyTokenStream`, and returned along with the result + /// of the callback. + /// + /// Note: If your callback consumes an opening delimiter + /// (including the case where you call `collect_tokens` + /// when the current token is an opening delimeter), + /// you must also consume the corresponding closing delimiter. + /// + /// That is, you can consume + /// `something ([{ }])` or `([{}])`, but not `([{}]` + /// + /// This restriction shouldn't be an issue in practice, + /// since this function is used to record the tokens for + /// a parsed AST item, which always has matching delimiters. + pub fn collect_tokens_trailing_token( + &mut self, + attrs: AttrWrapper, + force_collect: ForceCollect, + f: impl FnOnce(&mut Self, Vec) -> PResult<'a, (R, TrailingToken)>, + ) -> PResult<'a, R> { + if matches!(force_collect, ForceCollect::No) && !attr::maybe_needs_tokens(&attrs.attrs) { + return Ok(f(self, attrs.attrs)?.0); + } + let start_token = (self.token.clone(), self.token_spacing); + let cursor_snapshot = self.token_cursor.clone(); + + let (mut ret, trailing_token) = f(self, attrs.attrs)?; + let tokens = match ret.tokens_mut() { + Some(tokens) if tokens.is_none() => tokens, + _ => return Ok(ret), + }; + + // Produces a `TokenStream` on-demand. Using `cursor_snapshot` + // and `num_calls`, we can reconstruct the `TokenStream` seen + // by the callback. This allows us to avoid producing a `TokenStream` + // if it is never needed - for example, a captured `macro_rules!` + // argument that is never passed to a proc macro. + // In practice token stream creation happens rarely compared to + // calls to `collect_tokens` (see some statistics in #78736), + // so we are doing as little up-front work as possible. + // + // This also makes `Parser` very cheap to clone, since + // there is no intermediate collection buffer to clone. + #[derive(Clone)] + struct LazyTokenStreamImpl { + start_token: (Token, Spacing), + cursor_snapshot: TokenCursor, + num_calls: usize, + desugar_doc_comments: bool, + append_unglued_token: Option, + } + impl CreateTokenStream for LazyTokenStreamImpl { + fn create_token_stream(&self) -> TokenStream { + // The token produced by the final call to `next` or `next_desugared` + // was not actually consumed by the callback. The combination + // of chaining the initial token and using `take` produces the desired + // result - we produce an empty `TokenStream` if no calls were made, + // and omit the final token otherwise. + let mut cursor_snapshot = self.cursor_snapshot.clone(); + let tokens = std::iter::once(self.start_token.clone()) + .chain((0..self.num_calls).map(|_| { + if self.desugar_doc_comments { + cursor_snapshot.next_desugared() + } else { + cursor_snapshot.next() + } + })) + .take(self.num_calls); + + make_token_stream(tokens, self.append_unglued_token.clone()) + } + } + + let mut num_calls = self.token_cursor.num_next_calls - cursor_snapshot.num_next_calls; + match trailing_token { + TrailingToken::None => {} + TrailingToken::Semi => { + assert_eq!(self.token.kind, token::Semi); + num_calls += 1; + } + TrailingToken::MaybeComma => { + if self.token.kind == token::Comma { + num_calls += 1; + } + } + } + + *tokens = Some(LazyTokenStream::new(LazyTokenStreamImpl { + start_token, + num_calls, + cursor_snapshot, + desugar_doc_comments: self.desugar_doc_comments, + append_unglued_token: self.token_cursor.append_unglued_token.clone(), + })); + + Ok(ret) + } +} + +/// Converts a flattened iterator of tokens (including open and close delimiter tokens) +/// into a `TokenStream`, creating a `TokenTree::Delimited` for each matching pair +/// of open and close delims. +fn make_token_stream( + tokens: impl Iterator, + append_unglued_token: Option, +) -> TokenStream { + #[derive(Debug)] + struct FrameData { + open: Span, + inner: Vec<(TokenTree, Spacing)>, + } + let mut stack = vec![FrameData { open: DUMMY_SP, inner: vec![] }]; + for (token, spacing) in tokens { + match token { + Token { kind: TokenKind::OpenDelim(_), span } => { + stack.push(FrameData { open: span, inner: vec![] }); + } + Token { kind: TokenKind::CloseDelim(delim), span } => { + let frame_data = stack.pop().expect("Token stack was empty!"); + let dspan = DelimSpan::from_pair(frame_data.open, span); + let stream = TokenStream::new(frame_data.inner); + let delimited = TokenTree::Delimited(dspan, delim, stream); + stack + .last_mut() + .unwrap_or_else(|| panic!("Bottom token frame is missing for tokens!")) + .inner + .push((delimited, Spacing::Alone)); + } + token => { + stack + .last_mut() + .expect("Bottom token frame is missing!") + .inner + .push((TokenTree::Token(token), spacing)); + } + } + } + let mut final_buf = stack.pop().expect("Missing final buf!"); + final_buf.inner.extend(append_unglued_token); + assert!(stack.is_empty(), "Stack should be empty: final_buf={:?} stack={:?}", final_buf, stack); + TokenStream::new(final_buf.inner) +} diff --git a/compiler/rustc_parse/src/parser/diagnostics.rs b/compiler/rustc_parse/src/parser/diagnostics.rs index 5512e849c4..77e85c06ff 100644 --- a/compiler/rustc_parse/src/parser/diagnostics.rs +++ b/compiler/rustc_parse/src/parser/diagnostics.rs @@ -223,7 +223,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_else(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 "); @@ -640,7 +640,7 @@ impl<'a> Parser<'a> { } } Err(mut err) => { - // We could't parse generic parameters, unlikely to be a turbofish. Rely on + // We couldn't parse generic parameters, unlikely to be a turbofish. Rely on // generic parse error instead. err.cancel(); *self = snapshot; @@ -662,7 +662,7 @@ impl<'a> Parser<'a> { let x = self.parse_seq_to_before_end( &token::Gt, SeqSep::trailing_allowed(token::Comma), - |p| p.parse_ty(), + |p| p.parse_generic_arg(), ); match x { Ok((_, _, false)) => { @@ -1242,7 +1242,7 @@ impl<'a> Parser<'a> { 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 + // This needs to be handled separately from the next arm to avoid // interpreting `await { }?` as `?.await`. self.parse_block_expr(None, self.token.span, BlockCheckMode::Default, AttrVec::new()) } else { @@ -1613,48 +1613,88 @@ impl<'a> Parser<'a> { Applicability::HasPlaceholders, ); return Some(ident); - } else if let PatKind::Ident(_, ident, _) = pat.kind { - if require_name - && (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 first_param { - err.span_suggestion( - pat.span, - "if this is a `self` type, give it a parameter name", - format!("self: {}", ident), - Applicability::MaybeIncorrect, - ); + } else if require_name + && (self.token == token::Comma + || self.token == token::Lt + || self.token == token::CloseDelim(token::Paren)) + { + let rfc_note = "anonymous parameters are removed in the 2018 edition (see RFC 1685)"; + + let (ident, self_sugg, param_sugg, type_sugg) = match pat.kind { + PatKind::Ident(_, ident, _) => ( + ident, + format!("self: {}", ident), + format!("{}: TypeName", ident), + format!("_: {}", ident), + ), + // Also catches `fn foo(&a)`. + PatKind::Ref(ref pat, mutab) + if matches!(pat.clone().into_inner().kind, PatKind::Ident(..)) => + { + match pat.clone().into_inner().kind { + PatKind::Ident(_, ident, _) => { + let mutab = mutab.prefix_str(); + ( + ident, + format!("self: &{}{}", mutab, ident), + format!("{}: &{}TypeName", ident, mutab), + format!("_: &{}{}", mutab, ident), + ) + } + _ => unreachable!(), + } } - // Avoid suggesting that `fn foo(HashMap)` is fixed with a change to - // `fn foo(HashMap: TypeName)`. - if self.token != token::Lt { - err.span_suggestion( - pat.span, - "if this is a parameter name, give it a type", - format!("{}: TypeName", ident), - Applicability::HasPlaceholders, - ); + _ => { + // Otherwise, try to get a type and emit a suggestion. + if let Some(ty) = pat.to_ty() { + err.span_suggestion_verbose( + pat.span, + "explicitly ignore the parameter name", + format!("_: {}", pprust::ty_to_string(&ty)), + Applicability::MachineApplicable, + ); + err.note(rfc_note); + } + + return None; } + }; + + // `fn foo(a, b) {}`, `fn foo(a, b) {}` or `fn foo(usize, usize) {}` + if first_param { err.span_suggestion( pat.span, - "if this is a type, explicitly ignore the parameter name", - format!("_: {}", ident), - Applicability::MachineApplicable, + "if this is a `self` type, give it a parameter name", + self_sugg, + Applicability::MaybeIncorrect, ); - err.note("anonymous parameters are removed in the 2018 edition (see RFC 1685)"); - - // Don't attempt to recover by using the `X` in `X` as the parameter name. - return if self.token == token::Lt { None } else { Some(ident) }; } + // Avoid suggesting that `fn foo(HashMap)` is fixed with a change to + // `fn foo(HashMap: TypeName)`. + if self.token != token::Lt { + err.span_suggestion( + pat.span, + "if this is a parameter name, give it a type", + param_sugg, + Applicability::HasPlaceholders, + ); + } + err.span_suggestion( + pat.span, + "if this is a type, explicitly ignore the parameter name", + type_sugg, + Applicability::MachineApplicable, + ); + err.note(rfc_note); + + // Don't attempt to recover by using the `X` in `X` as the parameter name. + return if self.token == token::Lt { None } else { Some(ident) }; } None } pub(super) fn recover_arg_parse(&mut self) -> PResult<'a, (P, P)> { - let pat = self.parse_pat(Some("argument name"))?; + let pat = self.parse_pat_no_top_alt(Some("argument name"))?; self.expect(&token::Colon)?; let ty = self.parse_ty()?; diff --git a/compiler/rustc_parse/src/parser/expr.rs b/compiler/rustc_parse/src/parser/expr.rs index cfd7ad4822..a3f2a8b3c5 100644 --- a/compiler/rustc_parse/src/parser/expr.rs +++ b/compiler/rustc_parse/src/parser/expr.rs @@ -1,7 +1,7 @@ use super::pat::{GateOr, RecoverComma, PARAM_EXPECTED}; use super::ty::{AllowPlus, RecoverQPath, RecoverReturnSign}; -use super::{BlockMode, Parser, PathStyle, Restrictions, TokenType}; -use super::{SemiColonMode, SeqSep, TokenExpectType}; +use super::{AttrWrapper, BlockMode, ForceCollect, Parser, PathStyle, Restrictions, TokenType}; +use super::{SemiColonMode, SeqSep, TokenExpectType, TrailingToken}; use crate::maybe_recover_from_interpolated_ty_qpath; use rustc_ast::ptr::P; @@ -10,7 +10,7 @@ use rustc_ast::tokenstream::Spacing; use rustc_ast::util::classify; use rustc_ast::util::literal::LitError; use rustc_ast::util::parser::{prec_let_scrutinee_needs_par, AssocOp, Fixity}; -use rustc_ast::{self as ast, AttrStyle, AttrVec, CaptureBy, Field, Lit, UnOp, DUMMY_NODE_ID}; +use rustc_ast::{self as ast, AttrStyle, AttrVec, CaptureBy, ExprField, Lit, UnOp, DUMMY_NODE_ID}; use rustc_ast::{AnonConst, BinOp, BinOpKind, FnDecl, FnRetTy, MacCall, Param, Ty, TyKind}; use rustc_ast::{Arm, Async, BlockCheckMode, Expr, ExprKind, Label, Movability, RangeLimits}; use rustc_ast_pretty::pprust; @@ -62,16 +62,16 @@ macro_rules! maybe_whole_expr { #[derive(Debug)] pub(super) enum LhsExpr { NotYetParsed, - AttributesParsed(AttrVec), + AttributesParsed(AttrWrapper), 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 { + fn from(o: Option) -> Self { if let Some(attrs) = o { LhsExpr::AttributesParsed(attrs) } else { LhsExpr::NotYetParsed } } } @@ -123,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)) } @@ -133,7 +133,10 @@ 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()) } @@ -423,7 +426,7 @@ impl<'a> Parser<'a> { let span = self.mk_expr_sp(&lhs, lhs.span, 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())) + Ok(self.mk_expr(span, self.mk_range(Some(lhs), rhs, limits), AttrVec::new())) } fn is_at_start_of_range_notation_rhs(&self) -> bool { @@ -439,7 +442,7 @@ impl<'a> Parser<'a> { } /// Parses prefix-forms of range notation: `..expr`, `..`, `..=expr`. - fn parse_prefix_range_expr(&mut self, 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); @@ -456,45 +459,62 @@ impl<'a> Parser<'a> { _ => RangeLimits::Closed, }; let op = AssocOp::from_token(&self.token); + // FIXME: `parse_prefix_range_expr` is called when the current + // token is `DotDot`, `DotDotDot`, or `DotDotEq`. If we haven't already + // parsed attributes, then trying to parse them here will always fail. + // We should figure out how we want attributes on range expressions to work. let attrs = self.parse_or_use_outer_attributes(attrs)?; - let lo = self.token.span; - self.bump(); - let (span, opt_end) = if self.is_at_start_of_range_notation_rhs() { - // RHS must be parsed with more associativity than the dots. - self.parse_assoc_expr_with(op.unwrap().precedence() + 1, LhsExpr::NotYetParsed) - .map(|x| (lo.to(x.span), Some(x)))? - } else { - (lo, None) - }; - Ok(self.mk_expr(span, self.mk_range(None, opt_end, limits)?, attrs)) + self.collect_tokens_for_expr(attrs, |this, attrs| { + let lo = this.token.span; + this.bump(); + let (span, opt_end) = if this.is_at_start_of_range_notation_rhs() { + // RHS must be parsed with more associativity than the dots. + this.parse_assoc_expr_with(op.unwrap().precedence() + 1, LhsExpr::NotYetParsed) + .map(|x| (lo.to(x.span), Some(x)))? + } else { + (lo, None) + }; + Ok(this.mk_expr(span, this.mk_range(None, opt_end, limits), attrs.into())) + }) } /// Parses a prefix-unary-operator expr. - fn parse_prefix_expr(&mut self, attrs: Option) -> PResult<'a, P> { + fn parse_prefix_expr(&mut self, attrs: Option) -> PResult<'a, P> { let attrs = self.parse_or_use_outer_attributes(attrs)?; - // FIXME: Use super::attr::maybe_needs_tokens(&attrs) once we come up - // with a good way of passing `force_tokens` through from `parse_nonterminal`. - // Checking !attrs.is_empty() is correct, but will cause us to unnecessarily - // capture tokens in some circumstances. - let needs_tokens = !attrs.is_empty(); - let do_parse = |this: &mut Parser<'a>| { - let lo = this.token.span; - // Note: when adding new unary operators, don't forget to adjust TokenKind::can_begin_expr() - let (hi, ex) = match this.token.uninterpolate().kind { - token::Not => this.parse_unary_expr(lo, UnOp::Not), // `!expr` - token::Tilde => this.recover_tilde_expr(lo), // `~expr` - token::BinOp(token::Minus) => this.parse_unary_expr(lo, UnOp::Neg), // `-expr` - token::BinOp(token::Star) => this.parse_unary_expr(lo, UnOp::Deref), // `*expr` - token::BinOp(token::And) | token::AndAnd => this.parse_borrow_expr(lo), - token::Ident(..) if this.token.is_keyword(kw::Box) => this.parse_box_expr(lo), - token::Ident(..) if this.is_mistaken_not_ident_negation() => { - this.recover_not_expr(lo) - } - _ => return this.parse_dot_or_call_expr(Some(attrs)), - }?; - Ok(this.mk_expr(lo.to(hi), ex, attrs)) - }; - if needs_tokens { self.collect_tokens(do_parse) } else { do_parse(self) } + let lo = self.token.span; + + macro_rules! make_it { + ($this:ident, $attrs:expr, |this, _| $body:expr) => { + $this.collect_tokens_for_expr($attrs, |$this, attrs| { + let (hi, ex) = $body?; + Ok($this.mk_expr(lo.to(hi), ex, attrs.into())) + }) + }; + } + + let this = self; + + // Note: when adding new unary operators, don't forget to adjust TokenKind::can_begin_expr() + match this.token.uninterpolate().kind { + token::Not => make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Not)), // `!expr` + token::Tilde => make_it!(this, attrs, |this, _| this.recover_tilde_expr(lo)), // `~expr` + token::BinOp(token::Minus) => { + make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Neg)) + } // `-expr` + token::BinOp(token::Star) => { + make_it!(this, attrs, |this, _| this.parse_unary_expr(lo, UnOp::Deref)) + } // `*expr` + token::BinOp(token::And) | token::AndAnd => { + make_it!(this, attrs, |this, _| this.parse_borrow_expr(lo)) + } + token::Ident(..) if this.token.is_keyword(kw::Box) => { + make_it!(this, attrs, |this, _| this.parse_box_expr(lo)) + } + token::Ident(..) if this.is_mistaken_not_ident_negation() => { + make_it!(this, attrs, |this, _| this.recover_not_expr(lo)) + } + _ => return this.parse_dot_or_call_expr(Some(attrs)), + } } fn parse_prefix_expr_common(&mut self, lo: Span) -> PResult<'a, (Span, P)> { @@ -805,18 +825,20 @@ impl<'a> Parser<'a> { } /// Parses `a.b` or `a(13)` or `a[4]` or just `a`. - fn parse_dot_or_call_expr(&mut self, attrs: Option) -> PResult<'a, P> { + 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) + self.collect_tokens_for_expr(attrs, |this, attrs| { + let base = this.parse_bottom_expr(); + let (span, base) = this.interpolated_or_expr_span(base)?; + this.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: AttrVec, + mut attrs: Vec, ) -> 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 @@ -824,7 +846,7 @@ impl<'a> Parser<'a> { self.parse_dot_or_call_expr_with_(e0, lo).map(|expr| { expr.map(|mut expr| { attrs.extend::>(expr.attrs.into()); - expr.attrs = attrs; + expr.attrs = attrs.into(); expr }) }) @@ -1019,7 +1041,7 @@ impl<'a> Parser<'a> { /// Assuming we have just parsed `.`, continue parsing into an expression. fn parse_dot_suffix(&mut self, self_arg: P, lo: Span) -> PResult<'a, P> { if self.token.uninterpolated_span().rust_2018() && self.eat_keyword(kw::Await) { - return self.mk_await_expr(self_arg, lo); + return Ok(self.mk_await_expr(self_arg, lo)); } let fn_span_lo = self.token.span; @@ -1703,19 +1725,25 @@ impl<'a> Parser<'a> { fn parse_fn_block_param(&mut self) -> PResult<'a, Param> { let lo = self.token.span; let attrs = self.parse_outer_attributes()?; - let pat = self.parse_pat(PARAM_EXPECTED)?; - let ty = if self.eat(&token::Colon) { - self.parse_ty()? - } else { - self.mk_ty(self.prev_token.span, TyKind::Infer) - }; - Ok(Param { - attrs: attrs.into(), - ty, - pat, - span: lo.to(self.token.span), - id: DUMMY_NODE_ID, - is_placeholder: false, + self.collect_tokens_trailing_token(attrs, ForceCollect::No, |this, attrs| { + let pat = this.parse_pat_no_top_alt(PARAM_EXPECTED)?; + let ty = if this.eat(&token::Colon) { + this.parse_ty()? + } else { + this.mk_ty(this.prev_token.span, TyKind::Infer) + }; + + Ok(( + Param { + attrs: attrs.into(), + ty, + pat, + span: lo.to(this.token.span), + id: DUMMY_NODE_ID, + is_placeholder: false, + }, + TrailingToken::MaybeComma, + )) }) } @@ -1731,7 +1759,7 @@ impl<'a> Parser<'a> { let thn = if self.eat_keyword(kw::Else) || !cond.returns() { self.error_missing_if_cond(lo, cond.span) } else { - let attrs = self.parse_outer_attributes()?; // For recovery. + let attrs = self.parse_outer_attributes()?.take_for_recovery(); // For recovery. let not_block = self.token != token::OpenDelim(token::Brace); let block = self.parse_block().map_err(|mut err| { if not_block { @@ -1775,7 +1803,7 @@ impl<'a> Parser<'a> { /// The `let` token has already been eaten. fn parse_let_expr(&mut self, attrs: AttrVec) -> PResult<'a, P> { let lo = self.prev_token.span; - let pat = self.parse_top_pat(GateOr::No, RecoverComma::Yes)?; + let pat = self.parse_pat_allow_top_alt(None, GateOr::No, RecoverComma::Yes)?; self.expect(&token::Eq)?; let expr = self.with_res(self.restrictions | Restrictions::NO_STRUCT_LITERAL, |this| { this.parse_assoc_expr_with(1 + prec_let_scrutinee_needs_par(), None.into()) @@ -1788,7 +1816,7 @@ impl<'a> Parser<'a> { /// Parses an `else { ... }` expression (`else` token already eaten). fn parse_else_expr(&mut self) -> PResult<'a, P> { let ctx_span = self.prev_token.span; // `else` - let attrs = self.parse_outer_attributes()?; // For recovery. + let attrs = self.parse_outer_attributes()?.take_for_recovery(); // For recovery. let expr = if self.eat_keyword(kw::If) { self.parse_if_expr(AttrVec::new())? } else { @@ -1838,7 +1866,7 @@ impl<'a> Parser<'a> { _ => None, }; - let pat = self.parse_top_pat(GateOr::Yes, RecoverComma::Yes)?; + let pat = self.parse_pat_allow_top_alt(None, GateOr::Yes, RecoverComma::Yes)?; if !self.eat_keyword(kw::In) { self.error_missing_in_for_loop(); } @@ -1945,87 +1973,204 @@ impl<'a> Parser<'a> { Ok(self.mk_expr(lo.to(hi), ExprKind::Match(scrutinee, arms), attrs)) } - pub(super) fn parse_arm(&mut self) -> PResult<'a, Arm> { - let attrs = self.parse_outer_attributes()?; - let lo = self.token.span; - let pat = self.parse_top_pat(GateOr::No, RecoverComma::Yes)?; - let guard = if self.eat_keyword(kw::If) { - let if_span = self.prev_token.span; - let cond = self.parse_expr()?; - if let ExprKind::Let(..) = cond.kind { - // Remove the last feature gating of a `let` expression since it's stable. - self.sess.gated_spans.ungate_last(sym::let_chains, cond.span); - let span = if_span.to(cond.span); - self.sess.gated_spans.gate(sym::if_let_guard, span); + /// Attempt to recover from match arm body with statements and no surrounding braces. + fn parse_arm_body_missing_braces( + &mut self, + first_expr: &P, + arrow_span: Span, + ) -> Option> { + if self.token.kind != token::Semi { + return None; + } + let start_snapshot = self.clone(); + let semi_sp = self.token.span; + self.bump(); // `;` + let mut stmts = + vec![self.mk_stmt(first_expr.span, ast::StmtKind::Expr(first_expr.clone()))]; + let err = |this: &mut Parser<'_>, stmts: Vec| { + let span = stmts[0].span.to(stmts[stmts.len() - 1].span); + let mut err = this.struct_span_err(span, "`match` arm body without braces"); + let (these, s, are) = + if stmts.len() > 1 { ("these", "s", "are") } else { ("this", "", "is") }; + err.span_label( + span, + &format!( + "{these} statement{s} {are} not surrounded by a body", + these = these, + s = s, + are = are + ), + ); + err.span_label(arrow_span, "while parsing the `match` arm starting here"); + if stmts.len() > 1 { + err.multipart_suggestion( + &format!("surround the statement{} with a body", s), + vec![ + (span.shrink_to_lo(), "{ ".to_string()), + (span.shrink_to_hi(), " }".to_string()), + ], + Applicability::MachineApplicable, + ); + } else { + err.span_suggestion( + semi_sp, + "use a comma to end a `match` arm expression", + ",".to_string(), + Applicability::MachineApplicable, + ); } - Some(cond) - } else { - None + err.emit(); + this.mk_expr_err(span) }; - let arrow_span = self.token.span; - self.expect(&token::FatArrow)?; - let arm_start_span = self.token.span; + // We might have either a `,` -> `;` typo, or a block without braces. We need + // a more subtle parsing strategy. + loop { + if self.token.kind == token::CloseDelim(token::Brace) { + // We have reached the closing brace of the `match` expression. + return Some(err(self, stmts)); + } + if self.token.kind == token::Comma { + *self = start_snapshot; + return None; + } + let pre_pat_snapshot = self.clone(); + match self.parse_pat_no_top_alt(None) { + Ok(_pat) => { + if self.token.kind == token::FatArrow { + // Reached arm end. + *self = pre_pat_snapshot; + return Some(err(self, stmts)); + } + } + Err(mut err) => { + err.cancel(); + } + } - let expr = self.parse_expr_res(Restrictions::STMT_EXPR, None).map_err(|mut err| { - err.span_label(arrow_span, "while parsing the `match` arm starting here"); - err - })?; + *self = pre_pat_snapshot; + match self.parse_stmt_without_recovery(true, ForceCollect::No) { + // Consume statements for as long as possible. + Ok(Some(stmt)) => { + stmts.push(stmt); + } + Ok(None) => { + *self = start_snapshot; + break; + } + // We couldn't parse either yet another statement missing it's + // enclosing block nor the next arm's pattern or closing brace. + Err(mut stmt_err) => { + stmt_err.cancel(); + *self = start_snapshot; + break; + } + } + } + None + } - let require_comma = classify::expr_requires_semi_to_be_stmt(&expr) - && self.token != token::CloseDelim(token::Brace); - - let hi = self.prev_token.span; - - if require_comma { - let sm = self.sess.source_map(); - self.expect_one_of(&[token::Comma], &[token::CloseDelim(token::Brace)]).map_err( - |mut err| { - match (sm.span_to_lines(expr.span), sm.span_to_lines(arm_start_span)) { - (Ok(ref expr_lines), Ok(ref arm_start_lines)) - if arm_start_lines.lines[0].end_col == expr_lines.lines[0].end_col - && expr_lines.lines.len() == 2 - && self.token == token::FatArrow => - { - // We check whether there's any trailing code in the parse span, - // if there isn't, we very likely have the following: - // - // X | &Y => "y" - // | -- - missing comma - // | | - // | arrow_span - // X | &X => "x" - // | - ^^ self.token.span - // | | - // | parsed until here as `"y" & X` - err.span_suggestion_short( - arm_start_span.shrink_to_hi(), - "missing a comma here to end this `match` arm", - ",".to_owned(), - Applicability::MachineApplicable, - ); - } - _ => { - err.span_label( - arrow_span, - "while parsing the `match` arm starting here", - ); + pub(super) fn parse_arm(&mut self) -> PResult<'a, Arm> { + let attrs = self.parse_outer_attributes()?; + self.collect_tokens_trailing_token(attrs, ForceCollect::No, |this, attrs| { + let lo = this.token.span; + let pat = this.parse_pat_allow_top_alt(None, GateOr::No, RecoverComma::Yes)?; + let guard = if this.eat_keyword(kw::If) { + let if_span = this.prev_token.span; + let cond = this.parse_expr()?; + if let ExprKind::Let(..) = cond.kind { + // Remove the last feature gating of a `let` expression since it's stable. + this.sess.gated_spans.ungate_last(sym::let_chains, cond.span); + let span = if_span.to(cond.span); + this.sess.gated_spans.gate(sym::if_let_guard, span); + } + Some(cond) + } else { + None + }; + let arrow_span = this.token.span; + this.expect(&token::FatArrow)?; + let arm_start_span = this.token.span; + + let expr = this.parse_expr_res(Restrictions::STMT_EXPR, None).map_err(|mut err| { + err.span_label(arrow_span, "while parsing the `match` arm starting here"); + err + })?; + + let require_comma = classify::expr_requires_semi_to_be_stmt(&expr) + && this.token != token::CloseDelim(token::Brace); + + let hi = this.prev_token.span; + + if require_comma { + let sm = this.sess.source_map(); + if let Some(body) = this.parse_arm_body_missing_braces(&expr, arrow_span) { + let span = body.span; + return Ok(( + ast::Arm { + attrs, + pat, + guard, + body, + span, + id: DUMMY_NODE_ID, + is_placeholder: false, + }, + TrailingToken::None, + )); + } + this.expect_one_of(&[token::Comma], &[token::CloseDelim(token::Brace)]).map_err( + |mut err| { + match (sm.span_to_lines(expr.span), sm.span_to_lines(arm_start_span)) { + (Ok(ref expr_lines), Ok(ref arm_start_lines)) + if arm_start_lines.lines[0].end_col + == expr_lines.lines[0].end_col + && expr_lines.lines.len() == 2 + && this.token == token::FatArrow => + { + // We check whether there's any trailing code in the parse span, + // if there isn't, we very likely have the following: + // + // X | &Y => "y" + // | -- - missing comma + // | | + // | arrow_span + // X | &X => "x" + // | - ^^ self.token.span + // | | + // | parsed until here as `"y" & X` + err.span_suggestion_short( + arm_start_span.shrink_to_hi(), + "missing a comma here to end this `match` arm", + ",".to_owned(), + Applicability::MachineApplicable, + ); + } + _ => { + err.span_label( + arrow_span, + "while parsing the `match` arm starting here", + ); + } } - } - err - }, - )?; - } else { - self.eat(&token::Comma); - } + err + }, + )?; + } else { + this.eat(&token::Comma); + } - Ok(ast::Arm { - attrs, - pat, - guard, - body: expr, - span: lo.to(hi), - id: DUMMY_NODE_ID, - is_placeholder: false, + Ok(( + ast::Arm { + attrs, + pat, + guard, + body: expr, + span: lo.to(hi), + id: DUMMY_NODE_ID, + is_placeholder: false, + }, + TrailingToken::None, + )) }) } @@ -2171,7 +2316,7 @@ impl<'a> Parser<'a> { } let recovery_field = self.find_struct_error_after_field_looking_code(); - let parsed_field = match self.parse_field() { + let parsed_field = match self.parse_expr_field() { Ok(f) => Some(f), Err(mut e) => { if pth == kw::Async { @@ -2228,18 +2373,22 @@ impl<'a> Parser<'a> { let span = pth.span.to(self.token.span); self.expect(&token::CloseDelim(token::Brace))?; - let expr = if recover_async { ExprKind::Err } else { ExprKind::Struct(pth, fields, base) }; + let expr = if recover_async { + ExprKind::Err + } else { + ExprKind::Struct(P(ast::StructExpr { path: pth, fields, rest: base })) + }; Ok(self.mk_expr(span, expr, attrs)) } /// Use in case of error after field-looking code: `S { foo: () with a }`. - fn find_struct_error_after_field_looking_code(&self) -> Option { + fn find_struct_error_after_field_looking_code(&self) -> Option { match self.token.ident() { Some((ident, is_raw)) if (is_raw || !ident.is_reserved()) && self.look_ahead(1, |t| *t == token::Colon) => { - Some(ast::Field { + Some(ast::ExprField { ident, span: self.token.span, expr: self.mk_expr_err(self.token.span), @@ -2273,31 +2422,37 @@ impl<'a> Parser<'a> { } /// Parses `ident (COLON expr)?`. - fn parse_field(&mut self) -> PResult<'a, Field> { - let attrs = self.parse_outer_attributes()?.into(); - let lo = self.token.span; + fn parse_expr_field(&mut self) -> PResult<'a, ExprField> { + let attrs = self.parse_outer_attributes()?; + self.collect_tokens_trailing_token(attrs, ForceCollect::No, |this, attrs| { + let lo = this.token.span; - // Check if a colon exists one ahead. This means we're parsing a fieldname. - let is_shorthand = !self.look_ahead(1, |t| t == &token::Colon || t == &token::Eq); - let (ident, expr) = if is_shorthand { - // Mimic `x: x` for the `x` field shorthand. - let ident = self.parse_ident_common(false)?; - let path = ast::Path::from_ident(ident); - (ident, self.mk_expr(ident.span, ExprKind::Path(None, path), AttrVec::new())) - } else { - let ident = self.parse_field_name()?; - self.error_on_eq_field_init(ident); - self.bump(); // `:` - (ident, self.parse_expr()?) - }; - Ok(ast::Field { - ident, - span: lo.to(expr.span), - expr, - is_shorthand, - attrs, - id: DUMMY_NODE_ID, - is_placeholder: false, + // Check if a colon exists one ahead. This means we're parsing a fieldname. + let is_shorthand = !this.look_ahead(1, |t| t == &token::Colon || t == &token::Eq); + let (ident, expr) = if is_shorthand { + // Mimic `x: x` for the `x` field shorthand. + let ident = this.parse_ident_common(false)?; + let path = ast::Path::from_ident(ident); + (ident, this.mk_expr(ident.span, ExprKind::Path(None, path), AttrVec::new())) + } else { + let ident = this.parse_field_name()?; + this.error_on_eq_field_init(ident); + this.bump(); // `:` + (ident, this.parse_expr()?) + }; + + Ok(( + ast::ExprField { + ident, + span: lo.to(expr.span), + expr, + is_shorthand, + attrs: attrs.into(), + id: DUMMY_NODE_ID, + is_placeholder: false, + }, + TrailingToken::MaybeComma, + )) }) } @@ -2356,12 +2511,12 @@ impl<'a> Parser<'a> { start: Option>, end: Option>, limits: RangeLimits, - ) -> PResult<'a, ExprKind> { + ) -> ExprKind { if end.is_none() && limits == RangeLimits::Closed { self.error_inclusive_range_with_no_end(self.prev_token.span); - Ok(ExprKind::Err) + ExprKind::Err } else { - Ok(ExprKind::Range(start, end, limits)) + ExprKind::Range(start, end, limits) } } @@ -2381,11 +2536,11 @@ impl<'a> Parser<'a> { ExprKind::Call(f, args) } - fn mk_await_expr(&mut self, self_arg: P, lo: Span) -> PResult<'a, P> { + fn mk_await_expr(&mut self, self_arg: P, lo: Span) -> P { let span = lo.to(self.prev_token.span); let await_expr = self.mk_expr(span, ExprKind::Await(self_arg), AttrVec::new()); self.recover_from_await_method_call(); - Ok(await_expr) + await_expr } crate fn mk_expr(&self, span: Span, kind: ExprKind, attrs: AttrVec) -> P { @@ -2405,4 +2560,27 @@ impl<'a> Parser<'a> { .map_or(lhs_span, |a| a.span) .to(rhs_span) } + + fn collect_tokens_for_expr( + &mut self, + attrs: AttrWrapper, + f: impl FnOnce(&mut Self, Vec) -> PResult<'a, P>, + ) -> PResult<'a, P> { + // FIXME - come up with a nice way to properly forward `ForceCollect`from + // the nonterminal parsing code. TThis approach iscorrect, but will cause + // us to unnecessarily capture tokens for exprs that have only builtin + // attributes. Revisit this before #![feature(stmt_expr_attributes)] is stabilized + let force_collect = if attrs.is_empty() { ForceCollect::No } else { ForceCollect::Yes }; + self.collect_tokens_trailing_token(attrs, force_collect, |this, attrs| { + let res = f(this, attrs)?; + let trailing = if this.restrictions.contains(Restrictions::STMT_EXPR) + && this.token.kind == token::Semi + { + TrailingToken::Semi + } else { + TrailingToken::None + }; + Ok((res, trailing)) + }) + } } diff --git a/compiler/rustc_parse/src/parser/generics.rs b/compiler/rustc_parse/src/parser/generics.rs index 42a1337686..f175c5b50b 100644 --- a/compiler/rustc_parse/src/parser/generics.rs +++ b/compiler/rustc_parse/src/parser/generics.rs @@ -1,4 +1,4 @@ -use super::Parser; +use super::{ForceCollect, Parser, TrailingToken}; use rustc_ast::token; use rustc_ast::{ @@ -84,68 +84,89 @@ impl<'a> Parser<'a> { /// a trailing comma and erroneous trailing attributes. pub(super) fn parse_generic_params(&mut self) -> PResult<'a, Vec> { let mut params = Vec::new(); - loop { + let mut done = false; + while !done { let attrs = self.parse_outer_attributes()?; - if self.check_lifetime() { - let lifetime = self.expect_lifetime(); - // Parse lifetime parameter. - let bounds = - if self.eat(&token::Colon) { self.parse_lt_param_bounds() } else { Vec::new() }; - params.push(ast::GenericParam { - ident: lifetime.ident, - id: lifetime.id, - attrs: attrs.into(), - bounds, - kind: ast::GenericParamKind::Lifetime, - is_placeholder: false, - }); - } else if self.check_keyword(kw::Const) { - // Parse const parameter. - params.push(self.parse_const_param(attrs)?); - } else if self.check_ident() { - // Parse type parameter. - params.push(self.parse_ty_param(attrs)?); - } else if self.token.can_begin_type() { - // Trying to write an associated type bound? (#26271) - let snapshot = self.clone(); - match self.parse_ty_where_predicate() { - Ok(where_predicate) => { - self.struct_span_err( - where_predicate.span(), - "bounds on associated types do not belong here", - ) - .span_label(where_predicate.span(), "belongs in `where` clause") - .emit(); - } - Err(mut err) => { - err.cancel(); - *self = snapshot; - break; - } - } - } else { - // Check for trailing attributes and stop parsing. - if !attrs.is_empty() { - if !params.is_empty() { - self.struct_span_err( - attrs[0].span, - "trailing attribute after generic parameter", - ) - .span_label(attrs[0].span, "attributes must go before parameters") - .emit(); + let param = + self.collect_tokens_trailing_token(attrs, ForceCollect::No, |this, attrs| { + let param = if this.check_lifetime() { + let lifetime = this.expect_lifetime(); + // Parse lifetime parameter. + let bounds = if this.eat(&token::Colon) { + this.parse_lt_param_bounds() + } else { + Vec::new() + }; + Some(ast::GenericParam { + ident: lifetime.ident, + id: lifetime.id, + attrs: attrs.into(), + bounds, + kind: ast::GenericParamKind::Lifetime, + is_placeholder: false, + }) + } else if this.check_keyword(kw::Const) { + // Parse const parameter. + Some(this.parse_const_param(attrs)?) + } else if this.check_ident() { + // Parse type parameter. + Some(this.parse_ty_param(attrs)?) + } else if this.token.can_begin_type() { + // Trying to write an associated type bound? (#26271) + let snapshot = this.clone(); + match this.parse_ty_where_predicate() { + Ok(where_predicate) => { + this.struct_span_err( + where_predicate.span(), + "bounds on associated types do not belong here", + ) + .span_label(where_predicate.span(), "belongs in `where` clause") + .emit(); + // FIXME - try to continue parsing other generics? + return Ok((None, TrailingToken::None)); + } + Err(mut err) => { + err.cancel(); + // FIXME - maybe we should overwrite 'self' outside of `collect_tokens`? + *this = snapshot; + return Ok((None, TrailingToken::None)); + } + } } else { - self.struct_span_err(attrs[0].span, "attribute without generic parameters") - .span_label( - attrs[0].span, - "attributes are only permitted when preceding parameters", - ) - .emit(); + // Check for trailing attributes and stop parsing. + if !attrs.is_empty() { + if !params.is_empty() { + this.struct_span_err( + attrs[0].span, + "trailing attribute after generic parameter", + ) + .span_label(attrs[0].span, "attributes must go before parameters") + .emit(); + } else { + this.struct_span_err( + attrs[0].span, + "attribute without generic parameters", + ) + .span_label( + attrs[0].span, + "attributes are only permitted when preceding parameters", + ) + .emit(); + } + } + return Ok((None, TrailingToken::None)); + }; + + if !this.eat(&token::Comma) { + done = true; } - } - break; - } + // We just ate the comma, so no need to use `TrailingToken` + Ok((param, TrailingToken::None)) + })?; - if !self.eat(&token::Comma) { + if let Some(param) = param { + params.push(param); + } else { break; } } diff --git a/compiler/rustc_parse/src/parser/item.rs b/compiler/rustc_parse/src/parser/item.rs index ee24286241..70dbaa53d3 100644 --- a/compiler/rustc_parse/src/parser/item.rs +++ b/compiler/rustc_parse/src/parser/item.rs @@ -1,8 +1,6 @@ use super::diagnostics::{dummy_arg, ConsumeClosingDelim, Error}; use super::ty::{AllowPlus, RecoverQPath, RecoverReturnSign}; -use super::{FollowedByType, ForceCollect, Parser, PathStyle, TrailingToken}; - -use crate::{maybe_collect_tokens, maybe_whole}; +use super::{AttrWrapper, FollowedByType, ForceCollect, Parser, PathStyle, TrailingToken}; use rustc_ast::ast::*; use rustc_ast::ptr::P; @@ -11,7 +9,7 @@ use rustc_ast::tokenstream::{DelimSpan, TokenStream, TokenTree}; use rustc_ast::{self as ast, AttrVec, Attribute, DUMMY_NODE_ID}; use rustc_ast::{Async, Const, Defaultness, IsAuto, Mutability, Unsafe, UseTree, UseTreeKind}; use rustc_ast::{BindingMode, Block, FnDecl, FnSig, Param, SelfKind}; -use rustc_ast::{EnumDef, Generics, StructField, TraitRef, Ty, TyKind, Variant, VariantData}; +use rustc_ast::{EnumDef, FieldDef, Generics, TraitRef, Ty, TyKind, Variant, VariantData}; use rustc_ast::{FnHeader, ForeignItem, Path, PathSegment, Visibility, VisibilityKind}; use rustc_ast::{MacArgs, MacCall, MacDelimiter}; use rustc_ast_pretty::pprust; @@ -27,11 +25,9 @@ use tracing::debug; impl<'a> Parser<'a> { /// Parses a source module as a crate. This is the main entry point for the parser. pub fn parse_crate_mod(&mut self) -> PResult<'a, ast::Crate> { - let lo = self.token.span; - let (module, attrs) = self.parse_mod(&token::Eof, Unsafe::No)?; - let span = lo.to(self.token.span); + let (attrs, items, span) = self.parse_mod(&token::Eof)?; let proc_macros = Vec::new(); // Filled in by `proc_macro_harness::inject()`. - Ok(ast::Crate { attrs, module, span, proc_macros }) + Ok(ast::Crate { attrs, items, span, proc_macros }) } /// Parses a `mod { ... }` or `mod ;` item. @@ -39,35 +35,26 @@ impl<'a> Parser<'a> { let unsafety = self.parse_unsafety(); self.expect_keyword(kw::Mod)?; let id = self.parse_ident()?; - let (module, mut inner_attrs) = if self.eat(&token::Semi) { - (Mod { inner: Span::default(), unsafety, items: Vec::new(), inline: false }, Vec::new()) + let mod_kind = if self.eat(&token::Semi) { + ModKind::Unloaded } else { self.expect(&token::OpenDelim(token::Brace))?; - self.parse_mod(&token::CloseDelim(token::Brace), unsafety)? + let (mut inner_attrs, items, inner_span) = + self.parse_mod(&token::CloseDelim(token::Brace))?; + attrs.append(&mut inner_attrs); + ModKind::Loaded(items, Inline::Yes, inner_span) }; - attrs.append(&mut inner_attrs); - Ok((id, ItemKind::Mod(module))) + Ok((id, ItemKind::Mod(unsafety, mod_kind))) } /// Parses the contents of a module (inner attributes followed by module items). pub fn parse_mod( &mut self, term: &TokenKind, - unsafety: Unsafe, - ) -> PResult<'a, (Mod, Vec)> { + ) -> PResult<'a, (Vec, Vec>, Span)> { let lo = self.token.span; let attrs = self.parse_inner_attributes()?; - let module = self.parse_mod_items(term, lo, unsafety)?; - Ok((module, attrs)) - } - /// Given a termination token, parses all of the items in a module. - fn parse_mod_items( - &mut self, - term: &TokenKind, - inner_lo: Span, - unsafety: Unsafe, - ) -> PResult<'a, Mod> { let mut items = vec![]; while let Some(item) = self.parse_item(ForceCollect::No)? { items.push(item); @@ -84,9 +71,7 @@ impl<'a> Parser<'a> { } } - let hi = if self.token.span.is_dummy() { inner_lo } else { self.prev_token.span }; - - Ok(Mod { inner: inner_lo.to(hi), unsafety, items, inline: true }) + Ok((attrs, items, lo.to(self.prev_token.span))) } } @@ -108,25 +93,40 @@ impl<'a> Parser<'a> { pub(super) fn parse_item_common( &mut self, - mut attrs: Vec, + attrs: AttrWrapper, mac_allowed: bool, attrs_allowed: bool, req_name: ReqName, force_collect: ForceCollect, ) -> PResult<'a, Option> { - maybe_whole!(self, NtItem, |item| { - let mut item = item; - mem::swap(&mut item.attrs, &mut attrs); - item.attrs.extend(attrs); - Some(item.into_inner()) - }); + // Don't use `maybe_whole` so that we have precise control + // over when we bump the parser + if let token::Interpolated(nt) = &self.token.kind { + if let token::NtItem(item) = &**nt { + let item = item.clone(); + + return self.collect_tokens_trailing_token( + attrs, + force_collect, + |this, mut attrs| { + let mut item = item; + mem::swap(&mut item.attrs, &mut attrs); + item.attrs.extend(attrs); + // Bump the parser so the we capture the token::Interpolated + this.bump(); + Ok((Some(item.into_inner()), TrailingToken::None)) + }, + ); + } + }; let mut unclosed_delims = vec![]; - let item = maybe_collect_tokens!(self, force_collect, &attrs, |this: &mut Self| { - let item = this.parse_item_common_(attrs, mac_allowed, attrs_allowed, req_name); - unclosed_delims.append(&mut this.unclosed_delims); - Ok((item?, TrailingToken::None)) - })?; + let item = + self.collect_tokens_trailing_token(attrs, force_collect, |this: &mut Self, attrs| { + let item = this.parse_item_common_(attrs, mac_allowed, attrs_allowed, req_name); + unclosed_delims.append(&mut this.unclosed_delims); + Ok((item?, TrailingToken::None)) + })?; self.unclosed_delims.append(&mut unclosed_delims); Ok(item) @@ -204,6 +204,7 @@ impl<'a> Parser<'a> { def: &mut Defaultness, req_name: ReqName, ) -> PResult<'a, Option> { + let def_final = def == &Defaultness::Final; let mut def = || mem::replace(def, Defaultness::Final); let info = if self.eat_keyword(kw::Use) { @@ -225,8 +226,8 @@ impl<'a> Parser<'a> { return Err(e); } - (Ident::invalid(), ItemKind::Use(P(tree))) - } else if self.check_fn_front_matter() { + (Ident::invalid(), ItemKind::Use(tree)) + } else if self.check_fn_front_matter(def_final) { // FUNCTION ITEM let (ident, sig, generics, body) = self.parse_fn(attrs, req_name, lo)?; (ident, ItemKind::Fn(box FnKind(def(), sig, generics, body))) @@ -1109,39 +1110,45 @@ impl<'a> Parser<'a> { fn parse_enum_variant(&mut self) -> PResult<'a, Option> { let variant_attrs = self.parse_outer_attributes()?; - let vlo = self.token.span; - - let vis = self.parse_visibility(FollowedByType::No)?; - if !self.recover_nested_adt_item(kw::Enum)? { - return Ok(None); - } - let ident = self.parse_ident()?; - - let struct_def = if self.check(&token::OpenDelim(token::Brace)) { - // Parse a struct variant. - let (fields, recovered) = self.parse_record_struct_body()?; - VariantData::Struct(fields, recovered) - } else if self.check(&token::OpenDelim(token::Paren)) { - VariantData::Tuple(self.parse_tuple_struct_body()?, DUMMY_NODE_ID) - } else { - VariantData::Unit(DUMMY_NODE_ID) - }; - - let disr_expr = - if self.eat(&token::Eq) { Some(self.parse_anon_const_expr()?) } else { None }; + self.collect_tokens_trailing_token( + variant_attrs, + ForceCollect::No, + |this, variant_attrs| { + let vlo = this.token.span; + + let vis = this.parse_visibility(FollowedByType::No)?; + if !this.recover_nested_adt_item(kw::Enum)? { + return Ok((None, TrailingToken::None)); + } + let ident = this.parse_ident()?; + + let struct_def = if this.check(&token::OpenDelim(token::Brace)) { + // Parse a struct variant. + let (fields, recovered) = this.parse_record_struct_body()?; + VariantData::Struct(fields, recovered) + } else if this.check(&token::OpenDelim(token::Paren)) { + VariantData::Tuple(this.parse_tuple_struct_body()?, DUMMY_NODE_ID) + } else { + VariantData::Unit(DUMMY_NODE_ID) + }; - let vr = ast::Variant { - ident, - vis, - id: DUMMY_NODE_ID, - attrs: variant_attrs, - data: struct_def, - disr_expr, - span: vlo.to(self.prev_token.span), - is_placeholder: false, - }; + let disr_expr = + if this.eat(&token::Eq) { Some(this.parse_anon_const_expr()?) } else { None }; + + let vr = ast::Variant { + ident, + vis, + id: DUMMY_NODE_ID, + attrs: variant_attrs, + data: struct_def, + disr_expr, + span: vlo.to(this.prev_token.span), + is_placeholder: false, + }; - Ok(Some(vr)) + Ok((Some(vr), TrailingToken::MaybeComma)) + }, + ) } /// Parses `struct Foo { ... }`. @@ -1225,14 +1232,12 @@ impl<'a> Parser<'a> { Ok((class_name, ItemKind::Union(vdata, generics))) } - fn parse_record_struct_body( - &mut self, - ) -> PResult<'a, (Vec, /* recovered */ bool)> { + fn parse_record_struct_body(&mut self) -> PResult<'a, (Vec, /* recovered */ bool)> { let mut fields = Vec::new(); let mut recovered = false; if self.eat(&token::OpenDelim(token::Brace)) { while self.token != token::CloseDelim(token::Brace) { - let field = self.parse_struct_decl_field().map_err(|e| { + let field = self.parse_field_def().map_err(|e| { self.consume_block(token::Brace, ConsumeClosingDelim::No); recovered = true; e @@ -1257,33 +1262,41 @@ impl<'a> Parser<'a> { Ok((fields, recovered)) } - fn parse_tuple_struct_body(&mut self) -> PResult<'a, Vec> { + fn parse_tuple_struct_body(&mut self) -> PResult<'a, Vec> { // This is the case where we find `struct Foo(T) where T: Copy;` // Unit like structs are handled in parse_item_struct function self.parse_paren_comma_seq(|p| { let attrs = p.parse_outer_attributes()?; - let lo = p.token.span; - let vis = p.parse_visibility(FollowedByType::Yes)?; - let ty = p.parse_ty()?; - Ok(StructField { - span: lo.to(ty.span), - vis, - ident: None, - id: DUMMY_NODE_ID, - ty, - attrs, - is_placeholder: false, + p.collect_tokens_trailing_token(attrs, ForceCollect::No, |p, attrs| { + let lo = p.token.span; + let vis = p.parse_visibility(FollowedByType::Yes)?; + let ty = p.parse_ty()?; + + Ok(( + FieldDef { + span: lo.to(ty.span), + vis, + ident: None, + id: DUMMY_NODE_ID, + ty, + attrs, + is_placeholder: false, + }, + TrailingToken::MaybeComma, + )) }) }) .map(|(r, _)| r) } /// Parses an element of a struct declaration. - fn parse_struct_decl_field(&mut self) -> PResult<'a, StructField> { + fn parse_field_def(&mut self) -> PResult<'a, FieldDef> { let attrs = self.parse_outer_attributes()?; - let lo = self.token.span; - let vis = self.parse_visibility(FollowedByType::No)?; - self.parse_single_struct_field(lo, vis, attrs) + self.collect_tokens_trailing_token(attrs, ForceCollect::No, |this, attrs| { + let lo = this.token.span; + let vis = this.parse_visibility(FollowedByType::No)?; + Ok((this.parse_single_struct_field(lo, vis, attrs)?, TrailingToken::None)) + }) } /// Parses a structure field declaration. @@ -1292,7 +1305,7 @@ impl<'a> Parser<'a> { lo: Span, vis: Visibility, attrs: Vec, - ) -> PResult<'a, StructField> { + ) -> PResult<'a, FieldDef> { let mut seen_comma: bool = false; let a_var = self.parse_name_and_ty(lo, vis, attrs)?; if self.token == token::Comma { @@ -1384,11 +1397,11 @@ impl<'a> Parser<'a> { lo: Span, vis: Visibility, attrs: Vec, - ) -> PResult<'a, StructField> { + ) -> PResult<'a, FieldDef> { let name = self.parse_ident_common(false)?; self.expect(&token::Colon)?; let ty = self.parse_ty()?; - Ok(StructField { + Ok(FieldDef { span: lo.to(self.prev_token.span), ident: Some(name), vis, @@ -1461,15 +1474,7 @@ impl<'a> Parser<'a> { let vstr = pprust::vis_to_string(vis); let vstr = vstr.trim_end(); if macro_rules { - let msg = format!("can't qualify macro_rules invocation with `{}`", vstr); - self.struct_span_err(vis.span, &msg) - .span_suggestion( - vis.span, - "try exporting the macro", - "#[macro_export]".to_owned(), - Applicability::MaybeIncorrect, // speculative - ) - .emit(); + self.sess.gated_spans.gate(sym::pub_macro_rules, vis.span); } else { self.struct_span_err(vis.span, "can't qualify macro invocation with `pub`") .span_suggestion( @@ -1630,18 +1635,27 @@ impl<'a> Parser<'a> { } /// Is the current token the start of an `FnHeader` / not a valid parse? - pub(super) fn check_fn_front_matter(&mut self) -> bool { + /// + /// `check_pub` adds additional `pub` to the checks in case users place it + /// wrongly, can be used to ensure `pub` never comes after `default`. + pub(super) fn check_fn_front_matter(&mut self, check_pub: bool) -> bool { // We use an over-approximation here. // `const const`, `fn const` won't parse, but we're not stepping over other syntax either. - const QUALS: [Symbol; 4] = [kw::Const, kw::Async, kw::Unsafe, kw::Extern]; + // `pub` is added in case users got confused with the ordering like `async pub fn`, + // only if it wasn't preceeded by `default` as `default pub` is invalid. + let quals: &[Symbol] = if check_pub { + &[kw::Pub, kw::Const, kw::Async, kw::Unsafe, kw::Extern] + } else { + &[kw::Const, kw::Async, kw::Unsafe, kw::Extern] + }; self.check_keyword(kw::Fn) // Definitely an `fn`. // `$qual fn` or `$qual $qual`: - || QUALS.iter().any(|&kw| self.check_keyword(kw)) + || quals.iter().any(|&kw| self.check_keyword(kw)) && self.look_ahead(1, |t| { // `$qual fn`, e.g. `const fn` or `async fn`. t.is_keyword(kw::Fn) // Two qualifiers `$qual $qual` is enough, e.g. `async unsafe`. - || t.is_non_raw_ident_where(|i| QUALS.contains(&i.name) + || t.is_non_raw_ident_where(|i| quals.contains(&i.name) // Rule out 2015 `const async: T = val`. && i.is_reserved() // Rule out unsafe extern block. @@ -1662,10 +1676,11 @@ impl<'a> Parser<'a> { /// FnFrontMatter = FnQual "fn" ; /// ``` pub(super) fn parse_fn_front_matter(&mut self) -> PResult<'a, FnHeader> { + let sp_start = self.token.span; let constness = self.parse_constness(); let asyncness = self.parse_asyncness(); let unsafety = self.parse_unsafety(); - let ext = self.parse_extern()?; + let ext = self.parse_extern(); if let Async::Yes { span, .. } = asyncness { self.ban_async_in_2015(span); @@ -1675,8 +1690,27 @@ impl<'a> Parser<'a> { // It is possible for `expect_one_of` to recover given the contents of // `self.expected_tokens`, therefore, do not use `self.unexpected()` which doesn't // account for this. - if !self.expect_one_of(&[], &[])? { - unreachable!() + match self.expect_one_of(&[], &[]) { + Ok(true) => {} + Ok(false) => unreachable!(), + Err(mut err) => { + // Recover incorrect visibility order such as `async pub`. + if self.check_keyword(kw::Pub) { + let sp = sp_start.to(self.prev_token.span); + if let Ok(snippet) = self.span_to_snippet(sp) { + let vis = self.parse_visibility(FollowedByType::No)?; + let vs = pprust::vis_to_string(&vis); + let vs = vs.trim_end(); + err.span_suggestion( + sp_start.to(self.prev_token.span), + &format!("visibility `{}` must come before `{}`", vs, snippet), + format!("{} {}", vs, snippet), + Applicability::MachineApplicable, + ); + } + } + return Err(err); + } } } @@ -1736,74 +1770,80 @@ impl<'a> Parser<'a> { fn parse_param_general(&mut self, req_name: ReqName, first_param: bool) -> PResult<'a, Param> { let lo = self.token.span; let attrs = self.parse_outer_attributes()?; + self.collect_tokens_trailing_token(attrs, ForceCollect::No, |this, attrs| { + // Possibly parse `self`. Recover if we parsed it and it wasn't allowed here. + if let Some(mut param) = this.parse_self_param()? { + param.attrs = attrs.into(); + let res = if first_param { Ok(param) } else { this.recover_bad_self_param(param) }; + return Ok((res?, TrailingToken::None)); + } - // Possibly parse `self`. Recover if we parsed it and it wasn't allowed here. - if let Some(mut param) = self.parse_self_param()? { - param.attrs = attrs.into(); - return if first_param { Ok(param) } else { self.recover_bad_self_param(param) }; - } - - let is_name_required = match self.token.kind { - token::DotDotDot => false, - _ => req_name(self.token.span.edition()), - }; - let (pat, ty) = if is_name_required || self.is_named_param() { - debug!("parse_param_general parse_pat (is_name_required:{})", is_name_required); + let is_name_required = match this.token.kind { + token::DotDotDot => false, + _ => req_name(this.token.span.edition()), + }; + let (pat, ty) = if is_name_required || this.is_named_param() { + debug!("parse_param_general parse_pat (is_name_required:{})", is_name_required); + + let (pat, colon) = this.parse_fn_param_pat_colon()?; + if !colon { + let mut err = this.unexpected::<()>().unwrap_err(); + return if let Some(ident) = + this.parameter_without_type(&mut err, pat, is_name_required, first_param) + { + err.emit(); + Ok((dummy_arg(ident), TrailingToken::None)) + } else { + Err(err) + }; + } - let pat = self.parse_fn_param_pat()?; - if let Err(mut err) = self.expect(&token::Colon) { - return if let Some(ident) = - self.parameter_without_type(&mut err, pat, is_name_required, first_param) + this.eat_incorrect_doc_comment_for_param_type(); + (pat, this.parse_ty_for_param()?) + } else { + debug!("parse_param_general ident_to_pat"); + let parser_snapshot_before_ty = this.clone(); + this.eat_incorrect_doc_comment_for_param_type(); + let mut ty = this.parse_ty_for_param(); + if ty.is_ok() + && this.token != token::Comma + && this.token != token::CloseDelim(token::Paren) { - err.emit(); - Ok(dummy_arg(ident)) - } else { - Err(err) - }; - } - - self.eat_incorrect_doc_comment_for_param_type(); - (pat, self.parse_ty_for_param()?) - } else { - debug!("parse_param_general ident_to_pat"); - let parser_snapshot_before_ty = self.clone(); - self.eat_incorrect_doc_comment_for_param_type(); - let mut ty = self.parse_ty_for_param(); - if ty.is_ok() - && self.token != token::Comma - && self.token != token::CloseDelim(token::Paren) - { - // This wasn't actually a type, but a pattern looking like a type, - // so we are going to rollback and re-parse for recovery. - ty = self.unexpected(); - } - match ty { - Ok(ty) => { - let ident = Ident::new(kw::Empty, self.prev_token.span); - let bm = BindingMode::ByValue(Mutability::Not); - let pat = self.mk_pat_ident(ty.span, bm, ident); - (pat, ty) + // This wasn't actually a type, but a pattern looking like a type, + // so we are going to rollback and re-parse for recovery. + ty = this.unexpected(); } - // If this is a C-variadic argument and we hit an error, return the error. - Err(err) if self.token == token::DotDotDot => return Err(err), - // Recover from attempting to parse the argument as a type without pattern. - Err(mut err) => { - err.cancel(); - *self = parser_snapshot_before_ty; - self.recover_arg_parse()? + match ty { + Ok(ty) => { + let ident = Ident::new(kw::Empty, this.prev_token.span); + let bm = BindingMode::ByValue(Mutability::Not); + let pat = this.mk_pat_ident(ty.span, bm, ident); + (pat, ty) + } + // If this is a C-variadic argument and we hit an error, return the error. + Err(err) if this.token == token::DotDotDot => return Err(err), + // Recover from attempting to parse the argument as a type without pattern. + Err(mut err) => { + err.cancel(); + *this = parser_snapshot_before_ty; + this.recover_arg_parse()? + } } - } - }; - - let span = lo.until(self.token.span); + }; - Ok(Param { - attrs: attrs.into(), - id: ast::DUMMY_NODE_ID, - is_placeholder: false, - pat, - span, - ty, + let span = lo.until(this.token.span); + + Ok(( + Param { + attrs: attrs.into(), + id: ast::DUMMY_NODE_ID, + is_placeholder: false, + pat, + span, + ty, + }, + TrailingToken::None, + )) }) } diff --git a/compiler/rustc_parse/src/parser/mod.rs b/compiler/rustc_parse/src/parser/mod.rs index e2af63d174..4cc2224d27 100644 --- a/compiler/rustc_parse/src/parser/mod.rs +++ b/compiler/rustc_parse/src/parser/mod.rs @@ -1,4 +1,5 @@ pub mod attr; +mod attr_wrapper; mod diagnostics; mod expr; mod generics; @@ -10,16 +11,18 @@ mod stmt; mod ty; use crate::lexer::UnmatchedBrace; +pub use attr_wrapper::AttrWrapper; pub use diagnostics::AttemptLocalParseRecovery; use diagnostics::Error; +pub use pat::{GateOr, RecoverComma}; pub use path::PathStyle; use rustc_ast::ptr::P; use rustc_ast::token::{self, DelimToken, Token, TokenKind}; -use rustc_ast::tokenstream::{self, DelimSpan, LazyTokenStream, Spacing}; -use rustc_ast::tokenstream::{CreateTokenStream, TokenStream, TokenTree, TreeAndSpacing}; +use rustc_ast::tokenstream::{self, DelimSpan, Spacing}; +use rustc_ast::tokenstream::{TokenStream, TokenTree, TreeAndSpacing}; use rustc_ast::DUMMY_NODE_ID; -use rustc_ast::{self as ast, AnonConst, AttrStyle, AttrVec, Const, CrateSugar, Extern, HasTokens}; +use rustc_ast::{self as ast, AnonConst, AstLike, AttrStyle, AttrVec, Const, CrateSugar, Extern}; use rustc_ast::{Async, Expr, ExprKind, MacArgs, MacDelimiter, Mutability, StrLit, Unsafe}; use rustc_ast::{Visibility, VisibilityKind}; use rustc_ast_pretty::pprust; @@ -64,6 +67,9 @@ pub enum ForceCollect { pub enum TrailingToken { None, Semi, + /// If the trailing token is a comma, then capture it + /// Otherwise, ignore the trailing token + MaybeComma, } /// Like `maybe_whole_expr`, but for things other than expressions. @@ -944,7 +950,7 @@ impl<'a> Parser<'a> { self.bump(); Ok(Ident::new(symbol, self.prev_token.span)) } else { - self.parse_ident_common(false) + self.parse_ident_common(true) } } @@ -981,7 +987,7 @@ impl<'a> Parser<'a> { } // Collect tokens because they are used during lowering to HIR. - let expr = self.collect_tokens(|this| this.parse_expr())?; + let expr = self.collect_tokens_no_attrs(|this| this.parse_expr())?; let span = expr.span; match &expr.kind { @@ -1004,12 +1010,12 @@ impl<'a> Parser<'a> { fn parse_or_use_outer_attributes( &mut self, - already_parsed_attrs: Option, - ) -> PResult<'a, AttrVec> { + already_parsed_attrs: Option, + ) -> PResult<'a, AttrWrapper> { if let Some(attrs) = already_parsed_attrs { Ok(attrs) } else { - self.parse_outer_attributes().map(|a| a.into()) + self.parse_outer_attributes() } } @@ -1196,12 +1202,8 @@ impl<'a> Parser<'a> { } /// Parses `extern string_literal?`. - fn parse_extern(&mut self) -> PResult<'a, Extern> { - Ok(if self.eat_keyword(kw::Extern) { - Extern::from_abi(self.parse_abi()) - } else { - Extern::None - }) + fn parse_extern(&mut self) -> Extern { + if self.eat_keyword(kw::Extern) { Extern::from_abi(self.parse_abi()) } else { Extern::None } } /// Parses a string literal as an ABI spec. @@ -1226,97 +1228,17 @@ impl<'a> Parser<'a> { } } - pub fn collect_tokens( + pub fn collect_tokens_no_attrs( &mut self, f: impl FnOnce(&mut Self) -> PResult<'a, R>, ) -> PResult<'a, R> { - self.collect_tokens_trailing_token(|this| Ok((f(this)?, TrailingToken::None))) - } - - /// Records all tokens consumed by the provided callback, - /// including the current token. These tokens are collected - /// into a `LazyTokenStream`, and returned along with the result - /// of the callback. - /// - /// Note: If your callback consumes an opening delimiter - /// (including the case where you call `collect_tokens` - /// when the current token is an opening delimeter), - /// you must also consume the corresponding closing delimiter. - /// - /// That is, you can consume - /// `something ([{ }])` or `([{}])`, but not `([{}]` - /// - /// This restriction shouldn't be an issue in practice, - /// since this function is used to record the tokens for - /// a parsed AST item, which always has matching delimiters. - pub fn collect_tokens_trailing_token( - &mut self, - f: impl FnOnce(&mut Self) -> PResult<'a, (R, TrailingToken)>, - ) -> PResult<'a, R> { - let start_token = (self.token.clone(), self.token_spacing); - let cursor_snapshot = self.token_cursor.clone(); - - let (mut ret, trailing_token) = f(self)?; - - // Produces a `TokenStream` on-demand. Using `cursor_snapshot` - // and `num_calls`, we can reconstruct the `TokenStream` seen - // by the callback. This allows us to avoid producing a `TokenStream` - // if it is never needed - for example, a captured `macro_rules!` - // argument that is never passed to a proc macro. - // In practice token stream creation happens rarely compared to - // calls to `collect_tokens` (see some statistics in #78736), - // so we are doing as little up-front work as possible. - // - // This also makes `Parser` very cheap to clone, since - // there is no intermediate collection buffer to clone. - #[derive(Clone)] - struct LazyTokenStreamImpl { - start_token: (Token, Spacing), - cursor_snapshot: TokenCursor, - num_calls: usize, - desugar_doc_comments: bool, - append_unglued_token: Option, - } - impl CreateTokenStream for LazyTokenStreamImpl { - fn create_token_stream(&self) -> TokenStream { - // The token produced by the final call to `next` or `next_desugared` - // was not actually consumed by the callback. The combination - // of chaining the initial token and using `take` produces the desired - // result - we produce an empty `TokenStream` if no calls were made, - // and omit the final token otherwise. - let mut cursor_snapshot = self.cursor_snapshot.clone(); - let tokens = std::iter::once(self.start_token.clone()) - .chain((0..self.num_calls).map(|_| { - if self.desugar_doc_comments { - cursor_snapshot.next_desugared() - } else { - cursor_snapshot.next() - } - })) - .take(self.num_calls); - - make_token_stream(tokens, self.append_unglued_token.clone()) - } - } - - let mut num_calls = self.token_cursor.num_next_calls - cursor_snapshot.num_next_calls; - match trailing_token { - TrailingToken::None => {} - TrailingToken::Semi => { - assert_eq!(self.token.kind, token::Semi); - num_calls += 1; - } - } - - let lazy_impl = LazyTokenStreamImpl { - start_token, - num_calls, - cursor_snapshot, - desugar_doc_comments: self.desugar_doc_comments, - append_unglued_token: self.token_cursor.append_unglued_token.clone(), - }; - ret.finalize_tokens(LazyTokenStream::new(lazy_impl)); - Ok(ret) + // The only reason to call `collect_tokens_no_attrs` is if you want tokens, so use + // `ForceCollect::Yes` + self.collect_tokens_trailing_token( + AttrWrapper::empty(), + ForceCollect::Yes, + |this, _attrs| Ok((f(this)?, TrailingToken::None)), + ) } /// `::{` or `::*` @@ -1365,60 +1287,3 @@ pub fn emit_unclosed_delims(unclosed_delims: &mut Vec, sess: &Pa } } } - -/// Converts a flattened iterator of tokens (including open and close delimiter tokens) -/// into a `TokenStream`, creating a `TokenTree::Delimited` for each matching pair -/// of open and close delims. -fn make_token_stream( - tokens: impl Iterator, - append_unglued_token: Option, -) -> TokenStream { - #[derive(Debug)] - struct FrameData { - open: Span, - inner: Vec<(TokenTree, Spacing)>, - } - let mut stack = vec![FrameData { open: DUMMY_SP, inner: vec![] }]; - for (token, spacing) in tokens { - match token { - Token { kind: TokenKind::OpenDelim(_), span } => { - stack.push(FrameData { open: span, inner: vec![] }); - } - Token { kind: TokenKind::CloseDelim(delim), span } => { - let frame_data = stack.pop().expect("Token stack was empty!"); - let dspan = DelimSpan::from_pair(frame_data.open, span); - let stream = TokenStream::new(frame_data.inner); - let delimited = TokenTree::Delimited(dspan, delim, stream); - stack - .last_mut() - .unwrap_or_else(|| panic!("Bottom token frame is missing for tokens!")) - .inner - .push((delimited, Spacing::Alone)); - } - token => { - stack - .last_mut() - .expect("Bottom token frame is missing!") - .inner - .push((TokenTree::Token(token), spacing)); - } - } - } - let mut final_buf = stack.pop().expect("Missing final buf!"); - final_buf.inner.extend(append_unglued_token); - assert!(stack.is_empty(), "Stack should be empty: final_buf={:?} stack={:?}", final_buf, stack); - TokenStream::new(final_buf.inner) -} - -#[macro_export] -macro_rules! maybe_collect_tokens { - ($self:ident, $force_collect:expr, $attrs:expr, $f:expr) => { - if matches!($force_collect, ForceCollect::Yes) - || $crate::parser::attr::maybe_needs_tokens($attrs) - { - $self.collect_tokens_trailing_token($f) - } else { - Ok($f($self)?.0) - } - }; -} diff --git a/compiler/rustc_parse/src/parser/nonterminal.rs b/compiler/rustc_parse/src/parser/nonterminal.rs index 6e25209f09..a84ae51514 100644 --- a/compiler/rustc_parse/src/parser/nonterminal.rs +++ b/compiler/rustc_parse/src/parser/nonterminal.rs @@ -108,7 +108,9 @@ impl<'a> Parser<'a> { } }, NonterminalKind::Block => { - token::NtBlock(self.collect_tokens(|this| this.parse_block())?) + // While a block *expression* may have attributes (e.g. `#[my_attr] { ... }`), + // the ':block' matcher does not support them + token::NtBlock(self.collect_tokens_no_attrs(|this| this.parse_block())?) } NonterminalKind::Stmt => match self.parse_stmt(ForceCollect::Yes)? { Some(s) => token::NtStmt(s), @@ -117,19 +119,41 @@ impl<'a> Parser<'a> { } }, NonterminalKind::Pat2018 { .. } | NonterminalKind::Pat2021 { .. } => { - token::NtPat(self.collect_tokens(|this| match kind { - NonterminalKind::Pat2018 { .. } => this.parse_pat(None), + token::NtPat(self.collect_tokens_no_attrs(|this| match kind { + NonterminalKind::Pat2018 { .. } => this.parse_pat_no_top_alt(None), NonterminalKind::Pat2021 { .. } => { - this.parse_top_pat(GateOr::Yes, RecoverComma::No) + this.parse_pat_allow_top_alt(None, GateOr::Yes, RecoverComma::No) } _ => unreachable!(), })?) } - NonterminalKind::Expr => token::NtExpr(self.collect_tokens(|this| this.parse_expr())?), + + // If there are attributes present, then `parse_expr` will end up collecting tokens, + // turning the outer `collect_tokens_no_attrs` into a no-op due to the already present + // tokens. If there are *not* attributes present, then the outer + // `collect_tokens_no_attrs` will ensure that we will end up collecting tokens for the + // expressions. + // + // This is less efficient than it could be, since the outer `collect_tokens_no_attrs` + // still needs to snapshot the `TokenCursor` before calling `parse_expr`, even when + // `parse_expr` will end up collecting tokens. Ideally, this would work more like + // `parse_item`, and take in a `ForceCollect` parameter. However, this would require + // adding a `ForceCollect` parameter in a bunch of places in expression parsing + // for little gain. If the perf impact from this turns out to be noticeable, we should + // revisit this apporach. + NonterminalKind::Expr => { + token::NtExpr(self.collect_tokens_no_attrs(|this| this.parse_expr())?) + } NonterminalKind::Literal => { - token::NtLiteral(self.collect_tokens(|this| this.parse_literal_maybe_minus())?) + // The `:literal` matcher does not support attributes + token::NtLiteral( + self.collect_tokens_no_attrs(|this| this.parse_literal_maybe_minus())?, + ) + } + + NonterminalKind::Ty => { + token::NtTy(self.collect_tokens_no_attrs(|this| this.parse_ty())?) } - NonterminalKind::Ty => token::NtTy(self.collect_tokens(|this| this.parse_ty())?), // this could be handled like a token, since it is one NonterminalKind::Ident => { if let Some((ident, is_raw)) = get_macro_ident(&self.token) { @@ -141,15 +165,15 @@ impl<'a> Parser<'a> { return Err(self.struct_span_err(self.token.span, msg)); } } - NonterminalKind::Path => { - token::NtPath(self.collect_tokens(|this| this.parse_path(PathStyle::Type))?) - } + NonterminalKind::Path => token::NtPath( + self.collect_tokens_no_attrs(|this| this.parse_path(PathStyle::Type))?, + ), NonterminalKind::Meta => { - token::NtMeta(P(self.collect_tokens(|this| this.parse_attr_item(false))?)) + token::NtMeta(P(self.collect_tokens_no_attrs(|this| this.parse_attr_item(false))?)) } NonterminalKind::TT => token::NtTT(self.parse_token_tree()), NonterminalKind::Vis => token::NtVis( - self.collect_tokens(|this| this.parse_visibility(FollowedByType::Yes))?, + self.collect_tokens_no_attrs(|this| this.parse_visibility(FollowedByType::Yes))?, ), NonterminalKind::Lifetime => { if self.check_lifetime() { diff --git a/compiler/rustc_parse/src/parser/pat.rs b/compiler/rustc_parse/src/parser/pat.rs index d888514cf5..51c01f5a77 100644 --- a/compiler/rustc_parse/src/parser/pat.rs +++ b/compiler/rustc_parse/src/parser/pat.rs @@ -1,9 +1,9 @@ -use super::{Parser, PathStyle}; +use super::{ForceCollect, Parser, PathStyle, TrailingToken}; use crate::{maybe_recover_from_interpolated_ty_qpath, maybe_whole}; use rustc_ast::mut_visit::{noop_visit_pat, MutVisitor}; use rustc_ast::ptr::P; use rustc_ast::token; -use rustc_ast::{self as ast, AttrVec, Attribute, FieldPat, MacCall, Pat, PatKind, RangeEnd}; +use rustc_ast::{self as ast, AttrVec, Attribute, MacCall, Pat, PatField, PatKind, RangeEnd}; use rustc_ast::{BindingMode, Expr, ExprKind, Mutability, Path, QSelf, RangeSyntax}; use rustc_ast_pretty::pprust; use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder, PResult}; @@ -19,98 +19,112 @@ const WHILE_PARSING_OR_MSG: &str = "while parsing this or-pattern starting here" /// Whether or not an or-pattern should be gated when occurring in the current context. #[derive(PartialEq, Clone, Copy)] -pub(super) enum GateOr { +pub enum GateOr { Yes, No, } /// Whether or not to recover a `,` when parsing or-patterns. #[derive(PartialEq, Copy, Clone)] -pub(super) enum RecoverComma { +pub enum RecoverComma { Yes, No, } +/// The result of `eat_or_separator`. We want to distinguish which case we are in to avoid +/// emitting duplicate diagnostics. +#[derive(Debug, Clone, Copy)] +enum EatOrResult { + /// We recovered from a trailing vert. + TrailingVert, + /// We ate an `|` (or `||` and recovered). + AteOr, + /// We did not eat anything (i.e. the current token is not `|` or `||`). + None, +} + impl<'a> Parser<'a> { /// Parses a pattern. /// /// Corresponds to `pat` in RFC 2535 and does not admit or-patterns /// at the top level. Used when parsing the parameters of lambda expressions, /// functions, function pointers, and `pat` macro fragments. - pub fn parse_pat(&mut self, expected: Expected) -> PResult<'a, P> { + pub fn parse_pat_no_top_alt(&mut self, expected: Expected) -> PResult<'a, P> { self.parse_pat_with_range_pat(true, expected) } - /// Entry point to the main pattern parser. + /// Parses a pattern. + /// /// Corresponds to `top_pat` in RFC 2535 and allows or-pattern at the top level. - pub(super) fn parse_top_pat( + /// Used for parsing patterns in all cases when `pat` is not used. + /// + /// Note that after the FCP in , + /// a leading vert is allowed in nested or-patterns, too. This allows us to + /// simplify the grammar somewhat. + pub fn parse_pat_allow_top_alt( &mut self, + expected: Expected, gate_or: GateOr, rc: RecoverComma, ) -> PResult<'a, P> { - // Allow a '|' before the pats (RFCs 1925, 2530, and 2535). - let gated_leading_vert = self.eat_or_separator(None) && gate_or == GateOr::Yes; - let leading_vert_span = self.prev_token.span; - - // Parse the possibly-or-pattern. - let pat = self.parse_pat_with_or(None, gate_or, rc)?; - - // If we parsed a leading `|` which should be gated, - // and no other gated or-pattern has been parsed thus far, - // then we should really gate the leading `|`. - // This complicated procedure is done purely for diagnostics UX. - if gated_leading_vert && self.sess.gated_spans.is_ungated(sym::or_patterns) { - self.sess.gated_spans.gate(sym::or_patterns, leading_vert_span); - } - - Ok(pat) + self.parse_pat_allow_top_alt_inner(expected, gate_or, rc).map(|(pat, _)| pat) } - /// Parse the pattern for a function or function pointer parameter. - /// Special recovery is provided for or-patterns and leading `|`. - pub(super) fn parse_fn_param_pat(&mut self) -> PResult<'a, P> { - self.recover_leading_vert(None, "not allowed in a parameter pattern"); - let pat = self.parse_pat_with_or(PARAM_EXPECTED, GateOr::No, RecoverComma::No)?; - - if let PatKind::Or(..) = &pat.kind { - self.ban_illegal_fn_param_or_pat(&pat); - } - - Ok(pat) - } - - /// Ban `A | B` immediately in a parameter pattern and suggest wrapping in parens. - fn ban_illegal_fn_param_or_pat(&self, pat: &Pat) { - let msg = "wrap the pattern in parenthesis"; - let fix = format!("({})", pprust::pat_to_string(pat)); - self.struct_span_err(pat.span, "an or-pattern parameter must be wrapped in parenthesis") - .span_suggestion(pat.span, msg, fix, Applicability::MachineApplicable) - .emit(); - } - - /// Parses a pattern, that may be a or-pattern (e.g. `Foo | Bar` in `Some(Foo | Bar)`). - /// Corresponds to `pat` in RFC 2535. - fn parse_pat_with_or( + /// Returns the pattern and a bool indicating whether we recovered from a trailing vert (true = + /// recovered). + fn parse_pat_allow_top_alt_inner( &mut self, expected: Expected, gate_or: GateOr, rc: RecoverComma, - ) -> PResult<'a, P> { + ) -> PResult<'a, (P, bool)> { + // Keep track of whether we recovered from a trailing vert so that we can avoid duplicated + // suggestions (which bothers rustfix). + // + // Allow a '|' before the pats (RFCs 1925, 2530, and 2535). + let (leading_vert_span, mut trailing_vert) = match self.eat_or_separator(None) { + EatOrResult::AteOr => (Some(self.prev_token.span), false), + EatOrResult::TrailingVert => (None, true), + EatOrResult::None => (None, false), + }; + // Parse the first pattern (`p_0`). - let first_pat = self.parse_pat(expected)?; + let first_pat = self.parse_pat_no_top_alt(expected)?; self.maybe_recover_unexpected_comma(first_pat.span, rc, gate_or)?; // If the next token is not a `|`, // this is not an or-pattern and we should exit here. if !self.check(&token::BinOp(token::Or)) && self.token != token::OrOr { - return Ok(first_pat); + // If we parsed a leading `|` which should be gated, + // then we should really gate the leading `|`. + // This complicated procedure is done purely for diagnostics UX. + if let Some(leading_vert_span) = leading_vert_span { + if gate_or == GateOr::Yes && self.sess.gated_spans.is_ungated(sym::or_patterns) { + self.sess.gated_spans.gate(sym::or_patterns, leading_vert_span); + } + + // If there was a leading vert, treat this as an or-pattern. This improves + // diagnostics. + let span = leading_vert_span.to(self.prev_token.span); + return Ok((self.mk_pat(span, PatKind::Or(vec![first_pat])), trailing_vert)); + } + + return Ok((first_pat, trailing_vert)); } // Parse the patterns `p_1 | ... | p_n` where `n > 0`. - let lo = first_pat.span; + let lo = leading_vert_span.unwrap_or(first_pat.span); let mut pats = vec![first_pat]; - while self.eat_or_separator(Some(lo)) { - let pat = self.parse_pat(expected).map_err(|mut err| { + loop { + match self.eat_or_separator(Some(lo)) { + EatOrResult::AteOr => {} + EatOrResult::None => break, + EatOrResult::TrailingVert => { + trailing_vert = true; + break; + } + } + let pat = self.parse_pat_no_top_alt(expected).map_err(|mut err| { err.span_label(lo, WHILE_PARSING_OR_MSG); err })?; @@ -124,24 +138,103 @@ impl<'a> Parser<'a> { self.sess.gated_spans.gate(sym::or_patterns, or_pattern_span); } - Ok(self.mk_pat(or_pattern_span, PatKind::Or(pats))) + Ok((self.mk_pat(or_pattern_span, PatKind::Or(pats)), trailing_vert)) + } + + /// Parse a pattern and (maybe) a `Colon` in positions where a pattern may be followed by a + /// type annotation (e.g. for `let` bindings or `fn` params). + /// + /// Generally, this corresponds to `pat_no_top_alt` followed by an optional `Colon`. It will + /// eat the `Colon` token if one is present. + /// + /// The return value represents the parsed pattern and `true` if a `Colon` was parsed (`false` + /// otherwise). + pub(super) fn parse_pat_before_ty( + &mut self, + expected: Expected, + gate_or: GateOr, + rc: RecoverComma, + syntax_loc: &str, + ) -> PResult<'a, (P, bool)> { + // We use `parse_pat_allow_top_alt` regardless of whether we actually want top-level + // or-patterns so that we can detect when a user tries to use it. This allows us to print a + // better error message. + let (pat, trailing_vert) = self.parse_pat_allow_top_alt_inner(expected, gate_or, rc)?; + let colon = self.eat(&token::Colon); + + if let PatKind::Or(pats) = &pat.kind { + let msg = format!("top-level or-patterns are not allowed in {}", syntax_loc); + let (help, fix) = if pats.len() == 1 { + // If all we have is a leading vert, then print a special message. This is the case + // if `parse_pat_allow_top_alt` returns an or-pattern with one variant. + let msg = "remove the `|`"; + let fix = pprust::pat_to_string(&pat); + (msg, fix) + } else { + let msg = "wrap the pattern in parentheses"; + let fix = format!("({})", pprust::pat_to_string(&pat)); + (msg, fix) + }; + + if trailing_vert { + // We already emitted an error and suggestion to remove the trailing vert. Don't + // emit again. + self.sess.span_diagnostic.delay_span_bug(pat.span, &msg); + } else { + self.struct_span_err(pat.span, &msg) + .span_suggestion(pat.span, help, fix, Applicability::MachineApplicable) + .emit(); + } + } + + Ok((pat, colon)) + } + + /// Parse the pattern for a function or function pointer parameter, followed by a colon. + /// + /// The return value represents the parsed pattern and `true` if a `Colon` was parsed (`false` + /// otherwise). + pub(super) fn parse_fn_param_pat_colon(&mut self) -> PResult<'a, (P, bool)> { + // In order to get good UX, we first recover in the case of a leading vert for an illegal + // top-level or-pat. Normally, this means recovering both `|` and `||`, but in this case, + // a leading `||` probably doesn't indicate an or-pattern attempt, so we handle that + // separately. + if let token::OrOr = self.token.kind { + let span = self.token.span; + let mut err = self.struct_span_err(span, "unexpected `||` before function parameter"); + err.span_suggestion( + span, + "remove the `||`", + String::new(), + Applicability::MachineApplicable, + ); + err.note("alternatives in or-patterns are separated with `|`, not `||`"); + err.emit(); + self.bump(); + } + + self.parse_pat_before_ty( + PARAM_EXPECTED, + GateOr::No, + RecoverComma::No, + "function parameters", + ) } /// Eat the or-pattern `|` separator. /// If instead a `||` token is encountered, recover and pretend we parsed `|`. - fn eat_or_separator(&mut self, lo: Option) -> bool { + fn eat_or_separator(&mut self, lo: Option) -> EatOrResult { if self.recover_trailing_vert(lo) { - return false; - } - - match self.token.kind { - token::OrOr => { - // Found `||`; Recover and pretend we parsed `|`. - self.ban_unexpected_or_or(lo); - self.bump(); - true - } - _ => self.eat(&token::BinOp(token::Or)), + EatOrResult::TrailingVert + } else if matches!(self.token.kind, token::OrOr) { + // Found `||`; Recover and pretend we parsed `|`. + self.ban_unexpected_or_or(lo); + self.bump(); + EatOrResult::AteOr + } else if self.eat(&token::BinOp(token::Or)) { + EatOrResult::AteOr + } else { + EatOrResult::None } } @@ -157,14 +250,14 @@ impl<'a> Parser<'a> { matches!( &token.uninterpolate().kind, token::FatArrow // e.g. `a | => 0,`. - | token::Ident(kw::If, false) // e.g. `a | if expr`. - | token::Eq // e.g. `let a | = 0`. - | token::Semi // e.g. `let a |;`. - | token::Colon // e.g. `let a | :`. - | token::Comma // e.g. `let (a |,)`. - | token::CloseDelim(token::Bracket) // e.g. `let [a | ]`. - | token::CloseDelim(token::Paren) // e.g. `let (a | )`. - | token::CloseDelim(token::Brace) // e.g. `let A { f: a | }`. + | token::Ident(kw::If, false) // e.g. `a | if expr`. + | token::Eq // e.g. `let a | = 0`. + | token::Semi // e.g. `let a |;`. + | token::Colon // e.g. `let a | :`. + | token::Comma // e.g. `let (a |,)`. + | token::CloseDelim(token::Bracket) // e.g. `let [a | ]`. + | token::CloseDelim(token::Paren) // e.g. `let (a | )`. + | token::CloseDelim(token::Brace) // e.g. `let A { f: a | }`. ) }); match (is_end_ahead, &self.token.kind) { @@ -179,7 +272,7 @@ impl<'a> Parser<'a> { /// We have parsed `||` instead of `|`. Error and suggest `|` instead. fn ban_unexpected_or_or(&mut self, lo: Option) { - let mut err = self.struct_span_err(self.token.span, "unexpected token `||` after pattern"); + let mut err = self.struct_span_err(self.token.span, "unexpected token `||` in pattern"); err.span_suggestion( self.token.span, "use a single `|` to separate multiple alternative patterns", @@ -244,7 +337,7 @@ impl<'a> Parser<'a> { /// sequence of patterns until `)` is reached. fn skip_pat_list(&mut self) -> PResult<'a, ()> { while !self.check(&token::CloseDelim(token::Paren)) { - self.parse_pat(None)?; + self.parse_pat_no_top_alt(None)?; if !self.eat(&token::Comma) { return Ok(()); } @@ -252,22 +345,6 @@ impl<'a> Parser<'a> { Ok(()) } - /// Recursive possibly-or-pattern parser with recovery for an erroneous leading `|`. - /// See `parse_pat_with_or` for details on parsing or-patterns. - fn parse_pat_with_or_inner(&mut self) -> PResult<'a, P> { - self.recover_leading_vert(None, "only allowed in a top-level pattern"); - self.parse_pat_with_or(None, GateOr::Yes, RecoverComma::No) - } - - /// Recover if `|` or `||` is here. - /// The user is thinking that a leading `|` is allowed in this position. - fn recover_leading_vert(&mut self, lo: Option, ctx: &str) { - if let token::BinOp(token::Or) | token::OrOr = self.token.kind { - self.ban_illegal_vert(lo, "leading", ctx); - self.bump(); - } - } - /// A `|` or possibly `||` token shouldn't be here. Ban it. fn ban_illegal_vert(&mut self, lo: Option, pos: &str, ctx: &str) { let span = self.token.span; @@ -305,8 +382,9 @@ impl<'a> Parser<'a> { self.parse_pat_tuple_or_parens()? } else if self.check(&token::OpenDelim(token::Bracket)) { // Parse `[pat, pat,...]` as a slice pattern. - let (pats, _) = - self.parse_delim_comma_seq(token::Bracket, |p| p.parse_pat_with_or_inner())?; + let (pats, _) = self.parse_delim_comma_seq(token::Bracket, |p| { + p.parse_pat_allow_top_alt(None, GateOr::Yes, RecoverComma::No) + })?; PatKind::Slice(pats) } else if self.check(&token::DotDot) && !self.is_pat_range_end_start(1) { // A rest pattern `..`. @@ -429,7 +507,7 @@ impl<'a> Parser<'a> { // At this point we attempt to parse `@ $pat_rhs` and emit an error. self.bump(); // `@` - let mut rhs = self.parse_pat(None)?; + let mut rhs = self.parse_pat_no_top_alt(None)?; let sp = lhs.span.to(rhs.span); if let PatKind::Ident(_, _, ref mut sub @ None) = rhs.kind { @@ -518,8 +596,9 @@ impl<'a> Parser<'a> { /// Parse a tuple or parenthesis pattern. fn parse_pat_tuple_or_parens(&mut self) -> PResult<'a, PatKind> { - let (fields, trailing_comma) = - self.parse_paren_comma_seq(|p| p.parse_pat_with_or_inner())?; + let (fields, trailing_comma) = self.parse_paren_comma_seq(|p| { + p.parse_pat_allow_top_alt(None, GateOr::Yes, RecoverComma::No) + })?; // Here, `(pat,)` is a tuple pattern. // For backward compatibility, `(..)` is a tuple pattern as well. @@ -548,7 +627,7 @@ impl<'a> Parser<'a> { } // Parse the pattern we hope to be an identifier. - let mut pat = self.parse_pat(Some("identifier"))?; + let mut pat = self.parse_pat_no_top_alt(Some("identifier"))?; // If we don't have `mut $ident (@ pat)?`, error. if let PatKind::Ident(BindingMode::ByValue(m @ Mutability::Not), ..) = &mut pat.kind { @@ -793,7 +872,7 @@ impl<'a> Parser<'a> { fn parse_pat_ident(&mut self, binding_mode: BindingMode) -> PResult<'a, PatKind> { let ident = self.parse_ident()?; let sub = if self.eat(&token::At) { - Some(self.parse_pat(Some("binding pattern"))?) + Some(self.parse_pat_no_top_alt(Some("binding pattern"))?) } else { None }; @@ -832,7 +911,9 @@ impl<'a> Parser<'a> { if qself.is_some() { return self.error_qpath_before_pat(&path, "("); } - let (fields, _) = self.parse_paren_comma_seq(|p| p.parse_pat_with_or_inner())?; + let (fields, _) = self.parse_paren_comma_seq(|p| { + p.parse_pat_allow_top_alt(None, GateOr::Yes, RecoverComma::No) + })?; Ok(PatKind::TupleStruct(path, fields)) } @@ -847,7 +928,7 @@ impl<'a> Parser<'a> { } /// Parses the fields of a struct-like pattern. - fn parse_pat_fields(&mut self) -> PResult<'a, (Vec, bool)> { + fn parse_pat_fields(&mut self) -> PResult<'a, (Vec, bool)> { let mut fields = Vec::new(); let mut etc = false; let mut ate_comma = true; @@ -938,16 +1019,24 @@ impl<'a> Parser<'a> { } } - fields.push(match self.parse_pat_field(lo, attrs) { - Ok(field) => field, - Err(err) => { - if let Some(mut delayed_err) = delayed_err { - delayed_err.emit(); - } - return Err(err); - } - }); - ate_comma = self.eat(&token::Comma); + let field = + self.collect_tokens_trailing_token(attrs, ForceCollect::No, |this, attrs| { + let field = match this.parse_pat_field(lo, attrs) { + Ok(field) => Ok(field), + Err(err) => { + if let Some(mut delayed_err) = delayed_err.take() { + delayed_err.emit(); + } + return Err(err); + } + }?; + ate_comma = this.eat(&token::Comma); + // We just ate a comma, so there's no need to use + // `TrailingToken::Comma` + Ok((field, TrailingToken::None)) + })?; + + fields.push(field) } if let Some(mut err) = delayed_err { @@ -983,14 +1072,14 @@ impl<'a> Parser<'a> { .emit(); } - fn parse_pat_field(&mut self, lo: Span, attrs: Vec) -> PResult<'a, FieldPat> { + fn parse_pat_field(&mut self, lo: Span, attrs: Vec) -> PResult<'a, PatField> { // Check if a colon exists one ahead. This means we're parsing a fieldname. let hi; let (subpat, fieldname, is_shorthand) = if self.look_ahead(1, |t| t == &token::Colon) { // Parsing a pattern of the form `fieldname: pat`. let fieldname = self.parse_field_name()?; self.bump(); - let pat = self.parse_pat_with_or_inner()?; + let pat = self.parse_pat_allow_top_alt(None, GateOr::Yes, RecoverComma::No)?; hi = pat.span; (pat, fieldname, false) } else { @@ -999,7 +1088,7 @@ impl<'a> Parser<'a> { let boxed_span = self.token.span; let is_ref = self.eat_keyword(kw::Ref); let is_mut = self.eat_keyword(kw::Mut); - let fieldname = self.parse_ident()?; + let fieldname = self.parse_field_name()?; hi = self.prev_token.span; let bind_type = match (is_ref, is_mut) { @@ -1015,7 +1104,7 @@ impl<'a> Parser<'a> { (subpat, fieldname, true) }; - Ok(FieldPat { + Ok(PatField { ident: fieldname, pat: subpat, is_shorthand, diff --git a/compiler/rustc_parse/src/parser/path.rs b/compiler/rustc_parse/src/parser/path.rs index 6b7059eecf..9cc600d9ed 100644 --- a/compiler/rustc_parse/src/parser/path.rs +++ b/compiler/rustc_parse/src/parser/path.rs @@ -545,7 +545,7 @@ impl<'a> Parser<'a> { /// Parse a generic argument in a path segment. /// This does not include constraints, e.g., `Item = u8`, which is handled in `parse_angle_arg`. - fn parse_generic_arg(&mut self) -> PResult<'a, Option> { + pub(super) fn parse_generic_arg(&mut self) -> PResult<'a, Option> { let start = self.token.span; let arg = if self.check_lifetime() && self.look_ahead(1, |t| !t.is_like_plus()) { // Parse lifetime argument. diff --git a/compiler/rustc_parse/src/parser/stmt.rs b/compiler/rustc_parse/src/parser/stmt.rs index 8373f6acd7..92e67e7929 100644 --- a/compiler/rustc_parse/src/parser/stmt.rs +++ b/compiler/rustc_parse/src/parser/stmt.rs @@ -3,16 +3,18 @@ use super::diagnostics::{AttemptLocalParseRecovery, Error}; use super::expr::LhsExpr; use super::pat::{GateOr, RecoverComma}; use super::path::PathStyle; -use super::{BlockMode, ForceCollect, Parser, Restrictions, SemiColonMode, TrailingToken}; -use crate::{maybe_collect_tokens, maybe_whole}; +use super::TrailingToken; +use super::{AttrWrapper, BlockMode, ForceCollect, Parser, Restrictions, SemiColonMode}; +use crate::maybe_whole; use rustc_ast as ast; -use rustc_ast::attr::HasAttrs; use rustc_ast::ptr::P; use rustc_ast::token::{self, TokenKind}; use rustc_ast::util::classify; +use rustc_ast::AstLike; use rustc_ast::{AttrStyle, AttrVec, Attribute, MacCall, MacCallStmt, MacStmtStyle}; -use rustc_ast::{Block, BlockCheckMode, Expr, ExprKind, Local, Stmt, StmtKind, DUMMY_NODE_ID}; +use rustc_ast::{Block, BlockCheckMode, Expr, ExprKind, Local, Stmt}; +use rustc_ast::{StmtKind, DUMMY_NODE_ID}; use rustc_errors::{Applicability, PResult}; use rustc_span::source_map::{BytePos, Span}; use rustc_span::symbol::{kw, sym}; @@ -33,35 +35,52 @@ impl<'a> Parser<'a> { /// If `force_capture` is true, forces collection of tokens regardless of whether /// or not we have attributes - fn parse_stmt_without_recovery( + crate fn parse_stmt_without_recovery( &mut self, capture_semi: bool, force_collect: ForceCollect, ) -> PResult<'a, Option> { - let mut attrs = self.parse_outer_attributes()?; + let attrs = self.parse_outer_attributes()?; let lo = self.token.span; - maybe_whole!(self, NtStmt, |stmt| { - let mut stmt = stmt; - stmt.visit_attrs(|stmt_attrs| { - mem::swap(stmt_attrs, &mut attrs); - stmt_attrs.extend(attrs); - }); - Some(stmt) - }); + // Don't use `maybe_whole` so that we have precise control + // over when we bump the parser + if let token::Interpolated(nt) = &self.token.kind { + if let token::NtStmt(stmt) = &**nt { + let mut stmt = stmt.clone(); + return self.collect_tokens_trailing_token( + attrs, + force_collect, + |this, mut attrs| { + stmt.visit_attrs(|stmt_attrs| { + mem::swap(stmt_attrs, &mut attrs); + stmt_attrs.extend(attrs); + }); + // Make sure we capture the token::Interpolated + this.bump(); + Ok((Some(stmt), TrailingToken::None)) + }, + ); + } + } Ok(Some(if self.token.is_keyword(kw::Let) { - self.parse_local_mk(lo, attrs.into(), capture_semi, force_collect)? + self.parse_local_mk(lo, attrs, capture_semi, force_collect)? } else if self.is_kw_followed_by_ident(kw::Mut) { - self.recover_stmt_local(lo, attrs.into(), "missing keyword", "let mut")? + self.recover_stmt_local( + lo, + attrs.take_for_recovery().into(), + "missing keyword", + "let mut", + )? } else if self.is_kw_followed_by_ident(kw::Auto) { self.bump(); // `auto` let msg = "write `let` instead of `auto` to introduce a new variable"; - self.recover_stmt_local(lo, attrs.into(), msg, "let")? + self.recover_stmt_local(lo, attrs.take_for_recovery().into(), msg, "let")? } else if self.is_kw_followed_by_ident(sym::var) { self.bump(); // `var` let msg = "write `let` instead of `var` to introduce a new variable"; - self.recover_stmt_local(lo, attrs.into(), msg, "let")? + self.recover_stmt_local(lo, attrs.take_for_recovery().into(), msg, "let")? } else if self.check_path() && !self.token.is_qpath_start() && !self.is_path_start_item() { // We have avoided contextual keywords like `union`, items with `crate` visibility, // or `auto trait` items. We aim to parse an arbitrary path `a::b` but not something @@ -75,14 +94,14 @@ impl<'a> Parser<'a> { self.mk_stmt(lo.to(item.span), StmtKind::Item(P(item))) } else if self.eat(&token::Semi) { // Do not attempt to parse an expression if we're done here. - self.error_outer_attrs(&attrs); + self.error_outer_attrs(&attrs.take_for_recovery()); self.mk_stmt(lo, StmtKind::Empty) } else if self.token != token::CloseDelim(token::Brace) { // Remainder are line-expr stmts. - let e = self.parse_expr_res(Restrictions::STMT_EXPR, Some(attrs.into()))?; + let e = self.parse_expr_res(Restrictions::STMT_EXPR, Some(attrs))?; self.mk_stmt(lo.to(e.span), StmtKind::Expr(e)) } else { - self.error_outer_attrs(&attrs); + self.error_outer_attrs(&attrs.take_for_recovery()); return Ok(None); })) } @@ -90,10 +109,10 @@ impl<'a> Parser<'a> { fn parse_stmt_path_start( &mut self, lo: Span, - attrs: Vec, + attrs: AttrWrapper, force_collect: ForceCollect, ) -> PResult<'a, Stmt> { - maybe_collect_tokens!(self, force_collect, &attrs, |this: &mut Parser<'a>| { + self.collect_tokens_trailing_token(attrs, force_collect, |this, attrs| { let path = this.parse_path(PathStyle::Expr)?; if this.eat(&token::Not) { @@ -113,7 +132,7 @@ impl<'a> Parser<'a> { }; let expr = this.with_res(Restrictions::STMT_EXPR, |this| { - let expr = this.parse_dot_or_call_expr_with(expr, lo, attrs.into())?; + let expr = this.parse_dot_or_call_expr_with(expr, lo, attrs)?; this.parse_assoc_expr_with(0, LhsExpr::AlreadyParsed(expr)) })?; Ok(( @@ -142,7 +161,7 @@ impl<'a> Parser<'a> { // Since none of the above applied, this is an expression statement macro. let e = self.mk_expr(lo.to(hi), ExprKind::MacCall(mac), AttrVec::new()); let e = self.maybe_recover_from_bad_qpath(e, true)?; - let e = self.parse_dot_or_call_expr_with(e, lo, attrs)?; + let e = self.parse_dot_or_call_expr_with(e, lo, attrs.into())?; let e = self.parse_assoc_expr_with(0, LhsExpr::AlreadyParsed(e))?; StmtKind::Expr(e) }; @@ -178,11 +197,11 @@ impl<'a> Parser<'a> { fn parse_local_mk( &mut self, lo: Span, - attrs: AttrVec, + attrs: AttrWrapper, capture_semi: bool, force_collect: ForceCollect, ) -> PResult<'a, Stmt> { - maybe_collect_tokens!(self, force_collect, &attrs, |this: &mut Parser<'a>| { + self.collect_tokens_trailing_token(attrs, force_collect, |this, attrs| { this.expect_keyword(kw::Let)?; let local = this.parse_local(attrs.into())?; let trailing = if capture_semi && this.token.kind == token::Semi { @@ -195,16 +214,17 @@ impl<'a> Parser<'a> { } fn recover_local_after_let(&mut self, lo: Span, attrs: AttrVec) -> PResult<'a, Stmt> { - let local = self.parse_local(attrs.into())?; + let local = self.parse_local(attrs)?; Ok(self.mk_stmt(lo.to(self.prev_token.span), StmtKind::Local(local))) } /// Parses a local variable declaration. fn parse_local(&mut self, attrs: AttrVec) -> PResult<'a, P> { let lo = self.prev_token.span; - let pat = self.parse_top_pat(GateOr::Yes, RecoverComma::Yes)?; + let (pat, colon) = + self.parse_pat_before_ty(None, GateOr::Yes, RecoverComma::Yes, "`let` bindings")?; - let (err, ty) = if self.eat(&token::Colon) { + let (err, ty) = if colon { // Save the state of the parser before parsing type normally, in case there is a `:` // instead of an `=` typo. let parser_snapshot_before_type = self.clone(); @@ -271,7 +291,7 @@ impl<'a> Parser<'a> { Ok(P(ast::Local { ty, pat, init, id: DUMMY_NODE_ID, span: lo.to(hi), attrs, tokens: None })) } - /// Parses the RHS of a local variable declaration (e.g., '= 14;'). + /// Parses the RHS of a local variable declaration (e.g., `= 14;`). fn parse_initializer(&mut self, eq_optional: bool) -> PResult<'a, Option>> { let eq_consumed = match self.token.kind { token::BinOpEq(..) => { @@ -286,6 +306,7 @@ impl<'a> Parser<'a> { "=".to_string(), Applicability::MaybeIncorrect, ) + .help("if you meant to overwrite, remove the `let` binding") .emit(); self.bump(); true diff --git a/compiler/rustc_parse/src/parser/ty.rs b/compiler/rustc_parse/src/parser/ty.rs index 9553f5d09e..0f7b8ebd37 100644 --- a/compiler/rustc_parse/src/parser/ty.rs +++ b/compiler/rustc_parse/src/parser/ty.rs @@ -209,7 +209,7 @@ impl<'a> Parser<'a> { } else if self.eat_keyword(kw::Underscore) { // A type to be inferred `_` TyKind::Infer - } else if self.check_fn_front_matter() { + } else if self.check_fn_front_matter(false) { // Function pointer type self.parse_ty_bare_fn(lo, Vec::new(), recover_return_sign)? } else if self.check_keyword(kw::For) { @@ -217,7 +217,7 @@ impl<'a> Parser<'a> { // `for<'lt> [unsafe] [extern "ABI"] fn (&'lt S) -> T` // `for<'lt> Trait1<'lt> + Trait2 + 'a` let lifetime_defs = self.parse_late_bound_lifetime_defs()?; - if self.check_fn_front_matter() { + if self.check_fn_front_matter(false) { self.parse_ty_bare_fn(lo, lifetime_defs, recover_return_sign)? } else { let path = self.parse_path(PathStyle::Type)?; @@ -360,12 +360,20 @@ impl<'a> Parser<'a> { } Err(err) => return Err(err), }; + let ty = if self.eat(&token::Semi) { - TyKind::Array(elt_ty, self.parse_anon_const_expr()?) + let mut length = self.parse_anon_const_expr()?; + if let Err(e) = self.expect(&token::CloseDelim(token::Bracket)) { + // Try to recover from `X` when `X::` works + self.check_mistyped_turbofish_with_multiple_type_params(e, &mut length.value)?; + self.expect(&token::CloseDelim(token::Bracket))?; + } + TyKind::Array(elt_ty, length) } else { + self.expect(&token::CloseDelim(token::Bracket))?; TyKind::Slice(elt_ty) }; - self.expect(&token::CloseDelim(token::Bracket))?; + Ok(ty) } diff --git a/compiler/rustc_parse_format/src/lib.rs b/compiler/rustc_parse_format/src/lib.rs index f150f7a41a..92d974690b 100644 --- a/compiler/rustc_parse_format/src/lib.rs +++ b/compiler/rustc_parse_format/src/lib.rs @@ -730,7 +730,7 @@ fn find_skips_from_snippet( str_style: Option, ) -> (Vec, bool) { let snippet = match snippet { - Some(ref s) if s.starts_with('"') || s.starts_with("r#") => s, + Some(ref s) if s.starts_with('"') || s.starts_with("r\"") || s.starts_with("r#") => s, _ => return (vec![], false), }; diff --git a/compiler/rustc_passes/Cargo.toml b/compiler/rustc_passes/Cargo.toml index c87799f1c2..4069fb2127 100644 --- a/compiler/rustc_passes/Cargo.toml +++ b/compiler/rustc_passes/Cargo.toml @@ -19,3 +19,4 @@ rustc_serialize = { path = "../rustc_serialize" } rustc_span = { path = "../rustc_span" } rustc_trait_selection = { path = "../rustc_trait_selection" } rustc_lexer = { path = "../rustc_lexer" } +rustc_ast_pretty = { path = "../rustc_ast_pretty" } diff --git a/compiler/rustc_passes/src/check_attr.rs b/compiler/rustc_passes/src/check_attr.rs index 0e3a722e08..d91d0e1765 100644 --- a/compiler/rustc_passes/src/check_attr.rs +++ b/compiler/rustc_passes/src/check_attr.rs @@ -8,7 +8,7 @@ use rustc_middle::hir::map::Map; use rustc_middle::ty::query::Providers; use rustc_middle::ty::TyCtxt; -use rustc_ast::{Attribute, LitKind, NestedMetaItem}; +use rustc_ast::{Attribute, Lit, LitKind, NestedMetaItem}; use rustc_errors::{pluralize, struct_span_err}; use rustc_hir as hir; use rustc_hir::def_id::LocalDefId; @@ -17,7 +17,9 @@ use rustc_hir::{ self, FnSig, ForeignItem, ForeignItemKind, HirId, Item, ItemKind, TraitItem, CRATE_HIR_ID, }; use rustc_hir::{MethodKind, Target}; -use rustc_session::lint::builtin::{CONFLICTING_REPR_HINTS, UNUSED_ATTRIBUTES}; +use rustc_session::lint::builtin::{ + CONFLICTING_REPR_HINTS, INVALID_DOC_ATTRIBUTES, UNUSED_ATTRIBUTES, +}; use rustc_session::parse::feature_err; use rustc_span::symbol::{sym, Symbol}; use rustc_span::{Span, DUMMY_SP}; @@ -29,7 +31,7 @@ pub(crate) fn target_from_impl_item<'tcx>( match impl_item.kind { hir::ImplItemKind::Const(..) => Target::AssocConst, hir::ImplItemKind::Fn(..) => { - let parent_hir_id = tcx.hir().get_parent_item(impl_item.hir_id); + 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(impl_) => impl_.of_trait.is_some(), @@ -60,12 +62,12 @@ impl CheckAttrVisitor<'tcx> { fn check_attributes( &self, hir_id: HirId, - attrs: &'hir [Attribute], span: &Span, target: Target, item: Option>, ) { let mut is_valid = true; + let attrs = self.tcx.hir().attrs(hir_id); for attr in attrs { is_valid &= if self.tcx.sess.check_name(attr, sym::inline) { self.check_inline(hir_id, attr, span, target) @@ -85,12 +87,18 @@ impl CheckAttrVisitor<'tcx> { self.check_export_name(hir_id, &attr, span, target) } else if self.tcx.sess.check_name(attr, sym::rustc_args_required_const) { self.check_rustc_args_required_const(&attr, span, target, item) + } else if self.tcx.sess.check_name(attr, sym::rustc_layout_scalar_valid_range_start) { + self.check_rustc_layout_scalar_valid_range(&attr, span, target) + } else if self.tcx.sess.check_name(attr, sym::rustc_layout_scalar_valid_range_end) { + self.check_rustc_layout_scalar_valid_range(&attr, span, target) } else if self.tcx.sess.check_name(attr, sym::allow_internal_unstable) { self.check_allow_internal_unstable(hir_id, &attr, span, target, &attrs) } else if self.tcx.sess.check_name(attr, sym::rustc_allow_const_fn_unstable) { self.check_rustc_allow_const_fn_unstable(hir_id, &attr, span, target) } else if self.tcx.sess.check_name(attr, sym::naked) { self.check_naked(hir_id, attr, span, target) + } else if self.tcx.sess.check_name(attr, sym::rustc_legacy_const_generics) { + self.check_rustc_legacy_const_generics(&attr, span, target, item) } else { // lint-only checks if self.tcx.sess.check_name(attr, sym::cold) { @@ -386,33 +394,50 @@ impl CheckAttrVisitor<'tcx> { .emit(); } - fn check_doc_alias(&self, meta: &NestedMetaItem, hir_id: HirId, target: Target) -> bool { - let doc_alias = meta.value_str().map(|s| s.to_string()).unwrap_or_else(String::new); + fn check_doc_alias_value( + &self, + meta: &NestedMetaItem, + doc_alias: &str, + hir_id: HirId, + target: Target, + is_list: bool, + ) -> bool { + let tcx = self.tcx; + let err_fn = move |span: Span, msg: &str| { + tcx.sess.span_err( + span, + &format!( + "`#[doc(alias{})]` {}", + if is_list { "(\"...\")" } else { " = \"...\"" }, + msg, + ), + ); + false + }; if doc_alias.is_empty() { - self.doc_attr_str_error(meta, "alias"); - return false; + return err_fn( + meta.name_value_literal_span().unwrap_or_else(|| meta.span()), + "attribute cannot have empty value", + ); } if let Some(c) = doc_alias.chars().find(|&c| c == '"' || c == '\'' || (c.is_whitespace() && c != ' ')) { - self.tcx - .sess - .struct_span_err( - meta.name_value_literal_span().unwrap_or_else(|| meta.span()), - &format!("{:?} character isn't allowed in `#[doc(alias = \"...\")]`", c), - ) - .emit(); + self.tcx.sess.span_err( + meta.name_value_literal_span().unwrap_or_else(|| meta.span()), + &format!( + "{:?} character isn't allowed in `#[doc(alias{})]`", + c, + if is_list { "(\"...\")" } else { " = \"...\"" }, + ), + ); return false; } if doc_alias.starts_with(' ') || doc_alias.ends_with(' ') { - self.tcx - .sess - .struct_span_err( - meta.name_value_literal_span().unwrap_or_else(|| meta.span()), - "`#[doc(alias = \"...\")]` cannot start or end with ' '", - ) - .emit(); - return false; + return err_fn( + meta.name_value_literal_span().unwrap_or_else(|| meta.span()), + "cannot start or end with ' '", + ); } if let Some(err) = match target { Target::Impl => Some("implementation block"), @@ -438,27 +463,63 @@ impl CheckAttrVisitor<'tcx> { } _ => None, } { - self.tcx - .sess - .struct_span_err( - meta.span(), - &format!("`#[doc(alias = \"...\")]` isn't allowed on {}", err), - ) - .emit(); - return false; + return err_fn(meta.span(), &format!("isn't allowed on {}", err)); } let item_name = self.tcx.hir().name(hir_id); if &*item_name.as_str() == doc_alias { + return err_fn(meta.span(), "is the same as the item's name"); + } + true + } + + fn check_doc_alias(&self, meta: &NestedMetaItem, hir_id: HirId, target: Target) -> bool { + if let Some(values) = meta.meta_item_list() { + let mut errors = 0; + for v in values { + match v.literal() { + Some(l) => match l.kind { + LitKind::Str(s, _) => { + if !self.check_doc_alias_value(v, &s.as_str(), hir_id, target, true) { + errors += 1; + } + } + _ => { + self.tcx + .sess + .struct_span_err( + v.span(), + "`#[doc(alias(\"a\"))]` expects string literals", + ) + .emit(); + errors += 1; + } + }, + None => { + self.tcx + .sess + .struct_span_err( + v.span(), + "`#[doc(alias(\"a\"))]` expects string literals", + ) + .emit(); + errors += 1; + } + } + } + errors == 0 + } else if let Some(doc_alias) = meta.value_str().map(|s| s.to_string()) { + self.check_doc_alias_value(meta, &doc_alias, hir_id, target, false) + } else { self.tcx .sess .struct_span_err( meta.span(), - &format!("`#[doc(alias = \"...\")]` is the same as the item's name"), + "doc alias attribute expects a string `#[doc(alias = \"a\")]` or a list of \ + strings `#[doc(alias(\"a\", \"b\"))]`", ) .emit(); - return false; + false } - true } fn check_doc_keyword(&self, meta: &NestedMetaItem, hir_id: HirId) -> bool { @@ -516,7 +577,7 @@ impl CheckAttrVisitor<'tcx> { .struct_span_err( meta.span(), &format!( - "`#![doc({} = \"...\")]` isn't allowed as a crate level attribute", + "`#![doc({} = \"...\")]` isn't allowed as a crate-level attribute", attr_name, ), ) @@ -527,26 +588,97 @@ impl CheckAttrVisitor<'tcx> { } fn check_doc_attrs(&self, attr: &Attribute, hir_id: HirId, target: Target) -> bool { - if let Some(mi) = attr.meta() { - if let Some(list) = mi.meta_item_list() { - for meta in list { - if meta.has_name(sym::alias) { - if !self.check_attr_crate_level(meta, hir_id, "alias") - || !self.check_doc_alias(meta, hir_id, target) + let mut is_valid = true; + + if let Some(list) = attr.meta().and_then(|mi| mi.meta_item_list().map(|l| l.to_vec())) { + for meta in list { + if let Some(i_meta) = meta.meta_item() { + match i_meta.name_or_empty() { + sym::alias + if !self.check_attr_crate_level(&meta, hir_id, "alias") + || !self.check_doc_alias(&meta, hir_id, target) => { - return false; + is_valid = false } - } else if meta.has_name(sym::keyword) { - if !self.check_attr_crate_level(meta, hir_id, "keyword") - || !self.check_doc_keyword(meta, hir_id) + + sym::keyword + if !self.check_attr_crate_level(&meta, hir_id, "keyword") + || !self.check_doc_keyword(&meta, hir_id) => { - return false; + is_valid = false + } + + sym::test if CRATE_HIR_ID != hir_id => { + self.tcx.struct_span_lint_hir( + INVALID_DOC_ATTRIBUTES, + hir_id, + meta.span(), + |lint| { + lint.build( + "`#![doc(test(...)]` is only allowed \ + as a crate-level attribute", + ) + .emit(); + }, + ); + is_valid = false; + } + + // no_default_passes: deprecated + // passes: deprecated + // plugins: removed, but rustdoc warns about it itself + sym::alias + | sym::cfg + | sym::hidden + | sym::html_favicon_url + | sym::html_logo_url + | sym::html_no_source + | sym::html_playground_url + | sym::html_root_url + | sym::include + | sym::inline + | sym::issue_tracker_base_url + | sym::keyword + | sym::masked + | sym::no_default_passes + | sym::no_inline + | sym::passes + | sym::plugins + | sym::primitive + | sym::spotlight + | sym::test => {} + + _ => { + self.tcx.struct_span_lint_hir( + INVALID_DOC_ATTRIBUTES, + hir_id, + i_meta.span, + |lint| { + let msg = format!( + "unknown `doc` attribute `{}`", + rustc_ast_pretty::pprust::path_to_string(&i_meta.path), + ); + lint.build(&msg).emit(); + }, + ); + is_valid = false; } } + } else { + self.tcx.struct_span_lint_hir( + INVALID_DOC_ATTRIBUTES, + hir_id, + meta.span(), + |lint| { + lint.build(&format!("invalid `doc` attribute")).emit(); + }, + ); + is_valid = false; } } } - true + + is_valid } /// Checks if `#[cold]` is applied to a non-function. Returns `true` if valid. @@ -750,6 +882,136 @@ impl CheckAttrVisitor<'tcx> { } } + fn check_rustc_layout_scalar_valid_range( + &self, + attr: &Attribute, + span: &Span, + target: Target, + ) -> bool { + if target != Target::Struct { + self.tcx + .sess + .struct_span_err(attr.span, "attribute should be applied to a struct") + .span_label(*span, "not a struct") + .emit(); + return false; + } + + let list = match attr.meta_item_list() { + None => return false, + Some(it) => it, + }; + + if matches!(&list[..], &[NestedMetaItem::Literal(Lit { kind: LitKind::Int(..), .. })]) { + true + } else { + self.tcx + .sess + .struct_span_err(attr.span, "expected exactly one integer literal argument") + .emit(); + false + } + } + + /// Checks if `#[rustc_legacy_const_generics]` is applied to a function and has a valid argument. + fn check_rustc_legacy_const_generics( + &self, + attr: &Attribute, + span: &Span, + target: Target, + item: Option>, + ) -> bool { + let is_function = matches!(target, Target::Fn | Target::Method(..)); + if !is_function { + self.tcx + .sess + .struct_span_err(attr.span, "attribute should be applied to a function") + .span_label(*span, "not a function") + .emit(); + return false; + } + + let list = match attr.meta_item_list() { + // The attribute form is validated on AST. + None => return false, + Some(it) => it, + }; + + let (decl, generics) = match item { + Some(ItemLike::Item(Item { + kind: ItemKind::Fn(FnSig { decl, .. }, generics, _), + .. + })) => (decl, generics), + _ => bug!("should be a function item"), + }; + + for param in generics.params { + match param.kind { + hir::GenericParamKind::Const { .. } => {} + _ => { + self.tcx + .sess + .struct_span_err( + attr.span, + "#[rustc_legacy_const_generics] functions must \ + only have const generics", + ) + .span_label(param.span, "non-const generic parameter") + .emit(); + return false; + } + } + } + + if list.len() != generics.params.len() { + self.tcx + .sess + .struct_span_err( + attr.span, + "#[rustc_legacy_const_generics] must have one index for each generic parameter", + ) + .span_label(generics.span, "generic parameters") + .emit(); + return false; + } + + let arg_count = decl.inputs.len() as u128 + generics.params.len() as u128; + let mut invalid_args = vec![]; + for meta in list { + if let Some(LitKind::Int(val, _)) = meta.literal().map(|lit| &lit.kind) { + if *val >= arg_count { + let span = meta.span(); + self.tcx + .sess + .struct_span_err(span, "index exceeds number of arguments") + .span_label( + span, + format!( + "there {} only {} argument{}", + if arg_count != 1 { "are" } else { "is" }, + arg_count, + pluralize!(arg_count) + ), + ) + .emit(); + return false; + } + } else { + invalid_args.push(meta.span()); + } + } + + if !invalid_args.is_empty() { + self.tcx + .sess + .struct_span_err(invalid_args, "arguments should be non-negative integers") + .emit(); + false + } else { + true + } + } + /// Checks if `#[link_section]` is applied to a function or static. fn check_link_section(&self, hir_id: HirId, attr: &Attribute, span: &Span, target: Target) { match target { @@ -1057,66 +1319,36 @@ impl Visitor<'tcx> for CheckAttrVisitor<'tcx> { 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(ItemLike::Item(item)), - ); + self.check_attributes(item.hir_id(), &item.span, target, Some(ItemLike::Item(item))); intravisit::walk_item(self, item) } fn visit_generic_param(&mut self, generic_param: &'tcx hir::GenericParam<'tcx>) { let target = Target::from_generic_param(generic_param); - self.check_attributes( - generic_param.hir_id, - generic_param.attrs, - &generic_param.span, - target, - None, - ); + self.check_attributes(generic_param.hir_id, &generic_param.span, target, None); intravisit::walk_generic_param(self, generic_param) } 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); + self.check_attributes(trait_item.hir_id(), &trait_item.span, target, None); intravisit::walk_trait_item(self, trait_item) } - fn visit_struct_field(&mut self, struct_field: &'tcx hir::StructField<'tcx>) { - self.check_attributes( - struct_field.hir_id, - &struct_field.attrs, - &struct_field.span, - Target::Field, - None, - ); - intravisit::walk_struct_field(self, struct_field); + fn visit_field_def(&mut self, struct_field: &'tcx hir::FieldDef<'tcx>) { + self.check_attributes(struct_field.hir_id, &struct_field.span, Target::Field, None); + intravisit::walk_field_def(self, struct_field); } fn visit_arm(&mut self, arm: &'tcx hir::Arm<'tcx>) { - self.check_attributes(arm.hir_id, &arm.attrs, &arm.span, Target::Arm, None); + self.check_attributes(arm.hir_id, &arm.span, Target::Arm, None); intravisit::walk_arm(self, arm); } - fn visit_macro_def(&mut self, macro_def: &'tcx hir::MacroDef<'tcx>) { - self.check_attributes( - macro_def.hir_id, - ¯o_def.attrs, - ¯o_def.span, - Target::MacroDef, - None, - ); - intravisit::walk_macro_def(self, macro_def); - } - fn visit_foreign_item(&mut self, f_item: &'tcx ForeignItem<'tcx>) { let target = Target::from_foreign_item(f_item); self.check_attributes( - f_item.hir_id, - &f_item.attrs, + f_item.hir_id(), &f_item.span, target, Some(ItemLike::ForeignItem(f_item)), @@ -1126,14 +1358,14 @@ impl Visitor<'tcx> for CheckAttrVisitor<'tcx> { 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); + self.check_attributes(impl_item.hir_id(), &impl_item.span, target, None); intravisit::walk_impl_item(self, impl_item) } fn visit_stmt(&mut self, stmt: &'tcx hir::Stmt<'tcx>) { // When checking statements ignore expressions, they will be checked later. if let hir::StmtKind::Local(ref l) = stmt.kind { - self.check_attributes(l.hir_id, &l.attrs, &stmt.span, Target::Statement, None); + self.check_attributes(l.hir_id, &stmt.span, Target::Statement, None); } intravisit::walk_stmt(self, stmt) } @@ -1144,7 +1376,7 @@ impl Visitor<'tcx> for CheckAttrVisitor<'tcx> { _ => Target::Expression, }; - self.check_attributes(expr.hir_id, &expr.attrs, &expr.span, target, None); + self.check_attributes(expr.hir_id, &expr.span, target, None); intravisit::walk_expr(self, expr) } @@ -1154,9 +1386,20 @@ impl Visitor<'tcx> for CheckAttrVisitor<'tcx> { generics: &'tcx hir::Generics<'tcx>, item_id: HirId, ) { - self.check_attributes(variant.id, variant.attrs, &variant.span, Target::Variant, None); + self.check_attributes(variant.id, &variant.span, Target::Variant, None); intravisit::walk_variant(self, variant, generics, item_id) } + + fn visit_macro_def(&mut self, macro_def: &'tcx hir::MacroDef<'tcx>) { + self.check_attributes(macro_def.hir_id(), ¯o_def.span, Target::MacroDef, None); + intravisit::walk_macro_def(self, macro_def); + } + + fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) { + self.check_attributes(param.hir_id, ¶m.span, Target::Param, None); + + intravisit::walk_param(self, param); + } } fn is_c_like_enum(item: &Item<'_>) -> bool { @@ -1221,13 +1464,7 @@ fn check_mod_attrs(tcx: TyCtxt<'_>, module_def_id: LocalDefId) { tcx.hir().visit_exported_macros_in_krate(check_attr_visitor); check_invalid_macro_level_attr(tcx, tcx.hir().krate().non_exported_macro_attrs); if module_def_id.is_top_level_module() { - check_attr_visitor.check_attributes( - CRATE_HIR_ID, - tcx.hir().krate_attrs(), - &DUMMY_SP, - Target::Mod, - None, - ); + check_attr_visitor.check_attributes(CRATE_HIR_ID, &DUMMY_SP, Target::Mod, None); check_invalid_crate_level_attr(tcx, tcx.hir().krate_attrs()); } } diff --git a/compiler/rustc_passes/src/check_const.rs b/compiler/rustc_passes/src/check_const.rs index 8950f9b33b..da713566c3 100644 --- a/compiler/rustc_passes/src/check_const.rs +++ b/compiler/rustc_passes/src/check_const.rs @@ -45,7 +45,7 @@ impl NonConstExpr { return None; } - Self::Match(IfLetGuardDesugar) => bug!("if-let guard outside a `match` expression"), + Self::Match(IfLetGuardDesugar) => bug!("`if let` guard outside a `match` expression"), // All other expressions are allowed. Self::Loop(Loop | While | WhileLet) @@ -106,7 +106,7 @@ impl<'tcx> CheckConstVisitor<'tcx> { // However, we cannot allow stable `const fn`s to use unstable features without an explicit // opt-in via `rustc_allow_const_fn_unstable`. attr::rustc_allow_const_fn_unstable(&tcx.sess, &tcx.get_attrs(def_id)) - .map_or(false, |mut features| features.any(|name| name == feature_gate)) + .any(|name| name == feature_gate) }; match required_gates { diff --git a/compiler/rustc_passes/src/dead.rs b/compiler/rustc_passes/src/dead.rs index 3b1b53553d..c63edf365a 100644 --- a/compiler/rustc_passes/src/dead.rs +++ b/compiler/rustc_passes/src/dead.rs @@ -15,7 +15,6 @@ use rustc_middle::middle::privacy; use rustc_middle::ty::{self, DefIdTree, TyCtxt}; use rustc_session::lint; -use rustc_ast as ast; use rustc_span::symbol::{sym, Symbol}; // Any local node that may call something in its body block should be @@ -134,11 +133,27 @@ impl<'tcx> MarkSymbolVisitor<'tcx> { } } + fn handle_assign(&mut self, expr: &'tcx hir::Expr<'tcx>) { + if self + .typeck_results() + .expr_adjustments(expr) + .iter() + .any(|adj| matches!(adj.kind, ty::adjustment::Adjust::Deref(_))) + { + self.visit_expr(expr); + } else if let hir::ExprKind::Field(base, ..) = expr.kind { + // Ignore write to field + self.handle_assign(base); + } else { + self.visit_expr(expr); + } + } + fn handle_field_pattern_match( &mut self, lhs: &hir::Pat<'_>, res: Res, - pats: &[hir::FieldPat<'_>], + pats: &[hir::PatField<'_>], ) { let variant = match self.typeck_results().node_type(lhs.hir_id).kind() { ty::Adt(adt, _) => adt.variant_of_res(res), @@ -179,8 +194,7 @@ impl<'tcx> MarkSymbolVisitor<'tcx> { match node { Node::Item(item) => match item.kind { hir::ItemKind::Struct(..) | hir::ItemKind::Union(..) => { - let def_id = self.tcx.hir().local_def_id(item.hir_id); - let def = self.tcx.adt_def(def_id); + let def = self.tcx.adt_def(item.def_id); self.repr_has_repr_c = def.repr.c(); intravisit::walk_item(self, &item); @@ -210,7 +224,7 @@ impl<'tcx> MarkSymbolVisitor<'tcx> { self.inherited_pub_visibility = had_inherited_pub_visibility; } - fn mark_as_used_if_union(&mut self, adt: &ty::AdtDef, fields: &[hir::Field<'_>]) { + fn mark_as_used_if_union(&mut self, adt: &ty::AdtDef, fields: &[hir::ExprField<'_>]) { if adt.is_union() && adt.non_enum_variant().fields.len() > 1 && adt.did.is_local() { for field in fields { let index = self.tcx.field_index(field.hir_id, self.typeck_results()); @@ -263,6 +277,11 @@ impl<'tcx> Visitor<'tcx> for MarkSymbolVisitor<'tcx> { hir::ExprKind::MethodCall(..) => { self.lookup_and_handle_method(expr.hir_id); } + hir::ExprKind::Assign(ref left, ref right, ..) => { + self.handle_assign(left); + self.visit_expr(right); + return; + } hir::ExprKind::Field(ref lhs, ..) => { self.handle_field_access(&lhs, expr.hir_id); } @@ -314,7 +333,7 @@ impl<'tcx> Visitor<'tcx> for MarkSymbolVisitor<'tcx> { fn visit_ty(&mut self, ty: &'tcx hir::Ty<'tcx>) { if let TyKind::OpaqueDef(item_id, _) = ty.kind { - let item = self.tcx.hir().expect_item(item_id.id); + let item = self.tcx.hir().item(item_id); intravisit::walk_item(self, item); } intravisit::walk_ty(self, ty); @@ -326,11 +345,8 @@ impl<'tcx> Visitor<'tcx> for MarkSymbolVisitor<'tcx> { } } -fn has_allow_dead_code_or_lang_attr( - tcx: TyCtxt<'_>, - id: hir::HirId, - attrs: &[ast::Attribute], -) -> bool { +fn has_allow_dead_code_or_lang_attr(tcx: TyCtxt<'_>, id: hir::HirId) -> bool { + let attrs = tcx.hir().attrs(id); if tcx.sess.contains_name(attrs, sym::lang) { return true; } @@ -380,9 +396,9 @@ struct LifeSeeder<'k, 'tcx> { impl<'v, 'k, 'tcx> ItemLikeVisitor<'v> for LifeSeeder<'k, 'tcx> { fn visit_item(&mut self, item: &hir::Item<'_>) { - let allow_dead_code = has_allow_dead_code_or_lang_attr(self.tcx, item.hir_id, &item.attrs); + let allow_dead_code = has_allow_dead_code_or_lang_attr(self.tcx, item.hir_id()); if allow_dead_code { - self.worklist.push(item.hir_id); + self.worklist.push(item.hir_id()); } match item.kind { hir::ItemKind::Enum(ref enum_def, _) => { @@ -398,24 +414,20 @@ impl<'v, 'k, 'tcx> ItemLikeVisitor<'v> for LifeSeeder<'k, 'tcx> { } hir::ItemKind::Impl(hir::Impl { ref of_trait, items, .. }) => { if of_trait.is_some() { - self.worklist.push(item.hir_id); + self.worklist.push(item.hir_id()); } for impl_item_ref in items { let impl_item = self.krate.impl_item(impl_item_ref.id); if of_trait.is_some() - || has_allow_dead_code_or_lang_attr( - self.tcx, - impl_item.hir_id, - &impl_item.attrs, - ) + || has_allow_dead_code_or_lang_attr(self.tcx, impl_item.hir_id()) { - self.worklist.push(impl_item_ref.id.hir_id); + self.worklist.push(impl_item_ref.id.hir_id()); } } } hir::ItemKind::Struct(ref variant_data, _) => { if let Some(ctor_hir_id) = variant_data.ctor_hir_id() { - self.struct_constructors.insert(ctor_hir_id, item.hir_id); + self.struct_constructors.insert(ctor_hir_id, item.hir_id()); } } _ => (), @@ -425,9 +437,9 @@ impl<'v, 'k, 'tcx> ItemLikeVisitor<'v> for LifeSeeder<'k, 'tcx> { fn visit_trait_item(&mut self, trait_item: &hir::TraitItem<'_>) { use hir::TraitItemKind::{Const, Fn}; if matches!(trait_item.kind, Const(_, Some(_)) | Fn(_, hir::TraitFn::Provided(_))) - && has_allow_dead_code_or_lang_attr(self.tcx, trait_item.hir_id, &trait_item.attrs) + && has_allow_dead_code_or_lang_attr(self.tcx, trait_item.hir_id()) { - self.worklist.push(trait_item.hir_id); + self.worklist.push(trait_item.hir_id()); } } @@ -438,9 +450,9 @@ impl<'v, 'k, 'tcx> ItemLikeVisitor<'v> for LifeSeeder<'k, 'tcx> { fn visit_foreign_item(&mut self, foreign_item: &hir::ForeignItem<'_>) { use hir::ForeignItemKind::{Fn, Static}; if matches!(foreign_item.kind, Static(..) | Fn(..)) - && has_allow_dead_code_or_lang_attr(self.tcx, foreign_item.hir_id, &foreign_item.attrs) + && has_allow_dead_code_or_lang_attr(self.tcx, foreign_item.hir_id()) { - self.worklist.push(foreign_item.hir_id); + self.worklist.push(foreign_item.hir_id()); } } } @@ -510,25 +522,24 @@ impl DeadVisitor<'tcx> { | hir::ItemKind::Struct(..) | hir::ItemKind::Union(..) ); - should_warn && !self.symbol_is_live(item.hir_id) + should_warn && !self.symbol_is_live(item.hir_id()) } - fn should_warn_about_field(&mut self, field: &hir::StructField<'_>) -> bool { + fn should_warn_about_field(&mut self, field: &hir::FieldDef<'_>) -> bool { let field_type = self.tcx.type_of(self.tcx.hir().local_def_id(field.hir_id)); !field.is_positional() && !self.symbol_is_live(field.hir_id) && !field_type.is_phantom_data() - && !has_allow_dead_code_or_lang_attr(self.tcx, field.hir_id, &field.attrs) + && !has_allow_dead_code_or_lang_attr(self.tcx, field.hir_id) } fn should_warn_about_variant(&mut self, variant: &hir::Variant<'_>) -> bool { - !self.symbol_is_live(variant.id) - && !has_allow_dead_code_or_lang_attr(self.tcx, variant.id, &variant.attrs) + !self.symbol_is_live(variant.id) && !has_allow_dead_code_or_lang_attr(self.tcx, variant.id) } fn should_warn_about_foreign_item(&mut self, fi: &hir::ForeignItem<'_>) -> bool { - !self.symbol_is_live(fi.hir_id) - && !has_allow_dead_code_or_lang_attr(self.tcx, fi.hir_id, &fi.attrs) + !self.symbol_is_live(fi.hir_id()) + && !has_allow_dead_code_or_lang_attr(self.tcx, fi.hir_id()) } // id := HIR id of an item's definition. @@ -612,7 +623,7 @@ impl Visitor<'tcx> for DeadVisitor<'tcx> { hir::ItemKind::Struct(..) => "constructed", // Issue #52325 _ => "used", }; - self.warn_dead_code(item.hir_id, span, item.ident.name, participle); + self.warn_dead_code(item.hir_id(), span, item.ident.name, participle); } else { // Only continue if we didn't warn intravisit::walk_item(self, item); @@ -634,24 +645,24 @@ impl Visitor<'tcx> for DeadVisitor<'tcx> { fn visit_foreign_item(&mut self, fi: &'tcx hir::ForeignItem<'tcx>) { if self.should_warn_about_foreign_item(fi) { - self.warn_dead_code(fi.hir_id, fi.span, fi.ident.name, "used"); + self.warn_dead_code(fi.hir_id(), fi.span, fi.ident.name, "used"); } intravisit::walk_foreign_item(self, fi); } - fn visit_struct_field(&mut self, field: &'tcx hir::StructField<'tcx>) { + fn visit_field_def(&mut self, field: &'tcx hir::FieldDef<'tcx>) { if self.should_warn_about_field(&field) { self.warn_dead_code(field.hir_id, field.span, field.ident.name, "read"); } - intravisit::walk_struct_field(self, field); + intravisit::walk_field_def(self, field); } fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem<'tcx>) { match impl_item.kind { hir::ImplItemKind::Const(_, body_id) => { - if !self.symbol_is_live(impl_item.hir_id) { + if !self.symbol_is_live(impl_item.hir_id()) { self.warn_dead_code( - impl_item.hir_id, + impl_item.hir_id(), impl_item.span, impl_item.ident.name, "used", @@ -660,7 +671,7 @@ impl Visitor<'tcx> for DeadVisitor<'tcx> { self.visit_nested_body(body_id) } hir::ImplItemKind::Fn(_, body_id) => { - if !self.symbol_is_live(impl_item.hir_id) { + if !self.symbol_is_live(impl_item.hir_id()) { // FIXME(66095): Because impl_item.span is annotated with things // like expansion data, and ident.span isn't, we use the // def_span method if it's part of a macro invocation @@ -672,7 +683,7 @@ impl Visitor<'tcx> for DeadVisitor<'tcx> { } else { impl_item.ident.span }; - self.warn_dead_code(impl_item.hir_id, span, impl_item.ident.name, "used"); + self.warn_dead_code(impl_item.hir_id(), span, impl_item.ident.name, "used"); } self.visit_nested_body(body_id) } diff --git a/compiler/rustc_passes/src/diagnostic_items.rs b/compiler/rustc_passes/src/diagnostic_items.rs index 699c96bc49..8dd3700e5b 100644 --- a/compiler/rustc_passes/src/diagnostic_items.rs +++ b/compiler/rustc_passes/src/diagnostic_items.rs @@ -16,7 +16,7 @@ use rustc_hir::itemlikevisit::ItemLikeVisitor; use rustc_middle::ty::query::Providers; use rustc_middle::ty::TyCtxt; use rustc_session::Session; -use rustc_span::def_id::{DefId, LOCAL_CRATE}; +use rustc_span::def_id::{DefId, LocalDefId, LOCAL_CRATE}; use rustc_span::symbol::{sym, Symbol}; struct DiagnosticItemCollector<'tcx> { @@ -27,19 +27,19 @@ struct DiagnosticItemCollector<'tcx> { impl<'v, 'tcx> ItemLikeVisitor<'v> for DiagnosticItemCollector<'tcx> { fn visit_item(&mut self, item: &hir::Item<'_>) { - self.observe_item(&item.attrs, item.hir_id); + self.observe_item(item.def_id); } fn visit_trait_item(&mut self, trait_item: &hir::TraitItem<'_>) { - self.observe_item(&trait_item.attrs, trait_item.hir_id); + self.observe_item(trait_item.def_id); } fn visit_impl_item(&mut self, impl_item: &hir::ImplItem<'_>) { - self.observe_item(&impl_item.attrs, impl_item.hir_id); + self.observe_item(impl_item.def_id); } fn visit_foreign_item(&mut self, foreign_item: &hir::ForeignItem<'_>) { - self.observe_item(foreign_item.attrs, foreign_item.hir_id); + self.observe_item(foreign_item.def_id); } } @@ -48,9 +48,10 @@ impl<'tcx> DiagnosticItemCollector<'tcx> { DiagnosticItemCollector { tcx, items: Default::default() } } - fn observe_item(&mut self, attrs: &[ast::Attribute], hir_id: hir::HirId) { + fn observe_item(&mut self, def_id: LocalDefId) { + let hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id); + let attrs = self.tcx.hir().attrs(hir_id); if let Some(name) = extract(&self.tcx.sess, attrs) { - let def_id = self.tcx.hir().local_def_id(hir_id); // insert into our table collect_item(self.tcx, &mut self.items, name, def_id.to_def_id()); } @@ -106,7 +107,7 @@ fn collect<'tcx>(tcx: TyCtxt<'tcx>) -> FxHashMap { tcx.hir().krate().visit_all_item_likes(&mut collector); for m in tcx.hir().krate().exported_macros { - collector.observe_item(m.attrs, m.hir_id); + collector.observe_item(m.def_id); } collector.items diff --git a/compiler/rustc_passes/src/entry.rs b/compiler/rustc_passes/src/entry.rs index 5ff631a245..57848208f9 100644 --- a/compiler/rustc_passes/src/entry.rs +++ b/compiler/rustc_passes/src/entry.rs @@ -2,7 +2,7 @@ use rustc_ast::entry::EntryPointType; use rustc_errors::struct_span_err; use rustc_hir::def_id::{CrateNum, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::itemlikevisit::ItemLikeVisitor; -use rustc_hir::{ForeignItem, HirId, ImplItem, Item, ItemKind, TraitItem}; +use rustc_hir::{ForeignItem, HirId, ImplItem, Item, ItemKind, TraitItem, CRATE_HIR_ID}; use rustc_middle::hir::map::Map; use rustc_middle::ty::query::Providers; use rustc_middle::ty::TyCtxt; @@ -32,8 +32,7 @@ struct EntryContext<'a, 'tcx> { impl<'a, 'tcx> ItemLikeVisitor<'tcx> for EntryContext<'a, 'tcx> { fn visit_item(&mut self, item: &'tcx Item<'tcx>) { - let def_id = self.map.local_def_id(item.hir_id); - let def_key = self.map.def_key(def_id); + let def_key = self.map.def_key(item.def_id); let at_root = def_key.parent == Some(CRATE_DEF_INDEX); find_item(item, self, at_root); } @@ -61,7 +60,7 @@ fn entry_fn(tcx: TyCtxt<'_>, cnum: CrateNum) -> Option<(LocalDefId, EntryFnType) } // If the user wants no main function at all, then stop here. - if tcx.sess.contains_name(&tcx.hir().krate().item.attrs, sym::no_main) { + if tcx.sess.contains_name(&tcx.hir().attrs(CRATE_HIR_ID), sym::no_main) { return None; } @@ -81,10 +80,11 @@ fn entry_fn(tcx: TyCtxt<'_>, cnum: CrateNum) -> Option<(LocalDefId, EntryFnType) // Beware, this is duplicated in `librustc_builtin_macros/test_harness.rs` // (with `ast::Item`), so make sure to keep them in sync. -fn entry_point_type(sess: &Session, item: &Item<'_>, at_root: bool) -> EntryPointType { - if sess.contains_name(&item.attrs, sym::start) { +fn entry_point_type(ctxt: &EntryContext<'_, '_>, item: &Item<'_>, at_root: bool) -> EntryPointType { + let attrs = ctxt.map.attrs(item.hir_id()); + if ctxt.session.contains_name(attrs, sym::start) { EntryPointType::Start - } else if sess.contains_name(&item.attrs, sym::main) { + } else if ctxt.session.contains_name(attrs, sym::main) { EntryPointType::MainAttr } else if item.ident.name == sym::main { if at_root { @@ -104,30 +104,31 @@ fn throw_attr_err(sess: &Session, span: Span, attr: &str) { } fn find_item(item: &Item<'_>, ctxt: &mut EntryContext<'_, '_>, at_root: bool) { - match entry_point_type(&ctxt.session, item, at_root) { + match entry_point_type(ctxt, item, at_root) { EntryPointType::None => (), _ if !matches!(item.kind, ItemKind::Fn(..)) => { - if let Some(attr) = ctxt.session.find_by_name(item.attrs, sym::start) { + let attrs = ctxt.map.attrs(item.hir_id()); + if let Some(attr) = ctxt.session.find_by_name(attrs, sym::start) { throw_attr_err(&ctxt.session, attr.span, "start"); } - if let Some(attr) = ctxt.session.find_by_name(item.attrs, sym::main) { + if let Some(attr) = ctxt.session.find_by_name(attrs, sym::main) { throw_attr_err(&ctxt.session, attr.span, "main"); } } EntryPointType::MainNamed => { if ctxt.main_fn.is_none() { - ctxt.main_fn = Some((item.hir_id, item.span)); + ctxt.main_fn = Some((item.hir_id(), item.span)); } else { struct_span_err!(ctxt.session, item.span, E0136, "multiple `main` functions") .emit(); } } EntryPointType::OtherMain => { - ctxt.non_main_fns.push((item.hir_id, item.span)); + ctxt.non_main_fns.push((item.hir_id(), item.span)); } EntryPointType::MainAttr => { if ctxt.attr_main_fn.is_none() { - ctxt.attr_main_fn = Some((item.hir_id, item.span)); + ctxt.attr_main_fn = Some((item.hir_id(), item.span)); } else { struct_span_err!( ctxt.session, @@ -142,7 +143,7 @@ fn find_item(item: &Item<'_>, ctxt: &mut EntryContext<'_, '_>, at_root: bool) { } EntryPointType::Start => { if ctxt.start_fn.is_none() { - ctxt.start_fn = Some((item.hir_id, item.span)); + ctxt.start_fn = Some((item.hir_id(), item.span)); } else { struct_span_err!(ctxt.session, item.span, E0138, "multiple `start` functions") .span_label(ctxt.start_fn.unwrap().1, "previous `#[start]` function here") diff --git a/compiler/rustc_passes/src/hir_id_validator.rs b/compiler/rustc_passes/src/hir_id_validator.rs index fdd6c23805..79e3b5952a 100644 --- a/compiler/rustc_passes/src/hir_id_validator.rs +++ b/compiler/rustc_passes/src/hir_id_validator.rs @@ -14,12 +14,9 @@ pub fn check_crate(tcx: TyCtxt<'_>) { let errors = Lock::new(Vec::new()); let hir_map = tcx.hir(); - par_iter(&hir_map.krate().modules).for_each(|(module_id, _)| { - let local_def_id = hir_map.local_def_id(*module_id); - hir_map.visit_item_likes_in_module( - local_def_id, - &mut OuterVisitor { hir_map, errors: &errors }, - ); + par_iter(&hir_map.krate().modules).for_each(|(&module_id, _)| { + hir_map + .visit_item_likes_in_module(module_id, &mut OuterVisitor { hir_map, errors: &errors }); }); let errors = errors.into_inner(); @@ -56,22 +53,22 @@ impl<'a, 'hir> OuterVisitor<'a, 'hir> { impl<'a, 'hir> ItemLikeVisitor<'hir> for OuterVisitor<'a, 'hir> { 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)); + inner_visitor.check(i.hir_id(), |this| intravisit::walk_item(this, i)); } 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)); + inner_visitor.check(i.hir_id(), |this| intravisit::walk_trait_item(this, i)); } 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)); + inner_visitor.check(i.hir_id(), |this| intravisit::walk_impl_item(this, i)); } fn visit_foreign_item(&mut self, i: &'hir hir::ForeignItem<'hir>) { let mut inner_visitor = self.new_inner_visitor(self.hir_map); - inner_visitor.check(i.hir_id, |this| intravisit::walk_foreign_item(this, i)); + inner_visitor.check(i.hir_id(), |this| intravisit::walk_foreign_item(this, i)); } } diff --git a/compiler/rustc_passes/src/hir_stats.rs b/compiler/rustc_passes/src/hir_stats.rs index 1d02c9aa63..2bed8cadeb 100644 --- a/compiler/rustc_passes/src/hir_stats.rs +++ b/compiler/rustc_passes/src/hir_stats.rs @@ -66,13 +66,13 @@ impl<'k> StatCollector<'k> { let mut total_size = 0; - println!("\n{}\n", title); + eprintln!("\n{}\n", title); - println!("{:<18}{:>18}{:>14}{:>14}", "Name", "Accumulated Size", "Count", "Item Size"); - println!("----------------------------------------------------------------"); + eprintln!("{:<18}{:>18}{:>14}{:>14}", "Name", "Accumulated Size", "Count", "Item Size"); + eprintln!("----------------------------------------------------------------"); for (label, data) in stats { - println!( + eprintln!( "{:<18}{:>18}{:>14}{:>14}", label, to_readable_str(data.count * data.size), @@ -82,8 +82,8 @@ impl<'k> StatCollector<'k> { total_size += data.count * data.size; } - println!("----------------------------------------------------------------"); - println!("{:<18}{:>18}\n", "Total", to_readable_str(total_size)); + eprintln!("----------------------------------------------------------------"); + eprintln!("{:<18}{:>18}\n", "Total", to_readable_str(total_size)); } } @@ -100,7 +100,7 @@ impl<'v> hir_visit::Visitor<'v> for StatCollector<'v> { } fn visit_nested_item(&mut self, id: hir::ItemId) { - let nested_item = self.krate.unwrap().item(id.id); + let nested_item = self.krate.unwrap().item(id); self.visit_item(nested_item) } @@ -114,23 +114,23 @@ impl<'v> hir_visit::Visitor<'v> for StatCollector<'v> { self.visit_impl_item(nested_impl_item) } + fn visit_nested_foreign_item(&mut self, id: hir::ForeignItemId) { + let nested_foreign_item = self.krate.unwrap().foreign_item(id); + self.visit_foreign_item(nested_foreign_item); + } + fn visit_nested_body(&mut self, body_id: hir::BodyId) { let nested_body = self.krate.unwrap().body(body_id); self.visit_body(nested_body) } fn visit_item(&mut self, i: &'v hir::Item<'v>) { - self.record("Item", Id::Node(i.hir_id), i); + self.record("Item", Id::Node(i.hir_id()), i); hir_visit::walk_item(self, i) } - fn visit_mod(&mut self, m: &'v hir::Mod<'v>, _s: Span, n: hir::HirId) { - self.record("Mod", Id::None, m); - hir_visit::walk_mod(self, m, n) - } - fn visit_foreign_item(&mut self, i: &'v hir::ForeignItem<'v>) { - self.record("ForeignItem", Id::Node(i.hir_id), i); + self.record("ForeignItem", Id::Node(i.hir_id()), i); hir_visit::walk_foreign_item(self, i) } @@ -187,12 +187,12 @@ impl<'v> hir_visit::Visitor<'v> for StatCollector<'v> { } fn visit_trait_item(&mut self, ti: &'v hir::TraitItem<'v>) { - self.record("TraitItem", Id::Node(ti.hir_id), ti); + self.record("TraitItem", Id::Node(ti.hir_id()), ti); hir_visit::walk_trait_item(self, ti) } fn visit_impl_item(&mut self, ii: &'v hir::ImplItem<'v>) { - self.record("ImplItem", Id::Node(ii.hir_id), ii); + self.record("ImplItem", Id::Node(ii.hir_id()), ii); hir_visit::walk_impl_item(self, ii) } @@ -201,9 +201,9 @@ impl<'v> hir_visit::Visitor<'v> for StatCollector<'v> { hir_visit::walk_param_bound(self, bounds) } - fn visit_struct_field(&mut self, s: &'v hir::StructField<'v>) { - self.record("StructField", Id::Node(s.hir_id), s); - hir_visit::walk_struct_field(self, s) + fn visit_field_def(&mut self, s: &'v hir::FieldDef<'v>) { + self.record("FieldDef", Id::Node(s.hir_id), s); + hir_visit::walk_field_def(self, s) } fn visit_variant( @@ -241,22 +241,17 @@ impl<'v> hir_visit::Visitor<'v> for StatCollector<'v> { hir_visit::walk_assoc_type_binding(self, type_binding) } - fn visit_attribute(&mut self, attr: &'v ast::Attribute) { + fn visit_attribute(&mut self, _: hir::HirId, attr: &'v ast::Attribute) { self.record("Attribute", Id::Attr(attr.id), attr); } fn visit_macro_def(&mut self, macro_def: &'v hir::MacroDef<'v>) { - self.record("MacroDef", Id::Node(macro_def.hir_id), macro_def); + self.record("MacroDef", Id::Node(macro_def.hir_id()), macro_def); hir_visit::walk_macro_def(self, macro_def) } } impl<'v> ast_visit::Visitor<'v> for StatCollector<'v> { - fn visit_mod(&mut self, m: &'v ast::Mod, _s: Span, _a: &[ast::Attribute], _n: NodeId) { - self.record("Mod", Id::None, m); - ast_visit::walk_mod(self, m) - } - fn visit_foreign_item(&mut self, i: &'v ast::ForeignItem) { self.record("ForeignItem", Id::None, i); ast_visit::walk_foreign_item(self, i) @@ -321,9 +316,9 @@ impl<'v> ast_visit::Visitor<'v> for StatCollector<'v> { ast_visit::walk_param_bound(self, bounds) } - fn visit_struct_field(&mut self, s: &'v ast::StructField) { - self.record("StructField", Id::None, s); - ast_visit::walk_struct_field(self, s) + fn visit_field_def(&mut self, s: &'v ast::FieldDef) { + self.record("FieldDef", Id::None, s); + ast_visit::walk_field_def(self, s) } fn visit_variant(&mut self, v: &'v ast::Variant) { diff --git a/compiler/rustc_passes/src/lang_items.rs b/compiler/rustc_passes/src/lang_items.rs index 3132661e5f..7e6bb9779f 100644 --- a/compiler/rustc_passes/src/lang_items.rs +++ b/compiler/rustc_passes/src/lang_items.rs @@ -13,7 +13,6 @@ use crate::weak_lang_items; use rustc_middle::middle::cstore::ExternCrate; use rustc_middle::ty::TyCtxt; -use rustc_ast::Attribute; use rustc_errors::struct_span_err; use rustc_hir as hir; use rustc_hir::def_id::{DefId, LOCAL_CRATE}; @@ -30,29 +29,21 @@ struct LanguageItemCollector<'tcx> { impl ItemLikeVisitor<'v> for LanguageItemCollector<'tcx> { fn visit_item(&mut self, item: &hir::Item<'_>) { - self.check_for_lang(Target::from_item(item), item.hir_id, item.attrs); + self.check_for_lang(Target::from_item(item), item.hir_id()); if let hir::ItemKind::Enum(def, ..) = &item.kind { for variant in def.variants { - self.check_for_lang(Target::Variant, variant.id, variant.attrs); + self.check_for_lang(Target::Variant, variant.id); } } } fn visit_trait_item(&mut self, trait_item: &hir::TraitItem<'_>) { - self.check_for_lang( - Target::from_trait_item(trait_item), - trait_item.hir_id, - trait_item.attrs, - ) + self.check_for_lang(Target::from_trait_item(trait_item), trait_item.hir_id()) } fn visit_impl_item(&mut self, impl_item: &hir::ImplItem<'_>) { - self.check_for_lang( - target_from_impl_item(self.tcx, impl_item), - impl_item.hir_id, - impl_item.attrs, - ) + self.check_for_lang(target_from_impl_item(self.tcx, impl_item), impl_item.hir_id()) } fn visit_foreign_item(&mut self, _: &hir::ForeignItem<'_>) {} @@ -63,7 +54,8 @@ impl LanguageItemCollector<'tcx> { LanguageItemCollector { tcx, items: LanguageItems::new() } } - fn check_for_lang(&mut self, actual_target: Target, hir_id: HirId, attrs: &[Attribute]) { + fn check_for_lang(&mut self, actual_target: Target, hir_id: HirId) { + let attrs = self.tcx.hir().attrs(hir_id); let check_name = |attr, sym| self.tcx.sess.check_name(attr, sym); if let Some((value, span)) = extract(check_name, &attrs) { match ITEM_REFS.get(&value).cloned() { diff --git a/compiler/rustc_passes/src/layout_test.rs b/compiler/rustc_passes/src/layout_test.rs index 9e83cbd668..18c1d64706 100644 --- a/compiler/rustc_passes/src/layout_test.rs +++ b/compiler/rustc_passes/src/layout_test.rs @@ -21,16 +21,14 @@ struct LayoutTest<'tcx> { impl ItemLikeVisitor<'tcx> for LayoutTest<'tcx> { fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { - let item_def_id = self.tcx.hir().local_def_id(item.hir_id); - match item.kind { ItemKind::TyAlias(..) | ItemKind::Enum(..) | ItemKind::Struct(..) | ItemKind::Union(..) => { - for attr in self.tcx.get_attrs(item_def_id.to_def_id()).iter() { + for attr in self.tcx.get_attrs(item.def_id.to_def_id()).iter() { if self.tcx.sess.check_name(attr, sym::rustc_layout) { - self.dump_layout_of(item_def_id, item, attr); + self.dump_layout_of(item.def_id, item, attr); } } } diff --git a/compiler/rustc_passes/src/lib_features.rs b/compiler/rustc_passes/src/lib_features.rs index 7c62a234db..3dfe317a4b 100644 --- a/compiler/rustc_passes/src/lib_features.rs +++ b/compiler/rustc_passes/src/lib_features.rs @@ -109,7 +109,7 @@ impl LibFeatureCollector<'tcx> { } fn span_feature_error(&self, span: Span, msg: &str) { - struct_span_err!(self.tcx.sess, span, E0711, "{}", &msg,).emit(); + struct_span_err!(self.tcx.sess, span, E0711, "{}", &msg).emit(); } } @@ -120,7 +120,7 @@ impl Visitor<'tcx> for LibFeatureCollector<'tcx> { NestedVisitorMap::All(self.tcx.hir()) } - fn visit_attribute(&mut self, attr: &'tcx Attribute) { + fn visit_attribute(&mut self, _: rustc_hir::HirId, attr: &'tcx Attribute) { if let Some((feature, stable, span)) = self.extract(attr) { self.collect_feature(feature, stable, span); } @@ -131,7 +131,7 @@ fn collect(tcx: TyCtxt<'_>) -> LibFeatures { let mut collector = LibFeatureCollector::new(tcx); let krate = tcx.hir().krate(); for attr in krate.non_exported_macro_attrs { - collector.visit_attribute(attr); + collector.visit_attribute(rustc_hir::CRATE_HIR_ID, attr); } intravisit::walk_crate(&mut collector, krate); collector.lib_features diff --git a/compiler/rustc_passes/src/liveness.rs b/compiler/rustc_passes/src/liveness.rs index c11dc231d4..9aef49df7b 100644 --- a/compiler/rustc_passes/src/liveness.rs +++ b/compiler/rustc_passes/src/liveness.rs @@ -95,7 +95,7 @@ use rustc_hir::{Expr, HirId, HirIdMap, HirIdSet}; use rustc_index::vec::IndexVec; use rustc_middle::hir::map::Map; use rustc_middle::ty::query::Providers; -use rustc_middle::ty::{self, DefIdTree, TyCtxt}; +use rustc_middle::ty::{self, DefIdTree, RootVariableMinCaptureList, TyCtxt}; use rustc_session::lint; use rustc_span::symbol::{kw, sym, Symbol}; use rustc_span::Span; @@ -331,7 +331,7 @@ impl<'tcx> Visitor<'tcx> for IrMaps<'tcx> { } } - if let Some(captures) = maps.tcx.typeck(local_def_id).closure_captures.get(&def_id) { + if let Some(captures) = maps.tcx.typeck(local_def_id).closure_min_captures.get(&def_id) { for &var_hir_id in captures.keys() { let var_name = maps.tcx.hir().name(var_hir_id); maps.add_variable(Upvar(var_hir_id, var_name)); @@ -367,12 +367,17 @@ impl<'tcx> Visitor<'tcx> for IrMaps<'tcx> { } fn visit_param(&mut self, param: &'tcx hir::Param<'tcx>) { - let is_shorthand = matches!(param.pat.kind, rustc_hir::PatKind::Struct(..)); param.pat.each_binding(|_bm, hir_id, _x, ident| { - let var = if is_shorthand { - Local(LocalInfo { id: hir_id, name: ident.name, is_shorthand: true }) - } else { - Param(hir_id, ident.name) + let var = match param.pat.kind { + rustc_hir::PatKind::Struct(_, fields, _) => Local(LocalInfo { + id: hir_id, + name: ident.name, + is_shorthand: fields + .iter() + .find(|f| f.ident == ident) + .map_or(false, |f| f.is_shorthand), + }), + _ => Param(hir_id, ident.name), }; self.add_variable(var); }); @@ -403,10 +408,10 @@ impl<'tcx> Visitor<'tcx> for IrMaps<'tcx> { if let Some(captures) = self .tcx .typeck(closure_def_id) - .closure_captures + .closure_min_captures .get(&closure_def_id.to_def_id()) { - // If closure captures is Some, upvars_mentioned must also be Some + // If closure_min_captures is Some, upvars_mentioned must also be Some let upvars = self.tcx.upvars_mentioned(closure_def_id).unwrap(); call_caps.extend(captures.keys().map(|var_id| { let upvar = upvars[var_id]; @@ -476,11 +481,10 @@ const ACC_USE: u32 = 4; struct Liveness<'a, 'tcx> { ir: &'a mut IrMaps<'tcx>, - body_owner: LocalDefId, typeck_results: &'a ty::TypeckResults<'tcx>, param_env: ty::ParamEnv<'tcx>, upvars: Option<&'tcx FxIndexMap>, - closure_captures: Option<&'tcx FxIndexMap>, + closure_min_captures: Option<&'tcx RootVariableMinCaptureList<'tcx>>, successors: IndexVec>, rwu_table: rwu_table::RWUTable, @@ -504,8 +508,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { let typeck_results = ir.tcx.typeck(body_owner); let param_env = ir.tcx.param_env(body_owner); let upvars = ir.tcx.upvars_mentioned(body_owner); - let closure_captures = typeck_results.closure_captures.get(&body_owner.to_def_id()); - + let closure_min_captures = typeck_results.closure_min_captures.get(&body_owner.to_def_id()); let closure_ln = ir.add_live_node(ClosureNode); let exit_ln = ir.add_live_node(ExitNode); @@ -514,11 +517,10 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { Liveness { ir, - body_owner, typeck_results, param_env, upvars, - closure_captures, + closure_min_captures, successors: IndexVec::from_elem_n(None, num_live_nodes), rwu_table: rwu_table::RWUTable::new(num_live_nodes, num_vars), closure_ln, @@ -702,25 +704,27 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { // if they are live on the entry to the closure, since only the closure // itself can access them on subsequent calls. - if let Some(closure_captures) = self.closure_captures { + if let Some(closure_min_captures) = self.closure_min_captures { // Mark upvars captured by reference as used after closure exits. - // Since closure_captures is Some, upvars must exists too. - let upvars = self.upvars.unwrap(); - for (&var_hir_id, upvar_id) in closure_captures { - let upvar = upvars[&var_hir_id]; - match self.typeck_results.upvar_capture(*upvar_id) { - ty::UpvarCapture::ByRef(_) => { - let var = self.variable(var_hir_id, upvar.span); - self.acc(self.exit_ln, var, ACC_READ | ACC_USE); + for (&var_hir_id, min_capture_list) in closure_min_captures { + for captured_place in min_capture_list { + match captured_place.info.capture_kind { + ty::UpvarCapture::ByRef(_) => { + let var = self.variable( + var_hir_id, + captured_place.get_capture_kind_span(self.ir.tcx), + ); + self.acc(self.exit_ln, var, ACC_READ | ACC_USE); + } + ty::UpvarCapture::ByValue(_) => {} } - ty::UpvarCapture::ByValue(_) => {} } } } let succ = self.propagate_through_expr(&body.value, self.exit_ln); - if self.closure_captures.is_none() { + if self.closure_min_captures.is_none() { // Either not a closure, or closure without any captured variables. // No need to determine liveness of captured variables, since there // are none. @@ -1216,7 +1220,7 @@ impl<'a, 'tcx> Liveness<'a, 'tcx> { match path.res { Res::Local(hid) => { let in_upvars = self.upvars.map_or(false, |u| u.contains_key(&hid)); - let in_captures = self.closure_captures.map_or(false, |c| c.contains_key(&hid)); + let in_captures = self.closure_min_captures.map_or(false, |c| c.contains_key(&hid)); match (in_upvars, in_captures) { (false, _) | (true, true) => self.access_var(hir_id, hid, succ, acc, path.span), @@ -1417,52 +1421,52 @@ impl<'tcx> Liveness<'_, 'tcx> { } fn warn_about_unused_upvars(&self, entry_ln: LiveNode) { - let closure_captures = match self.closure_captures { + let closure_min_captures = match self.closure_min_captures { None => return, - Some(closure_captures) => closure_captures, + Some(closure_min_captures) => closure_min_captures, }; - // If closure_captures is Some(), upvars must be Some() too. - let upvars = self.upvars.unwrap(); - for &var_hir_id in closure_captures.keys() { - let upvar = upvars[&var_hir_id]; - let var = self.variable(var_hir_id, upvar.span); - let upvar_id = ty::UpvarId { - var_path: ty::UpvarPath { hir_id: var_hir_id }, - closure_expr_id: self.body_owner, - }; - match self.typeck_results.upvar_capture(upvar_id) { - ty::UpvarCapture::ByValue(_) => {} - ty::UpvarCapture::ByRef(..) => continue, - }; - if self.used_on_entry(entry_ln, var) { - if !self.live_on_entry(entry_ln, var) { + // If closure_min_captures is Some(), upvars must be Some() too. + for (&var_hir_id, min_capture_list) in closure_min_captures { + for captured_place in min_capture_list { + match captured_place.info.capture_kind { + ty::UpvarCapture::ByValue(_) => {} + ty::UpvarCapture::ByRef(..) => continue, + }; + let span = captured_place.get_capture_kind_span(self.ir.tcx); + let var = self.variable(var_hir_id, span); + if self.used_on_entry(entry_ln, var) { + if !self.live_on_entry(entry_ln, var) { + if let Some(name) = self.should_warn(var) { + self.ir.tcx.struct_span_lint_hir( + lint::builtin::UNUSED_ASSIGNMENTS, + var_hir_id, + vec![span], + |lint| { + lint.build(&format!( + "value captured by `{}` is never read", + name + )) + .help("did you mean to capture by reference instead?") + .emit(); + }, + ); + } + } + } else { if let Some(name) = self.should_warn(var) { self.ir.tcx.struct_span_lint_hir( - lint::builtin::UNUSED_ASSIGNMENTS, + lint::builtin::UNUSED_VARIABLES, var_hir_id, - vec![upvar.span], + vec![span], |lint| { - lint.build(&format!("value captured by `{}` is never read", name)) + lint.build(&format!("unused variable: `{}`", name)) .help("did you mean to capture by reference instead?") .emit(); }, ); } } - } else { - if let Some(name) = self.should_warn(var) { - self.ir.tcx.struct_span_lint_hir( - lint::builtin::UNUSED_VARIABLES, - var_hir_id, - vec![upvar.span], - |lint| { - lint.build(&format!("unused variable: `{}`", name)) - .help("did you mean to capture by reference instead?") - .emit(); - }, - ); - } } } } @@ -1489,12 +1493,13 @@ impl<'tcx> Liveness<'_, 'tcx> { // bindings, and we also consider the first pattern to be the "authoritative" set of ids. // However, we should take the ids and spans of variables with the same name from the later // patterns so the suggestions to prefix with underscores will apply to those too. - let mut vars: FxIndexMap)> = <_>::default(); + let mut vars: FxIndexMap)> = + <_>::default(); pat.each_binding(|_, hir_id, pat_sp, ident| { let ln = entry_ln.unwrap_or_else(|| self.live_node(hir_id, pat_sp)); let var = self.variable(hir_id, ident.span); - let id_and_sp = (hir_id, pat_sp); + let id_and_sp = (hir_id, pat_sp, ident.span); vars.entry(self.ir.variable_name(var)) .and_modify(|(.., hir_ids_and_spans)| hir_ids_and_spans.push(id_and_sp)) .or_insert_with(|| (ln, var, vec![id_and_sp])); @@ -1503,7 +1508,8 @@ impl<'tcx> Liveness<'_, 'tcx> { for (_, (ln, var, hir_ids_and_spans)) in vars { if self.used_on_entry(ln, var) { let id = hir_ids_and_spans[0].0; - let spans = hir_ids_and_spans.into_iter().map(|(_, sp)| sp).collect(); + let spans = + hir_ids_and_spans.into_iter().map(|(_, _, ident_span)| ident_span).collect(); on_used_on_entry(spans, id, ln, var); } else { self.report_unused(hir_ids_and_spans, ln, var); @@ -1511,7 +1517,12 @@ impl<'tcx> Liveness<'_, 'tcx> { } } - fn report_unused(&self, hir_ids_and_spans: Vec<(HirId, Span)>, ln: LiveNode, var: Variable) { + fn report_unused( + &self, + hir_ids_and_spans: Vec<(HirId, Span, Span)>, + ln: LiveNode, + var: Variable, + ) { let first_hir_id = hir_ids_and_spans[0].0; if let Some(name) = self.should_warn(var).filter(|name| name != "self") { @@ -1525,7 +1536,10 @@ impl<'tcx> Liveness<'_, 'tcx> { self.ir.tcx.struct_span_lint_hir( lint::builtin::UNUSED_VARIABLES, first_hir_id, - hir_ids_and_spans.into_iter().map(|(_, sp)| sp).collect::>(), + hir_ids_and_spans + .into_iter() + .map(|(_, _, ident_span)| ident_span) + .collect::>(), |lint| { lint.build(&format!("variable `{}` is assigned to, but never used", name)) .note(&format!("consider using `_{}` instead", name)) @@ -1533,54 +1547,67 @@ impl<'tcx> Liveness<'_, 'tcx> { }, ) } else { - self.ir.tcx.struct_span_lint_hir( - lint::builtin::UNUSED_VARIABLES, - first_hir_id, - hir_ids_and_spans.iter().map(|(_, sp)| *sp).collect::>(), - |lint| { - let mut err = lint.build(&format!("unused variable: `{}`", name)); - - let (shorthands, non_shorthands): (Vec<_>, Vec<_>) = - hir_ids_and_spans.into_iter().partition(|(hir_id, span)| { - let var = self.variable(*hir_id, *span); - self.ir.variable_is_shorthand(var) - }); - - let mut shorthands = shorthands - .into_iter() - .map(|(_, span)| (span, format!("{}: _", name))) - .collect::>(); - - // If we have both shorthand and non-shorthand, prefer the "try ignoring - // the field" message, and suggest `_` for the non-shorthands. If we only - // have non-shorthand, then prefix with an underscore instead. - if !shorthands.is_empty() { - shorthands.extend( - non_shorthands - .into_iter() - .map(|(_, span)| (span, "_".to_string())) - .collect::>(), - ); + let (shorthands, non_shorthands): (Vec<_>, Vec<_>) = + hir_ids_and_spans.iter().copied().partition(|(hir_id, _, ident_span)| { + let var = self.variable(*hir_id, *ident_span); + self.ir.variable_is_shorthand(var) + }); + // If we have both shorthand and non-shorthand, prefer the "try ignoring + // the field" message, and suggest `_` for the non-shorthands. If we only + // have non-shorthand, then prefix with an underscore instead. + if !shorthands.is_empty() { + let shorthands = shorthands + .into_iter() + .map(|(_, pat_span, _)| (pat_span, format!("{}: _", name))) + .chain( + non_shorthands + .into_iter() + .map(|(_, pat_span, _)| (pat_span, "_".to_string())), + ) + .collect::>(); + + self.ir.tcx.struct_span_lint_hir( + lint::builtin::UNUSED_VARIABLES, + first_hir_id, + hir_ids_and_spans + .iter() + .map(|(_, pat_span, _)| *pat_span) + .collect::>(), + |lint| { + let mut err = lint.build(&format!("unused variable: `{}`", name)); err.multipart_suggestion( "try ignoring the field", shorthands, Applicability::MachineApplicable, ); - } else { + err.emit() + }, + ); + } else { + let non_shorthands = non_shorthands + .into_iter() + .map(|(_, _, ident_span)| (ident_span, format!("_{}", name))) + .collect::>(); + + self.ir.tcx.struct_span_lint_hir( + lint::builtin::UNUSED_VARIABLES, + first_hir_id, + hir_ids_and_spans + .iter() + .map(|(_, _, ident_span)| *ident_span) + .collect::>(), + |lint| { + let mut err = lint.build(&format!("unused variable: `{}`", name)); err.multipart_suggestion( "if this is intentional, prefix it with an underscore", - non_shorthands - .into_iter() - .map(|(_, span)| (span, format!("_{}", name))) - .collect::>(), + non_shorthands, Applicability::MachineApplicable, ); - } - - err.emit() - }, - ); + err.emit() + }, + ); + } } } } diff --git a/compiler/rustc_passes/src/naked_functions.rs b/compiler/rustc_passes/src/naked_functions.rs index 93fb23c018..89bc2e1a98 100644 --- a/compiler/rustc_passes/src/naked_functions.rs +++ b/compiler/rustc_passes/src/naked_functions.rs @@ -46,7 +46,7 @@ impl<'tcx> Visitor<'tcx> for CheckNakedFunctions<'tcx> { let fn_header; match fk { - FnKind::Closure(..) => { + FnKind::Closure => { // Closures with a naked attribute are rejected during attribute // check. Don't validate them any further. return; @@ -62,7 +62,8 @@ impl<'tcx> Visitor<'tcx> for CheckNakedFunctions<'tcx> { } } - let naked = fk.attrs().iter().any(|attr| attr.has_name(sym::naked)); + let attrs = self.tcx.hir().attrs(hir_id); + let naked = attrs.iter().any(|attr| attr.has_name(sym::naked)); if naked { let body = self.tcx.hir().body(body_id); check_abi(self.tcx, hir_id, fn_header.abi, ident_span); diff --git a/compiler/rustc_passes/src/reachable.rs b/compiler/rustc_passes/src/reachable.rs index eb24c51c54..20aaaea5b9 100644 --- a/compiler/rustc_passes/src/reachable.rs +++ b/compiler/rustc_passes/src/reachable.rs @@ -31,7 +31,7 @@ fn item_might_be_inlined(tcx: TyCtxt<'tcx>, item: &hir::Item<'_>, attrs: &Codege match item.kind { hir::ItemKind::Fn(ref sig, ..) if sig.header.is_const() => true, hir::ItemKind::Impl { .. } | hir::ItemKind::Fn(..) => { - let generics = tcx.generics_of(tcx.hir().local_def_id(item.hir_id)); + let generics = tcx.generics_of(item.def_id); generics.requires_monomorphization(tcx) } _ => false, @@ -43,8 +43,8 @@ fn method_might_be_inlined( impl_item: &hir::ImplItem<'_>, impl_src: LocalDefId, ) -> bool { - let codegen_fn_attrs = tcx.codegen_fn_attrs(impl_item.hir_id.owner.to_def_id()); - let generics = tcx.generics_of(tcx.hir().local_def_id(impl_item.hir_id)); + let codegen_fn_attrs = tcx.codegen_fn_attrs(impl_item.hir_id().owner.to_def_id()); + let generics = tcx.generics_of(impl_item.def_id); if codegen_fn_attrs.requests_inline() || generics.requires_monomorphization(tcx) { return true; } @@ -218,8 +218,7 @@ impl<'tcx> ReachableContext<'tcx> { } else { false }; - let def_id = self.tcx.hir().local_def_id(item.hir_id); - let codegen_attrs = self.tcx.codegen_fn_attrs(def_id); + let codegen_attrs = self.tcx.codegen_fn_attrs(item.def_id); let is_extern = codegen_attrs.contains_extern_indicator(); let std_internal = codegen_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL); @@ -239,9 +238,11 @@ impl<'tcx> ReachableContext<'tcx> { Node::Item(item) => { match item.kind { hir::ItemKind::Fn(.., body) => { - let def_id = self.tcx.hir().local_def_id(item.hir_id); - if item_might_be_inlined(self.tcx, &item, self.tcx.codegen_fn_attrs(def_id)) - { + if item_might_be_inlined( + self.tcx, + &item, + self.tcx.codegen_fn_attrs(item.def_id), + ) { self.visit_nested_body(body); } } @@ -341,23 +342,21 @@ impl<'a, 'tcx> ItemLikeVisitor<'tcx> for CollectPrivateImplItemsVisitor<'a, 'tcx // Anything which has custom linkage gets thrown on the worklist no // matter where it is in the crate, along with "special std symbols" // which are currently akin to allocator symbols. - let def_id = self.tcx.hir().local_def_id(item.hir_id); - let codegen_attrs = self.tcx.codegen_fn_attrs(def_id); + let codegen_attrs = self.tcx.codegen_fn_attrs(item.def_id); if codegen_attrs.contains_extern_indicator() || codegen_attrs.flags.contains(CodegenFnAttrFlags::RUSTC_STD_INTERNAL_SYMBOL) { - self.worklist.push(def_id); + self.worklist.push(item.def_id); } // We need only trait impls here, not inherent impls, and only non-exported ones if let hir::ItemKind::Impl(hir::Impl { of_trait: Some(ref trait_ref), ref items, .. }) = item.kind { - if !self.access_levels.is_reachable(item.hir_id) { + if !self.access_levels.is_reachable(item.hir_id()) { // FIXME(#53488) remove `let` let tcx = self.tcx; - self.worklist - .extend(items.iter().map(|ii_ref| tcx.hir().local_def_id(ii_ref.id.hir_id))); + self.worklist.extend(items.iter().map(|ii_ref| ii_ref.id.def_id)); let trait_def_id = match trait_ref.path.res { Res::Def(DefKind::Trait, def_id) => def_id, diff --git a/compiler/rustc_passes/src/region.rs b/compiler/rustc_passes/src/region.rs index 64356f73f6..b532021bed 100644 --- a/compiler/rustc_passes/src/region.rs +++ b/compiler/rustc_passes/src/region.rs @@ -664,7 +664,7 @@ fn resolve_local<'tcx>( match expr.kind { hir::ExprKind::AddrOf(_, _, ref subexpr) - | hir::ExprKind::Unary(hir::UnOp::UnDeref, ref subexpr) + | hir::ExprKind::Unary(hir::UnOp::Deref, ref subexpr) | hir::ExprKind::Field(ref subexpr, _) | hir::ExprKind::Index(ref subexpr, _) => { expr = &subexpr; diff --git a/compiler/rustc_passes/src/stability.rs b/compiler/rustc_passes/src/stability.rs index e1d03e3504..dd9cb51c85 100644 --- a/compiler/rustc_passes/src/stability.rs +++ b/compiler/rustc_passes/src/stability.rs @@ -9,7 +9,7 @@ use rustc_hir as hir; use rustc_hir::def::{DefKind, Res}; use rustc_hir::def_id::{DefId, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; -use rustc_hir::{Generics, HirId, Item, StructField, TraitRef, Ty, TyKind, Variant}; +use rustc_hir::{FieldDef, Generics, HirId, Item, TraitRef, Ty, TyKind, Variant}; use rustc_middle::hir::map::Map; use rustc_middle::middle::privacy::AccessLevels; use rustc_middle::middle::stability::{DeprecationEntry, Index}; @@ -70,6 +70,17 @@ impl InheritConstStability { } } +enum InheritStability { + Yes, + No, +} + +impl InheritStability { + fn yes(&self) -> bool { + matches!(self, InheritStability::Yes) + } +} + // A private tree-walker for producing an Index. struct Annotator<'a, 'tcx> { tcx: TyCtxt<'tcx>, @@ -86,15 +97,16 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> { fn annotate( &mut self, hir_id: HirId, - attrs: &[Attribute], item_sp: Span, kind: AnnotationKind, inherit_deprecation: InheritDeprecation, inherit_const_stability: InheritConstStability, + inherit_from_parent: InheritStability, visit_children: F, ) where F: FnOnce(&mut Self), { + let attrs = self.tcx.hir().attrs(hir_id); debug!("annotate(id = {:?}, attrs = {:?})", hir_id, attrs); let mut did_error = false; if !self.tcx.features().staged_api { @@ -131,12 +143,13 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> { } if self.tcx.features().staged_api { - if let Some(..) = attrs.iter().find(|a| self.tcx.sess.check_name(a, sym::deprecated)) { - self.tcx.sess.span_err( - item_sp, - "`#[deprecated]` cannot be used in staged API; \ - use `#[rustc_deprecated]` instead", - ); + if let Some(a) = attrs.iter().find(|a| self.tcx.sess.check_name(a, sym::deprecated)) { + self.tcx + .sess + .struct_span_err(a.span, "`#[deprecated]` cannot be used in staged API") + .span_label(a.span, "use `#[rustc_deprecated]` instead") + .span_label(item_sp, "") + .emit(); } } else { self.recurse_with_stability_attrs( @@ -150,7 +163,7 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> { let (stab, const_stab) = attr::find_stability(&self.tcx.sess, attrs, item_sp); - let const_stab = const_stab.map(|const_stab| { + let const_stab = const_stab.map(|(const_stab, _)| { let const_stab = self.tcx.intern_const_stability(const_stab); self.index.const_stab_map.insert(hir_id, const_stab); const_stab @@ -180,12 +193,15 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> { } } - let stab = stab.map(|stab| { + let stab = stab.map(|(stab, span)| { // Error if prohibited, or can't inherit anything from a container. if kind == AnnotationKind::Prohibited || (kind == AnnotationKind::Container && stab.level.is_stable() && is_deprecated) { - self.tcx.sess.span_err(item_sp, "This stability annotation is useless"); + self.tcx.sess.struct_span_err(span,"this stability annotation is useless") + .span_label(span, "useless stability annotation") + .span_label(item_sp, "the stability attribute annotates this item") + .emit(); } debug!("annotate: found {:?}", stab); @@ -202,16 +218,19 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> { { match stab_v.parse::() { Err(_) => { - self.tcx.sess.span_err(item_sp, "Invalid stability version found"); + self.tcx.sess.struct_span_err(span, "invalid stability version found") + .span_label(span, "invalid stability version") + .span_label(item_sp, "the stability attribute annotates this item") + .emit(); break; } Ok(stab_vp) => match dep_v.parse::() { Ok(dep_vp) => match dep_vp.cmp(&stab_vp) { Ordering::Less => { - self.tcx.sess.span_err( - item_sp, - "An API can't be stabilized after it is deprecated", - ); + self.tcx.sess.struct_span_err(span, "an API can't be stabilized after it is deprecated") + .span_label(span, "invalid version") + .span_label(item_sp, "the stability attribute annotates this item") + .emit(); break; } Ordering::Equal => continue, @@ -219,9 +238,10 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> { }, Err(_) => { if dep_v != "TBD" { - self.tcx - .sess - .span_err(item_sp, "Invalid deprecation version found"); + self.tcx.sess.struct_span_err(span, "invalid deprecation version found") + .span_label(span, "invalid deprecation version") + .span_label(item_sp, "the stability attribute annotates this item") + .emit(); } break; } @@ -237,7 +257,9 @@ impl<'a, 'tcx> Annotator<'a, 'tcx> { if stab.is_none() { debug!("annotate: stab not found, parent = {:?}", self.parent_stab); if let Some(stab) = self.parent_stab { - if inherit_deprecation.yes() && stab.level.is_unstable() { + if inherit_deprecation.yes() && stab.level.is_unstable() + || inherit_from_parent.yes() + { self.index.stab_map.insert(hir_id, stab); } } @@ -363,11 +385,11 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> { if let Some(ctor_hir_id) = sd.ctor_hir_id() { self.annotate( ctor_hir_id, - &i.attrs, i.span, AnnotationKind::Required, InheritDeprecation::Yes, InheritConstStability::No, + InheritStability::Yes, |_| {}, ) } @@ -376,12 +398,12 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> { } self.annotate( - i.hir_id, - &i.attrs, + i.hir_id(), i.span, kind, InheritDeprecation::Yes, const_stab_inherit, + InheritStability::No, |v| intravisit::walk_item(v, i), ); self.in_trait_impl = orig_in_trait_impl; @@ -389,12 +411,12 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> { fn visit_trait_item(&mut self, ti: &'tcx hir::TraitItem<'tcx>) { self.annotate( - ti.hir_id, - &ti.attrs, + ti.hir_id(), ti.span, AnnotationKind::Required, InheritDeprecation::Yes, InheritConstStability::No, + InheritStability::No, |v| { intravisit::walk_trait_item(v, ti); }, @@ -405,12 +427,12 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> { let kind = if self.in_trait_impl { AnnotationKind::Prohibited } else { AnnotationKind::Required }; self.annotate( - ii.hir_id, - &ii.attrs, + ii.hir_id(), ii.span, kind, InheritDeprecation::Yes, InheritConstStability::No, + InheritStability::No, |v| { intravisit::walk_impl_item(v, ii); }, @@ -420,20 +442,20 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> { fn visit_variant(&mut self, var: &'tcx Variant<'tcx>, g: &'tcx Generics<'tcx>, item_id: HirId) { self.annotate( var.id, - &var.attrs, var.span, AnnotationKind::Required, InheritDeprecation::Yes, InheritConstStability::No, + InheritStability::Yes, |v| { if let Some(ctor_hir_id) = var.data.ctor_hir_id() { v.annotate( ctor_hir_id, - &var.attrs, var.span, AnnotationKind::Required, InheritDeprecation::Yes, InheritConstStability::No, + InheritStability::No, |_| {}, ); } @@ -443,28 +465,28 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> { ) } - fn visit_struct_field(&mut self, s: &'tcx StructField<'tcx>) { + fn visit_field_def(&mut self, s: &'tcx FieldDef<'tcx>) { self.annotate( s.hir_id, - &s.attrs, s.span, AnnotationKind::Required, InheritDeprecation::Yes, InheritConstStability::No, + InheritStability::Yes, |v| { - intravisit::walk_struct_field(v, s); + intravisit::walk_field_def(v, s); }, ); } fn visit_foreign_item(&mut self, i: &'tcx hir::ForeignItem<'tcx>) { self.annotate( - i.hir_id, - &i.attrs, + i.hir_id(), i.span, AnnotationKind::Required, InheritDeprecation::Yes, InheritConstStability::No, + InheritStability::No, |v| { intravisit::walk_foreign_item(v, i); }, @@ -473,12 +495,12 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> { fn visit_macro_def(&mut self, md: &'tcx hir::MacroDef<'tcx>) { self.annotate( - md.hir_id, - &md.attrs, + md.hir_id(), md.span, AnnotationKind::Required, InheritDeprecation::Yes, InheritConstStability::No, + InheritStability::No, |_| {}, ); } @@ -494,11 +516,11 @@ impl<'a, 'tcx> Visitor<'tcx> for Annotator<'a, 'tcx> { self.annotate( p.hir_id, - &p.attrs, p.span, kind, InheritDeprecation::No, InheritConstStability::No, + InheritStability::No, |v| { intravisit::walk_generic_param(v, p); }, @@ -556,7 +578,7 @@ impl<'tcx> Visitor<'tcx> for MissingStabilityAnnotations<'tcx> { hir::ItemKind::Impl(hir::Impl { of_trait: None, .. }) | hir::ItemKind::ForeignMod { .. } ) { - self.check_missing_stability(i.hir_id, i.span); + self.check_missing_stability(i.hir_id(), i.span); } // Ensure `const fn` that are `stable` have one of `rustc_const_unstable` or @@ -564,21 +586,21 @@ impl<'tcx> Visitor<'tcx> for MissingStabilityAnnotations<'tcx> { if self.tcx.features().staged_api && matches!(&i.kind, hir::ItemKind::Fn(sig, ..) if sig.header.is_const()) { - self.check_missing_const_stability(i.hir_id, i.span); + self.check_missing_const_stability(i.hir_id(), i.span); } intravisit::walk_item(self, i) } fn visit_trait_item(&mut self, ti: &'tcx hir::TraitItem<'tcx>) { - self.check_missing_stability(ti.hir_id, ti.span); + self.check_missing_stability(ti.hir_id(), ti.span); intravisit::walk_trait_item(self, ti); } fn visit_impl_item(&mut self, ii: &'tcx hir::ImplItem<'tcx>) { - let impl_def_id = self.tcx.hir().local_def_id(self.tcx.hir().get_parent_item(ii.hir_id)); + 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); + self.check_missing_stability(ii.hir_id(), ii.span); } intravisit::walk_impl_item(self, ii); } @@ -588,18 +610,18 @@ impl<'tcx> Visitor<'tcx> for MissingStabilityAnnotations<'tcx> { intravisit::walk_variant(self, var, g, item_id); } - fn visit_struct_field(&mut self, s: &'tcx StructField<'tcx>) { + fn visit_field_def(&mut self, s: &'tcx FieldDef<'tcx>) { self.check_missing_stability(s.hir_id, s.span); - intravisit::walk_struct_field(self, s); + intravisit::walk_field_def(self, s); } fn visit_foreign_item(&mut self, i: &'tcx hir::ForeignItem<'tcx>) { - self.check_missing_stability(i.hir_id, i.span); + self.check_missing_stability(i.hir_id(), i.span); intravisit::walk_foreign_item(self, i); } fn visit_macro_def(&mut self, md: &'tcx hir::MacroDef<'tcx>) { - self.check_missing_stability(md.hir_id, md.span); + self.check_missing_stability(md.hir_id(), md.span); } // Note that we don't need to `check_missing_stability` for default generic parameters, @@ -664,11 +686,11 @@ fn new_index(tcx: TyCtxt<'tcx>) -> Index<'tcx> { annotator.annotate( hir::CRATE_HIR_ID, - &krate.item.attrs, krate.item.span, AnnotationKind::Required, InheritDeprecation::Yes, InheritConstStability::No, + InheritStability::No, |v| intravisit::walk_crate(v, krate), ); } @@ -712,13 +734,12 @@ impl Visitor<'tcx> for Checker<'tcx> { return; } - let def_id = self.tcx.hir().local_def_id(item.hir_id); - let cnum = match self.tcx.extern_mod_stmt_cnum(def_id) { + let cnum = match self.tcx.extern_mod_stmt_cnum(item.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); + self.tcx.check_stability(def_id, Some(item.hir_id()), item.span); } // For implementations of traits, check the stability of each item @@ -730,21 +751,17 @@ impl Visitor<'tcx> for Checker<'tcx> { // error if all involved types and traits are stable, because // it will have no effect. // See: https://github.com/rust-lang/rust/issues/55436 - if let (Some(Stability { level: attr::Unstable { .. }, .. }), _) = - attr::find_stability(&self.tcx.sess, &item.attrs, item.span) + let attrs = self.tcx.hir().attrs(item.hir_id()); + if let (Some((Stability { level: attr::Unstable { .. }, .. }, span)), _) = + attr::find_stability(&self.tcx.sess, attrs, item.span) { let mut c = CheckTraitImplStable { tcx: self.tcx, fully_stable: true }; c.visit_ty(self_ty); c.visit_trait_ref(t); if c.fully_stable { - let span = item - .attrs - .iter() - .find(|a| a.has_name(sym::unstable)) - .map_or(item.span, |a| a.span); self.tcx.struct_span_lint_hir( INEFFECTIVE_UNSTABLE_TRAIT_IMPL, - item.hir_id, + item.hir_id(), span, |lint| lint .build("an `#[unstable]` annotation here has no effect") @@ -775,15 +792,14 @@ impl Visitor<'tcx> for Checker<'tcx> { // 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 ty = self.tcx.type_of(def_id); + let ty = self.tcx.type_of(item.def_id); let (adt_def, substs) = match ty.kind() { ty::Adt(adt_def, substs) => (adt_def, substs), _ => bug!(), }; // Non-`Copy` fields are unstable, except for `ManuallyDrop`. - let param_env = self.tcx.param_env(def_id); + let param_env = self.tcx.param_env(item.def_id); for field in &adt_def.non_enum_variant().fields { let field_ty = field.ty(self.tcx, substs); if !field_ty.ty_adt_def().map_or(false, |adt_def| adt_def.is_manually_drop()) diff --git a/compiler/rustc_passes/src/weak_lang_items.rs b/compiler/rustc_passes/src/weak_lang_items.rs index daff94cb6d..de369ba9bb 100644 --- a/compiler/rustc_passes/src/weak_lang_items.rs +++ b/compiler/rustc_passes/src/weak_lang_items.rs @@ -97,7 +97,8 @@ impl<'a, 'tcx, 'v> Visitor<'v> for Context<'a, 'tcx> { fn visit_foreign_item(&mut self, i: &hir::ForeignItem<'_>) { let check_name = |attr, sym| self.tcx.sess.check_name(attr, sym); - if let Some((lang_item, _)) = lang_items::extract(check_name, &i.attrs) { + let attrs = self.tcx.hir().attrs(i.hir_id()); + if let Some((lang_item, _)) = lang_items::extract(check_name, attrs) { self.register(lang_item, i.span); } intravisit::walk_foreign_item(self, i) diff --git a/compiler/rustc_plugin_impl/src/build.rs b/compiler/rustc_plugin_impl/src/build.rs index 4796d9a80b..a49afa35e4 100644 --- a/compiler/rustc_plugin_impl/src/build.rs +++ b/compiler/rustc_plugin_impl/src/build.rs @@ -1,7 +1,7 @@ //! Used by `rustc` when compiling a plugin crate. use rustc_hir as hir; -use rustc_hir::def_id::{CrateNum, DefId, LOCAL_CRATE}; +use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LOCAL_CRATE}; use rustc_hir::itemlikevisit::ItemLikeVisitor; use rustc_middle::ty::query::Providers; use rustc_middle::ty::TyCtxt; @@ -10,14 +10,15 @@ use rustc_span::Span; struct RegistrarFinder<'tcx> { tcx: TyCtxt<'tcx>, - registrars: Vec<(hir::HirId, Span)>, + registrars: Vec<(LocalDefId, Span)>, } impl<'v, 'tcx> ItemLikeVisitor<'v> for RegistrarFinder<'tcx> { fn visit_item(&mut self, item: &hir::Item<'_>) { if let hir::ItemKind::Fn(..) = item.kind { - if self.tcx.sess.contains_name(&item.attrs, sym::plugin_registrar) { - self.registrars.push((item.hir_id, item.span)); + let attrs = self.tcx.hir().attrs(item.hir_id()); + if self.tcx.sess.contains_name(attrs, sym::plugin_registrar) { + self.registrars.push((item.def_id, item.span)); } } } @@ -43,8 +44,8 @@ fn plugin_registrar_fn(tcx: TyCtxt<'_>, cnum: CrateNum) -> Option { match finder.registrars.len() { 0 => None, 1 => { - let (hir_id, _) = finder.registrars.pop().unwrap(); - Some(tcx.hir().local_def_id(hir_id).to_def_id()) + let (def_id, _) = finder.registrars.pop().unwrap(); + Some(def_id.to_def_id()) } _ => { let diagnostic = tcx.sess.diagnostic(); diff --git a/compiler/rustc_privacy/src/lib.rs b/compiler/rustc_privacy/src/lib.rs index 631dcb6059..84240f86b5 100644 --- a/compiler/rustc_privacy/src/lib.rs +++ b/compiler/rustc_privacy/src/lib.rs @@ -77,6 +77,12 @@ trait DefIdVisitor<'tcx> { fn visit_trait(&mut self, trait_ref: TraitRef<'tcx>) -> ControlFlow { self.skeleton().visit_trait(trait_ref) } + fn visit_projection_ty( + &mut self, + projection: ty::ProjectionTy<'tcx>, + ) -> ControlFlow { + self.skeleton().visit_projection_ty(projection) + } fn visit_predicates( &mut self, predicates: ty::GenericPredicates<'tcx>, @@ -101,6 +107,20 @@ where if self.def_id_visitor.shallow() { ControlFlow::CONTINUE } else { substs.visit_with(self) } } + fn visit_projection_ty( + &mut self, + projection: ty::ProjectionTy<'tcx>, + ) -> ControlFlow { + let (trait_ref, assoc_substs) = + projection.trait_ref_and_own_substs(self.def_id_visitor.tcx()); + self.visit_trait(trait_ref)?; + if self.def_id_visitor.shallow() { + ControlFlow::CONTINUE + } else { + assoc_substs.iter().try_for_each(|subst| subst.visit_with(self)) + } + } + fn visit_predicate(&mut self, predicate: ty::Predicate<'tcx>) -> ControlFlow { match predicate.kind().skip_binder() { ty::PredicateKind::Trait(ty::TraitPredicate { trait_ref }, _) => { @@ -108,7 +128,7 @@ where } ty::PredicateKind::Projection(ty::ProjectionPredicate { projection_ty, ty }) => { ty.visit_with(self)?; - self.visit_trait(projection_ty.trait_ref(self.def_id_visitor.tcx())) + self.visit_projection_ty(projection_ty) } ty::PredicateKind::TypeOutlives(ty::OutlivesPredicate(ty, _region)) => { ty.visit_with(self) @@ -197,7 +217,7 @@ where return ControlFlow::CONTINUE; } // This will also visit substs if necessary, so we don't need to recurse. - return self.visit_trait(proj.trait_ref(tcx)); + return self.visit_projection_ty(proj); } ty::Dynamic(predicates, ..) => { // All traits in the list are considered the "primary" part of the type @@ -454,11 +474,9 @@ impl EmbargoVisitor<'tcx> { let module_def_id = self.tcx.hir().local_def_id(reachable_mod); let module = self.tcx.hir().get_module(module_def_id).0; for item_id in module.item_ids { - let hir_id = item_id.id; - let item_def_id = self.tcx.hir().local_def_id(hir_id); - let def_kind = self.tcx.def_kind(item_def_id); - let vis = self.tcx.visibility(item_def_id); - self.update_macro_reachable_def(hir_id, def_kind, vis, defining_mod); + let def_kind = self.tcx.def_kind(item_id.def_id); + let vis = self.tcx.visibility(item_id.def_id); + self.update_macro_reachable_def(item_id.hir_id(), def_kind, vis, defining_mod); } if let Some(exports) = self.tcx.module_exports(module_def_id) { for export in exports { @@ -588,14 +606,17 @@ impl EmbargoVisitor<'tcx> { .map(|module_hir_id| self.tcx.hir().expect_item(module_hir_id)) { if let hir::ItemKind::Mod(m) = &item.kind { - for item_id in m.item_ids { - let item = self.tcx.hir().expect_item(item_id.id); - let def_id = self.tcx.hir().local_def_id(item_id.id); - if !self.tcx.hygienic_eq(segment.ident, item.ident, def_id.to_def_id()) { + for &item_id in m.item_ids { + let item = self.tcx.hir().item(item_id); + if !self.tcx.hygienic_eq( + segment.ident, + item.ident, + item_id.def_id.to_def_id(), + ) { continue; } if let hir::ItemKind::Use(..) = item.kind { - self.update(item.hir_id, Some(AccessLevel::Exported)); + self.update(item.hir_id(), Some(AccessLevel::Exported)); } } } @@ -616,7 +637,7 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> { fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { let inherited_item_level = match item.kind { hir::ItemKind::Impl { .. } => { - Option::::of_impl(item.hir_id, self.tcx, &self.access_levels) + Option::::of_impl(item.hir_id(), self.tcx, &self.access_levels) } // Foreign modules inherit level from parents. hir::ItemKind::ForeignMod { .. } => self.prev_level, @@ -644,7 +665,7 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> { }; // Update level of the item itself. - let item_level = self.update(item.hir_id, inherited_item_level); + let item_level = self.update(item.hir_id(), inherited_item_level); // Update levels of nested things. match item.kind { @@ -662,13 +683,13 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> { hir::ItemKind::Impl(ref impl_) => { for impl_item_ref in impl_.items { if impl_.of_trait.is_some() || impl_item_ref.vis.node.is_pub() { - self.update(impl_item_ref.id.hir_id, item_level); + self.update(impl_item_ref.id.hir_id(), item_level); } } } hir::ItemKind::Trait(.., trait_item_refs) => { for trait_item_ref in trait_item_refs { - self.update(trait_item_ref.id.hir_id, item_level); + self.update(trait_item_ref.id.hir_id(), item_level); } } hir::ItemKind::Struct(ref def, _) | hir::ItemKind::Union(ref def, _) => { @@ -684,7 +705,7 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> { hir::ItemKind::ForeignMod { items, .. } => { for foreign_item in items { if foreign_item.vis.node.is_pub() { - self.update(foreign_item.id.hir_id, item_level); + self.update(foreign_item.id.hir_id(), item_level); } } } @@ -727,7 +748,7 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> { // reachable if they are returned via `impl Trait`, even from private functions. let exist_level = cmp::max(item_level, Some(AccessLevel::ReachableFromImplTrait)); - self.reach(item.hir_id, exist_level).generics().predicates().ty(); + self.reach(item.hir_id(), exist_level).generics().predicates().ty(); } } // Visit everything. @@ -736,15 +757,15 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> { | hir::ItemKind::Fn(..) | hir::ItemKind::TyAlias(..) => { if item_level.is_some() { - self.reach(item.hir_id, item_level).generics().predicates().ty(); + self.reach(item.hir_id(), item_level).generics().predicates().ty(); } } hir::ItemKind::Trait(.., trait_item_refs) => { if item_level.is_some() { - self.reach(item.hir_id, item_level).generics().predicates(); + self.reach(item.hir_id(), item_level).generics().predicates(); for trait_item_ref in trait_item_refs { - let mut reach = self.reach(trait_item_ref.id.hir_id, item_level); + let mut reach = self.reach(trait_item_ref.id.hir_id(), item_level); reach.generics().predicates(); if trait_item_ref.kind == AssocItemKind::Type @@ -759,18 +780,18 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> { } hir::ItemKind::TraitAlias(..) => { if item_level.is_some() { - self.reach(item.hir_id, item_level).generics().predicates(); + self.reach(item.hir_id(), item_level).generics().predicates(); } } // Visit everything except for private impl items. hir::ItemKind::Impl(ref impl_) => { if item_level.is_some() { - self.reach(item.hir_id, item_level).generics().predicates().ty().trait_ref(); + self.reach(item.hir_id(), item_level).generics().predicates().ty().trait_ref(); for impl_item_ref in impl_.items { - let impl_item_level = self.get(impl_item_ref.id.hir_id); + let impl_item_level = self.get(impl_item_ref.id.hir_id()); if impl_item_level.is_some() { - self.reach(impl_item_ref.id.hir_id, impl_item_level) + self.reach(impl_item_ref.id.hir_id(), impl_item_level) .generics() .predicates() .ty(); @@ -782,7 +803,7 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> { // Visit everything, but enum variants have their own levels. hir::ItemKind::Enum(ref def, _) => { if item_level.is_some() { - self.reach(item.hir_id, item_level).generics().predicates(); + self.reach(item.hir_id(), item_level).generics().predicates(); } for variant in def.variants { let variant_level = self.get(variant.id); @@ -792,16 +813,16 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> { } // Corner case: if the variant is reachable, but its // enum is not, make the enum reachable as well. - self.update(item.hir_id, variant_level); + self.update(item.hir_id(), variant_level); } } } // Visit everything, but foreign items have their own levels. hir::ItemKind::ForeignMod { items, .. } => { for foreign_item in items { - let foreign_item_level = self.get(foreign_item.id.hir_id); + let foreign_item_level = self.get(foreign_item.id.hir_id()); if foreign_item_level.is_some() { - self.reach(foreign_item.id.hir_id, foreign_item_level) + self.reach(foreign_item.id.hir_id(), foreign_item_level) .generics() .predicates() .ty(); @@ -811,7 +832,7 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> { // Visit everything except for private fields. hir::ItemKind::Struct(ref struct_def, _) | hir::ItemKind::Union(ref struct_def, _) => { if item_level.is_some() { - self.reach(item.hir_id, item_level).generics().predicates(); + self.reach(item.hir_id(), item_level).generics().predicates(); for field in struct_def.fields() { let field_level = self.get(field.hir_id); if field_level.is_some() { @@ -860,20 +881,19 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> { fn visit_macro_def(&mut self, md: &'tcx hir::MacroDef<'tcx>) { // Non-opaque macros cannot make other items more accessible than they already are. - if attr::find_transparency(&self.tcx.sess, &md.attrs, md.ast.macro_rules).0 + let attrs = self.tcx.hir().attrs(md.hir_id()); + if attr::find_transparency(&self.tcx.sess, &attrs, md.ast.macro_rules).0 != Transparency::Opaque { // `#[macro_export]`-ed `macro_rules!` are `Public` since they // ignore their containing path to always appear at the crate root. if md.ast.macro_rules { - self.update(md.hir_id, Some(AccessLevel::Public)); + self.update(md.hir_id(), Some(AccessLevel::Public)); } return; } - let macro_module_def_id = - ty::DefIdTree::parent(self.tcx, self.tcx.hir().local_def_id(md.hir_id).to_def_id()) - .unwrap(); + let macro_module_def_id = ty::DefIdTree::parent(self.tcx, md.def_id.to_def_id()).unwrap(); let hir_id = macro_module_def_id .as_local() .map(|def_id| self.tcx.hir().local_def_id_to_hir_id(def_id)); @@ -883,7 +903,7 @@ impl Visitor<'tcx> for EmbargoVisitor<'tcx> { _ => return, }; let level = if md.vis.node.is_pub() { self.get(module_id) } else { None }; - let new_level = self.update(md.hir_id, level); + let new_level = self.update(md.hir_id(), level); if new_level.is_none() { return; } @@ -1037,7 +1057,7 @@ impl<'tcx> Visitor<'tcx> for NamePrivacyVisitor<'tcx> { } fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { - let orig_current_item = self.current_item.replace(item.hir_id); + let orig_current_item = self.current_item.replace(item.hir_id()); intravisit::walk_item(self, item); self.current_item = orig_current_item; } @@ -1204,10 +1224,9 @@ impl<'tcx> Visitor<'tcx> for TypePrivacyVisitor<'tcx> { } for (poly_predicate, _) in bounds.projection_bounds { - let tcx = self.tcx; if self.visit(poly_predicate.skip_binder().ty).is_break() || self - .visit_trait(poly_predicate.skip_binder().projection_ty.trait_ref(tcx)) + .visit_projection_ty(poly_predicate.skip_binder().projection_ty) .is_break() { return; @@ -1322,8 +1341,7 @@ impl<'tcx> Visitor<'tcx> for TypePrivacyVisitor<'tcx> { // Check types in item interfaces. fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { - let orig_current_item = - mem::replace(&mut self.current_item, self.tcx.hir().local_def_id(item.hir_id)); + let orig_current_item = mem::replace(&mut self.current_item, item.def_id); let old_maybe_typeck_results = self.maybe_typeck_results.take(); intravisit::walk_item(self, item); self.maybe_typeck_results = old_maybe_typeck_results; @@ -1463,7 +1481,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> { hir::ItemKind::ForeignMod { .. } => {} hir::ItemKind::Trait(.., ref bounds, _) => { - if !self.trait_is_public(item.hir_id) { + if !self.trait_is_public(item.hir_id()) { return; } @@ -1526,7 +1544,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> { let impl_item = self.tcx.hir().impl_item(impl_item_ref.id); match impl_item.kind { hir::ImplItemKind::Const(..) | hir::ImplItemKind::Fn(..) => { - self.access_levels.is_reachable(impl_item_ref.id.hir_id) + self.access_levels.is_reachable(impl_item_ref.id.hir_id()) } hir::ImplItemKind::TyAlias(_) => false, } @@ -1546,8 +1564,10 @@ impl<'a, 'tcx> Visitor<'tcx> for ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> { let impl_item = self.tcx.hir().impl_item(impl_item_ref.id); match impl_item.kind { hir::ImplItemKind::Const(..) | hir::ImplItemKind::Fn(..) - if self - .item_is_public(&impl_item.hir_id, &impl_item.vis) => + if self.item_is_public( + &impl_item.hir_id(), + &impl_item.vis, + ) => { intravisit::walk_impl_item(self, impl_item) } @@ -1588,7 +1608,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> { // methods will be visible as `Public::foo`. let mut found_pub_static = false; for impl_item_ref in impl_.items { - if self.item_is_public(&impl_item_ref.id.hir_id, &impl_item_ref.vis) { + if self.item_is_public(&impl_item_ref.id.hir_id(), &impl_item_ref.vis) { let impl_item = self.tcx.hir().impl_item(impl_item_ref.id); match impl_item_ref.kind { AssocItemKind::Const => { @@ -1615,7 +1635,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> { hir::ItemKind::TyAlias(..) => return, // Not at all public, so we don't care. - _ if !self.item_is_public(&item.hir_id, &item.vis) => { + _ if !self.item_is_public(&item.hir_id(), &item.vis) => { return; } @@ -1651,7 +1671,7 @@ impl<'a, 'tcx> Visitor<'tcx> for ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> { } fn visit_foreign_item(&mut self, item: &'tcx hir::ForeignItem<'tcx>) { - if self.access_levels.is_reachable(item.hir_id) { + if self.access_levels.is_reachable(item.hir_id()) { intravisit::walk_foreign_item(self, item) } } @@ -1678,9 +1698,9 @@ impl<'a, 'tcx> Visitor<'tcx> for ObsoleteVisiblePrivateTypesVisitor<'a, 'tcx> { } } - fn visit_struct_field(&mut self, s: &'tcx hir::StructField<'tcx>) { + fn visit_field_def(&mut self, s: &'tcx hir::FieldDef<'tcx>) { if s.vis.node.is_pub() || self.in_variant { - intravisit::walk_struct_field(self, s); + intravisit::walk_field_def(self, s); } } @@ -1849,41 +1869,18 @@ impl DefIdVisitor<'tcx> for SearchInterfaceForPrivateItemsVisitor<'tcx> { } } -struct PrivateItemsInPublicInterfacesVisitor<'a, 'tcx> { +struct PrivateItemsInPublicInterfacesVisitor<'tcx> { tcx: TyCtxt<'tcx>, has_pub_restricted: bool, - old_error_set: &'a HirIdSet, + old_error_set_ancestry: HirIdSet, } -impl<'a, 'tcx> PrivateItemsInPublicInterfacesVisitor<'a, 'tcx> { +impl<'tcx> PrivateItemsInPublicInterfacesVisitor<'tcx> { fn check( &self, item_id: hir::HirId, required_visibility: ty::Visibility, ) -> SearchInterfaceForPrivateItemsVisitor<'tcx> { - let mut has_old_errors = false; - - // Slow path taken only if there any errors in the crate. - for &id in self.old_error_set { - // Walk up the nodes until we find `item_id` (or we hit a root). - let mut id = id; - loop { - if id == item_id { - has_old_errors = true; - break; - } - let parent = self.tcx.hir().get_parent_node(id); - if parent == id { - break; - } - id = parent; - } - - if has_old_errors { - break; - } - } - SearchInterfaceForPrivateItemsVisitor { tcx: self.tcx, item_id, @@ -1891,7 +1888,7 @@ impl<'a, 'tcx> PrivateItemsInPublicInterfacesVisitor<'a, 'tcx> { span: self.tcx.hir().span(item_id), required_visibility, has_pub_restricted: self.has_pub_restricted, - has_old_errors, + has_old_errors: self.old_error_set_ancestry.contains(&item_id), in_assoc_ty: false, } } @@ -1917,7 +1914,7 @@ impl<'a, 'tcx> PrivateItemsInPublicInterfacesVisitor<'a, 'tcx> { } } -impl<'a, 'tcx> Visitor<'tcx> for PrivateItemsInPublicInterfacesVisitor<'a, 'tcx> { +impl<'tcx> Visitor<'tcx> for PrivateItemsInPublicInterfacesVisitor<'tcx> { type Map = Map<'tcx>; fn nested_visit_map(&mut self) -> NestedVisitorMap { @@ -1926,7 +1923,7 @@ impl<'a, 'tcx> Visitor<'tcx> for PrivateItemsInPublicInterfacesVisitor<'a, 'tcx> fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { let tcx = self.tcx; - let item_visibility = tcx.visibility(tcx.hir().local_def_id(item.hir_id).to_def_id()); + let item_visibility = tcx.visibility(item.def_id); match item.kind { // Crates are always public. @@ -1942,34 +1939,34 @@ impl<'a, 'tcx> Visitor<'tcx> for PrivateItemsInPublicInterfacesVisitor<'a, 'tcx> | hir::ItemKind::Static(..) | hir::ItemKind::Fn(..) | hir::ItemKind::TyAlias(..) => { - self.check(item.hir_id, item_visibility).generics().predicates().ty(); + self.check(item.hir_id(), item_visibility).generics().predicates().ty(); } hir::ItemKind::OpaqueTy(..) => { // `ty()` for opaque types is the underlying type, // it's not a part of interface, so we skip it. - self.check(item.hir_id, item_visibility).generics().bounds(); + self.check(item.hir_id(), item_visibility).generics().bounds(); } hir::ItemKind::Trait(.., trait_item_refs) => { - self.check(item.hir_id, item_visibility).generics().predicates(); + self.check(item.hir_id(), item_visibility).generics().predicates(); for trait_item_ref in trait_item_refs { self.check_assoc_item( - trait_item_ref.id.hir_id, + trait_item_ref.id.hir_id(), trait_item_ref.kind, trait_item_ref.defaultness, item_visibility, ); if let AssocItemKind::Type = trait_item_ref.kind { - self.check(trait_item_ref.id.hir_id, item_visibility).bounds(); + self.check(trait_item_ref.id.hir_id(), item_visibility).bounds(); } } } hir::ItemKind::TraitAlias(..) => { - self.check(item.hir_id, item_visibility).generics().predicates(); + self.check(item.hir_id(), item_visibility).generics().predicates(); } hir::ItemKind::Enum(ref def, _) => { - self.check(item.hir_id, item_visibility).generics().predicates(); + self.check(item.hir_id(), item_visibility).generics().predicates(); for variant in def.variants { for field in variant.data.fields() { @@ -1980,13 +1977,13 @@ impl<'a, 'tcx> Visitor<'tcx> for PrivateItemsInPublicInterfacesVisitor<'a, 'tcx> // Subitems of foreign modules have their own publicity. hir::ItemKind::ForeignMod { items, .. } => { for foreign_item in items { - let vis = tcx.visibility(tcx.hir().local_def_id(foreign_item.id.hir_id)); - self.check(foreign_item.id.hir_id, vis).generics().predicates().ty(); + let vis = tcx.visibility(foreign_item.id.def_id); + self.check(foreign_item.id.hir_id(), vis).generics().predicates().ty(); } } // Subitems of structs and unions have their own publicity. hir::ItemKind::Struct(ref struct_def, _) | hir::ItemKind::Union(ref struct_def, _) => { - self.check(item.hir_id, item_visibility).generics().predicates(); + self.check(item.hir_id(), item_visibility).generics().predicates(); for field in struct_def.fields() { let field_visibility = tcx.visibility(tcx.hir().local_def_id(field.hir_id)); @@ -1998,20 +1995,16 @@ impl<'a, 'tcx> Visitor<'tcx> for PrivateItemsInPublicInterfacesVisitor<'a, 'tcx> // A trait impl is public when both its type and its trait are public // Subitems of trait impls have inherited publicity. hir::ItemKind::Impl(ref impl_) => { - let impl_vis = ty::Visibility::of_impl(item.hir_id, tcx, &Default::default()); - self.check(item.hir_id, impl_vis).generics().predicates(); + let impl_vis = ty::Visibility::of_impl(item.hir_id(), tcx, &Default::default()); + self.check(item.hir_id(), impl_vis).generics().predicates(); for impl_item_ref in impl_.items { let impl_item_vis = if impl_.of_trait.is_none() { - min( - tcx.visibility(tcx.hir().local_def_id(impl_item_ref.id.hir_id)), - impl_vis, - tcx, - ) + min(tcx.visibility(impl_item_ref.id.def_id), impl_vis, tcx) } else { impl_vis }; self.check_assoc_item( - impl_item_ref.id.hir_id, + impl_item_ref.id.hir_id(), impl_item_ref.kind, impl_item_ref.defaultness, impl_item_vis, @@ -2141,11 +2134,22 @@ fn check_private_in_public(tcx: TyCtxt<'_>, krate: CrateNum) { pub_restricted_visitor.has_pub_restricted }; + let mut old_error_set_ancestry = HirIdSet::default(); + for mut id in visitor.old_error_set.iter().copied() { + loop { + if !old_error_set_ancestry.insert(id) { + break; + } + let parent = tcx.hir().get_parent_node(id); + if parent == id { + break; + } + id = parent; + } + } + // Check for private types and traits in public interfaces. - let mut visitor = PrivateItemsInPublicInterfacesVisitor { - tcx, - has_pub_restricted, - old_error_set: &visitor.old_error_set, - }; + let mut visitor = + PrivateItemsInPublicInterfacesVisitor { tcx, has_pub_restricted, old_error_set_ancestry }; krate.visit_all_item_likes(&mut DeepVisitor::new(&mut visitor)); } diff --git a/compiler/rustc_query_impl/Cargo.toml b/compiler/rustc_query_impl/Cargo.toml new file mode 100644 index 0000000000..383e30ca29 --- /dev/null +++ b/compiler/rustc_query_impl/Cargo.toml @@ -0,0 +1,27 @@ +[package] +authors = ["The Rust Project Developers"] +name = "rustc_query_impl" +version = "0.0.0" +edition = "2018" + +[lib] +doctest = false + +[dependencies] +measureme = "9.0.0" +rustc-rayon-core = "0.3.1" +tracing = "0.1" +rustc_ast = { path = "../rustc_ast" } +rustc_attr = { path = "../rustc_attr" } +rustc_data_structures = { path = "../rustc_data_structures" } +rustc_errors = { path = "../rustc_errors" } +rustc_feature = { path = "../rustc_feature" } +rustc_hir = { path = "../rustc_hir" } +rustc_index = { path = "../rustc_index" } +rustc_macros = { path = "../rustc_macros" } +rustc_middle = { path = "../rustc_middle" } +rustc_query_system = { path = "../rustc_query_system" } +rustc_span = { path = "../rustc_span" } +rustc_serialize = { path = "../rustc_serialize" } +rustc_session = { path = "../rustc_session" } +rustc_target = { path = "../rustc_target" } diff --git a/compiler/rustc_middle/src/ty/query/README.md b/compiler/rustc_query_impl/src/README.md similarity index 100% rename from compiler/rustc_middle/src/ty/query/README.md rename to compiler/rustc_query_impl/src/README.md diff --git a/compiler/rustc_middle/src/ty/query/keys.rs b/compiler/rustc_query_impl/src/keys.rs similarity index 79% rename from compiler/rustc_middle/src/ty/query/keys.rs rename to compiler/rustc_query_impl/src/keys.rs index bfa1581aaa..e467f41986 100644 --- a/compiler/rustc_middle/src/ty/query/keys.rs +++ b/compiler/rustc_query_impl/src/keys.rs @@ -1,20 +1,17 @@ //! Defines the set of legal keys that can be used in queries. -use crate::infer::canonical::Canonical; -use crate::mir; -use crate::ty::fast_reject::SimplifiedType; -use crate::ty::subst::{GenericArg, SubstsRef}; -use crate::ty::{self, Ty, TyCtxt}; use rustc_hir::def_id::{CrateNum, DefId, LocalDefId, LOCAL_CRATE}; -use rustc_query_system::query::DefaultCacheSelector; -use rustc_span::symbol::Symbol; +use rustc_middle::infer::canonical::Canonical; +use rustc_middle::mir; +use rustc_middle::ty::fast_reject::SimplifiedType; +use rustc_middle::ty::subst::{GenericArg, SubstsRef}; +use rustc_middle::ty::{self, Ty, TyCtxt}; +use rustc_span::symbol::{Ident, Symbol}; use rustc_span::{Span, DUMMY_SP}; /// The `Key` trait controls what types can legally be used as the key /// for a query. pub trait Key { - type CacheSelector; - /// Given an instance of this key, what crate is it referring to? /// This is used to find the provider. fn query_crate(&self) -> CrateNum; @@ -25,8 +22,6 @@ pub trait Key { } impl<'tcx> Key for ty::InstanceDef<'tcx> { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { LOCAL_CRATE } @@ -37,8 +32,6 @@ impl<'tcx> Key for ty::InstanceDef<'tcx> { } impl<'tcx> Key for ty::Instance<'tcx> { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { LOCAL_CRATE } @@ -49,8 +42,6 @@ impl<'tcx> Key for ty::Instance<'tcx> { } impl<'tcx> Key for mir::interpret::GlobalId<'tcx> { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { self.instance.query_crate() } @@ -61,8 +52,6 @@ impl<'tcx> Key for mir::interpret::GlobalId<'tcx> { } impl<'tcx> Key for mir::interpret::LitToConstInput<'tcx> { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { LOCAL_CRATE } @@ -73,8 +62,6 @@ impl<'tcx> Key for mir::interpret::LitToConstInput<'tcx> { } impl Key for CrateNum { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { *self } @@ -84,8 +71,6 @@ impl Key for CrateNum { } impl Key for LocalDefId { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { self.to_def_id().query_crate() } @@ -95,8 +80,6 @@ impl Key for LocalDefId { } impl Key for DefId { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { self.krate } @@ -106,8 +89,6 @@ impl Key for DefId { } impl Key for ty::WithOptConstParam { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { self.did.query_crate() } @@ -117,8 +98,6 @@ impl Key for ty::WithOptConstParam { } impl Key for (DefId, DefId) { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { self.0.krate } @@ -128,8 +107,6 @@ impl Key for (DefId, DefId) { } impl Key for (ty::Instance<'tcx>, LocalDefId) { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { self.0.query_crate() } @@ -139,8 +116,6 @@ impl Key for (ty::Instance<'tcx>, LocalDefId) { } impl Key for (DefId, LocalDefId) { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { self.0.krate } @@ -150,8 +125,6 @@ impl Key for (DefId, LocalDefId) { } impl Key for (LocalDefId, DefId) { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { LOCAL_CRATE } @@ -160,9 +133,25 @@ impl Key for (LocalDefId, DefId) { } } -impl Key for (CrateNum, DefId) { - type CacheSelector = DefaultCacheSelector; +impl Key for (DefId, Option) { + fn query_crate(&self) -> CrateNum { + self.0.krate + } + fn default_span(&self, tcx: TyCtxt<'_>) -> Span { + tcx.def_span(self.0) + } +} +impl Key for (DefId, LocalDefId, Ident) { + fn query_crate(&self) -> CrateNum { + self.0.krate + } + fn default_span(&self, tcx: TyCtxt<'_>) -> Span { + self.1.default_span(tcx) + } +} + +impl Key for (CrateNum, DefId) { fn query_crate(&self) -> CrateNum { self.0 } @@ -172,8 +161,6 @@ impl Key for (CrateNum, DefId) { } impl Key for (DefId, SimplifiedType) { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { self.0.krate } @@ -183,8 +170,6 @@ impl Key for (DefId, SimplifiedType) { } impl<'tcx> Key for SubstsRef<'tcx> { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { LOCAL_CRATE } @@ -194,8 +179,6 @@ impl<'tcx> Key for SubstsRef<'tcx> { } impl<'tcx> Key for (DefId, SubstsRef<'tcx>) { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { self.0.krate } @@ -210,8 +193,6 @@ impl<'tcx> Key (ty::WithOptConstParam, SubstsRef<'tcx>), ) { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { (self.0).0.did.krate } @@ -221,8 +202,6 @@ impl<'tcx> Key } impl<'tcx> Key for (LocalDefId, DefId, SubstsRef<'tcx>) { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { LOCAL_CRATE } @@ -232,8 +211,6 @@ impl<'tcx> Key for (LocalDefId, DefId, SubstsRef<'tcx>) { } impl<'tcx> Key for (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>) { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { self.1.def_id().krate } @@ -243,8 +220,15 @@ impl<'tcx> Key for (ty::ParamEnv<'tcx>, ty::PolyTraitRef<'tcx>) { } impl<'tcx> Key for (&'tcx ty::Const<'tcx>, mir::Field) { - type CacheSelector = DefaultCacheSelector; + fn query_crate(&self) -> CrateNum { + LOCAL_CRATE + } + fn default_span(&self, _: TyCtxt<'_>) -> Span { + DUMMY_SP + } +} +impl<'tcx> Key for mir::interpret::ConstAlloc<'tcx> { fn query_crate(&self) -> CrateNum { LOCAL_CRATE } @@ -254,8 +238,6 @@ impl<'tcx> Key for (&'tcx ty::Const<'tcx>, mir::Field) { } impl<'tcx> Key for ty::PolyTraitRef<'tcx> { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { self.def_id().krate } @@ -265,8 +247,6 @@ impl<'tcx> Key for ty::PolyTraitRef<'tcx> { } impl<'tcx> Key for GenericArg<'tcx> { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { LOCAL_CRATE } @@ -276,8 +256,6 @@ impl<'tcx> Key for GenericArg<'tcx> { } impl<'tcx> Key for &'tcx ty::Const<'tcx> { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { LOCAL_CRATE } @@ -287,8 +265,6 @@ impl<'tcx> Key for &'tcx ty::Const<'tcx> { } impl<'tcx> Key for Ty<'tcx> { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { LOCAL_CRATE } @@ -298,8 +274,6 @@ impl<'tcx> Key for Ty<'tcx> { } impl<'tcx> Key for &'tcx ty::List> { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { LOCAL_CRATE } @@ -309,8 +283,6 @@ impl<'tcx> Key for &'tcx ty::List> { } impl<'tcx> Key for ty::ParamEnv<'tcx> { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { LOCAL_CRATE } @@ -320,8 +292,6 @@ impl<'tcx> Key for ty::ParamEnv<'tcx> { } impl<'tcx, T: Key> Key for ty::ParamEnvAnd<'tcx, T> { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { self.value.query_crate() } @@ -331,8 +301,6 @@ impl<'tcx, T: Key> Key for ty::ParamEnvAnd<'tcx, T> { } impl Key for Symbol { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { LOCAL_CRATE } @@ -344,8 +312,6 @@ impl Key for Symbol { /// Canonical query goals correspond to abstract trait operations that /// are not tied to any crate in particular. impl<'tcx, T> Key for Canonical<'tcx, T> { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { LOCAL_CRATE } @@ -356,8 +322,6 @@ impl<'tcx, T> Key for Canonical<'tcx, T> { } impl Key for (Symbol, u32, u32) { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { LOCAL_CRATE } @@ -368,8 +332,6 @@ impl Key for (Symbol, u32, u32) { } impl<'tcx> Key for (DefId, Ty<'tcx>, SubstsRef<'tcx>, ty::ParamEnv<'tcx>) { - type CacheSelector = DefaultCacheSelector; - fn query_crate(&self) -> CrateNum { LOCAL_CRATE } diff --git a/compiler/rustc_query_impl/src/lib.rs b/compiler/rustc_query_impl/src/lib.rs new file mode 100644 index 0000000000..e9314797fb --- /dev/null +++ b/compiler/rustc_query_impl/src/lib.rs @@ -0,0 +1,63 @@ +//! Support for serializing the dep-graph and reloading it. + +#![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")] +#![feature(in_band_lifetimes)] +#![feature(exhaustive_patterns)] +#![feature(nll)] +#![feature(min_specialization)] +#![feature(crate_visibility_modifier)] +#![feature(once_cell)] +#![feature(rustc_attrs)] +#![feature(never_type)] +#![recursion_limit = "256"] + +#[macro_use] +extern crate rustc_middle; +#[macro_use] +extern crate tracing; + +use rustc_data_structures::fingerprint::Fingerprint; +use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; +use rustc_errors::{DiagnosticBuilder, Handler}; +use rustc_hir::def_id::CrateNum; +use rustc_index::vec::IndexVec; +use rustc_middle::dep_graph; +use rustc_middle::ich::StableHashingContext; +use rustc_middle::ty::query::{query_keys, query_storage, query_stored, query_values}; +use rustc_middle::ty::query::{Providers, QueryEngine}; +use rustc_middle::ty::{self, TyCtxt}; +use rustc_serialize::opaque; +use rustc_span::{Span, DUMMY_SP}; + +#[macro_use] +mod plumbing; +pub use plumbing::QueryCtxt; +use plumbing::QueryStruct; +use rustc_query_system::query::*; + +mod stats; +pub use self::stats::print_stats; + +mod keys; +use keys::Key; + +mod values; +use self::values::Value; + +use rustc_query_system::query::QueryAccessors; +pub use rustc_query_system::query::QueryConfig; +pub(crate) use rustc_query_system::query::QueryDescription; + +use rustc_middle::ty::query::on_disk_cache; + +mod profiling_support; +pub use self::profiling_support::alloc_self_profile_query_strings; + +rustc_query_append! { [define_queries!][<'tcx>] } + +impl<'tcx> Queries<'tcx> { + // Force codegen in the dyn-trait transformation in this crate. + pub fn as_dyn(&'tcx self) -> &'tcx dyn QueryEngine<'tcx> { + self + } +} diff --git a/compiler/rustc_query_impl/src/plumbing.rs b/compiler/rustc_query_impl/src/plumbing.rs new file mode 100644 index 0000000000..37a176de94 --- /dev/null +++ b/compiler/rustc_query_impl/src/plumbing.rs @@ -0,0 +1,616 @@ +//! The implementation of the query system itself. This defines the macros that +//! generate the actual methods on tcx which find and execute the provider, +//! manage the caches, and so forth. + +use super::queries; +use rustc_middle::dep_graph::{DepKind, DepNode, DepNodeExt, DepNodeIndex, SerializedDepNodeIndex}; +use rustc_middle::ty::query::on_disk_cache; +use rustc_middle::ty::tls::{self, ImplicitCtxt}; +use rustc_middle::ty::{self, TyCtxt}; +use rustc_query_system::dep_graph::HasDepContext; +use rustc_query_system::query::{QueryContext, QueryDescription, QueryJobId, QueryMap}; + +use rustc_data_structures::sync::Lock; +use rustc_data_structures::thin_vec::ThinVec; +use rustc_errors::Diagnostic; +use rustc_serialize::opaque; +use rustc_span::def_id::{DefId, LocalDefId}; + +#[derive(Copy, Clone)] +pub struct QueryCtxt<'tcx> { + pub tcx: TyCtxt<'tcx>, + pub queries: &'tcx super::Queries<'tcx>, +} + +impl<'tcx> std::ops::Deref for QueryCtxt<'tcx> { + type Target = TyCtxt<'tcx>; + + fn deref(&self) -> &Self::Target { + &self.tcx + } +} + +impl HasDepContext for QueryCtxt<'tcx> { + type DepKind = rustc_middle::dep_graph::DepKind; + type StableHashingContext = rustc_middle::ich::StableHashingContext<'tcx>; + type DepContext = TyCtxt<'tcx>; + + #[inline] + fn dep_context(&self) -> &Self::DepContext { + &self.tcx + } +} + +impl QueryContext for QueryCtxt<'tcx> { + fn def_path_str(&self, def_id: DefId) -> String { + self.tcx.def_path_str(def_id) + } + + fn current_query_job(&self) -> Option> { + tls::with_related_context(**self, |icx| icx.query) + } + + fn try_collect_active_jobs(&self) -> Option> { + self.queries.try_collect_active_jobs(**self) + } + + fn try_load_from_on_disk_cache(&self, dep_node: &DepNode) { + let cb = &super::QUERY_CALLBACKS[dep_node.kind as usize]; + (cb.try_load_from_on_disk_cache)(*self, dep_node) + } + + fn try_force_from_dep_node(&self, dep_node: &DepNode) -> bool { + // FIXME: This match is just a workaround for incremental bugs and should + // be removed. https://github.com/rust-lang/rust/issues/62649 is one such + // bug that must be fixed before removing this. + match dep_node.kind { + DepKind::hir_owner | DepKind::hir_owner_nodes => { + if let Some(def_id) = dep_node.extract_def_id(**self) { + let def_id = def_id.expect_local(); + let hir_id = self.tcx.hir().local_def_id_to_hir_id(def_id); + if def_id != hir_id.owner { + // This `DefPath` does not have a + // corresponding `DepNode` (e.g. a + // struct field), and the ` DefPath` + // collided with the `DefPath` of a + // proper item that existed in the + // previous compilation session. + // + // Since the given `DefPath` does not + // denote the item that previously + // existed, we just fail to mark green. + return false; + } + } else { + // If the node does not exist anymore, we + // just fail to mark green. + return false; + } + } + _ => { + // For other kinds of nodes it's OK to be + // forced. + } + } + + debug!("try_force_from_dep_node({:?}) --- trying to force", dep_node); + + // We must avoid ever having to call `force_from_dep_node()` for a + // `DepNode::codegen_unit`: + // Since we cannot reconstruct the query key of a `DepNode::codegen_unit`, we + // would always end up having to evaluate the first caller of the + // `codegen_unit` query that *is* reconstructible. This might very well be + // the `compile_codegen_unit` query, thus re-codegenning the whole CGU just + // to re-trigger calling the `codegen_unit` query with the right key. At + // that point we would already have re-done all the work we are trying to + // avoid doing in the first place. + // The solution is simple: Just explicitly call the `codegen_unit` query for + // 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" + ); + + let cb = &super::QUERY_CALLBACKS[dep_node.kind as usize]; + (cb.force_from_dep_node)(*self, dep_node) + } + + // Interactions with on_disk_cache + fn load_diagnostics(&self, prev_dep_node_index: SerializedDepNodeIndex) -> Vec { + self.on_disk_cache + .as_ref() + .map(|c| c.load_diagnostics(**self, prev_dep_node_index)) + .unwrap_or_default() + } + + fn store_diagnostics(&self, dep_node_index: DepNodeIndex, diagnostics: ThinVec) { + if let Some(c) = self.on_disk_cache.as_ref() { + c.store_diagnostics(dep_node_index, diagnostics) + } + } + + fn store_diagnostics_for_anon_node( + &self, + dep_node_index: DepNodeIndex, + diagnostics: ThinVec, + ) { + if let Some(c) = self.on_disk_cache.as_ref() { + c.store_diagnostics_for_anon_node(dep_node_index, diagnostics) + } + } + + /// Executes a job by changing the `ImplicitCtxt` to point to the + /// new query job while it executes. It returns the diagnostics + /// captured during execution and the actual result. + #[inline(always)] + fn start_query( + &self, + token: QueryJobId, + diagnostics: Option<&Lock>>, + compute: impl FnOnce() -> R, + ) -> R { + // The `TyCtxt` stored in TLS has the same global interner lifetime + // as `self`, so we use `with_related_context` to relate the 'tcx lifetimes + // when accessing the `ImplicitCtxt`. + tls::with_related_context(**self, move |current_icx| { + // Update the `ImplicitCtxt` to point to our new query job. + let new_icx = ImplicitCtxt { + tcx: **self, + query: Some(token), + diagnostics, + layout_depth: current_icx.layout_depth, + task_deps: current_icx.task_deps, + }; + + // Use the `ImplicitCtxt` while we execute the query. + tls::enter_context(&new_icx, |_| { + rustc_data_structures::stack::ensure_sufficient_stack(compute) + }) + }) + } +} + +impl<'tcx> QueryCtxt<'tcx> { + pub(super) fn encode_query_results( + self, + encoder: &mut on_disk_cache::CacheEncoder<'a, 'tcx, opaque::FileEncoder>, + query_result_index: &mut on_disk_cache::EncodedQueryResultIndex, + ) -> opaque::FileEncodeResult { + macro_rules! encode_queries { + ($($query:ident,)*) => { + $( + on_disk_cache::encode_query_results::<_, super::queries::$query<'_>>( + self, + encoder, + query_result_index + )?; + )* + } + } + + rustc_cached_queries!(encode_queries!); + + Ok(()) + } +} + +/// This struct stores metadata about each Query. +/// +/// Information is retrieved by indexing the `QUERIES` array using the integer value +/// of the `DepKind`. Overall, this allows to implement `QueryContext` using this manual +/// jump table instead of large matches. +pub struct QueryStruct { + /// 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` + /// where we don't know if it is red or green and we therefore actually have + /// to recompute its value in order to find out. Since the only piece of + /// information that we have at that point is the `DepNode` we are trying to + /// re-evaluate, we need some way to re-run a query from just that. This is what + /// `force_from_dep_node()` implements. + /// + /// In the general case, a `DepNode` consists of a `DepKind` and an opaque + /// GUID/fingerprint that will uniquely identify the node. This GUID/fingerprint + /// is usually constructed by computing a stable hash of the query-key that the + /// `DepNode` corresponds to. Consequently, it is not in general possible to go + /// back from hash to query-key (since hash functions are not reversible). For + /// this reason `force_from_dep_node()` is expected to fail from time to time + /// because we just cannot find out, from the `DepNode` alone, what the + /// corresponding query-key is and therefore cannot re-run the query. + /// + /// The system deals with this case letting `try_mark_green` fail which forces + /// the root query to be re-evaluated. + /// + /// Now, if `force_from_dep_node()` would always fail, it would be pretty useless. + /// Fortunately, we can use some contextual information that will allow us to + /// reconstruct query-keys for certain kinds of `DepNode`s. In particular, we + /// enforce by construction that the GUID/fingerprint of certain `DepNode`s is a + /// valid `DefPathHash`. Since we also always build a huge table that maps every + /// `DefPathHash` in the current codebase to the corresponding `DefId`, we have + /// everything we need to re-run the query. + /// + /// Take the `mir_promoted` query as an example. Like many other queries, it + /// just has a single parameter: the `DefId` of the item it will compute the + /// validated MIR for. Now, when we call `force_from_dep_node()` on a `DepNode` + /// with kind `MirValidated`, we know that the GUID/fingerprint of the `DepNode` + /// is actually a `DefPathHash`, and can therefore just look up the corresponding + /// `DefId` in `tcx.def_path_hash_to_def_id`. + /// + /// When you implement a new query, it will likely have a corresponding new + /// `DepKind`, and you'll have to support it here in `force_from_dep_node()`. As + /// a rule of thumb, if your query takes a `DefId` or `LocalDefId` as sole parameter, + /// then `force_from_dep_node()` should not fail for it. Otherwise, you can just + /// add it to the "We don't have enough information to reconstruct..." group in + /// the match below. + pub(crate) force_from_dep_node: fn(tcx: QueryCtxt<'_>, dep_node: &DepNode) -> bool, + + /// Invoke a query to put the on-disk cached value in memory. + pub(crate) try_load_from_on_disk_cache: fn(QueryCtxt<'_>, &DepNode), +} + +macro_rules! handle_cycle_error { + ([][$tcx: expr, $error:expr]) => {{ + $error.emit(); + Value::from_cycle_error($tcx) + }}; + ([fatal_cycle $($rest:tt)*][$tcx:expr, $error:expr]) => {{ + $error.emit(); + $tcx.sess.abort_if_errors(); + unreachable!() + }}; + ([cycle_delay_bug $($rest:tt)*][$tcx:expr, $error:expr]) => {{ + $error.delay_as_bug(); + Value::from_cycle_error($tcx) + }}; + ([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*][$($args:tt)*]) => { + handle_cycle_error!([$($($modifiers)*)*][$($args)*]) + }; +} + +macro_rules! is_anon { + ([]) => {{ + false + }}; + ([anon $($rest:tt)*]) => {{ + true + }}; + ([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*]) => { + is_anon!([$($($modifiers)*)*]) + }; +} + +macro_rules! is_eval_always { + ([]) => {{ + false + }}; + ([eval_always $($rest:tt)*]) => {{ + true + }}; + ([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*]) => { + is_eval_always!([$($($modifiers)*)*]) + }; +} + +macro_rules! hash_result { + ([][$hcx:expr, $result:expr]) => {{ + dep_graph::hash_result($hcx, &$result) + }}; + ([no_hash $($rest:tt)*][$hcx:expr, $result:expr]) => {{ + None + }}; + ([$other:ident $(($($other_args:tt)*))* $(, $($modifiers:tt)*)*][$($args:tt)*]) => { + hash_result!([$($($modifiers)*)*][$($args)*]) + }; +} + +macro_rules! define_queries { + (<$tcx:tt> + $($(#[$attr:meta])* + [$($modifiers:tt)*] fn $name:ident($($K:tt)*) -> $V:ty,)*) => { + + define_queries_struct! { + tcx: $tcx, + input: ($(([$($modifiers)*] [$($attr)*] [$name]))*) + } + + mod make_query { + use super::*; + + // Create an eponymous constructor for each query. + $(#[allow(nonstandard_style)] $(#[$attr])* + pub fn $name<$tcx>(tcx: QueryCtxt<$tcx>, key: query_keys::$name<$tcx>) -> QueryStackFrame { + let kind = dep_graph::DepKind::$name; + let name = stringify!($name); + let description = ty::print::with_forced_impl_filename_line( + // Force filename-line mode to avoid invoking `type_of` query. + || queries::$name::describe(tcx, key) + ); + let description = if tcx.sess.verbose() { + format!("{} [{}]", description, name) + } else { + description + }; + let span = if kind == dep_graph::DepKind::def_span { + // The `def_span` query is used to calculate `default_span`, + // so exit to avoid infinite recursion. + None + } else { + Some(key.default_span(*tcx)) + }; + let hash = || { + let mut hcx = tcx.create_stable_hashing_context(); + let mut hasher = StableHasher::new(); + std::mem::discriminant(&kind).hash_stable(&mut hcx, &mut hasher); + key.hash_stable(&mut hcx, &mut hasher); + hasher.finish::() + }; + + QueryStackFrame::new(name, description, span, hash) + })* + } + + #[allow(nonstandard_style)] + pub mod queries { + use std::marker::PhantomData; + + $(pub struct $name<$tcx> { + data: PhantomData<&$tcx ()> + })* + } + + $(impl<$tcx> QueryConfig for queries::$name<$tcx> { + type Key = query_keys::$name<$tcx>; + type Value = query_values::$name<$tcx>; + type Stored = query_stored::$name<$tcx>; + const NAME: &'static str = stringify!($name); + } + + impl<$tcx> QueryAccessors> for queries::$name<$tcx> { + const ANON: bool = is_anon!([$($modifiers)*]); + const EVAL_ALWAYS: bool = is_eval_always!([$($modifiers)*]); + const DEP_KIND: dep_graph::DepKind = dep_graph::DepKind::$name; + + type Cache = query_storage::$name<$tcx>; + + #[inline(always)] + fn query_state<'a>(tcx: QueryCtxt<$tcx>) -> &'a QueryState + where QueryCtxt<$tcx>: 'a + { + &tcx.queries.$name + } + + #[inline(always)] + fn query_cache<'a>(tcx: QueryCtxt<$tcx>) -> &'a QueryCacheStore + where 'tcx:'a + { + &tcx.query_caches.$name + } + + #[inline] + fn compute(tcx: QueryCtxt<'tcx>, key: Self::Key) -> Self::Value { + let provider = tcx.queries.providers.get(key.query_crate()) + // HACK(eddyb) it's possible crates may be loaded after + // the query engine is created, and because crate loading + // is not yet integrated with the query engine, such crates + // would be missing appropriate entries in `providers`. + .unwrap_or(&tcx.queries.fallback_extern_providers) + .$name; + provider(*tcx, key) + } + + fn hash_result( + _hcx: &mut StableHashingContext<'_>, + _result: &Self::Value + ) -> Option { + hash_result!([$($modifiers)*][_hcx, _result]) + } + + fn handle_cycle_error( + tcx: QueryCtxt<'tcx>, + mut error: DiagnosticBuilder<'_>, + ) -> Self::Value { + handle_cycle_error!([$($modifiers)*][tcx, error]) + } + })* + + #[allow(non_upper_case_globals)] + pub mod query_callbacks { + use super::*; + use rustc_middle::dep_graph::DepNode; + use rustc_middle::ty::query::query_keys; + use rustc_query_system::dep_graph::DepNodeParams; + use rustc_query_system::query::{force_query, QueryDescription}; + + // We use this for most things when incr. comp. is turned off. + pub const Null: QueryStruct = QueryStruct { + force_from_dep_node: |_, dep_node| bug!("force_from_dep_node: encountered {:?}", dep_node), + try_load_from_on_disk_cache: |_, _| {}, + }; + + pub const TraitSelect: QueryStruct = QueryStruct { + force_from_dep_node: |_, _| false, + try_load_from_on_disk_cache: |_, _| {}, + }; + + pub const CompileCodegenUnit: QueryStruct = QueryStruct { + force_from_dep_node: |_, _| false, + try_load_from_on_disk_cache: |_, _| {}, + }; + + $(pub const $name: QueryStruct = { + const is_anon: bool = is_anon!([$($modifiers)*]); + + #[inline(always)] + fn can_reconstruct_query_key() -> bool { + as DepNodeParams>> + ::can_reconstruct_query_key() + } + + fn recover<'tcx>(tcx: TyCtxt<'tcx>, dep_node: &DepNode) -> Option> { + as DepNodeParams>>::recover(tcx, dep_node) + } + + fn force_from_dep_node(tcx: QueryCtxt<'_>, dep_node: &DepNode) -> bool { + if is_anon { + return false; + } + + if !can_reconstruct_query_key() { + return false; + } + + if let Some(key) = recover(*tcx, dep_node) { + force_query::, _>(tcx, key, DUMMY_SP, *dep_node); + return true; + } + + false + } + + fn try_load_from_on_disk_cache(tcx: QueryCtxt<'_>, dep_node: &DepNode) { + if is_anon { + return + } + + if !can_reconstruct_query_key() { + return + } + + debug_assert!(tcx.dep_graph + .node_color(dep_node) + .map(|c| c.is_green()) + .unwrap_or(false)); + + let key = recover(*tcx, dep_node).unwrap_or_else(|| panic!("Failed to recover key for {:?} with hash {}", dep_node, dep_node.hash)); + if queries::$name::cache_on_disk(tcx, &key, None) { + let _ = tcx.$name(key); + } + } + + QueryStruct { + force_from_dep_node, + try_load_from_on_disk_cache, + } + };)* + } + + static QUERY_CALLBACKS: &[QueryStruct] = &make_dep_kind_array!(query_callbacks); + } +} + +// FIXME(eddyb) this macro (and others?) use `$tcx` and `'tcx` interchangeably. +// We should either not take `$tcx` at all and use `'tcx` everywhere, or use +// `$tcx` everywhere (even if that isn't necessary due to lack of hygiene). +macro_rules! define_queries_struct { + (tcx: $tcx:tt, + input: ($(([$($modifiers:tt)*] [$($attr:tt)*] [$name:ident]))*)) => { + pub struct Queries<$tcx> { + providers: IndexVec, + fallback_extern_providers: Box, + + $($(#[$attr])* $name: QueryState< + crate::dep_graph::DepKind, + query_keys::$name<$tcx>, + >,)* + } + + impl<$tcx> Queries<$tcx> { + pub fn new( + providers: IndexVec, + fallback_extern_providers: Providers, + ) -> Self { + Queries { + providers, + fallback_extern_providers: Box::new(fallback_extern_providers), + $($name: Default::default()),* + } + } + + pub(crate) fn try_collect_active_jobs( + &$tcx self, + tcx: TyCtxt<$tcx>, + ) -> Option> { + let tcx = QueryCtxt { tcx, queries: self }; + let mut jobs = QueryMap::default(); + + $( + self.$name.try_collect_active_jobs( + tcx, + dep_graph::DepKind::$name, + make_query::$name, + &mut jobs, + )?; + )* + + Some(jobs) + } + } + + impl QueryEngine<'tcx> for Queries<'tcx> { + unsafe fn deadlock(&'tcx self, _tcx: TyCtxt<'tcx>, _registry: &rustc_rayon_core::Registry) { + #[cfg(parallel_compiler)] + { + let tcx = QueryCtxt { tcx: _tcx, queries: self }; + rustc_query_system::query::deadlock(tcx, _registry) + } + } + + fn encode_query_results( + &'tcx self, + tcx: TyCtxt<'tcx>, + encoder: &mut on_disk_cache::CacheEncoder<'a, 'tcx, opaque::FileEncoder>, + query_result_index: &mut on_disk_cache::EncodedQueryResultIndex, + ) -> opaque::FileEncodeResult { + let tcx = QueryCtxt { tcx, queries: self }; + tcx.encode_query_results(encoder, query_result_index) + } + + fn exec_cache_promotions(&'tcx self, tcx: TyCtxt<'tcx>) { + let tcx = QueryCtxt { tcx, queries: self }; + tcx.dep_graph.exec_cache_promotions(tcx) + } + + fn try_mark_green(&'tcx self, tcx: TyCtxt<'tcx>, dep_node: &dep_graph::DepNode) -> bool { + let qcx = QueryCtxt { tcx, queries: self }; + tcx.dep_graph.try_mark_green(qcx, dep_node).is_some() + } + + fn try_print_query_stack( + &'tcx self, + tcx: TyCtxt<'tcx>, + query: Option>, + handler: &Handler, + num_frames: Option, + ) -> usize { + let qcx = QueryCtxt { tcx, queries: self }; + rustc_query_system::query::print_query_stack(qcx, query, handler, num_frames) + } + + $($(#[$attr])* + #[inline(always)] + fn $name( + &'tcx self, + tcx: TyCtxt<$tcx>, + span: Span, + key: query_keys::$name<$tcx>, + lookup: QueryLookup, + mode: QueryMode, + ) -> Option> { + let qcx = QueryCtxt { tcx, queries: self }; + get_query::, _>(qcx, span, key, lookup, mode) + })* + } + }; +} + +fn describe_as_module(def_id: LocalDefId, tcx: TyCtxt<'_>) -> String { + if def_id.is_top_level_module() { + "top-level module".to_string() + } else { + format!("module `{}`", tcx.def_path_str(def_id.to_def_id())) + } +} + +rustc_query_description! {} diff --git a/compiler/rustc_middle/src/ty/query/profiling_support.rs b/compiler/rustc_query_impl/src/profiling_support.rs similarity index 86% rename from compiler/rustc_middle/src/ty/query/profiling_support.rs rename to compiler/rustc_query_impl/src/profiling_support.rs index cbcecb8849..2448588973 100644 --- a/compiler/rustc_middle/src/ty/query/profiling_support.rs +++ b/compiler/rustc_query_impl/src/profiling_support.rs @@ -1,32 +1,31 @@ -use crate::ty::context::TyCtxt; -use crate::ty::WithOptConstParam; use measureme::{StringComponent, StringId}; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::profiling::SelfProfiler; use rustc_hir::def_id::{CrateNum, DefId, DefIndex, LocalDefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::definitions::DefPathData; -use rustc_query_system::query::{QueryCache, QueryContext, QueryState}; +use rustc_middle::ty::{TyCtxt, WithOptConstParam}; +use rustc_query_system::query::{QueryCache, QueryCacheStore}; use std::fmt::Debug; use std::io::Write; -pub struct QueryKeyStringCache { +struct QueryKeyStringCache { def_id_cache: FxHashMap, } impl QueryKeyStringCache { - pub fn new() -> QueryKeyStringCache { + fn new() -> QueryKeyStringCache { QueryKeyStringCache { def_id_cache: Default::default() } } } -pub struct QueryKeyStringBuilder<'p, 'c, 'tcx> { +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( + fn new( profiler: &'p SelfProfiler, tcx: TyCtxt<'tcx>, string_cache: &'c mut QueryKeyStringCache, @@ -98,7 +97,7 @@ impl<'p, 'c, 'tcx> QueryKeyStringBuilder<'p, 'c, 'tcx> { } } -pub trait IntoSelfProfilingString { +trait IntoSelfProfilingString { fn to_self_profile_string(&self, builder: &mut QueryKeyStringBuilder<'_, '_, '_>) -> StringId; } @@ -123,7 +122,7 @@ impl IntoSelfProfilingString for T { } #[rustc_specialization_trait] -pub trait SpecIntoSelfProfilingString: Debug { +trait SpecIntoSelfProfilingString: Debug { fn spec_to_self_profile_string( &self, builder: &mut QueryKeyStringBuilder<'_, '_, '_>, @@ -227,10 +226,10 @@ where /// 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, C>( +fn alloc_self_profile_query_strings_for_query_cache<'tcx, C>( tcx: TyCtxt<'tcx>, query_name: &'static str, - query_state: &QueryState as QueryContext>::Query, C>, + query_cache: &QueryCacheStore, string_cache: &mut QueryKeyStringCache, ) where C: QueryCache, @@ -251,7 +250,7 @@ pub(super) fn alloc_self_profile_query_strings_for_query_cache<'tcx, C>( // 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: Vec<_> = query_state + let query_keys_and_indices: Vec<_> = query_cache .iter_results(|results| results.map(|(k, _, i)| (k.clone(), i)).collect()); // Now actually allocate the strings. If allocating the strings @@ -276,7 +275,7 @@ pub(super) fn alloc_self_profile_query_strings_for_query_cache<'tcx, C>( let query_name = profiler.get_or_alloc_cached_string(query_name); let event_id = event_id_builder.from_label(query_name).to_string_id(); - query_state.iter_results(|results| { + query_cache.iter_results(|results| { let query_invocation_ids: Vec<_> = results.map(|v| v.2.into()).collect(); profiler.bulk_map_query_invocation_id_to_single_string( @@ -287,3 +286,35 @@ pub(super) fn alloc_self_profile_query_strings_for_query_cache<'tcx, C>( } }); } + +/// 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(tcx: TyCtxt<'tcx>) { + if !tcx.prof.enabled() { + return; + } + + let mut string_cache = QueryKeyStringCache::new(); + + macro_rules! alloc_once { + (<$tcx:tt> + $($(#[$attr:meta])* [$($modifiers:tt)*] fn $name:ident($K:ty) -> $V:ty,)* + ) => { + $({ + alloc_self_profile_query_strings_for_query_cache( + tcx, + stringify!($name), + &tcx.query_caches.$name, + &mut string_cache, + ); + })* + } + } + + rustc_query_append! { [alloc_once!][<'tcx>] } +} diff --git a/compiler/rustc_middle/src/ty/query/stats.rs b/compiler/rustc_query_impl/src/stats.rs similarity index 74% rename from compiler/rustc_middle/src/ty/query/stats.rs rename to compiler/rustc_query_impl/src/stats.rs index e0b44ce23c..4d52483c3b 100644 --- a/compiler/rustc_middle/src/ty/query/stats.rs +++ b/compiler/rustc_query_impl/src/stats.rs @@ -1,10 +1,9 @@ -use crate::ty::query::queries; -use crate::ty::TyCtxt; use rustc_hir::def_id::{DefId, LOCAL_CRATE}; -use rustc_query_system::query::{QueryAccessors, QueryCache, QueryContext, QueryState}; +use rustc_middle::ty::query::query_storage; +use rustc_middle::ty::TyCtxt; +use rustc_query_system::query::{QueryCache, QueryCacheStore}; use std::any::type_name; -use std::hash::Hash; use std::mem; #[cfg(debug_assertions)] use std::sync::atomic::Ordering; @@ -37,10 +36,8 @@ struct QueryStats { local_def_id_keys: Option, } -fn stats(name: &'static str, map: &QueryState) -> QueryStats +fn stats(name: &'static str, map: &QueryCacheStore) -> QueryStats where - D: Copy + Clone + Eq + Hash, - Q: Clone, C: QueryCache, { let mut stats = QueryStats { @@ -70,29 +67,29 @@ pub fn print_stats(tcx: TyCtxt<'_>) { if cfg!(debug_assertions) { let hits: usize = queries.iter().map(|s| s.cache_hits).sum(); let results: usize = queries.iter().map(|s| s.entry_count).sum(); - println!("\nQuery cache hit rate: {}", hits as f64 / (hits + results) as f64); + eprintln!("\nQuery cache hit rate: {}", hits as f64 / (hits + results) as f64); } let mut query_key_sizes = queries.clone(); query_key_sizes.sort_by_key(|q| q.key_size); - println!("\nLarge query keys:"); + eprintln!("\nLarge query keys:"); for q in query_key_sizes.iter().rev().filter(|q| q.key_size > 8) { - println!(" {} - {} x {} - {}", q.name, q.key_size, q.entry_count, q.key_type); + eprintln!(" {} - {} x {} - {}", q.name, q.key_size, q.entry_count, q.key_type); } let mut query_value_sizes = queries.clone(); query_value_sizes.sort_by_key(|q| q.value_size); - println!("\nLarge query values:"); + eprintln!("\nLarge query values:"); for q in query_value_sizes.iter().rev().filter(|q| q.value_size > 8) { - println!(" {} - {} x {} - {}", q.name, q.value_size, q.entry_count, q.value_type); + eprintln!(" {} - {} x {} - {}", q.name, q.value_size, q.entry_count, q.value_type); } if cfg!(debug_assertions) { let mut query_cache_hits = queries.clone(); query_cache_hits.sort_by_key(|q| q.cache_hits); - println!("\nQuery cache hits:"); + eprintln!("\nQuery cache hits:"); for q in query_cache_hits.iter().rev() { - println!( + eprintln!( " {} - {} ({}%)", q.name, q.cache_hits, @@ -103,19 +100,19 @@ pub fn print_stats(tcx: TyCtxt<'_>) { let mut query_value_count = queries.clone(); query_value_count.sort_by_key(|q| q.entry_count); - println!("\nQuery value count:"); + eprintln!("\nQuery value count:"); for q in query_value_count.iter().rev() { - println!(" {} - {}", q.name, q.entry_count); + eprintln!(" {} - {}", q.name, q.entry_count); } let mut def_id_density: Vec<_> = queries.iter().filter(|q| q.local_def_id_keys.is_some()).collect(); def_id_density.sort_by_key(|q| q.local_def_id_keys.unwrap()); - println!("\nLocal DefId density:"); + eprintln!("\nLocal DefId density:"); let total = tcx.hir().definitions().def_index_count() as f64; for q in def_id_density.iter().rev() { let local = q.local_def_id_keys.unwrap(); - println!(" {} - {} = ({}%)", q.name, local, (local as f64 * 100.0) / total); + eprintln!(" {} - {} = ({}%)", q.name, local, (local as f64 * 100.0) / total); } } @@ -128,12 +125,10 @@ macro_rules! print_stats { $( queries.push(stats::< - crate::dep_graph::DepKind, - as QueryContext>::Query, - as QueryAccessors>>::Cache, + query_storage::$name<'_>, >( stringify!($name), - &tcx.queries.$name, + &tcx.query_caches.$name, )); )* diff --git a/compiler/rustc_middle/src/ty/query/values.rs b/compiler/rustc_query_impl/src/values.rs similarity index 75% rename from compiler/rustc_middle/src/ty/query/values.rs rename to compiler/rustc_query_impl/src/values.rs index f28b0f499f..003867beeb 100644 --- a/compiler/rustc_middle/src/ty/query/values.rs +++ b/compiler/rustc_query_impl/src/values.rs @@ -1,18 +1,19 @@ -use crate::ty::{self, AdtSizedConstraint, Ty, TyCtxt, TyS}; +use super::QueryCtxt; +use rustc_middle::ty::{self, AdtSizedConstraint, Ty, TyS}; pub(super) trait Value<'tcx>: Sized { - fn from_cycle_error(tcx: TyCtxt<'tcx>) -> Self; + fn from_cycle_error(tcx: QueryCtxt<'tcx>) -> Self; } impl<'tcx, T> Value<'tcx> for T { - default fn from_cycle_error(tcx: TyCtxt<'tcx>) -> T { + default fn from_cycle_error(tcx: QueryCtxt<'tcx>) -> T { tcx.sess.abort_if_errors(); bug!("Value::from_cycle_error called without errors"); } } impl<'tcx> Value<'tcx> for &'_ TyS<'_> { - fn from_cycle_error(tcx: TyCtxt<'tcx>) -> Self { + fn from_cycle_error(tcx: QueryCtxt<'tcx>) -> Self { // SAFETY: This is never called when `Self` is not `Ty<'tcx>`. // FIXME: Represent the above fact in the trait system somehow. unsafe { std::mem::transmute::, Ty<'_>>(tcx.ty_error()) } @@ -20,19 +21,19 @@ impl<'tcx> Value<'tcx> for &'_ TyS<'_> { } impl<'tcx> Value<'tcx> for ty::SymbolName<'_> { - fn from_cycle_error(tcx: TyCtxt<'tcx>) -> Self { + fn from_cycle_error(tcx: QueryCtxt<'tcx>) -> Self { // SAFETY: This is never called when `Self` is not `SymbolName<'tcx>`. // FIXME: Represent the above fact in the trait system somehow. unsafe { std::mem::transmute::, ty::SymbolName<'_>>(ty::SymbolName::new( - tcx, "", + *tcx, "", )) } } } impl<'tcx> Value<'tcx> for AdtSizedConstraint<'_> { - fn from_cycle_error(tcx: TyCtxt<'tcx>) -> Self { + fn from_cycle_error(tcx: QueryCtxt<'tcx>) -> Self { // SAFETY: This is never called when `Self` is not `AdtSizedConstraint<'tcx>`. // FIXME: Represent the above fact in the trait system somehow. unsafe { diff --git a/compiler/rustc_query_system/Cargo.toml b/compiler/rustc_query_system/Cargo.toml index f38d62dec0..19512dc1f6 100644 --- a/compiler/rustc_query_system/Cargo.toml +++ b/compiler/rustc_query_system/Cargo.toml @@ -10,12 +10,13 @@ doctest = false [dependencies] rustc_arena = { path = "../rustc_arena" } tracing = "0.1" -rustc-rayon-core = "0.3.0" +rustc-rayon-core = "0.3.1" rustc_data_structures = { path = "../rustc_data_structures" } rustc_errors = { path = "../rustc_errors" } rustc_macros = { path = "../rustc_macros" } rustc_index = { path = "../rustc_index" } rustc_serialize = { path = "../rustc_serialize" } +rustc_session = { path = "../rustc_session" } rustc_span = { path = "../rustc_span" } parking_lot = "0.11" -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } diff --git a/compiler/rustc_query_system/src/cache.rs b/compiler/rustc_query_system/src/cache.rs index be3d360772..c6dc7b4fe2 100644 --- a/compiler/rustc_query_system/src/cache.rs +++ b/compiler/rustc_query_system/src/cache.rs @@ -1,7 +1,6 @@ //! Cache for candidate selection. -use crate::dep_graph::DepNodeIndex; -use crate::query::QueryContext; +use crate::dep_graph::{DepContext, DepNodeIndex}; use rustc_data_structures::fx::FxHashMap; use rustc_data_structures::sync::HashMapExt; @@ -28,7 +27,7 @@ impl Cache { } impl Cache { - pub fn get(&self, key: &Key, tcx: CTX) -> Option { + pub fn get(&self, key: &Key, tcx: CTX) -> Option { Some(self.hashmap.borrow().get(key)?.get(tcx)) } @@ -55,7 +54,7 @@ impl WithDepNode { WithDepNode { dep_node, cached_value } } - pub fn get(&self, tcx: CTX) -> T { + pub fn get(&self, tcx: CTX) -> T { tcx.dep_graph().read_index(self.dep_node); self.cached_value.clone() } diff --git a/compiler/rustc_query_system/src/dep_graph/dep_node.rs b/compiler/rustc_query_system/src/dep_graph/dep_node.rs index 64aba87050..f55e2f777a 100644 --- a/compiler/rustc_query_system/src/dep_graph/dep_node.rs +++ b/compiler/rustc_query_system/src/dep_graph/dep_node.rs @@ -79,7 +79,7 @@ impl DepNode { pub fn construct(tcx: Ctxt, kind: K, arg: &Key) -> DepNode where - Ctxt: crate::query::QueryContext, + Ctxt: super::DepContext, Key: DepNodeParams, { let hash = arg.to_fingerprint(tcx); @@ -87,7 +87,10 @@ impl DepNode { #[cfg(debug_assertions)] { - if !kind.can_reconstruct_query_key() && tcx.debug_dep_node() { + if !kind.can_reconstruct_query_key() + && (tcx.sess().opts.debugging_opts.incremental_info + || tcx.sess().opts.debugging_opts.query_dep_graph) + { tcx.dep_graph().register_dep_node_debug_str(dep_node, || arg.to_debug_str(tcx)); } } diff --git a/compiler/rustc_query_system/src/dep_graph/graph.rs b/compiler/rustc_query_system/src/dep_graph/graph.rs index 4fb3a683ea..0f25572170 100644 --- a/compiler/rustc_query_system/src/dep_graph/graph.rs +++ b/compiler/rustc_query_system/src/dep_graph/graph.rs @@ -23,7 +23,8 @@ use super::debug::EdgeFilter; use super::prev::PreviousDepGraph; use super::query::DepGraphQuery; use super::serialized::SerializedDepNodeIndex; -use super::{DepContext, DepKind, DepNode, WorkProductId}; +use super::{DepContext, DepKind, DepNode, HasDepContext, WorkProductId}; +use crate::query::QueryContext; #[derive(Clone)] pub struct DepGraph { @@ -235,7 +236,7 @@ impl DepGraph { /// `arg` parameter. /// /// [rustc dev guide]: https://rustc-dev-guide.rust-lang.org/incremental-compilation.html - pub fn with_task, A, R>( + pub fn with_task, A, R>( &self, key: DepNode, cx: Ctxt, @@ -261,7 +262,7 @@ impl DepGraph { ) } - fn with_task_impl, A, R>( + fn with_task_impl, A, R>( &self, key: DepNode, cx: Ctxt, @@ -271,14 +272,15 @@ impl DepGraph { hash_result: impl FnOnce(&mut Ctxt::StableHashingContext, &R) -> Option, ) -> (R, DepNodeIndex) { if let Some(ref data) = self.data { + let dcx = cx.dep_context(); let task_deps = create_task(key).map(Lock::new); let result = K::with_deps(task_deps.as_ref(), || task(cx, arg)); let edges = task_deps.map_or_else(|| smallvec![], |lock| lock.into_inner().reads); - let mut hcx = cx.create_stable_hashing_context(); + let mut hcx = dcx.create_stable_hashing_context(); let current_fingerprint = hash_result(&mut hcx, &result); - let print_status = cfg!(debug_assertions) && cx.debug_dep_tasks(); + let print_status = cfg!(debug_assertions) && dcx.sess().opts.debugging_opts.dep_tasks; // Intern the new `DepNode`. let dep_node_index = if let Some(prev_index) = data.previous.node_to_index_opt(&key) { @@ -408,7 +410,7 @@ impl DepGraph { /// Executes something within an "eval-always" task which is a task /// that runs whenever anything changes. - pub fn with_eval_always_task, A, R>( + pub fn with_eval_always_task, A, R>( &self, key: DepNode, cx: Ctxt, @@ -585,7 +587,7 @@ impl DepGraph { /// A node will have an index, when it's already been marked green, or when we can mark it /// green. This function will mark the current task as a reader of the specified node, when /// a node index can be found for that node. - pub fn try_mark_green_and_read>( + pub fn try_mark_green_and_read>( &self, tcx: Ctxt, dep_node: &DepNode, @@ -597,7 +599,7 @@ impl DepGraph { }) } - pub fn try_mark_green>( + pub fn try_mark_green>( &self, tcx: Ctxt, dep_node: &DepNode, @@ -625,7 +627,7 @@ impl DepGraph { } /// Try to mark a dep-node which existed in the previous compilation session as green. - fn try_mark_previous_green>( + fn try_mark_previous_green>( &self, tcx: Ctxt, data: &DepGraphData, @@ -729,7 +731,7 @@ impl DepGraph { return None; } None => { - if !tcx.has_errors_or_delayed_span_bugs() { + if !tcx.dep_context().sess().has_errors_or_delayed_span_bugs() { panic!( "try_mark_previous_green() - Forcing the DepNode \ should have set its color" @@ -809,7 +811,7 @@ impl DepGraph { /// This may be called concurrently on multiple threads for the same dep node. #[cold] #[inline(never)] - fn emit_diagnostics>( + fn emit_diagnostics>( &self, tcx: Ctxt, data: &DepGraphData, @@ -833,7 +835,7 @@ impl DepGraph { // Promote the previous diagnostics to the current session. tcx.store_diagnostics(dep_node_index, diagnostics.clone().into()); - let handle = tcx.diagnostic(); + let handle = tcx.dep_context().sess().diagnostic(); for diagnostic in diagnostics { handle.emit_diagnostic(&diagnostic); @@ -874,7 +876,8 @@ impl DepGraph { // // This method will only load queries that will end up in the disk cache. // Other queries will not be executed. - pub fn exec_cache_promotions>(&self, tcx: Ctxt) { + pub fn exec_cache_promotions>(&self, qcx: Ctxt) { + let tcx = qcx.dep_context(); let _prof_timer = tcx.profiler().generic_activity("incr_comp_query_cache_promotion"); let data = self.data.as_ref().unwrap(); @@ -882,7 +885,7 @@ impl DepGraph { match data.colors.get(prev_index) { Some(DepNodeColor::Green(_)) => { let dep_node = data.previous.index_to_node(prev_index); - tcx.try_load_from_on_disk_cache(&dep_node); + qcx.try_load_from_on_disk_cache(&dep_node); } None | Some(DepNodeColor::Red) => { // We can skip red nodes because a node can only be marked @@ -964,29 +967,29 @@ impl DepGraph { ----------------------------------------------\ ------------"; - println!("[incremental]"); - println!("[incremental] DepGraph Statistics"); - println!("{}", SEPARATOR); - println!("[incremental]"); - println!("[incremental] Total Node Count: {}", total_node_count); - println!("[incremental] Total Edge Count: {}", total_edge_count); + eprintln!("[incremental]"); + eprintln!("[incremental] DepGraph Statistics"); + eprintln!("{}", SEPARATOR); + eprintln!("[incremental]"); + eprintln!("[incremental] Total Node Count: {}", total_node_count); + eprintln!("[incremental] Total Edge Count: {}", total_edge_count); if cfg!(debug_assertions) { let total_edge_reads = current.total_read_count.load(Relaxed); let total_duplicate_edge_reads = current.total_duplicate_read_count.load(Relaxed); - println!("[incremental] Total Edge Reads: {}", total_edge_reads); - println!("[incremental] Total Duplicate Edge Reads: {}", total_duplicate_edge_reads); + eprintln!("[incremental] Total Edge Reads: {}", total_edge_reads); + eprintln!("[incremental] Total Duplicate Edge Reads: {}", total_duplicate_edge_reads); } - println!("[incremental]"); + eprintln!("[incremental]"); - println!( + eprintln!( "[incremental] {:<36}| {:<17}| {:<12}| {:<17}|", "Node Kind", "Node Frequency", "Node Count", "Avg. Edge Count" ); - println!( + eprintln!( "[incremental] -------------------------------------\ |------------------\ |-------------\ @@ -997,7 +1000,7 @@ impl DepGraph { let node_kind_ratio = (100.0 * (stat.node_counter as f64)) / (total_node_count as f64); let node_kind_avg_edges = (stat.edge_counter as f64) / (stat.node_counter as f64); - println!( + eprintln!( "[incremental] {:<36}|{:>16.1}% |{:>12} |{:>17.1} |", format!("{:?}", stat.kind), node_kind_ratio, @@ -1006,8 +1009,8 @@ impl DepGraph { ); } - println!("{}", SEPARATOR); - println!("[incremental]"); + eprintln!("{}", SEPARATOR); + eprintln!("[incremental]"); } fn next_virtual_depnode_index(&self) -> DepNodeIndex { diff --git a/compiler/rustc_query_system/src/dep_graph/mod.rs b/compiler/rustc_query_system/src/dep_graph/mod.rs index b1c901633a..e8fb71be3e 100644 --- a/compiler/rustc_query_system/src/dep_graph/mod.rs +++ b/compiler/rustc_query_system/src/dep_graph/mod.rs @@ -13,8 +13,7 @@ pub use serialized::{SerializedDepGraph, SerializedDepNodeIndex}; use rustc_data_structures::profiling::SelfProfilerRef; use rustc_data_structures::sync::Lock; -use rustc_data_structures::thin_vec::ThinVec; -use rustc_errors::Diagnostic; +use rustc_session::Session; use std::fmt; use std::hash::Hash; @@ -26,38 +25,37 @@ pub trait DepContext: Copy { /// Create a hashing context for hashing new results. fn create_stable_hashing_context(&self) -> Self::StableHashingContext; - fn debug_dep_tasks(&self) -> bool; - fn debug_dep_node(&self) -> bool; - - /// Try to force a dep node to execute and see if it's green. - fn try_force_from_dep_node(&self, dep_node: &DepNode) -> bool; + /// Access the DepGraph. + fn dep_graph(&self) -> &DepGraph; fn register_reused_dep_node(&self, dep_node: &DepNode); - /// Return whether the current session is tainted by errors. - fn has_errors_or_delayed_span_bugs(&self) -> bool; - - /// Return the diagnostic handler. - fn diagnostic(&self) -> &rustc_errors::Handler; + /// Access the profiler. + fn profiler(&self) -> &SelfProfilerRef; - /// Load data from the on-disk cache. - fn try_load_from_on_disk_cache(&self, dep_node: &DepNode); + /// Access the compiler session. + fn sess(&self) -> &Session; +} - /// Load diagnostics associated to the node in the previous session. - fn load_diagnostics(&self, prev_dep_node_index: SerializedDepNodeIndex) -> Vec; +pub trait HasDepContext: Copy { + type DepKind: self::DepKind; + type StableHashingContext; + type DepContext: self::DepContext< + DepKind = Self::DepKind, + StableHashingContext = Self::StableHashingContext, + >; - /// Register diagnostics for the given node, for use in next session. - fn store_diagnostics(&self, dep_node_index: DepNodeIndex, diagnostics: ThinVec); + fn dep_context(&self) -> &Self::DepContext; +} - /// Register diagnostics for the given node, for use in next session. - fn store_diagnostics_for_anon_node( - &self, - dep_node_index: DepNodeIndex, - diagnostics: ThinVec, - ); +impl HasDepContext for T { + type DepKind = T::DepKind; + type StableHashingContext = T::StableHashingContext; + type DepContext = Self; - /// Access the profiler. - fn profiler(&self) -> &SelfProfilerRef; + fn dep_context(&self) -> &Self::DepContext { + self + } } /// Describe the different families of dependency nodes. diff --git a/compiler/rustc_query_system/src/query/caches.rs b/compiler/rustc_query_system/src/query/caches.rs index 1d2bc1a99a..001bf3b216 100644 --- a/compiler/rustc_query_system/src/query/caches.rs +++ b/compiler/rustc_query_system/src/query/caches.rs @@ -1,5 +1,5 @@ use crate::dep_graph::DepNodeIndex; -use crate::query::plumbing::{QueryLookup, QueryState}; +use crate::query::plumbing::{QueryCacheStore, QueryLookup}; use rustc_arena::TypedArena; use rustc_data_structures::fx::FxHashMap; @@ -31,17 +31,15 @@ pub trait QueryCache: QueryStorage { /// It returns the shard index and a lock guard to the shard, /// which will be used if the query is not in the cache and we need /// to compute it. - fn lookup( + fn lookup<'s, R, OnHit>( &self, - state: &QueryState, - key: Self::Key, + state: &'s QueryCacheStore, + key: &Self::Key, // `on_hit` can be called while holding a lock to the query state shard. on_hit: OnHit, - on_miss: OnMiss, - ) -> R + ) -> Result where - OnHit: FnOnce(&Self::Stored, DepNodeIndex) -> R, - OnMiss: FnOnce(Self::Key, QueryLookup<'_, D, Q, Self::Key, Self::Sharded>) -> R; + OnHit: FnOnce(&Self::Stored, DepNodeIndex) -> R; fn complete( &self, @@ -51,12 +49,11 @@ pub trait QueryCache: QueryStorage { index: DepNodeIndex, ) -> Self::Stored; - fn iter( + fn iter( &self, - shards: &Sharded, - get_shard: impl Fn(&mut L) -> &mut Self::Sharded, + shards: &Sharded, f: impl for<'a> FnOnce( - Box + 'a>, + &'a mut dyn Iterator, ) -> R, ) -> R; } @@ -95,23 +92,24 @@ where type Sharded = FxHashMap; #[inline(always)] - fn lookup( + fn lookup<'s, R, OnHit>( &self, - state: &QueryState, - key: K, + state: &'s QueryCacheStore, + key: &K, on_hit: OnHit, - on_miss: OnMiss, - ) -> R + ) -> Result where OnHit: FnOnce(&V, DepNodeIndex) -> R, - OnMiss: FnOnce(K, QueryLookup<'_, D, Q, K, Self::Sharded>) -> R, { - let mut lookup = state.get_lookup(&key); - let lock = &mut *lookup.lock; + let (lookup, lock) = state.get_lookup(key); + let result = lock.raw_entry().from_key_hashed_nocheck(lookup.key_hash, key); - let result = lock.cache.raw_entry().from_key_hashed_nocheck(lookup.key_hash, &key); - - if let Some((_, value)) = result { on_hit(&value.0, value.1) } else { on_miss(key, lookup) } + if let Some((_, value)) = result { + let hit_result = on_hit(&value.0, value.1); + Ok(hit_result) + } else { + Err(lookup) + } } #[inline] @@ -126,16 +124,14 @@ where value } - fn iter( + fn iter( &self, - shards: &Sharded, - get_shard: impl Fn(&mut L) -> &mut Self::Sharded, - f: impl for<'a> FnOnce(Box + 'a>) -> R, + shards: &Sharded, + f: impl for<'a> FnOnce(&'a mut dyn Iterator) -> R, ) -> R { - let mut shards = shards.lock_shards(); - let mut shards: Vec<_> = shards.iter_mut().map(|shard| get_shard(shard)).collect(); - let results = shards.iter_mut().flat_map(|shard| shard.iter()).map(|(k, v)| (k, &v.0, v.1)); - f(Box::new(results)) + let shards = shards.lock_shards(); + let mut results = shards.iter().flat_map(|shard| shard.iter()).map(|(k, v)| (k, &v.0, v.1)); + f(&mut results) } } @@ -177,26 +173,23 @@ where type Sharded = FxHashMap; #[inline(always)] - fn lookup( + fn lookup<'s, R, OnHit>( &self, - state: &QueryState, - key: K, + state: &'s QueryCacheStore, + key: &K, on_hit: OnHit, - on_miss: OnMiss, - ) -> R + ) -> Result where OnHit: FnOnce(&&'tcx V, DepNodeIndex) -> R, - OnMiss: FnOnce(K, QueryLookup<'_, D, Q, K, Self::Sharded>) -> R, { - let mut lookup = state.get_lookup(&key); - let lock = &mut *lookup.lock; - - let result = lock.cache.raw_entry().from_key_hashed_nocheck(lookup.key_hash, &key); + let (lookup, lock) = state.get_lookup(key); + let result = lock.raw_entry().from_key_hashed_nocheck(lookup.key_hash, key); if let Some((_, value)) = result { - on_hit(&&value.0, value.1) + let hit_result = on_hit(&&value.0, value.1); + Ok(hit_result) } else { - on_miss(key, lookup) + Err(lookup) } } @@ -214,15 +207,13 @@ where &value.0 } - fn iter( + fn iter( &self, - shards: &Sharded, - get_shard: impl Fn(&mut L) -> &mut Self::Sharded, - f: impl for<'a> FnOnce(Box + 'a>) -> R, + shards: &Sharded, + f: impl for<'a> FnOnce(&'a mut dyn Iterator) -> R, ) -> R { - let mut shards = shards.lock_shards(); - let mut shards: Vec<_> = shards.iter_mut().map(|shard| get_shard(shard)).collect(); - let results = shards.iter_mut().flat_map(|shard| shard.iter()).map(|(k, v)| (k, &v.0, v.1)); - f(Box::new(results)) + let shards = shards.lock_shards(); + let mut results = shards.iter().flat_map(|shard| shard.iter()).map(|(k, v)| (k, &v.0, v.1)); + f(&mut results) } } diff --git a/compiler/rustc_query_system/src/query/config.rs b/compiler/rustc_query_system/src/query/config.rs index 0f0684b354..4e2515c3ac 100644 --- a/compiler/rustc_query_system/src/query/config.rs +++ b/compiler/rustc_query_system/src/query/config.rs @@ -3,11 +3,10 @@ use crate::dep_graph::DepNode; use crate::dep_graph::SerializedDepNodeIndex; use crate::query::caches::QueryCache; -use crate::query::plumbing::CycleError; -use crate::query::{QueryContext, QueryState}; +use crate::query::{QueryCacheStore, QueryContext, QueryState}; use rustc_data_structures::fingerprint::Fingerprint; -use std::borrow::Cow; +use rustc_errors::DiagnosticBuilder; use std::fmt::Debug; use std::hash::Hash; @@ -28,15 +27,15 @@ pub(crate) struct QueryVtable { pub compute: fn(CTX, K) -> V, pub hash_result: fn(&mut CTX::StableHashingContext, &V) -> Option, - pub handle_cycle_error: fn(CTX, CycleError) -> V, + pub handle_cycle_error: fn(CTX, DiagnosticBuilder<'_>) -> V, pub cache_on_disk: fn(CTX, &K, Option<&V>) -> bool, pub try_load_from_disk: fn(CTX, SerializedDepNodeIndex) -> Option, } impl QueryVtable { - pub(crate) fn to_dep_node(&self, tcx: CTX, key: &K) -> DepNode + pub(crate) fn to_dep_node(&self, tcx: CTX::DepContext, key: &K) -> DepNode where - K: crate::dep_graph::DepNodeParams, + K: crate::dep_graph::DepNodeParams, { DepNode::construct(tcx, self.dep_kind, key) } @@ -53,8 +52,8 @@ impl QueryVtable { (self.hash_result)(hcx, value) } - pub(crate) fn handle_cycle_error(&self, tcx: CTX, error: CycleError) -> V { - (self.handle_cycle_error)(tcx, error) + pub(crate) fn handle_cycle_error(&self, tcx: CTX, diag: DiagnosticBuilder<'_>) -> V { + (self.handle_cycle_error)(tcx, diag) } pub(crate) fn cache_on_disk(&self, tcx: CTX, key: &K, value: Option<&V>) -> bool { @@ -74,14 +73,14 @@ pub trait QueryAccessors: QueryConfig { type Cache: QueryCache; // Don't use this method to access query results, instead use the methods on TyCtxt - fn query_state<'a>(tcx: CTX) -> &'a QueryState; + fn query_state<'a>(tcx: CTX) -> &'a QueryState + where + CTX: 'a; - fn to_dep_node(tcx: CTX, key: &Self::Key) -> DepNode + // Don't use this method to access query results, instead use the methods on TyCtxt + fn query_cache<'a>(tcx: CTX) -> &'a QueryCacheStore where - Self::Key: crate::dep_graph::DepNodeParams, - { - DepNode::construct(tcx, Self::DEP_KIND, key) - } + CTX: 'a; // Don't use this method to compute query results, instead use the methods on TyCtxt fn compute(tcx: CTX, key: Self::Key) -> Self::Value; @@ -91,11 +90,11 @@ pub trait QueryAccessors: QueryConfig { result: &Self::Value, ) -> Option; - fn handle_cycle_error(tcx: CTX, error: CycleError) -> Self::Value; + fn handle_cycle_error(tcx: CTX, diag: DiagnosticBuilder<'_>) -> Self::Value; } pub trait QueryDescription: QueryAccessors { - fn describe(tcx: CTX, key: Self::Key) -> Cow<'static, str>; + fn describe(tcx: CTX, key: Self::Key) -> String; #[inline] fn cache_on_disk(_: CTX, _: &Self::Key, _: Option<&Self::Value>) -> bool { diff --git a/compiler/rustc_query_system/src/query/job.rs b/compiler/rustc_query_system/src/query/job.rs index 5fed500390..35a2ac865f 100644 --- a/compiler/rustc_query_system/src/query/job.rs +++ b/compiler/rustc_query_system/src/query/job.rs @@ -1,6 +1,10 @@ +use crate::dep_graph::DepContext; use crate::query::plumbing::CycleError; +use crate::query::{QueryContext, QueryStackFrame}; use rustc_data_structures::fx::FxHashMap; +use rustc_errors::{struct_span_err, Diagnostic, DiagnosticBuilder, Handler, Level}; +use rustc_session::Session; use rustc_span::Span; use std::convert::TryFrom; @@ -10,10 +14,9 @@ use std::num::NonZeroU32; #[cfg(parallel_compiler)] use { - super::QueryContext, + crate::dep_graph::DepKind, parking_lot::{Condvar, Mutex}, rustc_data_structures::fx::FxHashSet, - rustc_data_structures::stable_hasher::{HashStable, StableHasher}, rustc_data_structures::sync::Lock, rustc_data_structures::sync::Lrc, rustc_data_structures::{jobserver, OnDrop}, @@ -25,13 +28,13 @@ use { /// Represents a span and a query key. #[derive(Clone, Debug)] -pub struct QueryInfo { +pub struct QueryInfo { /// The span corresponding to the reason for which this query was required. pub span: Span, - pub query: Q, + pub query: QueryStackFrame, } -pub(crate) type QueryMap = FxHashMap, QueryJobInfo>; +pub type QueryMap = FxHashMap, QueryJobInfo>; /// A value uniquely identifying an active query job within a shard in the query cache. #[derive(Copy, Clone, Eq, PartialEq, Hash)] @@ -58,34 +61,34 @@ where QueryJobId { job, shard: u16::try_from(shard).unwrap(), kind } } - fn query(self, map: &QueryMap) -> Q { + fn query(self, map: &QueryMap) -> QueryStackFrame { map.get(&self).unwrap().info.query.clone() } #[cfg(parallel_compiler)] - fn span(self, map: &QueryMap) -> Span { + fn span(self, map: &QueryMap) -> Span { map.get(&self).unwrap().job.span } #[cfg(parallel_compiler)] - fn parent(self, map: &QueryMap) -> Option> { + fn parent(self, map: &QueryMap) -> Option> { map.get(&self).unwrap().job.parent } #[cfg(parallel_compiler)] - fn latch<'a, Q: Clone>(self, map: &'a QueryMap) -> Option<&'a QueryLatch> { + fn latch<'a>(self, map: &'a QueryMap) -> Option<&'a QueryLatch> { map.get(&self).unwrap().job.latch.as_ref() } } -pub struct QueryJobInfo { - pub info: QueryInfo, - pub job: QueryJob, +pub struct QueryJobInfo { + pub info: QueryInfo, + pub job: QueryJob, } /// Represents an active query job. #[derive(Clone)] -pub struct QueryJob { +pub struct QueryJob { pub id: QueryShardJobId, /// The span corresponding to the reason for which this query was required. @@ -96,15 +99,14 @@ pub struct QueryJob { /// The latch that is used to wait on this job. #[cfg(parallel_compiler)] - latch: Option>, + latch: Option>, - dummy: PhantomData>, + dummy: PhantomData>, } -impl QueryJob +impl QueryJob where D: Copy + Clone + Eq + Hash, - Q: Clone, { /// Creates a new query job. pub fn new(id: QueryShardJobId, span: Span, parent: Option>) -> Self { @@ -119,7 +121,7 @@ where } #[cfg(parallel_compiler)] - pub(super) fn latch(&mut self, _id: QueryJobId) -> QueryLatch { + pub(super) fn latch(&mut self, _id: QueryJobId) -> QueryLatch { if self.latch.is_none() { self.latch = Some(QueryLatch::new()); } @@ -127,8 +129,8 @@ where } #[cfg(not(parallel_compiler))] - pub(super) fn latch(&mut self, id: QueryJobId) -> QueryLatch { - QueryLatch { id, dummy: PhantomData } + pub(super) fn latch(&mut self, id: QueryJobId) -> QueryLatch { + QueryLatch { id } } /// Signals to waiters that the query is complete. @@ -147,23 +149,21 @@ where #[cfg(not(parallel_compiler))] #[derive(Clone)] -pub(super) struct QueryLatch { +pub(super) struct QueryLatch { id: QueryJobId, - dummy: PhantomData, } #[cfg(not(parallel_compiler))] -impl QueryLatch +impl QueryLatch where D: Copy + Clone + Eq + Hash, - Q: Clone, { pub(super) fn find_cycle_in_stack( &self, - query_map: QueryMap, + query_map: QueryMap, current_job: &Option>, span: Span, - ) -> CycleError { + ) -> CycleError { // Find the waitee amongst `current_job` parents let mut cycle = Vec::new(); let mut current_job = Option::clone(current_job); @@ -197,15 +197,15 @@ where } #[cfg(parallel_compiler)] -struct QueryWaiter { +struct QueryWaiter { query: Option>, condvar: Condvar, span: Span, - cycle: Lock>>, + cycle: Lock>, } #[cfg(parallel_compiler)] -impl QueryWaiter { +impl QueryWaiter { fn notify(&self, registry: &rayon_core::Registry) { rayon_core::mark_unblocked(registry); self.condvar.notify_one(); @@ -213,19 +213,19 @@ impl QueryWaiter { } #[cfg(parallel_compiler)] -struct QueryLatchInfo { +struct QueryLatchInfo { complete: bool, - waiters: Vec>>, + waiters: Vec>>, } #[cfg(parallel_compiler)] #[derive(Clone)] -pub(super) struct QueryLatch { - info: Lrc>>, +pub(super) struct QueryLatch { + info: Lrc>>, } #[cfg(parallel_compiler)] -impl QueryLatch { +impl QueryLatch { fn new() -> Self { QueryLatch { info: Lrc::new(Mutex::new(QueryLatchInfo { complete: false, waiters: Vec::new() })), @@ -234,13 +234,13 @@ impl QueryLatch { } #[cfg(parallel_compiler)] -impl QueryLatch { +impl QueryLatch { /// Awaits for the query job to complete. pub(super) fn wait_on( &self, query: Option>, span: Span, - ) -> Result<(), CycleError> { + ) -> Result<(), CycleError> { let waiter = Lrc::new(QueryWaiter { query, span, cycle: Lock::new(None), condvar: Condvar::new() }); self.wait_on_inner(&waiter); @@ -255,7 +255,7 @@ impl QueryLatch { } /// Awaits the caller on this latch by blocking the current thread. - fn wait_on_inner(&self, waiter: &Lrc>) { + fn wait_on_inner(&self, waiter: &Lrc>) { let mut info = self.info.lock(); if !info.complete { // We push the waiter on to the `waiters` list. It can be accessed inside @@ -289,7 +289,7 @@ impl QueryLatch { /// 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 @@ -311,14 +311,13 @@ type Waiter = (QueryJobId, usize); /// required information to resume the waiter. /// If all `visit` calls returns None, this function also returns None. #[cfg(parallel_compiler)] -fn visit_waiters( - query_map: &QueryMap, +fn visit_waiters( + query_map: &QueryMap, query: QueryJobId, mut visit: F, ) -> Option>> where D: Copy + Clone + Eq + Hash, - Q: Clone, F: FnMut(Span, QueryJobId) -> Option>>, { // Visit the parent query which is a non-resumable waiter since it's on the same stack @@ -348,8 +347,8 @@ where /// If a cycle is detected, this initial value is replaced with the span causing /// the cycle. #[cfg(parallel_compiler)] -fn cycle_check( - query_map: &QueryMap, +fn cycle_check( + query_map: &QueryMap, query: QueryJobId, span: Span, stack: &mut Vec<(Span, QueryJobId)>, @@ -357,7 +356,6 @@ fn cycle_check( ) -> Option>> where D: Copy + Clone + Eq + Hash, - Q: Clone, { if !visited.insert(query) { return if let Some(p) = stack.iter().position(|q| q.1 == query) { @@ -393,14 +391,13 @@ where /// from `query` without going through any of the queries in `visited`. /// This is achieved with a depth first search. #[cfg(parallel_compiler)] -fn connected_to_root( - query_map: &QueryMap, +fn connected_to_root( + query_map: &QueryMap, query: QueryJobId, visited: &mut FxHashSet>, ) -> bool where D: Copy + Clone + Eq + Hash, - Q: Clone, { // We already visited this or we're deliberately ignoring it if !visited.insert(query) { @@ -420,30 +417,23 @@ where // Deterministically pick an query from a list #[cfg(parallel_compiler)] -fn pick_query<'a, CTX, T, F>( - query_map: &QueryMap, - tcx: CTX, - queries: &'a [T], - f: F, -) -> &'a T +fn pick_query<'a, D, T, F>(query_map: &QueryMap, queries: &'a [T], f: F) -> &'a T where - CTX: QueryContext, - F: Fn(&T) -> (Span, QueryJobId), + D: Copy + Clone + Eq + Hash, + F: Fn(&T) -> (Span, QueryJobId), { // 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.query(query_map).hash_stable(&mut hcx, &mut stable_hasher); + let hash = query.query(query_map).hash; // 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::()) + (span_cmp, hash) }) .unwrap() } @@ -454,11 +444,10 @@ where /// If a cycle was not found, the starting query is removed from `jobs` and /// the function returns false. #[cfg(parallel_compiler)] -fn remove_cycle( - query_map: &QueryMap, - jobs: &mut Vec>, - wakelist: &mut Vec>>, - tcx: CTX, +fn remove_cycle( + query_map: &QueryMap, + jobs: &mut Vec>, + wakelist: &mut Vec>>, ) -> bool { let mut visited = FxHashSet::default(); let mut stack = Vec::new(); @@ -508,15 +497,15 @@ fn remove_cycle( None } else { // Deterministically pick one of the waiters to show to the user - let waiter = *pick_query(query_map, tcx, &waiters, |s| *s); + let waiter = *pick_query(query_map, &waiters, |s| *s); Some((span, query, Some(waiter))) } } }) - .collect::, Option<(Span, QueryJobId)>)>>(); + .collect::, Option<(Span, QueryJobId)>)>>(); // Deterministically pick an entry point - let (_, entry_point, usage) = pick_query(query_map, tcx, &entry_points, |e| (e.0, e.1)); + let (_, entry_point, usage) = pick_query(query_map, &entry_points, |e| (e.0, e.1)); // Shift the stack so that our entry point is first let entry_point_pos = stack.iter().position(|(_, query)| query == entry_point); @@ -573,7 +562,7 @@ pub fn deadlock(tcx: CTX, registry: &rayon_core::Registry) { let mut found_cycle = false; while jobs.len() > 0 { - if remove_cycle(&query_map, &mut jobs, &mut wakelist, tcx) { + if remove_cycle(&query_map, &mut jobs, &mut wakelist) { found_cycle = true; } } @@ -594,3 +583,76 @@ pub fn deadlock(tcx: CTX, registry: &rayon_core::Registry) { on_panic.disable(); } + +#[inline(never)] +#[cold] +pub(crate) fn report_cycle<'a>( + sess: &'a Session, + CycleError { usage, cycle: stack }: CycleError, +) -> DiagnosticBuilder<'a> { + assert!(!stack.is_empty()); + + let fix_span = |span: Span, query: &QueryStackFrame| { + sess.source_map().guess_head_span(query.default_span(span)) + }; + + let span = fix_span(stack[1 % stack.len()].span, &stack[0].query); + let mut err = + struct_span_err!(sess, span, E0391, "cycle detected when {}", stack[0].query.description); + + for i in 1..stack.len() { + let query = &stack[i].query; + let span = fix_span(stack[(i + 1) % stack.len()].span, query); + err.span_note(span, &format!("...which requires {}...", query.description)); + } + + err.note(&format!( + "...which again requires {}, completing the cycle", + stack[0].query.description + )); + + if let Some((span, query)) = usage { + err.span_note(fix_span(span, &query), &format!("cycle used when {}", query.description)); + } + + err +} + +pub fn print_query_stack( + tcx: CTX, + mut current_query: Option>, + handler: &Handler, + num_frames: Option, +) -> usize { + // Be careful relying on global state here: this code is called from + // a panic hook, which means that the global `Handler` may be in a weird + // state if it was responsible for triggering the panic. + let mut i = 0; + let query_map = tcx.try_collect_active_jobs(); + + while let Some(query) = current_query { + if Some(i) == num_frames { + break; + } + let query_info = if let Some(info) = query_map.as_ref().and_then(|map| map.get(&query)) { + info + } else { + break; + }; + let mut diag = Diagnostic::new( + Level::FailureNote, + &format!( + "#{} [{}] {}", + i, query_info.info.query.name, query_info.info.query.description + ), + ); + diag.span = + tcx.dep_context().sess().source_map().guess_head_span(query_info.info.span).into(); + handler.force_print_diagnostic(diag); + + current_query = query_info.job.parent; + i += 1; + } + + i +} diff --git a/compiler/rustc_query_system/src/query/mod.rs b/compiler/rustc_query_system/src/query/mod.rs index da45565dbe..aef8a13cce 100644 --- a/compiler/rustc_query_system/src/query/mod.rs +++ b/compiler/rustc_query_system/src/query/mod.rs @@ -4,7 +4,7 @@ pub use self::plumbing::*; mod job; #[cfg(parallel_compiler)] pub use self::job::deadlock; -pub use self::job::{QueryInfo, QueryJob, QueryJobId, QueryJobInfo}; +pub use self::job::{print_query_stack, QueryInfo, QueryJob, QueryJobId, QueryJobInfo, QueryMap}; mod caches; pub use self::caches::{ @@ -14,31 +14,82 @@ pub use self::caches::{ mod config; pub use self::config::{QueryAccessors, QueryConfig, QueryDescription}; -use crate::dep_graph::{DepContext, DepGraph}; -use crate::query::job::QueryMap; +use crate::dep_graph::{DepNode, DepNodeIndex, HasDepContext, SerializedDepNodeIndex}; -use rustc_data_structures::stable_hasher::HashStable; use rustc_data_structures::sync::Lock; use rustc_data_structures::thin_vec::ThinVec; use rustc_errors::Diagnostic; use rustc_span::def_id::DefId; +use rustc_span::Span; -pub trait QueryContext: DepContext { - type Query: Clone + HashStable; +/// Description of a frame in the query stack. +/// +/// This is mostly used in case of cycles for error reporting. +#[derive(Clone, Debug)] +pub struct QueryStackFrame { + pub name: &'static str, + pub description: String, + span: Option, + /// This hash is used to deterministically pick + /// a query to remove cycles in the parallel compiler. + #[cfg(parallel_compiler)] + hash: u64, +} + +impl QueryStackFrame { + #[inline] + pub fn new( + name: &'static str, + description: String, + span: Option, + _hash: impl FnOnce() -> u64, + ) -> Self { + Self { + name, + description, + span, + #[cfg(parallel_compiler)] + hash: _hash(), + } + } - fn incremental_verify_ich(&self) -> bool; - fn verbose(&self) -> bool; + // FIXME(eddyb) Get more valid `Span`s on queries. + #[inline] + pub fn default_span(&self, span: Span) -> Span { + if !span.is_dummy() { + return span; + } + self.span.unwrap_or(span) + } +} +pub trait QueryContext: HasDepContext { /// Get string representation from DefPath. fn def_path_str(&self, def_id: DefId) -> String; - /// Access the DepGraph. - fn dep_graph(&self) -> &DepGraph; - /// Get the query information from the TLS context. fn current_query_job(&self) -> Option>; - fn try_collect_active_jobs(&self) -> Option>; + fn try_collect_active_jobs(&self) -> Option>; + + /// Load data from the on-disk cache. + fn try_load_from_on_disk_cache(&self, dep_node: &DepNode); + + /// Try to force a dep node to execute and see if it's green. + fn try_force_from_dep_node(&self, dep_node: &DepNode) -> bool; + + /// Load diagnostics associated to the node in the previous session. + fn load_diagnostics(&self, prev_dep_node_index: SerializedDepNodeIndex) -> Vec; + + /// Register diagnostics for the given node, for use in next session. + fn store_diagnostics(&self, dep_node_index: DepNodeIndex, diagnostics: ThinVec); + + /// Register diagnostics for the given node, for use in next session. + fn store_diagnostics_for_anon_node( + &self, + dep_node_index: DepNodeIndex, + diagnostics: ThinVec, + ); /// Executes a job by changing the `ImplicitCtxt` to point to the /// new query job while it executes. It returns the diagnostics @@ -47,6 +98,6 @@ pub trait QueryContext: DepContext { &self, token: QueryJobId, diagnostics: Option<&Lock>>, - compute: impl FnOnce(Self) -> R, + compute: impl FnOnce() -> R, ) -> R; } diff --git a/compiler/rustc_query_system/src/query/plumbing.rs b/compiler/rustc_query_system/src/query/plumbing.rs index 36532135f0..77267489a7 100644 --- a/compiler/rustc_query_system/src/query/plumbing.rs +++ b/compiler/rustc_query_system/src/query/plumbing.rs @@ -2,22 +2,23 @@ //! generate the actual methods on tcx which find and execute the provider, //! manage the caches, and so forth. -use crate::dep_graph::{DepKind, DepNode}; +use crate::dep_graph::{DepContext, DepKind, DepNode}; use crate::dep_graph::{DepNodeIndex, SerializedDepNodeIndex}; use crate::query::caches::QueryCache; use crate::query::config::{QueryDescription, QueryVtable, QueryVtableExt}; -use crate::query::job::{QueryInfo, QueryJob, QueryJobId, QueryJobInfo, QueryShardJobId}; -use crate::query::{QueryContext, QueryMap}; +use crate::query::job::{ + report_cycle, QueryInfo, QueryJob, QueryJobId, QueryJobInfo, QueryShardJobId, +}; +use crate::query::{QueryContext, QueryMap, QueryStackFrame}; #[cfg(not(parallel_compiler))] use rustc_data_structures::cold_path; use rustc_data_structures::fingerprint::Fingerprint; use rustc_data_structures::fx::{FxHashMap, FxHasher}; -use rustc_data_structures::sharded::Sharded; +use rustc_data_structures::sharded::{get_shard_index_by_hash, Sharded}; use rustc_data_structures::sync::{Lock, LockGuard}; use rustc_data_structures::thin_vec::ThinVec; use rustc_errors::{Diagnostic, FatalError}; -use rustc_span::source_map::DUMMY_SP; use rustc_span::Span; use std::collections::hash_map::Entry; use std::fmt::Debug; @@ -28,83 +29,103 @@ use std::ptr; #[cfg(debug_assertions)] use std::sync::atomic::{AtomicUsize, Ordering}; -pub(super) struct QueryStateShard { - pub(super) cache: C, - active: FxHashMap>, - - /// Used to generate unique ids for active jobs. - jobs: u32, +pub struct QueryCacheStore { + cache: C, + shards: Sharded, + #[cfg(debug_assertions)] + pub cache_hits: AtomicUsize, } -impl Default for QueryStateShard { - fn default() -> QueryStateShard { - QueryStateShard { cache: Default::default(), active: Default::default(), jobs: 0 } +impl Default for QueryCacheStore { + fn default() -> Self { + Self { + cache: C::default(), + shards: Default::default(), + #[cfg(debug_assertions)] + cache_hits: AtomicUsize::new(0), + } } } -pub struct QueryState { - cache: C, - shards: Sharded>, - #[cfg(debug_assertions)] - pub cache_hits: AtomicUsize, +/// Values used when checking a query cache which can be reused on a cache-miss to execute the query. +pub struct QueryLookup { + pub(super) key_hash: u64, + shard: usize, +} + +// We compute the key's hash once and then use it for both the +// shard lookup and the hashmap lookup. This relies on the fact +// that both of them use `FxHasher`. +fn hash_for_shard(key: &K) -> u64 { + let mut hasher = FxHasher::default(); + key.hash(&mut hasher); + hasher.finish() } -impl QueryState { - #[inline] +impl QueryCacheStore { pub(super) fn get_lookup<'tcx>( &'tcx self, key: &C::Key, - ) -> QueryLookup<'tcx, D, Q, C::Key, C::Sharded> { - // We compute the key's hash once and then use it for both the - // shard lookup and the hashmap lookup. This relies on the fact - // that both of them use `FxHasher`. - let mut hasher = FxHasher::default(); - key.hash(&mut hasher); - let key_hash = hasher.finish(); - - let shard = self.shards.get_shard_index_by_hash(key_hash); + ) -> (QueryLookup, LockGuard<'tcx, C::Sharded>) { + let key_hash = hash_for_shard(key); + let shard = get_shard_index_by_hash(key_hash); let lock = self.shards.get_shard_by_index(shard).lock(); - QueryLookup { key_hash, shard, lock } + (QueryLookup { key_hash, shard }, lock) } + + pub fn iter_results( + &self, + f: impl for<'a> FnOnce( + &'a mut dyn Iterator, + ) -> R, + ) -> R { + self.cache.iter(&self.shards, f) + } +} + +struct QueryStateShard { + active: FxHashMap>, + + /// Used to generate unique ids for active jobs. + jobs: u32, +} + +impl Default for QueryStateShard { + fn default() -> QueryStateShard { + QueryStateShard { active: Default::default(), jobs: 0 } + } +} + +pub struct QueryState { + shards: Sharded>, } /// Indicates the state of a query for a given key in a query map. -enum QueryResult { +enum QueryResult { /// An already executing query. The query job can be used to await for its completion. - Started(QueryJob), + Started(QueryJob), /// The query panicked. Queries trying to wait on this will raise a fatal error which will /// silently panic. Poisoned, } -impl QueryState +impl QueryState where D: Copy + Clone + Eq + Hash, - Q: Clone, - C: QueryCache, + K: Eq + Hash + Clone + Debug, { - #[inline(always)] - pub fn iter_results( - &self, - f: impl for<'a> FnOnce( - Box + 'a>, - ) -> R, - ) -> R { - self.cache.iter(&self.shards, |shard| &mut shard.cache, f) - } - - #[inline(always)] pub fn all_inactive(&self) -> bool { let shards = self.shards.lock_shards(); shards.iter().all(|shard| shard.active.is_empty()) } - pub fn try_collect_active_jobs( + pub fn try_collect_active_jobs( &self, + tcx: CTX, kind: D, - make_query: fn(C::Key) -> Q, - jobs: &mut QueryMap, + make_query: fn(CTX, K) -> QueryStackFrame, + jobs: &mut QueryMap, ) -> Option<()> { // We use try_lock_shards here since we are called from the // deadlock handler, and this shouldn't be locked. @@ -114,7 +135,7 @@ where shard.active.iter().filter_map(move |(k, v)| { if let QueryResult::Started(ref job) = *v { let id = QueryJobId::new(job.id, shard_id, kind); - let info = QueryInfo { span: job.span, query: make_query(k.clone()) }; + let info = QueryInfo { span: job.span, query: make_query(tcx, k.clone()) }; Some((id, QueryJobInfo { info, job: job.clone() })) } else { None @@ -126,41 +147,28 @@ where } } -impl Default for QueryState { - fn default() -> QueryState { - QueryState { - cache: C::default(), - shards: Default::default(), - #[cfg(debug_assertions)] - cache_hits: AtomicUsize::new(0), - } +impl Default for QueryState { + fn default() -> QueryState { + QueryState { shards: Default::default() } } } -/// Values used when checking a query cache which can be reused on a cache-miss to execute the query. -pub struct QueryLookup<'tcx, D, Q, K, C> { - pub(super) key_hash: u64, - shard: usize, - pub(super) lock: LockGuard<'tcx, QueryStateShard>, -} - /// A type representing the responsibility to execute the job in the `job` field. /// This will poison the relevant query if dropped. -struct JobOwner<'tcx, D, Q, C> +struct JobOwner<'tcx, D, C> where D: Copy + Clone + Eq + Hash, - Q: Clone, C: QueryCache, { - state: &'tcx QueryState, + state: &'tcx QueryState, + cache: &'tcx QueryCacheStore, key: C::Key, id: QueryJobId, } -impl<'tcx, D, Q, C> JobOwner<'tcx, D, Q, C> +impl<'tcx, D, C> JobOwner<'tcx, D, C> where D: Copy + Clone + Eq + Hash, - Q: Clone, C: QueryCache, { /// Either gets a `JobOwner` corresponding the query, allowing us to @@ -172,18 +180,21 @@ where /// This function is inlined because that results in a noticeable speed-up /// for some compile-time benchmarks. #[inline(always)] - fn try_start<'a, 'b, CTX>( + fn try_start<'b, CTX>( tcx: CTX, - state: &'b QueryState, + state: &'b QueryState, + cache: &'b QueryCacheStore, span: Span, key: &C::Key, - mut lookup: QueryLookup<'a, CTX::DepKind, CTX::Query, C::Key, C::Sharded>, + lookup: QueryLookup, query: &QueryVtable, - ) -> TryGetJob<'b, CTX::DepKind, CTX::Query, C> + ) -> TryGetJob<'b, CTX::DepKind, C> where CTX: QueryContext, { - let lock = &mut *lookup.lock; + let shard = lookup.shard; + let mut state_lock = state.shards.get_shard_by_index(shard).lock(); + let lock = &mut *state_lock; let (latch, mut _query_blocked_prof_timer) = match lock.active.entry((*key).clone()) { Entry::Occupied(mut entry) => { @@ -193,13 +204,13 @@ where // in another thread has completed. Record how long we wait in the // self-profiler. let _query_blocked_prof_timer = if cfg!(parallel_compiler) { - Some(tcx.profiler().query_blocked()) + Some(tcx.dep_context().profiler().query_blocked()) } else { None }; // Create the id of the job we're waiting for - let id = QueryJobId::new(job.id, lookup.shard, query.dep_kind); + let id = QueryJobId::new(job.id, shard, query.dep_kind); (job.latch(id), _query_blocked_prof_timer) } @@ -214,30 +225,31 @@ where lock.jobs = id; let id = QueryShardJobId(NonZeroU32::new(id).unwrap()); - let global_id = QueryJobId::new(id, lookup.shard, query.dep_kind); + let global_id = QueryJobId::new(id, shard, query.dep_kind); let job = tcx.current_query_job(); let job = QueryJob::new(id, span, job); entry.insert(QueryResult::Started(job)); - let owner = JobOwner { state, id: global_id, key: (*key).clone() }; + let owner = JobOwner { state, cache, id: global_id, key: (*key).clone() }; return TryGetJob::NotYetStarted(owner); } }; - mem::drop(lookup.lock); + mem::drop(state_lock); // If we are single-threaded we know that we have cycle error, // so we just return the error. #[cfg(not(parallel_compiler))] return TryGetJob::Cycle(cold_path(|| { - let error: CycleError = latch.find_cycle_in_stack( + let error: CycleError = latch.find_cycle_in_stack( tcx.try_collect_active_jobs().unwrap(), &tcx.current_query_job(), span, ); + let error = report_cycle(tcx.dep_context().sess(), error); let value = query.handle_cycle_error(tcx, error); - state.cache.store_nocache(value) + cache.cache.store_nocache(value) })); // With parallel queries we might just have to wait on some other @@ -247,18 +259,25 @@ where let result = latch.wait_on(tcx.current_query_job(), span); if let Err(cycle) = result { + let cycle = report_cycle(tcx.dep_context().sess(), cycle); let value = query.handle_cycle_error(tcx, cycle); - let value = state.cache.store_nocache(value); + let value = cache.cache.store_nocache(value); return TryGetJob::Cycle(value); } - let cached = try_get_cached( - tcx, - state, - (*key).clone(), - |value, index| (value.clone(), index), - |_, _| panic!("value must be in cache after waiting"), - ); + let cached = cache + .cache + .lookup(cache, &key, |value, index| { + if unlikely!(tcx.dep_context().profiler().enabled()) { + tcx.dep_context().profiler().query_cache_hit(index.into()); + } + #[cfg(debug_assertions)] + { + cache.cache_hits.fetch_add(1, Ordering::Relaxed); + } + (value.clone(), index) + }) + .unwrap_or_else(|_| panic!("value must be in cache after waiting")); if let Some(prof_timer) = _query_blocked_prof_timer.take() { prof_timer.finish_with_query_invocation_id(cached.1.into()); @@ -270,22 +289,29 @@ where /// Completes the query by updating the query cache with the `result`, /// signals the waiter and forgets the JobOwner, so it won't poison the query - #[inline(always)] fn complete(self, result: C::Value, dep_node_index: DepNodeIndex) -> C::Stored { // We can move out of `self` here because we `mem::forget` it below let key = unsafe { ptr::read(&self.key) }; let state = self.state; + let cache = self.cache; // Forget ourself so our destructor won't poison the query mem::forget(self); let (job, result) = { - let mut lock = state.shards.get_shard_by_value(&key).lock(); - let job = match lock.active.remove(&key).unwrap() { - QueryResult::Started(job) => job, - QueryResult::Poisoned => panic!(), + let key_hash = hash_for_shard(&key); + let shard = get_shard_index_by_hash(key_hash); + let job = { + let mut lock = state.shards.get_shard_by_index(shard).lock(); + match lock.active.remove(&key).unwrap() { + QueryResult::Started(job) => job, + QueryResult::Poisoned => panic!(), + } + }; + let result = { + let mut lock = cache.shards.get_shard_by_index(shard).lock(); + cache.cache.complete(&mut lock, key, result, dep_node_index) }; - let result = state.cache.complete(&mut lock.cache, key, result, dep_node_index); (job, result) }; @@ -294,7 +320,6 @@ where } } -#[inline(always)] fn with_diagnostics(f: F) -> (R, ThinVec) where F: FnOnce(Option<&Lock>>) -> R, @@ -304,10 +329,9 @@ where (result, diagnostics.into_inner()) } -impl<'tcx, D, Q, C> Drop for JobOwner<'tcx, D, Q, C> +impl<'tcx, D, C> Drop for JobOwner<'tcx, D, C> where D: Copy + Clone + Eq + Hash, - Q: Clone, C: QueryCache, { #[inline(never)] @@ -332,21 +356,20 @@ where } #[derive(Clone)] -pub struct CycleError { +pub(crate) struct CycleError { /// The query and related span that uses the cycle. - pub usage: Option<(Span, Q)>, - pub cycle: Vec>, + pub usage: Option<(Span, QueryStackFrame)>, + pub cycle: Vec, } /// The result of `try_start`. -enum TryGetJob<'tcx, D, Q, C> +enum TryGetJob<'tcx, D, C> where D: Copy + Clone + Eq + Hash, - Q: Clone, C: QueryCache, { /// The query is not yet started. Contains a guard to the cache eventually used to start it. - NotYetStarted(JobOwner<'tcx, D, Q, C>), + NotYetStarted(JobOwner<'tcx, D, C>), /// The query was already completed. /// Returns the result of the query and its dep-node index @@ -362,83 +385,79 @@ where /// It returns the shard index and a lock guard to the shard, /// which will be used if the query is not in the cache and we need /// to compute it. -#[inline(always)] -fn try_get_cached( +#[inline] +pub fn try_get_cached<'a, CTX, C, R, OnHit>( tcx: CTX, - state: &QueryState, - key: C::Key, + cache: &'a QueryCacheStore, + key: &C::Key, // `on_hit` can be called while holding a lock to the query cache on_hit: OnHit, - on_miss: OnMiss, -) -> R +) -> Result where C: QueryCache, - CTX: QueryContext, - OnHit: FnOnce(&C::Stored, DepNodeIndex) -> R, - OnMiss: FnOnce(C::Key, QueryLookup<'_, CTX::DepKind, CTX::Query, C::Key, C::Sharded>) -> R, + CTX: DepContext, + OnHit: FnOnce(&C::Stored) -> R, { - state.cache.lookup( - state, - key, - |value, index| { - if unlikely!(tcx.profiler().enabled()) { - tcx.profiler().query_cache_hit(index.into()); - } - #[cfg(debug_assertions)] - { - state.cache_hits.fetch_add(1, Ordering::Relaxed); - } - on_hit(value, index) - }, - on_miss, - ) + cache.cache.lookup(cache, &key, |value, index| { + if unlikely!(tcx.profiler().enabled()) { + tcx.profiler().query_cache_hit(index.into()); + } + #[cfg(debug_assertions)] + { + cache.cache_hits.fetch_add(1, Ordering::Relaxed); + } + tcx.dep_graph().read_index(index); + on_hit(value) + }) } -#[inline(always)] fn try_execute_query( tcx: CTX, - state: &QueryState, + state: &QueryState, + cache: &QueryCacheStore, span: Span, key: C::Key, - lookup: QueryLookup<'_, CTX::DepKind, CTX::Query, C::Key, C::Sharded>, + lookup: QueryLookup, query: &QueryVtable, ) -> C::Stored where C: QueryCache, - C::Key: crate::dep_graph::DepNodeParams, + C::Key: crate::dep_graph::DepNodeParams, CTX: QueryContext, { - let job = match JobOwner::<'_, CTX::DepKind, CTX::Query, C>::try_start( - tcx, state, span, &key, lookup, query, + let job = match JobOwner::<'_, CTX::DepKind, C>::try_start( + tcx, state, cache, span, &key, lookup, query, ) { TryGetJob::NotYetStarted(job) => job, TryGetJob::Cycle(result) => return result, #[cfg(parallel_compiler)] TryGetJob::JobCompleted((v, index)) => { - tcx.dep_graph().read_index(index); + tcx.dep_context().dep_graph().read_index(index); return v; } }; // Fast path for when incr. comp. is off. `to_dep_node` is // expensive for some `DepKind`s. - if !tcx.dep_graph().is_fully_enabled() { + if !tcx.dep_context().dep_graph().is_fully_enabled() { let null_dep_node = DepNode::new_no_params(DepKind::NULL); return force_query_with_job(tcx, key, job, null_dep_node, query).0; } if query.anon { - let prof_timer = tcx.profiler().query_provider(); + let prof_timer = tcx.dep_context().profiler().query_provider(); let ((result, dep_node_index), diagnostics) = with_diagnostics(|diagnostics| { - tcx.start_query(job.id, diagnostics, |tcx| { - tcx.dep_graph().with_anon_task(query.dep_kind, || query.compute(tcx, key)) + tcx.start_query(job.id, diagnostics, || { + tcx.dep_context() + .dep_graph() + .with_anon_task(query.dep_kind, || query.compute(tcx, key)) }) }); prof_timer.finish_with_query_invocation_id(dep_node_index.into()); - tcx.dep_graph().read_index(dep_node_index); + tcx.dep_context().dep_graph().read_index(dep_node_index); if unlikely!(!diagnostics.is_empty()) { tcx.store_diagnostics_for_anon_node(dep_node_index, diagnostics); @@ -447,14 +466,14 @@ where return job.complete(result, dep_node_index); } - let dep_node = query.to_dep_node(tcx, &key); + let dep_node = query.to_dep_node(*tcx.dep_context(), &key); if !query.eval_always { // The diagnostics for this query will be // promoted to the current session during // `try_mark_green()`, so we can ignore them here. - let loaded = tcx.start_query(job.id, None, |tcx| { - let marked = tcx.dep_graph().try_mark_green_and_read(tcx, &dep_node); + let loaded = tcx.start_query(job.id, None, || { + let marked = tcx.dep_context().dep_graph().try_mark_green_and_read(tcx, &dep_node); marked.map(|(prev_dep_node_index, dep_node_index)| { ( load_from_disk_and_cache_in_memory( @@ -475,7 +494,7 @@ where } let (result, dep_node_index) = force_query_with_job(tcx, key, job, dep_node, query); - tcx.dep_graph().read_index(dep_node_index); + tcx.dep_context().dep_graph().read_index(dep_node_index); result } @@ -493,11 +512,11 @@ where // Note this function can be called concurrently from the same query // We must ensure that this is handled correctly. - debug_assert!(tcx.dep_graph().is_green(dep_node)); + debug_assert!(tcx.dep_context().dep_graph().is_green(dep_node)); // First we try to load the result from the on-disk cache. let result = if query.cache_on_disk(tcx, &key, None) { - let prof_timer = tcx.profiler().incr_cache_loading(); + let prof_timer = tcx.dep_context().profiler().incr_cache_loading(); let result = query.try_load_from_disk(tcx, prev_dep_node_index); prof_timer.finish_with_query_invocation_id(dep_node_index.into()); @@ -514,34 +533,41 @@ where None }; - let result = if let Some(result) = result { + if let Some(result) = result { + // If `-Zincremental-verify-ich` is specified, re-hash results from + // the cache and make sure that they have the expected fingerprint. + if unlikely!(tcx.dep_context().sess().opts.debugging_opts.incremental_verify_ich) { + incremental_verify_ich(*tcx.dep_context(), &result, dep_node, dep_node_index, query); + } + result } else { // We could not load a result from the on-disk cache, so // recompute. - let prof_timer = tcx.profiler().query_provider(); + let prof_timer = tcx.dep_context().profiler().query_provider(); // The dep-graph for this computation is already in-place. - let result = tcx.dep_graph().with_ignore(|| query.compute(tcx, key)); + let result = tcx.dep_context().dep_graph().with_ignore(|| query.compute(tcx, key)); prof_timer.finish_with_query_invocation_id(dep_node_index.into()); - result - }; + // Verify that re-running the query produced a result with the expected hash + // This catches bugs in query implementations, turning them into ICEs. + // For example, a query might sort its result by `DefId` - since `DefId`s are + // not stable across compilation sessions, the result could get up getting sorted + // in a different order when the query is re-run, even though all of the inputs + // (e.g. `DefPathHash` values) were green. + // + // See issue #82920 for an example of a miscompilation that would get turned into + // an ICE by this check + incremental_verify_ich(*tcx.dep_context(), &result, dep_node, dep_node_index, query); - // If `-Zincremental-verify-ich` is specified, re-hash results from - // the cache and make sure that they have the expected fingerprint. - if unlikely!(tcx.incremental_verify_ich()) { - incremental_verify_ich(tcx, &result, dep_node, dep_node_index, query); + result } - - result } -#[inline(never)] -#[cold] fn incremental_verify_ich( - tcx: CTX, + tcx: CTX::DepContext, result: &V, dep_node: &DepNode, dep_node_index: DepNodeIndex, @@ -564,13 +590,13 @@ fn incremental_verify_ich( let old_hash = tcx.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, result); } fn force_query_with_job( tcx: CTX, key: C::Key, - job: JobOwner<'_, CTX::DepKind, CTX::Query, C>, + job: JobOwner<'_, CTX::DepKind, C>, dep_node: DepNode, query: &QueryVtable, ) -> (C::Stored, DepNodeIndex) @@ -584,7 +610,7 @@ where // 2. Two distinct query keys get mapped to the same `DepNode` // (see for example #48923). assert!( - !tcx.dep_graph().dep_node_exists(&dep_node), + !tcx.dep_context().dep_graph().dep_node_exists(&dep_node), "forcing query with already existing `DepNode`\n\ - query-key: {:?}\n\ - dep-node: {:?}", @@ -592,12 +618,12 @@ where dep_node ); - let prof_timer = tcx.profiler().query_provider(); + let prof_timer = tcx.dep_context().profiler().query_provider(); let ((result, dep_node_index), diagnostics) = with_diagnostics(|diagnostics| { - tcx.start_query(job.id, diagnostics, |tcx| { + tcx.start_query(job.id, diagnostics, || { if query.eval_always { - tcx.dep_graph().with_eval_always_task( + tcx.dep_context().dep_graph().with_eval_always_task( dep_node, tcx, key, @@ -605,7 +631,13 @@ where query.hash_result, ) } else { - tcx.dep_graph().with_task(dep_node, tcx, key, query.compute, query.hash_result) + tcx.dep_context().dep_graph().with_task( + dep_node, + tcx, + key, + query.compute, + query.hash_result, + ) } }) }); @@ -624,57 +656,45 @@ where #[inline(never)] fn get_query_impl( tcx: CTX, - state: &QueryState, + state: &QueryState, + cache: &QueryCacheStore, span: Span, key: C::Key, + lookup: QueryLookup, query: &QueryVtable, ) -> C::Stored where CTX: QueryContext, C: QueryCache, - C::Key: crate::dep_graph::DepNodeParams, + C::Key: crate::dep_graph::DepNodeParams, { - try_get_cached( - tcx, - state, - key, - |value, index| { - tcx.dep_graph().read_index(index); - value.clone() - }, - |key, lookup| try_execute_query(tcx, state, span, key, lookup, query), - ) + try_execute_query(tcx, state, cache, span, key, lookup, query) } /// Ensure that either this query has all green inputs or been executed. /// Executing `query::ensure(D)` is considered a read of the dep-node `D`. +/// Returns true if the query should still run. /// /// This function is particularly useful when executing passes for their /// side-effects -- e.g., in order to report errors for erroneous programs. /// /// Note: The optimization is only available during incr. comp. #[inline(never)] -fn ensure_query_impl( - tcx: CTX, - state: &QueryState, - key: C::Key, - query: &QueryVtable, -) where - C: QueryCache, - C::Key: crate::dep_graph::DepNodeParams, +fn ensure_must_run(tcx: CTX, key: &K, query: &QueryVtable) -> bool +where + K: crate::dep_graph::DepNodeParams, CTX: QueryContext, { if query.eval_always { - let _ = get_query_impl(tcx, state, DUMMY_SP, key, query); - return; + return true; } // Ensuring an anonymous query makes no sense assert!(!query.anon); - let dep_node = query.to_dep_node(tcx, &key); + let dep_node = query.to_dep_node(*tcx.dep_context(), key); - match tcx.dep_graph().try_mark_green_and_read(tcx, &dep_node) { + match tcx.dep_context().dep_graph().try_mark_green_and_read(tcx, &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. @@ -682,10 +702,11 @@ fn ensure_query_impl( // 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 _ = get_query_impl(tcx, state, DUMMY_SP, key, query); + true } Some((_, dep_node_index)) => { - tcx.profiler().query_cache_hit(dep_node_index.into()); + tcx.dep_context().profiler().query_cache_hit(dep_node_index.into()); + false } } } @@ -693,68 +714,80 @@ fn ensure_query_impl( #[inline(never)] fn force_query_impl( tcx: CTX, - state: &QueryState, + state: &QueryState, + cache: &QueryCacheStore, key: C::Key, span: Span, dep_node: DepNode, query: &QueryVtable, ) where C: QueryCache, - C::Key: crate::dep_graph::DepNodeParams, + C::Key: crate::dep_graph::DepNodeParams, CTX: QueryContext, { // We may be concurrently trying both execute and force a query. // Ensure that only one of them runs the query. + let cached = cache.cache.lookup(cache, &key, |_, index| { + if unlikely!(tcx.dep_context().profiler().enabled()) { + tcx.dep_context().profiler().query_cache_hit(index.into()); + } + #[cfg(debug_assertions)] + { + cache.cache_hits.fetch_add(1, Ordering::Relaxed); + } + }); - try_get_cached( - tcx, - state, - key, - |_, _| { - // Cache hit, do nothing - }, - |key, lookup| { - let job = match JobOwner::<'_, CTX::DepKind, CTX::Query, C>::try_start( - tcx, state, span, &key, lookup, query, - ) { - TryGetJob::NotYetStarted(job) => job, - TryGetJob::Cycle(_) => return, - #[cfg(parallel_compiler)] - TryGetJob::JobCompleted(_) => return, - }; - force_query_with_job(tcx, key, job, dep_node, query); - }, - ); -} + let lookup = match cached { + Ok(()) => return, + Err(lookup) => lookup, + }; -#[inline(always)] -pub fn get_query(tcx: CTX, span: Span, key: Q::Key) -> Q::Stored -where - Q: QueryDescription, - Q::Key: crate::dep_graph::DepNodeParams, - CTX: QueryContext, -{ - debug!("ty::query::get_query<{}>(key={:?}, span={:?})", Q::NAME, key, span); + let job = match JobOwner::<'_, CTX::DepKind, C>::try_start( + tcx, state, cache, span, &key, lookup, query, + ) { + TryGetJob::NotYetStarted(job) => job, + TryGetJob::Cycle(_) => return, + #[cfg(parallel_compiler)] + TryGetJob::JobCompleted(_) => return, + }; + force_query_with_job(tcx, key, job, dep_node, query); +} - get_query_impl(tcx, Q::query_state(tcx), span, key, &Q::VTABLE) +pub enum QueryMode { + Get, + Ensure, } -#[inline(always)] -pub fn ensure_query(tcx: CTX, key: Q::Key) +pub fn get_query( + tcx: CTX, + span: Span, + key: Q::Key, + lookup: QueryLookup, + mode: QueryMode, +) -> Option where Q: QueryDescription, - Q::Key: crate::dep_graph::DepNodeParams, + Q::Key: crate::dep_graph::DepNodeParams, CTX: QueryContext, { - ensure_query_impl(tcx, Q::query_state(tcx), key, &Q::VTABLE) + let query = &Q::VTABLE; + if let QueryMode::Ensure = mode { + if !ensure_must_run(tcx, &key, query) { + return None; + } + } + + debug!("ty::query::get_query<{}>(key={:?}, span={:?})", Q::NAME, key, span); + let value = + get_query_impl(tcx, Q::query_state(tcx), Q::query_cache(tcx), span, key, lookup, query); + Some(value) } -#[inline(always)] pub fn force_query(tcx: CTX, key: Q::Key, span: Span, dep_node: DepNode) where Q: QueryDescription, - Q::Key: crate::dep_graph::DepNodeParams, + Q::Key: crate::dep_graph::DepNodeParams, CTX: QueryContext, { - force_query_impl(tcx, Q::query_state(tcx), key, span, dep_node, &Q::VTABLE) + force_query_impl(tcx, Q::query_state(tcx), Q::query_cache(tcx), key, span, dep_node, &Q::VTABLE) } diff --git a/compiler/rustc_resolve/Cargo.toml b/compiler/rustc_resolve/Cargo.toml index 821f9ea473..7441f4a9f2 100644 --- a/compiler/rustc_resolve/Cargo.toml +++ b/compiler/rustc_resolve/Cargo.toml @@ -26,4 +26,4 @@ rustc_index = { path = "../rustc_index" } rustc_metadata = { path = "../rustc_metadata" } rustc_session = { path = "../rustc_session" } rustc_span = { path = "../rustc_span" } -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } diff --git a/compiler/rustc_resolve/src/build_reduced_graph.rs b/compiler/rustc_resolve/src/build_reduced_graph.rs index c4ee4df212..d77022a65e 100644 --- a/compiler/rustc_resolve/src/build_reduced_graph.rs +++ b/compiler/rustc_resolve/src/build_reduced_graph.rs @@ -258,16 +258,16 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> { Ok(ty::Visibility::Restricted(DefId::local(CRATE_DEF_INDEX))) } ast::VisibilityKind::Inherited => { - if matches!(self.parent_scope.module.kind, ModuleKind::Def(DefKind::Enum, _, _)) { - // Any inherited visibility resolved directly inside an enum - // (e.g. variants or fields) inherits from the visibility of the enum. - let parent_enum = self.parent_scope.module.def_id().unwrap().expect_local(); - Ok(self.r.visibilities[&parent_enum]) - } else { - // If it's not in an enum, its visibility is restricted to the `mod` item - // that it's defined in. - Ok(ty::Visibility::Restricted(self.parent_scope.module.nearest_parent_mod)) - } + Ok(match self.parent_scope.module.kind { + // Any inherited visibility resolved directly inside an enum or trait + // (i.e. variants, fields, and trait items) inherits from the visibility + // of the enum or trait. + ModuleKind::Def(DefKind::Enum | DefKind::Trait, def_id, _) => { + self.r.visibilities[&def_id.expect_local()] + } + // Otherwise, the visibility is restricted to the nearest parent `mod` item. + _ => ty::Visibility::Restricted(self.parent_scope.module.nearest_parent_mod), + }) } ast::VisibilityKind::Restricted { ref path, id, .. } => { // For visibilities we are not ready to provide correct implementation of "uniform @@ -1230,13 +1230,13 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> { }; let res = Res::Def(DefKind::Macro(ext.macro_kind()), def_id.to_def_id()); + let is_macro_export = self.r.session.contains_name(&item.attrs, sym::macro_export); self.r.macro_map.insert(def_id.to_def_id(), ext); self.r.local_macro_def_scopes.insert(def_id, parent_scope.module); - if macro_rules { + if macro_rules && matches!(item.vis.kind, ast::VisibilityKind::Inherited) { let ident = ident.normalize_to_macros_2_0(); self.r.macro_names.insert(ident); - let is_macro_export = self.r.session.contains_name(&item.attrs, sym::macro_export); let vis = if is_macro_export { ty::Visibility::Public } else { @@ -1261,6 +1261,11 @@ impl<'a, 'b> BuildReducedGraphVisitor<'a, 'b> { }), )) } else { + if is_macro_export { + let what = if macro_rules { "`macro_rules` with `pub`" } else { "`macro` items" }; + let msg = format!("`#[macro_export]` cannot be used on {what}"); + self.r.session.span_err(item.span, &msg); + } let module = parent_scope.module; let vis = match item.kind { // Visibilities must not be resolved non-speculatively twice @@ -1365,58 +1370,40 @@ impl<'a, 'b> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b> { return; } + let vis = self.resolve_visibility(&item.vis); let local_def_id = self.r.local_def_id(item.id); let def_id = local_def_id.to_def_id(); - let vis = match ctxt { - AssocCtxt::Trait => { - let (def_kind, ns) = match item.kind { - AssocItemKind::Const(..) => (DefKind::AssocConst, ValueNS), - AssocItemKind::Fn(box FnKind(_, ref sig, _, _)) => { - if sig.decl.has_self() { - self.r.has_self.insert(def_id); - } - (DefKind::AssocFn, ValueNS) - } - AssocItemKind::TyAlias(..) => (DefKind::AssocTy, TypeNS), - AssocItemKind::MacCall(_) => bug!(), // handled above - }; - let parent = self.parent_scope.module; - let expansion = self.parent_scope.expansion; - let res = Res::Def(def_kind, def_id); - // Trait item visibility is inherited from its trait when not specified explicitly. - let vis = match &item.vis.kind { - ast::VisibilityKind::Inherited => { - self.r.visibilities[&parent.def_id().unwrap().expect_local()] + if !(ctxt == AssocCtxt::Impl + && matches!(item.vis.kind, ast::VisibilityKind::Inherited) + && self + .r + .trait_impl_items + .contains(&ty::DefIdTree::parent(&*self.r, def_id).unwrap().expect_local())) + { + // Trait impl item visibility is inherited from its trait when not specified + // explicitly. In that case we cannot determine it here in early resolve, + // so we leave a hole in the visibility table to be filled later. + self.r.visibilities.insert(local_def_id, vis); + } + + if ctxt == AssocCtxt::Trait { + let (def_kind, ns) = match item.kind { + AssocItemKind::Const(..) => (DefKind::AssocConst, ValueNS), + AssocItemKind::Fn(box FnKind(_, ref sig, _, _)) => { + if sig.decl.has_self() { + self.r.has_self.insert(def_id); } - _ => self.resolve_visibility(&item.vis), - }; - // FIXME: For historical reasons the binding visibility is set to public, - // use actual visibility here instead, using enum variants as an example. - let vis_hack = ty::Visibility::Public; - self.r.define(parent, item.ident, ns, (res, vis_hack, item.span, expansion)); - Some(vis) - } - AssocCtxt::Impl => { - // Trait impl item visibility is inherited from its trait when not specified - // explicitly. In that case we cannot determine it here in early resolve, - // so we leave a hole in the visibility table to be filled later. - // Inherent impl item visibility is never inherited from other items. - if matches!(item.vis.kind, ast::VisibilityKind::Inherited) - && self - .r - .trait_impl_items - .contains(&ty::DefIdTree::parent(&*self.r, def_id).unwrap().expect_local()) - { - None - } else { - Some(self.resolve_visibility(&item.vis)) + (DefKind::AssocFn, ValueNS) } - } - }; + AssocItemKind::TyAlias(..) => (DefKind::AssocTy, TypeNS), + AssocItemKind::MacCall(_) => bug!(), // handled above + }; - if let Some(vis) = vis { - self.r.visibilities.insert(local_def_id, vis); + let parent = self.parent_scope.module; + let expansion = self.parent_scope.expansion; + let res = Res::Def(def_kind, def_id); + self.r.define(parent, item.ident, ns, (res, vis, item.span, expansion)); } visit::walk_assoc_item(self, item, ctxt); @@ -1439,19 +1426,19 @@ impl<'a, 'b> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b> { } } - fn visit_field(&mut self, f: &'b ast::Field) { + fn visit_expr_field(&mut self, f: &'b ast::ExprField) { if f.is_placeholder { self.visit_invoc(f.id); } else { - visit::walk_field(self, f); + visit::walk_expr_field(self, f); } } - fn visit_field_pattern(&mut self, fp: &'b ast::FieldPat) { + fn visit_pat_field(&mut self, fp: &'b ast::PatField) { if fp.is_placeholder { self.visit_invoc(fp.id); } else { - visit::walk_field_pattern(self, fp); + visit::walk_pat_field(self, fp); } } @@ -1471,13 +1458,13 @@ impl<'a, 'b> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b> { } } - fn visit_struct_field(&mut self, sf: &'b ast::StructField) { + fn visit_field_def(&mut self, sf: &'b ast::FieldDef) { if sf.is_placeholder { self.visit_invoc(sf.id); } else { let vis = self.resolve_visibility(&sf.vis); self.r.visibilities.insert(self.r.local_def_id(sf.id), vis); - visit::walk_struct_field(self, sf); + visit::walk_field_def(self, sf); } } @@ -1490,19 +1477,13 @@ impl<'a, 'b> Visitor<'b> for BuildReducedGraphVisitor<'a, 'b> { } let parent = self.parent_scope.module; - let vis = match variant.vis.kind { - // Variant visibility is inherited from its enum when not specified explicitly. - ast::VisibilityKind::Inherited => { - self.r.visibilities[&parent.def_id().unwrap().expect_local()] - } - _ => self.resolve_visibility(&variant.vis), - }; let expn_id = self.parent_scope.expansion; let ident = variant.ident; // Define a name in the type namespace. let def_id = self.r.local_def_id(variant.id); let res = Res::Def(DefKind::Variant, def_id.to_def_id()); + let vis = self.resolve_visibility(&variant.vis); self.r.define(parent, ident, TypeNS, (res, vis, variant.span, expn_id)); self.r.visibilities.insert(def_id, vis); diff --git a/compiler/rustc_resolve/src/def_collector.rs b/compiler/rustc_resolve/src/def_collector.rs index 727d6ab53d..17f0c39e39 100644 --- a/compiler/rustc_resolve/src/def_collector.rs +++ b/compiler/rustc_resolve/src/def_collector.rs @@ -1,4 +1,4 @@ -use crate::Resolver; +use crate::{ImplTraitContext, Resolver}; use rustc_ast::visit::{self, FnKind}; use rustc_ast::walk_list; use rustc_ast::*; @@ -16,14 +16,15 @@ crate fn collect_definitions( fragment: &AstFragment, expansion: ExpnId, ) { - let parent_def = resolver.invocation_parents[&expansion]; - fragment.visit_with(&mut DefCollector { resolver, parent_def, expansion }); + let (parent_def, impl_trait_context) = resolver.invocation_parents[&expansion]; + fragment.visit_with(&mut DefCollector { resolver, parent_def, expansion, impl_trait_context }); } /// Creates `DefId`s for nodes in the AST. struct DefCollector<'a, 'b> { resolver: &'a mut Resolver<'b>, parent_def: LocalDefId, + impl_trait_context: ImplTraitContext, expansion: ExpnId, } @@ -40,7 +41,17 @@ impl<'a, 'b> DefCollector<'a, 'b> { self.parent_def = orig_parent_def; } - fn collect_field(&mut self, field: &'a StructField, index: Option) { + fn with_impl_trait( + &mut self, + impl_trait_context: ImplTraitContext, + f: F, + ) { + let orig_itc = std::mem::replace(&mut self.impl_trait_context, impl_trait_context); + f(self); + self.impl_trait_context = orig_itc; + } + + fn collect_field(&mut self, field: &'a FieldDef, index: Option) { let index = |this: &Self| { index.unwrap_or_else(|| { let node_id = NodeId::placeholder_from_expn_id(this.expansion); @@ -55,13 +66,14 @@ impl<'a, 'b> DefCollector<'a, 'b> { } else { let name = field.ident.map_or_else(|| sym::integer(index(self)), |ident| ident.name); let def = self.create_def(field.id, DefPathData::ValueNs(name), field.span); - self.with_parent(def, |this| visit::walk_struct_field(this, field)); + self.with_parent(def, |this| visit::walk_field_def(this, field)); } } fn visit_macro_invoc(&mut self, id: NodeId) { + let id = id.placeholder_to_expn_id(); let old_parent = - self.resolver.invocation_parents.insert(id.placeholder_to_expn_id(), self.parent_def); + self.resolver.invocation_parents.insert(id, (self.parent_def, self.impl_trait_context)); assert!(old_parent.is_none(), "parent `LocalDefId` is reset for an invocation"); } } @@ -103,29 +115,37 @@ impl<'a, 'b> visit::Visitor<'a> for DefCollector<'a, 'b> { let def = self.create_def(i.id, def_data, i.span); self.with_parent(def, |this| { - match i.kind { - ItemKind::Struct(ref struct_def, _) | ItemKind::Union(ref struct_def, _) => { - // If this is a unit or tuple-like struct, register the constructor. - if let Some(ctor_hir_id) = struct_def.ctor_id() { - this.create_def(ctor_hir_id, DefPathData::Ctor, i.span); + this.with_impl_trait(ImplTraitContext::Existential, |this| { + match i.kind { + ItemKind::Struct(ref struct_def, _) | ItemKind::Union(ref struct_def, _) => { + // If this is a unit or tuple-like struct, register the constructor. + if let Some(ctor_hir_id) = struct_def.ctor_id() { + this.create_def(ctor_hir_id, DefPathData::Ctor, i.span); + } } + _ => {} } - _ => {} - } - visit::walk_item(this, i); + visit::walk_item(this, i); + }) }); } fn visit_fn(&mut self, fn_kind: FnKind<'a>, span: Span, _: NodeId) { if let FnKind::Fn(_, _, sig, _, body) = fn_kind { if let Async::Yes { closure_id, return_impl_trait_id, .. } = sig.header.asyncness { - self.create_def(return_impl_trait_id, DefPathData::ImplTrait, span); + let return_impl_trait_id = + self.create_def(return_impl_trait_id, DefPathData::ImplTrait, span); // For async functions, we need to create their inner defs inside of a // closure to match their desugared representation. Besides that, // we must mirror everything that `visit::walk_fn` below does. self.visit_fn_header(&sig.header); - visit::walk_fn_decl(self, &sig.decl); + for param in &sig.decl.inputs { + self.visit_param(param); + } + self.with_parent(return_impl_trait_id, |this| { + this.visit_fn_ret_ty(&sig.decl.output) + }); let closure_def = self.create_def(closure_id, DefPathData::ClosureExpr, span); self.with_parent(closure_def, |this| walk_list!(this, visit_block, body)); return; @@ -137,6 +157,14 @@ impl<'a, 'b> visit::Visitor<'a> for DefCollector<'a, 'b> { fn visit_use_tree(&mut self, use_tree: &'a UseTree, id: NodeId, _nested: bool) { self.create_def(id, DefPathData::Misc, use_tree.span); + match use_tree.kind { + UseTreeKind::Simple(_, id1, id2) => { + self.create_def(id1, DefPathData::Misc, use_tree.prefix.span); + self.create_def(id2, DefPathData::Misc, use_tree.prefix.span); + } + UseTreeKind::Glob => (), + UseTreeKind::Nested(..) => {} + } visit::walk_use_tree(self, use_tree, id); } @@ -191,7 +219,15 @@ impl<'a, 'b> visit::Visitor<'a> for DefCollector<'a, 'b> { }; self.create_def(param.id, def_path_data, param.ident.span); - visit::walk_generic_param(self, param); + // impl-Trait can happen inside generic parameters, like + // ``` + // fn foo>() {} + // ``` + // + // In that case, the impl-trait is lowered as an additional generic parameter. + self.with_impl_trait(ImplTraitContext::Universal(self.parent_def), |this| { + visit::walk_generic_param(this, param) + }); } fn visit_assoc_item(&mut self, i: &'a AssocItem, ctxt: visit::AssocCtxt) { @@ -244,8 +280,19 @@ impl<'a, 'b> visit::Visitor<'a> for DefCollector<'a, 'b> { match ty.kind { TyKind::MacCall(..) => self.visit_macro_invoc(ty.id), TyKind::ImplTrait(node_id, _) => { - let parent_def = self.create_def(node_id, DefPathData::ImplTrait, ty.span); - self.with_parent(parent_def, |this| visit::walk_ty(this, ty)); + let parent_def = match self.impl_trait_context { + ImplTraitContext::Universal(item_def) => self.resolver.create_def( + item_def, + node_id, + DefPathData::ImplTrait, + self.expansion, + ty.span, + ), + ImplTraitContext::Existential => { + self.create_def(node_id, DefPathData::ImplTrait, ty.span) + } + }; + self.with_parent(parent_def, |this| visit::walk_ty(this, ty)) } _ => visit::walk_ty(self, ty), } @@ -262,25 +309,35 @@ impl<'a, 'b> visit::Visitor<'a> for DefCollector<'a, 'b> { if arm.is_placeholder { self.visit_macro_invoc(arm.id) } else { visit::walk_arm(self, arm) } } - fn visit_field(&mut self, f: &'a Field) { - if f.is_placeholder { self.visit_macro_invoc(f.id) } else { visit::walk_field(self, f) } + fn visit_expr_field(&mut self, f: &'a ExprField) { + if f.is_placeholder { + self.visit_macro_invoc(f.id) + } else { + visit::walk_expr_field(self, f) + } } - fn visit_field_pattern(&mut self, fp: &'a FieldPat) { + fn visit_pat_field(&mut self, fp: &'a PatField) { if fp.is_placeholder { self.visit_macro_invoc(fp.id) } else { - visit::walk_field_pattern(self, fp) + visit::walk_pat_field(self, fp) } } fn visit_param(&mut self, p: &'a Param) { - if p.is_placeholder { self.visit_macro_invoc(p.id) } else { visit::walk_param(self, p) } + if p.is_placeholder { + self.visit_macro_invoc(p.id) + } else { + self.with_impl_trait(ImplTraitContext::Universal(self.parent_def), |this| { + visit::walk_param(this, p) + }) + } } // This method is called only when we are visiting an individual field // after expanding an attribute on it. - fn visit_struct_field(&mut self, field: &'a StructField) { + fn visit_field_def(&mut self, field: &'a FieldDef) { self.collect_field(field, None); } } diff --git a/compiler/rustc_resolve/src/diagnostics.rs b/compiler/rustc_resolve/src/diagnostics.rs index 3b02f74f2c..7493fd6850 100644 --- a/compiler/rustc_resolve/src/diagnostics.rs +++ b/compiler/rustc_resolve/src/diagnostics.rs @@ -9,6 +9,7 @@ use rustc_feature::BUILTIN_ATTRIBUTES; use rustc_hir::def::Namespace::{self, *}; use rustc_hir::def::{self, CtorKind, CtorOf, DefKind, NonMacroAttrKind}; use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX, LOCAL_CRATE}; +use rustc_hir::PrimTy; use rustc_middle::bug; use rustc_middle::ty::{self, DefIdTree}; use rustc_session::Session; @@ -718,10 +719,9 @@ impl<'a> Resolver<'a> { } } Scope::BuiltinTypes => { - let primitive_types = &this.primitive_type_table.primitive_types; - suggestions.extend(primitive_types.iter().flat_map(|(name, prim_ty)| { + suggestions.extend(PrimTy::ALL.iter().filter_map(|prim_ty| { let res = Res::PrimTy(*prim_ty); - filter_fn(res).then_some(TypoSuggestion::from_res(*name, res)) + filter_fn(res).then_some(TypoSuggestion::from_res(prim_ty.name(), res)) })) } } diff --git a/compiler/rustc_resolve/src/imports.rs b/compiler/rustc_resolve/src/imports.rs index cb1f0834ce..61f4c00a4c 100644 --- a/compiler/rustc_resolve/src/imports.rs +++ b/compiler/rustc_resolve/src/imports.rs @@ -18,11 +18,10 @@ use rustc_errors::{pluralize, struct_span_err, Applicability}; use rustc_hir::def::{self, PartialRes}; use rustc_hir::def_id::DefId; use rustc_middle::hir::exports::Export; +use rustc_middle::span_bug; use rustc_middle::ty; -use rustc_middle::{bug, span_bug}; use rustc_session::lint::builtin::{PUB_USE_OF_PRIVATE_EXTERN_CRATE, UNUSED_IMPORTS}; use rustc_session::lint::BuiltinLintDiagnostics; -use rustc_session::DiagnosticMessageId; use rustc_span::hygiene::ExpnId; use rustc_span::lev_distance::find_best_match_for_name; use rustc_span::symbol::{kw, Ident, Symbol}; @@ -157,6 +156,21 @@ impl<'a> NameResolution<'a> { } } +// Reexports of the form `pub use foo as bar;` where `foo` is `extern crate foo;` +// are permitted for backward-compatibility under a deprecation lint. +fn pub_use_of_private_extern_crate_hack(import: &Import<'_>, binding: &NameBinding<'_>) -> bool { + match (&import.kind, &binding.kind) { + ( + ImportKind::Single { .. }, + NameBindingKind::Import { + import: Import { kind: ImportKind::ExternCrate { .. }, .. }, + .. + }, + ) => import.vis.get() == ty::Visibility::Public, + _ => false, + } +} + impl<'a> Resolver<'a> { crate fn resolve_ident_in_module_unadjusted( &mut self, @@ -264,10 +278,7 @@ impl<'a> Resolver<'a> { return Err((Determined, Weak::No)); } } - // `extern crate` are always usable for backwards compatibility, see issue #37020, - // remove this together with `PUB_USE_OF_PRIVATE_EXTERN_CRATE`. - let usable = this.is_accessible_from(binding.vis, parent_scope.module) - || binding.is_extern_crate(); + let usable = this.is_accessible_from(binding.vis, parent_scope.module); if usable { Ok(binding) } else { Err((Determined, Weak::No)) } }; @@ -310,10 +321,7 @@ impl<'a> Resolver<'a> { } } - if !(self.is_accessible_from(binding.vis, parent_scope.module) || - // Remove this together with `PUB_USE_OF_PRIVATE_EXTERN_CRATE` - (self.last_import_segment && binding.is_extern_crate())) - { + if !self.is_accessible_from(binding.vis, parent_scope.module) { self.privacy_errors.push(PrivacyError { ident, binding, @@ -456,13 +464,12 @@ impl<'a> Resolver<'a> { binding: &'a NameBinding<'a>, import: &'a Import<'a>, ) -> &'a NameBinding<'a> { - let vis = if binding.pseudo_vis().is_at_least(import.vis.get(), self) || - // cf. `PUB_USE_OF_PRIVATE_EXTERN_CRATE` - !import.is_glob() && binding.is_extern_crate() + let vis = if binding.vis.is_at_least(import.vis.get(), self) + || pub_use_of_private_extern_crate_hack(import, binding) { import.vis.get() } else { - binding.pseudo_vis() + binding.vis }; if let ImportKind::Glob { ref max_vis, .. } = import.kind { @@ -1178,7 +1185,7 @@ impl<'a, 'b> ImportResolver<'a, 'b> { self.r.per_ns(|this, ns| { if let Ok(binding) = source_bindings[ns].get() { let vis = import.vis.get(); - if !binding.pseudo_vis().is_at_least(vis, &*this) { + if !binding.vis.is_at_least(vis, &*this) { reexport_error = Some((ns, binding)); } else { any_successful_reexport = true; @@ -1189,7 +1196,7 @@ impl<'a, 'b> ImportResolver<'a, 'b> { // All namespaces must be re-exported with extra visibility for an error to occur. if !any_successful_reexport { let (ns, binding) = reexport_error.unwrap(); - if ns == TypeNS && binding.is_extern_crate() { + if pub_use_of_private_extern_crate_hack(import, binding) { let msg = format!( "extern crate `{}` is private, and cannot be \ re-exported (error E0365), consider declaring with \ @@ -1362,7 +1369,7 @@ impl<'a, 'b> ImportResolver<'a, 'b> { Some(None) => import.parent_scope.module, None => continue, }; - if self.r.is_accessible_from(binding.pseudo_vis(), scope) { + if self.r.is_accessible_from(binding.vis, scope) { let imported_binding = self.r.import(binding, import); let _ = self.r.try_define(import.parent_scope.module, key, imported_binding); } @@ -1380,9 +1387,8 @@ impl<'a, 'b> ImportResolver<'a, 'b> { let mut reexports = Vec::new(); - module.for_each_child(self.r, |this, ident, ns, binding| { - // Filter away ambiguous imports and anything that has def-site - // hygiene. + module.for_each_child(self.r, |this, ident, _, binding| { + // Filter away ambiguous imports and anything that has def-site hygiene. // FIXME: Implement actual cross-crate hygiene. let is_good_import = binding.is_import() && !binding.is_ambiguity() && !ident.span.from_expansion(); @@ -1392,71 +1398,6 @@ impl<'a, 'b> ImportResolver<'a, 'b> { reexports.push(Export { ident, res, span: binding.span, vis: binding.vis }); } } - - if let NameBindingKind::Import { binding: orig_binding, import, .. } = binding.kind { - if ns == TypeNS - && orig_binding.is_variant() - && !orig_binding.vis.is_at_least(binding.vis, &*this) - { - let msg = match import.kind { - ImportKind::Single { .. } => { - format!("variant `{}` is private and cannot be re-exported", ident) - } - ImportKind::Glob { .. } => { - let msg = "enum is private and its variants \ - cannot be re-exported" - .to_owned(); - let error_id = ( - DiagnosticMessageId::ErrorId(0), // no code?! - Some(binding.span), - msg.clone(), - ); - let fresh = - this.session.one_time_diagnostics.borrow_mut().insert(error_id); - if !fresh { - return; - } - msg - } - ref s => bug!("unexpected import kind {:?}", s), - }; - let mut err = this.session.struct_span_err(binding.span, &msg); - - let imported_module = match import.imported_module.get() { - Some(ModuleOrUniformRoot::Module(module)) => module, - _ => bug!("module should exist"), - }; - let parent_module = imported_module.parent.expect("parent should exist"); - let resolutions = this.resolutions(parent_module).borrow(); - let enum_path_segment_index = import.module_path.len() - 1; - let enum_ident = import.module_path[enum_path_segment_index].ident; - - let key = this.new_key(enum_ident, TypeNS); - let enum_resolution = resolutions.get(&key).expect("resolution should exist"); - let enum_span = - enum_resolution.borrow().binding.expect("binding should exist").span; - let enum_def_span = this.session.source_map().guess_head_span(enum_span); - let enum_def_snippet = this - .session - .source_map() - .span_to_snippet(enum_def_span) - .expect("snippet should exist"); - // potentially need to strip extant `crate`/`pub(path)` for suggestion - let after_vis_index = enum_def_snippet - .find("enum") - .expect("`enum` keyword should exist in snippet"); - let suggestion = format!("pub {}", &enum_def_snippet[after_vis_index..]); - - this.session.diag_span_suggestion_once( - &mut err, - DiagnosticMessageId::ErrorId(0), - enum_def_span, - "consider making the enum public", - suggestion, - ); - err.emit(); - } - } }); if !reexports.is_empty() { diff --git a/compiler/rustc_resolve/src/late.rs b/compiler/rustc_resolve/src/late.rs index e5d6aebe97..af241ef8af 100644 --- a/compiler/rustc_resolve/src/late.rs +++ b/compiler/rustc_resolve/src/late.rs @@ -20,7 +20,7 @@ use rustc_errors::DiagnosticId; use rustc_hir::def::Namespace::{self, *}; use rustc_hir::def::{self, CtorKind, DefKind, PartialRes, PerNS}; use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX}; -use rustc_hir::TraitCandidate; +use rustc_hir::{PrimTy, TraitCandidate}; use rustc_middle::{bug, span_bug}; use rustc_session::lint; use rustc_span::symbol::{kw, sym, Ident, Symbol}; @@ -1023,7 +1023,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { }); } - ItemKind::Mod(_) | ItemKind::ForeignMod(_) => { + ItemKind::Mod(..) | ItemKind::ForeignMod(_) => { self.with_scope(item.id, |this| { visit::walk_item(this, item); }); @@ -1926,7 +1926,7 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { self.r.trait_map.insert(id, traits); } - if self.r.primitive_type_table.primitive_types.contains_key(&path[0].ident.name) { + if PrimTy::from_name(path[0].ident.name).is_some() { let mut std_path = Vec::with_capacity(1 + path.len()); std_path.push(Segment::from_ident(Ident::with_dummy_span(sym::std))); @@ -2120,13 +2120,9 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { // The same fallback is used when `a` resolves to nothing. PathResult::Module(ModuleOrUniformRoot::Module(_)) | PathResult::Failed { .. } if (ns == TypeNS || path.len() > 1) - && self - .r - .primitive_type_table - .primitive_types - .contains_key(&path[0].ident.name) => + && PrimTy::from_name(path[0].ident.name).is_some() => { - let prim = self.r.primitive_type_table.primitive_types[&path[0].ident.name]; + let prim = PrimTy::from_name(path[0].ident.name).unwrap(); PartialRes::with_unresolved_segments(Res::PrimTy(prim), path.len() - 1) } PathResult::Module(ModuleOrUniformRoot::Module(module)) => { @@ -2255,8 +2251,8 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { visit::walk_expr(self, expr); } - ExprKind::Struct(ref path, ..) => { - self.smart_resolve_path(expr.id, None, path, PathSource::Struct); + ExprKind::Struct(ref se) => { + self.smart_resolve_path(expr.id, None, &se.path, PathSource::Struct); visit::walk_expr(self, expr); } @@ -2330,8 +2326,22 @@ impl<'a: 'ast, 'b, 'ast> LateResolutionVisitor<'a, 'b, 'ast> { ExprKind::Call(ref callee, ref arguments) => { self.resolve_expr(callee, Some(expr)); - for argument in arguments { - self.resolve_expr(argument, None); + let const_args = self.r.legacy_const_generic_args(callee).unwrap_or(Vec::new()); + for (idx, argument) in arguments.iter().enumerate() { + // Constant arguments need to be treated as AnonConst since + // that is how they will be later lowered to HIR. + if const_args.contains(&idx) { + self.with_constant_rib( + IsRepeatExpr::No, + argument.is_potential_trivial_const_param(), + None, + |this| { + this.resolve_expr(argument, None); + }, + ); + } else { + self.resolve_expr(argument, None); + } } } ExprKind::Type(ref type_expr, ref ty) => { diff --git a/compiler/rustc_resolve/src/late/diagnostics.rs b/compiler/rustc_resolve/src/late/diagnostics.rs index 927535b72b..e85d78db22 100644 --- a/compiler/rustc_resolve/src/late/diagnostics.rs +++ b/compiler/rustc_resolve/src/late/diagnostics.rs @@ -16,6 +16,7 @@ use rustc_hir::def::{self, CtorKind, CtorOf, DefKind}; use rustc_hir::def_id::{DefId, CRATE_DEF_INDEX, LOCAL_CRATE}; use rustc_hir::PrimTy; use rustc_session::parse::feature_err; +use rustc_span::edition::Edition; use rustc_span::hygiene::MacroKind; use rustc_span::lev_distance::find_best_match_for_name; use rustc_span::symbol::{kw, sym, Ident, Symbol}; @@ -133,7 +134,7 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> { let is_enum_variant = &|res| matches!(res, Res::Def(DefKind::Variant, _)); // Make the base error. - let expected = source.descr_expected(); + let mut expected = source.descr_expected(); let path_str = Segment::names_to_string(path); let item_str = path.last().unwrap().ident; let (base_msg, fallback_label, base_span, could_be_expr) = if let Some(res) = res { @@ -166,6 +167,15 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> { let (mod_prefix, mod_str) = if path.len() == 1 { (String::new(), "this scope".to_string()) } else if path.len() == 2 && path[0].ident.name == kw::PathRoot { + if self.r.session.edition() > Edition::Edition2015 { + // In edition 2018 onwards, the `::foo` syntax may only pull from the extern prelude + // which overrides all other expectations of item type + expected = "crate"; + (String::new(), "the list of imported crates".to_string()) + } else { + (String::new(), "the crate root".to_string()) + } + } else if path.len() == 2 && path[0].ident.name == kw::Crate { (String::new(), "the crate root".to_string()) } else { let mod_path = &path[..path.len() - 1]; @@ -319,9 +329,13 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> { .collect::>(); let crate_def_id = DefId::local(CRATE_DEF_INDEX); if candidates.is_empty() && is_expected(Res::Def(DefKind::Enum, crate_def_id)) { - let enum_candidates = - self.r.lookup_import_candidates(ident, ns, &self.parent_scope, is_enum_variant); - + let mut enum_candidates: Vec<_> = self + .r + .lookup_import_candidates(ident, ns, &self.parent_scope, is_enum_variant) + .into_iter() + .map(|suggestion| import_candidate_to_enum_paths(&suggestion)) + .filter(|(_, enum_ty_path)| !enum_ty_path.starts_with("std::prelude::")) + .collect(); if !enum_candidates.is_empty() { if let (PathSource::Type, Some(span)) = (source, self.diagnostic_metadata.current_type_ascription.last()) @@ -340,10 +354,6 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> { } } - let mut enum_candidates = enum_candidates - .iter() - .map(|suggestion| import_candidate_to_enum_paths(&suggestion)) - .collect::>(); enum_candidates.sort(); // Contextualize for E0412 "cannot find type", but don't belabor the point @@ -363,19 +373,7 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> { err.span_suggestions( span, &msg, - enum_candidates - .into_iter() - .map(|(_variant_path, enum_ty_path)| enum_ty_path) - // Variants re-exported in prelude doesn't mean `prelude::v1` is the - // type name! - // FIXME: is there a more principled way to do this that - // would work for other re-exports? - .filter(|enum_ty_path| enum_ty_path != "std::prelude::v1") - // Also write `Option` rather than `std::prelude::v1::Option`. - .map(|enum_ty_path| { - // FIXME #56861: DRY-er prelude filtering. - enum_ty_path.trim_start_matches("std::prelude::v1::").to_owned() - }), + enum_candidates.into_iter().map(|(_variant_path, enum_ty_path)| enum_ty_path), Applicability::MachineApplicable, ); } @@ -565,6 +563,15 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> { } } } + } else if err_code == &rustc_errors::error_code!(E0412) { + if let Some(correct) = Self::likely_rust_type(path) { + err.span_suggestion( + span, + "perhaps you intended to use this type", + correct.to_string(), + Applicability::MaybeIncorrect, + ); + } } } @@ -1105,7 +1112,7 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> { } if let Some(items) = self.diagnostic_metadata.current_trait_assoc_items { - for assoc_item in &items[..] { + for assoc_item in items { if assoc_item.ident == ident { return Some(match &assoc_item.kind { ast::AssocItemKind::Const(..) => AssocSuggestion::AssocConst, @@ -1212,8 +1219,8 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> { // Add primitive types to the mix if filter_fn(Res::PrimTy(PrimTy::Bool)) { names.extend( - self.r.primitive_type_table.primitive_types.iter().map(|(name, prim_ty)| { - TypoSuggestion::from_res(*name, Res::PrimTy(*prim_ty)) + PrimTy::ALL.iter().map(|prim_ty| { + TypoSuggestion::from_res(prim_ty.name(), Res::PrimTy(*prim_ty)) }), ) } @@ -1245,6 +1252,23 @@ impl<'a: 'ast, 'ast> LateResolutionVisitor<'a, '_, 'ast> { } } + // Returns the name of the Rust type approximately corresponding to + // a type name in another programming language. + fn likely_rust_type(path: &[Segment]) -> Option { + let name = path[path.len() - 1].ident.as_str(); + // Common Java types + Some(match &*name { + "byte" => sym::u8, // In Java, bytes are signed, but in practice one almost always wants unsigned bytes. + "short" => sym::i16, + "boolean" => sym::bool, + "int" => sym::i32, + "long" => sym::i64, + "float" => sym::f32, + "double" => sym::f64, + _ => return None, + }) + } + /// Only used in a specific case of type ascription suggestions fn get_colon_suggestion_span(&self, start: Span) -> Span { let sm = self.r.session.source_map(); @@ -1657,6 +1681,7 @@ impl<'tcx> LifetimeContext<'_, 'tcx> { ); err.span_label(lifetime_ref.span, "undeclared lifetime"); let mut suggests_in_band = false; + let mut suggest_note = true; for missing in &self.missing_named_lifetime_spots { match missing { MissingLifetimeSpot::Generics(generics) => { @@ -1676,12 +1701,24 @@ impl<'tcx> LifetimeContext<'_, 'tcx> { suggests_in_band = true; (generics.span, format!("<{}>", lifetime_ref)) }; - err.span_suggestion( - span, - &format!("consider introducing lifetime `{}` here", lifetime_ref), - sugg, - Applicability::MaybeIncorrect, - ); + if !span.from_expansion() { + err.span_suggestion( + span, + &format!("consider introducing lifetime `{}` here", lifetime_ref), + sugg, + Applicability::MaybeIncorrect, + ); + } else if suggest_note { + suggest_note = false; // Avoid displaying the same help multiple times. + err.span_label( + span, + &format!( + "lifetime `{}` is missing in item created through this procedural \ + macro", + lifetime_ref, + ), + ); + } } MissingLifetimeSpot::HigherRanked { span, span_type } => { err.span_suggestion( @@ -1696,7 +1733,7 @@ impl<'tcx> LifetimeContext<'_, 'tcx> { ); err.note( "for more information on higher-ranked polymorphism, visit \ - https://doc.rust-lang.org/nomicon/hrtb.html", + https://doc.rust-lang.org/nomicon/hrtb.html", ); } _ => {} @@ -1708,7 +1745,7 @@ impl<'tcx> LifetimeContext<'_, 'tcx> { { err.help( "if you want to experiment with in-band lifetime bindings, \ - add `#![feature(in_band_lifetimes)]` to the crate attributes", + add `#![feature(in_band_lifetimes)]` to the crate attributes", ); } err.emit(); diff --git a/compiler/rustc_resolve/src/late/lifetimes.rs b/compiler/rustc_resolve/src/late/lifetimes.rs index 0bab33976b..2c61c0963a 100644 --- a/compiler/rustc_resolve/src/late/lifetimes.rs +++ b/compiler/rustc_resolve/src/late/lifetimes.rs @@ -540,7 +540,7 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> { self.missing_named_lifetime_spots.pop(); self.is_in_fn_syntax = was_in_fn_syntax; } - hir::TyKind::TraitObject(bounds, ref lifetime) => { + hir::TyKind::TraitObject(bounds, ref lifetime, _) => { debug!("visit_ty: TraitObject(bounds={:?}, lifetime={:?})", bounds, lifetime); for bound in bounds { self.visit_poly_trait_ref(bound, hir::TraitBoundModifier::None); @@ -587,7 +587,7 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> { // `type MyAnonTy<'b> = impl MyTrait<'b>;` // ^ ^ this gets resolved in the scope of // the opaque_ty generics - let opaque_ty = self.tcx.hir().expect_item(item_id.id); + let opaque_ty = self.tcx.hir().item(item_id); let (generics, bounds) = match opaque_ty.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. @@ -632,20 +632,32 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> { let hir_id = self.tcx.hir().local_def_id_to_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().krate(); - - if !(krate.items.contains_key(&parent_id) - || krate.impl_items.contains_key(&parent_impl_id) - || krate.trait_items.contains_key(&parent_trait_id)) + let parent_is_item = if let Some(parent_def_id) = + parent_id.as_owner() { + let parent_item_id = hir::ItemId { def_id: parent_def_id }; + let parent_impl_id = hir::ImplItemId { def_id: parent_def_id }; + let parent_trait_id = + hir::TraitItemId { def_id: parent_def_id }; + let parent_foreign_id = + hir::ForeignItemId { def_id: parent_def_id }; + let krate = self.tcx.hir().krate(); + + krate.items.contains_key(&parent_item_id) + || krate.impl_items.contains_key(&parent_impl_id) + || krate.trait_items.contains_key(&parent_trait_id) + || krate.foreign_items.contains_key(&parent_foreign_id) + } else { + false + }; + + if !parent_is_item { struct_span_err!( self.tcx.sess, lifetime.span, E0657, "`impl Trait` can only capture lifetimes \ - bound at the fn or impl level" + bound at the fn or impl level" ) .emit(); self.uninsert_lifetime_on_error(lifetime, def.unwrap()); @@ -738,7 +750,7 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> { self.missing_named_lifetime_spots.push((&trait_item.generics).into()); let tcx = self.tcx; self.visit_early_late( - Some(tcx.hir().get_parent_item(trait_item.hir_id)), + Some(tcx.hir().get_parent_item(trait_item.hir_id())), &sig.decl, &trait_item.generics, |this| intravisit::walk_trait_item(this, trait_item), @@ -800,7 +812,7 @@ impl<'a, 'tcx> Visitor<'tcx> for LifetimeContext<'a, 'tcx> { self.missing_named_lifetime_spots.push((&impl_item.generics).into()); let tcx = self.tcx; self.visit_early_late( - Some(tcx.hir().get_parent_item(impl_item.hir_id)), + Some(tcx.hir().get_parent_item(impl_item.hir_id())), &sig.decl, &impl_item.generics, |this| intravisit::walk_impl_item(this, impl_item), @@ -1227,7 +1239,8 @@ fn compute_object_lifetime_defaults(tcx: TyCtxt<'_>) -> HirIdMap) -> HirIdMap {} } @@ -1959,7 +1972,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { // 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 object_lifetime_defaults = type_def_id.map_or_else(Vec::new, |def_id| { let in_body = { let mut scope = self.scope; loop { @@ -2111,7 +2124,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { 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); + trait_items.iter().find(|ti| ti.id.hir_id() == parent).map(|ti| ti.kind); } match *m { hir::TraitFn::Required(_) => None, @@ -2125,7 +2138,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { { impl_self = Some(self_ty); assoc_item_kind = - items.iter().find(|ii| ii.id.hir_id == parent).map(|ii| ii.kind); + items.iter().find(|ii| ii.id.hir_id() == parent).map(|ii| ii.kind); } Some(body) } @@ -2286,7 +2299,7 @@ impl<'a, 'tcx> LifetimeContext<'a, 'tcx> { self.outer_index.shift_in(1); } match ty.kind { - hir::TyKind::TraitObject(bounds, ref lifetime) => { + hir::TyKind::TraitObject(bounds, ref lifetime, _) => { for bound in bounds { self.visit_poly_trait_ref(bound, hir::TraitBoundModifier::None); } diff --git a/compiler/rustc_resolve/src/lib.rs b/compiler/rustc_resolve/src/lib.rs index b19990e49b..ccfb5ff3aa 100644 --- a/compiler/rustc_resolve/src/lib.rs +++ b/compiler/rustc_resolve/src/lib.rs @@ -11,6 +11,7 @@ #![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")] #![feature(box_patterns)] #![feature(bool_to_option)] +#![feature(control_flow_enum)] #![feature(crate_visibility_modifier)] #![feature(format_args_capture)] #![feature(nll)] @@ -23,11 +24,13 @@ use Determinacy::*; use rustc_arena::{DroplessArena, TypedArena}; use rustc_ast::node_id::NodeMap; +use rustc_ast::ptr::P; use rustc_ast::unwrap_or; use rustc_ast::visit::{self, Visitor}; -use rustc_ast::{self as ast, FloatTy, IntTy, NodeId, UintTy}; +use rustc_ast::{self as ast, NodeId}; use rustc_ast::{Crate, CRATE_NODE_ID}; -use rustc_ast::{ItemKind, Path}; +use rustc_ast::{Expr, ExprKind, LitKind}; +use rustc_ast::{ItemKind, ModKind, Path}; use rustc_ast_lowering::ResolverAstLowering; use rustc_ast_pretty::pprust; use rustc_data_structures::fx::{FxHashMap, FxHashSet, FxIndexMap}; @@ -39,8 +42,7 @@ use rustc_hir::def::Namespace::*; use rustc_hir::def::{self, CtorOf, DefKind, NonMacroAttrKind, PartialRes}; use rustc_hir::def_id::{CrateNum, DefId, DefIdMap, LocalDefId, CRATE_DEF_INDEX}; use rustc_hir::definitions::{DefKey, DefPathData, Definitions}; -use rustc_hir::PrimTy::{self, Bool, Char, Float, Int, Str, Uint}; -use rustc_hir::TraitCandidate; +use rustc_hir::{PrimTy, TraitCandidate}; use rustc_index::vec::IndexVec; use rustc_metadata::creader::{CStore, CrateLoader}; use rustc_middle::hir::exports::ExportMap; @@ -60,6 +62,7 @@ use rustc_span::{Span, DUMMY_SP}; use smallvec::{smallvec, SmallVec}; use std::cell::{Cell, RefCell}; use std::collections::BTreeSet; +use std::ops::ControlFlow; use std::{cmp, fmt, iter, ptr}; use tracing::debug; @@ -153,6 +156,12 @@ impl<'a> ParentScope<'a> { } } +#[derive(Copy, Debug, Clone)] +enum ImplTraitContext { + Existential, + Universal(LocalDefId), +} + #[derive(Eq)] struct BindingError { name: Symbol, @@ -284,28 +293,21 @@ struct UsePlacementFinder { impl UsePlacementFinder { fn check(krate: &Crate, target_module: NodeId) -> (Option, bool) { let mut finder = UsePlacementFinder { target_module, span: None, found_use: false }; - visit::walk_crate(&mut finder, krate); + if let ControlFlow::Continue(..) = finder.check_mod(&krate.items, CRATE_NODE_ID) { + visit::walk_crate(&mut finder, krate); + } (finder.span, finder.found_use) } -} -impl<'tcx> Visitor<'tcx> for UsePlacementFinder { - fn visit_mod( - &mut self, - module: &'tcx ast::Mod, - _: Span, - _: &[ast::Attribute], - node_id: NodeId, - ) { + fn check_mod(&mut self, items: &[P], node_id: NodeId) -> ControlFlow<()> { if self.span.is_some() { - return; + return ControlFlow::Break(()); } if node_id != self.target_module { - visit::walk_mod(self, module); - return; + return ControlFlow::Continue(()); } // find a use statement - for item in &module.items { + for item in items { match item.kind { ItemKind::Use(..) => { // don't suggest placing a use before the prelude @@ -313,7 +315,7 @@ impl<'tcx> Visitor<'tcx> for UsePlacementFinder { if !item.span.from_expansion() { self.span = Some(item.span.shrink_to_lo()); self.found_use = true; - return; + return ControlFlow::Break(()); } } // don't place use before extern crate @@ -338,6 +340,18 @@ impl<'tcx> Visitor<'tcx> for UsePlacementFinder { } } } + ControlFlow::Continue(()) + } +} + +impl<'tcx> Visitor<'tcx> for UsePlacementFinder { + fn visit_item(&mut self, item: &'tcx ast::Item) { + if let ItemKind::Mod(_, ModKind::Loaded(items, ..)) = &item.kind { + if let ControlFlow::Break(..) = self.check_mod(items, item.id) { + return; + } + } + visit::walk_item(self, item); } } @@ -751,27 +765,12 @@ impl<'a> NameBinding<'a> { fn is_possibly_imported_variant(&self) -> bool { match self.kind { NameBindingKind::Import { binding, .. } => binding.is_possibly_imported_variant(), - _ => self.is_variant(), - } - } - - // We sometimes need to treat variants as `pub` for backwards compatibility. - fn pseudo_vis(&self) -> ty::Visibility { - if self.is_variant() && self.res().def_id().is_local() { - ty::Visibility::Public - } else { - self.vis - } - } - - fn is_variant(&self) -> bool { - matches!( - self.kind, NameBindingKind::Res( Res::Def(DefKind::Variant | DefKind::Ctor(CtorOf::Variant, ..), _), _, - ) - ) + ) => true, + NameBindingKind::Res(..) | NameBindingKind::Module(..) => false, + } } fn is_extern_crate(&self) -> bool { @@ -834,39 +833,6 @@ impl<'a> NameBinding<'a> { } } -/// Interns the names of the primitive types. -/// -/// All other types are defined somewhere and possibly imported, but the primitive ones need -/// special handling, since they have no place of origin. -struct PrimitiveTypeTable { - primitive_types: FxHashMap, -} - -impl PrimitiveTypeTable { - fn new() -> PrimitiveTypeTable { - let mut table = FxHashMap::default(); - - table.insert(sym::bool, Bool); - table.insert(sym::char, Char); - table.insert(sym::f32, Float(FloatTy::F32)); - table.insert(sym::f64, Float(FloatTy::F64)); - table.insert(sym::isize, Int(IntTy::Isize)); - table.insert(sym::i8, Int(IntTy::I8)); - table.insert(sym::i16, Int(IntTy::I16)); - table.insert(sym::i32, Int(IntTy::I32)); - table.insert(sym::i64, Int(IntTy::I64)); - table.insert(sym::i128, Int(IntTy::I128)); - table.insert(sym::str, Str); - table.insert(sym::usize, Uint(UintTy::Usize)); - table.insert(sym::u8, Uint(UintTy::U8)); - table.insert(sym::u16, Uint(UintTy::U16)); - table.insert(sym::u32, Uint(UintTy::U32)); - table.insert(sym::u64, Uint(UintTy::U64)); - table.insert(sym::u128, Uint(UintTy::U128)); - Self { primitive_types: table } - } -} - #[derive(Debug, Default, Clone)] pub struct ExternPreludeEntry<'a> { extern_crate_item: Option<&'a NameBinding<'a>>, @@ -912,9 +878,6 @@ pub struct Resolver<'a> { /// "self-confirming" import resolutions during import validation. unusable_binding: Option<&'a NameBinding<'a>>, - /// The idents for the primitive types. - primitive_type_table: PrimitiveTypeTable, - /// Resolutions for nodes that have a single resolution. partial_res_map: NodeMap, /// Resolutions for import nodes, which have multiple resolutions in different namespaces. @@ -1004,6 +967,8 @@ pub struct Resolver<'a> { output_macro_rules_scopes: FxHashMap>, /// Helper attributes that are in scope for the given expansion. helper_attrs: FxHashMap>, + /// Resolutions for paths inside the `#[derive(...)]` attribute with the given `ExpnId`. + derive_resolutions: FxHashMap, ast::Path)>>, /// Avoid duplicated errors for "name already defined". name_already_seen: FxHashMap, @@ -1030,13 +995,16 @@ pub struct Resolver<'a> { /// Indices of unnamed struct or variant fields with unresolved attributes. placeholder_field_indices: FxHashMap, /// When collecting definitions from an AST fragment produced by a macro invocation `ExpnId` - /// we know what parent node that fragment should be attached to thanks to this table. - invocation_parents: FxHashMap, + /// we know what parent node that fragment should be attached to thanks to this table, + /// and how the `impl Trait` fragments were introduced. + invocation_parents: FxHashMap, next_disambiguator: FxHashMap<(LocalDefId, DefPathData), u32>, /// Some way to know that we are in a *trait* impl in `visit_assoc_item`. /// FIXME: Replace with a more general AST map (together with some other fields). trait_impl_items: FxHashSet, + + legacy_const_generic_args: FxHashMap>>, } /// Nothing really interesting here; it just provides memory for the rest of the crate. @@ -1118,6 +1086,10 @@ impl ResolverAstLowering for Resolver<'_> { self.cstore().item_generics_num_lifetimes(def_id, sess) } + fn legacy_const_generic_args(&mut self, expr: &Expr) -> Option> { + self.legacy_const_generic_args(expr) + } + fn get_partial_res(&mut self, id: NodeId) -> Option { self.partial_res_map.get(&id).cloned() } @@ -1240,7 +1212,7 @@ impl<'a> Resolver<'a> { node_id_to_def_id.insert(CRATE_NODE_ID, root); let mut invocation_parents = FxHashMap::default(); - invocation_parents.insert(ExpnId::root(), root); + invocation_parents.insert(ExpnId::root(), (root, ImplTraitContext::Existential)); let mut extern_prelude: FxHashMap> = session .opts @@ -1284,8 +1256,6 @@ impl<'a> Resolver<'a> { last_import_segment: false, unusable_binding: None, - primitive_type_table: PrimitiveTypeTable::new(), - partial_res_map: Default::default(), import_res_map: Default::default(), label_res_map: Default::default(), @@ -1334,6 +1304,7 @@ impl<'a> Resolver<'a> { invocation_parent_scopes: Default::default(), output_macro_rules_scopes: Default::default(), helper_attrs: Default::default(), + derive_resolutions: Default::default(), local_macro_def_scopes: FxHashMap::default(), name_already_seen: FxHashMap::default(), potentially_unused_imports: Vec::new(), @@ -1359,6 +1330,7 @@ impl<'a> Resolver<'a> { invocation_parents, next_disambiguator: Default::default(), trait_impl_items: Default::default(), + legacy_const_generic_args: Default::default(), }; let root_parent_scope = ParentScope::module(graph_root, &resolver); @@ -1457,7 +1429,7 @@ impl<'a> Resolver<'a> { fn macro_def(&self, mut ctxt: SyntaxContext) -> DefId { loop { - match ctxt.outer_expn().expn_data().macro_def_id { + match ctxt.outer_expn_data().macro_def_id { Some(def_id) => return def_id, None => ctxt.remove_mark(), }; @@ -1994,9 +1966,9 @@ impl<'a> Resolver<'a> { } if ns == TypeNS { - if let Some(prim_ty) = self.primitive_type_table.primitive_types.get(&ident.name) { + if let Some(prim_ty) = PrimTy::from_name(ident.name) { let binding = - (Res::PrimTy(*prim_ty), ty::Visibility::Public, DUMMY_SP, ExpnId::root()) + (Res::PrimTy(prim_ty), ty::Visibility::Public, DUMMY_SP, ExpnId::root()) .to_name_binding(self.arenas); return Some(LexicalScopeBinding::Item(binding)); } @@ -2468,8 +2440,10 @@ impl<'a> Resolver<'a> { Applicability::MaybeIncorrect, )), ) - } else { + } else if self.session.edition() == Edition::Edition2015 { (format!("maybe a missing crate `{}`?", ident), None) + } else { + (format!("could not find `{}` in the crate root", ident), None) } } else if i == 0 { if ident @@ -2485,10 +2459,16 @@ impl<'a> Resolver<'a> { } } else { let parent = path[i - 1].ident.name; - let parent = if parent == kw::PathRoot { - "crate root".to_owned() - } else { - format!("`{}`", parent) + let parent = match parent { + // ::foo is mounted at the crate root for 2015, and is the extern + // prelude for 2018+ + kw::PathRoot if self.session.edition() > Edition::Edition2015 => { + "the list of imported crates".to_owned() + } + kw::PathRoot | kw::Crate => "the crate root".to_owned(), + _ => { + format!("`{}`", parent) + } }; let mut msg = format!("could not find `{}` in {}", ident, parent); @@ -3351,6 +3331,61 @@ impl<'a> Resolver<'a> { pub fn opt_span(&self, def_id: DefId) -> Option { if let Some(def_id) = def_id.as_local() { Some(self.def_id_to_span[def_id]) } else { None } } + + /// Checks if an expression refers to a function marked with + /// `#[rustc_legacy_const_generics]` and returns the argument index list + /// from the attribute. + pub fn legacy_const_generic_args(&mut self, expr: &Expr) -> Option> { + if let ExprKind::Path(None, path) = &expr.kind { + // Don't perform legacy const generics rewriting if the path already + // has generic arguments. + if path.segments.last().unwrap().args.is_some() { + return None; + } + + let partial_res = self.partial_res_map.get(&expr.id)?; + if partial_res.unresolved_segments() != 0 { + return None; + } + + if let Res::Def(def::DefKind::Fn, def_id) = partial_res.base_res() { + // We only support cross-crate argument rewriting. Uses + // within the same crate should be updated to use the new + // const generics style. + if def_id.is_local() { + return None; + } + + if let Some(v) = self.legacy_const_generic_args.get(&def_id) { + return v.clone(); + } + + let parse_attrs = || { + let attrs = self.cstore().item_attrs(def_id, self.session); + let attr = attrs + .iter() + .find(|a| self.session.check_name(a, sym::rustc_legacy_const_generics))?; + let mut ret = vec![]; + for meta in attr.meta_item_list()? { + match meta.literal()?.kind { + LitKind::Int(a, _) => { + ret.push(a as usize); + } + _ => panic!("invalid arg index"), + } + } + Some(ret) + }; + + // Cache the lookup to avoid parsing attributes for an iterm + // multiple times. + let ret = parse_attrs(); + self.legacy_const_generic_args.insert(def_id, ret.clone()); + return ret; + } + } + None + } } fn names_to_string(names: &[Symbol]) -> String { diff --git a/compiler/rustc_resolve/src/macros.rs b/compiler/rustc_resolve/src/macros.rs index d0adee2429..2e47d4cece 100644 --- a/compiler/rustc_resolve/src/macros.rs +++ b/compiler/rustc_resolve/src/macros.rs @@ -6,7 +6,7 @@ use crate::Namespace::*; use crate::{AmbiguityError, AmbiguityErrorMisc, AmbiguityKind, BuiltinMacroState, Determinacy}; use crate::{CrateLint, ParentScope, ResolutionError, Resolver, Scope, ScopeSet, Weak}; use crate::{ModuleKind, ModuleOrUniformRoot, NameBinding, PathResult, Segment, ToNameBinding}; -use rustc_ast::{self as ast, NodeId}; +use rustc_ast::{self as ast, Inline, ItemKind, ModKind, NodeId}; use rustc_ast_lowering::ResolverAstLowering; use rustc_ast_pretty::pprust; use rustc_attr::StabilityLevel; @@ -14,16 +14,18 @@ use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::ptr_key::PtrKey; use rustc_data_structures::sync::Lrc; use rustc_errors::struct_span_err; -use rustc_expand::base::{Indeterminate, InvocationRes, ResolverExpand}; -use rustc_expand::base::{SyntaxExtension, SyntaxExtensionKind}; +use rustc_expand::base::Annotatable; +use rustc_expand::base::{Indeterminate, ResolverExpand, SyntaxExtension, SyntaxExtensionKind}; use rustc_expand::compile_declarative_macro; use rustc_expand::expand::{AstFragment, Invocation, InvocationKind}; use rustc_feature::is_builtin_attr_name; use rustc_hir::def::{self, DefKind, NonMacroAttrKind}; use rustc_hir::def_id; +use rustc_hir::PrimTy; use rustc_middle::middle::stability; use rustc_middle::ty; -use rustc_session::lint::builtin::{SOFT_UNSTABLE, UNUSED_MACROS}; +use rustc_session::lint::builtin::{LEGACY_DERIVE_HELPERS, SOFT_UNSTABLE, UNUSED_MACROS}; +use rustc_session::lint::BuiltinLintDiagnostics; use rustc_session::parse::feature_err; use rustc_session::Session; use rustc_span::edition::Edition; @@ -152,6 +154,26 @@ crate fn registered_attrs_and_tools( (registered_attrs, registered_tools) } +// Some feature gates for inner attributes are reported as lints for backward compatibility. +fn soft_custom_inner_attributes_gate(path: &ast::Path, invoc: &Invocation) -> bool { + match &path.segments[..] { + // `#![test]` + [seg] if seg.ident.name == sym::test => return true, + // `#![rustfmt::skip]` on out-of-line modules + [seg1, seg2] if seg1.ident.name == sym::rustfmt && seg2.ident.name == sym::skip => { + if let InvocationKind::Attr { item, .. } = &invoc.kind { + if let Annotatable::Item(item) = item { + if let ItemKind::Mod(_, ModKind::Loaded(_, Inline::No, _)) = item.kind { + return true; + } + } + } + } + _ => {} + } + false +} + impl<'a> ResolverExpand for Resolver<'a> { fn next_node_id(&mut self) -> NodeId { self.next_node_id() @@ -226,7 +248,7 @@ impl<'a> ResolverExpand for Resolver<'a> { invoc: &Invocation, eager_expansion_root: ExpnId, force: bool, - ) -> Result { + ) -> Result, Indeterminate> { let invoc_id = invoc.expansion_data.id; let parent_scope = match self.invocation_parent_scopes.get(&invoc_id) { Some(parent_scope) => *parent_scope, @@ -243,65 +265,15 @@ impl<'a> ResolverExpand for Resolver<'a> { } }; - let (path, kind, inner_attr, derives, after_derive) = match invoc.kind { - InvocationKind::Attr { ref attr, ref derives, after_derive, .. } => ( + let (path, kind, inner_attr, derives) = match invoc.kind { + InvocationKind::Attr { ref attr, ref derives, .. } => ( &attr.get_normal_item().path, MacroKind::Attr, attr.style == ast::AttrStyle::Inner, self.arenas.alloc_ast_paths(derives), - after_derive, ), - InvocationKind::Bang { ref mac, .. } => { - (&mac.path, MacroKind::Bang, false, &[][..], false) - } - InvocationKind::Derive { ref path, .. } => { - (path, MacroKind::Derive, false, &[][..], false) - } - InvocationKind::DeriveContainer { ref derives, .. } => { - // Block expansion of the container until we resolve all derives in it. - // This is required for two reasons: - // - Derive helper attributes are in scope for the item to which the `#[derive]` - // is applied, so they have to be produced by the container's expansion rather - // than by individual derives. - // - Derives in the container need to know whether one of them is a built-in `Copy`. - // FIXME: Try to avoid repeated resolutions for derives here and in expansion. - let mut exts = Vec::new(); - let mut helper_attrs = Vec::new(); - for path in derives { - exts.push( - match self.resolve_macro_path( - path, - Some(MacroKind::Derive), - &parent_scope, - true, - force, - ) { - Ok((Some(ext), _)) => { - let span = path - .segments - .last() - .unwrap() - .ident - .span - .normalize_to_macros_2_0(); - helper_attrs.extend( - ext.helper_attrs.iter().map(|name| Ident::new(*name, span)), - ); - if ext.builtin_name == Some(sym::Copy) { - self.containers_deriving_copy.insert(invoc_id); - } - ext - } - Ok(_) | Err(Determinacy::Determined) => { - self.dummy_ext(MacroKind::Derive) - } - Err(Determinacy::Undetermined) => return Err(Indeterminate), - }, - ) - } - self.helper_attrs.insert(invoc_id, helper_attrs); - return Ok(InvocationRes::DeriveContainer(exts)); - } + InvocationKind::Bang { ref mac, .. } => (&mac.path, MacroKind::Bang, false, &[][..]), + InvocationKind::Derive { ref path, .. } => (path, MacroKind::Derive, false, &[][..]), }; // Derives are not included when `invocations` are collected, so we have to add them here. @@ -316,6 +288,7 @@ impl<'a> ResolverExpand for Resolver<'a> { parent_scope, node_id, force, + soft_custom_inner_attributes_gate(path, invoc), )?; let span = invoc.span(); @@ -327,14 +300,41 @@ impl<'a> ResolverExpand for Resolver<'a> { )); if let Res::Def(_, _) = res { - if after_derive { - self.session.span_err(span, "macro attributes must be placed before `#[derive]`"); - } let normal_module_def_id = self.macro_def_scope(invoc_id).nearest_parent_mod; self.definitions.add_parent_module_of_macro_def(invoc_id, normal_module_def_id); + + // Gate macro attributes in `#[derive]` output. + if !self.session.features_untracked().macro_attributes_in_derive_output + && kind == MacroKind::Attr + && ext.builtin_name != Some(sym::derive) + { + let mut expn_id = parent_scope.expansion; + loop { + // Helper attr table is a quick way to determine whether the attr is `derive`. + if self.helper_attrs.contains_key(&expn_id) { + feature_err( + &self.session.parse_sess, + sym::macro_attributes_in_derive_output, + path.span, + "macro attributes in `#[derive]` output are unstable", + ) + .emit(); + break; + } else { + let expn_data = expn_id.expn_data(); + match expn_data.kind { + ExpnKind::Root + | ExpnKind::Macro(MacroKind::Bang | MacroKind::Derive, _) => { + break; + } + _ => expn_id = expn_data.parent, + } + } + } + } } - Ok(InvocationRes::Single(ext)) + Ok(ext) } fn check_unused_macros(&mut self) { @@ -343,18 +343,75 @@ impl<'a> ResolverExpand for Resolver<'a> { } } - fn lint_node_id(&mut self, expn_id: ExpnId) -> NodeId { + fn lint_node_id(&self, expn_id: ExpnId) -> NodeId { // FIXME - make this more precise. This currently returns the NodeId of the // nearest closing item - we should try to return the closest parent of the ExpnId self.invocation_parents .get(&expn_id) - .map_or(ast::CRATE_NODE_ID, |id| self.def_id_to_node_id[*id]) + .map_or(ast::CRATE_NODE_ID, |id| self.def_id_to_node_id[id.0]) } fn has_derive_copy(&self, expn_id: ExpnId) -> bool { self.containers_deriving_copy.contains(&expn_id) } + fn resolve_derives( + &mut self, + expn_id: ExpnId, + derives: Vec, + force: bool, + ) -> Result<(), Indeterminate> { + // Block expansion of the container until we resolve all derives in it. + // This is required for two reasons: + // - Derive helper attributes are in scope for the item to which the `#[derive]` + // is applied, so they have to be produced by the container's expansion rather + // than by individual derives. + // - Derives in the container need to know whether one of them is a built-in `Copy`. + // FIXME: Try to cache intermediate results to avoid resolving same derives multiple times. + let parent_scope = self.invocation_parent_scopes[&expn_id]; + let mut exts = Vec::new(); + let mut helper_attrs = Vec::new(); + let mut has_derive_copy = false; + for path in derives { + exts.push(( + match self.resolve_macro_path( + &path, + Some(MacroKind::Derive), + &parent_scope, + true, + force, + ) { + Ok((Some(ext), _)) => { + let span = + path.segments.last().unwrap().ident.span.normalize_to_macros_2_0(); + helper_attrs + .extend(ext.helper_attrs.iter().map(|name| Ident::new(*name, span))); + has_derive_copy |= ext.builtin_name == Some(sym::Copy); + ext + } + Ok(_) | Err(Determinacy::Determined) => self.dummy_ext(MacroKind::Derive), + Err(Determinacy::Undetermined) => return Err(Indeterminate), + }, + path, + )) + } + self.derive_resolutions.insert(expn_id, exts); + self.helper_attrs.insert(expn_id, helper_attrs); + // Mark this derive as having `Copy` either if it has `Copy` itself or if its parent derive + // has `Copy`, to support cases like `#[derive(Clone, Copy)] #[derive(Debug)]`. + if has_derive_copy || self.has_derive_copy(parent_scope.expansion) { + self.containers_deriving_copy.insert(expn_id); + } + Ok(()) + } + + fn take_derive_resolutions( + &mut self, + expn_id: ExpnId, + ) -> Option, ast::Path)>> { + self.derive_resolutions.remove(&expn_id) + } + // The function that implements the resolution logic of `#[cfg_accessible(path)]`. // Returns true if the path can certainly be resolved in one of three namespaces, // returns false if the path certainly cannot be resolved in any of the three namespaces. @@ -405,6 +462,7 @@ impl<'a> Resolver<'a> { parent_scope: &ParentScope<'a>, node_id: NodeId, force: bool, + soft_custom_inner_attributes_gate: bool, ) -> Result<(Lrc, Res), Indeterminate> { let (ext, res) = match self.resolve_macro_path(path, Some(kind), parent_scope, true, force) { @@ -472,7 +530,7 @@ impl<'a> Resolver<'a> { Res::NonMacroAttr(..) => "custom inner attributes are unstable", _ => unreachable!(), }; - if path == &sym::test { + if soft_custom_inner_attributes_gate { self.session.parse_sess.buffer_lint(SOFT_UNSTABLE, path.span, node_id, msg); } else { feature_err(&self.session.parse_sess, sym::custom_inner_attributes, path.span, msg) @@ -796,12 +854,10 @@ impl<'a> Resolver<'a> { } result } - Scope::BuiltinTypes => { - match this.primitive_type_table.primitive_types.get(&ident.name).cloned() { - Some(prim_ty) => ok(Res::PrimTy(prim_ty), DUMMY_SP, this.arenas), - None => Err(Determinacy::Determined), - } - } + Scope::BuiltinTypes => match PrimTy::from_name(ident.name) { + Some(prim_ty) => ok(Res::PrimTy(prim_ty), DUMMY_SP, this.arenas), + None => Err(Determinacy::Determined), + }, }; match result { @@ -819,6 +875,8 @@ impl<'a> Resolver<'a> { let is_builtin = |res| { matches!(res, Res::NonMacroAttr(NonMacroAttrKind::Builtin(..))) }; + let derive_helper = + Res::NonMacroAttr(NonMacroAttrKind::DeriveHelper); let derive_helper_compat = Res::NonMacroAttr(NonMacroAttrKind::DeriveHelperCompat); @@ -827,7 +885,7 @@ impl<'a> Resolver<'a> { } else if is_builtin(innermost_res) || is_builtin(res) { Some(AmbiguityKind::BuiltinAttr) } else if innermost_res == derive_helper_compat - || res == derive_helper_compat + || res == derive_helper_compat && innermost_res != derive_helper { Some(AmbiguityKind::DeriveHelper) } else if innermost_flags.contains(Flags::MACRO_RULES) @@ -993,6 +1051,15 @@ impl<'a> Resolver<'a> { let res = binding.res(); let seg = Segment::from_ident(ident); check_consistency(self, &[seg], ident.span, kind, initial_res, res); + if res == Res::NonMacroAttr(NonMacroAttrKind::DeriveHelperCompat) { + self.lint_buffer.buffer_lint_with_diagnostic( + LEGACY_DERIVE_HELPERS, + self.lint_node_id(parent_scope.expansion), + ident.span, + "derive helper attribute is used before it is introduced", + BuiltinLintDiagnostics::LegacyDeriveHelpers(binding.span), + ); + } } Err(..) => { let expected = kind.descr_expected(); @@ -1079,7 +1146,7 @@ impl<'a> Resolver<'a> { crate fn check_reserved_macro_name(&mut self, ident: Ident, res: Res) { // Reserve some names that are not quite covered by the general check // performed on `Resolver::builtin_attrs`. - if ident.name == sym::cfg || ident.name == sym::cfg_attr || ident.name == sym::derive { + if ident.name == sym::cfg || ident.name == sym::cfg_attr { let macro_kind = self.get_macro(res).map(|ext| ext.macro_kind()); if macro_kind.is_some() && sub_namespace_match(macro_kind, Some(MacroKind::Attr)) { self.session.span_err( diff --git a/compiler/rustc_save_analysis/src/dump_visitor.rs b/compiler/rustc_save_analysis/src/dump_visitor.rs index 2834e7b632..15435df32b 100644 --- a/compiler/rustc_save_analysis/src/dump_visitor.rs +++ b/compiler/rustc_save_analysis/src/dump_visitor.rs @@ -301,7 +301,7 @@ impl<'tcx> DumpVisitor<'tcx> { fn process_struct_field_def( &mut self, - field: &'tcx hir::StructField<'tcx>, + field: &'tcx hir::FieldDef<'tcx>, parent_id: hir::HirId, ) { let field_data = self.save_ctxt.get_field_data(field, parent_id); @@ -373,14 +373,14 @@ impl<'tcx> DumpVisitor<'tcx> { body: hir::BodyId, ) { let map = &self.tcx.hir(); - self.nest_typeck_results(map.local_def_id(item.hir_id), |v| { + self.nest_typeck_results(item.def_id, |v| { let body = map.body(body); if let Some(fn_data) = v.save_ctxt.get_item_data(item) { down_cast_data!(fn_data, DefData, item.span); v.process_formals(body.params, &fn_data.qualname); - v.process_generic_params(ty_params, &fn_data.qualname, item.hir_id); + v.process_generic_params(ty_params, &fn_data.qualname, item.hir_id()); - v.dumper.dump_def(&access_from!(v.save_ctxt, item, item.hir_id), fn_data); + v.dumper.dump_def(&access_from!(v.save_ctxt, item, item.hir_id()), fn_data); } for arg in decl.inputs { @@ -401,10 +401,10 @@ impl<'tcx> DumpVisitor<'tcx> { typ: &'tcx hir::Ty<'tcx>, expr: &'tcx hir::Expr<'tcx>, ) { - self.nest_typeck_results(self.tcx.hir().local_def_id(item.hir_id), |v| { + self.nest_typeck_results(item.def_id, |v| { if let Some(var_data) = v.save_ctxt.get_item_data(item) { down_cast_data!(var_data, DefData, item.span); - v.dumper.dump_def(&access_from!(v.save_ctxt, item, item.hir_id), var_data); + v.dumper.dump_def(&access_from!(v.save_ctxt, item, item.hir_id()), var_data); } v.visit_ty(&typ); v.visit_expr(expr); @@ -465,10 +465,7 @@ impl<'tcx> DumpVisitor<'tcx> { ) { debug!("process_struct {:?} {:?}", item, item.span); let name = item.ident.to_string(); - let qualname = format!( - "::{}", - self.tcx.def_path_str(self.tcx.hir().local_def_id(item.hir_id).to_def_id()) - ); + let qualname = format!("::{}", self.tcx.def_path_str(item.def_id.to_def_id())); let kind = match item.kind { hir::ItemKind::Struct(_, _) => DefKind::Struct, @@ -499,11 +496,12 @@ impl<'tcx> DumpVisitor<'tcx> { if !self.span.filter_generated(item.ident.span) { let span = self.span_from_span(item.ident.span); + let attrs = self.tcx.hir().attrs(item.hir_id()); self.dumper.dump_def( - &access_from!(self.save_ctxt, item, item.hir_id), + &access_from!(self.save_ctxt, item, item.hir_id()), Def { kind, - id: id_from_hir_id(item.hir_id, &self.save_ctxt), + id: id_from_def_id(item.def_id.to_def_id()), span, name, qualname: qualname.clone(), @@ -511,20 +509,20 @@ impl<'tcx> DumpVisitor<'tcx> { parent: None, children: fields, decl_id: None, - docs: self.save_ctxt.docs_for_attrs(&item.attrs), + docs: self.save_ctxt.docs_for_attrs(attrs), sig: sig::item_signature(item, &self.save_ctxt), - attributes: lower_attributes(item.attrs.to_vec(), &self.save_ctxt), + attributes: lower_attributes(attrs.to_vec(), &self.save_ctxt), }, ); } - self.nest_typeck_results(self.tcx.hir().local_def_id(item.hir_id), |v| { + self.nest_typeck_results(item.def_id, |v| { for field in def.fields() { - v.process_struct_field_def(field, item.hir_id); + v.process_struct_field_def(field, item.hir_id()); v.visit_ty(&field.ty); } - v.process_generic_params(ty_params, &qualname, item.hir_id); + v.process_generic_params(ty_params, &qualname, item.hir_id()); }); } @@ -541,7 +539,7 @@ impl<'tcx> DumpVisitor<'tcx> { }; down_cast_data!(enum_data, DefData, item.span); - let access = access_from!(self.save_ctxt, item, item.hir_id); + let access = access_from!(self.save_ctxt, item, item.hir_id()); for variant in enum_definition.variants { let name = variant.ident.name.to_string(); @@ -556,7 +554,8 @@ impl<'tcx> DumpVisitor<'tcx> { if !self.span.filter_generated(name_span) { let span = self.span_from_span(name_span); let id = id_from_hir_id(variant.id, &self.save_ctxt); - let parent = Some(id_from_hir_id(item.hir_id, &self.save_ctxt)); + let parent = Some(id_from_def_id(item.def_id.to_def_id())); + let attrs = self.tcx.hir().attrs(variant.id); self.dumper.dump_def( &access, @@ -570,12 +569,9 @@ impl<'tcx> DumpVisitor<'tcx> { parent, children: vec![], decl_id: None, - docs: self.save_ctxt.docs_for_attrs(&variant.attrs), + docs: self.save_ctxt.docs_for_attrs(attrs), sig: sig::variant_signature(variant, &self.save_ctxt), - attributes: lower_attributes( - variant.attrs.to_vec(), - &self.save_ctxt, - ), + attributes: lower_attributes(attrs.to_vec(), &self.save_ctxt), }, ); } @@ -596,7 +592,8 @@ impl<'tcx> DumpVisitor<'tcx> { if !self.span.filter_generated(name_span) { let span = self.span_from_span(name_span); let id = id_from_hir_id(variant.id, &self.save_ctxt); - let parent = Some(id_from_hir_id(item.hir_id, &self.save_ctxt)); + let parent = Some(id_from_def_id(item.def_id.to_def_id())); + let attrs = self.tcx.hir().attrs(variant.id); self.dumper.dump_def( &access, @@ -610,12 +607,9 @@ impl<'tcx> DumpVisitor<'tcx> { parent, children: vec![], decl_id: None, - docs: self.save_ctxt.docs_for_attrs(&variant.attrs), + docs: self.save_ctxt.docs_for_attrs(attrs), sig: sig::variant_signature(variant, &self.save_ctxt), - attributes: lower_attributes( - variant.attrs.to_vec(), - &self.save_ctxt, - ), + attributes: lower_attributes(attrs.to_vec(), &self.save_ctxt), }, ); } @@ -627,7 +621,7 @@ impl<'tcx> DumpVisitor<'tcx> { self.visit_ty(field.ty); } } - self.process_generic_params(ty_params, &enum_data.qualname, item.hir_id); + self.process_generic_params(ty_params, &enum_data.qualname, item.hir_id()); self.dumper.dump_def(&access, enum_data); } @@ -644,17 +638,14 @@ impl<'tcx> DumpVisitor<'tcx> { } let map = &self.tcx.hir(); - self.nest_typeck_results(map.local_def_id(item.hir_id), |v| { + self.nest_typeck_results(item.def_id, |v| { v.visit_ty(&impl_.self_ty); if let Some(trait_ref) = &impl_.of_trait { v.process_path(trait_ref.hir_ref_id, &hir::QPath::Resolved(None, &trait_ref.path)); } - v.process_generic_params(&impl_.generics, "", item.hir_id); + v.process_generic_params(&impl_.generics, "", item.hir_id()); for impl_item in impl_.items { - v.process_impl_item( - map.impl_item(impl_item.id), - map.local_def_id(item.hir_id).to_def_id(), - ); + v.process_impl_item(map.impl_item(impl_item.id), item.def_id.to_def_id()); } }); } @@ -667,10 +658,7 @@ impl<'tcx> DumpVisitor<'tcx> { methods: &'tcx [hir::TraitItemRef], ) { let name = item.ident.to_string(); - let qualname = format!( - "::{}", - self.tcx.def_path_str(self.tcx.hir().local_def_id(item.hir_id).to_def_id()) - ); + let qualname = format!("::{}", self.tcx.def_path_str(item.def_id.to_def_id())); let mut val = name.clone(); if !generics.params.is_empty() { val.push_str(&generic_params_to_string(generics.params)); @@ -680,12 +668,13 @@ impl<'tcx> DumpVisitor<'tcx> { val.push_str(&bounds_to_string(trait_refs)); } if !self.span.filter_generated(item.ident.span) { - let id = id_from_hir_id(item.hir_id, &self.save_ctxt); + let id = id_from_def_id(item.def_id.to_def_id()); let span = self.span_from_span(item.ident.span); let children = - methods.iter().map(|i| id_from_hir_id(i.id.hir_id, &self.save_ctxt)).collect(); + methods.iter().map(|i| id_from_def_id(i.id.def_id.to_def_id())).collect(); + let attrs = self.tcx.hir().attrs(item.hir_id()); self.dumper.dump_def( - &access_from!(self.save_ctxt, item, item.hir_id), + &access_from!(self.save_ctxt, item, item.hir_id()), Def { kind: DefKind::Trait, id, @@ -696,9 +685,9 @@ impl<'tcx> DumpVisitor<'tcx> { parent: None, children, decl_id: None, - docs: self.save_ctxt.docs_for_attrs(&item.attrs), + docs: self.save_ctxt.docs_for_attrs(attrs), sig: sig::item_signature(item, &self.save_ctxt), - attributes: lower_attributes(item.attrs.to_vec(), &self.save_ctxt), + attributes: lower_attributes(attrs.to_vec(), &self.save_ctxt), }, ); } @@ -729,20 +718,17 @@ impl<'tcx> DumpVisitor<'tcx> { kind: RelationKind::SuperTrait, span, from: id_from_def_id(id), - to: id_from_hir_id(item.hir_id, &self.save_ctxt), + to: id_from_def_id(item.def_id.to_def_id()), }); } } } // walk generics and methods - self.process_generic_params(generics, &qualname, item.hir_id); + self.process_generic_params(generics, &qualname, item.hir_id()); for method in methods { let map = &self.tcx.hir(); - self.process_trait_item( - map.trait_item(method.id), - map.local_def_id(item.hir_id).to_def_id(), - ) + self.process_trait_item(map.trait_item(method.id), item.def_id.to_def_id()) } } @@ -750,7 +736,7 @@ impl<'tcx> DumpVisitor<'tcx> { fn process_mod(&mut self, item: &'tcx hir::Item<'tcx>) { if let Some(mod_data) = self.save_ctxt.get_item_data(item) { down_cast_data!(mod_data, DefData, item.span); - self.dumper.dump_def(&access_from!(self.save_ctxt, item, item.hir_id), mod_data); + self.dumper.dump_def(&access_from!(self.save_ctxt, item, item.hir_id()), mod_data); } } @@ -807,7 +793,7 @@ impl<'tcx> DumpVisitor<'tcx> { &mut self, ex: &'tcx hir::Expr<'tcx>, path: &'tcx hir::QPath<'tcx>, - fields: &'tcx [hir::Field<'tcx>], + fields: &'tcx [hir::ExprField<'tcx>], variant: &'tcx ty::VariantDef, rest: Option<&'tcx hir::Expr<'tcx>>, ) { @@ -1010,14 +996,15 @@ impl<'tcx> DumpVisitor<'tcx> { hir::TraitItemKind::Const(ref ty, body) => { let body = body.map(|b| &self.tcx.hir().body(b).value); let respan = respan(vis_span, hir::VisibilityKind::Public); + let attrs = self.tcx.hir().attrs(trait_item.hir_id()); self.process_assoc_const( - trait_item.hir_id, + trait_item.hir_id(), trait_item.ident, &ty, body, trait_id, &respan, - &trait_item.attrs, + attrs, ); } hir::TraitItemKind::Fn(ref sig, ref trait_fn) => { @@ -1027,7 +1014,7 @@ impl<'tcx> DumpVisitor<'tcx> { self.process_method( sig, body, - trait_item.hir_id, + trait_item.hir_id(), trait_item.ident, &trait_item.generics, &respan, @@ -1037,15 +1024,13 @@ impl<'tcx> DumpVisitor<'tcx> { hir::TraitItemKind::Type(ref bounds, ref default_ty) => { // FIXME do something with _bounds (for type refs) let name = trait_item.ident.name.to_string(); - let qualname = format!( - "::{}", - self.tcx - .def_path_str(self.tcx.hir().local_def_id(trait_item.hir_id).to_def_id()) - ); + let qualname = + format!("::{}", self.tcx.def_path_str(trait_item.def_id.to_def_id())); if !self.span.filter_generated(trait_item.ident.span) { let span = self.span_from_span(trait_item.ident.span); - let id = id_from_hir_id(trait_item.hir_id, &self.save_ctxt); + let id = id_from_def_id(trait_item.def_id.to_def_id()); + let attrs = self.tcx.hir().attrs(trait_item.hir_id()); self.dumper.dump_def( &Access { public: true, reachable: true }, @@ -1059,18 +1044,15 @@ impl<'tcx> DumpVisitor<'tcx> { parent: Some(id_from_def_id(trait_id)), children: vec![], decl_id: None, - docs: self.save_ctxt.docs_for_attrs(&trait_item.attrs), + docs: self.save_ctxt.docs_for_attrs(attrs), sig: sig::assoc_type_signature( - trait_item.hir_id, + trait_item.hir_id(), trait_item.ident, Some(bounds), default_ty.as_ref().map(|ty| &**ty), &self.save_ctxt, ), - attributes: lower_attributes( - trait_item.attrs.to_vec(), - &self.save_ctxt, - ), + attributes: lower_attributes(attrs.to_vec(), &self.save_ctxt), }, ); } @@ -1087,21 +1069,22 @@ impl<'tcx> DumpVisitor<'tcx> { match impl_item.kind { hir::ImplItemKind::Const(ref ty, body) => { let body = self.tcx.hir().body(body); + let attrs = self.tcx.hir().attrs(impl_item.hir_id()); self.process_assoc_const( - impl_item.hir_id, + impl_item.hir_id(), impl_item.ident, &ty, Some(&body.value), impl_id, &impl_item.vis, - &impl_item.attrs, + attrs, ); } hir::ImplItemKind::Fn(ref sig, body) => { self.process_method( sig, Some(body), - impl_item.hir_id, + impl_item.hir_id(), impl_item.ident, &impl_item.generics, &impl_item.vis, @@ -1130,9 +1113,10 @@ impl<'tcx> DumpVisitor<'tcx> { .module .item_ids .iter() - .map(|i| id_from_hir_id(i.id, &self.save_ctxt)) + .map(|i| id_from_def_id(i.def_id.to_def_id())) .collect(); let span = self.span_from_span(krate.item.span); + let attrs = self.tcx.hir().attrs(id); self.dumper.dump_def( &Access { public: true, reachable: true }, @@ -1146,9 +1130,9 @@ impl<'tcx> DumpVisitor<'tcx> { children, parent: None, decl_id: None, - docs: self.save_ctxt.docs_for_attrs(krate.item.attrs), + docs: self.save_ctxt.docs_for_attrs(attrs), sig: None, - attributes: lower_attributes(krate.item.attrs.to_owned(), &self.save_ctxt), + attributes: lower_attributes(attrs.to_owned(), &self.save_ctxt), }, ); intravisit::walk_crate(self, krate); @@ -1179,16 +1163,11 @@ impl<'tcx> Visitor<'tcx> for DumpVisitor<'tcx> { hir::ItemKind::Use(path, hir::UseKind::Single) => { let sub_span = path.segments.last().unwrap().ident.span; if !self.span.filter_generated(sub_span) { - let access = access_from!(self.save_ctxt, item, item.hir_id); - let ref_id = self.lookup_def_id(item.hir_id).map(id_from_def_id); + let access = access_from!(self.save_ctxt, item, item.hir_id()); + let ref_id = self.lookup_def_id(item.hir_id()).map(id_from_def_id); let span = self.span_from_span(sub_span); - let parent = self - .save_ctxt - .tcx - .hir() - .opt_local_def_id(item.hir_id) - .and_then(|id| self.save_ctxt.tcx.parent(id.to_def_id())) - .map(id_from_def_id); + let parent = + self.save_ctxt.tcx.parent(item.def_id.to_def_id()).map(id_from_def_id); self.dumper.import( &access, Import { @@ -1206,23 +1185,17 @@ impl<'tcx> Visitor<'tcx> for DumpVisitor<'tcx> { } hir::ItemKind::Use(path, hir::UseKind::Glob) => { // Make a comma-separated list of names of imported modules. - let def_id = self.tcx.hir().local_def_id(item.hir_id); - let names = self.tcx.names_imported_by_glob_use(def_id); + let names = self.tcx.names_imported_by_glob_use(item.def_id); let names: Vec<_> = names.iter().map(|n| n.to_string()).collect(); // Otherwise it's a span with wrong macro expansion info, which // we don't want to track anyway, since it's probably macro-internal `use` if let Some(sub_span) = self.span.sub_span_of_star(item.span) { if !self.span.filter_generated(item.span) { - let access = access_from!(self.save_ctxt, item, item.hir_id); + let access = access_from!(self.save_ctxt, item, item.hir_id()); let span = self.span_from_span(sub_span); - let parent = self - .save_ctxt - .tcx - .hir() - .opt_local_def_id(item.hir_id) - .and_then(|id| self.save_ctxt.tcx.parent(id.to_def_id())) - .map(id_from_def_id); + let parent = + self.save_ctxt.tcx.parent(item.def_id.to_def_id()).map(id_from_def_id); self.dumper.import( &access, Import { @@ -1243,13 +1216,8 @@ impl<'tcx> Visitor<'tcx> for DumpVisitor<'tcx> { let name_span = item.ident.span; if !self.span.filter_generated(name_span) { let span = self.span_from_span(name_span); - let parent = self - .save_ctxt - .tcx - .hir() - .opt_local_def_id(item.hir_id) - .and_then(|id| self.save_ctxt.tcx.parent(id.to_def_id())) - .map(id_from_def_id); + let parent = + self.save_ctxt.tcx.parent(item.def_id.to_def_id()).map(id_from_def_id); self.dumper.import( &Access { public: false, reachable: false }, Import { @@ -1286,20 +1254,18 @@ impl<'tcx> Visitor<'tcx> for DumpVisitor<'tcx> { } hir::ItemKind::Mod(ref m) => { self.process_mod(item); - intravisit::walk_mod(self, m, item.hir_id); + intravisit::walk_mod(self, m, item.hir_id()); } hir::ItemKind::TyAlias(ty, ref generics) => { - let qualname = format!( - "::{}", - self.tcx.def_path_str(self.tcx.hir().local_def_id(item.hir_id).to_def_id()) - ); + let qualname = format!("::{}", self.tcx.def_path_str(item.def_id.to_def_id())); let value = ty_to_string(&ty); if !self.span.filter_generated(item.ident.span) { let span = self.span_from_span(item.ident.span); - let id = id_from_hir_id(item.hir_id, &self.save_ctxt); + let id = id_from_def_id(item.def_id.to_def_id()); + let attrs = self.tcx.hir().attrs(item.hir_id()); self.dumper.dump_def( - &access_from!(self.save_ctxt, item, item.hir_id), + &access_from!(self.save_ctxt, item, item.hir_id()), Def { kind: DefKind::Type, id, @@ -1310,15 +1276,15 @@ impl<'tcx> Visitor<'tcx> for DumpVisitor<'tcx> { parent: None, children: vec![], decl_id: None, - docs: self.save_ctxt.docs_for_attrs(&item.attrs), + docs: self.save_ctxt.docs_for_attrs(attrs), sig: sig::item_signature(item, &self.save_ctxt), - attributes: lower_attributes(item.attrs.to_vec(), &self.save_ctxt), + attributes: lower_attributes(attrs.to_vec(), &self.save_ctxt), }, ); } self.visit_ty(ty); - self.process_generic_params(generics, &qualname, item.hir_id); + self.process_generic_params(generics, &qualname, item.hir_id()); } _ => intravisit::walk_item(self, item), } @@ -1382,10 +1348,8 @@ impl<'tcx> Visitor<'tcx> for DumpVisitor<'tcx> { }); } hir::TyKind::OpaqueDef(item_id, _) => { - let item = self.tcx.hir().item(item_id.id); - self.nest_typeck_results(self.tcx.hir().local_def_id(item_id.id), |v| { - v.visit_item(item) - }); + let item = self.tcx.hir().item(item_id); + self.nest_typeck_results(item_id.def_id, |v| v.visit_item(item)); } _ => intravisit::walk_ty(self, t), } @@ -1485,14 +1449,14 @@ impl<'tcx> Visitor<'tcx> for DumpVisitor<'tcx> { } fn visit_foreign_item(&mut self, item: &'tcx hir::ForeignItem<'tcx>) { - let access = access_from!(self.save_ctxt, item, item.hir_id); + let access = access_from!(self.save_ctxt, item, item.hir_id()); match item.kind { hir::ForeignItemKind::Fn(decl, _, ref generics) => { if let Some(fn_data) = self.save_ctxt.get_extern_item_data(item) { down_cast_data!(fn_data, DefData, item.span); - self.process_generic_params(generics, &fn_data.qualname, item.hir_id); + self.process_generic_params(generics, &fn_data.qualname, item.hir_id()); self.dumper.dump_def(&access, fn_data); } diff --git a/compiler/rustc_save_analysis/src/lib.rs b/compiler/rustc_save_analysis/src/lib.rs index 129123349a..2acae29cc2 100644 --- a/compiler/rustc_save_analysis/src/lib.rs +++ b/compiler/rustc_save_analysis/src/lib.rs @@ -137,8 +137,9 @@ impl<'tcx> SaveContext<'tcx> { } pub fn get_extern_item_data(&self, item: &hir::ForeignItem<'_>) -> Option { - let def_id = self.tcx.hir().local_def_id(item.hir_id).to_def_id(); + let def_id = item.def_id.to_def_id(); let qualname = format!("::{}", self.tcx.def_path_str(def_id)); + let attrs = self.tcx.hir().attrs(item.hir_id()); match item.kind { hir::ForeignItemKind::Fn(ref decl, arg_names, ref generics) => { filter!(self.span_utils, item.ident.span); @@ -156,7 +157,7 @@ impl<'tcx> SaveContext<'tcx> { unsafety: hir::Unsafety::Unsafe, // functions in extern block cannot be const constness: hir::Constness::NotConst, - abi: self.tcx.hir().get_foreign_abi(item.hir_id), + abi: self.tcx.hir().get_foreign_abi(item.hir_id()), // functions in extern block cannot be async asyncness: hir::IsAsync::NotAsync, }, @@ -169,9 +170,9 @@ impl<'tcx> SaveContext<'tcx> { parent: None, children: vec![], decl_id: None, - docs: self.docs_for_attrs(&item.attrs), + docs: self.docs_for_attrs(attrs), sig: sig::foreign_item_signature(item, self), - attributes: lower_attributes(item.attrs.to_vec(), self), + attributes: lower_attributes(attrs.to_vec(), self), })) } hir::ForeignItemKind::Static(ref ty, _) => { @@ -190,9 +191,9 @@ impl<'tcx> SaveContext<'tcx> { parent: None, children: vec![], decl_id: None, - docs: self.docs_for_attrs(&item.attrs), + docs: self.docs_for_attrs(attrs), sig: sig::foreign_item_signature(item, self), - attributes: lower_attributes(item.attrs.to_vec(), self), + attributes: lower_attributes(attrs.to_vec(), self), })) } // FIXME(plietar): needs a new DefKind in rls-data @@ -201,7 +202,8 @@ impl<'tcx> SaveContext<'tcx> { } pub fn get_item_data(&self, item: &hir::Item<'_>) -> Option { - let def_id = self.tcx.hir().local_def_id(item.hir_id).to_def_id(); + let def_id = item.def_id.to_def_id(); + let attrs = self.tcx.hir().attrs(item.hir_id()); match item.kind { hir::ItemKind::Fn(ref sig, ref generics, _) => { let qualname = format!("::{}", self.tcx.def_path_str(def_id)); @@ -224,9 +226,9 @@ impl<'tcx> SaveContext<'tcx> { parent: None, children: vec![], decl_id: None, - docs: self.docs_for_attrs(&item.attrs), + docs: self.docs_for_attrs(attrs), sig: sig::item_signature(item, self), - attributes: lower_attributes(item.attrs.to_vec(), self), + attributes: lower_attributes(attrs.to_vec(), self), })) } hir::ItemKind::Static(ref typ, ..) => { @@ -247,9 +249,9 @@ impl<'tcx> SaveContext<'tcx> { parent: None, children: vec![], decl_id: None, - docs: self.docs_for_attrs(&item.attrs), + docs: self.docs_for_attrs(attrs), sig: sig::item_signature(item, self), - attributes: lower_attributes(item.attrs.to_vec(), self), + attributes: lower_attributes(attrs.to_vec(), self), })) } hir::ItemKind::Const(ref typ, _) => { @@ -269,9 +271,9 @@ impl<'tcx> SaveContext<'tcx> { parent: None, children: vec![], decl_id: None, - docs: self.docs_for_attrs(&item.attrs), + docs: self.docs_for_attrs(attrs), sig: sig::item_signature(item, self), - attributes: lower_attributes(item.attrs.to_vec(), self), + attributes: lower_attributes(attrs.to_vec(), self), })) } hir::ItemKind::Mod(ref m) => { @@ -290,11 +292,15 @@ impl<'tcx> SaveContext<'tcx> { span: self.span_from_span(item.ident.span), value: filename.to_string(), parent: None, - children: m.item_ids.iter().map(|i| id_from_hir_id(i.id, self)).collect(), + children: m + .item_ids + .iter() + .map(|i| id_from_def_id(i.def_id.to_def_id())) + .collect(), decl_id: None, - docs: self.docs_for_attrs(&item.attrs), + docs: self.docs_for_attrs(attrs), sig: sig::item_signature(item, self), - attributes: lower_attributes(item.attrs.to_vec(), self), + attributes: lower_attributes(attrs.to_vec(), self), })) } hir::ItemKind::Enum(ref def, ref generics) => { @@ -313,9 +319,9 @@ impl<'tcx> SaveContext<'tcx> { parent: None, children: def.variants.iter().map(|v| id_from_hir_id(v.id, self)).collect(), decl_id: None, - docs: self.docs_for_attrs(&item.attrs), + docs: self.docs_for_attrs(attrs), sig: sig::item_signature(item, self), - attributes: lower_attributes(item.attrs.to_vec(), self), + attributes: lower_attributes(attrs.to_vec(), self), })) } hir::ItemKind::Impl(hir::Impl { ref of_trait, ref self_ty, ref items, .. }) => { @@ -354,7 +360,7 @@ impl<'tcx> SaveContext<'tcx> { parent: None, children: items .iter() - .map(|i| id_from_hir_id(i.id.hir_id, self)) + .map(|i| id_from_def_id(i.id.def_id.to_def_id())) .collect(), docs: String::new(), sig: None, @@ -373,7 +379,7 @@ impl<'tcx> SaveContext<'tcx> { } } - pub fn get_field_data(&self, field: &hir::StructField<'_>, scope: hir::HirId) -> Option { + pub fn get_field_data(&self, field: &hir::FieldDef<'_>, scope: hir::HirId) -> Option { let name = field.ident.to_string(); let scope_def_id = self.tcx.hir().local_def_id(scope).to_def_id(); let qualname = format!("::{}::{}", self.tcx.def_path_str(scope_def_id), field.ident); @@ -383,6 +389,7 @@ impl<'tcx> SaveContext<'tcx> { let id = id_from_def_id(field_def_id); let span = self.span_from_span(field.ident.span); + let attrs = self.tcx.hir().attrs(field.hir_id); Some(Def { kind: DefKind::Field, @@ -394,9 +401,9 @@ impl<'tcx> SaveContext<'tcx> { parent: Some(id_from_def_id(scope_def_id)), children: vec![], decl_id: None, - docs: self.docs_for_attrs(&field.attrs), + docs: self.docs_for_attrs(attrs), sig: sig::field_signature(field, self), - attributes: lower_attributes(field.attrs.to_vec(), self), + attributes: lower_attributes(attrs.to_vec(), self), }) } @@ -420,9 +427,9 @@ impl<'tcx> SaveContext<'tcx> { let trait_id = self.tcx.trait_id_of_impl(impl_id); let mut docs = String::new(); let mut attrs = vec![]; - if let Some(Node::ImplItem(item)) = hir.find(hir_id) { - docs = self.docs_for_attrs(&item.attrs); - attrs = item.attrs.to_vec(); + if let Some(Node::ImplItem(_)) = hir.find(hir_id) { + attrs = self.tcx.hir().attrs(hir_id).to_vec(); + docs = self.docs_for_attrs(&attrs); } let mut decl_id = None; @@ -466,9 +473,9 @@ impl<'tcx> SaveContext<'tcx> { let mut docs = String::new(); let mut attrs = vec![]; - if let Some(Node::TraitItem(item)) = self.tcx.hir().find(hir_id) { - docs = self.docs_for_attrs(&item.attrs); - attrs = item.attrs.to_vec(); + if let Some(Node::TraitItem(_)) = self.tcx.hir().find(hir_id) { + attrs = self.tcx.hir().attrs(hir_id).to_vec(); + docs = self.docs_for_attrs(&attrs); } ( @@ -762,7 +769,7 @@ impl<'tcx> SaveContext<'tcx> { pub fn get_field_ref_data( &self, - field_ref: &hir::Field<'_>, + field_ref: &hir::ExprField<'_>, variant: &ty::VariantDef, ) -> Option { filter!(self.span_utils, field_ref.ident.span); diff --git a/compiler/rustc_save_analysis/src/sig.rs b/compiler/rustc_save_analysis/src/sig.rs index 8ada7e34fe..53150a9266 100644 --- a/compiler/rustc_save_analysis/src/sig.rs +++ b/compiler/rustc_save_analysis/src/sig.rs @@ -55,7 +55,7 @@ pub fn foreign_item_signature( /// Signature for a struct or tuple field declaration. /// Does not include a trailing comma. -pub fn field_signature(field: &hir::StructField<'_>, scx: &SaveContext<'_>) -> Option { +pub fn field_signature(field: &hir::FieldDef<'_>, scx: &SaveContext<'_>) -> Option { if !scx.config.signatures { return None; } @@ -317,8 +317,8 @@ impl<'hir> Sig for hir::Ty<'hir> { Ok(replace_text(nested_ty, text)) } hir::TyKind::OpaqueDef(item_id, _) => { - let item = scx.tcx.hir().item(item_id.id); - item.make(offset, Some(item_id.id), scx) + let item = scx.tcx.hir().item(item_id); + item.make(offset, Some(item_id.hir_id()), scx) } hir::TyKind::Typeof(_) | hir::TyKind::Infer | hir::TyKind::Err => Err("Ty"), } @@ -327,7 +327,7 @@ impl<'hir> Sig for hir::Ty<'hir> { impl<'hir> Sig for hir::Item<'hir> { fn make(&self, offset: usize, _parent_id: Option, scx: &SaveContext<'_>) -> Result { - let id = Some(self.hir_id); + let id = Some(self.hir_id()); match self.kind { hir::ItemKind::Static(ref ty, m, ref body) => { @@ -337,7 +337,7 @@ impl<'hir> Sig for hir::Item<'hir> { } let name = self.ident.to_string(); let defs = vec![SigElement { - id: id_from_hir_id(self.hir_id, scx), + id: id_from_def_id(self.def_id.to_def_id()), start: offset + text.len(), end: offset + text.len() + name.len(), }]; @@ -359,7 +359,7 @@ impl<'hir> Sig for hir::Item<'hir> { let mut text = "const ".to_owned(); let name = self.ident.to_string(); let defs = vec![SigElement { - id: id_from_hir_id(self.hir_id, scx), + id: id_from_def_id(self.def_id.to_def_id()), start: offset + text.len(), end: offset + text.len() + name.len(), }]; @@ -391,7 +391,7 @@ impl<'hir> Sig for hir::Item<'hir> { text.push_str("fn "); let mut sig = - name_and_generics(text, offset, generics, self.hir_id, self.ident, scx)?; + name_and_generics(text, offset, generics, self.hir_id(), self.ident, scx)?; sig.text.push('('); for i in decl.inputs { @@ -420,7 +420,7 @@ impl<'hir> Sig for hir::Item<'hir> { let mut text = "mod ".to_owned(); let name = self.ident.to_string(); let defs = vec![SigElement { - id: id_from_hir_id(self.hir_id, scx), + id: id_from_def_id(self.def_id.to_def_id()), start: offset + text.len(), end: offset + text.len() + name.len(), }]; @@ -433,7 +433,7 @@ impl<'hir> Sig for hir::Item<'hir> { hir::ItemKind::TyAlias(ref ty, ref generics) => { let text = "type ".to_owned(); let mut sig = - name_and_generics(text, offset, generics, self.hir_id, self.ident, scx)?; + name_and_generics(text, offset, generics, self.hir_id(), self.ident, scx)?; sig.text.push_str(" = "); let ty = ty.make(offset + sig.text.len(), id, scx)?; @@ -445,21 +445,21 @@ impl<'hir> Sig for hir::Item<'hir> { hir::ItemKind::Enum(_, ref generics) => { let text = "enum ".to_owned(); let mut sig = - name_and_generics(text, offset, generics, self.hir_id, self.ident, scx)?; + name_and_generics(text, offset, generics, self.hir_id(), self.ident, scx)?; sig.text.push_str(" {}"); Ok(sig) } hir::ItemKind::Struct(_, ref generics) => { let text = "struct ".to_owned(); let mut sig = - name_and_generics(text, offset, generics, self.hir_id, self.ident, scx)?; + name_and_generics(text, offset, generics, self.hir_id(), self.ident, scx)?; sig.text.push_str(" {}"); Ok(sig) } hir::ItemKind::Union(_, ref generics) => { let text = "union ".to_owned(); let mut sig = - name_and_generics(text, offset, generics, self.hir_id, self.ident, scx)?; + name_and_generics(text, offset, generics, self.hir_id(), self.ident, scx)?; sig.text.push_str(" {}"); Ok(sig) } @@ -475,7 +475,7 @@ impl<'hir> Sig for hir::Item<'hir> { } text.push_str("trait "); let mut sig = - name_and_generics(text, offset, generics, self.hir_id, self.ident, scx)?; + name_and_generics(text, offset, generics, self.hir_id(), self.ident, scx)?; if !bounds.is_empty() { sig.text.push_str(": "); @@ -490,7 +490,7 @@ impl<'hir> Sig for hir::Item<'hir> { let mut text = String::new(); text.push_str("trait "); let mut sig = - name_and_generics(text, offset, generics, self.hir_id, self.ident, scx)?; + name_and_generics(text, offset, generics, self.hir_id(), self.ident, scx)?; if !bounds.is_empty() { sig.text.push_str(" = "); @@ -655,7 +655,7 @@ impl<'hir> Sig for hir::Generics<'hir> { } } -impl<'hir> Sig for hir::StructField<'hir> { +impl<'hir> Sig for hir::FieldDef<'hir> { fn make(&self, offset: usize, _parent_id: Option, scx: &SaveContext<'_>) -> Result { let mut text = String::new(); @@ -736,14 +736,14 @@ impl<'hir> Sig for hir::Variant<'hir> { impl<'hir> Sig for hir::ForeignItem<'hir> { fn make(&self, offset: usize, _parent_id: Option, scx: &SaveContext<'_>) -> Result { - let id = Some(self.hir_id); + let id = Some(self.hir_id()); match self.kind { hir::ForeignItemKind::Fn(decl, _, ref generics) => { let mut text = String::new(); text.push_str("fn "); let mut sig = - name_and_generics(text, offset, generics, self.hir_id, self.ident, scx)?; + name_and_generics(text, offset, generics, self.hir_id(), self.ident, scx)?; sig.text.push('('); for i in decl.inputs { @@ -774,7 +774,7 @@ impl<'hir> Sig for hir::ForeignItem<'hir> { } let name = self.ident.to_string(); let defs = vec![SigElement { - id: id_from_hir_id(self.hir_id, scx), + id: id_from_def_id(self.def_id.to_def_id()), start: offset + text.len(), end: offset + text.len() + name.len(), }]; @@ -790,7 +790,7 @@ impl<'hir> Sig for hir::ForeignItem<'hir> { let mut text = "type ".to_owned(); let name = self.ident.to_string(); let defs = vec![SigElement { - id: id_from_hir_id(self.hir_id, scx), + id: id_from_def_id(self.def_id.to_def_id()), start: offset + text.len(), end: offset + text.len() + name.len(), }]; diff --git a/compiler/rustc_serialize/Cargo.toml b/compiler/rustc_serialize/Cargo.toml index 16c5dff734..05fc6a4e11 100644 --- a/compiler/rustc_serialize/Cargo.toml +++ b/compiler/rustc_serialize/Cargo.toml @@ -6,7 +6,7 @@ edition = "2018" [dependencies] indexmap = "1" -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } [dev-dependencies] rustc_macros = { path = "../rustc_macros" } diff --git a/compiler/rustc_serialize/src/lib.rs b/compiler/rustc_serialize/src/lib.rs index 53c3adcc20..e439ddcdaa 100644 --- a/compiler/rustc_serialize/src/lib.rs +++ b/compiler/rustc_serialize/src/lib.rs @@ -13,7 +13,6 @@ Core encoding and decoding interfaces. #![feature(never_type)] #![feature(nll)] #![feature(associated_type_bounds)] -#![cfg_attr(bootstrap, feature(min_const_generics))] #![feature(min_specialization)] #![feature(vec_spare_capacity)] #![feature(core_intrinsics)] diff --git a/compiler/rustc_session/src/config.rs b/compiler/rustc_session/src/config.rs index a6d4dcb34c..75078a1231 100644 --- a/compiler/rustc_session/src/config.rs +++ b/compiler/rustc_session/src/config.rs @@ -15,6 +15,8 @@ use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; use rustc_target::abi::{Align, TargetDataLayout}; use rustc_target::spec::{SplitDebuginfo, Target, TargetTriple}; +use rustc_serialize::json; + use crate::parse::CrateConfig; use rustc_feature::UnstableFeatures; use rustc_span::edition::{Edition, DEFAULT_EDITION, EDITION_NAME_LIST}; @@ -41,6 +43,7 @@ bitflags! { const LEAK = 1 << 1; const MEMORY = 1 << 2; const THREAD = 1 << 3; + const HWADDRESS = 1 << 4; } } @@ -54,6 +57,7 @@ impl fmt::Display for SanitizerSet { SanitizerSet::LEAK => "leak", SanitizerSet::MEMORY => "memory", SanitizerSet::THREAD => "thread", + SanitizerSet::HWADDRESS => "hwaddress", _ => panic!("unrecognized sanitizer {:?}", s), }; if !first { @@ -71,12 +75,18 @@ impl IntoIterator for SanitizerSet { type IntoIter = std::vec::IntoIter; fn into_iter(self) -> Self::IntoIter { - [SanitizerSet::ADDRESS, SanitizerSet::LEAK, SanitizerSet::MEMORY, SanitizerSet::THREAD] - .iter() - .copied() - .filter(|&s| self.contains(s)) - .collect::>() - .into_iter() + [ + SanitizerSet::ADDRESS, + SanitizerSet::LEAK, + SanitizerSet::MEMORY, + SanitizerSet::THREAD, + SanitizerSet::HWADDRESS, + ] + .iter() + .copied() + .filter(|&s| self.contains(s)) + .collect::>() + .into_iter() } } @@ -408,6 +418,9 @@ impl OutputTypes { #[derive(Clone)] pub struct Externs(BTreeMap); +#[derive(Clone)] +pub struct ExternDepSpecs(BTreeMap); + #[derive(Clone, Debug)] pub struct ExternEntry { pub location: ExternLocation, @@ -439,6 +452,27 @@ pub enum ExternLocation { ExactPaths(BTreeSet), } +/// Supplied source location of a dependency - for example in a build specification +/// file like Cargo.toml. We support several syntaxes: if it makes sense to reference +/// a file and line, then the build system can specify that. On the other hand, it may +/// make more sense to have an arbitrary raw string. +#[derive(Clone, PartialEq)] +pub enum ExternDepSpec { + /// Raw string + Raw(String), + /// Raw data in json format + Json(json::Json), +} + +impl<'a> From<&'a ExternDepSpec> for rustc_lint_defs::ExternDepSpec { + fn from(from: &'a ExternDepSpec) -> Self { + match from { + ExternDepSpec::Raw(s) => rustc_lint_defs::ExternDepSpec::Raw(s.clone()), + ExternDepSpec::Json(json) => rustc_lint_defs::ExternDepSpec::Json(json.clone()), + } + } +} + impl Externs { pub fn new(data: BTreeMap) -> Externs { Externs(data) @@ -466,6 +500,25 @@ impl ExternEntry { } } +impl ExternDepSpecs { + pub fn new(data: BTreeMap) -> ExternDepSpecs { + ExternDepSpecs(data) + } + + pub fn get(&self, key: &str) -> Option<&ExternDepSpec> { + self.0.get(key) + } +} + +impl fmt::Display for ExternDepSpec { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { + match self { + ExternDepSpec::Raw(raw) => fmt.write_str(raw), + ExternDepSpec::Json(json) => json::as_json(json).fmt(fmt), + } + } +} + #[derive(Copy, Clone, PartialEq, Eq, Debug)] pub enum PrintRequest { FileNames, @@ -614,17 +667,6 @@ impl OutputFilenames { path } - /// Returns the name of the Split DWARF file - this can differ depending on which Split DWARF - /// mode is being used, which is the logic that this function is intended to encapsulate. - pub fn split_dwarf_filename( - &self, - split_debuginfo_kind: SplitDebuginfo, - cgu_name: Option<&str>, - ) -> Option { - self.split_dwarf_path(split_debuginfo_kind, cgu_name) - .map(|path| path.strip_prefix(&self.out_directory).unwrap_or(&path).to_path_buf()) - } - /// Returns the path for the Split DWARF file - this can differ depending on which Split DWARF /// mode is being used, which is the logic that this function is intended to encapsulate. pub fn split_dwarf_path( @@ -679,6 +721,7 @@ impl Default for Options { cg: basic_codegen_options(), error_format: ErrorOutputType::default(), externs: Externs(BTreeMap::new()), + extern_dep_specs: ExternDepSpecs(BTreeMap::new()), crate_name: None, alt_std_name: None, libs: Vec::new(), @@ -1105,6 +1148,12 @@ pub fn rustc_optgroups() -> Vec { "Specify where an external rust library is located", "NAME[=PATH]", ), + opt::multi_s( + "", + "extern-location", + "Location where an external crate dependency is specified", + "NAME=LOCATION", + ), opt::opt_s("", "sysroot", "Override the system root", "PATH"), opt::multi("Z", "", "Set internal debugging options", "FLAG"), opt::opt_s( @@ -1487,7 +1536,7 @@ fn parse_target_triple(matches: &getopts::Matches, error_format: ErrorOutputType early_error(error_format, &format!("target file {:?} does not exist", path)) }) } - Some(target) => TargetTriple::from_alias(target), + Some(target) => TargetTriple::TargetTriple(target), _ => TargetTriple::from_triple(host_triple()), } } @@ -1727,6 +1776,68 @@ pub fn parse_externs( Externs(externs) } +fn parse_extern_dep_specs( + matches: &getopts::Matches, + debugging_opts: &DebuggingOptions, + error_format: ErrorOutputType, +) -> ExternDepSpecs { + let is_unstable_enabled = debugging_opts.unstable_options; + let mut map = BTreeMap::new(); + + for arg in matches.opt_strs("extern-location") { + if !is_unstable_enabled { + early_error( + error_format, + "`--extern-location` option is unstable: set `-Z unstable-options`", + ); + } + + let mut parts = arg.splitn(2, '='); + let name = parts.next().unwrap_or_else(|| { + early_error(error_format, "`--extern-location` value must not be empty") + }); + let loc = parts.next().unwrap_or_else(|| { + early_error( + error_format, + &format!("`--extern-location`: specify location for extern crate `{}`", name), + ) + }); + + let locparts: Vec<_> = loc.split(":").collect(); + let spec = match &locparts[..] { + ["raw", ..] => { + // Don't want `:` split string + let raw = loc.splitn(2, ':').nth(1).unwrap_or_else(|| { + early_error(error_format, "`--extern-location`: missing `raw` location") + }); + ExternDepSpec::Raw(raw.to_string()) + } + ["json", ..] => { + // Don't want `:` split string + let raw = loc.splitn(2, ':').nth(1).unwrap_or_else(|| { + early_error(error_format, "`--extern-location`: missing `json` location") + }); + let json = json::from_str(raw).unwrap_or_else(|_| { + early_error( + error_format, + &format!("`--extern-location`: malformed json location `{}`", raw), + ) + }); + ExternDepSpec::Json(json) + } + [bad, ..] => early_error( + error_format, + &format!("unknown location type `{}`: use `raw` or `json`", bad), + ), + [] => early_error(error_format, "missing location specification"), + }; + + map.insert(name.to_string(), spec); + } + + ExternDepSpecs::new(map) +} + fn parse_remap_path_prefix( matches: &getopts::Matches, error_format: ErrorOutputType, @@ -1826,23 +1937,6 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options { } Some(SymbolManglingVersion::V0) => {} } - - if debugging_opts.mir_opt_level > 1 { - // Functions inlined during MIR transform can, at best, make it impossible to - // effectively cover inlined functions, and, at worst, break coverage map generation - // during LLVM codegen. For example, function counter IDs are only unique within a - // function. Inlining after these counters are injected can produce duplicate counters, - // resulting in an invalid coverage map (and ICE); so this option combination is not - // allowed. - early_warn( - error_format, - &format!( - "`-Z mir-opt-level={}` (or any level > 1) enables function inlining, which \ - is incompatible with `-Z instrument-coverage`. Inlining will be disabled.", - debugging_opts.mir_opt_level, - ), - ); - } } if let Ok(graphviz_font) = std::env::var("RUSTC_GRAPHVIZ_FONT") { @@ -1888,6 +1982,7 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options { } let externs = parse_externs(matches, &debugging_opts, error_format); + let extern_dep_specs = parse_extern_dep_specs(matches, &debugging_opts, error_format); let crate_name = matches.opt_str("crate-name"); @@ -1924,6 +2019,7 @@ pub fn build_session_options(matches: &getopts::Matches) -> Options { error_format, externs, unstable_features: UnstableFeatures::from_environment(crate_name.as_deref()), + extern_dep_specs, crate_name, alt_std_name: None, libs, @@ -1944,40 +2040,24 @@ fn parse_pretty( debugging_opts: &DebuggingOptions, efmt: ErrorOutputType, ) -> Option { - let pretty = if debugging_opts.unstable_options { - matches.opt_default("pretty", "normal").map(|a| { - // stable pretty-print variants only - parse_pretty_inner(efmt, &a, false) - }) - } else { - None - }; - - return if pretty.is_none() { - debugging_opts.unpretty.as_ref().map(|a| { - // extended with unstable pretty-print variants - parse_pretty_inner(efmt, &a, true) - }) - } else { - pretty - }; - fn parse_pretty_inner(efmt: ErrorOutputType, name: &str, extended: bool) -> PpMode { use PpMode::*; - use PpSourceMode::*; let first = match (name, extended) { - ("normal", _) => PpmSource(PpmNormal), - ("identified", _) => PpmSource(PpmIdentified), - ("everybody_loops", true) => PpmSource(PpmEveryBodyLoops), - ("expanded", _) => PpmSource(PpmExpanded), - ("expanded,identified", _) => PpmSource(PpmExpandedIdentified), - ("expanded,hygiene", _) => PpmSource(PpmExpandedHygiene), - ("hir", true) => PpmHir(PpmNormal), - ("hir,identified", true) => PpmHir(PpmIdentified), - ("hir,typed", true) => PpmHir(PpmTyped), - ("hir-tree", true) => PpmHirTree(PpmNormal), - ("mir", true) => PpmMir, - ("mir-cfg", true) => PpmMirCFG, + ("normal", _) => Source(PpSourceMode::Normal), + ("identified", _) => Source(PpSourceMode::Identified), + ("everybody_loops", true) => Source(PpSourceMode::EveryBodyLoops), + ("expanded", _) => Source(PpSourceMode::Expanded), + ("expanded,identified", _) => Source(PpSourceMode::ExpandedIdentified), + ("expanded,hygiene", _) => Source(PpSourceMode::ExpandedHygiene), + ("ast-tree", true) => AstTree(PpAstTreeMode::Normal), + ("ast-tree,expanded", true) => AstTree(PpAstTreeMode::Expanded), + ("hir", true) => Hir(PpHirMode::Normal), + ("hir,identified", true) => Hir(PpHirMode::Identified), + ("hir,typed", true) => Hir(PpHirMode::Typed), + ("hir-tree", true) => HirTree, + ("thir-tree", true) => ThirTree, + ("mir", true) => Mir, + ("mir-cfg", true) => MirCFG, _ => { if extended { early_error( @@ -1986,8 +2066,8 @@ fn parse_pretty( "argument to `unpretty` must be one of `normal`, \ `expanded`, `identified`, `expanded,identified`, \ `expanded,hygiene`, `everybody_loops`, \ - `hir`, `hir,identified`, `hir,typed`, `hir-tree`, \ - `mir` or `mir-cfg`; got {}", + `ast-tree`, `ast-tree,expanded`, `hir`, `hir,identified`, \ + `hir,typed`, `hir-tree`, `mir` or `mir-cfg`; got {}", name ), ); @@ -2006,6 +2086,18 @@ fn parse_pretty( tracing::debug!("got unpretty option: {:?}", first); first } + + if debugging_opts.unstable_options { + if let Some(a) = matches.opt_default("pretty", "normal") { + // stable pretty-print variants only + return Some(parse_pretty_inner(efmt, &a, false)); + } + } + + debugging_opts.unpretty.as_ref().map(|a| { + // extended with unstable pretty-print variants + parse_pretty_inner(efmt, &a, true) + }) } pub fn make_crate_type_option() -> RustcOptGroup { @@ -2113,22 +2205,54 @@ impl fmt::Display for CrateType { #[derive(Copy, Clone, PartialEq, Debug)] pub enum PpSourceMode { - PpmNormal, - PpmEveryBodyLoops, - PpmExpanded, - PpmIdentified, - PpmExpandedIdentified, - PpmExpandedHygiene, - PpmTyped, + /// `--pretty=normal` + Normal, + /// `-Zunpretty=everybody_loops` + EveryBodyLoops, + /// `--pretty=expanded` + Expanded, + /// `--pretty=identified` + Identified, + /// `--pretty=expanded,identified` + ExpandedIdentified, + /// `--pretty=expanded,hygiene` + ExpandedHygiene, +} + +#[derive(Copy, Clone, PartialEq, Debug)] +pub enum PpAstTreeMode { + /// `-Zunpretty=ast` + Normal, + /// `-Zunpretty=ast,expanded` + Expanded, +} + +#[derive(Copy, Clone, PartialEq, Debug)] +pub enum PpHirMode { + /// `-Zunpretty=hir` + Normal, + /// `-Zunpretty=hir,identified` + Identified, + /// `-Zunpretty=hir,typed` + Typed, } #[derive(Copy, Clone, PartialEq, Debug)] pub enum PpMode { - PpmSource(PpSourceMode), - PpmHir(PpSourceMode), - PpmHirTree(PpSourceMode), - PpmMir, - PpmMirCFG, + /// Options that print the source code, i.e. + /// `--pretty` and `-Zunpretty=everybody_loops` + Source(PpSourceMode), + AstTree(PpAstTreeMode), + /// Options that print the HIR, i.e. `-Zunpretty=hir` + Hir(PpHirMode), + /// `-Zunpretty=hir-tree` + HirTree, + /// `-Zunpretty=thir-tree` + ThirTree, + /// `-Zunpretty=mir` + Mir, + /// `-Zunpretty=mir-cfg` + MirCFG, } impl PpMode { @@ -2136,22 +2260,21 @@ impl PpMode { use PpMode::*; use PpSourceMode::*; match *self { - PpmSource(PpmNormal | PpmIdentified) => false, - - PpmSource( - PpmExpanded | PpmEveryBodyLoops | PpmExpandedIdentified | PpmExpandedHygiene, - ) - | PpmHir(_) - | PpmHirTree(_) - | PpmMir - | PpmMirCFG => true, - PpmSource(PpmTyped) => panic!("invalid state"), + Source(Normal | Identified) | AstTree(PpAstTreeMode::Normal) => false, + + Source(Expanded | EveryBodyLoops | ExpandedIdentified | ExpandedHygiene) + | AstTree(PpAstTreeMode::Expanded) + | Hir(_) + | HirTree + | ThirTree + | Mir + | MirCFG => true, } } pub fn needs_analysis(&self) -> bool { use PpMode::*; - matches!(*self, PpmMir | PpmMirCFG) + matches!(*self, Mir | MirCFG) } } @@ -2189,6 +2312,7 @@ crate mod dep_tracking { use std::collections::hash_map::DefaultHasher; use std::collections::BTreeMap; use std::hash::Hash; + use std::num::NonZeroUsize; use std::path::PathBuf; pub trait DepTrackingHash { @@ -2229,6 +2353,7 @@ crate mod dep_tracking { impl_dep_tracking_hash_via_hash!(lint::Level); impl_dep_tracking_hash_via_hash!(Option); impl_dep_tracking_hash_via_hash!(Option); + impl_dep_tracking_hash_via_hash!(Option); impl_dep_tracking_hash_via_hash!(Option); impl_dep_tracking_hash_via_hash!(Option<(String, u64)>); impl_dep_tracking_hash_via_hash!(Option>); diff --git a/compiler/rustc_session/src/filesearch.rs b/compiler/rustc_session/src/filesearch.rs index 47f14fa6b7..2df326628e 100644 --- a/compiler/rustc_session/src/filesearch.rs +++ b/compiler/rustc_session/src/filesearch.rs @@ -169,7 +169,7 @@ pub fn get_or_default_sysroot() -> PathBuf { // Check if sysroot is found using env::args().next(), and if is not found, // use env::current_exe() to imply sysroot. - from_env_args_next().unwrap_or(from_current_exe()) + from_env_args_next().unwrap_or_else(from_current_exe) } // The name of the directory rustc expects libraries to be located. diff --git a/compiler/rustc_session/src/lib.rs b/compiler/rustc_session/src/lib.rs index 36bf8634c6..7eaeae504e 100644 --- a/compiler/rustc_session/src/lib.rs +++ b/compiler/rustc_session/src/lib.rs @@ -1,7 +1,7 @@ #![feature(crate_visibility_modifier)] #![feature(once_cell)] #![feature(or_patterns)] -#![feature(str_split_once)] +#![recursion_limit = "256"] #[macro_use] extern crate bitflags; diff --git a/compiler/rustc_session/src/options.rs b/compiler/rustc_session/src/options.rs index 779e042163..d9e5a18607 100644 --- a/compiler/rustc_session/src/options.rs +++ b/compiler/rustc_session/src/options.rs @@ -16,6 +16,7 @@ use std::collections::BTreeMap; use std::collections::hash_map::DefaultHasher; use std::hash::Hasher; +use std::num::NonZeroUsize; use std::path::PathBuf; use std::str; @@ -112,6 +113,7 @@ top_level_options!( borrowck_mode: BorrowckMode [UNTRACKED], cg: CodegenOptions [TRACKED], externs: Externs [UNTRACKED], + extern_dep_specs: ExternDepSpecs [UNTRACKED], crate_name: Option [TRACKED], // An optional name to use as the crate for std during std injection, // written `extern crate name as std`. Defaults to `std`. Used by @@ -252,7 +254,7 @@ macro_rules! options { pub const parse_passes: &str = "a space-separated list of passes, or `all`"; pub const parse_panic_strategy: &str = "either `unwind` or `abort`"; pub const parse_relro_level: &str = "one of: `full`, `partial`, or `off`"; - pub const parse_sanitizers: &str = "comma separated list of sanitizers: `address`, `leak`, `memory` or `thread`"; + pub const parse_sanitizers: &str = "comma separated list of sanitizers: `address`, `hwaddress`, `leak`, `memory` or `thread`"; pub const parse_sanitizer_memory_track_origins: &str = "0, 1, or 2"; pub const parse_cfguard: &str = "either a boolean (`yes`, `no`, `on`, `off`, etc), `checks`, or `nochecks`"; @@ -475,6 +477,7 @@ macro_rules! options { "leak" => SanitizerSet::LEAK, "memory" => SanitizerSet::MEMORY, "thread" => SanitizerSet::THREAD, + "hwaddress" => SanitizerSet::HWADDRESS, _ => return false, } } @@ -589,10 +592,10 @@ macro_rules! options { true } - fn parse_treat_err_as_bug(slot: &mut Option, v: Option<&str>) -> bool { + fn parse_treat_err_as_bug(slot: &mut Option, v: Option<&str>) -> bool { match v { - Some(s) => { *slot = s.parse().ok().filter(|&x| x != 0); slot.unwrap_or(0) != 0 } - None => { *slot = Some(1); true } + Some(s) => { *slot = s.parse().ok(); slot.is_some() } + None => { *slot = NonZeroUsize::new(1); true } } } @@ -954,18 +957,16 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, (default: no)"), incremental_verify_ich: bool = (false, parse_bool, [UNTRACKED], "verify incr. comp. hashes of green query instances (default: no)"), - inline_mir_threshold: usize = (50, parse_uint, [TRACKED], + inline_mir: Option = (None, parse_opt_bool, [TRACKED], + "enable MIR inlining (default: no)"), + inline_mir_threshold: Option = (None, parse_opt_uint, [TRACKED], "a default MIR inlining threshold (default: 50)"), - inline_mir_hint_threshold: usize = (100, parse_uint, [TRACKED], + inline_mir_hint_threshold: Option = (None, parse_opt_uint, [TRACKED], "inlining threshold for functions with inline hint (default: 100)"), inline_in_all_cgus: Option = (None, parse_opt_bool, [TRACKED], "control whether `#[inline]` functions are in all CGUs"), input_stats: bool = (false, parse_bool, [UNTRACKED], "gather statistics about the input (default: no)"), - insert_sideeffect: bool = (false, parse_bool, [TRACKED], - "fix undefined behavior when a thread doesn't eventually make progress \ - (such as entering an empty infinite loop) by inserting llvm.sideeffect \ - (default: no)"), instrument_coverage: bool = (false, parse_bool, [TRACKED], "instrument the generated code to support LLVM source-based code coverage \ reports (note, the compiler build config must include `profiler = true`, \ @@ -994,8 +995,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, mir_emit_retag: bool = (false, parse_bool, [TRACKED], "emit Retagging MIR statements, interpreted e.g., by miri; implies -Zmir-opt-level=0 \ (default: no)"), - mir_opt_level: usize = (1, parse_uint, [TRACKED], - "MIR optimization level (0-3; default: 1)"), + mir_opt_level: Option = (None, parse_opt_uint, [TRACKED], + "MIR optimization level (0-4; default: 1 in non optimized builds and 2 in optimized builds)"), mutable_noalias: bool = (false, parse_bool, [TRACKED], "emit noalias metadata for mutable references (default: no)"), new_llvm_pass_manager: bool = (false, parse_bool, [TRACKED], @@ -1139,7 +1140,7 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, "for every macro invocation, print its name and arguments (default: no)"), trap_unreachable: Option = (None, parse_opt_bool, [TRACKED], "generate trap instructions for unreachable intrinsics (default: use target setting, usually yes)"), - treat_err_as_bug: Option = (None, parse_treat_err_as_bug, [TRACKED], + treat_err_as_bug: Option = (None, parse_treat_err_as_bug, [TRACKED], "treat error number `val` that occurs as bug"), trim_diagnostic_paths: bool = (true, parse_bool, [UNTRACKED], "in diagnostics, use heuristics to shorten paths referring to items"), @@ -1153,6 +1154,8 @@ options! {DebuggingOptions, DebuggingSetter, basic_debugging_options, `expanded`, `expanded,identified`, `expanded,hygiene` (with internal representations), `everybody_loops` (all function bodies replaced with `loop {}`), + `ast-tree` (raw AST before expansion), + `ast-tree,expanded` (raw AST after expansion), `hir` (the HIR), `hir,identified`, `hir,typed` (HIR with types for each node), `hir-tree` (dump the raw HIR), diff --git a/compiler/rustc_session/src/parse.rs b/compiler/rustc_session/src/parse.rs index 81b3834741..592773bfe1 100644 --- a/compiler/rustc_session/src/parse.rs +++ b/compiler/rustc_session/src/parse.rs @@ -13,7 +13,6 @@ use rustc_span::hygiene::ExpnId; use rustc_span::source_map::{FilePathMapping, SourceMap}; use rustc_span::{MultiSpan, Span, Symbol}; -use std::path::PathBuf; use std::str; /// The set of keys (and, optionally, values) that define the compilation @@ -122,8 +121,6 @@ pub struct ParseSess { pub missing_fragment_specifiers: Lock>, /// Places where raw identifiers were used. This is used for feature-gating raw identifiers. pub raw_identifier_spans: Lock>, - /// Used to determine and report recursive module inclusions. - pub included_mod_stack: Lock>, source_map: Lrc, pub buffered_lints: Lock>, /// Contains the spans of block expressions that could have been incomplete based on the @@ -157,7 +154,6 @@ impl ParseSess { edition: ExpnId::root().expn_data().edition, missing_fragment_specifiers: Default::default(), raw_identifier_spans: Lock::new(Vec::new()), - included_mod_stack: Lock::new(vec![]), source_map, buffered_lints: Lock::new(vec![]), ambiguous_block_expr_parse: Lock::new(FxHashMap::default()), diff --git a/compiler/rustc_session/src/session.rs b/compiler/rustc_session/src/session.rs index 69aa72d899..fc57b6b8ac 100644 --- a/compiler/rustc_session/src/session.rs +++ b/compiler/rustc_session/src/session.rs @@ -8,7 +8,6 @@ use crate::parse::ParseSess; use crate::search_paths::{PathKind, SearchPath}; pub use rustc_ast::attr::MarkedAttrs; -pub use rustc_ast::crate_disambiguator::CrateDisambiguator; pub use rustc_ast::Attribute; use rustc_data_structures::flock; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; @@ -23,6 +22,7 @@ use rustc_errors::json::JsonEmitter; use rustc_errors::registry::Registry; use rustc_errors::{Applicability, Diagnostic, DiagnosticBuilder, DiagnosticId, ErrorReported}; use rustc_lint_defs::FutureBreakage; +pub use rustc_span::crate_disambiguator::CrateDisambiguator; use rustc_span::edition::Edition; use rustc_span::source_map::{FileLoader, MultiSpan, RealFileLoader, SourceMap, Span}; use rustc_span::{sym, SourceFileHashAlgorithm, Symbol}; @@ -77,6 +77,7 @@ impl Limit { /// Check that `value` is within the limit. Ensures that the same comparisons are used /// throughout the compiler, as mismatches can cause ICEs, see #72540. + #[inline] pub fn value_within_limit(&self, value: usize) -> bool { value <= self.0 } @@ -347,10 +348,12 @@ impl Session { self.crate_types.set(crate_types).expect("`crate_types` was initialized twice") } + #[inline] pub fn recursion_limit(&self) -> Limit { self.recursion_limit.get().copied().unwrap() } + #[inline] pub fn type_length_limit(&self) -> Limit { self.type_length_limit.get().copied().unwrap() } @@ -637,6 +640,12 @@ impl Session { pub fn binary_dep_depinfo(&self) -> bool { self.opts.debugging_opts.binary_dep_depinfo } + pub fn mir_opt_level(&self) -> usize { + self.opts + .debugging_opts + .mir_opt_level + .unwrap_or_else(|| if self.opts.optimize != config::OptLevel::No { 2 } else { 1 }) + } /// Gets the features enabled for the current compilation session. /// DO NOT USE THIS METHOD if there is a TyCtxt available, as it circumvents @@ -784,6 +793,13 @@ impl Session { } } + pub fn inline_asm_dialect(&self) -> rustc_ast::LlvmAsmDialect { + match self.asm_arch { + Some(InlineAsmArch::X86 | InlineAsmArch::X86_64) => rustc_ast::LlvmAsmDialect::Intel, + _ => rustc_ast::LlvmAsmDialect::Att, + } + } + pub fn relocation_model(&self) -> RelocModel { self.opts.cg.relocation_model.unwrap_or(self.target.relocation_model) } @@ -959,19 +975,19 @@ impl Session { } pub fn print_perf_stats(&self) { - println!( + eprintln!( "Total time spent computing symbol hashes: {}", duration_to_secs_str(*self.perf_stats.symbol_hash_time.lock()) ); - println!( + eprintln!( "Total queries canonicalized: {}", self.perf_stats.queries_canonicalized.load(Ordering::Relaxed) ); - println!( + eprintln!( "normalize_generic_arg_after_erasing_regions: {}", self.perf_stats.normalize_generic_arg_after_erasing_regions.load(Ordering::Relaxed) ); - println!( + eprintln!( "normalize_projection_ty: {}", self.perf_stats.normalize_projection_ty.load(Ordering::Relaxed) ); @@ -1126,7 +1142,8 @@ impl Session { self.opts.optimize != config::OptLevel::No // AddressSanitizer uses lifetimes to detect use after scope bugs. // MemorySanitizer uses lifetimes to detect use of uninitialized stack variables. - || self.opts.debugging_opts.sanitizer.intersects(SanitizerSet::ADDRESS | SanitizerSet::MEMORY) + // HWAddressSanitizer will use lifetimes to detect use after scope bugs in the future. + || self.opts.debugging_opts.sanitizer.intersects(SanitizerSet::ADDRESS | SanitizerSet::MEMORY | SanitizerSet::HWADDRESS) } pub fn link_dead_code(&self) -> bool { @@ -1562,6 +1579,8 @@ fn validate_commandline_args_with_session_available(sess: &Session) { "x86_64-unknown-freebsd", "x86_64-unknown-linux-gnu", ]; + const HWASAN_SUPPORTED_TARGETS: &[&str] = + &["aarch64-linux-android", "aarch64-unknown-linux-gnu"]; // Sanitizers can only be used on some tested platforms. for s in sess.opts.debugging_opts.sanitizer { @@ -1570,6 +1589,7 @@ fn validate_commandline_args_with_session_available(sess: &Session) { SanitizerSet::LEAK => LSAN_SUPPORTED_TARGETS, SanitizerSet::MEMORY => MSAN_SUPPORTED_TARGETS, SanitizerSet::THREAD => TSAN_SUPPORTED_TARGETS, + SanitizerSet::HWADDRESS => HWASAN_SUPPORTED_TARGETS, _ => panic!("unrecognized sanitizer {}", s), }; if !supported_targets.contains(&&*sess.opts.target_triple.triple()) { diff --git a/compiler/rustc_ast/src/crate_disambiguator.rs b/compiler/rustc_span/src/crate_disambiguator.rs similarity index 100% rename from compiler/rustc_ast/src/crate_disambiguator.rs rename to compiler/rustc_span/src/crate_disambiguator.rs diff --git a/compiler/rustc_span/src/def_id.rs b/compiler/rustc_span/src/def_id.rs index b24ede9c53..885f30ebb4 100644 --- a/compiler/rustc_span/src/def_id.rs +++ b/compiler/rustc_span/src/def_id.rs @@ -1,3 +1,4 @@ +use crate::crate_disambiguator::CrateDisambiguator; use crate::HashStableContext; use rustc_data_structures::fingerprint::Fingerprint; use rustc_data_structures::stable_hasher::{HashStable, StableHasher}; @@ -105,10 +106,72 @@ impl ::std::fmt::Debug for CrateNum { } } +/// A `DefPathHash` is a fixed-size representation of a `DefPath` that is +/// stable across crate and compilation session boundaries. It consists of two +/// separate 64-bit hashes. The first uniquely identifies the crate this +/// `DefPathHash` originates from (see [StableCrateId]), and the second +/// uniquely identifies the corresponding `DefPath` within that crate. Together +/// they form a unique identifier within an entire crate graph. +/// +/// There is a very small chance of hash collisions, which would mean that two +/// different `DefPath`s map to the same `DefPathHash`. Proceeding compilation +/// with such a hash collision would very probably lead to an ICE, and in the +/// worst case lead to a silent mis-compilation. The compiler therefore actively +/// and exhaustively checks for such hash collisions and aborts compilation if +/// it finds one. +/// +/// `DefPathHash` uses 64-bit hashes for both the crate-id part and the +/// crate-internal part, even though it is likely that there are many more +/// `LocalDefId`s in a single crate than there are individual crates in a crate +/// graph. Since we use the same number of bits in both cases, the collision +/// probability for the crate-local part will be quite a bit higher (though +/// still very small). +/// +/// This imbalance is not by accident: A hash collision in the +/// crate-local part of a `DefPathHash` will be detected and reported while +/// compiling the crate in question. Such a collision does not depend on +/// outside factors and can be easily fixed by the crate maintainer (e.g. by +/// renaming the item in question or by bumping the crate version in a harmless +/// way). +/// +/// A collision between crate-id hashes on the other hand is harder to fix +/// because it depends on the set of crates in the entire crate graph of a +/// compilation session. Again, using the same crate with a different version +/// number would fix the issue with a high probability -- but that might be +/// easier said then done if the crates in questions are dependencies of +/// third-party crates. +/// +/// That being said, given a high quality hash function, the collision +/// probabilities in question are very small. For example, for a big crate like +/// `rustc_middle` (with ~50000 `LocalDefId`s as of the time of writing) there +/// is a probability of roughly 1 in 14,750,000,000 of a crate-internal +/// collision occurring. For a big crate graph with 1000 crates in it, there is +/// a probability of 1 in 36,890,000,000,000 of a `StableCrateId` collision. #[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Debug)] #[derive(HashStable_Generic, Encodable, Decodable)] pub struct DefPathHash(pub Fingerprint); +impl DefPathHash { + /// Returns the [StableCrateId] identifying the crate this [DefPathHash] + /// originates from. + #[inline] + pub fn stable_crate_id(&self) -> StableCrateId { + StableCrateId(self.0.as_value().0) + } + + /// Returns the crate-local part of the [DefPathHash]. + #[inline] + pub fn local_hash(&self) -> u64 { + self.0.as_value().1 + } + + /// Builds a new [DefPathHash] with the given [StableCrateId] and + /// `local_hash`, where `local_hash` must be unique within its crate. + pub fn new(stable_crate_id: StableCrateId, local_hash: u64) -> DefPathHash { + DefPathHash(Fingerprint::new(stable_crate_id.0, local_hash)) + } +} + impl Borrow for DefPathHash { #[inline] fn borrow(&self) -> &Fingerprint { @@ -116,6 +179,30 @@ impl Borrow for DefPathHash { } } +/// A [StableCrateId] is a 64 bit hash of `(crate-name, crate-disambiguator)`. It +/// is to [CrateNum] what [DefPathHash] is to [DefId]. It is stable across +/// compilation sessions. +/// +/// Since the ID is a hash value there is a (very small) chance that two crates +/// end up with the same [StableCrateId]. The compiler will check for such +/// collisions when loading crates and abort compilation in order to avoid +/// further trouble. +#[derive(Copy, Clone, Hash, PartialEq, Eq, PartialOrd, Ord, Debug, Encodable, Decodable)] +pub struct StableCrateId(u64); + +impl StableCrateId { + /// Computes the stable ID for a crate with the given name and + /// disambiguator. + pub fn new(crate_name: &str, crate_disambiguator: CrateDisambiguator) -> StableCrateId { + use std::hash::Hash; + + let mut hasher = StableHasher::new(); + crate_name.hash(&mut hasher); + crate_disambiguator.hash(&mut hasher); + StableCrateId(hasher.finish()) + } +} + rustc_index::newtype_index! { /// A DefIndex is an index into the hir-map for a crate, identifying a /// particular definition. It should really be considered an interned @@ -227,6 +314,8 @@ pub struct LocalDefId { pub local_def_index: DefIndex, } +pub const CRATE_DEF_ID: LocalDefId = LocalDefId { local_def_index: CRATE_DEF_INDEX }; + impl Idx for LocalDefId { #[inline] fn new(idx: usize) -> Self { @@ -268,6 +357,8 @@ impl Decodable for LocalDefId { } } +rustc_data_structures::define_id_collections!(LocalDefIdMap, LocalDefIdSet, LocalDefId); + impl HashStable for DefId { fn hash_stable(&self, hcx: &mut CTX, hasher: &mut StableHasher) { hcx.hash_def_id(*self, hasher) diff --git a/compiler/rustc_span/src/edition.rs b/compiler/rustc_span/src/edition.rs index a9200dd7df..8544acd6d0 100644 --- a/compiler/rustc_span/src/edition.rs +++ b/compiler/rustc_span/src/edition.rs @@ -20,7 +20,7 @@ pub enum Edition { Edition2015, /// The 2018 edition Edition2018, - /// The 2021 ediiton + /// The 2021 edition Edition2021, } diff --git a/compiler/rustc_span/src/hygiene.rs b/compiler/rustc_span/src/hygiene.rs index 9f265f37f3..eb5b7c4a74 100644 --- a/compiler/rustc_span/src/hygiene.rs +++ b/compiler/rustc_span/src/hygiene.rs @@ -118,7 +118,8 @@ impl ExpnId { HygieneData::with(|data| { let old_expn_data = &mut data.expn_data[self.0 as usize]; assert!(old_expn_data.is_none(), "expansion data is reset for an expansion ID"); - expn_data.orig_id.replace(self.as_u32()).expect_none("orig_id should be None"); + assert_eq!(expn_data.orig_id, None); + expn_data.orig_id = Some(self.as_u32()); *old_expn_data = Some(expn_data); }); update_disambiguator(self) @@ -202,7 +203,8 @@ impl HygieneData { fn fresh_expn(&mut self, mut expn_data: Option) -> ExpnId { let raw_id = self.expn_data.len() as u32; if let Some(data) = expn_data.as_mut() { - data.orig_id.replace(raw_id).expect_none("orig_id should be None"); + assert_eq!(data.orig_id, None); + data.orig_id = Some(raw_id); } self.expn_data.push(expn_data); ExpnId(raw_id) @@ -1362,12 +1364,6 @@ fn update_disambiguator(expn_id: ExpnId) { fn hash_spans(&self) -> bool { true } - fn byte_pos_to_line_and_col( - &mut self, - byte: BytePos, - ) -> Option<(Lrc, usize, BytePos)> { - self.caching_source_map.byte_pos_to_line_and_col(byte) - } fn span_data_to_lines_and_cols( &mut self, span: &crate::SpanData, @@ -1405,8 +1401,8 @@ fn update_disambiguator(expn_id: ExpnId) { }); if modified { - info!("Set disambiguator for {:?} (hash {:?})", expn_id, first_hash); - info!("expn_data = {:?}", expn_id.expn_data()); + debug!("Set disambiguator for {:?} (hash {:?})", expn_id, first_hash); + debug!("expn_data = {:?}", expn_id.expn_data()); // Verify that the new disambiguator makes the hash unique #[cfg(debug_assertions)] @@ -1416,9 +1412,11 @@ fn update_disambiguator(expn_id: ExpnId) { let new_hash: Fingerprint = hasher.finish(); HygieneData::with(|data| { - data.expn_data_disambiguators - .get(&new_hash) - .expect_none("Hash collision after disambiguator update!"); + assert_eq!( + data.expn_data_disambiguators.get(&new_hash), + None, + "Hash collision after disambiguator update!", + ); }); }; } diff --git a/compiler/rustc_span/src/lib.rs b/compiler/rustc_span/src/lib.rs index f3d876a577..d2790335b5 100644 --- a/compiler/rustc_span/src/lib.rs +++ b/compiler/rustc_span/src/lib.rs @@ -21,7 +21,6 @@ #![feature(negative_impls)] #![feature(nll)] #![feature(min_specialization)] -#![feature(option_expect_none)] #[macro_use] extern crate rustc_macros; @@ -47,6 +46,8 @@ pub mod lev_distance; mod span_encoding; pub use span_encoding::{Span, DUMMY_SP}; +pub mod crate_disambiguator; + pub mod symbol; pub use symbol::{sym, Symbol}; @@ -509,11 +510,10 @@ impl Span { /// items can be used (that is, a macro marked with /// `#[allow_internal_unstable]`). pub fn allows_unstable(&self, feature: Symbol) -> bool { - self.ctxt().outer_expn_data().allow_internal_unstable.map_or(false, |features| { - features - .iter() - .any(|&f| f == feature || f == sym::allow_internal_unstable_backcompat_hack) - }) + self.ctxt() + .outer_expn_data() + .allow_internal_unstable + .map_or(false, |features| features.iter().any(|&f| f == feature)) } /// Checks if this span arises from a compiler desugaring of kind `kind`. @@ -1873,10 +1873,6 @@ pub trait HashStableContext { fn expn_id_cache() -> &'static LocalKey; fn hash_crate_num(&mut self, _: CrateNum, hasher: &mut StableHasher); fn hash_spans(&self) -> bool; - fn byte_pos_to_line_and_col( - &mut self, - byte: BytePos, - ) -> Option<(Lrc, usize, BytePos)>; fn span_data_to_lines_and_cols( &mut self, span: &SpanData, @@ -1905,9 +1901,10 @@ where return; } + self.ctxt().hash_stable(ctx, hasher); + if self.is_dummy() { Hash::hash(&TAG_INVALID_SPAN, hasher); - self.ctxt().hash_stable(ctx, hasher); return; } @@ -1920,7 +1917,6 @@ where Some(pos) => pos, None => { Hash::hash(&TAG_INVALID_SPAN, hasher); - span.ctxt.hash_stable(ctx, hasher); return; } }; @@ -1947,7 +1943,6 @@ where let len = (span.hi - span.lo).0; Hash::hash(&col_line, hasher); Hash::hash(&len, hasher); - span.ctxt.hash_stable(ctx, hasher); } } @@ -2000,7 +1995,8 @@ impl HashStable for ExpnId { if cache.len() < new_len { cache.resize(new_len, None); } - cache[index].replace(sub_hash).expect_none("Cache slot was filled"); + let prev = cache[index].replace(sub_hash); + assert_eq!(prev, None, "Cache slot was filled"); }); sub_hash.hash_stable(ctx, hasher); } diff --git a/compiler/rustc_span/src/source_map.rs b/compiler/rustc_span/src/source_map.rs index 2b429372dc..f612d1425b 100644 --- a/compiler/rustc_span/src/source_map.rs +++ b/compiler/rustc_span/src/source_map.rs @@ -453,41 +453,6 @@ impl SourceMap { } } - /// Returns `Some(span)`, a union of the LHS and RHS span. The LHS must precede the RHS. If - /// there are gaps between LHS and RHS, the resulting union will cross these gaps. - /// For this to work, - /// - /// * the syntax contexts of both spans much match, - /// * the LHS span needs to end on the same line the RHS span begins, - /// * the LHS span must start at or before the RHS span. - pub fn merge_spans(&self, sp_lhs: Span, sp_rhs: Span) -> Option { - // Ensure we're at the same expansion ID. - if sp_lhs.ctxt() != sp_rhs.ctxt() { - return None; - } - - let lhs_end = match self.lookup_line(sp_lhs.hi()) { - Ok(x) => x, - Err(_) => return None, - }; - let rhs_begin = match self.lookup_line(sp_rhs.lo()) { - Ok(x) => x, - Err(_) => return None, - }; - - // If we must cross lines to merge, don't merge. - if lhs_end.line != rhs_begin.line { - return None; - } - - // Ensure these follow the expected order and that we don't overlap. - if (sp_lhs.lo() <= sp_rhs.lo()) && (sp_lhs.hi() <= sp_rhs.lo()) { - Some(sp_lhs.to(sp_rhs)) - } else { - None - } - } - pub fn span_to_string(&self, sp: Span) -> String { if self.files.borrow().source_files.is_empty() && sp.is_dummy() { return "no-location".to_string(); @@ -539,7 +504,7 @@ impl SourceMap { pub fn is_line_before_span_empty(&self, sp: Span) -> bool { match self.span_to_prev_source(sp) { - Ok(s) => s.split('\n').last().map_or(false, |l| l.trim_start().is_empty()), + Ok(s) => s.rsplit_once('\n').unwrap_or(("", &s)).1.trim_start().is_empty(), Err(_) => false, } } @@ -632,10 +597,11 @@ impl SourceMap { pub fn span_to_margin(&self, sp: Span) -> Option { match self.span_to_prev_source(sp) { Err(_) => None, - Ok(source) => source - .split('\n') - .last() - .map(|last_line| last_line.len() - last_line.trim_start().len()), + Ok(source) => { + let last_line = source.rsplit_once('\n').unwrap_or(("", &source)).1; + + Some(last_line.len() - last_line.trim_start().len()) + } } } @@ -651,7 +617,7 @@ impl SourceMap { pub fn span_extend_to_prev_char(&self, sp: Span, c: char, accept_newlines: bool) -> Span { if let Ok(prev_source) = self.span_to_prev_source(sp) { let prev_source = prev_source.rsplit(c).next().unwrap_or(""); - if !prev_source.is_empty() && (!prev_source.contains('\n') || accept_newlines) { + if !prev_source.is_empty() && (accept_newlines || !prev_source.contains('\n')) { return sp.with_lo(BytePos(sp.lo().0 - prev_source.len() as u32)); } } @@ -673,7 +639,7 @@ impl SourceMap { let prev_source = prev_source.rsplit(&pat).next().unwrap_or("").trim_start(); if prev_source.is_empty() && sp.lo().0 != 0 { return sp.with_lo(BytePos(sp.lo().0 - 1)); - } else if !prev_source.contains('\n') || accept_newlines { + } else if accept_newlines || !prev_source.contains('\n') { return sp.with_lo(BytePos(sp.lo().0 - prev_source.len() as u32)); } } @@ -693,7 +659,7 @@ impl SourceMap { pub fn span_extend_to_next_char(&self, sp: Span, c: char, accept_newlines: bool) -> Span { if let Ok(next_source) = self.span_to_next_source(sp) { let next_source = next_source.split(c).next().unwrap_or(""); - if !next_source.is_empty() && (!next_source.contains('\n') || accept_newlines) { + if !next_source.is_empty() && (accept_newlines || !next_source.contains('\n')) { return sp.with_hi(BytePos(sp.hi().0 + next_source.len() as u32)); } } @@ -777,16 +743,35 @@ impl SourceMap { self.span_until_char(sp, '{') } - /// Returns a new span representing just the start point of this span. + /// Returns a new span representing just the first character of the given span. pub fn start_point(&self, sp: Span) -> Span { - let pos = sp.lo().0; - let width = self.find_width_of_character_at_span(sp, false); - let corrected_start_position = pos.checked_add(width).unwrap_or(pos); - let end_point = BytePos(cmp::max(corrected_start_position, sp.lo().0)); - sp.with_hi(end_point) + let width = { + let sp = sp.data(); + let local_begin = self.lookup_byte_offset(sp.lo); + let start_index = local_begin.pos.to_usize(); + let src = local_begin.sf.external_src.borrow(); + + let snippet = if let Some(ref src) = local_begin.sf.src { + Some(&src[start_index..]) + } else if let Some(src) = src.get_source() { + Some(&src[start_index..]) + } else { + None + }; + + match snippet { + None => 1, + Some(snippet) => match snippet.chars().next() { + None => 1, + Some(c) => c.len_utf8(), + }, + } + }; + + sp.with_hi(BytePos(sp.lo().0 + width as u32)) } - /// Returns a new span representing just the end point of this span. + /// Returns a new span representing just the last character of this span. pub fn end_point(&self, sp: Span) -> Span { let pos = sp.hi().0; @@ -815,7 +800,8 @@ impl SourceMap { Span::new(BytePos(start_of_next_point), end_of_next_point, sp.ctxt()) } - /// Finds the width of a character, either before or after the provided span. + /// Finds the width of the character, either before or after the end of provided span, + /// depending on the `forwards` parameter. fn find_width_of_character_at_span(&self, sp: Span, forwards: bool) -> u32 { let sp = sp.data(); if sp.lo == sp.hi { @@ -862,11 +848,9 @@ impl SourceMap { // We need to extend the snippet to the end of the src rather than to end_index so when // searching forwards for boundaries we've got somewhere to search. let snippet = if let Some(ref src) = local_begin.sf.src { - let len = src.len(); - &src[start_index..len] + &src[start_index..] } else if let Some(src) = src.get_source() { - let len = src.len(); - &src[start_index..len] + &src[start_index..] } else { return 1; }; @@ -912,13 +896,6 @@ impl SourceMap { SourceFileAndBytePos { sf, pos: offset } } - /// Converts an absolute `BytePos` to a `CharPos` relative to the `SourceFile`. - pub fn bytepos_to_file_charpos(&self, bpos: BytePos) -> CharPos { - let idx = self.lookup_source_file_idx(bpos); - let sf = &(*self.files.borrow().source_files)[idx]; - sf.bytepos_to_file_charpos(bpos) - } - // Returns the index of the `SourceFile` (in `self.files`) that contains `pos`. // This index is guaranteed to be valid for the lifetime of this `SourceMap`, // since `source_files` is a `MonotonicVec` diff --git a/compiler/rustc_span/src/source_map/tests.rs b/compiler/rustc_span/src/source_map/tests.rs index 3f22829b04..7d814f1d82 100644 --- a/compiler/rustc_span/src/source_map/tests.rs +++ b/compiler/rustc_span/src/source_map/tests.rs @@ -10,6 +10,50 @@ fn init_source_map() -> SourceMap { sm } +impl SourceMap { + /// Returns `Some(span)`, a union of the LHS and RHS span. The LHS must precede the RHS. If + /// there are gaps between LHS and RHS, the resulting union will cross these gaps. + /// For this to work, + /// + /// * the syntax contexts of both spans much match, + /// * the LHS span needs to end on the same line the RHS span begins, + /// * the LHS span must start at or before the RHS span. + fn merge_spans(&self, sp_lhs: Span, sp_rhs: Span) -> Option { + // Ensure we're at the same expansion ID. + if sp_lhs.ctxt() != sp_rhs.ctxt() { + return None; + } + + let lhs_end = match self.lookup_line(sp_lhs.hi()) { + Ok(x) => x, + Err(_) => return None, + }; + let rhs_begin = match self.lookup_line(sp_rhs.lo()) { + Ok(x) => x, + Err(_) => return None, + }; + + // If we must cross lines to merge, don't merge. + if lhs_end.line != rhs_begin.line { + return None; + } + + // Ensure these follow the expected order and that we don't overlap. + if (sp_lhs.lo() <= sp_rhs.lo()) && (sp_lhs.hi() <= sp_rhs.lo()) { + Some(sp_lhs.to(sp_rhs)) + } else { + None + } + } + + /// Converts an absolute `BytePos` to a `CharPos` relative to the `SourceFile`. + fn bytepos_to_file_charpos(&self, bpos: BytePos) -> CharPos { + let idx = self.lookup_source_file_idx(bpos); + let sf = &(*self.files.borrow().source_files)[idx]; + sf.bytepos_to_file_charpos(bpos) + } +} + /// Tests `lookup_byte_offset`. #[test] fn t3() { @@ -243,7 +287,7 @@ impl SourceMapExtension for SourceMap { substring: &str, n: usize, ) -> Span { - println!( + eprintln!( "span_substr(file={:?}/{:?}, substring={:?}, n={})", file.name, file.start_pos, substring, n ); diff --git a/compiler/rustc_span/src/symbol.rs b/compiler/rustc_span/src/symbol.rs index 86f8061a24..cd3dabb679 100644 --- a/compiler/rustc_span/src/symbol.rs +++ b/compiler/rustc_span/src/symbol.rs @@ -18,7 +18,7 @@ use crate::{Edition, Span, DUMMY_SP, SESSION_GLOBALS}; #[cfg(test)] mod tests; -// The proc macro code for this is in `src/librustc_macros/src/symbols.rs`. +// The proc macro code for this is in `compiler/rustc_macros/src/symbols.rs`. symbols! { // After modifying this list adjust `is_special`, `is_used_keyword`/`is_unused_keyword`, // this should be rarely necessary though if the keywords are kept in alphabetic order. @@ -126,6 +126,10 @@ symbols! { Argument, ArgumentV1, Arguments, + BTreeMap, + BTreeSet, + BinaryHeap, + Borrow, C, CString, Center, @@ -138,6 +142,7 @@ symbols! { Decodable, Decoder, Default, + Deref, Encodable, Encoder, Eq, @@ -163,16 +168,21 @@ symbols! { Iterator, Layout, Left, + LinkedList, LintPass, None, Ok, Option, Ord, Ordering, + OsStr, + OsString, Output, Param, PartialEq, PartialOrd, + Path, + PathBuf, Pending, Pin, Poll, @@ -187,6 +197,7 @@ symbols! { RangeToInclusive, Rc, Ready, + Receiver, Result, Return, Right, @@ -198,6 +209,8 @@ symbols! { StructuralPartialEq, Sync, Target, + ToOwned, + ToString, Try, Ty, TyCtxt, @@ -252,7 +265,6 @@ symbols! { allow_fail, allow_internal_unsafe, allow_internal_unstable, - allow_internal_unstable_backcompat_hack, allowed, always, and, @@ -318,6 +330,7 @@ symbols! { bridge, bswap, c_str, + c_unwind, c_variadic, call, call_mut, @@ -332,6 +345,7 @@ symbols! { cfg_attr, cfg_attr_multi, cfg_doctest, + cfg_eval, cfg_panic, cfg_sanitize, cfg_target_feature, @@ -476,6 +490,7 @@ symbols! { dropck_eyepatch, dropck_parametricity, dylib, + dyn_metadata, dyn_trait, edition_macro_pats, eh_catch_typeinfo, @@ -554,6 +569,7 @@ symbols! { format_args, format_args_capture, format_args_nl, + format_macro, freeze, freg, frem_fast, @@ -585,6 +601,8 @@ symbols! { gt, half_open_range_patterns, hash, + hashmap_type, + hashset_type, hexagon_target_feature, hidden, homogeneous_aggregate, @@ -593,6 +611,7 @@ symbols! { html_no_source, html_playground_url, html_root_url, + hwaddress, i, i128, i128_type, @@ -619,6 +638,7 @@ symbols! { index_mut, infer_outlives_requirements, infer_static_outlives_requirements, + inherent_associated_types, inlateout, inline, inline_const, @@ -679,6 +699,7 @@ symbols! { loop_break_value, lt, macro_at_most_once_rep, + macro_attributes_in_derive_output, macro_escape, macro_export, macro_lifetime_matcher, @@ -708,12 +729,14 @@ symbols! { memory, message, meta, + metadata_type, min_align_of, min_align_of_val, min_const_fn, min_const_generics, min_const_unsafe_fn, min_specialization, + min_type_alias_impl_trait, minnumf32, minnumf64, mips_target_feature, @@ -771,6 +794,9 @@ symbols! { none_error, nontemporal_store, nontrapping_dash_fptoint: "nontrapping-fptoint", + noop_method_borrow, + noop_method_clone, + noop_method_deref, noreturn, nostack, not, @@ -830,6 +856,7 @@ symbols! { plugin, plugin_registrar, plugins, + pointee_trait, pointer, pointer_trait, pointer_trait_fmt, @@ -870,6 +897,7 @@ symbols! { ptr_guaranteed_eq, ptr_guaranteed_ne, ptr_offset_from, + pub_macro_rules, pub_restricted, pure, pushpop_unsafe, @@ -932,8 +960,11 @@ symbols! { rt, rtm_target_feature, rust, + rust_2015, rust_2015_preview, + rust_2018, rust_2018_preview, + rust_2021, rust_2021_preview, rust_begin_unwind, rust_eh_catch_typeinfo, @@ -969,6 +1000,7 @@ symbols! { rustc_layout, rustc_layout_scalar_valid_range_end, rustc_layout_scalar_valid_range_start, + rustc_legacy_const_generics, rustc_macro_transparency, rustc_mir, rustc_nonnull_optimization_guaranteed, @@ -1000,6 +1032,7 @@ symbols! { rustc_then_this_would_need, rustc_unsafe_specialization_marker, rustc_variance, + rustdoc, rustfmt, rvalue_static_promotion, sanitize, @@ -1048,6 +1081,7 @@ symbols! { simd_lt, simd_mul, simd_ne, + simd_neg, simd_or, simd_reduce_add_ordered, simd_reduce_add_unordered, @@ -1079,6 +1113,7 @@ symbols! { size_of, size_of_val, sized, + skip, slice, slice_alloc, slice_patterns, @@ -1243,6 +1278,7 @@ symbols! { variant_count, vec, vec_type, + vecdeque_type, version, vis, visible_private_types, @@ -1602,6 +1638,7 @@ pub mod sym { use super::Symbol; use std::convert::TryInto; + #[doc(inline)] pub use super::sym_generated::*; // Used from a macro in `librustc_feature/accepted.rs` diff --git a/compiler/rustc_symbol_mangling/src/test.rs b/compiler/rustc_symbol_mangling/src/test.rs index 8c5e438a72..bfe9c4d6de 100644 --- a/compiler/rustc_symbol_mangling/src/test.rs +++ b/compiler/rustc_symbol_mangling/src/test.rs @@ -5,6 +5,7 @@ //! paths etc in all kinds of annoying scenarios. use rustc_hir as hir; +use rustc_hir::def_id::LocalDefId; use rustc_middle::ty::print::with_no_trimmed_paths; use rustc_middle::ty::{subst::InternalSubsts, Instance, TyCtxt}; use rustc_span::symbol::{sym, Symbol}; @@ -31,9 +32,8 @@ struct SymbolNamesTest<'tcx> { } impl SymbolNamesTest<'tcx> { - fn process_attrs(&mut self, hir_id: hir::HirId) { + fn process_attrs(&mut self, def_id: LocalDefId) { let tcx = self.tcx; - let def_id = tcx.hir().local_def_id(hir_id); for attr in tcx.get_attrs(def_id.to_def_id()).iter() { if tcx.sess.check_name(attr, SYMBOL_NAME) { let def_id = def_id.to_def_id(); @@ -61,18 +61,18 @@ impl SymbolNamesTest<'tcx> { impl hir::itemlikevisit::ItemLikeVisitor<'tcx> for SymbolNamesTest<'tcx> { fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { - self.process_attrs(item.hir_id); + self.process_attrs(item.def_id); } fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem<'tcx>) { - self.process_attrs(trait_item.hir_id); + self.process_attrs(trait_item.def_id); } fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem<'tcx>) { - self.process_attrs(impl_item.hir_id); + self.process_attrs(impl_item.def_id); } fn visit_foreign_item(&mut self, foreign_item: &'tcx hir::ForeignItem<'tcx>) { - self.process_attrs(foreign_item.hir_id); + self.process_attrs(foreign_item.def_id); } } diff --git a/compiler/rustc_symbol_mangling/src/v0.rs b/compiler/rustc_symbol_mangling/src/v0.rs index bbf7ecc39c..12c0a14799 100644 --- a/compiler/rustc_symbol_mangling/src/v0.rs +++ b/compiler/rustc_symbol_mangling/src/v0.rs @@ -440,7 +440,7 @@ impl Printer<'tcx> for SymbolMangler<'tcx> { } match sig.abi { Abi::Rust => {} - Abi::C => cx.push("KC"), + Abi::C { unwind: false } => cx.push("KC"), abi => { cx.push("K"); let name = abi.name(); diff --git a/compiler/rustc_target/src/abi/call/mod.rs b/compiler/rustc_target/src/abi/call/mod.rs index 9c49922c28..0deb1186b0 100644 --- a/compiler/rustc_target/src/abi/call/mod.rs +++ b/compiler/rustc_target/src/abi/call/mod.rs @@ -603,6 +603,13 @@ impl<'a, Ty> FnAbi<'a, Ty> { Ty: TyAndLayoutMethods<'a, C> + Copy, C: LayoutOf> + HasDataLayout + HasTargetSpec, { + if abi == spec::abi::Abi::X86Interrupt { + if let Some(arg) = self.args.first_mut() { + arg.make_indirect_byval(); + } + return Ok(()); + } + match &cx.target_spec().arch[..] { "x86" => { let flavor = if abi == spec::abi::Abi::Fastcall { diff --git a/compiler/rustc_target/src/asm/mod.rs b/compiler/rustc_target/src/asm/mod.rs index 3c65c84b0d..a09c87b3ec 100644 --- a/compiler/rustc_target/src/asm/mod.rs +++ b/compiler/rustc_target/src/asm/mod.rs @@ -13,7 +13,7 @@ macro_rules! def_reg_class { $class:ident, )* }) => { - #[derive(Copy, Clone, Encodable, Decodable, Debug, Eq, PartialEq, Hash, HashStable_Generic)] + #[derive(Copy, Clone, Encodable, Decodable, Debug, Eq, PartialEq, PartialOrd, Hash, HashStable_Generic)] #[allow(non_camel_case_types)] pub enum $arch_regclass { $($class,)* @@ -62,7 +62,7 @@ macro_rules! def_regs { )* }) => { #[allow(unreachable_code)] - #[derive(Copy, Clone, Encodable, Decodable, Debug, Eq, PartialEq, Hash, HashStable_Generic)] + #[derive(Copy, Clone, Encodable, Decodable, Debug, Eq, PartialEq, PartialOrd, Hash, HashStable_Generic)] #[allow(non_camel_case_types)] pub enum $arch_reg { $($reg,)* @@ -207,7 +207,18 @@ impl FromStr for InlineAsmArch { } } -#[derive(Copy, Clone, Encodable, Decodable, Debug, Eq, PartialEq, Hash, HashStable_Generic)] +#[derive( + Copy, + Clone, + Encodable, + Decodable, + Debug, + Eq, + PartialEq, + PartialOrd, + Hash, + HashStable_Generic +)] pub enum InlineAsmReg { X86(X86InlineAsmReg), Arm(ArmInlineAsmReg), @@ -218,6 +229,8 @@ pub enum InlineAsmReg { Mips(MipsInlineAsmReg), SpirV(SpirVInlineAsmReg), Wasm(WasmInlineAsmReg), + // Placeholder for invalid register constraints for the current target + Err, } impl InlineAsmReg { @@ -229,6 +242,7 @@ impl InlineAsmReg { Self::RiscV(r) => r.name(), Self::Hexagon(r) => r.name(), Self::Mips(r) => r.name(), + Self::Err => "", } } @@ -240,6 +254,7 @@ impl InlineAsmReg { Self::RiscV(r) => InlineAsmRegClass::RiscV(r.reg_class()), Self::Hexagon(r) => InlineAsmRegClass::Hexagon(r.reg_class()), Self::Mips(r) => InlineAsmRegClass::Mips(r.reg_class()), + Self::Err => InlineAsmRegClass::Err, } } @@ -298,6 +313,7 @@ impl InlineAsmReg { Self::RiscV(r) => r.emit(out, arch, modifier), Self::Hexagon(r) => r.emit(out, arch, modifier), Self::Mips(r) => r.emit(out, arch, modifier), + Self::Err => unreachable!("Use of InlineAsmReg::Err"), } } @@ -309,11 +325,23 @@ impl InlineAsmReg { Self::RiscV(_) => cb(self), Self::Hexagon(r) => r.overlapping_regs(|r| cb(Self::Hexagon(r))), Self::Mips(_) => cb(self), + Self::Err => unreachable!("Use of InlineAsmReg::Err"), } } } -#[derive(Copy, Clone, Encodable, Decodable, Debug, Eq, PartialEq, Hash, HashStable_Generic)] +#[derive( + Copy, + Clone, + Encodable, + Decodable, + Debug, + Eq, + PartialEq, + PartialOrd, + Hash, + HashStable_Generic +)] pub enum InlineAsmRegClass { X86(X86InlineAsmRegClass), Arm(ArmInlineAsmRegClass), @@ -324,6 +352,8 @@ pub enum InlineAsmRegClass { Mips(MipsInlineAsmRegClass), SpirV(SpirVInlineAsmRegClass), Wasm(WasmInlineAsmRegClass), + // Placeholder for invalid register constraints for the current target + Err, } impl InlineAsmRegClass { @@ -338,6 +368,7 @@ impl InlineAsmRegClass { Self::Mips(r) => r.name(), Self::SpirV(r) => r.name(), Self::Wasm(r) => r.name(), + Self::Err => rustc_span::symbol::sym::reg, } } @@ -355,6 +386,7 @@ impl InlineAsmRegClass { Self::Mips(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::Mips), Self::SpirV(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::SpirV), Self::Wasm(r) => r.suggest_class(arch, ty).map(InlineAsmRegClass::Wasm), + Self::Err => unreachable!("Use of InlineAsmRegClass::Err"), } } @@ -379,6 +411,7 @@ impl InlineAsmRegClass { Self::Mips(r) => r.suggest_modifier(arch, ty), Self::SpirV(r) => r.suggest_modifier(arch, ty), Self::Wasm(r) => r.suggest_modifier(arch, ty), + Self::Err => unreachable!("Use of InlineAsmRegClass::Err"), } } @@ -399,6 +432,7 @@ impl InlineAsmRegClass { Self::Mips(r) => r.default_modifier(arch), Self::SpirV(r) => r.default_modifier(arch), Self::Wasm(r) => r.default_modifier(arch), + Self::Err => unreachable!("Use of InlineAsmRegClass::Err"), } } @@ -418,6 +452,7 @@ impl InlineAsmRegClass { Self::Mips(r) => r.supported_types(arch), Self::SpirV(r) => r.supported_types(arch), Self::Wasm(r) => r.supported_types(arch), + Self::Err => unreachable!("Use of InlineAsmRegClass::Err"), } } @@ -454,11 +489,23 @@ impl InlineAsmRegClass { Self::Mips(r) => r.valid_modifiers(arch), Self::SpirV(r) => r.valid_modifiers(arch), Self::Wasm(r) => r.valid_modifiers(arch), + Self::Err => unreachable!("Use of InlineAsmRegClass::Err"), } } } -#[derive(Copy, Clone, Encodable, Decodable, Debug, Eq, PartialEq, Hash, HashStable_Generic)] +#[derive( + Copy, + Clone, + Encodable, + Decodable, + Debug, + Eq, + PartialEq, + PartialOrd, + Hash, + HashStable_Generic +)] pub enum InlineAsmRegOrRegClass { Reg(InlineAsmReg), RegClass(InlineAsmRegClass), diff --git a/compiler/rustc_target/src/lib.rs b/compiler/rustc_target/src/lib.rs index 1ad57582eb..fb747dfcbd 100644 --- a/compiler/rustc_target/src/lib.rs +++ b/compiler/rustc_target/src/lib.rs @@ -15,7 +15,6 @@ #![feature(never_type)] #![feature(associated_type_bounds)] #![feature(exhaustive_patterns)] -#![feature(str_split_once)] #[macro_use] extern crate rustc_macros; diff --git a/compiler/rustc_target/src/spec/aarch64_apple_ios_macabi.rs b/compiler/rustc_target/src/spec/aarch64_apple_ios_macabi.rs index 3a88197523..758950bd34 100644 --- a/compiler/rustc_target/src/spec/aarch64_apple_ios_macabi.rs +++ b/compiler/rustc_target/src/spec/aarch64_apple_ios_macabi.rs @@ -4,12 +4,12 @@ use crate::spec::{Target, TargetOptions}; pub fn target() -> Target { let base = opts("ios", Arch::Arm64_macabi); Target { - llvm_target: "arm64-apple-ios-macabi".to_string(), + llvm_target: "arm64-apple-ios14.0-macabi".to_string(), pointer_width: 64, data_layout: "e-m:o-i64:64-i128:128-n32:64-S128".to_string(), arch: "aarch64".to_string(), options: TargetOptions { - features: "+neon,+fp-armv8,+apple-a7".to_string(), + features: "+neon,+fp-armv8,+apple-a12".to_string(), eliminate_frame_pointer: false, max_atomic_width: Some(128), unsupported_abis: super::arm_base::unsupported_abis(), @@ -18,11 +18,9 @@ pub fn target() -> Target { // These arguments are not actually invoked - they just have // to look right to pass App Store validation. bitcode_llvm_cmdline: "-triple\0\ - arm64-apple-ios-macabi\0\ + arm64-apple-ios14.0-macabi\0\ -emit-obj\0\ -disable-llvm-passes\0\ - -target-abi\0\ - darwinpcs\0\ -Os\0" .to_string(), ..base diff --git a/compiler/rustc_target/src/spec/aarch64_apple_ios_sim.rs b/compiler/rustc_target/src/spec/aarch64_apple_ios_sim.rs new file mode 100644 index 0000000000..e594ceec1b --- /dev/null +++ b/compiler/rustc_target/src/spec/aarch64_apple_ios_sim.rs @@ -0,0 +1,39 @@ +use super::apple_sdk_base::{opts, Arch}; +use crate::spec::{Target, TargetOptions}; + +pub fn target() -> Target { + let base = opts("ios", Arch::Arm64_sim); + + // Clang automatically chooses a more specific target based on + // IPHONEOS_DEPLOYMENT_TARGET. + // This is required for the simulator target to pick the right + // MACH-O commands, so we do too. + let arch = "arm64"; + let llvm_target = super::apple_base::ios_sim_llvm_target(arch); + + Target { + llvm_target: llvm_target, + pointer_width: 64, + data_layout: "e-m:o-i64:64-i128:128-n32:64-S128".to_string(), + arch: "aarch64".to_string(), + options: TargetOptions { + features: "+neon,+fp-armv8,+apple-a7".to_string(), + eliminate_frame_pointer: false, + max_atomic_width: Some(128), + unsupported_abis: super::arm_base::unsupported_abis(), + forces_embed_bitcode: true, + // Taken from a clang build on Xcode 11.4.1. + // These arguments are not actually invoked - they just have + // to look right to pass App Store validation. + bitcode_llvm_cmdline: "-triple\0\ + arm64-apple-ios14.0-simulator\0\ + -emit-obj\0\ + -disable-llvm-passes\0\ + -target-abi\0\ + darwinpcs\0\ + -Os\0" + .to_string(), + ..base + }, + } +} diff --git a/compiler/rustc_target/src/spec/abi.rs b/compiler/rustc_target/src/spec/abi.rs index 65e8a4e8db..17eb33b8f2 100644 --- a/compiler/rustc_target/src/spec/abi.rs +++ b/compiler/rustc_target/src/spec/abi.rs @@ -8,24 +8,21 @@ mod tests; #[derive(PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy, Debug)] #[derive(HashStable_Generic, Encodable, Decodable)] pub enum Abi { - // N.B., this ordering MUST match the AbiDatas array below. - // (This is ensured by the test indices_are_correct().) - // Multiplatform / generic ABIs // // These ABIs come first because every time we add a new ABI, we // have to re-bless all the hashing tests. These are used in many // places, so giving them stable values reduces test churn. The // specific values are meaningless. - Rust = 0, - C = 1, + Rust, + C { unwind: bool }, // Single platform ABIs Cdecl, - Stdcall, + Stdcall { unwind: bool }, Fastcall, Vectorcall, - Thiscall, + Thiscall { unwind: bool }, Aapcs, Win64, SysV64, @@ -39,7 +36,7 @@ pub enum Abi { CCmseNonSecureCall, // Multiplatform / generic ABIs - System, + System { unwind: bool }, RustIntrinsic, RustCall, PlatformIntrinsic, @@ -61,13 +58,16 @@ pub struct AbiData { const AbiDatas: &[AbiData] = &[ // Cross-platform ABIs AbiData { abi: Abi::Rust, name: "Rust", generic: true }, - AbiData { abi: Abi::C, name: "C", generic: true }, + AbiData { abi: Abi::C { unwind: false }, name: "C", generic: true }, + AbiData { abi: Abi::C { unwind: true }, name: "C-unwind", generic: true }, // Platform-specific ABIs AbiData { abi: Abi::Cdecl, name: "cdecl", generic: false }, - AbiData { abi: Abi::Stdcall, name: "stdcall", generic: false }, + AbiData { abi: Abi::Stdcall { unwind: false }, name: "stdcall", generic: false }, + AbiData { abi: Abi::Stdcall { unwind: true }, name: "stdcall-unwind", generic: false }, AbiData { abi: Abi::Fastcall, name: "fastcall", generic: false }, AbiData { abi: Abi::Vectorcall, name: "vectorcall", generic: false }, - AbiData { abi: Abi::Thiscall, name: "thiscall", generic: false }, + AbiData { abi: Abi::Thiscall { unwind: false }, name: "thiscall", generic: false }, + AbiData { abi: Abi::Thiscall { unwind: true }, name: "thiscall-unwind", generic: false }, AbiData { abi: Abi::Aapcs, name: "aapcs", generic: false }, AbiData { abi: Abi::Win64, name: "win64", generic: false }, AbiData { abi: Abi::SysV64, name: "sysv64", generic: false }, @@ -84,7 +84,8 @@ const AbiDatas: &[AbiData] = &[ }, AbiData { abi: Abi::CCmseNonSecureCall, name: "C-cmse-nonsecure-call", generic: false }, // Cross-platform ABIs - AbiData { abi: Abi::System, name: "system", generic: true }, + AbiData { abi: Abi::System { unwind: false }, name: "system", generic: true }, + AbiData { abi: Abi::System { unwind: true }, name: "system-unwind", generic: true }, AbiData { abi: Abi::RustIntrinsic, name: "rust-intrinsic", generic: true }, AbiData { abi: Abi::RustCall, name: "rust-call", generic: true }, AbiData { abi: Abi::PlatformIntrinsic, name: "platform-intrinsic", generic: true }, @@ -103,7 +104,52 @@ pub fn all_names() -> Vec<&'static str> { impl Abi { #[inline] pub fn index(self) -> usize { - self as usize + // N.B., this ordering MUST match the AbiDatas array above. + // (This is ensured by the test indices_are_correct().) + use Abi::*; + let i = match self { + // Cross-platform ABIs + Rust => 0, + C { unwind: false } => 1, + C { unwind: true } => 2, + // Platform-specific ABIs + Cdecl => 3, + Stdcall { unwind: false } => 4, + Stdcall { unwind: true } => 5, + Fastcall => 6, + Vectorcall => 7, + Thiscall { unwind: false } => 8, + Thiscall { unwind: true } => 9, + Aapcs => 10, + Win64 => 11, + SysV64 => 12, + PtxKernel => 13, + Msp430Interrupt => 14, + X86Interrupt => 15, + AmdGpuKernel => 16, + EfiApi => 17, + AvrInterrupt => 18, + AvrNonBlockingInterrupt => 19, + CCmseNonSecureCall => 20, + // Cross-platform ABIs + System { unwind: false } => 21, + System { unwind: true } => 22, + RustIntrinsic => 23, + RustCall => 24, + PlatformIntrinsic => 25, + Unadjusted => 26, + }; + debug_assert!( + AbiDatas + .iter() + .enumerate() + .find(|(_, AbiData { abi, .. })| *abi == self) + .map(|(index, _)| index) + .expect("abi variant has associated data") + == i, + "Abi index did not match `AbiDatas` ordering" + ); + i } #[inline] @@ -122,6 +168,8 @@ impl Abi { impl fmt::Display for Abi { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!(f, "\"{}\"", self.name()) + match self { + abi => write!(f, "\"{}\"", abi.name()), + } } } diff --git a/compiler/rustc_target/src/spec/apple_base.rs b/compiler/rustc_target/src/spec/apple_base.rs index 3b458962b3..23f1357af1 100644 --- a/compiler/rustc_target/src/spec/apple_base.rs +++ b/compiler/rustc_target/src/spec/apple_base.rs @@ -54,14 +54,16 @@ pub fn opts(os: &str) -> TargetOptions { } } -fn macos_deployment_target() -> (u32, u32) { - let deployment_target = env::var("MACOSX_DEPLOYMENT_TARGET").ok(); - let version = deployment_target +fn deployment_target(var_name: &str) -> Option<(u32, u32)> { + let deployment_target = env::var(var_name).ok(); + deployment_target .as_ref() .and_then(|s| s.split_once('.')) - .and_then(|(a, b)| a.parse::().and_then(|a| b.parse::().map(|b| (a, b))).ok()); + .and_then(|(a, b)| a.parse::().and_then(|a| b.parse::().map(|b| (a, b))).ok()) +} - version.unwrap_or((10, 7)) +fn macos_deployment_target() -> (u32, u32) { + deployment_target("MACOSX_DEPLOYMENT_TARGET").unwrap_or((10, 7)) } pub fn macos_llvm_target(arch: &str) -> String { @@ -84,3 +86,12 @@ pub fn macos_link_env_remove() -> Vec { env_remove.push("IPHONEOS_DEPLOYMENT_TARGET".to_string()); env_remove } + +fn ios_deployment_target() -> (u32, u32) { + deployment_target("IPHONEOS_DEPLOYMENT_TARGET").unwrap_or((7, 0)) +} + +pub fn ios_sim_llvm_target(arch: &str) -> String { + let (major, minor) = ios_deployment_target(); + format!("{}-apple-ios{}.{}.0-simulator", arch, major, minor) +} diff --git a/compiler/rustc_target/src/spec/apple_sdk_base.rs b/compiler/rustc_target/src/spec/apple_sdk_base.rs index d894f75993..538c4ca869 100644 --- a/compiler/rustc_target/src/spec/apple_sdk_base.rs +++ b/compiler/rustc_target/src/spec/apple_sdk_base.rs @@ -11,6 +11,7 @@ pub enum Arch { X86_64, X86_64_macabi, Arm64_macabi, + Arm64_sim, } fn target_cpu(arch: Arch) -> String { @@ -22,13 +23,16 @@ fn target_cpu(arch: Arch) -> String { X86_64 => "core2", X86_64_macabi => "core2", Arm64_macabi => "apple-a12", + Arm64_sim => "apple-a12", } .to_string() } fn link_env_remove(arch: Arch) -> Vec { match arch { - Armv7 | Armv7s | Arm64 | I386 | X86_64 => vec!["MACOSX_DEPLOYMENT_TARGET".to_string()], + Armv7 | Armv7s | Arm64 | I386 | X86_64 | Arm64_sim => { + vec!["MACOSX_DEPLOYMENT_TARGET".to_string()] + } X86_64_macabi | Arm64_macabi => vec!["IPHONEOS_DEPLOYMENT_TARGET".to_string()], } } diff --git a/compiler/rustc_target/src/spec/arm_base.rs b/compiler/rustc_target/src/spec/arm_base.rs index b74d80dc6b..01f573313c 100644 --- a/compiler/rustc_target/src/spec/arm_base.rs +++ b/compiler/rustc_target/src/spec/arm_base.rs @@ -2,5 +2,14 @@ use crate::spec::abi::Abi; // All the calling conventions trigger an assertion(Unsupported calling convention) in llvm on arm pub fn unsupported_abis() -> Vec { - vec![Abi::Stdcall, Abi::Fastcall, Abi::Vectorcall, Abi::Thiscall, Abi::Win64, Abi::SysV64] + vec![ + Abi::Stdcall { unwind: false }, + Abi::Stdcall { unwind: true }, + Abi::Fastcall, + Abi::Vectorcall, + Abi::Thiscall { unwind: false }, + Abi::Thiscall { unwind: true }, + Abi::Win64, + Abi::SysV64, + ] } diff --git a/compiler/rustc_target/src/spec/crt_objects.rs b/compiler/rustc_target/src/spec/crt_objects.rs index 32da16a2d8..2fc9ab29f9 100644 --- a/compiler/rustc_target/src/spec/crt_objects.rs +++ b/compiler/rustc_target/src/spec/crt_objects.rs @@ -64,17 +64,24 @@ pub(super) fn all(obj: &str) -> CrtObjects { pub(super) fn pre_musl_fallback() -> CrtObjects { new(&[ - (LinkOutputKind::DynamicNoPicExe, &["crt1.o", "crti.o"]), - (LinkOutputKind::DynamicPicExe, &["Scrt1.o", "crti.o"]), - (LinkOutputKind::StaticNoPicExe, &["crt1.o", "crti.o"]), - (LinkOutputKind::StaticPicExe, &["rcrt1.o", "crti.o"]), - (LinkOutputKind::DynamicDylib, &["crti.o"]), - (LinkOutputKind::StaticDylib, &["crti.o"]), + (LinkOutputKind::DynamicNoPicExe, &["crt1.o", "crti.o", "crtbegin.o"]), + (LinkOutputKind::DynamicPicExe, &["Scrt1.o", "crti.o", "crtbeginS.o"]), + (LinkOutputKind::StaticNoPicExe, &["crt1.o", "crti.o", "crtbegin.o"]), + (LinkOutputKind::StaticPicExe, &["rcrt1.o", "crti.o", "crtbeginS.o"]), + (LinkOutputKind::DynamicDylib, &["crti.o", "crtbeginS.o"]), + (LinkOutputKind::StaticDylib, &["crti.o", "crtbeginS.o"]), ]) } pub(super) fn post_musl_fallback() -> CrtObjects { - all("crtn.o") + new(&[ + (LinkOutputKind::DynamicNoPicExe, &["crtend.o", "crtn.o"]), + (LinkOutputKind::DynamicPicExe, &["crtendS.o", "crtn.o"]), + (LinkOutputKind::StaticNoPicExe, &["crtend.o", "crtn.o"]), + (LinkOutputKind::StaticPicExe, &["crtendS.o", "crtn.o"]), + (LinkOutputKind::DynamicDylib, &["crtendS.o", "crtn.o"]), + (LinkOutputKind::StaticDylib, &["crtendS.o", "crtn.o"]), + ]) } pub(super) fn pre_mingw_fallback() -> CrtObjects { @@ -101,11 +108,13 @@ pub(super) fn post_mingw() -> CrtObjects { } pub(super) fn pre_wasi_fallback() -> CrtObjects { + // Use crt1-command.o instead of crt1.o to enable support for new-style + // commands. See https://reviews.llvm.org/D81689 for more info. new(&[ - (LinkOutputKind::DynamicNoPicExe, &["crt1.o"]), - (LinkOutputKind::DynamicPicExe, &["crt1.o"]), - (LinkOutputKind::StaticNoPicExe, &["crt1.o"]), - (LinkOutputKind::StaticPicExe, &["crt1.o"]), + (LinkOutputKind::DynamicNoPicExe, &["crt1-command.o"]), + (LinkOutputKind::DynamicPicExe, &["crt1-command.o"]), + (LinkOutputKind::StaticNoPicExe, &["crt1-command.o"]), + (LinkOutputKind::StaticPicExe, &["crt1-command.o"]), (LinkOutputKind::WasiReactorExe, &["crt1-reactor.o"]), ]) } diff --git a/compiler/rustc_target/src/spec/i386_apple_ios.rs b/compiler/rustc_target/src/spec/i386_apple_ios.rs index 2f94fbc5ad..cfaf020175 100644 --- a/compiler/rustc_target/src/spec/i386_apple_ios.rs +++ b/compiler/rustc_target/src/spec/i386_apple_ios.rs @@ -12,8 +12,7 @@ pub fn target() -> Target { arch: "x86".to_string(), options: TargetOptions { max_atomic_width: Some(64), - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - stack_probes: StackProbeType::Call, + stack_probes: StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }, ..base }, } diff --git a/compiler/rustc_target/src/spec/i686_apple_darwin.rs b/compiler/rustc_target/src/spec/i686_apple_darwin.rs index 31813087c0..2d3310c758 100644 --- a/compiler/rustc_target/src/spec/i686_apple_darwin.rs +++ b/compiler/rustc_target/src/spec/i686_apple_darwin.rs @@ -6,8 +6,7 @@ pub fn target() -> Target { base.max_atomic_width = Some(64); base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m32".to_string()]); base.link_env_remove.extend(super::apple_base::macos_link_env_remove()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; base.eliminate_frame_pointer = false; // Clang automatically chooses a more specific target based on diff --git a/compiler/rustc_target/src/spec/i686_linux_android.rs b/compiler/rustc_target/src/spec/i686_linux_android.rs index 89eb41e3cb..18cd8847ab 100644 --- a/compiler/rustc_target/src/spec/i686_linux_android.rs +++ b/compiler/rustc_target/src/spec/i686_linux_android.rs @@ -11,8 +11,7 @@ pub fn target() -> Target { // http://developer.android.com/ndk/guides/abis.html#x86 base.cpu = "pentiumpro".to_string(); base.features = "+mmx,+sse,+sse2,+sse3,+ssse3".to_string(); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "i686-linux-android".to_string(), diff --git a/compiler/rustc_target/src/spec/i686_unknown_freebsd.rs b/compiler/rustc_target/src/spec/i686_unknown_freebsd.rs index a8cc0997ab..fc425babb6 100644 --- a/compiler/rustc_target/src/spec/i686_unknown_freebsd.rs +++ b/compiler/rustc_target/src/spec/i686_unknown_freebsd.rs @@ -7,9 +7,7 @@ pub fn target() -> Target { let pre_link_args = base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap(); pre_link_args.push("-m32".to_string()); pre_link_args.push("-Wl,-znotext".to_string()); - - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "i686-unknown-freebsd".to_string(), diff --git a/compiler/rustc_target/src/spec/i686_unknown_haiku.rs b/compiler/rustc_target/src/spec/i686_unknown_haiku.rs index 080791386b..5fba4e3f14 100644 --- a/compiler/rustc_target/src/spec/i686_unknown_haiku.rs +++ b/compiler/rustc_target/src/spec/i686_unknown_haiku.rs @@ -5,8 +5,7 @@ pub fn target() -> Target { base.cpu = "pentium4".to_string(); base.max_atomic_width = Some(64); base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m32".to_string()]); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "i686-unknown-haiku".to_string(), diff --git a/compiler/rustc_target/src/spec/i686_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/i686_unknown_linux_gnu.rs index 656136c497..fe1e6a4299 100644 --- a/compiler/rustc_target/src/spec/i686_unknown_linux_gnu.rs +++ b/compiler/rustc_target/src/spec/i686_unknown_linux_gnu.rs @@ -5,8 +5,7 @@ pub fn target() -> Target { base.cpu = "pentium4".to_string(); base.max_atomic_width = Some(64); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "i686-unknown-linux-gnu".to_string(), diff --git a/compiler/rustc_target/src/spec/i686_unknown_linux_musl.rs b/compiler/rustc_target/src/spec/i686_unknown_linux_musl.rs index cb154b798b..623fd1b9ae 100644 --- a/compiler/rustc_target/src/spec/i686_unknown_linux_musl.rs +++ b/compiler/rustc_target/src/spec/i686_unknown_linux_musl.rs @@ -6,8 +6,7 @@ pub fn target() -> Target { base.max_atomic_width = Some(64); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string()); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-Wl,-melf_i386".to_string()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; // The unwinder used by i686-unknown-linux-musl, the LLVM libunwind // implementation, apparently relies on frame pointers existing... somehow. diff --git a/compiler/rustc_target/src/spec/i686_unknown_netbsd.rs b/compiler/rustc_target/src/spec/i686_unknown_netbsd.rs index 26bdc04fe9..c4d11bfb13 100644 --- a/compiler/rustc_target/src/spec/i686_unknown_netbsd.rs +++ b/compiler/rustc_target/src/spec/i686_unknown_netbsd.rs @@ -5,8 +5,7 @@ pub fn target() -> Target { base.cpu = "pentium4".to_string(); base.max_atomic_width = Some(64); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "i686-unknown-netbsdelf".to_string(), diff --git a/compiler/rustc_target/src/spec/i686_unknown_openbsd.rs b/compiler/rustc_target/src/spec/i686_unknown_openbsd.rs index e6a244c925..fdaaf6c741 100644 --- a/compiler/rustc_target/src/spec/i686_unknown_openbsd.rs +++ b/compiler/rustc_target/src/spec/i686_unknown_openbsd.rs @@ -6,8 +6,7 @@ pub fn target() -> Target { base.max_atomic_width = Some(64); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string()); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-fuse-ld=lld".to_string()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "i686-unknown-openbsd".to_string(), diff --git a/compiler/rustc_target/src/spec/i686_wrs_vxworks.rs b/compiler/rustc_target/src/spec/i686_wrs_vxworks.rs index 8732b47823..ec8a2493b4 100644 --- a/compiler/rustc_target/src/spec/i686_wrs_vxworks.rs +++ b/compiler/rustc_target/src/spec/i686_wrs_vxworks.rs @@ -5,8 +5,7 @@ pub fn target() -> Target { base.cpu = "pentium4".to_string(); base.max_atomic_width = Some(64); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m32".to_string()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "i686-unknown-linux-gnu".to_string(), diff --git a/compiler/rustc_target/src/spec/linux_kernel_base.rs b/compiler/rustc_target/src/spec/linux_kernel_base.rs index ddb9a7b632..5220156895 100644 --- a/compiler/rustc_target/src/spec/linux_kernel_base.rs +++ b/compiler/rustc_target/src/spec/linux_kernel_base.rs @@ -13,8 +13,7 @@ pub fn opts() -> TargetOptions { env: "gnu".to_string(), disable_redzone: true, panic_strategy: PanicStrategy::Abort, - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - stack_probes: StackProbeType::Call, + stack_probes: StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }, eliminate_frame_pointer: false, linker_is_gnu: true, position_independent_executables: true, diff --git a/compiler/rustc_target/src/spec/mipsel_unknown_none.rs b/compiler/rustc_target/src/spec/mipsel_unknown_none.rs index 0f9d3c3de1..110c8dd80e 100644 --- a/compiler/rustc_target/src/spec/mipsel_unknown_none.rs +++ b/compiler/rustc_target/src/spec/mipsel_unknown_none.rs @@ -23,10 +23,12 @@ pub fn target() -> Target { panic_strategy: PanicStrategy::Abort, relocation_model: RelocModel::Static, unsupported_abis: vec![ - Abi::Stdcall, + Abi::Stdcall { unwind: false }, + Abi::Stdcall { unwind: true }, Abi::Fastcall, Abi::Vectorcall, - Abi::Thiscall, + Abi::Thiscall { unwind: false }, + Abi::Thiscall { unwind: true }, Abi::Win64, Abi::SysV64, ], diff --git a/compiler/rustc_target/src/spec/mod.rs b/compiler/rustc_target/src/spec/mod.rs index 7a93bac72c..c9fffd213d 100644 --- a/compiler/rustc_target/src/spec/mod.rs +++ b/compiler/rustc_target/src/spec/mod.rs @@ -589,7 +589,7 @@ impl StackProbeType { Ok(StackProbeType::InlineOrCall { min_llvm_version_for_inline }) } _ => Err(String::from( - "`kind` expected to be one of `inline-or-none`, `call` or `inline-or-call`", + "`kind` expected to be one of `none`, `inline`, `call` or `inline-or-call`", )), } } @@ -641,6 +641,7 @@ supported_targets! { ("powerpc64le-unknown-linux-gnu", powerpc64le_unknown_linux_gnu), ("powerpc64le-unknown-linux-musl", powerpc64le_unknown_linux_musl), ("s390x-unknown-linux-gnu", s390x_unknown_linux_gnu), + ("s390x-unknown-linux-musl", s390x_unknown_linux_musl), ("sparc-unknown-linux-gnu", sparc_unknown_linux_gnu), ("sparc64-unknown-linux-gnu", sparc64_unknown_linux_gnu), ("arm-unknown-linux-gnueabi", arm_unknown_linux_gnueabi), @@ -678,7 +679,7 @@ supported_targets! { ("thumbv7neon-linux-androideabi", thumbv7neon_linux_androideabi), ("aarch64-linux-android", aarch64_linux_android), - ("x86_64-linux-kernel", x86_64_linux_kernel), + ("x86_64-unknown-none-linuxkernel", x86_64_unknown_none_linuxkernel), ("aarch64-unknown-freebsd", aarch64_unknown_freebsd), ("armv6-unknown-freebsd", armv6_unknown_freebsd), @@ -693,6 +694,7 @@ supported_targets! { ("i686-unknown-openbsd", i686_unknown_openbsd), ("sparc64-unknown-openbsd", sparc64_unknown_openbsd), ("x86_64-unknown-openbsd", x86_64_unknown_openbsd), + ("powerpc-unknown-openbsd", powerpc_unknown_openbsd), ("aarch64-unknown-netbsd", aarch64_unknown_netbsd), ("armv6-unknown-netbsd-eabihf", armv6_unknown_netbsd_eabihf), @@ -701,7 +703,6 @@ supported_targets! { ("powerpc-unknown-netbsd", powerpc_unknown_netbsd), ("sparc64-unknown-netbsd", sparc64_unknown_netbsd), ("x86_64-unknown-netbsd", x86_64_unknown_netbsd), - ("x86_64-rumprun-netbsd", x86_64_rumprun_netbsd), ("i686-unknown-haiku", i686_unknown_haiku), ("x86_64-unknown-haiku", x86_64_unknown_haiku), @@ -727,6 +728,7 @@ supported_targets! { ("armv7s-apple-ios", armv7s_apple_ios), ("x86_64-apple-ios-macabi", x86_64_apple_ios_macabi), ("aarch64-apple-ios-macabi", aarch64_apple_ios_macabi), + ("aarch64-apple-ios-sim", aarch64_apple_ios_sim), ("aarch64-apple-tvos", aarch64_apple_tvos), ("x86_64-apple-tvos", x86_64_apple_tvos), @@ -735,9 +737,8 @@ supported_targets! { ("armv7r-none-eabi", armv7r_none_eabi), ("armv7r-none-eabihf", armv7r_none_eabihf), - // `x86_64-pc-solaris` is an alias for `x86_64_sun_solaris` for backwards compatibility reasons. - // (See .) - ("x86_64-sun-solaris", "x86_64-pc-solaris", x86_64_sun_solaris), + ("x86_64-pc-solaris", x86_64_pc_solaris), + ("x86_64-sun-solaris", x86_64_sun_solaris), ("sparcv9-sun-solaris", sparcv9_sun_solaris), ("x86_64-unknown-illumos", x86_64_unknown_illumos), @@ -777,15 +778,18 @@ supported_targets! { ("aarch64-unknown-hermit", aarch64_unknown_hermit), ("x86_64-unknown-hermit", x86_64_unknown_hermit), - ("x86_64-unknown-hermit-kernel", x86_64_unknown_hermit_kernel), + + ("x86_64-unknown-none-hermitkernel", x86_64_unknown_none_hermitkernel), ("riscv32i-unknown-none-elf", riscv32i_unknown_none_elf), ("riscv32imc-unknown-none-elf", riscv32imc_unknown_none_elf), ("riscv32imac-unknown-none-elf", riscv32imac_unknown_none_elf), ("riscv32gc-unknown-linux-gnu", riscv32gc_unknown_linux_gnu), + ("riscv32gc-unknown-linux-musl", riscv32gc_unknown_linux_musl), ("riscv64imac-unknown-none-elf", riscv64imac_unknown_none_elf), ("riscv64gc-unknown-none-elf", riscv64gc_unknown_none_elf), ("riscv64gc-unknown-linux-gnu", riscv64gc_unknown_linux_gnu), + ("riscv64gc-unknown-linux-musl", riscv64gc_unknown_linux_musl), ("aarch64-unknown-none", aarch64_unknown_none), ("aarch64-unknown-none-softfloat", aarch64_unknown_none_softfloat), @@ -1280,24 +1284,31 @@ impl Target { /// Given a function ABI, turn it into the correct ABI for this target. pub fn adjust_abi(&self, abi: Abi) -> Abi { match abi { - Abi::System => { + Abi::System { unwind } => { if self.is_like_windows && self.arch == "x86" { - Abi::Stdcall + Abi::Stdcall { unwind } } else { - Abi::C + Abi::C { unwind } } } // These ABI kinds are ignored on non-x86 Windows targets. // See https://docs.microsoft.com/en-us/cpp/cpp/argument-passing-and-naming-conventions // and the individual pages for __stdcall et al. - Abi::Stdcall | Abi::Fastcall | Abi::Vectorcall | Abi::Thiscall => { - if self.is_like_windows && self.arch != "x86" { Abi::C } else { abi } + Abi::Stdcall { unwind } | Abi::Thiscall { unwind } => { + if self.is_like_windows && self.arch != "x86" { Abi::C { unwind } } else { abi } + } + Abi::Fastcall | Abi::Vectorcall => { + if self.is_like_windows && self.arch != "x86" { + Abi::C { unwind: false } + } else { + abi + } } Abi::EfiApi => { if self.arch == "x86_64" { Abi::Win64 } else { - Abi::C + Abi::C { unwind: false } } } abi => abi, @@ -1492,7 +1503,7 @@ impl Target { } ); ($key_name:ident = $json_name:expr, optional) => ( { let name = $json_name; - if let Some(o) = obj.find(&name[..]) { + if let Some(o) = obj.find(name) { base.$key_name = o .as_string() .map(|s| s.to_string() ); @@ -1983,24 +1994,6 @@ impl TargetTriple { Ok(TargetTriple::TargetPath(canonicalized_path)) } - /// Creates a target triple from its alias - pub fn from_alias(triple: String) -> Self { - macro_rules! target_aliases { - ( $(($alias:literal, $target:literal ),)+ ) => { - match triple.as_str() { - $( $alias => TargetTriple::from_triple($target), )+ - _ => TargetTriple::TargetTriple(triple), - } - } - } - - target_aliases! { - // `x86_64-pc-solaris` is an alias for `x86_64_sun_solaris` for backwards compatibility reasons. - // (See .) - ("x86_64-pc-solaris", "x86_64-sun-solaris"), - } - } - /// Returns a string triple for this target. /// /// If this target is a path, the file name (without extension) is returned. diff --git a/compiler/rustc_target/src/spec/nvptx64_nvidia_cuda.rs b/compiler/rustc_target/src/spec/nvptx64_nvidia_cuda.rs index 3c9c7d578f..15d8e4843f 100644 --- a/compiler/rustc_target/src/spec/nvptx64_nvidia_cuda.rs +++ b/compiler/rustc_target/src/spec/nvptx64_nvidia_cuda.rs @@ -49,10 +49,12 @@ pub fn target() -> Target { // create the tests for this. unsupported_abis: vec![ Abi::Cdecl, - Abi::Stdcall, + Abi::Stdcall { unwind: false }, + Abi::Stdcall { unwind: true }, Abi::Fastcall, Abi::Vectorcall, - Abi::Thiscall, + Abi::Thiscall { unwind: false }, + Abi::Thiscall { unwind: true }, Abi::Aapcs, Abi::Win64, Abi::SysV64, diff --git a/compiler/rustc_target/src/spec/powerpc64_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/powerpc64_unknown_linux_gnu.rs index 751022c124..9db880b0e5 100644 --- a/compiler/rustc_target/src/spec/powerpc64_unknown_linux_gnu.rs +++ b/compiler/rustc_target/src/spec/powerpc64_unknown_linux_gnu.rs @@ -14,7 +14,7 @@ pub fn target() -> Target { Target { llvm_target: "powerpc64-unknown-linux-gnu".to_string(), pointer_width: 64, - data_layout: "E-m:e-i64:64-n32:64".to_string(), + data_layout: "E-m:e-i64:64-n32:64-v256:256:256-v512:512:512".to_string(), arch: "powerpc64".to_string(), options: TargetOptions { endian: Endian::Big, mcount: "_mcount".to_string(), ..base }, } diff --git a/compiler/rustc_target/src/spec/powerpc64_unknown_linux_musl.rs b/compiler/rustc_target/src/spec/powerpc64_unknown_linux_musl.rs index 546dfbab6c..8767f86b00 100644 --- a/compiler/rustc_target/src/spec/powerpc64_unknown_linux_musl.rs +++ b/compiler/rustc_target/src/spec/powerpc64_unknown_linux_musl.rs @@ -10,7 +10,7 @@ pub fn target() -> Target { Target { llvm_target: "powerpc64-unknown-linux-musl".to_string(), pointer_width: 64, - data_layout: "E-m:e-i64:64-n32:64".to_string(), + data_layout: "E-m:e-i64:64-n32:64-v256:256:256-v512:512:512".to_string(), arch: "powerpc64".to_string(), options: TargetOptions { endian: Endian::Big, mcount: "_mcount".to_string(), ..base }, } diff --git a/compiler/rustc_target/src/spec/powerpc64_wrs_vxworks.rs b/compiler/rustc_target/src/spec/powerpc64_wrs_vxworks.rs index bb55872109..2f28a85624 100644 --- a/compiler/rustc_target/src/spec/powerpc64_wrs_vxworks.rs +++ b/compiler/rustc_target/src/spec/powerpc64_wrs_vxworks.rs @@ -10,7 +10,7 @@ pub fn target() -> Target { Target { llvm_target: "powerpc64-unknown-linux-gnu".to_string(), pointer_width: 64, - data_layout: "E-m:e-i64:64-n32:64".to_string(), + data_layout: "E-m:e-i64:64-n32:64-v256:256:256-v512:512:512".to_string(), arch: "powerpc64".to_string(), options: TargetOptions { endian: Endian::Big, ..base }, } diff --git a/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs index 07e0bf81bc..4cbd997650 100644 --- a/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs +++ b/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_gnu.rs @@ -9,7 +9,7 @@ pub fn target() -> Target { Target { llvm_target: "powerpc64le-unknown-linux-gnu".to_string(), pointer_width: 64, - data_layout: "e-m:e-i64:64-n32:64".to_string(), + data_layout: "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512".to_string(), arch: "powerpc64".to_string(), options: TargetOptions { mcount: "_mcount".to_string(), ..base }, } diff --git a/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_musl.rs b/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_musl.rs index 41c78a5f27..efdc9ad751 100644 --- a/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_musl.rs +++ b/compiler/rustc_target/src/spec/powerpc64le_unknown_linux_musl.rs @@ -9,7 +9,7 @@ pub fn target() -> Target { Target { llvm_target: "powerpc64le-unknown-linux-musl".to_string(), pointer_width: 64, - data_layout: "e-m:e-i64:64-n32:64".to_string(), + data_layout: "e-m:e-i64:64-n32:64-v256:256:256-v512:512:512".to_string(), arch: "powerpc64".to_string(), options: TargetOptions { mcount: "_mcount".to_string(), ..base }, } diff --git a/compiler/rustc_target/src/spec/powerpc_unknown_openbsd.rs b/compiler/rustc_target/src/spec/powerpc_unknown_openbsd.rs new file mode 100644 index 0000000000..c17183faa7 --- /dev/null +++ b/compiler/rustc_target/src/spec/powerpc_unknown_openbsd.rs @@ -0,0 +1,16 @@ +use crate::abi::Endian; +use crate::spec::Target; + +pub fn target() -> Target { + let mut base = super::openbsd_base::opts(); + base.endian = Endian::Big; + base.max_atomic_width = Some(32); + + Target { + llvm_target: "powerpc-unknown-openbsd".to_string(), + pointer_width: 32, + data_layout: "E-m:e-p:32:32-i64:64-n32".to_string(), + arch: "powerpc".to_string(), + options: base, + } +} diff --git a/compiler/rustc_target/src/spec/riscv32gc_unknown_linux_musl.rs b/compiler/rustc_target/src/spec/riscv32gc_unknown_linux_musl.rs new file mode 100644 index 0000000000..e5fbd09297 --- /dev/null +++ b/compiler/rustc_target/src/spec/riscv32gc_unknown_linux_musl.rs @@ -0,0 +1,19 @@ +use crate::spec::{CodeModel, Target, TargetOptions}; + +pub fn target() -> Target { + Target { + llvm_target: "riscv32-unknown-linux-musl".to_string(), + pointer_width: 32, + data_layout: "e-m:e-p:32:32-i64:64-n32-S128".to_string(), + arch: "riscv32".to_string(), + options: TargetOptions { + unsupported_abis: super::riscv_base::unsupported_abis(), + code_model: Some(CodeModel::Medium), + cpu: "generic-rv32".to_string(), + features: "+m,+a,+f,+d,+c".to_string(), + llvm_abiname: "ilp32d".to_string(), + max_atomic_width: Some(32), + ..super::linux_musl_base::opts() + }, + } +} diff --git a/compiler/rustc_target/src/spec/riscv64gc_unknown_linux_musl.rs b/compiler/rustc_target/src/spec/riscv64gc_unknown_linux_musl.rs new file mode 100644 index 0000000000..0232b15e8c --- /dev/null +++ b/compiler/rustc_target/src/spec/riscv64gc_unknown_linux_musl.rs @@ -0,0 +1,19 @@ +use crate::spec::{CodeModel, Target, TargetOptions}; + +pub fn target() -> Target { + Target { + llvm_target: "riscv64-unknown-linux-musl".to_string(), + pointer_width: 64, + data_layout: "e-m:e-p:64:64-i64:64-i128:128-n64-S128".to_string(), + arch: "riscv64".to_string(), + options: TargetOptions { + unsupported_abis: super::riscv_base::unsupported_abis(), + code_model: Some(CodeModel::Medium), + cpu: "generic-rv64".to_string(), + features: "+m,+a,+f,+d,+c".to_string(), + llvm_abiname: "lp64d".to_string(), + max_atomic_width: Some(64), + ..super::linux_musl_base::opts() + }, + } +} diff --git a/compiler/rustc_target/src/spec/riscv64gc_unknown_none_elf.rs b/compiler/rustc_target/src/spec/riscv64gc_unknown_none_elf.rs index 33a785fdfe..aa823b13fd 100644 --- a/compiler/rustc_target/src/spec/riscv64gc_unknown_none_elf.rs +++ b/compiler/rustc_target/src/spec/riscv64gc_unknown_none_elf.rs @@ -11,6 +11,7 @@ pub fn target() -> Target { options: TargetOptions { linker_flavor: LinkerFlavor::Lld(LldFlavor::Ld), linker: Some("rust-lld".to_string()), + llvm_abiname: "lp64d".to_string(), cpu: "generic-rv64".to_string(), max_atomic_width: Some(64), atomic_cas: true, diff --git a/compiler/rustc_target/src/spec/riscv_base.rs b/compiler/rustc_target/src/spec/riscv_base.rs index 64cf890037..5bcbb2e621 100644 --- a/compiler/rustc_target/src/spec/riscv_base.rs +++ b/compiler/rustc_target/src/spec/riscv_base.rs @@ -5,10 +5,12 @@ use crate::spec::abi::Abi; pub fn unsupported_abis() -> Vec { vec![ Abi::Cdecl, - Abi::Stdcall, + Abi::Stdcall { unwind: false }, + Abi::Stdcall { unwind: true }, Abi::Fastcall, Abi::Vectorcall, - Abi::Thiscall, + Abi::Thiscall { unwind: false }, + Abi::Thiscall { unwind: true }, Abi::Aapcs, Abi::Win64, Abi::SysV64, diff --git a/compiler/rustc_target/src/spec/s390x_unknown_linux_musl.rs b/compiler/rustc_target/src/spec/s390x_unknown_linux_musl.rs new file mode 100644 index 0000000000..4f811ce98c --- /dev/null +++ b/compiler/rustc_target/src/spec/s390x_unknown_linux_musl.rs @@ -0,0 +1,24 @@ +use crate::abi::Endian; +use crate::spec::Target; + +pub fn target() -> Target { + let mut base = super::linux_musl_base::opts(); + base.endian = Endian::Big; + // z10 is the oldest CPU supported by LLVM + base.cpu = "z10".to_string(); + // FIXME: The data_layout string below and the ABI implementation in + // cabi_s390x.rs are for now hard-coded to assume the no-vector ABI. + // Pass the -vector feature string to LLVM to respect this assumption. + base.features = "-vector".to_string(); + base.max_atomic_width = Some(64); + base.min_global_align = Some(16); + base.static_position_independent_executables = true; + + Target { + llvm_target: "s390x-unknown-linux-musl".to_string(), + pointer_width: 64, + data_layout: "E-m:e-i1:8:16-i8:8:16-i64:64-f128:64-a:8:16-n32:64".to_string(), + arch: "s390x".to_string(), + options: base, + } +} diff --git a/compiler/rustc_target/src/spec/solaris_base.rs b/compiler/rustc_target/src/spec/solaris_base.rs index 33e0cf8e96..59731f2582 100644 --- a/compiler/rustc_target/src/spec/solaris_base.rs +++ b/compiler/rustc_target/src/spec/solaris_base.rs @@ -3,7 +3,6 @@ use crate::spec::TargetOptions; pub fn opts() -> TargetOptions { TargetOptions { os: "solaris".to_string(), - vendor: "sun".to_string(), dynamic_linking: true, executables: true, has_rpath: true, diff --git a/compiler/rustc_target/src/spec/sparcv9_sun_solaris.rs b/compiler/rustc_target/src/spec/sparcv9_sun_solaris.rs index 9ac56cae91..abc46a8c9c 100644 --- a/compiler/rustc_target/src/spec/sparcv9_sun_solaris.rs +++ b/compiler/rustc_target/src/spec/sparcv9_sun_solaris.rs @@ -7,6 +7,7 @@ pub fn target() -> Target { base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m64".to_string()]); // llvm calls this "v9" base.cpu = "v9".to_string(); + base.vendor = "sun".to_string(); base.max_atomic_width = Some(64); Target { diff --git a/compiler/rustc_target/src/spec/x86_64_apple_darwin.rs b/compiler/rustc_target/src/spec/x86_64_apple_darwin.rs index 6affd7f1d9..8c40baccda 100644 --- a/compiler/rustc_target/src/spec/x86_64_apple_darwin.rs +++ b/compiler/rustc_target/src/spec/x86_64_apple_darwin.rs @@ -10,8 +10,7 @@ pub fn target() -> Target { vec!["-m64".to_string(), "-arch".to_string(), "x86_64".to_string()], ); base.link_env_remove.extend(super::apple_base::macos_link_env_remove()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; // Clang automatically chooses a more specific target based on // MACOSX_DEPLOYMENT_TARGET. To enable cross-language LTO to work diff --git a/compiler/rustc_target/src/spec/x86_64_apple_ios.rs b/compiler/rustc_target/src/spec/x86_64_apple_ios.rs index ddf68704d4..6feeeac451 100644 --- a/compiler/rustc_target/src/spec/x86_64_apple_ios.rs +++ b/compiler/rustc_target/src/spec/x86_64_apple_ios.rs @@ -11,8 +11,7 @@ pub fn target() -> Target { arch: "x86_64".to_string(), options: TargetOptions { max_atomic_width: Some(64), - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - stack_probes: StackProbeType::Call, + stack_probes: StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }, ..base }, } diff --git a/compiler/rustc_target/src/spec/x86_64_apple_ios_macabi.rs b/compiler/rustc_target/src/spec/x86_64_apple_ios_macabi.rs index e7c3d66b08..a6e066213e 100644 --- a/compiler/rustc_target/src/spec/x86_64_apple_ios_macabi.rs +++ b/compiler/rustc_target/src/spec/x86_64_apple_ios_macabi.rs @@ -11,8 +11,7 @@ pub fn target() -> Target { arch: "x86_64".to_string(), options: TargetOptions { max_atomic_width: Some(64), - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - stack_probes: StackProbeType::Call, + stack_probes: StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }, ..base }, } diff --git a/compiler/rustc_target/src/spec/x86_64_apple_tvos.rs b/compiler/rustc_target/src/spec/x86_64_apple_tvos.rs index 8727e48136..f8c47168da 100644 --- a/compiler/rustc_target/src/spec/x86_64_apple_tvos.rs +++ b/compiler/rustc_target/src/spec/x86_64_apple_tvos.rs @@ -10,8 +10,7 @@ pub fn target() -> Target { arch: "x86_64".to_string(), options: TargetOptions { max_atomic_width: Some(64), - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - stack_probes: StackProbeType::Call, + stack_probes: StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }, ..base }, } diff --git a/compiler/rustc_target/src/spec/x86_64_fuchsia.rs b/compiler/rustc_target/src/spec/x86_64_fuchsia.rs index b838b04fd9..a39e7f8c34 100644 --- a/compiler/rustc_target/src/spec/x86_64_fuchsia.rs +++ b/compiler/rustc_target/src/spec/x86_64_fuchsia.rs @@ -4,8 +4,7 @@ pub fn target() -> Target { let mut base = super::fuchsia_base::opts(); base.cpu = "x86-64".to_string(); base.max_atomic_width = Some(64); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "x86_64-fuchsia".to_string(), diff --git a/compiler/rustc_target/src/spec/x86_64_linux_android.rs b/compiler/rustc_target/src/spec/x86_64_linux_android.rs index f32818806f..d436242e62 100644 --- a/compiler/rustc_target/src/spec/x86_64_linux_android.rs +++ b/compiler/rustc_target/src/spec/x86_64_linux_android.rs @@ -7,8 +7,7 @@ pub fn target() -> Target { base.features = "+mmx,+sse,+sse2,+sse3,+ssse3,+sse4.1,+sse4.2,+popcnt".to_string(); base.max_atomic_width = Some(64); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "x86_64-linux-android".to_string(), diff --git a/compiler/rustc_target/src/spec/x86_64_pc_solaris.rs b/compiler/rustc_target/src/spec/x86_64_pc_solaris.rs new file mode 100644 index 0000000000..75eece74ff --- /dev/null +++ b/compiler/rustc_target/src/spec/x86_64_pc_solaris.rs @@ -0,0 +1,19 @@ +use crate::spec::{LinkerFlavor, StackProbeType, Target}; + +pub fn target() -> Target { + let mut base = super::solaris_base::opts(); + base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m64".to_string()]); + base.cpu = "x86-64".to_string(); + base.vendor = "pc".to_string(); + base.max_atomic_width = Some(64); + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; + + Target { + llvm_target: "x86_64-pc-solaris".to_string(), + pointer_width: 64, + data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" + .to_string(), + arch: "x86_64".to_string(), + options: base, + } +} diff --git a/compiler/rustc_target/src/spec/x86_64_rumprun_netbsd.rs b/compiler/rustc_target/src/spec/x86_64_rumprun_netbsd.rs deleted file mode 100644 index b1dce60c9a..0000000000 --- a/compiler/rustc_target/src/spec/x86_64_rumprun_netbsd.rs +++ /dev/null @@ -1,26 +0,0 @@ -use crate::spec::{LinkerFlavor, StackProbeType, Target, TargetOptions}; - -pub fn target() -> Target { - let mut base = super::netbsd_base::opts(); - base.vendor = "rumprun".to_string(); - base.cpu = "x86-64".to_string(); - base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string()); - base.linker = Some("x86_64-rumprun-netbsd-gcc".to_string()); - base.max_atomic_width = Some(64); - - base.dynamic_linking = false; - base.has_rpath = false; - base.position_independent_executables = false; - base.disable_redzone = true; - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; - - Target { - llvm_target: "x86_64-rumprun-netbsd".to_string(), - pointer_width: 64, - data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" - .to_string(), - arch: "x86_64".to_string(), - options: TargetOptions { mcount: "__mcount".to_string(), ..base }, - } -} diff --git a/compiler/rustc_target/src/spec/x86_64_sun_solaris.rs b/compiler/rustc_target/src/spec/x86_64_sun_solaris.rs index 0f7422d30a..63e524fa8a 100644 --- a/compiler/rustc_target/src/spec/x86_64_sun_solaris.rs +++ b/compiler/rustc_target/src/spec/x86_64_sun_solaris.rs @@ -4,9 +4,9 @@ pub fn target() -> Target { let mut base = super::solaris_base::opts(); base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m64".to_string()]); base.cpu = "x86-64".to_string(); + base.vendor = "sun".to_string(); base.max_atomic_width = Some(64); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "x86_64-pc-solaris".to_string(), diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_dragonfly.rs b/compiler/rustc_target/src/spec/x86_64_unknown_dragonfly.rs index 754f4733e5..d86b0d67ac 100644 --- a/compiler/rustc_target/src/spec/x86_64_unknown_dragonfly.rs +++ b/compiler/rustc_target/src/spec/x86_64_unknown_dragonfly.rs @@ -5,8 +5,7 @@ pub fn target() -> Target { base.cpu = "x86-64".to_string(); base.max_atomic_width = Some(64); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "x86_64-unknown-dragonfly".to_string(), diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_freebsd.rs b/compiler/rustc_target/src/spec/x86_64_unknown_freebsd.rs index 055602c1cc..c7d3b3feed 100644 --- a/compiler/rustc_target/src/spec/x86_64_unknown_freebsd.rs +++ b/compiler/rustc_target/src/spec/x86_64_unknown_freebsd.rs @@ -5,8 +5,7 @@ pub fn target() -> Target { base.cpu = "x86-64".to_string(); base.max_atomic_width = Some(64); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "x86_64-unknown-freebsd".to_string(), diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_haiku.rs b/compiler/rustc_target/src/spec/x86_64_unknown_haiku.rs index 8b3c9f591e..963d4fdb12 100644 --- a/compiler/rustc_target/src/spec/x86_64_unknown_haiku.rs +++ b/compiler/rustc_target/src/spec/x86_64_unknown_haiku.rs @@ -5,8 +5,7 @@ pub fn target() -> Target { base.cpu = "x86-64".to_string(); base.max_atomic_width = Some(64); base.pre_link_args.insert(LinkerFlavor::Gcc, vec!["-m64".to_string()]); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; // This option is required to build executables on Haiku x86_64 base.position_independent_executables = true; diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_hermit.rs b/compiler/rustc_target/src/spec/x86_64_unknown_hermit.rs index 69fcb4627f..31164f8408 100644 --- a/compiler/rustc_target/src/spec/x86_64_unknown_hermit.rs +++ b/compiler/rustc_target/src/spec/x86_64_unknown_hermit.rs @@ -5,8 +5,7 @@ pub fn target() -> Target { base.cpu = "x86-64".to_string(); base.max_atomic_width = Some(64); base.features = "+rdrnd,+rdseed".to_string(); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "x86_64-unknown-hermit".to_string(), diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs b/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs index 2ba6d36848..99906764df 100644 --- a/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs +++ b/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnu.rs @@ -5,8 +5,7 @@ pub fn target() -> Target { base.cpu = "x86-64".to_string(); base.max_atomic_width = Some(64); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "x86_64-unknown-linux-gnu".to_string(), diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnux32.rs b/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnux32.rs index 268f231b18..4b2bce3747 100644 --- a/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnux32.rs +++ b/compiler/rustc_target/src/spec/x86_64_unknown_linux_gnux32.rs @@ -5,8 +5,7 @@ pub fn target() -> Target { base.cpu = "x86-64".to_string(); base.max_atomic_width = Some(64); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-mx32".to_string()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; base.has_elf_tls = false; // BUG(GabrielMajeri): disabling the PLT on x86_64 Linux with x32 ABI // breaks code gen. See LLVM bug 36743 diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_linux_musl.rs b/compiler/rustc_target/src/spec/x86_64_unknown_linux_musl.rs index b4d704f9ec..fa9fdf5aa0 100644 --- a/compiler/rustc_target/src/spec/x86_64_unknown_linux_musl.rs +++ b/compiler/rustc_target/src/spec/x86_64_unknown_linux_musl.rs @@ -5,9 +5,7 @@ pub fn target() -> Target { base.cpu = "x86-64".to_string(); base.max_atomic_width = Some(64); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; - + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; base.static_position_independent_executables = true; Target { diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_netbsd.rs b/compiler/rustc_target/src/spec/x86_64_unknown_netbsd.rs index a5d8800752..6d19dec00b 100644 --- a/compiler/rustc_target/src/spec/x86_64_unknown_netbsd.rs +++ b/compiler/rustc_target/src/spec/x86_64_unknown_netbsd.rs @@ -5,8 +5,7 @@ pub fn target() -> Target { base.cpu = "x86-64".to_string(); base.max_atomic_width = Some(64); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "x86_64-unknown-netbsd".to_string(), diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_hermit_kernel.rs b/compiler/rustc_target/src/spec/x86_64_unknown_none_hermitkernel.rs similarity index 75% rename from compiler/rustc_target/src/spec/x86_64_unknown_hermit_kernel.rs rename to compiler/rustc_target/src/spec/x86_64_unknown_none_hermitkernel.rs index e2c18d3f88..a357def190 100644 --- a/compiler/rustc_target/src/spec/x86_64_unknown_hermit_kernel.rs +++ b/compiler/rustc_target/src/spec/x86_64_unknown_none_hermitkernel.rs @@ -7,11 +7,10 @@ pub fn target() -> Target { base.features = "-mmx,-sse,-sse2,-sse3,-ssse3,-sse4.1,-sse4.2,-3dnow,-3dnowa,-avx,-avx2,+soft-float" .to_string(); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { - llvm_target: "x86_64-unknown-hermit".to_string(), + llvm_target: "x86_64-unknown-none-elf".to_string(), pointer_width: 64, data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" .to_string(), diff --git a/compiler/rustc_target/src/spec/x86_64_linux_kernel.rs b/compiler/rustc_target/src/spec/x86_64_unknown_none_linuxkernel.rs similarity index 76% rename from compiler/rustc_target/src/spec/x86_64_linux_kernel.rs rename to compiler/rustc_target/src/spec/x86_64_unknown_none_linuxkernel.rs index 43e683ddbc..68d80205e1 100644 --- a/compiler/rustc_target/src/spec/x86_64_linux_kernel.rs +++ b/compiler/rustc_target/src/spec/x86_64_unknown_none_linuxkernel.rs @@ -14,8 +14,11 @@ pub fn target() -> Target { base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string()); Target { - // FIXME: Some dispute, the linux-on-clang folks think this should use "Linux" - llvm_target: "x86_64-elf".to_string(), + // FIXME: Some dispute, the linux-on-clang folks think this should use + // "Linux". We disagree because running *on* Linux is nothing like + // running *as" linux, and historically the "os" component as has always + // been used to mean the "on" part. + llvm_target: "x86_64-unknown-none-elf".to_string(), pointer_width: 64, data_layout: "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-f80:128-n8:16:32:64-S128" .to_string(), diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_openbsd.rs b/compiler/rustc_target/src/spec/x86_64_unknown_openbsd.rs index fa0b667281..ac5939bcb3 100644 --- a/compiler/rustc_target/src/spec/x86_64_unknown_openbsd.rs +++ b/compiler/rustc_target/src/spec/x86_64_unknown_openbsd.rs @@ -5,8 +5,7 @@ pub fn target() -> Target { base.cpu = "x86-64".to_string(); base.max_atomic_width = Some(64); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "x86_64-unknown-openbsd".to_string(), diff --git a/compiler/rustc_target/src/spec/x86_64_unknown_redox.rs b/compiler/rustc_target/src/spec/x86_64_unknown_redox.rs index 0a8d7b25cb..ddabe95ab8 100644 --- a/compiler/rustc_target/src/spec/x86_64_unknown_redox.rs +++ b/compiler/rustc_target/src/spec/x86_64_unknown_redox.rs @@ -5,8 +5,7 @@ pub fn target() -> Target { base.cpu = "x86-64".to_string(); base.max_atomic_width = Some(64); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; Target { llvm_target: "x86_64-unknown-redox".to_string(), diff --git a/compiler/rustc_target/src/spec/x86_64_wrs_vxworks.rs b/compiler/rustc_target/src/spec/x86_64_wrs_vxworks.rs index a066f110e0..1b35e813fc 100644 --- a/compiler/rustc_target/src/spec/x86_64_wrs_vxworks.rs +++ b/compiler/rustc_target/src/spec/x86_64_wrs_vxworks.rs @@ -5,8 +5,7 @@ pub fn target() -> Target { base.cpu = "x86-64".to_string(); base.max_atomic_width = Some(64); base.pre_link_args.get_mut(&LinkerFlavor::Gcc).unwrap().push("-m64".to_string()); - // don't use probe-stack=inline-asm until rust-lang/rust#83139 is resolved. - base.stack_probes = StackProbeType::Call; + base.stack_probes = StackProbeType::InlineOrCall { min_llvm_version_for_inline: (11, 0, 1) }; base.disable_redzone = true; Target { diff --git a/compiler/rustc_trait_selection/Cargo.toml b/compiler/rustc_trait_selection/Cargo.toml index a72c172918..c5d4c2400f 100644 --- a/compiler/rustc_trait_selection/Cargo.toml +++ b/compiler/rustc_trait_selection/Cargo.toml @@ -22,4 +22,4 @@ rustc_macros = { path = "../rustc_macros" } rustc_session = { path = "../rustc_session" } rustc_span = { path = "../rustc_span" } rustc_target = { path = "../rustc_target" } -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } diff --git a/compiler/rustc_trait_selection/src/autoderef.rs b/compiler/rustc_trait_selection/src/autoderef.rs index 05b6c4a48d..3f24a33f7d 100644 --- a/compiler/rustc_trait_selection/src/autoderef.rs +++ b/compiler/rustc_trait_selection/src/autoderef.rs @@ -6,7 +6,6 @@ use rustc_infer::infer::InferCtxt; use rustc_middle::ty::{self, TraitRef, Ty, TyCtxt, WithConstness}; use rustc_middle::ty::{ToPredicate, TypeFoldable}; use rustc_session::DiagnosticMessageId; -use rustc_span::symbol::{sym, Ident}; use rustc_span::Span; #[derive(Copy, Clone, Debug)] @@ -146,11 +145,10 @@ impl<'a, 'tcx> Autoderef<'a, 'tcx> { let normalized_ty = fulfillcx.normalize_projection_type( &self.infcx, self.param_env, - ty::ProjectionTy::from_ref_and_name( - tcx, - trait_ref, - Ident::with_dummy_span(sym::Target), - ), + ty::ProjectionTy { + item_def_id: tcx.lang_items().deref_target()?, + substs: trait_ref.substs, + }, cause, ); if let Err(e) = fulfillcx.select_where_possible(&self.infcx) { diff --git a/compiler/rustc_trait_selection/src/infer.rs b/compiler/rustc_trait_selection/src/infer.rs index da66fbc858..a9ffb5542b 100644 --- a/compiler/rustc_trait_selection/src/infer.rs +++ b/compiler/rustc_trait_selection/src/infer.rs @@ -124,7 +124,7 @@ impl<'tcx> InferCtxtBuilderExt<'tcx> for InferCtxtBuilder<'tcx> { DUMMY_SP, canonical_key, |ref infcx, key, canonical_inference_vars| { - let mut fulfill_cx = TraitEngine::new(infcx.tcx); + let mut fulfill_cx = >::new(infcx.tcx); let value = operation(infcx, &mut *fulfill_cx, key)?; infcx.make_canonicalized_query_response( canonical_inference_vars, diff --git a/compiler/rustc_trait_selection/src/lib.rs b/compiler/rustc_trait_selection/src/lib.rs index e1f8d59991..aea3d8eef6 100644 --- a/compiler/rustc_trait_selection/src/lib.rs +++ b/compiler/rustc_trait_selection/src/lib.rs @@ -23,7 +23,7 @@ #[macro_use] extern crate rustc_macros; -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] #[macro_use] extern crate rustc_data_structures; #[macro_use] diff --git a/compiler/rustc_trait_selection/src/opaque_types.rs b/compiler/rustc_trait_selection/src/opaque_types.rs index 25ba489032..d6a585e626 100644 --- a/compiler/rustc_trait_selection/src/opaque_types.rs +++ b/compiler/rustc_trait_selection/src/opaque_types.rs @@ -422,7 +422,9 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { } // These opaque type inherit all lifetime parameters from their // parent, so we have to check them all. - hir::OpaqueTyOrigin::Binding | hir::OpaqueTyOrigin::Misc => 0, + hir::OpaqueTyOrigin::Binding + | hir::OpaqueTyOrigin::TyAlias + | hir::OpaqueTyOrigin::Misc => 0, }; let span = tcx.def_span(def_id); @@ -581,6 +583,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { // Otherwise, generate the label we'll use in the error message. hir::OpaqueTyOrigin::Binding | hir::OpaqueTyOrigin::FnReturn + | hir::OpaqueTyOrigin::TyAlias | hir::OpaqueTyOrigin::Misc => "impl Trait", }; let msg = format!("ambiguous lifetime bound in `{}`", context_name); diff --git a/compiler/rustc_trait_selection/src/traits/auto_trait.rs b/compiler/rustc_trait_selection/src/traits/auto_trait.rs index 6593c1000f..6510c9464e 100644 --- a/compiler/rustc_trait_selection/src/traits/auto_trait.rs +++ b/compiler/rustc_trait_selection/src/traits/auto_trait.rs @@ -77,7 +77,7 @@ impl<'tcx> AutoTraitFinder<'tcx> { ty: Ty<'tcx>, orig_env: ty::ParamEnv<'tcx>, trait_did: DefId, - auto_trait_callback: impl Fn(&InferCtxt<'_, 'tcx>, AutoTraitInfo<'tcx>) -> A, + mut auto_trait_callback: impl FnMut(AutoTraitInfo<'tcx>) -> A, ) -> AutoTraitResult { let tcx = self.tcx; @@ -211,7 +211,7 @@ impl<'tcx> AutoTraitFinder<'tcx> { let info = AutoTraitInfo { full_user_env, region_data, vid_to_region }; - AutoTraitResult::PositiveImpl(auto_trait_callback(&infcx, info)) + AutoTraitResult::PositiveImpl(auto_trait_callback(info)) }) } } diff --git a/compiler/rustc_trait_selection/src/traits/codegen.rs b/compiler/rustc_trait_selection/src/traits/codegen.rs index 657d5c123e..45853a66ef 100644 --- a/compiler/rustc_trait_selection/src/traits/codegen.rs +++ b/compiler/rustc_trait_selection/src/traits/codegen.rs @@ -91,7 +91,7 @@ pub fn codegen_fulfill_obligation<'tcx>( }); let impl_source = drain_fulfillment_cx_or_panic(&infcx, &mut fulfill_cx, impl_source); - info!("Cache miss: {:?} => {:?}", trait_ref, impl_source); + debug!("Cache miss: {:?} => {:?}", trait_ref, impl_source); Ok(impl_source) }) } diff --git a/compiler/rustc_trait_selection/src/traits/coherence.rs b/compiler/rustc_trait_selection/src/traits/coherence.rs index 99b96f6096..e8ae1f44a3 100644 --- a/compiler/rustc_trait_selection/src/traits/coherence.rs +++ b/compiler/rustc_trait_selection/src/traits/coherence.rs @@ -11,7 +11,7 @@ use crate::traits::{self, Normalized, Obligation, ObligationCause, SelectionCont use rustc_hir::def_id::{DefId, LOCAL_CRATE}; use rustc_middle::ty::fold::TypeFoldable; use rustc_middle::ty::subst::Subst; -use rustc_middle::ty::{self, Ty, TyCtxt}; +use rustc_middle::ty::{self, fast_reject, Ty, TyCtxt}; use rustc_span::symbol::sym; use rustc_span::DUMMY_SP; use std::iter; @@ -67,6 +67,34 @@ where impl2_def_id={:?})", impl1_def_id, impl2_def_id, ); + // Before doing expensive operations like entering an inference context, do + // a quick check via fast_reject to tell if the impl headers could possibly + // unify. + let impl1_ref = tcx.impl_trait_ref(impl1_def_id); + let impl2_ref = tcx.impl_trait_ref(impl2_def_id); + + // Check if any of the input types definitely do not unify. + if impl1_ref + .iter() + .flat_map(|tref| tref.substs.types()) + .zip(impl2_ref.iter().flat_map(|tref| tref.substs.types())) + .any(|(ty1, ty2)| { + let t1 = fast_reject::simplify_type(tcx, ty1, false); + let t2 = fast_reject::simplify_type(tcx, ty2, false); + if let (Some(t1), Some(t2)) = (t1, t2) { + // Simplified successfully + // Types cannot unify if they differ in their reference mutability or simplify to different types + t1 != t2 || ty1.ref_mutability() != ty2.ref_mutability() + } else { + // Types might unify + false + } + }) + { + // Some types involved are definitely different, so the impls couldn't possibly overlap. + debug!("overlapping_impls: fast_reject early-exit"); + return no_overlap(); + } let overlaps = tcx.infer_ctxt().enter(|infcx| { let selcx = &mut SelectionContext::intercrate(&infcx); diff --git a/compiler/rustc_trait_selection/src/traits/const_evaluatable.rs b/compiler/rustc_trait_selection/src/traits/const_evaluatable.rs index 89820bb141..670527fb3f 100644 --- a/compiler/rustc_trait_selection/src/traits/const_evaluatable.rs +++ b/compiler/rustc_trait_selection/src/traits/const_evaluatable.rs @@ -72,17 +72,16 @@ pub fn is_const_evaluatable<'cx, 'tcx>( // We were unable to unify the abstract constant with // a constant found in the caller bounds, there are // now three possible cases here. - // - // - The substs are concrete enough that we can simply - // try and evaluate the given constant. - // - The abstract const still references an inference - // variable, in this case we return `TooGeneric`. - // - The abstract const references a generic parameter, - // this means that we emit an error here. #[derive(Debug, Copy, Clone, PartialEq, Eq, PartialOrd, Ord)] enum FailureKind { + /// The abstract const still references an inference + /// variable, in this case we return `TooGeneric`. MentionsInfer, + /// The abstract const references a generic parameter, + /// this means that we emit an error here. MentionsParam, + /// The substs are concrete enough that we can simply + /// try and evaluate the given constant. Concrete, } let mut failure_kind = FailureKind::Concrete; @@ -117,7 +116,7 @@ pub fn is_const_evaluatable<'cx, 'tcx>( { err.span_help( tcx.def_span(def.did), - &format!("try adding a `where` bound using this expression: where [u8; {}]: Sized", snippet), + &format!("try adding a `where` bound using this expression: `where [u8; {}]: Sized`", snippet), ); } else { err.span_help( @@ -378,7 +377,10 @@ impl<'a, 'tcx> AbstractConstBuilder<'a, 'tcx> { let local = self.place_to_local(span, p)?; Ok(self.locals[local]) } - mir::Operand::Constant(ct) => Ok(self.add_node(Node::Leaf(ct.literal), span)), + mir::Operand::Constant(ct) => match ct.literal { + mir::ConstantKind::Ty(ct) => Ok(self.add_node(Node::Leaf(ct), span)), + mir::ConstantKind::Val(..) => self.error(Some(span), "unsupported constant")?, + }, } } @@ -412,7 +414,7 @@ impl<'a, 'tcx> AbstractConstBuilder<'a, 'tcx> { self.locals[local] = self.operand_to_node(span, operand)?; Ok(()) } - Rvalue::BinaryOp(op, ref lhs, ref rhs) if Self::check_binop(op) => { + Rvalue::BinaryOp(op, box (ref lhs, ref rhs)) if Self::check_binop(op) => { let lhs = self.operand_to_node(span, lhs)?; let rhs = self.operand_to_node(span, rhs)?; self.locals[local] = self.add_node(Node::Binop(op, lhs, rhs), span); @@ -422,7 +424,9 @@ impl<'a, 'tcx> AbstractConstBuilder<'a, 'tcx> { Ok(()) } } - Rvalue::CheckedBinaryOp(op, ref lhs, ref rhs) if Self::check_binop(op) => { + Rvalue::CheckedBinaryOp(op, box (ref lhs, ref rhs)) + if Self::check_binop(op) => + { let lhs = self.operand_to_node(span, lhs)?; let rhs = self.operand_to_node(span, rhs)?; self.locals[local] = self.add_node(Node::Binop(op, lhs, rhs), span); diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs index d3b3403ac3..a3faf4cb7d 100644 --- a/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/error_reporting/mod.rs @@ -468,22 +468,21 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { 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); - } - // Changing mutability doesn't make a difference to whether we have - // an `Unsize` impl (Fixes ICE in #71036) - if !is_unsize { - self.suggest_change_mut( - &obligation, - &mut err, - trait_ref, - points_at_arg, - ); - } + } 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); + } + + // Changing mutability doesn't make a difference to whether we have + // an `Unsize` impl (Fixes ICE in #71036) + if !is_unsize { + self.suggest_change_mut( + &obligation, + &mut err, + trait_ref, + points_at_arg, + ); } // If this error is due to `!: Trait` not implemented but `(): Trait` is @@ -820,7 +819,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { sig.decl .inputs .iter() - .map(|arg| match arg.clone().kind { + .map(|arg| match arg.kind { hir::TyKind::Tup(ref tys) => ArgKind::Tuple( Some(arg.span), vec![("_".to_owned(), "_".to_owned()); tys.len()], @@ -1369,8 +1368,8 @@ impl<'a, 'tcx> InferCtxtPrivExt<'tcx> for InferCtxt<'a, 'tcx> { 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)); + let span = TyCategory::from_ty(self.tcx, ty) + .map(|(_, def_id)| self.tcx.def_span(def_id)); Some((ty.to_string(), span)) } } @@ -1590,8 +1589,7 @@ impl<'a, 'tcx> InferCtxtPrivExt<'tcx> for InferCtxt<'a, 'tcx> { self.emit_inference_failure_err(body_id, span, a.into(), vec![], ErrorCode::E0282) } ty::PredicateKind::Projection(data) => { - let trait_ref = bound_predicate.rebind(data).to_poly_trait_ref(self.tcx); - let self_ty = trait_ref.skip_binder().self_ty(); + let self_ty = data.projection_ty.self_ty(); let ty = data.ty; if predicate.references_error() { return; @@ -1780,7 +1778,7 @@ impl<'a, 'tcx> InferCtxtPrivExt<'tcx> for InferCtxt<'a, 'tcx> { multispan.push_span_label( sp, format!( - "...if indirection was used here: `Box<{}>`", + "...if indirection were used here: `Box<{}>`", param.name.ident(), ), ); diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/on_unimplemented.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/on_unimplemented.rs index 69f66f6e6b..e6a1cf58fe 100644 --- a/compiler/rustc_trait_selection/src/traits/error_reporting/on_unimplemented.rs +++ b/compiler/rustc_trait_selection/src/traits/error_reporting/on_unimplemented.rs @@ -200,22 +200,15 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { 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())), - )); - } + let type_string = self.tcx.type_of(def.did).to_string(); + flags.push((sym::_Self, Some(format!("[{}]", type_string)))); + + let len = len.val.try_to_value().and_then(|v| v.try_to_machine_usize(self.tcx)); + let string = match len { + Some(n) => format!("[{}; {}]", type_string, n), + None => format!("[{}; _]", type_string), + }; + flags.push((sym::_Self, Some(string))); } } if let ty::Dynamic(traits, _) = self_ty.kind() { diff --git a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs index 2182800616..c1b105f1d8 100644 --- a/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs +++ b/compiler/rustc_trait_selection/src/traits/error_reporting/suggestions.rs @@ -17,8 +17,8 @@ use rustc_hir::intravisit::Visitor; use rustc_hir::lang_items::LangItem; use rustc_hir::{AsyncGeneratorKind, GeneratorKind, Node}; use rustc_middle::ty::{ - self, suggest_constraining_type_param, AdtKind, DefIdTree, Infer, InferTy, ToPredicate, Ty, - TyCtxt, TypeFoldable, WithConstness, + self, suggest_arbitrary_trait_bound, suggest_constraining_type_param, AdtKind, DefIdTree, + Infer, InferTy, ToPredicate, Ty, TyCtxt, TypeFoldable, WithConstness, }; use rustc_middle::ty::{TypeAndMut, TypeckResults}; use rustc_span::symbol::{kw, sym, Ident, Symbol}; @@ -334,7 +334,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { let (param_ty, projection) = match self_ty.kind() { ty::Param(_) => (true, None), ty::Projection(projection) => (false, Some(projection)), - _ => return, + _ => (false, None), }; // FIXME: Add check for trait bound that is already present, particularly `?Sized` so we @@ -453,6 +453,26 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { } } + hir::Node::Item(hir::Item { + kind: + hir::ItemKind::Struct(_, generics) + | hir::ItemKind::Enum(_, generics) + | hir::ItemKind::Union(_, generics) + | hir::ItemKind::Trait(_, _, generics, ..) + | hir::ItemKind::Impl(hir::Impl { generics, .. }) + | hir::ItemKind::Fn(_, generics, _) + | hir::ItemKind::TyAlias(_, generics) + | hir::ItemKind::TraitAlias(generics, _) + | hir::ItemKind::OpaqueTy(hir::OpaqueTy { generics, .. }), + .. + }) 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_arbitrary_trait_bound(generics, &mut err, ¶m_name, &constraint) { + return; + } + } hir::Node::Crate(..) => return, _ => {} @@ -1103,7 +1123,7 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { // 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", + "if trait `{}` were object-safe, you could return a trait object", trait_obj, )); } @@ -1881,10 +1901,26 @@ impl<'a, 'tcx> InferCtxtExt<'tcx> for InferCtxt<'a, 'tcx> { ObligationCauseCode::Coercion { source: _, target } => { err.note(&format!("required by cast to type `{}`", self.ty_to_string(target))); } - ObligationCauseCode::RepeatVec => { + ObligationCauseCode::RepeatVec(is_const_fn) => { err.note( "the `Copy` trait is required because the repeated element will be copied", ); + + if is_const_fn { + err.help( + "consider creating a new `const` item and initializing it with the result \ + of the function call to be used in the repeat position, like \ + `const VAL: Type = const_fn();` and `let x = [VAL; 42];`", + ); + } + + if self.tcx.sess.is_nightly_build() && is_const_fn { + err.help( + "create an inline `const` block, see RFC \ + #2920 \ + for more information", + ); + } } ObligationCauseCode::VariableType(hir_id) => { let parent_node = self.tcx.hir().get_parent_node(hir_id); diff --git a/compiler/rustc_trait_selection/src/traits/fulfill.rs b/compiler/rustc_trait_selection/src/traits/fulfill.rs index d4ced20f86..7d451fc234 100644 --- a/compiler/rustc_trait_selection/src/traits/fulfill.rs +++ b/compiler/rustc_trait_selection/src/traits/fulfill.rs @@ -6,6 +6,7 @@ use rustc_errors::ErrorReported; use rustc_infer::traits::{TraitEngine, TraitEngineExt as _, TraitObligation}; use rustc_middle::mir::interpret::ErrorHandled; use rustc_middle::ty::error::ExpectedFound; +use rustc_middle::ty::subst::SubstsRef; use rustc_middle::ty::ToPredicate; use rustc_middle::ty::{self, Binder, Const, Ty, TypeFoldable}; use std::marker::PhantomData; @@ -86,7 +87,7 @@ pub struct PendingPredicateObligation<'tcx> { } // `PendingPredicateObligation` is used a lot. Make sure it doesn't unintentionally get bigger. -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] static_assert_size!(PendingPredicateObligation<'_>, 56); impl<'a, 'tcx> FulfillmentContext<'tcx> { @@ -498,10 +499,10 @@ impl<'a, 'b, 'tcx> FulfillProcessor<'a, 'b, 'tcx> { ) { Ok(()) => ProcessResult::Changed(vec![]), Err(ErrorHandled::TooGeneric) => { - pending_obligation.stalled_on = substs - .iter() - .filter_map(TyOrConstInferVar::maybe_from_generic_arg) - .collect(); + pending_obligation.stalled_on.clear(); + pending_obligation.stalled_on.extend( + substs.iter().filter_map(TyOrConstInferVar::maybe_from_generic_arg), + ); ProcessResult::Unchanged } Err(e) => ProcessResult::Error(CodeSelectionError(ConstEvalFailure(e))), @@ -543,13 +544,10 @@ impl<'a, 'b, 'tcx> FulfillProcessor<'a, 'b, 'tcx> { ) { Ok(val) => Ok(Const::from_value(self.selcx.tcx(), val, c.ty)), Err(ErrorHandled::TooGeneric) => { - stalled_on.append( - &mut substs + stalled_on.extend( + substs .iter() - .filter_map(|arg| { - TyOrConstInferVar::maybe_from_generic_arg(arg) - }) - .collect(), + .filter_map(TyOrConstInferVar::maybe_from_generic_arg), ); Err(ErrorHandled::TooGeneric) } @@ -633,10 +631,11 @@ impl<'a, 'b, 'tcx> FulfillProcessor<'a, 'b, 'tcx> { // only reason we can fail to make progress on // trait selection is because we don't have enough // information about the types in the trait. - *stalled_on = trait_ref_infer_vars( + stalled_on.clear(); + stalled_on.extend(substs_infer_vars( self.selcx, - trait_obligation.predicate.map_bound(|pred| pred.trait_ref), - ); + trait_obligation.predicate.map_bound(|pred| pred.trait_ref.substs), + )); debug!( "process_predicate: pending obligation {:?} now stalled on {:?}", @@ -647,7 +646,7 @@ impl<'a, 'b, 'tcx> FulfillProcessor<'a, 'b, 'tcx> { ProcessResult::Unchanged } Err(selection_err) => { - info!("selecting trait at depth {} yielded Err", obligation.recursion_depth); + debug!("selecting trait at depth {} yielded Err", obligation.recursion_depth); ProcessResult::Error(CodeSelectionError(selection_err)) } @@ -663,10 +662,11 @@ impl<'a, 'b, 'tcx> FulfillProcessor<'a, 'b, 'tcx> { match project::poly_project_and_unify_type(self.selcx, &project_obligation) { Ok(Ok(Some(os))) => ProcessResult::Changed(mk_pending(os)), Ok(Ok(None)) => { - *stalled_on = trait_ref_infer_vars( + stalled_on.clear(); + stalled_on.extend(substs_infer_vars( self.selcx, - project_obligation.predicate.to_poly_trait_ref(tcx), - ); + project_obligation.predicate.map_bound(|pred| pred.projection_ty.substs), + )); ProcessResult::Unchanged } // Let the caller handle the recursion @@ -678,23 +678,28 @@ impl<'a, 'b, 'tcx> FulfillProcessor<'a, 'b, 'tcx> { } } -/// Returns the set of inference variables contained in a trait ref. -fn trait_ref_infer_vars<'a, 'tcx>( +/// Returns the set of inference variables contained in `substs`. +fn substs_infer_vars<'a, 'tcx>( selcx: &mut SelectionContext<'a, 'tcx>, - trait_ref: ty::PolyTraitRef<'tcx>, -) -> Vec> { + substs: ty::Binder>, +) -> impl Iterator> { selcx .infcx() - .resolve_vars_if_possible(trait_ref) - .skip_binder() - .substs + .resolve_vars_if_possible(substs) + .skip_binder() // ok because this check doesn't care about regions .iter() - // FIXME(eddyb) try using `skip_current_subtree` to skip everything that - // doesn't contain inference variables, not just the outermost level. .filter(|arg| arg.has_infer_types_or_consts()) - .flat_map(|arg| arg.walk()) + .flat_map(|arg| { + let mut walker = arg.walk(); + while let Some(c) = walker.next() { + if !c.has_infer_types_or_consts() { + walker.visited.remove(&c); + walker.skip_current_subtree(); + } + } + walker.visited.into_iter() + }) .filter_map(TyOrConstInferVar::maybe_from_generic_arg) - .collect() } fn to_fulfillment_error<'tcx>( diff --git a/compiler/rustc_trait_selection/src/traits/mod.rs b/compiler/rustc_trait_selection/src/traits/mod.rs index f7c0bafff0..5a8c53a0c4 100644 --- a/compiler/rustc_trait_selection/src/traits/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/mod.rs @@ -65,7 +65,8 @@ pub use self::util::{ get_vtable_index_of_object_method, impl_item_is_final, predicate_for_trait_def, upcast_choices, }; pub use self::util::{ - supertrait_def_ids, supertraits, transitive_bounds, SupertraitDefIds, Supertraits, + supertrait_def_ids, supertraits, transitive_bounds, transitive_bounds_that_define_assoc_type, + SupertraitDefIds, Supertraits, }; pub use self::chalk_fulfill::FulfillmentContext as ChalkFulfillmentContext; @@ -454,7 +455,6 @@ fn subst_and_check_impossible_predicates<'tcx>( /// Given a trait `trait_ref`, iterates the vtable entries /// that come from `trait_ref`, including its supertraits. -#[inline] // FIXME(#35870): avoid closures being unexported due to `impl Trait`. fn vtable_methods<'tcx>( tcx: TyCtxt<'tcx>, trait_ref: ty::PolyTraitRef<'tcx>, diff --git a/compiler/rustc_trait_selection/src/traits/object_safety.rs b/compiler/rustc_trait_selection/src/traits/object_safety.rs index e155f0366e..7de20e477f 100644 --- a/compiler/rustc_trait_selection/src/traits/object_safety.rs +++ b/compiler/rustc_trait_selection/src/traits/object_safety.rs @@ -292,11 +292,7 @@ fn predicate_references_self( // // This is ALT2 in issue #56288, see that for discussion of the // possible alternatives. - if data.projection_ty.trait_ref(tcx).substs[1..].iter().any(has_self_ty) { - Some(sp) - } else { - None - } + if data.projection_ty.substs[1..].iter().any(has_self_ty) { Some(sp) } else { None } } ty::PredicateKind::WellFormed(..) | ty::PredicateKind::ObjectSafe(..) diff --git a/compiler/rustc_trait_selection/src/traits/project.rs b/compiler/rustc_trait_selection/src/traits/project.rs index 6908480f43..0af6d64591 100644 --- a/compiler/rustc_trait_selection/src/traits/project.rs +++ b/compiler/rustc_trait_selection/src/traits/project.rs @@ -12,7 +12,7 @@ use super::SelectionContext; use super::SelectionError; use super::{ ImplSourceClosureData, ImplSourceDiscriminantKindData, ImplSourceFnPointerData, - ImplSourceGeneratorData, ImplSourceUserDefinedData, + ImplSourceGeneratorData, ImplSourcePointeeData, ImplSourceUserDefinedData, }; use super::{Normalized, NormalizedTy, ProjectionCacheEntry, ProjectionCacheKey}; @@ -741,11 +741,7 @@ fn project_type<'cx, 'tcx>( return Err(ProjectionTyError::TraitSelectionError(SelectionError::Overflow)); } - let obligation_trait_ref = &obligation.predicate.trait_ref(selcx.tcx()); - - debug!(?obligation_trait_ref); - - if obligation_trait_ref.references_error() { + if obligation.predicate.references_error() { return Ok(ProjectedTy::Progress(Progress::error(selcx.tcx()))); } @@ -754,19 +750,19 @@ 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, &mut candidates); - assemble_candidates_from_trait_def(selcx, obligation, &obligation_trait_ref, &mut candidates); + assemble_candidates_from_trait_def(selcx, obligation, &mut candidates); - assemble_candidates_from_object_ty(selcx, obligation, &obligation_trait_ref, &mut candidates); + assemble_candidates_from_object_ty(selcx, obligation, &mut candidates); if let ProjectionTyCandidateSet::Single(ProjectionTyCandidate::Object(_)) = candidates { // Avoid normalization cycle from selection (see // `assemble_candidates_from_object_ty`). // FIXME(lazy_normalization): Lazy normalization should save us from - // having to do special case this. + // having to special case this. } else { - assemble_candidates_from_impls(selcx, obligation, &obligation_trait_ref, &mut candidates); + assemble_candidates_from_impls(selcx, obligation, &mut candidates); }; match candidates { @@ -792,14 +788,12 @@ fn project_type<'cx, 'tcx>( fn assemble_candidates_from_param_env<'cx, 'tcx>( selcx: &mut SelectionContext<'cx, 'tcx>, obligation: &ProjectionTyObligation<'tcx>, - obligation_trait_ref: &ty::TraitRef<'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(), @@ -820,7 +814,6 @@ fn assemble_candidates_from_param_env<'cx, 'tcx>( fn assemble_candidates_from_trait_def<'cx, 'tcx>( selcx: &mut SelectionContext<'cx, 'tcx>, obligation: &ProjectionTyObligation<'tcx>, - obligation_trait_ref: &ty::TraitRef<'tcx>, candidate_set: &mut ProjectionTyCandidateSet<'tcx>, ) { debug!("assemble_candidates_from_trait_def(..)"); @@ -828,7 +821,7 @@ fn assemble_candidates_from_trait_def<'cx, 'tcx>( let tcx = selcx.tcx(); // Check whether the self-type is itself a projection. // If so, extract what we know from the trait and try to come up with a good answer. - let bounds = match *obligation_trait_ref.self_ty().kind() { + let bounds = match *obligation.predicate.self_ty().kind() { ty::Projection(ref data) => tcx.item_bounds(data.item_def_id).subst(tcx, data.substs), ty::Opaque(def_id, substs) => tcx.item_bounds(def_id).subst(tcx, substs), ty::Infer(ty::TyVar(_)) => { @@ -843,7 +836,6 @@ fn assemble_candidates_from_trait_def<'cx, 'tcx>( assemble_candidates_from_predicates( selcx, obligation, - obligation_trait_ref, candidate_set, ProjectionTyCandidate::TraitDef, bounds.iter(), @@ -863,14 +855,13 @@ fn assemble_candidates_from_trait_def<'cx, 'tcx>( fn assemble_candidates_from_object_ty<'cx, 'tcx>( selcx: &mut SelectionContext<'cx, 'tcx>, obligation: &ProjectionTyObligation<'tcx>, - obligation_trait_ref: &ty::TraitRef<'tcx>, candidate_set: &mut ProjectionTyCandidateSet<'tcx>, ) { debug!("assemble_candidates_from_object_ty(..)"); let tcx = selcx.tcx(); - let self_ty = obligation_trait_ref.self_ty(); + let self_ty = obligation.predicate.self_ty(); let object_ty = selcx.infcx().shallow_resolve(self_ty); let data = match object_ty.kind() { ty::Dynamic(data, ..) => data, @@ -890,7 +881,6 @@ fn assemble_candidates_from_object_ty<'cx, 'tcx>( assemble_candidates_from_predicates( selcx, obligation, - obligation_trait_ref, candidate_set, ProjectionTyCandidate::Object, env_predicates, @@ -901,7 +891,6 @@ fn assemble_candidates_from_object_ty<'cx, 'tcx>( fn assemble_candidates_from_predicates<'cx, 'tcx>( selcx: &mut SelectionContext<'cx, 'tcx>, obligation: &ProjectionTyObligation<'tcx>, - obligation_trait_ref: &ty::TraitRef<'tcx>, candidate_set: &mut ProjectionTyCandidateSet<'tcx>, ctor: fn(ty::PolyProjectionPredicate<'tcx>) -> ProjectionTyCandidate<'tcx>, env_predicates: impl Iterator>, @@ -921,8 +910,7 @@ fn assemble_candidates_from_predicates<'cx, 'tcx>( && infcx.probe(|_| { selcx.match_projection_projections( obligation, - obligation_trait_ref, - &data, + data, potentially_unnormalized_candidates, ) }); @@ -948,14 +936,13 @@ fn assemble_candidates_from_predicates<'cx, 'tcx>( fn assemble_candidates_from_impls<'cx, 'tcx>( selcx: &mut SelectionContext<'cx, 'tcx>, obligation: &ProjectionTyObligation<'tcx>, - obligation_trait_ref: &ty::TraitRef<'tcx>, candidate_set: &mut ProjectionTyCandidateSet<'tcx>, ) { debug!("assemble_candidates_from_impls"); // If we are resolving `>::Item == Type`, // start out by selecting the predicate `T as TraitRef<...>`: - let poly_trait_ref = ty::Binder::dummy(*obligation_trait_ref); + let poly_trait_ref = obligation.predicate.trait_ref(selcx.tcx()).to_poly_trait_ref(); let trait_obligation = obligation.with(poly_trait_ref.to_poly_trait_predicate()); let _ = selcx.infcx().commit_if_ok(|_| { let impl_source = match selcx.select(&trait_obligation) { @@ -1069,6 +1056,51 @@ fn assemble_candidates_from_impls<'cx, 'tcx>( | ty::Error(_) => false, } } + super::ImplSource::Pointee(..) => { + // While `Pointee` is automatically implemented for every type, + // the concrete metadata type may not be known yet. + // + // Any type with multiple potential metadata types is therefore not eligible. + let self_ty = selcx.infcx().shallow_resolve(obligation.predicate.self_ty()); + + // FIXME: should this normalize? + let tail = selcx.tcx().struct_tail_without_normalization(self_ty); + match tail.kind() { + ty::Bool + | ty::Char + | ty::Int(_) + | ty::Uint(_) + | ty::Float(_) + | ty::Foreign(_) + | ty::Str + | ty::Array(..) + | ty::Slice(_) + | ty::RawPtr(..) + | ty::Ref(..) + | ty::FnDef(..) + | ty::FnPtr(..) + | ty::Dynamic(..) + | ty::Closure(..) + | ty::Generator(..) + | ty::GeneratorWitness(..) + | ty::Never + // If returned by `struct_tail_without_normalization` this is a unit struct + // without any fields, or not a struct, and therefore is Sized. + | ty::Adt(..) + // If returned by `struct_tail_without_normalization` this is the empty tuple. + | ty::Tuple(..) + // Integers and floats are always Sized, and so have unit type metadata. + | ty::Infer(ty::InferTy::IntVar(_) | ty::InferTy::FloatVar(..)) => true, + + ty::Projection(..) + | ty::Opaque(..) + | ty::Param(..) + | ty::Bound(..) + | ty::Placeholder(..) + | ty::Infer(..) + | ty::Error(_) => false, + } + } super::ImplSource::Param(..) => { // This case tell us nothing about the value of an // associated type. Consider: @@ -1169,6 +1201,7 @@ fn confirm_select_candidate<'cx, 'tcx>( super::ImplSource::DiscriminantKind(data) => { confirm_discriminant_kind_candidate(selcx, obligation, data) } + super::ImplSource::Pointee(data) => confirm_pointee_candidate(selcx, obligation, data), super::ImplSource::Object(_) | super::ImplSource::AutoImpl(..) | super::ImplSource::Param(..) @@ -1256,6 +1289,26 @@ fn confirm_discriminant_kind_candidate<'cx, 'tcx>( confirm_param_env_candidate(selcx, obligation, ty::Binder::dummy(predicate), false) } +fn confirm_pointee_candidate<'cx, 'tcx>( + selcx: &mut SelectionContext<'cx, 'tcx>, + obligation: &ProjectionTyObligation<'tcx>, + _: ImplSourcePointeeData, +) -> Progress<'tcx> { + let tcx = selcx.tcx(); + + let self_ty = selcx.infcx().shallow_resolve(obligation.predicate.self_ty()); + let substs = tcx.mk_substs([self_ty.into()].iter()); + + let metadata_def_id = tcx.require_lang_item(LangItem::Metadata, None); + + let predicate = ty::ProjectionPredicate { + projection_ty: ty::ProjectionTy { substs, item_def_id: metadata_def_id }, + ty: self_ty.ptr_metadata_ty(tcx), + }; + + confirm_param_env_candidate(selcx, obligation, ty::Binder::bind(predicate), false) +} + fn confirm_fn_pointer_candidate<'cx, 'tcx>( selcx: &mut SelectionContext<'cx, 'tcx>, obligation: &ProjectionTyObligation<'tcx>, @@ -1344,25 +1397,25 @@ fn confirm_param_env_candidate<'cx, 'tcx>( 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); + let cache_projection = cache_entry.projection_ty; + let obligation_projection = obligation.predicate; let mut nested_obligations = Vec::new(); - let cache_trait_ref = if potentially_unnormalized_candidate { + let cache_projection = if potentially_unnormalized_candidate { ensure_sufficient_stack(|| { normalize_with_depth_to( selcx, obligation.param_env, obligation.cause.clone(), obligation.recursion_depth + 1, - cache_trait_ref, + cache_projection, &mut nested_obligations, ) }) } else { - cache_trait_ref + cache_projection }; - match infcx.at(cause, param_env).eq(cache_trait_ref, obligation_trait_ref) { + match infcx.at(cause, param_env).eq(cache_projection, obligation_projection) { Ok(InferOk { value: _, obligations }) => { nested_obligations.extend(obligations); assoc_ty_own_obligations(selcx, obligation, &mut nested_obligations); diff --git a/compiler/rustc_trait_selection/src/traits/query/normalize.rs b/compiler/rustc_trait_selection/src/traits/query/normalize.rs index 33cd509cbb..c908e1418c 100644 --- a/compiler/rustc_trait_selection/src/traits/query/normalize.rs +++ b/compiler/rustc_trait_selection/src/traits/query/normalize.rs @@ -97,7 +97,7 @@ impl<'cx, 'tcx> TypeFolder<'tcx> for QueryNormalizer<'cx, 'tcx> { self.infcx.tcx } - #[instrument(skip(self))] + #[instrument(level = "debug", skip(self))] fn fold_ty(&mut self, ty: Ty<'tcx>) -> Ty<'tcx> { if !ty.has_projections() { return ty; diff --git a/compiler/rustc_trait_selection/src/traits/query/type_op/custom.rs b/compiler/rustc_trait_selection/src/traits/query/type_op/custom.rs index 1688539165..4f5476ca5d 100644 --- a/compiler/rustc_trait_selection/src/traits/query/type_op/custom.rs +++ b/compiler/rustc_trait_selection/src/traits/query/type_op/custom.rs @@ -43,7 +43,7 @@ where info!("fully_perform({:?})", self); } - scrape_region_constraints(infcx, || Ok((self.closure)(infcx)?)) + scrape_region_constraints(infcx, || (self.closure)(infcx)) } } @@ -62,7 +62,7 @@ fn scrape_region_constraints<'tcx, R>( infcx: &InferCtxt<'_, 'tcx>, op: impl FnOnce() -> Fallible>, ) -> Fallible<(R, Option>>)> { - let mut fulfill_cx = TraitEngine::new(infcx.tcx); + let mut fulfill_cx = >::new(infcx.tcx); let dummy_body_id = ObligationCause::dummy().body_id; // During NLL, we expect that nobody will register region diff --git a/compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs b/compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs index f09ce8d64e..752f6a8deb 100644 --- a/compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs +++ b/compiler/rustc_trait_selection/src/traits/select/candidate_assembly.rs @@ -267,6 +267,9 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { } else if lang_items.discriminant_kind_trait() == Some(def_id) { // `DiscriminantKind` is automatically implemented for every type. candidates.vec.push(DiscriminantKindCandidate); + } else if lang_items.pointee_trait() == Some(def_id) { + // `Pointee` is automatically implemented for every type. + candidates.vec.push(PointeeCandidate); } else if lang_items.sized_trait() == Some(def_id) { // Sized is never implementable by end-users, it is // always automatically computed. diff --git a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs index ed3e117fcf..272930f6bb 100644 --- a/compiler/rustc_trait_selection/src/traits/select/confirmation.rs +++ b/compiler/rustc_trait_selection/src/traits/select/confirmation.rs @@ -30,7 +30,8 @@ use crate::traits::{BuiltinDerivedObligation, ImplDerivedObligation}; use crate::traits::{ ImplSourceAutoImplData, ImplSourceBuiltinData, ImplSourceClosureData, ImplSourceDiscriminantKindData, ImplSourceFnPointerData, ImplSourceGeneratorData, - ImplSourceObjectData, ImplSourceTraitAliasData, ImplSourceUserDefinedData, + ImplSourceObjectData, ImplSourcePointeeData, ImplSourceTraitAliasData, + ImplSourceUserDefinedData, }; use crate::traits::{ObjectCastObligation, PredicateObligation, TraitObligation}; use crate::traits::{Obligation, ObligationCause}; @@ -99,6 +100,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { Ok(ImplSource::DiscriminantKind(ImplSourceDiscriminantKindData)) } + PointeeCandidate => Ok(ImplSource::Pointee(ImplSourcePointeeData)), + TraitAliasCandidate(alias_def_id) => { let data = self.confirm_trait_alias_candidate(obligation, alias_def_id); Ok(ImplSource::TraitAlias(data)) diff --git a/compiler/rustc_trait_selection/src/traits/select/mod.rs b/compiler/rustc_trait_selection/src/traits/select/mod.rs index 87c8099dc3..45b5aff40a 100644 --- a/compiler/rustc_trait_selection/src/traits/select/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/select/mod.rs @@ -32,6 +32,7 @@ use rustc_errors::ErrorReported; use rustc_hir as hir; use rustc_hir::def_id::DefId; use rustc_hir::Constness; +use rustc_infer::infer::LateBoundRegionConversionTime; use rustc_middle::dep_graph::{DepKind, DepNodeIndex}; use rustc_middle::mir::interpret::ErrorHandled; use rustc_middle::ty::fast_reject; @@ -1254,32 +1255,33 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { pub(super) fn match_projection_projections( &mut self, obligation: &ProjectionTyObligation<'tcx>, - obligation_trait_ref: &ty::TraitRef<'tcx>, - data: &PolyProjectionPredicate<'tcx>, + env_predicate: PolyProjectionPredicate<'tcx>, potentially_unnormalized_candidates: bool, ) -> bool { let mut nested_obligations = Vec::new(); - let projection_ty = if potentially_unnormalized_candidates { + let (infer_predicate, _) = self.infcx.replace_bound_vars_with_fresh_vars( + obligation.cause.span, + LateBoundRegionConversionTime::HigherRankedType, + env_predicate, + ); + let infer_projection = if potentially_unnormalized_candidates { ensure_sufficient_stack(|| { project::normalize_with_depth_to( self, obligation.param_env, obligation.cause.clone(), obligation.recursion_depth + 1, - data.map_bound(|data| data.projection_ty), + infer_predicate.projection_ty, &mut nested_obligations, ) }) } else { - data.map_bound(|data| data.projection_ty) + infer_predicate.projection_ty }; - // FIXME(generic_associated_types): Compare the whole projections - let data_poly_trait_ref = projection_ty.map_bound(|proj| proj.trait_ref(self.tcx())); - let obligation_poly_trait_ref = ty::Binder::dummy(*obligation_trait_ref); self.infcx .at(&obligation.cause, obligation.param_env) - .sup(obligation_poly_trait_ref, data_poly_trait_ref) + .sup(obligation.predicate, infer_projection) .map_or(false, |InferOk { obligations, value: () }| { self.evaluate_predicates_recursively( TraitObligationStackList::empty(&ProvisionalEvaluationCache::default()), @@ -1318,8 +1320,8 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { let is_global = |cand: &ty::PolyTraitRef<'_>| cand.is_global() && !cand.has_late_bound_regions(); - // (*) Prefer `BuiltinCandidate { has_nested: false }` and `DiscriminantKindCandidate` - // to anything else. + // (*) Prefer `BuiltinCandidate { has_nested: false }`, `PointeeCandidate`, + // and `DiscriminantKindCandidate` to anything else. // // This is a fix for #53123 and prevents winnowing from accidentally extending the // lifetime of a variable. @@ -1332,8 +1334,18 @@ impl<'cx, 'tcx> SelectionContext<'cx, 'tcx> { } // (*) - (BuiltinCandidate { has_nested: false } | DiscriminantKindCandidate, _) => true, - (_, BuiltinCandidate { has_nested: false } | DiscriminantKindCandidate) => false, + ( + BuiltinCandidate { has_nested: false } + | DiscriminantKindCandidate + | PointeeCandidate, + _, + ) => true, + ( + _, + BuiltinCandidate { has_nested: false } + | DiscriminantKindCandidate + | PointeeCandidate, + ) => false, (ParamCandidate(other), ParamCandidate(victim)) => { if other.value == victim.value && victim.constness == Constness::NotConst { diff --git a/compiler/rustc_trait_selection/src/traits/specialize/mod.rs b/compiler/rustc_trait_selection/src/traits/specialize/mod.rs index 0133a961c1..264cc4f248 100644 --- a/compiler/rustc_trait_selection/src/traits/specialize/mod.rs +++ b/compiler/rustc_trait_selection/src/traits/specialize/mod.rs @@ -349,7 +349,7 @@ fn report_negative_positive_conflict( E0751, "found both positive and negative implementation of trait `{}`{}:", overlap.trait_desc, - overlap.self_desc.clone().map_or(String::new(), |ty| format!(" for type `{}`", ty)) + overlap.self_desc.clone().map_or_else(String::new, |ty| format!(" for type `{}`", ty)) ); match tcx.span_of_impl(negative_impl_def_id) { @@ -397,7 +397,10 @@ fn report_conflicting_impls( 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_else(String::new, |ty| { format!(" for type `{}`", ty) }), match used_to_be_allowed { Some(FutureCompatOverlapErrorKind::Issue33140) => " (E0119)", _ => "", @@ -415,7 +418,7 @@ fn report_conflicting_impls( impl_span, format!( "conflicting implementation{}", - overlap.self_desc.map_or(String::new(), |ty| format!(" for `{}`", ty)) + overlap.self_desc.map_or_else(String::new, |ty| format!(" for `{}`", ty)) ), ); } diff --git a/compiler/rustc_traits/Cargo.toml b/compiler/rustc_traits/Cargo.toml index 8fdbc3b76b..a7ce14afaa 100644 --- a/compiler/rustc_traits/Cargo.toml +++ b/compiler/rustc_traits/Cargo.toml @@ -16,6 +16,6 @@ rustc_span = { path = "../rustc_span" } chalk-ir = "0.55.0" chalk-solve = "0.55.0" chalk-engine = "0.55.0" -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } rustc_infer = { path = "../rustc_infer" } rustc_trait_selection = { path = "../rustc_trait_selection" } diff --git a/compiler/rustc_traits/src/chalk/lowering.rs b/compiler/rustc_traits/src/chalk/lowering.rs index 7d3589c4b6..fdf5f697e6 100644 --- a/compiler/rustc_traits/src/chalk/lowering.rs +++ b/compiler/rustc_traits/src/chalk/lowering.rs @@ -779,14 +779,11 @@ impl<'tcx> LowerInto<'tcx, chalk_solve::rust_ir::AliasEqBound self, interner: &RustInterner<'tcx>, ) -> chalk_solve::rust_ir::AliasEqBound> { - let trait_ref = self.projection_ty.trait_ref(interner.tcx); + let (trait_ref, own_substs) = self.projection_ty.trait_ref_and_own_substs(interner.tcx); chalk_solve::rust_ir::AliasEqBound { trait_bound: trait_ref.lower_into(interner), associated_ty_id: chalk_ir::AssocTypeId(self.projection_ty.item_def_id), - parameters: self.projection_ty.substs[trait_ref.substs.len()..] - .iter() - .map(|arg| arg.lower_into(interner)) - .collect(), + parameters: own_substs.iter().map(|arg| arg.lower_into(interner)).collect(), value: self.ty.lower_into(interner), } } diff --git a/compiler/rustc_traits/src/chalk/mod.rs b/compiler/rustc_traits/src/chalk/mod.rs index d98f18182c..b7275bac19 100644 --- a/compiler/rustc_traits/src/chalk/mod.rs +++ b/compiler/rustc_traits/src/chalk/mod.rs @@ -165,7 +165,7 @@ crate fn evaluate_goal<'tcx>( // let's just ignore that let sol = Canonical { max_universe: ty::UniverseIndex::from_usize(0), - variables: obligation.variables.clone(), + variables: obligation.variables, value: QueryResponse { var_values: CanonicalVarValues { var_values: IndexVec::new() } .make_identity(tcx), diff --git a/compiler/rustc_traits/src/dropck_outlives.rs b/compiler/rustc_traits/src/dropck_outlives.rs index 2827163d85..9d5b9d7357 100644 --- a/compiler/rustc_traits/src/dropck_outlives.rs +++ b/compiler/rustc_traits/src/dropck_outlives.rs @@ -75,12 +75,12 @@ fn dropck_outlives<'tcx>( // Set used to detect infinite recursion. let mut ty_set = FxHashSet::default(); - let mut fulfill_cx = TraitEngine::new(infcx.tcx); + let mut fulfill_cx = >::new(infcx.tcx); let cause = ObligationCause::dummy(); let mut constraints = DtorckConstraint::empty(); while let Some((ty, depth)) = ty_stack.pop() { - info!( + debug!( "{} kinds, {} overflows, {} ty_stack", result.kinds.len(), result.overflows.len(), diff --git a/compiler/rustc_ty_utils/src/instance.rs b/compiler/rustc_ty_utils/src/instance.rs index cf2c6efb47..6b9d46ee0a 100644 --- a/compiler/rustc_ty_utils/src/instance.rs +++ b/compiler/rustc_ty_utils/src/instance.rs @@ -10,6 +10,7 @@ use traits::{translate_substs, Reveal}; use tracing::debug; +#[instrument(level = "debug", skip(tcx))] fn resolve_instance<'tcx>( tcx: TyCtxt<'tcx>, key: ty::ParamEnvAnd<'tcx, (DefId, SubstsRef<'tcx>)>, @@ -38,13 +39,13 @@ fn resolve_instance_of_const_arg<'tcx>( ) } +#[instrument(level = "debug", skip(tcx))] fn inner_resolve_instance<'tcx>( tcx: TyCtxt<'tcx>, key: ty::ParamEnvAnd<'tcx, (ty::WithOptConstParam, SubstsRef<'tcx>)>, ) -> Result>, ErrorReported> { let (param_env, (def, substs)) = key.into_parts(); - debug!("resolve(def={:?}, substs={:?})", def.did, substs); let result = if let Some(trait_def_id) = tcx.trait_of_item(def.did) { debug!(" => associated item, attempting to find impl in param_env {:#?}", param_env); let item = tcx.associated_item(def.did); @@ -93,7 +94,7 @@ fn inner_resolve_instance<'tcx>( }; Ok(Some(Instance { def, substs })) }; - debug!("resolve(def.did={:?}, substs={:?}) = {:?}", def.did, substs, result); + debug!("inner_resolve_instance: result={:?}", result); result } @@ -274,7 +275,8 @@ fn resolve_associated_item<'tcx>( traits::ImplSource::AutoImpl(..) | traits::ImplSource::Param(..) | traits::ImplSource::TraitAlias(..) - | traits::ImplSource::DiscriminantKind(..) => None, + | traits::ImplSource::DiscriminantKind(..) + | traits::ImplSource::Pointee(..) => None, }) } diff --git a/compiler/rustc_ty_utils/src/lib.rs b/compiler/rustc_ty_utils/src/lib.rs index 904c0062a9..aa5d338840 100644 --- a/compiler/rustc_ty_utils/src/lib.rs +++ b/compiler/rustc_ty_utils/src/lib.rs @@ -5,6 +5,8 @@ //! This API is completely unstable and subject to change. #![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")] +#![feature(half_open_range_patterns)] +#![feature(exclusive_range_pattern)] #![feature(nll)] #![recursion_limit = "256"] diff --git a/compiler/rustc_ty_utils/src/ty.rs b/compiler/rustc_ty_utils/src/ty.rs index 77aa441340..29f1761b84 100644 --- a/compiler/rustc_ty_utils/src/ty.rs +++ b/compiler/rustc_ty_utils/src/ty.rs @@ -82,7 +82,7 @@ fn associated_item_from_trait_item_ref( parent_def_id: LocalDefId, trait_item_ref: &hir::TraitItemRef, ) -> ty::AssocItem { - let def_id = tcx.hir().local_def_id(trait_item_ref.id.hir_id); + let def_id = trait_item_ref.id.def_id; let (kind, has_self) = match trait_item_ref.kind { hir::AssocItemKind::Const => (ty::AssocKind::Const, false), hir::AssocItemKind::Fn { has_self } => (ty::AssocKind::Fn, has_self), @@ -105,7 +105,7 @@ fn associated_item_from_impl_item_ref( parent_def_id: LocalDefId, impl_item_ref: &hir::ImplItemRef<'_>, ) -> ty::AssocItem { - let def_id = tcx.hir().local_def_id(impl_item_ref.id.hir_id); + let def_id = impl_item_ref.id.def_id; let (kind, has_self) = match impl_item_ref.kind { hir::AssocItemKind::Const => (ty::AssocKind::Const, false), hir::AssocItemKind::Fn { has_self } => (ty::AssocKind::Fn, has_self), @@ -130,7 +130,9 @@ fn associated_item(tcx: TyCtxt<'_>, def_id: DefId) -> ty::AssocItem { let parent_item = tcx.hir().expect_item(parent_id); match parent_item.kind { hir::ItemKind::Impl(ref impl_) => { - if let Some(impl_item_ref) = impl_.items.iter().find(|i| i.id.hir_id == id) { + if let Some(impl_item_ref) = + impl_.items.iter().find(|i| i.id.def_id.to_def_id() == def_id) + { let assoc_item = associated_item_from_impl_item_ref(tcx, parent_def_id, impl_item_ref); debug_assert_eq!(assoc_item.def_id, def_id); @@ -139,7 +141,9 @@ fn associated_item(tcx: TyCtxt<'_>, def_id: DefId) -> ty::AssocItem { } hir::ItemKind::Trait(.., ref trait_item_refs) => { - if let Some(trait_item_ref) = trait_item_refs.iter().find(|i| i.id.hir_id == id) { + if let Some(trait_item_ref) = + trait_item_refs.iter().find(|i| i.id.def_id.to_def_id() == def_id) + { let assoc_item = associated_item_from_trait_item_ref(tcx, parent_def_id, trait_item_ref); debug_assert_eq!(assoc_item.def_id, def_id); @@ -196,17 +200,10 @@ fn associated_item_def_ids(tcx: TyCtxt<'_>, def_id: DefId) -> &[DefId] { 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).to_def_id()), + trait_item_refs.iter().map(|trait_item_ref| trait_item_ref.id.def_id.to_def_id()), ), hir::ItemKind::Impl(ref impl_) => tcx.arena.alloc_from_iter( - impl_ - .items - .iter() - .map(|impl_item_ref| impl_item_ref.id) - .map(|id| tcx.hir().local_def_id(id.hir_id).to_def_id()), + impl_.items.iter().map(|impl_item_ref| impl_item_ref.id.def_id.to_def_id()), ), hir::ItemKind::TraitAlias(..) => &[], _ => span_bug!(item.span, "associated_item_def_ids: not impl or trait"), @@ -484,6 +481,63 @@ fn asyncness(tcx: TyCtxt<'_>, def_id: DefId) -> hir::IsAsync { fn_like.asyncness() } +/// Don't call this directly: use ``tcx.conservative_is_privately_uninhabited`` instead. +#[instrument(level = "debug", skip(tcx))] +pub fn conservative_is_privately_uninhabited_raw<'tcx>( + tcx: TyCtxt<'tcx>, + param_env_and: ty::ParamEnvAnd<'tcx, Ty<'tcx>>, +) -> bool { + let (param_env, ty) = param_env_and.into_parts(); + match ty.kind() { + ty::Never => { + debug!("ty::Never =>"); + true + } + ty::Adt(def, _) if def.is_union() => { + debug!("ty::Adt(def, _) if def.is_union() =>"); + // For now, `union`s are never considered uninhabited. + false + } + ty::Adt(def, substs) => { + debug!("ty::Adt(def, _) if def.is_not_union() =>"); + // Any ADT is uninhabited if either: + // (a) It has no variants (i.e. an empty `enum`); + // (b) Each of its variants (a single one in the case of a `struct`) has at least + // one uninhabited field. + def.variants.iter().all(|var| { + var.fields.iter().any(|field| { + let ty = tcx.type_of(field.did).subst(tcx, substs); + tcx.conservative_is_privately_uninhabited(param_env.and(ty)) + }) + }) + } + ty::Tuple(..) => { + debug!("ty::Tuple(..) =>"); + ty.tuple_fields().any(|ty| tcx.conservative_is_privately_uninhabited(param_env.and(ty))) + } + ty::Array(ty, len) => { + debug!("ty::Array(ty, len) =>"); + match len.try_eval_usize(tcx, param_env) { + Some(0) | None => false, + // If the array is definitely non-empty, it's uninhabited if + // the type of its elements is uninhabited. + Some(1..) => tcx.conservative_is_privately_uninhabited(param_env.and(ty)), + } + } + ty::Ref(..) => { + debug!("ty::Ref(..) =>"); + // References to uninitialised memory is valid for any type, including + // uninhabited types, in unsafe code, so we treat all references as + // inhabited. + false + } + _ => { + debug!("_ =>"); + false + } + } +} + pub fn provide(providers: &mut ty::query::Providers) { *providers = ty::query::Providers { asyncness, @@ -501,6 +555,7 @@ pub fn provide(providers: &mut ty::query::Providers) { instance_def_size_estimate, issue33140_self_ty, impl_defaultness, + conservative_is_privately_uninhabited: conservative_is_privately_uninhabited_raw, ..*providers }; } diff --git a/compiler/rustc_type_ir/src/lib.rs b/compiler/rustc_type_ir/src/lib.rs index 7e70af21c0..fccd8b795e 100644 --- a/compiler/rustc_type_ir/src/lib.rs +++ b/compiler/rustc_type_ir/src/lib.rs @@ -427,7 +427,7 @@ impl UnifyKey for FloatVid { } } -#[derive(Copy, Clone, PartialEq, Decodable, Encodable)] +#[derive(Copy, Clone, PartialEq, Decodable, Encodable, Hash)] 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 diff --git a/compiler/rustc_typeck/Cargo.toml b/compiler/rustc_typeck/Cargo.toml index e3ba0bea7e..d92d317e34 100644 --- a/compiler/rustc_typeck/Cargo.toml +++ b/compiler/rustc_typeck/Cargo.toml @@ -20,7 +20,7 @@ rustc_hir = { path = "../rustc_hir" } rustc_hir_pretty = { path = "../rustc_hir_pretty" } rustc_target = { path = "../rustc_target" } rustc_session = { path = "../rustc_session" } -smallvec = { version = "1.0", features = ["union", "may_dangle"] } +smallvec = { version = "1.6.1", features = ["union", "may_dangle"] } rustc_ast = { path = "../rustc_ast" } rustc_span = { path = "../rustc_span" } rustc_index = { path = "../rustc_index" } diff --git a/compiler/rustc_typeck/src/astconv/errors.rs b/compiler/rustc_typeck/src/astconv/errors.rs index 545c30169b..b5404c3a15 100644 --- a/compiler/rustc_typeck/src/astconv/errors.rs +++ b/compiler/rustc_typeck/src/astconv/errors.rs @@ -237,7 +237,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { } } if let ([], [bound]) = (&potential_assoc_types[..], &trait_bounds) { - match &bound.trait_ref.path.segments[..] { + match bound.trait_ref.path.segments { // FIXME: `trait_ref.path.span` can point to a full path with multiple // segments, even though `trait_ref.path.segments` is of length `1`. Work // around that bug here, even though it should be fixed elsewhere. diff --git a/compiler/rustc_typeck/src/astconv/generics.rs b/compiler/rustc_typeck/src/astconv/generics.rs index 67e37ca8d8..0ea0ccacea 100644 --- a/compiler/rustc_typeck/src/astconv/generics.rs +++ b/compiler/rustc_typeck/src/astconv/generics.rs @@ -6,8 +6,9 @@ use crate::astconv::{ use crate::errors::AssocTypeBindingNotAllowed; use crate::structured_errors::{StructuredDiagnostic, WrongNumberOfGenericArgs}; use rustc_ast::ast::ParamKindOrd; -use rustc_errors::{struct_span_err, Applicability, ErrorReported}; +use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder, ErrorReported}; use rustc_hir as hir; +use rustc_hir::def::{DefKind, Res}; use rustc_hir::def_id::DefId; use rustc_hir::GenericArg; use rustc_middle::ty::{ @@ -43,23 +44,57 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { } } + let add_braces_suggestion = |arg: &GenericArg<'_>, err: &mut DiagnosticBuilder<'_>| { + let suggestions = vec![ + (arg.span().shrink_to_lo(), String::from("{ ")), + (arg.span().shrink_to_hi(), String::from(" }")), + ]; + err.multipart_suggestion( + "if this generic argument was intended as a const parameter, \ + surround it with braces", + suggestions, + Applicability::MaybeIncorrect, + ); + }; + // Specific suggestion set for diagnostics match (arg, ¶m.kind) { ( - GenericArg::Type(hir::Ty { kind: hir::TyKind::Path { .. }, .. }), - GenericParamDefKind::Const { .. }, - ) => { - let suggestions = vec![ - (arg.span().shrink_to_lo(), String::from("{ ")), - (arg.span().shrink_to_hi(), String::from(" }")), - ]; - err.multipart_suggestion( - "if this generic argument was intended as a const parameter, \ - try surrounding it with braces:", - suggestions, - Applicability::MaybeIncorrect, - ); - } + GenericArg::Type(hir::Ty { + kind: hir::TyKind::Path(rustc_hir::QPath::Resolved(_, path)), + .. + }), + GenericParamDefKind::Const, + ) => match path.res { + Res::Err => { + add_braces_suggestion(arg, &mut err); + err.set_primary_message( + "unresolved item provided when a constant was expected", + ) + .emit(); + return; + } + Res::Def(DefKind::TyParam, src_def_id) => { + if let Some(param_local_id) = param.def_id.as_local() { + let param_hir_id = tcx.hir().local_def_id_to_hir_id(param_local_id); + let param_name = tcx.hir().ty_param_name(param_hir_id); + let param_type = tcx.type_of(param.def_id); + if param_type.is_suggestable() { + err.span_suggestion( + tcx.def_span(src_def_id), + "consider changing this type paramater to a `const`-generic", + format!("const {}: {}", param_name, param_type), + Applicability::MaybeIncorrect, + ); + }; + } + } + _ => add_braces_suggestion(arg, &mut err), + }, + ( + GenericArg::Type(hir::Ty { kind: hir::TyKind::Path(_), .. }), + GenericParamDefKind::Const, + ) => add_braces_suggestion(arg, &mut err), ( GenericArg::Type(hir::Ty { kind: hir::TyKind::Array(_, len), .. }), GenericParamDefKind::Const { .. }, diff --git a/compiler/rustc_typeck/src/astconv/mod.rs b/compiler/rustc_typeck/src/astconv/mod.rs index 5659345f0f..7c5398003f 100644 --- a/compiler/rustc_typeck/src/astconv/mod.rs +++ b/compiler/rustc_typeck/src/astconv/mod.rs @@ -49,9 +49,10 @@ pub trait AstConv<'tcx> { fn default_constness_for_trait_bounds(&self) -> Constness; - /// Returns predicates in scope of the form `X: Foo`, where `X` is - /// a type parameter `X` with the given id `def_id`. This is a - /// subset of the full set of predicates. + /// Returns predicates in scope of the form `X: Foo`, where `X` + /// is a type parameter `X` with the given id `def_id` and T + /// matches `assoc_name`. This is a subset of the full set of + /// predicates. /// /// This is used for one specific purpose: resolving "short-hand" /// associated type references like `T::Item`. In principle, we @@ -60,7 +61,12 @@ pub trait AstConv<'tcx> { /// but this can lead to cycle errors. The problem is that we have /// to do this resolution *in order to create the predicates in /// the first place*. Hence, we have this "special pass". - fn get_type_parameter_bounds(&self, span: Span, def_id: DefId) -> ty::GenericPredicates<'tcx>; + fn get_type_parameter_bounds( + &self, + span: Span, + def_id: DefId, + assoc_name: Ident, + ) -> ty::GenericPredicates<'tcx>; /// Returns the lifetime to use when a lifetime is omitted (and not elided). fn re_infer(&self, param: Option<&ty::GenericParamDef>, span: Span) @@ -792,7 +798,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { } // Returns `true` if a bounds list includes `?Sized`. - pub fn is_unsized(&self, ast_bounds: &[hir::GenericBound<'_>], span: Span) -> bool { + pub fn is_unsized(&self, ast_bounds: &[&hir::GenericBound<'_>], span: Span) -> bool { let tcx = self.tcx(); // Try to find an unbound in bounds. @@ -850,7 +856,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { fn add_bounds( &self, param_ty: Ty<'tcx>, - ast_bounds: &[hir::GenericBound<'_>], + ast_bounds: &[&hir::GenericBound<'_>], bounds: &mut Bounds<'tcx>, ) { let constness = self.default_constness_for_trait_bounds(); @@ -865,7 +871,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { hir::GenericBound::Trait(_, hir::TraitBoundModifier::Maybe) => {} hir::GenericBound::LangItemTrait(lang_item, span, hir_id, args) => self .instantiate_lang_item_trait_ref( - lang_item, span, hir_id, args, param_ty, bounds, + *lang_item, *span, *hir_id, args, param_ty, bounds, ), hir::GenericBound::Outlives(ref l) => bounds .region_bounds @@ -896,11 +902,46 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { ast_bounds: &[hir::GenericBound<'_>], sized_by_default: SizedByDefault, span: Span, + ) -> Bounds<'tcx> { + let ast_bounds: Vec<_> = ast_bounds.iter().collect(); + self.compute_bounds_inner(param_ty, &ast_bounds, sized_by_default, span) + } + + /// Convert the bounds in `ast_bounds` that refer to traits which define an associated type + /// named `assoc_name` into ty::Bounds. Ignore the rest. + pub fn compute_bounds_that_match_assoc_type( + &self, + param_ty: Ty<'tcx>, + ast_bounds: &[hir::GenericBound<'_>], + sized_by_default: SizedByDefault, + span: Span, + assoc_name: Ident, + ) -> Bounds<'tcx> { + let mut result = Vec::new(); + + for ast_bound in ast_bounds { + if let Some(trait_ref) = ast_bound.trait_ref() { + if let Some(trait_did) = trait_ref.trait_def_id() { + if self.tcx().trait_may_define_assoc_type(trait_did, assoc_name) { + result.push(ast_bound); + } + } + } + } + + self.compute_bounds_inner(param_ty, &result, sized_by_default, span) + } + + fn compute_bounds_inner( + &self, + param_ty: Ty<'tcx>, + ast_bounds: &[&hir::GenericBound<'_>], + sized_by_default: SizedByDefault, + span: Span, ) -> Bounds<'tcx> { let mut bounds = Bounds::default(); self.add_bounds(param_ty, ast_bounds, &mut bounds); - bounds.trait_bounds.sort_by_key(|(t, _, _)| t.def_id()); bounds.implicitly_sized = if let SizedByDefault::Yes = sized_by_default { if !self.is_unsized(ast_bounds, span) { Some(span) } else { None } @@ -943,10 +984,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { // // We want to produce `>::T == foo`. - debug!( - "add_predicates_for_ast_type_binding(hir_ref_id {:?}, trait_ref {:?}, binding {:?}, bounds {:?}", - hir_ref_id, trait_ref, binding, bounds - ); + debug!(?hir_ref_id, ?trait_ref, ?binding, ?bounds, "add_predicates_for_ast_type_binding",); let tcx = self.tcx(); let candidate = @@ -1098,7 +1136,8 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { // parameter to have a skipped binder. let param_ty = tcx.mk_projection(assoc_ty.def_id, projection_ty.skip_binder().substs); - self.add_bounds(param_ty, ast_bounds, bounds); + let ast_bounds: Vec<_> = ast_bounds.iter().collect(); + self.add_bounds(param_ty, &ast_bounds, bounds); } } Ok(()) @@ -1278,42 +1317,42 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { // De-duplicate auto traits so that, e.g., `dyn Trait + Send + Send` is the same as // `dyn Trait + Send`. - auto_traits.sort_by_key(|i| i.trait_ref().def_id()); - auto_traits.dedup_by_key(|i| i.trait_ref().def_id()); + // We remove duplicates by inserting into a `FxHashSet` to avoid re-ordering + // the bounds + let mut duplicates = FxHashSet::default(); + auto_traits.retain(|i| duplicates.insert(i.trait_ref().def_id())); debug!("regular_traits: {:?}", regular_traits); debug!("auto_traits: {:?}", auto_traits); - // Transform a `PolyTraitRef` into a `PolyExistentialTraitRef` by - // removing the dummy `Self` type (`trait_object_dummy_self`). - let trait_ref_to_existential = |trait_ref: ty::TraitRef<'tcx>| { - if trait_ref.self_ty() != dummy_self { - // FIXME: There appears to be a missing filter on top of `expand_trait_aliases`, - // which picks up non-supertraits where clauses - but also, the object safety - // completely ignores trait aliases, which could be object safety hazards. We - // `delay_span_bug` here to avoid an ICE in stable even when the feature is - // disabled. (#66420) - tcx.sess.delay_span_bug( - DUMMY_SP, - &format!( - "trait_ref_to_existential called on {:?} with non-dummy Self", - trait_ref, - ), - ); - } - ty::ExistentialTraitRef::erase_self_ty(tcx, trait_ref) - }; - // Erase the `dummy_self` (`trait_object_dummy_self`) used above. - let existential_trait_refs = - regular_traits.iter().map(|i| i.trait_ref().map_bound(trait_ref_to_existential)); + let existential_trait_refs = regular_traits.iter().map(|i| { + i.trait_ref().map_bound(|trait_ref: ty::TraitRef<'tcx>| { + if trait_ref.self_ty() != dummy_self { + // FIXME: There appears to be a missing filter on top of `expand_trait_aliases`, + // which picks up non-supertraits where clauses - but also, the object safety + // completely ignores trait aliases, which could be object safety hazards. We + // `delay_span_bug` here to avoid an ICE in stable even when the feature is + // disabled. (#66420) + tcx.sess.delay_span_bug( + DUMMY_SP, + &format!( + "trait_ref_to_existential called on {:?} with non-dummy Self", + trait_ref, + ), + ); + } + ty::ExistentialTraitRef::erase_self_ty(tcx, trait_ref) + }) + }); let existential_projections = bounds.projection_bounds.iter().map(|(bound, _)| { bound.map_bound(|b| { - let trait_ref = trait_ref_to_existential(b.projection_ty.trait_ref(tcx)); - ty::ExistentialProjection { - ty: b.ty, - item_def_id: b.projection_ty.item_def_id, - substs: trait_ref.substs, + if b.projection_ty.self_ty() != dummy_self { + tcx.sess.delay_span_bug( + DUMMY_SP, + &format!("trait_ref_to_existential called on {:?} with non-dummy Self", b), + ); } + ty::ExistentialProjection::erase_self_ty(tcx, b) }) }); @@ -1375,8 +1414,13 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { name: Symbol, ) { let mut err = struct_span_err!(self.tcx().sess, span, E0223, "ambiguous associated type"); - if let (Some(_), Ok(snippet)) = ( - self.tcx().sess.confused_type_with_std_module.borrow().get(&span), + if let (true, Ok(snippet)) = ( + self.tcx() + .sess + .confused_type_with_std_module + .borrow() + .keys() + .any(|full_span| full_span.contains(span)), self.tcx().sess.source_map().span_to_snippet(span), ) { err.span_suggestion( @@ -1413,8 +1457,9 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { ty_param_def_id, assoc_name, span, ); - let predicates = - &self.get_type_parameter_bounds(span, ty_param_def_id.to_def_id()).predicates; + let predicates = &self + .get_type_parameter_bounds(span, ty_param_def_id.to_def_id(), assoc_name) + .predicates; debug!("find_bound_for_assoc_item: predicates={:#?}", predicates); @@ -1422,11 +1467,12 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { let param_name = tcx.hir().ty_param_name(param_hir_id); self.one_bound_for_assoc_type( || { - traits::transitive_bounds( + traits::transitive_bounds_that_define_assoc_type( tcx, predicates.iter().filter_map(|(p, _)| { p.to_opt_poly_trait_ref().map(|trait_ref| trait_ref.value) }), + assoc_name, ) }, || param_name.to_string(), @@ -1562,6 +1608,8 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { // the whole path. // Will fail except for `T::A` and `Self::A`; i.e., if `qself_ty`/`qself_def` are not a type // parameter or `Self`. + // NOTE: When this function starts resolving `Trait::AssocTy` successfully + // it should also start reportint the `BARE_TRAIT_OBJECTS` lint. pub fn associated_path_to_ty( &self, hir_ref_id: hir::HirId, @@ -2145,15 +2193,17 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { } hir::TyKind::BareFn(ref bf) => { require_c_abi_if_c_variadic(tcx, &bf.decl, bf.abi, ast_ty.span); + tcx.mk_fn_ptr(self.ty_of_fn( bf.unsafety, bf.abi, &bf.decl, &hir::Generics::empty(), None, + Some(ast_ty), )) } - hir::TyKind::TraitObject(ref bounds, ref lifetime) => { + hir::TyKind::TraitObject(ref bounds, ref lifetime, _) => { self.conv_object_ty_poly_trait_ref(ast_ty.span, bounds, lifetime, borrowed) } hir::TyKind::Path(hir::QPath::Resolved(ref maybe_qself, ref path)) => { @@ -2162,8 +2212,8 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { self.res_to_ty(opt_self_ty, path, false) } hir::TyKind::OpaqueDef(item_id, ref lifetimes) => { - let opaque_ty = tcx.hir().expect_item(item_id.id); - let def_id = tcx.hir().local_def_id(item_id.id).to_def_id(); + let opaque_ty = tcx.hir().item(item_id); + let def_id = item_id.def_id.to_def_id(); match opaque_ty.kind { hir::ItemKind::OpaqueTy(hir::OpaqueTy { impl_trait_fn, .. }) => { @@ -2290,6 +2340,7 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { decl: &hir::FnDecl<'_>, generics: &hir::Generics<'_>, ident_span: Option, + hir_ty: Option<&hir::Ty<'_>>, ) -> ty::PolyFnSig<'tcx> { debug!("ty_of_fn"); @@ -2321,12 +2372,14 @@ impl<'o, 'tcx> dyn AstConv<'tcx> + 'o { // only want to emit an error complaining about them if infer types (`_`) are not // allowed. `allow_ty_infer` gates this behavior. We check for the presence of // `ident_span` to not emit an error twice when we have `fn foo(_: fn() -> _)`. + crate::collect::placeholder_type_error( tcx, ident_span.map(|sp| sp.shrink_to_hi()), - &generics.params[..], + generics.params, visitor.0, true, + hir_ty, ); } diff --git a/compiler/rustc_typeck/src/check/_match.rs b/compiler/rustc_typeck/src/check/_match.rs index 30e0e3eecd..d056f2c90f 100644 --- a/compiler/rustc_typeck/src/check/_match.rs +++ b/compiler/rustc_typeck/src/check/_match.rs @@ -1,10 +1,11 @@ use crate::check::coercion::{AsCoercionSite, CoerceMany}; use crate::check::{Diverges, Expectation, FnCtxt, Needs}; +use rustc_errors::{Applicability, DiagnosticBuilder}; use rustc_hir::{self as hir, ExprKind}; use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; use rustc_infer::traits::Obligation; use rustc_middle::ty::{self, ToPredicate, Ty, TyS}; -use rustc_span::Span; +use rustc_span::{MultiSpan, Span}; use rustc_trait_selection::opaque_types::InferCtxtExt as _; use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt; use rustc_trait_selection::traits::{ @@ -206,7 +207,64 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { ), }; let cause = self.cause(span, code); - coercion.coerce(self, &cause, &arm.body, arm_ty); + + // This is the moral equivalent of `coercion.coerce(self, cause, arm.body, arm_ty)`. + // We use it this way to be able to expand on the potential error and detect when a + // `match` tail statement could be a tail expression instead. If so, we suggest + // removing the stray semicolon. + coercion.coerce_inner( + self, + &cause, + Some(&arm.body), + arm_ty, + Some(&mut |err: &mut DiagnosticBuilder<'_>| { + let can_coerce_to_return_ty = match self.ret_coercion.as_ref() { + Some(ret_coercion) if self.in_tail_expr => { + let ret_ty = ret_coercion.borrow().expected_ty(); + let ret_ty = self.inh.infcx.shallow_resolve(ret_ty); + self.can_coerce(arm_ty, ret_ty) + && prior_arm_ty.map_or(true, |t| self.can_coerce(t, ret_ty)) + // The match arms need to unify for the case of `impl Trait`. + && !matches!(ret_ty.kind(), ty::Opaque(..)) + } + _ => false, + }; + if let (Expectation::IsLast(stmt), Some(ret), true) = + (orig_expected, self.ret_type_span, can_coerce_to_return_ty) + { + let semi_span = expr.span.shrink_to_hi().with_hi(stmt.hi()); + let mut ret_span: MultiSpan = semi_span.into(); + ret_span.push_span_label( + expr.span, + "this could be implicitly returned but it is a statement, not a \ + tail expression" + .to_owned(), + ); + ret_span.push_span_label( + ret, + "the `match` arms can conform to this return type".to_owned(), + ); + ret_span.push_span_label( + semi_span, + "the `match` is a statement because of this semicolon, consider \ + removing it" + .to_owned(), + ); + err.span_note( + ret_span, + "you might have meant to return the `match` expression", + ); + err.tool_only_span_suggestion( + semi_span, + "remove this semicolon", + String::new(), + Applicability::MaybeIncorrect, + ); + } + }), + false, + ); + other_arms.push(arm_span); if other_arms.len() > 5 { other_arms.remove(0); diff --git a/compiler/rustc_typeck/src/check/callee.rs b/compiler/rustc_typeck/src/check/callee.rs index 4836418b3c..a29f551800 100644 --- a/compiler/rustc_typeck/src/check/callee.rs +++ b/compiler/rustc_typeck/src/check/callee.rs @@ -4,7 +4,7 @@ use crate::type_error_struct; use rustc_errors::{struct_span_err, Applicability, DiagnosticBuilder}; use rustc_hir as hir; -use rustc_hir::def::Res; +use rustc_hir::def::{Namespace, Res}; use rustc_hir::def_id::{DefId, LOCAL_CRATE}; use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; use rustc_infer::{infer, traits}; @@ -77,11 +77,17 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let output = match result { None => { // this will report an error since original_callee_ty is not a fn - self.confirm_builtin_call(call_expr, original_callee_ty, arg_exprs, expected) + self.confirm_builtin_call( + call_expr, + callee_expr, + original_callee_ty, + arg_exprs, + expected, + ) } Some(CallStep::Builtin(callee_ty)) => { - self.confirm_builtin_call(call_expr, callee_ty, arg_exprs, expected) + self.confirm_builtin_call(call_expr, callee_expr, callee_ty, arg_exprs, expected) } Some(CallStep::DeferredClosure(fn_sig)) => { @@ -281,6 +287,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { fn confirm_builtin_call( &self, call_expr: &'tcx hir::Expr<'tcx>, + callee_expr: &'tcx hir::Expr<'tcx>, callee_ty: Ty<'tcx>, arg_exprs: &'tcx [hir::Expr<'tcx>], expected: Expectation<'tcx>, @@ -299,91 +306,104 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } } - if let hir::ExprKind::Call(callee, _) = call_expr.kind { - let mut err = type_error_struct!( - self.tcx.sess, - callee.span, - callee_ty, - E0618, - "expected function, found {}", - match unit_variant { - Some(ref path) => format!("enum variant `{}`", path), - None => format!("`{}`", callee_ty), - } - ); + let mut err = type_error_struct!( + self.tcx.sess, + callee_expr.span, + callee_ty, + E0618, + "expected function, found {}", + match unit_variant { + Some(ref path) => format!("enum variant `{}`", path), + None => format!("`{}`", callee_ty), + } + ); - self.identify_bad_closure_def_and_call( - &mut err, - call_expr.hir_id, - &callee.kind, - callee.span, - ); + self.identify_bad_closure_def_and_call( + &mut err, + call_expr.hir_id, + &callee_expr.kind, + callee_expr.span, + ); - if let Some(ref path) = unit_variant { - err.span_suggestion( - call_expr.span, - &format!( - "`{}` is a unit variant, you need to write it \ + if let Some(ref path) = unit_variant { + err.span_suggestion( + call_expr.span, + &format!( + "`{}` is a unit variant, you need to write it \ without the parenthesis", - path - ), - path.to_string(), - Applicability::MachineApplicable, - ); - } + path + ), + path.to_string(), + Applicability::MachineApplicable, + ); + } - let mut inner_callee_path = None; - let def = match callee.kind { - hir::ExprKind::Path(ref qpath) => { - self.typeck_results.borrow().qpath_res(qpath, callee.hir_id) + let mut inner_callee_path = None; + let def = match callee_expr.kind { + hir::ExprKind::Path(ref qpath) => { + self.typeck_results.borrow().qpath_res(qpath, callee_expr.hir_id) + } + hir::ExprKind::Call(ref inner_callee, _) => { + // If the call spans more than one line and the callee kind is + // itself another `ExprCall`, that's a clue that we might just be + // missing a semicolon (Issue #51055) + let call_is_multiline = + self.tcx.sess.source_map().is_multiline(call_expr.span); + if call_is_multiline { + err.span_suggestion( + callee_expr.span.shrink_to_hi(), + "consider using a semicolon here", + ";".to_owned(), + Applicability::MaybeIncorrect, + ); } - hir::ExprKind::Call(ref inner_callee, _) => { - // If the call spans more than one line and the callee kind is - // itself another `ExprCall`, that's a clue that we might just be - // missing a semicolon (Issue #51055) - let call_is_multiline = - self.tcx.sess.source_map().is_multiline(call_expr.span); - if call_is_multiline { - err.span_suggestion( - callee.span.shrink_to_hi(), - "try adding a semicolon", - ";".to_owned(), - Applicability::MaybeIncorrect, - ); - } - if let hir::ExprKind::Path(ref inner_qpath) = inner_callee.kind { - inner_callee_path = Some(inner_qpath); - self.typeck_results - .borrow() - .qpath_res(inner_qpath, inner_callee.hir_id) - } else { - Res::Err - } + if let hir::ExprKind::Path(ref inner_qpath) = inner_callee.kind { + inner_callee_path = Some(inner_qpath); + self.typeck_results.borrow().qpath_res(inner_qpath, inner_callee.hir_id) + } else { + Res::Err } - _ => Res::Err, - }; - - err.span_label(call_expr.span, "call expression requires function"); - - if let Some(span) = self.tcx.hir().res_span(def) { - let callee_ty = callee_ty.to_string(); - let label = match (unit_variant, inner_callee_path) { - (Some(path), _) => Some(format!("`{}` defined here", path)), - (_, Some(hir::QPath::Resolved(_, path))) => { - self.tcx.sess.source_map().span_to_snippet(path.span).ok().map( - |p| format!("`{}` defined here returns `{}`", p, callee_ty), - ) + } + _ => Res::Err, + }; + + err.span_label(call_expr.span, "call expression requires function"); + + if let Some(span) = self.tcx.hir().res_span(def) { + let callee_ty = callee_ty.to_string(); + let label = match (unit_variant, inner_callee_path) { + (Some(path), _) => Some(format!("`{}` defined here", path)), + (_, Some(hir::QPath::Resolved(_, path))) => self + .tcx + .sess + .source_map() + .span_to_snippet(path.span) + .ok() + .map(|p| format!("`{}` defined here returns `{}`", p, callee_ty)), + _ => { + match def { + // Emit a different diagnostic for local variables, as they are not + // type definitions themselves, but rather variables *of* that type. + Res::Local(hir_id) => Some(format!( + "`{}` has type `{}`", + self.tcx.hir().name(hir_id), + callee_ty + )), + Res::Def(kind, def_id) if kind.ns() == Some(Namespace::ValueNS) => { + Some(format!( + "`{}` defined here", + self.tcx.def_path_str(def_id), + )) + } + _ => Some(format!("`{}` defined here", callee_ty)), } - _ => Some(format!("`{}` defined here", callee_ty)), - }; - if let Some(label) = label { - err.span_label(span, label); } + }; + if let Some(label) = label { + err.span_label(span, label); } - err.emit(); - } else { - bug!("call_expr.kind should be an ExprKind::Call, got {:?}", call_expr.kind); } + err.emit(); // This is the "default" function signature, used in case of error. // In that case, we check each argument against "error" in order to @@ -446,7 +466,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let expected_arg_tys = self.expected_inputs_for_expected_output( call_expr.span, expected, - fn_sig.output().clone(), + fn_sig.output(), fn_sig.inputs(), ); diff --git a/compiler/rustc_typeck/src/check/cast.rs b/compiler/rustc_typeck/src/check/cast.rs index 7924ffe8a6..16c344e8e2 100644 --- a/compiler/rustc_typeck/src/check/cast.rs +++ b/compiler/rustc_typeck/src/check/cast.rs @@ -765,9 +765,8 @@ impl<'a, 'tcx> CastCheck<'tcx> { m_expr: ty::TypeAndMut<'tcx>, m_cast: ty::TypeAndMut<'tcx>, ) -> Result { - // array-ptr-cast. - - if m_expr.mutbl == hir::Mutability::Not && m_cast.mutbl == hir::Mutability::Not { + // array-ptr-cast: allow mut-to-mut, mut-to-const, const-to-const + if m_expr.mutbl == hir::Mutability::Mut || m_cast.mutbl == hir::Mutability::Not { if let ty::Array(ety, _) = m_expr.ty.kind() { // Due to the limitations of LLVM global constants, // region pointers end up pointing at copies of diff --git a/compiler/rustc_typeck/src/check/check.rs b/compiler/rustc_typeck/src/check/check.rs index 8e2b0bfd66..e2fc1da5c7 100644 --- a/compiler/rustc_typeck/src/check/check.rs +++ b/compiler/rustc_typeck/src/check/check.rs @@ -7,11 +7,13 @@ use rustc_attr as attr; use rustc_errors::{Applicability, ErrorReported}; use rustc_hir as hir; use rustc_hir::def_id::{DefId, LocalDefId, LOCAL_CRATE}; +use rustc_hir::intravisit::Visitor; use rustc_hir::lang_items::LangItem; -use rustc_hir::{ItemKind, Node}; +use rustc_hir::{def::Res, ItemKind, Node, PathSegment}; use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; use rustc_infer::infer::{RegionVariableOrigin, TyCtxtInferExt}; use rustc_middle::ty::fold::TypeFoldable; +use rustc_middle::ty::layout::MAX_SIMD_LANES; use rustc_middle::ty::subst::GenericArgKind; use rustc_middle::ty::util::{Discr, IntTypeExt, Representability}; use rustc_middle::ty::{self, ParamEnv, RegionKind, ToPredicate, Ty, TyCtxt}; @@ -85,8 +87,69 @@ pub(super) fn check_fn<'a, 'tcx>( let declared_ret_ty = fn_sig.output(); - let revealed_ret_ty = - fcx.instantiate_opaque_types_from_value(fn_id, declared_ret_ty, decl.output.span()); + let feature = match tcx.hir().get(fn_id) { + // TAIT usage in function return position. + // Example: + // + // ```rust + // type Foo = impl Debug; + // fn bar() -> Foo { 42 } + // ``` + Node::Item(hir::Item { kind: ItemKind::Fn(..), .. }) | + // TAIT usage in associated function return position. + // + // Example with a free type alias: + // + // ```rust + // type Foo = impl Debug; + // impl SomeTrait for SomeType { + // fn bar() -> Foo { 42 } + // } + // ``` + // + // Example with an associated TAIT: + // + // ```rust + // impl SomeTrait for SomeType { + // type Foo = impl Debug; + // fn bar() -> Self::Foo { 42 } + // } + // ``` + Node::ImplItem(hir::ImplItem { + kind: hir::ImplItemKind::Fn(..), .. + }) => None, + // Forbid TAIT in trait declarations for now. + // Examples: + // + // ```rust + // type Foo = impl Debug; + // trait Bar { + // fn bar() -> Foo; + // } + // trait Bop { + // type Bop: PartialEq; + // } + // ``` + Node::TraitItem(hir::TraitItem { + kind: hir::TraitItemKind::Fn(..), + .. + }) | + // Forbid TAIT in closure return position for now. + // Example: + // + // ```rust + // type Foo = impl Debug; + // let x = |y| -> Foo { 42 + y }; + // ``` + Node::Expr(hir::Expr { kind: hir::ExprKind::Closure(..), .. }) => Some(sym::type_alias_impl_trait), + node => bug!("Item being checked wasn't a function/closure: {:?}", node), + }; + let revealed_ret_ty = fcx.instantiate_opaque_types_from_value( + fn_id, + declared_ret_ty, + decl.output.span(), + feature, + ); debug!("check_fn: declared_ret_ty: {}, revealed_ret_ty: {}", declared_ret_ty, revealed_ret_ty); fcx.ret_coercion = Some(RefCell::new(CoerceMany::new(revealed_ret_ty))); fcx.ret_type_span = Some(decl.output.span()); @@ -372,8 +435,7 @@ pub(super) fn check_fn<'a, 'tcx>( (fcx, gen_ty) } -pub(super) fn check_struct(tcx: TyCtxt<'_>, id: hir::HirId, span: Span) { - let def_id = tcx.hir().local_def_id(id); +fn check_struct(tcx: TyCtxt<'_>, def_id: LocalDefId, span: Span) { let def = tcx.adt_def(def_id); def.destructor(tcx); // force the destructor to be evaluated check_representable(tcx, span, def_id); @@ -386,8 +448,7 @@ pub(super) fn check_struct(tcx: TyCtxt<'_>, id: hir::HirId, span: Span) { check_packed(tcx, span, def); } -fn check_union(tcx: TyCtxt<'_>, id: hir::HirId, span: Span) { - let def_id = tcx.hir().local_def_id(id); +fn check_union(tcx: TyCtxt<'_>, def_id: LocalDefId, span: Span) { let def = tcx.adt_def(def_id); def.destructor(tcx); // force the destructor to be evaluated check_representable(tcx, span, def_id); @@ -476,7 +537,7 @@ pub(super) fn check_opaque<'tcx>( /// Checks that an opaque type does not use `Self` or `T::Foo` projections that would result /// in "inheriting lifetimes". -#[instrument(skip(tcx, span))] +#[instrument(level = "debug", skip(tcx, span))] pub(super) fn check_opaque_for_inheriting_lifetimes( tcx: TyCtxt<'tcx>, def_id: LocalDefId, @@ -514,10 +575,11 @@ pub(super) fn check_opaque_for_inheriting_lifetimes( } } - #[derive(Debug)] struct ProhibitOpaqueVisitor<'tcx> { opaque_identity_ty: Ty<'tcx>, generics: &'tcx ty::Generics, + tcx: TyCtxt<'tcx>, + selftys: Vec<(Span, Option)>, } impl<'tcx> ty::fold::TypeVisitor<'tcx> for ProhibitOpaqueVisitor<'tcx> { @@ -534,6 +596,29 @@ pub(super) fn check_opaque_for_inheriting_lifetimes( } } + impl Visitor<'tcx> for ProhibitOpaqueVisitor<'tcx> { + type Map = rustc_middle::hir::map::Map<'tcx>; + + fn nested_visit_map(&mut self) -> hir::intravisit::NestedVisitorMap { + hir::intravisit::NestedVisitorMap::OnlyBodies(self.tcx.hir()) + } + + fn visit_ty(&mut self, arg: &'tcx hir::Ty<'tcx>) { + match arg.kind { + hir::TyKind::Path(hir::QPath::Resolved(None, path)) => match &path.segments { + [PathSegment { res: Some(Res::SelfTy(_, impl_ref)), .. }] => { + let impl_ty_name = + impl_ref.map(|(def_id, _)| self.tcx.def_path_str(def_id)); + self.selftys.push((path.span, impl_ty_name)); + } + _ => {} + }, + _ => {} + } + hir::intravisit::walk_ty(self, arg); + } + } + if let ItemKind::OpaqueTy(hir::OpaqueTy { origin: hir::OpaqueTyOrigin::AsyncFn | hir::OpaqueTyOrigin::FnReturn, .. @@ -545,17 +630,20 @@ pub(super) fn check_opaque_for_inheriting_lifetimes( InternalSubsts::identity_for_item(tcx, def_id.to_def_id()), ), generics: tcx.generics_of(def_id), + tcx, + selftys: vec![], }; let prohibit_opaque = tcx .explicit_item_bounds(def_id) .iter() .try_for_each(|(predicate, _)| predicate.visit_with(&mut visitor)); debug!( - "check_opaque_for_inheriting_lifetimes: prohibit_opaque={:?}, visitor={:?}", - prohibit_opaque, visitor + "check_opaque_for_inheriting_lifetimes: prohibit_opaque={:?}, visitor.opaque_identity_ty={:?}, visitor.generics={:?}", + prohibit_opaque, visitor.opaque_identity_ty, visitor.generics ); if let Some(ty) = prohibit_opaque.break_value() { + visitor.visit_item(&item); let is_async = match item.kind { ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) => { matches!(origin, hir::OpaqueTyOrigin::AsyncFn) @@ -572,15 +660,13 @@ pub(super) fn check_opaque_for_inheriting_lifetimes( if is_async { "async fn" } else { "impl Trait" }, ); - if let Ok(snippet) = tcx.sess.source_map().span_to_snippet(span) { - if snippet == "Self" { - err.span_suggestion( - span, - "consider spelling out the type instead", - format!("{:?}", ty), - Applicability::MaybeIncorrect, - ); - } + for (span, name) in visitor.selftys { + err.span_suggestion( + span, + "consider spelling out the type instead", + name.unwrap_or_else(|| format!("{:?}", ty)), + Applicability::MaybeIncorrect, + ); } err.emit(); } @@ -634,7 +720,8 @@ fn check_opaque_meets_bounds<'tcx>( // Checked when type checking the function containing them. hir::OpaqueTyOrigin::FnReturn | hir::OpaqueTyOrigin::AsyncFn => return, // Can have different predicates to their defining use - hir::OpaqueTyOrigin::Binding | hir::OpaqueTyOrigin::Misc => {} + hir::OpaqueTyOrigin::Binding | hir::OpaqueTyOrigin::Misc | hir::OpaqueTyOrigin::TyAlias => { + } } let hir_id = tcx.hir().local_def_id_to_hir_id(def_id); @@ -682,34 +769,32 @@ fn check_opaque_meets_bounds<'tcx>( pub fn check_item_type<'tcx>(tcx: TyCtxt<'tcx>, it: &'tcx hir::Item<'tcx>) { debug!( - "check_item_type(it.hir_id={}, it.name={})", - it.hir_id, - tcx.def_path_str(tcx.hir().local_def_id(it.hir_id).to_def_id()) + "check_item_type(it.def_id={:?}, it.name={})", + it.def_id, + tcx.def_path_str(it.def_id.to_def_id()) ); let _indenter = indenter(); match it.kind { // Consts can play a role in type-checking, so they are included here. hir::ItemKind::Static(..) => { - let def_id = tcx.hir().local_def_id(it.hir_id); - tcx.ensure().typeck(def_id); - maybe_check_static_with_link_section(tcx, def_id, it.span); - check_static_inhabited(tcx, def_id, it.span); + tcx.ensure().typeck(it.def_id); + maybe_check_static_with_link_section(tcx, it.def_id, it.span); + check_static_inhabited(tcx, it.def_id, it.span); } hir::ItemKind::Const(..) => { - tcx.ensure().typeck(tcx.hir().local_def_id(it.hir_id)); + tcx.ensure().typeck(it.def_id); } hir::ItemKind::Enum(ref enum_definition, _) => { - check_enum(tcx, it.span, &enum_definition.variants, it.hir_id); + check_enum(tcx, it.span, &enum_definition.variants, it.def_id); } hir::ItemKind::Fn(..) => {} // entirely within check_item_body hir::ItemKind::Impl(ref impl_) => { - debug!("ItemKind::Impl {} with id {}", it.ident, it.hir_id); - let impl_def_id = tcx.hir().local_def_id(it.hir_id); - if let Some(impl_trait_ref) = tcx.impl_trait_ref(impl_def_id) { + debug!("ItemKind::Impl {} with id {:?}", it.ident, it.def_id); + if let Some(impl_trait_ref) = tcx.impl_trait_ref(it.def_id) { check_impl_items_against_trait( tcx, it.span, - impl_def_id, + it.def_id, impl_trait_ref, &impl_.items, ); @@ -718,8 +803,7 @@ pub fn check_item_type<'tcx>(tcx: TyCtxt<'tcx>, it: &'tcx hir::Item<'tcx>) { } } hir::ItemKind::Trait(_, _, _, _, ref items) => { - let def_id = tcx.hir().local_def_id(it.hir_id); - check_on_unimplemented(tcx, def_id.to_def_id(), it); + check_on_unimplemented(tcx, it.def_id.to_def_id(), it); for item in items.iter() { let item = tcx.hir().trait_item(item.id); @@ -729,16 +813,15 @@ pub fn check_item_type<'tcx>(tcx: TyCtxt<'tcx>, it: &'tcx hir::Item<'tcx>) { fn_maybe_err(tcx, item.ident.span, abi); } hir::TraitItemKind::Type(.., Some(_default)) => { - let item_def_id = tcx.hir().local_def_id(item.hir_id).to_def_id(); - let assoc_item = tcx.associated_item(item_def_id); + let assoc_item = tcx.associated_item(item.def_id); let trait_substs = - InternalSubsts::identity_for_item(tcx, def_id.to_def_id()); + InternalSubsts::identity_for_item(tcx, it.def_id.to_def_id()); let _: Result<_, rustc_errors::ErrorReported> = check_type_bounds( tcx, assoc_item, assoc_item, item.span, - ty::TraitRef { def_id: def_id.to_def_id(), substs: trait_substs }, + ty::TraitRef { def_id: it.def_id.to_def_id(), substs: trait_substs }, ); } _ => {} @@ -746,10 +829,10 @@ pub fn check_item_type<'tcx>(tcx: TyCtxt<'tcx>, it: &'tcx hir::Item<'tcx>) { } } hir::ItemKind::Struct(..) => { - check_struct(tcx, it.hir_id, it.span); + check_struct(tcx, it.def_id, it.span); } hir::ItemKind::Union(..) => { - check_union(tcx, it.hir_id, it.span); + check_union(tcx, it.def_id, it.span); } hir::ItemKind::OpaqueTy(hir::OpaqueTy { origin, .. }) => { // HACK(jynelson): trying to infer the type of `impl trait` breaks documenting @@ -757,16 +840,13 @@ pub fn check_item_type<'tcx>(tcx: TyCtxt<'tcx>, it: &'tcx hir::Item<'tcx>) { // Since rustdoc doesn't care about the concrete type behind `impl Trait`, just don't look at it! // See https://github.com/rust-lang/rust/issues/75100 if !tcx.sess.opts.actually_rustdoc { - let def_id = tcx.hir().local_def_id(it.hir_id); - - let substs = InternalSubsts::identity_for_item(tcx, def_id.to_def_id()); - check_opaque(tcx, def_id, substs, it.span, &origin); + let substs = InternalSubsts::identity_for_item(tcx, it.def_id.to_def_id()); + check_opaque(tcx, it.def_id, substs, it.span, &origin); } } hir::ItemKind::TyAlias(..) => { - let def_id = tcx.hir().local_def_id(it.hir_id); - let pty_ty = tcx.type_of(def_id); - let generics = tcx.generics_of(def_id); + let pty_ty = tcx.type_of(it.def_id); + let generics = tcx.generics_of(it.def_id); check_type_params_are_used(tcx, &generics, pty_ty); } hir::ItemKind::ForeignMod { abi, items } => { @@ -784,7 +864,7 @@ pub fn check_item_type<'tcx>(tcx: TyCtxt<'tcx>, it: &'tcx hir::Item<'tcx>) { } } else { for item in items { - let def_id = tcx.hir().local_def_id(item.id.hir_id); + let def_id = item.id.def_id; let generics = tcx.generics_of(def_id); let own_counts = generics.own_counts(); if generics.params.len() - own_counts.lifetimes != 0 { @@ -834,9 +914,8 @@ pub fn check_item_type<'tcx>(tcx: TyCtxt<'tcx>, it: &'tcx hir::Item<'tcx>) { } pub(super) fn check_on_unimplemented(tcx: TyCtxt<'_>, trait_def_id: DefId, item: &hir::Item<'_>) { - let item_def_id = tcx.hir().local_def_id(item.hir_id); // an error would be reported if this fails. - let _ = traits::OnUnimplementedDirective::of_item(tcx, trait_def_id, item_def_id.to_def_id()); + let _ = traits::OnUnimplementedDirective::of_item(tcx, trait_def_id, item.def_id.to_def_id()); } pub(super) fn check_specialization_validity<'tcx>( @@ -937,7 +1016,7 @@ pub(super) fn check_impl_items_against_trait<'tcx>( // Check existing impl methods to see if they are both present in trait // and compatible with trait signature for impl_item in impl_items { - let ty_impl_item = tcx.associated_item(tcx.hir().local_def_id(impl_item.hir_id)); + let ty_impl_item = tcx.associated_item(impl_item.def_id); let mut items = associated_items.filter_by_name(tcx, ty_impl_item.ident, impl_trait_ref.def_id); @@ -1134,6 +1213,29 @@ pub fn check_simd(tcx: TyCtxt<'_>, sp: Span, def_id: LocalDefId) { .emit(); return; } + + let len = if let ty::Array(_ty, c) = e.kind() { + c.try_eval_usize(tcx, tcx.param_env(def.did)) + } else { + Some(fields.len() as u64) + }; + if let Some(len) = len { + if len == 0 { + struct_span_err!(tcx.sess, sp, E0075, "SIMD vector cannot be empty").emit(); + return; + } else if len > MAX_SIMD_LANES { + struct_span_err!( + tcx.sess, + sp, + E0075, + "SIMD vector cannot have more than {} elements", + MAX_SIMD_LANES, + ) + .emit(); + return; + } + } + match e.kind() { ty::Param(_) => { /* struct(T, T, T, T) is ok */ } _ if e.is_machine() => { /* struct(u8, u8, u8, u8) is ok */ } @@ -1312,13 +1414,12 @@ pub(super) fn check_transparent<'tcx>(tcx: TyCtxt<'tcx>, sp: Span, adt: &'tcx ty } #[allow(trivial_numeric_casts)] -pub fn check_enum<'tcx>( +fn check_enum<'tcx>( tcx: TyCtxt<'tcx>, sp: Span, vs: &'tcx [hir::Variant<'tcx>], - id: hir::HirId, + def_id: LocalDefId, ) { - let def_id = tcx.hir().local_def_id(id); let def = tcx.adt_def(def_id); def.destructor(tcx); // force the destructor to be evaluated @@ -1472,6 +1573,9 @@ fn async_opaque_type_cycle_error(tcx: TyCtxt<'tcx>, span: Span) { struct_span_err!(tcx.sess, span, E0733, "recursion in an `async fn` requires boxing") .span_label(span, "recursive `async fn`") .note("a recursive `async fn` must be rewritten to return a boxed `dyn Future`") + .note( + "consider using the `async_recursion` crate: https://crates.io/crates/async_recursion", + ) .emit(); } diff --git a/compiler/rustc_typeck/src/check/closure.rs b/compiler/rustc_typeck/src/check/closure.rs index f34aaec10a..431e6d70ff 100644 --- a/compiler/rustc_typeck/src/check/closure.rs +++ b/compiler/rustc_typeck/src/check/closure.rs @@ -208,7 +208,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { }); // Even if we can't infer the full signature, we may be able to - // infer the kind. This can occur if there is a trait-reference + // infer the kind. This can occur when we elaborate a predicate // like `F : Fn`. Note that due to subtyping we could encounter // many viable options, so pick the most restrictive. let expected_kind = self @@ -234,11 +234,11 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { debug!("deduce_sig_from_projection({:?})", projection); - let trait_ref = projection.to_poly_trait_ref(tcx); + let trait_def_id = projection.trait_def_id(tcx); - let is_fn = tcx.fn_trait_kind_from_lang_item(trait_ref.def_id()).is_some(); + let is_fn = tcx.fn_trait_kind_from_lang_item(trait_def_id).is_some(); let gen_trait = tcx.require_lang_item(LangItem::Generator, cause_span); - let is_gen = gen_trait == trait_ref.def_id(); + let is_gen = gen_trait == trait_def_id; if !is_fn && !is_gen { debug!("deduce_sig_from_projection: not fn or generator"); return None; @@ -256,7 +256,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } let input_tys = if is_fn { - let arg_param_ty = trait_ref.skip_binder().substs.type_at(1); + let arg_param_ty = projection.skip_binder().projection_ty.substs.type_at(1); let arg_param_ty = self.resolve_vars_if_possible(arg_param_ty); debug!("deduce_sig_from_projection: arg_param_ty={:?}", arg_param_ty); @@ -662,9 +662,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { }; // Check that this is a projection from the `Future` trait. - let trait_ref = predicate.projection_ty.trait_ref(self.tcx); + let trait_def_id = predicate.projection_ty.trait_def_id(self.tcx); let future_trait = self.tcx.require_lang_item(LangItem::Future, Some(cause_span)); - if trait_ref.def_id != future_trait { + if trait_def_id != future_trait { debug!("deduce_future_output_from_projection: not a future"); return None; } diff --git a/compiler/rustc_typeck/src/check/coercion.rs b/compiler/rustc_typeck/src/check/coercion.rs index b2395b7bb2..94aee87364 100644 --- a/compiler/rustc_typeck/src/check/coercion.rs +++ b/compiler/rustc_typeck/src/check/coercion.rs @@ -42,6 +42,7 @@ use rustc_hir as hir; use rustc_hir::def_id::DefId; use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; use rustc_infer::infer::{Coercion, InferOk, InferResult}; +use rustc_middle::lint::in_external_macro; use rustc_middle::ty::adjustment::{ Adjust, Adjustment, AllowTwoPhase, AutoBorrow, AutoBorrowMutability, PointerCast, }; @@ -1236,7 +1237,7 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> { /// The inner coercion "engine". If `expression` is `None`, this /// is a forced-unit case, and hence `expression_ty` must be /// `Nil`. - fn coerce_inner<'a>( + crate fn coerce_inner<'a>( &mut self, fcx: &FnCtxt<'a, 'tcx>, cause: &ObligationCause<'tcx>, @@ -1448,9 +1449,16 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> { expected.is_unit(), pointing_at_return_type, ) { - if cond_expr.span.desugaring_kind().is_none() { + // If the block is from an external macro, then do not suggest + // adding a semicolon, because there's nowhere to put it. + // See issue #81943. + if cond_expr.span.desugaring_kind().is_none() + && !in_external_macro(fcx.tcx.sess, cond_expr.span) + { err.span_label(cond_expr.span, "expected this to be `()`"); - fcx.suggest_semicolon_at_end(cond_expr.span, &mut err); + if expr.can_have_side_effects() { + fcx.suggest_semicolon_at_end(cond_expr.span, &mut err); + } } } fcx.get_node_fn_decl(parent).map(|(fn_decl, _, is_main)| (fn_decl, is_main)) @@ -1458,7 +1466,7 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> { fcx.get_fn_decl(parent_id) }; - if let (Some((fn_decl, can_suggest)), _) = (fn_decl, pointing_at_return_type) { + if let Some((fn_decl, can_suggest)) = fn_decl { if expression.is_none() { pointing_at_return_type |= fcx.suggest_missing_return_type( &mut err, @@ -1472,6 +1480,16 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> { fn_output = Some(&fn_decl.output); // `impl Trait` return type } } + + let parent_id = fcx.tcx.hir().get_parent_item(id); + let parent_item = fcx.tcx.hir().get(parent_id); + + if let (Some((expr, _)), Some((fn_decl, _, _))) = + (expression, fcx.get_node_fn_decl(parent_item)) + { + fcx.suggest_missing_return_expr(&mut err, expr, fn_decl, expected, found); + } + if let (Some(sp), Some(fn_output)) = (fcx.ret_coercion_span.get(), fn_output) { self.add_impl_trait_explanation(&mut err, cause, fcx, expected, sp, fn_output); } @@ -1536,7 +1554,7 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> { if let hir::FnRetTy::Return(ty) = fn_output { // Get the return type. if let hir::TyKind::OpaqueDef(..) = ty.kind { - let ty = AstConv::ast_ty_to_ty(fcx, ty); + let ty = >::ast_ty_to_ty(fcx, ty); // Get the `impl Trait`'s `DefId`. if let ty::Opaque(def_id, _) = ty.kind() { let hir_id = fcx.tcx.hir().local_def_id_to_hir_id(def_id.expect_local()); @@ -1598,7 +1616,7 @@ impl<'tcx, 'exprs, E: AsCoercionSite> CoerceMany<'tcx, 'exprs, E> { fn is_return_ty_unsized(&self, fcx: &FnCtxt<'a, 'tcx>, blk_id: hir::HirId) -> bool { if let Some((fn_decl, _)) = fcx.get_fn_decl(blk_id) { if let hir::FnRetTy::Return(ty) = fn_decl.output { - let ty = AstConv::ast_ty_to_ty(fcx, ty); + let ty = >::ast_ty_to_ty(fcx, ty); if let ty::Dynamic(..) = ty.kind() { return true; } diff --git a/compiler/rustc_typeck/src/check/compare_method.rs b/compiler/rustc_typeck/src/check/compare_method.rs index d37d6bc4f2..a30a810793 100644 --- a/compiler/rustc_typeck/src/check/compare_method.rs +++ b/compiler/rustc_typeck/src/check/compare_method.rs @@ -823,11 +823,11 @@ fn compare_synthetic_generics<'tcx>( // FIXME: this is obviously suboptimal since the name can already be used // as another generic argument let new_name = tcx.sess.source_map().span_to_snippet(trait_span).ok()?; - let trait_m = tcx.hir().local_def_id_to_hir_id(trait_m.def_id.as_local()?); - let trait_m = tcx.hir().trait_item(hir::TraitItemId { hir_id: trait_m }); + let trait_m = trait_m.def_id.as_local()?; + let trait_m = tcx.hir().trait_item(hir::TraitItemId { def_id: trait_m }); - let impl_m = tcx.hir().local_def_id_to_hir_id(impl_m.def_id.as_local()?); - let impl_m = tcx.hir().impl_item(hir::ImplItemId { hir_id: impl_m }); + let impl_m = impl_m.def_id.as_local()?; + let impl_m = tcx.hir().impl_item(hir::ImplItemId { def_id: impl_m }); // in case there are no generics, take the spot between the function name // and the opening paren of the argument list @@ -860,8 +860,8 @@ fn compare_synthetic_generics<'tcx>( (None, Some(hir::SyntheticTyParamKind::ImplTrait)) => { err.span_label(impl_span, "expected `impl Trait`, found generic parameter"); (|| { - let impl_m = tcx.hir().local_def_id_to_hir_id(impl_m.def_id.as_local()?); - let impl_m = tcx.hir().impl_item(hir::ImplItemId { hir_id: impl_m }); + let impl_m = impl_m.def_id.as_local()?; + let impl_m = tcx.hir().impl_item(hir::ImplItemId { def_id: impl_m }); let input_tys = match impl_m.kind { hir::ImplItemKind::Fn(ref sig, _) => sig.decl.inputs, _ => unreachable!(), diff --git a/compiler/rustc_typeck/src/check/demand.rs b/compiler/rustc_typeck/src/check/demand.rs index 3c9c683f4b..f9f67769e9 100644 --- a/compiler/rustc_typeck/src/check/demand.rs +++ b/compiler/rustc_typeck/src/check/demand.rs @@ -200,7 +200,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { if self.can_coerce(expr_ty, sole_field_ty) { let variant_path = self.tcx.def_path_str(variant.def_id); // FIXME #56861: DRYer prelude filtering - Some(variant_path.trim_start_matches("std::prelude::v1::").to_string()) + if let Some(path) = variant_path.strip_prefix("std::prelude::") { + if let Some((_, path)) = path.split_once("::") { + return Some(path.to_string()); + } + } + Some(variant_path) } else { None } @@ -616,10 +621,30 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } _ if sp == expr.span && !is_macro => { if let Some(steps) = self.deref_steps(checked_ty, expected) { + let expr = expr.peel_blocks(); + if steps == 1 { - // For a suggestion to make sense, the type would need to be `Copy`. - if self.infcx.type_is_copy_modulo_regions(self.param_env, expected, sp) { - if let Ok(code) = sm.span_to_snippet(sp) { + if let hir::ExprKind::AddrOf(_, mutbl, inner) = expr.kind { + // If the expression has `&`, removing it would fix the error + let prefix_span = expr.span.with_hi(inner.span.lo()); + let message = match mutbl { + hir::Mutability::Not => "consider removing the `&`", + hir::Mutability::Mut => "consider removing the `&mut`", + }; + let suggestion = String::new(); + return Some(( + prefix_span, + message, + suggestion, + Applicability::MachineApplicable, + )); + } else if self.infcx.type_is_copy_modulo_regions( + self.param_env, + expected, + sp, + ) { + // For this suggestion to make sense, the type would need to be `Copy`. + if let Ok(code) = sm.span_to_snippet(expr.span) { let message = if checked_ty.is_region_ptr() { "consider dereferencing the borrow" } else { @@ -631,7 +656,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { format!("*{}", code) }; return Some(( - sp, + expr.span, message, suggestion, Applicability::MachineApplicable, @@ -773,7 +798,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { if let hir::ExprKind::Lit(lit) = &expr.kind { lit.node.is_suffixed() } else { false } }; let is_negative_int = - |expr: &hir::Expr<'_>| matches!(expr.kind, hir::ExprKind::Unary(hir::UnOp::UnNeg, ..)); + |expr: &hir::Expr<'_>| matches!(expr.kind, hir::ExprKind::Unary(hir::UnOp::Neg, ..)); let is_uint = |ty: Ty<'_>| matches!(ty.kind(), ty::Uint(..)); let in_const_context = self.tcx.hir().is_inside_const_context(expr.hir_id); diff --git a/compiler/rustc_typeck/src/check/dropck.rs b/compiler/rustc_typeck/src/check/dropck.rs index 4c3c4fd447..4d74962d28 100644 --- a/compiler/rustc_typeck/src/check/dropck.rs +++ b/compiler/rustc_typeck/src/check/dropck.rs @@ -77,7 +77,7 @@ fn ensure_drop_params_and_item_params_correspond<'tcx>( tcx.infer_ctxt().enter(|ref infcx| { let impl_param_env = tcx.param_env(self_type_did); let tcx = infcx.tcx; - let mut fulfillment_cx = TraitEngine::new(tcx); + let mut fulfillment_cx = >::new(tcx); let named_type = tcx.type_of(self_type_did); diff --git a/compiler/rustc_typeck/src/check/expectation.rs b/compiler/rustc_typeck/src/check/expectation.rs index 5a5fc893d6..22be10a731 100644 --- a/compiler/rustc_typeck/src/check/expectation.rs +++ b/compiler/rustc_typeck/src/check/expectation.rs @@ -21,6 +21,8 @@ pub enum Expectation<'tcx> { /// This rvalue expression will be wrapped in `&` or `Box` and coerced /// to `&Ty` or `Box`, respectively. `Ty` is `[A]` or `Trait`. ExpectRvalueLikeUnsized(Ty<'tcx>), + + IsLast(Span), } impl<'a, 'tcx> Expectation<'tcx> { @@ -79,19 +81,20 @@ impl<'a, 'tcx> Expectation<'tcx> { // Resolves `expected` by a single level if it is a variable. If // there is no expected type or resolution is not possible (e.g., - // no constraints yet present), just returns `None`. + // no constraints yet present), just returns `self`. fn resolve(self, fcx: &FnCtxt<'a, 'tcx>) -> Expectation<'tcx> { match self { NoExpectation => NoExpectation, ExpectCastableToType(t) => ExpectCastableToType(fcx.resolve_vars_if_possible(t)), ExpectHasType(t) => ExpectHasType(fcx.resolve_vars_if_possible(t)), ExpectRvalueLikeUnsized(t) => ExpectRvalueLikeUnsized(fcx.resolve_vars_if_possible(t)), + IsLast(sp) => IsLast(sp), } } pub(super) fn to_option(self, fcx: &FnCtxt<'a, 'tcx>) -> Option> { match self.resolve(fcx) { - NoExpectation => None, + NoExpectation | IsLast(_) => None, ExpectCastableToType(ty) | ExpectHasType(ty) | ExpectRvalueLikeUnsized(ty) => Some(ty), } } @@ -103,7 +106,9 @@ impl<'a, 'tcx> Expectation<'tcx> { pub(super) fn only_has_type(self, fcx: &FnCtxt<'a, 'tcx>) -> Option> { match self.resolve(fcx) { ExpectHasType(ty) => Some(ty), - NoExpectation | ExpectCastableToType(_) | ExpectRvalueLikeUnsized(_) => None, + NoExpectation | ExpectCastableToType(_) | ExpectRvalueLikeUnsized(_) | IsLast(_) => { + None + } } } diff --git a/compiler/rustc_typeck/src/check/expr.rs b/compiler/rustc_typeck/src/check/expr.rs index 33b1c0bb2c..8951c08bd3 100644 --- a/compiler/rustc_typeck/src/check/expr.rs +++ b/compiler/rustc_typeck/src/check/expr.rs @@ -168,7 +168,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // without the final expr (e.g. `try { return; }`). We don't want to generate an // unreachable_code lint for it since warnings for autogenerated code are confusing. let is_try_block_generated_unit_expr = match expr.kind { - ExprKind::Call(_, ref args) if expr.span.is_desugaring(DesugaringKind::TryBlock) => { + ExprKind::Call(_, args) if expr.span.is_desugaring(DesugaringKind::TryBlock) => { args.len() == 1 && args[0].span.is_desugaring(DesugaringKind::TryBlock) } @@ -193,9 +193,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // diverging expression (e.g. it arose from desugaring of `try { return }`), // we skip issuing a warning because it is autogenerated code. ExprKind::Call(..) if expr.span.is_desugaring(DesugaringKind::TryBlock) => {} - ExprKind::Call(ref callee, _) => { - self.warn_if_unreachable(expr.hir_id, callee.span, "call") - } + ExprKind::Call(callee, _) => self.warn_if_unreachable(expr.hir_id, callee.span, "call"), ExprKind::MethodCall(_, ref span, _, _) => { self.warn_if_unreachable(expr.hir_id, *span, "call") } @@ -231,15 +229,15 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let tcx = self.tcx; match expr.kind { - ExprKind::Box(ref subexpr) => self.check_expr_box(subexpr, expected), + ExprKind::Box(subexpr) => self.check_expr_box(subexpr, expected), ExprKind::Lit(ref lit) => self.check_lit(&lit, expected), - ExprKind::Binary(op, ref lhs, ref rhs) => self.check_binop(expr, op, lhs, rhs), - ExprKind::Assign(ref lhs, ref rhs, ref span) => { + ExprKind::Binary(op, lhs, rhs) => self.check_binop(expr, op, lhs, rhs), + ExprKind::Assign(lhs, rhs, ref span) => { self.check_expr_assign(expr, expected, lhs, rhs, span) } - ExprKind::AssignOp(op, ref lhs, ref rhs) => self.check_binop_assign(expr, op, lhs, rhs), - ExprKind::Unary(unop, ref oprnd) => self.check_expr_unary(unop, oprnd, expected, expr), - ExprKind::AddrOf(kind, mutbl, ref oprnd) => { + ExprKind::AssignOp(op, lhs, rhs) => self.check_binop_assign(expr, op, lhs, rhs), + ExprKind::Unary(unop, oprnd) => self.check_expr_unary(unop, oprnd, expected, expr), + ExprKind::AddrOf(kind, mutbl, oprnd) => { self.check_expr_addr_of(kind, mutbl, oprnd, expected, expr) } ExprKind::Path(QPath::LangItem(lang_item, _)) => { @@ -247,7 +245,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } ExprKind::Path(ref qpath) => self.check_expr_path(qpath, expr), ExprKind::InlineAsm(asm) => self.check_expr_asm(asm), - ExprKind::LlvmInlineAsm(ref asm) => { + ExprKind::LlvmInlineAsm(asm) => { for expr in asm.outputs_exprs.iter().chain(asm.inputs_exprs.iter()) { self.check_expr(expr); } @@ -265,46 +263,42 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } } ExprKind::Ret(ref expr_opt) => self.check_expr_return(expr_opt.as_deref(), expr), - ExprKind::Loop(ref body, _, source, _) => { + ExprKind::Loop(body, _, source, _) => { self.check_expr_loop(body, source, expected, expr) } - ExprKind::Match(ref discrim, ref arms, match_src) => { + ExprKind::Match(discrim, arms, match_src) => { self.check_match(expr, &discrim, arms, expected, match_src) } - ExprKind::Closure(capture, ref decl, body_id, _, gen) => { + ExprKind::Closure(capture, decl, body_id, _, gen) => { self.check_expr_closure(expr, capture, &decl, body_id, gen, expected) } - ExprKind::Block(ref body, _) => self.check_block_with_expected(&body, expected), - ExprKind::Call(ref callee, ref args) => self.check_call(expr, &callee, args, expected), - ExprKind::MethodCall(ref segment, span, ref args, _) => { + ExprKind::Block(body, _) => self.check_block_with_expected(&body, expected), + ExprKind::Call(callee, args) => self.check_call(expr, &callee, args, expected), + ExprKind::MethodCall(segment, span, args, _) => { self.check_method_call(expr, segment, span, args, expected) } - ExprKind::Cast(ref e, ref t) => self.check_expr_cast(e, t, expr), - ExprKind::Type(ref e, ref t) => { + ExprKind::Cast(e, t) => self.check_expr_cast(e, t, expr), + ExprKind::Type(e, t) => { let ty = self.to_ty_saving_user_provided_ty(&t); self.check_expr_eq_type(&e, ty); ty } - ExprKind::If(ref cond, ref then_expr, ref opt_else_expr) => self.check_then_else( - &cond, - then_expr, - opt_else_expr.as_ref().map(|e| &**e), - expr.span, - expected, - ), - ExprKind::DropTemps(ref e) => self.check_expr_with_expectation(e, expected), - ExprKind::Array(ref args) => self.check_expr_array(args, expected, expr), + ExprKind::If(cond, then_expr, opt_else_expr) => { + self.check_then_else(cond, then_expr, opt_else_expr, expr.span, expected) + } + ExprKind::DropTemps(e) => self.check_expr_with_expectation(e, expected), + ExprKind::Array(args) => self.check_expr_array(args, expected, expr), ExprKind::ConstBlock(ref anon_const) => self.to_const(anon_const).ty, - ExprKind::Repeat(ref element, ref count) => { + ExprKind::Repeat(element, ref count) => { self.check_expr_repeat(element, count, expected, expr) } - ExprKind::Tup(ref elts) => self.check_expr_tuple(elts, expected, expr), - ExprKind::Struct(ref qpath, fields, ref base_expr) => { + ExprKind::Tup(elts) => self.check_expr_tuple(elts, expected, expr), + ExprKind::Struct(qpath, fields, ref base_expr) => { self.check_expr_struct(expr, expected, qpath, fields, base_expr) } - ExprKind::Field(ref base, field) => self.check_field(expr, &base, field), - ExprKind::Index(ref base, ref idx) => self.check_expr_index(base, idx, expr), - ExprKind::Yield(ref value, ref src) => self.check_expr_yield(value, expr, src), + ExprKind::Field(base, field) => self.check_field(expr, &base, field), + ExprKind::Index(base, idx) => self.check_expr_index(base, idx, expr), + ExprKind::Yield(value, ref src) => self.check_expr_yield(value, expr, src), hir::ExprKind::Err => tcx.ty_error(), } } @@ -327,15 +321,15 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { ) -> Ty<'tcx> { let tcx = self.tcx; let expected_inner = match unop { - hir::UnOp::UnNot | hir::UnOp::UnNeg => expected, - hir::UnOp::UnDeref => NoExpectation, + hir::UnOp::Not | hir::UnOp::Neg => expected, + hir::UnOp::Deref => NoExpectation, }; let mut oprnd_t = self.check_expr_with_expectation(&oprnd, expected_inner); if !oprnd_t.references_error() { oprnd_t = self.structurally_resolved_type(expr.span, oprnd_t); match unop { - hir::UnOp::UnDeref => { + hir::UnOp::Deref => { if let Some(ty) = self.lookup_derefing(expr, oprnd, oprnd_t) { oprnd_t = ty; } else { @@ -357,14 +351,14 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { oprnd_t = tcx.ty_error(); } } - hir::UnOp::UnNot => { + hir::UnOp::Not => { let result = self.check_user_unop(expr, oprnd_t, unop); // If it's builtin, we can reuse the type, this helps inference. if !(oprnd_t.is_integral() || *oprnd_t.kind() == ty::Bool) { oprnd_t = result; } } - hir::UnOp::UnNeg => { + hir::UnOp::Neg => { let result = self.check_user_unop(expr, oprnd_t, unop); // If it's builtin, we can reuse the type, this helps inference. if !oprnd_t.is_numeric() { @@ -545,7 +539,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let tcx = self.tcx; if let Ok(target_id) = destination.target_id { let (e_ty, cause); - if let Some(ref e) = expr_opt { + if let Some(e) = expr_opt { // If this is a break with a value, we need to type-check // the expression. Get an expected type from the loop context. let opt_coerce_to = { @@ -654,12 +648,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // We still need to assign a type to the inner expression to // prevent the ICE in #43162. - if let Some(ref e) = expr_opt { + if let Some(e) = expr_opt { self.check_expr_with_hint(e, err); // ... except when we try to 'break rust;'. // ICE this expression in particular (see #43162). - if let ExprKind::Path(QPath::Resolved(_, ref path)) = e.kind { + if let ExprKind::Path(QPath::Resolved(_, path)) = e.kind { if path.segments.len() == 1 && path.segments[0].ident.name == sym::rust { fatally_break_rust(self.tcx.sess); } @@ -678,7 +672,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { ) -> Ty<'tcx> { if self.ret_coercion.is_none() { self.tcx.sess.emit_err(ReturnStmtOutsideOfFnBody { span: expr.span }); - } else if let Some(ref e) = expr_opt { + } else if let Some(e) = expr_opt { if self.ret_coercion_span.get().is_none() { self.ret_coercion_span.set(Some(e.span)); } @@ -717,7 +711,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { }); let ret_ty = ret_coercion.borrow().expected_ty(); - let return_expr_ty = self.check_expr_with_hint(return_expr, ret_ty.clone()); + let return_expr_ty = self.check_expr_with_hint(return_expr, ret_ty); ret_coercion.borrow_mut().coerce( self, &self.cause(return_expr.span, ObligationCauseCode::ReturnValue(return_expr.hir_id)), @@ -1137,13 +1131,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let flds = expected.only_has_type(self).and_then(|ty| { let ty = self.resolve_vars_with_obligations(ty); match ty.kind() { - ty::Tuple(ref flds) => Some(&flds[..]), + ty::Tuple(flds) => Some(&flds[..]), _ => None, } }); let elt_ts_iter = elts.iter().enumerate().map(|(i, e)| match flds { - Some(ref fs) if i < fs.len() => { + Some(fs) if i < fs.len() => { let ety = fs[i].expect_ty(); self.check_expr_coercable_to_type(&e, ety, None); ety @@ -1164,7 +1158,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { expr: &hir::Expr<'_>, expected: Expectation<'tcx>, qpath: &QPath<'_>, - fields: &'tcx [hir::Field<'tcx>], + fields: &'tcx [hir::ExprField<'tcx>], base_expr: &'tcx Option<&'tcx hir::Expr<'tcx>>, ) -> Ty<'tcx> { // Find the relevant variant @@ -1237,7 +1231,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { expr_id: hir::HirId, span: Span, variant: &'tcx ty::VariantDef, - ast_fields: &'tcx [hir::Field<'tcx>], + ast_fields: &'tcx [hir::ExprField<'tcx>], check_completeness: bool, ) -> bool { let tcx = self.tcx; @@ -1326,13 +1320,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { fn check_struct_fields_on_error( &self, - fields: &'tcx [hir::Field<'tcx>], + fields: &'tcx [hir::ExprField<'tcx>], base_expr: &'tcx Option<&'tcx hir::Expr<'tcx>>, ) { for field in fields { self.check_expr(&field.expr); } - if let Some(ref base) = *base_expr { + if let Some(base) = *base_expr { self.check_expr(&base); } } @@ -1354,7 +1348,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { span: Span, remaining_fields: FxHashMap, ) { - let tcx = self.tcx; let len = remaining_fields.len(); let mut displayable_field_names = @@ -1362,25 +1355,29 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { displayable_field_names.sort(); - let truncated_fields_error = if len <= 3 { - String::new() - } else { - format!(" and {} other field{}", (len - 3), if len - 3 == 1 { "" } else { "s" }) + let mut truncated_fields_error = String::new(); + let remaining_fields_names = match &displayable_field_names[..] { + [field1] => format!("`{}`", field1), + [field1, field2] => format!("`{}` and `{}`", field1, field2), + [field1, field2, field3] => format!("`{}`, `{}` and `{}`", field1, field2, field3), + _ => { + truncated_fields_error = + format!(" and {} other field{}", len - 3, pluralize!(len - 3)); + displayable_field_names + .iter() + .take(3) + .map(|n| format!("`{}`", n)) + .collect::>() + .join(", ") + } }; - let remaining_fields_names = displayable_field_names - .iter() - .take(3) - .map(|n| format!("`{}`", n)) - .collect::>() - .join(", "); - struct_span_err!( - tcx.sess, + self.tcx.sess, span, E0063, "missing field{} {}{} in initializer of `{}`", - pluralize!(remaining_fields.len()), + pluralize!(len), remaining_fields_names, truncated_fields_error, adt_ty @@ -1414,8 +1411,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { &self, ty: Ty<'tcx>, variant: &'tcx ty::VariantDef, - field: &hir::Field<'_>, - skip_fields: &[hir::Field<'_>], + field: &hir::ExprField<'_>, + skip_fields: &[hir::ExprField<'_>], kind_name: &str, ty_span: Span, ) { @@ -1460,34 +1457,39 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { ), ); err.span_label(field.ident.span, "field does not exist"); - err.span_label( + err.span_suggestion( ty_span, + &format!( + "`{adt}::{variant}` is a tuple {kind_name}, use the appropriate syntax", + adt = ty, + variant = variant.ident, + ), format!( - "`{adt}::{variant}` is a tuple {kind_name}, \ - use the appropriate syntax: `{adt}::{variant}(/* fields */)`", + "{adt}::{variant}(/* fields */)", adt = ty, variant = variant.ident, - kind_name = kind_name ), + Applicability::HasPlaceholders, ); } _ => { err.span_label(variant.ident.span, format!("`{adt}` defined here", adt = ty)); err.span_label(field.ident.span, "field does not exist"); - err.span_label( + err.span_suggestion( ty_span, - format!( - "`{adt}` is a tuple {kind_name}, \ - use the appropriate syntax: `{adt}(/* fields */)`", + &format!( + "`{adt}` is a tuple {kind_name}, use the appropriate syntax", adt = ty, - kind_name = kind_name + kind_name = kind_name, ), + format!("{adt}(/* fields */)", adt = ty), + Applicability::HasPlaceholders, ); } }, _ => { // prevent all specified fields from being suggested - let skip_fields = skip_fields.iter().map(|ref x| x.ident.name); + let skip_fields = skip_fields.iter().map(|x| x.ident.name); if let Some(field_name) = Self::suggest_field_name(variant, field.ident.name, skip_fields.collect()) { @@ -1616,7 +1618,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { private_candidate = Some((base_def.did, field_ty)); } } - ty::Tuple(ref tys) => { + ty::Tuple(tys) => { let fstr = field.as_str(); if let Ok(index) = fstr.parse::() { if fstr == index.to_string() { @@ -2082,6 +2084,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } _ => { self.tcx.sess.emit_err(YieldExprOutsideOfGenerator { span: expr.span }); + // Avoid expressions without types during writeback (#78653). + self.check_expr(value); self.tcx.mk_unit() } } diff --git a/compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs b/compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs index bc1a07801a..dc8a804bfe 100644 --- a/compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs +++ b/compiler/rustc_typeck/src/check/fn_ctxt/_impl.rs @@ -6,6 +6,7 @@ use crate::check::callee::{self, DeferredCallResolution}; use crate::check::method::{self, MethodCallee, SelfSource}; use crate::check::{BreakableCtxt, Diverges, Expectation, FallbackMode, FnCtxt, LocalTy}; +use rustc_ast::TraitObjectSyntax; use rustc_data_structures::captures::Captures; use rustc_data_structures::fx::FxHashSet; use rustc_errors::{Applicability, DiagnosticBuilder, ErrorReported}; @@ -13,7 +14,7 @@ use rustc_hir as hir; use rustc_hir::def::{CtorOf, DefKind, Res}; use rustc_hir::def_id::DefId; use rustc_hir::lang_items::LangItem; -use rustc_hir::{ExprKind, GenericArg, Node, QPath}; +use rustc_hir::{ExprKind, GenericArg, Node, QPath, TyKind}; use rustc_infer::infer::canonical::{Canonical, OriginalQueryValues, QueryResponse}; use rustc_infer::infer::error_reporting::TypeAnnotationNeeded::E0282; use rustc_infer::infer::{InferOk, InferResult}; @@ -27,10 +28,12 @@ use rustc_middle::ty::{ Ty, UserType, }; use rustc_session::lint; -use rustc_span::hygiene::DesugaringKind; +use rustc_session::lint::builtin::BARE_TRAIT_OBJECTS; +use rustc_session::parse::feature_err; use rustc_span::source_map::{original_sp, DUMMY_SP}; use rustc_span::symbol::{kw, sym, Ident}; use rustc_span::{self, BytePos, MultiSpan, Span}; +use rustc_span::{hygiene::DesugaringKind, Symbol}; use rustc_trait_selection::infer::InferCtxtExt as _; use rustc_trait_selection::opaque_types::InferCtxtExt as _; use rustc_trait_selection::traits::error_reporting::InferCtxtExt as _; @@ -362,6 +365,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { parent_id: hir::HirId, value: T, value_span: Span, + feature: Option, ) -> T { let parent_def_id = self.tcx.hir().local_def_id(parent_id); debug!( @@ -380,7 +384,21 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let mut opaque_types = self.opaque_types.borrow_mut(); let mut opaque_types_vars = self.opaque_types_vars.borrow_mut(); + for (ty, decl) in opaque_type_map { + if let Some(feature) = feature { + if let hir::OpaqueTyOrigin::TyAlias = decl.origin { + if !self.tcx.features().enabled(feature) { + feature_err( + &self.tcx.sess.parse_sess, + feature, + value_span, + "type alias impl trait is not permitted here", + ) + .emit(); + } + } + } let _ = opaque_types.insert(ty, decl); let _ = opaque_types_vars.insert(decl.concrete_ty, decl.opaque_type); } @@ -457,7 +475,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } pub fn to_ty(&self, ast_t: &hir::Ty<'_>) -> Ty<'tcx> { - let t = AstConv::ast_ty_to_ty(self, ast_t); + let t = >::ast_ty_to_ty(self, ast_t); self.register_wf_obligation(t.into(), ast_t.span, traits::MiscObligation); t } @@ -769,9 +787,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { .filter_map(move |obligation| { let bound_predicate = obligation.predicate.kind(); match bound_predicate.skip_binder() { - ty::PredicateKind::Projection(data) => { - Some((bound_predicate.rebind(data).to_poly_trait_ref(self.tcx), obligation)) - } + ty::PredicateKind::Projection(data) => Some(( + bound_predicate.rebind(data).required_poly_trait_ref(self.tcx), + obligation, + )), ty::PredicateKind::Trait(data, _) => { Some((bound_predicate.rebind(data).to_poly_trait_ref(), obligation)) } @@ -838,7 +857,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // out unconstrained or ambiguous, as we're // just trying to get hints here. self.save_and_restore_in_snapshot_flag(|_| { - let mut fulfill = TraitEngine::new(self.tcx); + let mut fulfill = >::new(self.tcx); for obligation in ok.obligations { fulfill.register_predicate_obligation(self, obligation); } @@ -897,7 +916,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { return ( path.res, opt_qself.as_ref().map(|qself| self.to_ty(qself)), - &path.segments[..], + path.segments, ); } QPath::TypeRelative(ref qself, ref segment) => (self.to_ty(qself), qself, segment), @@ -931,6 +950,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { result }); + if result.is_ok() { + self.maybe_lint_bare_trait(qpath, hir_id); + } + // Write back the new resolution. self.write_resolution(hir_id, result); ( @@ -940,6 +963,29 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { ) } + fn maybe_lint_bare_trait(&self, qpath: &QPath<'_>, hir_id: hir::HirId) { + if let QPath::TypeRelative(self_ty, _) = qpath { + if let TyKind::TraitObject([poly_trait_ref, ..], _, TraitObjectSyntax::None) = + self_ty.kind + { + self.tcx.struct_span_lint_hir(BARE_TRAIT_OBJECTS, hir_id, self_ty.span, |lint| { + let mut db = lint + .build(&format!("trait objects without an explicit `dyn` are deprecated")); + let (sugg, app) = match self.tcx.sess.source_map().span_to_snippet(self_ty.span) + { + Ok(s) if poly_trait_ref.trait_ref.path.is_global() => { + (format!("", s), Applicability::MachineApplicable) + } + Ok(s) => (format!("", s), Applicability::MachineApplicable), + Err(_) => (">".to_string(), Applicability::HasPlaceholders), + }; + db.span_suggestion(self_ty.span, "use `dyn`", sugg, app); + db.emit() + }); + } + } + } + /// Given a function `Node`, return its `FnDecl` if it exists, or `None` otherwise. pub(in super::super) fn get_node_fn_decl( &self, @@ -1073,13 +1119,26 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { }; let last_expr_ty = self.node_ty(last_expr.hir_id); let needs_box = match (last_expr_ty.kind(), expected_ty.kind()) { + (ty::Opaque(last_def_id, _), ty::Opaque(exp_def_id, _)) + if last_def_id == exp_def_id => + { + StatementAsExpression::CorrectType + } (ty::Opaque(last_def_id, last_bounds), ty::Opaque(exp_def_id, exp_bounds)) => { debug!( "both opaque, likely future {:?} {:?} {:?} {:?}", last_def_id, last_bounds, exp_def_id, exp_bounds ); - let last_hir_id = self.tcx.hir().local_def_id_to_hir_id(last_def_id.expect_local()); - let exp_hir_id = self.tcx.hir().local_def_id_to_hir_id(exp_def_id.expect_local()); + + let (last_local_id, exp_local_id) = + match (last_def_id.as_local(), exp_def_id.as_local()) { + (Some(last_hir_id), Some(exp_hir_id)) => (last_hir_id, exp_hir_id), + (_, _) => return None, + }; + + let last_hir_id = self.tcx.hir().local_def_id_to_hir_id(last_local_id); + let exp_hir_id = self.tcx.hir().local_def_id_to_hir_id(exp_local_id); + match ( &self.tcx.hir().expect_item(last_hir_id).kind, &self.tcx.hir().expect_item(exp_hir_id).kind, @@ -1145,9 +1204,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let path_segs = match res { Res::Local(_) | Res::SelfCtor(_) => vec![], - Res::Def(kind, def_id) => { - AstConv::def_ids_for_value_path_segments(self, segments, self_ty, kind, def_id) - } + Res::Def(kind, def_id) => >::def_ids_for_value_path_segments( + self, segments, self_ty, kind, def_id, + ), _ => bug!("instantiate_value_path on {:?}", res), }; @@ -1190,7 +1249,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // errors if type parameters are provided in an inappropriate place. let generic_segs: FxHashSet<_> = path_segs.iter().map(|PathSeg(_, index)| index).collect(); - let generics_has_err = AstConv::prohibit_generics( + let generics_has_err = >::prohibit_generics( self, segments.iter().enumerate().filter_map(|(index, seg)| { if !generic_segs.contains(&index) || is_alias_variant_ctor { @@ -1233,7 +1292,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { if let GenericArgCountResult { correct: Err(GenericArgCountMismatch { reported: Some(_), .. }), .. - } = AstConv::check_generic_arg_count_for_call( + } = >::check_generic_arg_count_for_call( tcx, span, def_id, @@ -1341,7 +1400,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { ) -> subst::GenericArg<'tcx> { match (¶m.kind, arg) { (GenericParamDefKind::Lifetime, GenericArg::Lifetime(lt)) => { - AstConv::ast_region_to_region(self.fcx, lt, Some(param)).into() + >::ast_region_to_region(self.fcx, lt, Some(param)).into() } (GenericParamDefKind::Type { .. }, GenericArg::Type(ty)) => { self.fcx.to_ty(ty).into() @@ -1394,7 +1453,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } let substs = self_ctor_substs.unwrap_or_else(|| { - AstConv::create_substs_for_generic_args( + >::create_substs_for_generic_args( tcx, def_id, &[][..], diff --git a/compiler/rustc_typeck/src/check/fn_ctxt/checks.rs b/compiler/rustc_typeck/src/check/fn_ctxt/checks.rs index 3326be796c..c92c7f7ad0 100644 --- a/compiler/rustc_typeck/src/check/fn_ctxt/checks.rs +++ b/compiler/rustc_typeck/src/check/fn_ctxt/checks.rs @@ -439,7 +439,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { qpath: &QPath<'_>, hir_id: hir::HirId, ) -> Option<(&'tcx ty::VariantDef, Ty<'tcx>)> { - let path_span = qpath.qself_span(); + let path_span = qpath.span(); let (def, ty) = self.finish_resolving_struct_path(qpath, path_span, hir_id); let variant = match def { Res::Err => { @@ -539,7 +539,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { self.overwrite_local_ty_if_err(local, ty, pat_ty); } - pub fn check_stmt(&self, stmt: &'tcx hir::Stmt<'tcx>) { + pub fn check_stmt(&self, stmt: &'tcx hir::Stmt<'tcx>, is_last: bool) { // Don't do all the complex logic below for `DeclItem`. match stmt.kind { hir::StmtKind::Item(..) => return, @@ -561,11 +561,20 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { hir::StmtKind::Expr(ref expr) => { // Check with expected type of `()`. self.check_expr_has_type_or_error(&expr, self.tcx.mk_unit(), |err| { - self.suggest_semicolon_at_end(expr.span, err); + if expr.can_have_side_effects() { + self.suggest_semicolon_at_end(expr.span, err); + } }); } hir::StmtKind::Semi(ref expr) => { - self.check_expr(&expr); + // All of this is equivalent to calling `check_expr`, but it is inlined out here + // in order to capture the fact that this `match` is the last statement in its + // function. This is done for better suggestions to remove the `;`. + let expectation = match expr.kind { + hir::ExprKind::Match(..) if is_last => IsLast(stmt.span), + _ => NoExpectation, + }; + self.check_expr_with_expectation(expr, expectation); } } @@ -624,8 +633,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let ctxt = BreakableCtxt { coerce: Some(coerce), may_break: false }; let (ctxt, ()) = self.with_breakable_ctxt(blk.hir_id, ctxt, || { - for s in blk.stmts { - self.check_stmt(s); + for (pos, s) in blk.stmts.iter().enumerate() { + self.check_stmt(s, blk.stmts.len() - 1 == pos); } // check the tail expression **without** holding the @@ -866,7 +875,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { match *qpath { QPath::Resolved(ref maybe_qself, ref path) => { let self_ty = maybe_qself.as_ref().map(|qself| self.to_ty(qself)); - let ty = AstConv::res_to_ty(self, self_ty, path, true); + let ty = >::res_to_ty(self, self_ty, path, true); (path.res, ty) } QPath::TypeRelative(ref qself, ref segment) => { @@ -877,8 +886,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } else { Res::Err }; - let result = - AstConv::associated_path_to_ty(self, hir_id, path_span, ty, res, segment, true); + let result = >::associated_path_to_ty( + self, hir_id, path_span, ty, res, segment, true, + ); let ty = result.map(|(ty, _, _)| ty).unwrap_or_else(|_| self.tcx().ty_error()); let result = result.map(|(_, kind, def_id)| (kind, def_id)); @@ -991,7 +1001,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // would trigger in `is_send::();` // from `typeck-default-trait-impl-assoc-type.rs`. } else { - let ty = AstConv::ast_ty_to_ty(self, hir_ty); + let ty = >::ast_ty_to_ty(self, hir_ty); let ty = self.resolve_vars_if_possible(ty); if ty == predicate.self_ty() { error.obligation.cause.make_mut().span = hir_ty.span; diff --git a/compiler/rustc_typeck/src/check/fn_ctxt/mod.rs b/compiler/rustc_typeck/src/check/fn_ctxt/mod.rs index e9223f700d..4da4835f7c 100644 --- a/compiler/rustc_typeck/src/check/fn_ctxt/mod.rs +++ b/compiler/rustc_typeck/src/check/fn_ctxt/mod.rs @@ -20,6 +20,7 @@ use rustc_middle::ty::fold::TypeFoldable; use rustc_middle::ty::subst::GenericArgKind; use rustc_middle::ty::{self, Const, Ty, TyCtxt}; use rustc_session::Session; +use rustc_span::symbol::Ident; use rustc_span::{self, Span}; use rustc_trait_selection::traits::{ObligationCause, ObligationCauseCode}; @@ -183,7 +184,12 @@ impl<'a, 'tcx> AstConv<'tcx> for FnCtxt<'a, 'tcx> { } } - fn get_type_parameter_bounds(&self, _: Span, def_id: DefId) -> ty::GenericPredicates<'tcx> { + fn get_type_parameter_bounds( + &self, + _: Span, + def_id: DefId, + _: Ident, + ) -> ty::GenericPredicates<'tcx> { let tcx = self.tcx; let hir_id = tcx.hir().local_def_id_to_hir_id(def_id.expect_local()); let item_id = tcx.hir().ty_param_owner(hir_id); diff --git a/compiler/rustc_typeck/src/check/fn_ctxt/suggestions.rs b/compiler/rustc_typeck/src/check/fn_ctxt/suggestions.rs index a0465ca6ae..f90159efb5 100644 --- a/compiler/rustc_typeck/src/check/fn_ctxt/suggestions.rs +++ b/compiler/rustc_typeck/src/check/fn_ctxt/suggestions.rs @@ -10,7 +10,8 @@ use rustc_hir::def::{CtorOf, DefKind}; use rustc_hir::lang_items::LangItem; use rustc_hir::{ExprKind, ItemKind, Node}; use rustc_infer::infer; -use rustc_middle::ty::{self, Ty}; +use rustc_middle::lint::in_external_macro; +use rustc_middle::ty::{self, Binder, Ty}; use rustc_span::symbol::kw; use std::iter; @@ -44,11 +45,17 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { blk_id: hir::HirId, ) -> bool { let expr = expr.peel_drop_temps(); - self.suggest_missing_semicolon(err, expr, expected, cause_span); + // If the expression is from an external macro, then do not suggest + // adding a semicolon, because there's nowhere to put it. + // See issue #81943. + if expr.can_have_side_effects() && !in_external_macro(self.tcx.sess, cause_span) { + self.suggest_missing_semicolon(err, expr, expected, cause_span); + } let mut pointing_at_return_type = false; if let Some((fn_decl, can_suggest)) = self.get_fn_decl(blk_id) { pointing_at_return_type = self.suggest_missing_return_type(err, &fn_decl, expected, found, can_suggest); + self.suggest_missing_return_expr(err, expr, &fn_decl, expected, found); } pointing_at_return_type } @@ -392,10 +399,12 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { | ExprKind::Loop(..) | ExprKind::If(..) | ExprKind::Match(..) - | ExprKind::Block(..) => { + | ExprKind::Block(..) + if expression.can_have_side_effects() => + { err.span_suggestion( cause_span.shrink_to_hi(), - "try adding a semicolon", + "consider using a semicolon here", ";".to_string(), Applicability::MachineApplicable, ); @@ -452,7 +461,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // are not, the expectation must have been caused by something else. debug!("suggest_missing_return_type: return type {:?} node {:?}", ty, ty.kind); let sp = ty.span; - let ty = AstConv::ast_ty_to_ty(self, ty); + let ty = >::ast_ty_to_ty(self, ty); debug!("suggest_missing_return_type: return type {:?}", ty); debug!("suggest_missing_return_type: expected type {:?}", ty); if ty.kind() == expected.kind() { @@ -464,6 +473,35 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } } + pub(in super::super) fn suggest_missing_return_expr( + &self, + err: &mut DiagnosticBuilder<'_>, + expr: &'tcx hir::Expr<'tcx>, + fn_decl: &hir::FnDecl<'_>, + expected: Ty<'tcx>, + found: Ty<'tcx>, + ) { + if !expected.is_unit() { + return; + } + let found = self.resolve_vars_with_obligations(found); + if let hir::FnRetTy::Return(ty) = fn_decl.output { + let ty = >::ast_ty_to_ty(self, ty); + let ty = self.tcx.erase_late_bound_regions(Binder::bind(ty)); + let ty = self.normalize_associated_types_in(expr.span, ty); + if self.can_coerce(found, ty) { + err.multipart_suggestion( + "you might have meant to return this value", + vec![ + (expr.span.shrink_to_lo(), "return ".to_string()), + (expr.span.shrink_to_hi(), ";".to_string()), + ], + Applicability::MaybeIncorrect, + ); + } + } + } + pub(in super::super) fn suggest_missing_parentheses( &self, err: &mut DiagnosticBuilder<'_>, diff --git a/compiler/rustc_typeck/src/check/gather_locals.rs b/compiler/rustc_typeck/src/check/gather_locals.rs index 825ebc19fa..4c5d16d0b7 100644 --- a/compiler/rustc_typeck/src/check/gather_locals.rs +++ b/compiler/rustc_typeck/src/check/gather_locals.rs @@ -4,7 +4,7 @@ use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; use rustc_hir::PatKind; use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; use rustc_middle::ty::Ty; -use rustc_span::Span; +use rustc_span::{sym, Span}; use rustc_trait_selection::traits; use std::mem; @@ -58,11 +58,12 @@ impl<'a, 'tcx> Visitor<'tcx> for GatherLocalsVisitor<'a, 'tcx> { Some(ref ty) => { let o_ty = self.fcx.to_ty(&ty); - let revealed_ty = if self.fcx.tcx.features().impl_trait_in_bindings { - self.fcx.instantiate_opaque_types_from_value(self.parent_id, o_ty, ty.span) - } else { - o_ty - }; + let revealed_ty = self.fcx.instantiate_opaque_types_from_value( + self.parent_id, + o_ty, + ty.span, + Some(sym::impl_trait_in_bindings), + ); let c_ty = self.fcx.inh.infcx.canonicalize_user_type_annotation(UserType::Ty(revealed_ty)); diff --git a/compiler/rustc_typeck/src/check/inherited.rs b/compiler/rustc_typeck/src/check/inherited.rs index 0011a3fc71..1dacbade1b 100644 --- a/compiler/rustc_typeck/src/check/inherited.rs +++ b/compiler/rustc_typeck/src/check/inherited.rs @@ -117,7 +117,7 @@ impl Inherited<'a, 'tcx> { maybe_typeck_results: infcx.in_progress_typeck_results, }, infcx, - fulfillment_cx: RefCell::new(TraitEngine::new(tcx)), + fulfillment_cx: RefCell::new(>::new(tcx)), locals: RefCell::new(Default::default()), deferred_sized_obligations: RefCell::new(Vec::new()), deferred_call_resolutions: RefCell::new(Default::default()), diff --git a/compiler/rustc_typeck/src/check/intrinsic.rs b/compiler/rustc_typeck/src/check/intrinsic.rs index e99db7a247..990ed5abdb 100644 --- a/compiler/rustc_typeck/src/check/intrinsic.rs +++ b/compiler/rustc_typeck/src/check/intrinsic.rs @@ -9,7 +9,6 @@ use crate::require_same_types; use rustc_errors::struct_span_err; use rustc_hir as hir; -use rustc_hir::def_id::DefId; use rustc_middle::traits::{ObligationCause, ObligationCauseCode}; use rustc_middle::ty::subst::Subst; use rustc_middle::ty::{self, TyCtxt}; @@ -21,7 +20,6 @@ use std::iter; fn equate_intrinsic_type<'tcx>( tcx: TyCtxt<'tcx>, it: &hir::ForeignItem<'_>, - def_id: DefId, n_tps: usize, sig: ty::PolyFnSig<'tcx>, ) { @@ -35,7 +33,7 @@ fn equate_intrinsic_type<'tcx>( } } - let i_n_tps = tcx.generics_of(def_id).own_counts().types; + let i_n_tps = tcx.generics_of(it.def_id).own_counts().types; if i_n_tps != n_tps { let span = match it.kind { hir::ForeignItemKind::Fn(_, _, ref generics) => generics.span, @@ -51,8 +49,8 @@ fn equate_intrinsic_type<'tcx>( } let fty = tcx.mk_fn_ptr(sig); - let cause = ObligationCause::new(it.span, it.hir_id, ObligationCauseCode::IntrinsicType); - require_same_types(tcx, &cause, tcx.mk_fn_ptr(tcx.fn_sig(def_id)), fty); + let cause = ObligationCause::new(it.span, it.hir_id(), ObligationCauseCode::IntrinsicType); + require_same_types(tcx, &cause, tcx.mk_fn_ptr(tcx.fn_sig(it.def_id)), fty); } /// Returns `true` if the given intrinsic is unsafe to call or not. @@ -100,8 +98,7 @@ pub fn intrinsic_operation_unsafety(intrinsic: Symbol) -> hir::Unsafety { /// and in `library/core/src/intrinsics.rs`. pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) { let param = |n| tcx.mk_ty_param(n, Symbol::intern(&format!("P{}", n))); - let def_id = tcx.hir().local_def_id(it.hir_id).to_def_id(); - let intrinsic_name = tcx.item_name(def_id); + let intrinsic_name = tcx.item_name(it.def_id.to_def_id()); let name_str = intrinsic_name.as_str(); let mk_va_list_ty = |mutbl| { @@ -370,7 +367,7 @@ pub fn check_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) { }; let sig = tcx.mk_fn_sig(inputs.into_iter(), output, false, unsafety, Abi::RustIntrinsic); let sig = ty::Binder::bind(sig); - equate_intrinsic_type(tcx, it, def_id, n_tps, sig) + equate_intrinsic_type(tcx, it, n_tps, sig) } /// Type-check `extern "platform-intrinsic" { ... }` functions. @@ -380,7 +377,6 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) tcx.mk_ty_param(n, name) }; - let def_id = tcx.hir().local_def_id(it.hir_id).to_def_id(); let name = it.ident.name; let (n_tps, inputs, output) = match name { @@ -402,6 +398,7 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) | sym::simd_fpow | sym::simd_saturating_add | sym::simd_saturating_sub => (1, vec![param(0), param(0)], param(0)), + sym::simd_neg => (1, vec![param(0)], param(0)), sym::simd_fsqrt | sym::simd_fsin | sym::simd_fcos @@ -464,5 +461,5 @@ pub fn check_platform_intrinsic_type(tcx: TyCtxt<'_>, it: &hir::ForeignItem<'_>) Abi::PlatformIntrinsic, ); let sig = ty::Binder::dummy(sig); - equate_intrinsic_type(tcx, it, def_id, n_tps, sig) + equate_intrinsic_type(tcx, it, n_tps, sig) } diff --git a/compiler/rustc_typeck/src/check/method/confirm.rs b/compiler/rustc_typeck/src/check/method/confirm.rs index e5f19281b0..4a2dd6faf0 100644 --- a/compiler/rustc_typeck/src/check/method/confirm.rs +++ b/compiler/rustc_typeck/src/check/method/confirm.rs @@ -155,32 +155,46 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> { let mut target = self.structurally_resolved_type(autoderef.span(), autoderef.final_ty(false)); - if let Some(mutbl) = pick.autoref { - let region = self.next_region_var(infer::Autoref(self.span, pick.item)); - target = self.tcx.mk_ref(region, ty::TypeAndMut { mutbl, ty: target }); - let mutbl = match mutbl { - hir::Mutability::Not => AutoBorrowMutability::Not, - hir::Mutability::Mut => AutoBorrowMutability::Mut { - // Method call receivers are the primary use case - // for two-phase borrows. - allow_two_phase_borrow: AllowTwoPhase::Yes, - }, - }; - adjustments - .push(Adjustment { kind: Adjust::Borrow(AutoBorrow::Ref(region, mutbl)), target }); - - if let Some(unsize_target) = pick.unsize { - target = self - .tcx - .mk_ref(region, ty::TypeAndMut { mutbl: mutbl.into(), ty: unsize_target }); - adjustments.push(Adjustment { kind: Adjust::Pointer(PointerCast::Unsize), target }); + match &pick.autoref_or_ptr_adjustment { + Some(probe::AutorefOrPtrAdjustment::Autoref { mutbl, unsize }) => { + let region = self.next_region_var(infer::Autoref(self.span, pick.item)); + target = self.tcx.mk_ref(region, ty::TypeAndMut { mutbl: *mutbl, ty: target }); + let mutbl = match mutbl { + hir::Mutability::Not => AutoBorrowMutability::Not, + hir::Mutability::Mut => AutoBorrowMutability::Mut { + // Method call receivers are the primary use case + // for two-phase borrows. + allow_two_phase_borrow: AllowTwoPhase::Yes, + }, + }; + adjustments.push(Adjustment { + kind: Adjust::Borrow(AutoBorrow::Ref(region, mutbl)), + target, + }); + + if let Some(unsize_target) = unsize { + target = self + .tcx + .mk_ref(region, ty::TypeAndMut { mutbl: mutbl.into(), ty: unsize_target }); + adjustments + .push(Adjustment { kind: Adjust::Pointer(PointerCast::Unsize), target }); + } + } + Some(probe::AutorefOrPtrAdjustment::ToConstPtr) => { + target = match target.kind() { + ty::RawPtr(ty::TypeAndMut { ty, mutbl }) => { + assert_eq!(*mutbl, hir::Mutability::Mut); + self.tcx.mk_ptr(ty::TypeAndMut { mutbl: hir::Mutability::Not, ty }) + } + other => panic!("Cannot adjust receiver type {:?} to const ptr", other), + }; + + adjustments.push(Adjustment { + kind: Adjust::Pointer(PointerCast::MutToConstPointer), + target, + }); } - } else { - // No unsizing should be performed without autoref (at - // least during method dispach). This is because we - // currently only unsize `[T;N]` to `[T]`, and naturally - // that must occur being a reference. - assert!(pick.unsize.is_none()); + None => {} } self.register_predicates(autoderef.into_obligations()); @@ -300,7 +314,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> { // variables. let generics = self.tcx.generics_of(pick.item.def_id); - let arg_count_correct = AstConv::check_generic_arg_count_for_call( + let arg_count_correct = >::check_generic_arg_count_for_call( self.tcx, self.span, pick.item.def_id, @@ -338,7 +352,8 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> { ) -> subst::GenericArg<'tcx> { match (¶m.kind, arg) { (GenericParamDefKind::Lifetime, GenericArg::Lifetime(lt)) => { - AstConv::ast_region_to_region(self.cfcx.fcx, lt, Some(param)).into() + >::ast_region_to_region(self.cfcx.fcx, lt, Some(param)) + .into() } (GenericParamDefKind::Type { .. }, GenericArg::Type(ty)) => { self.cfcx.to_ty(ty).into() @@ -359,7 +374,7 @@ impl<'a, 'tcx> ConfirmContext<'a, 'tcx> { self.cfcx.var_for_def(self.cfcx.span, param) } } - AstConv::create_substs_for_generic_args( + >::create_substs_for_generic_args( self.tcx, pick.item.def_id, parent_substs, diff --git a/compiler/rustc_typeck/src/check/method/probe.rs b/compiler/rustc_typeck/src/check/method/probe.rs index 158c214759..3006cabc63 100644 --- a/compiler/rustc_typeck/src/check/method/probe.rs +++ b/compiler/rustc_typeck/src/check/method/probe.rs @@ -10,6 +10,7 @@ use crate::hir::def_id::DefId; use rustc_data_structures::fx::FxHashSet; use rustc_data_structures::sync::Lrc; +use rustc_errors::Applicability; use rustc_hir as hir; use rustc_hir::def::Namespace; use rustc_infer::infer::canonical::OriginalQueryValues; @@ -153,28 +154,56 @@ enum ProbeResult { Match, } +/// When adjusting a receiver we often want to do one of +/// +/// - Add a `&` (or `&mut`), converting the recevier from `T` to `&T` (or `&mut T`) +/// - If the receiver has type `*mut T`, convert it to `*const T` +/// +/// This type tells us which one to do. +/// +/// Note that in principle we could do both at the same time. For example, when the receiver has +/// type `T`, we could autoref it to `&T`, then convert to `*const T`. Or, when it has type `*mut +/// T`, we could convert it to `*const T`, then autoref to `&*const T`. However, currently we do +/// (at most) one of these. Either the receiver has type `T` and we convert it to `&T` (or with +/// `mut`), or it has type `*mut T` and we convert it to `*const T`. +#[derive(Debug, PartialEq, Clone)] +pub enum AutorefOrPtrAdjustment<'tcx> { + /// Receiver has type `T`, add `&` or `&mut` (it `T` is `mut`), and maybe also "unsize" it. + /// Unsizing is used to convert a `[T; N]` to `[T]`, which only makes sense when autorefing. + Autoref { + mutbl: hir::Mutability, + + /// Indicates that the source expression should be "unsized" to a target type. This should + /// probably eventually go away in favor of just coercing method receivers. + unsize: Option>, + }, + /// Receiver has type `*mut T`, convert to `*const T` + ToConstPtr, +} + +impl<'tcx> AutorefOrPtrAdjustment<'tcx> { + fn get_unsize(&self) -> Option> { + match self { + AutorefOrPtrAdjustment::Autoref { mutbl: _, unsize } => unsize.clone(), + AutorefOrPtrAdjustment::ToConstPtr => None, + } + } +} + #[derive(Debug, PartialEq, Clone)] pub struct Pick<'tcx> { pub item: ty::AssocItem, pub kind: PickKind<'tcx>, pub import_ids: SmallVec<[LocalDefId; 1]>, - // Indicates that the source expression should be autoderef'd N times - // - // A = expr | *expr | **expr | ... + /// Indicates that the source expression should be autoderef'd N times + /// + /// A = expr | *expr | **expr | ... pub autoderefs: usize, - // Indicates that an autoref is applied after the optional autoderefs - // - // B = A | &A | &mut A - pub autoref: Option, - - // Indicates that the source expression should be "unsized" to a - // target type. This should probably eventually go away in favor - // of just coercing method receivers. - // - // C = B | unsize(B) - pub unsize: Option>, + /// Indicates that we want to add an autoref (and maybe also unsize it), or if the receiver is + /// `*mut T`, convert it to `*const T`. + pub autoref_or_ptr_adjustment: Option>, } #[derive(Clone, Debug, PartialEq, Eq)] @@ -1085,24 +1114,23 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> { self.pick_by_value_method(step, self_ty).or_else(|| { self.pick_autorefd_method(step, self_ty, hir::Mutability::Not) .or_else(|| self.pick_autorefd_method(step, self_ty, hir::Mutability::Mut)) + .or_else(|| self.pick_const_ptr_method(step, self_ty)) }) }) .next() } + /// For each type `T` in the step list, this attempts to find a method where + /// the (transformed) self type is exactly `T`. We do however do one + /// transformation on the adjustment: if we are passing a region pointer in, + /// we will potentially *reborrow* it to a shorter lifetime. This allows us + /// to transparently pass `&mut` pointers, in particular, without consuming + /// them for their entire lifetime. fn pick_by_value_method( &mut self, step: &CandidateStep<'tcx>, self_ty: Ty<'tcx>, ) -> Option> { - //! For each type `T` in the step list, this attempts to find a - //! method where the (transformed) self type is exactly `T`. We - //! do however do one transformation on the adjustment: if we - //! are passing a region pointer in, we will potentially - //! *reborrow* it to a shorter lifetime. This allows us to - //! transparently pass `&mut` pointers, in particular, without - //! consuming them for their entire lifetime. - if step.unsize { return None; } @@ -1114,7 +1142,10 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> { // Insert a `&*` or `&mut *` if this is a reference type: if let ty::Ref(_, _, mutbl) = *step.self_ty.value.value.kind() { pick.autoderefs += 1; - pick.autoref = Some(mutbl); + pick.autoref_or_ptr_adjustment = Some(AutorefOrPtrAdjustment::Autoref { + mutbl, + unsize: pick.autoref_or_ptr_adjustment.and_then(|a| a.get_unsize()), + }) } pick @@ -1137,8 +1168,39 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> { self.pick_method(autoref_ty).map(|r| { r.map(|mut pick| { pick.autoderefs = step.autoderefs; - pick.autoref = Some(mutbl); - pick.unsize = step.unsize.then_some(self_ty); + pick.autoref_or_ptr_adjustment = Some(AutorefOrPtrAdjustment::Autoref { + mutbl, + unsize: step.unsize.then_some(self_ty), + }); + pick + }) + }) + } + + /// If `self_ty` is `*mut T` then this picks `*const T` methods. The reason why we have a + /// special case for this is because going from `*mut T` to `*const T` with autoderefs and + /// autorefs would require dereferencing the pointer, which is not safe. + fn pick_const_ptr_method( + &mut self, + step: &CandidateStep<'tcx>, + self_ty: Ty<'tcx>, + ) -> Option> { + // Don't convert an unsized reference to ptr + if step.unsize { + return None; + } + + let ty = match self_ty.kind() { + ty::RawPtr(ty::TypeAndMut { ty, mutbl: hir::Mutability::Mut }) => ty, + _ => return None, + }; + + let const_self_ty = ty::TypeAndMut { ty, mutbl: hir::Mutability::Not }; + let const_ptr_ty = self.tcx.mk_ptr(const_self_ty); + self.pick_method(const_ptr_ty).map(|r| { + r.map(|mut pick| { + pick.autoderefs = step.autoderefs; + pick.autoref_or_ptr_adjustment = Some(AutorefOrPtrAdjustment::ToConstPtr); pick }) }) @@ -1167,7 +1229,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> { // // We suppress warning if we're picking the method only because it is a // suggestion. - self.emit_unstable_name_collision_hint(p, &unstable_candidates); + self.emit_unstable_name_collision_hint(p, &unstable_candidates, self_ty); } } return Some(pick); @@ -1246,24 +1308,46 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> { &self, stable_pick: &Pick<'_>, unstable_candidates: &[(&Candidate<'tcx>, Symbol)], + self_ty: Ty<'tcx>, ) { self.tcx.struct_span_lint_hir( lint::builtin::UNSTABLE_NAME_COLLISIONS, self.fcx.body_id, self.span, |lint| { - let mut diag = lint.build( - "a method with this name may be added to the standard library in the future", - ); - // FIXME: This should be a `span_suggestion` instead of `help` - // However `self.span` only - // highlights the method name, so we can't use it. Also consider reusing the code from - // `report_method_error()`. - diag.help(&format!( - "call with fully qualified syntax `{}(...)` to keep using the current method", - self.tcx.def_path_str(stable_pick.item.def_id), + let def_kind = stable_pick.item.kind.as_def_kind(); + let mut diag = lint.build(&format!( + "{} {} with this name may be added to the standard library in the future", + def_kind.article(), + def_kind.descr(stable_pick.item.def_id), )); - + match (stable_pick.item.kind, stable_pick.item.container) { + (ty::AssocKind::Fn, _) => { + // FIXME: This should be a `span_suggestion` instead of `help` + // However `self.span` only + // highlights the method name, so we can't use it. Also consider reusing + // the code from `report_method_error()`. + diag.help(&format!( + "call with fully qualified syntax `{}(...)` to keep using the current \ + method", + self.tcx.def_path_str(stable_pick.item.def_id), + )); + } + (ty::AssocKind::Const, ty::AssocItemContainer::TraitContainer(def_id)) => { + diag.span_suggestion( + self.span, + "use the fully qualified path to the associated const", + format!( + "<{} as {}>::{}", + self_ty, + self.tcx.def_path_str(def_id), + stable_pick.item.ident + ), + Applicability::MachineApplicable, + ); + } + _ => {} + } if self.tcx.sess.is_nightly_build() { for (candidate, feature) in unstable_candidates { diag.help(&format!( @@ -1489,8 +1573,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> { kind: TraitPick, import_ids: probes[0].0.import_ids.clone(), autoderefs: 0, - autoref: None, - unsize: None, + autoref_or_ptr_adjustment: None, }) } @@ -1695,7 +1778,7 @@ impl<'a, 'tcx> ProbeContext<'a, 'tcx> { } else { self.fcx .associated_item(def_id, name, Namespace::ValueNS) - .map_or(Vec::new(), |x| vec![x]) + .map_or_else(Vec::new, |x| vec![x]) } } else { self.tcx.associated_items(def_id).in_definition_order().copied().collect() @@ -1727,8 +1810,7 @@ impl<'tcx> Candidate<'tcx> { }, import_ids: self.import_ids.clone(), autoderefs: 0, - autoref: None, - unsize: None, + autoref_or_ptr_adjustment: None, } } } diff --git a/compiler/rustc_typeck/src/check/method/suggest.rs b/compiler/rustc_typeck/src/check/method/suggest.rs index d49c7cae82..13757ac413 100644 --- a/compiler/rustc_typeck/src/check/method/suggest.rs +++ b/compiler/rustc_typeck/src/check/method/suggest.rs @@ -11,7 +11,6 @@ use rustc_hir::intravisit; use rustc_hir::lang_items::LangItem; use rustc_hir::{ExprKind, Node, QPath}; use rustc_infer::infer::type_variable::{TypeVariableOrigin, TypeVariableOriginKind}; -use rustc_middle::hir::map as hir_map; use rustc_middle::ty::fast_reject::simplify_type; use rustc_middle::ty::print::with_crate_prefix; use rustc_middle::ty::{ @@ -24,6 +23,7 @@ use rustc_trait_selection::traits::query::evaluate_obligation::InferCtxtExt; use rustc_trait_selection::traits::Obligation; use std::cmp::Ordering; +use std::iter; use super::probe::Mode; use super::{CandidateSource, MethodError, NoMatchData}; @@ -390,7 +390,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { "no {} named `{}` found for {} `{}` in the current scope", item_kind, item_name, - actual.prefix_string(), + actual.prefix_string(self.tcx), ty_str, ); if let Mode::MethodCall = mode { @@ -517,21 +517,21 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } if self.is_fn_ty(&rcvr_ty, span) { - macro_rules! report_function { - ($span:expr, $name:expr) => { - err.note(&format!( - "`{}` is a function, perhaps you wish to call it", - $name - )); - }; + fn report_function( + err: &mut DiagnosticBuilder<'_>, + name: T, + ) { + err.note( + &format!("`{}` is a function, perhaps you wish to call it", name,), + ); } if let SelfSource::MethodCall(expr) = source { if let Ok(expr_string) = tcx.sess.source_map().span_to_snippet(expr.span) { - report_function!(expr.span, expr_string); + report_function(&mut err, expr_string); } else if let ExprKind::Path(QPath::Resolved(_, ref path)) = expr.kind { if let Some(segment) = path.segments.last() { - report_function!(expr.span, segment.ident); + report_function(&mut err, segment.ident); } } } @@ -600,7 +600,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { }); if let Some(hir::Node::Item(hir::Item { kind, .. })) = node { if let Some(g) = kind.generics() { - let key = match &g.where_clause.predicates[..] { + let key = match g.where_clause.predicates { [.., pred] => (pred.span().shrink_to_hi(), false), [] => ( g.where_clause @@ -649,21 +649,25 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { ty::PredicateKind::Projection(pred) => { let pred = bound_predicate.rebind(pred); // `::Item = String`. - let trait_ref = - pred.skip_binder().projection_ty.trait_ref(self.tcx); - let assoc = self - .tcx - .associated_item(pred.skip_binder().projection_ty.item_def_id); - let ty = pred.skip_binder().ty; - let obligation = format!("{}::{} = {}", trait_ref, assoc.ident, ty); - let quiet = format!( - "<_ as {}>::{} = {}", - trait_ref.print_only_trait_path(), - assoc.ident, - ty + let projection_ty = pred.skip_binder().projection_ty; + + let substs_with_infer_self = tcx.mk_substs( + iter::once(tcx.mk_ty_var(ty::TyVid { index: 0 }).into()) + .chain(projection_ty.substs.iter().skip(1)), ); - bound_span_label(trait_ref.self_ty(), &obligation, &quiet); - Some((obligation, trait_ref.self_ty())) + + let quiet_projection_ty = ty::ProjectionTy { + substs: substs_with_infer_self, + item_def_id: projection_ty.item_def_id, + }; + + let ty = pred.skip_binder().ty; + + let obligation = format!("{} = {}", projection_ty, ty); + let quiet = format!("{} = {}", quiet_projection_ty, ty); + + bound_span_label(projection_ty.self_ty(), &obligation, &quiet); + Some((obligation, projection_ty.self_ty())) } ty::PredicateKind::Trait(poly_trait_ref, _) => { let p = poly_trait_ref.trait_ref; @@ -728,7 +732,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { .map(|(_, path)| path) .collect::>() .join("\n"); - let actual_prefix = actual.prefix_string(); + let actual_prefix = actual.prefix_string(self.tcx); err.set_primary_message(&format!( "the {item_kind} `{item_name}` exists for {actual_prefix} `{ty_str}`, but its trait bounds were not satisfied" )); @@ -1142,7 +1146,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let trait_def_ids: FxHashSet = param .bounds .iter() - .filter_map(|bound| Some(bound.trait_ref()?.trait_def_id()?)) + .filter_map(|bound| bound.trait_ref()?.trait_def_id()) .collect(); if !candidates.iter().any(|t| trait_def_ids.contains(&t.def_id)) { err.span_suggestions( @@ -1352,17 +1356,15 @@ fn compute_all_traits(tcx: TyCtxt<'_>) -> Vec { // Crate-local: - struct Visitor<'a, 'tcx> { - map: &'a hir_map::Map<'tcx>, + struct Visitor<'a> { traits: &'a mut Vec, } - impl<'v, 'a, 'tcx> itemlikevisit::ItemLikeVisitor<'v> for Visitor<'a, 'tcx> { + impl<'v, 'a> itemlikevisit::ItemLikeVisitor<'v> for Visitor<'a> { fn visit_item(&mut self, i: &'v hir::Item<'v>) { match i.kind { hir::ItemKind::Trait(..) | hir::ItemKind::TraitAlias(..) => { - let def_id = self.map.local_def_id(i.hir_id); - self.traits.push(def_id.to_def_id()); + self.traits.push(i.def_id.to_def_id()); } _ => (), } @@ -1375,7 +1377,7 @@ fn compute_all_traits(tcx: TyCtxt<'_>) -> Vec { fn visit_foreign_item(&mut self, _foreign_item: &hir::ForeignItem<'_>) {} } - tcx.hir().krate().visit_all_item_likes(&mut Visitor { map: &tcx.hir(), traits: &mut traits }); + tcx.hir().krate().visit_all_item_likes(&mut Visitor { traits: &mut traits }); // Cross-crate: @@ -1445,8 +1447,8 @@ impl intravisit::Visitor<'tcx> for UsePlacementFinder<'tcx> { return; } // Find a `use` statement. - for item_id in module.item_ids { - let item = self.tcx.hir().expect_item(item_id.id); + for &item_id in module.item_ids { + let item = self.tcx.hir().item(item_id); match item.kind { hir::ItemKind::Use(..) => { // Don't suggest placing a `use` before the prelude @@ -1464,11 +1466,12 @@ impl intravisit::Visitor<'tcx> for UsePlacementFinder<'tcx> { if self.span.map_or(true, |span| item.span < span) { if !item.span.from_expansion() { // Don't insert between attributes and an item. - if item.attrs.is_empty() { + let attrs = self.tcx.hir().attrs(item.hir_id()); + if attrs.is_empty() { self.span = Some(item.span.shrink_to_lo()); } else { // Find the first attribute on the item. - for attr in item.attrs { + for attr in attrs { if self.span.map_or(true, |span| attr.span < span) { self.span = Some(attr.span.shrink_to_lo()); } diff --git a/compiler/rustc_typeck/src/check/mod.rs b/compiler/rustc_typeck/src/check/mod.rs index dc3e3b4e73..ad9bb70377 100644 --- a/compiler/rustc_typeck/src/check/mod.rs +++ b/compiler/rustc_typeck/src/check/mod.rs @@ -121,9 +121,9 @@ use rustc_middle::ty::{self, RegionKind, Ty, TyCtxt, UserType}; use rustc_session::config; use rustc_session::parse::feature_err; use rustc_session::Session; -use rustc_span::source_map::DUMMY_SP; use rustc_span::symbol::{kw, Ident}; use rustc_span::{self, BytePos, MultiSpan, Span}; +use rustc_span::{source_map::DUMMY_SP, sym}; use rustc_target::abi::VariantIdx; use rustc_target::spec::abi::Abi; use rustc_trait_selection::traits; @@ -495,13 +495,14 @@ fn typeck_with_fallback<'tcx>( let fcx = if let (Some(header), Some(decl)) = (fn_header, fn_decl) { let fn_sig = if crate::collect::get_infer_ret_ty(&decl.output).is_some() { let fcx = FnCtxt::new(&inh, param_env, body.value.hir_id); - AstConv::ty_of_fn( + >::ty_of_fn( &fcx, header.unsafety, header.abi, decl, &hir::Generics::empty(), None, + None, ) } else { tcx.fn_sig(def_id) @@ -526,7 +527,7 @@ fn typeck_with_fallback<'tcx>( let fcx = FnCtxt::new(&inh, param_env, body.value.hir_id); let expected_type = body_ty .and_then(|ty| match ty.kind { - hir::TyKind::Infer => Some(AstConv::ast_ty_to_ty(&fcx, ty)), + hir::TyKind::Infer => Some(>::ast_ty_to_ty(&fcx, ty)), _ => None, }) .unwrap_or_else(|| match tcx.hir().get(id) { @@ -546,11 +547,12 @@ fn typeck_with_fallback<'tcx>( let expected_type = fcx.normalize_associated_types_in(body.value.span, expected_type); fcx.require_type_is_sized(expected_type, body.value.span, traits::ConstSized); - let revealed_ty = if tcx.features().impl_trait_in_bindings { - fcx.instantiate_opaque_types_from_value(id, expected_type, body.value.span) - } else { - expected_type - }; + let revealed_ty = fcx.instantiate_opaque_types_from_value( + id, + expected_type, + body.value.span, + Some(sym::impl_trait_in_bindings), + ); // Gather locals in statics (because of block expressions). GatherLocalsVisitor::new(&fcx, id).visit_body(body); @@ -838,7 +840,7 @@ fn missing_items_err( // Obtain the level of indentation ending in `sugg_sp`. let indentation = tcx.sess.source_map().span_to_margin(sugg_sp).unwrap_or(0); // Make the whitespace that will make the suggestion have the right indentation. - let padding: String = (0..indentation).map(|_| " ").collect(); + let padding: String = std::iter::repeat(" ").take(indentation).collect(); for trait_item in missing_items { let snippet = suggestion_signature(&trait_item, tcx); @@ -1061,7 +1063,10 @@ fn report_unexpected_variant_res(tcx: TyCtxt<'_>, res: Res, span: Span) { E0533, "expected unit struct, unit variant or constant, found {}{}", res.descr(), - tcx.sess.source_map().span_to_snippet(span).map_or(String::new(), |s| format!(" `{}`", s)), + tcx.sess + .source_map() + .span_to_snippet(span) + .map_or_else(|_| String::new(), |s| format!(" `{}`", s)), ) .emit(); } diff --git a/compiler/rustc_typeck/src/check/op.rs b/compiler/rustc_typeck/src/check/op.rs index 9ab056c0d7..567cb1a90d 100644 --- a/compiler/rustc_typeck/src/check/op.rs +++ b/compiler/rustc_typeck/src/check/op.rs @@ -681,7 +681,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { format!("cannot apply unary operator `{}`", op.as_str()), ); match actual.kind() { - Uint(_) if op == hir::UnOp::UnNeg => { + Uint(_) if op == hir::UnOp::Neg => { err.note("unsigned values cannot be negated"); if let hir::ExprKind::Unary( @@ -711,9 +711,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { Ref(_, ref lty, _) if *lty.kind() == Str => {} _ => { let missing_trait = match op { - hir::UnOp::UnNeg => "std::ops::Neg", - hir::UnOp::UnNot => "std::ops::Not", - hir::UnOp::UnDeref => "std::ops::UnDerf", + hir::UnOp::Neg => "std::ops::Neg", + hir::UnOp::Not => "std::ops::Not", + hir::UnOp::Deref => "std::ops::UnDerf", }; suggest_impl_missing(&mut err, operand_ty, &missing_trait); } @@ -782,9 +782,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { span_bug!(span, "&& and || are not overloadable") } } - } else if let Op::Unary(hir::UnOp::UnNot, _) = op { + } else if let Op::Unary(hir::UnOp::Not, _) = op { (sym::not, lang.not_trait()) - } else if let Op::Unary(hir::UnOp::UnNeg, _) = op { + } else if let Op::Unary(hir::UnOp::Neg, _) = op { (sym::neg, lang.neg_trait()) } else { bug!("lookup_op_method: op not supported: {:?}", op) diff --git a/compiler/rustc_typeck/src/check/pat.rs b/compiler/rustc_typeck/src/check/pat.rs index d7e69668e5..79c544bd38 100644 --- a/compiler/rustc_typeck/src/check/pat.rs +++ b/compiler/rustc_typeck/src/check/pat.rs @@ -17,6 +17,7 @@ use rustc_span::source_map::{Span, Spanned}; use rustc_span::symbol::Ident; use rustc_span::{BytePos, DUMMY_SP}; use rustc_trait_selection::traits::{ObligationCause, Pattern}; +use ty::VariantDef; use std::cmp; use std::collections::hash_map::Entry::{Occupied, Vacant}; @@ -150,7 +151,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { /// /// Outside of this module, `check_pat_top` should always be used. /// Conversely, inside this module, `check_pat_top` should never be used. - #[instrument(skip(self, ti))] + #[instrument(level = "debug", skip(self, ti))] fn check_pat( &self, pat: &'tcx Pat<'tcx>, @@ -679,7 +680,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { &self, pat: &'tcx Pat<'tcx>, qpath: &hir::QPath<'_>, - fields: &'tcx [hir::FieldPat<'tcx>], + fields: &'tcx [hir::PatField<'tcx>], etc: bool, expected: Ty<'tcx>, def_bm: BindingMode, @@ -878,7 +879,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let sm = tcx.sess.source_map(); let path_str = sm .span_to_snippet(sm.span_until_char(pat.span, '(')) - .map_or(String::new(), |s| format!(" `{}`", s.trim_end())); + .map_or_else(|_| String::new(), |s| format!(" `{}`", s.trim_end())); let msg = format!( "expected tuple struct or tuple variant, found {}{}", res.descr(), @@ -1150,7 +1151,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { adt_ty: Ty<'tcx>, pat: &'tcx Pat<'tcx>, variant: &'tcx ty::VariantDef, - fields: &'tcx [hir::FieldPat<'tcx>], + fields: &'tcx [hir::PatField<'tcx>], etc: bool, def_bm: BindingMode, ti: TopInfo<'tcx>, @@ -1264,14 +1265,64 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { u.emit(); } } - (None, Some(mut err)) | (Some(mut err), None) => { + (None, Some(mut u)) => { + if let Some(mut e) = self.error_tuple_variant_as_struct_pat(pat, fields, variant) { + u.delay_as_bug(); + e.emit(); + } else { + u.emit(); + } + } + (Some(mut err), None) => { err.emit(); } - (None, None) => {} + (None, None) => { + if let Some(mut err) = + self.error_tuple_variant_index_shorthand(variant, pat, fields) + { + err.emit(); + } + } } no_field_errors } + fn error_tuple_variant_index_shorthand( + &self, + variant: &VariantDef, + pat: &'_ Pat<'_>, + fields: &[hir::PatField<'_>], + ) -> Option> { + // if this is a tuple struct, then all field names will be numbers + // so if any fields in a struct pattern use shorthand syntax, they will + // be invalid identifiers (for example, Foo { 0, 1 }). + if let (CtorKind::Fn, PatKind::Struct(qpath, field_patterns, ..)) = + (variant.ctor_kind, &pat.kind) + { + let has_shorthand_field_name = field_patterns.iter().any(|field| field.is_shorthand); + if has_shorthand_field_name { + let path = rustc_hir_pretty::to_string(rustc_hir_pretty::NO_ANN, |s| { + s.print_qpath(qpath, false) + }); + let mut err = struct_span_err!( + self.tcx.sess, + pat.span, + E0769, + "tuple variant `{}` written as struct variant", + path + ); + err.span_suggestion_verbose( + qpath.span().shrink_to_hi().to(pat.span.shrink_to_hi()), + "use the tuple variant pattern syntax instead", + format!("({})", self.get_suggested_tuple_struct_pattern(fields, variant)), + Applicability::MaybeIncorrect, + ); + return Some(err); + } + } + None + } + fn error_foreign_non_exhaustive_spat(&self, pat: &Pat<'_>, descr: &str, no_fields: bool) { let sess = self.tcx.sess; let sm = sess.source_map(); @@ -1395,7 +1446,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { fn error_tuple_variant_as_struct_pat( &self, pat: &Pat<'_>, - fields: &'tcx [hir::FieldPat<'tcx>], + fields: &'tcx [hir::PatField<'tcx>], variant: &ty::VariantDef, ) -> Option> { if let (CtorKind::Fn, PatKind::Struct(qpath, ..)) = (variant.ctor_kind, &pat.kind) { @@ -1411,16 +1462,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { ); let (sugg, appl) = if fields.len() == variant.fields.len() { ( - fields - .iter() - .map(|f| match self.tcx.sess.source_map().span_to_snippet(f.pat.span) { - Ok(f) => f, - Err(_) => rustc_hir_pretty::to_string(rustc_hir_pretty::NO_ANN, |s| { - s.print_pat(f.pat) - }), - }) - .collect::>() - .join(", "), + self.get_suggested_tuple_struct_pattern(fields, variant), Applicability::MachineApplicable, ) } else { @@ -1429,10 +1471,10 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { Applicability::MaybeIncorrect, ) }; - err.span_suggestion( - pat.span, + err.span_suggestion_verbose( + qpath.span().shrink_to_hi().to(pat.span.shrink_to_hi()), "use the tuple variant pattern syntax instead", - format!("{}({})", path, sugg), + format!("({})", sugg), appl, ); return Some(err); @@ -1440,6 +1482,34 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { None } + fn get_suggested_tuple_struct_pattern( + &self, + fields: &[hir::PatField<'_>], + variant: &VariantDef, + ) -> String { + let variant_field_idents = variant.fields.iter().map(|f| f.ident).collect::>(); + fields + .iter() + .map(|field| { + match self.tcx.sess.source_map().span_to_snippet(field.pat.span) { + Ok(f) => { + // Field names are numbers, but numbers + // are not valid identifiers + if variant_field_idents.contains(&field.ident) { + String::from("_") + } else { + f + } + } + Err(_) => rustc_hir_pretty::to_string(rustc_hir_pretty::NO_ANN, |s| { + s.print_pat(field.pat) + }), + } + }) + .collect::>() + .join(", ") + } + /// Returns a diagnostic reporting a struct pattern which is missing an `..` due to /// inaccessible fields. /// @@ -1458,7 +1528,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { fn error_no_accessible_fields( &self, pat: &Pat<'_>, - fields: &'tcx [hir::FieldPat<'tcx>], + fields: &'tcx [hir::PatField<'tcx>], ) -> DiagnosticBuilder<'tcx> { let mut err = self .tcx @@ -1504,7 +1574,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { &self, pat: &Pat<'_>, unmentioned_fields: &[(&ty::FieldDef, Ident)], - fields: &'tcx [hir::FieldPat<'tcx>], + fields: &'tcx [hir::PatField<'tcx>], ) -> DiagnosticBuilder<'tcx> { let field_names = if unmentioned_fields.len() == 1 { format!("field `{}`", unmentioned_fields[0].1) diff --git a/compiler/rustc_typeck/src/check/place_op.rs b/compiler/rustc_typeck/src/check/place_op.rs index 502cb56238..5bd385107c 100644 --- a/compiler/rustc_typeck/src/check/place_op.rs +++ b/compiler/rustc_typeck/src/check/place_op.rs @@ -103,9 +103,9 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let method = self.try_overloaded_place_op(expr.span, self_ty, &[input_ty], PlaceOp::Index); - let result = method.map(|ok| { + if let Some(result) = method { debug!("try_index_step: success, using overloaded indexing"); - let method = self.register_infer_ok_obligations(ok); + let method = self.register_infer_ok_obligations(result); let mut adjustments = self.adjust_steps(autoderef); if let ty::Ref(region, _, hir::Mutability::Not) = method.sig.inputs()[0].kind() { @@ -128,10 +128,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { self.apply_adjustments(base_expr, adjustments); self.write_method_call(expr.hir_id, method); - (input_ty, self.make_overloaded_place_return_type(method).ty) - }); - if result.is_some() { - return result; + + return Some((input_ty, self.make_overloaded_place_return_type(method).ty)); } } @@ -203,7 +201,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { while let hir::ExprKind::Field(ref expr, _) | hir::ExprKind::Index(ref expr, _) - | hir::ExprKind::Unary(hir::UnOp::UnDeref, ref expr) = exprs.last().unwrap().kind + | hir::ExprKind::Unary(hir::UnOp::Deref, ref expr) = exprs.last().unwrap().kind { exprs.push(&expr); } @@ -216,7 +214,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { debug!("convert_place_derefs_to_mutable: i={} expr={:?}", i, expr); let mut source = self.node_ty(expr.hir_id); - if matches!(expr.kind, hir::ExprKind::Unary(hir::UnOp::UnDeref, _)) { + if matches!(expr.kind, hir::ExprKind::Unary(hir::UnOp::Deref, _)) { // Clear previous flag; after a pointer indirection it does not apply any more. inside_union = false; } @@ -270,7 +268,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { hir::ExprKind::Index(ref base_expr, ..) => { self.convert_place_op_to_mutable(PlaceOp::Index, expr, base_expr); } - hir::ExprKind::Unary(hir::UnOp::UnDeref, ref base_expr) => { + hir::ExprKind::Unary(hir::UnOp::Deref, ref base_expr) => { self.convert_place_op_to_mutable(PlaceOp::Deref, expr, base_expr); } _ => {} diff --git a/compiler/rustc_typeck/src/check/regionck.rs b/compiler/rustc_typeck/src/check/regionck.rs index 88e8dd3cb1..8f8514cadb 100644 --- a/compiler/rustc_typeck/src/check/regionck.rs +++ b/compiler/rustc_typeck/src/check/regionck.rs @@ -354,7 +354,7 @@ impl<'a, 'tcx> Visitor<'tcx> for RegionCtxt<'a, 'tcx> { hir_id: hir::HirId, ) { assert!( - matches!(fk, intravisit::FnKind::Closure(..)), + matches!(fk, intravisit::FnKind::Closure), "visit_fn invoked for something other than a closure" ); @@ -771,21 +771,39 @@ impl<'a, 'tcx> RegionCtxt<'a, 'tcx> { debug!("link_upvar_region(borrorw_region={:?}, upvar_id={:?}", borrow_region, upvar_id); // A by-reference upvar can't be borrowed for longer than the // upvar is borrowed from the environment. - match self.typeck_results.borrow().upvar_capture(upvar_id) { - ty::UpvarCapture::ByRef(upvar_borrow) => { - self.sub_regions( - infer::ReborrowUpvar(span, upvar_id), - borrow_region, - upvar_borrow.region, - ); - if let ty::ImmBorrow = upvar_borrow.kind { - debug!("link_upvar_region: capture by shared ref"); - return; + let closure_local_def_id = upvar_id.closure_expr_id; + let mut all_captures_are_imm_borrow = true; + for captured_place in self + .typeck_results + .borrow() + .closure_min_captures + .get(&closure_local_def_id.to_def_id()) + .and_then(|root_var_min_cap| root_var_min_cap.get(&upvar_id.var_path.hir_id)) + .into_iter() + .flatten() + { + match captured_place.info.capture_kind { + ty::UpvarCapture::ByRef(upvar_borrow) => { + self.sub_regions( + infer::ReborrowUpvar(span, upvar_id), + borrow_region, + upvar_borrow.region, + ); + if let ty::ImmBorrow = upvar_borrow.kind { + debug!("link_upvar_region: capture by shared ref"); + } else { + all_captures_are_imm_borrow = false; + } + } + ty::UpvarCapture::ByValue(_) => { + all_captures_are_imm_borrow = false; } } - ty::UpvarCapture::ByValue(_) => {} } - let fn_hir_id = self.tcx.hir().local_def_id_to_hir_id(upvar_id.closure_expr_id); + if all_captures_are_imm_borrow { + return; + } + let fn_hir_id = self.tcx.hir().local_def_id_to_hir_id(closure_local_def_id); let ty = self.resolve_node_type(fn_hir_id); debug!("link_upvar_region: ty={:?}", ty); diff --git a/compiler/rustc_typeck/src/check/upvar.rs b/compiler/rustc_typeck/src/check/upvar.rs index 04a9e65e66..8a4c69b5ac 100644 --- a/compiler/rustc_typeck/src/check/upvar.rs +++ b/compiler/rustc_typeck/src/check/upvar.rs @@ -40,13 +40,17 @@ use rustc_hir::def_id::DefId; use rustc_hir::def_id::LocalDefId; use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; use rustc_infer::infer::UpvarRegion; -use rustc_middle::hir::place::{Place, PlaceBase, PlaceWithHirId, ProjectionKind}; +use rustc_middle::hir::place::{Place, PlaceBase, PlaceWithHirId, Projection, ProjectionKind}; +use rustc_middle::mir::FakeReadCause; use rustc_middle::ty::fold::TypeFoldable; use rustc_middle::ty::{self, Ty, TyCtxt, TypeckResults, UpvarSubsts}; use rustc_session::lint; use rustc_span::sym; use rustc_span::{MultiSpan, Span, Symbol}; +use rustc_index::vec::Idx; +use rustc_target::abi::VariantIdx; + /// Describe the relationship between the paths of two places /// eg: /// - `foo` is ancestor of `foo.bar.baz` @@ -142,6 +146,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { current_closure_kind: ty::ClosureKind::LATTICE_BOTTOM, current_origin: None, capture_information: Default::default(), + fake_reads: Default::default(), }; euv::ExprUseVisitor::new( &mut delegate, @@ -177,7 +182,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { debug!("seed place {:?}", place); let upvar_id = ty::UpvarId::new(*var_hir_id, local_def_id); - let capture_kind = self.init_capture_kind(capture_clause, upvar_id, span); + let capture_kind = + self.init_capture_kind_for_place(&place, capture_clause, upvar_id, span); let fake_info = ty::CaptureInfo { capture_kind_expr_id: None, path_expr_id: None, @@ -202,11 +208,8 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // If we have an origin, store it. if let Some(origin) = delegate.current_origin.clone() { let origin = if self.tcx.features().capture_disjoint_fields { - origin + (origin.0, restrict_capture_precision(origin.1)) } else { - // FIXME(project-rfc-2229#31): Once the changes to support reborrowing are - // made, make sure we are selecting and restricting - // the origin correctly. (origin.0, Place { projections: vec![], ..origin.1 }) }; @@ -219,8 +222,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { self.log_closure_min_capture_info(closure_def_id, span); - self.min_captures_to_closure_captures_bridge(closure_def_id); - // Now that we've analyzed the closure, we know how each // variable is borrowed, and we know what traits the closure // implements (Fn vs FnMut etc). We now have some updates to do @@ -245,6 +246,13 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { let final_tupled_upvars_type = self.tcx.mk_tup(final_upvar_tys.iter()); self.demand_suptype(span, substs.tupled_upvars_ty(), final_tupled_upvars_type); + let fake_reads = delegate + .fake_reads + .into_iter() + .map(|(place, cause, hir_id)| (place, cause, hir_id)) + .collect(); + self.typeck_results.borrow_mut().closure_fake_reads.insert(closure_def_id, fake_reads); + // If we are also inferred the closure kind here, // process any deferred resolutions. let deferred_call_resolutions = self.remove_deferred_call_resolutions(closure_def_id); @@ -260,8 +268,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { // local crate or were inlined into it along with some function. // This may change if abstract return types of some sort are // implemented. - let tcx = self.tcx; - self.typeck_results .borrow() .closure_min_captures_flattened(closure_id) @@ -276,7 +282,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { match capture { ty::UpvarCapture::ByValue(_) => upvar_ty, - ty::UpvarCapture::ByRef(borrow) => tcx.mk_ref( + ty::UpvarCapture::ByRef(borrow) => self.tcx.mk_ref( borrow.region, ty::TypeAndMut { ty: upvar_ty, mutbl: borrow.kind.to_mutbl_lossy() }, ), @@ -285,80 +291,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { .collect() } - /// Bridge for closure analysis - /// ---------------------------- - /// - /// For closure with DefId `c`, the bridge converts structures required for supporting RFC 2229, - /// to structures currently used in the compiler for handling closure captures. - /// - /// For example the following structure will be converted: - /// - /// closure_min_captures - /// foo -> [ {foo.x, ImmBorrow}, {foo.y, MutBorrow} ] - /// bar -> [ {bar.z, ByValue}, {bar.q, MutBorrow} ] - /// - /// to - /// - /// 1. closure_captures - /// foo -> UpvarId(foo, c), bar -> UpvarId(bar, c) - /// - /// 2. upvar_capture_map - /// UpvarId(foo,c) -> MutBorrow, UpvarId(bar, c) -> ByValue - fn min_captures_to_closure_captures_bridge(&self, closure_def_id: DefId) { - let mut closure_captures: FxIndexMap = Default::default(); - let mut upvar_capture_map = ty::UpvarCaptureMap::default(); - - if let Some(min_captures) = - self.typeck_results.borrow().closure_min_captures.get(&closure_def_id) - { - for (var_hir_id, min_list) in min_captures.iter() { - for captured_place in min_list { - let place = &captured_place.place; - let capture_info = captured_place.info; - - let upvar_id = match place.base { - PlaceBase::Upvar(upvar_id) => upvar_id, - base => bug!("Expected upvar, found={:?}", base), - }; - - assert_eq!(upvar_id.var_path.hir_id, *var_hir_id); - assert_eq!(upvar_id.closure_expr_id, closure_def_id.expect_local()); - - closure_captures.insert(*var_hir_id, upvar_id); - - let new_capture_kind = - if let Some(capture_kind) = upvar_capture_map.get(&upvar_id) { - // upvar_capture_map only stores the UpvarCapture (CaptureKind), - // so we create a fake capture info with no expression. - let fake_capture_info = ty::CaptureInfo { - capture_kind_expr_id: None, - path_expr_id: None, - capture_kind: *capture_kind, - }; - determine_capture_info(fake_capture_info, capture_info).capture_kind - } else { - capture_info.capture_kind - }; - upvar_capture_map.insert(upvar_id, new_capture_kind); - } - } - } - debug!("For closure_def_id={:?}, closure_captures={:#?}", closure_def_id, closure_captures); - debug!( - "For closure_def_id={:?}, upvar_capture_map={:#?}", - closure_def_id, upvar_capture_map - ); - - if !closure_captures.is_empty() { - self.typeck_results - .borrow_mut() - .closure_captures - .insert(closure_def_id, closure_captures); - - self.typeck_results.borrow_mut().upvar_capture_map.extend(upvar_capture_map); - } - } - /// Analyzes the information collected by `InferBorrowKind` to compute the min number of /// Places (and corresponding capture kind) that we need to keep track of to support all /// the required captured paths. @@ -448,7 +380,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { base => bug!("Expected upvar, found={:?}", base), }; - let place = restrict_capture_precision(place, capture_info.capture_kind); + let place = restrict_capture_precision(place); let min_cap_list = match root_var_min_capture_list.get_mut(&var_hir_id) { None => { @@ -537,7 +469,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { span: Span, body: &'tcx hir::Body<'tcx>, ) { - let need_migrations = self.compute_2229_migrations_first_pass( + let need_migrations = self.compute_2229_migrations( closure_def_id, span, capture_clause, @@ -546,9 +478,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { ); if !need_migrations.is_empty() { - let need_migrations_hir_id = need_migrations.iter().map(|m| m.0).collect::>(); - - let migrations_text = migration_suggestion_for_2229(self.tcx, &need_migrations_hir_id); + let migrations_text = migration_suggestion_for_2229(self.tcx, &need_migrations); let local_def_id = closure_def_id.expect_local(); let closure_hir_id = self.tcx.hir().local_def_id_to_hir_id(local_def_id); @@ -575,15 +505,15 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { /// - It would have been moved into the closure when `capture_disjoint_fields` wasn't /// enabled, **and** /// - It wasn't completely captured by the closure, **and** - /// - The type of the root variable needs Drop. - fn compute_2229_migrations_first_pass( + /// - One of the paths starting at this root variable, that is not captured needs Drop. + fn compute_2229_migrations( &self, closure_def_id: DefId, closure_span: Span, closure_clause: hir::CaptureBy, body: &'tcx hir::Body<'tcx>, min_captures: Option<&ty::RootVariableMinCaptureList<'tcx>>, - ) -> Vec<(hir::HirId, Ty<'tcx>)> { + ) -> Vec { fn resolve_ty>( fcx: &FnCtxt<'_, 'tcx>, span: Span, @@ -619,7 +549,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { match closure_clause { // Only migrate if closure is a move closure - hir::CaptureBy::Value => need_migrations.push((var_hir_id, ty)), + hir::CaptureBy::Value => need_migrations.push(var_hir_id), hir::CaptureBy::Ref => {} } @@ -627,30 +557,295 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { continue; }; - let is_moved = root_var_min_capture_list + let projections_list = root_var_min_capture_list .iter() - .any(|capture| matches!(capture.info.capture_kind, ty::UpvarCapture::ByValue(_))); + .filter_map(|captured_place| match captured_place.info.capture_kind { + // Only care about captures that are moved into the closure + ty::UpvarCapture::ByValue(..) => { + Some(captured_place.place.projections.as_slice()) + } + ty::UpvarCapture::ByRef(..) => None, + }) + .collect::>(); + + let is_moved = !projections_list.is_empty(); let is_not_completely_captured = root_var_min_capture_list.iter().any(|capture| capture.place.projections.len() > 0); - if is_moved && is_not_completely_captured { - need_migrations.push((var_hir_id, ty)); + if is_moved + && is_not_completely_captured + && self.has_significant_drop_outside_of_captures( + closure_def_id, + closure_span, + ty, + projections_list, + ) + { + need_migrations.push(var_hir_id); } } need_migrations } - fn init_capture_kind( + /// This is a helper function to `compute_2229_migrations_precise_pass`. Provided the type + /// of a root variable and a list of captured paths starting at this root variable (expressed + /// using list of `Projection` slices), it returns true if there is a path that is not + /// captured starting at this root variable that implements Drop. + /// + /// FIXME(project-rfc-2229#35): This should return true only for significant drops. + /// A drop is significant if it's implemented by the user or does + /// anything that will have any observable behavior (other than + /// freeing up memory). + /// + /// The way this function works is at a given call it looks at type `base_path_ty` of some base + /// path say P and then list of projection slices which represent the different captures moved + /// into the closure starting off of P. + /// + /// This will make more sense with an example: + /// + /// ```rust + /// #![feature(capture_disjoint_fields)] + /// + /// struct FancyInteger(i32); // This implements Drop + /// + /// struct Point { x: FancyInteger, y: FancyInteger } + /// struct Color; + /// + /// struct Wrapper { p: Point, c: Color } + /// + /// fn f(w: Wrapper) { + /// let c = || { + /// // Closure captures w.p.x and w.c by move. + /// }; + /// + /// c(); + /// } + /// ``` + /// + /// If `capture_disjoint_fields` wasn't enabled the closure would've moved `w` instead of the + /// precise paths. If we look closely `w.p.y` isn't captured which implements Drop and + /// therefore Drop ordering would change and we want this function to return true. + /// + /// Call stack to figure out if we need to migrate for `w` would look as follows: + /// + /// Our initial base path is just `w`, and the paths captured from it are `w[p, x]` and + /// `w[c]`. + /// Notation: + /// - Ty(place): Type of place + /// - `(a, b)`: Represents the function parameters `base_path_ty` and `captured_projs` + /// respectively. + /// ``` + /// (Ty(w), [ &[p, x], &[c] ]) + /// | + /// ---------------------------- + /// | | + /// v v + /// (Ty(w.p), [ &[x] ]) (Ty(w.c), [ &[] ]) // I(1) + /// | | + /// v v + /// (Ty(w.p), [ &[x] ]) false + /// | + /// | + /// ------------------------------- + /// | | + /// v v + /// (Ty((w.p).x), [ &[] ]) (Ty((w.p).y), []) // IMP 2 + /// | | + /// v v + /// false NeedsDrop(Ty(w.p.y)) + /// | + /// v + /// true + /// ``` + /// + /// IMP 1 `(Ty(w.c), [ &[] ])`: Notice the single empty slice inside `captured_projs`. + /// This implies that the `w.c` is completely captured by the closure. + /// Since drop for this path will be called when the closure is + /// dropped we don't need to migrate for it. + /// + /// IMP 2 `(Ty((w.p).y), [])`: Notice that `captured_projs` is empty. This implies that this + /// path wasn't captured by the closure. Also note that even + /// though we didn't capture this path, the function visits it, + /// which is kind of the point of this function. We then return + /// if the type of `w.p.y` implements Drop, which in this case is + /// true. + /// + /// Consider another example: + /// + /// ```rust + /// struct X; + /// impl Drop for X {} + /// + /// struct Y(X); + /// impl Drop for Y {} + /// + /// fn foo() { + /// let y = Y(X); + /// let c = || move(y.0); + /// } + /// ``` + /// + /// Note that `y.0` is captured by the closure. When this function is called for `y`, it will + /// return true, because even though all paths starting at `y` are captured, `y` itself + /// implements Drop which will be affected since `y` isn't completely captured. + fn has_significant_drop_outside_of_captures( + &self, + closure_def_id: DefId, + closure_span: Span, + base_path_ty: Ty<'tcx>, + captured_projs: Vec<&[Projection<'tcx>]>, + ) -> bool { + let needs_drop = |ty: Ty<'tcx>| { + ty.needs_drop(self.tcx, self.tcx.param_env(closure_def_id.expect_local())) + }; + + let is_drop_defined_for_ty = |ty: Ty<'tcx>| { + let drop_trait = self.tcx.require_lang_item(hir::LangItem::Drop, Some(closure_span)); + let ty_params = self.tcx.mk_substs_trait(base_path_ty, &[]); + self.tcx.type_implements_trait(( + drop_trait, + ty, + ty_params, + self.tcx.param_env(closure_def_id.expect_local()), + )) + }; + + let is_drop_defined_for_ty = is_drop_defined_for_ty(base_path_ty); + + // If there is a case where no projection is applied on top of current place + // then there must be exactly one capture corresponding to such a case. Note that this + // represents the case of the path being completely captured by the variable. + // + // eg. If `a.b` is captured and we are processing `a.b`, then we can't have the closure also + // capture `a.b.c`, because that voilates min capture. + let is_completely_captured = captured_projs.iter().any(|projs| projs.is_empty()); + + assert!(!is_completely_captured || (captured_projs.len() == 1)); + + if is_completely_captured { + // The place is captured entirely, so doesn't matter if needs dtor, it will be drop + // when the closure is dropped. + return false; + } + + if is_drop_defined_for_ty { + // If drop is implemented for this type then we need it to be fully captured, + // which we know it is not because of the previous check. Therefore we need to + // do migrate. + return true; + } + + if captured_projs.is_empty() { + return needs_drop(base_path_ty); + } + + match base_path_ty.kind() { + // Observations: + // - `captured_projs` is not empty. Therefore we can call + // `captured_projs.first().unwrap()` safely. + // - All entries in `captured_projs` have atleast one projection. + // Therefore we can call `captured_projs.first().unwrap().first().unwrap()` safely. + + // We don't capture derefs in case of move captures, which would have be applied to + // access any further paths. + ty::Adt(def, _) if def.is_box() => unreachable!(), + ty::Ref(..) => unreachable!(), + ty::RawPtr(..) => unreachable!(), + + ty::Adt(def, substs) => { + // Multi-varaint enums are captured in entirety, + // which would've been handled in the case of single empty slice in `captured_projs`. + assert_eq!(def.variants.len(), 1); + + // Only Field projections can be applied to a non-box Adt. + assert!( + captured_projs.iter().all(|projs| matches!( + projs.first().unwrap().kind, + ProjectionKind::Field(..) + )) + ); + def.variants.get(VariantIdx::new(0)).unwrap().fields.iter().enumerate().any( + |(i, field)| { + let paths_using_field = captured_projs + .iter() + .filter_map(|projs| { + if let ProjectionKind::Field(field_idx, _) = + projs.first().unwrap().kind + { + if (field_idx as usize) == i { Some(&projs[1..]) } else { None } + } else { + unreachable!(); + } + }) + .collect(); + + let after_field_ty = field.ty(self.tcx, substs); + self.has_significant_drop_outside_of_captures( + closure_def_id, + closure_span, + after_field_ty, + paths_using_field, + ) + }, + ) + } + + ty::Tuple(..) => { + // Only Field projections can be applied to a tuple. + assert!( + captured_projs.iter().all(|projs| matches!( + projs.first().unwrap().kind, + ProjectionKind::Field(..) + )) + ); + + base_path_ty.tuple_fields().enumerate().any(|(i, element_ty)| { + let paths_using_field = captured_projs + .iter() + .filter_map(|projs| { + if let ProjectionKind::Field(field_idx, _) = projs.first().unwrap().kind + { + if (field_idx as usize) == i { Some(&projs[1..]) } else { None } + } else { + unreachable!(); + } + }) + .collect(); + + self.has_significant_drop_outside_of_captures( + closure_def_id, + closure_span, + element_ty, + paths_using_field, + ) + }) + } + + // Anything else would be completely captured and therefore handled already. + _ => unreachable!(), + } + } + + fn init_capture_kind_for_place( &self, + place: &Place<'tcx>, capture_clause: hir::CaptureBy, upvar_id: ty::UpvarId, closure_span: Span, ) -> ty::UpvarCapture<'tcx> { match capture_clause { - hir::CaptureBy::Value => ty::UpvarCapture::ByValue(None), - hir::CaptureBy::Ref => { + // In case of a move closure if the data is accessed through a reference we + // want to capture by ref to allow precise capture using reborrows. + // + // If the data will be moved out of this place, then the place will be truncated + // at the first Deref in `adjust_upvar_borrow_kind_for_consume` and then moved into + // the closure. + hir::CaptureBy::Value if !place.deref_tys().any(ty::TyS::is_ref) => { + ty::UpvarCapture::ByValue(None) + } + hir::CaptureBy::Value | hir::CaptureBy::Ref => { let origin = UpvarRegion(upvar_id, closure_span); let upvar_region = self.next_region_var(origin); let upvar_borrow = ty::UpvarBorrow { kind: ty::ImmBorrow, region: upvar_region }; @@ -791,6 +986,52 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } } +/// Truncate the capture so that the place being borrowed is in accordance with RFC 1240, +/// which states that it's unsafe to take a reference into a struct marked `repr(packed)`. +fn restrict_repr_packed_field_ref_capture<'tcx>( + tcx: TyCtxt<'tcx>, + param_env: ty::ParamEnv<'tcx>, + place: &Place<'tcx>, +) -> Place<'tcx> { + let pos = place.projections.iter().enumerate().position(|(i, p)| { + let ty = place.ty_before_projection(i); + + // Return true for fields of packed structs, unless those fields have alignment 1. + match p.kind { + ProjectionKind::Field(..) => match ty.kind() { + ty::Adt(def, _) if def.repr.packed() => { + match tcx.layout_raw(param_env.and(p.ty)) { + Ok(layout) if layout.align.abi.bytes() == 1 => { + // if the alignment is 1, the type can't be further + // disaligned. + debug!( + "restrict_repr_packed_field_ref_capture: ({:?}) - align = 1", + place + ); + false + } + _ => { + debug!("restrict_repr_packed_field_ref_capture: ({:?}) - true", place); + true + } + } + } + + _ => false, + }, + _ => false, + } + }); + + let mut place = place.clone(); + + if let Some(pos) = pos { + place.projections.truncate(pos); + } + + place +} + struct InferBorrowKind<'a, 'tcx> { fcx: &'a FnCtxt<'a, 'tcx>, @@ -840,6 +1081,7 @@ struct InferBorrowKind<'a, 'tcx> { /// Place { V1, [ProjectionKind::Field(Index=1, Variant=0)] } : CaptureKind { E2, MutableBorrow } /// ``` capture_information: InferredCaptureInformation<'tcx>, + fake_reads: Vec<(Place<'tcx>, FakeReadCause, hir::HirId)>, } impl<'a, 'tcx> InferBorrowKind<'a, 'tcx> { @@ -854,12 +1096,25 @@ impl<'a, 'tcx> InferBorrowKind<'a, 'tcx> { place_with_id, diag_expr_id, mode ); - // we only care about moves - match mode { - euv::Copy => { + match (self.capture_clause, mode) { + // In non-move closures, we only care about moves + (hir::CaptureBy::Ref, euv::Copy) => return, + + // We want to capture Copy types that read through a ref via a reborrow + (hir::CaptureBy::Value, euv::Copy) + if place_with_id.place.deref_tys().any(ty::TyS::is_ref) => + { return; } - euv::Move => {} + + (hir::CaptureBy::Ref, euv::Move) | (hir::CaptureBy::Value, euv::Move | euv::Copy) => {} + }; + + let place = truncate_capture_for_move(place_with_id.place.clone()); + let place_with_id = PlaceWithHirId { place: place.clone(), hir_id: place_with_id.hir_id }; + + if !self.capture_information.contains_key(&place) { + self.init_capture_info_for_place(&place_with_id, diag_expr_id); } let tcx = self.fcx.tcx; @@ -873,13 +1128,15 @@ impl<'a, 'tcx> InferBorrowKind<'a, 'tcx> { let usage_span = tcx.hir().span(diag_expr_id); - // To move out of an upvar, this must be a FnOnce closure - self.adjust_closure_kind( - upvar_id.closure_expr_id, - ty::ClosureKind::FnOnce, - usage_span, - place_with_id.place.clone(), - ); + if matches!(mode, euv::Move) { + // To move out of an upvar, this must be a FnOnce closure + self.adjust_closure_kind( + upvar_id.closure_expr_id, + ty::ClosureKind::FnOnce, + usage_span, + place.clone(), + ); + } let capture_info = ty::CaptureInfo { capture_kind_expr_id: Some(diag_expr_id), @@ -1062,8 +1319,12 @@ impl<'a, 'tcx> InferBorrowKind<'a, 'tcx> { if let PlaceBase::Upvar(upvar_id) = place_with_id.place.base { assert_eq!(self.closure_def_id.expect_local(), upvar_id.closure_expr_id); - let capture_kind = - self.fcx.init_capture_kind(self.capture_clause, upvar_id, self.closure_span); + let capture_kind = self.fcx.init_capture_kind_for_place( + &place_with_id.place, + self.capture_clause, + upvar_id, + self.closure_span, + ); let expr_id = Some(diag_expr_id); let capture_info = ty::CaptureInfo { @@ -1082,6 +1343,12 @@ impl<'a, 'tcx> InferBorrowKind<'a, 'tcx> { } impl<'a, 'tcx> euv::Delegate<'tcx> for InferBorrowKind<'a, 'tcx> { + fn fake_read(&mut self, place: Place<'tcx>, cause: FakeReadCause, diag_expr_id: hir::HirId) { + if let PlaceBase::Upvar(_) = place.base { + self.fake_reads.push((place, cause, diag_expr_id)); + } + } + fn consume( &mut self, place_with_id: &PlaceWithHirId<'tcx>, @@ -1110,8 +1377,15 @@ impl<'a, 'tcx> euv::Delegate<'tcx> for InferBorrowKind<'a, 'tcx> { place_with_id, diag_expr_id, bk ); + let place = restrict_repr_packed_field_ref_capture( + self.fcx.tcx, + self.fcx.param_env, + &place_with_id.place, + ); + let place_with_id = PlaceWithHirId { place, ..*place_with_id }; + if !self.capture_information.contains_key(&place_with_id.place) { - self.init_capture_info_for_place(place_with_id, diag_expr_id); + self.init_capture_info_for_place(&place_with_id, diag_expr_id); } match bk { @@ -1128,24 +1402,15 @@ impl<'a, 'tcx> euv::Delegate<'tcx> for InferBorrowKind<'a, 'tcx> { fn mutate(&mut self, assignee_place: &PlaceWithHirId<'tcx>, diag_expr_id: hir::HirId) { debug!("mutate(assignee_place={:?}, diag_expr_id={:?})", assignee_place, diag_expr_id); - if !self.capture_information.contains_key(&assignee_place.place) { - self.init_capture_info_for_place(assignee_place, diag_expr_id); - } - - self.adjust_upvar_borrow_kind_for_mut(assignee_place, diag_expr_id); + self.borrow(assignee_place, diag_expr_id, ty::BorrowKind::MutBorrow); } } /// Truncate projections so that following rules are obeyed by the captured `place`: -/// -/// - No Derefs in move closure, this will result in value behind a reference getting moved. /// - No projections are applied to raw pointers, since these require unsafe blocks. We capture /// them completely. /// - No Index projections are captured, since arrays are captured completely. -fn restrict_capture_precision<'tcx>( - mut place: Place<'tcx>, - capture_kind: ty::UpvarCapture<'tcx>, -) -> Place<'tcx> { +fn restrict_capture_precision<'tcx>(mut place: Place<'tcx>) -> Place<'tcx> { if place.projections.is_empty() { // Nothing to do here return place; @@ -1157,7 +1422,6 @@ fn restrict_capture_precision<'tcx>( } let mut truncated_length = usize::MAX; - let mut first_deref_projection = usize::MAX; for (i, proj) in place.projections.iter().enumerate() { if proj.ty.is_unsafe_ptr() { @@ -1171,31 +1435,30 @@ fn restrict_capture_precision<'tcx>( truncated_length = truncated_length.min(i); break; } - ProjectionKind::Deref => { - // We only drop Derefs in case of move closures - // There might be an index projection or raw ptr ahead, so we don't stop here. - first_deref_projection = first_deref_projection.min(i); - } + ProjectionKind::Deref => {} ProjectionKind::Field(..) => {} // ignore ProjectionKind::Subslice => {} // We never capture this } } - let length = place - .projections - .len() - .min(truncated_length) - // In case of capture `ByValue` we want to not capture derefs - .min(match capture_kind { - ty::UpvarCapture::ByValue(..) => first_deref_projection, - ty::UpvarCapture::ByRef(..) => usize::MAX, - }); + let length = place.projections.len().min(truncated_length); place.projections.truncate(length); place } +/// Truncates a place so that the resultant capture doesn't move data out of a reference +fn truncate_capture_for_move(mut place: Place<'tcx>) -> Place<'tcx> { + if let Some(i) = place.projections.iter().position(|proj| proj.kind == ProjectionKind::Deref) { + // We only drop Derefs in case of move closures + // There might be an index projection or raw ptr ahead, so we don't stop here. + place.projections.truncate(i); + } + + place +} + fn construct_place_string(tcx: TyCtxt<'_>, place: &Place<'tcx>) -> String { let variable_name = match place.base { PlaceBase::Upvar(upvar_id) => var_name(tcx, upvar_id.var_path.hir_id).to_string(), @@ -1211,7 +1474,7 @@ fn construct_place_string(tcx: TyCtxt<'_>, place: &Place<'tcx>) -> String { ProjectionKind::Subslice => String::from("Subslice"), }; if i != 0 { - projections_str.push_str(","); + projections_str.push(','); } projections_str.push_str(proj.as_str()); } @@ -1382,14 +1645,8 @@ fn determine_place_ancestry_relation( // Assume of length of projections_b = m let projections_b = &place_b.projections; - let mut same_initial_projections = true; - - for (proj_a, proj_b) in projections_a.iter().zip(projections_b.iter()) { - if proj_a != proj_b { - same_initial_projections = false; - break; - } - } + let same_initial_projections = + projections_a.iter().zip(projections_b.iter()).all(|(proj_a, proj_b)| proj_a == proj_b); if same_initial_projections { // First min(n, m) projections are the same diff --git a/compiler/rustc_typeck/src/check/wfcheck.rs b/compiler/rustc_typeck/src/check/wfcheck.rs index c90db4786e..00c6550835 100644 --- a/compiler/rustc_typeck/src/check/wfcheck.rs +++ b/compiler/rustc_typeck/src/check/wfcheck.rs @@ -80,8 +80,8 @@ pub fn check_item_well_formed(tcx: TyCtxt<'_>, def_id: LocalDefId) { let item = tcx.hir().expect_item(hir_id); debug!( - "check_item_well_formed(it.hir_id={:?}, it.name={})", - item.hir_id, + "check_item_well_formed(it.def_id={:?}, it.name={})", + item.def_id, tcx.def_path_str(def_id.to_def_id()) ); @@ -105,7 +105,7 @@ pub fn check_item_well_formed(tcx: TyCtxt<'_>, def_id: LocalDefId) { // for `T` hir::ItemKind::Impl(ref impl_) => { let is_auto = tcx - .impl_trait_ref(tcx.hir().local_def_id(item.hir_id)) + .impl_trait_ref(item.def_id) .map_or(false, |trait_ref| tcx.trait_is_auto(trait_ref.def_id)); if let (hir::Defaultness::Default { .. }, true) = (impl_.defaultness, is_auto) { let sp = impl_.of_trait.as_ref().map_or(item.span, |t| t.path.span); @@ -141,23 +141,23 @@ pub fn check_item_well_formed(tcx: TyCtxt<'_>, def_id: LocalDefId) { } } hir::ItemKind::Fn(ref sig, ..) => { - check_item_fn(tcx, item.hir_id, item.ident, item.span, sig.decl); + check_item_fn(tcx, item.hir_id(), item.ident, item.span, sig.decl); } hir::ItemKind::Static(ref ty, ..) => { - check_item_type(tcx, item.hir_id, ty.span, false); + check_item_type(tcx, item.hir_id(), ty.span, false); } hir::ItemKind::Const(ref ty, ..) => { - check_item_type(tcx, item.hir_id, ty.span, false); + check_item_type(tcx, item.hir_id(), ty.span, false); } hir::ItemKind::ForeignMod { items, .. } => { for it in items.iter() { let it = tcx.hir().foreign_item(it.id); match it.kind { hir::ForeignItemKind::Fn(ref decl, ..) => { - check_item_fn(tcx, it.hir_id, it.ident, it.span, decl) + check_item_fn(tcx, it.hir_id(), it.ident, it.span, decl) } hir::ForeignItemKind::Static(ref ty, ..) => { - check_item_type(tcx, it.hir_id, ty.span, true) + check_item_type(tcx, it.hir_id(), ty.span, true) } hir::ForeignItemKind::Type => (), } @@ -197,7 +197,7 @@ pub fn check_trait_item(tcx: TyCtxt<'_>, def_id: LocalDefId) { _ => None, }; check_object_unsafe_self_trait_by_name(tcx, &trait_item); - check_associated_item(tcx, trait_item.hir_id, trait_item.span, method_sig); + check_associated_item(tcx, trait_item.hir_id(), trait_item.span, method_sig); } fn could_be_self(trait_def_id: LocalDefId, ty: &hir::Ty<'_>) -> bool { @@ -213,9 +213,9 @@ fn could_be_self(trait_def_id: LocalDefId, ty: &hir::Ty<'_>) -> bool { /// Detect when an object unsafe trait is referring to itself in one of its associated items. /// When this is done, suggest using `Self` instead. fn check_object_unsafe_self_trait_by_name(tcx: TyCtxt<'_>, item: &hir::TraitItem<'_>) { - let (trait_name, trait_def_id) = match tcx.hir().get(tcx.hir().get_parent_item(item.hir_id)) { + let (trait_name, trait_def_id) = match tcx.hir().get(tcx.hir().get_parent_item(item.hir_id())) { hir::Node::Item(item) => match item.kind { - hir::ItemKind::Trait(..) => (item.ident, tcx.hir().local_def_id(item.hir_id)), + hir::ItemKind::Trait(..) => (item.ident, item.def_id), _ => return, }, _ => return, @@ -271,7 +271,7 @@ pub fn check_impl_item(tcx: TyCtxt<'_>, def_id: LocalDefId) { _ => None, }; - check_associated_item(tcx, impl_item.hir_id, impl_item.span, method_sig); + check_associated_item(tcx, impl_item.hir_id(), impl_item.span, method_sig); } fn check_param_wf(tcx: TyCtxt<'_>, param: &hir::GenericParam<'_>) { @@ -432,7 +432,7 @@ fn check_associated_item( } fn for_item<'tcx>(tcx: TyCtxt<'tcx>, item: &hir::Item<'_>) -> CheckWfFcxBuilder<'tcx> { - for_id(tcx, item.hir_id, item.span) + for_id(tcx, item.hir_id(), item.span) } fn for_id(tcx: TyCtxt<'_>, id: hir::HirId, span: Span) -> CheckWfFcxBuilder<'_> { @@ -465,8 +465,7 @@ fn check_type_defn<'tcx, F>( { for_item(tcx, item).with_fcx(|fcx, fcx_tcx| { let variants = lookup_fields(fcx); - let def_id = fcx.tcx.hir().local_def_id(item.hir_id); - let packed = fcx.tcx.adt_def(def_id).repr.packed(); + let packed = fcx.tcx.adt_def(item.def_id).repr.packed(); for variant in &variants { // For DST, or when drop needs to copy things around, all @@ -482,7 +481,7 @@ fn check_type_defn<'tcx, F>( // Just treat unresolved type expression as if it needs drop. true } else { - ty.needs_drop(fcx_tcx, fcx_tcx.param_env(def_id)) + ty.needs_drop(fcx_tcx, fcx_tcx.param_env(item.def_id)) } } }; @@ -541,7 +540,7 @@ fn check_type_defn<'tcx, F>( } } - check_where_clauses(tcx, fcx, item.span, def_id.to_def_id(), None); + check_where_clauses(tcx, fcx, item.span, item.def_id.to_def_id(), None); // No implied bounds in a struct definition. vec![] @@ -549,15 +548,13 @@ fn check_type_defn<'tcx, F>( } fn check_trait(tcx: TyCtxt<'_>, item: &hir::Item<'_>) { - debug!("check_trait: {:?}", item.hir_id); + debug!("check_trait: {:?}", item.def_id); - let trait_def_id = tcx.hir().local_def_id(item.hir_id); - - let trait_def = tcx.trait_def(trait_def_id); + let trait_def = tcx.trait_def(item.def_id); if trait_def.is_marker || matches!(trait_def.specialization_kind, TraitSpecializationKind::Marker) { - for associated_def_id in &*tcx.associated_item_def_ids(trait_def_id) { + for associated_def_id in &*tcx.associated_item_def_ids(item.def_id) { struct_span_err!( tcx.sess, tcx.def_span(*associated_def_id), @@ -569,7 +566,7 @@ fn check_trait(tcx: TyCtxt<'_>, item: &hir::Item<'_>) { } for_item(tcx, item).with_fcx(|fcx, _| { - check_where_clauses(tcx, fcx, item.span, trait_def_id.to_def_id(), None); + check_where_clauses(tcx, fcx, item.span, item.def_id.to_def_id(), None); vec![] }); @@ -665,14 +662,12 @@ fn check_impl<'tcx>( debug!("check_impl: {:?}", item); for_item(tcx, item).with_fcx(|fcx, tcx| { - let item_def_id = fcx.tcx.hir().local_def_id(item.hir_id); - match *ast_trait_ref { Some(ref ast_trait_ref) => { // `#[rustc_reservation_impl]` impls are not real impls and // therefore don't need to be WF (the trait's `Self: Trait` predicate // won't hold). - let trait_ref = fcx.tcx.impl_trait_ref(item_def_id).unwrap(); + let trait_ref = fcx.tcx.impl_trait_ref(item.def_id).unwrap(); let trait_ref = fcx.normalize_associated_types_in(ast_trait_ref.path.span, trait_ref); let obligations = traits::wf::trait_obligations( @@ -688,7 +683,7 @@ fn check_impl<'tcx>( } } None => { - let self_ty = fcx.tcx.type_of(item_def_id); + let self_ty = fcx.tcx.type_of(item.def_id); let self_ty = fcx.normalize_associated_types_in(item.span, self_ty); fcx.register_wf_obligation( self_ty.into(), @@ -698,9 +693,9 @@ fn check_impl<'tcx>( } } - check_where_clauses(tcx, fcx, item.span, item_def_id.to_def_id(), None); + check_where_clauses(tcx, fcx, item.span, item.def_id.to_def_id(), None); - fcx.impl_implied_bounds(item_def_id.to_def_id(), item.span) + fcx.impl_implied_bounds(item.def_id.to_def_id(), item.span) }); } @@ -1238,15 +1233,14 @@ fn check_variances_for_type_defn<'tcx>( item: &hir::Item<'tcx>, hir_generics: &hir::Generics<'_>, ) { - let item_def_id = tcx.hir().local_def_id(item.hir_id); - let ty = tcx.type_of(item_def_id); + let ty = tcx.type_of(item.def_id); if tcx.has_error_field(ty) { return; } - let ty_predicates = tcx.predicates_of(item_def_id); + let ty_predicates = tcx.predicates_of(item.def_id); assert_eq!(ty_predicates.parent, None); - let variances = tcx.variances_of(item_def_id); + let variances = tcx.variances_of(item.def_id); let mut constrained_parameters: FxHashSet<_> = variances .iter() @@ -1354,22 +1348,19 @@ impl Visitor<'tcx> for CheckTypeWellFormedVisitor<'tcx> { fn visit_item(&mut self, i: &'tcx hir::Item<'tcx>) { debug!("visit_item: {:?}", i); - let def_id = self.tcx.hir().local_def_id(i.hir_id); - self.tcx.ensure().check_item_well_formed(def_id); + self.tcx.ensure().check_item_well_formed(i.def_id); hir_visit::walk_item(self, i); } fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem<'tcx>) { debug!("visit_trait_item: {:?}", trait_item); - let def_id = self.tcx.hir().local_def_id(trait_item.hir_id); - self.tcx.ensure().check_trait_item_well_formed(def_id); + self.tcx.ensure().check_trait_item_well_formed(trait_item.def_id); hir_visit::walk_trait_item(self, trait_item); } fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem<'tcx>) { debug!("visit_impl_item: {:?}", impl_item); - let def_id = self.tcx.hir().local_def_id(impl_item.hir_id); - self.tcx.ensure().check_impl_item_well_formed(def_id); + self.tcx.ensure().check_impl_item_well_formed(impl_item.def_id); hir_visit::walk_impl_item(self, impl_item); } diff --git a/compiler/rustc_typeck/src/check/writeback.rs b/compiler/rustc_typeck/src/check/writeback.rs index 4d18b2cb3f..9a183ed9e6 100644 --- a/compiler/rustc_typeck/src/check/writeback.rs +++ b/compiler/rustc_typeck/src/check/writeback.rs @@ -4,11 +4,15 @@ use crate::check::FnCtxt; +use rustc_data_structures::stable_map::FxHashMap; use rustc_errors::ErrorReported; use rustc_hir as hir; +use rustc_hir::def_id::DefId; use rustc_hir::intravisit::{self, NestedVisitorMap, Visitor}; use rustc_infer::infer::error_reporting::TypeAnnotationNeeded::E0282; use rustc_infer::infer::InferCtxt; +use rustc_middle::hir::place::Place as HirPlace; +use rustc_middle::mir::FakeReadCause; use rustc_middle::ty::adjustment::{Adjust, Adjustment, PointerCast}; use rustc_middle::ty::fold::{TypeFoldable, TypeFolder}; use rustc_middle::ty::{self, Ty, TyCtxt}; @@ -56,7 +60,7 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { } wbcx.visit_body(body); wbcx.visit_min_capture_map(); - wbcx.visit_upvar_capture_map(); + wbcx.visit_fake_reads_map(); wbcx.visit_closures(); wbcx.visit_liberated_fn_sigs(); wbcx.visit_fru_field_types(); @@ -74,9 +78,6 @@ impl<'a, 'tcx> FnCtxt<'a, 'tcx> { wbcx.typeck_results.treat_byte_string_as_slice = mem::take(&mut self.typeck_results.borrow_mut().treat_byte_string_as_slice); - wbcx.typeck_results.closure_captures = - mem::take(&mut self.typeck_results.borrow_mut().closure_captures); - if self.is_tainted_by_errors() { // FIXME(eddyb) keep track of `ErrorReported` from where the error was emitted. wbcx.typeck_results.tainted_by_errors = Some(ErrorReported); @@ -138,7 +139,7 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> { // operating on scalars, we clear the overload. fn fix_scalar_builtin_expr(&mut self, e: &hir::Expr<'_>) { match e.kind { - hir::ExprKind::Unary(hir::UnOp::UnNeg | hir::UnOp::UnNot, ref inner) => { + hir::ExprKind::Unary(hir::UnOp::Neg | hir::UnOp::Not, ref inner) => { let inner_ty = self.fcx.node_ty(inner.hir_id); let inner_ty = self.fcx.resolve_vars_if_possible(inner_ty); @@ -348,9 +349,9 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> { let min_list_wb = min_list .iter() .map(|captured_place| { - let locatable = captured_place.info.path_expr_id.unwrap_or( - self.tcx().hir().local_def_id_to_hir_id(closure_def_id.expect_local()), - ); + let locatable = captured_place.info.path_expr_id.unwrap_or_else(|| { + self.tcx().hir().local_def_id_to_hir_id(closure_def_id.expect_local()) + }); self.resolve(captured_place.clone(), &locatable) }) @@ -363,20 +364,25 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> { self.typeck_results.closure_min_captures = min_captures_wb; } - fn visit_upvar_capture_map(&mut self) { - for (upvar_id, upvar_capture) in self.fcx.typeck_results.borrow().upvar_capture_map.iter() { - let new_upvar_capture = match *upvar_capture { - ty::UpvarCapture::ByValue(span) => ty::UpvarCapture::ByValue(span), - ty::UpvarCapture::ByRef(ref upvar_borrow) => { - ty::UpvarCapture::ByRef(ty::UpvarBorrow { - kind: upvar_borrow.kind, - region: self.tcx().lifetimes.re_erased, - }) - } - }; - debug!("Upvar capture for {:?} resolved to {:?}", upvar_id, new_upvar_capture); - self.typeck_results.upvar_capture_map.insert(*upvar_id, new_upvar_capture); + fn visit_fake_reads_map(&mut self) { + let mut resolved_closure_fake_reads: FxHashMap< + DefId, + Vec<(HirPlace<'tcx>, FakeReadCause, hir::HirId)>, + > = Default::default(); + for (closure_def_id, fake_reads) in + self.fcx.typeck_results.borrow().closure_fake_reads.iter() + { + let mut resolved_fake_reads = Vec::<(HirPlace<'tcx>, FakeReadCause, hir::HirId)>::new(); + for (place, cause, hir_id) in fake_reads.iter() { + let locatable = + self.tcx().hir().local_def_id_to_hir_id(closure_def_id.expect_local()); + + let resolved_fake_read = self.resolve(place.clone(), &locatable); + resolved_fake_reads.push((resolved_fake_read, *cause, *hir_id)); + } + resolved_closure_fake_reads.insert(*closure_def_id, resolved_fake_reads); } + self.typeck_results.closure_fake_reads = resolved_closure_fake_reads; } fn visit_closures(&mut self) { @@ -497,7 +503,8 @@ impl<'cx, 'tcx> WritebackCx<'cx, 'tcx> { let mut skip_add = false; if let ty::Opaque(defin_ty_def_id, _substs) = *definition_ty.kind() { - if let hir::OpaqueTyOrigin::Misc = opaque_defn.origin { + if let hir::OpaqueTyOrigin::Misc | hir::OpaqueTyOrigin::TyAlias = opaque_defn.origin + { if def_id == defin_ty_def_id { debug!( "skipping adding concrete definition for opaque type {:?} {:?}", diff --git a/compiler/rustc_typeck/src/check_unused.rs b/compiler/rustc_typeck/src/check_unused.rs index 31121ece89..e1743a5dfc 100644 --- a/compiler/rustc_typeck/src/check_unused.rs +++ b/compiler/rustc_typeck/src/check_unused.rs @@ -28,7 +28,7 @@ impl ItemLikeVisitor<'v> for CheckVisitor<'tcx> { return; } if let hir::ItemKind::Use(ref path, _) = item.kind { - self.check_import(item.hir_id, path.span); + self.check_import(item.item_id(), path.span); } } @@ -45,24 +45,28 @@ struct CheckVisitor<'tcx> { } impl CheckVisitor<'tcx> { - fn check_import(&self, id: hir::HirId, span: Span) { - let def_id = self.tcx.hir().local_def_id(id); - if !self.tcx.maybe_unused_trait_import(def_id) { + fn check_import(&self, item_id: hir::ItemId, span: Span) { + if !self.tcx.maybe_unused_trait_import(item_id.def_id) { return; } - if self.used_trait_imports.contains(&def_id) { + if self.used_trait_imports.contains(&item_id.def_id) { return; } - self.tcx.struct_span_lint_hir(lint::builtin::UNUSED_IMPORTS, id, span, |lint| { - let msg = if let Ok(snippet) = self.tcx.sess.source_map().span_to_snippet(span) { - format!("unused import: `{}`", snippet) - } else { - "unused import".to_owned() - }; - lint.build(&msg).emit(); - }); + self.tcx.struct_span_lint_hir( + lint::builtin::UNUSED_IMPORTS, + item_id.hir_id(), + span, + |lint| { + let msg = if let Ok(snippet) = self.tcx.sess.source_map().span_to_snippet(span) { + format!("unused import: `{}`", snippet) + } else { + "unused import".to_owned() + }; + lint.build(&msg).emit(); + }, + ); } } @@ -109,7 +113,6 @@ fn unused_crates_lint(tcx: TyCtxt<'_>) { // Collect all the extern crates (in a reliable order). let mut crates_to_lint = vec![]; tcx.hir().krate().visit_all_item_likes(&mut CollectExternCrateVisitor { - tcx, crates_to_lint: &mut crates_to_lint, }); @@ -189,8 +192,7 @@ fn unused_crates_lint(tcx: TyCtxt<'_>) { } } -struct CollectExternCrateVisitor<'a, 'tcx> { - tcx: TyCtxt<'tcx>, +struct CollectExternCrateVisitor<'a> { crates_to_lint: &'a mut Vec, } @@ -211,12 +213,11 @@ struct ExternCrateToLint { warn_if_unused: bool, } -impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for CollectExternCrateVisitor<'a, 'tcx> { +impl<'a, 'v> ItemLikeVisitor<'v> for CollectExternCrateVisitor<'a> { fn visit_item(&mut self, item: &hir::Item<'_>) { if let hir::ItemKind::ExternCrate(orig_name) = item.kind { - let extern_crate_def_id = self.tcx.hir().local_def_id(item.hir_id); self.crates_to_lint.push(ExternCrateToLint { - def_id: extern_crate_def_id.to_def_id(), + def_id: item.def_id.to_def_id(), span: item.span, orig_name, warn_if_unused: !item.ident.as_str().starts_with('_'), diff --git a/compiler/rustc_typeck/src/coherence/builtin.rs b/compiler/rustc_typeck/src/coherence/builtin.rs index 6726b9b4a4..8cae61e8c2 100644 --- a/compiler/rustc_typeck/src/coherence/builtin.rs +++ b/compiler/rustc_typeck/src/coherence/builtin.rs @@ -38,8 +38,7 @@ impl<'tcx> Checker<'tcx> { F: FnMut(TyCtxt<'tcx>, LocalDefId), { if Some(self.trait_def_id) == trait_def_id { - for &impl_id in self.tcx.hir().trait_impls(self.trait_def_id) { - let impl_def_id = self.tcx.hir().local_def_id(impl_id); + for &impl_def_id in self.tcx.hir().trait_impls(self.trait_def_id) { f(self.tcx, impl_def_id); } } @@ -247,7 +246,7 @@ fn visit_implementation_of_dispatch_from_dyn(tcx: TyCtxt<'_>, impl_did: LocalDef )) .emit(); } else { - let mut fulfill_cx = TraitEngine::new(infcx.tcx); + let mut fulfill_cx = >::new(infcx.tcx); for field in coerced_fields { let predicate = predicate_for_trait_def( @@ -507,7 +506,7 @@ pub fn coerce_unsized_info(tcx: TyCtxt<'tcx>, impl_did: DefId) -> CoerceUnsizedI } }; - let mut fulfill_cx = TraitEngine::new(infcx.tcx); + let mut fulfill_cx = >::new(infcx.tcx); // Register an obligation for `A: Trait`. let cause = traits::ObligationCause::misc(span, impl_hir_id); diff --git a/compiler/rustc_typeck/src/coherence/inherent_impls.rs b/compiler/rustc_typeck/src/coherence/inherent_impls.rs index 8a500852a0..cc592c7a26 100644 --- a/compiler/rustc_typeck/src/coherence/inherent_impls.rs +++ b/compiler/rustc_typeck/src/coherence/inherent_impls.rs @@ -50,8 +50,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { _ => return, }; - let def_id = self.tcx.hir().local_def_id(item.hir_id); - let self_ty = self.tcx.type_of(def_id); + let self_ty = self.tcx.type_of(item.def_id); let lang_items = self.tcx.lang_items(); match *self_ty.kind() { ty::Adt(def, _) => { @@ -65,7 +64,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Bool => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.bool_impl(), None, "bool", @@ -76,7 +75,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Char => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.char_impl(), None, "char", @@ -87,7 +86,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Str => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.str_impl(), lang_items.str_alloc_impl(), "str", @@ -98,7 +97,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Slice(slice_item) if slice_item == self.tcx.types.u8 => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.slice_u8_impl(), lang_items.slice_u8_alloc_impl(), "slice_u8", @@ -109,7 +108,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Slice(_) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.slice_impl(), lang_items.slice_alloc_impl(), "slice", @@ -120,7 +119,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Array(_, _) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.array_impl(), None, "array", @@ -133,7 +132,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { if matches!(inner.kind(), ty::Slice(_)) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.const_slice_ptr_impl(), None, "const_slice_ptr", @@ -146,7 +145,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { if matches!(inner.kind(), ty::Slice(_)) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.mut_slice_ptr_impl(), None, "mut_slice_ptr", @@ -157,7 +156,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::RawPtr(ty::TypeAndMut { ty: _, mutbl: hir::Mutability::Not }) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.const_ptr_impl(), None, "const_ptr", @@ -168,7 +167,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::RawPtr(ty::TypeAndMut { ty: _, mutbl: hir::Mutability::Mut }) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.mut_ptr_impl(), None, "mut_ptr", @@ -179,7 +178,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Int(ty::IntTy::I8) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.i8_impl(), None, "i8", @@ -190,7 +189,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Int(ty::IntTy::I16) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.i16_impl(), None, "i16", @@ -201,7 +200,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Int(ty::IntTy::I32) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.i32_impl(), None, "i32", @@ -212,7 +211,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Int(ty::IntTy::I64) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.i64_impl(), None, "i64", @@ -223,7 +222,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Int(ty::IntTy::I128) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.i128_impl(), None, "i128", @@ -234,7 +233,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Int(ty::IntTy::Isize) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.isize_impl(), None, "isize", @@ -245,7 +244,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Uint(ty::UintTy::U8) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.u8_impl(), None, "u8", @@ -256,7 +255,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Uint(ty::UintTy::U16) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.u16_impl(), None, "u16", @@ -267,7 +266,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Uint(ty::UintTy::U32) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.u32_impl(), None, "u32", @@ -278,7 +277,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Uint(ty::UintTy::U64) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.u64_impl(), None, "u64", @@ -289,7 +288,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Uint(ty::UintTy::U128) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.u128_impl(), None, "u128", @@ -300,7 +299,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Uint(ty::UintTy::Usize) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.usize_impl(), None, "usize", @@ -311,7 +310,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Float(ty::FloatTy::F32) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.f32_impl(), lang_items.f32_runtime_impl(), "f32", @@ -322,7 +321,7 @@ impl ItemLikeVisitor<'v> for InherentCollect<'tcx> { } ty::Float(ty::FloatTy::F64) => { self.check_primitive_impl( - def_id, + item.def_id, lang_items.f64_impl(), lang_items.f64_runtime_impl(), "f64", @@ -369,9 +368,8 @@ impl InherentCollect<'tcx> { // Add the implementation to the mapping from implementation to base // type def ID, if there is a base type for this implementation and // the implementation does not have any associated traits. - let impl_def_id = self.tcx.hir().local_def_id(item.hir_id); let vec = self.impls_map.inherent_impls.entry(def_id).or_default(); - vec.push(impl_def_id.to_def_id()); + vec.push(item.def_id.to_def_id()); } else { struct_span_err!( self.tcx.sess, diff --git a/compiler/rustc_typeck/src/coherence/inherent_impls_overlap.rs b/compiler/rustc_typeck/src/coherence/inherent_impls_overlap.rs index 50d8867432..2965409999 100644 --- a/compiler/rustc_typeck/src/coherence/inherent_impls_overlap.rs +++ b/compiler/rustc_typeck/src/coherence/inherent_impls_overlap.rs @@ -123,8 +123,7 @@ impl ItemLikeVisitor<'v> for InherentOverlapChecker<'tcx> { | hir::ItemKind::Struct(..) | hir::ItemKind::Trait(..) | hir::ItemKind::Union(..) => { - let ty_def_id = self.tcx.hir().local_def_id(item.hir_id); - let impls = self.tcx.inherent_impls(ty_def_id); + let impls = self.tcx.inherent_impls(item.def_id); // If there is only one inherent impl block, // there is nothing to overlap check it with diff --git a/compiler/rustc_typeck/src/coherence/mod.rs b/compiler/rustc_typeck/src/coherence/mod.rs index 4294450333..f04782a1f4 100644 --- a/compiler/rustc_typeck/src/coherence/mod.rs +++ b/compiler/rustc_typeck/src/coherence/mod.rs @@ -48,7 +48,20 @@ fn enforce_trait_manually_implementable( let did = Some(trait_def_id); let li = tcx.lang_items(); - // Disallow *all* explicit impls of `DiscriminantKind`, `Sized` and `Unsize` for now. + // Disallow *all* explicit impls of `Pointee`, `DiscriminantKind`, `Sized` and `Unsize` for now. + if did == li.pointee_trait() { + let span = impl_header_span(tcx, impl_def_id); + struct_span_err!( + tcx.sess, + span, + E0322, + "explicit impls for the `Pointee` trait are not permitted" + ) + .span_label(span, "impl of 'Pointee' not allowed") + .emit(); + return; + } + if did == li.discriminant_kind_trait() { let span = impl_header_span(tcx, impl_def_id); struct_span_err!( @@ -172,8 +185,7 @@ fn coherent_trait(tcx: TyCtxt<'_>, def_id: DefId) { tcx.ensure().specialization_graph_of(def_id); let impls = tcx.hir().trait_impls(def_id); - for &hir_id in impls { - let impl_def_id = tcx.hir().local_def_id(hir_id); + for &impl_def_id in impls { let trait_ref = tcx.impl_trait_ref(impl_def_id).unwrap(); check_impl(tcx, impl_def_id, trait_ref); diff --git a/compiler/rustc_typeck/src/coherence/orphan.rs b/compiler/rustc_typeck/src/coherence/orphan.rs index 9333aac601..05932427bc 100644 --- a/compiler/rustc_typeck/src/coherence/orphan.rs +++ b/compiler/rustc_typeck/src/coherence/orphan.rs @@ -24,7 +24,6 @@ impl ItemLikeVisitor<'v> for OrphanChecker<'tcx> { /// to prevent inundating the user with a bunch of similar error /// reports. fn visit_item(&mut self, item: &hir::Item<'_>) { - let def_id = self.tcx.hir().local_def_id(item.hir_id); // "Trait" impl if let hir::ItemKind::Impl(hir::Impl { generics, of_trait: Some(ref tr), self_ty, .. @@ -32,13 +31,13 @@ impl ItemLikeVisitor<'v> for OrphanChecker<'tcx> { { debug!( "coherence2::orphan check: trait impl {}", - self.tcx.hir().node_to_string(item.hir_id) + self.tcx.hir().node_to_string(item.hir_id()) ); - let trait_ref = self.tcx.impl_trait_ref(def_id).unwrap(); + let trait_ref = self.tcx.impl_trait_ref(item.def_id).unwrap(); let trait_def_id = trait_ref.def_id; let sm = self.tcx.sess.source_map(); let sp = sm.guess_head_span(item.span); - match traits::orphan_check(self.tcx, def_id.to_def_id()) { + match traits::orphan_check(self.tcx, item.def_id.to_def_id()) { Ok(()) => {} Err(traits::OrphanCheckErr::NonLocalInputType(tys)) => { let mut err = struct_span_err!( diff --git a/compiler/rustc_typeck/src/coherence/unsafety.rs b/compiler/rustc_typeck/src/coherence/unsafety.rs index 3a290b7756..6b995b9738 100644 --- a/compiler/rustc_typeck/src/coherence/unsafety.rs +++ b/compiler/rustc_typeck/src/coherence/unsafety.rs @@ -24,8 +24,7 @@ impl UnsafetyChecker<'tcx> { unsafety: hir::Unsafety, polarity: hir::ImplPolarity, ) { - let local_did = self.tcx.hir().local_def_id(item.hir_id); - if let Some(trait_ref) = self.tcx.impl_trait_ref(local_did) { + if let Some(trait_ref) = self.tcx.impl_trait_ref(item.def_id) { let trait_def = self.tcx.trait_def(trait_ref.def_id); let unsafe_attr = impl_generics.and_then(|generics| { generics.params.iter().find(|p| p.pure_wrt_drop).map(|_| "may_dangle") diff --git a/compiler/rustc_typeck/src/collect.rs b/compiler/rustc_typeck/src/collect.rs index c6cc54d712..e5136355ca 100644 --- a/compiler/rustc_typeck/src/collect.rs +++ b/compiler/rustc_typeck/src/collect.rs @@ -1,3 +1,4 @@ +// ignore-tidy-filelength //! "Collection" is the process of determining the type and other external //! details of each item in Rust. Collection is specifically concerned //! with *inter-procedural* things -- for example, for a function @@ -77,6 +78,7 @@ pub fn provide(providers: &mut Providers) { projection_ty_from_predicates, explicit_predicates_of, super_predicates_of, + super_predicates_that_define_assoc_type, trait_explicit_predicates_and_bounds, type_param_predicates, trait_def, @@ -141,6 +143,7 @@ crate fn placeholder_type_error( generics: &[hir::GenericParam<'_>], placeholder_types: Vec, suggest: bool, + hir_ty: Option<&hir::Ty<'_>>, ) { if placeholder_types.is_empty() { return; @@ -171,12 +174,40 @@ crate fn placeholder_type_error( } let mut err = bad_placeholder_type(tcx, placeholder_types); + + // Suggest, but only if it is not a function in const or static if suggest { - err.multipart_suggestion( - "use type parameters instead", - sugg, - Applicability::HasPlaceholders, - ); + let mut is_fn = false; + let mut is_const = false; + let mut is_static = false; + + if let Some(hir_ty) = hir_ty { + if let hir::TyKind::BareFn(_) = hir_ty.kind { + is_fn = true; + + // Check if parent is const or static + let parent_id = tcx.hir().get_parent_node(hir_ty.hir_id); + let parent_node = tcx.hir().get(parent_id); + + if let hir::Node::Item(item) = parent_node { + if let hir::ItemKind::Const(_, _) = item.kind { + is_const = true; + } else if let hir::ItemKind::Static(_, _, _) = item.kind { + is_static = true; + } + } + } + } + + // if function is wrapped around a const or static, + // then don't show the suggestion + if !(is_fn && (is_const || is_static)) { + err.multipart_suggestion( + "use type parameters instead", + sugg, + Applicability::HasPlaceholders, + ); + } } err.emit(); } @@ -198,7 +229,7 @@ fn reject_placeholder_type_signatures_in_item(tcx: TyCtxt<'tcx>, item: &'tcx hir let mut visitor = PlaceholderHirTyCollector::default(); visitor.visit_item(item); - placeholder_type_error(tcx, Some(generics.span), &generics.params[..], visitor.0, suggest); + placeholder_type_error(tcx, Some(generics.span), generics.params, visitor.0, suggest, None); } impl Visitor<'tcx> for CollectItemTypesVisitor<'tcx> { @@ -209,7 +240,7 @@ impl Visitor<'tcx> for CollectItemTypesVisitor<'tcx> { } fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { - convert_item(self.tcx, item.hir_id); + convert_item(self.tcx, item.item_id()); reject_placeholder_type_signatures_in_item(self.tcx, item); intravisit::walk_item(self, item); } @@ -243,12 +274,12 @@ impl Visitor<'tcx> for CollectItemTypesVisitor<'tcx> { } fn visit_trait_item(&mut self, trait_item: &'tcx hir::TraitItem<'tcx>) { - convert_trait_item(self.tcx, trait_item.hir_id); + convert_trait_item(self.tcx, trait_item.trait_item_id()); intravisit::walk_trait_item(self, trait_item); } fn visit_impl_item(&mut self, impl_item: &'tcx hir::ImplItem<'tcx>) { - convert_impl_item(self.tcx, impl_item.hir_id); + convert_impl_item(self.tcx, impl_item.impl_item_id()); intravisit::walk_impl_item(self, impl_item); } } @@ -278,8 +309,8 @@ impl ItemCtxt<'tcx> { ItemCtxt { tcx, item_def_id } } - pub fn to_ty(&self, ast_ty: &'tcx hir::Ty<'tcx>) -> Ty<'tcx> { - AstConv::ast_ty_to_ty(self, ast_ty) + pub fn to_ty(&self, ast_ty: &hir::Ty<'_>) -> Ty<'tcx> { + >::ast_ty_to_ty(self, ast_ty) } pub fn hir_id(&self) -> hir::HirId { @@ -308,8 +339,17 @@ impl AstConv<'tcx> for ItemCtxt<'tcx> { } } - fn get_type_parameter_bounds(&self, span: Span, def_id: DefId) -> ty::GenericPredicates<'tcx> { - self.tcx.at(span).type_param_predicates((self.item_def_id, def_id.expect_local())) + fn get_type_parameter_bounds( + &self, + span: Span, + def_id: DefId, + assoc_name: Ident, + ) -> ty::GenericPredicates<'tcx> { + self.tcx.at(span).type_param_predicates(( + self.item_def_id, + def_id.expect_local(), + assoc_name, + )) } fn re_infer(&self, _: Option<&ty::GenericParamDef>, _: Span) -> Option> { @@ -375,7 +415,7 @@ impl AstConv<'tcx> for ItemCtxt<'tcx> { | hir::ItemKind::Struct(_, generics) | hir::ItemKind::Union(_, generics) => { let lt_name = get_new_lifetime_name(self.tcx, poly_trait_ref, generics); - let (lt_sp, sugg) = match &generics.params[..] { + let (lt_sp, sugg) = match generics.params { [] => (generics.span, format!("<{}>", lt_name)), [bound, ..] => { (bound.span.shrink_to_lo(), format!("{}, ", lt_name)) @@ -495,7 +535,7 @@ fn get_new_lifetime_name<'tcx>( /// `X: Foo` where `X` is the type parameter `def_id`. fn type_param_predicates( tcx: TyCtxt<'_>, - (item_def_id, def_id): (DefId, LocalDefId), + (item_def_id, def_id, assoc_name): (DefId, LocalDefId, Ident), ) -> ty::GenericPredicates<'_> { use rustc_hir::*; @@ -520,7 +560,7 @@ fn type_param_predicates( let mut result = parent .map(|parent| { let icx = ItemCtxt::new(tcx, parent); - icx.get_type_parameter_bounds(DUMMY_SP, def_id.to_def_id()) + icx.get_type_parameter_bounds(DUMMY_SP, def_id.to_def_id(), assoc_name) }) .unwrap_or_default(); let mut extend = None; @@ -563,12 +603,18 @@ fn type_param_predicates( let icx = ItemCtxt::new(tcx, item_def_id); let extra_predicates = extend.into_iter().chain( - icx.type_parameter_bounds_in_generics(ast_generics, param_id, ty, OnlySelfBounds(true)) - .into_iter() - .filter(|(predicate, _)| match predicate.kind().skip_binder() { - ty::PredicateKind::Trait(data, _) => data.self_ty().is_param(index), - _ => false, - }), + icx.type_parameter_bounds_in_generics( + ast_generics, + param_id, + ty, + OnlySelfBounds(true), + Some(assoc_name), + ) + .into_iter() + .filter(|(predicate, _)| match predicate.kind().skip_binder() { + ty::PredicateKind::Trait(data, _) => data.self_ty().is_param(index), + _ => false, + }), ); result.predicates = tcx.arena.alloc_from_iter(result.predicates.iter().copied().chain(extra_predicates)); @@ -586,6 +632,7 @@ impl ItemCtxt<'tcx> { param_id: hir::HirId, ty: Ty<'tcx>, only_self_bounds: OnlySelfBounds, + assoc_name: Option, ) -> Vec<(ty::Predicate<'tcx>, Span)> { let constness = self.default_constness_for_trait_bounds(); let from_ty_params = ast_generics @@ -596,6 +643,10 @@ impl ItemCtxt<'tcx> { _ => None, }) .flat_map(|bounds| bounds.iter()) + .filter(|b| match assoc_name { + Some(assoc_name) => self.bound_defines_assoc_item(b, assoc_name), + None => true, + }) .flat_map(|b| predicates_from_bound(self, ty, b, constness)); let from_where_clauses = ast_generics @@ -614,12 +665,34 @@ impl ItemCtxt<'tcx> { } else { None }; - bp.bounds.iter().filter_map(move |b| bt.map(|bt| (bt, b))) + bp.bounds + .iter() + .filter(|b| match assoc_name { + Some(assoc_name) => self.bound_defines_assoc_item(b, assoc_name), + None => true, + }) + .filter_map(move |b| bt.map(|bt| (bt, b))) }) .flat_map(|(bt, b)| predicates_from_bound(self, bt, b, constness)); from_ty_params.chain(from_where_clauses).collect() } + + fn bound_defines_assoc_item(&self, b: &hir::GenericBound<'_>, assoc_name: Ident) -> bool { + debug!("bound_defines_assoc_item(b={:?}, assoc_name={:?})", b, assoc_name); + + match b { + hir::GenericBound::Trait(poly_trait_ref, _) => { + let trait_ref = &poly_trait_ref.trait_ref; + if let Some(trait_did) = trait_ref.trait_def_id() { + self.tcx.trait_may_define_assoc_type(trait_did, assoc_name) + } else { + false + } + } + _ => false, + } + } } /// Tests whether this is the AST for a reference to the type @@ -639,10 +712,11 @@ fn is_param(tcx: TyCtxt<'_>, ast_ty: &hir::Ty<'_>, param_id: hir::HirId) -> bool } } -fn convert_item(tcx: TyCtxt<'_>, item_id: hir::HirId) { - let it = tcx.hir().expect_item(item_id); - debug!("convert: item {} with id {}", it.ident, it.hir_id); - let def_id = tcx.hir().local_def_id(item_id); +fn convert_item(tcx: TyCtxt<'_>, item_id: hir::ItemId) { + let it = tcx.hir().item(item_id); + debug!("convert: item {} with id {}", it.ident, it.hir_id()); + let def_id = item_id.def_id; + match it.kind { // These don't define types. hir::ItemKind::ExternCrate(_) @@ -652,12 +726,11 @@ fn convert_item(tcx: TyCtxt<'_>, item_id: hir::HirId) { hir::ItemKind::ForeignMod { items, .. } => { for item in items { let item = tcx.hir().foreign_item(item.id); - let def_id = tcx.hir().local_def_id(item.hir_id); - tcx.ensure().generics_of(def_id); - tcx.ensure().type_of(def_id); - tcx.ensure().predicates_of(def_id); + tcx.ensure().generics_of(item.def_id); + tcx.ensure().type_of(item.def_id); + tcx.ensure().predicates_of(item.def_id); if let hir::ForeignItemKind::Fn(..) = item.kind { - tcx.ensure().fn_sig(def_id); + tcx.ensure().fn_sig(item.def_id); } } } @@ -728,57 +801,57 @@ fn convert_item(tcx: TyCtxt<'_>, item_id: hir::HirId) { } } -fn convert_trait_item(tcx: TyCtxt<'_>, trait_item_id: hir::HirId) { - let trait_item = tcx.hir().expect_trait_item(trait_item_id); - let def_id = tcx.hir().local_def_id(trait_item.hir_id); - tcx.ensure().generics_of(def_id); +fn convert_trait_item(tcx: TyCtxt<'_>, trait_item_id: hir::TraitItemId) { + let trait_item = tcx.hir().trait_item(trait_item_id); + tcx.ensure().generics_of(trait_item_id.def_id); match trait_item.kind { hir::TraitItemKind::Fn(..) => { - tcx.ensure().type_of(def_id); - tcx.ensure().fn_sig(def_id); + tcx.ensure().type_of(trait_item_id.def_id); + tcx.ensure().fn_sig(trait_item_id.def_id); } hir::TraitItemKind::Const(.., Some(_)) => { - tcx.ensure().type_of(def_id); + tcx.ensure().type_of(trait_item_id.def_id); } hir::TraitItemKind::Const(..) => { - tcx.ensure().type_of(def_id); + tcx.ensure().type_of(trait_item_id.def_id); // Account for `const C: _;`. let mut visitor = PlaceholderHirTyCollector::default(); visitor.visit_trait_item(trait_item); - placeholder_type_error(tcx, None, &[], visitor.0, false); + placeholder_type_error(tcx, None, &[], visitor.0, false, None); } hir::TraitItemKind::Type(_, Some(_)) => { - tcx.ensure().item_bounds(def_id); - tcx.ensure().type_of(def_id); + tcx.ensure().item_bounds(trait_item_id.def_id); + tcx.ensure().type_of(trait_item_id.def_id); // Account for `type T = _;`. let mut visitor = PlaceholderHirTyCollector::default(); visitor.visit_trait_item(trait_item); - placeholder_type_error(tcx, None, &[], visitor.0, false); + placeholder_type_error(tcx, None, &[], visitor.0, false, None); } hir::TraitItemKind::Type(_, None) => { - tcx.ensure().item_bounds(def_id); + tcx.ensure().item_bounds(trait_item_id.def_id); // #74612: Visit and try to find bad placeholders // even if there is no concrete type. let mut visitor = PlaceholderHirTyCollector::default(); visitor.visit_trait_item(trait_item); - placeholder_type_error(tcx, None, &[], visitor.0, false); + + placeholder_type_error(tcx, None, &[], visitor.0, false, None); } }; - tcx.ensure().predicates_of(def_id); + tcx.ensure().predicates_of(trait_item_id.def_id); } -fn convert_impl_item(tcx: TyCtxt<'_>, impl_item_id: hir::HirId) { - let def_id = tcx.hir().local_def_id(impl_item_id); +fn convert_impl_item(tcx: TyCtxt<'_>, impl_item_id: hir::ImplItemId) { + let def_id = impl_item_id.def_id; tcx.ensure().generics_of(def_id); tcx.ensure().type_of(def_id); tcx.ensure().predicates_of(def_id); - let impl_item = tcx.hir().expect_impl_item(impl_item_id); + let impl_item = tcx.hir().impl_item(impl_item_id); match impl_item.kind { hir::ImplItemKind::Fn(..) => { tcx.ensure().fn_sig(def_id); @@ -787,7 +860,8 @@ fn convert_impl_item(tcx: TyCtxt<'_>, impl_item_id: hir::HirId) { // Account for `type T = _;` let mut visitor = PlaceholderHirTyCollector::default(); visitor.visit_impl_item(impl_item); - placeholder_type_error(tcx, None, &[], visitor.0, false); + + placeholder_type_error(tcx, None, &[], visitor.0, false, None); } hir::ImplItemKind::Const(..) => {} } @@ -988,54 +1062,97 @@ fn adt_def(tcx: TyCtxt<'_>, def_id: DefId) -> &ty::AdtDef { /// the transitive super-predicates are converted. fn super_predicates_of(tcx: TyCtxt<'_>, trait_def_id: DefId) -> ty::GenericPredicates<'_> { debug!("super_predicates(trait_def_id={:?})", trait_def_id); - let trait_hir_id = tcx.hir().local_def_id_to_hir_id(trait_def_id.expect_local()); + tcx.super_predicates_that_define_assoc_type((trait_def_id, None)) +} - let item = match tcx.hir().get(trait_hir_id) { - Node::Item(item) => item, - _ => bug!("trait_node_id {} is not an item", trait_hir_id), - }; +/// Ensures that the super-predicates of the trait with a `DefId` +/// of `trait_def_id` are converted and stored. This also ensures that +/// the transitive super-predicates are converted. +fn super_predicates_that_define_assoc_type( + tcx: TyCtxt<'_>, + (trait_def_id, assoc_name): (DefId, Option), +) -> ty::GenericPredicates<'_> { + debug!( + "super_predicates_that_define_assoc_type(trait_def_id={:?}, assoc_name={:?})", + trait_def_id, assoc_name + ); + if trait_def_id.is_local() { + debug!("super_predicates_that_define_assoc_type: local trait_def_id={:?}", trait_def_id); + let trait_hir_id = tcx.hir().local_def_id_to_hir_id(trait_def_id.expect_local()); - let (generics, bounds) = match item.kind { - hir::ItemKind::Trait(.., ref generics, ref supertraits, _) => (generics, supertraits), - hir::ItemKind::TraitAlias(ref generics, ref supertraits) => (generics, supertraits), - _ => span_bug!(item.span, "super_predicates invoked on non-trait"), - }; + let item = match tcx.hir().get(trait_hir_id) { + Node::Item(item) => item, + _ => bug!("trait_node_id {} is not an item", trait_hir_id), + }; - let icx = ItemCtxt::new(tcx, trait_def_id); - - // Convert the bounds that follow the colon, e.g., `Bar + Zed` in `trait Foo: Bar + Zed`. - let self_param_ty = tcx.types.self_param; - let superbounds1 = - AstConv::compute_bounds(&icx, self_param_ty, bounds, SizedByDefault::No, item.span); - - let superbounds1 = superbounds1.predicates(tcx, self_param_ty); - - // Convert any explicit superbounds in the where-clause, - // e.g., `trait Foo where Self: Bar`. - // In the case of trait aliases, however, we include all bounds in the where-clause, - // so e.g., `trait Foo = where u32: PartialEq` would include `u32: PartialEq` - // as one of its "superpredicates". - let is_trait_alias = tcx.is_trait_alias(trait_def_id); - let superbounds2 = icx.type_parameter_bounds_in_generics( - generics, - item.hir_id, - self_param_ty, - OnlySelfBounds(!is_trait_alias), - ); + let (generics, bounds) = match item.kind { + hir::ItemKind::Trait(.., ref generics, ref supertraits, _) => (generics, supertraits), + hir::ItemKind::TraitAlias(ref generics, ref supertraits) => (generics, supertraits), + _ => span_bug!(item.span, "super_predicates invoked on non-trait"), + }; + + let icx = ItemCtxt::new(tcx, trait_def_id); + + // Convert the bounds that follow the colon, e.g., `Bar + Zed` in `trait Foo: Bar + Zed`. + let self_param_ty = tcx.types.self_param; + let superbounds1 = if let Some(assoc_name) = assoc_name { + >::compute_bounds_that_match_assoc_type( + &icx, + self_param_ty, + &bounds, + SizedByDefault::No, + item.span, + assoc_name, + ) + } else { + >::compute_bounds( + &icx, + self_param_ty, + &bounds, + SizedByDefault::No, + item.span, + ) + }; + + let superbounds1 = superbounds1.predicates(tcx, self_param_ty); - // Combine the two lists to form the complete set of superbounds: - let superbounds = &*tcx.arena.alloc_from_iter(superbounds1.into_iter().chain(superbounds2)); + // Convert any explicit superbounds in the where-clause, + // e.g., `trait Foo where Self: Bar`. + // In the case of trait aliases, however, we include all bounds in the where-clause, + // so e.g., `trait Foo = where u32: PartialEq` would include `u32: PartialEq` + // as one of its "superpredicates". + let is_trait_alias = tcx.is_trait_alias(trait_def_id); + let superbounds2 = icx.type_parameter_bounds_in_generics( + generics, + item.hir_id(), + self_param_ty, + OnlySelfBounds(!is_trait_alias), + assoc_name, + ); - // Now require that immediate supertraits are converted, - // which will, in turn, reach indirect supertraits. - for &(pred, span) in superbounds { - debug!("superbound: {:?}", pred); - if let ty::PredicateKind::Trait(bound, _) = pred.kind().skip_binder() { - tcx.at(span).super_predicates_of(bound.def_id()); + // Combine the two lists to form the complete set of superbounds: + let superbounds = &*tcx.arena.alloc_from_iter(superbounds1.into_iter().chain(superbounds2)); + + // Now require that immediate supertraits are converted, + // which will, in turn, reach indirect supertraits. + if assoc_name.is_none() { + // Now require that immediate supertraits are converted, + // which will, in turn, reach indirect supertraits. + for &(pred, span) in superbounds { + debug!("superbound: {:?}", pred); + if let ty::PredicateKind::Trait(bound, _) = pred.kind().skip_binder() { + tcx.at(span).super_predicates_of(bound.def_id()); + } + } } - } - ty::GenericPredicates { parent: None, predicates: superbounds } + ty::GenericPredicates { parent: None, predicates: superbounds } + } else { + // if `assoc_name` is None, then the query should've been redirected to an + // external provider + assert!(assoc_name.is_some()); + tcx.super_predicates_of(trait_def_id) + } } fn trait_def(tcx: TyCtxt<'_>, def_id: DefId) -> ty::TraitDef { @@ -1331,12 +1448,12 @@ fn generics_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::Generics { // // Something of a hack: use the node id for the trait, also as // the node id for the Self type parameter. - let param_id = item.hir_id; + let param_id = item.def_id; opt_self = Some(ty::GenericParamDef { index: 0, name: kw::SelfUpper, - def_id: tcx.hir().local_def_id(param_id).to_def_id(), + def_id: param_id.to_def_id(), pure_wrt_drop: false, kind: ty::GenericParamDefKind::Type { has_default: false, @@ -1578,13 +1695,14 @@ fn fn_sig(tcx: TyCtxt<'_>, def_id: DefId) -> ty::PolyFnSig<'_> { ty::Binder::bind(fn_sig) } - None => AstConv::ty_of_fn( + None => >::ty_of_fn( &icx, sig.header.unsafety, sig.header.abi, &sig.decl, &generics, Some(ident.span), + None, ), } } @@ -1594,9 +1712,15 @@ fn fn_sig(tcx: TyCtxt<'_>, def_id: DefId) -> ty::PolyFnSig<'_> { ident, generics, .. - }) => { - AstConv::ty_of_fn(&icx, header.unsafety, header.abi, decl, &generics, Some(ident.span)) - } + }) => >::ty_of_fn( + &icx, + header.unsafety, + header.abi, + decl, + &generics, + Some(ident.span), + None, + ), ForeignItem(&hir::ForeignItem { kind: ForeignItemKind::Fn(ref fn_decl, _, _), @@ -1649,7 +1773,7 @@ fn impl_trait_ref(tcx: TyCtxt<'_>, def_id: DefId) -> Option> { match tcx.hir().expect_item(hir_id).kind { hir::ItemKind::Impl(ref impl_) => impl_.of_trait.as_ref().map(|ast_trait_ref| { let selfty = tcx.type_of(def_id); - AstConv::instantiate_mono_trait_ref(&icx, ast_trait_ref, selfty) + >::instantiate_mono_trait_ref(&icx, ast_trait_ref, selfty) }), _ => bug!(), } @@ -1900,7 +2024,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP GenericParamKind::Lifetime { .. } => { param.bounds.iter().for_each(|bound| match bound { hir::GenericBound::Outlives(lt) => { - let bound = AstConv::ast_region_to_region(&icx, <, None); + let bound = >::ast_region_to_region(&icx, <, None); let outlives = ty::Binder::bind(ty::OutlivesPredicate(region, bound)); predicates.insert((outlives.to_predicate(tcx), lt.span)); } @@ -1923,8 +2047,13 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP index += 1; let sized = SizedByDefault::Yes; - let bounds = - AstConv::compute_bounds(&icx, param_ty, ¶m.bounds, sized, param.span); + let bounds = >::compute_bounds( + &icx, + param_ty, + ¶m.bounds, + sized, + param.span, + ); predicates.extend(bounds.predicates(tcx, param_ty)); } GenericParamKind::Const { .. } => { @@ -1973,7 +2102,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP }; let mut bounds = Bounds::default(); - let _ = AstConv::instantiate_poly_trait_ref( + let _ = >::instantiate_poly_trait_ref( &icx, &poly_trait_ref, constness, @@ -1985,7 +2114,7 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP &hir::GenericBound::LangItemTrait(lang_item, span, hir_id, args) => { let mut bounds = Bounds::default(); - AstConv::instantiate_lang_item_trait_ref( + >::instantiate_lang_item_trait_ref( &icx, lang_item, span, @@ -1998,7 +2127,8 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP } hir::GenericBound::Outlives(lifetime) => { - let region = AstConv::ast_region_to_region(&icx, lifetime, None); + let region = + >::ast_region_to_region(&icx, lifetime, None); predicates.insert(( ty::Binder::bind(ty::PredicateKind::TypeOutlives( ty::OutlivesPredicate(ty, region), @@ -2012,11 +2142,11 @@ fn gather_explicit_predicates_of(tcx: TyCtxt<'_>, def_id: DefId) -> ty::GenericP } hir::WherePredicate::RegionPredicate(region_pred) => { - let r1 = AstConv::ast_region_to_region(&icx, ®ion_pred.lifetime, None); + let r1 = >::ast_region_to_region(&icx, ®ion_pred.lifetime, None); predicates.extend(region_pred.bounds.iter().map(|bound| { let (r2, span) = match bound { hir::GenericBound::Outlives(lt) => { - (AstConv::ast_region_to_region(&icx, lt, None), lt.span) + (>::ast_region_to_region(&icx, lt, None), lt.span) } _ => bug!(), }; @@ -2259,13 +2389,14 @@ fn compute_sig_of_foreign_fn_decl<'tcx>( } else { hir::Unsafety::Unsafe }; - let fty = AstConv::ty_of_fn( + let fty = >::ty_of_fn( &ItemCtxt::new(tcx, def_id), unsafety, abi, decl, &hir::Generics::empty(), Some(ident.span), + None, ); // Feature gate SIMD types in FFI, since I am not sure that the @@ -2280,7 +2411,7 @@ fn compute_sig_of_foreign_fn_decl<'tcx>( .sess .source_map() .span_to_snippet(ast_ty.span) - .map_or(String::new(), |s| format!(" `{}`", s)); + .map_or_else(|_| String::new(), |s| format!(" `{}`", s)); tcx.sess .struct_span_err( ast_ty.span, @@ -2547,7 +2678,7 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, id: DefId) -> CodegenFnAttrs { } else if tcx.sess.check_name(attr, sym::used) { codegen_fn_attrs.flags |= CodegenFnAttrFlags::USED; } else if tcx.sess.check_name(attr, sym::cmse_nonsecure_entry) { - if tcx.fn_sig(id).abi() != abi::Abi::C { + if !matches!(tcx.fn_sig(id).abi(), abi::Abi::C { .. }) { struct_span_err!( tcx.sess, attr.span, @@ -2640,10 +2771,12 @@ fn codegen_fn_attrs(tcx: TyCtxt<'_>, id: DefId) -> CodegenFnAttrs { codegen_fn_attrs.no_sanitize |= SanitizerSet::MEMORY; } else if item.has_name(sym::thread) { codegen_fn_attrs.no_sanitize |= SanitizerSet::THREAD; + } else if item.has_name(sym::hwaddress) { + codegen_fn_attrs.no_sanitize |= SanitizerSet::HWADDRESS; } else { tcx.sess .struct_span_err(item.span(), "invalid argument for `no_sanitize`") - .note("expected one of: `address`, `memory` or `thread`") + .note("expected one of: `address`, `hwaddress`, `memory` or `thread`") .emit(); } } diff --git a/compiler/rustc_typeck/src/collect/item_bounds.rs b/compiler/rustc_typeck/src/collect/item_bounds.rs index 537a583289..a5b36445aa 100644 --- a/compiler/rustc_typeck/src/collect/item_bounds.rs +++ b/compiler/rustc_typeck/src/collect/item_bounds.rs @@ -25,10 +25,10 @@ fn associated_type_bounds<'tcx>( InternalSubsts::identity_for_item(tcx, assoc_item_def_id), ); - let bounds = AstConv::compute_bounds( + let bounds = >::compute_bounds( &ItemCtxt::new(tcx, assoc_item_def_id), item_ty, - bounds, + &bounds, SizedByDefault::Yes, span, ); @@ -66,10 +66,10 @@ fn opaque_type_bounds<'tcx>( let item_ty = tcx.mk_opaque(opaque_def_id, InternalSubsts::identity_for_item(tcx, opaque_def_id)); - let bounds = AstConv::compute_bounds( + let bounds = >::compute_bounds( &ItemCtxt::new(tcx, opaque_def_id), item_ty, - bounds, + &bounds, SizedByDefault::Yes, span, ) diff --git a/compiler/rustc_typeck/src/collect/type_of.rs b/compiler/rustc_typeck/src/collect/type_of.rs index e4eabca9c3..3f2f244e44 100644 --- a/compiler/rustc_typeck/src/collect/type_of.rs +++ b/compiler/rustc_typeck/src/collect/type_of.rs @@ -1,4 +1,3 @@ -use crate::errors::AssocTypeOnInherentImpl; use rustc_data_structures::fx::FxHashSet; use rustc_errors::{Applicability, ErrorReported, StashKey}; use rustc_hir as hir; @@ -29,6 +28,73 @@ pub(super) fn opt_const_param_of(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Option< let parent_node = tcx.hir().get(parent_node_id); match parent_node { + // This match arm is for when the def_id appears in a GAT whose + // path can't be resolved without typechecking e.g. + // + // trait Foo { + // type Assoc; + // fn foo() -> Self::Assoc<3>; + // } + // + // In the above code we would call this query with the def_id of 3 and + // the parent_node we match on would be the hir node for Self::Assoc<3> + // + // `Self::Assoc<3>` cant be resolved without typchecking here as we + // didnt write ::Assoc<3>. If we did then another match + // arm would handle this. + // + // I believe this match arm is only needed for GAT but I am not 100% sure - BoxyUwU + Node::Ty(hir_ty @ Ty { kind: TyKind::Path(QPath::TypeRelative(_, segment)), .. }) => { + // Find the Item containing the associated type so we can create an ItemCtxt. + // Using the ItemCtxt convert the HIR for the unresolved assoc type into a + // ty which is a fully resolved projection. + // For the code example above, this would mean converting Self::Assoc<3> + // into a ty::Projection(::Assoc<3>) + let item_hir_id = tcx + .hir() + .parent_iter(hir_id) + .filter(|(_, node)| matches!(node, Node::Item(_))) + .map(|(id, _)| id) + .next() + .unwrap(); + let item_did = tcx.hir().local_def_id(item_hir_id).to_def_id(); + let item_ctxt = &ItemCtxt::new(tcx, item_did) as &dyn crate::astconv::AstConv<'_>; + let ty = item_ctxt.ast_ty_to_ty(hir_ty); + + // Iterate through the generics of the projection to find the one that corresponds to + // the def_id that this query was called with. We filter to only const args here as a + // precaution for if it's ever allowed to elide lifetimes in GAT's. It currently isn't + // but it can't hurt to be safe ^^ + if let ty::Projection(projection) = ty.kind() { + let generics = tcx.generics_of(projection.item_def_id); + + let arg_index = segment + .args + .and_then(|args| { + args.args + .iter() + .filter(|arg| arg.is_const()) + .position(|arg| arg.id() == hir_id) + }) + .unwrap_or_else(|| { + bug!("no arg matching AnonConst in segment"); + }); + + return generics + .params + .iter() + .filter(|param| matches!(param.kind, ty::GenericParamDefKind::Const)) + .nth(arg_index) + .map(|param| param.def_id); + } + + // I dont think it's possible to reach this but I'm not 100% sure - BoxyUwU + tcx.sess.delay_span_bug( + tcx.def_span(def_id), + "unexpected non-GAT usage of an anon const", + ); + return None; + } Node::Expr(&Expr { kind: ExprKind::MethodCall(segment, ..) | ExprKind::Path(QPath::TypeRelative(_, segment)), @@ -227,7 +293,7 @@ pub(super) fn type_of(tcx: TyCtxt<'_>, def_id: DefId) -> Ty<'_> { } ImplItemKind::TyAlias(ref ty) => { if tcx.impl_trait_ref(tcx.hir().get_parent_did(hir_id).to_def_id()).is_none() { - report_assoc_ty_on_inherent_impl(tcx, item.span); + check_feature_inherent_assoc_ty(tcx, item.span); } icx.to_ty(ty) @@ -515,26 +581,23 @@ fn find_opaque_ty_constraints(tcx: TyCtxt<'_>, def_id: LocalDefId) -> Ty<'_> { } fn visit_item(&mut self, it: &'tcx Item<'tcx>) { debug!("find_existential_constraints: visiting {:?}", it); - let def_id = self.tcx.hir().local_def_id(it.hir_id); // The opaque type itself or its children are not within its reveal scope. - if def_id.to_def_id() != self.def_id { - self.check(def_id); + if it.def_id.to_def_id() != self.def_id { + self.check(it.def_id); intravisit::walk_item(self, it); } } fn visit_impl_item(&mut self, it: &'tcx ImplItem<'tcx>) { debug!("find_existential_constraints: visiting {:?}", it); - let def_id = self.tcx.hir().local_def_id(it.hir_id); // The opaque type itself or its children are not within its reveal scope. - if def_id.to_def_id() != self.def_id { - self.check(def_id); + if it.def_id.to_def_id() != self.def_id { + self.check(it.def_id); intravisit::walk_impl_item(self, it); } } fn visit_trait_item(&mut self, it: &'tcx TraitItem<'tcx>) { debug!("find_existential_constraints: visiting {:?}", it); - let def_id = self.tcx.hir().local_def_id(it.hir_id); - self.check(def_id); + self.check(it.def_id); intravisit::walk_trait_item(self, it); } } @@ -659,11 +722,12 @@ fn infer_placeholder_type( format!("{}: {}", item_ident, ty), Applicability::MachineApplicable, ) - .emit(); + .emit_unless(ty.references_error()); } None => { let mut diag = bad_placeholder_type(tcx, vec![span]); - if !matches!(ty.kind(), ty::Error(_)) { + + if !ty.references_error() { diag.span_suggestion( span, "replace `_` with the correct type", @@ -671,6 +735,7 @@ fn infer_placeholder_type( Applicability::MaybeIncorrect, ); } + diag.emit(); } } @@ -682,6 +747,16 @@ fn infer_placeholder_type( }) } -fn report_assoc_ty_on_inherent_impl(tcx: TyCtxt<'_>, span: Span) { - tcx.sess.emit_err(AssocTypeOnInherentImpl { span }); +fn check_feature_inherent_assoc_ty(tcx: TyCtxt<'_>, span: Span) { + if !tcx.features().inherent_associated_types { + use rustc_session::parse::feature_err; + use rustc_span::symbol::sym; + feature_err( + &tcx.sess.parse_sess, + sym::inherent_associated_types, + span, + "inherent associated types are unstable", + ) + .emit(); + } } diff --git a/compiler/rustc_typeck/src/constrained_generic_params.rs b/compiler/rustc_typeck/src/constrained_generic_params.rs index 95670b9bdb..529de1a287 100644 --- a/compiler/rustc_typeck/src/constrained_generic_params.rs +++ b/compiler/rustc_typeck/src/constrained_generic_params.rs @@ -198,7 +198,7 @@ pub fn setup_constraining_predicates<'tcx>( // `<::Baz as Iterator>::Output = ::Output` // Then the projection only applies if `T` is known, but it still // does not determine `U`. - let inputs = parameters_for(&projection.projection_ty.trait_ref(tcx), true); + let inputs = parameters_for(&projection.projection_ty, true); let relies_only_on_inputs = inputs.iter().all(|p| input_parameters.contains(&p)); if !relies_only_on_inputs { continue; diff --git a/compiler/rustc_typeck/src/errors.rs b/compiler/rustc_typeck/src/errors.rs index a769e48d2c..5068242692 100644 --- a/compiler/rustc_typeck/src/errors.rs +++ b/compiler/rustc_typeck/src/errors.rs @@ -82,13 +82,6 @@ pub struct CopyImplOnTypeWithDtor { pub span: Span, } -#[derive(SessionDiagnostic)] -#[error = "E0202"] -pub struct AssocTypeOnInherentImpl { - #[message = "associated types are not yet supported in inherent impls (see #8995)"] - pub span: Span, -} - #[derive(SessionDiagnostic)] #[error = "E0203"] pub struct MultipleRelaxedDefaultBounds { diff --git a/compiler/rustc_typeck/src/expr_use_visitor.rs b/compiler/rustc_typeck/src/expr_use_visitor.rs index bd2c266d93..b172cb9c44 100644 --- a/compiler/rustc_typeck/src/expr_use_visitor.rs +++ b/compiler/rustc_typeck/src/expr_use_visitor.rs @@ -5,8 +5,9 @@ pub use self::ConsumeMode::*; // Export these here so that Clippy can use them. -pub use rustc_middle::hir::place::{PlaceBase, PlaceWithHirId, Projection}; +pub use rustc_middle::hir::place::{Place, PlaceBase, PlaceWithHirId, Projection}; +use rustc_data_structures::fx::FxIndexMap; use rustc_hir as hir; use rustc_hir::def::Res; use rustc_hir::def_id::LocalDefId; @@ -14,6 +15,7 @@ use rustc_hir::PatKind; use rustc_index::vec::Idx; use rustc_infer::infer::InferCtxt; use rustc_middle::hir::place::ProjectionKind; +use rustc_middle::mir::FakeReadCause; use rustc_middle::ty::{self, adjustment, TyCtxt}; use rustc_target::abi::VariantIdx; @@ -51,6 +53,9 @@ pub trait Delegate<'tcx> { // The path at `assignee_place` is being assigned to. // `diag_expr_id` is the id used for diagnostics (see `consume` for more details). fn mutate(&mut self, assignee_place: &PlaceWithHirId<'tcx>, diag_expr_id: hir::HirId); + + // The `place` should be a fake read because of specified `cause`. + fn fake_read(&mut self, place: Place<'tcx>, cause: FakeReadCause, diag_expr_id: hir::HirId); } #[derive(Copy, Clone, PartialEq, Debug)] @@ -184,7 +189,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> { hir::ExprKind::Type(ref subexpr, _) => self.walk_expr(subexpr), - hir::ExprKind::Unary(hir::UnOp::UnDeref, ref base) => { + hir::ExprKind::Unary(hir::UnOp::Deref, ref base) => { // *base self.select_from_expr(base); } @@ -229,7 +234,61 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> { hir::ExprKind::Match(ref discr, arms, _) => { let discr_place = return_if_err!(self.mc.cat_expr(&discr)); - self.borrow_expr(&discr, ty::ImmBorrow); + + // Matching should not always be considered a use of the place, hence + // discr does not necessarily need to be borrowed. + // We only want to borrow discr if the pattern contain something other + // than wildcards. + let ExprUseVisitor { ref mc, body_owner: _, delegate: _ } = *self; + let mut needs_to_be_read = false; + for arm in arms.iter() { + return_if_err!(mc.cat_pattern(discr_place.clone(), &arm.pat, |place, pat| { + match &pat.kind { + PatKind::Binding(.., opt_sub_pat) => { + // If the opt_sub_pat is None, than the binding does not count as + // a wildcard for the purpose of borrowing discr. + if opt_sub_pat.is_none() { + needs_to_be_read = true; + } + } + PatKind::TupleStruct(..) + | PatKind::Path(..) + | PatKind::Struct(..) + | PatKind::Tuple(..) => { + // If the PatKind is a TupleStruct, Struct or Tuple then we want to check + // whether the Variant is a MultiVariant or a SingleVariant. We only want + // to borrow discr if it is a MultiVariant. + // If it is a SingleVariant and creates a binding we will handle that when + // this callback gets called again. + if let ty::Adt(def, _) = place.place.base_ty.kind() { + if def.variants.len() > 1 { + needs_to_be_read = true; + } + } + } + PatKind::Lit(_) => { + // If the PatKind is a Lit then we want + // to borrow discr. + needs_to_be_read = true; + } + _ => {} + } + })); + } + + if needs_to_be_read { + self.borrow_expr(&discr, ty::ImmBorrow); + } else { + self.delegate.fake_read( + discr_place.place.clone(), + FakeReadCause::ForMatchedPlace, + discr_place.hir_id, + ); + + // We always want to walk the discriminant. We want to make sure, for instance, + // that the discriminant has been initialized. + self.walk_expr(&discr); + } // treatment of the discriminant is handled while walking the arms. for arm in arms { @@ -397,7 +456,7 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> { fn walk_struct_expr( &mut self, - fields: &[hir::Field<'_>], + fields: &[hir::ExprField<'_>], opt_with: &Option<&'hir hir::Expr<'_>>, ) { // Consume the expressions supplying values for each field. @@ -518,6 +577,11 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> { } fn walk_arm(&mut self, discr_place: &PlaceWithHirId<'tcx>, arm: &hir::Arm<'_>) { + self.delegate.fake_read( + discr_place.place.clone(), + FakeReadCause::ForMatchedPlace, + discr_place.hir_id, + ); self.walk_pat(discr_place, &arm.pat); if let Some(hir::Guard::If(ref e)) = arm.guard { @@ -530,6 +594,11 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> { /// Walks a pat that occurs in isolation (i.e., top-level of fn argument or /// let binding, and *not* a match arm or nested pat.) fn walk_irrefutable_pat(&mut self, discr_place: &PlaceWithHirId<'tcx>, pat: &hir::Pat<'_>) { + self.delegate.fake_read( + discr_place.place.clone(), + FakeReadCause::ForLet, + discr_place.hir_id, + ); self.walk_pat(discr_place, pat); } @@ -597,6 +666,14 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> { /// - When reporting the Place back to the Delegate, ensure that the UpvarId uses the enclosing /// closure as the DefId. fn walk_captures(&mut self, closure_expr: &hir::Expr<'_>) { + fn upvar_is_local_variable( + upvars: Option<&'tcx FxIndexMap>, + upvar_id: &hir::HirId, + body_owner_is_closure: bool, + ) -> bool { + upvars.map(|upvars| !upvars.contains_key(upvar_id)).unwrap_or(body_owner_is_closure) + } + debug!("walk_captures({:?})", closure_expr); let closure_def_id = self.tcx().hir().local_def_id(closure_expr.hir_id).to_def_id(); @@ -608,6 +685,46 @@ impl<'a, 'tcx> ExprUseVisitor<'a, 'tcx> { ty::Closure(..) | ty::Generator(..) ); + // If we have a nested closure, we want to include the fake reads present in the nested closure. + if let Some(fake_reads) = self.mc.typeck_results.closure_fake_reads.get(&closure_def_id) { + for (fake_read, cause, hir_id) in fake_reads.iter() { + match fake_read.base { + PlaceBase::Upvar(upvar_id) => { + if upvar_is_local_variable( + upvars, + &upvar_id.var_path.hir_id, + body_owner_is_closure, + ) { + // The nested closure might be fake reading the current (enclosing) closure's local variables. + // The only places we want to fake read before creating the parent closure are the ones that + // are not local to it/ defined by it. + // + // ```rust,ignore(cannot-test-this-because-pseduo-code) + // let v1 = (0, 1); + // let c = || { // fake reads: v1 + // let v2 = (0, 1); + // let e = || { // fake reads: v1, v2 + // let (_, t1) = v1; + // let (_, t2) = v2; + // } + // } + // ``` + // This check is performed when visiting the body of the outermost closure (`c`) and ensures + // that we don't add a fake read of v2 in c. + continue; + } + } + _ => { + bug!( + "Do not know how to get HirId out of Rvalue and StaticItem {:?}", + fake_read.base + ); + } + }; + self.delegate.fake_read(fake_read.clone(), *cause, *hir_id); + } + } + if let Some(min_captures) = self.mc.typeck_results.closure_min_captures.get(&closure_def_id) { for (var_hir_id, min_list) in min_captures.iter() { diff --git a/compiler/rustc_typeck/src/impl_wf_check.rs b/compiler/rustc_typeck/src/impl_wf_check.rs index 0bdcbaac0e..7713381e62 100644 --- a/compiler/rustc_typeck/src/impl_wf_check.rs +++ b/compiler/rustc_typeck/src/impl_wf_check.rs @@ -59,7 +59,7 @@ pub fn impl_wf_check(tcx: TyCtxt<'_>) { // but it's one that we must perform earlier than the rest of // WfCheck. for &module in tcx.hir().krate().modules.keys() { - tcx.ensure().check_mod_impl_wf(tcx.hir().local_def_id(module)); + tcx.ensure().check_mod_impl_wf(module); } } @@ -81,11 +81,10 @@ struct ImplWfCheck<'tcx> { impl ItemLikeVisitor<'tcx> for ImplWfCheck<'tcx> { fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { if let hir::ItemKind::Impl(ref impl_) = item.kind { - let impl_def_id = self.tcx.hir().local_def_id(item.hir_id); - enforce_impl_params_are_constrained(self.tcx, impl_def_id, impl_.items); + enforce_impl_params_are_constrained(self.tcx, item.def_id, impl_.items); enforce_impl_items_are_distinct(self.tcx, impl_.items); if self.min_specialization { - check_min_specialization(self.tcx, impl_def_id.to_def_id(), item.span); + check_min_specialization(self.tcx, item.def_id.to_def_id(), item.span); } } } @@ -131,7 +130,7 @@ fn enforce_impl_params_are_constrained( // Disallow unconstrained lifetimes, but only if they appear in assoc types. let lifetimes_in_associated_types: FxHashSet<_> = impl_item_refs .iter() - .map(|item_ref| tcx.hir().local_def_id(item_ref.id.hir_id)) + .map(|item_ref| item_ref.id.def_id) .flat_map(|def_id| { let item = tcx.associated_item(def_id); match item.kind { diff --git a/compiler/rustc_typeck/src/lib.rs b/compiler/rustc_typeck/src/lib.rs index fd44bafab6..88b47bf5b9 100644 --- a/compiler/rustc_typeck/src/lib.rs +++ b/compiler/rustc_typeck/src/lib.rs @@ -56,6 +56,7 @@ This API is completely unstable and subject to change. */ #![doc(html_root_url = "https://doc.rust-lang.org/nightly/nightly-rustc/")] +#![feature(bindings_after_at)] #![feature(bool_to_option)] #![feature(box_syntax)] #![feature(crate_visibility_modifier)] @@ -117,14 +118,19 @@ use astconv::AstConv; use bounds::Bounds; fn require_c_abi_if_c_variadic(tcx: TyCtxt<'_>, decl: &hir::FnDecl<'_>, abi: Abi, span: Span) { - if decl.c_variadic && !(abi == Abi::C || abi == Abi::Cdecl) { - let mut err = struct_span_err!( - tcx.sess, - span, - E0045, - "C-variadic function must have C or cdecl calling convention" - ); - err.span_label(span, "C-variadics require C or cdecl calling convention").emit(); + match (decl.c_variadic, abi) { + // The function has the correct calling convention, or isn't a "C-variadic" function. + (false, _) | (true, Abi::C { .. }) | (true, Abi::Cdecl) => {} + // The function is a "C-variadic" function with an incorrect calling convention. + (true, _) => { + let mut err = struct_span_err!( + tcx.sess, + span, + E0045, + "C-variadic function must have C or cdecl calling convention" + ); + err.span_label(span, "C-variadics require C or cdecl calling convention").emit(); + } } } @@ -136,7 +142,7 @@ fn require_same_types<'tcx>( ) -> bool { tcx.infer_ctxt().enter(|ref infcx| { let param_env = ty::ParamEnv::empty(); - let mut fulfill_cx = TraitEngine::new(infcx.tcx); + let mut fulfill_cx = >::new(infcx.tcx); match infcx.at(&cause, param_env).eq(expected, actual) { Ok(InferOk { obligations, .. }) => { fulfill_cx.register_predicate_obligations(infcx, obligations); @@ -200,7 +206,8 @@ fn check_main_fn_ty(tcx: TyCtxt<'_>, main_def_id: LocalDefId) { error = true; } - for attr in it.attrs { + let attrs = tcx.hir().attrs(main_id); + for attr in attrs { if tcx.sess.check_name(attr, sym::track_caller) { tcx.sess .struct_span_err( @@ -299,7 +306,8 @@ fn check_start_fn_ty(tcx: TyCtxt<'_>, start_def_id: LocalDefId) { error = true; } - for attr in it.attrs { + let attrs = tcx.hir().attrs(start_id); + for attr in attrs { if tcx.sess.check_name(attr, sym::track_caller) { tcx.sess .struct_span_err( @@ -368,7 +376,7 @@ pub fn check_crate(tcx: TyCtxt<'_>) -> Result<(), ErrorReported> { tcx.sess.track_errors(|| { tcx.sess.time("type_collecting", || { for &module in tcx.hir().krate().modules.keys() { - tcx.ensure().collect_mod_item_types(tcx.hir().local_def_id(module)); + tcx.ensure().collect_mod_item_types(module); } }); })?; @@ -400,7 +408,7 @@ pub fn check_crate(tcx: TyCtxt<'_>) -> Result<(), ErrorReported> { // NOTE: This is copy/pasted in librustdoc/core.rs and should be kept in sync. tcx.sess.time("item_types_checking", || { for &module in tcx.hir().krate().modules.keys() { - tcx.ensure().check_mod_item_types(tcx.hir().local_def_id(module)); + tcx.ensure().check_mod_item_types(module); } }); @@ -421,8 +429,7 @@ pub fn hir_ty_to_ty<'tcx>(tcx: TyCtxt<'tcx>, hir_ty: &hir::Ty<'_>) -> Ty<'tcx> { let env_node_id = tcx.hir().get_parent_item(hir_ty.hir_id); let env_def_id = tcx.hir().local_def_id(env_node_id); let item_cx = self::collect::ItemCtxt::new(tcx, env_def_id.to_def_id()); - - astconv::AstConv::ast_ty_to_ty(&item_cx, hir_ty) + item_cx.to_ty(hir_ty) } pub fn hir_trait_to_predicates<'tcx>( @@ -437,7 +444,7 @@ pub fn hir_trait_to_predicates<'tcx>( let env_def_id = tcx.hir().local_def_id(env_hir_id); let item_cx = self::collect::ItemCtxt::new(tcx, env_def_id.to_def_id()); let mut bounds = Bounds::default(); - let _ = AstConv::instantiate_poly_trait_ref_inner( + let _ = >::instantiate_poly_trait_ref_inner( &item_cx, hir_trait, DUMMY_SP, diff --git a/compiler/rustc_typeck/src/mem_categorization.rs b/compiler/rustc_typeck/src/mem_categorization.rs index fef52a3f87..14af11097c 100644 --- a/compiler/rustc_typeck/src/mem_categorization.rs +++ b/compiler/rustc_typeck/src/mem_categorization.rs @@ -303,7 +303,7 @@ impl<'a, 'tcx> MemCategorizationContext<'a, 'tcx> { let expr_ty = self.expr_ty(expr)?; match expr.kind { - hir::ExprKind::Unary(hir::UnOp::UnDeref, ref e_base) => { + hir::ExprKind::Unary(hir::UnOp::Deref, ref e_base) => { if self.typeck_results.is_method_call(expr) { self.cat_overloaded_place(expr, e_base) } else { diff --git a/compiler/rustc_typeck/src/outlives/implicit_infer.rs b/compiler/rustc_typeck/src/outlives/implicit_infer.rs index 02008e180b..6e6ecf6a22 100644 --- a/compiler/rustc_typeck/src/outlives/implicit_infer.rs +++ b/compiler/rustc_typeck/src/outlives/implicit_infer.rs @@ -2,7 +2,6 @@ use rustc_data_structures::fx::FxHashMap; use rustc_hir as hir; use rustc_hir::def_id::DefId; use rustc_hir::itemlikevisit::ItemLikeVisitor; -use rustc_hir::Node; use rustc_middle::ty::subst::{GenericArg, GenericArgKind, Subst}; use rustc_middle::ty::{self, Ty, TyCtxt}; use rustc_span::Span; @@ -53,16 +52,10 @@ pub struct InferVisitor<'cx, 'tcx> { impl<'cx, 'tcx> ItemLikeVisitor<'tcx> for InferVisitor<'cx, 'tcx> { fn visit_item(&mut self, item: &hir::Item<'_>) { - let item_did = self.tcx.hir().local_def_id(item.hir_id); + let item_did = item.def_id; debug!("InferVisitor::visit_item(item={:?})", item_did); - let hir_id = self.tcx.hir().local_def_id_to_hir_id(item_did); - let item = match self.tcx.hir().get(hir_id) { - Node::Item(item) => item, - _ => bug!(), - }; - let mut item_required_predicates = RequiredPredicates::default(); match item.kind { hir::ItemKind::Union(..) | hir::ItemKind::Enum(..) | hir::ItemKind::Struct(..) => { diff --git a/compiler/rustc_typeck/src/outlives/test.rs b/compiler/rustc_typeck/src/outlives/test.rs index 56d42f756c..d4bef0c409 100644 --- a/compiler/rustc_typeck/src/outlives/test.rs +++ b/compiler/rustc_typeck/src/outlives/test.rs @@ -14,12 +14,10 @@ struct OutlivesTest<'tcx> { impl ItemLikeVisitor<'tcx> for OutlivesTest<'tcx> { fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { - let item_def_id = self.tcx.hir().local_def_id(item.hir_id); - // For unit testing: check for a special "rustc_outlives" // attribute and report an error with various results if found. - if self.tcx.has_attr(item_def_id.to_def_id(), sym::rustc_outlives) { - let inferred_outlives_of = self.tcx.inferred_outlives_of(item_def_id); + if self.tcx.has_attr(item.def_id.to_def_id(), sym::rustc_outlives) { + let inferred_outlives_of = self.tcx.inferred_outlives_of(item.def_id); struct_span_err!(self.tcx.sess, item.span, E0640, "{:?}", inferred_outlives_of).emit(); } } diff --git a/compiler/rustc_typeck/src/variance/constraints.rs b/compiler/rustc_typeck/src/variance/constraints.rs index 339eb5f9af..f5355ea042 100644 --- a/compiler/rustc_typeck/src/variance/constraints.rs +++ b/compiler/rustc_typeck/src/variance/constraints.rs @@ -71,7 +71,7 @@ impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for ConstraintContext<'a, 'tcx> { fn visit_item(&mut self, item: &hir::Item<'_>) { match item.kind { hir::ItemKind::Struct(ref struct_def, _) | hir::ItemKind::Union(ref struct_def, _) => { - self.visit_node_helper(item.hir_id); + self.visit_node_helper(item.hir_id()); if let hir::VariantData::Tuple(..) = *struct_def { self.visit_node_helper(struct_def.ctor_hir_id().unwrap()); @@ -79,7 +79,7 @@ impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for ConstraintContext<'a, 'tcx> { } hir::ItemKind::Enum(ref enum_def, _) => { - self.visit_node_helper(item.hir_id); + self.visit_node_helper(item.hir_id()); for variant in enum_def.variants { if let hir::VariantData::Tuple(..) = variant.data { @@ -89,7 +89,7 @@ impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for ConstraintContext<'a, 'tcx> { } hir::ItemKind::Fn(..) => { - self.visit_node_helper(item.hir_id); + self.visit_node_helper(item.hir_id()); } _ => {} @@ -98,19 +98,19 @@ impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for ConstraintContext<'a, 'tcx> { fn visit_trait_item(&mut self, trait_item: &hir::TraitItem<'_>) { if let hir::TraitItemKind::Fn(..) = trait_item.kind { - self.visit_node_helper(trait_item.hir_id); + self.visit_node_helper(trait_item.hir_id()); } } fn visit_impl_item(&mut self, impl_item: &hir::ImplItem<'_>) { if let hir::ImplItemKind::Fn(..) = impl_item.kind { - self.visit_node_helper(impl_item.hir_id); + self.visit_node_helper(impl_item.hir_id()); } } fn visit_foreign_item(&mut self, foreign_item: &hir::ForeignItem<'_>) { if let hir::ForeignItemKind::Fn(..) = foreign_item.kind { - self.visit_node_helper(foreign_item.hir_id); + self.visit_node_helper(foreign_item.hir_id()); } } } @@ -207,7 +207,7 @@ impl<'a, 'tcx> ConstraintContext<'a, 'tcx> { } } - #[instrument(skip(self, current))] + #[instrument(level = "debug", skip(self, current))] fn add_constraints_from_invariant_substs( &mut self, current: &CurrentItem, diff --git a/compiler/rustc_typeck/src/variance/terms.rs b/compiler/rustc_typeck/src/variance/terms.rs index 3b2a1c24dd..5d5baf78d3 100644 --- a/compiler/rustc_typeck/src/variance/terms.rs +++ b/compiler/rustc_typeck/src/variance/terms.rs @@ -128,11 +128,11 @@ impl<'a, 'tcx> TermsContext<'a, 'tcx> { impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for TermsContext<'a, 'tcx> { fn visit_item(&mut self, item: &hir::Item<'_>) { - debug!("add_inferreds for item {}", self.tcx.hir().node_to_string(item.hir_id)); + debug!("add_inferreds for item {}", self.tcx.hir().node_to_string(item.hir_id())); match item.kind { hir::ItemKind::Struct(ref struct_def, _) | hir::ItemKind::Union(ref struct_def, _) => { - self.add_inferreds_for_item(item.hir_id); + self.add_inferreds_for_item(item.hir_id()); if let hir::VariantData::Tuple(..) = *struct_def { self.add_inferreds_for_item(struct_def.ctor_hir_id().unwrap()); @@ -140,7 +140,7 @@ impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for TermsContext<'a, 'tcx> { } hir::ItemKind::Enum(ref enum_def, _) => { - self.add_inferreds_for_item(item.hir_id); + self.add_inferreds_for_item(item.hir_id()); for variant in enum_def.variants { if let hir::VariantData::Tuple(..) = variant.data { @@ -150,7 +150,7 @@ impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for TermsContext<'a, 'tcx> { } hir::ItemKind::Fn(..) => { - self.add_inferreds_for_item(item.hir_id); + self.add_inferreds_for_item(item.hir_id()); } _ => {} @@ -159,19 +159,19 @@ impl<'a, 'tcx, 'v> ItemLikeVisitor<'v> for TermsContext<'a, 'tcx> { fn visit_trait_item(&mut self, trait_item: &hir::TraitItem<'_>) { if let hir::TraitItemKind::Fn(..) = trait_item.kind { - self.add_inferreds_for_item(trait_item.hir_id); + self.add_inferreds_for_item(trait_item.hir_id()); } } fn visit_impl_item(&mut self, impl_item: &hir::ImplItem<'_>) { if let hir::ImplItemKind::Fn(..) = impl_item.kind { - self.add_inferreds_for_item(impl_item.hir_id); + self.add_inferreds_for_item(impl_item.hir_id()); } } fn visit_foreign_item(&mut self, foreign_item: &hir::ForeignItem<'_>) { if let hir::ForeignItemKind::Fn(..) = foreign_item.kind { - self.add_inferreds_for_item(foreign_item.hir_id); + self.add_inferreds_for_item(foreign_item.hir_id()); } } } diff --git a/compiler/rustc_typeck/src/variance/test.rs b/compiler/rustc_typeck/src/variance/test.rs index d6e43b6d66..2a0d950c87 100644 --- a/compiler/rustc_typeck/src/variance/test.rs +++ b/compiler/rustc_typeck/src/variance/test.rs @@ -14,12 +14,10 @@ struct VarianceTest<'tcx> { impl ItemLikeVisitor<'tcx> for VarianceTest<'tcx> { fn visit_item(&mut self, item: &'tcx hir::Item<'tcx>) { - let item_def_id = self.tcx.hir().local_def_id(item.hir_id); - // For unit testing: check for a special "rustc_variance" // attribute and report an error with various results if found. - if self.tcx.has_attr(item_def_id.to_def_id(), sym::rustc_variance) { - let variances_of = self.tcx.variances_of(item_def_id); + if self.tcx.has_attr(item.def_id.to_def_id(), sym::rustc_variance) { + let variances_of = self.tcx.variances_of(item.def_id); struct_span_err!(self.tcx.sess, item.span, E0208, "{:?}", variances_of).emit(); } } diff --git a/config.toml.example b/config.toml.example index 55b20adabd..ee06e1bd0b 100644 --- a/config.toml.example +++ b/config.toml.example @@ -208,6 +208,11 @@ changelog-seen = 2 # documentation. #docs = true +# Flag to specify whether CSS, JavaScript, and HTML are minified when +# docs are generated. JSON is always minified, because it's enormous, +# and generated in already-minified form from the beginning. +#docs-minification = true + # Indicate whether the compiler should be documented in addition to the standard # library and facade crates. #compiler-docs = false @@ -290,6 +295,12 @@ changelog-seen = 2 # tracking over time) #print-step-timings = false +# Print out resource usage data for each rustbuild step, as defined by the Unix +# struct rusage. (Note that this setting is completely unstable: the data it +# captures, what platforms it supports, the format of its associated output, and +# this setting's very existence, are all subject to change.) +#print-step-rusage = false + # ============================================================================= # General install configuration options # ============================================================================= @@ -358,6 +369,12 @@ changelog-seen = 2 # #debug = false +# Whether to download the stage 1 and 2 compilers from CI. +# This is mostly useful for tools; if you have changes to `compiler/` they will be ignored. +# +# FIXME: currently, this also uses the downloaded compiler for stage0, but that causes unnecessary rebuilds. +#download-rustc = false + # Number of codegen units to use for each compiler invocation. A value of 0 # means "the number of cores on this machine", and 1+ is passed through to the # compiler. @@ -625,7 +642,9 @@ changelog-seen = 2 # The full path to the musl libdir. #musl-libdir = musl-root/lib -# The root location of the `wasm32-wasi` sysroot. +# The root location of the `wasm32-wasi` sysroot. Only used for the +# `wasm32-wasi` target. If you are building wasm32-wasi target, make sure to +# create a `[target.wasm32-wasi]` section and move this field there. #wasi-root = "..." # Used in testing for configuring where the QEMU images are located, you diff --git a/git-commit-hash b/git-commit-hash index b5845acd91..29604f16e7 100644 --- a/git-commit-hash +++ b/git-commit-hash @@ -1 +1 @@ -2fd73fabe469357a12c2c974c140f67e7cdd76d0 \ No newline at end of file +215738137bcbef2c3637a5bd290ef612cffe6ba5 \ No newline at end of file diff --git a/library/alloc/benches/btree/map.rs b/library/alloc/benches/btree/map.rs index 7c2e5694a6..21a0fb844e 100644 --- a/library/alloc/benches/btree/map.rs +++ b/library/alloc/benches/btree/map.rs @@ -296,11 +296,6 @@ fn fat_val_map(n: usize) -> BTreeMap { (0..n).map(|i| (i, [i; FAT])).collect::>() } -// The returned map has large keys and values. -fn fat_map(n: usize) -> BTreeMap<[usize; FAT], [usize; FAT]> { - (0..n).map(|i| ([i; FAT], [i; FAT])).collect::>() -} - #[bench] pub fn clone_slim_100(b: &mut Bencher) { let src = slim_map(100); @@ -513,74 +508,3 @@ pub fn clone_fat_val_100_and_remove_half(b: &mut Bencher) { map }) } - -#[bench] -pub fn clone_fat_100(b: &mut Bencher) { - let src = fat_map(100); - b.iter(|| src.clone()) -} - -#[bench] -pub fn clone_fat_100_and_clear(b: &mut Bencher) { - let src = fat_map(100); - b.iter(|| src.clone().clear()) -} - -#[bench] -pub fn clone_fat_100_and_drain_all(b: &mut Bencher) { - let src = fat_map(100); - b.iter(|| src.clone().drain_filter(|_, _| true).count()) -} - -#[bench] -pub fn clone_fat_100_and_drain_half(b: &mut Bencher) { - let src = fat_map(100); - b.iter(|| { - let mut map = src.clone(); - assert_eq!(map.drain_filter(|i, _| i[0] % 2 == 0).count(), 100 / 2); - assert_eq!(map.len(), 100 / 2); - }) -} - -#[bench] -pub fn clone_fat_100_and_into_iter(b: &mut Bencher) { - let src = fat_map(100); - b.iter(|| src.clone().into_iter().count()) -} - -#[bench] -pub fn clone_fat_100_and_pop_all(b: &mut Bencher) { - let src = fat_map(100); - b.iter(|| { - let mut map = src.clone(); - while map.pop_first().is_some() {} - map - }); -} - -#[bench] -pub fn clone_fat_100_and_remove_all(b: &mut Bencher) { - let src = fat_map(100); - b.iter(|| { - let mut map = src.clone(); - while let Some(elt) = map.iter().map(|(&i, _)| i).next() { - let v = map.remove(&elt); - debug_assert!(v.is_some()); - } - map - }); -} - -#[bench] -pub fn clone_fat_100_and_remove_half(b: &mut Bencher) { - let src = fat_map(100); - b.iter(|| { - let mut map = src.clone(); - for i in (0..100).step_by(2) { - let v = map.remove(&[i; FAT]); - debug_assert!(v.is_some()); - } - assert_eq!(map.len(), 100 / 2); - map - }) -} diff --git a/library/alloc/benches/lib.rs b/library/alloc/benches/lib.rs index 32edb86d10..38a8f65f16 100644 --- a/library/alloc/benches/lib.rs +++ b/library/alloc/benches/lib.rs @@ -4,6 +4,7 @@ #![feature(btree_drain_filter)] #![feature(map_first_last)] #![feature(repr_simd)] +#![feature(slice_partition_dedup)] #![feature(test)] extern crate test; diff --git a/library/alloc/benches/vec.rs b/library/alloc/benches/vec.rs index 89893b6209..73eb353f6e 100644 --- a/library/alloc/benches/vec.rs +++ b/library/alloc/benches/vec.rs @@ -671,3 +671,92 @@ fn bench_map_fast(b: &mut Bencher) { let data = black_box([(0, 0); LEN]); b.iter(|| map_fast(&data)); } + +fn random_sorted_fill(mut seed: u32, buf: &mut [u32]) { + let mask = if buf.len() < 8192 { + 0xFF + } else if buf.len() < 200_000 { + 0xFFFF + } else { + 0xFFFF_FFFF + }; + + for item in buf.iter_mut() { + seed ^= seed << 13; + seed ^= seed >> 17; + seed ^= seed << 5; + + *item = seed & mask; + } + + buf.sort(); +} + +fn bench_vec_dedup_old(b: &mut Bencher, sz: usize) { + let mut template = vec![0u32; sz]; + b.bytes = std::mem::size_of_val(template.as_slice()) as u64; + random_sorted_fill(0x43, &mut template); + + let mut vec = template.clone(); + b.iter(|| { + let len = { + let (dedup, _) = vec.partition_dedup(); + dedup.len() + }; + vec.truncate(len); + + black_box(vec.first()); + vec.clear(); + vec.extend_from_slice(&template); + }); +} + +fn bench_vec_dedup_new(b: &mut Bencher, sz: usize) { + let mut template = vec![0u32; sz]; + b.bytes = std::mem::size_of_val(template.as_slice()) as u64; + random_sorted_fill(0x43, &mut template); + + let mut vec = template.clone(); + b.iter(|| { + vec.dedup(); + black_box(vec.first()); + vec.clear(); + vec.extend_from_slice(&template); + }); +} + +#[bench] +fn bench_dedup_old_100(b: &mut Bencher) { + bench_vec_dedup_old(b, 100); +} +#[bench] +fn bench_dedup_new_100(b: &mut Bencher) { + bench_vec_dedup_new(b, 100); +} + +#[bench] +fn bench_dedup_old_1000(b: &mut Bencher) { + bench_vec_dedup_old(b, 1000); +} +#[bench] +fn bench_dedup_new_1000(b: &mut Bencher) { + bench_vec_dedup_new(b, 1000); +} + +#[bench] +fn bench_dedup_old_10000(b: &mut Bencher) { + bench_vec_dedup_old(b, 10000); +} +#[bench] +fn bench_dedup_new_10000(b: &mut Bencher) { + bench_vec_dedup_new(b, 10000); +} + +#[bench] +fn bench_dedup_old_100000(b: &mut Bencher) { + bench_vec_dedup_old(b, 100000); +} +#[bench] +fn bench_dedup_new_100000(b: &mut Bencher) { + bench_vec_dedup_new(b, 100000); +} diff --git a/library/alloc/src/borrow.rs b/library/alloc/src/borrow.rs index adf996fc78..bdb2d67347 100644 --- a/library/alloc/src/borrow.rs +++ b/library/alloc/src/borrow.rs @@ -31,6 +31,7 @@ where /// implementing the `Clone` trait. But `Clone` works only for going from `&T` /// to `T`. The `ToOwned` trait generalizes `Clone` to construct owned data /// from any borrow of a given type. +#[cfg_attr(not(test), rustc_diagnostic_item = "ToOwned")] #[stable(feature = "rust1", since = "1.0.0")] pub trait ToOwned { /// The resulting type after obtaining ownership. diff --git a/library/alloc/src/boxed.rs b/library/alloc/src/boxed.rs index 949079e5b6..0403390572 100644 --- a/library/alloc/src/boxed.rs +++ b/library/alloc/src/boxed.rs @@ -99,13 +99,11 @@ //! pub struct Foo; //! //! #[no_mangle] -//! #[allow(improper_ctypes_definitions)] //! pub extern "C" fn foo_new() -> Box { //! Box::new(Foo) //! } //! //! #[no_mangle] -//! #[allow(improper_ctypes_definitions)] //! pub extern "C" fn foo_delete(_: Option>) {} //! ``` //! @@ -390,7 +388,12 @@ impl Box { // #[unstable(feature = "new_uninit", issue = "63291")] pub fn new_uninit_in(alloc: A) -> Box, A> { let layout = Layout::new::>(); - Box::try_new_uninit_in(alloc).unwrap_or_else(|_| handle_alloc_error(layout)) + // NOTE: Prefer match over unwrap_or_else since closure sometimes not inlineable. + // That would make code size bigger. + match Box::try_new_uninit_in(alloc) { + Ok(m) => m, + Err(_) => handle_alloc_error(layout), + } } /// Constructs a new box with uninitialized contents in the provided allocator, @@ -447,7 +450,12 @@ impl Box { // #[unstable(feature = "new_uninit", issue = "63291")] pub fn new_zeroed_in(alloc: A) -> Box, A> { let layout = Layout::new::>(); - Box::try_new_zeroed_in(alloc).unwrap_or_else(|_| handle_alloc_error(layout)) + // NOTE: Prefer match over unwrap_or_else since closure sometimes not inlineable. + // That would make code size bigger. + match Box::try_new_zeroed_in(alloc) { + Ok(m) => m, + Err(_) => handle_alloc_error(layout), + } } /// Constructs a new `Box` with uninitialized contents, with the memory @@ -499,6 +507,23 @@ impl Box { let (raw, alloc) = Box::into_raw_with_allocator(boxed); unsafe { Box::from_raw_in(raw as *mut [T; 1], alloc) } } + + /// Consumes the `Box`, returning the wrapped value. + /// + /// # Examples + /// + /// ``` + /// #![feature(box_into_inner)] + /// + /// let c = Box::new(5); + /// + /// assert_eq!(Box::into_inner(c), 5); + /// ``` + #[unstable(feature = "box_into_inner", issue = "80437")] + #[inline] + pub fn into_inner(boxed: Self) -> T { + *boxed + } } impl Box<[T]> { diff --git a/library/alloc/src/collections/binary_heap.rs b/library/alloc/src/collections/binary_heap.rs index 8a36b2af76..b5e66d37ab 100644 --- a/library/alloc/src/collections/binary_heap.rs +++ b/library/alloc/src/collections/binary_heap.rs @@ -247,6 +247,7 @@ use super::SpecExtend; /// [peek]: BinaryHeap::peek /// [peek\_mut]: BinaryHeap::peek_mut #[stable(feature = "rust1", since = "1.0.0")] +#[cfg_attr(not(test), rustc_diagnostic_item = "BinaryHeap")] pub struct BinaryHeap { data: Vec, } @@ -275,7 +276,8 @@ impl fmt::Debug for PeekMut<'_, T> { impl Drop for PeekMut<'_, T> { fn drop(&mut self) { if self.sift { - self.heap.sift_down(0); + // SAFETY: PeekMut is only instantiated for non-empty heaps. + unsafe { self.heap.sift_down(0) }; } } } @@ -431,7 +433,8 @@ impl BinaryHeap { self.data.pop().map(|mut item| { if !self.is_empty() { swap(&mut item, &mut self.data[0]); - self.sift_down_to_bottom(0); + // SAFETY: !self.is_empty() means that self.len() > 0 + unsafe { self.sift_down_to_bottom(0) }; } item }) @@ -473,7 +476,9 @@ impl BinaryHeap { pub fn push(&mut self, item: T) { let old_len = self.len(); self.data.push(item); - self.sift_up(0, old_len); + // SAFETY: Since we pushed a new item it means that + // old_len = self.len() - 1 < self.len() + unsafe { self.sift_up(0, old_len) }; } /// Consumes the `BinaryHeap` and returns a vector in sorted @@ -506,7 +511,10 @@ impl BinaryHeap { let ptr = self.data.as_mut_ptr(); ptr::swap(ptr, ptr.add(end)); } - self.sift_down_range(0, end); + // SAFETY: `end` goes from `self.len() - 1` to 1 (both included) so: + // 0 < 1 <= end <= self.len() - 1 < self.len() + // Which means 0 < end and end < self.len(). + unsafe { self.sift_down_range(0, end) }; } self.into_vec() } @@ -519,47 +527,84 @@ impl BinaryHeap { // the hole is filled back at the end of its scope, even on panic. // Using a hole reduces the constant factor compared to using swaps, // which involves twice as many moves. - fn sift_up(&mut self, start: usize, pos: usize) -> usize { - unsafe { - // Take out the value at `pos` and create a hole. - let mut hole = Hole::new(&mut self.data, pos); - - while hole.pos() > start { - let parent = (hole.pos() - 1) / 2; - if hole.element() <= hole.get(parent) { - break; - } - hole.move_to(parent); + + /// # Safety + /// + /// The caller must guarantee that `pos < self.len()`. + unsafe fn sift_up(&mut self, start: usize, pos: usize) -> usize { + // Take out the value at `pos` and create a hole. + // SAFETY: The caller guarantees that pos < self.len() + let mut hole = unsafe { Hole::new(&mut self.data, pos) }; + + while hole.pos() > start { + let parent = (hole.pos() - 1) / 2; + + // SAFETY: hole.pos() > start >= 0, which means hole.pos() > 0 + // and so hole.pos() - 1 can't underflow. + // This guarantees that parent < hole.pos() so + // it's a valid index and also != hole.pos(). + if hole.element() <= unsafe { hole.get(parent) } { + break; } - hole.pos() + + // SAFETY: Same as above + unsafe { hole.move_to(parent) }; } + + hole.pos() } /// Take an element at `pos` and move it down the heap, /// while its children are larger. - fn sift_down_range(&mut self, pos: usize, end: usize) { - unsafe { - let mut hole = Hole::new(&mut self.data, pos); - let mut child = 2 * pos + 1; - while child < end - 1 { - // compare with the greater of the two children - child += (hole.get(child) <= hole.get(child + 1)) as usize; - // if we are already in order, stop. - if hole.element() >= hole.get(child) { - return; - } - hole.move_to(child); - child = 2 * hole.pos() + 1; - } - if child == end - 1 && hole.element() < hole.get(child) { - hole.move_to(child); + /// + /// # Safety + /// + /// The caller must guarantee that `pos < end <= self.len()`. + unsafe fn sift_down_range(&mut self, pos: usize, end: usize) { + // SAFETY: The caller guarantees that pos < end <= self.len(). + let mut hole = unsafe { Hole::new(&mut self.data, pos) }; + let mut child = 2 * hole.pos() + 1; + + // Loop invariant: child == 2 * hole.pos() + 1. + while child <= end.saturating_sub(2) { + // compare with the greater of the two children + // SAFETY: child < end - 1 < self.len() and + // child + 1 < end <= self.len(), so they're valid indexes. + // child == 2 * hole.pos() + 1 != hole.pos() and + // child + 1 == 2 * hole.pos() + 2 != hole.pos(). + // FIXME: 2 * hole.pos() + 1 or 2 * hole.pos() + 2 could overflow + // if T is a ZST + child += unsafe { hole.get(child) <= hole.get(child + 1) } as usize; + + // if we are already in order, stop. + // SAFETY: child is now either the old child or the old child+1 + // We already proven that both are < self.len() and != hole.pos() + if hole.element() >= unsafe { hole.get(child) } { + return; } + + // SAFETY: same as above. + unsafe { hole.move_to(child) }; + child = 2 * hole.pos() + 1; + } + + // SAFETY: && short circuit, which means that in the + // second condition it's already true that child == end - 1 < self.len(). + if child == end - 1 && hole.element() < unsafe { hole.get(child) } { + // SAFETY: child is already proven to be a valid index and + // child == 2 * hole.pos() + 1 != hole.pos(). + unsafe { hole.move_to(child) }; } } - fn sift_down(&mut self, pos: usize) { + /// # Safety + /// + /// The caller must guarantee that `pos < self.len()`. + unsafe fn sift_down(&mut self, pos: usize) { let len = self.len(); - self.sift_down_range(pos, len); + // SAFETY: pos < len is guaranteed by the caller and + // obviously len = self.len() <= self.len(). + unsafe { self.sift_down_range(pos, len) }; } /// Take an element at `pos` and move it all the way down the heap, @@ -567,30 +612,54 @@ impl BinaryHeap { /// /// Note: This is faster when the element is known to be large / should /// be closer to the bottom. - fn sift_down_to_bottom(&mut self, mut pos: usize) { + /// + /// # Safety + /// + /// The caller must guarantee that `pos < self.len()`. + unsafe fn sift_down_to_bottom(&mut self, mut pos: usize) { let end = self.len(); let start = pos; - unsafe { - let mut hole = Hole::new(&mut self.data, pos); - let mut child = 2 * pos + 1; - while child < end - 1 { - child += (hole.get(child) <= hole.get(child + 1)) as usize; - hole.move_to(child); - child = 2 * hole.pos() + 1; - } - if child == end - 1 { - hole.move_to(child); - } - pos = hole.pos; + + // SAFETY: The caller guarantees that pos < self.len(). + let mut hole = unsafe { Hole::new(&mut self.data, pos) }; + let mut child = 2 * hole.pos() + 1; + + // Loop invariant: child == 2 * hole.pos() + 1. + while child <= end.saturating_sub(2) { + // SAFETY: child < end - 1 < self.len() and + // child + 1 < end <= self.len(), so they're valid indexes. + // child == 2 * hole.pos() + 1 != hole.pos() and + // child + 1 == 2 * hole.pos() + 2 != hole.pos(). + // FIXME: 2 * hole.pos() + 1 or 2 * hole.pos() + 2 could overflow + // if T is a ZST + child += unsafe { hole.get(child) <= hole.get(child + 1) } as usize; + + // SAFETY: Same as above + unsafe { hole.move_to(child) }; + child = 2 * hole.pos() + 1; } - self.sift_up(start, pos); + + if child == end - 1 { + // SAFETY: child == end - 1 < self.len(), so it's a valid index + // and child == 2 * hole.pos() + 1 != hole.pos(). + unsafe { hole.move_to(child) }; + } + pos = hole.pos(); + drop(hole); + + // SAFETY: pos is the position in the hole and was already proven + // to be a valid index. + unsafe { self.sift_up(start, pos) }; } fn rebuild(&mut self) { let mut n = self.len() / 2; while n > 0 { n -= 1; - self.sift_down(n); + // SAFETY: n starts from self.len() / 2 and goes down to 0. + // The only case when !(n < self.len()) is if + // self.len() == 0, but it's ruled out by the loop condition. + unsafe { self.sift_down(n) }; } } diff --git a/library/alloc/src/collections/btree/append.rs b/library/alloc/src/collections/btree/append.rs index 1d6488dd2d..a30a21db53 100644 --- a/library/alloc/src/collections/btree/append.rs +++ b/library/alloc/src/collections/btree/append.rs @@ -1,6 +1,5 @@ -use super::map::MIN_LEN; use super::merge_iter::MergeIterInner; -use super::node::{self, ForceResult::*, Root}; +use super::node::{self, Root}; use core::iter::FusedIterator; impl Root { @@ -83,26 +82,6 @@ impl Root { } self.fix_right_border_of_plentiful(); } - - /// Stock up any underfull nodes on the right border of the tree. - /// The other nodes, those that are not the root nor a rightmost edge, - /// must have MIN_LEN elements to spare. - fn fix_right_border_of_plentiful(&mut self) { - let mut cur_node = self.borrow_mut(); - while let Internal(internal) = cur_node.force() { - // Check if right-most child is underfull. - let mut last_kv = internal.last_kv().consider_for_balancing(); - debug_assert!(last_kv.left_child_len() >= MIN_LEN * 2); - let right_child_len = last_kv.right_child_len(); - if right_child_len < MIN_LEN { - // We need to steal. - last_kv.bulk_steal_left(MIN_LEN - right_child_len); - } - - // Go further down. - cur_node = last_kv.into_right_child(); - } - } } // An iterator for merging two sorted sequences into one diff --git a/library/alloc/src/collections/btree/fix.rs b/library/alloc/src/collections/btree/fix.rs new file mode 100644 index 0000000000..af87a9b956 --- /dev/null +++ b/library/alloc/src/collections/btree/fix.rs @@ -0,0 +1,171 @@ +use super::map::MIN_LEN; +use super::node::{marker, ForceResult::*, Handle, LeftOrRight::*, NodeRef, Root}; + +impl<'a, K: 'a, V: 'a> NodeRef, K, V, marker::LeafOrInternal> { + /// Stocks up a possibly underfull node by merging with or stealing from a + /// sibling. If succesful but at the cost of shrinking the parent node, + /// returns that shrunk parent node. Returns an `Err` if the node is + /// an empty root. + fn fix_node_through_parent( + self, + ) -> Result, K, V, marker::Internal>>, Self> { + let len = self.len(); + if len >= MIN_LEN { + Ok(None) + } else { + match self.choose_parent_kv() { + Ok(Left(mut left_parent_kv)) => { + if left_parent_kv.can_merge() { + let parent = left_parent_kv.merge_tracking_parent(); + Ok(Some(parent)) + } else { + left_parent_kv.bulk_steal_left(MIN_LEN - len); + Ok(None) + } + } + Ok(Right(mut right_parent_kv)) => { + if right_parent_kv.can_merge() { + let parent = right_parent_kv.merge_tracking_parent(); + Ok(Some(parent)) + } else { + right_parent_kv.bulk_steal_right(MIN_LEN - len); + Ok(None) + } + } + Err(root) => { + if len > 0 { + Ok(None) + } else { + Err(root) + } + } + } + } + } +} + +impl<'a, K: 'a, V: 'a> NodeRef, K, V, marker::LeafOrInternal> { + /// Stocks up a possibly underfull node, and if that causes its parent node + /// to shrink, stocks up the parent, recursively. + /// Returns `true` if it fixed the tree, `false` if it couldn't because the + /// root node became empty. + /// + /// This method does not expect ancestors to already be underfull upon entry + /// and panics if it encounters an empty ancestor. + pub fn fix_node_and_affected_ancestors(mut self) -> bool { + loop { + match self.fix_node_through_parent() { + Ok(Some(parent)) => self = parent.forget_type(), + Ok(None) => return true, + Err(_) => return false, + } + } + } +} + +impl Root { + /// Removes empty levels on the top, but keeps an empty leaf if the entire tree is empty. + pub fn fix_top(&mut self) { + while self.height() > 0 && self.len() == 0 { + self.pop_internal_level(); + } + } + + /// Stocks up or merge away any underfull nodes on the right border of the + /// tree. The other nodes, those that are not the root nor a rightmost edge, + /// must already have at least MIN_LEN elements. + pub fn fix_right_border(&mut self) { + self.fix_top(); + if self.len() > 0 { + self.borrow_mut().last_kv().fix_right_border_of_right_edge(); + self.fix_top(); + } + } + + /// The symmetric clone of `fix_right_border`. + pub fn fix_left_border(&mut self) { + self.fix_top(); + if self.len() > 0 { + self.borrow_mut().first_kv().fix_left_border_of_left_edge(); + self.fix_top(); + } + } + + /// Stock up any underfull nodes on the right border of the tree. + /// The other nodes, those that are not the root nor a rightmost edge, + /// must be prepared to have up to MIN_LEN elements stolen. + pub fn fix_right_border_of_plentiful(&mut self) { + let mut cur_node = self.borrow_mut(); + while let Internal(internal) = cur_node.force() { + // Check if right-most child is underfull. + let mut last_kv = internal.last_kv().consider_for_balancing(); + debug_assert!(last_kv.left_child_len() >= MIN_LEN * 2); + let right_child_len = last_kv.right_child_len(); + if right_child_len < MIN_LEN { + // We need to steal. + last_kv.bulk_steal_left(MIN_LEN - right_child_len); + } + + // Go further down. + cur_node = last_kv.into_right_child(); + } + } +} + +impl<'a, K: 'a, V: 'a> Handle, K, V, marker::LeafOrInternal>, marker::KV> { + fn fix_left_border_of_left_edge(mut self) { + while let Internal(internal_kv) = self.force() { + self = internal_kv.fix_left_child().first_kv(); + debug_assert!(self.reborrow().into_node().len() > MIN_LEN); + } + } + + fn fix_right_border_of_right_edge(mut self) { + while let Internal(internal_kv) = self.force() { + self = internal_kv.fix_right_child().last_kv(); + debug_assert!(self.reborrow().into_node().len() > MIN_LEN); + } + } +} + +impl<'a, K: 'a, V: 'a> Handle, K, V, marker::Internal>, marker::KV> { + /// Stocks up the left child, assuming the right child isn't underfull, and + /// provisions an extra element to allow merging its children in turn + /// without becoming underfull. + /// Returns the left child. + fn fix_left_child(self) -> NodeRef, K, V, marker::LeafOrInternal> { + let mut internal_kv = self.consider_for_balancing(); + let left_len = internal_kv.left_child_len(); + debug_assert!(internal_kv.right_child_len() >= MIN_LEN); + if internal_kv.can_merge() { + internal_kv.merge_tracking_child() + } else { + // `MIN_LEN + 1` to avoid readjust if merge happens on the next level. + let count = (MIN_LEN + 1).saturating_sub(left_len); + if count > 0 { + internal_kv.bulk_steal_right(count); + } + internal_kv.into_left_child() + } + } + + /// Stocks up the right child, assuming the left child isn't underfull, and + /// provisions an extra element to allow merging its children in turn + /// without becoming underfull. + /// Returns wherever the right child ended up. + fn fix_right_child(self) -> NodeRef, K, V, marker::LeafOrInternal> { + let mut internal_kv = self.consider_for_balancing(); + let right_len = internal_kv.right_child_len(); + debug_assert!(internal_kv.left_child_len() >= MIN_LEN); + if internal_kv.can_merge() { + internal_kv.merge_tracking_child() + } else { + // `MIN_LEN + 1` to avoid readjust if merge happens on the next level. + let count = (MIN_LEN + 1).saturating_sub(right_len); + if count > 0 { + internal_kv.bulk_steal_left(count); + } + internal_kv.into_right_child() + } + } +} diff --git a/library/alloc/src/collections/btree/map.rs b/library/alloc/src/collections/btree/map.rs index 946267d17c..a0dbb28925 100644 --- a/library/alloc/src/collections/btree/map.rs +++ b/library/alloc/src/collections/btree/map.rs @@ -9,19 +9,27 @@ use core::ops::{Index, RangeBounds}; use core::ptr; use super::borrow::DormantMutRef; +use super::navigate::LeafRange; use super::node::{self, marker, ForceResult::*, Handle, NodeRef, Root}; use super::search::SearchResult::*; -use super::unwrap_unchecked; mod entry; -pub use entry::{Entry, OccupiedEntry, VacantEntry}; +pub use entry::{Entry, OccupiedEntry, OccupiedError, VacantEntry}; use Entry::*; /// Minimum number of elements in nodes that are not a root. /// We might temporarily have fewer elements during methods. pub(super) const MIN_LEN: usize = node::MIN_LEN_AFTER_SPLIT; -/// A map based on a B-Tree. +// A tree in a `BTreeMap` is a tree in the `node` module with additional invariants: +// - Keys must appear in ascending order (according to the key's type). +// - If the root node is internal, it must contain at least 1 element. +// - Every non-root node contains at least MIN_LEN elements. +// +// An empty map may be represented both by the absence of a root node or by a +// root node that is an empty leaf. + +/// A map based on a [B-Tree]. /// /// B-Trees represent a fundamental compromise between cache-efficiency and actually minimizing /// the amount of work performed in a search. In theory, a binary search tree (BST) is the optimal @@ -55,6 +63,7 @@ pub(super) const MIN_LEN: usize = node::MIN_LEN_AFTER_SPLIT; /// undefined behavior. This could include panics, incorrect results, aborts, memory leaks, and /// non-termination. /// +/// [B-Tree]: https://en.wikipedia.org/wiki/B-tree /// [`Cell`]: core::cell::Cell /// [`RefCell`]: core::cell::RefCell /// @@ -130,6 +139,7 @@ pub(super) const MIN_LEN: usize = node::MIN_LEN_AFTER_SPLIT; /// *stat += random_stat_buff(); /// ``` #[stable(feature = "rust1", since = "1.0.0")] +#[cfg_attr(not(test), rustc_diagnostic_item = "BTreeMap")] pub struct BTreeMap { root: Option>, length: usize, @@ -138,8 +148,8 @@ pub struct BTreeMap { #[stable(feature = "btree_drop", since = "1.7.0")] unsafe impl<#[may_dangle] K, #[may_dangle] V> Drop for BTreeMap { fn drop(&mut self) { - unsafe { - drop(ptr::read(self).into_iter()); + if let Some(root) = self.root.take() { + Dropper { front: root.into_dying().first_leaf_edge(), remaining_length: self.length }; } } } @@ -300,8 +310,7 @@ pub struct IterMut<'a, K: 'a, V: 'a> { /// [`into_iter`]: IntoIterator::into_iter #[stable(feature = "rust1", since = "1.0.0")] pub struct IntoIter { - front: Option, marker::Edge>>, - back: Option, marker::Edge>>, + range: LeafRange, length: usize, } @@ -309,11 +318,7 @@ impl IntoIter { /// Returns an iterator of references over the remaining items. #[inline] pub(super) fn iter(&self) -> Iter<'_, K, V> { - let range = Range { - front: self.front.as_ref().map(|f| f.reborrow()), - back: self.back.as_ref().map(|b| b.reborrow()), - }; - + let range = Range { inner: self.range.reborrow() }; Iter { range: range, length: self.length } } } @@ -325,6 +330,14 @@ impl fmt::Debug for IntoIter { } } +/// A simplified version of `IntoIter` that is not double-ended and has only one +/// purpose: to drop the remainder of an `IntoIter`. Therefore it also serves to +/// drop an entire tree without the need to first look up a `back` leaf edge. +struct Dropper { + front: Handle, marker::Edge>, + remaining_length: usize, +} + /// An iterator over the keys of a `BTreeMap`. /// /// This `struct` is created by the [`keys`] method on [`BTreeMap`]. See its @@ -423,8 +436,7 @@ impl fmt::Debug for IntoValues { /// [`range`]: BTreeMap::range #[stable(feature = "btree_range", since = "1.17.0")] pub struct Range<'a, K: 'a, V: 'a> { - front: Option, K, V, marker::Leaf>, marker::Edge>>, - back: Option, K, V, marker::Leaf>, marker::Edge>>, + inner: LeafRange, K, V>, } #[stable(feature = "collection_debug", since = "1.17.0")] @@ -442,8 +454,7 @@ impl fmt::Debug for Range<'_, K, V> { /// [`range_mut`]: BTreeMap::range_mut #[stable(feature = "btree_range", since = "1.17.0")] pub struct RangeMut<'a, K: 'a, V: 'a> { - front: Option, K, V, marker::Leaf>, marker::Edge>>, - back: Option, K, V, marker::Leaf>, marker::Edge>>, + inner: LeafRange, K, V>, // Be invariant in `K` and `V` _marker: PhantomData<&'a mut (K, V)>, @@ -452,10 +463,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.as_ref().map(|f| f.reborrow()), - back: self.back.as_ref().map(|b| b.reborrow()), - }; + let range = Range { inner: self.inner.reborrow() }; f.debug_list().entries(range).finish() } } @@ -501,11 +509,8 @@ impl BTreeMap { /// assert!(a.is_empty()); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - pub fn clear(&mut self) - where - K: Ord, - { - *self = BTreeMap::new(); + pub fn clear(&mut self) { + *self = BTreeMap { root: None, length: 0 }; } /// Returns a reference to the value corresponding to the key. @@ -832,6 +837,40 @@ impl BTreeMap { } } + /// Tries to insert a key-value pair into the map, and returns + /// a mutable reference to the value in the entry. + /// + /// If the map already had this key present, nothing is updated, and + /// an error containing the occupied entry and the value is returned. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// #![feature(map_try_insert)] + /// + /// use std::collections::BTreeMap; + /// + /// let mut map = BTreeMap::new(); + /// assert_eq!(map.try_insert(37, "a").unwrap(), &"a"); + /// + /// let err = map.try_insert(37, "b").unwrap_err(); + /// assert_eq!(err.entry.key(), &37); + /// assert_eq!(err.entry.get(), &"a"); + /// assert_eq!(err.value, "b"); + /// ``` + #[unstable(feature = "map_try_insert", issue = "82766")] + pub fn try_insert(&mut self, key: K, value: V) -> Result<&mut V, OccupiedError<'_, K, V>> + where + K: Ord, + { + match self.entry(key) { + Occupied(entry) => Err(OccupiedError { entry, value }), + Vacant(entry) => Ok(entry.insert(value)), + } + } + /// Removes a key from the map, returning the value at the key if the key /// was previously in the map. /// @@ -1006,11 +1045,9 @@ impl BTreeMap { R: RangeBounds, { if let Some(root) = &self.root { - let (f, b) = root.reborrow().range_search(range); - - Range { front: Some(f), back: Some(b) } + Range { inner: root.reborrow().range_search(range) } } else { - Range { front: None, back: None } + Range { inner: LeafRange::none() } } } @@ -1052,11 +1089,9 @@ impl BTreeMap { R: RangeBounds, { if let Some(root) = &mut self.root { - let (f, b) = root.borrow_valmut().range_search(range); - - RangeMut { front: Some(f), back: Some(b), _marker: PhantomData } + RangeMut { inner: root.borrow_valmut().range_search(range), _marker: PhantomData } } else { - RangeMut { front: None, back: None, _marker: PhantomData } + RangeMut { inner: LeafRange::none(), _marker: PhantomData } } } @@ -1135,37 +1170,31 @@ impl BTreeMap { let total_num = self.len(); let left_root = self.root.as_mut().unwrap(); // unwrap succeeds because not empty - let mut right = Self::new(); - let right_root = Self::ensure_is_owned(&mut right.root); + let right_root = left_root.split_off(key); - left_root.split_off(right_root, key); - - if left_root.height() < right_root.height() { - self.length = left_root.reborrow().calc_length(); - right.length = total_num - self.len(); - } else { - right.length = right_root.reborrow().calc_length(); - self.length = total_num - right.len(); - } + let (new_left_len, right_len) = Root::calc_split_length(total_num, &left_root, &right_root); + self.length = new_left_len; - right + BTreeMap { root: Some(right_root), length: right_len } } - /// Creates an iterator which uses a closure to determine if an element should be removed. - /// - /// If the closure returns true, the element is removed from the map and yielded. - /// If the closure returns false, or panics, the element remains in the map and will not be - /// yielded. + /// Creates an iterator that visits all elements (key-value pairs) in + /// ascending key order and uses a closure to determine if an element should + /// be removed. If the closure returns `true`, the element is removed from + /// the map and yielded. If the closure returns `false`, or panics, the + /// element remains in the map and will not be yielded. /// - /// Note that `drain_filter` lets you mutate every value in the filter closure, regardless of - /// whether you choose to keep or remove it. + /// The iterator also lets you mutate the value of each element in the + /// closure, regardless of whether you choose to keep or remove it. /// - /// If the iterator is only partially consumed or not consumed at all, each of the remaining - /// elements will still be subjected to the closure and removed and dropped if it returns true. + /// If the iterator is only partially consumed or not consumed at all, each + /// of the remaining elements is still subjected to the closure, which may + /// change its value and, by returning `true`, have the element removed and + /// dropped. /// - /// It is unspecified how many more elements will be subjected to the closure - /// if a panic occurs in the closure, or a panic occurs while dropping an element, - /// or if the `DrainFilter` value is leaked. + /// It is unspecified how many more elements will be subjected to the + /// closure if a panic occurs in the closure, or a panic occurs while + /// dropping an element, or if the `DrainFilter` value is leaked. /// /// # Examples /// @@ -1226,10 +1255,7 @@ impl BTreeMap { /// ``` #[inline] #[unstable(feature = "map_into_keys_values", issue = "75294")] - pub fn into_keys(self) -> IntoKeys - where - K: Ord, - { + pub fn into_keys(self) -> IntoKeys { IntoKeys { inner: self.into_iter() } } @@ -1252,10 +1278,7 @@ impl BTreeMap { /// ``` #[inline] #[unstable(feature = "map_into_keys_values", issue = "75294")] - pub fn into_values(self) -> IntoValues - where - K: Ord, - { + pub fn into_values(self) -> IntoValues { IntoValues { inner: self.into_iter() } } } @@ -1279,7 +1302,7 @@ impl<'a, K: 'a, V: 'a> Iterator for Iter<'a, K, V> { None } else { self.length -= 1; - unsafe { Some(self.range.next_unchecked()) } + Some(unsafe { self.range.next_unchecked() }) } } @@ -1310,7 +1333,7 @@ impl<'a, K: 'a, V: 'a> DoubleEndedIterator for Iter<'a, K, V> { None } else { self.length -= 1; - unsafe { Some(self.range.next_back_unchecked()) } + Some(unsafe { self.range.next_back_unchecked() }) } } } @@ -1348,8 +1371,7 @@ impl<'a, K: 'a, V: 'a> Iterator for IterMut<'a, K, V> { None } else { self.length -= 1; - let (k, v) = unsafe { self.range.next_unchecked() }; - Some((k, v)) // coerce k from `&mut K` to `&K` + Some(unsafe { self.range.next_unchecked() }) } } @@ -1377,8 +1399,7 @@ impl<'a, K: 'a, V: 'a> DoubleEndedIterator for IterMut<'a, K, V> { None } else { self.length -= 1; - let (k, v) = unsafe { self.range.next_back_unchecked() }; - Some((k, v)) // coerce k from `&mut K` to `&K` + Some(unsafe { self.range.next_back_unchecked() }) } } } @@ -1409,51 +1430,51 @@ impl IntoIterator for BTreeMap { fn into_iter(self) -> IntoIter { let mut me = ManuallyDrop::new(self); if let Some(root) = me.root.take() { - let (f, b) = root.into_dying().full_range(); + let full_range = root.into_dying().full_range(); - IntoIter { front: Some(f), back: Some(b), length: me.length } + IntoIter { range: full_range, length: me.length } } else { - IntoIter { front: None, back: None, length: 0 } + IntoIter { range: LeafRange::none(), length: 0 } } } } -#[stable(feature = "btree_drop", since = "1.7.0")] -impl Drop for IntoIter { +impl Drop for Dropper { fn drop(&mut self) { - struct DropGuard<'a, K, V>(&'a mut IntoIter); + // Similar to advancing a non-fusing iterator. + fn next_or_end(this: &mut Dropper) -> Option<(K, V)> { + if this.remaining_length == 0 { + unsafe { ptr::read(&this.front).deallocating_end() } + None + } else { + this.remaining_length -= 1; + Some(unsafe { this.front.deallocating_next_unchecked() }) + } + } + + struct DropGuard<'a, K, V>(&'a mut Dropper); impl<'a, K, V> Drop for DropGuard<'a, K, V> { fn drop(&mut self) { // Continue the same loop we perform below. This only runs when unwinding, so we // don't have to care about panics this time (they'll abort). - while let Some(_) = self.0.next() {} - - unsafe { - let mut node = - unwrap_unchecked(ptr::read(&self.0.front)).into_node().forget_type(); - while let Some(parent) = node.deallocate_and_ascend() { - node = parent.into_node().forget_type(); - } - } + while let Some(_pair) = next_or_end(&mut self.0) {} } } - while let Some(pair) = self.next() { + while let Some(pair) = next_or_end(self) { let guard = DropGuard(self); drop(pair); mem::forget(guard); } + } +} - unsafe { - if let Some(front) = ptr::read(&self.front) { - let mut node = front.into_node().forget_type(); - // Most of the nodes have been deallocated while traversing - // but one pile from a leaf up to the root is left standing. - while let Some(parent) = node.deallocate_and_ascend() { - node = parent.into_node().forget_type(); - } - } +#[stable(feature = "btree_drop", since = "1.7.0")] +impl Drop for IntoIter { + fn drop(&mut self) { + if let Some(front) = self.range.front.take() { + Dropper { front, remaining_length: self.length }; } } } @@ -1467,7 +1488,7 @@ impl Iterator for IntoIter { None } else { self.length -= 1; - Some(unsafe { self.front.as_mut().unwrap().next_unchecked() }) + Some(unsafe { self.range.front.as_mut().unwrap().deallocating_next_unchecked() }) } } @@ -1483,7 +1504,7 @@ impl DoubleEndedIterator for IntoIter { None } else { self.length -= 1; - Some(unsafe { self.back.as_mut().unwrap().next_back_unchecked() }) + Some(unsafe { self.range.back.as_mut().unwrap().deallocating_next_back_unchecked() }) } } } @@ -1700,7 +1721,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.is_empty() { None } else { unsafe { Some(self.next_unchecked()) } } + if self.inner.is_empty() { None } else { Some(unsafe { self.next_unchecked() }) } } fn last(mut self) -> Option<(&'a K, &'a V)> { @@ -1751,12 +1772,8 @@ impl ExactSizeIterator for ValuesMut<'_, K, V> { impl FusedIterator for ValuesMut<'_, K, V> {} impl<'a, K, V> Range<'a, K, V> { - fn is_empty(&self) -> bool { - self.front == self.back - } - unsafe fn next_unchecked(&mut self) -> (&'a K, &'a V) { - unsafe { unwrap_unchecked(self.front.as_mut()).next_unchecked() } + unsafe { self.inner.front.as_mut().unwrap_unchecked().next_unchecked() } } } @@ -1839,13 +1856,13 @@ impl FusedIterator for IntoValues {} #[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.is_empty() { None } else { Some(unsafe { self.next_back_unchecked() }) } + if self.inner.is_empty() { None } else { Some(unsafe { self.next_back_unchecked() }) } } } impl<'a, K, V> Range<'a, K, V> { unsafe fn next_back_unchecked(&mut self) -> (&'a K, &'a V) { - unsafe { unwrap_unchecked(self.back.as_mut()).next_back_unchecked() } + unsafe { self.inner.back.as_mut().unwrap_unchecked().next_back_unchecked() } } } @@ -1855,7 +1872,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 { inner: LeafRange { front: self.inner.front, back: self.inner.back } } } } @@ -1864,12 +1881,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.is_empty() { - None - } else { - let (k, v) = unsafe { self.next_unchecked() }; - Some((k, v)) // coerce k from `&mut K` to `&K` - } + if self.inner.is_empty() { None } else { Some(unsafe { self.next_unchecked() }) } } fn last(mut self) -> Option<(&'a K, &'a mut V)> { @@ -1886,33 +1898,21 @@ impl<'a, K, V> Iterator for RangeMut<'a, K, V> { } impl<'a, K, V> RangeMut<'a, K, V> { - fn is_empty(&self) -> bool { - self.front == self.back - } - unsafe fn next_unchecked(&mut self) -> (&'a K, &'a mut V) { - unsafe { unwrap_unchecked(self.front.as_mut()).next_unchecked() } + unsafe { self.inner.front.as_mut().unwrap_unchecked().next_unchecked() } } /// Returns an iterator of references over the remaining items. #[inline] pub(super) fn iter(&self) -> Range<'_, K, V> { - Range { - front: self.front.as_ref().map(|f| f.reborrow()), - back: self.back.as_ref().map(|b| b.reborrow()), - } + Range { inner: self.inner.reborrow() } } } #[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.is_empty() { - None - } else { - let (k, v) = unsafe { self.next_back_unchecked() }; - Some((k, v)) // coerce k from `&mut K` to `&K` - } + if self.inner.is_empty() { None } else { Some(unsafe { self.next_back_unchecked() }) } } } @@ -1921,7 +1921,7 @@ impl FusedIterator for RangeMut<'_, K, V> {} impl<'a, K, V> RangeMut<'a, K, V> { unsafe fn next_back_unchecked(&mut self) -> (&'a K, &'a mut V) { - unsafe { unwrap_unchecked(self.back.as_mut()).next_back_unchecked() } + unsafe { self.inner.back.as_mut().unwrap_unchecked().next_back_unchecked() } } } @@ -2055,11 +2055,11 @@ impl BTreeMap { #[stable(feature = "rust1", since = "1.0.0")] pub fn iter(&self) -> Iter<'_, K, V> { if let Some(root) = &self.root { - let (f, b) = root.reborrow().full_range(); + let full_range = root.reborrow().full_range(); - Iter { range: Range { front: Some(f), back: Some(b) }, length: self.length } + Iter { range: Range { inner: full_range }, length: self.length } } else { - Iter { range: Range { front: None, back: None }, length: 0 } + Iter { range: Range { inner: LeafRange::none() }, length: 0 } } } @@ -2087,14 +2087,17 @@ impl BTreeMap { #[stable(feature = "rust1", since = "1.0.0")] pub fn iter_mut(&mut self) -> IterMut<'_, K, V> { if let Some(root) = &mut self.root { - let (f, b) = root.borrow_valmut().full_range(); + let full_range = root.borrow_valmut().full_range(); IterMut { - range: RangeMut { front: Some(f), back: Some(b), _marker: PhantomData }, + range: RangeMut { inner: full_range, _marker: PhantomData }, length: self.length, } } else { - IterMut { range: RangeMut { front: None, back: None, _marker: PhantomData }, length: 0 } + IterMut { + range: RangeMut { inner: LeafRange::none(), _marker: PhantomData }, + length: 0, + } } } diff --git a/library/alloc/src/collections/btree/map/entry.rs b/library/alloc/src/collections/btree/map/entry.rs index 6cc8813bc5..6b30d95977 100644 --- a/library/alloc/src/collections/btree/map/entry.rs +++ b/library/alloc/src/collections/btree/map/entry.rs @@ -71,6 +71,41 @@ impl Debug for OccupiedEntry<'_, K, V> { } } +/// The error returned by [`try_insert`](BTreeMap::try_insert) when the key already exists. +/// +/// Contains the occupied entry, and the value that was not inserted. +#[unstable(feature = "map_try_insert", issue = "82766")] +pub struct OccupiedError<'a, K: 'a, V: 'a> { + /// The entry in the map that was already occupied. + pub entry: OccupiedEntry<'a, K, V>, + /// The value which was not inserted, because the entry was already occupied. + pub value: V, +} + +#[unstable(feature = "map_try_insert", issue = "82766")] +impl Debug for OccupiedError<'_, K, V> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("OccupiedError") + .field("key", self.entry.key()) + .field("old_value", self.entry.get()) + .field("new_value", &self.value) + .finish() + } +} + +#[unstable(feature = "map_try_insert", issue = "82766")] +impl<'a, K: Debug + Ord, V: Debug> fmt::Display for OccupiedError<'a, K, V> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "failed to insert {:?}, key {:?} already exists with value {:?}", + self.value, + self.entry.key(), + self.entry.get(), + ) + } +} + impl<'a, K: Ord, V> Entry<'a, K, V> { /// Ensures a value is in the entry by inserting the default if empty, and returns /// a mutable reference to the value in the entry. @@ -278,14 +313,14 @@ impl<'a, K: Ord, V> VacantEntry<'a, K, V> { pub fn insert(self, value: V) -> &'a mut V { let out_ptr = match self.handle.insert_recursing(self.key, value) { (Fit(_), val_ptr) => { - // Safety: We have consumed self.handle and the handle returned. + // SAFETY: We have consumed self.handle and the handle returned. let map = unsafe { self.dormant_map.awaken() }; map.length += 1; val_ptr } (Split(ins), val_ptr) => { drop(ins.left); - // Safety: We have consumed self.handle and the reference returned. + // SAFETY: We have consumed self.handle and the reference returned. let map = unsafe { self.dormant_map.awaken() }; let root = map.root.as_mut().unwrap(); root.push_internal_level().push(ins.kv.0, ins.kv.1, ins.right); diff --git a/library/alloc/src/collections/btree/map/tests.rs b/library/alloc/src/collections/btree/map/tests.rs index 78edf11d39..e636e490e1 100644 --- a/library/alloc/src/collections/btree/map/tests.rs +++ b/library/alloc/src/collections/btree/map/tests.rs @@ -1,4 +1,6 @@ -use super::super::{node, DeterministicRng}; +use super::super::testing::crash_test::{CrashTestDummy, Panic}; +use super::super::testing::ord_chaos::{Cyclic3, Governed, Governor}; +use super::super::testing::rng::DeterministicRng; use super::Entry::{Occupied, Vacant}; use super::*; use crate::boxed::Box; @@ -15,9 +17,6 @@ use std::ops::RangeBounds; use std::panic::{catch_unwind, AssertUnwindSafe}; use std::sync::atomic::{AtomicUsize, Ordering::SeqCst}; -mod ord_chaos; -use ord_chaos::{Cyclic3, Governed, Governor}; - // Capacity of a tree with a single level, // i.e., a tree who's root is a leaf node at height 0. const NODE_CAPACITY: usize = node::CAPACITY; @@ -137,8 +136,9 @@ impl<'a, K: 'a, V: 'a> NodeRef, K, V, marker::LeafOrInternal> } } -// Tests our value of MIN_INSERTS_HEIGHT_2. It may change according to the -// implementation of insertion, but it's best to be aware of when it does. +// Tests our value of MIN_INSERTS_HEIGHT_2. Failure may mean you just need to +// adapt that value to match a change in node::CAPACITY or the choices made +// during insertion, otherwise other test cases may fail or be less useful. #[test] fn test_levels() { let mut map = BTreeMap::new(); @@ -1136,91 +1136,62 @@ mod test_drain_filter { #[test] fn drop_panic_leak() { - static PREDS: AtomicUsize = AtomicUsize::new(0); - static DROPS: AtomicUsize = AtomicUsize::new(0); - - struct D; - impl Drop for D { - fn drop(&mut self) { - if DROPS.fetch_add(1, SeqCst) == 1 { - panic!("panic in `drop`"); - } - } - } - - // Keys are multiples of 4, so that each key is counted by a hexadecimal digit. - let mut map = (0..3).map(|i| (i * 4, D)).collect::>(); + let a = CrashTestDummy::new(0); + let b = CrashTestDummy::new(1); + let c = CrashTestDummy::new(2); + let mut map = BTreeMap::new(); + map.insert(a.spawn(Panic::Never), ()); + map.insert(b.spawn(Panic::InDrop), ()); + map.insert(c.spawn(Panic::Never), ()); - catch_unwind(move || { - drop(map.drain_filter(|i, _| { - PREDS.fetch_add(1usize << i, SeqCst); - true - })) - }) - .unwrap_err(); + catch_unwind(move || drop(map.drain_filter(|dummy, _| dummy.query(true)))).unwrap_err(); - assert_eq!(PREDS.load(SeqCst), 0x011); - assert_eq!(DROPS.load(SeqCst), 3); + assert_eq!(a.queried(), 1); + assert_eq!(b.queried(), 1); + assert_eq!(c.queried(), 0); + assert_eq!(a.dropped(), 1); + assert_eq!(b.dropped(), 1); + assert_eq!(c.dropped(), 1); } #[test] fn pred_panic_leak() { - static PREDS: AtomicUsize = AtomicUsize::new(0); - static DROPS: AtomicUsize = AtomicUsize::new(0); - - struct D; - impl Drop for D { - fn drop(&mut self) { - DROPS.fetch_add(1, SeqCst); - } - } - - // Keys are multiples of 4, so that each key is counted by a hexadecimal digit. - let mut map = (0..3).map(|i| (i * 4, D)).collect::>(); - - catch_unwind(AssertUnwindSafe(|| { - drop(map.drain_filter(|i, _| { - PREDS.fetch_add(1usize << i, SeqCst); - match i { - 0 => true, - _ => panic!(), - } - })) - })) - .unwrap_err(); - - assert_eq!(PREDS.load(SeqCst), 0x011); - assert_eq!(DROPS.load(SeqCst), 1); + let a = CrashTestDummy::new(0); + let b = CrashTestDummy::new(1); + let c = CrashTestDummy::new(2); + let mut map = BTreeMap::new(); + map.insert(a.spawn(Panic::Never), ()); + map.insert(b.spawn(Panic::InQuery), ()); + map.insert(c.spawn(Panic::InQuery), ()); + + catch_unwind(AssertUnwindSafe(|| drop(map.drain_filter(|dummy, _| dummy.query(true))))) + .unwrap_err(); + + assert_eq!(a.queried(), 1); + assert_eq!(b.queried(), 1); + assert_eq!(c.queried(), 0); + assert_eq!(a.dropped(), 1); + assert_eq!(b.dropped(), 0); + assert_eq!(c.dropped(), 0); assert_eq!(map.len(), 2); - assert_eq!(map.first_entry().unwrap().key(), &4); - assert_eq!(map.last_entry().unwrap().key(), &8); + assert_eq!(map.first_entry().unwrap().key().id(), 1); + assert_eq!(map.last_entry().unwrap().key().id(), 2); map.check(); } // Same as above, but attempt to use the iterator again after the panic in the predicate #[test] fn pred_panic_reuse() { - static PREDS: AtomicUsize = AtomicUsize::new(0); - static DROPS: AtomicUsize = AtomicUsize::new(0); - - struct D; - impl Drop for D { - fn drop(&mut self) { - DROPS.fetch_add(1, SeqCst); - } - } - - // Keys are multiples of 4, so that each key is counted by a hexadecimal digit. - let mut map = (0..3).map(|i| (i * 4, D)).collect::>(); + let a = CrashTestDummy::new(0); + let b = CrashTestDummy::new(1); + let c = CrashTestDummy::new(2); + let mut map = BTreeMap::new(); + map.insert(a.spawn(Panic::Never), ()); + map.insert(b.spawn(Panic::InQuery), ()); + map.insert(c.spawn(Panic::InQuery), ()); { - let mut it = map.drain_filter(|i, _| { - PREDS.fetch_add(1usize << i, SeqCst); - match i { - 0 => true, - _ => panic!(), - } - }); + let mut it = map.drain_filter(|dummy, _| dummy.query(true)); catch_unwind(AssertUnwindSafe(|| while it.next().is_some() {})).unwrap_err(); // Iterator behaviour after a panic is explicitly unspecified, // so this is just the current implementation: @@ -1228,11 +1199,15 @@ mod test_drain_filter { assert!(matches!(result, Ok(None))); } - assert_eq!(PREDS.load(SeqCst), 0x011); - assert_eq!(DROPS.load(SeqCst), 1); + assert_eq!(a.queried(), 1); + assert_eq!(b.queried(), 1); + assert_eq!(c.queried(), 0); + assert_eq!(a.dropped(), 1); + assert_eq!(b.dropped(), 0); + assert_eq!(c.dropped(), 0); assert_eq!(map.len(), 2); - assert_eq!(map.first_entry().unwrap().key(), &4); - assert_eq!(map.last_entry().unwrap().key(), &8); + assert_eq!(map.first_entry().unwrap().key().id(), 1); + assert_eq!(map.last_entry().unwrap().key().id(), 2); map.check(); } } @@ -1439,6 +1414,43 @@ fn test_bad_zst() { m.check(); } +#[test] +fn test_clear() { + let mut map = BTreeMap::new(); + for &len in &[MIN_INSERTS_HEIGHT_1, MIN_INSERTS_HEIGHT_2, 0, NODE_CAPACITY] { + for i in 0..len { + map.insert(i, ()); + } + assert_eq!(map.len(), len); + map.clear(); + map.check(); + assert!(map.is_empty()); + } +} + +#[test] +fn test_clear_drop_panic_leak() { + let a = CrashTestDummy::new(0); + let b = CrashTestDummy::new(1); + let c = CrashTestDummy::new(2); + + let mut map = BTreeMap::new(); + map.insert(a.spawn(Panic::Never), ()); + map.insert(b.spawn(Panic::InDrop), ()); + map.insert(c.spawn(Panic::Never), ()); + + catch_unwind(AssertUnwindSafe(|| map.clear())).unwrap_err(); + assert_eq!(a.dropped(), 1); + assert_eq!(b.dropped(), 1); + assert_eq!(c.dropped(), 1); + assert_eq!(map.len(), 0); + + drop(map); + assert_eq!(a.dropped(), 1); + assert_eq!(b.dropped(), 1); + assert_eq!(c.dropped(), 1); +} + #[test] fn test_clone() { let mut map = BTreeMap::new(); @@ -1484,6 +1496,35 @@ fn test_clone() { map.check(); } +#[test] +fn test_clone_panic_leak() { + let a = CrashTestDummy::new(0); + let b = CrashTestDummy::new(1); + let c = CrashTestDummy::new(2); + + let mut map = BTreeMap::new(); + map.insert(a.spawn(Panic::Never), ()); + map.insert(b.spawn(Panic::InClone), ()); + map.insert(c.spawn(Panic::Never), ()); + + catch_unwind(|| map.clone()).unwrap_err(); + assert_eq!(a.cloned(), 1); + assert_eq!(b.cloned(), 1); + assert_eq!(c.cloned(), 0); + assert_eq!(a.dropped(), 1); + assert_eq!(b.dropped(), 0); + assert_eq!(c.dropped(), 0); + assert_eq!(map.len(), 3); + + drop(map); + assert_eq!(a.cloned(), 1); + assert_eq!(b.cloned(), 1); + assert_eq!(c.cloned(), 0); + assert_eq!(a.dropped(), 2); + assert_eq!(b.dropped(), 1); + assert_eq!(c.dropped(), 1); +} + #[test] fn test_clone_from() { let mut map1 = BTreeMap::new(); @@ -1711,12 +1752,19 @@ fn test_ord_absence() { fn map(mut map: BTreeMap) { map.is_empty(); map.len(); + map.clear(); map.iter(); map.iter_mut(); map.keys(); map.values(); map.values_mut(); - map.into_iter(); + if true { + map.into_values(); + } else if true { + map.into_iter(); + } else { + map.into_keys(); + } } fn map_debug(mut map: BTreeMap) { @@ -1726,7 +1774,13 @@ fn test_ord_absence() { format!("{:?}", map.keys()); format!("{:?}", map.values()); format!("{:?}", map.values_mut()); - format!("{:?}", map.into_iter()); + if true { + format!("{:?}", map.into_iter()); + } else if true { + format!("{:?}", map.into_keys()); + } else { + format!("{:?}", map.into_values()); + } } fn map_clone(mut map: BTreeMap) { @@ -1747,11 +1801,11 @@ fn test_occupied_entry_key() { let key = "hello there"; let value = "value goes here"; assert!(a.is_empty()); - a.insert(key.clone(), value.clone()); + a.insert(key, value); assert_eq!(a.len(), 1); assert_eq!(a[key], value); - match a.entry(key.clone()) { + match a.entry(key) { Vacant(_) => panic!(), Occupied(e) => assert_eq!(key, *e.key()), } @@ -1767,11 +1821,11 @@ fn test_vacant_entry_key() { let value = "value goes here"; assert!(a.is_empty()); - match a.entry(key.clone()) { + match a.entry(key) { Occupied(_) => panic!(), Vacant(e) => { assert_eq!(key, *e.key()); - e.insert(value.clone()); + e.insert(value); } } assert_eq!(a.len(), 1); @@ -1888,29 +1942,21 @@ create_append_test!(test_append_1700, 1700); #[test] fn test_append_drop_leak() { - static DROPS: AtomicUsize = AtomicUsize::new(0); - - struct D; - - impl Drop for D { - fn drop(&mut self) { - if DROPS.fetch_add(1, SeqCst) == 0 { - panic!("panic in `drop`"); - } - } - } - + let a = CrashTestDummy::new(0); + let b = CrashTestDummy::new(1); + let c = CrashTestDummy::new(2); let mut left = BTreeMap::new(); let mut right = BTreeMap::new(); - left.insert(0, D); - left.insert(1, D); // first to be dropped during append - left.insert(2, D); - right.insert(1, D); - right.insert(2, D); + left.insert(a.spawn(Panic::Never), ()); + left.insert(b.spawn(Panic::InDrop), ()); // first duplicate key, dropped during append + left.insert(c.spawn(Panic::Never), ()); + right.insert(b.spawn(Panic::Never), ()); + right.insert(c.spawn(Panic::Never), ()); catch_unwind(move || left.append(&mut right)).unwrap_err(); - - assert_eq!(DROPS.load(SeqCst), 4); // Rust issue #47949 ate one little piggy + assert_eq!(a.dropped(), 1); + assert_eq!(b.dropped(), 1); // should be 2 were it not for Rust issue #47949 + assert_eq!(c.dropped(), 2); } #[test] @@ -2037,51 +2083,42 @@ fn test_split_off_large_random_sorted() { #[test] fn test_into_iter_drop_leak_height_0() { - static DROPS: AtomicUsize = AtomicUsize::new(0); - - struct D; - - impl Drop for D { - fn drop(&mut self) { - if DROPS.fetch_add(1, SeqCst) == 3 { - panic!("panic in `drop`"); - } - } - } - + let a = CrashTestDummy::new(0); + let b = CrashTestDummy::new(1); + let c = CrashTestDummy::new(2); + let d = CrashTestDummy::new(3); + let e = CrashTestDummy::new(4); let mut map = BTreeMap::new(); - map.insert("a", D); - map.insert("b", D); - map.insert("c", D); - map.insert("d", D); - map.insert("e", D); + map.insert("a", a.spawn(Panic::Never)); + map.insert("b", b.spawn(Panic::Never)); + map.insert("c", c.spawn(Panic::Never)); + map.insert("d", d.spawn(Panic::InDrop)); + map.insert("e", e.spawn(Panic::Never)); catch_unwind(move || drop(map.into_iter())).unwrap_err(); - assert_eq!(DROPS.load(SeqCst), 5); + assert_eq!(a.dropped(), 1); + assert_eq!(b.dropped(), 1); + assert_eq!(c.dropped(), 1); + assert_eq!(d.dropped(), 1); + assert_eq!(e.dropped(), 1); } #[test] fn test_into_iter_drop_leak_height_1() { let size = MIN_INSERTS_HEIGHT_1; - static DROPS: AtomicUsize = AtomicUsize::new(0); - static PANIC_POINT: AtomicUsize = AtomicUsize::new(0); - - struct D; - impl Drop for D { - fn drop(&mut self) { - if DROPS.fetch_add(1, SeqCst) == PANIC_POINT.load(SeqCst) { - panic!("panic in `drop`"); - } - } - } - for panic_point in vec![0, 1, size - 2, size - 1] { - DROPS.store(0, SeqCst); - PANIC_POINT.store(panic_point, SeqCst); - let map: BTreeMap<_, _> = (0..size).map(|i| (i, D)).collect(); + let dummies: Vec<_> = (0..size).map(|i| CrashTestDummy::new(i)).collect(); + let map: BTreeMap<_, _> = (0..size) + .map(|i| { + let panic = if i == panic_point { Panic::InDrop } else { Panic::Never }; + (dummies[i].spawn(Panic::Never), dummies[i].spawn(panic)) + }) + .collect(); catch_unwind(move || drop(map.into_iter())).unwrap_err(); - assert_eq!(DROPS.load(SeqCst), size); + for i in 0..size { + assert_eq!(dummies[i].dropped(), 2); + } } } diff --git a/library/alloc/src/collections/btree/mod.rs b/library/alloc/src/collections/btree/mod.rs index cdb3910404..f74172c7d9 100644 --- a/library/alloc/src/collections/btree/mod.rs +++ b/library/alloc/src/collections/btree/mod.rs @@ -1,5 +1,6 @@ mod append; mod borrow; +mod fix; pub mod map; mod mem; mod merge_iter; @@ -19,49 +20,5 @@ trait Recover { fn replace(&mut self, key: Self::Key) -> Option; } -/// Same purpose as `Option::unwrap` but doesn't always guarantee a panic -/// if the option contains no value. -/// SAFETY: the caller must ensure that the option contains a value. -#[inline(always)] -pub unsafe fn unwrap_unchecked(val: Option) -> T { - val.unwrap_or_else(|| { - if cfg!(debug_assertions) { - panic!("'unchecked' unwrap on None in BTreeMap"); - } else { - unsafe { - core::intrinsics::unreachable(); - } - } - }) -} - #[cfg(test)] -/// XorShiftRng -struct DeterministicRng { - count: usize, - x: u32, - y: u32, - z: u32, - w: u32, -} - -#[cfg(test)] -impl DeterministicRng { - fn new() -> Self { - DeterministicRng { count: 0, x: 0x193a6754, y: 0xa8a7d469, z: 0x97830e05, w: 0x113ba7bb } - } - - /// Guarantees that each returned number is unique. - fn next(&mut self) -> u32 { - self.count += 1; - assert!(self.count <= 70029); - let x = self.x; - let t = x ^ (x << 11); - self.x = self.y; - self.y = self.z; - self.z = self.w; - let w_ = self.w; - self.w = w_ ^ (w_ >> 19) ^ (t ^ (t >> 8)); - self.w - } -} +mod testing; diff --git a/library/alloc/src/collections/btree/navigate.rs b/library/alloc/src/collections/btree/navigate.rs index 2773b427fb..c2c99a9360 100644 --- a/library/alloc/src/collections/btree/navigate.rs +++ b/library/alloc/src/collections/btree/navigate.rs @@ -1,117 +1,81 @@ use core::borrow::Borrow; -use core::cmp::Ordering; -use core::ops::Bound::{Excluded, Included, Unbounded}; use core::ops::RangeBounds; use core::ptr; use super::node::{marker, ForceResult::*, Handle, NodeRef}; -use super::search::SearchResult; -use super::unwrap_unchecked; -/// Finds the leaf edges delimiting a specified range in or underneath a node. -/// -/// The result is meaningful only if the tree is ordered by key, like the tree -/// in a `BTreeMap` is. -fn range_search( - root1: NodeRef, - root2: NodeRef, - range: R, -) -> ( - Handle, marker::Edge>, - Handle, marker::Edge>, -) -where - Q: ?Sized + Ord, - K: Borrow, - R: RangeBounds, -{ - // WARNING: Inlining these variables would be unsound (#81138) - // We assume the bounds reported by `range` remain the same, but - // an adversarial implementation could change between calls - let start = range.start_bound(); - let end = range.end_bound(); - match (start, end) { - (Excluded(s), Excluded(e)) if s == e => { - panic!("range start and end are equal and excluded in BTreeMap") - } - (Included(s) | Excluded(s), Included(e) | Excluded(e)) if s > e => { - panic!("range start is greater than range end in BTreeMap") - } - _ => {} - }; - - let mut min_node = root1; - let mut max_node = root2; - let mut min_found = false; - let mut max_found = false; +pub struct LeafRange { + pub front: Option, marker::Edge>>, + pub back: Option, marker::Edge>>, +} - loop { - // Using `range` again would be unsound (#81138) - let front = match (min_found, start) { - (false, Included(key)) => match min_node.search_node(key) { - SearchResult::Found(kv) => { - min_found = true; - kv.left_edge() - } - SearchResult::GoDown(edge) => edge, - }, - (false, Excluded(key)) => match min_node.search_node(key) { - SearchResult::Found(kv) => { - min_found = true; - kv.right_edge() - } - SearchResult::GoDown(edge) => edge, - }, - (true, Included(_)) => min_node.last_edge(), - (true, Excluded(_)) => min_node.first_edge(), - (_, Unbounded) => min_node.first_edge(), - }; +impl LeafRange { + pub fn none() -> Self { + LeafRange { front: None, back: None } + } - // Using `range` again would be unsound (#81138) - let back = match (max_found, end) { - (false, Included(key)) => match max_node.search_node(key) { - SearchResult::Found(kv) => { - max_found = true; - kv.right_edge() - } - SearchResult::GoDown(edge) => edge, - }, - (false, Excluded(key)) => match max_node.search_node(key) { - SearchResult::Found(kv) => { - max_found = true; - kv.left_edge() - } - SearchResult::GoDown(edge) => edge, - }, - (true, Included(_)) => max_node.first_edge(), - (true, Excluded(_)) => max_node.last_edge(), - (_, Unbounded) => max_node.last_edge(), - }; + pub fn is_empty(&self) -> bool { + self.front == self.back + } - if front.partial_cmp(&back) == Some(Ordering::Greater) { - panic!("Ord is ill-defined in BTreeMap range"); + /// Temporarily takes out another, immutable equivalent of the same range. + pub fn reborrow(&self) -> LeafRange, K, V> { + LeafRange { + front: self.front.as_ref().map(|f| f.reborrow()), + back: self.back.as_ref().map(|b| b.reborrow()), } - 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(); + } +} + +impl NodeRef { + /// Finds the distinct leaf edges delimiting a specified range in a tree. + /// Returns either a pair of different handles into the same tree or a pair + /// of empty options. + /// # Safety + /// Unless `BorrowType` is `Immut`, do not use the duplicate handles to + /// visit the same KV twice. + unsafe fn find_leaf_edges_spanning_range( + self, + range: R, + ) -> LeafRange + where + Q: Ord, + K: Borrow, + R: RangeBounds, + { + match self.search_tree_for_bifurcation(&range) { + Err(_) => LeafRange::none(), + Ok(( + node, + lower_edge_idx, + upper_edge_idx, + mut lower_child_bound, + mut upper_child_bound, + )) => { + let mut lower_edge = unsafe { Handle::new_edge(ptr::read(&node), lower_edge_idx) }; + let mut upper_edge = unsafe { Handle::new_edge(node, upper_edge_idx) }; + loop { + match (lower_edge.force(), upper_edge.force()) { + (Leaf(f), Leaf(b)) => return LeafRange { front: Some(f), back: Some(b) }, + (Internal(f), Internal(b)) => { + (lower_edge, lower_child_bound) = + f.descend().find_lower_bound_edge(lower_child_bound); + (upper_edge, upper_child_bound) = + b.descend().find_upper_bound_edge(upper_child_bound); + } + _ => unreachable!("BTreeMap has different depths"), + } + } } - _ => unreachable!("BTreeMap has different depths"), - }; + } } } -/// Equivalent to `range_search(k, v, ..)` but without the `Ord` bound. +/// Equivalent to `(root1.first_leaf_edge(), root2.last_leaf_edge())` but more efficient. fn full_range( root1: NodeRef, root2: NodeRef, -) -> ( - Handle, marker::Edge>, - Handle, marker::Edge>, -) { +) -> LeafRange { let mut min_node = root1; let mut max_node = root2; loop { @@ -119,7 +83,7 @@ fn full_range( let back = max_node.last_edge(); match (front.force(), back.force()) { (Leaf(f), Leaf(b)) => { - return (f, b); + return LeafRange { front: Some(f), back: Some(b) }; } (Internal(min_int), Internal(max_int)) => { min_node = min_int.descend(); @@ -131,32 +95,22 @@ fn full_range( } impl<'a, K: 'a, V: 'a> NodeRef, K, V, marker::LeafOrInternal> { - /// Creates a pair of leaf edges delimiting a specified range in or underneath a node. + /// Finds the pair of leaf edges delimiting a specific range in a tree. /// /// The result is meaningful only if the tree is ordered by key, like the tree /// in a `BTreeMap` is. - pub fn range_search( - self, - range: R, - ) -> ( - Handle, K, V, marker::Leaf>, marker::Edge>, - Handle, K, V, marker::Leaf>, marker::Edge>, - ) + pub fn range_search(self, range: R) -> LeafRange, K, V> where Q: ?Sized + Ord, K: Borrow, R: RangeBounds, { - range_search(self, self, range) + // SAFETY: our borrow type is immutable. + unsafe { self.find_leaf_edges_spanning_range(range) } } - /// Returns (self.first_leaf_edge(), self.last_leaf_edge()), but more efficiently. - pub fn full_range( - self, - ) -> ( - Handle, K, V, marker::Leaf>, marker::Edge>, - Handle, K, V, marker::Leaf>, marker::Edge>, - ) { + /// Finds the pair of leaf edges delimiting an entire tree. + pub fn full_range(self) -> LeafRange, K, V> { full_range(self, self) } } @@ -168,33 +122,22 @@ impl<'a, K: 'a, V: 'a> NodeRef, K, V, marker::LeafOrInternal> /// /// The result is meaningful only if the tree is ordered by key, like the tree /// in a `BTreeMap` is. - pub fn range_search( - self, - range: R, - ) -> ( - Handle, K, V, marker::Leaf>, marker::Edge>, - Handle, K, V, marker::Leaf>, marker::Edge>, - ) + /// + /// # Safety + /// Do not use the duplicate handles to visit the same KV twice. + pub fn range_search(self, range: R) -> LeafRange, K, V> where Q: ?Sized + Ord, K: Borrow, R: RangeBounds, { - // We duplicate the root NodeRef here -- we will never visit the same KV - // twice, and never end up with overlapping value references. - let self2 = unsafe { ptr::read(&self) }; - range_search(self, self2, range) + unsafe { self.find_leaf_edges_spanning_range(range) } } /// Splits a unique reference into a pair of leaf edges delimiting the full range of the tree. /// The results are non-unique references allowing mutation (of values only), so must be used /// with care. - pub fn full_range( - self, - ) -> ( - Handle, K, V, marker::Leaf>, marker::Edge>, - Handle, K, V, marker::Leaf>, marker::Edge>, - ) { + pub fn full_range(self) -> LeafRange, K, V> { // We duplicate the root NodeRef here -- we will never visit the same KV // twice, and never end up with overlapping value references. let self2 = unsafe { ptr::read(&self) }; @@ -206,12 +149,7 @@ impl NodeRef { /// Splits a unique reference into a pair of leaf edges delimiting the full range of the tree. /// The results are non-unique references allowing massively destructive mutation, so must be /// used with the utmost care. - pub fn full_range( - self, - ) -> ( - Handle, marker::Edge>, - Handle, marker::Edge>, - ) { + pub fn full_range(self) -> LeafRange { // We duplicate the root NodeRef here -- we will never access it in a way // that overlaps references obtained from the root. let self2 = unsafe { ptr::read(&self) }; @@ -290,37 +228,76 @@ impl } } -macro_rules! def_next_kv_uncheched_dealloc { - { unsafe fn $name:ident : $adjacent_kv:ident } => { - /// Given a leaf edge handle into an owned tree, returns a handle to the next KV, - /// while deallocating any node left behind yet leaving the corresponding edge - /// in its parent node dangling. - /// - /// # Safety - /// - The leaf edge must not be the last one in the direction travelled. - /// - The node carrying the next KV returned must not have been deallocated by a - /// previous call on any handle obtained for this tree. - unsafe fn $name ( - leaf_edge: Handle, marker::Edge>, - ) -> Handle, marker::KV> { - let mut edge = leaf_edge.forget_node_type(); - loop { - edge = match edge.$adjacent_kv() { - Ok(internal_kv) => return internal_kv, - Err(last_edge) => { - unsafe { - let parent_edge = last_edge.into_node().deallocate_and_ascend(); - unwrap_unchecked(parent_edge).forget_node_type() - } - } +impl Handle, marker::Edge> { + /// Given a leaf edge handle into a dying tree, returns the next leaf edge + /// on the right side, and the key-value pair in between, which is either + /// in the same leaf node, in an ancestor node, or non-existent. + /// + /// This method also deallocates any node(s) it reaches the end of. This + /// implies that if no more key-value pair exists, the entire remainder of + /// the tree will have been deallocated and there is nothing left to return. + /// + /// # Safety + /// The given edge must not have been previously returned by counterpart + /// `deallocating_next_back`. + unsafe fn deallocating_next(self) -> Option<(Self, (K, V))> { + let mut edge = self.forget_node_type(); + loop { + edge = match edge.right_kv() { + Ok(kv) => { + let k = unsafe { ptr::read(kv.reborrow().into_kv().0) }; + let v = unsafe { ptr::read(kv.reborrow().into_kv().1) }; + return Some((kv.next_leaf_edge(), (k, v))); } + Err(last_edge) => match unsafe { last_edge.into_node().deallocate_and_ascend() } { + Some(parent_edge) => parent_edge.forget_node_type(), + None => return None, + }, } } - }; -} + } -def_next_kv_uncheched_dealloc! {unsafe fn next_kv_unchecked_dealloc: right_kv} -def_next_kv_uncheched_dealloc! {unsafe fn next_back_kv_unchecked_dealloc: left_kv} + /// Given a leaf edge handle into a dying tree, returns the next leaf edge + /// on the left side, and the key-value pair in between, which is either + /// in the same leaf node, in an ancestor node, or non-existent. + /// + /// This method also deallocates any node(s) it reaches the end of. This + /// implies that if no more key-value pair exists, the entire remainder of + /// the tree will have been deallocated and there is nothing left to return. + /// + /// # Safety + /// The given edge must not have been previously returned by counterpart + /// `deallocating_next`. + unsafe fn deallocating_next_back(self) -> Option<(Self, (K, V))> { + let mut edge = self.forget_node_type(); + loop { + edge = match edge.left_kv() { + Ok(kv) => { + let k = unsafe { ptr::read(kv.reborrow().into_kv().0) }; + let v = unsafe { ptr::read(kv.reborrow().into_kv().1) }; + return Some((kv.next_back_leaf_edge(), (k, v))); + } + Err(last_edge) => match unsafe { last_edge.into_node().deallocate_and_ascend() } { + Some(parent_edge) => parent_edge.forget_node_type(), + None => return None, + }, + } + } + } + + /// Deallocates a pile of nodes from the leaf up to the root. + /// This is the only way to deallocate the remainder of a tree after + /// `deallocating_next` and `deallocating_next_back` have been nibbling at + /// both sides of the tree, and have hit the same edge. As it is intended + /// only to be called when all keys and values have been returned, + /// no cleanup is done on any of the keys or values. + pub fn deallocating_end(self) { + let mut edge = self.forget_node_type(); + while let Some(parent_edge) = unsafe { edge.into_node().deallocate_and_ascend() } { + edge = parent_edge.forget_node_type(); + } + } +} impl<'a, K, V> Handle, K, V, marker::Leaf>, marker::Edge> { /// Moves the leaf edge handle to the next leaf edge and returns references to the @@ -331,7 +308,7 @@ impl<'a, K, V> Handle, K, V, marker::Leaf>, marker::Ed pub unsafe fn next_unchecked(&mut self) -> (&'a K, &'a V) { super::mem::replace(self, |leaf_edge| { let kv = leaf_edge.next_kv(); - let kv = unsafe { unwrap_unchecked(kv.ok()) }; + let kv = unsafe { kv.ok().unwrap_unchecked() }; (kv.next_leaf_edge(), kv.into_kv()) }) } @@ -344,7 +321,7 @@ impl<'a, K, V> Handle, K, V, marker::Leaf>, marker::Ed pub unsafe fn next_back_unchecked(&mut self) -> (&'a K, &'a V) { super::mem::replace(self, |leaf_edge| { let kv = leaf_edge.next_back_kv(); - let kv = unsafe { unwrap_unchecked(kv.ok()) }; + let kv = unsafe { kv.ok().unwrap_unchecked() }; (kv.next_back_leaf_edge(), kv.into_kv()) }) } @@ -359,7 +336,7 @@ impl<'a, K, V> Handle, K, V, marker::Leaf>, marker::E pub unsafe fn next_unchecked(&mut self) -> (&'a K, &'a mut V) { let kv = super::mem::replace(self, |leaf_edge| { let kv = leaf_edge.next_kv(); - let kv = unsafe { unwrap_unchecked(kv.ok()) }; + let kv = unsafe { kv.ok().unwrap_unchecked() }; (unsafe { ptr::read(&kv) }.next_leaf_edge(), kv) }); // Doing this last is faster, according to benchmarks. @@ -374,7 +351,7 @@ impl<'a, K, V> Handle, K, V, marker::Leaf>, marker::E pub unsafe fn next_back_unchecked(&mut self) -> (&'a K, &'a mut V) { let kv = super::mem::replace(self, |leaf_edge| { let kv = leaf_edge.next_back_kv(); - let kv = unsafe { unwrap_unchecked(kv.ok()) }; + let kv = unsafe { kv.ok().unwrap_unchecked() }; (unsafe { ptr::read(&kv) }.next_back_leaf_edge(), kv) }); // Doing this last is faster, according to benchmarks. @@ -395,12 +372,9 @@ impl Handle, marker::Edge> { /// The only safe way to proceed with the updated handle is to compare it, drop it, /// call this method again subject to its safety conditions, or call counterpart /// `next_back_unchecked` subject to its safety conditions. - pub unsafe fn next_unchecked(&mut self) -> (K, V) { - super::mem::replace(self, |leaf_edge| { - let kv = unsafe { next_kv_unchecked_dealloc(leaf_edge) }; - let k = unsafe { ptr::read(kv.reborrow().into_kv().0) }; - let v = unsafe { ptr::read(kv.reborrow().into_kv().1) }; - (kv.next_leaf_edge(), (k, v)) + pub unsafe fn deallocating_next_unchecked(&mut self) -> (K, V) { + super::mem::replace(self, |leaf_edge| unsafe { + leaf_edge.deallocating_next().unwrap_unchecked() }) } @@ -416,12 +390,9 @@ impl Handle, marker::Edge> { /// The only safe way to proceed with the updated handle is to compare it, drop it, /// call this method again subject to its safety conditions, or call counterpart /// `next_unchecked` subject to its safety conditions. - pub unsafe fn next_back_unchecked(&mut self) -> (K, V) { - super::mem::replace(self, |leaf_edge| { - let kv = unsafe { next_back_kv_unchecked_dealloc(leaf_edge) }; - let k = unsafe { ptr::read(kv.reborrow().into_kv().0) }; - let v = unsafe { ptr::read(kv.reborrow().into_kv().1) }; - (kv.next_back_leaf_edge(), (k, v)) + pub unsafe fn deallocating_next_back_unchecked(&mut self) -> (K, V) { + super::mem::replace(self, |leaf_edge| unsafe { + leaf_edge.deallocating_next_back().unwrap_unchecked() }) } } diff --git a/library/alloc/src/collections/btree/node.rs b/library/alloc/src/collections/btree/node.rs index 1d632512c7..9a7119470f 100644 --- a/library/alloc/src/collections/btree/node.rs +++ b/library/alloc/src/collections/btree/node.rs @@ -31,7 +31,6 @@ // since leaf edges are empty and need no data representation. In an internal node, // an edge both identifies a position and contains a pointer to a child node. -use core::cmp::Ordering; use core::marker::PhantomData; use core::mem::{self, MaybeUninit}; use core::ptr::{self, NonNull}; @@ -67,17 +66,23 @@ struct LeafNode { } impl LeafNode { - /// Creates a new `LeafNode`. Unsafe because all nodes should really be hidden behind - /// `BoxedNode`, preventing accidental dropping of uninitialized keys and values. - unsafe fn new() -> Self { - LeafNode { - // As a general policy, we leave fields uninitialized if they can be, as this should - // be both slightly faster and easier to track in Valgrind. - keys: MaybeUninit::uninit_array(), - vals: MaybeUninit::uninit_array(), - parent: None, - parent_idx: MaybeUninit::uninit(), - len: 0, + /// Initializes a new `LeafNode` in-place. + unsafe fn init(this: *mut Self) { + // As a general policy, we leave fields uninitialized if they can be, as this should + // be both slightly faster and easier to track in Valgrind. + unsafe { + // parent_idx, keys, and vals are all MaybeUninit + ptr::addr_of_mut!((*this).parent).write(None); + ptr::addr_of_mut!((*this).len).write(0); + } + } + + /// Creates a new boxed `LeafNode`. + fn new() -> Box { + unsafe { + let mut leaf = Box::new_uninit(); + LeafNode::init(leaf.as_mut_ptr()); + leaf.assume_init() } } } @@ -99,15 +104,19 @@ struct InternalNode { } impl InternalNode { - /// Creates a new `InternalNode`. + /// Creates a new boxed `InternalNode`. /// - /// This is unsafe for two reasons. First, it returns an `InternalNode` by value, risking - /// dropping of uninitialized fields. Second, an invariant of internal nodes is that `len + 1` - /// edges are initialized and valid, meaning that even when the node is empty (having a - /// `len` of 0), there must be one initialized and valid edge. This function does not set up + /// # Safety + /// An invariant of internal nodes is that they have at least one + /// initialized and valid edge. This function does not set up /// such an edge. - unsafe fn new() -> Self { - InternalNode { data: unsafe { LeafNode::new() }, edges: MaybeUninit::uninit_array() } + unsafe fn new() -> Box { + unsafe { + let mut node = Box::::new_uninit(); + // We only need to initialize the data; the edges are MaybeUninit. + LeafNode::init(ptr::addr_of_mut!((*node.as_mut_ptr()).data)); + node.assume_init() + } } } @@ -133,7 +142,7 @@ impl Root { impl NodeRef { fn new_leaf() -> Self { - Self::from_new_leaf(Box::new(unsafe { LeafNode::new() })) + Self::from_new_leaf(LeafNode::new()) } fn from_new_leaf(leaf: Box>) -> Self { @@ -143,12 +152,15 @@ impl NodeRef { impl NodeRef { fn new_internal(child: Root) -> Self { - let mut new_node = Box::new(unsafe { InternalNode::new() }); + let mut new_node = unsafe { InternalNode::new() }; new_node.edges[0].write(child.node); - NodeRef::from_new_internal(new_node, child.height + 1) + unsafe { NodeRef::from_new_internal(new_node, child.height + 1) } } - fn from_new_internal(internal: Box>, height: usize) -> Self { + /// # Safety + /// `height` must not be zero. + unsafe fn from_new_internal(internal: Box>, height: usize) -> Self { + debug_assert!(height > 0); let node = NonNull::from(Box::leak(internal)).cast(); let mut this = NodeRef { height, node, _marker: PhantomData }; this.borrow_mut().correct_all_childrens_parent_links(); @@ -169,7 +181,7 @@ impl NodeRef { NodeRef { height: self.height, node: self.node, _marker: PhantomData } } - /// Irreversibly transistions to a reference that offers traversal, + /// Irreversibly transitions to a reference that permits traversal and offers /// destructive methods and little else. pub fn into_dying(self) -> NodeRef { NodeRef { height: self.height, node: self.node, _marker: PhantomData } @@ -449,7 +461,7 @@ impl NodeRef { } } -impl<'a, K, V, Type> NodeRef, K, V, Type> { +impl<'a, K, V> NodeRef, K, V, marker::LeafOrInternal> { /// Unsafely asserts to the compiler the static information that this node is a `Leaf`. unsafe fn cast_to_leaf_unchecked(self) -> NodeRef, K, V, marker::Leaf> { debug_assert!(self.height == 0); @@ -461,7 +473,9 @@ impl<'a, K, V, Type> NodeRef, K, V, Type> { debug_assert!(self.height > 0); NodeRef { height: self.height, node: self.node, _marker: PhantomData } } +} +impl<'a, K, V, Type> NodeRef, K, V, Type> { /// Temporarily takes out another, mutable reference to the same node. Beware, as /// this method is very dangerous, doubly so since it may not immediately appear /// dangerous. @@ -730,15 +744,6 @@ impl PartialEq } } -impl PartialOrd - for Handle, HandleType> -{ - fn partial_cmp(&self, other: &Self) -> Option { - let Self { node, idx, _marker } = self; - if node.eq(&other.node) { Some(idx.cmp(&other.idx)) } else { None } - } -} - impl Handle, HandleType> { @@ -749,15 +754,17 @@ impl } } -impl<'a, K, V, NodeType, HandleType> Handle, K, V, NodeType>, HandleType> { +impl<'a, K, V, Type> Handle, K, V, marker::LeafOrInternal>, Type> { /// Unsafely asserts to the compiler the static information that the handle's node is a `Leaf`. pub unsafe fn cast_to_leaf_unchecked( self, - ) -> Handle, K, V, marker::Leaf>, HandleType> { + ) -> Handle, K, V, marker::Leaf>, Type> { let node = unsafe { self.node.cast_to_leaf_unchecked() }; Handle { node, idx: self.idx, _marker: PhantomData } } +} +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. @@ -1074,14 +1081,12 @@ impl<'a, K: 'a, V: 'a> Handle, K, V, marker::Leaf>, mark /// - All the key-value pairs to the right of this handle are put into a newly /// allocated node. pub fn split(mut self) -> SplitResult<'a, K, V, marker::Leaf> { - unsafe { - let mut new_node = Box::new(LeafNode::new()); + let mut new_node = LeafNode::new(); - let kv = self.split_leaf_data(&mut new_node); + let kv = self.split_leaf_data(&mut new_node); - let right = NodeRef::from_new_leaf(new_node); - SplitResult { left: self.node, kv, right } - } + let right = NodeRef::from_new_leaf(new_node); + SplitResult { left: self.node, kv, right } } /// Removes the key-value pair pointed to by this handle and returns it, along with the edge @@ -1110,7 +1115,7 @@ impl<'a, K: 'a, V: 'a> Handle, K, V, marker::Internal>, pub fn split(mut self) -> SplitResult<'a, K, V, marker::Internal> { let old_len = self.node.len(); unsafe { - let mut new_node = Box::new(InternalNode::new()); + let mut new_node = InternalNode::new(); let kv = self.split_leaf_data(&mut new_node.data); let new_len = usize::from(new_node.data.len); move_to_slice( @@ -1507,15 +1512,13 @@ impl Handle, marke } } -impl - Handle, HandleType> -{ +impl Handle, Type> { /// Checks whether the underlying node is an `Internal` node or a `Leaf` node. pub fn force( self, ) -> ForceResult< - Handle, HandleType>, - Handle, HandleType>, + Handle, Type>, + Handle, Type>, > { match self.node.force() { ForceResult::Leaf(node) => { diff --git a/library/alloc/src/collections/btree/node/tests.rs b/library/alloc/src/collections/btree/node/tests.rs index acb7210ca7..5e44735462 100644 --- a/library/alloc/src/collections/btree/node/tests.rs +++ b/library/alloc/src/collections/btree/node/tests.rs @@ -2,7 +2,6 @@ use super::super::navigate; use super::*; use crate::fmt::Debug; use crate::string::String; -use core::cmp::Ordering::*; impl<'a, K: 'a, V: 'a> NodeRef, K, V, marker::LeafOrInternal> { // Asserts that the back pointer in each reachable node points to its parent. @@ -67,7 +66,7 @@ fn test_splitpoint() { } #[test] -fn test_partial_cmp_eq() { +fn test_partial_eq() { let mut root1 = NodeRef::new_leaf(); root1.borrow_mut().push(1, ()); let mut root1 = NodeRef::new_internal(root1.forget_type()).forget_type(); @@ -87,13 +86,6 @@ fn test_partial_cmp_eq() { assert!(top_edge_1 == top_edge_1); assert!(top_edge_1 != top_edge_2); - assert_eq!(leaf_edge_1a.partial_cmp(&leaf_edge_1a), Some(Equal)); - assert_eq!(leaf_edge_1a.partial_cmp(&leaf_edge_1b), Some(Less)); - assert_eq!(leaf_edge_1a.partial_cmp(&top_edge_1), None); - assert_eq!(leaf_edge_1a.partial_cmp(&top_edge_2), None); - assert_eq!(top_edge_1.partial_cmp(&top_edge_1), Some(Equal)); - assert_eq!(top_edge_1.partial_cmp(&top_edge_2), None); - root1.pop_internal_level(); unsafe { root1.into_dying().deallocate_and_ascend() }; unsafe { root2.into_dying().deallocate_and_ascend() }; @@ -103,7 +95,7 @@ fn test_partial_cmp_eq() { #[cfg(target_arch = "x86_64")] fn test_sizes() { assert_eq!(core::mem::size_of::>(), 16); - assert_eq!(core::mem::size_of::>(), 16 + CAPACITY * 8 * 2); - assert_eq!(core::mem::size_of::>(), 112); - assert_eq!(core::mem::size_of::>(), 112 + CAPACITY * 8 * 2); + assert_eq!(core::mem::size_of::>(), 16 + CAPACITY * 2 * 8); + assert_eq!(core::mem::size_of::>(), 16 + (CAPACITY + 1) * 8); + assert_eq!(core::mem::size_of::>(), 16 + (CAPACITY * 3 + 1) * 8); } diff --git a/library/alloc/src/collections/btree/remove.rs b/library/alloc/src/collections/btree/remove.rs index ff842197d1..6bc1252b9c 100644 --- a/library/alloc/src/collections/btree/remove.rs +++ b/library/alloc/src/collections/btree/remove.rs @@ -1,6 +1,5 @@ use super::map::MIN_LEN; use super::node::{marker, ForceResult::*, Handle, LeftOrRight::*, NodeRef}; -use super::unwrap_unchecked; impl<'a, K: 'a, V: 'a> Handle, K, V, marker::LeafOrInternal>, marker::KV> { /// Removes a key-value pair from the tree, and returns that pair, as well as @@ -61,7 +60,9 @@ impl<'a, K: 'a, V: 'a> Handle, K, V, marker::Leaf>, mark // rearrange the parent through the grandparent, thus change the // link to the parent inside the leaf. if let Ok(parent) = unsafe { pos.reborrow_mut() }.into_node().ascend() { - parent.into_node().handle_shrunk_node_recursively(handle_emptied_internal_root); + if !parent.into_node().forget_type().fix_node_and_affected_ancestors() { + handle_emptied_internal_root(); + } } } (old_kv, pos) @@ -77,73 +78,14 @@ impl<'a, K: 'a, V: 'a> Handle, K, V, marker::Internal>, // the element we were asked to remove. Prefer the left adjacent KV, // for the reasons listed in `choose_parent_kv`. let left_leaf_kv = self.left_edge().descend().last_leaf_edge().left_kv(); - let left_leaf_kv = unsafe { unwrap_unchecked(left_leaf_kv.ok()) }; + let left_leaf_kv = unsafe { left_leaf_kv.ok().unwrap_unchecked() }; let (left_kv, left_hole) = left_leaf_kv.remove_leaf_kv(handle_emptied_internal_root); // The internal node may have been stolen from or merged. Go back right // to find where the original KV ended up. - let mut internal = unsafe { unwrap_unchecked(left_hole.next_kv().ok()) }; + let mut internal = unsafe { left_hole.next_kv().ok().unwrap_unchecked() }; let old_kv = internal.replace_kv(left_kv.0, left_kv.1); let pos = internal.next_leaf_edge(); (old_kv, pos) } } - -impl<'a, K: 'a, V: 'a> NodeRef, K, V, marker::Internal> { - /// Stocks up a possibly underfull internal node and its ancestors, - /// until it reaches an ancestor that has elements to spare or is the root. - fn handle_shrunk_node_recursively(mut self, handle_emptied_internal_root: F) { - loop { - self = match self.len() { - 0 => { - // An empty node must be the root, because length is only - // reduced by one, and non-root underfull nodes are stocked up, - // so non-root nodes never have fewer than MIN_LEN - 1 elements. - debug_assert!(self.ascend().is_err()); - handle_emptied_internal_root(); - return; - } - 1..MIN_LEN => { - if let Some(parent) = self.handle_underfull_node_locally() { - parent - } else { - return; - } - } - _ => return, - } - } - } - - /// Stocks up an underfull internal node, possibly at the cost of shrinking - /// its parent instead, which is then returned. - fn handle_underfull_node_locally( - self, - ) -> Option, K, V, marker::Internal>> { - match self.forget_type().choose_parent_kv() { - Ok(Left(mut left_parent_kv)) => { - debug_assert_eq!(left_parent_kv.right_child_len(), MIN_LEN - 1); - if left_parent_kv.can_merge() { - let parent = left_parent_kv.merge_tracking_parent(); - Some(parent) - } else { - debug_assert!(left_parent_kv.left_child_len() > MIN_LEN); - left_parent_kv.bulk_steal_left(1); - None - } - } - Ok(Right(mut right_parent_kv)) => { - debug_assert_eq!(right_parent_kv.left_child_len(), MIN_LEN - 1); - if right_parent_kv.can_merge() { - let parent = right_parent_kv.merge_tracking_parent(); - Some(parent) - } else { - debug_assert!(right_parent_kv.right_child_len() > MIN_LEN); - right_parent_kv.bulk_steal_right(1); - None - } - } - Err(_) => None, - } - } -} diff --git a/library/alloc/src/collections/btree/search.rs b/library/alloc/src/collections/btree/search.rs index f87444b7cd..5dc62d4ec7 100644 --- a/library/alloc/src/collections/btree/search.rs +++ b/library/alloc/src/collections/btree/search.rs @@ -1,10 +1,33 @@ use core::borrow::Borrow; use core::cmp::Ordering; +use core::ops::{Bound, RangeBounds}; use super::node::{marker, ForceResult::*, Handle, NodeRef}; +use SearchBound::*; use SearchResult::*; +pub enum SearchBound { + /// An inclusive bound to look for, just like `Bound::Included(T)`. + Included(T), + /// An exclusive bound to look for, just like `Bound::Excluded(T)`. + Excluded(T), + /// An unconditional inclusive bound, just like `Bound::Unbounded`. + AllIncluded, + /// An unconditional exclusive bound. + AllExcluded, +} + +impl SearchBound { + pub fn from_range(range_bound: Bound) -> Self { + match range_bound { + Bound::Included(t) => Included(t), + Bound::Excluded(t) => Excluded(t), + Bound::Unbounded => AllIncluded, + } + } +} + pub enum SearchResult { Found(Handle, marker::KV>), GoDown(Handle, marker::Edge>), @@ -40,6 +63,111 @@ impl NodeRef( + mut self, + range: &'r R, + ) -> Result< + ( + NodeRef, + usize, + usize, + SearchBound<&'r Q>, + SearchBound<&'r Q>, + ), + Handle, marker::Edge>, + > + where + Q: Ord, + K: Borrow, + R: RangeBounds, + { + // Inlining these variables should be avoided. We assume the bounds reported by `range` + // remain the same, but an adversarial implementation could change between calls (#81138). + let (start, end) = (range.start_bound(), range.end_bound()); + match (start, end) { + (Bound::Excluded(s), Bound::Excluded(e)) if s == e => { + panic!("range start and end are equal and excluded in BTreeMap") + } + (Bound::Included(s) | Bound::Excluded(s), Bound::Included(e) | Bound::Excluded(e)) + if s > e => + { + panic!("range start is greater than range end in BTreeMap") + } + _ => {} + } + let mut lower_bound = SearchBound::from_range(start); + let mut upper_bound = SearchBound::from_range(end); + loop { + let (lower_edge_idx, lower_child_bound) = self.find_lower_bound_index(lower_bound); + let (upper_edge_idx, upper_child_bound) = self.find_upper_bound_index(upper_bound); + if lower_edge_idx > upper_edge_idx { + panic!("Ord is ill-defined in BTreeMap range") + } + if lower_edge_idx < upper_edge_idx { + return Ok(( + self, + lower_edge_idx, + upper_edge_idx, + lower_child_bound, + upper_child_bound, + )); + } + let common_edge = unsafe { Handle::new_edge(self, lower_edge_idx) }; + match common_edge.force() { + Leaf(common_edge) => return Err(common_edge), + Internal(common_edge) => { + self = common_edge.descend(); + lower_bound = lower_child_bound; + upper_bound = upper_child_bound; + } + } + } + } + + /// Finds an edge in the node delimiting the lower bound of a range. + /// Also returns the lower bound to be used for continuing the search in + /// the matching child node, if `self` is an internal node. + /// + /// The result is meaningful only if the tree is ordered by key. + pub fn find_lower_bound_edge<'r, Q>( + self, + bound: SearchBound<&'r Q>, + ) -> (Handle, SearchBound<&'r Q>) + where + Q: ?Sized + Ord, + K: Borrow, + { + let (edge_idx, bound) = self.find_lower_bound_index(bound); + let edge = unsafe { Handle::new_edge(self, edge_idx) }; + (edge, bound) + } + + /// Clone of `find_lower_bound_edge` for the upper bound. + pub fn find_upper_bound_edge<'r, Q>( + self, + bound: SearchBound<&'r Q>, + ) -> (Handle, SearchBound<&'r Q>) + where + Q: ?Sized + Ord, + K: Borrow, + { + let (edge_idx, bound) = self.find_upper_bound_index(bound); + let edge = unsafe { Handle::new_edge(self, edge_idx) }; + (edge, bound) + } } impl NodeRef { @@ -55,7 +183,7 @@ impl NodeRef { Q: Ord, K: Borrow, { - match self.find_index(key) { + match self.find_key_index(key) { IndexResult::KV(idx) => Found(unsafe { Handle::new_kv(self, idx) }), IndexResult::Edge(idx) => GoDown(unsafe { Handle::new_edge(self, idx) }), } @@ -66,7 +194,7 @@ impl NodeRef { /// /// The result is meaningful only if the tree is ordered by key, like the tree /// in a `BTreeMap` is. - fn find_index(&self, key: &Q) -> IndexResult + fn find_key_index(&self, key: &Q) -> IndexResult where Q: Ord, K: Borrow, @@ -82,4 +210,54 @@ impl NodeRef { } IndexResult::Edge(keys.len()) } + + /// Finds an edge index in the node delimiting the lower bound of a range. + /// Also returns the lower bound to be used for continuing the search in + /// the matching child node, if `self` is an internal node. + /// + /// The result is meaningful only if the tree is ordered by key. + fn find_lower_bound_index<'r, Q>( + &self, + bound: SearchBound<&'r Q>, + ) -> (usize, SearchBound<&'r Q>) + where + Q: ?Sized + Ord, + K: Borrow, + { + match bound { + Included(key) => match self.find_key_index(key) { + IndexResult::KV(idx) => (idx, AllExcluded), + IndexResult::Edge(idx) => (idx, bound), + }, + Excluded(key) => match self.find_key_index(key) { + IndexResult::KV(idx) => (idx + 1, AllIncluded), + IndexResult::Edge(idx) => (idx, bound), + }, + AllIncluded => (0, AllIncluded), + AllExcluded => (self.len(), AllExcluded), + } + } + + /// Clone of `find_lower_bound_index` for the upper bound. + fn find_upper_bound_index<'r, Q>( + &self, + bound: SearchBound<&'r Q>, + ) -> (usize, SearchBound<&'r Q>) + where + Q: ?Sized + Ord, + K: Borrow, + { + match bound { + Included(key) => match self.find_key_index(key) { + IndexResult::KV(idx) => (idx + 1, AllExcluded), + IndexResult::Edge(idx) => (idx, bound), + }, + Excluded(key) => match self.find_key_index(key) { + IndexResult::KV(idx) => (idx, AllIncluded), + IndexResult::Edge(idx) => (idx, bound), + }, + AllIncluded => (self.len(), AllIncluded), + AllExcluded => (0, AllExcluded), + } + } } diff --git a/library/alloc/src/collections/btree/set.rs b/library/alloc/src/collections/btree/set.rs index be4e50119c..a331b8d8e4 100644 --- a/library/alloc/src/collections/btree/set.rs +++ b/library/alloc/src/collections/btree/set.rs @@ -61,6 +61,7 @@ use super::Recover; /// ``` #[derive(Hash, PartialEq, Eq, Ord, PartialOrd)] #[stable(feature = "rust1", since = "1.0.0")] +#[cfg_attr(not(test), rustc_diagnostic_item = "BTreeSet")] pub struct BTreeSet { map: BTreeMap, } @@ -457,10 +458,7 @@ impl BTreeSet { /// assert!(v.is_empty()); /// ``` #[stable(feature = "rust1", since = "1.0.0")] - pub fn clear(&mut self) - where - T: Ord, - { + pub fn clear(&mut self) { self.map.clear() } @@ -652,12 +650,12 @@ impl BTreeSet { /// #![feature(map_first_last)] /// use std::collections::BTreeSet; /// - /// let mut map = BTreeSet::new(); - /// assert_eq!(map.first(), None); - /// map.insert(1); - /// assert_eq!(map.first(), Some(&1)); - /// map.insert(2); - /// assert_eq!(map.first(), Some(&1)); + /// let mut set = BTreeSet::new(); + /// assert_eq!(set.first(), None); + /// set.insert(1); + /// assert_eq!(set.first(), Some(&1)); + /// set.insert(2); + /// assert_eq!(set.first(), Some(&1)); /// ``` #[unstable(feature = "map_first_last", issue = "62924")] pub fn first(&self) -> Option<&T> @@ -678,12 +676,12 @@ impl BTreeSet { /// #![feature(map_first_last)] /// use std::collections::BTreeSet; /// - /// let mut map = BTreeSet::new(); - /// assert_eq!(map.first(), None); - /// map.insert(1); - /// assert_eq!(map.last(), Some(&1)); - /// map.insert(2); - /// assert_eq!(map.last(), Some(&2)); + /// let mut set = BTreeSet::new(); + /// assert_eq!(set.last(), None); + /// set.insert(1); + /// assert_eq!(set.last(), Some(&1)); + /// set.insert(2); + /// assert_eq!(set.last(), Some(&2)); /// ``` #[unstable(feature = "map_first_last", issue = "62924")] pub fn last(&self) -> Option<&T> diff --git a/library/alloc/src/collections/btree/set/tests.rs b/library/alloc/src/collections/btree/set/tests.rs index 79e469eb0d..4cb6e3d661 100644 --- a/library/alloc/src/collections/btree/set/tests.rs +++ b/library/alloc/src/collections/btree/set/tests.rs @@ -1,10 +1,10 @@ -use super::super::DeterministicRng; +use super::super::testing::crash_test::{CrashTestDummy, Panic}; +use super::super::testing::rng::DeterministicRng; use super::*; use crate::vec::Vec; use std::cmp::Ordering; use std::iter::FromIterator; use std::panic::{catch_unwind, AssertUnwindSafe}; -use std::sync::atomic::{AtomicU32, Ordering::SeqCst}; #[test] fn test_clone_eq() { @@ -349,70 +349,45 @@ fn test_drain_filter() { #[test] fn test_drain_filter_drop_panic_leak() { - static PREDS: AtomicU32 = AtomicU32::new(0); - static DROPS: AtomicU32 = AtomicU32::new(0); - - #[derive(PartialEq, Eq, PartialOrd, Ord)] - struct D(i32); - impl Drop for D { - fn drop(&mut self) { - if DROPS.fetch_add(1, SeqCst) == 1 { - panic!("panic in `drop`"); - } - } - } - + let a = CrashTestDummy::new(0); + let b = CrashTestDummy::new(1); + let c = CrashTestDummy::new(2); let mut set = BTreeSet::new(); - set.insert(D(0)); - set.insert(D(4)); - set.insert(D(8)); + set.insert(a.spawn(Panic::Never)); + set.insert(b.spawn(Panic::InDrop)); + set.insert(c.spawn(Panic::Never)); - catch_unwind(move || { - drop(set.drain_filter(|d| { - PREDS.fetch_add(1u32 << d.0, SeqCst); - true - })) - }) - .ok(); + catch_unwind(move || drop(set.drain_filter(|dummy| dummy.query(true)))).ok(); - assert_eq!(PREDS.load(SeqCst), 0x011); - assert_eq!(DROPS.load(SeqCst), 3); + assert_eq!(a.queried(), 1); + assert_eq!(b.queried(), 1); + assert_eq!(c.queried(), 0); + assert_eq!(a.dropped(), 1); + assert_eq!(b.dropped(), 1); + assert_eq!(c.dropped(), 1); } #[test] fn test_drain_filter_pred_panic_leak() { - static PREDS: AtomicU32 = AtomicU32::new(0); - static DROPS: AtomicU32 = AtomicU32::new(0); - - #[derive(PartialEq, Eq, PartialOrd, Ord)] - struct D(i32); - impl Drop for D { - fn drop(&mut self) { - DROPS.fetch_add(1, SeqCst); - } - } - + let a = CrashTestDummy::new(0); + let b = CrashTestDummy::new(1); + let c = CrashTestDummy::new(2); let mut set = BTreeSet::new(); - set.insert(D(0)); - set.insert(D(4)); - set.insert(D(8)); - - catch_unwind(AssertUnwindSafe(|| { - drop(set.drain_filter(|d| { - PREDS.fetch_add(1u32 << d.0, SeqCst); - match d.0 { - 0 => true, - _ => panic!(), - } - })) - })) - .ok(); - - assert_eq!(PREDS.load(SeqCst), 0x011); - assert_eq!(DROPS.load(SeqCst), 1); + set.insert(a.spawn(Panic::Never)); + set.insert(b.spawn(Panic::InQuery)); + set.insert(c.spawn(Panic::InQuery)); + + catch_unwind(AssertUnwindSafe(|| drop(set.drain_filter(|dummy| dummy.query(true))))).ok(); + + assert_eq!(a.queried(), 1); + assert_eq!(b.queried(), 1); + assert_eq!(c.queried(), 0); + assert_eq!(a.dropped(), 1); + assert_eq!(b.dropped(), 0); + assert_eq!(c.dropped(), 0); assert_eq!(set.len(), 2); - assert_eq!(set.first().unwrap().0, 4); - assert_eq!(set.last().unwrap().0, 8); + assert_eq!(set.first().unwrap().id(), 1); + assert_eq!(set.last().unwrap().id(), 2); } #[test] @@ -641,9 +616,10 @@ fn test_send() { #[allow(dead_code)] fn test_ord_absence() { - fn set(set: BTreeSet) { + fn set(mut set: BTreeSet) { set.is_empty(); set.len(); + set.clear(); set.iter(); set.into_iter(); } diff --git a/library/alloc/src/collections/btree/split.rs b/library/alloc/src/collections/btree/split.rs index 62c5e3a46d..bec495a72a 100644 --- a/library/alloc/src/collections/btree/split.rs +++ b/library/alloc/src/collections/btree/split.rs @@ -1,111 +1,72 @@ -use super::map::MIN_LEN; use super::node::{ForceResult::*, Root}; use super::search::SearchResult::*; use core::borrow::Borrow; impl Root { - pub fn split_off(&mut self, right_root: &mut Self, key: &Q) + /// Calculates the length of both trees that result from splitting up + /// a given number of distinct key-value pairs. + pub fn calc_split_length( + total_num: usize, + root_a: &Root, + root_b: &Root, + ) -> (usize, usize) { + let (length_a, length_b); + if root_a.height() < root_b.height() { + length_a = root_a.reborrow().calc_length(); + length_b = total_num - length_a; + debug_assert_eq!(length_b, root_b.reborrow().calc_length()); + } else { + length_b = root_b.reborrow().calc_length(); + length_a = total_num - length_b; + debug_assert_eq!(length_a, root_a.reborrow().calc_length()); + } + (length_a, length_b) + } + + /// Split off a tree with key-value pairs at and after the given key. + /// The result is meaningful only if the tree is ordered by key, + /// and if the ordering of `Q` corresponds to that of `K`. + /// If `self` respects all `BTreeMap` tree invariants, then both + /// `self` and the returned tree will respect those invariants. + pub fn split_off(&mut self, key: &Q) -> Self where K: Borrow, { - debug_assert!(right_root.height() == 0); - debug_assert!(right_root.len() == 0); - let left_root = self; - for _ in 0..left_root.height() { - right_root.push_internal_level(); - } - - { - let mut left_node = left_root.borrow_mut(); - let mut right_node = right_root.borrow_mut(); - - loop { - let mut split_edge = match left_node.search_node(key) { - // key is going to the right tree - Found(kv) => kv.left_edge(), - GoDown(edge) => edge, - }; - - split_edge.move_suffix(&mut right_node); - - match (split_edge.force(), right_node.force()) { - (Internal(edge), Internal(node)) => { - left_node = edge.descend(); - right_node = node.first_edge().descend(); - } - (Leaf(_), Leaf(_)) => { - break; - } - _ => unreachable!(), + let mut right_root = Root::new_pillar(left_root.height()); + let mut left_node = left_root.borrow_mut(); + let mut right_node = right_root.borrow_mut(); + + loop { + let mut split_edge = match left_node.search_node(key) { + // key is going to the right tree + Found(kv) => kv.left_edge(), + GoDown(edge) => edge, + }; + + split_edge.move_suffix(&mut right_node); + + match (split_edge.force(), right_node.force()) { + (Internal(edge), Internal(node)) => { + left_node = edge.descend(); + right_node = node.first_edge().descend(); } + (Leaf(_), Leaf(_)) => break, + _ => unreachable!(), } } left_root.fix_right_border(); right_root.fix_left_border(); + right_root } - /// Removes empty levels on the top, but keeps an empty leaf if the entire tree is empty. - fn fix_top(&mut self) { - while self.height() > 0 && self.len() == 0 { - self.pop_internal_level(); + /// Creates a tree consisting of empty nodes. + fn new_pillar(height: usize) -> Self { + let mut root = Root::new(); + for _ in 0..height { + root.push_internal_level(); } - } - - /// Stock up or merge away any underfull nodes on the right border of the - /// tree. The other nodes, those that are not the root nor a rightmost edge, - /// must already have at least MIN_LEN elements. - fn fix_right_border(&mut self) { - self.fix_top(); - - { - let mut cur_node = self.borrow_mut(); - - while let Internal(node) = cur_node.force() { - let mut last_kv = node.last_kv().consider_for_balancing(); - - if last_kv.can_merge() { - cur_node = last_kv.merge_tracking_child(); - } else { - let right_len = last_kv.right_child_len(); - // `MIN_LEN + 1` to avoid readjust if merge happens on the next level. - if right_len < MIN_LEN + 1 { - last_kv.bulk_steal_left(MIN_LEN + 1 - right_len); - } - cur_node = last_kv.into_right_child(); - } - debug_assert!(cur_node.len() > MIN_LEN); - } - } - - self.fix_top(); - } - - /// The symmetric clone of `fix_right_border`. - fn fix_left_border(&mut self) { - self.fix_top(); - - { - let mut cur_node = self.borrow_mut(); - - while let Internal(node) = cur_node.force() { - let mut first_kv = node.first_kv().consider_for_balancing(); - - if first_kv.can_merge() { - cur_node = first_kv.merge_tracking_child(); - } else { - let left_len = first_kv.left_child_len(); - // `MIN_LEN + 1` to avoid readjust if merge happens on the next level. - if left_len < MIN_LEN + 1 { - first_kv.bulk_steal_right(MIN_LEN + 1 - left_len); - } - cur_node = first_kv.into_left_child(); - } - debug_assert!(cur_node.len() > MIN_LEN); - } - } - - self.fix_top(); + root } } diff --git a/library/alloc/src/collections/btree/testing/crash_test.rs b/library/alloc/src/collections/btree/testing/crash_test.rs new file mode 100644 index 0000000000..b2527b95f5 --- /dev/null +++ b/library/alloc/src/collections/btree/testing/crash_test.rs @@ -0,0 +1,119 @@ +use crate::fmt::Debug; +use std::cmp::Ordering; +use std::sync::atomic::{AtomicUsize, Ordering::SeqCst}; + +/// A blueprint for crash test dummy instances that monitor particular events. +/// Some instances may be configured to panic at some point. +/// Events are `clone`, `drop` or some anonymous `query`. +/// +/// Crash test dummies are identified and ordered by an id, so they can be used +/// as keys in a BTreeMap. The implementation intentionally uses does not rely +/// on anything defined in the crate, apart from the `Debug` trait. +#[derive(Debug)] +pub struct CrashTestDummy { + id: usize, + cloned: AtomicUsize, + dropped: AtomicUsize, + queried: AtomicUsize, +} + +impl CrashTestDummy { + /// Creates a crash test dummy design. The `id` determines order and equality of instances. + pub fn new(id: usize) -> CrashTestDummy { + CrashTestDummy { + id, + cloned: AtomicUsize::new(0), + dropped: AtomicUsize::new(0), + queried: AtomicUsize::new(0), + } + } + + /// Creates an instance of a crash test dummy that records what events it experiences + /// and optionally panics. + pub fn spawn(&self, panic: Panic) -> Instance<'_> { + Instance { origin: self, panic } + } + + /// Returns how many times instances of the dummy have been cloned. + pub fn cloned(&self) -> usize { + self.cloned.load(SeqCst) + } + + /// Returns how many times instances of the dummy have been dropped. + pub fn dropped(&self) -> usize { + self.dropped.load(SeqCst) + } + + /// Returns how many times instances of the dummy have had their `query` member invoked. + pub fn queried(&self) -> usize { + self.queried.load(SeqCst) + } +} + +#[derive(Debug)] +pub struct Instance<'a> { + origin: &'a CrashTestDummy, + panic: Panic, +} + +#[derive(Copy, Clone, Debug, PartialEq, Eq)] +pub enum Panic { + Never, + InClone, + InDrop, + InQuery, +} + +impl Instance<'_> { + pub fn id(&self) -> usize { + self.origin.id + } + + /// Some anonymous query, the result of which is already given. + pub fn query(&self, result: R) -> R { + self.origin.queried.fetch_add(1, SeqCst); + if self.panic == Panic::InQuery { + panic!("panic in `query`"); + } + result + } +} + +impl Clone for Instance<'_> { + fn clone(&self) -> Self { + self.origin.cloned.fetch_add(1, SeqCst); + if self.panic == Panic::InClone { + panic!("panic in `clone`"); + } + Self { origin: self.origin, panic: Panic::Never } + } +} + +impl Drop for Instance<'_> { + fn drop(&mut self) { + self.origin.dropped.fetch_add(1, SeqCst); + if self.panic == Panic::InDrop { + panic!("panic in `drop`"); + } + } +} + +impl PartialOrd for Instance<'_> { + fn partial_cmp(&self, other: &Self) -> Option { + self.id().partial_cmp(&other.id()) + } +} + +impl Ord for Instance<'_> { + fn cmp(&self, other: &Self) -> Ordering { + self.id().cmp(&other.id()) + } +} + +impl PartialEq for Instance<'_> { + fn eq(&self, other: &Self) -> bool { + self.id().eq(&other.id()) + } +} + +impl Eq for Instance<'_> {} diff --git a/library/alloc/src/collections/btree/testing/mod.rs b/library/alloc/src/collections/btree/testing/mod.rs new file mode 100644 index 0000000000..7a094f8a59 --- /dev/null +++ b/library/alloc/src/collections/btree/testing/mod.rs @@ -0,0 +1,3 @@ +pub mod crash_test; +pub mod ord_chaos; +pub mod rng; diff --git a/library/alloc/src/collections/btree/map/tests/ord_chaos.rs b/library/alloc/src/collections/btree/testing/ord_chaos.rs similarity index 100% rename from library/alloc/src/collections/btree/map/tests/ord_chaos.rs rename to library/alloc/src/collections/btree/testing/ord_chaos.rs diff --git a/library/alloc/src/collections/btree/testing/rng.rs b/library/alloc/src/collections/btree/testing/rng.rs new file mode 100644 index 0000000000..ecf543bee0 --- /dev/null +++ b/library/alloc/src/collections/btree/testing/rng.rs @@ -0,0 +1,28 @@ +/// XorShiftRng +pub struct DeterministicRng { + count: usize, + x: u32, + y: u32, + z: u32, + w: u32, +} + +impl DeterministicRng { + pub fn new() -> Self { + DeterministicRng { count: 0, x: 0x193a6754, y: 0xa8a7d469, z: 0x97830e05, w: 0x113ba7bb } + } + + /// Guarantees that each returned number is unique. + pub fn next(&mut self) -> u32 { + self.count += 1; + assert!(self.count <= 70029); + let x = self.x; + let t = x ^ (x << 11); + self.x = self.y; + self.y = self.z; + self.z = self.w; + let w_ = self.w; + self.w = w_ ^ (w_ >> 19) ^ (t ^ (t >> 8)); + self.w + } +} diff --git a/library/alloc/src/collections/linked_list.rs b/library/alloc/src/collections/linked_list.rs index 397e774f1a..a5481fd175 100644 --- a/library/alloc/src/collections/linked_list.rs +++ b/library/alloc/src/collections/linked_list.rs @@ -35,6 +35,7 @@ mod tests; /// array-based containers are generally faster, /// more memory efficient, and make better use of CPU cache. #[stable(feature = "rust1", since = "1.0.0")] +#[cfg_attr(not(test), rustc_diagnostic_item = "LinkedList")] pub struct LinkedList { head: Option>>, tail: Option>>, diff --git a/library/alloc/src/collections/vec_deque/mod.rs b/library/alloc/src/collections/vec_deque/mod.rs index eb89946819..7a0de74eb2 100644 --- a/library/alloc/src/collections/vec_deque/mod.rs +++ b/library/alloc/src/collections/vec_deque/mod.rs @@ -1063,7 +1063,7 @@ impl VecDeque { where R: RangeBounds, { - let Range { start, end } = range.assert_len(self.len()); + let Range { start, end } = slice::range(range, ..self.len()); let tail = self.wrap_add(self.tail, start); let head = self.wrap_add(self.tail, end); (tail, head) @@ -2783,27 +2783,26 @@ impl From> for VecDeque { /// This avoids reallocating where possible, but the conditions for that are /// strict, and subject to change, and so shouldn't be relied upon unless the /// `Vec` came from `From>` and hasn't been reallocated. - fn from(other: Vec) -> Self { - unsafe { - let mut other = ManuallyDrop::new(other); - let other_buf = other.as_mut_ptr(); - let mut buf = RawVec::from_raw_parts(other_buf, other.capacity()); - let len = other.len(); - - // 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. - // We check if `T` is a ZST in the first condition, - // because `usize::MAX` (the capacity returned by `capacity()` for ZST) - // is not a power of two and thus it'll always try - // to reserve more memory which will panic for ZST (rust-lang/rust#78532) - if (!buf.capacity().is_power_of_two() && mem::size_of::() != 0) - || (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); + fn from(mut other: Vec) -> Self { + let len = other.len(); + if mem::size_of::() == 0 { + // There's no actual allocation for ZSTs to worry about capacity, + // but `VecDeque` can't handle as much length as `Vec`. + assert!(len < MAXIMUM_ZST_CAPACITY, "capacity overflow"); + } else { + // We need to resize if the capacity is not a power of two, too small or + // doesn't have at least one free space. We do this while it's still in + // the `Vec` so the items will drop on panic. + let min_cap = cmp::max(MINIMUM_CAPACITY, len) + 1; + let cap = cmp::max(min_cap, other.capacity()).next_power_of_two(); + if other.capacity() != cap { + other.reserve_exact(cap - len); } + } + unsafe { + let (other_buf, len, capacity) = other.into_raw_parts(); + let buf = RawVec::from_raw_parts(other_buf, capacity); VecDeque { tail: 0, head: len, buf } } } diff --git a/library/alloc/src/collections/vec_deque/tests.rs b/library/alloc/src/collections/vec_deque/tests.rs index 87e06fa394..6116cfe1d0 100644 --- a/library/alloc/src/collections/vec_deque/tests.rs +++ b/library/alloc/src/collections/vec_deque/tests.rs @@ -457,6 +457,21 @@ fn test_from_vec() { assert!(vd.into_iter().eq(vec)); } } + + let vec = Vec::from([(); MAXIMUM_ZST_CAPACITY - 1]); + let vd = VecDeque::from(vec.clone()); + assert!(vd.cap().is_power_of_two()); + assert_eq!(vd.len(), vec.len()); +} + +#[test] +#[should_panic = "capacity overflow"] +fn test_from_vec_zst_overflow() { + use crate::vec::Vec; + let vec = Vec::from([(); MAXIMUM_ZST_CAPACITY]); + let vd = VecDeque::from(vec.clone()); // no room for +1 + assert!(vd.cap().is_power_of_two()); + assert_eq!(vd.len(), vec.len()); } #[test] diff --git a/library/alloc/src/lib.rs b/library/alloc/src/lib.rs index a49979fb7a..bde75031f6 100644 --- a/library/alloc/src/lib.rs +++ b/library/alloc/src/lib.rs @@ -92,6 +92,7 @@ #![feature(const_fn)] #![feature(cow_is_borrowed)] #![feature(const_cow_is_borrowed)] +#![feature(destructuring_assignment)] #![feature(dispatch_from_dyn)] #![feature(core_intrinsics)] #![feature(dropck_eyepatch)] @@ -103,6 +104,11 @@ #![feature(fundamental)] #![feature(inplace_iteration)] #![feature(int_bits_const)] +// Technically, this is a bug in rustdoc: rustdoc sees the documentation on `#[lang = slice_alloc]` +// blocks is for `&[T]`, which also has documentation using this feature in `core`, and gets mad +// that the feature-gate isn't enabled. Ideally, it wouldn't check for the feature gate for docs +// from other crates, but since this can only appear for lang items, it doesn't seem worth fixing. +#![feature(intra_doc_pointers)] #![feature(lang_items)] #![feature(layout_for_ptr)] #![feature(maybe_uninit_ref)] @@ -111,23 +117,23 @@ #![feature(nll)] #![feature(nonnull_slice_from_raw_parts)] #![feature(auto_traits)] +#![feature(option_result_unwrap_unchecked)] #![feature(or_patterns)] #![feature(pattern)] #![feature(ptr_internals)] -#![feature(range_bounds_assert_len)] #![feature(rustc_attrs)] #![feature(receiver_trait)] -#![cfg_attr(bootstrap, feature(min_const_generics))] #![feature(min_specialization)] #![feature(set_ptr_value)] #![feature(slice_ptr_get)] #![feature(slice_ptr_len)] +#![feature(slice_range)] #![feature(staged_api)] #![feature(str_internals)] #![feature(trusted_len)] #![feature(unboxed_closures)] #![feature(unicode_internals)] -#![feature(unsafe_block_in_unsafe_fn)] +#![cfg_attr(bootstrap, feature(unsafe_block_in_unsafe_fn))] #![feature(unsize)] #![feature(unsized_fn_params)] #![feature(allocator_internals)] @@ -136,7 +142,8 @@ #![feature(alloc_layout_extra)] #![feature(trusted_random_access)] #![feature(try_trait)] -#![feature(type_alias_impl_trait)] +#![cfg_attr(bootstrap, feature(type_alias_impl_trait))] +#![cfg_attr(not(bootstrap), feature(min_type_alias_impl_trait))] #![feature(associated_type_bounds)] #![feature(slice_group_by)] #![feature(decl_macro)] diff --git a/library/alloc/src/macros.rs b/library/alloc/src/macros.rs index a64a8b32ad..6a64587a22 100644 --- a/library/alloc/src/macros.rs +++ b/library/alloc/src/macros.rs @@ -107,6 +107,7 @@ macro_rules! vec { /// ``` #[macro_export] #[stable(feature = "rust1", since = "1.0.0")] +#[cfg_attr(not(test), rustc_diagnostic_item = "format_macro")] macro_rules! format { ($($arg:tt)*) => {{ let res = $crate::fmt::format($crate::__export::format_args!($($arg)*)); diff --git a/library/alloc/src/rc.rs b/library/alloc/src/rc.rs index f67f5fc533..dac4acc469 100644 --- a/library/alloc/src/rc.rs +++ b/library/alloc/src/rc.rs @@ -1652,6 +1652,16 @@ impl From for Rc { #[stable(feature = "shared_from_slice", since = "1.21.0")] impl From<&[T]> for Rc<[T]> { + /// Allocate a reference-counted slice and fill it by cloning `v`'s items. + /// + /// # Example + /// + /// ``` + /// # use std::rc::Rc; + /// let original: &[i32] = &[1, 2, 3]; + /// let shared: Rc<[i32]> = Rc::from(original); + /// assert_eq!(&[1, 2, 3], &shared[..]); + /// ``` #[inline] fn from(v: &[T]) -> Rc<[T]> { >::from_slice(v) @@ -1660,6 +1670,15 @@ impl From<&[T]> for Rc<[T]> { #[stable(feature = "shared_from_slice", since = "1.21.0")] impl From<&str> for Rc { + /// Allocate a reference-counted string slice and copy `v` into it. + /// + /// # Example + /// + /// ``` + /// # use std::rc::Rc; + /// let shared: Rc = Rc::from("statue"); + /// assert_eq!("statue", &shared[..]); + /// ``` #[inline] fn from(v: &str) -> Rc { let rc = Rc::<[u8]>::from(v.as_bytes()); @@ -1669,6 +1688,16 @@ impl From<&str> for Rc { #[stable(feature = "shared_from_slice", since = "1.21.0")] impl From for Rc { + /// Allocate a reference-counted string slice and copy `v` into it. + /// + /// # Example + /// + /// ``` + /// # use std::rc::Rc; + /// let original: String = "statue".to_owned(); + /// let shared: Rc = Rc::from(original); + /// assert_eq!("statue", &shared[..]); + /// ``` #[inline] fn from(v: String) -> Rc { Rc::from(&v[..]) @@ -1677,6 +1706,16 @@ impl From for Rc { #[stable(feature = "shared_from_slice", since = "1.21.0")] impl From> for Rc { + /// Move a boxed object to a new, reference counted, allocation. + /// + /// # Example + /// + /// ``` + /// # use std::rc::Rc; + /// let original: Box = Box::new(1); + /// let shared: Rc = Rc::from(original); + /// assert_eq!(1, *shared); + /// ``` #[inline] fn from(v: Box) -> Rc { Rc::from_box(v) @@ -1685,6 +1724,16 @@ impl From> for Rc { #[stable(feature = "shared_from_slice", since = "1.21.0")] impl From> for Rc<[T]> { + /// Allocate a reference-counted slice and move `v`'s items into it. + /// + /// # Example + /// + /// ``` + /// # use std::rc::Rc; + /// let original: Box> = Box::new(vec![1, 2, 3]); + /// let shared: Rc> = Rc::from(original); + /// assert_eq!(vec![1, 2, 3], *shared); + /// ``` #[inline] fn from(mut v: Vec) -> Rc<[T]> { unsafe { diff --git a/library/alloc/src/slice.rs b/library/alloc/src/slice.rs index cb015b9493..8cd4ef7a14 100644 --- a/library/alloc/src/slice.rs +++ b/library/alloc/src/slice.rs @@ -1,6 +1,6 @@ //! A dynamically-sized view into a contiguous sequence, `[T]`. //! -//! *[See also the slice primitive type](../../std/primitive.slice.html).* +//! *[See also the slice primitive type](slice).* //! //! Slices are a view into a block of memory represented as a pointer and a //! length. @@ -71,12 +71,12 @@ //! [`.chunks`], [`.windows`] and more. //! //! [`Hash`]: core::hash::Hash -//! [`.iter`]: ../../std/primitive.slice.html#method.iter -//! [`.iter_mut`]: ../../std/primitive.slice.html#method.iter_mut -//! [`.split`]: ../../std/primitive.slice.html#method.split -//! [`.splitn`]: ../../std/primitive.slice.html#method.splitn -//! [`.chunks`]: ../../std/primitive.slice.html#method.chunks -//! [`.windows`]: ../../std/primitive.slice.html#method.windows +//! [`.iter`]: slice::iter +//! [`.iter_mut`]: slice::iter_mut +//! [`.split`]: slice::split +//! [`.splitn`]: slice::splitn +//! [`.chunks`]: slice::chunks +//! [`.windows`]: slice::windows #![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. @@ -92,6 +92,8 @@ use crate::borrow::ToOwned; use crate::boxed::Box; use crate::vec::Vec; +#[unstable(feature = "slice_range", issue = "76393")] +pub use core::slice::range; #[unstable(feature = "array_chunks", issue = "74985")] pub use core::slice::ArrayChunks; #[unstable(feature = "array_chunks", issue = "74985")] @@ -220,6 +222,7 @@ mod hack { } #[lang = "slice_alloc"] +#[cfg_attr(not(test), rustc_diagnostic_item = "slice")] #[cfg(not(test))] impl [T] { /// Sorts the slice. @@ -228,7 +231,7 @@ impl [T] { /// /// When applicable, unstable sorting is preferred because it is generally faster than stable /// sorting and it doesn't allocate auxiliary memory. - /// See [`sort_unstable`](#method.sort_unstable). + /// See [`sort_unstable`](slice::sort_unstable). /// /// # Current implementation /// @@ -279,7 +282,7 @@ impl [T] { /// /// When applicable, unstable sorting is preferred because it is generally faster than stable /// sorting and it doesn't allocate auxiliary memory. - /// See [`sort_unstable_by`](#method.sort_unstable_by). + /// See [`sort_unstable_by`](slice::sort_unstable_by). /// /// # Current implementation /// @@ -317,12 +320,12 @@ impl [T] { /// worst-case, where the key function is *O*(*m*). /// /// For expensive key functions (e.g. functions that are not simple property accesses or - /// basic operations), [`sort_by_cached_key`](#method.sort_by_cached_key) is likely to be + /// basic operations), [`sort_by_cached_key`](slice::sort_by_cached_key) is likely to be /// significantly faster, as it does not recompute element keys. /// /// When applicable, unstable sorting is preferred because it is generally faster than stable /// sorting and it doesn't allocate auxiliary memory. - /// See [`sort_unstable_by_key`](#method.sort_unstable_by_key). + /// See [`sort_unstable_by_key`](slice::sort_unstable_by_key). /// /// # Current implementation /// @@ -360,7 +363,7 @@ impl [T] { /// worst-case, where the key function is *O*(*m*). /// /// For simple key functions (e.g., functions that are property accesses or - /// basic operations), [`sort_by_key`](#method.sort_by_key) is likely to be + /// basic operations), [`sort_by_key`](slice::sort_by_key) is likely to be /// faster. /// /// # Current implementation @@ -670,7 +673,7 @@ impl [u8] { // Extension traits for slices over specific kinds of data //////////////////////////////////////////////////////////////////////////////// -/// Helper trait for [`[T]::concat`](../../std/primitive.slice.html#method.concat). +/// Helper trait for [`[T]::concat`](slice::concat). /// /// Note: the `Item` type parameter is not used in this trait, /// but it allows impls to be more generic. @@ -705,19 +708,19 @@ pub trait Concat { /// The resulting type after concatenation type Output; - /// Implementation of [`[T]::concat`](../../std/primitive.slice.html#method.concat) + /// Implementation of [`[T]::concat`](slice::concat) #[unstable(feature = "slice_concat_trait", issue = "27747")] fn concat(slice: &Self) -> Self::Output; } -/// Helper trait for [`[T]::join`](../../std/primitive.slice.html#method.join) +/// Helper trait for [`[T]::join`](slice::join) #[unstable(feature = "slice_concat_trait", issue = "27747")] pub trait Join { #[unstable(feature = "slice_concat_trait", issue = "27747")] /// The resulting type after concatenation type Output; - /// Implementation of [`[T]::join`](../../std/primitive.slice.html#method.join) + /// Implementation of [`[T]::join`](slice::join) #[unstable(feature = "slice_concat_trait", issue = "27747")] fn join(slice: &Self, sep: Separator) -> Self::Output; } diff --git a/library/alloc/src/str.rs b/library/alloc/src/str.rs index 70e0c7dba5..8c64bc0801 100644 --- a/library/alloc/src/str.rs +++ b/library/alloc/src/str.rs @@ -1,6 +1,6 @@ //! Unicode string slices. //! -//! *[See also the `str` primitive type](../../std/primitive.str.html).* +//! *[See also the `str` primitive type](str).* //! //! The `&str` type is one of the two main string types, the other being `String`. //! Unlike its `String` counterpart, its contents are borrowed. diff --git a/library/alloc/src/string.rs b/library/alloc/src/string.rs index 3218b3535c..019b17a594 100644 --- a/library/alloc/src/string.rs +++ b/library/alloc/src/string.rs @@ -49,6 +49,7 @@ use core::iter::{FromIterator, FusedIterator}; use core::ops::Bound::{Excluded, Included, Unbounded}; use core::ops::{self, Add, AddAssign, Index, IndexMut, Range, RangeBounds}; use core::ptr; +use core::slice; use core::str::{lossy, pattern::Pattern}; use crate::borrow::{Cow, ToOwned}; @@ -494,7 +495,7 @@ impl String { /// `from_utf8_lossy()` will replace any invalid UTF-8 sequences with /// [`U+FFFD REPLACEMENT CHARACTER`][U+FFFD], which looks like this: � /// - /// [byteslice]: ../../std/primitive.slice.html + /// [byteslice]: prim@slice /// [U+FFFD]: core::char::REPLACEMENT_CHARACTER /// /// If you are sure that the byte slice is valid UTF-8, and you don't want @@ -1201,6 +1202,62 @@ impl String { ch } + /// Remove all matches of pattern `pat` in the `String`. + /// + /// # Examples + /// + /// ``` + /// #![feature(string_remove_matches)] + /// let mut s = String::from("Trees are not green, the sky is not blue."); + /// s.remove_matches("not "); + /// assert_eq!("Trees are green, the sky is blue.", s); + /// ``` + /// + /// Matches will be detected and removed iteratively, so in cases where + /// patterns overlap, only the first pattern will be removed: + /// + /// ``` + /// #![feature(string_remove_matches)] + /// let mut s = String::from("banana"); + /// s.remove_matches("ana"); + /// assert_eq!("bna", s); + /// ``` + #[unstable(feature = "string_remove_matches", reason = "new API", issue = "72826")] + pub fn remove_matches<'a, P>(&'a mut self, pat: P) + where + P: for<'x> Pattern<'x>, + { + use core::str::pattern::Searcher; + + let matches = { + let mut searcher = pat.into_searcher(self); + let mut matches = Vec::new(); + + while let Some(m) = searcher.next_match() { + matches.push(m); + } + + matches + }; + + let len = self.len(); + let mut shrunk_by = 0; + + // SAFETY: start and end will be on utf8 byte boundaries per + // the Searcher docs + unsafe { + for (start, end) in matches { + ptr::copy( + self.vec.as_mut_ptr().add(end - shrunk_by), + self.vec.as_mut_ptr().add(start - shrunk_by), + len - end, + ); + shrunk_by += end - start; + } + self.vec.set_len(len - shrunk_by); + } + } + /// Retains only the characters specified by the predicate. /// /// In other words, remove all characters `c` such that `f(c)` returns `false`. @@ -1510,14 +1567,14 @@ impl String { // of the vector version. The data is just plain bytes. // Because the range removal happens in Drop, if the Drain iterator is leaked, // the removal will not happen. - let Range { start, end } = range.assert_len(self.len()); + let Range { start, end } = slice::range(range, ..self.len()); assert!(self.is_char_boundary(start)); assert!(self.is_char_boundary(end)); // Take out two simultaneous borrows. The &mut String won't be accessed // until iteration is over, in Drop. let self_ptr = self as *mut _; - // SAFETY: `assert_len` and `is_char_boundary` do the appropriate bounds checks. + // SAFETY: `slice::range` and `is_char_boundary` do the appropriate bounds checks. let chars_iter = unsafe { self.get_unchecked(start..end) }.chars(); Drain { start, end, iter: chars_iter, string: self_ptr } @@ -2174,6 +2231,7 @@ impl FromStr for String { /// implementation for free. /// /// [`Display`]: fmt::Display +#[cfg_attr(not(test), rustc_diagnostic_item = "ToString")] #[stable(feature = "rust1", since = "1.0.0")] pub trait ToString { /// Converts the given value to a `String`. @@ -2350,6 +2408,16 @@ impl<'a> From> for String { #[stable(feature = "rust1", since = "1.0.0")] impl<'a> From<&'a str> for Cow<'a, str> { + /// Converts a string slice into a Borrowed variant. + /// No heap allocation is performed, and the string + /// is not copied. + /// + /// # Example + /// + /// ``` + /// # use std::borrow::Cow; + /// assert_eq!(Cow::from("eggplant"), Cow::Borrowed("eggplant")); + /// ``` #[inline] fn from(s: &'a str) -> Cow<'a, str> { Cow::Borrowed(s) @@ -2358,6 +2426,18 @@ impl<'a> From<&'a str> for Cow<'a, str> { #[stable(feature = "rust1", since = "1.0.0")] impl<'a> From for Cow<'a, str> { + /// Converts a String into an Owned variant. + /// No heap allocation is performed, and the string + /// is not copied. + /// + /// # Example + /// + /// ``` + /// # use std::borrow::Cow; + /// let s = "eggplant".to_string(); + /// let s2 = "eggplant".to_string(); + /// assert_eq!(Cow::from(s), Cow::<'static, str>::Owned(s2)); + /// ``` #[inline] fn from(s: String) -> Cow<'a, str> { Cow::Owned(s) @@ -2366,6 +2446,17 @@ impl<'a> From for Cow<'a, str> { #[stable(feature = "cow_from_string_ref", since = "1.28.0")] impl<'a> From<&'a String> for Cow<'a, str> { + /// Converts a String reference into a Borrowed variant. + /// No heap allocation is performed, and the string + /// is not copied. + /// + /// # Example + /// + /// ``` + /// # use std::borrow::Cow; + /// let s = "eggplant".to_string(); + /// assert_eq!(Cow::from(&s), Cow::Borrowed("eggplant")); + /// ``` #[inline] fn from(s: &'a String) -> Cow<'a, str> { Cow::Borrowed(s.as_str()) diff --git a/library/alloc/src/sync.rs b/library/alloc/src/sync.rs index 461ca85c03..aeae888ddd 100644 --- a/library/alloc/src/sync.rs +++ b/library/alloc/src/sync.rs @@ -2285,6 +2285,16 @@ impl From for Arc { #[stable(feature = "shared_from_slice", since = "1.21.0")] impl From<&[T]> for Arc<[T]> { + /// Allocate a reference-counted slice and fill it by cloning `v`'s items. + /// + /// # Example + /// + /// ``` + /// # use std::sync::Arc; + /// let original: &[i32] = &[1, 2, 3]; + /// let shared: Arc<[i32]> = Arc::from(original); + /// assert_eq!(&[1, 2, 3], &shared[..]); + /// ``` #[inline] fn from(v: &[T]) -> Arc<[T]> { >::from_slice(v) @@ -2293,6 +2303,15 @@ impl From<&[T]> for Arc<[T]> { #[stable(feature = "shared_from_slice", since = "1.21.0")] impl From<&str> for Arc { + /// Allocate a reference-counted `str` and copy `v` into it. + /// + /// # Example + /// + /// ``` + /// # use std::sync::Arc; + /// let shared: Arc = Arc::from("eggplant"); + /// assert_eq!("eggplant", &shared[..]); + /// ``` #[inline] fn from(v: &str) -> Arc { let arc = Arc::<[u8]>::from(v.as_bytes()); @@ -2302,6 +2321,16 @@ impl From<&str> for Arc { #[stable(feature = "shared_from_slice", since = "1.21.0")] impl From for Arc { + /// Allocate a reference-counted `str` and copy `v` into it. + /// + /// # Example + /// + /// ``` + /// # use std::sync::Arc; + /// let unique: String = "eggplant".to_owned(); + /// let shared: Arc = Arc::from(unique); + /// assert_eq!("eggplant", &shared[..]); + /// ``` #[inline] fn from(v: String) -> Arc { Arc::from(&v[..]) @@ -2310,6 +2339,16 @@ impl From for Arc { #[stable(feature = "shared_from_slice", since = "1.21.0")] impl From> for Arc { + /// Move a boxed object to a new, reference-counted allocation. + /// + /// # Example + /// + /// ``` + /// # use std::sync::Arc; + /// let unique: Box = Box::from("eggplant"); + /// let shared: Arc = Arc::from(unique); + /// assert_eq!("eggplant", &shared[..]); + /// ``` #[inline] fn from(v: Box) -> Arc { Arc::from_box(v) @@ -2318,6 +2357,16 @@ impl From> for Arc { #[stable(feature = "shared_from_slice", since = "1.21.0")] impl From> for Arc<[T]> { + /// Allocate a reference-counted slice and move `v`'s items into it. + /// + /// # Example + /// + /// ``` + /// # use std::sync::Arc; + /// let unique: Vec = vec![1, 2, 3]; + /// let shared: Arc<[i32]> = Arc::from(unique); + /// assert_eq!(&[1, 2, 3], &shared[..]); + /// ``` #[inline] fn from(mut v: Vec) -> Arc<[T]> { unsafe { diff --git a/library/alloc/src/task.rs b/library/alloc/src/task.rs index ab7611ae07..58a9ae7724 100644 --- a/library/alloc/src/task.rs +++ b/library/alloc/src/task.rs @@ -85,8 +85,6 @@ pub trait Wake { } } -#[cfg_attr(bootstrap, allow(rustc::ineffective_unstable_trait_impl))] -#[cfg_attr(not(bootstrap), allow(ineffective_unstable_trait_impl))] #[stable(feature = "wake_trait", since = "1.51.0")] impl From> for Waker { fn from(waker: Arc) -> Waker { @@ -96,8 +94,6 @@ impl From> for Waker { } } -#[cfg_attr(bootstrap, allow(rustc::ineffective_unstable_trait_impl))] -#[cfg_attr(not(bootstrap), allow(ineffective_unstable_trait_impl))] #[stable(feature = "wake_trait", since = "1.51.0")] impl From> for RawWaker { fn from(waker: Arc) -> RawWaker { diff --git a/library/alloc/src/vec/into_iter.rs b/library/alloc/src/vec/into_iter.rs index f131d06bb1..bcbdffabc7 100644 --- a/library/alloc/src/vec/into_iter.rs +++ b/library/alloc/src/vec/into_iter.rs @@ -212,9 +212,7 @@ unsafe impl TrustedRandomAccess for IntoIter where T: Copy, { - fn may_have_side_effect() -> bool { - false - } + const MAY_HAVE_SIDE_EFFECT: bool = false; } #[stable(feature = "vec_into_iter_clone", since = "1.8.0")] diff --git a/library/alloc/src/vec/mod.rs b/library/alloc/src/vec/mod.rs index ede1601fa3..135279874b 100644 --- a/library/alloc/src/vec/mod.rs +++ b/library/alloc/src/vec/mod.rs @@ -126,7 +126,7 @@ use self::spec_extend::SpecExtend; mod spec_extend; -/// A contiguous growable array type, written `Vec` but pronounced 'vector'. +/// A contiguous growable array type, written as `Vec` and pronounced 'vector'. /// /// # Examples /// @@ -215,8 +215,8 @@ mod spec_extend; /// /// # Slicing /// -/// A `Vec` can be mutable. Slices, on the other hand, are read-only objects. -/// To get a [slice], use [`&`]. Example: +/// A `Vec` can be mutable. On the other hand, slices are read-only objects. +/// To get a [slice][prim@slice], use [`&`]. Example: /// /// ``` /// fn read_slice(slice: &[usize]) { @@ -352,7 +352,7 @@ mod spec_extend; /// not break, however: using `unsafe` code to write to the excess capacity, /// and then increasing the length to match, is always valid. /// -/// `Vec` does not currently guarantee the order in which elements are dropped. +/// Currently, `Vec` does not guarantee the order in which elements are dropped. /// The order has changed in the past and may change again. /// /// [`get`]: ../../std/vec/struct.Vec.html#method.get @@ -369,8 +369,6 @@ mod spec_extend; /// [`reserve`]: Vec::reserve /// [`MaybeUninit`]: core::mem::MaybeUninit /// [owned slice]: Box -/// [slice]: ../../std/primitive.slice.html -/// [`&`]: ../../std/primitive.reference.html #[stable(feature = "rust1", since = "1.0.0")] #[cfg_attr(not(test), rustc_diagnostic_item = "vec_type")] pub struct Vec { @@ -1385,13 +1383,14 @@ impl Vec { /// assert_eq!(vec, [2, 4]); /// ``` /// - /// The exact order may be useful for tracking external state, like an index. + /// Because the elements are visited exactly once in the original order, + /// external state may be used to decide which elements to keep. /// /// ``` /// let mut vec = vec![1, 2, 3, 4, 5]; /// let keep = [false, true, true, false, true]; - /// let mut i = 0; - /// vec.retain(|_| (keep[i], i += 1).0); + /// let mut iter = keep.iter(); + /// vec.retain(|_| *iter.next().unwrap()); /// assert_eq!(vec, [2, 3, 5]); /// ``` #[stable(feature = "rust1", since = "1.0.0")] @@ -1399,22 +1398,75 @@ impl Vec { where F: FnMut(&T) -> bool, { - let len = self.len(); - let mut del = 0; - { - let v = &mut **self; + let original_len = self.len(); + // Avoid double drop if the drop guard is not executed, + // since we may make some holes during the process. + unsafe { self.set_len(0) }; + + // Vec: [Kept, Kept, Hole, Hole, Hole, Hole, Unchecked, Unchecked] + // |<- processed len ->| ^- next to check + // |<- deleted cnt ->| + // |<- original_len ->| + // Kept: Elements which predicate returns true on. + // Hole: Moved or dropped element slot. + // Unchecked: Unchecked valid elements. + // + // This drop guard will be invoked when predicate or `drop` of element panicked. + // It shifts unchecked elements to cover holes and `set_len` to the correct length. + // In cases when predicate and `drop` never panick, it will be optimized out. + struct BackshiftOnDrop<'a, T, A: Allocator> { + v: &'a mut Vec, + processed_len: usize, + deleted_cnt: usize, + original_len: usize, + } - for i in 0..len { - if !f(&v[i]) { - del += 1; - } else if del > 0 { - v.swap(i - del, i); + impl Drop for BackshiftOnDrop<'_, T, A> { + fn drop(&mut self) { + if self.deleted_cnt > 0 { + // SAFETY: Trailing unchecked items must be valid since we never touch them. + unsafe { + ptr::copy( + self.v.as_ptr().add(self.processed_len), + self.v.as_mut_ptr().add(self.processed_len - self.deleted_cnt), + self.original_len - self.processed_len, + ); + } + } + // SAFETY: After filling holes, all items are in contiguous memory. + unsafe { + self.v.set_len(self.original_len - self.deleted_cnt); } } } - if del > 0 { - self.truncate(len - del); + + let mut g = BackshiftOnDrop { v: self, processed_len: 0, deleted_cnt: 0, original_len }; + + while g.processed_len < original_len { + // SAFETY: Unchecked element must be valid. + let cur = unsafe { &mut *g.v.as_mut_ptr().add(g.processed_len) }; + if !f(cur) { + // Advance early to avoid double drop if `drop_in_place` panicked. + g.processed_len += 1; + g.deleted_cnt += 1; + // SAFETY: We never touch this element again after dropped. + unsafe { ptr::drop_in_place(cur) }; + // We already advanced the counter. + continue; + } + if g.deleted_cnt > 0 { + // SAFETY: `deleted_cnt` > 0, so the hole slot must not overlap with current element. + // We use copy for move, and never touch this element again. + unsafe { + let hole_slot = g.v.as_mut_ptr().add(g.processed_len - g.deleted_cnt); + ptr::copy_nonoverlapping(cur, hole_slot, 1); + } + } + g.processed_len += 1; } + + // All item are processed. This can be optimized to `set_len` by LLVM. + drop(g); } /// Removes all but the first of consecutive elements in the vector that resolve to the same @@ -1460,15 +1512,98 @@ 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) + pub fn dedup_by(&mut self, mut 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() - }; - self.truncate(len); + let len = self.len(); + if len <= 1 { + return; + } + + /* INVARIANT: vec.len() > read >= write > write-1 >= 0 */ + struct FillGapOnDrop<'a, T, A: core::alloc::Allocator> { + /* Offset of the element we want to check if it is duplicate */ + read: usize, + + /* Offset of the place where we want to place the non-duplicate + * when we find it. */ + write: usize, + + /* The Vec that would need correction if `same_bucket` panicked */ + vec: &'a mut Vec, + } + + impl<'a, T, A: core::alloc::Allocator> Drop for FillGapOnDrop<'a, T, A> { + fn drop(&mut self) { + /* This code gets executed when `same_bucket` panics */ + + /* SAFETY: invariant guarantees that `read - write` + * and `len - read` never overflow and that the copy is always + * in-bounds. */ + unsafe { + let ptr = self.vec.as_mut_ptr(); + let len = self.vec.len(); + + /* How many items were left when `same_bucket` paniced. + * Basically vec[read..].len() */ + let items_left = len.wrapping_sub(self.read); + + /* Pointer to first item in vec[write..write+items_left] slice */ + let dropped_ptr = ptr.add(self.write); + /* Pointer to first item in vec[read..] slice */ + let valid_ptr = ptr.add(self.read); + + /* Copy `vec[read..]` to `vec[write..write+items_left]`. + * The slices can overlap, so `copy_nonoverlapping` cannot be used */ + ptr::copy(valid_ptr, dropped_ptr, items_left); + + /* How many items have been already dropped + * Basically vec[read..write].len() */ + let dropped = self.read.wrapping_sub(self.write); + + self.vec.set_len(len - dropped); + } + } + } + + let mut gap = FillGapOnDrop { read: 1, write: 1, vec: self }; + let ptr = gap.vec.as_mut_ptr(); + + /* Drop items while going through Vec, it should be more efficient than + * doing slice partition_dedup + truncate */ + + /* SAFETY: Because of the invariant, read_ptr, prev_ptr and write_ptr + * are always in-bounds and read_ptr never aliases prev_ptr */ + unsafe { + while gap.read < len { + let read_ptr = ptr.add(gap.read); + let prev_ptr = ptr.add(gap.write.wrapping_sub(1)); + + if same_bucket(&mut *read_ptr, &mut *prev_ptr) { + /* We have found duplicate, drop it in-place */ + ptr::drop_in_place(read_ptr); + } else { + let write_ptr = ptr.add(gap.write); + + /* Because `read_ptr` can be equal to `write_ptr`, we either + * have to use `copy` or conditional `copy_nonoverlapping`. + * Looks like the first option is faster. */ + ptr::copy(read_ptr, write_ptr, 1); + + /* We have filled that place, so go further */ + gap.write += 1; + } + + gap.read += 1; + } + + /* Technically we could let `gap` clean up with its Drop, but + * when `same_bucket` is guaranteed to not panic, this bloats a little + * the codegen, so we just do it manually */ + gap.vec.set_len(gap.write); + mem::forget(gap); + } } /// Appends an element to the back of a collection. @@ -1597,7 +1732,7 @@ impl Vec { // the hole, and the vector length is restored to the new length. // let len = self.len(); - let Range { start, end } = range.assert_len(len); + let Range { start, end } = slice::range(range, ..len); unsafe { // set self.vec length's to start, to be safe in case Drain is leaked @@ -1825,27 +1960,95 @@ impl Vec { #[unstable(feature = "vec_spare_capacity", issue = "75017")] #[inline] pub fn spare_capacity_mut(&mut self) -> &mut [MaybeUninit] { - self.split_at_spare_mut().1 + // Note: + // This method is not implemented in terms of `split_at_spare_mut`, + // to prevent invalidation of pointers to the buffer. + unsafe { + slice::from_raw_parts_mut( + self.as_mut_ptr().add(self.len) as *mut MaybeUninit, + self.buf.capacity() - self.len, + ) + } } + /// Returns vector content as a slice of `T`, along with the remaining spare + /// capacity of the vector as a slice of `MaybeUninit`. + /// + /// The returned spare capacity slice can be used to fill the vector with data + /// (e.g. by reading from a file) before marking the data as initialized using + /// the [`set_len`] method. + /// + /// [`set_len`]: Vec::set_len + /// + /// Note that this is a low-level API, which should be used with care for + /// optimization purposes. If you need to append data to a `Vec` + /// you can use [`push`], [`extend`], [`extend_from_slice`], + /// [`extend_from_within`], [`insert`], [`append`], [`resize`] or + /// [`resize_with`], depending on your exact needs. + /// + /// [`push`]: Vec::push + /// [`extend`]: Vec::extend + /// [`extend_from_slice`]: Vec::extend_from_slice + /// [`extend_from_within`]: Vec::extend_from_within + /// [`insert`]: Vec::insert + /// [`append`]: Vec::append + /// [`resize`]: Vec::resize + /// [`resize_with`]: Vec::resize_with + /// + /// # Examples + /// + /// ``` + /// #![feature(vec_split_at_spare, maybe_uninit_extra)] + /// + /// let mut v = vec![1, 1, 2]; + /// + /// // Reserve additional space big enough for 10 elements. + /// v.reserve(10); + /// + /// let (init, uninit) = v.split_at_spare_mut(); + /// let sum = init.iter().copied().sum::(); + /// + /// // Fill in the next 4 elements. + /// uninit[0].write(sum); + /// uninit[1].write(sum * 2); + /// uninit[2].write(sum * 3); + /// uninit[3].write(sum * 4); + /// + /// // Mark the 4 elements of the vector as being initialized. + /// unsafe { + /// let len = v.len(); + /// v.set_len(len + 4); + /// } + /// + /// assert_eq!(&v, &[1, 1, 2, 4, 8, 12, 16]); + /// ``` + #[unstable(feature = "vec_split_at_spare", issue = "81944")] #[inline] - fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit]) { - let ptr = self.as_mut_ptr(); + pub fn split_at_spare_mut(&mut self) -> (&mut [T], &mut [MaybeUninit]) { + // SAFETY: + // - len is ignored and so never changed + let (init, spare, _) = unsafe { self.split_at_spare_mut_with_len() }; + (init, spare) + } - // Safety: - // - `ptr` is guaranteed to be in bounds for `capacity` elements - // - `len` is guaranteed to less or equal to `capacity` - // - `MaybeUninit` has the same layout as `T` - let spare_ptr = unsafe { ptr.cast::>().add(self.len) }; + /// Safety: changing returned .2 (&mut usize) is considered the same as calling `.set_len(_)`. + /// + /// This method is used to have unique access to all vec parts at once in `extend_from_within`. + unsafe fn split_at_spare_mut_with_len( + &mut self, + ) -> (&mut [T], &mut [MaybeUninit], &mut usize) { + let Range { start: ptr, end: spare_ptr } = self.as_mut_ptr_range(); + let spare_ptr = spare_ptr.cast::>(); + let spare_len = self.buf.capacity() - self.len; - // Safety: + // SAFETY: // - `ptr` is guaranteed to be valid for `len` elements - // - `spare_ptr` is offseted from `ptr` by `len`, so it doesn't overlap `initialized` slice + // - `spare_ptr` is pointing one element past the buffer, so it doesn't overlap with `initialized` unsafe { let initialized = slice::from_raw_parts_mut(ptr, self.len); - let spare = slice::from_raw_parts_mut(spare_ptr, self.buf.capacity() - self.len); + let spare = slice::from_raw_parts_mut(spare_ptr, spare_len); - (initialized, spare) + (initialized, spare, &mut self.len) } } } @@ -1931,11 +2134,11 @@ impl Vec { where R: RangeBounds, { - let range = src.assert_len(self.len()); + let range = slice::range(src, ..self.len()); self.reserve(range.len()); // SAFETY: - // - `assert_len` guarantees that the given range is valid for indexing self + // - `slice::range` guarantees that the given range is valid for indexing self unsafe { self.spec_extend_from_within(range); } @@ -2048,7 +2251,8 @@ pub fn from_elem_in(elem: T, n: usize, alloc: A) -> Vec< } trait ExtendFromWithinSpec { - /// Safety: + /// # Safety + /// /// - `src` needs to be valid index /// - `self.capacity() - self.len()` must be `>= src.len()` unsafe fn spec_extend_from_within(&mut self, src: Range); @@ -2056,22 +2260,23 @@ trait ExtendFromWithinSpec { impl ExtendFromWithinSpec for Vec { default unsafe fn spec_extend_from_within(&mut self, src: Range) { - let initialized = { - let (this, spare) = self.split_at_spare_mut(); - - // Safety: - // - caller guaratees that src is a valid index - let to_clone = unsafe { this.get_unchecked(src) }; - - to_clone.iter().cloned().zip(spare.iter_mut()).map(|(e, s)| s.write(e)).count() - }; + // SAFETY: + // - len is increased only after initializing elements + let (this, spare, len) = unsafe { self.split_at_spare_mut_with_len() }; - // Safety: - // - elements were just initialized - unsafe { - let new_len = self.len() + initialized; - self.set_len(new_len); - } + // SAFETY: + // - caller guaratees that src is a valid index + let to_clone = unsafe { this.get_unchecked(src) }; + + to_clone + .iter() + .cloned() + .zip(spare.iter_mut()) + .map(|(src, dst)| dst.write(src)) + // Note: + // - Element was just initialized with `MaybeUninit::write`, so it's ok to increace len + // - len is increased after each element to prevent leaks (see issue #82533) + .for_each(|_| *len += 1); } } @@ -2081,11 +2286,11 @@ impl ExtendFromWithinSpec for Vec { { let (init, spare) = self.split_at_spare_mut(); - // Safety: + // SAFETY: // - caller guaratees that `src` is a valid index let source = unsafe { init.get_unchecked(src) }; - // Safety: + // SAFETY: // - Both pointers are created from unique slice references (`&mut [_]`) // so they are valid and do not overlap. // - Elements are :Copy so it's OK to to copy them, without doing @@ -2097,7 +2302,7 @@ impl ExtendFromWithinSpec for Vec { unsafe { ptr::copy_nonoverlapping(source.as_ptr(), spare.as_mut_ptr() as _, count) }; } - // Safety: + // SAFETY: // - The elements were just initialized by `copy_nonoverlapping` self.len += count; } @@ -2410,7 +2615,7 @@ impl Vec { /// This implementation is specialized for slice iterators, where it uses [`copy_from_slice`] to /// append the entire slice at once. /// -/// [`copy_from_slice`]: ../../std/primitive.slice.html#method.copy_from_slice +/// [`copy_from_slice`]: slice::copy_from_slice #[stable(feature = "extend_ref", since = "1.2.0")] impl<'a, T: Copy + 'a, A: Allocator + 'a> Extend<&'a T> for Vec { fn extend>(&mut self, iter: I) { diff --git a/library/alloc/tests/lib.rs b/library/alloc/tests/lib.rs index dd98f80645..06874bff44 100644 --- a/library/alloc/tests/lib.rs +++ b/library/alloc/tests/lib.rs @@ -6,7 +6,6 @@ #![feature(exact_size_is_empty)] #![feature(new_uninit)] #![feature(pattern)] -#![feature(str_split_once)] #![feature(trusted_len)] #![feature(try_reserve)] #![feature(unboxed_closures)] @@ -20,7 +19,10 @@ #![feature(int_bits_const)] #![feature(vecdeque_binary_search)] #![feature(slice_group_by)] +#![feature(slice_partition_dedup)] #![feature(vec_extend_from_within)] +#![feature(vec_spare_capacity)] +#![feature(string_remove_matches)] use std::collections::hash_map::DefaultHasher; use std::hash::{Hash, Hasher}; diff --git a/library/alloc/tests/slice.rs b/library/alloc/tests/slice.rs index 777c10b1bf..1fb4a51acf 100644 --- a/library/alloc/tests/slice.rs +++ b/library/alloc/tests/slice.rs @@ -1798,7 +1798,7 @@ fn subslice_patterns() { macro_rules! c { ($inp:expr, $typ:ty, $out:expr $(,)?) => { - assert_eq!($out, identity::<$typ>($inp)); + assert_eq!($out, identity::<$typ>($inp)) }; } diff --git a/library/alloc/tests/string.rs b/library/alloc/tests/string.rs index f3d74e0514..9ec0ee97ab 100644 --- a/library/alloc/tests/string.rs +++ b/library/alloc/tests/string.rs @@ -365,6 +365,33 @@ fn remove_bad() { "ศ".to_string().remove(1); } +#[test] +fn test_remove_matches() { + let mut s = "abc".to_string(); + + s.remove_matches('b'); + assert_eq!(s, "ac"); + s.remove_matches('b'); + assert_eq!(s, "ac"); + + let mut s = "abcb".to_string(); + + s.remove_matches('b'); + assert_eq!(s, "ac"); + + let mut s = "ศไทย中华Việt Nam; foobarศ".to_string(); + s.remove_matches('ศ'); + assert_eq!(s, "ไทย中华Việt Nam; foobar"); + + let mut s = "".to_string(); + s.remove_matches(""); + assert_eq!(s, ""); + + let mut s = "aaaaa".to_string(); + s.remove_matches('a'); + assert_eq!(s, ""); +} + #[test] fn test_retain() { let mut s = String::from("α_β_γ"); diff --git a/library/alloc/tests/vec.rs b/library/alloc/tests/vec.rs index 5c7ff67bc6..c142536cd2 100644 --- a/library/alloc/tests/vec.rs +++ b/library/alloc/tests/vec.rs @@ -7,6 +7,7 @@ use std::mem::{size_of, swap}; use std::ops::Bound::*; use std::panic::{catch_unwind, AssertUnwindSafe}; use std::rc::Rc; +use std::sync::atomic::{AtomicU32, Ordering}; use std::vec::{Drain, IntoIter}; struct DropCounter<'a> { @@ -287,6 +288,67 @@ fn test_retain() { assert_eq!(vec, [2, 4]); } +#[test] +fn test_retain_pred_panic_with_hole() { + let v = (0..5).map(Rc::new).collect::>(); + catch_unwind(AssertUnwindSafe(|| { + let mut v = v.clone(); + v.retain(|r| match **r { + 0 => true, + 1 => false, + 2 => true, + _ => panic!(), + }); + })) + .unwrap_err(); + // Everything is dropped when predicate panicked. + assert!(v.iter().all(|r| Rc::strong_count(r) == 1)); +} + +#[test] +fn test_retain_pred_panic_no_hole() { + let v = (0..5).map(Rc::new).collect::>(); + catch_unwind(AssertUnwindSafe(|| { + let mut v = v.clone(); + v.retain(|r| match **r { + 0 | 1 | 2 => true, + _ => panic!(), + }); + })) + .unwrap_err(); + // Everything is dropped when predicate panicked. + assert!(v.iter().all(|r| Rc::strong_count(r) == 1)); +} + +#[test] +fn test_retain_drop_panic() { + struct Wrap(Rc); + + impl Drop for Wrap { + fn drop(&mut self) { + if *self.0 == 3 { + panic!(); + } + } + } + + let v = (0..5).map(|x| Rc::new(x)).collect::>(); + catch_unwind(AssertUnwindSafe(|| { + let mut v = v.iter().map(|r| Wrap(r.clone())).collect::>(); + v.retain(|w| match *w.0 { + 0 => true, + 1 => false, + 2 => true, + 3 => false, // Drop panic. + _ => true, + }); + })) + .unwrap_err(); + // Other elements are dropped when `drop` of one element panicked. + // The panicked wrapper also has its Rc dropped. + assert!(v.iter().all(|r| Rc::strong_count(r) == 1)); +} + #[test] fn test_dedup() { fn case(a: Vec, b: Vec) { @@ -548,6 +610,17 @@ fn test_move_items_zero_sized() { assert_eq!(vec2, [(), (), ()]); } +#[test] +fn test_drain_empty_vec() { + let mut vec: Vec = vec![]; + let mut vec2: Vec = vec![]; + for i in vec.drain(..) { + vec2.push(i); + } + assert!(vec.is_empty()); + assert!(vec2.is_empty()); +} + #[test] fn test_drain_items() { let mut vec = vec![1, 2, 3]; @@ -1619,6 +1692,10 @@ fn test_stable_pointers() { next_then_drop(v.splice(5..6, vec![1; 10].into_iter().filter(|_| true))); // lower bound not exact assert_eq!(*v0, 13); + // spare_capacity_mut + v.spare_capacity_mut(); + assert_eq!(*v0, 13); + // Smoke test that would fire even outside Miri if an actual relocation happened. *v0 -= 13; assert_eq!(v[0], 0); @@ -2024,3 +2101,170 @@ fn test_extend_from_within() { assert_eq!(v, ["a", "b", "c", "b", "c", "a", "b"]); } + +#[test] +fn test_vec_dedup_by() { + let mut vec: Vec = vec![1, -1, 2, 3, 1, -5, 5, -2, 2]; + + vec.dedup_by(|a, b| a.abs() == b.abs()); + + assert_eq!(vec, [1, 2, 3, 1, -5, -2]); +} + +#[test] +fn test_vec_dedup_empty() { + let mut vec: Vec = Vec::new(); + + vec.dedup(); + + assert_eq!(vec, []); +} + +#[test] +fn test_vec_dedup_one() { + let mut vec = vec![12i32]; + + vec.dedup(); + + assert_eq!(vec, [12]); +} + +#[test] +fn test_vec_dedup_multiple_ident() { + let mut vec = vec![12, 12, 12, 12, 12, 11, 11, 11, 11, 11, 11]; + + vec.dedup(); + + assert_eq!(vec, [12, 11]); +} + +#[test] +fn test_vec_dedup_partialeq() { + #[derive(Debug)] + struct Foo(i32, i32); + + impl PartialEq for Foo { + fn eq(&self, other: &Foo) -> bool { + self.0 == other.0 + } + } + + let mut vec = vec![Foo(0, 1), Foo(0, 5), Foo(1, 7), Foo(1, 9)]; + + vec.dedup(); + assert_eq!(vec, [Foo(0, 1), Foo(1, 7)]); +} + +#[test] +fn test_vec_dedup() { + let mut vec: Vec = Vec::with_capacity(8); + let mut template = vec.clone(); + + for x in 0u8..255u8 { + vec.clear(); + template.clear(); + + let iter = (0..8).map(move |bit| (x >> bit) & 1 == 1); + vec.extend(iter); + template.extend_from_slice(&vec); + + let (dedup, _) = template.partition_dedup(); + vec.dedup(); + + assert_eq!(vec, dedup); + } +} + +#[test] +fn test_vec_dedup_panicking() { + #[derive(Debug)] + struct Panic { + drop_counter: &'static AtomicU32, + value: bool, + index: usize, + } + + impl PartialEq for Panic { + fn eq(&self, other: &Self) -> bool { + self.value == other.value + } + } + + impl Drop for Panic { + fn drop(&mut self) { + let x = self.drop_counter.fetch_add(1, Ordering::SeqCst); + assert!(x != 4); + } + } + + static DROP_COUNTER: AtomicU32 = AtomicU32::new(0); + let expected = [ + Panic { drop_counter: &DROP_COUNTER, value: false, index: 0 }, + Panic { drop_counter: &DROP_COUNTER, value: false, index: 5 }, + Panic { drop_counter: &DROP_COUNTER, value: true, index: 6 }, + Panic { drop_counter: &DROP_COUNTER, value: true, index: 7 }, + ]; + let mut vec = vec![ + Panic { drop_counter: &DROP_COUNTER, value: false, index: 0 }, + // these elements get deduplicated + Panic { drop_counter: &DROP_COUNTER, value: false, index: 1 }, + Panic { drop_counter: &DROP_COUNTER, value: false, index: 2 }, + Panic { drop_counter: &DROP_COUNTER, value: false, index: 3 }, + Panic { drop_counter: &DROP_COUNTER, value: false, index: 4 }, + // here it panics + Panic { drop_counter: &DROP_COUNTER, value: false, index: 5 }, + Panic { drop_counter: &DROP_COUNTER, value: true, index: 6 }, + Panic { drop_counter: &DROP_COUNTER, value: true, index: 7 }, + ]; + + let _ = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + vec.dedup(); + })); + + let ok = vec.iter().zip(expected.iter()).all(|(x, y)| x.index == y.index); + + if !ok { + panic!("expected: {:?}\ngot: {:?}\n", expected, vec); + } +} + +// Regression test for issue #82533 +#[test] +fn test_extend_from_within_panicing_clone() { + struct Panic<'dc> { + drop_count: &'dc AtomicU32, + aaaaa: bool, + } + + impl Clone for Panic<'_> { + fn clone(&self) -> Self { + if self.aaaaa { + panic!("panic! at the clone"); + } + + Self { ..*self } + } + } + + impl Drop for Panic<'_> { + fn drop(&mut self) { + self.drop_count.fetch_add(1, Ordering::SeqCst); + } + } + + let count = core::sync::atomic::AtomicU32::new(0); + let mut vec = vec![ + Panic { drop_count: &count, aaaaa: false }, + Panic { drop_count: &count, aaaaa: true }, + Panic { drop_count: &count, aaaaa: false }, + ]; + + // This should clone&append one Panic{..} at the end, and then panic while + // cloning second Panic{..}. This means that `Panic::drop` should be called + // 4 times (3 for items already in vector, 1 for just appended). + // + // Previously just appended item was leaked, making drop_count = 3, instead of 4. + std::panic::catch_unwind(move || vec.extend_from_within(..)).unwrap_err(); + + assert_eq!(count.load(Ordering::SeqCst), 4); +} diff --git a/library/core/benches/ascii.rs b/library/core/benches/ascii.rs index bc59c37860..64938745a4 100644 --- a/library/core/benches/ascii.rs +++ b/library/core/benches/ascii.rs @@ -66,6 +66,8 @@ macro_rules! benches { use test::black_box; use test::Bencher; +const ASCII_CASE_MASK: u8 = 0b0010_0000; + benches! { fn case00_alloc_only(_bytes: &mut [u8]) {} @@ -204,7 +206,7 @@ benches! { } } for byte in bytes { - *byte &= !((is_ascii_lowercase(*byte) as u8) << 5) + *byte &= !((is_ascii_lowercase(*byte) as u8) * ASCII_CASE_MASK) } } @@ -216,7 +218,7 @@ benches! { } } for byte in bytes { - *byte -= (is_ascii_lowercase(*byte) as u8) << 5 + *byte -= (is_ascii_lowercase(*byte) as u8) * ASCII_CASE_MASK } } diff --git a/library/core/benches/char/methods.rs b/library/core/benches/char/methods.rs index a9a08a4d76..9408f83c32 100644 --- a/library/core/benches/char/methods.rs +++ b/library/core/benches/char/methods.rs @@ -35,3 +35,43 @@ fn bench_to_digit_radix_var(b: &mut Bencher) { .min() }) } + +#[bench] +fn bench_to_ascii_uppercase(b: &mut Bencher) { + b.iter(|| CHARS.iter().cycle().take(10_000).map(|c| c.to_ascii_uppercase()).min()) +} + +#[bench] +fn bench_to_ascii_lowercase(b: &mut Bencher) { + b.iter(|| CHARS.iter().cycle().take(10_000).map(|c| c.to_ascii_lowercase()).min()) +} + +#[bench] +fn bench_ascii_mix_to_uppercase(b: &mut Bencher) { + b.iter(|| (0..=255).cycle().take(10_000).map(|b| char::from(b).to_uppercase()).count()) +} + +#[bench] +fn bench_ascii_mix_to_lowercase(b: &mut Bencher) { + b.iter(|| (0..=255).cycle().take(10_000).map(|b| char::from(b).to_lowercase()).count()) +} + +#[bench] +fn bench_ascii_char_to_uppercase(b: &mut Bencher) { + b.iter(|| (0..=127).cycle().take(10_000).map(|b| char::from(b).to_uppercase()).count()) +} + +#[bench] +fn bench_ascii_char_to_lowercase(b: &mut Bencher) { + b.iter(|| (0..=127).cycle().take(10_000).map(|b| char::from(b).to_lowercase()).count()) +} + +#[bench] +fn bench_non_ascii_char_to_uppercase(b: &mut Bencher) { + b.iter(|| (128..=255).cycle().take(10_000).map(|b| char::from(b).to_uppercase()).count()) +} + +#[bench] +fn bench_non_ascii_char_to_lowercase(b: &mut Bencher) { + b.iter(|| (128..=255).cycle().take(10_000).map(|b| char::from(b).to_lowercase()).count()) +} diff --git a/library/core/benches/slice.rs b/library/core/benches/slice.rs index 06b37cb084..dbab008568 100644 --- a/library/core/benches/slice.rs +++ b/library/core/benches/slice.rs @@ -7,15 +7,21 @@ enum Cache { L3, } +impl Cache { + fn size(&self) -> usize { + match self { + Cache::L1 => 1000, // 8kb + Cache::L2 => 10_000, // 80kb + Cache::L3 => 1_000_000, // 8Mb + } + } +} + fn binary_search(b: &mut Bencher, cache: Cache, mapper: F) where F: Fn(usize) -> usize, { - let size = match cache { - Cache::L1 => 1000, // 8kb - Cache::L2 => 10_000, // 80kb - Cache::L3 => 1_000_000, // 8Mb - }; + let size = cache.size(); let v = (0..size).map(&mapper).collect::>(); let mut r = 0usize; b.iter(move || { @@ -24,7 +30,18 @@ where // Lookup the whole range to get 50% hits and 50% misses. let i = mapper(r % size); black_box(v.binary_search(&i).is_ok()); - }) + }); +} + +fn binary_search_worst_case(b: &mut Bencher, cache: Cache) { + let size = cache.size(); + + let mut v = vec![0; size]; + let i = 1; + v[size - 1] = i; + b.iter(move || { + black_box(v.binary_search(&i).is_ok()); + }); } #[bench] @@ -57,6 +74,21 @@ fn binary_search_l3_with_dups(b: &mut Bencher) { binary_search(b, Cache::L3, |i| i / 16 * 16); } +#[bench] +fn binary_search_l1_worst_case(b: &mut Bencher) { + binary_search_worst_case(b, Cache::L1); +} + +#[bench] +fn binary_search_l2_worst_case(b: &mut Bencher) { + binary_search_worst_case(b, Cache::L2); +} + +#[bench] +fn binary_search_l3_worst_case(b: &mut Bencher) { + binary_search_worst_case(b, Cache::L3); +} + macro_rules! rotate { ($fn:ident, $n:expr, $mapper:expr) => { #[bench] diff --git a/library/core/src/alloc/global.rs b/library/core/src/alloc/global.rs index 6ec0f0b5ff..6dcc110f15 100644 --- a/library/core/src/alloc/global.rs +++ b/library/core/src/alloc/global.rs @@ -122,7 +122,7 @@ pub unsafe trait GlobalAlloc { /// this allocator, /// /// * `layout` must be the same layout that was used - /// to allocate that block of memory, + /// to allocate that block of memory. #[stable(feature = "global_alloc", since = "1.28.0")] unsafe fn dealloc(&self, ptr: *mut u8, layout: Layout); @@ -167,7 +167,10 @@ pub unsafe trait GlobalAlloc { /// and should be considered unusable (unless of course it was /// transferred back to the caller again via the return value of /// this method). The new memory block is allocated with `layout`, but - /// with the `size` updated to `new_size`. + /// with the `size` updated to `new_size`. This new layout should be + /// used when deallocating the new memory block with `dealloc`. The range + /// `0..min(layout.size(), new_size)` of the new memory block is + /// guaranteed to have the same values as the original block. /// /// If this method returns null, then ownership of the memory /// block has not been transferred to this allocator, and the diff --git a/library/core/src/alloc/layout.rs b/library/core/src/alloc/layout.rs index 9dc3f05dae..8b95b70396 100644 --- a/library/core/src/alloc/layout.rs +++ b/library/core/src/alloc/layout.rs @@ -164,7 +164,6 @@ impl Layout { /// [`Layout::for_value`] on a reference to an extern type tail. /// - otherwise, it is conservatively not allowed to call this function. /// - /// [slice]: ../../std/primitive.slice.html /// [trait object]: ../../book/ch17-02-trait-objects.html /// [extern type]: ../../unstable-book/language-features/extern-types.html #[unstable(feature = "layout_for_ptr", issue = "69835")] diff --git a/library/core/src/any.rs b/library/core/src/any.rs index eef8f2046d..98c34f3442 100644 --- a/library/core/src/any.rs +++ b/library/core/src/any.rs @@ -285,7 +285,7 @@ impl dyn Any + Send { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn is(&self) -> bool { - Any::is::(self) + ::is::(self) } /// Forwards to the method defined on the type `Any`. @@ -309,7 +309,7 @@ impl dyn Any + Send { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn downcast_ref(&self) -> Option<&T> { - Any::downcast_ref::(self) + ::downcast_ref::(self) } /// Forwards to the method defined on the type `Any`. @@ -337,7 +337,7 @@ impl dyn Any + Send { #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn downcast_mut(&mut self) -> Option<&mut T> { - Any::downcast_mut::(self) + ::downcast_mut::(self) } } @@ -363,7 +363,7 @@ impl dyn Any + Send + Sync { #[stable(feature = "any_send_sync_methods", since = "1.28.0")] #[inline] pub fn is(&self) -> bool { - Any::is::(self) + ::is::(self) } /// Forwards to the method defined on the type `Any`. @@ -387,7 +387,7 @@ impl dyn Any + Send + Sync { #[stable(feature = "any_send_sync_methods", since = "1.28.0")] #[inline] pub fn downcast_ref(&self) -> Option<&T> { - Any::downcast_ref::(self) + ::downcast_ref::(self) } /// Forwards to the method defined on the type `Any`. @@ -415,7 +415,7 @@ impl dyn Any + Send + Sync { #[stable(feature = "any_send_sync_methods", since = "1.28.0")] #[inline] pub fn downcast_mut(&mut self) -> Option<&mut T> { - Any::downcast_mut::(self) + ::downcast_mut::(self) } } diff --git a/library/core/src/array/iter.rs b/library/core/src/array/iter.rs index 535291471b..4472fba26b 100644 --- a/library/core/src/array/iter.rs +++ b/library/core/src/array/iter.rs @@ -9,8 +9,6 @@ use crate::{ }; /// A by-value [array] iterator. -/// -/// [array]: ../../std/primitive.array.html #[stable(feature = "array_value_iter", since = "1.51.0")] pub struct IntoIter { /// This is the array we are iterating over. diff --git a/library/core/src/array/mod.rs b/library/core/src/array/mod.rs index d13061d220..8f52985d1d 100644 --- a/library/core/src/array/mod.rs +++ b/library/core/src/array/mod.rs @@ -2,7 +2,7 @@ //! up to a certain length. Eventually, we should be able to generalize //! to all lengths. //! -//! *[See also the array primitive type](../../std/primitive.array.html).* +//! *[See also the array primitive type](array).* #![stable(feature = "core_array", since = "1.36.0")] @@ -11,8 +11,9 @@ use crate::cmp::Ordering; use crate::convert::{Infallible, TryFrom}; use crate::fmt; use crate::hash::{self, Hash}; +use crate::iter::TrustedLen; use crate::marker::Unsize; -use crate::mem::MaybeUninit; +use crate::mem::{self, MaybeUninit}; use crate::ops::{Index, IndexMut}; use crate::slice::{Iter, IterMut}; @@ -41,7 +42,7 @@ pub fn from_mut(s: &mut T) -> &mut [T; 1] { /// without causing much metadata bloat. /// /// The trait is marked unsafe in order to restrict implementors to fixed-size -/// arrays. User of this trait can assume that implementors have the exact +/// arrays. A user of this trait can assume that implementors have the exact /// layout in memory of a fixed size array (for example, for unsafe /// initialization). /// @@ -426,41 +427,13 @@ impl [T; N] { /// assert_eq!(y, [6, 9, 3, 3]); /// ``` #[unstable(feature = "array_map", issue = "75243")] - pub fn map(self, mut f: F) -> [U; N] + pub fn map(self, f: F) -> [U; N] where F: FnMut(T) -> U, { - struct Guard { - dst: *mut T, - initialized: usize, - } - - impl Drop for Guard { - fn drop(&mut self) { - debug_assert!(self.initialized <= N); - - let initialized_part = - crate::ptr::slice_from_raw_parts_mut(self.dst, self.initialized); - // SAFETY: this raw slice will contain only initialized objects - // that's why, it is allowed to drop it. - unsafe { - crate::ptr::drop_in_place(initialized_part); - } - } - } - let mut dst = MaybeUninit::uninit_array::(); - let mut guard: Guard = - Guard { dst: MaybeUninit::slice_as_mut_ptr(&mut dst), initialized: 0 }; - for (src, dst) in IntoIter::new(self).zip(&mut dst) { - dst.write(f(src)); - guard.initialized += 1; - } - // FIXME: Convert to crate::mem::transmute once it works with generics. - // unsafe { crate::mem::transmute::<[MaybeUninit; N], [U; N]>(dst) } - crate::mem::forget(guard); - // SAFETY: At this point we've properly initialized the whole array - // and we just need to cast it to the correct type. - unsafe { crate::mem::transmute_copy::<_, [U; N]>(&dst) } + // SAFETY: we know for certain that this iterator will yield exactly `N` + // items. + unsafe { collect_into_array_unchecked(&mut IntoIter::new(self).map(f)) } } /// 'Zips up' two arrays into a single array of pairs. @@ -481,15 +454,11 @@ impl [T; N] { /// ``` #[unstable(feature = "array_zip", issue = "80094")] pub fn zip(self, rhs: [U; N]) -> [(T, U); N] { - let mut dst = MaybeUninit::uninit_array::(); - for (i, (lhs, rhs)) in IntoIter::new(self).zip(IntoIter::new(rhs)).enumerate() { - dst[i].write((lhs, rhs)); - } - // FIXME: Convert to crate::mem::transmute once it works with generics. - // unsafe { crate::mem::transmute::<[MaybeUninit; N], [U; N]>(dst) } - // SAFETY: At this point we've properly initialized the whole array - // and we just need to cast it to the correct type. - unsafe { crate::mem::transmute_copy::<_, [(T, U); N]>(&dst) } + let mut iter = IntoIter::new(self).zip(IntoIter::new(rhs)); + + // SAFETY: we know for certain that this iterator will yield exactly `N` + // items. + unsafe { collect_into_array_unchecked(&mut iter) } } /// Returns a slice containing the entire array. Equivalent to `&s[..]`. @@ -520,7 +489,7 @@ impl [T; N] { /// ``` /// /// This method is particularly useful if combined with other methods, like - /// [`map`](#method.map). This way, you can can avoid moving the original + /// [`map`](#method.map). This way, you can avoid moving the original /// array if its elements are not `Copy`. /// /// ``` @@ -535,16 +504,9 @@ impl [T; N] { /// ``` #[unstable(feature = "array_methods", issue = "76118")] pub fn each_ref(&self) -> [&T; N] { - // Unlike in `map`, we don't need a guard here, as dropping a reference - // is a noop. - let mut out = MaybeUninit::uninit_array::(); - for (src, dst) in self.iter().zip(&mut out) { - dst.write(src); - } - - // SAFETY: All elements of `dst` are properly initialized and - // `MaybeUninit` has the same layout as `T`, so this cast is valid. - unsafe { (&mut out as *mut _ as *mut [&T; N]).read() } + // SAFETY: we know for certain that this iterator will yield exactly `N` + // items. + unsafe { collect_into_array_unchecked(&mut self.iter()) } } /// Borrows each element mutably and returns an array of mutable references @@ -564,15 +526,103 @@ impl [T; N] { /// ``` #[unstable(feature = "array_methods", issue = "76118")] pub fn each_mut(&mut self) -> [&mut T; N] { - // Unlike in `map`, we don't need a guard here, as dropping a reference - // is a noop. - let mut out = MaybeUninit::uninit_array::(); - for (src, dst) in self.iter_mut().zip(&mut out) { - dst.write(src); + // SAFETY: we know for certain that this iterator will yield exactly `N` + // items. + unsafe { collect_into_array_unchecked(&mut self.iter_mut()) } + } +} + +/// Pulls `N` items from `iter` and returns them as an array. If the iterator +/// yields fewer than `N` items, this function exhibits undefined behavior. +/// +/// See [`collect_into_array`] for more information. +/// +/// +/// # Safety +/// +/// It is up to the caller to guarantee that `iter` yields at least `N` items. +/// Violating this condition causes undefined behavior. +unsafe fn collect_into_array_unchecked(iter: &mut I) -> [I::Item; N] +where + // Note: `TrustedLen` here is somewhat of an experiment. This is just an + // internal function, so feel free to remove if this bound turns out to be a + // bad idea. In that case, remember to also remove the lower bound + // `debug_assert!` below! + I: Iterator + TrustedLen, +{ + debug_assert!(N <= iter.size_hint().1.unwrap_or(usize::MAX)); + debug_assert!(N <= iter.size_hint().0); + + match collect_into_array(iter) { + Some(array) => array, + // SAFETY: covered by the function contract. + None => unsafe { crate::hint::unreachable_unchecked() }, + } +} + +/// Pulls `N` items from `iter` and returns them as an array. If the iterator +/// yields fewer than `N` items, `None` is returned and all already yielded +/// items are dropped. +/// +/// Since the iterator is passed as a mutable reference and this function calls +/// `next` at most `N` times, the iterator can still be used afterwards to +/// retrieve the remaining items. +/// +/// If `iter.next()` panicks, all items already yielded by the iterator are +/// dropped. +fn collect_into_array(iter: &mut I) -> Option<[I::Item; N]> +where + I: Iterator, +{ + if N == 0 { + // SAFETY: An empty array is always inhabited and has no validity invariants. + return unsafe { Some(mem::zeroed()) }; + } + + struct Guard { + ptr: *mut T, + initialized: usize, + } + + impl Drop for Guard { + fn drop(&mut self) { + debug_assert!(self.initialized <= N); + + let initialized_part = crate::ptr::slice_from_raw_parts_mut(self.ptr, self.initialized); + + // SAFETY: this raw slice will contain only initialized objects. + unsafe { + crate::ptr::drop_in_place(initialized_part); + } + } + } + + let mut array = MaybeUninit::uninit_array::(); + let mut guard: Guard<_, N> = + Guard { ptr: MaybeUninit::slice_as_mut_ptr(&mut array), initialized: 0 }; + + while let Some(item) = iter.next() { + // SAFETY: `guard.initialized` starts at 0, is increased by one in the + // loop and the loop is aborted once it reaches N (which is + // `array.len()`). + unsafe { + array.get_unchecked_mut(guard.initialized).write(item); } + guard.initialized += 1; + + // Check if the whole array was initialized. + if guard.initialized == N { + mem::forget(guard); - // SAFETY: All elements of `dst` are properly initialized and - // `MaybeUninit` has the same layout as `T`, so this cast is valid. - unsafe { (&mut out as *mut _ as *mut [&mut T; N]).read() } + // SAFETY: the condition above asserts that all elements are + // initialized. + let out = unsafe { MaybeUninit::array_assume_init(array) }; + return Some(out); + } } + + // This is only reached if the iterator is exhausted before + // `guard.initialized` reaches `N`. Also note that `guard` is dropped here, + // dropping all already initialized elements. + None } diff --git a/library/core/src/borrow.rs b/library/core/src/borrow.rs index c9040cd0a1..f28be20aaa 100644 --- a/library/core/src/borrow.rs +++ b/library/core/src/borrow.rs @@ -153,6 +153,7 @@ /// [`HashMap`]: ../../std/collections/struct.HashMap.html /// [`String`]: ../../std/string/struct.String.html #[stable(feature = "rust1", since = "1.0.0")] +#[rustc_diagnostic_item = "Borrow"] pub trait Borrow { /// Immutably borrows from an owned value. /// @@ -205,6 +206,7 @@ pub trait BorrowMut: Borrow { #[stable(feature = "rust1", since = "1.0.0")] impl Borrow for T { + #[rustc_diagnostic_item = "noop_method_borrow"] fn borrow(&self) -> &T { self } diff --git a/library/core/src/cell.rs b/library/core/src/cell.rs index 885422732e..2fbbeb35e1 100644 --- a/library/core/src/cell.rs +++ b/library/core/src/cell.rs @@ -378,7 +378,7 @@ impl Cell { } } - /// Replaces the contained value, and returns it. + /// Replaces the contained value with `val`, and returns the old contained value. /// /// # Examples /// @@ -1619,17 +1619,18 @@ impl fmt::Display for RefMut<'_, T> { /// The core primitive for interior mutability in Rust. /// -/// `UnsafeCell` is a type that wraps some `T` and indicates unsafe interior operations on the -/// wrapped type. Types with an `UnsafeCell` field are considered to have an 'unsafe interior'. -/// The `UnsafeCell` type is the only legal way to obtain aliasable data that is considered -/// mutable. In general, transmuting an `&T` type into an `&mut T` is considered undefined behavior. +/// If you have a reference `&T`, then normally in Rust the compiler performs optimizations based on +/// the knowledge that `&T` points to immutable data. Mutating that data, for example through an +/// alias or by transmuting an `&T` into an `&mut T`, is considered undefined behavior. +/// `UnsafeCell` opts-out of the immutability guarantee for `&T`: a shared reference +/// `&UnsafeCell` may point to data that is being mutated. This is called "interior mutability". /// -/// If you have a reference `&SomeStruct`, then normally in Rust all fields of `SomeStruct` are -/// immutable. The compiler makes optimizations based on the knowledge that `&T` is not mutably -/// aliased or mutated, and that `&mut T` is unique. `UnsafeCell` is the only core language -/// feature to work around the restriction that `&T` may not be mutated. All other types that -/// allow internal mutability, such as `Cell` and `RefCell`, use `UnsafeCell` to wrap their -/// internal data. There is *no* legal way to obtain aliasing `&mut`, not even with `UnsafeCell`. +/// All other types that allow internal mutability, such as `Cell` and `RefCell`, internally +/// use `UnsafeCell` to wrap their data. +/// +/// Note that only the immutability guarantee for shared references is affected by `UnsafeCell`. The +/// uniqueness guarantee for mutable references is unaffected. There is *no* legal way to obtain +/// aliasing `&mut`, not even with `UnsafeCell`. /// /// The `UnsafeCell` API itself is technically very simple: [`.get()`] gives you a raw pointer /// `*mut T` to its contents. It is up to _you_ as the abstraction designer to use that raw pointer diff --git a/library/core/src/char/methods.rs b/library/core/src/char/methods.rs index 2baea7842a..87a3d375a6 100644 --- a/library/core/src/char/methods.rs +++ b/library/core/src/char/methods.rs @@ -1,5 +1,6 @@ //! impl char {} +use crate::intrinsics::likely; use crate::slice; use crate::str::from_utf8_unchecked_mut; use crate::unicode::printable::is_printable; @@ -17,7 +18,7 @@ impl char { /// /// [Unicode Scalar Value]: http://www.unicode.org/glossary/#unicode_scalar_value /// [Code Point]: http://www.unicode.org/glossary/#code_point - #[unstable(feature = "assoc_char_consts", reason = "recently added", issue = "71763")] + #[stable(feature = "assoc_char_consts", since = "1.52.0")] pub const MAX: char = '\u{10ffff}'; /// `U+FFFD REPLACEMENT CHARACTER` (�) is used in Unicode to represent a @@ -25,7 +26,7 @@ impl char { /// /// It can occur, for example, when giving ill-formed UTF-8 bytes to /// [`String::from_utf8_lossy`](string/struct.String.html#method.from_utf8_lossy). - #[unstable(feature = "assoc_char_consts", reason = "recently added", issue = "71763")] + #[stable(feature = "assoc_char_consts", since = "1.52.0")] pub const REPLACEMENT_CHARACTER: char = '\u{FFFD}'; /// The version of [Unicode](http://www.unicode.org/) that the Unicode parts of @@ -38,7 +39,7 @@ impl char { /// /// The version numbering scheme is explained in /// [Unicode 11.0 or later, Section 3.1 Versions of the Unicode Standard](https://www.unicode.org/versions/Unicode11.0.0/ch03.pdf#page=4). - #[unstable(feature = "assoc_char_consts", reason = "recently added", issue = "71763")] + #[stable(feature = "assoc_char_consts", since = "1.52.0")] pub const UNICODE_VERSION: (u8, u8, u8) = crate::unicode::UNICODE_VERSION; /// Creates an iterator over the UTF-16 encoded code points in `iter`, @@ -87,7 +88,7 @@ impl char { /// "𝄞mus�ic�" /// ); /// ``` - #[unstable(feature = "assoc_char_funcs", reason = "recently added", issue = "71763")] + #[stable(feature = "assoc_char_funcs", since = "1.52.0")] #[inline] pub fn decode_utf16>(iter: I) -> DecodeUtf16 { super::decode::decode_utf16(iter) @@ -135,7 +136,7 @@ impl char { /// /// assert_eq!(None, c); /// ``` - #[unstable(feature = "assoc_char_funcs", reason = "recently added", issue = "71763")] + #[stable(feature = "assoc_char_funcs", since = "1.52.0")] #[inline] pub fn from_u32(i: u32) -> Option { super::convert::from_u32(i) @@ -176,7 +177,7 @@ impl char { /// /// assert_eq!('❤', c); /// ``` - #[unstable(feature = "assoc_char_funcs", reason = "recently added", issue = "71763")] + #[stable(feature = "assoc_char_funcs", since = "1.52.0")] #[inline] pub unsafe fn from_u32_unchecked(i: u32) -> char { // SAFETY: the safety contract must be upheld by the caller. @@ -232,7 +233,7 @@ impl char { /// // this panics /// char::from_digit(1, 37); /// ``` - #[unstable(feature = "assoc_char_funcs", reason = "recently added", issue = "71763")] + #[stable(feature = "assoc_char_funcs", since = "1.52.0")] #[inline] pub fn from_digit(num: u32, radix: u32) -> Option { super::convert::from_digit(num, radix) @@ -331,14 +332,11 @@ impl char { #[inline] pub fn to_digit(self, radix: u32) -> Option { assert!(radix <= 36, "to_digit: radix is too high (maximum 36)"); - // the code is split up here to improve execution speed for cases where // the `radix` is constant and 10 or smaller - let val = if radix <= 10 { - match self { - '0'..='9' => self as u32 - '0' as u32, - _ => return None, - } + let val = if likely(radix <= 10) { + // If not a digit, a number greater than radix will be created. + (self as u32).wrapping_sub('0' as u32) } else { match self { '0'..='9' => self as u32 - '0' as u32, @@ -571,8 +569,9 @@ impl char { /// assert_eq!(len, tokyo.len()); /// ``` #[stable(feature = "rust1", since = "1.0.0")] + #[rustc_const_stable(feature = "const_char_len_utf", since = "1.52.0")] #[inline] - pub fn len_utf8(self) -> usize { + pub const fn len_utf8(self) -> usize { len_utf8(self as u32) } @@ -596,8 +595,9 @@ impl char { /// assert_eq!(len, 2); /// ``` #[stable(feature = "rust1", since = "1.0.0")] + #[rustc_const_stable(feature = "const_char_len_utf", since = "1.52.0")] #[inline] - pub fn len_utf16(self) -> usize { + pub const fn len_utf16(self) -> usize { let ch = self as u32; if (ch & 0xFFFF) == ch { 1 } else { 2 } } @@ -1088,9 +1088,14 @@ impl char { /// [`make_ascii_uppercase()`]: #method.make_ascii_uppercase /// [`to_uppercase()`]: #method.to_uppercase #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")] + #[rustc_const_stable(feature = "const_ascii_methods_on_intrinsics", since = "1.52.0")] #[inline] - pub fn to_ascii_uppercase(&self) -> char { - if self.is_ascii() { (*self as u8).to_ascii_uppercase() as char } else { *self } + pub const fn to_ascii_uppercase(&self) -> char { + if self.is_ascii_lowercase() { + (*self as u8).ascii_change_case_unchecked() as char + } else { + *self + } } /// Makes a copy of the value in its ASCII lower case equivalent. @@ -1116,9 +1121,14 @@ impl char { /// [`make_ascii_lowercase()`]: #method.make_ascii_lowercase /// [`to_lowercase()`]: #method.to_lowercase #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")] + #[rustc_const_stable(feature = "const_ascii_methods_on_intrinsics", since = "1.52.0")] #[inline] - pub fn to_ascii_lowercase(&self) -> char { - if self.is_ascii() { (*self as u8).to_ascii_lowercase() as char } else { *self } + pub const fn to_ascii_lowercase(&self) -> char { + if self.is_ascii_uppercase() { + (*self as u8).ascii_change_case_unchecked() as char + } else { + *self + } } /// Checks that two values are an ASCII case-insensitive match. @@ -1137,8 +1147,9 @@ impl char { /// assert!(!upper_a.eq_ignore_ascii_case(&lower_z)); /// ``` #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")] + #[rustc_const_stable(feature = "const_ascii_methods_on_intrinsics", since = "1.52.0")] #[inline] - pub fn eq_ignore_ascii_case(&self, other: &char) -> bool { + pub const fn eq_ignore_ascii_case(&self, other: &char) -> bool { self.to_ascii_lowercase() == other.to_ascii_lowercase() } @@ -1555,7 +1566,7 @@ impl char { } #[inline] -fn len_utf8(code: u32) -> usize { +const fn len_utf8(code: u32) -> usize { if code < MAX_ONE_B { 1 } else if code < MAX_TWO_B { diff --git a/library/core/src/char/mod.rs b/library/core/src/char/mod.rs index 7a68de5e6a..788fafa0ad 100644 --- a/library/core/src/char/mod.rs +++ b/library/core/src/char/mod.rs @@ -9,8 +9,7 @@ //! [Unicode code point]: http://www.unicode.org/glossary/#code_point //! //! This module exists for technical reasons, the primary documentation for -//! `char` is directly on [the `char` primitive type](../../std/primitive.char.html) -//! itself. +//! `char` is directly on [the `char` primitive type][char] itself. //! //! This module is the home of the iterator implementations for the iterators //! implemented on `char`, as well as some useful constants and conversion diff --git a/library/core/src/clone.rs b/library/core/src/clone.rs index a953a3a418..51a2dc03de 100644 --- a/library/core/src/clone.rs +++ b/library/core/src/clone.rs @@ -104,12 +104,14 @@ /// [impls]: #implementors #[stable(feature = "rust1", since = "1.0.0")] #[lang = "clone"] +#[rustc_diagnostic_item = "Clone"] pub trait Clone: Sized { /// Returns a copy of the value. /// /// # Examples /// /// ``` + /// # #![allow(noop_method_call)] /// let hello = "Hello"; // &str implements Clone /// /// assert_eq!("Hello", hello.clone()); @@ -221,6 +223,7 @@ mod impls { #[stable(feature = "rust1", since = "1.0.0")] impl Clone for &T { #[inline] + #[rustc_diagnostic_item = "noop_method_clone"] fn clone(&self) -> Self { *self } diff --git a/library/core/src/cmp.rs b/library/core/src/cmp.rs index 4a15b185a8..5bab1fb93d 100644 --- a/library/core/src/cmp.rs +++ b/library/core/src/cmp.rs @@ -579,6 +579,7 @@ impl Ordering { /// ``` #[derive(PartialEq, Eq, Debug, Copy, Clone, Default, Hash)] #[stable(feature = "reverse_cmp_key", since = "1.19.0")] +#[repr(transparent)] pub struct Reverse(#[stable(feature = "reverse_cmp_key", since = "1.19.0")] pub T); #[stable(feature = "reverse_cmp_key", since = "1.19.0")] diff --git a/library/core/src/convert/mod.rs b/library/core/src/convert/mod.rs index e1b19e4b73..65af8508a6 100644 --- a/library/core/src/convert/mod.rs +++ b/library/core/src/convert/mod.rs @@ -463,7 +463,6 @@ pub trait TryInto: Sized { /// ``` /// /// [`try_from`]: TryFrom::try_from -/// [`!`]: ../../std/primitive.never.html #[rustc_diagnostic_item = "try_from_trait"] #[stable(feature = "try_from", since = "1.34.0")] pub trait TryFrom: Sized { @@ -673,8 +672,6 @@ impl AsMut for str { /// However when `Infallible` becomes an alias for the never type, /// the two `impl`s will start to overlap /// and therefore will be disallowed by the language’s trait coherence rules. -/// -/// [never]: ../../std/primitive.never.html #[stable(feature = "convert_infallible", since = "1.34.0")] #[derive(Copy)] pub enum Infallible {} diff --git a/library/core/src/convert/num.rs b/library/core/src/convert/num.rs index 2dd5e813d6..5b113610a5 100644 --- a/library/core/src/convert/num.rs +++ b/library/core/src/convert/num.rs @@ -9,7 +9,7 @@ mod private { pub trait Sealed {} } -/// Supporting trait for inherent methods of `f32` and `f64` such as `round_unchecked_to`. +/// Supporting trait for inherent methods of `f32` and `f64` such as `to_int_unchecked`. /// Typically doesn’t need to be used directly. #[unstable(feature = "convert_float_to_int", issue = "67057")] pub trait FloatToInt: private::Sealed + Sized { diff --git a/library/core/src/default.rs b/library/core/src/default.rs index 28ec327945..fd7159d35f 100644 --- a/library/core/src/default.rs +++ b/library/core/src/default.rs @@ -80,6 +80,7 @@ /// bar: f32, /// } /// ``` +#[cfg_attr(not(test), rustc_diagnostic_item = "Default")] #[stable(feature = "rust1", since = "1.0.0")] pub trait Default: Sized { /// Returns the "default value" for a type. diff --git a/library/core/src/ffi.rs b/library/core/src/ffi.rs index 4b303acfd3..9302baa823 100644 --- a/library/core/src/ffi.rs +++ b/library/core/src/ffi.rs @@ -21,7 +21,6 @@ use crate::ops::{Deref, DerefMut}; /// compiler down to 1.1.0. After Rust 1.30.0, it was re-exported by /// this definition. For more information, please read [RFC 2521]. /// -/// [pointer]: ../../std/primitive.pointer.html /// [Nomicon]: https://doc.rust-lang.org/nomicon/ffi.html#representing-opaque-structs /// [RFC 2521]: https://github.com/rust-lang/rfcs/blob/master/text/2521-c_void-reunification.md // N.B., for LLVM to recognize the void pointer type and by extension diff --git a/library/core/src/fmt/mod.rs b/library/core/src/fmt/mod.rs index 73cf5d138b..2df5e56274 100644 --- a/library/core/src/fmt/mod.rs +++ b/library/core/src/fmt/mod.rs @@ -401,8 +401,6 @@ impl<'a> Arguments<'a> { /// # Examples /// /// ```rust - /// #![feature(fmt_as_str)] - /// /// use std::fmt::Arguments; /// /// fn write_str(_: &str) { /* ... */ } @@ -417,13 +415,11 @@ impl<'a> Arguments<'a> { /// ``` /// /// ```rust - /// #![feature(fmt_as_str)] - /// /// assert_eq!(format_args!("hello").as_str(), Some("hello")); /// assert_eq!(format_args!("").as_str(), Some("")); /// assert_eq!(format_args!("{}", 1).as_str(), None); /// ``` - #[unstable(feature = "fmt_as_str", issue = "74442")] + #[stable(feature = "fmt_as_str", since = "1.52.0")] #[inline] pub fn as_str(&self) -> Option<&'static str> { match (self.pieces, self.args) { diff --git a/library/core/src/hash/mod.rs b/library/core/src/hash/mod.rs index f53ba98143..7bfa58d34e 100644 --- a/library/core/src/hash/mod.rs +++ b/library/core/src/hash/mod.rs @@ -1,7 +1,13 @@ //! Generic hashing support. //! -//! This module provides a generic way to compute the hash of a value. The -//! simplest way to make a type hashable is to use `#[derive(Hash)]`: +//! This module provides a generic way to compute the [hash] of a value. +//! Hashes are most commonly used with [`HashMap`] and [`HashSet`]. +//! +//! [hash]: https://en.wikipedia.org/wiki/Hash_function +//! [`HashMap`]: ../../std/collections/struct.HashMap.html +//! [`HashSet`]: ../../std/collections/struct.HashSet.html +//! +//! The simplest way to make a type hashable is to use `#[derive(Hash)]`: //! //! # Examples //! @@ -548,10 +554,12 @@ mod impls { ($(($ty:ident, $meth:ident),)*) => {$( #[stable(feature = "rust1", since = "1.0.0")] impl Hash for $ty { + #[inline] fn hash(&self, state: &mut H) { state.$meth(*self) } + #[inline] fn hash_slice(data: &[$ty], state: &mut H) { let newlen = data.len() * mem::size_of::<$ty>(); let ptr = data.as_ptr() as *const u8; @@ -582,6 +590,7 @@ mod impls { #[stable(feature = "rust1", since = "1.0.0")] impl Hash for bool { + #[inline] fn hash(&self, state: &mut H) { state.write_u8(*self as u8) } @@ -589,6 +598,7 @@ mod impls { #[stable(feature = "rust1", since = "1.0.0")] impl Hash for char { + #[inline] fn hash(&self, state: &mut H) { state.write_u32(*self as u32) } @@ -596,6 +606,7 @@ mod impls { #[stable(feature = "rust1", since = "1.0.0")] impl Hash for str { + #[inline] fn hash(&self, state: &mut H) { state.write(self.as_bytes()); state.write_u8(0xff) @@ -604,6 +615,7 @@ mod impls { #[stable(feature = "never_hash", since = "1.29.0")] impl Hash for ! { + #[inline] fn hash(&self, _: &mut H) { *self } @@ -613,6 +625,7 @@ mod impls { () => ( #[stable(feature = "rust1", since = "1.0.0")] impl Hash for () { + #[inline] fn hash(&self, _state: &mut H) {} } ); @@ -621,6 +634,7 @@ mod impls { #[stable(feature = "rust1", since = "1.0.0")] impl<$($name: Hash),+> Hash for ($($name,)+) where last_type!($($name,)+): ?Sized { #[allow(non_snake_case)] + #[inline] fn hash(&self, state: &mut S) { let ($(ref $name,)+) = *self; $($name.hash(state);)+ @@ -650,6 +664,7 @@ mod impls { #[stable(feature = "rust1", since = "1.0.0")] impl Hash for [T] { + #[inline] fn hash(&self, state: &mut H) { self.len().hash(state); Hash::hash_slice(self, state) @@ -658,6 +673,7 @@ mod impls { #[stable(feature = "rust1", since = "1.0.0")] impl Hash for &T { + #[inline] fn hash(&self, state: &mut H) { (**self).hash(state); } @@ -665,6 +681,7 @@ mod impls { #[stable(feature = "rust1", since = "1.0.0")] impl Hash for &mut T { + #[inline] fn hash(&self, state: &mut H) { (**self).hash(state); } @@ -672,40 +689,60 @@ mod impls { #[stable(feature = "rust1", since = "1.0.0")] impl Hash for *const T { + #[inline] fn hash(&self, state: &mut H) { - if mem::size_of::() == mem::size_of::() { - // Thin pointer - state.write_usize(*self as *const () as usize); - } else { - // Fat pointer - // SAFETY: we are accessing the memory occupied by `self` - // which is guaranteed to be valid. - // This assumes a fat pointer can be represented by a `(usize, usize)`, - // which is safe to do in `std` because it is shipped and kept in sync - // with the implementation of fat pointers in `rustc`. - let (a, b) = unsafe { *(self as *const Self as *const (usize, usize)) }; - state.write_usize(a); - state.write_usize(b); + #[cfg(not(bootstrap))] + { + let (address, metadata) = self.to_raw_parts(); + state.write_usize(address as usize); + metadata.hash(state); + } + #[cfg(bootstrap)] + { + if mem::size_of::() == mem::size_of::() { + // Thin pointer + state.write_usize(*self as *const () as usize); + } else { + // Fat pointer + // SAFETY: we are accessing the memory occupied by `self` + // which is guaranteed to be valid. + // This assumes a fat pointer can be represented by a `(usize, usize)`, + // which is safe to do in `std` because it is shipped and kept in sync + // with the implementation of fat pointers in `rustc`. + let (a, b) = unsafe { *(self as *const Self as *const (usize, usize)) }; + state.write_usize(a); + state.write_usize(b); + } } } } #[stable(feature = "rust1", since = "1.0.0")] impl Hash for *mut T { + #[inline] fn hash(&self, state: &mut H) { - if mem::size_of::() == mem::size_of::() { - // Thin pointer - state.write_usize(*self as *const () as usize); - } else { - // Fat pointer - // SAFETY: we are accessing the memory occupied by `self` - // which is guaranteed to be valid. - // This assumes a fat pointer can be represented by a `(usize, usize)`, - // which is safe to do in `std` because it is shipped and kept in sync - // with the implementation of fat pointers in `rustc`. - let (a, b) = unsafe { *(self as *const Self as *const (usize, usize)) }; - state.write_usize(a); - state.write_usize(b); + #[cfg(not(bootstrap))] + { + let (address, metadata) = self.to_raw_parts(); + state.write_usize(address as usize); + metadata.hash(state); + } + #[cfg(bootstrap)] + { + if mem::size_of::() == mem::size_of::() { + // Thin pointer + state.write_usize(*self as *const () as usize); + } else { + // Fat pointer + // SAFETY: we are accessing the memory occupied by `self` + // which is guaranteed to be valid. + // This assumes a fat pointer can be represented by a `(usize, usize)`, + // which is safe to do in `std` because it is shipped and kept in sync + // with the implementation of fat pointers in `rustc`. + let (a, b) = unsafe { *(self as *const Self as *const (usize, usize)) }; + state.write_usize(a); + state.write_usize(b); + } } } } diff --git a/library/core/src/intrinsics.rs b/library/core/src/intrinsics.rs index 7c1a9b82f9..b5371d6b69 100644 --- a/library/core/src/intrinsics.rs +++ b/library/core/src/intrinsics.rs @@ -65,9 +65,13 @@ use crate::sync::atomic::{self, AtomicBool, AtomicI32, AtomicIsize, AtomicU32, O #[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" + since = "1.52.0" )] -pub use crate::ptr::drop_in_place; +#[inline] +pub unsafe fn drop_in_place(to_drop: *mut T) { + // SAFETY: see `ptr::drop_in_place` + unsafe { crate::ptr::drop_in_place(to_drop) } +} extern "rust-intrinsic" { // N.B., these intrinsics take raw pointers because they mutate aliased @@ -833,6 +837,7 @@ extern "rust-intrinsic" { /// /// This exists solely for [`mem::forget_unsized`]; normal `forget` uses /// `ManuallyDrop` instead. + #[rustc_const_unstable(feature = "const_intrinsic_forget", issue = "none")] pub fn forget(_: T); /// Reinterprets the bits of a value of one type as another type. @@ -845,6 +850,12 @@ extern "rust-intrinsic" { /// destination value, then forgets the original. It's equivalent to C's /// `memcpy` under the hood, just like `transmute_copy`. /// + /// Because `transmute` is a by-value operation, alignment of the *transmuted values + /// themselves* is not a concern. As with any other function, the compiler already ensures + /// both `T` and `U` are properly aligned. However, when transmuting values that *point + /// elsewhere* (such as pointers, references, boxes…), the caller has to ensure proper + /// alignment of the pointed-to values. + /// /// `transmute` is **incredibly** unsafe. There are a vast number of ways to /// cause [undefined behavior][ub] with this function. `transmute` should be /// the absolute last resort. @@ -964,7 +975,13 @@ extern "rust-intrinsic" { /// assert_eq!(b"Rust", &[82, 117, 115, 116]); /// ``` /// - /// Turning a `Vec<&T>` into a `Vec>`: + /// Turning a `Vec<&T>` into a `Vec>`. + /// + /// To transmute the inner type of the contents of a container, you must make sure to not + /// violate any of the container's invariants. For `Vec`, this means that both the size + /// *and alignment* of the inner types have to match. Other containers might rely on the + /// size of the type, alignment, or even the `TypeId`, in which case transmuting wouldn't + /// be possible at all without violating the container invariants. /// /// ``` /// let store = [0, 1, 2, 3]; @@ -990,14 +1007,11 @@ extern "rust-intrinsic" { /// /// let v_clone = v_orig.clone(); /// - /// // The no-copy, unsafe way, still using transmute, but not relying on the data layout. - /// // Like the first approach, this reuses the `Vec` internals. - /// // Therefore, the new inner type must have the - /// // exact same size, *and the same alignment*, as the old type. - /// // The same caveats exist for this method as transmute, for - /// // the original inner type (`&i32`) to the converted inner type - /// // (`Option<&i32>`), so read the nomicon pages linked above and also - /// // consult the [`from_raw_parts`] documentation. + /// // This is the proper no-copy, unsafe way of "transmuting" a `Vec`, without relying on the + /// // data layout. Instead of literally calling `transmute`, we perform a pointer cast, but + /// // in terms of converting the original inner type (`&i32`) to the new one (`Option<&i32>`), + /// // this has all the same caveats. Besides the information provided above, also consult the + /// // [`from_raw_parts`] documentation. /// let v_from_raw = unsafe { // FIXME Update this when vec_into_raw_parts is stabilized /// // Ensure the original vector is not dropped. @@ -1092,8 +1106,7 @@ extern "rust-intrinsic" { /// bounds or arithmetic overflow occurs then any further use of the /// returned value will result in undefined behavior. /// - /// The stabilized version of this intrinsic is - /// [`std::pointer::offset`](../../std/primitive.pointer.html#method.offset). + /// The stabilized version of this intrinsic is [`pointer::offset`]. #[must_use = "returns a new pointer rather than modifying its argument"] #[rustc_const_unstable(feature = "const_ptr_offset", issue = "71499")] pub fn offset(dst: *const T, offset: isize) -> *const T; @@ -1110,8 +1123,7 @@ extern "rust-intrinsic" { /// object, and it wraps with two's complement arithmetic. The resulting /// value is not necessarily valid to be used to actually access memory. /// - /// The stabilized version of this intrinsic is - /// [`std::pointer::wrapping_offset`](../../std/primitive.pointer.html#method.wrapping_offset). + /// The stabilized version of this intrinsic is [`pointer::wrapping_offset`]. #[must_use = "returns a new pointer rather than modifying its argument"] #[rustc_const_unstable(feature = "const_ptr_offset", issue = "71499")] pub fn arith_offset(dst: *const T, offset: isize) -> *const T; @@ -1586,7 +1598,7 @@ extern "rust-intrinsic" { /// Safe wrappers for this intrinsic are available on the integer /// primitives via the `checked_div` method. For example, /// [`u32::checked_div`] - #[rustc_const_unstable(feature = "const_int_unchecked_arith", issue = "none")] + #[rustc_const_stable(feature = "const_int_unchecked_arith", since = "1.52.0")] pub fn unchecked_div(x: T, y: T) -> T; /// Returns the remainder of an unchecked division, resulting in /// undefined behavior when `y == 0` or `x == T::MIN && y == -1` @@ -1594,7 +1606,7 @@ extern "rust-intrinsic" { /// Safe wrappers for this intrinsic are available on the integer /// primitives via the `checked_rem` method. For example, /// [`u32::checked_rem`] - #[rustc_const_unstable(feature = "const_int_unchecked_arith", issue = "none")] + #[rustc_const_stable(feature = "const_int_unchecked_arith", since = "1.52.0")] pub fn unchecked_rem(x: T, y: T) -> T; /// Performs an unchecked left shift, resulting in undefined behavior when @@ -1688,8 +1700,8 @@ extern "rust-intrinsic" { #[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', - /// cast to a `u64`; if `T` has no discriminant, returns `0`. + /// Returns the value of the discriminant for the variant in 'v'; + /// if `T` has no discriminant, returns `0`. /// /// The stabilized version of this intrinsic is [`core::mem::discriminant`](crate::mem::discriminant). #[rustc_const_unstable(feature = "const_discriminant", issue = "69821")] @@ -1730,6 +1742,157 @@ extern "rust-intrinsic" { /// Allocate at compile time. Should not be called at runtime. #[rustc_const_unstable(feature = "const_heap", issue = "79597")] pub fn const_allocate(size: usize, align: usize) -> *mut u8; + + /// Copies `count * size_of::()` bytes from `src` to `dst`. The source + /// and destination must *not* overlap. + /// + /// For regions of memory which might overlap, use [`copy`] instead. + /// + /// `copy_nonoverlapping` is semantically equivalent to C's [`memcpy`], but + /// with the argument order swapped. + /// + /// [`memcpy`]: https://en.cppreference.com/w/c/string/byte/memcpy + /// + /// # Safety + /// + /// Behavior is undefined if any of the following conditions are violated: + /// + /// * `src` must be [valid] for reads of `count * size_of::()` bytes. + /// + /// * `dst` must be [valid] for writes of `count * size_of::()` bytes. + /// + /// * Both `src` and `dst` must be properly aligned. + /// + /// * The region of memory beginning at `src` with a size of `count * + /// size_of::()` bytes must *not* overlap with the region of memory + /// beginning at `dst` with the same size. + /// + /// Like [`read`], `copy_nonoverlapping` creates a bitwise copy of `T`, regardless of + /// whether `T` is [`Copy`]. If `T` is not [`Copy`], using *both* the values + /// in the region beginning at `*src` and the region beginning at `*dst` can + /// [violate memory safety][read-ownership]. + /// + /// Note that even if the effectively copied size (`count * size_of::()`) is + /// `0`, the pointers must be non-NULL and properly aligned. + /// + /// [`read`]: crate::ptr::read + /// [read-ownership]: crate::ptr::read#ownership-of-the-returned-value + /// [valid]: crate::ptr#safety + /// + /// # Examples + /// + /// Manually implement [`Vec::append`]: + /// + /// ``` + /// use std::ptr; + /// + /// /// Moves all the elements of `src` into `dst`, leaving `src` empty. + /// fn append(dst: &mut Vec, src: &mut Vec) { + /// let src_len = src.len(); + /// let dst_len = dst.len(); + /// + /// // Ensure that `dst` has enough capacity to hold all of `src`. + /// dst.reserve(src_len); + /// + /// unsafe { + /// // The call to offset is always safe because `Vec` will never + /// // allocate more than `isize::MAX` bytes. + /// let dst_ptr = dst.as_mut_ptr().offset(dst_len as isize); + /// let src_ptr = src.as_ptr(); + /// + /// // Truncate `src` without dropping its contents. We do this first, + /// // to avoid problems in case something further down panics. + /// src.set_len(0); + /// + /// // The two regions cannot overlap because mutable references do + /// // not alias, and two different vectors cannot own the same + /// // memory. + /// ptr::copy_nonoverlapping(src_ptr, dst_ptr, src_len); + /// + /// // Notify `dst` that it now holds the contents of `src`. + /// dst.set_len(dst_len + src_len); + /// } + /// } + /// + /// let mut a = vec!['r']; + /// let mut b = vec!['u', 's', 't']; + /// + /// append(&mut a, &mut b); + /// + /// assert_eq!(a, &['r', 'u', 's', 't']); + /// assert!(b.is_empty()); + /// ``` + /// + /// [`Vec::append`]: ../../std/vec/struct.Vec.html#method.append + #[doc(alias = "memcpy")] + #[stable(feature = "rust1", since = "1.0.0")] + #[rustc_const_unstable(feature = "const_intrinsic_copy", issue = "80697")] + pub fn copy_nonoverlapping(src: *const T, dst: *mut T, count: usize); + + /// Copies `count * size_of::()` bytes from `src` to `dst`. The source + /// and destination may overlap. + /// + /// If the source and destination will *never* overlap, + /// [`copy_nonoverlapping`] can be used instead. + /// + /// `copy` is semantically equivalent to C's [`memmove`], but with the argument + /// order swapped. Copying takes place as if the bytes were copied from `src` + /// to a temporary array and then copied from the array to `dst`. + /// + /// [`memmove`]: https://en.cppreference.com/w/c/string/byte/memmove + /// + /// # Safety + /// + /// Behavior is undefined if any of the following conditions are violated: + /// + /// * `src` must be [valid] for reads of `count * size_of::()` bytes. + /// + /// * `dst` must be [valid] for writes of `count * size_of::()` bytes. + /// + /// * Both `src` and `dst` must be properly aligned. + /// + /// Like [`read`], `copy` creates a bitwise copy of `T`, regardless of + /// whether `T` is [`Copy`]. If `T` is not [`Copy`], using both the values + /// in the region beginning at `*src` and the region beginning at `*dst` can + /// [violate memory safety][read-ownership]. + /// + /// Note that even if the effectively copied size (`count * size_of::()`) is + /// `0`, the pointers must be non-NULL and properly aligned. + /// + /// [`read`]: crate::ptr::read + /// [read-ownership]: crate::ptr::read#ownership-of-the-returned-value + /// [valid]: crate::ptr#safety + /// + /// # Examples + /// + /// Efficiently create a Rust vector from an unsafe buffer: + /// + /// ``` + /// use std::ptr; + /// + /// /// # Safety + /// /// + /// /// * `ptr` must be correctly aligned for its type and non-zero. + /// /// * `ptr` must be valid for reads of `elts` contiguous elements of type `T`. + /// /// * Those elements must not be used after calling this function unless `T: Copy`. + /// # #[allow(dead_code)] + /// unsafe fn from_buf_raw(ptr: *const T, elts: usize) -> Vec { + /// let mut dst = Vec::with_capacity(elts); + /// + /// // SAFETY: Our precondition ensures the source is aligned and valid, + /// // and `Vec::with_capacity` ensures that we have usable space to write them. + /// ptr::copy(ptr, dst.as_mut_ptr(), elts); + /// + /// // SAFETY: We created it with this much capacity earlier, + /// // and the previous `copy` has initialized these elements. + /// dst.set_len(elts); + /// dst + /// } + /// ``` + #[doc(alias = "memmove")] + #[stable(feature = "rust1", since = "1.0.0")] + #[rustc_const_unstable(feature = "const_intrinsic_copy", issue = "80697")] + pub fn copy(src: *const T, dst: *mut T, count: usize); } // Some functions are defined here because they accidentally got made @@ -1743,204 +1906,6 @@ pub(crate) fn is_aligned_and_not_null(ptr: *const T) -> bool { !ptr.is_null() && ptr as usize % mem::align_of::() == 0 } -/// Checks whether the regions of memory starting at `src` and `dst` of size -/// `count * size_of::()` do *not* overlap. -pub(crate) fn is_nonoverlapping(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 }; - // If the absolute distance between the ptrs is at least as big as the size of the buffer, - // they do not overlap. - diff >= size -} - -/// Copies `count * size_of::()` bytes from `src` to `dst`. The source -/// and destination must *not* overlap. -/// -/// For regions of memory which might overlap, use [`copy`] instead. -/// -/// `copy_nonoverlapping` is semantically equivalent to C's [`memcpy`], but -/// with the argument order swapped. -/// -/// [`memcpy`]: https://en.cppreference.com/w/c/string/byte/memcpy -/// -/// # Safety -/// -/// Behavior is undefined if any of the following conditions are violated: -/// -/// * `src` must be [valid] for reads of `count * size_of::()` bytes. -/// -/// * `dst` must be [valid] for writes of `count * size_of::()` bytes. -/// -/// * Both `src` and `dst` must be properly aligned. -/// -/// * The region of memory beginning at `src` with a size of `count * -/// size_of::()` bytes must *not* overlap with the region of memory -/// beginning at `dst` with the same size. -/// -/// Like [`read`], `copy_nonoverlapping` creates a bitwise copy of `T`, regardless of -/// whether `T` is [`Copy`]. If `T` is not [`Copy`], using *both* the values -/// in the region beginning at `*src` and the region beginning at `*dst` can -/// [violate memory safety][read-ownership]. -/// -/// Note that even if the effectively copied size (`count * size_of::()`) is -/// `0`, the pointers must be non-NULL and properly aligned. -/// -/// [`read`]: crate::ptr::read -/// [read-ownership]: crate::ptr::read#ownership-of-the-returned-value -/// [valid]: crate::ptr#safety -/// -/// # Examples -/// -/// Manually implement [`Vec::append`]: -/// -/// ``` -/// use std::ptr; -/// -/// /// Moves all the elements of `src` into `dst`, leaving `src` empty. -/// fn append(dst: &mut Vec, src: &mut Vec) { -/// let src_len = src.len(); -/// let dst_len = dst.len(); -/// -/// // Ensure that `dst` has enough capacity to hold all of `src`. -/// dst.reserve(src_len); -/// -/// unsafe { -/// // The call to offset is always safe because `Vec` will never -/// // allocate more than `isize::MAX` bytes. -/// let dst_ptr = dst.as_mut_ptr().offset(dst_len as isize); -/// let src_ptr = src.as_ptr(); -/// -/// // Truncate `src` without dropping its contents. We do this first, -/// // to avoid problems in case something further down panics. -/// src.set_len(0); -/// -/// // The two regions cannot overlap because mutable references do -/// // not alias, and two different vectors cannot own the same -/// // memory. -/// ptr::copy_nonoverlapping(src_ptr, dst_ptr, src_len); -/// -/// // Notify `dst` that it now holds the contents of `src`. -/// dst.set_len(dst_len + src_len); -/// } -/// } -/// -/// let mut a = vec!['r']; -/// let mut b = vec!['u', 's', 't']; -/// -/// append(&mut a, &mut b); -/// -/// assert_eq!(a, &['r', 'u', 's', 't']); -/// assert!(b.is_empty()); -/// ``` -/// -/// [`Vec::append`]: ../../std/vec/struct.Vec.html#method.append -#[doc(alias = "memcpy")] -#[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature = "const_intrinsic_copy", issue = "80697")] -#[inline] -pub const unsafe fn copy_nonoverlapping(src: *const T, dst: *mut T, count: usize) { - extern "rust-intrinsic" { - #[rustc_const_unstable(feature = "const_intrinsic_copy", issue = "80697")] - fn copy_nonoverlapping(src: *const T, dst: *mut T, count: usize); - } - - // FIXME: Perform these checks only at run time - /*if cfg!(debug_assertions) - && !(is_aligned_and_not_null(src) - && is_aligned_and_not_null(dst) - && is_nonoverlapping(src, dst, count)) - { - // Not panicking to keep codegen impact smaller. - abort(); - }*/ - - // SAFETY: the safety contract for `copy_nonoverlapping` must be - // upheld by the caller. - unsafe { copy_nonoverlapping(src, dst, count) } -} - -/// Copies `count * size_of::()` bytes from `src` to `dst`. The source -/// and destination may overlap. -/// -/// If the source and destination will *never* overlap, -/// [`copy_nonoverlapping`] can be used instead. -/// -/// `copy` is semantically equivalent to C's [`memmove`], but with the argument -/// order swapped. Copying takes place as if the bytes were copied from `src` -/// to a temporary array and then copied from the array to `dst`. -/// -/// [`memmove`]: https://en.cppreference.com/w/c/string/byte/memmove -/// -/// # Safety -/// -/// Behavior is undefined if any of the following conditions are violated: -/// -/// * `src` must be [valid] for reads of `count * size_of::()` bytes. -/// -/// * `dst` must be [valid] for writes of `count * size_of::()` bytes. -/// -/// * Both `src` and `dst` must be properly aligned. -/// -/// Like [`read`], `copy` creates a bitwise copy of `T`, regardless of -/// whether `T` is [`Copy`]. If `T` is not [`Copy`], using both the values -/// in the region beginning at `*src` and the region beginning at `*dst` can -/// [violate memory safety][read-ownership]. -/// -/// Note that even if the effectively copied size (`count * size_of::()`) is -/// `0`, the pointers must be non-NULL and properly aligned. -/// -/// [`read`]: crate::ptr::read -/// [read-ownership]: crate::ptr::read#ownership-of-the-returned-value -/// [valid]: crate::ptr#safety -/// -/// # Examples -/// -/// Efficiently create a Rust vector from an unsafe buffer: -/// -/// ``` -/// use std::ptr; -/// -/// /// # Safety -/// /// -/// /// * `ptr` must be correctly aligned for its type and non-zero. -/// /// * `ptr` must be valid for reads of `elts` contiguous elements of type `T`. -/// /// * Those elements must not be used after calling this function unless `T: Copy`. -/// # #[allow(dead_code)] -/// unsafe fn from_buf_raw(ptr: *const T, elts: usize) -> Vec { -/// let mut dst = Vec::with_capacity(elts); -/// -/// // SAFETY: Our precondition ensures the source is aligned and valid, -/// // and `Vec::with_capacity` ensures that we have usable space to write them. -/// ptr::copy(ptr, dst.as_mut_ptr(), elts); -/// -/// // SAFETY: We created it with this much capacity earlier, -/// // and the previous `copy` has initialized these elements. -/// dst.set_len(elts); -/// dst -/// } -/// ``` -#[doc(alias = "memmove")] -#[stable(feature = "rust1", since = "1.0.0")] -#[rustc_const_unstable(feature = "const_intrinsic_copy", issue = "80697")] -#[inline] -pub const unsafe fn copy(src: *const T, dst: *mut T, count: usize) { - extern "rust-intrinsic" { - #[rustc_const_unstable(feature = "const_intrinsic_copy", issue = "80697")] - fn copy(src: *const T, dst: *mut T, count: usize); - } - - // FIXME: Perform these checks only at run time - /*if cfg!(debug_assertions) && !(is_aligned_and_not_null(src) && is_aligned_and_not_null(dst)) { - // Not panicking to keep codegen impact smaller. - abort(); - }*/ - - // SAFETY: the safety contract for `copy` must be upheld by the caller. - unsafe { copy(src, dst, count) } -} - /// Sets `count * size_of::()` bytes of memory starting at `dst` to /// `val`. /// diff --git a/library/core/src/iter/adapters/cloned.rs b/library/core/src/iter/adapters/cloned.rs index 7da47dcd2d..0abdbba2ef 100644 --- a/library/core/src/iter/adapters/cloned.rs +++ b/library/core/src/iter/adapters/cloned.rs @@ -124,10 +124,7 @@ unsafe impl TrustedRandomAccess for Cloned where I: TrustedRandomAccess, { - #[inline] - fn may_have_side_effect() -> bool { - true - } + const MAY_HAVE_SIDE_EFFECT: bool = true; } #[unstable(feature = "trusted_len", issue = "37572")] diff --git a/library/core/src/iter/adapters/copied.rs b/library/core/src/iter/adapters/copied.rs index 46f2235411..0a5822452a 100644 --- a/library/core/src/iter/adapters/copied.rs +++ b/library/core/src/iter/adapters/copied.rs @@ -140,10 +140,7 @@ unsafe impl TrustedRandomAccess for Copied where I: TrustedRandomAccess, { - #[inline] - fn may_have_side_effect() -> bool { - I::may_have_side_effect() - } + const MAY_HAVE_SIDE_EFFECT: bool = I::MAY_HAVE_SIDE_EFFECT; } #[stable(feature = "iter_copied", since = "1.36.0")] diff --git a/library/core/src/iter/adapters/enumerate.rs b/library/core/src/iter/adapters/enumerate.rs index 5978c2da98..73cee1df30 100644 --- a/library/core/src/iter/adapters/enumerate.rs +++ b/library/core/src/iter/adapters/enumerate.rs @@ -1,6 +1,6 @@ use crate::iter::adapters::{zip::try_get_unchecked, SourceIter, TrustedRandomAccess}; use crate::iter::{FusedIterator, InPlaceIterable, TrustedLen}; -use crate::ops::{Add, AddAssign, Try}; +use crate::ops::Try; /// An iterator that yields the current count and the element during iteration. /// @@ -39,11 +39,11 @@ where /// /// Might panic if the index of the element overflows a `usize`. #[inline] + #[rustc_inherit_overflow_checks] fn next(&mut self) -> Option<(usize, ::Item)> { let a = self.iter.next()?; let i = self.count; - // Possible undefined overflow. - AddAssign::add_assign(&mut self.count, 1); + self.count += 1; Some((i, a)) } @@ -53,11 +53,11 @@ where } #[inline] + #[rustc_inherit_overflow_checks] fn nth(&mut self, n: usize) -> Option<(usize, I::Item)> { let a = self.iter.nth(n)?; - // Possible undefined overflow. - let i = Add::add(self.count, n); - self.count = Add::add(i, 1); + let i = self.count + n; + self.count = i + 1; Some((i, a)) } @@ -78,10 +78,10 @@ where count: &'a mut usize, mut fold: impl FnMut(Acc, (usize, T)) -> R + 'a, ) -> impl FnMut(Acc, T) -> R + 'a { + #[rustc_inherit_overflow_checks] move |acc, item| { let acc = fold(acc, (*count, item)); - // Possible undefined overflow. - AddAssign::add_assign(count, 1); + *count += 1; acc } } @@ -99,10 +99,10 @@ where mut count: usize, mut fold: impl FnMut(Acc, (usize, T)) -> Acc, ) -> impl FnMut(Acc, T) -> Acc { + #[rustc_inherit_overflow_checks] move |acc, item| { let acc = fold(acc, (count, item)); - // Possible undefined overflow. - AddAssign::add_assign(&mut count, 1); + count += 1; acc } } @@ -110,6 +110,7 @@ where self.iter.fold(init, enumerate(self.count, fold)) } + #[rustc_inherit_overflow_checks] unsafe fn __iterator_get_unchecked(&mut self, idx: usize) -> ::Item where Self: TrustedRandomAccess, @@ -117,7 +118,7 @@ where // SAFETY: the caller must uphold the contract for // `Iterator::__iterator_get_unchecked`. let value = unsafe { try_get_unchecked(&mut self.iter, idx) }; - (Add::add(self.count, idx), value) + (self.count + idx, value) } } @@ -209,9 +210,7 @@ unsafe impl TrustedRandomAccess for Enumerate where I: TrustedRandomAccess, { - fn may_have_side_effect() -> bool { - I::may_have_side_effect() - } + const MAY_HAVE_SIDE_EFFECT: bool = I::MAY_HAVE_SIDE_EFFECT; } #[stable(feature = "fused", since = "1.26.0")] diff --git a/library/core/src/iter/adapters/filter.rs b/library/core/src/iter/adapters/filter.rs index f8d684fcdd..0337892b9e 100644 --- a/library/core/src/iter/adapters/filter.rs +++ b/library/core/src/iter/adapters/filter.rs @@ -13,7 +13,8 @@ use crate::ops::Try; #[stable(feature = "rust1", since = "1.0.0")] #[derive(Clone)] pub struct Filter { - iter: I, + // Used for `SplitWhitespace` and `SplitAsciiWhitespace` `as_str` methods + pub(crate) iter: I, predicate: P, } impl Filter { diff --git a/library/core/src/iter/adapters/flatten.rs b/library/core/src/iter/adapters/flatten.rs index 081f282edc..0114d7af4f 100644 --- a/library/core/src/iter/adapters/flatten.rs +++ b/library/core/src/iter/adapters/flatten.rs @@ -325,22 +325,28 @@ where } #[inline] - fn fold(self, init: Acc, ref mut fold: Fold) -> Acc + fn fold(self, mut init: Acc, mut fold: Fold) -> Acc where Fold: FnMut(Acc, Self::Item) -> Acc, { #[inline] - fn flatten( - fold: &mut impl FnMut(Acc, U::Item) -> Acc, - ) -> impl FnMut(Acc, U) -> Acc + '_ { - move |acc, iter| iter.fold(acc, &mut *fold) + fn flatten( + fold: &mut impl FnMut(Acc, T::Item) -> Acc, + ) -> impl FnMut(Acc, T) -> Acc + '_ { + move |acc, x| x.into_iter().fold(acc, &mut *fold) } - self.frontiter - .into_iter() - .chain(self.iter.map(IntoIterator::into_iter)) - .chain(self.backiter) - .fold(init, flatten(fold)) + if let Some(front) = self.frontiter { + init = front.fold(init, &mut fold); + } + + init = self.iter.fold(init, flatten(&mut fold)); + + if let Some(back) = self.backiter { + init = back.fold(init, &mut fold); + } + + init } } @@ -411,21 +417,30 @@ where } #[inline] - fn rfold(self, init: Acc, ref mut fold: Fold) -> Acc + fn rfold(self, mut init: Acc, mut fold: Fold) -> Acc where Fold: FnMut(Acc, Self::Item) -> Acc, { #[inline] - fn flatten( - fold: &mut impl FnMut(Acc, U::Item) -> Acc, - ) -> impl FnMut(Acc, U) -> Acc + '_ { - move |acc, iter| iter.rfold(acc, &mut *fold) + fn flatten( + fold: &mut impl FnMut(Acc, T::Item) -> Acc, + ) -> impl FnMut(Acc, T) -> Acc + '_ + where + T::IntoIter: DoubleEndedIterator, + { + move |acc, x| x.into_iter().rfold(acc, &mut *fold) + } + + if let Some(back) = self.backiter { + init = back.rfold(init, &mut fold); + } + + init = self.iter.rfold(init, flatten(&mut fold)); + + if let Some(front) = self.frontiter { + init = front.rfold(init, &mut fold); } - self.frontiter - .into_iter() - .chain(self.iter.map(IntoIterator::into_iter)) - .chain(self.backiter) - .rfold(init, flatten(fold)) + init } } diff --git a/library/core/src/iter/adapters/fuse.rs b/library/core/src/iter/adapters/fuse.rs index 7a852c2cb9..c01f384dec 100644 --- a/library/core/src/iter/adapters/fuse.rs +++ b/library/core/src/iter/adapters/fuse.rs @@ -201,9 +201,7 @@ unsafe impl TrustedRandomAccess for Fuse where I: TrustedRandomAccess, { - fn may_have_side_effect() -> bool { - I::may_have_side_effect() - } + const MAY_HAVE_SIDE_EFFECT: bool = I::MAY_HAVE_SIDE_EFFECT; } // Fuse specialization trait diff --git a/library/core/src/iter/adapters/map.rs b/library/core/src/iter/adapters/map.rs index 12673806ec..2a4b7efd5e 100644 --- a/library/core/src/iter/adapters/map.rs +++ b/library/core/src/iter/adapters/map.rs @@ -57,9 +57,11 @@ use crate::ops::Try; #[stable(feature = "rust1", since = "1.0.0")] #[derive(Clone)] pub struct Map { - iter: I, + // Used for `SplitWhitespace` and `SplitAsciiWhitespace` `as_str` methods + pub(crate) iter: I, f: F, } + impl Map { pub(in crate::iter) fn new(iter: I, f: F) -> Map { Map { iter, f } @@ -188,10 +190,7 @@ unsafe impl TrustedRandomAccess for Map where I: TrustedRandomAccess, { - #[inline] - fn may_have_side_effect() -> bool { - true - } + const MAY_HAVE_SIDE_EFFECT: bool = true; } #[unstable(issue = "none", feature = "inplace_iteration")] diff --git a/library/core/src/iter/adapters/zip.rs b/library/core/src/iter/adapters/zip.rs index 98b8dca961..ea7a809c6b 100644 --- a/library/core/src/iter/adapters/zip.rs +++ b/library/core/src/iter/adapters/zip.rs @@ -13,9 +13,10 @@ use crate::iter::{InPlaceIterable, SourceIter, TrustedLen}; pub struct Zip { a: A, b: B, - // index and len are only used by the specialized version of zip + // index, len and a_len are only used by the specialized version of zip index: usize, len: usize, + a_len: usize, } impl Zip { pub(in crate::iter) fn new(a: A, b: B) -> Zip { @@ -110,6 +111,7 @@ where b, index: 0, // unused len: 0, // unused + a_len: 0, // unused } } @@ -184,8 +186,9 @@ where B: TrustedRandomAccess + Iterator, { fn new(a: A, b: B) -> Self { - let len = cmp::min(a.size(), b.size()); - Zip { a, b, index: 0, len } + let a_len = a.size(); + let len = cmp::min(a_len, b.size()); + Zip { a, b, index: 0, len, a_len } } #[inline] @@ -197,13 +200,15 @@ where unsafe { Some((self.a.__iterator_get_unchecked(i), self.b.__iterator_get_unchecked(i))) } - } else if A::may_have_side_effect() && self.index < self.a.size() { + } else if A::MAY_HAVE_SIDE_EFFECT && self.index < self.a_len { + let i = self.index; + self.index += 1; + self.len += 1; // match the base implementation's potential side effects - // SAFETY: we just checked that `self.index` < `self.a.len()` + // SAFETY: we just checked that `i` < `self.a.len()` unsafe { - self.a.__iterator_get_unchecked(self.index); + self.a.__iterator_get_unchecked(i); } - self.index += 1; None } else { None @@ -223,7 +228,7 @@ where while self.index < end { let i = self.index; self.index += 1; - if A::may_have_side_effect() { + if A::MAY_HAVE_SIDE_EFFECT { // SAFETY: the usage of `cmp::min` to calculate `delta` // ensures that `end` is smaller than or equal to `self.len`, // so `i` is also smaller than `self.len`. @@ -231,7 +236,7 @@ where self.a.__iterator_get_unchecked(i); } } - if B::may_have_side_effect() { + if B::MAY_HAVE_SIDE_EFFECT { // SAFETY: same as above. unsafe { self.b.__iterator_get_unchecked(i); @@ -248,9 +253,7 @@ where A: DoubleEndedIterator + ExactSizeIterator, B: DoubleEndedIterator + ExactSizeIterator, { - let a_side_effect = A::may_have_side_effect(); - let b_side_effect = B::may_have_side_effect(); - if a_side_effect || b_side_effect { + if A::MAY_HAVE_SIDE_EFFECT || B::MAY_HAVE_SIDE_EFFECT { let sz_a = self.a.size(); let sz_b = self.b.size(); // Adjust a, b to equal length, make sure that only the first call @@ -258,13 +261,14 @@ where // on calls to `self.next_back()` after calling `get_unchecked()`. if sz_a != sz_b { let sz_a = self.a.size(); - if a_side_effect && sz_a > self.len { - for _ in 0..sz_a - cmp::max(self.len, self.index) { + if A::MAY_HAVE_SIDE_EFFECT && sz_a > self.len { + for _ in 0..sz_a - self.len { self.a.next_back(); } + self.a_len = self.len; } let sz_b = self.b.size(); - if b_side_effect && sz_b > self.len { + if B::MAY_HAVE_SIDE_EFFECT && sz_b > self.len { for _ in 0..sz_b - self.len { self.b.next_back(); } @@ -273,6 +277,7 @@ where } if self.index < self.len { self.len -= 1; + self.a_len -= 1; let i = self.len; // SAFETY: `i` is smaller than the previous value of `self.len`, // which is also smaller than or equal to `self.a.len()` and `self.b.len()` @@ -308,9 +313,7 @@ where A: TrustedRandomAccess, B: TrustedRandomAccess, { - fn may_have_side_effect() -> bool { - A::may_have_side_effect() || B::may_have_side_effect() - } + const MAY_HAVE_SIDE_EFFECT: bool = A::MAY_HAVE_SIDE_EFFECT || B::MAY_HAVE_SIDE_EFFECT; } #[stable(feature = "fused", since = "1.26.0")] @@ -421,9 +424,9 @@ pub unsafe trait TrustedRandomAccess: Sized { { self.size_hint().0 } - /// Returns `true` if getting an iterator element may have - /// side effects. Remember to take inner iterators into account. - fn may_have_side_effect() -> bool; + /// `true` if getting an iterator element may have side effects. + /// Remember to take inner iterators into account. + const MAY_HAVE_SIDE_EFFECT: bool; } /// Like `Iterator::__iterator_get_unchecked`, but doesn't require the compiler to diff --git a/library/core/src/iter/range.rs b/library/core/src/iter/range.rs index 9e7055a370..cc80e06dec 100644 --- a/library/core/src/iter/range.rs +++ b/library/core/src/iter/range.rs @@ -1,7 +1,7 @@ use crate::char; use crate::convert::TryFrom; use crate::mem; -use crate::ops::{self, Add, Sub, Try}; +use crate::ops::{self, Try}; use super::{FusedIterator, TrustedLen}; @@ -201,11 +201,12 @@ macro_rules! step_identical_methods { #[inline] #[allow(arithmetic_overflow)] + #[rustc_inherit_overflow_checks] fn forward(start: Self, n: usize) -> Self { // In debug builds, trigger a panic on overflow. // This should optimize completely out in release builds. if Self::forward_checked(start, n).is_none() { - let _ = Add::add(Self::MAX, 1); + let _ = Self::MAX + 1; } // Do wrapping math to allow e.g. `Step::forward(-128i8, 255)`. start.wrapping_add(n as Self) @@ -213,11 +214,12 @@ macro_rules! step_identical_methods { #[inline] #[allow(arithmetic_overflow)] + #[rustc_inherit_overflow_checks] fn backward(start: Self, n: usize) -> Self { // In debug builds, trigger a panic on overflow. // This should optimize completely out in release builds. if Self::backward_checked(start, n).is_none() { - let _ = Sub::sub(Self::MIN, 1); + let _ = Self::MIN - 1; } // Do wrapping math to allow e.g. `Step::backward(127i8, 255)`. start.wrapping_sub(n as Self) diff --git a/library/core/src/iter/traits/accum.rs b/library/core/src/iter/traits/accum.rs index dc0d8087ff..0a4210a78e 100644 --- a/library/core/src/iter/traits/accum.rs +++ b/library/core/src/iter/traits/accum.rs @@ -1,6 +1,5 @@ use crate::iter; use crate::num::Wrapping; -use crate::ops::{Add, Mul}; /// Trait to represent types that can be created by summing up an iterator. /// @@ -37,34 +36,49 @@ pub trait Product: Sized { fn product>(iter: I) -> Self; } -// N.B., explicitly use Add and Mul here to inherit overflow checks macro_rules! integer_sum_product { (@impls $zero:expr, $one:expr, #[$attr:meta], $($a:ty)*) => ($( #[$attr] impl Sum for $a { fn sum>(iter: I) -> Self { - iter.fold($zero, Add::add) + iter.fold( + $zero, + #[rustc_inherit_overflow_checks] + |a, b| a + b, + ) } } #[$attr] impl Product for $a { fn product>(iter: I) -> Self { - iter.fold($one, Mul::mul) + iter.fold( + $one, + #[rustc_inherit_overflow_checks] + |a, b| a * b, + ) } } #[$attr] impl<'a> Sum<&'a $a> for $a { fn sum>(iter: I) -> Self { - iter.fold($zero, Add::add) + iter.fold( + $zero, + #[rustc_inherit_overflow_checks] + |a, b| a + b, + ) } } #[$attr] impl<'a> Product<&'a $a> for $a { fn product>(iter: I) -> Self { - iter.fold($one, Mul::mul) + iter.fold( + $one, + #[rustc_inherit_overflow_checks] + |a, b| a * b, + ) } } )*); @@ -83,28 +97,44 @@ macro_rules! float_sum_product { #[stable(feature = "iter_arith_traits", since = "1.12.0")] impl Sum for $a { fn sum>(iter: I) -> Self { - iter.fold(0.0, Add::add) + iter.fold( + 0.0, + #[rustc_inherit_overflow_checks] + |a, b| a + b, + ) } } #[stable(feature = "iter_arith_traits", since = "1.12.0")] impl Product for $a { fn product>(iter: I) -> Self { - iter.fold(1.0, Mul::mul) + iter.fold( + 1.0, + #[rustc_inherit_overflow_checks] + |a, b| a * b, + ) } } #[stable(feature = "iter_arith_traits", since = "1.12.0")] impl<'a> Sum<&'a $a> for $a { fn sum>(iter: I) -> Self { - iter.fold(0.0, Add::add) + iter.fold( + 0.0, + #[rustc_inherit_overflow_checks] + |a, b| a + b, + ) } } #[stable(feature = "iter_arith_traits", since = "1.12.0")] impl<'a> Product<&'a $a> for $a { fn product>(iter: I) -> Self { - iter.fold(1.0, Mul::mul) + iter.fold( + 1.0, + #[rustc_inherit_overflow_checks] + |a, b| a * b, + ) } } )*) diff --git a/library/core/src/iter/traits/exact_size.rs b/library/core/src/iter/traits/exact_size.rs index 996d62e2b4..167db3359f 100644 --- a/library/core/src/iter/traits/exact_size.rs +++ b/library/core/src/iter/traits/exact_size.rs @@ -13,6 +13,12 @@ /// implement it. However, you may be able to provide a more performant /// implementation than the default, so overriding it in this case makes sense. /// +/// Note that this trait is a safe trait and as such does *not* and *cannot* +/// guarantee that the returned length is correct. This means that `unsafe` +/// code **must not** rely on the correctness of [`Iterator::size_hint`]. The +/// unstable and unsafe [`TrustedLen`](super::marker::TrustedLen) trait gives +/// this additional guarantee. +/// /// [`len`]: ExactSizeIterator::len /// /// # Examples diff --git a/library/core/src/iter/traits/iterator.rs b/library/core/src/iter/traits/iterator.rs index 6b42d45620..a07750f4ad 100644 --- a/library/core/src/iter/traits/iterator.rs +++ b/library/core/src/iter/traits/iterator.rs @@ -3,7 +3,7 @@ // can't split that into multiple files. use crate::cmp::{self, Ordering}; -use crate::ops::{Add, ControlFlow, Try}; +use crate::ops::{ControlFlow, Try}; use super::super::TrustedRandomAccess; use super::super::{Chain, Cloned, Copied, Cycle, Enumerate, Filter, FilterMap, Fuse}; @@ -93,6 +93,7 @@ fn _assert_is_object_safe(_: &dyn Iterator) {} message = "`{Self}` is not an iterator" )] #[doc(spotlight)] +#[rustc_diagnostic_item = "Iterator"] #[must_use = "iterators are lazy and do nothing unless consumed"] pub trait Iterator { /// The type of the elements being iterated over. @@ -242,13 +243,11 @@ pub trait Iterator { where Self: Sized, { - #[inline] - fn add1(count: usize, _: T) -> usize { - // Might overflow. - Add::add(count, 1) - } - - self.fold(0, add1) + self.fold( + 0, + #[rustc_inherit_overflow_checks] + |count, _| count + 1, + ) } /// Consumes the iterator, returning the last element. @@ -1013,7 +1012,7 @@ pub trait Iterator { /// /// Because the closure passed to `skip_while()` takes a reference, and many /// iterators iterate over references, this leads to a possibly confusing - /// situation, where the type of the closure is a double reference: + /// situation, where the type of the closure argument is a double reference: /// /// ``` /// let a = [-1, 0, 1]; @@ -2205,6 +2204,7 @@ pub trait Iterator { /// // we can still use `iter`, as there are more elements. /// assert_eq!(iter.next(), Some(&3)); /// ``` + #[doc(alias = "every")] #[inline] #[stable(feature = "rust1", since = "1.0.0")] fn all(&mut self, f: F) -> bool @@ -2474,13 +2474,9 @@ pub trait Iterator { fn check( mut predicate: impl FnMut(T) -> bool, ) -> impl FnMut(usize, T) -> ControlFlow { - // The addition might panic on overflow + #[rustc_inherit_overflow_checks] move |i, x| { - if predicate(x) { - ControlFlow::Break(i) - } else { - ControlFlow::Continue(Add::add(i, 1)) - } + if predicate(x) { ControlFlow::Break(i) } else { ControlFlow::Continue(i + 1) } } } @@ -2741,6 +2737,7 @@ pub trait Iterator { /// assert_eq!(iter.next(), None); /// ``` #[inline] + #[doc(alias = "reverse")] #[stable(feature = "rust1", since = "1.0.0")] fn rev(self) -> Rev where @@ -3326,24 +3323,31 @@ pub trait Iterator { /// /// [`is_sorted`]: Iterator::is_sorted #[unstable(feature = "is_sorted", reason = "new API", issue = "53485")] - fn is_sorted_by(mut self, mut compare: F) -> bool + fn is_sorted_by(mut self, compare: F) -> bool where Self: Sized, F: FnMut(&Self::Item, &Self::Item) -> Option, { + #[inline] + fn check<'a, T>( + last: &'a mut T, + mut compare: impl FnMut(&T, &T) -> Option + 'a, + ) -> impl FnMut(T) -> bool + 'a { + move |curr| { + if let Some(Ordering::Greater) | None = compare(&last, &curr) { + return false; + } + *last = curr; + true + } + } + let mut last = match self.next() { Some(e) => e, None => return true, }; - while let Some(curr) = self.next() { - if let Some(Ordering::Greater) | None = compare(&last, &curr) { - return false; - } - last = curr; - } - - true + self.all(check(&mut last, compare)) } /// Checks if the elements of this iterator are sorted using the given key extraction diff --git a/library/core/src/lib.rs b/library/core/src/lib.rs index a69b840e4b..8e35adcbd9 100644 --- a/library/core/src/lib.rs +++ b/library/core/src/lib.rs @@ -73,13 +73,12 @@ #![feature(const_discriminant)] #![feature(const_cell_into_inner)] #![feature(const_intrinsic_copy)] -#![feature(const_checked_int_methods)] -#![feature(const_euclidean_int_methods)] +#![feature(const_intrinsic_forget)] #![feature(const_float_classify)] #![feature(const_float_bits_conv)] -#![feature(const_overflowing_int_methods)] #![feature(const_int_unchecked_arith)] #![feature(const_mut_refs)] +#![feature(const_refs_to_cell)] #![feature(const_cttz)] #![feature(const_panic)] #![feature(const_pin)] @@ -93,11 +92,13 @@ #![feature(const_ptr_offset)] #![feature(const_ptr_offset_from)] #![feature(const_ptr_read)] +#![feature(const_ptr_write)] #![feature(const_raw_ptr_comparison)] #![feature(const_raw_ptr_deref)] #![feature(const_slice_from_raw_parts)] #![feature(const_slice_ptr_len)] #![feature(const_size_of_val)] +#![feature(const_swap)] #![feature(const_align_of_val)] #![feature(const_type_id)] #![feature(const_type_name)] @@ -114,6 +115,7 @@ #![feature(extended_key_value_attributes)] #![feature(extern_types)] #![feature(fundamental)] +#![feature(intra_doc_pointers)] #![feature(intrinsics)] #![feature(lang_items)] #![feature(link_llvm_intrinsics)] @@ -126,16 +128,17 @@ #![feature(auto_traits)] #![feature(or_patterns)] #![feature(prelude_import)] +#![cfg_attr(not(bootstrap), feature(ptr_metadata))] #![feature(repr_simd, platform_intrinsics)] #![feature(rustc_attrs)] #![feature(simd_ffi)] -#![cfg_attr(bootstrap, feature(min_const_generics))] #![feature(min_specialization)] #![feature(staged_api)] #![feature(std_internals)] #![feature(stmt_expr_attributes)] #![feature(str_split_as_str)] #![feature(str_split_inclusive_as_str)] +#![feature(trait_alias)] #![feature(transparent_unions)] #![feature(try_blocks)] #![feature(unboxed_closures)] @@ -162,8 +165,8 @@ #![feature(const_caller_location)] #![feature(slice_ptr_get)] #![feature(no_niche)] // rust-lang/rust#68303 -#![feature(unsafe_block_in_unsafe_fn)] #![feature(int_error_matching)] +#![cfg_attr(bootstrap, feature(unsafe_block_in_unsafe_fn))] #![deny(unsafe_op_in_unsafe_fn)] #[prelude_import] @@ -295,7 +298,8 @@ pub mod primitive; unused_imports, unsafe_op_in_unsafe_fn )] -#[allow(non_autolinks)] +#[cfg_attr(bootstrap, allow(non_autolinks))] +#[cfg_attr(not(bootstrap), allow(rustdoc::non_autolinks))] // FIXME: This annotation should be moved into rust-lang/stdarch after clashing_extern_declarations is // merged. It currently cannot because bootstrap fails as the lint hasn't been defined yet. #[allow(clashing_extern_declarations)] diff --git a/library/core/src/macros/mod.rs b/library/core/src/macros/mod.rs index 6a7e4b2ba2..99894b5605 100644 --- a/library/core/src/macros/mod.rs +++ b/library/core/src/macros/mod.rs @@ -1,26 +1,4 @@ -#[cfg(bootstrap)] -#[doc(include = "panic.md")] -#[macro_export] -#[allow_internal_unstable(core_panic)] -#[stable(feature = "core", since = "1.6.0")] -#[rustc_diagnostic_item = "core_panic_macro"] -macro_rules! panic { - () => ( - $crate::panic!("explicit panic") - ); - ($msg:literal $(,)?) => ( - $crate::panicking::panic($msg) - ); - ($msg:expr $(,)?) => ( - $crate::panicking::panic_str($msg) - ); - ($fmt:expr, $($arg:tt)+) => ( - $crate::panicking::panic_fmt($crate::format_args!($fmt, $($arg)+)) - ); -} - -#[cfg(not(bootstrap))] -#[doc(include = "panic.md")] +#[doc = include_str!("panic.md")] #[macro_export] #[rustc_builtin_macro = "core_panic"] #[allow_internal_unstable(edition_panic)] @@ -53,32 +31,30 @@ macro_rules! panic { /// ``` #[macro_export] #[stable(feature = "rust1", since = "1.0.0")] +#[allow_internal_unstable(core_panic)] macro_rules! assert_eq { ($left:expr, $right:expr $(,)?) => ({ match (&$left, &$right) { (left_val, right_val) => { if !(*left_val == *right_val) { + let kind = $crate::panicking::AssertKind::Eq; // The reborrows below are intentional. Without them, the stack slot for the // borrow is initialized even before the values are compared, leading to a // noticeable slow down. - $crate::panic!(r#"assertion failed: `(left == right)` - left: `{:?}`, - right: `{:?}`"#, &*left_val, &*right_val) + $crate::panicking::assert_failed(kind, &*left_val, &*right_val, $crate::option::Option::None); } } } }); ($left:expr, $right:expr, $($arg:tt)+) => ({ - match (&($left), &($right)) { + match (&$left, &$right) { (left_val, right_val) => { if !(*left_val == *right_val) { + let kind = $crate::panicking::AssertKind::Eq; // The reborrows below are intentional. Without them, the stack slot for the // borrow is initialized even before the values are compared, leading to a // noticeable slow down. - $crate::panic!(r#"assertion failed: `(left == right)` - left: `{:?}`, - right: `{:?}`: {}"#, &*left_val, &*right_val, - $crate::format_args!($($arg)+)) + $crate::panicking::assert_failed(kind, &*left_val, &*right_val, $crate::option::Option::Some($crate::format_args!($($arg)+))); } } } @@ -104,17 +80,17 @@ macro_rules! assert_eq { /// ``` #[macro_export] #[stable(feature = "assert_ne", since = "1.13.0")] +#[allow_internal_unstable(core_panic)] macro_rules! assert_ne { ($left:expr, $right:expr $(,)?) => ({ match (&$left, &$right) { (left_val, right_val) => { if *left_val == *right_val { + let kind = $crate::panicking::AssertKind::Ne; // The reborrows below are intentional. Without them, the stack slot for the // borrow is initialized even before the values are compared, leading to a // noticeable slow down. - $crate::panic!(r#"assertion failed: `(left != right)` - left: `{:?}`, - right: `{:?}`"#, &*left_val, &*right_val) + $crate::panicking::assert_failed(kind, &*left_val, &*right_val, $crate::option::Option::None); } } } @@ -123,19 +99,71 @@ macro_rules! assert_ne { match (&($left), &($right)) { (left_val, right_val) => { if *left_val == *right_val { + let kind = $crate::panicking::AssertKind::Ne; // The reborrows below are intentional. Without them, the stack slot for the // borrow is initialized even before the values are compared, leading to a // noticeable slow down. - $crate::panic!(r#"assertion failed: `(left != right)` - left: `{:?}`, - right: `{:?}`: {}"#, &*left_val, &*right_val, - $crate::format_args!($($arg)+)) + $crate::panicking::assert_failed(kind, &*left_val, &*right_val, $crate::option::Option::Some($crate::format_args!($($arg)+))); } } } }); } +/// Asserts that an expression matches any of the given patterns. +/// +/// Like in a `match` expression, the pattern can be optionally followed by `if` +/// and a guard expression that has access to names bound by the pattern. +/// +/// On panic, this macro will print the value of the expression with its +/// debug representation. +/// +/// Like [`assert!`], this macro has a second form, where a custom +/// panic message can be provided. +/// +/// # Examples +/// +/// ``` +/// #![feature(assert_matches)] +/// +/// let a = 1u32.checked_add(2); +/// let b = 1u32.checked_sub(2); +/// assert_matches!(a, Some(_)); +/// assert_matches!(b, None); +/// +/// let c = Ok("abc".to_string()); +/// assert_matches!(c, Ok(x) | Err(x) if x.len() < 100); +/// ``` +#[macro_export] +#[unstable(feature = "assert_matches", issue = "82775")] +#[allow_internal_unstable(core_panic)] +macro_rules! assert_matches { + ($left:expr, $( $pattern:pat )|+ $( if $guard: expr )? $(,)?) => ({ + match $left { + $( $pattern )|+ $( if $guard )? => {} + ref left_val => { + $crate::panicking::assert_matches_failed( + left_val, + $crate::stringify!($($pattern)|+ $(if $guard)?), + $crate::option::Option::None + ); + } + } + }); + ($left:expr, $( $pattern:pat )|+ $( if $guard: expr )?, $($arg:tt)+) => ({ + match $left { + $( $pattern )|+ $( if $guard )? => {} + ref left_val => { + $crate::panicking::assert_matches_failed( + left_val, + $crate::stringify!($($pattern)|+ $(if $guard)?), + $crate::option::Option::Some($crate::format_args!($($arg)+)) + ); + } + } + }); +} + /// Asserts that a boolean expression is `true` at runtime. /// /// This will invoke the [`panic!`] macro if the provided expression cannot be @@ -234,6 +262,42 @@ macro_rules! debug_assert_ne { ($($arg:tt)*) => (if $crate::cfg!(debug_assertions) { $crate::assert_ne!($($arg)*); }) } +/// Asserts that an expression matches any of the given patterns. +/// +/// Like in a `match` expression, the pattern can be optionally followed by `if` +/// and a guard expression that has access to names bound by the pattern. +/// +/// On panic, this macro will print the value of the expression with its +/// debug representation. +/// +/// Unlike [`assert_matches!`], `debug_assert_matches!` statements are only +/// enabled in non optimized builds by default. An optimized build will not +/// execute `debug_assert_matches!` statements unless `-C debug-assertions` is +/// passed to the compiler. This makes `debug_assert_matches!` useful for +/// checks that are too expensive to be present in a release build but may be +/// helpful during development. The result of expanding `debug_assert_matches!` +/// is always type checked. +/// +/// # Examples +/// +/// ``` +/// #![feature(assert_matches)] +/// +/// let a = 1u32.checked_add(2); +/// let b = 1u32.checked_sub(2); +/// debug_assert_matches!(a, Some(_)); +/// debug_assert_matches!(b, None); +/// +/// let c = Ok("abc".to_string()); +/// debug_assert_matches!(c, Ok(x) | Err(x) if x.len() < 100); +/// ``` +#[macro_export] +#[unstable(feature = "assert_matches", issue = "82775")] +#[allow_internal_unstable(assert_matches)] +macro_rules! debug_assert_matches { + ($($arg:tt)*) => (if $crate::cfg!(debug_assertions) { $crate::assert_matches!($($arg)*); }) +} + /// Returns whether the given expression matches any of the given patterns. /// /// Like in a `match` expression, the pattern can be optionally followed by `if` @@ -816,6 +880,7 @@ pub(crate) mod builtin { #[macro_export] macro_rules! env { ($name:expr $(,)?) => {{ /* compiler built-in */ }}; + ($name:expr, $error_msg:expr $(,)?) => {{ /* compiler built-in */ }}; } /// Optionally inspects an environment variable at compile time. @@ -1208,7 +1273,8 @@ pub(crate) mod builtin { /// /// This macro has a second form, where a custom panic message can /// be provided with or without arguments for formatting. See [`std::fmt`] - /// for syntax for this form. + /// for syntax for this form. Expressions used as format arguments will only + /// be evaluated if the assertion fails. /// /// [`std::fmt`]: ../std/fmt/index.html /// @@ -1324,6 +1390,14 @@ pub(crate) mod builtin { (false) => {{ /* compiler built-in */ }}; } + /// Attribute macro used to apply derive macros. + #[cfg(not(bootstrap))] + #[stable(feature = "rust1", since = "1.0.0")] + #[rustc_builtin_macro] + pub macro derive($item:item) { + /* compiler built-in */ + } + /// Attribute macro applied to a function to turn it into a unit test. #[stable(feature = "rust1", since = "1.0.0")] #[allow_internal_unstable(test, rustc_attrs)] @@ -1378,10 +1452,26 @@ pub(crate) mod builtin { /* compiler built-in */ } + /// Expands all `#[cfg]` and `#[cfg_attr]` attributes in the code fragment it's applied to. + #[cfg(not(bootstrap))] + #[unstable( + feature = "cfg_eval", + issue = "82679", + reason = "`cfg_eval` is a recently implemented feature" + )] + #[rustc_builtin_macro] + pub macro cfg_eval($($tt:tt)*) { + /* compiler built-in */ + } + /// Unstable implementation detail of the `rustc` compiler, do not use. #[rustc_builtin_macro] #[stable(feature = "rust1", since = "1.0.0")] #[allow_internal_unstable(core_intrinsics, libstd_sys_internals)] + #[rustc_deprecated( + since = "1.52.0", + reason = "rustc-serialize is deprecated and no longer supported" + )] pub macro RustcDecodable($item:item) { /* compiler built-in */ } @@ -1390,6 +1480,10 @@ pub(crate) mod builtin { #[rustc_builtin_macro] #[stable(feature = "rust1", since = "1.0.0")] #[allow_internal_unstable(core_intrinsics)] + #[rustc_deprecated( + since = "1.52.0", + reason = "rustc-serialize is deprecated and no longer supported" + )] pub macro RustcEncodable($item:item) { /* compiler built-in */ } diff --git a/library/core/src/macros/panic.md b/library/core/src/macros/panic.md index 6e502426df..5127a16bbf 100644 --- a/library/core/src/macros/panic.md +++ b/library/core/src/macros/panic.md @@ -9,11 +9,15 @@ tests. `panic!` is closely tied with the `unwrap` method of both [`Option`][ounwrap] and [`Result`][runwrap] enums. Both implementations call `panic!` when they are set to [`None`] or [`Err`] variants. -This macro is used to inject panic into a Rust thread, causing the thread to -panic entirely. This macro panics with a string and uses the [`format!`] syntax -for building the message. - -Each thread's panic can be reaped as the [`Box`]`<`[`Any`]`>` type, +When using `panic!()` you can specify a string payload, that is built using +the [`format!`] syntax. That payload is used when injecting the panic into +the calling Rust thread, causing the thread to panic entirely. + +The behavior of the default `std` hook, i.e. the code that runs directly +after the panic is invoked, is to print the message payload to +`stderr` along with the file/line/column information of the `panic!()` +call. You can override the panic hook using [`std::panic::set_hook()`]. +Inside the hook a panic can be accessed as a `&dyn Any + Send`, which contains either a `&str` or `String` for regular `panic!()` invocations. To panic with a value of another other type, [`panic_any`] can be used. @@ -26,6 +30,7 @@ See also the macro [`compile_error!`], for raising errors during compilation. [ounwrap]: Option::unwrap [runwrap]: Result::unwrap +[`std::panic::set_hook()`]: ../std/panic/fn.set_hook.html [`panic_any`]: ../std/panic/fn.panic_any.html [`Box`]: ../std/boxed/struct.Box.html [`Any`]: crate::any::Any diff --git a/library/core/src/mem/maybe_uninit.rs b/library/core/src/mem/maybe_uninit.rs index 3760f5c479..cb07293123 100644 --- a/library/core/src/mem/maybe_uninit.rs +++ b/library/core/src/mem/maybe_uninit.rs @@ -39,10 +39,11 @@ use crate::ptr; /// let b: bool = unsafe { MaybeUninit::uninit().assume_init() }; // undefined behavior! ⚠️ /// ``` /// -/// Moreover, uninitialized memory is special in that the compiler knows that -/// it does not have a fixed value. This makes it undefined behavior to have -/// uninitialized data in a variable even if that variable has an integer type, -/// which otherwise can hold any *fixed* bit pattern: +/// Moreover, uninitialized memory is special in that it does not have a fixed value ("fixed" +/// meaning "it won't change without being written to"). Reading the same uninitialized byte +/// multiple times can give different results. This makes it undefined behavior to have +/// uninitialized data in a variable even if that variable has an integer type, which otherwise can +/// hold any *fixed* bit pattern: /// /// ```rust,no_run /// # #![allow(invalid_value)] @@ -976,7 +977,6 @@ impl MaybeUninit { /// ``` /// /// [`write_slice_cloned`]: MaybeUninit::write_slice_cloned - /// [`slice::copy_from_slice`]: ../../std/primitive.slice.html#method.copy_from_slice #[unstable(feature = "maybe_uninit_write_slice", issue = "79995")] pub fn write_slice<'a>(this: &'a mut [MaybeUninit], src: &[T]) -> &'a mut [T] where @@ -1037,7 +1037,6 @@ impl MaybeUninit { /// ``` /// /// [`write_slice`]: MaybeUninit::write_slice - /// [`slice::clone_from_slice`]: ../../std/primitive.slice.html#method.clone_from_slice #[unstable(feature = "maybe_uninit_write_slice", issue = "79995")] pub fn write_slice_cloned<'a>(this: &'a mut [MaybeUninit], src: &[T]) -> &'a mut [T] where diff --git a/library/core/src/mem/mod.rs b/library/core/src/mem/mod.rs index 778e34e634..37e8d65db6 100644 --- a/library/core/src/mem/mod.rs +++ b/library/core/src/mem/mod.rs @@ -4,7 +4,6 @@ //! types, initializing and manipulating memory. #![stable(feature = "rust1", since = "1.0.0")] -#![cfg_attr(bootstrap, allow(unused_unsafe))] use crate::clone; use crate::cmp; @@ -152,13 +151,6 @@ pub const fn forget(t: T) { #[inline] #[unstable(feature = "forget_unsized", issue = "none")] pub fn forget_unsized(t: T) { - #[cfg(bootstrap)] - // 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` - unsafe { - intrinsics::forget(t) - } - #[cfg(not(bootstrap))] intrinsics::forget(t) } @@ -316,7 +308,6 @@ pub const fn size_of() -> usize { /// statically-known size, e.g., a slice [`[T]`][slice] or a [trait object], /// then `size_of_val` can be used to get the dynamically-known size. /// -/// [slice]: ../../std/primitive.slice.html /// [trait object]: ../../book/ch17-02-trait-objects.html /// /// # Examples @@ -363,7 +354,6 @@ pub const fn size_of_val(val: &T) -> usize { /// [`size_of_val`] on a reference to a type with an extern type tail. /// - otherwise, it is conservatively not allowed to call this function. /// -/// [slice]: ../../std/primitive.slice.html /// [trait object]: ../../book/ch17-02-trait-objects.html /// [extern type]: ../../unstable-book/language-features/extern-types.html /// @@ -502,7 +492,6 @@ pub const fn align_of_val(val: &T) -> usize { /// [`align_of_val`] on a reference to a type with an extern type tail. /// - otherwise, it is conservatively not allowed to call this function. /// -/// [slice]: ../../std/primitive.slice.html /// [trait object]: ../../book/ch17-02-trait-objects.html /// [extern type]: ../../unstable-book/language-features/extern-types.html /// @@ -693,7 +682,8 @@ pub unsafe fn uninitialized() -> T { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] -pub fn swap(x: &mut T, y: &mut T) { +#[rustc_const_unstable(feature = "const_swap", issue = "83163")] +pub const fn swap(x: &mut T, y: &mut T) { // SAFETY: the raw pointers have been created from safe mutable references satisfying all the // constraints on `ptr::swap_nonoverlapping_one` unsafe { @@ -823,9 +813,16 @@ pub fn take(dest: &mut T) -> T { #[inline] #[stable(feature = "rust1", since = "1.0.0")] #[must_use = "if you don't need the old value, you can just assign the new value directly"] -pub fn replace(dest: &mut T, mut src: T) -> T { - swap(dest, &mut src); - src +#[rustc_const_unstable(feature = "const_replace", issue = "83164")] +pub const fn replace(dest: &mut T, src: T) -> T { + // SAFETY: We read from `dest` but directly write `src` into it afterwards, + // such that the old value is not duplicated. Nothing is dropped and + // nothing here can panic. + unsafe { + let result = ptr::read(dest); + ptr::write(dest, src); + result + } } /// Disposes of a value. @@ -936,7 +933,8 @@ pub fn drop(_x: T) {} /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] -pub unsafe fn transmute_copy(src: &T) -> U { +#[rustc_const_unstable(feature = "const_transmute_copy", issue = "83165")] +pub const unsafe fn transmute_copy(src: &T) -> U { // If U has a higher alignment requirement, src may not be suitably aligned. if align_of::() > align_of::() { // SAFETY: `src` is a reference which is guaranteed to be valid for reads. diff --git a/library/core/src/num/dec2flt/parse.rs b/library/core/src/num/dec2flt/parse.rs index 2766843155..858cc3c9b0 100644 --- a/library/core/src/num/dec2flt/parse.rs +++ b/library/core/src/num/dec2flt/parse.rs @@ -80,11 +80,8 @@ pub fn parse_decimal(s: &str) -> ParseResult<'_> { /// Carves off decimal digits up to the first non-digit character. fn eat_digits(s: &[u8]) -> (&[u8], &[u8]) { - let mut i = 0; - while i < s.len() && b'0' <= s[i] && s[i] <= b'9' { - i += 1; - } - (&s[..i], &s[i..]) + let pos = s.iter().position(|c| !c.is_ascii_digit()).unwrap_or(s.len()); + s.split_at(pos) } /// Exponent extraction and error checking. diff --git a/library/core/src/num/dec2flt/table.rs b/library/core/src/num/dec2flt/table.rs index 1bd94ffa04..97b497e81e 100644 --- a/library/core/src/num/dec2flt/table.rs +++ b/library/core/src/num/dec2flt/table.rs @@ -5,7 +5,7 @@ pub const MIN_E: i16 = -305; pub const MAX_E: i16 = 305; #[rustfmt::skip] -pub const POWERS: ([u64; 611], [i16; 611]) = ( +pub static POWERS: ([u64; 611], [i16; 611]) = ( [ 0xe0b62e2929aba83c, 0x8c71dcd9ba0b4926, diff --git a/library/core/src/num/error.rs b/library/core/src/num/error.rs index 9d8c8c8629..e2cc8faf85 100644 --- a/library/core/src/num/error.rs +++ b/library/core/src/num/error.rs @@ -54,10 +54,7 @@ impl From for TryFromIntError { /// /// Among other causes, `ParseIntError` can be thrown because of leading or trailing whitespace /// in the string e.g., when it is obtained from the standard input. -/// Using the [`str.trim()`] method ensures that no whitespace remains before parsing. -/// -/// [`str.trim()`]: ../../std/primitive.str.html#method.trim -/// [`i8::from_str_radix`]: ../../std/primitive.i8.html#method.from_str_radix +/// Using the [`str::trim()`] method ensures that no whitespace remains before parsing. /// /// # Example /// diff --git a/library/core/src/num/f32.rs b/library/core/src/num/f32.rs index 795f94ec03..690247bc96 100644 --- a/library/core/src/num/f32.rs +++ b/library/core/src/num/f32.rs @@ -1,6 +1,6 @@ //! Constants specific to the `f32` single-precision floating point type. //! -//! *[See also the `f32` primitive type](../../std/primitive.f32.html).* +//! *[See also the `f32` primitive type][f32].* //! //! Mathematically significant numbers are provided in the `consts` sub-module. //! @@ -18,7 +18,7 @@ use crate::mem; use crate::num::FpCategory; /// The radix or base of the internal representation of `f32`. -/// Use [`f32::RADIX`](../../std/primitive.f32.html#associatedconstant.RADIX) instead. +/// Use [`f32::RADIX`] instead. /// /// # Examples /// @@ -35,7 +35,7 @@ use crate::num::FpCategory; pub const RADIX: u32 = f32::RADIX; /// Number of significant digits in base 2. -/// Use [`f32::MANTISSA_DIGITS`](../../std/primitive.f32.html#associatedconstant.MANTISSA_DIGITS) instead. +/// Use [`f32::MANTISSA_DIGITS`] instead. /// /// # Examples /// @@ -55,7 +55,7 @@ pub const RADIX: u32 = f32::RADIX; pub const MANTISSA_DIGITS: u32 = f32::MANTISSA_DIGITS; /// Approximate number of significant digits in base 10. -/// Use [`f32::DIGITS`](../../std/primitive.f32.html#associatedconstant.DIGITS) instead. +/// Use [`f32::DIGITS`] instead. /// /// # Examples /// @@ -72,7 +72,7 @@ pub const MANTISSA_DIGITS: u32 = f32::MANTISSA_DIGITS; pub const DIGITS: u32 = f32::DIGITS; /// [Machine epsilon] value for `f32`. -/// Use [`f32::EPSILON`](../../std/primitive.f32.html#associatedconstant.EPSILON) instead. +/// Use [`f32::EPSILON`] instead. /// /// This is the difference between `1.0` and the next larger representable number. /// @@ -96,7 +96,7 @@ pub const DIGITS: u32 = f32::DIGITS; pub const EPSILON: f32 = f32::EPSILON; /// Smallest finite `f32` value. -/// Use [`f32::MIN`](../../std/primitive.f32.html#associatedconstant.MIN) instead. +/// Use [`f32::MIN`] instead. /// /// # Examples /// @@ -113,7 +113,7 @@ pub const EPSILON: f32 = f32::EPSILON; pub const MIN: f32 = f32::MIN; /// Smallest positive normal `f32` value. -/// Use [`f32::MIN_POSITIVE`](../../std/primitive.f32.html#associatedconstant.MIN_POSITIVE) instead. +/// Use [`f32::MIN_POSITIVE`] instead. /// /// # Examples /// @@ -133,7 +133,7 @@ pub const MIN: f32 = f32::MIN; pub const MIN_POSITIVE: f32 = f32::MIN_POSITIVE; /// Largest finite `f32` value. -/// Use [`f32::MAX`](../../std/primitive.f32.html#associatedconstant.MAX) instead. +/// Use [`f32::MAX`] instead. /// /// # Examples /// @@ -150,7 +150,7 @@ pub const MIN_POSITIVE: f32 = f32::MIN_POSITIVE; pub const MAX: f32 = f32::MAX; /// One greater than the minimum possible normal power of 2 exponent. -/// Use [`f32::MIN_EXP`](../../std/primitive.f32.html#associatedconstant.MIN_EXP) instead. +/// Use [`f32::MIN_EXP`] instead. /// /// # Examples /// @@ -170,7 +170,7 @@ pub const MAX: f32 = f32::MAX; pub const MIN_EXP: i32 = f32::MIN_EXP; /// Maximum possible power of 2 exponent. -/// Use [`f32::MAX_EXP`](../../std/primitive.f32.html#associatedconstant.MAX_EXP) instead. +/// Use [`f32::MAX_EXP`] instead. /// /// # Examples /// @@ -190,7 +190,7 @@ pub const MIN_EXP: i32 = f32::MIN_EXP; pub const MAX_EXP: i32 = f32::MAX_EXP; /// Minimum possible normal power of 10 exponent. -/// Use [`f32::MIN_10_EXP`](../../std/primitive.f32.html#associatedconstant.MIN_10_EXP) instead. +/// Use [`f32::MIN_10_EXP`] instead. /// /// # Examples /// @@ -210,7 +210,7 @@ pub const MAX_EXP: i32 = f32::MAX_EXP; pub const MIN_10_EXP: i32 = f32::MIN_10_EXP; /// Maximum possible power of 10 exponent. -/// Use [`f32::MAX_10_EXP`](../../std/primitive.f32.html#associatedconstant.MAX_10_EXP) instead. +/// Use [`f32::MAX_10_EXP`] instead. /// /// # Examples /// @@ -230,7 +230,7 @@ pub const MIN_10_EXP: i32 = f32::MIN_10_EXP; pub const MAX_10_EXP: i32 = f32::MAX_10_EXP; /// Not a Number (NaN). -/// Use [`f32::NAN`](../../std/primitive.f32.html#associatedconstant.NAN) instead. +/// Use [`f32::NAN`] instead. /// /// # Examples /// @@ -247,7 +247,7 @@ pub const MAX_10_EXP: i32 = f32::MAX_10_EXP; pub const NAN: f32 = f32::NAN; /// Infinity (∞). -/// Use [`f32::INFINITY`](../../std/primitive.f32.html#associatedconstant.INFINITY) instead. +/// Use [`f32::INFINITY`] instead. /// /// # Examples /// @@ -267,7 +267,7 @@ pub const NAN: f32 = f32::NAN; pub const INFINITY: f32 = f32::INFINITY; /// Negative infinity (−∞). -/// Use [`f32::NEG_INFINITY`](../../std/primitive.f32.html#associatedconstant.NEG_INFINITY) instead. +/// Use [`f32::NEG_INFINITY`] instead. /// /// # Examples /// @@ -832,8 +832,8 @@ impl f32 { /// As the target platform's native endianness is used, portable code /// should use [`to_be_bytes`] or [`to_le_bytes`], as appropriate, instead. /// - /// [`to_be_bytes`]: #method.to_be_bytes - /// [`to_le_bytes`]: #method.to_le_bytes + /// [`to_be_bytes`]: f32::to_be_bytes + /// [`to_le_bytes`]: f32::to_le_bytes /// /// # Examples /// @@ -860,7 +860,7 @@ impl f32 { /// /// [`to_ne_bytes`] should be preferred over this whenever possible. /// - /// [`to_ne_bytes`]: #method.to_ne_bytes + /// [`to_ne_bytes`]: f32::to_ne_bytes /// /// # Examples /// @@ -920,8 +920,8 @@ impl f32 { /// likely wants to use [`from_be_bytes`] or [`from_le_bytes`], as /// appropriate instead. /// - /// [`from_be_bytes`]: #method.from_be_bytes - /// [`from_le_bytes`]: #method.from_le_bytes + /// [`from_be_bytes`]: f32::from_be_bytes + /// [`from_le_bytes`]: f32::from_le_bytes /// /// # Examples /// diff --git a/library/core/src/num/f64.rs b/library/core/src/num/f64.rs index 7af968f7fe..6d3737224c 100644 --- a/library/core/src/num/f64.rs +++ b/library/core/src/num/f64.rs @@ -1,6 +1,6 @@ //! Constants specific to the `f64` double-precision floating point type. //! -//! *[See also the `f64` primitive type](../../std/primitive.f64.html).* +//! *[See also the `f64` primitive type][f64].* //! //! Mathematically significant numbers are provided in the `consts` sub-module. //! @@ -18,7 +18,7 @@ use crate::mem; use crate::num::FpCategory; /// The radix or base of the internal representation of `f64`. -/// Use [`f64::RADIX`](../../std/primitive.f64.html#associatedconstant.RADIX) instead. +/// Use [`f64::RADIX`] instead. /// /// # Examples /// @@ -35,7 +35,7 @@ use crate::num::FpCategory; pub const RADIX: u32 = f64::RADIX; /// Number of significant digits in base 2. -/// Use [`f64::MANTISSA_DIGITS`](../../std/primitive.f64.html#associatedconstant.MANTISSA_DIGITS) instead. +/// Use [`f64::MANTISSA_DIGITS`] instead. /// /// # Examples /// @@ -55,7 +55,7 @@ pub const RADIX: u32 = f64::RADIX; pub const MANTISSA_DIGITS: u32 = f64::MANTISSA_DIGITS; /// Approximate number of significant digits in base 10. -/// Use [`f64::DIGITS`](../../std/primitive.f64.html#associatedconstant.DIGITS) instead. +/// Use [`f64::DIGITS`] instead. /// /// # Examples /// @@ -72,7 +72,7 @@ pub const MANTISSA_DIGITS: u32 = f64::MANTISSA_DIGITS; pub const DIGITS: u32 = f64::DIGITS; /// [Machine epsilon] value for `f64`. -/// Use [`f64::EPSILON`](../../std/primitive.f64.html#associatedconstant.EPSILON) instead. +/// Use [`f64::EPSILON`] instead. /// /// This is the difference between `1.0` and the next larger representable number. /// @@ -96,7 +96,7 @@ pub const DIGITS: u32 = f64::DIGITS; pub const EPSILON: f64 = f64::EPSILON; /// Smallest finite `f64` value. -/// Use [`f64::MIN`](../../std/primitive.f64.html#associatedconstant.MIN) instead. +/// Use [`f64::MIN`] instead. /// /// # Examples /// @@ -113,7 +113,7 @@ pub const EPSILON: f64 = f64::EPSILON; pub const MIN: f64 = f64::MIN; /// Smallest positive normal `f64` value. -/// Use [`f64::MIN_POSITIVE`](../../std/primitive.f64.html#associatedconstant.MIN_POSITIVE) instead. +/// Use [`f64::MIN_POSITIVE`] instead. /// /// # Examples /// @@ -133,7 +133,7 @@ pub const MIN: f64 = f64::MIN; pub const MIN_POSITIVE: f64 = f64::MIN_POSITIVE; /// Largest finite `f64` value. -/// Use [`f64::MAX`](../../std/primitive.f64.html#associatedconstant.MAX) instead. +/// Use [`f64::MAX`] instead. /// /// # Examples /// @@ -150,7 +150,7 @@ pub const MIN_POSITIVE: f64 = f64::MIN_POSITIVE; pub const MAX: f64 = f64::MAX; /// One greater than the minimum possible normal power of 2 exponent. -/// Use [`f64::MIN_EXP`](../../std/primitive.f64.html#associatedconstant.MIN_EXP) instead. +/// Use [`f64::MIN_EXP`] instead. /// /// # Examples /// @@ -170,7 +170,7 @@ pub const MAX: f64 = f64::MAX; pub const MIN_EXP: i32 = f64::MIN_EXP; /// Maximum possible power of 2 exponent. -/// Use [`f64::MAX_EXP`](../../std/primitive.f64.html#associatedconstant.MAX_EXP) instead. +/// Use [`f64::MAX_EXP`] instead. /// /// # Examples /// @@ -190,7 +190,7 @@ pub const MIN_EXP: i32 = f64::MIN_EXP; pub const MAX_EXP: i32 = f64::MAX_EXP; /// Minimum possible normal power of 10 exponent. -/// Use [`f64::MIN_10_EXP`](../../std/primitive.f64.html#associatedconstant.MIN_10_EXP) instead. +/// Use [`f64::MIN_10_EXP`] instead. /// /// # Examples /// @@ -210,7 +210,7 @@ pub const MAX_EXP: i32 = f64::MAX_EXP; pub const MIN_10_EXP: i32 = f64::MIN_10_EXP; /// Maximum possible power of 10 exponent. -/// Use [`f64::MAX_10_EXP`](../../std/primitive.f64.html#associatedconstant.MAX_10_EXP) instead. +/// Use [`f64::MAX_10_EXP`] instead. /// /// # Examples /// @@ -230,7 +230,7 @@ pub const MIN_10_EXP: i32 = f64::MIN_10_EXP; pub const MAX_10_EXP: i32 = f64::MAX_10_EXP; /// Not a Number (NaN). -/// Use [`f64::NAN`](../../std/primitive.f64.html#associatedconstant.NAN) instead. +/// Use [`f64::NAN`] instead. /// /// # Examples /// @@ -247,7 +247,7 @@ pub const MAX_10_EXP: i32 = f64::MAX_10_EXP; pub const NAN: f64 = f64::NAN; /// Infinity (∞). -/// Use [`f64::INFINITY`](../../std/primitive.f64.html#associatedconstant.INFINITY) instead. +/// Use [`f64::INFINITY`] instead. /// /// # Examples /// @@ -267,7 +267,7 @@ pub const NAN: f64 = f64::NAN; pub const INFINITY: f64 = f64::INFINITY; /// Negative infinity (−∞). -/// Use [`f64::NEG_INFINITY`](../../std/primitive.f64.html#associatedconstant.NEG_INFINITY) instead. +/// Use [`f64::NEG_INFINITY`] instead. /// /// # Examples /// @@ -846,8 +846,8 @@ impl f64 { /// As the target platform's native endianness is used, portable code /// should use [`to_be_bytes`] or [`to_le_bytes`], as appropriate, instead. /// - /// [`to_be_bytes`]: #method.to_be_bytes - /// [`to_le_bytes`]: #method.to_le_bytes + /// [`to_be_bytes`]: f64::to_be_bytes + /// [`to_le_bytes`]: f64::to_le_bytes /// /// # Examples /// @@ -874,7 +874,7 @@ impl f64 { /// /// [`to_ne_bytes`] should be preferred over this whenever possible. /// - /// [`to_ne_bytes`]: #method.to_ne_bytes + /// [`to_ne_bytes`]: f64::to_ne_bytes /// /// # Examples /// @@ -934,8 +934,8 @@ impl f64 { /// likely wants to use [`from_be_bytes`] or [`from_le_bytes`], as /// appropriate instead. /// - /// [`from_be_bytes`]: #method.from_be_bytes - /// [`from_le_bytes`]: #method.from_le_bytes + /// [`from_be_bytes`]: f64::from_be_bytes + /// [`from_le_bytes`]: f64::from_le_bytes /// /// # Examples /// diff --git a/library/core/src/num/int_macros.rs b/library/core/src/num/int_macros.rs index 8fdd7c9e5d..ce9dca39d0 100644 --- a/library/core/src/num/int_macros.rs +++ b/library/core/src/num/int_macros.rs @@ -513,7 +513,7 @@ macro_rules! int_impl { #[doc = concat!("assert_eq!((1", stringify!($SelfT), ").checked_div(0), None);")] /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -539,7 +539,7 @@ macro_rules! int_impl { #[doc = concat!("assert_eq!((1", stringify!($SelfT), ").checked_div_euclid(0), None);")] /// ``` #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -565,7 +565,7 @@ macro_rules! int_impl { #[doc = concat!("assert_eq!(", stringify!($SelfT), "::MIN.checked_rem(-1), None);")] /// ``` #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -591,7 +591,7 @@ macro_rules! int_impl { #[doc = concat!("assert_eq!(", stringify!($SelfT), "::MIN.checked_rem_euclid(-1), None);")] /// ``` #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -949,7 +949,7 @@ macro_rules! int_impl { /// assert_eq!((-128i8).wrapping_div(-1), -128); /// ``` #[stable(feature = "num_wrapping", since = "1.2.0")] - #[rustc_const_unstable(feature = "const_wrapping_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_wrapping_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -977,7 +977,7 @@ macro_rules! int_impl { /// assert_eq!((-128i8).wrapping_div_euclid(-1), -128); /// ``` #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1005,7 +1005,7 @@ macro_rules! int_impl { /// assert_eq!((-128i8).wrapping_rem(-1), 0); /// ``` #[stable(feature = "num_wrapping", since = "1.2.0")] - #[rustc_const_unstable(feature = "const_wrapping_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_wrapping_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1032,7 +1032,7 @@ macro_rules! int_impl { /// assert_eq!((-128i8).wrapping_rem_euclid(-1), 0); /// ``` #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1067,7 +1067,7 @@ macro_rules! int_impl { /// /// Note that this is *not* the same as a rotate-left; the RHS of a wrapping shift-left is restricted to /// the range of the type, rather than the bits shifted out of the LHS being returned to the other end. - /// The primitive integer types all implement a [`rotate_left`](#method.rotate_left) function, + /// The primitive integer types all implement a [`rotate_left`](Self::rotate_left) function, /// which may be what you want instead. /// /// # Examples @@ -1096,7 +1096,7 @@ macro_rules! int_impl { /// /// Note that this is *not* the same as a rotate-right; the RHS of a wrapping shift-right is restricted /// to the range of the type, rather than the bits shifted out of the LHS being returned to the other - /// end. The primitive integer types all implement a [`rotate_right`](#method.rotate_right) function, + /// end. The primitive integer types all implement a [`rotate_right`](Self::rotate_right) function, /// which may be what you want instead. /// /// # Examples @@ -1299,7 +1299,7 @@ macro_rules! int_impl { /// ``` #[inline] #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_unstable(feature = "const_overflowing_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_overflowing_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] pub const fn overflowing_div(self, rhs: Self) -> (Self, bool) { @@ -1329,7 +1329,7 @@ macro_rules! int_impl { /// ``` #[inline] #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] pub const fn overflowing_div_euclid(self, rhs: Self) -> (Self, bool) { @@ -1360,7 +1360,7 @@ macro_rules! int_impl { /// ``` #[inline] #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_unstable(feature = "const_overflowing_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_overflowing_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] pub const fn overflowing_rem(self, rhs: Self) -> (Self, bool) { @@ -1390,7 +1390,7 @@ macro_rules! int_impl { #[doc = concat!("assert_eq!(", stringify!($SelfT), "::MIN.overflowing_rem_euclid(-1), (0, true));")] /// ``` #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1615,7 +1615,7 @@ macro_rules! int_impl { /// assert_eq!((-a).div_euclid(-b), 2); // -7 >= -4 * 2 /// ``` #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1653,7 +1653,7 @@ macro_rules! int_impl { /// assert_eq!((-a).rem_euclid(-b), 1); /// ``` #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1812,8 +1812,8 @@ macro_rules! int_impl { /// #[doc = $to_xe_bytes_doc] /// - /// [`to_be_bytes`]: #method.to_be_bytes - /// [`to_le_bytes`]: #method.to_le_bytes + /// [`to_be_bytes`]: Self::to_be_bytes + /// [`to_le_bytes`]: Self::to_le_bytes /// /// # Examples /// @@ -1845,7 +1845,7 @@ macro_rules! int_impl { /// /// [`to_ne_bytes`] should be preferred over this whenever possible. /// - /// [`to_ne_bytes`]: #method.to_ne_bytes + /// [`to_ne_bytes`]: Self::to_ne_bytes /// /// # Examples /// @@ -1937,8 +1937,8 @@ macro_rules! int_impl { /// likely wants to use [`from_be_bytes`] or [`from_le_bytes`], as /// appropriate instead. /// - /// [`from_be_bytes`]: #method.from_be_bytes - /// [`from_le_bytes`]: #method.from_le_bytes + /// [`from_be_bytes`]: Self::from_be_bytes + /// [`from_le_bytes`]: Self::from_le_bytes /// #[doc = $to_xe_bytes_doc] /// @@ -1976,7 +1976,7 @@ macro_rules! int_impl { } /// New code should prefer to use - #[doc = concat!("[`", stringify!($SelfT), "::MIN", "`](#associatedconstant.MIN).")] + #[doc = concat!("[`", stringify!($SelfT), "::MIN", "`] instead.")] /// /// Returns the smallest value that can be represented by this integer type. #[stable(feature = "rust1", since = "1.0.0")] @@ -1989,7 +1989,7 @@ macro_rules! int_impl { } /// New code should prefer to use - #[doc = concat!("[`", stringify!($SelfT), "::MAX", "`](#associatedconstant.MAX).")] + #[doc = concat!("[`", stringify!($SelfT), "::MAX", "`] instead.")] /// /// Returns the largest value that can be represented by this integer type. #[stable(feature = "rust1", since = "1.0.0")] diff --git a/library/core/src/num/mod.rs b/library/core/src/num/mod.rs index 6bdfa18fa4..f0bd976ba8 100644 --- a/library/core/src/num/mod.rs +++ b/library/core/src/num/mod.rs @@ -152,6 +152,9 @@ impl isize { usize_isize_to_xe_bytes_doc!(), usize_isize_from_xe_bytes_doc!() } } +/// If 6th bit set ascii is upper case. +const ASCII_CASE_MASK: u8 = 0b0010_0000; + #[lang = "u8"] impl u8 { uint_impl! { u8, u8, 8, 255, 2, "0x82", "0xa", "0x12", "0x12", "0x48", "[0x12]", @@ -190,12 +193,13 @@ impl u8 { /// assert_eq!(65, lowercase_a.to_ascii_uppercase()); /// ``` /// - /// [`make_ascii_uppercase`]: #method.make_ascii_uppercase + /// [`make_ascii_uppercase`]: Self::make_ascii_uppercase #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")] + #[rustc_const_stable(feature = "const_ascii_methods_on_intrinsics", since = "1.52.0")] #[inline] - pub fn to_ascii_uppercase(&self) -> u8 { + pub const fn to_ascii_uppercase(&self) -> u8 { // Unset the fifth bit if this is a lowercase letter - *self & !((self.is_ascii_lowercase() as u8) << 5) + *self & !((self.is_ascii_lowercase() as u8) * ASCII_CASE_MASK) } /// Makes a copy of the value in its ASCII lower case equivalent. @@ -213,12 +217,19 @@ impl u8 { /// assert_eq!(97, uppercase_a.to_ascii_lowercase()); /// ``` /// - /// [`make_ascii_lowercase`]: #method.make_ascii_lowercase + /// [`make_ascii_lowercase`]: Self::make_ascii_lowercase #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")] + #[rustc_const_stable(feature = "const_ascii_methods_on_intrinsics", since = "1.52.0")] #[inline] - pub fn to_ascii_lowercase(&self) -> u8 { + pub const fn to_ascii_lowercase(&self) -> u8 { // Set the fifth bit if this is an uppercase letter - *self | ((self.is_ascii_uppercase() as u8) << 5) + *self | (self.is_ascii_uppercase() as u8 * ASCII_CASE_MASK) + } + + /// Assumes self is ascii + #[inline] + pub(crate) const fn ascii_change_case_unchecked(&self) -> u8 { + *self ^ ASCII_CASE_MASK } /// Checks that two values are an ASCII case-insensitive match. @@ -234,8 +245,9 @@ impl u8 { /// assert!(lowercase_a.eq_ignore_ascii_case(&uppercase_a)); /// ``` #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")] + #[rustc_const_stable(feature = "const_ascii_methods_on_intrinsics", since = "1.52.0")] #[inline] - pub fn eq_ignore_ascii_case(&self, other: &u8) -> bool { + pub const fn eq_ignore_ascii_case(&self, other: &u8) -> bool { self.to_ascii_lowercase() == other.to_ascii_lowercase() } @@ -257,7 +269,7 @@ impl u8 { /// assert_eq!(b'A', byte); /// ``` /// - /// [`to_ascii_uppercase`]: #method.to_ascii_uppercase + /// [`to_ascii_uppercase`]: Self::to_ascii_uppercase #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")] #[inline] pub fn make_ascii_uppercase(&mut self) { @@ -282,7 +294,7 @@ impl u8 { /// assert_eq!(b'a', byte); /// ``` /// - /// [`to_ascii_lowercase`]: #method.to_ascii_lowercase + /// [`to_ascii_lowercase`]: Self::to_ascii_lowercase #[stable(feature = "ascii_methods_on_intrinsics", since = "1.23.0")] #[inline] pub fn make_ascii_lowercase(&mut self) { @@ -714,9 +726,6 @@ impl usize { /// This `enum` is used as the return type for [`f32::classify`] and [`f64::classify`]. See /// their documentation for more. /// -/// [`f32::classify`]: ../../std/primitive.f32.html#method.classify -/// [`f64::classify`]: ../../std/primitive.f64.html#method.classify -/// /// # Examples /// /// ``` diff --git a/library/core/src/num/shells/i128.rs b/library/core/src/num/shells/i128.rs index 785e9a4e9c..b37767cd5e 100644 --- a/library/core/src/num/shells/i128.rs +++ b/library/core/src/num/shells/i128.rs @@ -1,6 +1,6 @@ //! Constants for the 128-bit signed integer type. //! -//! *[See also the `i128` primitive type](../../std/primitive.i128.html).* +//! *[See also the `i128` primitive type][i128].* //! //! New code should use the associated constants directly on the primitive type. diff --git a/library/core/src/num/shells/i16.rs b/library/core/src/num/shells/i16.rs index 48ea2e3e96..3137e72ca0 100644 --- a/library/core/src/num/shells/i16.rs +++ b/library/core/src/num/shells/i16.rs @@ -1,6 +1,6 @@ //! Constants for the 16-bit signed integer type. //! -//! *[See also the `i16` primitive type](../../std/primitive.i16.html).* +//! *[See also the `i16` primitive type][i16].* //! //! New code should use the associated constants directly on the primitive type. diff --git a/library/core/src/num/shells/i32.rs b/library/core/src/num/shells/i32.rs index fce6980f45..bb70751d8c 100644 --- a/library/core/src/num/shells/i32.rs +++ b/library/core/src/num/shells/i32.rs @@ -1,6 +1,6 @@ //! Constants for the 32-bit signed integer type. //! -//! *[See also the `i32` primitive type](../../std/primitive.i32.html).* +//! *[See also the `i32` primitive type][i32].* //! //! New code should use the associated constants directly on the primitive type. diff --git a/library/core/src/num/shells/i64.rs b/library/core/src/num/shells/i64.rs index 6aa8fcf452..b08201c255 100644 --- a/library/core/src/num/shells/i64.rs +++ b/library/core/src/num/shells/i64.rs @@ -1,6 +1,6 @@ //! Constants for the 64-bit signed integer type. //! -//! *[See also the `i64` primitive type](../../std/primitive.i64.html).* +//! *[See also the `i64` primitive type][i64].* //! //! New code should use the associated constants directly on the primitive type. diff --git a/library/core/src/num/shells/i8.rs b/library/core/src/num/shells/i8.rs index b4e0fef61b..a7ad9bbbbc 100644 --- a/library/core/src/num/shells/i8.rs +++ b/library/core/src/num/shells/i8.rs @@ -1,6 +1,6 @@ //! Constants for the 8-bit signed integer type. //! -//! *[See also the `i8` primitive type](../../std/primitive.i8.html).* +//! *[See also the `i8` primitive type][i8].* //! //! New code should use the associated constants directly on the primitive type. diff --git a/library/core/src/num/shells/int_macros.rs b/library/core/src/num/shells/int_macros.rs index 78513d44b7..c6a5595d95 100644 --- a/library/core/src/num/shells/int_macros.rs +++ b/library/core/src/num/shells/int_macros.rs @@ -5,8 +5,7 @@ macro_rules! int_module { ($T:ident, #[$attr:meta]) => ( #[doc = concat!( "The smallest value that can be represented by this integer type. Use ", - "[`", stringify!($T), "::MIN", "`](../../std/primitive.", stringify!($T), ".html#associatedconstant.MIN)", - " instead.", + "[`", stringify!($T), "::MIN", "`] instead." )] /// /// # Examples @@ -25,8 +24,7 @@ macro_rules! int_module { #[doc = concat!( "The largest value that can be represented by this integer type. Use ", - "[`", stringify!($T), "::MAX", "`](../../std/primitive.", stringify!($T), ".html#associatedconstant.MAX)", - " instead.", + "[`", stringify!($T), "::MAX", "`] instead." )] /// /// # Examples diff --git a/library/core/src/num/shells/isize.rs b/library/core/src/num/shells/isize.rs index 5dc128d58a..d719936c0b 100644 --- a/library/core/src/num/shells/isize.rs +++ b/library/core/src/num/shells/isize.rs @@ -1,6 +1,6 @@ //! Constants for the pointer-sized signed integer type. //! -//! *[See also the `isize` primitive type](../../std/primitive.isize.html).* +//! *[See also the `isize` primitive type][isize].* //! //! New code should use the associated constants directly on the primitive type. diff --git a/library/core/src/num/shells/u128.rs b/library/core/src/num/shells/u128.rs index 6012584ae8..49f56c67c3 100644 --- a/library/core/src/num/shells/u128.rs +++ b/library/core/src/num/shells/u128.rs @@ -1,6 +1,6 @@ //! Constants for the 128-bit unsigned integer type. //! -//! *[See also the `u128` primitive type](../../std/primitive.u128.html).* +//! *[See also the `u128` primitive type][u128].* //! //! New code should use the associated constants directly on the primitive type. diff --git a/library/core/src/num/shells/u16.rs b/library/core/src/num/shells/u16.rs index 3664119640..b1d58ad4b9 100644 --- a/library/core/src/num/shells/u16.rs +++ b/library/core/src/num/shells/u16.rs @@ -1,6 +1,6 @@ //! Constants for the 16-bit unsigned integer type. //! -//! *[See also the `u16` primitive type](../../std/primitive.u16.html).* +//! *[See also the `u16` primitive type][u16].* //! //! New code should use the associated constants directly on the primitive type. diff --git a/library/core/src/num/shells/u32.rs b/library/core/src/num/shells/u32.rs index f58f71423d..b6acf95003 100644 --- a/library/core/src/num/shells/u32.rs +++ b/library/core/src/num/shells/u32.rs @@ -1,6 +1,6 @@ //! Constants for the 32-bit unsigned integer type. //! -//! *[See also the `u32` primitive type](../../std/primitive.u32.html).* +//! *[See also the `u32` primitive type][u32].* //! //! New code should use the associated constants directly on the primitive type. diff --git a/library/core/src/num/shells/u64.rs b/library/core/src/num/shells/u64.rs index 2b221f66da..d43726f84f 100644 --- a/library/core/src/num/shells/u64.rs +++ b/library/core/src/num/shells/u64.rs @@ -1,6 +1,6 @@ //! Constants for the 64-bit unsigned integer type. //! -//! *[See also the `u64` primitive type](../../std/primitive.u64.html).* +//! *[See also the `u64` primitive type][u64].* //! //! New code should use the associated constants directly on the primitive type. diff --git a/library/core/src/num/shells/u8.rs b/library/core/src/num/shells/u8.rs index 83ec60dcbd..0eadf85ec6 100644 --- a/library/core/src/num/shells/u8.rs +++ b/library/core/src/num/shells/u8.rs @@ -1,6 +1,6 @@ //! Constants for the 8-bit unsigned integer type. //! -//! *[See also the `u8` primitive type](../../std/primitive.u8.html).* +//! *[See also the `u8` primitive type][u8].* //! //! New code should use the associated constants directly on the primitive type. diff --git a/library/core/src/num/shells/usize.rs b/library/core/src/num/shells/usize.rs index c38d521f3d..deeed67d49 100644 --- a/library/core/src/num/shells/usize.rs +++ b/library/core/src/num/shells/usize.rs @@ -1,6 +1,6 @@ //! Constants for the pointer-sized unsigned integer type. //! -//! *[See also the `usize` primitive type](../../std/primitive.usize.html).* +//! *[See also the `usize` primitive type][usize].* //! //! New code should use the associated constants directly on the primitive type. diff --git a/library/core/src/num/uint_macros.rs b/library/core/src/num/uint_macros.rs index 9fccf3f72c..7393e7f923 100644 --- a/library/core/src/num/uint_macros.rs +++ b/library/core/src/num/uint_macros.rs @@ -522,7 +522,7 @@ macro_rules! uint_impl { #[doc = concat!("assert_eq!(1", stringify!($SelfT), ".checked_div(0), None);")] /// ``` #[stable(feature = "rust1", since = "1.0.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -548,7 +548,7 @@ macro_rules! uint_impl { #[doc = concat!("assert_eq!(1", stringify!($SelfT), ".checked_div_euclid(0), None);")] /// ``` #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -573,7 +573,7 @@ macro_rules! uint_impl { #[doc = concat!("assert_eq!(5", stringify!($SelfT), ".checked_rem(0), None);")] /// ``` #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_unstable(feature = "const_checked_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_checked_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -599,7 +599,7 @@ macro_rules! uint_impl { #[doc = concat!("assert_eq!(5", stringify!($SelfT), ".checked_rem_euclid(0), None);")] /// ``` #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -876,7 +876,7 @@ macro_rules! uint_impl { #[doc = concat!("assert_eq!(100", stringify!($SelfT), ".wrapping_div(10), 10);")] /// ``` #[stable(feature = "num_wrapping", since = "1.2.0")] - #[rustc_const_unstable(feature = "const_wrapping_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_wrapping_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -901,7 +901,7 @@ macro_rules! uint_impl { #[doc = concat!("assert_eq!(100", stringify!($SelfT), ".wrapping_div_euclid(10), 10);")] /// ``` #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -924,7 +924,7 @@ macro_rules! uint_impl { #[doc = concat!("assert_eq!(100", stringify!($SelfT), ".wrapping_rem(10), 0);")] /// ``` #[stable(feature = "num_wrapping", since = "1.2.0")] - #[rustc_const_unstable(feature = "const_wrapping_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_wrapping_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -950,7 +950,7 @@ macro_rules! uint_impl { #[doc = concat!("assert_eq!(100", stringify!($SelfT), ".wrapping_rem_euclid(10), 0);")] /// ``` #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -994,7 +994,7 @@ macro_rules! uint_impl { /// RHS of a wrapping shift-left is restricted to the range /// of the type, rather than the bits shifted out of the LHS /// being returned to the other end. The primitive integer - /// types all implement a [`rotate_left`](#method.rotate_left) function, + /// types all implement a [`rotate_left`](Self::rotate_left) function, /// which may be what you want instead. /// /// # Examples @@ -1026,7 +1026,7 @@ macro_rules! uint_impl { /// RHS of a wrapping shift-right is restricted to the range /// of the type, rather than the bits shifted out of the LHS /// being returned to the other end. The primitive integer - /// types all implement a [`rotate_right`](#method.rotate_right) function, + /// types all implement a [`rotate_right`](Self::rotate_right) function, /// which may be what you want instead. /// /// # Examples @@ -1185,7 +1185,7 @@ macro_rules! uint_impl { /// ``` #[inline] #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_unstable(feature = "const_overflowing_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_overflowing_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] pub const fn overflowing_div(self, rhs: Self) -> (Self, bool) { @@ -1215,7 +1215,7 @@ macro_rules! uint_impl { /// ``` #[inline] #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] pub const fn overflowing_div_euclid(self, rhs: Self) -> (Self, bool) { @@ -1242,7 +1242,7 @@ macro_rules! uint_impl { /// ``` #[inline] #[stable(feature = "wrapping", since = "1.7.0")] - #[rustc_const_unstable(feature = "const_overflowing_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_overflowing_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] pub const fn overflowing_rem(self, rhs: Self) -> (Self, bool) { @@ -1272,7 +1272,7 @@ macro_rules! uint_impl { /// ``` #[inline] #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] pub const fn overflowing_rem_euclid(self, rhs: Self) -> (Self, bool) { @@ -1456,7 +1456,7 @@ macro_rules! uint_impl { #[doc = concat!("assert_eq!(7", stringify!($SelfT), ".div_euclid(4), 1); // or any other integer type")] /// ``` #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1484,7 +1484,7 @@ macro_rules! uint_impl { #[doc = concat!("assert_eq!(7", stringify!($SelfT), ".rem_euclid(4), 3); // or any other integer type")] /// ``` #[stable(feature = "euclidean_division", since = "1.38.0")] - #[rustc_const_unstable(feature = "const_euclidean_int_methods", issue = "53718")] + #[rustc_const_stable(feature = "const_euclidean_int_methods", since = "1.52.0")] #[must_use = "this returns the result of the operation, \ without modifying the original"] #[inline] @@ -1642,8 +1642,8 @@ macro_rules! uint_impl { /// #[doc = $to_xe_bytes_doc] /// - /// [`to_be_bytes`]: #method.to_be_bytes - /// [`to_le_bytes`]: #method.to_le_bytes + /// [`to_be_bytes`]: Self::to_be_bytes + /// [`to_le_bytes`]: Self::to_le_bytes /// /// # Examples /// @@ -1675,7 +1675,7 @@ macro_rules! uint_impl { /// /// [`to_ne_bytes`] should be preferred over this whenever possible. /// - /// [`to_ne_bytes`]: #method.to_ne_bytes + /// [`to_ne_bytes`]: Self::to_ne_bytes /// /// # Examples /// @@ -1767,8 +1767,8 @@ macro_rules! uint_impl { /// likely wants to use [`from_be_bytes`] or [`from_le_bytes`], as /// appropriate instead. /// - /// [`from_be_bytes`]: #method.from_be_bytes - /// [`from_le_bytes`]: #method.from_le_bytes + /// [`from_be_bytes`]: Self::from_be_bytes + /// [`from_le_bytes`]: Self::from_le_bytes /// #[doc = $from_xe_bytes_doc] /// @@ -1806,8 +1806,7 @@ macro_rules! uint_impl { } /// New code should prefer to use - #[doc = concat!("[`", stringify!($SelfT), "::MIN", "`](#associatedconstant.MIN).")] - /// instead. + #[doc = concat!("[`", stringify!($SelfT), "::MIN", "`] instead.")] /// /// Returns the smallest value that can be represented by this integer type. #[stable(feature = "rust1", since = "1.0.0")] @@ -1818,8 +1817,7 @@ macro_rules! uint_impl { pub const fn min_value() -> Self { Self::MIN } /// New code should prefer to use - #[doc = concat!("[`", stringify!($SelfT), "::MAX", "`](#associatedconstant.MAX).")] - /// instead. + #[doc = concat!("[`", stringify!($SelfT), "::MAX", "`] instead.")] /// /// Returns the largest value that can be represented by this integer type. #[stable(feature = "rust1", since = "1.0.0")] diff --git a/library/core/src/ops/control_flow.rs b/library/core/src/ops/control_flow.rs index 4834ca74b8..2f78ba8f28 100644 --- a/library/core/src/ops/control_flow.rs +++ b/library/core/src/ops/control_flow.rs @@ -1,13 +1,63 @@ use crate::ops::Try; -/// Used to make try_fold closures more like normal loops +/// Used to tell an operation whether it should exit early or go on as usual. +/// +/// This is used when exposing things (like graph traversals or visitors) where +/// you want the user to be able to choose whether to exit early. +/// Having the enum makes it clearer -- no more wondering "wait, what did `false` +/// mean again?" -- and allows including a value. +/// +/// # Examples +/// +/// Early-exiting from [`Iterator::try_for_each`]: +/// ``` +/// #![feature(control_flow_enum)] +/// use std::ops::ControlFlow; +/// +/// let r = (2..100).try_for_each(|x| { +/// if 403 % x == 0 { +/// return ControlFlow::Break(x) +/// } +/// +/// ControlFlow::Continue(()) +/// }); +/// assert_eq!(r, ControlFlow::Break(13)); +/// ``` +/// +/// A basic tree traversal: +/// ```no_run +/// #![feature(control_flow_enum)] +/// use std::ops::ControlFlow; +/// +/// pub struct TreeNode { +/// value: T, +/// left: Option>>, +/// right: Option>>, +/// } +/// +/// impl TreeNode { +/// pub fn traverse_inorder(&self, mut f: impl FnMut(&T) -> ControlFlow) -> ControlFlow { +/// if let Some(left) = &self.left { +/// left.traverse_inorder(&mut f)?; +/// } +/// f(&self.value)?; +/// if let Some(right) = &self.right { +/// right.traverse_inorder(&mut f)?; +/// } +/// ControlFlow::Continue(()) +/// } +/// } +/// ``` #[unstable(feature = "control_flow_enum", reason = "new API", issue = "75744")] #[derive(Debug, Clone, Copy, PartialEq)] pub enum ControlFlow { - /// Continue in the loop, using the given value for the next iteration + /// Move on to the next phase of the operation as normal. Continue(C), - /// Exit the loop, yielding the given value + /// Exit the operation without running subsequent phases. Break(B), + // Yes, the order of the variants doesn't match the type parameters. + // They're in this order so that `ControlFlow` <-> `Result` + // is a no-op conversion in the `Try` implementation. } #[unstable(feature = "control_flow_enum", reason = "new API", issue = "75744")] @@ -33,6 +83,16 @@ impl Try for ControlFlow { impl ControlFlow { /// Returns `true` if this is a `Break` variant. + /// + /// # Examples + /// + /// ``` + /// #![feature(control_flow_enum)] + /// use std::ops::ControlFlow; + /// + /// assert!(ControlFlow::::Break(3).is_break()); + /// assert!(!ControlFlow::::Continue(3).is_break()); + /// ``` #[inline] #[unstable(feature = "control_flow_enum", reason = "new API", issue = "75744")] pub fn is_break(&self) -> bool { @@ -40,6 +100,16 @@ impl ControlFlow { } /// Returns `true` if this is a `Continue` variant. + /// + /// # Examples + /// + /// ``` + /// #![feature(control_flow_enum)] + /// use std::ops::ControlFlow; + /// + /// assert!(!ControlFlow::::Break(3).is_continue()); + /// assert!(ControlFlow::::Continue(3).is_continue()); + /// ``` #[inline] #[unstable(feature = "control_flow_enum", reason = "new API", issue = "75744")] pub fn is_continue(&self) -> bool { @@ -48,6 +118,16 @@ impl ControlFlow { /// Converts the `ControlFlow` into an `Option` which is `Some` if the /// `ControlFlow` was `Break` and `None` otherwise. + /// + /// # Examples + /// + /// ``` + /// #![feature(control_flow_enum)] + /// use std::ops::ControlFlow; + /// + /// assert_eq!(ControlFlow::::Break(3).break_value(), Some(3)); + /// assert_eq!(ControlFlow::::Continue(3).break_value(), None); + /// ``` #[inline] #[unstable(feature = "control_flow_enum", reason = "new API", issue = "75744")] pub fn break_value(self) -> Option { diff --git a/library/core/src/ops/deref.rs b/library/core/src/ops/deref.rs index 245152e549..10e3ce6744 100644 --- a/library/core/src/ops/deref.rs +++ b/library/core/src/ops/deref.rs @@ -60,10 +60,12 @@ #[doc(alias = "*")] #[doc(alias = "&*")] #[stable(feature = "rust1", since = "1.0.0")] +#[rustc_diagnostic_item = "Deref"] pub trait Deref { /// The resulting type after dereferencing. #[stable(feature = "rust1", since = "1.0.0")] #[rustc_diagnostic_item = "deref_target"] + #[cfg_attr(not(bootstrap), lang = "deref_target")] type Target: ?Sized; /// Dereferences the value. @@ -77,6 +79,7 @@ pub trait Deref { impl Deref for &T { type Target = T; + #[rustc_diagnostic_item = "noop_method_deref"] fn deref(&self) -> &T { *self } diff --git a/library/core/src/ops/function.rs b/library/core/src/ops/function.rs index bfdec43f7d..e5c4798afc 100644 --- a/library/core/src/ops/function.rs +++ b/library/core/src/ops/function.rs @@ -28,7 +28,7 @@ /// this can refer to [the relevant section in the *Rustonomicon*][nomicon]. /// /// [book]: ../../book/ch13-01-closures.html -/// [function pointers]: ../../std/primitive.fn.html +/// [function pointers]: fn /// [nomicon]: ../../nomicon/hrtb.html /// /// # Examples @@ -97,7 +97,7 @@ pub trait Fn: FnMut { /// this can refer to [the relevant section in the *Rustonomicon*][nomicon]. /// /// [book]: ../../book/ch13-01-closures.html -/// [function pointers]: ../../std/primitive.fn.html +/// [function pointers]: fn /// [nomicon]: ../../nomicon/hrtb.html /// /// # Examples @@ -176,7 +176,7 @@ pub trait FnMut: FnOnce { /// this can refer to [the relevant section in the *Rustonomicon*][nomicon]. /// /// [book]: ../../book/ch13-01-closures.html -/// [function pointers]: ../../std/primitive.fn.html +/// [function pointers]: fn /// [nomicon]: ../../nomicon/hrtb.html /// /// # Examples diff --git a/library/core/src/ops/range.rs b/library/core/src/ops/range.rs index 0571dc74b9..dbeb391213 100644 --- a/library/core/src/ops/range.rs +++ b/library/core/src/ops/range.rs @@ -1,9 +1,5 @@ use crate::fmt; use crate::hash::Hash; -use crate::slice::index::{ - slice_end_index_len_fail, slice_end_index_overflow_fail, slice_index_order_fail, - slice_start_index_overflow_fail, -}; /// An unbounded range (`..`). /// @@ -764,92 +760,6 @@ pub trait RangeBounds { #[stable(feature = "collections_range", since = "1.28.0")] fn end_bound(&self) -> Bound<&T>; - /// Performs bounds-checking of this range. - /// - /// The returned [`Range`] is safe to pass to [`slice::get_unchecked`] and - /// [`slice::get_unchecked_mut`] for slices of the given length. - /// - /// [`slice::get_unchecked`]: ../../std/primitive.slice.html#method.get_unchecked - /// [`slice::get_unchecked_mut`]: ../../std/primitive.slice.html#method.get_unchecked_mut - /// - /// # Panics - /// - /// Panics if the range would be out of bounds. - /// - /// # Examples - /// - /// ``` - /// #![feature(range_bounds_assert_len)] - /// - /// use std::ops::RangeBounds; - /// - /// let v = [10, 40, 30]; - /// assert_eq!(1..2, (1..2).assert_len(v.len())); - /// assert_eq!(0..2, (..2).assert_len(v.len())); - /// assert_eq!(1..3, (1..).assert_len(v.len())); - /// ``` - /// - /// Panics when [`Index::index`] would panic: - /// - /// ```should_panic - /// #![feature(range_bounds_assert_len)] - /// - /// use std::ops::RangeBounds; - /// - /// (2..1).assert_len(3); - /// ``` - /// - /// ```should_panic - /// #![feature(range_bounds_assert_len)] - /// - /// use std::ops::RangeBounds; - /// - /// (1..4).assert_len(3); - /// ``` - /// - /// ```should_panic - /// #![feature(range_bounds_assert_len)] - /// - /// use std::ops::RangeBounds; - /// - /// (1..=usize::MAX).assert_len(3); - /// ``` - /// - /// [`Index::index`]: crate::ops::Index::index - #[track_caller] - #[unstable(feature = "range_bounds_assert_len", issue = "76393")] - fn assert_len(self, len: usize) -> Range - where - Self: RangeBounds, - { - let start: Bound<&usize> = self.start_bound(); - let start = match start { - Bound::Included(&start) => start, - Bound::Excluded(start) => { - start.checked_add(1).unwrap_or_else(|| slice_start_index_overflow_fail()) - } - Bound::Unbounded => 0, - }; - - let end: Bound<&usize> = self.end_bound(); - let end = match end { - Bound::Included(end) => { - end.checked_add(1).unwrap_or_else(|| slice_end_index_overflow_fail()) - } - Bound::Excluded(&end) => end, - Bound::Unbounded => len, - }; - - if start > end { - slice_index_order_fail(start, end); - } - if end > len { - slice_end_index_len_fail(end, len); - } - - Range { start, end } - } - /// Returns `true` if `item` is contained in the range. /// /// # Examples diff --git a/library/core/src/option.rs b/library/core/src/option.rs index 14e4e4da3b..f1a0f455cd 100644 --- a/library/core/src/option.rs +++ b/library/core/src/option.rs @@ -150,7 +150,7 @@ use crate::iter::{FromIterator, FusedIterator, TrustedLen}; use crate::pin::Pin; use crate::{ - convert, fmt, hint, mem, + fmt, hint, mem, ops::{self, Deref, DerefMut}, }; @@ -336,7 +336,7 @@ impl Option { /// assert_eq!(x.expect("fruits are healthy"), "value"); /// ``` /// - /// ```{.should_panic} + /// ```should_panic /// let x: Option<&str> = None; /// x.expect("fruits are healthy"); // panics with `fruits are healthy` /// ``` @@ -372,7 +372,7 @@ impl Option { /// assert_eq!(x.unwrap(), "air"); /// ``` /// - /// ```{.should_panic} + /// ```should_panic /// let x: Option<&str> = None; /// assert_eq!(x.unwrap(), "air"); // fails /// ``` @@ -877,6 +877,34 @@ impl Option { self.get_or_insert_with(|| value) } + /// Inserts the default value into the option if it is [`None`], then + /// returns a mutable reference to the contained value. + /// + /// # Examples + /// + /// ``` + /// #![feature(option_get_or_insert_default)] + /// + /// let mut x = None; + /// + /// { + /// let y: &mut u32 = x.get_or_insert_default(); + /// assert_eq!(y, &0); + /// + /// *y = 7; + /// } + /// + /// assert_eq!(x, Some(7)); + /// ``` + #[inline] + #[unstable(feature = "option_get_or_insert_default", issue = "82901")] + pub fn get_or_insert_default(&mut self) -> &mut T + where + T: Default, + { + self.get_or_insert_with(Default::default) + } + /// Inserts a value computed from `f` into the option if it is [`None`], /// then returns a mutable reference to the contained value. /// @@ -1114,7 +1142,7 @@ impl Option { /// } /// ``` /// - /// ```{.should_panic} + /// ```should_panic /// #![feature(option_expect_none)] /// /// use std::collections::HashMap; @@ -1156,7 +1184,7 @@ impl Option { /// } /// ``` /// - /// ```{.should_panic} + /// ```should_panic /// #![feature(option_unwrap_none)] /// /// use std::collections::HashMap; @@ -1275,7 +1303,8 @@ impl Option> { /// ``` #[inline] #[stable(feature = "transpose_result", since = "1.33.0")] - pub fn transpose(self) -> Result, E> { + #[rustc_const_unstable(feature = "const_option", issue = "67441")] + pub const fn transpose(self) -> Result, E> { match self { Some(Ok(x)) => Ok(Some(x)), Some(Err(e)) => Err(e), @@ -1750,7 +1779,11 @@ impl Option> { /// ``` #[inline] #[stable(feature = "option_flattening", since = "1.40.0")] - pub fn flatten(self) -> Option { - self.and_then(convert::identity) + #[rustc_const_unstable(feature = "const_option", issue = "67441")] + pub const fn flatten(self) -> Option { + match self { + Some(inner) => inner, + None => None, + } } } diff --git a/library/core/src/panicking.rs b/library/core/src/panicking.rs index 2565150251..3e3e96fcd7 100644 --- a/library/core/src/panicking.rs +++ b/library/core/src/panicking.rs @@ -91,3 +91,77 @@ pub fn panic_fmt(fmt: fmt::Arguments<'_>) -> ! { // SAFETY: `panic_impl` is defined in safe Rust code and thus is safe to call. unsafe { panic_impl(&pi) } } + +#[derive(Debug)] +#[doc(hidden)] +pub enum AssertKind { + Eq, + Ne, + Match, +} + +/// Internal function for `assert_eq!` and `assert_ne!` macros +#[cold] +#[track_caller] +#[doc(hidden)] +pub fn assert_failed( + kind: AssertKind, + left: &T, + right: &U, + args: Option>, +) -> ! +where + T: fmt::Debug + ?Sized, + U: fmt::Debug + ?Sized, +{ + assert_failed_inner(kind, &left, &right, args) +} + +/// Internal function for `assert_match!` +#[cold] +#[track_caller] +#[doc(hidden)] +pub fn assert_matches_failed( + left: &T, + right: &str, + args: Option>, +) -> ! { + // Use the Display implementation to display the pattern. + struct Pattern<'a>(&'a str); + impl fmt::Debug for Pattern<'_> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Display::fmt(self.0, f) + } + } + assert_failed_inner(AssertKind::Match, &left, &Pattern(right), args); +} + +/// Non-generic version of the above functions, to avoid code bloat. +#[track_caller] +fn assert_failed_inner( + kind: AssertKind, + left: &dyn fmt::Debug, + right: &dyn fmt::Debug, + args: Option>, +) -> ! { + let op = match kind { + AssertKind::Eq => "==", + AssertKind::Ne => "!=", + AssertKind::Match => "matches", + }; + + match args { + Some(args) => panic!( + r#"assertion failed: `(left {} right)` + left: `{:?}`, + right: `{:?}`: {}"#, + op, left, right, args + ), + None => panic!( + r#"assertion failed: `(left {} right)` + left: `{:?}`, + right: `{:?}`"#, + op, left, right, + ), + } +} diff --git a/library/core/src/prelude/mod.rs b/library/core/src/prelude/mod.rs index 51f4acf068..8f57db4949 100644 --- a/library/core/src/prelude/mod.rs +++ b/library/core/src/prelude/mod.rs @@ -1,5 +1,41 @@ //! The libcore prelude +//! +//! This module is intended for users of libcore which do not link to libstd as +//! well. This module is imported by default when `#![no_std]` is used in the +//! same manner as the standard library's prelude. #![stable(feature = "core_prelude", since = "1.4.0")] pub mod v1; + +/// The 2015 version of the core prelude. +/// +/// See the [module-level documentation](self) for more. +#[unstable(feature = "prelude_2015", issue = "none")] +pub mod rust_2015 { + #[unstable(feature = "prelude_2015", issue = "none")] + #[doc(no_inline)] + pub use super::v1::*; +} + +/// The 2018 version of the core prelude. +/// +/// See the [module-level documentation](self) for more. +#[unstable(feature = "prelude_2018", issue = "none")] +pub mod rust_2018 { + #[unstable(feature = "prelude_2018", issue = "none")] + #[doc(no_inline)] + pub use super::v1::*; +} + +/// The 2021 version of the core prelude. +/// +/// See the [module-level documentation](self) for more. +#[unstable(feature = "prelude_2021", issue = "none")] +pub mod rust_2021 { + #[unstable(feature = "prelude_2021", issue = "none")] + #[doc(no_inline)] + pub use super::v1::*; + + // FIXME: Add more things. +} diff --git a/library/core/src/prelude/v1.rs b/library/core/src/prelude/v1.rs index b4fff3d67b..7d33ca8bb6 100644 --- a/library/core/src/prelude/v1.rs +++ b/library/core/src/prelude/v1.rs @@ -1,8 +1,6 @@ -//! The core prelude +//! The first version of the core prelude. //! -//! This module is intended for users of libcore which do not link to libstd as -//! well. This module is imported by default when `#![no_std]` is used in the -//! same manner as the standard library's prelude. +//! See the [module-level documentation](super) for more. #![stable(feature = "core_prelude", since = "1.4.0")] @@ -63,12 +61,17 @@ pub use crate::{ }; #[stable(feature = "builtin_macro_prelude", since = "1.38.0")] -#[allow(deprecated)] +#[allow(deprecated, deprecated_in_future)] #[doc(no_inline)] pub use crate::macros::builtin::{ bench, global_allocator, test, test_case, RustcDecodable, RustcEncodable, }; +#[cfg(not(bootstrap))] +#[stable(feature = "builtin_macro_prelude", since = "1.38.0")] +#[doc(no_inline)] +pub use crate::macros::builtin::derive; + #[unstable( feature = "cfg_accessible", issue = "64797", @@ -76,3 +79,12 @@ pub use crate::macros::builtin::{ )] #[doc(no_inline)] pub use crate::macros::builtin::cfg_accessible; + +#[cfg(not(bootstrap))] +#[unstable( + feature = "cfg_eval", + issue = "82679", + reason = "`cfg_eval` is a recently implemented feature" +)] +#[doc(no_inline)] +pub use crate::macros::builtin::cfg_eval; diff --git a/library/core/src/ptr/const_ptr.rs b/library/core/src/ptr/const_ptr.rs index 28de28c70e..b511466acd 100644 --- a/library/core/src/ptr/const_ptr.rs +++ b/library/core/src/ptr/const_ptr.rs @@ -48,6 +48,17 @@ impl *const T { self as _ } + /// Decompose a (possibly wide) pointer into is address and metadata components. + /// + /// The pointer can be later reconstructed with [`from_raw_parts`]. + #[cfg(not(bootstrap))] + #[unstable(feature = "ptr_metadata", issue = "81513")] + #[rustc_const_unstable(feature = "ptr_metadata", issue = "81513")] + #[inline] + pub const fn to_raw_parts(self) -> (*const (), ::Metadata) { + (self.cast(), metadata(self)) + } + /// Returns `None` if the pointer is null, or else returns a shared reference to /// the value wrapped in `Some`. If the value may be uninitialized, [`as_uninit_ref`] /// must be used instead. @@ -309,25 +320,31 @@ impl *const T { /// * Both pointers must be *derived from* a pointer to the same object. /// (See below for an example.) /// - /// * 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 between the pointers, **in bytes**, cannot overflow an `isize`. + /// /// * 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. + /// Rust types are never larger than `isize::MAX` and Rust allocations never wrap around the + /// address space, so two pointers within some value of any Rust type `T` will always satisfy + /// the last two conditions. The standard library also generally ensures that 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())` + /// always satisfies the last two conditions. /// - /// Most platforms fundamentally can't even construct such an allocation. + /// Most platforms fundamentally can't even construct such a large 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. + /// (Note that [`offset`] and [`add`] also have a similar limitation and hence cannot be used on + /// such large allocations either.) + /// + /// [`add`]: #method.add /// /// # Panics /// @@ -802,9 +819,10 @@ impl *const T { /// See [`ptr::copy`] for safety concerns and examples. /// /// [`ptr::copy`]: crate::ptr::copy() + #[rustc_const_unstable(feature = "const_intrinsic_copy", issue = "80697")] #[stable(feature = "pointer_methods", since = "1.26.0")] #[inline] - pub unsafe fn copy_to(self, dest: *mut T, count: usize) + pub const unsafe fn copy_to(self, dest: *mut T, count: usize) where T: Sized, { @@ -820,9 +838,10 @@ impl *const T { /// See [`ptr::copy_nonoverlapping`] for safety concerns and examples. /// /// [`ptr::copy_nonoverlapping`]: crate::ptr::copy_nonoverlapping() + #[rustc_const_unstable(feature = "const_intrinsic_copy", issue = "80697")] #[stable(feature = "pointer_methods", since = "1.26.0")] #[inline] - pub unsafe fn copy_to_nonoverlapping(self, dest: *mut T, count: usize) + pub const unsafe fn copy_to_nonoverlapping(self, dest: *mut T, count: usize) where T: Sized, { @@ -905,9 +924,14 @@ impl *const [T] { #[unstable(feature = "slice_ptr_len", issue = "71146")] #[rustc_const_unstable(feature = "const_slice_ptr_len", issue = "71146")] pub const fn len(self) -> usize { - // SAFETY: this is safe because `*const [T]` and `FatPtr` have the same layout. - // Only `std` can make this guarantee. - unsafe { Repr { rust: self }.raw }.len + #[cfg(bootstrap)] + { + // SAFETY: this is safe because `*const [T]` and `FatPtr` have the same layout. + // Only `std` can make this guarantee. + unsafe { Repr { rust: self }.raw }.len + } + #[cfg(not(bootstrap))] + metadata(self) } /// Returns a raw pointer to the slice's buffer. @@ -995,8 +1019,6 @@ impl *const [T] { /// See also [`slice::from_raw_parts`][]. /// /// [valid]: crate::ptr#safety - /// [`NonNull::dangling()`]: NonNull::dangling - /// [`pointer::offset`]: ../std/primitive.pointer.html#method.offset #[inline] #[unstable(feature = "ptr_as_uninit", issue = "75402")] pub unsafe fn as_uninit_slice<'a>(self) -> Option<&'a [MaybeUninit]> { diff --git a/library/core/src/ptr/metadata.rs b/library/core/src/ptr/metadata.rs new file mode 100644 index 0000000000..7c7dce0ce7 --- /dev/null +++ b/library/core/src/ptr/metadata.rs @@ -0,0 +1,265 @@ +#![unstable(feature = "ptr_metadata", issue = "81513")] + +use crate::fmt; +use crate::hash::{Hash, Hasher}; + +/// Provides the pointer metadata type of any pointed-to type. +/// +/// # Pointer metadata +/// +/// Raw pointer types and reference types in Rust can be thought of as made of two parts: +/// a data pointer that contains the memory address of the value, and some metadata. +/// +/// For statically-sized types (that implement the `Sized` traits) +/// as well as for `extern` types, +/// pointers are said to be “thin”: metadata is zero-sized and its type is `()`. +/// +/// Pointers to [dynamically-sized types][dst] are said to be “wide” or “fat”, +/// they have non-zero-sized metadata: +/// +/// * For structs whose last field is a DST, metadata is the metadata for the last field +/// * For the `str` type, metadata is the length in bytes as `usize` +/// * For slice types like `[T]`, metadata is the length in items as `usize` +/// * For trait objects like `dyn SomeTrait`, metadata is [`DynMetadata`][DynMetadata] +/// (e.g. `DynMetadata`) +/// +/// In the future, the Rust language may gain new kinds of types +/// that have different pointer metadata. +/// +/// [dst]: https://doc.rust-lang.org/nomicon/exotic-sizes.html#dynamically-sized-types-dsts +/// +/// +/// # The `Pointee` trait +/// +/// The point of this trait is its `Metadata` associated type, +/// which is `()` or `usize` or `DynMetadata<_>` as described above. +/// It is automatically implemented for every type. +/// It can be assumed to be implemented in a generic context, even without a corresponding bound. +/// +/// +/// # Usage +/// +/// Raw pointers can be decomposed into the data address and metadata components +/// with their [`to_raw_parts`] method. +/// +/// Alternatively, metadata alone can be extracted with the [`metadata`] function. +/// A reference can be passed to [`metadata`] and implicitly coerced. +/// +/// A (possibly-wide) pointer can be put back together from its address and metadata +/// with [`from_raw_parts`] or [`from_raw_parts_mut`]. +/// +/// [`to_raw_parts`]: *const::to_raw_parts +#[lang = "pointee_trait"] +pub trait Pointee { + /// The type for metadata in pointers and references to `Self`. + #[lang = "metadata_type"] + // NOTE: Keep trait bounds in `static_assert_expected_bounds_for_metadata` + // in `library/core/src/ptr/metadata.rs` + // in sync with those here: + type Metadata: Copy + Send + Sync + Ord + Hash + Unpin; +} + +/// Pointers to types implementing this trait alias are “thin”. +/// +/// This includes statically-`Sized` types and `extern` types. +/// +/// # Example +/// +/// ```rust +/// #![feature(ptr_metadata)] +/// +/// fn this_never_panics() { +/// assert_eq!(std::mem::size_of::<&T>(), std::mem::size_of::()) +/// } +/// ``` +#[unstable(feature = "ptr_metadata", issue = "81513")] +// NOTE: don’t stabilize this before trait aliases are stable in the language? +pub trait Thin = Pointee; + +/// Extract the metadata component of a pointer. +/// +/// Values of type `*mut T`, `&T`, or `&mut T` can be passed directly to this function +/// as they implicitly coerce to `*const T`. +/// +/// # Example +/// +/// ``` +/// #![feature(ptr_metadata)] +/// +/// assert_eq!(std::ptr::metadata("foo"), 3_usize); +/// ``` +#[rustc_const_unstable(feature = "ptr_metadata", issue = "81513")] +#[inline] +pub const fn metadata(ptr: *const T) -> ::Metadata { + // SAFETY: Accessing the value from the `PtrRepr` union is safe since *const T + // and PtrComponents have the same memory layouts. Only std can make this + // guarantee. + unsafe { PtrRepr { const_ptr: ptr }.components.metadata } +} + +/// Forms a (possibly-wide) raw pointer from a data address and metadata. +/// +/// This function is safe but the returned pointer is not necessarily safe to dereference. +/// For slices, see the documentation of [`slice::from_raw_parts`] for safety requirements. +/// For trait objects, the metadata must come from a pointer to the same underlying ereased type. +/// +/// [`slice::from_raw_parts`]: crate::slice::from_raw_parts +#[unstable(feature = "ptr_metadata", issue = "81513")] +#[rustc_const_unstable(feature = "ptr_metadata", issue = "81513")] +#[inline] +pub const fn from_raw_parts( + data_address: *const (), + metadata: ::Metadata, +) -> *const T { + // SAFETY: Accessing the value from the `PtrRepr` union is safe since *const T + // and PtrComponents have the same memory layouts. Only std can make this + // guarantee. + unsafe { PtrRepr { components: PtrComponents { data_address, metadata } }.const_ptr } +} + +/// Performs the same functionality as [`from_raw_parts`], except that a +/// raw `*mut` pointer is returned, as opposed to a raw `*const` pointer. +/// +/// See the documentation of [`from_raw_parts`] for more details. +#[unstable(feature = "ptr_metadata", issue = "81513")] +#[rustc_const_unstable(feature = "ptr_metadata", issue = "81513")] +#[inline] +pub const fn from_raw_parts_mut( + data_address: *mut (), + metadata: ::Metadata, +) -> *mut T { + // SAFETY: Accessing the value from the `PtrRepr` union is safe since *const T + // and PtrComponents have the same memory layouts. Only std can make this + // guarantee. + unsafe { PtrRepr { components: PtrComponents { data_address, metadata } }.mut_ptr } +} + +#[repr(C)] +pub(crate) union PtrRepr { + pub(crate) const_ptr: *const T, + pub(crate) mut_ptr: *mut T, + pub(crate) components: PtrComponents, +} + +#[repr(C)] +pub(crate) struct PtrComponents { + pub(crate) data_address: *const (), + pub(crate) metadata: ::Metadata, +} + +// Manual impl needed to avoid `T: Copy` bound. +impl Copy for PtrComponents {} + +// Manual impl needed to avoid `T: Clone` bound. +impl Clone for PtrComponents { + fn clone(&self) -> Self { + *self + } +} + +/// The metadata for a `Dyn = dyn SomeTrait` trait object type. +/// +/// It is a pointer to a vtable (virtual call table) +/// that represents all the necessary information +/// to manipulate the concrete type stored inside a trait object. +/// The vtable notably it contains: +/// +/// * type size +/// * type alignment +/// * a pointer to the type’s `drop_in_place` impl (may be a no-op for plain-old-data) +/// * pointers to all the methods for the type’s implementation of the trait +/// +/// Note that the first three are special because they’re necessary to allocate, drop, +/// and deallocate any trait object. +/// +/// It is possible to name this struct with a type parameter that is not a `dyn` trait object +/// (for example `DynMetadata`) but not to obtain a meaningful value of that struct. +#[lang = "dyn_metadata"] +pub struct DynMetadata { + vtable_ptr: &'static VTable, + phantom: crate::marker::PhantomData, +} + +/// The common prefix of all vtables. It is followed by function pointers for trait methods. +/// +/// Private implementation detail of `DynMetadata::size_of` etc. +#[repr(C)] +struct VTable { + drop_in_place: fn(*mut ()), + size_of: usize, + align_of: usize, +} + +impl DynMetadata { + /// Returns the size of the type associated with this vtable. + #[inline] + pub fn size_of(self) -> usize { + self.vtable_ptr.size_of + } + + /// Returns the alignment of the type associated with this vtable. + #[inline] + pub fn align_of(self) -> usize { + self.vtable_ptr.align_of + } + + /// Returns the size and alignment together as a `Layout` + #[inline] + pub fn layout(self) -> crate::alloc::Layout { + // SAFETY: the compiler emitted this vtable for a concrete Rust type which + // is known to have a valid layout. Same rationale as in `Layout::for_value`. + unsafe { crate::alloc::Layout::from_size_align_unchecked(self.size_of(), self.align_of()) } + } +} + +unsafe impl Send for DynMetadata {} +unsafe impl Sync for DynMetadata {} + +impl fmt::Debug for DynMetadata { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("DynMetadata").field(&(self.vtable_ptr as *const VTable)).finish() + } +} + +// Manual impls needed to avoid `Dyn: $Trait` bounds. + +impl Unpin for DynMetadata {} + +impl Copy for DynMetadata {} + +impl Clone for DynMetadata { + #[inline] + fn clone(&self) -> Self { + *self + } +} + +impl Eq for DynMetadata {} + +impl PartialEq for DynMetadata { + #[inline] + fn eq(&self, other: &Self) -> bool { + crate::ptr::eq::(self.vtable_ptr, other.vtable_ptr) + } +} + +impl Ord for DynMetadata { + #[inline] + fn cmp(&self, other: &Self) -> crate::cmp::Ordering { + (self.vtable_ptr as *const VTable).cmp(&(other.vtable_ptr as *const VTable)) + } +} + +impl PartialOrd for DynMetadata { + #[inline] + fn partial_cmp(&self, other: &Self) -> Option { + Some(self.cmp(other)) + } +} + +impl Hash for DynMetadata { + #[inline] + fn hash(&self, hasher: &mut H) { + crate::ptr::hash::(self.vtable_ptr, hasher) + } +} diff --git a/library/core/src/ptr/mod.rs b/library/core/src/ptr/mod.rs index c0108c0f82..3a27f01444 100644 --- a/library/core/src/ptr/mod.rs +++ b/library/core/src/ptr/mod.rs @@ -1,6 +1,6 @@ //! Manually manage memory through raw pointers. //! -//! *[See also the pointer primitive types](../../std/primitive.pointer.html).* +//! *[See also the pointer primitive types](pointer).* //! //! # Safety //! @@ -60,14 +60,14 @@ //! [ub]: ../../reference/behavior-considered-undefined.html //! [zst]: ../../nomicon/exotic-sizes.html#zero-sized-types-zsts //! [atomic operations]: crate::sync::atomic -//! [`offset`]: ../../std/primitive.pointer.html#method.offset +//! [`offset`]: pointer::offset #![stable(feature = "rust1", since = "1.0.0")] use crate::cmp::Ordering; use crate::fmt; use crate::hash; -use crate::intrinsics::{self, abort, is_aligned_and_not_null, is_nonoverlapping}; +use crate::intrinsics::{self, abort, is_aligned_and_not_null}; use crate::mem::{self, MaybeUninit}; #[stable(feature = "rust1", since = "1.0.0")] @@ -82,6 +82,14 @@ pub use crate::intrinsics::copy; #[doc(inline)] pub use crate::intrinsics::write_bytes; +#[cfg(not(bootstrap))] +mod metadata; +#[cfg(not(bootstrap))] +pub(crate) use metadata::PtrRepr; +#[cfg(not(bootstrap))] +#[unstable(feature = "ptr_metadata", issue = "81513")] +pub use metadata::{from_raw_parts, from_raw_parts_mut, metadata, DynMetadata, Pointee, Thin}; + mod non_null; #[stable(feature = "nonnull", since = "1.25.0")] pub use non_null::NonNull; @@ -220,6 +228,7 @@ pub const fn null_mut() -> *mut T { 0 as *mut T } +#[cfg(bootstrap)] #[repr(C)] pub(crate) union Repr { pub(crate) rust: *const [T], @@ -227,12 +236,14 @@ pub(crate) union Repr { pub(crate) raw: FatPtr, } +#[cfg(bootstrap)] #[repr(C)] pub(crate) struct FatPtr { data: *const T, pub(crate) len: usize, } +#[cfg(bootstrap)] // Manual impl needed to avoid `T: Clone` bound. impl Clone for FatPtr { fn clone(&self) -> Self { @@ -240,6 +251,7 @@ impl Clone for FatPtr { } } +#[cfg(bootstrap)] // Manual impl needed to avoid `T: Copy` bound. impl Copy for FatPtr {} @@ -267,10 +279,15 @@ impl Copy for FatPtr {} #[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] { - // SAFETY: Accessing the value from the `Repr` union is safe since *const [T] - // and FatPtr have the same memory layouts. Only std can make this - // guarantee. - unsafe { Repr { raw: FatPtr { data, len } }.rust } + #[cfg(bootstrap)] + { + // SAFETY: Accessing the value from the `Repr` union is safe since *const [T] + // and FatPtr have the same memory layouts. Only std can make this + // guarantee. + unsafe { Repr { raw: FatPtr { data, len } }.rust } + } + #[cfg(not(bootstrap))] + from_raw_parts(data.cast(), len) } /// Performs the same functionality as [`slice_from_raw_parts`], except that a @@ -302,9 +319,14 @@ pub const 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_mut(data: *mut T, len: usize) -> *mut [T] { - // SAFETY: Accessing the value from the `Repr` union is safe since *mut [T] - // and FatPtr have the same memory layouts - unsafe { Repr { raw: FatPtr { data, len } }.rust_mut } + #[cfg(bootstrap)] + { + // SAFETY: Accessing the value from the `Repr` union is safe since *mut [T] + // and FatPtr have the same memory layouts + unsafe { Repr { raw: FatPtr { data, len } }.rust_mut } + } + #[cfg(not(bootstrap))] + from_raw_parts_mut(data.cast(), len) } /// Swaps the values at two mutable locations of the same type, without @@ -372,7 +394,8 @@ pub const fn slice_from_raw_parts_mut(data: *mut T, len: usize) -> *mut [T] { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] -pub unsafe fn swap(x: *mut T, y: *mut T) { +#[rustc_const_unstable(feature = "const_swap", issue = "83163")] +pub const unsafe fn swap(x: *mut T, y: *mut T) { // Give ourselves some scratch space to work with. // We do not have to worry about drops: `MaybeUninit` does nothing when dropped. let mut tmp = MaybeUninit::::uninit(); @@ -429,16 +452,8 @@ pub unsafe fn swap(x: *mut T, y: *mut T) { /// ``` #[inline] #[stable(feature = "swap_nonoverlapping", since = "1.27.0")] -pub unsafe fn swap_nonoverlapping(x: *mut T, y: *mut T, count: usize) { - if cfg!(debug_assertions) - && !(is_aligned_and_not_null(x) - && is_aligned_and_not_null(y) - && is_nonoverlapping(x, y, count)) - { - // Not panicking to keep codegen impact smaller. - abort(); - } - +#[rustc_const_unstable(feature = "const_swap", issue = "83163")] +pub const unsafe fn swap_nonoverlapping(x: *mut T, y: *mut T, count: usize) { let x = x as *mut u8; let y = y as *mut u8; let len = mem::size_of::() * count; @@ -448,7 +463,8 @@ pub unsafe fn swap_nonoverlapping(x: *mut T, y: *mut T, count: usize) { } #[inline] -pub(crate) unsafe fn swap_nonoverlapping_one(x: *mut T, y: *mut T) { +#[rustc_const_unstable(feature = "const_swap", issue = "83163")] +pub(crate) const unsafe fn swap_nonoverlapping_one(x: *mut T, y: *mut T) { // For types smaller than the block optimization below, // just swap directly to avoid pessimizing codegen. if mem::size_of::() < 32 { @@ -466,7 +482,8 @@ pub(crate) unsafe fn swap_nonoverlapping_one(x: *mut T, y: *mut T) { } #[inline] -unsafe fn swap_nonoverlapping_bytes(x: *mut u8, y: *mut u8, len: usize) { +#[rustc_const_unstable(feature = "const_swap", issue = "83163")] +const unsafe fn swap_nonoverlapping_bytes(x: *mut u8, y: *mut u8, len: usize) { // The approach here is to utilize simd to swap x & y efficiently. Testing reveals // that swapping either 32 bytes or 64 bytes at a time is most efficient for Intel // Haswell E processors. LLVM is more able to optimize if we give a struct a @@ -490,7 +507,7 @@ unsafe fn swap_nonoverlapping_bytes(x: *mut u8, y: *mut u8, len: usize) { let t = t.as_mut_ptr() as *mut u8; // SAFETY: As `i < len`, and as the caller must guarantee that `x` and `y` are valid - // for `len` bytes, `x + i` and `y + i` must be valid adresses, which fulfills the + // for `len` bytes, `x + i` and `y + i` must be valid addresses, which fulfills the // safety contract for `add`. // // Also, the caller must guarantee that `x` and `y` are valid for writes, properly aligned, @@ -567,7 +584,8 @@ unsafe fn swap_nonoverlapping_bytes(x: *mut u8, y: *mut u8, len: usize) { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] -pub unsafe fn replace(dst: *mut T, mut src: T) -> T { +#[rustc_const_unstable(feature = "const_replace", issue = "83164")] +pub const unsafe fn replace(dst: *mut T, mut src: T) -> T { // SAFETY: the caller must guarantee that `dst` is valid to be // cast to a mutable reference (valid for writes, aligned, initialized), // and cannot overlap `src` since `dst` must point to a distinct @@ -880,18 +898,14 @@ pub const unsafe fn read_unaligned(src: *const T) -> T { /// ``` #[inline] #[stable(feature = "rust1", since = "1.0.0")] -pub unsafe fn write(dst: *mut T, src: T) { - // We are calling the intrinsics directly to avoid function calls in the generated code - // as `intrinsics::copy_nonoverlapping` is a wrapper function. - extern "rust-intrinsic" { - fn copy_nonoverlapping(src: *const T, dst: *mut T, count: usize); - } - +#[rustc_const_unstable(feature = "const_ptr_write", issue = "none")] +pub const unsafe fn write(dst: *mut T, src: T) { // SAFETY: the caller must guarantee that `dst` is valid for writes. // `dst` cannot overlap `src` because the caller has mutable access // to `dst` while `src` is owned by this function. unsafe { copy_nonoverlapping(&src as *const T, dst, 1); + // We are calling the intrinsic directly to avoid function calls in the generated code. intrinsics::forget(src); } } @@ -981,14 +995,16 @@ pub unsafe fn write(dst: *mut T, src: T) { /// ``` #[inline] #[stable(feature = "ptr_unaligned", since = "1.17.0")] -pub unsafe fn write_unaligned(dst: *mut T, src: T) { +#[rustc_const_unstable(feature = "const_ptr_write", issue = "none")] +pub const unsafe fn write_unaligned(dst: *mut T, src: T) { // SAFETY: the caller must guarantee that `dst` is valid for writes. // `dst` cannot overlap `src` because the caller has mutable access // to `dst` while `src` is owned by this function. unsafe { copy_nonoverlapping(&src as *const T as *const u8, dst as *mut u8, mem::size_of::()); + // We are calling the intrinsic directly to avoid function calls in the generated code. + intrinsics::forget(src); } - mem::forget(src); } /// Performs a volatile read of the value from `src` without moving it. This diff --git a/library/core/src/ptr/mut_ptr.rs b/library/core/src/ptr/mut_ptr.rs index 99744fc711..fa09cf8543 100644 --- a/library/core/src/ptr/mut_ptr.rs +++ b/library/core/src/ptr/mut_ptr.rs @@ -47,6 +47,17 @@ impl *mut T { self as _ } + /// Decompose a (possibly wide) pointer into is address and metadata components. + /// + /// The pointer can be later reconstructed with [`from_raw_parts_mut`]. + #[cfg(not(bootstrap))] + #[unstable(feature = "ptr_metadata", issue = "81513")] + #[rustc_const_unstable(feature = "ptr_metadata", issue = "81513")] + #[inline] + pub const fn to_raw_parts(self) -> (*mut (), ::Metadata) { + (self.cast(), super::metadata(self)) + } + /// Returns `None` if the pointer is null, or else returns a shared reference to /// the value wrapped in `Some`. If the value may be uninitialized, [`as_uninit_ref`] /// must be used instead. @@ -480,25 +491,31 @@ impl *mut T { /// * Both pointers must be *derived from* a pointer to the same object. /// (See below for an example.) /// - /// * 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 between the pointers, **in bytes**, cannot overflow an `isize`. + /// /// * 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. + /// Rust types are never larger than `isize::MAX` and Rust allocations never wrap around the + /// address space, so two pointers within some value of any Rust type `T` will always satisfy + /// the last two conditions. The standard library also generally ensures that 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())` + /// always satisfies the last two conditions. /// - /// Most platforms fundamentally can't even construct such an allocation. + /// Most platforms fundamentally can't even construct such a large 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. + /// (Note that [`offset`] and [`add`] also have a similar limitation and hence cannot be used on + /// such large allocations either.) + /// + /// [`add`]: #method.add /// /// # Panics /// @@ -909,9 +926,10 @@ impl *mut T { /// See [`ptr::copy`] for safety concerns and examples. /// /// [`ptr::copy`]: crate::ptr::copy() + #[rustc_const_unstable(feature = "const_intrinsic_copy", issue = "80697")] #[stable(feature = "pointer_methods", since = "1.26.0")] #[inline] - pub unsafe fn copy_to(self, dest: *mut T, count: usize) + pub const unsafe fn copy_to(self, dest: *mut T, count: usize) where T: Sized, { @@ -927,9 +945,10 @@ impl *mut T { /// See [`ptr::copy_nonoverlapping`] for safety concerns and examples. /// /// [`ptr::copy_nonoverlapping`]: crate::ptr::copy_nonoverlapping() + #[rustc_const_unstable(feature = "const_intrinsic_copy", issue = "80697")] #[stable(feature = "pointer_methods", since = "1.26.0")] #[inline] - pub unsafe fn copy_to_nonoverlapping(self, dest: *mut T, count: usize) + pub const unsafe fn copy_to_nonoverlapping(self, dest: *mut T, count: usize) where T: Sized, { @@ -945,9 +964,10 @@ impl *mut T { /// See [`ptr::copy`] for safety concerns and examples. /// /// [`ptr::copy`]: crate::ptr::copy() + #[rustc_const_unstable(feature = "const_intrinsic_copy", issue = "80697")] #[stable(feature = "pointer_methods", since = "1.26.0")] #[inline] - pub unsafe fn copy_from(self, src: *const T, count: usize) + pub const unsafe fn copy_from(self, src: *const T, count: usize) where T: Sized, { @@ -963,9 +983,10 @@ impl *mut T { /// See [`ptr::copy_nonoverlapping`] for safety concerns and examples. /// /// [`ptr::copy_nonoverlapping`]: crate::ptr::copy_nonoverlapping() + #[rustc_const_unstable(feature = "const_intrinsic_copy", issue = "80697")] #[stable(feature = "pointer_methods", since = "1.26.0")] #[inline] - pub unsafe fn copy_from_nonoverlapping(self, src: *const T, count: usize) + pub const unsafe fn copy_from_nonoverlapping(self, src: *const T, count: usize) where T: Sized, { @@ -992,8 +1013,9 @@ impl *mut T { /// /// [`ptr::write`]: crate::ptr::write() #[stable(feature = "pointer_methods", since = "1.26.0")] + #[rustc_const_unstable(feature = "const_ptr_write", issue = "none")] #[inline] - pub unsafe fn write(self, val: T) + pub const unsafe fn write(self, val: T) where T: Sized, { @@ -1046,8 +1068,9 @@ impl *mut T { /// /// [`ptr::write_unaligned`]: crate::ptr::write_unaligned() #[stable(feature = "pointer_methods", since = "1.26.0")] + #[rustc_const_unstable(feature = "const_ptr_write", issue = "none")] #[inline] - pub unsafe fn write_unaligned(self, val: T) + pub const unsafe fn write_unaligned(self, val: T) where T: Sized, { @@ -1162,9 +1185,14 @@ impl *mut [T] { #[unstable(feature = "slice_ptr_len", issue = "71146")] #[rustc_const_unstable(feature = "const_slice_ptr_len", issue = "71146")] pub const fn len(self) -> usize { - // SAFETY: this is safe because `*const [T]` and `FatPtr` have the same layout. - // Only `std` can make this guarantee. - unsafe { Repr { rust_mut: self }.raw }.len + #[cfg(bootstrap)] + { + // SAFETY: this is safe because `*const [T]` and `FatPtr` have the same layout. + // Only `std` can make this guarantee. + unsafe { Repr { rust_mut: self }.raw }.len + } + #[cfg(not(bootstrap))] + metadata(self) } /// Returns a raw pointer to the slice's buffer. @@ -1255,8 +1283,6 @@ impl *mut [T] { /// See also [`slice::from_raw_parts`][]. /// /// [valid]: crate::ptr#safety - /// [`NonNull::dangling()`]: NonNull::dangling - /// [`pointer::offset`]: ../std/primitive.pointer.html#method.offset #[inline] #[unstable(feature = "ptr_as_uninit", issue = "75402")] pub unsafe fn as_uninit_slice<'a>(self) -> Option<&'a [MaybeUninit]> { @@ -1307,8 +1333,6 @@ impl *mut [T] { /// See also [`slice::from_raw_parts_mut`][]. /// /// [valid]: crate::ptr#safety - /// [`NonNull::dangling()`]: NonNull::dangling - /// [`pointer::offset`]: ../std/primitive.pointer.html#method.offset #[inline] #[unstable(feature = "ptr_as_uninit", issue = "75402")] pub unsafe fn as_uninit_slice_mut<'a>(self) -> Option<&'a mut [MaybeUninit]> { diff --git a/library/core/src/ptr/non_null.rs b/library/core/src/ptr/non_null.rs index e45fefc7ed..8d533cd6be 100644 --- a/library/core/src/ptr/non_null.rs +++ b/library/core/src/ptr/non_null.rs @@ -175,6 +175,37 @@ impl NonNull { } } + /// Performs the same functionality as [`std::ptr::from_raw_parts`], except that a + /// `NonNull` pointer is returned, as opposed to a raw `*const` pointer. + /// + /// See the documentation of [`std::ptr::from_raw_parts`] for more details. + /// + /// [`std::ptr::from_raw_parts`]: crate::ptr::from_raw_parts + #[cfg(not(bootstrap))] + #[unstable(feature = "ptr_metadata", issue = "81513")] + #[rustc_const_unstable(feature = "ptr_metadata", issue = "81513")] + #[inline] + pub const fn from_raw_parts( + data_address: NonNull<()>, + metadata: ::Metadata, + ) -> NonNull { + // SAFETY: The result of `ptr::from::raw_parts_mut` is non-null because `data_address` is. + unsafe { + NonNull::new_unchecked(super::from_raw_parts_mut(data_address.as_ptr(), metadata)) + } + } + + /// Decompose a (possibly wide) pointer into is address and metadata components. + /// + /// The pointer can be later reconstructed with [`NonNull::from_raw_parts`]. + #[cfg(not(bootstrap))] + #[unstable(feature = "ptr_metadata", issue = "81513")] + #[rustc_const_unstable(feature = "ptr_metadata", issue = "81513")] + #[inline] + pub const fn to_raw_parts(self) -> (NonNull<()>, ::Metadata) { + (self.cast(), super::metadata(self.as_ptr())) + } + /// Acquires the underlying `*mut` pointer. #[stable(feature = "nonnull", since = "1.25.0")] #[rustc_const_stable(feature = "const_nonnull_as_ptr", since = "1.32.0")] @@ -394,7 +425,6 @@ impl NonNull<[T]> { /// See also [`slice::from_raw_parts`]. /// /// [valid]: crate::ptr#safety - /// [`pointer::offset`]: ../../std/primitive.pointer.html#method.offset #[inline] #[unstable(feature = "ptr_as_uninit", issue = "75402")] pub unsafe fn as_uninit_slice(&self) -> &[MaybeUninit] { @@ -439,7 +469,6 @@ impl NonNull<[T]> { /// See also [`slice::from_raw_parts_mut`]. /// /// [valid]: crate::ptr#safety - /// [`pointer::offset`]: ../../std/primitive.pointer.html#method.offset /// /// # Examples /// diff --git a/library/core/src/result.rs b/library/core/src/result.rs index a43ba5882e..2ce8a703c1 100644 --- a/library/core/src/result.rs +++ b/library/core/src/result.rs @@ -112,7 +112,7 @@ //! assert success with [`expect`]. This will panic if the //! write fails, providing a marginally useful message indicating why: //! -//! ```{.no_run} +//! ```no_run //! use std::fs::File; //! use std::io::prelude::*; //! @@ -122,7 +122,7 @@ //! //! You might also simply assert success: //! -//! ```{.no_run} +//! ```no_run //! # use std::fs::File; //! # use std::io::prelude::*; //! # let mut file = File::create("valuable_data.txt").unwrap(); @@ -984,7 +984,7 @@ impl Result { /// /// Basic usage: /// - /// ```{.should_panic} + /// ```should_panic /// let x: Result = Err("emergency failure"); /// x.expect("Testing expect"); // panics with `Testing expect: emergency failure` /// ``` @@ -1024,7 +1024,7 @@ impl Result { /// assert_eq!(x.unwrap(), 2); /// ``` /// - /// ```{.should_panic} + /// ```should_panic /// let x: Result = Err("emergency failure"); /// x.unwrap(); // panics with `emergency failure` /// ``` @@ -1052,7 +1052,7 @@ impl Result { /// /// Basic usage: /// - /// ```{.should_panic} + /// ```should_panic /// let x: Result = Ok(10); /// x.expect_err("Testing expect_err"); // panics with `Testing expect_err: 10` /// ``` @@ -1075,7 +1075,7 @@ impl Result { /// /// # Examples /// - /// ```{.should_panic} + /// ```should_panic /// let x: Result = Ok(2); /// x.unwrap_err(); // panics with `2` /// ``` @@ -1233,7 +1233,8 @@ impl Result, E> { /// ``` #[inline] #[stable(feature = "transpose_result", since = "1.33.0")] - pub fn transpose(self) -> Option> { + #[rustc_const_unstable(feature = "const_result", issue = "82814")] + pub const fn transpose(self) -> Option> { match self { Ok(Some(x)) => Some(Ok(x)), Ok(None) => None, @@ -1276,6 +1277,40 @@ impl Result, E> { } } +impl Result { + /// Returns the [`Ok`] value if `self` is `Ok`, and the [`Err`] value if + /// `self` is `Err`. + /// + /// In other words, this function returns the value (the `T`) of a + /// `Result`, regardless of whether or not that result is `Ok` or + /// `Err`. + /// + /// This can be useful in conjunction with APIs such as + /// [`Atomic*::compare_exchange`], or [`slice::binary_search`], but only in + /// cases where you don't care if the result was `Ok` or not. + /// + /// [`Atomic*::compare_exchange`]: crate::sync::atomic::AtomicBool::compare_exchange + /// + /// # Examples + /// + /// ``` + /// #![feature(result_into_ok_or_err)] + /// let ok: Result = Ok(3); + /// let err: Result = Err(4); + /// + /// assert_eq!(ok.into_ok_or_err(), 3); + /// assert_eq!(err.into_ok_or_err(), 4); + /// ``` + #[inline] + #[unstable(feature = "result_into_ok_or_err", reason = "newly added", issue = "82223")] + pub const fn into_ok_or_err(self) -> T { + match self { + Ok(v) => v, + Err(v) => v, + } + } +} + // This is a separate function to reduce the code size of the methods #[inline(never)] #[cold] diff --git a/library/core/src/slice/index.rs b/library/core/src/slice/index.rs index 660c8a2da5..c92b37b14b 100644 --- a/library/core/src/slice/index.rs +++ b/library/core/src/slice/index.rs @@ -37,28 +37,28 @@ fn slice_start_index_len_fail(index: usize, len: usize) -> ! { #[inline(never)] #[cold] #[track_caller] -pub(crate) fn slice_end_index_len_fail(index: usize, len: usize) -> ! { +fn slice_end_index_len_fail(index: usize, len: usize) -> ! { panic!("range end index {} out of range for slice of length {}", index, len); } #[inline(never)] #[cold] #[track_caller] -pub(crate) fn slice_index_order_fail(index: usize, end: usize) -> ! { +fn slice_index_order_fail(index: usize, end: usize) -> ! { panic!("slice index starts at {} but ends at {}", index, end); } #[inline(never)] #[cold] #[track_caller] -pub(crate) fn slice_start_index_overflow_fail() -> ! { +fn slice_start_index_overflow_fail() -> ! { panic!("attempted to index slice from after maximum usize"); } #[inline(never)] #[cold] #[track_caller] -pub(crate) fn slice_end_index_overflow_fail() -> ! { +fn slice_end_index_overflow_fail() -> ! { panic!("attempted to index slice up to maximum usize"); } @@ -449,3 +449,100 @@ unsafe impl SliceIndex<[T]> for ops::RangeToInclusive { (0..=self.end).index_mut(slice) } } + +/// Performs bounds-checking of a range. +/// +/// This method is similar to [`Index::index`] for slices, but it returns a +/// [`Range`] equivalent to `range`. You can use this method to turn any range +/// into `start` and `end` values. +/// +/// `bounds` is the range of the slice to use for bounds-checking. It should +/// be a [`RangeTo`] range that ends at the length of the slice. +/// +/// The returned [`Range`] is safe to pass to [`slice::get_unchecked`] and +/// [`slice::get_unchecked_mut`] for slices with the given range. +/// +/// [`Range`]: ops::Range +/// [`RangeTo`]: ops::RangeTo +/// [`slice::get_unchecked`]: slice::get_unchecked +/// [`slice::get_unchecked_mut`]: slice::get_unchecked_mut +/// +/// # Panics +/// +/// Panics if `range` would be out of bounds. +/// +/// # Examples +/// +/// ``` +/// #![feature(slice_range)] +/// +/// use std::slice; +/// +/// let v = [10, 40, 30]; +/// assert_eq!(1..2, slice::range(1..2, ..v.len())); +/// assert_eq!(0..2, slice::range(..2, ..v.len())); +/// assert_eq!(1..3, slice::range(1.., ..v.len())); +/// ``` +/// +/// Panics when [`Index::index`] would panic: +/// +/// ```should_panic +/// #![feature(slice_range)] +/// +/// use std::slice; +/// +/// slice::range(2..1, ..3); +/// ``` +/// +/// ```should_panic +/// #![feature(slice_range)] +/// +/// use std::slice; +/// +/// slice::range(1..4, ..3); +/// ``` +/// +/// ```should_panic +/// #![feature(slice_range)] +/// +/// use std::slice; +/// +/// slice::range(1..=usize::MAX, ..3); +/// ``` +/// +/// [`Index::index`]: ops::Index::index +#[track_caller] +#[unstable(feature = "slice_range", issue = "76393")] +pub fn range(range: R, bounds: ops::RangeTo) -> ops::Range +where + R: ops::RangeBounds, +{ + let len = bounds.end; + + let start: ops::Bound<&usize> = range.start_bound(); + let start = match start { + ops::Bound::Included(&start) => start, + ops::Bound::Excluded(start) => { + start.checked_add(1).unwrap_or_else(|| slice_start_index_overflow_fail()) + } + ops::Bound::Unbounded => 0, + }; + + let end: ops::Bound<&usize> = range.end_bound(); + let end = match end { + ops::Bound::Included(end) => { + end.checked_add(1).unwrap_or_else(|| slice_end_index_overflow_fail()) + } + ops::Bound::Excluded(&end) => end, + ops::Bound::Unbounded => len, + }; + + if start > end { + slice_index_order_fail(start, end); + } + if end > len { + slice_end_index_len_fail(end, len); + } + + ops::Range { start, end } +} diff --git a/library/core/src/slice/iter.rs b/library/core/src/slice/iter.rs index 50664267a6..c82b76df6f 100644 --- a/library/core/src/slice/iter.rs +++ b/library/core/src/slice/iter.rs @@ -60,8 +60,8 @@ fn size_from_ptr(_: *const T) -> usize { /// } /// ``` /// -/// [`iter`]: ../../std/primitive.slice.html#method.iter -/// [slices]: ../../std/primitive.slice.html +/// [`iter`]: slice::iter +/// [slices]: slice #[stable(feature = "rust1", since = "1.0.0")] pub struct Iter<'a, T: 'a> { ptr: NonNull, @@ -179,8 +179,8 @@ impl AsRef<[T]> for Iter<'_, T> { /// println!("{:?}", slice); /// ``` /// -/// [`iter_mut`]: ../../std/primitive.slice.html#method.iter_mut -/// [slices]: ../../std/primitive.slice.html +/// [`iter_mut`]: slice::iter_mut +/// [slices]: slice #[stable(feature = "rust1", since = "1.0.0")] pub struct IterMut<'a, T: 'a> { ptr: NonNull, @@ -328,16 +328,18 @@ pub(super) trait SplitIter: DoubleEndedIterator { /// let mut iter = slice.split(|num| num % 3 == 0); /// ``` /// -/// [`split`]: ../../std/primitive.slice.html#method.split -/// [slices]: ../../std/primitive.slice.html +/// [`split`]: slice::split +/// [slices]: slice #[stable(feature = "rust1", since = "1.0.0")] pub struct Split<'a, T: 'a, P> where P: FnMut(&T) -> bool, { - v: &'a [T], + // Used for `SplitWhitespace` and `SplitAsciiWhitespace` `as_str` methods + pub(crate) v: &'a [T], pred: P, - finished: bool, + // Used for `SplitAsciiWhitespace` `as_str` method + pub(crate) finished: bool, } impl<'a, T: 'a, P: FnMut(&T) -> bool> Split<'a, T, P> { @@ -450,8 +452,8 @@ impl FusedIterator for Split<'_, T, P> where P: FnMut(&T) -> bool {} /// let mut iter = slice.split_inclusive(|num| num % 3 == 0); /// ``` /// -/// [`split_inclusive`]: ../../std/primitive.slice.html#method.split_inclusive -/// [slices]: ../../std/primitive.slice.html +/// [`split_inclusive`]: slice::split_inclusive +/// [slices]: slice #[stable(feature = "split_inclusive", since = "1.51.0")] pub struct SplitInclusive<'a, T: 'a, P> where @@ -562,8 +564,8 @@ impl FusedIterator for SplitInclusive<'_, T, P> where P: FnMut(&T) -> bool /// let iter = v.split_mut(|num| *num % 3 == 0); /// ``` /// -/// [`split_mut`]: ../../std/primitive.slice.html#method.split_mut -/// [slices]: ../../std/primitive.slice.html +/// [`split_mut`]: slice::split_mut +/// [slices]: slice #[stable(feature = "rust1", since = "1.0.0")] pub struct SplitMut<'a, T: 'a, P> where @@ -691,8 +693,8 @@ impl FusedIterator for SplitMut<'_, T, P> where P: FnMut(&T) -> bool {} /// let iter = v.split_inclusive_mut(|num| *num % 3 == 0); /// ``` /// -/// [`split_inclusive_mut`]: ../../std/primitive.slice.html#method.split_inclusive_mut -/// [slices]: ../../std/primitive.slice.html +/// [`split_inclusive_mut`]: slice::split_inclusive_mut +/// [slices]: slice #[stable(feature = "split_inclusive", since = "1.51.0")] pub struct SplitInclusiveMut<'a, T: 'a, P> where @@ -812,8 +814,8 @@ impl FusedIterator for SplitInclusiveMut<'_, T, P> where P: FnMut(&T) -> b /// let iter = slice.rsplit(|num| *num == 0); /// ``` /// -/// [`rsplit`]: ../../std/primitive.slice.html#method.rsplit -/// [slices]: ../../std/primitive.slice.html +/// [`rsplit`]: slice::rsplit +/// [slices]: slice #[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> @@ -898,8 +900,8 @@ impl FusedIterator for RSplit<'_, T, P> where P: FnMut(&T) -> bool {} /// let iter = slice.rsplit_mut(|num| *num == 0); /// ``` /// -/// [`rsplit_mut`]: ../../std/primitive.slice.html#method.rsplit_mut -/// [slices]: ../../std/primitive.slice.html +/// [`rsplit_mut`]: slice::rsplit_mut +/// [slices]: slice #[stable(feature = "slice_rsplit", since = "1.27.0")] pub struct RSplitMut<'a, T: 'a, P> where @@ -1017,8 +1019,8 @@ impl> Iterator for GenericSplitN { /// let iter = slice.splitn(2, |num| *num % 3 == 0); /// ``` /// -/// [`splitn`]: ../../std/primitive.slice.html#method.splitn -/// [slices]: ../../std/primitive.slice.html +/// [`splitn`]: slice::splitn +/// [slices]: slice #[stable(feature = "rust1", since = "1.0.0")] pub struct SplitN<'a, T: 'a, P> where @@ -1057,8 +1059,8 @@ where /// let iter = slice.rsplitn(2, |num| *num % 3 == 0); /// ``` /// -/// [`rsplitn`]: ../../std/primitive.slice.html#method.rsplitn -/// [slices]: ../../std/primitive.slice.html +/// [`rsplitn`]: slice::rsplitn +/// [slices]: slice #[stable(feature = "rust1", since = "1.0.0")] pub struct RSplitN<'a, T: 'a, P> where @@ -1096,8 +1098,8 @@ where /// let iter = slice.splitn_mut(2, |num| *num % 3 == 0); /// ``` /// -/// [`splitn_mut`]: ../../std/primitive.slice.html#method.splitn_mut -/// [slices]: ../../std/primitive.slice.html +/// [`splitn_mut`]: slice::splitn_mut +/// [slices]: slice #[stable(feature = "rust1", since = "1.0.0")] pub struct SplitNMut<'a, T: 'a, P> where @@ -1136,8 +1138,8 @@ where /// let iter = slice.rsplitn_mut(2, |num| *num % 3 == 0); /// ``` /// -/// [`rsplitn_mut`]: ../../std/primitive.slice.html#method.rsplitn_mut -/// [slices]: ../../std/primitive.slice.html +/// [`rsplitn_mut`]: slice::rsplitn_mut +/// [slices]: slice #[stable(feature = "rust1", since = "1.0.0")] pub struct RSplitNMut<'a, T: 'a, P> where @@ -1179,8 +1181,8 @@ forward_iterator! { RSplitNMut: T, &'a mut [T] } /// let iter = slice.windows(2); /// ``` /// -/// [`windows`]: ../../std/primitive.slice.html#method.windows -/// [slices]: ../../std/primitive.slice.html +/// [`windows`]: slice::windows +/// [slices]: slice #[derive(Debug)] #[stable(feature = "rust1", since = "1.0.0")] pub struct Windows<'a, T: 'a> { @@ -1305,9 +1307,7 @@ impl FusedIterator for Windows<'_, T> {} #[doc(hidden)] #[unstable(feature = "trusted_random_access", issue = "none")] unsafe impl<'a, T> TrustedRandomAccess for Windows<'a, T> { - fn may_have_side_effect() -> bool { - false - } + const MAY_HAVE_SIDE_EFFECT: bool = false; } /// An iterator over a slice in (non-overlapping) chunks (`chunk_size` elements at a @@ -1325,8 +1325,8 @@ unsafe impl<'a, T> TrustedRandomAccess for Windows<'a, T> { /// let iter = slice.chunks(2); /// ``` /// -/// [`chunks`]: ../../std/primitive.slice.html#method.chunks -/// [slices]: ../../std/primitive.slice.html +/// [`chunks`]: slice::chunks +/// [slices]: slice #[derive(Debug)] #[stable(feature = "rust1", since = "1.0.0")] pub struct Chunks<'a, T: 'a> { @@ -1473,9 +1473,7 @@ impl FusedIterator for Chunks<'_, T> {} #[doc(hidden)] #[unstable(feature = "trusted_random_access", issue = "none")] unsafe impl<'a, T> TrustedRandomAccess for Chunks<'a, T> { - fn may_have_side_effect() -> bool { - false - } + const MAY_HAVE_SIDE_EFFECT: bool = false; } /// An iterator over a slice in (non-overlapping) mutable chunks (`chunk_size` @@ -1493,8 +1491,8 @@ unsafe impl<'a, T> TrustedRandomAccess for Chunks<'a, T> { /// let iter = slice.chunks_mut(2); /// ``` /// -/// [`chunks_mut`]: ../../std/primitive.slice.html#method.chunks_mut -/// [slices]: ../../std/primitive.slice.html +/// [`chunks_mut`]: slice::chunks_mut +/// [slices]: slice #[derive(Debug)] #[stable(feature = "rust1", since = "1.0.0")] pub struct ChunksMut<'a, T: 'a> { @@ -1638,9 +1636,7 @@ impl FusedIterator for ChunksMut<'_, T> {} #[doc(hidden)] #[unstable(feature = "trusted_random_access", issue = "none")] unsafe impl<'a, T> TrustedRandomAccess for ChunksMut<'a, T> { - fn may_have_side_effect() -> bool { - false - } + const MAY_HAVE_SIDE_EFFECT: bool = false; } /// An iterator over a slice in (non-overlapping) chunks (`chunk_size` elements at a @@ -1659,9 +1655,9 @@ unsafe impl<'a, T> TrustedRandomAccess for ChunksMut<'a, T> { /// let iter = slice.chunks_exact(2); /// ``` /// -/// [`chunks_exact`]: ../../std/primitive.slice.html#method.chunks_exact +/// [`chunks_exact`]: slice::chunks_exact /// [`remainder`]: ChunksExact::remainder -/// [slices]: ../../std/primitive.slice.html +/// [slices]: slice #[derive(Debug)] #[stable(feature = "chunks_exact", since = "1.31.0")] pub struct ChunksExact<'a, T: 'a> { @@ -1794,9 +1790,7 @@ impl FusedIterator for ChunksExact<'_, T> {} #[doc(hidden)] #[unstable(feature = "trusted_random_access", issue = "none")] unsafe impl<'a, T> TrustedRandomAccess for ChunksExact<'a, T> { - fn may_have_side_effect() -> bool { - false - } + const MAY_HAVE_SIDE_EFFECT: bool = false; } /// An iterator over a slice in (non-overlapping) mutable chunks (`chunk_size` @@ -1815,9 +1809,9 @@ unsafe impl<'a, T> TrustedRandomAccess for ChunksExact<'a, T> { /// let iter = slice.chunks_exact_mut(2); /// ``` /// -/// [`chunks_exact_mut`]: ../../std/primitive.slice.html#method.chunks_exact_mut +/// [`chunks_exact_mut`]: slice::chunks_exact_mut /// [`into_remainder`]: ChunksExactMut::into_remainder -/// [slices]: ../../std/primitive.slice.html +/// [slices]: slice #[derive(Debug)] #[stable(feature = "chunks_exact", since = "1.31.0")] pub struct ChunksExactMut<'a, T: 'a> { @@ -1947,9 +1941,7 @@ impl FusedIterator for ChunksExactMut<'_, T> {} #[doc(hidden)] #[unstable(feature = "trusted_random_access", issue = "none")] unsafe impl<'a, T> TrustedRandomAccess for ChunksExactMut<'a, T> { - fn may_have_side_effect() -> bool { - false - } + const MAY_HAVE_SIDE_EFFECT: bool = false; } /// A windowed iterator over a slice in overlapping chunks (`N` elements at a @@ -1966,8 +1958,8 @@ unsafe impl<'a, T> TrustedRandomAccess for ChunksExactMut<'a, T> { /// let iter = slice.array_windows::<2>(); /// ``` /// -/// [`array_windows`]: ../../std/primitive.slice.html#method.array_windows -/// [slices]: ../../std/primitive.slice.html +/// [`array_windows`]: slice::array_windows +/// [slices]: slice #[derive(Debug, Clone, Copy)] #[unstable(feature = "array_windows", issue = "75027")] pub struct ArrayWindows<'a, T: 'a, const N: usize> { @@ -2087,9 +2079,9 @@ impl ExactSizeIterator for ArrayWindows<'_, T, N> { /// let iter = slice.array_chunks::<2>(); /// ``` /// -/// [`array_chunks`]: ../../std/primitive.slice.html#method.array_chunks +/// [`array_chunks`]: slice::array_chunks /// [`remainder`]: ArrayChunks::remainder -/// [slices]: ../../std/primitive.slice.html +/// [slices]: slice #[derive(Debug)] #[unstable(feature = "array_chunks", issue = "74985")] pub struct ArrayChunks<'a, T: 'a, const N: usize> { @@ -2186,9 +2178,7 @@ impl FusedIterator for ArrayChunks<'_, T, N> {} #[doc(hidden)] #[unstable(feature = "array_chunks", issue = "74985")] unsafe impl<'a, T, const N: usize> TrustedRandomAccess for ArrayChunks<'a, T, N> { - fn may_have_side_effect() -> bool { - false - } + const MAY_HAVE_SIDE_EFFECT: bool = false; } /// An iterator over a slice in (non-overlapping) mutable chunks (`N` elements @@ -2209,9 +2199,9 @@ unsafe impl<'a, T, const N: usize> TrustedRandomAccess for ArrayChunks<'a, T, N> /// let iter = slice.array_chunks_mut::<2>(); /// ``` /// -/// [`array_chunks_mut`]: ../../std/primitive.slice.html#method.array_chunks_mut +/// [`array_chunks_mut`]: slice::array_chunks_mut /// [`into_remainder`]: ../../std/slice/struct.ArrayChunksMut.html#method.into_remainder -/// [slices]: ../../std/primitive.slice.html +/// [slices]: slice #[derive(Debug)] #[unstable(feature = "array_chunks", issue = "74985")] pub struct ArrayChunksMut<'a, T: 'a, const N: usize> { @@ -2300,9 +2290,7 @@ impl FusedIterator for ArrayChunksMut<'_, T, N> {} #[doc(hidden)] #[unstable(feature = "array_chunks", issue = "74985")] unsafe impl<'a, T, const N: usize> TrustedRandomAccess for ArrayChunksMut<'a, T, N> { - fn may_have_side_effect() -> bool { - false - } + const MAY_HAVE_SIDE_EFFECT: bool = false; } /// An iterator over a slice in (non-overlapping) chunks (`chunk_size` elements at a @@ -2320,8 +2308,8 @@ unsafe impl<'a, T, const N: usize> TrustedRandomAccess for ArrayChunksMut<'a, T, /// let iter = slice.rchunks(2); /// ``` /// -/// [`rchunks`]: ../../std/primitive.slice.html#method.rchunks -/// [slices]: ../../std/primitive.slice.html +/// [`rchunks`]: slice::rchunks +/// [slices]: slice #[derive(Debug)] #[stable(feature = "rchunks", since = "1.31.0")] pub struct RChunks<'a, T: 'a> { @@ -2464,9 +2452,7 @@ impl FusedIterator for RChunks<'_, T> {} #[doc(hidden)] #[unstable(feature = "trusted_random_access", issue = "none")] unsafe impl<'a, T> TrustedRandomAccess for RChunks<'a, T> { - fn may_have_side_effect() -> bool { - false - } + const MAY_HAVE_SIDE_EFFECT: bool = false; } /// An iterator over a slice in (non-overlapping) mutable chunks (`chunk_size` @@ -2484,8 +2470,8 @@ unsafe impl<'a, T> TrustedRandomAccess for RChunks<'a, T> { /// let iter = slice.rchunks_mut(2); /// ``` /// -/// [`rchunks_mut`]: ../../std/primitive.slice.html#method.rchunks_mut -/// [slices]: ../../std/primitive.slice.html +/// [`rchunks_mut`]: slice::rchunks_mut +/// [slices]: slice #[derive(Debug)] #[stable(feature = "rchunks", since = "1.31.0")] pub struct RChunksMut<'a, T: 'a> { @@ -2627,9 +2613,7 @@ impl FusedIterator for RChunksMut<'_, T> {} #[doc(hidden)] #[unstable(feature = "trusted_random_access", issue = "none")] unsafe impl<'a, T> TrustedRandomAccess for RChunksMut<'a, T> { - fn may_have_side_effect() -> bool { - false - } + const MAY_HAVE_SIDE_EFFECT: bool = false; } /// An iterator over a slice in (non-overlapping) chunks (`chunk_size` elements at a @@ -2648,9 +2632,9 @@ unsafe impl<'a, T> TrustedRandomAccess for RChunksMut<'a, T> { /// let iter = slice.rchunks_exact(2); /// ``` /// -/// [`rchunks_exact`]: ../../std/primitive.slice.html#method.rchunks_exact +/// [`rchunks_exact`]: slice::rchunks_exact /// [`remainder`]: ChunksExact::remainder -/// [slices]: ../../std/primitive.slice.html +/// [slices]: slice #[derive(Debug)] #[stable(feature = "rchunks", since = "1.31.0")] pub struct RChunksExact<'a, T: 'a> { @@ -2787,9 +2771,7 @@ impl FusedIterator for RChunksExact<'_, T> {} #[doc(hidden)] #[unstable(feature = "trusted_random_access", issue = "none")] unsafe impl<'a, T> TrustedRandomAccess for RChunksExact<'a, T> { - fn may_have_side_effect() -> bool { - false - } + const MAY_HAVE_SIDE_EFFECT: bool = false; } /// An iterator over a slice in (non-overlapping) mutable chunks (`chunk_size` @@ -2808,9 +2790,9 @@ unsafe impl<'a, T> TrustedRandomAccess for RChunksExact<'a, T> { /// let iter = slice.rchunks_exact_mut(2); /// ``` /// -/// [`rchunks_exact_mut`]: ../../std/primitive.slice.html#method.rchunks_exact_mut +/// [`rchunks_exact_mut`]: slice::rchunks_exact_mut /// [`into_remainder`]: ChunksExactMut::into_remainder -/// [slices]: ../../std/primitive.slice.html +/// [slices]: slice #[derive(Debug)] #[stable(feature = "rchunks", since = "1.31.0")] pub struct RChunksExactMut<'a, T: 'a> { @@ -2944,33 +2926,27 @@ impl FusedIterator for RChunksExactMut<'_, T> {} #[doc(hidden)] #[unstable(feature = "trusted_random_access", issue = "none")] unsafe impl<'a, T> TrustedRandomAccess for RChunksExactMut<'a, T> { - fn may_have_side_effect() -> bool { - false - } + const MAY_HAVE_SIDE_EFFECT: bool = false; } #[doc(hidden)] #[unstable(feature = "trusted_random_access", issue = "none")] unsafe impl<'a, T> TrustedRandomAccess for Iter<'a, T> { - fn may_have_side_effect() -> bool { - false - } + const MAY_HAVE_SIDE_EFFECT: bool = false; } #[doc(hidden)] #[unstable(feature = "trusted_random_access", issue = "none")] unsafe impl<'a, T> TrustedRandomAccess for IterMut<'a, T> { - fn may_have_side_effect() -> bool { - false - } + const MAY_HAVE_SIDE_EFFECT: bool = false; } /// An iterator over slice in (non-overlapping) chunks separated by a predicate. /// /// This struct is created by the [`group_by`] method on [slices]. /// -/// [`group_by`]: ../../std/primitive.slice.html#method.group_by -/// [slices]: ../../std/primitive.slice.html +/// [`group_by`]: slice::group_by +/// [slices]: slice #[unstable(feature = "slice_group_by", issue = "80552")] pub struct GroupBy<'a, T: 'a, P> { slice: &'a [T], @@ -3055,8 +3031,8 @@ impl<'a, T: 'a + fmt::Debug, P> fmt::Debug for GroupBy<'a, T, P> { /// /// This struct is created by the [`group_by_mut`] method on [slices]. /// -/// [`group_by_mut`]: ../../std/primitive.slice.html#method.group_by_mut -/// [slices]: ../../std/primitive.slice.html +/// [`group_by_mut`]: slice::group_by_mut +/// [slices]: slice #[unstable(feature = "slice_group_by", issue = "80552")] pub struct GroupByMut<'a, T: 'a, P> { slice: &'a mut [T], diff --git a/library/core/src/slice/mod.rs b/library/core/src/slice/mod.rs index 19a3b45e56..417a106b99 100644 --- a/library/core/src/slice/mod.rs +++ b/library/core/src/slice/mod.rs @@ -8,7 +8,7 @@ #![stable(feature = "rust1", since = "1.0.0")] -use crate::cmp::Ordering::{self, Equal, Greater, Less}; +use crate::cmp::Ordering::{self, Greater, Less}; use crate::marker::Copy; use crate::mem; use crate::num::NonZeroUsize; @@ -18,6 +18,7 @@ use crate::option::Option::{None, Some}; use crate::ptr; use crate::result::Result; use crate::result::Result::{Err, Ok}; +use crate::slice; #[unstable( feature = "slice_internals", @@ -29,11 +30,12 @@ pub mod memchr; mod ascii; mod cmp; -pub(crate) mod index; +mod index; mod iter; mod raw; mod rotate; mod sort; +mod specialize; #[stable(feature = "rust1", since = "1.0.0")] pub use iter::{Chunks, ChunksMut, Windows}; @@ -76,6 +78,9 @@ pub use sort::heapsort; #[stable(feature = "slice_get_slice", since = "1.28.0")] pub use index::SliceIndex; +#[unstable(feature = "slice_range", issue = "76393")] +pub use index::range; + #[lang = "slice"] #[cfg(not(test))] impl [T] { @@ -94,9 +99,23 @@ impl [T] { // SAFETY: const sound because we transmute out the length field as a usize (which it must be) #[rustc_allow_const_fn_unstable(const_fn_union)] pub const fn len(&self) -> usize { - // SAFETY: this is safe because `&[T]` and `FatPtr` have the same layout. - // Only `std` can make this guarantee. - unsafe { crate::ptr::Repr { rust: self }.raw.len } + #[cfg(bootstrap)] + { + // SAFETY: this is safe because `&[T]` and `FatPtr` have the same layout. + // Only `std` can make this guarantee. + unsafe { crate::ptr::Repr { rust: self }.raw.len } + } + #[cfg(not(bootstrap))] + { + // FIXME: Replace with `crate::ptr::metadata(self)` when that is const-stable. + // As of this writing this causes a "Const-stable functions can only call other + // const-stable functions" error. + + // SAFETY: Accessing the value from the `PtrRepr` union is safe since *const T + // and PtrComponents have the same memory layouts. Only std can make this + // guarantee. + unsafe { crate::ptr::PtrRepr { const_ptr: self }.components.metadata } + } } /// Returns `true` if the slice has a length of 0. @@ -289,7 +308,7 @@ impl [T] { /// Returns a mutable reference to an element or subslice depending on the /// type of index (see [`get`]) or `None` if the index is out of bounds. /// - /// [`get`]: #method.get + /// [`get`]: slice::get /// /// # Examples /// @@ -320,7 +339,7 @@ impl [T] { /// Calling this method with an out-of-bounds index is *[undefined behavior]* /// even if the resulting reference is not used. /// - /// [`get`]: #method.get + /// [`get`]: slice::get /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html /// /// # Examples @@ -354,7 +373,7 @@ impl [T] { /// Calling this method with an out-of-bounds index is *[undefined behavior]* /// even if the resulting reference is not used. /// - /// [`get_mut`]: #method.get_mut + /// [`get_mut`]: slice::get_mut /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html /// /// # Examples @@ -405,7 +424,7 @@ impl [T] { /// } /// ``` /// - /// [`as_mut_ptr`]: #method.as_mut_ptr + /// [`as_mut_ptr`]: slice::as_mut_ptr #[stable(feature = "rust1", since = "1.0.0")] #[rustc_const_stable(feature = "const_slice_as_ptr", since = "1.32.0")] #[inline] @@ -468,7 +487,7 @@ impl [T] { /// assert!(!a.as_ptr_range().contains(&y)); /// ``` /// - /// [`as_ptr`]: #method.as_ptr + /// [`as_ptr`]: slice::as_ptr #[stable(feature = "slice_ptr_range", since = "1.48.0")] #[rustc_const_unstable(feature = "const_ptr_offset", issue = "71499")] #[inline] @@ -510,7 +529,7 @@ impl [T] { /// use two pointers to refer to a range of elements in memory, as is /// common in C++. /// - /// [`as_mut_ptr`]: #method.as_mut_ptr + /// [`as_mut_ptr`]: slice::as_mut_ptr #[stable(feature = "slice_ptr_range", since = "1.48.0")] #[rustc_const_unstable(feature = "const_ptr_offset", issue = "71499")] #[inline] @@ -761,8 +780,8 @@ impl [T] { /// assert!(iter.next().is_none()); /// ``` /// - /// [`chunks_exact`]: #method.chunks_exact - /// [`rchunks`]: #method.rchunks + /// [`chunks_exact`]: slice::chunks_exact + /// [`rchunks`]: slice::rchunks #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn chunks(&self, chunk_size: usize) -> Chunks<'_, T> { @@ -799,8 +818,8 @@ impl [T] { /// assert_eq!(v, &[1, 1, 2, 2, 3]); /// ``` /// - /// [`chunks_exact_mut`]: #method.chunks_exact_mut - /// [`rchunks_mut`]: #method.rchunks_mut + /// [`chunks_exact_mut`]: slice::chunks_exact_mut + /// [`rchunks_mut`]: slice::rchunks_mut #[stable(feature = "rust1", since = "1.0.0")] #[inline] pub fn chunks_mut(&mut self, chunk_size: usize) -> ChunksMut<'_, T> { @@ -836,8 +855,8 @@ impl [T] { /// assert_eq!(iter.remainder(), &['m']); /// ``` /// - /// [`chunks`]: #method.chunks - /// [`rchunks_exact`]: #method.rchunks_exact + /// [`chunks`]: slice::chunks + /// [`rchunks_exact`]: slice::rchunks_exact #[stable(feature = "chunks_exact", since = "1.31.0")] #[inline] pub fn chunks_exact(&self, chunk_size: usize) -> ChunksExact<'_, T> { @@ -878,8 +897,8 @@ impl [T] { /// assert_eq!(v, &[1, 1, 2, 2, 0]); /// ``` /// - /// [`chunks_mut`]: #method.chunks_mut - /// [`rchunks_exact_mut`]: #method.rchunks_exact_mut + /// [`chunks_mut`]: slice::chunks_mut + /// [`rchunks_exact_mut`]: slice::rchunks_exact_mut #[stable(feature = "chunks_exact", since = "1.31.0")] #[inline] pub fn chunks_exact_mut(&mut self, chunk_size: usize) -> ChunksExactMut<'_, T> { @@ -1013,7 +1032,7 @@ impl [T] { /// assert_eq!(iter.remainder(), &['m']); /// ``` /// - /// [`chunks_exact`]: #method.chunks_exact + /// [`chunks_exact`]: slice::chunks_exact #[unstable(feature = "array_chunks", issue = "74985")] #[inline] pub fn array_chunks(&self) -> ArrayChunks<'_, T, N> { @@ -1163,7 +1182,7 @@ impl [T] { /// assert_eq!(v, &[1, 1, 2, 2, 0]); /// ``` /// - /// [`chunks_exact_mut`]: #method.chunks_exact_mut + /// [`chunks_exact_mut`]: slice::chunks_exact_mut #[unstable(feature = "array_chunks", issue = "74985")] #[inline] pub fn array_chunks_mut(&mut self) -> ArrayChunksMut<'_, T, N> { @@ -1195,7 +1214,7 @@ impl [T] { /// assert!(iter.next().is_none()); /// ``` /// - /// [`windows`]: #method.windows + /// [`windows`]: slice::windows #[unstable(feature = "array_windows", issue = "75027")] #[inline] pub fn array_windows(&self) -> ArrayWindows<'_, T, N> { @@ -1228,8 +1247,8 @@ impl [T] { /// assert!(iter.next().is_none()); /// ``` /// - /// [`rchunks_exact`]: #method.rchunks_exact - /// [`chunks`]: #method.chunks + /// [`rchunks_exact`]: slice::rchunks_exact + /// [`chunks`]: slice::chunks #[stable(feature = "rchunks", since = "1.31.0")] #[inline] pub fn rchunks(&self, chunk_size: usize) -> RChunks<'_, T> { @@ -1266,8 +1285,8 @@ impl [T] { /// assert_eq!(v, &[3, 2, 2, 1, 1]); /// ``` /// - /// [`rchunks_exact_mut`]: #method.rchunks_exact_mut - /// [`chunks_mut`]: #method.chunks_mut + /// [`rchunks_exact_mut`]: slice::rchunks_exact_mut + /// [`chunks_mut`]: slice::chunks_mut #[stable(feature = "rchunks", since = "1.31.0")] #[inline] pub fn rchunks_mut(&mut self, chunk_size: usize) -> RChunksMut<'_, T> { @@ -1304,9 +1323,9 @@ impl [T] { /// assert_eq!(iter.remainder(), &['l']); /// ``` /// - /// [`chunks`]: #method.chunks - /// [`rchunks`]: #method.rchunks - /// [`chunks_exact`]: #method.chunks_exact + /// [`chunks`]: slice::chunks + /// [`rchunks`]: slice::rchunks + /// [`chunks_exact`]: slice::chunks_exact #[stable(feature = "rchunks", since = "1.31.0")] #[inline] pub fn rchunks_exact(&self, chunk_size: usize) -> RChunksExact<'_, T> { @@ -1347,9 +1366,9 @@ impl [T] { /// assert_eq!(v, &[0, 2, 2, 1, 1]); /// ``` /// - /// [`chunks_mut`]: #method.chunks_mut - /// [`rchunks_mut`]: #method.rchunks_mut - /// [`chunks_exact_mut`]: #method.chunks_exact_mut + /// [`chunks_mut`]: slice::chunks_mut + /// [`rchunks_mut`]: slice::rchunks_mut + /// [`chunks_exact_mut`]: slice::chunks_exact_mut #[stable(feature = "rchunks", since = "1.31.0")] #[inline] pub fn rchunks_exact_mut(&mut self, chunk_size: usize) -> RChunksExactMut<'_, T> { @@ -1533,7 +1552,7 @@ impl [T] { /// even if the resulting reference is not used. The caller has to ensure that /// `0 <= mid <= self.len()`. /// - /// [`split_at`]: #method.split_at + /// [`split_at`]: slice::split_at /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html /// /// # Examples @@ -1582,7 +1601,7 @@ impl [T] { /// even if the resulting reference is not used. The caller has to ensure that /// `0 <= mid <= self.len()`. /// - /// [`split_at_mut`]: #method.split_at_mut + /// [`split_at_mut`]: slice::split_at_mut /// [undefined behavior]: https://doc.rust-lang.org/reference/behavior-considered-undefined.html /// /// # Examples @@ -2082,6 +2101,12 @@ impl [T] { /// [`Result::Err`] is returned, containing the index where a matching /// element could be inserted while maintaining sorted order. /// + /// See also [`binary_search_by`], [`binary_search_by_key`], and [`partition_point`]. + /// + /// [`binary_search_by`]: slice::binary_search_by + /// [`binary_search_by_key`]: slice::binary_search_by_key + /// [`partition_point`]: slice::partition_point + /// /// # Examples /// /// Looks up a series of four elements. The first is found, with a @@ -2129,6 +2154,12 @@ impl [T] { /// [`Result::Err`] is returned, containing the index where a matching /// element could be inserted while maintaining sorted order. /// + /// See also [`binary_search`], [`binary_search_by_key`], and [`partition_point`]. + /// + /// [`binary_search`]: slice::binary_search + /// [`binary_search_by_key`]: slice::binary_search_by_key + /// [`partition_point`]: slice::partition_point + /// /// # Examples /// /// Looks up a series of four elements. The first is found, with a @@ -2154,25 +2185,31 @@ impl [T] { where F: FnMut(&'a T) -> Ordering, { - let s = self; - let mut size = s.len(); - if size == 0 { - return Err(0); - } - let mut base = 0usize; - while size > 1 { - let half = size / 2; - let mid = base + half; - // SAFETY: the call is made safe by the following inconstants: - // - `mid >= 0`: by definition - // - `mid < size`: `mid = size / 2 + size / 4 + size / 8 ...` - let cmp = f(unsafe { s.get_unchecked(mid) }); - base = if cmp == Greater { base } else { mid }; - size -= half; + let mut size = self.len(); + let mut left = 0; + let mut right = size; + while left < right { + let mid = left + size / 2; + + // SAFETY: the call is made safe by the following invariants: + // - `mid >= 0` + // - `mid < size`: `mid` is limited by `[left; right)` bound. + let cmp = f(unsafe { self.get_unchecked(mid) }); + + // The reason why we use if/else control flow rather than match + // is because match reorders comparison operations, which is perf sensitive. + // This is x86 asm for u8: https://rust.godbolt.org/z/8Y8Pra. + if cmp == Less { + left = mid + 1; + } else if cmp == Greater { + right = mid; + } else { + return Ok(mid); + } + + size = right - left; } - // SAFETY: 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) } + Err(left) } /// Binary searches this sorted slice with a key extraction function. @@ -2186,7 +2223,12 @@ impl [T] { /// [`Result::Err`] is returned, containing the index where a matching /// element could be inserted while maintaining sorted order. /// - /// [`sort_by_key`]: #method.sort_by_key + /// See also [`binary_search`], [`binary_search_by`], and [`partition_point`]. + /// + /// [`sort_by_key`]: slice::sort_by_key + /// [`binary_search`]: slice::binary_search + /// [`binary_search_by`]: slice::binary_search_by + /// [`partition_point`]: slice::partition_point /// /// # Examples /// @@ -2206,6 +2248,12 @@ impl [T] { /// let r = s.binary_search_by_key(&1, |&(a, b)| b); /// assert!(match r { Ok(1..=4) => true, _ => false, }); /// ``` + // Lint rustdoc::broken_intra_doc_links is allowed as `slice::sort_by_key` is + // in crate `alloc`, and as such doesn't exists yet when building `core`. + // links to downstream crate: #74481. Since primitives are only documented in + // libstd (#73423), this never leads to broken links in practice. + #[cfg_attr(not(bootstrap), allow(rustdoc::broken_intra_doc_links))] + #[cfg_attr(bootstrap, allow(broken_intra_doc_links))] #[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 @@ -2404,7 +2452,7 @@ impl [T] { /// The current algorithm is based on the quickselect portion of the same quicksort algorithm /// used for [`sort_unstable`]. /// - /// [`sort_unstable`]: #method.sort_unstable + /// [`sort_unstable`]: slice::sort_unstable /// /// # Panics /// @@ -2452,7 +2500,7 @@ impl [T] { /// The current algorithm is based on the quickselect portion of the same quicksort algorithm /// used for [`sort_unstable`]. /// - /// [`sort_unstable`]: #method.sort_unstable + /// [`sort_unstable`]: slice::sort_unstable /// /// # Panics /// @@ -2504,7 +2552,7 @@ impl [T] { /// The current algorithm is based on the quickselect portion of the same quicksort algorithm /// used for [`sort_unstable`]. /// - /// [`sort_unstable`]: #method.sort_unstable + /// [`sort_unstable`]: slice::sort_unstable /// /// # Panics /// @@ -2831,13 +2879,7 @@ impl [T] { where T: Clone, { - if let Some((last, elems)) = self.split_last_mut() { - for el in elems { - el.clone_from(&value); - } - - *last = value - } + specialize::SpecFill::spec_fill(self, value); } /// Fills `self` with elements returned by calling a closure repeatedly. @@ -2847,7 +2889,7 @@ impl [T] { /// trait to generate values, you can pass [`Default::default`] as the /// argument. /// - /// [`fill`]: #method.fill + /// [`fill`]: slice::fill /// /// # Examples /// @@ -2920,22 +2962,14 @@ impl [T] { /// assert_eq!(slice, [4, 5, 3, 4, 5]); /// ``` /// - /// [`copy_from_slice`]: #method.copy_from_slice - /// [`split_at_mut`]: #method.split_at_mut + /// [`copy_from_slice`]: slice::copy_from_slice + /// [`split_at_mut`]: slice::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"); - // 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). - let len = self.len(); - let src = &src[..len]; - for i in 0..len { - self[i].clone_from(&src[i]); - } + self.spec_clone_from(src); } /// Copies all elements from `src` into `self`, using a memcpy. @@ -2990,8 +3024,8 @@ impl [T] { /// assert_eq!(slice, [4, 5, 3, 4, 5]); /// ``` /// - /// [`clone_from_slice`]: #method.clone_from_slice - /// [`split_at_mut`]: #method.split_at_mut + /// [`clone_from_slice`]: slice::clone_from_slice + /// [`split_at_mut`]: slice::split_at_mut #[doc(alias = "memcpy")] #[stable(feature = "copy_from_slice", since = "1.9.0")] pub fn copy_from_slice(&mut self, src: &[T]) @@ -3052,7 +3086,7 @@ impl [T] { where T: Copy, { - let Range { start: src_start, end: src_end } = src.assert_len(self.len()); + let Range { start: src_start, end: src_end } = slice::range(src, ..self.len()); let count = src_end - src_start; assert!(dest <= self.len() - count, "dest is out of bounds"); // SAFETY: the conditions for `ptr::copy` have all been checked above, @@ -3108,7 +3142,7 @@ impl [T] { /// assert_eq!(slice, [4, 5, 3, 1, 2]); /// ``` /// - /// [`split_at_mut`]: #method.split_at_mut + /// [`split_at_mut`]: slice::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"); @@ -3352,7 +3386,7 @@ impl [T] { /// function to determine the ordering of two elements. Apart from that, it's equivalent to /// [`is_sorted`]; see its documentation for more information. /// - /// [`is_sorted`]: #method.is_sorted + /// [`is_sorted`]: slice::is_sorted #[unstable(feature = "is_sorted", reason = "new API", issue = "53485")] pub fn is_sorted_by(&self, mut compare: F) -> bool where @@ -3367,7 +3401,7 @@ impl [T] { /// elements, as determined by `f`. Apart from that, it's equivalent to [`is_sorted`]; see its /// documentation for more information. /// - /// [`is_sorted`]: #method.is_sorted + /// [`is_sorted`]: slice::is_sorted /// /// # Examples /// @@ -3399,11 +3433,15 @@ impl [T] { /// If this slice is not partitioned, the returned result is unspecified and meaningless, /// as this method performs a kind of binary search. /// + /// See also [`binary_search`], [`binary_search_by`], and [`binary_search_by_key`]. + /// + /// [`binary_search`]: slice::binary_search + /// [`binary_search_by`]: slice::binary_search_by + /// [`binary_search_by_key`]: slice::binary_search_by_key + /// /// # Examples /// /// ``` - /// #![feature(partition_point)] - /// /// let v = [1, 2, 3, 3, 5, 6, 7]; /// let i = v.partition_point(|&x| x < 5); /// @@ -3411,7 +3449,7 @@ impl [T] { /// assert!(v[..i].iter().all(|&x| x < 5)); /// assert!(v[i..].iter().all(|&x| !(x < 5))); /// ``` - #[unstable(feature = "partition_point", reason = "new API", issue = "73831")] + #[stable(feature = "partition_point", since = "1.52.0")] pub fn partition_point

(&self, mut pred: P) -> usize where P: FnMut(&T) -> bool, @@ -3440,6 +3478,36 @@ impl [T] { } } +trait CloneFromSpec { + fn spec_clone_from(&mut self, src: &[T]); +} + +impl CloneFromSpec for [T] +where + T: Clone, +{ + default fn spec_clone_from(&mut self, src: &[T]) { + assert!(self.len() == src.len(), "destination and source slices have different lengths"); + // NOTE: We need to explicitly slice them to the same length + // to make it easier for the optimizer to elide bounds checking. + // But since it can't be relied on we also have an explicit specialization for T: Copy. + let len = self.len(); + let src = &src[..len]; + for i in 0..len { + self[i].clone_from(&src[i]); + } + } +} + +impl CloneFromSpec for [T] +where + T: Copy, +{ + fn spec_clone_from(&mut self, src: &[T]) { + self.copy_from_slice(src); + } +} + #[stable(feature = "rust1", since = "1.0.0")] impl Default for &[T] { /// Creates an empty slice. diff --git a/library/core/src/slice/raw.rs b/library/core/src/slice/raw.rs index 117db6e3e3..eda50dc287 100644 --- a/library/core/src/slice/raw.rs +++ b/library/core/src/slice/raw.rs @@ -83,7 +83,6 @@ use crate::ptr; /// /// [valid]: ptr#safety /// [`NonNull::dangling()`]: ptr::NonNull::dangling -/// [`pointer::offset`]: ../../std/primitive.pointer.html#method.offset #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub unsafe fn from_raw_parts<'a, T>(data: *const T, len: usize) -> &'a [T] { @@ -125,7 +124,6 @@ pub unsafe fn from_raw_parts<'a, T>(data: *const T, len: usize) -> &'a [T] { /// /// [valid]: ptr#safety /// [`NonNull::dangling()`]: ptr::NonNull::dangling -/// [`pointer::offset`]: ../../std/primitive.pointer.html#method.offset #[inline] #[stable(feature = "rust1", since = "1.0.0")] pub unsafe fn from_raw_parts_mut<'a, T>(data: *mut T, len: usize) -> &'a mut [T] { diff --git a/library/core/src/slice/specialize.rs b/library/core/src/slice/specialize.rs new file mode 100644 index 0000000000..16a9588989 --- /dev/null +++ b/library/core/src/slice/specialize.rs @@ -0,0 +1,58 @@ +use crate::ptr::write_bytes; + +pub(super) trait SpecFill { + fn spec_fill(&mut self, value: T); +} + +impl SpecFill for [T] { + default fn spec_fill(&mut self, value: T) { + if let Some((last, elems)) = self.split_last_mut() { + for el in elems { + el.clone_from(&value); + } + + *last = value + } + } +} + +impl SpecFill for [T] { + default fn spec_fill(&mut self, value: T) { + for item in self.iter_mut() { + *item = value; + } + } +} + +impl SpecFill for [u8] { + fn spec_fill(&mut self, value: u8) { + // SAFETY: this is slice of u8 + unsafe { + let ptr = self.as_mut_ptr(); + let len = self.len(); + write_bytes(ptr, value, len); + } + } +} + +impl SpecFill for [i8] { + fn spec_fill(&mut self, value: i8) { + // SAFETY: this is slice of i8 + unsafe { + let ptr = self.as_mut_ptr(); + let len = self.len(); + write_bytes(ptr, value as u8, len); + } + } +} + +impl SpecFill for [bool] { + fn spec_fill(&mut self, value: bool) { + // SAFETY: this is slice of bool + unsafe { + let ptr = self.as_mut_ptr(); + let len = self.len(); + write_bytes(ptr, value as u8, len); + } + } +} diff --git a/library/core/src/str/converts.rs b/library/core/src/str/converts.rs index 73316433e0..05ff7bb120 100644 --- a/library/core/src/str/converts.rs +++ b/library/core/src/str/converts.rs @@ -14,7 +14,7 @@ use super::Utf8Error; /// UTF-8, and then does the conversion. /// /// [`&str`]: str -/// [byteslice]: ../../std/primitive.slice.html +/// [byteslice]: slice /// /// If you are sure that the byte slice is valid UTF-8, and you don't want to /// incur the overhead of the validity check, there is an unsafe version of @@ -31,7 +31,7 @@ use super::Utf8Error; /// stack-allocated string. There is an example of this in the /// examples section below. /// -/// [byteslice]: ../../std/primitive.slice.html +/// [byteslice]: slice /// /// # Errors /// diff --git a/library/core/src/str/iter.rs b/library/core/src/str/iter.rs index 83f484dc57..4eac017f91 100644 --- a/library/core/src/str/iter.rs +++ b/library/core/src/str/iter.rs @@ -321,10 +321,7 @@ unsafe impl TrustedLen for Bytes<'_> {} #[doc(hidden)] #[unstable(feature = "trusted_random_access", issue = "none")] unsafe impl TrustedRandomAccess for Bytes<'_> { - #[inline] - fn may_have_side_effect() -> bool { - false - } + const MAY_HAVE_SIDE_EFFECT: bool = false; } /// This macro generates a Clone impl for string pattern API @@ -1203,6 +1200,30 @@ impl<'a> DoubleEndedIterator for SplitWhitespace<'a> { #[stable(feature = "fused", since = "1.26.0")] impl FusedIterator for SplitWhitespace<'_> {} +impl<'a> SplitWhitespace<'a> { + /// Returns remainder of the splitted string + /// + /// # Examples + /// + /// ``` + /// #![feature(str_split_whitespace_as_str)] + /// + /// let mut split = "Mary had a little lamb".split_whitespace(); + /// assert_eq!(split.as_str(), "Mary had a little lamb"); + /// + /// split.next(); + /// assert_eq!(split.as_str(), "had a little lamb"); + /// + /// split.by_ref().for_each(drop); + /// assert_eq!(split.as_str(), ""); + /// ``` + #[inline] + #[unstable(feature = "str_split_whitespace_as_str", issue = "77998")] + pub fn as_str(&self) -> &'a str { + self.inner.iter.as_str() + } +} + #[stable(feature = "split_ascii_whitespace", since = "1.34.0")] impl<'a> Iterator for SplitAsciiWhitespace<'a> { type Item = &'a str; @@ -1234,6 +1255,35 @@ impl<'a> DoubleEndedIterator for SplitAsciiWhitespace<'a> { #[stable(feature = "split_ascii_whitespace", since = "1.34.0")] impl FusedIterator for SplitAsciiWhitespace<'_> {} +impl<'a> SplitAsciiWhitespace<'a> { + /// Returns remainder of the splitted string + /// + /// # Examples + /// + /// ``` + /// #![feature(str_split_whitespace_as_str)] + /// + /// let mut split = "Mary had a little lamb".split_ascii_whitespace(); + /// assert_eq!(split.as_str(), "Mary had a little lamb"); + /// + /// split.next(); + /// assert_eq!(split.as_str(), "had a little lamb"); + /// + /// split.by_ref().for_each(drop); + /// assert_eq!(split.as_str(), ""); + /// ``` + #[inline] + #[unstable(feature = "str_split_whitespace_as_str", issue = "77998")] + pub fn as_str(&self) -> &'a str { + if self.inner.iter.iter.finished { + return ""; + } + + // SAFETY: Slice is created from str. + unsafe { crate::str::from_utf8_unchecked(&self.inner.iter.iter.v) } + } +} + #[stable(feature = "split_inclusive", since = "1.51.0")] impl<'a, P: Pattern<'a>> Iterator for SplitInclusive<'a, P> { type Item = &'a str; diff --git a/library/core/src/str/mod.rs b/library/core/src/str/mod.rs index b8c5a1d03b..67c074b394 100644 --- a/library/core/src/str/mod.rs +++ b/library/core/src/str/mod.rs @@ -1506,13 +1506,11 @@ impl str { /// # Examples /// /// ``` - /// #![feature(str_split_once)] - /// /// assert_eq!("cfg".split_once('='), None); /// assert_eq!("cfg=foo".split_once('='), Some(("cfg", "foo"))); /// assert_eq!("cfg=foo=bar".split_once('='), Some(("cfg", "foo=bar"))); /// ``` - #[unstable(feature = "str_split_once", reason = "newly added", issue = "74773")] + #[stable(feature = "str_split_once", since = "1.52.0")] #[inline] pub fn split_once<'a, P: Pattern<'a>>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> { let (start, end) = delimiter.into_searcher(self).next_match()?; @@ -1525,13 +1523,11 @@ impl str { /// # Examples /// /// ``` - /// #![feature(str_split_once)] - /// /// assert_eq!("cfg".rsplit_once('='), None); /// assert_eq!("cfg=foo".rsplit_once('='), Some(("cfg", "foo"))); /// assert_eq!("cfg=foo=bar".rsplit_once('='), Some(("cfg=foo", "bar"))); /// ``` - #[unstable(feature = "str_split_once", reason = "newly added", issue = "74773")] + #[stable(feature = "str_split_once", since = "1.52.0")] #[inline] pub fn rsplit_once<'a, P>(&'a self, delimiter: P) -> Option<(&'a str, &'a str)> where diff --git a/library/core/src/str/traits.rs b/library/core/src/str/traits.rs index 1906fa27bf..0a2743b1c3 100644 --- a/library/core/src/str/traits.rs +++ b/library/core/src/str/traits.rs @@ -540,9 +540,7 @@ pub trait FromStr: Sized { /// /// # Examples /// - /// Basic usage with [`i32`][ithirtytwo], a type that implements `FromStr`: - /// - /// [ithirtytwo]: ../../std/primitive.i32.html + /// Basic usage with [`i32`], a type that implements `FromStr`: /// /// ``` /// use std::str::FromStr; diff --git a/library/core/src/sync/atomic.rs b/library/core/src/sync/atomic.rs index 81c9e1d1c1..ca39224602 100644 --- a/library/core/src/sync/atomic.rs +++ b/library/core/src/sync/atomic.rs @@ -1307,7 +1307,7 @@ macro_rules! atomic_int { $stable_nand:meta, $const_stable:meta, $stable_init_const:meta, - $s_int_type:literal, $int_ref:expr, + $s_int_type:literal, $extra_feature:expr, $min_fn:ident, $max_fn:ident, $align:expr, @@ -1318,18 +1318,14 @@ macro_rules! atomic_int { /// This type has the same in-memory representation as the underlying /// integer type, [` #[doc = $s_int_type] - /// `]( - #[doc = $int_ref] - /// ). For more about the differences between atomic types and + /// `]. For more about the differences between atomic types and /// non-atomic types as well as information about the portability of /// this type, please see the [module-level documentation]. /// /// **Note:** This type is only available on platforms that support /// atomic loads and stores of [` #[doc = $s_int_type] - /// `]( - #[doc = $int_ref] - /// ). + /// `]. /// /// [module-level documentation]: crate::sync::atomic #[$stable] @@ -1525,7 +1521,7 @@ macro_rules! atomic_int { /// using [`Release`] makes the load part [`Relaxed`]. /// /// **Note**: This method is only available on platforms that support atomic operations on - #[doc = concat!("[`", $s_int_type, "`](", $int_ref, ").")] + #[doc = concat!("[`", $s_int_type, "`].")] /// /// # Examples /// @@ -1557,7 +1553,7 @@ macro_rules! atomic_int { /// happens, and using [`Release`] makes the load part [`Relaxed`]. /// /// **Note**: This method is only available on platforms that support atomic operations on - #[doc = concat!("[`", $s_int_type, "`](", $int_ref, ").")] + #[doc = concat!("[`", $s_int_type, "`].")] /// /// # Migrating to `compare_exchange` and `compare_exchange_weak` /// @@ -1626,7 +1622,7 @@ macro_rules! atomic_int { /// and must be equivalent to or weaker than the success ordering. /// /// **Note**: This method is only available on platforms that support atomic operations on - #[doc = concat!("[`", $s_int_type, "`](", $int_ref, ").")] + #[doc = concat!("[`", $s_int_type, "`].")] /// /// # Examples /// @@ -1678,7 +1674,7 @@ macro_rules! atomic_int { /// and must be equivalent to or weaker than the success ordering. /// /// **Note**: This method is only available on platforms that support atomic operations on - #[doc = concat!("[`", $s_int_type, "`](", $int_ref, ").")] + #[doc = concat!("[`", $s_int_type, "`].")] /// /// # Examples /// @@ -1720,7 +1716,7 @@ macro_rules! atomic_int { /// using [`Release`] makes the load part [`Relaxed`]. /// /// **Note**: This method is only available on platforms that support atomic operations on - #[doc = concat!("[`", $s_int_type, "`](", $int_ref, ").")] + #[doc = concat!("[`", $s_int_type, "`].")] /// /// # Examples /// @@ -1749,7 +1745,7 @@ macro_rules! atomic_int { /// using [`Release`] makes the load part [`Relaxed`]. /// /// **Note**: This method is only available on platforms that support atomic operations on - #[doc = concat!("[`", $s_int_type, "`](", $int_ref, ").")] + #[doc = concat!("[`", $s_int_type, "`].")] /// /// # Examples /// @@ -1781,7 +1777,7 @@ macro_rules! atomic_int { /// using [`Release`] makes the load part [`Relaxed`]. /// /// **Note**: This method is only available on platforms that support atomic operations on - #[doc = concat!("[`", $s_int_type, "`](", $int_ref, ").")] + #[doc = concat!("[`", $s_int_type, "`].")] /// /// # Examples /// @@ -1813,7 +1809,7 @@ macro_rules! atomic_int { /// using [`Release`] makes the load part [`Relaxed`]. /// /// **Note**: This method is only available on platforms that support atomic operations on - #[doc = concat!("[`", $s_int_type, "`](", $int_ref, ").")] + #[doc = concat!("[`", $s_int_type, "`].")] /// /// # Examples /// @@ -1845,7 +1841,7 @@ macro_rules! atomic_int { /// using [`Release`] makes the load part [`Relaxed`]. /// /// **Note**: This method is only available on platforms that support atomic operations on - #[doc = concat!("[`", $s_int_type, "`](", $int_ref, ").")] + #[doc = concat!("[`", $s_int_type, "`].")] /// /// # Examples /// @@ -1877,7 +1873,7 @@ macro_rules! atomic_int { /// using [`Release`] makes the load part [`Relaxed`]. /// /// **Note**: This method is only available on platforms that support atomic operations on - #[doc = concat!("[`", $s_int_type, "`](", $int_ref, ").")] + #[doc = concat!("[`", $s_int_type, "`].")] /// /// # Examples /// @@ -1916,7 +1912,7 @@ macro_rules! atomic_int { /// and must be equivalent to or weaker than the success ordering. /// /// **Note**: This method is only available on platforms that support atomic operations on - #[doc = concat!("[`", $s_int_type, "`](", $int_ref, ").")] + #[doc = concat!("[`", $s_int_type, "`].")] /// /// # Examples /// @@ -1960,7 +1956,7 @@ macro_rules! atomic_int { /// using [`Release`] makes the load part [`Relaxed`]. /// /// **Note**: This method is only available on platforms that support atomic operations on - #[doc = concat!("[`", $s_int_type, "`](", $int_ref, ").")] + #[doc = concat!("[`", $s_int_type, "`].")] /// /// # Examples /// @@ -2003,7 +1999,7 @@ macro_rules! atomic_int { /// using [`Release`] makes the load part [`Relaxed`]. /// /// **Note**: This method is only available on platforms that support atomic operations on - #[doc = concat!("[`", $s_int_type, "`](", $int_ref, ").")] + #[doc = concat!("[`", $s_int_type, "`].")] /// /// # Examples /// @@ -2088,7 +2084,7 @@ atomic_int! { stable(feature = "integer_atomics_stable", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), unstable(feature = "integer_atomics", issue = "32976"), - "i8", "../../../std/primitive.i8.html", + "i8", "", atomic_min, atomic_max, 1, @@ -2107,7 +2103,7 @@ atomic_int! { stable(feature = "integer_atomics_stable", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), unstable(feature = "integer_atomics", issue = "32976"), - "u8", "../../../std/primitive.u8.html", + "u8", "", atomic_umin, atomic_umax, 1, @@ -2126,7 +2122,7 @@ atomic_int! { stable(feature = "integer_atomics_stable", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), unstable(feature = "integer_atomics", issue = "32976"), - "i16", "../../../std/primitive.i16.html", + "i16", "", atomic_min, atomic_max, 2, @@ -2145,7 +2141,7 @@ atomic_int! { stable(feature = "integer_atomics_stable", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), unstable(feature = "integer_atomics", issue = "32976"), - "u16", "../../../std/primitive.u16.html", + "u16", "", atomic_umin, atomic_umax, 2, @@ -2164,7 +2160,7 @@ atomic_int! { stable(feature = "integer_atomics_stable", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), unstable(feature = "integer_atomics", issue = "32976"), - "i32", "../../../std/primitive.i32.html", + "i32", "", atomic_min, atomic_max, 4, @@ -2183,7 +2179,7 @@ atomic_int! { stable(feature = "integer_atomics_stable", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), unstable(feature = "integer_atomics", issue = "32976"), - "u32", "../../../std/primitive.u32.html", + "u32", "", atomic_umin, atomic_umax, 4, @@ -2202,7 +2198,7 @@ atomic_int! { stable(feature = "integer_atomics_stable", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), unstable(feature = "integer_atomics", issue = "32976"), - "i64", "../../../std/primitive.i64.html", + "i64", "", atomic_min, atomic_max, 8, @@ -2221,7 +2217,7 @@ atomic_int! { stable(feature = "integer_atomics_stable", since = "1.34.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), unstable(feature = "integer_atomics", issue = "32976"), - "u64", "../../../std/primitive.u64.html", + "u64", "", atomic_umin, atomic_umax, 8, @@ -2240,7 +2236,7 @@ atomic_int! { unstable(feature = "integer_atomics", issue = "32976"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), unstable(feature = "integer_atomics", issue = "32976"), - "i128", "../../../std/primitive.i128.html", + "i128", "#![feature(integer_atomics)]\n\n", atomic_min, atomic_max, 16, @@ -2259,7 +2255,7 @@ atomic_int! { unstable(feature = "integer_atomics", issue = "32976"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), unstable(feature = "integer_atomics", issue = "32976"), - "u128", "../../../std/primitive.u128.html", + "u128", "#![feature(integer_atomics)]\n\n", atomic_umin, atomic_umax, 16, @@ -2282,7 +2278,7 @@ macro_rules! atomic_int_ptr_sized { stable(feature = "atomic_nand", since = "1.27.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), stable(feature = "rust1", since = "1.0.0"), - "isize", "../../../std/primitive.isize.html", + "isize", "", atomic_min, atomic_max, $align, @@ -2302,7 +2298,7 @@ macro_rules! atomic_int_ptr_sized { stable(feature = "atomic_nand", since = "1.27.0"), rustc_const_stable(feature = "const_integer_atomics", since = "1.34.0"), stable(feature = "rust1", since = "1.0.0"), - "usize", "../../../std/primitive.usize.html", + "usize", "", atomic_umin, atomic_umax, $align, diff --git a/library/core/src/time.rs b/library/core/src/time.rs index b1443bc33d..8c0848c64a 100644 --- a/library/core/src/time.rs +++ b/library/core/src/time.rs @@ -48,6 +48,17 @@ const MICROS_PER_SEC: u64 = 1_000_000; /// /// let ten_millis = Duration::from_millis(10); /// ``` +/// +/// # Formatting `Duration` values +/// +/// `Duration` intentionally does not have a `Display` impl, as there are a +/// variety of ways to format spans of time for human readability. `Duration` +/// provides a `Debug` impl that shows the full precision of the value. +/// +/// The `Debug` output uses the non-ASCII "µs" suffix for microseconds. If your +/// program output may appear in contexts that cannot rely on full Unicode +/// compatibility, you may wish to format `Duration` objects yourself or use a +/// crate to do so. #[stable(feature = "duration", since = "1.3.0")] #[derive(Clone, Copy, PartialEq, Eq, PartialOrd, Ord, Hash, Default)] pub struct Duration { diff --git a/library/core/src/unicode/unicode_data.rs b/library/core/src/unicode/unicode_data.rs index 9c92a8ba28..16803bf2e8 100644 --- a/library/core/src/unicode/unicode_data.rs +++ b/library/core/src/unicode/unicode_data.rs @@ -549,16 +549,24 @@ pub mod white_space { #[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, + if c.is_ascii() { + [(c as u8).to_ascii_lowercase() as char, '\0', '\0'] + } else { + 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, + if c.is_ascii() { + [(c as u8).to_ascii_uppercase() as char, '\0', '\0'] + } else { + match bsearch_case_table(c, UPPERCASE_TABLE) { + None => [c, '\0', '\0'], + Some(index) => UPPERCASE_TABLE[index].1, + } } } diff --git a/library/core/tests/atomic.rs b/library/core/tests/atomic.rs index 2d1e4496ae..b735957666 100644 --- a/library/core/tests/atomic.rs +++ b/library/core/tests/atomic.rs @@ -59,6 +59,26 @@ fn uint_xor() { assert_eq!(x.load(SeqCst), 0xf731 ^ 0x137f); } +#[test] +#[cfg(any(not(target_arch = "arm"), target_os = "linux"))] // Missing intrinsic in compiler-builtins +fn uint_min() { + let x = AtomicUsize::new(0xf731); + assert_eq!(x.fetch_min(0x137f, SeqCst), 0xf731); + assert_eq!(x.load(SeqCst), 0x137f); + assert_eq!(x.fetch_min(0xf731, SeqCst), 0x137f); + assert_eq!(x.load(SeqCst), 0x137f); +} + +#[test] +#[cfg(any(not(target_arch = "arm"), target_os = "linux"))] // Missing intrinsic in compiler-builtins +fn uint_max() { + let x = AtomicUsize::new(0x137f); + assert_eq!(x.fetch_max(0xf731, SeqCst), 0x137f); + assert_eq!(x.load(SeqCst), 0xf731); + assert_eq!(x.fetch_max(0x137f, SeqCst), 0xf731); + assert_eq!(x.load(SeqCst), 0xf731); +} + #[test] fn int_and() { let x = AtomicIsize::new(0xf731); @@ -87,6 +107,26 @@ fn int_xor() { assert_eq!(x.load(SeqCst), 0xf731 ^ 0x137f); } +#[test] +#[cfg(any(not(target_arch = "arm"), target_os = "linux"))] // Missing intrinsic in compiler-builtins +fn int_min() { + let x = AtomicIsize::new(0xf731); + assert_eq!(x.fetch_min(0x137f, SeqCst), 0xf731); + assert_eq!(x.load(SeqCst), 0x137f); + assert_eq!(x.fetch_min(0xf731, SeqCst), 0x137f); + assert_eq!(x.load(SeqCst), 0x137f); +} + +#[test] +#[cfg(any(not(target_arch = "arm"), target_os = "linux"))] // Missing intrinsic in compiler-builtins +fn int_max() { + let x = AtomicIsize::new(0x137f); + assert_eq!(x.fetch_max(0xf731, SeqCst), 0x137f); + assert_eq!(x.load(SeqCst), 0xf731); + assert_eq!(x.fetch_max(0x137f, SeqCst), 0xf731); + assert_eq!(x.load(SeqCst), 0xf731); +} + static S_FALSE: AtomicBool = AtomicBool::new(false); static S_TRUE: AtomicBool = AtomicBool::new(true); static S_INT: AtomicIsize = AtomicIsize::new(0); diff --git a/library/core/tests/const_ptr.rs b/library/core/tests/const_ptr.rs index 4acd059ab0..152fed803e 100644 --- a/library/core/tests/const_ptr.rs +++ b/library/core/tests/const_ptr.rs @@ -49,3 +49,53 @@ fn mut_ptr_read() { const UNALIGNED: u16 = unsafe { UNALIGNED_PTR.read_unaligned() }; assert_eq!(UNALIGNED, u16::from_ne_bytes([0x23, 0x45])); } + +#[test] +fn write() { + use core::ptr; + + const fn write_aligned() -> i32 { + let mut res = 0; + unsafe { + ptr::write(&mut res as *mut _, 42); + } + res + } + const ALIGNED: i32 = write_aligned(); + assert_eq!(ALIGNED, 42); + + const fn write_unaligned() -> [u16; 2] { + let mut two_aligned = [0u16; 2]; + unsafe { + let unaligned_ptr = (two_aligned.as_mut_ptr() as *mut u8).add(1) as *mut u16; + ptr::write_unaligned(unaligned_ptr, u16::from_ne_bytes([0x23, 0x45])); + } + two_aligned + } + const UNALIGNED: [u16; 2] = write_unaligned(); + assert_eq!(UNALIGNED, [u16::from_ne_bytes([0x00, 0x23]), u16::from_ne_bytes([0x45, 0x00])]); +} + +#[test] +fn mut_ptr_write() { + const fn aligned() -> i32 { + let mut res = 0; + unsafe { + (&mut res as *mut i32).write(42); + } + res + } + const ALIGNED: i32 = aligned(); + assert_eq!(ALIGNED, 42); + + const fn write_unaligned() -> [u16; 2] { + let mut two_aligned = [0u16; 2]; + unsafe { + let unaligned_ptr = (two_aligned.as_mut_ptr() as *mut u8).add(1) as *mut u16; + unaligned_ptr.write_unaligned(u16::from_ne_bytes([0x23, 0x45])); + } + two_aligned + } + const UNALIGNED: [u16; 2] = write_unaligned(); + assert_eq!(UNALIGNED, [u16::from_ne_bytes([0x00, 0x23]), u16::from_ne_bytes([0x45, 0x00])]); +} diff --git a/library/core/tests/iter/adapters/intersperse.rs b/library/core/tests/iter/adapters/intersperse.rs index 9dbe232e4e..b336c03b5a 100644 --- a/library/core/tests/iter/adapters/intersperse.rs +++ b/library/core/tests/iter/adapters/intersperse.rs @@ -9,7 +9,7 @@ fn test_intersperse() { assert_eq!(v, vec![1]); let xs = ["a", "", "b", "c"]; - let v: Vec<&str> = xs.iter().map(|x| x.clone()).intersperse(", ").collect(); + let v: Vec<&str> = xs.iter().map(|x| *x).intersperse(", ").collect(); let text: String = v.concat(); assert_eq!(text, "a, , b, c".to_string()); @@ -24,7 +24,7 @@ fn test_intersperse_size_hint() { assert_eq!(iter.size_hint(), (0, Some(0))); let xs = ["a", "", "b", "c"]; - let mut iter = xs.iter().map(|x| x.clone()).intersperse(", "); + let mut iter = xs.iter().map(|x| *x).intersperse(", "); assert_eq!(iter.size_hint(), (7, Some(7))); assert_eq!(iter.next(), Some("a")); diff --git a/library/core/tests/iter/adapters/zip.rs b/library/core/tests/iter/adapters/zip.rs index 1fce0951e3..000c15f72c 100644 --- a/library/core/tests/iter/adapters/zip.rs +++ b/library/core/tests/iter/adapters/zip.rs @@ -245,3 +245,46 @@ fn test_double_ended_zip() { assert_eq!(it.next_back(), Some((3, 3))); assert_eq!(it.next(), None); } + +#[test] +fn test_issue_82282() { + fn overflowed_zip(arr: &[i32]) -> impl Iterator { + static UNIT_EMPTY_ARR: [(); 0] = []; + + let mapped = arr.into_iter().map(|i| *i); + let mut zipped = mapped.zip(UNIT_EMPTY_ARR.iter()); + zipped.next(); + zipped + } + + let arr = [1, 2, 3]; + let zip = overflowed_zip(&arr).zip(overflowed_zip(&arr)); + + assert_eq!(zip.size_hint(), (0, Some(0))); + for _ in zip { + panic!(); + } +} + +#[test] +fn test_issue_82291() { + use std::cell::Cell; + + let mut v1 = [()]; + let v2 = [()]; + + let called = Cell::new(0); + + let mut zip = v1 + .iter_mut() + .map(|r| { + called.set(called.get() + 1); + r + }) + .zip(&v2); + + zip.next_back(); + assert_eq!(called.get(), 1); + zip.next(); + assert_eq!(called.get(), 1); +} diff --git a/library/core/tests/lib.rs b/library/core/tests/lib.rs index 4dc86e0f5f..b7fcc74036 100644 --- a/library/core/tests/lib.rs +++ b/library/core/tests/lib.rs @@ -14,7 +14,9 @@ #![feature(const_cell_into_inner)] #![feature(const_maybe_uninit_assume_init)] #![feature(const_ptr_read)] +#![feature(const_ptr_write)] #![feature(const_ptr_offset)] +#![feature(control_flow_enum)] #![feature(core_intrinsics)] #![feature(core_private_bignum)] #![feature(core_private_diy_float)] @@ -26,6 +28,7 @@ #![feature(duration_saturating_ops)] #![feature(duration_zero)] #![feature(exact_size_is_empty)] +#![feature(extern_types)] #![feature(fixed_size_array)] #![feature(flt2dec)] #![feature(fmt_internals)] @@ -64,17 +67,20 @@ #![feature(never_type)] #![feature(unwrap_infallible)] #![feature(option_result_unwrap_unchecked)] +#![feature(result_into_ok_or_err)] #![feature(option_unwrap_none)] #![feature(peekable_peek_mut)] -#![feature(partition_point)] +#![cfg_attr(not(bootstrap), feature(ptr_metadata))] #![feature(once_cell)] -#![feature(unsafe_block_in_unsafe_fn)] +#![feature(unsized_tuple_coercion)] #![feature(int_bits_const)] #![feature(nonzero_leading_trailing_zeros)] #![feature(const_option)] #![feature(integer_atomics)] #![feature(slice_group_by)] #![feature(trusted_random_access)] +#![cfg_attr(bootstrap, feature(unsafe_block_in_unsafe_fn))] +#![cfg_attr(not(bootstrap), feature(unsize))] #![deny(unsafe_op_in_unsafe_fn)] extern crate test; @@ -89,10 +95,7 @@ mod cell; mod char; mod clone; mod cmp; - -#[cfg(not(bootstrap))] mod const_ptr; - mod fmt; mod hash; mod intrinsics; diff --git a/library/core/tests/mem.rs b/library/core/tests/mem.rs index 38084f401b..c0b75036f4 100644 --- a/library/core/tests/mem.rs +++ b/library/core/tests/mem.rs @@ -284,7 +284,6 @@ fn uninit_write_slice_cloned_no_drop() { } #[test] -#[cfg(not(bootstrap))] fn uninit_const_assume_init_read() { const FOO: u32 = unsafe { MaybeUninit::new(42).assume_init_read() }; assert_eq!(FOO, 42); diff --git a/library/core/tests/ops.rs b/library/core/tests/ops.rs index 53e5539fad..aa79dbac8f 100644 --- a/library/core/tests/ops.rs +++ b/library/core/tests/ops.rs @@ -1,3 +1,5 @@ +mod control_flow; + use core::ops::{Bound, Range, RangeFrom, RangeFull, RangeInclusive, RangeTo, RangeToInclusive}; use core::ops::{Deref, DerefMut}; diff --git a/library/core/tests/ops/control_flow.rs b/library/core/tests/ops/control_flow.rs new file mode 100644 index 0000000000..eacfd63a6c --- /dev/null +++ b/library/core/tests/ops/control_flow.rs @@ -0,0 +1,18 @@ +use core::intrinsics::discriminant_value; +use core::ops::ControlFlow; + +#[test] +fn control_flow_discriminants_match_result() { + // This isn't stable surface area, but helps keep `?` cheap between them, + // even if LLVM can't always take advantage of it right now. + // (Sadly Result and Option are inconsistent, so ControlFlow can't match both.) + + assert_eq!( + discriminant_value(&ControlFlow::::Break(3)), + discriminant_value(&Result::::Err(3)), + ); + assert_eq!( + discriminant_value(&ControlFlow::::Continue(3)), + discriminant_value(&Result::::Ok(3)), + ); +} diff --git a/library/core/tests/ptr.rs b/library/core/tests/ptr.rs index 57c2fb06c1..224a58e3cc 100644 --- a/library/core/tests/ptr.rs +++ b/library/core/tests/ptr.rs @@ -1,5 +1,9 @@ use core::cell::RefCell; +#[cfg(not(bootstrap))] +use core::ptr; use core::ptr::*; +#[cfg(not(bootstrap))] +use std::fmt::{Debug, Display}; #[test] fn test_const_from_raw_parts() { @@ -413,3 +417,253 @@ fn offset_from() { assert_eq!(ptr2.offset(-2), ptr1); } } + +#[test] +#[cfg(not(bootstrap))] +fn ptr_metadata() { + struct Unit; + struct Pair(A, B); + extern "C" { + type Extern; + } + let () = metadata(&()); + let () = metadata(&Unit); + let () = metadata(&4_u32); + let () = metadata(&String::new()); + let () = metadata(&Some(4_u32)); + let () = metadata(&ptr_metadata); + let () = metadata(&|| {}); + let () = metadata(&[4, 7]); + let () = metadata(&(4, String::new())); + let () = metadata(&Pair(4, String::new())); + let () = metadata(0 as *const Extern); + let () = metadata(0 as *const <&u32 as std::ops::Deref>::Target); + + assert_eq!(metadata("foo"), 3_usize); + assert_eq!(metadata(&[4, 7][..]), 2_usize); + + let dst_tuple: &(bool, [u8]) = &(true, [0x66, 0x6F, 0x6F]); + let dst_struct: &Pair = &Pair(true, [0x66, 0x6F, 0x6F]); + assert_eq!(metadata(dst_tuple), 3_usize); + assert_eq!(metadata(dst_struct), 3_usize); + unsafe { + let dst_tuple: &(bool, str) = std::mem::transmute(dst_tuple); + let dst_struct: &Pair = std::mem::transmute(dst_struct); + assert_eq!(&dst_tuple.1, "foo"); + assert_eq!(&dst_struct.1, "foo"); + assert_eq!(metadata(dst_tuple), 3_usize); + assert_eq!(metadata(dst_struct), 3_usize); + } + + let vtable_1: DynMetadata = metadata(&4_u16 as &dyn Debug); + let vtable_2: DynMetadata = metadata(&4_u16 as &dyn Display); + let vtable_3: DynMetadata = metadata(&4_u32 as &dyn Display); + let vtable_4: DynMetadata = metadata(&(true, 7_u32) as &(bool, dyn Display)); + let vtable_5: DynMetadata = + metadata(&Pair(true, 7_u32) as &Pair); + unsafe { + let address_1: usize = std::mem::transmute(vtable_1); + let address_2: usize = std::mem::transmute(vtable_2); + let address_3: usize = std::mem::transmute(vtable_3); + let address_4: usize = std::mem::transmute(vtable_4); + let address_5: usize = std::mem::transmute(vtable_5); + // Different trait => different vtable pointer + assert_ne!(address_1, address_2); + // Different erased type => different vtable pointer + assert_ne!(address_2, address_3); + // Same erased type and same trait => same vtable pointer + assert_eq!(address_3, address_4); + assert_eq!(address_3, address_5); + } +} + +#[test] +#[cfg(not(bootstrap))] +fn ptr_metadata_bounds() { + fn metadata_eq_method_address() -> usize { + // The `Metadata` associated type has an `Ord` bound, so this is valid: + <::Metadata as PartialEq>::eq as usize + } + // "Synthetic" trait impls generated by the compiler like those of `Pointee` + // are not checked for bounds of associated type. + // So with a buggy libcore we could have both: + // * `::Metadata == DynMetadata` + // * `DynMetadata: !PartialEq` + // … and cause an ICE here: + metadata_eq_method_address::(); + + // For this reason, let’s check here that bounds are satisfied: + + let _ = static_assert_expected_bounds_for_metadata::<()>; + let _ = static_assert_expected_bounds_for_metadata::; + let _ = static_assert_expected_bounds_for_metadata::>; + fn _static_assert_associated_type() { + let _ = static_assert_expected_bounds_for_metadata::<::Metadata>; + } + + fn static_assert_expected_bounds_for_metadata() + where + // Keep this in sync with the associated type in `library/core/src/ptr/metadata.rs` + Meta: Copy + Send + Sync + Ord + std::hash::Hash + Unpin, + { + } +} + +#[test] +#[cfg(not(bootstrap))] +fn dyn_metadata() { + #[derive(Debug)] + #[repr(align(32))] + struct Something([u8; 47]); + + let value = Something([0; 47]); + let trait_object: &dyn Debug = &value; + let meta = metadata(trait_object); + + assert_eq!(meta.size_of(), 64); + assert_eq!(meta.size_of(), std::mem::size_of::()); + assert_eq!(meta.align_of(), 32); + assert_eq!(meta.align_of(), std::mem::align_of::()); + assert_eq!(meta.layout(), std::alloc::Layout::new::()); + + assert!(format!("{:?}", meta).starts_with("DynMetadata(0x")); +} + +#[test] +#[cfg(not(bootstrap))] +fn from_raw_parts() { + let mut value = 5_u32; + let address = &mut value as *mut _ as *mut (); + let trait_object: &dyn Display = &mut value; + let vtable = metadata(trait_object); + let trait_object = NonNull::from(trait_object); + + assert_eq!(ptr::from_raw_parts(address, vtable), trait_object.as_ptr()); + assert_eq!(ptr::from_raw_parts_mut(address, vtable), trait_object.as_ptr()); + assert_eq!(NonNull::from_raw_parts(NonNull::new(address).unwrap(), vtable), trait_object); + + let mut array = [5_u32, 5, 5, 5, 5]; + let address = &mut array as *mut _ as *mut (); + let array_ptr = NonNull::from(&mut array); + let slice_ptr = NonNull::from(&mut array[..]); + + assert_eq!(ptr::from_raw_parts(address, ()), array_ptr.as_ptr()); + assert_eq!(ptr::from_raw_parts_mut(address, ()), array_ptr.as_ptr()); + assert_eq!(NonNull::from_raw_parts(NonNull::new(address).unwrap(), ()), array_ptr); + + assert_eq!(ptr::from_raw_parts(address, 5), slice_ptr.as_ptr()); + assert_eq!(ptr::from_raw_parts_mut(address, 5), slice_ptr.as_ptr()); + assert_eq!(NonNull::from_raw_parts(NonNull::new(address).unwrap(), 5), slice_ptr); +} + +#[test] +#[cfg(not(bootstrap))] +fn thin_box() { + let foo = ThinBox::::new(4); + assert_eq!(foo.to_string(), "4"); + drop(foo); + let bar = ThinBox::::new(7); + assert_eq!(bar.to_string(), "7"); + + // A slightly more interesting library that could be built on top of metadata APIs. + // + // * It could be generalized to any `T: ?Sized` (not just trait object) + // if `{size,align}_of_for_meta(T::Metadata)` are added. + // * Constructing a `ThinBox` without consuming and deallocating a `Box` + // requires either the unstable `Unsize` marker trait, + // or the unstable `unsized_locals` language feature, + // or taking `&dyn T` and restricting to `T: Copy`. + + use std::alloc::*; + use std::marker::PhantomData; + + struct ThinBox + where + T: ?Sized + Pointee>, + { + ptr: NonNull>, + phantom: PhantomData, + } + + impl ThinBox + where + T: ?Sized + Pointee>, + { + pub fn new>(value: Value) -> Self { + let unsized_: &T = &value; + let meta = metadata(unsized_); + let meta_layout = Layout::for_value(&meta); + let value_layout = Layout::for_value(&value); + let (layout, offset) = meta_layout.extend(value_layout).unwrap(); + // `DynMetadata` is pointer-sized: + assert!(layout.size() > 0); + // If `ThinBox` is generalized to any `T: ?Sized`, + // handle ZSTs with a dangling pointer without going through `alloc()`, + // like `Box` does. + unsafe { + let ptr = NonNull::new(alloc(layout)) + .unwrap_or_else(|| handle_alloc_error(layout)) + .cast::>(); + ptr.as_ptr().write(meta); + ptr.cast::().as_ptr().add(offset).cast::().write(value); + Self { ptr, phantom: PhantomData } + } + } + + fn meta(&self) -> DynMetadata { + unsafe { *self.ptr.as_ref() } + } + + fn layout(&self) -> (Layout, usize) { + let meta = self.meta(); + Layout::for_value(&meta).extend(meta.layout()).unwrap() + } + + fn value_ptr(&self) -> *const T { + let (_, offset) = self.layout(); + let data_ptr = unsafe { self.ptr.cast::().as_ptr().add(offset) }; + ptr::from_raw_parts(data_ptr.cast(), self.meta()) + } + + fn value_mut_ptr(&mut self) -> *mut T { + let (_, offset) = self.layout(); + // FIXME: can this line be shared with the same in `value_ptr()` + // without upsetting Stacked Borrows? + let data_ptr = unsafe { self.ptr.cast::().as_ptr().add(offset) }; + from_raw_parts_mut(data_ptr.cast(), self.meta()) + } + } + + impl std::ops::Deref for ThinBox + where + T: ?Sized + Pointee>, + { + type Target = T; + + fn deref(&self) -> &T { + unsafe { &*self.value_ptr() } + } + } + + impl std::ops::DerefMut for ThinBox + where + T: ?Sized + Pointee>, + { + fn deref_mut(&mut self) -> &mut T { + unsafe { &mut *self.value_mut_ptr() } + } + } + + impl std::ops::Drop for ThinBox + where + T: ?Sized + Pointee>, + { + fn drop(&mut self) { + let (layout, _) = self.layout(); + unsafe { + drop_in_place::(&mut **self); + dealloc(self.ptr.cast().as_ptr(), layout); + } + } + } +} diff --git a/library/core/tests/result.rs b/library/core/tests/result.rs index 7aa44c6e59..5fcd7b4d3a 100644 --- a/library/core/tests/result.rs +++ b/library/core/tests/result.rs @@ -95,6 +95,15 @@ fn test_unwrap_or() { assert_eq!(ok_err.unwrap_or(50), 50); } +#[test] +fn test_ok_or_err() { + let ok: Result = Ok(100); + let err: Result = Err(200); + + assert_eq!(ok.into_ok_or_err(), 100); + assert_eq!(err.into_ok_or_err(), 200); +} + #[test] fn test_unwrap_or_else() { fn handler(msg: &'static str) -> isize { diff --git a/library/core/tests/slice.rs b/library/core/tests/slice.rs index 9ccc5a08dc..7e198631cc 100644 --- a/library/core/tests/slice.rs +++ b/library/core/tests/slice.rs @@ -1,4 +1,5 @@ use core::cell::Cell; +use core::cmp::Ordering; use core::result::Result::{Err, Ok}; #[test] @@ -64,6 +65,17 @@ fn test_binary_search() { assert_eq!(b.binary_search(&6), Err(4)); assert_eq!(b.binary_search(&7), Ok(4)); assert_eq!(b.binary_search(&8), Err(5)); + + let b = [(); usize::MAX]; + assert_eq!(b.binary_search(&()), Ok(usize::MAX / 2)); +} + +#[test] +fn test_binary_search_by_overflow() { + let b = [(); usize::MAX]; + assert_eq!(b.binary_search_by(|_| Ordering::Equal), Ok(usize::MAX / 2)); + assert_eq!(b.binary_search_by(|_| Ordering::Greater), Err(0)); + assert_eq!(b.binary_search_by(|_| Ordering::Less), Err(usize::MAX)); } #[test] @@ -73,13 +85,13 @@ fn test_binary_search_implementation_details() { let b = [1, 1, 2, 2, 3, 3, 3]; assert_eq!(b.binary_search(&1), Ok(1)); assert_eq!(b.binary_search(&2), Ok(3)); - assert_eq!(b.binary_search(&3), Ok(6)); + assert_eq!(b.binary_search(&3), Ok(5)); let b = [1, 1, 1, 1, 1, 3, 3, 3, 3]; assert_eq!(b.binary_search(&1), Ok(4)); - assert_eq!(b.binary_search(&3), Ok(8)); + assert_eq!(b.binary_search(&3), Ok(7)); let b = [1, 1, 1, 1, 3, 3, 3, 3, 3]; - assert_eq!(b.binary_search(&1), Ok(3)); - assert_eq!(b.binary_search(&3), Ok(8)); + assert_eq!(b.binary_search(&1), Ok(2)); + assert_eq!(b.binary_search(&3), Ok(4)); } #[test] @@ -1982,6 +1994,7 @@ fn test_copy_within_panics_dest_too_long() { // The length is only 13, so a slice of length 4 starting at index 10 is out of bounds. bytes.copy_within(0..4, 10); } + #[test] #[should_panic(expected = "slice index starts at 2 but ends at 1")] fn test_copy_within_panics_src_inverted() { diff --git a/library/proc_macro/src/lib.rs b/library/proc_macro/src/lib.rs index a89e7b53e4..5f1f7d8cac 100644 --- a/library/proc_macro/src/lib.rs +++ b/library/proc_macro/src/lib.rs @@ -842,13 +842,20 @@ impl fmt::Debug for Punct { } } -#[stable(feature = "proc_macro_punct_eq", since = "1.49.0")] +#[stable(feature = "proc_macro_punct_eq", since = "1.50.0")] impl PartialEq for Punct { fn eq(&self, rhs: &char) -> bool { self.as_char() == *rhs } } +#[stable(feature = "proc_macro_punct_eq_flipped", since = "1.52.0")] +impl PartialEq for char { + fn eq(&self, rhs: &Punct) -> bool { + *self == rhs.as_char() + } +} + /// An identifier (`ident`). #[derive(Clone)] #[stable(feature = "proc_macro_lib2", since = "1.29.0")] diff --git a/library/profiler_builtins/build.rs b/library/profiler_builtins/build.rs index 7d5c601df5..2de6db762b 100644 --- a/library/profiler_builtins/build.rs +++ b/library/profiler_builtins/build.rs @@ -26,6 +26,7 @@ fn main() { "InstrProfilingPlatformWindows.c", "InstrProfilingUtil.c", "InstrProfilingValue.c", + "InstrProfilingVersionVar.c", "InstrProfilingWriter.c", // This file was renamed in LLVM 10. "InstrProfilingRuntime.cc", diff --git a/library/std/Cargo.toml b/library/std/Cargo.toml index 1c738761e8..22ca7ed09b 100644 --- a/library/std/Cargo.toml +++ b/library/std/Cargo.toml @@ -16,11 +16,11 @@ cfg-if = { version = "0.1.8", features = ['rustc-dep-of-std'] } panic_unwind = { path = "../panic_unwind", optional = true } panic_abort = { path = "../panic_abort" } core = { path = "../core" } -libc = { version = "0.2.79", default-features = false, features = ['rustc-dep-of-std'] } +libc = { version = "0.2.88", default-features = false, features = ['rustc-dep-of-std'] } compiler_builtins = { version = "0.1.39" } profiler_builtins = { path = "../profiler_builtins", optional = true } unwind = { path = "../unwind" } -hashbrown = { version = "0.9.0", default-features = false, features = ['rustc-dep-of-std'] } +hashbrown = { version = "0.11", default-features = false, features = ['rustc-dep-of-std'] } # Dependencies of the `backtrace` crate addr2line = { version = "0.14.0", optional = true, default-features = false } diff --git a/library/std/src/collections/hash/map.rs b/library/std/src/collections/hash/map.rs index 27f7191831..ed32668456 100644 --- a/library/std/src/collections/hash/map.rs +++ b/library/std/src/collections/hash/map.rs @@ -1,3 +1,5 @@ +// ignore-tidy-filelength + #[cfg(test)] mod tests; @@ -15,7 +17,7 @@ use crate::iter::{FromIterator, FusedIterator}; use crate::ops::Index; use crate::sys; -/// A hash map implemented with quadratic probing and SIMD lookup. +/// A [hash map] implemented with quadratic probing and SIMD lookup. /// /// By default, `HashMap` uses a hashing algorithm selected to provide /// resistance against HashDoS attacks. The algorithm is randomly seeded, and a @@ -60,6 +62,7 @@ use crate::sys; /// The original C++ version of SwissTable can be found [here], and this /// [CppCon talk] gives an overview of how the algorithm works. /// +/// [hash map]: crate::collections#use-a-hashmap-when /// [hashing algorithms available on crates.io]: https://crates.io/keywords/hasher /// [SwissTable]: https://abseil.io/blog/20180927-swisstables /// [here]: https://github.com/abseil/abseil-cpp/blob/master/absl/container/internal/raw_hash_set.h @@ -842,6 +845,37 @@ where self.base.insert(k, v) } + /// Tries to insert a key-value pair into the map, and returns + /// a mutable reference to the value in the entry. + /// + /// If the map already had this key present, nothing is updated, and + /// an error containing the occupied entry and the value is returned. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// #![feature(map_try_insert)] + /// + /// use std::collections::HashMap; + /// + /// let mut map = HashMap::new(); + /// assert_eq!(map.try_insert(37, "a").unwrap(), &"a"); + /// + /// let err = map.try_insert(37, "b").unwrap_err(); + /// assert_eq!(err.entry.key(), &37); + /// assert_eq!(err.entry.get(), &"a"); + /// assert_eq!(err.value, "b"); + /// ``` + #[unstable(feature = "map_try_insert", issue = "82766")] + pub fn try_insert(&mut self, key: K, value: V) -> Result<&mut V, OccupiedError<'_, K, V>> { + match self.entry(key) { + Occupied(entry) => Err(OccupiedError { entry, value }), + Vacant(entry) => Ok(entry.insert(value)), + } + } + /// Removes a key from the map, returning the value at the key if the key /// was previously in the map. /// @@ -1851,6 +1885,41 @@ impl Debug for VacantEntry<'_, K, V> { } } +/// The error returned by [`try_insert`](HashMap::try_insert) when the key already exists. +/// +/// Contains the occupied entry, and the value that was not inserted. +#[unstable(feature = "map_try_insert", issue = "82766")] +pub struct OccupiedError<'a, K: 'a, V: 'a> { + /// The entry in the map that was already occupied. + pub entry: OccupiedEntry<'a, K, V>, + /// The value which was not inserted, because the entry was already occupied. + pub value: V, +} + +#[unstable(feature = "map_try_insert", issue = "82766")] +impl Debug for OccupiedError<'_, K, V> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("OccupiedError") + .field("key", self.entry.key()) + .field("old_value", self.entry.get()) + .field("new_value", &self.value) + .finish() + } +} + +#[unstable(feature = "map_try_insert", issue = "82766")] +impl<'a, K: Debug, V: Debug> fmt::Display for OccupiedError<'a, K, V> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "failed to insert {:?}, key {:?} already exists with value {:?}", + self.value, + self.entry.key(), + self.entry.get(), + ) + } +} + #[stable(feature = "rust1", since = "1.0.0")] impl<'a, K, V, S> IntoIterator for &'a HashMap { type Item = (&'a K, &'a V); diff --git a/library/std/src/collections/hash/map/tests.rs b/library/std/src/collections/hash/map/tests.rs index 467968354e..819be14222 100644 --- a/library/std/src/collections/hash/map/tests.rs +++ b/library/std/src/collections/hash/map/tests.rs @@ -774,11 +774,11 @@ fn test_occupied_entry_key() { let key = "hello there"; let value = "value goes here"; assert!(a.is_empty()); - a.insert(key.clone(), value.clone()); + a.insert(key, value); assert_eq!(a.len(), 1); assert_eq!(a[key], value); - match a.entry(key.clone()) { + match a.entry(key) { Vacant(_) => panic!(), Occupied(e) => assert_eq!(key, *e.key()), } @@ -793,11 +793,11 @@ fn test_vacant_entry_key() { let value = "value goes here"; assert!(a.is_empty()); - match a.entry(key.clone()) { + match a.entry(key) { Occupied(_) => panic!(), Vacant(e) => { assert_eq!(key, *e.key()); - e.insert(value.clone()); + e.insert(value); } } assert_eq!(a.len(), 1); diff --git a/library/std/src/collections/hash/set.rs b/library/std/src/collections/hash/set.rs index 912e975aa0..8c801b9f12 100644 --- a/library/std/src/collections/hash/set.rs +++ b/library/std/src/collections/hash/set.rs @@ -19,7 +19,7 @@ use super::map::{map_try_reserve_error, RandomState}; // for `bucket.val` in the case of HashSet. I suppose we would need HKT // to get rid of it properly. -/// A hash set implemented as a `HashMap` where the value is `()`. +/// A [hash set] implemented as a `HashMap` where the value is `()`. /// /// As with the [`HashMap`] type, a `HashSet` requires that the elements /// implement the [`Eq`] and [`Hash`] traits. This can frequently be achieved by @@ -105,6 +105,7 @@ use super::map::{map_try_reserve_error, RandomState}; /// // use the values stored in the set /// ``` /// +/// [hash set]: crate::collections#use-the-set-variant-of-any-of-these-maps-when /// [`HashMap`]: crate::collections::HashMap /// [`RefCell`]: crate::cell::RefCell /// [`Cell`]: crate::cell::Cell diff --git a/library/std/src/collections/mod.rs b/library/std/src/collections/mod.rs index 80a13d52a2..8cda601edd 100644 --- a/library/std/src/collections/mod.rs +++ b/library/std/src/collections/mod.rs @@ -401,9 +401,11 @@ #![stable(feature = "rust1", since = "1.0.0")] #[stable(feature = "rust1", since = "1.0.0")] +// FIXME(#82080) The deprecation here is only theoretical, and does not actually produce a warning. #[rustc_deprecated(reason = "moved to `std::ops::Bound`", since = "1.26.0")] #[doc(hidden)] pub use crate::ops::Bound; + #[stable(feature = "rust1", since = "1.0.0")] pub use alloc_crate::collections::{binary_heap, btree_map, btree_set}; #[stable(feature = "rust1", since = "1.0.0")] diff --git a/library/std/src/error.rs b/library/std/src/error.rs index 605d953f5d..80c35307d5 100644 --- a/library/std/src/error.rs +++ b/library/std/src/error.rs @@ -30,6 +30,7 @@ use crate::mem::transmute; use crate::num; use crate::str; use crate::string; +use crate::sync::Arc; /// `Error` is a trait representing the basic expectations for error values, /// i.e., values of type `E` in [`Result`]. Errors must describe @@ -469,6 +470,24 @@ impl Error for char::DecodeUtf16Error { } } +#[unstable(feature = "map_try_insert", issue = "82766")] +impl<'a, K: Debug + Ord, V: Debug> Error + for crate::collections::btree_map::OccupiedError<'a, K, V> +{ + #[allow(deprecated)] + fn description(&self) -> &str { + "key already exists" + } +} + +#[unstable(feature = "map_try_insert", issue = "82766")] +impl<'a, K: Debug, V: Debug> Error for crate::collections::hash_map::OccupiedError<'a, K, V> { + #[allow(deprecated)] + fn description(&self) -> &str { + "key already exists" + } +} + #[stable(feature = "box_error", since = "1.8.0")] impl Error for Box { #[allow(deprecated, deprecated_in_future)] @@ -507,6 +526,27 @@ impl<'a, T: Error + ?Sized> Error for &'a T { } } +#[stable(feature = "arc_error", since = "1.52.0")] +impl Error for Arc { + #[allow(deprecated, deprecated_in_future)] + fn description(&self) -> &str { + Error::description(&**self) + } + + #[allow(deprecated)] + fn cause(&self) -> Option<&dyn Error> { + Error::cause(&**self) + } + + fn source(&self) -> Option<&(dyn Error + 'static)> { + Error::source(&**self) + } + + fn backtrace(&self) -> Option<&Backtrace> { + Error::backtrace(&**self) + } +} + #[stable(feature = "fmt_error", since = "1.11.0")] impl Error for fmt::Error { #[allow(deprecated)] diff --git a/library/std/src/f32.rs b/library/std/src/f32.rs index f51b2c2462..c16d27fa1f 100644 --- a/library/std/src/f32.rs +++ b/library/std/src/f32.rs @@ -503,7 +503,7 @@ impl f32 { unsafe { cmath::fdimf(self, other) } } - /// Returns the cubic root of a number. + /// Returns the cube root of a number. /// /// # Examples /// diff --git a/library/std/src/f64.rs b/library/std/src/f64.rs index 8c41e44868..4c95df5ffe 100644 --- a/library/std/src/f64.rs +++ b/library/std/src/f64.rs @@ -505,7 +505,7 @@ impl f64 { unsafe { cmath::fdim(self, other) } } - /// Returns the cubic root of a number. + /// Returns the cube root of a number. /// /// # Examples /// diff --git a/library/std/src/ffi/c_str.rs b/library/std/src/ffi/c_str.rs index 230ef0b23d..945bfda1b7 100644 --- a/library/std/src/ffi/c_str.rs +++ b/library/std/src/ffi/c_str.rs @@ -62,20 +62,18 @@ use crate::sys; /// u8` argument which is not necessarily nul-terminated, plus another /// argument with the length of the string — like C's `strndup()`. /// You can of course get the slice's length with its -/// [`len`][slice.len] method. +/// [`len`][slice::len] method. /// /// If you need a `&[`[`u8`]`]` slice *with* the nul terminator, you /// can use [`CString::as_bytes_with_nul`] instead. /// /// Once you have the kind of slice you need (with or without a nul /// terminator), you can call the slice's own -/// [`as_ptr`][slice.as_ptr] method to get a read-only raw pointer to pass to +/// [`as_ptr`][slice::as_ptr] method to get a read-only raw pointer to pass to /// extern functions. See the documentation for that function for a /// discussion on ensuring the lifetime of the raw pointer. /// /// [`&str`]: prim@str -/// [slice.as_ptr]: ../primitive.slice.html#method.as_ptr -/// [slice.len]: ../primitive.slice.html#method.len /// [`Deref`]: ops::Deref /// [`&CStr`]: CStr /// diff --git a/library/std/src/ffi/os_str.rs b/library/std/src/ffi/os_str.rs index c9c8f68cd9..ce52ffc024 100644 --- a/library/std/src/ffi/os_str.rs +++ b/library/std/src/ffi/os_str.rs @@ -5,6 +5,7 @@ use crate::borrow::{Borrow, Cow}; use crate::cmp; use crate::fmt; use crate::hash::{Hash, Hasher}; +use crate::iter::{Extend, FromIterator}; use crate::ops; use crate::rc::Rc; use crate::str::FromStr; @@ -71,11 +72,16 @@ use crate::sys_common::{AsInner, FromInner, IntoInner}; /// [`CStr`]: crate::ffi::CStr /// [conversions]: super#conversions #[derive(Clone)] +#[cfg_attr(not(test), rustc_diagnostic_item = "OsString")] #[stable(feature = "rust1", since = "1.0.0")] pub struct OsString { inner: Buf, } +/// Allows extension traits within `std`. +#[unstable(feature = "sealed", issue = "none")] +impl crate::sealed::Sealed for OsString {} + /// Borrowed reference to an OS string (see [`OsString`]). /// /// This type represents a borrowed reference to a string in the operating system's preferred @@ -89,6 +95,7 @@ pub struct OsString { /// /// [`&str`]: str /// [conversions]: super#conversions +#[cfg_attr(not(test), rustc_diagnostic_item = "OsStr")] #[stable(feature = "rust1", since = "1.0.0")] // FIXME: // `OsStr::from_inner` current implementation relies @@ -100,6 +107,10 @@ pub struct OsStr { inner: Slice, } +/// Allows extension traits within `std`. +#[unstable(feature = "sealed", issue = "none")] +impl crate::sealed::Sealed for OsStr {} + impl OsString { /// Constructs a new empty `OsString`. /// @@ -1182,3 +1193,88 @@ impl FromStr for OsString { Ok(OsString::from(s)) } } + +#[stable(feature = "osstring_extend", since = "1.52.0")] +impl Extend for OsString { + #[inline] + fn extend>(&mut self, iter: T) { + for s in iter { + self.push(&s); + } + } +} + +#[stable(feature = "osstring_extend", since = "1.52.0")] +impl<'a> Extend<&'a OsStr> for OsString { + #[inline] + fn extend>(&mut self, iter: T) { + for s in iter { + self.push(s); + } + } +} + +#[stable(feature = "osstring_extend", since = "1.52.0")] +impl<'a> Extend> for OsString { + #[inline] + fn extend>>(&mut self, iter: T) { + for s in iter { + self.push(&s); + } + } +} + +#[stable(feature = "osstring_extend", since = "1.52.0")] +impl FromIterator for OsString { + #[inline] + fn from_iter>(iter: I) -> Self { + let mut iterator = iter.into_iter(); + + // Because we're iterating over `OsString`s, we can avoid at least + // one allocation by getting the first string from the iterator + // and appending to it all the subsequent strings. + match iterator.next() { + None => OsString::new(), + Some(mut buf) => { + buf.extend(iterator); + buf + } + } + } +} + +#[stable(feature = "osstring_extend", since = "1.52.0")] +impl<'a> FromIterator<&'a OsStr> for OsString { + #[inline] + fn from_iter>(iter: I) -> Self { + let mut buf = Self::new(); + for s in iter { + buf.push(s); + } + buf + } +} + +#[stable(feature = "osstring_extend", since = "1.52.0")] +impl<'a> FromIterator> for OsString { + #[inline] + fn from_iter>>(iter: I) -> Self { + let mut iterator = iter.into_iter(); + + // Because we're iterating over `OsString`s, we can avoid at least + // one allocation by getting the first owned string from the iterator + // and appending to it all the subsequent strings. + match iterator.next() { + None => OsString::new(), + Some(Cow::Owned(mut buf)) => { + buf.extend(iterator); + buf + } + Some(Cow::Borrowed(buf)) => { + let mut buf = OsString::from(buf); + buf.extend(iterator); + buf + } + } + } +} diff --git a/library/std/src/io/buffered/bufreader.rs b/library/std/src/io/buffered/bufreader.rs index 987371f50e..02b0fc0c57 100644 --- a/library/std/src/io/buffered/bufreader.rs +++ b/library/std/src/io/buffered/bufreader.rs @@ -1,6 +1,8 @@ use crate::cmp; use crate::fmt; -use crate::io::{self, BufRead, Initializer, IoSliceMut, Read, Seek, SeekFrom, DEFAULT_BUF_SIZE}; +use crate::io::{ + self, BufRead, Initializer, IoSliceMut, Read, Seek, SeekFrom, SizeHint, DEFAULT_BUF_SIZE, +}; /// The `BufReader` struct adds buffering to any reader. /// @@ -90,10 +92,9 @@ impl BufReader { #[stable(feature = "rust1", since = "1.0.0")] pub fn with_capacity(capacity: usize, inner: R) -> BufReader { unsafe { - let mut buffer = Vec::with_capacity(capacity); - buffer.set_len(capacity); - inner.initializer().initialize(&mut buffer); - BufReader { inner, buf: buffer.into_boxed_slice(), pos: 0, cap: 0 } + let mut buf = Box::new_uninit_slice(capacity).assume_init(); + inner.initializer().initialize(&mut buf); + BufReader { inner, buf, pos: 0, cap: 0 } } } } @@ -435,3 +436,9 @@ impl Seek for BufReader { }) } } + +impl SizeHint for BufReader { + fn lower_bound(&self) -> usize { + self.buffer().len() + } +} diff --git a/library/std/src/io/copy.rs b/library/std/src/io/copy.rs index 3780f2044c..eb60df214c 100644 --- a/library/std/src/io/copy.rs +++ b/library/std/src/io/copy.rs @@ -106,7 +106,7 @@ impl BufferedCopySpec for BufWriter { Ok(0) => return Ok(len), // EOF reached Ok(bytes_read) => { assert!(bytes_read <= spare_cap.len()); - // Safety: The initializer contract guarantees that either it or `read` + // SAFETY: The initializer contract guarantees that either it or `read` // will have initialized these bytes. And we just checked that the number // of bytes is within the buffer capacity. unsafe { buf.set_len(buf.len() + bytes_read) }; diff --git a/library/std/src/io/impls.rs b/library/std/src/io/impls.rs index 00bf8b9af7..9870cfc4c9 100644 --- a/library/std/src/io/impls.rs +++ b/library/std/src/io/impls.rs @@ -1,6 +1,7 @@ #[cfg(test)] mod tests; +use crate::alloc::Allocator; use crate::cmp; use crate::fmt; use crate::io::{ @@ -357,7 +358,7 @@ impl Write for &mut [u8] { /// Write is implemented for `Vec` by appending to the vector. /// The vector will grow as needed. #[stable(feature = "rust1", since = "1.0.0")] -impl Write for Vec { +impl Write for Vec { #[inline] fn write(&mut self, buf: &[u8]) -> io::Result { self.extend_from_slice(buf); diff --git a/library/std/src/io/mod.rs b/library/std/src/io/mod.rs index db3b0e2628..6abb300054 100644 --- a/library/std/src/io/mod.rs +++ b/library/std/src/io/mod.rs @@ -482,7 +482,7 @@ pub(crate) fn default_read_exact(this: &mut R, mut buf: &mut [ /// } /// ``` /// -/// Read from [`&str`] because [`&[u8]`][slice] implements `Read`: +/// Read from [`&str`] because [`&[u8]`][prim@slice] implements `Read`: /// /// ```no_run /// # use std::io; @@ -504,7 +504,6 @@ pub(crate) fn default_read_exact(this: &mut R, mut buf: &mut [ /// [`&str`]: prim@str /// [`std::io`]: self /// [`File`]: crate::fs::File -/// [slice]: ../../std/primitive.slice.html #[stable(feature = "rust1", since = "1.0.0")] #[doc(spotlight)] pub trait Read { @@ -515,8 +514,8 @@ pub trait Read { /// waiting for data, but if an object needs to block for a read and cannot, /// it will typically signal this via an [`Err`] return value. /// - /// If the return value of this method is [`Ok(n)`], then it must be - /// guaranteed that `0 <= n <= buf.len()`. A nonzero `n` value indicates + /// If the return value of this method is [`Ok(n)`], then implementations must + /// guarantee that `0 <= n <= buf.len()`. A nonzero `n` value indicates /// that the buffer `buf` has been filled in with `n` bytes of data from this /// source. If `n` is `0`, then it can indicate one of two scenarios: /// @@ -530,6 +529,11 @@ pub trait Read { /// This may happen for example because fewer bytes are actually available right now /// (e. g. being close to end-of-file) or because read() was interrupted by a signal. /// + /// As this trait is safe to implement, callers cannot rely on `n <= buf.len()` for safety. + /// Extra care needs to be taken when `unsafe` functions are used to access the read bytes. + /// Callers have to ensure that no unchecked out-of-bounds accesses are possible even if + /// `n > buf.len()`. + /// /// No guarantees are provided about the contents of `buf` when this /// function is called, implementations cannot rely on any property of the /// contents of `buf` being true. It is recommended that *implementations* @@ -2239,6 +2243,19 @@ impl BufRead for Chain { } } +impl SizeHint for Chain { + fn lower_bound(&self) -> usize { + SizeHint::lower_bound(&self.first) + SizeHint::lower_bound(&self.second) + } + + fn upper_bound(&self) -> Option { + match (SizeHint::upper_bound(&self.first), SizeHint::upper_bound(&self.second)) { + (Some(first), Some(second)) => Some(first + second), + _ => None, + } + } +} + /// Reader adaptor which limits the bytes read from an underlying reader. /// /// This struct is generally created by calling [`take`] on a reader. @@ -2465,6 +2482,30 @@ impl Iterator for Bytes { }; } } + + fn size_hint(&self) -> (usize, Option) { + SizeHint::size_hint(&self.inner) + } +} + +trait SizeHint { + fn lower_bound(&self) -> usize; + + fn upper_bound(&self) -> Option; + + fn size_hint(&self) -> (usize, Option) { + (self.lower_bound(), self.upper_bound()) + } +} + +impl SizeHint for T { + default fn lower_bound(&self) -> usize { + 0 + } + + default fn upper_bound(&self) -> Option { + None + } } /// An iterator over the contents of an instance of `BufRead` split on a diff --git a/library/std/src/io/stdio.rs b/library/std/src/io/stdio.rs index 1160011f35..1e72c9e061 100644 --- a/library/std/src/io/stdio.rs +++ b/library/std/src/io/stdio.rs @@ -231,7 +231,7 @@ pub struct Stdin { inner: &'static Mutex>, } -/// A locked reference to the `Stdin` handle. +/// A locked reference to the [`Stdin`] handle. /// /// This handle implements both the [`Read`] and [`BufRead`] traits, and /// is constructed via the [`Stdin::lock`] method. @@ -251,8 +251,8 @@ pub struct Stdin { /// let mut buffer = String::new(); /// let stdin = io::stdin(); // We get `Stdin` here. /// { -/// let mut stdin_lock = stdin.lock(); // We get `StdinLock` here. -/// stdin_lock.read_to_string(&mut buffer)?; +/// let mut handle = stdin.lock(); // We get `StdinLock` here. +/// handle.read_to_string(&mut buffer)?; /// } // `StdinLock` is dropped here. /// Ok(()) /// } @@ -494,10 +494,10 @@ pub struct Stdout { inner: Pin<&'static ReentrantMutex>>>, } -/// A locked reference to the `Stdout` handle. +/// A locked reference to the [`Stdout`] handle. /// /// This handle implements the [`Write`] trait, and is constructed via -/// the [`Stdout::lock`] method. +/// the [`Stdout::lock`] method. See its documentation for more. /// /// ### Note: Windows Portability Consideration /// When operating in a console, the Windows implementation of this stream does not support @@ -708,10 +708,10 @@ pub struct Stderr { inner: Pin<&'static ReentrantMutex>>, } -/// A locked reference to the `Stderr` handle. +/// A locked reference to the [`Stderr`] handle. /// -/// This handle implements the `Write` trait and is constructed via -/// the [`Stderr::lock`] method. +/// This handle implements the [`Write`] trait and is constructed via +/// the [`Stderr::lock`] method. See its documentation for more. /// /// ### Note: Windows Portability Consideration /// When operating in a console, the Windows implementation of this stream does not support diff --git a/library/std/src/io/tests.rs b/library/std/src/io/tests.rs index f176c2f088..a85dd0d982 100644 --- a/library/std/src/io/tests.rs +++ b/library/std/src/io/tests.rs @@ -1,7 +1,7 @@ use super::{repeat, Cursor, SeekFrom}; use crate::cmp::{self, min}; use crate::io::{self, IoSlice, IoSliceMut}; -use crate::io::{BufRead, Read, Seek, Write}; +use crate::io::{BufRead, BufReader, Read, Seek, Write}; use crate::ops::Deref; #[test] @@ -198,6 +198,53 @@ fn chain_bufread() { cmp_bufread(chain1, chain2, &testdata[..]); } +#[test] +fn bufreader_size_hint() { + let testdata = b"ABCDEFGHIJKL"; + let mut buf_reader = BufReader::new(&testdata[..]); + assert_eq!(buf_reader.buffer().len(), 0); + + let buffer_length = testdata.len(); + buf_reader.fill_buf().unwrap(); + + // Check that size hint matches buffer contents + let mut buffered_bytes = buf_reader.bytes(); + let (lower_bound, _upper_bound) = buffered_bytes.size_hint(); + assert_eq!(lower_bound, buffer_length); + + // Check that size hint matches buffer contents after advancing + buffered_bytes.next().unwrap().unwrap(); + let (lower_bound, _upper_bound) = buffered_bytes.size_hint(); + assert_eq!(lower_bound, buffer_length - 1); +} + +#[test] +fn empty_size_hint() { + let size_hint = io::empty().bytes().size_hint(); + assert_eq!(size_hint, (0, Some(0))); +} + +#[test] +fn chain_empty_size_hint() { + let chain = io::empty().chain(io::empty()); + let size_hint = chain.bytes().size_hint(); + assert_eq!(size_hint, (0, Some(0))); +} + +#[test] +fn chain_size_hint() { + let testdata = b"ABCDEFGHIJKL"; + let mut buf_reader_1 = BufReader::new(&testdata[..6]); + let mut buf_reader_2 = BufReader::new(&testdata[6..]); + + buf_reader_1.fill_buf().unwrap(); + buf_reader_2.fill_buf().unwrap(); + + let chain = buf_reader_1.chain(buf_reader_2); + let size_hint = chain.bytes().size_hint(); + assert_eq!(size_hint, (testdata.len(), None)); +} + #[test] fn chain_zero_length_read_is_not_eof() { let a = b"A"; diff --git a/library/std/src/io/util.rs b/library/std/src/io/util.rs index e43ce4cdb4..f472361f91 100644 --- a/library/std/src/io/util.rs +++ b/library/std/src/io/util.rs @@ -4,7 +4,9 @@ mod tests; use crate::fmt; -use crate::io::{self, BufRead, Initializer, IoSlice, IoSliceMut, Read, Seek, SeekFrom, Write}; +use crate::io::{ + self, BufRead, Initializer, IoSlice, IoSliceMut, Read, Seek, SeekFrom, SizeHint, Write, +}; /// A reader which is always at EOF. /// @@ -80,6 +82,12 @@ impl fmt::Debug for Empty { } } +impl SizeHint for Empty { + fn upper_bound(&self) -> Option { + Some(0) + } +} + /// A reader which yields one byte over and over and over and over and over and... /// /// This struct is generally created by calling [`repeat()`]. Please diff --git a/library/std/src/keyword_docs.rs b/library/std/src/keyword_docs.rs index 6b06539a09..383eaf2e3a 100644 --- a/library/std/src/keyword_docs.rs +++ b/library/std/src/keyword_docs.rs @@ -42,7 +42,7 @@ /// [Reference]: ../reference/expressions/operator-expr.html#type-cast-expressions /// [`crate`]: keyword.crate.html /// [`use`]: keyword.use.html -/// [const-cast]: primitive.pointer.html#method.cast +/// [const-cast]: pointer::cast /// [mut-cast]: primitive.pointer.html#method.cast-1 mod as_keyword {} @@ -181,9 +181,8 @@ mod break_keyword {} /// The `const` keyword is also used in raw pointers in combination with `mut`, as seen in `*const /// T` and `*mut T`. More about `const` as used in raw pointers can be read at the Rust docs for the [pointer primitive]. /// -/// [pointer primitive]: primitive.pointer.html -/// [Rust Book]: -/// ../book/ch03-01-variables-and-mutability.html#differences-between-variables-and-constants +/// [pointer primitive]: pointer +/// [Rust Book]: ../book/ch03-01-variables-and-mutability.html#differences-between-variables-and-constants /// [Reference]: ../reference/items/constant-items.html /// [const-eval]: ../reference/const_eval.html mod const_keyword {} @@ -371,7 +370,6 @@ mod else_keyword {} /// [ADT]: https://en.wikipedia.org/wiki/Algebraic_data_type /// [Rust Book]: ../book/ch06-01-defining-an-enum.html /// [Reference]: ../reference/items/enumerations.html -/// [`!`]: primitive.never.html mod enum_keyword {} #[doc(keyword = "extern")] diff --git a/library/std/src/lazy.rs b/library/std/src/lazy.rs index 68f57958bb..974851a8bd 100644 --- a/library/std/src/lazy.rs +++ b/library/std/src/lazy.rs @@ -177,7 +177,10 @@ impl SyncOnceCell { /// Sets the contents of this cell to `value`. /// - /// Returns `Ok(())` if the cell's value was updated. + /// May block if another thread is currently attempting to initialize the cell. The cell is + /// guaranteed to contain a value when set returns, though not necessarily the one provided. + /// + /// Returns `Ok(())` if the cell's value was set by this call. /// /// # Examples /// @@ -440,13 +443,17 @@ impl SyncOnceCell { res } - /// Safety: The value must be initialized + /// # Safety + /// + /// The value must be initialized unsafe fn get_unchecked(&self) -> &T { debug_assert!(self.is_initialized()); (&*self.value.get()).assume_init_ref() } - /// Safety: The value must be initialized + /// # Safety + /// + /// The value must be initialized unsafe fn get_unchecked_mut(&mut self) -> &mut T { debug_assert!(self.is_initialized()); (&mut *self.value.get()).assume_init_mut() @@ -456,7 +463,7 @@ impl SyncOnceCell { unsafe impl<#[may_dangle] T> Drop for SyncOnceCell { fn drop(&mut self) { if self.is_initialized() { - // Safety: The cell is initialized and being dropped, so it can't + // SAFETY: The cell is initialized and being dropped, so it can't // be accessed again. We also don't touch the `T` other than // dropping it, which validates our usage of #[may_dangle]. unsafe { (&mut *self.value.get()).assume_init_drop() }; diff --git a/library/std/src/lazy/tests.rs b/library/std/src/lazy/tests.rs index a170edbd99..83466eb090 100644 --- a/library/std/src/lazy/tests.rs +++ b/library/std/src/lazy/tests.rs @@ -48,6 +48,7 @@ fn spawn_and_wait(f: impl FnOnce() -> R + Send + 'static) -> } #[test] +#[cfg_attr(target_os = "emscripten", ignore)] fn sync_once_cell() { static ONCE_CELL: SyncOnceCell = SyncOnceCell::new(); @@ -81,6 +82,7 @@ fn sync_once_cell_get_unchecked() { } #[test] +#[cfg_attr(target_os = "emscripten", ignore)] fn sync_once_cell_drop() { static DROP_CNT: AtomicUsize = AtomicUsize::new(0); struct Dropper; @@ -158,6 +160,7 @@ fn into_inner() { } #[test] +#[cfg_attr(target_os = "emscripten", ignore)] fn sync_lazy_new() { static CALLED: AtomicUsize = AtomicUsize::new(0); static SYNC_LAZY: SyncLazy = SyncLazy::new(|| { @@ -204,6 +207,7 @@ fn sync_lazy_default() { } #[test] +#[cfg_attr(target_os = "emscripten", ignore)] fn static_sync_lazy() { static XS: SyncLazy> = SyncLazy::new(|| { let mut xs = Vec::new(); @@ -279,6 +283,7 @@ fn eval_once_macro() { } #[test] +#[cfg_attr(target_os = "emscripten", ignore)] fn sync_once_cell_does_not_leak_partially_constructed_boxes() { static ONCE_CELL: SyncOnceCell = SyncOnceCell::new(); diff --git a/library/std/src/lib.rs b/library/std/src/lib.rs index 961cff661e..8149858e10 100644 --- a/library/std/src/lib.rs +++ b/library/std/src/lib.rs @@ -61,14 +61,14 @@ //! type, but not the all-important methods. //! //! So for example there is a [page for the primitive type -//! `i32`](primitive.i32.html) that lists all the methods that can be called on +//! `i32`](primitive::i32) that lists all the methods that can be called on //! 32-bit integers (very useful), and there is a [page for the module //! `std::i32`] that documents the constant values [`MIN`] and [`MAX`] (rarely //! useful). //! -//! Note the documentation for the primitives [`str`] and [`[T]`][slice] (also +//! Note the documentation for the primitives [`str`] and [`[T]`][prim@slice] (also //! called 'slice'). Many method calls on [`String`] and [`Vec`] are actually -//! calls to methods on [`str`] and [`[T]`][slice] respectively, via [deref +//! calls to methods on [`str`] and [`[T]`][prim@slice] respectively, via [deref //! coercions][deref-coercions]. //! //! Third, the standard library defines [The Rust Prelude], a small collection @@ -111,8 +111,8 @@ //! regions of memory: //! //! * [`Vec`] - A heap-allocated *vector* that is resizable at runtime. -//! * [`[T; n]`][array] - An inline *array* with a fixed size at compile time. -//! * [`[T]`][slice] - A dynamically sized *slice* into any other kind of contiguous +//! * [`[T; N]`][prim@array] - An inline *array* with a fixed size at compile time. +//! * [`[T]`][prim@slice] - A dynamically sized *slice* into any other kind of contiguous //! storage, whether heap-allocated or not. //! //! Slices can only be handled through some kind of *pointer*, and as such come @@ -185,8 +185,8 @@ //! [other]: #what-is-in-the-standard-library-documentation //! [primitive types]: ../book/ch03-02-data-types.html //! [rust-discord]: https://discord.gg/rust-lang -#![cfg_attr(not(bootstrap), doc = "[array]: prim@array")] -#![cfg_attr(not(bootstrap), doc = "[slice]: prim@slice")] +//! [array]: prim@array +//! [slice]: prim@slice #![cfg_attr(not(feature = "restricted-std"), stable(feature = "rust1", since = "1.0.0"))] #![cfg_attr(feature = "restricted-std", unstable(feature = "restricted_std", issue = "none"))] #![doc( @@ -228,11 +228,13 @@ #![feature(arbitrary_self_types)] #![feature(array_error_internals)] #![feature(asm)] +#![feature(assert_matches)] #![feature(associated_type_bounds)] #![feature(atomic_mut_ptr)] #![feature(box_syntax)] #![feature(c_variadic)] #![feature(cfg_accessible)] +#![cfg_attr(not(bootstrap), feature(cfg_eval))] #![feature(cfg_target_has_atomic)] #![feature(cfg_target_thread_local)] #![feature(char_error_internals)] @@ -263,8 +265,7 @@ #![feature(exact_size_is_empty)] #![feature(exhaustive_patterns)] #![feature(extend_one)] -#![feature(external_doc)] -#![feature(fmt_as_str)] +#![feature(extended_key_value_attributes)] #![feature(fn_traits)] #![feature(format_args_nl)] #![feature(gen_future)] @@ -276,11 +277,13 @@ #![feature(int_error_matching)] #![feature(integer_atomics)] #![feature(into_future)] +#![feature(intra_doc_pointers)] #![feature(lang_items)] #![feature(link_args)] #![feature(linkage)] #![feature(llvm_asm)] #![feature(log_syntax)] +#![feature(map_try_insert)] #![feature(maybe_uninit_extra)] #![feature(maybe_uninit_ref)] #![feature(maybe_uninit_slice)] @@ -289,6 +292,7 @@ #![feature(needs_panic_runtime)] #![feature(negative_impls)] #![feature(never_type)] +#![feature(new_uninit)] #![feature(nll)] #![feature(nonnull_slice_from_raw_parts)] #![feature(once_cell)] @@ -298,6 +302,7 @@ #![feature(panic_internals)] #![feature(panic_unwind)] #![feature(pin_static_ref)] +#![feature(prelude_2021)] #![feature(prelude_import)] #![feature(ptr_internals)] #![feature(raw)] @@ -314,7 +319,6 @@ #![feature(stdsimd)] #![feature(stmt_expr_attributes)] #![feature(str_internals)] -#![feature(str_split_once)] #![feature(test)] #![feature(thread_local)] #![feature(thread_local_internals)] @@ -324,7 +328,7 @@ #![feature(try_blocks)] #![feature(try_reserve)] #![feature(unboxed_closures)] -#![feature(unsafe_block_in_unsafe_fn)] +#![cfg_attr(bootstrap, feature(unsafe_block_in_unsafe_fn))] #![feature(unsafe_cell_raw_get)] #![feature(unwind_attributes)] #![feature(vec_into_raw_parts)] @@ -392,7 +396,11 @@ 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)] +// The `no_inline`-attribute is required to make the documentation of all +// targets available. +// See https://github.com/rust-lang/rust/pull/57808#issuecomment-457390549 for +// more information. +#[doc(no_inline)] // Note (#82861): required for correct documentation pub use core::arch; #[stable(feature = "core_array", since = "1.36.0")] pub use core::array; @@ -551,8 +559,8 @@ pub use std_detect::detect; #[stable(feature = "rust1", since = "1.0.0")] #[allow(deprecated, deprecated_in_future)] pub use core::{ - assert_eq, assert_ne, debug_assert, debug_assert_eq, debug_assert_ne, matches, r#try, todo, - unimplemented, unreachable, write, writeln, + assert_eq, assert_matches, assert_ne, debug_assert, debug_assert_eq, debug_assert_matches, + debug_assert_ne, matches, r#try, todo, unimplemented, unreachable, write, writeln, }; // Re-export built-in macros defined through libcore. @@ -582,3 +590,11 @@ include!("keyword_docs.rs"); // is unconditional, so the unstable feature needs to be defined somewhere. #[unstable(feature = "restricted_std", issue = "none")] mod __restricted_std_workaround {} + +mod sealed { + /// This trait being unreachable from outside the crate + /// prevents outside implementations of our extension traits. + /// This allows adding more trait methods in the future. + #[unstable(feature = "sealed", issue = "none")] + pub trait Sealed {} +} diff --git a/library/std/src/macros.rs b/library/std/src/macros.rs index 0ce6542cb7..b729349cf5 100644 --- a/library/std/src/macros.rs +++ b/library/std/src/macros.rs @@ -4,22 +4,7 @@ //! library. Each macro is available for use when linking against the standard //! library. -#[cfg(bootstrap)] -#[doc(include = "../../core/src/macros/panic.md")] -#[macro_export] -#[stable(feature = "rust1", since = "1.0.0")] -#[allow_internal_unstable(libstd_sys_internals)] -#[cfg_attr(not(test), rustc_diagnostic_item = "std_panic_macro")] -macro_rules! panic { - () => ({ $crate::panic!("explicit panic") }); - ($msg:expr $(,)?) => ({ $crate::rt::begin_panic($msg) }); - ($fmt:expr, $($arg:tt)+) => ({ - $crate::rt::begin_panic_fmt(&$crate::format_args!($fmt, $($arg)+)) - }); -} - -#[cfg(not(bootstrap))] -#[doc(include = "../../core/src/macros/panic.md")] +#[doc = include_str!("../../core/src/macros/panic.md")] #[macro_export] #[rustc_builtin_macro = "std_panic"] #[stable(feature = "rust1", since = "1.0.0")] diff --git a/library/std/src/net/parser.rs b/library/std/src/net/parser.rs index e8b89626fb..7064ed3ed2 100644 --- a/library/std/src/net/parser.rs +++ b/library/std/src/net/parser.rs @@ -35,7 +35,7 @@ macro_rules! impl_helper { impl_helper! { u8 u16 u32 } struct Parser<'a> { - // parsing as ASCII, so can use byte array + // Parsing as ASCII, so can use byte array. state: &'a [u8], } @@ -44,7 +44,7 @@ impl<'a> Parser<'a> { Parser { state: input.as_bytes() } } - /// Run a parser, and restore the pre-parse state if it fails + /// Run a parser, and restore the pre-parse state if it fails. fn read_atomically(&mut self, inner: F) -> Option where F: FnOnce(&mut Parser<'_>) -> Option, @@ -126,7 +126,7 @@ impl<'a> Parser<'a> { }) } - /// Read an IPv4 address + /// Read an IPv4 address. fn read_ipv4_addr(&mut self) -> Option { self.read_atomically(|p| { let mut groups = [0; 4]; @@ -139,18 +139,18 @@ impl<'a> Parser<'a> { }) } - /// Read an IPV6 Address + /// Read an IPv6 Address. fn read_ipv6_addr(&mut self) -> Option { - /// Read a chunk of an ipv6 address into `groups`. Returns the number + /// Read a chunk of an IPv6 address into `groups`. Returns the number /// of groups read, along with a bool indicating if an embedded - /// trailing ipv4 address was read. Specifically, read a series of - /// colon-separated ipv6 groups (0x0000 - 0xFFFF), with an optional - /// trailing embedded ipv4 address. + /// trailing IPv4 address was read. Specifically, read a series of + /// colon-separated IPv6 groups (0x0000 - 0xFFFF), with an optional + /// trailing embedded IPv4 address. fn read_groups(p: &mut Parser<'_>, groups: &mut [u16]) -> (usize, bool) { let limit = groups.len(); for (i, slot) in groups.iter_mut().enumerate() { - // Try to read a trailing embedded ipv4 address. There must be + // Try to read a trailing embedded IPv4 address. There must be // at least two groups left. if i < limit - 1 { let ipv4 = p.read_separator(':', i, |p| p.read_ipv4_addr()); @@ -188,8 +188,8 @@ impl<'a> Parser<'a> { return None; } - // read `::` if previous code parsed less than 8 groups - // `::` indicates one or more groups of 16 bits of zeros + // Read `::` if previous code parsed less than 8 groups. + // `::` indicates one or more groups of 16 bits of zeros. p.read_given_char(':')?; p.read_given_char(':')?; @@ -206,12 +206,12 @@ impl<'a> Parser<'a> { }) } - /// Read an IP Address, either IPV4 or IPV6. + /// Read an IP Address, either IPv4 or IPv6. fn read_ip_addr(&mut self) -> Option { self.read_ipv4_addr().map(IpAddr::V4).or_else(move || self.read_ipv6_addr().map(IpAddr::V6)) } - /// Read a : followed by a port in base 10. + /// Read a `:` followed by a port in base 10. fn read_port(&mut self) -> Option { self.read_atomically(|p| { p.read_given_char(':')?; @@ -219,7 +219,7 @@ impl<'a> Parser<'a> { }) } - /// Read a % followed by a scope id in base 10. + /// Read a `%` followed by a scope ID in base 10. fn read_scope_id(&mut self) -> Option { self.read_atomically(|p| { p.read_given_char('%')?; @@ -227,7 +227,7 @@ impl<'a> Parser<'a> { }) } - /// Read an IPV4 address with a port + /// Read an IPv4 address with a port. fn read_socket_addr_v4(&mut self) -> Option { self.read_atomically(|p| { let ip = p.read_ipv4_addr()?; @@ -236,7 +236,7 @@ impl<'a> Parser<'a> { }) } - /// Read an IPV6 address with a port + /// Read an IPv6 address with a port. fn read_socket_addr_v6(&mut self) -> Option { self.read_atomically(|p| { p.read_given_char('[')?; diff --git a/library/std/src/os/haiku/raw.rs b/library/std/src/os/haiku/raw.rs index 0d7e70b6b3..48117d288a 100644 --- a/library/std/src/os/haiku/raw.rs +++ b/library/std/src/os/haiku/raw.rs @@ -1,6 +1,13 @@ //! Haiku-specific raw type definitions #![stable(feature = "raw_ext", since = "1.1.0")] +#![rustc_deprecated( + since = "1.53.0", + reason = "these type aliases are no longer supported by \ + the standard library, the `libc` crate on \ + crates.io should be used instead for the correct \ + definitions" +)] #![allow(deprecated)] use crate::os::raw::c_long; diff --git a/library/std/src/os/mod.rs b/library/std/src/os/mod.rs index fd6ee088e9..b95511e43d 100644 --- a/library/std/src/os/mod.rs +++ b/library/std/src/os/mod.rs @@ -3,40 +3,48 @@ #![stable(feature = "os", since = "1.0.0")] #![allow(missing_docs, nonstandard_style, missing_debug_implementations)] -cfg_if::cfg_if! { - if #[cfg(doc)] { +// When documenting libstd we want to show unix/windows/linux/wasi modules as these are the "main +// modules" that are used across platforms, so all modules are enabled when `cfg(doc)` is set. +// This should help show platform-specific functionality in a hopefully cross-platform way in the +// documentation. +// Note that we deliberately avoid `cfg_if!` here to work around a rust-analyzer bug that would make +// `std::os` submodules unusable: https://github.com/rust-analyzer/rust-analyzer/issues/6038 - // When documenting libstd we want to show unix/windows/linux modules as - // these are the "main modules" that are used across platforms. This - // should help show platform-specific functionality in a hopefully - // cross-platform way in the documentation +#[cfg(doc)] +#[stable(feature = "rust1", since = "1.0.0")] +pub use crate::sys::unix_ext as unix; - #[stable(feature = "rust1", since = "1.0.0")] - pub use crate::sys::unix_ext as unix; +#[cfg(doc)] +#[stable(feature = "rust1", since = "1.0.0")] +pub use crate::sys::windows_ext as windows; - #[stable(feature = "rust1", since = "1.0.0")] - pub use crate::sys::windows_ext as windows; +#[cfg(doc)] +#[doc(cfg(target_os = "linux"))] +pub mod linux; - #[doc(cfg(target_os = "linux"))] - pub mod linux; - } else { +#[cfg(doc)] +#[stable(feature = "wasi_ext_doc", since = "1.35.0")] +pub use crate::sys::wasi_ext as wasi; - // If we're not documenting libstd then we just expose the main modules - // as we otherwise would. +// If we're not documenting libstd then we just expose the main modules as we otherwise would. - #[cfg(any(target_os = "redox", unix, target_os = "vxworks", target_os = "hermit"))] - #[stable(feature = "rust1", since = "1.0.0")] - pub use crate::sys::ext as unix; +#[cfg(not(doc))] +#[cfg(any(unix, target_os = "hermit"))] +#[stable(feature = "rust1", since = "1.0.0")] +pub use crate::sys::ext as unix; - #[cfg(windows)] - #[stable(feature = "rust1", since = "1.0.0")] - pub use crate::sys::ext as windows; +#[cfg(not(doc))] +#[cfg(windows)] +#[stable(feature = "rust1", since = "1.0.0")] +pub use crate::sys::ext as windows; - #[cfg(any(target_os = "linux", target_os = "l4re"))] - pub mod linux; +#[cfg(not(doc))] +#[cfg(any(target_os = "linux", target_os = "l4re"))] +pub mod linux; - } -} +#[cfg(not(doc))] +#[cfg(target_os = "wasi")] +pub mod wasi; #[cfg(target_os = "android")] pub mod android; @@ -68,7 +76,5 @@ pub mod redox; pub mod solaris; #[cfg(target_os = "vxworks")] pub mod vxworks; -#[cfg(target_os = "wasi")] -pub mod wasi; pub mod raw; diff --git a/library/std/src/os/raw/mod.rs b/library/std/src/os/raw/mod.rs index 16272aa057..50464a050c 100644 --- a/library/std/src/os/raw/mod.rs +++ b/library/std/src/os/raw/mod.rs @@ -11,7 +11,41 @@ #[cfg(test)] mod tests; -#[doc(include = "char.md")] +use core::num::*; + +macro_rules! type_alias_no_nz { + { + $Docfile:tt, $Alias:ident = $Real:ty; + $( $Cfg:tt )* + } => { + #[doc = include_str!($Docfile)] + $( $Cfg )* + #[stable(feature = "raw_os", since = "1.1.0")] + pub type $Alias = $Real; + } +} + +// To verify that the NonZero types in this file's macro invocations correspond +// +// perl -n < library/std/src/os/raw/mod.rs -e 'next unless m/type_alias\!/; die "$_ ?" unless m/, (c_\w+) = (\w+), NonZero_(\w+) = NonZero(\w+)/; die "$_ ?" unless $3 eq $1 and $4 eq ucfirst $2' +// +// NB this does not check that the main c_* types are right. + +macro_rules! type_alias { + { + $Docfile:tt, $Alias:ident = $Real:ty, $NZAlias:ident = $NZReal:ty; + $( $Cfg:tt )* + } => { + type_alias_no_nz! { $Docfile, $Alias = $Real; $( $Cfg )* } + + #[doc = concat!("Type alias for `NonZero` version of [`", stringify!($Alias), "`]")] + #[unstable(feature = "raw_os_nonzero", issue = "82363")] + $( $Cfg )* + pub type $NZAlias = $NZReal; + } +} + +type_alias! { "char.md", c_char = u8, NonZero_c_char = NonZeroU8; #[cfg(any( all( target_os = "linux", @@ -52,10 +86,8 @@ mod tests; ) ), all(target_os = "fuchsia", target_arch = "aarch64") -))] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_char = u8; -#[doc(include = "char.md")] +))]} +type_alias! { "char.md", c_char = i8, NonZero_c_char = NonZeroI8; #[cfg(not(any( all( target_os = "linux", @@ -96,55 +128,25 @@ pub type c_char = u8; ) ), all(target_os = "fuchsia", target_arch = "aarch64") -)))] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_char = i8; -#[doc(include = "schar.md")] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_schar = i8; -#[doc(include = "uchar.md")] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_uchar = u8; -#[doc(include = "short.md")] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_short = i16; -#[doc(include = "ushort.md")] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_ushort = u16; -#[doc(include = "int.md")] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_int = i32; -#[doc(include = "uint.md")] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_uint = u32; -#[doc(include = "long.md")] -#[cfg(any(target_pointer_width = "32", windows))] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_long = i32; -#[doc(include = "ulong.md")] -#[cfg(any(target_pointer_width = "32", windows))] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_ulong = u32; -#[doc(include = "long.md")] -#[cfg(all(target_pointer_width = "64", not(windows)))] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_long = i64; -#[doc(include = "ulong.md")] -#[cfg(all(target_pointer_width = "64", not(windows)))] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_ulong = u64; -#[doc(include = "longlong.md")] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_longlong = i64; -#[doc(include = "ulonglong.md")] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_ulonglong = u64; -#[doc(include = "float.md")] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_float = f32; -#[doc(include = "double.md")] -#[stable(feature = "raw_os", since = "1.1.0")] -pub type c_double = f64; +)))]} +type_alias! { "schar.md", c_schar = i8, NonZero_c_schar = NonZeroI8; } +type_alias! { "uchar.md", c_uchar = u8, NonZero_c_uchar = NonZeroU8; } +type_alias! { "short.md", c_short = i16, NonZero_c_short = NonZeroI16; } +type_alias! { "ushort.md", c_ushort = u16, NonZero_c_ushort = NonZeroU16; } +type_alias! { "int.md", c_int = i32, NonZero_c_int = NonZeroI32; } +type_alias! { "uint.md", c_uint = u32, NonZero_c_uint = NonZeroU32; } +type_alias! { "long.md", c_long = i32, NonZero_c_long = NonZeroI32; +#[cfg(any(target_pointer_width = "32", windows))] } +type_alias! { "ulong.md", c_ulong = u32, NonZero_c_ulong = NonZeroU32; +#[cfg(any(target_pointer_width = "32", windows))] } +type_alias! { "long.md", c_long = i64, NonZero_c_long = NonZeroI64; +#[cfg(all(target_pointer_width = "64", not(windows)))] } +type_alias! { "ulong.md", c_ulong = u64, NonZero_c_ulong = NonZeroU64; +#[cfg(all(target_pointer_width = "64", not(windows)))] } +type_alias! { "longlong.md", c_longlong = i64, NonZero_c_longlong = NonZeroI64; } +type_alias! { "ulonglong.md", c_ulonglong = u64, NonZero_c_ulonglong = NonZeroU64; } +type_alias_no_nz! { "float.md", c_float = f32; } +type_alias_no_nz! { "double.md", c_double = f64; } #[stable(feature = "raw_os", since = "1.1.0")] #[doc(no_inline)] diff --git a/library/std/src/panic.rs b/library/std/src/panic.rs index 89a822a722..3e634239ad 100644 --- a/library/std/src/panic.rs +++ b/library/std/src/panic.rs @@ -408,7 +408,7 @@ impl Stream for AssertUnwindSafe { /// aborting the process as well. This function *only* catches unwinding panics, /// not those that abort the process. /// -/// Also note that unwinding into Rust code with a foreign exception (e.g. a +/// Also note that unwinding into Rust code with a foreign exception (e.g. /// an exception thrown from C++ code) is undefined behavior. /// /// # Examples diff --git a/library/std/src/path.rs b/library/std/src/path.rs index 1889e54933..57c892f32b 100644 --- a/library/std/src/path.rs +++ b/library/std/src/path.rs @@ -1066,6 +1066,7 @@ impl FusedIterator for Ancestors<'_> {} /// /// Which method works best depends on what kind of situation you're in. #[derive(Clone)] +#[cfg_attr(not(test), rustc_diagnostic_item = "PathBuf")] #[stable(feature = "rust1", since = "1.0.0")] // FIXME: // `PathBuf::as_mut_vec` current implementation relies @@ -1719,6 +1720,7 @@ impl AsRef for PathBuf { /// let extension = path.extension(); /// assert_eq!(extension, Some(OsStr::new("txt"))); /// ``` +#[cfg_attr(not(test), rustc_diagnostic_item = "Path")] #[stable(feature = "rust1", since = "1.0.0")] // FIXME: // `Path::new` current implementation relies @@ -2321,7 +2323,9 @@ impl Path { } /// Returns an object that implements [`Display`] for safely printing paths - /// that may contain non-Unicode data. + /// that may contain non-Unicode data. This may perform lossy conversion, + /// depending on the platform. If you would like an implementation which + /// escapes the path please use [`Debug`] instead. /// /// [`Display`]: fmt::Display /// @@ -2468,6 +2472,36 @@ impl Path { fs::metadata(self).is_ok() } + /// Returns `Ok(true)` if the path points at an existing entity. + /// + /// This function will traverse symbolic links to query information about the + /// destination file. In case of broken symbolic links this will return `Ok(false)`. + /// + /// As opposed to the `exists()` method, this one doesn't silently ignore errors + /// unrelated to the path not existing. (E.g. it will return `Err(_)` in case of permission + /// denied on some of the parent directories.) + /// + /// # Examples + /// + /// ```no_run + /// #![feature(path_try_exists)] + /// + /// use std::path::Path; + /// assert!(!Path::new("does_not_exist.txt").try_exists().expect("Can't check existence of file does_not_exist.txt")); + /// assert!(Path::new("/root/secret_file.txt").try_exists().is_err()); + /// ``` + // FIXME: stabilization should modify documentation of `exists()` to recommend this method + // instead. + #[unstable(feature = "path_try_exists", issue = "83186")] + #[inline] + pub fn try_exists(&self) -> io::Result { + match fs::metadata(self) { + Ok(_) => Ok(true), + Err(error) if error.kind() == io::ErrorKind::NotFound => Ok(false), + Err(error) => Err(error), + } + } + /// Returns `true` if the path exists on disk and is pointing at a regular file. /// /// This function will traverse symbolic links to query information about the @@ -2555,7 +2589,9 @@ impl fmt::Debug for Path { /// /// A [`Path`] might contain non-Unicode data. This `struct` implements the /// [`Display`] trait in a way that mitigates that. It is created by the -/// [`display`](Path::display) method on [`Path`]. +/// [`display`](Path::display) method on [`Path`]. This may perform lossy +/// conversion, depending on the platform. If you would like an implementation +/// which escapes the path please use [`Debug`] instead. /// /// # Examples /// diff --git a/library/std/src/prelude/mod.rs b/library/std/src/prelude/mod.rs index eb2095b819..505b5f3013 100644 --- a/library/std/src/prelude/mod.rs +++ b/library/std/src/prelude/mod.rs @@ -84,3 +84,37 @@ #![stable(feature = "rust1", since = "1.0.0")] pub mod v1; + +/// The 2015 version of the prelude of The Rust Standard Library. +/// +/// See the [module-level documentation](self) for more. +#[unstable(feature = "prelude_2015", issue = "none")] +pub mod rust_2015 { + #[unstable(feature = "prelude_2015", issue = "none")] + #[doc(no_inline)] + pub use super::v1::*; +} + +/// The 2018 version of the prelude of The Rust Standard Library. +/// +/// See the [module-level documentation](self) for more. +#[unstable(feature = "prelude_2018", issue = "none")] +pub mod rust_2018 { + #[unstable(feature = "prelude_2018", issue = "none")] + #[doc(no_inline)] + pub use super::v1::*; +} + +/// The 2021 version of the prelude of The Rust Standard Library. +/// +/// See the [module-level documentation](self) for more. +#[unstable(feature = "prelude_2021", issue = "none")] +pub mod rust_2021 { + #[unstable(feature = "prelude_2021", issue = "none")] + #[doc(no_inline)] + pub use super::v1::*; + + #[unstable(feature = "prelude_2021", issue = "none")] + #[doc(no_inline)] + pub use core::prelude::rust_2021::*; +} diff --git a/library/std/src/prelude/v1.rs b/library/std/src/prelude/v1.rs index 26302d0ecf..c5b871edbf 100644 --- a/library/std/src/prelude/v1.rs +++ b/library/std/src/prelude/v1.rs @@ -1,6 +1,6 @@ //! The first version of the prelude of The Rust Standard Library. //! -//! See the [module-level documentation](../index.html) for more. +//! See the [module-level documentation](super) for more. #![stable(feature = "rust1", since = "1.0.0")] @@ -48,12 +48,17 @@ pub use core::prelude::v1::{ // FIXME: Attribute and internal derive macros are not documented because for them rustdoc generates // dead links which fail link checker testing. #[stable(feature = "builtin_macro_prelude", since = "1.38.0")] -#[allow(deprecated)] +#[allow(deprecated, deprecated_in_future)] #[doc(hidden)] pub use core::prelude::v1::{ bench, global_allocator, test, test_case, RustcDecodable, RustcEncodable, }; +#[cfg(not(bootstrap))] +#[stable(feature = "builtin_macro_prelude", since = "1.38.0")] +#[doc(hidden)] +pub use core::prelude::v1::derive; + #[unstable( feature = "cfg_accessible", issue = "64797", @@ -62,6 +67,15 @@ pub use core::prelude::v1::{ #[doc(hidden)] pub use core::prelude::v1::cfg_accessible; +#[cfg(not(bootstrap))] +#[unstable( + feature = "cfg_eval", + issue = "82679", + reason = "`cfg_eval` is a recently implemented feature" +)] +#[doc(hidden)] +pub use core::prelude::v1::cfg_eval; + // The file so far is equivalent to src/libcore/prelude/v1.rs, // and below to src/liballoc/prelude.rs. // Those files are duplicated rather than using glob imports diff --git a/library/std/src/primitive_docs.rs b/library/std/src/primitive_docs.rs index 876b2b8a3f..d4bb2083d0 100644 --- a/library/std/src/primitive_docs.rs +++ b/library/std/src/primitive_docs.rs @@ -468,8 +468,8 @@ mod prim_unit {} /// /// [`null`]: ptr::null /// [`null_mut`]: ptr::null_mut -/// [`is_null`]: ../std/primitive.pointer.html#method.is_null -/// [`offset`]: ../std/primitive.pointer.html#method.offset +/// [`is_null`]: pointer::is_null +/// [`offset`]: pointer::offset /// [`into_raw`]: Box::into_raw /// [`drop`]: mem::drop /// [`write`]: ptr::write @@ -564,7 +564,7 @@ mod prim_pointer {} /// move_away(roa); /// ``` /// -/// [slice]: primitive.slice.html +/// [slice]: prim@slice /// [`Debug`]: fmt::Debug /// [`Hash`]: hash::Hash /// [`Borrow`]: borrow::Borrow diff --git a/library/std/src/process.rs b/library/std/src/process.rs index fb78e62834..f9cfd11e90 100644 --- a/library/std/src/process.rs +++ b/library/std/src/process.rs @@ -71,11 +71,15 @@ //! .spawn() //! .expect("failed to execute child"); //! -//! { -//! // limited borrow of stdin -//! let stdin = child.stdin.as_mut().expect("failed to get stdin"); +//! // If the child process fills its stdout buffer, it may end up +//! // waiting until the parent reads the stdout, and not be able to +//! // read stdin in the meantime, causing a deadlock. +//! // Writing from another thread ensures that stdout is being read +//! // at the same time, avoiding the problem. +//! let mut stdin = child.stdin.take().expect("failed to get stdin"); +//! std::thread::spawn(move || { //! stdin.write_all(b"test").expect("failed to write to stdin"); -//! } +//! }); //! //! let output = child //! .wait_with_output() @@ -498,6 +502,10 @@ pub struct Command { inner: imp::Command, } +/// Allows extension traits within `std`. +#[unstable(feature = "sealed", issue = "none")] +impl crate::sealed::Sealed for Command {} + impl Command { /// Constructs a new `Command` for launching the program at /// path `program`, with the following default configuration: @@ -881,7 +889,7 @@ impl Command { } /// Executes a command as a child process, waiting for it to finish and - /// collecting its exit status. + /// collecting its status. /// /// By default, stdin, stdout and stderr are inherited from the parent. /// @@ -895,7 +903,7 @@ impl Command { /// .status() /// .expect("failed to execute process"); /// - /// println!("process exited with: {}", status); + /// println!("process finished with: {}", status); /// /// assert!(status.success()); /// ``` @@ -1141,14 +1149,21 @@ impl Stdio { /// .spawn() /// .expect("Failed to spawn child process"); /// - /// { - /// let stdin = child.stdin.as_mut().expect("Failed to open stdin"); + /// let mut stdin = child.stdin.take().expect("Failed to open stdin"); + /// std::thread::spawn(move || { /// stdin.write_all("Hello, world!".as_bytes()).expect("Failed to write to stdin"); - /// } + /// }); /// /// let output = child.wait_with_output().expect("Failed to read stdout"); /// assert_eq!(String::from_utf8_lossy(&output.stdout), "!dlrow ,olleH"); /// ``` + /// + /// Writing more than a pipe buffer's worth of input to stdin without also reading + /// stdout and stderr at the same time may cause a deadlock. + /// This is an issue when running any program that doesn't guarantee that it reads + /// its entire stdin before writing more than a pipe buffer's worth of output. + /// The size of a pipe buffer varies on different targets. + /// #[stable(feature = "process", since = "1.0.0")] pub fn piped() -> Stdio { Stdio(imp::Stdio::MakePipe) @@ -1364,17 +1379,27 @@ impl From for Stdio { /// Describes the result of a process after it has terminated. /// -/// This `struct` is used to represent the exit status of a child process. +/// This `struct` is used to represent the exit status or other termination of a child process. /// Child processes are created via the [`Command`] struct and their exit /// status is exposed through the [`status`] method, or the [`wait`] method /// of a [`Child`] process. /// +/// An `ExitStatus` represents every possible disposition of a process. On Unix this +/// is the **wait status**. It is *not* simply an *exit status* (a value passed to `exit`). +/// +/// For proper error reporting of failed processes, print the value of `ExitStatus` using its +/// implementation of [`Display`](crate::fmt::Display). +/// /// [`status`]: Command::status /// [`wait`]: Child::wait #[derive(PartialEq, Eq, Clone, Copy, Debug)] #[stable(feature = "process", since = "1.0.0")] pub struct ExitStatus(imp::ExitStatus); +/// Allows extension traits within `std`. +#[unstable(feature = "sealed", issue = "none")] +impl crate::sealed::Sealed for ExitStatus {} + impl ExitStatus { /// Was termination successful? Signal termination is not considered a /// success, and success is defined as a zero exit status. @@ -1392,7 +1417,7 @@ impl ExitStatus { /// if status.success() { /// println!("'projects/' directory created"); /// } else { - /// println!("failed to create 'projects/' directory"); + /// println!("failed to create 'projects/' directory: {}", status); /// } /// ``` #[stable(feature = "process", since = "1.0.0")] @@ -1402,9 +1427,14 @@ impl ExitStatus { /// Returns the exit code of the process, if any. /// - /// On Unix, this will return `None` if the process was terminated - /// by a signal; `std::os::unix` provides an extension trait for - /// extracting the signal and other details from the `ExitStatus`. + /// In Unix terms the return value is the **exit status**: the value passed to `exit`, if the + /// process finished by calling `exit`. Note that on Unix the exit status is truncated to 8 + /// bits, and that values that didn't come from a program's call to `exit` may be invented the + /// runtime system (often, for example, 255, 254, 127 or 126). + /// + /// On Unix, this will return `None` if the process was terminated by a signal. + /// [`ExitStatusExt`](crate::os::unix::process::ExitStatusExt) is an + /// extension trait for extracting any such signal, and other details, from the `ExitStatus`. /// /// # Examples /// diff --git a/library/std/src/sync/mpsc/mod.rs b/library/std/src/sync/mpsc/mod.rs index db0777ee9f..b12e7eeb13 100644 --- a/library/std/src/sync/mpsc/mod.rs +++ b/library/std/src/sync/mpsc/mod.rs @@ -310,6 +310,7 @@ mod cache_aligned; /// println!("{}", recv.recv().unwrap()); // Received after 2 seconds /// ``` #[stable(feature = "rust1", since = "1.0.0")] +#[cfg_attr(not(test), rustc_diagnostic_item = "Receiver")] pub struct Receiver { inner: UnsafeCell>, } diff --git a/library/std/src/sync/mutex.rs b/library/std/src/sync/mutex.rs index a01ebb316e..ab61618dc7 100644 --- a/library/std/src/sync/mutex.rs +++ b/library/std/src/sync/mutex.rs @@ -219,6 +219,26 @@ impl Mutex { data: UnsafeCell::new(t), } } + + /// Immediately drops the guard, and consequently unlocks the mutex. + /// + /// This function is equivalent to calling [`drop`] on the guard but is more self-documenting. + /// Alternately, the guard will be automatically dropped when it goes out of scope. + /// + /// ``` + /// #![feature(mutex_unlock)] + /// + /// use std::sync::Mutex; + /// let mutex = Mutex::new(0); + /// + /// let mut guard = mutex.lock().unwrap(); + /// *guard += 20; + /// Mutex::unlock(guard); + /// ``` + #[unstable(feature = "mutex_unlock", issue = "81872")] + pub fn unlock(guard: MutexGuard<'_, T>) { + drop(guard); + } } impl Mutex { diff --git a/library/std/src/sync/rwlock.rs b/library/std/src/sync/rwlock.rs index d967779ce3..0298f59228 100644 --- a/library/std/src/sync/rwlock.rs +++ b/library/std/src/sync/rwlock.rs @@ -23,7 +23,9 @@ use crate::sys_common::rwlock as sys; /// /// The priority policy of the lock is dependent on the underlying operating /// system's implementation, and this type does not guarantee that any -/// particular policy will be used. +/// particular policy will be used. In particular, a writer which is waiting to +/// acquire the lock in `write` might or might not block concurrent calls to +/// `read`. /// /// The type parameter `T` represents the data that this lock protects. It is /// required that `T` satisfies [`Send`] to be shared across threads and diff --git a/library/std/src/sys/hermit/mod.rs b/library/std/src/sys/hermit/mod.rs index f185635b7a..17a51abeb0 100644 --- a/library/std/src/sys/hermit/mod.rs +++ b/library/std/src/sys/hermit/mod.rs @@ -32,6 +32,7 @@ pub mod mutex; pub mod net; pub mod os; pub mod path; +#[path = "../unsupported/pipe.rs"] pub mod pipe; #[path = "../unsupported/process.rs"] pub mod process; diff --git a/library/std/src/sys/hermit/pipe.rs b/library/std/src/sys/hermit/pipe.rs deleted file mode 100644 index 10d0925823..0000000000 --- a/library/std/src/sys/hermit/pipe.rs +++ /dev/null @@ -1,38 +0,0 @@ -use crate::io::{self, IoSlice, IoSliceMut}; -use crate::sys::Void; - -pub struct AnonPipe(Void); - -impl AnonPipe { - pub fn read(&self, _buf: &mut [u8]) -> io::Result { - match self.0 {} - } - - pub fn read_vectored(&self, _bufs: &mut [IoSliceMut<'_>]) -> io::Result { - match self.0 {} - } - - pub fn is_read_vectored(&self) -> bool { - match self.0 {} - } - - pub fn write(&self, _buf: &[u8]) -> io::Result { - match self.0 {} - } - - pub fn write_vectored(&self, _bufs: &[IoSlice<'_>]) -> io::Result { - match self.0 {} - } - - pub fn is_write_vectored(&self) -> bool { - match self.0 {} - } - - pub fn diverge(&self) -> ! { - match self.0 {} - } -} - -pub fn read2(p1: AnonPipe, _v1: &mut Vec, _p2: AnonPipe, _v2: &mut Vec) -> io::Result<()> { - match p1.0 {} -} diff --git a/library/std/src/sys/mod.rs b/library/std/src/sys/mod.rs index d48d9cb0ef..1e79a5c3f9 100644 --- a/library/std/src/sys/mod.rs +++ b/library/std/src/sys/mod.rs @@ -61,9 +61,9 @@ cfg_if::cfg_if! { #[stable(feature = "rust1", since = "1.0.0")] pub use self::ext as unix_ext; } else if #[cfg(any(target_os = "hermit", - target_arch = "wasm32", + all(target_arch = "wasm32", not(target_os = "wasi")), all(target_vendor = "fortanix", target_env = "sgx")))] { - // On wasm right now the module below doesn't compile + // On non-WASI 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 = "none", feature = "std_internals")] @@ -85,9 +85,9 @@ cfg_if::cfg_if! { #[stable(feature = "rust1", since = "1.0.0")] pub use self::ext as windows_ext; } else if #[cfg(any(target_os = "hermit", - target_arch = "wasm32", + all(target_arch = "wasm32", not(target_os = "wasi")), all(target_vendor = "fortanix", target_env = "sgx")))] { - // On wasm right now the shim below doesn't compile, so + // On non-WASI wasm right now the shim below doesn't compile, so // just omit it #[unstable(issue = "none", feature = "std_internals")] #[allow(missing_docs)] @@ -106,3 +106,26 @@ cfg_if::cfg_if! { pub mod windows_ext; } } + +#[cfg(doc)] +cfg_if::cfg_if! { + if #[cfg(target_os = "wasi")] { + // On WASI we'll document what's already available + #[stable(feature = "wasi_ext_doc", since = "1.35.0")] + pub use self::ext as wasi_ext; + } else if #[cfg(any(target_os = "hermit", + target_arch = "wasm32", + all(target_vendor = "fortanix", target_env = "sgx")))] { + // On non-WASI 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 = "none", feature = "std_internals")] + #[allow(missing_docs)] + pub mod wasi_ext {} + } else { + // On other platforms like Windows document the bare bones of WASI + #[path = "wasi/ext/mod.rs"] + #[stable(feature = "wasi_ext_doc", since = "1.35.0")] + pub mod wasi_ext; + } +} diff --git a/library/std/src/sys/sgx/abi/mem.rs b/library/std/src/sys/sgx/abi/mem.rs index da899773db..3753fdd353 100644 --- a/library/std/src/sys/sgx/abi/mem.rs +++ b/library/std/src/sys/sgx/abi/mem.rs @@ -47,20 +47,46 @@ pub fn image_base() -> u64 { /// Returns `true` if the specified memory range is in the enclave. /// -/// `p + len` must not overflow. +/// For safety, this function also checks whether the range given overflows, +/// returning `false` if so. #[unstable(feature = "sgx_platform", issue = "56975")] 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 + let start = p as usize; + + // Subtract one from `len` when calculating `end` in case `p + len` is + // exactly at the end of addressable memory (`p + len` would overflow, but + // the range is still valid). + let end = if len == 0 { + start + } else if let Some(end) = start.checked_add(len - 1) { + end + } else { + return false; + }; + + let base = image_base() as usize; + start >= base && end <= base + (unsafe { ENCLAVE_SIZE } - 1) // unsafe ok: link-time constant } /// Returns `true` if the specified memory range is in userspace. /// -/// `p + len` must not overflow. +/// For safety, this function also checks whether the range given overflows, +/// returning `false` if so. #[unstable(feature = "sgx_platform", issue = "56975")] 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 + let start = p as usize; + + // Subtract one from `len` when calculating `end` in case `p + len` is + // exactly at the end of addressable memory (`p + len` would overflow, but + // the range is still valid). + let end = if len == 0 { + start + } else if let Some(end) = start.checked_add(len - 1) { + end + } else { + return false; + }; + + let base = image_base() as usize; + end < base || start > base + (unsafe { ENCLAVE_SIZE } - 1) // unsafe ok: link-time constant } diff --git a/library/std/src/sys/unix/ext/net/ancillary.rs b/library/std/src/sys/unix/ext/net/ancillary.rs index 0964b6335a..33d6a39af0 100644 --- a/library/std/src/sys/unix/ext/net/ancillary.rs +++ b/library/std/src/sys/unix/ext/net/ancillary.rs @@ -1,6 +1,6 @@ use super::{sockaddr_un, SocketAddr}; use crate::convert::TryFrom; -use crate::io::{self, IoSliceMut}; +use crate::io::{self, IoSlice, IoSliceMut}; use crate::marker::PhantomData; use crate::mem::{size_of, zeroed}; use crate::os::unix::io::RawFd; @@ -68,7 +68,7 @@ pub(super) fn recv_vectored_with_ancillary_from( pub(super) fn send_vectored_with_ancillary_to( socket: &Socket, path: Option<&Path>, - bufs: &mut [IoSliceMut<'_>], + bufs: &[IoSlice<'_>], ancillary: &mut SocketAncillary<'_>, ) -> io::Result { unsafe { @@ -78,7 +78,7 @@ pub(super) fn send_vectored_with_ancillary_to( let mut msg: libc::msghdr = zeroed(); msg.msg_name = &mut msg_name as *mut _ as *mut _; msg.msg_namelen = msg_namelen; - msg.msg_iov = bufs.as_mut_ptr().cast(); + msg.msg_iov = bufs.as_ptr() as *mut _; msg.msg_control = ancillary.buffer.as_mut_ptr().cast(); cfg_if::cfg_if! { if #[cfg(any(target_os = "android", all(target_os = "linux", target_env = "gnu")))] { @@ -567,7 +567,7 @@ impl<'a> SocketAncillary<'a> { /// #![feature(unix_socket_ancillary_data)] /// use std::os::unix::net::{UnixStream, SocketAncillary}; /// use std::os::unix::io::AsRawFd; - /// use std::io::IoSliceMut; + /// use std::io::IoSlice; /// /// fn main() -> std::io::Result<()> { /// let sock = UnixStream::connect("/tmp/sock")?; @@ -577,7 +577,7 @@ impl<'a> SocketAncillary<'a> { /// ancillary.add_fds(&[sock.as_raw_fd()][..]); /// /// let mut buf = [1; 8]; - /// let mut bufs = &mut [IoSliceMut::new(&mut buf[..])][..]; + /// let mut bufs = &mut [IoSlice::new(&mut buf[..])][..]; /// sock.send_vectored_with_ancillary(bufs, &mut ancillary)?; /// Ok(()) /// } diff --git a/library/std/src/sys/unix/ext/net/datagram.rs b/library/std/src/sys/unix/ext/net/datagram.rs index 0f532c47c8..a8c13fbb87 100644 --- a/library/std/src/sys/unix/ext/net/datagram.rs +++ b/library/std/src/sys/unix/ext/net/datagram.rs @@ -19,7 +19,7 @@ use super::{sockaddr_un, SocketAddr}; target_os = "netbsd", target_os = "openbsd", ))] -use crate::io::IoSliceMut; +use crate::io::{IoSlice, IoSliceMut}; use crate::net::Shutdown; use crate::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; use crate::path::Path; @@ -506,23 +506,24 @@ impl UnixDatagram { /// ```no_run /// #![feature(unix_socket_ancillary_data)] /// use std::os::unix::net::{UnixDatagram, SocketAncillary}; - /// use std::io::IoSliceMut; + /// use std::io::IoSlice; /// /// fn main() -> std::io::Result<()> { /// let sock = UnixDatagram::unbound()?; - /// let mut buf1 = [1; 8]; - /// let mut buf2 = [2; 16]; - /// let mut buf3 = [3; 8]; - /// let mut bufs = &mut [ - /// IoSliceMut::new(&mut buf1), - /// IoSliceMut::new(&mut buf2), - /// IoSliceMut::new(&mut buf3), + /// let buf1 = [1; 8]; + /// let buf2 = [2; 16]; + /// let buf3 = [3; 8]; + /// let bufs = &[ + /// IoSlice::new(&buf1), + /// IoSlice::new(&buf2), + /// IoSlice::new(&buf3), /// ][..]; /// let fds = [0, 1, 2]; /// let mut ancillary_buffer = [0; 128]; /// let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]); /// ancillary.add_fds(&fds[..]); - /// sock.send_vectored_with_ancillary_to(bufs, &mut ancillary, "/some/sock").expect("send_vectored_with_ancillary_to function failed"); + /// sock.send_vectored_with_ancillary_to(bufs, &mut ancillary, "/some/sock") + /// .expect("send_vectored_with_ancillary_to function failed"); /// Ok(()) /// } /// ``` @@ -538,7 +539,7 @@ impl UnixDatagram { #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] pub fn send_vectored_with_ancillary_to>( &self, - bufs: &mut [IoSliceMut<'_>], + bufs: &[IoSlice<'_>], ancillary: &mut SocketAncillary<'_>, path: P, ) -> io::Result { @@ -554,23 +555,24 @@ impl UnixDatagram { /// ```no_run /// #![feature(unix_socket_ancillary_data)] /// use std::os::unix::net::{UnixDatagram, SocketAncillary}; - /// use std::io::IoSliceMut; + /// use std::io::IoSlice; /// /// fn main() -> std::io::Result<()> { /// let sock = UnixDatagram::unbound()?; - /// let mut buf1 = [1; 8]; - /// let mut buf2 = [2; 16]; - /// let mut buf3 = [3; 8]; - /// let mut bufs = &mut [ - /// IoSliceMut::new(&mut buf1), - /// IoSliceMut::new(&mut buf2), - /// IoSliceMut::new(&mut buf3), + /// let buf1 = [1; 8]; + /// let buf2 = [2; 16]; + /// let buf3 = [3; 8]; + /// let bufs = &[ + /// IoSlice::new(&buf1), + /// IoSlice::new(&buf2), + /// IoSlice::new(&buf3), /// ][..]; /// let fds = [0, 1, 2]; /// let mut ancillary_buffer = [0; 128]; /// let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]); /// ancillary.add_fds(&fds[..]); - /// sock.send_vectored_with_ancillary(bufs, &mut ancillary).expect("send_vectored_with_ancillary function failed"); + /// sock.send_vectored_with_ancillary(bufs, &mut ancillary) + /// .expect("send_vectored_with_ancillary function failed"); /// Ok(()) /// } /// ``` @@ -586,7 +588,7 @@ impl UnixDatagram { #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] pub fn send_vectored_with_ancillary( &self, - bufs: &mut [IoSliceMut<'_>], + bufs: &[IoSlice<'_>], ancillary: &mut SocketAncillary<'_>, ) -> io::Result { send_vectored_with_ancillary_to(&self.0, None, bufs, ancillary) diff --git a/library/std/src/sys/unix/ext/net/stream.rs b/library/std/src/sys/unix/ext/net/stream.rs index 9fe6b85837..fc08edacb8 100644 --- a/library/std/src/sys/unix/ext/net/stream.rs +++ b/library/std/src/sys/unix/ext/net/stream.rs @@ -530,23 +530,24 @@ impl UnixStream { /// ```no_run /// #![feature(unix_socket_ancillary_data)] /// use std::os::unix::net::{UnixStream, SocketAncillary}; - /// use std::io::IoSliceMut; + /// use std::io::IoSlice; /// /// fn main() -> std::io::Result<()> { /// let socket = UnixStream::connect("/tmp/sock")?; - /// let mut buf1 = [1; 8]; - /// let mut buf2 = [2; 16]; - /// let mut buf3 = [3; 8]; - /// let mut bufs = &mut [ - /// IoSliceMut::new(&mut buf1), - /// IoSliceMut::new(&mut buf2), - /// IoSliceMut::new(&mut buf3), + /// let buf1 = [1; 8]; + /// let buf2 = [2; 16]; + /// let buf3 = [3; 8]; + /// let bufs = &[ + /// IoSlice::new(&buf1), + /// IoSlice::new(&buf2), + /// IoSlice::new(&buf3), /// ][..]; /// let fds = [0, 1, 2]; /// let mut ancillary_buffer = [0; 128]; /// let mut ancillary = SocketAncillary::new(&mut ancillary_buffer[..]); /// ancillary.add_fds(&fds[..]); - /// socket.send_vectored_with_ancillary(bufs, &mut ancillary).expect("send_vectored_with_ancillary function failed"); + /// socket.send_vectored_with_ancillary(bufs, &mut ancillary) + /// .expect("send_vectored_with_ancillary function failed"); /// Ok(()) /// } /// ``` @@ -562,7 +563,7 @@ impl UnixStream { #[unstable(feature = "unix_socket_ancillary_data", issue = "76915")] pub fn send_vectored_with_ancillary( &self, - bufs: &mut [IoSliceMut<'_>], + bufs: &[IoSlice<'_>], ancillary: &mut SocketAncillary<'_>, ) -> io::Result { send_vectored_with_ancillary_to(&self.0, None, bufs, ancillary) diff --git a/library/std/src/sys/unix/ext/net/tests.rs b/library/std/src/sys/unix/ext/net/tests.rs index 97a016904b..bd9b6dd727 100644 --- a/library/std/src/sys/unix/ext/net/tests.rs +++ b/library/std/src/sys/unix/ext/net/tests.rs @@ -485,14 +485,14 @@ fn test_unix_datagram_peek_from() { fn test_send_vectored_fds_unix_stream() { let (s1, s2) = or_panic!(UnixStream::pair()); - let mut buf1 = [1; 8]; - let mut bufs_send = &mut [IoSliceMut::new(&mut buf1[..])][..]; + let buf1 = [1; 8]; + let bufs_send = &[IoSlice::new(&buf1[..])][..]; let mut ancillary1_buffer = [0; 128]; let mut ancillary1 = SocketAncillary::new(&mut ancillary1_buffer[..]); assert!(ancillary1.add_fds(&[s1.as_raw_fd()][..])); - let usize = or_panic!(s1.send_vectored_with_ancillary(&mut bufs_send, &mut ancillary1)); + let usize = or_panic!(s1.send_vectored_with_ancillary(&bufs_send, &mut ancillary1)); assert_eq!(usize, 8); let mut buf2 = [0; 8]; @@ -542,8 +542,8 @@ fn test_send_vectored_with_ancillary_to_unix_datagram() { or_panic!(bsock2.set_passcred(true)); - let mut buf1 = [1; 8]; - let mut bufs_send = &mut [IoSliceMut::new(&mut buf1[..])][..]; + let buf1 = [1; 8]; + let bufs_send = &[IoSlice::new(&buf1[..])][..]; let mut ancillary1_buffer = [0; 128]; let mut ancillary1 = SocketAncillary::new(&mut ancillary1_buffer[..]); @@ -554,7 +554,7 @@ fn test_send_vectored_with_ancillary_to_unix_datagram() { assert!(ancillary1.add_creds(&[cred1.clone()][..])); let usize = - or_panic!(bsock1.send_vectored_with_ancillary_to(&mut bufs_send, &mut ancillary1, &path2)); + or_panic!(bsock1.send_vectored_with_ancillary_to(&bufs_send, &mut ancillary1, &path2)); assert_eq!(usize, 8); let mut buf2 = [0; 8]; @@ -603,15 +603,15 @@ fn test_send_vectored_with_ancillary_unix_datagram() { let bsock1 = or_panic!(UnixDatagram::bind(&path1)); let bsock2 = or_panic!(UnixDatagram::bind(&path2)); - let mut buf1 = [1; 8]; - let mut bufs_send = &mut [IoSliceMut::new(&mut buf1[..])][..]; + let buf1 = [1; 8]; + let bufs_send = &[IoSlice::new(&buf1[..])][..]; let mut ancillary1_buffer = [0; 128]; let mut ancillary1 = SocketAncillary::new(&mut ancillary1_buffer[..]); assert!(ancillary1.add_fds(&[bsock1.as_raw_fd()][..])); or_panic!(bsock1.connect(&path2)); - let usize = or_panic!(bsock1.send_vectored_with_ancillary(&mut bufs_send, &mut ancillary1)); + let usize = or_panic!(bsock1.send_vectored_with_ancillary(&bufs_send, &mut ancillary1)); assert_eq!(usize, 8); let mut buf2 = [0; 8]; diff --git a/library/std/src/sys/unix/ext/process.rs b/library/std/src/sys/unix/ext/process.rs index 724b5dcca6..1276edc6af 100644 --- a/library/std/src/sys/unix/ext/process.rs +++ b/library/std/src/sys/unix/ext/process.rs @@ -6,20 +6,16 @@ use crate::ffi::OsStr; use crate::io; use crate::os::unix::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; use crate::process; +use crate::sealed::Sealed; use crate::sys; use crate::sys_common::{AsInner, AsInnerMut, FromInner, IntoInner}; -mod private { - /// This trait being unreachable from outside the crate - /// prevents other implementations of the `ExitStatusExt` trait, - /// which allows potentially adding more trait methods in the future. - #[stable(feature = "none", since = "1.51.0")] - pub trait Sealed {} -} - /// Unix-specific extensions to the [`process::Command`] builder. +/// +/// This trait is sealed: it cannot be implemented outside the standard library. +/// This is so that future additional methods are not breaking changes. #[stable(feature = "rust1", since = "1.0.0")] -pub trait CommandExt { +pub trait CommandExt: Sealed { /// Sets the child process's user ID. This translates to a /// `setuid` call in the child process. Failure in the `setuid` /// call will cause the spawn to fail. @@ -66,9 +62,14 @@ pub trait CommandExt { /// `fork`. This primarily means that any modifications made to memory on /// behalf of this closure will **not** be visible to the parent process. /// This is often a very constrained environment where normal operations - /// like `malloc` or acquiring a mutex are not guaranteed to work (due to + /// like `malloc`, accessing environment variables through [`std::env`] + /// or acquiring a mutex are not guaranteed to work (due to /// other threads perhaps still running when the `fork` was run). /// + /// For further details refer to the [POSIX fork() specification] + /// and the equivalent documentation for any targeted + /// platform, especially the requirements around *async-signal-safety*. + /// /// This also means that all resources such as file descriptors and /// memory-mapped regions got duplicated. It is your responsibility to make /// sure that the closure does not violate library invariants by making @@ -77,6 +78,10 @@ pub trait CommandExt { /// When this closure is run, aspects such as the stdio file descriptors and /// working directory have successfully been changed, so output to these /// locations may not appear where intended. + /// + /// [POSIX fork() specification]: + /// https://pubs.opengroup.org/onlinepubs/9699919799/functions/fork.html + /// [`std::env`]: mod@crate::env #[stable(feature = "process_pre_exec", since = "1.34.0")] unsafe fn pre_exec(&mut self, f: F) -> &mut process::Command where @@ -176,6 +181,8 @@ impl CommandExt for process::Command { } fn exec(&mut self) -> io::Error { + // NOTE: This may *not* be safe to call after `libc::fork`, because it + // may allocate. That may be worth fixing at some point in the future. self.as_inner_mut().exec(sys::process::Stdio::Inherit) } @@ -190,12 +197,20 @@ impl CommandExt for process::Command { /// Unix-specific extensions to [`process::ExitStatus`]. /// +/// On Unix, `ExitStatus` **does not necessarily represent an exit status**, as passed to the +/// `exit` system call or returned by [`ExitStatus::code()`](crate::process::ExitStatus::code). +/// It represents **any wait status**, as returned by one of the `wait` family of system calls. +/// +/// This is because a Unix wait status (a Rust `ExitStatus`) can represent a Unix exit status, but +/// can also represent other kinds of process event. +/// /// This trait is sealed: it cannot be implemented outside the standard library. /// This is so that future additional methods are not breaking changes. #[stable(feature = "rust1", since = "1.0.0")] -pub trait ExitStatusExt: private::Sealed { - /// Creates a new `ExitStatus` from the raw underlying `i32` return value of - /// a process. +pub trait ExitStatusExt: Sealed { + /// Creates a new `ExitStatus` from the raw underlying integer status value from `wait` + /// + /// The value should be a **wait status, not an exit status**. #[stable(feature = "exit_status_from", since = "1.12.0")] fn from_raw(raw: i32) -> Self; @@ -224,13 +239,12 @@ pub trait ExitStatusExt: private::Sealed { fn continued(&self) -> bool; /// Returns the underlying raw `wait` status. + /// + /// The returned integer is a **wait status, not an exit status**. #[unstable(feature = "unix_process_wait_more", issue = "80695")] fn into_raw(self) -> i32; } -#[stable(feature = "none", since = "1.51.0")] -impl private::Sealed for process::ExitStatus {} - #[stable(feature = "rust1", since = "1.0.0")] impl ExitStatusExt for process::ExitStatus { fn from_raw(raw: i32) -> Self { diff --git a/library/std/src/sys/unix/net.rs b/library/std/src/sys/unix/net.rs index 1df90c18c7..587ffe1598 100644 --- a/library/std/src/sys/unix/net.rs +++ b/library/std/src/sys/unix/net.rs @@ -195,6 +195,7 @@ impl Socket { // glibc 2.10 and musl 0.9.5. cfg_if::cfg_if! { if #[cfg(any( + target_os = "android", target_os = "dragonfly", target_os = "freebsd", target_os = "illumos", @@ -206,13 +207,6 @@ impl Socket { libc::accept4(self.0.raw(), storage, len, libc::SOCK_CLOEXEC) })?; Ok(Socket(FileDesc::new(fd))) - // While the Android kernel supports the syscall, - // it is not included in all versions of Android's libc. - } else if #[cfg(all(target_os = "android", not(target_arch = "x86")))] { - let fd = cvt_r(|| unsafe { - libc::syscall(libc::SYS_accept4, self.0.raw(), storage, len, libc::SOCK_CLOEXEC) - })?; - Ok(Socket(FileDesc::new(fd as c_int))) } else { let fd = cvt_r(|| unsafe { libc::accept(self.0.raw(), storage, len) })?; let fd = FileDesc::new(fd); diff --git a/library/std/src/sys/unix/os.rs b/library/std/src/sys/unix/os.rs index d5e14bec76..1d1118aa69 100644 --- a/library/std/src/sys/unix/os.rs +++ b/library/std/src/sys/unix/os.rs @@ -22,6 +22,7 @@ use crate::str; use crate::sys::cvt; use crate::sys::fd; use crate::sys_common::mutex::{StaticMutex, StaticMutexGuard}; +use crate::sys_common::rwlock::{RWLockReadGuard, StaticRWLock}; use crate::vec; use libc::{c_char, c_int, c_void}; @@ -490,20 +491,20 @@ pub unsafe fn environ() -> *mut *const *const c_char { extern "C" { static mut environ: *const *const c_char; } - &mut environ + ptr::addr_of_mut!(environ) } -pub unsafe fn env_lock() -> StaticMutexGuard { - // It is UB to attempt to acquire this mutex reentrantly! - static ENV_LOCK: StaticMutex = StaticMutex::new(); - ENV_LOCK.lock() +static ENV_LOCK: StaticRWLock = StaticRWLock::new(); + +pub fn env_read_lock() -> RWLockReadGuard { + ENV_LOCK.read_with_guard() } /// Returns a vector of (variable, value) byte-vector pairs for all the /// environment variables of the current process. pub fn env() -> Env { unsafe { - let _guard = env_lock(); + let _guard = env_read_lock(); let mut environ = *environ(); let mut result = Vec::new(); if !environ.is_null() { @@ -540,7 +541,7 @@ pub fn getenv(k: &OsStr) -> io::Result> { // always None as well let k = CString::new(k.as_bytes())?; unsafe { - let _guard = env_lock(); + let _guard = env_read_lock(); let s = libc::getenv(k.as_ptr()) as *const libc::c_char; let ret = if s.is_null() { None @@ -556,7 +557,7 @@ pub fn setenv(k: &OsStr, v: &OsStr) -> io::Result<()> { let v = CString::new(v.as_bytes())?; unsafe { - let _guard = env_lock(); + let _guard = ENV_LOCK.write_with_guard(); cvt(libc::setenv(k.as_ptr(), v.as_ptr(), 1)).map(drop) } } @@ -565,7 +566,7 @@ pub fn unsetenv(n: &OsStr) -> io::Result<()> { let nbuf = CString::new(n.as_bytes())?; unsafe { - let _guard = env_lock(); + let _guard = ENV_LOCK.write_with_guard(); cvt(libc::unsetenv(nbuf.as_ptr())).map(drop) } } diff --git a/library/std/src/sys/unix/process/process_common.rs b/library/std/src/sys/unix/process/process_common.rs index a96d4aa6a4..b9dcc4e4b9 100644 --- a/library/std/src/sys/unix/process/process_common.rs +++ b/library/std/src/sys/unix/process/process_common.rs @@ -60,25 +60,13 @@ cfg_if::cfg_if! { //////////////////////////////////////////////////////////////////////////////// pub struct Command { - // Currently we try hard to ensure that the call to `.exec()` doesn't - // actually allocate any memory. While many platforms try to ensure that - // memory allocation works after a fork in a multithreaded process, it's - // been observed to be buggy and somewhat unreliable, so we do our best to - // just not do it at all! - // - // Along those lines, the `argv` and `envp` raw pointers here are exactly - // what's gonna get passed to `execvp`. The `argv` array starts with the - // `program` and ends with a NULL, and the `envp` pointer, if present, is - // also null-terminated. - // - // Right now we don't support removing arguments, so there's no much fancy - // support there, but we support adding and removing environment variables, - // so a side table is used to track where in the `envp` array each key is - // located. Whenever we add a key we update it in place if it's already - // present, and whenever we remove a key we update the locations of all - // other keys. program: CString, args: Vec, + /// Exactly what will be passed to `execvp`. + /// + /// First element is a pointer to `program`, followed by pointers to + /// `args`, followed by a `null`. Be careful when modifying `program` or + /// `args` to properly update this as well. argv: Argv, env: CommandEnv, diff --git a/library/std/src/sys/unix/process/process_unix.rs b/library/std/src/sys/unix/process/process_unix.rs index 2746f87468..47aaca82af 100644 --- a/library/std/src/sys/unix/process/process_unix.rs +++ b/library/std/src/sys/unix/process/process_unix.rs @@ -1,6 +1,7 @@ use crate::convert::TryInto; use crate::fmt; use crate::io::{self, Error, ErrorKind}; +use crate::mem; use crate::ptr; use crate::sys; use crate::sys::cvt; @@ -45,15 +46,14 @@ impl Command { // // Note that as soon as we're done with the fork there's no need to hold // a lock any more because the parent won't do anything and the child is - // in its own process. - let result = unsafe { - let _env_lock = sys::os::env_lock(); - cvt(libc::fork())? - }; + // in its own process. Thus the parent drops the lock guard while the child + // forgets it to avoid unlocking it on a new thread, which would be invalid. + let (env_lock, result) = unsafe { (sys::os::env_read_lock(), cvt(libc::fork())?) }; let pid = unsafe { match result { 0 => { + mem::forget(env_lock); drop(input); let Err(err) = self.do_exec(theirs, envp.as_ref()); let errno = err.raw_os_error().unwrap_or(libc::EINVAL) as u32; @@ -74,7 +74,10 @@ impl Command { rtassert!(output.write(&bytes).is_ok()); libc::_exit(1) } - n => n, + n => { + drop(env_lock); + n + } } }; @@ -124,7 +127,7 @@ impl Command { // Similar to when forking, we want to ensure that access to // the environment is synchronized, so make sure to grab the // environment lock before we try to exec. - let _lock = sys::os::env_lock(); + let _lock = sys::os::env_read_lock(); let Err(e) = self.do_exec(theirs, envp.as_ref()); e @@ -404,7 +407,7 @@ impl Command { cvt_nz(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 _env_lock = sys::os::env_read_lock(); let envp = envp.map(|c| c.as_ptr()).unwrap_or_else(|| *sys::os::environ() as *const _); cvt_nz(libc::posix_spawnp( &mut p.pid, @@ -527,9 +530,22 @@ impl fmt::Display for ExitStatus { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { if let Some(code) = self.code() { write!(f, "exit code: {}", code) + } else if let Some(signal) = self.signal() { + if self.core_dumped() { + write!(f, "signal: {} (core dumped)", signal) + } else { + write!(f, "signal: {}", signal) + } + } else if let Some(signal) = self.stopped_signal() { + write!(f, "stopped (not terminated) by signal: {}", signal) + } else if self.continued() { + write!(f, "continued (WIFCONTINUED)") } else { - let signal = self.signal().unwrap(); - write!(f, "signal: {}", signal) + write!(f, "unrecognised wait status: {} {:#x}", self.0, self.0) } } } + +#[cfg(test)] +#[path = "process_unix/tests.rs"] +mod tests; diff --git a/library/std/src/sys/unix/process/process_unix/tests.rs b/library/std/src/sys/unix/process/process_unix/tests.rs new file mode 100644 index 0000000000..5819d2c2a5 --- /dev/null +++ b/library/std/src/sys/unix/process/process_unix/tests.rs @@ -0,0 +1,30 @@ +#[test] +fn exitstatus_display_tests() { + // In practice this is the same on every Unix. + // If some weird platform turns out to be different, and this test fails, use #[cfg]. + use crate::os::unix::process::ExitStatusExt; + use crate::process::ExitStatus; + + let t = |v, s| assert_eq!(s, format!("{}", ::from_raw(v))); + + t(0x0000f, "signal: 15"); + t(0x0008b, "signal: 11 (core dumped)"); + t(0x00000, "exit code: 0"); + t(0x0ff00, "exit code: 255"); + + // On MacOS, 0x0137f is WIFCONTINUED, not WIFSTOPPED. Probably *BSD is similar. + // https://github.com/rust-lang/rust/pull/82749#issuecomment-790525956 + // The purpose of this test is to test our string formatting, not our understanding of the wait + // status magic numbers. So restrict these to Linux. + if cfg!(target_os = "linux") { + t(0x0137f, "stopped (not terminated) by signal: 19"); + t(0x0ffff, "continued (WIFCONTINUED)"); + } + + // Testing "unrecognised wait status" is hard because the wait.h macros typically + // assume that the value came from wait and isn't mad. With the glibc I have here + // this works: + if cfg!(all(target_os = "linux", target_env = "gnu")) { + t(0x000ff, "unrecognised wait status: 255 0xff"); + } +} diff --git a/library/std/src/sys/unix/stack_overflow.rs b/library/std/src/sys/unix/stack_overflow.rs index d847420535..2a487fff54 100644 --- a/library/std/src/sys/unix/stack_overflow.rs +++ b/library/std/src/sys/unix/stack_overflow.rs @@ -34,11 +34,12 @@ impl Drop for Handler { target_os = "freebsd", target_os = "solaris", target_os = "illumos", - all(target_os = "netbsd", not(target_vendor = "rumprun")), + target_os = "netbsd", target_os = "openbsd" ))] mod imp { use super::Handler; + use crate::io; use crate::mem; use crate::ptr; @@ -149,11 +150,11 @@ mod imp { 0, ); if stackp == MAP_FAILED { - panic!("failed to allocate an alternative stack"); + panic!("failed to allocate an alternative stack: {}", io::Error::last_os_error()); } let guard_result = libc::mprotect(stackp, page_size(), PROT_NONE); if guard_result != 0 { - panic!("failed to set up alternative stack guard page"); + panic!("failed to set up alternative stack guard page: {}", io::Error::last_os_error()); } stackp.add(page_size()) } @@ -218,7 +219,7 @@ mod imp { target_os = "freebsd", target_os = "solaris", target_os = "illumos", - all(target_os = "netbsd", not(target_vendor = "rumprun")), + target_os = "netbsd", target_os = "openbsd", )))] mod imp { diff --git a/library/std/src/sys/unix/thread.rs b/library/std/src/sys/unix/thread.rs index cda17eb4bd..01a12dcf5a 100644 --- a/library/std/src/sys/unix/thread.rs +++ b/library/std/src/sys/unix/thread.rs @@ -202,7 +202,7 @@ impl Drop for Thread { not(target_os = "linux"), not(target_os = "freebsd"), not(target_os = "macos"), - not(all(target_os = "netbsd", not(target_vendor = "rumprun"))), + not(target_os = "netbsd"), not(target_os = "openbsd"), not(target_os = "solaris") ))] @@ -222,7 +222,7 @@ pub mod guard { target_os = "linux", target_os = "freebsd", target_os = "macos", - all(target_os = "netbsd", not(target_vendor = "rumprun")), + target_os = "netbsd", target_os = "openbsd", target_os = "solaris" ))] @@ -231,6 +231,7 @@ pub mod guard { use libc::{mmap, mprotect}; use libc::{MAP_ANON, MAP_FAILED, MAP_FIXED, MAP_PRIVATE, PROT_NONE, PROT_READ, PROT_WRITE}; + use crate::io; use crate::ops::Range; use crate::sync::atomic::{AtomicUsize, Ordering}; use crate::sys::os; @@ -361,12 +362,12 @@ pub mod guard { 0, ); if result != stackaddr || result == MAP_FAILED { - panic!("failed to allocate a guard page"); + panic!("failed to allocate a guard page: {}", io::Error::last_os_error()); } let result = mprotect(stackaddr, page_size, PROT_NONE); if result != 0 { - panic!("failed to protect the guard page"); + panic!("failed to protect the guard page: {}", io::Error::last_os_error()); } let guardaddr = stackaddr as usize; diff --git a/library/std/src/sys/wasi/ext/fs.rs b/library/std/src/sys/wasi/ext/fs.rs index a8da003d55..6472642f03 100644 --- a/library/std/src/sys/wasi/ext/fs.rs +++ b/library/std/src/sys/wasi/ext/fs.rs @@ -3,11 +3,14 @@ #![deny(unsafe_op_in_unsafe_fn)] #![unstable(feature = "wasi_ext", issue = "none")] +use crate::ffi::OsStr; use crate::fs::{self, File, Metadata, OpenOptions}; use crate::io::{self, IoSlice, IoSliceMut}; use crate::path::{Path, PathBuf}; -use crate::sys::fs::osstr2str; use crate::sys_common::{AsInner, AsInnerMut, FromInner}; +// Used for `File::read` on intra-doc links +#[allow(unused_imports)] +use io::{Read, Write}; /// WASI-specific extensions to [`File`]. pub trait FileExt { @@ -54,11 +57,11 @@ pub trait FileExt { /// # Errors /// /// If this function encounters an error of the kind - /// [`ErrorKind::Interrupted`] then the error is ignored and the operation + /// [`io::ErrorKind::Interrupted`] then the error is ignored and the operation /// will continue. /// /// If this function encounters an "end of file" before completely filling - /// the buffer, it returns an error of the kind [`ErrorKind::UnexpectedEof`]. + /// the buffer, it returns an error of the kind [`io::ErrorKind::UnexpectedEof`]. /// The contents of `buf` are unspecified in this case. /// /// If any other read error is encountered then this function immediately @@ -131,16 +134,16 @@ pub trait FileExt { /// The current file cursor is not affected by this function. /// /// This method will continuously call [`write_at`] until there is no more data - /// to be written or an error of non-[`ErrorKind::Interrupted`] kind is + /// to be written or an error of non-[`io::ErrorKind::Interrupted`] kind is /// returned. This method will not return until the entire buffer has been /// successfully written or such an error occurs. The first error that is - /// not of [`ErrorKind::Interrupted`] kind generated from this method will be + /// not of [`io::ErrorKind::Interrupted`] kind generated from this method will be /// returned. /// /// # Errors /// /// This function will return the first error of - /// non-[`ErrorKind::Interrupted`] kind that [`write_at`] returns. + /// non-[`io::ErrorKind::Interrupted`] kind that [`write_at`] returns. /// /// [`write_at`]: FileExt::write_at #[stable(feature = "rw_exact_all_at", since = "1.33.0")] @@ -397,6 +400,8 @@ pub trait MetadataExt { fn ino(&self) -> u64; /// Returns the `st_nlink` field of the internal `filestat_t` fn nlink(&self) -> u64; + /// Returns the `st_size` field of the internal `filestat_t` + fn size(&self) -> u64; /// Returns the `st_atim` field of the internal `filestat_t` fn atim(&self) -> u64; /// Returns the `st_mtim` field of the internal `filestat_t` @@ -415,6 +420,9 @@ impl MetadataExt for fs::Metadata { fn nlink(&self) -> u64 { self.as_inner().as_wasi().nlink } + fn size(&self) -> u64 { + self.as_inner().as_wasi().size + } fn atim(&self) -> u64 { self.as_inner().as_wasi().atim } @@ -426,7 +434,7 @@ impl MetadataExt for fs::Metadata { } } -/// WASI-specific extensions for [`FileType`]. +/// WASI-specific extensions for [`fs::FileType`]. /// /// Adds support for special WASI file types such as block/character devices, /// pipes, and sockets. @@ -517,8 +525,12 @@ pub fn symlink, U: AsRef>( /// Create a symbolic link. /// -/// This is a convenience API similar to [`std::os::unix::fs::symlink`] and -/// [`std::os::windows::fs::symlink_file`] and [`symlink_dir`](std::os::windows::fs::symlink_dir). +/// This is a convenience API similar to `std::os::unix::fs::symlink` and +/// `std::os::windows::fs::symlink_file` and `std::os::windows::fs::symlink_dir`. pub fn symlink_path, U: AsRef>(old_path: P, new_path: U) -> io::Result<()> { crate::sys::fs::symlink(old_path.as_ref(), new_path.as_ref()) } + +fn osstr2str(f: &OsStr) -> io::Result<&str> { + f.to_str().ok_or_else(|| io::Error::new(io::ErrorKind::Other, "input must be utf-8")) +} diff --git a/library/std/src/sys/wasi/ext/io.rs b/library/std/src/sys/wasi/ext/io.rs index 81413f39dc..3c480aa8e1 100644 --- a/library/std/src/sys/wasi/ext/io.rs +++ b/library/std/src/sys/wasi/ext/io.rs @@ -145,36 +145,36 @@ impl IntoRawFd for fs::File { impl AsRawFd for io::Stdin { fn as_raw_fd(&self) -> RawFd { - sys::stdio::Stdin.as_raw_fd() + libc::STDIN_FILENO as RawFd } } impl AsRawFd for io::Stdout { fn as_raw_fd(&self) -> RawFd { - sys::stdio::Stdout.as_raw_fd() + libc::STDOUT_FILENO as RawFd } } impl AsRawFd for io::Stderr { fn as_raw_fd(&self) -> RawFd { - sys::stdio::Stderr.as_raw_fd() + libc::STDERR_FILENO as RawFd } } impl<'a> AsRawFd for io::StdinLock<'a> { fn as_raw_fd(&self) -> RawFd { - sys::stdio::Stdin.as_raw_fd() + libc::STDIN_FILENO as RawFd } } impl<'a> AsRawFd for io::StdoutLock<'a> { fn as_raw_fd(&self) -> RawFd { - sys::stdio::Stdout.as_raw_fd() + libc::STDOUT_FILENO as RawFd } } impl<'a> AsRawFd for io::StderrLock<'a> { fn as_raw_fd(&self) -> RawFd { - sys::stdio::Stderr.as_raw_fd() + libc::STDERR_FILENO as RawFd } } diff --git a/library/std/src/sys/wasi/ext/mod.rs b/library/std/src/sys/wasi/ext/mod.rs index 1cda30edca..b08402f077 100644 --- a/library/std/src/sys/wasi/ext/mod.rs +++ b/library/std/src/sys/wasi/ext/mod.rs @@ -1,4 +1,32 @@ +//! Platform-specific extensions to `std` for WASI. +//! +//! Provides access to platform-level information on WASI, and exposes +//! WASI-specific functions that would otherwise be inappropriate as +//! part of the core `std` library. +//! +//! It exposes more ways to deal with platform-specific strings (`OsStr`, +//! `OsString`), allows to set permissions more granularly, extract low-level +//! file descriptors from files and sockets, and has platform-specific helpers +//! for spawning processes. +//! +//! # Examples +//! +//! ```no_run +//! use std::fs::File; +//! use std::os::wasi::prelude::*; +//! +//! fn main() -> std::io::Result<()> { +//! let f = File::create("foo.txt")?; +//! let fd = f.as_raw_fd(); +//! +//! // use fd with native WASI bindings +//! +//! Ok(()) +//! } +//! ``` + #![deny(unsafe_op_in_unsafe_fn)] +#![doc(cfg(target_os = "wasi"))] pub mod ffi; pub mod fs; @@ -11,14 +39,14 @@ pub mod io; pub mod prelude { #[doc(no_inline)] #[stable(feature = "rust1", since = "1.0.0")] - pub use crate::sys::ext::ffi::{OsStrExt, OsStringExt}; + pub use super::ffi::{OsStrExt, OsStringExt}; #[doc(no_inline)] #[stable(feature = "rust1", since = "1.0.0")] - pub use crate::sys::ext::fs::FileTypeExt; + pub use super::fs::FileTypeExt; #[doc(no_inline)] #[stable(feature = "rust1", since = "1.0.0")] - pub use crate::sys::ext::fs::{DirEntryExt, FileExt, MetadataExt, OpenOptionsExt}; + pub use super::fs::{DirEntryExt, FileExt, MetadataExt, OpenOptionsExt}; #[doc(no_inline)] #[stable(feature = "rust1", since = "1.0.0")] - pub use crate::sys::ext::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; + pub use super::io::{AsRawFd, FromRawFd, IntoRawFd, RawFd}; } diff --git a/library/std/src/sys/wasi/fs.rs b/library/std/src/sys/wasi/fs.rs index a119e66d93..63c2213627 100644 --- a/library/std/src/sys/wasi/fs.rs +++ b/library/std/src/sys/wasi/fs.rs @@ -1,5 +1,6 @@ #![deny(unsafe_op_in_unsafe_fn)] +use super::fd::WasiFd; use crate::ffi::{CStr, CString, OsStr, OsString}; use crate::fmt; use crate::io::{self, IoSlice, IoSliceMut, SeekFrom}; @@ -9,7 +10,6 @@ use crate::os::wasi::ffi::{OsStrExt, OsStringExt}; use crate::path::{Path, PathBuf}; use crate::ptr; use crate::sync::Arc; -use crate::sys::fd::WasiFd; use crate::sys::time::SystemTime; use crate::sys::unsupported; use crate::sys_common::FromInner; @@ -557,12 +557,8 @@ pub fn symlink(original: &Path, link: &Path) -> io::Result<()> { pub fn link(original: &Path, link: &Path) -> io::Result<()> { let (original, original_file) = open_parent(original)?; let (link, link_file) = open_parent(link)?; - original.link( - wasi::LOOKUPFLAGS_SYMLINK_FOLLOW, - osstr2str(original_file.as_ref())?, - &link, - osstr2str(link_file.as_ref())?, - ) + // Pass 0 as the flags argument, meaning don't follow symlinks. + original.link(0, osstr2str(original_file.as_ref())?, &link, osstr2str(link_file.as_ref())?) } pub fn stat(p: &Path) -> io::Result { diff --git a/library/std/src/sys/wasi/net.rs b/library/std/src/sys/wasi/net.rs index 8fd4bb76d8..3f294e7df4 100644 --- a/library/std/src/sys/wasi/net.rs +++ b/library/std/src/sys/wasi/net.rs @@ -1,10 +1,10 @@ #![deny(unsafe_op_in_unsafe_fn)] +use super::fd::WasiFd; use crate::convert::TryFrom; use crate::fmt; use crate::io::{self, IoSlice, IoSliceMut}; use crate::net::{Ipv4Addr, Ipv6Addr, Shutdown, SocketAddr}; -use crate::sys::fd::WasiFd; use crate::sys::{unsupported, Void}; use crate::sys_common::FromInner; use crate::time::Duration; diff --git a/library/std/src/sys/wasi/stdio.rs b/library/std/src/sys/wasi/stdio.rs index d82f6f4118..209d5b996e 100644 --- a/library/std/src/sys/wasi/stdio.rs +++ b/library/std/src/sys/wasi/stdio.rs @@ -1,8 +1,8 @@ #![deny(unsafe_op_in_unsafe_fn)] +use super::fd::WasiFd; use crate::io::{self, IoSlice, IoSliceMut}; use crate::mem::ManuallyDrop; -use crate::sys::fd::WasiFd; pub struct Stdin; pub struct Stdout; diff --git a/library/std/src/sys/windows/c.rs b/library/std/src/sys/windows/c.rs index dec8862081..9789ed085e 100644 --- a/library/std/src/sys/windows/c.rs +++ b/library/std/src/sys/windows/c.rs @@ -1023,7 +1023,7 @@ extern "system" { pub fn HeapFree(hHeap: HANDLE, dwFlags: DWORD, lpMem: LPVOID) -> BOOL; // >= Vista / Server 2008 - // https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createsymboliclinka + // https://docs.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-createsymboliclinkw pub fn CreateSymbolicLinkW( lpSymlinkFileName: LPCWSTR, lpTargetFileName: LPCWSTR, diff --git a/library/std/src/sys/windows/ext/ffi.rs b/library/std/src/sys/windows/ext/ffi.rs index 1df2a0df14..c89b9ff1ef 100644 --- a/library/std/src/sys/windows/ext/ffi.rs +++ b/library/std/src/sys/windows/ext/ffi.rs @@ -53,6 +53,7 @@ #![stable(feature = "rust1", since = "1.0.0")] use crate::ffi::{OsStr, OsString}; +use crate::sealed::Sealed; use crate::sys::os_str::Buf; use crate::sys_common::wtf8::Wtf8Buf; use crate::sys_common::{AsInner, FromInner}; @@ -61,8 +62,11 @@ use crate::sys_common::{AsInner, FromInner}; pub use crate::sys_common::wtf8::EncodeWide; /// Windows-specific extensions to [`OsString`]. +/// +/// This trait is sealed: it cannot be implemented outside the standard library. +/// This is so that future additional methods are not breaking changes. #[stable(feature = "rust1", since = "1.0.0")] -pub trait OsStringExt { +pub trait OsStringExt: Sealed { /// Creates an `OsString` from a potentially ill-formed UTF-16 slice of /// 16-bit code units. /// @@ -92,8 +96,11 @@ impl OsStringExt for OsString { } /// Windows-specific extensions to [`OsStr`]. +/// +/// This trait is sealed: it cannot be implemented outside the standard library. +/// This is so that future additional methods are not breaking changes. #[stable(feature = "rust1", since = "1.0.0")] -pub trait OsStrExt { +pub trait OsStrExt: Sealed { /// Re-encodes an `OsStr` as a wide character sequence, i.e., potentially /// ill-formed UTF-16. /// diff --git a/library/std/src/sys/windows/ext/process.rs b/library/std/src/sys/windows/ext/process.rs index 7a92381d66..67412e1677 100644 --- a/library/std/src/sys/windows/ext/process.rs +++ b/library/std/src/sys/windows/ext/process.rs @@ -4,17 +4,10 @@ use crate::os::windows::io::{AsRawHandle, FromRawHandle, IntoRawHandle, RawHandle}; use crate::process; +use crate::sealed::Sealed; use crate::sys; use crate::sys_common::{AsInner, AsInnerMut, FromInner, IntoInner}; -mod private { - /// This trait being unreachable from outside the crate - /// prevents other implementations of the `ExitStatusExt` trait, - /// which allows potentially adding more trait methods in the future. - #[stable(feature = "none", since = "1.51.0")] - pub trait Sealed {} -} - #[stable(feature = "process_extensions", since = "1.2.0")] impl FromRawHandle for process::Stdio { unsafe fn from_raw_handle(handle: RawHandle) -> process::Stdio { @@ -85,7 +78,7 @@ impl IntoRawHandle for process::ChildStderr { /// This trait is sealed: it cannot be implemented outside the standard library. /// This is so that future additional methods are not breaking changes. #[stable(feature = "exit_status_from", since = "1.12.0")] -pub trait ExitStatusExt: private::Sealed { +pub trait ExitStatusExt: Sealed { /// Creates a new `ExitStatus` from the raw underlying `u32` return value of /// a process. #[stable(feature = "exit_status_from", since = "1.12.0")] @@ -99,12 +92,12 @@ impl ExitStatusExt for process::ExitStatus { } } -#[stable(feature = "none", since = "1.51.0")] -impl private::Sealed for process::ExitStatus {} - /// Windows-specific extensions to the [`process::Command`] builder. +/// +/// This trait is sealed: it cannot be implemented outside the standard library. +/// This is so that future additional methods are not breaking changes. #[stable(feature = "windows_process_extensions", since = "1.16.0")] -pub trait CommandExt { +pub trait CommandExt: Sealed { /// Sets the [process creation flags][1] to be passed to `CreateProcess`. /// /// These will always be ORed with `CREATE_UNICODE_ENVIRONMENT`. @@ -112,6 +105,22 @@ pub trait CommandExt { /// [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; + + /// Forces all arguments to be wrapped in quote (`"`) characters. + /// + /// This is useful for passing arguments to [MSYS2/Cygwin][1] based + /// executables: these programs will expand unquoted arguments containing + /// wildcard characters (`?` and `*`) by searching for any file paths + /// matching the wildcard pattern. + /// + /// Adding quotes has no effect when passing arguments to programs + /// that use [msvcrt][2]. This includes programs built with both + /// MinGW and MSVC. + /// + /// [1]: + /// [2]: + #[unstable(feature = "windows_process_extensions_force_quotes", issue = "82227")] + fn force_quotes(&mut self, enabled: bool) -> &mut process::Command; } #[stable(feature = "windows_process_extensions", since = "1.16.0")] @@ -120,4 +129,9 @@ impl CommandExt for process::Command { self.as_inner_mut().creation_flags(flags); self } + + fn force_quotes(&mut self, enabled: bool) -> &mut process::Command { + self.as_inner_mut().force_quotes(enabled); + self + } } diff --git a/library/std/src/sys/windows/mutex.rs b/library/std/src/sys/windows/mutex.rs index 72a0993d94..12c5ea741f 100644 --- a/library/std/src/sys/windows/mutex.rs +++ b/library/std/src/sys/windows/mutex.rs @@ -23,8 +23,6 @@ pub struct Mutex { } // Windows SRW Locks are movable (while not borrowed). -// ReentrantMutexes (in Inner) are not, but those are stored indirectly through -// a Box, so do not move when the Mutex it self is moved. pub type MovableMutex = Mutex; unsafe impl Send for Mutex {} diff --git a/library/std/src/sys/windows/path.rs b/library/std/src/sys/windows/path.rs index c10c0df4a3..b8f512f6a2 100644 --- a/library/std/src/sys/windows/path.rs +++ b/library/std/src/sys/windows/path.rs @@ -8,7 +8,9 @@ mod tests; pub const MAIN_SEP_STR: &str = "\\"; pub const MAIN_SEP: char = '\\'; -// Safety: `bytes` must be a valid wtf8 encoded slice +/// # Safety +/// +/// `bytes` must be a valid wtf8 encoded slice #[inline] unsafe fn bytes_as_os_str(bytes: &[u8]) -> &OsStr { // &OsStr is layout compatible with &Slice, which is compatible with &Wtf8, @@ -130,7 +132,7 @@ fn parse_next_component(path: &OsStr, verbatim: bool) -> (&OsStr, &OsStr) { // The max `separator_end` is `bytes.len()` and `bytes[bytes.len()..]` is a valid index. let path = &path.bytes()[separator_end..]; - // Safety: `path` is a valid wtf8 encoded slice and each of the separators ('/', '\') + // SAFETY: `path` is a valid wtf8 encoded slice and each of the separators ('/', '\') // is encoded in a single byte, therefore `bytes[separator_start]` and // `bytes[separator_end]` must be code point boundaries and thus // `bytes[..separator_start]` and `bytes[separator_end..]` are valid wtf8 slices. diff --git a/library/std/src/sys/windows/process.rs b/library/std/src/sys/windows/process.rs index 243065b94b..83d37795ee 100644 --- a/library/std/src/sys/windows/process.rs +++ b/library/std/src/sys/windows/process.rs @@ -78,6 +78,7 @@ pub struct Command { stdin: Option, stdout: Option, stderr: Option, + force_quotes_enabled: bool, } pub enum Stdio { @@ -109,6 +110,7 @@ impl Command { stdin: None, stdout: None, stderr: None, + force_quotes_enabled: false, } } @@ -134,6 +136,10 @@ impl Command { self.flags = flags; } + pub fn force_quotes(&mut self, enabled: bool) { + self.force_quotes_enabled = enabled; + } + pub fn get_program(&self) -> &OsStr { &self.program } @@ -181,7 +187,7 @@ impl Command { si.dwFlags = c::STARTF_USESTDHANDLES; let program = program.as_ref().unwrap_or(&self.program); - let mut cmd_str = make_command_line(program, &self.args)?; + let mut cmd_str = make_command_line(program, &self.args, self.force_quotes_enabled)?; cmd_str.push(0); // add null terminator // stolen from the libuv code. @@ -467,7 +473,7 @@ fn zeroed_process_information() -> c::PROCESS_INFORMATION { // Produces a wide string *without terminating null*; returns an error if // `prog` or any of the `args` contain a nul. -fn make_command_line(prog: &OsStr, args: &[OsString]) -> io::Result> { +fn make_command_line(prog: &OsStr, args: &[OsString], force_quotes: bool) -> io::Result> { // Encode the command and arguments in a command line string such // that the spawned process may recover them using CommandLineToArgvW. let mut cmd: Vec = Vec::new(); @@ -476,7 +482,7 @@ fn make_command_line(prog: &OsStr, args: &[OsString]) -> io::Result> { append_arg(&mut cmd, prog, true)?; for arg in args { cmd.push(' ' as u16); - append_arg(&mut cmd, arg, false)?; + append_arg(&mut cmd, arg, force_quotes)?; } return Ok(cmd); diff --git a/library/std/src/sys/windows/process/tests.rs b/library/std/src/sys/windows/process/tests.rs index 81627ad139..8830ae049c 100644 --- a/library/std/src/sys/windows/process/tests.rs +++ b/library/std/src/sys/windows/process/tests.rs @@ -3,29 +3,41 @@ use crate::ffi::{OsStr, OsString}; #[test] fn test_make_command_line() { - fn test_wrapper(prog: &str, args: &[&str]) -> String { + fn test_wrapper(prog: &str, args: &[&str], force_quotes: bool) -> String { let command_line = &make_command_line( OsStr::new(prog), &args.iter().map(|a| OsString::from(a)).collect::>(), + force_quotes, ) .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"], false), "\"prog\" aaa bbb ccc"); assert_eq!( - test_wrapper("C:\\Program Files\\blah\\blah.exe", &["aaa"]), + test_wrapper("C:\\Program Files\\blah\\blah.exe", &["aaa"], false), "\"C:\\Program Files\\blah\\blah.exe\" aaa" ); assert_eq!( - test_wrapper("C:\\Program Files\\test", &["aa\"bb"]), + test_wrapper("C:\\Program Files\\blah\\blah.exe", &["aaa", "v*"], false), + "\"C:\\Program Files\\blah\\blah.exe\" aaa v*" + ); + assert_eq!( + test_wrapper("C:\\Program Files\\blah\\blah.exe", &["aaa", "v*"], true), + "\"C:\\Program Files\\blah\\blah.exe\" \"aaa\" \"v*\"" + ); + assert_eq!( + test_wrapper("C:\\Program Files\\test", &["aa\"bb"], false), "\"C:\\Program Files\\test\" aa\\\"bb" ); - assert_eq!(test_wrapper("echo", &["a b c"]), "\"echo\" \"a b c\""); - assert_eq!(test_wrapper("echo", &["\" \\\" \\", "\\"]), "\"echo\" \"\\\" \\\\\\\" \\\\\" \\"); + assert_eq!(test_wrapper("echo", &["a b c"], false), "\"echo\" \"a b c\""); + assert_eq!( + test_wrapper("echo", &["\" \\\" \\", "\\"], false), + "\"echo\" \"\\\" \\\\\\\" \\\\\" \\" + ); assert_eq!( - test_wrapper("\u{03c0}\u{042f}\u{97f3}\u{00e6}\u{221e}", &[]), + test_wrapper("\u{03c0}\u{042f}\u{97f3}\u{00e6}\u{221e}", &[], false), "\"\u{03c0}\u{042f}\u{97f3}\u{00e6}\u{221e}\"" ); } diff --git a/library/std/src/sys_common/os_str_bytes.rs b/library/std/src/sys_common/os_str_bytes.rs index 497e5fc7bd..302c519740 100644 --- a/library/std/src/sys_common/os_str_bytes.rs +++ b/library/std/src/sys_common/os_str_bytes.rs @@ -6,6 +6,7 @@ use crate::ffi::{OsStr, OsString}; use crate::fmt; use crate::mem; use crate::rc::Rc; +use crate::sealed::Sealed; use crate::str; use crate::sync::Arc; use crate::sys_common::bytestring::debug_fmt_bytestring; @@ -232,8 +233,11 @@ impl Slice { } /// Platform-specific extensions to [`OsString`]. +/// +/// This trait is sealed: it cannot be implemented outside the standard library. +/// This is so that future additional methods are not breaking changes. #[stable(feature = "rust1", since = "1.0.0")] -pub trait OsStringExt { +pub trait OsStringExt: Sealed { /// Creates an [`OsString`] from a byte vector. /// /// See the module documentation for an example. @@ -258,8 +262,11 @@ impl OsStringExt for OsString { } /// Platform-specific extensions to [`OsStr`]. +/// +/// This trait is sealed: it cannot be implemented outside the standard library. +/// This is so that future additional methods are not breaking changes. #[stable(feature = "rust1", since = "1.0.0")] -pub trait OsStrExt { +pub trait OsStrExt: Sealed { #[stable(feature = "rust1", since = "1.0.0")] /// Creates an [`OsStr`] from a byte slice. /// diff --git a/library/std/src/sys_common/rwlock.rs b/library/std/src/sys_common/rwlock.rs index 3705d641a1..70b31b19f8 100644 --- a/library/std/src/sys_common/rwlock.rs +++ b/library/std/src/sys_common/rwlock.rs @@ -86,3 +86,62 @@ impl RWLock { self.0.destroy() } } + +// the cfg annotations only exist due to dead code warnings. the code itself is portable +#[cfg(unix)] +pub struct StaticRWLock(RWLock); + +#[cfg(unix)] +impl StaticRWLock { + pub const fn new() -> StaticRWLock { + StaticRWLock(RWLock::new()) + } + + /// Acquires shared access to the underlying lock, blocking the current + /// thread to do so. + /// + /// The lock is automatically unlocked when the returned guard is dropped. + #[inline] + pub fn read_with_guard(&'static self) -> RWLockReadGuard { + // SAFETY: All methods require static references, therefore self + // cannot be moved between invocations. + unsafe { + self.0.read(); + } + RWLockReadGuard(&self.0) + } + + /// Acquires write access to the underlying lock, blocking the current thread + /// to do so. + /// + /// The lock is automatically unlocked when the returned guard is dropped. + #[inline] + pub fn write_with_guard(&'static self) -> RWLockWriteGuard { + // SAFETY: All methods require static references, therefore self + // cannot be moved between invocations. + unsafe { + self.0.write(); + } + RWLockWriteGuard(&self.0) + } +} + +#[cfg(unix)] +pub struct RWLockReadGuard(&'static RWLock); + +#[cfg(unix)] +impl Drop for RWLockReadGuard { + fn drop(&mut self) { + unsafe { self.0.read_unlock() } + } +} + +#[cfg(unix)] +pub struct RWLockWriteGuard(&'static RWLock); + +#[cfg(unix)] +impl Drop for RWLockWriteGuard { + fn drop(&mut self) { + unsafe { self.0.write_unlock() } + } +} diff --git a/library/std/src/sys_common/thread_local_dtor.rs b/library/std/src/sys_common/thread_local_dtor.rs index 6f5ebf4a27..f9971fb6f2 100644 --- a/library/std/src/sys_common/thread_local_dtor.rs +++ b/library/std/src/sys_common/thread_local_dtor.rs @@ -1,6 +1,6 @@ //! Thread-local destructor //! -//! Besides thread-local "keys" (pointer-sized non-adressable thread-local store +//! Besides thread-local "keys" (pointer-sized non-addressable thread-local store //! with an associated destructor), many platforms also provide thread-local //! destructors that are not associated with any particular data. These are //! often more efficient. diff --git a/library/std/src/thread/mod.rs b/library/std/src/thread/mod.rs index 0d004a516f..0ef848ff0c 100644 --- a/library/std/src/thread/mod.rs +++ b/library/std/src/thread/mod.rs @@ -775,6 +775,15 @@ pub fn sleep_ms(ms: u32) { /// Platforms which do not support nanosecond precision for sleeping will /// have `dur` rounded up to the nearest granularity of time they can sleep for. /// +/// Currently, specifying a zero duration on Unix platforms returns immediately +/// without invoking the underlying [`nanosleep`] syscall, whereas on Windows +/// platforms the underlying [`Sleep`] syscall is always invoked. +/// If the intention is to yield the current time-slice you may want to use +/// [`yield_now`] instead. +/// +/// [`nanosleep`]: https://linux.die.net/man/2/nanosleep +/// [`Sleep`]: https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-sleep +/// /// # Examples /// /// ```no_run diff --git a/library/test/src/cli.rs b/library/test/src/cli.rs index 02c529252e..b7791b1b24 100644 --- a/library/test/src/cli.rs +++ b/library/test/src/cli.rs @@ -10,7 +10,7 @@ use super::time::TestTimeOptions; #[derive(Debug)] pub struct TestOpts { pub list: bool, - pub filter: Option, + pub filters: Vec, pub filter_exact: bool, pub force_run_in_process: bool, pub exclude_should_panic: bool, @@ -51,14 +51,8 @@ fn optgroups() -> getopts::Options { .optflag("", "test", "Run tests and not benchmarks") .optflag("", "bench", "Run benchmarks instead of tests") .optflag("", "list", "List all tests and benchmarks") - .optflag("h", "help", "Display this message (longer with --help)") - .optopt( - "", - "logfile", - "Write logs to the specified file instead \ - of stdout", - "PATH", - ) + .optflag("h", "help", "Display this message") + .optopt("", "logfile", "Write logs to the specified file", "PATH") .optflag( "", "nocapture", @@ -148,12 +142,13 @@ fn optgroups() -> getopts::Options { } fn usage(binary: &str, options: &getopts::Options) { - let message = format!("Usage: {} [OPTIONS] [FILTER]", binary); + let message = format!("Usage: {} [OPTIONS] [FILTERS...]", binary); println!( r#"{usage} The FILTER string is tested against the name of all tests, and only those -tests whose names contain the filter are run. +tests whose names contain the filter are run. Multiple filter strings may +be passed, which will run all tests matching any of the filters. By default, all tests are run in parallel. This can be altered with the --test-threads flag or the RUST_TEST_THREADS environment variable when running @@ -243,7 +238,7 @@ fn parse_opts_impl(matches: getopts::Matches) -> OptRes { let logfile = get_log_file(&matches)?; let run_ignored = get_run_ignored(&matches, include_ignored)?; - let filter = get_filter(&matches)?; + let filters = matches.free.clone(); let nocapture = get_nocapture(&matches)?; let test_threads = get_test_threads(&matches)?; let color = get_color_config(&matches)?; @@ -253,7 +248,7 @@ fn parse_opts_impl(matches: getopts::Matches) -> OptRes { let test_opts = TestOpts { list, - filter, + filters, filter_exact: exact, force_run_in_process, exclude_should_panic, @@ -397,12 +392,6 @@ fn get_run_ignored(matches: &getopts::Matches, include_ignored: bool) -> OptPart Ok(run_ignored) } -fn get_filter(matches: &getopts::Matches) -> OptPartRes> { - let filter = if !matches.free.is_empty() { Some(matches.free[0].clone()) } else { None }; - - Ok(filter) -} - fn get_allow_unstable(matches: &getopts::Matches) -> OptPartRes { let mut allow_unstable = false; diff --git a/library/test/src/event.rs b/library/test/src/event.rs index 297bb72aec..2103a0d10f 100644 --- a/library/test/src/event.rs +++ b/library/test/src/event.rs @@ -24,8 +24,6 @@ impl CompletedTest { } } -unsafe impl Send for CompletedTest {} - #[derive(Debug, Clone)] pub enum TestEvent { TeFiltered(Vec), diff --git a/library/test/src/formatters/pretty.rs b/library/test/src/formatters/pretty.rs index 6fa3692984..5e41d6d969 100644 --- a/library/test/src/formatters/pretty.rs +++ b/library/test/src/formatters/pretty.rs @@ -222,10 +222,6 @@ impl OutputFormatter for PrettyFormatter { } fn write_timeout(&mut self, desc: &TestDesc) -> io::Result<()> { - if self.is_multithreaded { - self.write_test_name(desc)?; - } - self.write_plain(&format!( "test {} has been running for over {} seconds\n", desc.name, diff --git a/library/test/src/lib.rs b/library/test/src/lib.rs index 2d37fdd135..3415eaa9fb 100644 --- a/library/test/src/lib.rs +++ b/library/test/src/lib.rs @@ -31,7 +31,6 @@ #![feature(termination_trait_lib)] #![feature(test)] #![feature(total_cmp)] -#![feature(str_split_once)] // Public reexports pub use self::bench::{black_box, Bencher}; @@ -397,8 +396,8 @@ pub fn filter_tests(opts: &TestOpts, tests: Vec) -> Vec Some(handle), + Err(e) if e.kind() == io::ErrorKind::WouldBlock => { + // `ErrorKind::WouldBlock` means hitting the thread limit on some + // platforms, so run the test synchronously here instead. + Arc::get_mut(&mut runtest).unwrap().get_mut().unwrap().take().unwrap()(); + None + } + Err(e) => panic!("failed to spawn thread to run test: {}", e), + } } else { runtest(); None diff --git a/library/test/src/test_result.rs b/library/test/src/test_result.rs index 598fb670bb..c5c56ca9c7 100644 --- a/library/test/src/test_result.rs +++ b/library/test/src/test_result.rs @@ -24,8 +24,6 @@ pub enum TestResult { TrTimedFail, } -unsafe impl Send for TestResult {} - /// Creates a `TestResult` depending on the raw result of test execution /// and associated data. pub fn calc_result<'a>( diff --git a/library/test/src/tests.rs b/library/test/src/tests.rs index f0586d510d..e3c9b38691 100644 --- a/library/test/src/tests.rs +++ b/library/test/src/tests.rs @@ -27,7 +27,6 @@ use crate::{ }, time::{TestTimeOptions, TimeThreshold}, }; -use std::any::TypeId; use std::sync::mpsc::channel; use std::time::Duration; @@ -35,7 +34,7 @@ impl TestOpts { fn new() -> TestOpts { TestOpts { list: false, - filter: None, + filters: vec![], filter_exact: false, force_run_in_process: false, exclude_should_panic: false, @@ -198,6 +197,7 @@ fn test_should_panic_bad_message() { #[cfg(not(target_os = "emscripten"))] fn test_should_panic_non_string_message_type() { use crate::tests::TrFailedMsg; + use std::any::TypeId; fn f() { std::panic::panic_any(1i32); } @@ -473,43 +473,60 @@ pub fn exact_filter_match() { } let substr = - filter_tests(&TestOpts { filter: Some("base".into()), ..TestOpts::new() }, tests()); + filter_tests(&TestOpts { filters: vec!["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 { filters: vec!["bas".into()], ..TestOpts::new() }, tests()); assert_eq!(substr.len(), 4); let substr = - filter_tests(&TestOpts { filter: Some("::test".into()), ..TestOpts::new() }, tests()); + filter_tests(&TestOpts { filters: vec!["::test".into()], ..TestOpts::new() }, tests()); assert_eq!(substr.len(), 3); let substr = - filter_tests(&TestOpts { filter: Some("base::test".into()), ..TestOpts::new() }, tests()); + filter_tests(&TestOpts { filters: vec!["base::test".into()], ..TestOpts::new() }, tests()); assert_eq!(substr.len(), 3); + let substr = filter_tests( + &TestOpts { filters: vec!["test1".into(), "test2".into()], ..TestOpts::new() }, + tests(), + ); + assert_eq!(substr.len(), 2); + let exact = filter_tests( - &TestOpts { filter: Some("base".into()), filter_exact: true, ..TestOpts::new() }, + &TestOpts { filters: vec!["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 { filters: vec!["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 { filters: vec!["::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 { filters: vec!["base::test".into()], filter_exact: true, ..TestOpts::new() }, tests(), ); assert_eq!(exact.len(), 1); + + let exact = filter_tests( + &TestOpts { + filters: vec!["base".into(), "base::test".into()], + filter_exact: true, + ..TestOpts::new() + }, + tests(), + ); + assert_eq!(exact.len(), 2); } #[test] diff --git a/library/unwind/build.rs b/library/unwind/build.rs index 694e6b98c8..d8bf152e4d 100644 --- a/library/unwind/build.rs +++ b/library/unwind/build.rs @@ -22,8 +22,6 @@ fn main() { } } else if target.contains("freebsd") { println!("cargo:rustc-link-lib=gcc_s"); - } else if target.contains("rumprun") { - println!("cargo:rustc-link-lib=unwind"); } else if target.contains("netbsd") { println!("cargo:rustc-link-lib=gcc_s"); } else if target.contains("openbsd") { diff --git a/library/unwind/src/lib.rs b/library/unwind/src/lib.rs index d145c6767e..be5e56c71e 100644 --- a/library/unwind/src/lib.rs +++ b/library/unwind/src/lib.rs @@ -15,7 +15,7 @@ cfg_if::cfg_if! { target_os = "none", ))] { // These "unix" family members do not have unwinder. - // Note this also matches x86_64-linux-kernel. + // Note this also matches x86_64-unknown-none-linuxkernel. } else if #[cfg(any( unix, windows, diff --git a/src/README.md b/src/README.md index ef0dec1c45..9752bc3f66 100644 --- a/src/README.md +++ b/src/README.md @@ -1,4 +1,5 @@ This directory contains the source code of the rust project, including: + - The test suite - The bootstrapping build system - Various submodules for tools, like rustdoc, rls, etc. diff --git a/src/bootstrap/Cargo.toml b/src/bootstrap/Cargo.toml index e04128d1b0..c14ad6fa5f 100644 --- a/src/bootstrap/Cargo.toml +++ b/src/bootstrap/Cargo.toml @@ -53,7 +53,7 @@ merge = "0.1.0" [target.'cfg(windows)'.dependencies.winapi] version = "0.3" -features = ["fileapi", "ioapiset", "jobapi2", "handleapi", "winioctl"] +features = ["fileapi", "ioapiset", "jobapi2", "handleapi", "winioctl", "psapi", "impl-default"] [dev-dependencies] pretty_assertions = "0.6" diff --git a/src/bootstrap/bin/main.rs b/src/bootstrap/bin/main.rs index a32a4a7fe5..e730a2557e 100644 --- a/src/bootstrap/bin/main.rs +++ b/src/bootstrap/bin/main.rs @@ -22,7 +22,10 @@ fn main() { let suggest_setup = !config.config.exists() && !matches!(config.cmd, Subcommand::Setup { .. }); if suggest_setup { println!("warning: you have not made a `config.toml`"); - println!("help: consider running `x.py setup` or copying `config.toml.example`"); + println!( + "help: consider running `./x.py setup` or copying `config.toml.example` by running \ + `cp config.toml.example config.toml`" + ); } else if let Some(suggestion) = &changelog_suggestion { println!("{}", suggestion); } @@ -31,7 +34,10 @@ fn main() { if suggest_setup { println!("warning: you have not made a `config.toml`"); - println!("help: consider running `x.py setup` or copying `config.toml.example`"); + println!( + "help: consider running `./x.py setup` or copying `config.toml.example` by running \ + `cp config.toml.example config.toml`" + ); } else if let Some(suggestion) = &changelog_suggestion { println!("{}", suggestion); } diff --git a/src/bootstrap/bin/rustc.rs b/src/bootstrap/bin/rustc.rs index 3694bdbf67..d462dc4d11 100644 --- a/src/bootstrap/bin/rustc.rs +++ b/src/bootstrap/bin/rustc.rs @@ -17,7 +17,7 @@ use std::env; use std::path::PathBuf; -use std::process::Command; +use std::process::{Child, Command}; use std::str::FromStr; use std::time::Instant; @@ -138,33 +138,55 @@ fn main() { cmd.arg("-Z").arg("force-unstable-if-unmarked"); } + let is_test = args.iter().any(|a| a == "--test"); if verbose > 1 { + let rust_env_vars = + env::vars().filter(|(k, _)| k.starts_with("RUST") || k.starts_with("CARGO")); + let prefix = if is_test { "[RUSTC-SHIM] rustc --test" } else { "[RUSTC-SHIM] rustc" }; + let prefix = match crate_name { + Some(crate_name) => format!("{} {}", prefix, crate_name), + None => prefix.to_string(), + }; + for (i, (k, v)) in rust_env_vars.enumerate() { + eprintln!("{} env[{}]: {:?}={:?}", prefix, i, k, v); + } + eprintln!("{} working directory: {}", prefix, env::current_dir().unwrap().display()); eprintln!( - "rustc command: {:?}={:?} {:?}", + "{} command: {:?}={:?} {:?}", + prefix, bootstrap::util::dylib_path_var(), env::join_paths(&dylib_path).unwrap(), cmd, ); - eprintln!("sysroot: {:?}", sysroot); - eprintln!("libdir: {:?}", libdir); + eprintln!("{} sysroot: {:?}", prefix, sysroot); + eprintln!("{} libdir: {:?}", prefix, libdir); } let start = Instant::now(); - let status = { + let (child, status) = { let errmsg = format!("\nFailed to run:\n{:?}\n-------------", cmd); - cmd.status().expect(&errmsg) + let mut child = cmd.spawn().expect(&errmsg); + let status = child.wait().expect(&errmsg); + (child, status) }; - if env::var_os("RUSTC_PRINT_STEP_TIMINGS").is_some() { + if env::var_os("RUSTC_PRINT_STEP_TIMINGS").is_some() + || env::var_os("RUSTC_PRINT_STEP_RUSAGE").is_some() + { if let Some(crate_name) = crate_name { let dur = start.elapsed(); - let is_test = args.iter().any(|a| a == "--test"); + // If the user requested resource usage data, then + // include that in addition to the timing output. + let rusage_data = + env::var_os("RUSTC_PRINT_STEP_RUSAGE").and_then(|_| format_rusage_data(child)); eprintln!( - "[RUSTC-TIMING] {} test:{} {}.{:03}", + "[RUSTC-TIMING] {} test:{} {}.{:03}{}{}", crate_name, is_test, dur.as_secs(), - dur.subsec_millis() + dur.subsec_millis(), + if rusage_data.is_some() { " " } else { "" }, + rusage_data.unwrap_or(String::new()), ); } } @@ -192,3 +214,135 @@ fn main() { } } } + +#[cfg(all(not(unix), not(windows)))] +// In the future we can add this for more platforms +fn format_rusage_data(_child: Child) -> Option { + None +} + +#[cfg(windows)] +fn format_rusage_data(child: Child) -> Option { + use std::os::windows::io::AsRawHandle; + use winapi::um::{processthreadsapi, psapi, timezoneapi}; + let handle = child.as_raw_handle(); + macro_rules! try_bool { + ($e:expr) => { + if $e != 1 { + return None; + } + }; + } + + let mut user_filetime = Default::default(); + let mut user_time = Default::default(); + let mut kernel_filetime = Default::default(); + let mut kernel_time = Default::default(); + let mut memory_counters = psapi::PROCESS_MEMORY_COUNTERS::default(); + + unsafe { + try_bool!(processthreadsapi::GetProcessTimes( + handle, + &mut Default::default(), + &mut Default::default(), + &mut kernel_filetime, + &mut user_filetime, + )); + try_bool!(timezoneapi::FileTimeToSystemTime(&user_filetime, &mut user_time)); + try_bool!(timezoneapi::FileTimeToSystemTime(&kernel_filetime, &mut kernel_time)); + + // Unlike on Linux with RUSAGE_CHILDREN, this will only return memory information for the process + // with the given handle and none of that process's children. + try_bool!(psapi::GetProcessMemoryInfo( + handle as _, + &mut memory_counters as *mut _ as _, + std::mem::size_of::() as u32, + )); + } + + // Guide on interpreting these numbers: + // https://docs.microsoft.com/en-us/windows/win32/psapi/process-memory-usage-information + let peak_working_set = memory_counters.PeakWorkingSetSize / 1024; + let peak_page_file = memory_counters.PeakPagefileUsage / 1024; + let peak_paged_pool = memory_counters.QuotaPeakPagedPoolUsage / 1024; + let peak_nonpaged_pool = memory_counters.QuotaPeakNonPagedPoolUsage / 1024; + Some(format!( + "user: {USER_SEC}.{USER_USEC:03} \ + sys: {SYS_SEC}.{SYS_USEC:03} \ + peak working set (kb): {PEAK_WORKING_SET} \ + peak page file usage (kb): {PEAK_PAGE_FILE} \ + peak paged pool usage (kb): {PEAK_PAGED_POOL} \ + peak non-paged pool usage (kb): {PEAK_NONPAGED_POOL} \ + page faults: {PAGE_FAULTS}", + USER_SEC = user_time.wSecond + (user_time.wMinute * 60), + USER_USEC = user_time.wMilliseconds, + SYS_SEC = kernel_time.wSecond + (kernel_time.wMinute * 60), + SYS_USEC = kernel_time.wMilliseconds, + PEAK_WORKING_SET = peak_working_set, + PEAK_PAGE_FILE = peak_page_file, + PEAK_PAGED_POOL = peak_paged_pool, + PEAK_NONPAGED_POOL = peak_nonpaged_pool, + PAGE_FAULTS = memory_counters.PageFaultCount, + )) +} + +#[cfg(unix)] +/// Tries to build a string with human readable data for several of the rusage +/// fields. Note that we are focusing mainly on data that we believe to be +/// supplied on Linux (the `rusage` struct has other fields in it but they are +/// currently unsupported by Linux). +fn format_rusage_data(_child: Child) -> Option { + let rusage: libc::rusage = unsafe { + let mut recv = std::mem::zeroed(); + // -1 is RUSAGE_CHILDREN, which means to get the rusage for all children + // (and grandchildren, etc) processes that have respectively terminated + // and been waited for. + let retval = libc::getrusage(-1, &mut recv); + if retval != 0 { + return None; + } + recv + }; + // Mac OS X reports the maxrss in bytes, not kb. + let divisor = if env::consts::OS == "macos" { 1024 } else { 1 }; + let maxrss = rusage.ru_maxrss + (divisor - 1) / divisor; + + let mut init_str = format!( + "user: {USER_SEC}.{USER_USEC:03} \ + sys: {SYS_SEC}.{SYS_USEC:03} \ + max rss (kb): {MAXRSS}", + USER_SEC = rusage.ru_utime.tv_sec, + USER_USEC = rusage.ru_utime.tv_usec, + SYS_SEC = rusage.ru_stime.tv_sec, + SYS_USEC = rusage.ru_stime.tv_usec, + MAXRSS = maxrss + ); + + // The remaining rusage stats vary in platform support. So we treat + // uniformly zero values in each category as "not worth printing", since it + // either means no events of that type occurred, or that the platform + // does not support it. + + let minflt = rusage.ru_minflt; + let majflt = rusage.ru_majflt; + if minflt != 0 || majflt != 0 { + init_str.push_str(&format!(" page reclaims: {} page faults: {}", minflt, majflt)); + } + + let inblock = rusage.ru_inblock; + let oublock = rusage.ru_oublock; + if inblock != 0 || oublock != 0 { + init_str.push_str(&format!(" fs block inputs: {} fs block outputs: {}", inblock, oublock)); + } + + let nvcsw = rusage.ru_nvcsw; + let nivcsw = rusage.ru_nivcsw; + if nvcsw != 0 || nivcsw != 0 { + init_str.push_str(&format!( + " voluntary ctxt switches: {} involuntary ctxt switches: {}", + nvcsw, nivcsw + )); + } + + return Some(init_str); +} diff --git a/src/bootstrap/bootstrap.py b/src/bootstrap/bootstrap.py index 6708b27b50..3e7d1d54f1 100644 --- a/src/bootstrap/bootstrap.py +++ b/src/bootstrap/bootstrap.py @@ -240,13 +240,16 @@ def default_build_triple(verbose): else: ostype = 'unknown-linux-gnu' elif ostype == 'SunOS': - ostype = 'sun-solaris' + ostype = 'pc-solaris' # On Solaris, uname -m will return a machine classification instead # of a cpu type, so uname -p is recommended instead. However, the # output from that option is too generic for our purposes (it will # always emit 'i386' on x86/amd64 systems). As such, isainfo -k # must be used instead. cputype = require(['isainfo', '-k']).decode(default_encoding) + # sparc cpus have sun as a target vendor + if 'sparc' in cputype: + ostype = 'sun-solaris' elif ostype.startswith('MINGW'): # msys' `uname` does not print gcc configuration, but prints msys # configuration. so we cannot believe `uname -m`: @@ -378,6 +381,7 @@ class RustBuild(object): self.verbose = False self.git_version = None self.nix_deps_dir = None + self.rustc_commit = None def download_stage0(self): """Fetch the build system for Rust, written in Rust @@ -394,20 +398,27 @@ class RustBuild(object): if self.rustc().startswith(self.bin_root()) and \ (not os.path.exists(self.rustc()) or - self.program_out_of_date(self.rustc_stamp(), self.date)): + self.program_out_of_date(self.rustc_stamp(), self.date + str(self.rustc_commit))): if os.path.exists(self.bin_root()): shutil.rmtree(self.bin_root()) + download_rustc = self.rustc_commit is not None tarball_suffix = '.tar.xz' if support_xz() else '.tar.gz' filename = "rust-std-{}-{}{}".format( rustc_channel, self.build, tarball_suffix) pattern = "rust-std-{}".format(self.build) - self._download_stage0_helper(filename, pattern, tarball_suffix) + self._download_component_helper(filename, pattern, tarball_suffix, download_rustc) filename = "rustc-{}-{}{}".format(rustc_channel, self.build, tarball_suffix) - self._download_stage0_helper(filename, "rustc", tarball_suffix) + self._download_component_helper(filename, "rustc", tarball_suffix, download_rustc) filename = "cargo-{}-{}{}".format(rustc_channel, self.build, tarball_suffix) - self._download_stage0_helper(filename, "cargo", tarball_suffix) + self._download_component_helper(filename, "cargo", tarball_suffix) + if self.rustc_commit is not None: + filename = "rustc-dev-{}-{}{}".format(rustc_channel, self.build, tarball_suffix) + self._download_component_helper( + filename, "rustc-dev", tarball_suffix, download_rustc + ) + self.fix_bin_or_dylib("{}/bin/rustc".format(self.bin_root())) self.fix_bin_or_dylib("{}/bin/rustdoc".format(self.bin_root())) self.fix_bin_or_dylib("{}/bin/cargo".format(self.bin_root())) @@ -416,7 +427,7 @@ class RustBuild(object): if lib.endswith(".so"): self.fix_bin_or_dylib(os.path.join(lib_dir, lib), rpath_libz=True) with output(self.rustc_stamp()) as rust_stamp: - rust_stamp.write(self.date) + rust_stamp.write(self.date + str(self.rustc_commit)) if self.rustfmt() and self.rustfmt().startswith(self.bin_root()) and ( not os.path.exists(self.rustfmt()) @@ -426,7 +437,9 @@ class RustBuild(object): 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._download_component_helper( + filename, "rustfmt-preview", tarball_suffix, key=date + ) self.fix_bin_or_dylib("{}/bin/rustfmt".format(self.bin_root())) self.fix_bin_or_dylib("{}/bin/cargo-fmt".format(self.bin_root())) with output(self.rustfmt_stamp()) as rustfmt_stamp: @@ -482,18 +495,27 @@ class RustBuild(object): return opt == "true" \ or (opt == "if-available" and self.build in supported_platforms) - def _download_stage0_helper(self, filename, pattern, tarball_suffix, date=None): - if date is None: - date = self.date + def _download_component_helper( + self, filename, pattern, tarball_suffix, download_rustc=False, key=None + ): + if key is None: + if download_rustc: + key = self.rustc_commit + else: + key = self.date cache_dst = os.path.join(self.build_dir, "cache") - rustc_cache = os.path.join(cache_dst, date) + rustc_cache = os.path.join(cache_dst, key) if not os.path.exists(rustc_cache): os.makedirs(rustc_cache) - url = "{}/dist/{}".format(self._download_url, date) + if download_rustc: + url = "https://ci-artifacts.rust-lang.org/rustc-builds/{}".format(self.rustc_commit) + else: + url = "{}/dist/{}".format(self._download_url, key) tarball = os.path.join(rustc_cache, filename) if not os.path.exists(tarball): - get("{}/{}".format(url, filename), tarball, verbose=self.verbose) + do_verify = not download_rustc + get("{}/{}".format(url, filename), tarball, verbose=self.verbose, do_verify=do_verify) unpack(tarball, tarball_suffix, self.bin_root(), match=pattern, verbose=self.verbose) def _download_ci_llvm(self, llvm_sha, llvm_assertions): @@ -613,6 +635,29 @@ class RustBuild(object): print("warning: failed to call patchelf:", reason) return + # Return the stage1 compiler to download, if any. + def maybe_download_rustc(self): + # If `download-rustc` is not set, default to rebuilding. + if self.get_toml("download-rustc", section="rust") != "true": + return None + + # Handle running from a directory other than the top level + rev_parse = ["git", "rev-parse", "--show-toplevel"] + top_level = subprocess.check_output(rev_parse, universal_newlines=True).strip() + compiler = "{}/compiler/".format(top_level) + + # Look for a version to compare to based on the current commit. + # Only commits merged by bors will have CI artifacts. + merge_base = ["git", "log", "--author=bors", "--pretty=%H", "-n1"] + commit = subprocess.check_output(merge_base, universal_newlines=True).strip() + + # Warn if there were changes to the compiler since the ancestor commit. + status = subprocess.call(["git", "diff-index", "--quiet", commit, "--", compiler]) + if status != 0: + print("warning: `download-rustc` is enabled, but there are changes to compiler/") + + return commit + def rustc_stamp(self): """Return the path for .rustc-stamp @@ -1090,6 +1135,13 @@ def bootstrap(help_triggered): build.update_submodules() # Fetch/build the bootstrap + build.rustc_commit = build.maybe_download_rustc() + if build.rustc_commit is not None: + if build.verbose: + commit = build.rustc_commit + print("using downloaded stage1 artifacts from CI (commit {})".format(commit)) + # FIXME: support downloading artifacts from the beta channel + build.rustc_channel = "nightly" build.download_stage0() sys.stdout.flush() build.ensure_vendored() diff --git a/src/bootstrap/builder.rs b/src/bootstrap/builder.rs index f1a160250d..22a1eb6370 100644 --- a/src/bootstrap/builder.rs +++ b/src/bootstrap/builder.rs @@ -397,6 +397,7 @@ impl<'a> Builder<'a> { test::Crate, test::CrateLibrustc, test::CrateRustdoc, + test::CrateRustdocJsonTypes, test::Linkcheck, test::TierCheck, test::Cargotest, @@ -422,6 +423,7 @@ impl<'a> Builder<'a> { test::CompiletestTest, test::RustdocJSStd, test::RustdocJSNotStd, + test::RustdocGUI, test::RustdocTheme, test::RustdocUi, test::RustdocJson, @@ -561,8 +563,7 @@ impl<'a> Builder<'a> { self.run_step_descriptions(&Builder::get_step_descriptions(self.kind), &self.paths); } - pub fn default_doc(&self, paths: Option<&[PathBuf]>) { - let paths = paths.unwrap_or(&[]); + pub fn default_doc(&self, paths: &[PathBuf]) { self.run_step_descriptions(&Builder::get_step_descriptions(Kind::Doc), paths); } @@ -629,8 +630,12 @@ impl<'a> Builder<'a> { .join("rustlib") .join(self.target.triple) .join("lib"); - let _ = fs::remove_dir_all(&sysroot); - t!(fs::create_dir_all(&sysroot)); + // Avoid deleting the rustlib/ directory we just copied + // (in `impl Step for Sysroot`). + if !builder.config.download_rustc { + let _ = fs::remove_dir_all(&sysroot); + t!(fs::create_dir_all(&sysroot)); + } INTERNER.intern_path(sysroot) } } @@ -731,8 +736,15 @@ impl<'a> Builder<'a> { .env("RUSTDOC_LIBDIR", self.rustc_libdir(compiler)) .env("CFG_RELEASE_CHANNEL", &self.config.channel) .env("RUSTDOC_REAL", self.rustdoc(compiler)) - .env("RUSTC_BOOTSTRAP", "1") - .arg("-Winvalid_codeblock_attributes"); + .env("RUSTC_BOOTSTRAP", "1"); + + // cfg(bootstrap), can be removed on the next beta bump + if compiler.stage == 0 { + cmd.arg("-Winvalid_codeblock_attributes"); + } else { + cmd.arg("-Wrustdoc::invalid_codeblock_attributes"); + } + if self.config.deny_warnings { cmd.arg("-Dwarnings"); } @@ -917,6 +929,12 @@ impl<'a> Builder<'a> { // but this breaks CI. At the very least, stage0 `rustdoc` needs `--cfg bootstrap`. See // #71458. let mut rustdocflags = rustflags.clone(); + rustdocflags.propagate_cargo_env("RUSTDOCFLAGS"); + if stage == 0 { + rustdocflags.env("RUSTDOCFLAGS_BOOTSTRAP"); + } else { + rustdocflags.env("RUSTDOCFLAGS_NOT_BOOTSTRAP"); + } if let Ok(s) = env::var("CARGOFLAGS") { cargo.args(s.split_whitespace()); @@ -1139,18 +1157,10 @@ impl<'a> Builder<'a> { // itself, we skip it by default since we know it's safe to do so in that case. // See https://github.com/rust-lang/rust/issues/79361 for more info on this flag. if target.contains("apple") { - if stage == 0 { - if self.config.rust_run_dsymutil { - rustflags.arg("-Zrun-dsymutil=yes"); - } else { - rustflags.arg("-Zrun-dsymutil=no"); - } + if self.config.rust_run_dsymutil { + rustflags.arg("-Csplit-debuginfo=packed"); } else { - if self.config.rust_run_dsymutil { - rustflags.arg("-Csplit-debuginfo=packed"); - } else { - rustflags.arg("-Csplit-debuginfo=unpacked"); - } + rustflags.arg("-Csplit-debuginfo=unpacked"); } } @@ -1245,6 +1255,10 @@ impl<'a> Builder<'a> { cargo.env("RUSTC_PRINT_STEP_TIMINGS", "1"); } + if self.config.print_step_rusage { + cargo.env("RUSTC_PRINT_STEP_RUSAGE", "1"); + } + if self.config.backtrace_on_ice { cargo.env("RUSTC_BACKTRACE_ON_ICE", "1"); } @@ -1286,7 +1300,12 @@ impl<'a> Builder<'a> { // fixed via better support from Cargo. cargo.env("RUSTC_LINT_FLAGS", lint_flags.join(" ")); - rustdocflags.arg("-Winvalid_codeblock_attributes"); + // cfg(bootstrap), can be removed on the next beta bump + if compiler.stage == 0 { + rustdocflags.arg("-Winvalid_codeblock_attributes"); + } else { + rustdocflags.arg("-Wrustdoc::invalid_codeblock_attributes"); + } } if mode == Mode::Rustc { @@ -1490,7 +1509,7 @@ impl<'a> Builder<'a> { for el in stack.iter().rev() { out += &format!("\t{:?}\n", el); } - panic!(out); + panic!("{}", out); } if let Some(out) = self.cache.get(&step) { self.verbose(&format!("{}c {:?}", " ".repeat(stack.len()), step)); @@ -1530,21 +1549,27 @@ impl<'a> Builder<'a> { mod tests; #[derive(Debug, Clone)] -struct Rustflags(String); +struct Rustflags(String, TargetSelection); impl Rustflags { fn new(target: TargetSelection) -> Rustflags { - let mut ret = Rustflags(String::new()); + let mut ret = Rustflags(String::new(), target); + ret.propagate_cargo_env("RUSTFLAGS"); + ret + } + /// By default, cargo will pick up on various variables in the environment. However, bootstrap + /// reuses those variables to pass additional flags to rustdoc, so by default they get overriden. + /// Explicitly add back any previous value in the environment. + /// + /// `prefix` is usually `RUSTFLAGS` or `RUSTDOCFLAGS`. + fn propagate_cargo_env(&mut self, prefix: &str) { // Inherit `RUSTFLAGS` by default ... - ret.env("RUSTFLAGS"); + self.env(prefix); - // ... and also handle target-specific env RUSTFLAGS if they're - // configured. - let target_specific = format!("CARGO_TARGET_{}_RUSTFLAGS", crate::envify(&target.triple)); - ret.env(&target_specific); - - ret + // ... and also handle target-specific env RUSTFLAGS if they're configured. + let target_specific = format!("CARGO_TARGET_{}_{}", crate::envify(&self.1.triple), prefix); + self.env(&target_specific); } fn env(&mut self, env: &str) { diff --git a/src/bootstrap/builder/tests.rs b/src/bootstrap/builder/tests.rs index 885fcfff03..a881512e98 100644 --- a/src/bootstrap/builder/tests.rs +++ b/src/bootstrap/builder/tests.rs @@ -585,8 +585,11 @@ mod dist { rustfix_coverage: false, pass: None, }; + // Make sure rustfmt binary not being found isn't an error. + config.channel = "beta".to_string(); let build = Build::new(config); let mut builder = Builder::new(&build); + builder.run_step_descriptions(&Builder::get_step_descriptions(Kind::Test), &[]); let a = TargetSelection::from_user("A"); diff --git a/src/bootstrap/clean.rs b/src/bootstrap/clean.rs index 9b9df36e7d..3216c1af26 100644 --- a/src/bootstrap/clean.rs +++ b/src/bootstrap/clean.rs @@ -51,14 +51,40 @@ fn rm_rf(path: &Path) { } Ok(metadata) => { if metadata.file_type().is_file() || metadata.file_type().is_symlink() { - do_op(path, "remove file", |p| fs::remove_file(p)); + do_op(path, "remove file", |p| { + fs::remove_file(p).or_else(|e| { + // Work around the fact that we cannot + // delete an executable while it runs on Windows. + #[cfg(windows)] + if e.kind() == std::io::ErrorKind::PermissionDenied + && p.file_name().and_then(std::ffi::OsStr::to_str) + == Some("bootstrap.exe") + { + eprintln!("warning: failed to delete '{}'.", p.display()); + return Ok(()); + } + Err(e) + }) + }); return; } for file in t!(fs::read_dir(path)) { rm_rf(&t!(file).path()); } - do_op(path, "remove dir", |p| fs::remove_dir(p)); + do_op(path, "remove dir", |p| { + fs::remove_dir(p).or_else(|e| { + // Check for dir not empty on Windows + #[cfg(windows)] + if matches!(e.kind(), std::io::ErrorKind::Other) + && e.raw_os_error() == Some(145) + { + return Ok(()); + } + + Err(e) + }) + }); } }; } @@ -73,12 +99,18 @@ where // 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 => { - let mut p = t!(path.symlink_metadata()).permissions(); + let m = t!(path.symlink_metadata()); + let mut p = m.permissions(); p.set_readonly(false); t!(fs::set_permissions(path, p)); f(path).unwrap_or_else(|e| { + // Delete symlinked directories on Windows + #[cfg(windows)] + if m.file_type().is_symlink() && path.is_dir() && fs::remove_dir(path).is_ok() { + return; + } panic!("failed to {} {}: {}", desc, path.display(), e); - }) + }); } Err(e) => { panic!("failed to {} {}: {}", desc, path.display(), e); diff --git a/src/bootstrap/compile.rs b/src/bootstrap/compile.rs index 65a2d210a9..9398f21172 100644 --- a/src/bootstrap/compile.rs +++ b/src/bootstrap/compile.rs @@ -27,7 +27,7 @@ use crate::config::TargetSelection; use crate::dist; use crate::native; use crate::tool::SourceType; -use crate::util::{exe, is_dylib, symlink_dir}; +use crate::util::{exe, is_debug_info, is_dylib, symlink_dir}; use crate::{Compiler, DependencyType, GitRepo, Mode}; #[derive(Debug, PartialOrd, Ord, Copy, Clone, PartialEq, Eq, Hash)] @@ -41,7 +41,10 @@ impl Step for Std { const DEFAULT: bool = true; fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> { - run.all_krates("test") + // When downloading stage1, the standard library has already been copied to the sysroot, so + // there's no need to rebuild it. + let download_rustc = run.builder.config.download_rustc; + run.all_krates("test").default_condition(!download_rustc) } fn make_run(run: RunConfig<'_>) { @@ -60,6 +63,12 @@ impl Step for Std { let target = self.target; let compiler = self.compiler; + // These artifacts were already copied (in `impl Step for Sysroot`). + // Don't recompile them. + if builder.config.download_rustc { + return; + } + if builder.config.keep_stage.contains(&compiler.stage) || builder.config.keep_stage_std.contains(&compiler.stage) { @@ -175,7 +184,9 @@ fn copy_self_contained_objects( // To do that we have to distribute musl startup objects as a part of Rust toolchain // and link with them manually in the self-contained mode. if target.contains("musl") { - let srcdir = builder.musl_libdir(target).unwrap(); + let srcdir = builder.musl_libdir(target).unwrap_or_else(|| { + panic!("Target {:?} does not have a \"musl-libdir\" key", target.triple) + }); for &obj in &["crt1.o", "Scrt1.o", "rcrt1.o", "crti.o", "crtn.o"] { copy_and_stamp( builder, @@ -186,9 +197,20 @@ fn copy_self_contained_objects( DependencyType::TargetSelfContained, ); } + for &obj in &["crtbegin.o", "crtbeginS.o", "crtend.o", "crtendS.o"] { + let src = compiler_file(builder, builder.cc(target), target, obj); + let target = libdir_self_contained.join(obj); + builder.copy(&src, &target); + target_deps.push((target, DependencyType::TargetSelfContained)); + } } else if target.ends_with("-wasi") { - let srcdir = builder.wasi_root(target).unwrap().join("lib/wasm32-wasi"); - for &obj in &["crt1.o", "crt1-reactor.o"] { + let srcdir = builder + .wasi_root(target) + .unwrap_or_else(|| { + panic!("Target {:?} does not have a \"wasi-root\" key", target.triple) + }) + .join("lib/wasm32-wasi"); + for &obj in &["crt1-command.o", "crt1-reactor.o"] { copy_and_stamp( builder, &libdir_self_contained, @@ -491,6 +513,13 @@ impl Step for Rustc { let compiler = self.compiler; let target = self.target; + if builder.config.download_rustc { + // Copy the existing artifacts instead of rebuilding them. + // NOTE: this path is only taken for tools linking to rustc-dev. + builder.ensure(Sysroot { compiler }); + return; + } + builder.ensure(Std { compiler, target }); if builder.config.keep_stage.contains(&compiler.stage) { @@ -904,6 +933,18 @@ impl Step for Sysroot { let _ = fs::remove_dir_all(&sysroot); t!(fs::create_dir_all(&sysroot)); + // If we're downloading a compiler from CI, we can use the same compiler for all stages other than 0. + if builder.config.download_rustc { + assert_eq!( + builder.config.build, compiler.host, + "Cross-compiling is not yet supported with `download-rustc`", + ); + // Copy the compiler into the correct sysroot. + let stage0_dir = builder.config.out.join(&*builder.config.build.triple).join("stage0"); + builder.cp_r(&stage0_dir, &sysroot); + return INTERNER.intern_path(sysroot); + } + // Symlink the source root into the same location inside the sysroot, // where `rust-src` component would go (`$sysroot/lib/rustlib/src/rust`), // so that any tools relying on `rust-src` also work for local builds, @@ -975,13 +1016,16 @@ impl Step for Assemble { // produce some other architecture compiler we need to start from // `build` to get there. // - // FIXME: Perhaps we should download those libraries? - // It would make builds faster... - // // 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); + // If we're downloading a compiler from CI, we can use the same compiler for all stages other than 0. + if builder.config.download_rustc { + builder.ensure(Sysroot { compiler: target_compiler }); + return target_compiler; + } + // 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 @@ -1031,7 +1075,8 @@ impl Step for Assemble { let src_libdir = builder.sysroot_libdir(build_compiler, host); for f in builder.read_dir(&src_libdir) { let filename = f.file_name().into_string().unwrap(); - if is_dylib(&filename) && !proc_macros.contains(&filename) { + if (is_dylib(&filename) || is_debug_info(&filename)) && !proc_macros.contains(&filename) + { builder.copy(&f.path(), &rustc_libdir.join(&filename)); } } @@ -1148,6 +1193,7 @@ pub fn run_cargo( if !(filename.ends_with(".rlib") || filename.ends_with(".lib") || filename.ends_with(".a") + || is_debug_info(&filename) || is_dylib(&filename) || (is_check && filename.ends_with(".rmeta"))) { diff --git a/src/bootstrap/config.rs b/src/bootstrap/config.rs index ec1308ab82..b9b090bb2d 100644 --- a/src/bootstrap/config.rs +++ b/src/bootstrap/config.rs @@ -51,6 +51,7 @@ pub struct Config { pub submodules: bool, pub fast_submodules: bool, pub compiler_docs: bool, + pub docs_minification: bool, pub docs: bool, pub locked_deps: bool, pub vendor: bool, @@ -80,6 +81,7 @@ pub struct Config { pub cmd: Subcommand, pub incremental: bool, pub dry_run: bool, + pub download_rustc: bool, pub deny_warnings: bool, pub backtrace_on_ice: bool, @@ -160,6 +162,7 @@ pub struct Config { pub verbose_tests: bool, pub save_toolstates: Option, pub print_step_timings: bool, + pub print_step_rusage: bool, pub missing_tools: bool, // Fallback musl-root for all targets @@ -173,6 +176,7 @@ pub struct Config { pub mandir: Option, pub codegen_tests: bool, pub nodejs: Option, + pub npm: Option, pub gdb: Option, pub python: Option, pub cargo_native_static: bool, @@ -359,10 +363,12 @@ struct Build { rustfmt: Option, docs: Option, compiler_docs: Option, + docs_minification: Option, submodules: Option, fast_submodules: Option, gdb: Option, nodejs: Option, + npm: Option, python: Option, locked_deps: Option, vendor: Option, @@ -377,6 +383,7 @@ struct Build { configure_args: Option>, local_rebuild: Option, print_step_timings: Option, + print_step_rusage: Option, check_stage: Option, doc_stage: Option, build_stage: Option, @@ -503,6 +510,7 @@ struct Rust { new_symbol_mangling: Option, profile_generate: Option, profile_use: Option, + download_rustc: Option, } /// TOML representation of how each build target is configured. @@ -551,6 +559,7 @@ impl Config { config.submodules = true; config.fast_submodules = true; config.docs = true; + config.docs_minification = true; config.rust_rpath = true; config.channel = "dev".to_string(); config.codegen_tests = true; @@ -652,10 +661,12 @@ impl Config { }; config.nodejs = build.nodejs.map(PathBuf::from); + config.npm = build.npm.map(PathBuf::from); config.gdb = build.gdb.map(PathBuf::from); config.python = build.python.map(PathBuf::from); set(&mut config.low_priority, build.low_priority); set(&mut config.compiler_docs, build.compiler_docs); + set(&mut config.docs_minification, build.docs_minification); set(&mut config.docs, build.docs); set(&mut config.submodules, build.submodules); set(&mut config.fast_submodules, build.fast_submodules); @@ -674,6 +685,7 @@ impl Config { set(&mut config.configure_args, build.configure_args); set(&mut config.local_rebuild, build.local_rebuild); set(&mut config.print_step_timings, build.print_step_timings); + set(&mut config.print_step_rusage, build.print_step_rusage); // See https://github.com/rust-lang/compiler-team/issues/326 config.stage = match config.cmd { @@ -885,6 +897,7 @@ impl Config { config.rust_codegen_units_std = rust.codegen_units_std.map(threads_from_config); config.rust_profile_use = flags.rust_profile_use.or(rust.profile_use); config.rust_profile_generate = flags.rust_profile_generate.or(rust.profile_generate); + config.download_rustc = rust.download_rustc.unwrap_or(false); } else { config.rust_profile_use = flags.rust_profile_use; config.rust_profile_generate = flags.rust_profile_generate; diff --git a/src/bootstrap/configure.py b/src/bootstrap/configure.py index 2cabaee68e..2e6e9142af 100755 --- a/src/bootstrap/configure.py +++ b/src/bootstrap/configure.py @@ -51,7 +51,7 @@ o("option-checking", None, "complain about unrecognized options in this configur o("ninja", "llvm.ninja", "build LLVM using the Ninja generator (for MSVC, requires building in the correct environment)") o("locked-deps", "build.locked-deps", "force Cargo.lock to be up to date") o("vendor", "build.vendor", "enable usage of vendored Rust crates") -o("sanitizers", "build.sanitizers", "build the sanitizer runtimes (asan, lsan, msan, tsan)") +o("sanitizers", "build.sanitizers", "build the sanitizer runtimes (asan, lsan, msan, tsan, hwasan)") o("dist-src", "rust.dist-src", "when building tarballs enables building a source tarball") o("cargo-native-static", "build.cargo-native-static", "static native libraries in cargo") o("profiler", "build.profiler", "build the profiler runtime") diff --git a/src/bootstrap/dist.rs b/src/bootstrap/dist.rs index 86c84a2a50..78b1d90545 100644 --- a/src/bootstrap/dist.rs +++ b/src/bootstrap/dist.rs @@ -68,7 +68,7 @@ impl Step for Docs { if !builder.config.docs { return None; } - builder.default_doc(None); + builder.default_doc(&[]); let dest = "share/doc/rust/html"; @@ -103,7 +103,7 @@ impl Step for RustcDocs { if !builder.config.compiler_docs { return None; } - builder.default_doc(None); + builder.default_doc(&[]); let mut tarball = Tarball::new(builder, "rustc-docs", &host.triple); tarball.set_product_name("Rustc Documentation"); @@ -645,6 +645,14 @@ impl Step for RustcDev { &[], &tarball.image_dir().join("lib/rustlib/rustc-src/rust"), ); + // This particular crate is used as a build dependency of the above. + copy_src_dirs( + builder, + &builder.src, + &["src/build_helper"], + &[], + &tarball.image_dir().join("lib/rustlib/rustc-src/rust"), + ); for file in src_files { tarball.add_file(builder.src.join(file), "lib/rustlib/rustc-src/rust", 0o644); } diff --git a/src/bootstrap/doc.rs b/src/bootstrap/doc.rs index c4b3e4cf95..1168d54b55 100644 --- a/src/bootstrap/doc.rs +++ b/src/bootstrap/doc.rs @@ -270,6 +270,10 @@ fn invoke_rustdoc( .arg("--markdown-css") .arg("../rust.css"); + if !builder.config.docs_minification { + cmd.arg("-Z").arg("unstable-options").arg("--disable-minification"); + } + builder.run(&mut cmd); } @@ -365,6 +369,10 @@ impl Step for Standalone { .arg(&out) .arg(&path); + if !builder.config.docs_minification { + cmd.arg("--disable-minification"); + } + if filename == "not_found.md" { cmd.arg("--markdown-css").arg("https://doc.rust-lang.org/rust.css"); } else { @@ -437,6 +445,10 @@ impl Step for Std { .arg("--index-page") .arg(&builder.src.join("src/doc/index.md")); + if !builder.config.docs_minification { + cargo.arg("--disable-minification"); + } + builder.run(&mut cargo.into()); }; // Only build the following crates. While we could just iterate over the @@ -626,6 +638,7 @@ impl Step for Rustdoc { // Only include compiler crates, no dependencies of those, such as `libc`. cargo.arg("--no-deps"); cargo.arg("-p").arg("rustdoc"); + cargo.arg("-p").arg("rustdoc-json-types"); cargo.rustdocflag("--document-private-items"); cargo.rustdocflag("--enable-index-page"); diff --git a/src/bootstrap/flags.rs b/src/bootstrap/flags.rs index 55062e11e0..6044899c23 100644 --- a/src/bootstrap/flags.rs +++ b/src/bootstrap/flags.rs @@ -347,7 +347,7 @@ To learn more about a subcommand, run `./x.py -h`", }; // Done specifying what options are possible, so do the getopts parsing - let matches = opts.parse(&args[..]).unwrap_or_else(|e| { + let matches = opts.parse(args).unwrap_or_else(|e| { // Invalid argument/option format println!("\n{}\n", e); usage(1, &opts, false, &subcommand_help); diff --git a/src/bootstrap/format.rs b/src/bootstrap/format.rs index 0ae9f9712d..d21e340814 100644 --- a/src/bootstrap/format.rs +++ b/src/bootstrap/format.rs @@ -3,10 +3,12 @@ use crate::Build; use build_helper::{output, t}; use ignore::WalkBuilder; -use std::path::Path; +use std::collections::VecDeque; +use std::path::{Path, PathBuf}; use std::process::{Command, Stdio}; +use std::sync::mpsc::SyncSender; -fn rustfmt(src: &Path, rustfmt: &Path, path: &Path, check: bool) { +fn rustfmt(src: &Path, rustfmt: &Path, paths: &[PathBuf], check: bool) -> impl FnMut() { 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 @@ -17,17 +19,21 @@ fn rustfmt(src: &Path, rustfmt: &Path, path: &Path, check: bool) { if check { cmd.arg("--check"); } - cmd.arg(&path); + cmd.args(paths); 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`. Or, if you just want to format \ - code, run `./x.py fmt` instead.", - cmd_debug, - ); - std::process::exit(1); + let mut cmd = cmd.spawn().expect("running rustfmt"); + // poor man's async: return a closure that'll wait for rustfmt's completion + move || { + let status = cmd.wait().unwrap(); + if !status.success() { + eprintln!( + "Running `{}` failed.\nIf you're running `tidy`, \ + try again with `--bless`. Or, if you just want to format \ + code, run `./x.py fmt` instead.", + cmd_debug, + ); + std::process::exit(1); + } } } @@ -101,19 +107,58 @@ pub fn format(build: &Build, check: bool) { } 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 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); + }) + .to_path_buf(); + let src = build.src.clone(); + let (tx, rx): (SyncSender, _) = std::sync::mpsc::sync_channel(128); + let walker = + WalkBuilder::new(src.clone()).types(matcher).overrides(ignore_fmt).build_parallel(); + + // there is a lot of blocking involved in spawning a child process and reading files to format. + // spawn more processes than available concurrency to keep the CPU busy + let max_processes = build.jobs() as usize * 2; + + // spawn child processes on a separate thread so we can batch entries we have received from ignore + let thread = std::thread::spawn(move || { + let mut children = VecDeque::new(); + while let Ok(path) = rx.recv() { + // try getting a few more paths from the channel to amortize the overhead of spawning processes + let paths: Vec<_> = rx.try_iter().take(7).chain(std::iter::once(path)).collect(); + + let child = rustfmt(&src, &rustfmt_path, paths.as_slice(), check); + children.push_back(child); + + if children.len() >= max_processes { + // await oldest child + children.pop_front().unwrap()(); + } + } + + // await remaining children + for mut child in children { + child(); + } }); - let src = &build.src; - let walker = WalkBuilder::new(src).types(matcher).overrides(ignore_fmt).build_parallel(); + walker.run(|| { + let tx = tx.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); + t!(tx.send(entry.into_path())); } ignore::WalkState::Continue }) }); + + drop(tx); + + thread.join().unwrap(); } diff --git a/src/bootstrap/install.rs b/src/bootstrap/install.rs index 22124ec67f..b427420d57 100644 --- a/src/bootstrap/install.rs +++ b/src/bootstrap/install.rs @@ -53,7 +53,7 @@ fn install_sh( } fn default_path(config: &Option, default: &str) -> PathBuf { - PathBuf::from(config.as_ref().cloned().unwrap_or_else(|| PathBuf::from(default))) + config.as_ref().cloned().unwrap_or_else(|| PathBuf::from(default)) } fn prepare_dir(mut path: PathBuf) -> String { diff --git a/src/bootstrap/lib.rs b/src/bootstrap/lib.rs index 88fdcfa2d4..5d708d3b25 100644 --- a/src/bootstrap/lib.rs +++ b/src/bootstrap/lib.rs @@ -637,6 +637,10 @@ impl Build { self.out.join(&*target.triple).join("doc") } + fn test_out(&self, target: TargetSelection) -> PathBuf { + self.out.join(&*target.triple).join("test") + } + /// Output directory for all documentation for a target fn compiler_doc_out(&self, target: TargetSelection) -> PathBuf { self.out.join(&*target.triple).join("compiler-doc") diff --git a/src/bootstrap/mk/Makefile.in b/src/bootstrap/mk/Makefile.in index fd39944e17..47cf1172d3 100644 --- a/src/bootstrap/mk/Makefile.in +++ b/src/bootstrap/mk/Makefile.in @@ -45,6 +45,10 @@ check-aux: src/tools/cargo \ src/tools/cargotest \ $(BOOTSTRAP_ARGS) +check-aux-and-gui: check-aux + $(Q)$(BOOTSTRAP) test --stage 2 \ + src/test/rustdoc-gui \ + $(BOOTSTRAP_ARGS) check-bootstrap: $(Q)$(CFG_PYTHON) $(CFG_SRC_DIR)src/bootstrap/bootstrap_test.py dist: diff --git a/src/bootstrap/native.rs b/src/bootstrap/native.rs index 609ac8b366..fb5127bac5 100644 --- a/src/bootstrap/native.rs +++ b/src/bootstrap/native.rs @@ -383,6 +383,8 @@ fn configure_cmake( cfg.define("CMAKE_SYSTEM_NAME", "Windows"); } else if target.contains("haiku") { cfg.define("CMAKE_SYSTEM_NAME", "Haiku"); + } else if target.contains("solaris") || target.contains("illumos") { + cfg.define("CMAKE_SYSTEM_NAME", "SunOS"); } // When cross-compiling we should also set CMAKE_SYSTEM_VERSION, but in // that case like CMake we cannot easily determine system version either. @@ -804,7 +806,7 @@ fn supported_sanitizers( "aarch64-apple-darwin" => darwin_libs("osx", &["asan", "lsan", "tsan"]), "aarch64-fuchsia" => common_libs("fuchsia", "aarch64", &["asan"]), "aarch64-unknown-linux-gnu" => { - common_libs("linux", "aarch64", &["asan", "lsan", "msan", "tsan"]) + common_libs("linux", "aarch64", &["asan", "lsan", "msan", "tsan", "hwasan"]) } "x86_64-apple-darwin" => darwin_libs("osx", &["asan", "lsan", "tsan"]), "x86_64-fuchsia" => common_libs("fuchsia", "x86_64", &["asan"]), diff --git a/src/bootstrap/sanity.rs b/src/bootstrap/sanity.rs index 08acc3d671..ed0cbdf97b 100644 --- a/src/bootstrap/sanity.rs +++ b/src/bootstrap/sanity.rs @@ -113,6 +113,13 @@ pub fn check(build: &mut Build) { .or_else(|| cmd_finder.maybe_have("node")) .or_else(|| cmd_finder.maybe_have("nodejs")); + build.config.npm = build + .config + .npm + .take() + .map(|p| cmd_finder.must_have(p)) + .or_else(|| cmd_finder.maybe_have("npm")); + build.config.gdb = build .config .gdb diff --git a/src/bootstrap/test.rs b/src/bootstrap/test.rs index d9132f20d8..86d940cd73 100644 --- a/src/bootstrap/test.rs +++ b/src/bootstrap/test.rs @@ -111,7 +111,7 @@ impl Step for Linkcheck { builder.info(&format!("Linkcheck ({})", host)); - builder.default_doc(None); + builder.default_doc(&[]); let _time = util::timeit(&builder); try_run( @@ -212,6 +212,7 @@ impl Step for Cargo { if !builder.fail_fast { cargo.arg("--no-fail-fast"); } + cargo.arg("--").args(builder.config.cmd.test_args()); // Don't run cross-compile tests, we may not have cross-compiled libstd libs // available. @@ -688,6 +689,78 @@ impl Step for RustdocJSNotStd { } } +#[derive(Debug, Copy, Clone, Hash, PartialEq, Eq)] +pub struct RustdocGUI { + pub target: TargetSelection, + pub compiler: Compiler, +} + +impl Step for RustdocGUI { + type Output = (); + const DEFAULT: bool = true; + const ONLY_HOSTS: bool = true; + + fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> { + run.path("src/test/rustdoc-gui") + } + + fn make_run(run: RunConfig<'_>) { + let compiler = run.builder.compiler(run.builder.top_stage, run.build_triple()); + run.builder.ensure(RustdocGUI { target: run.target, compiler }); + } + + fn run(self, builder: &Builder<'_>) { + if let (Some(nodejs), Some(npm)) = (&builder.config.nodejs, &builder.config.npm) { + builder.ensure(compile::Std { compiler: self.compiler, target: self.target }); + + // The goal here is to check if the necessary packages are installed, and if not, we + // display a warning and move on. + let mut command = Command::new(&npm); + command.arg("list").arg("--depth=0"); + let lines = command + .output() + .map(|output| String::from_utf8_lossy(&output.stdout).to_string()) + .unwrap_or(String::new()); + if !lines.contains(&" browser-ui-test@") { + println!( + "warning: rustdoc-gui test suite cannot be run because npm `browser-ui-test` \ + dependency is missing", + ); + println!( + "If you want to install the `{0}` dependency, run `npm install {0}`", + "browser-ui-test", + ); + return; + } + + let out_dir = builder.test_out(self.target).join("rustdoc-gui"); + let mut command = builder.rustdoc_cmd(self.compiler); + command.arg("src/test/rustdoc-gui/lib.rs").arg("-o").arg(&out_dir); + builder.run(&mut command); + + for file in fs::read_dir("src/test/rustdoc-gui").unwrap() { + let file = file.unwrap(); + let file_path = file.path(); + let file_name = file.file_name(); + + if !file_name.to_str().unwrap().ends_with(".goml") { + continue; + } + let mut command = Command::new(&nodejs); + command + .arg("src/tools/rustdoc-gui/tester.js") + .arg("--doc-folder") + .arg(out_dir.join("test_docs")) + .arg("--test-file") + .arg(file_path); + builder.run(&mut command); + } + } else { + builder.info("No nodejs found, skipping \"src/test/rustdoc-gui\" tests"); + } + } +} + #[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] pub struct Tidy; @@ -718,6 +791,19 @@ impl Step for Tidy { if builder.config.channel == "dev" || builder.config.channel == "nightly" { builder.info("fmt check"); + if builder.config.initial_rustfmt.is_none() { + let inferred_rustfmt_dir = builder.config.initial_rustc.parent().unwrap(); + eprintln!( + "\ +error: no `rustfmt` binary found in {PATH} +info: `rust.channel` is currently set to \"{CHAN}\" +help: if you are testing a beta branch, set `rust.channel` to \"beta\" in the `config.toml` file +help: to skip test's attempt to check tidiness, pass `--exclude src/tools/tidy` to `x.py test`", + PATH = inferred_rustfmt_dir.display(), + CHAN = builder.config.channel, + ); + std::process::exit(1); + } crate::format::format(&builder.build, !builder.config.cmd.bless()); } } @@ -1003,7 +1089,7 @@ note: if you're sure you want to do this, please open an issue as to why. In the // Avoid depending on rustdoc when we don't need it. if mode == "rustdoc" - || (mode == "run-make" && suite.ends_with("fulldeps")) + || mode == "run-make" || (mode == "ui" && is_rustdoc) || mode == "js-doc-test" || mode == "rustdoc-json" @@ -1048,6 +1134,9 @@ note: if you're sure you want to do this, please open an issue as to why. In the if let Some(ref nodejs) = builder.config.nodejs { cmd.arg("--nodejs").arg(nodejs); } + if let Some(ref npm) = builder.config.npm { + cmd.arg("--npm").arg(npm); + } let mut flags = if is_rustdoc { Vec::new() } else { vec!["-Crpath".to_string()] }; if !is_rustdoc { @@ -1846,6 +1935,77 @@ impl Step for CrateRustdoc { } } +#[derive(Debug, Copy, Clone, PartialEq, Eq, Hash)] +pub struct CrateRustdocJsonTypes { + host: TargetSelection, + test_kind: TestKind, +} + +impl Step for CrateRustdocJsonTypes { + type Output = (); + const DEFAULT: bool = true; + const ONLY_HOSTS: bool = true; + + fn should_run(run: ShouldRun<'_>) -> ShouldRun<'_> { + run.path("src/rustdoc-json-types") + } + + fn make_run(run: RunConfig<'_>) { + let builder = run.builder; + + let test_kind = builder.kind.into(); + + builder.ensure(CrateRustdocJsonTypes { host: run.target, test_kind }); + } + + fn run(self, builder: &Builder<'_>) { + let test_kind = self.test_kind; + let target = self.host; + + // Use the previous stage compiler to reuse the artifacts that are + // created when running compiletest for src/test/rustdoc. If this used + // `compiler`, then it would cause rustdoc to be built *again*, which + // isn't really necessary. + let compiler = builder.compiler_for(builder.top_stage, target, target); + builder.ensure(compile::Rustc { compiler, target }); + + let mut cargo = tool::prepare_tool_cargo( + builder, + compiler, + Mode::ToolRustc, + target, + test_kind.subcommand(), + "src/rustdoc-json-types", + SourceType::InTree, + &[], + ); + if test_kind.subcommand() == "test" && !builder.fail_fast { + cargo.arg("--no-fail-fast"); + } + + cargo.arg("-p").arg("rustdoc-json-types"); + + cargo.arg("--"); + cargo.args(&builder.config.cmd.test_args()); + + if self.host.contains("musl") { + cargo.arg("'-Ctarget-feature=-crt-static'"); + } + + if !builder.config.verbose_tests { + cargo.arg("--quiet"); + } + + builder.info(&format!( + "{} rustdoc-json-types stage{} ({} -> {})", + test_kind, compiler.stage, &compiler.host, target + )); + let _time = util::timeit(&builder); + + try_run(builder, &mut cargo.into()); + } +} + /// Some test suites are run inside emulators or on remote devices, and most /// of our test binaries are linked dynamically which means we need to ship /// the standard library and such to the emulator ahead of time. This step diff --git a/src/bootstrap/tool.rs b/src/bootstrap/tool.rs index bf6bea539e..3fc3b68fd8 100644 --- a/src/bootstrap/tool.rs +++ b/src/bootstrap/tool.rs @@ -47,7 +47,7 @@ impl Step for ToolBuild { fn run(self, builder: &Builder<'_>) -> Option { let compiler = self.compiler; let target = self.target; - let tool = self.tool; + let mut tool = self.tool; let path = self.path; let is_optional_tool = self.is_optional_tool; @@ -208,6 +208,12 @@ impl Step for ToolBuild { None } } else { + // HACK(#82501): on Windows, the tools directory gets added to PATH when running tests, and + // compiletest confuses HTML tidy with the in-tree tidy. Name the in-tree tidy something + // different so the problem doesn't come up. + if tool == "tidy" { + tool = "rust-tidy"; + } 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)); diff --git a/src/bootstrap/util.rs b/src/bootstrap/util.rs index b35d1b99fa..b4421a8271 100644 --- a/src/bootstrap/util.rs +++ b/src/bootstrap/util.rs @@ -32,6 +32,12 @@ pub fn is_dylib(name: &str) -> bool { name.ends_with(".dylib") || name.ends_with(".so") || name.ends_with(".dll") } +/// Returns `true` if the file name given looks like a debug info file +pub fn is_debug_info(name: &str) -> bool { + // FIXME: consider split debug info on other platforms (e.g., Linux, macOS) + name.ends_with(".pdb") +} + /// Returns the corresponding relative library directory that the compiler's /// dylibs will be found in. pub fn libdir(target: TargetSelection) -> &'static str { diff --git a/src/ci/docker/host-x86_64/arm-android/Dockerfile b/src/ci/docker/host-x86_64/arm-android/Dockerfile index f675252fb1..43cdbbe92e 100644 --- a/src/ci/docker/host-x86_64/arm-android/Dockerfile +++ b/src/ci/docker/host-x86_64/arm-android/Dockerfile @@ -36,5 +36,8 @@ ENV SCRIPT python3 ../x.py --stage 2 test --host='' --target $TARGETS COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + COPY scripts/android-start-emulator.sh /scripts/ ENTRYPOINT ["/scripts/android-start-emulator.sh"] diff --git a/src/ci/docker/host-x86_64/dist-aarch64-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-aarch64-linux/Dockerfile index 95c54ca1ab..e6b6b6e53b 100644 --- a/src/ci/docker/host-x86_64/dist-aarch64-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-aarch64-linux/Dockerfile @@ -24,6 +24,9 @@ USER root COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV PATH=$PATH:/x-tools/aarch64-unknown-linux-gnueabi/bin ENV CC_aarch64_unknown_linux_gnu=aarch64-unknown-linux-gnueabi-gcc \ diff --git a/src/ci/docker/host-x86_64/dist-android/Dockerfile b/src/ci/docker/host-x86_64/dist-android/Dockerfile index 258dcea06e..2f0496d7dd 100644 --- a/src/ci/docker/host-x86_64/dist-android/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-android/Dockerfile @@ -9,6 +9,8 @@ RUN . /scripts/android-ndk.sh && \ download_ndk android-ndk-r15c-linux-x86_64.zip && \ make_standalone_toolchain arm 14 && \ make_standalone_toolchain x86 14 && \ + make_standalone_toolchain arm 21 && \ + make_standalone_toolchain x86 21 && \ make_standalone_toolchain arm64 21 && \ make_standalone_toolchain x86_64 21 && \ remove_ndk @@ -36,3 +38,6 @@ ENV SCRIPT python3 ../x.py dist --host='' --target $TARGETS COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh + +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh diff --git a/src/ci/docker/host-x86_64/dist-arm-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-arm-linux/Dockerfile index 88b13eab2d..1be3fecd88 100644 --- a/src/ci/docker/host-x86_64/dist-arm-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-arm-linux/Dockerfile @@ -27,6 +27,9 @@ USER root COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV PATH=$PATH:/x-tools/arm-unknown-linux-gnueabi/bin ENV CC_arm_unknown_linux_gnueabi=arm-unknown-linux-gnueabi-gcc \ diff --git a/src/ci/docker/host-x86_64/dist-armhf-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-armhf-linux/Dockerfile index 977ef08c27..66eb4137a8 100644 --- a/src/ci/docker/host-x86_64/dist-armhf-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-armhf-linux/Dockerfile @@ -19,6 +19,9 @@ USER root COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV PATH=$PATH:/x-tools/arm-unknown-linux-gnueabihf/bin ENV CC_arm_unknown_linux_gnueabihf=arm-unknown-linux-gnueabihf-gcc \ diff --git a/src/ci/docker/host-x86_64/dist-armv7-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-armv7-linux/Dockerfile index 65d713359d..c13f63911f 100644 --- a/src/ci/docker/host-x86_64/dist-armv7-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-armv7-linux/Dockerfile @@ -19,6 +19,9 @@ USER root COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV PATH=$PATH:/x-tools/armv7-unknown-linux-gnueabihf/bin ENV CC_armv7_unknown_linux_gnueabihf=armv7-unknown-linux-gnueabihf-gcc \ diff --git a/src/ci/docker/host-x86_64/dist-i586-gnu-i586-i686-musl/Dockerfile b/src/ci/docker/host-x86_64/dist-i586-gnu-i586-i686-musl/Dockerfile index c734202eef..c98fc7dcff 100644 --- a/src/ci/docker/host-x86_64/dist-i586-gnu-i586-i686-musl/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-i586-gnu-i586-i686-musl/Dockerfile @@ -30,6 +30,9 @@ RUN CC=gcc CFLAGS="-m32 -Wa,-mrelax-relocations=no" \ COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV RUST_CONFIGURE_ARGS \ --musl-root-i586=/musl-i586 \ --musl-root-i686=/musl-i686 \ diff --git a/src/ci/docker/host-x86_64/dist-i686-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-i686-linux/Dockerfile index 22d7cbb0d1..247b539652 100644 --- a/src/ci/docker/host-x86_64/dist-i686-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-i686-linux/Dockerfile @@ -68,11 +68,13 @@ RUN ./build-binutils.sh COPY host-x86_64/dist-x86_64-linux/build-gcc.sh /tmp/ RUN ./build-gcc.sh && apt-get remove -y gcc g++ -# Debian 6 has Python 2.6 by default, but LLVM needs 2.7+ COPY host-x86_64/dist-x86_64-linux/build-python.sh /tmp/ -RUN ./build-python.sh +# Build Python 2.7 needed for Clang 10. +RUN ./build-python.sh 2.7.12 +# Build Python 3 needed for LLVM 12. +RUN ./build-python.sh 3.9.1 -# LLVM needs cmake 3.4.3 or higher, and is planning to raise to 3.13.4. +# LLVM needs cmake 3.13.4 or higher. COPY host-x86_64/dist-x86_64-linux/build-cmake.sh /tmp/ RUN ./build-cmake.sh diff --git a/src/ci/docker/host-x86_64/dist-mips-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-mips-linux/Dockerfile index cb5c17c25a..b0f06569a9 100644 --- a/src/ci/docker/host-x86_64/dist-mips-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-mips-linux/Dockerfile @@ -21,6 +21,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV HOSTS=mips-unknown-linux-gnu ENV RUST_CONFIGURE_ARGS --enable-extended --disable-docs diff --git a/src/ci/docker/host-x86_64/dist-mips64-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-mips64-linux/Dockerfile index 31146e3ead..245c28e1fa 100644 --- a/src/ci/docker/host-x86_64/dist-mips64-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-mips64-linux/Dockerfile @@ -20,6 +20,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV HOSTS=mips64-unknown-linux-gnuabi64 ENV RUST_CONFIGURE_ARGS --enable-extended --disable-docs diff --git a/src/ci/docker/host-x86_64/dist-mips64el-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-mips64el-linux/Dockerfile index dadd50a7e6..03998c8880 100644 --- a/src/ci/docker/host-x86_64/dist-mips64el-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-mips64el-linux/Dockerfile @@ -21,6 +21,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV HOSTS=mips64el-unknown-linux-gnuabi64 ENV RUST_CONFIGURE_ARGS --enable-extended --disable-docs diff --git a/src/ci/docker/host-x86_64/dist-mipsel-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-mipsel-linux/Dockerfile index d2d65565b1..5861727062 100644 --- a/src/ci/docker/host-x86_64/dist-mipsel-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-mipsel-linux/Dockerfile @@ -20,6 +20,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV HOSTS=mipsel-unknown-linux-gnu ENV RUST_CONFIGURE_ARGS --enable-extended --disable-docs diff --git a/src/ci/docker/host-x86_64/dist-powerpc-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-powerpc-linux/Dockerfile index 651daac861..ecaa495e97 100644 --- a/src/ci/docker/host-x86_64/dist-powerpc-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-powerpc-linux/Dockerfile @@ -25,6 +25,9 @@ USER root COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV PATH=$PATH:/x-tools/powerpc-unknown-linux-gnu/bin ENV \ diff --git a/src/ci/docker/host-x86_64/dist-powerpc64-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-powerpc64-linux/Dockerfile index 6ff4d78721..a22d9a7553 100644 --- a/src/ci/docker/host-x86_64/dist-powerpc64-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-powerpc64-linux/Dockerfile @@ -26,6 +26,9 @@ USER root COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV PATH=$PATH:/x-tools/powerpc64-unknown-linux-gnu/bin ENV \ diff --git a/src/ci/docker/host-x86_64/dist-powerpc64le-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-powerpc64le-linux/Dockerfile index c1a621ff10..5157dd4c79 100644 --- a/src/ci/docker/host-x86_64/dist-powerpc64le-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-powerpc64le-linux/Dockerfile @@ -25,6 +25,9 @@ RUN ./build-powerpc64le-toolchain.sh COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV \ AR_powerpc64le_unknown_linux_gnu=powerpc64le-linux-gnu-ar \ CC_powerpc64le_unknown_linux_gnu=powerpc64le-linux-gnu-gcc \ diff --git a/src/ci/docker/host-x86_64/dist-riscv64-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-riscv64-linux/Dockerfile index dff7c47515..80b7793cb7 100644 --- a/src/ci/docker/host-x86_64/dist-riscv64-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-riscv64-linux/Dockerfile @@ -19,6 +19,9 @@ USER root COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV PATH=$PATH:/x-tools/riscv64-unknown-linux-gnu/bin ENV CC_riscv64gc_unknown_linux_gnu=riscv64-unknown-linux-gnu-gcc \ diff --git a/src/ci/docker/host-x86_64/dist-s390x-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-s390x-linux/Dockerfile index 1b261993cf..5e62624395 100644 --- a/src/ci/docker/host-x86_64/dist-s390x-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-s390x-linux/Dockerfile @@ -25,6 +25,9 @@ USER root COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV PATH=$PATH:/x-tools/s390x-ibm-linux-gnu/bin ENV \ diff --git a/src/ci/docker/host-x86_64/dist-various-1/Dockerfile b/src/ci/docker/host-x86_64/dist-various-1/Dockerfile index 4906f183b4..1f8f9fc518 100644 --- a/src/ci/docker/host-x86_64/dist-various-1/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-various-1/Dockerfile @@ -44,9 +44,6 @@ RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-ins WORKDIR /build -COPY host-x86_64/dist-various-1/build-rumprun.sh /build -RUN ./build-rumprun.sh - COPY host-x86_64/dist-various-1/install-x86_64-redox.sh /build RUN ./install-x86_64-redox.sh @@ -112,7 +109,6 @@ ENV RUN_MAKE_TARGETS=$RUN_MAKE_TARGETS,thumbv7em-none-eabihf ENV TARGETS=asmjs-unknown-emscripten ENV TARGETS=$TARGETS,wasm32-unknown-emscripten -ENV TARGETS=$TARGETS,x86_64-rumprun-netbsd ENV TARGETS=$TARGETS,mips-unknown-linux-musl ENV TARGETS=$TARGETS,mipsel-unknown-linux-musl ENV TARGETS=$TARGETS,mips64-unknown-linux-muslabi64 diff --git a/src/ci/docker/host-x86_64/dist-various-1/build-rumprun.sh b/src/ci/docker/host-x86_64/dist-various-1/build-rumprun.sh deleted file mode 100755 index bee2d7a476..0000000000 --- a/src/ci/docker/host-x86_64/dist-various-1/build-rumprun.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/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 - trap - ERR - kill $PING_LOOP_PID - rm /tmp/build.log - set -x -} - -git clone https://github.com/rumpkernel/rumprun -cd rumprun -git reset --hard b04d42225a12a6fae57a78a9c1cf23642e46cd00 -git submodule update --init - -# Disable -Werror, to avoid breaking the build with newer compilers. -CC=cc NOGCCERROR=1 hide_output ./build-rr.sh -d /usr/local hw -cd .. -rm -rf rumprun diff --git a/src/ci/docker/host-x86_64/dist-various-2/Dockerfile b/src/ci/docker/host-x86_64/dist-various-2/Dockerfile index 6cfacc3b8c..de3a99f34f 100644 --- a/src/ci/docker/host-x86_64/dist-various-2/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-various-2/Dockerfile @@ -39,16 +39,16 @@ ENV \ AR_sparcv9_sun_solaris=sparcv9-sun-solaris2.10-ar \ CC_sparcv9_sun_solaris=sparcv9-sun-solaris2.10-gcc \ CXX_sparcv9_sun_solaris=sparcv9-sun-solaris2.10-g++ \ - AR_x86_64_sun_solaris=x86_64-sun-solaris2.10-ar \ - CC_x86_64_sun_solaris=x86_64-sun-solaris2.10-gcc \ - CXX_x86_64_sun_solaris=x86_64-sun-solaris2.10-g++ \ + AR_x86_64_pc_solaris=x86_64-pc-solaris2.10-ar \ + CC_x86_64_pc_solaris=x86_64-pc-solaris2.10-gcc \ + CXX_x86_64_pc_solaris=x86_64-pc-solaris2.10-g++ \ CC_armv7_unknown_linux_gnueabi=arm-linux-gnueabi-gcc-8 \ CXX_armv7_unknown_linux_gnueabi=arm-linux-gnueabi-g++-8 \ AR_x86_64_fortanix_unknown_sgx=ar \ - CC_x86_64_fortanix_unknown_sgx=x86_64-fortanix-unknown-sgx-clang-11 \ - CFLAGS_x86_64_fortanix_unknown_sgx="-mlvi-hardening -mllvm -x86-experimental-lvi-inline-asm-hardening" \ - CXX_x86_64_fortanix_unknown_sgx=x86_64-fortanix-unknown-sgx-clang++-11 \ - CXXFLAGS_x86_64_fortanix_unknown_sgx="-mlvi-hardening -mllvm -x86-experimental-lvi-inline-asm-hardening" \ + CC_x86_64_fortanix_unknown_sgx=clang-11 \ + CFLAGS_x86_64_fortanix_unknown_sgx="-D__ELF__ -isystem/usr/include/x86_64-linux-gnu -mlvi-hardening -mllvm -x86-experimental-lvi-inline-asm-hardening" \ + CXX_x86_64_fortanix_unknown_sgx=clang++-11 \ + CXXFLAGS_x86_64_fortanix_unknown_sgx="-D__ELF__ -isystem/usr/include/x86_64-linux-gnu -mlvi-hardening -mllvm -x86-experimental-lvi-inline-asm-hardening" \ AR_i686_unknown_freebsd=i686-unknown-freebsd11-ar \ CC_i686_unknown_freebsd=i686-unknown-freebsd11-clang \ CXX_i686_unknown_freebsd=i686-unknown-freebsd11-clang++ \ @@ -71,8 +71,6 @@ COPY host-x86_64/dist-various-2/build-solaris-toolchain.sh /tmp/ RUN /tmp/build-solaris-toolchain.sh x86_64 amd64 solaris-i386 RUN /tmp/build-solaris-toolchain.sh sparcv9 sparcv9 solaris-sparc COPY host-x86_64/dist-various-2/build-x86_64-fortanix-unknown-sgx-toolchain.sh /tmp/ -COPY host-x86_64/dist-various-2/x86_64-fortanix-unknown-sgx-clang-wrap.sh /usr/bin/x86_64-fortanix-unknown-sgx-clang-11 -RUN ln -s /usr/bin/x86_64-fortanix-unknown-sgx-clang-11 /usr/bin/x86_64-fortanix-unknown-sgx-clang++-11 RUN /tmp/build-x86_64-fortanix-unknown-sgx-toolchain.sh COPY host-x86_64/dist-various-2/build-wasi-toolchain.sh /tmp/ @@ -100,7 +98,7 @@ ENV TARGETS=$TARGETS,aarch64-fuchsia ENV TARGETS=$TARGETS,wasm32-unknown-unknown ENV TARGETS=$TARGETS,wasm32-wasi ENV TARGETS=$TARGETS,sparcv9-sun-solaris -ENV TARGETS=$TARGETS,x86_64-sun-solaris +ENV TARGETS=$TARGETS,x86_64-pc-solaris ENV TARGETS=$TARGETS,x86_64-unknown-linux-gnux32 ENV TARGETS=$TARGETS,x86_64-fortanix-unknown-sgx ENV TARGETS=$TARGETS,nvptx64-nvidia-cuda diff --git a/src/ci/docker/host-x86_64/dist-various-2/build-solaris-toolchain.sh b/src/ci/docker/host-x86_64/dist-various-2/build-solaris-toolchain.sh index 14fb399aff..ee76fafb1f 100755 --- a/src/ci/docker/host-x86_64/dist-various-2/build-solaris-toolchain.sh +++ b/src/ci/docker/host-x86_64/dist-various-2/build-solaris-toolchain.sh @@ -9,6 +9,19 @@ APT_ARCH=$3 BINUTILS=2.28.1 GCC=6.5.0 +# Choose correct target based on the $ARCH +case "$ARCH" in +x86_64) + TARGET=x86_64-pc-solaris2.10 + ;; +sparcv9) + TARGET=sparcv9-sun-solaris2.10 + ;; +*) + printf 'ERROR: unknown architecture: %s\n' "$ARCH" + exit 1 +esac + # First up, build binutils mkdir binutils cd binutils @@ -16,7 +29,7 @@ cd binutils curl https://ftp.gnu.org/gnu/binutils/binutils-$BINUTILS.tar.xz | tar xJf - mkdir binutils-build cd binutils-build -hide_output ../binutils-$BINUTILS/configure --target=$ARCH-sun-solaris2.10 +hide_output ../binutils-$BINUTILS/configure --target=$TARGET hide_output make -j10 hide_output make install @@ -62,13 +75,13 @@ patch -p0 << 'EOF' -extern size_t strnlen(const char *, size_t); EOF -mkdir /usr/local/$ARCH-sun-solaris2.10/usr -mv usr/include /usr/local/$ARCH-sun-solaris2.10/usr/include -mv usr/lib/$LIB_ARCH/* /usr/local/$ARCH-sun-solaris2.10/lib -mv lib/$LIB_ARCH/* /usr/local/$ARCH-sun-solaris2.10/lib +mkdir /usr/local/$TARGET/usr +mv usr/include /usr/local/$TARGET/usr/include +mv usr/lib/$LIB_ARCH/* /usr/local/$TARGET/lib +mv lib/$LIB_ARCH/* /usr/local/$TARGET/lib -ln -s usr/include /usr/local/$ARCH-sun-solaris2.10/sys-include -ln -s usr/include /usr/local/$ARCH-sun-solaris2.10/include +ln -s usr/include /usr/local/$TARGET/sys-include +ln -s usr/include /usr/local/$TARGET/include cd .. rm -rf solaris @@ -84,7 +97,7 @@ mkdir ../gcc-build cd ../gcc-build hide_output ../gcc-$GCC/configure \ --enable-languages=c,c++ \ - --target=$ARCH-sun-solaris2.10 \ + --target=$TARGET \ --with-gnu-as \ --with-gnu-ld \ --disable-multilib \ diff --git a/src/ci/docker/host-x86_64/dist-various-2/x86_64-fortanix-unknown-sgx-clang-wrap.sh b/src/ci/docker/host-x86_64/dist-various-2/x86_64-fortanix-unknown-sgx-clang-wrap.sh deleted file mode 100755 index c4ff44c37b..0000000000 --- a/src/ci/docker/host-x86_64/dist-various-2/x86_64-fortanix-unknown-sgx-clang-wrap.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -args=("$@") - -for i in "${!args[@]}"; do - # x86_64-fortanix-unknown-sgx doesn't have a C sysroot for things like - # stdint.h and the C++ STL. Unlike GCC, clang will not use the host's - # sysroot instead. Force it. - if [ "${args[$i]}" = "--target=x86_64-fortanix-unknown-sgx" ]; then - args[$i]="--target=x86_64-unknown-linux-gnu" - fi -done - -exec "${0/x86_64-fortanix-unknown-sgx-clang/clang}" "${args[@]}" diff --git a/src/ci/docker/host-x86_64/dist-x86_64-freebsd/Dockerfile b/src/ci/docker/host-x86_64/dist-x86_64-freebsd/Dockerfile index 8413d775ac..121dd3f455 100644 --- a/src/ci/docker/host-x86_64/dist-x86_64-freebsd/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-x86_64-freebsd/Dockerfile @@ -23,6 +23,9 @@ RUN /tmp/freebsd-toolchain.sh x86_64 COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV \ AR_x86_64_unknown_freebsd=x86_64-unknown-freebsd11-ar \ CC_x86_64_unknown_freebsd=x86_64-unknown-freebsd11-clang \ diff --git a/src/ci/docker/host-x86_64/dist-x86_64-illumos/Dockerfile b/src/ci/docker/host-x86_64/dist-x86_64-illumos/Dockerfile index 2a0f6a39c5..c2e44ead51 100644 --- a/src/ci/docker/host-x86_64/dist-x86_64-illumos/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-x86_64-illumos/Dockerfile @@ -22,6 +22,9 @@ RUN bash /tmp/illumos-toolchain.sh x86_64 gcc COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV \ AR_x86_64_unknown_illumos=x86_64-illumos-ar \ CC_x86_64_unknown_illumos=x86_64-illumos-gcc \ diff --git a/src/ci/docker/host-x86_64/dist-x86_64-linux/Dockerfile b/src/ci/docker/host-x86_64/dist-x86_64-linux/Dockerfile index d1b4bbf7ff..4dd4378f19 100644 --- a/src/ci/docker/host-x86_64/dist-x86_64-linux/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-x86_64-linux/Dockerfile @@ -68,11 +68,13 @@ RUN ./build-binutils.sh COPY host-x86_64/dist-x86_64-linux/build-gcc.sh /tmp/ RUN ./build-gcc.sh && apt-get remove -y gcc g++ -# Debian 6 has Python 2.6 by default, but LLVM needs 2.7+ COPY host-x86_64/dist-x86_64-linux/build-python.sh /tmp/ -RUN ./build-python.sh +# Build Python 2.7 needed for Clang 10. +RUN ./build-python.sh 2.7.12 +# Build Python 3 needed for LLVM 12. +RUN ./build-python.sh 3.9.1 -# LLVM needs cmake 3.4.3 or higher, and is planning to raise to 3.13.4. +# LLVM needs cmake 3.13.4 or higher. COPY host-x86_64/dist-x86_64-linux/build-cmake.sh /tmp/ RUN ./build-cmake.sh diff --git a/src/ci/docker/host-x86_64/dist-x86_64-linux/build-python.sh b/src/ci/docker/host-x86_64/dist-x86_64-linux/build-python.sh index c172b97811..970d67b6db 100755 --- a/src/ci/docker/host-x86_64/dist-x86_64-linux/build-python.sh +++ b/src/ci/docker/host-x86_64/dist-x86_64-linux/build-python.sh @@ -3,7 +3,8 @@ set -ex source shared.sh -curl https://www.python.org/ftp/python/2.7.12/Python-2.7.12.tgz | \ +VERSION=$1 +curl https://www.python.org/ftp/python/$VERSION/Python-$VERSION.tgz | \ tar xzf - mkdir python-build @@ -12,10 +13,10 @@ cd python-build # Gotta do some hackery to tell python about our custom OpenSSL build, but other # than that fairly normal. CFLAGS='-I /rustroot/include' LDFLAGS='-L /rustroot/lib -L /rustroot/lib64' \ - hide_output ../Python-2.7.12/configure --prefix=/rustroot + hide_output ../Python-$VERSION/configure --prefix=/rustroot hide_output make -j10 hide_output make install cd .. rm -rf python-build -rm -rf Python-2.7.12 +rm -rf Python-$VERSION diff --git a/src/ci/docker/host-x86_64/dist-x86_64-musl/Dockerfile b/src/ci/docker/host-x86_64/dist-x86_64-musl/Dockerfile index 904ee64db3..08f07eb828 100644 --- a/src/ci/docker/host-x86_64/dist-x86_64-musl/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-x86_64-musl/Dockerfile @@ -20,6 +20,10 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ WORKDIR /build/ +# Build cmake before musl toolchain, as we replace the compiler during that step. +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + COPY scripts/musl-toolchain.sh /build/ # We need to mitigate rust-lang/rust#34978 when compiling musl itself as well RUN CFLAGS="-Wa,-mrelax-relocations=no -Wa,--compress-debug-sections=none -Wl,--compress-debug-sections=none" \ diff --git a/src/ci/docker/host-x86_64/dist-x86_64-netbsd/Dockerfile b/src/ci/docker/host-x86_64/dist-x86_64-netbsd/Dockerfile index f3f7255f15..92bdc9811f 100644 --- a/src/ci/docker/host-x86_64/dist-x86_64-netbsd/Dockerfile +++ b/src/ci/docker/host-x86_64/dist-x86_64-netbsd/Dockerfile @@ -9,6 +9,9 @@ RUN /tmp/build-netbsd-toolchain.sh COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV PATH=$PATH:/x-tools/x86_64-unknown-netbsd/bin ENV \ diff --git a/src/ci/docker/host-x86_64/i686-gnu-nopt/Dockerfile b/src/ci/docker/host-x86_64/i686-gnu-nopt/Dockerfile index 0e28ea9668..0182ebb8b5 100644 --- a/src/ci/docker/host-x86_64/i686-gnu-nopt/Dockerfile +++ b/src/ci/docker/host-x86_64/i686-gnu-nopt/Dockerfile @@ -20,6 +20,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + RUN mkdir -p /config RUN echo "[rust]" > /config/nopt-std-config.toml RUN echo "optimize = false" >> /config/nopt-std-config.toml diff --git a/src/ci/docker/host-x86_64/i686-gnu/Dockerfile b/src/ci/docker/host-x86_64/i686-gnu/Dockerfile index 195601755f..feaab819bd 100644 --- a/src/ci/docker/host-x86_64/i686-gnu/Dockerfile +++ b/src/ci/docker/host-x86_64/i686-gnu/Dockerfile @@ -20,6 +20,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV RUST_CONFIGURE_ARGS --build=i686-unknown-linux-gnu # Exclude some tests that are unlikely to be platform specific, to speed up # this slow job. diff --git a/src/ci/docker/host-x86_64/mingw-check/Dockerfile b/src/ci/docker/host-x86_64/mingw-check/Dockerfile index b2aa5844e4..a9398649cf 100644 --- a/src/ci/docker/host-x86_64/mingw-check/Dockerfile +++ b/src/ci/docker/host-x86_64/mingw-check/Dockerfile @@ -17,6 +17,12 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ pkg-config \ mingw-w64 +RUN curl -sL https://nodejs.org/dist/v14.4.0/node-v14.4.0-linux-x64.tar.xz | tar -xJ +ENV PATH="/node-v14.4.0-linux-x64/bin:${PATH}" +# Install es-check +# Pin its version to prevent unrelated CI failures due to future es-check versions. +RUN npm install es-check@5.2.3 -g + COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh @@ -29,4 +35,6 @@ ENV SCRIPT python3 ../x.py --stage 2 test src/tools/expand-yaml-anchors && \ python3 ../x.py test --stage 0 src/tools/compiletest && \ python3 ../x.py test --stage 2 src/tools/tidy && \ python3 ../x.py doc --stage 0 library/std && \ - /scripts/validate-toolstate.sh + /scripts/validate-toolstate.sh && \ + # Runs checks to ensure that there are no ES5 issues in our JS code. + es-check es5 ../src/librustdoc/html/static/*.js diff --git a/src/ci/docker/host-x86_64/wasm32/Dockerfile b/src/ci/docker/host-x86_64/wasm32/Dockerfile index 096b664534..878c4e3415 100644 --- a/src/ci/docker/host-x86_64/wasm32/Dockerfile +++ b/src/ci/docker/host-x86_64/wasm32/Dockerfile @@ -1,6 +1,6 @@ -FROM ubuntu:16.04 +FROM ubuntu:20.04 -RUN apt-get update && apt-get install -y --no-install-recommends \ +RUN apt-get update && DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \ g++ \ make \ ninja-build \ @@ -51,12 +51,6 @@ ENV EMCC_CFLAGS=-O1 # Emscripten installation is user-specific ENV NO_CHANGE_USER=1 -# FIXME: Re-enable these tests once https://github.com/rust-lang/cargo/pull/7476 -# is picked up by CI +# Exclude library/alloc due to OOM in benches. ENV SCRIPT python3 ../x.py test --stage 2 --host='' --target $TARGETS \ - --exclude library/core \ - --exclude library/alloc \ - --exclude library/proc_macro \ - --exclude library/std \ - --exclude library/term \ - --exclude library/test + --exclude library/alloc diff --git a/src/ci/docker/host-x86_64/x86_64-gnu-aux/Dockerfile b/src/ci/docker/host-x86_64/x86_64-gnu-aux/Dockerfile index a109b36066..00ad7b0a71 100644 --- a/src/ci/docker/host-x86_64/x86_64-gnu-aux/Dockerfile +++ b/src/ci/docker/host-x86_64/x86_64-gnu-aux/Dockerfile @@ -17,10 +17,33 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ libgl1-mesa-dev \ llvm-dev \ libfreetype6-dev \ - libexpat1-dev + libexpat1-dev \ + libexpat1-dev \ + gnupg \ + apt-utils \ + wget \ + fonts-ipafont-gothic \ + fonts-wqy-zenhei \ + fonts-thai-tlwg \ + fonts-kacst \ + fonts-freefont-ttf \ + libxss1 \ + libxtst6 + +RUN curl -sL https://nodejs.org/dist/v14.4.0/node-v14.4.0-linux-x64.tar.xz | tar -xJ +ENV PATH="/node-v14.4.0-linux-x64/bin:${PATH}" + +# Install required dependencies from browser-UI-test framework +# For now, we need to use `--unsafe-perm=true` to go around an issue when npm tries +# to create a new folder. For reference: +# https://github.com/puppeteer/puppeteer/issues/375 +RUN npm install browser-ui-test -g --unsafe-perm=true COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV RUST_CONFIGURE_ARGS --build=x86_64-unknown-linux-gnu -ENV RUST_CHECK_TARGET check-aux +ENV RUST_CHECK_TARGET check-aux-and-gui diff --git a/src/ci/docker/host-x86_64/x86_64-gnu-distcheck/Dockerfile b/src/ci/docker/host-x86_64/x86_64-gnu-distcheck/Dockerfile index 5faa0ccab5..09d9cda02b 100644 --- a/src/ci/docker/host-x86_64/x86_64-gnu-distcheck/Dockerfile +++ b/src/ci/docker/host-x86_64/x86_64-gnu-distcheck/Dockerfile @@ -19,6 +19,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + ENV RUST_CONFIGURE_ARGS --build=x86_64-unknown-linux-gnu --set rust.ignore-git=false ENV SCRIPT python3 ../x.py --stage 2 test distcheck ENV DIST_SRC 1 diff --git a/src/ci/docker/host-x86_64/x86_64-gnu-tools/Dockerfile b/src/ci/docker/host-x86_64/x86_64-gnu-tools/Dockerfile index 89171a6f21..d4838c0d6f 100644 --- a/src/ci/docker/host-x86_64/x86_64-gnu-tools/Dockerfile +++ b/src/ci/docker/host-x86_64/x86_64-gnu-tools/Dockerfile @@ -18,6 +18,9 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ COPY scripts/sccache.sh /scripts/ RUN sh /scripts/sccache.sh +COPY scripts/cmake.sh /scripts/ +RUN /scripts/cmake.sh + COPY host-x86_64/x86_64-gnu-tools/checktools.sh /tmp/ ENV RUST_CONFIGURE_ARGS \ diff --git a/src/ci/docker/scripts/cmake.sh b/src/ci/docker/scripts/cmake.sh new file mode 100755 index 0000000000..7009617340 --- /dev/null +++ b/src/ci/docker/scripts/cmake.sh @@ -0,0 +1,34 @@ +#!/bin/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 + trap - ERR + kill $PING_LOOP_PID + rm /tmp/build.log + set -x +} + +# LLVM 12 requires CMake 3.13.4 or higher. +# This script is not necessary for images using Ubuntu 20.04 or newer. +CMAKE=3.13.4 +curl -L https://github.com/Kitware/CMake/releases/download/v$CMAKE/cmake-$CMAKE.tar.gz | tar xzf - + +mkdir cmake-build +cd cmake-build +hide_output ../cmake-$CMAKE/configure +hide_output make -j$(nproc) +hide_output make install + +cd .. +rm -rf cmake-build +rm -rf cmake-$CMAKE diff --git a/src/ci/docker/scripts/illumos-toolchain.sh b/src/ci/docker/scripts/illumos-toolchain.sh index 8cb5712657..3f1d5f3426 100644 --- a/src/ci/docker/scripts/illumos-toolchain.sh +++ b/src/ci/docker/scripts/illumos-toolchain.sh @@ -18,7 +18,7 @@ x86_64) exit 1 esac -BUILD_TARGET="$ARCH-sun-solaris2.10" +BUILD_TARGET="$ARCH-pc-solaris2.10" # # The illumos and the Solaris build both use the same GCC-level host triple, diff --git a/src/ci/github-actions/ci.yml b/src/ci/github-actions/ci.yml index 9eea6243df..c0a84444a5 100644 --- a/src/ci/github-actions/ci.yml +++ b/src/ci/github-actions/ci.yml @@ -110,7 +110,7 @@ x--expand-yaml-anchors--remove: run: echo "[CI_PR_NUMBER=$num]" env: num: ${{ github.event.number }} - if: success() && !env.SKIP_JOBS && github.event_name == 'pull_request' + if: success() && !env.SKIP_JOB && github.event_name == 'pull_request' - name: add extra environment variables run: src/ci/scripts/setup-environment.sh @@ -531,6 +531,7 @@ jobs: env: SCRIPT: src/ci/docker/host-x86_64/x86_64-gnu-tools/checktools.sh x.py /tmp/toolstate/toolstates.json windows RUST_CONFIGURE_ARGS: --build=x86_64-pc-windows-msvc --save-toolstates=/tmp/toolstate/toolstates.json + DEPLOY_TOOLSTATES_JSON: toolstates-windows.json <<: *job-windows-xl # 32/64-bit MinGW builds. @@ -654,7 +655,7 @@ jobs: if: github.event_name == 'push' && github.ref == 'refs/heads/master' && github.repository == 'rust-lang-ci/rust' steps: - name: checkout the source code - uses: actions/checkout@v1 + uses: actions/checkout@v2 with: fetch-depth: 2 diff --git a/src/ci/pgo.sh b/src/ci/pgo.sh index eb9354b911..95cf1183fc 100755 --- a/src/ci/pgo.sh +++ b/src/ci/pgo.sh @@ -2,14 +2,12 @@ set -euxo pipefail -export RUSTC_BOOTSTRAP=1 - rm -rf /tmp/rustc-pgo python2.7 ../x.py build --target=$PGO_HOST --host=$PGO_HOST \ --stage 2 library/std --rust-profile-generate=/tmp/rustc-pgo -./build/$PGO_HOST/stage2/bin/rustc --edition=2018 \ +RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST/stage2/bin/rustc --edition=2018 \ --crate-type=lib ../library/core/src/lib.rs # Download and build a single-file stress test benchmark on perf.rust-lang.org. @@ -18,7 +16,9 @@ function pgo_perf_benchmark { local github_prefix=https://raw.githubusercontent.com/rust-lang/rustc-perf/$PERF local name=$1 curl -o /tmp/$name.rs $github_prefix/collector/benchmarks/$name/src/lib.rs - ./build/$PGO_HOST/stage2/bin/rustc --edition=2018 --crate-type=lib /tmp/$name.rs + + RUSTC_BOOTSTRAP=1 ./build/$PGO_HOST/stage2/bin/rustc --edition=2018 \ + --crate-type=lib /tmp/$name.rs } pgo_perf_benchmark externs diff --git a/src/ci/run.sh b/src/ci/run.sh index a408fa83e5..02d868f8f2 100755 --- a/src/ci/run.sh +++ b/src/ci/run.sh @@ -68,7 +68,7 @@ fi # # FIXME: need a scheme for changing this `nightly` value to `beta` and `stable` # either automatically or manually. -export RUST_RELEASE_CHANNEL=stable +export RUST_RELEASE_CHANNEL=beta # 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 diff --git a/src/doc/book/.github/workflows/main.yml b/src/doc/book/.github/workflows/main.yml index 976890d727..48eb4e25ae 100644 --- a/src/doc/book/.github/workflows/main.yml +++ b/src/doc/book/.github/workflows/main.yml @@ -12,8 +12,8 @@ jobs: - name: Install Rust run: | rustup set profile minimal - rustup toolchain install 1.49 -c rust-docs - rustup default 1.49 + rustup toolchain install 1.50 -c rust-docs + rustup default 1.50 - name: Install mdbook run: | mkdir bin diff --git a/src/doc/book/ADMIN_TASKS.md b/src/doc/book/ADMIN_TASKS.md index 036b0d8068..6cef05fdf3 100644 --- a/src/doc/book/ADMIN_TASKS.md +++ b/src/doc/book/ADMIN_TASKS.md @@ -5,6 +5,7 @@ remember how to do occasional maintenance tasks. ## Update the `rustc` version +- Delete your `target` directory, you're about to recompile everything anyway - Change the version number in `.github/workflows/main.yml` - Change the version number in `rust-toolchain`, which should change the version you're using locally with `rustup` diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.lock b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.lock index 26af308db4..0a2f222c21 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.lock +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.lock @@ -1,87 +1,83 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "bitflags" -version = "1.2.1" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "getrandom" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "guessing_game" version = "0.1.0" dependencies = [ - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", ] [[package]] name = "libc" -version = "0.2.66" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.5.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "rand_chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" -version = "0.4.2" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.8" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 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)", + "getrandom", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "rand_hc" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum libc 0.2.66 (registry+https://github.com/rust-lang/crates.io-index)" = "d515b1f41455adea1313a4a2ac8a8a477634fbae63cc6100e3aebb207ce61558" -"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -"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 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" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.toml b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.toml index 10932024b4..930a7d9518 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.toml +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-02/Cargo.toml @@ -7,4 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.5.5" +rand = "0.8.3" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.lock b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.lock index 2b3d41ad67..0a2f222c21 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.lock +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.lock @@ -1,87 +1,83 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "bitflags" -version = "1.2.0" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "getrandom" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "guessing_game" version = "0.1.0" dependencies = [ - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", ] [[package]] name = "libc" -version = "0.2.51" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.5.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "rand_chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 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)", + "getrandom", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "rand_hc" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a606a02debe2813760609f57a64a2ffd27d9fdf5b2f133eaca0b248dd92cdd2" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917" -"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" -"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-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.toml b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.toml index 10932024b4..930a7d9518 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.toml +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-03/Cargo.toml @@ -7,4 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.5.5" +rand = "0.8.3" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-03/src/main.rs b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-03/src/main.rs index d5e3df7f61..de35846acd 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-03/src/main.rs +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-03/src/main.rs @@ -8,7 +8,7 @@ fn main() { println!("Guess the number!"); // ANCHOR: ch07-04 - let secret_number = rand::thread_rng().gen_range(1, 101); + let secret_number = rand::thread_rng().gen_range(1..101); // ANCHOR_END: ch07-04 println!("The secret number is: {}", secret_number); diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.lock b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.lock index 2b3d41ad67..0a2f222c21 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.lock +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.lock @@ -1,87 +1,83 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "bitflags" -version = "1.2.0" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "getrandom" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "guessing_game" version = "0.1.0" dependencies = [ - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", ] [[package]] name = "libc" -version = "0.2.51" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.5.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "rand_chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 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)", + "getrandom", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "rand_hc" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a606a02debe2813760609f57a64a2ffd27d9fdf5b2f133eaca0b248dd92cdd2" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917" -"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" -"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-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.toml b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.toml index 10932024b4..930a7d9518 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.toml +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/Cargo.toml @@ -7,4 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.5.5" +rand = "0.8.3" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/output.txt b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/output.txt index 60e34d2456..6ee46be8bc 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/output.txt +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/output.txt @@ -1,8 +1,11 @@ $ cargo build - Compiling libc v0.2.51 - Compiling rand_core v0.4.0 - Compiling rand_core v0.3.1 - Compiling rand v0.5.6 + Compiling libc v0.2.86 + Compiling getrandom v0.2.2 + Compiling cfg-if v1.0.0 + Compiling ppv-lite86 v0.2.10 + Compiling rand_core v0.6.2 + Compiling rand_chacha v0.3.0 + Compiling rand v0.8.3 Compiling guessing_game v0.1.0 (file:///projects/guessing_game) error[E0308]: mismatched types --> src/main.rs:22:21 diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/src/main.rs b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/src/main.rs index ac432df3d0..349bc277fc 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/src/main.rs +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-04/src/main.rs @@ -8,7 +8,7 @@ fn main() { // ANCHOR_END: here println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1, 101); + let secret_number = rand::thread_rng().gen_range(1..101); println!("The secret number is: {}", secret_number); diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.lock b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.lock index 2b3d41ad67..0a2f222c21 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.lock +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.lock @@ -1,87 +1,83 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "bitflags" -version = "1.2.0" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "getrandom" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "guessing_game" version = "0.1.0" dependencies = [ - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", ] [[package]] name = "libc" -version = "0.2.51" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.5.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "rand_chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 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)", + "getrandom", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "rand_hc" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a606a02debe2813760609f57a64a2ffd27d9fdf5b2f133eaca0b248dd92cdd2" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917" -"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" -"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-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.toml b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.toml index 10932024b4..930a7d9518 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.toml +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-05/Cargo.toml @@ -7,4 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.5.5" +rand = "0.8.3" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-05/src/main.rs b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-05/src/main.rs index e4f4f87d98..41a4cdd148 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-05/src/main.rs +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-05/src/main.rs @@ -5,7 +5,7 @@ use std::io; fn main() { println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1, 101); + let secret_number = rand::thread_rng().gen_range(1..101); println!("The secret number is: {}", secret_number); diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.lock b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.lock index 890a658000..0a2f222c21 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.lock +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.lock @@ -1,87 +1,83 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "bitflags" -version = "1.2.0" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "getrandom" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "guessing_game" version = "0.1.0" dependencies = [ - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", ] [[package]] name = "libc" -version = "0.2.53" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.5.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.53 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "rand_chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 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)", + "getrandom", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "rand_hc" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a606a02debe2813760609f57a64a2ffd27d9fdf5b2f133eaca0b248dd92cdd2" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum libc 0.2.53 (registry+https://github.com/rust-lang/crates.io-index)" = "ec350a9417dfd244dc9a6c4a71e13895a4db6b92f0b106f07ebbc3f3bc580cee" -"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" -"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-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.toml b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.toml index 10932024b4..930a7d9518 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.toml +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-06/Cargo.toml @@ -7,4 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.5.5" +rand = "0.8.3" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-06/src/main.rs b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-06/src/main.rs index 0d4006e946..30859c70ee 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-06/src/main.rs +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/listing-02-06/src/main.rs @@ -5,7 +5,7 @@ use std::io; fn main() { println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1, 101); + let secret_number = rand::thread_rng().gen_range(1..101); loop { println!("Please input your guess."); diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.lock b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.lock index 2b3d41ad67..0a2f222c21 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.lock +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.lock @@ -1,87 +1,83 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "bitflags" -version = "1.2.0" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "getrandom" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "guessing_game" version = "0.1.0" dependencies = [ - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", ] [[package]] name = "libc" -version = "0.2.51" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.5.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "rand_chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 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)", + "getrandom", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "rand_hc" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a606a02debe2813760609f57a64a2ffd27d9fdf5b2f133eaca0b248dd92cdd2" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917" -"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" -"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-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.toml b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.toml index 10932024b4..930a7d9518 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.toml +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/Cargo.toml @@ -7,4 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.5.5" +rand = "0.8.3" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/src/main.rs b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/src/main.rs index 3e829e53f1..0b21d95891 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/src/main.rs +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-03-convert-string-to-number/src/main.rs @@ -5,7 +5,7 @@ use std::io; fn main() { println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1, 101); + let secret_number = rand::thread_rng().gen_range(1..101); println!("The secret number is: {}", secret_number); diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.lock b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.lock index 2b3d41ad67..0a2f222c21 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.lock +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.lock @@ -1,87 +1,83 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "bitflags" -version = "1.2.0" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "getrandom" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "guessing_game" version = "0.1.0" dependencies = [ - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", ] [[package]] name = "libc" -version = "0.2.51" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.5.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "rand_chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 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)", + "getrandom", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "rand_hc" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a606a02debe2813760609f57a64a2ffd27d9fdf5b2f133eaca0b248dd92cdd2" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917" -"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" -"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-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.toml b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.toml index 10932024b4..930a7d9518 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.toml +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-04-looping/Cargo.toml @@ -7,4 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.5.5" +rand = "0.8.3" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-04-looping/src/main.rs b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-04-looping/src/main.rs index 5b42f65578..61a5dc018f 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-04-looping/src/main.rs +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-04-looping/src/main.rs @@ -5,7 +5,7 @@ use std::io; fn main() { println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1, 101); + let secret_number = rand::thread_rng().gen_range(1..101); // ANCHOR: here // --snip-- diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.lock b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.lock index 2b3d41ad67..0a2f222c21 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.lock +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.lock @@ -1,87 +1,83 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "bitflags" -version = "1.2.0" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "getrandom" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "guessing_game" version = "0.1.0" dependencies = [ - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", ] [[package]] name = "libc" -version = "0.2.51" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.5.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "rand_chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 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)", + "getrandom", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "rand_hc" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a606a02debe2813760609f57a64a2ffd27d9fdf5b2f133eaca0b248dd92cdd2" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917" -"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" -"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-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.toml b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.toml index 10932024b4..930a7d9518 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.toml +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/Cargo.toml @@ -7,4 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.5.5" +rand = "0.8.3" diff --git a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/src/main.rs b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/src/main.rs index b32fadbb12..3f8e8b7715 100644 --- a/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/src/main.rs +++ b/src/doc/book/listings/ch02-guessing-game-tutorial/no-listing-05-quitting/src/main.rs @@ -5,7 +5,7 @@ use std::io; fn main() { println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1, 101); + let secret_number = rand::thread_rng().gen_range(1..101); println!("The secret number is: {}", secret_number); diff --git a/src/doc/book/listings/ch04-understanding-ownership/listing-04-03/src/main.rs b/src/doc/book/listings/ch04-understanding-ownership/listing-04-03/src/main.rs index 23906b4306..b001cc5f4a 100644 --- a/src/doc/book/listings/ch04-understanding-ownership/listing-04-03/src/main.rs +++ b/src/doc/book/listings/ch04-understanding-ownership/listing-04-03/src/main.rs @@ -7,7 +7,7 @@ fn main() { let x = 5; // x comes into scope makes_copy(x); // x would move into the function, - // but i32 is Copy, so it’s okay to still + // but i32 is Copy, so it's okay to still // use x afterward } // Here, x goes out of scope, then s. But because s's value was moved, nothing diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-08/Cargo.lock b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-08/Cargo.lock index bede081a0c..4aabe7da60 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-08/Cargo.lock +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-08/Cargo.lock @@ -1,6 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "structs" +name = "rectangles" version = "0.1.0" - diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-08/Cargo.toml b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-08/Cargo.toml index 431e5c3051..58787d22de 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-08/Cargo.toml +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-08/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "structs" +name = "rectangles" version = "0.1.0" authors = ["Your Name "] edition = "2018" diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-08/output.txt b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-08/output.txt index 88e10d320a..c44b58238d 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-08/output.txt +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-08/output.txt @@ -1,5 +1,5 @@ $ cargo run - Compiling structs v0.1.0 (file:///projects/structs) + Compiling rectangles v0.1.0 (file:///projects/rectangles) Finished dev [unoptimized + debuginfo] target(s) in 0.42s - Running `target/debug/structs` + Running `target/debug/rectangles` The area of the rectangle is 1500 square pixels. diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-09/Cargo.lock b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-09/Cargo.lock index bede081a0c..4aabe7da60 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-09/Cargo.lock +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-09/Cargo.lock @@ -1,6 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "structs" +name = "rectangles" version = "0.1.0" - diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-09/Cargo.toml b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-09/Cargo.toml index 431e5c3051..58787d22de 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-09/Cargo.toml +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-09/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "structs" +name = "rectangles" version = "0.1.0" authors = ["Your Name "] edition = "2018" diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-10/Cargo.lock b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-10/Cargo.lock index bede081a0c..4aabe7da60 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-10/Cargo.lock +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-10/Cargo.lock @@ -1,6 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "structs" +name = "rectangles" version = "0.1.0" - diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-10/Cargo.toml b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-10/Cargo.toml index 431e5c3051..58787d22de 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-10/Cargo.toml +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-10/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "structs" +name = "rectangles" version = "0.1.0" authors = ["Your Name "] edition = "2018" diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-11/Cargo.lock b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-11/Cargo.lock index bede081a0c..4aabe7da60 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-11/Cargo.lock +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-11/Cargo.lock @@ -1,6 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "structs" +name = "rectangles" version = "0.1.0" - diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-11/Cargo.toml b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-11/Cargo.toml index 431e5c3051..58787d22de 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-11/Cargo.toml +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-11/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "structs" +name = "rectangles" version = "0.1.0" authors = ["Your Name "] edition = "2018" diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-11/output.txt b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-11/output.txt index fbf73a6d84..4a3f46236c 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-11/output.txt +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-11/output.txt @@ -1,5 +1,5 @@ $ cargo run - Compiling structs v0.1.0 (file:///projects/structs) + Compiling rectangles v0.1.0 (file:///projects/rectangles) error[E0277]: `Rectangle` doesn't implement `std::fmt::Display` --> src/main.rs:12:29 | @@ -14,6 +14,6 @@ error[E0277]: `Rectangle` doesn't implement `std::fmt::Display` error: aborting due to previous error For more information about this error, try `rustc --explain E0277`. -error: could not compile `structs` +error: could not compile `rectangles` To learn more, run the command again with --verbose. diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-12/Cargo.lock b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-12/Cargo.lock index bede081a0c..4aabe7da60 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-12/Cargo.lock +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-12/Cargo.lock @@ -1,6 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "structs" +name = "rectangles" version = "0.1.0" - diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-12/Cargo.toml b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-12/Cargo.toml index 431e5c3051..58787d22de 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-12/Cargo.toml +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-12/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "structs" +name = "rectangles" version = "0.1.0" authors = ["Your Name "] edition = "2018" diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-12/output.txt b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-12/output.txt index 3abfb42574..c37be6b5bf 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-12/output.txt +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-12/output.txt @@ -1,5 +1,5 @@ $ cargo run - Compiling structs v0.1.0 (file:///projects/structs) + Compiling rectangles v0.1.0 (file:///projects/rectangles) Finished dev [unoptimized + debuginfo] target(s) in 0.48s - Running `target/debug/structs` + Running `target/debug/rectangles` rect1 is Rectangle { width: 30, height: 50 } diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-13/Cargo.lock b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-13/Cargo.lock index bede081a0c..4aabe7da60 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-13/Cargo.lock +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-13/Cargo.lock @@ -1,6 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "structs" +name = "rectangles" version = "0.1.0" - diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-13/Cargo.toml b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-13/Cargo.toml index 431e5c3051..58787d22de 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-13/Cargo.toml +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-13/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "structs" +name = "rectangles" version = "0.1.0" authors = ["Your Name "] edition = "2018" diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-14/Cargo.lock b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-14/Cargo.lock index bede081a0c..4aabe7da60 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-14/Cargo.lock +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-14/Cargo.lock @@ -1,6 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "structs" +name = "rectangles" version = "0.1.0" - diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-14/Cargo.toml b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-14/Cargo.toml index 431e5c3051..58787d22de 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-14/Cargo.toml +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-14/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "structs" +name = "rectangles" version = "0.1.0" authors = ["Your Name "] edition = "2018" diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-15/Cargo.lock b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-15/Cargo.lock index bede081a0c..4aabe7da60 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-15/Cargo.lock +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-15/Cargo.lock @@ -1,6 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "structs" +name = "rectangles" version = "0.1.0" - diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-15/Cargo.toml b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-15/Cargo.toml index 431e5c3051..58787d22de 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-15/Cargo.toml +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-15/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "structs" +name = "rectangles" version = "0.1.0" authors = ["Your Name "] edition = "2018" diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-16/Cargo.lock b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-16/Cargo.lock index bede081a0c..4aabe7da60 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-16/Cargo.lock +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-16/Cargo.lock @@ -1,6 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "structs" +name = "rectangles" version = "0.1.0" - diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-16/Cargo.toml b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-16/Cargo.toml index 431e5c3051..58787d22de 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-16/Cargo.toml +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/listing-05-16/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "structs" +name = "rectangles" version = "0.1.0" authors = ["Your Name "] edition = "2018" diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/no-listing-03-associated-functions/Cargo.lock b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/no-listing-03-associated-functions/Cargo.lock index bede081a0c..4aabe7da60 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/no-listing-03-associated-functions/Cargo.lock +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/no-listing-03-associated-functions/Cargo.lock @@ -1,6 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "structs" +name = "rectangles" version = "0.1.0" - diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/no-listing-03-associated-functions/Cargo.toml b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/no-listing-03-associated-functions/Cargo.toml index 431e5c3051..58787d22de 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/no-listing-03-associated-functions/Cargo.toml +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/no-listing-03-associated-functions/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "structs" +name = "rectangles" version = "0.1.0" authors = ["Your Name "] edition = "2018" diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-01-debug/Cargo.lock b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-01-debug/Cargo.lock index bede081a0c..4aabe7da60 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-01-debug/Cargo.lock +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-01-debug/Cargo.lock @@ -1,6 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "structs" +name = "rectangles" version = "0.1.0" - diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-01-debug/Cargo.toml b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-01-debug/Cargo.toml index 431e5c3051..58787d22de 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-01-debug/Cargo.toml +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-01-debug/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "structs" +name = "rectangles" version = "0.1.0" authors = ["Your Name "] edition = "2018" diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-01-debug/output.txt b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-01-debug/output.txt index bc7e5d8b70..c78a008970 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-01-debug/output.txt +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-01-debug/output.txt @@ -1,5 +1,5 @@ $ cargo run - Compiling structs v0.1.0 (file:///projects/structs) + Compiling rectangles v0.1.0 (file:///projects/rectangles) error[E0277]: `Rectangle` doesn't implement `Debug` --> src/main.rs:12:31 | @@ -14,6 +14,6 @@ error[E0277]: `Rectangle` doesn't implement `Debug` error: aborting due to previous error For more information about this error, try `rustc --explain E0277`. -error: could not compile `structs` +error: could not compile `rectangles` To learn more, run the command again with --verbose. diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-02-pretty-debug/Cargo.lock b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-02-pretty-debug/Cargo.lock index bede081a0c..4aabe7da60 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-02-pretty-debug/Cargo.lock +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-02-pretty-debug/Cargo.lock @@ -1,6 +1,5 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "structs" +name = "rectangles" version = "0.1.0" - diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-02-pretty-debug/Cargo.toml b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-02-pretty-debug/Cargo.toml index 431e5c3051..58787d22de 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-02-pretty-debug/Cargo.toml +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-02-pretty-debug/Cargo.toml @@ -1,5 +1,5 @@ [package] -name = "structs" +name = "rectangles" version = "0.1.0" authors = ["Your Name "] edition = "2018" diff --git a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-02-pretty-debug/output.txt b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-02-pretty-debug/output.txt index 099ef9eac4..db6deed9b7 100644 --- a/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-02-pretty-debug/output.txt +++ b/src/doc/book/listings/ch05-using-structs-to-structure-related-data/output-only-02-pretty-debug/output.txt @@ -1,7 +1,7 @@ $ cargo run - Compiling structs v0.1.0 (file:///projects/structs) + Compiling rectangles v0.1.0 (file:///projects/rectangles) Finished dev [unoptimized + debuginfo] target(s) in 0.48s - Running `target/debug/structs` + Running `target/debug/rectangles` rect1 is Rectangle { width: 30, height: 50, diff --git a/src/doc/book/listings/ch07-managing-growing-projects/listing-07-18/Cargo.lock b/src/doc/book/listings/ch07-managing-growing-projects/listing-07-18/Cargo.lock index c346748e55..0a2f222c21 100644 --- a/src/doc/book/listings/ch07-managing-growing-projects/listing-07-18/Cargo.lock +++ b/src/doc/book/listings/ch07-managing-growing-projects/listing-07-18/Cargo.lock @@ -1,87 +1,83 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "bitflags" -version = "1.2.1" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "getrandom" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "guessing_game" version = "0.1.0" dependencies = [ - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", ] [[package]] name = "libc" -version = "0.2.53" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.5.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.53 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "rand_chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 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)", + "getrandom", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "rand_hc" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum libc 0.2.53 (registry+https://github.com/rust-lang/crates.io-index)" = "ec350a9417dfd244dc9a6c4a71e13895a4db6b92f0b106f07ebbc3f3bc580cee" -"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" -"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-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/src/doc/book/listings/ch07-managing-growing-projects/listing-07-18/Cargo.toml b/src/doc/book/listings/ch07-managing-growing-projects/listing-07-18/Cargo.toml index ad5ca696d5..1e53bae0f4 100644 --- a/src/doc/book/listings/ch07-managing-growing-projects/listing-07-18/Cargo.toml +++ b/src/doc/book/listings/ch07-managing-growing-projects/listing-07-18/Cargo.toml @@ -5,4 +5,4 @@ authors = ["Your Name "] edition = "2018" [dependencies] -rand = "0.5.5" +rand = "0.8.3" diff --git a/src/doc/book/listings/ch07-managing-growing-projects/listing-07-18/src/main.rs b/src/doc/book/listings/ch07-managing-growing-projects/listing-07-18/src/main.rs index 61a2023fff..6c88bc4c27 100644 --- a/src/doc/book/listings/ch07-managing-growing-projects/listing-07-18/src/main.rs +++ b/src/doc/book/listings/ch07-managing-growing-projects/listing-07-18/src/main.rs @@ -8,7 +8,7 @@ use std::{cmp::Ordering, io}; fn main() { println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1, 101); + let secret_number = rand::thread_rng().gen_range(1..101); println!("The secret number is: {}", secret_number); diff --git a/src/doc/book/listings/ch07-managing-growing-projects/no-listing-01-use-std-unnested/Cargo.lock b/src/doc/book/listings/ch07-managing-growing-projects/no-listing-01-use-std-unnested/Cargo.lock index 2b3d41ad67..0a2f222c21 100644 --- a/src/doc/book/listings/ch07-managing-growing-projects/no-listing-01-use-std-unnested/Cargo.lock +++ b/src/doc/book/listings/ch07-managing-growing-projects/no-listing-01-use-std-unnested/Cargo.lock @@ -1,87 +1,83 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "bitflags" -version = "1.2.0" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "getrandom" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "guessing_game" version = "0.1.0" dependencies = [ - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", ] [[package]] name = "libc" -version = "0.2.51" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.5.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "rand_chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 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)", + "getrandom", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "rand_hc" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a606a02debe2813760609f57a64a2ffd27d9fdf5b2f133eaca0b248dd92cdd2" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum libc 0.2.51 (registry+https://github.com/rust-lang/crates.io-index)" = "bedcc7a809076656486ffe045abeeac163da1b558e963a31e29fbfbeba916917" -"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" -"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-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/src/doc/book/listings/ch07-managing-growing-projects/no-listing-01-use-std-unnested/Cargo.toml b/src/doc/book/listings/ch07-managing-growing-projects/no-listing-01-use-std-unnested/Cargo.toml index 10932024b4..930a7d9518 100644 --- a/src/doc/book/listings/ch07-managing-growing-projects/no-listing-01-use-std-unnested/Cargo.toml +++ b/src/doc/book/listings/ch07-managing-growing-projects/no-listing-01-use-std-unnested/Cargo.toml @@ -7,4 +7,4 @@ edition = "2018" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -rand = "0.5.5" +rand = "0.8.3" diff --git a/src/doc/book/listings/ch07-managing-growing-projects/no-listing-01-use-std-unnested/src/main.rs b/src/doc/book/listings/ch07-managing-growing-projects/no-listing-01-use-std-unnested/src/main.rs index c25b0a52a8..af1b2b4e22 100644 --- a/src/doc/book/listings/ch07-managing-growing-projects/no-listing-01-use-std-unnested/src/main.rs +++ b/src/doc/book/listings/ch07-managing-growing-projects/no-listing-01-use-std-unnested/src/main.rs @@ -9,7 +9,7 @@ use std::io; fn main() { println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1, 101); + let secret_number = rand::thread_rng().gen_range(1..101); println!("The secret number is: {}", secret_number); diff --git a/src/doc/book/listings/ch09-error-handling/listing-09-10/Cargo.lock b/src/doc/book/listings/ch09-error-handling/listing-09-10/Cargo.lock index c346748e55..0a2f222c21 100644 --- a/src/doc/book/listings/ch09-error-handling/listing-09-10/Cargo.lock +++ b/src/doc/book/listings/ch09-error-handling/listing-09-10/Cargo.lock @@ -1,87 +1,83 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "bitflags" -version = "1.2.1" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "getrandom" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "guessing_game" version = "0.1.0" dependencies = [ - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", ] [[package]] name = "libc" -version = "0.2.53" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.5.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.53 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "rand_chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 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)", + "getrandom", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "rand_hc" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum libc 0.2.53 (registry+https://github.com/rust-lang/crates.io-index)" = "ec350a9417dfd244dc9a6c4a71e13895a4db6b92f0b106f07ebbc3f3bc580cee" -"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" -"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-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/src/doc/book/listings/ch09-error-handling/listing-09-10/Cargo.toml b/src/doc/book/listings/ch09-error-handling/listing-09-10/Cargo.toml index ad5ca696d5..1e53bae0f4 100644 --- a/src/doc/book/listings/ch09-error-handling/listing-09-10/Cargo.toml +++ b/src/doc/book/listings/ch09-error-handling/listing-09-10/Cargo.toml @@ -5,4 +5,4 @@ authors = ["Your Name "] edition = "2018" [dependencies] -rand = "0.5.5" +rand = "0.8.3" diff --git a/src/doc/book/listings/ch09-error-handling/listing-09-10/src/main.rs b/src/doc/book/listings/ch09-error-handling/listing-09-10/src/main.rs index 7448979a06..3375279461 100644 --- a/src/doc/book/listings/ch09-error-handling/listing-09-10/src/main.rs +++ b/src/doc/book/listings/ch09-error-handling/listing-09-10/src/main.rs @@ -25,7 +25,7 @@ impl Guess { fn main() { println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1, 101); + let secret_number = rand::thread_rng().gen_range(1..101); loop { println!("Please input your guess."); diff --git a/src/doc/book/listings/ch09-error-handling/no-listing-09-guess-out-of-range/Cargo.lock b/src/doc/book/listings/ch09-error-handling/no-listing-09-guess-out-of-range/Cargo.lock index c346748e55..0a2f222c21 100644 --- a/src/doc/book/listings/ch09-error-handling/no-listing-09-guess-out-of-range/Cargo.lock +++ b/src/doc/book/listings/ch09-error-handling/no-listing-09-guess-out-of-range/Cargo.lock @@ -1,87 +1,83 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. [[package]] -name = "bitflags" -version = "1.2.1" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "getrandom" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" - [[package]] name = "guessing_game" version = "0.1.0" dependencies = [ - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", ] [[package]] name = "libc" -version = "0.2.53" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "ppv-lite86" +version = "0.2.10" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.5.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.53 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "rand_chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 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)", + "getrandom", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "rand_hc" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum libc 0.2.53 (registry+https://github.com/rust-lang/crates.io-index)" = "ec350a9417dfd244dc9a6c4a71e13895a4db6b92f0b106f07ebbc3f3bc580cee" -"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" -"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-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/src/doc/book/listings/ch09-error-handling/no-listing-09-guess-out-of-range/Cargo.toml b/src/doc/book/listings/ch09-error-handling/no-listing-09-guess-out-of-range/Cargo.toml index ad5ca696d5..1e53bae0f4 100644 --- a/src/doc/book/listings/ch09-error-handling/no-listing-09-guess-out-of-range/Cargo.toml +++ b/src/doc/book/listings/ch09-error-handling/no-listing-09-guess-out-of-range/Cargo.toml @@ -5,4 +5,4 @@ authors = ["Your Name "] edition = "2018" [dependencies] -rand = "0.5.5" +rand = "0.8.3" diff --git a/src/doc/book/listings/ch09-error-handling/no-listing-09-guess-out-of-range/src/main.rs b/src/doc/book/listings/ch09-error-handling/no-listing-09-guess-out-of-range/src/main.rs index d89d719aa0..cbe8fbc9bd 100644 --- a/src/doc/book/listings/ch09-error-handling/no-listing-09-guess-out-of-range/src/main.rs +++ b/src/doc/book/listings/ch09-error-handling/no-listing-09-guess-out-of-range/src/main.rs @@ -5,7 +5,7 @@ use std::io; fn main() { println!("Guess the number!"); - let secret_number = rand::thread_rng().gen_range(1, 101); + let secret_number = rand::thread_rng().gen_range(1..101); // ANCHOR: here loop { diff --git a/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-03/src/main.rs b/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-03/src/main.rs index 9d8d9bfb5b..7704ff3382 100644 --- a/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-03/src/main.rs +++ b/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-03/src/main.rs @@ -1,8 +1,8 @@ // ANCHOR: here -fn largest(list: &[i32]) -> &i32 { - let mut largest = &list[0]; +fn largest(list: &[i32]) -> i32 { + let mut largest = list[0]; - for item in list { + for &item in list { if item > largest { largest = item; } @@ -17,7 +17,7 @@ fn main() { let result = largest(&number_list); println!("The largest number is {}", result); // ANCHOR_END: here - assert_eq!(result, &100); + assert_eq!(result, 100); // ANCHOR: here let number_list = vec![102, 34, 6000, 89, 54, 2, 43, 8]; @@ -25,7 +25,7 @@ fn main() { let result = largest(&number_list); println!("The largest number is {}", result); // ANCHOR_END: here - assert_eq!(result, &6000); + assert_eq!(result, 6000); // ANCHOR: here } // ANCHOR_END: here diff --git a/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-04/src/main.rs b/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-04/src/main.rs index 3e2f98aab0..6b483ec976 100644 --- a/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-04/src/main.rs +++ b/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-04/src/main.rs @@ -1,8 +1,8 @@ // ANCHOR: here -fn largest_i32(list: &[i32]) -> &i32 { - let mut largest = &list[0]; +fn largest_i32(list: &[i32]) -> i32 { + let mut largest = list[0]; - for item in list { + for &item in list { if item > largest { largest = item; } @@ -11,10 +11,10 @@ fn largest_i32(list: &[i32]) -> &i32 { largest } -fn largest_char(list: &[char]) -> &char { - let mut largest = &list[0]; +fn largest_char(list: &[char]) -> char { + let mut largest = list[0]; - for item in list { + for &item in list { if item > largest { largest = item; } @@ -29,7 +29,7 @@ fn main() { let result = largest_i32(&number_list); println!("The largest number is {}", result); // ANCHOR_END: here - assert_eq!(result, &100); + assert_eq!(result, 100); // ANCHOR: here let char_list = vec!['y', 'm', 'a', 'q']; @@ -37,7 +37,7 @@ fn main() { let result = largest_char(&char_list); println!("The largest char is {}", result); // ANCHOR_END: here - assert_eq!(result, &'y'); + assert_eq!(result, 'y'); // ANCHOR: here } // ANCHOR_END: here diff --git a/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-05/output.txt b/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-05/output.txt index 9604aac0e6..9b6e53e47a 100644 --- a/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-05/output.txt +++ b/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-05/output.txt @@ -1,16 +1,16 @@ $ cargo run Compiling chapter10 v0.1.0 (file:///projects/chapter10) -error[E0369]: binary operation `>` cannot be applied to type `&T` +error[E0369]: binary operation `>` cannot be applied to type `T` --> src/main.rs:5:17 | 5 | if item > largest { - | ---- ^ ------- &T + | ---- ^ ------- T | | - | &T + | T | help: consider restricting type parameter `T` | -1 | fn largest(list: &[T]) -> &T { +1 | fn largest(list: &[T]) -> T { | ^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-05/src/main.rs b/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-05/src/main.rs index df33743f78..e731157060 100644 --- a/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-05/src/main.rs +++ b/src/doc/book/listings/ch10-generic-types-traits-and-lifetimes/listing-10-05/src/main.rs @@ -1,7 +1,7 @@ -fn largest(list: &[T]) -> &T { - let mut largest = &list[0]; +fn largest(list: &[T]) -> T { + let mut largest = list[0]; - for item in list { + for &item in list { if item > largest { largest = item; } diff --git a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-01/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-01/output.txt index aa4b0990db..5396eba5b8 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-01/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-01/output.txt @@ -6,11 +6,11 @@ $ cargo test running 1 test test tests::it_works ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-03/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-03/output.txt index bbe077e7e2..4b2a589f70 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-03/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-03/output.txt @@ -17,6 +17,6 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::another -test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass '--lib' diff --git a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-06/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-06/output.txt index 241997c15a..cb32c7feac 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-06/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-06/output.txt @@ -6,11 +6,11 @@ $ cargo test running 1 test test tests::larger_can_hold_smaller ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests rectangle running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-07/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-07/output.txt index dc1a5212e7..499ead4808 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-07/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-07/output.txt @@ -6,11 +6,11 @@ $ cargo test running 1 test test tests::it_adds_two ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-08/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-08/output.txt index 47a50f7e1c..a75b3cb9d8 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-08/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-08/output.txt @@ -6,11 +6,11 @@ $ cargo test running 1 test test tests::greater_than_100 ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests guessing_game running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-10/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-10/output.txt index a0484d2605..69ef7da765 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-10/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-10/output.txt @@ -20,6 +20,6 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::this_test_will_fail -test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass '--lib' diff --git a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-11/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-11/output.txt index 59feae3241..35f6e79160 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-11/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-11/output.txt @@ -8,11 +8,11 @@ test tests::add_three_and_two ... ok test tests::add_two_and_two ... ok test tests::one_hundred ... ok -test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-13/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-13/output.txt index 1f926b578e..6266b5085a 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/listing-11-13/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/listing-11-13/output.txt @@ -1,23 +1,23 @@ $ cargo test Compiling adder v0.1.0 (file:///projects/adder) - Finished test [unoptimized + debuginfo] target(s) in 0.73s - Running target/debug/deps/adder-92948b65e88960b4 + Finished test [unoptimized + debuginfo] target(s) in 1.31s + Running target/debug/deps/adder-1082c4b063a8fbe6 running 1 test test tests::internal ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s - Running target/debug/deps/integration_test-92948b65e88960b4 + Running target/debug/deps/integration_test-1082c4b063a8fbe6 running 1 test test it_adds_two ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-01-changing-test-name/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-01-changing-test-name/output.txt index 0f287fc564..1a8c7f77f8 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-01-changing-test-name/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-01-changing-test-name/output.txt @@ -6,11 +6,11 @@ $ cargo test running 1 test test tests::exploration ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-02-adding-another-rectangle-test/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-02-adding-another-rectangle-test/output.txt index e95f4727e0..393c09a055 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-02-adding-another-rectangle-test/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-02-adding-another-rectangle-test/output.txt @@ -7,11 +7,11 @@ running 2 tests test tests::larger_can_hold_smaller ... ok test tests::smaller_cannot_hold_larger ... ok -test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests rectangle running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-03-introducing-a-bug/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-03-introducing-a-bug/output.txt index b01fab9062..db41fca7b1 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-03-introducing-a-bug/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-03-introducing-a-bug/output.txt @@ -17,6 +17,6 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::larger_can_hold_smaller -test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass '--lib' diff --git a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-04-bug-in-add-two/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-04-bug-in-add-two/output.txt index 3a9a82c3a7..00165cbc43 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-04-bug-in-add-two/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-04-bug-in-add-two/output.txt @@ -18,6 +18,6 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::it_adds_two -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass '--lib' diff --git a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-06-greeter-with-bug/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-06-greeter-with-bug/output.txt index d8fab6a91c..67b846115c 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-06-greeter-with-bug/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-06-greeter-with-bug/output.txt @@ -9,13 +9,13 @@ test tests::greeting_contains_name ... FAILED failures: ---- tests::greeting_contains_name stdout ---- -thread 'main' panicked at 'assertion failed: result.contains("Carol")', src/lib.rs:12:9 +thread 'main' panicked at 'assertion failed: result.contains(\"Carol\")', src/lib.rs:12:9 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::greeting_contains_name -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass '--lib' diff --git a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-07-custom-failure-message/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-07-custom-failure-message/output.txt index 281e3746a1..e22aa81f1f 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-07-custom-failure-message/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-07-custom-failure-message/output.txt @@ -16,6 +16,6 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::greeting_contains_name -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass '--lib' diff --git a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-08-guess-with-bug/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-08-guess-with-bug/output.txt index c9a4fda931..bd95d20e5e 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-08-guess-with-bug/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-08-guess-with-bug/output.txt @@ -14,6 +14,6 @@ note: test did not panic as expected failures: tests::greater_than_100 -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass '--lib' diff --git a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-09-guess-with-panic-msg-bug/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-09-guess-with-panic-msg-bug/output.txt index 0e8cf48861..3cbee93ff7 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-09-guess-with-panic-msg-bug/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-09-guess-with-panic-msg-bug/output.txt @@ -18,6 +18,6 @@ note: panic did not contain expected string failures: tests::greater_than_100 -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass '--lib' diff --git a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-11-ignore-a-test/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-11-ignore-a-test/output.txt index 8cf7475c5e..727f60c1cb 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-11-ignore-a-test/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-11-ignore-a-test/output.txt @@ -7,11 +7,11 @@ running 2 tests test expensive_test ... ignored test it_works ... ok -test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-12-shared-test-code-problem/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-12-shared-test-code-problem/output.txt index 7fd5f5ac5b..41056125e7 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/no-listing-12-shared-test-code-problem/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/no-listing-12-shared-test-code-problem/output.txt @@ -6,24 +6,24 @@ $ cargo test running 1 test test tests::internal ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running target/debug/deps/common-92948b65e88960b4 running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running target/debug/deps/integration_test-92948b65e88960b4 running 1 test test it_adds_two ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch11-writing-automated-tests/output-only-01-show-output/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/output-only-01-show-output/output.txt index 3bff4258ab..cb9f454e7a 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/output-only-01-show-output/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/output-only-01-show-output/output.txt @@ -29,6 +29,6 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::this_test_will_fail -test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 1 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass '--lib' diff --git a/src/doc/book/listings/ch11-writing-automated-tests/output-only-02-single-test/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/output-only-02-single-test/output.txt index 9284de3d4f..e5716fe45b 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/output-only-02-single-test/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/output-only-02-single-test/output.txt @@ -6,5 +6,5 @@ $ cargo test one_hundred running 1 test test tests::one_hundred ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 2 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch11-writing-automated-tests/output-only-03-multiple-tests/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/output-only-03-multiple-tests/output.txt index 76c2c170df..55402231d7 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/output-only-03-multiple-tests/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/output-only-03-multiple-tests/output.txt @@ -7,5 +7,5 @@ running 2 tests test tests::add_three_and_two ... ok test tests::add_two_and_two ... ok -test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch11-writing-automated-tests/output-only-04-running-ignored/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/output-only-04-running-ignored/output.txt index 6bddfdb820..6fe42c9dec 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/output-only-04-running-ignored/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/output-only-04-running-ignored/output.txt @@ -6,11 +6,11 @@ $ cargo test -- --ignored running 1 test test expensive_test ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in 0.00s Doc-tests adder running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch11-writing-automated-tests/output-only-05-single-integration/output.txt b/src/doc/book/listings/ch11-writing-automated-tests/output-only-05-single-integration/output.txt index dd915c35c1..b641879f24 100644 --- a/src/doc/book/listings/ch11-writing-automated-tests/output-only-05-single-integration/output.txt +++ b/src/doc/book/listings/ch11-writing-automated-tests/output-only-05-single-integration/output.txt @@ -6,5 +6,5 @@ $ cargo test --test integration_test running 1 test test it_adds_two ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch12-an-io-project/listing-12-16/output.txt b/src/doc/book/listings/ch12-an-io-project/listing-12-16/output.txt index 8c60f26576..1c9196e8fe 100644 --- a/src/doc/book/listings/ch12-an-io-project/listing-12-16/output.txt +++ b/src/doc/book/listings/ch12-an-io-project/listing-12-16/output.txt @@ -18,6 +18,6 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::one_result -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass '--lib' diff --git a/src/doc/book/listings/ch12-an-io-project/listing-12-19/output.txt b/src/doc/book/listings/ch12-an-io-project/listing-12-19/output.txt index bf63e73528..3699130fd9 100644 --- a/src/doc/book/listings/ch12-an-io-project/listing-12-19/output.txt +++ b/src/doc/book/listings/ch12-an-io-project/listing-12-19/output.txt @@ -6,17 +6,17 @@ $ cargo test running 1 test test tests::one_result ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running target/debug/deps/minigrep-4672b652f7794785 running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests minigrep running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch12-an-io-project/listing-12-21/output.txt b/src/doc/book/listings/ch12-an-io-project/listing-12-21/output.txt index f24c075834..5b0f7b666f 100644 --- a/src/doc/book/listings/ch12-an-io-project/listing-12-21/output.txt +++ b/src/doc/book/listings/ch12-an-io-project/listing-12-21/output.txt @@ -7,17 +7,17 @@ running 2 tests test tests::case_insensitive ... ok test tests::case_sensitive ... ok -test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running target/debug/deps/minigrep-4672b652f7794785 running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests minigrep running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s diff --git a/src/doc/book/listings/ch13-functional-features/listing-13-19/src/lib.rs b/src/doc/book/listings/ch13-functional-features/listing-13-19/src/lib.rs index 11c544f556..281c3c9e40 100644 --- a/src/doc/book/listings/ch13-functional-features/listing-13-19/src/lib.rs +++ b/src/doc/book/listings/ch13-functional-features/listing-13-19/src/lib.rs @@ -4,7 +4,7 @@ struct Shoe { style: String, } -fn shoes_in_my_size(shoes: Vec, shoe_size: u32) -> Vec { +fn shoes_in_size(shoes: Vec, shoe_size: u32) -> Vec { shoes.into_iter().filter(|s| s.size == shoe_size).collect() } @@ -29,7 +29,7 @@ mod tests { }, ]; - let in_my_size = shoes_in_my_size(shoes, 10); + let in_my_size = shoes_in_size(shoes, 10); assert_eq!( in_my_size, diff --git a/src/doc/book/listings/ch13-functional-features/no-listing-01-failing-cacher-test/output.txt b/src/doc/book/listings/ch13-functional-features/no-listing-01-failing-cacher-test/output.txt index 66bff6b60a..33437ab7cc 100644 --- a/src/doc/book/listings/ch13-functional-features/no-listing-01-failing-cacher-test/output.txt +++ b/src/doc/book/listings/ch13-functional-features/no-listing-01-failing-cacher-test/output.txt @@ -18,6 +18,6 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::call_with_different_values -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass '--lib' diff --git a/src/doc/book/listings/ch14-more-about-cargo/no-listing-03-workspace-with-external-dependency/add/Cargo.lock b/src/doc/book/listings/ch14-more-about-cargo/no-listing-03-workspace-with-external-dependency/add/Cargo.lock index f17f35e860..28663ec168 100644 --- a/src/doc/book/listings/ch14-more-about-cargo/no-listing-03-workspace-with-external-dependency/add/Cargo.lock +++ b/src/doc/book/listings/ch14-more-about-cargo/no-listing-03-workspace-with-external-dependency/add/Cargo.lock @@ -4,91 +4,87 @@ name = "add-one" version = "0.1.0" dependencies = [ - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", ] [[package]] name = "adder" version = "0.1.0" dependencies = [ - "add-one 0.1.0", + "add-one", ] [[package]] -name = "bitflags" -version = "1.2.1" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "getrandom" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] [[package]] -name = "fuchsia-cprng" -version = "0.1.1" +name = "libc" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" [[package]] -name = "libc" -version = "0.2.54" +name = "ppv-lite86" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.5.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "rand_chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 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)", + "getrandom", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "rand_hc" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)" = "c6785aa7dd976f5fbf3b71cfd9cd49d7f783c1ff565a858d71031c6c313aa5c6" -"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" -"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-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/src/doc/book/listings/ch14-more-about-cargo/no-listing-03-workspace-with-external-dependency/add/add-one/Cargo.toml b/src/doc/book/listings/ch14-more-about-cargo/no-listing-03-workspace-with-external-dependency/add/add-one/Cargo.toml index 5b52051a63..3b0bb1af16 100644 --- a/src/doc/book/listings/ch14-more-about-cargo/no-listing-03-workspace-with-external-dependency/add/add-one/Cargo.toml +++ b/src/doc/book/listings/ch14-more-about-cargo/no-listing-03-workspace-with-external-dependency/add/add-one/Cargo.toml @@ -5,4 +5,4 @@ authors = ["Your Name "] edition = "2018" [dependencies] -rand = "0.5.5" +rand = "0.8.3" diff --git a/src/doc/book/listings/ch14-more-about-cargo/output-only-03-use-rand/add/Cargo.lock b/src/doc/book/listings/ch14-more-about-cargo/output-only-03-use-rand/add/Cargo.lock index f17f35e860..28663ec168 100644 --- a/src/doc/book/listings/ch14-more-about-cargo/output-only-03-use-rand/add/Cargo.lock +++ b/src/doc/book/listings/ch14-more-about-cargo/output-only-03-use-rand/add/Cargo.lock @@ -4,91 +4,87 @@ name = "add-one" version = "0.1.0" dependencies = [ - "rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)", + "rand", ] [[package]] name = "adder" version = "0.1.0" dependencies = [ - "add-one 0.1.0", + "add-one", ] [[package]] -name = "bitflags" -version = "1.2.1" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "getrandom" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if", + "libc", + "wasi", ] [[package]] -name = "fuchsia-cprng" -version = "0.1.1" +name = "libc" +version = "0.2.86" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" [[package]] -name = "libc" -version = "0.2.54" +name = "ppv-lite86" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.5.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.7 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "rand_chacha" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ - "rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "ppv-lite86", + "rand_core", ] [[package]] name = "rand_core" -version = "0.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "winapi" -version = "0.3.7" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" 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)", + "getrandom", ] [[package]] -name = "winapi-i686-pc-windows-gnu" -version = "0.4.0" +name = "rand_hc" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" +dependencies = [ + "rand_core", +] [[package]] -name = "winapi-x86_64-pc-windows-gnu" -version = "0.4.0" +name = "wasi" +version = "0.10.2+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" - -[metadata] -"checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"checksum libc 0.2.54 (registry+https://github.com/rust-lang/crates.io-index)" = "c6785aa7dd976f5fbf3b71cfd9cd49d7f783c1ff565a858d71031c6c313aa5c6" -"checksum rand 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c618c47cd3ebd209790115ab837de41425723956ad3ce2e6a7f09890947cacb9" -"checksum rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "7a6fdeb83b075e8266dcc8762c22776f6877a63111121f5f8c7411e5be7eed4b" -"checksum rand_core 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d0e7a549d590831370895ab7ba4ea0c1b6b011d106b5ff2da6eee112615e6dc0" -"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-x86_64-pc-windows-gnu 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" diff --git a/src/doc/book/listings/ch14-more-about-cargo/output-only-03-use-rand/add/add-one/Cargo.toml b/src/doc/book/listings/ch14-more-about-cargo/output-only-03-use-rand/add/add-one/Cargo.toml index 5b52051a63..3b0bb1af16 100644 --- a/src/doc/book/listings/ch14-more-about-cargo/output-only-03-use-rand/add/add-one/Cargo.toml +++ b/src/doc/book/listings/ch14-more-about-cargo/output-only-03-use-rand/add/add-one/Cargo.toml @@ -5,4 +5,4 @@ authors = ["Your Name "] edition = "2018" [dependencies] -rand = "0.5.5" +rand = "0.8.3" diff --git a/src/doc/book/listings/ch15-smart-pointers/listing-15-23/output.txt b/src/doc/book/listings/ch15-smart-pointers/listing-15-23/output.txt index 4054d4f37b..802dc26092 100644 --- a/src/doc/book/listings/ch15-smart-pointers/listing-15-23/output.txt +++ b/src/doc/book/listings/ch15-smart-pointers/listing-15-23/output.txt @@ -16,6 +16,6 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace failures: tests::it_sends_an_over_75_percent_warning_message -test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out +test result: FAILED. 0 passed; 1 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s error: test failed, to rerun pass '--lib' diff --git a/src/doc/book/listings/ch20-web-server/listing-20-07/src/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-07/src/main.rs index 4d8e51286d..4d19e04a51 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-07/src/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-07/src/main.rs @@ -33,10 +33,15 @@ fn handle_connection(mut stream: TcpStream) { // ANCHOR: here // --snip-- } else { - let status_line = "HTTP/1.1 404 NOT FOUND\r\n\r\n"; + let status_line = "HTTP/1.1 404 NOT FOUND"; let contents = fs::read_to_string("404.html").unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-08/src/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-08/src/main.rs index ef905fa270..6dfaa97f24 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-08/src/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-08/src/main.rs @@ -31,10 +31,15 @@ fn handle_connection(mut stream: TcpStream) { stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); } else { - let status_line = "HTTP/1.1 404 NOT FOUND\r\n\r\n"; + let status_line = "HTTP/1.1 404 NOT FOUND"; let contents = fs::read_to_string("404.html").unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-09/src/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-09/src/main.rs index 8fdfd076ae..e2f2f9f606 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-09/src/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-09/src/main.rs @@ -27,14 +27,19 @@ fn handle_connection(mut stream: TcpStream) { // ANCHOR: here let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-10/src/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-10/src/main.rs index 257d47a795..c4361e58a2 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-10/src/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-10/src/main.rs @@ -31,12 +31,12 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; // --snip-- @@ -44,7 +44,12 @@ fn handle_connection(mut stream: TcpStream) { let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-11/src/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-11/src/main.rs index d1087e2127..bf88f949ce 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-11/src/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-11/src/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-12/src/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-12/src/main.rs index 72c5b9a83c..ff0fd45396 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-12/src/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-12/src/main.rs @@ -28,17 +28,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-13/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-13/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-13/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-13/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-14/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-14/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-14/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-14/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-15/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-15/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-15/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-15/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-16/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-16/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-16/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-16/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-17/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-17/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-17/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-17/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-18/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-18/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-18/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-18/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-19/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-19/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-19/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-19/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-20/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-20/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-20/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-20/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-21/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-21/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-21/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-21/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-22/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-22/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-22/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-22/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-23/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-23/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-23/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-23/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-24/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-24/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-24/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-24/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/listing-20-25/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/listing-20-25/src/bin/main.rs index 694df159ab..3b314bc65b 100644 --- a/src/doc/book/listings/ch20-web-server/listing-20-25/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/listing-20-25/src/bin/main.rs @@ -31,17 +31,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/no-listing-01-define-threadpool-struct/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/no-listing-01-define-threadpool-struct/src/bin/main.rs index 8df1b17ee8..d2b8c889d0 100644 --- a/src/doc/book/listings/ch20-web-server/no-listing-01-define-threadpool-struct/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/no-listing-01-define-threadpool-struct/src/bin/main.rs @@ -29,17 +29,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/no-listing-02-impl-threadpool-new/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/no-listing-02-impl-threadpool-new/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/no-listing-02-impl-threadpool-new/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/no-listing-02-impl-threadpool-new/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/no-listing-03-define-execute/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/no-listing-03-define-execute/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/no-listing-03-define-execute/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/no-listing-03-define-execute/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/no-listing-04-update-worker-definition/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/no-listing-04-update-worker-definition/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/no-listing-04-update-worker-definition/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/no-listing-04-update-worker-definition/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/no-listing-05-fix-worker-new/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/no-listing-05-fix-worker-new/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/no-listing-05-fix-worker-new/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/no-listing-05-fix-worker-new/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/no-listing-06-fix-threadpool-drop/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/no-listing-06-fix-threadpool-drop/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/no-listing-06-fix-threadpool-drop/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/no-listing-06-fix-threadpool-drop/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/no-listing-07-define-message-enum/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/no-listing-07-define-message-enum/src/bin/main.rs index 9d6a9c1546..2078ca9f11 100644 --- a/src/doc/book/listings/ch20-web-server/no-listing-07-define-message-enum/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/no-listing-07-define-message-enum/src/bin/main.rs @@ -27,17 +27,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/listings/ch20-web-server/no-listing-08-final-code/src/bin/main.rs b/src/doc/book/listings/ch20-web-server/no-listing-08-final-code/src/bin/main.rs index 7e2508e2a5..d3f8754f63 100644 --- a/src/doc/book/listings/ch20-web-server/no-listing-08-final-code/src/bin/main.rs +++ b/src/doc/book/listings/ch20-web-server/no-listing-08-final-code/src/bin/main.rs @@ -29,17 +29,22 @@ fn handle_connection(mut stream: TcpStream) { let sleep = b"GET /sleep HTTP/1.1\r\n"; let (status_line, filename) = if buffer.starts_with(get) { - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else if buffer.starts_with(sleep) { thread::sleep(Duration::from_secs(5)); - ("HTTP/1.1 200 OK\r\n\r\n", "hello.html") + ("HTTP/1.1 200 OK", "hello.html") } else { - ("HTTP/1.1 404 NOT FOUND\r\n\r\n", "404.html") + ("HTTP/1.1 404 NOT FOUND", "404.html") }; let contents = fs::read_to_string(filename).unwrap(); - let response = format!("{}{}", status_line, contents); + let response = format!( + "{}\r\nContent-Length: {}\r\n\r\n{}", + status_line, + contents.len(), + contents + ); stream.write(response.as_bytes()).unwrap(); stream.flush().unwrap(); diff --git a/src/doc/book/rust-toolchain b/src/doc/book/rust-toolchain index d4d0f85c9e..ec8bede263 100644 --- a/src/doc/book/rust-toolchain +++ b/src/doc/book/rust-toolchain @@ -1 +1 @@ -1.49 +1.50 diff --git a/src/doc/book/src/appendix-03-derivable-traits.md b/src/doc/book/src/appendix-03-derivable-traits.md index eb49b304d7..bc20ab107e 100644 --- a/src/doc/book/src/appendix-03-derivable-traits.md +++ b/src/doc/book/src/appendix-03-derivable-traits.md @@ -94,7 +94,7 @@ enum definition are considered less than the variants listed later. The `PartialOrd` trait is required, for example, for the `gen_range` method from the `rand` crate that generates a random value in the range specified by a -low value and a high value. +range expression. The `Ord` trait allows you to know that for any two values of the annotated type, a valid ordering will exist. The `Ord` trait implements the `cmp` method, @@ -134,10 +134,10 @@ overloading those methods and violating the assumption that no arbitrary code is being run. That way, all programmers can assume that copying a value will be very fast. -You can derive `Copy` on any type whose parts all implement `Copy`. You can -only apply the `Copy` trait to types that also implement `Clone`, because a -type that implements `Copy` has a trivial implementation of `Clone` that -performs the same task as `Copy`. +You can derive `Copy` on any type whose parts all implement `Copy`. A type that +implements `Copy` must also implement `Clone`, because a type that implements +`Copy` has a trivial implementation of `Clone` that performs the same task as +`Copy`. The `Copy` trait is rarely required; types that implement `Copy` have optimizations available, meaning you don’t have to call `clone`, which makes diff --git a/src/doc/book/src/ch01-01-installation.md b/src/doc/book/src/ch01-01-installation.md index 65c82a2ff9..f343d50094 100644 --- a/src/doc/book/src/ch01-01-installation.md +++ b/src/doc/book/src/ch01-01-installation.md @@ -54,7 +54,8 @@ the instructions for installing Rust. At some point in the installation, you’l receive a message explaining that you’ll also need the C++ build tools for Visual Studio 2013 or later. The easiest way to acquire the build tools is to install [Build Tools for Visual Studio 2019][visualstudio]. When asked which -workloads to install make sure "C++ build tools" is selected and that the Windows 10 SDK and the English language pack components are included. +workloads to install make sure "C++ build tools" is selected and that the +Windows 10 SDK and the English language pack components are included. [install]: https://www.rust-lang.org/tools/install [visualstudio]: https://visualstudio.microsoft.com/visual-cpp-build-tools/ diff --git a/src/doc/book/src/ch01-02-hello-world.md b/src/doc/book/src/ch01-02-hello-world.md index 6d181dd791..69f59dfc98 100644 --- a/src/doc/book/src/ch01-02-hello-world.md +++ b/src/doc/book/src/ch01-02-hello-world.md @@ -105,11 +105,11 @@ requires these around all function bodies. It’s good style to place the openin curly bracket on the same line as the function declaration, adding one space in between. -If you want to stick to a standard style across Rust projects, you can use an +If you want to stick to a standard style across Rust projects, you can use an automatic formatter tool called `rustfmt` to format your code in a particular style. The Rust team has included this tool with the standard Rust distribution, -like `rustc`, so it should already be installed on your computer! Check the online -documentation for more details. +like `rustc`, so it should already be installed on your computer! Check the +online documentation for more details. Inside the `main` function is the following code: @@ -155,7 +155,7 @@ entering the `ls` command in your shell. On Linux and macOS, you’ll see two files. With PowerShell on Windows, you’ll see the same three files that you would see using CMD. -```text +```console $ ls main main.rs ``` diff --git a/src/doc/book/src/ch01-03-hello-cargo.md b/src/doc/book/src/ch01-03-hello-cargo.md index 21984d2589..4751b6ac64 100644 --- a/src/doc/book/src/ch01-03-hello-cargo.md +++ b/src/doc/book/src/ch01-03-hello-cargo.md @@ -188,7 +188,8 @@ Let’s recap what we’ve learned so far about Cargo: * We can build a project using `cargo build`. * We can build and run a project in one step using `cargo run`. -* We can build a project without producing a binary to check for errors using `cargo check`. +* We can build a project without producing a binary to check for errors using + `cargo check`. * Instead of saving the result of the build in the same directory as our code, Cargo stores it in the *target/debug* directory. diff --git a/src/doc/book/src/ch02-00-guessing-game-tutorial.md b/src/doc/book/src/ch02-00-guessing-game-tutorial.md index e19eb3640d..eb80bd85a5 100644 --- a/src/doc/book/src/ch02-00-guessing-game-tutorial.md +++ b/src/doc/book/src/ch02-00-guessing-game-tutorial.md @@ -188,9 +188,9 @@ guess`. [read_line]: ../std/io/struct.Stdin.html#method.read_line The job of `read_line` is to take whatever the user types into standard input -and place that into a string, so it takes that string as an argument. The -string argument needs to be mutable so the method can change the string’s -content by adding the user input. +and append that into a string (without overwriting its contents), so it takes +that string as an argument. The string argument needs to be mutable so the +method can change the string’s content by adding the user input. The `&` indicates that this argument is a *reference*, which gives you a way to let multiple parts of your code access one piece of data without needing to @@ -341,7 +341,8 @@ Cargo’s use of external crates is where it really shines. Before we can write code that uses `rand`, we need to modify the *Cargo.toml* file to include the `rand` crate as a dependency. Open that file now and add the following line to the bottom beneath the `[dependencies]` section header that Cargo created for -you: +you. Be sure to specify `rand` exactly as we have here, or the code examples in +this tutorial may not work. (sometimes called *SemVer*), which is a -standard for writing version numbers. The number `0.5.5` is actually shorthand -for `^0.5.5`, which means any version that is at least `0.5.5` but below -`0.6.0`. Cargo considers these versions to have public APIs compatible with -version `0.5.5`. +standard for writing version numbers. The number `0.8.3` is actually shorthand +for `^0.8.3`, which means any version that is at least `0.8.3` but below +`0.9.0`. Cargo considers these versions to have public APIs compatible with +version `0.8.3`, and this specification ensures you'll get the latest patch +release that will still compile with the code in this chapter. Any version +`0.9.0` or greater is not guaranteed to have the same API as what the following +examples use. [semver]: http://semver.org @@ -379,16 +383,20 @@ cargo build --> ```console $ cargo build Updating crates.io index - Downloaded rand v0.5.5 - Downloaded libc v0.2.62 - Downloaded rand_core v0.2.2 - Downloaded rand_core v0.3.1 - Downloaded rand_core v0.4.2 - Compiling rand_core v0.4.2 - Compiling libc v0.2.62 - Compiling rand_core v0.3.1 - Compiling rand_core v0.2.2 - Compiling rand v0.5.5 + Downloaded rand v0.8.3 + Downloaded libc v0.2.86 + Downloaded getrandom v0.2.2 + Downloaded cfg-if v1.0.0 + Downloaded ppv-lite86 v0.2.10 + Downloaded rand_chacha v0.3.0 + Downloaded rand_core v0.6.2 + Compiling rand_core v0.6.2 + Compiling libc v0.2.86 + Compiling getrandom v0.2.2 + Compiling cfg-if v1.0.0 + Compiling ppv-lite86 v0.2.10 + Compiling rand_chacha v0.3.0 + Compiling rand v0.8.3 Compiling guessing_game v0.1.0 (file:///projects/guessing_game) Finished dev [unoptimized + debuginfo] target(s) in 2.53s ``` @@ -397,7 +405,8 @@ $ cargo build adding the rand crate as a dependency You may see different version numbers (but they will all be compatible with -the code, thanks to SemVer!), different lines (depending on the operating system), and the lines may be in a different order. +the code, thanks to SemVer!), different lines (depending on the operating +system), and the lines may be in a different order. Now that we have an external dependency, Cargo fetches the latest versions of everything from the *registry*, which is a copy of data from @@ -408,9 +417,9 @@ their open source Rust projects for others to use. After updating the registry, Cargo checks the `[dependencies]` section and downloads any crates you don’t have yet. In this case, although we only listed -`rand` as a dependency, Cargo also grabbed `libc` and `rand_core`, because -`rand` depends on those to work. After downloading the crates, Rust compiles -them and then compiles the project with the dependencies available. +`rand` as a dependency, Cargo also grabbed other crates that `rand` depends on +to work. After downloading the crates, Rust compiles them and then compiles the +project with the dependencies available. If you immediately run `cargo build` again without making any changes, you won’t get any output aside from the `Finished` line. Cargo knows it has already @@ -443,7 +452,7 @@ your part of the code. Cargo has a mechanism that ensures you can rebuild the same artifact every time you or anyone else builds your code: Cargo will use only the versions of the dependencies you specified until you indicate otherwise. For example, what -happens if next week version 0.5.6 of the `rand` crate comes out and +happens if next week version 0.8.4 of the `rand` crate comes out and contains an important bug fix but also contains a regression that will break your code? @@ -455,7 +464,7 @@ the *Cargo.lock* file. When you build your project in the future, Cargo will see that the *Cargo.lock* file exists and use the versions specified there rather than doing all the work of figuring out versions again. This lets you have a reproducible build automatically. In other words, your project will -remain at `0.5.5` until you explicitly upgrade, thanks to the *Cargo.lock* +remain at `0.8.3` until you explicitly upgrade, thanks to the *Cargo.lock* file. #### Updating a Crate to Get a New Version @@ -465,31 +474,31 @@ which will ignore the *Cargo.lock* file and figure out all the latest versions that fit your specifications in *Cargo.toml*. If that works, Cargo will write those versions to the *Cargo.lock* file. -But by default, Cargo will only look for versions greater than `0.5.5` and less -than `0.6.0`. If the `rand` crate has released two new versions, `0.5.6` and -`0.6.0`, you would see the following if you ran `cargo update`: +But by default, Cargo will only look for versions greater than `0.8.3` and less +than `0.9.0`. If the `rand` crate has released two new versions, `0.8.4` and +`0.9.0`, you would see the following if you ran `cargo update`: ```console $ cargo update Updating crates.io index - Updating rand v0.5.5 -> v0.5.6 + Updating rand v0.8.3 -> v0.8.4 ``` At this point, you would also notice a change in your *Cargo.lock* file noting -that the version of the `rand` crate you are now using is `0.5.6`. +that the version of the `rand` crate you are now using is `0.8.4`. -If you wanted to use `rand` version `0.6.0` or any version in the `0.6.x` +If you wanted to use `rand` version `0.9.0` or any version in the `0.9.x` series, you’d have to update the *Cargo.toml* file to look like this instead: ```toml [dependencies] -rand = "0.6.0" +rand = "0.9.0" ``` The next time you run `cargo build`, Cargo will update the registry of crates @@ -527,11 +536,13 @@ Next, we’re adding two lines in the middle. The `rand::thread_rng` function will give us the particular random number generator that we’re going to use: one that is local to the current thread of execution and seeded by the operating system. Then we call the `gen_range` method on the random number -generator. This method is defined by the `Rng` trait that we brought into -scope with the `use rand::Rng` statement. The `gen_range` method takes two -numbers as arguments and generates a random number between them. It’s inclusive -on the lower bound but exclusive on the upper bound, so we need to specify `1` -and `101` to request a number between 1 and 100. +generator. This method is defined by the `Rng` trait that we brought into scope +with the `use rand::Rng` statement. The `gen_range` method takes a range +expression as an argument and generates a random number in the range. The kind +of range expression we’re using here takes the form `start..end`. It’s +inclusive on the lower bound but exclusive on the upper bound, so we need to +specify `1..101` to request a number between 1 and 100. Alternatively, we could +pass the range `1..=100`, which is equivalent. > Note: You won’t just know which traits to use and which methods and functions > to call from a crate. Instructions for using a crate are in each crate’s diff --git a/src/doc/book/src/ch03-01-variables-and-mutability.md b/src/doc/book/src/ch03-01-variables-and-mutability.md index 5ec077a57e..e7c15c2c3e 100644 --- a/src/doc/book/src/ch03-01-variables-and-mutability.md +++ b/src/doc/book/src/ch03-01-variables-and-mutability.md @@ -129,11 +129,10 @@ hardcoded value needed to be updated in the future. As you saw in the guessing game tutorial in the [“Comparing the Guess to the Secret Number”][comparing-the-guess-to-the-secret-number] section in Chapter 2, you can declare a new variable with the same name as a -previous variable, and the new variable shadows the previous variable. -Rustaceans say that the first variable is *shadowed* by the second, which means -that the second variable’s value is what appears when the variable is used. We -can shadow a variable by using the same variable’s name and repeating the use -of the `let` keyword as follows: +previous variable. Rustaceans say that the first variable is *shadowed* by the +second, which means that the second variable’s value is what appears when the +variable is used. We can shadow a variable by using the same variable’s name +and repeating the use of the `let` keyword as follows: Filename: src/main.rs diff --git a/src/doc/book/src/ch03-02-data-types.md b/src/doc/book/src/ch03-02-data-types.md index 1b93f7892e..65df18b8e1 100644 --- a/src/doc/book/src/ch03-02-data-types.md +++ b/src/doc/book/src/ch03-02-data-types.md @@ -329,7 +329,7 @@ similar to the guessing game in Chapter 2 to get an array index from the user: Filename: src/main.rs -```rust,ignore,does_not_compile +```rust,ignore,panics {{#rustdoc_include ../listings/ch03-common-programming-concepts/no-listing-15-invalid-array-access/src/main.rs}} ``` @@ -350,13 +350,13 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ``` The program resulted in a *runtime* error at the point of using an invalid -value in the indexing operation. The program exited at that point with an error -message and didn't execute the final `println!`. When you attempt to access an +value in the indexing operation. The program exited with an error message and +didn't execute the final `println!` statement. When you attempt to access an element using indexing, Rust will check that the index you’ve specified is less -than the array length. If the index is greater than or equal to the array -length, Rust will panic. This check has to happen at runtime, especially in -this case, because the compiler can't possibly know what the value a user -running the code will later enter. +than the array length. If the index is greater than or equal to the length, +Rust will panic. This check has to happen at runtime, especially in this case, +because the compiler can't possibly know what value a user will enter when they +run the code later. This is the first example of Rust’s safety principles in action. In many low-level languages, this kind of check is not done, and when you provide an diff --git a/src/doc/book/src/ch03-05-control-flow.md b/src/doc/book/src/ch03-05-control-flow.md index 63464ee21f..0c2134a00c 100644 --- a/src/doc/book/src/ch03-05-control-flow.md +++ b/src/doc/book/src/ch03-05-control-flow.md @@ -293,7 +293,7 @@ Here, the code counts up through the elements in the array. It starts at index when `index < 5` is no longer true). Running this code will print every element in the array: -```text +```console {{#include ../listings/ch03-common-programming-concepts/listing-03-04/output.txt}} ``` diff --git a/src/doc/book/src/ch05-02-example-structs.md b/src/doc/book/src/ch05-02-example-structs.md index 0b71513d6e..c6cb8a172e 100644 --- a/src/doc/book/src/ch05-02-example-structs.md +++ b/src/doc/book/src/ch05-02-example-structs.md @@ -191,8 +191,9 @@ When we use the `{:#?}` style in the example, the output will look like this: Rust has provided a number of traits for us to use with the `derive` annotation that can add useful behavior to our custom types. Those traits and their -behaviors are listed in Appendix C. We’ll cover how to implement these traits -with custom behavior as well as how to create your own traits in Chapter 10. +behaviors are listed in [Appendix C][app-c]. We’ll cover how to +implement these traits with custom behavior as well as how to create your own +traits in Chapter 10. Our `area` function is very specific: it only computes the area of rectangles. It would be helpful to tie this behavior more closely to our `Rectangle` @@ -201,3 +202,4 @@ continue to refactor this code by turning the `area` function into an `area` *method* defined on our `Rectangle` type. [the-tuple-type]: ch03-02-data-types.html#the-tuple-type +[app-c]: appendix-03-derivable-traits.md diff --git a/src/doc/book/src/ch05-03-method-syntax.md b/src/doc/book/src/ch05-03-method-syntax.md index f074497ca7..7fced77266 100644 --- a/src/doc/book/src/ch05-03-method-syntax.md +++ b/src/doc/book/src/ch05-03-method-syntax.md @@ -71,7 +71,7 @@ provide. > automatically adds in `&`, `&mut`, or `*` so `object` matches the signature of > the method. In other words, the following are the same: > - +> > ```rust > # #[derive(Debug,Copy,Clone)] > # struct Point { diff --git a/src/doc/book/src/ch08-03-hash-maps.md b/src/doc/book/src/ch08-03-hash-maps.md index b3f9935139..12f6b6e320 100644 --- a/src/doc/book/src/ch08-03-hash-maps.md +++ b/src/doc/book/src/ch08-03-hash-maps.md @@ -207,8 +207,8 @@ loop, so all of these changes are safe and allowed by the borrowing rules. ### Hashing Functions -By default, `HashMap` uses a “cryptographically strong”[^siphash] hashing -function that can provide resistance to Denial of Service (DoS) attacks. This +By default, `HashMap` uses a hashing function called SipHash that can provide +resistance to Denial of Service (DoS) attacks involving hash tables[^siphash]. This is not the fastest hashing algorithm available, but the trade-off for better security that comes with the drop in performance is worth it. If you profile your code and find that the default hash function is too slow for your diff --git a/src/doc/book/src/ch09-01-unrecoverable-errors-with-panic.md b/src/doc/book/src/ch09-01-unrecoverable-errors-with-panic.md index f60a4dd7b4..ede7cc6149 100644 --- a/src/doc/book/src/ch09-01-unrecoverable-errors-with-panic.md +++ b/src/doc/book/src/ch09-01-unrecoverable-errors-with-panic.md @@ -90,22 +90,18 @@ continue. Let’s try it and see: {{#include ../listings/ch09-error-handling/listing-09-01/output.txt}} ``` -This error points at a file we didn’t write, *libcore/slice/mod.rs*. That’s the -implementation of `slice` in the Rust source code. The code that gets run when -we use `[]` on our vector `v` is in *libcore/slice/mod.rs*, and that is where -the `panic!` is actually happening. - -The next note line tells us that we can set the `RUST_BACKTRACE` environment -variable to get a backtrace of exactly what happened to cause the error. A -*backtrace* is a list of all the functions that have been called to get to this -point. Backtraces in Rust work as they do in other languages: the key to -reading the backtrace is to start from the top and read until you see files you -wrote. That’s the spot where the problem originated. The lines above the lines -mentioning your files are code that your code called; the lines below are code -that called your code. These lines might include core Rust code, standard -library code, or crates that you’re using. Let’s try getting a backtrace by -setting the `RUST_BACKTRACE` environment variable to any value except 0. -Listing 9-2 shows output similar to what you’ll see. +This error points at line 4 of our `main.rs` where we attempt to access index +99. The next note line tells us that we can set the `RUST_BACKTRACE` +environment variable to get a backtrace of exactly what happened to cause the +error. A *backtrace* is a list of all the functions that have been called to +get to this point. Backtraces in Rust work as they do in other languages: the +key to reading the backtrace is to start from the top and read until you see +files you wrote. That’s the spot where the problem originated. The lines above +the lines mentioning your files are code that your code called; the lines below +are code that called your code. These lines might include core Rust code, +standard library code, or crates that you’re using. Let’s try getting a +backtrace by setting the `RUST_BACKTRACE` environment variable to any value +except 0. Listing 9-2 shows output similar to what you’ll see. . In sum, here are the steps we took to change the code from Listing 10-2 to Listing 10-3: @@ -112,3 +116,5 @@ abstract types. For example, say we had two functions: one that finds the largest item in a slice of `i32` values and one that finds the largest item in a slice of `char` values. How would we eliminate that duplication? Let’s find out! + +[ch18]: ch18-00-patterns.html diff --git a/src/doc/book/src/ch10-01-syntax.md b/src/doc/book/src/ch10-01-syntax.md index f50adf3462..0eb8b56892 100644 --- a/src/doc/book/src/ch10-01-syntax.md +++ b/src/doc/book/src/ch10-01-syntax.md @@ -44,12 +44,12 @@ to declare the type parameter name before we use it. To define the generic between the name of the function and the parameter list, like this: ```rust,ignore -fn largest(list: &[T]) -> &T { +fn largest(list: &[T]) -> T { ``` We read this definition as: the function `largest` is generic over some type `T`. This function has one parameter named `list`, which is a slice of values -of type `T`. The `largest` function will return a reference to a value of the +of type `T`. The `largest` function will return a value of the same type `T`. Listing 10-5 shows the combined `largest` function definition using the generic diff --git a/src/doc/book/src/ch10-02-traits.md b/src/doc/book/src/ch10-02-traits.md index 55f22cfb13..abfc001a10 100644 --- a/src/doc/book/src/ch10-02-traits.md +++ b/src/doc/book/src/ch10-02-traits.md @@ -342,7 +342,7 @@ type parameter’s bounds, let’s return to Listing 10-5 to fix the definition the `largest` function that uses a generic type parameter! Last time we tried to run that code, we received this error: -```text +```console {{#include ../listings/ch10-generic-types-traits-and-lifetimes/listing-10-05/output.txt}} ``` diff --git a/src/doc/book/src/ch11-01-writing-tests.md b/src/doc/book/src/ch11-01-writing-tests.md index 9ff29d1949..47b37f7404 100644 --- a/src/doc/book/src/ch11-01-writing-tests.md +++ b/src/doc/book/src/ch11-01-writing-tests.md @@ -137,7 +137,7 @@ we call the `panic!` macro Run the tests again using `cargo test`. The output should look like Listing 11-4, which shows that our `exploration` test passed and `another` failed. -```text +```console {{#include ../listings/ch11-writing-automated-tests/listing-11-03/output.txt}} ``` diff --git a/src/doc/book/src/ch11-03-test-organization.md b/src/doc/book/src/ch11-03-test-organization.md index 0057e8c472..2110ff14c1 100644 --- a/src/doc/book/src/ch11-03-test-organization.md +++ b/src/doc/book/src/ch11-03-test-organization.md @@ -38,7 +38,7 @@ this chapter, Cargo generated this code for us: Filename: src/lib.rs ```rust,noplayground -{{#rustdoc_include ../listings/ch11-writing-automated-tests/listing-11-01/src/lib.rs:here}} +{{#rustdoc_include ../listings/ch11-writing-automated-tests/listing-11-01/src/lib.rs}} ``` This code is the automatically generated test module. The attribute `cfg` @@ -120,7 +120,7 @@ seeing: one line for each unit test (one named `internal` that we added in Listing 11-12) and then a summary line for the unit tests. The integration tests section starts with the line `Running -target/debug/deps/integration_test-ce99bcc2479f4607` (the hash at the end of +target/debug/deps/integration_test-1082c4b063a8fbe6` (the hash at the end of your output will be different). Next, there is a line for each test function in that integration test and a summary line for the results of the integration test just before the `Doc-tests adder` section starts. diff --git a/src/doc/book/src/ch12-01-accepting-command-line-arguments.md b/src/doc/book/src/ch12-01-accepting-command-line-arguments.md index 8b5aefd980..92c9f4cd64 100644 --- a/src/doc/book/src/ch12-01-accepting-command-line-arguments.md +++ b/src/doc/book/src/ch12-01-accepting-command-line-arguments.md @@ -102,7 +102,7 @@ throughout the rest of the program. We do that in Listing 12-2. Filename: src/main.rs -```rust,should_panic +```rust,should_panic,noplayground {{#rustdoc_include ../listings/ch12-an-io-project/listing-12-02/src/main.rs}} ``` diff --git a/src/doc/book/src/ch12-02-reading-a-file.md b/src/doc/book/src/ch12-02-reading-a-file.md index 2ca1c24cbe..7ba7d92bd1 100644 --- a/src/doc/book/src/ch12-02-reading-a-file.md +++ b/src/doc/book/src/ch12-02-reading-a-file.md @@ -22,7 +22,7 @@ shown in Listing 12-4. Filename: src/main.rs -```rust,should_panic +```rust,should_panic,noplayground {{#rustdoc_include ../listings/ch12-an-io-project/listing-12-04/src/main.rs:here}} ``` diff --git a/src/doc/book/src/ch12-03-improving-error-handling-and-modularity.md b/src/doc/book/src/ch12-03-improving-error-handling-and-modularity.md index e24d43e7f8..32f0e571e9 100644 --- a/src/doc/book/src/ch12-03-improving-error-handling-and-modularity.md +++ b/src/doc/book/src/ch12-03-improving-error-handling-and-modularity.md @@ -119,7 +119,7 @@ Listing 12-6 shows the improvements to the `parse_config` function. Filename: src/main.rs -```rust,should_panic +```rust,should_panic,noplayground {{#rustdoc_include ../listings/ch12-an-io-project/listing-12-06/src/main.rs:here}} ``` @@ -187,7 +187,7 @@ shows the changes we need to make. Filename: src/main.rs -```rust,should_panic +```rust,should_panic,noplayground {{#rustdoc_include ../listings/ch12-an-io-project/listing-12-07/src/main.rs:here}} ``` @@ -306,7 +306,7 @@ program that the program exited with an error state. Listing 12-10: Exiting with an error code if creating a new `Config` fails -In this listing, we’ve used a method we haven’t covered before: +In this listing, we’ve used a method we haven’t covered in detail yet: `unwrap_or_else`, which is defined on `Result` by the standard library. Using `unwrap_or_else` allows us to define some custom, non-`panic!` error handling. If the `Result` is an `Ok` value, this method’s behavior is similar diff --git a/src/doc/book/src/ch12-04-testing-the-librarys-functionality.md b/src/doc/book/src/ch12-04-testing-the-librarys-functionality.md index 514c2b716c..d079439c67 100644 --- a/src/doc/book/src/ch12-04-testing-the-librarys-functionality.md +++ b/src/doc/book/src/ch12-04-testing-the-librarys-functionality.md @@ -129,7 +129,7 @@ won’t compile yet. Filename: src/lib.rs -```rust,ignore +```rust,ignore,does_not_compile {{#rustdoc_include ../listings/ch12-an-io-project/listing-12-17/src/lib.rs:here}} ``` @@ -150,7 +150,7 @@ Listing 12-18. Note this still won’t compile yet. Filename: src/lib.rs -```rust,ignore +```rust,ignore,does_not_compile {{#rustdoc_include ../listings/ch12-an-io-project/listing-12-18/src/lib.rs:here}} ``` diff --git a/src/doc/book/src/ch12-06-writing-to-stderr-instead-of-stdout.md b/src/doc/book/src/ch12-06-writing-to-stderr-instead-of-stdout.md index 002925147d..0d6a45a6cc 100644 --- a/src/doc/book/src/ch12-06-writing-to-stderr-instead-of-stdout.md +++ b/src/doc/book/src/ch12-06-writing-to-stderr-instead-of-stdout.md @@ -66,7 +66,7 @@ instead of standard output using `eprintln!` After changing `println!` to `eprintln!`, let’s run the program again in the same way, without any arguments and redirecting standard output with `>`: -```text +```console $ cargo run > output.txt Problem parsing arguments: not enough arguments ``` diff --git a/src/doc/book/src/ch13-01-closures.md b/src/doc/book/src/ch13-01-closures.md index 27e56e02a1..26e0075c59 100644 --- a/src/doc/book/src/ch13-01-closures.md +++ b/src/doc/book/src/ch13-01-closures.md @@ -131,8 +131,9 @@ twice. Unfortunately, we’re now calling this function and waiting for the result in all cases, which includes the inner `if` block that doesn’t use the result value at all. -We want to define code in one place in our program, but only *execute* that -code where we actually need the result. This is a use case for closures! +We want to refer to `simulated_expensive_calculation` only once in +`generate_workout`, but defer the expensive calculation to only where +we actually need the result. This is a use case for closures! #### Refactoring with Closures to Store Code @@ -186,8 +187,8 @@ want to use, as shown in Listing 13-6. Listing 13-6: Calling the `expensive_closure` we’ve defined -Now the expensive calculation is called in only one place, and we’re only -executing that code where we need the results. +Now how to perform the expensive calculation is defined in only one +place, and we’re only executing that code where we need the results. However, we’ve reintroduced one of the problems from Listing 13-3: we’re still calling the closure twice in the first `if` block, which will call the diff --git a/src/doc/book/src/ch13-02-iterators.md b/src/doc/book/src/ch13-02-iterators.md index 3d7f59946f..070a33011b 100644 --- a/src/doc/book/src/ch13-02-iterators.md +++ b/src/doc/book/src/ch13-02-iterators.md @@ -203,11 +203,11 @@ instances. It will return only shoes that are the specified size. Listing 13-19: Using the `filter` method with a closure that captures `shoe_size` -The `shoes_in_my_size` function takes ownership of a vector of shoes and a shoe +The `shoes_in_size` function takes ownership of a vector of shoes and a shoe size as parameters. It returns a vector containing only shoes of the specified size. -In the body of `shoes_in_my_size`, we call `into_iter` to create an iterator +In the body of `shoes_in_size`, we call `into_iter` to create an iterator that takes ownership of the vector. Then we call `filter` to adapt that iterator into a new iterator that only contains elements for which the closure returns `true`. @@ -217,7 +217,7 @@ compares the value with each shoe’s size, keeping only shoes of the size specified. Finally, calling `collect` gathers the values returned by the adapted iterator into a vector that’s returned by the function. -The test shows that when we call `shoes_in_my_size`, we get back only shoes +The test shows that when we call `shoes_in_size`, we get back only shoes that have the same size as the value we specified. ### Creating Our Own Iterators with the `Iterator` Trait @@ -262,7 +262,7 @@ iterator is used, as shown in Listing 13-21: Filename: src/lib.rs ```rust,noplayground -{{#rustdoc_include ../listings/ch13-functional-features/listing-13-21/src/lib.rs}} +{{#rustdoc_include ../listings/ch13-functional-features/listing-13-21/src/lib.rs:here}} ``` Listing 13-21: Implementing the `Iterator` trait on our diff --git a/src/doc/book/src/ch14-02-publishing-to-crates-io.md b/src/doc/book/src/ch14-02-publishing-to-crates-io.md index dc10e2e965..b9f43fb0bc 100644 --- a/src/doc/book/src/ch14-02-publishing-to-crates-io.md +++ b/src/doc/book/src/ch14-02-publishing-to-crates-io.md @@ -96,7 +96,7 @@ copy just the doc-tests section below running 1 test test src/lib.rs - add_one (line 5) ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.27s ``` Now if we change either the function or the example so the `assert_eq!` in the diff --git a/src/doc/book/src/ch14-03-cargo-workspaces.md b/src/doc/book/src/ch14-03-cargo-workspaces.md index c376fa57b8..5d8f834284 100644 --- a/src/doc/book/src/ch14-03-cargo-workspaces.md +++ b/src/doc/book/src/ch14-03-cargo-workspaces.md @@ -228,9 +228,9 @@ copy output below; the output updating script doesn't handle subdirectories in p ```console $ cargo build Updating crates.io index - Downloaded rand v0.5.5 + Downloaded rand v0.8.3 --snip-- - Compiling rand v0.5.6 + Compiling rand v0.8.3 Compiling add-one v0.1.0 (file:///projects/add/add-one) warning: unused import: `rand` --> add-one/src/lib.rs:1:5 @@ -307,19 +307,19 @@ $ cargo test running 1 test test tests::it_works ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Running target/debug/deps/adder-49979ff40686fa8e running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests add-one running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` The first section of the output shows that the `it_works` test in the `add-one` @@ -346,13 +346,13 @@ $ cargo test -p add-one running 1 test test tests::it_works ... ok -test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s Doc-tests add-one running 0 tests -test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out +test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s ``` This output shows `cargo test` only ran the tests for the `add-one` crate and diff --git a/src/doc/book/src/ch15-05-interior-mutability.md b/src/doc/book/src/ch15-05-interior-mutability.md index 4b1f414732..a42b49fa60 100644 --- a/src/doc/book/src/ch15-05-interior-mutability.md +++ b/src/doc/book/src/ch15-05-interior-mutability.md @@ -133,14 +133,14 @@ value is to a maximum value and warn when the value is at certain levels One important part of this code is that the `Messenger` trait has one method called `send` that takes an immutable reference to `self` and the text of the -message. This is the interface our mock object needs to have. The other -important part is that we want to test the behavior of the `set_value` method -on the `LimitTracker`. We can change what we pass in for the `value` parameter, -but `set_value` doesn’t return anything for us to make assertions on. We want -to be able to say that if we create a `LimitTracker` with something that -implements the `Messenger` trait and a particular value for `max`, when we pass -different numbers for `value`, the messenger is told to send the appropriate -messages. +message. This trait is the interface our mock object needs to implement so that +the mock can be used in the same way a real object is. The other important part +is that we want to test the behavior of the `set_value` method on the +`LimitTracker`. We can change what we pass in for the `value` parameter, but +`set_value` doesn’t return anything for us to make assertions on. We want to be +able to say that if we create a `LimitTracker` with something that implements +the `Messenger` trait and a particular value for `max`, when we pass different +numbers for `value`, the messenger is told to send the appropriate messages. We need a mock object that, instead of sending an email or text message when we call `send`, will only keep track of the messages it’s told to send. We can @@ -178,7 +178,7 @@ of should now have one message in it. However, there’s one problem with this test, as shown here: -```text +```console {{#include ../listings/ch15-smart-pointers/listing-15-21/output.txt}} ``` @@ -189,7 +189,7 @@ signature of `send` wouldn’t match the signature in the `Messenger` trait definition (feel free to try and see what error message you get). This is a situation in which interior mutability can help! We’ll store the -`sent_messages` within a `RefCell`, and then the `send` message will be +`sent_messages` within a `RefCell`, and then the `send` method will be able to modify `sent_messages` to store the messages we’ve seen. Listing 15-22 shows what that looks like: diff --git a/src/doc/book/src/ch16-02-message-passing.md b/src/doc/book/src/ch16-02-message-passing.md index 666bb57e00..c087ce2ad9 100644 --- a/src/doc/book/src/ch16-02-message-passing.md +++ b/src/doc/book/src/ch16-02-message-passing.md @@ -3,7 +3,7 @@ One increasingly popular approach to ensuring safe concurrency is *message passing*, where threads or actors communicate by sending each other messages containing data. Here’s the idea in a slogan from [the Go language -documentation](https://golang.org/doc/effective_go.html#concurrency): +documentation](https://golang.org/doc/effective_go.html#concurrency): “Do not communicate by sharing memory; instead, share memory by communicating.” One major tool Rust has for accomplishing message-sending concurrency is the @@ -176,7 +176,7 @@ pause for a second between each message. Filename: src/main.rs -```rust +```rust,noplayground {{#rustdoc_include ../listings/ch16-fearless-concurrency/listing-16-10/src/main.rs}} ``` @@ -219,7 +219,7 @@ so by cloning the transmitting half of the channel, as shown in Listing 16-11: Filename: src/main.rs -```rust +```rust,noplayground {{#rustdoc_include ../listings/ch16-fearless-concurrency/listing-16-11/src/main.rs:here}} ``` diff --git a/src/doc/book/src/ch16-04-extensible-concurrency-sync-and-send.md b/src/doc/book/src/ch16-04-extensible-concurrency-sync-and-send.md index 797f69a991..e4cf711fb9 100644 --- a/src/doc/book/src/ch16-04-extensible-concurrency-sync-and-send.md +++ b/src/doc/book/src/ch16-04-extensible-concurrency-sync-and-send.md @@ -11,7 +11,7 @@ However, two concurrency concepts are embedded in the language: the ### Allowing Transference of Ownership Between Threads with `Send` -The `Send` marker trait indicates that ownership of the type implementing +The `Send` marker trait indicates that ownership of values of the type implementing `Send` can be transferred between threads. Almost every Rust type is `Send`, but there are some exceptions, including `Rc`: this cannot be `Send` because if you cloned an `Rc` value and tried to transfer ownership of the clone to diff --git a/src/doc/book/src/ch18-03-pattern-syntax.md b/src/doc/book/src/ch18-03-pattern-syntax.md index abec505c94..6fedc85c68 100644 --- a/src/doc/book/src/ch18-03-pattern-syntax.md +++ b/src/doc/book/src/ch18-03-pattern-syntax.md @@ -344,7 +344,7 @@ warning because that could be a bug. But sometimes it’s useful to create a variable you won’t use yet, such as when you’re prototyping or just starting a project. In this situation, you can tell Rust not to warn you about the unused variable by starting the name of the variable with an underscore. In Listing -18-20, we create two unused variables, but when we run this code, we should +18-20, we create two unused variables, but when we compile this code, we should only get a warning about one of them. Filename: src/main.rs diff --git a/src/doc/book/src/ch19-01-unsafe-rust.md b/src/doc/book/src/ch19-01-unsafe-rust.md index b5f9bb7968..5dc2f81cee 100644 --- a/src/doc/book/src/ch19-01-unsafe-rust.md +++ b/src/doc/book/src/ch19-01-unsafe-rust.md @@ -8,11 +8,12 @@ and works just like regular Rust, but gives us extra superpowers. Unsafe Rust exists because, by nature, static analysis is conservative. When the compiler tries to determine whether or not code upholds the guarantees, it’s better for it to reject some valid programs rather than accept some -invalid programs. Although the code might be okay, as far as Rust is able to -tell, it’s not! In these cases, you can use unsafe code to tell the compiler, -“Trust me, I know what I’m doing.” The downside is that you use it at your own -risk: if you use unsafe code incorrectly, problems due to memory unsafety, such -as null pointer dereferencing, can occur. +invalid programs. Although the code *might* be okay, if the Rust compiler +doesn’t have enough information to be confident, it will reject the code. In +these cases, you can use unsafe code to tell the compiler, “Trust me, I know +what I’m doing.” The downside is that you use it at your own risk: if you use +unsafe code incorrectly, problems due to memory unsafety, such as null pointer +dereferencing, can occur. Another reason Rust has an unsafe alter ego is that the underlying computer hardware is inherently unsafe. If Rust didn’t let you do unsafe operations, you diff --git a/src/doc/book/src/ch19-04-advanced-types.md b/src/doc/book/src/ch19-04-advanced-types.md index c30a847372..a4b1d1d3c2 100644 --- a/src/doc/book/src/ch19-04-advanced-types.md +++ b/src/doc/book/src/ch19-04-advanced-types.md @@ -105,7 +105,7 @@ the `Write` trait: {{#rustdoc_include ../listings/ch19-advanced-features/no-listing-05-write-trait/src/lib.rs}} ``` -The `Result<..., Error>` is repeated a lot. As such, `std::io` has this type of +The `Result<..., Error>` is repeated a lot. As such, `std::io` has this type alias declaration: ```rust,noplayground diff --git a/src/doc/book/src/ch20-01-single-threaded.md b/src/doc/book/src/ch20-01-single-threaded.md index 0eae4a06b1..e0b017263c 100644 --- a/src/doc/book/src/ch20-01-single-threaded.md +++ b/src/doc/book/src/ch20-01-single-threaded.md @@ -48,7 +48,7 @@ Using `TcpListener`, we can listen for TCP connections at the address `127.0.0.1:7878`. In the address, the section before the colon is an IP address representing your computer (this is the same on every computer and doesn’t represent the authors’ computer specifically), and `7878` is the port. We’ve -chosen this port for two reasons: HTTP is normally accepted on this port, and +chosen this port for two reasons: HTTP isn't normally accepted on this port, and 7878 is *rust* typed on a telephone. The `bind` function in this scenario works like the `new` function in that it @@ -390,10 +390,10 @@ indicating the response to the end user. error page if anything other than */* was requested Here, our response has a status line with status code 404 and the reason -phrase `NOT FOUND`. We’re still not returning headers, and the body of the -response will be the HTML in the file *404.html*. You’ll need to create a -*404.html* file next to *hello.html* for the error page; again feel free to use -any HTML you want or use the example HTML in Listing 20-8. +phrase `NOT FOUND`. The body of the response will be the HTML in the file +*404.html*. You’ll need to create a *404.html* file next to *hello.html* for +the error page; again feel free to use any HTML you want or use the example +HTML in Listing 20-8. Filename: 404.html diff --git a/src/doc/book/src/img/ferris/does_not_compile.svg b/src/doc/book/src/img/ferris/does_not_compile.svg index 5d345f14e0..48b7b4d3a4 100644 --- a/src/doc/book/src/img/ferris/does_not_compile.svg +++ b/src/doc/book/src/img/ferris/does_not_compile.svg @@ -62,7 +62,7 @@ c28.121,9.526,56.653,10.049,81.229,3.207C610.833,790.881,585.746,745.985,585.746,745.985"/> - to install or update Rust, and see the new [Appendix E][editions] src/main.rs:12:13 + | +4 | fn get_default<'m, K, V>(map: &'m mut HashMap, key: K) -> &'m mut V + | -- lifetime `'m` defined here +... +9 | match map.get_mut(&key) { + | - --- first mutable borrow occurs here + | _____| + | | +10 | | Some(value) => value, +11 | | None => { +12 | | map.insert(key.clone(), V::default()); + | | ^^^ second mutable borrow occurs here +13 | | map.get_mut(&key).unwrap() +14 | | } +15 | | } + | |_____- returning this value requires that `*map` is borrowed for `'m` +``` + [ex2]: lifetimes.html#example-aliasing-a-mutable-reference diff --git a/src/doc/reference/README.md b/src/doc/reference/README.md index 23d24218cb..ca6e5a67cf 100644 --- a/src/doc/reference/README.md +++ b/src/doc/reference/README.md @@ -11,18 +11,47 @@ what we have for now. - rustc (the Rust compiler). - mdbook (use `cargo install mdbook` to install it). +- rust nightly (you would be required to set your Rust version to the nightly version to make sure all tests pass) ## Build steps -First, go to the repository folder and test the code snippets to catch -compilation errors: +To build the project, follow the steps given below : + +Clone the project by downloading the ZIP from the [GitHub page](https://github.com/rust-lang/reference) or +run the following command: + +``` +git clone https://github.com/rust-lang/reference +``` + +Change the directory to the downloaded repository: ```sh cd reference +``` + +To run the tests, you would need to set the Rust version to the nightly release. You can do this by executing the following command: + +```shell +rustup override set nightly +``` + +This will set the nightly version only for your the current project. + +If you wish to set Rust nightly for all your projects, you can run the command: + +```shell +rustup default nightly +``` + +Now, run the following command to test the code snippets to catch compilation errors: + +```shell mdbook test ``` -And then generate the book: + +To generate a local instance of the book, run: ```sh mdbook build diff --git a/src/doc/reference/book.toml b/src/doc/reference/book.toml index b1335de77c..d57c9a1707 100644 --- a/src/doc/reference/book.toml +++ b/src/doc/reference/book.toml @@ -6,3 +6,6 @@ author = "The Rust Project Developers" [output.html] additional-css = ["theme/reference.css"] git-repository-url = "https://github.com/rust-lang/reference/" + +[output.html.redirect] +"/expressions/enum-variant-expr.html" = "struct-expr.html" \ No newline at end of file diff --git a/src/doc/reference/src/SUMMARY.md b/src/doc/reference/src/SUMMARY.md index 4bce2f2216..783c647b43 100644 --- a/src/doc/reference/src/SUMMARY.md +++ b/src/doc/reference/src/SUMMARY.md @@ -56,7 +56,6 @@ - [Array and index expressions](expressions/array-expr.md) - [Tuple and index expressions](expressions/tuple-expr.md) - [Struct expressions](expressions/struct-expr.md) - - [Enum variant expressions](expressions/enum-variant-expr.md) - [Call expressions](expressions/call-expr.md) - [Method call expressions](expressions/method-call-expr.md) - [Field access expressions](expressions/field-expr.md) @@ -111,7 +110,6 @@ - [Memory model](memory-model.md) - [Memory allocation and lifetime](memory-allocation-and-lifetime.md) - - [Memory ownership](memory-ownership.md) - [Variables](variables.md) - [Linkage](linkage.md) diff --git a/src/doc/reference/src/attributes/type_system.md b/src/doc/reference/src/attributes/type_system.md index 97938f2d7a..729069d26c 100644 --- a/src/doc/reference/src/attributes/type_system.md +++ b/src/doc/reference/src/attributes/type_system.md @@ -64,7 +64,7 @@ Non-exhaustive types cannot be constructed outside of the defining crate: - Non-exhaustive variants ([`struct`][struct] or [`enum` variant][enum]) cannot be constructed with a [_StructExpression_] \(including with [functional update syntax]). -- [`enum`][enum] instances can be constructed in an [_EnumerationVariantExpression_]. +- [`enum`][enum] instances can be constructed. ```rust,ignore @@ -129,7 +129,6 @@ match message { Non-exhaustive types are always considered inhabited in downstream crates. -[_EnumerationVariantExpression_]: ../expressions/enum-variant-expr.md [_MetaWord_]: ../attributes.md#meta-item-attribute-syntax [_StructExpression_]: ../expressions/struct-expr.md [_StructPattern_]: ../patterns.md#struct-patterns diff --git a/src/doc/reference/src/behavior-considered-undefined.md b/src/doc/reference/src/behavior-considered-undefined.md index f1ad30ada3..1cc7966bfd 100644 --- a/src/doc/reference/src/behavior-considered-undefined.md +++ b/src/doc/reference/src/behavior-considered-undefined.md @@ -38,7 +38,7 @@ code. a function/primitive operation or returned from a function/primitive operation. The following values are invalid (at their respective type): - * A value other than `false` (`0`) or `true` (`1`) in a `bool`. + * A value other than `false` (`0`) or `true` (`1`) in a [`bool`]. * A discriminant in an `enum` not included in the type definition. * A null `fn` pointer. * A value in a `char` which is a surrogate or above `char::MAX`. @@ -77,7 +77,8 @@ cannot be bigger than `isize::MAX` bytes. > vice versa, undefined behavior in Rust can cause adverse affects on code > executed by any FFI calls to other languages. -[`const`]: items/constant-items.html +[`bool`]: types/boolean.md +[`const`]: items/constant-items.md [noalias]: http://llvm.org/docs/LangRef.html#noalias [pointer aliasing rules]: http://llvm.org/docs/LangRef.html#pointer-aliasing-rules [undef]: http://llvm.org/docs/LangRef.html#undefined-values diff --git a/src/doc/reference/src/const_eval.md b/src/doc/reference/src/const_eval.md index 159f0a7682..4f67165300 100644 --- a/src/doc/reference/src/const_eval.md +++ b/src/doc/reference/src/const_eval.md @@ -27,7 +27,6 @@ to be run. * [Tuple expressions]. * [Array expressions]. * [Struct] expressions. -* [Enum variant] expressions. * [Block expressions], including `unsafe` blocks. * [let statements] and thus irrefutable [patterns], including mutable bindings * [assignment expressions] @@ -117,7 +116,6 @@ Conversely, the following are possible in a const function, but not in a const c [dereference operator]: expressions/operator-expr.md#the-dereference-operator [destructors]: destructors.md [enum discriminants]: items/enumerations.md#custom-discriminant-values-for-fieldless-enumerations -[enum variant]: expressions/enum-variant-expr.md [expression statements]: statements.md#expression-statements [expressions]: expressions.md [field]: expressions/field-expr.md diff --git a/src/doc/reference/src/expressions.md b/src/doc/reference/src/expressions.md index c2702a342a..09b433365a 100644 --- a/src/doc/reference/src/expressions.md +++ b/src/doc/reference/src/expressions.md @@ -18,7 +18,6 @@ >       | [_TupleExpression_]\ >       | [_TupleIndexingExpression_]\ >       | [_StructExpression_]\ ->       | [_EnumerationVariantExpression_]\ >       | [_CallExpression_]\ >       | [_MethodCallExpression_]\ >       | [_FieldExpression_]\ @@ -103,7 +102,6 @@ evaluate them conditionally as described on their respective pages. * Tuple expression * Tuple index expression * Struct expression -* Enumeration variant expression * Call expression * Method call expression * Field expression @@ -259,7 +257,7 @@ a few specific cases: * Before an expression used as a [statement]. * Elements of [array expressions], [tuple expressions], [call expressions], - and tuple-style [struct] and [enum variant] expressions. + and tuple-style [struct] expressions. ```rust,ignore @@ -64,7 +53,5 @@ match /* */ { } ``` -where the `yield` pseudo-code returns `Poll::Pending` and, when -re-invoked, resumes execution from that point. The variable -`current_context` refers to the context taken from the async -environment. +where the `yield` pseudo-code returns `Poll::Pending` and, when re-invoked, resumes execution from that point. +The variable `current_context` refers to the context taken from the async environment. diff --git a/src/doc/reference/src/expressions/block-expr.md b/src/doc/reference/src/expressions/block-expr.md index 291634f3cf..6d418e7452 100644 --- a/src/doc/reference/src/expressions/block-expr.md +++ b/src/doc/reference/src/expressions/block-expr.md @@ -12,28 +12,20 @@ >    | [_Statement_]\+ [_ExpressionWithoutBlock_]\ >    | [_ExpressionWithoutBlock_] -A *block expression*, or *block*, is a control flow expression and anonymous -namespace scope for items and variable declarations. As a control flow -expression, a block sequentially executes its component non-item declaration -statements and then its final optional expression. As an anonymous namespace -scope, item declarations are only in scope inside the block itself and variables -declared by `let` statements are in scope from the next statement until the end -of the block. - -Blocks are written as `{`, then any [inner attributes], then [statements], -then an optional expression, and finally a `}`. Statements are usually required -to be followed by a semicolon, with two exceptions. Item declaration statements do -not need to be followed by a semicolon. Expression statements usually require -a following semicolon except if its outer expression is a flow control -expression. Furthermore, extra semicolons between statements are allowed, but -these semicolons do not affect semantics. - -When evaluating a block expression, each statement, except for item declaration -statements, is executed sequentially. Then the final expression is executed, -if given. - -The type of a block is the type of the final expression, or `()` if the final -expression is omitted. +A *block expression*, or *block*, is a control flow expression and anonymous namespace scope for items and variable declarations. +As a control flow expression, a block sequentially executes its component non-item declaration statements and then its final optional expression. +As an anonymous namespace scope, item declarations are only in scope inside the block itself and variables declared by `let` statements are in scope from the next statement until the end of the block. + +Blocks are written as `{`, then any [inner attributes], then [statements], then an optional expression, and finally a `}`. +Statements are usually required to be followed by a semicolon, with two exceptions. +Item declaration statements do not need to be followed by a semicolon. +Expression statements usually require a following semicolon except if its outer expression is a flow control expression. +Furthermore, extra semicolons between statements are allowed, but these semicolons do not affect semantics. + +When evaluating a block expression, each statement, except for item declaration statements, is executed sequentially. +Then the final expression is executed, if given. + +The type of a block is the type of the final expression, or `()` if the final expression is omitted. ```rust # fn fn_call() {} @@ -49,14 +41,11 @@ let five: i32 = { assert_eq!(5, five); ``` -> Note: As a control flow expression, if a block expression is the outer -> expression of an expression statement, the expected type is `()` unless it -> is followed immediately by a semicolon. +> Note: As a control flow expression, if a block expression is the outer expression of an expression statement, the expected type is `()` unless it is followed immediately by a semicolon. -Blocks are always [value expressions] and evaluate the last expression in -value expression context. This can be used to force moving a value if really -needed. For example, the following example fails on the call to `consume_self` -because the struct was moved out of `s` in the block expression. +Blocks are always [value expressions] and evaluate the last expression in value expression context. +This can be used to force moving a value if really needed. +For example, the following example fails on the call to `consume_self` because the struct was moved out of `s` in the block expression. ```rust,compile_fail struct Struct; @@ -83,20 +72,15 @@ fn move_by_block_expression() { > _AsyncBlockExpression_ :\ >    `async` `move`? _BlockExpression_ -An *async block* is a variant of a block expression which evaluates to -a *future*. The final expression of the block, if present, determines -the result value of the future. +An *async block* is a variant of a block expression which evaluates to a *future*. +The final expression of the block, if present, determines the result value of the future. Executing an async block is similar to executing a closure expression: its immediate effect is to produce and return an anonymous type. -Whereas closures return a type that implements one or more of the -[`std::ops::Fn`] traits, however, the type returned for an async block -implements the [`std::future::Future`] trait. The actual data format for -this type is unspecified. +Whereas closures return a type that implements one or more of the [`std::ops::Fn`] traits, however, the type returned for an async block implements the [`std::future::Future`] trait. +The actual data format for this type is unspecified. -> **Note:** The future type that rustc generates is roughly equivalent -> to an enum with one variant per `await` point, where each variant -> stores the data needed to resume from its corresponding point. +> **Note:** The future type that rustc generates is roughly equivalent to an enum with one variant per `await` point, where each variant stores the data needed to resume from its corresponding point. > **Edition differences**: Async blocks are only available beginning with Rust 2018. @@ -105,11 +89,9 @@ this type is unspecified. ### Capture modes -Async blocks capture variables from their environment using the same -[capture modes] as closures. Like closures, when written `async { -.. }` the capture mode for each variable will be inferred from the -content of the block. `async move { .. }` blocks however will move all -referenced variables into the resulting future. +Async blocks capture variables from their environment using the same [capture modes] as closures. +Like closures, when written `async { .. }` the capture mode for each variable will be inferred from the content of the block. +`async move { .. }` blocks however will move all referenced variables into the resulting future. [capture modes]: ../types/closure.md#capture-modes [shared references]: ../types/pointer.md#shared-references- @@ -117,25 +99,20 @@ referenced variables into the resulting future. ### Async context -Because async blocks construct a future, they define an **async -context** which can in turn contain [`await` expressions]. Async -contexts are established by async blocks as well as the bodies of -async functions, whose semantics are defined in terms of async blocks. +Because async blocks construct a future, they define an **async context** which can in turn contain [`await` expressions]. +Async contexts are established by async blocks as well as the bodies of async functions, whose semantics are defined in terms of async blocks. [`await` expressions]: await-expr.md ### Control-flow operators -Async blocks act like a function boundary, much like -closures. Therefore, the `?` operator and `return` expressions both -affect the output of the future, not the enclosing function or other -context. That is, `return ` from within a closure will return -the result of `` as the output of the future. Similarly, if -`?` propagates an error, that error is propagated as the result -of the future. +Async blocks act like a function boundary, much like closures. +Therefore, the `?` operator and `return` expressions both affect the output of the future, not the enclosing function or other context. +That is, `return ` from within a closure will return the result of `` as the output of the future. +Similarly, if `?` propagates an error, that error is propagated as the result of the future. -Finally, the `break` and `continue` keywords cannot be used to branch -out from an async block. Therefore the following is illegal: +Finally, the `break` and `continue` keywords cannot be used to branch out from an async block. +Therefore the following is illegal: ```rust,edition2018,compile_fail loop { @@ -153,8 +130,8 @@ loop { _See [`unsafe` block](../unsafe-blocks.md) for more information on when to use `unsafe`_ -A block of code can be prefixed with the `unsafe` keyword to permit [unsafe -operations]. Examples: +A block of code can be prefixed with the `unsafe` keyword to permit [unsafe operations]. +Examples: ```rust unsafe { @@ -170,22 +147,19 @@ let a = unsafe { an_unsafe_fn() }; ## Attributes on block expressions -[Inner attributes] are allowed directly after the opening brace of a block -expression in the following situations: +[Inner attributes] are allowed directly after the opening brace of a block expression in the following situations: * [Function] and [method] bodies. * Loop bodies ([`loop`], [`while`], [`while let`], and [`for`]). * Block expressions used as a [statement]. * Block expressions as elements of [array expressions], [tuple expressions], - [call expressions], and tuple-style [struct] and [enum variant] expressions. + [call expressions], and tuple-style [struct] expressions. * A block expression as the tail expression of another block expression. -The attributes that have meaning on a block expression are [`cfg`] and [the -lint check attributes]. +The attributes that have meaning on a block expression are [`cfg`] and [the lint check attributes]. -For example, this function returns `true` on unix platforms and `false` on other -platforms. +For example, this function returns `true` on unix platforms and `false` on other platforms. ```rust fn is_unix_platform() -> bool { @@ -204,7 +178,6 @@ fn is_unix_platform() -> bool { [`while`]: loop-expr.md#predicate-loops [array expressions]: array-expr.md [call expressions]: call-expr.md -[enum variant]: enum-variant-expr.md [function]: ../items/functions.md [inner attributes]: ../attributes.md [method]: ../items/associated-items.md#methods diff --git a/src/doc/reference/src/expressions/call-expr.md b/src/doc/reference/src/expressions/call-expr.md index 399408d864..0992f5e9f8 100644 --- a/src/doc/reference/src/expressions/call-expr.md +++ b/src/doc/reference/src/expressions/call-expr.md @@ -7,15 +7,13 @@ > _CallParams_ :\ >    [_Expression_] ( `,` [_Expression_] )\* `,`? -A _call expression_ consists of an expression followed by a parenthesized -expression-list. It invokes a function, providing zero or more input variables. -If the function eventually returns, then the expression completes. For -[non-function types](../types/function-item.md), the expression f(...) uses -the method on one of the [`std::ops::Fn`], [`std::ops::FnMut`] or -[`std::ops::FnOnce`] traits, which differ in whether they take the type by -reference, mutable reference, or take ownership respectively. An automatic -borrow will be taken if needed. Rust will also automatically dereference `f` as -required. Some examples of call expressions: +A _call expression_ consists of an expression followed by a parenthesized expression-list. +It invokes a function, providing zero or more input variables. +If the function eventually returns, then the expression completes. +For [non-function types](../types/function-item.md), the expression f(...) uses the method on one of the [`std::ops::Fn`], [`std::ops::FnMut`] or [`std::ops::FnOnce`] traits, which differ in whether they take the type by reference, mutable reference, or take ownership respectively. +An automatic borrow will be taken if needed. +Rust will also automatically dereference `f` as required. +Some examples of call expressions: ```rust # fn add(x: i32, y: i32) -> i32 { 0 } @@ -25,28 +23,22 @@ let name: &'static str = (|| "Rust")(); ## Disambiguating Function Calls -Rust treats all function calls as sugar for a more explicit, [fully-qualified -syntax]. Upon compilation, Rust will desugar all function calls into the explicit -form. Rust may sometimes require you to qualify function calls with trait, -depending on the ambiguity of a call in light of in-scope items. +Rust treats all function calls as sugar for a more explicit, [fully-qualified syntax]. +Upon compilation, Rust will desugar all function calls into the explicit form. +Rust may sometimes require you to qualify function calls with trait, depending on the ambiguity of a call in light of in-scope items. -> **Note**: In the past, the Rust community used the terms "Unambiguous -> Function Call Syntax", "Universal Function Call Syntax", or "UFCS", in -> documentation, issues, RFCs, and other community writings. However, the term -> lacks descriptive power and potentially confuses the issue at hand. We mention -> it here for searchability's sake. +> **Note**: In the past, the Rust community used the terms "Unambiguous Function Call Syntax", "Universal Function Call Syntax", or "UFCS", in documentation, issues, RFCs, and other community writings. +> However, the term lacks descriptive power and potentially confuses the issue at hand. +> We mention it here for searchability's sake. -Several situations often occur which result in ambiguities about the receiver or -referent of method or associated function calls. These situations may include: +Several situations often occur which result in ambiguities about the receiver or referent of method or associated function calls. +These situations may include: * Multiple in-scope traits define methods with the same name for the same types -* Auto-`deref` is undesirable; for example, distinguishing between methods on a - smart pointer itself and the pointer's referent -* Methods which take no arguments, like [`default()`], and return properties of a - type, like [`size_of()`] +* Auto-`deref` is undesirable; for example, distinguishing between methods on a smart pointer itself and the pointer's referent +* Methods which take no arguments, like [`default()`], and return properties of a type, like [`size_of()`] -To resolve the ambiguity, the programmer may refer to their desired method or -function using more specific paths, types, or traits. +To resolve the ambiguity, the programmer may refer to their desired method or function using more specific paths, types, or traits. For example, diff --git a/src/doc/reference/src/expressions/closure-expr.md b/src/doc/reference/src/expressions/closure-expr.md index 217a6a19cb..3669846119 100644 --- a/src/doc/reference/src/expressions/closure-expr.md +++ b/src/doc/reference/src/expressions/closure-expr.md @@ -12,45 +12,29 @@ > _ClosureParam_ :\ >    [_OuterAttribute_]\* [_Pattern_] ( `:` [_Type_] )? -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_, 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 -parameters are irrefutable [patterns], whose type annotation is optional and -will be inferred from context if not given. Each closure expression has a -unique, anonymous type. +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 parameters are irrefutable [patterns], whose type annotation is optional and will be inferred from context if not given. +Each closure expression has a unique, anonymous type. -Closure expressions are most useful when passing functions as arguments to other -functions, as an abbreviation for defining and capturing a separate function. +Closure expressions are most useful when passing functions as arguments to other functions, as an abbreviation for defining and capturing a separate function. -Significantly, closure expressions _capture their environment_, which regular -[function definitions] do not. Without the `move` keyword, the closure expression -[infers how it captures each variable from its environment](../types/closure.md#capture-modes), -preferring to capture by shared reference, effectively borrowing -all outer variables mentioned inside the closure's body. If needed the compiler -will infer that instead mutable references should be taken, or that the values -should be moved or copied (depending on their type) from the environment. A -closure can be forced to capture its environment by copying or moving values by -prefixing it with the `move` keyword. This is often used to ensure that the -closure's type is `'static`. +Significantly, closure expressions _capture their environment_, which regular [function definitions] do not. +Without the `move` keyword, the closure expression [infers how it captures each variable from its environment](../types/closure.md#capture-modes), preferring to capture by shared reference, effectively borrowing all outer variables mentioned inside the closure's body. +If needed the compiler will infer that instead mutable references should be taken, or that the values should be moved or copied (depending on their type) from the environment. +A closure can be forced to capture its environment by copying or moving values by prefixing it with the `move` keyword. +This is often used to ensure that the closure's type is `'static`. -The compiler will determine which of the [closure -traits](../types/closure.md#call-traits-and-coercions) the closure's type will implement by how it -acts on its captured variables. The closure will also implement -[`Send`](../special-types-and-traits.md#send) and/or -[`Sync`](../special-types-and-traits.md#sync) if all of its captured types do. -These traits allow functions to accept closures using generics, even though the -exact types can't be named. +The compiler will determine which of the [closure traits](../types/closure.md#call-traits-and-coercions) the closure's type will implement by how it acts on its captured variables. +The closure will also implement [`Send`](../special-types-and-traits.md#send) and/or [`Sync`](../special-types-and-traits.md#sync) if all of its captured types do. +These traits allow functions to accept closures using generics, even though the exact types can't be named. -In this example, we define a function `ten_times` that takes a higher-order -function argument, and we then call it with a closure expression as an argument, -followed by a closure expression that moves values from its environment. +In this example, we define a function `ten_times` that takes a higher-order function argument, and we then call it with a closure expression as an argument, followed by a closure expression that moves values from its environment. ```rust fn ten_times(f: F) where F: Fn(i32) { @@ -69,8 +53,7 @@ ten_times(move |j| println!("{}, {}", word, j)); ## Attributes on closure parameters -Attributes on closure parameters follow the same rules and restrictions as -[regular function parameters]. +Attributes on closure parameters follow the same rules and restrictions as [regular function parameters]. [block]: block-expr.md [function definitions]: ../items/functions.md diff --git a/src/doc/reference/src/expressions/enum-variant-expr.md b/src/doc/reference/src/expressions/enum-variant-expr.md deleted file mode 100644 index 961d654ceb..0000000000 --- a/src/doc/reference/src/expressions/enum-variant-expr.md +++ /dev/null @@ -1,47 +0,0 @@ -# Enumeration Variant expressions - -> **Syntax**\ -> _EnumerationVariantExpression_ :\ ->       _EnumExprStruct_\ ->    | _EnumExprTuple_\ ->    | _EnumExprFieldless_ -> -> _EnumExprStruct_ :\ ->    [_PathInExpression_] `{` _EnumExprFields_? `}` -> -> _EnumExprFields_ :\ ->       _EnumExprField_ (`,` _EnumExprField_)\* `,`? -> -> _EnumExprField_ :\ ->       [IDENTIFIER]\ ->    | ([IDENTIFIER] | [TUPLE_INDEX]) `:` [_Expression_] -> -> _EnumExprTuple_ :\ ->    [_PathInExpression_] `(`\ ->       ( [_Expression_] (`,` [_Expression_])\* `,`? )?\ ->    `)` -> -> _EnumExprFieldless_ : [_PathInExpression_] - -Enumeration variants can be constructed similarly to [structs], using a path to an enum -variant instead of to a struct: - -```rust -# enum Message { -# Quit, -# WriteString(String), -# Move { x: i32, y: i32 }, -# } -let q = Message::Quit; -let w = Message::WriteString("Some string".to_string()); -let m = Message::Move { x: 50, y: 200 }; -``` - -Enum variant expressions have the same syntax, behavior, and restrictions as [struct -expressions][structs], except they do not support base update with the `..` syntax. - -[IDENTIFIER]: ../identifiers.md -[TUPLE_INDEX]: ../tokens.md#tuple-index -[_Expression_]: ../expressions.md -[_PathInExpression_]: ../paths.md#paths-in-expressions -[structs]: struct-expr.md diff --git a/src/doc/reference/src/expressions/field-expr.md b/src/doc/reference/src/expressions/field-expr.md index 20fb98219e..59451d2b6f 100644 --- a/src/doc/reference/src/expressions/field-expr.md +++ b/src/doc/reference/src/expressions/field-expr.md @@ -4,11 +4,9 @@ > _FieldExpression_ :\ >    [_Expression_] `.` [IDENTIFIER] -A _field expression_ consists of an expression followed by a single dot and an -[identifier], when not immediately followed by a parenthesized expression-list -(the latter is always a [method call expression]). A field expression denotes a -field of a [struct] or [union]. To call a function stored in a struct, -parentheses are needed around the field expression. +A _field expression_ consists of an expression followed by a single dot and an [identifier], when not immediately followed by a parenthesized expression-list (the latter is always a [method call expression]). +A field expression denotes a field of a [struct] or [union]. +To call a function stored in a struct, parentheses are needed around the field expression. ```rust,ignore @@ -22,16 +20,12 @@ mystruct.method(); // Method expression A field access is a [place expression] referring to the location of that field. When the subexpression is [mutable], the field expression is also mutable. -Also, if the type of the expression to the left of the dot is a pointer, it is -automatically dereferenced as many times as necessary to make the field access -possible. In cases of ambiguity, we prefer fewer autoderefs to more. +Also, if the type of the expression to the left of the dot is a pointer, it is automatically dereferenced as many times as necessary to make the field access possible. +In cases of ambiguity, we prefer fewer autoderefs to more. -Finally, the fields of a struct or a reference to a struct are treated as -separate entities when borrowing. If the struct does not implement -[`Drop`](../special-types-and-traits.md#drop) and is stored in a local variable, -this also applies to moving out of each of its fields. This also does not apply -if automatic dereferencing is done though user defined types other than -[`Box`](../special-types-and-traits.html#boxt). +Finally, the fields of a struct or a reference to a struct are treated as separate entities when borrowing. +If the struct does not implement [`Drop`](../special-types-and-traits.md#drop) and is stored in a local variable, this also applies to moving out of each of its fields. +This also does not apply if automatic dereferencing is done though user defined types other than [`Box`](../special-types-and-traits.html#boxt). ```rust struct A { f1: String, f2: String, f3: String } diff --git a/src/doc/reference/src/expressions/grouped-expr.md b/src/doc/reference/src/expressions/grouped-expr.md index 8e57cdbb7b..096b36c823 100644 --- a/src/doc/reference/src/expressions/grouped-expr.md +++ b/src/doc/reference/src/expressions/grouped-expr.md @@ -4,9 +4,8 @@ > _GroupedExpression_ :\ >    `(` [_InnerAttribute_]\* [_Expression_] `)` -An expression enclosed in parentheses evaluates to the result of the enclosed -expression. Parentheses can be used to explicitly specify evaluation order -within an expression. +An expression enclosed in parentheses evaluates to the result of the enclosed expression. +Parentheses can be used to explicitly specify evaluation order within an expression. An example of a parenthesized expression: @@ -17,8 +16,7 @@ assert_eq!(x, 14); assert_eq!(y, 20); ``` -An example of a necessary use of parentheses is when calling a function pointer -that is a member of a struct: +An example of a necessary use of parentheses is when calling a function pointer that is a member of a struct: ```rust # struct A { @@ -37,9 +35,7 @@ assert_eq!((a.f)(), "The field f"); ## Group expression attributes -[Inner attributes] are allowed directly after the opening parenthesis of a -group expression in the same expression contexts as [attributes on block -expressions]. +[Inner attributes] are allowed directly after the opening parenthesis of a group expression in the same expression contexts as [attributes on block expressions]. [Inner attributes]: ../attributes.md [_Expression_]: ../expressions.md diff --git a/src/doc/reference/src/expressions/if-expr.md b/src/doc/reference/src/expressions/if-expr.md index 5d04bb5c70..c552635cc6 100644 --- a/src/doc/reference/src/expressions/if-expr.md +++ b/src/doc/reference/src/expressions/if-expr.md @@ -10,17 +10,14 @@ > | _IfExpression_ > | _IfLetExpression_ ) )\? -An `if` expression is a conditional branch in program control. The form of an -`if` expression is a condition expression, followed by a consequent block, any -number of `else if` conditions and blocks, and an optional trailing `else` -block. The condition expressions must have type `bool`. If a condition -expression evaluates to `true`, the consequent block is executed and any -subsequent `else if` or `else` block is skipped. If a condition expression -evaluates to `false`, the consequent block is skipped and any subsequent `else -if` condition is evaluated. If all `if` and `else if` conditions evaluate to -`false` then any `else` block is executed. An if expression evaluates to the -same value as the executed block, or `()` if no block is evaluated. An `if` -expression must have the same type in all situations. +An `if` expression is a conditional branch in program control. +The syntax of an `if` expression is a condition operand, followed by a consequent block, any number of `else if` conditions and blocks, and an optional trailing `else` block. +The condition operands must have the [boolean type]. +If a condition operand evaluates to `true`, the consequent block is executed and any subsequent `else if` or `else` block is skipped. +If a condition operand evaluates to `false`, the consequent block is skipped and any subsequent `else if` condition is evaluated. +If all `if` and `else if` conditions evaluate to `false` then any `else` block is executed. +An if expression evaluates to the same value as the executed block, or `()` if no block is evaluated. +An `if` expression must have the same type in all situations. ```rust # let x = 3; @@ -51,12 +48,10 @@ assert_eq!(y, "Bigger"); > | _IfExpression_ > | _IfLetExpression_ ) )\? -An `if let` expression is semantically similar to an `if` expression but in -place of a condition expression it expects the keyword `let` followed by a -pattern, an `=` and a [scrutinee] expression. If the value of the scrutinee -matches the pattern, the corresponding block will execute. Otherwise, flow -proceeds to the following `else` block if it exists. Like `if` expressions, -`if let` expressions have a value determined by the block that is evaluated. +An `if let` expression is semantically similar to an `if` expression but in place of a condition operand it expects the keyword `let` followed by a pattern, an `=` and a [scrutinee] operand. +If the value of the scrutinee matches the pattern, the corresponding block will execute. +Otherwise, flow proceeds to the following `else` block if it exists. +Like `if` expressions, `if let` expressions have a value determined by the block that is evaluated. ```rust let dish = ("Ham", "Eggs"); @@ -116,8 +111,7 @@ match EXPR { } ``` -Multiple patterns may be specified with the `|` operator. This has the same semantics -as with `|` in `match` expressions: +Multiple patterns may be specified with the `|` operator. This has the same semantics as with `|` in `match` expressions: ```rust enum E { @@ -132,10 +126,8 @@ if let E::X(n) | E::Y(n) = v { ``` The expression cannot be a [lazy boolean operator expression][_LazyBooleanOperatorExpression_]. -Use of a lazy boolean operator is ambiguous with a planned feature change -of the language (the implementation of if-let chains - see [eRFC 2947][_eRFCIfLetChain_]). -When lazy boolean operator expression is desired, this can be achieved -by using parenthesis as below: +Use of a lazy boolean operator is ambiguous with a planned feature change of the language (the implementation of if-let chains - see [eRFC 2947][_eRFCIfLetChain_]). +When lazy boolean operator expression is desired, this can be achieved by using parenthesis as below: ```rust,ignore @@ -158,4 +150,5 @@ if let PAT = ( EXPR || EXPR ) { .. } [_MatchArmPatterns_]: match-expr.md [_eRFCIfLetChain_]: https://github.com/rust-lang/rfcs/blob/master/text/2497-if-let-chains.md#rollout-plan-and-transitioning-to-rust-2018 [`match` expression]: match-expr.md +[boolean type]: ../types/boolean.md [scrutinee]: ../glossary.md#scrutinee diff --git a/src/doc/reference/src/expressions/literal-expr.md b/src/doc/reference/src/expressions/literal-expr.md index c64c6d6c2f..0e2d7c0a48 100644 --- a/src/doc/reference/src/expressions/literal-expr.md +++ b/src/doc/reference/src/expressions/literal-expr.md @@ -12,9 +12,8 @@ >    | [FLOAT_LITERAL]\ >    | [BOOLEAN_LITERAL] -A _literal expression_ consists of one of the [literal](../tokens.md#literals) -forms described earlier. It directly describes a number, character, string, -or boolean value. +A _literal expression_ consists of one of the [literal](../tokens.md#literals) forms described earlier. +It directly describes a number, character, string, or boolean value. ```rust "hello"; // string type diff --git a/src/doc/reference/src/expressions/loop-expr.md b/src/doc/reference/src/expressions/loop-expr.md index 9ddefa12f3..bb2a061bd9 100644 --- a/src/doc/reference/src/expressions/loop-expr.md +++ b/src/doc/reference/src/expressions/loop-expr.md @@ -20,11 +20,9 @@ Rust supports four loop expressions: * A [`loop` expression](#infinite-loops) denotes an infinite loop. * A [`while` expression](#predicate-loops) loops until a predicate is false. * A [`while let` expression](#predicate-pattern-loops) tests a pattern. -* A [`for` expression](#iterator-loops) extracts values from an iterator, - looping until the iterator is empty. +* A [`for` expression](#iterator-loops) extracts values from an iterator, looping until the iterator is empty. -All four types of loop support [`break` expressions](#break-expressions), -[`continue` expressions](#continue-expressions), and [labels](#loop-labels). +All four types of loop support [`break` expressions](#break-expressions), [`continue` expressions](#continue-expressions), and [labels](#loop-labels). Only `loop` supports [evaluation to non-trivial values](#break-and-loop-values). ## Infinite loops @@ -36,10 +34,8 @@ Only `loop` supports [evaluation to non-trivial values](#break-and-loop-values). A `loop` expression repeats execution of its body continuously: `loop { println!("I live."); }`. -A `loop` expression without an associated `break` expression is diverging and -has type [`!`](../types/never.md). A `loop` expression containing -associated [`break` expression(s)](#break-expressions) may terminate, and must -have type compatible with the value of the `break` expression(s). +A `loop` expression without an associated `break` expression is diverging and has type [`!`](../types/never.md). +A `loop` expression containing associated [`break` expression(s)](#break-expressions) may terminate, and must have type compatible with the value of the `break` expression(s). ## Predicate loops @@ -47,10 +43,9 @@ have type compatible with the value of the `break` expression(s). > _PredicateLoopExpression_ :\ >    `while` [_Expression_]_except struct expression_ [_BlockExpression_] -A `while` loop begins by evaluating the boolean loop conditional expression. If -the loop conditional expression evaluates to `true`, the loop body block -executes, then control returns to the loop conditional expression. If the loop -conditional expression evaluates to `false`, the `while` expression completes. +A `while` loop begins by evaluating the [boolean] loop conditional operand. +If the loop conditional operand evaluates to `true`, the loop body block executes, then control returns to the loop conditional operand. +If the loop conditional expression evaluates to `false`, the `while` expression completes. An example: @@ -70,12 +65,9 @@ while i < 10 { >    `while` `let` [_MatchArmPatterns_] `=` [_Expression_]_except struct or lazy boolean operator expression_ > [_BlockExpression_] -A `while let` loop is semantically similar to a `while` loop but in place of a -condition expression it expects the keyword `let` followed by a pattern, an -`=`, a [scrutinee] expression and a block expression. If the value of the -scrutinee matches the pattern, the loop body block executes then control -returns to the pattern matching statement. Otherwise, the while expression -completes. +A `while let` loop is semantically similar to a `while` loop but in place of a condition expression it expects the keyword `let` followed by a pattern, an `=`, a [scrutinee] expression and a block expression. +If the value of the scrutinee matches the pattern, the loop body block executes then control returns to the pattern matching statement. +Otherwise, the while expression completes. ```rust let mut x = vec![1, 2, 3]; @@ -90,8 +82,7 @@ while let _ = 5 { } ``` -A `while let` loop is equivalent to a `loop` expression containing a [`match` -expression] as follows. +A `while let` loop is equivalent to a `loop` expression containing a [`match` expression] as follows. ```rust,ignore @@ -112,8 +103,8 @@ is equivalent to } ``` -Multiple patterns may be specified with the `|` operator. This has the same semantics -as with `|` in `match` expressions: +Multiple patterns may be specified with the `|` operator. +This has the same semantics as with `|` in `match` expressions: ```rust let mut vals = vec![2, 3, 1, 2, 2]; @@ -132,11 +123,9 @@ As is the case in [`if let` expressions], the scrutinee cannot be a [lazy boolea >    `for` [_Pattern_] `in` [_Expression_]_except struct expression_ > [_BlockExpression_] -A `for` expression is a syntactic construct for looping over elements provided -by an implementation of `std::iter::IntoIterator`. If the iterator yields a -value, that value is matched against the irrefutable pattern, the body of the -loop is executed, and then control returns to the head of the `for` loop. If the -iterator is empty, the `for` expression completes. +A `for` expression is a syntactic construct for looping over elements provided by an implementation of `std::iter::IntoIterator`. +If the iterator yields a value, that value is matched against the irrefutable pattern, the body of the loop is executed, and then control returns to the head of the `for` loop. +If the iterator is empty, the `for` expression completes. An example of a `for` loop over the contents of an array: @@ -187,15 +176,11 @@ is equivalent to } ``` -`IntoIterator`, `Iterator`, and `Option` are always the standard library items -here, not whatever those names resolve to in the current scope. The variable -names `next`, `iter`, and `val` are for exposition only, they do not actually -have names the user can type. +`IntoIterator`, `Iterator`, and `Option` are always the standard library items here, not whatever those names resolve to in the current scope. +The variable names `next`, `iter`, and `val` are for exposition only, they do not actually have names the user can type. -> **Note**: that the outer `match` is used to ensure that any -> [temporary values] in `iter_expr` don't get dropped before the loop is -> finished. `next` is declared before being assigned because it results in -> types being inferred correctly more often. +> **Note**: that the outer `match` is used to ensure that any [temporary values] in `iter_expr` don't get dropped before the loop is finished. +> `next` is declared before being assigned because it results in types being inferred correctly more often. ## Loop labels @@ -203,13 +188,9 @@ have names the user can type. > _LoopLabel_ :\ >    [LIFETIME_OR_LABEL] `:` -A loop expression may optionally have a _label_. The label is written as -a lifetime preceding the loop expression, as in `'foo: loop { break 'foo; }`, -`'bar: while false {}`, `'humbug: for _ in 0..0 {}`. -If a label is present, then labeled `break` and `continue` expressions nested -within this loop may exit out of this loop or return control to its head. -See [break expressions](#break-expressions) and [continue -expressions](#continue-expressions). +A loop expression may optionally have a _label_. The label is written as a lifetime preceding the loop expression, as in `'foo: loop { break 'foo; }`, `'bar: while false {}`, `'humbug: for _ in 0..0 {}`. +If a label is present, then labeled `break` and `continue` expressions nested within this loop may exit out of this loop or return control to its head. +See [break expressions](#break-expressions) and [continue expressions](#continue-expressions). ## `break` expressions @@ -217,8 +198,7 @@ expressions](#continue-expressions). > _BreakExpression_ :\ >    `break` [LIFETIME_OR_LABEL]? [_Expression_]? -When `break` is encountered, execution of the associated loop body is -immediately terminated, for example: +When `break` is encountered, execution of the associated loop body is immediately terminated, for example: ```rust let mut last = 0; @@ -231,9 +211,9 @@ for x in 1..100 { assert_eq!(last, 12); ``` -A `break` expression is normally associated with the innermost `loop`, `for` or -`while` loop enclosing the `break` expression, but a [label](#loop-labels) can -be used to specify which enclosing loop is affected. Example: +A `break` expression is normally associated with the innermost `loop`, `for` or `while` loop enclosing the `break` expression, +but a [label](#loop-labels) can be used to specify which enclosing loop is affected. +Example: ```rust 'outer: loop { @@ -243,9 +223,7 @@ be used to specify which enclosing loop is affected. Example: } ``` -A `break` expression is only permitted in the body of a loop, and has one of -the forms `break`, `break 'label` or ([see below](#break-and-loop-values)) -`break EXPR` or `break 'label EXPR`. +A `break` expression is only permitted in the body of a loop, and has one of the forms `break`, `break 'label` or ([see below](#break-and-loop-values)) `break EXPR` or `break 'label EXPR`. ## `continue` expressions @@ -253,21 +231,17 @@ the forms `break`, `break 'label` or ([see below](#break-and-loop-values)) > _ContinueExpression_ :\ >    `continue` [LIFETIME_OR_LABEL]? -When `continue` is encountered, the current iteration of the associated loop -body is immediately terminated, returning control to the loop *head*. In -the case of a `while` loop, the head is the conditional expression controlling -the loop. In the case of a `for` loop, the head is the call-expression -controlling the loop. +When `continue` is encountered, the current iteration of the associated loop body is immediately terminated, returning control to the loop *head*. +In the case of a `while` loop, the head is the conditional expression controlling the loop. +In the case of a `for` loop, the head is the call-expression controlling the loop. -Like `break`, `continue` is normally associated with the innermost enclosing -loop, but `continue 'label` may be used to specify the loop affected. +Like `break`, `continue` is normally associated with the innermost enclosing loop, but `continue 'label` may be used to specify the loop affected. A `continue` expression is only permitted in the body of a loop. ## `break` and loop values -When associated with a `loop`, a break expression may be used to return a value -from that loop, via one of the forms `break EXPR` or `break 'label EXPR`, where -`EXPR` is an expression whose result is returned from the `loop`. For example: +When associated with a `loop`, a break expression may be used to return a value from that loop, via one of the forms `break EXPR` or `break 'label EXPR`, where `EXPR` is an expression whose result is returned from the `loop`. +For example: ```rust let (mut a, mut b) = (1, 1); @@ -283,10 +257,8 @@ let result = loop { assert_eq!(result, 13); ``` -In the case a `loop` has an associated `break`, it is not considered diverging, -and the `loop` must have a type compatible with each `break` expression. -`break` without an expression is considered identical to `break` with -expression `()`. +In the case a `loop` has an associated `break`, it is not considered diverging, and the `loop` must have a type compatible with each `break` expression. +`break` without an expression is considered identical to `break` with expression `()`. [LIFETIME_OR_LABEL]: ../tokens.md#lifetimes-and-loop-labels [_BlockExpression_]: block-expr.md @@ -294,6 +266,7 @@ expression `()`. [_MatchArmPatterns_]: match-expr.md [_Pattern_]: ../patterns.md [`match` expression]: match-expr.md +[boolean]: ../types/boolean.md [scrutinee]: ../glossary.md#scrutinee [temporary values]: ../expressions.md#temporaries [_LazyBooleanOperatorExpression_]: operator-expr.md#lazy-boolean-operators diff --git a/src/doc/reference/src/expressions/match-expr.md b/src/doc/reference/src/expressions/match-expr.md index 6d9f3f2afe..c6181f7fbc 100644 --- a/src/doc/reference/src/expressions/match-expr.md +++ b/src/doc/reference/src/expressions/match-expr.md @@ -23,26 +23,18 @@ > _MatchArmGuard_ :\ >    `if` [_Expression_] -A *`match` expression* branches on a pattern. The exact form of matching that -occurs depends on the [pattern]. A `match` -expression has a *[scrutinee] expression*, which is the value to compare to the -patterns. The scrutinee expression and the patterns must have the same type. - -A `match` behaves differently depending on whether or not the scrutinee -expression is a [place expression or value expression][place expression]. -If the scrutinee expression is a [value expression], it is first evaluated into -a temporary location, and the resulting value is sequentially compared to the -patterns in the arms until a match is found. The first arm with a matching -pattern is chosen as the branch target of the `match`, any variables bound by -the pattern are assigned to local variables in the arm's block, and control -enters the block. - -When the scrutinee expression is a [place expression], the match does not -allocate a temporary location; however, a by-value binding may copy or move -from the memory location. -When possible, it is preferable to match on place expressions, as the lifetime -of these matches inherits the lifetime of the place expression rather than being -restricted to the inside of the match. +A *`match` expression* branches on a pattern. +The exact form of matching that occurs depends on the [pattern]. +A `match` expression has a *[scrutinee] expression*, which is the value to compare to the patterns. +The scrutinee expression and the patterns must have the same type. + +A `match` behaves differently depending on whether or not the scrutinee expression is a [place expression or value expression][place expression]. +If the scrutinee expression is a [value expression], it is first evaluated into a temporary location, and the resulting value is sequentially compared to the patterns in the arms until a match is found. +The first arm with a matching pattern is chosen as the branch target of the `match`, any variables bound by the pattern are assigned to local variables in the arm's block, and control enters the block. + +When the scrutinee expression is a [place expression], the match does not allocate a temporary location; +however, a by-value binding may copy or move from the memory location. +When possible, it is preferable to match on place expressions, as the lifetime of these matches inherits the lifetime of the place expression rather than being restricted to the inside of the match. An example of a `match` expression: @@ -59,11 +51,11 @@ match x { } ``` -Variables bound within the pattern are scoped to the match guard and the arm's -expression. The [binding mode] (move, copy, or reference) depends on the pattern. +Variables bound within the pattern are scoped to the match guard and the arm's expression. +The [binding mode] (move, copy, or reference) depends on the pattern. -Multiple match patterns may be joined with the `|` operator. Each pattern will be -tested in left-to-right sequence until a successful match is found. +Multiple match patterns may be joined with the `|` operator. +Each pattern will be tested in left-to-right sequence until a successful match is found. ```rust let x = 9; @@ -84,23 +76,20 @@ match S(1, 2) { } ``` -> Note: The `2..=9` is a [Range Pattern], not a [Range Expression]. Thus, only -> those types of ranges supported by range patterns can be used in match arms. +> Note: The `2..=9` is a [Range Pattern], not a [Range Expression]. +> Thus, only those types of ranges supported by range patterns can be used in match arms. -Every binding in each `|` separated pattern must appear in all of the patterns -in the arm. Every binding of the same name must have the same type, and have -the same binding mode. +Every binding in each `|` separated pattern must appear in all of the patterns in the arm. +Every binding of the same name must have the same type, and have the same binding mode. ## Match guards -Match arms can accept _match guards_ to further refine the -criteria for matching a case. Pattern guards appear after the pattern and -consist of a `bool`-typed expression following the `if` keyword. +Match arms can accept _match guards_ to further refine the criteria for matching a case. +Pattern guards appear after the pattern and consist of a `bool`-typed expression following the `if` keyword. When the pattern matches successfully, the pattern guard expression is executed. If the expression evaluates to true, the pattern is successfully matched against. -Otherwise, the next pattern, including other matches with the `|` operator in -the same arm, is tested. +Otherwise, the next pattern, including other matches with the `|` operator in the same arm, is tested. ```rust # let maybe_digit = Some(0); @@ -113,8 +102,8 @@ let message = match maybe_digit { }; ``` -> Note: Multiple matches using the `|` operator can cause the pattern guard and -> the side effects it has to execute multiple times. For example: +> Note: Multiple matches using the `|` operator can cause the pattern guard and the side effects it has to execute multiple times. +> For example: > > ```rust > # use std::cell::Cell; @@ -127,23 +116,18 @@ let message = match maybe_digit { > ``` A pattern guard may refer to the variables bound within the pattern they follow. -Before evaluating the guard, a shared reference is taken to the part of the -scrutinee the variable matches on. While evaluating the guard, -this shared reference is then used when accessing the variable. -Only when the guard evaluates to true is the value moved, or copied, -from the scrutinee into the variable. This allows shared borrows to be used -inside guards without moving out of the scrutinee in case guard fails to match. -Moreover, by holding a shared reference while evaluating the guard, -mutation inside guards is also prevented. +Before evaluating the guard, a shared reference is taken to the part of the scrutinee the variable matches on. +While evaluating the guard, this shared reference is then used when accessing the variable. +Only when the guard evaluates to true is the value moved, or copied, from the scrutinee into the variable. +This allows shared borrows to be used inside guards without moving out of the scrutinee in case guard fails to match. +Moreover, by holding a shared reference while evaluating the guard, mutation inside guards is also prevented. ## Attributes on match arms -Outer attributes are allowed on match arms. The only attributes that have -meaning on match arms are [`cfg`], [`cold`], and the [lint check attributes]. +Outer attributes are allowed on match arms. +The only attributes that have meaning on match arms are [`cfg`], [`cold`], and the [lint check attributes]. -[Inner attributes] are allowed directly after the opening brace of the match -expression in the same expression contexts as [attributes on block -expressions]. +[Inner attributes] are allowed directly after the opening brace of the match expression in the same expression contexts as [attributes on block expressions]. [_Expression_]: ../expressions.md [place expression]: ../expressions.md#place-expressions-and-value-expressions diff --git a/src/doc/reference/src/expressions/method-call-expr.md b/src/doc/reference/src/expressions/method-call-expr.md index b6b139a52c..5e7caa5e47 100644 --- a/src/doc/reference/src/expressions/method-call-expr.md +++ b/src/doc/reference/src/expressions/method-call-expr.md @@ -4,12 +4,8 @@ > _MethodCallExpression_ :\ >    [_Expression_] `.` [_PathExprSegment_] `(`[_CallParams_]? `)` -A _method call_ consists of an expression (the *receiver*) followed by a single -dot, an expression path segment, and a parenthesized expression-list. Method calls are -resolved to associated [methods] on specific traits, either statically -dispatching to a method if the exact `self`-type of the left-hand-side is known, -or dynamically dispatching if the left-hand-side expression is an indirect -[trait object](../types/trait-object.md). +A _method call_ consists of an expression (the *receiver*) followed by a single dot, an expression path segment, and a parenthesized expression-list. +Method calls are resolved to associated [methods] on specific traits, either statically dispatching to a method if the exact `self`-type of the left-hand-side is known, or dynamically dispatching if the left-hand-side expression is an indirect [trait object](../types/trait-object.md). ```rust let pi: Result = "3.14".parse(); @@ -17,34 +13,25 @@ let log_pi = pi.unwrap_or(1.0).log(2.72); # assert!(1.14 < log_pi && log_pi < 1.15) ``` -When looking up a method call, the receiver may be automatically dereferenced or -borrowed in order to call a method. This requires a more complex lookup process -than for other functions, since there may be a number of possible methods to -call. The following procedure is used: +When looking up a method call, the receiver may be automatically dereferenced or borrowed in order to call a method. +This requires a more complex lookup process than for other functions, since there may be a number of possible methods to call. +The following procedure is used: -The first step is to build a list of candidate receiver types. Obtain -these by repeatedly [dereferencing][dereference] the receiver expression's type, -adding each type encountered to the list, then finally attempting an [unsized -coercion] at the end, and adding the result type if that is successful. Then, -for each candidate `T`, add `&T` and `&mut T` to the list immediately after `T`. +The first step is to build a list of candidate receiver types. +Obtain these by repeatedly [dereferencing][dereference] the receiver expression's type, adding each type encountered to the list, then finally attempting an [unsized coercion] at the end, and adding the result type if that is successful. +Then, for each candidate `T`, add `&T` and `&mut T` to the list immediately after `T`. -For instance, if the receiver has type `Box<[i32;2]>`, then the candidate types -will be `Box<[i32;2]>`, `&Box<[i32;2]>`, `&mut Box<[i32;2]>`, `[i32; 2]` (by -dereferencing), `&[i32; 2]`, `&mut [i32; 2]`, `[i32]` (by unsized coercion), -`&[i32]`, and finally `&mut [i32]`. +For instance, if the receiver has type `Box<[i32;2]>`, then the candidate types will be `Box<[i32;2]>`, `&Box<[i32;2]>`, `&mut Box<[i32;2]>`, `[i32; 2]` (by dereferencing), `&[i32; 2]`, `&mut [i32; 2]`, `[i32]` (by unsized coercion), `&[i32]`, and finally `&mut [i32]`. -Then, for each candidate type `T`, search for a [visible] method with -a receiver of that type in the following places: +Then, for each candidate type `T`, search for a [visible] method with a receiver of that type in the following places: 1. `T`'s inherent methods (methods implemented directly on `T`). -1. Any of the methods provided by a [visible] trait implemented by `T`. If `T` - is a type parameter, methods provided by trait bounds on `T` are looked up - first. Then all remaining methods in scope are looked up. - -> Note: the lookup is done for each type in order, which can occasionally lead -> to surprising results. The below code will print "In trait impl!", because -> `&self` methods are looked up first, the trait method is found before the -> struct's `&mut self` method is found. +1. Any of the methods provided by a [visible] trait implemented by `T`. + If `T` is a type parameter, methods provided by trait bounds on `T` are looked up first. + Then all remaining methods in scope are looked up. + +> Note: the lookup is done for each type in order, which can occasionally lead to surprising results. +> The below code will print "In trait impl!", because `&self` methods are looked up first, the trait method is found before the struct's `&mut self` method is found. > > ```rust > struct Foo {} @@ -71,29 +58,20 @@ a receiver of that type in the following places: > } > ``` -If this results in multiple possible candidates, then it is an error, and the -receiver must be [converted][disambiguate call] to an appropriate receiver type -to make the method call. +If this results in multiple possible candidates, then it is an error, and the receiver must be [converted][disambiguate call] to an appropriate receiver type to make the method call. -This process does not take into account the mutability or lifetime of the -receiver, or whether a method is `unsafe`. Once a method is looked up, if it -can't be called for one (or more) of those reasons, the result is a compiler -error. +This process does not take into account the mutability or lifetime of the receiver, or whether a method is `unsafe`. +Once a method is looked up, if it can't be called for one (or more) of those reasons, the result is a compiler error. -If a step is reached where there is more than one possible method, such as where -generic methods or traits are considered the same, then it is a compiler -error. These cases require a [disambiguating function call syntax] for method -and function invocation. +If a step is reached where there is more than one possible method, such as where generic methods or traits are considered the same, then it is a compiler error. +These cases require a [disambiguating function call syntax] for method and function invocation.

-***Warning:*** For [trait objects], if there is an inherent method of the same -name as a trait method, it will give a compiler error when trying to call the -method in a method call expression. Instead, you can call the method using -[disambiguating function call syntax], in which case it calls the trait -method, not the inherent method. There is no way to call the inherent method. -Just don't define inherent methods on trait objects with the same name a trait -method and you'll be fine. +***Warning:*** For [trait objects], if there is an inherent method of the same name as a trait method, it will give a compiler error when trying to call the method in a method call expression. +Instead, you can call the method using [disambiguating function call syntax], in which case it calls the trait method, not the inherent method. +There is no way to call the inherent method. +Just don't define inherent methods on trait objects with the same name a trait method and you'll be fine.
diff --git a/src/doc/reference/src/expressions/operator-expr.md b/src/doc/reference/src/expressions/operator-expr.md index acc6da26be..73284bb782 100644 --- a/src/doc/reference/src/expressions/operator-expr.md +++ b/src/doc/reference/src/expressions/operator-expr.md @@ -13,24 +13,19 @@ >    | [_AssignmentExpression_]\ >    | [_CompoundAssignmentExpression_] -Operators are defined for built in types by the Rust language. Many of the -following operators can also be overloaded using traits in `std::ops` or -`std::cmp`. +Operators are defined for built in types by the Rust language. +Many of the following operators can also be overloaded using traits in `std::ops` or `std::cmp`. ## Overflow Integer operators will panic when they overflow when compiled in debug mode. -The `-C debug-assertions` and `-C overflow-checks` compiler flags can be used -to control this more directly. The following things are considered to be -overflow: - -* When `+`, `*` or `-` create a value greater than the maximum value, or less - than the minimum value that can be stored. This includes unary `-` on the - smallest value of any signed integer type. -* Using `/` or `%`, where the left-hand argument is the smallest integer of a - signed integer type and the right-hand argument is `-1`. -* Using `<<` or `>>` where the right-hand argument is greater than or equal to - the number of bits in the type of the left-hand argument, or is negative. +The `-C debug-assertions` and `-C overflow-checks` compiler flags can be used to control this more directly. +The following things are considered to be overflow: + +* When `+`, `*` or `-` create a value greater than the maximum value, or less than the minimum value that can be stored. + This includes unary `-` on the smallest value of any signed integer type. +* Using `/` or `%`, where the left-hand argument is the smallest integer of a signed integer type and the right-hand argument is `-1`. +* Using `<<` or `>>` where the right-hand argument is greater than or equal to the number of bits in the type of the left-hand argument, or is negative. ## Borrow operators @@ -39,15 +34,13 @@ overflow: >       (`&`|`&&`) [_Expression_]\ >    | (`&`|`&&`) `mut` [_Expression_] -The `&` (shared borrow) and `&mut` (mutable borrow) operators are unary prefix -operators. When applied to a [place expression], this expressions produces a -reference (pointer) to the location that the value refers to. The memory -location is also placed into a borrowed state for the duration of the reference. -For a shared borrow (`&`), this implies that the place may not be mutated, but -it may be read or shared again. For a mutable borrow (`&mut`), the place may not -be accessed in any way until the borrow expires. `&mut` evaluates its operand in -a mutable place expression context. If the `&` or `&mut` operators are applied -to a [value expression], then a [temporary value] is created. +The `&` (shared borrow) and `&mut` (mutable borrow) operators are unary prefix operators. +When applied to a [place expression], this expressions produces a reference (pointer) to the location that the value refers to. +The memory location is also placed into a borrowed state for the duration of the reference. +For a shared borrow (`&`), this implies that the place may not be mutated, but it may be read or shared again. +For a mutable borrow (`&mut`), the place may not be accessed in any way until the borrow expires. +`&mut` evaluates its operand in a mutable place expression context. +If the `&` or `&mut` operators are applied to a [value expression], then a [temporary value] is created. These operators cannot be overloaded. @@ -64,8 +57,7 @@ let mut array = [-2, 3, 9]; } ``` -Even though `&&` is a single token ([the lazy 'and' operator](#lazy-boolean-operators)), -when used in the context of borrow expressions it works as two borrows: +Even though `&&` is a single token ([the lazy 'and' operator](#lazy-boolean-operators)), when used in the context of borrow expressions it works as two borrows: ```rust // same meanings: @@ -84,16 +76,12 @@ let a = & & & & mut 10; > _DereferenceExpression_ :\ >    `*` [_Expression_] -The `*` (dereference) operator is also a unary prefix operator. When applied to -a [pointer](../types/pointer.md) it denotes the pointed-to location. If -the expression is of type `&mut T` or `*mut T`, and is either a local -variable, a (nested) field of a local variable or is a mutable [place -expression], then the resulting memory location can be assigned to. +The `*` (dereference) operator is also a unary prefix operator. +When applied to a [pointer](../types/pointer.md) it denotes the pointed-to location. +If the expression is of type `&mut T` or `*mut T`, and is either a local variable, a (nested) field of a local variable or is a mutable [place expression], then the resulting memory location can be assigned to. Dereferencing a raw pointer requires `unsafe`. -On non-pointer types `*x` is equivalent to `*std::ops::Deref::deref(&x)` in an -[immutable place expression context](../expressions.md#mutability) and -`*std::ops::DerefMut::deref_mut(&mut x)` in a mutable place expression context. +On non-pointer types `*x` is equivalent to `*std::ops::Deref::deref(&x)` in an [immutable place expression context](../expressions.md#mutability) and `*std::ops::DerefMut::deref_mut(&mut x)` in a mutable place expression context. ```rust let x = &7; @@ -109,14 +97,12 @@ assert_eq!(*y, 11); > _ErrorPropagationExpression_ :\ >    [_Expression_] `?` -The question mark operator (`?`) unwraps valid values or returns erroneous -values, propagating them to the calling function. It is a unary postfix -operator that can only be applied to the types `Result` and `Option`. +The question mark operator (`?`) unwraps valid values or returns erroneous values, propagating them to the calling function. +It is a unary postfix operator that can only be applied to the types `Result` and `Option`. -When applied to values of the `Result` type, it propagates errors. If -the value is `Err(e)`, then it will return `Err(From::from(e))` from the -enclosing function or closure. If applied to `Ok(x)`, then it will unwrap the -value to evaluate to `x`. +When applied to values of the `Result` type, it propagates errors. +If the value is `Err(e)`, then it will return `Err(From::from(e))` from the enclosing function or closure. +If applied to `Ok(x)`, then it will unwrap the value to evaluate to `x`. ```rust # use std::num::ParseIntError; @@ -131,9 +117,9 @@ println!("{:?}", res); # assert!(res.is_err()) ``` -When applied to values of the `Option` type, it propagates `None`s. If the -value is `None`, then it will return `None`. If applied to `Some(x)`, then it -will unwrap the value to evaluate to `x`. +When applied to values of the `Option` type, it propagates `None`s. +If the value is `None`, then it will return `None`. +If applied to `Some(x)`, then it will unwrap the value to evaluate to `x`. ```rust fn try_option_some() -> Option { @@ -158,16 +144,15 @@ assert_eq!(try_option_none(), None); >       `-` [_Expression_]\ >    | `!` [_Expression_] -These are the last two unary operators. This table summarizes the behavior of -them on primitive types and which traits are used to overload these operators -for other types. Remember that signed integers are always represented using -two's complement. The operands of all of these operators are evaluated in -[value expression context][value expression] so are moved or copied. +These are the last two unary operators. +This table summarizes the behavior of them on primitive types and which traits are used to overload these operators for other types. +Remember that signed integers are always represented using two's complement. +The operands of all of these operators are evaluated in [value expression context][value expression] so are moved or copied. -| Symbol | Integer | `bool` | Floating Point | Overloading Trait | -|--------|-------------|-------------|----------------|--------------------| -| `-` | Negation* | | Negation | `std::ops::Neg` | -| `!` | Bitwise NOT | Logical NOT | | `std::ops::Not` | +| Symbol | Integer | `bool` | Floating Point | Overloading Trait | +|--------|-------------|-------------- |----------------|--------------------| +| `-` | Negation* | | Negation | `std::ops::Neg` | +| `!` | Bitwise NOT | [Logical NOT] | | `std::ops::Not` | \* Only for signed integer types. @@ -195,25 +180,23 @@ assert_eq!(true, !false); >    | [_Expression_] `<<` [_Expression_]\ >    | [_Expression_] `>>` [_Expression_] -Binary operators expressions are all written with infix notation. This table -summarizes the behavior of arithmetic and logical binary operators on -primitive types and which traits are used to overload these operators for other -types. Remember that signed integers are always represented using two's -complement. The operands of all of these operators are evaluated in [value -expression context][value expression] so are moved or copied. - -| Symbol | Integer | `bool` | Floating Point | Overloading Trait | Overloading Compound Assignment Trait | -|--------|-------------------------|-------------|----------------|--------------------| ------------------------------------- | -| `+` | Addition | | Addition | `std::ops::Add` | `std::ops::AddAssign` | -| `-` | Subtraction | | Subtraction | `std::ops::Sub` | `std::ops::SubAssign` | -| `*` | Multiplication | | Multiplication | `std::ops::Mul` | `std::ops::MulAssign` | -| `/` | Division* | | Division | `std::ops::Div` | `std::ops::DivAssign` | -| `%` | Remainder | | Remainder | `std::ops::Rem` | `std::ops::RemAssign` | -| `&` | Bitwise AND | Logical AND | | `std::ops::BitAnd` | `std::ops::BitAndAssign` | -| | | Bitwise OR | Logical OR | | `std::ops::BitOr` | `std::ops::BitOrAssign` | -| `^` | Bitwise XOR | Logical XOR | | `std::ops::BitXor` | `std::ops::BitXorAssign` | -| `<<` | Left Shift | | | `std::ops::Shl` | `std::ops::ShlAssign` | -| `>>` | Right Shift** | | | `std::ops::Shr` | `std::ops::ShrAssign` | +Binary operators expressions are all written with infix notation. +This table summarizes the behavior of arithmetic and logical binary operators on primitive types and which traits are used to overload these operators for other types. +Remember that signed integers are always represented using two's complement. +The operands of all of these operators are evaluated in [value expression context][value expression] so are moved or copied. + +| Symbol | Integer | `bool` | Floating Point | Overloading Trait | Overloading Compound Assignment Trait | +|--------|-------------------------|---------------|----------------|--------------------| ------------------------------------- | +| `+` | Addition | | Addition | `std::ops::Add` | `std::ops::AddAssign` | +| `-` | Subtraction | | Subtraction | `std::ops::Sub` | `std::ops::SubAssign` | +| `*` | Multiplication | | Multiplication | `std::ops::Mul` | `std::ops::MulAssign` | +| `/` | Division* | | Division | `std::ops::Div` | `std::ops::DivAssign` | +| `%` | Remainder | | Remainder | `std::ops::Rem` | `std::ops::RemAssign` | +| `&` | Bitwise AND | [Logical AND] | | `std::ops::BitAnd` | `std::ops::BitAndAssign` | +| | | Bitwise OR | [Logical OR] | | `std::ops::BitOr` | `std::ops::BitOrAssign` | +| `^` | Bitwise XOR | [Logical XOR] | | `std::ops::BitXor` | `std::ops::BitXorAssign` | +| `<<` | Left Shift | | | `std::ops::Shl` | `std::ops::ShlAssign` | +| `>>` | Right Shift** | | | `std::ops::Shr` | `std::ops::ShrAssign` | \* Integer division rounds towards zero. @@ -246,18 +229,12 @@ assert_eq!(-10 >> 2, -3); >    | [_Expression_] `>=` [_Expression_]\ >    | [_Expression_] `<=` [_Expression_] -Comparison operators are also defined both for primitive types and many types -in the standard library. Parentheses are required when chaining comparison -operators. For example, the expression `a == b == c` is invalid and may be -written as `(a == b) == c`. +Comparison operators are also defined both for primitive types and many types in the standard library. +Parentheses are required when chaining comparison operators. For example, the expression `a == b == c` is invalid and may be written as `(a == b) == c`. -Unlike arithmetic and logical operators, the traits for overloading these -operators are used more generally to show how a type may be compared and will -likely be assumed to define actual comparisons by functions that use these -traits as bounds. Many functions and macros in the standard library can then -use that assumption (although not to ensure safety). Unlike the arithmetic -and logical operators above, these operators implicitly take shared borrows -of their operands, evaluating them in [place expression context][place expression]: +Unlike arithmetic and logical operators, the traits for overloading these operators are used more generally to show how a type may be compared and will likely be assumed to define actual comparisons by functions that use these traits as bounds. +Many functions and macros in the standard library can then use that assumption (although not to ensure safety). +Unlike the arithmetic and logical operators above, these operators implicitly take shared borrows of their operands, evaluating them in [place expression context][place expression]: ```rust # let a = 1; @@ -296,13 +273,10 @@ assert!("World" >= "Hello"); >       [_Expression_] `||` [_Expression_]\ >    | [_Expression_] `&&` [_Expression_] -The operators `||` and `&&` may be applied to operands of boolean type. The -`||` operator denotes logical 'or', and the `&&` operator denotes logical -'and'. They differ from `|` and `&` in that the right-hand operand is only -evaluated when the left-hand operand does not already determine the result of -the expression. That is, `||` only evaluates its right-hand operand when the -left-hand operand evaluates to `false`, and `&&` only when it evaluates to -`true`. +The operators `||` and `&&` may be applied to operands of boolean type. +The `||` operator denotes logical 'or', and the `&&` operator denotes logical 'and'. +They differ from `|` and `&` in that the right-hand operand is only evaluated when the left-hand operand does not already determine the result of the expression. +That is, `||` only evaluates its right-hand operand when the left-hand operand evaluates to `false`, and `&&` only when it evaluates to `true`. ```rust let x = false || true; // true @@ -317,8 +291,7 @@ let y = false && panic!(); // false, doesn't evaluate `panic!()` A type cast expression is denoted with the binary operator `as`. -Executing an `as` expression casts the value on the left-hand side to the type -on the right-hand side. +Executing an `as` expression casts the value on the left-hand side to the type on the right-hand side. An example of an `as` expression: @@ -332,9 +305,8 @@ fn average(values: &[f64]) -> f64 { } ``` -`as` can be used to explicitly perform [coercions](../type-coercions.md), as -well as the following additional casts. Here `*T` means either `*const T` or -`*mut T`. +`as` can be used to explicitly perform [coercions](../type-coercions.md), as well as the following additional casts. +Here `*T` means either `*const T` or `*mut T`. | Type of `e` | `U` | Cast performed by `e as U` | |-----------------------|-----------------------|----------------------------------| @@ -343,7 +315,7 @@ well as the following additional casts. Here `*T` means either `*const T` or | `bool` or `char` | Integer type | Primitive to integer cast | | `u8` | `char` | `u8` to `char` cast | | `*T` | `*V` where `V: Sized` \* | Pointer to pointer cast | -| `*T` where `T: Sized` | Numeric type | Pointer to address cast | +| `*T` where `T: Sized` | Integer type | Pointer to address cast | | Integer type | `*V` where `V: Sized` | Address to pointer cast | | `&[T; n]` | `*const T` | Array to pointer cast | | [Function item] | [Function pointer] | Function item to function pointer cast | @@ -353,8 +325,7 @@ well as the following additional casts. Here `*T` means either `*const T` or | [Function pointer] | Integer | Function pointer to address cast | | Closure \*\* | Function pointer | Closure to function pointer cast | -\* or `T` and `V` are compatible unsized types, e.g., both slices, both the -same trait object. +\* or `T` and `V` are compatible unsized types, e.g., both slices, both the same trait object. \*\* only for closures that do not capture (close over) any local variables @@ -410,25 +381,18 @@ halfway between two floating point numbers. An *assignment expression* moves a value into a specified place. -An assignment expression consists of a [mutable] [place expression], the -*assigned place operand*, followed by an equals sign (`=`) and a [value -expression], the *assigned value operand*. +An assignment expression consists of a [mutable] [place expression], the *assigned place operand*, followed by an equals sign (`=`) and a [value expression], the *assigned value operand*. -Unlike other place operands, the assigned place operand must be a place -expression. Attempting to use a value expression is a compiler error rather -than promoting it to a temporary. +Unlike other place operands, the assigned place operand must be a place expression. +Attempting to use a value expression is a compiler error rather than promoting it to a temporary. -Evaluating assignment expressions begins by evaluating its operands. The -assigned value operand is evaluated first, followed by the assigned place -operand. +Evaluating assignment expressions begins by evaluating its operands. +The assigned value operand is evaluated first, followed by the assigned place operand. -> **Note**: This is different than other expressions in that the right operand -> is evaluated before the left one. +> **Note**: This is different than other expressions in that the right operand is evaluated before the left one. -It then has the effect of first [dropping] the value at the assigned place, -unless the place is an uninitialized local variable or an uninitialized field of -a local variable. Next it either [copies or moves] the assigned value to the -assigned place. +It then has the effect of first [dropping] the value at the assigned place, unless the place is an uninitialized local variable or an uninitialized field of a local variable. +Next it either [copies or moves] the assigned value to the assigned place. An assignment expression always produces [the unit value][unit]. @@ -455,8 +419,7 @@ x = y; >    | [_Expression_] `<<=` [_Expression_]\ >    | [_Expression_] `>>=` [_Expression_] -*Compound assignment expressions* combine arithmetic and logical binary -operators with assignment expressions. +*Compound assignment expressions* combine arithmetic and logical binary operators with assignment expressions. For example: @@ -466,28 +429,20 @@ x += 1; assert!(x == 6); ``` -The syntax of compound assignment is a [mutable] [place expression], the -*assigned operand*, then one of the operators followed by an `=` as a single -token (no whitespace), and then a [value expression], the *modifying operand*. +The syntax of compound assignment is a [mutable] [place expression], the *assigned operand*, then one of the operators followed by an `=` as a single token (no whitespace), and then a [value expression], the *modifying operand*. -Unlike other place operands, the assigned place operand must be a place -expression. Attempting to use a value expression is a compiler error rather -than promoting it to a temporary. +Unlike other place operands, the assigned place operand must be a place expression. +Attempting to use a value expression is a compiler error rather than promoting it to a temporary. -Evaluation of compound assignment expressions depends on the types of the -operators. +Evaluation of compound assignment expressions depends on the types of the operators. -If both types are primitives, then the modifying operand will be evaluated -first followed by the assigned operand. It will then set the value of the -assigned operand's place to the value of performing the operation of the -operator with the values of the assigned operand and modifying operand. +If both types are primitives, then the modifying operand will be evaluated first followed by the assigned operand. +It will then set the value of the assigned operand's place to the value of performing the operation of the operator with the values of the assigned operand and modifying operand. -> **Note**: This is different than other expressions in that the right operand -> is evaluated before the left one. +> **Note**: This is different than other expressions in that the right operand is evaluated before the left one. -Otherwise, this expression is syntactic sugar for calling the function of the -overloading compound assigment trait of the operator (see the table earlier in -this chapter). A mutable borrow of the assigned operand is automatically taken. +Otherwise, this expression is syntactic sugar for calling the function of the overloading compound assigment trait of the operator (see the table earlier in this chapter). +A mutable borrow of the assigned operand is automatically taken. For example, the following expression statements in `example` are equivalent: @@ -511,17 +466,19 @@ fn example() {
-Warning: The evaluation order of operands swaps depending on the types of the -operands: with primitive types the right-hand side will get evaluated first, -while with non-primitive types the left-hand side will get evaluated first. -Try not to write code that depends on the evaluation order of operands in -compound assignment expressions. See [this test] for an example of using this -dependency. +Warning: The evaluation order of operands swaps depending on the types of the operands: +with primitive types the right-hand side will get evaluated first, while with non-primitive types the left-hand side will get evaluated first. +Try not to write code that depends on the evaluation order of operands in compound assignment expressions. +See [this test] for an example of using this dependency.
[copies or moves]: ../expressions.md#moved-and-copied-types [dropping]: ../destructors.md +[logical and]: ../types/boolean.md#logical-and +[logical not]: ../types/boolean.md#logical-not +[logical or]: ../types/boolean.md#logical-or +[logical xor]: ../types/boolean.md#logical-xor [mutable]: ../expressions.md#mutability [place expression]: ../expressions.md#place-expressions-and-value-expressions [unit]: ../types/tuple.md diff --git a/src/doc/reference/src/expressions/path-expr.md b/src/doc/reference/src/expressions/path-expr.md index 84278da961..0909c5ddb7 100644 --- a/src/doc/reference/src/expressions/path-expr.md +++ b/src/doc/reference/src/expressions/path-expr.md @@ -5,10 +5,9 @@ >       [_PathInExpression_]\ >    | [_QualifiedPathInExpression_] -A [path] used as an expression context denotes either a local -variable or an item. Path expressions that resolve to local or static variables -are [place expressions], other paths are [value expressions]. Using a -[`static mut`] variable requires an [`unsafe` block]. +A [path] used as an expression context denotes either a local variable or an item. +Path expressions that resolve to local or static variables are [place expressions], other paths are [value expressions]. +Using a [`static mut`] variable requires an [`unsafe` block]. ```rust # mod globals { diff --git a/src/doc/reference/src/expressions/range-expr.md b/src/doc/reference/src/expressions/range-expr.md index f46c45dce1..37409a4cf4 100644 --- a/src/doc/reference/src/expressions/range-expr.md +++ b/src/doc/reference/src/expressions/range-expr.md @@ -27,9 +27,7 @@ > _RangeToInclusiveExpr_ :\ >    `..=` [_Expression_] -The `..` and `..=` operators will construct an object of one of the -`std::ops::Range` (or `core::ops::Range`) variants, according to the following -table: +The `..` and `..=` operators will construct an object of one of the `std::ops::Range` (or `core::ops::Range`) variants, according to the following table: | Production | Syntax | Type | Range | |------------------------|---------------|------------------------------|-----------------------| diff --git a/src/doc/reference/src/expressions/return-expr.md b/src/doc/reference/src/expressions/return-expr.md index 1146b6e4fe..b1b3787d8c 100644 --- a/src/doc/reference/src/expressions/return-expr.md +++ b/src/doc/reference/src/expressions/return-expr.md @@ -4,10 +4,8 @@ > _ReturnExpression_ :\ >    `return` [_Expression_]? -Return expressions are denoted with the keyword `return`. Evaluating a `return` -expression moves its argument into the designated output location for the -current function call, destroys the current function activation frame, and -transfers control to the caller frame. +Return expressions are denoted with the keyword `return`. +Evaluating a `return` expression moves its argument into the designated output location for the current function call, destroys the current function activation frame, and transfers control to the caller frame. An example of a `return` expression: diff --git a/src/doc/reference/src/expressions/struct-expr.md b/src/doc/reference/src/expressions/struct-expr.md index a56d0c7de2..ad9fb76f8e 100644 --- a/src/doc/reference/src/expressions/struct-expr.md +++ b/src/doc/reference/src/expressions/struct-expr.md @@ -27,9 +27,9 @@ > > _StructExprUnit_ : [_PathInExpression_] -A _struct expression_ creates a struct or union value. It consists of a path to a [struct] -or [union] item followed by the values for the fields of the item. There are three forms -of struct expressions: struct, tuple, and unit. +A *struct expression* creates a struct, enum, or union value. +It consists of a path to a [struct], [enum variant], or [union] item followed by the values for the fields of the item. +There are three forms of struct expressions: struct, tuple, and unit. The following are examples of struct expressions: @@ -49,23 +49,18 @@ some_fn::(Cookie); ## Field struct expression -A struct expression with fields enclosed in curly braces allows you to specify the value -for each individual field in any order. The field name is separated from its value with a -colon. +A struct expression with fields enclosed in curly braces allows you to specify the value for each individual field in any order. +The field name is separated from its value with a colon. -A value of a [union] type can also be created using this syntax, except that it must -specify exactly one field. +A value of a [union] type can only be created using this syntax, and it must specify exactly one field. ## Functional update syntax -A struct expression can terminate with the syntax `..` followed by an -expression to denote a functional update. The expression following `..` (the -base) must have the same struct type as the new struct type being formed. +A struct expression that constructs a value of a struct type can terminate with the syntax `..` followed by an expression to denote a functional update. +The expression following `..` (the base) must have the same struct type as the new struct type being formed. -The entire expression uses the given values for the fields that were specified -and moves or copies the remaining fields from the base expression. As with all -struct expressions, all of the fields of the struct must be [visible], even -those not explicitly named. +The entire expression uses the given values for the fields that were specified and moves or copies the remaining fields from the base expression. +As with all struct expressions, all of the fields of the struct must be [visible], even those not explicitly named. ```rust # struct Point3d { x: i32, y: i32, z: i32 } @@ -75,14 +70,11 @@ Point3d {y: 0, z: 10, .. base}; // OK, only base.x is accessed drop(y_ref); ``` -Struct expressions with curly braces can't be used directly in a [loop] or [if] -expression's head, or in the [scrutinee] of an [if let] or [match] expression. -However, struct expressions can be in used in these situations if they are -within another expression, for example inside [parentheses]. +Struct expressions with curly braces can't be used directly in a [loop] or [if] expression's head, or in the [scrutinee] of an [if let] or [match] expression. +However, struct expressions can be in used in these situations if they are within another expression, for example inside [parentheses]. -The field names can be decimal integer values to specify indices for constructing tuple -structs. This can be used with base structs to fill out the remaining indices not -specified: +The field names can be decimal integer values to specify indices for constructing tuple structs. +This can be used with base structs to fill out the remaining indices not specified: ```rust struct Color(u8, u8, u8); @@ -93,9 +85,8 @@ let c3 = Color{1: 0, ..c2}; // Fill out all other fields using a base struct. ### Struct field init shorthand -When initializing a data structure (struct, enum, union) with named (but not -numbered) fields, it is allowed to write `fieldname` as a shorthand for -`fieldname: fieldname`. This allows a compact syntax with less duplication. +When initializing a data structure (struct, enum, union) with named (but not numbered) fields, it is allowed to write `fieldname` as a shorthand for `fieldname: fieldname`. +This allows a compact syntax with less duplication. For example: ```rust @@ -109,9 +100,8 @@ Point3d { x, y: y_value, z }; ## Tuple struct expression -A struct expression with fields enclosed in parentheses constructs a tuple struct. Though -it is listed here as a specific expression for completeness, it is equivalent to a [call -expression] to the tuple struct's constructor. For example: +A struct expression with fields enclosed in parentheses constructs a tuple struct. +Though it is listed here as a specific expression for completeness, it is equivalent to a [call expression] to the tuple struct's constructor. For example: ```rust struct Position(i32, i32, i32); @@ -122,9 +112,9 @@ let pos = c(8, 6, 7); // Creates a `Position` value. ## Unit struct expression -A unit struct expression is just the path to a unit struct item. This refers to the unit -struct's implicit constant of its value. The unit struct value can also be constructed -with a fieldless struct expression. For example: +A unit struct expression is just the path to a unit struct item. +This refers to the unit struct's implicit constant of its value. +The unit struct value can also be constructed with a fieldless struct expression. For example: ```rust struct Gamma; @@ -134,9 +124,7 @@ let b = Gamma{}; // Exact same value as `a`. ## Struct expression attributes -[Inner attributes] are allowed directly after the opening brace or parenthesis -of a struct expression in the same expression contexts as [attributes on block -expressions]. +[Inner attributes] are allowed directly after the opening brace or parenthesis of a struct expression in the same expression contexts as [attributes on block expressions]. [IDENTIFIER]: ../identifiers.md [Inner attributes]: ../attributes.md @@ -146,6 +134,7 @@ expressions]. [_PathInExpression_]: ../paths.md#paths-in-expressions [attributes on block expressions]: block-expr.md#attributes-on-block-expressions [call expression]: call-expr.md +[enum variant]: ../items/enumerations.md [if let]: if-expr.md#if-let-expressions [if]: if-expr.md#if-expressions [loop]: loop-expr.md diff --git a/src/doc/reference/src/expressions/tuple-expr.md b/src/doc/reference/src/expressions/tuple-expr.md index cd1deb3307..ef05761138 100644 --- a/src/doc/reference/src/expressions/tuple-expr.md +++ b/src/doc/reference/src/expressions/tuple-expr.md @@ -9,19 +9,14 @@ > _TupleElements_ :\ >    ( [_Expression_] `,` )+ [_Expression_]? -Tuple expressions evaluate into [tuple values][tuple type] with the operands -initializing the elements of the tuple. +Tuple expressions evaluate into [tuple values][tuple type] with the operands initializing the elements of the tuple. -Tuple expressions are written by listing the [operands] in a parenthesized, -comma-separated list. 1-ary tuple expressions require a comma after their -operand to be disambiguated with a [parenthetical expression]. +Tuple expressions are written by listing the [operands] in a parenthesized, comma-separated list. 1-ary tuple expressions require a comma after their operand to be disambiguated with a [parenthetical expression]. -The number of operands is the arity of the constructed tuple. Tuple expressions -without operands produce the unit tuple. For other tuple expressions, the first -written operand initializes the 0th element and subsequent operands initializes -the next highest element. For example, in the tuple expression -`('a', 'b', 'c')`, `'a'` initializes the value of the 0th element, `'b'` the -1st, and `'c'` the 2nd. +The number of operands is the arity of the constructed tuple. +Tuple expressions without operands produce the unit tuple. +For other tuple expressions, the first written operand initializes the 0th element and subsequent operands initializes the next highest element. +For example, in the tuple expression `('a', 'b', 'c')`, `'a'` initializes the value of the 0th element, `'b'` the 1st, and `'c'` the 2nd. Examples of tuple expressions: @@ -34,9 +29,7 @@ Examples of tuple expressions: ### Tuple expression attributes -[Inner attributes] are allowed directly after the opening parenthesis of a -tuple expression in the same expression contexts as [attributes on block -expressions]. +[Inner attributes] are allowed directly after the opening parenthesis of a tuple expression in the same expression contexts as [attributes on block expressions]. ## Tuple indexing expressions @@ -44,14 +37,12 @@ expressions]. > _TupleIndexingExpression_ :\ >    [_Expression_] `.` [TUPLE_INDEX] -Tuple indexing expressions evaluate like [field access expressions], but access -elements of [tuples][tuple type] or [tuple structs]. +Tuple indexing expressions evaluate like [field access expressions], but access elements of [tuples][tuple type] or [tuple structs]. -Tuple index expressions are written as an operand, `.`, and a tuple index. The -index must be written as a [decimal literal] with no leading zeros, underscores, -or suffix. The operand must have the type of a tuple or tuple struct. If the -tuple index is not an element of the tuple or tuple struct, it is a compiler -error. +Tuple index expressions are written as an operand, `.`, and a tuple index. +The index must be written as a [decimal literal] with no leading zeros, underscores, or suffix. +The operand must have the type of a tuple or tuple struct. +If the tuple index is not an element of the tuple or tuple struct, it is a compiler error. Examples of tuple indexing expressions: @@ -65,9 +56,7 @@ assert_eq!(point.0, 1.0); assert_eq!(point.1, 0.0); ``` -> **Note**: Unlike field access expressions, tuple index expressions can be the -> function operand of a [call expression] as it cannot be confused with a -> method call since method names cannot be numbers. +> **Note**: Unlike field access expressions, tuple index expressions can be the function operand of a [call expression] as it cannot be confused with a method call since method names cannot be numbers. [_Expression_]: ../expressions.md [_InnerAttribute_]: ../attributes.md diff --git a/src/doc/reference/src/glossary.md b/src/doc/reference/src/glossary.md index 03155170c3..f88ba2f0fd 100644 --- a/src/doc/reference/src/glossary.md +++ b/src/doc/reference/src/glossary.md @@ -234,6 +234,22 @@ It allows a type to make certain promises about its behavior. Generic functions and generic structs can use traits to constrain, or bound, the types they accept. +### Turbofish + +Paths with generic parameters in expressions must prefix the opening brackets with a `::`. +Combined with the angular brackets for generics, this looks like a fish `::<>`. +As such, this syntax is colloquially referred to as turbofish syntax. + +Examples: + +```rust +let ok_num = Ok::<_, ()>(5); +let vec = [1, 2, 3].iter().map(|n| n * 2).collect::>(); +``` + +This `::` prefix is required to disambiguate generic paths with multiple comparisons in a comma-separate list. +See [the bastion of the turbofish][turbofish test] for an example where not having the prefix would be ambiguous. + ### Uncovered type A type which does not appear as an argument to another type. For example, @@ -286,6 +302,7 @@ example of an uninhabited type is the [never type] `!`, or an enum with no varia [structs]: items/structs.md [trait objects]: types/trait-object.md [traits]: items/traits.md +[turbofish test]: https://github.com/rust-lang/rust/blob/master/src/test/ui/bastion-of-the-turbofish.rs [types]: types.md [undefined-behavior]: behavior-considered-undefined.md [unions]: items/unions.md diff --git a/src/doc/reference/src/introduction.md b/src/doc/reference/src/introduction.md index ff885b4b11..d08d0b2519 100644 --- a/src/doc/reference/src/introduction.md +++ b/src/doc/reference/src/introduction.md @@ -1,102 +1,96 @@ # Introduction -This book is the primary reference for the Rust programming language. It -provides three kinds of material: +This book is the primary reference for the Rust programming language. +It provides three kinds of material: - Chapters that informally describe each language construct and their use. - - Chapters that informally describe the memory model, concurrency model, - runtime services, linkage model, and debugging facilities. - - Appendix chapters providing rationale and references to languages that - influenced the design. + - Chapters that informally describe the memory model, concurrency model, runtime services, linkage model, and debugging facilities. + - Appendix chapters providing rationale and references to languages that influenced the design.
-Warning: This book is incomplete. Documenting everything takes a while. See -the [GitHub issues] for what is not documented in this book. +Warning: +This book is incomplete. Documenting everything takes a while. +See the [GitHub issues] for what is not documented in this book.
-## What *The Reference* is Not +## Rust releases -This book does not serve as an introduction to the language. Background -familiarity with the language is assumed. A separate [book] is available to -help acquire such background familiarity. +Rust has a new language release every six weeks. +The first stable release of the language was Rust 1.0.0, followed by Rust 1.1.0 and so on. +Tools (`rustc`, `cargo`, etc.) and documentation ([Standard library], this book, etc.) are released with the language release. -This book also does not serve as a reference to the [standard library] -included in the language distribution. Those libraries are documented -separately by extracting documentation attributes from their source code. Many -of the features that one might expect to be language features are library -features in Rust, so what you're looking for may be there, not here. +The latest release of this book, matching the latest Rust version, can always be found at . +Prior versions can be found by adding the Rust version before the "reference" directory. +For example, the Reference for Rust 1.49.0 is located at . -Similarly, this book does not usually document the specifics of `rustc` as a -tool or of Cargo. `rustc` has its own [book][rustc book]. Cargo has a -[book][cargo book] that contains a [reference][cargo reference]. There are a few -pages such as [linkage] that still describe how `rustc` works. +## What *The Reference* is not -This book also only serves as a reference to what is available in stable -Rust. For unstable features being worked on, see the [Unstable Book]. +This book does not serve as an introduction to the language. +Background familiarity with the language is assumed. +A separate [book] is available to help acquire such background familiarity. -Rust compilers, including `rustc`, will perform optimizations. The reference -does not specify what optimizations are allowed or disallowed. Instead, think of -the compiled program as a black box. You can only probe by running it, feeding -it input and observing its output. Everything that happens that way must conform -to what the reference says. +This book also does not serve as a reference to the [standard library] included in the language distribution. +Those libraries are documented separately by extracting documentation attributes from their source code. +Many of the features that one might expect to be language features are library features in Rust, so what you're looking for may be there, not here. -Finally, this book is not normative. It may include details that are -specific to `rustc` itself, and should not be taken as a specification for -the Rust language. We intend to produce such a book someday, and until then, -the reference is the closest thing we have to one. +Similarly, this book does not usually document the specifics of `rustc` as a tool or of Cargo. +`rustc` has its own [book][rustc book]. +Cargo has a [book][cargo book] that contains a [reference][cargo reference]. +There are a few pages such as [linkage] that still describe how `rustc` works. -## How to Use This Book +This book also only serves as a reference to what is available in stable Rust. +For unstable features being worked on, see the [Unstable Book]. -This book does not assume you are reading this book sequentially. Each -chapter generally can be read standalone, but will cross-link to other chapters -for facets of the language they refer to, but do not discuss. +Rust compilers, including `rustc`, will perform optimizations. +The reference does not specify what optimizations are allowed or disallowed. +Instead, think of the compiled program as a black box. +You can only probe by running it, feeding it input and observing its output. +Everything that happens that way must conform to what the reference says. + +Finally, this book is not normative. +It may include details that are specific to `rustc` itself, and should not be taken as a specification for the Rust language. +We intend to produce such a book someday, and until then, the reference is the closest thing we have to one. + +## How to use this book + +This book does not assume you are reading this book sequentially. +Each chapter generally can be read standalone, but will cross-link to other chapters for facets of the language they refer to, but do not discuss. There are two main ways to read this document. -The first is to answer a specific question. If you know which chapter answers -that question, you can jump to that chapter in the table of contents. Otherwise, -you can press `s` or the click the magnifying glass on the top bar to search for -keywords related to your question. For example, say you wanted to know when a -temporary value created in a let statement is dropped. If you didn't already -know that the [lifetime of temporaries] is defined in the [expressions chapter], -you could search "temporary let" and the first search result will take you to -that section. +The first is to answer a specific question. +If you know which chapter answers that question, you can jump to that chapter in the table of contents. +Otherwise, you can press `s` or the click the magnifying glass on the top bar to search for keywords related to your question. +For example, say you wanted to know when a temporary value created in a let statement is dropped. +If you didn't already know that the [lifetime of temporaries] is defined in the [expressions chapter], you could search "temporary let" and the first search result will take you to that section. The second is to generally improve your knowledge of a facet of the language. -In that case, just browse the table of contents until you see something you -want to know more about, and just start reading. If a link looks interesting, -click it, and read about that section. +In that case, just browse the table of contents until you see something you want to know more about, and just start reading. +If a link looks interesting, click it, and read about that section. -That said, there is no wrong way to read this book. Read it however you feel -helps you best. +That said, there is no wrong way to read this book. Read it however you feel helps you best. ### Conventions -Like all technical books, this book has certain conventions in how it displays -information. These conventions are documented here. +Like all technical books, this book has certain conventions in how it displays information. +These conventions are documented here. -* Statements that define a term contain that term in *italics*. Whenever that - term is used outside of that chapter, it is usually a link to the section that - has this definition. +* Statements that define a term contain that term in *italics*. + Whenever that term is used outside of that chapter, it is usually a link to the section that has this definition. An *example term* is an example of a term being defined. -* Differences in the language by which edition the crate is compiled under are - in a blockquote that start with the words "Edition Differences:" in **bold**. +* Differences in the language by which edition the crate is compiled under are in a blockquote that start with the words "Edition Differences:" in **bold**. - > **Edition Differences**: In the 2015 edition, this syntax is valid that is - > disallowed as of the 2018 edition. + > **Edition Differences**: In the 2015 edition, this syntax is valid that is disallowed as of the 2018 edition. -* Notes that contain useful information about the state of the book or point out - useful, but mostly out of scope, information are in blockquotes that start - with the word "Note:" in **bold**. +* Notes that contain useful information about the state of the book or point out useful, but mostly out of scope, information are in blockquotes that start with the word "Note:" in **bold**. > **Note**: This is an example note. -* Warnings that show unsound behavior in the language or possibly confusing - interactions of language features are in a special warning box. +* Warnings that show unsound behavior in the language or possibly confusing interactions of language features are in a special warning box.
@@ -106,8 +100,7 @@ information. These conventions are documented here. * Code snippets inline in the text are inside `` tags. - Longer code examples are in a syntax highlighted box that has controls for - copying, executing, and showing hidden lines in the top right corner. + Longer code examples are in a syntax highlighted box that has controls for copying, executing, and showing hidden lines in the top right corner. ```rust # // This is a hidden line. @@ -116,8 +109,7 @@ information. These conventions are documented here. } ``` -* The grammar and lexical structure is in blockquotes with either "Lexer" or - "Syntax" in **bold superscript** as the first line. +* The grammar and lexical structure is in blockquotes with either "Lexer" or "Syntax" in **bold superscript** as the first line. > **Syntax**\ > _ExampleGrammar_:\ @@ -130,15 +122,10 @@ information. These conventions are documented here. We welcome contributions of all kinds. -You can contribute to this book by opening an issue or sending a pull -request to [the Rust Reference repository]. If this book does not answer -your question, and you think its answer is in scope of it, please do not -hesitate to [file an issue] or ask about it in the `t-lang/doc` stream on -[Zulip]. Knowing what people use this book for the most helps direct our -attention to making those sections the best that they can be. We also want -the reference to be as normative as possible, so if you see anything that is -wrong or is non-normative but not specifically called out, please also [file -an issue]. +You can contribute to this book by opening an issue or sending a pull request to [the Rust Reference repository]. +If this book does not answer your question, and you think its answer is in scope of it, please do not hesitate to [file an issue] or ask about it in the `t-lang/doc` stream on [Zulip]. +Knowing what people use this book for the most helps direct our attention to making those sections the best that they can be. +We also want the reference to be as normative as possible, so if you see anything that is wrong or is non-normative but not specifically called out, please also [file an issue]. [book]: ../book/index.html [github issues]: https://github.com/rust-lang/reference/issues diff --git a/src/doc/reference/src/items/enumerations.md b/src/doc/reference/src/items/enumerations.md index 8248a47db4..28d3ba8730 100644 --- a/src/doc/reference/src/items/enumerations.md +++ b/src/doc/reference/src/items/enumerations.md @@ -25,7 +25,7 @@ > _EnumItemDiscriminant_ :\ >    `=` [_Expression_] -An *enumeration*, also referred to as *enum* is a simultaneous definition of a +An *enumeration*, also referred to as an *enum*, is a simultaneous definition of a nominal [enumerated type] as well as a set of *constructors*, that can be used to create or pattern-match values of the corresponding enumerated type. diff --git a/src/doc/reference/src/items/generics.md b/src/doc/reference/src/items/generics.md index a7de436ec3..946b5e9a50 100644 --- a/src/doc/reference/src/items/generics.md +++ b/src/doc/reference/src/items/generics.md @@ -166,7 +166,7 @@ type N = u32; struct Foo; // The following is an error, because `N` is interpreted as the type alias `N`. fn foo() -> Foo { todo!() } // ERROR -// Can be fixed by wrapping in braces to force it to be interprted as the `N` +// Can be fixed by wrapping in braces to force it to be interpreted as the `N` // const parameter: fn bar() -> Foo<{ N }> { todo!() } // ok ``` diff --git a/src/doc/reference/src/items/unions.md b/src/doc/reference/src/items/unions.md index dabb6355ca..7ad5da71ee 100644 --- a/src/doc/reference/src/items/unions.md +++ b/src/doc/reference/src/items/unions.md @@ -47,13 +47,14 @@ let f = unsafe { u.f1 }; Unions have no notion of an "active field". Instead, every union access just interprets the storage at the type of the field used for the access. Reading a union field reads the bits of the union at the field's type. Fields might have a -non-zero offset (except when `#[repr(C)]` is used); in that case the bits -starting at the offset of the fields are read. It is the programmer's +non-zero offset (except when [the C representation] is used); in that case the +bits starting at the offset of the fields are read. It is the programmer's responsibility to make sure that the data is valid at the field's type. Failing -to do so results in undefined behavior. For example, reading the value `3` at -type `bool` is undefined behavior. Effectively, writing to and then reading from -a `#[repr(C)]` union is analogous to a [`transmute`] from the type used for -writing to the type used for reading. +to do so results in [undefined behavior]. For example, reading the value `3` +through of a field of the [boolean type] is undefined behavior. Effectively, +writing to and then reading from a union with [the C representation] is +analogous to a [`transmute`] from the type used for writing to the type used for +reading. Consequently, all reads of union fields have to be placed in `unsafe` blocks: @@ -182,4 +183,7 @@ checking, etc etc etc). [_StructFields_]: structs.md [`transmute`]: ../../std/mem/fn.transmute.html [`Copy`]: ../../std/marker/trait.Copy.html +[boolean type]: ../types/boolean.md [ManuallyDrop]: ../../std/mem/struct.ManuallyDrop.html +[the C representation]: ../type-layout.md#reprc-unions +[undefined behavior]: ../behavior-considered-undefined.html diff --git a/src/doc/reference/src/memory-ownership.md b/src/doc/reference/src/memory-ownership.md deleted file mode 100644 index aed07ef296..0000000000 --- a/src/doc/reference/src/memory-ownership.md +++ /dev/null @@ -1,4 +0,0 @@ -## Memory ownership - -When a stack frame is exited, its local allocations are all released, and its -references to boxes are dropped. diff --git a/src/doc/reference/src/paths.md b/src/doc/reference/src/paths.md index c0b2e6ff3e..2bf921c8d5 100644 --- a/src/doc/reference/src/paths.md +++ b/src/doc/reference/src/paths.md @@ -159,16 +159,17 @@ how it is resolved. ### `::` -Paths starting with `::` are considered to be global paths where the segments of the path -start being resolved from the crate root. Each identifier in the path must resolve to an -item. - -> **Edition Differences**: In the 2015 Edition, the crate root contains a variety of -> different items, including external crates, default crates such as `std` or `core`, and -> items in the top level of the crate (including `use` imports). +Paths starting with `::` are considered to be *global paths* where the segments of the path +start being resolved from a place which differs based on edition. Each identifier in +the path must resolve to an item. + +> **Edition Differences**: In the 2015 Edition, identifiers resolve from the "crate root" +> (`crate::` in the 2018 edition), which contains a variety of different items, including +> external crates, default crates such as `std` or `core`, and items in the top level of +> the crate (including `use` imports). > -> Beginning with the 2018 Edition, paths starting with `::` can only reference -> crates in the [extern prelude]. +> Beginning with the 2018 Edition, paths starting with `::` resolve from +> crates in the [extern prelude]. That is, they must be followed by the name of a crate. ```rust mod a { diff --git a/src/doc/reference/src/subtyping.md b/src/doc/reference/src/subtyping.md index 26c98790dc..3f5e35b466 100644 --- a/src/doc/reference/src/subtyping.md +++ b/src/doc/reference/src/subtyping.md @@ -61,6 +61,7 @@ Variance of types is automatically determined as follows | `[T]` and `[T; n]` | | covariant | | `fn() -> T` | | covariant | | `fn(T) -> ()` | | contravariant | +| `fn(T) -> T` | | invariant | | `std::cell::UnsafeCell` | | invariant | | `std::marker::PhantomData` | | covariant | | `dyn Trait + 'a` | covariant | invariant | diff --git a/src/doc/reference/src/type-layout.md b/src/doc/reference/src/type-layout.md index 6df9a60953..bacd478e3c 100644 --- a/src/doc/reference/src/type-layout.md +++ b/src/doc/reference/src/type-layout.md @@ -290,7 +290,7 @@ Rust's [field-less enums] with this representation. An `enum` in C is mostly a `typedef` plus some named constants; in other words, an object of an `enum` type can hold any integer value. For example, this is often used for bitflags in `C`. In contrast, Rust’s [field-less enums] can only legally hold -the discrimnant values, everything else is [undefined behavior]. Therefore, +the discriminant values, everything else is [undefined behavior]. Therefore, using a field-less enum in FFI to model a C `enum` is often wrong.
diff --git a/src/doc/reference/src/types/boolean.md b/src/doc/reference/src/types/boolean.md index 6c976b2a51..d8984025f3 100644 --- a/src/doc/reference/src/types/boolean.md +++ b/src/doc/reference/src/types/boolean.md @@ -1,17 +1,118 @@ # Boolean type -The `bool` type is a datatype which can be either `true` or `false`. The boolean -type uses one byte of memory. It is used in comparisons and bitwise operations -like `&`, `|`, and `!`. - ```rust -fn main() { - let x = true; - let y: bool = false; // with the boolean type annotation - - // Use of booleans in conditional expressions - if x { - println!("x is true"); - } -} +let b: bool = true; ``` + +The *boolean type* or *bool* is a primitive data type that can take on one of +two values, called *true* and *false*. + +Values of this type may be created using a [literal expression] using the +keywords `true` and `false` corresponding to the value of the same name. + +This type is a part of the [language prelude] with the [name] `bool`. + +An object with the boolean type has a [size and alignment] of 1 each. The +value false has the bit pattern `0x00` and the value true has the bit pattern +`0x01`. It is [undefined behavior] for an object with the boolean type to have +any other bit pattern. + +The boolean type is the type of many operands in various [expressions]: + +* The condition operand in [if expressions] and [while expressions] +* The operands in [lazy boolean operator expressions][lazy] + +> **Note**: The boolean type acts similarly to but is not an [enumerated type]. +In practice, this mostly means that constructors are not associated to the type +(e.g. `bool::true`). + +Like all primitives, the boolean type [implements][p-impl] the +[traits][p-traits] [`Clone`][p-clone], [`Copy`][p-copy], [`Sized`][p-sized], +[`Send`][p-send], and [`Sync`][p-sync]. + +> **Note**: See the [standard library docs][std] for library operations. + +## Operations on boolean values + + When using certain operator expressions with a +boolean type for its operands, they evaluate using the rules of [boolean logic]. + +### Logical not + +| `b` | [`!b`][op-not] | +|- | - | +| `true` | `false` | +| `false` | `true` | + +### Logical or + +| `a` | `b` | [a | b][op-or] | +|- | - | - | +| `true` | `true` | `true` | +| `true` | `false` | `true` | +| `false` | `true` | `true` | +| `false` | `false` | `false` | + +### Logical and + +| `a` | `b` | [`a & b`][op-and] | +|- | - | - | +| `true` | `true` | `true` | +| `true` | `false` | `false` | +| `false` | `true` | `false` | +| `false` | `false` | `false` | + +### Logical xor + +| `a` | `b` | [`a ^ b`][op-xor] | +|- | - | - | +| `true` | `true` | `false` | +| `true` | `false` | `true` | +| `false` | `true` | `true` | +| `false` | `false` | `false` | + +### Comparisons + +| `a` | `b` | [`a == b`][op-compare] | +|- | - | - | +| `true` | `true` | `true` | +| `true` | `false` | `false` | +| `false` | `true` | `false` | +| `false` | `false` | `true` | + +| `a` | `b` | [`a > b`][op-compare] | +|- | - | - | +| `true` | `true` | `false` | +| `true` | `false` | `true` | +| `false` | `true` | `false` | +| `false` | `false` | `false` | + +* `a != b` is the same as `!(a == b)` +* `a >= b` is the same as `a == b | a > b` +* `a < b` is the same as `!(a >= b)` +* `a <= b` is the same as `a == b | a < b` + +[boolean logic]: https://en.wikipedia.org/wiki/Boolean_algebra +[enumerated type]: enum.md +[expressions]: ../expressions.md +[if expressions]: ../expressions/if-expr.md#if-expressions +[language prelude]: ../names/preludes.md#language-prelude +[lazy]: ../expressions/operator-expr.md#lazy-boolean-operators +[literal expression]: ../expressions/literal-expr.md +[name]: ../names.md +[op-and]: ../expressions/operator-expr.md#arithmetic-and-logical-binary-operators +[op-compare]: ../expressions/operator-expr.md#comparison-operators +[op-not]: ../expressions/operator-expr.md#negation-operators +[op-or]: ../expressions/operator-expr.md#arithmetic-and-logical-binary-operators +[op-xor]: ../expressions/operator-expr.md#arithmetic-and-logical-binary-operators +[p-clone]: ../special-types-and-traits.md#clone +[p-copy]: ../special-types-and-traits.md#copy +[p-impl]: ../items/implementations.md +[p-send]: ../special-types-and-traits.md#send +[p-sized]: ../special-types-and-traits.md#sized +[p-sync]: ../special-types-and-traits.md#sync +[p-traits]: ../items/traits.md +[size and alignment]: ../type-layout.md#size-and-alignment +[std]: ../../std/primitive.bool.html +[undefined behavior]: ../behavior-considered-undefined.md +[while expressions]: ../expressions/loop-expr.md#predicate-loops diff --git a/src/doc/reference/src/types/enum.md b/src/doc/reference/src/types/enum.md index 8f69dbad80..8f81fb1a5c 100644 --- a/src/doc/reference/src/types/enum.md +++ b/src/doc/reference/src/types/enum.md @@ -7,8 +7,7 @@ An [`enum` item] declares both the type and a number of *variants*, each of which is independently named and has the syntax of a struct, tuple struct or unit-like struct. -New instances of an `enum` can be constructed in an [enumeration variant -expression]. +New instances of an `enum` can be constructed with a [struct expression]. Any `enum` value consumes as much memory as the largest variant for its corresponding `enum` type, as well as the size needed to store a discriminant. @@ -20,4 +19,4 @@ named reference to an [`enum` item]. ML, or a *pick ADT* in Limbo. [`enum` item]: ../items/enumerations.md -[enumeration variant expression]: ../expressions/enum-variant-expr.md +[struct expression]: ../expressions/struct-expr.md diff --git a/src/doc/rust-by-example/src/flow_control/for.md b/src/doc/rust-by-example/src/flow_control/for.md index 23445fe4fd..b5d5d62721 100644 --- a/src/doc/rust-by-example/src/flow_control/for.md +++ b/src/doc/rust-by-example/src/flow_control/for.md @@ -60,7 +60,7 @@ within. * `iter` - This borrows each element of the collection through each iteration. Thus leaving the collection untouched and available for reuse after the loop. -```rust, editable +```rust,editable fn main() { let names = vec!["Bob", "Frank", "Ferris"]; @@ -80,7 +80,7 @@ fn main() { data is provided. Once the collection has been consumed it is no longer available for reuse as it has been 'moved' within the loop. -```rust, editable, ignore +```rust,editable,ignore,mdbook-runnable fn main() { let names = vec!["Bob", "Frank", "Ferris"]; @@ -99,7 +99,7 @@ fn main() { * `iter_mut` - This mutably borrows each element of the collection, allowing for the collection to be modified in place. -```rust, editable +```rust,editable fn main() { let mut names = vec!["Bob", "Frank", "Ferris"]; diff --git a/src/doc/rust-by-example/src/fn/diverging.md b/src/doc/rust-by-example/src/fn/diverging.md index 19cf27c080..52e1f819ae 100644 --- a/src/doc/rust-by-example/src/fn/diverging.md +++ b/src/doc/rust-by-example/src/fn/diverging.md @@ -66,4 +66,4 @@ fn main() { ``` It is also the return type of functions that loop forever (e.g. `loop {}`) like -network servers or functions that terminates the process (e.g. `exit()`). +network servers or functions that terminate the process (e.g. `exit()`). diff --git a/src/doc/rust-by-example/src/scope/lifetime/explicit.md b/src/doc/rust-by-example/src/scope/lifetime/explicit.md index ebd7b69017..f0ecdf5fca 100644 --- a/src/doc/rust-by-example/src/scope/lifetime/explicit.md +++ b/src/doc/rust-by-example/src/scope/lifetime/explicit.md @@ -40,7 +40,7 @@ fn failed_borrow<'a>() { let _x = 12; // ERROR: `_x` does not live long enough - //let y: &'a i32 = &_x; + let y: &'a i32 = &_x; // Attempting to use the lifetime `'a` as an explicit type annotation // inside the function will fail because the lifetime of `&_x` is shorter // than that of `y`. A short lifetime cannot be coerced into a longer one. diff --git a/src/doc/rust-by-example/src/std/arc.md b/src/doc/rust-by-example/src/std/arc.md index 566bd55eca..d36ca0802a 100644 --- a/src/doc/rust-by-example/src/std/arc.md +++ b/src/doc/rust-by-example/src/std/arc.md @@ -8,7 +8,7 @@ fn main() { use std::sync::Arc; use std::thread; -// This variable declaration is where it's value is specified. +// This variable declaration is where its value is specified. let apple = Arc::new("the same apple"); for _ in 0..10 { diff --git a/src/doc/rust.css b/src/doc/rust.css index a92d4ff54d..06f4df9a9b 100644 --- a/src/doc/rust.css +++ b/src/doc/rust.css @@ -3,30 +3,35 @@ font-style: normal; font-weight: 400; src: local('Fira Sans'), url("FiraSans-Regular.woff") format('woff'); + font-display: swap; } @font-face { font-family: 'Fira Sans'; font-style: normal; font-weight: 500; src: local('Fira Sans Medium'), url("FiraSans-Medium.woff") format('woff'); + font-display: swap; } @font-face { font-family: 'Source Serif Pro'; font-style: normal; font-weight: 400; src: local('Source Serif Pro'), url("SourceSerifPro-Regular.ttf.woff") format('woff'); + font-display: swap; } @font-face { font-family: 'Source Serif Pro'; font-style: italic; font-weight: 400; src: url("SourceSerifPro-It.ttf.woff") format('woff'); + font-display: swap; } @font-face { font-family: 'Source Serif Pro'; font-style: normal; font-weight: 700; src: local('Source Serif Pro Bold'), url("SourceSerifPro-Bold.ttf.woff") format('woff'); + font-display: swap; } @font-face { font-family: 'Source Code Pro'; @@ -35,6 +40,7 @@ /* Avoid using locally installed font because bad versions are in circulation: * see https://github.com/rust-lang/rust/issues/24355 */ src: url("SourceCodePro-Regular.woff") format('woff'); + font-display: swap; } *:not(body) { @@ -326,6 +332,7 @@ table th { /* Code snippets */ +.example-wrap { position: relative; } pre.rust { position: relative; } a.test-arrow { background-color: rgba(78, 139, 202, 0.2); diff --git a/src/doc/rustc-dev-guide/.github/workflows/ci.yml b/src/doc/rustc-dev-guide/.github/workflows/ci.yml new file mode 100644 index 0000000000..c3307bb74d --- /dev/null +++ b/src/doc/rustc-dev-guide/.github/workflows/ci.yml @@ -0,0 +1,77 @@ +name: CI + +on: + push: + branches: + - master + pull_request: + schedule: + # Run at 18:00 UTC every day + - cron: '0 18 * * *' + +jobs: + ci: + runs-on: ubuntu-latest + env: + MDBOOK_VERSION: 0.4.7 + MDBOOK_LINKCHECK_VERSION: 0.7.2 + MDBOOK_TOC_VERSION: 0.6.1 + DEPLOY_DIR: book/html + BASE_SHA: ${{ github.event.pull_request.base.sha }} + steps: + - uses: actions/checkout@v2 + with: + # linkcheck needs the base commit. + fetch-depth: 0 + + - name: Cache binaries + id: mdbook-cache + uses: actions/cache@v2 + with: + path: | + ~/.cargo/bin + key: ${{ runner.os }}-${{ env.MDBOOK_VERSION }}--${{ env.MDBOOK_LINKCHECK_VERSION }}--${{ env.MDBOOK_TOC_VERSION }} + + - name: Cache linkcheck + uses: actions/cache@v2 + with: + path: | + ~/book/linkcheck + key: ${{ runner.os }}-${{ hashFiles('./book/linkcheck') }} + + - name: Check line lengths + if: github.event_name != 'push' + run: | + shopt -s globstar + MAX_LINE_LENGTH=100 bash ci/check_line_lengths.sh src/**/*.md + + - name: Install latest nightly Rust toolchain + if: steps.mdbook-cache.outputs.cache-hit != 'true' + uses: actions-rs/toolchain@v1 + with: + toolchain: nightly + override: true + + - name: Install Dependencies + if: steps.mdbook-cache.outputs.cache-hit != 'true' + run: | + cargo install mdbook --version ${{ env.MDBOOK_VERSION }} + cargo install mdbook-linkcheck --version ${{ env.MDBOOK_LINKCHECK_VERSION }} + cargo install mdbook-toc --version ${{ env.MDBOOK_TOC_VERSION }} + + - name: Check build + run: mdbook build + + - name: Deploy to gh-pages + if: github.event_name == 'push' && github.repository == 'rust-lang/rustc-dev-guide' + run: | + touch "${{ env.DEPLOY_DIR }}/.nojekyll" + cp CNAME "${{ env.DEPLOY_DIR }}" + cd "${{ env.DEPLOY_DIR }}" + rm -rf .git + git init + git config user.name "Deploy from CI" + git config user.email "" + git add . + git commit -m "Deploy ${GITHUB_SHA} to gh-pages" + git push --quiet -f "https://x-token:${{ secrets.GITHUB_TOKEN }}@github.com/${GITHUB_REPOSITORY}" HEAD:gh-pages diff --git a/src/doc/rustc-dev-guide/.github/workflows/date-check.yml b/src/doc/rustc-dev-guide/.github/workflows/date-check.yml new file mode 100644 index 0000000000..4111172358 --- /dev/null +++ b/src/doc/rustc-dev-guide/.github/workflows/date-check.yml @@ -0,0 +1,44 @@ +name: Date-Check + +on: + schedule: + # Run at noon UTC every 1st of the month + - cron: '00 12 01 * *' + + # Allow manually starting the workflow + workflow_dispatch: + +jobs: + date-check: + runs-on: ubuntu-latest + + steps: + - name: Checkout repo + uses: actions/checkout@v2 + + - name: Run `date-check` + working-directory: ci/date-check + run: | + cargo run -- ../../src/ > ../../date-check-output.txt + + - name: Open issue + uses: actions/github-script@v3 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + script: | + const fs = require('fs'); + + const rawText = fs.readFileSync('date-check-output.txt', { encoding: 'utf8' }); + const title = rawText.split('\n')[0]; + if (title != 'empty') { + const body = rawText.split('\n').slice(1).join('\n'); + github.issues.create({ + owner: context.repo.owner, + repo: context.repo.repo, + title, + body, + }); + console.log('Opened issue.'); + } else { + console.log('No dates to triage.'); + } diff --git a/src/doc/rustc-dev-guide/.travis.yml b/src/doc/rustc-dev-guide/.travis.yml deleted file mode 100644 index df48ef6dfa..0000000000 --- a/src/doc/rustc-dev-guide/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -language: rust -rust: -- nightly -cache: -- cargo -- directories: - - book/linkcheck/ -before_install: -- shopt -s globstar -- MAX_LINE_LENGTH=100 bash ci/check_line_lengths.sh src/**/*.md -install: -- source ~/.cargo/env || true -- cargo install mdbook --version 0.3.7 -- cargo install mdbook-linkcheck --version 0.5.0 -script: -- mdbook build -notifications: - email: - on_success: never -env: - global: - secure: YQX/AWq5KsvAFYqcCK6c1DmOZX9EMrecBM5qnc4uE2HvEBS+x0l8xatI2Nv8U9eiasZYfsqmHn0ANvxu6e4oqL15m4cVsdliCzdkrPsDapxTnwwJvMQg+yHZiEd5BPlaDQt/wYvP8QBXgQsXoAJKrfAS+BFsowBFHt/LOFOunbAQrtQZqwqrnI6+xh+2TRMckws/VcTLRqwl3pyEyfacJhbbv1V3gJh7Y17hELsgsP7+7cMXT0bK6dtf7a9vne9Hsm5fw7VeMKBn1/dJ82fyEK6HHjkjdw1/OoY35YVyNZ/9ZxP2u1ClEXzCRJQ2CvKr8Tuoh/AuoL0pwrfhOTaOuWU0QZT4QBqjTimsgBLqiJicMiSndgsXinLWvlDqrMS1XfleqCKqAQy9AJTCR1LnwR90/HRxfE5YDAL/mbc0Su4jj+l5Zv3UE8vUqFE34E/jzip17JkDT5aMkl4bgW65lqJE7SLWl7gXT7eYbPEtQZoucR1hkSsBu/4YTvcxSlD98spWZ68mWwYyjLJSQDES+GefUnHJ/RbBVl9pW+sL7jXJ+kZ/NBCtCIgrkGchudEMDEvS6rcOzwCejxqL1of0jYHGopkBXSVHOPneWIdNeKXwBZA9hp0yKh0sWwrKHrA3wYhS/kF9uO19l/RnSTXAfApYR/yJUbYliuMJYCgNeKE= -deploy: - provider: pages - skip-cleanup: true - github-token: $GITHUB_TOKEN - local-dir: book/html - fqdn: rustc-dev-guide.rust-lang.org - on: - branch: master diff --git a/src/doc/rustc-dev-guide/CODE_OF_CONDUCT.md b/src/doc/rustc-dev-guide/CODE_OF_CONDUCT.md index 89a9cdfcce..42f287fbbc 100644 --- a/src/doc/rustc-dev-guide/CODE_OF_CONDUCT.md +++ b/src/doc/rustc-dev-guide/CODE_OF_CONDUCT.md @@ -1,38 +1,3 @@ # The Rust Code of Conduct -A version of this document [can be found online](https://www.rust-lang.org/conduct.html). - -## Conduct - -**Contact**: [rust-mods@rust-lang.org](mailto:rust-mods@rust-lang.org) - -* We are committed to providing a friendly, safe and welcoming environment for all, regardless of level of experience, gender identity and expression, sexual orientation, disability, personal appearance, body size, race, ethnicity, age, religion, nationality, or other similar characteristic. -* On IRC, please avoid using overtly sexual nicknames or other nicknames that might detract from a friendly, safe and welcoming environment for all. -* Please be kind and courteous. There's no need to be mean or rude. -* Respect that people have differences of opinion and that every design or implementation choice carries a trade-off and numerous costs. There is seldom a right answer. -* Please keep unstructured critique to a minimum. If you have solid ideas you want to experiment with, make a fork and see how it works. -* We will exclude you from interaction if you insult, demean or harass anyone. That is not welcome behaviour. We interpret the term "harassment" as including the definition in the
Citizen Code of Conduct; if you have any lack of clarity about what might be included in that concept, please read their definition. In particular, we don't tolerate behavior that excludes people in socially marginalized groups. -* Private harassment is also unacceptable. No matter who you are, if you feel you have been or are being harassed or made uncomfortable by a community member, please contact one of the channel ops or any of the [Rust moderation team](/team.html#Moderation) immediately. Whether you're a regular contributor or a newcomer, we care about making this community a safe place for you and we've got your back. -* Likewise any spamming, trolling, flaming, baiting or other attention-stealing behaviour is not welcome. - -## Moderation - - -These are the policies for upholding our community's standards of conduct. If you feel that a thread needs moderation, please contact the [Rust moderation team](/team.html#Moderation). - -1. Remarks that violate the Rust standards of conduct, including hateful, hurtful, oppressive, or exclusionary remarks, are not allowed. (Cursing is allowed, but never targeting another user, and never in a hateful manner.) -2. Remarks that moderators find inappropriate, whether listed in the code of conduct or not, are also not allowed. -3. Moderators will first respond to such remarks with a warning. -4. If the warning is unheeded, the user will be "kicked," i.e. kicked out of the communication channel to cool off. -5. If the user comes back and continues to make trouble, they will be banned, i.e. indefinitely excluded. -6. Moderators may choose at their discretion to un-ban the user if it was a first offense and they offer the offended party a genuine apology. -7. If a moderator bans someone and you think it was unjustified, please take it up with that moderator, or with a different moderator, **in private**. Complaints about bans in-channel are not allowed. -8. Moderators are held to a higher standard than other community members. If a moderator creates an inappropriate situation, they should expect less leeway than others. - -In the Rust community we strive to go the extra step to look out for each other. Don't just aim to be technically unimpeachable, try to be your best self. In particular, avoid flirting with offensive or sensitive issues, particularly if they're off-topic; this all too often leads to unnecessary fights, hurt feelings, and damaged trust; worse, it can drive people away from the community entirely. - -And if someone takes issue with something you said or did, resist the urge to be defensive. Just stop doing what it was they complained about and apologize. Even if you feel you were misinterpreted or unfairly accused, chances are good there was something you could've communicated better — remember that it's your responsibility to make your fellow Rustaceans comfortable. Everyone wants to get along and we are all here first and foremost because we want to talk about cool technology. You will find that people will be eager to assume good intent and forgive as long as you earn their trust. - -The enforcement policies listed above apply to all official Rust venues; including official IRC channels (#rust, #rust-internals, #rust-tools, #rust-libs, #rustc, #rust-beginners, #rust-docs, #rust-community, #rust-lang, and #cargo); GitHub repositories under rust-lang, rust-lang-nursery, and rust-lang-deprecated; and all forums under rust-lang.org (users.rust-lang.org, internals.rust-lang.org). For other projects adopting the Rust Code of Conduct, please contact the maintainers of those projects for enforcement. If you wish to use this code of conduct for your own project, consider explicitly mentioning your moderation policy or making a copy with your own moderation policy so as to avoid confusion. - -*Adapted from the [Node.js Policy on Trolling](http://blog.izs.me/post/30036893703/policy-on-trolling) as well as the [Contributor Covenant v1.3.0](http://contributor-covenant.org/version/1/3/0/).* +This repository follows the [Code of Conduct](https://www.rust-lang.org/conduct.html) of the Rust organization. diff --git a/src/doc/rustc-dev-guide/README.md b/src/doc/rustc-dev-guide/README.md index a6658b023b..4595643640 100644 --- a/src/doc/rustc-dev-guide/README.md +++ b/src/doc/rustc-dev-guide/README.md @@ -1,4 +1,4 @@ -![Travis CI badge](https://api.travis-ci.com/rust-lang/rustc-dev-guide.svg?branch=master) +[![Travis CI badge](https://api.travis-ci.com/rust-lang/rustc-dev-guide.svg?branch=master)](https://travis-ci.com/github/rust-lang/rustc-dev-guide) This is a collaborative effort to build a guide that explains how rustc @@ -9,12 +9,14 @@ some new part of the compiler that they haven't worked on before. [You can read the latest version of the guide here.](https://rustc-dev-guide.rust-lang.org/) You may also find the rustdocs [for the compiler itself][rustdocs] useful. +Note that these are not intended as a guide; it's recommended that you search +for the docs you're looking for instead of reading them top to bottom. -[rustdocs]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ +[rustdocs]: https://doc.rust-lang.org/nightly/nightly-rustc ### Contributing to the guide -The guide is useful today, but it has a lot of work still go. +The guide is useful today, but it has a lot of work still to go. If you'd like to help improve the guide, we'd love to have you! You can find plenty of issues on the [issue @@ -35,37 +37,10 @@ rustdocs][rustdocs]. ### Build Instructions -Deactivate the CI testing link validations by commenting out the `[output.linkcheck]` field in the `book.toml` configuration file like this: - -```toml -[book] -title = "Guide to Rustc Development" -author = "Rustc developers" -description = "A guide to developing rustc" - -[build] -create-missing = false - -[output.html] -git-repository-url = "https://github.com/rust-lang/rustc-dev-guide" - -[output.html.fold] -enable = true -level = 1 - -# [output.linkcheck] -# follow-web-links = false -# exclude = [ "crates\\.io", "gcc\\.godbolt\\.org", "youtube\\.com", "youtu\\.be", "dl\\.acm\\.org", "cs\\.bgu\\.ac\\.il" ] -# cache-timeout = 172800 -# warning-policy = "error" -``` - -These validations can cause errors during local builds (see Link Validations section below). Please **do not** commit these `book.toml` file changes when you submit a pull request. - To build a local static HTML site, install [`mdbook`](https://github.com/rust-lang/mdBook) with: ``` -> cargo install mdbook +> cargo install mdbook mdbook-linkcheck mdbook-toc ``` and execute the following command in the root of the repository: @@ -78,38 +53,46 @@ The build files are found in the `book` directory. ### Link Validations -We use `mdbook-linkcheck` to validate URLs included in our documentation. To perform link checks, uncomment the `[output.linkcheck]` field in the `book.toml` configuration file and install `mdbook-linkcheck` with: +We use `mdbook-linkcheck` to validate URLs included in our documentation. +`linkcheck` will be run automatically when you build with the instructions in the section above. + +### Table of Contents -```bash -> cargo install mdbook-linkcheck -``` +We use `mdbook-toc` to auto-generate TOCs for long sections. You can invoke the preprocessor by +including the `` marker at the place where you want the TOC. -You will need `mdbook` version `>= 0.3.5` and `mdbook-linkcheck` version `>= 0.5` to check links. -`linkcheck` will be run automatically when you build with the instructions in the section above. +### Pre-commit script -**Please note**: You may receive errors like the following when link checks are active on local `mdbook` builds: +We also test that line lengths are less than 100 columns. To test this locally, +you can run `ci/check_line_lengths.sh`. -``` -error: The server responded with 429 Too Many Requests for "https://github.com/rust-lang/rust/tree/master/src/tools/compiletest" +You can also set this to run automatically. - ┌── tests/intro.md:6:1 ─── - │ - 6 │ [`src/tools/compiletest`] directory). This section gives a brief - │ ^ Server responded with 429 Too Many Requests +On Linux: + +```bash +ln -s ../../ci/check_line_lengths.sh .git/hooks/pre-commit ``` -There is not a workaround for this error at the moment. Comment out the `[output.linkcheck]` field in the `book.toml` using the build instructions above to complete a local site build without link validations. +On Windows: +```powershell +New-Item -Path .git/hooks/pre-commit -ItemType HardLink -Value +``` ## How to fix toolstate failures +> **NOTE**: Currently, we do not track the rustc-dev-guide toolstate due to +[spurious failures](https://github.com/rust-lang/rust/pull/71731), +but we leave these instructions for when we do it again in the future. + 1. You will get a ping from the toolstate commit. e.g. https://github.com/rust-lang-nursery/rust-toolstate/commit/8ffa0e4c30ac9ba8546b7046e5c4ccc2b96ebdd4 2. The commit contains a link to the PR that caused the breakage. e.g. https://github.com/rust-lang/rust/pull/64321 3. If you go to that PR's thread, there is a post from bors with a link to the CI status: https://github.com/rust-lang/rust/pull/64321#issuecomment-529763807 -4. Follow the check-azure link to get to the Azure website for that build: https://dev.azure.com/rust-lang/e71b0ddf-dd27-435a-873c-e30f86eea377/_build/results?buildId=7780 +4. Follow the check-actions link to get to the Actions page for that build 5. There will be approximately 1 billion different jobs for the build. They are for different configurations and platforms. The rustc-dev-guide build only runs on the Linux x86_64-gnu-tools job. So click on that job in the list, which is about 60% down in the list. @@ -117,7 +100,7 @@ There is not a workaround for this error at the moment. Comment out the `[outpu 7. Click on the log and Ctrl-f to get a search box in the log -8. Search for rustc-dev-guide. This gets you to the place where the links are checked. It is usually ~11K lines into the log +8. Search for rustc-dev-guide. This gets you to the place where the links are checked. It is usually ~11K lines into the log. 9. Look at the links in the log near that point in the log @@ -132,7 +115,7 @@ git submodule update --remote src/doc/rustc-dev-guide git add -u git commit -m "Update rustc-dev-guide" # Note that you can use -i, which is short for --incremental, in the following command -./x.py test --incremental --stage 1 src/doc/rustc-dev-guide # This is optional and should succeed anyway +./x.py test --incremental src/doc/rustc-dev-guide # This is optional and should succeed anyway # Open a PR in rust-lang/rust ``` diff --git a/src/doc/rustc-dev-guide/book.toml b/src/doc/rustc-dev-guide/book.toml index 3d90479cb2..bad4fe1aa5 100644 --- a/src/doc/rustc-dev-guide/book.toml +++ b/src/doc/rustc-dev-guide/book.toml @@ -6,15 +6,20 @@ description = "A guide to developing rustc" [build] create-missing = false +[preprocessor.toc] +command = "mdbook-toc" +renderer = ["html"] + [output.html] git-repository-url = "https://github.com/rust-lang/rustc-dev-guide" [output.html.fold] enable = true -level = 1 +level = 0 [output.linkcheck] +command = "../../ci/linkcheck.sh" follow-web-links = true -exclude = [ "crates\\.io", "gcc\\.godbolt\\.org", "youtube\\.com", "youtu\\.be", "dl\\.acm\\.org", "cs\\.bgu\\.ac\\.il" ] -cache-timeout = 172800 +exclude = [ "crates\\.io", "gcc\\.godbolt\\.org", "youtube\\.com", "youtu\\.be", "dl\\.acm\\.org", "cs\\.bgu\\.ac\\.il", "www\\.amazon\\.com", "www\\.rustaceans\\.org", "play\\.rust-lang\\.org" ] +cache-timeout = 86400 warning-policy = "error" diff --git a/src/doc/rustc-dev-guide/ci/check-in.sh b/src/doc/rustc-dev-guide/ci/check-in.sh new file mode 100755 index 0000000000..323b75d67b --- /dev/null +++ b/src/doc/rustc-dev-guide/ci/check-in.sh @@ -0,0 +1,35 @@ +#!/bin/sh + +set -eu + +# This is not a very smart script +if [ $# != 2 ]; then + echo "usage: $0 " + if [ $# = 1 ] ; then + echo "help: you can find the number of PRs merged at" \ + "https://github.com/rust-lang/rustc-dev-guide/pulls?q=is%3Apr+is%3Amerged+updated%3A%3E$1" + fi + exit 1 +fi + +curl() { + command curl -s "$@" +} + +# Get recently updated PRs +curl "https://api.github.com/repos/rust-lang/rustc-dev-guide/pulls?state=closed&per_page=$2" \ + | jq '[.[] | select(.merged_at > "'"$1"'")]' > pulls.json + +show_pulls() { + jq -r '.[] | { title, number, html_url, user: .user.login } | "- " + .title + " [#" + (.number | tostring) + "](" + .html_url + ")"' +} + +echo "### Most notable changes" +echo +show_pulls < pulls.json +echo +echo "### Most notable WIPs" +echo +# If there are more than 30 PRs open at a time, you'll need to set `per_page`. +# For now this seems unlikely. +curl "https://api.github.com/repos/rust-lang/rustc-dev-guide/pulls?state=open" | show_pulls diff --git a/src/doc/rustc-dev-guide/ci/check_line_lengths.sh b/src/doc/rustc-dev-guide/ci/check_line_lengths.sh index 32bf739e4d..31cda5c65e 100755 --- a/src/doc/rustc-dev-guide/ci/check_line_lengths.sh +++ b/src/doc/rustc-dev-guide/ci/check_line_lengths.sh @@ -1,19 +1,19 @@ -#!/bin/bash +#!/usr/bin/env bash if [ "$1" == "--help" ]; then - echo 'Usage:' - echo ' MAX_LINE_LENGTH=100' "$0" 'src/**/*.md' - exit 1 + echo 'Usage:' "[MAX_LINE_LENGTH=n] $0 [file ...]" + exit 1 fi if [ "$MAX_LINE_LENGTH" == "" ]; then - echo '`MAX_LINE_LENGTH` environment variable not set. Try --help.' - exit 1 + MAX_LINE_LENGTH=100 fi if [ "$1" == "" ]; then - echo 'No files provided.' - exit 1 + shopt -s globstar + files=( src/**/*.md ) +else + files=( "$@" ) fi echo "Checking line lengths in all source files <= $MAX_LINE_LENGTH chars..." @@ -21,7 +21,7 @@ echo "Checking line lengths in all source files <= $MAX_LINE_LENGTH chars..." echo "Offending files and lines:" (( bad_lines = 0 )) (( inside_block = 0 )) -for file in "$@" ; do +for file in "${files[@]}"; do echo "$file" (( line_no = 0 )) while IFS="" read -r line || [[ -n "$line" ]] ; do diff --git a/src/doc/rustc-dev-guide/ci/date-check/Cargo.lock b/src/doc/rustc-dev-guide/ci/date-check/Cargo.lock new file mode 100644 index 0000000000..296a132d43 --- /dev/null +++ b/src/doc/rustc-dev-guide/ci/date-check/Cargo.lock @@ -0,0 +1,147 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "aho-corasick" +version = "0.7.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" +dependencies = [ + "memchr", +] + +[[package]] +name = "autocfg" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" + +[[package]] +name = "chrono" +version = "0.4.19" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" +dependencies = [ + "libc", + "num-integer", + "num-traits", + "time", + "winapi", +] + +[[package]] +name = "date-check" +version = "0.1.0" +dependencies = [ + "chrono", + "glob", + "regex", +] + +[[package]] +name = "glob" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574" + +[[package]] +name = "lazy_static" +version = "1.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" + +[[package]] +name = "libc" +version = "0.2.82" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "89203f3fba0a3795506acaad8ebce3c80c0af93f994d5a1d7a0b1eeb23271929" + +[[package]] +name = "memchr" +version = "2.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" + +[[package]] +name = "num-integer" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" +dependencies = [ + "autocfg", + "num-traits", +] + +[[package]] +name = "num-traits" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" +dependencies = [ + "autocfg", +] + +[[package]] +name = "regex" +version = "1.4.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a" +dependencies = [ + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", +] + +[[package]] +name = "regex-syntax" +version = "0.6.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581" + +[[package]] +name = "thread_local" +version = "1.1.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bb9bc092d0d51e76b2b19d9d85534ffc9ec2db959a2523cdae0697e2972cd447" +dependencies = [ + "lazy_static", +] + +[[package]] +name = "time" +version = "0.1.44" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" +dependencies = [ + "libc", + "wasi", + "winapi", +] + +[[package]] +name = "wasi" +version = "0.10.0+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/src/doc/rustc-dev-guide/ci/date-check/Cargo.toml b/src/doc/rustc-dev-guide/ci/date-check/Cargo.toml new file mode 100644 index 0000000000..95251fb123 --- /dev/null +++ b/src/doc/rustc-dev-guide/ci/date-check/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "date-check" +version = "0.1.0" +authors = ["Camelid "] +edition = "2018" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +glob = "0.3" +regex = "1" +chrono = "0.4" diff --git a/src/doc/rustc-dev-guide/ci/date-check/src/main.rs b/src/doc/rustc-dev-guide/ci/date-check/src/main.rs new file mode 100644 index 0000000000..d78b430b5c --- /dev/null +++ b/src/doc/rustc-dev-guide/ci/date-check/src/main.rs @@ -0,0 +1,236 @@ +use std::{ + collections::BTreeMap, + convert::TryInto as _, + env, fmt, fs, + path::{Path, PathBuf}, +}; + +use chrono::{Datelike as _, TimeZone as _, Utc}; +use glob::glob; +use regex::Regex; + +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +struct Date { + year: u32, + month: u32, +} + +impl Date { + fn months_since(self, other: Date) -> Option { + let self_chrono = Utc.ymd(self.year.try_into().unwrap(), self.month, 1); + let other_chrono = Utc.ymd(other.year.try_into().unwrap(), other.month, 1); + let duration_since = self_chrono.signed_duration_since(other_chrono); + let months_since = duration_since.num_days() / 30; + if months_since < 0 { + None + } else { + Some(months_since.try_into().unwrap()) + } + } +} + +impl fmt::Display for Date { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + write!(f, "{:04}-{:02}", self.year, self.month) + } +} + +fn make_date_regex() -> Regex { + Regex::new( + r"(?x) # insignificant whitespace mode + ", + ) + .unwrap() +} + +fn collect_dates_from_file(date_regex: &Regex, text: &str) -> Vec<(usize, Date)> { + let mut line = 1; + let mut end_of_last_cap = 0; + date_regex + .captures_iter(&text) + .map(|cap| { + ( + cap.get(0).unwrap().range(), + Date { + year: cap["y"].parse().unwrap(), + month: cap["m"].parse().unwrap(), + }, + ) + }) + .map(|(byte_range, date)| { + line += text[end_of_last_cap..byte_range.end] + .chars() + .filter(|c| *c == '\n') + .count(); + end_of_last_cap = byte_range.end; + (line, date) + }) + .collect() +} + +fn collect_dates(paths: impl Iterator) -> BTreeMap> { + let date_regex = make_date_regex(); + let mut data = BTreeMap::new(); + for path in paths { + let text = fs::read_to_string(&path).unwrap(); + let dates = collect_dates_from_file(&date_regex, &text); + if !dates.is_empty() { + data.insert(path, dates); + } + } + data +} + +fn filter_dates( + current_month: Date, + min_months_since: u32, + dates_by_file: impl Iterator)>, +) -> impl Iterator)> { + dates_by_file + .map(move |(path, dates)| { + ( + path, + dates + .into_iter() + .filter(|(_, date)| { + current_month + .months_since(*date) + .expect("found date that is after current month") + >= min_months_since + }) + .collect::>(), + ) + }) + .filter(|(_, dates)| !dates.is_empty()) +} + +fn main() { + let root_dir = env::args() + .nth(1) + .expect("expect root Markdown directory as CLI argument"); + let root_dir_path = Path::new(&root_dir); + let glob_pat = format!("{}/**/*.md", root_dir); + let today_chrono = Utc::today(); + let current_month = Date { + year: today_chrono.year_ce().1, + month: today_chrono.month(), + }; + + let dates_by_file = collect_dates(glob(&glob_pat).unwrap().map(Result::unwrap)); + let dates_by_file: BTreeMap<_, _> = + filter_dates(current_month, 6, dates_by_file.into_iter()).collect(); + + if dates_by_file.is_empty() { + println!("empty"); + } else { + println!("Date Reference Triage for {}", current_month); + println!("## Procedure"); + println!(); + println!( + "Each of these dates should be checked to see if the docs they annotate are \ + up-to-date. Each date should be updated (in the Markdown file where it appears) to \ + use the current month ({current_month}), or removed if the docs it annotates are not \ + expected to fall out of date quickly.", + current_month = current_month + ); + println!(); + println!( + "Please check off each date once a PR to update it (and, if applicable, its \ + surrounding docs) has been merged. Please also mention that you are working on a \ + particular set of dates so duplicate work is avoided." + ); + println!(); + println!("Finally, once all the dates have been updated, please close this issue."); + println!(); + println!("## Dates"); + println!(); + + for (path, dates) in dates_by_file { + println!( + "- [ ] {}", + path.strip_prefix(&root_dir_path).unwrap().display() + ); + for (line, date) in dates { + println!(" - [ ] line {}: {}", line, date); + } + } + println!(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_months_since() { + let date1 = Date { + year: 2020, + month: 3, + }; + let date2 = Date { + year: 2021, + month: 1, + }; + assert_eq!(date2.months_since(date1), Some(10)); + } + + #[test] + fn test_date_regex() { + let regex = make_date_regex(); + assert!(regex.is_match("foo bar")); + } + + #[test] + fn test_collect_dates_from_file() { + let text = "Test1\n\nTest2\nFoo\nTest3\nTest4\nFooBar\n\nTest5\nTest6\nTest7\n\nTest8 + "; + assert_eq!( + collect_dates_from_file(&make_date_regex(), text), + vec![ + ( + 2, + Date { + year: 2021, + month: 1, + } + ), + ( + 4, + Date { + year: 2021, + month: 2, + } + ), + ( + 7, + Date { + year: 2021, + month: 3, + } + ), + ( + 8, + Date { + year: 2021, + month: 4, + } + ), + ( + 14, + Date { + year: 2021, + month: 5, + } + ), + ] + ); + } +} diff --git a/src/doc/rustc-dev-guide/ci/linkcheck.sh b/src/doc/rustc-dev-guide/ci/linkcheck.sh new file mode 100755 index 0000000000..8848235480 --- /dev/null +++ b/src/doc/rustc-dev-guide/ci/linkcheck.sh @@ -0,0 +1,31 @@ +#!/usr/bin/env bash + +set -e +set -o pipefail + +# https://docs.github.com/en/actions/reference/environment-variables +if [ "$GITHUB_EVENT_NAME" = "schedule" ] ; then # running in scheduled job + FLAGS="" + + echo "Doing full link check." + set -x +elif [ "$GITHUB_EVENT_NAME" = "pull_request" ] ; then # running in PR CI build + if [ -z "$BASE_SHA" ]; then + echo "error: unexpected state: BASE_SHA must be non-empty in CI" + exit 1 + fi + + CHANGED_FILES=$(git diff --name-only $BASE_SHA... | tr '\n' ' ') + FLAGS="--no-cache -f $CHANGED_FILES" + + echo "Checking files changed since $BASE_SHA: $CHANGED_FILES" + set -x +else # running locally + COMMIT_RANGE=master... + CHANGED_FILES=$(git diff --name-only $COMMIT_RANGE | tr '\n' ' ') + FLAGS="-f $CHANGED_FILES" + + echo "Checking files changed in $COMMIT_RANGE: $CHANGED_FILES" +fi + +exec mdbook-linkcheck $FLAGS -- $TRAVIS_BUILD_DIR diff --git a/src/doc/rustc-dev-guide/examples/rustc-driver-example.rs b/src/doc/rustc-dev-guide/examples/rustc-driver-example.rs index 62c80b4aed..f01072b7be 100644 --- a/src/doc/rustc-dev-guide/examples/rustc-driver-example.rs +++ b/src/doc/rustc-dev-guide/examples/rustc-driver-example.rs @@ -1,17 +1,19 @@ #![feature(rustc_private)] -extern crate rustc; +// NOTE: For the example to compile, you will need to first run the following: +// rustup component add rustc-dev + extern crate rustc_error_codes; extern crate rustc_errors; extern crate rustc_hash; extern crate rustc_hir; extern crate rustc_interface; +extern crate rustc_session; extern crate rustc_span; -use rustc::session; -use rustc::session::config; use rustc_errors::registry; use rustc_hash::{FxHashMap, FxHashSet}; +use rustc_session::config; use rustc_span::source_map; use std::path; use std::process; @@ -24,60 +26,41 @@ fn main() { .output() .unwrap(); let sysroot = str::from_utf8(&out.stdout).unwrap().trim(); - let filename = "main.rs"; - let contents = "static HELLO: &str = \"Hello, world!\"; fn main() { println!(\"{}\", HELLO); }"; - let errors = registry::Registry::new(&rustc_error_codes::DIAGNOSTICS); let config = rustc_interface::Config { // Command line options opts: config::Options { maybe_sysroot: Some(path::PathBuf::from(sysroot)), ..config::Options::default() }, - // cfg! configuration in addition to the default ones - // FxHashSet<(String, Option)> - crate_cfg: FxHashSet::default(), - + crate_cfg: FxHashSet::default(), // FxHashSet<(String, Option)> input: config::Input::Str { - name: source_map::FileName::Custom(String::from(filename)), - input: String::from(contents), + name: source_map::FileName::Custom("main.rs".to_string()), + input: "static HELLO: &str = \"Hello, world!\"; fn main() { println!(\"{}\", HELLO); }" + .to_string(), }, - // Option - input_path: None, - // Option - output_dir: None, - // Option - output_file: None, - // Option> - file_loader: None, - diagnostic_output: session::DiagnosticOutput::Default, - + input_path: None, // Option + output_dir: None, // Option + output_file: None, // Option + file_loader: None, // Option> + diagnostic_output: rustc_session::DiagnosticOutput::Default, // Set to capture stderr output during compiler execution - // Option>>> - stderr: None, - - // Option - crate_name: None, - // FxHashMap - lint_caps: FxHashMap::default(), - + stderr: None, // Option>>> + crate_name: None, // Option + lint_caps: FxHashMap::default(), // FxHashMap // This is a callback from the driver that is called when we're registering lints; // it is called during plugin registration when we have the LintStore in a non-shared state. // // Note that if you find a Some here you probably want to call that function in the new // function being registered. - // Option> - register_lints: None, - + register_lints: None, // Option> // This is a callback from the driver that is called just after we have populated // the list of queries. // // The second parameter is local providers and the third parameter is external providers. - // Option, &mut ty::query::Providers<'_>)> - override_queries: None, - + override_queries: None, // Option, &mut ty::query::Providers<'_>)> // Registry of diagnostics codes. - registry: errors, + registry: registry::Registry::new(&rustc_error_codes::DIAGNOSTICS), }; rustc_interface::run_compiler(config, |compiler| { compiler.enter(|queries| { diff --git a/src/doc/rustc-dev-guide/examples/rustc-driver-getting-diagnostics.rs b/src/doc/rustc-dev-guide/examples/rustc-driver-getting-diagnostics.rs new file mode 100644 index 0000000000..e1caab326b --- /dev/null +++ b/src/doc/rustc-dev-guide/examples/rustc-driver-getting-diagnostics.rs @@ -0,0 +1,88 @@ +#![feature(rustc_private)] + +// NOTE: For the example to compile, you will need to first run the following: +// rustup component add rustc-dev + +extern crate rustc_error_codes; +extern crate rustc_errors; +extern crate rustc_hash; +extern crate rustc_hir; +extern crate rustc_interface; +extern crate rustc_session; +extern crate rustc_span; + +use rustc_errors::registry; +use rustc_session::config; +use rustc_span::source_map; +use std::io; +use std::path; +use std::process; +use std::str; +use std::sync; + +// Buffer diagnostics in a Vec. +#[derive(Clone)] +pub struct DiagnosticSink(sync::Arc>>); + +impl io::Write for DiagnosticSink { + fn write(&mut self, buf: &[u8]) -> io::Result { + self.0.lock().unwrap().write(buf) + } + fn flush(&mut self) -> io::Result<()> { + self.0.lock().unwrap().flush() + } +} + +fn main() { + let out = process::Command::new("rustc") + .arg("--print=sysroot") + .current_dir(".") + .output() + .unwrap(); + let sysroot = str::from_utf8(&out.stdout).unwrap().trim(); + let buffer = sync::Arc::new(sync::Mutex::new(Vec::new())); + let config = rustc_interface::Config { + opts: config::Options { + maybe_sysroot: Some(path::PathBuf::from(sysroot)), + // Configure the compiler to emit diagnostics in compact JSON format. + error_format: config::ErrorOutputType::Json { + pretty: false, + json_rendered: rustc_errors::emitter::HumanReadableErrorType::Default( + rustc_errors::emitter::ColorConfig::Never, + ), + }, + ..config::Options::default() + }, + // This program contains a type error. + input: config::Input::Str { + name: source_map::FileName::Custom("main.rs".to_string()), + input: "fn main() { let x: &str = 1; }".to_string(), + }, + // Redirect the diagnostic output of the compiler to a buffer. + diagnostic_output: rustc_session::DiagnosticOutput::Raw(Box::from(DiagnosticSink( + buffer.clone(), + ))), + crate_cfg: rustc_hash::FxHashSet::default(), + input_path: None, + output_dir: None, + output_file: None, + file_loader: None, + stderr: None, + crate_name: None, + lint_caps: rustc_hash::FxHashMap::default(), + register_lints: None, + override_queries: None, + registry: registry::Registry::new(&rustc_error_codes::DIAGNOSTICS), + }; + rustc_interface::run_compiler(config, |compiler| { + compiler.enter(|queries| { + queries.global_ctxt().unwrap().take().enter(|tcx| { + // Run the analysis phase on the local crate to trigger the type error. + tcx.analysis(rustc_hir::def_id::LOCAL_CRATE); + }); + }); + }); + // Read buffered diagnostics. + let diagnostics = String::from_utf8(buffer.lock().unwrap().clone()).unwrap(); + println!("{}", diagnostics); +} diff --git a/src/doc/rustc-dev-guide/examples/rustc-driver-interacting-with-the-ast.rs b/src/doc/rustc-dev-guide/examples/rustc-driver-interacting-with-the-ast.rs new file mode 100644 index 0000000000..8ee38206f7 --- /dev/null +++ b/src/doc/rustc-dev-guide/examples/rustc-driver-interacting-with-the-ast.rs @@ -0,0 +1,89 @@ +#![feature(rustc_private)] + +// NOTE: For the example to compile, you will need to first run the following: +// rustup component add rustc-dev llvm-tools-preview + +extern crate rustc_ast_pretty; +extern crate rustc_error_codes; +extern crate rustc_errors; +extern crate rustc_hash; +extern crate rustc_hir; +extern crate rustc_interface; +extern crate rustc_session; +extern crate rustc_span; + +use rustc_ast_pretty::pprust::item_to_string; +use rustc_errors::registry; +use rustc_session::config; +use rustc_session::config::PpMode::PpmSource; +use rustc_session::config::PpSourceMode::PpmExpanded; +use rustc_span::source_map; +use std::path; +use std::process; +use std::str; + +fn main() { + let out = process::Command::new("rustc") + .arg("--print=sysroot") + .current_dir(".") + .output() + .unwrap(); + let sysroot = str::from_utf8(&out.stdout).unwrap().trim(); + let config = rustc_interface::Config { + opts: config::Options { + maybe_sysroot: Some(path::PathBuf::from(sysroot)), + ..config::Options::default() + }, + input: config::Input::Str { + name: source_map::FileName::Custom("main.rs".to_string()), + input: "fn main() { let message = \"Hello, world!\"; println!(\"{}\", message); }" + .to_string(), + }, + diagnostic_output: rustc_session::DiagnosticOutput::Default, + crate_cfg: rustc_hash::FxHashSet::default(), + input_path: None, + output_dir: None, + output_file: None, + file_loader: None, + stderr: None, + crate_name: None, + lint_caps: rustc_hash::FxHashMap::default(), + register_lints: None, + override_queries: None, + make_codegen_backend: None, + registry: registry::Registry::new(&rustc_error_codes::DIAGNOSTICS), + }; + rustc_interface::run_compiler(config, |compiler| { + compiler.enter(|queries| { + // TODO: add this to -Z unpretty + let ast_krate = queries.parse().unwrap().take(); + let ast_krate_mod = ast_krate.module; + for item in ast_krate_mod.items { + println!("{}", item_to_string(&item)); + } + + // Analyze the crate and inspect the types under the cursor. + queries.global_ctxt().unwrap().take().enter(|tcx| { + // Every compilation contains a single crate. + let hir_krate = tcx.hir().krate(); + // Iterate over the top-level items in the crate, looking for the main function. + for (_, item) in &hir_krate.items { + // Use pattern-matching to find a specific node inside the main function. + if let rustc_hir::ItemKind::Fn(_, _, body_id) = item.kind { + let expr = &tcx.hir().body(body_id).value; + if let rustc_hir::ExprKind::Block(block, _) = expr.kind { + if let rustc_hir::StmtKind::Local(local) = block.stmts[0].kind { + if let Some(expr) = local.init { + let hir_id = expr.hir_id; // hir_id identifies the string "Hello, world!" + let def_id = tcx.hir().local_def_id(item.hir_id); // def_id identifies the main function + let ty = tcx.typeck(def_id).node_type(hir_id); + println!("{:?}: {:?}", expr, ty); // prints expr(HirId { owner: DefIndex(3), local_id: 4 }: "Hello, world!"): &'static str + } + } + } + } + } + }) + }); + }); +} diff --git a/src/doc/rustc-dev-guide/src/SUMMARY.md b/src/doc/rustc-dev-guide/src/SUMMARY.md index d6cbe0645d..3f14c26421 100644 --- a/src/doc/rustc-dev-guide/src/SUMMARY.md +++ b/src/doc/rustc-dev-guide/src/SUMMARY.md @@ -2,134 +2,160 @@ [About this guide](./about-this-guide.md) +[Getting Started](./getting-started.md) + --- -- [Part 1: Building, debugging, and contributing to Rustc](./part-1-intro.md) - - [About the compiler team](./compiler-team.md) - - [How to Build and Run the Compiler](./building/how-to-build-and-run.md) - - [Suggested Workflows](./building/suggested.md) - - [Bootstrapping](./building/bootstrapping.md) - - [Distribution artifacts](./building/build-install-distribution-artifacts.md) - - [Documenting Compiler](./building/compiler-documenting.md) - - [ctags](./building/ctags.md) - - [The compiler testing framework](./tests/intro.md) - - [Running tests](./tests/running.md) - - [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) - - [Debugging the Compiler](./compiler-debugging.md) - - [Profiling the compiler](./profiling.md) - - [with the linux perf tool](./profiling/with_perf.md) - - [Coding conventions](./conventions.md) - - [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) - - ["Cleanup Crew" ICE-breakers](ice-breaker/cleanup-crew.md) - - [LLVM ICE-breakers](ice-breaker/llvm.md) - - [Licenses](./licenses.md) - -- [Part 2: High-level Compiler Architecture](./part-2-intro.md) - - [Overview of the Compiler](./overview.md) - - [The compiler source code](./compiler-src.md) - - [Queries: demand-driven compilation](./query.md) - - [The Query Evaluation Model in Detail](./queries/query-evaluation-model-in-detail.md) - - [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) - - [Memory Management in Rustc](./memory.md) - -- [Part 3: Source Code Representations](./part-3-intro.md) - - [The Rustc Driver and Interface](./rustc-driver.md) - - [Rustdoc](./rustdoc.md) - - [Ex: Type checking through `rustc_interface`](./rustc-driver-interacting-with-the-ast.md) - - [Syntax and the AST](./syntax-intro.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) - - [AST Validation](./ast-validation.md) - - [Feature Gate Checking](./feature-gate-ck.md) - - [The HIR (High-level IR)](./hir.md) - - [Lowering AST to HIR](./lowering.md) - - [Debugging](./hir-debugging.md) - - [The MIR (Mid-level IR)](./mir/index.md) - - [HAIR and MIR construction](./mir/construction.md) - - [MIR visitor and traversal](./mir/visitor.md) - - [MIR passes: getting the MIR for a function](./mir/passes.md) - - [Closure expansion](./closure.md) - -- [Part 4: Analysis](./part-4-intro.md) - - [The `ty` module: representing types](./ty.md) - - [Generics and substitutions](./generics.md) - - [`TypeFolder` and `TypeFoldable`](./ty-fold.md) - - [Generic arguments](./generic_arguments.md) - - [Type inference](./type-inference.md) - - [Trait solving (old-style)](./traits/resolution.md) - - [Higher-ranked trait bounds](./traits/hrtb.md) - - [Caching subtleties](./traits/caching.md) - - [Specialization](./traits/specialization.md) - - [Trait solving (new-style)](./traits/index.md) +# Building and debugging `rustc` + +- [How to Build and Run the Compiler](./building/how-to-build-and-run.md) + - [Prerequisites](./building/prerequisites.md) + - [Suggested Workflows](./building/suggested.md) + - [Distribution artifacts](./building/build-install-distribution-artifacts.md) + - [Documenting Compiler](./building/compiler-documenting.md) + - [Rustdoc overview](./rustdoc.md) + - [ctags](./building/ctags.md) + - [Adding a new target](./building/new-target.md) +- [The compiler testing framework](./tests/intro.md) + - [Running tests](./tests/running.md) + - [Adding new tests](./tests/adding.md) + - [Using `compiletest` commands to control test execution](./compiletest.md) +- [Debugging the Compiler](./compiler-debugging.md) +- [Profiling the compiler](./profiling.md) + - [with the linux perf tool](./profiling/with_perf.md) + - [with Windows Performance Analyzer](./profiling/wpa_profiling.md) +- [crates.io Dependencies](./crates-io.md) + + +# Contributing to Rust + +- [Introduction](./contributing.md) +- [About the compiler team](./compiler-team.md) +- [Using Git](./git.md) +- [Mastering @rustbot](./rustbot.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) +- [Feature Gates](./feature-gates.md) +- [Coding conventions](./conventions.md) +- [Notification groups](notification-groups/about.md) + - [ARM](notification-groups/arm.md) + - [Cleanup Crew](notification-groups/cleanup-crew.md) + - [LLVM](notification-groups/llvm.md) + - [RISC-V](notification-groups/risc-v.md) + - [Windows](notification-groups/windows.md) +- [Licenses](./licenses.md) + +# High-level Compiler Architecture + +- [Prologue](./part-2-intro.md) +- [Overview of the Compiler](./overview.md) +- [The compiler source code](./compiler-src.md) +- [Bootstrapping](./building/bootstrapping.md) +- [Queries: demand-driven compilation](./query.md) + - [The Query Evaluation Model in Detail](./queries/query-evaluation-model-in-detail.md) + - [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) +- [Memory Management in Rustc](./memory.md) +- [Serialization in Rustc](./serialization.md) +- [Parallel Compilation](./parallel-rustc.md) +- [Rustdoc internals](./rustdoc-internals.md) + +# Source Code Representation + +- [Prologue](./part-3-intro.md) +- [Command-line arguments](./cli.md) +- [The Rustc Driver and Interface](./rustc-driver.md) + - [Ex: Type checking through `rustc_interface`](./rustc-driver-interacting-with-the-ast.md) + - [Ex: Getting diagnostics through `rustc_interface`](./rustc-driver-getting-diagnostics.md) +- [Syntax and the AST](./syntax-intro.md) + - [Lexing and Parsing](./the-parser.md) + - [Macro expansion](./macro-expansion.md) + - [Name resolution](./name-resolution.md) + - [`#[test]` Implementation](./test-implementation.md) + - [Panic Implementation](./panic-implementation.md) + - [AST Validation](./ast-validation.md) + - [Feature Gate Checking](./feature-gate-ck.md) +- [The HIR (High-level IR)](./hir.md) + - [Lowering AST to HIR](./lowering.md) + - [Debugging](./hir-debugging.md) +- [The THIR (Typed High-level IR)](./thir.md) +- [The MIR (Mid-level IR)](./mir/index.md) + - [MIR construction](./mir/construction.md) + - [MIR visitor and traversal](./mir/visitor.md) + - [MIR passes: getting the MIR for a function](./mir/passes.md) +- [Identifiers in the Compiler](./identifiers.md) +- [Closure expansion](./closure.md) + +# Analysis + +- [Prologue](./part-4-intro.md) +- [The `ty` module: representing types](./ty.md) + - [Generics and substitutions](./generics.md) + - [`TypeFolder` and `TypeFoldable`](./ty-fold.md) + - [Generic arguments](./generic_arguments.md) +- [Type inference](./type-inference.md) +- [Trait solving](./traits/resolution.md) + - [Early and Late Bound Parameters](./early-late-bound.md) + - [Higher-ranked trait bounds](./traits/hrtb.md) + - [Caching subtleties](./traits/caching.md) + - [Specialization](./traits/specialization.md) + - [Chalk-based trait solving](./traits/chalk.md) - [Lowering to logic](./traits/lowering-to-logic.md) - - [Goals and clauses](./traits/goals-and-clauses.md) - - [Equality and associated types](./traits/associated-types.md) - - [Implied bounds](./traits/implied-bounds.md) - - [Region constraints](./traits/regions.md) - - [The lowering module in rustc](./traits/lowering-module.md) - - [Lowering rules](./traits/lowering-rules.md) - - [Well-formedness checking](./traits/wf.md) + - [Goals and clauses](./traits/goals-and-clauses.md) - [Canonical queries](./traits/canonical-queries.md) - - [Canonicalization](./traits/canonicalization.md) - - [The SLG solver](./traits/slg.md) - - [An Overview of Chalk](./traits/chalk-overview.md) - - [Bibliography](./traits/bibliography.md) - - [Type checking](./type-checking.md) - - [Method Lookup](./method-lookup.md) - - [Variance](./variance.md) - - [Opaque Types](./opaque-types-type-alias-impl-trait.md) - - [Pattern and Exhaustiveness Checking](./pat-exhaustive-checking.md) - - [The borrow checker](./borrow_check.md) - - [Tracking moves and initialization](./borrow_check/moves_and_initialization.md) - - [Move paths](./borrow_check/moves_and_initialization/move_paths.md) - - [MIR type checker](./borrow_check/type_check.md) - - [Region inference](./borrow_check/region_inference.md) - - [Constraint propagation](./borrow_check/region_inference/constraint_propagation.md) - - [Lifetime parameters](./borrow_check/region_inference/lifetime_parameters.md) - - [Member constraints](./borrow_check/region_inference/member_constraints.md) - - [Placeholders and universes][pau] - - [Closure constraints](./borrow_check/region_inference/closure_constraints.md) - - [Error reporting](./borrow_check/region_inference/error_reporting.md) - - [Two-phase-borrows](./borrow_check/two_phase_borrows.md) - - [Parameter Environments](./param_env.md) - -- [Part 5: From MIR to binaries](./part-5-intro.md) - - [The MIR (Mid-level IR)](./mir/index.md) - - [MIR optimizations](./mir/optimizations.md) - - [Debugging](./mir/debugging.md) - - [Constant evaluation](./const-eval.md) - - [miri const evaluator](./miri.md) - - [Monomorphization](./backend/monomorph.md) - - [Lowering MIR](./backend/lowering-mir.md) - - [Code Generation](./backend/codegen.md) - - [Updating LLVM](./backend/updating-llvm.md) - - [Debugging LLVM](./backend/debugging.md) - - [Backend Agnostic Codegen](./backend/backend-agnostic.md) - - [Implicit Caller Location](./codegen/implicit-caller-location.md) - - [Profile-guided Optimization](./profile-guided-optimization.md) - - [Sanitizers Support](./sanitizers.md) - - [Debugging Support in Rust Compiler](./debugging-support-in-rustc.md) +- [Type checking](./type-checking.md) + - [Method Lookup](./method-lookup.md) + - [Variance](./variance.md) + - [Opaque Types](./opaque-types-type-alias-impl-trait.md) +- [Pattern and Exhaustiveness Checking](./pat-exhaustive-checking.md) +- [MIR dataflow](./mir/dataflow.md) +- [The borrow checker](./borrow_check.md) + - [Tracking moves and initialization](./borrow_check/moves_and_initialization.md) + - [Move paths](./borrow_check/moves_and_initialization/move_paths.md) + - [MIR type checker](./borrow_check/type_check.md) + - [Region inference](./borrow_check/region_inference.md) + - [Constraint propagation](./borrow_check/region_inference/constraint_propagation.md) + - [Lifetime parameters](./borrow_check/region_inference/lifetime_parameters.md) + - [Member constraints](./borrow_check/region_inference/member_constraints.md) + - [Placeholders and universes][pau] + - [Closure constraints](./borrow_check/region_inference/closure_constraints.md) + - [Error reporting](./borrow_check/region_inference/error_reporting.md) + - [Two-phase-borrows](./borrow_check/two_phase_borrows.md) +- [Parameter Environments](./param_env.md) +- [Errors and Lints](diagnostics.md) + - [Creating Errors With SessionDiagnostic](./diagnostics/sessiondiagnostic.md) + - [`LintStore`](./diagnostics/lintstore.md) + - [Diagnostic Codes](./diagnostics/diagnostic-codes.md) + +# MIR to Binaries + +- [Prologue](./part-5-intro.md) +- [MIR optimizations](./mir/optimizations.md) +- [Debugging](./mir/debugging.md) +- [Constant evaluation](./const-eval.md) + - [miri const evaluator](./miri.md) +- [Monomorphization](./backend/monomorph.md) +- [Lowering MIR](./backend/lowering-mir.md) +- [Code Generation](./backend/codegen.md) + - [Updating LLVM](./backend/updating-llvm.md) + - [Debugging LLVM](./backend/debugging.md) + - [Backend Agnostic Codegen](./backend/backend-agnostic.md) + - [Implicit Caller Location](./backend/implicit-caller-location.md) +- [Libraries and Metadata](./backend/libs-and-metadata.md) +- [Profile-guided Optimization](./profile-guided-optimization.md) +- [LLVM Source-Based Code Coverage](./llvm-coverage-instrumentation.md) +- [Sanitizers Support](./sanitizers.md) +- [Debugging Support in the Rust Compiler](./debugging-support-in-rustc.md) --- -[Appendix A: Background material](./appendix/background.md) +[Appendix A: Background topics](./appendix/background.md) [Appendix B: Glossary](./appendix/glossary.md) [Appendix C: Code Index](./appendix/code-index.md) [Appendix D: Compiler Lecture Series](./appendix/compiler-lecture.md) diff --git a/src/doc/rustc-dev-guide/src/about-this-guide.md b/src/doc/rustc-dev-guide/src/about-this-guide.md index 58b0cb9f0c..d12f5a7a34 100644 --- a/src/doc/rustc-dev-guide/src/about-this-guide.md +++ b/src/doc/rustc-dev-guide/src/about-this-guide.md @@ -6,9 +6,12 @@ development. There are six parts to this guide: -1. [Building, Debugging, and Contributing to `rustc`][p1]: Contains information that should be useful no matter how - you are contributing, such as procedures for contribution, building the - compiler, etc. +1. [Building and debugging `rustc`][p1]: Contains information that should be + useful no matter how you are contributing, about building, debugging, + profiling, etc. +2. [Contributing to `rustc`][p1-5]: Contains information that should be useful + no matter how you are contributing, about procedures for contribution, + stabilizing features, etc. 2. [High-Level Compiler Architecture][p2]: Discusses the high-level architecture of the compiler and stages of the compile process. 3. [Source Code Representation][p3]: Describes the process of taking raw source code from the user and @@ -17,19 +20,37 @@ There are six parts to this guide: properties of the code and inform later stages of the compile process (e.g., type checking). 5. [From MIR to Binaries][p5]: How linked executable machine code is generated. 6. [Appendices][app] at the end with useful reference information. There are a - few of these with different information, inluding a glossary. + few of these with different information, including a glossary. -[p1]: ./part-1-intro.md +[p1]: ./getting-started.md +[p1-5]: ./compiler-team.md [p2]: ./part-2-intro.md [p3]: ./part-3-intro.md [p4]: ./part-4-intro.md [p5]: ./part-5-intro.md [app]: ./appendix/background.md -The Guide itself is of course open-source as well, and the sources can -be found at the [GitHub repository]. If you find any mistakes in the -guide, please file an issue about it, or even better, open a PR -with a correction! +### Constant change + +Keep in mind that `rustc` is a real production-quality product, being worked upon continuously by a +sizeable set of contributors. +As such, it has its fair share of codebase churn and technical debt. +In addition, many of the ideas discussed throughout this guide are idealized designs that are not +fully realized yet. +All this makes keeping this guide completely up to date on everything very hard! + +The Guide itself is of course open-source as well, and the sources can be found at the +[GitHub repository]. +If you find any mistakes in the guide, please file an issue about it, or even better, open a PR with +a correction! + +If you do contribute to the guide, please see the corresponding +[subsection on writing documentation in this guide]. + +[subsection on writing documentation in this guide]: contributing.md#contributing-to-rustc-dev-guide + +> “‘All conditioned things are impermanent’ — when one sees this with wisdom, one turns away from +> suffering.” _The Dhammapada, verse 277_ ## Other places to find information diff --git a/src/doc/rustc-dev-guide/src/appendix/background.md b/src/doc/rustc-dev-guide/src/appendix/background.md index 50a550dc8d..ae6136dd55 100644 --- a/src/doc/rustc-dev-guide/src/appendix/background.md +++ b/src/doc/rustc-dev-guide/src/appendix/background.md @@ -1,4 +1,4 @@ -# Appendix B: Background topics +# Background topics This section covers a numbers of common compiler terms that arise in this guide. We try to give the general definition while providing some @@ -8,10 +8,10 @@ Rust-specific context. ## What is a control-flow graph? -A control-flow graph is a common term from compilers. If you've ever +A control-flow graph (CFG) is a common term from compilers. If you've ever used a flow-chart, then the concept of a control-flow graph will be pretty familiar to you. It's a representation of your program that -exposes the underlying control flow in a very clear way. +clearly exposes the underlying control flow. A control-flow graph is structured as a set of **basic blocks** connected by edges. The key idea of a basic block is that it is a set @@ -44,12 +44,17 @@ if some_variable { d = 1; ``` -This would compile into four basic blocks: +This would compile into four basic blocks in MIR. In textual form, it looks like +this: ```mir BB0: { a = 1; - if some_variable { goto BB1 } else { goto BB2 } + if some_variable { + goto BB1; + } else { + goto BB2; + } } BB1: { @@ -64,10 +69,33 @@ BB2: { BB3: { d = 1; - ...; + ... } ``` +In graphical form, it looks like this: + +``` + BB0 + +--------------------+ + | a = 1; | + +--------------------+ + / \ + if some_variable else + / \ + BB1 / \ BB2 + +-----------+ +-----------+ + | b = 1; | | c = 1; | + +-----------+ +-----------+ + \ / + \ / + \ BB3 / + +----------+ + | d = 1; | + | ... | + +----------+ +``` + When using a control-flow graph, a loop simply appears as a cycle in the graph, and the `break` keyword translates into a path out of that cycle. @@ -79,17 +107,159 @@ cycle. [*Static Program Analysis*](https://cs.au.dk/~amoeller/spa/) by Anders Møller and Michael I. Schwartzbach is an incredible resource! -*to be written* +_Dataflow analysis_ is a type of static analysis that is common in many +compilers. It describes a general technique, rather than a particular analysis. + +The basic idea is that we can walk over a [control-flow graph (CFG)](#cfg) and +keep track of what some value could be. At the end of the walk, we might have +shown that some claim is true or not necessarily true (e.g. "this variable must +be initialized"). `rustc` tends to do dataflow analyses over the MIR, since MIR +is already a CFG. + +For example, suppose we want to check that `x` is initialized before it is used +in this snippet: + +```rust,ignore +fn foo() { + let mut x; + + if some_cond { + x = 1; + } + + dbg!(x); +} +``` + +A CFG for this code might look like this: + +```txt + +------+ + | Init | (A) + +------+ + | \ + | if some_cond + else \ +-------+ + | \| x = 1 | (B) + | +-------+ + | / + +---------+ + | dbg!(x) | (C) + +---------+ +``` + +We can do the dataflow analysis as follows: we will start off with a flag `init` +which indicates if we know `x` is initialized. As we walk the CFG, we will +update the flag. At the end, we can check its value. + +So first, in block (A), the variable `x` is declared but not initialized, so +`init = false`. In block (B), we initialize the value, so we know that `x` is +initialized. So at the end of (B), `init = true`. + +Block (C) is where things get interesting. Notice that there are two incoming +edges, one from (A) and one from (B), corresponding to whether `some_cond` is true or not. +But we cannot know that! It could be the case the `some_cond` is always true, +so that `x` is actually always initialized. It could also be the case that +`some_cond` depends on something random (e.g. the time), so `x` may not be +initialized. In general, we cannot know statically (due to [Rice's +Theorem][rice]). So what should the value of `init` be in block (C)? + +[rice]: https://en.wikipedia.org/wiki/Rice%27s_theorem + +Generally, in dataflow analyses, if a block has multiple parents (like (C) in +our example), its dataflow value will be some function of all its parents (and +of course, what happens in (C)). Which function we use depends on the analysis +we are doing. + +In this case, we want to be able to prove definitively that `x` must be +initialized before use. This forces us to be conservative and assume that +`some_cond` might be false sometimes. So our "merging function" is "and". That +is, `init = true` in (C) if `init = true` in (A) _and_ in (B) (or if `x` is +initialized in (C)). But this is not the case; in particular, `init = false` in +(A), and `x` is not initialized in (C). Thus, `init = false` in (C); we can +report an error that "`x` may not be initialized before use". + +There is definitely a lot more that can be said about dataflow analyses. There is an +extensive body of research literature on the topic, including a lot of theory. +We only discussed a forwards analysis, but backwards dataflow analysis is also +useful. For example, rather than starting from block (A) and moving forwards, +we might have started with the usage of `x` and moved backwards to try to find +its initialization. ## What is "universally quantified"? What about "existentially quantified"? -*to be written* +In math, a predicate may be _universally quantified_ or _existentially +quantified_: + +- _Universal_ quantification: + - the predicate holds if it is true for all possible inputs. + - Traditional notation: ∀x: P(x). Read as "for all x, P(x) holds". +- _Existential_ quantification: + - the predicate holds if there is any input where it is true, i.e., there + only has to be a single input. + - Traditional notation: ∃x: P(x). Read as "there exists x such that P(x) holds". + +In Rust, they come up in type checking and trait solving. For example, + +```rust,ignore +fn foo() +``` +This function claims that the function is well-typed for all types `T`: `∀ T: well_typed(foo)`. + +Another example: + +```rust,ignore +fn foo<'a>(_: &'a usize) +``` +This function claims that for any lifetime `'a` (determined by the +caller), it is well-typed: `∀ 'a: well_typed(foo)`. + +Another example: + +```rust,ignore +fn foo() +where for<'a> F: Fn(&'a u8) +``` +This function claims that it is well-typed for all types `F` such that for all +lifetimes `'a`, `F: Fn(&'a u8)`: `∀ F: ∀ 'a: (F: Fn(&'a u8)) => well_typed(foo)`. + +One more example: + +```rust,ignore +fn foo(_: dyn Debug) +``` +This function claims that there exists some type `T` that implements `Debug` +such that the function is well-typed: `∃ T: (T: Debug) and well_typed(foo)`. -## What is co- and contra-variance? +## What is a de Bruijn Index? + +[De Bruijn indices][wikideb] are a way of representing, using only integers, +which variables are bound in which binders. They were originally invented for +use in lambda calculus evaluation (see [this Wikipedia article][wikideb] for +more). In `rustc`, we use de Bruijn indices to [represent generic types][sub]. + +[wikideb]: https://en.wikipedia.org/wiki/De_Bruijn_index +[sub]: ../generics.md + +Here is a basic example of how de Bruijn indices might be used for closures (we +don't actually do this in `rustc` though!): + +```rust,ignore +|x| { + f(x) // de Bruijn index of `x` is 1 because `x` is bound 1 level up + + |y| { + g(x, y) // index of `x` is 2 because it is bound 2 levels up + // index of `y` is 1 because it is bound 1 level up + } +} +``` + +## What are co- and contra-variance? Check out the subtyping chapter from the [Rust Nomicon](https://doc.rust-lang.org/nomicon/subtyping.html). @@ -104,17 +274,16 @@ the type checker handles variance. Let's describe the concepts of free vs bound in terms of program variables, since that's the thing we're most familiar with. -- Consider this expression, which creates a closure: `|a, - b| a + b`. Here, the `a` and `b` in `a + b` refer to the arguments - that the closure will be given when it is called. We say that the - `a` and `b` there are **bound** to the closure, and that the closure - signature `|a, b|` is a **binder** for the names `a` and `b` - (because any references to `a` or `b` within refer to the variables - that it introduces). -- Consider this expression: `a + b`. In this expression, `a` and `b` - refer to local variables that are defined *outside* of the - expression. We say that those variables **appear free** in the - expression (i.e., they are **free**, not **bound** (tied up)). +- Consider this expression, which creates a closure: `|a, b| a + b`. + Here, the `a` and `b` in `a + b` refer to the arguments that the closure will + be given when it is called. We say that the `a` and `b` there are **bound** to + the closure, and that the closure signature `|a, b|` is a **binder** for the + names `a` and `b` (because any references to `a` or `b` within refer to the + variables that it introduces). +- Consider this expression: `a + b`. In this expression, `a` and `b` refer to + local variables that are defined *outside* of the expression. We say that + those variables **appear free** in the expression (i.e., they are **free**, + not **bound** (tied up)). So there you have it: a variable "appears free" in some expression/statement/whatever if it refers to something defined @@ -133,7 +302,7 @@ does not. > recommendations, and to `tinaun` for posting a link to a [twitter thread from > Graydon Hoare](https://twitter.com/graydon_pub/status/1039615569132118016) > which had some more recommendations! -> +> > Other sources: https://gcc.gnu.org/wiki/ListOfCompilerBooks > > If you have other suggestions, please feel free to open an issue or PR. @@ -142,9 +311,9 @@ does not. - [Types and Programming Languages](https://www.cis.upenn.edu/~bcpierce/tapl/) - [Programming Language Pragmatics](https://www.cs.rochester.edu/~scott/pragmatics/) - [Practical Foundations for Programming Languages](https://www.cs.cmu.edu/~rwh/pfpl/2nded.pdf) -- [Compilers: Principles, Techniques, and Tools, 2nd Edition](https://www.amazon.com/dp/9332518661/ref=cm_sw_r_other_apa_1tUSBb5VHAVA1) +- [Compilers: Principles, Techniques, and Tools, 2nd Edition](https://www.pearson.com/us/higher-education/program/Aho-Compilers-Principles-Techniques-and-Tools-2nd-Edition/PGM167067.html) - [Garbage Collection: Algorithms for Automatic Dynamic Memory Management](https://www.cs.kent.ac.uk/people/staff/rej/gcbook/) -- [Linkers and Loaders](https://linker.iecc.com/) +- [Linkers and Loaders](https://www.amazon.com/Linkers-Kaufmann-Software-Engineering-Programming/dp/1558604960) (There are also free versions of this, but the version we had linked seems to be offline at the moment.) - [Advanced Compiler Design and Implementation](https://www.goodreads.com/book/show/887908.Advanced_Compiler_Design_and_Implementation) - [Building an Optimizing Compiler](https://www.goodreads.com/book/show/2063103.Building_an_Optimizing_Compiler) - [Crafting Interpreters](http://www.craftinginterpreters.com/) @@ -160,4 +329,4 @@ does not. ## Misc Papers and Blog Posts - [Programming in Martin-Löf's Type Theory](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.118.6683&rep=rep1&type=pdf) -- [Polymorphism, Subtyping, and Type Inference in MLsub](https://www.cl.cam.ac.uk/~sd601/papers/mlsub-preprint.pdf) +- [Polymorphism, Subtyping, and Type Inference in MLsub](https://dl.acm.org/doi/10.1145/3093333.3009882) diff --git a/src/doc/rustc-dev-guide/src/appendix/bibliography.md b/src/doc/rustc-dev-guide/src/appendix/bibliography.md index ff09a26b0d..c8b4a23b34 100644 --- a/src/doc/rustc-dev-guide/src/appendix/bibliography.md +++ b/src/doc/rustc-dev-guide/src/appendix/bibliography.md @@ -7,30 +7,30 @@ Rust, as well as publications about Rust. ## Type system * [Region based memory management in Cyclone](https://www.cs.umd.edu/projects/cyclone/papers/cyclone-regions.pdf) -* [Safe manual memory management in Cyclone](http://www.cs.umd.edu/projects/PL/cyclone/scp.pdf) +* [Safe manual memory management in Cyclone](https://www.cs.umd.edu/projects/PL/cyclone/scp.pdf) * [Making ad-hoc polymorphism less ad hoc](https://dl.acm.org/doi/10.1145/75277.75283) * [Macros that work together](https://www.cs.utah.edu/plt/publications/jfp12-draft-fcdf.pdf) * [Traits: composable units of behavior](http://scg.unibe.ch/archive/papers/Scha03aTraits.pdf) * [Alias burying](http://www.cs.uwm.edu/faculty/boyland/papers/unique-preprint.ps) - We tried something similar and abandoned it. * [External uniqueness is unique enough](http://www.cs.uu.nl/research/techreps/UU-CS-2002-048.html) * [Uniqueness and Reference Immutability for Safe Parallelism](https://research.microsoft.com/pubs/170528/msr-tr-2012-79.pdf) -* [Region Based Memory Management](http://www.cs.ucla.edu/~palsberg/tba/papers/tofte-talpin-iandc97.pdf) +* [Region Based Memory Management](https://www.cs.ucla.edu/~palsberg/tba/papers/tofte-talpin-iandc97.pdf) ## Concurrency * [Singularity: rethinking the software stack](https://research.microsoft.com/pubs/69431/osr2007_rethinkingsoftwarestack.pdf) * [Language support for fast and reliable message passing in singularity OS](https://research.microsoft.com/pubs/67482/singsharp.pdf) * [Scheduling multithreaded computations by work stealing](http://supertech.csail.mit.edu/papers/steal.pdf) -* [Thread scheduling for multiprogramming multiprocessors](http://www.eecis.udel.edu/%7Ecavazos/cisc879-spring2008/papers/arora98thread.pdf) +* [Thread scheduling for multiprogramming multiprocessors](https://www.eecis.udel.edu/%7Ecavazos/cisc879-spring2008/papers/arora98thread.pdf) * [The data locality of work stealing](http://www.aladdin.cs.cmu.edu/papers/pdfs/y2000/locality_spaa00.pdf) -* [Dynamic circular work stealing deque](http://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.170.1097&rep=rep1&type=pdf) - The Chase/Lev deque -* [Work-first and help-first scheduling policies for async-finish task parallelism](http://www.cs.rice.edu/%7Eyguo/pubs/PID824943.pdf) - More general than fully-strict work stealing +* [Dynamic circular work stealing deque](https://citeseerx.ist.psu.edu/viewdoc/download?doi=10.1.1.170.1097&rep=rep1&type=pdf) - The Chase/Lev deque +* [Work-first and help-first scheduling policies for async-finish task parallelism](https://dl.acm.org/doi/10.1109/IPDPS.2009.5161079) - More general than fully-strict work stealing * [A Java fork/join calamity](https://web.archive.org/web/20190904045322/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) +* [Scheduling techniques for concurrent systems](https://www.stanford.edu/~ouster/cgi-bin/papers/coscheduling.pdf) +* [Contention aware scheduling](https://www.blagodurov.net/files/a8-blagodurov.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) +* [Three layer cake for shared-memory programming](https://dl.acm.org/doi/10.1145/1953611.1953616) +* [Non-blocking steal-half work queues](https://www.cs.bgu.ac.il/%7Ehendlerd/papers/p280-hendler.pdf) * [Reagents: expressing and composing fine-grained concurrency](https://aturon.github.io/academic/reagents.pdf) * [Algorithms for scalable synchronization of shared-memory multiprocessors](https://www.cs.rochester.edu/u/scott/papers/1991_TOCS_synch.pdf) * [Epoch-based reclamation](https://www.cl.cam.ac.uk/techreports/UCAM-CL-TR-579.pdf). @@ -38,8 +38,8 @@ Rust, as well as publications about Rust. ## Others * [Crash-only software](https://www.usenix.org/legacy/events/hotos03/tech/full_papers/candea/candea.pdf) -* [Composing High-Performance Memory Allocators](http://people.cs.umass.edu/~emery/pubs/berger-pldi2001.pdf) -* [Reconsidering Custom Memory Allocation](http://people.cs.umass.edu/~emery/pubs/berger-oopsla2002.pdf) +* [Composing High-Performance Memory Allocators](https://people.cs.umass.edu/~emery/pubs/berger-pldi2001.pdf) +* [Reconsidering Custom Memory Allocation](https://people.cs.umass.edu/~emery/pubs/berger-oopsla2002.pdf) ## Papers *about* Rust @@ -51,10 +51,10 @@ Rust, as well as publications about Rust. idea](https://www.usenix.org/conference/hotpar12/parallel-closures-new-twist-old-idea) - not exactly about Rust, but by nmatsakis * [Patina: A Formalization of the Rust Programming - Language](http://dada.cs.washington.edu/research/tr/2015/03/UW-CSE-15-03-02.pdf). + Language](https://dada.cs.washington.edu/research/tr/2015/03/UW-CSE-15-03-02.pdf). Early formalization of a subset of the type system, by Eric Reed. * [Experience Report: Developing the Servo Web Browser Engine using - Rust](http://arxiv.org/abs/1505.07383). By Lars Bergstrom. + Rust](https://arxiv.org/abs/1505.07383). By Lars Bergstrom. * [Implementing a Generic Radix Trie in Rust](https://michaelsproul.github.io/rust_radix_paper/rust-radix-sproul.pdf). Undergrad paper by Michael Sproul. @@ -67,24 +67,25 @@ Rust, as well as publications about Rust. in Rust](http://spw15.langsec.org/papers/couprie-nom.pdf). By Geoffroy Couprie, research for VLC. * [Graph-Based Higher-Order Intermediate - Representation](http://compilers.cs.uni-saarland.de/papers/lkh15_cgo.pdf). An + Representation](https://compilers.cs.uni-saarland.de/papers/lkh15_cgo.pdf). An experimental IR implemented in Impala, a Rust-like language. * [Code Refinement of Stencil - Codes](http://compilers.cs.uni-saarland.de/papers/ppl14_web.pdf). Another + Codes](https://compilers.cs.uni-saarland.de/papers/ppl14_web.pdf). Another paper using Impala. * [Parallelization in Rust with fork-join and friends](http://publications.lib.chalmers.se/records/fulltext/219016/219016.pdf). Linus Farnstrand's master's thesis. * [Session Types for - Rust](http://munksgaard.me/papers/laumann-munksgaard-larsen.pdf). Philip + Rust](https://munksgaard.me/papers/laumann-munksgaard-larsen.pdf). Philip Munksgaard's master's thesis. Research for Servo. -* [Ownership is Theft: Experiences Building an Embedded OS in Rust - Amit Levy, et. al.](http://amitlevy.com/papers/tock-plos2015.pdf) +* [Ownership is Theft: Experiences Building an Embedded OS in Rust - Amit Levy, et. al.](https://amitlevy.com/papers/tock-plos2015.pdf) * [You can't spell trust without Rust](https://raw.githubusercontent.com/Gankro/thesis/master/thesis.pdf). Alexis Beingessner's master's thesis. -* [Rust-Bio: a fast and safe bioinformatics library](http://bioinformatics.oxfordjournals.org/content/early/2015/10/06/bioinformatics.btv573). Johannes Köster -* [Safe, Correct, and Fast Low-Level Networking](http://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.704.1768). Robert Clipsham's master's thesis. -* [Formalizing Rust traits](http://hdl.handle.net/2429/55609). Jonatan Milewski's master's thesis. -* [Rust as a Language for High Performance GC Implementation](http://users.cecs.anu.edu.au/~steveb/downloads/pdf/rust-ismm-2016.pdf) +* [Rust-Bio: a fast and safe bioinformatics library](https://academic.oup.com/bioinformatics/article/32/3/444/1743419). Johannes Köster +* [Safe, Correct, and Fast Low-Level Networking](https://citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.704.1768). Robert Clipsham's master's thesis. +* [Formalizing Rust traits](https://open.library.ubc.ca/cIRcle/collections/ubctheses/24/items/1.0220521). Jonatan Milewski's master's thesis. +* [Rust as a Language for High Performance GC Implementation](https://users.cecs.anu.edu.au/~steveb/downloads/pdf/rust-ismm-2016.pdf) * [Simple Verification of Rust Programs via Functional Purification](https://github.com/Kha/electrolysis). Sebastian Ullrich's master's thesis. * [Writing parsers like it is 2017](http://spw17.langsec.org/papers/chifflier-parsing-in-2017.pdf) Pierre Chifflier and Geoffroy Couprie for the Langsec Workshop * [The Case for Writing a Kernel in Rust](https://www.tockos.org/assets/papers/rust-kernel-apsys2017.pdf) * [RustBelt: Securing the Foundations of the Rust Programming Language](https://plv.mpi-sws.org/rustbelt/popl18/) +* [Oxide: The Essence of Rust](https://arxiv.org/abs/1903.00982). By Aaron Weiss, Olek Gierczak, Daniel Patterson, Nicholas D. Matsakis, and Amal Ahmed. diff --git a/src/doc/rustc-dev-guide/src/appendix/code-index.md b/src/doc/rustc-dev-guide/src/appendix/code-index.md index a4b18ecc07..68d12be37b 100644 --- a/src/doc/rustc-dev-guide/src/appendix/code-index.md +++ b/src/doc/rustc-dev-guide/src/appendix/code-index.md @@ -1,4 +1,4 @@ -# Appendix D: Code Index +# Code Index rustc has a lot of important data structures. This is an attempt to give some guidance on where to learn more about some of the key data structures of the @@ -6,30 +6,30 @@ compiler. Item | Kind | Short description | Chapter | Declaration ----------------|----------|-----------------------------|--------------------|------------------- -`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_ast/ast.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/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) +`BodyId` | struct | One of four types of HIR node identifiers | [Identifiers in the HIR] | [compiler/rustc_hir/src/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] | [compiler/rustc_interface/src/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] | [compiler/rustc_ast/src/ast.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/ast/struct.Crate.html) +`rustc_hir::Crate` | struct | A more abstract, compiler-friendly form of a crate's AST | [The Hir] | [compiler/rustc_hir/src/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] | [compiler/rustc_hir/src/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] | [compiler/rustc_errors/src/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/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/librustc_ast/ast.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/node_id/struct.NodeId.html) -`P` | struct | An owned immutable smart pointer. By contrast, `&T` is not owned, and `Box` is not immutable. | None | [src/librustc_ast/ptr.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/ptr/struct.P.html) -`ParamEnv` | struct | Information about generic parameters or `Self`, useful for working with associated or generic items | [Parameter Environment] | [src/librustc_middle/ty/mod.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.ParamEnv.html) -`ParseSess` | struct | This struct contains information about a parsing session | [The parser] | [src/librustc_session/parse/parse.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_session/parse/struct.ParseSess.html) -`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_middle/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/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) -`rustc_ast::token_stream::TokenStream` | struct | An abstract sequence of tokens, organized into `TokenTree`s | [The parser], [Macro expansion] | [src/librustc_ast/tokenstream.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/tokenstream/struct.TokenStream.html) -`TraitDef` | struct | This struct contains a trait's definition with type information | [The `ty` modules] | [src/librustc_middle/ty/trait_def.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/trait_def/struct.TraitDef.html) -`TraitRef` | struct | The combination of a trait and its input types (e.g. `P0: Trait`) | [Trait Solving: Goals and Clauses], [Trait Solving: Lowering impls] | [src/librustc_middle/ty/sty.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.TraitRef.html) -`Ty<'tcx>` | struct | This is the internal representation of a type used for type checking | [Type checking] | [src/librustc_middle/ty/mod.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/type.Ty.html) -`TyCtxt<'tcx>` | struct | The "typing context". This is the central data structure in the compiler. It is the context that you use to perform all manner of queries | [The `ty` modules] | [src/librustc_middle/ty/context.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.TyCtxt.html) +`HirId` | struct | One of four types of HIR node identifiers | [Identifiers in the HIR] | [compiler/rustc_hir/src/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] | [compiler/rustc_ast/src/ast.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/node_id/struct.NodeId.html) +`P` | struct | An owned immutable smart pointer. By contrast, `&T` is not owned, and `Box` is not immutable. | None | [compiler/rustc_ast/src/ptr.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/ptr/struct.P.html) +`ParamEnv` | struct | Information about generic parameters or `Self`, useful for working with associated or generic items | [Parameter Environment] | [compiler/rustc_middle/src/ty/mod.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.ParamEnv.html) +`ParseSess` | struct | This struct contains information about a parsing session | [The parser] | [compiler/rustc_session/src/parse/parse.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_session/parse/struct.ParseSess.html) +`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] | [compiler/rustc_interface/src/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] | [compiler/rustc_resolve/src/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] | [compiler/rustc_session/src/session.rs](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] | [compiler/rustc_span/src/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] | [compiler/rustc_span/src/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] | [compiler/rustc_span/src/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] | [compiler/rustc_parse/src/lexer/mod.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/lexer/struct.StringReader.html) +`rustc_ast::token_stream::TokenStream` | struct | An abstract sequence of tokens, organized into `TokenTree`s | [The parser], [Macro expansion] | [compiler/rustc_ast/src/tokenstream.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/tokenstream/struct.TokenStream.html) +`TraitDef` | struct | This struct contains a trait's definition with type information | [The `ty` modules] | [compiler/rustc_middle/src/ty/trait_def.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/trait_def/struct.TraitDef.html) +`TraitRef` | struct | The combination of a trait and its input types (e.g. `P0: Trait`) | [Trait Solving: Goals and Clauses] | [compiler/rustc_middle/src/ty/sty.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.TraitRef.html) +`Ty<'tcx>` | struct | This is the internal representation of a type used for type checking | [Type checking] | [compiler/rustc_middle/src/ty/mod.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/type.Ty.html) +`TyCtxt<'tcx>` | struct | The "typing context". This is the central data structure in the compiler. It is the context that you use to perform all manner of queries | [The `ty` modules] | [compiler/rustc_middle/src/ty/context.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.TyCtxt.html) [The HIR]: ../hir.html [Identifiers in the HIR]: ../hir.html#hir-id @@ -43,4 +43,3 @@ Item | Kind | Short description | Chapter | [Name resolution]: ../name-resolution.html [Parameter Environment]: ../param_env.html [Trait Solving: Goals and Clauses]: ../traits/goals-and-clauses.html#domain-goals -[Trait Solving: Lowering impls]: ../traits/lowering-rules.html#lowering-impls diff --git a/src/doc/rustc-dev-guide/src/appendix/compiler-lecture.md b/src/doc/rustc-dev-guide/src/appendix/compiler-lecture.md index bbeb52aa3a..dabd2f0870 100644 --- a/src/doc/rustc-dev-guide/src/appendix/compiler-lecture.md +++ b/src/doc/rustc-dev-guide/src/appendix/compiler-lecture.md @@ -2,26 +2,47 @@ These are videos where various experts explain different parts of the compiler: -- [Tom Tromey discusses debugging support in rustc](https://www.youtube.com/watch?v=elBxMRSNYr4) -- [How Salsa Works (2019.01)](https://www.youtube.com/watch?v=_muY4HjSqVw) -- [Salsa In More Depth (2019.01)](https://www.youtube.com/watch?v=i_IhACacPRY) -- [RLS 2.0, Salsa, and Name Resolution](https://www.youtube.com/watch?v=Xr-rBqLr-G4) -- [Cranelift](https://www.youtube.com/watch?v=9OIA7DTFQWU) -- [Rust analyzer guide](https://www.youtube.com/watch?v=ANKBNiSWyfc) -- [Rust analyzer syntax trees](https://www.youtube.com/watch?v=DGAuLWdCCAI) -- [rust-analyzer type-checker overview by flodiebold](https://www.youtube.com/watch?v=Lmp3P9WNL8o) -- [oli-obk on miri and constant evaluation](https://www.youtube.com/watch?v=5Pm2C1YXrvM) -- [Polonius-rustc walkthrough](https://www.youtube.com/watch?v=i5KdU0ieb_A) -- [rustc-chalk integration overview](https://www.youtube.com/watch?v=MBWtbDifPeU) -- [Coherence in Chalk by Sunjay Varma - Bay Area Rust Meetup](https://www.youtube.com/watch?v=rZqS4bLPL24) -- [How the chalk-engine crate works](https://www.youtube.com/watch?v=Ny2928cGDoM) -- [How the chalk-engine crate works 2](https://www.youtube.com/watch?v=hmV66tB79LM) -- [RFC #2229 Disjoint Field Capture plan](https://www.youtube.com/watch?v=UTXOptVMuIc) -- [closures and upvar capture](https://www.youtube.com/watch?v=fMopdkn5-Xw) -- [blitzerr closure upvar tys](https://www.youtube.com/watch?v=pLmVhSB-z4s) -- [Convert Closure Upvar Representation to Tuples with blitzerr](https://www.youtube.com/watch?v=2QCuNtISoYc) -- [async-await implementation plans](https://www.youtube.com/watch?v=xe2_whJWBC0) -- [async-await region inferencer](https://www.youtube.com/watch?v=hlOxfkUDLPQ) -- [Universes and Lifetimes](https://www.youtube.com/watch?v=iV1Z0xYXkck) -- [Representing types in rustc](https://www.youtube.com/watch?v=c01TsOsr3-c) -- [Polonius WG: Initialization and move tracking](https://www.youtube.com/watch?v=ilv9V-328HI) +## General +- [January 2019: Tom Tromey discusses debugging support in rustc](https://www.youtube.com/watch?v=elBxMRSNYr4) +- [June 2019: Responsive compilers - Nicholas Matsakis - PLISS 2019](https://www.youtube.com/watch?v=N6b44kMS6OM) +- [June 2019: Things I Learned (TIL) - Nicholas Matsakis - PLISS 2019](https://www.youtube.com/watch?v=LIYkT3p5gTs) + +## Rust Analyzer +- [January 2019: How Salsa Works](https://www.youtube.com/watch?v=_muY4HjSqVw) +- [January 2019: Salsa In More Depth](https://www.youtube.com/watch?v=i_IhACacPRY) +- [January 2019: Rust analyzer guide](https://www.youtube.com/watch?v=ANKBNiSWyfc) +- [February 2019: Rust analyzer syntax trees](https://www.youtube.com/watch?v=DGAuLWdCCAI) +- [March 2019: rust-analyzer type-checker overview by flodiebold](https://www.youtube.com/watch?v=Lmp3P9WNL8o) +- [March 2019: RLS 2.0, Salsa, and Name Resolution](https://www.youtube.com/watch?v=Xr-rBqLr-G4) + +## Type System +- [July 2015: Felix Klock - Rust: A type system you didn't know you wanted - Curry On](https://www.youtube.com/watch?v=Q7lQCgnNWU0) +- [November 2016: Felix Klock - Subtyping in Rust and Clarke's Third Law](https://www.youtube.com/watch?v=fI4RG_uq-WU) +- [February 2019: Universes and Lifetimes](https://www.youtube.com/watch?v=iV1Z0xYXkck) +- [April 2019: Representing types in rustc](https://www.youtube.com/watch?v=c01TsOsr3-c) +- [March 2019: RFC #2229 Disjoint Field Capture plan](https://www.youtube.com/watch?v=UTXOptVMuIc) + +## Closures +- [October 2018: closures and upvar capture](https://www.youtube.com/watch?v=fMopdkn5-Xw) +- [October 2018: blitzerr closure upvar tys](https://www.youtube.com/watch?v=pLmVhSB-z4s) +- [January 2019: Convert Closure Upvar Representation to Tuples with blitzerr](https://www.youtube.com/watch?v=2QCuNtISoYc) + +## Chalk +- [July 2018: Coherence in Chalk by Sunjay Varma - Bay Area Rust Meetup](https://www.youtube.com/watch?v=rZqS4bLPL24) +- [March 2019: rustc-chalk integration overview](https://www.youtube.com/watch?v=MBWtbDifPeU) +- [April 2019: How the chalk-engine crate works](https://www.youtube.com/watch?v=Ny2928cGDoM) +- [May 2019: How the chalk-engine crate works 2](https://www.youtube.com/watch?v=hmV66tB79LM) + +## Polonius +- [March 2019: Polonius-rustc walkthrough](https://www.youtube.com/watch?v=i5KdU0ieb_A) +- [May 2019: Polonius WG: Initialization and move tracking](https://www.youtube.com/watch?v=ilv9V-328HI) + +## Miri +- [March 2019: oli-obk on miri and constant evaluation](https://www.youtube.com/watch?v=5Pm2C1YXrvM) + +## Async +- [February 2019: async-await implementation plans](https://www.youtube.com/watch?v=xe2_whJWBC0) +- [April 2019: async-await region inferencer](https://www.youtube.com/watch?v=hlOxfkUDLPQ) + +## Code Generation +- [January 2019: Cranelift](https://www.youtube.com/watch?v=9OIA7DTFQWU) diff --git a/src/doc/rustc-dev-guide/src/appendix/glossary.md b/src/doc/rustc-dev-guide/src/appendix/glossary.md index 11ddb494f3..eae5758f43 100644 --- a/src/doc/rustc-dev-guide/src/appendix/glossary.md +++ b/src/doc/rustc-dev-guide/src/appendix/glossary.md @@ -1,87 +1,94 @@ -# Appendix C: Glossary +# Glossary -The compiler uses a number of...idiosyncratic abbreviations and things. This -glossary attempts to list them and give you a few pointers for understanding -them better. - -Term | Meaning ------------------------------------------|-------- -arena/arena allocation
| An _arena_ is a large memory buffer from which other memory allocations are made. This style of allocation is called _arena allocation_. See [this chapter](../memory.md) for more info. -AST
| The abstract syntax tree produced by the `rustc_ast` crate; reflects user syntax very closely. -binder
| A "binder" is a place where a variable or type is declared; for example, the `` is a binder for the generic type parameter `T` in `fn foo(..)`, and \|`a`\|` ...` is a binder for the parameter `a`. See [the background chapter for more](./background.html#free-vs-bound). -BodyId
| A "bound variable" is one that is declared within an expression/term. For example, the variable `a` is bound within the closure expression \|`a`\|` a * 2`. See [the background chapter for more](./background.html#free-vs-bound) -codegen
| The code to translate MIR into LLVM IR. -codegen unit
| When we produce LLVM IR, we group the Rust code into a number of codegen units (sometimes abbreviated as CGUs). Each of these units is processed by LLVM independently from one another, enabling parallelism. They are also the unit of incremental re-use. ([see more](../backend/codegen.md)) -completeness
| A technical term in type theory, it means that every type-safe program also type-checks. Having both soundness and completeness is very hard, and usually soundness is more important. (see "soundness"). -control-flow graph
| A representation of the control-flow of a program; see [the background chapter for more](./background.html#cfg) -CTFE
| Short for Compile-Time Function Evaluation, this is the ability of the compiler to evaluate `const fn`s at compile time. This is part of the compiler's constant evaluation system. ([see more](../const-eval.html)) -cx
| We tend to use "cx" as an abbreviation for context. See also `tcx`, `infcx`, etc. -DAG
| A directed acyclic graph is used during compilation to keep track of dependencies between queries. ([see more](../queries/incremental-compilation.html)) -data-flow analysis
| A static analysis that figures out what properties are true at each point in the control-flow of a program; see [the background chapter for more](./background.html#dataflow). -DefId
| An index identifying a definition (see `librustc_middle/hir/def_id.rs`). Uniquely identifies a `DefPath`. See [the HIR chapter for more](../hir.html#identifiers-in-the-hir). -Double pointer
| A pointer with additional metadata. See "fat pointer" for more. -drop glue
| (internal) compiler-generated instructions that handle calling the destructors (`Drop`) for data types. -DST
| Short for Dynamically-Sized Type, this is a type for which the compiler cannot statically know the size in memory (e.g. `str` or `[u8]`). Such types don't implement `Sized` and cannot be allocated on the stack. They can only occur as the last field in a struct. They can only be used behind a pointer (e.g. `&str` or `&[u8]`). -early-bound lifetime
| A lifetime region that is substituted at its definition site. Bound in an item's `Generics` and substituted using a `Substs`. Contrast with **late-bound lifetime**. ([see more](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/enum.RegionKind.html#bound-regions)) -empty type
| see "uninhabited type". -Fat pointer
| A two word value carrying the address of some value, along with some further information necessary to put the value to use. Rust includes two kinds of "fat pointers": references to slices, and trait objects. A reference to a slice carries the starting address of the slice and its length. A trait object carries a value's address and a pointer to the trait's implementation appropriate to that value. "Fat pointers" are also known as "wide pointers", and "double pointers". -free variable
| A "free variable" is one that is not bound within an expression or term; see [the background chapter for more](./background.html#free-vs-bound) -generics
| The set of generic type parameters defined on a type or item. -HIR
| The High-level IR, created by lowering and desugaring the AST. ([see more](../hir.html)) -HirId
| Identifies a particular node in the HIR by combining a def-id with an "intra-definition offset". See [the HIR chapter for more](../hir.html#identifiers-in-the-hir). -HIR Map
| The HIR map, accessible via tcx.hir, allows you to quickly navigate the HIR and convert between various forms of identifiers. -ICE
| Short for internal compiler error, this is when the compiler crashes. -ICH
| Short for incremental compilation hash, these are used as fingerprints for things such as HIR and crate metadata, to check if changes have been made. This is useful in incremental compilation to see if part of a crate has changed and should be recompiled. -infcx
| The inference context (see `librustc_middle/infer`) -inference variable
| When doing type or region inference, an "inference variable" is a kind of special type/region that represents what you are trying to infer. Think of X in algebra. For example, if we are trying to infer the type of a variable in a program, we create an inference variable to represent that unknown type. -intern
| Interning refers to storing certain frequently-used constant data, such as strings, and then referring to the data by an identifier (e.g. a `Symbol`) rather than the data itself, to reduce memory usage and number of allocations. See [this chapter](../memory.md) for more info. -IR
| Short for Intermediate Representation, a general term in compilers. During compilation, the code is transformed from raw source (ASCII text) to various IRs. In Rust, these are primarily HIR, MIR, and LLVM IR. Each IR is well-suited for some set of computations. For example, MIR is well-suited for the borrow checker, and LLVM IR is well-suited for codegen because LLVM accepts it. -IRLO
| `IRLO` or `irlo` is sometimes used as an abbreviation for [internals.rust-lang.org](https://internals.rust-lang.org). -item
| A kind of "definition" in the language, such as a static, const, use statement, module, struct, etc. Concretely, this corresponds to the `Item` type. -lang item
| Items that represent concepts intrinsic to the language itself, such as special built-in traits like `Sync` and `Send`; or traits representing operations such as `Add`; or functions that are called by the compiler. ([see more](https://doc.rust-lang.org/1.9.0/book/lang-items.html)) -late-bound lifetime
| A lifetime region that is substituted at its call site. Bound in a HRTB and substituted by specific functions in the compiler, such as `liberate_late_bound_regions`. Contrast with **early-bound lifetime**. ([see more](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/enum.RegionKind.html#bound-regions)) -local crate
| The crate currently being compiled. -LTO
| Short for Link-Time Optimizations, this is a set of optimizations offered by LLVM that occur just before the final binary is linked. These include optimizations like removing functions that are never used in the final program, for example. _ThinLTO_ is a variant of LTO that aims to be a bit more scalable and efficient, but possibly sacrifices some optimizations. You may also read issues in the Rust repo about "FatLTO", which is the loving nickname given to non-Thin LTO. LLVM documentation: [here][lto] and [here][thinlto]. -[LLVM]
| (actually not an acronym :P) an open-source compiler backend. It accepts LLVM IR and outputs native binaries. Various languages (e.g. Rust) can then implement a compiler front-end that outputs LLVM IR and use LLVM to compile to all the platforms LLVM supports. -memoization
| The process of storing the results of (pure) computations (such as pure function calls) to avoid having to repeat them in the future. This is typically a trade-off between execution speed and memory usage. -MIR
| The Mid-level IR that is created after type-checking for use by borrowck and codegen. ([see more](../mir/index.html)) -miri
| An interpreter for MIR used for constant evaluation. ([see more](../miri.html)) -monomorphization
| The process of taking generic implementations of types and functions and instantiating them with concrete types. For example, in the code we might have `Vec`, but in the final executable, we will have a copy of the `Vec` code for every concrete type used in the program (e.g. a copy for `Vec`, a copy for `Vec`, etc). -normalize
| A general term for converting to a more canonical form, but in the case of rustc typically refers to [associated type normalization](../traits/associated-types.html#normalize). -newtype
| A wrapper around some other type (e.g., `struct Foo(T)` is a "newtype" for `T`). This is commonly used in Rust to give a stronger type for indices. -NLL
| Short for [non-lexical lifetimes](../borrow_check/region_inference.html), this is an extension to Rust's borrowing system to make it be based on the control-flow graph. -node-id or NodeId
| An index identifying a particular node in the AST or HIR; gradually being phased out and replaced with `HirId`. See [the HIR chapter for more](../hir.html#identifiers-in-the-hir). -obligation
| Something that must be proven by the trait system. ([see more](../traits/resolution.html)) -placeholder
| **NOTE: skolemization is deprecated by placeholder** a way of handling subtyping around "for-all" types (e.g., `for<'a> fn(&'a u32)`) as well as solving higher-ranked trait bounds (e.g., `for<'a> T: Trait<'a>`). See [the chapter on placeholder and universes](../borrow_check/region_inference/placeholders_and_universes.md) for more details. -point
| Used in the NLL analysis to refer to some particular location in the MIR; typically used to refer to a node in the control-flow graph. -polymorphize
| An optimization that avoids unnecessary monomorphisation. ([see more](../backend/monomorph.md#polymorphization)) -projection
| A general term for a "relative path", e.g. `x.f` is a "field projection", and `T::Item` is an ["associated type projection"](../traits/goals-and-clauses.html#trait-ref). -promoted constants
| Constants extracted from a function and lifted to static scope; see [this section](../mir/index.html#promoted) for more details. -provider
| The function that executes a query. ([see more](../query.html)) -quantified
| In math or logic, existential and universal quantification are used to ask questions like "is there any type T for which is true?" or "is this true for all types T?"; see [the background chapter for more](./background.html#quantified). -query
| Perhaps some sub-computation during compilation. ([see more](../query.html)) -region
| Another term for "lifetime" often used in the literature and in the borrow checker. -rib
| A data structure in the name resolver that keeps track of a single scope for names. ([see more](../name-resolution.html)) -sess
| The compiler session, which stores global data used throughout compilation -side tables
| Because the AST and HIR are immutable once created, we often carry extra information about them in the form of hashtables, indexed by the id of a particular node. -sigil
| Like a keyword but composed entirely of non-alphanumeric tokens. For example, `&` is a sigil for references. -soundness
| A technical term in type theory. Roughly, if a type system is sound, then if a program type-checks, it is type-safe; i.e. I can never (in safe rust) force a value into a variable of the wrong type. (see "completeness"). -span
| A location in the user's source code, used for error reporting primarily. These are like a file-name/line-number/column tuple on steroids: they carry a start/end point, and also track macro expansions and compiler desugaring. All while being packed into a few bytes (really, it's an index into a table). See the Span datatype for more. -substs
| The substitutions for a given generic type or item (e.g. the `i32`, `u32` in `HashMap`). -tcx
| The "typing context", main data structure of the compiler. ([see more](../ty.html)) -'tcx
| The lifetime of the allocation arena. ([see more](../ty.html)) -token
| The smallest unit of parsing. Tokens are produced after lexing ([see more](../the-parser.html)). -[TLS]
| Thread-Local Storage. Variables may be defined so that each thread has its own copy (rather than all threads sharing the variable). This has some interactions with LLVM. Not all platforms support TLS. -trait reference
| The name of a trait along with a suitable set of input type/lifetimes. ([see more](../traits/goals-and-clauses.html#trait-ref)) -trans
| The code to translate MIR into LLVM IR. Renamed to codegen. -ty
| The internal representation of a type. ([see more](../ty.html)) -UFCS
| Short for Universal Function Call Syntax, this is an unambiguous syntax for calling a method. ([see more](../type-checking.html)) -uninhabited type
| A type which has _no_ values. This is not the same as a ZST, which has exactly 1 value. An example of an uninhabited type is `enum Foo {}`, which has no variants, and so, can never be created. The compiler can treat code that deals with uninhabited types as dead code, since there is no such value to be manipulated. `!` (the never type) is an uninhabited type. Uninhabited types are also called "empty types". -upvar
| A variable captured by a closure from outside the closure. -variance
| Determines how changes to a generic type/lifetime parameter affect subtyping; for example, if `T` is a subtype of `U`, then `Vec` is a subtype `Vec` because `Vec` is *covariant* in its generic parameter. See [the background chapter](./background.html#variance) for a more general explanation. See the [variance chapter](../variance.html) for an explanation of how type checking handles variance. -Wide pointer
| A pointer with additional metadata. See "fat pointer" for more. -ZST
| Zero-Sized Type. A type whose values have size 0 bytes. Since `2^0 = 1`, such types can have exactly one value. For example, `()` (unit) is a ZST. `struct Foo;` is also a ZST. The compiler can do some nice optimizations around ZSTs. +Term | Meaning +-----------------------------------------------|-------- +arena/arena allocation | An _arena_ is a large memory buffer from which other memory allocations are made. This style of allocation is called _arena allocation_. See [this chapter](../memory.md) for more info. +AST | The abstract syntax tree produced by the `rustc_ast` crate; reflects user syntax very closely. +binder | A "binder" is a place where a variable or type is declared; for example, the `` is a binder for the generic type parameter `T` in `fn foo(..)`, and \|`a`\|` ...` is a binder for the parameter `a`. See [the background chapter for more](./background.md#free-vs-bound). +BodyId | An identifier that refers to a specific body (definition of a function or constant) in the crate. See [the HIR chapter for more](../hir.md#identifiers-in-the-hir). +bound variable | A "bound variable" is one that is declared within an expression/term. For example, the variable `a` is bound within the closure expression \|`a`\|` a * 2`. See [the background chapter for more](./background.md#free-vs-bound) +codegen | The code to translate MIR into LLVM IR. +codegen unit | When we produce LLVM IR, we group the Rust code into a number of codegen units (sometimes abbreviated as CGUs). Each of these units is processed by LLVM independently from one another, enabling parallelism. They are also the unit of incremental re-use. ([see more](../backend/codegen.md)) +completeness | A technical term in type theory, it means that every type-safe program also type-checks. Having both soundness and completeness is very hard, and usually soundness is more important. (see "soundness"). +control-flow graph | A representation of the control-flow of a program; see [the background chapter for more](./background.md#cfg) +CTFE | Short for Compile-Time Function Evaluation, this is the ability of the compiler to evaluate `const fn`s at compile time. This is part of the compiler's constant evaluation system. ([see more](../const-eval.md)) +cx | We tend to use "cx" as an abbreviation for context. See also `tcx`, `infcx`, etc. +ctxt | We also use "ctxt" as an abbreviation for context, e.g. [`TyCtxt`](#TyCtxt). See also [cx](#cx) or [tcx](#tcx). +DAG | A directed acyclic graph is used during compilation to keep track of dependencies between queries. ([see more](../queries/incremental-compilation.md)) +data-flow analysis | A static analysis that figures out what properties are true at each point in the control-flow of a program; see [the background chapter for more](./background.md#dataflow). +DeBruijn Index | A technique for describing which binder a variable is bound by using only integers. It has the benefit that it is invariant under variable renaming. ([see more](./background.md#what-is-a-debruijn-index)) +DefId | An index identifying a definition (see `rustc_middle/src/hir/def_id.rs`). Uniquely identifies a `DefPath`. See [the HIR chapter for more](../hir.md#identifiers-in-the-hir). +discriminant | The underlying value associated with an enum variant or generator state to indicate it as "active" (but not to be confused with its ["variant index"](#variant-idx)). At runtime, the discriminant of the active variant is encoded in the [tag](#tag). +double pointer | A pointer with additional metadata. See "fat pointer" for more. +drop glue | (internal) compiler-generated instructions that handle calling the destructors (`Drop`) for data types. +DST | Short for Dynamically-Sized Type, this is a type for which the compiler cannot statically know the size in memory (e.g. `str` or `[u8]`). Such types don't implement `Sized` and cannot be allocated on the stack. They can only occur as the last field in a struct. They can only be used behind a pointer (e.g. `&str` or `&[u8]`). +early-bound lifetime | A lifetime region that is substituted at its definition site. Bound in an item's `Generics` and substituted using a `Substs`. Contrast with **late-bound lifetime**. ([see more](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/enum.RegionKind.html#bound-regions)) +empty type | see "uninhabited type". +fat pointer | A two word value carrying the address of some value, along with some further information necessary to put the value to use. Rust includes two kinds of "fat pointers": references to slices, and trait objects. A reference to a slice carries the starting address of the slice and its length. A trait object carries a value's address and a pointer to the trait's implementation appropriate to that value. "Fat pointers" are also known as "wide pointers", and "double pointers". +free variable | A "free variable" is one that is not bound within an expression or term; see [the background chapter for more](./background.md#free-vs-bound) +generics | The set of generic type parameters defined on a type or item. +HIR | The High-level IR, created by lowering and desugaring the AST. ([see more](../hir.md)) +HirId | Identifies a particular node in the HIR by combining a def-id with an "intra-definition offset". See [the HIR chapter for more](../hir.md#identifiers-in-the-hir). +HIR map | The HIR map, accessible via `tcx.hir()`, allows you to quickly navigate the HIR and convert between various forms of identifiers. +ICE | Short for internal compiler error, this is when the compiler crashes. +ICH | Short for incremental compilation hash, these are used as fingerprints for things such as HIR and crate metadata, to check if changes have been made. This is useful in incremental compilation to see if part of a crate has changed and should be recompiled. +infcx | The type inference context (`InferCtxt`). (see `rustc_middle::infer`) +inference variable | When doing type or region inference, an "inference variable" is a kind of special type/region that represents what you are trying to infer. Think of X in algebra. For example, if we are trying to infer the type of a variable in a program, we create an inference variable to represent that unknown type. +intern | Interning refers to storing certain frequently-used constant data, such as strings, and then referring to the data by an identifier (e.g. a `Symbol`) rather than the data itself, to reduce memory usage and number of allocations. See [this chapter](../memory.md) for more info. +intrinsic | Intrinsics are special functions that are implemented in the compiler itself but exposed (often unstably) to users. They do magical and dangerous things. (See [`std::intrinsics`](https://doc.rust-lang.org/std/intrinsics/index.html)) +IR | Short for Intermediate Representation, a general term in compilers. During compilation, the code is transformed from raw source (ASCII text) to various IRs. In Rust, these are primarily HIR, MIR, and LLVM IR. Each IR is well-suited for some set of computations. For example, MIR is well-suited for the borrow checker, and LLVM IR is well-suited for codegen because LLVM accepts it. +IRLO | `IRLO` or `irlo` is sometimes used as an abbreviation for [internals.rust-lang.org](https://internals.rust-lang.org). +item | A kind of "definition" in the language, such as a static, const, use statement, module, struct, etc. Concretely, this corresponds to the `Item` type. +lang item | Items that represent concepts intrinsic to the language itself, such as special built-in traits like `Sync` and `Send`; or traits representing operations such as `Add`; or functions that are called by the compiler. ([see more](https://doc.rust-lang.org/1.9.0/book/lang-items.html)) +late-bound lifetime | A lifetime region that is substituted at its call site. Bound in a HRTB and substituted by specific functions in the compiler, such as `liberate_late_bound_regions`. Contrast with **early-bound lifetime**. ([see more](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/enum.RegionKind.html#bound-regions)) +local crate | The crate currently being compiled. This is in contrast to "upstream crates" which refer to dependencies of the local crate. +LTO | Short for Link-Time Optimizations, this is a set of optimizations offered by LLVM that occur just before the final binary is linked. These include optimizations like removing functions that are never used in the final program, for example. _ThinLTO_ is a variant of LTO that aims to be a bit more scalable and efficient, but possibly sacrifices some optimizations. You may also read issues in the Rust repo about "FatLTO", which is the loving nickname given to non-Thin LTO. LLVM documentation: [here][lto] and [here][thinlto]. +[LLVM] | (actually not an acronym :P) an open-source compiler backend. It accepts LLVM IR and outputs native binaries. Various languages (e.g. Rust) can then implement a compiler front-end that outputs LLVM IR and use LLVM to compile to all the platforms LLVM supports. +memoization | The process of storing the results of (pure) computations (such as pure function calls) to avoid having to repeat them in the future. This is typically a trade-off between execution speed and memory usage. +MIR | The Mid-level IR that is created after type-checking for use by borrowck and codegen. ([see more](../mir/index.md)) +miri | An interpreter for MIR used for constant evaluation. ([see more](../miri.md)) +monomorphization | The process of taking generic implementations of types and functions and instantiating them with concrete types. For example, in the code we might have `Vec`, but in the final executable, we will have a copy of the `Vec` code for every concrete type used in the program (e.g. a copy for `Vec`, a copy for `Vec`, etc). +normalize | A general term for converting to a more canonical form, but in the case of rustc typically refers to [associated type normalization](../traits/goals-and-clauses.md#normalizeprojection---type). +newtype | A wrapper around some other type (e.g., `struct Foo(T)` is a "newtype" for `T`). This is commonly used in Rust to give a stronger type for indices. +niche | Invalid bit patterns for a type *that can be used* for layout optimizations. Some types cannot have certain bit patterns. For example, the `NonZero*` integers or the reference `&T` cannot be represented by a 0 bitstring. This means the compiler can perform layout optimizations by taking advantage of the invalid "niche value". An example application for this is the [*Discriminant elision on `Option`-like enums*](https://rust-lang.github.io/unsafe-code-guidelines/layout/enums.html#discriminant-elision-on-option-like-enums), which allows using a type's niche as the ["tag"](#tag) for an `enum` without requiring a separate field. +NLL | Short for [non-lexical lifetimes](../borrow_check/region_inference.md), this is an extension to Rust's borrowing system to make it be based on the control-flow graph. +node-id or NodeId | An index identifying a particular node in the AST or HIR; gradually being phased out and replaced with `HirId`. See [the HIR chapter for more](../hir.md#identifiers-in-the-hir). +obligation | Something that must be proven by the trait system. ([see more](../traits/resolution.md)) +placeholder | **NOTE: skolemization is deprecated by placeholder** a way of handling subtyping around "for-all" types (e.g., `for<'a> fn(&'a u32)`) as well as solving higher-ranked trait bounds (e.g., `for<'a> T: Trait<'a>`). See [the chapter on placeholder and universes](../borrow_check/region_inference/placeholders_and_universes.md) for more details. +point | Used in the NLL analysis to refer to some particular location in the MIR; typically used to refer to a node in the control-flow graph. +polymorphize | An optimization that avoids unnecessary monomorphisation. ([see more](../backend/monomorph.md#polymorphization)) +projection | A general term for a "relative path", e.g. `x.f` is a "field projection", and `T::Item` is an ["associated type projection"](../traits/goals-and-clauses.md#trait-ref). +promoted constants | Constants extracted from a function and lifted to static scope; see [this section](../mir/index.md#promoted) for more details. +provider | The function that executes a query. ([see more](../query.md)) +quantified | In math or logic, existential and universal quantification are used to ask questions like "is there any type T for which is true?" or "is this true for all types T?"; see [the background chapter for more](./background.md#quantified). +query | A sub-computation during compilation. Query results can be cached in the current session or to disk for incremental compilation. ([see more](../query.md)) +recovery | Recovery refers to handling invalid syntax during parsing (e.g. a missing comma) and continuing to parse the AST. This avoid showing spurious errors to the user (e.g. showing 'missing field' errors when the struct definition contains errors). +region | Another term for "lifetime" often used in the literature and in the borrow checker. +rib | A data structure in the name resolver that keeps track of a single scope for names. ([see more](../name-resolution.md)) +scrutinee
| A scrutinee is the expression that is matched on in `match` expressions and similar pattern matching constructs. For example, in `match x { A => 1, B => 2 }`, the expression `x` is the scrutinee. +sess | The compiler session, which stores global data used throughout compilation +side tables | Because the AST and HIR are immutable once created, we often carry extra information about them in the form of hashtables, indexed by the id of a particular node. +sigil | Like a keyword but composed entirely of non-alphanumeric tokens. For example, `&` is a sigil for references. +soundness | A technical term in type theory. Roughly, if a type system is sound, then a program that type-checks is type-safe. That is, one can never (in safe rust) force a value into a variable of the wrong type. (see "completeness"). +span | A location in the user's source code, used for error reporting primarily. These are like a file-name/line-number/column tuple on steroids: they carry a start/end point, and also track macro expansions and compiler desugaring. All while being packed into a few bytes (really, it's an index into a table). See the Span datatype for more. +substs | The substitutions for a given generic type or item (e.g. the `i32`, `u32` in `HashMap`). +sysroot | The directory for build artifacts that are loaded by the compiler at runtime. ([see more](../building/bootstrapping.html#what-is-a-sysroot)) +tag | The "tag" of an enum/generator encodes the [discriminant](#discriminant) of the active variant/state. Tags can either be "direct" (simply storing the discriminant in a field) or use a ["niche"](#niche). +tcx | The "typing context" (`TyCtxt`), main data structure of the compiler. ([see more](../ty.md)) +`'tcx` | The lifetime of the allocation arenas used by `TyCtxt`. Most data interned during a compilation session will use this lifetime with the exception of HIR data which uses the `'hir` lifetime. ([see more](../ty.md)) +token | The smallest unit of parsing. Tokens are produced after lexing ([see more](../the-parser.md)). +[TLS] | Thread-Local Storage. Variables may be defined so that each thread has its own copy (rather than all threads sharing the variable). This has some interactions with LLVM. Not all platforms support TLS. +trait reference | The name of a trait along with a suitable set of input type/lifetimes. ([see more](../traits/goals-and-clauses.md#trait-ref)) +trans | Short for "translation", the code to translate MIR into LLVM IR. Renamed to codegen. +`Ty` | The internal representation of a type. ([see more](../ty.md)) +TyCtxt | The data structure often referred to as [tcx](#tcx) in code which provides access to session data and the query system. +UFCS | Short for Universal Function Call Syntax, this is an unambiguous syntax for calling a method. ([see more](../type-checking.md)) +uninhabited type | A type which has _no_ values. This is not the same as a ZST, which has exactly 1 value. An example of an uninhabited type is `enum Foo {}`, which has no variants, and so, can never be created. The compiler can treat code that deals with uninhabited types as dead code, since there is no such value to be manipulated. `!` (the never type) is an uninhabited type. Uninhabited types are also called "empty types". +upvar | A variable captured by a closure from outside the closure. +variance | Determines how changes to a generic type/lifetime parameter affect subtyping; for example, if `T` is a subtype of `U`, then `Vec` is a subtype `Vec` because `Vec` is *covariant* in its generic parameter. See [the background chapter](./background.md#variance) for a more general explanation. See the [variance chapter](../variance.md) for an explanation of how type checking handles variance. +variant index | In an enum, identifies a variant by assigning them indices starting at 0. This is purely internal and not to be confused with the ["discrimiant"](#discriminant) which can be overwritten by the user (e.g. `enum Bool { True = 42, False = 0 }`). +wide pointer | A pointer with additional metadata. See "fat pointer" for more. +ZST | Zero-Sized Type. A type whose values have size 0 bytes. Since `2^0 = 1`, such types can have exactly one value. For example, `()` (unit) is a ZST. `struct Foo;` is also a ZST. The compiler can do some nice optimizations around ZSTs. [LLVM]: https://llvm.org/ [lto]: https://llvm.org/docs/LinkTimeOptimization.html diff --git a/src/doc/rustc-dev-guide/src/appendix/humorust.md b/src/doc/rustc-dev-guide/src/appendix/humorust.md index 3bbedf5bb2..a7ba617699 100644 --- a/src/doc/rustc-dev-guide/src/appendix/humorust.md +++ b/src/doc/rustc-dev-guide/src/appendix/humorust.md @@ -10,4 +10,4 @@ enlightening? - [Rust Koans](https://users.rust-lang.org/t/rust-koans/2408) - [`break rust;`](https://play.rust-lang.org/?version=stable&mode=debug&edition=2018&gist=0ab2bd6a9d722e0f05a95e2a5dcf89cc) - [The Nomicon Intro](https://doc.rust-lang.org/stable/nomicon/) -- [`rustc-ty` renaming punfest](https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler/topic/rustc-ty.20naming.20bikeshed.20.2F.20punfest.20(was.3A.20design.20meeting.202.2E.2E.2E/near/189906455 ) +- [`rustc-ty` renaming punfest](https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler/topic/rustc-ty.20naming.20bikeshed.20.2F.20punfest.20%28was.3A.20design.20meeting.202.2E.2E.2E/near/189906455) diff --git a/src/doc/rustc-dev-guide/src/backend/backend-agnostic.md b/src/doc/rustc-dev-guide/src/backend/backend-agnostic.md index 209df0afa3..3299e2cc79 100644 --- a/src/doc/rustc-dev-guide/src/backend/backend-agnostic.md +++ b/src/doc/rustc-dev-guide/src/backend/backend-agnostic.md @@ -1,10 +1,12 @@ # Backend Agnostic Codegen -In the future, it would be nice to allow other codegen backends (e.g. -[Cranelift]). To this end, `librustc_codegen_ssa` provides an -abstract interface for all backends to implenent. + -[Cranelift]: https://github.com/bytecodealliance/wasmtime/tree/master/cranelift +As of January 2021, `rustc_codegen_ssa` provides an +abstract interface for all backends to implement, to allow other codegen +backends (e.g. [Cranelift]). + +[Cranelift]: https://github.com/bytecodealliance/wasmtime/tree/HEAD/cranelift > The following is a copy/paste of a README from the rust-lang/rust repo. > Please submit a PR if it needs updating. @@ -175,7 +177,7 @@ in the LLVM implementation of the trait). The traits offer an API which is very similar to the API of LLVM. This is not the best solution since LLVM has a very special way of doing things: when -addding another backend, the traits definition might be changed in order to +adding another backend, the traits definition might be changed in order to offer more flexibility. However, the current separation between backend-agnostic and LLVM-specific code diff --git a/src/doc/rustc-dev-guide/src/backend/codegen.md b/src/doc/rustc-dev-guide/src/backend/codegen.md index d7bad9cfbb..8e18ca2426 100644 --- a/src/doc/rustc-dev-guide/src/backend/codegen.md +++ b/src/doc/rustc-dev-guide/src/backend/codegen.md @@ -7,7 +7,7 @@ codegen itself. It's worth noting, though, that in the rust source code, many parts of the backend have `codegen` in their names (there are no hard boundaries). -[Cranelift]: https://github.com/bytecodealliance/wasmtime/tree/master/cranelift +[Cranelift]: https://github.com/bytecodealliance/wasmtime/tree/HEAD/cranelift > NOTE: If you are looking for hints on how to debug code generation bugs, > please see [this section of the debugging chapter][debugging]. @@ -63,8 +63,8 @@ before objects are passed on to the linker and some to happen during the linking. This all happens towards the very end of compilation. The code for this can be -found in [`librustc_codegen_ssa::back`][ssaback] and -[`librustc_codegen_llvm::back`][llvmback]. Sadly, this piece of code is not +found in [`rustc_codegen_ssa::back`][ssaback] and +[`rustc_codegen_llvm::back`][llvmback]. Sadly, this piece of code is not really well-separated into LLVM-dependent code; the [`rustc_codegen_ssa`][ssa] contains a fair amount of code specific to the LLVM backend. diff --git a/src/doc/rustc-dev-guide/src/backend/debugging.md b/src/doc/rustc-dev-guide/src/backend/debugging.md index 06e62d9ec0..7577a0e13d 100644 --- a/src/doc/rustc-dev-guide/src/backend/debugging.md +++ b/src/doc/rustc-dev-guide/src/backend/debugging.md @@ -103,27 +103,27 @@ specifically the `#t-compiler/wg-llvm` stream. ### Compiler options to know and love -The `-Chelp` and `-Zhelp` compiler switches will list out a variety +The `-C help` and `-Z help` compiler switches will list out a variety of interesting options you may find useful. Here are a few of the most common that pertain to LLVM development (some of them are employed in the tutorial above): - The `--emit llvm-ir` option emits a `.ll` file with LLVM IR in textual format - The `--emit llvm-bc` option emits in bytecode format (`.bc`) -- Passing `-Cllvm-args=` allows passing pretty much all the +- Passing `-C llvm-args=` allows passing pretty much all the options that tools like llc and opt would accept; - e.g. `-Cllvm-args=-print-before-all` to print IR before every LLVM + e.g. `-C llvm-args=-print-before-all` to print IR before every LLVM pass. -- The `-Cno-prepopulate-passes` will avoid pre-populate the LLVM pass +- The `-C no-prepopulate-passes` will avoid pre-populate the LLVM pass manager with a list of passes. This will allow you to view the LLVM IR that rustc generates, not the LLVM IR after optimizations. -- The `-Cpasses=val` option allows you to supply a (space seprated) list of extra LLVM passes to run -- The `-Csave-temps` option saves all temporary output files during compilation -- The `-Zprint-llvm-passes` option will print out LLVM optimization passes being run -- The `-Ztime-llvm-passes` option measures the time of each LLVM pass -- The `-Zverify-llvm-ir` option will verify the LLVM IR for correctness -- The `-Zno-parallel-llvm` will disable parallel compilation of distinct compilation units -- The `-Zllvm-time-trace` option will output a Chrome profiler compatible JSON file +- The `-C passes=val` option allows you to supply a space separated list of extra LLVM passes to run +- The `-C save-temps` option saves all temporary output files during compilation +- The `-Z print-llvm-passes` option will print out LLVM optimization passes being run +- The `-Z time-llvm-passes` option measures the time of each LLVM pass +- The `-Z verify-llvm-ir` option will verify the LLVM IR for correctness +- The `-Z no-parallel-llvm` will disable parallel compilation of distinct compilation units +- The `-Z llvm-time-trace` option will output a Chrome profiler compatible JSON file which contains details and timings for LLVM passes. ### Filing LLVM bug reports diff --git a/src/doc/rustc-dev-guide/src/codegen/implicit-caller-location.md b/src/doc/rustc-dev-guide/src/backend/implicit-caller-location.md similarity index 94% rename from src/doc/rustc-dev-guide/src/codegen/implicit-caller-location.md rename to src/doc/rustc-dev-guide/src/backend/implicit-caller-location.md index 5f11dad30b..02eea5bab6 100644 --- a/src/doc/rustc-dev-guide/src/codegen/implicit-caller-location.md +++ b/src/doc/rustc-dev-guide/src/backend/implicit-caller-location.md @@ -1,9 +1,11 @@ # Implicit Caller Location + + Approved in [RFC 2091], this feature enables the accurate reporting of caller location during panics -initiated from functions like `Option::unwrap`, `Result::expect`, and `Index::index`. This feature -adds the [`#[track_caller]`][attr-reference] attribute for functions, the -[`caller_location`][intrinsic] intrinsic, and the stabilization-friendly +initiated from functions like `Option::unwrap`, `Result::expect`, and `Index::index`. This feature +adds the [`#[track_caller]`][attr-reference] attribute for functions, the +[`caller_location`][intrinsic] intrinsic, and the stabilization-friendly [`core::panic::Location::caller`][wrapper] wrapper. ## Motivating Example @@ -17,7 +19,7 @@ fn main() { } ``` -Prior to Rust 1.42, panics like this `unwrap()` printed a location in libcore: +Prior to Rust 1.42, panics like this `unwrap()` printed a location in core: ``` $ rustc +1.41.0 example.rs; example.exe @@ -28,25 +30,25 @@ note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace. As of 1.42, we get a much more helpful message: ``` -$ rustc +1.42.0 example.rs; example.exe +$ rustc +1.42.0 example.rs; example.exe thread 'main' panicked at 'called `Option::unwrap()` on a `None` value', example.rs:3:5 note: run with `RUST_BACKTRACE=1` environment variable to display a backtrace ``` These error messages are achieved through a combination of changes to `panic!` internals to make use -of `core::panic::Location::caller` and a number of `#[track_caller]` annotations in the standard +of `core::panic::Location::caller` and a number of `#[track_caller]` annotations in the standard library which propagate caller information. ## Reading Caller Location Previously, `panic!` made use of the `file!()`, `line!()`, and `column!()` macros to construct a [`Location`] pointing to where the panic occurred. These macros couldn't be given an overridden -location, so functions which intentionally invoked `panic!` couldn't provide their own location, +location, so functions which intentionally invoked `panic!` couldn't provide their own location, hiding the actual source of error. -Internally, `panic!()` now calls [`core::panic::Location::caller()`][wrapper] to find out where it -was expanded. This function is itself annotated with `#[track_caller]` and wraps the -[`caller_location`][intrinsic] compiler intrinsic implemented by rustc. This intrinsic is easiest +Internally, `panic!()` now calls [`core::panic::Location::caller()`][wrapper] to find out where it +was expanded. This function is itself annotated with `#[track_caller]` and wraps the +[`caller_location`][intrinsic] compiler intrinsic implemented by rustc. This intrinsic is easiest explained in terms of how it works in a `const` context. ## Caller Location in `const` @@ -56,20 +58,20 @@ to find the right location and allocating a const value to return. ### Finding the right `Location` -In a const context we "walk up the stack" from where the intrinsic is invoked, stopping when we +In a const context we "walk up the stack" from where the intrinsic is invoked, stopping when we reach the first function call in the stack which does *not* have the attribute. This walk is in [`InterpCx::find_closest_untracked_caller_location()`][const-find-closest]. -Starting at the bottom, we iterate up over stack [`Frame`][const-frame]s in the +Starting at the bottom, we iterate up over stack [`Frame`][const-frame]s in the [`InterpCx::stack`][const-stack], calling -[`InstanceDef::requires_caller_location`][requires-location] on the +[`InstanceDef::requires_caller_location`][requires-location] on the [`Instance`s from each `Frame`][frame-instance]. We stop once we find one that returns `false` and return the span of the *previous* frame which was the "topmost" tracked function. ### Allocating a static `Location` -Once we have a `Span`, we need to allocate static memory for the `Location`, which is performed by -the [`TyCtxt::const_caller_location()`][const-location-query] query. Internally this calls +Once we have a `Span`, we need to allocate static memory for the `Location`, which is performed by +the [`TyCtxt::const_caller_location()`][const-location-query] query. Internally this calls [`InterpCx::alloc_caller_location()`][alloc-location] and results in a unique [memory kind][location-memory-kind] (`MemoryKind::CallerLocation`). The SSA codegen backend is able to emit code for these same values, and we use this code there as well. @@ -78,14 +80,14 @@ Once our `Location` has been allocated in static memory, our intrinsic returns a ## Generating code for `#[track_caller]` callees -To generate efficient code for a tracked function and its callers, we need to provide the same +To generate efficient code for a tracked function and its callers, we need to provide the same behavior from the intrinsic's point of view without having a stack to walk up at runtime. We invert the approach: as we grow the stack down we pass an additional argument to calls of tracked functions rather than walking up the stack when the intrinsic is called. That additional argument can be returned wherever the caller location is queried. -The argument we append is of type `&'static core::panic::Location<'staic>`. A reference was chosen -to avoid unnecessary copying because a pointer is a third the size of +The argument we append is of type `&'static core::panic::Location<'static>`. A reference was chosen +to avoid unnecessary copying because a pointer is a third the size of `std::mem::size_of::() == 24` at time of writing. When generating a call to a function which is tracked, we pass the location argument the value of @@ -151,16 +153,15 @@ probably the best we can do without modifying fully-stabilized type signatures. > *Note:* We always emit a [`ReifyShim`] when taking a pointer to a tracked function. While the > constraint here is imposed by codegen contexts, we don't know during MIR construction of the shim -> whether we'll be called in a const context (safe to ignore shim) or in a codegen context (unsafe +> whether we'll be called in a const context (safe to ignore shim) or in a codegen context (unsafe > to ignore shim). Even if we did know, the results from const and codegen contexts must agree. ## The Attribute -The `#[track_caller]` attribute is checked alongside other codegen attributes to ensure the +The `#[track_caller]` attribute is checked alongside other codegen attributes to ensure the function: * has the `"Rust"` ABI (as opposed to e.g., `"C"`) -* is not a foreign import (e.g., in an `extern {...}` block) * is not a closure * is not `#[naked]` @@ -172,7 +173,7 @@ used in both const and codegen contexts to ensure correct propagation. When applied to trait method implementations, the attribute works as it does for regular functions. -When applied to a trait method prototype, the attribute applies to all implementations of the +When applied to a trait method prototype, the attribute applies to all implementations of the method. When applied to a default trait method implementation, the attribute takes effect on that implementation *and* any overrides. @@ -204,14 +205,14 @@ trait TrackedFourWays { assert_tracked!(); } - /// Overrides of this implementation are tracked (it is too). + /// Overrides of this implementation are tracked (it is too). #[track_caller] fn default_tracked_to_override() { assert_tracked!(); } } -/// This impl uses the default impl for `default_tracked` and provides its own for +/// This impl uses the default impl for `default_tracked` and provides its own for /// `default_tracked_to_override`. impl TrackedFourWays for () { fn blanket_tracked() { @@ -254,7 +255,7 @@ up on the tracking issue. During the course of implementing that, it was also di implementation was possible without modifying the number of arguments in a function's MIR, which would simplify later stages and unlock use in traits. -Because the RFC's implementation strategy could not readily support traits, the semantics were not +Because the RFC's implementation strategy could not readily support traits, the semantics were not originally specified. They have since been implemented following the path which seemed most correct to the author and reviewers. diff --git a/src/doc/rustc-dev-guide/src/backend/inline-asm.md b/src/doc/rustc-dev-guide/src/backend/inline-asm.md new file mode 100644 index 0000000000..0cae01ef39 --- /dev/null +++ b/src/doc/rustc-dev-guide/src/backend/inline-asm.md @@ -0,0 +1,4 @@ +# Inline Assembly + +**TODO: You can find more info in +https://github.com/rust-lang/rust/pull/69171#issue-375572066** diff --git a/src/doc/rustc-dev-guide/src/backend/libs-and-metadata.md b/src/doc/rustc-dev-guide/src/backend/libs-and-metadata.md new file mode 100644 index 0000000000..91d8cb3aab --- /dev/null +++ b/src/doc/rustc-dev-guide/src/backend/libs-and-metadata.md @@ -0,0 +1,192 @@ +# Libraries and Metadata + +When the compiler sees a reference to an external crate, it needs to load some +information about that crate. This chapter gives an overview of that process, +and the supported file formats for crate libraries. + +## Libraries + +A crate dependency can be loaded from an `rlib`, `dylib`, or `rmeta` file. A +key point of these file formats is that they contain `rustc`-specific +[*metadata*](#metadata). This metadata allows the compiler to discover enough +information about the external crate to understand the items it contains, +which macros it exports, and *much* more. + +### rlib + +An `rlib` is an [archive file], which is similar to a tar file. This file +format is specific to `rustc`, and may change over time. This file contains: + +* Object code, which is the result of code generation. This is used during + regular linking. There is a separate `.o` file for each [codegen unit]. The + codegen step can be skipped with the [`-C + linker-plugin-lto`][linker-plugin-lto] CLI option, which means each `.o` + file will only contain LLVM bitcode. +* [LLVM bitcode], which is a binary representation of LLVM's intermediate + representation, which is embedded as a section in the `.o` files. This can + be used for [Link Time Optimization] (LTO). This can be removed with the + [`-C embed-bitcode=no`][embed-bitcode] CLI option to improve compile times + and reduce disk space if LTO is not needed. +* `rustc` [metadata], in a file named `lib.rmeta`. +* A symbol table, which is generally a list of symbols with offsets to the + object file that contain that symbol. This is pretty standard for archive + files. + +[archive file]: https://en.wikipedia.org/wiki/Ar_(Unix) +[LLVM bitcode]: https://llvm.org/docs/BitCodeFormat.html +[Link Time Optimization]: https://llvm.org/docs/LinkTimeOptimization.html +[codegen unit]: ../backend/codegen.md +[embed-bitcode]: https://doc.rust-lang.org/rustc/codegen-options/index.html#embed-bitcode +[linker-plugin-lto]: https://doc.rust-lang.org/rustc/codegen-options/index.html#linker-plugin-lto + +### dylib + +A `dylib` is a platform-specific shared library. It includes the `rustc` +[metadata] in a special link section called `.rustc` in a compressed format. + +### rmeta + +An `rmeta` file is custom binary format that contains the [metadata] for the +crate. This file can be used for fast "checks" of a project by skipping all +code generation (as is done with `cargo check`), collecting enough information +for documentation (as is done with `cargo doc`), or for +[pipelining](#pipelining). This file is created if the +[`--emit=metadata`][emit] CLI option is used. + +`rmeta` files do not support linking, since they do not contain compiled +object files. + +[emit]: https://doc.rust-lang.org/rustc/command-line-arguments.html#option-emit + +## Metadata + +The metadata contains a wide swath of different elements. This guide will not +go into detail of every field it contains. You are encouraged to browse the +[`CrateRoot`] definition to get a sense of the different elements it contains. +Everything about metadata encoding and decoding is in the [`rustc_metadata`] +package. + +Here are a few highlights of things it contains: + +* The version of the `rustc` compiler. The compiler will refuse to load files + from any other version. +* The [Strict Version Hash](#strict-version-hash) (SVH). This helps ensure the + correct dependency is loaded. +* The [Crate Disambiguator](#crate-disambiguator). This is a hash used + to disambiguate between different crates of the same name. +* Information about all the source files in the library. This can be used for + a variety of things, such as diagnostics pointing to sources in a + dependency. +* Information about exported macros, traits, types, and items. Generally, + anything that's needed to be known when a path references something inside a + crate dependency. +* Encoded [MIR]. This is optional, and only encoded if needed for code + generation. `cargo check` skips this for performance reasons. + +[`CrateRoot`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_metadata/rmeta/struct.CrateRoot.html +[`rustc_metadata`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_metadata/index.html +[MIR]: ../mir/index.md + +### Strict Version Hash + +The Strict Version Hash ([SVH], also known as the "crate hash") is a 64-bit +hash that is used to ensure that the correct crate dependencies are loaded. It +is possible for a directory to contain multiple copies of the same dependency +built with different settings, or built from different sources. The crate +loader will skip any crates that have the wrong SVH. + +The SVH is also used for the [incremental compilation] session filename, +though that usage is mostly historic. + +The hash includes a variety of elements: + +* Hashes of the HIR nodes. +* All of the upstream crate hashes. +* All of the source filenames. +* Hashes of certain command-line flags (like `-C metadata` via the [Crate + Disambiguator](#crate-disambiguator), and all CLI options marked with + `[TRACKED]`). + +See [`finalize_and_compute_crate_hash`] for where the hash is actually +computed. + +[SVH]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_data_structures/svh/struct.Svh.html +[incremental compilation]: ../queries/incremental-compilation.md +[`finalize_and_compute_crate_hash`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/hir/map/collector/struct.NodeCollector.html#method.finalize_and_compute_crate_hash + +### Crate Disambiguator + +The [`CrateDisambiguator`] is a 128-bit hash used to distinguish between +different crates of the same name. It is a hash of all the [`-C metadata`] CLI +options computed in [`compute_crate_disambiguator`]. It is used in a variety +of places, such as symbol name mangling, crate loading, and much more. + +By default, all Rust symbols are mangled and incorporate the disambiguator +hash. This allows multiple versions of the same crate to be included together. +Cargo automatically generates `-C metadata` hashes based on a variety of +factors, like the package version, source, and the target kind (a lib and bin +can have the same crate name, so they need to be disambiguated). + +[`CrateDisambiguator`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/crate_disambiguator/struct.CrateDisambiguator.html +[`compute_crate_disambiguator`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_interface/util/fn.compute_crate_disambiguator.html +[`-C metadata`]: https://doc.rust-lang.org/rustc/codegen-options/index.html#metadata + +## Crate loading + +Crate loading can have quite a few subtle complexities. During [name +resolution], when an external crate is referenced (via an `extern crate` or +path), the resolver uses the [`CrateLoader`] which is responsible for finding +the crate libraries and loading the [metadata] for them. After the dependency +is loaded, the `CrateLoader` will provide the information the resolver needs +to perform its job (such as expanding macros, resolving paths, etc.). + +To load each external crate, the `CrateLoader` uses a [`CrateLocator`] to +actually find the correct files for one specific crate. There is some great +documentation in the [`locator`] module that goes into detail on how loading +works, and I strongly suggest reading it to get the full picture. + +The location of a dependency can come from several different places. Direct +dependencies are usually passed with `--extern` flags, and the loader can look +at those directly. Direct dependencies often have references to their own +dependencies, which need to be loaded, too. These are usually found by +scanning the directories passed with the `-L` flag for any file whose metadata +contains a matching crate name and [SVH](#strict-version-hash). The loader +will also look at the [sysroot] to find dependencies. + +As crates are loaded, they are kept in the [`CStore`] with the crate metadata +wrapped in the [`CrateMetadata`] struct. After resolution and expansion, the +`CStore` will make its way into the [`GlobalCtxt`] for the rest of +compilation. + +[name resolution]: ../name-resolution.md +[`CrateLoader`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_metadata/creader/struct.CrateLoader.html +[`CrateLocator`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_metadata/locator/struct.CrateLocator.html +[`locator`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_metadata/locator/index.html +[`CStore`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_metadata/creader/struct.CStore.html +[`CrateMetadata`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_metadata/rmeta/decoder/struct.CrateMetadata.html +[`GlobalCtxt`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.GlobalCtxt.html +[sysroot]: ../building/bootstrapping.md#what-is-a-sysroot + +## Pipelining + +One trick to improve compile times is to start building a crate as soon as the +metadata for its dependencies is available. For a library, there is no need to +wait for the code generation of dependencies to finish. Cargo implements this +technique by telling `rustc` to emit an [`rmeta`](#rmeta) file for each +dependency as well as an [`rlib`](#rlib). As early as it can, `rustc` will +save the `rmeta` file to disk before it continues to the code generation +phase. The compiler sends a JSON message to let the build tool know that it +can start building the next crate if possible. + +The [crate loading](#crate-loading) system is smart enough to know when it +sees an `rmeta` file to use that if the `rlib` is not there (or has only been +partially written). + +This pipelining isn't possible for binaries, because the linking phase will +require the code generation of all its dependencies. In the future, it may be +possible to further improve this scenario by splitting linking into a separate +command (see [#64191]). + +[#64191]: https://github.com/rust-lang/rust/issues/64191 + +[metadata]: #metadata diff --git a/src/doc/rustc-dev-guide/src/backend/lowering-mir.md b/src/doc/rustc-dev-guide/src/backend/lowering-mir.md index 93516c5d87..8b9dbe7ce2 100644 --- a/src/doc/rustc-dev-guide/src/backend/lowering-mir.md +++ b/src/doc/rustc-dev-guide/src/backend/lowering-mir.md @@ -15,14 +15,14 @@ MIR to LLVM IR. The code is split into modules which handle particular MIR primitives: -- [`librustc_codegen_ssa::mir::block`][mirblk] will deal with translating +- [`rustc_codegen_ssa::mir::block`][mirblk] will deal with translating blocks and their terminators. The most complicated and also the most interesting thing this module does is generating code for function calls, including the necessary unwinding handling IR. -- [`librustc_codegen_ssa::mir::statement`][mirst] translates MIR statements. -- [`librustc_codegen_ssa::mir::operand`][mirop] translates MIR operands. -- [`librustc_codegen_ssa::mir::place`][mirpl] translates MIR place references. -- [`librustc_codegen_ssa::mir::rvalue`][mirrv] translates MIR r-values. +- [`rustc_codegen_ssa::mir::statement`][mirst] translates MIR statements. +- [`rustc_codegen_ssa::mir::operand`][mirop] translates MIR operands. +- [`rustc_codegen_ssa::mir::place`][mirpl] translates MIR place references. +- [`rustc_codegen_ssa::mir::rvalue`][mirrv] translates MIR r-values. [mirblk]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/mir/block/index.html [mirst]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/mir/statement/index.html @@ -38,7 +38,7 @@ LLVM's `mem2reg` for those variables. The analysis can be found in [`rustc_codegen_ssa::mir::analyze`][mirana]. [mirana]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/mir/analyze/index.html - + Usually a single MIR basic block will map to a LLVM basic block, with very few exceptions: intrinsic or function calls and less basic MIR statements like `assert` can result in multiple basic blocks. This is a perfect lede into the @@ -49,7 +49,7 @@ and can be found in [`rustc_codegen_llvm::intrinsic`][llvmint]. [llvmint]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_llvm/intrinsic/index.html Everything else will use the [builder interface][builder]. This is the code that gets -called in the [`librustc_codegen_ssa::mir::*`][ssamir] modules discussed above. +called in the [`rustc_codegen_ssa::mir::*`][ssamir] modules discussed above. [builder]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_llvm/builder/index.html [ssamir]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/mir/index.html diff --git a/src/doc/rustc-dev-guide/src/backend/monomorph.md b/src/doc/rustc-dev-guide/src/backend/monomorph.md index 5e5d2e0c49..0457c18412 100644 --- a/src/doc/rustc-dev-guide/src/backend/monomorph.md +++ b/src/doc/rustc-dev-guide/src/backend/monomorph.md @@ -1,5 +1,7 @@ # Monomorphization + + As you probably know, rust has a very expressive type system that has extensive support for generic types. But of course, assembly is not generic, so we need to figure out the concrete types of all the generics before the code can @@ -55,39 +57,99 @@ The monomorphization collector is run just before MIR lowering and codegen. collection and then partitions them into [codegen units](../appendix/glossary.md#codegen-unit). +## Codegen Unit (CGU) partitioning + +For better incremental build times, the CGU partitioner creates two CGU for each source level +modules. One is for "stable" i.e. non-generic code and the other is more volatile code i.e. +monoporphized/specialized instances. + +For depenencies, consider Crate A and Crate B, such that Crate B depends on Crate A. +The following table lists different scenarios for a function in Crate A that might be used by one +or more modules in Crate B. + +| Crate A function | Behavior | +| - | - | +| Non-generic function | Crate A function doesn't appear in any codegen units of Crate B | +| Non-generic `#[inline]` function | Crate A function appears with in a single CGU of Crate B, and exists even after post-inlining stage| +| Generic function | Regardless of inlining, all monoporphized (specialized) functions
from Crate A appear within a single codegen unit for Crate B.
The codegen unit exists even after the post inlining stage.| +| Generic `#[inline]` function | - same - | + +For more details about the partitioner read the module level [documentation]. + [mono]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/monomorphize/partitioning/fn.collect_and_partition_mono_items.html [codegen1]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/base/fn.codegen_crate.html +[documentation]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/monomorphize/partitioning/index.html ## Polymorphization As mentioned above, monomorphization produces fast code, but it comes at the -cost of compile time and binary size. [MIR -optimizations](../mir/optimizations.md) can help a bit with this. Another -optimization currently under development is called _polymorphization_. - -The general idea is that often we can share some code between monomorphized -copies of code. More precisely, if a MIR block is not dependent on a type -parameter, it may not need to be monomorphized into many copies. Consider the -following example: +cost of compile time and binary size. [MIR optimizations][miropt] can help a +bit with this. + +In addition to MIR optimizations, rustc attempts to determine when fewer +copies of functions are necessary and avoid making those copies - known +as "polymorphization". When a function-like item is found during +monomorphization collection, the +[`rustc_mir::monomorphize::polymorphize::unused_generic_params`][polymorph] +query is invoked, which traverses the MIR of the item to determine on which +generic parameters the item might not need duplicated. + +Currently, polymorphization only looks for unused generic parameters. These +are relatively rare in functions, but closures inherit the generic +parameters of their parent function and it is common for closures to not +use those inherited parameters. Without polymorphization, a copy of these +closures would be created for each copy of the parent function. By +creating fewer copies, less LLVM IR is generated and needs processed. + +`unused_generic_params` returns a `FiniteBitSet` where a bit is set if +the generic parameter of the corresponding index is unused. Any parameters +after the first sixty-four are considered used. + +The results of polymorphization analysis are used in the +[`Instance::polymorphize`][inst_polymorph] function to replace the +[`Instance`][inst]'s substitutions for the unused generic parameters with their +identity substitutions. + +Consider the example below: ```rust -pub fn f() { - g::(); - g::(); +fn foo() { + let x: Option = None; } -fn g() -> usize { - let n = 1; - let closure = || n; - closure() +fn main() { + foo::(); + foo::(); } ``` -In this case, we would currently collect `[f, g::, g::, -g::::{{closure}}, g::::{{closure}}]`, but notice that the two -closures would be identical -- they don't depend on the type parameter `T` of -function `g`. So we only need to emit one copy of the closure. +During monomorphization collection, `foo` will be collected with the +substitutions `[u16, u32]` and `[u64, u32]` (from its invocations in `main`). +`foo` has the identity substitutions `[A, B]` (or +`[ty::Param(0), ty::Param(1)]`). + +Polymorphization will identify `A` as being unused and it will be replaced in +the substitutions with the identity parameter before being added to the set +of collected items - thereby reducing the copies from two (`[u16, u32]` and +`[u64, u32]`) to one (`[A, u32]`). + +`unused_generic_params` will also invoked during code generation when the +symbol name for `foo` is being computed for use in the callsites of `foo` +(which have the regular substitutions present, otherwise there would be a +symbol mismatch between the caller and the function). + +As a result of polymorphization, items collected during monomorphization +cannot be assumed to be monomorphic. + +It is intended that polymorphization be extended to more advanced cases, +such as where only the size/alignment of a generic parameter are required. -For more information, see [this thread on github][polymorph]. +More details on polymorphization are available in the +[master's thesis][thesis] associated with polymorphization's initial +implementation. -[polymorph]: https://github.com/rust-lang/rust/issues/46477 +[miropt]: ../mir/optimizations.md +[polymorph]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/monomorphize/polymorphize/fn.unused_generic_params.html +[inst]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/instance/struct.Instance.html +[inst_polymorph]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/instance/struct.Instance.html#method.polymorphize +[thesis]: https://davidtw.co/media/masters_dissertation.pdf diff --git a/src/doc/rustc-dev-guide/src/backend/updating-llvm.md b/src/doc/rustc-dev-guide/src/backend/updating-llvm.md index 015514bab5..a9c3b45c41 100644 --- a/src/doc/rustc-dev-guide/src/backend/updating-llvm.md +++ b/src/doc/rustc-dev-guide/src/backend/updating-llvm.md @@ -1,5 +1,7 @@ # Updating LLVM + + The Rust compiler uses LLVM as its primary codegen backend today, and naturally we want to at least occasionally update this dependency! Currently we do not have a strict policy about when to update LLVM or what it can be updated to, but @@ -64,9 +66,9 @@ Example PRs look like: ## Feature updates -> Note that this is all information as applies to the current day in age. This -> process for updating LLVM changes with practically all LLVM updates, so this -> may be out of date! +> Note that this information is as of the time of this writing (December 2018). The process for updating LLVM changes with +practically all LLVM updates, so this may be out of date! Unlike bugfixes, updating to pick up a new feature of LLVM typically requires a lot more work. This is where we can't reasonably cherry-pick commits backwards @@ -96,9 +98,18 @@ through each in detail. * `./x.py build src/tools/lld` - same for LLD * `./x.py build` - build the rest of rustc - You'll likely need to update `src/rustllvm/*.cpp` to compile with updated - LLVM bindings. Note that you should use `#ifdef` and such to ensure that the - bindings still compile on older LLVM versions. + You'll likely need to update [`llvm-wrapper/*.cpp`][`llvm-wrapper`] to compile + with updated LLVM bindings. Note that you should use `#ifdef` and such to ensure + that the bindings still compile on older LLVM versions. + + Note that `profile = "compiler"` and other defaults set by `x.py setup` + download LLVM from CI instead of building it from source. You should + disable this temporarily to make sure your changes are being used, by setting + ```toml + [llvm] + download-ci-llvm = false + ``` + in config.toml. 4. Test for regressions across other platforms. LLVM often has at least one bug for non-tier-1 architectures, so it's good to do some more testing before @@ -122,18 +133,20 @@ through each in detail. 5. Prepare a PR to `rust-lang/rust`. Work with maintainers of `rust-lang/llvm-project` to get your commit in a branch of that repository, and then you can send a PR to `rust-lang/rust`. You'll change at least - `src/llvm-project` and will likely also change `src/rustllvm/*` as well. + `src/llvm-project` and will likely also change [`llvm-wrapper`] as well. For prior art, previous LLVM updates look like [#55835](https://github.com/rust-lang/rust/pull/55835) [#47828](https://github.com/rust-lang/rust/pull/47828) [#62474](https://github.com/rust-lang/rust/pull/62474) [#62592](https://github.com/rust-lang/rust/pull/62592). Note that sometimes it's -easiest to land `src/rustllvm/*` compatibility as a PR before actually updating +easiest to land [`llvm-wrapper`] compatibility as a PR before actually updating `src/llvm-project`. This way while you're working through LLVM issues others interested in trying out the new LLVM can benefit from work you've done to update the C++ bindings. +[`llvm-wrapper`]: https://github.com/rust-lang/rust/tree/master/compiler/rustc_llvm/llvm-wrapper + ### Caveats and gotchas Ideally the above instructions are pretty smooth, but here's some caveats to diff --git a/src/doc/rustc-dev-guide/src/borrow_check/moves_and_initialization/move_paths.md b/src/doc/rustc-dev-guide/src/borrow_check/moves_and_initialization/move_paths.md index 2c7c73038d..e38b923cf3 100644 --- a/src/doc/rustc-dev-guide/src/borrow_check/moves_and_initialization/move_paths.md +++ b/src/doc/rustc-dev-guide/src/borrow_check/moves_and_initialization/move_paths.md @@ -1,5 +1,7 @@ # Move paths + + In reality, it's not enough to track initialization at the granularity of local variables. Rust also allows us to do moves and initialization at the field granularity: @@ -7,11 +9,11 @@ at the field granularity: ```rust,ignore fn foo() { let a: (Vec, Vec) = (vec![22], vec![44]); - + // a.0 and a.1 are both initialized - + let b = a.0; // moves a.0 - + // a.0 is not initialized, but a.1 still is let c = a.0; // ERROR @@ -73,7 +75,7 @@ there is no need for a [`MovePathIndex`]. Some examples: there would be no move-path for `foo[1]`. - You cannot move from inside of a borrowed reference, so if we have e.g. `foo: &String`, there would be no move-path for `*foo`. - + These rules are enforced by the [`move_path_for`] function, which converts a [`Place`] into a [`MovePathIndex`] -- in error cases like those just discussed, the function returns an `Err`. This in turn @@ -102,7 +104,7 @@ of [`MoveData`]. There are two different methods: [`LookupResult`] indicating the closest path it was able to find that exists (e.g., for `foo[1]`, it might return just the path for `foo`). - + [`find`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/struct.MovePathLookup.html#method.find [`find_local`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/move_paths/struct.MovePathLookup.html#method.find_local [`mir::Local`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Local.html @@ -120,7 +122,7 @@ just over the paths that are **actually referenced** in the source, not all **possible** paths that could have been referenced). These references are used for example in the [`find_in_move_path_or_its_descendants`] function, which determines -whether a move-path (e.g., `a.b`) or any child of that move-path +whether a move-path (e.g., `a.b`) or any child of that move-path (e.g.,`a.b.c`) matches a given predicate. [`Place`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Place.html diff --git a/src/doc/rustc-dev-guide/src/borrow_check/region_inference.md b/src/doc/rustc-dev-guide/src/borrow_check/region_inference.md index 3b844b97c1..e14bc41579 100644 --- a/src/doc/rustc-dev-guide/src/borrow_check/region_inference.md +++ b/src/doc/rustc-dev-guide/src/borrow_check/region_inference.md @@ -1,5 +1,7 @@ # Region inference (NLL) + + The MIR-based region checking code is located in [the `rustc_mir::borrow_check` module][nll]. @@ -82,7 +84,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/region_infer/ +[ri]: https://github.com/rust-lang/rust/tree/master/compiler/rustc_mir/src/borrow_check/region_infer/ The kinds of region elements are as follows: diff --git a/src/doc/rustc-dev-guide/src/borrow_check/region_inference/constraint_propagation.md b/src/doc/rustc-dev-guide/src/borrow_check/region_inference/constraint_propagation.md index 1389628c89..f0a7f73535 100644 --- a/src/doc/rustc-dev-guide/src/borrow_check/region_inference/constraint_propagation.md +++ b/src/doc/rustc-dev-guide/src/borrow_check/region_inference/constraint_propagation.md @@ -1,5 +1,7 @@ # Constraint propagation + + The main work of the region inference is **constraint propagation**, which is done in the [`propagate_constraints`] function. There are three sorts of constraints that are used in NLL, and we'll explain how diff --git a/src/doc/rustc-dev-guide/src/borrow_check/region_inference/lifetime_parameters.md b/src/doc/rustc-dev-guide/src/borrow_check/region_inference/lifetime_parameters.md index 9d6b229ef3..c65b8ce5a5 100644 --- a/src/doc/rustc-dev-guide/src/borrow_check/region_inference/lifetime_parameters.md +++ b/src/doc/rustc-dev-guide/src/borrow_check/region_inference/lifetime_parameters.md @@ -1,5 +1,7 @@ # Universal regions + + "Universal regions" is the name that the code uses to refer to "named lifetimes" -- e.g., lifetime parameters and `'static`. The name derives from the fact that such lifetimes are "universally quantified" diff --git a/src/doc/rustc-dev-guide/src/borrow_check/region_inference/member_constraints.md b/src/doc/rustc-dev-guide/src/borrow_check/region_inference/member_constraints.md index 0435ff8c85..dfc4327e50 100644 --- a/src/doc/rustc-dev-guide/src/borrow_check/region_inference/member_constraints.md +++ b/src/doc/rustc-dev-guide/src/borrow_check/region_inference/member_constraints.md @@ -1,5 +1,7 @@ # Member constraints + + A member constraint `'m member of ['c_1..'c_N]` expresses that the region `'m` must be *equal* to some **choice regions** `'c_i` (for some `i`). These constraints cannot be expressed by users, but they @@ -91,14 +93,13 @@ member constraints come in. ## Choices are always lifetime parameters -At present, the "choice" regions from a member constraint are always -lifetime parameters from the current function. This falls out from the -placement of impl Trait, though in the future it may not be the case. -We take some advantage of this fact, as it simplifies the current -code. In particular, we don't have to consider a case like `'0 member -of ['1, 'static]`, in which the value of both `'0` and `'1` are being -inferred and hence changing. See [rust-lang/rust#61773][#61773] for more -information. +At present, the "choice" regions from a member constraint are always lifetime +parameters from the current function. As of January 2021, +this falls out from the placement of impl Trait, though in the future it may not +be the case. We take some advantage of this fact, as it simplifies the current +code. In particular, we don't have to consider a case like `'0 member of ['1, +'static]`, in which the value of both `'0` and `'1` are being inferred and hence +changing. See [rust-lang/rust#61773][#61773] for more information. [#61773]: https://github.com/rust-lang/rust/issues/61773 @@ -140,7 +141,7 @@ i.e., that `'0` must be *smaller* than. In our example, this would be examples, the chain may be more indirect. We can use upper bounds to rule out members in a very similar way to -lower lower bounds. If UB is some upper bound, then we know that `UB: +lower bounds. If UB is some upper bound, then we know that `UB: '0` must hold, so we can rule out any choice `'choice` where `UB: 'choice` does not hold. diff --git a/src/doc/rustc-dev-guide/src/borrow_check/region_inference/placeholders_and_universes.md b/src/doc/rustc-dev-guide/src/borrow_check/region_inference/placeholders_and_universes.md index eda8e6ff1d..967aa0d336 100644 --- a/src/doc/rustc-dev-guide/src/borrow_check/region_inference/placeholders_and_universes.md +++ b/src/doc/rustc-dev-guide/src/borrow_check/region_inference/placeholders_and_universes.md @@ -1,5 +1,7 @@ # Placeholders and universes + + From time to time we have to reason about regions that we can't concretely know. For example, consider this program: @@ -19,7 +21,7 @@ fn main() { ``` This program ought not to type-check: `foo` needs a static reference -for its argument, and `bar` wants to be given a function that that +for its argument, and `bar` wants to be given a function that accepts **any** reference (so it can call it with something on its stack, for example). But *how* do we reject it and *why*? @@ -61,10 +63,9 @@ we swap the left and right here): ``` According to the basic subtyping rules for a reference, this will be -true if `'!1: 'static`. That is – if "some unknown region `!1`" lives -outlives `'static`. Now, this *might* be true – after all, `'!1` -could be `'static` – but we don't *know* that it's true. So this -should yield up an error (eventually). +true if `'!1: 'static`. That is – if "some unknown region `!1`" outlives `'static`. +Now, this *might* be true – after all, `'!1` could be `'static` – +but we don't *know* that it's true. So this should yield up an error (eventually). ## What is a universe? @@ -74,7 +75,7 @@ index**. The idea of a "universe" is that it is a set of names that are in scope within some type or at some point. Universes are formed into a tree, where each child extends its parents with some new names. So the **root universe** conceptually contains global names, such as -the the lifetime `'static` or the type `i32`. In the compiler, we also +the lifetime `'static` or the type `i32`. In the compiler, we also put generic type parameters into this root universe (in this sense, there is not just one root universe, but one per item). So consider this function `bar`: diff --git a/src/doc/rustc-dev-guide/src/borrow_check/two_phase_borrows.md b/src/doc/rustc-dev-guide/src/borrow_check/two_phase_borrows.md index ad17bbb66d..a5e26c6a88 100644 --- a/src/doc/rustc-dev-guide/src/borrow_check/two_phase_borrows.md +++ b/src/doc/rustc-dev-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_middle/ty/adjustment/enum.AutoBorrow.html -[converted]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/hair/cx/expr/trait.ToBorrowKind.html#method.to_borrow_kind +[converted]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/thir/cx/expr/trait.ToBorrowKind.html#method.to_borrow_kind [`BorrowKind`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/enum.BorrowKind.html [`GatherBorrows`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/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-dev-guide/src/bug-fix-procedure.md b/src/doc/rustc-dev-guide/src/bug-fix-procedure.md index b4159097c0..8702f8aa94 100644 --- a/src/doc/rustc-dev-guide/src/bug-fix-procedure.md +++ b/src/doc/rustc-dev-guide/src/bug-fix-procedure.md @@ -1,4 +1,7 @@ # 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 @@ -65,7 +68,7 @@ described in more detail below): 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 `librustc_ast` that will affect plugins, the general policy +Finally, for changes to `rustc_ast` that will affect plugins, the general policy is to batch these changes. That is discussed below in more detail. ### Tracking issue @@ -120,7 +123,7 @@ 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`: +// 1. Define the lint in `compiler/rustc_middle/src/lint/builtin.rs`: declare_lint! { pub YOUR_ERROR_HERE, Warn, @@ -137,7 +140,7 @@ impl LintPass for HardwiredLints { } } -// 3. Register the lint in `src/librustc_lint/lib.rs`: +// 3. Register the lint in `compiler/rustc_lint/src/lib.rs`: store.register_future_incompatible(sess, vec![ ..., FutureIncompatibleInfo { @@ -235,7 +238,7 @@ automatically generates the lower-case string; so searching for #### Remove the lint. The first reference you will likely find is the lint definition [in -`librustc/lint/builtin.rs` that resembles this][defsource]: +`rustc_session/src/lint/builtin.rs` that resembles this][defsource]: [defsource]: https://github.com/rust-lang/rust/blob/085d71c3efe453863739c1fb68fd9bd1beff214f/src/librustc/lint/builtin.rs#L171-L175 @@ -249,12 +252,12 @@ declare_lint! { 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, +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 +Next, you see [a reference to `OVERLAPPING_INHERENT_IMPLS` in +`rustc_lint/src/lib.rs`][futuresource]. This is defining the lint as a "future compatibility lint": ```rust @@ -268,7 +271,7 @@ 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". +In `compiler/rustc_lint/src/lib.rs` there is a list of "renamed and removed lints". You can add this lint to the list: ```rust diff --git a/src/doc/rustc-dev-guide/src/building/bootstrapping.md b/src/doc/rustc-dev-guide/src/building/bootstrapping.md index 5bdc8dc6f1..61537dbf87 100644 --- a/src/doc/rustc-dev-guide/src/building/bootstrapping.md +++ b/src/doc/rustc-dev-guide/src/building/bootstrapping.md @@ -1,43 +1,215 @@ # Bootstrapping the Compiler + + This subchapter is about the bootstrapping process. -When running `x.py` you will see output such as: - -```txt -Building stage0 std artifacts -Copying stage0 std from stage0 -Building stage0 compiler artifacts -Copying stage0 rustc from stage0 -Building LLVM for x86_64-apple-darwin -Building stage0 codegen artifacts -Assembling stage1 compiler -Building stage1 std artifacts -Copying stage1 std from stage1 -Building stage1 compiler artifacts -Copying stage1 rustc from stage1 -Building stage1 codegen artifacts -Assembling stage2 compiler -Uplifting stage1 std -Copying stage2 std from stage1 -Generating unstable book md files -Building stage0 tool unstable-book-gen -Building stage0 tool rustbook -Documenting standalone -Building rustdoc for stage2 -Documenting book redirect pages -Documenting stage2 std -Building rustdoc for stage1 -Documenting stage2 whitelisted compiler -Documenting stage2 compiler -Documenting stage2 rustdoc -Documenting error index -Uplifting stage1 rustc -Copying stage2 rustc from stage1 -Building stage2 tool error_index_generator -``` +## What is bootstrapping? How does it work? + +[Bootstrapping] is the process of using a compiler to compile itself. +More accurately, it means using an older compiler to compile a newer version +of the same compiler. + +This raises a chicken-and-egg paradox: where did the first compiler come from? +It must have been written in a different language. In Rust's case it was +[written in OCaml][ocaml-compiler]. However it was abandoned long ago and the +only way to build a modern version of rustc is a slightly less modern +version. + +This is exactly how `x.py` works: it downloads the current beta release of +rustc, then uses it to compile the new compiler. + +## Stages of bootstrapping + +Compiling `rustc` is done in stages: + +- **Stage 0:** the stage0 compiler is usually (you can configure `x.py` to use + something else) the current _beta_ `rustc` compiler and its associated dynamic + libraries (which `x.py` will download for you). This stage0 compiler is then + used only to compile `rustbuild`, `std`, and `rustc`. When compiling + `rustc`, this stage0 compiler uses the freshly compiled `std`. + There are two concepts at play here: a compiler (with its set of dependencies) + and its 'target' or 'object' libraries (`std` and `rustc`). + Both are staged, but in a staggered manner. +- **Stage 1:** the code in your clone (for new version) is then + compiled with the stage0 compiler to produce the stage1 compiler. + However, it was built with an older compiler (stage0), so to + optimize the stage1 compiler we go to next the stage. + - In theory, the stage1 compiler is functionally identical to the + stage2 compiler, but in practice there are subtle differences. In + particular, the stage1 compiler itself was built by stage0 and + hence not by the source in your working directory: this means that + the symbol names used in the compiler source may not match the + symbol names that would have been made by the stage1 compiler. This is + important when using dynamic linking and the lack of ABI compatibility + between versions. This primarily manifests when tests try to link with any + of the `rustc_*` crates or use the (now deprecated) plugin infrastructure. + These tests are marked with `ignore-stage1`. +- **Stage 2:** we rebuild our stage1 compiler with itself to produce + the stage2 compiler (i.e. it builds itself) to have all the _latest + optimizations_. (By default, we copy the stage1 libraries for use by + the stage2 compiler, since they ought to be identical.) +- _(Optional)_ **Stage 3**: to sanity check our new compiler, we + can build the libraries with the stage2 compiler. The result ought + to be identical to before, unless something has broken. + +The `stage2` compiler is the one distributed with `rustup` and all other +install methods. However, it takes a very long time to build because one must +first build the new compiler with an older compiler and then use that to +build the new compiler with itself. For development, you usually only want +the `stage1` compiler: `x.py build library/std`. + +### Default stages + +`x.py` tries to be helpful and pick the stage you most likely meant for each subcommand. +These defaults are as follows: + +- `check`: `--stage 0` +- `doc`: `--stage 0` +- `build`: `--stage 1` +- `test`: `--stage 1` +- `dist`: `--stage 2` +- `install`: `--stage 2` +- `bench`: `--stage 2` + +You can always override the stage by passing `--stage N` explicitly. + +For more information about stages, [see below](#understanding-stages-of-bootstrap). + +## Complications of bootstrapping + +Since the build system uses the current beta compiler to build the stage-1 +bootstrapping compiler, the compiler source code can't use some features +until they reach beta (because otherwise the beta compiler doesn't support +them). On the other hand, for [compiler intrinsics][intrinsics] and internal +features, the features _have_ to be used. Additionally, the compiler makes +heavy use of nightly features (`#![feature(...)]`). How can we resolve this +problem? + +There are two methods used: +1. The build system sets `--cfg bootstrap` when building with `stage0`, so we +can use `cfg(not(bootstrap))` to only use features when built with `stage1`. +This is useful for e.g. features that were just stabilized, which require +`#![feature(...)]` when built with `stage0`, but not for `stage1`. +2. The build system sets `RUSTC_BOOTSTRAP=1`. This special variable means to +_break the stability guarantees_ of rust: Allow using `#![feature(...)]` with +a compiler that's not nightly. This should never be used except when +bootstrapping the compiler. + +[Bootstrapping]: https://en.wikipedia.org/wiki/Bootstrapping_(compilers) +[intrinsics]: ../appendix/glossary.md#intrinsic +[ocaml-compiler]: https://github.com/rust-lang/rust/tree/ef75860a0a72f79f97216f8aaa5b388d98da6480/src/boot + +## Contributing to bootstrap + +When you use the bootstrap system, you'll call it through `x.py`. +However, most of the code lives in `src/bootstrap`. +`bootstrap` has a difficult problem: it is written in Rust, but yet it is run +before the rust compiler is built! To work around this, there are two +components of bootstrap: the main one written in rust, and `bootstrap.py`. +`bootstrap.py` is what gets run by `x.py`. It takes care of downloading the +`stage0` compiler, which will then build the bootstrap binary written in +Rust. + +Because there are two separate codebases behind `x.py`, they need to +be kept in sync. In particular, both `bootstrap.py` and the bootstrap binary +parse `config.toml` and read the same command line arguments. `bootstrap.py` +keeps these in sync by setting various environment variables, and the +programs sometimes have to add arguments that are explicitly ignored, to be +read by the other. + +### Adding a setting to config.toml + +This section is a work in progress. In the meantime, you can see an example +contribution [here][bootstrap-build]. + +[bootstrap-build]: https://github.com/rust-lang/rust/pull/71994 + +## Understanding stages of bootstrap + +### Overview + +This is a detailed look into the separate bootstrap stages. + +The convention `x.py` uses is that: +- A `--stage N` flag means to run the stage N compiler (`stageN/rustc`). +- A "stage N artifact" is a build artifact that is _produced_ by the stage N compiler. +- The "stage (N+1) compiler" is assembled from "stage N artifacts". This + process is called _uplifting_. + +#### Build artifacts + +Anything you can build with `x.py` is a _build artifact_. +Build artifacts include, but are not limited to: + +- binaries, like `stage0-rustc/rustc-main` +- shared objects, like `stage0-sysroot/rustlib/libstd-6fae108520cf72fe.so` +- [rlib] files, like `stage0-sysroot/rustlib/libstd-6fae108520cf72fe.rlib` +- HTML files generated by rustdoc, like `doc/std` + +[rlib]: ../serialization.md + +#### Assembling the compiler + +There is a separate step between building the compiler and making it possible +to run. This step is called _assembling_ or _uplifting_ the compiler. It copies +all the necessary build artifacts from `build/stageN-sysroot` to +`build/stage(N+1)`, which allows you to use `build/stage(N+1)` as a [toolchain] +with `rustup toolchain link`. + +There is [no way to trigger this step on its own][#73519], but `x.py` will +perform it automatically any time you build with stage N+1. + +[toolchain]: https://rustc-dev-guide.rust-lang.org/building/how-to-build-and-run.html#creating-a-rustup-toolchain +[#73519]: https://github.com/rust-lang/rust/issues/73519 + +#### Examples + +- `x.py build --stage 0` means to build with the beta `rustc`. +- `x.py doc --stage 0` means to document using the beta `rustdoc`. +- `x.py test --stage 0 library/std` means to run tests on the standard library + without building `rustc` from source ('build with stage 0, then test the + artifacts'). If you're working on the standard library, this is normally the + test command you want. +- `x.py test src/test/ui` means to build the stage 1 compiler and run + `compiletest` on it. If you're working on the compiler, this is normally the + test command you want. + +#### Examples of what *not* to do + +- `x.py test --stage 0 src/test/ui` is not meaningful: it runs tests on the + _beta_ compiler and doesn't build `rustc` from source. Use `test src/test/ui` + instead, which builds stage 1 from source. +- `x.py test --stage 0 compiler/rustc` builds the compiler but runs no tests: + it's running `cargo test -p rustc`, but cargo doesn't understand Rust's + tests. You shouldn't need to use this, use `test` instead (without arguments). +- `x.py build --stage 0 compiler/rustc` builds the compiler, but does + not [assemble] it. Use `x.py build library/std` instead, which puts the + compiler in `stage1/rustc`. + +[assemble]: #assembling-the-compiler + +### Building vs. Running + + +Note that `build --stage N compiler/rustc` **does not** build the stage N compiler: +instead it builds the stage _N+1_ compiler _using_ the stage N compiler. + +In short, _stage 0 uses the stage0 compiler to create stage0 artifacts which +will later be uplifted to be the stage1 compiler_. + +In each stage, two major steps are performed: + +1. `std` is compiled by the stage N compiler. +2. That `std` is linked to programs built by the stage N compiler, including + the stage N artifacts (stage (N+1) compiler). + +This is somewhat intuitive if one thinks of the stage N artifacts as "just" +another program we are building with the stage N compiler: +`build --stage N compiler/rustc` is linking the stage N artifacts to the `std` +built by the stage N compiler. -A deeper look into `x.py`'s phases can be seen here: +Here is a chart of a full build using `x.py`: A diagram of the rustc compilation phases @@ -45,19 +217,160 @@ Keep in mind this diagram is a simplification, i.e. `rustdoc` can be built at different stages, the process is a bit different when passing flags such as `--keep-stage`, or if there are non-host targets. +The stage 2 compiler is what is shipped to end-users. + +### Stages and `std` + +Note that there are two `std` libraries in play here: +1. The library _linked_ to `stageN/rustc`, which was built by stage N-1 (stage N-1 `std`) +2. The library _used to compile programs_ with `stageN/rustc`, which was + built by stage N (stage N `std`). + +Stage N `std` is pretty much necessary for any useful work with the stage N compiler. +Without it, you can only compile programs with `#![no_core]` -- not terribly useful! + +The reason these need to be different is because they aren't necessarily ABI-compatible: +there could be a new layout optimizations, changes to MIR, or other changes +to Rust metadata on nightly that aren't present in beta. + +This is also where `--keep-stage 1 library/std` comes into play. Since most +changes to the compiler don't actually change the ABI, once you've produced a +`std` in stage 1, you can probably just reuse it with a different compiler. +If the ABI hasn't changed, you're good to go, no need to spend time +recompiling that `std`. +`--keep-stage` simply assumes the previous compile is fine and copies those +artifacts into the appropriate place, skipping the cargo invocation. + +### Cross-compiling + +Building stage2 `std` is different depending on whether you are cross-compiling or not +(see in the table how stage2 only builds non-host `std` targets). +This is because `x.py` uses a trick: if `HOST` and `TARGET` are the same, +it will reuse stage1 `std` for stage2! This is sound because stage1 `std` +was compiled with the stage1 compiler, i.e. a compiler using the source code +you currently have checked out. So it should be identical (and therefore ABI-compatible) +to the `std` that `stage2/rustc` would compile. + +However, when cross-compiling, stage1 `std` will only run on the host. +So the stage2 compiler has to recompile `std` for the target. + +### Why does only libstd use `cfg(bootstrap)`? + +The `rustc` generated by the stage0 compiler is linked to the freshly-built +`std`, which means that for the most part only `std` needs to be cfg-gated, +so that `rustc` can use features added to std immediately after their addition, +without need for them to get into the downloaded beta. + +Note this is different from any other Rust program: stage1 `rustc` +is built by the _beta_ compiler, but using the _master_ version of libstd! + +The only time `rustc` uses `cfg(bootstrap)` is when it adds internal lints +that use diagnostic items. This happens very rarely. + +### What is a 'sysroot'? + +When you build a project with cargo, the build artifacts for dependencies +are normally stored in `target/debug/deps`. This only contains dependencies cargo +knows about; in particular, it doesn't have the standard library. Where do +`std` or `proc_macro` come from? It comes from the **sysroot**, the root +of a number of directories where the compiler loads build artifacts at runtime. +The sysroot doesn't just store the standard library, though - it includes +anything that needs to be loaded at runtime. That includes (but is not limited +to): + +- `libstd`/`libtest`/`libproc_macro` +- The compiler crates themselves, when using `rustc_private`. In-tree these + are always present; out of tree, you need to install `rustc-dev` with rustup. +- `libLLVM.so`, the shared object file for the LLVM project. In-tree this is + either built from source or downloaded from CI; out-of-tree, you need to + install `llvm-tools-preview` with rustup. + +All the artifacts listed so far are *compiler* runtime dependencies. You can +see them with `rustc --print sysroot`: + +``` +$ ls $(rustc --print sysroot)/lib +libchalk_derive-0685d79833dc9b2b.so libstd-25c6acf8063a3802.so +libLLVM-11-rust-1.50.0-nightly.so libtest-57470d2aa8f7aa83.so +librustc_driver-4f0cc9f50e53f0ba.so libtracing_attributes-e4be92c35ab2a33b.so +librustc_macros-5f0ec4a119c6ac86.so rustlib +``` + +There are also runtime dependencies for the standard library! These are in +`lib/rustlib`, not `lib/` directly. + +``` +$ ls $(rustc --print sysroot)/lib/rustlib/x86_64-unknown-linux-gnu/lib | head -n 5 +libaddr2line-6c8e02b8fedc1e5f.rlib +libadler-9ef2480568df55af.rlib +liballoc-9c4002b5f79ba0e1.rlib +libcfg_if-512eb53291f6de7e.rlib +libcompiler_builtins-ef2408da76957905.rlib +``` + +`rustlib` includes libraries like `hashbrown` and `cfg_if`, which are not part +of the public API of the standard library, but are used to implement it. +`rustlib` is part of the search path for linkers, but `lib` will never be part +of the search path. + +#### -Z force-unstable-if-unmarked + +Since `rustlib` is part of the search path, it means we have to be careful +about which crates are included in it. In particular, all crates except for +the standard library are built with the flag `-Z force-unstable-if-unmarked`, +which means that you have to use `#![feature(rustc_private)]` in order to +load it (as opposed to the standard library, which is always available). + +The `-Z force-unstable-if-unmarked` flag has a variety of purposes to help +enforce that the correct crates are marked as unstable. It was introduced +primarily to allow rustc and the standard library to link to arbitrary crates +on crates.io which do not themselves use `staged_api`. `rustc` also relies on +this flag to mark all of its crates as unstable with the `rustc_private` +feature so that each crate does not need to be carefully marked with +`unstable`. + +This flag is automatically applied to all of `rustc` and the standard library +by the bootstrap scripts. This is needed because the compiler and all of its +dependencies are shipped in the sysroot to all users. + +This flag has the following effects: + +- Marks the crate as "unstable" with the `rustc_private` feature if it is not + itself marked as stable or unstable. +- Allows these crates to access other forced-unstable crates without any need + for attributes. Normally a crate would need a `#![feature(rustc_private)]` + attribute to use other unstable crates. However, that would make it + impossible for a crate from crates.io to access its own dependencies since + that crate won't have a `feature(rustc_private)` attribute, but *everything* + is compiled with `-Z force-unstable-if-unmarked`. + +Code which does not use `-Z force-unstable-if-unmarked` should include the +`#![feature(rustc_private)]` crate attribute to access these force-unstable +crates. This is needed for things that link `rustc`, such as `miri`, `rls`, or +`clippy`. + +You can find more discussion about sysroots in: +- The [rustdoc PR] explaining why it uses `extern crate` for dependencies loaded from sysroot +- [Discussions about sysroot on Zulip](https://rust-lang.zulipchat.com/#narrow/stream/182449-t-compiler.2Fhelp/topic/deps.20in.20sysroot/) +- [Discussions about building rustdoc out of tree](https://rust-lang.zulipchat.com/#narrow/stream/182449-t-compiler.2Fhelp/topic/How.20to.20create.20an.20executable.20accessing.20.60rustc_private.60.3F) + +[rustdoc PR]: https://github.com/rust-lang/rust/pull/76728 + +### Directories and artifacts generated by x.py + The following tables indicate the outputs of various stage actions: | Stage 0 Action | Output | |-----------------------------------------------------------|----------------------------------------------| | `beta` extracted | `build/HOST/stage0` | | `stage0` builds `bootstrap` | `build/bootstrap` | -| `stage0` builds `libstd` | `build/HOST/stage0-std/TARGET` | +| `stage0` builds `test`/`std` | `build/HOST/stage0-std/TARGET` | | copy `stage0-std` (HOST only) | `build/HOST/stage0-sysroot/lib/rustlib/HOST` | | `stage0` builds `rustc` with `stage0-sysroot` | `build/HOST/stage0-rustc/HOST` | | copy `stage0-rustc (except executable)` | `build/HOST/stage0-sysroot/lib/rustlib/HOST` | | build `llvm` | `build/HOST/llvm` | | `stage0` builds `codegen` with `stage0-sysroot` | `build/HOST/stage0-codegen/HOST` | -| `stage0` builds `rustdoc` with `stage0-sysroot` | `build/HOST/stage0-tools/HOST` | +| `stage0` builds `rustdoc`, `clippy`, `miri`, with `stage0-sysroot` | `build/HOST/stage0-tools/HOST` | `--stage=0` stops here. @@ -66,7 +379,7 @@ The following tables indicate the outputs of various stage actions: | copy (uplift) `stage0-rustc` executable to `stage1` | `build/HOST/stage1/bin` | | copy (uplift) `stage0-codegen` to `stage1` | `build/HOST/stage1/lib` | | copy (uplift) `stage0-sysroot` to `stage1` | `build/HOST/stage1/lib` | -| `stage1` builds `libstd` | `build/HOST/stage1-std/TARGET` | +| `stage1` builds `test`/`std` | `build/HOST/stage1-std/TARGET` | | copy `stage1-std` (HOST only) | `build/HOST/stage1/lib/rustlib/HOST` | | `stage1` builds `rustc` | `build/HOST/stage1-rustc/HOST` | | copy `stage1-rustc` (except executable) | `build/HOST/stage1/lib/rustlib/HOST` | @@ -74,90 +387,22 @@ The following tables indicate the outputs of various stage actions: `--stage=1` stops here. -| Stage 2 Action | Output | -|-------------------------------------------|-----------------------------------------------------------------| -| copy (uplift) `stage1-rustc` executable | `build/HOST/stage2/bin` | -| copy (uplift) `stage1-sysroot` | `build/HOST/stage2/lib and build/HOST/stage2/lib/rustlib/HOST` | -| `stage2` builds `libstd` (except HOST?) | `build/HOST/stage2-std/TARGET` | -| copy `stage2-std` (not HOST targets) | `build/HOST/stage2/lib/rustlib/TARGET` | -| `stage2` builds `rustdoc` | `build/HOST/stage2-tools/HOST` | -| copy `rustdoc` | `build/HOST/stage2/bin` | +| Stage 2 Action | Output | +|--------------------------------------------------------|-----------------------------------------------------------------| +| copy (uplift) `stage1-rustc` executable | `build/HOST/stage2/bin` | +| copy (uplift) `stage1-sysroot` | `build/HOST/stage2/lib and build/HOST/stage2/lib/rustlib/HOST` | +| `stage2` builds `test`/`std` (not HOST targets) | `build/HOST/stage2-std/TARGET` | +| copy `stage2-std` (not HOST targets) | `build/HOST/stage2/lib/rustlib/TARGET` | +| `stage2` builds `rustdoc`, `clippy`, `miri` | `build/HOST/stage2-tools/HOST` | +| copy `rustdoc` | `build/HOST/stage2/bin` | `--stage=2` stops here. -Note that the convention `x.py` uses is that: -- A "stage N artifact" is an artifact that is _produced_ by the stage N compiler. -- The "stage (N+1) compiler" is assembled from "stage N artifacts". -- A `--stage N` flag means build _with_ stage N. - -In short, _stage 0 uses the stage0 compiler to create stage0 artifacts which -will later be uplifted to stage1_. - -Every time any of the main artifacts (`std` and `rustc`) are compiled, two -steps are performed. -When `std` is compiled by a stage N compiler, that `std` will be linked to -programs built by the stage N compiler (including `rustc` built later -on). It will also be used by the stage (N+1) compiler to link against itself. -This is somewhat intuitive if one thinks of the stage (N+1) compiler as "just" -another program we are building with the stage N compiler. In some ways, `rustc` -(the binary, not the `rustbuild` step) could be thought of as one of the few -`no_core` binaries out there. - -So "stage0 std artifacts" are in fact the output of the downloaded stage0 -compiler, and are going to be used for anything built by the stage0 compiler: -e.g. `rustc` artifacts. When it announces that it is "building stage1 -std artifacts" it has moved on to the next bootstrapping phase. This pattern -continues in latter stages. - -Also note that building host `std` and target `std` are different based on the -stage (e.g. see in the table how stage2 only builds non-host `std` targets. -This is because during stage2, the host `std` is uplifted from the "stage 1" -`std` -- specifically, when "Building stage 1 artifacts" is announced, it is -later copied into stage2 as well (both the compiler's `libdir` and the -`sysroot`). - -This `std` is pretty much necessary for any useful work with the compiler. -Specifically, it's used as the `std` for programs compiled by the newly compiled -compiler (so when you compile `fn main() { }` it is linked to the last `std` -compiled with `x.py build --stage 1 src/libstd`). - -The `rustc` generated by the stage0 compiler is linked to the freshly-built -`libstd`, which means that for the most part only `std` needs to be cfg-gated, -so that `rustc` can use featured added to std immediately after their addition, -without need for them to get into the downloaded beta. The `libstd` built by the -`stage1/bin/rustc` compiler, also known as "stage1 std artifacts", is not -necessarily ABI-compatible with that compiler. -That is, the `rustc` binary most likely could not use this `std` itself. -It is however ABI-compatible with any programs that the `stage1/bin/rustc` -binary builds (including itself), so in that sense they're paired. - -This is also where `--keep-stage 1 src/libstd` comes into play. Since most -changes to the compiler don't actually change the ABI, once you've produced a -`libstd` in stage 1, you can probably just reuse it with a different compiler. -If the ABI hasn't changed, you're good to go, no need to spend the time -recompiling that `std`. -`--keep-stage` simply assumes the previous compile is fine and copies those -artifacts into the appropriate place, skipping the cargo invocation. +## Passing stage-specific flags to `rustc` -The reason we first build `std`, then `rustc`, is largely just -because we want to minimize `cfg(stage0)` in the code for `rustc`. -Currently `rustc` is always linked against a "new" `std` so it doesn't -ever need to be concerned with differences in std; it can assume that the std is -as fresh as possible. - -The reason we need to build it twice is because of ABI compatibility. -The beta compiler has it's own ABI, and then the `stage1/bin/rustc` compiler -will produce programs/libraries with the new ABI. -We used to build three times, but because we assume that the ABI is constant -within a codebase, we presume that the libraries produced by the "stage2" -compiler (produced by the `stage1/bin/rustc` compiler) is ABI-compatible with -the `stage1/bin/rustc` compiler's produced libraries. -What this means is that we can skip that final compilation -- and simply use the -same libraries as the `stage2/bin/rustc` compiler uses itself for programs it -links against. - -This `stage2/bin/rustc` compiler is shipped to end-users, along with the -`stage 1 {std,rustc}` artifacts. +`x.py` allows you to pass stage-specific flags to `rustc` when bootstrapping. +The `RUSTFLAGS_BOOTSTRAP` environment variable is passed as RUSTFLAGS to the bootstrap stage +(stage0), and `RUSTFLAGS_NOT_BOOTSTRAP` is passed when building artifacts for later stages. ## Environment Variables @@ -167,12 +412,12 @@ variables that are used. If you are trying to run an intermediate version of 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 +thread 'main' panicked at 'RUSTC_STAGE was not set: NotPresent', library/core/src/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 +`rustc` or `std` 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-dev-guide/src/building/compiler-documenting.md b/src/doc/rustc-dev-guide/src/building/compiler-documenting.md index 68c9fd2279..af3cd7ce28 100644 --- a/src/doc/rustc-dev-guide/src/building/compiler-documenting.md +++ b/src/doc/rustc-dev-guide/src/building/compiler-documenting.md @@ -9,11 +9,14 @@ since documentation is more about the content. ## Document everything +This uses the beta rustdoc, which usually but not always has the same output +as stage 1 rustdoc. + ```bash ./x.py doc ``` -## If you want to avoid the whole Stage 2 build +## If you want to be sure that the links behave the same as on CI ```bash ./x.py doc --stage 1 @@ -27,7 +30,7 @@ and then it documents the files. ```bash ./x.py doc src/doc/book ./x.py doc src/doc/nomicon -./x.py doc src/doc/book src/libstd +./x.py doc src/doc/book library/std ``` Much like individual tests or building certain components you can build only diff --git a/src/doc/rustc-dev-guide/src/building/how-to-build-and-run.md b/src/doc/rustc-dev-guide/src/building/how-to-build-and-run.md index dbe1f4c7ae..a97568e6eb 100644 --- a/src/doc/rustc-dev-guide/src/building/how-to-build-and-run.md +++ b/src/doc/rustc-dev-guide/src/building/how-to-build-and-run.md @@ -6,15 +6,26 @@ be hacking on `rustc`, you'll want to tweak the configuration of the compiler. The default configuration is oriented towards running the compiler as a user, not a developer. -## Create a config.toml +For instructions on how to install Python and other prerequisites, +see [the next page](./prerequisites.md). + +## Get the source code + +The very first step to work on `rustc` is to clone the repository: + +```bash +git clone https://github.com/rust-lang/rust.git +cd rust +``` + +## Create a `config.toml` To start, copy [`config.toml.example`] to `config.toml`: [`config.toml.example`]: https://github.com/rust-lang/rust/blob/master/config.toml.example ```bash -> cd $RUST_CHECKOUT -> cp config.toml.example config.toml +cp config.toml.example config.toml ``` Then you will want to open up the file and change the following @@ -22,23 +33,22 @@ settings (and possibly others, such as `llvm.ccache`): ```toml [llvm] -# Enables LLVM assertions, which will check that the LLVM bitcode generated -# by the compiler is internally consistent. These are particularly helpful -# if you edit `codegen`. +# Indicates whether the LLVM assertions are enabled or not assertions = true [rust] -# This will make your build more parallel; it costs a bit of runtime -# performance perhaps (less inlining) but it's worth it. -codegen-units = 0 - -# This enables full debuginfo and debug assertions. The line debuginfo is also -# enabled by `debuginfo-level = 1`. Full debuginfo is also enabled by -# `debuginfo-level = 2`. Debug assertions can also be enabled with -# `debug-assertions = true`. Note that `debug = true` will make your build -# slower, so you may want to try individually enabling debuginfo and assertions -# or enable only line debuginfo which is basically free. -debug = true +# Whether or not to leave debug! and trace! calls in the rust binary. +# Overrides the `debug-assertions` option, if defined. +# +# Defaults to rust.debug-assertions value +# +# If you see a message from `tracing` saying +# `max_level_info` is enabled and means logging won't be shown, +# set this value to `true`. +debug-logging = true + +# Whether to always use incremental compilation when building rustc +incremental = true ``` If you have already built `rustc`, then you may have to execute `rm -rf build` for subsequent @@ -57,58 +67,27 @@ effectively deal with the repo for various common tasks. This chapter focuses on the basics to be productive, but if you want to learn more about `x.py`, read its README.md [here](https://github.com/rust-lang/rust/blob/master/src/bootstrap/README.md). +To read more about the bootstrap process and why `x.py` is necessary, +[read this chapter][bootstrap]. + +### Running `x.py` slightly more conveniently + +There is a binary that wraps `x.py` called `x` in `src/tools/x`. All it does is +run `x.py`, but it can be installed system-wide and run from any subdirectory +of a checkout. It also looks up the appropriate version of `python` to use. -## Bootstrapping - -One thing to keep in mind is that `rustc` is a _bootstrapping_ -compiler. That is, since `rustc` is written in Rust, we need to use an -older version of the compiler to compile the newer version. In -particular, the newer version of the compiler and some of the artifacts needed -to build it, such as `libstd` and other tooling, may use some unstable features -internally, requiring a specific version which understands these unstable -features. - -The result is that compiling `rustc` is done in stages: - -- **Stage 0:** the stage0 compiler is usually (you can configure `x.py` to use - something else) the current _beta_ `rustc` compiler and its associated dynamic - libraries (which `x.py` will download for you). This stage0 compiler is then - used only to compile `rustbuild`, `std`, and `rustc`. When compiling - `rustc`, this stage0 compiler uses the freshly compiled `std`. - There are two concepts at play here: a compiler (with its set of dependencies) - and its 'target' or 'object' libraries (`std` and `rustc`). - Both are staged, but in a staggered manner. -- **Stage 1:** the code in your clone (for new version) is then - compiled with the stage0 compiler to produce the stage1 compiler. - However, it was built with an older compiler (stage0), so to - optimize the stage1 compiler we go to next the stage. - - In theory, the stage1 compiler is functionally identical to the - stage2 compiler, but in practice there are subtle differences. In - particular, the stage1 compiler itself was built by stage0 and - hence not by the source in your working directory: this means that - the symbol names used in the compiler source may not match the - symbol names that would have been made by the stage1 compiler. - This can be important when using dynamic linking (e.g., with - derives. Sometimes this means that some tests don't work when run - with stage1. -- **Stage 2:** we rebuild our stage1 compiler with itself to produce - the stage2 compiler (i.e. it builds itself) to have all the _latest - optimizations_. (By default, we copy the stage1 libraries for use by - the stage2 compiler, since they ought to be identical.) -- _(Optional)_ **Stage 3**: to sanity check our new compiler, we - can build the libraries with the stage2 compiler. The result ought - to be identical to before, unless something has broken. - -To read more about the bootstrap process, [read this chapter][bootstrap]. +You can install it with `cargo install --path src/tools/x`. [bootstrap]: ./bootstrapping.md ## Building the Compiler -To build a compiler, run `./x.py build`. This will do the whole bootstrapping -process described above, producing a usable compiler toolchain from the source -code you have checked out. This takes a long time, so it is not usually what -you want to actually run (more on this later). +To build a compiler, run `./x.py build`. This will build up to the stage1 compiler, +including `rustdoc`, producing a usable compiler toolchain from the source +code you have checked out. + +Note that building will require a relatively large amount of storage space. +You may want to have upwards of 10 or 15 gigabytes available to build the compiler. There are many flags you can pass to the build command of `x.py` that can be beneficial to cutting down compile times or fitting other things you might @@ -138,23 +117,21 @@ It is, in particular, very useful when you're doing some kind of "type-based refactoring", like renaming a method, or changing the signature of some function. - - -Once you've created a config.toml, you are now ready to run +Once you've created a `config.toml`, you are now ready to run `x.py`. There are a lot of options here, but let's start with what is probably the best "go to" command for building a local rust: ```bash -./x.py build -i --stage 1 src/libstd +./x.py build -i library/std ``` -This may *look* like it only builds `libstd`, but that is not the case. +This may *look* like it only builds `std`, but that is not the case. What this command does is the following: -- Build `libstd` using the stage0 compiler (using incremental) -- Build `librustc` using the stage0 compiler (using incremental) +- Build `std` using the stage0 compiler (using incremental) +- Build `rustc` using the stage0 compiler (using incremental) - This produces the stage1 compiler -- Build `libstd` using the stage1 compiler (cannot use incremental) +- Build `std` using the stage1 compiler (cannot use incremental) This final product (stage1 compiler + libs built using that compiler) is what you need to build other rust programs (unless you use `#![no_std]` or @@ -170,45 +147,39 @@ stage1 libraries. This is because incremental only works when you run the *same compiler* twice in a row. In this case, we are building a *new stage1 compiler* every time. Therefore, the old incremental results may not apply. **As a result, you will probably find that -building the stage1 `libstd` is a bottleneck for you** -- but fear not, +building the stage1 `std` is a bottleneck for you** -- but fear not, there is a (hacky) workaround. See [the section on "recommended workflows"](./suggested.md) below. Note that this whole command just gives you a subset of the full `rustc` -build. The **full** `rustc` build (what you get if you just say `./x.py -build`) has quite a few more steps: +build. The **full** `rustc` build (what you get if you say `./x.py build +--stage 2 compiler/rustc`) has quite a few more steps: -- Build `librustc` and `rustc` with the stage1 compiler. +- Build `rustc` with the stage1 compiler. - The resulting compiler here is called the "stage2" compiler. -- Build `libstd` with stage2 compiler. +- Build `std` with stage2 compiler. - Build `librustdoc` and a bunch of other things with the stage2 compiler. ## Build specific components -Build only the libcore library +- Build only the core library ```bash -./x.py build src/libcore +./x.py build --stage 0 library/core ``` -Build the libcore and libproc_macro library only +- Build only the core and `proc_macro` libraries ```bash -./x.py build src/libcore src/libproc_macro -``` - -Build only libcore up to Stage 1 - -```bash -./x.py build src/libcore --stage 1 +./x.py build --stage 0 library/core library/proc_macro ``` Sometimes you might just want to test if the part you’re working on can compile. Using these commands you can test that it compiles before doing a bigger build to make sure it works with the compiler. As shown before -you can also pass flags at the end such as --stage. +you can also pass flags at the end such as `--stage`. ## Creating a rustup toolchain @@ -237,13 +208,13 @@ your local environment: ```bash $ rustc +stage1 -vV -rustc 1.25.0-dev +rustc 1.48.0-dev binary: rustc commit-hash: unknown commit-date: unknown host: x86_64-unknown-linux-gnu -release: 1.25.0-dev -LLVM version: 4.0 +release: 1.48.0-dev +LLVM version: 11.0 ``` ## Other `x.py` commands @@ -251,18 +222,16 @@ Here are a few other useful `x.py` commands. We'll cover some of them in detail in other sections: - Building things: - - `./x.py clean` – clean up the build directory (`rm -rf build` works too, - but then you have to rebuild LLVM) - - `./x.py build --stage 1` – builds everything using the stage 1 compiler, - not just up to `libstd` - - `./x.py build` – builds the stage2 compiler + - `./x.py build` – builds everything using the stage 1 compiler, + not just up to `std` + - `./x.py build --stage 2` – builds the stage2 compiler - Running tests (see the [section on running tests](../tests/running.html) for more details): - - `./x.py test --stage 1 src/libstd` – runs the `#[test]` tests from `libstd` - - `./x.py test --stage 1 src/test/ui` – runs the `ui` test suite - - `./x.py test --stage 1 src/test/ui/const-generics` - runs all the tests in + - `./x.py test library/std` – runs the `#[test]` tests from `std` + - `./x.py test src/test/ui` – runs the `ui` test suite + - `./x.py test src/test/ui/const-generics` - runs all the tests in the `const-generics/` subdirectory of the `ui` test suite - - `./x.py test --stage 1 src/test/ui/const-generics/const-types.rs` - runs + - `./x.py test src/test/ui/const-generics/const-types.rs` - runs the single test `const-types.rs` from the `ui` test suite ### Cleaning out build directories @@ -275,3 +244,6 @@ everything up then you only need to run one command! ```bash ./x.py clean ``` + +`rm -rf build` works too, but then you have to rebuild LLVM, which can take +a long time even on fast computers. diff --git a/src/doc/rustc-dev-guide/src/building/new-target.md b/src/doc/rustc-dev-guide/src/building/new-target.md new file mode 100644 index 0000000000..7701fdbac0 --- /dev/null +++ b/src/doc/rustc-dev-guide/src/building/new-target.md @@ -0,0 +1,132 @@ +# Adding a new target + +These are a set of steps to add support for a new target. There are +numerous end states and paths to get there, so not all sections may be +relevant to your desired goal. + +## Specifying a new LLVM + +For very new targets, you may need to use a different fork of LLVM +than what is currently shipped with Rust. In that case, navigate to +the `src/llvm-project` git submodule (you might need to run `x.py +check` at least once so the submodule is updated), check out the +appropriate commit for your fork, then commit that new submodule +reference in the main Rust repository. + +An example would be: + +``` +cd src/llvm-project +git remote add my-target-llvm some-llvm-repository +git checkout my-target-llvm/my-branch +cd .. +git add llvm_target +git commit -m 'Use my custom LLVM' +``` + +### Using pre-built LLVM + +If you have a local LLVM checkout that is already built, you may be +able to configure Rust to treat your build as the [system LLVM][sysllvm] +to avoid redundant builds. + +You can tell Rust to use a pre-built version of LLVM using the `target` section +of `config.toml`: + +```toml +[target.x86_64-unknown-linux-gnu] +llvm-config = "/path/to/llvm/llvm-7.0.1/bin/llvm-config" +``` + +If you are attempting to use a system LLVM, we have observed the following paths +before, though they 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`. + +## Creating a target specification + +You should start with a target JSON file. You can see the specification +for an existing target using `--print target-spec-json`: + +``` +rustc -Z unstable-options --target=wasm32-unknown-unknown --print target-spec-json +``` + +Save that JSON to a file and modify it as appropriate for your target. + +### Adding a target specification + +Once you have filled out a JSON specification and been able to compile +somewhat successfully, you can copy the specification into the +compiler itself. + +You will need to add a line to the big table inside of the +`supported_targets` macro in the `rustc_target::spec` module. You +will then add a corresponding file for your new target containing a +`target` function. + +Look for existing targets to use as examples + +## Patching crates + +You may need to make changes to crates that the compiler depends on, +such as [`libc`][] or [`cc`][]. If so, you can use Cargo's +[`[patch]`][patch] ability. For example, if you want to use an +unreleased version of `libc`, you can add it to the top-level +`Cargo.toml` file: + +```diff +diff --git a/Cargo.toml b/Cargo.toml +index be15e50e2bc..4fb1248ba99 100644 +--- a/Cargo.toml ++++ b/Cargo.toml +@@ -66,10 +66,11 @@ cargo = { path = "src/tools/cargo" } + [patch.crates-io] + # Similar to Cargo above we want the RLS to use a vendored version of `rustfmt` + # that we're shipping as well (to ensure that the rustfmt in RLS and the + # `rustfmt` executable are the same exact version). + rustfmt-nightly = { path = "src/tools/rustfmt" } ++libc = { git = "https://github.com/rust-lang/libc", rev = "0bf7ce340699dcbacabdf5f16a242d2219a49ee0" } + + # See comments in `src/tools/rustc-workspace-hack/README.md` for what's going on + # here + rustc-workspace-hack = { path = 'src/tools/rustc-workspace-hack' } +``` + +After this, run `cargo update -p libc` to update the lockfiles. + +[`libc`]: https://crates.io/crates/libc +[`cc`]: https://crates.io/crates/cc +[patch]: https://doc.rust-lang.org/stable/cargo/reference/overriding-dependencies.html#the-patch-section + +## Cross-compiling + +Once you have a target specification in JSON and in the code, you can +cross-compile `rustc`: + +``` +DESTDIR=/path/to/install/in \ +./x.py install -i --stage 1 --host aarch64-apple-darwin.json --target aarch64-apple-darwin \ +compiler/rustc library/std +``` + +If your target specification is already available in the bootstrap +compiler, you can use it instead of the JSON file for both arguments. + +## Promoting a target from tier 2 (target) to tier 2 (host) + +There are two levels of tier 2 targets: +a) Targets that are only cross-compiled (`rustup target add`) +b) Targets that have a native toolchain (`rustup toolchain install`) + +For an example of promoting a target from cross-compiled to native, +see [#75914](https://github.com/rust-lang/rust/pull/75914). diff --git a/src/doc/rustc-dev-guide/src/building/prerequisites.md b/src/doc/rustc-dev-guide/src/building/prerequisites.md new file mode 100644 index 0000000000..f7f47d40c5 --- /dev/null +++ b/src/doc/rustc-dev-guide/src/building/prerequisites.md @@ -0,0 +1,62 @@ +# Prerequisites + +## Dependencies + +Before building the compiler, you need the following things installed: + +* `python` 3 or 2.7 (under the name `python`; `python2` or `python3` will not work) +* `curl` +* `git` +* `ssl` which comes in `libssl-dev` or `openssl-devel` +* `pkg-config` if you are compiling on Linux and targeting Linux + +If building LLVM from source (the default), you'll need additional tools: + +* `g++` 5.1 or later, `clang++` 3.5 or later, or MSVC 2017 or later. +* `ninja`, or GNU `make` 3.81 or later (ninja is recommended, especially on Windows) +* `cmake` 3.13.4 or later + +Otherwise, you'll need LLVM installed and `llvm-config` in your path. +See [this section for more info][sysllvm]. + +[sysllvm]: ./suggested.md#skipping-llvm-build + +### Windows + +* Install [winget](https://github.com/microsoft/winget-cli) + +`winget` is a Windows package manager. It will make package installation easy +on Windows. + +Run the following in a terminal: + +```powershell +winget install python +winget install cmake +``` + +If any of those is installed already, winget will detect it. +Then edit your systems `PATH` variable and add: `C:\Program Files\CMake\bin`. + +For more information about building on Windows, +see [the `rust-lang/rust` README](https://github.com/rust-lang/rust#building-on-windows). + +## Hardware + +These are not so much requirements as _recommendations_: + +* ~15GB of free disk space (~25GB or more if doing incremental builds). +* \>= 8GB RAM +* \>= 4 cores +* Internet access + +Beefier machines will lead to much faster builds. If your machine is not very +powerful, a common strategy is to only use `./x.py check` on your local machine +and let the CI build test your changes when you push to a PR branch. + +## `rustc` and toolchain installation + +Follow the installation given in the [Rust book][install] to install a working +`rustc` and the necessary C/++ toolchain on your platform. + +[install]: https://doc.rust-lang.org/book/ch01-01-installation.html diff --git a/src/doc/rustc-dev-guide/src/building/suggested.md b/src/doc/rustc-dev-guide/src/building/suggested.md index e9b48a7efd..6e0f830c65 100644 --- a/src/doc/rustc-dev-guide/src/building/suggested.md +++ b/src/doc/rustc-dev-guide/src/building/suggested.md @@ -1,14 +1,74 @@ # Suggested Workflows -The full bootstrapping process takes quite a while. Here are three suggestions +The full bootstrapping process takes quite a while. Here are some suggestions to make your life easier. +## Installing a pre-commit hook + +CI will automatically fail your build if it doesn't pass `tidy`, our +internal tool for ensuring code quality. If you'd like, you can install a +[Git hook](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) +that will automatically run `x.py test tidy --bless` on each commit, to ensure +your code is up to par. If you decide later that this behavior is +undesirable, you can delete the `pre-commit` file in `.git/hooks`. + +A prebuilt git hook lives at [`src/etc/pre-commit.sh`](https://github.com/rust-lang/rust/blob/master/src/etc/pre-commit.sh) which can be copied into your `.git/hooks` folder as `pre-commit` (without the `.sh` extension!). + +You can also install the hook as a step of running `x.py setup`! + +## Configuring `rust-analyzer` for `rustc` + +`rust-analyzer` can help you check and format your code whenever you save +a file. By default, `rust-analyzer` runs the `cargo check` and `rustfmt` +commands, but you can override these commands to use more adapted versions +of these tools when hacking on `rustc`. For example, for Visual Studio Code, +you can write: + +```JSON +{ + "rust-analyzer.checkOnSave.overrideCommand": [ + "./x.py", + "check", + "--json-output" + ], + "rust-analyzer.rustfmt.overrideCommand": [ + "./build/TARGET_TRIPLE/stage0/bin/rustfmt" + ], + "editor.formatOnSave": true +} +``` + +in your `.vscode/settings.json` file. This will ask `rust-analyzer` to use +`x.py check` to check the sources, and the stage 0 rustfmt to format them. + +If running `x.py check` on save is inconvenient, in VS Code you can use a [Build +Task] instead: + +```JSON +// .vscode/tasks.json +{ + "version": "2.0.0", + "tasks": [ + { + "label": "./x.py check", + "command": "./x.py check", + "type": "shell", + "problemMatcher": "$rustc", + "presentation": { "clear": true }, + "group": { "kind": "build", "isDefault": true } + } + ] +} +``` + +[Build Task]: https://code.visualstudio.com/docs/editor/tasks + ## Check, check, and check again -The first workflow, which is useful -when doing simple refactorings, is to run `./x.py check` -continuously. Here you are just checking that the compiler can -**build**, but often that is all you need (e.g., when renaming a +When doing simple refactorings, it can be useful to run `./x.py check` +continuously. If you set up `rust-analyzer` as described above, this will +be done for you every time you save a file. Here you are just checking that +the compiler can **build**, but often that is all you need (e.g., when renaming a method). You can then run `./x.py build` when you actually need to run tests. @@ -20,32 +80,61 @@ the problem. A nice side-effect of this style is that you are left with a fairly fine-grained set of commits at the end, all of which build and pass tests. This often helps reviewing. +## Configuring `rustup` to use nightly + +Some parts of the bootstrap process uses pinned, nightly versions of tools like +rustfmt. To make things like `cargo fmt` work correctly in your repo, run + +```console +cd +rustup override set nightly +``` + +after [installing a nightly toolchain] with `rustup`. Don't forget to do this for all +directories you have [setup a worktree for]. You may need to use the pinned +nightly version from `src/stage0.txt`, but often the normal `nightly` channel +will work. + +**Note** see [the section on vscode] for how to configure it with this real rustfmt `x.py` uses, +and [the section on rustup] for how to setup `rustup` toolchain for your bootstrapped compiler + +**Note** This does _not_ allow you to build `rustc` with cargo directly. You +still have to use `x.py` to work on the compiler or standard library, this just +lets you use `cargo fmt`. + +[installing a nightly toolchain]: https://rust-lang.github.io/rustup/concepts/channels.html?highlight=nightl#working-with-nightly-rust +[setup a worktree for]: ./suggested.md#working-on-multiple-branches-at-the-same-time +[the section on vscode]: suggested.md#configuring-rust-analyzer-for-rustc +[the section on rustup]: how-to-build-and-run.md?highlight=rustup#creating-a-rustup-toolchain + ## Incremental builds with `--keep-stage`. Sometimes just checking whether the compiler builds is not enough. A common example is that you need to add a `debug!` statement to inspect the value of some state or better understand the problem. In that case, you really need -a full build. By leveraging incremental, though, you can often get +a full build. By leveraging incremental, though, you can often get these builds to complete very fast (e.g., around 30 seconds). The only catch is this requires a bit of fudging and may produce compilers that don't work (but that is easily detected and fixed). The sequence of commands you want is as follows: -- Initial build: `./x.py build -i --stage 1 src/libstd` - - As [documented above](#command), this will build a functional +- Initial build: `./x.py build -i library/std` + - As [documented previously], this will build a functional stage1 compiler as part of running all stage0 commands (which include - building a `libstd` compatible with the stage1 compiler) as well as the + building a `std` compatible with the stage1 compiler) as well as the first few steps of the "stage 1 actions" up to "stage1 (sysroot stage1) - builds libstd". -- Subsequent builds: `./x.py build -i --stage 1 src/libstd --keep-stage 1` + builds std". +- Subsequent builds: `./x.py build -i library/std --keep-stage 1` - Note that we added the `--keep-stage 1` flag here -As mentioned, the effect of `--keep-stage 1` is that we just *assume* that the +[documented previously]: ./how-to-build-and-run.md#building-the-compiler + +As mentioned, the effect of `--keep-stage 1` is that we just _assume_ that the old standard library can be re-used. If you are editing the compiler, this is almost always true: you haven't changed the standard library, after -all. But sometimes, it's not true: for example, if you are editing +all. But sometimes, it's not true: for example, if you are editing the "metadata" part of the compiler, which controls how the compiler encodes types and other states into the `rlib` files, or if you are editing things that wind up in the metadata (such as the definition of @@ -55,34 +144,60 @@ the MIR). using `--keep-stage 1`** -- for example, strange [ICEs](../appendix/glossary.html#ice) or other panics. In that case, you should simply remove the `--keep-stage 1` from the command and -rebuild. That ought to fix the problem. +rebuild. That ought to fix the problem. You can also use `--keep-stage 1` when running tests. Something like this: -- Initial test run: `./x.py test -i --stage 1 src/test/ui` -- Subsequent test run: `./x.py test -i --stage 1 src/test/ui --keep-stage 1` - -## Building with system LLVM +- Initial test run: `./x.py test -i src/test/ui` +- Subsequent test run: `./x.py test -i src/test/ui --keep-stage 1` -By default, LLVM is built from source, and that can take significant amount of -time. An alternative is to use LLVM already installed on your computer. +## Fine-tuning optimizations -This is specified in the `target` section of `config.toml`: +Setting `optimize = false` makes the compiler too slow for tests. However, to +improve the test cycle, you can disable optimizations selectively only for the +crates you'll have to rebuild +([source](https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler/topic/incremental.20compilation.20question/near/202712165)). +For example, when working on `rustc_mir_build`, the `rustc_mir_build` and +`rustc_driver` crates take the most time to incrementally rebuild. You could +therefore set the following in the root `Cargo.toml`: ```toml -[target.x86_64-unknown-linux-gnu] -llvm-config = "/path/to/llvm/llvm-7.0.1/bin/llvm-config" +[profile.release.package.rustc_mir_build] +opt-level = 0 +[profile.release.package.rustc_driver] +opt-level = 0 ``` -We have observed the following paths before, which may be different from your system: +## Working on multiple branches at the same time + +Working on multiple branches in parallel can be a little annoying, since +building the compiler on one branch will cause the old build and the +incremental compilation cache to be overwritten. One solution would be +to have multiple clones of the repository, but that would mean storing the +Git metadata multiple times, and having to update each clone individually. + +Fortunately, Git has a better solution called [worktrees]. This lets you +create multiple "working trees", which all share the same Git database. +Moreover, because all of the worktrees share the same object database, +if you update a branch (e.g. master) in any of them, you can use the new +commits from any of the worktrees. One caveat, though, is that submodules +do not get shared. They will still be cloned multiple times. + +[worktrees]: https://git-scm.com/docs/git-worktree -- `/usr/bin/llvm-config-8` -- `/usr/lib/llvm-8/bin/llvm-config` +Given you are inside the root directory for your rust repository, you can +create a "linked working tree" in a new "rust2" directory by running +the following command: + +```bash +git worktree add ../rust2 +``` + +Creating a new worktree for a new branch based on `master` looks like: + +```bash +git worktree add -b my-feature ../rust2 master +``` -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`. +You can then use that rust2 folder as a separate workspace for modifying +and building `rustc`! diff --git a/src/doc/rustc-dev-guide/src/cli.md b/src/doc/rustc-dev-guide/src/cli.md new file mode 100644 index 0000000000..408ae20700 --- /dev/null +++ b/src/doc/rustc-dev-guide/src/cli.md @@ -0,0 +1,33 @@ +# Command-line Arguments + +Command-line flags are documented in the [rustc book][cli-docs]. All *stable* +flags should be documented there. Unstable flags should be documented in the +[unstable book]. + +See the [forge guide for new options] for details on the *procedure* for +adding a new command-line argument. + +## Guidelines + +- Flags should be orthogonal to each other. For example, if we'd have a + json-emitting variant of multiple actions `foo` and `bar`, an additional + `--json` flag is better than adding `--foo-json` and `--bar-json`. +- Avoid flags with the `no-` prefix. Instead, use the [`parse_bool`] function, + such as `-C embed-bitcode=no`. +- Consider the behavior if the flag is passed multiple times. In some + situations, the values should be accumulated (in order!). In other + situations, subsequent flags should override previous flags (for example, + the lint-level flags). And some flags (like `-o`) should generate an error + if it is too ambiguous what multiple flags would mean. +- Always give options a long descriptive name, if only for more understandable + compiler scripts. +- The `--verbose` flag is for adding verbose information to `rustc` + output. For example, using it with the `--version` + flag gives information about the hashes of the compiler code. +- Experimental flags and options must be guarded behind the `-Z + unstable-options` flag. + +[cli-docs]: https://doc.rust-lang.org/rustc/command-line-arguments.html +[forge guide for new options]: https://forge.rust-lang.org/compiler/new_option.html +[unstable book]: https://doc.rust-lang.org/nightly/unstable-book/ +[`parse_bool`]: https://github.com/rust-lang/rust/blob/e5335592e78354e33d798d20c04bcd677c1df62d/src/librustc_session/options.rs#L307-L313 diff --git a/src/doc/rustc-dev-guide/src/closure.md b/src/doc/rustc-dev-guide/src/closure.md index d4f9fc3852..93683383ff 100644 --- a/src/doc/rustc-dev-guide/src/closure.md +++ b/src/doc/rustc-dev-guide/src/closure.md @@ -5,7 +5,7 @@ effectively "desugared" into structs that contain the values they use (or references to the values they use) from their creator's stack frame. rustc has the job of figuring out which values a closure uses and how, so it can decide whether to capture a given variable by shared reference, mutable reference, or -by move. rustc also has to figure out which the closure traits ([`Fn`][fn], +by move. rustc also has to figure out which of the closure traits ([`Fn`][fn], [`FnMut`][fn_mut], or [`FnOnce`][fn_once]) a closure is capable of implementing. @@ -32,10 +32,10 @@ fn main() { ``` Let's say the above is the content of a file called `immut.rs`. If we compile -`immut.rs` using the following command. The [`-Zdump-mir=all`][dump-mir] flag will cause +`immut.rs` using the following command. The [`-Z dump-mir=all`][dump-mir] flag will cause `rustc` to generate and dump the [MIR][mir] to a directory called `mir_dump`. ```console -> rustc +stage1 immut.rs -Zdump-mir=all +> rustc +stage1 immut.rs -Z dump-mir=all ``` [mir]: ./mir/index.md @@ -115,11 +115,12 @@ Let's start with defining a term that we will be using quite a bit in the rest o *upvar*. An **upvar** is a variable that is local to the function where the closure is defined. So, in the above examples, **x** will be an upvar to the closure. They are also sometimes referred to as the *free variables* meaning they are not bound to the context of the closure. -[`src/librustc_middle/ty/query/mod.rs`][upvars] defines a query called *upvars* for this purpose. +[`compiler/rustc_middle/src/ty/query/mod.rs`][upvars] defines a query called *upv.rs_mentioned* +for this purpose. -[upvars]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/query/queries/struct.upvars.html +[upvars]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_query_impl/queries/struct.upvars_mentioned.html -Other than lazy invocation, one other thing that the distinguishes a closure from a +Other than lazy invocation, one other thing that distinguishes a closure from a normal function is that it can use the upvars. It borrows these upvars from its surrounding context; therefore the compiler has to determine the upvar's borrow type. The compiler starts with assigning an immutable borrow type and lowers the restriction (that is, changes it from @@ -134,8 +135,8 @@ appropriate trait: `Fn` trait for immutable borrow, `FnMut` for mutable borrow, and `FnOnce` for move semantics. Most of the code related to the closure is in the -[`src/librustc_typeck/check/upvar.rs`][upvar] file and the data structures are -declared in the file [`src/librustc_middle/ty/mod.rs`][ty]. +[`compiler/rustc_typeck/src/check/upvar.rs`][upvar] file and the data structures are +declared in the file [`compiler/rustc_middle/src/ty/mod.rs`][ty]. [upvar]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_typeck/check/upvar/index.html [ty]:https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/index.html @@ -145,7 +146,7 @@ codebase. For closures specifically, set the `RUST_LOG` env variable as below an output in a file: ```console -> RUST_LOG=rustc_typeck::check::upvar rustc +stage1 -Zdump-mir=all \ +> RUST_LOG=rustc_typeck::check::upvar rustc +stage1 -Z dump-mir=all \ <.rs file to compile> 2> ``` @@ -180,20 +181,21 @@ shared borrow and another one for a mutable borrow. It will also tell us what wa The callbacks are defined by implementing the [`Delegate`] trait. The [`InferBorrowKind`][ibk] type implements `Delegate` and keeps a map that -records for each upvar which mode of borrow was required. The modes of borrow -can be `ByValue` (moved) or `ByRef` (borrowed). For `ByRef` borrows, it can be -`shared`, `shallow`, `unique` or `mut` as defined in the -[`src/librustc_middle/mir/mod.rs`][mir_mod]. +records for each upvar which mode of capture was required. The modes of capture +can be `ByValue` (moved) or `ByRef` (borrowed). For `ByRef` borrows, the possible +[`BorrowKind`]s are `ImmBorrow`, `UniqueImmBorrow`, `MutBorrow` as defined in the +[`compiler/rustc_middle/src/ty/mod.rs`][middle_ty]. -[mir_mod]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/index.html +[`BorrowKind`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/enum.BorrowKind.html +[middle_ty]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/index.html `Delegate` defines a few different methods (the different callbacks): -**consume**: for *move* of a variable, **borrow** for a *borrow* of some kind +**consume** for *move* of a variable, **borrow** for a *borrow* of some kind (shared or mutable), and **mutate** when we see an *assignment* of something. All of these callbacks have a common argument *cmt* which stands for Category, Mutability and Type and is defined in -[`src/librustc_middle/middle/mem_categorization.rs`][cmt]. Borrowing from the code +[`compiler/rustc_middle/src/middle/mem_categorization.rs`][cmt]. Borrowing from the code comments, "`cmt` is a complete categorization of a value indicating where it originated and how it is located, as well as the mutability of the memory in which the value is stored". Based on the callback (consume, borrow etc.), we diff --git a/src/doc/rustc-dev-guide/src/compiler-debugging.md b/src/doc/rustc-dev-guide/src/compiler-debugging.md index 89a763c41f..34f5e760f1 100644 --- a/src/doc/rustc-dev-guide/src/compiler-debugging.md +++ b/src/doc/rustc-dev-guide/src/compiler-debugging.md @@ -1,12 +1,25 @@ # Debugging the compiler [debugging]: #debugging + + This chapter contains a few tips to debug the compiler. These tips aim to be useful no matter what you are working on. Some of the other chapters have advice about specific parts of the compiler (e.g. the [Queries Debugging and Testing chapter](./incrcomp-debugging.html) or the [LLVM Debugging chapter](./backend/debugging.md)). +## Configuring the compiler + +By default, rustc is built without most debug information. To enable debug info, +set `debug = true` in your config.toml. + +Setting `debug = true` turns on many different debug options (e.g., `debug-assertions`, +`debug-logging`, etc.) which can be individually tweaked if you want to, but many people +simply set `debug = true`. Check out the comments in config.toml.example for more info. + +You will need to rebuild the compiler once you've changed any configuration options. + ## `-Z` flags The compiler has a bunch of `-Z` flags. These are unstable flags that are only @@ -21,12 +34,12 @@ could be useful for debugging. When you have an ICE (panic in the compiler), you can set `RUST_BACKTRACE=1` to get the stack trace of the `panic!` like in -normal Rust programs. IIRC backtraces **don't work** on MinGW, +normal Rust programs. IIRC backtraces **don't work** on MinGW, sorry. If you have trouble or the backtraces are full of `unknown`, you might want to find some way to use Linux, Mac, or MSVC on Windows. -In the default configuration, you don't have line numbers enabled, so the -backtrace looks like this: +In the default configuration (without `debug` set to `true`), you don't have line numbers +enabled, so the backtrace looks like this: ```text stack backtrace: @@ -45,35 +58,33 @@ stack backtrace: 37: rustc_driver::run_compiler ``` -If you want line numbers for the stack trace, you can enable `debug = true` in -your config.toml and rebuild the compiler (`debuginfo-level = 1` will also add -line numbers, but `debug = true` gives full debuginfo). Then the backtrace will -look like this: +If you set `debug = true`, you will get line numbers for the stack trace. +Then the backtrace will look like this: ```text stack backtrace: (~~~~ LINES REMOVED BY ME FOR BREVITY ~~~~) - at /home/user/rust/src/librustc_typeck/check/cast.rs:110 + at /home/user/rust/compiler/rustc_typeck/src/check/cast.rs:110 7: rustc_typeck::check::cast::CastCheck::check - at /home/user/rust/src/librustc_typeck/check/cast.rs:572 - at /home/user/rust/src/librustc_typeck/check/cast.rs:460 - at /home/user/rust/src/librustc_typeck/check/cast.rs:370 + at /home/user/rust/compiler/rustc_typeck/src/check/cast.rs:572 + at /home/user/rust/compiler/rustc_typeck/src/check/cast.rs:460 + at /home/user/rust/compiler/rustc_typeck/src/check/cast.rs:370 (~~~~ LINES REMOVED BY ME FOR BREVITY ~~~~) 33: rustc_driver::driver::compile_input - at /home/user/rust/src/librustc_driver/driver.rs:1010 - at /home/user/rust/src/librustc_driver/driver.rs:212 + at /home/user/rust/compiler/rustc_driver/src/driver.rs:1010 + at /home/user/rust/compiler/rustc_driver/src/driver.rs:212 34: rustc_driver::run_compiler - at /home/user/rust/src/librustc_driver/lib.rs:253 + at /home/user/rust/compiler/rustc_driver/src/lib.rs:253 ``` ## Getting a backtrace for errors [getting-a-backtrace-for-errors]: #getting-a-backtrace-for-errors -If you want to get a backtrace to the point where the compiler emits -an error message, you can pass the `-Z treat-err-as-bug=n`, which -will make the compiler skip `n` errors or `delay_span_bug` calls and then -panic on the next one. If you leave off `=n`, the compiler will assume `0` for -`n` and thus panic on the first error it encounters. +If you want to get a backtrace to the point where the compiler emits an +error message, you can pass the `-Z treat-err-as-bug=n`, which will make +the compiler panic on the `nth` error on `delay_span_bug`. If you leave +off `=n`, the compiler will assume `1` for `n` and thus panic on the +first error it encounters. This can also help when debugging `delay_span_bug` calls - it will make the first `delay_span_bug` call panic, which will give you a useful backtrace. @@ -82,28 +93,31 @@ For example: ```bash $ cat error.rs +``` + +```rust fn main() { 1 + (); } ``` ```bash -$ ./build/x86_64-unknown-linux-gnu/stage1/bin/rustc error.rs -error[E0277]: the trait bound `{integer}: std::ops::Add<()>` is not satisfied +$ rustc +stage1 error.rs +error[E0277]: cannot add `()` to `{integer}` --> error.rs:2:7 | -2 | 1 + (); - | ^ no implementation for `{integer} + ()` +2 | 1 + (); + | ^ no implementation for `{integer} + ()` | - = help: the trait `std::ops::Add<()>` is not implemented for `{integer}` + = help: the trait `Add<()>` is not implemented for `{integer}` error: aborting due to previous error +``` + +Now, where does the error above come from? -$ # Now, where does the error above come from? -$ RUST_BACKTRACE=1 \ - ./build/x86_64-unknown-linux-gnu/stage1/bin/rustc \ - error.rs \ - -Z treat-err-as-bug +```bash +$ RUST_BACKTRACE=1 rustc +stage1 error.rs -Z treat-err-as-bug error[E0277]: the trait bound `{integer}: std::ops::Add<()>` is not satisfied --> error.rs:2:7 | @@ -123,92 +137,140 @@ note: rustc 1.24.0-dev running on x86_64-unknown-linux-gnu note: run with `RUST_BACKTRACE=1` for a backtrace thread 'rustc' panicked at 'encountered error with `-Z treat_err_as_bug', -/home/user/rust/src/librustc_errors/lib.rs:411:12 +/home/user/rust/compiler/rustc_errors/src/lib.rs:411:12 note: Some details are omitted, run with `RUST_BACKTRACE=full` for a verbose backtrace. stack backtrace: (~~~ IRRELEVANT PART OF BACKTRACE REMOVED BY ME ~~~) 7: rustc::traits::error_reporting::> ::report_selection_error - at /home/user/rust/src/librustc_middle/traits/error_reporting.rs:823 + at /home/user/rust/compiler/rustc_middle/src/traits/error_reporting.rs:823 8: rustc::traits::error_reporting::> ::report_fulfillment_errors - at /home/user/rust/src/librustc_middle/traits/error_reporting.rs:160 - at /home/user/rust/src/librustc_middle/traits/error_reporting.rs:112 + at /home/user/rust/compiler/rustc_middle/src/traits/error_reporting.rs:160 + at /home/user/rust/compiler/rustc_middle/src/traits/error_reporting.rs:112 9: rustc_typeck::check::FnCtxt::select_obligations_where_possible - at /home/user/rust/src/librustc_typeck/check/mod.rs:2192 + at /home/user/rust/compiler/rustc_typeck/src/check/mod.rs:2192 (~~~ IRRELEVANT PART OF BACKTRACE REMOVED BY ME ~~~) 36: rustc_driver::run_compiler - at /home/user/rust/src/librustc_driver/lib.rs:253 -$ # Cool, now I have a backtrace for the error + at /home/user/rust/compiler/rustc_driver/src/lib.rs:253 ``` +Cool, now I have a backtrace for the error! + ## Getting logging output [getting-logging-output]: #getting-logging-output -These crates are used in compiler for logging: - -* [log] -* [env-logger]: check the link to see the full `RUSTC_LOG` syntax +The compiler uses the [`tracing`] crate for logging. -[log]: https://docs.rs/log/0.4.6/log/index.html -[env-logger]: https://docs.rs/env_logger/0.4.3/env_logger/ +[`tracing`]: https://docs.rs/tracing -The compiler has a lot of `debug!` calls, which print out logging information +The compiler has a lot of [`debug!`] calls, which print out logging information at many points. These are very useful to at least narrow down the location of a bug if not to find it entirely, or just to orient yourself as to why the compiler is doing a particular thing. -To see the logs, you need to set the `RUSTC_LOG` environment variable to -your log filter, e.g. to get the logs for a specific module, you can run the -compiler as `RUSTC_LOG=module::path rustc my-file.rs`. All `debug!` output will -then appear in standard error. +[`debug!`]: https://docs.rs/tracing/0.1/tracing/macro.debug.html + +To see the logs, you need to set the `RUSTC_LOG` environment variable to your +log filter. Your log filter can be just `debug` to get all `debug!` output and +higher (e.g., it will also include `info!`), or `path::to::module` to get *all* +output (which will include `trace!`) from a particular module, or +`path::to::module=debug` to get `debug!` output and higher from a particular +module. + +For example, to get the `debug!` output and higher for a specific module, you +can run the compiler with `RUSTC_LOG=path::to::module=debug rustc my-file.rs`. +All `debug!` output will then appear in standard error. + +Note that you can use a partial path and the filter will still work. For +example, if you want to see `info!` output from only +`rustdoc::passes::collect_intra_doc_links`, you could use +`RUSTDOC_LOG=rustdoc::passes::collect_intra_doc_links=info` *or* you could use +`RUSTDOC_LOG=rustdoc::passes::collect_intra=info`. + +If you are developing rustdoc, use `RUSTDOC_LOG` instead. If you are developing +Miri, use `MIRI_LOG` instead. You get the idea :) + +See the [`tracing`] crate's docs, and specifically the docs for [`debug!`] to +see the full syntax you can use. (Note: unlike the compiler, the [`tracing`] +crate and its examples use the `RUST_LOG` environment variable. rustc, rustdoc, +and other tools set custom environment variables.) **Note that unless you use a very strict filter, the logger will emit a lot of output, so use the most specific module(s) you can (comma-separated if multiple)**. It's typically a good idea to pipe standard error to a file and look at the log output with a text editor. -So to put it together. +So, to put it together: ```bash -# This puts the output of all debug calls in `librustc_middle/traits` into +# This puts the output of all debug calls in `rustc_middle/src/traits` into # standard error, which might fill your console backscroll. -$ RUSTC_LOG=rustc::traits rustc +local my-file.rs +$ RUSTC_LOG=rustc_middle::traits=debug rustc +stage1 my-file.rs -# This puts the output of all debug calls in `librustc_middle/traits` in +# This puts the output of all debug calls in `rustc_middle/src/traits` in # `traits-log`, so you can then see it with a text editor. -$ RUSTC_LOG=rustc::traits rustc +local my-file.rs 2>traits-log +$ RUSTC_LOG=rustc_middle::traits=debug rustc +stage1 my-file.rs 2>traits-log -# Not recommended. This will show the output of all `debug!` calls +# Not recommended! This will show the output of all `debug!` calls # in the Rust compiler, and there are a *lot* of them, so it will be # hard to find anything. -$ RUSTC_LOG=debug rustc +local my-file.rs 2>all-log +$ RUSTC_LOG=debug rustc +stage1 my-file.rs 2>all-log -# This will show the output of all `info!` calls in `rustc_trans`. +# This will show the output of all `info!` calls in `rustc_codegen_ssa`. # -# There's an `info!` statement in `trans_instance` that outputs -# every function that is translated. This is useful to find out +# There's an `info!` statement in `codegen_instance` that outputs +# every function that is codegen'd. This is useful to find out # which function triggers an LLVM assertion, and this is an `info!` # log rather than a `debug!` log so it will work on the official # compilers. -$ RUSTC_LOG=rustc_trans=info rustc +local my-file.rs +$ RUSTC_LOG=rustc_codegen_ssa=info rustc +stage1 my-file.rs + +# This will show the output of all `info!` calls made by rustdoc +# or any rustc library it calls. +$ RUSTDOC_LOG=info rustdoc +stage1 my-file.rs + +# This will only show `debug!` calls made by rustdoc directly, +# not any `rustc*` crate. +$ RUSTDOC_LOG=rustdoc=debug rustdoc +stage1 my-file.rs ``` +### Log colors + +By default, rustc (and other tools, like rustdoc and Miri) will be smart about +when to use ANSI colors in the log output. If they are outputting to a terminal, +they will use colors, and if they are outputting to a file or being piped +somewhere else, they will not. However, it's hard to read log output in your +terminal unless you have a very strict filter, so you may want to pipe the +output to a pager like `less`. But then there won't be any colors, which makes +it hard to pick out what you're looking for! + +You can override whether to have colors in log output with the `RUSTC_LOG_COLOR` +environment variable (or `RUSTDOC_LOG_COLOR` for rustdoc, or `MIRI_LOG_COLOR` +for Miri, etc.). There are three options: `auto` (the default), `always`, and +`never`. So, if you want to enable colors when piping to `less`, use something +similar to this command: + +```bash +# The `-R` switch tells less to print ANSI colors without escaping them. +$ RUSTC_LOG=debug RUSTC_LOG_COLOR=always rustc +stage1 ... | less -R +``` + +Note that `MIRI_LOG_COLOR` will only color logs that come from Miri, not logs +from rustc functions that Miri calls. Use `RUSTC_LOG_COLOR` to color logs from +rustc. + ### How to keep or remove `debug!` and `trace!` calls from the resulting binary While calls to `error!`, `warn!` and `info!` are included in every build of the compiler, calls to `debug!` and `trace!` are only included in the program if -`debug-assertions=yes` is turned on in config.toml (it is +`debug-logging=true` is turned on in config.toml (it is turned off by default), so if you don't see `DEBUG` logs, especially if you run the compiler with `RUSTC_LOG=rustc rustc some.rs` and only see -`INFO` logs, make sure that `debug-assertions=yes` is turned on in your +`INFO` logs, make sure that `debug-logging=true` is turned on in your config.toml. -I also think that in some cases just setting it will not trigger a rebuild, -so if you changed it and you already have a compiler built, you might -want to call `x.py clean` to force one. - ### Logging etiquette and conventions Because calls to `debug!` are removed by default, in most cases, don't worry @@ -252,6 +314,24 @@ $ dot -T pdf maybe_init_suffix.dot > maybe_init_suffix.pdf $ firefox maybe_init_suffix.pdf # Or your favorite pdf viewer ``` +## Viewing Spanview output (.html files) +[viewing-spanview-output]: #viewing-spanview-output + +In addition to [graphviz output](#formatting-graphviz-output-dot-files), MIR debugging +flags include an option to generate a MIR representation called `Spanview` that +uses HTML to highlight code regions in the original source code and display +compiler metadata associated with each region. +[`-Z dump-mir-spanview`](./mir/debugging.md), for example, highlights spans +associated with each MIR `Statement`, `Terminator`, and/or `BasicBlock`. + +These `.html` files use CSS features to dynamically expand spans obscured by +overlapping spans, and native tooltips (based on the HTML `title` attribute) to +reveal the actual MIR elements, as text. + +To view these files, simply use a modern browser, or a CSS-capable HTML preview +feature in a modern IDE. (The default HTML preview pane in *VS Code* is known to +work, for instance.) + ## Narrowing (Bisecting) Regressions The [cargo-bisect-rustc][bisect] tool can be used as a quick and easy way to @@ -274,3 +354,62 @@ try`. This is helpful when you want to examine the resulting build of a PR without doing the build yourself. [rtim]: https://github.com/kennytm/rustup-toolchain-install-master + +## Debugging type layouts + +The (permanently) unstable `#[rustc_layout]` attribute can be used to dump +the [`Layout`] of the type it is attached to. For example: + +```rust +#![feature(rustc_attrs)] + +#[rustc_layout(debug)] +type T<'a> = &'a u32; +``` + +Will emit the following: + +```text +error: layout_of(&'a u32) = Layout { + fields: Primitive, + variants: Single { + index: 0, + }, + abi: Scalar( + Scalar { + value: Pointer, + valid_range: 1..=18446744073709551615, + }, + ), + largest_niche: Some( + Niche { + offset: Size { + raw: 0, + }, + scalar: Scalar { + value: Pointer, + valid_range: 1..=18446744073709551615, + }, + }, + ), + align: AbiAndPrefAlign { + abi: Align { + pow2: 3, + }, + pref: Align { + pow2: 3, + }, + }, + size: Size { + raw: 8, + }, +} + --> src/lib.rs:4:1 + | +4 | type T<'a> = &'a u32; + | ^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error +``` + +[`Layout`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_target/abi/struct.Layout.html diff --git a/src/doc/rustc-dev-guide/src/compiler-src.md b/src/doc/rustc-dev-guide/src/compiler-src.md index 472d1ea03b..61af386522 100644 --- a/src/doc/rustc-dev-guide/src/compiler-src.md +++ b/src/doc/rustc-dev-guide/src/compiler-src.md @@ -1,137 +1,210 @@ # High-level overview of the compiler source -## Crate structure - -The main Rust repository consists of a `src` directory, under which -there live many crates. These crates contain the sources for the -standard library and the compiler. This document, of course, focuses -on the latter. - -Rustc consists of a number of crates, including `rustc_ast`, -`rustc`, `rustc_target`, `rustc_codegen`, `rustc_driver`, and -many more. The source for each crate can be found in a directory -like `src/libXXX`, where `XXX` is the crate name. - -(N.B. The names and divisions of these crates are not set in -stone and may change over time. For the time being, we tend towards a -finer-grained division to help with compilation time, though as incremental -compilation improves, that may change.) - -The dependency structure of these crates is roughly a diamond: - -```text - rustc_driver - / | \ - / | \ - / | \ - / v \ -rustc_codegen rustc_borrowck ... rustc_metadata - \ | / - \ | / - \ | / - \ v / - rustc - | - v - rustc_ast - / \ - / \ - rustc_span rustc_builtin_macros -``` - -The `rustc_driver` crate, at the top of this lattice, is effectively -the "main" function for the rust compiler. It doesn't have much "real -code", but instead ties together all of the code defined in the other -crates and defines the overall flow of execution. (As we transition -more and more to the [query model], however, the -"flow" of compilation is becoming less centrally defined.) - -At the other extreme, the `rustc` crate defines the common and -pervasive data structures that all the rest of the compiler uses -(e.g. how to represent types, traits, and the program itself). It -also contains some amount of the compiler itself, although that is -relatively limited. - -Finally, all the crates in the bulge in the middle define the bulk of -the compiler – they all depend on `rustc`, so that they can make use -of the various types defined there, and they export public routines -that `rustc_driver` will invoke as needed (more and more, what these -crates export are "query definitions", but those are covered later -on). - -Below `rustc` lie various crates that make up the parser and error -reporting mechanism. They are also an internal part -of the compiler and not intended to be stable (though they do wind up -getting used by some crates in the wild; a practice we hope to -gradually phase out). - -## The main stages of compilation - -The Rust compiler is in a bit of transition right now. It used to be a -purely "pass-based" compiler, where we ran a number of passes over the -entire program, and each did a particular check of transformation. We -are gradually replacing this pass-based code with an alternative setup -based on on-demand **queries**. In the query-model, we work backwards, -executing a *query* that expresses our ultimate goal (e.g. "compile -this crate"). This query in turn may make other queries (e.g. "get me -a list of all modules in the crate"). Those queries make other queries -that ultimately bottom out in the base operations, like parsing the -input, running the type-checker, and so forth. This on-demand model -permits us to do exciting things like only do the minimal amount of -work needed to type-check a single function. It also helps with -incremental compilation. (For details on defining queries, check out -the [query model].) - -Regardless of the general setup, the basic operations that the -compiler must perform are the same. The only thing that changes is -whether these operations are invoked front-to-back, or on demand. In -order to compile a Rust crate, these are the general steps that we -take: - -1. **Parsing input** - - this processes the `.rs` files and produces the AST - ("abstract syntax tree") - - the AST is defined in `src/librustc_ast/ast.rs`. It is intended to match the lexical - syntax of the Rust language quite closely. -2. **Name resolution, macro expansion, and configuration** - - once parsing is complete, we process the AST recursively, resolving - paths and expanding macros. This same process also processes `#[cfg]` - nodes, and hence may strip things out of the AST as well. -3. **Lowering to HIR** - - Once name resolution completes, we convert the AST into the HIR, - or "[high-level intermediate representation]". The HIR is defined in - `src/librustc_middle/hir/`; that module also includes the [lowering] code. - - The HIR is a lightly desugared variant of the AST. It is more processed - than the AST and more suitable for the analyses that follow. - It is **not** required to match the syntax of the Rust language. - - As a simple example, in the **AST**, we preserve the parentheses - that the user wrote, so `((1 + 2) + 3)` and `1 + 2 + 3` parse - into distinct trees, even though they are equivalent. In the - HIR, however, parentheses nodes are removed, and those two - expressions are represented in the same way. -3. **Type-checking and subsequent analyses** - - An important step in processing the HIR is to perform type - checking. This process assigns types to every HIR expression, - for example, and also is responsible for resolving some - "type-dependent" paths, such as field accesses (`x.f` – we - can't know what field `f` is being accessed until we know the - type of `x`) and associated type references (`T::Item` – we - can't know what type `Item` is until we know what `T` is). - - Type checking creates "side-tables" (`TypeckTables`) that include - the types of expressions, the way to resolve methods, and so forth. - - After type-checking, we can do other analyses, such as privacy checking. -4. **Lowering to MIR and post-processing** - - Once type-checking is done, we can lower the HIR into MIR ("middle IR"), - which is a **very** desugared version of Rust, well suited to borrowck - but also to certain high-level optimizations. -5. **Translation to LLVM and LLVM optimizations** - - From MIR, we can produce LLVM IR. - - LLVM then runs its various optimizations, which produces a number of - `.o` files (one for each "codegen unit"). -6. **Linking** - - Finally, those `.o` files are linked together. - - -[query model]: query.html -[high-level intermediate representation]: hir.html -[lowering]: lowering.html + + +> **NOTE**: The structure of the repository is going through a lot of +> transitions. In particular, we want to get to a point eventually where the +> top-level directory has separate directories for the compiler, build-system, +> std libs, etc, rather than one huge `src/` directory. +> +> As of January 2021, the standard libraries have been +> moved to `library/` and the crates that make up the `rustc` compiler itself +> have been moved to `compiler/`. + +Now that we have [seen what the compiler does](./overview.md), let's take a +look at the structure of the contents of the rust-lang/rust repo. + +## Workspace structure + +The `rust-lang/rust` repository consists of a single large cargo workspace +containing the compiler, the standard libraries (`core`, `alloc`, `std`, +`proc_macro`, etc), and `rustdoc`, along with the build system and a bunch of +tools and submodules for building a full Rust distribution. + +The repository consists of three main directories: + +- `compiler/` contains the source code for `rustc`. It consists of many crates + that together make up the compiler. + +- `library/` contains the standard libraries (`core`, `alloc`, `std`, + `proc_macro`, `test`), as well as the Rust runtime (`backtrace`, `rtstartup`, + `lang_start`). + +- `src/` contains the source code for rustdoc, clippy, cargo, the build system, + language docs, etc. + +## Standard library + +The standard library crates are all in `library/`. They have intuitive names +like `std`, `core`, `alloc`, etc. There is also `proc_macro`, `test`, and +other runtime libraries. + +This code is fairly similar to most other Rust crates except that it must be +built in a special way because it can use unstable features. + +## Compiler + +> You may find it helpful to read [The Overview Chapter](./overview.md) first, +> which gives an overview of how the compiler works. The crates mentioned in +> this section implement the compiler, and are underneath `compiler/` + +The `compiler/` crates all have names starting with `rustc_*`. These are a +collection of around 50 interdependent crates ranging in size from tiny to +huge. There is also the `rustc` crate which is the actual binary (i.e. the +`main` function); it doesn't actually do anything besides calling the +`rustc_driver` crate, which drives the various parts of compilation in other +crates. + +The dependency structure of these crates is complex, but roughly it is +something like this: + +- `rustc` (the binary) calls [`rustc_driver::main`][main]. + - [`rustc_driver`] depends on a lot of other crates, but the main one is + [`rustc_interface`]. + - [`rustc_interface`] depends on most of the other compiler crates. It + is a fairly generic interface for driving the whole compilation. + - Most of the other `rustc_*` crates depend on [`rustc_middle`], + which defines a lot of central data structures in the compiler. + - [`rustc_middle`] and most of the other crates depend on a + handful of crates representing the early parts of the + compiler (e.g. the parser), fundamental data structures (e.g. + [`Span`]), or error reporting: [`rustc_data_structures`], + [`rustc_span`], [`rustc_errors`], etc. + +[main]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_driver/fn.main.html +[`rustc_driver`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_driver/index.html +[`rustc_interface`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_interface/index.html +[`rustc_middle`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/index.html +[`rustc_data_structures`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_data_structures/index.html +[`rustc_span`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/index.html +[`Span`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.Span.html +[`rustc_errors`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/index.html + +You can see the exact dependencies by reading the `Cargo.toml` for the various +crates, just like a normal Rust crate. + +One final thing: [`src/llvm-project`] is a submodule for our fork of LLVM. +During bootstrapping, LLVM is built and the [`compiler/rustc_llvm`] crate +contains rust wrappers around LLVM (which is written in C++), so that the +compiler can interface with it. + +Most of this book is about the compiler, so we won't have any further +explanation of these crates here. + +[`src/llvm-project`]: https://github.com/rust-lang/rust/tree/master/src/ +[`compiler/rustc_llvm`]: https://github.com/rust-lang/rust/tree/master/compiler/rustc_llvm + +### Big picture + +The dependency structure is influenced strongly by two main factors: + +1. Organization. The compiler is a _huge_ codebase; it would be an impossibly + large crate. In part, the dependency structure reflects the code structure + of the compiler. +2. Compile time. By breaking the compiler into multiple crates, we can take + better advantage of incremental/parallel compilation using cargo. In + particular, we try to have as few dependencies between crates as possible so + that we don't have to rebuild as many crates if you change one. + +At the very bottom of the dependency tree are a handful of crates that are used +by the whole compiler (e.g. [`rustc_span`]). The very early parts of the +compilation process (e.g. parsing and the AST) depend on only these. + +Pretty soon after the AST is constructed, the compiler's [query system][query] +gets set up. The query system is set up in a clever way using function +pointers. This allows us to break dependencies between crates, allowing more +parallel compilation. + +However, since the query system is defined in [`rustc_middle`], nearly all +subsequent parts of the compiler depend on this crate. It is a really large +crate, leading to long compile times. Some efforts have been made to move stuff +out of it with limited success. Another unfortunate side effect is that sometimes +related functionality gets scattered across different crates. For example, +linting functionality is scattered across earlier parts of the crate, +[`rustc_lint`], [`rustc_middle`], and other places. + +[`rustc_lint`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/index.html + +More generally, in an ideal world, it seems like there would be fewer, more +cohesive crates, with incremental and parallel compilation making sure compile +times stay reasonable. However, our incremental and parallel compilation haven't +gotten good enough for that yet, so breaking things into separate crates has +been our solution so far. + +At the top of the dependency tree are the [`rustc_interface`] and +[`rustc_driver`] crates. [`rustc_interface`] is an unstable wrapper around the +query system that helps to drive the various stages of compilation. Other +consumers of the compiler may use this interface in different ways (e.g. +rustdoc or maybe eventually rust-analyzer). The [`rustc_driver`] crate first +parses command line arguments and then uses [`rustc_interface`] to drive the +compilation to completion. + +[query]: ./query.md + +[orgch]: ./overview.md + +## rustdoc + +The bulk of `rustdoc` is in [`librustdoc`]. However, the `rustdoc` binary +itself is [`src/tools/rustdoc`], which does nothing except call [`rustdoc::main`]. + +There is also javascript and CSS for the rustdocs in [`src/tools/rustdoc-js`] +and [`src/tools/rustdoc-themes`]. + +You can read more about rustdoc in [this chapter][rustdocch]. + +[`librustdoc`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustdoc/index.html +[`rustdoc::main`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustdoc/fn.main.html +[`src/tools/rustdoc`]: https://github.com/rust-lang/rust/tree/master/src/tools/rustdoc +[`src/tools/rustdoc-js`]: https://github.com/rust-lang/rust/tree/master/src/tools/rustdoc-js +[`src/tools/rustdoc-themes`]: https://github.com/rust-lang/rust/tree/master/src/tools/rustdoc-themes + +[rustdocch]: ./rustdoc.md + +## Tests + +The test suite for all of the above is in [`src/test/`]. You can read more +about the test suite [in this chapter][testsch]. + +The test harness itself is in [`src/tools/compiletest`]. + +[testsch]: ./tests/intro.md + +[`src/test/`]: https://github.com/rust-lang/rust/tree/master/src/test +[`src/tools/compiletest`]: https://github.com/rust-lang/rust/tree/master/src/tools/compiletest + +## Build System + +There are a number of tools in the repository just for building the compiler, +standard library, rustdoc, etc, along with testing, building a full Rust +distribution, etc. + +One of the primary tools is [`src/bootstrap`]. You can read more about +bootstrapping [in this chapter][bootstch]. The process may also use other tools +from `src/tools/`, such as [`tidy`] or [`compiletest`]. + +[`src/bootstrap`]: https://github.com/rust-lang/rust/tree/master/src/bootstrap +[`tidy`]: https://github.com/rust-lang/rust/tree/master/src/tools/tidy +[`compiletest`]: https://github.com/rust-lang/rust/tree/master/src/tools/compiletest + +[bootstch]: ./building/bootstrapping.md + +## Other + +There are a lot of other things in the `rust-lang/rust` repo that are related +to building a full rust distribution. Most of the time you don't need to worry +about them. + +These include: +- [`src/ci`]: The CI configuration. This actually quite extensive because we + run a lot of tests on a lot of platforms. +- [`src/doc`]: Various documentation, including submodules for a few books. +- [`src/etc`]: Miscellaneous utilities. +- [`src/tools/rustc-workspace-hack`], and others: Various workarounds to make + cargo work with bootstrapping. +- And more... + +[`src/ci`]: https://github.com/rust-lang/rust/tree/master/src/ci +[`src/doc`]: https://github.com/rust-lang/rust/tree/master/src/doc +[`src/etc`]: https://github.com/rust-lang/rust/tree/master/src/etc +[`src/tools/rustc-workspace-hack`]: https://github.com/rust-lang/rust/tree/master/src/tools/rustc-workspace-hack diff --git a/src/doc/rustc-dev-guide/src/compiler-team.md b/src/doc/rustc-dev-guide/src/compiler-team.md index 3f3719f3df..ebb8cbc166 100644 --- a/src/doc/rustc-dev-guide/src/compiler-team.md +++ b/src/doc/rustc-dev-guide/src/compiler-team.md @@ -9,10 +9,13 @@ contributions to rustc and its design. ## Discussion -Currently the compiler team chats in 2 places: +Currently the compiler team chats in Zulip: -- The `t-compiler` stream on [the Zulip instance][zulip] -- The `compiler` channel on the [rust-lang discord](https://discord.gg/rust-lang) +- Team chat occurs in the `t-compiler` stream on [the Zulip instance][zulip] +- There are also a number of other associated Zulip streams, + such as [`t-compiler/help`][zulip-help], where people can ask for help + with rustc development, or [`t-compiler/meetings`][zulip-meetings], + where the team holds their weekly triage and steering meetings. ## Expert map @@ -53,6 +56,8 @@ The meeting is held over a "chat medium", currently on [zulip]. [etherpad]: https://public.etherpad-mozilla.org/p/rust-compiler-meeting [procedure]: ./bug-fix-procedure.md [zulip]: https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler +[zulip-help]: https://rust-lang.zulipchat.com/#narrow/stream/182449-t-compiler.2Fhelp +[zulip-meetings]: https://rust-lang.zulipchat.com/#narrow/stream/238009-t-compiler.2Fmeetings ## Team membership @@ -77,7 +82,7 @@ offer r+ privileges. This means that you have the right to instruct merge a PR ([here are some instructions for how to talk to bors][homu-guide]). -[homu-guide]: https://buildbot2.rust-lang.org/homu/ +[homu-guide]: https://bors.rust-lang.org/ The guidelines for reviewers are as follows: diff --git a/src/doc/rustc-dev-guide/src/compiletest.md b/src/doc/rustc-dev-guide/src/compiletest.md index dbd6c4b6e1..2e0bcec538 100644 --- a/src/doc/rustc-dev-guide/src/compiletest.md +++ b/src/doc/rustc-dev-guide/src/compiletest.md @@ -1,52 +1,51 @@ -# `compiletest` +# Using `compiletest` commands to control test execution ## Introduction -`compiletest` is the main test harness of the Rust test suite. It allows +`compiletest` is the main test harness of the Rust test suite. It allows test authors to organize large numbers of tests (the Rust compiler has many thousands), efficient test execution (parallel execution is supported), and allows the test author to configure behavior and expected results of both individual and groups of tests. -`compiletest` tests may check test code for success, for failure or in some -cases, even failure to compile. Tests are typically organized as a Rust source -file with annotations in comments before and/or within the test code, which -serve to direct `compiletest` on if or how to run the test, what behavior to -expect, and more. If you are unfamiliar with the compiler testing framework, -see [this chapter](./tests/intro.html) for additional background. +`compiletest` tests may check test code for success, for runtime failure, or for +compile-time failure. Tests are typically organized as a Rust source file with +annotations in comments before and/or within the test code, which serve to +direct `compiletest` on if or how to run the test, what behavior to expect, +and more. If you are unfamiliar with the compiler testing framework, +see [this chapter](./tests/intro.md) for additional background. The tests themselves are typically (but not always) organized into -"suites" – for example, `run-fail`, -a folder holding tests that should compile successfully, -but return a failure (non-zero status), `compile-fail`, a folder holding tests -that should fail to compile, and many more. The various suites are defined in -[src/tools/compiletest/src/common.rs][common] in the `pub enum Mode` -declaration. And a very good introduction to the different suites of compiler -tests along with details about them can be found in [Adding new -tests](./tests/adding.html). +"suites" – for example, `run-fail`, a folder holding tests that should compile +successfully, but return a failure (non-zero status) at runtime, `compile-fail`, +a folder holding tests that should fail to compile, and many more. The various +suites are defined in [`src/tools/compiletest/src/common.rs`] in the +`pub enum Mode` declaration. And a good introduction to the different +suites of compiler tests along with details about them can be found in +[Adding new tests](./tests/adding.md). ## Adding a new test file Briefly, simply create your new test in the appropriate location under -[src/test][test]. No registration of test files is necessary as `compiletest` -will scan the [src/test][test] subfolder recursively, and will execute any Rust -source files it finds as tests. See [`Adding new tests`](./tests/adding.html) -for a complete guide on how to adding new tests. +[`src/test`]. No registration of test files is necessary as `compiletest` +will scan the [`src/test`] subfolder recursively, and will execute any +Rust source files it finds as tests. +See [Adding new tests](./tests/adding.md) for a complete guide on how to add +new tests. ## Header Commands Source file annotations which appear in comments near the top of the source -file *before* any test code are known as header commands. These commands can +file *before* any test code are known as header commands. These commands can instruct `compiletest` to ignore this test, set expectations on whether it is expected to succeed at compiling, or what the test's return code is expected to -be. Header commands (and their inline counterparts, Error Info commands) are -described more fully -[here](./tests/adding.html#header-commands-configuring-rustc). +be. Header commands and inline `//~ ERROR` commands are described more fully +[here](./tests/adding.md#header-commands-configuring-rustc). ### Adding a new header command Header commands are defined in the `TestProps` struct in -[src/tools/compiletest/src/header.rs][header]. At a high level, there are +[`src/tools/compiletest/src/header.rs`]. At a high level, there are dozens of test properties defined here, all set to default values in the `TestProp` struct's `impl` block. Any test can override this default value by specifying the property in question as header command as a comment (`//`) in @@ -77,29 +76,29 @@ fn main() -> Result<(), Box> { #### Adding a new header command property One would add a new header command if there is a need to define some test -property or behavior on an individual, test-by-test basis. A header command +property or behavior on an individual, test-by-test basis. A header command property serves as the header command's backing store (holds the command's current value) at runtime. To add a new header command property: - 1. Look for the `pub struct TestProps` declaration in - [src/tools/compiletest/src/header.rs][header] and add the new public - property to the end of the declaration. - 2. Look for the `impl TestProps` implementation block immediately following - the struct declaration and initialize the new property to its default - value. + + 1. Look for the `pub struct TestProps` declaration in + [`src/tools/compiletest/src/header.rs`] and add the new public property to + the end of the declaration. + 2. Look for the `impl TestProps` implementation block immediately following + the struct declaration and initialize the new property to its default + value. #### Adding a new header command parser When `compiletest` encounters a test file, it parses the file a line at a time by calling every parser defined in the `Config` struct's implementation block, -also in [src/tools/compiletest/src/header.rs][header] (note the `Config` -struct's declaration block is found in -[src/tools/compiletest/src/common.rs][common]. `TestProps`'s `load_from()` -method will try passing the current line of text to each parser, which, in turn -typically checks to see if the line begins with a particular commented (`//`) -header command such as `// must-compile-successfully` or `// failure-status`. -Whitespace after the comment marker is optional. +also in [`src/tools/compiletest/src/header.rs`][] (note that the `Config` +struct's declaration block is found in [`src/tools/compiletest/src/common.rs`]). +`TestProps`'s `load_from()` method will try passing the current line of text to +each parser, which, in turn typically checks to see if the line begins with a +particular commented (`//`) header command such as `// must-compile-successfully` +or `// failure-status`. Whitespace after the comment marker is optional. Parsers will override a given header command property's default value merely by being specified in the test file as a header command or by having a parameter @@ -107,18 +106,17 @@ value specified in the test file, depending on the header command. Parsers defined in `impl Config` are typically named `parse_` (note kebab-case `` transformed to snake-case -``). `impl Config` also defines several 'low-level' parsers +``). `impl Config` also defines several 'low-level' parsers which make it simple to parse common patterns like simple presence or not (`parse_name_directive()`), header-command:parameter(s) (`parse_name_value_directive()`), optional parsing only if a particular `cfg` -attribute is defined (`has_cfg_prefix()`) and many more. The low-level parsers +attribute is defined (`has_cfg_prefix()`) and many more. The low-level parsers are found near the end of the `impl Config` block; be sure to look through them and their associated parsers immediately above to see how they are used to avoid writing additional parsing code unnecessarily. As a concrete example, here is the implementation for the -`parse_failure_status()` parser, in -[src/tools/compiletest/src/header.rs][header]: +`parse_failure_status()` parser, in [`src/tools/compiletest/src/header.rs`]: ```diff @@ -232,6 +232,7 @@ pub struct TestProps { @@ -163,18 +161,17 @@ As a concrete example, here is the implementation for the ## Implementing the behavior change When a test invokes a particular header command, it is expected that some -behavior will change as a result. What behavior, obviously, will depend on the -purpose of the header command. In the case of `failure-status`, the behavior +behavior will change as a result. What behavior, obviously, will depend on the +purpose of the header command. In the case of `failure-status`, the behavior that changes is that `compiletest` expects the failure code defined by the header command invoked in the test, rather than the default value. Although specific to `failure-status` (as every header command will have a different implementation in order to invoke behavior change) perhaps it is helpful to see the behavior change implementation of one case, simply as an -example. To implement `failure-status`, the `check_correct_failure_status()` +example. To implement `failure-status`, the `check_correct_failure_status()` function found in the `TestCx` implementation block, located in -[src/tools/compiletest/src/runtest.rs](https://github.com/rust-lang/rust/tree/master/src/tools/compiletest/src/runtest.rs), -was modified as per below: +[`src/tools/compiletest/src/runtest.rs`], was modified as per below: ```diff @@ -295,11 +295,14 @@ impl<'test> TestCx<'test> { @@ -213,13 +210,14 @@ was modified as per below: } ``` Note the use of `self.props.failure_status` to access the header command -property. In tests which do not specify the failure status header command, +property. In tests which do not specify the failure status header command, `self.props.failure_status` will evaluate to the default value of 101 at the -time of this writing. But for a test which specifies a header command of, for +time of this writing. But for a test which specifies a header command of, for example, `// failure-status: 1`, `self.props.failure_status` will evaluate to 1, as `parse_failure_status()` will have overridden the `TestProps` default value, for that test specifically. -[test]: https://github.com/rust-lang/rust/tree/master/src/test -[header]: https://github.com/rust-lang/rust/tree/master/src/tools/compiletest/src/header.rs -[common]: https://github.com/rust-lang/rust/tree/master/src/tools/compiletest/src/common.rs +[`src/test`]: https://github.com/rust-lang/rust/tree/master/src/test +[`src/tools/compiletest/src/header.rs`]: https://github.com/rust-lang/rust/tree/master/src/tools/compiletest/src/header.rs +[`src/tools/compiletest/src/common.rs`]: https://github.com/rust-lang/rust/tree/master/src/tools/compiletest/src/common.rs +[`src/tools/compiletest/src/runtest.rs`]: https://github.com/rust-lang/rust/tree/master/src/tools/compiletest/src/runtest.rs diff --git a/src/doc/rustc-dev-guide/src/const-eval.md b/src/doc/rustc-dev-guide/src/const-eval.md index aaa2ed2d6c..d21d0ea581 100644 --- a/src/doc/rustc-dev-guide/src/const-eval.md +++ b/src/doc/rustc-dev-guide/src/const-eval.md @@ -5,7 +5,7 @@ specific item (constant/static/array length) this happens after the MIR for the item is borrow-checked and optimized. In many cases trying to const evaluate an item will trigger the computation of its MIR for the first time. -Prominent examples are +Prominent examples are: * The initializer of a `static` * Array length @@ -20,19 +20,26 @@ Additionally constant evaluation can be used to reduce the workload or binary size at runtime by precomputing complex operations at compiletime and only storing the result. -Constant evaluation can be done by calling the `const_eval` query of `TyCtxt`. - -The `const_eval` query takes a [`ParamEnv`](./param_env.html) of environment in -which the constant is evaluated (e.g. the function within which the constant is -used) and a `GlobalId`. The `GlobalId` is made up of an -`Instance` referring to a constant or static or of an -`Instance` of a function and an index into the function's `Promoted` table. - -Constant evaluation returns a `Result` with either the error, or the simplest -representation of the constant. "simplest" meaning if it is representable as an -integer or fat pointer, it will directly yield the value (via `ConstValue::Scalar` or -`ConstValue::ScalarPair`), instead of referring to the [`miri`](./miri.html) virtual -memory allocation (via `ConstValue::ByRef`). This means that the `const_eval` -function cannot be used to create miri-pointers to the evaluated constant or -static. If you need that, you need to directly work with the functions in -[src/librustc_mir/const_eval.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/const_eval/index.html). +Constant evaluation can be done by calling the `const_eval_*` functions of `TyCtxt`. +They're the wrappers of the `const_eval` query. + +The `const_eval_*` functions use a [`ParamEnv`](./param_env.html) of environment +in which the constant is evaluated (e.g. the function within which the constant is used) +and a [`GlobalId`]. The `GlobalId` is made up of an `Instance` referring to a constant +or static or of an `Instance` of a function and an index into the function's `Promoted` table. + +Constant evaluation returns a [`EvalToConstValueResult`] with either the error, or a +representation of the constant. `static` initializers are always represented as +[`miri`](./miri.html) virtual memory allocations (via [`ConstValue::ByRef`]). +Other constants get represented as [`ConstValue::Scalar`] +or [`ConstValue::Slice`] if possible. This means that the `const_eval_*` +functions cannot be used to create miri-pointers to the evaluated constant. +If you need the value of a constant inside Miri, you need to directly work with +[`eval_const_to_op`]. + +[`GlobalId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/struct.GlobalId.html +[`ConstValue::Scalar`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/value/enum.ConstValue.html#variant.Scalar +[`ConstValue::Slice`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/value/enum.ConstValue.html#variant.Slice +[`ConstValue::ByRef`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/value/enum.ConstValue.html#variant.ByRef +[`EvalToConstValueResult`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/error/type.EvalToConstValueResult.html +[`eval_const_to_op`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/interpret/struct.InterpCx.html#method.eval_const_to_op diff --git a/src/doc/rustc-dev-guide/src/contributing.md b/src/doc/rustc-dev-guide/src/contributing.md new file mode 100644 index 0000000000..abe1bb8390 --- /dev/null +++ b/src/doc/rustc-dev-guide/src/contributing.md @@ -0,0 +1,572 @@ +# Contributing to Rust + +Thank you for your interest in contributing to Rust! There are many ways to +contribute, and we appreciate all of them. + + + +If you have questions, please make a post on [internals.rust-lang.org][internals] or +hop on the [Rust Discord server][rust-discord] or [Rust Zulip server][rust-zulip]. + +As a reminder, all contributors are expected to follow our [Code of Conduct][coc]. + +If this is your first time contributing, the [Getting Started] and +[walkthrough] chapters can give you a good example of how a typical +contribution would go. + +[internals]: https://internals.rust-lang.org +[rust-discord]: http://discord.gg/rust-lang +[rust-zulip]: https://rust-lang.zulipchat.com +[coc]: https://www.rust-lang.org/conduct.html +[walkthrough]: ./walkthrough.md +[Getting Started]: ./getting-started.md + +## Feature Requests + +Feature requests need to go through a process to be approved by the relevant +teams. Usually this requires a Final Comment Period (FCP) or even a Request for +Comments (RFC). See [Getting Started] for more information about these processes. + +## Bug Reports + +While bugs are unfortunate, they're a reality in software. We can't fix what we +don't know about, so please report liberally. If you're not sure if something +is a bug or not, feel free to file a bug anyway. + +**If you believe reporting your bug publicly represents a security risk to Rust users, +please follow our [instructions for reporting security vulnerabilities][vuln]**. + +[vuln]: https://www.rust-lang.org/policies/security + +If you're using the nightly channel, please check if the bug exists in the +latest toolchain before filing your bug. It might be fixed already. + +If you have the chance, before reporting a bug, please [search existing +issues](https://github.com/rust-lang/rust/issues?q=is%3Aissue), +as it's possible that someone else has already reported your error. This doesn't +always work, and sometimes it's hard to know what to search for, so consider this +extra credit. We won't mind if you accidentally file a duplicate report. + +Similarly, to help others who encountered the bug find your issue, consider +filing an issue with a descriptive title, which contains information that might +be unique to it. This can be the language or compiler feature used, the +conditions that trigger the bug, or part of the error message if there is any. +An example could be: **"impossible case reached" on lifetime inference for impl +Trait in return position**. + +Opening an issue is as easy as following [this +link](https://github.com/rust-lang/rust/issues/new/choose) and filling out the fields +in the appropriate provided template. + +## Pull Requests + +Pull requests (or PRs for short) are the primary mechanism we use to change Rust. +GitHub itself has some [great documentation][about-pull-requests] on using the +Pull Request feature. We use the "fork and pull" model [described here][development-models], +where contributors push changes to their personal fork and create pull requests to +bring those changes into the source repository. + +[about-pull-requests]: https://help.github.com/articles/about-pull-requests/ +[development-models]: https://help.github.com/articles/about-collaborative-development-models/ + +All pull requests are reviewed by another person. We have a bot, +[@rust-highfive][rust-highfive], that will automatically assign a random person +to review your request. + +If you want to request that a specific person reviews your pull request, you +can add an `r?` to the pull request description. For example, +[Steve][steveklabnik] usually reviews documentation changes. So if you were to +make a documentation change, add + + r? @steveklabnik + +to the end of the pull request description, and [@rust-highfive][rust-highfive] will assign +[@steveklabnik][steveklabnik] instead of a random person. This is entirely optional. + +In addition to being reviewed by a human, pull requests are automatically tested +thanks to continuous integration (CI). Basically, every time you open and update +a pull request, CI builds the compiler and tests it against the +[compiler test suite][rctd], and also performs other tests such as checking that +your pull request is in compliance with Rust's style guidelines. + +Running continuous integration tests allows PR authors to catch mistakes early +without going through a first review cycle, and also helps reviewers stay aware +of the status of a particular pull request. + +Rust has plenty of CI capacity, and you should never have to worry about wasting +computational resources each time you push a change. It is also perfectly fine +(and even encouraged!) to use the CI to test your changes if it can help your +productivity. In particular, we don't recommend running the full `x.py test` suite locally, +since it takes a very long time to execute. + +After someone has reviewed your pull request, they will leave an annotation +on the pull request with an `r+`. It will look something like this: + + @bors r+ + +This tells [@bors], our lovable integration bot, that your pull request has +been approved. The PR then enters the [merge queue][merge-queue], where [@bors] +will run *all* the tests on *every* platform we support. If it all works out, +[@bors] will merge your code into `master` and close the pull request. + +Depending on the scale of the change, you may see a slightly different form of `r+`: + + @bors r+ rollup + +The additional `rollup` tells [@bors] that this change should always be "rolled up". +Changes that are rolled up are tested and merged alongside other PRs, to +speed the process up. Typically only small changes that are expected not to conflict +with one another are marked as "always roll up". + +[rust-highfive]: https://github.com/rust-highfive +[steveklabnik]: https://github.com/steveklabnik +[@bors]: https://github.com/bors +[merge-queue]: https://bors.rust-lang.org/queue/rust + +### Opening a PR + +You are now ready to file a pull request? Great! Here are a few points you +should be aware of. + +All pull requests should be filed against the `master` branch, except in very +particular scenarios. Unless you know for sure that you should target another +branch, `master` will be the right choice (it's also the default). + +Make sure your pull request is in compliance with Rust's style guidelines by running + + $ ./x.py test tidy --bless + +We recommend to make this check before every pull request (and every new commit +in a pull request); you can add [git hooks](https://git-scm.com/book/en/v2/Customizing-Git-Git-Hooks) +before every push to make sure you never forget to make this check. The +CI will also run tidy and will fail if tidy fails. + +Rust follows a _no merge-commit policy_, meaning, when you encounter merge +conflicts you are expected to always rebase instead of merging. E.g. always use +rebase when bringing the latest changes from the master branch to your feature +branch. Also, please make sure that fixup commits are squashed into other +related commits with meaningful commit messages. + +If you encounter merge conflicts, your PR will get marked as `S-waiting-on-author`. +When you resolve them, you should use `@rustbot` to mark it as `S-waiting-on-review`. +See [this chapter][labeling] for more details. + +GitHub allows [closing issues using keywords][closing-keywords]. This feature +should be used to keep the issue tracker tidy. However, it is generally preferred +to put the "closes #123" text in the PR description rather than the issue commit; +particularly during rebasing, citing the issue number in the commit can "spam" +the issue in question. + +[labeling]: ./rustbot.md#issue-relabeling +[closing-keywords]: https://help.github.com/en/articles/closing-issues-using-keywords + +### External Dependencies (subtree) + +As a developer to this repository, you don't have to treat the following external projects +differently from other crates that are directly in this repo: + +* Clippy + +They are just regular files and directories. This is in contrast to `submodule` dependencies +(see below for those). Only tool authors will actually use any operations here. + +#### Synchronizing a subtree + +There are two synchronization directions: `subtree push` and `subtree pull`. + +``` +git subtree push -P src/tools/clippy git@github.com:your-github-name/rust-clippy sync-from-rust +``` + +takes all the changes that +happened to the copy in this repo and creates commits on the remote repo that match the local +changes. Every local commit that touched the subtree causes a commit on the remote repo, but is +modified to move the files from the specified directory to the tool repo root. + +Make sure to not pick the `master` branch on the tool repo, so you can open a normal PR to the tool +to merge that subrepo push. + +``` +git subtree pull -P src/tools/clippy https://github.com/rust-lang/rust-clippy master +``` + +takes all changes since the last `subtree pull` from the tool repo +and adds these commits to the rustc repo + a merge commit that moves the tool changes into +the specified directory in the rust repository. + +It is recommended that you always do a push first and get that merged to the tool master branch. +Then, when you do a pull, the merge works without conflicts. +While it's definitely possible to resolve conflicts during a pull, you may have to redo the conflict +resolution if your PR doesn't get merged fast enough and there are new conflicts. Do not try to +rebase the result of a `git subtree pull`, rebasing merge commits is a bad idea in general. + +You always need to specify the `-P` prefix to the subtree directory and the corresponding remote +repository. If you specify the wrong directory or repository +you'll get very fun merges that try to push the wrong directory to the wrong remote repository. +Luckily you can just abort this without any consequences by throwing away either the pulled commits +in rustc or the pushed branch on the remote and try again. It is usually fairly obvious +that this is happening because you suddenly get thousands of commits that want to be synchronized. + +#### Creating a new subtree dependency + +If you want to create a new subtree dependency from an existing repository, call (from this +repository's root directory!) + +``` +git subtree add -P src/tools/clippy https://github.com/rust-lang/rust-clippy.git master +``` + +This will create a new commit, which you may not rebase under any circumstances! Delete the commit +and redo the operation if you need to rebase. + +Now you're done, the `src/tools/clippy` directory behaves as if Clippy were +part of the rustc monorepo, so no one but you (or others that synchronize +subtrees) actually needs to use `git subtree`. + + +### External Dependencies (submodules) + +Currently building Rust will also build the following external projects: + +* [miri](https://github.com/rust-lang/miri) +* [rustfmt](https://github.com/rust-lang/rustfmt) +* [rls](https://github.com/rust-lang/rls/) + +We allow breakage of these tools in the nightly channel. Maintainers of these +projects will be notified of the breakages and should fix them as soon as +possible. + +After the external is fixed, one could add the changes with + +```sh +git add path/to/submodule +``` + +outside the submodule. + +In order to prepare your tool-fixing PR, you can run the build locally by doing +`./x.py build src/tools/TOOL`. If you will be editing the sources +there, you may wish to set `submodules = false` in the `config.toml` +to prevent `x.py` from resetting to the original branch. + +Breakage is not allowed in the beta and stable channels, and must be addressed +before the PR is merged. + +#### Breaking Tools Built With The Compiler + +Rust's build system builds a number of tools that make use of the +internals of the compiler. This includes +[RLS](https://github.com/rust-lang/rls) and +[rustfmt](https://github.com/rust-lang/rustfmt). If these tools +break because of your changes, you may run into a sort of "chicken and egg" +problem. These tools rely on the latest compiler to be built so you can't update +them to reflect your changes to the compiler until those changes are merged into +the compiler. At the same time, you can't get your changes merged into the compiler +because the rust-lang/rust build won't pass until those tools build and pass their +tests. + +That means that, in the default state, you can't update the compiler without first +fixing rustfmt, rls and the other tools that the compiler builds. + +Luckily, a feature was [added to Rust's build](https://github.com/rust-lang/rust/issues/45861) +to make all of this easy to handle. The idea is that we allow these tools to be "broken", +so that the rust-lang/rust build passes without trying to build them, then land the change +in the compiler, wait for a nightly, and go update the tools that you broke. Once you're done +and the tools are working again, you go back in the compiler and update the tools +so they can be distributed again. + +This should avoid a bunch of synchronization dances and is also much easier on contributors as +there's no need to block on rls/rustfmt/other tools changes going upstream. + +Here are those same steps in detail: + +1. (optional) First, if it doesn't exist already, create a `config.toml` by copying + `config.toml.example` in the root directory of the Rust repository. + Set `submodules = false` in the `[build]` section. This will prevent `x.py` + from resetting to the original branch after you make your changes. If you + need to [update any submodules to their latest versions](#updating-submodules), + see the section of this file about that for more information. +2. (optional) Run `./x.py test src/tools/rustfmt` (substituting the submodule + that broke for `rustfmt`). Fix any errors in the submodule (and possibly others). +3. (optional) Make commits for your changes and send them to upstream repositories as a PR. +4. (optional) Maintainers of these submodules will **not** merge the PR. The PR can't be + merged because CI will be broken. You'll want to write a message on the PR referencing + your change, and how the PR should be merged once your change makes it into a nightly. +5. Wait for your PR to merge. +6. Wait for a nightly +7. (optional) Help land your PR on the upstream repository now that your changes are in nightly. +8. (optional) Send a PR to rust-lang/rust updating the submodule. + +#### Updating submodules + +These instructions are specific to updating `rustfmt`, however they may apply +to the other submodules as well. Please help by improving these instructions +if you find any discrepancies or special cases that need to be addressed. + +To update the `rustfmt` submodule, start by running the appropriate +[`git submodule` command](https://git-scm.com/book/en/v2/Git-Tools-Submodules). +For example, to update to the latest commit on the remote master branch, +you may want to run: +``` +git submodule update --remote src/tools/rustfmt +``` +If you run `./x.py build` now, and you are lucky, it may just work. If you see +an error message about patches that did not resolve to any crates, you will need +to complete a few more steps which are outlined with their rationale below. + +*(This error may change in the future to include more information.)* +``` +error: failed to resolve patches for `https://github.com/rust-lang/rustfmt` + +Caused by: + patch for `rustfmt-nightly` in `https://github.com/rust-lang/rustfmt` did not resolve to any crates +failed to run: ~/rust/build/x86_64-unknown-linux-gnu/stage0/bin/cargo build --manifest-path ~/rust/src/bootstrap/Cargo.toml +``` + +The [`[patch]`][patchsec] section of `Cargo.toml` can be very useful for +testing. In addition to that, you should read the [Overriding +dependencies][overriding] section of the documentation. + +[patchsec]: http://doc.crates.io/manifest.html#the-patch-section +[overriding]: http://doc.crates.io/specifying-dependencies.html#overriding-dependencies + +Specifically, the following [section in Overriding dependencies][testingbugfix] +reveals what the problem is: + +[testingbugfix]: http://doc.crates.io/specifying-dependencies.html#testing-a-bugfix + +> Next up we need to ensure that our lock file is updated to use this new +> version of uuid so our project uses the locally checked out copy instead of +> one from crates.io. The way `[patch]` works is that it'll load the dependency +> at ../path/to/uuid and then whenever crates.io is queried for versions of +> uuid it'll also return the local version. +> +> This means that the version number of the local checkout is significant and +> will affect whether the patch is used. Our manifest declared uuid = "1.0" +> which means we'll only resolve to >= 1.0.0, < 2.0.0, and Cargo's greedy +> resolution algorithm also means that we'll resolve to the maximum version +> within that range. Typically this doesn't matter as the version of the git +> repository will already be greater or match the maximum version published on +> crates.io, but it's important to keep this in mind! + +This says that when we updated the submodule, the version number in our +`src/tools/rustfmt/Cargo.toml` changed. The new version is different from +the version in `Cargo.lock`, so the build can no longer continue. + +To resolve this, we need to update `Cargo.lock`. Luckily, cargo provides a +command to do this easily. + +``` +$ cargo update -p rustfmt-nightly +``` + +This should change the version listed in `Cargo.lock` to the new version you updated +the submodule to. Running `./x.py build` should work now. + +## Writing Documentation + +Documentation improvements are very welcome. The source of `doc.rust-lang.org` +is located in [`src/doc`] in the tree, and standard API documentation is generated +from the source code itself (e.g. [`lib.rs`]). Documentation pull requests function +in the same way as other pull requests. + +[`src/doc`]: https://github.com/rust-lang/rust/tree/master/src/doc +[`lib.rs`]: https://github.com/rust-lang/rust/blob/master/library/std/src/lib.rs#L1 + +To find documentation-related issues, sort by the [T-doc label][tdoc]. + +[tdoc]: https://github.com/rust-lang/rust/issues?q=is%3Aopen%20is%3Aissue%20label%3AT-doc + +You can find documentation style guidelines in [RFC 1574][rfc1574]. + +[rfc1574]: https://github.com/rust-lang/rfcs/blob/master/text/1574-more-api-documentation-conventions.md#appendix-a-full-conventions-text + +In many cases, you don't need a full `./x.py doc --stage 2`, which will build +the entire stage 2 compiler and compile the various books published on +[doc.rust-lang.org][docs]. When updating documentation for the standard library, +first try `./x.py doc library/std`. If that fails, or if you need to +see the output from the latest version of `rustdoc`, add `--stage 1`. +Results should appear in `build/$TARGET/doc`. + +[docs]: https://doc.rust-lang.org + +You can also use `rustdoc` directly to check small fixes. For example, +`rustdoc src/doc/reference.md` will render reference to `doc/reference.html`. +The CSS might be messed up, but you can verify that the HTML is right. + +### Contributing to rustc-dev-guide + +Contributions to the [rustc-dev-guide][rdg] are always welcome, and can be made directly at +[the rust-lang/rustc-dev-guide repo][rdgrepo]. +The issue tracker in that repo is also a great way to find things that need doing. +There are issues for beginners and advanced compiler devs alike! + +Just a few things to keep in mind: + +- Please limit line length to 100 characters. This is enforced by CI, and you can run the checks + locally with `ci/check_line_lengths.sh`. + +- When contributing text to the guide, please contextualize the information with some time period + and/or a reason so that the reader knows how much to trust or mistrust the information. + Aim to provide a reasonable amount of context, possibly including but not limited to: + + - A reason for why the data may be out of date other than "change", as change is a constant across + the project. + + - The date the comment was added, e.g. instead of writing _"Currently, ..."_ + or _"As of now, ..."_, consider writing + _"As of January 2021, ..."_. + Try to format the date as ` ` to ease search. + + - Additionally, include a machine-readable comment of the form `` (if the current month is January 2021). We have an automated + tool that uses these (in `ci/date-check`). + + So, for the month of January 2021, the comment would look like: `As of January 2021`. Make sure to put the comment *between* `as of` + and `January 2021`; see [PR #1066][rdg#1066] for the rationale. + + - A link to a relevant WG, tracking issue, `rustc` rustdoc page, or similar, that may provide + further explanation for the change process or a way to verify that the information is not + outdated. + +- If a text grows rather long (more than a few page scrolls) or complicated (more than four + subsections) it might benefit from having a Table of Contents at the beginning, which you can + auto-generate by including the `` marker. + +[rdg]: https://rustc-dev-guide.rust-lang.org/ +[rdgrepo]: https://github.com/rust-lang/rustc-dev-guide +[rdg#1066]: https://github.com/rust-lang/rustc-dev-guide/pull/1066 + +## Issue Triage + +Sometimes, an issue will stay open, even though the bug has been fixed. And +sometimes, the original bug may go stale because something has changed in the +meantime. + +It can be helpful to go through older bug reports and make sure that they are +still valid. Load up an older issue, double check that it's still true, and +leave a comment letting us know if it is or is not. The [least recently +updated sort][lru] is good for finding issues like this. + +[Thanks to `@rustbot`][rustbot], anyone can help triage issues by adding +appropriate labels to issues that haven't been triaged yet: + +* Yellow, **A**-prefixed labels state which **area** of the project an issue + relates to. + +* Magenta, **B**-prefixed labels identify bugs which are **blockers**. + +* Dark blue, **beta-** labels track changes which need to be backported into + the beta branches. + +* Light purple, **C**-prefixed labels represent the **category** of an issue. + +* Green, **E**-prefixed labels explain the level of **experience** necessary + to fix the issue. + +* The dark blue **final-comment-period** label marks bugs that are using the + RFC signoff functionality of [rfcbot] and are currently in the final + comment period. + +* Red, **I**-prefixed labels indicate the **importance** of the issue. The + [I-nominated][inom] label indicates that an issue has been nominated for + discussion at the next meeting of the team tagged using a + **T**-prefixed label. Similarly, the [I-prioritize][ipri] indicates + that an issue has been requested to be prioritized by the appropriate + team. + +* The purple **metabug** label marks lists of bugs collected by other + categories. + +* Purple gray, **O**-prefixed labels are the **operating system** or platform + that this issue is specific to. + +* Orange, **P**-prefixed labels indicate a bug's **priority**. These labels + can be assigned by anyone that understand the issue and is able to + prioritize it, and replace the [I-prioritize][ipri] label. + +* The gray **proposed-final-comment-period** label marks bugs that are using + 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 + release channels. + +* The light orange **relnotes** label marks issues that should be documented in + the release notes of the next release. + +* Gray, **S**-prefixed labels are used for tracking the **status** of pull + requests. + +* Blue, **T**-prefixed bugs denote which **team** the issue belongs to. + +If you're looking for somewhere to start, check out the [E-easy][eeasy] tag. + +[rustbot]: ./rustbot.md +[inom]: https://github.com/rust-lang/rust/issues?q=is%3Aopen+is%3Aissue+label%3AI-nominated +[ipri]: https://github.com/rust-lang/rust/issues?q=is%3Aopen+is%3Aissue+label%3AI-prioritize +[eeasy]: https://github.com/rust-lang/rust/issues?q=is%3Aopen+is%3Aissue+label%3AE-easy +[lru]: https://github.com/rust-lang/rust/issues?q=is%3Aissue+is%3Aopen+sort%3Aupdated-asc +[rfcbot]: https://github.com/anp/rfcbot-rs/ + +## Out-of-tree Contributions + +There are a number of other ways to contribute to Rust that don't deal with +rust-lang/rust: + +* Answer questions in the _Get Help!_ channels on the [Rust Discord + server][rust-discord], on [users.rust-lang.org][users], or on + [StackOverflow][so]. +* Participate in the [RFC process](https://github.com/rust-lang/rfcs). +* Find a [requested community library][community-library], build it, and publish + it to [Crates.io](http://crates.io). Easier said than done, but very, very + valuable! + +[rust-discord]: https://discord.gg/rust-lang +[users]: https://users.rust-lang.org/ +[so]: http://stackoverflow.com/questions/tagged/rust +[community-library]: https://github.com/rust-lang/rfcs/labels/A-community-library + +## Helpful Links and Information + +For people new to Rust, and just starting to contribute, or even for +more seasoned developers, some useful places to look for information +are: + +* This guide contains information about how various parts of the + compiler work and how to contribute to the compiler +* [Rust Forge][rustforge] contains additional documentation, including + write-ups of how to achieve common tasks +* The [Rust Internals forum][rif], a place to ask questions and + discuss Rust's internals +* The [generated documentation for Rust's compiler][gdfrustc] +* The [Rust reference][rr], even though it doesn't specifically talk about + Rust's internals, is a great resource nonetheless +* Although out of date, [Tom Lee's great blog article][tlgba] is very helpful +* [rustaceans.org][ro] is helpful, but mostly dedicated to IRC +* The [Rust Compiler Testing Docs][rctd] +* For [@bors], [this cheat sheet][cheatsheet] is helpful +* Google is always helpful when programming. + You can [search all Rust documentation][gsearchdocs] (the standard library, + the compiler, the books, the references, and the guides) to quickly find + information about the language and compiler. +* You can also use Rustdoc's built-in search feature to find documentation on + types and functions within the crates you're looking at. You can also search + by type signature! For example, searching for `* -> vec` should find all + functions that return a `Vec`. + _Hint:_ Find more tips and keyboard shortcuts by typing `?` on any Rustdoc + page! +* Don't be afraid to ask! The Rust community is friendly and helpful. + +[rustc dev guide]: https://rustc-dev-guide.rust-lang.org/about-this-guide.html +[gdfrustc]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ +[gsearchdocs]: https://www.google.com/search?q=site:doc.rust-lang.org+your+query+here +[stddocs]: https://doc.rust-lang.org/std +[rif]: http://internals.rust-lang.org +[rr]: https://doc.rust-lang.org/book/README.html +[rustforge]: https://forge.rust-lang.org/ +[tlgba]: https://tomlee.co/2014/04/a-more-detailed-tour-of-the-rust-compiler/ +[ro]: https://www.rustaceans.org/ +[rctd]: https://rustc-dev-guide.rust-lang.org/tests/intro.html +[cheatsheet]: https://bors.rust-lang.org/ diff --git a/src/doc/rustc-dev-guide/src/conventions.md b/src/doc/rustc-dev-guide/src/conventions.md index 3f957cc27b..582de03649 100644 --- a/src/doc/rustc-dev-guide/src/conventions.md +++ b/src/doc/rustc-dev-guide/src/conventions.md @@ -7,14 +7,18 @@ chapter covers [formatting](#formatting), [coding for correctness](#cc), # Formatting and the tidy script -rustc is slowly moving towards the [Rust standard coding style][fmt]; -at the moment, however, it follows a rather more *chaotic* style. We -do have some mandatory formatting conventions, which are automatically -enforced by a script we affectionately call the "tidy" script. The -tidy script runs automatically when you do `./x.py test` and can be run +rustc is moving towards the [Rust standard coding style][fmt]. +This is enforced by the "tidy" script and can be mostly +automated using `./x.py fmt`. + +As the output of [rustfmt] is not completely stable, +formatting this repository using `cargo fmt` is not recommended. + +The tidy script runs automatically when you do `./x.py test` and can be run in isolation with `./x.py test tidy`. [fmt]: https://github.com/rust-dev-tools/fmt-rfcs +[rustfmt]:https://github.com/rust-lang/rustfmt @@ -34,8 +38,7 @@ keep things to 80. **Ignoring the line length limit.** Sometimes – in particular for tests – it can be necessary to exempt yourself from this limit. In -that case, you can add a comment towards the top of the file (after -the copyright notice) like so: +that case, you can add a comment towards the top of the file like so: ```rust // ignore-tidy-linelength @@ -114,12 +117,9 @@ you introduce some code following one strategy, then change it dramatically (versus adding to it) in a later commit, that 'back-and-forth' can be confusing. -**Only run rustfmt on new content.** One day, we might enforce formatting -for the rust-lang/rust repo. Meanwhile, we prefer that rustfmt not be run -on existing code as that will generate large diffs and will make git blame -harder to sift through. However, running `rustfmt` on new content, e.g. a -new file or a largely new part of a file is ok. Small formatting adjustments -nearby code you are already changing for other purposes are also ok. +**Format liberally.** While only the final commit of a PR must be correctly +formatted, it is both easier to review and less noisy to format each commit +individually using `./x.py fmt`. **No merges.** We do not allow merge commits into our history, other than those by bors. If you get a merge conflict, rebase instead via a diff --git a/src/doc/rustc-dev-guide/src/crates-io.md b/src/doc/rustc-dev-guide/src/crates-io.md index 21dd00afe5..6fbabdc914 100644 --- a/src/doc/rustc-dev-guide/src/crates-io.md +++ b/src/doc/rustc-dev-guide/src/crates-io.md @@ -14,10 +14,9 @@ reasons: TODO: what is the vetting process? -## Whitelist +## Permitted dependencies -The `tidy` tool has a [whitelist] of crates that are allowed. To add a -dependency that is not already in the compiler, you will need to add it to this -whitelist. +The `tidy` tool has [a list of crates that are allowed]. To add a +dependency that is not already in the compiler, you will need to add it to the list. -[whitelist]: https://github.com/rust-lang/rust/blob/659994627234ce7d95a1a52ad8756ce661059adf/src/tools/tidy/src/deps.rs#L56 +[a list of crates that are allowed]: https://github.com/rust-lang/rust/blob/19ecce332e56941ea0dd2a805270faa102acdb14/src/tools/tidy/src/deps.rs#L59 diff --git a/src/doc/rustc-dev-guide/src/debugging-support-in-rustc.md b/src/doc/rustc-dev-guide/src/debugging-support-in-rustc.md index a11edba785..5590311483 100644 --- a/src/doc/rustc-dev-guide/src/debugging-support-in-rustc.md +++ b/src/doc/rustc-dev-guide/src/debugging-support-in-rustc.md @@ -1,5 +1,7 @@ # Debugging support in the Rust compiler + + This document explains the state of debugging tools support in the Rust compiler (rustc). The document gives an overview of debugging tools like GDB, LLDB etc. and infrastructure around Rust compiler to debug Rust code. If you want to learn how to debug the Rust compiler @@ -93,8 +95,6 @@ document so there is no duplication etc.? ### LLDB -We have our own fork of LLDB - [https://github.com/rust-lang/lldb] - Fork of LLVM project - [https://github.com/rust-lang/llvm-project] LLDB currently only works on macOS because of a dependency issue. This issue was easier to @@ -268,6 +268,45 @@ Focus is to let macros decide what to do. This can be achieved by having some ki that lets the macro tell the compiler where the line marker should be. This affects where you set the breakpoints and what happens when you step it. +## Source file checksums in debug info + +Both DWARF and CodeView (PDB) support embedding a cryptographic hash of each source file that +contributed to the associated binary. + +The cryptographic hash can be used by a debugger to verify that the source file matches the +executable. If the source file does not match, the debugger can provide a warning to the user. + +The hash can also be used to prove that a given source file has not been modified since it was +used to compile an executable. Because MD5 and SHA1 both have demonstrated vulnerabilities, +using SHA256 is recommended for this application. + +The Rust compiler stores the hash for each source file in the corresponding `SourceFile` in +the `SourceMap`. The hashes of input files to external crates are stored in `rlib` metadata. + +A default hashing algorithm is set in the target specification. This allows the target to +specify the best hash available, since not all targets support all hash algorithms. + +The hashing algorithm for a target can also be overridden with the `-Z source-file-checksum=` +command-line option. + +#### DWARF 5 +DWARF version 5 supports embedding an MD5 hash to validate the source file version in use. +DWARF 5 - Section 6.2.4.1 opcode DW_LNCT_MD5 + +#### LLVM +LLVM IR supports MD5 and SHA1 (and SHA256 in LLVM 11+) source file checksums in the DIFile node. + +[LLVM DIFile documentation](https://llvm.org/docs/LangRef.html#difile) + +#### Microsoft Visual C++ Compiler /ZH option +The MSVC compiler supports embedding MD5, SHA1, or SHA256 hashes in the PDB using the `/ZH` +compiler option. + +[MSVC /ZH documentation](https://docs.microsoft.com/en-us/cpp/build/reference/zh) + +#### Clang +Clang always embeds an MD5 checksum, though this does not appear in documentation. + ## Future work #### Name mangling changes @@ -295,10 +334,6 @@ They implement just the expression language but they also add some extensions li convenience variables. Therefore, if you are taking this route then you not only need to do this bridge but may have to add some mode to let the compiler understand some extensions. -#### Windows debugging (PDB) is missing - -This is a complete unknown. - [Tom Tromey discusses debugging support in rustc]: https://www.youtube.com/watch?v=elBxMRSNYr4 [Debugging the Compiler]: compiler-debugging.md [debugger or debugging tool]: https://en.wikipedia.org/wiki/Debugger diff --git a/src/doc/rustc-dev-guide/src/diagnostics.md b/src/doc/rustc-dev-guide/src/diagnostics.md index 50da15c220..f4e71bbdc4 100644 --- a/src/doc/rustc-dev-guide/src/diagnostics.md +++ b/src/doc/rustc-dev-guide/src/diagnostics.md @@ -1,8 +1,285 @@ -# Emitting Errors and other Diagnostics +# Errors and Lints + + A lot of effort has been put into making `rustc` have great error messages. This chapter is about how to emit compile errors and lints from the compiler. +## Diagnostic structure + +The main parts of a diagnostic error are the following: + +``` +error[E0000]: main error message + --> file.rs:LL:CC + | +LL | + | -^^^^- secondary label + | | + | primary label + | + = note: note without a `Span`, created with `.note` +note: sub-diagnostic message for `.span_note` + --> file.rs:LL:CC + | +LL | more code + | ^^^^ +``` + +- Description (`error`, `warning`, etc.). +- Code (for example, for "mismatched types", it is `E0308`). It helps + users get more information about the current error through an extended + description of the problem in the error code index. +- Message. It is the main description of the problem. It should be general and + able to stand on its own, so that it can make sense even in isolation. +- Diagnostic window. This contains several things: + - The path, line number and column of the beginning of the primary span. + - The users' affected code and its surroundings. + - Primary and secondary spans underlying the users' code. These spans can + optionally contain one or more labels. + - Primary spans should have enough text to describe the problem in such a + way that if it where the only thing being displayed (for example, in an + IDE) it would still make sense. Because it is "spatially aware" (it + points at the code), it can generally be more succinct than the error + message. + - If cluttered output can be foreseen in cases when multiple span labels + overlap, it is a good idea to tweak the output appropriately. For + example, the `if/else arms have incompatible types` error uses different + spans depending on whether the arms are all in the same line, if one of + the arms is empty and if none of those cases applies. +- Sub-diagnostics. Any error can have multiple sub-diagnostics that look + similar to the main part of the error. These are used for cases where the + order of the explanation might not correspond with the order of the code. If + the order of the explanation can be "order free", leveraging secondary labels + in the main diagnostic is preferred, as it is typically less verbose. + +The text should be matter of fact and avoid capitalization and periods, unless +multiple sentences are _needed_: + +```txt +error: the fobrulator needs to be krontrificated +``` + +When code or an identifier must appear in a message or label, it should be +surrounded with single acute accents \`. + +### Error explanations + +Some errors include long form descriptions. They may be viewed with the +`--explain` flag, or via the [error index]. Each explanation comes with an +example of how to trigger it and advice on how to fix it. + +Please read [RFC 1567] for details on how to format and write long error +codes. + +The descriptions are written in Markdown, and all of them are linked in the +[`rustc_error_codes`] crate. + +As a general rule, give an error a code (with an associated explanation) if the +explanation would give more information than the error itself. A lot of the time +it's better to put all the information in the emitted error itself. However, +sometimes that would make the error verbose or there are too many possible +triggers to include useful information for all cases in the error, in which case +it's a good idea to add an explanation.[^estebank] +As always, if you are not sure, just ask your reviewer! + +[^estebank]: This rule of thumb was suggested by **@estebank** [here][estebank-comment]. + +[`rustc_error_codes`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_error_codes/error_codes/index.html +[error index]: https://doc.rust-lang.org/error-index.html +[RFC 1567]: https://github.com/rust-lang/rfcs/blob/master/text/1567-long-error-codes-explanation-normalization.md +[estebank-comment]: https://github.com/rust-lang/rustc-dev-guide/pull/967#issuecomment-733218283 + +### Lints versus fixed diagnostics + +Some messages are emitted via [lints](#lints), where the user can control the +level. Most diagnostics are hard-coded such that the user cannot control the +level. + +Usually it is obvious whether a diagnostic should be "fixed" or a lint, but +there are some grey areas. + +Here are a few examples: + +- Borrow checker errors: these are fixed errors. The user cannot adjust the + level of these diagnostics to silence the borrow checker. +- Dead code: this is a lint. While the user probably doesn't want dead code in + their crate, making this a hard error would make refactoring and development + very painful. +- [safe_packed_borrows future compatibility warning][safe_packed_borrows]: + this is a silencable lint related to safety. It was judged that the making + this a hard (fixed) error would cause too much breakage, so instead a + warning is emitted that eventually will be turned into a hard error. + +Hard-coded warnings (those using the `span_warn` methods) should be avoided +for normal code, preferring to use lints instead. Some cases, such as warnings +with CLI flags, will require the use of hard-coded warnings. + +See the `deny` [lint level](#diagnostic-levels) below for guidelines when to +use an error-level lint instead of a fixed error. + +[safe_packed_borrows]: https://github.com/rust-lang/rust/issues/46043 + +## Diagnostic output style guide + +- Write in plain simple English. If your message, when shown on a – possibly + small – screen (which hasn't been cleaned for a while), cannot be understood + by a normal programmer, who just came out of bed after a night partying, + it's too complex. +- `Error`, `Warning`, `Note`, and `Help` messages start with a lowercase + letter and do not end with punctuation. +- Error messages should be succinct. Users will see these error messages many + times, and more verbose descriptions can be viewed with the `--explain` + flag. That said, don't make it so terse that it's hard to understand. +- The word "illegal" is illegal. Prefer "invalid" or a more specific word + instead. +- Errors should document the span of code where they occur – the + [`rustc_errors::diagnostic_builder::DiagnosticBuilder`][diagbuild] `span_*` + methods allow to easily do this. Also `note` other spans that have + contributed to the error if the span isn't too large. +- When emitting a message with span, try to reduce the span to the smallest + amount possible that still signifies the issue +- Try not to emit multiple error messages for the same error. This may require + detecting duplicates. +- When the compiler has too little information for a specific error message, + consult with the compiler team to add new attributes for library code that + allow adding more information. For example see + [`#[rustc_on_unimplemented]`](#rustc_on_unimplemented). Use these + annotations when available! +- Keep in mind that Rust's learning curve is rather steep, and that the + compiler messages are an important learning tool. +- When talking about the compiler, call it `the compiler`, not `Rust` or + `rustc`. + +### Lint naming + +From [RFC 0344], lint names should be consistent, with the following +guidelines: + +The basic rule is: the lint name should make sense when read as "allow +*lint-name*" or "allow *lint-name* items". For example, "allow +`deprecated` items" and "allow `dead_code`" makes sense, while "allow +`unsafe_block`" is ungrammatical (should be plural). + +- Lint names should state the bad thing being checked for, e.g. `deprecated`, + so that `#[allow(deprecated)]` (items) reads correctly. Thus `ctypes` is not + an appropriate name; `improper_ctypes` is. + +- Lints that apply to arbitrary items (like the stability lints) should just + mention what they check for: use `deprecated` rather than + `deprecated_items`. This keeps lint names short. (Again, think "allow + *lint-name* items".) + +- If a lint applies to a specific grammatical class, mention that class and + use the plural form: use `unused_variables` rather than `unused_variable`. + This makes `#[allow(unused_variables)]` read correctly. + +- Lints that catch unnecessary, unused, or useless aspects of code should use + the term `unused`, e.g. `unused_imports`, `unused_typecasts`. + +- Use snake case in the same way you would for function names. + +[RFC 0344]: https://github.com/rust-lang/rfcs/blob/master/text/0344-conventions-galore.md#lints + +### Diagnostic levels + +Guidelines for different diagnostic levels: + +- `error`: emitted when the compiler detects a problem that makes it unable to + compile the program, either because the program is invalid or the programmer + has decided to make a specific `warning` into an error. + +- `warning`: emitted when the compiler detects something odd about a program. + Care should be taken when adding warnings to avoid warning fatigue, and + avoid false-positives where there really isn't a problem with the code. Some + examples of when it is appropriate to issue a warning: + + - A situation where the user *should* take action, such as swap out a + deprecated item, or use a `Result`, but otherwise doesn't prevent + compilation. + - Unnecessary syntax that can be removed without affecting the semantics of + the code. For example, unused code, or unnecessary `unsafe`. + - Code that is very likely to be incorrect, dangerous, or confusing, but the + language technically allows, and is not ready or confident enough to make + an error. For example `unused_comparisons` (out of bounds comparisons) or + `bindings_with_variant_name` (the user likely did not intend to create a + binding in a pattern). + - [Future-incompatible lints](#future-incompatible), where something was + accidentally or erroneously accepted in the past, but rejecting would + cause excessive breakage in the ecosystem. + - Stylistic choices. For example, camel or snake case, or the `dyn` trait + warning in the 2018 edition. These have a high bar to be added, and should + only be used in exceptional circumstances. Other stylistic choices should + either be allow-by-default lints, or part of other tools like Clippy or + rustfmt. + +- `help`: emitted following an `error` or `warning` to give additional + information to the user about how to solve their problem. These messages + often include a suggestion string and [`rustc_errors::Applicability`] + confidence level to guide automated source fixes by tools. See the + [Suggestions](#suggestions) section for more details. + + The error or warning portion should *not* suggest how to fix the problem, + only the "help" sub-diagnostic should. + +- `note`: emitted to identify additional circumstances and parts of the code + that caused the warning or error. For example, the borrow checker will note + any previous conflicting borrows. + +Not to be confused with *lint levels*, whose guidelines are: + +- `forbid`: Lints should never default to `forbid`. +- `deny`: Equivalent to `error` diagnostic level. Some examples: + + - A future-incompatible or edition-based lint that has graduated from the + warning level. + - Something that has an extremely high confidence that is incorrect, but + still want an escape hatch to allow it to pass. + +- `warn`: Equivalent to the `warning` diagnostic level. See `warning` above + for guidelines. +- `allow`: Examples of the kinds of lints that should default to `allow`: + + - The lint has a too high false positive rate. + - The lint is too opinionated. + - The lint is experimental. + - The lint is used for enforcing something that is not normally enforced. + For example, the `unsafe_code` lint can be used to prevent usage of unsafe + code. + +More information about lint levels can be found in the [rustc +book][rustc-lint-levels] and the [reference][reference-diagnostics]. + +[`rustc_errors::Applicability`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/enum.Applicability.html +[reference-diagnostics]: https://doc.rust-lang.org/nightly/reference/attributes/diagnostics.html#lint-check-attributes +[rustc-lint-levels]: https://doc.rust-lang.org/nightly/rustc/lints/levels.html + +## Helpful tips and options + +### Finding the source of errors + +There are two main ways to find where a given error is emitted: + +- `grep` for either a sub-part of the error message/label or error code. This + usually works well and is straightforward, but there are some cases where + the error emitting code is removed from the code where the error is + constructed behind a relatively deep call-stack. Even then, it is a good way + to get your bearings. +- Invoking `rustc` with the nightly-only flag `-Z treat-err-as-bug=1`, which + will treat the first error being emitted as an Internal Compiler Error, which + allows you to use the environment variable `RUST_BACKTRACE=full` to get a + stack trace at the point the error has been emitted. Change the `1` to + something else if you whish to trigger on a later error. Some limitations + with this approach is that some calls get elided from the stack trace because + they get inlined in the compiled `rustc`, and the same problem we faced with + the prior approach, where the _construction_ of the error is far away from + where it is _emitted_. In some cases we buffer multiple errors in order to + emit them in order. + +The regular development practices apply: judicious use of `debug!()` statements +and use of a debugger to trigger break points in order to figure out in what +order things are happening. + ## `Span` [`Span`][span] is the primary data structure in `rustc` used to represent a @@ -72,6 +349,12 @@ if let Ok(snippet) = sess.source_map().span_to_snippet(sp) { err.emit(); ``` +Alternatively, for less-complex diagnostics, the `SessionDiagnostic` derive +macro can be used -- see [Creating Errors With SessionDiagnostic][sessiondiagnostic]. + +[sessiondiagnostic]: ./diagnostics/sessiondiagnostic.md + + ## Suggestions In addition to telling the user exactly _why_ their code is wrong, it's @@ -84,11 +367,29 @@ Server][rls] and [`rustfix`][rustfix]. [rls]: https://github.com/rust-lang/rls [rustfix]: https://github.com/rust-lang/rustfix -Not all suggestions should be applied mechanically. Use the +Not all suggestions should be applied mechanically, they have a degree of +confidence in the suggested code, from high +(`Applicability::MachineApplicable`) to low (`Applicability::MaybeIncorrect`). +Be conservative when choosing the level. Use the [`span_suggestion`][span_suggestion] method of `DiagnosticBuilder` to make a suggestion. The last argument provides a hint to tools whether the suggestion is mechanically applicable or not. +Suggestions point to one or more spans with corresponding code that will +replace their current content. + +The message that accompanies them should be understandable in the following +contexts: + +- shown as an independent sub-diagnostic (this is the default output) +- shown as a label pointing at the affected span (this is done automatically if +some heuristics for verbosity are met) +- shown as a `help` sub-diagnostic with no content (used for cases where the +suggestion is obvious from the text, but we still want to let tools to apply +them)) +- not shown (used for _very_ obvious cases, but we still want to allow tools to +apply them) + [span_suggestion]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/struct.DiagnosticBuilder.html#method.span_suggestion For example, to make our `qux` suggestion machine-applicable, we would do: @@ -157,9 +458,25 @@ The possible values of [`Applicability`][appl] are: [appl]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/enum.Applicability.html +### Suggestion Style Guide + +- Suggestions should not be a question. In particular, language like "did you + mean" should be avoided. Sometimes, it's unclear why a particular suggestion + is being made. In these cases, it's better to be upfront about what the + suggestion is. + + Compare "did you mean: `Foo`" vs. "there is a struct with a similar name: `Foo`". + +- The message should not contain any phrases like "the following", "as shown", + etc. Use the span to convey what is being talked about. +- The message may contain further instruction such as "to do xyz, use" or "to do + xyz, use abc". +- The message may contain a name of a function, variable, or type, but avoid + whole expressions. + ## Lints -The compiler linting infrastructure is defined in the [`rustc::lint`][rlint] +The compiler linting infrastructure is defined in the [`rustc_middle::lint`][rlint] module. [rlint]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/lint/index.html @@ -173,7 +490,7 @@ crate. Every lint is implemented via a `struct` that implements the `LintPass` `trait` (you also implement one of the more specific lint pass traits, either -`EarlyLintPass` or `LateLintPass`). The trait implementation allows you to +`EarlyLintPass` or `LateLintPass`). The trait implementation allows you to check certain syntactic constructs as the linter walks the source code. You can then choose to emit lints in a very similar way to compile errors. @@ -198,35 +515,45 @@ declare_lint! { "suggest using `loop { }` instead of `while true { }`" } -// Define a struct and `impl LintPass` for it. -#[derive(Copy, Clone)] -pub struct WhileTrue; - -// This declares a lint pass, providing a list of associated lints. The +// This declares a struct and a lint pass, providing a list of associated lints. The // compiler currently doesn't use the associated lints directly (e.g., to not // run the pass or otherwise check that the pass emits the appropriate set of // lints). However, it's good to be accurate here as it's possible that we're // going to register the lints via the get_lints method on our lint pass (that // this macro generates). -impl_lint_pass!( - WhileTrue => [WHILE_TRUE], -); +declare_lint_pass!(WhileTrue => [WHILE_TRUE]); -// LateLintPass has lots of methods. We only override the definition of +// Helper function for `WhileTrue` lint. +// Traverse through any amount of parenthesis and return the first non-parens expression. +fn pierce_parens(mut expr: &ast::Expr) -> &ast::Expr { + while let ast::ExprKind::Paren(sub) = &expr.kind { + expr = sub; + } + expr +} + +// `EarlyLintPass` has lots of methods. We only override the definition of // `check_expr` for this lint because that's all we need, but you could // override other methods for your own lint. See the rustc docs for a full // list of methods. -impl<'a, 'tcx> LateLintPass<'a, 'tcx> for WhileTrue { - fn check_expr(&mut self, cx: &LateContext, e: &hir::Expr) { - if let hir::ExprWhile(ref cond, ..) = e.node { - if let hir::ExprLit(ref lit) = cond.node { - if let ast::LitKind::Bool(true) = lit.node { - if lit.span.ctxt() == SyntaxContext::empty() { +impl EarlyLintPass for WhileTrue { + fn check_expr(&mut self, cx: &EarlyContext<'_>, e: &ast::Expr) { + if let ast::ExprKind::While(cond, ..) = &e.kind { + if let ast::ExprKind::Lit(ref lit) = pierce_parens(cond).kind { + if let ast::LitKind::Bool(true) = lit.kind { + if !lit.span.from_expansion() { let msg = "denote infinite loops with `loop { ... }`"; - let condition_span = cx.tcx.sess.source_map().def_span(e.span); - let mut err = cx.struct_span_lint(WHILE_TRUE, condition_span, msg); - err.span_suggestion_short(condition_span, "use `loop`", "loop".to_owned()); - err.emit(); + let condition_span = cx.sess.source_map().guess_head_span(e.span); + cx.struct_span_lint(WHILE_TRUE, condition_span, |lint| { + lint.build(msg) + .span_suggestion_short( + condition_span, + "use `loop`", + "loop".to_owned(), + Applicability::MachineApplicable, + ) + .emit(); + }) } } } @@ -267,10 +594,11 @@ declare_lint! { } ``` -If you need a combination of options that's not supported by the -`declare_lint!` macro, you can always define your own static with a type of -`&Lint` but this is currently linted against in the compiler tree. +If you need a combination of options that's not supported by the `declare_lint!` +macro, you can always define your own static with a type of `&Lint` but this is +(as of January 2021) linted against in the compiler tree. + #### Guidelines for creating a future incompatibility lint - Create a lint defaulting to warn as normal, with ideally the same error @@ -280,6 +608,21 @@ If you need a combination of options that's not supported by the - Later, change lint to error. - Eventually, remove lint. +### Renaming or removing a lint + +A lint can be renamed or removed, which will trigger a warning if a user tries +to use the old lint name. To declare a rename/remove, add a line with +[`store.register_renamed`] or [`store.register_removed`] to the code of the +[`register_builtins`] function. + +```rust,ignore +store.register_renamed("single_use_lifetime", "single_use_lifetimes"); +``` + +[`store.register_renamed`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/struct.LintStore.html#method.register_renamed +[`store.register_removed`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/struct.LintStore.html#method.register_removed +[`register_builtins`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lint/fn.register_builtins.html + ### Lint Groups Lints can be turned on in groups. These groups are declared in the @@ -322,12 +665,12 @@ like normal but invokes the lint with `buffer_lint`. #### Linting even earlier in the compiler -The parser (`librustc_ast`) is interesting in that it cannot have dependencies on -any of the other `librustc*` crates. In particular, it cannot depend on -`librustc_middle::lint` or `librustc_lint`, where all of the compiler linting +The parser (`rustc_ast`) is interesting in that it cannot have dependencies on +any of the other `rustc*` crates. In particular, it cannot depend on +`rustc_middle::lint` or `rustc_lint`, where all of the compiler linting infrastructure is defined. That's troublesome! -To solve this, `librustc_ast` defines its own buffered lint type, which +To solve this, `rustc_ast` defines its own buffered lint type, which `ParseSess::buffer_lint` uses. After macro expansion, these buffered lints are then dumped into the `Session::buffered_lints` used by the rest of the compiler. @@ -358,8 +701,8 @@ the structured JSON and see the "human" output (well, _sans_ colors) without having to compile everything twice. The "human" readable and the json format emitter can be found under -librustc_errors, both were moved from the `librustc_ast` crate to the -[librustc_errors crate](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/index.html). +`rustc_errors`, both were moved from the `rustc_ast` crate to the +[rustc_errors crate](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/index.html). The JSON emitter defines [its own `Diagnostic` struct](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_errors/json/struct.Diagnostic.html) diff --git a/src/doc/rustc-dev-guide/src/diagnostics/diagnostic-codes.md b/src/doc/rustc-dev-guide/src/diagnostics/diagnostic-codes.md index 0e923c5e1b..092c8a2f8d 100644 --- a/src/doc/rustc-dev-guide/src/diagnostics/diagnostic-codes.md +++ b/src/doc/rustc-dev-guide/src/diagnostics/diagnostic-codes.md @@ -1,5 +1,5 @@ # Diagnostic Codes -We generally try assign each error message a unique code like `E0123`. These +We generally try to 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 @@ -7,12 +7,13 @@ 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: +Error codes are stored in `compiler/rustc_error_codes`. + +To create a new error, you first need to find the next available +code. You can find it with `tidy`: ``` -./x.py test --stage 0 tidy +./x.py test tidy ``` This will invoke the tidy script, which generally checks that your code obeys @@ -31,17 +32,16 @@ tidy check (x86_64-apple-darwin) 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: +Ideally, you will write an extended description for your error, +which will go in `rustc_error_codes/src/error_codes/E0592.md`. +To register the error, open `rustc_error_codes/src/error_codes.rs` and add the +code (in its proper numerical order) into` register_diagnostics!` macro, like +this: ```rust -register_long_diagnostics! { +register_diagnostics! { ... - E0592: r##" -Your extended error text goes here! -"##, + E0592: include_str!("./error_codes/E0592.md"), } ``` @@ -73,3 +73,7 @@ struct_span_err!(...) .span_note(another_span, "some separate note, probably avoid these") .emit_() ``` + +For an example of a PR adding an error code, see [#76143]. + +[#76143]: https://github.com/rust-lang/rust/pull/76143 diff --git a/src/doc/rustc-dev-guide/src/diagnostics/lintstore.md b/src/doc/rustc-dev-guide/src/diagnostics/lintstore.md index b0ae9a3287..6a59cf2647 100644 --- a/src/doc/rustc-dev-guide/src/diagnostics/lintstore.md +++ b/src/doc/rustc-dev-guide/src/diagnostics/lintstore.md @@ -15,9 +15,12 @@ Unfortunately, a lot of the documentation we have refers to both of these as jus First, we have the lint declarations themselves: this is where the name and default lint level and other metadata come from. These are normally defined by way of the [`declare_lint!`] macro, which -boils down to a static with type `&rustc::lint::Lint`. We lint against direct declarations without -the use of the macro today (though this may change in the future, as the macro is somewhat unwieldy -to add new fields to, like all macros by example). +boils down to a static with type `&rustc_session::lint::Lint`. + +As of January 2021, we lint against direct declarations +without the use of the macro today (although this may change in the future, as +the macro is somewhat unwieldy to add new fields to, like all macros by +example). Lint declarations don't carry any "state" - they are merely global identifers and descriptions of lints. We assert at runtime that they are not registered twice (by lint name). @@ -55,9 +58,9 @@ internally. Note, these include both rustc-internal lints, and the traditional lints, like, for example the dead code lint. -These are primarily described in two places: `rustc::lint::builtin` and `rustc_lint::builtin`. The -first provides the definitions for the lints themselves, and the latter provides the lint pass -definitions (and implementations). +These are primarily described in two places: `rustc_session::lint::builtin` and +`rustc_lint::builtin`. The first provides the definitions for the lints themselves, +and the latter provides the lint pass definitions (and implementations). The internal lint registration happens in the [`rustc_lint::register_builtins`] function, along with the [`rustc_lint::register_internals`] function. More generally, the LintStore "constructor" @@ -92,7 +95,7 @@ understanding the code. However, with the current type-erased lint store approach, it is beneficial to do so for performance reasons. 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 +`late_lint_mod_passes` in `rustc_lint/src/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 diff --git a/src/doc/rustc-dev-guide/src/diagnostics/sessiondiagnostic.md b/src/doc/rustc-dev-guide/src/diagnostics/sessiondiagnostic.md new file mode 100644 index 0000000000..4583e6d3dc --- /dev/null +++ b/src/doc/rustc-dev-guide/src/diagnostics/sessiondiagnostic.md @@ -0,0 +1,97 @@ +# Creating Errors With SessionDiagnostic + +The SessionDiagnostic derive macro gives an alternate way to the DiagnosticBuilder API for defining +and emitting errors. It allows a struct to be annotated with information which allows it to be +transformed and emitted as a Diagnostic. + +As an example, we'll take a look at how the "field already declared" diagnostic is actually defined +in the compiler (see the definition +[here](https://github.com/rust-lang/rust/blob/75042566d1c90d912f22e4db43b6d3af98447986/compiler/rustc_typeck/src/errors.rs#L65-L74) +and usage +[here](https://github.com/rust-lang/rust/blob/75042566d1c90d912f22e4db43b6d3af98447986/compiler/rustc_typeck/src/collect.rs#L863-L867)): + +```rust,ignore +#[derive(SessionDiagnostic)] +#[error = "E0124"] +pub struct FieldAlreadyDeclared { + pub field_name: Ident, + #[message = "field `{field_name}` is already declared"] + #[label = "field already declared"] + pub span: Span, + #[label = "`{field_name}` first declared here"] + pub prev_span: Span, +} +// ... +tcx.sess.emit_err(FieldAlreadyDeclared { + field_name: f.ident, + span: f.span, + prev_span, +}); +``` + +We see that using `SessionDiagnostic` is relatively straight forward. The `#[error = "..."]` +attribute is used to supply the error code for the diagnostic. We then annotate fields in the +struct with various information on how to convert an instance of the struct into a rendered +diagnostic. The attributes above produce code which is roughly equivalent to the following (in +pseudo-Rust): + +```rust,ignore +impl SessionDiagnostic for FieldAlreadyDeclared { + fn into_diagnostic(self, sess: &'_ rustc_session::Session) -> DiagnosticBuilder<'_> { + let mut diag = sess.struct_err_with_code("", rustc_errors::DiagnosticId::Error("E0124")); + diag.set_span(self.span); + diag.set_primary_message(format!("field `{field_name}` is already declared", field_name = self.field_name)); + diag.span_label(self.span, "field already declared"); + diag.span_label(self.prev_span, format!("`{field_name}` first declared here", field_name = self.field_name)); + diag + } +} +``` + +The generated code draws attention to a number of features. First, we see that within the strings +passed to each attribute, field names can be referenced without needing to be passed +explicitly into the format string -- in this example here, `#[message = "field {field_name} is +already declared"]` produces a call to `format!` with the appropriate arguments to format +`self.field_name` into the string. This applies to strings passed to all attributes. + +We also see that labelling `Span` fields in the struct produces calls which pass that `Span` to the +produced diagnostic. In the example above, we see that putting the `#[message = "..."]` attribute +on a `Span` leads to the primary span of the diagnostic being set to that `Span`, while applying the +`#[label = "..."]` attribute on a Span will simply set the span for that label. +Each attribute has different requirements for what they can be applied on, differing on position +(on the struct, or on a specific field), type (if it's applied on a field), and whether or not the +attribute is optional. + +## Attributes Listing + +Below is a listing of all the currently-available attributes that `#[derive(SessionDiagnostic)]` +understands: + +Attribute | Applied to | Mandatory | Behaviour +:-------------- | :-------------------- |:--------- | :--------- +`#[code = "..."]` | Struct | Yes | Sets the Diagnostic's error code +`#[message = "..."]` | Struct / `Span` fields | Yes | Sets the Diagnostic's primary message. If on `Span` field, also sets the Diagnostic's span. +`#[label = "..."]` | `Span` fields | No | Equivalent to calling `span_label` with that Span and message. +`#[suggestion(message = "..." , code = "..."]` | `(Span, MachineApplicability)` or `Span` fields | No | Equivalent to calling `span_suggestion`. Note `code` is optional. +`#[suggestion_short(message = "..." , code = "..."]` | `(Span, MachineApplicability)` or `Span` fields | No | Equivalent to calling `span_suggestion_short`. Note `code` is optional. +`#[suggestion_hidden(message = "..." , code = "..."]` | `(Span, MachineApplicability)` or `Span` fields | No | Equivalent to calling `span_suggestion_hidden`. Note `code` is optional. +`#[suggestion_verbose(message = "..." , code = "..."]` | `(Span, MachineApplicability)` or `Span` fields | No | Equivalent to calling `span_suggestion_verbose`. Note `code` is optional. + + +## Optional Diagnostic Attributes + +There may be some cases where you want one of the decoration attributes to be applied optionally; +for example, if a suggestion can only be generated sometimes. In this case, simply wrap the field's +type in an `Option`. At runtime, if the field is set to `None`, the attribute for that field won't +be used in creating the diagnostic. For example: + +```rust,ignored +#[derive(SessionDiagnostic)] +#[code = "E0123"] +struct SomeKindOfError { + ... + #[suggestion(message = "informative error message")] + opt_sugg: Option<(Span, Applicability)> + ... +} +``` diff --git a/src/doc/rustc-dev-guide/src/early-late-bound.md b/src/doc/rustc-dev-guide/src/early-late-bound.md new file mode 100644 index 0000000000..4178a4af05 --- /dev/null +++ b/src/doc/rustc-dev-guide/src/early-late-bound.md @@ -0,0 +1,107 @@ +# Early and Late Bound Variables + +In Rust, item definitions (like `fn`) can often have generic parameters, which +are always [_universally_ quantified][quant]. That is, if you have a function +like + +```rust +fn foo(x: T) { } +``` + +this function is defined "for all T" (not "for some specific T", which would be +[_existentially_ quantified][quant]). + +[quant]: ./appendix/background.md#quantified + +While Rust *items* can be quantified over types, lifetimes, and constants, the +types of values in Rust are only ever quantified over lifetimes. So you can +have a type like `for<'a> fn(&'a u32)`, which represents a function pointer +that takes a reference with any lifetime, or `for<'a> dyn Trait<'a>`, which is +a `dyn` trait for a trait implemented for any lifetime; but we have no type +like `for fn(T)`, which would be a function that takes a value of *any type* +as a parameter. This is a consequence of monomorphization -- to support a value +of type `for fn(T)`, we would need a single function pointer that can be +used for a parameter of any type, but in Rust we generate customized code for +each parameter type. + +One consequence of this asymmetry is a weird split in how we represesent some +generic types: _early-_ and _late-_ bound parameters. +Basically, if we cannot represent a type (e.g. a universally quantified type), +we have to bind it _early_ so that the unrepresentable type is never around. + +Consider the following example: + +```rust,ignore +fn foo<'a, 'b, T>(x: &'a u32, y: &'b T) where T: 'b { ... } +``` + +We cannot treat `'a`, `'b`, and `T` in the same way. Types in Rust can't have +`for { .. }`, only `for<'a> {...}`, so whenever you reference `foo` the type +you get back can't be `for<'a, 'b, T> fn(&'a u32, y: &'b T)`. Instead, the `T` +must be substituted early. In particular, you have: + +```rust,ignore +let x = foo; // T, 'b have to be substituted here +x(...); // 'a substituted here, at the point of call +x(...); // 'a substituted here with a different value +``` + +## Early-bound parameters + +Early-bound parameters in rustc are identified by an index, stored in the +[`ParamTy`] struct for types or the [`EarlyBoundRegion`] struct for lifetimes. +The index counts from the outermost declaration in scope. This means that as you +add more binders inside, the index doesn't change. + +For example, + +```rust,ignore +trait Foo { + type Bar = (Self, T, U); +} +``` + +Here, the type `(Self, T, U)` would be `($0, $1, $2)`, where `$N` means a +[`ParamTy`] with the index of `N`. + +In rustc, the [`Generics`] structure carries this information. So the +[`Generics`] for `Bar` above would be just like for `U` and would indicate the +'parent' generics of `Foo`, which declares `Self` and `T`. You can read more +in [this chapter](./generics.md). + +[`ParamTy`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.ParamTy.html +[`EarlyBoundRegion`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.EarlyBoundRegion.html +[`Generics`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.Generics.html + +## Late-bound parameters + +Late-bound parameters in `rustc` are handled quite differently (they are also +specialized to lifetimes since, right now, only late-bound lifetimes are +supported, though with GATs that has to change). We indicate their potential +presence by a [`Binder`] type. The [`Binder`] doesn't know how many variables +there are at that binding level. This can only be determined by walking the +type itself and collecting them. So a type like `for<'a, 'b> ('a, 'b)` would be +`for (^0.a, ^0.b)`. Here, we just write `for` because we don't know the names +of the things bound within. + +Moreover, a reference to a late-bound lifetime is written `^0.a`: + +- The `0` is the index; it identifies that this lifetime is bound in the + innermost binder (the `for`). +- The `a` is the "name"; late-bound lifetimes in rustc are identified by a + "name" -- the [`BoundRegionKind`] enum. This enum can contain a + [`DefId`][defid] or it might have various "anonymous" numbered names. The + latter arise from types like `fn(&u32, &u32)`, which are equivalent to + something like `for<'a, 'b> fn(&'a u32, &'b u32)`, but the names of those + lifetimes must be generated. + +This setup of not knowing the full set of variables at a binding level has some +advantages and some disadvantages. The disadvantage is that you must walk the +type to find out what is bound at the given level and so forth. The advantage +is primarily that, when constructing types from Rust syntax, if we encounter +anonymous regions like in `fn(&u32)`, we just create a fresh index and don't have +to update the binder. + +[`Binder`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.Binder.html +[`BoundRegionKind`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/enum.BoundRegionKind.html +[defid]: ./hir.html#identifiers-in-the-hir diff --git a/src/doc/rustc-dev-guide/src/feature-gates.md b/src/doc/rustc-dev-guide/src/feature-gates.md new file mode 100644 index 0000000000..db6c72ff81 --- /dev/null +++ b/src/doc/rustc-dev-guide/src/feature-gates.md @@ -0,0 +1,102 @@ +# Feature Gates + +This chapter is intended to provide basic help for adding, removing, and +modifying feature gates. + + +## Adding a feature gate + +See ["Stability in code"] for help with adding a new feature; this section just +covers how to add the feature gate *declaration*. + +Add a feature gate declaration to `rustc_feature/src/active.rs` in the active +`declare_features` block: + +```rust,ignore +/// description of feature +(active, $feature_name, "$current_nightly_version", Some($tracking_issue_number), $edition) +``` + +where `$edition` has the type `Option`, and is typically +just `None`. + +For example: + +```rust,ignore +/// Allows defining identifiers beyond ASCII. +(active, non_ascii_idents, "1.0.0", Some(55467), None), +``` + +When added, the current version should be the one for the current nightly. +Once the feature is moved to `accepted.rs`, the version is changed to that +nightly version. + + +## Removing a feature gate + +[removing]: #removing-a-feature-gate + +To remove a feature gate, follow these steps: + +1. Remove the feature gate declaration in `rustc_feature/src/active.rs`. + It will look like this: + + ```rust,ignore + /// description of feature + (active, $feature_name, "$version", Some($tracking_issue_number), $edition) + ``` + +2. Add a modified version of the feature gate declaration that you just + removed to `rustc_feature/src/removed.rs`: + + ```rust,ignore + /// description of feature + (removed, $old_feature_name, "$version", Some($tracking_issue_number), $edition, + Some("$why_it_was_removed")) + ``` + + +## Renaming a feature gate + +[renaming]: #renaming-a-feature-gate + +To rename a feature gate, follow these steps (the first two are the same steps +to follow when [removing a feature gate][removing]): + +1. Remove the old feature gate declaration in `rustc_feature/src/active.rs`. + It will look like this: + + ```rust,ignore + /// description of feature + (active, $old_feature_name, "$version", Some($tracking_issue_number), $edition) + ``` + +2. Add a modified version of the old feature gate declaration that you just + removed to `rustc_feature/src/removed.rs`: + + ```rust,ignore + /// description of feature + /// Renamed to `$new_feature_name` + (removed, $old_feature_name, "$version", Some($tracking_issue_number), $edition, + Some("renamed to `$new_feature_name`")) + ``` + +3. Add a feature gate declaration with the new name to + `rustc_feature/src/active.rs`. It should look very similar to the old + declaration: + + ```rust,ignore + /// description of feature + (active, $new_feature_name, "$version", Some($tracking_issue_number), $edition) + ``` + + +## Stabilizing a feature + +See ["Updating the feature-gate listing"] in the "Stabilizing Features" chapter +for instructions. There are additional steps you will need to take beyond just +updating the declaration! + + +["Stability in code"]: ./implementing_new_features.md#stability-in-code +["Updating the feature-gate listing"]: ./stabilization_guide.md#updating-the-feature-gate-listing diff --git a/src/doc/rustc-dev-guide/src/getting-started.md b/src/doc/rustc-dev-guide/src/getting-started.md new file mode 100644 index 0000000000..18e429e5ea --- /dev/null +++ b/src/doc/rustc-dev-guide/src/getting-started.md @@ -0,0 +1,546 @@ +# Getting Started + + + +This documentation is _not_ intended to be comprehensive; it is meant to be a +quick guide for the most useful things. For more information, [see this +chapter on how to build and run the compiler](./building/how-to-build-and-run.md). + +## Asking Questions + +The compiler team (or `t-compiler`) usually hangs out in Zulip [in this +"stream"][z]; it will be easiest to get questions answered there. + +[z]: https://rust-lang.zulipchat.com/#narrow/stream/131828-t-compiler + +**Please ask questions!** A lot of people report feeling that they are "wasting +expert time", but nobody on `t-compiler` feels this way. Contributors are +important to us. + +Also, if you feel comfortable, prefer public topics, as this means others can +see the questions and answers, and perhaps even integrate them back into this +guide :) + +### Experts + +Not all `t-compiler` members are experts on all parts of `rustc`; it's a pretty +large project. To find out who has expertise on different parts of the +compiler, [consult this "experts map"][map]. + +It's not perfectly complete, though, so please also feel free to ask questions +even if you can't figure out who to ping. + +[map]: https://github.com/rust-lang/compiler-team/blob/master/content/experts/map.toml + +### Etiquette + +We do ask that you be mindful to include as much useful information as you can +in your question, but we recognize this can be hard if you are unfamiliar with +contributing to Rust. + +Just pinging someone without providing any context can be a bit annoying and +just create noise, so we ask that you be mindful of the fact that the +`t-compiler` folks get a lot of pings in a day. + +## Cloning and Building + +The main repository is [`rust-lang/rust`][repo]. This contains the compiler, +the standard library (including `core`, `alloc`, `test`, `proc_macro`, etc), +and a bunch of tools (e.g. `rustdoc`, the bootstrapping infrastructure, etc). + +[repo]: https://github.com/rust-lang/rust + +There are also a bunch of submodules for things like LLVM, `clippy`, `miri`, +etc. You don't need to clone these immediately, but the build tool will +automatically clone and sync them (more on this later). + +[**Take a look at the "Suggested Workflows" chapter for some helpful +advice.**][suggested] + +[suggested]: ./building/suggested.md + +### System Requirements + +[**See this chapter for detailed software requirements.**](./building/prerequisites.md) +Most notably, you will need Python 2 or 3 to run `x.py`. + +There are no hard hardware requirements, but building the compiler is +computationally expensive, so a beefier machine will help, and I wouldn't +recommend trying to build on a Raspberry Pi :P + +- Recommended >=30GB of free disk space; otherwise, you will have to keep + clearing incremental caches. More space is better, the compiler is a bit of a + hog; it's a problem we are aware of. +- Recommended >=8GB RAM. +- Recommended >=2 cores; having more cores really helps. +- You will need an internet connection to build; the bootstrapping process + involves updating git submodules and downloading a beta compiler. It doesn't + need to be super fast, but that can help. + +Building the compiler takes more than half an hour on my moderately powerful +laptop. The first time you build the compiler, LLVM will also be built unless +you use CI-built LLVM ([see below][configsec]). + +[configsec]: #configuring-the-compiler + +Like `cargo`, the build system will use as many cores as possible. Sometimes +this can cause you to run low on memory. You can use `-j` to adjust the number +concurrent jobs. If a full build takes more than ~45 minutes to an hour, +you are probably spending most of the time swapping memory in and out; +try using `-j1`. + +On a slow machine, the build times for rustc are very painful. Consider using +`./x.py check` instead of a full build and letting the automated tests run +when you push to GitHub. + +If you don't have too much free disk space, you may want to turn off +incremental compilation ([see below][configsec]). This will make +compilation take longer (especially after a rebase), +but will save a ton of space from the incremental caches. + +### Cloning + +You can just do a normal git clone: + +```sh +git clone https://github.com/rust-lang/rust.git +``` + +You don't need to clone the submodules at this time. But if you want to, you +can do the following: + +```sh +# first time +git submodule update --init --recursive + +# subsequent times (to pull new commits) +git submodule update +``` + +### Configuring the Compiler + +The compiler has a configuration file which contains a ton of settings. We will +provide some recommendations here that should work for most, but [check out +this chapter for more info][config]. + +[config]: ./building/how-to-build-and-run.md#create-a-configtoml + +In the top level of the repo: + +```sh +$ x.py setup +``` + +This will walk you through an interactive setup for x.py that looks like this: + +``` +$ x.py setup +Welcome to the Rust project! What do you want to do with x.py? +a) Contribute to the standard library +b) Contribute to the compiler +c) Contribute to the compiler, and also modify LLVM or codegen +d) Install Rust from source +Please choose one (a/b/c/d): a +`x.py` will now use the configuration at /home/joshua/rustc2/src/bootstrap/defaults/config.toml.library +To get started, try one of the following commands: +- `x.py check` +- `x.py build` +- `x.py test library/std` +- `x.py doc` +For more suggestions, see https://rustc-dev-guide.rust-lang.org/building/suggested.html +``` + +Note that by default, `x.py setup` will use CI-built LLVM if available for your +platform so that you don't need to build LLVM in addition to building the +compiler. In some circumstances, such as when updating the version of LLVM used +by `rustc`, you may want to temporarily disable this feature. See the ["Updating +LLVM" section] for more. + +If you want to download LLVM from CI without running `x.py setup`, you can set +the `download-ci-llvm` option to `true` in your `config.toml`: + +```toml +[llvm] +download-ci-llvm = true +``` + +["Updating LLVM" section]: https://rustc-dev-guide.rust-lang.org/backend/updating-llvm.html?highlight=download-ci-llvm#feature-updates + +### x.py Intro + +`rustc` is a _bootstrapping_ compiler, which means that it is written in Rust +and thus needs to be compiled by itself. So where do you +get the original compiler from? We use the current beta compiler +to build a new compiler. Then, we use that compiler to build itself. Thus, +`rustc` has a 2-stage build. You can read more about bootstrapping +[here][boot], but you don't need to know much more to contribute. + +[boot]: ./building/bootstrapping.md + +We have a special tool `./x.py` that drives this process. It is used for +building the compiler, the standard libraries, and `rustdoc`. It is also used +for driving CI and building the final release artifacts. + +Unfortunately, a proper 2-stage build takes a long time depending on your +hardware, but it is the only correct way to build everything (e.g. it's what +the CI and release processes use). **However, in most cases, you can get by +without a full 2-stage build**. In the following section, we give instructions +for how to do "the correct thing", but then we also give various tips to speed +things up. + +### Building and Testing `rustc` + +Here is a summary of the different commands for reference, but you probably +should still read the rest of the section: + +| Command | When to use it | +| --- | --- | +| `x.py check` | Quick check to see if things compile; [rust-analyzer can run this automatically for you][rust-analyzer] | +| `x.py build --stage 0 [library/std]` | Build only the standard library, without building the compiler | +| `x.py build library/std` | Build just the 1st stage of the compiler, along with the standard library; this is faster than building stage 2 and usually good enough | +| `x.py build --keep-stage 1 library/std` | Build the 1st stage of the compiler and skips rebuilding the standard library; this is useful after you've done an ordinary stage1 build to skip compilation time, but it can cause weird problems. (Just do a regular build to resolve.) | +| `x.py test [--keep-stage 1]` | Run the test suite using the stage1 compiler | +| `x.py test --bless [--keep-stage 1]` | Run the test suite using the stage1 compiler _and_ update expected test output. | +| `x.py build --stage 2 compiler/rustc` | Do a full 2-stage build. You almost never want to do this. | +| `x.py test --stage 2` | Do a full 2-stage build and run all tests. You almost never want to do this. | + +To do a full 2-stage build of the whole compiler, you should run this (after +updating `config.toml` as mentioned above): + +```sh +./x.py build --stage 2 compiler/rustc +``` + +In the process, this will also necessarily build the standard libraries, and it +will build `rustdoc` (which doesn't take too long). + +To build and test everything: + +```sh +./x.py test +``` + +For most contributions, you only need to build stage 1, which saves a lot of time: + +```sh +# Build the compiler (stage 1) +./x.py build library/std + +# Subsequent builds +./x.py build --keep-stage 1 library/std +``` + +This will take a while, especially the first time. Be wary of accidentally +touching or formatting the compiler, as `./x.py` will try to recompile it. + +**NOTE**: The `--keep-stage 1` will _assume_ that the stage 0 standard library +does not need to be rebuilt, which is usually true, which will save some time. +However, if you are changing certain parts of the compiler, this may lead to +weird errors. Feel free to ask on [zulip][z] if you are running into issues. + +This runs a ton of tests and takes a long time to complete. If you are +working on `rustc`, you can usually get by with only the [UI tests][uitests]. These +test are mostly for the frontend of the compiler, so if you are working on LLVM +or codegen, this shortcut will _not_ test your changes. You can read more about the +different test suites [in this chapter][testing]. + +[rust-analyzer]: ./building/suggested.html#configuring-rust-analyzer-for-rustc +[uitests]: ./tests/adding.html#ui +[testing]: https://rustc-dev-guide.rust-lang.org/tests/intro.html + +```sh +# First build +./x.py test src/test/ui + +# Subsequent builds +./x.py test src/test/ui --keep-stage 1 +``` + +If your changes impact test output, you can use `--bless` to automatically +update the `.stderr` files of the affected tests: + +```sh +./x.py test src/test/ui --keep-stage 1 --bless +``` + +While working on the compiler, it can be helpful to see if the code just +compiles (similar to `cargo check`) without actually building it. You can do +this with: + +```sh +./x.py check +``` + +This command is really fast (relative to the other commands). It usually +completes in a couple of minutes on my laptop. **A common workflow when working +on the compiler is to make changes and repeatedly check with `./x.py check`. +Then, run the tests as shown above when you think things should work.** + +Finally, the CI ensures that the codebase is using consistent style. To format +the code: + +```sh +# Actually format +./x.py fmt + +# Just check formatting, exit with error +./x.py fmt --check +``` + +*Note*: we don't use stable `rustfmt`; we use a pinned version with a special +config, so this may result in different style from normal `rustfmt` if you have +format-on-save turned on. It's a good habit to run `./x.py fmt` before every +commit, as this reduces conflicts later. The pinned version is built under +`build//stage0/bin/rustfmt`, so if you want, you can use it for a +single file or for format-on-save in your editor, which can be faster than `./x.py fmt`. + +One last thing: you can use `RUSTC_LOG=XXX` to get debug logging. [Read more +here][logging]. Notice the `C` in `RUSTC_LOG`. Other than that, it uses normal +[`env_logger`][envlog] syntax. + +[envlog]: https://crates.io/crates/env_logger +[logging]: ./compiler-debugging.html#getting-logging-output + +### Building and Testing `std`/`core`/`alloc`/`test`/`proc_macro`/etc. + +As before, technically the proper way to build one of these libraries is to use +the stage-2 compiler, which of course requires a 2-stage build, described above +(`./x.py build`). + +In practice, though, you don't need to build the compiler unless you are +planning to use a recently added nightly feature. Instead, you can just build +stage 0, which uses the current beta compiler. + +```sh +./x.py build --stage 0 +``` + +```sh +./x.py test --stage 0 library/std +``` + +(The same works for `library/alloc`, `library/core`, etc.) + +### Building and Testing `rustdoc` + +`rustdoc` uses `rustc` internals (and, of course, the standard library), so you +will have to build the compiler and `std` once before you can build `rustdoc`. +As before, you can use `./x.py build` to do this. The first time you build, +the stage-1 compiler will also be built. + +```sh +# First build +./x.py build + +# Subsequent builds +./x.py build --keep-stage 1 +``` + +As with the compiler, you can do a fast check build: + +```sh +./x.py check +``` + +Rustdoc has two types of tests: content tests and UI tests. + +```sh +# Content tests +./x.py test src/test/rustdoc + +# UI tests +./x.py test src/test/rustdoc-ui + +# Both at once +./x.py test src/test/rustdoc src/test/rustdoc-ui +``` + +### Contributing code to other Rust projects + +There are a bunch of other projects that you can contribute to outside of the +`rust-lang/rust` repo, including `clippy`, `miri`, `chalk`, and many others. + +These repos might have their own contributing guidelines and procedures. Many +of them are owned by working groups (e.g. `chalk` is largely owned by +WG-traits). For more info, see the documentation in those repos' READMEs. + +### Other ways to contribute + +There are a bunch of other ways you can contribute, especially if you don't +feel comfortable jumping straight into the large `rust-lang/rust` codebase. + +The following tasks are doable without much background knowledge but are +incredibly helpful: + +- [Cleanup crew][iceb]: find minimal reproductions of ICEs, bisect + regressions, etc. This is a way of helping that saves a ton of time for + others to fix an error later. +- [Writing documentation][wd]: if you are feeling a bit more intrepid, you could try + to read a part of the code and write doc comments for it. This will help you + to learn some part of the compiler while also producing a useful artifact! +- [Working groups][wg]: there are a bunch of working groups on a wide variety + of rust-related things. + +[iceb]: ./notification-groups/cleanup-crew.md +[wd]: ./contributing.md#writing-documentation +[wg]: https://rust-lang.github.io/compiler-team/working-groups/ + + +## Contributor Procedures + +There are some official procedures to know about. This is a tour of the +highlights, but there are a lot more details, which we will link to below. + +### Code Review + +When you open a PR on the `rust-lang/rust` repo, a bot called `@rust-highfive` will +automatically assign a reviewer to the PR. The reviewer is the person that will +approve the PR to be tested and merged. If you want a specific reviewer (e.g. a +team member you've been working with), you can specifically request them by +writing `r? @user` (e.g. `r? @eddyb`) in either the original post or a followup +comment (you can see [this comment][r?] for example). + +Please note that the reviewers are humans, who for the most part work on `rustc` +in their free time. This means that they can take some time to respond and review +your PR. It also means that reviewers can miss some PRs that are assigned to them. + +To try to move PRs forward, the Triage WG regularly goes through all PRs that +are waiting for review and haven't been discussed for at least 2 weeks. If you +don't get a review within 2 weeks, feel free to ask the Triage WG on +Zulip ([#t-release/triage]). They have knowledge of when to ping, who might be +on vacation, etc. + +The reviewer may request some changes using the GitHub code review interface. +They may also request special procedures (such as a [crater] run; [see +below][break]) for some PRs. + +[r?]: https://github.com/rust-lang/rust/pull/78133#issuecomment-712692371 +[#t-release/triage]: https://rust-lang.zulipchat.com/#narrow/stream/242269-t-release.2Ftriage +[break]: #breaking-changes + +When the PR is ready to be merged, the reviewer will issue a command to +`@bors`, the CI bot. Usually, this is `@bors r+` or `@bors r=user` to approve +a PR (there are few other commands, but they are less relevant here). +You can see [this comment][r+] for example. This puts the PR in [bors's queue][bors] +to be tested and merged. Be patient; this can take a while and the queue can +sometimes be long. PRs are never merged by hand. + +[r+]: https://github.com/rust-lang/rust/pull/78133#issuecomment-712726339 +[bors]: https://bors.rust-lang.org/queue/rust + +### Bug Fixes or "Normal" code changes + +For most PRs, no special procedures are needed. You can just open a PR, and it +will be reviewed, approved, and merged. This includes most bug fixes, +refactorings, and other user-invisible changes. The next few sections talk +about exceptions to this rule. + +Also, note that it is perfectly acceptable to open WIP PRs or GitHub [Draft +PRs][draft]. Some people prefer to do this so they can get feedback along the +way or share their code with a collaborator. Others do this so they can utilize +the CI to build and test their PR (e.g. if you are developing on a laptop). + +[draft]: https://github.blog/2019-02-14-introducing-draft-pull-requests/ + +### New Features + +Rust has strong backwards-compatibility guarantees. Thus, new features can't +just be implemented directly in stable Rust. Instead, we have 3 release +channels: stable, beta, and nightly. + +- **Stable**: this is the latest stable release for general usage. +- **Beta**: this is the next release (will be stable within 6 weeks). +- **Nightly**: follows the `master` branch of the repo. This is the only + channel where unstable, incomplete, or experimental features are usable with + feature gates. + +In order to implement a new feature, usually you will need to go through [the +RFC process][rfc] to propose a design, have discussions, etc. In some cases, +small features can be added with only an FCP ([see below][break]). If in doubt, ask the +compiler, language, or libs team (whichever is most relevant). + +[rfc]: https://github.com/rust-lang/rfcs/blob/master/README.md + +After a feature is approved to be added, a tracking issue is created on the +`rust-lang/rust` repo, which tracks the progress towards the implementation of +the feature, any bugs reported, and eventually stabilization. + +The feature then needs to be implemented behind a feature gate, which prevents +it from being accidentally used. + +Finally, somebody may propose stabilizing the feature in an upcoming version of +Rust. This requires a Final Comment Period ([see below][break]) to get the +approval of the relevant teams. + +After that, the feature gate can be removed and the feature turned on for all users. + +For more details on this process, see [this chapter on implementing new +features.](./implementing_new_features.md) + +### Breaking Changes + +As mentioned above, Rust has strong backwards-compatibility guarantees. To this +end, we are reluctant to make breaking changes. However, sometimes they are +needed to correct compiler bugs (e.g. code that compiled but should not) or +make progress on some features. + +Depending on the scale of the breakage, there are a few different actions that +can be taken. If the reviewer believes the breakage is very minimal (i.e. very +unlikely to be actually encountered by users), they may just merge the change. +More often, they will request a Final Comment Period (FCP), which calls for +rough consensus among the members of a relevant team. The team members can +discuss the issue and either accept, reject, or request changes on the PR. + +If the scale of breakage is large, a deprecation warning may be needed. This is +a warning that the compiler will display to users whose code will break in the +future. After some time, an FCP can be used to move forward with the actual +breakage. + +If the scale of breakage is unknown, a team member or contributor may request a +[crater] run. This is a bot that will compile all crates.io crates and many +public github repos with the compiler with your changes. A report will then be +generated with crates that ceased to compile with or began to compile with your +changes. Crater runs can take a few days to complete. + +[crater]: https://github.com/rust-lang/crater + +### Major Changes + +The compiler team has a special process for large changes, whether or not they +cause breakage. This process is called a Major Change Proposal (MCP). MCP is a +relatively lightweight mechanism for getting feedback on large changes to the +compiler (as opposed to a full RFC or a design meeting with the team). + +Example of things that might require MCPs include major refactorings, changes +to important types, or important changes to how the compiler does something, or +smaller user-facing changes. + +**When in doubt, ask on [zulip][z]. It would be a shame to put a lot of work +into a PR that ends up not getting merged!** [See this document][mcpinfo] for +more info on MCPs. + +[mcpinfo]: https://forge.rust-lang.org/compiler/mcp.html + +### Performance + +Compiler performance is important. We have put a lot of effort over the last +few years into [gradually improving it][perfdash]. + +[perfdash]: https://perf.rust-lang.org/dashboard.html + +If you suspect that your change may cause a performance regression (or +improvement), you can request a "perf run" (your reviewer may also request one +before approving). This is yet another bot that will compile a collection of +benchmarks on a compiler with your changes. The numbers are reported +[here][perf], and you can see a comparison of your changes against the latest +master. + +[perf]: https://perf.rust-lang.org + +## Other Resources + +- This guide: talks about how `rustc` works +- [The t-compiler zulip][z] +- [The compiler's documentation (rustdocs)](https://doc.rust-lang.org/nightly/nightly-rustc/) +- [The Forge](https://forge.rust-lang.org/) has more documentation about various procedures. +- `#contribute` and `#rustdoc` on [Discord](https://discord.gg/rust-lang). diff --git a/src/doc/rustc-dev-guide/src/git.md b/src/doc/rustc-dev-guide/src/git.md new file mode 100644 index 0000000000..e533426cfc --- /dev/null +++ b/src/doc/rustc-dev-guide/src/git.md @@ -0,0 +1,330 @@ +# Using Git + + + +The Rust project uses [Git] to manage its source code. In order to +contribute, you'll need some familiarity with its features so that your changes +can be incorporated into the compiler. + +[Git]: https://git-scm.com + +The goal of this page is to cover some of the more common questions and +problems new contributors face. Although some Git basics will be covered here, +if you find that this is still a little too fast for you, it might make sense +to first read some introductions to Git, such as the Beginner and Getting +started sections of [this tutorial from Atlassian][atlassian-git]. GitHub also +provides [documentation] and [guides] for beginners, or you can consult the +more in depth [book from Git]. + +[book from Git]: https://git-scm.com/book/en/v2/ +[atlassian-git]: https://www.atlassian.com/git/tutorials/what-is-version-control +[documentation]: https://docs.github.com/en/github/getting-started-with-github/set-up-git +[guides]: https://guides.github.com/introduction/git-handbook/ + +## Prerequisites + +We'll assume that you've installed Git, forked [rust-lang/rust], and cloned the +forked repo to your PC. We'll use the command line interface to interact +with Git; there are also a number of GUIs and IDE integrations that can +generally do the same things. + +[rust-lang/rust]: https://github.com/rust-lang/rust + +If you've cloned your fork, then you will be able to reference it with `origin` +in your local repo. It may be helpful to also set up a remote for the official +rust-lang/rust repo via + +```sh +git remote add upstream https://github.com/rust-lang/rust.git +``` + +if you're using HTTPS, or + +```sh +git remote add upstream git@github.com:rust-lang/rust.git +``` + +if you're using SSH. + +## Standard Process + +Below is the normal procedure that you're likely to use for most minor changes +and PRs: + + 1. Ensure that you're making your changes on top of master: + `git checkout master`. + 2. Get the latest changes from the Rust repo: `git pull upstream master`. + 3. Make a new branch for your change: `git checkout -b issue-12345-fix`. + 4. Make some changes to the repo and test them. + 5. Stage your changes via `git add src/changed/file.rs src/another/change.rs` + and then commit them with `git commit`. Of course, making intermediate commits + may be a good idea as well. Avoid `git add .`, as it makes it too easy to + unintentionally commit changes that should not be committed, such as submodule + updates. You can use `git status` to check if there are any files you forgot + to stage. + 6. Push your changes to your fork: `git push --set-upstream origin issue-12345-fix`. + 7. [Open a PR][ghpullrequest] from your fork to rust-lang/rust's master branch. + +[ghpullrequest]: https://guides.github.com/activities/forking/#making-a-pull-request + +If your reviewer requests changes, the procedure for those changes looks much +the same, with some steps skipped: + + 1. Ensure that you're making changes to the most recent version of your code: + `git checkout issue-12345-fix`. + 2. Make, stage, and commit your additional changes just like before. + 3. Push those changes to your fork: `git push`. + +## Troubleshooting git issues + +You don't need to clone `rust-lang/rust` from scratch if it's out of date! +Even if you think you've messed it up beyond repair, there are ways to fix +the git state that don't require downloading the whole repository again. +Here are some common issues you might run into: + +### I deleted my fork on GitHub! + +This is not a problem from git's perspective. If you run `git remote -v`, +it will say something like this: + +``` +$ git remote -v +origin https://github.com//rust-lang/rust (fetch) +origin https://github.com//rust-lang/rust (push) +personal https://github.com/jyn514/rust (fetch) +personal https://github.com/jyn514/rust (push) +``` + +If you renamed your fork, you can change the URL like this: + +```console +git remote set-url personal +``` + +where the `` is your new fork. + +### I see 'Untracked Files: src/stdarch'? + +This is left over from the move to the `library/` directory. +Unfortunately, `git rebase` does not follow renames for submodules, so you +have to delete the directory yourself: + +```console +rm -r src/stdarch +``` + +### I see `<<< HEAD`? + +You were probably in the middle of a rebase or merge conflict. See +[Conflicts](#conflicts) for how to fix the conflict. If you don't care about the changes +and just want to get a clean copy of the repository back, you can use `git reset`: + +```console +# WARNING: this throws out any local changes you've made! Consider resolving the conflicts instead. +git reset --hard master +``` + +### Quick note about submodules + +When updating your local repository with `git pull`, you may notice that sometimes +Git says you have modified some files that you have never edited. For example, +running `git status` gives you something like (note the `new commits` mention): + +``` +On branch master +Your branch is up to date with 'origin/master'. + +Changes not staged for commit: + (use "git add ..." to update what will be committed) + (use "git restore ..." to discard changes in working directory) + modified: src/tools/cargo (new commits) + modified: src/tools/rls (new commits) + modified: src/tools/rustfmt (new commits) + +no changes added to commit (use "git add" and/or "git commit -a") +``` + +These changes are not changes to files: they are changes to submodules (more on +this [later](#git-submodules)). To get rid of those, run `git submodule update` +(or run any `x.py` command, which will automatically update the submodules). +Note that there is (as of January 2021) a bug if you use +worktrees, submodules, and x.py in a commit hook. If you run into an error +like: + +``` +error: failed to read `/home/joshua/rustc-worktree/src/tools/miri/cargo-miri/Cargo.toml` + +Caused by: + No such file or directory (os error 2) +``` +it's not anything you did wrong. There is a workaround at [#77620]. + +[#77620]: https://github.com/rust-lang/rust/issues/77620#issuecomment-705228229 + +## Conflicts + +When you edit your code locally, you are making changes to the version of +rust-lang/rust that existed when you created your feature branch. As such, when +you submit your PR it is possible that some of the changes that have been made +to rust-lang/rust since then are in conflict with the changes you've made. + +When this happens, you need to resolve the conflicts before your changes can be +merged. First, get a local copy of the conflicting changes: Checkout your local +master branch with `git checkout master`, then `git pull upstream master` to +update it with the most recent changes. + +### Rebasing + +You're now ready to start the rebasing process. Checkout the branch with your +changes and execute `git rebase master`. + +When you rebase a branch on master, all the changes on your branch are +reapplied to the most recent version of master. In other words, Git tries to +pretend that the changes you made to the old version of master were instead +made to the new version of master. During this process, you should expect to +encounter at least one "rebase conflict." This happens when Git's attempt to +reapply the changes fails because your changes conflicted with other changes +that have been made. You can tell that this happened because you'll see +lines in the output that look like + +``` +CONFLICT (content): Merge conflict in file.rs +``` + +When you open these files, you'll see sections of the form + +``` +<<<<<<< HEAD +Original code +======= +Your code +>>>>>>> 8fbf656... Commit fixes 12345 +``` + +This represents the lines in the file that Git could not figure out how to +rebase. The section between `<<<<<<< HEAD` and `=======` has the code from +master, while the other side has your version of the code. You'll need to +decide how to deal with the conflict. You may want to keep your changes, +keep the changes on master, or combine the two. + +Generally, resolving the conflict consists of two steps: First, fix the +particular conflict. Edit the file to make the changes you want and remove the +`<<<<<<<`, `=======` and `>>>>>>>` lines in the process. Second, check the +surrounding code. If there was a conflict, its likely there are some logical +errors lying around too! It's a good idea to run `x.py check` here to make sure +there are no glaring errors. + +Once you're all done fixing the conflicts, you need to stage the files that had +conflicts in them via `git add`. Afterwards, run `git rebase --continue` to let +Git know that you've resolved the conflicts and it should finish the rebase. +Once the rebase has succeeded, you'll want to update the associated branch on +your fork with `git push --force-with-lease`. + +Note that `git push` will not work properly and say something like this: + +``` + ! [rejected] issue-xxxxx -> issue-xxxxx (non-fast-forward) +error: failed to push some refs to 'https://github.com/username/rust.git' +hint: Updates were rejected because the tip of your current branch is behind +hint: its remote counterpart. Integrate the remote changes (e.g. +hint: 'git pull ...') before pushing again. +hint: See the 'Note about fast-forwards' in 'git push --help' for details. +``` + +The advice this gives is incorrect! Because of Rust's +["no-merge" policy](#no-merge-policy) the merge commit created by `git pull` +will not be allowed in the final PR, in addition to defeating the point of the +rebase! Use `git push --force-with-lease` instead. + +## Advanced Rebasing + +If your branch contains multiple consecutive rewrites of the same code, or if +the rebase conflicts are extremely severe, you can use +`git rebase --interactive master` to gain more control over the process. This +allows you to choose to skip commits, edit the commits that you do not skip, +change the order in which they are applied, or "squash" them into each other. + +Alternatively, you can sacrifice the commit history like this: + +``` +# squash all the changes into one commit so you only have to worry about conflicts once +git rebase -i $(git merge-base master HEAD) # and squash all changes along the way +git rebase master +# fix all merge conflicts +git rebase --continue +``` + +"Squashing" commits into each other causes them to be merged into a single +commit. Both the upside and downside of this is that it simplifies the history. +On the one hand, you lose track of the steps in which changes were made, but +the history becomes easier to work with. + +You also may want to squash just the last few commits together, possibly +because they only represent "fixups" and not real changes. For example, +`git rebase --interactive HEAD~2` will allow you to edit the two commits only. + +## No-Merge Policy + +The rust-lang/rust repo uses what is known as a "rebase workflow." This means +that merge commits in PRs are not accepted. As a result, if you are running +`git merge` locally, chances are good that you should be rebasing instead. Of +course, this is not always true; if your merge will just be a fast-forward, +like the merges that `git pull` usually performs, then no merge commit is +created and you have nothing to worry about. Running `git config merge.ff only` +once will ensure that all the merges you perform are of this type, so that you +cannot make a mistake. + +There are a number of reasons for this decision and like all others, it is a +tradeoff. The main advantage is the generally linear commit history. This +greatly simplifies bisecting and makes the history and commit log much easier +to follow and understand. + +## Git submodules + +**NOTE**: submodules are a nice thing to know about, but it *isn't* an absolute +prerequisite to contribute to `rustc`. If you are using Git for the first time, +you might want to get used to the main concepts of Git before reading this section. + +The `rust-lang/rust` repository uses [Git submodules] as a way to use other +Rust projects from within the `rust` repo. Examples include Rust's fork of +`llvm-project` and many devtools such as `cargo`, `rust-analyzer` and `rustfmt`. + +Those projects are developped and maintained in an separate Git (and GitHub) +repository, and they have their own Git history/commits, issue tracker and PRs. +Submodules allow us to create some sort of embedded sub-repository inside the +`rust` repository and use them like they were directories in the `rust` repository. + +Take `miri` for example. `miri` is maintained in the [`rust-lang/miri`] repository, +but it is used in `rust-lang/rust` by the compiler for const evaluation. We bring it +in `rust` as a submodule, in the `src/tools/miri` folder. + +The contents of submodules are ignored by Git: submodules are in some sense isolated +from the rest of the repository. However, if you try to `cd src/tools/miri` and then +run `git status`: + +``` +HEAD detached at 3fafb835 +nothing to commit, working tree clean +``` + +As far as git is concerned, you are no longer in the `rust` repo, but in the `miri` repo. +You will notice that we are in "detatched HEAD" state, i.e. not on a branch but on a +particular commit. + +This is because, like any dependency, we want to be able to control which version to use. +Submodules allow us to do just that: every submodule is "pinned" to a certain +commit, which doesn't change unless modified manually. If you use `git checkout ` +in the `miri` directory and go back to the `rust` directory, you can stage this +change like any other. This is usually done by the maintainers of the +project, and looks like [this][miri-update]. + +Git submodules take some time to get used to, so don't worry if it isn't perfectly +clear yet. You will rarely have to use them directly and, again, you don't need +to know everything about submodules to contribute to Rust. Just know that they +exist and that they correspond to some sort of embedded subrepository dependency +that Git can nicely and fairly conveniently handle for us. + +[Git submodules]: https://git-scm.com/book/en/v2/Git-Tools-Submodules +[`rust-toolstate`]: https://rust-lang-nursery.github.io/rust-toolstate/ +[`rust-lang/miri`]: https://github.com/rust-lang/miri +[miri-update]: https://github.com/rust-lang/rust/pull/77500/files diff --git a/src/doc/rustc-dev-guide/src/hir-debugging.md b/src/doc/rustc-dev-guide/src/hir-debugging.md index bb7f541fd6..519ff26677 100644 --- a/src/doc/rustc-dev-guide/src/hir-debugging.md +++ b/src/doc/rustc-dev-guide/src/hir-debugging.md @@ -1,6 +1,6 @@ # HIR Debugging -The `-Zunpretty=hir-tree` flag will dump out the HIR. +The `-Z unpretty=hir-tree` flag will dump out the HIR. If you are trying to correlate `NodeId`s or `DefId`s with source code, the `--pretty expanded,identified` flag may be useful. diff --git a/src/doc/rustc-dev-guide/src/hir.md b/src/doc/rustc-dev-guide/src/hir.md index 8b6637ebed..51e18973b8 100644 --- a/src/doc/rustc-dev-guide/src/hir.md +++ b/src/doc/rustc-dev-guide/src/hir.md @@ -1,5 +1,7 @@ # The HIR + + The HIR – "High-Level Intermediate Representation" – is the primary IR used in most of rustc. It is a compiler-friendly representation of the abstract syntax tree (AST) that is generated after parsing, macro expansion, and name @@ -12,13 +14,13 @@ the HIR. This makes HIR more amenable to analysis than a normal AST. This chapter covers the main concepts of the HIR. You can view the HIR representation of your code by passing the -`-Zunpretty=hir-tree` flag to rustc: +`-Z unpretty=hir-tree` flag to rustc: ```bash -cargo rustc -- -Zunpretty=hir-tree +cargo rustc -- -Z unpretty=hir-tree ``` -### Out-of-band storage and the `Crate` type +## Out-of-band storage and the `Crate` type The top-level data-structure in the HIR is the [`Crate`], which stores the contents of the crate currently being compiled (we only ever @@ -66,78 +68,52 @@ the compiler a chance to observe that you accessed the data for -### Identifiers in the HIR - -Most of the code that has to deal with things in HIR tends not to -carry around references into the HIR, but rather to carry around -*identifier numbers* (or just "ids"). Right now, you will find four -sorts of identifiers in active use: - -- [`DefId`], which primarily names "definitions" or top-level items. - - You can think of a [`DefId`] as being shorthand for a very explicit - and complete path, like `std::collections::HashMap`. However, - these paths are able to name things that are not nameable in - normal Rust (e.g. impls), and they also include extra information - about the crate (such as its version number, as two versions of - the same crate can co-exist). - - A [`DefId`] really consists of two parts, a `CrateNum` (which - identifies the crate) and a `DefIndex` (which indexes into a list - of items that is maintained per crate). -- [`HirId`], which combines the index of a particular item with an - offset within that item. - - the key point of a [`HirId`] is that it is *relative* to some item - (which is named via a [`DefId`]). -- [`BodyId`], this is an identifier that refers to a specific - body (definition of a function or constant) in the crate. It is currently - effectively a "newtype'd" [`HirId`]. -- [`NodeId`], which is an absolute id that identifies a single node in the HIR - tree. - - While these are still in common use, **they are being slowly phased out**. - - Since they are absolute within the crate, adding a new node anywhere in the - 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. +## Identifiers in the HIR + +There are a bunch of different identifiers to refer to other nodes or definitions +in the HIR. In short: +- A [`DefId`] refers to a *definition* in any crate. +- A [`LocalDefId`] refers to a *definition* in the currently compiled crate. +- A [`HirId`] refers to *any node* in the HIR. + +For more detailed information, check out the [chapter on identifiers][ids]. [`DefId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/def_id/struct.DefId.html +[`LocalDefId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/def_id/struct.LocalDefId.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/rustc_ast/node_id/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. +[ids]: ./identifiers.md#in-the-hir -### The HIR Map +## The HIR Map Most of the time when you are working with the HIR, you will do so via -the **HIR Map**, accessible in the tcx via [`tcx.hir_map`] (and defined in +the **HIR Map**, accessible in the tcx via [`tcx.hir()`] (and defined in the [`hir::map`] module). The [HIR map] contains a [number of methods] to convert between IDs of various kinds and to lookup data associated -with an HIR node. +with a HIR node. -[`tcx.hir_map`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/context/struct.GlobalCtxt.html#structfield.hir_map +[`tcx.hir()`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.TyCtxt.html#method.hir [`hir::map`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/hir/map/index.html [HIR map]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/hir/map/struct.Map.html [number of methods]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/hir/map/struct.Map.html#methods For example, if you have a [`DefId`], and you would like to convert it to a [`NodeId`], you can use -[`tcx.hir.as_local_node_id(def_id)`][as_local_node_id]. This returns +[`tcx.hir().as_local_node_id(def_id)`][as_local_node_id]. This returns an `Option` – this will be `None` if the def-id refers to something outside of the current crate (since then it has no HIR node), but otherwise returns `Some(n)` where `n` is the node-id of the definition. +[`NodeId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/node_id/struct.NodeId.html [as_local_node_id]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/hir/map/struct.Map.html#method.as_local_node_id -Similarly, you can use [`tcx.hir.find(n)`][find] to lookup the node for a +Similarly, you can use [`tcx.hir().find(n)`][find] to lookup the node for a [`NodeId`]. This returns a `Option>`, where [`Node`] is an enum defined in the map; by matching on this you can find out what sort of node the node-id referred to and also get a pointer to the data itself. Often, you know what sort of node `n` is – e.g. if you know that `n` must be some HIR expression, you can do -[`tcx.hir.expect_expr(n)`][expect_expr], which will extract and return the +[`tcx.hir().expect_expr(n)`][expect_expr], which will extract and return the [`&hir::Expr`][Expr], panicking if `n` is not in fact an expression. [find]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/hir/map/struct.Map.html#method.find @@ -146,11 +122,11 @@ that `n` must be some HIR expression, you can do [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]. +calls like [`tcx.hir().get_parent_node(n)`][get_parent_node]. [get_parent_node]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/hir/map/struct.Map.html#method.get_parent_node -### HIR Bodies +## HIR Bodies 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 diff --git a/src/doc/rustc-dev-guide/src/ice-breaker/about.md b/src/doc/rustc-dev-guide/src/ice-breaker/about.md deleted file mode 100644 index 642fbe4a1d..0000000000 --- a/src/doc/rustc-dev-guide/src/ice-breaker/about.md +++ /dev/null @@ -1,83 +0,0 @@ -# ICE-breakers - -The **ICE-breaker groups** are an easy way to help out with rustc in a -"piece-meal" fashion, without committing to a larger project. -ICE-breaker groups are **[easy to join](#join)** (just submit a PR!) -and joining does not entail any particular commitment. - -Once you [join an ICE ICE-breaker group](#join), you will be added to -a list that receives pings on github whenever a new issue is found -that fits the ICE-breaker group's criteria. If you are interested, you -can then [claim the issue] and start working on it. - -Of course, you don't have to wait for new issues to be tagged! If you -prefer, you can use the Github label for an ICE-breaker group to -search for existing issues that haven't been claimed yet. - -[claim the issue]: https://github.com/rust-lang/triagebot/wiki/Assignment - -## What issues are a good fit for ICE-breaker groups? - -"ICE-breaker issues" are intended to be **isolated** bugs of **middle -priority**: - -- By **isolated**, we mean that we do not expect large-scale refactoring - to be required to fix the bug. -- By **middle priority**, we mean that we'd like to see the bug fixed, - but it's not such a burning problem that we are dropping everything - else to fix it. The danger with such bugs, of course, is that they - can accumulate over time, and the role of the ICE-breaker groups is - to try and stop that from happening! - - - -## Joining an ICE-breaker group - -To join an ICE-breaker group, you just have to open a PR adding your -Github username to the appropriate file in the Rust team repository. -See the "example PRs" below to get a precise idea and to identify the -file to edit. - -Also, if you are not already a member of a Rust team then -- in addition -to adding your name to the file -- you have to checkout the repository and -run the following command: - -```bash -cargo run add-person $your_user_name -``` - -Example PRs: - -* [Example of adding yourself to the LLVM ICE-breakers.](https://github.com/rust-lang/team/pull/140) -* [Example of adding yourself to the Cleanup Crew ICE-breakers.](https://github.com/rust-lang/team/pull/221) - -## Tagging an issue for an ICE-breaker group - -To tag an issue as appropriate for an ICE-breaker group, you give -[rustbot] a [`ping`] command with the name of the ICE-breakers -team. For example: - -```text -@rustbot ping icebreakers-llvm -@rustbot ping icebreakers-cleanup-crew -``` - -To make these commands shorter and easier to remember, there are aliases, -defined in the [`triagebot.toml`] file. For example: - -```text -@rustbot ping llvm -@rustbot ping cleanup -``` - -Keep in mind that these aliases are meant to make humans' life easier. -They might be subject to change. If you need to ensure that a command -will always be valid, prefer the full invocations over the aliases. - -**Note though that this should only be done by compiler team members -or contributors, and is typically done as part of compiler team -triage.** - -[rustbot]: https://github.com/rust-lang/triagebot/ -[`ping`]: https://github.com/rust-lang/triagebot/wiki/Pinging -[`triagebot.toml`]: https://github.com/rust-lang/rust/blob/master/triagebot.toml diff --git a/src/doc/rustc-dev-guide/src/identifiers.md b/src/doc/rustc-dev-guide/src/identifiers.md new file mode 100644 index 0000000000..37e6a1c929 --- /dev/null +++ b/src/doc/rustc-dev-guide/src/identifiers.md @@ -0,0 +1,108 @@ +# Identifiers in the Compiler + +If you have read the few previous chapters, you now know that `rustc` uses +many different intermediate representations to perform different kinds of analyses. +However, like in every data structure, you need a way to traverse the structure +and refer to other elements. In this chapter, you will find information on the +different identifiers `rustc` uses for each intermediate representation. + +## In the AST + +A [`NodeId`] is an identifier number that uniquely identifies an AST node within +a crate. Every node in the AST has its own [`NodeId`], including top-level items +such as structs, but also individual statements and expressions. + +However, because they are absolute within a crate, adding or removing a single +node in the AST causes all the subsequent [`NodeId`]s to change. This renders +[`NodeId`]s pretty much useless for incremental compilation, where you want as +few things as possible to change. + +[`NodeId`]s are used in all the `rustc` bits that operate directly on the AST, +like macro expansion and name resolution. + +[`NodeId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/node_id/struct.NodeId.html + +## In the HIR + +The HIR uses a bunch of different identifiers that coexist and serve different purposes. + +- A [`DefId`], as the name suggests, identifies a particular definition, or top-level + item, in a given crate. It is composed of two parts: a [`CrateNum`] which identifies + the crate the definition comes from, and a [`DefIndex`] which identifies the definition + within the crate. Unlike [`HirId`]s, there isn't a [`DefId`] for every expression, which + makes them more stable across compilations. + +- A [`LocalDefId`] is basically a [`DefId`] that is known to come from the current crate. + This allows us to drop the [`CrateNum`] part, and use the type system to ensure that + only local definitions are passed to functions that expect a local definition. + +- A [`HirId`] uniquely identifies a node in the HIR of the current crate. It is composed + of two parts: an `owner` and a `local_id` that is unique within the `owner`. This + combination makes for more stable values which are helpful for incremental compilation. + Unlike [`DefId`]s, a [`HirId`] can refer to [fine-grained entities][Node] like expressions, + but stays local to the current crate. + +- A [`BodyId`] identifies a HIR [`Body`] in the current crate. It is currently only + a wrapper around a [`HirId`]. For more info about HIR bodies, please refer to the + [HIR chapter][hir-bodies]. + +These identifiers can be converted into one another through the [HIR map][map]. +See the [HIR chapter][hir-map] for more detailed information. + +[`DefId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/def_id/struct.DefId.html +[`LocalDefId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/def_id/struct.LocalDefId.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 +[`CrateNum`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/def_id/enum.CrateNum.html +[`DefIndex`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/def_id/struct.DefIndex.html +[`Body`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/struct.Body.html +[Node]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/hir/enum.Node.html +[hir-map]: ./hir.md#the-hir-map +[hir-bodies]: ./hir.md#hir-bodies +[map]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/hir/map/struct.Map.html + +## In the MIR + +- [`BasicBlock`] identifies a *basic block*. It points to an instance of + [`BasicBlockData`], which can be retrieved by indexing into + [`Body::basic_blocks()`] (note that you must call a function; the field is + private). + +- [`Local`] identifies a local variable in a function. Its associated data is in + [`LocalDecl`], which can be retrieved by indexing into [`Body.local_decls`]. + +- [`Field`] identifies a struct's, union's, or enum variant's field. It is used + as a "projection" in [`Place`]. + +- [`SourceScope`] identifies a name scope in the original source code. Used for + diagnostics and for debuginfo in debuggers. It points to an instance of + [`SourceScopeData`], which can be retrieved by indexing into + [`Body.source_scopes`]. + +- [`Promoted`] identifies a promoted constant within another item (related to + const evaluation). Note: it is unique only locally within the item, so it + should be associated with a `DefId`. + [`GlobalId`] will give you a more specific identifier (TODO). + +- [`GlobalId`] identifies a global variable: a `const`, a `static`, a `const fn` + where all arguments are [zero-sized types], or a promoted constant. + +- [`Location`] represents the location in the MIR of a statement or terminator. + It identifies the block (using [`BasicBlock`]) and the index of the statement + or terminator in the block. + +[`BasicBlock`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.BasicBlock.html +[`BasicBlockData`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.BasicBlockData.html +[`Body::basic_blocks()`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Body.html#method.basic_blocks +[`Local`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Local.html +[`LocalDecl`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.LocalDecl.html +[`Body.local_decls`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Body.html#structfield.local_decls +[`Field`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Field.html +[`Place`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Place.html +[`SourceScope`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.SourceScope.html +[`SourceScopeData`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.SourceScopeData.html +[`Body.source_scopes`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Body.html#structfield.source_scopes +[`Promoted`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Promoted.html +[`GlobalId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/interpret/struct.GlobalId.html +[`Location`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Location.html +[zero-sized types]: https://doc.rust-lang.org/nomicon/exotic-sizes.html#zero-sized-types-zsts diff --git a/src/doc/rustc-dev-guide/src/img/coverage-branch-counting-01.png b/src/doc/rustc-dev-guide/src/img/coverage-branch-counting-01.png new file mode 100644 index 0000000000000000000000000000000000000000..c445f3552a6594249d57a395a68cdc0609ad7719 GIT binary patch literal 11282 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%0DUStFmzTT+Hb-e?|0H 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%0AKZr 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

wz89&cJ-by_MxXIcuhzRB!!ym7Cbjk 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 literal 0 HcmV?d00001 diff --git a/src/doc/rustc-dev-guide/src/img/coverage-spanview-01.png b/src/doc/rustc-dev-guide/src/img/coverage-spanview-01.png new file mode 100644 index 0000000000000000000000000000000000000000..f3e4b353559d1cd2e7ec1e80d6c2acc7972ab47f GIT binary patch literal 320657 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

SDd7ixMOq> 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≪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%0DBOuqanRz_4oJAMqwaSQiT6oXcj|P< zjVa{f>6qm&otUEQd<+{t`)@{cBlryRA+MMa>LK!ZHzuK4Z=jR40IB8PeB3@yH650! z?_yijNwVN|C&|+#{^iO*(?B`P>f2F3pfaAI^PMlZD5^-Me)%|U_yG9i9gZaxJr8EV z(Z?(Hi(P>!N|@KTe9!RTSmw*E2sIPI_v*!g+4pDUBvVxrjZiR^t;$!HfFX1|Y`BS# zgzf{C=v6uE)xV|BIUqKXI9M_=B#|;5%ko4j6!K7V*Kq7#aCIT%s=CiAnt&d6#eccN zGKEs47NUR=mtXg#oDMTEaiaYTBZ7;s)esy%UTh-v0*xNf2Qy<;EpITm*-@Y2g??3vQW``tOc+;8BQ+OV z7C8&=ME!;7a)2{3B41bOEWbpmGtwK=bWhv{s@kKkyKV05qMx$!sY~w2P>#<4FUNrW z-<+j~pduWaGPS|Y7+2)z{FH1b(&&iku(pNXtK&_dGZ6oyq&!9)TV~@)QD>IpE`C5b zVeWOqDU*|vVbh$pC~yygWd-$L%8-b3|MBviX5_Z#iAt>~nlIL)Pd>Mi+%i3NM6mF7 zuY)Yv?yo6~l_2;E8q<~)_WF6^T4xS|EnuORWbt1u(bD1Voqf->V`^oD*{2#)D^0H& zGt{~6j=g9~u*}}?om8xR$tfA9+;@%gpx{>O6>pG>xzuKs&nPET#$tTQmwq>Y=~p3} zicZBW!ANftHYygYY9x|NgzT9+8x^sv$MZwTJ0kJ(hLT{g0QKBq*bY6ec|Ad^$?bXd zS1ZHLwwwGqo-m?!Lp8bDD}YcPK4so5@{((Q0Aq3a3lO%&r@U5OwsPCx#QbfXbc}KI zLb!za4M1v0yI1%6-vbYFB@=bobI9vhBer%-1jl*So})ugm1j4-c$*_#D!D<`J?HBa zprxYq(I9l+BRIl7F?g!4mJn&V$aje90J6AaS!Ke|-3D6_23%{>sDq8m42XYyF!4bWIfi z<&%hBee-`jBlI&K${x75WYif`n!N{Eo?$2##e=~CAi{n_??F$Y6{GN_Q_td{WQA>J`t8b$cQje;4LV48BK1uR*^V|bCAy| zwMTq^NQ_MIW9O}@c65E)Z1)I_HD{i{4=1`j_c@MX-wTRwp5593B zKaB<+-3!*~hVNl7`#+6gAfYb2H2CMU9h%v#!=XLnRn_fn63hnl0tc+46EFxLZliH1 zK+jTz_ZNLDc`-C0Rh{+9%d?p9777Vh@D2SYhHW&?5hK~0#p)3J-HzOm45U?Lnam?Y zNvFsdpB_5?R}Go7GcVj>HXM-Y6CIvCcJB*l{Eq~+I>22+CQXvzA&GQ5+@4Rs2TTq& zZ>}XE*!f|5+8!UtLP$6;F~tbhnxuwb4~XYqJ}f?BtAjP|=i+ zTlBRb6vz#v^EHWRyC3*1)a-Ml8GFnj3Hse8!EOLt2QPFNI-7H#+_-4qP;O z&rq1%pvL-w z_KJ<&IC8D{Z)H3<40&1Om*oc?qCSuF8~)Wlv1lLQW{SD+6&=OyQKRA40nmLJl2>ZY2~d)^1*g$8EVH948WzTg2` zga5a&GdA~~npn*?j;FXSWmrucFBka%p=o%e*9$+-{C|#|F~o9tO1@s$!!o|PGPmG0 z!G%qKig;$_NsE8@IbYGA>SNqnCZk!oy&aw+4uO>rDKRchX<;4N%A0SaNXtv)GRt>y z(W{$j4xen|oUg45>_I-=mfjy4^Ch19=_j69*^^ffJ~}RYh4t*Z%*mm6@bwy|gvh?U z(BknB<#BXV6=^qErjP8uO zIFup6z6zSGSi%s@D)7&0Z{`yZZ3 z6MZ|)5w7P-o#Ah~{=wdVG!s8ZZXW;K6N9-)ep9|)=$~V4{UmXjvaa0I+zTsBB;lH# zLvVNq9!^z~1og5QpnHDIpB!<$?}t>{OZ{5M!kWJ(_qPx9LDHJmYOqCW%V+yZ$SqFB zT#IAAYoV#K3!1pG*37Pea!&Qz$ttY_cbdo3k0B%J*K)2^&%#0vD>67J;$$XpW0uwRtkag`SKWNyGqz#$LlVaYky{kTxg zK#BH|rgec>N#f1M@XRJUw*KlO*p}ckQ8m1UnzzyEsWyDY#ma6gX4M=8b?A7)3CO$@ z31wM|ja-%mj2X_E`W&6s)71$Jjadj7&Wv-kNthprI6~nVo7Jg+A?!YwtWiW*8a*zX z8Xz(G^;u-D>V`OwvH#pUrVRW2$_geP9tZG!BcGQ+pPp;`C|3-_$79#v=~A>HpxB_%(#p2hWRMk!Kt{qb_e9J3I=qWnd2#SpCX16Q3<+nU}m7 zZ_!J}^F1Dmq43ihG5^(_{Ga)XQ#Hg79{0j?dryR`N@gioq(PSYchy|J&6gH#lw3er z+SvPDvPUo$w%W_h@_+jXbg-NwGydNx?Q^t|wD8gdx32f~8d^o7Bs ztZ}&jsc%JGlIH`eO8<-rilYkoMRP6A*-i#drn~klcZ8fi4?<^ua{GODHYL_8 z3G4({Rf96R3-cqSbh&X_Jn7Jy--aZkwq|%Z&c3>UR{Ntum#61V`iy_7_-SY0l5fs$F zU-{C(X@?;T@^&6>d_YWtbg}J33Lvs00`NN9NQ^iZE*Dy6VmdybS57?#8w<)f$-;0y zH3K$)CHes&i428;kWbZ(tP4?FWGzw#w`2&2bo+Lfxg%CFUISo!PvU+CmTr#B_8fPf?GA#j`)kqq7QLkVb*w%RIfGtpr+Pq{+^h zO@J_d3c(~t@Hf#We287~7CYX3T?vwro<+Da@#Fh94#hgh+C^!UFQ`rPC9mXh);xbf z-u)Y;PZS)O%CnXurK2|t?HmM;sR~_a8g3=zbY54biQb9%~O5s zV7e0JcHk#diDMzhD=msYn3vq@gamwxzPmhjJhDzBm8TlE9_qD7Ft#bWIWu|e!B`q0 z@rp(Ari-n5AenD@dDT~#!F|;68z=HuU6&MgGjC16$kHM9EdvMQ%b^#vk%Cn!qqX0cSCF{EV-^&7Fs$!@F)Ve2slEJ zkqx!Crh_CKg&0)~d2+@WeC&x-+7%z`$dD;c{qmr*vr1G_VA|#AZPNjpXBmT}`jRxA z%&yCGlmbQm(6j2iWAs*wkt+vS6$Wb<=z1@z?Srtq~n@e*F2ewx-YJ3RJivHNp?mn$Id!2QSRuT2C zq+i(aL+ghs|Gg#7flDw!>W2~!`&ML%N=q}mfM$vWg5i6aY!<%4PVD%%zN)9-5%90i zcyf(AIZA<{Q_(T^EjLrG}NlmVI!V}1r9>71yce|T=f8tPW?$nh7 z!i{+Ww;H$(ss4~mVi!c8i*q96okYL(iZCX?o=k2F8x zO12@7yJo)mUpe0wp;@V~lVGEOG-Y~UM7O-y0euayTdGKkQC!_FBN0zlHiv z)MP1`NB0fsQAD2Wer(aH{8n)O)?K~S&4i#Jc0k9Lq)xZ{3~>s#u-AR2*tDF}yFA#X z_fyfd0V^PodJL{?_;jTW0y!cni5%ArIjhOWS}<*1Gfe0vjHBN_Q(X#q=}Ll+0WKsC z+Xa8it5(j@eb|_|X#n{gONK#rfGuhh_0K&e*%c$8iXN0vScBbg=>01LG$o#W^9Y_m zMTJ-aCY?GdE`T2nwmLwgbA#pJh}<8-$gP=9Kh}t2dAS;nO`Z1{e_kTBKxe4-?%nr<6tVgrSqdf(L8)_>ZVV2E3Vo;?!YfKu)qXIqixU8Zv(0ssfAEf%+xxqtnFB-36k&U!bI7qGM!yCr zOE>1Yn0ty!+sEqWFFJuYJ35h`g$m>xdvKAu(aMzi9WjfmGZI`o3vSiq6LaiI?$>{a3OazR?)l%Q`&MIP5^($W%l2uRajl? zPu(AixZRe}9=h~nI-(6O zxJj(96&yJjbG=luJ%~WhJ^QWyL$_9UXYhDfoc{#w3XK`H*{Fp5zvh`F=1&K*F59Bb!2NiCI=< zu|%*B7ZBrbP)2jc;D(@KmV_~TftxaX=NaGTlA6x?#JtvMgz$XI;jv$_ou54Yk!N`W z?|h>OaTYiIcxvr3*=V*Z6Ufkx->y=&9_b%C=GT%$wt_#gLy^11hKkg2B? z7)=A`5<+=lk*>Qj^5Tz*lG#W~mzN3mlGEOrRbg!@mgBTOy z!&?Dmc}U~MZ*)8Y@dL)kf>Xx=CkzwNC*1Y=Yo5i-p}=fC@S(EcZU|31@M4i_YS=k{ z9ic_tVs!@_LR$|pY^N8LfcMK%RHW^?H3h;#U00_;7V3RlSugdU()8JhE z?8g4!DAg%+rvm33{og7LAaU?DvJ%iOVZoxBk>H}ja}hhww-0nfC0C~3SJnK;yo@J& zxX=2ck>GNl=dMppYdNSUJ!>`@G61@c&Kx#F*L<^lj(*h->;n~d2>>Y142D4aK1X3{te8H zkCQ{}Ij&~v#F{NApVPQcIh3(CZ$sjPKH2^bTQC01OO{q!w%s)syo~mq1Q>KVsL4sD z$0z-u_> zDeT}8Q}{QRUJKIIl9{Kp`4JRh5Xsd2m^ko;_c^sKCx81#R9LVU{%U&C(Mu$Zx$F#N zSpvCzLhP+-O?{jDL%l|Bn;ICk7YduW_YmD7FD&)l=n`ion|S%8eZXL-@4zdOpUvL7 z{;h6^somu(U8`%)7F0u>NW61gT67oI0ATOm)G86d3SrTnLKvWn04y^rO#DMjk^bPX!iju75gdnvhdKRHYCc<9n3nxq zC1B3+v17*9m(u37$keb~czB|^Q(rFFH|LhHArV>-}&gL$HuCH0V&9j&9^!wdFU-mSa*Prn(^nQ0I+iuxiERk)W0n{#4iIClZ~XZOaKa< z`??CBau@HhNr1fPBXDWsmN4T;c|9@;5Q%+9-?+!hQn>h<13TIPv9iG+FLftG16YiQ zS-xhXX@7WWxhe-J?^#wq=A(eVS*%0nECi2Lq7 zlSz@9ap;k{Z>N05)4L9BQaaCBm5+A|z%1h#0I<-_zFeiL4gqYpQ-Hqhyxc{ni0!R1PU9UK@7XD-w zXDmN~Tk|;iu)T3fcv@FR+jE$5r;c`U?V(uHp@`=EwvUPX$ys-cMcGLXVf7ZsRbI_@ z%}IX!`D1HOkL8=$XCF4$L;Lp0zm__43S2$t`qKBgaFt8+@79LF7Q*w6NyJ=fY|fvx zE7v^AoY#EmGU)ZMBKNOkI9JW%TR|Ckhlauq(g`nr%eu?K( zgY_qo%BzIdxR{K0K1P`ass_hYETIaM>82(ltoISisvkMb+?%CO>tw?~a zl@^|@9e7hl8tk+BkYBUjjSW6%9FTK=4yxio=zj3l_=CAZ0xe!C*lhBm?mE?r$?|}? zHMFgT(X|BX?-x`(Ioa`K%D8zmGu@h?=A*#^yO6)dZnmYNLZDB^4FS-&YHvibyjBPNu($r5xk;c z1MlUu4=(7bP#b$6&i!XE-~X)v+=Fl<=NHF9s`NZ-l`riU7q&QytMF4|(G2{lVLG7y zS0MFC_KI@1>ZIPro|QDlfJcAuPLlol$HHpt)U`kM&03BwURTN5Ttz1A;3j1P&$%C@jXyU5M<{}DU&7)B9%EFTy&{yw)^$a0Z@XVf26v}|Fx9QU z_n=b%_i5K@{ne-!3BaG*#!LRo+{|f^Bwh75ii|xPMStY0t<$jNum4Rl^*_ zliqBccIW6og!)x~WgP6pPe01y`x<8b-78eUOF&~r3Ux?)*_dry^VNuHbsi{qT)cLZ z8q5}ZbLCe5^VMg{Blj0d9XO!N^8)1?VLmMpyB+c15M!rMJ?m%AM&0SdHOcXjUJLNWCR@9!w*YE{-9tkAoy5$I*2!_ z?kp5O4NFS0pe4cjH5VyMoVYJJSU24DWj~%Z-fm_(`;8^X=z@Kdx|8jlPvbVyQ(v|) zDa+CKn}s~RN6Q8FF2_?*)PT?MIysg;&?8DU(#By8K}j4~qk^a?Q+URGq9XV?Dte3 z^l`AnMTc952e|f;omx2Mkl;Wv85tXM>xW=J#ZXe1TTD|h}=Tj|L7 zCp^Ivxboi{UuM_B;$74%dfb}Zi~pKZto%+0UDH)8djIHM*+wHPU&Qy^#2p3qfi{)8 zuXi*_Mr#B+sj1Ph@i33JerXwb)wKCAUXC&!=)MZdO!dt(TV52(0f8;3c-=B7lAoLUR;758NcGU@#7u2jNEb$Q2} zcXQMqpHvx1px4OP<>Wl-6y@pFiOhcf=EATkG3uKnu!u>PGiL84&d3$&b^W7?{OruT z7ZG#cxvs|nxtHoY5DXa~y^%#uwK+@3$J}c4I#IzvXU>j~_Cc7tEE&gJGo1=W5`t}? zhp#cWTiHHe0E*)Z##%IG57IQ?Oq)rCUeOXeb8gS3(OiP+hTQlV$WdO>fwhjhY64T3GW8u>XT#V){#Ul~+NG{Fhe#9jOQV6Vu{H!rin-QcpdZS|f{4Q)# z2&D|j0#bX!-!xq*GI@aK{ysSlUE(3af>WgCtGKG3ve#A%zD|!do$WHGZ9H%_Bzh-U zj4$f0`!c0!!_(0WWG!;6dBSz;vbeam^GhO_=kZflxA~#AU7yyh1!a1U0AMDiGheMN5z0Aeg`J9NqVDmAuVq`|{tS6*a+yA}8fFG8v_b-%{bPu&0g8m#3| z9;>QWHeQL~c>rVH8sv_QxosF+a~!nI5D;;tXWjq7`FqwDOMDZL@cn^}0J>4Kz-tRt zw7;P`*B~~Jr3|)$lrQm$aE1l7X})xC@oLga(GyssTMm-*>UL!TmqI76vD}bJT)Ye1 z(Uz6adARmrs!aCzGj5^Y>MG9V=%s;cFR-@|pQXA!yh3U)m70El*~od0gTnqxIBezy zL+d-9`(h9)13s4jbQYzh)+Z30##vQqV4t!}z@A<7ZV77{{8h$Q>}=`X1s{^Nf(le>Ju4=I`ltOUJvmJsoiur(XO-=ffN|bAbj6$gVxPO5 z3f|2X_U9aSdx;;mc+lSSOAl#EccYeU`#!KGrgMF1XQ7K1^7NLI|M#(!xisBxG&<*y z9lCe4eI0|hdQxs52R4$>5aRcO0^${J3E94@I_m$R!ioKJj!jzdLe~SfPXk6!$N_UY zp^nx*?eGwSRgYDD;}kY8fHc6{N#D5!WnYv!WLa^v$NMAKSVSei)%Ho=6WhBJP4iZ7 z*Pr}6-id5q324S?VaZhF=A0Cvi&y1g%bzgb{%nE94s3m{U;UUSBDHs!9$6%NIo_?P z<8MI&`5A}t!$|DNIkhHE;<)cX&9xYk@M)M{H=Y;r=?Uh%iiX6f9_^J2d5grQxkX<2 zH_b0<*FI^z66O$E>F~u7e(Q)ccY&h2&A82AZsM~?ADM4WVqU-;qAS^ZS{01rX?&s7 z+oXHkIYg-o@km7D3Rb5dgAON@AsAw`Xkx%LJ3XFnw1X?J@>Iiol~HMee$Dw~Q7C|_pK7M3BSzBr_u6NH~vMP`Lqb5xQ&)2 zN80JH)2@ecN~-O{Va#867E5LtHlYc8FAwYW)0zmzq3TcCoc5m9nJ0#f@$Ibb1&yI= z4v99*$i22Dee55iZF1fbKjn&ALVv^Yox$5`3^rA_wNU8yujiCw`(+^u$Q^#sipPJ! zG#IV`u_x9Hl*bzA(yO8fCvf@;d!|soo9Sk<_Quj)M+G%xhTM=3rpeRW$i9Ga(-UV2 zjW&*T#`o=zS$^TQbI9LrOGPnhW}L&az2D#%C;I`_V4N#8+Ym9+*X!$UR%jPW3n_T0 z>7(P9z{^RT^YgDL2rFjq;XODJB#?>ZxSXaK0i9uJ8{6EHH)^%7LLU$co={Nfeft;8 zk}hkRp6w0^J$@n?xo<(o4e0fhCv8mDX&4(^c{8Ki3Z#4efVhQj1yw%X6!F<9>o3eQ>ebL!TDvApwL8s}zqb87IY<+ZkF5SPRA9voY9dCeb? zzZn0o=}6<+BR-wip{}okG+P1Z|++It>ebC#@|5a>Vn>tP_#1zcjGc zz8ma0$z{C06ngZ^dJ=|YiZEiJSXL_EccbKhWsLmGF|)nS9065I$Aj8cMc~6On#MsH zC<(uE|L^kmC;sXG!CcIsB9J>_!$!GTy>vTuqV;PVeC4?a~qt}!`jm)xo^q}s%t zYbP`+^R}b2vHYQ}vxWSf>;i&FvTB;mS+hp*n$AB^24hlUH4e*+8Nt%#h*290Jy+pr zFDUDsThOT045sg7s^*rxfNS4Pwvwb4uya1jY5SEyrVQLZcQSBSB5ao&u4ZPPqbrtl zQ!{?uyiM=wkk@pnYVz_b<#vlPN+gf5-^sfCGtubhZex~3y%bya*mL{gBNfOF{&kSi z2ixlE$Zc`x%&~p>vK-J)t&v8niWmelFt;KnYp}CC#CX+55(%dxUV=Wkb<>Eb+i~l? z8bU2A&TVt(-Fl(F2bzHdt(o8Tkh#h-y_DWiJkVE!bUNBkuB=Z*D7Qs0^&bW;>E{8f zuYMwK3%wD$-xE%@I?IlM8!SSC-tLPK5%AQ8H1F1GWv>sCagH&o$Kr&OTUKx2(eZb* z@kg|qoDhC~ZM;eYH#qodVs^AxY_KZ4hn^Qe#33FRNW^rZeB-Tu*YiT?aWSd86xf5H zw}s(9dqM(Ky+#-Y6C5kakzZv*gs-^x`K}b<-k%WE)_MWQ7)&z03yEf9hfb$wNJvdm z=gN^W61sn|se`X5XV)$3deIT%>z^oRiHC}9doy6rFKNEWM1g-KK7t6ls^eh5{If!T zVn`NhLc?N2KN&1!S2g&u$MDUUH2-`z;lwMV@_?PtXs|YbK)O$2ayeZHj_fOn+Rh-g z*0cZi!pLiax$vGaDokZi3?)e`y!()5m7D#lob);Qp&Ye4sLMPT`f24XZTs-zt+hLa z%@h1INu?yxKW1dU-z{v8rb?f$l~-!DnWOVaW-m8dJ($(}nhxwh+sI2Wkn4=9iz4uO z^VuA#NvbI1{dC*RZ{2Yz1|A>y<4EsgRwbP0-t)3+KjA>a9V+3@BFD->-IVuA{jR*t zGs`BmZg*a#?OgL8PO>wPuBacJKVBMy+D^E@v6I=s7;btA=;1g@aE1k=f|t#Ffn1R4 zfw>l4$OO4rd4hE+?55DzC0LCM>lQ-cnltn@7rm7&! zTDT5y^5A(A-w6~Rj@0jrHks~ClgOXes#wt2691L*>@)J8Scfn#;iP$tM`7qaSrTv{ z?7Hj;&W3uIdw<4@e7vvo491qjz^A^;eh<5{)FhOj+|NWTTM`;C4O&gw z4~34O6WYK*FQq>u2YFZ&`6iHCF#2qvC`ZeJdma{pyfgB&DBVBnojV(36di|mh)gPs z?z-{zaZ$g=S<6nI-AqieDwoY*eZIE0Lgo2jbRRWA$K4{oGB1*%`vc1!it@uwb~6KObY>9I(-WO?~Wq5O@1R#j%>M$0uc1bf@*c`ny=Pb*A|&C+aeup-1MsH8?I} z-!p+?PoBN4M_Q8?i)}m&oXSt%#h4D5(W{nKgXAOwa0Npa-zzpDsux?Z16&bmE{CGX zZYF+vzS|;wax9;)UX}1i^68OyhbXgQc(4P=37dMXXU_4jwu#724+;{e-$FoqSX6W2VXD&tKV4>V)^Id*t)(0qHwzgDbBODW z2f`JAvmL*Bt=u)rJH4l;wyMJB;58o5bR$Wyc&35w;w&36YAikrZ?Iu`tuMdjufFQu@)m^o6)3U~!OTgugcc>#V7n zwYYU0YMT-5dIWj@_SO-)ob9~u$oDN26RrV1XN{bN^}|js&QMR57^pI208#v$6w`y+ ze$3W`-yfOypa;9Gs(*Z2fU*SOZm3ic29U-KK_vMNcdH^ehfonbAFw5WoTvL-tET%% zb)+Mo$s~)+n=n&stKRW`v|yG5=YaCqF^<+^Eur|XjVUX|$H8Z5#H! zo#00*Q=7Z%y;EHIW5F)y4(y%MyE~ZrqvEDjKSR$<899jCogYeR5VEtr?ilOVlu+B^ zS$0cd#052xui<{D(fVAzxi%uI%IZSE%l41?Lwu=xGZ!A_$@`J5@ns`%TMbdZmzm>c zQ9h@7LQh6ts!7~`Sm%0t(JjQgC=F?9gL945oIvLvyRR;SUCu*ZlP3vaJw}#GF zO_%OZ`e=ZS_ubj~U3c;jUsHw)x@oD%T|nQj=;}|~yonUV~*xv6xleDPIczd}kRU zWXTK2g*2WhQni1-!2O}}8PH0m={f2Y*NpVEG9CS0@HByJp5zXUHA3*et!3T|L*(u zuZOuFnXdQyobx*8JYPuo^bP_gJL{fFmI5<7sf--P;5z^&P-W6x&Y&tA==ie40?POd zmn$D^G9VSnK!x)VnnWm%S=; zsHFNlBUhL3V`}Z>Cb0JZqhSs2I*#7@x%}wM>z~U#&&U7RIKGA@E&F2-$9-w4mF=@O z;Wq40frESdne-?WA+zq<^Fn2b=W*AM7g9|2TiJ=%+25zBc#l}f)IaW2<}dX&_E+{cuM$l*~+ zW}NF->7I9ngP$cu61M!&r791HZIykN4Z)W*Q6(%n}&tnG?%{@atoqrf4 zv6aot0cRE5mp&Xc+0%M)LHni-EiPX(u!Rg8k06;sn-{M#;;-$oeIZ}89>v^*2~H=z zzLKvVqkOptjbQjw?I#W&^%gk9td*<;kPN$^IUtFsd?&O_ftiT@5gCqWaKTmX6l#ao zdnsQ%!mFeR56#+8c7ez#$a=&##JLQAgOyP7PECz*<&+{r|LR9gX(v07SZNAy z=bSn_h29U{11hbDaK)DDV5G68VCn`IEQaARVUTNdYd%!VRAw%B>l;}dRca+;DB>S} zo8Hv|R%c&O729iX2Ba;Mm*B02l6nv9Uc9lOVWzsauo|O7EA(nB>O{=@M5Y#lpUDM} zjd*(x!|0Gh3UON9E@?Lg;Te`DT^Rmdppf$d^7`I00|<~KKfi#8Tf|iyY$=&{1|+F2 zA|YMZvC#70il-R3yLaKnymA|k4)lU0aw@xj0SdrV*bBbWSD2hBJq?!YcB6*Och=<~ zgU033u{X0QcekH_5a`Evutxx3KfT8F+4e1O`8gobsSBuuc4vVp1QRtqxj}{L;}&vf zooEPJCeTaR#Lpv04``9Mp3=rwcXoFXv>VE>Yo{uhgi;=Y2@o_cT1O%yVjeY%p2c%R zijW_u6J)sq;0UF%*k=n&)kY6`^on5s8fh;Fir)IB(s1)XvGTu#?QRcvY91?I*LvKL zS~O_yUu+V$s8{t`W#TfNWJ+R4rGoap_b2DwTcddVG?4fXPG%^6!0PU>Ca3%xT+mwW zJY_JjATpP<*)hwsv9LV*!7T zXesXd<~*D&S61)+xyL1gd}+qAnq@zBFhuHIcKUbs+SUmh+u1Wa?%82+P}PzADBM-L zyZ5bDOJ}q2?5py2_A8|?=Xo?`*02j(_j4{~s-&M*(z4@ch)Ebe7=sN+Mx!k_D6SpW zWZUrB7qmC-VF8J8BfEN(`@B;4<}2QP7A~_{Tb;zM{RSp$y^6d{Ra1LyO-p*YJ|J4y zf4DG@U)5qP<>b=&9N(pIw=L_Bcl|G>+)j=sDB!1+wbhAiOr1~HNqXvgu4(u~gn&=| zd3He7Pz-9XNN+qI6~5?scI78)&QJ_~8Og9rxB)1ZPEBT`a$ZIvUJ}lKhrKBD8)t}b z$M5lM!LPBrE%dSoezg@H`@yM6amE;E8x2E1;9P(a9OzIl^5k#0V3noS?eU1>hKS;8 zkFKOMM)=atzl?h=q}KD}+Xan7n~LEu%JdXy3?W3qzb@9-K;^?KX!nU=JEHS zq(5)pp!s04OWy1fU=F$hx&zPWMMaw7b^o*+_`d5vl2EGygNBV1M6j#r=mZ5GYni-4 z(=!jEHoc-FUdn){o`?Rq*GggJP_>AujKO#y6_5Z$x>H)kOL!!#KEcZb>w+u!%>dV5^O{@-=AM=zB%hp~-rE%v)@E%fFym+GjkpE|C2 zcj%az)R?@x&>54Pp2}+rFt?2f=$miPH|Lj?#%8XstW=$@mf{uhYCD#nD5*Qro%XXq zX-_FLs%e@G^91++qf*`j>xU04a`o=A{JHQ5K9L*ybw1cMrKfWw7RpWJtZ`V@TXqX1 z=1*tu9O|=wwDfE_*haSZiqq-T(y(K{GR>;K+#0efKWPv=d+=0(L!FgEIg2=J>)LTU z7l}q0E2|;p;{91uhNnNhFbt`^8B(uFzMJ8b%`#x9;r2HBOt@|0={pCEH?zAIDVAq$ zG%iFvK7%IM8U)!<8tiT{{h!k`-muW#skCy0`!4dQ#yBp?F5IB;{mo(Y7y;hfEX*`+ z9S`}~+c%&?bt#4�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%0Dw`4(qLH;=V@G;#DDKy6+%b8a1 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%0AF)y7`jrrv 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
  • 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

    j^PUvcgOw?*~QV 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 dxSS7Xg6o>riI6rjL=I0=^{ zG5}rb96W_zCF^SW_PJen4Yh6yS%waRG=W&?zB<+ zK3~^v=0!-6?UtrDec;Ex(XU^2yTvy2Y6M@J!4h)ZFm_wQGh5oU)aE4oyH|<*ZOCfJ zY+-K74xm>!sBGJsFiOsdI(v*`iDCFOHfz(9<%qzhVct_g@xk_i@GFfO;`SuX6P3lU zlU1VPRFdUDl%ZLmsU5|o8;HgiatmL@TfoT=Z$tmEH2`jiigQ)2J~0JYg>%X3H9+Od z_zyNbJ#G4$5p0+CGf}Pq60~g1HQ0$vRR>ZX!?07|iuBg$-6!#E(eWp4PM5z-G{a>& zTD@oc+;T(Z%?O{LQ>+Svxt|b_q);ld@elrHDoh(!KV7^tW3|0ct2~0(!2t&BhzqC; z;uG>wkj{PhW*>b9^mAWy%>smOXl5IX&7KU7wEUX^m9_qx0Y%5)R>_zRQH+pS>Zo!i z(jHp?c)CJ7_(S+}pa%l?oNk1hNe=|SFpK>{yH9wgq!qi|h0W|gqTQk%;@F}Oq|SO3 z0UhLn~-%yeCmn(FzOAV1eUUijRw{X#cv%2jII0P@muWp((zwp z(esTTvX>BRsWcF00jyj^!%lwO#Xxd}2DNr30@ElvnokpH9+jb?KgbflDv7U|WIV3IwR)m}K`(@pa%sMpfJG(%@O%XTo+5kQ z^Q3stWzQ54b6B3xHp7n)ixn8#dJ=$$Ou?(d4J*A3Ez``GAW(?qWw+=1F2Uf*eXFU| zy~S-Y4S<_`%{m+O>r!#)*qxssJ$^wZ_jDyYA2xXjgI#_&ej4*Dhw~e&^-mD^>vvx* zf1*?}^mpBuhW-N>JGF8WzYX-8BFS<9jT*=^@qOA*kpHUkDgNO7-MNgY`n}!lzm1O% z0_m9#w;U(XhcTv}J^Smw|1Y1c*YdS+?0}V<8lSkkOWhl1UtS5GvQ6GIvrg+8T z3--_S9>*d9R*?u8AAeu?v1azEV=$|g6W**psLM}^(pr0!kMHca`QKK+P8hikknYO( z9qet>dD;P9%|B>H;P|#x+BLdcrZB=m(GfTR9qhEwrv?_?2z= zAHljGiy=Yc*#5fhK|g;PLyy*Ns1mtNryhX3JlA8JG=GwpOQT-nGq}M?bv+7vWstzoA3tr znrSd^TimI2%>(01B-SE8v1YwpXnrGu4UR|H zKfhsTLtq-`m-!o`1k!evjGu|v%hctTXmVi#vK0qugW?R(2V`q|0PsE2O`ZzIyqMa2 z{sa6Jf0izjp( zpbC`!jn{K^JG;2J3sBtf%7s004{#DD{)s8zLH+;LivFKfG2{h|D{!wu zS?{D%>VCLjYfYgl{`SPJ`s}u7)J)TjzvDNkz5OeYl>3htq#O+UrCG>F3Tdq#Hurs3 zI@k1!%2-qJ2mNaO*oE((7TWgdxsH7aE&zSHQr!Z6Pzpj?s0yI&l^5~>0oW77Ky)oA5$NW6F zHC)C89dg#KFXF2;5V zm;!+wcLFU>SX2Q|u@>P}K|9mb9N3?jM)qWX>T9n0KSzP~AWL*Vp8@uj%z+=G4F&W% zKJnLUc^kGBRW>oU>tb+*Zo_FLRc4UBWau? zZphQM!a1xVwnzJ=og zxQ_-T-$}awNMwh&g*z`OsnOQ&CyDIN;V8BoC>~n>)CIp4h+k2++uh&yhr4?m42iHZ zmLCtG2t)%DU%kMS zt{$0RB-)y+qDSm{8vJ%XgV}?!WfaNmDycPAsLeEL)zg^L58dud2x!=8OE_y|fhlIL zF7x`6Xd*ZZyh$?~JDvLC_ZPc*omfM@4l~UxV}JDDE$wxqGccLleFMNWC1xa zJ>S*s`O?o8CdrbNGV9NBhF(BJ7`FD=0*sht3JaVa?-cs6$lCW+O14NU3&yM&7(yV@ zuT`jaHeg|OEOw@h$1!?st=l+%pXp%S-a0QDFfj(nZ4dnZ2Wy$SDtl{nIMEQVpIttR z2&D6JUNpDgHOSTT+QmKh15AslNajbr|d{y z_a+zkxBEKc_r|N^3#u#>o**?BIxEM)IT3^LX~L|_X)L5V`LL|rTf=@m(@K|_?|-O$ z!Tge|U>m(Yv(+wE+)s6BL)41_IeCA}S zXvTOsh|zyMWGSqz*xA-)j!Up83bGIw$A-)j4R7KYX|H;JU^b~tjFoEx$qMlQ>S)Z6 zbuL#>Cza1YhVlJSDg?IRI94<7I8rfzI@nvO&dA_ZziX)b_55NDO4x;V-MC7MJO74SVx`P)gsF{gwq`1KViNY{ZV?*DY z*0Uk-Cb>&#t-%#cJ)(BDAlTxT5ihEp;Wb3mVMBL})&7gzZ06X8-FOjM*e80++u(6NQ7dbtRutGGSUjD|5p|2!$<4cf*yf~>D{8T!Qkv}fv!R*=0c^*1-gK4*?yc-wn()?-KA7$osHY%BZ=zj zVW(E zs*uo&QbLuUKthogN~obH1kTNV_I}^!5az&asi=F63`8R4_P@Kv~_l+_BYO zquA@QOEcM6sc^*p=iCPDhE0ZlKbn`-Bc@w^=tC7hH{!M3#k5iaqH$<*V*9*Q->I|2 zTh2Ub@1u+&Ekj*4?Dm@$%4fWLXK+?Kds3&ZLK!!iQb><^vNEx`upuKKtSyMS zd>l(zepX=K+=fV>I|;4I@esiDR`n-zN^c+W;Z_vLSxUqvB(#V+Z-9bzP*d6IlBiho zbe(G&sw2=U=f)VJQN0Xq7!9AW-@JV7^mSp|-Kl&%>w}h?%JosCx!7$Wkf7bnIu;1TM08hu(}kJjt)H#xh$*dT?tG6LXVXiq zvOvrkhDZU!ylic4CjuX~`kAjNh4_m%xi6*eZ}_D82e`YPPtfctDv?L7mzU)A5T05T zh4s>MO?r>^pzr5IdRHnJM|TZ9XLn&M#6UzBDClj~+L7B&IjmHsSIMgV0-8`D#1g$P}d_lqS;_;Go5soW1J9PnNBAl*5&Ke zNzIB1ou&5{#zOrM-!q9lVrcyc?XGC8HsSG%N||;e2eIrlwbZGxs-%~wBCmUn0D~4% zOjBrSi$RhoZ9Q38+43dFPVmN(EID!{wE-tE`v)RJYd=y>HZ&9FK6MAnjS5^dAX*xj zc1Lo-hcLGpg&mW(oC7S<+48!=5Fw>*ZtM|7am1_nMUjh;Y}xcyVO{%mG|!){j#q{y z8Zm}(NFmItSg)lmr2`E;9j%0^W8dGO6)9nnz%k~k4#L=oVXZAil{(Xo(=t(uEflha zOU3{>96sOQ@jiwIP4L+#L|<-pIu@4otCGyhU@%2VPBrA~i(RdV|abwS9ROkBirYIZr2? zZM5pi9Y8c%l}aKOWONAwr1Bdr4}JTd#6CL!g)cIJ79ZSD1P9~;5(}!HuM15S`@vV4 zGknwHMd>Blm&e&xbZtIGXb*GjS6(NYM?9VDPKI1qOZKYyMaMaFZCsno$YQ4T7UgM| zFANvK>oonJfh|LbjV-S>zQy-X<&yB8_r3GGA4iwXe_K{*@a6LMEt(K(9cT&R9seB~ zmO%Ki_Bil=3?d;*0Ed6$PX8C-sTl;E<}TCl%}Ru%FI) zc-c)|b*afheL}u1a*K>Fpp}YRhEEu60kWMDrj4w`tR(Wm{4M&_G4e!_KsE4S%3 zBl;0RN)jwMO z_uCsWqIF3d0xfJ9|gleg*l&c7(&l8TLoSJm6@kO?XHZS=7Y*|4pqMUWh_bg{#LDIqH z%X2CY{pt?gI;t=$e>V z(t4Dh*XJ4RyYWc#KEc~`{_C$=WDvD90i+^0fbKds^XT3-X)NnF{kGR=(? z8AKc{Kmd2*lUWj$skJW$0*pnvV=nZM???ru>L@{)xu4bwiPSf0zUVEIhK`hK%lhr` zefRUp8|C+TdA7mkp?TBeoSwE>CztXO%irLin5{SnIwmTcY7@|@Hr*(>5xP|>+qBpw zyGozDRy$<((TK=}u_0T0OWI`$d&~?xkq57JyFbf)E=U?ks zu=@GF1A|L6+!AF4(nuCXE7Lu0rVS1fU|HTvT55<}+&^`P2&b6MS~@&eU&Zi!6oa1p&x zqoP3|V1Rz}{s6z(4G48hBVfXUX1YF+9oKgH-HxrN9-fTy%hMm-P9tHl1cl9nRM0a) z4w#9;v6J|LrK!SaPZyfGTdAN5%kIMSx&xY<@1$+{RWY`HdC)t~@NyQ!w7q1VLxozT zkrVTH+5^eRwDh%06tvNvkAmwcp0`!+N~2IpTP1$uja1LYPy8J3(%K-!&GeVEgqye) z)pqYWt!6_nd@sw?daQjfATi7mN2dvy&s=kK_v+wxsmip5aDVea9 zcEx#8;>0(iYCaEp1o2ADwn09)BC;l$cmwx=Ac}iulot2vrx!-}iCasH@pTt2O42e- z;dp!KO5WOaQiT6N(s~dfjgu8=bv7-TSUoBV|KrevxOB>283ZJE{(#=N1jNYA&Onw(EgNzMr&A{P9ZAS5ES2`haXPcln^_K^!3}p2%A> zHCF$k4f*1!J)sbg^gZW@p3CljF{Y8;_n^Mn13Ir!Z$N}pw$ha?G%ubnXj?ly;Ec-G za4=}~Tus^w0|f2yLCfht0P4Pw+Ieq1yKlRp#_Qud5pRhFYpIPBjIo5{zaHldowhms zGlyG{I26L0Np%a^OI(TVZ8=J~#+VSfc|Wvi{Yk5}!P+smk7c*=mNp5nab|tc2`2Es z4)dkywu4=#Z0s}P2j_m7S1eb3na;+RoI+fBdJwN$lgceUmIGDd&EZ8)UUNly$ZZG9 z%5v<~h?ZRTms?u;p0f7cVgX{vfnB|r@xpG2dDlJRX(ZdhS-ZHb;4|YRk;9r8wPXQ3 z#U`$QSb)O4VYVf<=X^^9nhNb5oK5;++M_=6>~44ZafGR43Z}pP%)wWdto*HHAX8V> zb1u85%k64Mu_%-Ah>B!+ZEQ+jK6nKX7@nzXvDORK2OGr0r$fY3rU+8Ca*)=lhZzoR z1yp;82TSqSD3K->$^&iHmgAm2H*EH5`5!mmY~5US+>wy-@X^ZUHCzL?n0bPc%Jm)C z0*c^Xf?sclk^e3?zVH)2q}eG}V%WkLO|>26wA%_&Dk&*!^IG$~6d5vW<)5xnJ=7AI zf>K6in-eWI41(SI;)1|Kk3J(k%i-l3*>86x;1@upd0sxFC?0{ZO{c=J;i3h04~8u1 zBJne5VOsPpn%gwjG!9~>-ffi56x6W@`VXbDQe21~JW{-S_fbRK4d-pm%$DuJ zRpn-AAZGF$`RW3UZviPRH(ZfWNt-`Haz^N`v2!-|Mc@Ug30vKLP6mC(h1ZYzI+9|v zUFIcp^~%A(bt=S2l1GHnBcB*1eMK&K?~{9BZbbL{6R7RDX7T1z=H_pM zzhg6DC1Ha#0e24djQG89zXvTs?_zXsNQ+agrn2s|NEfrz-$YqK?nUd<7>|zk_25r& z6-n?GzfQS%7l2j)VTF80YPYxQO(_K4uj?hEKO5h@KB>zj^BGp9&^2i zct)R;`bPFU1$Ot$_h_>2xZ>fJEG<&kC+@6tgf3-0Wzlv8Jydqu@3^xys)9r4th0*0 zoHi@1F%#tc&GWwGsPQ~idaW$SS{6@9ai_u%zI)kRSe#orpF+T-cL>-T0Z^8C&uh|_vCRYAvL~@ zj*1Tmleek%QlW|)Rf$nlhSRKIYKEyo4{1i|>jbS&^^4d?82 zwYOM}&Ng>M=2fm?L*DWaDgw73bKy9w4eVi~2r1^7tA-|Z8(EH^9*D-Jd(hSWxAWxP zAGp?Zu68D8Q^`6j#z-?bT&gKn-?)VyiVG+7Qme~CDU*bU=swOuXlSL@;(I#FyAjS4 zm8VXsqw&uzC1tlJLX#b6w-rpP)pa^Tp^jZLT-^c%N{YJC+7=;>U4b|HsiAfp^T{Y> z7lK^Si#E3)uQur+qg=pB+HdhQsfg0^q{nz&pfxU$G1_yQQA}g?vEAX?Bu%cJtHOibk?wecfB4r3IO zr|mD?C;uK@9O56fg;^P`iv;{H&UPe7_ybc<5PvC6UI)(%K9Qv zEDCeSB$i`SY(zmLYD4PH3Qsu#l;8TTLZ`)=psje>1)Ak!%jBsCEvNP$-{?5cQ4r&+ z1sD^@qpu!SMQ9Wz$D zW-S!Tt%tEvaEpbe&?5Zw!5n1nwQdjq}p*(~IB_%vBzf*eL9Yw9^5*SO-V_*qCYBpKU9OnKzv^tL4@Np&q19 zoAwj%K;Q^Zib=Z|@dUMsZmEgcTuK>{l1W`TgLeJeKrSA>77moX@Hqy|ztny64$;COUu?YlVd$99dW*Q+q; zbJ_Z`%00qJbD6gGUu8wRciDpnJ9Djz}VA40Y6LdIgh+EUT`@w;o8pAETPFc zPLDI5R0113mqxW%S4lYSW(zM^RTHUJ22Zx1mTm<(6uy$k?&(H6cWJqi_9gpi%Y(5- zFLAyZ>ENPE%wHqqe#A(n*WYV^jag%yW1}UeCnn?+YwuAoW62zbG zc}43BeVoaEEI!id8`&|9WynD@w2vk5e5s_z$BiRZR%;QMaHxM}BmwQ_cdn?hXreoZ z$Zo~)gJbt3+9&dUZRBih6Q@g&_!Q&Q@Qf#h^84vWr5cN8=vJrA%8ZU_Gmm-!zJRu{ z3k#3mdL28aScGSavlSv-t`1=-)J+&9K6E!h5qu5%1&}Y%itPHTW4IRKl!#$GHPqp0 zC)lNQDqR4_;sOGLI=xRg&ZS)n(cdz#8OSVz-@@^Y)%$Ky4tkHfg-HDV-eEKgQAg$( z-8a;H#z!%foSNd?l_1Hqm=&4lj@uXqU_t2FS+JS1(JWU{KkM+3i4Oi^F1x*}@85Daz@^f-_9PmEeq)C6Dxz2qQl*q~#Y6 zJ+_M719*W{SSzK_kaYxHXyFbNQ9h6Z#nB6>tzUm`FAsW;*oJps_5hVQUKQ2?7=US! z0;Ox=5?%{e7$@~L5Ij(&M~>dQb`i0t^Yw+O)vcFy$IKPACz#fH7W_ZzHqF*;R=^O1 z_~Qe@E;EgV<}XcIK#F)#@mRC3HQ<&Cq*?-W=57p8pZ01$4DldA|)2^URfiqYiY`;ysISu4CL=db!oYd2ZjMyqtvBnlgPLFmT zRQmovQJ1L3wQ+%+-lDyb42kK*{{GgGQvUh8$#p29Xk<;u^CbG>P>wti_T^hy=yU{U zk?!*#garGOoEgW8H@w*wk2NG!Nt%d2Bs^sf;7gBYLia7Vtg0>?%a&$ujrlA`l_Ht1 zSC@&AIcV69^j>eRwNy{4`MYCfG&86<)4R@DY>@$^yZWMbkVJ^oe9R)umvxuh{5w>} zoM=Rtp&hh@c8k^qAj)(ipLOUnD&cPLbj-pALK28av$_H$0l~rxl@f^$@fY#A{qy}% z8xKSvF}o^m`5wQ7Y$q&pD481g2zV9yr-+ zSg7zWxPJ%gL&d-?{KDpS?KlFjMg0JO(dX&Pv2=!mL8GU_&`^=IyQyXmK)-d=UO2Zg#x;=K^dvHy(5{FS&Rgh2*^bsVY#1LmTK z-O$JH%fAb*cYSy>3J9#G!+^lb+*VKSc^V@^+2%EGd(OOWOlTfX&EHLHDAvQ$NA#EM z;2yK{D~UW-@Q+X6EMufLI>cbdkaQM&N7QbNjLnAjX`YiywhVfxjr||iT#lU z!0bjupZ&z#UiH39#4fZZusLrl3JM@m&8Fzl6Yutt5Z7A_*KfI46e<=pO`SkCY+RP!ED_oi zR8@pFkJA&-6+7@&#=Oku?es4TanyBOF703+vLT47R7?r@yXHf@L{;X8kH* zaHA-Kd2SU%jS! zP3Vu4X!OF)jXN{P#um1xLl@b~zL|SpsjiEf9Oh`bo5m)?_tpnbxR>SpQ6jio+ugbN zRYJ-e*x1vBv=9EJ2tj%t^fGM5Ong>m*hRqkD!Fn>v?+Sx2{Cp}6LYQg?b=ZV?ha8U z-ttAc>^8EMX+&I1We<4M{_f^dKR(WB(Xs9-SOnY0IuJEeq(CTZzS;ziM3WU0uB0LM zV+JL^r%^jdUFmFZsVkPNdJu4(1wd@T4`o=wb)4eh>73_lIbXJ4+Fm z^55=0rrq%4Zwk2=!ldYnEBfzfu2NIf|)lEjFHoo(-Uz%;{YsR(L)e-x*vFnqG zSdQ854g;d$a&v@-8k(O4Er2iv8Ka%+b?@{sy$*{jdlxICZwfO>^{C92y_(A-v5_!j z$s--{X`xIu@DXY9C(9@Yed56?ON-8bp$Zmk9g0p@wC(J zOv7*f%Xnq;U+6wB*N#y*+`&#Ra>jFu&j1jM`|m34gf|xYd8yBHI~LQCFm5!quZeO;wnOiPp#Zl08U|-^z-k@)p)pJ4cS8Sxn zYGQrdvs>3+EoTnRongX2sM}r_rmC)iQ23g63_+J7Ey*`1^uaRg+5T z5v2Qn8T4vhH!xX%HZSO{DuNlUnYRdJgwTI%ZwC)xH-uyZtemoHZmS-e_M&xo#V;j< z>7@@yutm+O2$kumcQlUZMFFWYiNkDyK}^gxm>OS6wBzqPS({pPu;S=f%-6^4yq`Pw zk;y0anbE+)Y~3C!c;y+1R1ipuE9P~CiSr?%cl8`K?bAA1HgZ~coI*H7->?n1lhiyEfBI(eMb(-PP|qeM+w@1jUCIaDat-Osh-y~b%}gM zq9r}dco#XRBeazylO0(Q5@ZzVQ+H_06+bh%i^619KwldX$9V$wl03?VIli$fDRza6 zwE;Se7H_%{^2B!deuzA_d$XlInTia!pC~t4?CUoUc6*p4hK@# z&z)4*%!0~Z`%@(4xW7}~Vv&N&=o_~)POWlr#H`)NjwvGY<>jBhd;(4o)ebCSBf|DO z-o^cwP<^Nai1yvl#POJE0(oc9MiH|W69yxAy+~3!SS`t(@7W76GmW%7R)B zsRU0h1IpHED}xBJv||ptXF_U_m1FBAK*M@5A^E7-MM~@J)M;sxgOgfr`KO%hIAlFCMg&vKKOTPlp0(^=k_hHPp2QwvOR4mk zLuTqipNp!)v4VX6_u38$e?d5}?AS{$ow8$|W#8bCtBjfj6^AXrgs|t z1@r6pO--F`!e&jYdoS+`ZXY9v>Vw)|#;OX*(E1??^034Dy1+%|{d;E00kM5m@52zW zz~>87gYJHp3+%)1GTmoh&U%_deN$lu%^olDiZeTh%0{Q3nkE&TKX|+MvDPjnUrjpm zw{N{r4LfKA?aM$7R~m}#;O5u-J}L0uv!h6qR9jNTW7XsDMP=EWo`9}qqcSd z+X-Ikf&5)N4{3>**PLpegs(}R?PNOk>{c?P=pm(kcVqk#{Vi&U&6pcRFxcn~kd9mt zJ4sfYwJ|y z=$}F??sOu}-XGZS83l+#LSF527IzKpm)sheFA>wZ)2rK1k~%L{T47`+8~jSHdw058 zvC_l9?UsV9Dx5QQJ@qXn&#^8_8^mWW1*g)3-UXT>Ck$uBwhxeNoq_Hf>w}f1N`Yhx zMY@YK#&0o-C%KZ_75l2LbfHLI~kTqh?v zIjssy08SzxG>kIhmd17r!3IK8zR#MmJ@vr7*{ug59X$5QbSYa1W(~88;<`bW%^{P# zRh~6${7r{8+?KKgDnFRvp>*<4`ocaOWU&P_$gn3M61)Gx1j*@TEZp6rIdMd4N%}u| zvc)_>eNqf+LvZ_P;JUdWhAXdYAD7bbQr1n!Q}3p?e$p;Fa~c;N6XMySxgFk&n}l-? zv7Q}zzKGgb=bWkpx@CX5^=(-_6Df!9cD`zxwavS2KL_r3!?0>_n zmhb>WC$&qtR4#L=0bbppyT>e)k>c zDgx}l)SJO{@B@&CrIW_1m{@u5zE|90tV}e9E(3bFgJZa7<8J&U-PB?!tM#C!;8Bq9 zzhh?q3tK$|Y%Lc!cZ%v6%(JNS#|L!*dn+SAD~RLvbX$VnJ^)8*AE=igD5biP-KH(9 zaNV{NfuTmc#rVrM_WMN+nv2ViEOv20TX4mg{sDqc<$iB~ozJhvTg_h)U6mhzpu&MZ z5moOQ=*tM5$i_nVCRn3W-RS$#Q*(MRGgpISwVKz|A6^De10vy zV+UJ1MNjU7E{ui^s5X^?>-XFfq4F7x8!>DoEaVf5FNySiYbTwuFF0`n@CDu5e4Jad z4b`c)P+=ohlu-L_T|Cs6p|YMeAqO=?IR1P+uvK<9Z;1)I4;?x1T2gy8p!%Vy#D$&? z@!#r1_hGxGim`WM)YBs~%8K#Q+8*y|(uI`BL*p9+>BVYaU zKGnZ@R!y{3)j{kiA{(pN(DtK>vh87hY0}j(OehC6FeG!4+x=Q?T&Dh}WJZ#3n-V-_zUwnw0aju zBu6pwy3K({I3$=`n$y?dLLUH_d%D`_O zy@!Z+Kkz&MQgzQ{p=<{MUJ9NH?30atwdKWmgYASn&Om)@{)dcy8gB{`-9xUrKD3Q0 z-6HwO{zr&9689HHja`9TeqBNX$SwedubE{4FZWO@S=-Y&Jpl&%Ae_5!-jadtUya)% zF)kynz>5Va`6Wd@YmfJeAzK*A#|GY}kZ)O1cC@nw|8FS&|6E?CW2z3oit&vYWvtDn z0ceWBJewdUDkdtuF7p=335>kL+5Y2QTQH9rc82UJ*xh6yJa9Fqr>(h_t9S`zVbK0MS<)AbC0b-7D~~ z*Su6|&9SJdPpaSRhQ2VMrRhiB(m=$F4g(ufpT{;^Htn8Fzzg$B0aKuHR~TdAY1B~8 zc{R+ANoJJ7fA|oQL4R*F{9U-?Xoc5kpc!H8@g{K5U{M5|=wB#%$a}UeV}RHP&M0jM z{{;;M)D2qqOax;e)N#1O`zOo4`TmPv2gXj2>vp?bq8~Xa$eC3%Pqf*I{QUczCEvCH zbn(0^j4Ec<7`>~ITpz6;1SBOPi=E7Sk+B5r>RU!e4lQ8T*F?7^1KjAsYyiO1jfk_s6=k zptExxgo@>h{bXDhpcKTpjmZ|vriiE1A{So^$OvOf^mz-XPEYAGoC&_(=oBa@aBDkwVx59FMs~F%)$DeK0&dv0t{u40pI>%HL+a0&1j|P zHvhB_^iIYtZ!bc7_V;~^6B1@jI_JzgMLKf!{{s70&u2ru*+ZA5N{ber5}Rk-w~9W; zymv7ZDLiDdp8%vLu&oTpAJ4%aeHxG9i;!x-osMxChpYr4uDI}7b6X!Bl|ok@?8%o~ zXz8>Z^$3$i3H^=l*TAkD0$oHJh0od1DB6&c5($_b`0C6XnL4S6KPGHg$15Z)j?2Q_ zfzzut{DRat=C-X~1L>?j$rg>2y;0It|JauK_HyHS!XX<&=0$r-y{_C`wcg=-(06C3 zkL)7}%4A|2-U%I7X*yL!%(RJhEY;{%mQ-Ob7f`q8>Bm2<8Mh*szX-1DR_yJL83)`0 ze(4sMt!40bQVcT)N=1RPWp~=vZjhv#{dc;i6dponCk;xx#=8@UKlfT%gjZ$C-K0*A zc}cMIQu2$cn>vf*EvmaOi>>-|WQw?(3#?TCMv4z(XS=WgC(o4`XzHFzTfySPS)IC0 zcr??>>Qq-5w|@pU8QDf#L+nwx4z;|J!5v64gbc;kx|ljfy8O*uGmDYM4Zhx1?TX=U*aU6YyLy#PvKt;c#(A- z=)KVas4^eD;DhkI!1p@-qFfd`%=dwgAAB08+;#8yDufLYYr0F!$gP&~Ha37r+flFEpNBTo`8U!6(o&q0u5$M&G*X9q2`Sr^wl>xAzl zDFTOtAt)sC6TQVXe`|9SxA1wK$N2Elc%-r6$xX{_Y+c#SS$B2B#5Cp;InQaty^y=8 z^w(xxJkj+LD5D0i>aczs8)Ul7s~{Dj5wb^2Xqy&Ah=>5gWz~8846@lx(llRlm(Ogz z{C7xRq;8lRs+4J9p`#!%GFH7`DXgl`XlY1%Ws&AfWa4tiQb<-{uU z3u?{A65U%~hQy5ciOQ7;$m~Be{YSCuuHJhf1_9!MasMtJ9v(T`b1Bi^XJ%caSX}&i z0b+cmm0+=N4;BMfWv{7~4lg7iB90DAYB(G#S)$H#EH5rP6_=1sbeN0_E13g$N7$<1t=>$X6QLZ0X6e7EOuoHD~b z%vYjJub7C3w2VEOGEj`6h=>&g1*KORL_JJfsoqeGqnz;_XOGZMELU>DPI#p0s^Dy# zQ~ObOA_qgVX6NdV9FF5Xxxnl0UYMsCM?^F?0|q`M3v~M7(N~gz=r9%{=QjZf*p;@Q zv&k{j*9iRy0QVCH9|_Lm>*!0`aYX)aZ9Sq+ubOgV2{&`9+uf+#^LC^_v(eh+vDz1- zO4iv5Lu7lm_oTb%D>GiM+BL7yO1tolm6UqliVMp}YGEJP1|fGLqB@3-zT>)%^RgGO z5Kj$r&PPtqnKv@E=c;CXiqAuz4Rw#QoTXS}#e(^oR0W0Xj|=Y%l=Cjk{#UtQvvK3WwonnD{mjsVBj-NL$j@sWIojImbk+r0rcjU;{MnCJ>+NI7}Vk z|J^I1K64-xRXdkeMN}=0BZj1%_dV!j{8fbnuJjhj%|EyCrY}>D?KF8ic4E!b#v{`h)7Q9q!3rJ3xNrGBVd5Uq>xp!QG(~V zP=5iP82u5vknN?IyThH@cVRKHe&Th}fNiMAprW{IPD{kLhcR@Hqe3k(OEH=1qjGXd zW0TK14LOjm@H&b(QmH@dIX8uUrkSI>^3{y3-~!rVvMJA0ZraFzn89-yuE z#-XvjIxYObLmk1#YhKX|^iAULJ9H$mNp94Qs_C10Qi=8_^9pu0<}jq(sM>1VgFU`R z5%snC-j%xTYRrr?8XxFbwgiRLpxSEvH+i{4<%O5myC@ZYS~B^on=N2y^Bs;up`h3W z&9Ot!KwJ(<1t}UPm98c}rS&Yuv)LJ9c0P$kcjypO=T6*POkoF1i!k@A?^wrj! z;13>rFBtlNbNaI2@F9MyF!`QlgSqgw4-%KuTB%;XB&od{oI>Lj5|)@`!b6x=@e3NiXwG)+GnjTS@uKsty1{|k&qa-dFVpiS(m40*;t@b z!k0&-c-}*$4)o<;j-SLU#1ehds#}gq_4iptK4EA}%P~Utr;%Eo*HB+;Xz~(6&lp*Q z*D8l#`CwX;NZGr%XFV=J$yhc1^eztQQ%&`^ntuPWU^Df2=UXX(^+u(L3?<#S21y{e zmT7;Y$0LW%ko^fMNrL@FSmn;N&k0Djq$Tq%<+uLigRxMl)|+6`cQ^FIarMAyWQy;p z5}q@HDwK|9vsW2!%Q$F%{sK|*M>WlP1D(!Zg5c2{VU6dfPFK0p!r%f;I!!M-hCKI- z9ZE`u4%0o=Z-I;MCOH^`LL~<3m)#BTs%-waQ%&{SlJ0uGZdOJ0eF@daWyZwYIVK zz7SLOdlw*c)STttsUBfYOd{5k{eFY>scGne;D8lygjn~sO}L-FtS7(>05=qn7b0g9 z>5`uazrjJ8(~Nu?<*Fe)!q@5``+?Qoxt6;!y@aLupGLx_@IEJf5}SNp7f`fS*0nSX zi_%cYLkxw-1-vU zr>R}}HJ??4L=BK^z%)!%NsW>D(9f1X1_?wCswTZ;i`o^I8X2J4wAf7iI3rjXaO(~Z zLM+-0-7p{yI^EB)GthV$v0?0tZipVAe!i|h0ehI*~0o3E>-JvRRm_?5EKadK=-J&Yc`( z3Avmk;@%VkjC0IS2Uy<{FLy2!%f+DQB5Em#aoZ#8=IgT$o>fQti-K1!+>vWxjhP=d zj!OA>@XddPLoC!{9^3+sQOk#2Yx!WH>EZbSX$||uTq$pzRsq%Hv8uiA*%EewNceV8 zwrjYifG1F_bXz<#cAAP|J7e5zeX_JmYeH9LaN_N84pME+N1d`a9835~QuPy0Zy>&b z#0bR8NuzPI;p~oM&n1MPgvNxsf-@bJy~SZ%DNoesVy>{R4*lo-5S*(Rhb~lQtYgq+lY0*T-GDBQDOa;7#HmEfH0Qy4{E1EY_mSp> z*!u5hx1}ZR(vq(}FV1a$$^Rui{a9K}?ZsJYU9mCRKU=G}uBN;B&$S2_#g7?^va1=h z_DcjRap7Y+E|`)xQK=Gu@!BzxdhObd74PU(qha zNPC&MjM;vSq2caeS*TIY>XfHs%xIfbhH8@VqVO z&Kjn155>m%!I$hhQc8Xu>YV>XTw3aF6OK)gjRPAD{V07Bp|H^UJ&|Qu&?$Q|;~R4w z|3jr6K5EjelJ%}?iWA#{!Plf`0j~bsA|^a@i8f&oc-)sypTFRczuo(EOu4qv)<7#t zQJwvDn=hH{<4@`cC3%&q@2ZKD`eNHYH>`TD)y;joy)||Gl)ac5-)_OC?hSN#5-gW? zeJ)}{V8K1TWp7e;S7tnHcK3xu2XRrrD{swkP8@w=a#v&tx4gUF0!tBsP-CoKxy7?_ zaDfY0S~Z`Elf|gj3$duUOm3do@XaGujk9(|rUG~Et76Ly#dnNyDarc@@Jmt;+t=>- znk-%qG+)%H4LcDdLnTfM;@F9OGUN0I>nhA~f6{cesw@SXWTZK=Moq+hc!|S6XNgaS zWU6{wyY!IuCOSWX3Ox59fhLmFjhHl9h}~X2!2por`T4i?sfq#d_Gx=LNS)2k8@1ZW zxLd$h?g1M#bGvZFX!NEGt_Y2LN624D+ZG|7-g7grkbKcXVCso`dwG7+E6bGJf%@&9 zCoTDO*A!Oo!BwqOzg@Cp6abV7Uzz^|lDD+DpI;2m5ebU01#9@whP1k?KPiFgRdxNzg zTrpc7q6h-LB2cZjy4S(8W;F_d%8$HhJtDtN8Tfe55d>(=2$#i~A6zY)RsBXT@BB+W zXmiI7+&=$`q8q?g5k7N_t?WaVZWOgkeR?fr--P!?+2=ftb(42^$oH(7b;ZCgBARlG z(2GxgQW@zPjU1S0VjAknw7Cv6HNoXStH4}fhNxy*%#e5b8JrVh{Fv;y8udar$*JFKuWY|b-uXmPz z?xC4lh9e%BpO+TI&_D$IdQctbfV?QClCMwuQizA<1q?-eF7BX*b+o&WXhPvAH}k#s zhhAI;+)=`jFyYrYvM^gjJ9#%n)7(R0z@k$drIS6*&l@rLTw(rg^Fy-7=&Evuim@~C zArpCP<~u6hJUUwTouo%tj%G(k)RF0m==6QfC|F;c+oSF8y3f21_jL_Van?*$WNx2r zqGwmGUzTpO-$i-Rq&mXF@Ot)p6_ZT(!;u9FJFji{pqZi_gN<^>IR*x}Ws8ONnU5>g zlVIU)#v}njC9N8lwjoA|pGYHML_V3)0t@6bhd55RerqxpNZu9yV4dPFag&hba z$vn_P10;vq);yCP4 zhdu;k6I97)91l<*;zs2T`$r=Ea;e@d7nC z6Gr}ah3BM4oy(x-p~*ptqVJQsF9|}#zc=tAjpvPtc}R$lAu>bhEujRqRHLG->=`Yh zwn~zlI!N}>7Zv}o9~@q_y_Iu#)qYje*#aScBf|IW&QaN?fi@Z#`Knm5(k-JErWz9D7VetM%K$X_Fi@20AxR3XuRU& zew%rYS{Zwt-cA;-UUPW4?tUv|?z-7Gj>qNt+>^XBgKg3`^(eRz@zUzdV_<~o4I$mw zl%Ez+vTfq87BPNrRUMQ}HLUmV|4qUdk#uYxT6UXer-07%27Qco1d=Mltqv7iI$f8; zH&bC-hR)2@gaz!*v8dm2!`x81IE)qX~NVlR4HWva7g4C2HkKCSk+JQpDf+ffv-0KHcj7w&zCNe2crk{jKCa|1x%t94S<7DqW?^CAyq2eVdVsMS`_dSZ z7|38<%ljI9;aH(Ag?8+RY@QW#^M^s_2hzzKhxF)!mDWYY3O4VaIaH5C*Bb27RJ!Kc z261on;ocv-tL>Kfi4OZ;F}>_XRXghM&HGPSUv!@jOkEpF;B;quhI8})?l%VSR0q6j z0QVc$LK*feC%Yq<5}V&LauEA^n*A=hnw9HF5j=YxjH#X>>+eAAUWLP!!SDv7g4qek z*!|*glkua-H`idda*%N$VA;e@!eg&|j@nQiBXW~)8P{HYxw+OJW@|{4!TzgCc9J@F zN>mN20XahX`PSUQW&$91P0QF#a%P>Fnq#p z=wBNIpB2QlN(!XU?XPoTjmeAKg;FbL!wI=nLK(+yL`6V!n`K%#!o2*Wsml$q3ZdvY zt_FSYlC$;;%-sU~@^XwSgXOC#UO=WtL|sWl>|$Jl`F7Ll4}^9-!gVw=$Xc;5ZNonw z*K+H#<_ULyL+>~ADDY#-N+PUm0Pi61Gj(7XewiZ<_x&Xo^@#$W~Ez7;>hoqF0MNJx&DSP6wWWGdwHX)gdJ}jvCd=0++ zioB1qbXbn7_Ii{9@l)ceBHk`wFw9VXan4?L^9&)jV=zc|>mwy?zURog28l?sKVV1jNXCd(KqYLWW{Iu!H?O_&+>xyy}hk#^GMfcGXv@8z+Jz zL*3NtgN9&FD_57weM<&`8Z-Atyg^nqlcSCsZMmxSE|SehZ7*ZrZZDP_o-C^NPr_4B z?RE&9)C^I-UO$@=5RA8Of&cQ@_j0{umQ5$o;tDr5@g<}Lztyg8ik zftzlh!+w>Qdkbk{r{GyMuw8Pu$2@~KrM~sHf!X7zmFz-cc zzEgX06I;C=!OD2Xd;wjgw%{5!y=%GOv;?gc6@QpwTv{h3yf1-!BrF1by(q>nk!lRp zu<;8lN{{DxgiumH9W)J1T$66uKmR4q9Q%ka5DmAU#{Jye;@~=^wv|6Ci#ljiFE>9~ zZLVUX{5(CuBlOCc(mC?m_aT)^7y0s2Zw2QJvn8y=a$O_V5a0MgO= z?!|J-O?jb+^fO0;?zC9zWiS(K27*F@1o=Ft#e0rN-sI%lk-KB$t?TsJAnj+I^4P0# z7dXC24IUDr*`-Bg$_=Qaf;K;!oRwY@3ujMz6eVsnItn1ess%9`pil_00{2KU=L=%< zSWkfJooeA0OQ>Z?(jAvaO}C>;Jq9?Mg^KA-D?*Ji334ohF3v}VIkUb>e4y}Xz(({_ zDZrf(tFpm8B5gb5IeQ5}NlcFreqKwpJma)iNdoPStlb?P2^?Wp1qvdk_wGRGJuh4; z!*NmLH!uoT@l6=f5L_%ZPJ*b!j26WliHT$b7l~-i2NG&eJq0^rI(P|JZ%;T>)r+Fz zrSgIwoks3iugwU3M9AYl%ad1dEs7%cA+ad$hh{SjM!X6A$YnS0w`W1)InIs5^@1%~Q3 zHOP#UZZFGq1+}@8sWbWfhc<7J#?yoFWF9c&7uWf@?!p6HtpCQKY=m56nynlE6IbX3 zA;F#G_A?-@7i>JB)}>TXTszR!hbPAprWM>2tGCUAqAHZ*q3HrgP26HPPm~G2+j}Y7t@rY14fKuugM%!Yl{)Cr)C%=i0$)M^c3rU}7T9>Y z`x-cFhz{rjGkWw!r5nk$oPCFXpO@6#Fg484%kA_-*=v9sujQ3fAb4ITk0<-#N1XXb_jgJ1TrOM zH!qwFZ$q+>$PSTVM)&q7r|-{oLP7DRfR?#B4jaW*a{M z+VOYwa{tBAU%Jo-9w@G>M*???A`(B(g!fTr^P)$3^QHjakCDkt#j;&|pFW*@)FZm@ zHUzMro`RH zroU7(cizZ(Ur97;8L=JAq#(BWGy14R5_>?+Z~1d9@zL%fGB$(1Gv_V zR2+^*tZUHfm)Lg!l$!^!`9i%o67Rv>`WrV_+CM;@7WjpmKeRj~&Byz1f}47R|2u9T z-24}AuKx=+$NzWSy!tn8?(#oz^X5ja=#khwrzn7+#=;v}Axkzq+2Gw%!_id1uLz)& z7<=WJMpK}y@^nBD#d6#QPN=&0?{L0A()5bJCtNgvtOa$Ayoecyq*&5GVP;bbki&pl!`||5>uFa& zoD7QSO8_-~&&CKU0!G>}m4f08K!mi|ti-zQH)c9TT3g#`?l6oUG}Y@wmJ^yuzWSy!zQNYyF` zql5$RhKHq|@4Uv+U&uE-mfy~`p!wUs5qRby`>8NerZ3Yb4xhhZ_yc~Nm^D7=iUn{k z0N1VdPVsX2Ws$yvp#O?R)SkS5`jdYL#MW~es%l=rebkinK1q(yQ)qt$;;pxY8ARht z5ZAhW=9azs;q1}s(WOA<4|f2ECNTyohj9q@+WyB!8Rxr@!{<%;r2mb{{YgatPlJVw zE|}>+?V`_>**N}^5D6)FDOFI|6L%Q@h0OnLC;t|x9WjMqVMpTFxyOjy*_b?FfWO5( zH70r?jEPDH&eG~yw~(hs9Ip%Rs@wEHV;5RQmjHIXMX_P5fze-j5+x%)aM(f@`or$m zQt^L}ODe}6X2Vi1F|3yY*l58?PAMy(zzv-M6 zw$R?2w1{kOm3UManc@BLN)T$M=FIQf z*OzHs?r^U=cEt9vuQJ?*C$GFFQF4JazyX{Zgfea)yYWxHyrG>s|GfA=`SPB>`SRl~ zBL1Y-sQxf@-3rJjzq>06TX#`O60(O#jZ_kABF6$y@#`q5M@JrTk5=Pp!BpZH(4s>s zrqmOt(4loh}GFBEX*ACXMstAwgov49JEKJP8OYz>N-zV&e-eTUkem zTe{j3=$i;X^B^CmYjMmEUVlOANo|s@%TA~#;RI5TFp0xR8H-F|qy(fWe6mWsspkUs zPBOf06S(LMdE}{tD=Dcl#`(Fq@3_?$7%C9coaF{n14pz#bL$HiX9d?+8e&o{R^i^B zGkoF73E9@QOA5Jpx_B;o_wcoXCZw%2$igHv9^9(;rL>yyQxQpv>%(->^FvhzjI~2x z+~56+T*VWw2?mX ziOyP4h~PbkEm!ry@_VK6?I~b>2M+Y6bC;(oQ0AagTh((DrhgsDcYMJ&0IA%h=fi8f z7B`)1$E*VvF7IsILJ#O3too{C#k;H;mN|6{DO3&I=mbq!`&}n8cs7-qD^|TpL>txf zo_zc6e)}%04MoDJL-|eM?V}2)q%p`wHJCNq{B?MumxH&C+ZrO05uvXBl}`!~o;(qr zrXQ$FJB|DaaLUhR4ZfZO@1B#Z78`sRJLj34`I}ImDZfLwX*R=5K>smMUr_;soi(u6 z7>RwRem3-~Pb(5jfYkjpep&u`6<6|C?xh!E8>Ly&5oceAc&~31NUscPwaWJGGH7X; z=tey!nKaS5p(8IF#*?u~K!>t+Wcl(y)ie0Q)4JG32Ek>79a5|md3>`jY_o0iD^&od zp6fOg<-JHA&vTX7%HSPv6nr8#cm}w(A?gt`1c|FBuHc)tc3F6Rv0SkzWEatPX!dh} z-^#c$$ll%!wihd-kCp3+#sMSFwSo0tSay8UZiD;bF@z{S{>7QbjRUSJJWM_3THiuZ zBszw$<6Mv+icKGFnC9MV3*FeV8BQg!y=V)H((i_sMk#V3^fDl*16Bow4m%)`t zhOWU;qG@66VwP^=u$FJ@5LV3k3oc_zoqS>+`&v*sLs*$oU{;xdoFbNP>ZEDn*MSi*C?*d&E)V)I0YWXHCN@gJzBSZ+x8wH z;kn8$iJV61$M&{}Pj326!dG4X^4STA=(m1Hcmtwsl3Z2{d#5@8Ke@T`tX_fTx`|e7 zZu9pmoEa-HPzjd6x35eFFe#NpbxqtqACdiwW54uzN5=5!n)kIUC+#(K7@FZBN^tlw zIL{FYsEN4iYMK87z-*pth`%aCxZ&D+`W|}8V}7e@oZsdj^9){``TXsYocn>7tB30{ z*S%*i&ZbVkh(1jmeoG6~aF#Y)6||f0s9Fmw=JBI9*ywI8xTs!mii~W{oN(DRD3z#f z2~4Lq6w17#QSoc0m@7!P#39-Lzui#HP38l zoF=+wgCket69*FkFFqsIUO?|V^^L2s?PnZV*}pilZ~A~M;K!%tlfsietSMEdvzv&7 zG4*LHUKpqQ8N&lw++KExEUmN#Do|(u2<`z_A57d(oCJ1v0(zNP!yV6x$C)H>i0*k9=(NMu;78CbAFpCr8cgZqrQI;9%8fFbtdkBBZ`lG z(Q9?RCOLIV*{Vc|Z?^K_5hD}u5$V6Zl*VtIZFXMLhT@lVLDa1jj@Kmsmzd!BlynN+ zg?QIZckY#Q4tQ(VVX3M`nGa6zQj$GJtm!EgP}I%X5Yj%crRV57Fz?q zY88V?TD@LcS1xm@n_6pdVU?_!49!Q;)uyZPPm9Q4Q?M{7ELfh|5bYKyJBjo5YOHAz z!6pK049>CAdjxD+`5SI`-htcqMECC}@$-t7wh{(6?(~(cYS?$JPpNaBHzh^_RdZJV zbWOPfG8Qy=Bq1({O<>skGVZm7Tt4UB%YtO|y*3O346ktr<4ZT4Uld7dgCcgR2e{;@|sfVLGVs5Q4^#Q5b;sKX%kr30r#SEBdoPJ#*`Y{yP-v}dkK z8PoX_rpPJ#+%72I>WLe?hJ4gybFVZ;4l*IIo|$pRaIEZJqPA^UEMc8m{KmtmA&pC6 z9&s;b;lYdgre;agN7B++%Gb541HGv9!G$9${xIs@Z}I45Z3+5r!($8)b7 zWDWI5iI4U~(P~u>WL+LTQS%-I&mGv^ulWYTSLZ%oKK%+2065E6h&^A+O)D|1tbgKZ z`Jq0pg%Qy?6W|Tn{k^lQlPS=U0(E69c<(#(qps)F{(XTRS9GIe%G5hO1h;G_s(#SE z@xynU_ToOu)F2ixfg8a`_w@9xm!4=H#@tG4V|H7Iamd3>><#AT$5SgnjQEXoFoZB^ zZ2peD$~+wSTKXIhe1M^cw14hCt|as{3u@s%YHF@kD+oV3k>H?F`xCpZXSz1D;J6RY zC!X=D;e*>{?3|bB4k7>5jeq!Ey5@NW=BG!7VIhZ+0Yw^H0bRDoQW*iKX2S6jNWxZ6 zhFs{bW?B3%GCpHMAW)Thji*(0wkT4{5!Oo794u0QAoVlE_B=j(Q@A4;(j*-(4*oJ7 z6%{W(!FwTAps?!-nFd?gx_5>Bt@UK;a&N8$W&3uBZN%ht3+F2s@^flx)Oh^K^3cGU z!VA<&rsbco^Ml%jjG%qnFqIX-tR`Kwk`}41m$BvwF{O4pEI-eU7Rk?jEUo?G+@Sb$@=|Q`> zzDtppq)_LVs$oi!2U7u`1;3>Z%Fp|MUwm9Ka^5+WUFNeC67{Jcy@3R#4=NrgxAJS+ zsLpL(zrCiI0Ju6X;^*KfFLOJhj~*0*-LFoZlt9@ zYsV}?ckU}Qbmsk|M~|mkhU9WgeHs~%QhnIN(R6q22Bee%`|=t$7Ut5sFTGA=eO1B6 z+Aend4D>p-0)oymq8L9|yEvb>@ZFbT^nbi4QwE2JJ8 zUbAalG2|n^63S!0;Ecr(VobyyBw&Xx1uM_7C6Li_fa$B42+IGmtssNYV)SkQly8^> zq2ln$%?4Ng*+I6$b_mC2}pMI$}$9-K@sZ0=!r*kkte7CpogO22Dp*?^d~sdL8=+$bpHuU%QGHq+? z44ncTHUZt$`R$43zbvy{5KCpT!vpC6%l<$LeH?e_zGCnb4HrpeR3x&arPFcvF_d5B zRip#4!-P2qTLAW%#Dto}Q}5%7;=2&gudVxRQy@RW)g$N6GV8=6O_wCH4^;*$7-n1C z$!qlff?4lHm|nTw5&M^y-Fx*jfP+8`;cIvh_n}&mhaU_9bVb0+m}ve>4v)99&iiA-?P4T=Ep7U9(`v`6I9B7xM!y9l;n7e95zSh~G z>pOt@GuvN)`Z@rp$LtFg(o9u4U^NU{GO?2pT>zXFJD_rtj^`+yfo+|eMsPho@8^2e z^e#p2oe}}FT`SiHWB@*0Hb)NwJAA+#6li5<*~<9H#q8m66>^@?#_U4Hl%*hgqI~2w zH1_*kh&rSGP~xLTn0+GVE5A%Un3FWe0#QKvpegSaeZt_=TPOT+l%}9a+XHJSkGwj~ zS2ZdwTf0(sv)0a|&rTrzcft<8lFbtj(*HC|4-;0J}WnEI4XyN#|ykLkm+A{_H2uVi`lH5 zKBtm}QV0lAX!$t(g3o=9bBOl&^jL1UNh>;65H`0F?{X(l_6{}{jbGY5;E#0~EQ{Q- z4nHvabIrMmKPfM$R62n)=IbNxYqnPC+L{Y<6SO(I?U&4FGn$YxA2DsVTANhfK_YK< zQ&op=WB19 zjro%zEfJ_^oO;PHuSQrVbjD|lXO=hmZ(jh2&@(*7EE}w27fX9yp}A%ixmT(qPup1n zIeP;vUbtfTR(#0{aO_y4AADK$GNLH9M$y<}rS3hNX9s70BUbExH6T_#XCwX;`p6NE zmq?W(N4eIssin1qSKt51FOn`FES_bNH4;0O$I4Gt<%B{nX+BcTc6i1W0l3HuWJWp+ zd;t@lXw96e|C{ex=h-=~^Hy&ajL1E*3uLSp)cUXG)_P35-f=J){_!IwaD66*2W)nw z(q-#`0qf6PFuHw+tVLE4iwYY85XW-Pzdhv-$}2pZ?o{^Q0b{@?K;Nu3c&o~SX1Hi7O7w}x1k^!`;!0r z3NG{g0&HH_=6xqqw9U8f&|r_`s{cX3v@`J^r8=MBC>rWZd+;#=WAtiZZ+7-cp=}!t zL_8JZ8hMFB!ODO4?semX$n3@UA@=Wud{N3NkhYGhC!op8cDc<$W!=)OfuQ%Q019J+ zFPavaiKa(-c0qhaZ*@rI5BWJR;1!wEZS;^~Pm-c2PY^4%Sm1XF}6rGV@B zv-hkeOLOE_MOFc$;kAlz_mt5zc_}6r)t>cnDv)@oqvug}%kLNUiWcUm zE|ytJ>ket0w-*p)S(8`s=|a7auRXTQTj!ubT6R%xm`m+8x@H*y#aEXGedP%_6VJ-o zz$R#U1OJwM4uV#a}S_@3@SC_wuSHw>$M)`hK zIx_sWQWo=rdp7znE$)kGt2e-rEH3e#s`k@J5R1SGKBs6*43fGrG^jC}$G0y<_#bpT zfm1_YeRWG$9ChzanV9i!gG3%g*q^EoxFZ@4ANN~TzB+KkaedkSEg?=754fZ^%=8ho zzzz-TCJkpa{nIa)L$6GnF6ko^R^s@QrPZ?F*|{&nIsok;07lQ9UP@negXc#0jb9I!R)qqlu$sRLOr#f=iAz2|D#`>!9((&L##I)ks$UWnkE8yzUV#9YvZL ze)sG>h>8ULOTzV}XQW|u86FI=2UBCUobWE*@l&{8XB#8R zb>uu^ILijj&TI&s%Hr`q=QyPn6s#ZS+XF0%wbNeMO>aFO2k?RyG3^iR8EEX(iXOn+ zuXA1yGntdSCpBdj1^Fmv&y}u#tmIUPc~;)` z)}v1HO|xI=;SF4(v$BalV3B2jif_8Wh-@`<%M$1zeC*VLDlF#9gFf?7h*KdHLV{(D%p(c)w)ZbA*-Aqup<^tJh{|kxt+irTz zIsJLK>)6lNBI`FEObA|SYYY!~*T4EcOJ;%b!NdhL)cv3S^I63*1)f73N>n4QKp%P{ z`U5ft)|bc{jgtl{sJorqnB(QMn31#o&M!CSMbO=FPzQt)A;%UbJ+5aAe|k%UDPFk3 zenE0XJPosP+hKvv3Z9BRH`oDG9Z{PXhpt(a2iL^$rE>MRynI;NwSO?NCIM4bbUu8j zZ)+l;f^z3jg+kYB$yTV&_7v<^LSnniY1QJQiJt}Fx={DjT&E}en3w=(Z*6SsC)JH!0AZ3 zsJFIWhv%ph5SSBsxdFvdf};{6A6^6~W=6e;TlX1XI%iT^Ll*4=92*8iWDE(7Y6Cf) zj%$0r3aQzO@M9z2s}CgH#$|B!TXwIielX8{a;npl0T5UPLFZx-M-%^o>Zb&rMgGT% z(CE}9xiwZWZ(*%D_-jc>cyZ*P-;7N{ek5sriu9)dTz&d*8n&uL2pe>W7e^Nou7<{X zXw;t3k2muFF?i!)VJUwVH+- z+V)lvszgPO0tZ0(%N=mq=w;t0EH&EX8o!%%b?<7n=eKez8ptR*PqYx7{&|13Zz%~{ zkx1#R9`yx;A}tcDCm~(}x?#8X-;0c!KA#YMZ@aVrQ7%tu!fGci`IGdP5AZ6I!0%=CDNYiph8$YQuzrL z?o%1z*aZm+DMzglNwUpOr{TKjTz|Rg@ARr<+Qf zR!4PF9k+KpuU8eaE+av`fD9GqPFd>191baStHOQueXEb>QrI&qfwYH)O|3y9tU|nR zP9hGjt_sb!%r9>Zqhjp=K=TLxs7Q;cp`GCT`RM3Q!)U(k^0HruJ&((_?Q?=4g+CeT z>h!@%H5cVF^ZlNoHugO)v{hMRnCIm}=Eg=C>+K3qrpW3AdR=Y$!NV0x*?L|q1|1JSpyBNcVlyf{P3Av=e`$0Z( z5KZUa8E1cgK`C_luexhaNRXA6(8IJoO)p^>=F;22t9YP-mPV&-#sW|WG(a^67lVNX z#7&y=oL%#;$8Mq_2{v@(h;D# z0qJk!pcF5$X|zmU#Y1fQm8a4BP-aI})Tqa*k8$rlVnFA*lh$XNzKP++$n#Al#s762 zUTy%4>8c9|RJ*5IVaqTGa4c{9D z9|uq01nsZs==leUZ_KiV6*6P^Q!gC$Yd+JLRCZQO_g zGOsCXuFf(MdL~!dy~n$Mdekk!24(TdNIsXYS^(4X`(cS+ty6o#8+_bfh*u+7+EqIqKrBJCB$5UF^IrI^y6e>-rI5 zGpUGrTXA>e3>_b%)`f2JvL>w(Q*<3Uh##$jj62nPJV>iM1UsTGob!E{4$Cdg8zd}1vpji0EXIW&=!{!w{- zp*+r_!YO1z%hrTOKBAyls+D}8Aa!`j;ZPq-dcv?vx(rj4Oz9sXqa*S4XPO#tE;wDa z3esKL)%McP4YHlOjdkq0yoF_WYszMX3M7=!v)48A4(ttqJL8I{q0q4Gn|c_t4T_5z zp3ji*eG=%w?x4n`c0~=xZw)Umn(rcG)Le|=QSS;4OiB0T0R?Nr(ZV-;=CNbVI zCpi!Uu;o~@aAqVzm&gIx)S-Q~m>Yt(&SvYUl&CkbC!?6XW^p#Sg(^}l(~Y*}749`k zHLhtS53flXRONk>x>b%#$iRCHt|`^?w>=IFd55bT;WDz=%=k&37BfmkwmKqB?s%E9 z?%g0gyq9u%%pwDqW;i8PJUr}lSMwI&Gk08+?vF&cqzA2Da%d%&i;EWU5HFae9!~t= z{^Kf68(>6b^p~yG*B&T>I@~9o| z=4*;h*!L2H<#2))z`0xSN!l9lXeogwszOp4!}|t@Y6Bkh)4>4Ap$A zEr@3$_*=#ip_e_$_%JIX*nUy^=6s*IGFGcH+%P{9Hhi6|3r)jQlZBZr(|;iEVsf}l zFk;Bl$WL->Cl)zZlrox%I~z>;A$Q5m9QEkO!1KjZ6XdnOGZ(h*S7Wm?A3-F(Bmy56lx1!L-2pq6o6)K1sSPM#!_1cu61yy zSHfEtgY80~Th*sl#31@7uJ)PEw47X8mvLSjzr^CK&jbc{I0Sjdc@3uX61qw^mI>&E z6;qy$`phx1Hdh$2G{+AYdL|LORVVP>_Pc3*-=0w;0OBqtLm z9T1abnOMv>`6ox2{#YxHv;Muo{E#OnGSWOx7D?M>WKp@LUF$YyYA$V_CNuhen&O%q z`?M@xu|6#Qbb?n*S~kt%i1}O+!LvvhX?nwxV0zc4=qNfYf4-`+X0f$i-QUQvRSr5%7ZGS*exfVXm+*P&c1;aZ<}l=1+W&P-64UvXqU=Bd z$Gp=27>mIF+(!!#^NyX%)TA}Eiv-BZhfWaj7@f{HQDL#Y) zZejiChBLWQk4rAfxpe;V0rS-7Fxva+i>rMJ+*ZUWwU!`_^kWfLcV2C;um^mDTJZcU zO5YCw9dqG!*XOvVI~paFx3H}3J2a$N(?fRd+hwA9$WIXDP%82)ng_OzFYl{LQ6r<~ zUWihXg`!s+hnLmGXZgkT9}XD_vQQLu{sNab%ZMpJ(CPz6z~vvp52LwWWZvGMwk*e> zK7hx~gw=N<%I%B3O;;biKQWj6-u(wJwUEOK*N&gywX4T@t(K;Q<1+Gbk2k%j<#%9= z=L=VeO(C1E;(JVvn&kAMqve&FAHH!v@mwWgJnFN|F<&T{II2tV?N0 zTu=3iw(+$IPG2dzNcC_VDT-FJUhnT`&ebGmb(y+fw9`Ih3)n>Ov}8v5G0btqKVTRF2ed*7%11A)}@#f8lrqwpf>;D_5`bV zX;UwA$+-23J=l>;I!whtbfj z-Nm2bLPV6o!6*sSxMau^UTM31doKL(uRq<2dqN3^(HmU?RAQvPy%pj{-#|%y?V^+SB!?>Y^L5 z%=FIKXpO-IHp&nyf35`106`|#msa^379s0`2y__{kCDezqPM^2nQz~98PO2p+3p3|0EwL$&@sx20-OhCO&;u34_vE_$2!>v zIn}ouMXY#z+j`&n04^@n=`%B79gmy|=R407XeRt1Ep4TlOe?@$$QLh`4%B;75^A4} zJtvNgcst=Tyop5O;+BcoaJuj4>_hfNIkJscc_1iliGpj;n*?4MeT^&y3W<2d?eB+c ztkmr4FSTaZ)KZ*$5*e>b2LnfIdx`V{T5E~Ysf>#)^aG=VGg?Zt9x87#u6wb98Ao1Q z=Gk7xkv1as{BQrJJbunyr0w4awVs*235At}Z`3b>eVDK)vj(es+rm^oKejree}o?F zrAvv>u)(cbHs63^nXgKt%dBD4)~`MxlqLJ=JRH;Dh|9nWbN&SM7j9;{Fp`-O;(8Rv zh9?4eNNs5T0wBS2G)l$VLOktdCs)%0zp8^c5POn54>9rsC7lJ2m?fKcaSp5^`Ozc( zW2w!kw50%|);vmSK|Ye2$Flun|AT+^c|bU1$?Ea3>>HS$$h7PlBjjrxIj`3l%~dW&lkoxFL&0|y3gmylb<*GFy-YJ5hj8k zFyp!Jj

    LD`&hc34_Y9o!_ymdher7egL}_wRWAFY7{;6`Hz47xhlB-Fd9vM_>J<~ z{&-!5ZBUVa3qiBN1_;pVB~P0vN%U)dK3iK)o5%VVBK$KxEn;-v^hXLR0<-6$(|1wl zi@VX;S5s6eZu9a9A^Fgi0Y&Mg-d1~8i=c-+yZ-ew{WXId9se-0U}8?J)r^_%lQTJ~ z`_FIQ{NKJgK9nHhKY7G=aahThvHti5RP%kpG3{8Vkw~?c)x&5pXF-X|&2KLc{_73^ zI_AOr&hmp>P8#HDJ?D2K5aBWoXk*%FoHw8gt?`l(O+8V`pc~LuoMD7aNlqm$iF|HQQV{f>vAp3`CiTt1@TbO5$n+10$xyoHhEunrG0tEVpdhp@rhqyYGtkWc!){m#cBVqHALC7rga6y@F&^_ zPkjIn9$PL5BRt$5*EK+xUh>91w$!m90CSEUXSa7tk1T5#mHl1AQxx< zk2dW5D0oZ(SWsca2>+2MMb8t@MxM5ZN|5A$5ePD?u?zaPCF-mKhu4fhne&-f9qUDG zw~oApYdC`h3*Wl~1D`Tbtk;LBt)=+*01N+#;QPj+`WX*C>6iqh5+`p!eOYnLOzi65 zNlxN}Fu^PTS10UDiK~gf#zF7zaWMOil}SALkFH4kXII#h4`>{%@V9y02LYR2Bi-op z8T-1Ad=m=9#G8E&o1AolFZnmy%6_3ts-*fA;uMAk7% zF4%4s1w!7AP=lZ_pkefg;xIWnYPgsm+b_8EqHwKyNy5Y>wuC}N*MsZ!2DP=I6}Nk! z3-F5+7ph-6>lAvvm>=;oDh_AGz~?Q3H!OXAH2qcUxi2rUx!Z;J zxAYD=q`sO6BPV~zU(i}2c&fvxh9?gY-+WJL>%`x@y9q*mS{Fv<)(N{Xo^49b;1(-~ zC)`CgB%d5eI6*0`R%fs$XwgydpCa1})sOOH^zG#ywPweZCH73q$5WDR^ly}*zy~&O zdm~DU5gHb#>Z=7sB(|1W zW*v4A$EdIxM}2V14kJm0@vH>@&q)w`2?%jH&1aiT3cVX8aUxx7xEykow5sCC!k?%6 zxFc~JKlT?u<5L#5TuM9yH;hX8B6j8@)Za3!#4y_v6}Ko%ivh~L6X9>0aPR7yHVQEG zqkhhpOC<5=l`+5MA4W~toK$i9oTWSl_T0#AXXVbd+f5D{D;gJ_>~l(wGX|sJgf0ca^Jga&D z)9#0sA3Y)0aVXUNjSIolA&4h;(4UE4QqZiHVfnPsSzTMZ-kIm(ESziG_R0y=egwBK zyj*O(rh=+cMBTl}|H+ZbCTh2t-6bV$qg-U>i-#W$AfNFJRppKbJd9Q}?MrC=&?ogB zYfXu{{5K0QT?WY=w^bUy0!N;LG;#bd!SwYPVDn8~=zchIfj(r<*850JE`^mO`lX%n z)2X>g(s!STZ5F>#=Uf9^NbL2Nx?UunsjK4uM`!VE?bI)Vs;)uF=}`MznimK zZ060+9Q-N$DZ$}fS!Z5bqA+4YRxxl{`g^Oyx=V+JBsf%0IfYOTgfHw+v>F6cF9;&X zK9}8Vfp#>D7(&yd0xiGWIgDlxwB)tDh{!oGdd?9{uW-oMFWZ{4xl&P3IH`lqS=tV; zna4w8rX%Tj&L*whw_(K#lC4%lESeOmQ#ApH}|tldV$@#Z~7#n<=9KF4KA(6hE~tln%*!q87H z_dT+NKBzp~n(dBopFizm^(m29wPE+-^5@U@?|p(FpFNM$I12;`W|ff1hfCZ4udwS5XM64Y-Ah}uMYR+~)v69u zkyE3ss=cK~DQbk;E2PVwtu02Wy+ad4(4o>=F@i{pRuHpF2uXzZr#;Vk&-0wV&+89Y zu1j*=anH~C-ami6PSHJed9|XRSAF$QY+=M$%G!$9o-Z_A-tM#&r5A5-^PJ$^@2<8j z2D2ejwA|6{i=iuno^C7rX9D!`D=q4WhnC=#3N7Ftps zsx#+qz4FbdNCOiw31?@6LSC1ru#2=S+QbKSqS9jy<;`Sk38Y=gVhpyxr9KBCPnX&< zE1O|CHs?aB!LhauwQkt^$T~?trcn~ayX`3z2r#i~MNaZ|1`+c>y0!(m| z=~a_XZ)1;Gog!F-w)jjh792AmUbvbS73|EnW*{?lt6y#f7#=vUY3ZO?#v^t*X6wbK zeuxk)&-#HAylS_ucH2Oq>&vl6!>=sklzq=s4?QeT!cV&BA!R&DZaW6>N2R%*4|!PW zy0c>l=o9leWgbh*pvCqZ>~e&oZ(sA#2S>fC(2l9u537A^?Y(h)qjk%+^Ux=snPv9f z;fLgF6ekns`mSN4lw~j$t5af}8Ff+cx`^aE_IR{0bXqQTh2NOP=#Enb&js#RQrha} zOEeF`$1mt*^aCVwW7caqsWL*RT9CH&<(6~pbz4!vEyz3+?h-OK;Y@vYs%4ay3PLh6 z%)2v&RpVZ4*95wIzJG?K2(~qxl318?39-iLr{?w-3=WZpgNn{&WQ2;2XfGHS7@tmQ z6CzR@_yb$o-85SIVjM`B{0A?A&!B^Q7^YLER^xft*%dE-Z$3va#bi;+HO`OIUP?|b z$)YY2XNE?&ubbcqgB}i`04uYJw72Z?zk!Z3SpZ61c4Q(PPkfmVqtjk0#rI)zB*}_R zO)2yd?DS=f{`+W6zUcQ4D`(SuhYt`cW8rRPIPdnG27FG9mV;Wf-Z!y3+m=IHG8(d4 zJ1<$;z;x}r3fi)G6->r9ezg7^xzeA1Z_$(pCEV-^S$S(=S0rASFW-4ws=2JDh;oo_ zV9YR`4RfWJdjD(lihCWK+-$NS?A&qP+2)4P(=%O2vC&CgT0JpIHQNenK@%J z+PX-)mua`3zhJ9a>|hkK{GJrQ{?HxTUa|yb+I|*v;OSazo*cLe-T6|lKq&S^v~jYj zX;I&rQsu2%bF2wTD-yO@!zkD){%u%$Xa9!c7nsH8{9qk7PIm7m+OvscW)s#08`_N0 z`4`Sw$m5by*lfn(N<;Rx}q_SiToA z7+Vbaf+{VlQuDQp?%!Pdqj7diY5VnujZ_NGL8%N0fuay(g%AOe-z~Xa2L?ax9M&E> z7V>Yf>X6;&Xf8)T$D>T7&)#mmOnsQC0&x<~oBm?JTu8}DxqXpdy4+DV-6oq8_H zEk3~xQCo^mnEmw5F@NvS(=|@P7>3(Z3u=GKTiVC>UNHiSej)pQZAV&TL%wtE`D%b|gJ7h-TVIq8F&{R6qcJ$H{y@*I3(N3D;wDciNq1Lc;5yH*r;<-{K*qKg;9LuQoS zs9W(v%>&x)KZu1s-3J~@eV$P;!N=?F3gge|1c~T;+2HU9pDLU{*9mSXtAJ+BS+u29 z$p-cJ^r6B`$C9zZqJ<}qIi@Cu3bK7AU`mq1+7+qVj&@lF%@xm3=_`*vrj$_TndnSa zuEBh5Tlba zTm=VJe6Z4Q?k-!eI1?;o6xYoE8N6am$c>YMT=oIwHV<+~hAPXr8xo_?TjnbcMDzk- z`R;m^5wKvyEbRngCC4HKmY@BG;eVBesxudh63)|@1GF+Sm zQOhhc2H6X0Ys|m!hG2ht1Ttb6hI`O}=chMCd;y12>$L zzUXAAn zWlc10$5Q6r?hCHAH=#j@Mo=x+L|Tzv>iC3l;2~i-mx-(g9fQJG`GK?|>$Ow^Yd#5x z;fg#$%xQkYcK-B=S`mBWL}GJFPgN=1JmE5=(am}@3RhR^8r0ls`by`9wf)_V#m)CN z8mGa-m1Wn5Ye!Mmm|v8rmD~owc{H`g7lL;PWx9t*pI_qJi1L1WY{?>FkT&Fem0xq}0NsoT zEjf)mWx6+{Fy)rw$GOLL!@NN!?Cc#tH{_Etx`9Wv{{n_HTfZ23A{TQ1n5x0Pb3OMH z_wat^uKj`>y7XiyZNethQC1&*0u`$6HfS~A(a&SQ*IAvd2bZlK&)m=s*%^xHL*^$- zSKaF|&;J!28v22gu zFj_vhcBHieC&tMb;8@Q^^+S3dfK0|q!vmjCM827CRT1xyLRk?|clP=X~V_D><)MsA)NDw6{Lg(|4LUUJR*=nspl7+zZ~eHO-J<7&Px zG)-~Sv_6+3;J3^`eRahK=~~PE4xbjO!#=Gh zD(T&oE+_ZWv=SeE5g-6hsLLCfio9veEbZ3Hl3?ojya?Q}|9x^041+>E1$c^?o;EEV z!a1Y|&rg}1x7#jTl|pDwt4OQA91EGMn@*gAKh#o)V)mYQdcc>_(~iW^GrUzoZs^=? z2xyeLe8$;MK<(SblCFF!)RGw8hFOPM8B|~Xa%p@6e-SdzXFEclOs|{G7nm_~8H3O} z-9P2Wgs!1X8T-^p{)b3Zv~y7yd9Hx8HyHvh;~ots z&wKV&EueairLRczPfeL;YuuGfT1=ov#2WY1#hyeu-8RMR9+^BseRk~f?jS=pWaLFi zGQ?1&=1U=e%yoyujOEC8cv63od>M|xgF#>R`av^RZqogO*mrF6|5Pmg5-={R z|K!DlnsY3*H=qDlfTS7WnkXr6!XR9F#+8u|skv2OwcgSsU&&iA@87dI#FXi#GOMCfp zd>U(XLE-<{l^;KewcF9B9A)jS0||jYVxhx)({4j zhoW?UbTOMtLdN;Jg2E$i87psS$d#iG24~p;7br+UJKtozUOy;!bnn5bP|WTL)qDRr z>;IY)KVQg&?wB&>{J*Ryc;Ax2oa|q-LL@Xc>B^sOK;j1;r#YfiC*`?Mox4G~+sIpX zE+liXDBI6(ET9P9<=}0>XF-!+Q61$`TKo-8UfAG(z_%lnM+V<6$+Wq*r3Xkx?Da^f2a)!Yo;mF1 z2drVyWu^Qy;Y$KGDz6wyO7He6Nlx$PU;zwfRkI&p|Ht7kemq)B56TLHoZM^*dOhxg zXdW7Eb8Eo{ytQ6>z%;G!VSO~xt*$AcAm2a>BbS=sibHa3qfpN^*Qf7Wi9j)3NtS#``YN#5Lf#x+* zIQ)in3dZ%vKbg(j-Dt#;Zk&#I7ISPh`V-HMmRHt2GKCDks5i=_U8Kj=@0c$buYYw$ zAydhakQ14U3-+?J#+jjVZB-Z>QxuZC_qa?DcBT?L`!IW}(%aM_)*&>-g^DLlK-7c(8LgjZ zT31|!zRZ^0?@vXP!a2J)-|ZO4K;MkidwuUrzZ^m6JhopSeCm<-8UMt-7$1XbO~@aX zGw}a&ss7rvdNP3(_N?M$c0b3~xx$mHftw#BOU!iT?J1WM?MRmyPwhCk0 zY)F6|dF-`y%#Kz2(WV%?47q?}M;6qMnBk~DKC(6*@<^$JJo-e>yKO27-ru&(#P(a_&hV`s{(qX{k@*={>4k+4!!ZBeP(;wjxy8rD zQp#bm>JV<}dymN7SzblDIn&w@bV)2W{?q~0XMX*fyX7ZV-%D`0ce8{3pSEVgfDr>i zL0Y4$1(hVcHxOxBAp%(#xue-_ovbdiKrb%x{L!qz5OfB&=EX&u%&Hx^JPb-|z zms|GCGqF-WiwnKYT=KKtoZx0Znz4n{ysO9EcI3ad{6zNR`5#ym;*)fp89C zV94IC|EojK+qI`LtAR9*$9h$xATx}McupTKaN2DQJ-Z1f`1<*c4%a%eBYAs|<;flB z(ZjeYioXRe?H`S2;^Wt(U5VGPdes^RHARxE1(sOt;&mg|a}Gg8U}Bx)H^AuU$w2=(8BooKoPcgwJCh^3cApnBuMP~BPVdq3t+Mn4 zADcT}R)x&+9BIp*bRs$o${>n}ZBh7z$jUvIUJZS^Cys_ zDhi(KopB?sjAGPRVqN?Q=lbdT;m)ZR;q}({iv+0nVe0yNmh~T2^6qNqmmY1`Tn}E! zzfQvs5a5;Eg(jgQUJkn%sM1w+(%KMsBk_$yh>?S#cSeukTbddd0^AT z)@n27_x111*BQz_6DsRPRgyzx+Cji%#0D=AQ&A&iA(^1t-!N4O^qZ?*IoVw>T`X!u z>+rlGgi`S1fyN)=0k>=Ur^DFDsD*-QE$t#Z5C6rNj1kxA?BnIHEwZPiAd1@_3#^}5 zE&T)}wmDFE*kw>PB(J#ZS!yKDg|P_|_gmdXDYriUhSE@1bx1!io6o^gqHa3ZLq01U z6&S7|8i&gU{HJUE>#rG-A#j zu<)N=ayPL#H#^tv>gj$Iqqs>`s>ci>jXxJE54D=~Qcrm8cDX*^BFu@bAUMb!_z>k* zCMjLIjkg2DcgE9LSxhU-ZwQ!;&7mE+Ln^1OYUd!g1CdFD&0O zab9-yE7XuLiy&;CddG4zf)wiM^8tmTJ)du=II(-6fE?I@J|^A_8P@7b z&FF5MY%96P6;)heq6e`niU)iriIWAj^5gli3^(b03RBb-tc&JFcBHnWUXq;duw0f= zRPo~4koA%=K4n>eN6Bz5>E(f68PoiWY+AxkUn?#fb>5u23i`qW0KQL4(zaX;?k7~G zuO2Tqa43!`m3!&==In(@UE{3=ini<3ES5u!!+cny1zVNSIX*3GzY2*UZ9*rVYeg_x zBoCD=IwjYA8naaJ`k^~Qqap}&Qjs)Otz|5w2?s5i z_0HVP$b)IYmlAVB>;m}P`T79oHg4*i2BhZeA~$ZW`S{&|kOBBjHl%DsSenzNl2sbA zxI*_n@n;@m$vqe&)*6`TC3JL7wc6O!?Kadf)$z~}S=NGS80#6|@9vaHH`njKU~e+Y zS0LGR4EaTAyT;}oS!+}mDT2_`mMGT;KCnH$o0B zSRKL~N!+A|ZW|SI*UU0YeIu8JX=*~53DvjS0eyR=$hG3oc@b78`hBG;9 z6n#ndN~P8`^Umr1WhRk<{#4w>e}4P00ke%Kc=WrY(5^L6j{3M_2<4!<)4V7VpMUlN z2KbhE-}O;HAPn`adu&&K-3&lDw=S-3a7`pN8A=BU8_P{k<+#YH^7E=yJiJi*qUEq* z%YgGNnigYsUnW5w=eSxwg|_;mcC!%mhSzv|e?W4JSA$B~DlQdijI4M# zlvH$WBo2U8j>*`C&BC&ha#c*-gYV(3p?y|;55HB$Vho_M6;Etvihmh&7Lp#qqOc`@Kq!YoYc?&X@t2rtsg=yM%TCw7uPs@CAbA5W$;T zoJg8(eBka(<`Om8P34B7hCWd>29r6nfJvM3i22_py($SZJc<>*%lR;&N^H5GlqZ%mr3mDP; zxtoIe#9JW18=H9@FRgu6jb@0okN&7EeaH?pCIGk@s!FeT#MKYXWs7)nDa#?#rNC7T29&6`YEM*OwH>sznS$OEpx!3cSLt!cv z-$A*gfZ&s8+7+*5TxXX93nCF0^l=`Rra9(3+cSQ5<{I}}VQYSI^r`IyWerRO zb7S+_2AjY?0O6CupSvt#m1Lw3hx&Rm+9BLQEbyfA{*G(ILe4Hjn5o*=@s?{?7^gaf zkvck?D3+z`&M?x%4SFbAnzYkjLw#3iWM~tII^<8>K$-P157}nZCmP&!jS2Hy$SJ8j z=iC8G-}qql_*q(Ug?+QAN3GB+(Ev@N8}zi=$mXfY?M_GQPB~;%zZPs#8&b9$UR-e# zXCiqv@ct7Ez1lMXfOkGi@CPC|?fC{n15pGz+Z)=-rOM=)n~a`MDpV5l{>*ZEd=QK5 zGsir(lRRz<0qo?~eW!%pRXf#q3X@!8x=PUoDG|!(SUqMGC4h#qGVm3p7Hit=S2Lc9 z>`JO=MV{Nz-y;oCOO;uxLr`aZ6tk?UYWD5OfGjjm34JV$AZnl^YHI+E{Hj5yEY~lZCYOnlu@UDu8Rp5OTmr6R z0oe(!N}+DwTt3mlnC{X&rPT%dOgJRw>j1~5=EQC@VD+MnM`mO-TumUCgYN8_={Fu8 zV16jlTJw5=Vx*Z{FCuVYj5^)>eDlj};Q4Adew#780E{SSy%_}(Ron%jN{?bAb;u~y zNy4@kle_g=;}Mmvrw%b`b%?JR-!hB-y5Ix++0&6koI=39M-@Yq76v=8+wi8?ze`ktA$aa#Flp=w1Rk*F(u$$_TUsR|auEk+ijkgwB0i#8U>{ zQf}^Z61vomimo|l5=bnB&TD$dzA=n~(=>_ndQ%CWgDs1@N{a|)RE)N*I zg>S><)UG8%sc0#1AFZOvAzlR1PHRv!=cD4MtydH6Uu123l2al7RwVtI%{k#x5bI~4 z4lzZMb6A=@8NLocXok+1AHe7|B#H@mnX*!G6Vco?sLuUhunZv=iyad zzCl9ep;Y!m#;RQJk3=M@Zq+G=GyP#afzYQP4zu6qbvyF@$+eteHbh*#D5>~l)bs9w z6-Ny=Me7-h;t-X1W%uBW7TQC>_80T^?`^iIHNz7?V5X8<^`$x1=ML@VO^ikR8+Xr_ zlt7mb+|X)slJI()-iSz3(@6<6#(DeJi7aO==!=R;&h2Q*?r%BymKr!wrdn#zHH0h& zY;({m@$GYh8M&76QkU_nAMZI=>9iee5u_yJ-V1{Qx1YVdWY8VGEz93_kk>b1WX6-5UCIt}N)2a=`_w%y_KEZ}HRZ z`+)vxCk1|ytAjg9H#(n(TBB+)O|H(e!haN^dcXtzhQz>Oj_f$Q`Jsz!NbRDg_-BaR zt#Uf3#x0s_=EUMswe|ps!aL&DE6?|drvLHjP3@Z6ip%a)ZBjf0$hdTKHaOTx z%&O(db;aiQ6S=^OP2;J7a|&PTFZ3p5u5Ue`J7|{f9fCMfLTd zzZj75Y<0Ozc6c#PO{VdUcz=7jo-G!)I_tXqHBwl5hqXjA`5PP9#3Ho61kqQv`Ygt_rux56&UUzM_kiTb{8Dvuye$h7SC}YgrhcnS zi{JXFG&N|eUax7|-HXwgSS2|yzb3Zir8~NwAEXRpBv1>!G;@nWsndQEFhJj=;wEXGsA$2imx#_E9l53lrW#NR3gGLFx>yIG zk^AnlREzBJm0@h|MlM4#4+W5(s80ahgkNWyJKpcz;%s1UPaX?eTD0t$?x+M`sa%m+ zQ~GuC?byy)s$`9KY@EtY_g^~RRzGZ!IVrX;73Co9P!!c7yuH7YZqb3%WOOCIhVM5xy&kGOZ8NSz-)VCuyrh%1hH|e1ndd{Z&gC7lLSb9jh^) z{MQFXxANWCk!vv473_Ueb|ekesgnD!)kWNwIPLNQ3*0k%%3fjMl`TFnN}xD}d{e&chZU<# z?TZXXOm!R`W?6f$H|Ez&)m%>mDXr_K+B4aMaw!IwiVCUJ!*85z4K|?IP@xdPMgxZd zYQgwsb>k}1FKXj?9ZlLdAN4;_i{h^84X*xYWn|1h&Qa<6O9BQ`U=x8Me@q_8OZz0HjO`Z&;3w0MZ z6>Q>nEa#|rMbvwRb95)Wvr|CX@LN;K06rht!?CrBgA=!mPfsd>rzd|Sn)jRmCXm57 zn{QVvBMIu|h2!t0u|NfW=E)X&cPIFndWktHNcx6$796&MyB4tb-siZgV|l1VooL|A zqV6^nyUrcy2LHvgVL=MAa|927%Yhk10{5@oVlM>ZSspr(_@4q!j>0$ZpKtOV@iDHt zyII&x)6J&KfBeGtRn-^06hUa<%L(1zc!Ir)ENv+{BHSj+HDdnyj2GOE{B*1xiONU}2Inb_&O3`$cNSscIe<=#c@t zRU^o`XhF#NkQsl`NW$hj(LB`XsHGouVK^43BspvUL7-(g9J_$Krq${MIFCNaJ8)HWt9IKHBJFCJhr0VUzwcpgT&saPj|CgK zDq#1suBy;eFF|jlo^u&c2SwIbz&Vy2J%2B`ukj&VXv|god`;YN99Fu|)MqLPuH|vn zmNQ2b*;%f_L4ty(z|QcE6)jr<_w{gC&AEj{d_GQoAO)YaYP^= zLWt0r`bX1q;aL}Pv?hNGQg&d-fRr#%gwu?+3O3j7=2n_T2wnVs`^-7fhQ&>!-h$L? z+h-7{o7(R%_Rs3P(ETprjtnj&ZH47V2DBN6uJ0D4CB}D~td8nK;wJA^#>Ve3SPw2wegpP+qcO?UYSLoH_M}J>0{&hT8H_UgYlj z{vusr=b%O$4GK|+qhd~dw7~ZbV~3* z2A#L&ef?UE20BvypH)|EJV4czl^#&wtTN&#z`s*=o%L@nRb`b|Q*#y@asYE%!CBHd zXyaS>=w4Q(9eV^k<@a{KG^)#byRkCur^F0p;}3!kekw^KS#t;7fqm#+FbzIwu~HjL zxxLeiZyaBhn3Z1$9w*&1u74BEK#BRb9{-0}Y;y!)X@JMGzZ+wQk&S){oE^*Kpg+BI z#~8b5wqO8$3(^(1a!y4P0Kes54joWmcR)2OusHE4BD(YkNagxhNQ_Tm0jm0qC^frfZrd$;pTbkA^7on02!-TJQL>%qML_$U9} z%OCUIsQ~X~4ZC(S&WFhkRDJ)-PlUZ^TMru`0#_vj9tEt(?#ye3=#s_j7b|K7Mn zU7@f{+W~h-&^|eCfi$LVj$wn>JsfDcsH43x;8z3&bo0#PMGK?k$IFrz@JU^Jt?6xV$^?WusGneOYRsmJ9-Q^#^hZQ3;}7?N2LSY-w4& ziU;ov0vs>p1C&BREIeal8l&c~LmI}Ey6GrTs$Lz9BtT#LUlp$6h7y-)y{kiebs|#{ z&CNb{AnKO0jlVe<|4P3AFRD9t6hd8~1(7)Qv%MWTk zsW^!FaqJ&c^6#zh+S_jnY%{L3D0m=9o9DUv@WlhYFXTKABu|;nJMEr2pavNh9?xU4 jA*F2fF&Y57-rg%b`, and is typically - just `None`. - - For example: - - ```rust,ignore - /// Allows defining identifiers beyond ASCII. - (active, non_ascii_idents, "1.0.0", Some(55467), None), - ``` - - When added, the current version should be the one for the current nightly. - Once the feature is moved to `accepted.rs`, the version is changed to that nightly version. +3. Add a feature gate declaration to `rustc_feature/src/active.rs` + in the active `declare_features` block. See [here][add-feature-gate] for + detailed instructions. 4. Prevent usage of the new feature unless the feature gate is set. You can check it in most places in the compiler using the @@ -154,7 +138,8 @@ a new unstable feature: If the feature gate is not set, you should either maintain the pre-feature behavior or raise an error, depending on - what makes sense. + what makes sense. Errors should generally use [`rustc_session::parse::feature_err`]. + For an example of adding an error, see [#81015]. 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, @@ -169,15 +154,18 @@ a new unstable feature: 6. Add a section to the unstable book, in `src/doc/unstable-book/src/language-features/$feature_name.md`. -7. Write a lots of tests for the new feature. +7. Write a lot of tests for the new feature. PRs without tests will not be accepted! 8. Get your PR reviewed and land it. You have now successfully implemented a feature in Rust! [`GatedSpans`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_session/parse/struct.GatedSpans.html +[#81015]: https://github.com/rust-lang/rust/pull/81015 +[`rustc_session::parse::feature_err`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_session/parse/fn.feature_err.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 [tracking issue]: #tracking-issue +[add-feature-gate]: ./feature-gates.md#adding-a-feature-gate diff --git a/src/doc/rustc-dev-guide/src/incrcomp-debugging.md b/src/doc/rustc-dev-guide/src/incrcomp-debugging.md index ecb29d544e..ba312c959e 100644 --- a/src/doc/rustc-dev-guide/src/incrcomp-debugging.md +++ b/src/doc/rustc-dev-guide/src/incrcomp-debugging.md @@ -4,9 +4,9 @@ There are various ways to write tests against the dependency graph. The simplest mechanisms are the `#[rustc_if_this_changed]` and -`#[rustc_then_this_would_need]` annotations. These are used in compile-fail -tests to test whether the expected set of paths exist in the dependency graph. -As an example, see `src/test/compile-fail/dep-graph-caller-callee.rs`. +`#[rustc_then_this_would_need]` annotations. These are used in ui tests +to test whether the expected set of paths exist in the dependency graph. +As an example, see `src/test/ui/dep-graph/dep-graph-caller-callee.rs`. The idea is that you can annotate a test like: diff --git a/src/doc/rustc-dev-guide/src/llvm-coverage-instrumentation.md b/src/doc/rustc-dev-guide/src/llvm-coverage-instrumentation.md new file mode 100644 index 0000000000..8a044849f5 --- /dev/null +++ b/src/doc/rustc-dev-guide/src/llvm-coverage-instrumentation.md @@ -0,0 +1,628 @@ +# LLVM Source-Based Code Coverage + + + +`rustc` supports detailed source-based code and test coverage analysis +with a command line option (`-Z instrument-coverage`) that instruments Rust +libraries and binaries with additional instructions and data, at compile time. + +The coverage instrumentation injects calls to the LLVM intrinsic instruction +[`llvm.instrprof.increment`][llvm-instrprof-increment] at code branches +(based on a MIR-based control flow analysis), and LLVM converts these to +instructions that increment static counters, when executed. The LLVM coverage +instrumentation also requires a [Coverage Map] that encodes source metadata, +mapping counter IDs--directly and indirectly--to the file locations (with +start and end line and column). + +Rust libraries, with or without coverage instrumentation, can be linked into +instrumented binaries. When the program is executed and cleanly terminates, +LLVM libraries write the final counter values to a file (`default.profraw` or +a custom file set through environment variable `LLVM_PROFILE_FILE`). + +Developers use existing LLVM coverage analysis tools to decode `.profraw` +files, with corresponding Coverage Maps (from matching binaries that produced +them), and generate various reports for analysis, for example: + +Screenshot of sample `llvm-cov show` result, for function add_quoted_string +
    + +Detailed instructions and examples are documented in the +[Rust Unstable Book (under _source-based-code-coverage_)][unstable-book-sbcc]. + +[llvm-instrprof-increment]: https://llvm.org/docs/LangRef.html#llvm-instrprof-increment-intrinsic +[Coverage Map]: https://llvm.org/docs/CoverageMappingFormat.html +[unstable-book-sbcc]: https://doc.rust-lang.org/nightly/unstable-book/compiler-flags/source-based-code-coverage.html + +## Rust symbol mangling + +`-Z instrument-coverage` automatically enables Rust symbol mangling `v0` (as +if the user specified `-Z symbol-mangling-version=v0` option when invoking +`rustc`) to ensure consistent and reversible name mangling. This has two +important benefits: + +1. LLVM coverage tools can analyze coverage over multiple runs, including some + changes to source code; so mangled names must be consistent across compilations. +2. LLVM coverage reports can report coverage by function, and even separates + out the coverage counts of each unique instantiation of a generic function, + if invoked with multiple type substitution variations. + +## Components of LLVM Coverage Instrumentation in `rustc` + +### LLVM Runtime Dependency + +Coverage data is only generated by running the executable Rust program. `rustc` +statically links coverage-instrumented binaries with LLVM runtime code +([compiler-rt][compiler-rt-profile]) that implements program hooks +(such as an `exit` hook) to write the counter values to the `.profraw` file. + +In the `rustc` source tree, `library/profiler_builtins` bundles the LLVM +`compiler-rt` code into a Rust library crate. (When building `rustc`, the +`profiler_builtins` library is only included when `profiler = true` is set +in `rustc`'s `config.toml`.) + +When compiling with `-Z instrument-coverage`, +[`CrateLoader::postprocess()`][crate-loader-postprocess] dynamically loads the +`profiler_builtins` library by calling `inject_profiler_runtime()`. + +[compiler-rt-profile]: https://github.com/llvm/llvm-project/tree/main/compiler-rt/lib/profile +[crate-loader-postprocess]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_metadata/creader/struct.CrateLoader.html#method.postprocess + +### MIR Pass: `InstrumentCoverage` + +Coverage instrumentation is performed on the MIR with a [MIR pass][mir-passes] +called [`InstrumentCoverage`][mir-instrument-coverage]. This MIR pass analyzes +the control flow graph (CFG)--represented by MIR `BasicBlock`s--to identify +code branches, and injects additional [`Coverage`][coverage-statement] +statements into the `BasicBlock`s. + +A MIR `Coverage` statement is a virtual instruction that indicates a counter +should be incremented when its adjacent statements are executed, to count +a span of code ([`CodeRegion`][code-region]). It counts the number of times a +branch is executed, and also specifies the exact location of that code span in +the Rust source code. + +Note that many of these `Coverage` statements will *not* be converted into +physical counters (or any other executable instructions) in the final binary. +Some of them will be (see `CoverageKind::`[`Counter`][counter-coverage-kind]), +but other counters can be computed on the fly, when generating a coverage +report, by mapping a `CodeRegion` to a +`CoverageKind`::[`Expression`][expression-coverage-kind]. + +As an example: + +```rust +fn some_func(flag: bool) { + // increment Counter(1) + ... + if flag { + // increment Counter(2) + ... + } else { + // count = Expression(1) = Counter(1) - Counter(2) + ... + } + // count = Expression(2) = Counter(1) + Zero + // or, alternatively, Expression(2) = Counter(2) + Expression(1) + ... +} +``` + +In this example, four contiguous code regions are counted while only +incrementing two counters. + +CFG analysis is used to not only determine *where* the branches are, for +conditional expressions like `if`, `else`, `match`, and `loop`, but also to +determine where expressions can be used in place of physical counters. + +The advantages of optimizing coverage through expressions are more pronounced +with loops. Loops generally include at least one conditional branch that +determines when to break out of a loop (a `while` condition, or an `if` or +`match` with a `break`). In MIR, this is typically lowered to a `SwitchInt`, +with one branch to stay in the loop, and another branch to break out of the +loop. The branch that breaks out will almost always execute less often, +so `InstrumentCoverage` chooses to add a `Counter` to that branch, and an +`Expression(continue) = Counter(loop) - Counter(break)` to the branch that +continues. + +The `InstrumentCoverage` MIR pass is documented in +[more detail below][instrument-coverage-pass-details]. + +[mir-passes]: mir/passes.md +[mir-instrument-coverage]: https://github.com/rust-lang/rust/tree/master/compiler/rustc_mir/src/transform/coverage +[code-region]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/coverage/struct.CodeRegion.html +[counter-coverage-kind]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/coverage/enum.CoverageKind.html#variant.Counter +[expression-coverage-kind]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/coverage/enum.CoverageKind.html#variant.Expression +[coverage-statement]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/enum.StatementKind.html#variant.Coverage +[instrument-coverage-pass-details]: #implementation-details-of-the-instrumentcoverage-mir-pass + +### Counter Injection and Coverage Map Pre-staging + +When the compiler enters [the Codegen phase][backend-lowering-mir], with a +coverage-enabled MIR, [`codegen_statement()`][codegen-statement] converts each +MIR `Statement` into some backend-specific action or instruction. +`codegen_statement()` forwards `Coverage` statements to +[`codegen_coverage()`][codegen-coverage]: + +```rust + pub fn codegen_statement(&mut self, mut bx: Bx, statement: &mir::Statement<'tcx>) -> Bx { + ... + match statement.kind { + ... + mir::StatementKind::Coverage(box ref coverage) => { + self.codegen_coverage(&mut bx, coverage.clone()); + bx + } +``` + + +`codegen_coverage()` handles each `CoverageKind` as follows: + +* For all `CoverageKind`s, Coverage data (counter ID, expression equation + and ID, and code regions) are passed to the backend's `Builder`, to + populate data structures that will be used to generate the crate's + "Coverage Map". (See the [`FunctionCoverage`][function-coverage] `struct`.) +* For `CoverageKind::Counter`s, an instruction is injected in the backend + IR to increment the physical counter, by calling the `BuilderMethod` + [`instrprof_increment()`][instrprof-increment]. + +```rust + pub fn codegen_coverage(&self, bx: &mut Bx, coverage: Coverage) { + let Coverage { kind, code_region } = coverage; + match kind { + CoverageKind::Counter { function_source_hash, id } => { + if let Some(code_region) = code_region { + bx.add_coverage_counter(self.instance, id, code_region); + } + ... + bx.instrprof_increment(fn_name, hash, num_counters, index); + } + CoverageKind::Expression { id, lhs, op, rhs } => { + bx.add_coverage_counter_expression(self.instance, id, lhs, op, rhs, code_region); + } + CoverageKind::Unreachable => { + ... +``` +_code snippet trimmed for brevity_ + +> The function name `instrprof_increment()` is taken from the LLVM intrinsic +call of the same name ([`llvm.instrprof.increment`][llvm-instrprof-increment]), +and uses the same arguments and types; but note that, up to and through this +stage (even though modeled after LLVM's implementation for code coverage +instrumentation), the data and instructions are not strictly LLVM-specific. +> +> But since LLVM is the only Rust-supported backend with the tooling to +process this form of coverage instrumentation, the backend for `Coverage` +statements is only implemented for LLVM, at this time. + +[backend-lowering-mir]: backend/lowering-mir.md +[codegen-statement]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/mir/struct.FunctionCx.html#method.codegen_statement +[codegen-coverage]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/mir/struct.FunctionCx.html#method.codegen_coverage +[function-coverage]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/coverageinfo/map/struct.FunctionCoverage.html +[instrprof-increment]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/traits/trait.BuilderMethods.html#tymethod.instrprof_increment + +### Coverage Map Generation + +With the instructions to increment counters now implemented in LLVM IR, +the last remaining step is to inject the LLVM IR variables that hold the +static data for the coverage map. + +`rustc_codegen_llvm`'s [`compile_codegen_unit()`][compile-codegen-unit] calls +[`coverageinfo_finalize()`][coverageinfo-finalize], +which delegates its implementation to the +[`rustc_codegen_llvm::coverageinfo::mapgen`][mapgen-finalize] module. + +For each function `Instance` (code-generated from MIR, including multiple +instances of the same MIR for generic functions that have different type +substitution combinations), `mapgen`'s `finalize()` method queries the +`Instance`-associated `FunctionCoverage` for its `Counter`s, `Expression`s, +and `CodeRegion`s; and calls LLVM codegen APIs to generate +properly-configured variables in LLVM IR, according to very specific +details of the [_LLVM Coverage Mapping Format_][coverage-mapping-format] +(Version 4).[^llvm-and-covmap-versions] + +[^llvm-and-covmap-versions]: The Rust compiler (as of +January 2021) supports _LLVM Coverage Mapping Format_ Version 4 (the most +up-to-date version of the format, at the time of this writing) for improved +compatibility with other LLVM-based compilers (like _Clang_), and to take +advantage of some format optimizations. Version 4 was introduced in _LLVM 11_, +which is currently the default LLVM version for Rust. Note that the Rust +compiler optionally supports some earlier LLVM versions, prior to _LLVM 11_. If +`rustc` is configured to use an incompatible version of LLVM, compiling with `-Z +instrument-coverage` will generate an error message. + +```rust +pub fn finalize<'ll, 'tcx>(cx: &CodegenCx<'ll, 'tcx>) { + let mut function_coverage_map = match cx.coverage_context() { + Some(ctx) => ctx.take_function_coverage_map(), + None => return, + }; + ... + add_unreachable_coverage(tcx, &mut function_coverage_map); + + let mut mapgen = CoverageMapGenerator::new(); + + for (instance, function_coverage) in function_coverage_map { + ... + let coverage_mapping_buffer = llvm::build_byte_buffer(|coverage_mapping_buffer| { + mapgen.write_coverage_mapping(expressions, counter_regions, coverage_mapping_buffer); + }); +``` +_code snippet trimmed for brevity_ + +One notable step, performed by `mapgen::finalize()` before processing the +`Instance`s and their `FunctionCoverage`s, is the call to +[`add_unreachable_functions()`][add-unreachable-coverage]. + +When finalizing the coverage map, `FunctionCoverage` only has the `CodeRegion`s and counters for +the functions that went through codegen; such as public functions and "used" functions +(functions referenced by other "used" or public items). Any other functions (considered unused +or "Unreachable") were still parsed and processed through the MIR stage. + +The set of unreachable functions is computed via the set difference of all MIR +`DefId`s (`tcx` query `mir_keys`) minus the codegenned `DefId`s +(`tcx` query `collect_and_partition_mono_items`). `add_unreachable_functions()` +computes the set of unreachable functions, queries the `tcx` for the +previously-computed `CodeRegions`, for each unreachable MIR, and adds those code +regions to one of the non-generic codegenned functions (non-generic avoids +potentially injecting the unreachable coverage multiple times for multiple +instantiations). + +[compile-codegen-unit]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_llvm/base/fn.compile_codegen_unit.html +[coverageinfo-finalize]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_llvm/context/struct.CodegenCx.html#method.coverageinfo_finalize +[mapgen-finalize]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_llvm/coverageinfo/mapgen/fn.finalize.html +[coverage-mapping-format]: https://llvm.org/docs/CoverageMappingFormat.html +[add-unreachable-coverage]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_llvm/coverageinfo/mapgen/fn.add_unreachable_coverage.html + +## Testing LLVM Coverage + +Coverage instrumentation in the MIR is validated by a `mir-opt` test: +[`instrument-coverage`][mir-opt-test]. + +More complete testing of end-to-end coverage instrumentation and reports are done +in the `run-make-fulldeps` tests, with sample Rust programs (to be instrumented) +in the [`coverage`][coverage-test-samples] directory, and the actual tests and expected +results in [`coverage-reports`]. + +In addition to testing the final result, two intermediate results are also validated +to catch potential regression errors early: Minimum `CoverageSpan`s computed during +the `InstrumentCoverage` MIR pass are saved in `mir_dump` [Spanview][spanview-debugging] +files and compared to expected results in [`coverage-spanview`]. + +Finally, the [`coverage-llvmir`] test compares compiles a simple Rust program with +`-Z instrument-coverage` and compares the compiled program's LLVM IR to expected +LLVM IR instructions and structured data for a coverage-enabled program, including +various checks for Coverage Map-related metadata and the LLVM intrinsic calls to +increment the runtime counters. + +Expected results for both the `mir-opt` tests and the `coverage*` tests under +`run-make-fulldeps` can be refreshed by running: + +```shell +$ ./x.py test src/test/ --blessed +``` + +[mir-opt-test]: https://github.com/rust-lang/rust/blob/master/src/test/mir-opt/instrument_coverage.rs +[coverage-test-samples]: https://github.com/rust-lang/rust/tree/master/src/test/run-make-fulldeps/coverage +[`coverage-reports`]: https://github.com/rust-lang/rust/tree/master/src/test/run-make-fulldeps/coverage-reports +[`coverage-spanview`]: https://github.com/rust-lang/rust/tree/master/src/test/run-make-fulldeps/coverage-spanview +[spanview-debugging]: compiler-debugging.md#viewing-spanview-output +[`coverage-llvmir`]: https://github.com/rust-lang/rust/tree/master/src/test/run-make-fulldeps/coverage-llvmir + +## Implementation Details of the `InstrumentCoverage` MIR Pass + +The bulk of the implementation of the `InstrumentCoverage` MIR pass is performed +by the [`Instrumentor`][instrumentor]. For each MIR (each non-const, non-inlined +function, generic, or closure), the `Instrumentor`'s constructor prepares a +[`CoverageGraph`][coverage-graph] and then executes +[`inject_counters()`][inject-counters]. + +```rust + Instrumentor::new(&self.name(), tcx, mir_body).inject_counters(); +``` + +The `CoverageGraph` is a coverage-specific simplification of the MIR control +flow graph (CFG). Its nodes are [`BasicCoverageBlock`s][bcb], which +encompass one or more sequentially-executed MIR `BasicBlock`s +(with no internal branching), plus a `CoverageKind` counter (to +be added, via coverage analysis), and an optional set of additional counters +to count incoming edges (if there are more than one). + +The `Instrumentor`'s `inject_counters()` uses the `CoverageGraph` to +compute the best places to inject coverage counters, as MIR `Statement`s, +with the following steps: + +1. Depending on the debugging configurations in `rustc`'s, `config.toml`, + and `rustc` command line flags, various debugging features may be enabled + to enhance `debug!()` messages in logs, and to generate various "dump" files, + to help developers understand the MIR transformation process for coverage. + Most of the debugging features are implemented in the [`debug`][debug] + sub-module. +2. [`generate_coverage_spans()`][generate-coverage-spans] computes the minimum set of distinct, + non-branching code regions, from the MIR. These `CoverageSpan`s + represent a span of code that must be counted. +3. [`make_bcb_counters()`][make-bcb-counters] generates `CoverageKind::Counter`s and + `CoverageKind::Expression`s for each `CoverageSpan`, plus additional + `intermediate_expressions`[^intermediate-expressions], not associated with any `CodeRegion`, but + are required to compute a final `Expression` value for a `CodeRegion`. +4. Inject the new counters into the MIR, as new `StatementKind::Coverage` + statements. This is done by three distinct functions: + - `inject_coverage_span_counters()` + - `inject_indirect_counters()` + - `inject_intermediate_expression()`, called for each intermediate expression + returned from `make_bcb_counters()` + +[^intermediate-expressions]: Intermediate expressions are sometimes required +because `Expression`s are limited to binary additions or subtractions. For +example, `A + (B - C)` might represent an `Expression` count computed from three +other counters, `A`, `B`, and `C`, but computing that value requires an +intermediate expression for `B - C`. + +[instrumentor]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/struct.Instrumentor.html +[coverage-graph]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/graph/struct.CoverageGraph.html +[inject-counters]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/struct.Instrumentor.html#method.inject_counters +[bcb]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/graph/struct.BasicCoverageBlock.html +[debug]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/debug +[generate-coverage-spans]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/spans/struct.CoverageSpans.html#method.generate_coverage_spans +[make-bcb-counters]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/counters/struct.BcbCounters.html#method.make_bcb_counters + +### The `CoverageGraph` + +The [`CoverageGraph`][coverage-graph] is derived from the MIR (`mir::Body`). + +```rust + let basic_coverage_blocks = CoverageGraph::from_mir(mir_body); +``` + +Like `mir::Body`, the `CoverageGraph` is also a +[`DirectedGraph`][directed-graph]. Both graphs represent the function's +fundamental control flow, with many of the same +[`graph trait`][graph-traits]s, supporting `start_node()`, `num_nodes()`, +`successors()`, `predecessors()`, and `is_dominated_by()`. + +For anyone that knows how to work with the [MIR, as a CFG][mir-dev-guide], the +`CoverageGraph` will be familiar, and can be used in much the same way. +The nodes of the `CoverageGraph` are `BasicCoverageBlock`s (BCBs), which +index into an `IndexVec` of `BasicCoverageBlockData`. This is analogous +to the MIR CFG of `BasicBlock`s that index `BasicBlockData`. + +Each `BasicCoverageBlockData` captures one or more MIR `BasicBlock`s, +exclusively, and represents the maximal-length sequence of `BasicBlocks` +without conditional branches. + +[`compute_basic_coverage_blocks()`][compute-basic-coverage-blocks] builds the +`CoverageGraph` as a coverage-specific simplification of the MIR CFG. In +contrast with the [`SimplifyCfg`][simplify-cfg] MIR pass, this step does +not alter the MIR itself, because the `CoverageGraph` aggressively simplifies +the CFG, and ignores nodes that are not relevant to coverage. For example: + + * The BCB CFG ignores (excludes) branches considered not relevant + to the current coverage solution. It excludes unwind-related code[^78544] + that is injected by the Rust compiler but has no physical source + code to count, which allows a `Call`-terminated BasicBlock + to be merged with its successor, within a single BCB. + * A `Goto`-terminated `BasicBlock` can be merged with its successor + ***as long as*** it has the only incoming edge to the successor `BasicBlock`. + * Some BasicBlock terminators support Rust-specific concerns--like borrow-checking--that are + not relevant to coverage analysis. `FalseUnwind`, for example, can be treated the same as + a `Goto` (potentially merged with its successor into the same BCB). + +[^78544]: (Note, however, that Issue [#78544][rust-lang/rust#78544] considers +providing future support for coverage of programs that intentionally +`panic`, as an option, with some non-trivial cost.) + +The BCB CFG is critical to simplifying the coverage analysis by ensuring graph path-based +queries (`is_dominated_by()`, `predecessors`, `successors`, etc.) have branch (control flow) +significance. + +To visualize the `CoverageGraph`, you can generate a _graphviz_ `*.dot` +file with the following `rustc` flags:[^graphviz-dark-mode] + +[^graphviz-dark-mode]: This image also applies `-Z graphviz-dark-mode`, to +produce a Graphviz document with "dark mode" styling. If you use a dark mode or +theme in your development environment, you will probably want to use this +option so you can review the graphviz output without straining your vision. + +```shell +$ rustc -Z instrument-coverage -Z dump-mir=InstrumentCoverage \ + -Z dump-mir-graphviz some_rust_source.rs +``` + +The `-Z dump-mir` flag requests [MIR debugging +output][mir-debugging] (generating `*.mir` files, by default). +`-Z dump-mir-graphviz` additionally generates `*.dot` files. +`-Z dump-mir=InstrumentCoverage` restricts these files to the +`InstrumentCoverage` pass. All files are written to the `./mir_dump/` +directory, by default. + +Files with names ending in `.-------.InstrumentCoverage.0.dot` contain the +_graphviz_ representations of a `CoverageGraph` (one for each MIR, that is, +for each function and closure): + +cropped image of a sample CoverageGraph in graphviz format +
    + +This image shows each `BasicCoverageBlock` as a rectangular _node_, with +directional edges (the arrows) leading from each node to its `successors()`. +The nodes contain information in sections: + +1. The gray header has a label showing the BCB ID (or _index_ for looking up +its `BasicCoverageBlockData`). +2. The first content section shows the assigned `Counter` or `Expression` for +each contiguous section of code. (There may be more than one `Expression` +incremented by the same `Counter` for discontiguous sections of code representing +the same sequential actions.) Note the code is represented by the line and +column ranges (for example: `52:28-52:33`, representing the original source +line 52, for columns 28-33). These are followed by the MIR `Statement` or +`Terminator` represented by that source range. (How these coverage regions +are determined is discussed in the following section.) +3. The final section(s) show the MIR `BasicBlock`s (by ID/index and its +`TerminatorKind`) contained in this BCB. The last BCB is separated out because +its `successors()` determine the edges leading out of the BCB, and into +the `leading_bb()` (first `BasicBlock`) of each successor BCB. + +Note, to find the `BasicCoverageBlock` from a final BCB `Terminator`'s +successor `BasicBlock`, there is an index and helper +function--[`bcb_from_bb()`][bcb-from-bb]--to look up a `BasicCoverageBlock` from _any_ +contained `BasicBlock`. + +[directed-graph]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_data_structures/graph/trait.DirectedGraph.html +[graph-traits]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_data_structures/graph/index.html#traits +[mir-dev-guide]: mir/index.md +[compute-basic-coverage-blocks]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/graph/struct.CoverageGraph.html#method.compute_basic_coverage_blocks +[simplify-cfg]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/simplify/struct.SimplifyCfg.html +[rust-lang/rust#78544]: https://github.com/rust-lang/rust/issues/78544 +[mir-debugging]: mir/debugging.md +[bcb-from-bb]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/graph/struct.CoverageGraph.html#method.bcb_from_bb + +### `CoverageSpans` + +The `struct` [`CoverageSpans`][coverage-spans] builds and refines a final set of +[`CoverageSpan`][coverage-span]s, each representing the largest contiguous `Span` +of source within a single BCB. By definition--since each `Span` falls within a +BCB, the `Span` is also non-branching; so if any code in that `Span` has executed, +all code in the `Span` will have executed, the same number of times. + +[`CoverageSpans::generate_coverage_spans()`][generate-coverage-spans] constructs +an initial set of `CoverageSpan`s from the `Span`s associated with each MIR +`Statement` and `Terminator`. + +The final stage of `generate_coverage_spans()` is handled by +[`to_refined_spans()`][to-refined-spans], which iterates through the `CoverageSpan`s, +merges and de-duplicates them, and returns an optimal, minimal set of `CoverageSpan`s +that can be used to assign coverage `Counter`s or `Expression`s, one-for-one. + +An visual, interactive representation of the final `CoverageSpan`s can be +generated with the following `rustc` flags: + +```shell +$ rustc -Z instrument-coverage -Z dump-mir=InstrumentCoverage \ + -Z dump-mir-spanview some_rust_source.rs +``` + +These flags request Spanview output for the `InstrumentCoverage` pass, and the +resulting files (one for each MIR, that is, for each function or closure) can be +found in the `mir_dump` directory (by default), with the extension: +`.-------.InstrumentCoverage.0.html`. + +cropped image of a sample Spanview in a browser +
    + +The image above shows one such example. The orange and blue backgrounds +highlight alternating `CoverageSpan`s from the refined set. Hovering over a +line expands the output on that line to show the MIR `BasicBlock` IDs covered +by each `CoverageSpan`. While hovering, the `CoverageSpan` under the pointer +also has a _tooltip_ block of text, showing even more detail, including the +MIR `Statement`s and `Terminator`s contributing to the `CoverageSpan`, and +their individual `Span`s (which should be encapsulated within the code region +of the refined `CoverageSpan`) + +[coverage-spans]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/spans/struct.CoverageSpans.html +[coverage-span]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/spans/struct.CoverageSpan.html +[to-refined-spans]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/spans/struct.CoverageSpans.html#method.to_refined_spans + +### `make_bcb_counters()` + +[`make_bcb_counters()`][make-bcb-counters] traverses the `CoverageGraph` and adds a +`Counter` or `Expression` to every BCB. It uses _Control Flow Analysis_ +to determine where an `Expression` can be used in place of a `Counter`. +`Expressions` have no runtime overhead, so if a viable expression (adding or +subtracting two other counters or expressions) can compute the same result as +an embedded counter, an `Expression` is preferred. + +[`TraverseCoverageGraphWithLoops`][traverse-coverage-graph-with-loops] +provides a traversal order that ensures all `BasicCoverageBlock` nodes in a +loop are visited before visiting any node outside that loop. The traversal +state includes a `context_stack`, with the current loop's context information +(if in a loop), as well as context for nested loops. + +Within loops, nodes with multiple outgoing edges (generally speaking, these +are BCBs terminated in a `SwitchInt`) can be optimized when at least one +branch exits the loop and at least one branch stays within the loop. (For an +`if` or `while`, there are only two branches, but a `match` may have more.) + +A branch that does not exit the loop should be counted by `Expression`, if +possible. Note that some situations require assigning counters to BCBs before +they are visited by traversal, so the `counter_kind` (`CoverageKind` for +a `Counter` or `Expression`) may have already been assigned, in which case +one of the other branches should get the `Expression`. + +For a node with more than two branches (such as for more than two +`match` patterns), only one branch can be optimized by `Expression`. All +others require a `Counter` (unless its BCB `counter_kind` was previously +assigned). + +A branch expression is derived from the equation: + +```text +Counter(branching_node) = SUM(Counter(branches)) +``` + +It's important to +be aware that the `branches` in this equation are the outgoing _edges_ +from the `branching_node`, but a `branch`'s target node may have other +incoming edges. Given the following graph, for example, the count for +`B` is the sum of its two incoming edges: + +Example graph with multiple incoming edges to a branch node +
    + +In this situation, BCB node `B` may require an edge counter for its +"edge from A", and that edge might be computed from an `Expression`, +`Counter(A) - Counter(C)`. But an expression for the BCB _node_ `B` +would be the sum of all incoming edges: + +```text +Expression((Counter(A) - Counter(C)) + SUM(Counter(remaining_edges))) +``` + +Note that this is only one possible configuration. The actual choice +of `Counter` vs. `Expression` also depends on the order of counter +assignments, and whether a BCB or incoming edge counter already has +its `Counter` or `Expression`. + +[bcb-counters]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/counters/struct.BcbCounters.html +[traverse-coverage-graph-with-loops]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/graph/struct.TraverseCoverageGraphWithLoops.html + +### Injecting counters into a MIR `BasicBlock` + +With the refined `CoverageSpan`s, and after all `Counter`s and `Expression`s are +created, the final step is to inject the `StatementKind::Coverage` statements +into the MIR. There are three distinct sources, handled by the following +functions: + +- [`inject_coverage_span_counters()`][inject-coverage-span-counters] injects the + counter from each `CoverageSpan`'s BCB. +- [`inject_indirect_counters()`][inject-indirect-counters] injects counters + for any BCB not assigned to a `CoverageSpan`, and for all edge counters. + These counters don't have `CoverageSpan`s. +- [`inject_intermediate_expression()`][inject-intermediate-expression] injects + the intermediate expressions returned from `make_bcb_counters()`. These + counters aren't associated with any BCB, edge, or `CoverageSpan`. + +These three functions inject the `Coverage` statements into the MIR. +`Counter`s and `Expression`s with `CoverageSpan`s add `Coverage` statements +to a corresponding `BasicBlock`, with a `CodeRegion` computed from the +refined `Span` and current `SourceMap`. + +All other `Coverage` statements have a `CodeRegion` of `None`, but they +still must be injected because they contribute to other `Expression`s. + +Finally, edge's with a `CoverageKind::Counter` require a new `BasicBlock`, +so the counter is only incremented when traversing the branch edge. + +[inject-coverage-span-counters]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/struct.Instrumentor.html#method.inject_coverage_span_counters +[inject-indirect-counters]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/struct.Instrumentor.html#method.inject_indirect_counters +[inject-intermediate-expression]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/fn.inject_intermediate_expression.html + +### Additional Debugging Support + +See the +[crate documentation for `rustc_mir::transform::coverage::debug`][coverage-debugging] +for a detailed description of the debug output, logging, and configuration options +available to developers working on the `InstrumentCoverage` pass. + +[coverage-debugging]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/coverage/debug/index.html diff --git a/src/doc/rustc-dev-guide/src/lowering.md b/src/doc/rustc-dev-guide/src/lowering.md index e0dc99bab0..a4d270b4df 100644 --- a/src/doc/rustc-dev-guide/src/lowering.md +++ b/src/doc/rustc-dev-guide/src/lowering.md @@ -18,7 +18,7 @@ of such structures include but are not limited to * Converted to a virtual `existential type` declaration Lowering needs to uphold several invariants in order to not trigger the -sanity checks in `src/librustc_middle/hir/map/hir_id_validator.rs`: +sanity checks in `compiler/rustc_middle/src/hir/map/hir_id_validator.rs`: 1. A `HirId` must be used if created. So if you use the `lower_node_id`, you *must* use the resulting `NodeId` or `HirId` (either is fine, since diff --git a/src/doc/rustc-dev-guide/src/macro-expansion.md b/src/doc/rustc-dev-guide/src/macro-expansion.md index 2795982705..7385cefb38 100644 --- a/src/doc/rustc-dev-guide/src/macro-expansion.md +++ b/src/doc/rustc-dev-guide/src/macro-expansion.md @@ -1,149 +1,183 @@ # Macro expansion -> `librustc_ast`, `librustc_expand`, and `librustc_builtin_macros` are all undergoing + + +> `rustc_ast`, `rustc_expand`, and `rustc_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 -normal Rust parser, and the macro parser. During the parsing phase, the normal -Rust parser will set aside the contents of macros and their invocations. Later, -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/librustc_expand/mbe/`][code_dir]. This chapter aims to explain how macro -expansion works. - -### Example - -It's helpful to have an example to refer to. For the remainder of this chapter, -whenever we refer to the "example _definition_", we mean the following: +Rust has a very powerful macro system. In the previous chapter, we saw how the +parser sets aside macros to be expanded (it temporarily uses [placeholders]). +This chapter is about the process of expanding those macros iteratively until +we have a complete AST for our crate with no unexpanded macros (or a compile +error). + +[placeholders]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/placeholders/index.html + +First, we will discuss the algorithm that expands and integrates macro output +into ASTs. Next, we will take a look at how hygiene data is collected. Finally, +we will look at the specifics of expanding different types of macros. + +Many of the algorithms and data structures described below are in [`rustc_expand`], +with basic data structures in [`rustc_expand::base`][base]. + +Also of note, `cfg` and `cfg_attr` are treated specially from other macros, and are +handled in [`rustc_expand::config`][cfg]. + +[`rustc_expand`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/index.html +[base]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/base/index.html +[cfg]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/config/index.html + +## Expansion and AST Integration + +First of all, expansion happens at the crate level. Given a raw source code for +a crate, the compiler will produce a massive AST with all macros expanded, all +modules inlined, etc. The primary entry point for this process is the +[`MacroExpander::fully_expand_fragment`][fef] method. With few exceptions, we +use this method on the whole crate (see ["Eager Expansion"](#eager-expansion) +below for more detailed discussion of edge case expansion issues). + +[`rustc_builtin_macros`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_builtin_macros/index.html +[reb]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/build/index.html + +At a high level, [`fully_expand_fragment`][fef] works in iterations. We keep a +queue of unresolved macro invocations (that is, macros we haven't found the +definition of yet). We repeatedly try to pick a macro from the queue, resolve +it, expand it, and integrate it back. If we can't make progress in an +iteration, this represents a compile error. Here is the [algorithm][original]: + +[fef]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/expand/struct.MacroExpander.html#method.fully_expand_fragment +[original]: https://github.com/rust-lang/rust/pull/53778#issuecomment-419224049 + +0. Initialize an `queue` of unresolved macros. +1. Repeat until `queue` is empty (or we make no progress, which is an error): + 0. [Resolve](./name-resolution.md) imports in our partially built crate as + much as possible. + 1. Collect as many macro [`Invocation`s][inv] as possible from our + partially built crate (fn-like, attributes, derives) and add them to the + queue. + 2. Dequeue the first element, and attempt to resolve it. + 3. If it's resolved: + 0. Run the macro's expander function that consumes a [`TokenStream`] or + AST and produces a [`TokenStream`] or [`AstFragment`] (depending on + the macro kind). (A `TokenStream` is a collection of [`TokenTree`s][tt], + each of which are a token (punctuation, identifier, or literal) or a + delimited group (anything inside `()`/`[]`/`{}`)). + - At this point, we know everything about the macro itself and can + call `set_expn_data` to fill in its properties in the global data; + that is the hygiene data associated with `ExpnId`. (See [the + "Hygiene" section below][hybelow]). + 1. Integrate that piece of AST into the big existing partially built + AST. This is essentially where the "token-like mass" becomes a + proper set-in-stone AST with side-tables. It happens as follows: + - If the macro produces tokens (e.g. a proc macro), we parse into + an AST, which may produce parse errors. + - During expansion, we create `SyntaxContext`s (hierarchy 2). (See + [the "Hygiene" section below][hybelow]) + - These three passes happen one after another on every AST fragment + freshly expanded from a macro: + - [`NodeId`]s are assigned by [`InvocationCollector`]. This + also collects new macro calls from this new AST piece and + adds them to the queue. + - ["Def paths"][defpath] are created and [`DefId`]s are + assigned to them by [`DefCollector`]. + - Names are put into modules (from the resolver's point of + view) by [`BuildReducedGraphVisitor`]. + 2. After expanding a single macro and integrating its output, continue + to the next iteration of [`fully_expand_fragment`][fef]. + 4. If it's not resolved: + 0. Put the macro back in the queue + 1. Continue to next iteration... + +[defpath]: https://rustc-dev-guide.rust-lang.org/hir.html?highlight=def,path#identifiers-in-the-hir +[`NodeId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/node_id/struct.NodeId.html +[`InvocationCollector`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/expand/struct.InvocationCollector.html +[`DefId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/def_id/struct.DefId.html +[`DefCollector`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_resolve/def_collector/struct.DefCollector.html +[`BuildReducedGraphVisitor`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_resolve/build_reduced_graph/struct.BuildReducedGraphVisitor.html +[hybelow]: #hygiene-and-hierarchies +[tt]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/tokenstream/enum.TokenTree.html +[`TokenStream`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/tokenstream/struct.TokenStream.html +[inv]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/expand/struct.Invocation.html +[`AstFragment`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/expand/enum.AstFragment.html + +### Error Recovery + +If we make no progress in an iteration, then we have reached a compilation +error (e.g. an undefined macro). We attempt to recover from failures +(unresolved macros or imports) for the sake of diagnostics. This allows +compilation to continue past the first error, so that we can report more errors +at a time. Recovery can't cause compilation to succeed. We know that it will +fail at this point. The recovery happens by expanding unresolved macros into +[`ExprKind::Err`][err]. + +[err]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/ast/enum.ExprKind.html#variant.Err + +### Name Resolution + +Notice that name resolution is involved here: we need to resolve imports and +macro names in the above algorithm. This is done in +[`rustc_resolve::macros`][mresolve], which resolves macro paths, validates +those resolutions, and reports various errors (e.g. "not found" or "found, but +it's unstable" or "expected x, found y"). However, we don't try to resolve +other names yet. This happens later, as we will see in the [next +chapter](./name-resolution.md). + +[mresolve]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_resolve/macros/index.html + +### Eager Expansion + +_Eager expansion_ means that we expand the arguments of a macro invocation +before the macro invocation itself. This is implemented only for a few special +built-in macros that expect literals; expanding arguments first for some of +these macro results in a smoother user experience. As an example, consider the +following: ```rust,ignore -macro_rules! printer { - (print $mvar:ident) => { - println!("{}", $mvar); - }; - (print twice $mvar:ident) => { - println!("{}", $mvar); - println!("{}", $mvar); - }; -} -``` +macro bar($i: ident) { $i } +macro foo($i: ident) { $i } -`$mvar` is called a _metavariable_. Unlike normal variables, rather than -binding to a value in a computation, a metavariable binds _at compile time_ to -a tree of _tokens_. A _token_ is a single "unit" of the grammar, such as an -identifier (e.g. `foo`) or punctuation (e.g. `=>`). There are also other -special tokens, such as `EOF`, which indicates that there are no more tokens. -Token trees resulting from paired parentheses-like characters (`(`...`)`, -`[`...`]`, and `{`...`}`) – they include the open and close and all the tokens -in between (we do require that parentheses-like characters be balanced). Having -macro expansion operate on token streams rather than the raw bytes of a source -file abstracts away a lot of complexity. The macro expander (and much of the -rest of the compiler) doesn't really care that much about the exact line and -column of some syntactic construct in the code; it cares about what constructs -are used in the code. Using tokens allows us to care about _what_ without -worrying about _where_. For more information about tokens, see the -[Parsing][parsing] chapter of this book. - -Whenever we refer to the "example _invocation_", we mean the following snippet: - -```rust,ignore -printer!(print foo); // Assume `foo` is a variable defined somewhere else... +foo!(bar!(baz)); ``` -The process of expanding the macro invocation into the syntax tree -`println!("{}", foo)` and then expanding that into a call to `Display::fmt` is -called _macro expansion_, and it is the topic of this chapter. - -### The macro parser - -There are two parts to macro expansion: parsing the definition and parsing the -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/librustc_expand/mbe/macro_parser.rs`][code_mp]. - -The interface of the macro parser is as follows (this is slightly simplified): - -```rust,ignore -fn parse_tt( - parser: &mut Cow, - ms: &[TokenTree], -) -> NamedParseResult -``` - -We use these items in macro parser: - -- `sess` is a "parsing session", which keeps track of some metadata. Most - notably, this is used to keep track of errors that are generated so they can - be reported to the user. -- `tts` is a stream of tokens. The macro parser's job is to consume the raw - stream of tokens and output a binding of metavariables to corresponding token - trees. -- `ms` a _matcher_. This is a sequence of token trees that we want to match - `tts` against. - -In the analogy of a regex parser, `tts` is the input and we are matching it -against the pattern `ms`. Using our examples, `tts` could be the stream of -tokens containing the inside of the example invocation `print foo`, while `ms` -might be the sequence of token (trees) `print $mvar:ident`. - -The output of the parser is a `NamedParseResult`, which indicates which of -three cases has occurred: - -- Success: `tts` matches the given matcher `ms`, and we have produced a binding - from metavariables to the corresponding token trees. -- Failure: `tts` does not match `ms`. This results in an error message such as - "No rule expected token _blah_". -- Error: some fatal error has occurred _in the parser_. For example, this - happens if there are more than one pattern match, since that indicates - the macro is ambiguous. - -The full interface is defined [here][code_parse_int]. - -The macro parser does pretty much exactly the same as a normal regex parser with -one exception: in order to parse different types of metavariables, such as -`ident`, `block`, `expr`, etc., the macro parser must sometimes call back to the -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/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 -comes to a `macro_rules` definition, it uses this pattern to match the two token -trees per rule in the definition of the macro _using the macro parser itself_. -In our example definition, the metavariable `$lhs` would match the patterns of -both arms: `(print $mvar:ident)` and `(print twice $mvar:ident)`. And `$rhs` -would match the bodies of both arms: `{ println!("{}", $mvar); }` and `{ -println!("{}", $mvar); println!("{}", $mvar); }`. The parser would keep this -knowledge around for when it needs to expand a macro invocation. - -When the compiler comes to a macro invocation, it parses that invocation using -the same NFA-based macro parser that is described above. However, the matcher -used is the first token tree (`$lhs`) extracted from the arms of the macro -_definition_. Using our example, we would try to match the token stream `print -foo` from the invocation against the matchers `print $mvar:ident` and `print -twice $mvar:ident` that we previously extracted from the definition. The -algorithm is exactly the same, but when the macro parser comes to a place in the -current matcher where it needs to match a _non-terminal_ (e.g. `$mvar:ident`), -it calls back to the normal Rust parser to get the contents of that -non-terminal. In this case, the Rust parser would look for an `ident` token, -which it finds (`foo`) and returns to the macro parser. Then, the macro parser -proceeds in parsing as normal. Also, note that exactly one of the matchers from -the various arms should match the invocation; if there is more than one match, -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/librustc_expand/mbe/macro_parser.rs`][code_mp]. - -### Hygiene +A lazy expansion would expand `foo!` first. An eager expansion would expand +`bar!` first. + +Eager expansion is not a generally available feature of Rust. Implementing +eager expansion more generally would be challenging, but we implement it for a +few special built-in macros for the sake of user experience. The built-in +macros are implemented in [`rustc_builtin_macros`], along with some other early +code generation facilities like injection of standard library imports or +generation of test harness. There are some additional helpers for building +their AST fragments in [`rustc_expand::build`][reb]. Eager expansion generally +performs a subset of the things that lazy (normal) expansion. It is done by +invoking [`fully_expand_fragment`][fef] on only part of a crate (as opposed to +whole crate, like we normally do). + +### Other Data Structures + +Here are some other notable data structures involved in expansion and integration: +- [`ResolverExpand`] - a trait used to break crate dependencies. This allows the + resolver services to be used in [`rustc_ast`], despite [`rustc_resolve`] and + pretty much everything else depending on [`rustc_ast`]. +- [`ExtCtxt`]/[`ExpansionData`] - various intermediate data kept and used by expansion + infrastructure in the process of its work +- [`Annotatable`] - a piece of AST that can be an attribute target, almost same + thing as AstFragment except for types and patterns that can be produced by + macros but cannot be annotated with attributes +- [`MacResult`] - a "polymorphic" AST fragment, something that can turn into a + different `AstFragment` depending on its [`AstFragmentKind`] - item, + or expression, or pattern etc. + +[`rustc_ast`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/index.html +[`rustc_resolve`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_resolve/index.html +[`ResolverExpand`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/base/trait.ResolverExpand.html +[`ExtCtxt`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/base/struct.ExtCtxt.html +[`ExpansionData`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/base/struct.ExpansionData.html +[`Annotatable`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/base/enum.Annotatable.html +[`MacResult`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/base/trait.MacResult.html +[`AstFragmentKind`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/expand/enum.AstFragmentKind.html + +## Hygiene and Hierarchies If you have ever used C/C++ preprocessor macros, you know that there are some annoying and hard-to-debug gotchas! For example, consider the following C code: @@ -190,728 +224,394 @@ a macro author may want to introduce a new name to the context where the macro was called. Alternately, the macro author may be defining a variable for use only within the macro (i.e. it should not be visible outside the macro). -In rustc, this "context" is tracked via `Span`s. - -TODO: what is call-site hygiene? what is def-site hygiene? - -TODO - -### Procedural Macros - -TODO - -### Custom Derive - -TODO - -TODO: maybe something about macros 2.0? - - -[code_dir]: https://github.com/rust-lang/rust/tree/master/src/librustc_expand/mbe +[code_dir]: https://github.com/rust-lang/rust/tree/master/compiler/rustc_expand/src/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_tt.html [parsing]: ./the-parser.html +The context is attached to AST nodes. All AST nodes generated by macros have +context attached. Additionally, there may be other nodes that have context +attached, such as some desugared syntax (non-macro-expanded nodes are +considered to just have the "root" context, as described below). +Throughout the compiler, we use [`rustc_span::Span`s][span] to refer to code locations. +This struct also has hygiene information attached to it, as we will see later. -# Discussion about hygiene - -The rest of this chapter is a dump of a discussion between `mark-i-m` and -`petrochenkov` about Macro Expansion and Hygiene. I am pasting it here so that -it never gets lost until we can make it into a proper chapter. - -```txt -mark-i-m: @Vadim Petrochenkov Hi :wave: -I was wondering if you would have a chance sometime in the next month or so to -just have a zulip discussion where you tell us (WG-learning) everything you -know about macros/expansion/hygiene. We were thinking this could be less formal -(and less work for you) than compiler lecture series lecture... thoughts? - -mark-i-m: The goal is to fill out that long-standing gap in the rustc-dev-guide - -Vadim Petrochenkov: Ok, I'm at UTC+03:00 and generally available in the -evenings (or weekends). - -mark-i-m: @Vadim Petrochenkov Either of those works for me (your evenings are -about lunch time for me :) ) Is there a particular date that would work best -for you? - -mark-i-m: @WG-learning Does anyone else have a preferred date? - - Vadim Petrochenkov: - - Is there a particular date that would work best for you? - -Nah, not much difference. (If something changes for a specific day, I'll -notify.) - -Santiago Pastorino: week days are better, but I'd say let's wait for @Vadim -Petrochenkov to say when they are ready for it and we can set a date - -Santiago Pastorino: also, we should record this so ... I guess it doesn't -matter that much when :) - - mark-i-m: - - also, we should record this so ... I guess it doesn't matter that much when - :) - -@Santiago Pastorino My thinking was to just use zulip, so we would have the log - -mark-i-m: @Vadim Petrochenkov @WG-learning How about 2 weeks from now: July 24 -at 5pm UTC time (if I did the math right, that should be evening for Vadim) - -Amanjeev Sethi: i can try and do this but I am starting a new job that week so -cannot promise. - - Santiago Pastorino: - - Vadim Petrochenkov @WG-learning How about 2 weeks from now: July 24 at 5pm - UTC time (if I did the math right, that should be evening for Vadim) - -works perfect for me - -Santiago Pastorino: @mark-i-m I have access to the compiler calendar so I can -add something there - -Santiago Pastorino: let me know if you want to add an event to the calendar, I -can do that - -Santiago Pastorino: how long it would be? - - mark-i-m: - - let me know if you want to add an event to the calendar, I can do that - -mark-i-m: That could be good :+1: - - mark-i-m: - - how long it would be? - -Let's start with 30 minutes, and if we need to schedule another we cna - - Vadim Petrochenkov: - - 5pm UTC - -1-2 hours later would be better, 5pm UTC is not evening enough. - -Vadim Petrochenkov: How exactly do you plan the meeting to go (aka how much do -I need to prepare)? - - Santiago Pastorino: - - 5pm UTC - - 1-2 hours later would be better, 5pm UTC is not evening enough. - -Scheduled for 7pm UTC then - - Santiago Pastorino: - - How exactly do you plan the meeting to go (aka how much do I need to - prepare)? - -/cc @mark-i-m - -mark-i-m: @Vadim Petrochenkov - - How exactly do you plan the meeting to go (aka how much do I need to - prepare)? - -My hope was that this could be less formal than for a compiler lecture series, -but it would be nice if you could have in your mind a tour of the design and -the code - -That is, imagine that a new person was joining the compiler team and needed to -get up to speed about macros/expansion/hygiene. What would you tell such a -person? - -mark-i-m: @Vadim Petrochenkov Are we still on for tomorrow at 7pm UTC? - -Vadim Petrochenkov: Yes. - -Santiago Pastorino: @Vadim Petrochenkov @mark-i-m I've added an event on rust -compiler team calendar - -mark-i-m: @WG-learning @Vadim Petrochenkov Hello! - -mark-i-m: We will be starting in ~7 minutes - -mark-i-m: :wave: - -Vadim Petrochenkov: I'm here. - -mark-i-m: Cool :) - -Santiago Pastorino: hello @Vadim Petrochenkov - -mark-i-m: Shall we start? - -mark-i-m: First off, @Vadim Petrochenkov Thanks for doing this! - -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: 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) librustc_span/lib.rs - some -secondary methods like macro backtrace using primary methods from hygiene.rs -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. librustc_ast/config.rs - -implementation of cfg/cfg_attr (they treated specially from other macros), -should probably be moved into librustc_ast/ext. librustc_ast/tokenstream.rs + -librustc_ast/parse/token.rs - structures for compiler-side tokens, token trees, -and token streams. librustc_ast/ext - various expansion-related stuff -librustc_ast/ext/base.rs - basic structures used by expansion -librustc_ast/ext/expand.rs - some expansion structures and the bulk of expansion -infrastructure code - collecting macro invocations, calling into resolve for -them, calling their expanding functions, and integrating the results back into -AST librustc_ast/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 -librustc_ast/ext/builer.rs - helper functions for building AST for built-in macros -in librustc_builtin_macros (and user-defined syntactic plugins previously), can probably -be moved into librustc_builtin_macros these days librustc_ast/ext/proc_macro.rs + -librustc_ast/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 librustc_ast/ext/tt - -implementation of macro_rules, turns macro_rules DSL into something with -signature Fn(TokenStream) -> TokenStream that can eat and produce tokens, -@mark-i-m knows more about this librustc_resolve/macros.rs - resolving macro -paths, validating those resolutions, reporting various "not found"/"found, but -it's unstable"/"expected x, found y" errors librustc_middle/hir/map/def_collector.rs + -librustc_resolve/build_reduced_graph.rs - integrate an AST fragment freshly -expanded from a macro into various parent/child structures like module -hierarchy or "definition paths" - -Primary structures: HygieneData - global piece of data containing hygiene and -expansion info that can be accessed from any Ident without any context ExpnId - -ID of a macro call or desugaring (and also expansion of that call/desugaring, -depending on context) ExpnInfo/InternalExpnData - a subset of properties from -both macro definition and macro call available through global data -SyntaxContext - ID of a chain of nested macro definitions (identified by -ExpnIds) SyntaxContextData - data associated with the given SyntaxContext, -mostly a cache for results of filtering that chain in different ways Span - a -code location + SyntaxContext Ident - interned string (Symbol) + Span, i.e. a -string with attached hygiene data TokenStream - a collection of TokenTrees -TokenTree - a token (punctuation, identifier, or literal) or a delimited group -(anything inside ()/[]/{}) SyntaxExtension - a lowered macro representation, -contains its expander function transforming a tokenstream or AST into -tokenstream or AST + some additional data like stability, or a list of unstable -features allowed inside the macro. SyntaxExtensionKind - expander functions -may have several different signatures (take one token stream, or two, or a -piece of AST, etc), this is an enum that lists them -ProcMacro/TTMacroExpander/AttrProcMacro/MultiItemModifier - traits representing -the expander signatures (TODO: change and rename the signatures into something -more consistent) trait Resolver - a trait used to break crate dependencies (so -resolver services can be used in librustc_ast, despite librustc_resolve and pretty -much everything else depending on librustc_ast) ExtCtxt/ExpansionData - various -intermediate data kept and used by expansion infra in the process of its work -AstFragment - a piece of AST that can be produced by a macro (may include -multiple homogeneous AST nodes, like e.g. a list of items) Annotatable - a -piece of AST that can be an attribute target, almost same thing as AstFragment -except for types and patterns that can be produced by macros but cannot be -annotated with attributes (TODO: Merge into AstFragment) trait MacResult - a -"polymorphic" AST fragment, something that can turn into a different -AstFragment depending on its context (aka AstFragmentKind - item, or -expression, or pattern etc.) Invocation/InvocationKind - a structure describing -a macro call, these structures are collected by the expansion infra -(InvocationCollector), queued, resolved, expanded when resolved, etc. - -Primary algorithms / actions: TODO - -mark-i-m: Very useful :+1: - -mark-i-m: @Vadim Petrochenkov Zulip doesn't have an indication of typing, so -I'm not sure if you are waiting for me or not - -Vadim Petrochenkov: The TODO part should be about how a crate transitions from -the state "macros exist as written in source" to "all macros are expanded", but -I didn't write it yet. - -Vadim Petrochenkov: (That should probably better happen off-line.) - -Vadim Petrochenkov: Now, if you have any questions? - -mark-i-m: Thanks :) - -mark-i-m: /me is still reading :P - -mark-i-m: Ok - -mark-i-m: So I guess my first question is about hygiene, since that remains the -most mysterious to me... My understanding is that the parser outputs AST nodes, -where each node has a Span - -mark-i-m: In the absence of macros and desugaring, what does the syntax context -of an AST node look like? - -mark-i-m: @Vadim Petrochenkov - -Vadim Petrochenkov: Not each node, but many of them. When a node is not -macro-expanded, its context is 0. - -Vadim Petrochenkov: aka SyntaxContext::empty() - -Vadim Petrochenkov: it's a chain that consists of one expansion - expansion 0 -aka ExpnId::root. - -mark-i-m: Do all expansions start at root? - -Vadim Petrochenkov: Also, SyntaxContext:empty() is its own father. - -mark-i-m: Is this actually stored somewhere or is it a logical value? - -Vadim Petrochenkov: All expansion hyerarchies (there are several of them) start -at ExpnId::root. - -Vadim Petrochenkov: Vectors in HygieneData has entries for both ctxt == 0 and -expn_id == 0. - -Vadim Petrochenkov: I don't think anyone looks into them much though. - -mark-i-m: Ok - -Vadim Petrochenkov: Speaking of multiple hierarchies... +[span]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/struct.Span.html -mark-i-m: Go ahead :) +Because macros invocations and definitions can be nested, the syntax context of +a node must be a hierarchy. For example, if we expand a macro and there is +another macro invocation or definition in the generated output, then the syntax +context should reflect the nesting. -Vadim Petrochenkov: One is parent (expn_id1) -> parent(expn_id2) -> ... +However, it turns out that there are actually a few types of context we may +want to track for different purposes. Thus, there are not just one but _three_ +expansion hierarchies that together comprise the hygiene information for a +crate. -Vadim Petrochenkov: This is the order in which macros are expanded. +All of these hierarchies need some sort of "macro ID" to identify individual +elements in the chain of expansions. This ID is [`ExpnId`]. All macros receive +an integer ID, assigned continuously starting from 0 as we discover new macro +calls. All hierarchies start at [`ExpnId::root()`][rootid], which is its own +parent. -Vadim Petrochenkov: Well. +[`rustc_span::hygiene`][hy] contains all of the hygiene-related algorithms +(with the exception of some hacks in [`Resolver::resolve_crate_root`][hacks]) +and structures related to hygiene and expansion that are kept in global data. -Vadim Petrochenkov: When we are expanding one macro another macro is revealed -in its output. +The actual hierarchies are stored in [`HygieneData`][hd]. This is a global +piece of data containing hygiene and expansion info that can be accessed from +any [`Ident`] without any context. -Vadim Petrochenkov: That's the parent-child relation in this hierarchy. -Vadim Petrochenkov: InternalExpnData::parent is the child->parent link. +[`ExpnId`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/hygiene/struct.ExpnId.html +[rootid]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/hygiene/struct.ExpnId.html#method.root +[hd]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/hygiene/struct.HygieneData.html +[hy]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/hygiene/index.html +[hacks]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_resolve/struct.Resolver.html#method.resolve_crate_root +[`Ident`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/symbol/struct.Ident.html -mark-i-m: So in the above chain expn_id1 is the child? +### The Expansion Order Hierarchy -Vadim Petrochenkov: Yes. +The first hierarchy tracks the order of expansions, i.e., when a macro +invocation is in the output of another macro. -Vadim Petrochenkov: The second one is parent (SyntaxContext1) -> -parent(SyntaxContext2) -> ... +Here, the children in the hierarchy will be the "innermost" tokens. The +[`ExpnData`] struct itself contains a subset of properties from both macro +definition and macro call available through global data. +[`ExpnData::parent`][edp] tracks the child -> parent link in this hierarchy. -Vadim Petrochenkov: This is about nested macro definitions. When we are -expanding one macro another macro definition is revealed in its output. +[`ExpnData`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/hygiene/struct.ExpnData.html +[edp]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/hygiene/struct.ExpnData.html#structfield.parent -Vadim Petrochenkov: SyntaxContextData::parent is the child->parent link here. - -Vadim Petrochenkov: So, SyntaxContext is the whole chain in this hierarchy, and -outer_expns are individual elements in the chain. - -mark-i-m: So for example, suppose I have the following: +For example, +```rust,ignore macro_rules! foo { () => { println!(); } } fn main() { foo!(); } +``` -Then AST nodes that are finally generated would have parent(expn_id_println) -> -parent(expn_id_foo), right? - -Vadim Petrochenkov: Pretty common construction (at least it was, before -refactorings) is SyntaxContext::empty().apply_mark(expn_id), which means... - - Vadim Petrochenkov: - - Then AST nodes that are finally generated would have - parent(expn_id_println) -> parent(expn_id_foo), right? - -Yes. - - mark-i-m: - - and outer_expns are individual elements in the chain. - -Sorry, what is outer_expns? - -Vadim Petrochenkov: SyntaxContextData::outer_expn - -mark-i-m: Thanks :) Please continue - -Vadim Petrochenkov: ...which means a token produced by a built-in macro (which -is defined in the root effectively). - -mark-i-m: Where does the expn_id come from? - -Vadim Petrochenkov: Or a stable proc macro, which are always considered to be -defined in the root because they are always cross-crate, and we don't have the -cross-crate hygiene implemented, ha-ha. - - Vadim Petrochenkov: - - Where does the expn_id come from? - -Vadim Petrochenkov: ID of the built-in macro call like line!(). - -Vadim Petrochenkov: Assigned continuously from 0 to N as soon as we discover -new macro calls. - -mark-i-m: Sorry, I didn't quite understand. Do you mean that only built-in -macros receive continuous IDs? - -Vadim Petrochenkov: So, the second hierarchy has a catch - the context -transplantation hack - -https://github.com/rust-lang/rust/pull/51762#issuecomment-401400732. - - Vadim Petrochenkov: - - Do you mean that only built-in macros receive continuous IDs? - -Vadim Petrochenkov: No, all macro calls receive ID. - -Vadim Petrochenkov: Built-ins have the typical pattern -SyntaxContext::empty().apply_mark(expn_id) for syntax contexts produced by -them. - -mark-i-m: I see, but this pattern is only used for built-ins, right? - -Vadim Petrochenkov: And also all stable proc macros, see the comments above. - -mark-i-m: Got it - -Vadim Petrochenkov: The third hierarchy is call-site hierarchy. - -Vadim Petrochenkov: If foo!(bar!(ident)) expands into ident - -Vadim Petrochenkov: then hierarchy 1 is root -> foo -> bar -> ident - -Vadim Petrochenkov: but hierarchy 3 is root -> ident - -Vadim Petrochenkov: ExpnInfo::call_site is the child-parent link in this case. - -mark-i-m: When we expand, do we expand foo first or bar? Why is there a -hierarchy 1 here? Is that foo expands first and it expands to something that -contains bar!(ident)? - -Vadim Petrochenkov: Ah, yes, let's assume both foo and bar are identity macros. - -Vadim Petrochenkov: Then foo!(bar!(ident)) -> expand -> bar!(ident) -> expand --> ident - -Vadim Petrochenkov: If bar were expanded first, that would be eager expansion - -https://github.com/rust-lang/rfcs/pull/2320. - -mark-i-m: And after we expand only foo! presumably whatever intermediate state -has heirarchy 1 of root->foo->(bar_ident), right? - -Vadim Petrochenkov: (We have it hacked into some built-in macros, but not -generally.) - - Vadim Petrochenkov: - - And after we expand only foo! presumably whatever intermediate state has - heirarchy 1 of root->foo->(bar_ident), right? - -Vadim Petrochenkov: Yes. - -mark-i-m: Got it :) - -mark-i-m: It looks like we have ~5 minutes left. This has been very helpful -already, but I also have more questions. Shall we try to schedule another -meeting in the future? - -Vadim Petrochenkov: Sure, why not. - -Vadim Petrochenkov: A thread for offline questions-answers would be good too. - - mark-i-m: - - A thread for offline questions-answers would be good too. - -I don't mind using this thread, since it already has a lot of info in it. We -also plan to summarize the info from this thread into the rustc-dev-guide. - - Sure, why not. - -Unfortunately, I'm unavailable for a few weeks. Would August 21-ish work for -you (and @WG-learning )? - -mark-i-m: @Vadim Petrochenkov Thanks very much for your time and knowledge! - -mark-i-m: One last question: are there more hierarchies? - -Vadim Petrochenkov: Not that I know of. Three + the context transplantation -hack is already more complex than I'd like. - -mark-i-m: Yes, one wonders what it would be like if one also had to think about -eager expansion... - -Santiago Pastorino: sorry but I couldn't follow that much today, will read it -when I have some time later - -Santiago Pastorino: btw https://github.com/rust-lang/rustc-dev-guide/issues/398 - -mark-i-m: @Vadim Petrochenkov Would 7pm UTC on August 21 work for a followup? - -Vadim Petrochenkov: Tentatively yes. - -mark-i-m: @Vadim Petrochenkov @WG-learning Does this still work for everyone? - -Vadim Petrochenkov: August 21 is still ok. - -mark-i-m: @WG-learning @Vadim Petrochenkov We will start in ~30min - -Vadim Petrochenkov: Oh. Thanks for the reminder, I forgot about this entirely. - -mark-i-m: Hello! - -Vadim Petrochenkov: (I'll be here in a couple of minutes.) - -Vadim Petrochenkov: Ok, I'm here. - -mark-i-m: Hi :) - -Vadim Petrochenkov: Hi. - -mark-i-m: so last time, we talked about the 3 context heirarchies - -Vadim Petrochenkov: Right. - -mark-i-m: Was there anything you wanted to add to that? If not, I think it -would be good to get a big-picture... Given some piece of rust code, how do we -get to the point where things are expanded and hygiene context is computed? - -mark-i-m: (I'm assuming that hygiene info is computed as we expand stuff, since -I don't think you can discover it beforehand) - -Vadim Petrochenkov: Ok, let's move from hygiene to expansion. - -Vadim Petrochenkov: Especially given that I don't remember the specific hygiene -algorithms like adjust in detail. - - Vadim Petrochenkov: - - Given some piece of rust code, how do we get to the point where things are - expanded - -So, first of all, the "some piece of rust code" is the whole crate. - -mark-i-m: Just to confirm, the algorithms are well-encapsulated, right? Like a -function or a struct as opposed to a bunch of conventions distributed across -the codebase? - -Vadim Petrochenkov: We run fully_expand_fragment in it. - - Vadim Petrochenkov: - - Just to confirm, the algorithms are well-encapsulated, right? - -Yes, the algorithmic parts are entirely inside hygiene.rs. - -Vadim Petrochenkov: Ok, some are in fn resolve_crate_root, but those are hacks. - -Vadim Petrochenkov: (Continuing about expansion.) If fully_expand_fragment is -run not on a whole crate, it means that we are performing eager expansion. - -Vadim Petrochenkov: Eager expansion is done for arguments of some built-in -macros that expect literals. - -Vadim Petrochenkov: It generally performs a subset of actions performed by the -non-eager expansion. - -Vadim Petrochenkov: So, I'll talk about non-eager expansion for now. - -mark-i-m: Eager expansion is not exposed as a language feature, right? i.e. it -is not possible for me to write an eager macro? +In this code, the AST nodes that are finally generated would have hierarchy: -Vadim Petrochenkov: -https://github.com/rust-lang/rust/pull/53778#issuecomment-419224049 (vvv The -link is explained below vvv ) +``` +root + expn_id_foo + expn_id_println +``` - Vadim Petrochenkov: +### The Macro Definition Hierarchy - Eager expansion is not exposed as a language feature, right? i.e. it is not - possible for me to write an eager macro? +The second hierarchy tracks the order of macro definitions, i.e., when we are +expanding one macro another macro definition is revealed in its output. This +one is a bit tricky and more complex than the other two hierarchies. -Yes, it's entirely an ability of some built-in macros. +[`SyntaxContext`][sc] represents a whole chain in this hierarchy via an ID. +[`SyntaxContextData`][scd] contains data associated with the given +`SyntaxContext`; mostly it is a cache for results of filtering that chain in +different ways. [`SyntaxContextData::parent`][scdp] is the child -> parent +link here, and [`SyntaxContextData::outer_expns`][scdoe] are individual +elements in the chain. The "chaining operator" is +[`SyntaxContext::apply_mark`][am] in compiler code. -Vadim Petrochenkov: Not exposed for general use. +A [`Span`][span], mentioned above, is actually just a compact representation of +a code location and `SyntaxContext`. Likewise, an [`Ident`] is just an interned +[`Symbol`] + `Span` (i.e. an interned string + hygiene data). -Vadim Petrochenkov: fully_expand_fragment works in iterations. +[`Symbol`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/symbol/struct.Symbol.html +[scd]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/hygiene/struct.SyntaxContextData.html +[scdp]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/hygiene/struct.SyntaxContextData.html#structfield.parent +[sc]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/hygiene/struct.SyntaxContext.html +[scdoe]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/hygiene/struct.SyntaxContextData.html#structfield.outer_expn +[am]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/hygiene/struct.SyntaxContext.html#method.apply_mark -Vadim Petrochenkov: Iterations looks roughly like this: -- Resolve imports in our partially built crate as much as possible. -- Collect as many macro invocations as possible from our partially built crate - (fn-like, attributes, derives) from the crate and add them to the queue. +For built-in macros, we use the context: +`SyntaxContext::empty().apply_mark(expn_id)`, and such macros are considered to +be defined at the hierarchy root. We do the same for proc-macros because we +haven't implemented cross-crate hygiene yet. - Vadim Petrochenkov: Take a macro from the queue, and attempt to resolve it. +If the token had context `X` before being produced by a macro then after being +produced by the macro it has context `X -> macro_id`. Here are some examples: - Vadim Petrochenkov: If it's resolved - run its expander function that - consumes tokens or AST and produces tokens or AST (depending on the macro - kind). +Example 0: - Vadim Petrochenkov: (If it's not resolved, then put it back into the - queue.) +```rust,ignore +macro m() { ident } -Vadim Petrochenkov: ^^^ That's where we fill in the hygiene data associated -with ExpnIds. +m!(); +``` -mark-i-m: When we put it back in the queue? +Here `ident` originally has context [`SyntaxContext::root()`][scr]. `ident` has +context `ROOT -> id(m)` after it's produced by `m`. -mark-i-m: or do you mean the collect step in general? +[scr]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/hygiene/struct.SyntaxContext.html#method.root -Vadim Petrochenkov: Once we resolved the macro call to the macro definition we -know everything about the macro and can call set_expn_data to fill in its -properties in the global data. -Vadim Petrochenkov: I mean, immediately after successful resolution. +Example 1: -Vadim Petrochenkov: That's the first part of hygiene data, the second one is -associated with SyntaxContext rather than with ExpnId, it's filled in later -during expansion. +```rust,ignore +macro m() { macro n() { ident } } -Vadim Petrochenkov: So, after we run the macro's expander function and got a -piece of AST (or got tokens and parsed them into a piece of AST) we need to -integrate that piece of AST into the big existing partially built AST. +m!(); +n!(); +``` +In this example the `ident` has context `ROOT` originally, then `ROOT -> id(m)` +after the first expansion, then `ROOT -> id(m) -> id(n)`. -Vadim Petrochenkov: This integration is a really important step where the next -things happen: -- NodeIds are assigned. +Example 2: - Vadim Petrochenkov: "def paths"s and their IDs (DefIds) are created +Note that these chains are not entirely determined by their last element, in +other words `ExpnId` is not isomorphic to `SyntaxContext`. - Vadim Petrochenkov: Names are put into modules from the resolver point of - view. +```rust,ignore +macro m($i: ident) { macro n() { ($i, bar) } } -Vadim Petrochenkov: So, we are basically turning some vague token-like mass -into proper set in stone hierarhical AST and side tables. +m!(foo); +``` -Vadim Petrochenkov: Where exactly this happens - NodeIds are assigned by -InvocationCollector (which also collects new macro calls from this new AST -piece and adds them to the queue), DefIds are created by DefCollector, and -modules are filled by BuildReducedGraphVisitor. +After all expansions, `foo` has context `ROOT -> id(n)` and `bar` has context +`ROOT -> id(m) -> id(n)`. -Vadim Petrochenkov: These three passes run one after another on every AST -fragment freshly expanded from a macro. +Finally, one last thing to mention is that currently, this hierarchy is subject +to the ["context transplantation hack"][hack]. Basically, the more modern (and +experimental) `macro` macros have stronger hygiene than the older MBE system, +but this can result in weird interactions between the two. The hack is intended +to make things "just work" for now. -Vadim Petrochenkov: After expanding a single macro and integrating its output -we again try to resolve all imports in the crate, and then return to the big -queue processing loop and pick up the next macro. +[hack]: https://github.com/rust-lang/rust/pull/51762#issuecomment-401400732 -Vadim Petrochenkov: Repeat until there's no more macros. Vadim Petrochenkov: +### The Call-site Hierarchy -mark-i-m: The integration step is where we would get parser errors too right? +The third and final hierarchy tracks the location of macro invocations. -mark-i-m: Also, when do we know definitively that resolution has failed for -particular ident? +In this hierarchy [`ExpnData::call_site`][callsite] is the child -> parent link. - Vadim Petrochenkov: +[callsite]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/hygiene/struct.ExpnData.html#structfield.call_site - The integration step is where we would get parser errors too right? +Here is an example: -Yes, if the macro produced tokens (rather than AST directly) and we had to -parse them. +```rust,ignore +macro bar($i: ident) { $i } +macro foo($i: ident) { $i } - Vadim Petrochenkov: +foo!(bar!(baz)); +``` - when do we know definitively that resolution has failed for particular - ident? +For the `baz` AST node in the final output, the first hierarchy is `ROOT -> +id(foo) -> id(bar) -> baz`, while the third hierarchy is `ROOT -> baz`. -So, ident is looked up in a number of scopes during resolution. From closest -like the current block or module, to far away like preludes or built-in types. +### Macro Backtraces -Vadim Petrochenkov: If lookup is certainly failed in all of the scopes, then -it's certainly failed. +Macro backtraces are implemented in [`rustc_span`] using the hygiene machinery +in [`rustc_span::hygiene`][hy]. -mark-i-m: This is after all expansions and integrations are done, right? +[`rustc_span`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/index.html -Vadim Petrochenkov: "Certainly" is determined differently for different scopes, -e.g. for a module scope it means no unexpanded macros and no unresolved glob -imports in that module. +## Producing Macro Output - Vadim Petrochenkov: +Above, we saw how the output of a macro is integrated into the AST for a crate, +and we also saw how the hygiene data for a crate is generated. But how do we +actually produce the output of a macro? It depends on the type of macro. - This is after all expansions and integrations are done, right? +There are two types of macros in Rust: +`macro_rules!` macros (a.k.a. "Macros By Example" (MBE)) and procedural macros +(or "proc macros"; including custom derives). During the parsing phase, the normal +Rust parser will set aside the contents of macros and their invocations. Later, +macros are expanded using these portions of the code. + +Some important data structures/interfaces here: +- [`SyntaxExtension`] - a lowered macro representation, contains its expander + function, which transforms a `TokenStream` or AST into another `TokenStream` + or AST + some additional data like stability, or a list of unstable features + allowed inside the macro. +- [`SyntaxExtensionKind`] - expander functions may have several different + signatures (take one token stream, or two, or a piece of AST, etc). This is + an enum that lists them. +- [`ProcMacro`]/[`TTMacroExpander`]/[`AttrProcMacro`]/[`MultiItemModifier`] - + traits representing the expander function signatures. + +[`SyntaxExtension`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/base/struct.SyntaxExtension.html +[`SyntaxExtensionKind`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/base/enum.SyntaxExtensionKind.html +[`ProcMacro`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/base/trait.ProcMacro.html +[`TTMacroExpander`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/base/trait.TTMacroExpander.html +[`AttrProcMacro`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/base/trait.AttrProcMacro.html +[`MultiItemModifier`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/base/trait.MultiItemModifier.html + +## Macros By Example + +MBEs have their own parser distinct from the normal Rust parser. When macros +are expanded, we may invoke the MBE parser to parse and expand a macro. The +MBE 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 +[`compiler/rustc_expand/src/mbe/`][code_dir]. -For macro and import names this happens during expansions and integrations. +### Example -mark-i-m: Makes sense +It's helpful to have an example to refer to. For the remainder of this chapter, +whenever we refer to the "example _definition_", we mean the following: -Vadim Petrochenkov: For all other names we certainly know whether a name is -resolved successfully or not on the first attempt, because no new names can -appear. +```rust,ignore +macro_rules! printer { + (print $mvar:ident) => { + println!("{}", $mvar); + }; + (print twice $mvar:ident) => { + println!("{}", $mvar); + println!("{}", $mvar); + }; +} +``` -Vadim Petrochenkov: (They are resolved in a later pass, see -librustc_resolve/late.rs.) +`$mvar` is called a _metavariable_. Unlike normal variables, rather than +binding to a value in a computation, a metavariable binds _at compile time_ to +a tree of _tokens_. A _token_ is a single "unit" of the grammar, such as an +identifier (e.g. `foo`) or punctuation (e.g. `=>`). There are also other +special tokens, such as `EOF`, which indicates that there are no more tokens. +Token trees resulting from paired parentheses-like characters (`(`...`)`, +`[`...`]`, and `{`...`}`) – they include the open and close and all the tokens +in between (we do require that parentheses-like characters be balanced). Having +macro expansion operate on token streams rather than the raw bytes of a source +file abstracts away a lot of complexity. The macro expander (and much of the +rest of the compiler) doesn't really care that much about the exact line and +column of some syntactic construct in the code; it cares about what constructs +are used in the code. Using tokens allows us to care about _what_ without +worrying about _where_. For more information about tokens, see the +[Parsing][parsing] chapter of this book. -mark-i-m: And if at the end of the iteration, there are still things in the -queue that can't be resolve, this represents an error, right? +Whenever we refer to the "example _invocation_", we mean the following snippet: -mark-i-m: i.e. an undefined macro? +```rust,ignore +printer!(print foo); // Assume `foo` is a variable defined somewhere else... +``` -Vadim Petrochenkov: Yes, if we make no progress during an iteration, then we -are stuck and that state represent an error. +The process of expanding the macro invocation into the syntax tree +`println!("{}", foo)` and then expanding that into a call to `Display::fmt` is +called _macro expansion_, and it is the topic of this chapter. -Vadim Petrochenkov: We attempt to recover though, using dummies expanding into -nothing or ExprKind::Err or something like that for unresolved macros. +### The MBE parser -mark-i-m: This is for the purposes of diagnostics, though, right? +There are two parts to MBE expansion: parsing the definition and parsing the +invocations. Interestingly, both are done by the macro parser. -Vadim Petrochenkov: But if we are going through recovery, then compilation must -result in an error anyway. +Basically, the MBE 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 [`compiler/rustc_expand/src/mbe/macro_parser.rs`][code_mp]. -Vadim Petrochenkov: Yes, that's for diagnostics, without recovery we would -stuck at the first unresolved macro or import. Vadim Petrochenkov: +The interface of the macro parser is as follows (this is slightly simplified): -So, about the SyntaxContext hygiene... +```rust,ignore +fn parse_tt( + parser: &mut Cow, + ms: &[TokenTree], +) -> NamedParseResult +``` -Vadim Petrochenkov: New syntax contexts are created during macro expansion. +We use these items in macro parser: -Vadim Petrochenkov: If the token had context X before being produced by a -macro, e.g. here ident has context SyntaxContext::root(): Vadim Petrochenkov: +- `parser` is a reference to the state of a normal Rust parser, including the + token stream and parsing session. The token stream is what we are about to + ask the MBE parser to parse. We will consume the raw stream of tokens and + output a binding of metavariables to corresponding token trees. The parsing + session can be used to report parser errors. +- `ms` a _matcher_. This is a sequence of token trees that we want to match + the token stream against. -macro m() { ident } +In the analogy of a regex parser, the token stream is the input and we are matching it +against the pattern `ms`. Using our examples, the token stream could be the stream of +tokens containing the inside of the example invocation `print foo`, while `ms` +might be the sequence of token (trees) `print $mvar:ident`. -Vadim Petrochenkov: , then after being produced by the macro it has context X --> macro_id. +The output of the parser is a `NamedParseResult`, which indicates which of +three cases has occurred: -Vadim Petrochenkov: I.e. our ident has context ROOT -> id(m) after it's -produced by m. +- Success: the token stream matches the given matcher `ms`, and we have produced a binding + from metavariables to the corresponding token trees. +- Failure: the token stream does not match `ms`. This results in an error message such as + "No rule expected token _blah_". +- Error: some fatal error has occurred _in the parser_. For example, this + happens if there are more than one pattern match, since that indicates + the macro is ambiguous. -Vadim Petrochenkov: The "chaining operator" -> is apply_mark in compiler code. -Vadim Petrochenkov: +The full interface is defined [here][code_parse_int]. -macro m() { macro n() { ident } } +The macro parser does pretty much exactly the same as a normal regex parser with +one exception: in order to parse different types of metavariables, such as +`ident`, `block`, `expr`, etc., the macro parser must sometimes call back to the +normal Rust parser. -Vadim Petrochenkov: In this example the ident has context ROOT originally, then -ROOT -> id(m), then ROOT -> id(m) -> id(n). +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 +[`compiler/rustc_expand/src/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 +comes to a `macro_rules` definition, it uses this pattern to match the two token +trees per rule in the definition of the macro _using the macro parser itself_. +In our example definition, the metavariable `$lhs` would match the patterns of +both arms: `(print $mvar:ident)` and `(print twice $mvar:ident)`. And `$rhs` +would match the bodies of both arms: `{ println!("{}", $mvar); }` and `{ +println!("{}", $mvar); println!("{}", $mvar); }`. The parser would keep this +knowledge around for when it needs to expand a macro invocation. -Vadim Petrochenkov: Note that these chains are not entirely determined by their -last element, in other words ExpnId is not isomorphic to SyntaxCtxt. +When the compiler comes to a macro invocation, it parses that invocation using +the same NFA-based macro parser that is described above. However, the matcher +used is the first token tree (`$lhs`) extracted from the arms of the macro +_definition_. Using our example, we would try to match the token stream `print +foo` from the invocation against the matchers `print $mvar:ident` and `print +twice $mvar:ident` that we previously extracted from the definition. The +algorithm is exactly the same, but when the macro parser comes to a place in the +current matcher where it needs to match a _non-terminal_ (e.g. `$mvar:ident`), +it calls back to the normal Rust parser to get the contents of that +non-terminal. In this case, the Rust parser would look for an `ident` token, +which it finds (`foo`) and returns to the macro parser. Then, the macro parser +proceeds in parsing as normal. Also, note that exactly one of the matchers from +the various arms should match the invocation; if there is more than one match, +the parse is ambiguous, while if there are no matches at all, there is a syntax +error. -Vadim Petrochenkov: Couterexample: Vadim Petrochenkov: +For more information about the macro parser's implementation, see the comments +in [`compiler/rustc_expand/src/mbe/macro_parser.rs`][code_mp]. -macro m($i: ident) { macro n() { ($i, bar) } } +### `macro`s and Macros 2.0 -m!(foo); +There is an old and mostly undocumented effort to improve the MBE system, give +it more hygiene-related features, better scoping and visibility rules, etc. There +hasn't been a lot of work on this recently, unfortunately. Internally, `macro` +macros use the same machinery as today's MBEs; they just have additional +syntactic sugar and are allowed to be in namespaces. -Vadim Petrochenkov: foo has context ROOT -> id(n) and bar has context ROOT -> -id(m) -> id(n) after all the expansions. +## Procedural Macros -mark-i-m: Cool :) +Precedural macros are also expanded during parsing, as mentioned above. +However, they use a rather different mechanism. Rather than having a parser in +the compiler, procedural macros are implemented as custom, third-party crates. +The compiler will compile the proc macro crate and specially annotated +functions in them (i.e. the proc macro itself), passing them a stream of tokens. -mark-i-m: It looks like we are out of time +The proc macro can then transform the token stream and output a new token +stream, which is synthesized into the AST. -mark-i-m: Is there anything you wanted to add? +It's worth noting that the token stream type used by proc macros is _stable_, +so `rustc` does not use it internally (since our internal data structures are +unstable). The compiler's token stream is +[`rustc_ast::tokenstream::TokenStream`][rustcts], as previously. This is +converted into the stable [`proc_macro::TokenStream`][stablets] and back in +[`rustc_expand::proc_macro`][pm] and [`rustc_expand::proc_macro_server`][pms]. +Because the Rust ABI is unstable, we use the C ABI for this conversion. -mark-i-m: We can schedule another meeting if you would like +[tsmod]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/tokenstream/index.html +[rustcts]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/tokenstream/struct.TokenStream.html +[stablets]: https://doc.rust-lang.org/proc_macro/struct.TokenStream.html +[pm]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/proc_macro/index.html +[pms]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/proc_macro_server/index.html -Vadim Petrochenkov: Yep, 23.06 already. No, I think this is an ok point to -stop. +TODO: more here. -mark-i-m: :+1: +### Custom Derive -mark-i-m: Thanks @Vadim Petrochenkov ! This was very helpful +Custom derives are a special type of proc macro. -Vadim Petrochenkov: Yeah, we can schedule another one. So far it's been like 1 -hour of meetings per month? Certainly not a big burden. -``` +TODO: more? diff --git a/src/doc/rustc-dev-guide/src/memory.md b/src/doc/rustc-dev-guide/src/memory.md index 620b7d858e..cde2f454c5 100644 --- a/src/doc/rustc-dev-guide/src/memory.md +++ b/src/doc/rustc-dev-guide/src/memory.md @@ -50,7 +50,7 @@ allocate, and which are found in this module. Here are a few examples: [subst]: ./generic_arguments.html#subst [`TraitRef`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.TraitRef.html -[`Predicate`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/enum.Predicate.html +[`Predicate`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.Predicate.html [`ty::TyS`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.TyS.html @@ -82,7 +82,7 @@ of the more Rust-ic "pull" style (think the `Iterator` trait). Thread-local storage and interning are used a lot through the compiler to reduce duplication while also preventing a lot of the ergonomic issues due to many -pervasive lifetimes. The [`rustc::ty::tls`][tls] module is used to access these +pervasive lifetimes. The [`rustc_middle::ty::tls`][tls] module is used to access these thread-locals, although you should rarely need to touch it. [tls]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/tls/index.html diff --git a/src/doc/rustc-dev-guide/src/mir/construction.md b/src/doc/rustc-dev-guide/src/mir/construction.md index f353eacdf2..d9f99be033 100644 --- a/src/doc/rustc-dev-guide/src/mir/construction.md +++ b/src/doc/rustc-dev-guide/src/mir/construction.md @@ -1,35 +1,25 @@ -# HAIR and MIR construction +# MIR construction + + The lowering of [HIR] to [MIR] occurs for the following (probably incomplete) list of items: -* Function and Closure bodies +* Function and closure bodies * Initializers of `static` and `const` items * Initializers of enum discriminants -* Glue and Shims of any kind +* Glue and shims of any kind * Tuple struct initializer functions * Drop code (the `Drop::drop` function is not called directly) * Drop implementations of types without an explicit `Drop` implementation -The lowering is triggered by calling the [`mir_built`] query. -There is an intermediate representation -between [HIR] and [MIR] called the [HAIR] that is only used during the lowering. -The [HAIR]'s most important feature is that the various adjustments (which happen -without explicit syntax) like coercions, autoderef, autoref and overloaded method -calls have become explicit casts, deref operations, reference expressions or -concrete function calls. - -The [HAIR] has datatypes that mirror the [HIR] datatypes, but instead of e.g. `-x` -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_build::hair::cx::expr`]) and then process -the [HAIR] expressions recursively. +The lowering is triggered by calling the [`mir_built`] query. The MIR builder does +not actually use the HIR but operates on the [THIR] instead, processing THIR +expressions recursively. The lowering creates local variables for every argument as specified in the signature. -Next it creates local variables for every binding specified (e.g. `(a, b): (i32, String)`) -produces 3 bindings, one for the argument, and two for the bindings. Next it generates +Next, it creates local variables for every binding specified (e.g. `(a, b): (i32, String)`) +produces 3 bindings, one for the argument, and two for the bindings. Next, it generates field accesses that read the fields from the argument and writes the value to the binding variable. @@ -152,7 +142,7 @@ case of `enum`s. [MIR]: ./index.html [HIR]: ../hir.html -[HAIR]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/hair/index.html +[THIR]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/thir/index.html -[`rustc_mir_build::hair::cx::expr`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/hair/cx/expr/index.html +[`rustc_mir_build::thir::cx::expr`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/thir/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-dev-guide/src/mir/dataflow.md b/src/doc/rustc-dev-guide/src/mir/dataflow.md new file mode 100644 index 0000000000..61277846ba --- /dev/null +++ b/src/doc/rustc-dev-guide/src/mir/dataflow.md @@ -0,0 +1,234 @@ +# Dataflow Analysis + + + +If you work on the MIR, you will frequently come across various flavors of +[dataflow analysis][wiki]. `rustc` uses dataflow to find uninitialized +variables, determine what variables are live across a generator `yield` +statement, and compute which `Place`s are borrowed at a given point in the +control-flow graph. Dataflow analysis is a fundamental concept in modern +compilers, and knowledge of the subject will be helpful to prospective +contributors. + +However, this documentation is not a general introduction to dataflow analysis. +It is merely a description of the framework used to define these analyses in +`rustc`. It assumes that the reader is familiar with the core ideas as well as +some basic terminology, such as "transfer function", "fixpoint" and "lattice". +If you're unfamiliar with these terms, or if you want a quick refresher, +[*Static Program Analysis*] by Anders Møller and Michael I. Schwartzbach is an +excellent, freely available textbook. For those who prefer audiovisual +learning, the Goethe University Frankfurt has published a series of short +[lectures on YouTube][goethe] in English that are very approachable. + +## Defining a Dataflow Analysis + +The interface for dataflow analyses is split into three traits. The first is +[`AnalysisDomain`], which must be implemented by *all* analyses. In addition to +the type of the dataflow state, this trait defines the initial value of that +state at entry to each block, as well as the direction of the analysis, either +forward or backward. The domain of your dataflow analysis must be a [lattice][] +(strictly speaking a join-semilattice) with a well-behaved `join` operator. See +documentation for the [`lattice`] module, as well as the [`JoinSemiLattice`] +trait, for more information. + +You must then provide *either* a direct implementation of the [`Analysis`] trait +*or* an implementation of the proxy trait [`GenKillAnalysis`]. The latter is for +so-called ["gen-kill" problems], which have a simple class of transfer function +that can be applied very efficiently. Analyses whose domain is not a `BitSet` +of some index type, or whose transfer functions cannot be expressed through +"gen" and "kill" operations, must implement `Analysis` directly, and will run +slower as a result. All implementers of `GenKillAnalysis` also implement +`Analysis` automatically via a default `impl`. + + +```text + AnalysisDomain + ^ + | | = has as a supertrait + | . = provides a default impl for + | + Analysis + ^ ^ + | . + | . + | . + GenKillAnalysis + +``` + +### Transfer Functions and Effects + +The dataflow framework in `rustc` allows each statement (and terminator) inside +a basic block define its own transfer function. For brevity, these +individual transfer functions are known as "effects". Each effect is applied +successively in dataflow order, and together they define the transfer function +for the entire basic block. It's also possible to define an effect for +particular outgoing edges of some terminators (e.g. +[`apply_call_return_effect`] for the `success` edge of a `Call` +terminator). Collectively, these are referred to as "per-edge effects". + +The only meaningful difference (besides the "apply" prefix) between the methods +of the `GenKillAnalysis` trait and the `Analysis` trait is that an `Analysis` +has direct, mutable access to the dataflow state, whereas a `GenKillAnalysis` +only sees an implementer of the `GenKill` trait, which only allows the `gen` +and `kill` operations for mutation. + +### "Before" Effects + +Observant readers of the documentation may notice that there are actually *two* +possible effects for each statement and terminator, the "before" effect and the +unprefixed (or "primary") effect. The "before" effects are applied immediately +before the unprefixed effect **regardless of the direction of the analysis**. +In other words, a backward analysis will apply the "before" effect and then the +the "primary" effect when computing the transfer function for a basic block, +just like a forward analysis. + +The vast majority of analyses should use only the unprefixed effects: Having +multiple effects for each statement makes it difficult for consumers to know +where they should be looking. However, the "before" variants can be useful in +some scenarios, such as when the effect of the right-hand side of an assignment +statement must be considered separately from the left-hand side. + +### Convergence + +Your analysis must converge to "fixpoint", otherwise it will run forever. +Converging to fixpoint is just another way of saying "reaching equilibrium". +In order to reach equilibrium, your analysis must obey some laws. One of the +laws it must obey is that the bottom value[^bottom-purpose] joined with some +other value equals the second value. Or, as an equation: + +> *bottom* join *x* = *x* + +Another law is that your analysis must have a "top value" such that + +> *top* join *x* = *top* + +Having a top value ensures that your semilattice has a finite height, and the +law state above ensures that once the dataflow state reaches top, it will no +longer change (the fixpoint will be top). + +[^bottom-purpose]: The bottom value's primary purpose is as the initial dataflow + state. Each basic block's entry state is initialized to bottom before the + analysis starts. + +## A Brief Example + +This section provides a brief example of a simple data-flow analysis at a high +level. It doesn't explain everything you need to know, but hopefully it will +make the rest of this page clearer. + +Let's say we want to do a simple analysis to find if `mem::transmute` may have +been called by a certain point in the program. Our analysis domain will just +be a `bool` that records whether `transmute` has been called so far. The bottom +value will be `false`, since by default `transmute` has not been called. The top +value will be `true`, since our analysis is done as soon as we determine that +`transmute` has been called. Our join operator will just be the boolean OR (`||`) +operator. We use OR and not AND because of this case: + +``` +let x = if some_cond { + std::mem::transmute(0_i32); // transmute was called! +} else { + 1_u32; // transmute was not called +}; + +// Has transmute been called by this point? We conservatively approximate that +// as yes, and that is why we use the OR operator. +println!("x: {}", x); +``` + +## Inspecting the Results of a Dataflow Analysis + +Once you have constructed an analysis, you must pass it to an [`Engine`], which +is responsible for finding the steady-state solution to your dataflow problem. +You should use the [`into_engine`] method defined on the `Analysis` trait for +this, since it will use the more efficient `Engine::new_gen_kill` constructor +when possible. + +Calling `iterate_to_fixpoint` on your `Engine` will return a `Results`, which +contains the dataflow state at fixpoint upon entry of each block. Once you have +a `Results`, you can inspect the dataflow state at fixpoint at any point in +the CFG. If you only need the state at a few locations (e.g., each `Drop` +terminator) use a [`ResultsCursor`]. If you need the state at *every* location, +a [`ResultsVisitor`] will be more efficient. + +```text + Analysis + | + | into_engine(…) + | + Engine + | + | iterate_to_fixpoint() + | + Results + / \ + into_results_cursor(…) / \ visit_with(…) + / \ + ResultsCursor ResultsVisitor +``` + +For example, the following code uses a [`ResultsVisitor`]... + + +```rust,ignore +// Assuming `MyVisitor` implements `ResultsVisitor`... +let mut my_visitor = MyVisitor::new(); + +// inspect the fixpoint state for every location within every block in RPO. +let results = MyAnalysis::new() + .into_engine(tcx, body, def_id) + .iterate_to_fixpoint() + .visit_in_rpo_with(body, &mut my_visitor); +``` + +whereas this code uses [`ResultsCursor`]: + +```rust,ignore +let mut results = MyAnalysis::new() + .into_engine(tcx, body, def_id) + .iterate_to_fixpoint() + .into_results_cursor(body); + +// Inspect the fixpoint state immediately before each `Drop` terminator. +for (bb, block) in body.basic_blocks().iter_enumerated() { + if let TerminatorKind::Drop { .. } = block.terminator().kind { + results.seek_before_primary_effect(body.terminator_loc(bb)); + let state = results.get(); + println!("state before drop: {:#?}", state); + } +} +``` + +### Graphviz Diagrams + +When the results of a dataflow analysis are not what you expect, it often helps +to visualize them. This can be done with the `-Z dump-mir` flags described in +[Debugging MIR]. Start with `-Z dump-mir=F -Z dump-mir-dataflow`, where `F` is +either "all" or the name of the MIR body you are interested in. + +These `.dot` files will be saved in your `mir_dump` directory and will have the +[`NAME`] of the analysis (e.g. `maybe_inits`) as part of their filename. Each +visualization will display the full dataflow state at entry and exit of each +block, as well as any changes that occur in each statement and terminator. See +the example below: + +![A graphviz diagram for a dataflow analysis](../img/dataflow-graphviz-example.png) + +["gen-kill" problems]: https://en.wikipedia.org/wiki/Data-flow_analysis#Bit_vector_problems +[*Static Program Analysis*]: https://cs.au.dk/~amoeller/spa/ +[Debugging MIR]: ./debugging.html +[`AnalysisDomain`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/trait.AnalysisDomain.html +[`Analysis`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/trait.Analysis.html +[`Engine`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/struct.Engine.html +[`GenKillAnalysis`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/trait.GenKillAnalysis.html +[`JoinSemiLattice`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/lattice/trait.JoinSemiLattice.html +[`NAME`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/trait.AnalysisDomain.html#associatedconstant.NAME +[`ResultsCursor`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/struct.ResultsCursor.html +[`ResultsVisitor`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/trait.ResultsVisitor.html +[`apply_call_return_effect`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/trait.Analysis.html#tymethod.apply_call_return_effect +[`into_engine`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/trait.Analysis.html#method.into_engine +[`lattice`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/dataflow/lattice/index.html +[goethe]: https://www.youtube.com/watch?v=NVBQSR_HdL0&list=PL_sGR8T76Y58l3Gck3ZwIIHLWEmXrOLV_&index=2 +[lattice]: https://en.wikipedia.org/wiki/Lattice_(order) +[wiki]: https://en.wikipedia.org/wiki/Data-flow_analysis#Basic_principles diff --git a/src/doc/rustc-dev-guide/src/mir/debugging.md b/src/doc/rustc-dev-guide/src/mir/debugging.md index 93a79076c3..c6734f8aaa 100644 --- a/src/doc/rustc-dev-guide/src/mir/debugging.md +++ b/src/doc/rustc-dev-guide/src/mir/debugging.md @@ -1,16 +1,26 @@ # MIR Debugging -The `-Zdump-mir` flag can be used to dump a text representation of the MIR. The -`-Zdump-mir-graphviz` flag can be used to dump a `.dot` file that represents -MIR as a control-flow graph. +The `-Z dump-mir` flag can be used to dump a text representation of the MIR. +The following optional flags, used in combination with `-Z dump-mir`, enable +additional output formats, including: -`-Zdump-mir=F` is a handy compiler options that will let you view the MIR for -each function at each stage of compilation. `-Zdump-mir` takes a **filter** `F` +* `-Z dump-mir-graphviz` - dumps a `.dot` file that represents MIR as a +control-flow graph +* `-Z dump-mir-dataflow` - dumps a `.dot` file showing the [dataflow state] at + each point in the control-flow graph +* `-Z dump-mir-spanview` - dumps an `.html` file that highlights the source +spans associated with MIR elements (including mouse-over actions to reveal +elements obscured by overlaps, and tooltips to view the MIR statements). +This flag takes an optional value: `statement` (the default), `terminator`, or +`block`, to generate span highlights with different levels of granulatity. + +`-Z dump-mir=F` is a handy compiler options that will let you view the MIR for +each function at each stage of compilation. `-Z dump-mir` takes a **filter** `F` which allows you to control which functions and which passes you are interesting in. For example: ```bash -> rustc -Zdump-mir=foo ... +> rustc -Z dump-mir=foo ... ``` This will dump the MIR for any function whose name contains `foo`; it @@ -24,7 +34,7 @@ fn main() { println!("Hello, world!"); } ^D -> rustc -Zdump-mir=main foo.rs +> rustc -Z dump-mir=main foo.rs > ls mir_dump/* | wc -l 161 ``` @@ -46,7 +56,7 @@ will select for things that reference *both* `main` and the pass `CleanEndRegions`: ```bash -> rustc -Zdump-mir='main & CleanEndRegions' foo.rs +> rustc -Z dump-mir='main & CleanEndRegions' foo.rs > ls mir_dump rustc.main.000-000.CleanEndRegions.after.mir rustc.main.000-000.CleanEndRegions.before.mir ``` @@ -57,7 +67,7 @@ NoLandingPads` will select *either* `main` and `CleanEndRegions` *or* `main` and `NoLandingPads`: ```bash -> rustc -Zdump-mir='main & CleanEndRegions | main & NoLandingPads' foo.rs +> rustc -Z dump-mir='main & CleanEndRegions | main & NoLandingPads' foo.rs > ls mir_dump rustc.main-promoted[0].002-000.NoLandingPads.after.mir rustc.main-promoted[0].002-000.NoLandingPads.before.mir @@ -79,3 +89,5 @@ rustc.main.002-006.NoLandingPads.before.mir that appeared within the `main` function.) TODO: anything else? + +[dataflow state]: ./dataflow.html#graphviz-diagrams diff --git a/src/doc/rustc-dev-guide/src/mir/index.md b/src/doc/rustc-dev-guide/src/mir/index.md index 85c5d755e9..306d2abfd2 100644 --- a/src/doc/rustc-dev-guide/src/mir/index.md +++ b/src/doc/rustc-dev-guide/src/mir/index.md @@ -1,5 +1,7 @@ # The MIR (Mid-level IR) + + MIR is Rust's _Mid-level Intermediate Representation_. It is constructed from [HIR](../hir.html). MIR was introduced in [RFC 1211]. It is a radically simplified form of Rust that is used for @@ -15,8 +17,8 @@ graphs and desugaring), you may enjoy the ## Introduction to MIR -MIR is defined in the [`src/librustc_middle/mir/`][mir] module, but much of the code -that manipulates it is found in [`src/librustc_mir`][mirmanip]. +MIR is defined in the [`compiler/rustc_middle/src/mir/`][mir] module, but much of the code +that manipulates it is found in [`compiler/rustc_mir`][mirmanip]. [RFC 1211]: https://rust-lang.github.io/rfcs/1211-mir.html @@ -212,35 +214,37 @@ over the overflow checks.) ## MIR data types -The MIR data types are defined in the [`src/librustc_middle/mir/`][mir] +The MIR data types are defined in the [`compiler/rustc_middle/src/mir/`][mir] module. Each of the key concepts mentioned in the previous section maps in a fairly straightforward way to a Rust type. -The main MIR data type is `Mir`. It contains the data for a single +The main MIR data type is [`Body`]. It contains the data for a single function (along with sub-instances of Mir for "promoted constants", but [you can read about those below](#promoted)). - **Basic blocks**: The basic blocks are stored in the field - `basic_blocks`; this is a vector of `BasicBlockData` - structures. Nobody ever references a basic block directly: instead, - we pass around `BasicBlock` values, which are - [newtype'd] indices into this vector. -- **Statements** are represented by the type `Statement`. -- **Terminators** are represented by the `Terminator`. -- **Locals** are represented by a [newtype'd] index type `Local`. The - data for a local variable is found in the `Mir` (the `local_decls` - vector). There is also a special constant `RETURN_PLACE` identifying - the special "local" representing the return value. -- **Places** are identified by the enum `Place`. There are a few variants: + [`Body::basic_blocks`][basicblocks]; this is a vector + of [`BasicBlockData`] structures. Nobody ever references a + basic block directly: instead, we pass around [`BasicBlock`] + values, which are [newtype'd] indices into this vector. +- **Statements** are represented by the type [`Statement`]. +- **Terminators** are represented by the [`Terminator`]. +- **Locals** are represented by a [newtype'd] index type [`Local`]. + The data for a local variable is found in the + [`Body::local_decls`][localdecls] vector). There is also a special constant + [`RETURN_PLACE`] identifying the special "local" representing the return value. +- **Places** are identified by the enum [`Place`]. There are a few + variants: - Local variables like `_1` - Static variables `FOO` - **Projections**, which are fields or other things that "project - out" from a base place. So e.g. the place `_1.f` is a projection, - with `f` being the "projection element and `_1` being the base + out" from a base place. These are represented by the type + [`ProjectionElem`]. So e.g. the place `_1.f` is a projection, + with `f` being the "projection element" and `_1` being the base path. `*_1` is also a projection, with the `*` being represented - by the `ProjectionElem::Deref` element. -- **Rvalues** are represented by the enum `Rvalue`. -- **Operands** are represented by the enum `Operand`. + by the [`ProjectionElem::Deref`] element. +- **Rvalues** are represented by the enum [`Rvalue`]. +- **Operands** are represented by the enum [`Operand`]. ## Representing constants @@ -250,10 +254,23 @@ but [you can read about those below](#promoted)). ### Promoted constants -*to be written* +See the const-eval WG's [docs on promotion](https://github.com/rust-lang/const-eval/blob/master/promotion.md). -[mir]: https://github.com/rust-lang/rust/tree/master/src/librustc_middle/mir -[mirmanip]: https://github.com/rust-lang/rust/tree/master/src/librustc_mir -[mir]: https://github.com/rust-lang/rust/tree/master/src/librustc_middle/mir +[mir]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/index.html +[mirmanip]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/index.html +[`Body`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Body.html [newtype'd]: ../appendix/glossary.html#newtype +[basicblocks]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Body.html#structfield.basic_blocks +[`BasicBlock`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.BasicBlock.html +[`BasicBlockData`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.BasicBlockData.html +[`Statement`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Statement.html +[`Terminator`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/terminator/struct.Terminator.html +[`Local`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Local.html +[localdecls]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Body.html#structfield.local_decls +[`RETURN_PLACE`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/constant.RETURN_PLACE.html +[`Place`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/struct.Place.html +[`ProjectionElem`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/enum.ProjectionElem.html +[`ProjectionElem::Deref`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/enum.ProjectionElem.html#variant.Deref +[`Rvalue`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/enum.Rvalue.html +[`Operand`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/enum.Operand.html diff --git a/src/doc/rustc-dev-guide/src/mir/optimizations.md b/src/doc/rustc-dev-guide/src/mir/optimizations.md index 3c143d5557..080c8fd3fb 100644 --- a/src/doc/rustc-dev-guide/src/mir/optimizations.md +++ b/src/doc/rustc-dev-guide/src/mir/optimizations.md @@ -36,7 +36,7 @@ implemented in its own submodule of the [`rustc_mir::transform`][trans] module. [rop]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/fn.run_optimization_passes.html [`MirPass`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/trait.MirPass.html -[trans]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/index.html +[trans]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/index.html Some examples of passes are: - `CleanupNonCodegenStatements`: remove some of the info that is only needed for @@ -47,3 +47,39 @@ You can see the ["Implementors" section of the `MirPass` rustdocs][impl] for mor [impl]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/trait.MirPass.html#implementors [constprop]: https://en.wikipedia.org/wiki/Constant_folding#Constant_propagation + +## MIR optimization levels + +MIR optimizations can come in various levels of readiness. Experimental +optimizations may cause miscompilations, or slow down compile times. +These passes are still included in nightly builds to gather feedback and make it easier to modify +the pass. To enable working with slow or otherwise experimental optimization passes, +you can specify the `-Z mir-opt-level` debug flag. You can find the +definitions of the levels in the [compiler MCP]. If you are developing a MIR pass and +want to query whether your optimization pass should run, you can check the +current level using `tcx.sess.opts.debugging_opts.mir_opt_level`. + +[compiler MCP]: https://github.com/rust-lang/compiler-team/issues/319 + +## Optimization fuel + +Optimization fuel is a compiler option (`-Z fuel==`) that allows for fine grained +control over which optimizations can be applied during compilation: each optimization reduces +fuel by 1, and when fuel reaches 0 no more optimizations are applied. The primary use of fuel +is debugging optimizations that may be incorrect or misapplied. By changing the fuel +value, you can bisect a compilation session down to the exact incorrect optimization +(this behaves like a kind of binary search through the optimizations). + +MIR optimizations respect fuel, and in general each pass should check fuel by calling +[`tcx.consider_optimizing`][consideroptimizing] and skipping the optimization if fuel +is empty. There are a few considerations: + +1. If the pass is considered "guaranteed" (for example, it should always be run because it is +needed for correctness), then fuel should not be used. An example of this is `PromoteTemps`. +2. In some cases, an initial pass is performed to gather candidates, which are then iterated to +perform optimizations. In these situations, we should allow for the initial gathering pass +and then check fuel as close to the mutation as possible. This allows for the best +debugging experience, because we can determine where in the list of candidates an optimization +may have been misapplied. Examples of this are `InstCombine` and `ConstantPropagation`. + +[consideroptimizing]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/context/struct.TyCtxt.html#method.consider_optimizing diff --git a/src/doc/rustc-dev-guide/src/mir/visitor.md b/src/doc/rustc-dev-guide/src/mir/visitor.md index a0d38ca0b6..c80462b953 100644 --- a/src/doc/rustc-dev-guide/src/mir/visitor.md +++ b/src/doc/rustc-dev-guide/src/mir/visitor.md @@ -2,7 +2,7 @@ The MIR visitor is a convenient tool for traversing the MIR and either looking for things or making changes to it. The visitor traits are -defined in [the `rustc::mir::visit` module][m-v] – there are two of +defined in [the `rustc_middle::mir::visit` module][m-v] – there are two of them, generated via a single macro: `Visitor` (which operates on a `&Mir` and gives back shared references) and `MutVisitor` (which operates on a `&mut Mir` and gives back mutable references). @@ -45,7 +45,7 @@ terminators and removes their `unwind` successors. ## Traversal -In addition the visitor, [the `rustc::mir::traversal` module][t] +In addition the visitor, [the `rustc_middle::mir::traversal` module][t] contains useful functions for walking the MIR CFG in [different standard orders][traversal] (e.g. pre-order, reverse post-order, and so forth). diff --git a/src/doc/rustc-dev-guide/src/miri.md b/src/doc/rustc-dev-guide/src/miri.md index 16f2a18f2b..fd091d565b 100644 --- a/src/doc/rustc-dev-guide/src/miri.md +++ b/src/doc/rustc-dev-guide/src/miri.md @@ -1,9 +1,11 @@ # Miri + + Miri (**MIR** **I**nterpreter) is a virtual machine for executing MIR without -compiling to machine code. It is usually invoked via `tcx.const_eval`. +compiling to machine code. It is usually invoked via `tcx.const_eval_*` functions. -If you start out with a constant +If you start out with a constant: ```rust const FOO: usize = 1 << 12; @@ -12,7 +14,7 @@ const FOO: usize = 1 << 12; rustc doesn't actually invoke anything until the constant is either used or placed into metadata. -Once you have a use-site like +Once you have a use-site like: ```rust,ignore type Foo = [u8; FOO - 42]; @@ -35,17 +37,17 @@ Invoking `tcx.const_eval(param_env.and(gid))` will now trigger the creation of the MIR of the array length expression. The MIR will look something like this: ```mir -const Foo::{{initializer}}: usize = { - let mut _0: usize; // return pointer +Foo::{{constant}}#0: usize = { + let mut _0: usize; let mut _1: (usize, bool); bb0: { - _1 = CheckedSub(const Unevaluated(FOO, Slice([])), const 42usize); - assert(!(_1.1: bool), "attempt to subtract with overflow") -> bb1; + _1 = CheckedSub(const FOO, const 42usize); + assert(!move (_1.1: bool), "attempt to subtract with overflow") -> bb1; } bb1: { - _0 = (_1.0: usize); + _0 = move (_1.0: usize); return; } } @@ -55,16 +57,16 @@ Before the evaluation, a virtual memory location (in this case essentially a `vec![u8; 4]` or `vec![u8; 8]`) is created for storing the evaluation result. At the start of the evaluation, `_0` and `_1` are -`Operand::Immediate(Immediate::Scalar(ScalarMaybeUndef::Undef))`. This is quite +`Operand::Immediate(Immediate::Scalar(ScalarMaybeUndef::Undef))`. This is quite a mouthful: [`Operand`] can represent either data stored somewhere in the [interpreter memory](#memory) (`Operand::Indirect`), or (as an optimization) immediate data stored in-line. And [`Immediate`] can either be a single (potentially uninitialized) [scalar value][`Scalar`] (integer or thin pointer), -or a pair of two of them. In our case, the single scalar value is *not* (yet) +or a pair of two of them. In our case, the single scalar value is *not* (yet) initialized. When the initialization of `_1` is invoked, the value of the `FOO` constant is -required, and triggers another call to `tcx.const_eval`, which will not be shown +required, and triggers another call to `tcx.const_eval_*`, which will not be shown here. If the evaluation of FOO is successful, `42` will be subtracted from its value `4096` and the result stored in `_1` as `Operand::Immediate(Immediate::ScalarPair(Scalar::Raw { data: 4054, .. }, @@ -102,7 +104,7 @@ Miri, but just use the cached result. ## Datastructures Miri's outside-facing datastructures can be found in -[librustc_middle/mir/interpret](https://github.com/rust-lang/rust/blob/master/src/librustc_middle/mir/interpret). +[rustc_middle/src/mir/interpret](https://github.com/rust-lang/rust/blob/master/compiler/rustc_middle/src/mir/interpret). This is mainly the error enum and the [`ConstValue`] and [`Scalar`] types. A `ConstValue` can be either `Scalar` (a single `Scalar`, i.e., integer or thin pointer), `Slice` (to represent byte slices and strings, as needed for pattern @@ -191,18 +193,19 @@ concrete integer. However, a variable of pointer or reference *type*, such as `*const T` or `&T`, does not have to have a pointer *value*: it could be obtaining by casting or -transmuting an integer to a pointer (currently that is hard to do in const eval, -but eventually `transmute` will be stable as a `const fn`). And similarly, when -casting or transmuting a reference to some actual allocation to an integer, we -end up with a pointer *value* (`Scalar::Ptr`) at integer *type* (`usize`). This -is a problem because we cannot meaningfully perform integer operations such as -division on pointer values. +transmuting an integer to a pointer (as of January 2021 +that is hard to do in const eval, but eventually `transmute` will be stable as a +`const fn`). And similarly, when casting or transmuting a reference to some +actual allocation to an integer, we end up with a pointer *value* +(`Scalar::Ptr`) at integer *type* (`usize`). This is a problem because we +cannot meaningfully perform integer operations such as division on pointer +values. ## Interpretation -Although the main entry point to constant evaluation is the `tcx.const_eval` -query, there are additional functions in -[librustc_mir/const_eval.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/const_eval/index.html) +Although the main entry point to constant evaluation is the `tcx.const_eval_*` +functions, there are additional functions in +[rustc_mir/src/const_eval.rs](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/const_eval/index.html) that allow accessing the fields of a `ConstValue` (`ByRef` or otherwise). You should never have to access an `Allocation` directly except for translating it to the compilation target (at the moment just LLVM). @@ -213,11 +216,11 @@ function with no arguments, except that constants do not allow local (named) variables at the time of writing this guide. A stack frame is defined by the `Frame` type in -[librustc_mir/interpret/eval_context.rs](https://github.com/rust-lang/rust/blob/master/src/librustc_mir/interpret/eval_context.rs) +[rustc_mir/src/interpret/eval_context.rs](https://github.com/rust-lang/rust/blob/master/compiler/rustc_mir/src/interpret/eval_context.rs) and contains all the local variables memory (`None` at the start of evaluation). Each frame refers to the evaluation of either the root constant or subsequent calls to `const fn`. The -evaluation of another constant simply calls `tcx.const_eval`, which produces an +evaluation of another constant simply calls `tcx.const_eval_*`, which produce an entirely new and independent stack frame. The frames are just a `Vec`, there's no way to actually refer to a @@ -225,8 +228,8 @@ The frames are just a `Vec`, there's no way to actually refer to a memory that can be referred to are `Allocation`s. Miri now calls the `step` method (in -[librustc_mir/interpret/step.rs](https://github.com/rust-lang/rust/blob/master/src/librustc_mir/interpret/step.rs) +[rustc_mir/src/interpret/step.rs](https://github.com/rust-lang/rust/blob/master/compiler/rustc_mir/src/interpret/step.rs) ) until it either returns an error or has no further statements to execute. Each statement will now initialize or modify the locals or the virtual memory referred to by a local. This might require evaluating other constants or -statics, which just recursively invokes `tcx.const_eval`. +statics, which just recursively invokes `tcx.const_eval_*`. diff --git a/src/doc/rustc-dev-guide/src/name-resolution.md b/src/doc/rustc-dev-guide/src/name-resolution.md index f3aacba001..2eb76384c0 100644 --- a/src/doc/rustc-dev-guide/src/name-resolution.md +++ b/src/doc/rustc-dev-guide/src/name-resolution.md @@ -1,5 +1,30 @@ # Name resolution + + +In the previous chapters, we saw how the AST is built with all macros expanded. +We saw how doing that requires doing some name resolution to resolve imports +and macro names. In this chapter, we show how this is actually done and more. + +In fact, we don't do full name resolution during macro expansion -- we only +resolve imports and macros at that time. This is required to know what to even +expand. Later, after we have the whole AST, we do full name resolution to +resolve all names in the crate. This happens in [`rustc_resolve::late`][late]. +Unlike during macro expansion, in this late expansion, we only need to try to +resolve a name once, since no new names can be added. If we fail to resolve a +name now, then it is a compiler error. + +Name resolution can be complex. There are a few different namespaces (e.g. +macros, values, types, lifetimes), and names may be valid at different (nested) +scopes. Also, different types of names can fail to be resolved differently, and +failures can happen differently at different scopes. For example, for a module +scope, failure means no unexpanded macros and no unresolved glob imports in +that module. On the other hand, in a function body, failure requires that a +name be absent from the block we are in, all outer scopes, and the global +scope. + +[late]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_resolve/late/index.html + ## Basics In our programs we can refer to variables, types, functions, etc, by giving them @@ -20,7 +45,7 @@ namespaces and therefore can co-exist. The name resolution in Rust is a two-phase process. In the first phase, which runs during macro expansion, we build a tree of modules and resolve imports. Macro expansion and name resolution communicate with each other via the -[`Resolver`] trait. +[`ResolverAstLowering`] trait. The input to the second phase is the syntax tree, produced by parsing input files and expanding macros. This phase produces links from all the names in the @@ -32,11 +57,11 @@ A successful run of the second phase ([`Resolver::resolve_crate`]) creates kind of an index the rest of the compilation may use to ask about the present names (through the `hir::lowering::Resolver` interface). -The name resolution lives in the `librustc_resolve` crate, with the meat in +The name resolution lives in the `rustc_resolve` crate, with the meat in `lib.rs` and some helpers or symbol-type specific logic in the other modules. [`Resolver::resolve_crate`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_resolve/struct.Resolver.html#method.resolve_crate -[`Resolver`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast_lowering/trait.Resolver.html +[`ResolverAstLowering`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast_lowering/trait.ResolverAstLowering.html ## Namespaces @@ -122,6 +147,23 @@ the code can be processed. Therefore, the resolution is performed in multiple stages. +## Speculative crate loading + +To give useful errors, rustc suggests importing paths into scope if they're +not found. How does it do this? It looks through every module of every crate +and looks for possible matches. This even includes crates that haven't yet +been loaded! + +Loading crates for import suggestions that haven't yet been loaded is called +_speculative crate loading_, because any errors it encounters shouldn't be +reported: resolve decided to load them, not the user. The function that does +this is `lookup_import_candidates` and lives in +`rustc_resolve/src/diagnostics.rs`. + +To tell the difference between speculative loads and loads initiated by the +user, resolve passes around a `record_used` parameter, which is `false` when +the load is speculative. + ## TODO: This is a result of the first pass of learning the code. It is definitely diff --git a/src/doc/rustc-dev-guide/src/notification-groups/about.md b/src/doc/rustc-dev-guide/src/notification-groups/about.md new file mode 100644 index 0000000000..260c59c24c --- /dev/null +++ b/src/doc/rustc-dev-guide/src/notification-groups/about.md @@ -0,0 +1,99 @@ +# Notification groups + +The **notification groups** are an easy way to help out with rustc in a +"piece-meal" fashion, without committing to a larger project. +Notification groups are **[easy to join](#join)** (just submit a PR!) +and joining does not entail any particular commitment. + +Once you [join a notification group](#join), you will be added to +a list that receives pings on github whenever a new issue is found +that fits the notification group's criteria. If you are interested, you +can then [claim the issue] and start working on it. + +Of course, you don't have to wait for new issues to be tagged! If you +prefer, you can use the Github label for a notification group to +search for existing issues that haven't been claimed yet. + +[claim the issue]: https://github.com/rust-lang/triagebot/wiki/Assignment + +## List of notification groups + +Here's the list of the notification groups: +- [ARM](./arm.md) +- [Cleanup Crew](./cleanup-crew.md) +- [LLVM](./llvm.md) +- [RISC-V](./risc-v.md) +- [Windows](./windows.md) + +## What issues are a good fit for notification groups? + +Notification groups tend to get pinged on **isolated** bugs, +particularly those of **middle priority**: + +- By **isolated**, we mean that we do not expect large-scale refactoring + to be required to fix the bug. +- By **middle priority**, we mean that we'd like to see the bug fixed, + but it's not such a burning problem that we are dropping everything + else to fix it. The danger with such bugs, of course, is that they + can accumulate over time, and the role of the notification group is + to try and stop that from happening! + +
    + +## Joining a notification group + +To join an notification group, you just have to open a PR adding your +Github username to the appropriate file in the Rust team repository. +See the "example PRs" below to get a precise idea and to identify the +file to edit. + +Also, if you are not already a member of a Rust team then -- in addition +to adding your name to the file -- you have to checkout the repository and +run the following command: + +```bash +cargo run add-person $your_user_name +``` + +Example PRs: + +* [Example of adding yourself to the ARM group.](https://github.com/rust-lang/team/pull/358) +* [Example of adding yourself to the Cleanup Crew.](https://github.com/rust-lang/team/pull/221) +* [Example of adding yourself to the LLVM group.](https://github.com/rust-lang/team/pull/140) +* [Example of adding yourself to the RISC-V group.](https://github.com/rust-lang/team/pull/394) +* [Example of adding yourself to the Windows group.](https://github.com/rust-lang/team/pull/348) + +## Tagging an issue for a notification group + +To tag an issue as appropriate for a notification group, you give +[rustbot] a [`ping`] command with the name of the notification +group. For example: + +```text +@rustbot ping llvm +@rustbot ping cleanup-crew +@rustbot ping windows +@rustbot ping arm +``` + +To make some commands shorter and easier to remember, there are aliases, +defined in the [`triagebot.toml`] file. For example, all of these commands +are equivalent and will ping the Cleanup Crew: + +```text +@rustbot ping cleanup +@rustbot ping bisect +@rustbot ping reduce +``` + +Keep in mind that these aliases are meant to make humans' life easier. +They might be subject to change. If you need to ensure that a command +will always be valid, prefer the full invocations over the aliases. + +**Note though that this should only be done by compiler team members +or contributors, and is typically done as part of compiler team +triage.** + +[rustbot]: https://github.com/rust-lang/triagebot/ +[`ping`]: https://github.com/rust-lang/triagebot/wiki/Pinging +[`triagebot.toml`]: https://github.com/rust-lang/rust/blob/master/triagebot.toml diff --git a/src/doc/rustc-dev-guide/src/notification-groups/arm.md b/src/doc/rustc-dev-guide/src/notification-groups/arm.md new file mode 100644 index 0000000000..4514f8ef39 --- /dev/null +++ b/src/doc/rustc-dev-guide/src/notification-groups/arm.md @@ -0,0 +1,22 @@ +# ARM notification group + +**Github Label:** [O-ARM] + +[O-ARM]: https://github.com/rust-lang/rust/labels/O-ARM + +This list will be used to ask for help both in diagnosing and testing +ARM-related issues as well as suggestions on how to resolve +interesting questions regarding our ARM support. + +The group also has an associated Zulip stream ([`#t-compiler/arm`]) +where people can go to pose questions and discuss ARM-specific +topics. + +So, if you are interested in participating, please sign up for the +ARM group! To do so, open a PR against the [rust-lang/team] +repository. Just [follow this example][eg], but change the username to +your own! + +[`#t-compiler/arm`]: https://rust-lang.zulipchat.com/#narrow/stream/242906-t-compiler.2Farm +[rust-lang/team]: https://github.com/rust-lang/team +[eg]: https://github.com/rust-lang/team/pull/358 diff --git a/src/doc/rustc-dev-guide/src/ice-breaker/cleanup-crew.md b/src/doc/rustc-dev-guide/src/notification-groups/cleanup-crew.md similarity index 100% rename from src/doc/rustc-dev-guide/src/ice-breaker/cleanup-crew.md rename to src/doc/rustc-dev-guide/src/notification-groups/cleanup-crew.md diff --git a/src/doc/rustc-dev-guide/src/ice-breaker/llvm.md b/src/doc/rustc-dev-guide/src/notification-groups/llvm.md similarity index 66% rename from src/doc/rustc-dev-guide/src/ice-breaker/llvm.md rename to src/doc/rustc-dev-guide/src/notification-groups/llvm.md index a6291a8c2e..69edd8b544 100644 --- a/src/doc/rustc-dev-guide/src/ice-breaker/llvm.md +++ b/src/doc/rustc-dev-guide/src/notification-groups/llvm.md @@ -1,10 +1,10 @@ -# LLVM ICE-breakers +# LLVM Notification group -**Github Label:** [ICEBreaker-LLVM] +**Github Label:** [A-LLVM] -[ICEBreaker-LLVM]: https://github.com/rust-lang/rust/labels/ICEBreaker-LLVM +[A-LLVM]: https://github.com/rust-lang/rust/labels/A-LLVM -The "LLVM ICE-breakers" are focused on bugs that center around LLVM. +The "LLVM Notification Group" are focused on bugs that center around LLVM. These bugs often arise because of LLVM optimizations gone awry, or as the result of an LLVM upgrade. The goal here is: @@ -13,14 +13,17 @@ the result of an LLVM upgrade. The goal here is: - if the former, to fix our IR; - if the latter, to try and file a bug on LLVM (or identify an existing bug). +The group may also be asked to weigh in on other sorts of LLVM-focused +questions. + ## Helpful tips and options The ["Debugging LLVM"][d] section of the rustc-dev-guide gives a step-by-step process for how to help debug bugs caused by LLVM. In particular, it discusses how to emit LLVM IR, run -the LLVM IR optimization pipeliness, and so forth. You may also find -it useful to look at the various codegen options listed under `-Chelp` -and the internal options under `-Zhelp` -- there are a number that +the LLVM IR optimization pipelines, and so forth. You may also find +it useful to look at the various codegen options listed under `-C help` +and the internal options under `-Z help` -- there are a number that pertain to LLVM (just search for LLVM). [d]: ../backend/debugging.md diff --git a/src/doc/rustc-dev-guide/src/notification-groups/risc-v.md b/src/doc/rustc-dev-guide/src/notification-groups/risc-v.md new file mode 100644 index 0000000000..15ce1cfc6e --- /dev/null +++ b/src/doc/rustc-dev-guide/src/notification-groups/risc-v.md @@ -0,0 +1,22 @@ +# RISC-V notification group + +**Github Label:** [O-riscv] + +[O-riscv]: https://github.com/rust-lang/rust/labels/O-riscv + +This list will be used to ask for help both in diagnosing and testing +RISC-V-related issues as well as suggestions on how to resolve +interesting questions regarding our RISC-V support. + +The group also has an associated Zulip stream ([`#t-compiler/risc-v`]) +where people can go to pose questions and discuss RISC-V-specific +topics. + +So, if you are interested in participating, please sign up for the +RISC-V group! To do so, open a PR against the [rust-lang/team] +repository. Just [follow this example][eg], but change the username to +your own! + +[`#t-compiler/risc-v`]: https://rust-lang.zulipchat.com/#narrow/stream/250483-t-compiler.2Frisc-v +[rust-lang/team]: https://github.com/rust-lang/team +[eg]: https://github.com/rust-lang/team/pull/394 diff --git a/src/doc/rustc-dev-guide/src/notification-groups/windows.md b/src/doc/rustc-dev-guide/src/notification-groups/windows.md new file mode 100644 index 0000000000..0483babd83 --- /dev/null +++ b/src/doc/rustc-dev-guide/src/notification-groups/windows.md @@ -0,0 +1,32 @@ +# Windows notification group + +**Github Label:** [O-Windows] + +[O-Windows]: https://github.com/rust-lang/rust/labels/O-Windows + +This list will be used to ask for help both in diagnosing and testing +Windows-related issues as well as suggestions on how to resolve +interesting questions regarding our Windows support. + +The group also has an associated Zulip stream ([`#t-compiler/windows`]) +where people can go to pose questions and discuss Windows-specific +topics. + +To get a better idea for what the group will do, here are some +examples of the kinds of questions where we would have reached out to +the group for advice in determining the best course of action: + +* Which versions of MinGW should we support? +* Should we remove the legacy InnoSetup GUI installer? [#72569] +* What names should we use for static libraries on Windows? [#29520] + +So, if you are interested in participating, please sign up for the +Windows group! To do so, open a PR against the [rust-lang/team] +repository. Just [follow this example][eg], but change the username to +your own! + +[`#t-compiler/windows`]: https://rust-lang.zulipchat.com/#streams/242869/t-compiler.2Fwindows +[rust-lang/team]: https://github.com/rust-lang/team +[eg]: https://github.com/rust-lang/team/pull/348/ +[#72569]: https://github.com/rust-lang/rust/pull/72569 +[#29520]: https://github.com/rust-lang/rust/pull/29520 diff --git a/src/doc/rustc-dev-guide/src/opaque-types-type-alias-impl-trait.md b/src/doc/rustc-dev-guide/src/opaque-types-type-alias-impl-trait.md index e78d3c75de..2be072dd2c 100644 --- a/src/doc/rustc-dev-guide/src/opaque-types-type-alias-impl-trait.md +++ b/src/doc/rustc-dev-guide/src/opaque-types-type-alias-impl-trait.md @@ -14,8 +14,9 @@ This declares an opaque type named `Foo`, of which the only information is that it implements `Bar`. Therefore, any of `Bar`'s interface can be used on a `Foo`, but nothing else (regardless of whether it implements any other traits). -Since there needs to be a concrete background type, you can currently -express that type by using the opaque type in a "defining use site". +Since there needs to be a concrete background type, you can (as of January 2021) express that type by using the opaque type in a +"defining use site". ```rust,ignore struct Struct; diff --git a/src/doc/rustc-dev-guide/src/overview.md b/src/doc/rustc-dev-guide/src/overview.md index 140d2f352d..1aa79e7914 100644 --- a/src/doc/rustc-dev-guide/src/overview.md +++ b/src/doc/rustc-dev-guide/src/overview.md @@ -1,3 +1,384 @@ # Overview of the Compiler -Coming soon! Work is in progress on this chapter. See https://github.com/rust-lang/rustc-dev-guide/pull/633 for the source and the [project README](https://github.com/rust-lang/rustc-dev-guide) for local build instructions. + + +This chapter is about the overall process of compiling a program -- how +everything fits together. + +The rust compiler is special in two ways: it does things to your code that +other compilers don't do (e.g. borrow checking) and it has a lot of +unconventional implementation choices (e.g. queries). We will talk about these +in turn in this chapter, and in the rest of the guide, we will look at all the +individual pieces in more detail. + +## What the compiler does to your code + +So first, let's look at what the compiler does to your code. For now, we will +avoid mentioning how the compiler implements these steps except as needed; +we'll talk about that later. + +- The compile process begins when a user writes a Rust source program in text + and invokes the `rustc` compiler on it. The work that the compiler needs to + perform is defined by command-line options. For example, it is possible to + enable nightly features (`-Z` flags), perform `check`-only builds, or emit + LLVM-IR rather than executable machine code. The `rustc` executable call may + be indirect through the use of `cargo`. +- Command line argument parsing occurs in the [`rustc_driver`]. This crate + defines the compile configuration that is requested by the user and passes it + to the rest of the compilation process as a [`rustc_interface::Config`]. +- The raw Rust source text is analyzed by a low-level lexer located in + [`rustc_lexer`]. At this stage, the source text is turned into a stream of + atomic source code units known as _tokens_. The lexer supports the + Unicode character encoding. +- The token stream passes through a higher-level lexer located in + [`rustc_parse`] to prepare for the next stage of the compile process. The + [`StringReader`] struct is used at this stage to perform a set of validations + and turn strings into interned symbols (_interning_ is discussed later). + [String interning] is a way of storing only one immutable + copy of each distinct string value. + +- The lexer has a small interface and doesn't depend directly on the + diagnostic infrastructure in `rustc`. Instead it provides diagnostics as plain + data which are emitted in `rustc_parse::lexer::mod` as real diagnostics. +- The lexer preserves full fidelity information for both IDEs and proc macros. +- The parser [translates the token stream from the lexer into an Abstract Syntax + Tree (AST)][parser]. It uses a recursive descent (top-down) approach to syntax + analysis. The crate entry points for the parser are the `Parser::parse_crate_mod()` and + `Parser::parse_mod()` methods found in `rustc_parse::parser::item`. The external + module parsing entry point is `rustc_expand::module::parse_external_mod`. And + the macro parser entry point is [`Parser::parse_nonterminal()`][parse_nonterminal]. +- Parsing is performed with a set of `Parser` utility methods including `fn bump`, + `fn check`, `fn eat`, `fn expect`, `fn look_ahead`. +- Parsing is organized by the semantic construct that is being parsed. Separate + `parse_*` methods can be found in `rustc_parse` `parser` directory. The source + file name follows the construct name. For example, the following files are found + in the parser: + - `expr.rs` + - `pat.rs` + - `ty.rs` + - `stmt.rs` +- This naming scheme is used across many compiler stages. You will find + either a file or directory with the same name across the parsing, lowering, + type checking, THIR lowering, and MIR building sources. +- Macro expansion, AST validation, name resolution, and early linting takes place + during this stage of the compile process. +- The parser uses the standard `DiagnosticBuilder` API for error handling, but we + try to recover, parsing a superset of Rust's grammar, while also emitting an error. +- `rustc_ast::ast::{Crate, Mod, Expr, Pat, ...}` AST nodes are returned from the parser. +- We then take the AST and [convert it to High-Level Intermediate + Representation (HIR)][hir]. This is a compiler-friendly representation of the + AST. This involves a lot of desugaring of things like loops and `async fn`. +- We use the HIR to do [type inference]. This is the process of automatic + detection of the type of an expression. +- **TODO: Maybe some other things are done here? I think initial type checking + happens here? And trait solving?** +- The HIR is then [lowered to Mid-Level Intermediate Representation (MIR)][mir]. + - Along the way, we construct the THIR, which is an even more desugared HIR. + THIR is used for pattern and exhaustiveness checking. It is also more + convenient to convert into MIR than HIR is. +- The MIR is used for [borrow checking]. +- We (want to) do [many optimizations on the MIR][mir-opt] because it is still + generic and that improves the code we generate later, improving compilation + speed too. + - MIR is a higher level (and generic) representation, so it is easier to do + some optimizations at MIR level than at LLVM-IR level. For example LLVM + doesn't seem to be able to optimize the pattern the [`simplify_try`] mir + opt looks for. +- Rust code is _monomorphized_, which means making copies of all the generic + code with the type parameters replaced by concrete types. To do + this, we need to collect a list of what concrete types to generate code for. + This is called _monomorphization collection_. +- We then begin what is vaguely called _code generation_ or _codegen_. + - The [code generation stage (codegen)][codegen] is when higher level + representations of source are turned into an executable binary. `rustc` + uses LLVM for code generation. The first step is to convert the MIR + to LLVM Intermediate Representation (LLVM IR). This is where the MIR + is actually monomorphized, according to the list we created in the + previous step. + - The LLVM IR is passed to LLVM, which does a lot more optimizations on it. + It then emits machine code. It is basically assembly code with additional + low-level types and annotations added. (e.g. an ELF object or wasm). + - The different libraries/binaries are linked together to produce the final + binary. + +[String interning]: https://en.wikipedia.org/wiki/String_interning +[`rustc_lexer`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lexer/index.html +[`rustc_driver`]: https://rustc-dev-guide.rust-lang.org/rustc-driver.html +[`rustc_interface::Config`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_interface/interface/struct.Config.html +[lex]: https://rustc-dev-guide.rust-lang.org/the-parser.html +[`StringReader`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/lexer/struct.StringReader.html +[`rustc_parse`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/index.html +[parser]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/index.html +[hir]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/index.html +[type inference]: https://rustc-dev-guide.rust-lang.org/type-inference.html +[mir]: https://rustc-dev-guide.rust-lang.org/mir/index.html +[borrow checking]: https://rustc-dev-guide.rust-lang.org/borrow_check.html +[mir-opt]: https://rustc-dev-guide.rust-lang.org/mir/optimizations.html +[`simplify_try`]: https://github.com/rust-lang/rust/pull/66282 +[codegen]: https://rustc-dev-guide.rust-lang.org/backend/codegen.html +[parse_nonterminal]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/parser/struct.Parser.html#method.parse_nonterminal + +## How it does it + +Ok, so now that we have a high-level view of what the compiler does to your +code, let's take a high-level view of _how_ it does all that stuff. There are a +lot of constraints and conflicting goals that the compiler needs to +satisfy/optimize for. For example, + +- Compilation speed: how fast is it to compile a program. More/better + compile-time analyses often means compilation is slower. + - Also, we want to support incremental compilation, so we need to take that + into account. How can we keep track of what work needs to be redone and + what can be reused if the user modifies their program? + - Also we can't store too much stuff in the incremental cache because + it would take a long time to load from disk and it could take a lot + of space on the user's system... +- Compiler memory usage: while compiling a program, we don't want to use more + memory than we need. +- Program speed: how fast is your compiled program. More/better compile-time + analyses often means the compiler can do better optimizations. +- Program size: how large is the compiled binary? Similar to the previous + point. +- Compiler compilation speed: how long does it take to compile the compiler? + This impacts contributors and compiler maintenance. +- Implementation complexity: building a compiler is one of the hardest + things a person/group can do, and Rust is not a very simple language, so how + do we make the compiler's code base manageable? +- Compiler correctness: the binaries produced by the compiler should do what + the input programs says they do, and should continue to do so despite the + tremendous amount of change constantly going on. +- Integration: a number of other tools need to use the compiler in + various ways (e.g. cargo, clippy, miri, RLS) that must be supported. +- Compiler stability: the compiler should not crash or fail ungracefully on the + stable channel. +- Rust stability: the compiler must respect Rust's stability guarantees by not + breaking programs that previously compiled despite the many changes that are + always going on to its implementation. +- Limitations of other tools: rustc uses LLVM in its backend, and LLVM has some + strengths we leverage and some limitations/weaknesses we need to work around. + +So, as you read through the rest of the guide, keep these things in mind. They +will often inform decisions that we make. + +### Intermediate representations + +As with most compilers, `rustc` uses some intermediate representations (IRs) to +facilitate computations. In general, working directly with the source code is +extremely inconvenient and error-prone. Source code is designed to be human-friendly while at +the same time being unambiguous, but it's less convenient for doing something +like, say, type checking. + +Instead most compilers, including `rustc`, build some sort of IR out of the +source code which is easier to analyze. `rustc` has a few IRs, each optimized +for different purposes: + +- Token stream: the lexer produces a stream of tokens directly from the source + code. This stream of tokens is easier for the parser to deal with than raw + text. +- Abstract Syntax Tree (AST): the abstract syntax tree is built from the stream + of tokens produced by the lexer. It represents + pretty much exactly what the user wrote. It helps to do some syntactic sanity + checking (e.g. checking that a type is expected where the user wrote one). +- High-level IR (HIR): This is a sort of desugared AST. It's still close + to what the user wrote syntactically, but it includes some implicit things + such as some elided lifetimes, etc. This IR is amenable to type checking. +- Typed HIR (THIR): This is an intermediate between HIR and MIR, and used to be called + High-level Abstract IR (HAIR). It is like the HIR but it is fully typed and a bit + more desugared (e.g. method calls and implicit dereferences are made fully explicit). + Moreover, it is easier to lower to MIR from THIR than from HIR. +- Middle-level IR (MIR): This IR is basically a Control-Flow Graph (CFG). A CFG + is a type of diagram that shows the basic blocks of a program and how control + flow can go between them. Likewise, MIR also has a bunch of basic blocks with + simple typed statements inside them (e.g. assignment, simple computations, + etc) and control flow edges to other basic blocks (e.g., calls, dropping + values). MIR is used for borrow checking and other + important dataflow-based checks, such as checking for uninitialized values. + It is also used for a series of optimizations and for constant evaluation (via + MIRI). Because MIR is still generic, we can do a lot of analyses here more + efficiently than after monomorphization. +- LLVM IR: This is the standard form of all input to the LLVM compiler. LLVM IR + is a sort of typed assembly language with lots of annotations. It's + a standard format that is used by all compilers that use LLVM (e.g. the clang + C compiler also outputs LLVM IR). LLVM IR is designed to be easy for other + compilers to emit and also rich enough for LLVM to run a bunch of + optimizations on it. + +One other thing to note is that many values in the compiler are _interned_. +This is a performance and memory optimization in which we allocate the values +in a special allocator called an _arena_. Then, we pass around references to +the values allocated in the arena. This allows us to make sure that identical +values (e.g. types in your program) are only allocated once and can be compared +cheaply by comparing pointers. Many of the intermediate representations are +interned. + +### Queries + +The first big implementation choice is the _query_ system. The rust compiler +uses a query system which is unlike most textbook compilers, which are +organized as a series of passes over the code that execute sequentially. The +compiler does this to make incremental compilation possible -- that is, if the +user makes a change to their program and recompiles, we want to do as little +redundant work as possible to produce the new binary. + +In `rustc`, all the major steps above are organized as a bunch of queries that +call each other. For example, there is a query to ask for the type of something +and another to ask for the optimized MIR of a function. These +queries can call each other and are all tracked through the query system. +The results of the queries are cached on disk so that we can tell which +queries' results changed from the last compilation and only redo those. This is +how incremental compilation works. + +In principle, for the query-fied steps, we do each of the above for each item +individually. For example, we will take the HIR for a function and use queries +to ask for the LLVM IR for that HIR. This drives the generation of optimized +MIR, which drives the borrow checker, which drives the generation of MIR, and +so on. + +... except that this is very over-simplified. In fact, some queries are not +cached on disk, and some parts of the compiler have to run for all code anyway +for correctness even if the code is dead code (e.g. the borrow checker). For +example, [currently the `mir_borrowck` query is first executed on all functions +of a crate.][passes] Then the codegen backend invokes the +`collect_and_partition_mono_items` query, which first recursively requests the +`optimized_mir` for all reachable functions, which in turn runs `mir_borrowck` +for that function and then creates codegen units. This kind of split will need +to remain to ensure that unreachable functions still have their errors emitted. + +[passes]: https://github.com/rust-lang/rust/blob/45ebd5808afd3df7ba842797c0fcd4447ddf30fb/src/librustc_interface/passes.rs#L824 + +Moreover, the compiler wasn't originally built to use a query system; the query +system has been retrofitted into the compiler, so parts of it are not query-fied +yet. Also, LLVM isn't our code, so that isn't querified either. The plan is to +eventually query-fy all of the steps listed in the previous section, +but as of February 2021, only the steps between HIR and +LLVM IR are query-fied. That is, lexing, parsing, name resolution, and macro +expansion are done all at once for the whole program. + +One other thing to mention here is the all-important "typing context", +[`TyCtxt`], which is a giant struct that is at the center of all things. +(Note that the name is mostly historic. This is _not_ a "typing context" in the +sense of `Γ` or `Δ` from type theory. The name is retained because that's what +the name of the struct is in the source code.) All +queries are defined as methods on the [`TyCtxt`] type, and the in-memory query +cache is stored there too. In the code, there is usually a variable called +`tcx` which is a handle on the typing context. You will also see lifetimes with +the name `'tcx`, which means that something is tied to the lifetime of the +`TyCtxt` (usually it is stored or interned there). + +[`TyCtxt`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.TyCtxt.html + +### `ty::Ty` + +Types are really important in Rust, and they form the core of a lot of compiler +analyses. The main type (in the compiler) that represents types (in the user's +program) is [`rustc_middle::ty::Ty`][ty]. This is so important that we have a whole chapter +on [`ty::Ty`][ty], but for now, we just want to mention that it exists and is the way +`rustc` represents types! + +Also note that the `rustc_middle::ty` module defines the `TyCtxt` struct we mentioned before. + +[ty]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/type.Ty.html + +### Parallelism + +Compiler performance is a problem that we would like to improve on +(and are always working on). One aspect of that is parallelizing +`rustc` itself. + +Currently, there is only one part of rustc that is already parallel: codegen. +During monomorphization, the compiler will split up all the code to be +generated into smaller chunks called _codegen units_. These are then generated +by independent instances of LLVM. Since they are independent, we can run them +in parallel. At the end, the linker is run to combine all the codegen units +together into one binary. + +However, the rest of the compiler is still not yet parallel. There have been +lots of efforts spent on this, but it is generally a hard problem. The current +approach is to turn `RefCell`s into `Mutex`s -- that is, we +switch to thread-safe internal mutability. However, there are ongoing +challenges with lock contention, maintaining query-system invariants under +concurrency, and the complexity of the code base. One can try out the current +work by enabling parallel compilation in `config.toml`. It's still early days, +but there are already some promising performance improvements. + +### Bootstrapping + +`rustc` itself is written in Rust. So how do we compile the compiler? We use an +older compiler to compile the newer compiler. This is called [_bootstrapping_]. + +Bootstrapping has a lot of interesting implications. For example, it means +that one of the major users of Rust is the Rust compiler, so we are +constantly testing our own software ("eating our own dogfood"). + +For more details on bootstrapping, see +[the bootstrapping section of the guide][rustc-bootstrap]. + +[_bootstrapping_]: https://en.wikipedia.org/wiki/Bootstrapping_(compilers) +[rustc-bootstrap]: building/bootstrapping.md + +# Unresolved Questions + +- Does LLVM ever do optimizations in debug builds? +- How do I explore phases of the compile process in my own sources (lexer, + parser, HIR, etc)? - e.g., `cargo rustc -- -Z unpretty=hir-tree` allows you to + view HIR representation +- What is the main source entry point for `X`? +- Where do phases diverge for cross-compilation to machine code across + different platforms? + +# References + +- Command line parsing + - Guide: [The Rustc Driver and Interface](https://rustc-dev-guide.rust-lang.org/rustc-driver.html) + - Driver definition: [`rustc_driver`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_driver/) + - Main entry point: [`rustc_session::config::build_session_options`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_session/config/fn.build_session_options.html) +- Lexical Analysis: Lex the user program to a stream of tokens + - Guide: [Lexing and Parsing](https://rustc-dev-guide.rust-lang.org/the-parser.html) + - Lexer definition: [`rustc_lexer`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lexer/index.html) + - Main entry point: [`rustc_lexer::first_token`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lexer/fn.first_token.html) +- Parsing: Parse the stream of tokens to an Abstract Syntax Tree (AST) + - Guide: [Lexing and Parsing](https://rustc-dev-guide.rust-lang.org/the-parser.html) + - Parser definition: [`rustc_parse`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/index.html) + - Main entry points: + - [Entry point for first file in crate](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_interface/passes/fn.parse.html) + - [Entry point for outline module parsing](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_expand/module/fn.parse_external_mod.html) + - [Entry point for macro fragments][parse_nonterminal] + - AST definition: [`rustc_ast`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/ast/index.html) + - Expansion: **TODO** + - Name Resolution: **TODO** + - Feature gating: **TODO** + - Early linting: **TODO** +- The High Level Intermediate Representation (HIR) + - Guide: [The HIR](https://rustc-dev-guide.rust-lang.org/hir.html) + - Guide: [Identifiers in the HIR](https://rustc-dev-guide.rust-lang.org/hir.html#identifiers-in-the-hir) + - Guide: [The HIR Map](https://rustc-dev-guide.rust-lang.org/hir.html#the-hir-map) + - Guide: [Lowering AST to HIR](https://rustc-dev-guide.rust-lang.org/lowering.html) + - How to view HIR representation for your code `cargo rustc -- -Z unpretty=hir-tree` + - Rustc HIR definition: [`rustc_hir`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_hir/index.html) + - Main entry point: **TODO** + - Late linting: **TODO** +- Type Inference + - Guide: [Type Inference](https://rustc-dev-guide.rust-lang.org/type-inference.html) + - Guide: [The ty Module: Representing Types](https://rustc-dev-guide.rust-lang.org/ty.html) (semantics) + - Main entry point (type inference): [`InferCtxtBuilder::enter`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_infer/infer/struct.InferCtxtBuilder.html#method.enter) + - Main entry point (type checking bodies): [the `typeck` query](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.TyCtxt.html#method.typeck) + - These two functions can't be decoupled. +- The Mid Level Intermediate Representation (MIR) + - Guide: [The MIR (Mid level IR)](https://rustc-dev-guide.rust-lang.org/mir/index.html) + - Definition: [`rustc_middle/src/mir`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/mir/index.html) + - Definition of source that manipulates the MIR: [`rustc_mir`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/index.html) +- The Borrow Checker + - Guide: [MIR Borrow Check](https://rustc-dev-guide.rust-lang.org/borrow_check.html) + - Definition: [`rustc_mir/borrow_check`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/index.html) + - Main entry point: [`mir_borrowck` query](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/borrow_check/fn.mir_borrowck.html) +- MIR Optimizations + - Guide: [MIR Optimizations](https://rustc-dev-guide.rust-lang.org/mir/optimizations.html) + - Definition: [`rustc_mir/transform`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/index.html) + - Main entry point: [`optimized_mir` query](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir/transform/fn.optimized_mir.html) +- Code Generation + - Guide: [Code Generation](https://rustc-dev-guide.rust-lang.org/backend/codegen.html) + - Generating Machine Code from LLVM IR with LLVM - **TODO: reference?** + - Main entry point: [`rustc_codegen_ssa::base::codegen_crate`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/base/fn.codegen_crate.html) + - This monomorphizes and produces LLVM IR for one codegen unit. It then + starts a background thread to run LLVM, which must be joined later. + - Monomorphization happens lazily via [`FunctionCx::monomorphize`](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/mir/struct.FunctionCx.html#method.monomorphize) and [`rustc_codegen_ssa::base::codegen_instance `](https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/base/fn.codegen_instance.html) diff --git a/src/doc/rustc-dev-guide/src/panic-implementation.md b/src/doc/rustc-dev-guide/src/panic-implementation.md index 549a9cd05f..66e61548ef 100644 --- a/src/doc/rustc-dev-guide/src/panic-implementation.md +++ b/src/doc/rustc-dev-guide/src/panic-implementation.md @@ -1,15 +1,17 @@ -### Panicking in rust ### +# 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`. +## Step 1: Invocation of the `panic!` macro. -##### libcore definition of panic! +There are actually two panic macros - one defined in `core`, and one defined in `std`. +This is due to the fact that code in `core` can panic. `core` is built before `std`, +but we want panics to use the same machinery at runtime, whether they originate in `core` +or `std`. -The `libcore` `panic!` macro eventually makes the following call (in `src/libcore/panicking.rs`): +### core definition of panic! + +The `core` `panic!` macro eventually makes the following call (in `library/core/src/panicking.rs`): ```rust // NOTE This function never crosses the FFI boundary; it's a Rust-to-Rust call @@ -24,18 +26,19 @@ unsafe { panic_impl(&pi) } Actually resolving this goes through several layers of indirection: -1. In `src/librustc_middle/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`. +1. In `compiler/rustc_middle/src/middle/weak_lang_items.rs`, `panic_impl` is + declared as 'weak lang item', with the symbol `rust_begin_unwind`. This is + used in `rustc_typeck/src/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` + which means that core 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: +2. In `library/std/src/panicking.rs`, we have this definition: ```rust -/// Entry point of panic from the libcore crate. +/// Entry point of panic from the core crate. #[cfg(not(test))] #[panic_handler] #[unwind(allowed)] @@ -44,21 +47,21 @@ pub fn begin_panic_handler(info: &PanicInfo<'_>) -> ! { } ``` -The special `panic_handler` attribute is resolved via `src/librustc_middle/middle/lang_items`. +The special `panic_handler` attribute is resolved via `compiler/rustc_middle/src/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 +Now, we have a matching `panic_handler` lang item in the `std`. This function goes +through the same process as the `extern { fn panic_impl }` definition in `core`, ending +up with a symbol name of `rust_begin_unwind`. At link time, the symbol reference in `core` +will be resolved to the definition of `std` (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` +Thus, control flow will pass from core to std at runtime. This allows panics from `core` to go through the same infrastructure that other panics use (panic hooks, unwinding, etc) -##### libstd implementation of panic! +### std implementation of panic! -This is where the actual panic-related logic begins. In `src/libstd/panicking.rs`, +This is where the actual panic-related logic begins. In `library/std/src/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. @@ -82,15 +85,15 @@ 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 +## Step 2: The panic runtime -Rust provides two panic runtimes: `libpanic_abort` and `libpanic_unwind`. The user chooses +Rust provides two panic runtimes: `panic_abort` and `panic_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, +`panic_abort` is extremely simple: its implementation of `__rust_start_panic` just aborts, as you would expect. -`libpanic_unwind` is the more interesting case. +`panic_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` @@ -99,10 +102,11 @@ 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 +platform-specific unwinding logic (e.g `unwind`). 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`. +in `library/std/src/rt.rs`, the call to the user-provided +`main` function is wrapped in `catch_unwind`. diff --git a/src/doc/rustc-dev-guide/src/parallel-rustc.md b/src/doc/rustc-dev-guide/src/parallel-rustc.md new file mode 100644 index 0000000000..8be19e8dcf --- /dev/null +++ b/src/doc/rustc-dev-guide/src/parallel-rustc.md @@ -0,0 +1,47 @@ +# Parallel Compilation + +Most of the compiler is not parallel. This represents an opportunity for +improving compiler performance. + +As of January 2021, work on explicitly parallelizing the +compiler has stalled. There is a lot of design and correctness work that needs +to be done. + +One can try out the current parallel compiler work by enabling it in the +`config.toml`. + +There are a few basic ideas in this effort: + +- There are a lot of loops in the compiler that just iterate over all items in + a crate. These can possibly be parallelized. +- We can use (a custom fork of) [`rayon`] to run tasks in parallel. The custom + fork allows the execution of DAGs of tasks, not just trees. +- There are currently a lot of global data structures that need to be made + thread-safe. A key strategy here has been converting interior-mutable + data-structures (e.g. `Cell`) into their thread-safe siblings (e.g. `Mutex`). + +[`rayon`]: https://crates.io/crates/rayon + +As of February 2021, much of this effort is on hold due +to lack of manpower. We have a working prototype with promising performance +gains in many cases. However, there are two blockers: + +- It's not clear what invariants need to be upheld that might not hold in the + face of concurrency. An auditing effort was underway, but seems to have + stalled at some point. + +- There is a lot of lock contention, which actually degrades performance as the + number of threads increases beyond 4. + +Here are some resources that can be used to learn more (note that some of them +are a bit out of date): + +- [This IRLO thread by Zoxc, one of the pioneers of the effort][irlo0] +- [This list of interior mutability in the compiler by nikomatsakis][imlist] +- [This IRLO thread by alexchricton about performance][irlo1] +- [This tracking issue][tracking] + +[irlo0]: https://internals.rust-lang.org/t/parallelizing-rustc-using-rayon/6606 +[imlist]: https://github.com/nikomatsakis/rustc-parallelization/blob/master/interior-mutability-list.md +[irlo1]: https://internals.rust-lang.org/t/help-test-parallel-rustc/11503 +[tracking]: https://github.com/rust-lang/rust/issues/48685 diff --git a/src/doc/rustc-dev-guide/src/param_env.md b/src/doc/rustc-dev-guide/src/param_env.md index aa6d6e2155..08e19c339b 100644 --- a/src/doc/rustc-dev-guide/src/param_env.md +++ b/src/doc/rustc-dev-guide/src/param_env.md @@ -1,6 +1,6 @@ # Parameter Environment -When working with associated and/or or generic items (types, constants, +When working with associated and/or generic items (types, constants, functions/methods) it is often relevant to have more information about the `Self` or generic parameters. Trait bounds and similar information is encoded in the [`ParamEnv`][pe]. Often this is not enough information to obtain things like the @@ -25,7 +25,7 @@ You can get the parameter environment for a `def_id` using the your use case. Using the `ParamEnv` from the surrounding context can allow you to evaluate more things. For example, suppose we had something the following: -[query]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ty/ty/fn.param_env.html +[query]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ty_utils/ty/fn.param_env.html ```rust trait Foo { diff --git a/src/doc/rustc-dev-guide/src/part-1-intro.md b/src/doc/rustc-dev-guide/src/part-1-intro.md deleted file mode 100644 index 95d2f8fccf..0000000000 --- a/src/doc/rustc-dev-guide/src/part-1-intro.md +++ /dev/null @@ -1,7 +0,0 @@ -# Part 1: Building, Debugging, and Contributing to `rustc` - -This section of the rustc-dev-guide contains knowledge that should be useful to you -regardless of what part of the compiler you are working on. This includes both -technical info and tips (e.g. how to compile and debug the compiler) and info -about processes in the Rust project (e.g. stabilization and info about the -compiler team). diff --git a/src/doc/rustc-dev-guide/src/part-2-intro.md b/src/doc/rustc-dev-guide/src/part-2-intro.md index 04ae3f955b..5ea4d7b6b6 100644 --- a/src/doc/rustc-dev-guide/src/part-2-intro.md +++ b/src/doc/rustc-dev-guide/src/part-2-intro.md @@ -9,7 +9,6 @@ to file an issue on the [rustc-dev-guide repo](https://github.com/rust-lang/rustc-dev-guide/issues) or contact the compiler team, as detailed in [this chapter from Part 1](./compiler-team.md). -In this part, we will specifically look at the high-level architecture of the -compiler. Specifically, will look at the query system, incremental compilation, -and interning. These are three overarching design choices that impact the whole -compiler. +In this part, we will look at the high-level architecture of the compiler. In +particular, we will look at three overarching design choices that impact the +whole compiler: the query system, incremental compilation, and interning. diff --git a/src/doc/rustc-dev-guide/src/part-3-intro.md b/src/doc/rustc-dev-guide/src/part-3-intro.md index a1ec3ca90a..c100806328 100644 --- a/src/doc/rustc-dev-guide/src/part-3-intro.md +++ b/src/doc/rustc-dev-guide/src/part-3-intro.md @@ -1,8 +1,10 @@ -# Part 3: Source Code Representations +# Part 3: Source Code Representation This part describes the process of taking raw source code from the user and transforming it into various forms that the compiler can work with easily. -These are called intermediate representations. +These are called _intermediate representations (IRs)_. This process starts with compiler understanding what the user has asked for: parsing the command line arguments given and determining what it is to compile. +After that, the compiler transforms the user input into a series of IRs that +look progressively less like what the user wrote. diff --git a/src/doc/rustc-dev-guide/src/part-5-intro.md b/src/doc/rustc-dev-guide/src/part-5-intro.md index 184d0ee3ae..78e6fa2e9b 100644 --- a/src/doc/rustc-dev-guide/src/part-5-intro.md +++ b/src/doc/rustc-dev-guide/src/part-5-intro.md @@ -5,14 +5,16 @@ generated any executable machine code at all! With this chapter, all of that changes. So far, we've shown how the compiler can take raw source code in text format -and transform it into MIR. We have also shown how the compiler does various +and transform it into [MIR]. We have also shown how the compiler does various analyses on the code to detect things like type or lifetime errors. Now, we will finally take the MIR and produce some executable machine code. +[MIR]: ./mir/index.md + > NOTE: This part of a compiler is often called the _backend_ the term is a bit > overloaded because in the compiler source, it usually refers to the "codegen > backend" (i.e. LLVM or Cranelift). Usually, when you see the word "backend" -> in this part, we are refering to the "codegen backend". +> in this part, we are referring to the "codegen backend". So what do we need to do? diff --git a/src/doc/rustc-dev-guide/src/pat-exhaustive-checking.md b/src/doc/rustc-dev-guide/src/pat-exhaustive-checking.md index b29bb1351e..a3103de8fd 100644 --- a/src/doc/rustc-dev-guide/src/pat-exhaustive-checking.md +++ b/src/doc/rustc-dev-guide/src/pat-exhaustive-checking.md @@ -4,4 +4,85 @@ In Rust, pattern matching and bindings have a few very helpful properties. The compiler will check that bindings are irrefutable when made and that match arms are exhaustive. -**TODO**: write this chapter. +## Pattern usefulness + +The central question that usefulness checking answers is: +"in this match expression, is that branch reachable?". +More precisely, it boils down to computing whether, +given a list of patterns we have already seen, +a given new pattern might match any new value. + +For example, in the following match expression, +we ask in turn whether each pattern might match something +that wasn't matched by the patterns above it. +Here we see the 4th pattern is redundant with the 1st; +that branch will get an "unreachable" warning. +The 3rd pattern may or may not be useful, +depending on whether `Foo` has other variants than `Bar`. +Finally, we can ask whether the whole match is exhaustive +by asking whether the wildcard pattern (`_`) +is useful relative to the list of all the patterns in that match. +Here we can see that `_` is useful (it would catch `(false, None)`); +this expression would therefore get a "non-exhaustive match" error. + +```rust +// x: (bool, Option) +match x { + (true, _) => {} // 1 + (false, Some(Foo::Bar)) => {} // 2 + (false, Some(_)) => {} // 3 + (true, None) => {} // 4 +} +``` + +Thus usefulness is used for two purposes: +detecting unreachable code (which is useful to the user), +and ensuring that matches are exhaustive (which is important for soundness, +because a match expression can return a value). + +## Where it happens + +This check is done to any expression that desugars to a match expression in MIR. +That includes actual `match` expressions, +but also anything that looks like pattern matching, +including `if let`, destructuring `let`, and similar expressions. + +```rust +// `match` +// Usefulness can detect unreachable branches and forbid non-exhaustive matches. +match foo() { + Ok(x) => x, + Err(_) => panic!(), +} + +// `if let` +// Usefulness can detect unreachable branches. +if let Some(x) = foo() { + // ... +} + +// `while let` +// Usefulness can detect infinite loops and dead loops. +while let Some(x) = it.next() { + // ... +} + +// Destructuring `let` +// Usefulness can forbid non-exhaustive patterns. +let Foo::Bar(x, y) = foo(); + +// Destructuring function arguments +// Usefulness can forbid non-exhaustive patterns. +fn foo(Foo { x, y }: Foo) { + // ... +} +``` + +## The algorithm + +Exhaustiveness checking is implemented in [`check_match`]. +The core of the algorithm is in [`usefulness`]. +That file contains a detailed description of the algorithm. + +[`check_match`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/thir/pattern/check_match/index.html +[`usefulness`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/thir/pattern/usefulness/index.html diff --git a/src/doc/rustc-dev-guide/src/profile-guided-optimization.md b/src/doc/rustc-dev-guide/src/profile-guided-optimization.md index fb897e901e..bf7615878c 100644 --- a/src/doc/rustc-dev-guide/src/profile-guided-optimization.md +++ b/src/doc/rustc-dev-guide/src/profile-guided-optimization.md @@ -1,5 +1,7 @@ # Profile Guided Optimization + + `rustc` supports doing profile-guided optimization (PGO). This chapter describes what PGO is and how the support for it is implemented in `rustc`. @@ -29,7 +31,8 @@ LLVM actually [supports multiple forms][clang-pgo] of PGO: - GCOV-based profiling, where code coverage infrastructure is used to collect profiling information. - Front-end based instrumentation, where the compiler front-end (e.g. Clang) - inserts instrumentation intrinsics into the LLVM IR it generates. + inserts instrumentation intrinsics into the LLVM IR it generates (but see the + [^note-instrument-coverage]"Note"). - IR-level instrumentation, where LLVM inserts the instrumentation intrinsics itself during optimization passes. @@ -44,15 +47,20 @@ optimized. Instrumentation-based PGO has two components: a compile-time component and run-time component, and one needs to understand the overall workflow to see how they interact. +[^note-instrument-coverage]: Note: `rustc` now supports front-end-based coverage +instrumentation, via the experimental option +[`-Z instrument-coverage`](./llvm-coverage-instrumentation.md), but using these +coverage results for PGO has not been attempted at this time. + ### Overall Workflow Generating a PGO-optimized program involves the following four steps: -1. Compile the program with instrumentation enabled (e.g. `rustc -Cprofile-generate main.rs`) +1. Compile the program with instrumentation enabled (e.g. `rustc -C profile-generate main.rs`) 2. Run the instrumented program (e.g. `./main`) which generates a `default-.profraw` file 3. Convert the `.profraw` file into a `.profdata` file using LLVM's `llvm-profdata` tool. 4. Compile the program again, this time making use of the profiling data - (e.g. `rustc -Cprofile-use=merged.profdata main.rs`) + (e.g. `rustc -C profile-use=merged.profdata main.rs`) ### Compile-Time Aspects @@ -108,13 +116,13 @@ data needs some infrastructure in place. In the case of LLVM, these runtime components are implemented in [compiler-rt][compiler-rt-profile] and statically linked into any instrumented binaries. -The `rustc` version of this can be found in `src/libprofiler_builtins` which +The `rustc` version of this can be found in `library/profiler_builtins` which basically packs the C code from `compiler-rt` into a Rust crate. -In order for `libprofiler_builtins` to be built, `profiler = true` must be set +In order for `profiler_builtins` to be built, `profiler = true` must be set in `rustc`'s `config.toml`. -[compiler-rt-profile]: https://github.com/llvm/llvm-project/tree/master/compiler-rt/lib/profile +[compiler-rt-profile]: https://github.com/llvm/llvm-project/tree/main/compiler-rt/lib/profile ## Testing PGO diff --git a/src/doc/rustc-dev-guide/src/profiling.md b/src/doc/rustc-dev-guide/src/profiling.md index 8eaa8e94f1..ca0fee6d57 100644 --- a/src/doc/rustc-dev-guide/src/profiling.md +++ b/src/doc/rustc-dev-guide/src/profiling.md @@ -1,16 +1,112 @@ # Profiling the compiler -This section talks about how to profile the compiler and find out where it spends its time. +This section talks about how to profile the compiler and find out where it spends its time. Depending on what you're trying to measure, there are several different approaches: - If you want to see if a PR improves or regresses compiler performance: - The [rustc-perf](https://github.com/rust-lang/rustc-perf) project makes this easy and can be triggered to run on a PR via the `@rustc-perf` bot. - + - If you want a medium-to-high level overview of where `rustc` is spending its time: - - The `-Zself-profile` flag and [measureme](https://github.com/rust-lang/measureme) tools offer a query-based approach to profiling. + - The `-Z self-profile` flag and [measureme](https://github.com/rust-lang/measureme) tools offer a query-based approach to profiling. See [their docs](https://github.com/rust-lang/measureme/blob/master/summarize/Readme.md) for more information. - + - If you want function level performance data or even just more details than the above approaches: - - Consider using a native code profiler such as [perf](profiling/with_perf.html). + - Consider using a native code profiler such as [perf](profiling/with_perf.html) + - or [tracy](https://github.com/nagisa/rust_tracy_client) for a nanosecond-precision, + full-featured graphical interface. + +- If you want a nice visual representation of the compile times of your crate graph, + you can use [cargo's `-Z timings` flag](https://doc.rust-lang.org/cargo/reference/unstable.html#timings), + eg. `cargo -Z timings build`. + You can use this flag on the compiler itself with `CARGOFLAGS="-Z timings" ./x.py build` + +- If you want to profile memory usage, you can use various tools depending on what operating system + you are using. + - For Windows, read our [WPA guide](profiling/wpa_profiling.html). + +## Optimizing rustc's bootstrap times with `cargo-llvm-lines` + +Using [cargo-llvm-lines](https://github.com/dtolnay/cargo-llvm-lines) you can count the +number of lines of LLVM IR across all instantiations of a generic function. +Since most of the time compiling rustc is spent in LLVM, the idea is that by +reducing the amount of code passed to LLVM, compiling rustc gets faster. + +To use `cargo-llvm-lines` together with somewhat custom rustc build process, you can use +`-C save-temps` to obtain required LLVM IR. The option preserves temporary work products +created during compilation. Among those is LLVM IR that represents an input to the +optimization pipeline; ideal for our purposes. It is stored in files with `*.no-opt.bc` +extension in LLVM bitcode format. + +Example usage: +``` +cargo install cargo-llvm-lines +# On a normal crate you could now run `cargo llvm-lines`, but x.py isn't normal :P + +# Do a clean before every run, to not mix in the results from previous runs. +./x.py clean +env RUSTFLAGS=-Csave-temps ./x.py build --stage 0 compiler/rustc + +# Single crate, e.g., rustc_middle. (Relies on the glob support of your shell.) +# Convert unoptimized LLVM bitcode into a human readable LLVM assembly accepted by cargo-llvm-lines. +for f in build/x86_64-unknown-linux-gnu/stage0-rustc/x86_64-unknown-linux-gnu/release/deps/rustc_middle-*.no-opt.bc; do + ./build/x86_64-unknown-linux-gnu/llvm/bin/llvm-dis "$f" +done +cargo llvm-lines --files ./build/x86_64-unknown-linux-gnu/stage0-rustc/x86_64-unknown-linux-gnu/release/deps/rustc_middle-*.ll > llvm-lines-middle.txt + +# Specify all crates of the compiler. +for f in build/x86_64-unknown-linux-gnu/stage0-rustc/x86_64-unknown-linux-gnu/release/deps/*.no-opt.bc; do + ./build/x86_64-unknown-linux-gnu/llvm/bin/llvm-dis "$f" +done +cargo llvm-lines --files ./build/x86_64-unknown-linux-gnu/stage0-rustc/x86_64-unknown-linux-gnu/release/deps/*.ll > llvm-lines.txt +``` + +Example output for the compiler: +``` + Lines Copies Function name + ----- ------ ------------- + 45207720 (100%) 1583774 (100%) (TOTAL) + 2102350 (4.7%) 146650 (9.3%) core::ptr::drop_in_place + 615080 (1.4%) 8392 (0.5%) std::thread::local::LocalKey::try_with + 594296 (1.3%) 1780 (0.1%) hashbrown::raw::RawTable::rehash_in_place + 592071 (1.3%) 9691 (0.6%) core::option::Option::map + 528172 (1.2%) 5741 (0.4%) core::alloc::layout::Layout::array + 466854 (1.0%) 8863 (0.6%) core::ptr::swap_nonoverlapping_one + 412736 (0.9%) 1780 (0.1%) hashbrown::raw::RawTable::resize + 367776 (0.8%) 2554 (0.2%) alloc::raw_vec::RawVec::grow_amortized + 367507 (0.8%) 643 (0.0%) rustc_query_system::dep_graph::graph::DepGraph::with_task_impl + 355882 (0.8%) 6332 (0.4%) alloc::alloc::box_free + 354556 (0.8%) 14213 (0.9%) core::ptr::write + 354361 (0.8%) 3590 (0.2%) core::iter::traits::iterator::Iterator::fold + 347761 (0.8%) 3873 (0.2%) rustc_middle::ty::context::tls::set_tlv + 337534 (0.7%) 2377 (0.2%) alloc::raw_vec::RawVec::allocate_in + 331690 (0.7%) 3192 (0.2%) hashbrown::raw::RawTable::find + 328756 (0.7%) 3978 (0.3%) rustc_middle::ty::context::tls::with_context_opt + 326903 (0.7%) 642 (0.0%) rustc_query_system::query::plumbing::try_execute_query +``` + +Since this doesn't seem to work with incremental compilation or `x.py check`, +you will be compiling rustc _a lot_. +I recommend changing a few settings in `config.toml` to make it bearable: +``` +[rust] +# A debug build takes _a third_ as long on my machine, +# but compiling more than stage0 rustc becomes unbearably slow. +optimize = false + +# We can't use incremental anyway, so we disable it for a little speed boost. +incremental = false +# We won't be running it, so no point in compiling debug checks. +debug = false + +# Using a single codegen unit gives less output, but is slower to compile. +codegen-units = 0 # num_cpus +``` + +The llvm-lines output is affected by several options. +`optimize = false` increases it from 2.1GB to 3.5GB and `codegen-units = 0` to 4.1GB. +MIR optimizations have little impact. Compared to the default `RUSTFLAGS="-Z +mir-opt-level=1"`, level 0 adds 0.3GB and level 2 removes 0.2GB. +As of January 2021, inlining currently only happens in +LLVM but this might change in the future. diff --git a/src/doc/rustc-dev-guide/src/profiling/with_perf.md b/src/doc/rustc-dev-guide/src/profiling/with_perf.md index 7a4c972f20..b383ec542b 100644 --- a/src/doc/rustc-dev-guide/src/profiling/with_perf.md +++ b/src/doc/rustc-dev-guide/src/profiling/with_perf.md @@ -150,7 +150,7 @@ the `cargo rustc` command, like so: ```bash touch src/lib.rs -CARGO_INCREMENTAL=0 perf record -F99 --call-graph dwarf cargo rustc --profile check --lib -- -Zborrowck=mir +CARGO_INCREMENTAL=0 perf record -F99 --call-graph dwarf cargo rustc --profile check --lib -- -Z borrowck=mir ``` [pf]: https://github.com/nikomatsakis/perf-focus @@ -241,7 +241,7 @@ Percentage : 0% Here we used the `..` operator to ask "how often do we have `do_mir_borrowck` on the stack and then, later, some function whose -name begins with `rusc::traits`?" (basically, code in that module). It +name begins with `rustc::traits`?" (basically, code in that module). It turns out the answer is "almost never" — only 12 samples fit that description (if you ever see *no* samples, that often indicates your query is messed up). diff --git a/src/doc/rustc-dev-guide/src/profiling/wpa_profiling.md b/src/doc/rustc-dev-guide/src/profiling/wpa_profiling.md new file mode 100644 index 0000000000..7943cf5a40 --- /dev/null +++ b/src/doc/rustc-dev-guide/src/profiling/wpa_profiling.md @@ -0,0 +1,108 @@ +# Profiling on Windows + +## Introducing WPR and WPA + +High-level performance analysis (including memory usage) can be performed with the Windows +Performance Recorder (WPR) and Windows Performance Analyzer (WPA). As the names suggest, WPR is for +recording system statistics (in the form of event trace log a.k.a. ETL files), while WPA is for +analyzing these ETL files. + +WPR collects system wide statistics, so it won't just record things relevant to rustc but also +everything else that's running on the machine. During analysis, we can filter to just the things we +find interesting. + +These tools are quite powerful but also require a bit of learning +before we can successfully profile the Rust compiler. + +Here we will explore how to use WPR and WPA for analyzing the Rust compiler as well as provide +links to useful "profiles" (i.e., settings files that tweak the defaults for WPR and WPA) that are +specifically designed to make analyzing rustc easier. + +### Installing WPR and WPA + +You can install WPR and WPA as part of the Windows Performance Toolkit which itself is an option as +part of downloading the Windows Assessment and Deployment Kit (ADK). You can download the ADK +installer [here](https://go.microsoft.com/fwlink/?linkid=2086042). Make sure to select the Windows +Performance Toolkit (you don't need to select anything else). + +## Recording + +In order to perform system analysis, you'll first need to record your system with WPR. Open WPR and +at the bottom of the window select the "profiles" of the things you want to record. For looking +into memory usage of the rustc bootstrap process, we'll want to select the following items: + +* CPU usage +* VirtualAlloc usage + +You might be tempted to record "Heap usage" as well, but this records every single heap allocation +and can be very, very expensive. For high-level analysis, it might be best to leave that turned +off. + +Now we need to get our setup ready to record. For memory usage analysis, it is best to record the +stage 2 compiler build with a stage 1 compiler build with debug symbols. Having symbols in the +compiler we're using to build rustc will aid our analysis greatly by allowing WPA to resolve Rust +symbols correctly. Unfortunately, the stage 0 compiler does not have symbols turned on which is why +we'll need to build a stage 1 compiler and then a stage 2 compiler ourselves. + +To do this, make sure you have set `debuginfo-level = 1` in your `config.toml` file. This tells +rustc to generate debug information which includes stack frames when bootstrapping. + +Now you can build the stage 1 compiler: `python x.py build --stage 1 -i library/std` or however +else you want to build the stage 1 compiler. + +Now that the stage 1 compiler is built, we can record the stage 2 build. Go back to WPR, click the +"start" button and build the stage 2 compiler (e.g., `python x build --stage=2 -i library/std `). +When this process finishes, stop the recording. + +Click the Save button and once that process is complete, click the "Open in WPA" button which +appears. + +> Note: The trace file is fairly large so it can take WPA some time to finish opening the file. + +## Analysis + +Now that our ETL file is open in WPA, we can analyze the results. First, we'll want to apply the +pre-made "profile" which will put WPA into a state conducive to analyzing rustc bootstrap. Download +the profile [here](https://github.com/wesleywiser/rustc-bootstrap-wpa-analysis/releases/download/1/rustc.generic.wpaProfile). +Select the "Profiles" menu at the top, then "apply" and then choose the downloaded profile. + +You should see something resembling the following: + +![WPA with profile applied](../img/wpa-initial-memory.png) + +Next, we will need to tell WPA to load and process debug symbols so that it can properly demangle +the Rust stack traces. To do this, click "Trace" and then choose "Load Symbols". This step can take +a while. + +Once WPA has loaded symbols for rustc, we can expand the rustc.exe node and begin drilling down +into the stack with the largest allocations. + +To do that, we'll expand the `[Root]` node in the "Commit Stack" column and continue expanding +until we find interesting stack frames. + +> Tip: After selecting the node you want to expand, press the right arrow key. This will expand the +node and put the selection on the next largest node in the expanded set. You can continue pressing +the right arrow key until you reach an interesting frame. + +![WPA with expanded stack](../img/wpa-stack.png) + +In this sample, you can see calls through codegen are allocating ~30gb of memory in total +throughout this profile. + +## Other Analysis Tabs + +The profile also includes a few other tabs which can be helpful: + +- System Configuration + - General information about the system the capture was recorded on. +- rustc Build Processes + - A flat list of relevant processes such as rustc.exe, cargo.exe, link.exe etc. + - Each process lists its command line arguments. + - Useful for figuring out what a specific rustc process was working on. +- rustc Build Process Tree + - Timeline showing when processes started and exited. +- rustc CPU Analysis + - Contains charts preconfigured to show hotspots in rustc. + - These charts are designed to support analyzing where rustc is spending its time. +- rustc Memory Analysis + - Contains charts preconfigured to show where rustc is allocating memory. diff --git a/src/doc/rustc-dev-guide/src/queries/incremental-compilation-in-detail.md b/src/doc/rustc-dev-guide/src/queries/incremental-compilation-in-detail.md index a41becfd0e..f0c6dcacd6 100644 --- a/src/doc/rustc-dev-guide/src/queries/incremental-compilation-in-detail.md +++ b/src/doc/rustc-dev-guide/src/queries/incremental-compilation-in-detail.md @@ -1,5 +1,7 @@ # Incremental Compilation In Detail + + The incremental compilation scheme is, in essence, a surprisingly simple extension to the overall query system. It relies on the fact that: @@ -175,7 +177,7 @@ fn try_mark_green(tcx, current_node) -> bool { } // Note: The actual implementation can be found in -// src/librustc_middle/dep_graph/graph.rs +// compiler/rustc_middle/src/dep_graph/graph.rs ``` By using red-green marking we can avoid the devastating cumulative effect of @@ -207,7 +209,7 @@ This comes with a whole new set of implementation challenges: Fixed-sized, plain-old-data is preferred to complex things that need to run through an expensive (de-)serialization step. -The following sections describe how the compiler currently solves these issues. +The following sections describe how the compiler solves these issues. ### A Question Of Stability: Bridging The Gap Between Compilation Sessions @@ -401,6 +403,97 @@ deal with all of the above but so far that seemed like more trouble than it would save. + +## Query Modifiers + +The query system allows for applying [modifiers][mod] to queries. These +modifiers affect certain aspects of how the system treats the query with +respect to incremental compilation: + + - `eval_always` - A query with the `eval_always` attribute is re-executed + unconditionally during incremental compilation. I.e. the system will not + even try to mark the query's dep-node as green. This attribute has two use + cases: + + - `eval_always` queries can read inputs (from files, global state, etc). + They can also produce side effects like writing to files and changing global state. + + - Some queries are very likely to be re-evaluated because their result + depends on the entire source code. In this case `eval_always` can be used + as an optimization because the system can skip recording dependencies in + the first place. + + - `no_hash` - Applying `no_hash` to a query tells the system to not compute + the fingerprint of the query's result. This has two consequences: + + - Not computing the fingerprint can save quite a bit of time because + fingerprinting is expensive, especially for large, complex values. + + - Without the fingerprint, the system has to unconditionally assume that + the result of the query has changed. As a consequence anything depending + on a `no_hash` query will always be re-executed. + + - `cache_on_disk_if` - This attribute is what determines which query results + are persisted in the incremental compilation query result cache. The + attribute takes an expression that allows per query invocation + decisions. For example, it makes no sense to store values from upstream + crates in the cache because they are already available in the upstream + crate's metadata. + + - `anon` - This attribute makes the system use "anonymous" dep-nodes for the + given query. An anonymous dep-node is not identified by the corresponding + query key, instead its ID is computed from the IDs of its dependencies. This + allows the red-green system to do its change detection even if there is no + query key available for a given dep-node -- something which is needed for + handling trait selection because it is not based on queries. + +[mod]: ../query.html#adding-a-new-kind-of-query + + +## The Projection Query Pattern + +It's interesting to note that `eval_always` and `no_hash` can be used together +in the so-called "projection query" pattern. It is often the case that there is +one query that depends on the entirety of the compiler's input (e.g. the indexed HIR) +and another query that projects individual values out of this monolithic value +(e.g. a HIR item with a certain `DefId`). These projection queries allow for +building change propagation "firewalls" because even if the result of the +monolithic query changes (which it is very likely to do) the small projections +can still mostly be marked as green. + + +```ignore + +------------+ + | | +---------------+ +--------+ + | | <---------| projection(x) | <---------| foo(a) | + | | +---------------+ +--------+ + | | + | monolithic | +---------------+ +--------+ + | query | <---------| projection(y) | <---------| bar(b) | + | | +---------------+ +--------+ + | | + | | +---------------+ +--------+ + | | <---------| projection(z) | <---------| baz(c) | + | | +---------------+ +--------+ + +------------+ +``` + +Let's assume that the result `monolithic_query` changes so that also the result +of `projection(x)` has changed, i.e. both their dep-nodes are being marked as +red. As a consequence `foo(a)` needs to be re-executed; but `bar(b)` and +`baz(c)` can be marked as green. However, if `foo`, `bar`, and `baz` would have +directly depended on `monolithic_query` then all of them would have had to be +re-evaluated. + +This pattern works even without `eval_always` and `no_hash` but the two +modifiers can be used to avoid unnecessary overhead. If the monolithic query +is likely to change at any minor modification of the compiler's input it makes +sense to mark it as `eval_always`, thus getting rid of its dependency tracking +cost. And it always makes sense to mark the monolithic query as `no_hash` +because we have the projections to take care of keeping things green as much +as possible. + + # Shortcomings of the Current System There are many things that still can be improved. @@ -416,7 +509,7 @@ session. The overhead of doing so is a few percent of total compilation time. Data structures used as query results could be factored in a way that removes edges from the dependency graph. Especially "span" information is very volatile, so including it in query result will increase the chance that that result won't -be reusable. See https://github.com/rust-lang/rust/issues/47389 for more +be reusable. See for more information. diff --git a/src/doc/rustc-dev-guide/src/queries/incremental-compilation.md b/src/doc/rustc-dev-guide/src/queries/incremental-compilation.md index be8580f2db..abef144d7d 100644 --- a/src/doc/rustc-dev-guide/src/queries/incremental-compilation.md +++ b/src/doc/rustc-dev-guide/src/queries/incremental-compilation.md @@ -1,5 +1,7 @@ # Incremental compilation + + The incremental compilation scheme is, in essence, a surprisingly simple extension to the overall query system. We'll start by describing a slightly simplified variant of the real thing – the "basic algorithm" – @@ -12,7 +14,7 @@ called the **red-green** algorithm[^salsa]. The high-level idea is that, after each run of the compiler, we will save the results of all the queries that we do, as well as the **query DAG**. The **query DAG** is a [DAG] that indexes which queries executed which -other queries. So, for example, there would be an edge from a query Q1 +other queries. So, for example, there would be an [edge] from a query Q1 to another query Q2 if computing Q1 required computing Q2 (note that because queries cannot depend on themselves, this results in a DAG and not a general graph). @@ -81,7 +83,7 @@ Try-mark-green works as follows: ### The query DAG The query DAG code is stored in -[`src/librustc_middle/dep_graph`][dep_graph]. Construction of the DAG is done +[`compiler/rustc_middle/src/dep_graph`][dep_graph]. Construction of the DAG is done by instrumenting the query execution. One key point is that the query DAG also tracks ordering; that is, for @@ -113,7 +115,7 @@ of order, however, it might visit `subquery2` before `subquery1`, and hence execute it. This can lead to ICEs and other problems in the compiler. -[dep_graph]: https://github.com/rust-lang/rust/tree/master/src/librustc_middle/dep_graph +[dep_graph]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/dep_graph/index.html ## Improvements to the basic algorithm @@ -137,8 +139,13 @@ algorithm like so: it did not change. ## Resources -The initial design document can be found at https://github.com/nikomatsakis/rustc-on-demand-incremental-design-doc/blob/master/0000-rustc-on-demand-and-incremental.md, which expands on the memoization details, provides more high-level overview and motivation for this system. +The initial design document can be found [here][initial-design], which expands +on the memoization details, provides more high-level overview and motivation +for this system. # Footnotes [^salsa]: I have long wanted to rename it to the Salsa algorithm, but it never caught on. -@nikomatsakis + +[edge]: https://en.wikipedia.org/wiki/Glossary_of_graph_theory_terms#edge +[initial-design]: https://github.com/nikomatsakis/rustc-on-demand-incremental-design-doc/blob/master/0000-rustc-on-demand-and-incremental.md diff --git a/src/doc/rustc-dev-guide/src/queries/profiling.md b/src/doc/rustc-dev-guide/src/queries/profiling.md index 37b1bc97b4..1160ba8188 100644 --- a/src/doc/rustc-dev-guide/src/queries/profiling.md +++ b/src/doc/rustc-dev-guide/src/queries/profiling.md @@ -1,8 +1,11 @@ # 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, +The details of this model are 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). @@ -20,7 +23,7 @@ address [issue 42678](https://github.com/rust-lang/rust/issues/42678). Compile the compiler, up to at least stage 1: ``` -python x.py --stage 1 +./x.py build library/std ``` ### 2. Run `rustc`, with flags @@ -50,7 +53,7 @@ This command will generate the following files: - 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 + from the queries in the HTML output (they appear as green boxes, via CSS). ### 4. Inspect the output @@ -74,7 +77,7 @@ _actual_ output is much longer. [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). +Here is the corresponding [text output](./example-0.counts.txt). [profile-example-html]: ./example-0.html @@ -86,8 +89,8 @@ The trace of the queries has a formal structure; see 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. + _timed passes_ in the compiler. As of January 2021 + these passes are not queries, but may be replaced by queries in future versions. - **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 @@ -111,7 +114,7 @@ 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). + numbers are simple heuristics (hard-coded, but easy to modify). Important nodes are styled with textual labels, and highlighted borders (light red, and bolded). @@ -139,7 +142,7 @@ These rows are **sorted by total duration**, in descending order. 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"). +`"hello world"`). As explained above, the columns consist of `provider/pass`, `count`, `duration`: @@ -259,7 +262,7 @@ We give some background about the query model of the Rust compiler. 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_middle/hir/def_id.rs`): +From the compiler source code (`compiler/rustc_span/src/def_id.rs`): ``` /// A DefId identifies a particular *definition*, by combining a crate @@ -282,7 +285,7 @@ We explain each term in more detail: 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 + - `typeck` -- 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. diff --git a/src/doc/rustc-dev-guide/src/queries/query-evaluation-model-in-detail.md b/src/doc/rustc-dev-guide/src/queries/query-evaluation-model-in-detail.md index 2d4214ef36..4c2427e3c4 100644 --- a/src/doc/rustc-dev-guide/src/queries/query-evaluation-model-in-detail.md +++ b/src/doc/rustc-dev-guide/src/queries/query-evaluation-model-in-detail.md @@ -1,7 +1,7 @@ - - # The Query Evaluation Model in Detail + + This chapter provides a deeper dive into the abstract model queries are built on. It does not go into implementation details but tries to explain the underlying logic. The examples here, therefore, have been stripped down and @@ -38,10 +38,10 @@ corresponding result. However, we have to apply some restrictions in order for this to be sound: - The key and result must be immutable values. - - The provider function must be a pure function, that is, for the same key it - must always yield the same result. + - The provider function must be a pure function in the sense that for the same + key it must always yield the same result. - The only parameters a provider function takes are the key and a reference to - the "query context" (which provides access to rest of the "database"). + the "query context" (which provides access to the rest of the "database"). The database is built up lazily by invoking queries. The query providers will invoke other queries, for which the result is either already cached or computed @@ -75,11 +75,12 @@ When the query context is created, it is still empty: No queries have been executed, no results are cached. But the context already provides access to "input" data, i.e. pieces of immutable data that were computed before the context was created and that queries can access to do their computations. -Currently this input data consists mainly of the HIR map, upstream crate -metadata, and the command-line -options the compiler was invoked with. In the future, inputs will just consist -of command-line options and a list of source files -- the HIR map will itself -be provided by a query which processes these source files. + +As of January 2021, this input data consists mainly of +the HIR map, upstream crate metadata, and the command-line options the compiler +was invoked with; but in the future inputs will just consist of command-line +options and a list of source files -- the HIR map will itself be provided by a +query which processes these source files. Without inputs, queries would live in a void without anything to compute their result from (remember, query providers only have access to other queries and diff --git a/src/doc/rustc-dev-guide/src/query.md b/src/doc/rustc-dev-guide/src/query.md index 6e2193bd34..294d61fb3d 100644 --- a/src/doc/rustc-dev-guide/src/query.md +++ b/src/doc/rustc-dev-guide/src/query.md @@ -1,16 +1,15 @@ # Queries: demand-driven compilation -As described in [the high-level overview of the compiler][hl], the -Rust compiler is currently transitioning from a traditional "pass-based" -setup to a "demand-driven" system. **The Compiler Query System is the -key to our new demand-driven organization.** The idea is pretty -simple. You have various queries that compute things about the input -– for example, there is a query called `type_of(def_id)` that, given -the [def-id] of some item, will compute the type of that item and return -it to you. +As described in [the high-level overview of the compiler][hl], the Rust compiler +is still (as of January 2021) transitioning from a +traditional "pass-based" setup to a "demand-driven" system. **The Compiler Query +System is the key to our new demand-driven organization.** The idea is pretty +simple. You have various queries that compute things about the input – for +example, there is a query called `type_of(def_id)` that, given the [def-id] of +some item, will compute the type of that item and return it to you. [def-id]: appendix/glossary.md#def-id -[hl]: high-level-overview.html +[hl]: ./compiler-src.md Query execution is **memoized** – so the first time you invoke a query, it will go do the computation, but the next time, the result is @@ -114,7 +113,7 @@ for external crates, though the plan is that we may eventually have one per crate. These `Providers` structs are ultimately created and populated by -`librustc_driver`, but it does this by distributing the work +`rustc_driver`, but it does this by distributing the work throughout the other `rustc_*` crates. This is done by invoking various [`provide`][provide_fn] functions. These functions tend to look something like this: @@ -155,13 +154,11 @@ providers**. Almost all **extern providers** wind up going through the [`rustc_metadata` crate][rustc_metadata], which loads the information from the crate metadata. But in some cases there are crates that provide queries for *both* local and external crates, in which case -they define both a [`provide`][ext_provide] and a -[`provide_extern`][ext_provide_extern] function that `rustc_driver` -can invoke. +they define both a `provide` and a `provide_extern` function, through +[`provide_both`][ext_provide_both], that `rustc_driver` can invoke. -[rustc_metadata]: https://github.com/rust-lang/rust/tree/master/src/librustc_metadata -[ext_provide]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_llvm/attributes/fn.provide.html -[ext_provide_extern]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_llvm/attributes/fn.provide_extern.html +[rustc_metadata]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_metadata/index.html +[ext_provide_both]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_llvm/attributes/fn.provide_both.html ### Adding a new kind of query @@ -173,7 +170,7 @@ Well, defining a query takes place in two steps: To specify the query name and arguments, you simply add an entry to the big macro invocation in -[`src/librustc_middle/query/mod.rs`][query-mod], which looks something like: +[`compiler/rustc_middle/src/query/mod.rs`][query-mod], which looks something like: [query-mod]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/query/index.html @@ -224,9 +221,10 @@ Let's go over them one by one: of `Steal` for more details. New uses of `Steal` should **not** be added without alerting `@rust-lang/compiler`. - **Query modifiers:** various flags and options that customize how the - query is processed. + query is processed (mostly with respect to [incremental compilation][incrcomp]). -[Key]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/query/keys/trait.Key.html +[Key]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_query_impl/keys/trait.Key.html +[incrcomp]: queries/incremental-compilation-in-detail.html#query-modifiers So, to add a query: @@ -264,7 +262,7 @@ Implementing this trait is optional if the query key is `DefId`, but if you *don't* implement it, you get a pretty generic error ("processing `foo`..."). You can put new impls into the `config` module. They look something like this: -[QueryConfig]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/query/trait.QueryConfig.html +[QueryConfig]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_query_system/query/config/trait.QueryConfig.html [QueryDescription]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_query_system/query/config/trait.QueryDescription.html ```rust,ignore diff --git a/src/doc/rustc-dev-guide/src/rustbot.md b/src/doc/rustc-dev-guide/src/rustbot.md new file mode 100644 index 0000000000..5350f44efb --- /dev/null +++ b/src/doc/rustc-dev-guide/src/rustbot.md @@ -0,0 +1,63 @@ +# Mastering @rustbot + +`@rustbot` (also known as `triagebot`) is a utility robot that is mostly used to +allow any contributor to achieve certain tasks that would normally require GitHub +membership to the `rust-lang` organization. Its most interesting features for +contributors to `rustc` are issue claiming and relabeling. + +## Issue claiming + +`@rustbot` exposes a command that allows anyone to assign an issue to themselves. +If you see an issue you want to work on, you can send the following message as a +comment on the issue at hand: + + @rustbot claim + +This will tell `@rustbot` to assign the issue to you if it has no assignee yet. +Note that because of some GitHub restrictions, you may be assigned indirectly, +i.e. `@rustbot` will assign itself as a placeholder and edit the top comment to +reflect the fact that the issue is now assigned to you. + +If you want to unassign from an issue, `@rustbot` has a different command: + + @rustbot release-assignment + +## Issue relabeling + +Changing labels for an issue or PR is also normally reserved for members of the +organization. However, `@rustbot` allows you to relabel an issue yourself, only +with a few restrictions. This is mostly useful in two cases: + +**Helping with issue triage**: Rust's issue tracker has more than 5,000 open +issues at the time of this writing, so labels are the most powerful tool that we +have to keep it as tidy as possible. You don't need to spend hours in the issue tracker +to triage issues, but if you open an issue, you should feel free to label it if +you are comfortable with doing it yourself. + +**Updating the status of a PR**: We use "status labels" to reflect the status of +PRs. For example, if your PR has merge conflicts, it will automatically be assigned +the `S-waiting-on-author`, and reviewers might not review it until you rebase your +PR. Once you do rebase your branch, you should change the labels yourself to remove +the `S-waiting-on-author` label and add back `S-waiting-on-review`. In this case, +the `@rustbot` command will look like this: + + @rustbot label -S-waiting-on-author +S-waiting-on-review + +The syntax for this command is pretty loose, so there are other variants of this +command invocation. For more details, see [the wiki page about labeling][labeling]. + +[labeling]: https://github.com/rust-lang/triagebot/wiki/Labeling + +## Other commands + +If you are interested in seeing what `@rustbot` is capable of, check out its [wiki], +which is meant as a reference for the bot and should be kept up to date every time the +bot gets an upgrade. + +`@rustbot` is maintained by the Release team. If you have any feedback regarding +existing commands or suggestions for new commands, feel free to reach out +[on Zulip][zulip] or file an issue in [the triagebot repository][repo] + +[wiki]: https://github.com/rust-lang/triagebot/wiki +[zulip]: https://rust-lang.zulipchat.com/#narrow/stream/224082-t-release.2Ftriagebot +[repo]: https://github.com/rust-lang/triagebot/ diff --git a/src/doc/rustc-dev-guide/src/rustc-driver-getting-diagnostics.md b/src/doc/rustc-dev-guide/src/rustc-driver-getting-diagnostics.md new file mode 100644 index 0000000000..27ca2ca12b --- /dev/null +++ b/src/doc/rustc-dev-guide/src/rustc-driver-getting-diagnostics.md @@ -0,0 +1,41 @@ +# Example: Getting diagnostic through `rustc_interface` + +`rustc_interface` allows you to intercept diagnostics that would otherwise be printed to stderr. + +## Getting diagnostics + +To get diagnostics from the compiler, +configure `rustc_interface::Config` to output diagnostic to a buffer, +and run `TyCtxt.analysis`: + +```rust +// See https://github.com/rust-lang/rustc-dev-guide/blob/master/examples/rustc-driver-getting-diagnostics.rs for complete program. +let buffer = sync::Arc::new(sync::Mutex::new(Vec::new())); +let config = rustc_interface::Config { + opts: config::Options { + // Configure the compiler to emit diagnostics in compact JSON format. + error_format: config::ErrorOutputType::Json { + pretty: false, + json_rendered: rustc_errors::emitter::HumanReadableErrorType::Default( + rustc_errors::emitter::ColorConfig::Never, + ), + }, + /* other config */ + }, + // Redirect the diagnostic output of the compiler to a buffer. + diagnostic_output: rustc_session::DiagnosticOutput::Raw(Box::from(DiagnosticSink( + buffer.clone(), + ))), + /* other config */ +}; +rustc_interface::run_compiler(config, |compiler| { + compiler.enter(|queries| { + queries.global_ctxt().unwrap().take().enter(|tcx| { + // Run the analysis phase on the local crate to trigger the type error. + tcx.analysis(rustc_hir::def_id::LOCAL_CRATE); + }); + }); +}); +// Read buffered diagnostics. +let diagnostics = String::from_utf8(buffer.lock().unwrap().clone()).unwrap(); +``` diff --git a/src/doc/rustc-dev-guide/src/rustc-driver-interacting-with-the-ast.md b/src/doc/rustc-dev-guide/src/rustc-driver-interacting-with-the-ast.md index 1749c9db41..21d03bbb74 100644 --- a/src/doc/rustc-dev-guide/src/rustc-driver-interacting-with-the-ast.md +++ b/src/doc/rustc-dev-guide/src/rustc-driver-interacting-with-the-ast.md @@ -4,18 +4,18 @@ ## Getting the type of an expression -NOTE: For the example to compile, you will need to first run the following: - - rustup component add rustc-dev - To get the type of an expression, use the `global_ctxt` to get a `TyCtxt`: ```rust -// In this example, config specifies the rust program: -// fn main() { let message = \"Hello, world!\"; println!(\"{}\", message); } -// Our goal is to get the type of the string literal "Hello, world!". -// -// See https://github.com/rust-lang/rustc-dev-guide/blob/master/examples/rustc-driver-example.rs for a complete example of configuring rustc_interface +// See https://github.com/rust-lang/rustc-dev-guide/blob/master/examples/rustc-driver-interacting-with-the-ast.rs for complete program. +let config = rustc_interface::Config { + input: config::Input::Str { + name: source_map::FileName::Custom("main.rs".to_string()), + input: "fn main() { let message = \"Hello, world!\"; println!(\"{}\", message); }" + .to_string(), + }, + /* other config */ +}; rustc_interface::run_compiler(config, |compiler| { compiler.enter(|queries| { // Analyze the crate and inspect the types under the cursor. @@ -32,7 +32,7 @@ rustc_interface::run_compiler(config, |compiler| { if let Some(expr) = local.init { let hir_id = expr.hir_id; // hir_id identifies the string "Hello, world!" let def_id = tcx.hir().local_def_id(item.hir_id); // def_id identifies the main function - let ty = tcx.typeck_tables_of(def_id).node_type(hir_id); + let ty = tcx.typeck(def_id).node_type(hir_id); println!("{:?}: {:?}", expr, ty); // prints expr(HirId { owner: DefIndex(3), local_id: 4 }: "Hello, world!"): &'static str } } diff --git a/src/doc/rustc-dev-guide/src/rustdoc-internals.md b/src/doc/rustc-dev-guide/src/rustdoc-internals.md new file mode 100644 index 0000000000..b2dc2f7fd1 --- /dev/null +++ b/src/doc/rustc-dev-guide/src/rustdoc-internals.md @@ -0,0 +1,263 @@ +# Rustdoc internals + + + +This page describes rustdoc's passes and modes. For an overview of rustdoc, +see the ["Rustdoc overview" chapter](./rustdoc.md). + +## From crate to clean + +In `core.rs` are two central items: the `DocContext` struct, and the `run_core` +function. The latter is where rustdoc calls out to rustc to compile a crate to +the point where rustdoc can take over. The former is a state container used +when crawling through a crate to gather its documentation. + +The main process of crate crawling is done in `clean/mod.rs` through several +implementations of the `Clean` trait defined within. This is a conversion +trait, which defines one method: + +```rust,ignore +pub trait Clean { + fn clean(&self, cx: &DocContext) -> T; +} +``` + +`clean/mod.rs` also defines the types for the "cleaned" AST used later on to +render documentation pages. Each usually accompanies an implementation of +`Clean` that takes some AST or HIR type from rustc and converts it into the +appropriate "cleaned" type. "Big" items like modules or associated items may +have some extra processing in its `Clean` implementation, but for the most part +these impls are straightforward conversions. The "entry point" to this module +is the `impl Clean for visit_ast::RustdocVisitor`, which is called by +`run_core` above. + +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 `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 +`#[doc(hidden)]` are processed, as well as the logic for whether a `pub use` +should get the full page or a "Reexport" line in the module page. + +The other major thing that happens in `clean/mod.rs` is the collection of doc +comments and `#[doc=""]` attributes into a separate field of the Attributes +struct, present on anything that gets hand-written documentation. This makes it +easier to collect this documentation later in the process. + +The primary output of this process is a `clean::Crate` with a tree of Items +which describe the publicly-documentable items in the target crate. + +### Hot potato + +Before moving on to the next major step, a few important "passes" occur over +the documentation. These do things like combine the separate "attributes" into +a single string and strip leading whitespace to make the document easier on the +markdown parser, or drop items that are not public or deliberately hidden with +`#[doc(hidden)]`. These are all implemented in the `passes/` directory, one +file per pass. By default, all of these passes are run on a crate, but the ones +regarding dropping private/hidden items can be bypassed by passing +`--document-private-items` to rustdoc. Note that unlike the previous set of AST +transformations, the passes are run on the _cleaned_ crate. + +(Strictly speaking, you can fine-tune the passes run and even add your own, but +[we're trying to deprecate that][44136]. If you need finer-grain control over +these passes, please let us know!) + +[44136]: https://github.com/rust-lang/rust/issues/44136 + +Here is the list of passes as of February 2021: + +- `calculate-doc-coverage` calculates information used for the `--show-coverage` + flag. + +- `check-code-block-syntax` validates syntax inside Rust code blocks + (`` ```rust ``) + +- `check-invalid-html-tags` detects invalid HTML (like an unclosed ``) + in doc comments. + +- `check-non-autolinks` detects links that could or should be written using + angle brackets (the code behind the nightly-only + `non_autolinks` lint). + +- `collapse-docs` concatenates all document attributes into one document + attribute. This is necessary because each line of a doc comment is given as a + separate doc attribute, and this will combine them into a single string with + line breaks between each attribute. + +- `collect-intra-doc-links` resolves [intra-doc links](https://doc.rust-lang.org/rustdoc/linking-to-items-by-name.html). + +- `collect-trait-impls` collects trait impls for each item in the crate. For + example, if we define a struct that implements a trait, this pass will note + that the struct implements that trait. + +- `doc-test-lints` runs various lints on the doctests. + +- `propagate-doc-cfg` propagates `#[doc(cfg(...))]` to child items. + +- `strip-priv-imports` strips all private import statements (`use`, `extern + crate`) from a crate. This is necessary because rustdoc will handle *public* + imports by either inlining the item's documentation to the module or creating + a "Reexports" section with the import in it. The pass ensures that all of + these imports are actually relevant to documentation. + +- `strip-hidden` and `strip-private` strip all `doc(hidden)` and private items + from the output. `strip-private` implies `strip-priv-imports`. Basically, the + goal is to remove items that are not relevant for public documentation. + +- `unindent-comments` removes excess indentation on comments in order for the + Markdown to be parsed correctly. This is necessary because the convention for + writing documentation is to provide a space between the `///` or `//!` marker + and the doc text, but Markdown is whitespace-sensitive. For example, a block + of text with four-space indentation is parsed as a code block, so if we didn't + unindent comments, these list items + + ```rust,ignore + /// A list: + /// + /// - Foo + /// - Bar + ``` + + would be parsed as if they were in a code block, which is likely not what the + user intended. + +There is also a `stripper` module in `passes/`, but it is a collection of +utility functions for the `strip-*` passes and is not a pass itself. + +## From clean to crate + +This is where the "second phase" in rustdoc begins. This phase primarily lives +in the `html/` folder, and it all starts with `run()` in `html/render.rs`. This +code is responsible for setting up the `Context`, `SharedContext`, and `Cache` +which are used during rendering, copying out the static files which live in +every rendered set of documentation (things like the fonts, CSS, and JavaScript +that live in `html/static/`), creating the search index, and printing out the +source code rendering, before beginning the process of rendering all the +documentation for the crate. + +Several functions implemented directly on `Context` take the `clean::Crate` and +set up some state between rendering items or recursing on a module's child +items. From here the "page rendering" begins, via an enormous `write!()` call +in `html/layout.rs`. The parts that actually generate HTML from the items and +documentation occurs within a series of `std::fmt::Display` implementations and +functions that pass around a `&mut std::fmt::Formatter`. The top-level +implementation that writes out the page body is the `impl<'a> fmt::Display for +Item<'a>` in `html/render.rs`, which switches out to one of several `item_*` +functions based on the kind of `Item` being rendered. + +Depending on what kind of rendering code you're looking for, you'll probably +find it either in `html/render.rs` for major items like "what sections should I +print for a struct page" or `html/format.rs` for smaller component pieces like +"how should I print a where clause as part of some other item". + +Whenever rustdoc comes across an item that should print hand-written +documentation alongside, it calls out to `html/markdown.rs` which interfaces +with the Markdown parser. This is exposed as a series of types that wrap a +string of Markdown, and implement `fmt::Display` to emit HTML text. It takes +special care to enable certain features like footnotes and tables and add +syntax highlighting to Rust code blocks (via `html/highlight.rs`) before +running the Markdown parser. There's also a function in here +(`find_testable_code`) that specifically scans for Rust code blocks so the +test-runner code can find all the doctests in the crate. + +### From soup to nuts + +(alternate title: ["An unbroken thread that stretches from those first `Cell`s +to us"][video]) + +[video]: https://www.youtube.com/watch?v=hOLAGYmUQV0 + +It's important to note that the AST cleaning can ask the compiler for +information (crucially, `DocContext` contains a `TyCtxt`), but page rendering +cannot. The `clean::Crate` created within `run_core` is passed outside the +compiler context before being handed to `html::render::run`. This means that a +lot of the "supplementary data" that isn't immediately available inside an +item's definition, like which trait is the `Deref` trait used by the language, +needs to be collected during cleaning, stored in the `DocContext`, and passed +along to the `SharedContext` during HTML rendering. This manifests as a bunch +of shared state, context variables, and `RefCell`s. + +Also of note is that some items that come from "asking the compiler" don't go +directly into the `DocContext` - for example, when loading items from a foreign +crate, rustdoc will ask about trait implementations and generate new `Item`s +for the impls based on that information. This goes directly into the returned +`Crate` rather than roundabout through the `DocContext`. This way, these +implementations can be collected alongside the others, right before rendering +the HTML. + +## Other tricks up its sleeve + +All this describes the process for generating HTML documentation from a Rust +crate, but there are couple other major modes that rustdoc runs in. It can also +be run on a standalone Markdown file, or it can run doctests on Rust code or +standalone Markdown files. For the former, it shortcuts straight to +`html/markdown.rs`, optionally including a mode which inserts a Table of +Contents to the output HTML. + +For the latter, rustdoc runs a similar partial-compilation to get relevant +documentation in `test.rs`, but instead of going through the full clean and +render process, it runs a much simpler crate walk to grab *just* the +hand-written documentation. Combined with the aforementioned +"`find_testable_code`" in `html/markdown.rs`, it builds up a collection of +tests to run before handing them off to the test runner. One notable +location in `test.rs` is the function `make_test`, which is where hand-written +doctests get transformed into something that can be executed. + +Some extra reading about `make_test` can be found +[here](https://quietmisdreavus.net/code/2018/02/23/how-the-doctests-get-made/). + +## Dotting i's and crossing t's + +So that's rustdoc's code in a nutshell, but there's more things in the repo +that deal with it. Since we have the full `compiletest` suite at hand, there's +a set of tests in `src/test/rustdoc` that make sure the final HTML is what we +expect in various situations. These tests also use a supplementary script, +`src/etc/htmldocck.py`, that allows it to look through the final HTML using +XPath notation to get a precise look at the output. The full description of all +the commands available to rustdoc tests (e.g. [`@has`] and [`@matches`]) is in +[`htmldocck.py`]. + +To use multiple crates in a rustdoc test, add `// aux-build:filename.rs` +to the top of the test file. `filename.rs` should be placed in an `auxiliary` +directory relative to the test file with the comment. If you need to build +docs for the auxiliary file, use `// build-aux-docs`. + +In addition, there are separate tests for the search index and rustdoc's +ability to query it. The files in `src/test/rustdoc-js` each contain a +different search query and the expected results, broken out by search tab. +These files are processed by a script in `src/tools/rustdoc-js` and the Node.js +runtime. These tests don't have as thorough of a writeup, but a broad example +that features results in all tabs can be found in `basic.js`. The basic idea is +that you match a given `QUERY` with a set of `EXPECTED` results, complete with +the full item path of each item. + +[`htmldocck.py`]: https://github.com/rust-lang/rust/blob/master/src/etc/htmldocck.py +[`@has`]: https://github.com/rust-lang/rust/blob/master/src/etc/htmldocck.py#L39 +[`@matches`]: https://github.com/rust-lang/rust/blob/master/src/etc/htmldocck.py#L44 + +## Testing locally + +Some features of the generated HTML documentation might require local +storage to be used across pages, which doesn't work well without an HTTP +server. To test these features locally, you can run a local HTTP server, like +this: + +```bash +$ ./x.py doc library/std --stage 1 +# The documentation has been generated into `build/[YOUR ARCH]/doc`. +$ python3 -m http.server -d build/[YOUR ARCH]/doc +``` + +Now you can browse your documentation just like you would if it was hosted +on the internet. For example, the url for `std` will be `/std/". + +## See also + +- The [`rustdoc` api docs] +- [An overview of `rustdoc`](./rustdoc.md) +- [The rustdoc user guide] + +[`rustdoc` api docs]: https://doc.rust-lang.org/nightly/nightly-rustc/rustdoc/ +[The rustdoc user guide]: https://doc.rust-lang.org/nightly/rustdoc/ diff --git a/src/doc/rustc-dev-guide/src/rustdoc.md b/src/doc/rustc-dev-guide/src/rustdoc.md index fc964b18e3..33f2c5f357 100644 --- a/src/doc/rustc-dev-guide/src/rustdoc.md +++ b/src/doc/rustc-dev-guide/src/rustdoc.md @@ -1,15 +1,20 @@ -# The walking tour of rustdoc +# Rustdoc overview Rustdoc actually uses the rustc internals directly. It lives in-tree with the compiler and standard library. This chapter is about how it works. +For information about Rustdoc's features and how to use them, see +the [Rustdoc book](https://doc.rust-lang.org/nightly/rustdoc/). +For more details about how rustdoc works, see the ["Rustdoc internals" chapter]. + +["Rustdoc internals" chapter]: ./rustdoc-internals.md Rustdoc is implemented entirely within the crate [`librustdoc`][rd]. It runs the compiler up to the point where we have an internal representation of a crate (HIR) and the ability to run some queries about the types of items. [HIR] and [queries] are discussed in the linked chapters. -[HIR]: ./hir.html -[queries]: ./query.html +[HIR]: ./hir.md +[queries]: ./query.md [rd]: https://github.com/rust-lang/rust/tree/master/src/librustdoc `librustdoc` performs two major steps after that to render a set of @@ -30,17 +35,19 @@ does is call the `main()` that's in this crate's `lib.rs`, though.) ## Cheat sheet -* Use `./x.py build --stage 1 src/libstd src/tools/rustdoc` to make a usable +* Use `./x.py build` to make a usable rustdoc you can run on other projects. - * Add `src/libtest` to be able to use `rustdoc --test`. + * Add `library/test` to be able to use `rustdoc --test`. * If you've used `rustup toolchain link local /path/to/build/$TARGET/stage1` previously, then after the previous build command, `cargo +local doc` will Just Work. -* Use `./x.py doc --stage 1 src/libstd` to use this rustdoc to generate the +* Use `./x.py doc --stage 1 library/std` to use this rustdoc to generate the standard library docs. * The completed docs will be available in `build/$TARGET/doc/std`, though the bundle is meant to be used as though you would copy out the `doc` folder to a web server, since that's where the CSS/JS and landing page are. +* Use `x.py test src/test/rustdoc*` to run the tests using a stage1 rustdoc. + * See [rustdoc internals] for more information about tests. * Most of the HTML printing code is in `html/format.rs` and `html/render.rs`. It's in a bunch of `fmt::Display` implementations and supplementary functions. @@ -55,188 +62,3 @@ does is call the `main()` that's in this crate's `lib.rs`, though.) * Tests on search index generation are located in `src/test/rustdoc-js`, as a series of JavaScript files that encode queries on the standard library search index and expected results. - -## From crate to clean - -In `core.rs` are two central items: the `DocContext` struct, and the `run_core` -function. The latter is where rustdoc calls out to rustc to compile a crate to -the point where rustdoc can take over. The former is a state container used -when crawling through a crate to gather its documentation. - -The main process of crate crawling is done in `clean/mod.rs` through several -implementations of the `Clean` trait defined within. This is a conversion -trait, which defines one method: - -```rust,ignore -pub trait Clean { - fn clean(&self, cx: &DocContext) -> T; -} -``` - -`clean/mod.rs` also defines the types for the "cleaned" AST used later on to -render documentation pages. Each usually accompanies an implementation of -`Clean` that takes some AST or HIR type from rustc and converts it into the -appropriate "cleaned" type. "Big" items like modules or associated items may -have some extra processing in its `Clean` implementation, but for the most part -these impls are straightforward conversions. The "entry point" to this module -is the `impl Clean for visit_ast::RustdocVisitor`, which is called by -`run_core` above. - -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 `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 -`#[doc(hidden)]` are processed, as well as the logic for whether a `pub use` -should get the full page or a "Reexport" line in the module page. - -The other major thing that happens in `clean/mod.rs` is the collection of doc -comments and `#[doc=""]` attributes into a separate field of the Attributes -struct, present on anything that gets hand-written documentation. This makes it -easier to collect this documentation later in the process. - -The primary output of this process is a `clean::Crate` with a tree of Items -which describe the publicly-documentable items in the target crate. - -### Hot potato - -Before moving on to the next major step, a few important "passes" occur over -the documentation. These do things like combine the separate "attributes" into -a single string and strip leading whitespace to make the document easier on the -markdown parser, or drop items that are not public or deliberately hidden with -`#[doc(hidden)]`. These are all implemented in the `passes/` directory, one -file per pass. By default, all of these passes are run on a crate, but the ones -regarding dropping private/hidden items can be bypassed by passing -`--document-private-items` to rustdoc. Note that unlike the previous set of AST -transformations, the passes happen on the _cleaned_ crate. - -(Strictly speaking, you can fine-tune the passes run and even add your own, but -[we're trying to deprecate that][44136]. If you need finer-grain control over -these passes, please let us know!) - -[44136]: https://github.com/rust-lang/rust/issues/44136 - -Here is current (as of this writing) list of passes: - -- `propagate-doc-cfg` - propagates `#[doc(cfg(...))]` to child items. -- `collapse-docs` concatenates all document attributes into one document - attribute. This is necessary because each line of a doc comment is given as a - separate doc attribute, and this will combine them into a single string with - line breaks between each attribute. -- `unindent-comments` removes excess indentation on comments in order for - markdown to like it. This is necessary because the convention for writing - documentation is to provide a space between the `///` or `//!` marker and the - text, and stripping that leading space will make the text easier to parse by - the Markdown parser. (In the past, the markdown parser used was not - Commonmark- compliant, which caused annoyances with extra whitespace but this - seems to be less of an issue today.) -- `strip-priv-imports` strips all private import statements (`use`, `extern - crate`) from a crate. This is necessary because rustdoc will handle *public* - imports by either inlining the item's documentation to the module or creating - a "Reexports" section with the import in it. The pass ensures that all of - these imports are actually relevant to documentation. -- `strip-hidden` and `strip-private` strip all `doc(hidden)` and private items - from the output. `strip-private` implies `strip-priv-imports`. Basically, the - goal is to remove items that are not relevant for public documentation. - -## From clean to crate - -This is where the "second phase" in rustdoc begins. This phase primarily lives -in the `html/` folder, and it all starts with `run()` in `html/render.rs`. This -code is responsible for setting up the `Context`, `SharedContext`, and `Cache` -which are used during rendering, copying out the static files which live in -every rendered set of documentation (things like the fonts, CSS, and JavaScript -that live in `html/static/`), creating the search index, and printing out the -source code rendering, before beginning the process of rendering all the -documentation for the crate. - -Several functions implemented directly on `Context` take the `clean::Crate` and -set up some state between rendering items or recursing on a module's child -items. From here the "page rendering" begins, via an enormous `write!()` call -in `html/layout.rs`. The parts that actually generate HTML from the items and -documentation occurs within a series of `std::fmt::Display` implementations and -functions that pass around a `&mut std::fmt::Formatter`. The top-level -implementation that writes out the page body is the `impl<'a> fmt::Display for -Item<'a>` in `html/render.rs`, which switches out to one of several `item_*` -functions based on the kind of `Item` being rendered. - -Depending on what kind of rendering code you're looking for, you'll probably -find it either in `html/render.rs` for major items like "what sections should I -print for a struct page" or `html/format.rs` for smaller component pieces like -"how should I print a where clause as part of some other item". - -Whenever rustdoc comes across an item that should print hand-written -documentation alongside, it calls out to `html/markdown.rs` which interfaces -with the Markdown parser. This is exposed as a series of types that wrap a -string of Markdown, and implement `fmt::Display` to emit HTML text. It takes -special care to enable certain features like footnotes and tables and add -syntax highlighting to Rust code blocks (via `html/highlight.rs`) before -running the Markdown parser. There's also a function in here -(`find_testable_code`) that specifically scans for Rust code blocks so the -test-runner code can find all the doctests in the crate. - -### From soup to nuts - -(alternate title: ["An unbroken thread that stretches from those first `Cell`s -to us"][video]) - -[video]: https://www.youtube.com/watch?v=hOLAGYmUQV0 - -It's important to note that the AST cleaning can ask the compiler for -information (crucially, `DocContext` contains a `TyCtxt`), but page rendering -cannot. The `clean::Crate` created within `run_core` is passed outside the -compiler context before being handed to `html::render::run`. This means that a -lot of the "supplementary data" that isn't immediately available inside an -item's definition, like which trait is the `Deref` trait used by the language, -needs to be collected during cleaning, stored in the `DocContext`, and passed -along to the `SharedContext` during HTML rendering. This manifests as a bunch -of shared state, context variables, and `RefCell`s. - -Also of note is that some items that come from "asking the compiler" don't go -directly into the `DocContext` - for example, when loading items from a foreign -crate, rustdoc will ask about trait implementations and generate new `Item`s -for the impls based on that information. This goes directly into the returned -`Crate` rather than roundabout through the `DocContext`. This way, these -implementations can be collected alongside the others, right before rendering -the HTML. - -## Other tricks up its sleeve - -All this describes the process for generating HTML documentation from a Rust -crate, but there are couple other major modes that rustdoc runs in. It can also -be run on a standalone Markdown file, or it can run doctests on Rust code or -standalone Markdown files. For the former, it shortcuts straight to -`html/markdown.rs`, optionally including a mode which inserts a Table of -Contents to the output HTML. - -For the latter, rustdoc runs a similar partial-compilation to get relevant -documentation in `test.rs`, but instead of going through the full clean and -render process, it runs a much simpler crate walk to grab *just* the -hand-written documentation. Combined with the aforementioned -"`find_testable_code`" in `html/markdown.rs`, it builds up a collection of -tests to run before handing them off to the libtest test runner. One notable -location in `test.rs` is the function `make_test`, which is where hand-written -doctests get transformed into something that can be executed. - -Some extra reading about `make_test` can be found -[here](https://quietmisdreavus.net/code/2018/02/23/how-the-doctests-get-made/). - -## Dotting i's and crossing t's - -So that's rustdoc's code in a nutshell, but there's more things in the repo -that deal with it. Since we have the full `compiletest` suite at hand, there's -a set of tests in `src/test/rustdoc` that make sure the final HTML is what we -expect in various situations. These tests also use a supplementary script, -`src/etc/htmldocck.py`, that allows it to look through the final HTML using -XPath notation to get a precise look at the output. The full description of all -the commands available to rustdoc tests is in `htmldocck.py`. - -In addition, there are separate tests for the search index and rustdoc's -ability to query it. The files in `src/test/rustdoc-js` each contain a -different search query and the expected results, broken out by search tab. -These files are processed by a script in `src/tools/rustdoc-js` and the Node.js -runtime. These tests don't have as thorough of a writeup, but a broad example -that features results in all tabs can be found in `basic.js`. The basic idea is -that you match a given `QUERY` with a set of `EXPECTED` results, complete with -the full item path of each item. diff --git a/src/doc/rustc-dev-guide/src/salsa.md b/src/doc/rustc-dev-guide/src/salsa.md index 68e92b29fd..bfe7538247 100644 --- a/src/doc/rustc-dev-guide/src/salsa.md +++ b/src/doc/rustc-dev-guide/src/salsa.md @@ -1,11 +1,18 @@ # How Salsa works + + This chapter is based on the explanation given by Niko Matsakis in this [video](https://www.youtube.com/watch?v=_muY4HjSqVw) about -[Salsa](https://github.com/salsa-rs/salsa). +[Salsa](https://github.com/salsa-rs/salsa). To find out more you may +want to watch [Salsa In More +Depth](https://www.youtube.com/watch?v=i_IhACacPRY), also by Niko +Matsakis. -> Salsa is not used directly in rustc, but it is used extensively for -> rust-analyzer and may be integrated into the compiler in the future. +> As of January 2021, although Salsa is inspired by +> (among other things) rustc's query system, it is not used directly in rustc. +> It _is_ used in chalk and extensively in `rust-analyzer`, but there are no +> medium or long-term concrete plans to integrate it into the compiler. ## What is Salsa? @@ -29,7 +36,8 @@ see its type), completions, etc. ## How does it work? -The first thing that Salsa has to do is identify the "base inputs" [^EN1]. +The first thing that Salsa has to do is identify the "base inputs" that +are not something computed but given as input. Then Salsa has to also identify intermediate, "derived" values, which are something that the library produces, but, for each derived value there's a @@ -103,8 +111,8 @@ potentially invalidated. ### Query Groups A query group is a set of queries which have been defined together as a unit. -The database is formed by combining query groups. Query groups are akin to -"Salsa modules" [^EN2]. +The database is formed by combining query groups. Query groups are akin to +"Salsa modules". A set of queries in a query group are just a set of methods in a trait. @@ -208,7 +216,3 @@ fn main() { } } ``` - -[^EN1]: "They are not something that you **inaubible** but something that you kinda get **inaudible** from the outside [3:23](https://youtu.be/_muY4HjSqVw?t=203). - -[^EN2]: What is a Salsa module? diff --git a/src/doc/rustc-dev-guide/src/sanitizers.md b/src/doc/rustc-dev-guide/src/sanitizers.md index 5e1f396f51..ce07140340 100644 --- a/src/doc/rustc-dev-guide/src/sanitizers.md +++ b/src/doc/rustc-dev-guide/src/sanitizers.md @@ -11,7 +11,7 @@ The rustc compiler contains support for following sanitizers: ## How to use the sanitizers? -To enable a sanitizer compile with `-Zsanitizer=...` option, where value is one +To enable a sanitizer compile with `-Z sanitizer=...` option, where value is one of `address`, `leak`, `memory` or `thread`. For more details how to use sanitizers please refer to [the unstable book](https://doc.rust-lang.org/unstable-book/). @@ -49,9 +49,9 @@ libraries. Highlight of the most important aspects of the implementation: * When producing an executable, the sanitizer specific runtime library is [linked in][sanitizer-link]. The libraries are searched for in target libdir relative to default system root, so that this process is not affected - by sysroot overrides used for example by cargo `-Zbuild-std` functionality. + by sysroot overrides used for example by cargo `-Z build-std` functionality. -[compiler-rt]: https://github.com/llvm/llvm-project/tree/master/compiler-rt +[compiler-rt]: https://github.com/llvm/llvm-project/tree/main/compiler-rt [sanitizer-build]: https://github.com/rust-lang/rust/blob/a29424a2265411dda7d7446516ac5fd7499e2b55/src/bootstrap/native.rs#L566-L624 [sanitizer-copy]: https://github.com/rust-lang/rust/blob/a29424a2265411dda7d7446516ac5fd7499e2b55/src/bootstrap/compile.rs#L270-L304 [sanitizer-attribute]: https://github.com/rust-lang/rust/blob/a29424a2265411dda7d7446516ac5fd7499e2b55/src/librustc_codegen_llvm/attributes.rs#L49-L72 diff --git a/src/doc/rustc-dev-guide/src/serialization.md b/src/doc/rustc-dev-guide/src/serialization.md new file mode 100644 index 0000000000..d28df6ec1e --- /dev/null +++ b/src/doc/rustc-dev-guide/src/serialization.md @@ -0,0 +1,164 @@ +# Serialization in Rustc + +Rustc has to [serialize] and deserialize various data during compilation. +Specifically: + +- "Crate metadata", mainly query outputs, are serialized in a binary + format into `rlib` and `rmeta` files that are output when compiling a library + crate, these are then deserialized by crates that depend on that library. +- Certain query outputs are serialized in a binary format to + [persist incremental compilation results]. +- The `-Z ast-json` and `-Z ast-json-noexpand` flags serialize the [AST] to json + and output the result to stdout. +- [`CrateInfo`] is serialized to json when the `-Z no-link` flag is used, and + deserialized from json when the `-Z link-only` flag is used. + +## The `Encodable` and `Decodable` traits + +The [`rustc_serialize`] crate defines two traits for types which can be serialized: + +```rust,ignore +pub trait Encodable { + fn encode(&self, s: &mut S) -> Result<(), S::Error>; +} + +pub trait Decodable: Sized { + fn decode(d: &mut D) -> Result; +} +``` + +It also defines implementations of these for integer types, floating point +types, `bool`, `char`, `str` and various common standard library types. + +For types that are constructed from those types, `Encodable` and `Decodable` are +usually implemented by [derives]. These generate implementations that forward +deserialization to the fields of the struct or enum. For a struct those impls +look something like this: + +```rust,ignore +#![feature(rustc_private)] +extern crate rustc_serialize; +use rustc_serialize::{Decodable, Decoder, Encodable, Encoder}; + +struct MyStruct { + int: u32, + float: f32, +} + +impl Encodable for MyStruct { + fn encode(&self, s: &mut E) -> Result<(), E::Error> { + s.emit_struct("MyStruct", 2, |s| { + s.emit_struct_field("int", 0, |s| self.int.encode(s))?; + s.emit_struct_field("float", 1, |s| self.float.encode(s)) + }) + } +} +impl Decodable for MyStruct { + fn decode(s: &mut D) -> Result { + s.read_struct("MyStruct", 2, |d| { + let int = d.read_struct_field("int", 0, Decodable::decode)?; + let float = d.read_struct_field("float", 1, Decodable::decode)?; + + Ok(MyStruct { int, float }) + }) + } +} +``` + +## Encoding and Decoding arena allocated types + +Rustc has a lot of [arena allocated types]. Deserializing these types isn't +possible without access to the arena that they need to be allocated on. The +[`TyDecoder`] and [`TyEncoder`] traits are supertraits of `Decoder` and +`Encoder` that allow access to a `TyCtxt`. + +Types which contain arena allocated types can then bound the type parameter of +their `Encodable` and `Decodable` implementations with these traits. For +example + +```rust,ignore +impl<'tcx, D: TyDecoder<'tcx>> Decodable for MyStruct<'tcx> { + /* ... */ +} +``` + +The `TyEncodable` and `TyDecodable` [derive macros][derives] will expand to such +an implementation. + +Decoding the actual arena allocated type is harder, because some of the +implementations can't be written due to the orphan rules. To work around this, +the [`RefDecodable`] trait is defined in `rustc_middle`. This can then be +implemented for any type. The `TyDecodable` macro will call `RefDecodable` to +decode references, but various generic code needs types to actually be +`Decodable` with a specific decoder. + +For interned types instead of manually implementing `RefDecodable`, using a new +type wrapper, like `ty::Predicate` and manually implementing `Encodable` and +`Decodable` may be simpler. + +## Derive macros + +The `rustc_macros` crate defines various derives to help implement `Decodable` +and `Encodable`. + +- The `Encodable` and `Decodable` macros generate implementations that apply to + all `Encoders` and `Decoders`. These should be used in crates that don't + depend on `rustc_middle`, or that have to be serialized by a type that does + not implement `TyEncoder`. +- `MetadataEncodable` and `MetadataDecodable` generate implementations that + only allow decoding by [`rustc_metadata::rmeta::encoder::EncodeContext`] and + [`rustc_metadata::rmeta::decoder::DecodeContext`]. These are used for types + that contain `rustc_metadata::rmeta::Lazy`. +- `TyEncodable` and `TyDecoder` generate implementation that apply to any + `TyEncoder` or `TyDecoder`. These should be used for types that are only + serialized in crate metadata and/or the incremental cache, which is most + serializable types in `rustc_middle`. + +## Shorthands + +`Ty` can be deeply recursive, if each `Ty` was encoded naively then crate +metadata would be very large. To handle this, each `TyEncoder` has a cache of +locations in its output where it has serialized types. If a type being encoded +is in the cache, then instead of serializing the type as usual, the byte offset +within the file being written is encoded instead. A similar scheme is used for +`ty::Predicate`. + +## `Lazy` + +Crate metadata is initially loaded before the `TyCtxt<'tcx>` is created, so +some deserialization needs to be deferred from the initial loading of metadata. +The [`Lazy`] type wraps the (relative) offset in the crate metadata where a +`T` has been serialized. + +The `Lazy<[T]>` and `Lazy>` type provide some functionality over +`Lazy>` and `Lazy>`: + +- It's possible to encode a `Lazy<[T]>` directly from an iterator, without + first collecting into a `Vec`. +- Indexing into a `Lazy>` does not require decoding entries other + than the one being read. + +**note**: `Lazy` does not cache its value after being deserialized the first +time. Instead the query system is the main way of caching these results. + +## Specialization + +A few types, most notably `DefId`, need to have different implementations for +different `Encoder`s. This is currently handled by ad-hoc specializations: +`DefId` has a `default` implementation of `Encodable` and a specialized one +for `Encodable`. + +[arena allocated types]: memory.md +[AST]: the-parser.md +[derives]: #derive-macros +[persist incremental compilation results]: queries/incremental-compilation-in-detail.md#the-real-world-how-persistence-makes-everything-complicated +[serialize]: https://en.wikipedia.org/wiki/Serialization + +[`CrateInfo`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_codegen_ssa/struct.CrateInfo.html +[`Lazy`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_metadata/rmeta/struct.Lazy.html +[`RefDecodable`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/codec/trait.RefDecodable.html +[`rustc_metadata::rmeta::decoder::DecodeContext`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_metadata/rmeta/decoder/struct.DecodeContext.html +[`rustc_metadata::rmeta::encoder::EncodeContext`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_metadata/rmeta/encoder/struct.EncodeContext.html +[`rustc_serialize`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_serialize/index.html +[`TyDecoder`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/codec/trait.TyEncoder.html +[`TyEncoder`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/codec/trait.TyDecoder.html diff --git a/src/doc/rustc-dev-guide/src/stability.md b/src/doc/rustc-dev-guide/src/stability.md index f48c3d529d..cfb4efd891 100644 --- a/src/doc/rustc-dev-guide/src/stability.md +++ b/src/doc/rustc-dev-guide/src/stability.md @@ -1,5 +1,7 @@ # 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. @@ -42,12 +44,8 @@ prevents breaking dependencies by leveraging Cargo's lint capping. [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 -[Stabilizing Features](./stabilization_guide.md). - -Note that stable functions may use unstable things in their body. +marks an item as stabilized. Note that stable functions may use unstable things in their body. ## rustc_const_unstable @@ -62,7 +60,7 @@ there's no way to add `const` to functions in `extern` blocks for now. ## rustc_const_stable -The `#[stable(feature = "foo", "since = "1.420.69")]` attribute explicitly marks +The `#[rustc_const_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. @@ -70,17 +68,35 @@ even on an `unstable` function, if that function is called from another Furthermore this attribute is needed to mark an intrinsic as callable from `rustc_const_stable` functions. +## Stabilizing a library feature + +To stabilize a feature, follow these steps: + +0. Ask a **@T-libs** member to start an FCP on the tracking issue and wait for + the FCP to complete (with `disposition-merge`). +1. Change `#[unstable(...)]` to `#[stable(since = "version")]`. + `version` should be the *current nightly*, i.e. stable+2. You can see which version is + the current nightly [on Forge](https://forge.rust-lang.org/#current-release-versions). +2. Remove `#![feature(...)]` from any test or doc-test for this API. If the feature is used in the + compiler or tools, remove it from there as well. +3. If applicable, change `#[rustc_const_unstable(...)]` to + `#[rustc_const_stable(since = "version")]`. +4. Open a PR against `rust-lang/rust`. + - Add the appropriate labels: `@rustbot modify labels: +T-libs`. + - Link to the tracking issue and say "Closes #XXXXX". + +You can see an example of stabilizing a feature at [#75132](https://github.com/rust-lang/rust/pull/75132). ## allow_internal_unstable 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 +attribute that allows the given features to be used 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 +allow 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 @@ -128,35 +144,4 @@ default `allow`, but most of the standard library raises it to a warning with `#![warn(deprecated_in_future)]`. [`deprecated` attribute]: https://doc.rust-lang.org/reference/attributes/diagnostics.html#the-deprecated-attribute - -## -Zforce-unstable-if-unmarked - -The `-Zforce-unstable-if-unmarked` flag has a variety of purposes to help -enforce that the correct crates are marked as unstable. It was introduced -primarily to allow rustc and the standard library to link to arbitrary crates -on crates.io which do not themselves use `staged_api`. `rustc` also relies on -this flag to mark all of its crates as unstable with the `rustc_private` -feature so that each crate does not need to be carefully marked with -`unstable`. - -This flag is automatically applied to all of `rustc` and the standard library -by the bootstrap scripts. This is needed because the compiler and all of its -dependencies are shipped in the sysroot to all users. - -This flag has the following effects: - -- Marks the crate as "unstable" with the `rustc_private` feature if it is not - itself marked as stable or unstable. -- Allows these crates to access other forced-unstable crates without any need - for attributes. Normally a crate would need a `#![feature(rustc_private)]` - attribute to use other unstable crates. However, that would make it - impossible for a crate from crates.io to access its own dependencies since - that crate won't have a `feature(rustc_private)` attribute, but *everything* - is compiled with `-Zforce-unstable-if-unmarked`. - -Code which does not use `-Zforce-unstable-if-unmarked` should include the -`#![feature(rustc_private)]` crate attribute to access these force-unstable -crates. This is needed for things that link `rustc`, such as `miri`, `rls`, or -`clippy`. - [blog]: https://www.ralfj.de/blog/2018/07/19/const.html diff --git a/src/doc/rustc-dev-guide/src/stabilization_guide.md b/src/doc/rustc-dev-guide/src/stabilization_guide.md index 73edc3be5b..a6203a3c60 100644 --- a/src/doc/rustc-dev-guide/src/stabilization_guide.md +++ b/src/doc/rustc-dev-guide/src/stabilization_guide.md @@ -1,13 +1,15 @@ # Request for stabilization +**NOTE**: this page is about stabilizing language features. +For stabilizing *library* features, see [Stabilizing a library feature]. + +[Stabilizing a library feature]: ./stability.md#stabilizing-a-library-feature + Once an unstable feature has been well-tested with no outstanding concern, anyone may push for its stabilization. It involves the -following steps. +following steps: -- Documentation PRs -- Write a stabilization report -- FCP -- Stabilization PR + ## Documentation PRs @@ -91,7 +93,7 @@ should appear in the documentation. ### Updating the feature-gate listing There is a central listing of feature-gates in -[`src/librustc_feature`]. Search for the `declare_features!` +[`compiler/rustc_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]: @@ -124,7 +126,7 @@ writing, the next stable release (i.e. what is currently beta) was Next search for the feature string (in this case, `pub_restricted`) in the codebase to find where it appears. Change uses of -`#![feature(XXX)]` from the `libstd` and any rustc crates to be +`#![feature(XXX)]` from the `std` and any rustc crates to be `#![cfg_attr(bootstrap, feature(XXX))]`. This includes the feature-gate only for stage0, which is built using the current beta (this is needed because the feature is still unstable in the current beta). @@ -140,7 +142,7 @@ 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 `src/librustc_ast_passes/feature_gate.rs`. +same `compiler/rustc_ast_passes/src/feature_gate.rs`. For example, you might see code like this: ```rust,ignore @@ -175,7 +177,7 @@ if something { /* XXX */ } ``` [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 +[`compiler/rustc_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 diff --git a/src/doc/rustc-dev-guide/src/syntax-intro.md b/src/doc/rustc-dev-guide/src/syntax-intro.md index dd7e2d7359..43ef445774 100644 --- a/src/doc/rustc-dev-guide/src/syntax-intro.md +++ b/src/doc/rustc-dev-guide/src/syntax-intro.md @@ -6,3 +6,8 @@ out that doing even this involves a lot of work, including lexing, parsing, macro expansion, name resolution, conditional compilation, feature-gate checking, and validation of the AST. In this chapter, we take a look at all of these steps. + +Notably, there isn't always a clean ordering between these tasks. For example, +macro expansion relies on name resolution to resolve the names of macros and +imports. And parsing requires macro expansion, which in turn may require +parsing the output of the macro. diff --git a/src/doc/rustc-dev-guide/src/test-implementation.md b/src/doc/rustc-dev-guide/src/test-implementation.md index cffc62ceca..1a9283b597 100644 --- a/src/doc/rustc-dev-guide/src/test-implementation.md +++ b/src/doc/rustc-dev-guide/src/test-implementation.md @@ -1,4 +1,7 @@ -### The `#[test]` attribute +# The `#[test]` attribute + + + Today, rust programmers rely on a built in attribute called `#[test]`. All you have to do is mark a function as a test and include some asserts like so: @@ -32,14 +35,14 @@ How does any sort of `main` function invoke these tests if they're not visible? What exactly is `rustc --test` doing? `#[test]` is implemented as a syntactic transformation inside the compiler's -[`librustc_ast` crate][librustc_ast]. Essentially, it's a fancy macro, that +[`rustc_ast` crate][rustc_ast]. Essentially, it's a fancy macro, that rewrites the crate in 3 steps: -#### Step 1: Re-Exporting +## Step 1: Re-Exporting As mentioned earlier, tests can exist inside private modules, so we need a way of exposing them to the main function, without breaking any existing -code. To that end, `librustc_ast` will create local modules called +code. To that end, `rustc_ast` will create local modules called `__test_reexports` that recursively reexport tests. This expansion translates the above example into: @@ -77,9 +80,10 @@ hand-written one, it will not share a Symbol. This technique prevents name collision during code generation and is the foundation of Rust's macro hygiene. -#### Step 2: Harness Generation +## Step 2: Harness Generation + Now that our tests are accessible from the root of our crate, we need to do -something with them. `librustc_ast` generates a module like so: +something with them. `rustc_ast` generates a module like so: ```rust,ignore #[main] @@ -99,7 +103,8 @@ called [`test`][test] that is part of Rust core, that implements all of the runtime for testing. `test`'s interface is unstable, so the only stable way to interact with it is through the `#[test]` macro. -#### Step 3: Test Object Generation +## Step 3: Test Object Generation + If you've written tests in Rust before, you may be familiar with some of the optional attributes available on test functions. For example, a test can be annotated with `#[should_panic]` if we expect the test to cause a panic. It @@ -116,7 +121,7 @@ fn foo() { This means our tests are more than just simple functions, they have configuration information as well. `test` encodes this configuration data into a struct called [`TestDesc`][TestDesc]. For each test function in a -crate, `librustc_ast` will parse its attributes and generate a `TestDesc` +crate, `rustc_ast` will parse its attributes and generate a `TestDesc` instance. It then combines the `TestDesc` and test function into the predictably named `TestDescAndFn` struct, that `test_main_static` operates on. For a given test, the generated `TestDescAndFn` instance looks like so: @@ -137,7 +142,8 @@ self::test::TestDescAndFn{ Once we've constructed an array of these test objects, they're passed to the test runner via the harness generated in step 2. -### Inspecting the generated code +## Inspecting the generated code + On nightly rust, there's an unstable flag called `unpretty` that you can use to print out the module source after macro expansion: @@ -147,7 +153,7 @@ $ rustc my_mod.rs -Z unpretty=hir [test]: https://doc.rust-lang.org/test/index.html [TestDesc]: https://doc.rust-lang.org/test/struct.TestDesc.html -[Symbol]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/ast/struct.Ident.html -[Ident]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/ast/struct.Ident.html +[Symbol]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/symbol/struct.Symbol.html +[Ident]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_span/symbol/struct.Ident.html [eRFC]: https://github.com/rust-lang/rfcs/blob/master/text/2318-custom-test-frameworks.md -[librustc_ast]: https://github.com/rust-lang/rust/tree/master/src/librustc_ast +[rustc_ast]: https://github.com/rust-lang/rust/tree/master/compiler/rustc_ast diff --git a/src/doc/rustc-dev-guide/src/tests/adding.md b/src/doc/rustc-dev-guide/src/tests/adding.md index dadd8e2c15..944b895b52 100644 --- a/src/doc/rustc-dev-guide/src/tests/adding.md +++ b/src/doc/rustc-dev-guide/src/tests/adding.md @@ -1,5 +1,7 @@ # Adding new tests + + **In general, we expect every PR that fixes a bug in rustc to come accompanied by a regression test of some kind.** This test should fail in master but pass after the PR. These tests are really useful for @@ -29,15 +31,25 @@ rough heuristics: - need to run gdb or lldb? use the `debuginfo` test suite - need to inspect LLVM IR or MIR IR? use the `codegen` or `mir-opt` test suites - - need to run rustdoc? Prefer a `rustdoc` test + - need to run rustdoc? Prefer a `rustdoc` or `rustdoc-ui` test. + Occasionally you'll need `rustdoc-js` as well. - need to inspect the resulting binary in some way? Then use `run-make` -- For most other things, [a `ui` (or `ui-fulldeps`) test](#ui) is to be - preferred: - - `ui` tests subsume both run-pass, compile-fail, and parse-fail tests +- Library tests should go in `library/${crate}/tests` (where `${crate}` is + usually `core`, `alloc`, or `std`). Library tests include: + - tests that an API behaves properly, including accepting various types or + having some runtime behavior + - tests where any compiler warnings are not relevant to the test + - tests that a use of an API gives a compile error, where the exact error + message is not relevant to the test. These should have an + [error number] (`E0XXX`) in the code block to make sure it's the correct error. +- For most other things, [a `ui` (or `ui-fulldeps`) test](#ui) is to be preferred: + - [`ui`](#ui) tests subsume both `run-pass`, `compile-fail`, and `parse-fail` tests - in the case of warnings or errors, `ui` tests capture the full output, which makes it easier to review but also helps prevent "hidden" regressions in the output +[error number]: https://doc.rust-lang.org/rustdoc/unstable-features.html#error-numbers-for-compile-fail-doctests + ## Naming your test We have not traditionally had a lot of structure in the names of @@ -56,6 +68,8 @@ directory that helps identify what piece of code is being tested here If you've tried and cannot find a more relevant place, the test may be added to `src/test/ui/issues/`. Still, **do include the issue number somewhere**. +But please avoid putting your test there as possible since that +directory has too many tests and it causes poor semantic organization. When writing a new feature, **create a subdirectory to store your tests**. For example, if you are implementing RFC 1234 ("Widgets"), @@ -99,7 +113,7 @@ to specify a custom flag to give to rustc when the test is compiled: ```rust,ignore // Test the behavior of `0 - 1` when overflow checks are disabled. -// compile-flags: -Coverflow-checks=off +// compile-flags: -C overflow-checks=off fn main() { let x = 0 - 1; @@ -134,6 +148,11 @@ Some examples of `X` in `ignore-X`: `musl`. * Pointer width: `32bit`, `64bit`. * Stage: `stage0`, `stage1`, `stage2`. +* When cross compiling: `cross-compile` +* When remote testing is used: `remote` +* When debug-assertions are enabled: `debug` +* When particular debuggers are being tested: `cdb`, `gdb`, `lldb` +* Specific compare modes: `compare-mode-nll`, `compare-mode-polonius` ### Other Header Commands @@ -174,6 +193,8 @@ source. supposed to error out. * `compile-flags` passes extra command-line args to the compiler, e.g. `compile-flags -g` which forces debuginfo to be enabled. +* `edition` controls the edition the test should be compiled with + (defaults to 2015). Example usage: `// edition:2018`. * `should-fail` indicates that the test should fail; used for "meta testing", where we test the compiletest program itself to check that it will generate errors in appropriate scenarios. This header is @@ -183,6 +204,16 @@ source. errors when usage of a gated feature is attempted without the proper `#![feature(X)]` tag. Each unstable lang feature is required to have a gate test. +* `needs-profiler-support` - a profiler runtime is required, i.e., + `profiler = true` in rustc's `config.toml`. +* `needs-sanitizer-support` - a sanitizer runtime is required, i.e., + `sanitizers = true` in rustc's `config.toml`. +* `needs-sanitizer-{address,leak,memory,thread}` - indicates that test + requires a target with a support for AddressSanitizer, LeakSanitizer, + MemorySanitizer or ThreadSanitizer respectively. +* `error-pattern` checks the diagnostics just like the `ERROR` annotation + without specifying error line. This is useful when the error doesn't give + any span. [`header.rs`]: https://github.com/rust-lang/rust/tree/master/src/tools/compiletest/src/header.rs [bless]: ./running.md#editing-and-updating-the-reference-files @@ -193,32 +224,126 @@ source. Error annotations specify the errors that the compiler is expected to emit. They are "attached" to the line in source where the error is -located. +located. Error annotations are considered during tidy lints of line +length and should be formatted according to tidy requirements. You may +use an error message prefix sub-string if necessary to meet line length +requirements. Make sure that the text is long enough for the error +message to be self-documenting. + +The error annotation definition and source line definition association +is defined with the following set of idioms: * `~`: Associates the following error level and message with the current line * `~|`: Associates the following error level and message with the same line as the previous comment * `~^`: Associates the following error level and message with the - previous line. Each caret (`^`) that you add adds a line to this, so - `~^^^^^^^` is seven lines up. + previous error annotation line. Each caret (`^`) that you add adds + a line to this, so `~^^^` is three lines above the error annotation + line. + +### Error annotation examples + +Here are examples of error annotations on different lines of UI test +source. + +#### Positioned on error line + +Use the `//~ ERROR` idiom: + +```rust,ignore +fn main() { + let x = (1, 2, 3); + match x { + (_a, _x @ ..) => {} //~ ERROR `_x @` is not allowed in a tuple + _ => {} + } +} +``` + +#### Positioned below error line + +Use the `//~^` idiom with number of carets in the string to indicate the +number of lines above. In the example below, the error line is four +lines above the error annotation line so four carets are included in +the annotation. + +```rust,ignore +fn main() { + let x = (1, 2, 3); + match x { + (_a, _x @ ..) => {} // <- the error is on this line + _ => {} + } +} +//~^^^^ ERROR `_x @` is not allowed in a tuple +``` + +#### Use same error line as defined on error annotation line above + +Use the `//~|` idiom to define the same error line as +the error annotation line above: + +```rust,ignore +struct Binder(i32, i32, i32); + +fn main() { + let x = Binder(1, 2, 3); + match x { + Binder(_a, _x @ ..) => {} // <- the error is on this line + _ => {} + } +} +//~^^^^ ERROR `_x @` is not allowed in a tuple struct +//~| ERROR this pattern has 1 field, but the corresponding tuple struct has 3 fields [E0023] +``` + +#### When error line cannot be specified + +Let's think about this test: + +```rust,ignore +fn main() { + let a: *const [_] = &[1, 2, 3]; + unsafe { + let _b = (*a)[3]; + } +} +``` + +We want to ensure this shows "index out of bounds" but we cannot use the `ERROR` annotation +since the error doesn't have any span. Then it's time to use the `error-pattern`: + +```rust,ignore +// error-pattern: index out of bounds +fn main() { + let a: *const [_] = &[1, 2, 3]; + unsafe { + let _b = (*a)[3]; + } +} +``` + +But for strict testing, try to use the `ERROR` annotation as much as possible. + +#### Error levels The error levels that you can have are: 1. `ERROR` 2. `WARNING` 3. `NOTE` -4. `HELP` and `SUGGESTION`* +4. `HELP` and `SUGGESTION`[^sugg-placement] -\* **Note**: `SUGGESTION` must follow immediately after `HELP`. +[^sugg-placement]: **Note**: `SUGGESTION` must follow immediately after `HELP`. ## Revisions -Certain classes of tests support "revisions" (as of the time of this -writing, this includes compile-fail, run-fail, and -incremental, though incremental tests are somewhat -different). Revisions allow a single test file to be used for multiple -tests. This is done by adding a special header at the top of the file: +Certain classes of tests support "revisions" (as of +February 2021, this includes compile-fail, run-fail, and incremental, though +incremental tests are somewhat different). Revisions allow a single test file to +be used for multiple tests. This is done by adding a special header at the top +of the file: ```rust // revisions: foo bar baz @@ -270,6 +395,21 @@ and so forth. [hw-main]: https://github.com/rust-lang/rust/blob/master/src/test/ui/hello_world/main.rs [hw]: https://github.com/rust-lang/rust/blob/master/src/test/ui/hello_world/ +We now have a ton of UI tests and some directories have too many entries. +This is a problem because it isn't editor/IDE friendly and GitHub UI won't +show more than 1000 entries. To resolve it and organize semantic structure, +we have a tidy check to ensure the number of entries is less than 1000. +However, since `src/test/ui` (UI test root directory) and +`src/test/ui/issues` directories have more than 1000 entries, +we set a different limit for each directories. So, please +avoid putting a new test there and try to find a more relevant place. +For example, if your test is related to closures, you should put it in +`src/test/ui/closures`. If you're not sure where is the best place, +it's still okay to add to `src/test/ui/issues/`. When you reach the limit, +you could increase it by tweaking [here][ui test tidy]. + +[ui test tidy]: https://github.com/rust-lang/rust/blob/master/src/tools/tidy/src/ui_tests.rs + ### Tests that do not result in compile errors By default, a UI test is expected **not to compile** (in which case, @@ -287,12 +427,43 @@ you can even run the resulting program. Just add one of the following ### Normalization -The normalization applied is aimed at eliminating output difference -between platforms, mainly about filenames: - -- the test directory is replaced with `$DIR` -- all backslashes (`\`) are converted to forward slashes (`/`) (for Windows) -- all CR LF newlines are converted to LF +The compiler output is normalized to eliminate output difference between +platforms, mainly about filenames. + +The following strings replace their corresponding values: + +- `$DIR`: The directory where the test is defined. + - Example: `/path/to/rust/src/test/ui/error-codes` +- `$SRC_DIR`: The root source directory. + - Example: `/path/to/rust/src` +- `$TEST_BUILD_DIR`: The base directory where the test's output goes. + - Example: `/path/to/rust/build/x86_64-unknown-linux-gnu/test/ui` + +Additionally, the following changes are made: + +- Line and column numbers for paths in `$SRC_DIR` are replaced with `LL:CC`. + For example, `/path/to/rust/library/core/src/clone.rs:122:8` is replaced with + `$SRC_DIR/core/src/clone.rs:LL:COL`. + + Note: The line and column numbers for `-->` lines pointing to the test are + *not* normalized, and left as-is. This ensures that the compiler continues + to point to the correct location, and keeps the stderr files readable. + Ideally all line/column information would be retained, but small changes to + the source causes large diffs, and more frequent merge conflicts and test + errors. See also `-Z ui-testing` below which applies additional line number + normalization. +- `\t` is replaced with an actual tab character. +- Error line annotations like `// ~ERROR some message` are removed. +- Backslashes (`\`) are converted to forward slashes (`/`) within paths (using + a heuristic). This helps normalize differences with Windows-style paths. +- CRLF newlines are converted to LF. + +Additionally, the compiler is run with the `-Z ui-testing` flag which causes +the compiler itself to apply some changes to the diagnostic output to make it +more suitable for UI testing. For example, it will anonymize line numbers in +the output (line numbers prefixing each source line are replaced with `LL`). +In extremely rare situations, this mode can be disabled with the header +command `// compile-flags: -Z ui-testing=no`. Sometimes these built-in normalizations are not enough. In such cases, you may provide custom normalization rules using the header commands, e.g. @@ -326,6 +497,6 @@ concrete usage example. [`main.stderr`]: https://github.com/rust-lang/rust/blob/master/src/test/ui/transmute/main.stderr Besides `normalize-stderr-32bit` and `-64bit`, one may use any target -information or stage supported by `ignore-X` here as well (e.g. +information or stage supported by [`ignore-X`](#ignoring-tests) here as well (e.g. `normalize-stderr-windows` or simply `normalize-stderr-test` for unconditional replacement). diff --git a/src/doc/rustc-dev-guide/src/tests/intro.md b/src/doc/rustc-dev-guide/src/tests/intro.md index a81255decf..6419133455 100644 --- a/src/doc/rustc-dev-guide/src/tests/intro.md +++ b/src/doc/rustc-dev-guide/src/tests/intro.md @@ -1,5 +1,7 @@ # The compiler testing framework + + The Rust project runs a wide variety of different tests, orchestrated by the build system (`x.py test`). The main test harness for testing the compiler itself is a tool called compiletest (located in the @@ -27,15 +29,15 @@ details. - [`ui`](./adding.html#ui) – tests that check the exact stdout/stderr from compilation and/or running the test - `run-pass-valgrind` – tests that ought to run with valgrind -- `run-fail` – tests that are expected to compile but then panic - during execution -- `compile-fail` – tests that are expected to fail compilation. -- `parse-fail` – tests that are expected to fail to parse - `pretty` – tests targeting the Rust "pretty printer", which generates valid Rust code from the AST - `debuginfo` – tests that run in gdb or lldb and query the debug info - `codegen` – tests that compile and then test the generated LLVM code to make sure that the optimizations we want are taking effect. + See [LLVM docs](https://llvm.org/docs/CommandGuide/FileCheck.html) for how to + write such tests. +- `codegen-units` – tests for the [monomorphization](../backend/monomorph.md) + collector and CGU partitioning - `assembly` – similar to `codegen` tests, but verifies assembly output to make sure LLVM target backend can handle provided code. - `mir-opt` – tests that check parts of the generated MIR to make @@ -48,8 +50,11 @@ details. ultimate in flexibility but quite annoying to write. - `rustdoc` – tests for rustdoc, making sure that the generated files contain the expected documentation. +- `rustfix` – tests for applying [diagnostic + suggestions](../diagnostics.md#suggestions) with the + [`rustfix`](https://github.com/rust-lang/rustfix/) crate - `*-fulldeps` – same as above, but indicates that the test depends - on things other than `libstd` (and hence those things must be built) + on things other than `std` (and hence those things must be built) ## Other Tests @@ -68,7 +73,7 @@ including: is correct. The formatting check is also automatically run by the Tidy tool mentioned above. - Example: `./x.py fmt --check` checks formatting an exits with an error if + Example: `./x.py fmt --check` checks formatting and exits with an error if formatting is needed. Example: `./x.py fmt` runs rustfmt on the codebase. @@ -80,7 +85,7 @@ including: include typical Rust `#[test]` unittests. Under the hood, `x.py` will run `cargo test` on each package to run all the tests. - Example: `./x.py test src/libstd` + Example: `./x.py test library/std` - **Doc tests** – Example code embedded within Rust documentation is executed via `rustdoc --test`. Examples: @@ -88,7 +93,7 @@ including: `./x.py test src/doc` – Runs `rustdoc --test` for all documentation in `src/doc`. - `./x.py test --doc src/libstd` – Runs `rustdoc --test` on the standard + `./x.py test --doc library/std` – Runs `rustdoc --test` on the standard library. - **Link checker** – A small tool for verifying `href` links within @@ -114,48 +119,159 @@ including: ## Testing infrastructure -When a Pull Request is opened on Github, [Azure Pipelines] will automatically +When a Pull Request is opened on Github, [GitHub Actions] will automatically launch a build that will run all tests on some configurations -(x86_64-gnu-llvm-6.0 linux. x86_64-gnu-tools linux, mingw-check linux). In +(x86_64-gnu-llvm-8 linux. x86_64-gnu-tools linux, mingw-check linux). In essence, it runs `./x.py test` after building for each of them. -The integration bot [bors] is used for coordinating merges to the master -branch. When a PR is approved, it goes into a [queue] where merges are tested -one at a time on a wide set of platforms using Azure Pipelines (currently over -50 different configurations). Most platforms only run the build steps, some run -a restricted set of tests, only a subset run the full suite of tests (see -Rust's [platform tiers]). +The integration bot [bors] is used for coordinating merges to the master branch. +When a PR is approved, it goes into a [queue] where merges are tested one at a +time on a wide set of platforms using GitHub Actions (as of January 2021, over 50 different configurations). Due to the limit on the +number of parallel jobs, we run CI under the [rust-lang-ci] organization except +for PRs. Most platforms only run the build steps, some run a restricted set of +tests, only a subset run the full suite of tests (see Rust's [platform tiers]). -[Azure Pipelines]: https://dev.azure.com/rust-lang/rust/ +[GitHub Actions]: https://github.com/rust-lang/rust/actions +[rust-lang-ci]: https://github.com/rust-lang-ci/rust/actions [bors]: https://github.com/servo/homu -[queue]: https://buildbot2.rust-lang.org/homu/queue/rust +[queue]: https://bors.rust-lang.org/queue/rust [platform tiers]: https://forge.rust-lang.org/release/platform-support.html#rust-platform-support ## Testing with Docker images The Rust tree includes [Docker] image definitions for the platforms used on -Azure Pipelines in [src/ci/docker]. The script [src/ci/docker/run.sh] is used to build +GitHub Actions in [`src/ci/docker`]. The script [`src/ci/docker/run.sh`] is used to build the Docker image, run it, build Rust within the image, and run the tests. -> TODO: What is a typical workflow for testing/debugging on a platform that -> you don't have easy access to? Do people build Docker images and enter them -> to test things out? +You can run these images on your local development machine. This can be +helpful to test environments different from your local system. First you will +need to install Docker on a Linux, Windows, or macOS system (typically Linux +will be much faster than Windows or macOS because the later use virtual +machines to emulate a Linux environment). To enter interactive mode which will +start a bash shell in the container, run `src/ci/docker/run.sh --dev ` +where `` is one of the directory names in `src/ci/docker` (for example +`x86_64-gnu` is a fairly standard Ubuntu environment). + +The docker script will mount your local rust source tree in read-only mode, +and an `obj` directory in read-write mode. All of the compiler artifacts will +be stored in the `obj` directory. The shell will start out in the `obj` +directory. From there, you can run `../src/ci/run.sh` which will run the build +as defined by the image. + +Alternatively, you can run individual commands to do specific tasks. For +example, you can run `python3 ../x.py test src/test/ui` to just run UI tests. +Note that there is some configuration in the [`src/ci/run.sh`] script that you +may need to recreate. Particularly, set `submodules = false` in your +`config.toml` so that it doesn't attempt to modify the read-only directory. + +Some additional notes about using the Docker images: + +- Some of the std tests require IPv6 support. Docker on Linux seems to have it + disabled by default. Run the commands in [`enable-docker-ipv6.sh`] to enable + IPv6 before creating the container. This only needs to be done once. +- The container will be deleted automatically when you exit the shell, however + the build artifacts persist in the `obj` directory. If you are switching + between different Docker images, the artifacts from previous environments + stored in the `obj` directory may confuse the build system. Sometimes you + will need to delete parts or all of the `obj` directory before building + inside the container. +- The container is bare-bones, with only a minimal set of packages. You may + want to install some things like `apt install less vim`. +- You can open multiple shells in the container. First you need the container + name (a short hash), which is displayed in the shell prompt, or you can run + `docker container ls` outside of the container to list the available + containers. With the container name, run `docker exec -it + /bin/bash` where `` is the container name like `4ba195e95cef`. [Docker]: https://www.docker.com/ -[src/ci/docker]: https://github.com/rust-lang/rust/tree/master/src/ci/docker -[src/ci/docker/run.sh]: https://github.com/rust-lang/rust/blob/master/src/ci/docker/run.sh +[`src/ci/docker`]: https://github.com/rust-lang/rust/tree/master/src/ci/docker +[`src/ci/docker/run.sh`]: https://github.com/rust-lang/rust/blob/master/src/ci/docker/run.sh +[`src/ci/run.sh`]: https://github.com/rust-lang/rust/blob/master/src/ci/run.sh +[`enable-docker-ipv6.sh`]: https://github.com/rust-lang/rust/blob/master/src/ci/scripts/enable-docker-ipv6.sh + +## Running tests on a remote machine + +Tests may be run on a remote machine (e.g. to test builds for a different +architecture). This is done using `remote-test-client` on the build machine +to send test programs to `remote-test-server` running on the remote machine. +`remote-test-server` executes the test programs and sends the results back to +the build machine. `remote-test-server` provides *unauthenticated remote code +execution* so be careful where it is used. + +To do this, first build `remote-test-server` for the remote +machine, e.g. for RISC-V +```sh +./x.py build src/tools/remote-test-server --target riscv64gc-unknown-linux-gnu +``` + +The binary will be created at +`./build/$HOST_ARCH/stage2-tools/$TARGET_ARCH/release/remote-test-server`. Copy +this over to the remote machine. + +On the remote machine, run the `remote-test-server` with the `remote` argument +(and optionally `-v` for verbose output). Output should look like this: +```sh +$ ./remote-test-server -v remote +starting test server +listening on 0.0.0.0:12345! +``` + +You can test if the `remote-test-server` is working by connecting to it and +sending `ping\n`. It should reply `pong`: +```sh +$ nc $REMOTE_IP 12345 +ping +pong +``` + +To run tests using the remote runner, set the `TEST_DEVICE_ADDR` environment +variable then use `x.py` as usual. For example, to run `ui` tests for a RISC-V +machine with the IP address `1.2.3.4` use +```sh +export TEST_DEVICE_ADDR="1.2.3.4:12345" +./x.py test src/test/ui --target riscv64gc-unknown-linux-gnu +``` + +If `remote-test-server` was run with the verbose flag, output on the test machine +may look something like +``` +[...] +run "/tmp/work/test1007/a" +run "/tmp/work/test1008/a" +run "/tmp/work/test1009/a" +run "/tmp/work/test1010/a" +run "/tmp/work/test1011/a" +run "/tmp/work/test1012/a" +run "/tmp/work/test1013/a" +run "/tmp/work/test1014/a" +run "/tmp/work/test1015/a" +run "/tmp/work/test1016/a" +run "/tmp/work/test1017/a" +run "/tmp/work/test1018/a" +[...] +``` + +Tests are built on the machine running `x.py` not on the remote machine. Tests +which fail to build unexpectedly (or `ui` tests producing incorrect build +output) may fail without ever running on the remote machine. ## Testing on emulators Some platforms are tested via an emulator for architectures that aren't -readily available. There is a set of tools for orchestrating running the -tests within the emulator. Platforms such as `arm-android` and +readily available. For architectures where the standard library is well +supported and the host operating system supports TCP/IP networking, see the +above instructions for testing on a remote machine (in this case the +remote machine is emulated). + +There is also a set of tools for orchestrating running the +tests within the emulator. Platforms such as `arm-android` and `arm-unknown-linux-gnueabihf` are set up to automatically run the tests under -emulation on Travis. The following will take a look at how a target's tests +emulation on GitHub Actions. The following will take a look at how a target's tests are run under emulation. The Docker image for [armhf-gnu] includes [QEMU] to emulate the ARM CPU -architecture. Included in the Rust tree are the tools [remote-test-client] +architecture. Included in the Rust tree are the tools [remote-test-client] and [remote-test-server] which are programs for sending test programs and libraries to the emulator, and running the tests within the emulator, and reading the results. The Docker image is set up to launch @@ -163,19 +279,12 @@ reading the results. The Docker image is set up to launch communicate with the server to coordinate running tests (see [src/bootstrap/test.rs]). -> TODO: What are the steps for manually running tests within an emulator? -> `./src/ci/docker/run.sh armhf-gnu` will do everything, but takes hours to -> run and doesn't offer much help with interacting within the emulator. -> -> Is there any support for emulating other (non-Android) platforms, such as -> running on an iOS emulator? -> -> Is there anything else interesting that can be said here about running tests -> remotely on real hardware? +> TODO: +> Is there any support for using an iOS emulator? > > It's also unclear to me how the wasm or asm.js tests are run. -[armhf-gnu]: https://github.com/rust-lang/rust/tree/master/src/ci/docker/armhf-gnu +[armhf-gnu]: https://github.com/rust-lang/rust/tree/master/src/ci/docker/host-x86_64/armhf-gnu/Dockerfile [QEMU]: https://www.qemu.org/ [remote-test-client]: https://github.com/rust-lang/rust/tree/master/src/tools/remote-test-client [remote-test-server]: https://github.com/rust-lang/rust/tree/master/src/tools/remote-test-server diff --git a/src/doc/rustc-dev-guide/src/tests/running.md b/src/doc/rustc-dev-guide/src/tests/running.md index 4126341aad..874ef82746 100644 --- a/src/doc/rustc-dev-guide/src/tests/running.md +++ b/src/doc/rustc-dev-guide/src/tests/running.md @@ -1,5 +1,7 @@ # Running tests + + You can run the tests using `x.py`. The most basic command – which you will almost never want to use! – is as follows: @@ -7,11 +9,11 @@ you will almost never want to use! – is as follows: ./x.py test ``` -This will build the full stage 2 compiler and then run the whole test +This will build the stage 1 compiler and then run the whole test suite. You probably don't want to do this very often, because it takes -a very long time, and anyway bors / travis will do it for you. (Often, -I will run this command in the background after opening a PR that I -think is done, but rarely otherwise. -nmatsakis) +a very long time, and anyway bors / GitHub Actions will do it for you. +(Often, I will run this command in the background after opening a PR that +I think is done, but rarely otherwise. -nmatsakis) The test results are cached and previously successful tests are `ignored` during testing. The stdout/stderr contents as well as a @@ -29,35 +31,34 @@ If you are building gdb from source, you will need to configure with ## Running a subset of the test suites When working on a specific PR, you will usually want to run a smaller -set of tests, and with a stage 1 build. For example, a good "smoke -test" that can be used after modifying rustc to see if things are -generally working correctly would be the following: +set of tests. For example, a good "smoke test" that can be used after +modifying rustc to see if things are generally working correctly would be the +following: ```bash -./x.py test --stage 1 src/test/{ui,compile-fail} +./x.py test src/test/ui ``` -This will run the `ui` and `compile-fail` test suites, -and only with the stage 1 build. Of course, the choice of test suites -is somewhat arbitrary, and may not suit the task you are doing. For -example, if you are hacking on debuginfo, you may be better off with -the debuginfo test suite: +This will run the `ui` test suite. Of course, the choice +of test suites is somewhat arbitrary, and may not suit the task you are +doing. For example, if you are hacking on debuginfo, you may be better off +with the debuginfo test suite: ```bash -./x.py test --stage 1 src/test/debuginfo +./x.py test src/test/debuginfo ``` If you only need to test a specific subdirectory of tests for any given test suite, you can pass that directory to `x.py test`: ```bash -./x.py test --stage 1 src/test/ui/const-generics +./x.py test src/test/ui/const-generics ``` Likewise, you can test a single file by passing its path: ```bash -./x.py test --stage 1 src/test/ui/const-generics/const-test.rs +./x.py test src/test/ui/const-generics/const-test.rs ``` ### Run only the tidy script @@ -69,19 +70,19 @@ Likewise, you can test a single file by passing its path: ### Run tests on the standard library ```bash -./x.py test src/libstd +./x.py test --stage 0 library/std ``` ### Run the tidy script and tests on the standard library ```bash -./x.py test tidy src/libstd +./x.py test --stage 0 tidy library/std ``` ### Run tests on the standard library using a stage 1 compiler ```bash -> ./x.py test src/libstd --stage 1 +./x.py test library/std ``` By listing which test suites you want to run you avoid having to run @@ -99,7 +100,7 @@ you may pass the full file path to achieve this, or alternatively one may invoke `x.py` with the `--test-args` option: ```bash -./x.py test --stage 1 src/test/ui --test-args issue-1234 +./x.py test src/test/ui --test-args issue-1234 ``` Under the hood, the test runner invokes the standard rust test runner @@ -114,7 +115,7 @@ making a new test, you can pass `--bless` to the test subcommand. E.g. if some tests in `src/test/ui` are failing, you can run ```text -./x.py test --stage 1 src/test/ui --bless +./x.py test src/test/ui --bless ``` to automatically adjust the `.stderr`, `.stdout` or `.fixed` files of @@ -130,7 +131,7 @@ exists in the test file. For example, you can run all the tests in `src/test/ui` as `check-pass`: ```bash -./x.py test --stage 1 src/test/ui --pass check +./x.py test src/test/ui --pass check ``` By passing `--pass $mode`, you can reduce the testing time. For each @@ -144,14 +145,14 @@ You can further enable the `--incremental` flag to save additional time in subsequent rebuilds: ```bash -./x.py test --stage 1 src/test/ui --incremental --test-args issue-1234 +./x.py test src/test/ui --incremental --test-args issue-1234 ``` If you don't want to include the flag with every command, you can -enable it in the `config.toml`, too: +enable it in the `config.toml`: ```toml -# Whether to always use incremental compilation when building rustc +[rust] incremental = true ``` @@ -159,6 +160,21 @@ Note that incremental compilation will use more disk space than usual. If disk space is a concern for you, you might want to check the size of the `build` directory from time to time. +## Running tests with different "compare modes" + +UI tests may have different output depending on certain "modes" that +the compiler is in. For example, when in "non-lexical lifetimes" (NLL) +mode a test `foo.rs` will first look for expected output in +`foo.nll.stderr`, falling back to the usual `foo.stderr` if not found. +To run the UI test suite in NLL mode, one would use the following: + +```bash +./x.py test src/test/ui --compare-mode=nll +``` + +Other examples of compare-modes are "noopt", "migrate", and +[revisions](./adding.html#revisions). + ## Running tests manually Sometimes it's easier and faster to just run the test by hand. Most tests are diff --git a/src/doc/rustc-dev-guide/src/the-parser.md b/src/doc/rustc-dev-guide/src/the-parser.md index c84ac4ea2e..ff43220c14 100644 --- a/src/doc/rustc-dev-guide/src/the-parser.md +++ b/src/doc/rustc-dev-guide/src/the-parser.md @@ -1,16 +1,17 @@ # Lexing and Parsing -> The parser and lexer are currently undergoing a lot of refactoring, so parts -> of this chapter may be out of date. +As of January 2021, the lexer and parser are undergoing +refactoring to allow extracting them into libraries. The very first thing the compiler does is take the program (in Unicode characters) and turn it into something the compiler can work with more conveniently than strings. This happens in two stages: Lexing and Parsing. -Lexing takes strings and turns them into streams of tokens. For example, +Lexing takes strings and turns them into streams of [tokens]. For example, `a.b + c` would be turned into the tokens `a`, `.`, `b`, `+`, and `c`. -The lexer lives in [`librustc_lexer`][lexer]. +The lexer lives in [`rustc_lexer`][lexer]. +[tokens]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/token/index.html [lexer]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_lexer/index.html Parsing then takes streams of tokens and turns them into a structured @@ -18,18 +19,18 @@ form which is easier for the compiler to work with, usually called an [*Abstract Syntax Tree*][ast] (AST). An AST mirrors the structure of a Rust program in memory, using a `Span` to link a particular AST node back to its source text. -The AST is defined in [`librustc_ast`][librustc_ast], along with some definitions for +The AST is defined in [`rustc_ast`][rustc_ast], along with some definitions for tokens and token streams, data structures/traits for mutating ASTs, and shared definitions for other AST-related parts of the compiler (like the lexer and macro-expansion). -The parser is defined in [`librustc_parse`][librustc_parse], along with a +The parser is defined in [`rustc_parse`][rustc_parse], along with a high-level interface to the lexer and some validation routines that run after macro expansion. In particular, the [`rustc_parse::parser`][parser] contains the parser implementation. -The main entrypoint to the parser is via the various `parse_*` functions in the -[parser][parser]. They let you do things like turn a [`SourceFile`][sourcefile] +The main entrypoint to the parser is via the various `parse_*` functions and others in the +[parser crate][parser_lib]. They let you do things like turn a [`SourceFile`][sourcefile] (e.g. the source in a single file) into a token stream, create a parser from the token stream, and then execute the parser to get a `Crate` (the root AST node). @@ -38,6 +39,11 @@ To minimise the amount of copying that is done, both the `StringReader` and `Parser` have lifetimes which bind them to the parent `ParseSess`. This contains all the information needed while parsing, as well as the `SourceMap` itself. +Note that while parsing, we may encounter macro definitions or invocations. We +set these aside to be expanded (see [this chapter](./macro-expansion.md)). +Expansion may itself require parsing the output of the macro, which may reveal +more macros to be expanded, and so on. + ## More on Lexical Analysis Code for lexical analysis is split between two crates: @@ -46,16 +52,17 @@ Code for lexical analysis is split between two crates: constituting tokens. Although it is popular to implement lexers as generated finite state machines, the lexer in `rustc_lexer` is hand-written. -- [`StringReader`] from [`librustc_ast`][librustc_ast] integrates `rustc_lexer` with `rustc` +- [`StringReader`] from [`rustc_ast`][rustc_ast] integrates `rustc_lexer` with `rustc` specific data structures. Specifically, it adds `Span` information to tokens returned by `rustc_lexer` and interns identifiers. -[librustc_ast]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/index.html +[rustc_ast]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/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/rustc_span/source_map/struct.SourceMap.html [ast module]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_ast/ast/index.html -[librustc_parse]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/index.html +[rustc_parse]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/index.html +[parser_lib]: 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/rustc_ast/parse/parser/struct.Parser.html [`StringReader`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_parse/lexer/struct.StringReader.html diff --git a/src/doc/rustc-dev-guide/src/thir.md b/src/doc/rustc-dev-guide/src/thir.md new file mode 100644 index 0000000000..b023eb2e2a --- /dev/null +++ b/src/doc/rustc-dev-guide/src/thir.md @@ -0,0 +1,44 @@ +# The THIR + + + +The THIR ("Typed High-Level Intermediate Representation"), previously called HAIR for +"High-Level Abstract IR", is another IR used by rustc that is generated after +[type checking]. It is (as of March 2021) only used for +[MIR construction] and [exhaustiveness checking], but +[it may also soon be used for unsafety checking][thir-unsafeck] as a replacement +for the current MIR unsafety checker. + +[type checking]: ./type-checking.md +[MIR construction]: ./mir/construction.md +[exhaustiveness checking]: ./pat-exhaustive-checking.md +[thir-unsafeck]: https://github.com/rust-lang/compiler-team/issues/402 + +As the name might suggest, the THIR is a lowered version of the [HIR] where all +the types have been filled in, which is possible after type checking has completed. +But it has some other interesting features that distinguish it from the HIR: + +- Like the MIR, the THIR only represents bodies, i.e. "executable code"; this includes + function bodies, but also `const` initializers, for example. Consequently, the THIR + has no representation for items like `struct`s or `trait`s. + +- Each body of THIR is only stored temporarily and is dropped as soon as it's no longer + needed, as opposed to being stored until the end of the compilation process (which + is what is done with the HIR). + +- Besides making the types of all nodes available, the THIR also has additional + desugaring compared to the HIR. For example, automatic references and dereferences + are made explicit, and method calls and overloaded operators are converted into + plain function calls. Destruction scopes are also made explicit. + +[HIR]: ./hir.md + +The THIR lives in [`rustc_mir_build::thir`][thir-docs]. To construct a [`thir::Expr`], +you can use the [`build_thir`] function, passing in the memory arena where the THIR +will be allocated. Dropping this arena will result in the THIR being destroyed, +which is useful to keep peak memory in check. Having a THIR representation of +all bodies of a crate in memory at the same time would be very heavy. + +[thir-docs]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/thir/index.html +[`thir::Expr`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/thir/struct.Expr.html +[`build_thir`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_mir_build/thir/fn.build_thir.html diff --git a/src/doc/rustc-dev-guide/src/traits/associated-types.md b/src/doc/rustc-dev-guide/src/traits/associated-types.md deleted file mode 100644 index 41ce5ac9e8..0000000000 --- a/src/doc/rustc-dev-guide/src/traits/associated-types.md +++ /dev/null @@ -1,168 +0,0 @@ -# Equality and associated types - -This section covers how the trait system handles equality between -associated types. The full system consists of several moving parts, -which we will introduce one by one: - -- Projection and the `Normalize` predicate -- Placeholder associated type projections -- The `ProjectionEq` predicate -- Integration with unification - -## Associated type projection and normalization - -When a trait defines an associated type (e.g., -[the `Item` type in the `IntoIterator` trait][intoiter-item]), that -type can be referenced by the user using an **associated type -projection** like ` as IntoIterator>::Item`. - -> Often, people will use the shorthand syntax `T::Item`. Presently, that -> syntax is expanded during ["type collection"](../type-checking.html) into the -> explicit form, though that is something we may want to change in the future. - -[intoiter-item]: https://doc.rust-lang.org/nightly/core/iter/trait.IntoIterator.html#associatedtype.Item - - - -In some cases, associated type projections can be **normalized** – -that is, simplified – based on the types given in an impl. So, to -continue with our example, the impl of `IntoIterator` for `Option` -declares (among other things) that `Item = T`: - -```rust,ignore -impl IntoIterator for Option { - type Item = T; - ... -} -``` - -This means we can normalize the projection ` as -IntoIterator>::Item` to just `u32`. - -In this case, the projection was a "monomorphic" one – that is, it -did not have any type parameters. Monomorphic projections are special -because they can **always** be fully normalized. - -Often, we can normalize other associated type projections as well. For -example, ` as IntoIterator>::Item`, where `?T` is an inference -variable, can be normalized to just `?T`. - -In our logic, normalization is defined by a predicate -`Normalize`. The `Normalize` clauses arise only from -impls. For example, the `impl` of `IntoIterator` for `Option` that -we saw above would be lowered to a program clause like so: - -```text -forall { - Normalize( as IntoIterator>::Item -> T) :- - Implemented(Option: IntoIterator) -} -``` - -where in this case, the one `Implemented` condition is always true. - -> Since we do not permit quantification over traits, this is really more like -> a family of program clauses, one for each associated type. - -We could apply that rule to normalize either of the examples that -we've seen so far. - -## Placeholder associated types - -Sometimes however we want to work with associated types that cannot be -normalized. For example, consider this function: - -```rust,ignore -fn foo(...) { ... } -``` - -In this context, how would we normalize the type `T::Item`? - -Without knowing what `T` is, we can't really do so. To represent this case, -we introduce a type called a **placeholder associated type projection**. This -is written like so: `(IntoIterator::Item)`. - -You may note that it looks a lot like a regular type (e.g., `Option`), -except that the "name" of the type is `(IntoIterator::Item)`. This is not an -accident: placeholder associated type projections work just like ordinary -types like `Vec` when it comes to unification. That is, they are only -considered equal if (a) they are both references to the same associated type, -like `IntoIterator::Item` and (b) their type arguments are equal. - -Placeholder associated types are never written directly by the user. -They are used internally by the trait system only, as we will see -shortly. - -In rustc, they correspond to the `TyKind::UnnormalizedProjectionTy` enum -variant, declared in [`librustc_middle/ty/sty.rs`][sty]. In chalk, we use an -`ApplicationTy` with a name living in a special namespace dedicated to -placeholder associated types (see the `TypeName` enum declared in -[`chalk-ir/src/lib.rs`][chalk_type_name]). - -[sty]: https://github.com/rust-lang/rust/blob/master/src/librustc_middle/ty/sty.rs -[chalk_type_name]: https://github.com/rust-lang-nursery/chalk/blob/master/chalk-ir/src/lib.rs - -## Projection equality - -So far we have seen two ways to answer the question of "When can we -consider an associated type projection equal to another type?": - -- the `Normalize` predicate could be used to transform projections when we - knew which impl applied; -- **placeholder** associated types can be used when we don't. This is also - known as **lazy normalization**. - -We now introduce the `ProjectionEq` predicate to bring those two cases -together. The `ProjectionEq` predicate looks like so: - -```text -ProjectionEq(::Item = U) -``` - -and we will see that it can be proven *either* via normalization or -via the placeholder type. As part of lowering an associated type declaration from -some trait, we create two program clauses for `ProjectionEq`: - -```text -forall { - ProjectionEq(::Item = U) :- - Normalize(::Item -> U) -} - -forall { - ProjectionEq(::Item = (IntoIterator::Item)) -} -``` - -These are the only two `ProjectionEq` program clauses we ever make for -any given associated item. - -## Integration with unification - -Now we are ready to discuss how associated type equality integrates -with unification. As described in the -[type inference](../type-inference.html) section, unification is -basically a procedure with a signature like this: - -```text -Unify(A, B) = Result<(Subgoals, RegionConstraints), NoSolution> -``` - -In other words, we try to unify two things A and B. That procedure -might just fail, in which case we get back `Err(NoSolution)`. This -would happen, for example, if we tried to unify `u32` and `i32`. - -The key point is that, on success, unification can also give back to -us a set of subgoals that still remain to be proven. (It can also give -back region constraints, but those are not relevant here). - -Whenever unification encounters a non-placeholder associated type -projection P being equated with some other type T, it always succeeds, -but it produces a subgoal `ProjectionEq(P = T)` that is propagated -back up. Thus it falls to the ordinary workings of the trait system -to process that constraint. - -> If we unify two projections P1 and P2, then unification produces a -> variable X and asks us to prove that `ProjectionEq(P1 = X)` and -> `ProjectionEq(P2 = X)`. (That used to be needed in an older system to -> prevent cycles; I rather doubt it still is. -nmatsakis) diff --git a/src/doc/rustc-dev-guide/src/traits/bibliography.md b/src/doc/rustc-dev-guide/src/traits/bibliography.md deleted file mode 100644 index a0242d4c44..0000000000 --- a/src/doc/rustc-dev-guide/src/traits/bibliography.md +++ /dev/null @@ -1,27 +0,0 @@ -# Bibliography - -If you'd like to read more background material, here are some -recommended texts and papers: - -[Programming with Higher-order Logic][phl], by Dale Miller and Gopalan -Nadathur, covers the key concepts of Lambda prolog. Although it's a -slim little volume, it's the kind of book where you learn something -new every time you open it. - -[phl]: https://www.amazon.com/Programming-Higher-Order-Logic-Dale-Miller/dp/052187940X - - - -["A proof procedure for the logic of Hereditary Harrop formulas"][pphhf], -by Gopalan Nadathur. This paper covers the basics of universes, -environments, and Lambda Prolog-style proof search. Quite readable. - -[pphhf]: https://dl.acm.org/citation.cfm?id=868380 - - - -["A new formulation of tabled resolution with delay"][nftrd], by -Theresa Swift. This paper gives a kind of abstract treatment of the -SLG formulation that is the basis for our on-demand solver. - -[nftrd]: https://dl.acm.org/citation.cfm?id=651202 diff --git a/src/doc/rustc-dev-guide/src/traits/canonical-queries.md b/src/doc/rustc-dev-guide/src/traits/canonical-queries.md index e15bdaae25..5ba450d4ef 100644 --- a/src/doc/rustc-dev-guide/src/traits/canonical-queries.md +++ b/src/doc/rustc-dev-guide/src/traits/canonical-queries.md @@ -7,7 +7,7 @@ would like to know the answer to – and in the checker or other parts of the system, may in the course of doing their thing want to know whether some trait is implemented for some type (e.g., is `u32: Debug` true?). Or they may want to -[normalize some associated type](./associated-types.html). +normalize some associated type. This section covers queries at a fairly high level of abstraction. The subsections look a bit more closely at how these ideas are implemented @@ -104,9 +104,7 @@ trying to enumerate **all possible** answers for you, they are looking for an **unambiguous** answer. In particular, when they tell you the value for a type variable, that means that this is the **only possible instantiation** that you could use, given the current set of impls and -where-clauses, that would be provable. (Internally within the solver, -though, they can potentially enumerate all possible answers. See -[the description of the SLG solver](./slg.html) for details.) +where-clauses, that would be provable. The response to a trait query in rustc is typically a `Result, NoSolution>` (where the `T` will vary a bit @@ -130,10 +128,7 @@ we did find. It consists of four parts: - As we'll see in the example below, we can get back var values even for `Ambiguous` cases. - **Region constraints:** these are relations that must hold between - the lifetimes that you supplied as inputs. We'll ignore these here, - but see the - [section on handling regions in traits](./regions.html) for - more details. + the lifetimes that you supplied as inputs. We'll ignore these here. - **Value:** The query result also comes with a value of type `T`. For some specialized queries – like normalizing associated types – this is used to carry back an extra result, but it's often just diff --git a/src/doc/rustc-dev-guide/src/traits/canonicalization.md b/src/doc/rustc-dev-guide/src/traits/canonicalization.md deleted file mode 100644 index d6d57d7850..0000000000 --- a/src/doc/rustc-dev-guide/src/traits/canonicalization.md +++ /dev/null @@ -1,256 +0,0 @@ -# Canonicalization - -Canonicalization is the process of **isolating** an inference value -from its context. It is a key part of implementing -[canonical queries][cq], and you may wish to read the parent chapter -to get more context. - -Canonicalization is really based on a very simple concept: every -[inference variable](../type-inference.html#vars) is always in one of -two states: either it is **unbound**, in which case we don't know yet -what type it is, or it is **bound**, in which case we do. So to -isolate some data-structure T that contains types/regions from its -environment, we just walk down and find the unbound variables that -appear in T; those variables get replaced with "canonical variables", -starting from zero and numbered in a fixed order (left to right, for -the most part, but really it doesn't matter as long as it is -consistent). - -[cq]: ./canonical-queries.html - -So, for example, if we have the type `X = (?T, ?U)`, where `?T` and -`?U` are distinct, unbound inference variables, then the canonical -form of `X` would be `(?0, ?1)`, where `?0` and `?1` represent these -**canonical placeholders**. Note that the type `Y = (?U, ?T)` also -canonicalizes to `(?0, ?1)`. But the type `Z = (?T, ?T)` would -canonicalize to `(?0, ?0)` (as would `(?U, ?U)`). In other words, the -exact identity of the inference variables is not important – unless -they are repeated. - -We use this to improve caching as well as to detect cycles and other -things during trait resolution. Roughly speaking, the idea is that if -two trait queries have the same canonical form, then they will get -the same answer. That answer will be expressed in terms of the -canonical variables (`?0`, `?1`), which we can then map back to the -original variables (`?T`, `?U`). - -## Canonicalizing the query - -To see how it works, imagine that we are asking to solve the following -trait query: `?A: Foo<'static, ?B>`, where `?A` and `?B` are unbound. -This query contains two unbound variables, but it also contains the -lifetime `'static`. The trait system generally ignores all lifetimes -and treats them equally, so when canonicalizing, we will *also* -replace any [free lifetime](../appendix/background.html#free-vs-bound) with a -canonical variable (Note that `'static` is actually a _free_ lifetime -variable here. We are not considering it in the typing context of the whole -program but only in the context of this trait reference. Mathematically, we -are not quantifying over the whole program, but only this obligation). -Therefore, we get the following result: - -```text -?0: Foo<'?1, ?2> -``` - -Sometimes we write this differently, like so: - -```text -for { ?0: Foo<'?1, ?2> } -``` - -This `for<>` gives some information about each of the canonical -variables within. In this case, each `T` indicates a type variable, -so `?0` and `?2` are types; the `L` indicates a lifetime variable, so -`?1` is a lifetime. The `canonicalize` method *also* gives back a -`CanonicalVarValues` array OV with the "original values" for each -canonicalized variable: - -```text -[?A, 'static, ?B] -``` - -We'll need this vector OV later, when we process the query response. - -## Executing the query - -Once we've constructed the canonical query, we can try to solve it. -To do so, we will wind up creating a fresh inference context and -**instantiating** the canonical query in that context. The idea is that -we create a substitution S from the canonical form containing a fresh -inference variable (of suitable kind) for each canonical variable. -So, for our example query: - -```text -for { ?0: Foo<'?1, ?2> } -``` - -the substitution S might be: - -```text -S = [?A, '?B, ?C] -``` - -We can then replace the bound canonical variables (`?0`, etc) with -these inference variables, yielding the following fully instantiated -query: - -```text -?A: Foo<'?B, ?C> -``` - -Remember that substitution S though! We're going to need it later. - -OK, now that we have a fresh inference context and an instantiated -query, we can go ahead and try to solve it. The trait solver itself is -explained in more detail in [another section](./slg.html), but -suffice to say that it will compute a [certainty value][cqqr] (`Proven` or -`Ambiguous`) and have side-effects on the inference variables we've -created. For example, if there were only one impl of `Foo`, like so: - -[cqqr]: ./canonical-queries.html#query-response - -```rust,ignore -impl<'a, X> Foo<'a, X> for Vec -where X: 'a -{ ... } -``` - -then we might wind up with a certainty value of `Proven`, as well as -creating fresh inference variables `'?D` and `?E` (to represent the -parameters on the impl) and unifying as follows: - -- `'?B = '?D` -- `?A = Vec` -- `?C = ?E` - -We would also accumulate the region constraint `?E: '?D`, due to the -where clause. - -In order to create our final query result, we have to "lift" these -values out of the query's inference context and into something that -can be reapplied in our original inference context. We do that by -**re-applying canonicalization**, but to the **query result**. - -## Canonicalizing the query result - -As discussed in [the parent section][cqqr], most trait queries wind up -with a result that brings together a "certainty value" `certainty`, a -result substitution `var_values`, and some region constraints. To -create this, we wind up re-using the substitution S that we created -when first instantiating our query. To refresh your memory, we had a query - -```text -for { ?0: Foo<'?1, ?2> } -``` - -for which we made a substutition S: - -```text -S = [?A, '?B, ?C] -``` - -We then did some work which unified some of those variables with other things. -If we "refresh" S with the latest results, we get: - -```text -S = [Vec, '?D, ?E] -``` - -These are precisely the new values for the three input variables from -our original query. Note though that they include some new variables -(like `?E`). We can make those go away by canonicalizing again! We don't -just canonicalize S, though, we canonicalize the whole query response QR: - -```text -QR = { - certainty: Proven, // or whatever - var_values: [Vec, '?D, ?E] // this is S - region_constraints: [?E: '?D], // from the impl - value: (), // for our purposes, just (), but - // in some cases this might have - // a type or other info -} -``` - -The result would be as follows: - -```text -Canonical(QR) = for { - certainty: Proven, - var_values: [Vec, '?1, ?0] - region_constraints: [?0: '?1], - value: (), -} -``` - -(One subtle point: when we canonicalize the query **result**, we do not -use any special treatment for free lifetimes. Note that both -references to `'?D`, for example, were converted into the same -canonical variable (`?1`). This is in contrast to the original query, -where we canonicalized every free lifetime into a fresh canonical -variable.) - -Now, this result must be reapplied in each context where needed. - -## Processing the canonicalized query result - -In the previous section we produced a canonical query result. We now have -to apply that result in our original context. If you recall, way back in the -beginning, we were trying to prove this query: - -```text -?A: Foo<'static, ?B> -``` - -We canonicalized that into this: - -```text -for { ?0: Foo<'?1, ?2> } -``` - -and now we got back a canonical response: - -```text -for { - certainty: Proven, - var_values: [Vec, '?1, ?0] - region_constraints: [?0: '?1], - value: (), -} -``` - -We now want to apply that response to our context. Conceptually, how -we do that is to (a) instantiate each of the canonical variables in -the result with a fresh inference variable, (b) unify the values in -the result with the original values, and then (c) record the region -constraints for later. Doing step (a) would yield a result of - -```text -{ - certainty: Proven, - var_values: [Vec, '?D, ?C] - ^^ ^^^ fresh inference variables - region_constraints: [?C: '?D], - value: (), -} -``` - -Step (b) would then unify: - -```text -?A with Vec -'static with '?D -?B with ?C -``` - -And finally the region constraint of `?C: 'static` would be recorded -for later verification. - -(What we *actually* do is a mildly optimized variant of that: Rather -than eagerly instantiating all of the canonical values in the result -with variables, we instead walk the vector of values, looking for -cases where the value is just a canonical variable. In our example, -`values[2]` is `?C`, so that means we can deduce that `?C := ?B` and -`'?D := 'static`. This gives us a partial set of values. Anything for -which we do not find a value, we create an inference variable.) - diff --git a/src/doc/rustc-dev-guide/src/traits/chalk-overview.md b/src/doc/rustc-dev-guide/src/traits/chalk-overview.md deleted file mode 100644 index 64cb589c1b..0000000000 --- a/src/doc/rustc-dev-guide/src/traits/chalk-overview.md +++ /dev/null @@ -1,256 +0,0 @@ -# An Overview of Chalk - -> Chalk is under heavy development, so if any of these links are broken or if -> any of the information is inconsistent with the code or outdated, please -> [open an issue][rustc-issues] so we can fix it. If you are able to fix the -> issue yourself, we would love your contribution! - -[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 -readable specification of the Rust trait system. - -There are many expected benefits from this work. It will consolidate our -existing, somewhat ad-hoc implementation into something far more principled and -expressive, which should behave better in corner cases, and be much easier to -extend. - -## Chalk Structure - -Chalk has two main "products". The first of these is the -[`chalk_engine`][chalk_engine] crate, which defines the core [SLG -solver][slg]. This is the part rustc uses. - -The rest of chalk can be considered an elaborate testing harness. Chalk is -capable of parsing Rust-like "programs", lowering them to logic, and -performing queries on them. - -Here's a sample session in the chalk repl, chalki. After feeding it our -program, we perform some queries on it. - -```rust,ignore -?- program -Enter a program; press Ctrl-D when finished -| struct Foo { } -| struct Bar { } -| struct Vec { } -| trait Clone { } -| impl Clone for Vec where T: Clone { } -| impl Clone for Foo { } - -?- Vec: Clone -Unique; substitution [], lifetime constraints [] - -?- Vec: Clone -No possible solution. - -?- exists { Vec: Clone } -Ambiguous; no inference guidance -``` - -You can see more examples of programs and queries in the [unit -tests][chalk-test-example]. - -Next we'll go through each stage required to produce the output above. - -### Parsing ([chalk_parse]) - -Chalk is designed to be incorporated with the Rust compiler, so the syntax and -concepts it deals with heavily borrow from Rust. It is convenient for the sake -of testing to be able to run chalk on its own, so chalk includes a parser for a -Rust-like syntax. This syntax is orthogonal to the Rust AST and grammar. It is -not intended to look exactly like it or support the exact same syntax. - -The parser takes that syntax and produces an [Abstract Syntax Tree (AST)][ast]. -You can find the [complete definition of the AST][chalk-ast] in the source code. - -The syntax contains things from Rust that we know and love, for example: traits, -impls, and struct definitions. Parsing is often the first "phase" of -transformation that a program goes through in order to become a format that -chalk can understand. - -### Rust Intermediate Representation ([chalk_rust_ir]) - -After getting the AST we convert it to a more convenient intermediate -representation called [`chalk_rust_ir`][chalk_rust_ir]. This is sort of -analogous to the [HIR] in Rust. The process of converting to IR is called -*lowering*. - -The [`chalk::program::Program`][chalk-program] struct contains some "rust things" -but indexed and accessible in a different way. For example, if you have a -type like `Foo`, we would represent `Foo` as a string in the AST but in -`chalk::program::Program`, we use numeric indices (`ItemId`). - -The [IR source code][ir-code] contains the complete definition. - -### Chalk Intermediate Representation ([chalk_ir]) - -Once we have Rust IR it is time to convert it to "program clauses". A -[`ProgramClause`] is essentially one of the following: - -* A [clause] of the form `consequence :- conditions` where `:-` is read as - "if" and `conditions = cond1 && cond2 && ...` -* A universally quantified clause of the form - `forall { consequence :- conditions }` - * `forall { ... }` is used to represent [universal quantification]. See the - section on [Lowering to logic][lowering-forall] for more information. - * A key thing to note about `forall` is that we don't allow you to "quantify" - over traits, only types and regions (lifetimes). That is, you can't make a - rule like `forall { u32: Trait }` which would say "`u32` implements - all traits". You can however say `forall { T: Trait }` meaning "`Trait` - is implemented by all types". - * `forall { ... }` is represented in the code using the [`Binders` - struct][binders-struct]. - -*See also: [Goals and Clauses][goals-and-clauses]* - -This is where we encode the rules of the trait system into logic. For -example, if we have the following Rust: - -```rust,ignore -impl Clone for Vec {} -``` - -We generate the following program clause: - -```rust,ignore -forall { (Vec: Clone) :- (T: Clone) } -``` - -This rule dictates that `Vec: Clone` is only satisfied if `T: Clone` is also -satisfied (i.e. "provable"). - -Similar to [`chalk::program::Program`][chalk-program] which has "rust-like -things", chalk_ir defines [`ProgramEnvironment`] which is "pure logic". -The main field in that struct is `program_clauses`, which contains the -[`ProgramClause`]s generated by the rules module. - -### Rules ([chalk_solve]) - -The `chalk_solve` crate ([source code][chalk_solve]) defines the logic rules we -use for each item in the Rust IR. It works by iterating over every trait, impl, -etc. and emitting the rules that come from each one. - -*See also: [Lowering Rules][lowering-rules]* - -#### Well-formedness checks - -As part of lowering to logic, we also do some "well formedness" checks. See -the [`chalk_solve::wf` source code][solve-wf-src] for where those are done. - -*See also: [Well-formedness checking][wf-checking]* - -#### Coherence - -The method `CoherenceSolver::specialization_priorities` in the `coherence` module -([source code][coherence-src]) checks "coherence", which means that it -ensures that two impls of the same trait for the same type cannot exist. - -### Solver ([chalk_solve]) - -Finally, when we've collected all the program clauses we care about, we want -to perform queries on it. The component that finds the answer to these -queries is called the *solver*. - -*See also: [The SLG Solver][slg]* - -## Crates - -Chalk's functionality is broken up into the following crates: -- [**chalk_engine**][chalk_engine]: Defines the core [SLG solver][slg]. -- [**chalk_rust_ir**][chalk_rust_ir], containing the "HIR-like" form of the AST -- [**chalk_ir**][chalk_ir]: Defines chalk's internal representation of - types, lifetimes, and goals. -- [**chalk_solve**][chalk_solve]: Combines `chalk_ir` and `chalk_engine`, - effectively, which implements logic rules converting `chalk_rust_ir` to - `chalk_ir` - - Defines the `coherence` module, which implements coherence rules - - [`chalk_engine::context`][engine-context] provides the necessary hooks. -- [**chalk_parse**][chalk_parse]: Defines the raw AST and a parser. -- [**chalk**][doc-chalk]: Brings everything together. Defines the following - modules: - - `chalk::lowering`, which converts AST to `chalk_rust_ir` - - Also includes [chalki][chalki], chalk's REPL. - -[Browse source code on GitHub](https://github.com/rust-lang/chalk) - -## Testing - -chalk has a test framework for lowering programs to logic, checking the -lowered logic, and performing queries on it. This is how we test the -implementation of chalk itself, and the viability of the [lowering -rules][lowering-rules]. - -The main kind of tests in chalk are **goal tests**. They contain a program, -which is expected to lower to logic successfully, and a set of queries -(goals) along with the expected output. Here's an -[example][chalk-test-example]. Since chalk's output can be quite long, goal -tests support specifying only a prefix of the output. - -**Lowering tests** check the stages that occur before we can issue queries -to the solver: the [lowering to chalk_rust_ir][chalk-test-lowering], and the -[well-formedness checks][chalk-test-wf] that occur after that. - -### Testing internals - -Goal tests use a [`test!` macro][test-macro] that takes chalk's Rust-like -syntax and runs it through the full pipeline described above. The macro -ultimately calls the [`solve_goal` function][solve_goal]. - -Likewise, lowering tests use the [`lowering_success!` and -`lowering_error!` macros][test-lowering-macros]. - -## More Resources - -* [Chalk Source Code](https://github.com/rust-lang/chalk) -* [Chalk Glossary](https://github.com/rust-lang/chalk/blob/master/GLOSSARY.md) - -### Blog Posts - -* [Lowering Rust traits to logic](http://smallcultfollowing.com/babysteps/blog/2017/01/26/lowering-rust-traits-to-logic/) -* [Unification in Chalk, part 1](http://smallcultfollowing.com/babysteps/blog/2017/03/25/unification-in-chalk-part-1/) -* [Unification in Chalk, part 2](http://smallcultfollowing.com/babysteps/blog/2017/04/23/unification-in-chalk-part-2/) -* [Negative reasoning in Chalk](https://aturon.github.io/blog/2017/04/24/negative-chalk/) -* [Query structure in chalk](http://smallcultfollowing.com/babysteps/blog/2017/05/25/query-structure-in-chalk/) -* [Cyclic queries in chalk](http://smallcultfollowing.com/babysteps/blog/2017/09/12/tabling-handling-cyclic-queries-in-chalk/) -* [An on-demand SLG solver for chalk](http://smallcultfollowing.com/babysteps/blog/2018/01/31/an-on-demand-slg-solver-for-chalk/) - -[goals-and-clauses]: ./goals-and-clauses.html -[HIR]: ../hir.html -[lowering-forall]: ./lowering-to-logic.html#type-checking-generic-functions-beyond-horn-clauses -[lowering-rules]: ./lowering-rules.html -[lowering-to-logic]: ./lowering-to-logic.html -[slg]: ./slg.html -[wf-checking]: ./wf.html - -[ast]: https://en.wikipedia.org/wiki/Abstract_syntax_tree -[chalk]: https://github.com/rust-lang/chalk -[rustc-issues]: https://github.com/rust-lang/rustc-dev-guide/issues -[universal quantification]: https://en.wikipedia.org/wiki/Universal_quantification - -[`ProgramClause`]: https://rust-lang.github.io/chalk/chalk_ir/struct.ProgramClause.html -[`ProgramEnvironment`]: https://rust-lang.github.io/chalk/chalk_integration/program_environment/struct.ProgramEnvironment.html -[chalk_engine]: https://rust-lang.github.io/chalk/chalk_engine -[chalk_ir]: https://rust-lang.github.io/chalk/chalk_ir/index.html -[chalk_parse]: https://rust-lang.github.io/chalk/chalk_parse/index.html -[chalk_solve]: https://rust-lang.github.io/chalk/chalk_solve/index.html -[chalk_rust_ir]: https://rust-lang.github.io/chalk/chalk_rust_ir/index.html -[doc-chalk]: https://rust-lang.github.io/chalk/chalk/index.html -[engine-context]: https://rust-lang.github.io/chalk/chalk_engine/context/index.html -[chalk-program]: https://rust-lang.github.io/chalk/chalk_integration/program/struct.Program.html - -[binders-struct]: https://rust-lang.github.io/chalk/chalk_ir/struct.Binders.html -[chalk-ast]: https://rust-lang.github.io/chalk/chalk_parse/ast/index.html -[chalk-test-example]: https://github.com/rust-lang/chalk/blob/4bce000801de31bf45c02f742a5fce335c9f035f/src/test.rs#L115 -[chalk-test-lowering-example]: https://github.com/rust-lang/chalk/blob/4bce000801de31bf45c02f742a5fce335c9f035f/src/rust_ir/lowering/test.rs#L8-L31 -[chalk-test-lowering]: https://github.com/rust-lang/chalk/blob/4bce000801de31bf45c02f742a5fce335c9f035f/src/rust_ir/lowering/test.rs -[chalk-test-wf]: https://github.com/rust-lang/chalk/blob/4bce000801de31bf45c02f742a5fce335c9f035f/src/rules/wf/test.rs#L1 -[chalki]: https://github.com/rust-lang/chalk/blob/master/src/main.rs -[clause]: https://github.com/rust-lang/chalk/blob/master/GLOSSARY.md#clause -[coherence-src]: https://rust-lang.github.io/chalk/chalk_solve/coherence/index.html -[ir-code]: https://rust-lang.github.io/chalk/chalk_rust_ir/ -[solve-wf-src]: https://rust-lang.github.io/chalk/chalk_solve/wf/index.html -[solve_goal]: https://github.com/rust-lang/chalk/blob/4bce000801de31bf45c02f742a5fce335c9f035f/src/test.rs#L85 -[test-lowering-macros]: https://github.com/rust-lang/chalk/blob/4bce000801de31bf45c02f742a5fce335c9f035f/src/test_util.rs#L21-L54 -[test-macro]: https://github.com/rust-lang/chalk/blob/4bce000801de31bf45c02f742a5fce335c9f035f/src/test.rs#L33 diff --git a/src/doc/rustc-dev-guide/src/traits/chalk.md b/src/doc/rustc-dev-guide/src/traits/chalk.md new file mode 100644 index 0000000000..db3c19a386 --- /dev/null +++ b/src/doc/rustc-dev-guide/src/traits/chalk.md @@ -0,0 +1,40 @@ +# Chalk-based trait solving + +[Chalk][chalk] is an experimental trait solver for Rust that is (as of January 2021) under development by the [Traits Working +Group][wg]. Its goal is to enable a lot of trait system features and bug fixes +that are hard to implement (e.g. GATs or specialization). If you would like to +help in hacking on the new solver, you will find instructions for getting +involved in the [Traits Working Group tracking issue][wg]. + +[wg]: https://github.com/rust-lang/rust/issues/48416 + +The new-style trait solver is based on the work done in [chalk][chalk]. Chalk +recasts Rust's trait system explicitly in terms of logic programming. It does +this by "lowering" Rust code into a kind of logic program we can then execute +queries against. + +The key observation here is that the Rust trait system is basically a +kind of logic, and it can be mapped onto standard logical inference +rules. We can then look for solutions to those inference rules in a +very similar fashion to how e.g. a [Prolog] solver works. It turns out +that we can't *quite* use Prolog rules (also called Horn clauses) but +rather need a somewhat more expressive variant. + +[Prolog]: https://en.wikipedia.org/wiki/Prolog + +You can read more about chalk itself in the +[Chalk book](https://rust-lang.github.io/chalk/book/) section. + +## Ongoing work +The design of the new-style trait solving happens in two places: + +**chalk**. The [chalk][chalk] repository is where we experiment with new ideas +and designs for the trait system. + +**rustc**. Once we are happy with the logical rules, we proceed to +implementing them in rustc. We map our struct, trait, and impl declarations +into logical inference rules in the lowering module in rustc. + +[chalk]: https://github.com/rust-lang/chalk +[rustc_traits]: https://github.com/rust-lang/rust/tree/master/compiler/rustc_traits diff --git a/src/doc/rustc-dev-guide/src/traits/goals-and-clauses.md b/src/doc/rustc-dev-guide/src/traits/goals-and-clauses.md index ecd2ce1456..4315b3e0f3 100644 --- a/src/doc/rustc-dev-guide/src/traits/goals-and-clauses.md +++ b/src/doc/rustc-dev-guide/src/traits/goals-and-clauses.md @@ -1,5 +1,7 @@ # Goals and clauses + + In logic programming terms, a **goal** is something that you must prove and a **clause** is something that you know is true. As described in the [lowering to logic](./lowering-to-logic.html) @@ -38,11 +40,11 @@ paper gives the details. In terms of code, these types are defined in -[`librustc_middle/traits/mod.rs`][traits_mod] in rustc, and in +[`rustc_middle/src/traits/mod.rs`][traits_mod] in rustc, and in [`chalk-ir/src/lib.rs`][chalk_ir] in chalk. -[pphhf]: ./bibliography.html#pphhf -[traits_mod]: https://github.com/rust-lang/rust/blob/master/src/librustc_middle/traits/mod.rs +[pphhf]: https://rust-lang.github.io/chalk/book/bibliography.html#pphhf +[traits_mod]: https://github.com/rust-lang/rust/blob/master/compiler/rustc_middle/src/traits/mod.rs [chalk_ir]: https://github.com/rust-lang/chalk/blob/master/chalk-ir/src/lib.rs @@ -118,7 +120,7 @@ e.g. `ProjectionEq::Item = u8` The given associated type `Projection` is equal to `Type`; this can be proved with either normalization or using placeholder associated types. See -[the section on associated types](./associated-types.html). +[the section on associated types in Chalk Book][at]. #### Normalize(Projection -> Type) e.g. `ProjectionEq::Item -> u8` @@ -126,12 +128,12 @@ e.g. `ProjectionEq::Item -> u8` The given associated type `Projection` can be [normalized][n] to `Type`. As discussed in [the section on associated -types](./associated-types.html), `Normalize` implies `ProjectionEq`, +types in Chalk Book][at], `Normalize` implies `ProjectionEq`, but not vice versa. In general, proving `Normalize(::Item -> U)` also requires proving `Implemented(T: Trait)`. -[n]: ./associated-types.html#normalize -[at]: ./associated-types.html +[n]: https://rust-lang.github.io/chalk/book/clauses/type_equality.html#normalize +[at]: https://rust-lang.github.io/chalk/book/clauses/type_equality.html #### FromEnv(TraitRef) e.g. `FromEnv(Self: Add)` @@ -196,7 +198,7 @@ it is okay to assume `FromEnv(T: Clone)` in the `loud_clone` example is that we _also_ verify `WellFormed(T: Clone)` for each call site of `loud_clone`. Similarly, it is okay to assume `FromEnv(HashSet)` in the `loud_insert` example because we will verify `WellFormed(HashSet)` for each call site of -`loud_insert`. +`loud_insert`. #### Outlives(Type: Region), Outlives(Region: Region) e.g. `Outlives(&'a str: 'b)`, `Outlives('a: 'static)` @@ -260,7 +262,7 @@ In addition to auto traits, `WellFormed` predicates are co-inductive. These are used to achieve a similar "enumerate all the cases" pattern, as described in the section on [implied bounds]. -[implied bounds]: ./lowering-rules.html#implied-bounds +[implied bounds]: https://rust-lang.github.io/chalk/book/clauses/implied_bounds.html#implied-bounds ## Incomplete chapter diff --git a/src/doc/rustc-dev-guide/src/traits/hrtb.md b/src/doc/rustc-dev-guide/src/traits/hrtb.md index 81391f7ae2..aa85448afe 100644 --- a/src/doc/rustc-dev-guide/src/traits/hrtb.md +++ b/src/doc/rustc-dev-guide/src/traits/hrtb.md @@ -42,7 +42,7 @@ subtyping, we recommend you read the paper). There are a few parts: [hrsubtype]: ./hrtb.md [placeholder]: ../appendix/glossary.html#placeholder -[paper by SPJ]: http://research.microsoft.com/en-us/um/people/simonpj/papers/higher-rank/ +[paper by SPJ]: https://www.microsoft.com/en-us/research/publication/practical-type-inference-for-arbitrary-rank-types So let's work through our example. @@ -107,7 +107,7 @@ impl Foo for F } ``` -Now let's say we have a obligation `Baz: for<'a> Foo<&'a isize>` and we match +Now let's say we have an obligation `Baz: for<'a> Foo<&'a isize>` and we match this impl. What obligation is generated as a result? We want to get `Baz: for<'a> Bar<&'a isize>`, but how does that happen? diff --git a/src/doc/rustc-dev-guide/src/traits/implied-bounds.md b/src/doc/rustc-dev-guide/src/traits/implied-bounds.md deleted file mode 100644 index 5876f3b621..0000000000 --- a/src/doc/rustc-dev-guide/src/traits/implied-bounds.md +++ /dev/null @@ -1,502 +0,0 @@ -# Implied Bounds - -Implied bounds remove the need to repeat where clauses written on -a type declaration or a trait declaration. For example, say we have the -following type declaration: -```rust,ignore -struct HashSet { - ... -} -``` - -then everywhere we use `HashSet` as an "input" type, that is appearing in -the receiver type of an `impl` or in the arguments of a function, we don't -want to have to repeat the `where K: Hash` bound, as in: - -```rust,ignore -// I don't want to have to repeat `where K: Hash` here. -impl HashSet { - ... -} - -// Same here. -fn loud_insert(set: &mut HashSet, item: K) { - println!("inserting!"); - set.insert(item); -} -``` - -Note that in the `loud_insert` example, `HashSet` is not the type -of the `set` argument of `loud_insert`, it only *appears* in the -argument type `&mut HashSet`: we care about every type appearing -in the function's header (the header is the signature without the return type), -not only types of the function's arguments. - -The rationale for applying implied bounds to input types is that, for example, -in order to call the `loud_insert` function above, the programmer must have -*produced* the type `HashSet` already, hence the compiler already verified -that `HashSet` was well-formed, i.e. that `K` effectively implemented -`Hash`, as in the following example: - -```rust,ignore -fn main() { - // I am producing a value of type `HashSet`. - // If `i32` was not `Hash`, the compiler would report an error here. - let set: HashSet = HashSet::new(); - loud_insert(&mut set, 5); -} -``` - -Hence, we don't want to repeat where clauses for input types because that would -sort of duplicate the work of the programmer, having to verify that their types -are well-formed both when calling the function and when using them in the -arguments of their function. The same reasoning applies when using an `impl`. - -Similarly, given the following trait declaration: -```rust,ignore -trait Copy where Self: Clone { // desugared version of `Copy: Clone` - ... -} -``` - -then everywhere we bound over `SomeType: Copy`, we would like to be able to -use the fact that `SomeType: Clone` without having to write it explicitly, -as in: -```rust,ignore -fn loud_clone(x: T) { - println!("cloning!"); - x.clone(); -} - -fn fun_with_copy(x: T) { - println!("will clone a `Copy` type soon..."); - - // I'm using `loud_clone` with `T: Copy`, I know this - // implies `T: Clone` so I don't want to have to write it explicitly. - loud_clone(x); -} -``` - -The rationale for implied bounds for traits is that if a type implements -`Copy`, that is, if there exists an `impl Copy` for that type, there *ought* -to exist an `impl Clone` for that type, otherwise the compiler would have -reported an error in the first place. So again, if we were forced to repeat the -additional `where SomeType: Clone` everywhere whereas we already know that -`SomeType: Copy` hold, we would kind of duplicate the verification work. - -Implied bounds are not yet completely enforced in rustc, at the moment it only -works for outlive requirements, super trait bounds, and bounds on associated -types. The full RFC can be found [here][RFC]. We'll give here a brief view -of how implied bounds work and why we chose to implement it that way. The -complete set of lowering rules can be found in the corresponding -[chapter](./lowering-rules.md). - -[RFC]: https://github.com/rust-lang/rfcs/blob/master/text/2089-implied-bounds.md - -## Implied bounds and lowering rules - -Now we need to express implied bounds in terms of logical rules. We will start -with exposing a naive way to do it. Suppose that we have the following traits: -```rust,ignore -trait Foo { - ... -} - -trait Bar where Self: Foo { } { - ... -} -``` - -So we would like to say that if a type implements `Bar`, then necessarily -it must also implement `Foo`. We might think that a clause like this would -work: -```text -forall { - Implemented(Type: Foo) :- Implemented(Type: Bar). -} -``` - -Now suppose that we just write this impl: -```rust,ignore -struct X; - -impl Bar for X { } -``` - -Clearly this should not be allowed: indeed, we wrote a `Bar` impl for `X`, but -the `Bar` trait requires that we also implement `Foo` for `X`, which we never -did. In terms of what the compiler does, this would look like this: -```rust,ignore -struct X; - -impl Bar for X { - // We are in a `Bar` impl for the type `X`. - // There is a `where Self: Foo` bound on the `Bar` trait declaration. - // Hence I need to prove that `X` also implements `Foo` for that impl - // to be legal. -} -``` -So the compiler would try to prove `Implemented(X: Foo)`. Of course it will -not find any `impl Foo for X` since we did not write any. However, it -will see our implied bound clause: -```text -forall { - Implemented(Type: Foo) :- Implemented(Type: Bar). -} -``` - -so that it may be able to prove `Implemented(X: Foo)` if `Implemented(X: Bar)` -holds. And it turns out that `Implemented(X: Bar)` does hold since we wrote -a `Bar` impl for `X`! Hence the compiler will accept the `Bar` impl while it -should not. - -## Implied bounds coming from the environment - -So the naive approach does not work. What we need to do is to somehow decouple -implied bounds from impls. Suppose we know that a type `SomeType<...>` -implements `Bar` and we want to deduce that `SomeType<...>` must also implement -`Foo`. - -There are two possibilities: first, we have enough information about -`SomeType<...>` to see that there exists a `Bar` impl in the program which -covers `SomeType<...>`, for example a plain `impl<...> Bar for SomeType<...>`. -Then if the compiler has done its job correctly, there *must* exist a `Foo` -impl which covers `SomeType<...>`, e.g. another plain -`impl<...> Foo for SomeType<...>`. In that case then, we can just use this -impl and we do not need implied bounds at all. - -Second possibility: we do not know enough about `SomeType<...>` in order to -find a `Bar` impl which covers it, for example if `SomeType<...>` is just -a type parameter in a function: -```rust,ignore -fn foo() { - // We'd like to deduce `Implemented(T: Foo)`. -} -``` - -That is, the information that `T` implements `Bar` here comes from the -*environment*. The environment is the set of things that we assume to be true -when we type check some Rust declaration. In that case, what we assume is that -`T: Bar`. Then at that point, we might authorize ourselves to have some kind -of "local" implied bound reasoning which would say -`Implemented(T: Foo) :- Implemented(T: Bar)`. This reasoning would -only be done within our `foo` function in order to avoid the earlier -problem where we had a global clause. - -We can apply these local reasonings everywhere we can have an environment --- i.e. when we can write where clauses -- that is, inside impls, -trait declarations, and type declarations. - -## Computing implied bounds with `FromEnv` - -The previous subsection showed that it was only useful to compute implied -bounds for facts coming from the environment. -We talked about "local" rules, but there are multiple possible strategies to -indeed implement the locality of implied bounds. - -In rustc, the current strategy is to *elaborate* bounds: that is, each time -we have a fact in the environment, we recursively derive all the other things -that are implied by this fact until we reach a fixed point. For example, if -we have the following declarations: -```rust,ignore -trait A { } -trait B where Self: A { } -trait C where Self: B { } - -fn foo() { - ... -} -``` -then inside the `foo` function, we start with an environment containing only -`Implemented(T: C)`. Then because of implied bounds for the `C` trait, we -elaborate `Implemented(T: B)` and add it to our environment. Because of -implied bounds for the `B` trait, we elaborate `Implemented(T: A)`and add it -to our environment as well. We cannot elaborate anything else, so we conclude -that our final environment consists of `Implemented(T: A + B + C)`. - -In the new-style trait system, we like to encode as many things as possible -with logical rules. So rather than "elaborating", we have a set of *global* -program clauses defined like so: -```text -forall { Implemented(T: A) :- FromEnv(T: A). } - -forall { Implemented(T: B) :- FromEnv(T: B). } -forall { FromEnv(T: A) :- FromEnv(T: B). } - -forall { Implemented(T: C) :- FromEnv(T: C). } -forall { FromEnv(T: C) :- FromEnv(T: C). } -``` -So these clauses are defined globally (that is, they are available from -everywhere in the program) but they cannot be used because the hypothesis -is always of the form `FromEnv(...)` which is a bit special. Indeed, as -indicated by the name, `FromEnv(...)` facts can **only** come from the -environment. -How it works is that in the `foo` function, instead of having an environment -containing `Implemented(T: C)`, we replace this environment with -`FromEnv(T: C)`. From here and thanks to the above clauses, we see that we -are able to reach any of `Implemented(T: A)`, `Implemented(T: B)` or -`Implemented(T: C)`, which is what we wanted. - -## Implied bounds and well-formedness checking - -Implied bounds are tightly related with well-formedness checking. -Well-formedness checking is the process of checking that the impls the -programmer wrote are legal, what we referred to earlier as "the compiler doing -its job correctly". - -We already saw examples of illegal and legal impls: -```rust,ignore -trait Foo { } -trait Bar where Self: Foo { } - -struct X; -struct Y; - -impl Bar for X { - // This impl is not legal: the `Bar` trait requires that we also - // implement `Foo`, and we didn't. -} - -impl Foo for Y { - // This impl is legal: there is nothing to check as there are no where - // clauses on the `Foo` trait. -} - -impl Bar for Y { - // This impl is legal: we have a `Foo` impl for `Y`. -} -``` -We must define what "legal" and "illegal" mean. For this, we introduce another -predicate: `WellFormed(Type: Trait)`. We say that the trait reference -`Type: Trait` is well-formed if `Type` meets the bounds written on the -`Trait` declaration. For each impl we write, assuming that the where clauses -declared on the impl hold, the compiler tries to prove that the corresponding -trait reference is well-formed. The impl is legal if the compiler manages to do -so. - -Coming to the definition of `WellFormed(Type: Trait)`, it would be tempting -to define it as: -```rust,ignore -trait Trait where WC1, WC2, ..., WCn { - ... -} -``` - -```text -forall { - WellFormed(Type: Trait) :- WC1 && WC2 && .. && WCn. -} -``` -and indeed this was basically what was done in rustc until it was noticed that -this mixed badly with implied bounds. The key thing is that implied bounds -allows someone to derive all bounds implied by a fact in the environment, and -this *transitively* as we've seen with the `A + B + C` traits example. -However, the `WellFormed` predicate as defined above only checks that the -*direct* superbounds hold. That is, if we come back to our `A + B + C` -example: -```rust,ignore -trait A { } -// No where clauses, always well-formed. -// forall { WellFormed(Type: A). } - -trait B where Self: A { } -// We only check the direct superbound `Self: A`. -// forall { WellFormed(Type: B) :- Implemented(Type: A). } - -trait C where Self: B { } -// We only check the direct superbound `Self: B`. We do not check -// the `Self: A` implied bound coming from the `Self: B` superbound. -// forall { WellFormed(Type: C) :- Implemented(Type: B). } -``` -There is an asymmetry between the recursive power of implied bounds and -the shallow checking of `WellFormed`. It turns out that this asymmetry -can be [exploited][bug]. Indeed, suppose that we define the following -traits: -```rust,ignore -trait Partial where Self: Copy { } -// WellFormed(Self: Partial) :- Implemented(Self: Copy). - -trait Complete where Self: Partial { } -// WellFormed(Self: Complete) :- Implemented(Self: Partial). - -impl Partial for T where T: Complete { } - -impl Complete for T { } -``` - -For the `Partial` impl, what the compiler must prove is: -```text -forall { - if (T: Complete) { // assume that the where clauses hold - WellFormed(T: Partial) // show that the trait reference is well-formed - } -} -``` -Proving `WellFormed(T: Partial)` amounts to proving `Implemented(T: Copy)`. -However, we have `Implemented(T: Complete)` in our environment: thanks to -implied bounds, we can deduce `Implemented(T: Partial)`. Using implied bounds -one level deeper, we can deduce `Implemented(T: Copy)`. Finally, the `Partial` -impl is legal. - -For the `Complete` impl, what the compiler must prove is: -```text -forall { - WellFormed(T: Complete) // show that the trait reference is well-formed -} -``` -Proving `WellFormed(T: Complete)` amounts to proving `Implemented(T: Partial)`. -We see that the `impl Partial for T` applies if we can prove -`Implemented(T: Complete)`, and it turns out we can prove this fact since our -`impl Complete for T` is a blanket impl without any where clauses. - -So both impls are legal and the compiler accepts the program. Moreover, thanks -to the `Complete` blanket impl, all types implement `Complete`. So we could -now use this impl like so: -```rust,ignore -fn eat(x: T) { } - -fn copy_everything(x: T) { - eat(x); - eat(x); -} - -fn main() { - let not_copiable = vec![1, 2, 3, 4]; - copy_everything(not_copiable); -} -``` -In this program, we use the fact that `Vec` implements `Complete`, as any -other type. Hence we can call `copy_everything` with an argument of type -`Vec`. Inside the `copy_everything` function, we have the -`Implemented(T: Complete)` bound in our environment. Thanks to implied bounds, -we can deduce `Implemented(T: Partial)`. Using implied bounds again, we deduce -`Implemented(T: Copy)` and we can indeed call the `eat` function which moves -the argument twice since its argument is `Copy`. Problem: the `T` type was -in fact `Vec` which is not copy at all, hence we will double-free the -underlying vec storage so we have a memory unsoundness in safe Rust. - -Of course, disregarding the asymmetry between `WellFormed` and implied bounds, -this bug was possible only because we had some kind of self-referencing impls. -But self-referencing impls are very useful in practice and are not the real -culprits in this affair. - -[bug]: https://github.com/rust-lang/rust/pull/43786 - -## Co-inductiveness of `WellFormed` - -So the solution is to fix this asymmetry between `WellFormed` and implied -bounds. For that, we need for the `WellFormed` predicate to not only require -that the direct superbounds hold, but also all the bounds transitively implied -by the superbounds. What we can do is to have the following rules for the -`WellFormed` predicate: -```rust,ignore -trait A { } -// WellFormed(Self: A) :- Implemented(Self: A). - -trait B where Self: A { } -// WellFormed(Self: B) :- Implemented(Self: B) && WellFormed(Self: A). - -trait C where Self: B { } -// WellFormed(Self: C) :- Implemented(Self: C) && WellFormed(Self: B). -``` - -Notice that we are now also requiring `Implemented(Self: Trait)` for -`WellFormed(Self: Trait)` to be true: this is to simplify the process of -traversing all the implied bounds transitively. This does not change anything -when checking whether impls are legal, because since we assume -that the where clauses hold inside the impl, we know that the corresponding -trait reference do hold. Thanks to this setup, you can see that we indeed -require to prove the set of all bounds transitively implied by the where -clauses. - -However there is still a catch. Suppose that we have the following trait -definition: -```rust,ignore -trait Foo where ::Item: Foo { - type Item; -} -``` - -so this definition is a bit more involved than the ones we've seen already -because it defines an associated item. However, the well-formedness rule -would not be more complicated: -```text -WellFormed(Self: Foo) :- - Implemented(Self: Foo) && - WellFormed(::Item: Foo). -``` - -Now we would like to write the following impl: -```rust,ignore -impl Foo for i32 { - type Item = i32; -} -``` -The `Foo` trait definition and the `impl Foo for i32` are perfectly valid -Rust: we're kind of recursively using our `Foo` impl in order to show that -the associated value indeed implements `Foo`, but that's ok. But if we -translate this to our well-formedness setting, the compiler proof process -inside the `Foo` impl is the following: it starts with proving that the -well-formedness goal `WellFormed(i32: Foo)` is true. In order to do that, -it must prove the following goals: `Implemented(i32: Foo)` and -`WellFormed(::Item: Foo)`. `Implemented(i32: Foo)` holds because -there is our impl and there are no where clauses on it so it's always true. -However, because of the associated type value we used, -`WellFormed(::Item: Foo)` simplifies to just -`WellFormed(i32: Foo)`. So in order to prove its original goal -`WellFormed(i32: Foo)`, the compiler needs to prove `WellFormed(i32: Foo)`: -this clearly is a cycle and cycles are usually rejected by the trait solver, -unless... if the `WellFormed` predicate was made to be co-inductive. - -A co-inductive predicate, as discussed in the chapter on -[goals and clauses](./goals-and-clauses.md#coinductive-goals), are predicates -for which the -trait solver accepts cycles. In our setting, this would be a valid thing to do: -indeed, the `WellFormed` predicate just serves as a way of enumerating all -the implied bounds. Hence, it's like a fixed point algorithm: it tries to grow -the set of implied bounds until there is nothing more to add. Here, a cycle -in the chain of `WellFormed` predicates just means that there is no more bounds -to add in that direction, so we can just accept this cycle and focus on other -directions. It's easy to prove that under these co-inductive semantics, we -are effectively visiting all the transitive implied bounds, and only these. - -## Implied bounds on types - -We mainly talked about implied bounds for traits because this was the most -subtle regarding implementation. Implied bounds on types are simpler, -especially because if we assume that a type is well-formed, we don't use that -fact to deduce that other types are well-formed, we only use it to deduce -that e.g. some trait bounds hold. - -For types, we just use rules like these ones: -```rust,ignore -struct Type<...> where WC1, ..., WCn { - ... -} -``` - -```text -forall<...> { - WellFormed(Type<...>) :- WC1, ..., WCn. -} - -forall<...> { - FromEnv(WC1) :- FromEnv(Type<...>). - ... - FromEnv(WCn) :- FromEnv(Type<...>). -} -``` -We can see that we have this asymmetry between well-formedness check, -which only verifies that the direct superbounds hold, and implied bounds which -gives access to all bounds transitively implied by the where clauses. In that -case this is ok because as we said, we don't use `FromEnv(Type<...>)` to deduce -other `FromEnv(OtherType<...>)` things, nor do we use `FromEnv(Type: Trait)` to -deduce `FromEnv(OtherType<...>)` things. So in that sense type definitions are -"less recursive" than traits, and we saw in a previous subsection that -it was the combination of asymmetry and recursive trait / impls that led to -unsoundness. As such, the `WellFormed(Type<...>)` predicate does not need -to be co-inductive. - -This asymmetry optimization is useful because in a real Rust program, we have -to check the well-formedness of types very often (e.g. for each type which -appears in the body of a function). diff --git a/src/doc/rustc-dev-guide/src/traits/index.md b/src/doc/rustc-dev-guide/src/traits/index.md deleted file mode 100644 index 5544ce513d..0000000000 --- a/src/doc/rustc-dev-guide/src/traits/index.md +++ /dev/null @@ -1,64 +0,0 @@ -# Trait solving (new-style) - -> 🚧 This chapter describes "new-style" trait solving. This is still in the -> [process of being implemented][wg]; this chapter serves as a kind of -> in-progress design document. If you would prefer to read about how the -> current trait solver works, check out -> [this other chapter](./resolution.html). 🚧 -> -> By the way, if you would like to help in hacking on the new solver, you will -> find instructions for getting involved in the -> [Traits Working Group tracking issue][wg]! - -[wg]: https://github.com/rust-lang/rust/issues/48416 - -The new-style trait solver is based on the work done in [chalk][chalk]. Chalk -recasts Rust's trait system explicitly in terms of logic programming. It does -this by "lowering" Rust code into a kind of logic program we can then execute -queries against. - -You can read more about chalk itself in the -[Overview of Chalk](./chalk-overview.md) section. - -Trait solving in rustc is based around a few key ideas: - -- [Lowering to logic](./lowering-to-logic.html), which expresses - Rust traits in terms of standard logical terms. - - The [goals and clauses](./goals-and-clauses.html) chapter - describes the precise form of rules we use, and - [lowering rules](./lowering-rules.html) gives the complete set of - lowering rules in a more reference-like form. - - [Lazy normalization](./associated-types.html), which is the - technique we use to accommodate associated types when figuring out - whether types are equal. - - [Region constraints](./regions.html), which are accumulated - during trait solving but mostly ignored. This means that trait - solving effectively ignores the precise regions involved, always – - but we still remember the constraints on them so that those - constraints can be checked by the type checker. -- [Canonical queries](./canonical-queries.html), which allow us - to solve trait problems (like "is `Foo` implemented for the type - `Bar`?") once, and then apply that same result independently in many - different inference contexts. - -> This is not a complete list of topics. See the sidebar for more. - -## Ongoing work -The design of the new-style trait solving currently happens in two places: - -**chalk**. The [chalk][chalk] repository is where we experiment with new ideas -and designs for the trait system. It primarily consists of two parts: -* a unit testing framework - for the correctness and feasibility of the logical rules defining the - new-style trait system. -* the [`chalk_engine`][chalk_engine] crate, which - defines the new-style trait solver used both in the unit testing framework - and in rustc. - -**rustc**. Once we are happy with the logical rules, we proceed to -implementing them in rustc. This mainly happens in -[`librustc_traits`][librustc_traits]. - -[chalk]: https://github.com/rust-lang/chalk -[chalk_engine]: https://github.com/rust-lang/chalk/tree/master/chalk-engine -[librustc_traits]: https://github.com/rust-lang/rust/tree/master/src/librustc_traits diff --git a/src/doc/rustc-dev-guide/src/traits/lowering-module.md b/src/doc/rustc-dev-guide/src/traits/lowering-module.md deleted file mode 100644 index 3c5bd7be5d..0000000000 --- a/src/doc/rustc-dev-guide/src/traits/lowering-module.md +++ /dev/null @@ -1,56 +0,0 @@ -# The lowering module in rustc - -The program clauses described in the -[lowering rules](./lowering-rules.html) section are actually -created in the [`rustc_traits::lowering`][lowering] module. - -[lowering]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_traits/lowering/ - -## The `program_clauses_for` query - -The main entry point is the `program_clauses_for` [query], which – -given a `DefId` – produces a set of Chalk program clauses. The -query is invoked on a `DefId` that identifies something like a trait, -an impl, or an associated item definition. It then produces and -returns a vector of program clauses. - -[query]: ../query.html - -## Unit tests - -**Note: We've removed the Chalk unit tests in [rust-lang/rust#69247]. -They will come back once we're ready to integrate next Chalk into rustc.** - -Here's a good example test. At the time of -this writing, it looked like this: - -```rust,ignore -#![feature(rustc_attrs)] - -trait Foo { } - -#[rustc_dump_program_clauses] //~ ERROR program clause dump -impl Foo for T where T: Iterator { } - -fn main() { - println!("hello"); -} -``` - -The `#[rustc_dump_program_clauses]` annotation can be attached to -anything with a `DefId` (It requires the `rustc_attrs` feature). The -compiler will then invoke the `program_clauses_for` query on that -item, and emit compiler errors that dump the clauses produced. These -errors just exist for unit-testing. The stderr will be: - -```text -error: program clause dump - --> $DIR/lower_impl.rs:5:1 - | -LL | #[rustc_dump_program_clauses] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: forall { Implemented(T: Foo) :- ProjectionEq(::Item == i32), TypeOutlives(T: 'static), Implemented(T: std::iter::Iterator), Implemented(T: std::marker::Sized). } -``` - -[rust-lang/rust#69247]: https://github.com/rust-lang/rust/pull/69247 diff --git a/src/doc/rustc-dev-guide/src/traits/lowering-rules.md b/src/doc/rustc-dev-guide/src/traits/lowering-rules.md deleted file mode 100644 index c780e7cf58..0000000000 --- a/src/doc/rustc-dev-guide/src/traits/lowering-rules.md +++ /dev/null @@ -1,416 +0,0 @@ -# Lowering rules - -This section gives the complete lowering rules for Rust traits into -[program clauses][pc]. It is a kind of reference. These rules -reference the [domain goals][dg] defined in an earlier section. - -[pc]: ./goals-and-clauses.html -[dg]: ./goals-and-clauses.html#domain-goals - -## Notation - -The nonterminal `Pi` is used to mean some generic *parameter*, either a -named lifetime like `'a` or a type parameter like `A`. - -The nonterminal `Ai` is used to mean some generic *argument*, which -might be a lifetime like `'a` or a type like `Vec`. - -When defining the lowering rules, we will give goals and clauses in -the [notation given in this section](./goals-and-clauses.html). -We sometimes insert "macros" like `LowerWhereClause!` into these -definitions; these macros reference other sections within this chapter. - -## Rule names and cross-references - -Each of these lowering rules is given a name, documented with a -comment like so: - - // Rule Foo-Bar-Baz - -The reference implementation of these rules is to be found in -[`chalk/chalk-solve/src/clauses.rs`][chalk_rules]. They are also ported in -rustc in the [`librustc_traits`][librustc_traits] crate. - -[chalk_rules]: https://github.com/rust-lang/chalk/blob/master/chalk-solve/src/clauses.rs -[librustc_traits]: https://github.com/rust-lang/rust/tree/master/src/librustc_traits - -## Lowering where clauses - -When used in a goal position, where clauses can be mapped directly to -the `Holds` variant of [domain goals][dg], as follows: - -- `A0: Foo` maps to `Implemented(A0: Foo)` -- `T: 'r` maps to `Outlives(T, 'r)` -- `'a: 'b` maps to `Outlives('a, 'b)` -- `A0: Foo` is a bit special and expands to two distinct - goals, namely `Implemented(A0: Foo)` and - `ProjectionEq(>::Item = T)` - -In the rules below, we will use `WC` to indicate where clauses that -appear in Rust syntax; we will then use the same `WC` to indicate -where those where clauses appear as goals in the program clauses that -we are producing. In that case, the mapping above is used to convert -from the Rust syntax into goals. - -### Transforming the lowered where clauses - -In addition, in the rules below, we sometimes do some transformations -on the lowered where clauses, as defined here: - -- `FromEnv(WC)` – this indicates that: - - `Implemented(TraitRef)` becomes `FromEnv(TraitRef)` - - other where-clauses are left intact -- `WellFormed(WC)` – this indicates that: - - `Implemented(TraitRef)` becomes `WellFormed(TraitRef)` - - other where-clauses are left intact - -*TODO*: I suspect that we want to alter the outlives relations too, -but Chalk isn't modeling those right now. - -## Lowering traits - -Given a trait definition - -```rust,ignore -trait Trait // P0 == Self -where WC -{ - // trait items -} -``` - -we will produce a number of declarations. This section is focused on -the program clauses for the trait header (i.e., the stuff outside the -`{}`); the [section on trait items](#trait-items) covers the stuff -inside the `{}`. - -### Trait header - -From the trait itself we mostly make "meta" rules that setup the -relationships between different kinds of domain goals. The first such -rule from the trait header creates the mapping between the `FromEnv` -and `Implemented` predicates: - -```text -// Rule Implemented-From-Env -forall { - Implemented(Self: Trait) :- FromEnv(Self: Trait) -} -``` - - - -#### Implied bounds - -The next few clauses have to do with implied bounds (see also -[RFC 2089] and the [implied bounds][implied_bounds] chapter for a more in depth -cover). For each trait, we produce two clauses: - -[RFC 2089]: https://rust-lang.github.io/rfcs/2089-implied-bounds.html -[implied_bounds]: ./implied-bounds.md - -```text -// Rule Implied-Bound-From-Trait -// -// For each where clause WC: -forall { - FromEnv(WC) :- FromEnv(Self: Trait) -} -``` - -This clause says that if we are assuming that the trait holds, then we can also -assume that its where-clauses hold. It's perhaps useful to see an example: - -```rust,ignore -trait Eq: PartialEq { ... } -``` - -In this case, the `PartialEq` supertrait is equivalent to a `where -Self: PartialEq` where clause, in our simplified model. The program -clause above therefore states that if we can prove `FromEnv(T: Eq)` – -e.g., if we are in some function with `T: Eq` in its where clauses – -then we also know that `FromEnv(T: PartialEq)`. Thus the set of things -that follow from the environment are not only the **direct where -clauses** but also things that follow from them. - -The next rule is related; it defines what it means for a trait reference -to be **well-formed**: - -```text -// Rule WellFormed-TraitRef -forall { - WellFormed(Self: Trait) :- Implemented(Self: Trait) && WellFormed(WC) -} -``` - -This `WellFormed` rule states that `T: Trait` is well-formed if (a) -`T: Trait` is implemented and (b) all the where-clauses declared on -`Trait` are well-formed (and hence they are implemented). Remember -that the `WellFormed` predicate is -[coinductive](./goals-and-clauses.html#coinductive); in this -case, it is serving as a kind of "carrier" that allows us to enumerate -all the where clauses that are transitively implied by `T: Trait`. - -An example: - -```rust,ignore -trait Foo: A + Bar { } -trait Bar: B + Foo { } -trait A { } -trait B { } -``` - -Here, the transitive set of implications for `T: Foo` are `T: A`, `T: Bar`, and -`T: B`. And indeed if we were to try to prove `WellFormed(T: Foo)`, we would -have to prove each one of those: - -- `WellFormed(T: Foo)` - - `Implemented(T: Foo)` - - `WellFormed(T: A)` - - `Implemented(T: A)` - - `WellFormed(T: Bar)` - - `Implemented(T: Bar)` - - `WellFormed(T: B)` - - `Implemented(T: Bar)` - - `WellFormed(T: Foo)` -- cycle, true coinductively - -This `WellFormed` predicate is only used when proving that impls are -well-formed – basically, for each impl of some trait ref `TraitRef`, -we must show that `WellFormed(TraitRef)`. This in turn justifies the -implied bounds rules that allow us to extend the set of `FromEnv` -items. - -## Lowering type definitions - -We also want to have some rules which define when a type is well-formed. -For example, given this type: - -```rust,ignore -struct Set where K: Hash { ... } -``` - -then `Set` is well-formed because `i32` implements `Hash`, but -`Set` would not be well-formed. Basically, a type is well-formed -if its parameters verify the where clauses written on the type definition. - -Hence, for every type definition: - -```rust, ignore -struct Type where WC { ... } -``` - -we produce the following rule: - -```text -// Rule WellFormed-Type -forall { - WellFormed(Type) :- WC -} -``` - -Note that we use `struct` for defining a type, but this should be understood -as a general type definition (it could be e.g. a generic `enum`). - -Conversely, we define rules which say that if we assume that a type is -well-formed, we can also assume that its where clauses hold. That is, -we produce the following family of rules: - -```text -// Rule Implied-Bound-From-Type -// -// For each where clause `WC` -forall { - FromEnv(WC) :- FromEnv(Type) -} -``` - -As for the implied bounds RFC, functions will *assume* that their arguments -are well-formed. For example, suppose we have the following bit of code: - -```rust,ignore -trait Hash: Eq { } -struct Set { ... } - -fn foo(collection: Set, x: K, y: K) { - // `x` and `y` can be equalized even if we did not explicitly write - // `where K: Eq` - if x == y { - ... - } -} -``` - -In the `foo` function, we assume that `Set` is well-formed, i.e. we have -`FromEnv(Set)` in our environment. Because of the previous rule, we get - `FromEnv(K: Hash)` without needing an explicit where clause. And because -of the `Hash` trait definition, there also exists a rule which says: - -```text -forall { - FromEnv(K: Eq) :- FromEnv(K: Hash) -} -``` - -which means that we finally get `FromEnv(K: Eq)` and then can compare `x` -and `y` without needing an explicit where clause. - - - -## Lowering trait items - -### Associated type declarations - -Given a trait that declares a (possibly generic) associated type: - -```rust,ignore -trait Trait // P0 == Self -where WC -{ - type AssocType: Bounds where WC1; -} -``` - -We will produce a number of program clauses. The first two define -the rules by which `ProjectionEq` can succeed; these two clauses are discussed -in detail in the [section on associated types](./associated-types.html), -but reproduced here for reference: - -```text -// Rule ProjectionEq-Normalize -// -// ProjectionEq can succeed by normalizing: -forall { - ProjectionEq(>::AssocType = U) :- - Normalize(>::AssocType -> U) -} -``` - -```text -// Rule ProjectionEq-Placeholder -// -// ProjectionEq can succeed through the placeholder associated type, -// see "associated type" chapter for more: -forall { - ProjectionEq( - >::AssocType = - (Trait::AssocType) - ) -} -``` - -The next rule covers implied bounds for the projection. In particular, -the `Bounds` declared on the associated type must have been proven to hold -to show that the impl is well-formed, and hence we can rely on them -elsewhere. - -```text -// Rule Implied-Bound-From-AssocTy -// -// For each `Bound` in `Bounds`: -forall { - FromEnv(>::AssocType>: Bound) :- - FromEnv(Self: Trait) && WC1 -} -``` - -Next, we define the requirements for an instantiation of our associated -type to be well-formed... - -```text -// Rule WellFormed-AssocTy -forall { - WellFormed((Trait::AssocType)) :- - Implemented(Self: Trait) && WC1 -} -``` - -...along with the reverse implications, when we can assume that it is -well-formed. - -```text -// Rule Implied-WC-From-AssocTy -// -// For each where clause WC1: -forall { - FromEnv(WC1) :- FromEnv((Trait::AssocType)) -} -``` - -```text -// Rule Implied-Trait-From-AssocTy -forall { - FromEnv(Self: Trait) :- - FromEnv((Trait::AssocType)) -} -``` - -### Lowering function and constant declarations - -Chalk didn't model functions and constants, but I would eventually like to -treat them exactly like normalization. See [the section on function/constant -values below](#constant-vals) for more details. - -## Lowering impls - -Given an impl of a trait: - -```rust,ignore -impl Trait for A0 -where WC -{ - // zero or more impl items -} -``` - -Let `TraitRef` be the trait reference `A0: Trait`. Then we -will create the following rules: - -```text -// Rule Implemented-From-Impl -forall { - Implemented(TraitRef) :- WC -} -``` - -In addition, we will lower all of the *impl items*. - -## Lowering impl items - -### Associated type values - -Given an impl that contains: - -```rust,ignore -impl Trait for P0 -where WC_impl -{ - type AssocType = T; -} -``` - -and our where clause `WC1` on the trait associated type from above, we -produce the following rule: - -```text -// Rule Normalize-From-Impl -forall { - forall { - Normalize(>::AssocType -> T) :- - Implemented(P0 as Trait) && WC1 - } -} -``` - -Note that `WC_impl` and `WC1` both encode where-clauses that the impl can -rely on. (`WC_impl` is not used here, because it is implied by -`Implemented(P0 as Trait)`.) - - - -### Function and constant values - -Chalk didn't model functions and constants, but I would eventually -like to treat them exactly like normalization. This presumably -involves adding a new kind of parameter (constant), and then having a -`NormalizeValue` domain goal. This is *to be written* because the -details are a bit up in the air. diff --git a/src/doc/rustc-dev-guide/src/traits/lowering-to-logic.md b/src/doc/rustc-dev-guide/src/traits/lowering-to-logic.md index e1a6c1361c..1248d43461 100644 --- a/src/doc/rustc-dev-guide/src/traits/lowering-to-logic.md +++ b/src/doc/rustc-dev-guide/src/traits/lowering-to-logic.md @@ -1,5 +1,7 @@ # Lowering to logic + + The key observation here is that the Rust trait system is basically a kind of logic, and it can be mapped onto standard logical inference rules. We can then look for solutions to those inference rules in a @@ -168,10 +170,10 @@ the body". But it's nice to know the proper name, because there is a lot of work describing how to efficiently handle FOHH clauses; see for example Gopalan Nadathur's excellent ["A Proof Procedure for the Logic of Hereditary Harrop Formulas"][pphhf] -in [the bibliography]. +in [the bibliography of Chalk Book][bibliography]. -[the bibliography]: ./bibliography.html -[pphhf]: ./bibliography.html#pphhf +[bibliography]: https://rust-lang.github.io/chalk/book/bibliography.html +[pphhf]: https://rust-lang.github.io/chalk/book/bibliography.html#pphhf It turns out that supporting FOHH is not really all that hard. And once we are able to do that, we can easily describe the type-checking diff --git a/src/doc/rustc-dev-guide/src/traits/regions.md b/src/doc/rustc-dev-guide/src/traits/regions.md deleted file mode 100644 index 4657529dc2..0000000000 --- a/src/doc/rustc-dev-guide/src/traits/regions.md +++ /dev/null @@ -1,9 +0,0 @@ -# Region constraints - -*To be written.* - -Chalk does not have the concept of region constraints, and as of this -writing, work on rustc was not far enough to worry about them. - -In the meantime, you can read about region constraints in the -[type inference](../type-inference.html#region-constraints) section. diff --git a/src/doc/rustc-dev-guide/src/traits/resolution.md b/src/doc/rustc-dev-guide/src/traits/resolution.md index 2ba4516779..70b53e9105 100644 --- a/src/doc/rustc-dev-guide/src/traits/resolution.md +++ b/src/doc/rustc-dev-guide/src/traits/resolution.md @@ -1,12 +1,14 @@ # Trait resolution (old-style) + + This chapter describes the general process of _trait resolution_ and points out some non-obvious things. **Note:** This chapter (and its subchapters) describe how the trait solver **currently** works. However, we are in the process of designing a new trait solver. If you'd prefer to read about *that*, -see [*this* traits chapter](./index.html). +see [*this* subchapter](./chalk.html). ## Major concepts @@ -116,11 +118,11 @@ candidate that is definitively applicable. In some cases, we may not know whether an impl/where-clause applies or not – this occurs when the obligation contains unbound inference variables. -The subroutines that decide whether a particular impl/where-clause/etc -applies to a particular obligation are collectively referred to as the -process of _matching_. At the moment, this amounts to -unifying the `Self` types, but in the future we may also recursively -consider some of the nested obligations, in the case of an impl. +The subroutines that decide whether a particular impl/where-clause/etc applies +to a particular obligation are collectively referred to as the process of +_matching_. As of January 2021, this amounts to unifying +the `Self` types, but in the future we may also recursively consider some of the +nested obligations, in the case of an impl. **TODO**: what does "unifying the `Self` types" mean? The `Self` of the obligation with that of an impl? @@ -191,12 +193,16 @@ trait Get { fn get(&self) -> Self; } -impl Get for T { - fn get(&self) -> T { *self } +impl Get for T { + fn get(&self) -> T { + *self + } } -impl Get for Box { - fn get(&self) -> Box { Box::new(get_it(&**self)) } +impl Get for Box { + fn get(&self) -> Box { + Box::new(::get(self)) + } } ``` diff --git a/src/doc/rustc-dev-guide/src/traits/slg.md b/src/doc/rustc-dev-guide/src/traits/slg.md deleted file mode 100644 index 74ec89fa02..0000000000 --- a/src/doc/rustc-dev-guide/src/traits/slg.md +++ /dev/null @@ -1,302 +0,0 @@ -# The On-Demand SLG solver - -Given a set of program clauses (provided by our [lowering rules][lowering]) -and a query, we need to return the result of the query and the value of any -type variables we can determine. This is the job of the solver. - -For example, `exists { Vec: FromIterator }` has one solution, so -its result is `Unique; substitution [?T := u32]`. A solution also comes with -a set of region constraints, which we'll ignore in this introduction. - -[lowering]: ./lowering-rules.html - -## Goals of the Solver - -### On demand - -There are often many, or even infinitely many, solutions to a query. For -example, say we want to prove that `exists { Vec: Debug }` for _some_ -type `?T`. Our solver should be capable of yielding one answer at a time, say -`?T = u32`, then `?T = i32`, and so on, rather than iterating over every type -in the type system. If we need more answers, we can request more until we are -done. This is similar to how Prolog works. - -*See also: [The traditional, interactive Prolog query][pq]* - -[pq]: ./canonical-queries.html#the-traditional-interactive-prolog-query - -### Breadth-first - -`Vec: Debug` is true if `?T: Debug`. This leads to a cycle: `[Vec, -Vec>, Vec>>]`, and so on all implement `Debug`. Our -solver ought to be breadth first and consider answers like `[Vec: Debug, -Vec: Debug, ...]` before it recurses, or we may never find the answer -we're looking for. - -### Cachable - -To speed up compilation, we need to cache results, including partial results -left over from past solver queries. - -## Description of how it works - -The basis of the solver is the [`Forest`] type. A *forest* stores a -collection of *tables* as well as a *stack*. Each *table* represents -the stored results of a particular query that is being performed, as -well as the various *strands*, which are basically suspended -computations that may be used to find more answers. Tables are -interdependent: solving one query may require solving others. - -[`Forest`]: https://rust-lang.github.io/chalk/chalk_engine/forest/struct.Forest.html - -### Walkthrough - -Perhaps the easiest way to explain how the solver works is to walk -through an example. Let's imagine that we have the following program: - -```rust,ignore -trait Debug { } - -struct u32 { } -impl Debug for u32 { } - -struct Rc { } -impl Debug for Rc { } - -struct Vec { } -impl Debug for Vec { } -``` - -Now imagine that we want to find answers for the query `exists { Rc: -Debug }`. The first step would be to u-canonicalize this query; this is the -act of giving canonical names to all the unbound inference variables based on -the order of their left-most appearance, as well as canonicalizing the -universes of any universally bound names (e.g., the `T` in `forall { ... -}`). In this case, there are no universally bound names, but the canonical -form Q of the query might look something like: - -```text -Rc: Debug -``` - -where `?0` is a variable in the root universe U0. We would then go and -look for a table with this canonical query as the key: since the forest is -empty, this lookup will fail, and we will create a new table T0, -corresponding to the u-canonical goal Q. - -**Ignoring negative reasoning and regions.** To start, we'll ignore -the possibility of negative goals like `not { Foo }`. We'll phase them -in later, as they bring several complications. - -**Creating a table.** When we first create a table, we also initialize -it with a set of *initial strands*. A "strand" is kind of like a -"thread" for the solver: it contains a particular way to produce an -answer. The initial set of strands for a goal like `Rc: Debug` -(i.e., a "domain goal") is determined by looking for *clauses* in the -environment. In Rust, these clauses derive from impls, but also from -where-clauses that are in scope. In the case of our example, there -would be three clauses, each coming from the program. Using a -Prolog-like notation, these look like: - -```text -(u32: Debug). -(Rc: Debug) :- (T: Debug). -(Vec: Debug) :- (T: Debug). -``` - -To create our initial strands, then, we will try to apply each of -these clauses to our goal of `Rc: Debug`. The first and third -clauses are inapplicable because `u32` and `Vec` cannot be unified -with `Rc`. The second clause, however, will work. - -**What is a strand?** Let's talk a bit more about what a strand *is*. In the code, a strand -is the combination of an inference table, an _X-clause_, and (possibly) -a selected subgoal from that X-clause. But what is an X-clause -([`ExClause`], in the code)? An X-clause pulls together a few things: - -- The current state of the goal we are trying to prove; -- A set of subgoals that have yet to be proven; -- There are also a few things we're ignoring for now: - - delayed literals, region constraints - -The general form of an X-clause is written much like a Prolog clause, -but with somewhat different semantics. Since we're ignoring delayed -literals and region constraints, an X-clause just looks like this: - -```text -G :- L -``` - -where G is a goal and L is a set of subgoals that must be proven. -(The L stands for *literal* -- when we address negative reasoning, a -literal will be either a positive or negative subgoal.) The idea is -that if we are able to prove L then the goal G can be considered true. - -In the case of our example, we would wind up creating one strand, with -an X-clause like so: - -```text -(Rc: Debug) :- (?T: Debug) -``` - -Here, the `?T` refers to one of the inference variables created in the -inference table that accompanies the strand. (I'll use named variables -to refer to inference variables, and numbered variables like `?0` to -refer to variables in a canonicalized goal; in the code, however, they -are both represented with an index.) - -For each strand, we also optionally store a *selected subgoal*. This -is the subgoal after the turnstile (`:-`) that we are currently trying -to prove in this strand. Initially, when a strand is first created, -there is no selected subgoal. - -[`ExClause`]: https://rust-lang.github.io/chalk/chalk_engine/struct.ExClause.html - -**Activating a strand.** Now that we have created the table T0 and -initialized it with strands, we have to actually try and produce an answer. -We do this by invoking the [`ensure_root_answer`] operation on the table: -specifically, we say `ensure_root_answer(T0, A0)`, meaning "ensure that there -is a 0th answer A0 to query T0". - -Remember that tables store not only strands, but also a vector of cached -answers. The first thing that [`ensure_root_answer`] does is to check whether -answer A0 is in this vector. If so, we can just return immediately. In this -case, the vector will be empty, and hence that does not apply (this becomes -important for cyclic checks later on). - -When there is no cached answer, [`ensure_root_answer`] will try to produce one. -It does this by selecting a strand from the set of active strands -- the -strands are stored in a `VecDeque` and hence processed in a round-robin -fashion. Right now, we have only one strand, storing the following X-clause -with no selected subgoal: - -```text -(Rc: Debug) :- (?T: Debug) -``` - -When we activate the strand, we see that we have no selected subgoal, -and so we first pick one of the subgoals to process. Here, there is only -one (`?T: Debug`), so that becomes the selected subgoal, changing -the state of the strand to: - -```text -(Rc: Debug) :- selected(?T: Debug, A0) -``` - -Here, we write `selected(L, An)` to indicate that (a) the literal `L` -is the selected subgoal and (b) which answer `An` we are looking for. We -start out looking for `A0`. - -[`ensure_root_answer`]: https://rust-lang.github.io/chalk/chalk_engine/forest/struct.Forest.html#method.ensure_root_answer - -**Processing the selected subgoal.** Next, we have to try and find an -answer to this selected goal. To do that, we will u-canonicalize it -and try to find an associated table. In this case, the u-canonical -form of the subgoal is `?0: Debug`: we don't have a table yet for -that, so we can create a new one, T1. As before, we'll initialize T1 -with strands. In this case, there will be three strands, because all -the program clauses are potentially applicable. Those three strands -will be: - -- `(u32: Debug) :-`, derived from the program clause `(u32: Debug).`. - - Note: This strand has no subgoals. -- `(Vec: Debug) :- (?U: Debug)`, derived from the `Vec` impl. -- `(Rc: Debug) :- (?U: Debug)`, derived from the `Rc` impl. - -We can thus summarize the state of the whole forest at this point as -follows: - -```text -Table T0 [Rc: Debug] - Strands: - (Rc: Debug) :- selected(?T: Debug, A0) - -Table T1 [?0: Debug] - Strands: - (u32: Debug) :- - (Vec: Debug) :- (?U: Debug) - (Rc: Debug) :- (?V: Debug) -``` - -**Delegation between tables.** Now that the active strand from T0 has -created the table T1, it can try to extract an answer. It does this -via that same `ensure_answer` operation we saw before. In this case, -the strand would invoke `ensure_answer(T1, A0)`, since we will start -with the first answer. This will cause T1 to activate its first -strand, `u32: Debug :-`. - -This strand is somewhat special: it has no subgoals at all. This means -that the goal is proven. We can therefore add `u32: Debug` to the set -of *answers* for our table, calling it answer A0 (it is the first -answer). The strand is then removed from the list of strands. - -The state of table T1 is therefore: - -```text -Table T1 [?0: Debug] - Answers: - A0 = [?0 = u32] - Strand: - (Vec: Debug) :- (?U: Debug) - (Rc: Debug) :- (?V: Debug) -``` - -Note that I am writing out the answer A0 as a substitution that can be -applied to the table goal; actually, in the code, the goals for each -X-clause are also represented as substitutions, but in this exposition -I've chosen to write them as full goals, following [NFTD]. - -[NFTD]: ./bibliography.html#slg - -Since we now have an answer, `ensure_answer(T1, A0)` will return `Ok` -to the table T0, indicating that answer A0 is available. T0 now has -the job of incorporating that result into its active strand. It does -this in two ways. First, it creates a new strand that is looking for -the next possible answer of T1. Next, it incorpoates the answer from -A0 and removes the subgoal. The resulting state of table T0 is: - -```text -Table T0 [Rc: Debug] - Strands: - (Rc: Debug) :- selected(?T: Debug, A1) - (Rc: Debug) :- -``` - -We then immediately activate the strand that incorporated the answer -(the `Rc: Debug` one). In this case, that strand has no further -subgoals, so it becomes an answer to the table T0. This answer can -then be returned up to our caller, and the whole forest goes quiescent -at this point (remember, we only do enough work to generate *one* -answer). The ending state of the forest at this point will be: - -```text -Table T0 [Rc: Debug] - Answer: - A0 = [?0 = u32] - Strands: - (Rc: Debug) :- selected(?T: Debug, A1) - -Table T1 [?0: Debug] - Answers: - A0 = [?0 = u32] - Strand: - (Vec: Debug) :- (?U: Debug) - (Rc: Debug) :- (?V: Debug) -``` - -Here you can see how the forest captures both the answers we have -created thus far *and* the strands that will let us try to produce -more answers later on. - -## See also - -- [chalk_solve README][readme], which contains links to papers used and - acronyms referenced in the code -- This section is a lightly adapted version of the blog post [An on-demand - SLG solver for chalk][slg-blog] -- [Negative Reasoning in Chalk][negative-reasoning-blog] explains the need - for negative reasoning, but not how the SLG solver does it - -[readme]: https://github.com/rust-lang/chalk/blob/239e4ae4e69b2785b5f99e0f2b41fc16b0b4e65e/chalk-engine/src/README.md -[slg-blog]: http://smallcultfollowing.com/babysteps/blog/2018/01/31/an-on-demand-slg-solver-for-chalk/ -[negative-reasoning-blog]: https://aturon.github.io/blog/2017/04/24/negative-chalk/ diff --git a/src/doc/rustc-dev-guide/src/traits/wf.md b/src/doc/rustc-dev-guide/src/traits/wf.md deleted file mode 100644 index aa17f8c2c6..0000000000 --- a/src/doc/rustc-dev-guide/src/traits/wf.md +++ /dev/null @@ -1,469 +0,0 @@ -# Well-formedness checking - -WF checking has the job of checking that the various declarations in a Rust -program are well-formed. This is the basis for implied bounds, and partly for -that reason, this checking can be surprisingly subtle! For example, we -have to be sure that each impl proves the WF conditions declared on -the trait. - -For each declaration in a Rust program, we will generate a logical goal and try -to prove it using the lowered rules we described in the -[lowering rules](./lowering-rules.md) chapter. If we are able to prove it, we -say that the construct is well-formed. If not, we report an error to the user. - -Well-formedness checking happens in the [`chalk/chalk-solve/src/wf.rs`][wf] -module in chalk. After you have read this chapter, you may find useful to see -an extended set of examples in the [`chalk/tests/test/wf_lowering.rs`][wf_test] submodule. - -The new-style WF checking has not been implemented in rustc yet. - -[wf]: https://github.com/rust-lang/chalk/blob/master/chalk-solve/src/wf.rs -[wf_test]: https://github.com/rust-lang/chalk/blob/master/tests/test/wf_lowering.rs - -We give here a complete reference of the generated goals for each Rust -declaration. - -In addition to the notations introduced in the chapter about -lowering rules, we'll introduce another notation: when checking WF of a -declaration, we'll often have to prove that all types that appear are -well-formed, except type parameters that we always assume to be WF. Hence, -we'll use the following notation: for a type `SomeType<...>`, we define -`InputTypes(SomeType<...>)` to be the set of all non-parameter types appearing -in `SomeType<...>`, including `SomeType<...>` itself. - -Examples: -* `InputTypes((u32, f32)) = [u32, f32, (u32, f32)]` -* `InputTypes(Box) = [Box]` (assuming that `T` is a type parameter) -* `InputTypes(Box>) = [Box, Box>]` - -We also extend the `InputTypes` notation to where clauses in the natural way. -So, for example `InputTypes(A0: Trait)` is the union of -`InputTypes(A0)`, `InputTypes(A1)`, ..., `InputTypes(An)`. - -# Type definitions - -Given a general type definition: -```rust,ignore -struct Type where WC_type { - field1: A1, - ... - fieldn: An, -} -``` - -we generate the following goal, which represents its well-formedness condition: -```text -forall { - if (FromEnv(WC_type)) { - WellFormed(InputTypes(WC_type)) && - WellFormed(InputTypes(A1)) && - ... - WellFormed(InputTypes(An)) - } -} -``` - -which in English states: assuming that the where clauses defined on the type -hold, prove that every type appearing in the type definition is well-formed. - -Some examples: -```rust,ignore -struct OnlyClone where T: Clone { - clonable: T, -} -// The only types appearing are type parameters: we have nothing to check, -// the type definition is well-formed. -``` - -```rust,ignore -struct Foo where T: Clone { - foo: OnlyClone, -} -// The only non-parameter type which appears in this definition is -// `OnlyClone`. The generated goal is the following: -// ``` -// forall { -// if (FromEnv(T: Clone)) { -// WellFormed(OnlyClone) -// } -// } -// ``` -// which is provable. -``` - -```rust,ignore -struct Bar where ::Item: Debug { - bar: i32, -} -// The only non-parameter types which appear in this definition are -// `::Item` and `i32`. The generated goal is the following: -// ``` -// forall { -// if (FromEnv(::Item: Debug)) { -// WellFormed(::Item) && -// WellFormed(i32) -// } -// } -// ``` -// which is not provable since `WellFormed(::Item)` requires -// proving `Implemented(T: Iterator)`, and we are unable to prove that for an -// unknown `T`. -// -// Hence, this type definition is considered illegal. An additional -// `where T: Iterator` would make it legal. -``` - -# Trait definitions - -Given a general trait definition: -```rust,ignore -trait Trait where WC_trait { - type Assoc: Bounds_assoc where WC_assoc; -} -``` - -we generate the following goal: -```text -forall { - if (FromEnv(WC_trait)) { - WellFormed(InputTypes(WC_trait)) && - - forall { - if (FromEnv(WC_assoc)) { - WellFormed(InputTypes(Bounds_assoc)) && - WellFormed(InputTypes(WC_assoc)) - } - } - } -} -``` - -There is not much to verify in a trait definition. We just want -to prove that the types appearing in the trait definition are well-formed, -under the assumption that the different where clauses hold. - -Some examples: -```rust,ignore -trait Foo where T: Iterator, ::Item: Debug { - ... -} -// The only non-parameter type which appears in this definition is -// `::Item`. The generated goal is the following: -// ``` -// forall { -// if (FromEnv(T: Iterator), FromEnv(::Item: Debug)) { -// WellFormed(::Item) -// } -// } -// ``` -// which is provable thanks to the `FromEnv(T: Iterator)` assumption. -``` - -```rust,ignore -trait Bar { - type Assoc: From<::Item>; -} -// The only non-parameter type which appears in this definition is -// `::Item`. The generated goal is the following: -// ``` -// forall { -// WellFormed(::Item) -// } -// ``` -// which is not provable, hence the trait definition is considered illegal. -``` - -```rust,ignore -trait Baz { - type Assoc: From<::Item> where T: Iterator; -} -// The generated goal is now: -// ``` -// forall { -// if (FromEnv(T: Iterator)) { -// WellFormed(::Item) -// } -// } -// ``` -// which is now provable. -``` - -# Impls - -Now we give ourselves a general impl for the trait defined above: -```rust,ignore -impl Trait for SomeType where WC_impl { - type Assoc = SomeValue where WC_assoc; -} -``` - -Note that here, `WC_assoc` are the same where clauses as those defined on the -associated type definition in the trait declaration, *except* that type -parameters from the trait are substituted with values provided by the impl -(see example below). You cannot add new where clauses. You may omit to write -the where clauses if you want to emphasize the fact that you are actually not -relying on them. - -Some examples to illustrate that: -```rust,ignore -trait Foo { - type Assoc where T: Clone; -} - -struct OnlyClone { ... } - -impl Foo> for () { - // We substitute type parameters from the trait by the ones provided - // by the impl, that is instead of having a `T: Clone` where clause, - // we have an `Option: Clone` one. - type Assoc = OnlyClone> where Option: Clone; -} - -impl Foo for i32 { - // I'm not using the `T: Clone` where clause from the trait, so I can - // omit it. - type Assoc = u32; -} - -impl Foo for f32 { - type Assoc = OnlyClone> where Option: Clone; - // ^^^^^^^^^^^^^^^^^^^^^^ - // this where clause does not exist - // on the original trait decl: illegal -} -``` - -> So in Rust, where clauses on associated types work *exactly* like where -> clauses on trait methods: in an impl, we must substitute the parameters from -> the traits with values provided by the impl, we may omit them if we don't -> need them, but we cannot add new where clauses. - -Now let's see the generated goal for this general impl: -```text -forall { - // Well-formedness of types appearing in the impl - if (FromEnv(WC_impl), FromEnv(InputTypes(SomeType: Trait))) { - WellFormed(InputTypes(WC_impl)) && - - forall { - if (FromEnv(WC_assoc)) { - WellFormed(InputTypes(SomeValue)) - } - } - } - - // Implied bounds checking - if (FromEnv(WC_impl), FromEnv(InputTypes(SomeType: Trait))) { - WellFormed(SomeType: Trait) && - - forall { - if (FromEnv(WC_assoc)) { - WellFormed(SomeValue: Bounds_assoc) - } - } - } -} -``` - -Here is the most complex goal. As always, first, assuming that -the various where clauses hold, we prove that every type appearing in the impl -is well-formed, ***except*** types appearing in the impl header -`SomeType: Trait`. Instead, we *assume* that those types are -well-formed -(hence the `if (FromEnv(InputTypes(SomeType: Trait)))` -conditions). This is -part of the implied bounds proposal, so that we can rely on the bounds -written on the definition of e.g. the `SomeType` type (and that we don't -need to repeat those bounds). -> Note that we don't need to check well-formedness of types appearing in -> `WC_assoc` because we already did that in the trait decl (they are just -> repeated with some substitutions of values which we already assume to be -> well-formed) - -Next, still assuming that the where clauses on the impl `WC_impl` hold and that -the input types of `SomeType` are well-formed, we prove that -`WellFormed(SomeType: Trait)` hold. That is, we want to prove -that `SomeType` verify all the where clauses that might transitively -be required by the `Trait` definition (see -[this subsection](./implied-bounds.md#co-inductiveness-of-wellformed)). - -Lastly, assuming in addition that the where clauses on the associated type -`WC_assoc` hold, -we prove that `WellFormed(SomeValue: Bounds_assoc)` hold. Again, we are -not only proving `Implemented(SomeValue: Bounds_assoc)`, but also -all the facts that might transitively come from `Bounds_assoc`. We must do this -because we allow the use of implied bounds on associated types: if we have -`FromEnv(SomeType: Trait)` in our environment, the lowering rules -chapter indicates that we are able to deduce -`FromEnv(::Assoc: Bounds_assoc)` without knowing what the -precise value of `::Assoc` is. - -Some examples for the generated goal: -```rust,ignore -// Trait Program Clauses - -// These are program clauses that come from the trait definitions below -// and that the trait solver can use for its reasonings. I'm just restating -// them here so that we have them in mind. - -trait Copy { } -// This is a program clause that comes from the trait definition above -// and that the trait solver can use for its reasonings. I'm just restating -// it here (and also the few other ones coming just after) so that we have -// them in mind. -// `WellFormed(Self: Copy) :- Implemented(Self: Copy).` - -trait Partial where Self: Copy { } -// ``` -// WellFormed(Self: Partial) :- -// Implemented(Self: Partial) && -// WellFormed(Self: Copy). -// ``` - -trait Complete where Self: Partial { } -// ``` -// WellFormed(Self: Complete) :- -// Implemented(Self: Complete) && -// WellFormed(Self: Partial). -// ``` - -// Impl WF Goals - -impl Partial for T where T: Complete { } -// The generated goal is: -// ``` -// forall { -// if (FromEnv(T: Complete)) { -// WellFormed(T: Partial) -// } -// } -// ``` -// Then proving `WellFormed(T: Partial)` amounts to proving -// `Implemented(T: Partial)` and `Implemented(T: Copy)`. -// Both those facts can be deduced from the `FromEnv(T: Complete)` in our -// environment: this impl is legal. - -impl Complete for T { } -// The generated goal is: -// ``` -// forall { -// WellFormed(T: Complete) -// } -// ``` -// Then proving `WellFormed(T: Complete)` amounts to proving -// `Implemented(T: Complete)`, `Implemented(T: Partial)` and -// `Implemented(T: Copy)`. -// -// `Implemented(T: Complete)` can be proved thanks to the -// `impl Complete for T` blanket impl. -// -// `Implemented(T: Partial)` can be proved thanks to the -// `impl Partial for T where T: Complete` impl and because we know -// `T: Complete` holds. - -// However, `Implemented(T: Copy)` cannot be proved: the impl is illegal. -// An additional `where T: Copy` bound would be sufficient to make that impl -// legal. -``` - -```rust,ignore -trait Bar { } - -impl Bar for T where ::Item: Bar { } -// We have a non-parameter type appearing in the where clauses: -// `::Item`. The generated goal is: -// ``` -// forall { -// if (FromEnv(::Item: Bar)) { -// WellFormed(T: Bar) && -// WellFormed(::Item: Bar) -// } -// } -// ``` -// And `WellFormed(::Item: Bar)` is not provable: we'd need -// an additional `where T: Iterator` for example. -``` - -```rust,ignore -trait Foo { } - -trait Bar { - type Item: Foo; -} - -struct Stuff { } - -impl Bar for Stuff where T: Foo { - type Item = T; -} -// The generated goal is: -// ``` -// forall { -// if (FromEnv(T: Foo)) { -// WellFormed(T: Foo). -// } -// } -// ``` -// which is provable. -``` - -```rust,ignore -trait Debug { ... } -// `WellFormed(Self: Debug) :- Implemented(Self: Debug).` - -struct Box { ... } -impl Debug for Box where T: Debug { ... } - -trait PointerFamily { - type Pointer: Debug where T: Debug; -} -// `WellFormed(Self: PointerFamily) :- Implemented(Self: PointerFamily).` - -struct BoxFamily; - -impl PointerFamily for BoxFamily { - type Pointer = Box where T: Debug; -} -// The generated goal is: -// ``` -// forall { -// WellFormed(BoxFamily: PointerFamily) && -// -// if (FromEnv(T: Debug)) { -// WellFormed(Box: Debug) && -// WellFormed(Box) -// } -// } -// ``` -// `WellFormed(BoxFamily: PointerFamily)` amounts to proving -// `Implemented(BoxFamily: PointerFamily)`, which is ok thanks to our impl. -// -// `WellFormed(Box)` is always true (there are no where clauses on the -// `Box` type definition). -// -// Moreover, we have an `impl Debug for Box`, hence -// we can prove `WellFormed(Box: Debug)` and the impl is indeed legal. -``` - -```rust,ignore -trait Foo { - type Assoc; -} - -struct OnlyClone { ... } - -impl Foo for i32 { - type Assoc = OnlyClone; -} -// The generated goal is: -// ``` -// forall { -// WellFormed(i32: Foo) && -// WellFormed(OnlyClone) -// } -// ``` -// however `WellFormed(OnlyClone)` is not provable because it requires -// `Implemented(T: Clone)`. It would be tempting to just add a `where T: Clone` -// bound inside the `impl Foo for i32` block, however we saw that it was -// illegal to add where clauses that didn't come from the trait definition. -``` diff --git a/src/doc/rustc-dev-guide/src/ty-fold.md b/src/doc/rustc-dev-guide/src/ty-fold.md index 5b409e8eca..c390597f9a 100644 --- a/src/doc/rustc-dev-guide/src/ty-fold.md +++ b/src/doc/rustc-dev-guide/src/ty-fold.md @@ -90,7 +90,7 @@ things. We only want to do something when we reach a type. That means there may 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). +[here](https://github.com/rust-lang/rust/blob/master/compiler/rustc_macros/src/type_foldable.rs). **`subst`** In the case of substitutions the [actual folder](https://github.com/rust-lang/rust/blob/75ff3110ac6d8a0259023b83fd20d7ab295f8dd6/src/librustc_middle/ty/subst.rs#L440-L451) diff --git a/src/doc/rustc-dev-guide/src/ty.md b/src/doc/rustc-dev-guide/src/ty.md index 76e71584fd..9ee2ccfe2d 100644 --- a/src/doc/rustc-dev-guide/src/ty.md +++ b/src/doc/rustc-dev-guide/src/ty.md @@ -1,5 +1,7 @@ # 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. @@ -10,7 +12,7 @@ quite a few modules and types for `Ty` in the compiler ([Ty documentation][ty]). [ty]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/index.html -The specific `Ty` we are referring to is [`rustc::ty::Ty`][ty_ty] (and not +The specific `Ty` we are referring to is [`rustc_middle::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`. @@ -29,7 +31,7 @@ In contrast, `ty::Ty` represents the semantics of a type, that is, the *meaning* 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 +**Example: `fn foo(x: u32) → u32 { x }`** 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 @@ -37,10 +39,10 @@ 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 +**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)`. +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 @@ -63,10 +65,10 @@ Here is a summary: 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 +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"?. +this function expect?" [astconv]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_typeck/astconv/index.html @@ -79,20 +81,20 @@ They are syntactically two strings: `"u32"` at line N column 20 and `"u32"` at l 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)`. +Consider another example: `fn foo(x: T) -> u32`. 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`). +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 } + pub fn foo(x: X) -> u32 { 22 } } mod b { type X = i32; @@ -107,13 +109,15 @@ 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. +[`rustc_middle::ty::Ty`][ty_ty] is actually a type alias to [`&TyS`][tys]. +This type, which is short for "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 +with variants to represent many different Rust 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. Finally, `ty::TyS`s are [interned](./memory.md), so that the `ty::Ty` can be a thin pointer-like @@ -137,14 +141,15 @@ These methods all return a `Ty<'tcx>` – note that the lifetime you get back is 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 `==` +> N.B. +> 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). +You can also find various common types in the `tcx` itself by accessing its fields: +`tcx.types.bool`, `tcx.types.char`, etc. (See [`CommonTypes`] for more.) [`CommonTypes`]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/context/struct.CommonTypes.html @@ -172,35 +177,27 @@ types in the compiler. There are a lot of related types, and we’ll cover them in time (e.g regions/lifetimes, “substitutions”, etc). -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 all [`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] +There are many variants on the `TyKind` enum, which you can see by looking at its +[documentation][tykind]. Here is a sampling: + +- [**Algebraic Data Types (ADTs)**][kindadt] 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 all [`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_middle/ty/enum.TyKind.html#variant.Adt @@ -249,8 +246,8 @@ 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`. + (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. @@ -268,8 +265,8 @@ 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). +`DefId` with the [`tcx.adt_def(def_id)` query][adtdefq]. `AdtDef`s are all interned, as shown +by the `'tcx` lifetime. [adtdefq]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.TyCtxt.html#method.adt_def @@ -280,8 +277,9 @@ There is a `TyKind::Error` that is produced when the user makes a type error. Th 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 +There is an **important invariant** for `TyKind::Error`. The compiler should +**never** produce `Error` unless we **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). @@ -297,6 +295,19 @@ 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 +For added safety, it's not actually possible to produce a `TyKind::Error` value +outside of [`rustc_middle::ty`][ty]; there is a private member of +`TyKind::Error` that prevents it from being constructable elsewhere. Instead, +one should use the [`TyCtxt::ty_error`][terr] or +[`TyCtxt::ty_error_with_message`][terrmsg] methods. These methods automatically +call `delay_span_bug` before returning an interned `Ty` of kind `Error`. If you +were already planning to use [`delay_span_bug`], then you can just pass the +span and message to [`ty_error_with_message`][terrmsg] instead to avoid +delaying a redundant span bug. + +[terr]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.TyCtxt.html#method.ty_error +[terrmsg]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_middle/ty/struct.TyCtxt.html#method.ty_error_with_message + ## Question: Why not substitute “inside” the `AdtDef`? Recall that we represent a generic struct with `(AdtDef, substs)`. So why bother with this scheme? diff --git a/src/doc/rustc-dev-guide/src/type-checking.md b/src/doc/rustc-dev-guide/src/type-checking.md index d4f4bf1107..797cd9487a 100644 --- a/src/doc/rustc-dev-guide/src/type-checking.md +++ b/src/doc/rustc-dev-guide/src/type-checking.md @@ -4,9 +4,9 @@ The [`rustc_typeck`][typeck] crate contains the source for "type collection" and "type checking", as well as a few other bits of related functionality. (It draws heavily on the [type inference] and [trait solving].) -[typeck]: https://github.com/rust-lang/rust/tree/master/src/librustc_typeck -[type inference]: type-inference.html -[trait solving]: traits/resolution.html +[typeck]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_typeck/index.html +[type inference]: ./type-inference.md +[trait solving]: ./traits/resolution.md ## Type collection @@ -38,7 +38,7 @@ type *checking*). For more details, see the [`collect`][collect] module. -[queries]: query.html +[queries]: ./query.md [collect]: https://doc.rust-lang.org/nightly/nightly-rustc/rustc_typeck/collect/ **TODO**: actually talk about type checking... diff --git a/src/doc/rustc-dev-guide/src/type-inference.md b/src/doc/rustc-dev-guide/src/type-inference.md index 9c548364d4..71c2b08b19 100644 --- a/src/doc/rustc-dev-guide/src/type-inference.md +++ b/src/doc/rustc-dev-guide/src/type-inference.md @@ -1,5 +1,7 @@ # Type inference + + Type inference is the process of automatic detection of the type of an expression. @@ -69,8 +71,8 @@ inference works, or perhaps this blog post on [Unification in the Chalk project]: http://smallcultfollowing.com/babysteps/blog/2017/03/25/unification-in-chalk-part-1/ -All told, the inference context stores four kinds of inference variables as of -this writing: +All told, the inference context stores four kinds of inference variables +(as of January 2018): - Type variables, which come in three varieties: - General type variables (the most common). These can be unified with any diff --git a/src/doc/rustc-dev-guide/src/variance.md b/src/doc/rustc-dev-guide/src/variance.md index af23330e8a..c03de7a20d 100644 --- a/src/doc/rustc-dev-guide/src/variance.md +++ b/src/doc/rustc-dev-guide/src/variance.md @@ -1,5 +1,7 @@ # Variance of type and lifetime parameters + + For a more general background on variance, see the [background] appendix. [background]: ./appendix/background.html diff --git a/src/doc/rustc-dev-guide/src/walkthrough.md b/src/doc/rustc-dev-guide/src/walkthrough.md index c74f72cc57..b0d040942e 100644 --- a/src/doc/rustc-dev-guide/src/walkthrough.md +++ b/src/doc/rustc-dev-guide/src/walkthrough.md @@ -1,5 +1,7 @@ # Walkthrough: a typical contribution + + There are _a lot_ of ways to contribute to the rust compiler, including fixing bugs, improving performance, helping design features, providing feedback on existing features, etc. This chapter does not claim to scratch the surface. @@ -50,7 +52,7 @@ before, not all of these are needed for every type of contribution. - **Implementation** Implement your idea unstably in the compiler. You can find the original implementation [here][impl1]. - **Possibly iterate/refine** As the community gets experience with your - feature on the nightly compiler and in `libstd`, there may be additional + feature on the nightly compiler and in `std`, there may be additional feedback about design choice that might be adjusted. This particular feature went [through][impl2] a [number][impl3] of [iterations][impl4]. - **Stabilization** When your feature has baked enough, a rust team member may @@ -189,10 +191,10 @@ questions or discuss things you don't understand or disagree with. However, recognize that the PR won't be merged unless someone on the rust team approves it. -When your review approves the PR, it will go into a queue for yet another bot -called `@bors`. `@bors` manages the CI build/merge queue. When your PR reaches +When your reviewer approves the PR, it will go into a queue for yet another bot +called `@bors`. `@bors` manages the CI build/merge queue. When your PR reaches the head of the `@bors` queue, `@bors` will test out the merge by running all -tests against your PR on Travis CI. This takes a lot of time to +tests against your PR on GitHub Actions. This takes a lot of time to finish. If all tests pass, the PR is merged and becomes part of the next nightly compiler! diff --git a/src/doc/rustc-dev-guide/triagebot.toml b/src/doc/rustc-dev-guide/triagebot.toml index fa0824ac53..ccb0de862e 100644 --- a/src/doc/rustc-dev-guide/triagebot.toml +++ b/src/doc/rustc-dev-guide/triagebot.toml @@ -1 +1,8 @@ [assign] + +[relabel] +allow-unauthenticated = [ + "waiting-on-review", + "waiting-on-author", + "blocked", +] diff --git a/src/doc/rustc/src/SUMMARY.md b/src/doc/rustc/src/SUMMARY.md index dd19861573..af5834525f 100644 --- a/src/doc/rustc/src/SUMMARY.md +++ b/src/doc/rustc/src/SUMMARY.md @@ -11,6 +11,7 @@ - [Deny-by-default lints](lints/listing/deny-by-default.md) - [Codegen options](codegen-options/index.md) - [JSON Output](json.md) +- [Tests](tests/index.md) - [Platform Support](platform-support.md) - [Targets](targets/index.md) - [Built-in Targets](targets/built-in.md) diff --git a/src/doc/rustc/src/codegen-options/index.md b/src/doc/rustc/src/codegen-options/index.md index 51e7d987d9..1883346430 100644 --- a/src/doc/rustc/src/codegen-options/index.md +++ b/src/doc/rustc/src/codegen-options/index.md @@ -299,9 +299,9 @@ opt-level=0`](#opt-level)). That is: * When `-C lto` is not specified: * `codegen-units=1`: disable LTO. * `opt-level=0`: disable LTO. -* When `-C lto=true`: - * `lto=true`: 16 codegen units, perform fat LTO across crates. - * `codegen-units=1` + `lto=true`: 1 codegen unit, fat LTO across crates. +* When `-C lto` is specified: + * `lto`: 16 codegen units, perform fat LTO across crates. + * `codegen-units=1` + `lto`: 1 codegen unit, fat LTO across crates. See also [linker-plugin-lto](#linker-plugin-lto) for cross-language LTO. diff --git a/src/doc/rustc/src/command-line-arguments.md b/src/doc/rustc/src/command-line-arguments.md index 30b18eb56a..7d3cad7988 100644 --- a/src/doc/rustc/src/command-line-arguments.md +++ b/src/doc/rustc/src/command-line-arguments.md @@ -204,7 +204,8 @@ out a longer explanation of a given error. ## `--test`: build a test harness When compiling this crate, `rustc` will ignore your `main` function -and instead produce a test harness. +and instead produce a test harness. See the [Tests chapter](tests/index.md) +for more information about tests. ## `--target`: select a target triple to build @@ -300,7 +301,7 @@ flag][prefer-dynamic] may be used to influence which is used. If the same crate name is specified with and without a path, the one with the path is used and the pathless flag has no effect. -[extern prelude]: ../reference/items/extern-crates.html#extern-prelude +[extern prelude]: ../reference/names/preludes.html#extern-prelude [prefer-dynamic]: codegen-options/index.md#prefer-dynamic diff --git a/src/doc/rustc/src/exploit-mitigations.md b/src/doc/rustc/src/exploit-mitigations.md index 44d5d9564f..70df5170b2 100644 --- a/src/doc/rustc/src/exploit-mitigations.md +++ b/src/doc/rustc/src/exploit-mitigations.md @@ -378,7 +378,7 @@ C library default allocator5 since version 1.32.0 (2019-01-17)[39]. -```ignore +```rust,no_run fn main() { let mut x = Box::new([0; 1024]); diff --git a/src/doc/rustc/src/lints/levels.md b/src/doc/rustc/src/lints/levels.md index 64cbbbb003..3e616f226e 100644 --- a/src/doc/rustc/src/lints/levels.md +++ b/src/doc/rustc/src/lints/levels.md @@ -62,7 +62,7 @@ warning: unused variable: `x` A 'deny' lint produces an error if you violate it. For example, this code runs into the `exceeding_bitshifts` lint. -```rust,ignore +```rust,no_run fn main() { 100u8 << 10; } @@ -232,7 +232,7 @@ pub fn foo() {} This is the maximum level for all lints. So for example, if we take our code sample from the "deny" lint level above: -```rust,ignore +```rust,no_run fn main() { 100u8 << 10; } diff --git a/src/doc/rustc/src/lints/listing/index.md b/src/doc/rustc/src/lints/listing/index.md index 18cd2fe32a..97aa2caf91 100644 --- a/src/doc/rustc/src/lints/listing/index.md +++ b/src/doc/rustc/src/lints/listing/index.md @@ -2,4 +2,4 @@ This section lists out all of the lints, grouped by their default lint levels. -You can also see this list by running `rustc -W help`. \ No newline at end of file +You can also see this list by running `rustc -W help`. diff --git a/src/doc/rustc/src/platform-support.md b/src/doc/rustc/src/platform-support.md index eb74041964..ee17fcac45 100644 --- a/src/doc/rustc/src/platform-support.md +++ b/src/doc/rustc/src/platform-support.md @@ -133,8 +133,7 @@ target | std | host | notes `x86_64-fortanix-unknown-sgx` | ✓ | | [Fortanix ABI] for 64-bit Intel SGX `x86_64-fuchsia` | ✓ | | 64-bit Fuchsia `x86_64-linux-android` | ✓ | | 64-bit x86 Android -`x86_64-rumprun-netbsd` | ✓ | | 64-bit NetBSD Rump Kernel -`x86_64-sun-solaris` | ✓ | | 64-bit Solaris 10/11, illumos +`x86_64-pc-solaris` | ✓ | | 64-bit Solaris 10/11, illumos `x86_64-unknown-freebsd` | ✓ | ✓ | 64-bit FreeBSD `x86_64-unknown-illumos` | ✓ | ✓ | illumos `x86_64-unknown-linux-gnux32` | ✓ | | 64-bit Linux (x32 ABI) (kernel 4.15, glibc 2.27) @@ -153,6 +152,7 @@ not available. target | std | host | notes -------|-----|------|------- `aarch64-apple-ios-macabi` | ? | | Apple Catalyst on ARM64 +`aarch64-apple-ios-sim` | ? | | Apple iOS Simulator on ARM64 `aarch64-apple-tvos` | * | | ARM64 tvOS `aarch64-unknown-freebsd` | ✓ | ✓ | ARM64 FreeBSD `aarch64-unknown-hermit` | ? | | @@ -198,13 +198,17 @@ target | std | host | notes `powerpc-unknown-linux-gnuspe` | ✓ | | PowerPC SPE Linux `powerpc-unknown-linux-musl` | ? | | `powerpc-unknown-netbsd` | ✓ | ✓ | +`powerpc-unknown-openbsd` | ? | | `powerpc-wrs-vxworks` | ? | | `powerpc-wrs-vxworks-spe` | ? | | `powerpc64-unknown-freebsd` | ✓ | ✓ | PPC64 FreeBSD (ELFv1 and ELFv2) `powerpc64-unknown-linux-musl` | ? | | `powerpc64-wrs-vxworks` | ? | | `powerpc64le-unknown-linux-musl` | ? | | +`riscv64gc-unknown-linux-musl` | | | RISC-V Linux (kernel 4.20, musl 1.2.0) `riscv32gc-unknown-linux-gnu` | | | RISC-V Linux (kernel 5.4, glibc 2.33) +`riscv32gc-unknown-linux-musl` | | | RISC-V Linux (kernel 5.4, musl + RISCV32 support patches) +`s390x-unknown-linux-musl` | | | S390x Linux (kernel 2.6.32, MUSL) `sparc-unknown-linux-gnu` | ✓ | | 32-bit SPARC Linux `sparc64-unknown-netbsd` | ✓ | ✓ | NetBSD/sparc64 `sparc64-unknown-openbsd` | ? | | @@ -214,13 +218,13 @@ target | std | host | notes `thumbv4t-none-eabi` | * | | ARMv4T T32 `x86_64-apple-ios-macabi` | ✓ | | Apple Catalyst on x86_64 `x86_64-apple-tvos` | * | | x86 64-bit tvOS -`x86_64-linux-kernel` | * | | Linux kernel modules -`x86_64-pc-solaris` | ? | | +`x86_64-unknown-none-linuxkernel` | * | | Linux kernel modules +`x86_64-sun-solaris` | ? | | Deprecated target for 64-bit Solaris 10/11, illumos `x86_64-pc-windows-msvc` | ✓ | | 64-bit Windows XP support `x86_64-unknown-dragonfly` | ✓ | ✓ | 64-bit DragonFlyBSD `x86_64-unknown-haiku` | ✓ | ✓ | 64-bit Haiku `x86_64-unknown-hermit` | ? | | -`x86_64-unknown-hermit-kernel` | ? | | HermitCore kernel +`x86_64-unknown-none-hermitkernel` | ? | | HermitCore kernel `x86_64-unknown-l4re-uclibc` | ? | | `x86_64-unknown-openbsd` | ✓ | ✓ | 64-bit OpenBSD `x86_64-unknown-uefi` | ? | | diff --git a/src/doc/rustc/src/tests/index.md b/src/doc/rustc/src/tests/index.md new file mode 100644 index 0000000000..ec23d4fe0d --- /dev/null +++ b/src/doc/rustc/src/tests/index.md @@ -0,0 +1,284 @@ +# Tests + +`rustc` has a built-in facility for building and running tests for a crate. +More information about writing and running tests may be found in the [Testing +Chapter] of the Rust Programming Language book. + +Tests are written as free functions with the [`#[test]` +attribute][attribute-test]. For example: + +```rust +#[test] +fn it_works() { + assert_eq!(2 + 2, 4); +} +``` + +Tests "pass" if they return without an error. They "fail" if they [panic], or +return a [`Result`] with an error. + +By passing the [`--test` option] to `rustc`, the compiler will build the crate +in a special mode to construct an executable that will run the tests in the +crate. The `--test` flag will make the following changes: + +* The crate will be built as a `bin` [crate type], forcing it to be an + executable. +* Links the executable with [`libtest`], the test harness that is part of the + standard library, which handles running the tests. +* Synthesizes a [`main` function] which will process command-line arguments + and run the tests. This new `main` function will replace any existing `main` + function as the entry point of the executable, though the existing `main` + will still be compiled. +* Enables the [`test` cfg option], which allows your code to use conditional + compilation to detect if it is being built as a test. +* Enables building of functions annotated with the [`test`][attribute-test] + and [`bench`](#benchmarks) attributes, which will be run by the test + harness. + +After the executable is created, you can run it to execute the tests and +receive a report on what passes and fails. If you are using [Cargo] to manage +your project, it has a built-in [`cargo test`] command which handles all of +this automatically. An example of the output looks like this: + +```text +running 4 tests +test it_works ... ok +test check_valid_args ... ok +test invalid_characters ... ok +test walks_the_dog ... ok + +test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s +``` + +> **Note**: Tests must be built with the [`unwind` panic +> strategy][panic-strategy]. This is because all tests run in the same +> process, and they are intended to catch panics, which is not possible with +> the `abort` strategy. See the unstable [`-Z panic-abort-tests`] option for +> experimental support of the `abort` strategy by spawning tests in separate +> processes. + +## Test attributes + +Tests are indicated using attributes on free functions. The following +attributes are used for testing, see the linked documentation for more +details: + +* [`#[test]`][attribute-test] — Indicates a function is a test to be run. +* `#[bench]` — Indicates a function is a benchmark to be + run. Benchmarks are currently unstable and only available in the nightly + channel, see the [unstable docs][bench-docs] for more details. +* [`#[should_panic]`][attribute-should_panic] — Indicates that the test + function will only pass if the function [panics][panic]. +* [`#[ignore]`][attribute-ignore] — Indicates that the test function will be + compiled, but not run by default. See the [`--ignored`](#--ignored) and + [`--include-ignored`](#--include-ignored) options to run these tests. + +## CLI arguments + +The libtest harness has several command-line arguments to control its +behavior. + +> Note: When running with [`cargo test`], the libtest CLI arguments must be +> passed after the `--` argument to differentiate between flags for Cargo and +> those for the harness. For example: `cargo test -- --nocapture` + +### Filters + +Positional arguments (those without a `-` prefix) are treated as filters which +will only run tests whose name matches one of those strings. The filter will +match any substring found in the full path of the test function. For example, +if the test function `it_works` is located in the module +`utils::paths::tests`, then any of the filters `works`, `path`, `utils::`, or +`utils::paths::tests::it_works` will match that test. + +See [Selection options](#selection-options) for more options to control which +tests are run. + +### Action options + +The following options perform different actions other than running tests. + +#### `--list` + +Prints a list of all tests and benchmarks. Does not run any of the tests. +[Filters](#filters) can be used to list only matching tests. + +#### `-h`, `--help` + +Displays usage information and command-line options. + +### Selection options + +The following options change how tests are selected. + +#### `--test` + +This is the default mode where all tests will be run as well as running all +benchmarks with only a single iteration (to ensure the benchmark works, +without taking the time to actually perform benchmarking). This can be +combined with the `--bench` flag to run both tests and perform full +benchmarking. + +#### `--bench` + +This runs in a mode where tests are ignored, and only runs benchmarks. This +can be combined with `--test` to run both benchmarks and tests. + +#### `--exact` + +This forces [filters](#filters) to match the full path of the test exactly. +For example, if the test `it_works` is in the module `utils::paths::tests`, +then only the string `utils::paths::tests::it_works` will match that test. + +#### `--skip` _FILTER_ + +Skips any tests whose name contains the given _FILTER_ string. This flag may +be passed multiple times. + +#### `--ignored` + +Runs only tests that are marked with the [`ignore` +attribute][attribute-ignore]. + +#### `--include-ignored` + +Runs both [ignored](#--ignored) and non-ignored tests. + +#### `--exclude-should-panic` + +Excludes tests marked with the [`should_panic` +attribute][attribute-should_panic]. + +⚠️ 🚧 This option is [unstable](#unstable-options), and requires the `-Z +unstable-options` flag. See [tracking issue +#82348](https://github.com/rust-lang/rust/issues/82348) for more information. + +### Execution options + +The following options affect how tests are executed. + +#### `--test-threads` _NUM_THREADS_ + +Sets the number of threads to use for running tests in parallel. By default, +uses the amount of concurrency available on the hardware as indicated by +[`available_concurrency`]. + +This can also be specified with the `RUST_TEST_THREADS` environment variable. + +#### `--force-run-in-process` + +Forces the tests to run in a single process when using the [`abort` panic +strategy][panic-strategy]. + +⚠️ 🚧 This only works with the unstable [`-Z panic-abort-tests`] option, and +requires the `-Z unstable-options` flag. See [tracking issue +#67650](https://github.com/rust-lang/rust/issues/67650) for more information. + +#### `--ensure-time` + +⚠️ 🚧 This option is [unstable](#unstable-options), and requires the `-Z +unstable-options` flag. See [tracking issue +#64888](https://github.com/rust-lang/rust/issues/64888) and the [unstable +docs](../../unstable-book/compiler-flags/report-time.html) for more information. + +### Output options + +The following options affect the output behavior. + +#### `-q`, `--quiet` + +Displays one character per test instead of one line per test. This is an alias +for [`--format=terse`](#--format-format). + +#### `--nocapture` + +Does not capture the stdout and stderr of the test, and allows tests to print +to the console. Usually the output is captured, and only displayed if the test +fails. + +This may also be specified by setting the `RUST_TEST_NOCAPTURE` environment +variable set to anything but `0`. + +#### `--show-output` + +Displays the stdout and stderr of successful tests after all tests have run. + +Contrast this with [`--nocapture`](#--nocapture) which allows tests to print +*while they are running*, which can cause interleaved output if there are +multiple tests running in parallel, `--show-output` ensures the output is +contiguous, but requires waiting for all tests to finish. + +#### `--color` _COLOR_ + +Control when colored terminal output is used. Valid options: + +* `auto`: Colorize if stdout is a tty and [`--nocapture`](#--nocapture) is not + used. This is the default. +* `always`: Always colorize the output. +* `never`: Never colorize the output. + +#### `--format` _FORMAT_ + +Controls the format of the output. Valid options: + +* `pretty`: This is the default format, with one line per test. +* `terse`: Displays only a single character per test. [`--quiet`](#-q---quiet) + is an alias for this option. +* `json`: Emits JSON objects, one per line. ⚠️ 🚧 This option is + [unstable](#unstable-options), and requires the `-Z unstable-options` flag. + See [tracking issue #49359](https://github.com/rust-lang/rust/issues/49359) + for more information. + +#### `--logfile` _PATH_ + +Writes the results of the tests to the given file. + +#### `--report-time` _FORMAT_ + +⚠️ 🚧 This option is [unstable](#unstable-options), and requires the `-Z +unstable-options` flag. See [tracking issue +#64888](https://github.com/rust-lang/rust/issues/64888) and the [unstable +docs](../../unstable-book/compiler-flags/report-time.html) for more information. + +### Unstable options + +Some CLI options are added in an "unstable" state, where they are intended for +experimentation and testing to determine if the option works correctly, has +the right design, and is useful. The option may not work correctly, break, or +change at any time. To signal that you acknowledge that you are using an +unstable option, they require passing the `-Z unstable-options` command-line +flag. + +## Benchmarks + +The libtest harness supports running benchmarks for functions annotated with +the `#[bench]` attribute. Benchmarks are currently unstable, and only +available on the [nightly channel]. More information may be found in the +[unstable book][bench-docs]. + +## Custom test frameworks + +Experimental support for using custom test harnesses is available on the +[nightly channel]. See [tracking issue +#50297](https://github.com/rust-lang/rust/issues/50297) and the +[custom_test_frameworks documentation] for more information. + +[`--test` option]: ../command-line-arguments.md#option-test +[`-Z panic-abort-tests`]: https://github.com/rust-lang/rust/issues/67650 +[`available_concurrency`]: ../../std/thread/fn.available_concurrency.html +[`cargo test`]: ../../cargo/commands/cargo-test.html +[`libtest`]: ../../test/index.html +[`main` function]: ../../reference/crates-and-source-files.html#main-functions +[`Result`]: ../../std/result/index.html +[`test` cfg option]: ../../reference/conditional-compilation.html#test +[attribute-ignore]: ../../reference/attributes/testing.html#the-ignore-attribute +[attribute-should_panic]: ../../reference/attributes/testing.html#the-should_panic-attribute +[attribute-test]: ../../reference/attributes/testing.html#the-test-attribute +[bench-docs]: ../../unstable-book/library-features/test.html +[Cargo]: ../../cargo/index.html +[crate type]: ../../reference/linkage.html +[custom_test_frameworks documentation]: ../../unstable-book/language-features/custom-test-frameworks.html +[nightly channel]: ../../book/appendix-07-nightly-rust.html +[panic-strategy]: ../../book/ch09-01-unrecoverable-errors-with-panic.html +[panic]: ../../book/ch09-01-unrecoverable-errors-with-panic.html +[Testing Chapter]: ../../book/ch11-00-testing.html diff --git a/src/doc/rustc/src/what-is-rustc.md b/src/doc/rustc/src/what-is-rustc.md index 9dcc9f7daa..39a05cfe20 100644 --- a/src/doc/rustc/src/what-is-rustc.md +++ b/src/doc/rustc/src/what-is-rustc.md @@ -39,7 +39,7 @@ $ .\hello.exe # on Windows Note that we only ever pass `rustc` the *crate root*, not every file we wish to compile. For example, if we had a `main.rs` that looked like this: -```rust,ignore +```rust,ignore (needs-multiple-files) mod foo; fn main() { @@ -49,7 +49,7 @@ fn main() { And a `foo.rs` that had this: -```rust,ignore +```rust,no_run pub fn hello() { println!("Hello, world!"); } diff --git a/src/doc/rustdoc/src/SUMMARY.md b/src/doc/rustdoc/src/SUMMARY.md index 943aa09f67..ae94527e2b 100644 --- a/src/doc/rustdoc/src/SUMMARY.md +++ b/src/doc/rustdoc/src/SUMMARY.md @@ -8,7 +8,7 @@ - [Documentation tests](documentation-tests.md) - [Linking to items by name](linking-to-items-by-name.md) - [Lints](lints.md) -- [Passes](passes.md) - [Advanced features](advanced-features.md) - [Unstable features](unstable-features.md) +- [Passes](passes.md) - [References](references.md) diff --git a/src/doc/rustdoc/src/advanced-features.md b/src/doc/rustdoc/src/advanced-features.md index 5128ff13b7..6147bd0a97 100644 --- a/src/doc/rustdoc/src/advanced-features.md +++ b/src/doc/rustdoc/src/advanced-features.md @@ -47,8 +47,7 @@ all type errors and name resolution errors with function bodies. Note that this work for anything outside a function body: since Rustdoc documents your types, it has to know what those types are! For example, this code will work regardless of the platform: - -```ignore +```rust,ignore (platform-specific,rustdoc-specific-behavior) pub fn f() { use std::os::windows::ffi::OsStrExt; } @@ -56,7 +55,7 @@ pub fn f() { but this will not, because the unknown type is part of the function signature: -```ignore +```rust,ignore (platform-specific,rustdoc-specific-behavior) pub fn f() -> std::os::windows::ffi::EncodeWide<'static> { unimplemented!() } @@ -82,3 +81,10 @@ Then, when looking for it through the `rustdoc` search, if you enter "x" or "big", search will show the `BigX` struct first. There are some limitations on the doc alias names though: you can't use `"` or whitespace. + +You can add multiple aliases at the same time by using a list: + +```rust,no_run +#[doc(alias("x", "big"))] +pub struct BigX; +``` diff --git a/src/doc/rustdoc/src/command-line-arguments.md b/src/doc/rustdoc/src/command-line-arguments.md index 80f7851deb..2e4016e24b 100644 --- a/src/doc/rustdoc/src/command-line-arguments.md +++ b/src/doc/rustdoc/src/command-line-arguments.md @@ -57,23 +57,6 @@ release: 1.17.0 LLVM version: 3.9 ``` -## `-r`/`--input-format`: input format - -This flag is currently ignored; the idea is that `rustdoc` would support various -input formats, and you could specify them via this flag. - -Rustdoc only supports Rust source code and Markdown input formats. If the -file ends in `.md` or `.markdown`, `rustdoc` treats it as a Markdown file. -Otherwise, it assumes that the input file is Rust. - - -## `-w`/`--output-format`: output format - -This flag is currently ignored; the idea is that `rustdoc` would support -various output formats, and you could specify them via this flag. - -Rustdoc only supports HTML output, and so this flag is redundant today. - ## `-o`/`--output`: output path Using this flag looks like this: @@ -100,6 +83,25 @@ By default, `rustdoc` assumes that the name of your crate is the same name as the `.rs` file. `--crate-name` lets you override this assumption with whatever name you choose. +## `--document-private-items`: Show items that are not public + +Using this flag looks like this: + +```bash +$ rustdoc src/lib.rs --document-private-items +``` + +By default, `rustdoc` only documents items that are publicly reachable. + +```rust +pub fn public() {} // this item is public and will documented +mod private { // this item is private and will not be documented + pub fn unreachable() {} // this item is public, but unreachable, so it will not be documented +} +``` + +`--document-private-items` documents all items, even if they're not public. + ## `-L`/`--library-path`: where to look for dependencies Using this flag looks like this: @@ -166,38 +168,6 @@ affect that. The arguments to this flag are the same as those for the `-C` flag on rustc. Run `rustc -C help` to get the full list. -## `--passes`: add more rustdoc passes - -Using this flag looks like this: - -```bash -$ rustdoc --passes list -$ rustdoc src/lib.rs --passes strip-priv-imports -``` - -An argument of "list" will print a list of possible "rustdoc passes", and other -arguments will be the name of which passes to run in addition to the defaults. - -For more details on passes, see [the chapter on them](passes.md). - -See also `--no-defaults`. - -## `--no-defaults`: don't run default passes - -Using this flag looks like this: - -```bash -$ rustdoc src/lib.rs --no-defaults -``` - -By default, `rustdoc` will run several passes over your code. This -removes those defaults, allowing you to use `--passes` to specify -exactly which passes you want. - -For more details on passes, see [the chapter on them](passes.md). - -See also `--passes`. - ## `--test`: run code examples as tests Using this flag looks like this: @@ -422,3 +392,28 @@ $ rustdoc src/lib.rs --crate-version 1.3.37 When `rustdoc` receives this flag, it will print an extra "Version (version)" into the sidebar of the crate root's docs. You can use this flag to differentiate between different versions of your library's documentation. + +## `@path`: load command-line flags from a path + +If you specify `@path` on the command-line, then it will open `path` and read +command line options from it. These options are one per line; a blank line indicates +an empty option. The file can use Unix or Windows style line endings, and must be +encoded as UTF-8. + +## `--passes`: add more rustdoc passes + +This flag is **deprecated**. +For more details on passes, see [the chapter on them](passes.md). + +## `--no-defaults`: don't run default passes + +This flag is **deprecated**. +For more details on passes, see [the chapter on them](passes.md). + +## `-r`/`--input-format`: input format + +This flag is **deprecated** and **has no effect**. + +Rustdoc only supports Rust source code and Markdown input formats. If the +file ends in `.md` or `.markdown`, `rustdoc` treats it as a Markdown file. +Otherwise, it assumes that the input file is Rust. diff --git a/src/doc/rustdoc/src/documentation-tests.md b/src/doc/rustdoc/src/documentation-tests.md index 387d86189b..8e3c622818 100644 --- a/src/doc/rustdoc/src/documentation-tests.md +++ b/src/doc/rustdoc/src/documentation-tests.md @@ -5,12 +5,13 @@ that examples within your documentation are up to date and working. The basic idea is this: -```ignore +```rust,no_run /// # Examples /// /// ``` /// let x = 5; /// ``` +# fn f() {} ``` The triple backticks start and end code blocks. If this were in a file named `foo.rs`, @@ -78,12 +79,13 @@ Sometimes, you need some setup code, or other things that would distract from your example, but are important to make the tests work. Consider an example block that looks like this: -```ignore +```rust,no_run /// ``` /// /// Some documentation. /// # fn foo() {} // this function will be hidden /// println!("Hello, World!"); /// ``` +# fn f() {} ``` It will render like this: @@ -196,12 +198,13 @@ When writing an example, it is rarely useful to include a complete error handling, as it would add significant amounts of boilerplate code. Instead, you may want the following: -```ignore +```rust,no_run /// ``` /// use std::io; /// let mut input = String::new(); /// io::stdin().read_line(&mut input)?; /// ``` +# fn f() {} ``` The problem is that `?` returns a `Result` and test functions don't @@ -210,7 +213,7 @@ return anything, so this will give a mismatched types error. You can get around this limitation by manually adding a `main` that returns `Result`, because `Result` implements the `Termination` trait: -```ignore +```rust,no_run /// A doc test using ? /// /// ``` @@ -222,12 +225,13 @@ You can get around this limitation by manually adding a `main` that returns /// Ok(()) /// } /// ``` +# fn f() {} ``` Together with the `# ` from the section above, you arrive at a solution that appears to the reader as the initial idea but works with doc tests: -```ignore +```rust,no_run /// ``` /// use std::io; /// # fn main() -> io::Result<()> { @@ -236,18 +240,20 @@ appears to the reader as the initial idea but works with doc tests: /// # Ok(()) /// # } /// ``` +# fn f() {} ``` As of version 1.34.0, one can also omit the `fn main()`, but you will have to disambiguate the error type: -```ignore +```rust,no_run /// ``` /// use std::io; /// let mut input = String::new(); /// io::stdin().read_line(&mut input)?; /// # Ok::<(), io::Error>(()) /// ``` +# fn f() {} ``` This is an unfortunate consequence of the `?` operator adding an implicit @@ -417,7 +423,7 @@ Another possible use of `#[cfg(doctest)]` is to test doctests that are included without including it in your main documentation. For example, you could write this into your `lib.rs` to test your README as part of your doctests: -```rust,ignore +```rust,no_run #![feature(external_doc)] #[doc(include = "../README.md")] diff --git a/src/doc/rustdoc/src/how-to-write-documentation.md b/src/doc/rustdoc/src/how-to-write-documentation.md index 41736e5ee3..688be7aede 100644 --- a/src/doc/rustdoc/src/how-to-write-documentation.md +++ b/src/doc/rustdoc/src/how-to-write-documentation.md @@ -7,7 +7,7 @@ implementation detail, or leaves readers with unanswered questions. There are a few tenets to Rust documentation that can help guide anyone through the process of documenting libraries so that everyone has an ample opportunity -to use the code. +to use the code. This chapter covers not only how to write documentation but specifically how to write **good** documentation. It is important to be as clear @@ -19,31 +19,31 @@ then it should be documented. Documenting a crate should begin with front-page documentation. As an example, the [`hashbrown`] crate level documentation summarizes the role of -the crate, provides links to explain technical details, and explains why you -would want to use the crate. +the crate, provides links to explain technical details, and explains why you +would want to use the crate. -After introducing the crate, it is important that the front-page gives +After introducing the crate, it is important that the front-page gives an example of how to use the crate in a real world setting. Stick to the library's role in the example, but do so without shortcuts to benefit users who -may copy and paste the example to get started. +may copy and paste the example to get started. [`futures`] uses inline comments to explain line by line -the complexities of using a [`Future`], because a person's first exposure to +the complexities of using a [`Future`], because a person's first exposure to rust's [`Future`] may be this example. -The [`backtrace`] documentation walks through the whole process, explaining +The [`backtrace`] documentation walks through the whole process, explaining changes made to the `Cargo.toml` file, passing command line arguments to the -compiler, and shows a quick example of backtrace in the wild. +compiler, and shows a quick example of backtrace in the wild. Finally, the front-page can eventually become a comprehensive reference how to use a crate, like [`regex`]. In this front page, all -requirements are outlined, the edge cases shown, and practical examples +requirements are outlined, the edge cases shown, and practical examples provided. The front page goes on to show how to use regular expressions then concludes with crate features. Don't worry about comparing your crate, which is just beginning, to other more developed crates. To get the documentation to something more polished, start -incrementally and put in an introduction, example, and features. Rome was not +incrementally and put in an introduction, example, and features. Rome was not built in a day! The first lines within the `lib.rs` will compose the front-page, and they @@ -51,7 +51,7 @@ use a different convention than the rest of the rustdocs. Lines should start with `//!` which indicate module-level or crate-level documentation. Here's a quick example of the difference: -```rust,ignore +```rust,no_run //! Fast and easy queue abstraction. //! //! Provides an abstraction over a queue. When the abstraction is used @@ -64,13 +64,13 @@ Here's a quick example of the difference: /// This module makes it easy. pub mod easy { - /// Use the abstract function to do this specific thing. - pub fn abstract() {} + /// Use the abstraction function to do this specific thing. + pub fn abstraction() {} } ``` -Ideally, this first line of documentation is a sentence without highly +Ideally, this first line of documentation is a sentence without highly technical details, but with a good description of where this crate fits within the rust ecosystem. Users should know whether this crate meets their use case after reading this line. @@ -95,13 +95,13 @@ It is recommended that each item's documentation follows this basic structure: This basic structure should be straightforward to follow when writing your documentation; while you might think that a code example is trivial, -the examples are really important because they can help users understand +the examples are really important because they can help users understand what an item is, how it is used, and for what purpose it exists. Let's see an example coming from the [standard library] by taking a look at the [`std::env::args()`][env::args] function: -``````text +``````markdown Returns the arguments which this program was started with (normally passed via the command line). @@ -133,9 +133,9 @@ for argument in env::args() { [`args_os`]: ./fn.args_os.html `````` -Everything before the first empty line will be reused to describe the component +Everything before the first empty line will be reused to describe the component in searches and module overviews. For example, the function `std::env::args()` -above will be shown on the [`std::env`] module documentation. It is good +above will be shown on the [`std::env`] module documentation. It is good practice to keep the summary to one line: concise writing is a goal of good documentation. @@ -153,9 +153,10 @@ and finally provides a code example. ## Markdown -`rustdoc` uses the [CommonMark markdown specification]. You might be -interested into taking a look at their website to see what's possible to do. - - [commonmark quick reference] +`rustdoc` uses the [CommonMark Markdown specification]. You might be +interested in taking a look at their website to see what's possible: + + - [CommonMark quick reference] - [current spec] In addition to the standard CommonMark syntax, `rustdoc` supports several @@ -221,11 +222,45 @@ This example will render similarly to this: See the specification for the [GitHub Tables extension][tables] for more details on the exact syntax supported. +### Task lists + +Task lists can be used as a checklist of items that have been completed. +Example: + +```md +- [x] Complete task +- [ ] IncComplete task +``` + +This will render as + +

      +
    • +
    • +
    + +See the specification for the [task list extension] for more details. + +### Smart punctuation + +Some ASCII punctuation sequences will be automatically turned into fancy Unicode +characters: + +| ASCII sequence | Unicode | +|----------------|---------| +| `--` | – | +| `---` | — | +| `...` | … | +| `"` | “ or ”, depending on context | +| `'` | ‘ or ’, depending on context | + +So, no need to manually enter those Unicode characters! + [`backtrace`]: https://docs.rs/backtrace/0.3.50/backtrace/ [commonmark markdown specification]: https://commonmark.org/ [commonmark quick reference]: https://commonmark.org/help/ [env::args]: https://doc.rust-lang.org/stable/std/env/fn.args.html -[`Future`]: https://doc.rust-lang.org/std/future/trait.Future.html +[`Future`]: https://doc.rust-lang.org/std/future/trait.Future.html [`futures`]: https://docs.rs/futures/0.3.5/futures/ [`hashbrown`]: https://docs.rs/hashbrown/0.8.2/hashbrown/ [`regex`]: https://docs.rs/regex/1.3.9/regex/ @@ -234,3 +269,4 @@ details on the exact syntax supported. [`std::env`]: https://doc.rust-lang.org/stable/std/env/index.html#functions [strikethrough]: https://github.github.com/gfm/#strikethrough-extension- [tables]: https://github.github.com/gfm/#tables-extension- +[task list extension]: https://github.github.com/gfm/#task-list-items-extension- diff --git a/src/doc/rustdoc/src/linking-to-items-by-name.md b/src/doc/rustdoc/src/linking-to-items-by-name.md index 76e0439853..6ca1d1153b 100644 --- a/src/doc/rustdoc/src/linking-to-items-by-name.md +++ b/src/doc/rustdoc/src/linking-to-items-by-name.md @@ -1,7 +1,7 @@ # Linking to items by name Rustdoc is capable of directly linking to other rustdoc pages using the path of -the item as a link. +the item as a link. This is referred to as an 'intra-doc link'. For example, in the following code all of the links will link to the rustdoc page for `Bar`: @@ -24,11 +24,20 @@ pub struct Foo4; pub struct Bar; ``` +Unlike normal Markdown, `[bar][Bar]` syntax is also supported without needing a +`[Bar]: ...` reference link. + Backticks around the link will be stripped, so ``[`Option`]`` will correctly link to `Option`. -You can refer to anything in scope, and use paths, including `Self`, `self`, -`super`, and `crate`. You may also use `foo()` and `foo!()` to refer to methods/functions and macros, respectively. +## Valid links + +You can refer to anything in scope, and use paths, including `Self`, `self`, `super`, and +`crate`. Associated items (functions, types, and constants) are supported, but [not for blanket +trait implementations][#79682]. Rustdoc also supports linking to all primitives listed in +[the standard library documentation](../std/index.html#primitives). + +[#79682]: https://github.com/rust-lang/rust/pull/79682 You can also refer to items with generic parameters like `Vec`. The link will resolve as if you had written ``[`Vec`](Vec)``. Fully-qualified syntax (for example, @@ -53,7 +62,7 @@ impl AsyncReceiver { } ``` -You can also link to sections using URL fragment specifiers: +Rustdoc allows using URL fragment specifiers, just like a normal link: ```rust /// This is a special implementation of [positional parameters]. @@ -62,9 +71,11 @@ You can also link to sections using URL fragment specifiers: struct MySpecialFormatter; ``` -Paths in Rust have three namespaces: type, value, and macro. Item names must be -unique within their namespace, but can overlap with items outside of their -namespace. In case of ambiguity, rustdoc will warn about the ambiguity and ask you to disambiguate, which can be done by using a prefix like `struct@`, `enum@`, `type@`, `trait@`, `union@`, `const@`, `static@`, `value@`, `fn@`, `function@`, `mod@`, `module@`, `method@`, `prim@`, `primitive@`, `macro@`, or `derive@`: +## Namespaces and Disambiguators + +Paths in Rust have three namespaces: type, value, and macro. Item names must be unique within +their namespace, but can overlap with items in other namespaces. In case of ambiguity, +rustdoc will warn about the ambiguity and suggest a disambiguator. ```rust /// See also: [`Foo`](struct@Foo) @@ -76,19 +87,57 @@ struct Foo {} fn Foo() {} ``` +These prefixes will be stripped when displayed in the documentation, so `[struct@Foo]` will be +rendered as `Foo`. + You can also disambiguate for functions by adding `()` after the function name, or for macros by adding `!` after the macro name: ```rust -/// See also: [`Foo`](struct@Foo) -struct Bar; +/// This is different from [`foo!`] +fn foo() {} -/// This is different from [`Foo()`] -struct Foo {} +/// This is different from [`foo()`] +macro_rules! foo { + () => {} +} +``` -fn Foo() {} +## Warnings, re-exports, and scoping + +Links are resolved in the scope of the module where the item is defined, even +when the item is re-exported. If a link from another crate fails to resolve, no +warning is given. + +```rust,edition2018 +mod inner { + /// Link to [f()] + pub struct S; + pub fn f() {} +} +pub use inner::S; // the link to `f` will still resolve correctly ``` -Note: Because of how `macro_rules!` macros are scoped in Rust, the intra-doc links of a `macro_rules!` macro will be resolved [relative to the crate root][#72243], as opposed to the module it is defined in. +When re-exporting an item, rustdoc allows adding additional documentation to it. +That additional documentation will be resolved in the scope of the re-export, not +the original, allowing you to link to items in the new crate. The new links +will still give a warning if they fail to resolve. + +```rust +/// See also [foo()] +pub use std::process::Command; + +pub fn foo() {} +``` + +This is especially useful for proc-macros, which must always be defined in their own dedicated crate. + +Note: Because of how `macro_rules!` macros are scoped in Rust, the intra-doc links of a +`macro_rules!` macro will be resolved [relative to the crate root][#72243], as opposed to the +module it is defined in. + +If links do not look 'sufficiently like' an intra-doc link, they will be ignored and no warning +will be given, even if the link fails to resolve. For example, any link containing `/` or `[]` +characters will be ignored. [#72243]: https://github.com/rust-lang/rust/issues/72243 diff --git a/src/doc/rustdoc/src/lints.md b/src/doc/rustdoc/src/lints.md index 41292b3d83..174db711bc 100644 --- a/src/doc/rustdoc/src/lints.md +++ b/src/doc/rustdoc/src/lints.md @@ -3,12 +3,14 @@ `rustdoc` provides lints to help you writing and testing your documentation. You can use them like any other lints by doing this: -```rust,ignore -#![allow(missing_docs)] // allows the lint, no diagnostics will be reported -#![warn(missing_docs)] // warn if there are missing docs -#![deny(missing_docs)] // error if there are missing docs +```rust +#![allow(rustdoc::broken_intra_doc_links)] // allows the lint, no diagnostics will be reported +#![warn(rustdoc::broken_intra_doc_links)] // warn if there are broken intra-doc links +#![deny(rustdoc::broken_intra_doc_links)] // error if there are broken intra-doc links ``` +Note that, except for `missing_docs`, these lints are only available when running `rustdoc`, not `rustc`. + Here is the list of the lints provided by `rustdoc`: ## broken_intra_doc_links @@ -50,7 +52,7 @@ warning: `Foo` is both an enum and a function 1 | /// [`Foo`] | ^^^^^ ambiguous link | - = note: `#[warn(broken_intra_doc_links)]` on by default + = note: `#[warn(rustdoc::broken_intra_doc_links)]` on by default help: to link to the enum, prefix with the item type | 1 | /// [`enum@Foo`] @@ -82,7 +84,7 @@ warning: public documentation for `public` links to private item `private` 1 | /// [private] | ^^^^^^^ this item is private | - = note: `#[warn(private_intra_doc_links)]` on by default + = note: `#[warn(rustdoc::private_intra_doc_links)]` on by default = note: this link will resolve properly if you pass `--document-private-items` ``` @@ -96,7 +98,7 @@ warning: public documentation for `public` links to private item `private` 1 | /// [private] | ^^^^^^^ this item is private | - = note: `#[warn(private_intra_doc_links)]` on by default + = note: `#[warn(rustdoc::private_intra_doc_links)]` on by default = note: this link resolves only because you passed `--document-private-items`, but will break without ``` @@ -124,13 +126,15 @@ warning: missing documentation for a function | ^^^^^^^^^^^^^^^^^^^^^ ``` +Note that unlike other rustdoc lints, this lint is also available from `rustc` directly. + ## missing_crate_level_docs This lint is **allowed by default**. It detects if there is no documentation at the crate root. For example: ```rust -#![warn(missing_crate_level_docs)] +#![warn(rustdoc::missing_crate_level_docs)] ``` This will generate the following warning: @@ -154,7 +158,7 @@ This lint is **allowed by default** and is **nightly-only**. It detects when a d is missing a code example. For example: ```rust -#![warn(missing_doc_code_examples)] +#![warn(rustdoc::missing_doc_code_examples)] /// There is no code example! pub fn no_code_example() {} @@ -190,7 +194,7 @@ This lint is **allowed by default**. It detects documentation tests when they are on a private item. For example: ```rust -#![warn(private_doc_tests)] +#![warn(rustdoc::private_doc_tests)] mod foo { /// private doc test @@ -244,7 +248,7 @@ warning: unknown attribute `should-panic`. Did you mean `should_panic`? 5 | | /// ``` | |_______^ | - = note: `#[warn(invalid_codeblock_attributes)]` on by default + = note: `#[warn(rustdoc::invalid_codeblock_attributes)]` on by default = help: the code block will either not be tested if not marked as a rust one or won't fail if it doesn't panic when running ``` @@ -257,7 +261,7 @@ This lint is **allowed by default** and is **nightly-only**. It detects unclosed or invalid HTML tags. For example: ```rust -#![warn(invalid_html_tags)] +#![warn(rustdoc::invalid_html_tags)] ///

    /// @@ -274,7 +278,11 @@ warning: unopened HTML tag `script` 2 | | /// | |_____________^ | - = note: `#[warn(invalid_html_tags)]` on by default + note: the lint level is defined here + --> foo.rs:1:9 + | +1 | #![warn(rustdoc::invalid_html_tags)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: unclosed HTML tag `h1` --> foo.rs:1:1 @@ -309,7 +317,7 @@ warning: this URL is not a hyperlink 1 | /// http://example.org | ^^^^^^^^^^^^^^^^^^ help: use an automatic link instead: `` | - = note: `#[warn(non_autolinks)]` on by default + = note: `#[warn(rustdoc::non_autolinks)]` on by default warning: unneeded long form for URL --> foo.rs:2:5 diff --git a/src/doc/rustdoc/src/passes.md b/src/doc/rustdoc/src/passes.md index 081e477de8..c3c3fd3068 100644 --- a/src/doc/rustdoc/src/passes.md +++ b/src/doc/rustdoc/src/passes.md @@ -3,84 +3,9 @@ Rustdoc has a concept called "passes". These are transformations that `rustdoc` runs on your documentation before producing its final output. -In addition to the passes below, check out the docs for these flags: +Customizing passes is **deprecated**. The available passes are not considered stable and may +change in any release. -* [`--passes`](command-line-arguments.md#--passes-add-more-rustdoc-passes) -* [`--no-defaults`](command-line-arguments.md#--no-defaults-dont-run-default-passes) - -## Default passes - -By default, rustdoc will run some passes, namely: - -* `strip-hidden` -* `strip-private` -* `collapse-docs` -* `unindent-comments` - -However, `strip-private` implies `strip-priv-imports`, and so effectively, -all passes are run by default. - -## `strip-hidden` - -This pass implements the `#[doc(hidden)]` attribute. When this pass runs, it -checks each item, and if it is annotated with this attribute, it removes it -from `rustdoc`'s output. - -Without this pass, these items will remain in the output. - -## `unindent-comments` - -When you write a doc comment like this: - -```rust,ignore -/// This is a documentation comment. -``` - -There's a space between the `///` and that `T`. That spacing isn't intended -to be a part of the output; it's there for humans, to help separate the doc -comment syntax from the text of the comment. This pass is what removes that -space. - -The exact rules are left under-specified so that we can fix issues that we find. - -Without this pass, the exact number of spaces is preserved. - -## `collapse-docs` - -With this pass, multiple `#[doc]` attributes are converted into one single -documentation string. - -For example: - -```rust,ignore -#[doc = "This is the first line."] -#[doc = "This is the second line."] -``` - -Gets collapsed into a single doc string of - -```text -This is the first line. -This is the second line. -``` - -## `strip-private` - -This removes documentation for any non-public items, so for example: - -```rust,ignore -/// These are private docs. -struct Private; - -/// These are public docs. -pub struct Public; -``` - -This pass removes the docs for `Private`, since they're not public. - -This pass implies `strip-priv-imports`. - -## `strip-priv-imports` - -This is the same as `strip-private`, but for `extern crate` and `use` -statements instead of items. +In the past the most common use case for customizing passes was to omit the `strip-private` pass. +You can do this more easily, and without risk of the pass being changed, by passing +[`--document-private-items`](./unstable-features.md#--document-private-items). diff --git a/src/doc/rustdoc/src/references.md b/src/doc/rustdoc/src/references.md index 1e050e321d..b0e2437392 100644 --- a/src/doc/rustdoc/src/references.md +++ b/src/doc/rustdoc/src/references.md @@ -3,7 +3,7 @@ There are many great `rustdoc` references out there. If you know of other great resources, please submit a pull request! -## Official +## Official - [Learn Rust] - [Rust By Example] @@ -11,7 +11,7 @@ If you know of other great resources, please submit a pull request! - [RFC 1574: More API Documentation Conventions] - [RFC 1946: Intra Rustdoc Links] -## Community +## Community - [API Guidelines] - [Github tagged RFCs] - [Github tagged issues] @@ -28,4 +28,4 @@ If you know of other great resources, please submit a pull request! [RFC 1946: Intra Rustdoc Links]: https://rust-lang.github.io/rfcs/1946-intra-rustdoc-links.html [RFC (stalled) front page styleguide]: https://github.com/rust-lang/rfcs/pull/1687 [Rust By Example]: https://doc.rust-lang.org/stable/rust-by-example/meta/doc.html -[Rust Reference]: https://doc.rust-lang.org/stable/reference/comments.html#doc-comments \ No newline at end of file +[Rust Reference]: https://doc.rust-lang.org/stable/reference/comments.html#doc-comments diff --git a/src/doc/rustdoc/src/the-doc-attribute.md b/src/doc/rustdoc/src/the-doc-attribute.md index ef143c8727..52f2a3728f 100644 --- a/src/doc/rustdoc/src/the-doc-attribute.md +++ b/src/doc/rustdoc/src/the-doc-attribute.md @@ -7,9 +7,10 @@ The most basic function of `#[doc]` is to handle the actual documentation text. That is, `///` is syntax sugar for `#[doc]`. This means that these two are the same: -```rust,ignore +```rust,no_run /// This is a doc comment. #[doc = " This is a doc comment."] +# fn f() {} ``` (Note the leading space in the attribute version.) @@ -18,16 +19,18 @@ In most cases, `///` is easier to use than `#[doc]`. One case where the latter i when generating documentation in macros; the `collapse-docs` pass will combine multiple `#[doc]` attributes into a single doc comment, letting you generate code like this: -```rust,ignore +```rust,no_run #[doc = "This is"] #[doc = " a "] #[doc = "doc comment"] +# fn f() {} ``` Which can feel more flexible. Note that this would generate this: -```rust,ignore +```rust,no_run #[doc = "This is\n a \ndoc comment"] +# fn f() {} ``` but given that docs are rendered via Markdown, it will remove these newlines. @@ -45,7 +48,7 @@ These options control how the docs look at a crate level. This form of the `doc` attribute lets you control the favicon of your docs. -```rust,ignore +```rust,no_run #![doc(html_favicon_url = "https://example.com/favicon.ico")] ``` @@ -59,7 +62,7 @@ If you don't use this attribute, there will be no favicon. This form of the `doc` attribute lets you control the logo in the upper left hand side of the docs. -```rust,ignore +```rust,no_run #![doc(html_logo_url = "https://example.com/logo.jpg")] ``` @@ -73,7 +76,7 @@ If you don't use this attribute, there will be no logo. This form of the `doc` attribute lets you control where the "run" buttons on your documentation examples make requests to. -```rust,ignore +```rust,no_run #![doc(html_playground_url = "https://playground.example.com/")] ``` @@ -88,7 +91,7 @@ When a feature is unstable, an issue number for tracking the feature must be given. `rustdoc` uses this number, plus the base URL given here, to link to the tracking issue. -```rust,ignore +```rust,no_run #![doc(issue_tracker_base_url = "https://github.com/rust-lang/rust/issues/")] ``` @@ -103,7 +106,7 @@ available. If that is not available, then it will use the `html_root_url` value in the extern crate if it is available. If that is not available, then the extern items will not be linked. -```rust,ignore +```rust,no_run #![doc(html_root_url = "https://docs.rs/serde/1.0")] ``` @@ -112,7 +115,7 @@ the extern items will not be linked. By default, `rustdoc` will include the source code of your program, with links to it in the docs. But if you include this: -```rust,ignore +```rust,no_run #![doc(html_no_source)] ``` @@ -123,7 +126,7 @@ it will not. By default, `rustdoc` will automatically add a line with `extern crate my_crate;` into each doctest. But if you include this: -```rust,ignore +```rust,no_run #![doc(test(no_crate_inject))] ``` @@ -134,7 +137,7 @@ it will not. This form of the `doc` attribute allows you to add arbitrary attributes to all your doctests. For example, if you want your doctests to fail if they produce any warnings, you could add this: -```rust,ignore +```rust,no_run #![doc(test(attr(deny(warnings))))] ``` @@ -148,7 +151,7 @@ they are documented. These attributes are used on `use` statements, and control where the documentation shows up. For example, consider this Rust code: -```rust,ignore +```rust,no_run pub use bar::Bar; /// bar docs @@ -156,6 +159,7 @@ pub mod bar { /// the docs for Bar pub struct Bar; } +# fn main() {} ``` The documentation will generate a "Re-exports" section, and say `pub use bar::Bar;`, where @@ -163,9 +167,11 @@ The documentation will generate a "Re-exports" section, and say `pub use bar::Ba If we change the `use` line like this: -```rust,ignore +```rust,no_run #[doc(inline)] pub use bar::Bar; +# pub mod bar { pub struct Bar; } +# fn main() {} ``` Instead, `Bar` will appear in a `Structs` section, just like `Bar` was defined at the @@ -173,7 +179,7 @@ top level, rather than `pub use`'d. Let's change our original example, by making `bar` private: -```rust,ignore +```rust,no_run pub use bar::Bar; /// bar docs @@ -181,6 +187,7 @@ mod bar { /// the docs for Bar pub struct Bar; } +# fn main() {} ``` Here, because `bar` is not public, `Bar` wouldn't have its own page, so there's nowhere @@ -188,7 +195,7 @@ to link to. `rustdoc` will inline these definitions, and so we end up in the sam as the `#[doc(inline)]` above; `Bar` is in a `Structs` section, as if it were defined at the top level. If we add the `no_inline` form of the attribute: -```rust,ignore +```rust,no_run #[doc(no_inline)] pub use bar::Bar; @@ -197,6 +204,7 @@ mod bar { /// the docs for Bar pub struct Bar; } +# fn main() {} ``` Now we'll have a `Re-exports` line, and `Bar` will not link to anywhere. diff --git a/src/doc/rustdoc/src/unstable-features.md b/src/doc/rustdoc/src/unstable-features.md index b430705104..7d1845dc95 100644 --- a/src/doc/rustdoc/src/unstable-features.md +++ b/src/doc/rustdoc/src/unstable-features.md @@ -340,6 +340,30 @@ Some methodology notes about what rustdoc counts in this metric: Public items that are not documented can be seen with the built-in `missing_docs` lint. Private items that are not documented can be seen with Clippy's `missing_docs_in_private_items` lint. +## `-w`/`--output-format`: output format + +When using +[`--show-coverage`](https://doc.rust-lang.org/nightly/rustdoc/unstable-features.html#--show-coverage-get-statistics-about-code-documentation-coverage), +passing `--output-format json` will display the coverage information in JSON format. For example, +here is the JSON for a file with one documented item and one undocumented item: + +```rust +/// This item has documentation +pub fn foo() {} + +pub fn no_documentation() {} +``` + +```json +{"no_std.rs":{"total":3,"with_docs":1,"total_examples":3,"with_examples":0}} +``` + +Note that the third item is the crate root, which in this case is undocumented. + +When not using `--show-coverage`, `--output-format json` emits documentation in the experimental +[JSON format](https://github.com/rust-lang/rfcs/pull/2963). `--output-format html` has no effect, +and is also accepted on stable toolchains. + ### `--enable-per-target-ignores`: allow `ignore-foo` style filters for doctests Using this flag looks like this: diff --git a/src/doc/rustdoc/src/what-is-rustdoc.md b/src/doc/rustdoc/src/what-is-rustdoc.md index 32dc1e02bb..7a444d77c0 100644 --- a/src/doc/rustdoc/src/what-is-rustdoc.md +++ b/src/doc/rustdoc/src/what-is-rustdoc.md @@ -32,7 +32,7 @@ $ rustdoc src/lib.rs This will create a new directory, `doc`, with a website inside! In our case, the main page is located in `doc/lib/index.html`. If you open that up in a web browser, you will see a page with a search bar, and "Crate lib" at the -top, with no contents. +top, with no contents. ## Configuring rustdoc @@ -89,18 +89,18 @@ dependency=/docs/target/debug/deps You can see this with `cargo doc --verbose`. It generates the correct `--crate-name` for us, as well as pointing to -`src/lib.rs`. But what about those other arguments? - - `-o` controls the *o*utput of our docs. Instead of a top-level - `doc` directory, notice that Cargo puts generated documentation under +`src/lib.rs`. But what about those other arguments? + - `-o` controls the *o*utput of our docs. Instead of a top-level + `doc` directory, notice that Cargo puts generated documentation under `target`. That is the idiomatic place for generated files in Cargo projects. - - `-L` flag helps rustdoc find the dependencies your code relies on. + - `-L` flag helps rustdoc find the dependencies your code relies on. If our project used dependencies, we would get documentation for them as well! ## Outer and inner documentation The `///` syntax is used to document the item present after it. That's why it is called an outer documentation. -There is another syntax: `//!`, which is used to document the +There is another syntax: `//!`, which is used to document the item it is present inside. It is called an inner documentation. It is often used when documenting the entire crate, because nothing comes before it: it is the root of the crate. diff --git a/src/doc/rustdoc/src/what-to-include.md b/src/doc/rustdoc/src/what-to-include.md index 878c75baae..9683f519be 100644 --- a/src/doc/rustdoc/src/what-to-include.md +++ b/src/doc/rustdoc/src/what-to-include.md @@ -38,10 +38,10 @@ warning: 1 warning emitted As a library author, adding the lint `#![deny(missing_docs)]` is a great way to ensure the project does not drift away from being documented well, and -`#![warn(missing_docs)]` is a good way to move towards comprehensive +`#![warn(missing_docs)]` is a good way to move towards comprehensive documentation. In addition to docs, `#![deny(missing_doc_code_examples)]` ensures each function contains a usage example. In our example above, the -warning is resolved by adding crate level documentation. +warning is resolved by adding crate level documentation. There are more lints in the upcoming chapter [Lints][rustdoc-lints]. @@ -58,7 +58,7 @@ users to figure out how to put the `async` code into their own runtime. It is preferred that `unwrap()` not be used inside an example, and some of the error handling components be hidden if they make the example too difficult to -follow. +follow. ``````text /// Example @@ -66,9 +66,9 @@ follow. /// let fourtytwo = "42".parse::()?; /// println!("{} + 10 = {}", fourtytwo, fourtytwo+10); /// ``` -`````` +`````` -When rustdoc wraps that in a main function, it will fail to compile because the +When rustdoc wraps that in a main function, it will fail to compile because the `ParseIntError` trait is not implemented. In order to help both your audience and your test suite, this example needs some additional code: @@ -81,17 +81,17 @@ and your test suite, this example needs some additional code: /// # Ok(()) /// # } /// ``` -`````` +`````` The example is the same on the doc page, but has that extra information -available to anyone trying to use your crate. More about tests in the -upcoming [Documentation tests] chapter. +available to anyone trying to use your crate. More about tests in the +upcoming [Documentation tests] chapter. ## What to Exclude Certain parts of your public interface may be included by default in the output of rustdoc. The attribute `#[doc(hidden)]` can hide implementation details -to encourage idiomatic use of the crate. +to encourage idiomatic use of the crate. For example, an internal `macro!` that makes the crate easier to implement can become a footgun for users when it appears in the public documentation. An @@ -101,11 +101,11 @@ detailed in the [API Guidelines]. ## Customizing the output It is possible to pass a custom css file to `rustdoc` and style the -documentation. +documentation. ```bash rustdoc --extend-css custom.css src/lib.rs -``` +``` A good example of using this feature to create a dark theme is documented [on this blog]. Just remember, dark theme is already included in the rustdoc output @@ -122,4 +122,4 @@ Here is an example of a new theme, [Ayu]. [API Guidelines]: https://rust-lang.github.io/api-guidelines/documentation.html#rustdoc-does-not-show-unhelpful-implementation-details-c-hidden [Documentation tests]: documentation-tests.md [on this blog]: https://blog.guillaume-gomez.fr/articles/2016-09-16+Generating+doc+with+rustdoc+and+a+custom+theme -[rustdoc-lints]: lints.md \ No newline at end of file +[rustdoc-lints]: lints.md diff --git a/src/doc/unstable-book/src/compiler-flags/codegen-backend.md b/src/doc/unstable-book/src/compiler-flags/codegen-backend.md index 878c894a6c..3c0cd32fae 100644 --- a/src/doc/unstable-book/src/compiler-flags/codegen-backend.md +++ b/src/doc/unstable-book/src/compiler-flags/codegen-backend.md @@ -15,7 +15,7 @@ named `__rustc_codegen_backend` with a signature of `fn() -> Box`, indicating which dependency of + which rule introduced the unused extern crate. + +This primarily intended to be used with tooling - for example a linter which can automatically +remove unused dependencies - rather than being directly presented to users. + +`raw` locations are presented as part of the normal rendered diagnostics and included in +the json form. `json` locations are only included in the json form of diagnostics, +as a `tool_metadata` field. For `raw` locations `tool_metadata` is simply a json string, +whereas `json` allows the rustc invoker to fully control its form and content. diff --git a/src/doc/unstable-book/src/compiler-flags/profile.md b/src/doc/unstable-book/src/compiler-flags/profile.md index 7973b3e4f2..71303bfaff 100644 --- a/src/doc/unstable-book/src/compiler-flags/profile.md +++ b/src/doc/unstable-book/src/compiler-flags/profile.md @@ -22,6 +22,6 @@ Once you've built and run your program, files with the `gcno` (after build) and You can parse them with [llvm-cov gcov](https://llvm.org/docs/CommandGuide/llvm-cov.html#llvm-cov-gcov) or [grcov](https://github.com/mozilla/grcov). Please note that `RUSTFLAGS` by default applies to everything that cargo builds and runs during a build! -When the `--target` flag is explicitly passed to cargo, the `RUSTFLAGS` no longer apply to build scripts and procedural macros. -For more fine-grained control consider passing a `RUSTC_WRAPPER` program to cargo that only adds the profiling flags to +When the `--target` flag is explicitly passed to cargo, the `RUSTFLAGS` no longer apply to build scripts and procedural macros. +For more fine-grained control consider passing a `RUSTC_WRAPPER` program to cargo that only adds the profiling flags to rustc for the specific crates you want to profile. diff --git a/src/doc/unstable-book/src/compiler-flags/report-time.md b/src/doc/unstable-book/src/compiler-flags/report-time.md index 68265d8a9e..ac0093f77a 100644 --- a/src/doc/unstable-book/src/compiler-flags/report-time.md +++ b/src/doc/unstable-book/src/compiler-flags/report-time.md @@ -34,7 +34,7 @@ Available options: Expected format of environment variable is `VARIABLE=WARN_TIME,CRITICAL_TIME`. Not available for --format=terse ---ensure-time +--ensure-time Treat excess of the test execution time limit as error. Threshold values for this option can be configured via diff --git a/src/doc/unstable-book/src/compiler-flags/sanitizer.md b/src/doc/unstable-book/src/compiler-flags/sanitizer.md index d03d5c7501..29a267053b 100644 --- a/src/doc/unstable-book/src/compiler-flags/sanitizer.md +++ b/src/doc/unstable-book/src/compiler-flags/sanitizer.md @@ -7,12 +7,15 @@ The tracking issue for this feature is: [#39699](https://github.com/rust-lang/ru This feature allows for use of one of following sanitizers: * [AddressSanitizer][clang-asan] a fast memory error detector. +* [HWAddressSanitizer][clang-hwasan] a memory error detector similar to + AddressSanitizer, but based on partial hardware assistance. * [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=address`, `-Zsanitizer=leak`, -`-Zsanitizer=memory` or `-Zsanitizer=thread`. +To enable a sanitizer compile with `-Zsanitizer=address`, +`-Zsanitizer=hwaddress`, `-Zsanitizer=leak`, `-Zsanitizer=memory` or +`-Zsanitizer=thread`. # AddressSanitizer @@ -174,6 +177,86 @@ Shadow byte legend (one shadow byte represents 8 application bytes): ==39249==ABORTING ``` +# HWAddressSanitizer + +HWAddressSanitizer is a newer variant of AddressSanitizer that consumes much +less memory. + +HWAddressSanitizer is supported on the following targets: + +* `aarch64-linux-android` +* `aarch64-unknown-linux-gnu` + +HWAddressSanitizer requires `tagged-globals` target feature to instrument +globals. To enable this target feature compile with `-C +target-feature=+tagged-globals` + +## Example + +Heap buffer overflow: + +```rust +fn main() { + let xs = vec![0, 1, 2, 3]; + let _y = unsafe { *xs.as_ptr().offset(4) }; +} +``` + +```shell +$ rustc main.rs -Zsanitizer=hwaddress -C target-feature=+tagged-globals -C +linker=aarch64-linux-gnu-gcc -C link-arg=-fuse-ld=lld --target +aarch64-unknown-linux-gnu +``` + +```shell +$ ./main +==241==ERROR: HWAddressSanitizer: tag-mismatch on address 0xefdeffff0050 at pc 0xaaaae0ae4a98 +READ of size 4 at 0xefdeffff0050 tags: 2c/00 (ptr/mem) in thread T0 + #0 0xaaaae0ae4a94 (/.../main+0x54a94) + ... + +[0xefdeffff0040,0xefdeffff0060) is a small allocated heap chunk; size: 32 offset: 16 +0xefdeffff0050 is located 0 bytes to the right of 16-byte region [0xefdeffff0040,0xefdeffff0050) +allocated here: + #0 0xaaaae0acb80c (/.../main+0x3b80c) + ... + +Thread: T0 0xeffe00002000 stack: [0xffffc28ad000,0xffffc30ad000) sz: 8388608 tls: [0xffffaa10a020,0xffffaa10a7d0) +Memory tags around the buggy address (one tag corresponds to 16 bytes): + 0xfefcefffef80: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0xfefcefffef90: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0xfefcefffefa0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0xfefcefffefb0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0xfefcefffefc0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0xfefcefffefd0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0xfefcefffefe0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0xfefcefffeff0: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +=>0xfefceffff000: d7 d7 05 00 2c [00] 00 00 00 00 00 00 00 00 00 00 + 0xfefceffff010: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0xfefceffff020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0xfefceffff030: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0xfefceffff040: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0xfefceffff050: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0xfefceffff060: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0xfefceffff070: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 + 0xfefceffff080: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 +Tags for short granules around the buggy address (one tag corresponds to 16 bytes): + 0xfefcefffeff0: .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. +=>0xfefceffff000: .. .. 8c .. .. [..] .. .. .. .. .. .. .. .. .. .. + 0xfefceffff010: .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. .. +See https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.html#short-granules for a description of short granule tags +Registers where the failure occurred (pc 0xaaaae0ae4a98): + x0 2c00efdeffff0050 x1 0000000000000004 x2 0000000000000004 x3 0000000000000000 + x4 0000fffefc30ac37 x5 000000000000005d x6 00000ffffc30ac37 x7 0000efff00000000 + x8 2c00efdeffff0050 x9 0200efff00000000 x10 0000000000000000 x11 0200efff00000000 + x12 0200effe00000310 x13 0200effe00000310 x14 0000000000000008 x15 5d00ffffc30ac360 + x16 0000aaaae0ad062c x17 0000000000000003 x18 0000000000000001 x19 0000ffffc30ac658 + x20 4e00ffffc30ac6e0 x21 0000aaaae0ac5e10 x22 0000000000000000 x23 0000000000000000 + x24 0000000000000000 x25 0000000000000000 x26 0000000000000000 x27 0000000000000000 + x28 0000000000000000 x29 0000ffffc30ac5a0 x30 0000aaaae0ae4a98 +SUMMARY: HWAddressSanitizer: tag-mismatch (/.../main+0x54a94) +``` + # LeakSanitizer LeakSanitizer is run-time memory leak detector. @@ -203,8 +286,8 @@ achieve that will result in false positive reports. Detecting the use of uninitialized memory. The `-Zbuild-std` flag rebuilds and instruments the standard library, and is strictly necessary for the correct -operation of the tool. The `-Zsanitizer-track-origins` enables tracking of the -origins of uninitialized memory: +operation of the tool. The `-Zsanitizer-memory-track-origins` enables tracking +of the origins of uninitialized memory: ```rust use std::mem::MaybeUninit; @@ -321,11 +404,13 @@ Sanitizers produce symbolized stacktraces when llvm-symbolizer binary is in `PAT * [Sanitizers project page](https://github.com/google/sanitizers/wiki/) * [AddressSanitizer in Clang][clang-asan] +* [HWAddressSanitizer in Clang][clang-hwasan] * [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-hwasan]: https://clang.llvm.org/docs/HardwareAssistedAddressSanitizerDesign.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/compiler-flags/source-based-code-coverage.md b/src/doc/unstable-book/src/compiler-flags/source-based-code-coverage.md index 8aca005214..0d05b80e21 100644 --- a/src/doc/unstable-book/src/compiler-flags/source-based-code-coverage.md +++ b/src/doc/unstable-book/src/compiler-flags/source-based-code-coverage.md @@ -128,7 +128,7 @@ $ cargo profdata -- --help # note the additional "--" preceding the tool-specif ## Creating coverage reports -Raw profiles have to be indexed before they can be used to generate coverage reports. This is done using [`llvm-profdata merge`] (or `cargo cov -- merge`), which can combine multiple raw profiles and index them at the same time: +Raw profiles have to be indexed before they can be used to generate coverage reports. This is done using [`llvm-profdata merge`] (or `cargo profdata -- merge`), which can combine multiple raw profiles and index them at the same time: ```shell $ llvm-profdata merge -sparse formatjson5.profraw -o formatjson5.profdata diff --git a/src/doc/unstable-book/src/compiler-flags/tls-model.md b/src/doc/unstable-book/src/compiler-flags/tls-model.md index cd625f3fd0..8b19e785c6 100644 --- a/src/doc/unstable-book/src/compiler-flags/tls-model.md +++ b/src/doc/unstable-book/src/compiler-flags/tls-model.md @@ -11,7 +11,7 @@ Supported values for this option are: - `global-dynamic` - General Dynamic TLS Model (alternatively called Global Dynamic) is the most general option usable in all circumstances, even if the TLS data is defined in a shared library -loaded at runtime and is accessed from code outside of that library. +loaded at runtime and is accessed from code outside of that library. This is the default for most targets. - `local-dynamic` - model usable if the TLS data is only accessed from the shared library or executable it is defined in. The TLS data may be in a library loaded after startup (via `dlopen`). diff --git a/src/doc/unstable-book/src/language-features/auto-traits.md b/src/doc/unstable-book/src/language-features/auto-traits.md index 0ca6dd6670..f967c11fc4 100644 --- a/src/doc/unstable-book/src/language-features/auto-traits.md +++ b/src/doc/unstable-book/src/language-features/auto-traits.md @@ -1,6 +1,6 @@ # `auto_traits` -The tracking issue for this feature is [#13231] +The tracking issue for this feature is [#13231] [#13231]: https://github.com/rust-lang/rust/issues/13231 @@ -9,15 +9,15 @@ The tracking issue for this feature is [#13231] The `auto_traits` feature gate allows you to define auto traits. Auto traits, like [`Send`] or [`Sync`] in the standard library, are marker traits -that are automatically implemented for every type, unless the type, or a type it contains, +that are automatically implemented for every type, unless the type, or a type it contains, has explicitly opted out via a negative impl. (Negative impls are separately controlled by the `negative_impls` feature.) [`Send`]: https://doc.rust-lang.org/std/marker/trait.Send.html [`Sync`]: https://doc.rust-lang.org/std/marker/trait.Sync.html -```rust,ignore -impl !Trait for Type +```rust,ignore (partial-example) +impl !Trait for Type {} ``` Example: @@ -40,7 +40,7 @@ fn must_be_valid(_t: T) { } fn main() { // works must_be_valid( MaybeValid(True) ); - + // compiler error - trait bound not satisfied // must_be_valid( MaybeValid(False) ); } @@ -80,7 +80,7 @@ where Explicit impls may be either positive or negative. They take the form: -```rust,ignore +```rust,ignore (partial-example) impl<...> AutoTrait for StructName<..> { } impl<...> !AutoTrait for StructName<..> { } ``` @@ -104,4 +104,3 @@ Auto traits cannot have any trait items, such as methods or associated types. Th ## Supertraits Auto traits cannot have supertraits. This is for soundness reasons, as the interaction of coinduction with implied bounds is difficult to reconcile. - diff --git a/src/doc/unstable-book/src/language-features/c-unwind.md b/src/doc/unstable-book/src/language-features/c-unwind.md new file mode 100644 index 0000000000..2801d9b5e7 --- /dev/null +++ b/src/doc/unstable-book/src/language-features/c-unwind.md @@ -0,0 +1,15 @@ +# `c_unwind` + +The tracking issue for this feature is: [#74990] + +[#74990]: https://github.com/rust-lang/rust/issues/74990 + +------------------------ + +Introduces four new ABI strings: "C-unwind", "stdcall-unwind", +"thiscall-unwind", and "system-unwind". These enable unwinding from other +languages (such as C++) into Rust frames and from Rust into other languages. + +See [RFC 2945] for more information. + +[RFC 2945]: https://github.com/rust-lang/rfcs/blob/master/text/2945-c-unwind-abi.md diff --git a/src/doc/unstable-book/src/language-features/cfg-version.md b/src/doc/unstable-book/src/language-features/cfg-version.md index 2b1e50835b..a6ec42cecb 100644 --- a/src/doc/unstable-book/src/language-features/cfg-version.md +++ b/src/doc/unstable-book/src/language-features/cfg-version.md @@ -7,19 +7,20 @@ The tracking issue for this feature is: [#64796] ------------------------ The `cfg_version` feature makes it possible to execute different code -depending on the compiler version. +depending on the compiler version. It will return true if the compiler +version is greater than or equal to the specified version. ## Examples ```rust #![feature(cfg_version)] -#[cfg(version("1.42"))] +#[cfg(version("1.42"))] // 1.42 and above fn a() { // ... } -#[cfg(not(version("1.42")))] +#[cfg(not(version("1.42")))] // 1.41 and below fn a() { // ... } diff --git a/src/doc/unstable-book/src/language-features/custom-test-frameworks.md b/src/doc/unstable-book/src/language-features/custom-test-frameworks.md index 3990b6ad2f..53ecac9314 100644 --- a/src/doc/unstable-book/src/language-features/custom-test-frameworks.md +++ b/src/doc/unstable-book/src/language-features/custom-test-frameworks.md @@ -30,4 +30,3 @@ const WILL_PASS: i32 = 0; #[test_case] const WILL_FAIL: i32 = 4; ``` - diff --git a/src/doc/unstable-book/src/language-features/doc-spotlight.md b/src/doc/unstable-book/src/language-features/doc-spotlight.md index 8117755fef..75eff16331 100644 --- a/src/doc/unstable-book/src/language-features/doc-spotlight.md +++ b/src/doc/unstable-book/src/language-features/doc-spotlight.md @@ -5,8 +5,8 @@ The tracking issue for this feature is: [#45040] The `doc_spotlight` feature allows the use of the `spotlight` parameter to the `#[doc]` attribute, to "spotlight" a specific trait on the return values of functions. Adding a `#[doc(spotlight)]` attribute to a trait definition will make rustdoc print extra information for functions which return -a type that implements that trait. This attribute is applied to the `Iterator`, `io::Read`, and -`io::Write` traits in the standard library. +a type that implements that trait. For example, this attribute is applied to the `Iterator`, +`io::Read`, `io::Write`, and `Future` traits in the standard library. You can do this on your own traits, like this: 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 53e01091f7..5f3f1b4dd8 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 @@ -42,4 +42,3 @@ struct Bar { x: T, } ``` - diff --git a/src/doc/unstable-book/src/language-features/intrinsics.md b/src/doc/unstable-book/src/language-features/intrinsics.md index bc35c2a030..a0fb4e743d 100644 --- a/src/doc/unstable-book/src/language-features/intrinsics.md +++ b/src/doc/unstable-book/src/language-features/intrinsics.md @@ -27,4 +27,3 @@ extern "rust-intrinsic" { ``` As with any other FFI functions, these are always `unsafe` to call. - 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 20c7d7dcec..2278080461 100644 --- a/src/doc/unstable-book/src/language-features/lang-items.md +++ b/src/doc/unstable-book/src/language-features/lang-items.md @@ -15,8 +15,8 @@ For example, `Box` pointers require two lang items, one for allocation and one for deallocation. A freestanding program that uses the `Box` sugar for dynamic allocations via `malloc` and `free`: -```rust,ignore -#![feature(lang_items, box_syntax, start, libc, core_intrinsics)] +```rust,ignore (libc-is-finicky) +#![feature(lang_items, box_syntax, start, libc, core_intrinsics, rustc_private)] #![no_std] use core::intrinsics; use core::panic::PanicInfo; @@ -66,7 +66,7 @@ Other features provided by lang items include: marked with lang items; those specific four are `eq`, `ord`, `deref`, and `add` respectively. - stack unwinding and general failure; the `eh_personality`, - `panic` and `panic_bounds_checks` lang items. + `panic` and `panic_bounds_check` lang items. - the traits in `std::marker` used to indicate types of various kinds; lang items `send`, `sync` and `copy`. - the marker types and variance indicators found in @@ -105,8 +105,8 @@ or overriding the default shim for the C `main` function with your own. The function marked `#[start]` is passed the command line parameters in the same format as C: -```rust,ignore -#![feature(lang_items, core_intrinsics)] +```rust,ignore (libc-is-finicky) +#![feature(lang_items, core_intrinsics, rustc_private)] #![feature(start)] #![no_std] use core::intrinsics; @@ -141,8 +141,8 @@ with `#![no_main]` and then create the appropriate symbol with the correct ABI and the correct name, which requires overriding the compiler's name mangling too: -```rust,ignore -#![feature(lang_items, core_intrinsics)] +```rust,ignore (libc-is-finicky) +#![feature(lang_items, core_intrinsics, rustc_private)] #![feature(start)] #![no_std] #![no_main] diff --git a/src/doc/unstable-book/src/language-features/non-ascii-idents.md b/src/doc/unstable-book/src/language-features/non-ascii-idents.md index 22dae0c89a..847f25ecab 100644 --- a/src/doc/unstable-book/src/language-features/non-ascii-idents.md +++ b/src/doc/unstable-book/src/language-features/non-ascii-idents.md @@ -19,10 +19,10 @@ const Π: f64 = 3.14f64; ## Changes to the language reference -> **Lexer:** -> IDENTIFIER : ->       XID_start XID_continue\* ->    | `_` XID_continue+ +> **Lexer:**\ +> IDENTIFIER :\ +>       XID_start XID_continue\*\ +>    | `_` XID_continue+ An identifier is any nonempty Unicode string of the following form: diff --git a/src/doc/unstable-book/src/language-features/or-patterns.md b/src/doc/unstable-book/src/language-features/or-patterns.md index 8ebacb44d3..55c31add26 100644 --- a/src/doc/unstable-book/src/language-features/or-patterns.md +++ b/src/doc/unstable-book/src/language-features/or-patterns.md @@ -11,7 +11,7 @@ a pattern, for example, `Some(A(0) | B(1 | 2))` becomes a valid pattern. ## Examples -```rust,ignore +```rust,no_run #![feature(or_patterns)] pub enum Foo { diff --git a/src/doc/unstable-book/src/language-features/plugin.md b/src/doc/unstable-book/src/language-features/plugin.md index 3835113152..44308bdfba 100644 --- a/src/doc/unstable-book/src/language-features/plugin.md +++ b/src/doc/unstable-book/src/language-features/plugin.md @@ -38,7 +38,7 @@ additional checks for code style, safety, etc. Now let's write a plugin [`lint-plugin-test.rs`](https://github.com/rust-lang/rust/blob/master/src/test/ui-fulldeps/auxiliary/lint-plugin-test.rs) that warns about any item named `lintme`. -```rust,ignore +```rust,ignore (requires-stage-2) #![feature(plugin_registrar)] #![feature(box_syntax, rustc_private)] @@ -77,7 +77,7 @@ pub fn plugin_registrar(reg: &mut Registry) { Then code like -```rust,ignore +```rust,ignore (requires-plugin) #![feature(plugin)] #![plugin(lint_plugin_test)] diff --git a/src/doc/unstable-book/src/language-features/rustc-attrs.md b/src/doc/unstable-book/src/language-features/rustc-attrs.md index 1d9409ee9e..c67b806f06 100644 --- a/src/doc/unstable-book/src/language-features/rustc-attrs.md +++ b/src/doc/unstable-book/src/language-features/rustc-attrs.md @@ -18,7 +18,7 @@ Options provided by `#[rustc_layout(...)]` are `debug`, `size`, `align`, ## Examples -```rust,ignore +```rust,compile_fail #![feature(rustc_attrs)] #[rustc_layout(abi, size)] diff --git a/src/doc/unstable-book/src/language-features/unboxed-closures.md b/src/doc/unstable-book/src/language-features/unboxed-closures.md index 71003fba00..e4113d72d0 100644 --- a/src/doc/unstable-book/src/language-features/unboxed-closures.md +++ b/src/doc/unstable-book/src/language-features/unboxed-closures.md @@ -9,7 +9,7 @@ See Also: [`fn_traits`](../library-features/fn-traits.md) ---- The `unboxed_closures` feature allows you to write functions using the `"rust-call"` ABI, -required for implementing the [`Fn*`] family of traits. `"rust-call"` functions must have +required for implementing the [`Fn*`] family of traits. `"rust-call"` functions must have exactly one (non self) argument, a tuple representing the argument list. [`Fn*`]: https://doc.rust-lang.org/std/ops/trait.Fn.html diff --git a/src/doc/unstable-book/src/language-features/unsized-locals.md b/src/doc/unstable-book/src/language-features/unsized-locals.md index d716b1d51d..d5b01a3d61 100644 --- a/src/doc/unstable-book/src/language-features/unsized-locals.md +++ b/src/doc/unstable-book/src/language-features/unsized-locals.md @@ -30,7 +30,7 @@ fn foo(_: dyn Any) {} The RFC still forbids the following unsized expressions: -```rust,ignore +```rust,compile_fail #![feature(unsized_locals)] use std::any::Any; @@ -124,7 +124,7 @@ One of the objectives of this feature is to allow `Box`. The RFC also describes an extension to the array literal syntax: `[e; dyn n]`. In the syntax, `n` isn't necessarily a constant expression. The array is dynamically allocated on the stack and has the type of `[T]`, instead of `[T; n]`. -```rust,ignore +```rust,ignore (not-yet-implemented) #![feature(unsized_locals)] fn mergesort(a: &mut [T]) { diff --git a/src/doc/unstable-book/src/language-features/unsized-tuple-coercion.md b/src/doc/unstable-book/src/language-features/unsized-tuple-coercion.md index 731d2acbfd..310c8d9629 100644 --- a/src/doc/unstable-book/src/language-features/unsized-tuple-coercion.md +++ b/src/doc/unstable-book/src/language-features/unsized-tuple-coercion.md @@ -8,7 +8,7 @@ The tracking issue for this feature is: [#42877] This is a part of [RFC0401]. According to the RFC, there should be an implementation like this: -```rust,ignore +```rust,ignore (partial-example) impl<..., T, U: ?Sized> Unsized<(..., U)> for (..., T) where T: Unsized {} ``` diff --git a/src/doc/unstable-book/src/library-features/asm.md b/src/doc/unstable-book/src/library-features/asm.md index ccdd862869..c0e23b834d 100644 --- a/src/doc/unstable-book/src/library-features/asm.md +++ b/src/doc/unstable-book/src/library-features/asm.md @@ -405,7 +405,7 @@ When required, options are specified as the final argument. The following ABNF specifies the general syntax: -```ignore +```text dir_spec := "in" / "out" / "lateout" / "inout" / "inlateout" reg_spec := / "" operand_expr := expr / "_" / expr "=>" expr / expr "=>" "_" diff --git a/src/doc/unstable-book/src/library-features/concat-idents.md b/src/doc/unstable-book/src/library-features/concat-idents.md index ecfd34a22e..73f6cfa217 100644 --- a/src/doc/unstable-book/src/library-features/concat-idents.md +++ b/src/doc/unstable-book/src/library-features/concat-idents.md @@ -19,4 +19,4 @@ fn main() { let f = concat_idents!(foo, bar); assert_eq!(f(), 23); } -``` \ No newline at end of file +``` diff --git a/src/doc/unstable-book/src/library-features/global-asm.md b/src/doc/unstable-book/src/library-features/global-asm.md index bc55fe80fa..ce1155a977 100644 --- a/src/doc/unstable-book/src/library-features/global-asm.md +++ b/src/doc/unstable-book/src/library-features/global-asm.md @@ -24,17 +24,18 @@ conventions of the assembler in your toolchain. A simple usage looks like this: -```rust,ignore -# #![feature(global_asm)] -# you also need relevant target_arch cfgs +```rust,ignore (requires-external-file) +#![feature(global_asm)] +# // you also need relevant target_arch cfgs global_asm!(include_str!("something_neato.s")); ``` And a more complicated usage looks like this: -```rust,ignore -# #![feature(global_asm)] -# #![cfg(any(target_arch = "x86", target_arch = "x86_64"))] +```rust,no_run +#![feature(global_asm)] +# #[cfg(any(target_arch="x86", target_arch="x86_64"))] +# mod x86 { pub mod sally { global_asm!(r#" @@ -64,6 +65,7 @@ pub mod harry { #[no_mangle] pub unsafe extern "C" fn quux() {} } +# } ``` You may use `global_asm!` multiple times, anywhere in your crate, in diff --git a/src/doc/unstable-book/src/library-features/llvm-asm.md b/src/doc/unstable-book/src/library-features/llvm-asm.md index a2f029db29..07fc16261d 100644 --- a/src/doc/unstable-book/src/library-features/llvm-asm.md +++ b/src/doc/unstable-book/src/library-features/llvm-asm.md @@ -10,7 +10,7 @@ For extremely low-level manipulations and performance reasons, one might wish to control the CPU directly. Rust supports using inline assembly to do this via the `llvm_asm!` macro. -```rust,ignore +```rust,ignore (pseudo-code) llvm_asm!(assembly template : output operands : input operands diff --git a/src/doc/unstable-book/src/library-features/range-bounds-assert-len.md b/src/doc/unstable-book/src/library-features/range-bounds-assert-len.md deleted file mode 100644 index 0e95d5ded9..0000000000 --- a/src/doc/unstable-book/src/library-features/range-bounds-assert-len.md +++ /dev/null @@ -1,10 +0,0 @@ -# `range_bounds_assert_len` - -The tracking issue for this feature is: [#76393] - ------------------------- - -This adds [`RangeBounds::assert_len`]. - -[#76393]: https://github.com/rust-lang/rust/issues/76393 -[`RangeBounds::assert_len`]: https://doc.rust-lang.org/nightly/std/ops/trait.RangeBounds.html#method.assert_len diff --git a/src/doc/unstable-book/src/library-features/test.md b/src/doc/unstable-book/src/library-features/test.md index 6b4a3a677d..c99584e5fb 100644 --- a/src/doc/unstable-book/src/library-features/test.md +++ b/src/doc/unstable-book/src/library-features/test.md @@ -9,7 +9,7 @@ most widely used part of the `test` crate are benchmark tests, which can test the performance of your code. Let's make our `src/lib.rs` look like this (comments elided): -```rust,ignore +```rust,no_run #![feature(test)] extern crate test; @@ -83,7 +83,7 @@ the benchmark is no longer benchmarking what one expects. For example, the compiler might recognize that some calculation has no external effects and remove it entirely. -```rust,ignore +```rust,no_run #![feature(test)] extern crate test; diff --git a/src/doc/unstable-book/src/library-features/try-trait.md b/src/doc/unstable-book/src/library-features/try-trait.md index 0c07329025..022640067b 100644 --- a/src/doc/unstable-book/src/library-features/try-trait.md +++ b/src/doc/unstable-book/src/library-features/try-trait.md @@ -16,7 +16,7 @@ macro on `Poll`, among other things. Here's an example implementation of the trait: -```rust,ignore +```rust,ignore (cannot-reimpl-Try) /// A distinct type to represent the `None` value of an `Option`. /// /// This enables using the `?` operator on `Option`; it's rarely useful alone. diff --git a/src/etc/check_missing_items.py b/src/etc/check_missing_items.py index c7ca0134f9..7572b8c6f4 100644 --- a/src/etc/check_missing_items.py +++ b/src/etc/check_missing_items.py @@ -108,7 +108,7 @@ def check_type(ty): elif ty["kind"] == "function_pointer": for param in ty["inner"]["generic_params"]: check_generic_param(param) - check_decl(ty["inner"]["inner"]) + check_decl(ty["inner"]["decl"]) elif ty["kind"] == "qualified_path": check_type(ty["inner"]["self_type"]) check_type(ty["inner"]["trait"]) diff --git a/src/etc/dec2flt_table.py b/src/etc/dec2flt_table.py index 9bbcaf7c4c..ad2292e857 100755 --- a/src/etc/dec2flt_table.py +++ b/src/etc/dec2flt_table.py @@ -113,7 +113,7 @@ def print_proper_powers(): print() print("#[rustfmt::skip]") typ = "([u64; {0}], [i16; {0}])".format(len(powers)) - print("pub const POWERS: ", typ, " = (", sep='') + print("pub static POWERS: ", typ, " = (", sep='') print(" [") for z in powers: print(" 0x{:x},".format(z.sig)) diff --git a/src/etc/gdb_providers.py b/src/etc/gdb_providers.py index 2d902a9b6e..f0ce13b269 100644 --- a/src/etc/gdb_providers.py +++ b/src/etc/gdb_providers.py @@ -349,17 +349,18 @@ class StdHashMapProvider: self.show_values = show_values table = self.table() - capacity = int(table["bucket_mask"]) + 1 - ctrl = table["ctrl"]["pointer"] + table_inner = table["table"] + capacity = int(table_inner["bucket_mask"]) + 1 + ctrl = table_inner["ctrl"]["pointer"] - self.size = int(table["items"]) + self.size = int(table_inner["items"]) self.pair_type = table.type.template_argument(0).strip_typedefs() - self.new_layout = not table.type.has_key("data") + self.new_layout = not table_inner.type.has_key("data") if self.new_layout: self.data_ptr = ctrl.cast(self.pair_type.pointer()) else: - self.data_ptr = table["data"]["pointer"] + self.data_ptr = table_inner["data"]["pointer"] self.valid_indices = [] for idx in range(capacity): diff --git a/src/etc/lldb_providers.py b/src/etc/lldb_providers.py index 9c7b07efba..702f2e82e4 100644 --- a/src/etc/lldb_providers.py +++ b/src/etc/lldb_providers.py @@ -531,7 +531,9 @@ class StdHashMapSyntheticProvider: ctrl = table.GetChildMemberWithName("ctrl").GetChildAtIndex(0) self.size = table.GetChildMemberWithName("items").GetValueAsUnsigned() - self.pair_type = table.type.template_args[0].GetTypedefedType() + self.pair_type = table.type.template_args[0] + if self.pair_type.IsTypedefType(): + self.pair_type = self.pair_type.GetTypedefedType() self.pair_type_size = self.pair_type.GetByteSize() self.new_layout = not table.GetChildMemberWithName("data").IsValid() @@ -561,7 +563,7 @@ class StdHashMapSyntheticProvider: # HashSet wraps either std HashMap or hashbrown::HashSet, which both # wrap hashbrown::HashMap, so either way we "unwrap" twice. hashbrown_hashmap = self.valobj.GetChildAtIndex(0).GetChildAtIndex(0) - return hashbrown_hashmap.GetChildMemberWithName("table") + return hashbrown_hashmap.GetChildMemberWithName("table").GetChildMemberWithName("table") def has_children(self): # type: () -> bool diff --git a/src/etc/natvis/liballoc.natvis b/src/etc/natvis/liballoc.natvis index cfaafc5734..9cc60fc7b4 100644 --- a/src/etc/natvis/liballoc.natvis +++ b/src/etc/natvis/liballoc.natvis @@ -75,4 +75,11 @@ ptr.pointer->data + + Borrowed({__0}) + Owned({__0}) + + __0 + + diff --git a/src/etc/natvis/libcore.natvis b/src/etc/natvis/libcore.natvis index 984a8bfb13..9c3c26f597 100644 --- a/src/etc/natvis/libcore.natvis +++ b/src/etc/natvis/libcore.natvis @@ -30,4 +30,19 @@ + + Ok({__0}) + Err({(*($T2*) &__0)}) + + __0 + (*($T2*) &__0) + + + + + {(void*) pointer} + + *pointer + + \ No newline at end of file diff --git a/src/etc/natvis/libstd.natvis b/src/etc/natvis/libstd.natvis index 7e5ee7b13d..2c05f9d7c1 100644 --- a/src/etc/natvis/libstd.natvis +++ b/src/etc/natvis/libstd.natvis @@ -26,22 +26,22 @@ --> - {{ len={base.table.items} }} + {{ len={base.table.table.items} }} - base.table.items - base.table.items + base.table.growth_left + base.table.table.items + base.table.table.items + base.table.table.growth_left base.hash_builder - - base.table.items + + base.table.table.items - + n-- - ((tuple<$T1, $T2>*)base.table.ctrl.pointer)[-(i + 1)].__1 + ((tuple<$T1, $T2>*)base.table.table.ctrl.pointer)[-(i + 1)].__1 i++ @@ -50,26 +50,55 @@ - {{ len={base.map.table.items} }} + {{ len={base.map.table.table.items} }} - base.map.table.items - base.map.table.items + base.map.table.growth_left + base.map.table.table.items + base.map.table.table.items + base.map.table.table.growth_left base.map.hash_builder - - base.map.table.items + + base.map.table.table.items - + n-- - (($T1*)base.map.table.ctrl.pointer)[-(i + 1)] + (($T1*)base.map.table.table.ctrl.pointer)[-(i + 1)] i++ + + + {inner.data_ptr,s} + + + + + inner.length + (char*)inner.data_ptr + + + + + + + + {(char*) inner} + + + {(char*) inner} + + + strlen((char *) inner) + 1 + (char*)inner + + + + + diff --git a/src/etc/pre-commit.sh b/src/etc/pre-commit.sh index 70b4e9d990..9045adb54d 100755 --- a/src/etc/pre-commit.sh +++ b/src/etc/pre-commit.sh @@ -1,7 +1,7 @@ #!/usr/bin/env bash # # Call `tidy --bless` before each commit -# Copy this scripts to .git/hooks to activate, +# Copy this script to .git/hooks to activate, # and remove it from .git/hooks to deactivate. # diff --git a/src/librustdoc/Cargo.toml b/src/librustdoc/Cargo.toml index b6965898b4..2d0722396f 100644 --- a/src/librustdoc/Cargo.toml +++ b/src/librustdoc/Cargo.toml @@ -10,15 +10,22 @@ path = "lib.rs" [dependencies] arrayvec = { version = "0.5.1", default-features = false } pulldown-cmark = { version = "0.8", default-features = false } -minifier = "0.0.33" +minifier = "0.0.39" rayon = { version = "0.3.0", package = "rustc-rayon" } serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" -smallvec = "1.0" +smallvec = "1.6.1" tempfile = "3" itertools = "0.9" regex = "1" rustdoc-json-types = { path = "../rustdoc-json-types" } +tracing = "0.1" +tracing-tree = "0.1.9" + +[dependencies.tracing-subscriber] +version = "0.2.13" +default-features = false +features = ["fmt", "env-filter", "smallvec", "parking_lot", "ansi"] [dev-dependencies] expect-test = "1.0" diff --git a/src/librustdoc/clean/auto_trait.rs b/src/librustdoc/clean/auto_trait.rs index 83114a72b8..d0e058c7dd 100644 --- a/src/librustdoc/clean/auto_trait.rs +++ b/src/librustdoc/clean/auto_trait.rs @@ -21,130 +21,142 @@ struct RegionDeps<'tcx> { } crate struct AutoTraitFinder<'a, 'tcx> { - crate cx: &'a core::DocContext<'tcx>, - crate f: auto_trait::AutoTraitFinder<'tcx>, + crate cx: &'a mut core::DocContext<'tcx>, } impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { - crate fn new(cx: &'a core::DocContext<'tcx>) -> Self { - let f = auto_trait::AutoTraitFinder::new(cx.tcx); - - AutoTraitFinder { cx, f } + crate fn new(cx: &'a mut core::DocContext<'tcx>) -> Self { + AutoTraitFinder { cx } } - // FIXME(eddyb) figure out a better way to pass information about - // parametrization of `ty` than `param_env_def_id`. - crate fn get_auto_trait_impls(&self, ty: Ty<'tcx>, param_env_def_id: DefId) -> Vec { - let param_env = self.cx.tcx.param_env(param_env_def_id); + fn generate_for_trait( + &mut self, + ty: Ty<'tcx>, + trait_def_id: DefId, + param_env: ty::ParamEnv<'tcx>, + item_def_id: DefId, + f: &auto_trait::AutoTraitFinder<'tcx>, + // If this is set, show only negative trait implementations, not positive ones. + discard_positive_impl: bool, + ) -> Option { + let tcx = self.cx.tcx; + let trait_ref = ty::TraitRef { def_id: trait_def_id, substs: tcx.mk_substs_trait(ty, &[]) }; + if !self.cx.generated_synthetics.insert((ty, trait_def_id)) { + debug!("get_auto_trait_impl_for({:?}): already generated, aborting", trait_ref); + return None; + } - debug!("get_auto_trait_impls({:?})", ty); - let auto_traits = self.cx.auto_traits.iter().cloned(); - auto_traits - .filter_map(|trait_def_id| { - let trait_ref = ty::TraitRef { - def_id: trait_def_id, - substs: self.cx.tcx.mk_substs_trait(ty, &[]), - }; - if !self.cx.generated_synthetics.borrow_mut().insert((ty, trait_def_id)) { - debug!("get_auto_trait_impl_for({:?}): already generated, aborting", trait_ref); + let result = f.find_auto_trait_generics(ty, param_env, trait_def_id, |info| { + let region_data = info.region_data; + + let names_map = tcx + .generics_of(item_def_id) + .params + .iter() + .filter_map(|param| match param.kind { + ty::GenericParamDefKind::Lifetime => Some(param.name), + _ => None, + }) + .map(|name| (name, Lifetime(name))) + .collect(); + let lifetime_predicates = Self::handle_lifetimes(®ion_data, &names_map); + let new_generics = self.param_env_to_generics( + item_def_id, + info.full_user_env, + lifetime_predicates, + info.vid_to_region, + ); + + debug!( + "find_auto_trait_generics(item_def_id={:?}, trait_def_id={:?}): \ + finished with {:?}", + item_def_id, trait_def_id, new_generics + ); + + new_generics + }); + + let negative_polarity; + let new_generics = match result { + AutoTraitResult::PositiveImpl(new_generics) => { + negative_polarity = false; + if discard_positive_impl { return None; } + new_generics + } + AutoTraitResult::NegativeImpl => { + negative_polarity = true; + + // For negative impls, we use the generic params, but *not* the predicates, + // from the original type. Otherwise, the displayed impl appears to be a + // conditional negative impl, when it's really unconditional. + // + // For example, consider the struct Foo(*mut T). Using + // the original predicates in our impl would cause us to generate + // `impl !Send for Foo`, which makes it appear that Foo + // implements Send where T is not copy. + // + // Instead, we generate `impl !Send for Foo`, which better + // expresses the fact that `Foo` never implements `Send`, + // regardless of the choice of `T`. + let params = (tcx.generics_of(item_def_id), ty::GenericPredicates::default()) + .clean(self.cx) + .params; + + Generics { params, where_predicates: Vec::new() } + } + AutoTraitResult::ExplicitImpl => return None, + }; - let result = - self.f.find_auto_trait_generics(ty, param_env, trait_def_id, |infcx, info| { - let region_data = info.region_data; - - let names_map = self - .cx - .tcx - .generics_of(param_env_def_id) - .params - .iter() - .filter_map(|param| match param.kind { - ty::GenericParamDefKind::Lifetime => Some(param.name), - _ => None, - }) - .map(|name| (name, Lifetime(name))) - .collect(); - let lifetime_predicates = self.handle_lifetimes(®ion_data, &names_map); - let new_generics = self.param_env_to_generics( - infcx.tcx, - param_env_def_id, - info.full_user_env, - lifetime_predicates, - info.vid_to_region, - ); - - debug!( - "find_auto_trait_generics(param_env_def_id={:?}, trait_def_id={:?}): \ - finished with {:?}", - param_env_def_id, trait_def_id, new_generics - ); - - new_generics - }); - - let negative_polarity; - let new_generics = match result { - AutoTraitResult::PositiveImpl(new_generics) => { - negative_polarity = false; - new_generics - } - AutoTraitResult::NegativeImpl => { - negative_polarity = true; - - // For negative impls, we use the generic params, but *not* the predicates, - // from the original type. Otherwise, the displayed impl appears to be a - // conditional negative impl, when it's really unconditional. - // - // For example, consider the struct Foo(*mut T). Using - // the original predicates in our impl would cause us to generate - // `impl !Send for Foo`, which makes it appear that Foo - // implements Send where T is not copy. - // - // Instead, we generate `impl !Send for Foo`, which better - // expresses the fact that `Foo` never implements `Send`, - // regardless of the choice of `T`. - let params = ( - self.cx.tcx.generics_of(param_env_def_id), - ty::GenericPredicates::default(), - ) - .clean(self.cx) - .params; - - Generics { params, where_predicates: Vec::new() } - } - AutoTraitResult::ExplicitImpl => return None, - }; - - Some(Item { - source: Span::dummy(), - name: None, - attrs: Default::default(), - visibility: Inherited, - def_id: self.cx.next_def_id(param_env_def_id.krate), - kind: box ImplItem(Impl { - unsafety: hir::Unsafety::Normal, - generics: new_generics, - provided_trait_methods: Default::default(), - trait_: Some(trait_ref.clean(self.cx).get_trait_type().unwrap()), - for_: ty.clean(self.cx), - items: Vec::new(), - negative_polarity, - synthetic: true, - blanket_impl: None, - }), - }) + Some(Item { + source: Span::dummy(), + name: None, + attrs: Default::default(), + visibility: Inherited, + def_id: self.cx.next_def_id(item_def_id.krate), + kind: box ImplItem(Impl { + unsafety: hir::Unsafety::Normal, + generics: new_generics, + provided_trait_methods: Default::default(), + trait_: Some(trait_ref.clean(self.cx).get_trait_type().unwrap()), + for_: ty.clean(self.cx), + items: Vec::new(), + negative_polarity, + synthetic: true, + blanket_impl: None, + }), + }) + } + + crate fn get_auto_trait_impls(&mut self, item_def_id: DefId) -> Vec { + let tcx = self.cx.tcx; + let param_env = tcx.param_env(item_def_id); + let ty = tcx.type_of(item_def_id); + let f = auto_trait::AutoTraitFinder::new(tcx); + + debug!("get_auto_trait_impls({:?})", ty); + let auto_traits: Vec<_> = self.cx.auto_traits.iter().cloned().collect(); + let mut auto_traits: Vec = auto_traits + .into_iter() + .filter_map(|trait_def_id| { + self.generate_for_trait(ty, trait_def_id, param_env, item_def_id, &f, false) }) - .collect() + .collect(); + // We are only interested in case the type *doesn't* implement the Sized trait. + if !ty.is_sized(tcx.at(rustc_span::DUMMY_SP), param_env) { + // In case `#![no_core]` is used, `sized_trait` returns nothing. + if let Some(item) = tcx.lang_items().sized_trait().and_then(|sized_trait_did| { + self.generate_for_trait(ty, sized_trait_did, param_env, item_def_id, &f, true) + }) { + auto_traits.push(item); + } + } + auto_traits } - fn get_lifetime( - &self, - region: Region<'_>, - names_map: &FxHashMap, - ) -> Lifetime { - self.region_name(region) + fn get_lifetime(region: Region<'_>, names_map: &FxHashMap) -> Lifetime { + region_name(region) .map(|name| { names_map.get(&name).unwrap_or_else(|| { panic!("Missing lifetime with name {:?} for {:?}", name.as_str(), region) @@ -154,13 +166,6 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { .clone() } - fn region_name(&self, region: Region<'_>) -> Option { - match region { - &ty::ReEarlyBound(r) => Some(r.name), - _ => None, - } - } - // This method calculates two things: Lifetime constraints of the form 'a: 'b, // and region constraints of the form ReVar: 'a // @@ -172,7 +177,6 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { // to perform the calculations we need on our own, rather than trying to make // existing inference/solver code do what we want. fn handle_lifetimes<'cx>( - &self, regions: &RegionConstraintData<'cx>, names_map: &FxHashMap, ) -> Vec { @@ -210,9 +214,9 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { &Constraint::RegSubReg(r1, r2) => { // The constraint is already in the form that we want, so we're done with it // Desired order is 'larger, smaller', so flip then - if self.region_name(r1) != self.region_name(r2) { + if region_name(r1) != region_name(r2) { finished - .entry(self.region_name(r2).expect("no region_name found")) + .entry(region_name(r2).expect("no region_name found")) .or_default() .push(r1); } @@ -245,9 +249,9 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { for larger in deps.larger.iter() { match (smaller, larger) { (&RegionTarget::Region(r1), &RegionTarget::Region(r2)) => { - if self.region_name(r1) != self.region_name(r2) { + if region_name(r1) != region_name(r2) { finished - .entry(self.region_name(r2).expect("no region name found")) + .entry(region_name(r2).expect("no region name found")) .or_default() .push(r1) // Larger, smaller } @@ -292,7 +296,7 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { .get(name) .unwrap_or(&empty) .iter() - .map(|region| GenericBound::Outlives(self.get_lifetime(region, names_map))) + .map(|region| GenericBound::Outlives(Self::get_lifetime(region, names_map))) .collect(); if bounds.is_empty() { @@ -308,12 +312,9 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { lifetime_predicates } - fn extract_for_generics( - &self, - tcx: TyCtxt<'tcx>, - pred: ty::Predicate<'tcx>, - ) -> FxHashSet { + fn extract_for_generics(&self, pred: ty::Predicate<'tcx>) -> FxHashSet { let bound_predicate = pred.kind(); + let tcx = self.cx.tcx; let regions = match bound_predicate.skip_binder() { ty::PredicateKind::Trait(poly_trait_pred, _) => { tcx.collect_referenced_late_bound_regions(&bound_predicate.rebind(poly_trait_pred)) @@ -437,27 +438,27 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { // K', we use the dedicated syntax 'T: Fn() -> K' // * We explicitly add a '?Sized' bound if we didn't find any 'Sized' predicates for a type fn param_env_to_generics( - &self, - tcx: TyCtxt<'tcx>, - param_env_def_id: DefId, + &mut self, + item_def_id: DefId, param_env: ty::ParamEnv<'tcx>, mut existing_predicates: Vec, vid_to_region: FxHashMap>, ) -> Generics { debug!( - "param_env_to_generics(param_env_def_id={:?}, param_env={:?}, \ + "param_env_to_generics(item_def_id={:?}, param_env={:?}, \ existing_predicates={:?})", - param_env_def_id, param_env, existing_predicates + item_def_id, param_env, existing_predicates ); + let tcx = self.cx.tcx; + // The `Sized` trait must be handled specially, since we only display it when // it is *not* required (i.e., '?Sized') - let sized_trait = self.cx.tcx.require_lang_item(LangItem::Sized, None); + let sized_trait = tcx.require_lang_item(LangItem::Sized, None); let mut replacer = RegionReplacer { vid_to_region: &vid_to_region, tcx }; - let orig_bounds: FxHashSet<_> = - self.cx.tcx.param_env(param_env_def_id).caller_bounds().iter().collect(); + let orig_bounds: FxHashSet<_> = tcx.param_env(item_def_id).caller_bounds().iter().collect(); let clean_where_predicates = param_env .caller_bounds() .iter() @@ -468,20 +469,14 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { _ => false, } }) - .map(|p| { - let replaced = p.fold_with(&mut replacer); - (replaced, replaced.clean(self.cx)) - }); + .map(|p| p.fold_with(&mut replacer)); let mut generic_params = - (tcx.generics_of(param_env_def_id), tcx.explicit_predicates_of(param_env_def_id)) + (tcx.generics_of(item_def_id), tcx.explicit_predicates_of(item_def_id)) .clean(self.cx) .params; - debug!( - "param_env_to_generics({:?}): generic_params={:?}", - param_env_def_id, generic_params - ); + debug!("param_env_to_generics({:?}): generic_params={:?}", item_def_id, generic_params); let mut has_sized = FxHashSet::default(); let mut ty_to_bounds: FxHashMap<_, FxHashSet<_>> = Default::default(); @@ -490,7 +485,8 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { let mut ty_to_fn: FxHashMap, Option)> = Default::default(); - for (orig_p, p) in clean_where_predicates { + for p in clean_where_predicates { + let (orig_p, p) = (p, p.clean(self.cx)); if p.is_none() { continue; } @@ -512,7 +508,7 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { continue; } - let mut for_generics = self.extract_for_generics(tcx, orig_p); + let mut for_generics = self.extract_for_generics(orig_p); assert!(bounds.len() == 1); let mut b = bounds.pop().expect("bounds were empty"); @@ -541,7 +537,7 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { // that we don't end up with duplicate bounds (e.g., for<'b, 'b>) for_generics.extend(p.generic_params.clone()); p.generic_params = for_generics.into_iter().collect(); - self.is_fn_ty(tcx, &p.trait_) + self.is_fn_ty(&p.trait_) } _ => false, }; @@ -576,7 +572,7 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { } => { let mut new_trait_path = trait_path.clone(); - if self.is_fn_ty(tcx, trait_) && left_name == sym::Output { + if self.is_fn_ty(trait_) && left_name == sym::Output { ty_to_fn .entry(*ty.clone()) .and_modify(|e| *e = (e.0.clone(), Some(rhs.clone()))) @@ -644,13 +640,10 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { .or_default() .insert(*trait_.clone()); } - _ => panic!( - "Unexpected trait {:?} for {:?}", - trait_, param_env_def_id, - ), + _ => panic!("Unexpected trait {:?} for {:?}", trait_, item_def_id), } } - _ => panic!("Unexpected LHS {:?} for {:?}", lhs, param_env_def_id), + _ => panic!("Unexpected LHS {:?} for {:?}", lhs, item_def_id), } } }; @@ -737,7 +730,8 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { vec.sort_by_cached_key(|x| format!("{:?}", x)) } - fn is_fn_ty(&self, tcx: TyCtxt<'_>, ty: &Type) -> bool { + fn is_fn_ty(&self, ty: &Type) -> bool { + let tcx = self.cx.tcx; match ty { &Type::ResolvedPath { did, .. } => { did == tcx.require_lang_item(LangItem::Fn, None) @@ -749,6 +743,13 @@ impl<'a, 'tcx> AutoTraitFinder<'a, 'tcx> { } } +fn region_name(region: Region<'_>) -> Option { + match region { + &ty::ReEarlyBound(r) => Some(r.name), + _ => None, + } +} + // Replaces all ReVars in a type with ty::Region's, using the provided map struct RegionReplacer<'a, 'tcx> { vid_to_region: &'a FxHashMap>, diff --git a/src/librustdoc/clean/blanket_impl.rs b/src/librustdoc/clean/blanket_impl.rs index f1c26feea4..4e4e1e5cbc 100644 --- a/src/librustdoc/clean/blanket_impl.rs +++ b/src/librustdoc/clean/blanket_impl.rs @@ -10,24 +10,19 @@ use rustc_span::DUMMY_SP; use super::*; crate struct BlanketImplFinder<'a, 'tcx> { - crate cx: &'a core::DocContext<'tcx>, + crate cx: &'a mut core::DocContext<'tcx>, } impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> { - crate fn new(cx: &'a core::DocContext<'tcx>) -> Self { - BlanketImplFinder { cx } - } - - // FIXME(eddyb) figure out a better way to pass information about - // parametrization of `ty` than `param_env_def_id`. - crate fn get_blanket_impls(&self, ty: Ty<'tcx>, param_env_def_id: DefId) -> Vec { - let param_env = self.cx.tcx.param_env(param_env_def_id); + crate fn get_blanket_impls(&mut self, item_def_id: DefId) -> Vec { + let param_env = self.cx.tcx.param_env(item_def_id); + let ty = self.cx.tcx.type_of(item_def_id); debug!("get_blanket_impls({:?})", ty); let mut impls = Vec::new(); for &trait_def_id in self.cx.tcx.all_traits(LOCAL_CRATE).iter() { - if !self.cx.renderinfo.borrow().access_levels.is_public(trait_def_id) - || self.cx.generated_synthetics.borrow_mut().get(&(ty, trait_def_id)).is_some() + if !self.cx.cache.access_levels.is_public(trait_def_id) + || self.cx.generated_synthetics.get(&(ty, trait_def_id)).is_some() { continue; } @@ -43,7 +38,7 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> { _ => return false, } - let substs = infcx.fresh_substs_for_item(DUMMY_SP, param_env_def_id); + let substs = infcx.fresh_substs_for_item(DUMMY_SP, item_def_id); let ty = ty.subst(infcx.tcx, substs); let param_env = param_env.subst(infcx.tcx, substs); @@ -98,7 +93,7 @@ impl<'a, 'tcx> BlanketImplFinder<'a, 'tcx> { return; } - self.cx.generated_synthetics.borrow_mut().insert((ty, trait_def_id)); + self.cx.generated_synthetics.insert((ty, trait_def_id)); let provided_trait_methods = self .cx .tcx diff --git a/src/librustdoc/clean/cfg.rs b/src/librustdoc/clean/cfg.rs index 444b73246d..02adccef59 100644 --- a/src/librustdoc/clean/cfg.rs +++ b/src/librustdoc/clean/cfg.rs @@ -483,6 +483,7 @@ impl<'a> fmt::Display for Display<'a> { "openbsd" => "OpenBSD", "redox" => "Redox", "solaris" => "Solaris", + "wasi" => "WASI", "windows" => "Windows", _ => "", }, @@ -505,7 +506,6 @@ impl<'a> fmt::Display for Display<'a> { (sym::target_vendor, Some(vendor)) => match &*vendor.as_str() { "apple" => "Apple", "pc" => "PC", - "rumprun" => "Rumprun", "sun" => "Sun", "fortanix" => "Fortanix", _ => "", diff --git a/src/librustdoc/clean/cfg/tests.rs b/src/librustdoc/clean/cfg/tests.rs index 3a78269f19..34b9cbcb67 100644 --- a/src/librustdoc/clean/cfg/tests.rs +++ b/src/librustdoc/clean/cfg/tests.rs @@ -367,6 +367,10 @@ fn test_render_long_html() { name_value_cfg("target_os", "macos").render_long_html(), "This is supported on macOS only." ); + assert_eq!( + name_value_cfg("target_os", "wasi").render_long_html(), + "This is supported on WASI only." + ); assert_eq!( name_value_cfg("target_pointer_width", "16").render_long_html(), "This is supported on 16-bit only." diff --git a/src/librustdoc/clean/inline.rs b/src/librustdoc/clean/inline.rs index 2588c00f2c..47a74238a7 100644 --- a/src/librustdoc/clean/inline.rs +++ b/src/librustdoc/clean/inline.rs @@ -17,6 +17,7 @@ use rustc_span::Span; use crate::clean::{self, Attributes, GetDefId, ToSource, TypeKind}; use crate::core::DocContext; +use crate::formats::item_type::ItemType; use super::Clean; @@ -37,7 +38,7 @@ type Attrs<'hir> = rustc_middle::ty::Attributes<'hir>; /// /// `parent_module` refers to the parent of the *re-export*, not the original item. crate fn try_inline( - cx: &DocContext<'_>, + cx: &mut DocContext<'_>, parent_module: DefId, res: Res, name: Symbol, @@ -122,14 +123,14 @@ crate fn try_inline( let target_attrs = load_attrs(cx, did); let attrs = box merge_attrs(cx, Some(parent_module), target_attrs, attrs_clone); - cx.renderinfo.borrow_mut().inlined.insert(did); + cx.inlined.insert(did); let what_rustc_thinks = clean::Item::from_def_id_and_parts(did, Some(name), kind, cx); ret.push(clean::Item { attrs, ..what_rustc_thinks }); Some(ret) } crate fn try_inline_glob( - cx: &DocContext<'_>, + cx: &mut DocContext<'_>, res: Res, visited: &mut FxHashSet, ) -> Option> { @@ -156,7 +157,7 @@ crate fn load_attrs<'hir>(cx: &DocContext<'hir>, did: DefId) -> Attrs<'hir> { /// /// These names are used later on by HTML rendering to generate things like /// source links back to the original item. -crate fn record_extern_fqn(cx: &DocContext<'_>, did: DefId, kind: clean::TypeKind) { +crate fn record_extern_fqn(cx: &mut DocContext<'_>, did: DefId, kind: clean::TypeKind) { let crate_name = cx.tcx.crate_name(did.krate).to_string(); let relative = cx.tcx.def_path(did).data.into_iter().filter_map(|elem| { @@ -181,13 +182,13 @@ crate fn record_extern_fqn(cx: &DocContext<'_>, did: DefId, kind: clean::TypeKin }; if did.is_local() { - cx.renderinfo.borrow_mut().exact_paths.insert(did, fqn); + cx.cache.exact_paths.insert(did, fqn); } else { - cx.renderinfo.borrow_mut().external_paths.insert(did, (fqn, kind)); + cx.cache.external_paths.insert(did, (fqn, ItemType::from(kind))); } } -crate fn build_external_trait(cx: &DocContext<'_>, did: DefId) -> clean::Trait { +crate fn build_external_trait(cx: &mut DocContext<'_>, did: DefId) -> clean::Trait { let trait_items = cx.tcx.associated_items(did).in_definition_order().map(|item| item.clean(cx)).collect(); @@ -195,39 +196,34 @@ crate fn build_external_trait(cx: &DocContext<'_>, did: DefId) -> clean::Trait { let generics = (cx.tcx.generics_of(did), predicates).clean(cx); let generics = filter_non_trait_generics(did, generics); let (generics, supertrait_bounds) = separate_supertrait_bounds(generics); - let is_spotlight = load_attrs(cx, did).clean(cx).has_doc_flag(sym::spotlight); let is_auto = cx.tcx.trait_is_auto(did); clean::Trait { unsafety: cx.tcx.trait_def(did).unsafety, generics, items: trait_items, bounds: supertrait_bounds, - is_spotlight, is_auto, } } -fn build_external_function(cx: &DocContext<'_>, did: DefId) -> clean::Function { +fn build_external_function(cx: &mut DocContext<'_>, did: DefId) -> clean::Function { let sig = cx.tcx.fn_sig(did); let constness = if is_min_const_fn(cx.tcx, did) { hir::Constness::Const } else { hir::Constness::NotConst }; let asyncness = cx.tcx.asyncness(did); let predicates = cx.tcx.predicates_of(did); - let (generics, decl) = clean::enter_impl_trait(cx, || { + let (generics, decl) = clean::enter_impl_trait(cx, |cx| { ((cx.tcx.generics_of(did), predicates).clean(cx), (did, sig).clean(cx)) }); - let (all_types, ret_types) = clean::get_all_types(&generics, &decl, cx); clean::Function { decl, generics, header: hir::FnHeader { unsafety: sig.unsafety(), abi: sig.abi(), constness, asyncness }, - all_types, - ret_types, } } -fn build_enum(cx: &DocContext<'_>, did: DefId) -> clean::Enum { +fn build_enum(cx: &mut DocContext<'_>, did: DefId) -> clean::Enum { let predicates = cx.tcx.explicit_predicates_of(did); clean::Enum { @@ -237,7 +233,7 @@ fn build_enum(cx: &DocContext<'_>, did: DefId) -> clean::Enum { } } -fn build_struct(cx: &DocContext<'_>, did: DefId) -> clean::Struct { +fn build_struct(cx: &mut DocContext<'_>, did: DefId) -> clean::Struct { let predicates = cx.tcx.explicit_predicates_of(did); let variant = cx.tcx.adt_def(did).non_enum_variant(); @@ -249,7 +245,7 @@ fn build_struct(cx: &DocContext<'_>, did: DefId) -> clean::Struct { } } -fn build_union(cx: &DocContext<'_>, did: DefId) -> clean::Union { +fn build_union(cx: &mut DocContext<'_>, did: DefId) -> clean::Union { let predicates = cx.tcx.explicit_predicates_of(did); let variant = cx.tcx.adt_def(did).non_enum_variant(); @@ -260,7 +256,7 @@ fn build_union(cx: &DocContext<'_>, did: DefId) -> clean::Union { } } -fn build_type_alias(cx: &DocContext<'_>, did: DefId) -> clean::Typedef { +fn build_type_alias(cx: &mut DocContext<'_>, did: DefId) -> clean::Typedef { let predicates = cx.tcx.explicit_predicates_of(did); let type_ = cx.tcx.type_of(did).clean(cx); @@ -273,7 +269,7 @@ fn build_type_alias(cx: &DocContext<'_>, did: DefId) -> clean::Typedef { /// Builds all inherent implementations of an ADT (struct/union/enum) or Trait item/path/reexport. crate fn build_impls( - cx: &DocContext<'_>, + cx: &mut DocContext<'_>, parent_module: Option, did: DefId, attrs: Option>, @@ -289,7 +285,7 @@ crate fn build_impls( /// `parent_module` refers to the parent of the re-export, not the original item fn merge_attrs( - cx: &DocContext<'_>, + cx: &mut DocContext<'_>, parent_module: Option, old_attrs: Attrs<'_>, new_attrs: Option>, @@ -314,13 +310,13 @@ fn merge_attrs( /// Builds a specific implementation of a type. The `did` could be a type method or trait method. crate fn build_impl( - cx: &DocContext<'_>, + cx: &mut DocContext<'_>, parent_module: impl Into>, did: DefId, attrs: Option>, ret: &mut Vec, ) { - if !cx.renderinfo.borrow_mut().inlined.insert(did) { + if !cx.inlined.insert(did) { return; } @@ -332,7 +328,7 @@ crate fn build_impl( if !did.is_local() { if let Some(traitref) = associated_trait { let did = traitref.def_id; - if !cx.renderinfo.borrow().access_levels.is_public(did) { + if !cx.cache.access_levels.is_public(did) { return; } @@ -364,7 +360,7 @@ crate fn build_impl( // reachable in rustdoc generated documentation if !did.is_local() { if let Some(did) = for_.def_id() { - if !cx.renderinfo.borrow().access_levels.is_public(did) { + if !cx.cache.access_levels.is_public(did) { return; } @@ -397,7 +393,7 @@ crate fn build_impl( } }) .collect::>(), - clean::enter_impl_trait(cx, || (tcx.generics_of(did), predicates).clean(cx)), + clean::enter_impl_trait(cx, |cx| (tcx.generics_of(did), predicates).clean(cx)), ), }; let polarity = tcx.impl_polarity(did); @@ -419,7 +415,10 @@ crate fn build_impl( debug!("build_impl: impl {:?} for {:?}", trait_.def_id(), for_.def_id()); - let mut item = clean::Item::from_def_id_and_parts( + let attrs = box merge_attrs(cx, parent_module.into(), load_attrs(cx, did), attrs); + debug!("merged_attrs={:?}", attrs); + + ret.push(clean::Item::from_def_id_and_attrs_and_parts( did, None, clean::ImplItem(clean::Impl { @@ -433,14 +432,16 @@ crate fn build_impl( synthetic: false, blanket_impl: None, }), + attrs, cx, - ); - item.attrs = box merge_attrs(cx, parent_module.into(), load_attrs(cx, did), attrs); - debug!("merged_attrs={:?}", item.attrs); - ret.push(item); + )); } -fn build_module(cx: &DocContext<'_>, did: DefId, visited: &mut FxHashSet) -> clean::Module { +fn build_module( + cx: &mut DocContext<'_>, + did: DefId, + visited: &mut FxHashSet, +) -> clean::Module { let mut items = Vec::new(); // If we're re-exporting a re-export it may actually re-export something in @@ -498,7 +499,7 @@ crate fn print_inlined_const(cx: &DocContext<'_>, did: DefId) -> String { } } -fn build_const(cx: &DocContext<'_>, did: DefId) -> clean::Constant { +fn build_const(cx: &mut DocContext<'_>, did: DefId) -> clean::Constant { clean::Constant { type_: cx.tcx.type_of(did).clean(cx), expr: print_inlined_const(cx, did), @@ -509,15 +510,15 @@ fn build_const(cx: &DocContext<'_>, did: DefId) -> clean::Constant { } } -fn build_static(cx: &DocContext<'_>, did: DefId, mutable: bool) -> clean::Static { +fn build_static(cx: &mut DocContext<'_>, did: DefId, mutable: bool) -> clean::Static { clean::Static { type_: cx.tcx.type_of(did).clean(cx), mutability: if mutable { Mutability::Mut } else { Mutability::Not }, - expr: "\n\n\n".to_string(), // trigger the "[definition]" links + expr: None, } } -fn build_macro(cx: &DocContext<'_>, did: DefId, name: Symbol) -> clean::ItemKind { +fn build_macro(cx: &mut DocContext<'_>, did: DefId, name: Symbol) -> clean::ItemKind { let imported_from = cx.tcx.original_crate_name(did.krate); match cx.enter_resolver(|r| r.cstore().load_macro_untracked(did, cx.sess())) { LoadedMacro::MacroDef(def, _) => { @@ -606,26 +607,29 @@ fn separate_supertrait_bounds( (g, ty_bounds) } -crate fn record_extern_trait(cx: &DocContext<'_>, did: DefId) { +crate fn record_extern_trait(cx: &mut DocContext<'_>, did: DefId) { if did.is_local() { return; } { - if cx.external_traits.borrow().contains_key(&did) - || cx.active_extern_traits.borrow().contains(&did) + if cx.external_traits.borrow().contains_key(&did) || cx.active_extern_traits.contains(&did) { return; } } { - cx.active_extern_traits.borrow_mut().insert(did); + cx.active_extern_traits.insert(did); } debug!("record_extern_trait: {:?}", did); let trait_ = build_external_trait(cx, did); + let trait_ = clean::TraitWithExtraInfo { + trait_, + is_spotlight: clean::utils::has_doc_flag(cx.tcx.get_attrs(did), sym::spotlight), + }; cx.external_traits.borrow_mut().insert(did, trait_); - cx.active_extern_traits.borrow_mut().remove(&did); + cx.active_extern_traits.remove(&did); } diff --git a/src/librustdoc/clean/mod.rs b/src/librustdoc/clean/mod.rs index d14f150514..17a961a5f6 100644 --- a/src/librustdoc/clean/mod.rs +++ b/src/librustdoc/clean/mod.rs @@ -49,43 +49,44 @@ crate use self::types::Visibility::{Inherited, Public}; crate use self::types::*; crate trait Clean { - fn clean(&self, cx: &DocContext<'_>) -> T; + fn clean(&self, cx: &mut DocContext<'_>) -> T; } impl, U> Clean> for [T] { - fn clean(&self, cx: &DocContext<'_>) -> Vec { + fn clean(&self, cx: &mut DocContext<'_>) -> Vec { self.iter().map(|x| x.clean(cx)).collect() } } impl, U, V: Idx> Clean> for IndexVec { - fn clean(&self, cx: &DocContext<'_>) -> IndexVec { + fn clean(&self, cx: &mut DocContext<'_>) -> IndexVec { self.iter().map(|x| x.clean(cx)).collect() } } impl, U> Clean for &T { - fn clean(&self, cx: &DocContext<'_>) -> U { + fn clean(&self, cx: &mut DocContext<'_>) -> U { (**self).clean(cx) } } impl, U> Clean for Rc { - fn clean(&self, cx: &DocContext<'_>) -> U { + fn clean(&self, cx: &mut DocContext<'_>) -> U { (**self).clean(cx) } } impl, U> Clean> for Option { - fn clean(&self, cx: &DocContext<'_>) -> Option { + fn clean(&self, cx: &mut DocContext<'_>) -> Option { self.as_ref().map(|v| v.clean(cx)) } } impl Clean for CrateNum { - fn clean(&self, cx: &DocContext<'_>) -> ExternalCrate { + fn clean(&self, cx: &mut DocContext<'_>) -> ExternalCrate { + let tcx = cx.tcx; let root = DefId { krate: *self, index: CRATE_DEF_INDEX }; - let krate_span = cx.tcx.def_span(root); + let krate_span = tcx.def_span(root); let krate_src = cx.sess().source_map().span_to_filename(krate_span); // Collect all inner modules which are tagged as implementations of @@ -105,7 +106,7 @@ impl Clean for CrateNum { // Also note that this does not attempt to deal with modules tagged // duplicately for the same primitive. This is handled later on when // rendering by delegating everything to a hash map. - let as_primitive = |res: Res| { + let mut as_primitive = |res: Res| { if let Res::Def(DefKind::Mod, def_id) = res { let attrs = cx.tcx.get_attrs(def_id).clean(cx); let mut prim = None; @@ -125,26 +126,24 @@ impl Clean for CrateNum { None }; let primitives = if root.is_local() { - cx.tcx - .hir() + tcx.hir() .krate() .item .module .item_ids .iter() .filter_map(|&id| { - let item = cx.tcx.hir().expect_item(id.id); + let item = tcx.hir().item(id); match item.kind { - hir::ItemKind::Mod(_) => as_primitive(Res::Def( - DefKind::Mod, - cx.tcx.hir().local_def_id(id.id).to_def_id(), - )), + hir::ItemKind::Mod(_) => { + as_primitive(Res::Def(DefKind::Mod, id.def_id.to_def_id())) + } hir::ItemKind::Use(ref path, hir::UseKind::Single) if item.vis.node.is_pub() => { as_primitive(path.res).map(|(_, prim)| { // Pretend the primitive is local. - (cx.tcx.hir().local_def_id(id.id).to_def_id(), prim) + (id.def_id.to_def_id(), prim) }) } _ => None, @@ -152,17 +151,12 @@ impl Clean for CrateNum { }) .collect() } else { - cx.tcx - .item_children(root) - .iter() - .map(|item| item.res) - .filter_map(as_primitive) - .collect() + tcx.item_children(root).iter().map(|item| item.res).filter_map(as_primitive).collect() }; - let as_keyword = |res: Res| { + let mut as_keyword = |res: Res| { if let Res::Def(DefKind::Mod, def_id) = res { - let attrs = cx.tcx.get_attrs(def_id).clean(cx); + let attrs = tcx.get_attrs(def_id).clean(cx); let mut keyword = None; for attr in attrs.lists(sym::doc) { if attr.has_name(sym::keyword) { @@ -177,39 +171,35 @@ impl Clean for CrateNum { None }; let keywords = if root.is_local() { - cx.tcx - .hir() + tcx.hir() .krate() .item .module .item_ids .iter() .filter_map(|&id| { - let item = cx.tcx.hir().expect_item(id.id); + let item = tcx.hir().item(id); match item.kind { - hir::ItemKind::Mod(_) => as_keyword(Res::Def( - DefKind::Mod, - cx.tcx.hir().local_def_id(id.id).to_def_id(), - )), + hir::ItemKind::Mod(_) => { + as_keyword(Res::Def(DefKind::Mod, id.def_id.to_def_id())) + } hir::ItemKind::Use(ref path, hir::UseKind::Single) if item.vis.node.is_pub() => { - as_keyword(path.res).map(|(_, prim)| { - (cx.tcx.hir().local_def_id(id.id).to_def_id(), prim) - }) + as_keyword(path.res).map(|(_, prim)| (id.def_id.to_def_id(), prim)) } _ => None, } }) .collect() } else { - cx.tcx.item_children(root).iter().map(|item| item.res).filter_map(as_keyword).collect() + tcx.item_children(root).iter().map(|item| item.res).filter_map(as_keyword).collect() }; ExternalCrate { - name: cx.tcx.crate_name(*self), + name: tcx.crate_name(*self), src: krate_src, - attrs: cx.tcx.get_attrs(root).clean(cx), + attrs: tcx.get_attrs(root).clean(cx), primitives, keywords, } @@ -217,7 +207,7 @@ impl Clean for CrateNum { } impl Clean for doctree::Module<'_> { - fn clean(&self, cx: &DocContext<'_>) -> Item { + fn clean(&self, cx: &mut DocContext<'_>) -> Item { let mut items: Vec = vec![]; items.extend(self.foreigns.iter().map(|x| x.clean(cx))); items.extend(self.mods.iter().map(|x| x.clean(cx))); @@ -250,13 +240,13 @@ impl Clean for doctree::Module<'_> { } impl Clean for [ast::Attribute] { - fn clean(&self, cx: &DocContext<'_>) -> Attributes { + fn clean(&self, cx: &mut DocContext<'_>) -> Attributes { Attributes::from_ast(cx.sess().diagnostic(), self, None) } } impl Clean for hir::GenericBound<'_> { - fn clean(&self, cx: &DocContext<'_>) -> GenericBound { + fn clean(&self, cx: &mut DocContext<'_>) -> GenericBound { match *self { hir::GenericBound::Outlives(lt) => GenericBound::Outlives(lt.clean(cx)), hir::GenericBound::LangItemTrait(lang_item, span, _, generic_args) => { @@ -283,7 +273,7 @@ impl Clean for hir::GenericBound<'_> { } impl Clean for (ty::TraitRef<'_>, &[TypeBinding]) { - fn clean(&self, cx: &DocContext<'_>) -> Type { + fn clean(&self, cx: &mut DocContext<'_>) -> Type { let (trait_ref, bounds) = *self; inline::record_extern_fqn(cx, trait_ref.def_id, TypeKind::Trait); let path = external_path( @@ -302,7 +292,7 @@ impl Clean for (ty::TraitRef<'_>, &[TypeBinding]) { } impl<'tcx> Clean for ty::TraitRef<'tcx> { - fn clean(&self, cx: &DocContext<'_>) -> GenericBound { + fn clean(&self, cx: &mut DocContext<'_>) -> GenericBound { GenericBound::TraitBound( PolyTrait { trait_: (*self, &[][..]).clean(cx), generic_params: vec![] }, hir::TraitBoundModifier::None, @@ -311,7 +301,7 @@ impl<'tcx> Clean for ty::TraitRef<'tcx> { } impl Clean for (ty::PolyTraitRef<'_>, &[TypeBinding]) { - fn clean(&self, cx: &DocContext<'_>) -> GenericBound { + fn clean(&self, cx: &mut DocContext<'_>) -> GenericBound { let (poly_trait_ref, bounds) = *self; let poly_trait_ref = poly_trait_ref.lift_to_tcx(cx.tcx).unwrap(); @@ -339,13 +329,13 @@ impl Clean for (ty::PolyTraitRef<'_>, &[TypeBinding]) { } impl<'tcx> Clean for ty::PolyTraitRef<'tcx> { - fn clean(&self, cx: &DocContext<'_>) -> GenericBound { + fn clean(&self, cx: &mut DocContext<'_>) -> GenericBound { (*self, &[][..]).clean(cx) } } impl<'tcx> Clean>> for InternalSubsts<'tcx> { - fn clean(&self, cx: &DocContext<'_>) -> Option> { + fn clean(&self, cx: &mut DocContext<'_>) -> Option> { let mut v = Vec::new(); v.extend(self.regions().filter_map(|r| r.clean(cx)).map(GenericBound::Outlives)); v.extend(self.types().map(|t| { @@ -359,7 +349,7 @@ impl<'tcx> Clean>> for InternalSubsts<'tcx> { } impl Clean for hir::Lifetime { - fn clean(&self, cx: &DocContext<'_>) -> Lifetime { + fn clean(&self, cx: &mut DocContext<'_>) -> Lifetime { let def = cx.tcx.named_region(self.hir_id); match def { Some( @@ -367,7 +357,7 @@ impl Clean for hir::Lifetime { | rl::Region::LateBound(_, node_id, _) | rl::Region::Free(_, node_id), ) => { - if let Some(lt) = cx.lt_substs.borrow().get(&node_id).cloned() { + if let Some(lt) = cx.lt_substs.get(&node_id).cloned() { return lt; } } @@ -378,7 +368,7 @@ impl Clean for hir::Lifetime { } impl Clean for hir::GenericParam<'_> { - fn clean(&self, _: &DocContext<'_>) -> Lifetime { + fn clean(&self, _: &mut DocContext<'_>) -> Lifetime { match self.kind { hir::GenericParamKind::Lifetime { .. } => { if !self.bounds.is_empty() { @@ -402,13 +392,13 @@ impl Clean for hir::GenericParam<'_> { } impl Clean for hir::ConstArg { - fn clean(&self, cx: &DocContext<'_>) -> Constant { + fn clean(&self, cx: &mut DocContext<'_>) -> Constant { Constant { type_: cx .tcx .type_of(cx.tcx.hir().body_owner_def_id(self.value.body).to_def_id()) .clean(cx), - expr: print_const_expr(cx, self.value.body), + expr: print_const_expr(cx.tcx, self.value.body), value: None, is_literal: is_literal_expr(cx, self.value.body.hir_id), } @@ -416,13 +406,13 @@ impl Clean for hir::ConstArg { } impl Clean for ty::GenericParamDef { - fn clean(&self, _cx: &DocContext<'_>) -> Lifetime { + fn clean(&self, _cx: &mut DocContext<'_>) -> Lifetime { Lifetime(self.name) } } impl Clean> for ty::RegionKind { - fn clean(&self, _cx: &DocContext<'_>) -> Option { + fn clean(&self, _cx: &mut DocContext<'_>) -> Option { match *self { ty::ReStatic => Some(Lifetime::statik()), ty::ReLateBound(_, ty::BoundRegion { kind: ty::BrNamed(_, name) }) => { @@ -444,7 +434,7 @@ impl Clean> for ty::RegionKind { } impl Clean for hir::WherePredicate<'_> { - fn clean(&self, cx: &DocContext<'_>) -> WherePredicate { + fn clean(&self, cx: &mut DocContext<'_>) -> WherePredicate { match *self { hir::WherePredicate::BoundPredicate(ref wbp) => WherePredicate::BoundPredicate { ty: wbp.bounded_ty.clean(cx), @@ -464,7 +454,7 @@ impl Clean for hir::WherePredicate<'_> { } impl<'a> Clean> for ty::Predicate<'a> { - fn clean(&self, cx: &DocContext<'_>) -> Option { + fn clean(&self, cx: &mut DocContext<'_>) -> Option { let bound_predicate = self.kind(); match bound_predicate.skip_binder() { ty::PredicateKind::Trait(pred, _) => Some(bound_predicate.rebind(pred).clean(cx)), @@ -484,7 +474,7 @@ impl<'a> Clean> for ty::Predicate<'a> { } impl<'a> Clean for ty::PolyTraitPredicate<'a> { - fn clean(&self, cx: &DocContext<'_>) -> WherePredicate { + fn clean(&self, cx: &mut DocContext<'_>) -> WherePredicate { let poly_trait_ref = self.map_bound(|pred| pred.trait_ref); WherePredicate::BoundPredicate { ty: poly_trait_ref.skip_binder().self_ty().clean(cx), @@ -496,7 +486,7 @@ impl<'a> Clean for ty::PolyTraitPredicate<'a> { impl<'tcx> Clean> for ty::OutlivesPredicate, ty::Region<'tcx>> { - fn clean(&self, cx: &DocContext<'_>) -> Option { + fn clean(&self, cx: &mut DocContext<'_>) -> Option { let ty::OutlivesPredicate(a, b) = self; if let (ty::ReEmpty(_), ty::ReEmpty(_)) = (a, b) { @@ -511,7 +501,7 @@ impl<'tcx> Clean> } impl<'tcx> Clean> for ty::OutlivesPredicate, ty::Region<'tcx>> { - fn clean(&self, cx: &DocContext<'_>) -> Option { + fn clean(&self, cx: &mut DocContext<'_>) -> Option { let ty::OutlivesPredicate(ty, lt) = self; if let ty::ReEmpty(_) = lt { @@ -526,14 +516,14 @@ impl<'tcx> Clean> for ty::OutlivesPredicate, ty: } impl<'tcx> Clean for ty::ProjectionPredicate<'tcx> { - fn clean(&self, cx: &DocContext<'_>) -> WherePredicate { + fn clean(&self, cx: &mut DocContext<'_>) -> WherePredicate { let ty::ProjectionPredicate { projection_ty, ty } = self; WherePredicate::EqPredicate { lhs: projection_ty.clean(cx), rhs: ty.clean(cx) } } } impl<'tcx> Clean for ty::ProjectionTy<'tcx> { - fn clean(&self, cx: &DocContext<'_>) -> Type { + fn clean(&self, cx: &mut DocContext<'_>) -> Type { let lifted = self.lift_to_tcx(cx.tcx).unwrap(); let trait_ = match lifted.trait_ref(cx.tcx).clean(cx) { GenericBound::TraitBound(t, _) => t.trait_, @@ -548,7 +538,7 @@ impl<'tcx> Clean for ty::ProjectionTy<'tcx> { } impl Clean for ty::GenericParamDef { - fn clean(&self, cx: &DocContext<'_>) -> GenericParamDef { + fn clean(&self, cx: &mut DocContext<'_>) -> GenericParamDef { let (name, kind) = match self.kind { ty::GenericParamDefKind::Lifetime => (self.name, GenericParamDefKind::Lifetime), ty::GenericParamDefKind::Type { has_default, synthetic, .. } => { @@ -578,7 +568,7 @@ impl Clean for ty::GenericParamDef { } impl Clean for hir::GenericParam<'_> { - fn clean(&self, cx: &DocContext<'_>) -> GenericParamDef { + fn clean(&self, cx: &mut DocContext<'_>) -> GenericParamDef { let (name, kind) = match self.kind { hir::GenericParamKind::Lifetime { .. } => { let name = if !self.bounds.is_empty() { @@ -621,7 +611,7 @@ impl Clean for hir::GenericParam<'_> { } impl Clean for hir::Generics<'_> { - fn clean(&self, cx: &DocContext<'_>) -> Generics { + fn clean(&self, cx: &mut DocContext<'_>) -> Generics { // Synthetic type-parameters are inserted after normal ones. // In order for normal parameters to be able to refer to synthetic ones, // scans them first. @@ -654,7 +644,7 @@ impl Clean for hir::Generics<'_> { match param.kind { GenericParamDefKind::Lifetime => unreachable!(), GenericParamDefKind::Type { did, ref bounds, .. } => { - cx.impl_trait_bounds.borrow_mut().insert(did.into(), bounds.clone()); + cx.impl_trait_bounds.insert(did.into(), bounds.clone()); } GenericParamDefKind::Const { .. } => unreachable!(), } @@ -701,7 +691,7 @@ impl Clean for hir::Generics<'_> { } impl<'a, 'tcx> Clean for (&'a ty::Generics, ty::GenericPredicates<'tcx>) { - fn clean(&self, cx: &DocContext<'_>) -> Generics { + fn clean(&self, cx: &mut DocContext<'_>) -> Generics { use self::WherePredicate as WP; use std::collections::BTreeMap; @@ -805,14 +795,15 @@ impl<'a, 'tcx> Clean for (&'a ty::Generics, ty::GenericPredicates<'tcx if let crate::core::ImplTraitParam::ParamIndex(idx) = param { if let Some(proj) = impl_trait_proj.remove(&idx) { for (trait_did, name, rhs) in proj { - simplify::merge_bounds(cx, &mut bounds, trait_did, name, &rhs.clean(cx)); + let rhs = rhs.clean(cx); + simplify::merge_bounds(cx, &mut bounds, trait_did, name, &rhs); } } } else { unreachable!(); } - cx.impl_trait_bounds.borrow_mut().insert(param, bounds); + cx.impl_trait_bounds.insert(param, bounds); } // Now that `cx.impl_trait_bounds` is populated, we can process @@ -870,9 +861,10 @@ fn clean_fn_or_proc_macro( generics: &'a hir::Generics<'a>, body_id: hir::BodyId, name: &mut Symbol, - cx: &DocContext<'_>, + cx: &mut DocContext<'_>, ) -> ItemKind { - let macro_kind = item.attrs.iter().find_map(|a| { + let attrs = cx.tcx.hir().attrs(item.hir_id()); + let macro_kind = attrs.iter().find_map(|a| { if a.has_name(sym::proc_macro) { Some(MacroKind::Bang) } else if a.has_name(sym::proc_macro_derive) { @@ -886,8 +878,7 @@ fn clean_fn_or_proc_macro( match macro_kind { Some(kind) => { if kind == MacroKind::Derive { - *name = item - .attrs + *name = attrs .lists(sym::proc_macro_derive) .find_map(|mi| mi.ident()) .expect("proc-macro derives require a name") @@ -895,7 +886,7 @@ fn clean_fn_or_proc_macro( } let mut helpers = Vec::new(); - for mi in item.attrs.lists(sym::proc_macro_derive) { + for mi in attrs.lists(sym::proc_macro_derive) { if !mi.has_name(sym::attributes) { continue; } @@ -912,7 +903,7 @@ fn clean_fn_or_proc_macro( } None => { let mut func = (sig, generics, body_id).clean(cx); - let def_id = cx.tcx.hir().local_def_id(item.hir_id).to_def_id(); + let def_id = item.def_id.to_def_id(); func.header.constness = if is_const_fn(cx.tcx, def_id) && is_unstable_const_fn(cx.tcx, def_id).is_none() { hir::Constness::Const @@ -925,16 +916,15 @@ fn clean_fn_or_proc_macro( } impl<'a> Clean for (&'a hir::FnSig<'a>, &'a hir::Generics<'a>, hir::BodyId) { - fn clean(&self, cx: &DocContext<'_>) -> Function { + fn clean(&self, cx: &mut DocContext<'_>) -> Function { let (generics, decl) = - enter_impl_trait(cx, || (self.1.clean(cx), (&*self.0.decl, self.2).clean(cx))); - let (all_types, ret_types) = get_all_types(&generics, &decl, cx); - Function { decl, generics, header: self.0.header, all_types, ret_types } + enter_impl_trait(cx, |cx| (self.1.clean(cx), (&*self.0.decl, self.2).clean(cx))); + Function { decl, generics, header: self.0.header } } } impl<'a> Clean for (&'a [hir::Ty<'a>], &'a [Ident]) { - fn clean(&self, cx: &DocContext<'_>) -> Arguments { + fn clean(&self, cx: &mut DocContext<'_>) -> Arguments { Arguments { values: self .0 @@ -953,7 +943,7 @@ impl<'a> Clean for (&'a [hir::Ty<'a>], &'a [Ident]) { } impl<'a> Clean for (&'a [hir::Ty<'a>], hir::BodyId) { - fn clean(&self, cx: &DocContext<'_>) -> Arguments { + fn clean(&self, cx: &mut DocContext<'_>) -> Arguments { let body = cx.tcx.hir().body(self.1); Arguments { @@ -974,9 +964,9 @@ impl<'a, A: Copy> Clean for (&'a hir::FnDecl<'a>, A) where (&'a [hir::Ty<'a>], A): Clean, { - fn clean(&self, cx: &DocContext<'_>) -> FnDecl { + fn clean(&self, cx: &mut DocContext<'_>) -> FnDecl { FnDecl { - inputs: (&self.0.inputs[..], self.1).clean(cx), + inputs: (self.0.inputs, self.1).clean(cx), output: self.0.output.clean(cx), c_variadic: self.0.c_variadic, attrs: Attributes::default(), @@ -985,7 +975,7 @@ where } impl<'tcx> Clean for (DefId, ty::PolyFnSig<'tcx>) { - fn clean(&self, cx: &DocContext<'_>) -> FnDecl { + fn clean(&self, cx: &mut DocContext<'_>) -> FnDecl { let (did, sig) = *self; let mut names = if did.is_local() { &[] } else { cx.tcx.fn_arg_names(did) }.iter(); @@ -1009,7 +999,7 @@ impl<'tcx> Clean for (DefId, ty::PolyFnSig<'tcx>) { } impl Clean for hir::FnRetTy<'_> { - fn clean(&self, cx: &DocContext<'_>) -> FnRetTy { + fn clean(&self, cx: &mut DocContext<'_>) -> FnRetTy { match *self { Self::Return(ref typ) => Return(typ.clean(cx)), Self::DefaultReturn(..) => DefaultReturn, @@ -1018,7 +1008,7 @@ impl Clean for hir::FnRetTy<'_> { } impl Clean for hir::IsAuto { - fn clean(&self, _: &DocContext<'_>) -> bool { + fn clean(&self, _: &mut DocContext<'_>) -> bool { match *self { hir::IsAuto::Yes => true, hir::IsAuto::No => false, @@ -1027,13 +1017,14 @@ impl Clean for hir::IsAuto { } impl Clean for hir::TraitRef<'_> { - fn clean(&self, cx: &DocContext<'_>) -> Type { - resolve_type(cx, self.path.clean(cx), self.hir_ref_id) + fn clean(&self, cx: &mut DocContext<'_>) -> Type { + let path = self.path.clean(cx); + resolve_type(cx, path, self.hir_ref_id) } } impl Clean for hir::PolyTraitRef<'_> { - fn clean(&self, cx: &DocContext<'_>) -> PolyTrait { + fn clean(&self, cx: &mut DocContext<'_>) -> PolyTrait { PolyTrait { trait_: self.trait_ref.clean(cx), generic_params: self.bound_generic_params.clean(cx), @@ -1042,32 +1033,18 @@ impl Clean for hir::PolyTraitRef<'_> { } impl Clean for hir::def::DefKind { - fn clean(&self, _: &DocContext<'_>) -> TypeKind { - match *self { - hir::def::DefKind::Mod => TypeKind::Module, - hir::def::DefKind::Struct => TypeKind::Struct, - hir::def::DefKind::Union => TypeKind::Union, - hir::def::DefKind::Enum => TypeKind::Enum, - hir::def::DefKind::Trait => TypeKind::Trait, - hir::def::DefKind::TyAlias => TypeKind::Typedef, - hir::def::DefKind::ForeignTy => TypeKind::Foreign, - hir::def::DefKind::TraitAlias => TypeKind::TraitAlias, - hir::def::DefKind::Fn => TypeKind::Function, - hir::def::DefKind::Const => TypeKind::Const, - hir::def::DefKind::Static => TypeKind::Static, - hir::def::DefKind::Macro(_) => TypeKind::Macro, - _ => TypeKind::Foreign, - } + fn clean(&self, _: &mut DocContext<'_>) -> TypeKind { + (*self).into() } } impl Clean for hir::TraitItem<'_> { - fn clean(&self, cx: &DocContext<'_>) -> Item { - let local_did = cx.tcx.hir().local_def_id(self.hir_id).to_def_id(); - cx.with_param_env(local_did, || { + fn clean(&self, cx: &mut DocContext<'_>) -> Item { + let local_did = self.def_id.to_def_id(); + cx.with_param_env(local_did, |cx| { let inner = match self.kind { hir::TraitItemKind::Const(ref ty, default) => { - AssocConstItem(ty.clean(cx), default.map(|e| print_const_expr(cx, e))) + AssocConstItem(ty.clean(cx), default.map(|e| print_const_expr(cx.tcx, e))) } hir::TraitItemKind::Fn(ref sig, hir::TraitFn::Provided(body)) => { let mut m = (sig, &self.generics, body).clean(cx); @@ -1079,12 +1056,10 @@ impl Clean for hir::TraitItem<'_> { MethodItem(m, None) } hir::TraitItemKind::Fn(ref sig, hir::TraitFn::Required(ref names)) => { - let (generics, decl) = enter_impl_trait(cx, || { + let (generics, decl) = enter_impl_trait(cx, |cx| { (self.generics.clean(cx), (&*sig.decl, &names[..]).clean(cx)) }); - let (all_types, ret_types) = get_all_types(&generics, &decl, cx); - let mut t = - Function { header: sig.header, decl, generics, all_types, ret_types }; + let mut t = Function { header: sig.header, decl, generics }; if t.header.constness == hir::Constness::Const && is_unstable_const_fn(cx.tcx, local_did).is_some() { @@ -1105,12 +1080,12 @@ impl Clean for hir::TraitItem<'_> { } impl Clean for hir::ImplItem<'_> { - fn clean(&self, cx: &DocContext<'_>) -> Item { - let local_did = cx.tcx.hir().local_def_id(self.hir_id).to_def_id(); - cx.with_param_env(local_did, || { + fn clean(&self, cx: &mut DocContext<'_>) -> Item { + let local_did = self.def_id.to_def_id(); + cx.with_param_env(local_did, |cx| { let inner = match self.kind { hir::ImplItemKind::Const(ref ty, expr) => { - AssocConstItem(ty.clean(cx), Some(print_const_expr(cx, expr))) + AssocConstItem(ty.clean(cx), Some(print_const_expr(cx.tcx, expr))) } hir::ImplItemKind::Fn(ref sig, body) => { let mut m = (sig, &self.generics, body).clean(cx); @@ -1137,7 +1112,7 @@ impl Clean for hir::ImplItem<'_> { let what_rustc_thinks = Item::from_def_id_and_parts(local_did, Some(self.ident.name), inner, cx); - let parent_item = cx.tcx.hir().expect_item(cx.tcx.hir().get_parent_item(self.hir_id)); + let parent_item = cx.tcx.hir().expect_item(cx.tcx.hir().get_parent_item(self.hir_id())); if let hir::ItemKind::Impl(impl_) = &parent_item.kind { if impl_.of_trait.is_some() { // Trait impl items always inherit the impl's visibility -- @@ -1154,10 +1129,11 @@ impl Clean for hir::ImplItem<'_> { } impl Clean for ty::AssocItem { - fn clean(&self, cx: &DocContext<'_>) -> Item { + fn clean(&self, cx: &mut DocContext<'_>) -> Item { + let tcx = cx.tcx; let kind = match self.kind { ty::AssocKind::Const => { - let ty = cx.tcx.type_of(self.def_id); + let ty = tcx.type_of(self.def_id); let default = if self.defaultness.has_value() { Some(inline::print_inlined_const(cx, self.def_id)) } else { @@ -1167,15 +1143,15 @@ impl Clean for ty::AssocItem { } ty::AssocKind::Fn => { let generics = - (cx.tcx.generics_of(self.def_id), cx.tcx.explicit_predicates_of(self.def_id)) + (tcx.generics_of(self.def_id), tcx.explicit_predicates_of(self.def_id)) .clean(cx); - let sig = cx.tcx.fn_sig(self.def_id); + let sig = tcx.fn_sig(self.def_id); let mut decl = (self.def_id, sig).clean(cx); if self.fn_has_self_parameter { let self_ty = match self.container { - ty::ImplContainer(def_id) => cx.tcx.type_of(def_id), - ty::TraitContainer(_) => cx.tcx.types.self_param, + ty::ImplContainer(def_id) => tcx.type_of(def_id), + ty::TraitContainer(_) => tcx.types.self_param, }; let self_arg_ty = sig.input(0).skip_binder(); if self_arg_ty == self_ty { @@ -1196,14 +1172,13 @@ impl Clean for ty::AssocItem { ty::ImplContainer(_) => true, ty::TraitContainer(_) => self.defaultness.has_value(), }; - let (all_types, ret_types) = get_all_types(&generics, &decl, cx); if provided { - let constness = if is_min_const_fn(cx.tcx, self.def_id) { + let constness = if is_min_const_fn(tcx, self.def_id) { hir::Constness::Const } else { hir::Constness::NotConst }; - let asyncness = cx.tcx.asyncness(self.def_id); + let asyncness = tcx.asyncness(self.def_id); let defaultness = match self.container { ty::ImplContainer(_) => Some(self.defaultness), ty::TraitContainer(_) => None, @@ -1218,8 +1193,6 @@ impl Clean for ty::AssocItem { constness, asyncness, }, - all_types, - ret_types, }, defaultness, ) @@ -1233,8 +1206,6 @@ impl Clean for ty::AssocItem { constness: hir::Constness::NotConst, asyncness: hir::IsAsync::NotAsync, }, - all_types, - ret_types, }) } } @@ -1242,9 +1213,9 @@ impl Clean for ty::AssocItem { let my_name = self.ident.name; if let ty::TraitContainer(_) = self.container { - let bounds = cx.tcx.explicit_item_bounds(self.def_id); + let bounds = tcx.explicit_item_bounds(self.def_id); let predicates = ty::GenericPredicates { parent: None, predicates: bounds }; - let generics = (cx.tcx.generics_of(self.def_id), predicates).clean(cx); + let generics = (tcx.generics_of(self.def_id), predicates).clean(cx); let mut bounds = generics .where_predicates .iter() @@ -1284,15 +1255,15 @@ impl Clean for ty::AssocItem { } let ty = if self.defaultness.has_value() { - Some(cx.tcx.type_of(self.def_id)) + Some(tcx.type_of(self.def_id)) } else { None }; AssocTypeItem(bounds, ty.clean(cx)) } else { - // FIXME: when could this happen? ASsociated items in inherent impls? - let type_ = cx.tcx.type_of(self.def_id).clean(cx); + // FIXME: when could this happen? Associated items in inherent impls? + let type_ = tcx.type_of(self.def_id).clean(cx); TypedefItem( Typedef { type_, @@ -1309,7 +1280,7 @@ impl Clean for ty::AssocItem { } } -fn clean_qpath(hir_ty: &hir::Ty<'_>, cx: &DocContext<'_>) -> Type { +fn clean_qpath(hir_ty: &hir::Ty<'_>, cx: &mut DocContext<'_>) -> Type { use rustc_hir::GenericParamCount; let hir::Ty { hir_id, span, ref kind } = *hir_ty; let qpath = match kind { @@ -1320,10 +1291,10 @@ fn clean_qpath(hir_ty: &hir::Ty<'_>, cx: &DocContext<'_>) -> Type { match qpath { hir::QPath::Resolved(None, ref path) => { if let Res::Def(DefKind::TyParam, did) = path.res { - if let Some(new_ty) = cx.ty_substs.borrow().get(&did).cloned() { + if let Some(new_ty) = cx.ty_substs.get(&did).cloned() { return new_ty; } - if let Some(bounds) = cx.impl_trait_bounds.borrow_mut().remove(&did.into()) { + if let Some(bounds) = cx.impl_trait_bounds.remove(&did.into()) { return ImplTrait(bounds); } } @@ -1333,7 +1304,7 @@ fn clean_qpath(hir_ty: &hir::Ty<'_>, cx: &DocContext<'_>) -> Type { // Substitute private type aliases if let Some(def_id) = def_id.as_local() { let hir_id = cx.tcx.hir().local_def_id_to_hir_id(def_id); - if !cx.renderinfo.borrow().access_levels.is_exported(def_id.to_def_id()) { + if !cx.cache.access_levels.is_exported(def_id.to_def_id()) { alias = Some(&cx.tcx.hir().expect_item(hir_id).kind); } } @@ -1415,9 +1386,10 @@ fn clean_qpath(hir_ty: &hir::Ty<'_>, cx: &DocContext<'_>) -> Type { } } } - return cx.enter_alias(ty_substs, lt_substs, ct_substs, || ty.clean(cx)); + return cx.enter_alias(ty_substs, lt_substs, ct_substs, |cx| ty.clean(cx)); } - resolve_type(cx, path.clean(cx), hir_id) + let path = path.clean(cx); + resolve_type(cx, path, hir_id) } hir::QPath::Resolved(Some(ref qself), ref p) => { // Try to normalize `::T` to a type @@ -1449,11 +1421,11 @@ fn clean_qpath(hir_ty: &hir::Ty<'_>, cx: &DocContext<'_>) -> Type { } else { Res::Err }; - let trait_path = hir::Path { span, res, segments: &[] }; + let trait_path = hir::Path { span, res, segments: &[] }.clean(cx); Type::QPath { name: segment.ident.name, self_type: box qself.clean(cx), - trait_: box resolve_type(cx, trait_path.clean(cx), hir_id), + trait_: box resolve_type(cx, trait_path, hir_id), } } hir::QPath::LangItem(..) => bug!("clean: requiring documentation of lang item"), @@ -1461,7 +1433,7 @@ fn clean_qpath(hir_ty: &hir::Ty<'_>, cx: &DocContext<'_>) -> Type { } impl Clean for hir::Ty<'_> { - fn clean(&self, cx: &DocContext<'_>) -> Type { + fn clean(&self, cx: &mut DocContext<'_>) -> Type { use rustc_hir::*; match self.kind { @@ -1497,7 +1469,7 @@ impl Clean for hir::Ty<'_> { } TyKind::Tup(ref tys) => Tuple(tys.clean(cx)), TyKind::OpaqueDef(item_id, _) => { - let item = cx.tcx.hir().expect_item(item_id.id); + let item = cx.tcx.hir().item(item_id); if let hir::ItemKind::OpaqueTy(ref ty) = item.kind { ImplTrait(ty.bounds.clean(cx)) } else { @@ -1505,7 +1477,7 @@ impl Clean for hir::Ty<'_> { } } TyKind::Path(_) => clean_qpath(&self, cx), - TyKind::TraitObject(ref bounds, ref lifetime) => { + TyKind::TraitObject(ref bounds, ref lifetime, _) => { match bounds[0].clean(cx).trait_ { ResolvedPath { path, param_names: None, did, is_generic } => { let mut bounds: Vec = bounds[1..] @@ -1533,7 +1505,7 @@ impl Clean for hir::Ty<'_> { } /// Returns `None` if the type could not be normalized -fn normalize(cx: &DocContext<'tcx>, ty: Ty<'_>) -> Option> { +fn normalize(cx: &mut DocContext<'tcx>, ty: Ty<'_>) -> Option> { // HACK: low-churn fix for #79459 while we wait for a trait normalization fix if !cx.tcx.sess.opts.debugging_opts.normalize_docs { return None; @@ -1547,7 +1519,7 @@ fn normalize(cx: &DocContext<'tcx>, ty: Ty<'_>) -> Option> { let lifted = ty.lift_to_tcx(cx.tcx).unwrap(); let normalized = cx.tcx.infer_ctxt().enter(|infcx| { infcx - .at(&ObligationCause::dummy(), cx.param_env.get()) + .at(&ObligationCause::dummy(), cx.param_env) .normalize(lifted) .map(|resolved| infcx.resolve_vars_if_possible(resolved.value)) }); @@ -1564,7 +1536,7 @@ fn normalize(cx: &DocContext<'tcx>, ty: Ty<'_>) -> Option> { } impl<'tcx> Clean for Ty<'tcx> { - fn clean(&self, cx: &DocContext<'_>) -> Type { + fn clean(&self, cx: &mut DocContext<'_>) -> Type { debug!("cleaning type: {:?}", self); let ty = normalize(cx, self).unwrap_or(self); match *ty.kind() { @@ -1679,7 +1651,7 @@ impl<'tcx> Clean for Ty<'tcx> { ty::Projection(ref data) => data.clean(cx), ty::Param(ref p) => { - if let Some(bounds) = cx.impl_trait_bounds.borrow_mut().remove(&p.index.into()) { + if let Some(bounds) = cx.impl_trait_bounds.remove(&p.index.into()) { ImplTrait(bounds) } else { Generic(p.name) @@ -1772,7 +1744,7 @@ impl<'tcx> Clean for Ty<'tcx> { } impl<'tcx> Clean for ty::Const<'tcx> { - fn clean(&self, cx: &DocContext<'_>) -> Constant { + fn clean(&self, cx: &mut DocContext<'_>) -> Constant { Constant { type_: self.ty.clean(cx), expr: format!("{}", self), @@ -1782,8 +1754,8 @@ impl<'tcx> Clean for ty::Const<'tcx> { } } -impl Clean for hir::StructField<'_> { - fn clean(&self, cx: &DocContext<'_>) -> Item { +impl Clean for hir::FieldDef<'_> { + fn clean(&self, cx: &mut DocContext<'_>) -> Item { let what_rustc_thinks = Item::from_hir_id_and_parts( self.hir_id, Some(self.ident.name), @@ -1796,7 +1768,7 @@ impl Clean for hir::StructField<'_> { } impl Clean for ty::FieldDef { - fn clean(&self, cx: &DocContext<'_>) -> Item { + fn clean(&self, cx: &mut DocContext<'_>) -> Item { let what_rustc_thinks = Item::from_def_id_and_parts( self.did, Some(self.ident.name), @@ -1809,7 +1781,7 @@ impl Clean for ty::FieldDef { } impl Clean for hir::Visibility<'_> { - fn clean(&self, cx: &DocContext<'_>) -> Visibility { + fn clean(&self, cx: &mut DocContext<'_>) -> Visibility { match self.node { hir::VisibilityKind::Public => Visibility::Public, hir::VisibilityKind::Inherited => Visibility::Inherited, @@ -1827,7 +1799,7 @@ impl Clean for hir::Visibility<'_> { } impl Clean for ty::Visibility { - fn clean(&self, _cx: &DocContext<'_>) -> Visibility { + fn clean(&self, _cx: &mut DocContext<'_>) -> Visibility { match *self { ty::Visibility::Public => Visibility::Public, // NOTE: this is not quite right: `ty` uses `Invisible` to mean 'private', @@ -1842,7 +1814,7 @@ impl Clean for ty::Visibility { } impl Clean for rustc_hir::VariantData<'_> { - fn clean(&self, cx: &DocContext<'_>) -> VariantStruct { + fn clean(&self, cx: &mut DocContext<'_>) -> VariantStruct { VariantStruct { struct_type: CtorKind::from_hir(self), fields: self.fields().iter().map(|x| x.clean(cx)).collect(), @@ -1852,7 +1824,7 @@ impl Clean for rustc_hir::VariantData<'_> { } impl Clean for ty::VariantDef { - fn clean(&self, cx: &DocContext<'_>) -> Item { + fn clean(&self, cx: &mut DocContext<'_>) -> Item { let kind = match self.ctor_kind { CtorKind::Const => Variant::CLike, CtorKind::Fn => Variant::Tuple( @@ -1883,7 +1855,7 @@ impl Clean for ty::VariantDef { } impl Clean for hir::VariantData<'_> { - fn clean(&self, cx: &DocContext<'_>) -> Variant { + fn clean(&self, cx: &mut DocContext<'_>) -> Variant { match self { hir::VariantData::Struct(..) => Variant::Struct(self.clean(cx)), hir::VariantData::Tuple(..) => { @@ -1895,13 +1867,13 @@ impl Clean for hir::VariantData<'_> { } impl Clean for rustc_span::Span { - fn clean(&self, _cx: &DocContext<'_>) -> Span { + fn clean(&self, _cx: &mut DocContext<'_>) -> Span { Span::from_rustc_span(*self) } } impl Clean for hir::Path<'_> { - fn clean(&self, cx: &DocContext<'_>) -> Path { + fn clean(&self, cx: &mut DocContext<'_>) -> Path { Path { global: self.is_global(), res: self.res, @@ -1911,7 +1883,7 @@ impl Clean for hir::Path<'_> { } impl Clean for hir::GenericArgs<'_> { - fn clean(&self, cx: &DocContext<'_>) -> GenericArgs { + fn clean(&self, cx: &mut DocContext<'_>) -> GenericArgs { if self.parenthesized { let output = self.bindings[0].ty().clean(cx); GenericArgs::Parenthesized { @@ -1939,51 +1911,49 @@ impl Clean for hir::GenericArgs<'_> { } impl Clean for hir::PathSegment<'_> { - fn clean(&self, cx: &DocContext<'_>) -> PathSegment { + fn clean(&self, cx: &mut DocContext<'_>) -> PathSegment { PathSegment { name: self.ident.name, args: self.args().clean(cx) } } } impl Clean for Ident { #[inline] - fn clean(&self, cx: &DocContext<'_>) -> String { + fn clean(&self, cx: &mut DocContext<'_>) -> String { self.name.clean(cx) } } impl Clean for Symbol { #[inline] - fn clean(&self, _: &DocContext<'_>) -> String { + fn clean(&self, _: &mut DocContext<'_>) -> String { self.to_string() } } impl Clean for hir::BareFnTy<'_> { - fn clean(&self, cx: &DocContext<'_>) -> BareFunctionDecl { - let (generic_params, decl) = enter_impl_trait(cx, || { - (self.generic_params.clean(cx), (&*self.decl, &self.param_names[..]).clean(cx)) + fn clean(&self, cx: &mut DocContext<'_>) -> BareFunctionDecl { + let (generic_params, decl) = enter_impl_trait(cx, |cx| { + (self.generic_params.clean(cx), (&*self.decl, self.param_names).clean(cx)) }); BareFunctionDecl { unsafety: self.unsafety, abi: self.abi, decl, generic_params } } } impl Clean> for (&hir::Item<'_>, Option) { - fn clean(&self, cx: &DocContext<'_>) -> Vec { + fn clean(&self, cx: &mut DocContext<'_>) -> Vec { use hir::ItemKind; let (item, renamed) = self; - let def_id = cx.tcx.hir().local_def_id(item.hir_id).to_def_id(); - let mut name = renamed.unwrap_or_else(|| cx.tcx.hir().name(item.hir_id)); - cx.with_param_env(def_id, || { + let def_id = item.def_id.to_def_id(); + let mut name = renamed.unwrap_or_else(|| cx.tcx.hir().name(item.hir_id())); + cx.with_param_env(def_id, |cx| { let kind = match item.kind { - ItemKind::Static(ty, mutability, body_id) => StaticItem(Static { - type_: ty.clean(cx), - mutability, - expr: print_const_expr(cx, body_id), - }), + ItemKind::Static(ty, mutability, body_id) => { + StaticItem(Static { type_: ty.clean(cx), mutability, expr: Some(body_id) }) + } ItemKind::Const(ty, body_id) => ConstantItem(Constant { type_: ty.clean(cx), - expr: print_const_expr(cx, body_id), + expr: print_const_expr(cx.tcx, body_id), value: print_evaluated_const(cx, def_id), is_literal: is_literal_expr(cx, body_id.hir_id), }), @@ -2023,7 +1993,7 @@ impl Clean> for (&hir::Item<'_>, Option) { fields: variant_data.fields().clean(cx), fields_stripped: false, }), - ItemKind::Impl(ref impl_) => return clean_impl(impl_, item.hir_id, cx), + ItemKind::Impl(ref impl_) => return clean_impl(impl_, item.hir_id(), cx), // proc macros can have a name set by attributes ItemKind::Fn(ref sig, ref generics, body_id) => { clean_fn_or_proc_macro(item, sig, generics, body_id, &mut name, cx) @@ -2033,14 +2003,11 @@ impl Clean> for (&hir::Item<'_>, Option) { .iter() .map(|ti| cx.tcx.hir().trait_item(ti.id).clean(cx)) .collect(); - let attrs = item.attrs.clean(cx); - let is_spotlight = attrs.has_doc_flag(sym::spotlight); TraitItem(Trait { unsafety, items, generics: generics.clean(cx), bounds: bounds.clean(cx), - is_spotlight, is_auto: is_auto.clean(cx), }) } @@ -2059,7 +2026,7 @@ impl Clean> for (&hir::Item<'_>, Option) { } impl Clean for hir::Variant<'_> { - fn clean(&self, cx: &DocContext<'_>) -> Item { + fn clean(&self, cx: &mut DocContext<'_>) -> Item { let kind = VariantItem(self.data.clean(cx)); let what_rustc_thinks = Item::from_hir_id_and_parts(self.id, Some(self.ident.name), kind, cx); @@ -2070,7 +2037,7 @@ impl Clean for hir::Variant<'_> { impl Clean for ty::ImplPolarity { /// Returns whether the impl has negative polarity. - fn clean(&self, _: &DocContext<'_>) -> bool { + fn clean(&self, _: &mut DocContext<'_>) -> bool { match self { &ty::ImplPolarity::Positive | // FIXME: do we want to do something else here? @@ -2080,30 +2047,31 @@ impl Clean for ty::ImplPolarity { } } -fn clean_impl(impl_: &hir::Impl<'_>, hir_id: hir::HirId, cx: &DocContext<'_>) -> Vec { +fn clean_impl(impl_: &hir::Impl<'_>, hir_id: hir::HirId, cx: &mut DocContext<'_>) -> Vec { + let tcx = cx.tcx; let mut ret = Vec::new(); let trait_ = impl_.of_trait.clean(cx); let items = - impl_.items.iter().map(|ii| cx.tcx.hir().impl_item(ii.id).clean(cx)).collect::>(); - let def_id = cx.tcx.hir().local_def_id(hir_id); + impl_.items.iter().map(|ii| tcx.hir().impl_item(ii.id).clean(cx)).collect::>(); + let def_id = tcx.hir().local_def_id(hir_id); // If this impl block is an implementation of the Deref trait, then we // need to try inlining the target's inherent impl blocks as well. - if trait_.def_id() == cx.tcx.lang_items().deref_trait() { + if trait_.def_id() == tcx.lang_items().deref_trait() { build_deref_target_impls(cx, &items, &mut ret); } let provided: FxHashSet = trait_ .def_id() - .map(|did| cx.tcx.provided_trait_methods(did).map(|meth| meth.ident.name).collect()) + .map(|did| tcx.provided_trait_methods(did).map(|meth| meth.ident.name).collect()) .unwrap_or_default(); let for_ = impl_.self_ty.clean(cx); - let type_alias = for_.def_id().and_then(|did| match cx.tcx.def_kind(did) { - DefKind::TyAlias => Some(cx.tcx.type_of(did).clean(cx)), + let type_alias = for_.def_id().and_then(|did| match tcx.def_kind(did) { + DefKind::TyAlias => Some(tcx.type_of(did).clean(cx)), _ => None, }); - let make_item = |trait_: Option, for_: Type, items: Vec| { + let mut make_item = |trait_: Option, for_: Type, items: Vec| { let kind = ImplItem(Impl { unsafety: impl_.unsafety, generics: impl_.generics.clean(cx), @@ -2111,7 +2079,7 @@ fn clean_impl(impl_: &hir::Impl<'_>, hir_id: hir::HirId, cx: &DocContext<'_>) -> trait_, for_, items, - negative_polarity: cx.tcx.impl_polarity(def_id).clean(cx), + negative_polarity: tcx.impl_polarity(def_id).clean(cx), synthetic: false, blanket_impl: None, }); @@ -2128,15 +2096,15 @@ fn clean_extern_crate( krate: &hir::Item<'_>, name: Symbol, orig_name: Option, - cx: &DocContext<'_>, + cx: &mut DocContext<'_>, ) -> Vec { // this is the ID of the `extern crate` statement - let def_id = cx.tcx.hir().local_def_id(krate.hir_id); - let cnum = cx.tcx.extern_mod_stmt_cnum(def_id).unwrap_or(LOCAL_CRATE); + let cnum = cx.tcx.extern_mod_stmt_cnum(krate.def_id).unwrap_or(LOCAL_CRATE); // this is the ID of the crate itself let crate_def_id = DefId { krate: cnum, index: CRATE_DEF_INDEX }; + let attrs = cx.tcx.hir().attrs(krate.hir_id()); let please_inline = krate.vis.node.is_pub() - && krate.attrs.iter().any(|a| { + && attrs.iter().any(|a| { a.has_name(sym::doc) && match a.meta_item_list() { Some(l) => attr::list_contains_name(&l, sym::inline), @@ -2151,10 +2119,10 @@ fn clean_extern_crate( if let Some(items) = inline::try_inline( cx, - cx.tcx.parent_module(krate.hir_id).to_def_id(), + cx.tcx.parent_module(krate.hir_id()).to_def_id(), res, name, - Some(krate.attrs), + Some(attrs), &mut visited, ) { return items; @@ -2162,12 +2130,12 @@ fn clean_extern_crate( } // FIXME: using `from_def_id_and_kind` breaks `rustdoc/masked` for some reason vec![Item { - name: None, - attrs: box krate.attrs.clean(cx), + name: Some(name), + attrs: box attrs.clean(cx), source: krate.span.clean(cx), def_id: crate_def_id, visibility: krate.vis.clean(cx), - kind: box ExternCrateItem(name, orig_name), + kind: box ExternCrateItem { src: orig_name }, }] } @@ -2176,7 +2144,7 @@ fn clean_use_statement( name: Symbol, path: &hir::Path<'_>, kind: hir::UseKind, - cx: &DocContext<'_>, + cx: &mut DocContext<'_>, ) -> Vec { // We need this comparison because some imports (for std types for example) // are "inserted" as well but directly by the compiler and they should not be @@ -2185,18 +2153,21 @@ fn clean_use_statement( return Vec::new(); } - let (doc_meta_item, please_inline) = import.attrs.lists(sym::doc).get_word_attr(sym::inline); + let attrs = cx.tcx.hir().attrs(import.hir_id()); + let inline_attr = attrs.lists(sym::doc).get_word_attr(sym::inline); let pub_underscore = import.vis.node.is_pub() && name == kw::Underscore; - if pub_underscore && please_inline { - rustc_errors::struct_span_err!( - cx.tcx.sess, - doc_meta_item.unwrap().span(), - E0780, - "anonymous imports cannot be inlined" - ) - .span_label(import.span, "anonymous import") - .emit(); + if pub_underscore { + if let Some(ref inline) = inline_attr { + rustc_errors::struct_span_err!( + cx.tcx.sess, + inline.span(), + E0780, + "anonymous imports cannot be inlined" + ) + .span_label(import.span, "anonymous import") + .emit(); + } } // We consider inlining the documentation of `pub use` statements, but we @@ -2205,7 +2176,7 @@ fn clean_use_statement( // Don't inline doc(hidden) imports so they can be stripped at a later stage. let mut denied = !import.vis.node.is_pub() || pub_underscore - || import.attrs.iter().any(|a| { + || attrs.iter().any(|a| { a.has_name(sym::doc) && match a.meta_item_list() { Some(l) => { @@ -2218,7 +2189,6 @@ fn clean_use_statement( // Also check whether imports were asked to be inlined, in case we're trying to re-export a // crate in Rust 2018+ - let def_id = cx.tcx.hir().local_def_id(import.hir_id).to_def_id(); let path = path.clean(cx); let inner = if kind == hir::UseKind::Glob { if !denied { @@ -2229,7 +2199,7 @@ fn clean_use_statement( } Import::new_glob(resolve_use_source(cx, path), true) } else { - if !please_inline { + if inline_attr.is_none() { if let Res::Def(DefKind::Mod, did) = path.res { if !did.is_local() && did.index == CRATE_DEF_INDEX { // if we're `pub use`ing an extern crate root, don't inline it unless we @@ -2243,14 +2213,14 @@ fn clean_use_statement( if let Some(mut items) = inline::try_inline( cx, - cx.tcx.parent_module(import.hir_id).to_def_id(), + cx.tcx.parent_module(import.hir_id()).to_def_id(), path.res, name, - Some(import.attrs), + Some(attrs), &mut visited, ) { items.push(Item::from_def_id_and_parts( - def_id, + import.def_id.to_def_id(), None, ImportItem(Import::new_simple(name, resolve_use_source(cx, path), false)), cx, @@ -2261,20 +2231,19 @@ fn clean_use_statement( Import::new_simple(name, resolve_use_source(cx, path), true) }; - vec![Item::from_def_id_and_parts(def_id, None, ImportItem(inner), cx)] + vec![Item::from_def_id_and_parts(import.def_id.to_def_id(), None, ImportItem(inner), cx)] } impl Clean for (&hir::ForeignItem<'_>, Option) { - fn clean(&self, cx: &DocContext<'_>) -> Item { + fn clean(&self, cx: &mut DocContext<'_>) -> Item { let (item, renamed) = self; - cx.with_param_env(cx.tcx.hir().local_def_id(item.hir_id).to_def_id(), || { + cx.with_param_env(item.def_id.to_def_id(), |cx| { let kind = match item.kind { hir::ForeignItemKind::Fn(ref decl, ref names, ref generics) => { - let abi = cx.tcx.hir().get_foreign_abi(item.hir_id); - let (generics, decl) = enter_impl_trait(cx, || { + let abi = cx.tcx.hir().get_foreign_abi(item.hir_id()); + let (generics, decl) = enter_impl_trait(cx, |cx| { (generics.clean(cx), (&**decl, &names[..]).clean(cx)) }); - let (all_types, ret_types) = get_all_types(&generics, &decl, cx); ForeignFunctionItem(Function { decl, generics, @@ -2284,20 +2253,16 @@ impl Clean for (&hir::ForeignItem<'_>, Option) { constness: hir::Constness::NotConst, asyncness: hir::IsAsync::NotAsync, }, - all_types, - ret_types, }) } - hir::ForeignItemKind::Static(ref ty, mutability) => ForeignStaticItem(Static { - type_: ty.clean(cx), - mutability, - expr: String::new(), - }), + hir::ForeignItemKind::Static(ref ty, mutability) => { + ForeignStaticItem(Static { type_: ty.clean(cx), mutability, expr: None }) + } hir::ForeignItemKind::Type => ForeignTypeItem, }; Item::from_hir_id_and_parts( - item.hir_id, + item.hir_id(), Some(renamed.unwrap_or(item.ident.name)), kind, cx, @@ -2307,7 +2272,7 @@ impl Clean for (&hir::ForeignItem<'_>, Option) { } impl Clean for (&hir::MacroDef<'_>, Option) { - fn clean(&self, cx: &DocContext<'_>) -> Item { + fn clean(&self, cx: &mut DocContext<'_>) -> Item { let (item, renamed) = self; let name = renamed.unwrap_or(item.ident.name); let tts = item.ast.body.inner_tokens().trees().collect::>(); @@ -2324,7 +2289,7 @@ impl Clean for (&hir::MacroDef<'_>, Option) { ) } else { let vis = item.vis.clean(cx); - let def_id = cx.tcx.hir().local_def_id(item.hir_id).to_def_id(); + let def_id = item.def_id.to_def_id(); if matchers.len() <= 1 { format!( @@ -2347,7 +2312,7 @@ impl Clean for (&hir::MacroDef<'_>, Option) { }; Item::from_hir_id_and_parts( - item.hir_id, + item.hir_id(), Some(name), MacroItem(Macro { source, imported_from: None }), cx, @@ -2356,13 +2321,13 @@ impl Clean for (&hir::MacroDef<'_>, Option) { } impl Clean for hir::TypeBinding<'_> { - fn clean(&self, cx: &DocContext<'_>) -> TypeBinding { + fn clean(&self, cx: &mut DocContext<'_>) -> TypeBinding { TypeBinding { name: self.ident.name, kind: self.kind.clean(cx) } } } impl Clean for hir::TypeBindingKind<'_> { - fn clean(&self, cx: &DocContext<'_>) -> TypeBindingKind { + fn clean(&self, cx: &mut DocContext<'_>) -> TypeBindingKind { match *self { hir::TypeBindingKind::Equality { ref ty } => { TypeBindingKind::Equality { ty: ty.clean(cx) } diff --git a/src/librustdoc/clean/types.rs b/src/librustdoc/clean/types.rs index e509ec3f02..840a42c2b8 100644 --- a/src/librustdoc/clean/types.rs +++ b/src/librustdoc/clean/types.rs @@ -19,7 +19,7 @@ use rustc_hir as hir; use rustc_hir::def::{CtorKind, Res}; use rustc_hir::def_id::{CrateNum, DefId, DefIndex}; use rustc_hir::lang_items::LangItem; -use rustc_hir::Mutability; +use rustc_hir::{BodyId, Mutability}; use rustc_index::vec::IndexVec; use rustc_middle::ty::{self, TyCtxt}; use rustc_session::Session; @@ -50,18 +50,23 @@ thread_local!(crate static MAX_DEF_IDX: RefCell> = #[derive(Clone, Debug)] crate struct Crate { crate name: Symbol, - crate version: Option, crate src: FileName, crate module: Option, crate externs: Vec<(CrateNum, ExternalCrate)>, crate primitives: Vec<(DefId, PrimitiveType)>, // These are later on moved into `CACHEKEY`, leaving the map empty. // Only here so that they can be filtered through the rustdoc passes. - crate external_traits: Rc>>, - crate masked_crates: FxHashSet, + crate external_traits: Rc>>, crate collapsed: bool, } +/// This struct is used to wrap additional information added by rustdoc on a `trait` item. +#[derive(Clone, Debug)] +crate struct TraitWithExtraInfo { + crate trait_: Trait, + crate is_spotlight: bool, +} + #[derive(Clone, Debug)] crate struct ExternalCrate { crate name: Symbol, @@ -87,7 +92,7 @@ crate struct Item { } // `Item` is used a lot. Make sure it doesn't unintentionally get bigger. -#[cfg(target_arch = "x86_64")] +#[cfg(all(target_arch = "x86_64", target_pointer_width = "64"))] rustc_data_structures::static_assert_size!(Item, 48); impl fmt::Debug for Item { @@ -130,7 +135,7 @@ impl Item { hir_id: hir::HirId, name: Option, kind: ItemKind, - cx: &DocContext<'_>, + cx: &mut DocContext<'_>, ) -> Item { Item::from_def_id_and_parts(cx.tcx.hir().local_def_id(hir_id).to_def_id(), name, kind, cx) } @@ -139,7 +144,23 @@ impl Item { def_id: DefId, name: Option, kind: ItemKind, - cx: &DocContext<'_>, + cx: &mut DocContext<'_>, + ) -> Item { + Self::from_def_id_and_attrs_and_parts( + def_id, + name, + kind, + box cx.tcx.get_attrs(def_id).clean(cx), + cx, + ) + } + + pub fn from_def_id_and_attrs_and_parts( + def_id: DefId, + name: Option, + kind: ItemKind, + attrs: Box, + cx: &mut DocContext<'_>, ) -> Item { debug!("name={:?}, def_id={:?}", name, def_id); @@ -157,7 +178,7 @@ impl Item { kind: box kind, name, source: source.clean(cx), - attrs: box cx.tcx.get_attrs(def_id).clean(cx), + attrs, visibility: cx.tcx.visibility(def_id).clean(cx), } } @@ -169,7 +190,7 @@ impl Item { } crate fn links(&self, cache: &Cache) -> Vec { - self.attrs.links(&self.def_id.krate, cache) + self.attrs.links(self.def_id.krate, cache) } crate fn is_crate(&self) -> bool { @@ -301,7 +322,10 @@ impl Item { #[derive(Clone, Debug)] crate enum ItemKind { - ExternCrateItem(Symbol, Option), + ExternCrateItem { + /// The crate's name, *not* the name it's imported as. + src: Option, + }, ImportItem(Import), StructItem(Struct), UnionItem(Union), @@ -354,7 +378,7 @@ impl ItemKind { TraitItem(t) => t.items.iter(), ImplItem(i) => i.items.iter(), ModuleItem(m) => m.items.iter(), - ExternCrateItem(_, _) + ExternCrateItem { .. } | ImportItem(_) | FunctionItem(_) | TypedefItem(_, _) @@ -438,7 +462,7 @@ impl AttributesExt for [ast::Attribute] { crate trait NestedAttributesExt { /// Returns `true` if the attribute list contains a specific `Word` fn has_word(self, word: Symbol) -> bool; - fn get_word_attr(self, word: Symbol) -> (Option, bool); + fn get_word_attr(self, word: Symbol) -> Option; } impl + IntoIterator> @@ -448,11 +472,8 @@ impl + IntoIterator (Option, bool) { - match self.find(|attr| attr.is_word() && attr.has_name(word)) { - Some(a) => (Some(a), true), - None => (None, false), - } + fn get_word_attr(mut self, word: Symbol) -> Option { + self.find(|attr| attr.is_word() && attr.has_name(word)) } } @@ -825,7 +846,7 @@ impl Attributes { /// Gets links as a vector /// /// Cache must be populated before call - crate fn links(&self, krate: &CrateNum, cache: &Cache) -> Vec { + crate fn links(&self, krate: CrateNum, cache: &Cache) -> Vec { use crate::html::format::href; use crate::html::render::CURRENT_DEPTH; @@ -850,7 +871,7 @@ impl Attributes { } None => { if let Some(ref fragment) = *fragment { - let url = match cache.extern_locations.get(krate) { + let url = match cache.extern_locations.get(&krate) { Some(&(_, _, ExternalLocation::Local)) => { let depth = CURRENT_DEPTH.with(|l| l.get()); "../".repeat(depth) @@ -889,12 +910,23 @@ impl Attributes { } crate fn get_doc_aliases(&self) -> FxHashSet { - self.other_attrs - .lists(sym::doc) - .filter(|a| a.has_name(sym::alias)) - .filter_map(|a| a.value_str().map(|s| s.to_string())) - .filter(|v| !v.is_empty()) - .collect::>() + let mut aliases = FxHashSet::default(); + + for attr in self.other_attrs.lists(sym::doc).filter(|a| a.has_name(sym::alias)) { + if let Some(values) = attr.meta_item_list() { + for l in values { + match l.literal().unwrap().kind { + ast::LitKind::Str(s, _) => { + aliases.insert(s.as_str().to_string()); + } + _ => unreachable!(), + } + } + } else { + aliases.insert(attr.value_str().map(|s| s.to_string()).unwrap()); + } + } + aliases } } @@ -939,7 +971,7 @@ crate enum GenericBound { } impl GenericBound { - crate fn maybe_sized(cx: &DocContext<'_>) -> GenericBound { + crate fn maybe_sized(cx: &mut DocContext<'_>) -> GenericBound { let did = cx.tcx.require_lang_item(LangItem::Sized, None); let empty = cx.tcx.intern_substs(&[]); let path = external_path(cx, cx.tcx.item_name(did), Some(did), false, vec![], empty); @@ -1087,8 +1119,6 @@ crate struct Function { crate decl: FnDecl, crate generics: Generics, crate header: hir::FnHeader, - crate all_types: Vec<(Type, TypeKind)>, - crate ret_types: Vec<(Type, TypeKind)>, } #[derive(Clone, PartialEq, Eq, Debug, Hash)] @@ -1190,7 +1220,6 @@ crate struct Trait { crate items: Vec, crate generics: Generics, crate bounds: Vec, - crate is_spotlight: bool, crate is_auto: bool, } @@ -1304,6 +1333,43 @@ crate enum TypeKind { Primitive, } +impl From for TypeKind { + fn from(other: hir::def::DefKind) -> Self { + match other { + hir::def::DefKind::Enum => Self::Enum, + hir::def::DefKind::Fn => Self::Function, + hir::def::DefKind::Mod => Self::Module, + hir::def::DefKind::Const => Self::Const, + hir::def::DefKind::Static => Self::Static, + hir::def::DefKind::Struct => Self::Struct, + hir::def::DefKind::Union => Self::Union, + hir::def::DefKind::Trait => Self::Trait, + hir::def::DefKind::TyAlias => Self::Typedef, + hir::def::DefKind::TraitAlias => Self::TraitAlias, + hir::def::DefKind::Macro(_) => Self::Macro, + hir::def::DefKind::ForeignTy + | hir::def::DefKind::Variant + | hir::def::DefKind::AssocTy + | hir::def::DefKind::TyParam + | hir::def::DefKind::ConstParam + | hir::def::DefKind::Ctor(..) + | hir::def::DefKind::AssocFn + | hir::def::DefKind::AssocConst + | hir::def::DefKind::ExternCrate + | hir::def::DefKind::Use + | hir::def::DefKind::ForeignMod + | hir::def::DefKind::AnonConst + | hir::def::DefKind::OpaqueTy + | hir::def::DefKind::Field + | hir::def::DefKind::LifetimeParam + | hir::def::DefKind::GlobalAsm + | hir::def::DefKind::Impl + | hir::def::DefKind::Closure + | hir::def::DefKind::Generator => Self::Foreign, + } + } +} + crate trait GetDefId { /// Use this method to get the [`DefId`] of a [`clean`] AST node. /// This will return [`None`] when called on a primitive [`clean::Type`]. @@ -1367,14 +1433,14 @@ impl Type { } } - crate fn generics(&self) -> Option> { + crate fn generics(&self) -> Option> { match *self { ResolvedPath { ref path, .. } => path.segments.last().and_then(|seg| { if let GenericArgs::AngleBracketed { ref args, .. } = seg.args { Some( args.iter() .filter_map(|arg| match arg { - GenericArg::Type(ty) => Some(ty.clone()), + GenericArg::Type(ty) => Some(ty), _ => None, }) .collect(), @@ -1559,24 +1625,6 @@ impl PrimitiveType { CELL.get_or_init(move || { use self::PrimitiveType::*; - /// A macro to create a FxHashMap. - /// - /// Example: - /// - /// ``` - /// let letters = map!{"a" => "b", "c" => "d"}; - /// ``` - /// - /// Trailing commas are allowed. - /// Commas between elements are required (even if the expression is a block). - macro_rules! map { - ($( $key: expr => $val: expr ),* $(,)*) => {{ - let mut map = ::rustc_data_structures::fx::FxHashMap::default(); - $( map.insert($key, $val); )* - map - }} - } - let single = |a: Option| a.into_iter().collect(); let both = |a: Option, b: Option| -> ArrayVec<_> { a.into_iter().chain(b).collect() @@ -1820,6 +1868,10 @@ impl Span { self.0 } + crate fn is_dummy(&self) -> bool { + self.0.is_dummy() + } + crate fn filename(&self, sess: &Session) -> FileName { sess.source_map().span_to_filename(self.0) } @@ -1920,10 +1972,7 @@ crate struct BareFunctionDecl { crate struct Static { crate type_: Type, crate mutability: Mutability, - /// It's useful to have the value of a static documented, but I have no - /// desire to represent expressions (that'd basically be all of the AST, - /// which is huge!). So, have a string. - crate expr: String, + crate expr: Option, } #[derive(Clone, PartialEq, Eq, Hash, Debug)] diff --git a/src/librustdoc/clean/utils.rs b/src/librustdoc/clean/utils.rs index 7784a5d234..8b5f5b66c4 100644 --- a/src/librustdoc/clean/utils.rs +++ b/src/librustdoc/clean/utils.rs @@ -1,46 +1,42 @@ use crate::clean::auto_trait::AutoTraitFinder; use crate::clean::blanket_impl::BlanketImplFinder; use crate::clean::{ - inline, Clean, Crate, ExternalCrate, FnDecl, FnRetTy, Generic, GenericArg, GenericArgs, - GenericBound, Generics, GetDefId, ImportSource, Item, ItemKind, Lifetime, MacroKind, Path, - PathSegment, Primitive, PrimitiveType, ResolvedPath, Type, TypeBinding, TypeKind, - WherePredicate, + inline, Clean, Crate, ExternalCrate, Generic, GenericArg, GenericArgs, ImportSource, Item, + ItemKind, Lifetime, MacroKind, Path, PathSegment, Primitive, PrimitiveType, ResolvedPath, Type, + TypeBinding, TypeKind, }; use crate::core::DocContext; -use rustc_data_structures::fx::FxHashSet; use rustc_hir as hir; use rustc_hir::def::{DefKind, Res}; use rustc_hir::def_id::{DefId, LOCAL_CRATE}; use rustc_middle::mir::interpret::ConstValue; use rustc_middle::ty::subst::{GenericArgKind, SubstsRef}; -use rustc_middle::ty::{self, DefIdTree, Ty, TyCtxt}; +use rustc_middle::ty::{self, DefIdTree, TyCtxt}; use rustc_span::symbol::{kw, sym, Symbol}; use std::mem; -crate fn krate(mut cx: &mut DocContext<'_>) -> Crate { +crate fn krate(cx: &mut DocContext<'_>) -> Crate { use crate::visit_lib::LibEmbargoVisitor; let krate = cx.tcx.hir().krate(); - let module = crate::visit_ast::RustdocVisitor::new(&mut cx).visit(krate); + let module = crate::visit_ast::RustdocVisitor::new(cx).visit(krate); - let mut r = cx.renderinfo.get_mut(); - r.deref_trait_did = cx.tcx.lang_items().deref_trait(); - r.deref_mut_trait_did = cx.tcx.lang_items().deref_mut_trait(); - r.owned_box_did = cx.tcx.lang_items().owned_box(); + cx.cache.deref_trait_did = cx.tcx.lang_items().deref_trait(); + cx.cache.deref_mut_trait_did = cx.tcx.lang_items().deref_mut_trait(); + cx.cache.owned_box_did = cx.tcx.lang_items().owned_box(); let mut externs = Vec::new(); for &cnum in cx.tcx.crates().iter() { externs.push((cnum, cnum.clean(cx))); // Analyze doc-reachability for extern items - LibEmbargoVisitor::new(&mut cx).visit_lib(cnum); + LibEmbargoVisitor::new(cx).visit_lib(cnum); } externs.sort_by(|&(a, _), &(b, _)| a.cmp(&b)); // Clean the crate, translating the entire librustc_ast AST to one that is // understood by rustdoc. let mut module = module.clean(cx); - let mut masked_crates = FxHashSet::default(); match *module.kind { ItemKind::ModuleItem(ref module) => { @@ -51,7 +47,7 @@ crate fn krate(mut cx: &mut DocContext<'_>) -> Crate { && (it.attrs.has_doc_flag(sym::masked) || cx.tcx.is_compiler_builtins(it.def_id.krate)) { - masked_crates.insert(it.def_id.krate); + cx.cache.masked_crates.insert(it.def_id.krate); } } } @@ -79,19 +75,17 @@ crate fn krate(mut cx: &mut DocContext<'_>) -> Crate { Crate { name, - version: None, src, module: Some(module), externs, primitives, external_traits: cx.external_traits.clone(), - masked_crates, collapsed: false, } } fn external_generic_args( - cx: &DocContext<'_>, + cx: &mut DocContext<'_>, trait_did: Option, has_self: bool, bindings: Vec, @@ -143,7 +137,7 @@ fn external_generic_args( // trait_did should be set to a trait's DefId if called on a TraitRef, in order to sugar // from Fn<(A, B,), C> to Fn(A, B) -> C pub(super) fn external_path( - cx: &DocContext<'_>, + cx: &mut DocContext<'_>, name: Symbol, trait_did: Option, has_self: bool, @@ -160,125 +154,6 @@ pub(super) fn external_path( } } -/// The point of this function is to replace bounds with types. -/// -/// i.e. `[T, U]` when you have the following bounds: `T: Display, U: Option` will return -/// `[Display, Option]` (we just returns the list of the types, we don't care about the -/// wrapped types in here). -crate fn get_real_types( - generics: &Generics, - arg: &Type, - cx: &DocContext<'_>, - recurse: i32, -) -> FxHashSet<(Type, TypeKind)> { - fn insert(res: &mut FxHashSet<(Type, TypeKind)>, cx: &DocContext<'_>, ty: Type) { - if let Some(kind) = ty.def_id().map(|did| cx.tcx.def_kind(did).clean(cx)) { - res.insert((ty, kind)); - } else if ty.is_primitive() { - // This is a primitive, let's store it as such. - res.insert((ty, TypeKind::Primitive)); - } - } - let mut res = FxHashSet::default(); - if recurse >= 10 { - // FIXME: remove this whole recurse thing when the recursion bug is fixed - return res; - } - - if arg.is_full_generic() { - let arg_s = Symbol::intern(&arg.print(&cx.cache).to_string()); - if let Some(where_pred) = generics.where_predicates.iter().find(|g| match g { - WherePredicate::BoundPredicate { ty, .. } => ty.def_id() == arg.def_id(), - _ => false, - }) { - let bounds = where_pred.get_bounds().unwrap_or_else(|| &[]); - for bound in bounds.iter() { - if let GenericBound::TraitBound(poly_trait, _) = bound { - for x in poly_trait.generic_params.iter() { - if !x.is_type() { - continue; - } - if let Some(ty) = x.get_type() { - let adds = get_real_types(generics, &ty, cx, recurse + 1); - if !adds.is_empty() { - res.extend(adds); - } else if !ty.is_full_generic() { - insert(&mut res, cx, ty); - } - } - } - } - } - } - if let Some(bound) = generics.params.iter().find(|g| g.is_type() && g.name == arg_s) { - for bound in bound.get_bounds().unwrap_or_else(|| &[]) { - if let Some(ty) = bound.get_trait_type() { - let adds = get_real_types(generics, &ty, cx, recurse + 1); - if !adds.is_empty() { - res.extend(adds); - } else if !ty.is_full_generic() { - insert(&mut res, cx, ty); - } - } - } - } - } else { - insert(&mut res, cx, arg.clone()); - if let Some(gens) = arg.generics() { - for gen in gens.iter() { - if gen.is_full_generic() { - let adds = get_real_types(generics, gen, cx, recurse + 1); - if !adds.is_empty() { - res.extend(adds); - } - } else { - insert(&mut res, cx, gen.clone()); - } - } - } - } - res -} - -/// Return the full list of types when bounds have been resolved. -/// -/// i.e. `fn foo>(x: u32, y: B)` will return -/// `[u32, Display, Option]`. -crate fn get_all_types( - generics: &Generics, - decl: &FnDecl, - cx: &DocContext<'_>, -) -> (Vec<(Type, TypeKind)>, Vec<(Type, TypeKind)>) { - let mut all_types = FxHashSet::default(); - for arg in decl.inputs.values.iter() { - if arg.type_.is_self_type() { - continue; - } - let args = get_real_types(generics, &arg.type_, cx, 0); - if !args.is_empty() { - all_types.extend(args); - } else { - if let Some(kind) = arg.type_.def_id().map(|did| cx.tcx.def_kind(did).clean(cx)) { - all_types.insert((arg.type_.clone(), kind)); - } - } - } - - let ret_types = match decl.output { - FnRetTy::Return(ref return_type) => { - let mut ret = get_real_types(generics, &return_type, cx, 0); - if ret.is_empty() { - if let Some(kind) = return_type.def_id().map(|did| cx.tcx.def_kind(did).clean(cx)) { - ret.insert((return_type.clone(), kind)); - } - } - ret.into_iter().collect() - } - _ => Vec::new(), - }; - (all_types.into_iter().collect(), ret_types) -} - crate fn strip_type(ty: Type) -> Type { match ty { Type::ResolvedPath { path, param_names, did, is_generic } => { @@ -334,7 +209,7 @@ crate fn qpath_to_string(p: &hir::QPath<'_>) -> String { s } -crate fn build_deref_target_impls(cx: &DocContext<'_>, items: &[Item], ret: &mut Vec) { +crate fn build_deref_target_impls(cx: &mut DocContext<'_>, items: &[Item], ret: &mut Vec) { let tcx = cx.tcx; for item in items { @@ -361,7 +236,7 @@ crate trait ToSource { impl ToSource for rustc_span::Span { fn to_src(&self, cx: &DocContext<'_>) -> String { - debug!("converting span {:?} to snippet", self.clean(cx)); + debug!("converting span {:?} to snippet", self); let sn = match cx.sess().source_map().span_to_snippet(*self) { Ok(x) => x, Err(_) => String::new(), @@ -424,7 +299,7 @@ crate fn print_const(cx: &DocContext<'_>, n: &'tcx ty::Const<'_>) -> String { ty::ConstKind::Unevaluated(def, _, promoted) => { let mut s = if let Some(def) = def.as_local() { let hir_id = cx.tcx.hir().local_def_id_to_hir_id(def.did); - print_const_expr(cx, cx.tcx.hir().body_owned_by(hir_id)) + print_const_expr(cx.tcx, cx.tcx.hir().body_owned_by(hir_id)) } else { inline::print_inlined_const(cx, def.did) }; @@ -503,7 +378,7 @@ crate fn is_literal_expr(cx: &DocContext<'_>, hir_id: hir::HirId) -> bool { return true; } - if let hir::ExprKind::Unary(hir::UnOp::UnNeg, expr) = &expr.kind { + if let hir::ExprKind::Unary(hir::UnOp::Neg, expr) = &expr.kind { if let hir::ExprKind::Lit(_) = &expr.kind { return true; } @@ -513,20 +388,21 @@ crate fn is_literal_expr(cx: &DocContext<'_>, hir_id: hir::HirId) -> bool { false } -crate fn print_const_expr(cx: &DocContext<'_>, body: hir::BodyId) -> String { - let value = &cx.tcx.hir().body(body).value; +crate fn print_const_expr(tcx: TyCtxt<'_>, body: hir::BodyId) -> String { + let hir = tcx.hir(); + let value = &hir.body(body).value; let snippet = if !value.span.from_expansion() { - cx.sess().source_map().span_to_snippet(value.span).ok() + tcx.sess.source_map().span_to_snippet(value.span).ok() } else { None }; - snippet.unwrap_or_else(|| rustc_hir_pretty::id_to_string(&cx.tcx.hir(), body.hir_id)) + snippet.unwrap_or_else(|| rustc_hir_pretty::id_to_string(&hir, body.hir_id)) } /// Given a type Path, resolve it to a Type using the TyCtxt -crate fn resolve_type(cx: &DocContext<'_>, path: Path, id: hir::HirId) -> Type { +crate fn resolve_type(cx: &mut DocContext<'_>, path: Path, id: hir::HirId) -> Type { debug!("resolve_type({:?},{:?})", path, id); let is_generic = match path.res { @@ -540,29 +416,28 @@ crate fn resolve_type(cx: &DocContext<'_>, path: Path, id: hir::HirId) -> Type { Res::SelfTy(..) | Res::Def(DefKind::TyParam | DefKind::AssocTy, _) => true, _ => false, }; - let did = register_res(&*cx, path.res); + let did = register_res(cx, path.res); ResolvedPath { path, param_names: None, did, is_generic } } crate fn get_auto_trait_and_blanket_impls( - cx: &DocContext<'tcx>, - ty: Ty<'tcx>, - param_env_def_id: DefId, + cx: &mut DocContext<'tcx>, + item_def_id: DefId, ) -> impl Iterator { let auto_impls = cx .sess() .prof .generic_activity("get_auto_trait_impls") - .run(|| AutoTraitFinder::new(cx).get_auto_trait_impls(ty, param_env_def_id)); + .run(|| AutoTraitFinder::new(cx).get_auto_trait_impls(item_def_id)); let blanket_impls = cx .sess() .prof .generic_activity("get_blanket_impls") - .run(|| BlanketImplFinder::new(cx).get_blanket_impls(ty, param_env_def_id)); + .run(|| BlanketImplFinder { cx }.get_blanket_impls(item_def_id)); auto_impls.into_iter().chain(blanket_impls) } -crate fn register_res(cx: &DocContext<'_>, res: Res) -> DefId { +crate fn register_res(cx: &mut DocContext<'_>, res: Res) -> DefId { debug!("register_res({:?})", res); let (did, kind) = match res { @@ -602,21 +477,21 @@ crate fn register_res(cx: &DocContext<'_>, res: Res) -> DefId { did } -crate fn resolve_use_source(cx: &DocContext<'_>, path: Path) -> ImportSource { +crate fn resolve_use_source(cx: &mut DocContext<'_>, path: Path) -> ImportSource { ImportSource { did: if path.res.opt_def_id().is_none() { None } else { Some(register_res(cx, path.res)) }, path, } } -crate fn enter_impl_trait(cx: &DocContext<'_>, f: F) -> R +crate fn enter_impl_trait(cx: &mut DocContext<'_>, f: F) -> R where - F: FnOnce() -> R, + F: FnOnce(&mut DocContext<'_>) -> R, { - let old_bounds = mem::take(&mut *cx.impl_trait_bounds.borrow_mut()); - let r = f(); - assert!(cx.impl_trait_bounds.borrow().is_empty()); - *cx.impl_trait_bounds.borrow_mut() = old_bounds; + let old_bounds = mem::take(&mut cx.impl_trait_bounds); + let r = f(cx); + assert!(cx.impl_trait_bounds.is_empty()); + cx.impl_trait_bounds = old_bounds; r } @@ -640,3 +515,19 @@ crate fn find_nearest_parent_module(tcx: TyCtxt<'_>, def_id: DefId) -> Option, flag: Symbol) -> bool { + attrs.iter().any(|attr| { + attr.has_name(sym::doc) + && attr.meta_item_list().map_or(false, |l| rustc_attr::list_contains_name(&l, flag)) + }) +} diff --git a/src/librustdoc/config.rs b/src/librustdoc/config.rs index 1478437cef..ecb6378f31 100644 --- a/src/librustdoc/config.rs +++ b/src/librustdoc/config.rs @@ -4,9 +4,7 @@ use std::ffi::OsStr; use std::fmt; use std::path::PathBuf; -use rustc_data_structures::fx::{FxHashMap, FxHashSet}; -use rustc_hir::def_id::DefId; -use rustc_middle::middle::privacy::AccessLevels; +use rustc_data_structures::fx::FxHashMap; use rustc_session::config::{self, parse_crate_types_from_list, parse_externs, CrateType}; use rustc_session::config::{ build_codegen_options, build_debugging_options, get_cmd_lint_options, host_triple, @@ -265,23 +263,11 @@ crate struct RenderOptions { crate document_private: bool, /// Document items that have `doc(hidden)`. crate document_hidden: bool, + /// If `true`, generate a JSON file in the crate folder instead of HTML redirection files. + crate generate_redirect_map: bool, crate unstable_features: rustc_feature::UnstableFeatures, } -/// Temporary storage for data obtained during `RustdocVisitor::clean()`. -/// Later on moved into `cache`. -#[derive(Default, Clone)] -crate struct RenderInfo { - crate inlined: FxHashSet, - crate external_paths: crate::core::ExternalPaths, - crate exact_paths: FxHashMap>, - crate access_levels: AccessLevels, - crate deref_trait_did: Option, - crate deref_mut_trait_did: Option, - crate owned_box_did: Option, - crate output_format: OutputFormat, -} - impl Options { /// Parses the given command-line for options. If an error message or other early-return has /// been printed, returns `Err` with the exit code. @@ -329,6 +315,13 @@ impl Options { return Err(0); } + if matches.opt_strs("print").iter().any(|opt| opt == "unversioned-files") { + for file in crate::html::render::FILES_UNVERSIONED.keys() { + println!("{}", file); + } + return Err(0); + } + let color = config::parse_color(&matches); let (json_rendered, _artifacts) = config::parse_json(&matches); let error_format = config::parse_error_format(&matches, color, json_rendered); @@ -586,6 +579,7 @@ impl Options { let document_private = matches.opt_present("document-private-items"); let document_hidden = matches.opt_present("document-hidden-items"); let run_check = matches.opt_present("check"); + let generate_redirect_map = matches.opt_present("generate-redirect-map"); let (lint_opts, describe_lints, lint_cap) = get_cmd_lint_options(matches, error_format); @@ -643,6 +637,7 @@ impl Options { generate_search_filter, document_private, document_hidden, + generate_redirect_map, unstable_features: rustc_feature::UnstableFeatures::from_environment( crate_name.as_deref(), ), @@ -670,9 +665,8 @@ fn check_deprecated_options(matches: &getopts::Matches, diag: &rustc_errors::Han { continue; } - let mut err = - diag.struct_warn(&format!("the '{}' flag is considered deprecated", flag)); - err.warn( + let mut err = diag.struct_warn(&format!("the `{}` flag is deprecated", flag)); + err.note( "see issue #44136 \ for more information", ); diff --git a/src/librustdoc/core.rs b/src/librustdoc/core.rs index a20e9dec33..c5b5ab0f3d 100644 --- a/src/librustdoc/core.rs +++ b/src/librustdoc/core.rs @@ -22,54 +22,53 @@ use rustc_session::DiagnosticOutput; use rustc_session::Session; use rustc_span::source_map; use rustc_span::symbol::sym; -use rustc_span::DUMMY_SP; +use rustc_span::{Span, DUMMY_SP}; +use std::cell::RefCell; +use std::collections::hash_map::Entry; use std::mem; use std::rc::Rc; -use std::{ - cell::{Cell, RefCell}, - collections::hash_map::Entry, -}; use crate::clean; -use crate::clean::{AttributesExt, MAX_DEF_IDX}; -use crate::config::{Options as RustdocOptions, RenderOptions}; -use crate::config::{OutputFormat, RenderInfo}; +use crate::clean::inline::build_external_trait; +use crate::clean::{AttributesExt, TraitWithExtraInfo, MAX_DEF_IDX}; +use crate::config::{Options as RustdocOptions, OutputFormat, RenderOptions}; use crate::formats::cache::Cache; use crate::passes::{self, Condition::*, ConditionalPass}; crate use rustc_session::config::{DebuggingOptions, Input, Options}; -crate type ExternalPaths = FxHashMap, clean::TypeKind)>; - crate struct DocContext<'tcx> { crate tcx: TyCtxt<'tcx>, + /// Name resolver. Used for intra-doc links. + /// + /// The `Rc>` wrapping is needed because that is what's returned by + /// [`Queries::expansion()`]. + // FIXME: see if we can get rid of this RefCell somehow crate resolver: Rc>, /// Used for normalization. /// /// Most of this logic is copied from rustc_lint::late. - crate param_env: Cell>, - /// Later on moved into `cache` - crate renderinfo: RefCell, + crate param_env: ParamEnv<'tcx>, /// Later on moved through `clean::Crate` into `cache` - crate external_traits: Rc>>, + crate external_traits: Rc>>, /// Used while populating `external_traits` to ensure we don't process the same trait twice at /// the same time. - crate active_extern_traits: RefCell>, + crate active_extern_traits: FxHashSet, // The current set of type and lifetime substitutions, // for expanding type aliases at the HIR level: /// Table `DefId` of type parameter -> substituted type - crate ty_substs: RefCell>, + crate ty_substs: FxHashMap, /// Table `DefId` of lifetime parameter -> substituted lifetime - crate lt_substs: RefCell>, + crate lt_substs: FxHashMap, /// Table `DefId` of const parameter -> substituted const - crate ct_substs: RefCell>, + crate ct_substs: FxHashMap, /// Table synthetic type parameter for `impl Trait` in argument position -> bounds - crate impl_trait_bounds: RefCell>>, - crate fake_def_ids: RefCell>, + crate impl_trait_bounds: FxHashMap>, + crate fake_def_ids: FxHashMap, /// Auto-trait or blanket impls processed so far, as `(self_ty, trait_def_id)`. // FIXME(eddyb) make this a `ty::TraitRef<'tcx>` set. - crate generated_synthetics: RefCell, DefId)>>, + crate generated_synthetics: FxHashSet<(Ty<'tcx>, DefId)>, crate auto_traits: Vec, /// The options given to rustdoc that could be relevant to a pass. crate render_options: RenderOptions, @@ -77,20 +76,24 @@ crate struct DocContext<'tcx> { /// /// See `collect_intra_doc_links::traits_implemented_by` for more details. /// `map>` - crate module_trait_cache: RefCell>>, - /// Fake empty cache used when cache is required as parameter. + crate module_trait_cache: FxHashMap>, + /// This same cache is used throughout rustdoc, including in [`crate::html::render`]. crate cache: Cache, + /// Used by [`clean::inline`] to tell if an item has already been inlined. + crate inlined: FxHashSet, + /// Used by `calculate_doc_coverage`. + crate output_format: OutputFormat, } impl<'tcx> DocContext<'tcx> { - crate fn sess(&self) -> &Session { + crate fn sess(&self) -> &'tcx Session { &self.tcx.sess } - crate fn with_param_env T>(&self, def_id: DefId, f: F) -> T { - let old_param_env = self.param_env.replace(self.tcx.param_env(def_id)); - let ret = f(); - self.param_env.set(old_param_env); + crate fn with_param_env T>(&mut self, def_id: DefId, f: F) -> T { + let old_param_env = mem::replace(&mut self.param_env, self.tcx.param_env(def_id)); + let ret = f(self); + self.param_env = old_param_env; ret } @@ -104,24 +107,24 @@ impl<'tcx> DocContext<'tcx> { /// Call the closure with the given parameters set as /// the substitutions for a type alias' RHS. crate fn enter_alias( - &self, + &mut self, ty_substs: FxHashMap, lt_substs: FxHashMap, ct_substs: FxHashMap, f: F, ) -> R where - F: FnOnce() -> R, + F: FnOnce(&mut Self) -> R, { let (old_tys, old_lts, old_cts) = ( - mem::replace(&mut *self.ty_substs.borrow_mut(), ty_substs), - mem::replace(&mut *self.lt_substs.borrow_mut(), lt_substs), - mem::replace(&mut *self.ct_substs.borrow_mut(), ct_substs), + mem::replace(&mut self.ty_substs, ty_substs), + mem::replace(&mut self.lt_substs, lt_substs), + mem::replace(&mut self.ct_substs, ct_substs), ); - let r = f(); - *self.ty_substs.borrow_mut() = old_tys; - *self.lt_substs.borrow_mut() = old_lts; - *self.ct_substs.borrow_mut() = old_cts; + let r = f(self); + self.ty_substs = old_tys; + self.lt_substs = old_lts; + self.ct_substs = old_cts; r } @@ -139,16 +142,14 @@ impl<'tcx> DocContext<'tcx> { /// [`RefCell`]: std::cell::RefCell /// [`Debug`]: std::fmt::Debug /// [`clean::Item`]: crate::clean::types::Item - crate fn next_def_id(&self, crate_num: CrateNum) -> DefId { - let mut fake_ids = self.fake_def_ids.borrow_mut(); - - let def_index = match fake_ids.entry(crate_num) { + crate fn next_def_id(&mut self, crate_num: CrateNum) -> DefId { + let def_index = match self.fake_def_ids.entry(crate_num) { Entry::Vacant(e) => { let num_def_idx = { let num_def_idx = if crate_num == LOCAL_CRATE { self.tcx.hir().definitions().def_path_table().num_def_ids() } else { - self.enter_resolver(|r| r.cstore().num_def_ids(crate_num)) + self.resolver.borrow_mut().access(|r| r.cstore().num_def_ids(crate_num)) }; DefIndex::from_usize(num_def_idx) @@ -161,20 +162,20 @@ impl<'tcx> DocContext<'tcx> { } Entry::Occupied(e) => e.into_mut(), }; - *def_index = DefIndex::from(*def_index + 1); + *def_index = *def_index + 1; DefId { krate: crate_num, index: *def_index } } /// Like `hir().local_def_id_to_hir_id()`, but skips calling it on fake DefIds. /// (This avoids a slice-index-out-of-bounds panic.) - crate fn as_local_hir_id(&self, def_id: DefId) -> Option { + crate fn as_local_hir_id(tcx: TyCtxt<'_>, def_id: DefId) -> Option { if MAX_DEF_IDX.with(|m| { m.borrow().get(&def_id.krate).map(|&idx| idx <= def_id.index).unwrap_or(false) }) { None } else { - def_id.as_local().map(|def_id| self.tcx.hir().local_def_id_to_hir_id(def_id)) + def_id.as_local().map(|def_id| tcx.hir().local_def_id_to_hir_id(def_id)) } } } @@ -227,64 +228,6 @@ crate fn new_handler( ) } -/// This function is used to setup the lint initialization. By default, in rustdoc, everything -/// is "allowed". Depending if we run in test mode or not, we want some of them to be at their -/// default level. For example, the "INVALID_CODEBLOCK_ATTRIBUTES" lint is activated in both -/// modes. -/// -/// A little detail easy to forget is that there is a way to set the lint level for all lints -/// through the "WARNINGS" lint. To prevent this to happen, we set it back to its "normal" level -/// inside this function. -/// -/// It returns a tuple containing: -/// * Vector of tuples of lints' name and their associated "max" level -/// * HashMap of lint id with their associated "max" level -pub(crate) fn init_lints( - mut allowed_lints: Vec, - lint_opts: Vec<(String, lint::Level)>, - filter_call: F, -) -> (Vec<(String, lint::Level)>, FxHashMap) -where - F: Fn(&lint::Lint) -> Option<(String, lint::Level)>, -{ - let warnings_lint_name = lint::builtin::WARNINGS.name; - - allowed_lints.push(warnings_lint_name.to_owned()); - allowed_lints.extend(lint_opts.iter().map(|(lint, _)| lint).cloned()); - - let lints = || { - lint::builtin::HardwiredLints::get_lints() - .into_iter() - .chain(rustc_lint::SoftLints::get_lints().into_iter()) - }; - - let lint_opts = lints() - .filter_map(|lint| { - // Permit feature-gated lints to avoid feature errors when trying to - // allow all lints. - if lint.feature_gate.is_some() || allowed_lints.iter().any(|l| lint.name == l) { - None - } else { - filter_call(lint) - } - }) - .chain(lint_opts.into_iter()) - .collect::>(); - - let lint_caps = lints() - .filter_map(|lint| { - // We don't want to allow *all* lints so let's ignore - // those ones. - if allowed_lints.iter().any(|l| lint.name == l) { - None - } else { - Some((lint::LintId::of(lint), lint::Allow)) - } - }) - .collect(); - (lint_opts, lint_caps) -} - /// Parse, resolve, and typecheck the given crate. crate fn create_config( RustdocOptions { @@ -313,37 +256,22 @@ crate fn create_config( let cpath = Some(input.clone()); let input = Input::File(input); - let broken_intra_doc_links = lint::builtin::BROKEN_INTRA_DOC_LINKS.name; - let private_intra_doc_links = lint::builtin::PRIVATE_INTRA_DOC_LINKS.name; - let missing_docs = rustc_lint::builtin::MISSING_DOCS.name; - let missing_doc_example = rustc_lint::builtin::MISSING_DOC_CODE_EXAMPLES.name; - let private_doc_tests = rustc_lint::builtin::PRIVATE_DOC_TESTS.name; - let no_crate_level_docs = rustc_lint::builtin::MISSING_CRATE_LEVEL_DOCS.name; - let invalid_codeblock_attributes_name = rustc_lint::builtin::INVALID_CODEBLOCK_ATTRIBUTES.name; - let invalid_html_tags = rustc_lint::builtin::INVALID_HTML_TAGS.name; - let renamed_and_removed_lints = rustc_lint::builtin::RENAMED_AND_REMOVED_LINTS.name; - let non_autolinks = rustc_lint::builtin::NON_AUTOLINKS.name; - let unknown_lints = rustc_lint::builtin::UNKNOWN_LINTS.name; - - // In addition to those specific lints, we also need to allow those given through - // command line, otherwise they'll get ignored and we don't want that. - let lints_to_show = vec![ - broken_intra_doc_links.to_owned(), - private_intra_doc_links.to_owned(), - missing_docs.to_owned(), - missing_doc_example.to_owned(), - private_doc_tests.to_owned(), - no_crate_level_docs.to_owned(), - invalid_codeblock_attributes_name.to_owned(), - invalid_html_tags.to_owned(), - renamed_and_removed_lints.to_owned(), - unknown_lints.to_owned(), - non_autolinks.to_owned(), + // By default, rustdoc ignores all lints. + // Specifically unblock lints relevant to documentation or the lint machinery itself. + let mut lints_to_show = vec![ + // it's unclear whether this should be part of rustdoc directly (#77364) + rustc_lint::builtin::MISSING_DOCS.name.to_string(), + // these are definitely not part of rustdoc, but we want to warn on them anyway. + rustc_lint::builtin::RENAMED_AND_REMOVED_LINTS.name.to_string(), + rustc_lint::builtin::UNKNOWN_LINTS.name.to_string(), ]; + lints_to_show.extend(crate::lint::RUSTDOC_LINTS.iter().map(|lint| lint.name.to_string())); - let (lint_opts, lint_caps) = init_lints(lints_to_show, lint_opts, |lint| { + let (lint_opts, lint_caps) = crate::lint::init_lints(lints_to_show, lint_opts, |lint| { // FIXME: why is this necessary? - if lint.name == broken_intra_doc_links || lint.name == invalid_codeblock_attributes_name { + if lint.name == crate::lint::BROKEN_INTRA_DOC_LINKS.name + || lint.name == crate::lint::INVALID_CODEBLOCK_ATTRIBUTES.name + { None } else { Some((lint.name_lower(), lint::Allow)) @@ -383,7 +311,8 @@ crate fn create_config( diagnostic_output: DiagnosticOutput::Default, stderr: None, lint_caps, - register_lints: None, + parse_sess_created: None, + register_lints: Some(box crate::lint::register_lints), override_queries: Some(|_sess, providers, _external_providers| { // Most lints will require typechecking, so just don't run them. providers.lint_mod = |_, _| {}; @@ -461,10 +390,10 @@ crate fn run_global_ctxt( tcx: TyCtxt<'_>, resolver: Rc>, mut default_passes: passes::DefaultPassOption, - mut manual_passes: Vec, + manual_passes: Vec, render_options: RenderOptions, output_format: OutputFormat, -) -> (clean::Crate, RenderInfo, RenderOptions) { +) -> (clean::Crate, RenderOptions, Cache) { // Certain queries assume that some checks were run elsewhere // (see https://github.com/rust-lang/rust/pull/73566#issuecomment-656954425), // so type-check everything other than function bodies in this crate before running lints. @@ -479,7 +408,7 @@ crate fn run_global_ctxt( // NOTE: This is copy/pasted from typeck/lib.rs and should be kept in sync with those changes. tcx.sess.time("item_types_checking", || { for &module in tcx.hir().krate().modules.keys() { - tcx.ensure().check_mod_item_types(tcx.hir().local_def_id(module)); + tcx.ensure().check_mod_item_types(module); } }); tcx.sess.abort_if_errors(); @@ -488,10 +417,10 @@ crate fn run_global_ctxt( }); tcx.sess.time("check_mod_attrs", || { for &module in tcx.hir().krate().modules.keys() { - let local_def_id = tcx.hir().local_def_id(module); - tcx.ensure().check_mod_attrs(local_def_id); + tcx.ensure().check_mod_attrs(module); } }); + rustc_passes::stability::check_unused_or_stable_features(tcx); let access_levels = tcx.privacy_access_levels(LOCAL_CRATE); // Convert from a HirId set to a DefId set since we don't always have easy access @@ -504,17 +433,12 @@ crate fn run_global_ctxt( .collect(), }; - let mut renderinfo = RenderInfo::default(); - renderinfo.access_levels = access_levels; - renderinfo.output_format = output_format; - let mut ctxt = DocContext { tcx, resolver, - param_env: Cell::new(ParamEnv::empty()), + param_env: ParamEnv::empty(), external_traits: Default::default(), active_extern_traits: Default::default(), - renderinfo: RefCell::new(renderinfo), ty_substs: Default::default(), lt_substs: Default::default(), ct_substs: Default::default(), @@ -527,10 +451,25 @@ crate fn run_global_ctxt( .cloned() .filter(|trait_def_id| tcx.trait_is_auto(*trait_def_id)) .collect(), + module_trait_cache: FxHashMap::default(), + cache: Cache::new(access_levels, render_options.document_private), + inlined: FxHashSet::default(), + output_format, render_options, - module_trait_cache: RefCell::new(FxHashMap::default()), - cache: Cache::default(), }; + + // Small hack to force the Sized trait to be present. + // + // Note that in case of `#![no_core]`, the trait is not available. + if let Some(sized_trait_did) = ctxt.tcx.lang_items().sized_trait() { + let mut sized_trait = build_external_trait(&mut ctxt, sized_trait_did); + sized_trait.is_auto = true; + ctxt.external_traits.borrow_mut().insert( + sized_trait_did, + TraitWithExtraInfo { trait_: sized_trait, is_spotlight: false }, + ); + } + debug!("crate: {:?}", tcx.hir().krate()); let mut krate = tcx.sess.time("clean_crate", || clean::krate(&mut ctxt)); @@ -540,8 +479,8 @@ crate fn run_global_ctxt( let help = "The following guide may be of use:\n\ https://doc.rust-lang.org/nightly/rustdoc/how-to-write-documentation.html"; tcx.struct_lint_node( - rustc_lint::builtin::MISSING_CRATE_LEVEL_DOCS, - ctxt.as_local_hir_id(m.def_id).unwrap(), + crate::lint::MISSING_CRATE_LEVEL_DOCS, + DocContext::as_local_hir_id(tcx, m.def_id).unwrap(), |lint| { let mut diag = lint.build("no documentation found for this crate's top-level module"); @@ -552,21 +491,44 @@ crate fn run_global_ctxt( } } - fn report_deprecated_attr(name: &str, diag: &rustc_errors::Handler) { - let mut msg = diag - .struct_warn(&format!("the `#![doc({})]` attribute is considered deprecated", name)); - msg.warn( + fn report_deprecated_attr(name: &str, diag: &rustc_errors::Handler, sp: Span) { + let mut msg = + diag.struct_span_warn(sp, &format!("the `#![doc({})]` attribute is deprecated", name)); + msg.note( "see issue #44136 \ for more information", ); if name == "no_default_passes" { msg.help("you may want to use `#![doc(document_private_items)]`"); + } else if name.starts_with("plugins") { + msg.warn("`#![doc(plugins = \"...\")]` no longer functions; see CVE-2018-1000622 "); } msg.emit(); } + let parse_pass = |name: &str, sp: Option| { + if let Some(pass) = passes::find_pass(name) { + Some(ConditionalPass::always(pass)) + } else { + let msg = &format!("ignoring unknown pass `{}`", name); + let mut warning = if let Some(sp) = sp { + tcx.sess.struct_span_warn(sp, msg) + } else { + tcx.sess.struct_warn(msg) + }; + if name == "collapse-docs" { + warning.note("the `collapse-docs` pass was removed in #80261 "); + } + warning.emit(); + None + } + }; + + let mut manual_passes: Vec<_> = + manual_passes.into_iter().flat_map(|name| parse_pass(&name, None)).collect(); + // Process all of the crate attributes, extracting plugin metadata along // with the passes which we are supposed to run. for attr in krate.module.as_ref().unwrap().attrs.lists(sym::doc) { @@ -575,29 +537,25 @@ crate fn run_global_ctxt( let name = attr.name_or_empty(); if attr.is_word() { if name == sym::no_default_passes { - report_deprecated_attr("no_default_passes", diag); + report_deprecated_attr("no_default_passes", diag, attr.span()); if default_passes == passes::DefaultPassOption::Default { default_passes = passes::DefaultPassOption::None; } } } else if let Some(value) = attr.value_str() { - let sink = match name { + match name { sym::passes => { - report_deprecated_attr("passes = \"...\"", diag); - &mut manual_passes + report_deprecated_attr("passes = \"...\"", diag, attr.span()); } sym::plugins => { - report_deprecated_attr("plugins = \"...\"", diag); - eprintln!( - "WARNING: `#![doc(plugins = \"...\")]` \ - no longer functions; see CVE-2018-1000622" - ); + report_deprecated_attr("plugins = \"...\"", diag, attr.span()); continue; } _ => continue, }; for name in value.as_str().split_whitespace() { - sink.push(name.to_string()); + let span = attr.name_value_literal_span().unwrap_or(attr.span()); + manual_passes.extend(parse_pass(name, Some(span))); } } @@ -606,17 +564,7 @@ crate fn run_global_ctxt( } } - let passes = passes::defaults(default_passes).iter().copied().chain( - manual_passes.into_iter().flat_map(|name| { - if let Some(pass) = passes::find_pass(&name) { - Some(ConditionalPass::always(pass)) - } else { - error!("unknown pass {}, skipping", name); - None - } - }), - ); - + let passes = passes::defaults(default_passes).iter().copied().chain(manual_passes); info!("Executing passes"); for p in passes { @@ -628,16 +576,22 @@ crate fn run_global_ctxt( }; if run { debug!("running pass {}", p.pass.name); - krate = ctxt.tcx.sess.time(p.pass.name, || (p.pass.run)(krate, &ctxt)); + krate = ctxt.tcx.sess.time(p.pass.name, || (p.pass.run)(krate, &mut ctxt)); } } ctxt.sess().abort_if_errors(); + let render_options = ctxt.render_options; + let mut cache = ctxt.cache; + krate = tcx.sess.time("create_format_cache", || { + cache.populate(krate, tcx, &render_options.extern_html_root_urls, &render_options.output) + }); + // The main crate doc comments are always collapsed. krate.collapsed = true; - (krate, ctxt.renderinfo.into_inner(), ctxt.render_options) + (krate, render_options, cache) } /// Due to , diff --git a/src/librustdoc/doctest.rs b/src/librustdoc/doctest.rs index eecfd337cd..d9e97e02a1 100644 --- a/src/librustdoc/doctest.rs +++ b/src/librustdoc/doctest.rs @@ -26,8 +26,8 @@ use std::str; use crate::clean::Attributes; use crate::config::Options; -use crate::core::init_lints; use crate::html::markdown::{self, ErrorCodes, Ignore, LangString}; +use crate::lint::init_lints; use crate::passes::span_of_attrs; #[derive(Clone, Default)] @@ -44,11 +44,14 @@ crate struct TestOptions { crate fn run(options: Options) -> Result<(), ErrorReported> { let input = config::Input::File(options.input.clone()); - let invalid_codeblock_attributes_name = rustc_lint::builtin::INVALID_CODEBLOCK_ATTRIBUTES.name; + let invalid_codeblock_attributes_name = crate::lint::INVALID_CODEBLOCK_ATTRIBUTES.name; - // In addition to those specific lints, we also need to allow those given through - // command line, otherwise they'll get ignored and we don't want that. - let allowed_lints = vec![invalid_codeblock_attributes_name.to_owned()]; + // See core::create_config for what's going on here. + let allowed_lints = vec![ + invalid_codeblock_attributes_name.to_owned(), + lint::builtin::UNKNOWN_LINTS.name.to_owned(), + lint::builtin::RENAMED_AND_REMOVED_LINTS.name.to_owned(), + ]; let (lint_opts, lint_caps) = init_lints(allowed_lints, options.lint_opts.clone(), |lint| { if lint.name == invalid_codeblock_attributes_name { @@ -92,7 +95,8 @@ crate fn run(options: Options) -> Result<(), ErrorReported> { diagnostic_output: DiagnosticOutput::Default, stderr: None, lint_caps, - register_lints: None, + parse_sess_created: None, + register_lints: Some(box crate::lint::register_lints), override_queries: None, make_codegen_backend: None, registry: rustc_driver::diagnostics_registry(), @@ -103,25 +107,27 @@ crate fn run(options: Options) -> Result<(), ErrorReported> { 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); - 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.session().parse_sess.clone_source_map()), - None, - enable_per_target_ignores, - ); + let _lower_to_hir = queries.lower_to_hir()?; + let crate_name = queries.crate_name()?.peek().to_string(); let mut global_ctxt = queries.global_ctxt()?.take(); - global_ctxt.enter(|tcx| { + let collector = global_ctxt.enter(|tcx| { let krate = tcx.hir().krate(); + let crate_attrs = tcx.hir().attrs(CRATE_HIR_ID); + + let mut opts = scrape_test_config(crate_attrs); + opts.display_warnings |= options.display_warnings; + let enable_per_target_ignores = options.enable_per_target_ignores; + let mut collector = Collector::new( + crate_name, + options, + false, + opts, + Some(compiler.session().parse_sess.clone_source_map()), + None, + enable_per_target_ignores, + ); let mut hir_collector = HirCollector { sess: compiler.session(), @@ -134,13 +140,14 @@ crate fn run(options: Options) -> Result<(), ErrorReported> { }; hir_collector.visit_testable( "".to_string(), - &krate.item.attrs, CRATE_HIR_ID, krate.item.span, |this| { intravisit::walk_crate(this, krate); }, ); + + collector }); compiler.session().abort_if_errors(); @@ -165,15 +172,13 @@ crate fn run(options: Options) -> Result<(), ErrorReported> { } // 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(attrs: &[ast::Attribute]) -> TestOptions { use rustc_ast_pretty::pprust; let mut opts = TestOptions { no_crate_inject: false, display_warnings: false, attrs: Vec::new() }; - let test_attrs: Vec<_> = krate - .item - .attrs + let test_attrs: Vec<_> = attrs .iter() .filter(|a| a.has_name(sym::doc)) .flat_map(|a| a.meta_item_list().unwrap_or_else(Vec::new)) @@ -546,9 +551,12 @@ crate fn make_test( // compiler. if !already_has_extern_crate && !opts.no_crate_inject && cratename != Some("std") { if let Some(cratename) = cratename { - // Make sure its actually used if not included. + // Don't inject `extern crate` if the crate is never used. + // NOTE: this is terribly inaccurate because it doesn't actually + // parse the source, but only has false positives, not false + // negatives. if s.contains(cratename) { - prog.push_str(&format!("extern crate {};\n", cratename)); + prog.push_str(&format!("extern crate r#{};\n", cratename)); line_offset += 1; } } @@ -985,11 +993,11 @@ impl<'a, 'hir, 'tcx> HirCollector<'a, 'hir, 'tcx> { fn visit_testable( &mut self, name: String, - attrs: &[ast::Attribute], hir_id: HirId, sp: Span, nested: F, ) { + let attrs = self.tcx.hir().attrs(hir_id); let mut attrs = Attributes::from_ast(self.sess.diagnostic(), attrs, None); if let Some(ref cfg) = attrs.cfg { if !cfg.matches(&self.sess.parse_sess, Some(&self.sess.features_untracked())) { @@ -1047,25 +1055,25 @@ impl<'a, 'hir, 'tcx> intravisit::Visitor<'hir> for HirCollector<'a, 'hir, 'tcx> item.ident.to_string() }; - self.visit_testable(name, &item.attrs, item.hir_id, item.span, |this| { + self.visit_testable(name, item.hir_id(), item.span, |this| { intravisit::walk_item(this, item); }); } fn visit_trait_item(&mut self, item: &'hir hir::TraitItem<'_>) { - self.visit_testable(item.ident.to_string(), &item.attrs, item.hir_id, item.span, |this| { + self.visit_testable(item.ident.to_string(), item.hir_id(), item.span, |this| { intravisit::walk_trait_item(this, item); }); } fn visit_impl_item(&mut self, item: &'hir hir::ImplItem<'_>) { - self.visit_testable(item.ident.to_string(), &item.attrs, item.hir_id, item.span, |this| { + self.visit_testable(item.ident.to_string(), item.hir_id(), item.span, |this| { intravisit::walk_impl_item(this, item); }); } fn visit_foreign_item(&mut self, item: &'hir hir::ForeignItem<'_>) { - self.visit_testable(item.ident.to_string(), &item.attrs, item.hir_id, item.span, |this| { + self.visit_testable(item.ident.to_string(), item.hir_id(), item.span, |this| { intravisit::walk_foreign_item(this, item); }); } @@ -1076,22 +1084,21 @@ impl<'a, 'hir, 'tcx> intravisit::Visitor<'hir> for HirCollector<'a, 'hir, 'tcx> g: &'hir hir::Generics<'_>, item_id: hir::HirId, ) { - self.visit_testable(v.ident.to_string(), &v.attrs, v.id, v.span, |this| { + self.visit_testable(v.ident.to_string(), v.id, v.span, |this| { intravisit::walk_variant(this, v, g, item_id); }); } - fn visit_struct_field(&mut self, f: &'hir hir::StructField<'_>) { - self.visit_testable(f.ident.to_string(), &f.attrs, f.hir_id, f.span, |this| { - intravisit::walk_struct_field(this, f); + fn visit_field_def(&mut self, f: &'hir hir::FieldDef<'_>) { + self.visit_testable(f.ident.to_string(), f.hir_id, f.span, |this| { + intravisit::walk_field_def(this, f); }); } fn visit_macro_def(&mut self, macro_def: &'hir hir::MacroDef<'_>) { self.visit_testable( macro_def.ident.to_string(), - ¯o_def.attrs, - macro_def.hir_id, + macro_def.hir_id(), macro_def.span, |_| (), ); diff --git a/src/librustdoc/doctest/tests.rs b/src/librustdoc/doctest/tests.rs index 465b2b1d69..c49e45c0e2 100644 --- a/src/librustdoc/doctest/tests.rs +++ b/src/librustdoc/doctest/tests.rs @@ -38,7 +38,7 @@ fn make_test_crate_name() { let input = "use asdf::qwop; assert_eq!(2+2, 4);"; let expected = "#![allow(unused)] -extern crate asdf; +extern crate r#asdf; fn main() { use asdf::qwop; assert_eq!(2+2, 4); @@ -128,7 +128,7 @@ fn make_test_opts_attrs() { let input = "use asdf::qwop; assert_eq!(2+2, 4);"; let expected = "#![feature(sick_rad)] -extern crate asdf; +extern crate r#asdf; fn main() { use asdf::qwop; assert_eq!(2+2, 4); @@ -141,7 +141,7 @@ assert_eq!(2+2, 4); opts.attrs.push("feature(hella_dope)".to_string()); let expected = "#![feature(sick_rad)] #![feature(hella_dope)] -extern crate asdf; +extern crate r#asdf; fn main() { use asdf::qwop; assert_eq!(2+2, 4); @@ -250,7 +250,7 @@ assert_eq!(asdf::foo, 4);"; let expected = "#![allow(unused)] extern crate hella_qwop; -extern crate asdf; +extern crate r#asdf; fn main() { assert_eq!(asdf::foo, 4); }" diff --git a/src/librustdoc/fold.rs b/src/librustdoc/fold.rs index b2773a29e2..2b980ebe59 100644 --- a/src/librustdoc/fold.rs +++ b/src/librustdoc/fold.rs @@ -92,7 +92,8 @@ crate trait DocFolder: Sized { { let external_traits = { std::mem::take(&mut *c.external_traits.borrow_mut()) }; for (k, mut v) in external_traits { - v.items = v.items.into_iter().filter_map(|i| self.fold_item(i)).collect(); + v.trait_.items = + v.trait_.items.into_iter().filter_map(|i| self.fold_item(i)).collect(); c.external_traits.borrow_mut().insert(k, v); } } diff --git a/src/librustdoc/formats/cache.rs b/src/librustdoc/formats/cache.rs index c506f5a37b..9415caf8b6 100644 --- a/src/librustdoc/formats/cache.rs +++ b/src/librustdoc/formats/cache.rs @@ -5,11 +5,12 @@ use std::path::{Path, PathBuf}; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_hir::def_id::{CrateNum, DefId, CRATE_DEF_INDEX}; use rustc_middle::middle::privacy::AccessLevels; +use rustc_middle::ty::TyCtxt; use rustc_span::source_map::FileName; +use rustc_span::symbol::sym; use rustc_span::Symbol; use crate::clean::{self, GetDefId}; -use crate::config::RenderInfo; use crate::fold::DocFolder; use crate::formats::item_type::ItemType; use crate::formats::Impl; @@ -63,7 +64,7 @@ crate struct Cache { /// Implementations of a crate should inherit the documentation of the /// parent trait if no extra documentation is specified, and default methods /// should show up in documentation about trait implementations. - crate traits: FxHashMap, + crate traits: FxHashMap, /// When rendering traits, it's often useful to be able to list all /// implementors of the trait, and this mapping is exactly, that: a mapping @@ -88,12 +89,16 @@ crate struct Cache { /// This is stored in `Cache` so it doesn't need to be passed through all rustdoc functions. crate document_private: bool, + /// Crates marked with [`#[doc(masked)]`][doc_masked]. + /// + /// [doc_masked]: https://doc.rust-lang.org/nightly/unstable-book/language-features/doc-masked.html + crate masked_crates: FxHashSet, + // Private fields only used when initially crawling a crate to build a cache stack: Vec, parent_stack: Vec, parent_is_trait_impl: bool, stripped_mod: bool, - masked_crates: FxHashSet, crate search_index: Vec, crate deref_trait_did: Option, @@ -121,44 +126,30 @@ crate struct Cache { crate aliases: BTreeMap>, } +/// This struct is used to wrap the `cache` and `tcx` in order to run `DocFolder`. +struct CacheBuilder<'a, 'tcx> { + cache: &'a mut Cache, + empty_cache: Cache, + tcx: TyCtxt<'tcx>, +} + impl Cache { - crate fn from_krate( - render_info: RenderInfo, - document_private: bool, + crate fn new(access_levels: AccessLevels, document_private: bool) -> Self { + Cache { access_levels, document_private, ..Cache::default() } + } + + /// Populates the `Cache` with more data. The returned `Crate` will be missing some data that was + /// in `krate` due to the data being moved into the `Cache`. + crate fn populate( + &mut self, + mut krate: clean::Crate, + tcx: TyCtxt<'_>, extern_html_root_urls: &BTreeMap, dst: &Path, - mut krate: clean::Crate, - ) -> (clean::Crate, Cache) { + ) -> clean::Crate { // Crawl the crate to build various caches used for the output - let RenderInfo { - inlined: _, - external_paths, - exact_paths, - access_levels, - deref_trait_did, - deref_mut_trait_did, - owned_box_did, - .. - } = render_info; - - let external_paths = - external_paths.into_iter().map(|(k, (v, t))| (k, (v, ItemType::from(t)))).collect(); - - let mut cache = Cache { - external_paths, - exact_paths, - parent_is_trait_impl: false, - stripped_mod: false, - access_levels, - crate_version: krate.version.take(), - document_private, - traits: krate.external_traits.replace(Default::default()), - deref_trait_did, - deref_mut_trait_did, - owned_box_did, - masked_crates: mem::take(&mut krate.masked_crates), - ..Cache::default() - }; + debug!(?self.crate_version); + self.traits = krate.external_traits.take(); // Cache where all our extern crates are located // FIXME: this part is specific to HTML so it'd be nice to remove it from the common code @@ -171,12 +162,11 @@ impl Cache { _ => PathBuf::new(), }; let extern_url = extern_html_root_urls.get(&*e.name.as_str()).map(|u| &**u); - cache - .extern_locations + self.extern_locations .insert(n, (e.name, 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)); + self.external_paths.insert(did, (vec![e.name.to_string()], ItemType::Module)); } // Cache where all known primitives have their documentation located. @@ -185,30 +175,30 @@ impl Cache { // reverse topological order. for &(_, ref e) in krate.externs.iter().rev() { for &(def_id, prim) in &e.primitives { - cache.primitive_locations.insert(prim, def_id); + self.primitive_locations.insert(prim, def_id); } } for &(def_id, prim) in &krate.primitives { - cache.primitive_locations.insert(prim, def_id); + self.primitive_locations.insert(prim, def_id); } - cache.stack.push(krate.name.to_string()); + self.stack.push(krate.name.to_string()); - krate = cache.fold_crate(krate); + krate = CacheBuilder { tcx, cache: self, empty_cache: Cache::default() }.fold_crate(krate); - for (trait_did, dids, impl_) in cache.orphan_trait_impls.drain(..) { - if cache.traits.contains_key(&trait_did) { + for (trait_did, dids, impl_) in self.orphan_trait_impls.drain(..) { + if self.traits.contains_key(&trait_did) { for did in dids { - cache.impls.entry(did).or_default().push(impl_.clone()); + self.impls.entry(did).or_default().push(impl_.clone()); } } } - (krate, cache) + krate } } -impl DocFolder for Cache { +impl<'a, 'tcx> DocFolder for CacheBuilder<'a, 'tcx> { fn fold_item(&mut self, item: clean::Item) -> Option { if item.def_id.is_local() { debug!("folding {} \"{:?}\", id {:?}", item.type_(), item.name, item.def_id); @@ -218,17 +208,17 @@ impl DocFolder for Cache { // we don't want it or its children in the search index. let orig_stripped_mod = match *item.kind { clean::StrippedItem(box clean::ModuleItem(..)) => { - mem::replace(&mut self.stripped_mod, true) + mem::replace(&mut self.cache.stripped_mod, true) } - _ => self.stripped_mod, + _ => self.cache.stripped_mod, }; // 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.kind { - 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.cache.masked_crates.contains(&item.def_id.krate) + || i.trait_.def_id().map_or(false, |d| self.cache.masked_crates.contains(&d.krate)) + || i.for_.def_id().map_or(false, |d| self.cache.masked_crates.contains(&d.krate)) { return None; } @@ -237,14 +227,18 @@ impl DocFolder for Cache { // Propagate a trait method's documentation to all implementors of the // trait. if let clean::TraitItem(ref t) = *item.kind { - self.traits.entry(item.def_id).or_insert_with(|| t.clone()); + self.cache.traits.entry(item.def_id).or_insert_with(|| clean::TraitWithExtraInfo { + trait_: t.clone(), + is_spotlight: item.attrs.has_doc_flag(sym::spotlight), + }); } // Collect all the implementors of traits. if let clean::ImplItem(ref i) = *item.kind { if let Some(did) = i.trait_.def_id() { if i.blanket_impl.is_none() { - self.implementors + self.cache + .implementors .entry(did) .or_default() .push(Impl { impl_item: item.clone() }); @@ -257,7 +251,7 @@ impl DocFolder for Cache { let (parent, is_inherent_impl_item) = match *item.kind { clean::StrippedItem(..) => ((None, None), false), clean::AssocConstItem(..) | clean::TypedefItem(_, true) - if self.parent_is_trait_impl => + if self.cache.parent_is_trait_impl => { // skip associated items in trait impls ((None, None), false) @@ -267,18 +261,18 @@ impl DocFolder for Cache { | clean::StructFieldItem(..) | clean::VariantItem(..) => ( ( - Some(*self.parent_stack.last().expect("parent_stack is empty")), - Some(&self.stack[..self.stack.len() - 1]), + Some(*self.cache.parent_stack.last().expect("parent_stack is empty")), + Some(&self.cache.stack[..self.cache.stack.len() - 1]), ), false, ), clean::MethodItem(..) | clean::AssocConstItem(..) => { - if self.parent_stack.is_empty() { + if self.cache.parent_stack.is_empty() { ((None, None), false) } else { - let last = self.parent_stack.last().expect("parent_stack is empty 2"); + let last = self.cache.parent_stack.last().expect("parent_stack is empty 2"); let did = *last; - let path = match self.paths.get(&did) { + let path = match self.cache.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 @@ -290,24 +284,24 @@ impl DocFolder for Cache { | ItemType::Union | ItemType::Enum, )) => Some(&fqp[..fqp.len() - 1]), - Some(..) => Some(&*self.stack), + Some(..) => Some(&*self.cache.stack), None => None, }; ((Some(*last), path), true) } } - _ => ((None, Some(&*self.stack)), false), + _ => ((None, Some(&*self.cache.stack)), false), }; match parent { - (parent, Some(path)) if is_inherent_impl_item || !self.stripped_mod => { + (parent, Some(path)) if is_inherent_impl_item || !self.cache.stripped_mod => { debug_assert!(!item.is_stripped()); // A crate has a module at its root, containing all items, // which should not be indexed. The crate-item itself is // inserted later on when serializing the search-index. if item.def_id.index != CRATE_DEF_INDEX { - self.search_index.push(IndexItem { + self.cache.search_index.push(IndexItem { ty: item.type_(), name: s.to_string(), path: path.join("::"), @@ -316,21 +310,22 @@ impl DocFolder for Cache { .map_or_else(String::new, |x| short_markdown_summary(&x.as_str())), parent, parent_idx: None, - search_type: get_index_search_type(&item, None), + search_type: get_index_search_type(&item, &self.empty_cache, self.tcx), }); for alias in item.attrs.get_doc_aliases() { - self.aliases + self.cache + .aliases .entry(alias.to_lowercase()) .or_insert(Vec::new()) - .push(self.search_index.len() - 1); + .push(self.cache.search_index.len() - 1); } } } (Some(parent), None) if is_inherent_impl_item => { // We have a parent, but we don't know where they're // defined yet. Wait for later to index this item. - self.orphan_impl_items.push((parent, item.clone())); + self.cache.orphan_impl_items.push((parent, item.clone())); } _ => {} } @@ -339,7 +334,7 @@ impl DocFolder for Cache { // Keep track of the fully qualified path for this item. let pushed = match item.name { Some(n) if !n.is_empty() => { - self.stack.push(n.to_string()); + self.cache.stack.push(n.to_string()); true } _ => false, @@ -361,7 +356,7 @@ impl DocFolder for Cache { | clean::MacroItem(..) | clean::ProcMacroItem(..) | clean::VariantItem(..) - if !self.stripped_mod => + if !self.cache.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, @@ -369,21 +364,21 @@ impl DocFolder for Cache { // `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.cache.paths.contains_key(&item.def_id) + || self.cache.access_levels.is_public(item.def_id) { - self.paths.insert(item.def_id, (self.stack.clone(), item.type_())); + self.cache.paths.insert(item.def_id, (self.cache.stack.clone(), item.type_())); } } clean::PrimitiveItem(..) => { - self.paths.insert(item.def_id, (self.stack.clone(), item.type_())); + self.cache.paths.insert(item.def_id, (self.cache.stack.clone(), item.type_())); } _ => {} } // Maintain the parent stack - let orig_parent_is_trait_impl = self.parent_is_trait_impl; + let orig_parent_is_trait_impl = self.cache.parent_is_trait_impl; let parent_pushed = match *item.kind { clean::TraitItem(..) | clean::EnumItem(..) @@ -391,24 +386,24 @@ impl DocFolder for Cache { | clean::StructItem(..) | clean::UnionItem(..) | clean::VariantItem(..) => { - self.parent_stack.push(item.def_id); - self.parent_is_trait_impl = false; + self.cache.parent_stack.push(item.def_id); + self.cache.parent_is_trait_impl = false; true } clean::ImplItem(ref i) => { - self.parent_is_trait_impl = i.trait_.is_some(); + self.cache.parent_is_trait_impl = i.trait_.is_some(); match i.for_ { clean::ResolvedPath { did, .. } => { - self.parent_stack.push(did); + self.cache.parent_stack.push(did); true } ref t => { let prim_did = t .primitive_type() - .and_then(|t| self.primitive_locations.get(&t).cloned()); + .and_then(|t| self.cache.primitive_locations.get(&t).cloned()); match prim_did { Some(did) => { - self.parent_stack.push(did); + self.cache.parent_stack.push(did); true } None => false, @@ -433,8 +428,9 @@ impl DocFolder for Cache { 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.cache.primitive_locations.get(&t).cloned()); if let Some(did) = did { dids.insert(did); @@ -450,13 +446,13 @@ impl DocFolder for Cache { } } let impl_item = Impl { impl_item: item }; - if impl_item.trait_did().map_or(true, |d| self.traits.contains_key(&d)) { + if impl_item.trait_did().map_or(true, |d| self.cache.traits.contains_key(&d)) { for did in dids { - self.impls.entry(did).or_insert(vec![]).push(impl_item.clone()); + self.cache.impls.entry(did).or_insert(vec![]).push(impl_item.clone()); } } else { let trait_did = impl_item.trait_did().expect("no trait did"); - self.orphan_trait_impls.push((trait_did, dids, impl_item)); + self.cache.orphan_trait_impls.push((trait_did, dids, impl_item)); } None } else { @@ -464,13 +460,13 @@ impl DocFolder for Cache { }; if pushed { - self.stack.pop().expect("stack already empty"); + self.cache.stack.pop().expect("stack already empty"); } if parent_pushed { - self.parent_stack.pop().expect("parent stack already empty"); + self.cache.parent_stack.pop().expect("parent stack already empty"); } - self.stripped_mod = orig_stripped_mod; - self.parent_is_trait_impl = orig_parent_is_trait_impl; + self.cache.stripped_mod = orig_stripped_mod; + self.cache.parent_is_trait_impl = orig_parent_is_trait_impl; ret } } diff --git a/src/librustdoc/formats/item_type.rs b/src/librustdoc/formats/item_type.rs index 7922a1ffa0..460d4b907c 100644 --- a/src/librustdoc/formats/item_type.rs +++ b/src/librustdoc/formats/item_type.rs @@ -67,7 +67,7 @@ impl<'a> From<&'a clean::Item> for ItemType { match *kind { clean::ModuleItem(..) => ItemType::Module, - clean::ExternCrateItem(..) => ItemType::ExternCrate, + clean::ExternCrateItem { .. } => ItemType::ExternCrate, clean::ImportItem(..) => ItemType::Import, clean::StructItem(..) => ItemType::Struct, clean::UnionItem(..) => ItemType::Union, diff --git a/src/librustdoc/formats/renderer.rs b/src/librustdoc/formats/renderer.rs index 6ecc4695dc..9095faf676 100644 --- a/src/librustdoc/formats/renderer.rs +++ b/src/librustdoc/formats/renderer.rs @@ -2,14 +2,14 @@ use rustc_middle::ty::TyCtxt; use rustc_span::edition::Edition; use crate::clean; -use crate::config::{RenderInfo, RenderOptions}; +use crate::config::RenderOptions; use crate::error::Error; use crate::formats::cache::Cache; /// Allows for different backends to rustdoc to be used with the `run_format()` function. Each /// backend renderer has hooks for initialization, documenting an item, entering and exiting a /// module, and cleanup/finalizing output. -crate trait FormatRenderer<'tcx>: Clone { +crate trait FormatRenderer<'tcx>: Sized { /// Gives a description of the renderer. Used for performance profiling. fn descr() -> &'static str; @@ -18,12 +18,14 @@ crate trait FormatRenderer<'tcx>: Clone { fn init( krate: clean::Crate, options: RenderOptions, - render_info: RenderInfo, edition: Edition, cache: Cache, tcx: TyCtxt<'tcx>, ) -> Result<(Self, clean::Crate), Error>; + /// Make a new renderer to render a child of the item currently being rendered. + fn make_child_renderer(&self) -> Self; + /// Renders a single non-module item. This means no recursive sub-item rendering is required. fn item(&mut self, item: clean::Item) -> Result<(), Error>; @@ -49,25 +51,16 @@ crate trait FormatRenderer<'tcx>: Clone { crate fn run_format<'tcx, T: FormatRenderer<'tcx>>( krate: clean::Crate, options: RenderOptions, - render_info: RenderInfo, + cache: Cache, diag: &rustc_errors::Handler, edition: Edition, tcx: TyCtxt<'tcx>, ) -> Result<(), Error> { - let (krate, cache) = tcx.sess.time("create_format_cache", || { - Cache::from_krate( - render_info.clone(), - options.document_private, - &options.extern_html_root_urls, - &options.output, - krate, - ) - }); let prof = &tcx.sess.prof; let (mut format_renderer, mut krate) = prof .extra_verbose_generic_activity("create_renderer", T::descr()) - .run(|| T::init(krate, options, render_info, edition, cache, tcx))?; + .run(|| T::init(krate, options, edition, cache, tcx))?; let mut item = match krate.module.take() { Some(i) => i, @@ -77,7 +70,7 @@ crate fn run_format<'tcx, T: FormatRenderer<'tcx>>( item.name = Some(krate.name); // Render the crate documentation - let mut work = vec![(format_renderer.clone(), item)]; + let mut work = vec![(format_renderer.make_child_renderer(), item)]; let unknown = rustc_span::Symbol::intern(""); while let Some((mut cx, item)) = work.pop() { @@ -97,11 +90,13 @@ crate fn run_format<'tcx, T: FormatRenderer<'tcx>>( }; for it in module.items { debug!("Adding {:?} to worklist", it.name); - work.push((cx.clone(), it)); + work.push((cx.make_child_renderer(), it)); } cx.mod_item_out(&name)?; - } else if item.name.is_some() { + // FIXME: checking `item.name.is_some()` is very implicit and leads to lots of special + // cases. Use an explicit match instead. + } else if item.name.is_some() && !item.is_extern_crate() { prof.generic_activity_with_arg("render_item", &*item.name.unwrap_or(unknown).as_str()) .run(|| cx.item(item))?; } diff --git a/src/librustdoc/html/format.rs b/src/librustdoc/html/format.rs index d795196122..bea0e75832 100644 --- a/src/librustdoc/html/format.rs +++ b/src/librustdoc/html/format.rs @@ -102,14 +102,6 @@ impl Buffer { self.into_inner() } - crate fn from_display(&mut self, t: T) { - if self.for_html { - write!(self, "{}", t); - } else { - write!(self, "{:#}", t); - } - } - crate fn is_for_html(&self) -> bool { self.for_html } @@ -900,16 +892,7 @@ impl clean::Type { } impl clean::Impl { - crate fn print<'a>(&'a self, cache: &'a Cache) -> impl fmt::Display + 'a { - self.print_inner(true, false, cache) - } - - fn print_inner<'a>( - &'a self, - link_trait: bool, - use_absolute: bool, - cache: &'a Cache, - ) -> impl fmt::Display + 'a { + crate fn print<'a>(&'a self, cache: &'a Cache, use_absolute: bool) -> impl fmt::Display + 'a { display_fn(move |f| { if f.alternate() { write!(f, "impl{:#} ", self.generics.print(cache))?; @@ -921,21 +904,7 @@ impl clean::Impl { if self.negative_polarity { write!(f, "!")?; } - - if link_trait { - fmt::Display::fmt(&ty.print(cache), f)?; - } else { - match ty { - clean::ResolvedPath { - param_names: None, path, is_generic: false, .. - } => { - let last = path.segments.last().unwrap(); - fmt::Display::fmt(&last.name, f)?; - fmt::Display::fmt(&last.args.print(cache), f)?; - } - _ => unreachable!(), - } - } + fmt::Display::fmt(&ty.print(cache), f)?; write!(f, " for ")?; } @@ -952,16 +921,6 @@ impl clean::Impl { } } -// The difference from above is that trait is not hyperlinked. -crate fn fmt_impl_for_trait_page( - i: &clean::Impl, - f: &mut Buffer, - use_absolute: bool, - cache: &Cache, -) { - f.from_display(i.print_inner(false, use_absolute, cache)) -} - impl clean::Arguments { crate fn print<'a>(&'a self, cache: &'a Cache) -> impl fmt::Display + 'a { display_fn(move |f| { diff --git a/src/librustdoc/html/layout.rs b/src/librustdoc/html/layout.rs index e5a686bd07..a717b30456 100644 --- a/src/librustdoc/html/layout.rs +++ b/src/librustdoc/html/layout.rs @@ -58,6 +58,7 @@ crate fn render( {style_files}\ \ \ + \ \ {css_extension}\ {favicon}\ @@ -75,14 +76,14 @@ crate fn render( \ {before_content}\ \
    \ \
    \ @@ -102,7 +103,7 @@ crate fn render( \ \"Change\ \
    \ @@ -112,10 +113,10 @@ crate fn render(
    \
    \ {after_content}\ -
    +
    \ {extra_scripts}\ - \ \ ", css_extension = if layout.css_file_extension.is_some() { diff --git a/src/librustdoc/html/markdown.rs b/src/librustdoc/html/markdown.rs index bdb92844f0..1505fe0369 100644 --- a/src/librustdoc/html/markdown.rs +++ b/src/librustdoc/html/markdown.rs @@ -21,7 +21,6 @@ use rustc_data_structures::fx::FxHashMap; use rustc_hir::def_id::DefId; use rustc_hir::HirId; use rustc_middle::ty::TyCtxt; -use rustc_session::lint; use rustc_span::edition::Edition; use rustc_span::Span; use std::borrow::Cow; @@ -48,12 +47,16 @@ mod tests; /// Options for rendering Markdown in the main body of documentation. pub(crate) fn opts() -> Options { - Options::ENABLE_TABLES | Options::ENABLE_FOOTNOTES | Options::ENABLE_STRIKETHROUGH + Options::ENABLE_TABLES + | Options::ENABLE_FOOTNOTES + | Options::ENABLE_STRIKETHROUGH + | Options::ENABLE_TASKLISTS + | Options::ENABLE_SMART_PUNCTUATION } /// A subset of [`opts()`] used for rendering summaries. pub(crate) fn summary_opts() -> Options { - Options::ENABLE_STRIKETHROUGH + Options::ENABLE_STRIKETHROUGH | Options::ENABLE_SMART_PUNCTUATION } /// When `to_string` is called, this struct will emit the HTML corresponding to @@ -717,7 +720,7 @@ impl<'tcx> ExtraInfo<'tcx> { (None, None) => return, }; self.tcx.struct_span_lint_hir( - lint::builtin::INVALID_CODEBLOCK_ATTRIBUTES, + crate::lint::INVALID_CODEBLOCK_ATTRIBUTES, hir_id, self.sp, |lint| { @@ -776,6 +779,31 @@ impl LangString { Self::parse(string, allow_error_code_check, enable_per_target_ignores, None) } + fn tokens(string: &str) -> impl Iterator { + // Pandoc, which Rust once used for generating documentation, + // expects lang strings to be surrounded by `{}` and for each token + // to be proceeded by a `.`. Since some of these lang strings are still + // loose in the wild, we strip a pair of surrounding `{}` from the lang + // string and a leading `.` from each token. + + let string = string.trim(); + + let first = string.chars().next(); + let last = string.chars().last(); + + let string = if first == Some('{') && last == Some('}') { + &string[1..string.len() - 1] + } else { + string + }; + + string + .split(|c| c == ',' || c == ' ' || c == '\t') + .map(str::trim) + .map(|token| if token.chars().next() == Some('.') { &token[1..] } else { token }) + .filter(|token| !token.is_empty()) + } + fn parse( string: &str, allow_error_code_check: ErrorCodes, @@ -789,11 +817,11 @@ impl LangString { let mut ignores = vec![]; data.original = string.to_owned(); - let tokens = string.split(|c: char| !(c == '_' || c == '-' || c.is_alphanumeric())); + + let tokens = Self::tokens(string).collect::>(); for token in tokens { - match token.trim() { - "" => {} + match token { "should_panic" => { data.should_panic = true; seen_rust_tags = !seen_other_tags; @@ -890,6 +918,7 @@ impl LangString { _ => seen_other_tags = true, } } + // ignore-foo overrides ignore if !ignores.is_empty() { data.ignore = Ignore::Some(ignores); @@ -1064,6 +1093,7 @@ fn markdown_summary_with_limit(md: &str, length_limit: usize) -> (String, bool) Tag::Emphasis => s.push_str(""), Tag::Strong => s.push_str(""), Tag::Paragraph => break, + Tag::Heading(..) => break, _ => {} }, Event::HardBreak | Event::SoftBreak => { @@ -1121,6 +1151,7 @@ crate fn plain_text_summary(md: &str) -> String { Event::HardBreak | Event::SoftBreak => s.push(' '), Event::Start(Tag::CodeBlock(..)) => break, Event::End(Tag::Paragraph) => break, + Event::End(Tag::Heading(..)) => break, _ => (), } } @@ -1343,10 +1374,6 @@ impl IdMap { } } - crate fn reset(&mut self) { - self.map = init_id_map(); - } - crate fn derive + ToString>(&mut self, candidate: S) -> String { let id = match self.map.get_mut(candidate.as_ref()) { None => candidate.to_string(), diff --git a/src/librustdoc/html/markdown/tests.rs b/src/librustdoc/html/markdown/tests.rs index 9da3072ec2..ac3ea4c8c5 100644 --- a/src/librustdoc/html/markdown/tests.rs +++ b/src/librustdoc/html/markdown/tests.rs @@ -1,7 +1,6 @@ use super::{plain_text_summary, short_markdown_summary}; use super::{ErrorCodes, IdMap, Ignore, LangString, Markdown, MarkdownHtml}; use rustc_span::edition::{Edition, DEFAULT_EDITION}; -use std::cell::RefCell; #[test] fn test_unique_id() { @@ -38,15 +37,9 @@ fn test_unique_id() { "assoc_type.Item-1", ]; - let map = RefCell::new(IdMap::new()); - let test = || { - let mut map = map.borrow_mut(); - let actual: Vec = input.iter().map(|s| map.derive(s.to_string())).collect(); - assert_eq!(&actual[..], expected); - }; - test(); - map.borrow_mut().reset(); - test(); + let mut map = IdMap::new(); + let actual: Vec = input.iter().map(|s| map.derive(s.to_string())).collect(); + assert_eq!(&actual[..], expected); } #[test] @@ -58,6 +51,9 @@ fn test_lang_string_parse() { t(Default::default()); t(LangString { original: "rust".into(), ..Default::default() }); + t(LangString { original: ".rust".into(), ..Default::default() }); + t(LangString { original: "{rust}".into(), ..Default::default() }); + t(LangString { original: "{.rust}".into(), ..Default::default() }); t(LangString { original: "sh".into(), rust: false, ..Default::default() }); t(LangString { original: "ignore".into(), ignore: Ignore::All, ..Default::default() }); t(LangString { @@ -75,16 +71,16 @@ fn test_lang_string_parse() { ..Default::default() }); t(LangString { original: "allow_fail".into(), allow_fail: true, ..Default::default() }); - t(LangString { original: "{.no_run .example}".into(), no_run: true, ..Default::default() }); + t(LangString { original: "no_run,example".into(), no_run: true, ..Default::default() }); t(LangString { - original: "{.sh .should_panic}".into(), + original: "sh,should_panic".into(), should_panic: true, rust: false, ..Default::default() }); - t(LangString { original: "{.example .rust}".into(), ..Default::default() }); + t(LangString { original: "example,rust".into(), ..Default::default() }); t(LangString { - original: "{.test_harness .rust}".into(), + original: "test_harness,.rust".into(), test_harness: true, ..Default::default() }); @@ -100,6 +96,18 @@ fn test_lang_string_parse() { rust: false, ..Default::default() }); + t(LangString { + original: "text,no_run, ".into(), + no_run: true, + rust: false, + ..Default::default() + }); + t(LangString { + original: "text,no_run,".into(), + no_run: true, + rust: false, + ..Default::default() + }); t(LangString { original: "edition2015".into(), edition: Some(Edition::Edition2015), @@ -112,6 +120,29 @@ fn test_lang_string_parse() { }); } +#[test] +fn test_lang_string_tokenizer() { + fn case(lang_string: &str, want: &[&str]) { + let have = LangString::tokens(lang_string).collect::>(); + assert_eq!(have, want, "Unexpected lang string split for `{}`", lang_string); + } + + case("", &[]); + case("foo", &["foo"]); + case("foo,bar", &["foo", "bar"]); + case(".foo,.bar", &["foo", "bar"]); + case("{.foo,.bar}", &["foo", "bar"]); + case(" {.foo,.bar} ", &["foo", "bar"]); + case("foo bar", &["foo", "bar"]); + case("foo\tbar", &["foo", "bar"]); + case("foo\t, bar", &["foo", "bar"]); + case(" foo , bar ", &["foo", "bar"]); + case(",,foo,,bar,,", &["foo", "bar"]); + case("foo=bar", &["foo=bar"]); + case("a-b-c", &["a-b-c"]); + case("a_b_c", &["a_b_c"]); +} + #[test] fn test_header() { fn t(input: &str, expect: &str) { @@ -201,9 +232,10 @@ fn test_short_markdown_summary() { t("Hard-break \nsummary", "Hard-break summary"); t("hello [Rust] :)\n\n[Rust]: https://www.rust-lang.org", "hello Rust :)"); t("hello [Rust](https://www.rust-lang.org \"Rust\") :)", "hello Rust :)"); - t("code `let x = i32;` ...", "code let x = i32; ..."); - t("type `Type<'static>` ...", "type Type<'static> ..."); + t("code `let x = i32;` ...", "code let x = i32; …"); + t("type `Type<'static>` ...", "type Type<'static> …"); t("# top header", "top header"); + t("# top header\n\nfollowed by a paragraph", "top header"); t("## header", "header"); t("first paragraph\n\nsecond paragraph", "first paragraph"); t("```\nfn main() {}\n```", ""); @@ -227,9 +259,10 @@ fn test_plain_text_summary() { t("Hard-break \nsummary", "Hard-break summary"); t("hello [Rust] :)\n\n[Rust]: https://www.rust-lang.org", "hello Rust :)"); t("hello [Rust](https://www.rust-lang.org \"Rust\") :)", "hello Rust :)"); - t("code `let x = i32;` ...", "code `let x = i32;` ..."); - t("type `Type<'static>` ...", "type `Type<'static>` ..."); + t("code `let x = i32;` ...", "code `let x = i32;` …"); + t("type `Type<'static>` ...", "type `Type<'static>` …"); t("# top header", "top header"); + t("# top header\n\nfollowed by some text", "top header"); t("## header", "header"); t("first paragraph\n\nsecond paragraph", "first paragraph"); t("```\nfn main() {}\n```", ""); @@ -250,6 +283,6 @@ fn test_markdown_html_escape() { } t("`Struct<'a, T>`", "

    Struct<'a, T>

    \n"); - t("Struct<'a, T>", "

    Struct<'a, T>

    \n"); + t("Struct<'a, T>", "

    Struct<’a, T>

    \n"); t("Struct
    ", "

    Struct<br>

    \n"); } diff --git a/src/librustdoc/html/render/cache.rs b/src/librustdoc/html/render/cache.rs index 4dd7110f33..56fee2c9fe 100644 --- a/src/librustdoc/html/render/cache.rs +++ b/src/librustdoc/html/render/cache.rs @@ -1,11 +1,14 @@ use std::collections::BTreeMap; use std::path::Path; -use rustc_data_structures::fx::FxHashMap; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use rustc_middle::ty::TyCtxt; use rustc_span::symbol::{sym, Symbol}; -use serde::Serialize; +use serde::ser::{Serialize, SerializeStruct, Serializer}; -use crate::clean::types::GetDefId; +use crate::clean::types::{ + FnDecl, FnRetTy, GenericBound, Generics, GetDefId, Type, TypeKind, WherePredicate, +}; use crate::clean::{self, AttributesExt}; use crate::formats::cache::Cache; use crate::formats::item_type::ItemType; @@ -62,7 +65,7 @@ crate fn extern_location( } /// Builds the search index from the collected metadata -crate fn build_index(krate: &clean::Crate, cache: &mut Cache) -> String { +crate fn build_index<'tcx>(krate: &clean::Crate, cache: &mut Cache, tcx: TyCtxt<'tcx>) -> String { let mut defid_to_pathid = FxHashMap::default(); let mut crate_items = Vec::with_capacity(cache.search_index.len()); let mut crate_paths = vec![]; @@ -78,7 +81,7 @@ crate fn build_index(krate: &clean::Crate, cache: &mut Cache) -> String { desc: item.doc_value().map_or_else(String::new, |s| short_markdown_summary(&s)), parent: Some(did), parent_idx: None, - search_type: get_index_search_type(&item, Some(cache)), + search_type: get_index_search_type(&item, cache, tcx), }); for alias in item.attrs.get_doc_aliases() { cache @@ -130,21 +133,69 @@ crate fn build_index(krate: &clean::Crate, cache: &mut Cache) -> String { .map(|module| module.doc_value().map_or_else(String::new, |s| short_markdown_summary(&s))) .unwrap_or_default(); - #[derive(Serialize)] struct CrateData<'a> { doc: String, - #[serde(rename = "i")] items: Vec<&'a IndexItem>, - #[serde(rename = "p")] paths: Vec<(ItemType, String)>, // The String is alias name and the vec is the list of the elements with this alias. // // To be noted: the `usize` elements are indexes to `items`. - #[serde(rename = "a")] - #[serde(skip_serializing_if = "BTreeMap::is_empty")] aliases: &'a BTreeMap>, } + impl<'a> Serialize for CrateData<'a> { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + let has_aliases = !self.aliases.is_empty(); + let mut crate_data = + serializer.serialize_struct("CrateData", if has_aliases { 9 } else { 8 })?; + crate_data.serialize_field("doc", &self.doc)?; + crate_data.serialize_field( + "t", + &self.items.iter().map(|item| &item.ty).collect::>(), + )?; + crate_data.serialize_field( + "n", + &self.items.iter().map(|item| &item.name).collect::>(), + )?; + crate_data.serialize_field( + "q", + &self.items.iter().map(|item| &item.path).collect::>(), + )?; + crate_data.serialize_field( + "d", + &self.items.iter().map(|item| &item.desc).collect::>(), + )?; + crate_data.serialize_field( + "i", + &self + .items + .iter() + .map(|item| { + assert_eq!( + item.parent.is_some(), + item.parent_idx.is_some(), + "`{}` is missing idx", + item.name + ); + item.parent_idx.map(|x| x + 1).unwrap_or(0) + }) + .collect::>(), + )?; + crate_data.serialize_field( + "f", + &self.items.iter().map(|item| &item.search_type).collect::>(), + )?; + crate_data.serialize_field("p", &self.paths)?; + if has_aliases { + crate_data.serialize_field("a", &self.aliases)?; + } + crate_data.end() + } + } + // Collect the index into a string format!( r#""{}":{}"#, @@ -164,14 +215,15 @@ crate fn build_index(krate: &clean::Crate, cache: &mut Cache) -> String { ) } -crate fn get_index_search_type( +crate fn get_index_search_type<'tcx>( item: &clean::Item, - cache: Option<&Cache>, + cache: &Cache, + tcx: TyCtxt<'tcx>, ) -> Option { let (all_types, ret_types) = match *item.kind { - clean::FunctionItem(ref f) => (&f.all_types, &f.ret_types), - clean::MethodItem(ref m, _) => (&m.all_types, &m.ret_types), - clean::TyMethodItem(ref m) => (&m.all_types, &m.ret_types), + clean::FunctionItem(ref f) => get_all_types(&f.generics, &f.decl, tcx), + clean::MethodItem(ref m, _) => get_all_types(&m.generics, &m.decl, tcx), + clean::TyMethodItem(ref m) => get_all_types(&m.generics, &m.decl, tcx), _ => return None, }; @@ -190,9 +242,9 @@ crate fn get_index_search_type( Some(IndexItemFunctionType { inputs, output }) } -fn get_index_type(clean_type: &clean::Type, cache: &Option<&Cache>) -> RenderType { +fn get_index_type(clean_type: &clean::Type, cache: &Cache) -> RenderType { RenderType { - ty: cache.map_or_else(|| clean_type.def_id(), |cache| clean_type.def_id_full(cache)), + ty: clean_type.def_id_full(cache), idx: None, name: get_index_type_name(clean_type, true).map(|s| s.as_str().to_ascii_lowercase()), generics: get_generics(clean_type, cache), @@ -227,14 +279,14 @@ fn get_index_type_name(clean_type: &clean::Type, accept_generic: bool) -> Option } } -fn get_generics(clean_type: &clean::Type, cache: &Option<&Cache>) -> Option> { +fn get_generics(clean_type: &clean::Type, cache: &Cache) -> Option> { clean_type.generics().and_then(|types| { let r = types .iter() .filter_map(|t| { get_index_type_name(t, false).map(|name| Generic { name: name.as_str().to_ascii_lowercase(), - defid: cache.map_or_else(|| t.def_id(), |cache| t.def_id_full(cache)), + defid: t.def_id_full(cache), idx: None, }) }) @@ -242,3 +294,124 @@ fn get_generics(clean_type: &clean::Type, cache: &Option<&Cache>) -> Option` will return +/// `[Display, Option]` (we just returns the list of the types, we don't care about the +/// wrapped types in here). +crate fn get_real_types<'tcx>( + generics: &Generics, + arg: &Type, + tcx: TyCtxt<'tcx>, + recurse: i32, + res: &mut FxHashSet<(Type, TypeKind)>, +) -> usize { + fn insert(res: &mut FxHashSet<(Type, TypeKind)>, tcx: TyCtxt<'_>, ty: Type) -> usize { + if let Some(kind) = ty.def_id().map(|did| tcx.def_kind(did).into()) { + res.insert((ty, kind)); + 1 + } else if ty.is_primitive() { + // This is a primitive, let's store it as such. + res.insert((ty, TypeKind::Primitive)); + 1 + } else { + 0 + } + } + + if recurse >= 10 { + // FIXME: remove this whole recurse thing when the recursion bug is fixed + return 0; + } + let mut nb_added = 0; + + if let &Type::Generic(arg_s) = arg { + if let Some(where_pred) = generics.where_predicates.iter().find(|g| match g { + WherePredicate::BoundPredicate { ty, .. } => ty.def_id() == arg.def_id(), + _ => false, + }) { + let bounds = where_pred.get_bounds().unwrap_or_else(|| &[]); + for bound in bounds.iter() { + if let GenericBound::TraitBound(poly_trait, _) = bound { + for x in poly_trait.generic_params.iter() { + if !x.is_type() { + continue; + } + if let Some(ty) = x.get_type() { + let adds = get_real_types(generics, &ty, tcx, recurse + 1, res); + nb_added += adds; + if adds == 0 && !ty.is_full_generic() { + nb_added += insert(res, tcx, ty); + } + } + } + } + } + } + if let Some(bound) = generics.params.iter().find(|g| g.is_type() && g.name == arg_s) { + for bound in bound.get_bounds().unwrap_or(&[]) { + if let Some(ty) = bound.get_trait_type() { + let adds = get_real_types(generics, &ty, tcx, recurse + 1, res); + nb_added += adds; + if adds == 0 && !ty.is_full_generic() { + nb_added += insert(res, tcx, ty); + } + } + } + } + } else { + nb_added += insert(res, tcx, arg.clone()); + if let Some(gens) = arg.generics() { + for gen in gens.iter() { + if gen.is_full_generic() { + nb_added += get_real_types(generics, gen, tcx, recurse + 1, res); + } else { + nb_added += insert(res, tcx, (*gen).clone()); + } + } + } + } + nb_added +} + +/// Return the full list of types when bounds have been resolved. +/// +/// i.e. `fn foo>(x: u32, y: B)` will return +/// `[u32, Display, Option]`. +crate fn get_all_types<'tcx>( + generics: &Generics, + decl: &FnDecl, + tcx: TyCtxt<'tcx>, +) -> (Vec<(Type, TypeKind)>, Vec<(Type, TypeKind)>) { + let mut all_types = FxHashSet::default(); + for arg in decl.inputs.values.iter() { + if arg.type_.is_self_type() { + continue; + } + let mut args = FxHashSet::default(); + get_real_types(generics, &arg.type_, tcx, 0, &mut args); + if !args.is_empty() { + all_types.extend(args); + } else { + if let Some(kind) = arg.type_.def_id().map(|did| tcx.def_kind(did).into()) { + all_types.insert((arg.type_.clone(), kind)); + } + } + } + + let ret_types = match decl.output { + FnRetTy::Return(ref return_type) => { + let mut ret = FxHashSet::default(); + get_real_types(generics, &return_type, tcx, 0, &mut ret); + if ret.is_empty() { + if let Some(kind) = return_type.def_id().map(|did| tcx.def_kind(did).into()) { + ret.insert((return_type.clone(), kind)); + } + } + ret.into_iter().collect() + } + _ => Vec::new(), + }; + (all_types.into_iter().collect(), ret_types) +} diff --git a/src/librustdoc/html/render/context.rs b/src/librustdoc/html/render/context.rs new file mode 100644 index 0000000000..864fbccbcc --- /dev/null +++ b/src/librustdoc/html/render/context.rs @@ -0,0 +1,635 @@ +use std::cell::RefCell; +use std::collections::BTreeMap; +use std::io; +use std::path::PathBuf; +use std::rc::Rc; +use std::sync::mpsc::channel; + +use rustc_data_structures::fx::FxHashMap; +use rustc_hir::def_id::{DefId, LOCAL_CRATE}; +use rustc_middle::ty::TyCtxt; +use rustc_session::Session; +use rustc_span::edition::Edition; +use rustc_span::source_map::FileName; +use rustc_span::symbol::sym; + +use super::cache::{build_index, ExternalLocation}; +use super::print_item::{full_path, item_path, print_item}; +use super::write_shared::write_shared; +use super::{ + print_sidebar, settings, AllTypes, NameDoc, SharedContext, StylePath, BASIC_KEYWORDS, + CURRENT_DEPTH, INITIAL_IDS, +}; + +use crate::clean::{self, AttributesExt}; +use crate::config::RenderOptions; +use crate::docfs::{DocFS, PathError}; +use crate::error::Error; +use crate::formats::cache::Cache; +use crate::formats::item_type::ItemType; +use crate::formats::FormatRenderer; +use crate::html::escape::Escape; +use crate::html::format::Buffer; +use crate::html::markdown::{self, plain_text_summary, ErrorCodes, IdMap}; +use crate::html::{layout, sources}; + +/// Major driving force in all rustdoc rendering. This contains information +/// about where in the tree-like hierarchy rendering is occurring and controls +/// how the current page is being rendered. +/// +/// It is intended that this context is a lightweight object which can be fairly +/// easily cloned because it is cloned per work-job (about once per item in the +/// rustdoc tree). +crate struct Context<'tcx> { + /// Current hierarchy of components leading down to what's currently being + /// rendered + pub(super) current: Vec, + /// The current destination folder of where HTML artifacts should be placed. + /// This changes as the context descends into the module hierarchy. + pub(super) dst: PathBuf, + /// A flag, which when `true`, will render pages which redirect to the + /// real location of an item. This is used to allow external links to + /// publicly reused items to redirect to the right location. + pub(super) render_redirect_pages: bool, + /// The map used to ensure all generated 'id=' attributes are unique. + pub(super) id_map: RefCell, + /// Tracks section IDs for `Deref` targets so they match in both the main + /// body and the sidebar. + pub(super) deref_id_map: RefCell>, + /// Shared mutable state. + /// + /// Issue for improving the situation: [#82381][] + /// + /// [#82381]: https://github.com/rust-lang/rust/issues/82381 + pub(super) shared: Rc>, + /// The [`Cache`] used during rendering. + /// + /// Ideally the cache would be in [`SharedContext`], but it's mutated + /// between when the `SharedContext` is created and when `Context` + /// is created, so more refactoring would be needed. + /// + /// It's immutable once in `Context`, so it's not as bad that it's not in + /// `SharedContext`. + // FIXME: move `cache` to `SharedContext` + pub(super) cache: Rc, +} + +// `Context` is cloned a lot, so we don't want the size to grow unexpectedly. +#[cfg(target_arch = "x86_64")] +rustc_data_structures::static_assert_size!(Context<'_>, 152); + +impl<'tcx> Context<'tcx> { + pub(super) fn path(&self, filename: &str) -> PathBuf { + // We use splitn vs Path::extension here because we might get a filename + // like `style.min.css` and we want to process that into + // `style-suffix.min.css`. Path::extension would just return `css` + // which would result in `style.min-suffix.css` which isn't what we + // want. + let (base, ext) = filename.split_once('.').unwrap(); + let filename = format!("{}{}.{}", base, self.shared.resource_suffix, ext); + self.dst.join(&filename) + } + + pub(super) fn tcx(&self) -> TyCtxt<'tcx> { + self.shared.tcx + } + + fn sess(&self) -> &'tcx Session { + &self.shared.tcx.sess + } + + pub(super) fn derive_id(&self, id: String) -> String { + let mut map = self.id_map.borrow_mut(); + map.derive(id) + } + + /// String representation of how to get back to the root path of the 'doc/' + /// folder in terms of a relative URL. + pub(super) fn root_path(&self) -> String { + "../".repeat(self.current.len()) + } + + fn render_item(&self, it: &clean::Item, pushname: bool) -> String { + // A little unfortunate that this is done like this, but it sure + // does make formatting *a lot* nicer. + CURRENT_DEPTH.with(|slot| { + slot.set(self.current.len()); + }); + + let mut title = if it.is_primitive() || it.is_keyword() { + // No need to include the namespace for primitive types and keywords + String::new() + } else { + self.current.join("::") + }; + if pushname { + if !title.is_empty() { + title.push_str("::"); + } + title.push_str(&it.name.unwrap().as_str()); + } + title.push_str(" - Rust"); + let tyname = it.type_(); + let desc = it.doc_value().as_ref().map(|doc| plain_text_summary(&doc)); + let desc = if let Some(desc) = desc { + desc + } else if it.is_crate() { + format!("API documentation for the Rust `{}` crate.", self.shared.layout.krate) + } else { + format!( + "API documentation for the Rust `{}` {} in crate `{}`.", + it.name.as_ref().unwrap(), + tyname, + self.shared.layout.krate + ) + }; + let keywords = make_item_keywords(it); + let page = layout::Page { + css_class: tyname.as_str(), + root_path: &self.root_path(), + static_root_path: self.shared.static_root_path.as_deref(), + title: &title, + description: &desc, + keywords: &keywords, + resource_suffix: &self.shared.resource_suffix, + extra_scripts: &[], + static_extra_scripts: &[], + }; + + if !self.render_redirect_pages { + layout::render( + &self.shared.layout, + &page, + |buf: &mut _| print_sidebar(self, it, buf), + |buf: &mut _| print_item(self, it, buf), + &self.shared.style_files, + ) + } else { + if let Some(&(ref names, ty)) = self.cache.paths.get(&it.def_id) { + let mut path = String::new(); + for name in &names[..names.len() - 1] { + path.push_str(name); + path.push('/'); + } + path.push_str(&item_path(ty, names.last().unwrap())); + match self.shared.redirections { + Some(ref redirections) => { + let mut current_path = String::new(); + for name in &self.current { + current_path.push_str(name); + current_path.push('/'); + } + current_path.push_str(&item_path(ty, names.last().unwrap())); + redirections.borrow_mut().insert(current_path, path); + } + None => return layout::redirect(&format!("{}{}", self.root_path(), path)), + } + } + String::new() + } + } + + /// Construct a map of items shown in the sidebar to a plain-text summary of their docs. + fn build_sidebar_items(&self, m: &clean::Module) -> BTreeMap> { + // BTreeMap instead of HashMap to get a sorted output + let mut map: BTreeMap<_, Vec<_>> = BTreeMap::new(); + for item in &m.items { + if item.is_stripped() { + continue; + } + + let short = item.type_(); + let myname = match item.name { + None => continue, + Some(ref s) => s.to_string(), + }; + let short = short.to_string(); + map.entry(short).or_default().push(( + myname, + Some(item.doc_value().map_or_else(String::new, |s| plain_text_summary(&s))), + )); + } + + if self.shared.sort_modules_alphabetically { + for items in map.values_mut() { + items.sort(); + } + } + map + } + + /// Generates a url appropriate for an `href` attribute back to the source of + /// this item. + /// + /// The url generated, when clicked, will redirect the browser back to the + /// original source code. + /// + /// If `None` is returned, then a source link couldn't be generated. This + /// may happen, for example, with externally inlined items where the source + /// of their crate documentation isn't known. + pub(super) fn src_href(&self, item: &clean::Item) -> Option { + if item.source.is_dummy() { + return None; + } + let mut root = self.root_path(); + let mut path = String::new(); + let cnum = item.source.cnum(self.sess()); + + // We can safely ignore synthetic `SourceFile`s. + let file = match item.source.filename(self.sess()) { + FileName::Real(ref path) => path.local_path().to_path_buf(), + _ => return None, + }; + let file = &file; + + let symbol; + let (krate, path) = if cnum == LOCAL_CRATE { + if let Some(path) = self.shared.local_sources.get(file) { + (self.shared.layout.krate.as_str(), path) + } else { + return None; + } + } else { + let (krate, src_root) = match *self.cache.extern_locations.get(&cnum)? { + (name, ref src, ExternalLocation::Local) => (name, src), + (name, ref src, ExternalLocation::Remote(ref s)) => { + root = s.to_string(); + (name, src) + } + (_, _, ExternalLocation::Unknown) => return None, + }; + + sources::clean_path(&src_root, file, false, |component| { + path.push_str(&component.to_string_lossy()); + path.push('/'); + }); + let mut fname = file.file_name().expect("source has no filename").to_os_string(); + fname.push(".html"); + path.push_str(&fname.to_string_lossy()); + symbol = krate.as_str(); + (&*symbol, &path) + }; + + let loline = item.source.lo(self.sess()).line; + let hiline = item.source.hi(self.sess()).line; + let lines = + if loline == hiline { loline.to_string() } else { format!("{}-{}", loline, hiline) }; + Some(format!( + "{root}src/{krate}/{path}#{lines}", + root = Escape(&root), + krate = krate, + path = path, + lines = lines + )) + } +} + +/// Generates the documentation for `crate` into the directory `dst` +impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> { + fn descr() -> &'static str { + "html" + } + + fn init( + mut krate: clean::Crate, + options: RenderOptions, + edition: Edition, + mut cache: Cache, + tcx: TyCtxt<'tcx>, + ) -> Result<(Self, clean::Crate), Error> { + // need to save a copy of the options for rendering the index page + let md_opts = options.clone(); + let RenderOptions { + output, + external_html, + id_map, + playground_url, + sort_modules_alphabetically, + themes: style_files, + default_settings, + extension_css, + resource_suffix, + static_root_path, + generate_search_filter, + unstable_features, + generate_redirect_map, + .. + } = options; + + let src_root = match krate.src { + FileName::Real(ref p) => match p.local_path().parent() { + Some(p) => p.to_path_buf(), + None => PathBuf::new(), + }, + _ => PathBuf::new(), + }; + // If user passed in `--playground-url` arg, we fill in crate name here + let mut playground = None; + if let Some(url) = playground_url { + playground = + Some(markdown::Playground { crate_name: Some(krate.name.to_string()), url }); + } + let mut layout = layout::Layout { + logo: String::new(), + favicon: String::new(), + external_html, + default_settings, + krate: krate.name.to_string(), + css_file_extension: extension_css, + generate_search_filter, + }; + let mut issue_tracker_base_url = None; + let mut include_sources = true; + + // Crawl the crate attributes looking for attributes which control how we're + // going to emit HTML + if let Some(attrs) = krate.module.as_ref().map(|m| &m.attrs) { + for attr in attrs.lists(sym::doc) { + match (attr.name_or_empty(), attr.value_str()) { + (sym::html_favicon_url, Some(s)) => { + layout.favicon = s.to_string(); + } + (sym::html_logo_url, Some(s)) => { + layout.logo = s.to_string(); + } + (sym::html_playground_url, Some(s)) => { + playground = Some(markdown::Playground { + crate_name: Some(krate.name.to_string()), + url: s.to_string(), + }); + } + (sym::issue_tracker_base_url, Some(s)) => { + issue_tracker_base_url = Some(s.to_string()); + } + (sym::html_no_source, None) if attr.is_word() => { + include_sources = false; + } + _ => {} + } + } + } + let (sender, receiver) = channel(); + let mut scx = SharedContext { + tcx, + collapsed: krate.collapsed, + src_root, + include_sources, + local_sources: Default::default(), + issue_tracker_base_url, + layout, + created_dirs: Default::default(), + sort_modules_alphabetically, + style_files, + resource_suffix, + static_root_path, + fs: DocFS::new(sender), + edition, + codes: ErrorCodes::from(unstable_features.is_nightly_build()), + playground, + all: RefCell::new(AllTypes::new()), + errors: receiver, + redirections: if generate_redirect_map { Some(Default::default()) } else { None }, + }; + + // Add the default themes to the `Vec` of stylepaths + // + // Note that these must be added before `sources::render` is called + // so that the resulting source pages are styled + // + // `light.css` is not disabled because it is the stylesheet that stays loaded + // by the browser as the theme stylesheet. The theme system (hackily) works by + // changing the href to this stylesheet. All other themes are disabled to + // prevent rule conflicts + scx.style_files.push(StylePath { path: PathBuf::from("light.css"), disabled: false }); + scx.style_files.push(StylePath { path: PathBuf::from("dark.css"), disabled: true }); + scx.style_files.push(StylePath { path: PathBuf::from("ayu.css"), disabled: true }); + + let dst = output; + scx.ensure_dir(&dst)?; + krate = sources::render(&dst, &mut scx, krate)?; + + // Build our search index + let index = build_index(&krate, &mut cache, tcx); + + let mut cx = Context { + current: Vec::new(), + dst, + render_redirect_pages: false, + id_map: RefCell::new(id_map), + deref_id_map: RefCell::new(FxHashMap::default()), + shared: Rc::new(scx), + cache: Rc::new(cache), + }; + + CURRENT_DEPTH.with(|s| s.set(0)); + + // Write shared runs within a flock; disable thread dispatching of IO temporarily. + Rc::get_mut(&mut cx.shared).unwrap().fs.set_sync_only(true); + write_shared(&cx, &krate, index, &md_opts)?; + Rc::get_mut(&mut cx.shared).unwrap().fs.set_sync_only(false); + Ok((cx, krate)) + } + + fn make_child_renderer(&self) -> Self { + let mut id_map = IdMap::new(); + id_map.populate(&INITIAL_IDS); + + Self { + current: self.current.clone(), + dst: self.dst.clone(), + render_redirect_pages: self.render_redirect_pages, + id_map: RefCell::new(id_map), + deref_id_map: RefCell::new(FxHashMap::default()), + shared: Rc::clone(&self.shared), + cache: Rc::clone(&self.cache), + } + } + + fn after_krate( + &mut self, + krate: &clean::Crate, + diag: &rustc_errors::Handler, + ) -> Result<(), Error> { + let final_file = self.dst.join(&*krate.name.as_str()).join("all.html"); + let settings_file = self.dst.join("settings.html"); + let crate_name = krate.name; + + let mut root_path = self.dst.to_str().expect("invalid path").to_owned(); + if !root_path.ends_with('/') { + root_path.push('/'); + } + let mut page = layout::Page { + title: "List of all items in this crate", + css_class: "mod", + root_path: "../", + static_root_path: self.shared.static_root_path.as_deref(), + description: "List of all items in this crate", + keywords: BASIC_KEYWORDS, + resource_suffix: &self.shared.resource_suffix, + extra_scripts: &[], + static_extra_scripts: &[], + }; + let sidebar = if let Some(ref version) = self.cache.crate_version { + format!( + "

    Crate {}

    \ +
    \ +

    Version {}

    \ +
    \ +

    Back to index

    ", + crate_name, + Escape(version), + ) + } else { + String::new() + }; + let all = self.shared.all.replace(AllTypes::new()); + let v = layout::render( + &self.shared.layout, + &page, + sidebar, + |buf: &mut Buffer| all.print(buf), + &self.shared.style_files, + ); + self.shared.fs.write(&final_file, v.as_bytes())?; + + // Generating settings page. + page.title = "Rustdoc settings"; + page.description = "Settings of Rustdoc"; + page.root_path = "./"; + + let mut style_files = self.shared.style_files.clone(); + let sidebar = "

    Settings

    "; + style_files.push(StylePath { path: PathBuf::from("settings.css"), disabled: false }); + let v = layout::render( + &self.shared.layout, + &page, + sidebar, + settings( + self.shared.static_root_path.as_deref().unwrap_or("./"), + &self.shared.resource_suffix, + &self.shared.style_files, + )?, + &style_files, + ); + self.shared.fs.write(&settings_file, v.as_bytes())?; + if let Some(ref redirections) = self.shared.redirections { + if !redirections.borrow().is_empty() { + let redirect_map_path = + self.dst.join(&*krate.name.as_str()).join("redirect-map.json"); + let paths = serde_json::to_string(&*redirections.borrow()).unwrap(); + self.shared.ensure_dir(&self.dst.join(&*krate.name.as_str()))?; + self.shared.fs.write(&redirect_map_path, paths.as_bytes())?; + } + } + + // Flush pending errors. + Rc::get_mut(&mut self.shared).unwrap().fs.close(); + let nb_errors = self.shared.errors.iter().map(|err| diag.struct_err(&err).emit()).count(); + if nb_errors > 0 { + Err(Error::new(io::Error::new(io::ErrorKind::Other, "I/O error"), "")) + } else { + Ok(()) + } + } + + fn mod_item_in(&mut self, item: &clean::Item, item_name: &str) -> Result<(), Error> { + // Stripped modules survive the rustdoc passes (i.e., `strip-private`) + // if they contain impls for public types. These modules can also + // contain items such as publicly re-exported structures. + // + // External crates will provide links to these structures, so + // these modules are recursed into, but not rendered normally + // (a flag on the context). + if !self.render_redirect_pages { + self.render_redirect_pages = item.is_stripped(); + } + let scx = &self.shared; + self.dst.push(item_name); + self.current.push(item_name.to_owned()); + + info!("Recursing into {}", self.dst.display()); + + let buf = self.render_item(item, false); + // buf will be empty if the module is stripped and there is no redirect for it + if !buf.is_empty() { + self.shared.ensure_dir(&self.dst)?; + let joint_dst = self.dst.join("index.html"); + scx.fs.write(&joint_dst, buf.as_bytes())?; + } + + // Render sidebar-items.js used throughout this module. + if !self.render_redirect_pages { + let module = match *item.kind { + clean::StrippedItem(box clean::ModuleItem(ref m)) | clean::ModuleItem(ref m) => m, + _ => unreachable!(), + }; + let items = self.build_sidebar_items(module); + let js_dst = self.dst.join("sidebar-items.js"); + let v = format!("initSidebarItems({});", serde_json::to_string(&items).unwrap()); + scx.fs.write(&js_dst, &v)?; + } + Ok(()) + } + + fn mod_item_out(&mut self, _item_name: &str) -> Result<(), Error> { + info!("Recursed; leaving {}", self.dst.display()); + + // Go back to where we were at + self.dst.pop(); + self.current.pop(); + Ok(()) + } + + fn item(&mut self, item: clean::Item) -> Result<(), Error> { + // Stripped modules survive the rustdoc passes (i.e., `strip-private`) + // if they contain impls for public types. These modules can also + // contain items such as publicly re-exported structures. + // + // External crates will provide links to these structures, so + // these modules are recursed into, but not rendered normally + // (a flag on the context). + if !self.render_redirect_pages { + self.render_redirect_pages = item.is_stripped(); + } + + let buf = self.render_item(&item, true); + // buf will be empty if the item is stripped and there is no redirect for it + if !buf.is_empty() { + let name = item.name.as_ref().unwrap(); + let item_type = item.type_(); + let file_name = &item_path(item_type, &name.as_str()); + self.shared.ensure_dir(&self.dst)?; + let joint_dst = self.dst.join(file_name); + self.shared.fs.write(&joint_dst, buf.as_bytes())?; + + if !self.render_redirect_pages { + self.shared.all.borrow_mut().append(full_path(self, &item), &item_type); + } + // If the item is a macro, redirect from the old macro URL (with !) + // to the new one (without). + if item_type == ItemType::Macro { + let redir_name = format!("{}.{}!.html", item_type, name); + if let Some(ref redirections) = self.shared.redirections { + let crate_name = &self.shared.layout.krate; + redirections.borrow_mut().insert( + format!("{}/{}", crate_name, redir_name), + format!("{}/{}", crate_name, file_name), + ); + } else { + let v = layout::redirect(file_name); + let redir_dst = self.dst.join(redir_name); + self.shared.fs.write(&redir_dst, v.as_bytes())?; + } + } + } + Ok(()) + } + + fn cache(&self) -> &Cache { + &self.cache + } +} + +fn make_item_keywords(it: &clean::Item) -> String { + format!("{}, {}", BASIC_KEYWORDS, it.name.as_ref().unwrap()) +} diff --git a/src/librustdoc/html/render/mod.rs b/src/librustdoc/html/render/mod.rs index b38fb09a1c..66c47f1465 100644 --- a/src/librustdoc/html/render/mod.rs +++ b/src/librustdoc/html/render/mod.rs @@ -1,5 +1,3 @@ -// ignore-tidy-filelength - //! Rustdoc's HTML rendering module. //! //! This modules contains the bulk of the logic necessary for rendering a @@ -30,59 +28,50 @@ crate mod cache; #[cfg(test)] mod tests; +mod context; +mod print_item; +mod write_shared; + +crate use context::*; +crate use write_shared::FILES_UNVERSIONED; + use std::cell::{Cell, RefCell}; -use std::cmp::Ordering; -use std::collections::{BTreeMap, VecDeque}; +use std::collections::VecDeque; use std::default::Default; -use std::ffi::OsStr; -use std::fmt::{self, Write}; -use std::fs::{self, File}; -use std::io::prelude::*; -use std::io::{self, BufReader}; -use std::path::{Component, Path, PathBuf}; -use std::rc::Rc; +use std::fmt; +use std::path::{Path, PathBuf}; use std::str; use std::string::ToString; -use std::sync::mpsc::{channel, Receiver}; -use std::sync::Arc; +use std::sync::mpsc::Receiver; use itertools::Itertools; use rustc_ast_pretty::pprust; use rustc_attr::{Deprecation, StabilityLevel}; -use rustc_data_structures::flock; use rustc_data_structures::fx::{FxHashMap, FxHashSet}; use rustc_hir as hir; use rustc_hir::def::CtorKind; -use rustc_hir::def_id::{DefId, LOCAL_CRATE}; +use rustc_hir::def_id::DefId; use rustc_hir::Mutability; use rustc_middle::middle::stability; use rustc_middle::ty::TyCtxt; -use rustc_session::Session; use rustc_span::edition::Edition; -use rustc_span::hygiene::MacroKind; -use rustc_span::source_map::FileName; use rustc_span::symbol::{kw, sym, Symbol}; use serde::ser::SerializeSeq; use serde::{Serialize, Serializer}; -use crate::clean::{self, AttributesExt, GetDefId, RenderedLink, SelfTy, TypeKind}; -use crate::config::{RenderInfo, RenderOptions}; +use crate::clean::{self, GetDefId, RenderedLink, SelfTy, TypeKind}; use crate::docfs::{DocFS, PathError}; use crate::error::Error; use crate::formats::cache::Cache; use crate::formats::item_type::ItemType; use crate::formats::{AssocItemRender, FormatRenderer, Impl, RenderMode}; use crate::html::escape::Escape; -use crate::html::format::fmt_impl_for_trait_page; -use crate::html::format::Function; -use crate::html::format::{href, print_default_space, print_generic_bounds, WhereClause}; -use crate::html::format::{print_abi_with_space, Buffer, PrintWithSpace}; -use crate::html::markdown::{ - self, plain_text_summary, ErrorCodes, IdMap, Markdown, MarkdownHtml, MarkdownSummaryLine, +use crate::html::format::{ + href, print_abi_with_space, print_default_space, print_generic_bounds, Buffer, Function, + PrintWithSpace, WhereClause, }; -use crate::html::sources; -use crate::html::{highlight, layout, static_files}; -use cache::{build_index, ExternalLocation}; +use crate::html::layout; +use crate::html::markdown::{self, ErrorCodes, Markdown, MarkdownHtml, MarkdownSummaryLine}; /// A pair of name and its optional document. crate type NameDoc = (String, Option); @@ -93,38 +82,7 @@ crate fn ensure_trailing_slash(v: &str) -> impl fmt::Display + '_ { }) } -/// Major driving force in all rustdoc rendering. This contains information -/// about where in the tree-like hierarchy rendering is occurring and controls -/// how the current page is being rendered. -/// -/// It is intended that this context is a lightweight object which can be fairly -/// easily cloned because it is cloned per work-job (about once per item in the -/// rustdoc tree). -#[derive(Clone)] -crate struct Context<'tcx> { - /// Current hierarchy of components leading down to what's currently being - /// rendered - crate current: Vec, - /// The current destination folder of where HTML artifacts should be placed. - /// This changes as the context descends into the module hierarchy. - crate dst: PathBuf, - /// A flag, which when `true`, will render pages which redirect to the - /// real location of an item. This is used to allow external links to - /// publicly reused items to redirect to the right location. - crate render_redirect_pages: bool, - /// The map used to ensure all generated 'id=' attributes are unique. - id_map: Rc>, - /// Tracks section IDs for `Deref` targets so they match in both the main - /// body and the sidebar. - deref_id_map: Rc>>, - crate shared: Arc>, - all: Rc>, - /// Storage for the errors produced while generating documentation so they - /// can be printed together at the end. - crate errors: Rc>, - crate cache: Rc, -} - +/// Shared mutable state used in [`Context`] and elsewhere. crate struct SharedContext<'tcx> { crate tcx: TyCtxt<'tcx>, /// The path to the crate root source minus the file name. @@ -140,16 +98,16 @@ crate struct SharedContext<'tcx> { /// The local file sources we've emitted and their respective url-paths. crate local_sources: FxHashMap, /// Whether the collapsed pass ran - crate collapsed: bool, + collapsed: bool, /// The base-URL of the issue tracker for when an item has been tagged with /// an issue number. - crate issue_tracker_base_url: Option, + issue_tracker_base_url: Option, /// The directories that have already been created in this doc run. Used to reduce the number /// of spurious `create_dir_all` calls. - crate created_dirs: RefCell>, + created_dirs: RefCell>, /// This flag indicates whether listings of modules (in the side bar and documentation itself) /// should be ordered alphabetically or in order of appearance (in the source code). - crate sort_modules_alphabetically: bool, + sort_modules_alphabetically: bool, /// Additional CSS files to be added to the generated docs. crate style_files: Vec, /// Suffix to be added on resource files (if suffix is "-v2" then "light.css" becomes @@ -162,29 +120,16 @@ crate struct SharedContext<'tcx> { crate fs: DocFS, /// The default edition used to parse doctests. crate edition: Edition, - crate codes: ErrorCodes, + codes: ErrorCodes, playground: Option, -} - -impl<'tcx> Context<'tcx> { - fn path(&self, filename: &str) -> PathBuf { - // We use splitn vs Path::extension here because we might get a filename - // like `style.min.css` and we want to process that into - // `style-suffix.min.css`. Path::extension would just return `css` - // which would result in `style.min-suffix.css` which isn't what we - // want. - let (base, ext) = filename.split_once('.').unwrap(); - let filename = format!("{}{}.{}", base, self.shared.resource_suffix, ext); - self.dst.join(&filename) - } - - fn tcx(&self) -> TyCtxt<'tcx> { - self.shared.tcx - } - - fn sess(&self) -> &Session { - &self.shared.tcx.sess - } + all: RefCell, + /// Storage for the errors produced while generating documentation so they + /// can be printed together at the end. + errors: Receiver, + /// `None` by default, depends on the `generate-redirect-map` option flag. If this field is set + /// to `Some(...)`, it'll store redirections and then generate a JSON file at the top level of + /// the crate. + redirections: Option>>, } impl SharedContext<'_> { @@ -221,23 +166,6 @@ crate struct IndexItem { crate search_type: Option, } -impl Serialize for IndexItem { - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - assert_eq!( - self.parent.is_some(), - self.parent_idx.is_some(), - "`{}` is missing idx", - self.name - ); - - (self.ty, &self.name, &self.path, &self.desc, self.parent_idx, &self.search_type) - .serialize(serializer) - } -} - /// A type used for the search index. #[derive(Debug)] crate struct RenderType { @@ -341,11 +269,7 @@ impl Serialize for TypeWithKind { where S: Serializer, { - let mut seq = serializer.serialize_seq(None)?; - seq.serialize_element(&self.ty.name)?; - let x: ItemType = self.kind.into(); - seq.serialize_element(&x)?; - seq.end() + (&self.ty.name, ItemType::from(self.kind)).serialize(serializer) } } @@ -377,837 +301,6 @@ crate const INITIAL_IDS: [&'static str; 15] = [ "implementations", ]; -/// Generates the documentation for `crate` into the directory `dst` -impl<'tcx> FormatRenderer<'tcx> for Context<'tcx> { - fn descr() -> &'static str { - "html" - } - - fn init( - mut krate: clean::Crate, - options: RenderOptions, - _render_info: RenderInfo, - edition: Edition, - mut cache: Cache, - tcx: TyCtxt<'tcx>, - ) -> Result<(Self, clean::Crate), Error> { - // need to save a copy of the options for rendering the index page - let md_opts = options.clone(); - let RenderOptions { - output, - external_html, - id_map, - playground_url, - sort_modules_alphabetically, - themes: style_files, - default_settings, - extension_css, - resource_suffix, - static_root_path, - generate_search_filter, - unstable_features, - .. - } = options; - - let src_root = match krate.src { - FileName::Real(ref p) => match p.local_path().parent() { - Some(p) => p.to_path_buf(), - None => PathBuf::new(), - }, - _ => PathBuf::new(), - }; - // If user passed in `--playground-url` arg, we fill in crate name here - let mut playground = None; - if let Some(url) = playground_url { - playground = - Some(markdown::Playground { crate_name: Some(krate.name.to_string()), url }); - } - let mut layout = layout::Layout { - logo: String::new(), - favicon: String::new(), - external_html, - default_settings, - krate: krate.name.to_string(), - css_file_extension: extension_css, - generate_search_filter, - }; - let mut issue_tracker_base_url = None; - let mut include_sources = true; - - // Crawl the crate attributes looking for attributes which control how we're - // going to emit HTML - if let Some(attrs) = krate.module.as_ref().map(|m| &m.attrs) { - for attr in attrs.lists(sym::doc) { - match (attr.name_or_empty(), attr.value_str()) { - (sym::html_favicon_url, Some(s)) => { - layout.favicon = s.to_string(); - } - (sym::html_logo_url, Some(s)) => { - layout.logo = s.to_string(); - } - (sym::html_playground_url, Some(s)) => { - playground = Some(markdown::Playground { - crate_name: Some(krate.name.to_string()), - url: s.to_string(), - }); - } - (sym::issue_tracker_base_url, Some(s)) => { - issue_tracker_base_url = Some(s.to_string()); - } - (sym::html_no_source, None) if attr.is_word() => { - include_sources = false; - } - _ => {} - } - } - } - let (sender, receiver) = channel(); - let mut scx = SharedContext { - tcx, - collapsed: krate.collapsed, - src_root, - include_sources, - local_sources: Default::default(), - issue_tracker_base_url, - layout, - created_dirs: Default::default(), - sort_modules_alphabetically, - style_files, - resource_suffix, - static_root_path, - fs: DocFS::new(sender), - edition, - codes: ErrorCodes::from(unstable_features.is_nightly_build()), - playground, - }; - - // Add the default themes to the `Vec` of stylepaths - // - // Note that these must be added before `sources::render` is called - // so that the resulting source pages are styled - // - // `light.css` is not disabled because it is the stylesheet that stays loaded - // by the browser as the theme stylesheet. The theme system (hackily) works by - // changing the href to this stylesheet. All other themes are disabled to - // prevent rule conflicts - scx.style_files.push(StylePath { path: PathBuf::from("light.css"), disabled: false }); - scx.style_files.push(StylePath { path: PathBuf::from("dark.css"), disabled: true }); - scx.style_files.push(StylePath { path: PathBuf::from("ayu.css"), disabled: true }); - - let dst = output; - scx.ensure_dir(&dst)?; - krate = sources::render(&dst, &mut scx, krate)?; - - // Build our search index - let index = build_index(&krate, &mut cache); - - let mut cx = Context { - current: Vec::new(), - dst, - render_redirect_pages: false, - id_map: Rc::new(RefCell::new(id_map)), - deref_id_map: Rc::new(RefCell::new(FxHashMap::default())), - shared: Arc::new(scx), - all: Rc::new(RefCell::new(AllTypes::new())), - errors: Rc::new(receiver), - cache: Rc::new(cache), - }; - - CURRENT_DEPTH.with(|s| s.set(0)); - - // Write shared runs within a flock; disable thread dispatching of IO temporarily. - Arc::get_mut(&mut cx.shared).unwrap().fs.set_sync_only(true); - write_shared(&cx, &krate, index, &md_opts)?; - Arc::get_mut(&mut cx.shared).unwrap().fs.set_sync_only(false); - Ok((cx, krate)) - } - - fn after_krate( - &mut self, - krate: &clean::Crate, - diag: &rustc_errors::Handler, - ) -> Result<(), Error> { - let final_file = self.dst.join(&*krate.name.as_str()).join("all.html"); - let settings_file = self.dst.join("settings.html"); - let crate_name = krate.name; - - let mut root_path = self.dst.to_str().expect("invalid path").to_owned(); - if !root_path.ends_with('/') { - root_path.push('/'); - } - let mut page = layout::Page { - title: "List of all items in this crate", - css_class: "mod", - root_path: "../", - static_root_path: self.shared.static_root_path.as_deref(), - description: "List of all items in this crate", - keywords: BASIC_KEYWORDS, - resource_suffix: &self.shared.resource_suffix, - extra_scripts: &[], - static_extra_scripts: &[], - }; - let sidebar = if let Some(ref version) = self.cache.crate_version { - format!( - "

    Crate {}

    \ -
    \ -

    Version {}

    \ -
    \ -

    Back to index

    ", - crate_name, - Escape(version), - ) - } else { - String::new() - }; - let all = self.all.replace(AllTypes::new()); - let v = layout::render( - &self.shared.layout, - &page, - sidebar, - |buf: &mut Buffer| all.print(buf), - &self.shared.style_files, - ); - self.shared.fs.write(&final_file, v.as_bytes())?; - - // Generating settings page. - page.title = "Rustdoc settings"; - page.description = "Settings of Rustdoc"; - page.root_path = "./"; - - let mut style_files = self.shared.style_files.clone(); - let sidebar = "

    Settings

    "; - style_files.push(StylePath { path: PathBuf::from("settings.css"), disabled: false }); - let v = layout::render( - &self.shared.layout, - &page, - sidebar, - settings( - self.shared.static_root_path.as_deref().unwrap_or("./"), - &self.shared.resource_suffix, - &self.shared.style_files, - )?, - &style_files, - ); - self.shared.fs.write(&settings_file, v.as_bytes())?; - - // Flush pending errors. - Arc::get_mut(&mut self.shared).unwrap().fs.close(); - let nb_errors = self.errors.iter().map(|err| diag.struct_err(&err).emit()).count(); - if nb_errors > 0 { - Err(Error::new(io::Error::new(io::ErrorKind::Other, "I/O error"), "")) - } else { - Ok(()) - } - } - - fn mod_item_in(&mut self, item: &clean::Item, item_name: &str) -> Result<(), Error> { - // Stripped modules survive the rustdoc passes (i.e., `strip-private`) - // if they contain impls for public types. These modules can also - // contain items such as publicly re-exported structures. - // - // External crates will provide links to these structures, so - // these modules are recursed into, but not rendered normally - // (a flag on the context). - if !self.render_redirect_pages { - self.render_redirect_pages = item.is_stripped(); - } - let scx = &self.shared; - self.dst.push(item_name); - self.current.push(item_name.to_owned()); - - info!("Recursing into {}", self.dst.display()); - - let buf = self.render_item(item, false); - // buf will be empty if the module is stripped and there is no redirect for it - if !buf.is_empty() { - self.shared.ensure_dir(&self.dst)?; - let joint_dst = self.dst.join("index.html"); - scx.fs.write(&joint_dst, buf.as_bytes())?; - } - - // Render sidebar-items.js used throughout this module. - if !self.render_redirect_pages { - let module = match *item.kind { - clean::StrippedItem(box clean::ModuleItem(ref m)) | clean::ModuleItem(ref m) => m, - _ => unreachable!(), - }; - let items = self.build_sidebar_items(module); - let js_dst = self.dst.join("sidebar-items.js"); - let v = format!("initSidebarItems({});", serde_json::to_string(&items).unwrap()); - scx.fs.write(&js_dst, &v)?; - } - Ok(()) - } - - fn mod_item_out(&mut self, _item_name: &str) -> Result<(), Error> { - info!("Recursed; leaving {}", self.dst.display()); - - // Go back to where we were at - self.dst.pop(); - self.current.pop(); - Ok(()) - } - - fn item(&mut self, item: clean::Item) -> Result<(), Error> { - // Stripped modules survive the rustdoc passes (i.e., `strip-private`) - // if they contain impls for public types. These modules can also - // contain items such as publicly re-exported structures. - // - // External crates will provide links to these structures, so - // these modules are recursed into, but not rendered normally - // (a flag on the context). - if !self.render_redirect_pages { - self.render_redirect_pages = item.is_stripped(); - } - - let buf = self.render_item(&item, true); - // buf will be empty if the item is stripped and there is no redirect for it - if !buf.is_empty() { - let name = item.name.as_ref().unwrap(); - let item_type = item.type_(); - let file_name = &item_path(item_type, &name.as_str()); - self.shared.ensure_dir(&self.dst)?; - let joint_dst = self.dst.join(file_name); - self.shared.fs.write(&joint_dst, buf.as_bytes())?; - - if !self.render_redirect_pages { - self.all.borrow_mut().append(full_path(self, &item), &item_type); - } - // If the item is a macro, redirect from the old macro URL (with !) - // to the new one (without). - if item_type == ItemType::Macro { - let redir_name = format!("{}.{}!.html", item_type, name); - let redir_dst = self.dst.join(redir_name); - let v = layout::redirect(file_name); - self.shared.fs.write(&redir_dst, v.as_bytes())?; - } - } - Ok(()) - } - - fn cache(&self) -> &Cache { - &self.cache - } -} - -fn write_shared( - cx: &Context<'_>, - krate: &clean::Crate, - search_index: String, - options: &RenderOptions, -) -> Result<(), Error> { - // Write out the shared files. Note that these are shared among all rustdoc - // docs placed in the output directory, so this needs to be a synchronized - // operation with respect to all other rustdocs running around. - let lock_file = cx.dst.join(".lock"); - let _lock = try_err!(flock::Lock::new(&lock_file, true, true, true), &lock_file); - - // Add all the static files. These may already exist, but we just - // overwrite them anyway to make sure that they're fresh and up-to-date. - - write_minify( - &cx.shared.fs, - cx.path("rustdoc.css"), - static_files::RUSTDOC_CSS, - options.enable_minification, - )?; - write_minify( - &cx.shared.fs, - cx.path("settings.css"), - static_files::SETTINGS_CSS, - options.enable_minification, - )?; - write_minify( - &cx.shared.fs, - cx.path("noscript.css"), - static_files::NOSCRIPT_CSS, - options.enable_minification, - )?; - - // To avoid "light.css" to be overwritten, we'll first run over the received themes and only - // then we'll run over the "official" styles. - let mut themes: FxHashSet = FxHashSet::default(); - - for entry in &cx.shared.style_files { - let theme = try_none!(try_none!(entry.path.file_stem(), &entry.path).to_str(), &entry.path); - let extension = - try_none!(try_none!(entry.path.extension(), &entry.path).to_str(), &entry.path); - - // Handle the official themes - match theme { - "light" => write_minify( - &cx.shared.fs, - cx.path("light.css"), - static_files::themes::LIGHT, - options.enable_minification, - )?, - "dark" => write_minify( - &cx.shared.fs, - cx.path("dark.css"), - static_files::themes::DARK, - options.enable_minification, - )?, - "ayu" => write_minify( - &cx.shared.fs, - cx.path("ayu.css"), - static_files::themes::AYU, - options.enable_minification, - )?, - _ => { - // Handle added third-party themes - let content = try_err!(fs::read(&entry.path), &entry.path); - cx.shared - .fs - .write(cx.path(&format!("{}.{}", theme, extension)), content.as_slice())?; - } - }; - - themes.insert(theme.to_owned()); - } - - let write = |p, c| cx.shared.fs.write(p, c); - if (*cx.shared).layout.logo.is_empty() { - write(cx.path("rust-logo.png"), static_files::RUST_LOGO)?; - } - if (*cx.shared).layout.favicon.is_empty() { - write(cx.path("favicon.svg"), static_files::RUST_FAVICON_SVG)?; - write(cx.path("favicon-16x16.png"), static_files::RUST_FAVICON_PNG_16)?; - write(cx.path("favicon-32x32.png"), static_files::RUST_FAVICON_PNG_32)?; - } - write(cx.path("brush.svg"), static_files::BRUSH_SVG)?; - write(cx.path("wheel.svg"), static_files::WHEEL_SVG)?; - write(cx.path("down-arrow.svg"), static_files::DOWN_ARROW_SVG)?; - - let mut themes: Vec<&String> = themes.iter().collect(); - themes.sort(); - // To avoid theme switch latencies as much as possible, we put everything theme related - // at the beginning of the html files into another js file. - let theme_js = format!( - r#"var themes = document.getElementById("theme-choices"); -var themePicker = document.getElementById("theme-picker"); - -function showThemeButtonState() {{ - themes.style.display = "block"; - themePicker.style.borderBottomRightRadius = "0"; - themePicker.style.borderBottomLeftRadius = "0"; -}} - -function hideThemeButtonState() {{ - themes.style.display = "none"; - themePicker.style.borderBottomRightRadius = "3px"; - themePicker.style.borderBottomLeftRadius = "3px"; -}} - -function switchThemeButtonState() {{ - if (themes.style.display === "block") {{ - hideThemeButtonState(); - }} else {{ - showThemeButtonState(); - }} -}}; - -function handleThemeButtonsBlur(e) {{ - var active = document.activeElement; - var related = e.relatedTarget; - - if (active.id !== "theme-picker" && - (!active.parentNode || active.parentNode.id !== "theme-choices") && - (!related || - (related.id !== "theme-picker" && - (!related.parentNode || related.parentNode.id !== "theme-choices")))) {{ - hideThemeButtonState(); - }} -}} - -themePicker.onclick = switchThemeButtonState; -themePicker.onblur = handleThemeButtonsBlur; -{}.forEach(function(item) {{ - var but = document.createElement("button"); - but.textContent = item; - but.onclick = function(el) {{ - switchTheme(currentTheme, mainTheme, item, true); - useSystemTheme(false); - }}; - but.onblur = handleThemeButtonsBlur; - themes.appendChild(but); -}});"#, - serde_json::to_string(&themes).unwrap() - ); - - write_minify(&cx.shared.fs, cx.path("theme.js"), &theme_js, options.enable_minification)?; - write_minify( - &cx.shared.fs, - cx.path("main.js"), - static_files::MAIN_JS, - options.enable_minification, - )?; - write_minify( - &cx.shared.fs, - cx.path("settings.js"), - static_files::SETTINGS_JS, - options.enable_minification, - )?; - if cx.shared.include_sources { - write_minify( - &cx.shared.fs, - cx.path("source-script.js"), - static_files::sidebar::SOURCE_SCRIPT, - options.enable_minification, - )?; - } - - { - write_minify( - &cx.shared.fs, - cx.path("storage.js"), - &format!( - "var resourcesSuffix = \"{}\";{}", - cx.shared.resource_suffix, - static_files::STORAGE_JS - ), - options.enable_minification, - )?; - } - - if let Some(ref css) = cx.shared.layout.css_file_extension { - let out = cx.path("theme.css"); - let buffer = try_err!(fs::read_to_string(css), css); - if !options.enable_minification { - cx.shared.fs.write(&out, &buffer)?; - } else { - write_minify(&cx.shared.fs, out, &buffer, options.enable_minification)?; - } - } - write_minify( - &cx.shared.fs, - cx.path("normalize.css"), - static_files::NORMALIZE_CSS, - options.enable_minification, - )?; - write(cx.dst.join("FiraSans-Regular.woff"), static_files::fira_sans::REGULAR)?; - write(cx.dst.join("FiraSans-Medium.woff"), static_files::fira_sans::MEDIUM)?; - write(cx.dst.join("FiraSans-LICENSE.txt"), static_files::fira_sans::LICENSE)?; - write(cx.dst.join("SourceSerifPro-Regular.ttf.woff"), static_files::source_serif_pro::REGULAR)?; - write(cx.dst.join("SourceSerifPro-Bold.ttf.woff"), static_files::source_serif_pro::BOLD)?; - write(cx.dst.join("SourceSerifPro-It.ttf.woff"), static_files::source_serif_pro::ITALIC)?; - write(cx.dst.join("SourceSerifPro-LICENSE.md"), static_files::source_serif_pro::LICENSE)?; - write(cx.dst.join("SourceCodePro-Regular.woff"), static_files::source_code_pro::REGULAR)?; - write(cx.dst.join("SourceCodePro-Semibold.woff"), static_files::source_code_pro::SEMIBOLD)?; - write(cx.dst.join("SourceCodePro-LICENSE.txt"), static_files::source_code_pro::LICENSE)?; - write(cx.dst.join("LICENSE-MIT.txt"), static_files::LICENSE_MIT)?; - write(cx.dst.join("LICENSE-APACHE.txt"), static_files::LICENSE_APACHE)?; - write(cx.dst.join("COPYRIGHT.txt"), static_files::COPYRIGHT)?; - - fn collect(path: &Path, krate: &str, key: &str) -> io::Result<(Vec, Vec)> { - let mut ret = Vec::new(); - let mut krates = Vec::new(); - - if path.exists() { - let prefix = format!(r#"{}["{}"]"#, key, krate); - for line in BufReader::new(File::open(path)?).lines() { - let line = line?; - if !line.starts_with(key) { - continue; - } - if line.starts_with(&prefix) { - continue; - } - ret.push(line.to_string()); - krates.push( - line[key.len() + 2..] - .split('"') - .next() - .map(|s| s.to_owned()) - .unwrap_or_else(String::new), - ); - } - } - Ok((ret, krates)) - } - - fn collect_json(path: &Path, krate: &str) -> io::Result<(Vec, Vec)> { - let mut ret = Vec::new(); - let mut krates = Vec::new(); - - if path.exists() { - let prefix = format!("\"{}\"", krate); - for line in BufReader::new(File::open(path)?).lines() { - let line = line?; - if !line.starts_with('"') { - continue; - } - if line.starts_with(&prefix) { - continue; - } - if line.ends_with(",\\") { - ret.push(line[..line.len() - 2].to_string()); - } else { - // Ends with "\\" (it's the case for the last added crate line) - ret.push(line[..line.len() - 1].to_string()); - } - krates.push( - line.split('"') - .find(|s| !s.is_empty()) - .map(|s| s.to_owned()) - .unwrap_or_else(String::new), - ); - } - } - Ok((ret, krates)) - } - - use std::ffi::OsString; - - #[derive(Debug)] - struct Hierarchy { - elem: OsString, - children: FxHashMap, - elems: FxHashSet, - } - - impl Hierarchy { - fn new(elem: OsString) -> Hierarchy { - Hierarchy { elem, children: FxHashMap::default(), elems: FxHashSet::default() } - } - - fn to_json_string(&self) -> String { - let mut subs: Vec<&Hierarchy> = self.children.values().collect(); - subs.sort_unstable_by(|a, b| a.elem.cmp(&b.elem)); - let mut files = self - .elems - .iter() - .map(|s| format!("\"{}\"", s.to_str().expect("invalid osstring conversion"))) - .collect::>(); - files.sort_unstable(); - let subs = subs.iter().map(|s| s.to_json_string()).collect::>().join(","); - let dirs = - if subs.is_empty() { String::new() } else { format!(",\"dirs\":[{}]", subs) }; - let files = files.join(","); - let files = - if files.is_empty() { String::new() } else { format!(",\"files\":[{}]", files) }; - format!( - "{{\"name\":\"{name}\"{dirs}{files}}}", - name = self.elem.to_str().expect("invalid osstring conversion"), - dirs = dirs, - files = files - ) - } - } - - if cx.shared.include_sources { - let mut hierarchy = Hierarchy::new(OsString::new()); - for source in cx - .shared - .local_sources - .iter() - .filter_map(|p| p.0.strip_prefix(&cx.shared.src_root).ok()) - { - let mut h = &mut hierarchy; - let mut elems = source - .components() - .filter_map(|s| match s { - Component::Normal(s) => Some(s.to_owned()), - _ => None, - }) - .peekable(); - loop { - let cur_elem = elems.next().expect("empty file path"); - if elems.peek().is_none() { - h.elems.insert(cur_elem); - break; - } else { - let e = cur_elem.clone(); - h = h.children.entry(cur_elem.clone()).or_insert_with(|| Hierarchy::new(e)); - } - } - } - - let dst = cx.dst.join(&format!("source-files{}.js", cx.shared.resource_suffix)); - let (mut all_sources, _krates) = - try_err!(collect(&dst, &krate.name.as_str(), "sourcesIndex"), &dst); - all_sources.push(format!( - "sourcesIndex[\"{}\"] = {};", - &krate.name, - hierarchy.to_json_string() - )); - all_sources.sort(); - let v = format!( - "var N = null;var sourcesIndex = {{}};\n{}\ncreateSourceSidebar();\n", - all_sources.join("\n") - ); - cx.shared.fs.write(&dst, v.as_bytes())?; - } - - // Update the search index - let dst = cx.dst.join(&format!("search-index{}.js", cx.shared.resource_suffix)); - let (mut all_indexes, mut krates) = try_err!(collect_json(&dst, &krate.name.as_str()), &dst); - all_indexes.push(search_index); - - // Sort the indexes by crate so the file will be generated identically even - // with rustdoc running in parallel. - all_indexes.sort(); - { - let mut v = String::from("var searchIndex = JSON.parse('{\\\n"); - v.push_str(&all_indexes.join(",\\\n")); - // "addSearchOptions" has to be called first so the crate filtering can be set before the - // search might start (if it's set into the URL for example). - v.push_str("\\\n}');\naddSearchOptions(searchIndex);initSearch(searchIndex);"); - cx.shared.fs.write(&dst, &v)?; - } - if options.enable_index_page { - if let Some(index_page) = options.index_page.clone() { - let mut md_opts = options.clone(); - md_opts.output = cx.dst.clone(); - md_opts.external_html = (*cx.shared).layout.external_html.clone(); - - crate::markdown::render(&index_page, md_opts, cx.shared.edition) - .map_err(|e| Error::new(e, &index_page))?; - } else { - let dst = cx.dst.join("index.html"); - let page = layout::Page { - title: "Index of crates", - css_class: "mod", - root_path: "./", - static_root_path: cx.shared.static_root_path.as_deref(), - description: "List of crates", - keywords: BASIC_KEYWORDS, - resource_suffix: &cx.shared.resource_suffix, - extra_scripts: &[], - static_extra_scripts: &[], - }; - krates.push(krate.name.to_string()); - krates.sort(); - krates.dedup(); - - let content = format!( - "

    \ - List of all crates\ -

      {}
    ", - krates - .iter() - .map(|s| { - format!( - "
  • {}
  • ", - ensure_trailing_slash(s), - s - ) - }) - .collect::() - ); - let v = layout::render(&cx.shared.layout, &page, "", content, &cx.shared.style_files); - cx.shared.fs.write(&dst, v.as_bytes())?; - } - } - - // Update the list of all implementors for traits - let dst = cx.dst.join("implementors"); - for (&did, imps) in &cx.cache.implementors { - // Private modules can leak through to this phase of rustdoc, which - // could contain implementations for otherwise private types. In some - // rare cases we could find an implementation for an item which wasn't - // indexed, so we just skip this step in that case. - // - // FIXME: this is a vague explanation for why this can't be a `get`, in - // theory it should be... - let &(ref remote_path, remote_item_type) = match cx.cache.paths.get(&did) { - Some(p) => p, - None => match cx.cache.external_paths.get(&did) { - Some(p) => p, - None => continue, - }, - }; - - #[derive(Serialize)] - struct Implementor { - text: String, - synthetic: bool, - types: Vec, - } - - let implementors = imps - .iter() - .filter_map(|imp| { - // If the trait and implementation are in the same crate, then - // there's no need to emit information about it (there's inlining - // going on). If they're in different crates then the crate defining - // the trait will be interested in our implementation. - // - // If the implementation is from another crate then that crate - // should add it. - if imp.impl_item.def_id.krate == did.krate || !imp.impl_item.def_id.is_local() { - None - } else { - Some(Implementor { - text: imp.inner_impl().print(cx.cache()).to_string(), - synthetic: imp.inner_impl().synthetic, - types: collect_paths_for_type(imp.inner_impl().for_.clone(), cx.cache()), - }) - } - }) - .collect::>(); - - // Only create a js file if we have impls to add to it. If the trait is - // documented locally though we always create the file to avoid dead - // links. - if implementors.is_empty() && !cx.cache.paths.contains_key(&did) { - continue; - } - - let implementors = format!( - r#"implementors["{}"] = {};"#, - krate.name, - serde_json::to_string(&implementors).unwrap() - ); - - let mut mydst = dst.clone(); - for part in &remote_path[..remote_path.len() - 1] { - mydst.push(part); - } - cx.shared.ensure_dir(&mydst)?; - mydst.push(&format!("{}.{}.js", remote_item_type, remote_path[remote_path.len() - 1])); - - let (mut all_implementors, _) = - try_err!(collect(&mydst, &krate.name.as_str(), "implementors"), &mydst); - all_implementors.push(implementors); - // Sort the implementors by crate so the file will be generated - // identically even with rustdoc running in parallel. - all_implementors.sort(); - - let mut v = String::from("(function() {var implementors = {};\n"); - for implementor in &all_implementors { - writeln!(v, "{}", *implementor).unwrap(); - } - v.push_str( - "if (window.register_implementors) {\ - window.register_implementors(implementors);\ - } else {\ - window.pending_implementors = implementors;\ - }", - ); - v.push_str("})()"); - cx.shared.fs.write(&mydst, &v)?; - } - Ok(()) -} - -fn write_minify( - fs: &DocFS, - dst: PathBuf, - contents: &str, - enable_minification: bool, -) -> Result<(), Error> { - if enable_minification { - if dst.extension() == Some(&OsStr::new("css")) { - let res = try_none!(minifier::css::minify(contents).ok(), &dst); - fs.write(dst, res.as_bytes()) - } else { - fs.write(dst, minifier::js::minify(contents).as_bytes()) - } - } else { - fs.write(dst, contents.as_bytes()) - } -} - fn write_srclink(cx: &Context<'_>, item: &clean::Item, buf: &mut Buffer) { if let Some(l) = cx.src_href(item) { write!(buf, "[src]", l) @@ -1515,374 +608,68 @@ fn settings(root_path: &str, suffix: &str, themes: &[StylePath]) -> Result { - fn derive_id(&self, id: String) -> String { - let mut map = self.id_map.borrow_mut(); - map.derive(id) - } - - /// String representation of how to get back to the root path of the 'doc/' - /// folder in terms of a relative URL. - fn root_path(&self) -> String { - "../".repeat(self.current.len()) +fn document(w: &mut Buffer, cx: &Context<'_>, item: &clean::Item, parent: Option<&clean::Item>) { + if let Some(ref name) = item.name { + info!("Documenting {}", name); } + document_item_info(w, cx, item, false, parent); + document_full(w, item, cx, "", false); +} - fn render_item(&self, it: &clean::Item, pushname: bool) -> String { - // A little unfortunate that this is done like this, but it sure - // does make formatting *a lot* nicer. - CURRENT_DEPTH.with(|slot| { - slot.set(self.current.len()); - }); +/// Render md_text as markdown. +fn render_markdown( + w: &mut Buffer, + cx: &Context<'_>, + md_text: &str, + links: Vec, + prefix: &str, + is_hidden: bool, +) { + let mut ids = cx.id_map.borrow_mut(); + write!( + w, + "
    {}{}
    ", + if is_hidden { " hidden" } else { "" }, + prefix, + Markdown( + md_text, + &links, + &mut ids, + cx.shared.codes, + cx.shared.edition, + &cx.shared.playground + ) + .into_string() + ) +} - let mut title = if it.is_primitive() || it.is_keyword() { - // No need to include the namespace for primitive types and keywords - String::new() - } else { - self.current.join("::") - }; - if pushname { - if !title.is_empty() { - title.push_str("::"); - } - title.push_str(&it.name.unwrap().as_str()); - } - title.push_str(" - Rust"); - let tyname = it.type_(); - let desc = if it.is_crate() { - format!("API documentation for the Rust `{}` crate.", self.shared.layout.krate) - } else { - format!( - "API documentation for the Rust `{}` {} in crate `{}`.", - it.name.as_ref().unwrap(), - tyname, - self.shared.layout.krate - ) - }; - let keywords = make_item_keywords(it); - let page = layout::Page { - css_class: tyname.as_str(), - root_path: &self.root_path(), - static_root_path: self.shared.static_root_path.as_deref(), - title: &title, - description: &desc, - keywords: &keywords, - resource_suffix: &self.shared.resource_suffix, - extra_scripts: &[], - static_extra_scripts: &[], - }; +/// Writes a documentation block containing only the first paragraph of the documentation. If the +/// docs are longer, a "Read more" link is appended to the end. +fn document_short( + w: &mut Buffer, + item: &clean::Item, + cx: &Context<'_>, + link: AssocItemLink<'_>, + prefix: &str, + is_hidden: bool, + parent: Option<&clean::Item>, + show_def_docs: bool, +) { + document_item_info(w, cx, item, is_hidden, parent); + if !show_def_docs { + return; + } + if let Some(s) = item.doc_value() { + let mut summary_html = MarkdownSummaryLine(&s, &item.links(&cx.cache)).into_string(); - { - self.id_map.borrow_mut().reset(); - self.id_map.borrow_mut().populate(&INITIAL_IDS); - } + if s.contains('\n') { + let link = + format!(r#" Read more"#, naive_assoc_href(item, link, cx.cache())); - if !self.render_redirect_pages { - layout::render( - &self.shared.layout, - &page, - |buf: &mut _| print_sidebar(self, it, buf), - |buf: &mut _| print_item(self, it, buf), - &self.shared.style_files, - ) - } else { - let mut url = self.root_path(); - if let Some(&(ref names, ty)) = self.cache.paths.get(&it.def_id) { - for name in &names[..names.len() - 1] { - url.push_str(name); - url.push('/'); - } - url.push_str(&item_path(ty, names.last().unwrap())); - layout::redirect(&url) + if let Some(idx) = summary_html.rfind("

    ") { + summary_html.insert_str(idx, &link); } else { - String::new() - } - } - } - - /// Construct a map of items shown in the sidebar to a plain-text summary of their docs. - fn build_sidebar_items(&self, m: &clean::Module) -> BTreeMap> { - // BTreeMap instead of HashMap to get a sorted output - let mut map: BTreeMap<_, Vec<_>> = BTreeMap::new(); - for item in &m.items { - if item.is_stripped() { - continue; - } - - let short = item.type_(); - let myname = match item.name { - None => continue, - Some(ref s) => s.to_string(), - }; - let short = short.to_string(); - map.entry(short).or_default().push(( - myname, - Some(item.doc_value().map_or_else(String::new, |s| plain_text_summary(&s))), - )); - } - - if self.shared.sort_modules_alphabetically { - for items in map.values_mut() { - items.sort(); - } - } - map - } - - /// Generates a url appropriate for an `href` attribute back to the source of - /// this item. - /// - /// The url generated, when clicked, will redirect the browser back to the - /// original source code. - /// - /// If `None` is returned, then a source link couldn't be generated. This - /// may happen, for example, with externally inlined items where the source - /// of their crate documentation isn't known. - fn src_href(&self, item: &clean::Item) -> Option { - let mut root = self.root_path(); - let mut path = String::new(); - let cnum = item.source.cnum(self.sess()); - - // We can safely ignore synthetic `SourceFile`s. - let file = match item.source.filename(self.sess()) { - FileName::Real(ref path) => path.local_path().to_path_buf(), - _ => return None, - }; - let file = &file; - - let symbol; - let (krate, path) = if cnum == LOCAL_CRATE { - if let Some(path) = self.shared.local_sources.get(file) { - (self.shared.layout.krate.as_str(), path) - } else { - return None; - } - } else { - let (krate, src_root) = match *self.cache.extern_locations.get(&cnum)? { - (name, ref src, ExternalLocation::Local) => (name, src), - (name, ref src, ExternalLocation::Remote(ref s)) => { - root = s.to_string(); - (name, src) - } - (_, _, ExternalLocation::Unknown) => return None, - }; - - sources::clean_path(&src_root, file, false, |component| { - path.push_str(&component.to_string_lossy()); - path.push('/'); - }); - let mut fname = file.file_name().expect("source has no filename").to_os_string(); - fname.push(".html"); - path.push_str(&fname.to_string_lossy()); - symbol = krate.as_str(); - (&*symbol, &path) - }; - - let loline = item.source.lo(self.sess()).line; - let hiline = item.source.hi(self.sess()).line; - let lines = - if loline == hiline { loline.to_string() } else { format!("{}-{}", loline, hiline) }; - Some(format!( - "{root}src/{krate}/{path}#{lines}", - root = Escape(&root), - krate = krate, - path = path, - lines = lines - )) - } -} - -fn wrap_into_docblock(w: &mut Buffer, f: F) -where - F: FnOnce(&mut Buffer), -{ - w.write_str("
    "); - f(w); - w.write_str("
    ") -} - -fn print_item(cx: &Context<'_>, item: &clean::Item, buf: &mut Buffer) { - debug_assert!(!item.is_stripped()); - // Write the breadcrumb trail header for the top - buf.write_str("

    "); - let name = match *item.kind { - clean::ModuleItem(ref m) => { - if m.is_crate { - "Crate " - } else { - "Module " - } - } - clean::FunctionItem(..) | clean::ForeignFunctionItem(..) => "Function ", - clean::TraitItem(..) => "Trait ", - clean::StructItem(..) => "Struct ", - clean::UnionItem(..) => "Union ", - clean::EnumItem(..) => "Enum ", - clean::TypedefItem(..) => "Type Definition ", - clean::MacroItem(..) => "Macro ", - clean::ProcMacroItem(ref mac) => match mac.kind { - MacroKind::Bang => "Macro ", - MacroKind::Attr => "Attribute Macro ", - MacroKind::Derive => "Derive Macro ", - }, - clean::PrimitiveItem(..) => "Primitive Type ", - clean::StaticItem(..) | clean::ForeignStaticItem(..) => "Static ", - clean::ConstantItem(..) => "Constant ", - clean::ForeignTypeItem => "Foreign Type ", - clean::KeywordItem(..) => "Keyword ", - clean::OpaqueTyItem(..) => "Opaque Type ", - clean::TraitAliasItem(..) => "Trait Alias ", - _ => { - // We don't generate pages for any other type. - unreachable!(); - } - }; - buf.write_str(name); - if !item.is_primitive() && !item.is_keyword() { - let cur = &cx.current; - let amt = if item.is_mod() { cur.len() - 1 } else { cur.len() }; - for (i, component) in cur.iter().enumerate().take(amt) { - write!( - buf, - "{}::", - "../".repeat(cur.len() - i - 1), - component - ); - } - } - write!(buf, "{}", item.type_(), item.name.as_ref().unwrap()); - - buf.write_str(""); // in-band - buf.write_str(""); - render_stability_since_raw( - buf, - item.stable_since(cx.tcx()).as_deref(), - item.const_stable_since(cx.tcx()).as_deref(), - None, - None, - ); - buf.write_str( - "\ - \ - []\ - \ - ", - ); - - // Write `src` tag - // - // When this item is part of a `crate use` in a downstream crate, the - // [src] link in the downstream documentation will actually come back to - // this page, and this link will be auto-clicked. The `id` attribute is - // used to find the link to auto-click. - if cx.shared.include_sources && !item.is_primitive() { - write_srclink(cx, item, buf); - } - - buf.write_str("

    "); // out-of-band - - match *item.kind { - clean::ModuleItem(ref m) => item_module(buf, cx, item, &m.items), - clean::FunctionItem(ref f) | clean::ForeignFunctionItem(ref f) => { - item_function(buf, cx, item, f) - } - clean::TraitItem(ref t) => item_trait(buf, cx, item, t), - clean::StructItem(ref s) => item_struct(buf, cx, item, s), - clean::UnionItem(ref s) => item_union(buf, cx, item, s), - clean::EnumItem(ref e) => item_enum(buf, cx, item, e), - clean::TypedefItem(ref t, _) => item_typedef(buf, cx, item, t), - clean::MacroItem(ref m) => item_macro(buf, cx, item, m), - clean::ProcMacroItem(ref m) => item_proc_macro(buf, cx, item, m), - clean::PrimitiveItem(_) => item_primitive(buf, cx, item), - clean::StaticItem(ref i) | clean::ForeignStaticItem(ref i) => item_static(buf, cx, item, i), - clean::ConstantItem(ref c) => item_constant(buf, cx, item, c), - clean::ForeignTypeItem => item_foreign_type(buf, cx, item), - clean::KeywordItem(_) => item_keyword(buf, cx, item), - clean::OpaqueTyItem(ref e) => item_opaque_ty(buf, cx, item, e), - clean::TraitAliasItem(ref ta) => item_trait_alias(buf, cx, item, ta), - _ => { - // We don't generate pages for any other type. - unreachable!(); - } - } -} - -fn item_path(ty: ItemType, name: &str) -> String { - match ty { - ItemType::Module => format!("{}index.html", ensure_trailing_slash(name)), - _ => format!("{}.{}.html", ty, name), - } -} - -fn full_path(cx: &Context<'_>, item: &clean::Item) -> String { - let mut s = cx.current.join("::"); - s.push_str("::"); - s.push_str(&item.name.unwrap().as_str()); - s -} - -fn document(w: &mut Buffer, cx: &Context<'_>, item: &clean::Item, parent: Option<&clean::Item>) { - if let Some(ref name) = item.name { - info!("Documenting {}", name); - } - document_item_info(w, cx, item, false, parent); - document_full(w, item, cx, "", false); -} - -/// Render md_text as markdown. -fn render_markdown( - w: &mut Buffer, - cx: &Context<'_>, - md_text: &str, - links: Vec, - prefix: &str, - is_hidden: bool, -) { - let mut ids = cx.id_map.borrow_mut(); - write!( - w, - "
    {}{}
    ", - if is_hidden { " hidden" } else { "" }, - prefix, - Markdown( - md_text, - &links, - &mut ids, - cx.shared.codes, - cx.shared.edition, - &cx.shared.playground - ) - .into_string() - ) -} - -/// Writes a documentation block containing only the first paragraph of the documentation. If the -/// docs are longer, a "Read more" link is appended to the end. -fn document_short( - w: &mut Buffer, - item: &clean::Item, - cx: &Context<'_>, - link: AssocItemLink<'_>, - prefix: &str, - is_hidden: bool, - parent: Option<&clean::Item>, - show_def_docs: bool, -) { - document_item_info(w, cx, item, is_hidden, parent); - if !show_def_docs { - return; - } - if let Some(s) = item.doc_value() { - let mut summary_html = MarkdownSummaryLine(&s, &item.links(&cx.cache)).into_string(); - - if s.contains('\n') { - let link = - format!(r#" Read more"#, naive_assoc_href(item, link, cx.cache())); - - if let Some(idx) = summary_html.rfind("

    ") { - summary_html.insert_str(idx, &link); - } else { - summary_html.push_str(&link); + summary_html.push_str(&link); } } @@ -1950,324 +737,6 @@ fn document_item_info( } } -fn document_non_exhaustive_header(item: &clean::Item) -> &str { - if item.is_non_exhaustive() { " (Non-exhaustive)" } else { "" } -} - -fn document_non_exhaustive(w: &mut Buffer, item: &clean::Item) { - if item.is_non_exhaustive() { - write!(w, "
    ", { - if item.is_struct() { - "struct" - } else if item.is_enum() { - "enum" - } else if item.is_variant() { - "variant" - } else { - "type" - } - }); - - if item.is_struct() { - w.write_str( - "Non-exhaustive structs could have additional fields added in future. \ - Therefore, non-exhaustive structs cannot be constructed in external crates \ - using the traditional Struct {{ .. }} syntax; cannot be \ - matched against without a wildcard ..; and \ - struct update syntax will not work.", - ); - } else if item.is_enum() { - w.write_str( - "Non-exhaustive enums could have additional variants added in future. \ - Therefore, when matching against variants of non-exhaustive enums, an \ - extra wildcard arm must be added to account for any future variants.", - ); - } else if item.is_variant() { - w.write_str( - "Non-exhaustive enum variants could have additional fields added in future. \ - Therefore, non-exhaustive enum variants cannot be constructed in external \ - crates and cannot be matched against.", - ); - } else { - w.write_str( - "This type will require a wildcard arm in any match statements or constructors.", - ); - } - - w.write_str("
    "); - } -} - -/// Compare two strings treating multi-digit numbers as single units (i.e. natural sort order). -crate fn compare_names(mut lhs: &str, mut rhs: &str) -> Ordering { - /// Takes a non-numeric and a numeric part from the given &str. - fn take_parts<'a>(s: &mut &'a str) -> (&'a str, &'a str) { - let i = s.find(|c: char| c.is_ascii_digit()); - let (a, b) = s.split_at(i.unwrap_or(s.len())); - let i = b.find(|c: char| !c.is_ascii_digit()); - let (b, c) = b.split_at(i.unwrap_or(b.len())); - *s = c; - (a, b) - } - - while !lhs.is_empty() || !rhs.is_empty() { - let (la, lb) = take_parts(&mut lhs); - let (ra, rb) = take_parts(&mut rhs); - // First process the non-numeric part. - match la.cmp(ra) { - Ordering::Equal => (), - x => return x, - } - // Then process the numeric part, if both sides have one (and they fit in a u64). - if let (Ok(ln), Ok(rn)) = (lb.parse::(), rb.parse::()) { - match ln.cmp(&rn) { - Ordering::Equal => (), - x => return x, - } - } - // Then process the numeric part again, but this time as strings. - match lb.cmp(rb) { - Ordering::Equal => (), - x => return x, - } - } - - Ordering::Equal -} - -fn item_module(w: &mut Buffer, cx: &Context<'_>, item: &clean::Item, items: &[clean::Item]) { - document(w, cx, item, None); - - let mut indices = (0..items.len()).filter(|i| !items[*i].is_stripped()).collect::>(); - - // the order of item types in the listing - fn reorder(ty: ItemType) -> u8 { - match ty { - ItemType::ExternCrate => 0, - ItemType::Import => 1, - ItemType::Primitive => 2, - ItemType::Module => 3, - ItemType::Macro => 4, - ItemType::Struct => 5, - ItemType::Enum => 6, - ItemType::Constant => 7, - ItemType::Static => 8, - ItemType::Trait => 9, - ItemType::Function => 10, - ItemType::Typedef => 12, - ItemType::Union => 13, - _ => 14 + ty as u8, - } - } - - fn cmp( - i1: &clean::Item, - i2: &clean::Item, - idx1: usize, - idx2: usize, - tcx: TyCtxt<'_>, - ) -> Ordering { - let ty1 = i1.type_(); - let ty2 = i2.type_(); - if ty1 != ty2 { - return (reorder(ty1), idx1).cmp(&(reorder(ty2), idx2)); - } - let s1 = i1.stability(tcx).as_ref().map(|s| s.level); - let s2 = i2.stability(tcx).as_ref().map(|s| s.level); - if let (Some(a), Some(b)) = (s1, s2) { - match (a.is_stable(), b.is_stable()) { - (true, true) | (false, false) => {} - (false, true) => return Ordering::Less, - (true, false) => return Ordering::Greater, - } - } - let lhs = i1.name.unwrap_or(kw::Empty).as_str(); - let rhs = i2.name.unwrap_or(kw::Empty).as_str(); - compare_names(&lhs, &rhs) - } - - if cx.shared.sort_modules_alphabetically { - indices.sort_by(|&i1, &i2| cmp(&items[i1], &items[i2], i1, i2, cx.tcx())); - } - // This call is to remove re-export duplicates in cases such as: - // - // ``` - // crate mod foo { - // crate mod bar { - // crate trait Double { fn foo(); } - // } - // } - // - // crate use foo::bar::*; - // crate use foo::*; - // ``` - // - // `Double` will appear twice in the generated docs. - // - // FIXME: This code is quite ugly and could be improved. Small issue: DefId - // can be identical even if the elements are different (mostly in imports). - // So in case this is an import, we keep everything by adding a "unique id" - // (which is the position in the vector). - indices.dedup_by_key(|i| { - ( - items[*i].def_id, - if items[*i].name.as_ref().is_some() { Some(full_path(cx, &items[*i])) } else { None }, - items[*i].type_(), - if items[*i].is_import() { *i } else { 0 }, - ) - }); - - debug!("{:?}", indices); - let mut curty = None; - for &idx in &indices { - let myitem = &items[idx]; - if myitem.is_stripped() { - continue; - } - - let myty = Some(myitem.type_()); - if curty == Some(ItemType::ExternCrate) && myty == Some(ItemType::Import) { - // Put `extern crate` and `use` re-exports in the same section. - curty = myty; - } else if myty != curty { - if curty.is_some() { - w.write_str(""); - } - curty = myty; - let (short, name) = item_ty_to_strs(&myty.unwrap()); - write!( - w, - "

    \ - {name}

    \n", - id = cx.derive_id(short.to_owned()), - name = name - ); - } - - match *myitem.kind { - clean::ExternCrateItem(ref name, ref src) => { - use crate::html::format::anchor; - - match *src { - Some(ref src) => write!( - w, - ""); - } - - clean::ImportItem(ref import) => { - write!( - w, - "", - myitem.visibility.print_with_space(cx.tcx(), myitem.def_id, cx.cache()), - import.print(cx.cache()) - ); - } - - _ => { - if myitem.name.is_none() { - continue; - } - - let unsafety_flag = match *myitem.kind { - clean::FunctionItem(ref func) | clean::ForeignFunctionItem(ref func) - if func.header.unsafety == hir::Unsafety::Unsafe => - { - "⚠" - } - _ => "", - }; - - let stab = myitem.stability_class(cx.tcx()); - let add = if stab.is_some() { " " } else { "" }; - - let doc_value = myitem.doc_value().unwrap_or_default(); - write!( - w, - "\ - \ - \ - ", - name = *myitem.name.as_ref().unwrap(), - stab_tags = extra_info_tags(myitem, item, cx.tcx()), - docs = MarkdownSummaryLine(&doc_value, &myitem.links(&cx.cache)).into_string(), - class = myitem.type_(), - add = add, - stab = stab.unwrap_or_else(String::new), - unsafety_flag = unsafety_flag, - href = item_path(myitem.type_(), &myitem.name.unwrap().as_str()), - 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(" "), - ); - } - } - } - - if curty.is_some() { - w.write_str("
    {}extern crate {} as {};", - myitem.visibility.print_with_space(cx.tcx(), myitem.def_id, cx.cache()), - anchor(myitem.def_id, &*src.as_str(), cx.cache()), - name - ), - None => write!( - w, - "
    {}extern crate {};", - myitem.visibility.print_with_space(cx.tcx(), myitem.def_id, cx.cache()), - anchor(myitem.def_id, &*name.as_str(), cx.cache()) - ), - } - w.write_str("
    {}{}
    {name}{unsafety_flag}{stab_tags}{docs}
    "); - } -} - -/// Render the stability, deprecation and portability tags that are displayed in the item's summary -/// at the module level. -fn extra_info_tags(item: &clean::Item, parent: &clean::Item, tcx: TyCtxt<'_>) -> String { - let mut tags = String::new(); - - fn tag_html(class: &str, title: &str, contents: &str) -> String { - format!(r#"{}"#, class, Escape(title), contents) - } - - // The trailing space after each tag is to space it properly against the rest of the docs. - if let Some(depr) = &item.deprecation(tcx) { - let mut message = "Deprecated"; - if !stability::deprecation_in_effect( - depr.is_since_rustc_version, - depr.since.map(|s| s.as_str()).as_deref(), - ) { - message = "Deprecation planned"; - } - tags += &tag_html("deprecated", "", message); - } - - // The "rustc_private" crates are permanently unstable so it makes no sense - // to render "unstable" everywhere. - if item - .stability(tcx) - .as_ref() - .map(|s| s.level.is_unstable() && s.feature != sym::rustc_private) - == Some(true) - { - tags += &tag_html("unstable", "", "Experimental"); - } - - let cfg = match (&item.attrs.cfg, parent.attrs.cfg.as_ref()) { - (Some(cfg), Some(parent_cfg)) => cfg.simplify_with(parent_cfg), - (cfg, _) => cfg.as_deref().cloned(), - }; - - debug!("Portability {:?} - {:?} = {:?}", item.attrs.cfg, parent.attrs.cfg, cfg); - if let Some(ref cfg) = cfg { - tags += &tag_html("portability", &cfg.render_long_plain(), &cfg.render_short_html()); - } - - tags -} - fn portability(item: &clean::Item, parent: Option<&clean::Item>) -> Option { let cfg = match (&item.attrs.cfg, parent.and_then(|p| p.attrs.cfg.as_ref())) { (Some(cfg), Some(parent_cfg)) => cfg.simplify_with(parent_cfg), @@ -2346,510 +815,72 @@ fn short_item_info( let mut feature = format!("{}", Escape(&feature.as_str())); if let (Some(url), Some(issue)) = (&cx.shared.issue_tracker_base_url, issue) { feature.push_str(&format!( - " #{issue}", - url = url, - issue = issue - )); - } - - message.push_str(&format!(" ({})", feature)); - - if let Some(unstable_reason) = reason { - let mut ids = cx.id_map.borrow_mut(); - message = format!( - "
    {}{}
    ", - message, - MarkdownHtml( - &unstable_reason.as_str(), - &mut ids, - error_codes, - cx.shared.edition, - &cx.shared.playground, - ) - .into_string() - ); - } - - extra_info.push(format!("
    {}
    ", message)); - } - - if let Some(portability) = portability(item, parent) { - extra_info.push(portability); - } - - extra_info -} - -fn item_constant(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, c: &clean::Constant) { - w.write_str("
    ");
    -    render_attributes(w, it, false);
    -
    -    write!(
    -        w,
    -        "{vis}const {name}: {typ}",
    -        vis = it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()),
    -        name = it.name.as_ref().unwrap(),
    -        typ = c.type_.print(cx.cache()),
    -    );
    -
    -    if c.value.is_some() || c.is_literal {
    -        write!(w, " = {expr};", expr = Escape(&c.expr));
    -    } else {
    -        w.write_str(";");
    -    }
    -
    -    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));
    -            }
    -        }
    -    }
    -
    -    w.write_str("
    "); - document(w, cx, it, None) -} - -fn item_static(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Static) { - w.write_str("
    ");
    -    render_attributes(w, it, false);
    -    write!(
    -        w,
    -        "{vis}static {mutability}{name}: {typ}
    ", - vis = it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()), - mutability = s.mutability.print_with_space(), - name = it.name.as_ref().unwrap(), - typ = s.type_.print(cx.cache()) - ); - document(w, cx, it, None) -} - -fn item_function(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, f: &clean::Function) { - let header_len = format!( - "{}{}{}{}{:#}fn {}{:#}", - it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()), - f.header.constness.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(cx.cache()) - ) - .len(); - w.write_str("
    ");
    -    render_attributes(w, it, false);
    -    write!(
    -        w,
    -        "{vis}{constness}{asyncness}{unsafety}{abi}fn \
    -         {name}{generics}{decl}{spotlight}{where_clause}
    ", - vis = it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()), - 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(cx.cache()), - where_clause = - WhereClause { gens: &f.generics, indent: 0, end_newline: true }.print(cx.cache()), - decl = Function { decl: &f.decl, header_len, indent: 0, asyncness: f.header.asyncness } - .print(cx.cache()), - spotlight = spotlight_decl(&f.decl, cx.cache()), - ); - document(w, cx, it, None) -} - -fn render_implementor( - cx: &Context<'_>, - implementor: &Impl, - trait_: &clean::Item, - w: &mut Buffer, - implementor_dups: &FxHashMap, - 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 { - type_: box clean::ResolvedPath { ref path, is_generic: false, .. }, - .. - } => implementor_dups[&path.last()].1, - _ => false, - }; - render_impl( - w, - cx, - implementor, - trait_, - AssocItemLink::Anchor(None), - RenderMode::Normal, - trait_.stable_since(cx.tcx()).as_deref(), - trait_.const_stable_since(cx.tcx()).as_deref(), - 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() - .map(|i| { - let did = i.trait_did_full(cx.cache()).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, - containing_item, - assoc_link, - RenderMode::Normal, - containing_item.stable_since(cx.tcx()).as_deref(), - containing_item.const_stable_since(cx.tcx()).as_deref(), - true, - None, - false, - true, - &[], - ); - buffer.into_inner() - }) - .collect::>(); - impls.sort(); - w.write_str(&impls.join("")); -} - -fn bounds(t_bounds: &[clean::GenericBound], trait_alias: bool, cache: &Cache) -> String { - let mut bounds = String::new(); - if !t_bounds.is_empty() { - if !trait_alias { - bounds.push_str(": "); - } - for (i, p) in t_bounds.iter().enumerate() { - if i > 0 { - bounds.push_str(" + "); - } - bounds.push_str(&p.print(cache).to_string()); - } - } - bounds -} - -fn compare_impl<'a, 'b>(lhs: &'a &&Impl, rhs: &'b &&Impl, cache: &Cache) -> Ordering { - let lhs = format!("{}", lhs.inner_impl().print(cache)); - let rhs = format!("{}", rhs.inner_impl().print(cache)); - - // lhs and rhs are formatted as HTML, which may be unnecessary - compare_names(&lhs, &rhs) -} - -fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Trait) { - let bounds = bounds(&t.bounds, false, cx.cache()); - let types = t.items.iter().filter(|m| m.is_associated_type()).collect::>(); - let consts = t.items.iter().filter(|m| m.is_associated_const()).collect::>(); - let required = t.items.iter().filter(|m| m.is_ty_method()).collect::>(); - let provided = t.items.iter().filter(|m| m.is_method()).collect::>(); - - // Output the trait definition - wrap_into_docblock(w, |w| { - w.write_str("
    ");
    -        render_attributes(w, it, true);
    -        write!(
    -            w,
    -            "{}{}{}trait {}{}{}",
    -            it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()),
    -            t.unsafety.print_with_space(),
    -            if t.is_auto { "auto " } else { "" },
    -            it.name.as_ref().unwrap(),
    -            t.generics.print(cx.cache()),
    -            bounds
    -        );
    -
    -        if !t.generics.where_predicates.is_empty() {
    -            let where_ = WhereClause { gens: &t.generics, indent: 0, end_newline: true };
    -            write!(w, "{}", where_.print(cx.cache()));
    -        } else {
    -            w.write_str(" ");
    -        }
    -
    -        if t.items.is_empty() {
    -            w.write_str("{ }");
    -        } else {
    -            // FIXME: we should be using a derived_id for the Anchors here
    -            w.write_str("{\n");
    -            for t in &types {
    -                render_assoc_item(w, t, AssocItemLink::Anchor(None), ItemType::Trait, cx);
    -                w.write_str(";\n");
    -            }
    -            if !types.is_empty() && !consts.is_empty() {
    -                w.write_str("\n");
    -            }
    -            for t in &consts {
    -                render_assoc_item(w, t, AssocItemLink::Anchor(None), ItemType::Trait, cx);
    -                w.write_str(";\n");
    -            }
    -            if !consts.is_empty() && !required.is_empty() {
    -                w.write_str("\n");
    -            }
    -            for (pos, m) in required.iter().enumerate() {
    -                render_assoc_item(w, m, AssocItemLink::Anchor(None), ItemType::Trait, cx);
    -                w.write_str(";\n");
    -
    -                if pos < required.len() - 1 {
    -                    w.write_str("
    "); - } - } - if !required.is_empty() && !provided.is_empty() { - w.write_str("\n"); - } - for (pos, m) in provided.iter().enumerate() { - render_assoc_item(w, m, AssocItemLink::Anchor(None), ItemType::Trait, cx); - match *m.kind { - clean::MethodItem(ref inner, _) - if !inner.generics.where_predicates.is_empty() => - { - w.write_str(",\n { ... }\n"); - } - _ => { - w.write_str(" { ... }\n"); - } - } - if pos < provided.len() - 1 { - w.write_str("
    "); - } - } - w.write_str("}"); - } - w.write_str("
    ") - }); - - // Trait documentation - document(w, cx, it, None); - - fn write_small_section_header(w: &mut Buffer, id: &str, title: &str, extra_content: &str) { - write!( - w, - "

    \ - {1}\ -

    {2}", - id, title, extra_content - ) - } - - fn write_loading_content(w: &mut Buffer, extra_content: &str) { - write!(w, "{}Loading content...", extra_content) - } - - fn trait_item(w: &mut Buffer, cx: &Context<'_>, m: &clean::Item, t: &clean::Item) { - let name = m.name.as_ref().unwrap(); - info!("Documenting {} on {:?}", name, t.name); - let item_type = m.type_(); - let id = cx.derive_id(format!("{}.{}", item_type, name)); - write!(w, "

    ", id = id,); - render_assoc_item(w, m, AssocItemLink::Anchor(Some(&id)), ItemType::Impl, cx); - w.write_str(""); - render_stability_since(w, m, t, cx.tcx()); - write_srclink(cx, m, w); - w.write_str("

    "); - document(w, cx, m, Some(t)); - } - - if !types.is_empty() { - write_small_section_header( - w, - "associated-types", - "Associated Types", - "
    ", - ); - for t in types { - trait_item(w, cx, t, it); - } - write_loading_content(w, "
    "); - } - - if !consts.is_empty() { - write_small_section_header( - w, - "associated-const", - "Associated Constants", - "
    ", - ); - for t in consts { - trait_item(w, cx, t, it); - } - write_loading_content(w, "
    "); - } - - // Output the documentation for each function individually - if !required.is_empty() { - 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", - "
    ", - ); - for m in provided { - trait_item(w, cx, m, it); - } - write_loading_content(w, "
    "); - } - - // If there are methods directly on this trait object, render them here. - render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All); - - 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 = FxHashMap::default(); - for implementor in implementors { - match implementor.inner_impl().for_ { - clean::ResolvedPath { ref path, did, is_generic: false, .. } - | clean::BorrowedRef { - type_: box clean::ResolvedPath { ref path, did, is_generic: false, .. }, - .. - } => { - let &mut (prev_did, ref mut has_duplicates) = - implementor_dups.entry(path.last()).or_insert((did, false)); - if prev_did != did { - *has_duplicates = true; - } - } - _ => {} - } - } - - let (local, foreign) = implementors.iter().partition::, _>(|i| { - i.inner_impl() - .for_ - .def_id_full(cx.cache()) - .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); - - synthetic.sort_by(|a, b| compare_impl(a, b, cx.cache())); - concrete.sort_by(|a, b| compare_impl(a, b, cx.cache())); - - if !foreign.is_empty() { - write_small_section_header(w, "foreign-impls", "Implementations on Foreign Types", ""); - - for implementor in foreign { - let assoc_link = AssocItemLink::GotoSource( - implementor.impl_item.def_id, - &implementor.inner_impl().provided_trait_methods, - ); - render_impl( - w, - cx, - &implementor, - it, - assoc_link, - RenderMode::Normal, - implementor.impl_item.stable_since(cx.tcx()).as_deref(), - implementor.impl_item.const_stable_since(cx.tcx()).as_deref(), - false, - None, - true, - false, - &[], - ); - } - write_loading_content(w, ""); - } - - write_small_section_header( - w, - "implementors", - "Implementors", - "
    ", - ); - for implementor in concrete { - render_implementor(cx, implementor, it, w, &implementor_dups, &[]); - } - write_loading_content(w, "
    "); - - if t.is_auto { - write_small_section_header( - w, - "synthetic-implementors", - "Auto implementors", - "
    ", - ); - for implementor in synthetic { - render_implementor( - cx, - implementor, - it, - w, - &implementor_dups, - &collect_paths_for_type(implementor.inner_impl().for_.clone(), &cx.cache), - ); - } - write_loading_content(w, "
    "); + " #{issue}", + url = url, + issue = issue + )); } - } 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_loading_content(w, "
    "); - if t.is_auto { - write_small_section_header( - w, - "synthetic-implementors", - "Auto implementors", - "
    ", + message.push_str(&format!(" ({})", feature)); + + if let Some(unstable_reason) = reason { + let mut ids = cx.id_map.borrow_mut(); + message = format!( + "
    {}{}
    ", + message, + MarkdownHtml( + &unstable_reason.as_str(), + &mut ids, + error_codes, + cx.shared.edition, + &cx.shared.playground, + ) + .into_string() ); - write_loading_content(w, "
    "); } + + extra_info.push(format!("
    {}
    ", message)); } - write!( - w, - "", - 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() - ); + if let Some(portability) = portability(item, parent) { + extra_info.push(portability); + } + + extra_info +} + +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_full(cx.cache()).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, + containing_item, + assoc_link, + RenderMode::Normal, + containing_item.stable_since(cx.tcx()).as_deref(), + containing_item.const_stable_since(cx.tcx()).as_deref(), + true, + None, + false, + true, + &[], + ); + buffer.into_inner() + }) + .collect::>(); + impls.sort(); + w.write_str(&impls.join("")); } fn naive_assoc_href(it: &clean::Item, link: AssocItemLink<'_>, cache: &Cache) -> String { @@ -2944,21 +975,6 @@ fn render_stability_since_raw( } } -fn render_stability_since( - w: &mut Buffer, - item: &clean::Item, - containing_item: &clean::Item, - tcx: TyCtxt<'_>, -) { - render_stability_since_raw( - w, - item.stable_since(tcx).as_deref(), - item.const_stable_since(tcx).as_deref(), - containing_item.stable_since(tcx).as_deref(), - containing_item.const_stable_since(tcx).as_deref(), - ) -} - fn render_assoc_item( w: &mut Buffer, item: &clean::Item, @@ -3062,227 +1078,6 @@ fn render_assoc_item( } } -fn item_struct(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Struct) { - wrap_into_docblock(w, |w| { - w.write_str("
    ");
    -        render_attributes(w, it, true);
    -        render_struct(w, it, Some(&s.generics), s.struct_type, &s.fields, "", true, cx);
    -        w.write_str("
    ") - }); - - document(w, cx, it, None); - let mut fields = s - .fields - .iter() - .filter_map(|f| match *f.kind { - clean::StructFieldItem(ref ty) => Some((f, ty)), - _ => None, - }) - .peekable(); - if let CtorKind::Fictive = s.struct_type { - if fields.peek().is_some() { - write!( - w, - "

    - Fields{}

    ", - 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() - )); - write!( - w, - "\ - \ - {name}: {ty}\ - ", - item_type = ItemType::StructField, - id = id, - name = field.name.as_ref().unwrap(), - ty = ty.print(cx.cache()) - ); - document(w, cx, field, Some(it)); - } - } - } - render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) -} - -fn item_union(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Union) { - wrap_into_docblock(w, |w| { - w.write_str("
    ");
    -        render_attributes(w, it, true);
    -        render_union(w, it, Some(&s.generics), &s.fields, "", true, cx);
    -        w.write_str("
    ") - }); - - document(w, cx, it, None); - let mut fields = s - .fields - .iter() - .filter_map(|f| match *f.kind { - clean::StructFieldItem(ref ty) => Some((f, ty)), - _ => None, - }) - .peekable(); - if fields.peek().is_some() { - 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, - "\ - \ - {name}: {ty}\ - ", - id = id, - name = name, - shortty = ItemType::StructField, - ty = ty.print(cx.cache()) - ); - if let Some(stability_class) = field.stability_class(cx.tcx()) { - write!(w, "", stab = stability_class); - } - document(w, cx, field, Some(it)); - } - } - render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) -} - -fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum) { - wrap_into_docblock(w, |w| { - w.write_str("
    ");
    -        render_attributes(w, it, true);
    -        write!(
    -            w,
    -            "{}enum {}{}{}",
    -            it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()),
    -            it.name.as_ref().unwrap(),
    -            e.generics.print(cx.cache()),
    -            WhereClause { gens: &e.generics, indent: 0, end_newline: true }.print(cx.cache())
    -        );
    -        if e.variants.is_empty() && !e.variants_stripped {
    -            w.write_str(" {}");
    -        } else {
    -            w.write_str(" {\n");
    -            for v in &e.variants {
    -                w.write_str("    ");
    -                let name = v.name.as_ref().unwrap();
    -                match *v.kind {
    -                    clean::VariantItem(ref var) => match var {
    -                        clean::Variant::CLike => write!(w, "{}", name),
    -                        clean::Variant::Tuple(ref tys) => {
    -                            write!(w, "{}(", name);
    -                            for (i, ty) in tys.iter().enumerate() {
    -                                if i > 0 {
    -                                    w.write_str(", ")
    -                                }
    -                                write!(w, "{}", ty.print(cx.cache()));
    -                            }
    -                            w.write_str(")");
    -                        }
    -                        clean::Variant::Struct(ref s) => {
    -                            render_struct(w, v, None, s.struct_type, &s.fields, "    ", false, cx);
    -                        }
    -                    },
    -                    _ => unreachable!(),
    -                }
    -                w.write_str(",\n");
    -            }
    -
    -            if e.variants_stripped {
    -                w.write_str("    // some variants omitted\n");
    -            }
    -            w.write_str("}");
    -        }
    -        w.write_str("
    ") - }); - - document(w, cx, it, None); - if !e.variants.is_empty() { - write!( - w, - "

    - Variants{}

    \n", - 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())); - write!( - w, - "
    \ - \ - {name}", - id = id, - name = variant.name.as_ref().unwrap() - ); - if let clean::VariantItem(clean::Variant::Tuple(ref tys)) = *variant.kind { - w.write_str("("); - for (i, ty) in tys.iter().enumerate() { - if i > 0 { - w.write_str(", "); - } - write!(w, "{}", ty.print(cx.cache())); - } - w.write_str(")"); - } - w.write_str("
    "); - document(w, cx, variant, Some(it)); - document_non_exhaustive(w, variant); - - use crate::clean::Variant; - if let clean::VariantItem(Variant::Struct(ref s)) = *variant.kind { - 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.kind { - let id = cx.derive_id(format!( - "variant.{}.field.{}", - variant.name.as_ref().unwrap(), - field.name.as_ref().unwrap() - )); - write!( - w, - "\ - \ - {f}: {t}\ - ", - id = id, - f = field.name.as_ref().unwrap(), - t = ty.print(cx.cache()) - ); - document(w, cx, field, Some(variant)); - } - } - w.write_str("
    "); - } - render_stability_since(w, variant, it, cx.tcx()); - } - } - render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) -} - const ALLOWED_ATTRIBUTES: &[Symbol] = &[ sym::export_name, sym::lang, @@ -3325,147 +1120,6 @@ fn render_attributes(w: &mut Buffer, it: &clean::Item, top: bool) { } } -fn render_struct( - w: &mut Buffer, - it: &clean::Item, - g: Option<&clean::Generics>, - ty: CtorKind, - fields: &[clean::Item], - tab: &str, - structhead: bool, - cx: &Context<'_>, -) { - write!( - w, - "{}{}{}", - it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()), - if structhead { "struct " } else { "" }, - it.name.as_ref().unwrap() - ); - if let Some(g) = g { - write!(w, "{}", g.print(cx.cache())) - } - match ty { - CtorKind::Fictive => { - if let Some(g) = g { - write!( - w, - "{}", - WhereClause { gens: g, indent: 0, end_newline: true }.print(cx.cache()) - ) - } - let mut has_visible_fields = false; - w.write_str(" {"); - for field in fields { - if let clean::StructFieldItem(ref ty) = *field.kind { - write!( - w, - "\n{} {}{}: {},", - tab, - field.visibility.print_with_space(cx.tcx(), field.def_id, cx.cache()), - field.name.as_ref().unwrap(), - ty.print(cx.cache()) - ); - has_visible_fields = true; - } - } - - if has_visible_fields { - if it.has_stripped_fields().unwrap() { - write!(w, "\n{} // some fields omitted", tab); - } - write!(w, "\n{}", tab); - } else if it.has_stripped_fields().unwrap() { - // If there are no visible fields we can just display - // `{ /* fields omitted */ }` to save space. - write!(w, " /* fields omitted */ "); - } - w.write_str("}"); - } - CtorKind::Fn => { - w.write_str("("); - for (i, field) in fields.iter().enumerate() { - if i > 0 { - w.write_str(", "); - } - match *field.kind { - clean::StrippedItem(box clean::StructFieldItem(..)) => write!(w, "_"), - clean::StructFieldItem(ref ty) => { - write!( - w, - "{}{}", - field.visibility.print_with_space(cx.tcx(), field.def_id, cx.cache()), - ty.print(cx.cache()) - ) - } - _ => unreachable!(), - } - } - w.write_str(")"); - if let Some(g) = g { - write!( - w, - "{}", - WhereClause { gens: g, indent: 0, end_newline: false }.print(cx.cache()) - ) - } - w.write_str(";"); - } - CtorKind::Const => { - // Needed for PhantomData. - if let Some(g) = g { - write!( - w, - "{}", - WhereClause { gens: g, indent: 0, end_newline: false }.print(cx.cache()) - ) - } - w.write_str(";"); - } - } -} - -fn render_union( - w: &mut Buffer, - it: &clean::Item, - g: Option<&clean::Generics>, - fields: &[clean::Item], - tab: &str, - structhead: bool, - cx: &Context<'_>, -) { - write!( - w, - "{}{}{}", - it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()), - if structhead { "union " } else { "" }, - it.name.as_ref().unwrap() - ); - if let Some(g) = g { - write!(w, "{}", g.print(cx.cache())); - write!(w, "{}", WhereClause { gens: g, indent: 0, end_newline: true }.print(cx.cache())); - } - - write!(w, " {{\n{}", tab); - for field in fields { - if let clean::StructFieldItem(ref ty) = *field.kind { - write!( - w, - " {}{}: {},\n{}", - field.visibility.print_with_space(cx.tcx(), field.def_id, cx.cache()), - field.name.as_ref().unwrap(), - ty.print(cx.cache()), - tab - ); - } - } - - if it.has_stripped_fields().unwrap() { - write!(w, " // some fields omitted\n{}", tab); - } - w.write_str("}"); -} - #[derive(Copy, Clone)] enum AssocItemLink<'a> { Anchor(Option<&'a str>), @@ -3681,8 +1335,9 @@ fn spotlight_decl(decl: &clean::FnDecl, cache: &Cache) -> String { if let Some(impls) = cache.impls.get(&did) { for i in impls { let impl_ = i.inner_impl(); - if impl_.trait_.def_id_full(cache).map_or(false, |d| cache.traits[&d].is_spotlight) - { + if impl_.trait_.def_id().map_or(false, |d| { + cache.traits.get(&d).map(|t| t.is_spotlight).unwrap_or(false) + }) { if out.is_empty() { write!( &mut out, @@ -3697,7 +1352,7 @@ fn spotlight_decl(decl: &clean::FnDecl, cache: &Cache) -> String { write!( &mut out, "{}", - impl_.print(cache) + impl_.print(cache, false) ); let t_did = impl_.trait_.def_id_full(cache).unwrap(); for it in &impl_.items { @@ -3770,7 +1425,7 @@ fn render_impl( }; if let Some(use_absolute) = use_absolute { write!(w, "

    ", id, aliases); - fmt_impl_for_trait_page(&i.inner_impl(), w, use_absolute, cx.cache()); + write!(w, "{}", i.inner_impl().print(cx.cache(), use_absolute)); if show_def_docs { for it in &i.inner_impl().items { if let clean::TypedefItem(ref tydef, _) = *it.kind { @@ -3795,7 +1450,7 @@ fn render_impl( "

    {}", id, aliases, - i.inner_impl().print(cx.cache()) + i.inner_impl().print(cx.cache(), false) ); } write!(w, "", id); @@ -3973,7 +1628,7 @@ fn render_impl( false, outer_version, outer_const_version, - trait_, + trait_.map(|t| &t.trait_), show_def_docs, ); } @@ -4022,7 +1677,7 @@ fn render_impl( render_default_items( w, cx, - t, + &t.trait_, &i.inner_impl(), &i.impl_item, render_mode, @@ -4035,86 +1690,6 @@ fn render_impl( w.write_str("

  • +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 literal 0 HcmV?d00001 diff --git a/src/doc/rustc-dev-guide/src/img/dataflow-graphviz-example.png b/src/doc/rustc-dev-guide/src/img/dataflow-graphviz-example.png new file mode 100644 index 0000000000000000000000000000000000000000..718411a8c42a81111a51c920734eb5a0b54d3967 GIT binary patch literal 81892 zcmaI7V|ZNM_dndEabw#y8>6vp+fHNKNt4DlCr)GAP8!>3*qG0>z5CVwcRllF=FB-~ zW3A8f+TrrDVsJ3nFz?>IgOd;!R($vFebKvjpqNk)z<+$$E;WH)U`~P(%22?M7nE_> zyLW`|B!oXHyXpSOgw$60jxp#9?I{-*O)M*bdZ+6gOMO;`W>#KNu30|cA~ydzpJe&% zTf?#?UQ>nU9bmpp1W_0qTo`=Glg#}MCn*Xs{)>R$Prhug1lJATyNq+4^R`wu+*Sb$ zBtlSOKPW^HVgWEqCjT#A5Up&M27UtTlG;n-AMAX*N zDbK`uwk&3%k_HQV_xF7=WN|sU!4if1YNJ7TN6EyYL}4W0tIc4ru&|puJAtK2#e$Tm zstKV;N*Nvk zzRX^Qi@PWca76-tCYB_=IBne69*D-_@VaMo6B~3ck`mi6lw#l?{sEaG zkLQ2#y^4gJo0}b^<|{Tfc0{w&0Wl+^ymNTG@o&nYA)Bu@F@?b4gnYC5u9}NpOCdv2 zR9lxv@o%zNO6ng@<#IS|2MM3{E3G}=p3*Qy*&_cUdl`%W*qC&^^%Ao0>jOnbX6F1d zDmIhK$q%Bve?h@N0vQnsjKlZUi;8J^c{zp22%^RLM3p+q_7BQHK`v3(RmxRWBBQ?y zF;zg5#aI*m3xgx1_Io3VJr-@-p?y};c(}Os=j*)I8y)SMfOhIx4w&ChCJ5>84#kN} zO7`?eVvM@iS_Td?RcO8@aQy`%agHHqI=fwnJmr{-h?p3K>op-QE$tnmN6YV3e)I22 zqSLC@?*`upyD zbk|ra%XGbk(pVas6rBpipfX)ua02nawvg~?bFs##d64Y+@uVt+!y%7ZI3D)b*aF{3 z5pi%LZ%E{+mayg30SvW#0=?I*%q!Nslj?RhQ zORLc~Q!`C~q{uRrt^oC4d;Pm=fo8D2!NGd-X;2J$?V&X=*-UyMYl>G1b^h$?A1VKR zK}}4^$7ed7C!*e9of@GiuT2}BLOmf{VHn|xff_DsS%^X<^sgoTW?Pt_BlPq2tekqM zPkWDGKVM*RF$HiZkZNjb!F!b4#GFMVf4b~bWrAoEJ|2ZM>LK(upST38G zho?+YnN%O{uv>dpD&_N>*7O;d0>)jV=dG*+1{!68>ilAU8)m&d+BGrOt+| z4kj{H05#Uz7SW~uDMN`ueo}%Li9au5_auuc=m47*3h0W+N^vAa9v1$eL;ulmH2%>z z?1q=y{gy_2oJE#j(F&mc(ot049`xxzc5uQkV}_$3*o5D2a%iENg*ha#f=n8>MSmez z-Z(i)(Dg4dbA&?S8ChBT5^2=t0w92c#laPT{WF+94DzO<{+un7Y$!P~9WThMm5qbp zvDhM-EY6O~7g`aDUtpP22bD^u??0X|pYP!VY8GM~ap=Dg6oIxEZ+fBQ`>_r>z5>@{ z<_ktr$Ji9bnCWt%%ZN)?anluwuPquYCgt)v+)bEiTjH&F69d{pAM+ z>ZQc7h(j`2IOpG6C(dyQqSn%Ci>26z+*?Uig%GcpUJ#U8C0)Di&Azvb|wEIxrsp%B^L(NWONtx3@&p7GDKC6b`H z%T0vfB1{MzZ69D zw-o4_nL*ZR`P^M&G)S$ZBxaG-kvyz|!?_;oRt-W3Fm za`ANDna_-1Pc*39J_=?b_TSF{Uno%qbv{`T$rp{b-x-LOlxlRmdsoR?XQ?OX;NVc* z&`{|e^0oi(#;N1{1PBErC1J+K#;BQ8BqM%d{UXLMCPub!lM<8dborZAVS(5|iYkoh zJcXf&Nw7@%$5K8bN&kO@LV%7O5eo}iPfu?wle-aJiEtJu?La<`CeaB2c{`#qG&Ceo zXF86EjSa)6cY|W1k{vJ-r|^fN|GmQ;X;2Rj5A&s3GTZgGQt29#5#qsmX;#$#A%i3` zA`v$Uo<>jn-H{zJki)PzA7KY$393+g&7&;}^^1gm5rG#>IECsZVtB7q7iG0()suYf-Jj9&a95tjK z@ZJ(&B?nC`1>BUp8Yr$Jes<5K=c}MS48jmnPszGx3QrXQvJ1n2U96)dP300)zS_8m zD+_)Q5=D*6j^5DGM+6$t7J)#i-i?*QJ}oAgBku1zbEA3q)#MrLdI7;NfKT~Sg$}cL zdnlN!=7_(%wefUz8a+4Y@axKa$G(JL{Qnm1M@fMK$_qdF>K$OM=6aF!8cFES*95=~ z(+{`J28gTxC^*_I8NiHG^{rX(4za7%q8dSsO}__zFO!>=;K!>v!|g)gb`iAOOFp!d zsUrMVfg9HjL_i6a|JXa+$4l(bqV&D4cqf8VU!uZ7C%eB-g^m`m*^h6%Gk}T#EJcqY zl`~ExwwwNB%{A-GP+xcydw2;2`*52(J&Ay%OJ6d%{VfiCk`Tm<#Yx`o(9vsd{hc9| zG$HF}xM3=lx;%xi^GJ5r`l0OfK)(anO|Jt2h`PG z?rva|d@mzfT%>BfpZdrc5?(`8@6Kb6m9qP)Cq|Nu>KQ)0FdN#TfXDjd6<_mMjF6PJ zwZV|I^|ytw6cRushzWzGs5jSOZ{$6&!0s(o`M_ab*PxyK?Sve_%g!`pwQ|${hS7Mw z-MQ48hk5@rn1AHgZJx9h8(P($pTpc|BxiAqwKs}B${Laj-`-I!lUqU-@hj#4IxX_e z-;`@rVp5O^f$CBfdCKtB7Gi}Vl9 z6A?GlIlC0tp^EP^`rE%y7NBdyDd+}hgF1=kV|T56!&=25XQa5H!x2i{+y3(S2ps_W z9*Oc59DK(a1}C*J5=xoaKa1CM8)%HF<>HF2%5a&;fKnlFN}3Z6VV!V2B^OF~l@i6I z>1y0d=oZ7G^?i$+0R=id&75oB2-blfQ#MfsjQ1alL`|4;;E%8$-CL7?aQQUQE51-I z_;Y<{lXniUNHNrdgY=>9s8zONx=#QD+xDjBDTIF;VlhW{{aKr8B;sP>99K3Nt*!Q? z$3|Fa5nG{?5F8tvD%H;o<{YSA3Hb&!l$4y$@{dVru%N<8er;cw9W)JYIXC)73TlNt zNHr-chH3-bCL|^Vk{`x3=7E@0_nl8O1O0q7?2*(jWmXac<~HSY+>@bni&C(ClOK8S zeJA^D+KQjuz)tO{3Y#1u<}+!aKZk5!or&)lrH^_B`4+@?Xrin8z6#_3#OXpqjq0kL zL~^EC6A3Zf;P~h$-1F`%*Zb*~dRFK74ll7#GT=8}zWMu!dc&r@ajv_@?cfmV5jY>S z2?#Y#U~(5Surd(zB~mVtd(A@>7?b=mgaUL>=GZ+A{e;(66NBaUN3)L2*81E<6)p(-O+jn@!RK?$Mzq?XnM2bP`r|}+fvNl znvTR(Utmjak+R)4;^$%e;dfcb-(Q@)|I*f~PB_PaSXx_u3YbKM4o2L6U3}xzAf_6( zL>2~fg#LUy2MshYDpYWsd^_dJ2*|R(X^jUatiaJ~3k@H<-??O+8iRu^d!gBk8z@PS zwSCmxuIGwb!5duue(h)|Wm!RRND?TqbBXWLcUFn ziOo=Z(Z>LVEmPcGS{?n}FH?)Z&yvMa0LiWPUJ#ww*6So5zE=|*VXlwt5qqR!g3Z- z3rYP!@_&uS7V1}8N`;JqqGE`MhmnsANMx8>T*QpXcqWM<;j7kA`WjPT@vNPX`dbKu zb6SuP?^3t38yZ}kl`^l%fU|@k0;9jG_#MN(`?j{WYU5$#u-F)dTaop!+Hlo49u^js zU>I{nMdX&xN1(pGZ`3mx@xa%9$5Zm&P+(qB=4ymBdBVk_G^ZISeAa3* z=4p4wnVc=;7tQ^%W-cCxCA2yM&H!^l|GjQ7nwU%4o#rU3OfBftfKZ zjh0jj$LDT&o4ijP?E$n#{JUf5*& zX4Q-e4ah$IB87jNtN>=riJIhv_J*4RAqR0G{a6utOmv04~tn>?1 zYmdmDFhIZhkjzJ`2~q)_xWIUqu&Q`AXfPC~W@iclR<^56jbI6s~E!IIZt6KRF9oXs0lkO{Cm)$<4FJP1%XIga6UL z>Tk2Po`=)s>*lAd@k1J}@0CF`&q|7&^?Wy2q+{}nMvU~-KD*pH59Qh%+IH7)}-#Tu2Z^pBBINRZ4h0GduG5xJ_hyx?CPR39T^@WAw1$ z2os`Nb9jpcUqn%uNY^4st0$I6OQ|EulFe z=Rqxz9#qB#f@CO^O|rCrax226es+q5+q8hl^7>Qs#AD3BSuW0j4 z)Kpb_TWjdkmd8z;C7>rs{=?HLJaROoH)vd)zmllW)XgKJ7yRP23o-CccVOA}ea_nz z)a}a($T~j;9@c*E`Y?X#f#5~R!#w>pbTO&MWBMQE9Dz6_?G=2%9csVjOcLc9_jVH@ z)f7>fjVs))lFZ1}$e`TaPqtZArAq8^tPlkl9R!zOD1-?0dj#Ld!keKv(M?`H#!?fUfs;jK)HG zVS}a{I@Yc|hw2v$}?DZjVyd=3_;R*?yJ9j9Rmb%}<>) zy7$osNh~D^CI<%w;yLSJZank#u-79M>kqnx%SYdi-!m0)1sbdw)J zG>pfr^}>2{Zw>EGO{Tl@8tJ~;YFMHR3+kQ$ESjr6B;4{iOSzo#%OBX55rAYVkgzs{ z3(c)K-l|eE%KRT`oxHpa_c{iBgH~0{8oK+nk|IHKH%5YXNV(n~#H1(B2wo#v1=rPc zsH<^T$$m!>rm%=Q!@6YYAu5$H77=1lwrsyI-;~OlfDRA%JT~#y$%W9EtER}=n~(F z3Q{oz06&74hfo6B_ajbX`4gzH@2O?m@eWzx)bZr0mU4dQL6<*0j8wY@K~h7gtx zfA{w}LtVWxxsqo1bt=kc06scuB;!OGgpS>-)P^`FQveq09={&GG2rb(mWBV0b zqDa8z`h^OnN|I-kEQEx18cHX6m?aUKgjX2Mk_bem0W#XnOxMV$VW||E!O}Sas%}4g zyZdt&jI}vIs2CF&-PlrLTt8A%a)c26ozz^CPFd2%4P;_*{sL|Y^E}P|4qYhPr z*3$M=TVAy~AKvF{*La*l&E;CO6+TSk0fijs?tGE_+*SeG3F@ZJ-HWll@`1;aUG#f&+GxrB^!cf0F;Dw^@V{o zuCB7g*eg6n<0A~V(a-d7c3HvxckAfd8C`a(vpIf8>gFN?hs23fnWc}GY3esY98UL$fL zSwPhX^z{PXaTb;3NHWi-`-QNC&_7@c&1*@`#QY;r+#n4F{Z`Y8ZYoK5iJ7`4OCm== zJ1I{CHN_LH88>cB`b&ZSc5QzX0(c?d4Gr`eJKTlR{*M%01Tb?JBY6#U;K|e_DF2^# zbM}#d#W4{NkCqv@e6}J%?6Zo`bp}q13NV=Vlpy&ve}ad zLcmXMlOu&F(jR9RX#Sl*x8Lu5tFJHF0PH`A9|Il393L?A=+ei%@OU<4Viq#2R6&ux z+NNO%@npBxG~z2ubzFL+?(da^lvy+e>gdGh8$DkO;_pTqvPUI^1O=&Ur9`(B5w9k7 zf=m+dk_G=x1SCIjsqd3-01L2UefS2>>mxJ zPay0s&BH}+V=fLGA->PTAn$znY{iZKb_}^UNuO-^1@}{cU$oog6141%&Q!e$LR41g z`^J2jIrMJ&243HIp4nP2aGR(UK(!OPho_JD{X1L(-T;gXK-6{O&F#G zZUJKf_F44ImGlF1=b&G7I#@jd{yWN3mI4K)_eZV2ezKs4A50$WZywOPJpW4JR$a$t zJMjh@nkNZAEb%4L1%#&PJh(ex6w3V)mx1KW=$xX$Kv!LpqX0a!|6EO1V7M|1%mlTK zY)sJ7R147dia>v=72a{=$>?&gxvKIoWCTO+)A|A1h$26+61L@M#gz9JK@-L$L=_3i zMRqKtErYsWJA=qW+_%krUL?~_yY5sltSi|N(j%l_Wc_zcnnURi0MLddvr#?~4=OJS z&x`0T!)0_>MiH%_=fY=0*3qwD)HVlyRYQ@_@+9#(iuE&gy~aC)t+DH$t$ZKb{jymE z36=ef@JSx^-9NnmAxlOBh685;#_LNF(D`CU*Ned%xLF6{;oGm>F-y9KOS!x)2$|vM zw!-;c{Q-w$F|=v^nQC^1Pf|BvM-E#zMeJSTL+7Gq#I7#;1`D>cFuHBEOcVHCQR2 zA-B_w%!T%>{we6F3!jKp#iKJ}cyrGuo!pUf-FXs5#Y!(no9u?~`@HA(>HR5@(%$xW ze=AS5xp_4H3h1Ow0`u^DKzw-H;q$R0f%q%QK z>l>m=$#gNpPZq} z26;njet%z)UfBEg2?|VcM`D%?bEViTg68I6=erOe=2sW=V&aHcEVGTy5bphoY0WXA z{YWA03mNTpdtCmpjUeANnXa&X&2z(_v{Nn7bZ0s*7}Nw8i5g}e|F|=M;YbbXCz66El<3- zoH!4*a|xp%FDc*D`N~juc$SSWnmWvL48m?vObz5wcndmWg!3Fe)B{k0AY+{fy2UoFkmmS32p?ld~hBfl}Fmv3nJ=Y264f@GOl?yIeFgax?$Uo zkj(ixdkP^sLgxK`@4_^E>eeKZieZpymhz#-|A=oT*kKc<^LQ%EasTXmAp8nF#fm=V z$4pzW%2Kp5Jv2czImkVPwx9YxnDF%oj5~k0f$6;>>5XN@OyaEfug4{s3}6hjePXrV zGXMJ49%u#+>FM3q7Gs)UALFj1I3XwHn(i0v% z7hy7xw%D!8PY@QvW=(tFoZrzigyELzjG>2M9%;u3kNX5&H`{$9OLgkyge7j)8x1kW zjV2LEA(Px_hiGK^CX1oNy{NT+r1(V#6l4WnQc0=7qAl1R5d5*uw|9C;z-6&2Wy+Ih zf$J^$+i7ZJw&!I|X?IF(V3gBHdZ-TN*Vq3k|0l=^@Fafk>k~c-7-mx8QoKPdF;F9r zO%uByR)pNqYBbQ*X7nO)vp?4Ap`w-3v2kKOVn@hsyJP8qbpru$l8%&SrbAD+(+7J` zk2Y*E<~f7b3QUIvF@J!N4H3a*yKFA)M?q`9e~)uJ-(BnL(@QCZE_VTS(yG&=bc?yM z2rF8OB#vt5MI)=85)@>N)Hhn;PCM538Bulp8NdC5SCiK?Xs2%kMLb?uXzaIX>!1(y z1$`*IcT`#!LL`_)VkF=6=M)nHjBg=v!p1xAtE+25R9Ch7>dXMU*lgn{xu=ULYdBuv zvj|3nmU`8)DnW}WZWkxZJrVmHsFP}sk^gCmaulJ%*!dOvMXH+1a?0SDqq*|+2F)}0 z+%QU|vtc`hIPe#+Us|*hIJY%QT#nyoaJ?edJeYNdZJ%#m1=4bGtsKODzA`X2h4EQb z;$f(LO|aVl!8<+MxgQQ&jgAbmTV!43-aniw^|?fvLH6SC_v2;2zeI%uHUu<7ie>NO zb>}S=V0fhH_S=Q_rliyKrSl_fI~uN6=bC=)I5hKt=6}1i?alwu2;zpRYaC6L99Ulx z%2E4+26qlSy7Xl%hm0)ivkq5o<^o;D$eKXJk^2o;WfDiPa-)bAt2dTkS5Llk0R{y9 zEz;|)Z@MokY$)nmF9(`&glIHvB*)KGs4HLi-45X@E@9U{Qr+#K0 zD4Nn>{=tHh{d!3i(tIA=;Da*8VGqTE<7s%iUz);LfuZ?k2>F_BKKG!H)9^XL$2KBl z6mtyA{+$!ox4~HHPS~Fl7oX=xoEAPW8*DWkrQ9mGvg(?_hQ^%dCbpBi8M4%C8FW`N zFuE?kt6#KzZx!vM9Wuc_8yPLll7brf;(nRh@FIKt#+s4oJs`a zB}@I<*%dZ>2?X!QIN^+wpLgaq&jb8>rm<7cXJ=mUUdTOi@*8Bb)qy01Q3sM)Fz0CS zu<&`&^wgE=CQl?&EZ?2gQx7-aPeP^e9dki{gUx?wXMaCxmtC~-exs8s^Z7Jn=8`fI z4lXWYLc*MS>>g!dk!mART0DItD_+;J)uqRJ>(1Kh3-Vg-m0j#SOMPi^@C6EvefyFdEkJMXX)dHR zlSO(@^&7y=0zJWSvyR*--I22-S8NJIWxP=P^!{48{sFmYmv_^&cRy!?NgKcL?w zF#anJ%16!z#vqc_svYu|$sg?O?3z)~&&zIZPql*oH<0S<@81G;exGwHK3~mKGuLmHboO{{}upL_~`%&NMga^E?C+-o)~m(7;Yd6|BDQlo@Wcs<{UIsISm#dQ+}L}rXLP1IT=w^w|0KmXC@e` zgaQOVwivk|7#2dSIwMl|l-HFrIS6pG)_)AWanmcH7NJuaR#E1J5C7hvzaD!>jv7Lq8YQmu<2lNAM@$!Q} zrpQ*CykCV(t*B3mx9^|oO+=X^r&KBFr6{Mzl?~(Y9hM8+d@^RMqHToWWv`giWll0f z&(03w!vQ0Y76+PEpfMI#1;niilp*J>ig-g?98FFnS3=!fojR)l25j=W$Y*WZc;xIJ zS6xqa)LYT{RX&R)jmpy*Vl`4)tb>oXp#y!f)2fZcj%9@O$?x-BA|1FAqSOAf5M+WS zIQ#EvQu%q9fo=A3+RZ#Zpvn{nnfl!D!6#w8tcj;PL!0VF3xSnVFdc($acNM`)eYa>;F|9YOmf6%Irg~iZMT%hR*-4Gq4hW&V)5-e-!)DbRjGVPD3J%>iJSX>A@|*O(%*YBx$0{*H6B8o6X2r~pfU7@XwM+`2*;V(Kl=zpWiDWuT1SL9 ztXQOMA_eUf3laf9ZWE~uIBPEWyG2(H&byWNJKTZS!6y@dcJBJ8iav1DgE*-h|!?W_d?3D`?&1G z^0#blPxv)`FvT? zrM#N?C!Yy^XwM;JRX`Zt+>q{e@D)QCzG09|e=EdEbG_;zzKx@)lSfi*K$*~=w4i|X z+^D&*`s~g;Iz#sK>Y8#ttQ&-i4uYhMpBCzn{yLGaqYy(cG8cc^$#uHfuFs*VdBU`I zv&rm%%0-OnpIhr4vAYBtqBbkF=(KHvPqU<`@=P^t1kgJ0C)=t$f;3Ic=RPUtuIX5o zPW5IRz5ASW{z|){)i&yS6hc)dMUKDr0J_t88k97;Htlj^Yz^h1a$l1oW#WCWyAWEX z?|tvF5Sk6FOcWjwM;V<8Ls(I0?lz*N0WvR)PlH@^X%(nXBJXNDQiiSDQ*Zja-Mt+a zSX9+~%$)adRMl>4TO5Pt6XyYyJmXa~8h}b%17{PoavHt57ROFEovqaBE5qKANIkMd z3=2fcD5yD6P+T3h0KfcvBP^F)djvH%`w*c!2P)(&U>pDL>e?DvP=c#e%j$NG$m&XD zdh_J|*w%i+z4z@67QG@RT?OsgNbyb6qml2{GjV=%a;%+WD8lMyUZ2BEe)H5O;n}g; zDMxRI7Dwk`Z1Z3@LsN=0Iyuzt$NI+IWm=AL-Wa#BOx>v%mKn!wQ@v4oY3b`@$jaoH zkKavBK2#RKAom6_G_M67+r#nQr#{_@VBT$X3~MVz>aO19(z;A^u5K4CXZRmjpQ-DE z-Cb8PG{+>-H7ELT&fFL;8}|o0bbtEZWO5qav;{e{-u)#ht1DY;Nie(aM?(rX)IDhBn^6$kpLt*vI}{Sx&FR-x)20(Q|kbTXvez)oPaNM$$g4IOnW-tXw^4WQOTB%}O6x`uGsg z+MAXiAk`vGWur60WZNb~V>?cwTGE%yn6R?iAMtY;V>H}&YA+Ka;)UU5-%Q&mGI!N( znivZlisLPjj$;%d#sSzh8O1c}F}AUhjl*G|v#W1_*yv*8bT(Q|TusKWu}y!XBv;$v zk-poZNsdH@KjPJQLU; z<90KE!G~sd=B&1*He)_f4Ny4-6b;&P8Vn7crQzd4+9ir>L_3c$%ncbt6XJ zZh^cHo{_l}-UJ#k5g!(|D0+375jYMvO_X`OonIDO29B0sYbD>kXoLA&fy5b9)IBl; z-eB$~eTuIOVOk2POh;O1M=Ls7U542V2tmagb`Sl2p=bhGu!G&?X4kinl*?>(&F@BE z;WAW>7S0A1eVIX7_|PI3MDH|4FML=&T%^$rn4O>Y9UJ-II|hrTdh8D{y9yd9$;{0k z5LJhTD9)xQChIoFVi;88q#tY;Gq1a1M~KNSsd)^x$&JKYQz9}@MHwlvFta-6YAsS< z}UzuzesGf_smCwI>G4qYg9DV9mmCUTPeu7Q&FgUVhpq23UKk4wi7+ro< zXPSi$G_4wVl;hr)rBW_B{m5j}$be$=Zk*g^sz&0&YLy*a`R({Ltc=0uD>%b!g1&~I z<2AcS*4OpO>_r4yqcz-&`xm@`(?u*zYgsYtLnqP|j~-oZ!U%1X;iyPztz;}GPb2F$ z4fSK3Fppt9`0{1o(OzdE6sMMNHQ{D!ff+Mr za5-E9kjc@#96k=noYFrPW>}DgJ%da~RpraB?Qp|7iR`y}H>RQI6?xN-K*Bg3G>>Mb zss_-|sWEo$=j^P!uW3Q)51|A+$Xa$7j7bhU0fHCX+jN|nb2;i%p#5zQyOWrwbwEoGZj;-m`CE9Ub!>F801-B zYi?MdOa_S#+Yn6U@M1M&@O$q9xeED^6KiwhPj|2u#EOaXza+(lERMI@-#Q|qd&eK7 z2rBYY%c~ozFEtR@C(d**4klEULi5R?q@`*8ppX?t!4AMRZif{S-nRk#SVqO+g#Y2m z8npDoNbxP9=T`MgFD@8*sc|Z$lIiEDgoa9dk0`9Ld+-h@^=+6n66-Rz^Zvt89)?`K zhn9p9ISo7Gf3-M#V8K4%MyeIwXPQmji}KgzejFigxxm^_>1dA1zssuOBL|n8K_-IY z1KqI4XI;dIYA_sBrgtB4S0^-ns8rzENF-?wL#2l}h=uR3_Y`#FU=L|F<-#vE&hxSL z?OR>|0U&IQK3=#35E{+A-Ru@ZJtfb3omQa57DUGk`9Z8G0@S%{LcgIb#5#0+?5s>d zKZ+dJ(90NlG~7?QdU$XSo;;Sc%{7A+22}RdU8VLOj|>nyiwqq{thBZe%c_0F>x3Mj zZ)_9y=2zg7Ko$qH<|yfJHiVnI%X)}|MZH>;n4aZzocvT@r1YMH2pOsBCyOv@WY`cb z2U|(ax=+MZLa8VtEFVKlml%JzVMc9I$X)CnDFp?I z5MPJBTEmClZ}-kjKxo!Xhb5Ao^f8Z4i&UMc!%A>R2;G5hdhW74#(E=&(vsoRFw6ks z&>+}5N5RYVMhurl+kxTe_TANYVnHdt8&BlbupY=2boi{bDhK_sIxb$!X$CYoyRGg& z-Pd*^#9&8zsBEuRd$F55Wc6I>c(_tc6T90+7~bmdRkWzz?b&2xG(dLBYDf4CwDlm6 zcr*YI^!gqzq5%kYKm_S&5M+^tDgqr@^ND3>_66B$1SaCO=MIi?alMT0M?>IG_4uo8 z$BMy`Vvus0Q4JjpAXqe2)jCX_O}swoAc-08k)}iDw>Q?-x+^p7<%axjE@kD*PD+S9t!qLF56RK!tJ$yU=|_ZB-m>0IITnQQr+1I%eu)FU&xdPrJSc~205ee=`g`aBVWxjVD z+PEOK-tn7hLSG)=+i_&eKL;zWJBB3qI$U48@7v{W&1=%)c(X%4ZsyocW*K(YWcpAr zNWH>Glx2hEPjq4{WVcDKjR4)Vboya)zNc(aJd@exJ9VRXoONUf&C2!o6~lA&!5TUJ z(zK7;#rE2*m`4Ry7u_lX2y+&es_jbtEQnDE%x3GA6mAqwP|ey;U3pfMDUn(<#WNTZ zhwGhgbt3gBqm_`ZG!y|sRKe8>G~FeP>S`UDs6}*b%VwyRBRG(^;2ed}g}t$fxV*r! zz&`J?u$##-_mR_br#C%P1&}&Byt?xU(x(ws*~#!dPo7a%_ZW35ISlAw2jV1(X5NZ> z!GYVd_lQaHwhkXcMl! znh_9mS70O{wGwg-2c{2mQrVrwjzp)Fbqh&UF#LbORg?f!{(42#o=GR0`FS=JG`Mn7B+_Z#4`!?zGS4g%`}H!^>cD##_Ts4tr^!}skI zJ~&e|2dr+@3ZqOAJZ+DGQXLIn`G1Os16L;twrDcEy)|j#%%jNgtpnr#_+ADBw<{nC zkXizLi$-JUVSmVqKe}jVp^6@qhQ*OjzZcbBPo=tF=(RQ6tl`3$uBN(Xbmz>qRlZio zc-Fg6tzimU40OR|#6HSY9#Y6im`G@H8kv=@KQ7~-w273Qn1_sgXJW)@LV~1N+^f0+ zCtXM^O0>v^IG*GSHOoFpNPE?cN&=#@maf&ClawsBe#LOO!{pxFOO3;>Ca{8>`>>E*%t<$*GGoWq+F%P3^n{x+k&fnE*GrXFtxd>kGp?snMZGrjsMLm<5( zZ5$@4hc_-?C;!0DA5`Xf{AA}?4WA9>w!jL*lQ94G0^s6iHRc3Lc}5ey4T_`eF>q5- zQ@udQZhRgHD+DK4Bqh&pOXu-~y?Z18b1q2uZdh8wcY}UXeusKg&Tr`Lthb;RJ9JXs zY;CGXS{M6OKO1%Y0iAZ^RHFm3&dZKUsDq`rmPdz_tXRPn6un_F@`y%z%c#;Hw%7It z>${5QIwK9wTa1(5_v!?;!;cs03!!)V-c1^uJH)tF6ce>B+ZaI28atUP0m!sBI~9gp zkTtJvVa~egZ&lax%Dm}^1~8lfgQXBa+s4-dgI8V|Rkb2us1!M$_yJG}d^CRGctluL zjrM19zj58wRa9cKf8l6k-UFcs2@LSCW)7+U)ty)#McI205!VC7y$Q{c9rA7F9X&^) z?#ZU1KG)Xc5n{bBS7{%hy?b3M6ZR~yvWI0ib@{wUf(J2{WR=^jD#}sVe>y@Wqoa)k z3zIusoeis-9>>qn{4^i~+a+~~o6K@xK#8cXl(MZ##e1N-iF4RU5P zOxPbk5>4i;whl8yM`J1auFj6AjzLD3M7@LG_~8`~sD1L23Z+x;z_lGgX?z`^tqIoS zF{~zM)CpcgZnloDuD1Y{1+^~35#LZOke8uBP9pPxj*%)?e>^toTl#z=N0AjUEbU*1 zQ+Iy|O-#;=AC268Ak@KuAp?y-l)rA*i>sF$Kzf1)p6{f0*P`;B4YQDt%Y0Q80_8bO zS<3fMeJ-=WT+Z>&eZDLhm|_n0?yYU8-4yDqWJxb8=##Sakd!VKNGM|Zu{a zcq*%vOMBg0thD$3-C{?|{*@;MUfmzg=joC%Brp>Yd7zvZ$@(!ODExw47Nd7zOyn(I zYr_#5D$23{_#26Q@p2`G@ogc~Qwa0Z;>78d4(-O8Mn|XdFBc-S;z@a}5QIc2dG*^s zA;Ut}Q5|1KrV8yw|8WG+vmDVJDFQkM<+YE77F0DYhV;3WVWU#aGz`6@iOCVWfvh^f z3>Kn)9@r35;gx)bAFzk6R%kDf^h_`>JVa>U@bk}SDu%u@Jdh5y7B@MeA|nyK#d%aq znMOI88nt#!>-UKRGP%BAD!z9x_*v|b-CNDdH_fFO>dv0hCYS1O@Y_5k-Zf0)@d;Uz7{Q zkcdf0z=`pcFca#6>U+u@hTX8Sp=1W(?I%`zG~we6d6#7MxyYxKzGc-~lHpgtbwI}T zdfKxq?+rBofM-hRQ5Xd2i3Z|NS@bpM^~hBeCK9amf=A3GZsXrnfk3QfeK?Eo4h0_K z*#frOU5O-YSvZ%*GnYul{#_)nX(;Cr8BzE_zo(;4e1`heOZ)?kO$}5Pe#Jna-AeA3 zmy`PWRd7@~eKNYr7Ps|m!6qAKTRr?Sy^H^NagqIcHEQzS5}dj&-XethQS8BXVCVA{ zyGFc>ALA>B>HkO9SI1=;H0?@vceix6G)PEGcb7NcBjVFl9Tlv^8L8(=B78RnP7=5&uwuoDE`I;X-B^^E=cvO ztVr)sM2^w;Q(Rr81FvbMlKM$WOpAvkQ%xY2lUSoH(FO7JvR<&8b>nrbF6SXh12!3Qs9|(>}?}W+HBfvO4dt(KR29!MF%oabrt7!lls#l6M?imxKsi; zrh2FuN5c#6ZAMKueV;$DA=C0W+>31ois>iK-}!aiT8r|Ee;brLeS(LwBJNGwC+fOA15$A!9!oWi zq}NTUt$BL_R*7m0)FrU1zHO%?hoycuIXv}_#>n3P{Oe%2`SYiBt$2j6@tlH11C%m;uWHzQcC0qjHC7;S%~3KS)^mad7+=H z2JA70%9d`B9@rLa1!m3t zI>cjqD60ueYwS>fq!3|_2WygN2(4tLv!6Qip}fm{K0aDhJgvd$r4LoMtNJ{x`z=%H z&1{MhA$v75zk=KEhh2UryVa%0@B3*UY$s5E$;)+my+Km_)Wa_`S{^L+=)V4~t^TI5 z6ejj4BY>n1w37bW@z)Qy`H$SNBH!C%rV~>(eC2*En^qO;6Izg-Otgkv-gk5-Oq512 zws=zFMGAEy2P<7!+2mf*y19ZjQ?oZuC1T)v`tJFN3WDp%MnkioO&*MEaXVc`yRRzo z62{sG$U3ijHSGmV`!DMGgg@iu+@kh=o)~qnIANL`TOf5OU6X3zf;sOEIUPr5aFH^V zgD{X16b-2rCY-~d;9{tnkYf3;a5_R=g&Gss_gEoYtjfcQGSaOjXoA&Y{S%Vp9zjdw zjL3)6MEEY^+z>m2SwyiLrjmw_>%h_{%@tF6Gb%BqBzlVth^a488(`fY^6?Nqkgam* zhUq7MG0F%gb>b7==SmMop~5Xt-qpm{C8ot(~b z#`80v=UTld7h=p-X!_pj;YD(iFgJ(J!^P?k&BGg2Yh$6K;qc{4$d@|do0czDW-HY8 zueFH}E**)Z_JeMnVG9s4NtVpk1uxp`%F=qKToQ;&(pW+xofaJSfEe%+cZi4l^fbFj zUl+oMOYXOtnc-a~gi+5EQeTgv+2&(O*ey8;j&+gy3#}kR(gz*(6nL4^gs{J-`F_6} z7h9{$)f^S3-yYRKJgE4LW@8W{xLuFEsN)q3JbjXJYQ}>B*q1*F+7lXDeCOev)lSDn zYFklgGGL1Ro!R;PUFb?yuzGr%*+;pjPx)xDE}fkGcjWYA5=P9*8XF(>U}f*mr- zzJ1QUaG{}Kb=H`djudu^u}#h>jE%wnwa&>@)y6DbIsz>o9Wfp1XNt<+>!|UZ*&jv; z_;bW{mfEqV!_!li(*gDI#hjRH{;Swow))GyOd+4X9JQ9cBE?@=Dnu5bS<#3|XS>B& z-52Qk^rGqu6fw$eKd;HhlIT9Rei!UF;Chlh*e_YF42n#T9TES4R=_LEW{<>zF-D2<(IzueTpRrV5o!we<5^MCctYtcsN z`Sj)zo(b7VDVy?kFF>v}8Q+eQR<)_)9dxvPNSwY}pNo{698c5SJN&tz*z-veBVx$| zOQd0YbE3w%Rw?IuAQ$sQ)vbxoPD!9Ns|3XqH~1b@Q59rieSB5|jD&u#%7G0Mv$-Oj z(l~JmY;UcpCtJ{*V0U7p62_S;wfNw*rKt-{Dm?p8-8#`yz8$|}IbT?qC)AJKa4IeX zyvu{H;q@BO;-;Qu_B5rO8kBO_#sijm$n_r+bOJ&Zq7{Ze+Md-mVCF}#9B;i7m3U(S zVYo&-kbWvdmv+l2``SmU{}2Yun$v<6b7uJCif+*RPD&Etd;%P{UPs`)= z8y*8mAqmQJGOkO)Jh>54s{rJpR9dccL*n-97wor+5gzr0=f>J)mfJ6w&sp}Y-SEPX z!?$B$5wRAq$I+2o?6xRf%@ljx&|wLlLdl-|!h+O`7l!;i&~<_8!D(i4O6U)S4PkE( z29xCYL&__4O+X?wYt=Y2zhcEu3LOq}I}>_b-k?2`gqtoIJ8+KlO!7pY7Evyrrwrisv`*1^UsK<1na*mk<*02383D!A5ff-+XCv~4G-PSzE zG+2;MhmU!)lvoY;XqL$P-RQTO>~Vw4W)U;Uxigrq#AI)i7}`?crqot-3|@Tm`A^}J z=q2=x&EpE){dYc+tQdCYg^V`J)CRVpj5J+*Q`fLTQZC;N zgSB6kNUb1f&6}{6)HsC3HN$csx8{Fn*Lc#-BWSwTB$G#&2um!cpE5BlREz^cBN}7) zumYQBv)cCZH#)dfgi(HV;tOY1;zTOATuaDKeit zYa0AQ-MN4W!4DuppsC4cSQ}g|MNBy@&*lbl_0ZW-BKh7CI6a=lZep}KrTB@B)VL-% zK3ii8pTuozsOjz6dfT`Im!}zwpEd3xib&wlj^tq?wo+7v$!?*bh18KV`|~mVUcD8b zOGBnH>Jqedjsh7I**WRmGYFQ~87ZQHWW!1?sGduo8p!@f7Y%LSN+H>s{0tl7i_Zw& z>Qggoa||D0SKxC$?@wP<>9TU`(M+^3ULLPDcJ6^z{BW0F&7b*2|Htb{9_%7Uisz!_ z`Uk6z+L{TzQ^Td$E{#GFgFC-c&wZ=EP*sp#3Gnk%2ny=inFF<26UB0PH~04=|6f-^ zahjj{PDwKSJ&D8Vba^c!&oC{s{FvFWuU@#V{ZF>KxM_l^NXkE)O>PPNzoKaL>9d!_vZfel9C-6 zW=7Q!y<-3G4NP()vdq&=nnyo4ruF#z%5fs0ctMb2>7S2^cqV zlbTpA{*N941Kh?pxbK5OiX9$s!pE91Y0WQO*My?Va|mBW>6}kF<-8MGofjyJuEF0e zjg{nTSgA2RBXn22AOW6y!N9=CcNCG}A>3r0iudtEhM^OMKvWKZ#IB`;Kv>=%@9xPw zaO6=4h`X`d-ISc>F~wTwT407BV@OQS%i^Ij7aKjeK2}mS5%` z+Aea2bM0nLPWuv7BW2;Zq;5@5*KmC6oP_m)QPcG58aX@X@^c^@ZxQBGoZSZ|w}nvw z2sioftxsBBzt^1i0%lZF6coNHR9enrJ826Nj9-S9F?4K{N2!4aVrOQWHvA@OS zRb52+$}Puqk|M+10Tf_h(753t>l1e+MY`O!+Pezji&3;)?rpLWbL92?KC3efe>H=v-Mo*-buAjUvOGU|*_ezt)MnkX_6;b6+M`GYsriAn(R zj~P33%lcwtP%&IpN<7i1=^w z^qh@`kpfbK)5>n_<3W>yR&|9sW>a!h7K26LeWZPUAy87HC%{DXZ=zYMlWRvu^2HKS zA^p;Kb)C~Vv=-4RiuDh;E=NM*0X{tnCwAV6GRfT(JJVdD+sfPGxMNdLqi-D#O=%*Mn4&?yjva1#6O z^udGcAJMScjJFV3IAv+|boD z&ykNP{n_!qnYu<{=GnQ=5zS8j4gLFjEVf27#gd4+z6}i2r2aiH3mEuPlO_!3+vFsMTnf|V zy^&<;Md$Mq=blzO=O)B|mIk~BD!4P2Ju`k|B2ThX2T)@ zL}trIAfuz+*u~)9I6i(p?93Cp+4!W_*|V!Za7UkbYT7VN&~qs#H?r!P+R@+Senruk z^?D=+w3GE*Yw{W{wZ(Y<>fjr_po$7 zFTDMOLPA{=mOIp-rT69>LgLBh_nz3VB>NwTA+8&vPj#oJzpA>*d60PAI zsp;JyR=Eqe`S?pSUcU%4WJ{#hxQ499`%XNZ5^}reWGZA8{*sCH$dEMf@h+dAh2rjR zQ=k=d+-?uY2cO7K?nP@!iuV8~$3Jxr9HVpGiSkGLRf^9SUP#{xPQNqSgN!cSPkKv= z@gE$}-1>(}X$w8v&u?n9IL;aST(iQ8*L*@SE=Q;|-Qb8;@xyS^A5Ry?GwWQ+un(kS zdav0{=G0`miwkv6ZZib-9&g8Qezv#pahr3cWce;fj^5t0Jyqa`v9b0lj#Pc?L^of< zS9rf9#8O#=*^{Bs|5Kv0OH<)e7|Y|YE%o5lbsls!!c?TTo#tmbdM@ zu6tXqD(Mr)T@*_ebwy#0;EoYjadOQvuc?CJ*AXkzgoU>Ks1eENQ}K$TbIA(LJ~v7R z`zy{B-uammgs$!i=_a!doc3-VDETzPs*`xFT}Acq30I%G7KhAS%I>JX@Jh!+h(qwd zc#4=74c0{}s>NE0<%yhG94ZM0^QK9qKrJ?FC`>}nPPstl6yjJJc@fp6@y1dXzl_{> zDHzMrhq03Q$cBp^=^z+Ed2e{QQbZUMb$SL*@9v`~A;F2=F^eNt8)6aU%643%O}Jlg zPt&`7wq@i!UX)v^t8FY8L|J0g7yK9F0*)YUDh}+-xxE*|8l;?CP3K+d-Vn3Nh)(4j zI>?0c%NKVrPY&xr0)nsj|zeC3mxTX+0{EApUSa%;m{9R|x z*Co8(r`Mv)mlJW9bYF(KW4h)2nUPP{HP5WyEQxxE;MR~?ya@a7TimhS=CHgHl#Mg_ zQuRTfrvDh=Ken#`@(WGID=c0mh{0X9$4yj^jms3Pp9iST!DK!{E;p#XpV(LLe2~N9 zd`XQfeaYL2(Be`%20$91W!5O7Vo+h5-*sxC<;Xa>LI;9pxKeF#<~bErxuMcU6>1pjkvi=iKM|_15pZi7>VaEGrZceQ!1$+4fDV-Z9VG{(M^OWPjw8+|69{f&v ztWribD9Y9XG{hF3~y z1%_!n-Fw`(`WI8jbVmyRn|f%MuR`j z_LDH){x#ZvQ4Jd-M2D%h#!PWXZF6&TL`;lYXK)7dyLazAZcg&W1}oltto(}>a2e4_ zNIn!5QTy5H*r0H-Au8up0aRsX^rYI&Oizz2mP_5wwsv#l0c~!gywW%x{ig^4+(9bn z5db_*eCj+sdXUf$>|9<6*zR;CR7nVHKF$Di&}w>8jV@{i+2 zyr(lt24qRcyphxD-)3T1$Xf%c;EwaA!!v6^)0*fzWkPW2>rr7)rKVo2XhkAS#Vk<| zFa0uFU>%dUWJX3q9gplwK-Wqgf!`zMCaT)5nsB_6-W*m$rF6hehu4Hm-_v6Fi(t?X zrPi7|A*nG;YJ4Ukj3J4RsuUhzMT=2|st{-3@Mrs13$XbLF)dLv@@Xg?3wi{A`hUSg z6m9&6!z`yVWwAL5!J?DnQ{0zv`=KQrs1w`5rl-TDd^%k#3aWJl!!B)D8lP^4fFeff z$1v_zsEL|55tsLRgoNI>V?dJv@=e1zCOb>vEdVXOmg>LmoTp4h@d_;Afl zhHib*9;c08*-A|D7eDAm;Y_#YJ0|9&xl_}0*5~@69+aZIZk4)3Uu+R6v2Tv4q6A?c z8|)e0D^=ZY=OlCxv+1~UP#`8n2H4HTa?lfU7XRmbT2Pa3QPR%Ae&H$6wV>F*8`XlA zzv~=x;51R<+uh3LGbrcJ&}9BuV$SlBQwUwym;cMrN-)_=wVp5ey>$;Q1(j*Rz0L+b zpo{LCqid-7b}ybgwXb-`qt>6$h}K}O*3W2#2|M9+;|zNq3wS?mf33Ap6Jh#}A7bzJ z7?oUDq$LErG^U>@;Rcu+ehpNKjtuBrea_l^kWZB#Ki(SCQXKLvi4Fb=O8uvX?yL{q zwVTtsj-J*cqrwJ7?-|Ntc9?xn=bo_ED@!sCB6O=I@``FmXY;?&{qq89tplsJmYQyM zUmmuqB3%Z#w43S-n~7syjb%jNup_ZeOs6S`@?+K*NLbIjxJmIST_&(KNDuOJB}s6* zfB8`_gM5?|v2=`nH7S|mrx=4x7Gr*tG|o*}!$5$TZ63E;YK~Uh0g{WXb~HlvL07#j zo7eXz5_dDuigu@vd5FKbSkQN0EDrgUHcQx;fzn?^Gjh68QO%bf596rg=IAK;H9dMl zcpoK1?Mf<}2a4VFz?_cvogTG=tstSCn>0vKMR2T&Bxuw=+_+~P;aha)2fmwv3?;Gb zD0hCS2NDc_0mXMOaZFQWZTcsEVQ=gbZEaKD@2K}#WOpsQHDX{A$E@qPvRUb4ZfU=h zBwb357>qC}(EpUu+CmsT{sFrd9b&r8Ne7;#_dk9fA@uM@Gg{pG=)&=Y&2zXGsW##H zhrI&^@=Xm$CzUUojj^^9B?{7Q^#>4`e(52Ko4g>mx}*6wZx;rM+#*k9m^5B3ntn9Y z4{oj$s#~wYns4?)@zc5$Zt;{Qb-g0qkL?-WtZVW=r%OReFqz(q)WR#3t{LyZ+z%P= zT3WGn;5lR1Qe*)z8U;-|+XtJX60_c+{x^@U4M8s==mLjx&pLfhA$4si+}1zUQ86Eht$1#jp42ox0+7g zQJF>?EYITR)0camB!UCf8d=m*T>W*nyAW4buP(^ZCA1KM;z811l zX}2Z6JJ5l$y?1+!^5!K+!%D2YK&WlzvzT~y8~@q;;K^XQjT+KfaJIj0!?{r8cU{vY zD5fDh`@s^^-n%mW?oa7_?PW+oKEabk>drq9GUG;hEsP^-Qg%K)2*>&^L(ME#kk`7g z`9Q%L8Sc^E*fgOPxhb3;eV$9;ui+0O;uVwG{24)Zin3~7YOY9pZ{cCTV$o30<4ag1`@mU!W()Mp2YQjl; z;ko_drd7lbUsJatDj_J*E-DUpME~u~98_$aK@X0D{bRJ%SLYX$Jjg+Vs_ybAHE_RZ zK%_gYMpmtB_z8@6s6bszL_`Fel#^0X{x&0Z;qD;xKXsfJV2&u`JL%rzP{eE#w(mM% z@?O@lH)-?e@oevU!+XyFFRQld{SYf8&+=6GoLp*7=O24B@Qq5j)mk#&FwM(g5-NG132lxB^1$uR2D>QeJx+(}sfnt!gW5|}X zqbs}pQvmRR{z^E>96dUt9LP3P>zvCg`Er!Uoe+2V-25%XKSwb@2jTh;VjE$(o#ih%Bl$vvkS9LgN4dMY zEKpx==)s_0|Im`xXwS>PSnh3>kLO>|D@q2TkXxSdW3t0}*lmU7E{ySv6 zk@Sopd7%ts8kP!=s_Svzh!*<_TV|+5ZJIC*%-!^aO;vBdVaMGI`tN!I?8xoh&`hw06UM2S2F*6>#Ai(_O z!4x00CUOhQLuDYrN!0;q>SA2ZD`ndplk7{9E2|@Vx1g`pcw7;MMk>ICFMx}q=^JB6 znzqlIB$a9s^v5-|fXon9<+fGTH~JqiwYNrV`r7F3B-z31nHqFVOG$H!`9y@_rEr^ljt_m3eo#cTv3&&}L`+o1Ey~tvg``;SrN7!c zPLCTuHUwJDm63|;UJts|6_%$3=`?ksIfpCsgdM>6x1D9qzcQy=U8?@3`Y_-zvb0CE zN(2?&8D>sPw#J^Ue?w~OeLe7P+cMtMhQa_nyb<-76XKvoB&Sgiw1V{b{yCDna~TUR zbr&441spOuehAmx@+e|3{V3@lyxT&D3cd2nYl2Cqr_44E@803hwsRBCRK{88OPg+V zEX8%S;T+|5O*yV4-oL+yynsQr z(LcA^lNM`i#cM~eA%FaGRdPSlQ(EOrBypwz2~p_c30X-b;@7?YX;0Hp8D(;w$)F?t zmNWj+m5|3W?6n6{SxzQz` z%N8uGv=Nu=<*vzkKndf8j=?2+!tanww)U5_7Z-h+**lFaI#W!1Y}w7aWtnnLUTPT9 zO<|~F1#@`dEOBL9E>?|D3V+xwZGg-oc1lRD-j0*&zqL56#6C}RV)uve_xBGDl2KH| z-Jh$eIhzM`KD@d_34;GN?gCRQeHG$0x^>${yTiU$%*k=fr1&q{aU?_iWCZb50%JP~ z>3pYqf}XLm_dT~H_VAZk0*Hny=wILIn0*bsgz^pTdXftfDKrhO9PGfn)2v}^^JY>N zWRPyUQQ*z@x>pL})aDnzm>LsrM2!w9t9pR0KOTgi+(kpG*X2WEweh*(OO5f^u)grz zn5fzbQl0A;-wH+Q3Eevo7w>kw71%+r+~L7y=xorJnNt(C1E)p+M;seI;@l5O$ouNY zlEk*9wHQOjmv>`ynm6`}P~GLnuP7AGV_|evLnD%N5s6Tw5t=5XHg*7$q?omYqoRBLdC8PwoS4alIU*UfeF2RKUJh&#vakuN3C=%D)Xl+8K zxXSGeB_g2jY3WcD&rUB5?Xie`xZ>Ejb-EH?qM3uSHQr4X4^A&}lUe0AHjW+^pQdjO zMXJLKSy9bE8gql_(G7Pd-FU|ky>APfBAHNF@HqQT{iK|XrLFZU{^WWMqi0sVHB`>CQe&-_Mm4Y6{_zn{nMiU-U1?fdsIg_Gt@K z1|MQ-p5gnwQ&)SO)v=F1cSNO2q?n%UOsB0?pjfxx3E`6d3P=rqhHCZCVw3jaZ7^tl zXgXwsC7=I}n-hzf#Yk8ofddVz8P;A(RWzplmXZ4Pt-?`aG2gnSh>7e;g!Vxi! zCWz9v_8Subk){d})$_#JhVOLgcyIcCdtZlrl@T3oSU*`5(06X36thQQDn=46$Z>ea zl9l@l5!-w#j6@?)Z(A?=K>CL3&ldiX2-&5ZIr=Cr{s%}^H=TATippyi_!}tmVO)}x z@nJWuEqE0T@RB4y!p_G4KdYo!->8%+#V>b5Tcawwhjn!qF`c~;)oG8E07j8-Bu~%@94}V6Y^VT(Uz2|88l=TGt1<(qs z7Fyb*<_ue1_BXpXR#pmh8NMHg@NC}Bjj7matn4Hf+v9D%kE8Frlq6yAcr{I1aPZkZ z8ZS5Oys85B;B%DH=IuLOs7vdW!MV(9ip8%qkUq;BMm-YEf^QvZ9*{CYG{`n%L%Z8i zWNKf&3?r#+Q2ukay347`V_x`6_pQYSpFyBRVlk*Qcu=VO+%8R0pz-UhZm0GeNZQOI zjM{1vQFM31e^Q4Fo~04XNltk-rl^j>+ffQQ_+%R&qa9!jAt|RuY#fQ7la_*S$&y<_ zhe{py2dFbcRtT#ip-na@$bG)E#l<`sY?v*Zv7xhI){Z^au$sedRxMO7K;c zYZcXoe-!Se*(P~w5c6{B9eKwq5BN2d>(`1Y$lD~tB1a(_Rsn&Dw5ATGcq9TPVd+C4 zyUmjKpxE@u&KPjE^X^c%`(f5;L^Ck?;RMuHb1apJT#W_w03ts7Wg6 zw?{YF*#Z0mb4N#)hTs0-`cNmdZ$-?#3OJG(VDRT~Of)Fe$Tu7@b+*7dYkHe>8`9P~ zKN3FFp82|*CkeKg?kT%tYmmnEKW0kT*+gJxN-6cV@MUK_-g+)+if5k?c(k^nj7b@U zF30l(lZ%21iuLnG6*|Wqh&l<&?7X2gO-Bm7&T-*gBKl|W5h~_>)N@`XeWtKbvBcvO zl9%){zL(93N@^%I!Y`+Mbq#OuW0S7jigg!H6yCL8ra1gB0G_(qo)(_|<*V`*(%k@2PcyLP-p%5Q(0xF76qSFY$bi+vlx5^05r@D=H|_i)$~ zc<||{)y@rGnoLb#^1FWj-%hiTN|GDm63=sRNRVR0!xQ_1BLmS)(1VesQD(Q4X=@&v z)Fq&7dS1r7TZX5aT^%CJdg~Y=2N&}7L+@4NV1AQW^69mXO~)*8`zv)n7k9O7$IylH z2gA(teYXhP>?pt_EKtoHnmQevChgX0^R4c^6*8jz^RbYTFqe}vv`xFpJz}tIbwxy<;31#tgSz~ z^`|KfbP%lS@)EHaHcA-%Vhfq6L46*eI-Tw(Hp|ip*g!gCGrx4&L4HH`$Js0nkUVflEj;KMp{{!t%WJdi>oKkIqr?epeb_;^i4F`$CcWqy$FZ@ z_|!a2s{Pv^K&VYiXer9Xc6N zAmY?P;iEunJJ398WB;w#e+31?z7TLVAd!X^{^S(AhA_|@WFx|6^o>>2i zhpy7f669?sKG8#i|I3hCSbebkQ$SGT;&-(#5)3Zg&&)qVI;CbM+F#~dJ)Y{{h&=A4 z{8ms#+FbpqmF?NZXD3e8?C)oww^-nV-Dk)z7B|8yoPNueM<4p_?}O5y zX`0}hzCKAdEb+gaZO(fKR?N;YB zTdnDbH7xxLKRjq!kdjaXuiW$4t&E6!*1WiB!gbSWEM}0N4Q_2pOoI?W^S^0H^*&RK z@3w_?{S{>56E-sCz`H}bMQY;1GJp^D1E`rQufJ%GXr>L+aI2Ma(B*EWo|HhgHj7uh6>Y6*1u(j zeYuY&`J5I|aE#8P*o%*WVH~rSBh!oTpCHAGjm3onRDpSocK3X{Kf;b{wfJ!6kiu{{Uwu?-x@9y%^hAbt2 zvt+f@5WUA~`}yRp0k*kz{e^QPxqLtV#5*QT+QbW`-!?JAT;QSSzKB?kIrbBdV!S?I z$6Y3%8i-OIY|g`Yhj zP7wmaSV8)yx#lb>q=pMKgvS)A*+S0$LSX+%;JpR%RynZ$Bhd+bRJjBQo2JlYs`*}cE3F*1NOFff1}Ew;(R2N1U-F*8px&>2<7#s)d&Us~-q z?`wU)3CCO4QTYD^y#7!ktpQy5qc6ln{M+ydGRJ3SJzOw6DFQBX7c~sH7gSajaUv5D zk|cyGIGg#yI%N9~6&oSH+OJ6gEenA@p!sfOcHl_35d&na+b?mTsiEW5p|&bL=7<ST=xU`twK2j^6~&OYKTE^g{q%FGR*?6Rp{7;sjP5_!--3x&%crM=%m-np_C< zb8YgvwARKA_f+jN0~cQ{R2X;v&TQr>uLCWhwK{zGJMQ)w3&1e|Hi1Ay90s}?1>K=Y9lu~Te#JVfR7I)F5SM88J@!C-8t@V1AukzuLq=;-J-smY<>?c}}51KRoC ztUW)416|$3PwPSLo-EjTq8;F&SpSCZjHU(D$^jqP>anFqF+CB&HtI?eCIpo8o8Den4b*Lu&Bg9 zC=>qS;e1^AAuBDd%!Kt*LBJ(EP(dZ+`dtRh<+Nl`9UVeI-G+0&pUu;2cCt`+!%YFB zHx|g8oE&9&`a+MYuRsUqo69*vSN@oLjKp$$B@aSoThD)E!dF4=dY^tWCDK}%b3DpmIbrvdnXEXZqp@7=b4AV!VR19S|4 zoFzv`M-S)?N9$c(B?TINZZ~kuD*uc*MF1)*J;i~40M_&d0eE)Oc(LK#%|0qp+lvG%w3Y#4xCP3vVhRpomRCW!t z?|j6KirfoFA+p$)G`|J2E~zXaH5KpbXeAoxC&&mV^~(FoCUR%6k6w8eeAr!4*!;n} z!&XMr>+m7S^?%|A+EGhk{Qey}40a9YXcj+~q5or}lPp1hsyjfYaxj^!zjLtsCKGjh zYHBzj&jg0PmpBX>RaR0omT$qFOKKB6n5}j^oM%5=sD}%NLzA+$wjQz^CZCal7w z?-Xv|w|>gv+}^u)P?MkD3Wa<*iuA_(0s;z`V%;udJM1i*gB6p9~m+1wAzeI`%zD@&ubHx zF!Chkl|IB~3MTG83?a952o|lPDEsdD`JoR!G(dy$YyGwLfM{h1v zNB8kUobr25!OgcXh6MJ2cl%_pR4{z4SSgR`y}p1bi#Db<)=rNL*Hj(pP2g}l9v2dC zhx#w2c}zFXtOPqxENwD$$^4ZvgShKperiz)n-;vt*2d=lR|^0$3S{+HNB{^URV|&BAJ{~{{_lg)5n%GepkLrFYL4QS%U-}tr6%K=*tR%?Gxj=( zs&f^0N;;Uh=}6QsUz&jWBDLzhI`~L}i1ugEl-*>J@U##A--%ZAD5BP_g@>d!vRQos zXxrziseE1FP=QZiW7DEw4j`v6fj~VhaEeJhE@w3Pw>9WJIHNyetdmTCbTqH{VYcx(wFp?v$>ZH!bKG#Nf6G--rndW$eU9DBR4mQv(f^1SJf{e=9vN1#+3_w(nR zqhaC9HO?Ui7_hW+VwI_u#)1!Ro=g;mH;!{|3ajCXd1iWl4@jpJD5=)5Z0G!qsmxyj z-H1g*SyDHXH4WbC!Y;Ld0;H0!O%^g9AmXqEcKW12xd%}jaoEw=EI2C^?YJKp`6WLl zXo$@)pkZ9vKUuY>gTA$Q8t&MRQ;I(T#o~Zb1Uj(;W`_0T{9ILd(feSQ87Vd;UpoUZ zC@C6+G2vjsA|Unk^%->s!7P^Y)!K($&wdXZ(foz3CGdaqey5JCKbi-r+cxWP^&ubL zGM5qI8lu}L$}$vQAFxtv7xKVkNLSnN9=v>bf3iW2B}}8m1=!(lkWtr)yMVPy=d>&U z$js++Q=8yy|RGs@%-`+$?+Q`D(s8>R_=Rj+ulK(DSW0MGs#$yHb;~9p4E+ctYJ$jL;j1m+S z$Z2RKZwW{N$a_(68e2a3CY}5@CMm2d|Af`b4Z9Xv??3cd5`j`5{Z4pWDJ&B(;I26UgY0)Qe^6Dv@0!@%S-M|>?M z1uD(;>)Flqw@ZiMU;t~3mkjG5P>_DBTO?Gsxp7wj1h^I}G9{`1vm0QhsvnV!9>4-7 zt0g*#PsnZptx>HL3P6V>2RnH{GJ(J3;MQV<3mbm1A<${G4h23<3iOdyI__DcSKa|@ zZBLxq7vTS6(lr{0A=q2`%9_DzZ?_Q0@#^>VEGI{;$0ox`^d3jeyADqeo>;8R(U!K5 z#1#{Z)>)@uGesvEDDwP(1@v&%9IO6Y-ac#~ddgQ57Z-Pi)QiKYK?hg7DGs5E4xB^P zGMJP=@P1(sscC3703)y2p=-W;4!$5GLC8 z9oR_eeBdDcy)4SSy(GmfK8!}|8IA;os+sllI1p-`?fkp$oa8c@5A&uxwE|HjN(Monot=?N7J6XIpH|-kP;%qfFI%y<9N537XUx07bbNZa1vilf zdYl5~;vOR?DGBLSz{+3hax>wBC2kro;=_l~>}(Qn7M$tuBaPhp?ru1scryJqw8g>S z!S)dUtz}-hR(y8$+8jXHSI$#|;gdHhcjDyyJrT{xK}{zEl=Wf*Js2<%3wogYKVGJq z!wgx0HKf$c;adh8@O1u}T zM}I1KWCNcckNx9^%*L(gW+f#h9TnRw&6b`pTyzj=H_wQk5^3;GD)NWsHwuYKtUY9AK>!OT%bdq0PaCWI&m6mP*-(w>buS_D)1h_V#VoU%#reWTn{2KZ5F3Nrk+$ zXrT*vq5}F|7>1!{sRrSEiC34B%?UoB@b z^mb<8Ew^Wy9>(Ftn@i=_m;K$FGrIDq<0GJJ3oXZUBI4qB!zt@yUQ%`e>O}>E38=qN z4uVu+b;)={VtHvvF2qfs*1yHFI?9ewc?wgGCCTnmNK{*ZE*UBQ38hSV zCAOYTXGeKdd4f!>^$bInpeH5}uBbPFm-?g*P`LW_GGH{>=pi;JRHn|3ZIw5Nc+F|YFp8uh7|ees(t5K3VC+eTJzZIjAS6cT)Uhn z-Hwe%M;l95_u?MR`n~3^C>T9`{W|jz+_t;@N^rMy962@@SI95>JPtx&_9kM-w-kEq z^X}o_VNk!}jbCy^xVmu0J5F0gC)-wUS7>S>B@0*T&6nr(Xx;%Ci1Rn3H6S_*@TZwY zFk%0d4@{V#prBf(ZP|-oOL)L#)H1EQ0-CU)G-T}f2r4t}K6LH;{QO}oy;ECcz_ag~ zf`K+$jqc8FlZ7wa52EcfR;^d~CMLT~vMh(SzE2du5bI;qH#LqqARQpSi*4t^J!Nu zysQhabm#t2rJkKVrBX&=@%JW;GHqU(a0$?hB8|_nphdrF6%ic4_&;oYb9i2h@^xc3 zwr$(C8=Fni*iK_RZ5q2tV>Pzj*o|$Q-%iiH=brODzyE@Fzt6_(!CJFsx@61;{`NI* z{z}$AR^S1e({81QbJbhrTd&~?1sR~dfl-5u{7)~)U!KVdsj{j{SzxpzS!4$==UF5c zlj%2+4hE6!zj44Q#%wHHGXROe0@es_Y-~hjfvB+2z6nK(n>025qzM1M$U0{JxKgXtm(`K0iaBp@@{ zQ8S>U|LX|>R|9-8or2+dS1^~;4m^kTyrDxCGtn}5X8Ma_y@{M-#nzVTbg>#7N_Y?1 zaKDIhM=HeR)YLlg*I(dKK(js2`K9kWgp{SFA|wgYYbX_=@CktIkT5VpQh^pVcQUu1 zXn))`#cl?-69pa~9$mgI78C@XgyC$dRx+nuW^Yfo5MXYXD0e{g{8iEcoLZ@B$JEpt z)WII|9zWs@37cr!HRcEP{yOJ*kQ)DoGyIS12avS4#0yA!)-v2ynBU;AzBef1u0ZZD zv1}$%94RF$*aA!SpV#UgL=D_X2Cv3_+di0s6*U!kMx1aSQx60w>1D?xK$UbZ8W|#S8<+0}qFiBhRDw7*u&*o-*3ek;-LJ_p6 zj6c0(TI}Z;=0tNmlsk&fm2~&oh_;Z>VzA!b=U@6_Kf+I6cZb$=%TOg0PeQ({v7SvW zEScy1EDIJUloNq+gE6h*Wq$qAI$$G+?F0$gDd8TrxoW{>I~qBld5-M5Ot%PDCoYtA z%T$|&c_)ALb4m9P)QJXxcAEBP|3GLH%ae!(kTJuEUelB)x(<%kc;S?EGY}73j0-$) zT>%$lZkIz*$9=TXU2c(q(O|s9iI?bmi*G*2X@Ymi9)Y`tQW=g^2Ex_~E5oAd3hY;} zYw|U&BOS->9L5V5==RCHsLQSMOVg#JWoT5S{-spb4>wFh28c$LQ^Ie@<%wZXK;_6%NQpIGS@6oWs=U;>i83^W7 zryS4|Dk*6(XC7V%^=*_v?nT$74OLdcGbUMhAd>%>swjlFkI(snd6v<1q4IpYui*C& zb+_=fY)PA%-GI^zLsg*}Ct7)P=aZQE?%GDtVd3m|iVFjqq^`CAI9{ybOM&pQ4m(j#0gdSPDJX!apEItC&FU1A%2=@Iu`ZnM3Uk;bm~3 zscb=6t#`M_R4--C5x$${=oham_~?SPFFWY%k-WpGJ^c*?*{-qrgT}qL}rv(Z$qa(_y=HZatjH zmuz75$UUJ#ud1YGrB7!D!g3^OGhw7o3c7M{x58i8nNl(62RFgHB*EBatDCi}M6U0c z9x?_x!a-zJtT-BA*N3yh&#BVJl-HT=h-yjVLJt{{T)roGqtq`Mv3(hA=c9Cg5L7fK zS^u{Lc6%t1%j>38>swavte#)&#er=ve>8<*B+iE3r2MK)Kuf0ueBGmL{nyL#^?GtR zd)0*C@1{D_1W!1gP#7x;GxRVg;y@(I^%DhaVe_D>vwH-y5?qKTGP?E|(azl>qgXq}E56-CLvFoa$732-2~{n_ql~II z)m;6}Ek#kR9UVozA*rMiQ61r^lw8446Q=Tv#IADk6$+)fVs-4Pc|~*b1KQI;dcbrr zl_Jd48~h;1Nv@|_AGmV9fk0I&(is{qY%&NrRUyz&zdGYx)u*JS7+&*RljCCayP^Y0 z_n*N(A1KL#oYSLQLSRRukuFz#H?pNi?c0#US*7*Pyv1#NuQ;HOn33)3r{dbeEvq#D zgo14CZ22^fy`@H0v$0HsQQ6YP0hC$Gr_n_eP*Zpc8bcNQ_0yI}0bx&XP7;?O$y%I3 ztqO#YmPzzFsLy?!T+0L}tjZ7=kw98*cob;te?<#t)ktzB}Z7`=Np-FR6J4*M+faV zuyyg&_v5Zzj-k*xY|-6K$i4gVZgY;xv^w8%ff6E*)xf{>@a}OM;XC@s3dwhazJP{Dw{FrNkI>_LkIVtG zCwTjc^m27*gaS2vItwy->9(#k_K?of_njsoI7i6e?@sDudwJEU*9}ycR!zv(5eE+! zzU#1TX-2Rw(poo)4>4`g1o>?5bOlo2`k>=nh>XFsP6XJX+vO3a&5vAB%CIB}S|6iQ zX(6UJ>QNdV{rfH7N%j}|LLvWFo6%`jzH{0cVGcz38TJ4z1@17h`%Yz z?5m0bX%8?TfXU8(WJC_AIndr})mG2z5ne1-Iv+q3_t!8EqpQhFW&OM_EW&?cx;tHV z@|Ssh0{zUw0R?JB_&PCc=!tMbvVnT`>+avPC;oiaP#x6P z);1Xk&jkt@mg?JPMl(PSSiBOV^CwgMD@Oo+L`8SM-%fJ4+>r_0Yat(NG)% zFfZ)aD8CK6sfC3`Qxx+*uxkx87dQ9%)&5jEgG3}Mr%Hz|1cgF6G|)2IayiPogA=gu zwVCWkWEDFu1U-ZrJig6dsDhBtJKLp(9CE0)+zK8Y8UdjfNb%wM)BE4ll2ib1f%Eo= zDs}xEopxzIQabp6NtmrS{m zPSaP#&=p2HapgQlc@>Fzj~K1bG{jrS-4c&FQ>PCfT&n~lsfpJAkM{J$&cn%{Gac-I z%;HSyjVZg_9qX_8G*xK)#zc1hR20J<>f*2Y((wj zLed_dRZuRhOU^yX;$)QG4*Oie_z|VKm_~XvaKBrlYybI6SbJ93*Dcw3mPQDg#63#b z3fbb~fWtrLxmG0v)cU|8V28C1km}?dp>Ph;k@3xN5;*C0qhBZQt`0Y2bCoW7Ozw=W zHQuC&Mj4XpQ-Ka~v@u^-JNm*&tNu;;OdQ83JaCt0aUdPz%!pbXz9hG8vsBl7r*1yu z@4GpPjt7+2m-8YmL@&%Cw<&(tbBXyLs+swZh(_lFyAutk?7UJ{l;g2KZFR7ymD>oFbX|Eb5M%GkvMUs`5E zr!AK2=QY}nQg=EiXFOnKV!NSB*AqnOZmO5a^SquYJ+z=(a(kS>)arUh)#NEpyYQT? z{HOu{de@P6=+{&|VEig>DkFOCi3$$oKpF0X&UQi=0|{Y3SJ*6JCg~l7Y2XEC!V{9S z+>o!y+=`3Cx&No1yn^+hJP-n6-9=h2`md4@77f<>VvusExxmpw*ejXM?CtdrDIVg! zr;O3CjM-6(WE!+H`c?Q@GnE;7_2>beR#LjkbB&3vnIiKk!Yw<-y02?{!u|95*gRXk zz)L0vgq3malhMGbVfUVGvP(X~j`dO?ewIM&u*##+jYE}HF|mA_Wh>L>lp=G90n$+L z`+mtt45JCk(`;EI5A=SCqmHh6!S3bJpH+_6#!)tF?>r2l(@8LlwwXW9X^dn8@RaNFQ{!>GVqkv*d1Juuv>AJY{i)f4~34Gd8cMz-?AYWc8SeK&aQPn+ssN;nk zO?WH{ae%Mz`ao|3sZZT5F<;yAy$T30L2?d79h z4avHSA+p!wJd(%H7_FDE(|qU9ZY*9Gov(^D@N2zdB(nTyxxAz=Me8n-v(B#xbKLC~ zble%{5&g^bdq;>-tXI98*7P{oKk=vv8`?8jy7Pz}=%Uy52zJG-Sr+PE6~x4WwXeU? zfX5RJ4!Bo@GpOveHC+Qq>6OR*U_;G~7il_GC#teh-c@@UM%3P5-tjKauqT%L8YSdg zkgyg=12S#Vk-oNFZM?Ngj8b#F1vn^l;qw1dr6$SF%q1m2gV;-?X%u7|=t+KGZVM+% zqJX}P>MC-I!1VkmXP#4dIL*Fk4ed|J!~Hl5vOd*{_{+!>&JEp3fnk zE9XOg0Op6@P98k`i@3Z-1K9uZki9VN34qcozeXr7P_^ZPCV~x%$q9r_Eh>uNA#2BvqPGg<|$U04GX9LcE@bR1m>rsau3EM zWkDAu#ojbi_R}1)83Xg#4~KJwB_~8SN?{iiHJ3{ zDX;S4j*3pPF~Y>k-1urQyl~+`BkE@Iyz%3sOd+ZOn4OzJ$Y8t%v0eE-P7#HOuwRdO zx69dtQ42#6^41@67tLMf4f5EVDZzw9B%u3@Y-wo&ubxB$5}2k|jPkR_<-NRi?n<W^`w{Ctq&stG1OKfKU%>;@}VI93Xkm( zoP%2dnMwZoH!u7EuS9b$@fweRb_-Qu__41t*!KFry#Vi8mK2zSq$kKxm0$IR%f1=e z&s6yoS0yh=fuMt;>}o^bw8b`fdGawb3=j{05vIUwheq)oRe8}RJ5TpXUTlGZ^v2g4 zX--8^#jAl#GB!radvb%Z0>luzeUfEC5wR$E25 zCAG$kc>F?MYJd^JQIvcNvpf6TY&=3~vI>7%mWGg2u}EC$iq&k-ihlr63cN z@%Mdn@aHoZ6GZK?CWN;_?40NPw~L);2zY)zIazBz*9GEmJfo+#c?#E?O#h?MeM7%0 z;r)S>*cib2Hj?JGS4w_H+5ZxN1(cIe7tbih>a9%B4 z;^Qq=jqVD{qg#ydx>f!VzS9>6S_+VhA&@gS-zJS8B-9z|+eG_jrSsXY;%WwnT*dC- z8b3^(m!!jV0tIqbbC;_~lRx~lFatd)^F=;(eJ|7#BCN#s3{cL!$VyK>nLviUK(jOV6@qjkQ%gnP;Z#-j5!+X8D+98c{F8V!p>d zU0u6wcD6`e=;$IE`$TWUhCI1Ra>hY{Zdou}$u>#Fgx?R)uU6<(WO#qhH3>o z_|PT3F!m88ZdgaZoFM>Py(ys~5pb@UO$wQQqoSY?wK1w6xv4o*Z=0V-5R?~O_Xir) z-)pXrU?Ap3-k(~ARGLDS(2i20|5Of*PXxoWrdgmy7hiwKM7VS9;ajp6gbBot@aUjJ z-R~X<(X44eYaL#&A8h7(|a4Odkn0o~x0*C^BOjj5p$r&90#{5z4yQG{fs7eH77ZRTC z4X*7cFQbkDeT!^KV&(kgIZNxH>99`@8NsntzT!j|u|gO{8o?%GgL}K`F*cWK{QBqT zaIeofHc9z#Gsqz1q(aCl(&Q%yl0tG2BX*B!mjgM3w z%@lKfSqq^f#V0!8)}fIQLF#o6lHv$2LOWcyHk zwQe@Ol=10Gz|y;W&z~-@+`j^{^AJ*L#}Bnjt3vGh!||YT@XmM}e<0}tJ(S1rK}cLe^#TsZ0}^TBZ+Hhi zON?jFiIa9giDdfBV=_ACGXnxehhOv%ul7jZmlJ@-762V*wZ;QVjKGv@Z*TCHmX_-1 zHh}Z%H}^)UPR5(UVbl6fgM8NjO}4Rhdziyw3ZI%Z-%4Aez(P)J?$_r7hBV%dHb@=O zV4m=kj?-spIe1O`3LI^K`5U+EGm62uv*x zFBS4dhow9Vlr}!aUC+L&Cf%9ad-3itNupbWT#SSSmg3;R8!0K|J?q>XflipU&OWdq z^Gu@}$Q4%%T%sx~=+finyyrAzt6;6!C)WrJEtiB}Yu!!1$>gwS!G6)zq7A&H#X#|z z87pZJvN_lU?X&?CVn))ue}qRqLmf)|JWh?)otXcP8JLtIDM$S|jp<2nN!kLwT@jzC zjX(K^J}$w_XZx{hBQa);D%Y=eu34EGAx6EyQW&QYECJs(E}6eDRku^gE3$sw=1zOxzoZU+m!4JO5W1?=T|%;+%3jr*89kj6dL8w6?; zXYJ>No^smQiL;F$&NCf@(Q8Tr=zWbjSG^O|D4#TSS^bmer;(soP9xQ^OsuALg2{4* zesj9btkoZ=RitdY35%tb-FJQM zhDN+K+vD*d>=L76X}6>CyuTJ(?KC+Xjut_l(oIQhe(Bjd`884KpacKB?fQ93fc6N< z?Dod&rnb+I9Jk7I1N=$(?tqb+!!$5aiP9<~v9F2d=u4x(J z^5-q7^73K16Hj$%X)PCW9n8-Oy~`P=qx(0DqvV6O$vSBR5H`A<$1U!$UgrFwd%krT?BZOCY5SJm`igU+YtMDNaiEyqt|w~yFjFIv0oULKhvP(HfVYPEeT;}6GIVq)k5B+Ure=~bqH6QC<$IHs5P=x#`V$N!ZK**RVUPn^l@5+k!$2jtbN7iy$Voyh2~@7|h=n$=z!S)>6F#P|`R zIgv%9`4psyz0S2C+>D~eG{0APhMgZdZcl%mehQ-=>%cW&(1SFxGU3h}7ug@FvFu)1 z06%c4>6|Npqr^-)3af5_CdBW_T${an5OZt50%cfL@IUSIBf%M-6nE5Ha2_Q5Ivg~! zMp)^bP1++n-A!8GHxD@)Qe2q#tGk;7Sb?A<`I{MJZ@qXd3M)p@#&f+>1te$?D%r<| z`Iu`sVf4rf=?vZ5H$`9I(X{ku6N{!sqR+-*==XBP8Bcqch~6=;F{1fNTn-G0aT<@K z7H}I+p||A}R0?apuaAU}EjJxN&q+?X{+0UahRyydqGI;f3JOAfVw`wrU^x#F13??RTbV8I)4;{sy-)=5VB?FZ?D-+brkRhT+k&NB z%kd~|>yxGE7p*TjzcB^%8p2kg=7i0fkW#f%AruN@cpnr}0$vCn9C->pnovY}2f6|K zm&XS)H1~`qh@VK6M9FymDr?dg+E#^pN8IVIPvuZ;8CZ9wY#yF8 z8iC4K<-ygAXl@eu@{ULrbI|4Elz6Vzws+y;IA%uFsPSbCl50jRlHL24;HlH$Pgzke z-!>Ix&GZyh$RdVK2#43mTzo{(q6g*|tttKd)8jqDEyqRQ?xGL}i0e-Jb7f%wuiFVy zyrqO6-jpQ=@%Q(@suXVUyQ8P&-4jmxD{o^Mvg!jFw$aZWC(cVt_&k=WXPWMagQ1Y! zQu1I7tgrDN1_cpQhJZc-rp?g`x?;!Hq8`>_=bMwU%9HrR&d{iRrL)A;H+_q>MyyYp z?Y-}YKM1HV;3sJ$xdfIG^QvfNEhAd4LYXhM^%r+ytd+2LUm5ff+r(q0^QU(8lD<U#-y5+amY=i7BgIl1KR=5D)5}?mW(XSu8TXe?d`K`%n z-U_E4$vSo5+}FaMwf3N-(ZJynI93gD zd0TKOD063h4}+U)P8@+d*Gn-|`tu+UJ*X=#i?E$p>))>H`D7Czx*y4AfOy(yjG_g2 z=jvJWn^@77Tt3r%X&1l;Ao+iQjxyFL1lk~rzN)J}=fIrxP$vppWhXLcrlsKm?O8-C zyyX^ERaKqCNsQ>|c{gv4Lt5zRrN!+uGrjCG)gerf2W17f#o^{mY74)4q$pAC#~M>U z2PVnBJXNk3MP(feT@AZB-2n0CGj7Z0r1$cyxSCj7+-3PLG$Nk5;46LKMSe}=e3QTt zCl%H@cgM#-h!007jYg9mjSIi6n4dL{2RYDA4cMj`qQ_e~zQeP5e=9sb`k6_M%pr;i z2HEJ8h~?wWzJ^#^OErrL^41n~Q0r#r$Sgch{@rW-FChh=1()~=UvZsq(tA44EDw0m z1A5_ZSq-M{BEH99SuOL3VvUoV$)hi=0*!lu=S7#0HH{7sQ!>MgX++{HKiO{5C1}3+Y=79e+ueIKG7X zd#arGw*-i!xW*G30ukK#8|P|QhWd)t*RUl?^h)Yxa_D+a(^K@n3ls8($|JX4h8|SI zcAML~Z`?I%Dm6s++Jd=&)}XdB4T2x4rLxqArKJZnbQ%#rQECnuqj=TP5Li@r+zy_# zpfON^3~QzM7AdF*L2PVn-jsoou>`^G?d=!Xnxgc%Vbp0{5y`XTGqRR*SfC#xlW7by z&zNs2pv7L!$4GLE?T@&zpO<77-j{UPPk)70r30x0TN~AXYI}su?1wenTY?dls46kJ zLWi-@D3w6}tuymm5_u{jL-`;YnhMMxu&F;yCV=pRCHb<`Iy-D1N>m;U8F0g-Fon~h zz8!eucA4ysH&UO@PyG6_OnAJg&6QmrzdFqh(2!&wfos>>M!zx1rz@?Z$BVUz%S$*$ zgvXIZ$Wvl6|JaiA*Zw7CaCbg}w~kbR?AB0CnpWh7i8Ikw@FP?Bdu0|70Dvbb^ox|q zeog3TsqyCyb@_LkFDAv`QDx15(|UWnfR_Sp81PA=3?YESCqfBFA|POBMV|3y0+soa zsG+8Y4w#9_Z94Udm6e6X8z?~t&x0TaF2Df_>Iwzf+AmP2Md=0X-X)GpOjPsvN-Ph2 zX`wo}=j}=K^W&|_#n#}AOhv3RcD{ogD=X_ny`4eWlpw7(pyLSa41}VkkvIlc=*4~M zm@ZP;=ck|q7JLHd+=~jZ6|TK*GW@`WXQP4lymX(fcMmd`LH;aaiz!O}SfXB*T~SfN zr0!5t3kXkOhvVNapH`4pvBW{%q_$b`u}YIgv?pxcuf=Qoc398X*kqOi4&2^5 zdQUvx@pb7+*Ve2NOCa@_Hif8IE+w`dCH?-dk-eRE6r0~Kah@KxU~FFx!f6f0dNKz#h`C{uR7MS7_5^cSkNGk~ zL)O&p=%2V(Q2Xv{xW4o8_}gHLD0h};f`1&klNun2+y7OycEO(hyX{?Dkq-0P&)x>* z{rG;ebiHO|8nBSOq5`}oC#~_z^ay^pu5*qH@|R4j7!y>=%`uH!T_g5}_xPZBHYE;E zt$0q9{c+PlZ^rsR%iVg@0!vCsL4Wvgk*5Uy0~VU9!Xyb?s7!wS}o0G4I8KrqmIXjjdbFAp7xAE2RD1#GR zPp4i;c2zjpcMoFn5;K9O23}5SE*~M}wGyj!#jdx)9L32pe<-nF7={jKI%R(&(x`-i zlxMXe-L~;=YTjcA_VY45@!ZDbSq~0UZkvm4yVy@px1?{GPizqy&E>XssUR#@7y^p4#%7q%0G>J)88ToPH&u`O@{_2$*~S4h}A%AhMNIs1yAvffzG$ak$)QFTC=z!*-@X z{)f#W`KQWv%*|m^Dx?=KNKD%w5AX0#zsqZ^LEGuE5MiZ9QsHsyYdB^epH>&Pl+oT- z=Hxe^TW-ZWMsYKdU}WUtanF5C_!)-wXqZ}1>EaxeQG{{VWM*%e(vpr>rYsA#ma9m5 zCc__<{0xz*sgt9e#f`PRM**tX!Vs3~m{NJvj&&(;>)-4JcZIbV=}FUM!R$`*q+1jB zbi=-Jjhh#~PrCFu9b)}w9@p746soyPXyiwJ=VTTP{930`+la1PlT8l|xyNxjG4QC49Zf&fM;=^|E1ag>&o@Uza!y})Grj{k?gAH2br1q}0%{F#dzCU`zosBO1 z=on#`G*qy?&CWa0S~k9D`A~$&>4?WD=1QUEmP0M}5kvjREc|Qqw)edyQMj73W!$rl zcw9FqW(5I0NVub;;~fPB zh5OABHl7wz#84<@c1=uCL@>U!Dj4#EHdr8E8Z#pU)?=4PdZD zG^WSTRNy1b^apI{&K+|Tf$x)|deB@W)POw|X4TLiA)T$A;kYfm3(+DeB1GJb?_E_! zT5m7~IE@?wpfne6@OVGLoLxs}C*j4opU2CdcXWZbD542_>(Iu|U}HTPbtYzwhl^Xo zVRmL%i4&R%^ep!uSd90BSh8%15g&d(%q@Xho~9z(6{i=MmNNCN6tcEm&->PhJ#D;7 z98+6FZ#T_Gi`LxtzKhUI*51!Xl7r!V*dLmC!eMQ$C~^_jt3{l7+~8k#Lre(8zg(|* z0|@_H$ua?#Aeq#sbKb4$dy_1%l5VR)EMO_F=7{e@JaT25wLg$%-nV?Q+Z^a@4jXKR zlR$IB-?cOESX^P@oE!|zj3>S`Qbhi+_e8xqiAzs!yS}!5cGM%@1zm@5+r-@Ba}*&V z6)8_giBx&B5%!}Yp!<tqW^HtKqkxY4`>WGF1Ckd?95%*l|GRctfl0fx~;BzzjmJSnZtgzhUCLM>LHTl z_I6OlD=#AmoiGtEwD}ko6^4cNz|ceZ{Ogi5t0|-3sB08vZ+TC#(5l(+sGJ{b_sCyb zFsf%w8Grpg6ygq9ndy1MywsNZaRm)M^yRMjH-q=~6lgp1^JJ7xXI_r>Xln+Je)9RH zMbtwzetObgckwo*g=Gt5e73-4=dObz{QV<@>{Kq_z54RR?`z8R zru3k(r)sD#T4M2%=ZBe;(8K9|W@f04i`C7tUUoj=f}T4e{!=e~gTB`1`)raa@7qTF z3;z|`fZC2|93$yg@4vkOfWm62#Y05`uDDnZl+Tr+s^+%}jnfnC;qRFlcHS@F+S=T| zSmlt&NtkjqoAva-?sz6V+gBX{LnI>hNkkqVsl@sUM1BQjl(2o>wYIdy)PixxB>+>V z-)X=u9{!YvG>FW2uAmC{4Fi&jnj93aRD}JIt&dGV_@Q56gEq9KwK^rt_cGNcYbMk~ z57lC@Irv*+Tf(;KA&FeLm^&MyOX;Cdb5Pb8@%omS^Fto@`{O6Vi9vwXg4I*TQxl!kHt20L*xO8R_5?lOH*YBiCF5Xi987!MH$q8o~XARcuQ+5^QX!0v4dNd zCRX970W%V;AO62|6nJ^hKw$Rv_k~48!2qCv&|VcsM$QjUMH}khUhfU9&;pH@jUC(30|^kOHOt6FB(B<80v{ud+o(6q5{GzxwFxbZIU$ zRkR7s3gSwOhm(bs743)_&|__}P@Ui9NcLtu-rzTE ztEE6blCPbd!~ptb>JpEcSq6fBnc5izklv-GrD{e``r+*b4h|0Y`-^h+c#bf$291wELg(k(7-4Rf9MwF^r@*8M#uiyRF9s$cCetPh8r@vg(cm+Ljb?wp?n9bNG`KVDZd9m13Cl=&~q zj4>mJ)bc*CKSL;hg0a54dXYhtkm3FB2kq>c>QJO13yQ`F(Wm^Gc|@@@ilF{3A+KdBgwuOd*|EZ_Cjh<|+K1DwaXkhocFg$+0> z>(3<({AmuP=KOv4N)rl5muq3vISGpsUcBM4miQw!^4CyCxM@3 zM>jJH3$Oo2X)`$Fl$rhpQ65n%#ovzHiPl|T_=Kgd8z%O-J~wIpdPb>~*9*BM)HNv7 zi`6-!1<|OtkDeLo!x5^$N{}+Ym+@YRmsE2TURKrf(dR6Mo|y4T9y;cLbVL~gR=!Ju zvkKq$I*6^bfnVr<;7mvT^UckcfeFK(0w`S7qW6Tq*8n7?euFYbbmuUQ%O^pUgDjJW zF0C%KL>gmbN^Tvq5(ExED(+=f8y=Sni)U`kI6%)IL$`~aZl52zU;8OWRPRtk{0f6N z)UC6=>(iaj9AafOf7E`Ur-|)ynx>_$>SJk=+c{AuioWXz@;BmJA6e`sO(>IVKV+^c zOSqfTvQSLH_q~2h#3AT7G?#tcPkO^}Q->I@J|YpveRh>Dns%jA1|fQqJR;Yp!FRc* zL>8-D(dRd%i09ZN*@1V*B6MxZ+?cqOMMOuopw*@jm>(DBzC)RnS%ho+4(&XZ@TJpR zfWYCCPyRYyzhQ1*8Ow+2?xABmyWktgQ;O;Qo#Q*~zbrddrlYeH1Q=gXQgkpU)jG(W z$ZS(|3tHv59h`1KJN8a5sm3U#h(J3!IV36>6Z*YJu<3KbS?N!RR{>K>qGQL6>fCwR z&p@F)n0jaaOiST3N4C zZpsJo@RTn4bL(5OY-7}0ldEAGEeapO*hW_&!z1_P>kpl`>de+-h_;dh&B}zUlSDgsd_D7Lcdt3&bA7GwF)B40qI$YhF{OGZH zQ$|Ty=+a^1?Xw#VaD>$B%=glcLFPtKbH|C0cYP7ARjc(%} z!n?<2I=Sl?6q9=PzLn0|HEgWz@j}jTtII*eh+EuZb|>%g+2!5oT0*x(1C72HfFz~7emxYBL;um4e7=wBy*-Ph|7&^N7JYm~ zUcM{nGJExe*P7s(04{`~-^R$v`=<}Xm9Hh(<3r||wJDTUY|hH#&{?OpG_z%{dvU~8k(59~1B3$op;vG$zVX<~oa9Pc(9TS(~C|5~mQf1f$uPpCB zMYgORO`tIlfP~>x6F4oRHCagnXpWMCoX}tS6{O-!I~r*JO4_KB+1I^llJA=<_&vVR zhg0`nukyj6lbuI*NQbZK7ORTn7t2R|hT?KOD++dK$%^^BG4oMJ?#&MlN)SM%^LNrG zR7*kRDreB@saEEqO0n&JRGL?sUc}y~&dJFM4gt~G(II4%VPkE5cCjrBu@xlci5fu_ z4^vtOADJmkUz;S?;)_0tM-4Vz%NAU>^jklFaBx;U8PC7cjW2m2Rrp8G7!uw_Y)sHC zq+L2cABu;hq%1ozEkQ+hE-_1$f30#nYD0d6j2+Q0fqj&X)T=LfhJxB*t0y)ASzN=a z`55m{UA<#CLLZ4N%mu^T9980D{qCMUPFMKvaa8^!B|;FWRAX*Iupt0A(I_oTE?Sk!d1@(Ohf zG)+5&KY+n-4hebpn*ZUH3Q2$b$Tx$QmHc*4FA~Z2Xo^50B34S_>C1_&N4re@(bN9) zoT-`^gZ@NRp{Vpz4$nVg2^9zk92{JW&!ajFT@f|~z<{vs6kXJ8>E!IDrzFn#=HHBj zE_b-xX{|5^{b|9Bz=Ii0Qv0g~lfp!YWen^1$7qrpo2BIcGA|&p353zq*50^2oMWF4 zNX_TrE?~E6llpyuq*R3X>c@S?s7OdA`_BW;l#!U&*u>=IMkI}_T$rkRinh0X`p^uiElU7VFa&pyyb5jNN_j$Zg6RG%fDuiHf zWzZ5G?JKs5GGqekhq&HEh+?Gua2P4{ui`hPaqAn%-us{gz38E7{&V%^8`2`@yB`g^ z$k*>{aiL{t1L?y5mHQ+4JHGXZ;GLnNspA(q7pfM>knBK&mf{Gq z@qh9#s5^1?F8pRTje&HH507Wj;J5Alls6oeRZc?B1;-PohX{9+#Q|gU(3wX4HPm;k z4TZZ5?hm*UzCMuQIDEnIm?1X8uaK@59FLYD8krQ645M8Ggr~#YZmD;#B zs`ml$R;f4cFpqS|n=SHmpM(&*-3t2Bz{lcXSpms|>U9TI5fM$$u;{QCKLwpMsyim8GdbAQBm%k5s!+ z4djks>UmPvL{V>Ay}JMK5f5#;>m^UW1ozwE6ogC2WEcgG4V54Z)3S0G_AVYKVF1YDbV zu9oMr(1^WGCp!JIsIvHhuV$OBVsv`<_Z?~j7M3Ft8y&tz!|n()*K z4!VS^1XQ`LAUWGCgVOsz8NK9SQn?=%iVSyvyXY+%-XTU#96qZ*c~UT&!$>94$|s>} zvK6vU^q$5>3uZ+MMrZseU7K4@a7e1R594FP^i5Xi45Gjx4{~>D$_~9GKjI_M z8!)1uh$8T21Lr!M_f$4NBp2=SytiPA%K@zaFJl$TM_s$T9~c-YymGL3N43T~ZLhuW zR=(NR1eH3YK|6!;|8Xv~XssGm`vFCf7{(HaUWJ@Tu^w+q!7i9R!@eb^37sQ6LFo2^ zdy|=yR!z>h*ke%%6BW(!TM7Zj`&;JHlxI|u-(x*Z*Rsst<0*JwX@o?YV7z~n_8CBd zR(-Bvj)}sF{$*^gaR+`VsnEe)GC1GzXbvy8?7yv}u<@Dh|1tI!Ky_`)7HF{G?j9hx z6WkqwySuvtcXubaOK^90x8Uwha0@Pfb8^nP$$j_#`c|wY-nrmilL^87 ziFxl4i!k!ENaHgrbhojH?M4wi$@fDz^bywsIzuXUv;Bn+Q0q|<`{5o`u`qH}6m>BX05cL>m}^ zL8G#v(}`!v(}vLs%^{~y|gUFBceg(J)?9XVs~{}=6|d9p(Pi+1s- zSG;3KsbH|uQEk{$8L>rJpC%cV0GlT-+DTBRfi0q1DeP&LkD+2yZEg+Yt<5&{p-Dlj zWE`3#jtb`O{Qg)}Jd7JE-O-L@XI0zn^mP{Do*B5Rh|q?jDmeVJPe6zi4Jn?2BF1!S zDT9%60;l$MZ73uJ9&hftXkl3Hsk^+vi#r5nMqaA`zySl6S9%#bw>m9ny_T~@+xem^ zV%49%4ONntth8R$kYZ_u;zYU$ce+&O7>fhKD~Y-bsD5l#B}IhX9BL+FbIK5^->Vw3 z<}8T66Gz@uJN=&B6#yh+lDcEBO+vv(3=oH54i*m3zRcXokfTYW1f2F>p5!OFozS{l zb?+>o-{e`2S0Ps&KQ^}`UdQ$z(sJ8S;He~e--ZwdTbu7zv4aTkP&Hm6v!imPkT=?u z6)Gmf+ul~OV_n;Nr@*ku4zmAfJ~-rKVS*ZRkrkIkLR!QJJAH>=H#(Mu_6TQNDtRK8 zn~yWK*8hR>f+GJ8cWjP@=#)#(rRLmJ4Jy*&9-pel!yQpCXS=gP9v$T)C3_ju1FfQn zLHTM(sl<)vW|8lw#GCKKHL>Z`fMqr?7p8RTx>@zJTmMKXs4NksUQ2Mw_ml|>gGhnZu5T&Ke^c<1wRiaWLl+?tSt zRkgJ2ibGmQI*_^B$O;4=zN>KHMi7^fX!ccsySR02ZDW96P)`jqIwa8o^U6{G`Aroi z76EmAF)Pq?L?5ea=T}s?vkHs87gDyOCo6zHkysS%wAJgZ0m1Z$Jvh_JXUU|z=Cfde)3D1 zqDm3NO8#v|-p`OGW(f~qLZ7K$&yC2-^eI9)L$z-?`4(azO^l3yk&!P(fQcdpV-&?v zg3L=Eb7Ja1R#M$^d>&tICLIXSZdt~o+z%b`f*?uUCR$_#7|kv*=fY}sid}T3;E7^x zJVc!9O~Z^V_lR6ODJ0Cv-S|pauLqP@Gl)71z}Ov4LQZ*r@L=t7MSk%=5K47^HR8zE z97f*x3B?;B#!_wM`Ic#r&+E(v9a;)I&!=BYsZ?>>QCFBbwBCHp4xVEfy7ma*IZAkf>*)f#{Fgu=o zu%cXlr6x5dsEg zR5KDlZ9#V6OidoK@Q7IF@;OGZnQGUROq*cc4mkfuk=9-gS!xwEjI3{Q5LA^=v!&A* z)6S@e_#7b>IF~oWMuab8=Jg&*_;uOw`Lu-{_zNjx3Z^LUs3`bytv0nQ6w(Ml+X-_YUc(IU$q)Iu0isJhLy&=2n zjOgy?AMjG%WrlH~Wcq`_G4aLu%Y# z0LduN9cb@S(*J^70La1w1VCFU2?+`5!>a1)>bm(wMMaIy7dihDC%r{|fKoPm$~W~D zpp*?EL=bhI{HN%z{fsKcYlEmyLNvy?Ku`6d z#ERhuM4KxN%NhiwN)?R%dZYiqg`uyO0y+(%bj6cj^bC|z%p3auCv5#?#3h8cVBZFw z=WeM>W*&5|-iVIjw!4rApGcGD8YhR=JqYi6exd%^J39}7g@z2jt09+eoGse2{B-Tz*s((2AZ7Thi#PA<8!GN%N2mCRXhpyoDKm7Z*O_yD z$0rMNyXqnj2NEGx`h(87@WJ;cpTY%pH~{$>flt z-x2uDR$>7ae2*Er`m}w>!k@K|LRjygT?=6_{q|C()KO=Gqhrz{l}26#Y;0_9j$X9= zWLYxnuvSDOd@uG4Sy4!5kzC&AF#q=*D#!zi9Vg8Nrbc0p*7lMVceOr~n&ezU>00OY z!(SDMV!Ys=eq;<>FMylSlXf|*+uS?@ciQWK#JBD)%;2K8@8SBUsTn!`^rX@fvVfSf zeIBY;u6IJF&1k&?H7?atxyAqSQd4(Q{P@9)Y%aYmcvgU;yQdAaS!yka4uF)7lS243 zJtlhV5K|uE1};BYU#72>RthAoE@NAr0-8?@372ND0(o(MuOs?bjhEc^0-+OW^g~t` zaqT!YRLhfV(&-%I=}Ybhy%d)t5g5!@(u{q5q|Mn3a*W0;>u({D@eFvkFRb-=b$n;i zWdyHVTYS@%aHFH6)!Gi>bzy^-qi&rYFKiZE*HX=2H6_<|zM=j1PR&D(UUwpEt1w&e z6&URaV|CM`oeO`3Q^tROJ1o-s0q68=r^4Mq#pFMzj?+}#cKzH8E$(!s@?BgT(sPrf}0l8 z9$}=QoL{h@Y2j|bEd0wnKU!kI9i#jmm<8`f5%K~<71|9vPB`ovRKh6f!0?f0{#11| zXapm^7#h%l+m~*lMCuxr-qW(NykAD=H4llSF^M>CbltzwA#NvmPj_;TnoyDClV4?Q zTM}JUerf_c>4RUz!8-p5H9&V=nj_k36GoD)f27qG&TIbCSDA0HMqy1S)t>e}V?cTt zGUqdi{!!bv95}LZP_4CuM$a4k30ZkI8#!cv*Z4gZ-2*|^q)*X#wS82%^|-6z7TQDF z^SnVgek1pMs^Vcl&HZ^HFeDu-OUlytI>`-b@g-Hsa)E;*R|^+ycKS_wh2F@z+${*Q zv4%TPE*^=|VnfDhX*uECNho3Aj@tqkgf1xAB%uQP0wfMz9}px$c?W+4CxXgVi$xFH zhHXalV~nzO{!Nv3djU|TL1f}|W^B|aF?XP2sc_`jbt<3F4zab6LoG*SO1EsLYLjI9 z)u0}$dxk86II~vX8WkC9&qi2o9BaTk)P|*l%%1rJY33p{((YRnpZ9qlyUhWCG-LWv zI&l82i-V<7+;Jy8zuvt1$$ZRXkFhUh(G7a^!F|?}6Rrpt{`B*Eh~iqM9OatA>MIVi=&|-{bXE?UA_| z_HRx8a7beOfASKb-Mp8lQLS9 zcNAWN`AA~GJ1^BRk^C9;uSzs6i#}hTL!F@>UKmEhFTO2F^VcZ8s_^b0`Uj)|n{BMm z70x=koLfkO6UMJQRqO(}Ybu^j$jxZCbxlbOw4!CqAQPVqId4|3gB&;1?KSTpuT`vp zRksbJ`u`Dq^$?~y>_nuX%_#`szh?(-{Y;ytB<6omh;cqfB_lGV|74iKi1gPPitu*6 z|Mk+DlDwxp$M$p1wl2M7o0P+CM4zm|;Z|6D!@^8|e0GWbTg~K#9!_>cA@!OHqz+!P zBKiUUp?~aRV~&KyDbp6#=1Ie9z3KLWa%u;fHw$0e^2^CNZ`NqVyDd? zgF_$!Ykhr2+}RFRQ^hd{53;oDZ@!Bu{Wq!e{8Zv#(81B@Puh4-M#C~GPojnU4CbcI z#HUWX%I|C1__}V#>f+YTtJbJ?L#OaZ)*4_3UM7;a+C#EasD%4jzw9dF{MEG>R83g z)jmnQ8sbc$xpXb&l521RBQP0o?bXJ3R4VqF(iyowfND1}`77J8)T)Cq+KohvnB8qG zk0Hm@^&;;%;7)935u~V>_|j&u{oK1Vdek_0oeBK$19Dv0vGN8Zv?F83WdwLd{QyXk ziK%e6y*7omZ~K}uX}TK{PKwHOif4$GsR9_0SC?%Ic zG2Ey=34rj^?iQQXmAeXMkZo3Dg>BT#6s~89xzO0~{eDctq~o)2c!{!!Y5x1o15~%` z`%%?=KiYZknLj8lKnUbxCgMHtop>0Lzr@isQD$>MH+osN!zl&F5x(6d0}B=cO?>;2yzV4I@5=*Pu7gNf`&G6I3iz2I@(ECDjQ>c?_i|qK) zxVVDq{%r&=`;Vj0~8cn`=;)zN(GE6zI{{EnMRYwec zp2|Y#yWIN2@x?+cW!eFgGFghqg(tOGLajP~q1Pjy#22oah@jKUm>p$0O( zPL50VD;a0dFG;6s!x@Uk{mx{*z2-wH0Ma?+7O()R(%l}XPk*Zs`$Ym(#0-C(68s|? z1|T;G;8=J~&)^tSn19^NAD4s!!ueX5KkxrnAT9QWM)K}VZT`piWB^rPs;a6G(9nJv zT0^b%d6ITUMkM_F{9@+9KLNiV7sKo7%HB3GJQ&#v_-!&CAmS#>il+~S;BPz_YS0RpO7RB(7a1(nFROQQcmv~2@B0zzeP-vE8Xv&H^e zMdE+|geb6me=VUYAa?V!YsA1Ae^DHRLXX-IM?WVk2b6I+dmK?@d_?im8oO2&#HGO; zFHh_7OZu|(FA(<38(a5!PZV7Ado))`Nf;9vtS)=A$=Somw`2__y`6N^cO1o4f z%5|&CLPvcZ4A7iH=OQF=P$4TyE*0uuV#mn0phNe1-Z;9jYvd%Sv|fCgH`tiRL4-?P zdbBY*W14K6qWz*ez++$0`C}YO;%%Bh_w3K4y4}b$yMZ0S%>^DeLguwZ>-s!1nWSVo z4D*%+;|g$WY&X`H2EKLgbmye*G;LX|EyA@APnXt7Rd*O`!QXCFA}9reS+BVIuK}$m zNYz;*xc%e0mo6D&9Bt8rUz|Ji<_(!h_>2F@ivaQl!)HmqGdT$>F%o=g3<@5~+kn=s zeH~2|S;QyVvY2*6qr75j`lIbO=uQ=x-O?UH3-o#@%$$_7=9C4@{~?CPe9I}89Cclx zs;`9_9S@*-ff}yO!EM>5-)V@w_s@IJ#P*NkXOYpM2jJd_aq-qQx>wy;Y(0-ylQL3$ z`PMZB0*wUjq?03yJT$W7_t!^GOV#F}*gP74rudR;N<^p0JsBhZN9f~G^i_%ageVWN zm_GcAHj8P2h@Aj+1b9hdJQ4*u{K$QpV(ke8X7fdU?28pkbhGHUF_8mq`?~h{+O<}j z5pXZtReSvYI}oPBTox&p#0hDUqqfCz|4sOmHmr2Z`_;Dt!AMw4=pB&RGc`tGJJ|sm zKMlRo$UyLDC7D&|A(0IFDX_cFxbohn@=Swr__P>%(Qg zLu>30dhrHY<2}QL4+7(%ucDhh)mIqd*b88I4on0?9ee*ugKAfJ&J|iSW{7^Xc(6AE zl8hNZ2F4Z%cH~|4X}ODcip4Vd(=fr+i5IKa4b}Hh?R}bU+fr7!kN=B8y8kXGRiLre zp)%_Qaf1QdotQqFMHt%Ke(|D$vlXG53R0!7tKOQ#fgoPK-;#g7WYFg7EfRuO*&u72 zkwwLZ*<4vx@P8#cT!sG-NJf2$J}AroZwjNxoI9MY|D!NslWKAObZzni5hR__oy~!F zu*fieA7kYgDv1urN+Nu6T@Yx~^%_;Lg$P5F;tkU9_)0UzcSc{J!|o1ygL4Nx@-WB$ z)Ur}GeC&RZEHFM{)rG&n&_ZxJn(BvJk(^QOJls{PGxUv+>LU^-k^TYtfU<$+=LYE& ziDKC5>$oN>%Bomp=!~($t-U_48lrWDKbCkfuMnb4N@**xH{HO_%9dg9%R2LQ@z_8B z60De4bU&f{(LC6$V3hO20b>L4;rx_PSQl~(B6g^;ZbeM#I)kD}06*i~(i()P<>LJ{9Kg!AT2N$VyZgfeKho0w2zalD6j|wgN0> zpD7uUlno!(56>~V!88wR+$?dyvs-4-ou4$`#qjoXVrWnYBqK=Q&~%2o9g4!Wgd)#} z(;ru43}#3b2_<;^kh4Sx_&hJqd1fXzP%;X|eW<4X;aLNMFgePacAB6oFt(gvX{2KjV|^a%W$cIp8Y`BWYl~TI_$c`4LJADF`A6QH8+Lqfu2Mh=*_pmU918;Nm9niIn*DIlH4vy(rKFhsm_Xc2_YwE|EnrJ-9K zAJ7uAXhWkBOWOU_(%fbyB52h3a{zW9L?%ynO&YWc!f_BP4)}%cdiRQi&B^qdMA%MC z&SRYQB;Pjo&FCZAzW$f&E?~T--JJtM_n$}?Byg1_@f9uQTsTyBXQk695Gr(I-#w@? zwM82=ZMKQGbihfMpO82|v9izbKZUW9u<+3BCU@4f=PINgU(uC4tAwx5Az<@3z8fDz=_esbLT*Aj3F~9%Zee-XPH)Cy z6}Xq+d0r>YoA~`xRr@$!c(lCKHJwI2jXQ_{hCx3;n+{t(8Enxp{4+n-JzYbckJ1+9 z$0|;xP$Gx(pRn2Ek$Rs|&jd>-@kmC6)XdWAk?XE;!cH&{I=+{Ha|_ zg9~69&LecXBTFU4MD@%yPVzwKr$&aZ{5Cpjppw~YkAnzw(d6cJd<9XRhCkX+dW8EJCk{OYVq&BS!-AU8?#B%KchoN!eQaGj{!%S_P z7q4RQJiWs--p)CRP!UdIF9NnNM2_p^uAtEH&F>#3n60DEJdY#YK6P|AySYqU9|ubr zk)9tVG+^WHwl_zXNQ;%z&)VaUItqJ)&W=P8O$#`(xip)&*86uTp}?hyp_zy6$UoW? zFJR_3M?A}%Ejl>vgnSuCUMF}*eN3x+_EHe*klUSzxL~&i14Ml!ic6ps1Nj=jCtugIGEMDnmVb^76(pczK^M zBkIGz`@9TvwAJyaEGBMMH)SpkG&@2FF#dXZ2Diq=GvJG}01ovK>hb6 zDeVN2kkdb+DFmNb&|*^^wJ8|~%}JYQ41M1-eX)_fyDUv;dsWCg#_0O3DDa+6%sbNw zbE>B=Y~`UTdfm-KbPvQB5zk9mlHM$>zU`e#XtfEV7Fd0UOK5kqJGoTAU9rVA-HE#$>Qk*Tg;Ey zPzp)J;lGk6GT1(VVoksp%kb8@$)NSSkaSQTyeXqyqp{Y zpt1EQY3u@$;mL`}z<>l-=E4#~C5b+5y)EZ*X9{yAr-tI=BwK0y`RUXxr(Rl?B zwx63Jk}trP65V8mE%aJ6L^_Ittc~m`9b_mXATQ`^|q`{$KvzxdOC!3`;&n6!hYzZ|hY&)t{e0tHV=sNiQxFfZvHBAwYr6 z^u?-kEPh**g(0BDk~%3dF+P9+O1uIBKm7QhpVO0)f&l`{IlOjKbhu6?e}qjE#*s0nI*;ngSFEfM>(J z8yZ;N#8qwKgyw+j3mHIrJpdh@{<`DB6;P81)7=|*)Bm#K+l4m(BT)N=39*?vrzb#{ z!!U?x#)I#-^El4U+{fB+`;6!Phw-L0j-M1;n8d^>Q=$Yp&gB z;uTb9Dc#j!7G2<<&1dBl`F{)-sbv=LiWO*jTEYEbfzx>=cN@iCLm_Tx6Ya|kQ{vN~ z_l;MxC=9OenM>R82emnQP!^Y-cGp*2OMV~wNNABs$^T!w>l+xfy-%LLFW^cp=c!UqR#(nJ=D^}VDDQw{inNXxjR76w|1gl8^b-c+{}BCK^+duDE_Y*;U}=g{Ci zv0^;qLDLHoCc=+6>Q`0*G=F$lzT&i@V&i>37N4uAJkV~QFk!B0-R|}&z_VHD3|;dx z?yzvVo5D}cJ%#-{AY*AQ20Co1SZxdiI<|hs8sBUsb|6i9T}qTj)}+ zejZ-JkE-i{S9yevn}1O#ix~bRSW-aoImAx744=3>;;C$@XThn}yKuTw35Udk+%CbM zT-7iFEsEwyOz@ql6;N^0qp!z%#8Yze>L$(hpqt*NNT_rDWT=vYASpn}$_gP4n(r=7 zWHKTv;%rP?FVfIGAJo!04SJqN4~IK1NnXmoJc@}&l2TdT*E8lsfkwzij*1nyS6N-_ zTh@l^>VjtA93fEh>is?V>s`5selR}p{^{3=MiUnr^hjMEotJkk!N%l|cRTBGs`yzy z7GbD4vA5-Lu~nFEg*|5cHeV7&^+4hyzYGH{nQ-YrHM?Tcg9PQI+BvN>j`$jo3V?dD z1F=EEBRrpDPDP}2&p)s{xqU6eazHvFDoI1t;H1j391|XdJ=r+@5#q!}#NX`~BwBan zeZvaJBknJX;&+5eKG@!btFC>~HGjn) z^j?cDW|E}QV(z6{^|57aX`OZMWlQBzeQYTc*4)dgdRbfYn*{T3CvFx6Vqw2e5oC%d zO3E2DOCy!KZ&;A4-s2A{`?I14HHnOJJbP9VcScjzltp@X$L$NlWy2)59cIun_m6y9 zL%n`JZszU=37UGLq|yU0{R~>&eP8^m=$#D@As&4?-oU! z)nJ0!oIW&1qy{Z!TTLMLZy~0#|Cn3W3~Vpe%YejUv`+xd8zyPbC%NO4G%+))!nY-t zG=aD@u;NxAOEi9Gcl8vIVS${j<_g@3f<4%`eGqqgXAy)Dk>b`V!GYYcT_and(_dZs zMU0GUP``^>zMAod9Bo9OFjt$geAf_f=2jS#`^86GUa+ZTw0wuUuJ|%`{$*Jl02WZ<1{3`eRVcM z&gCaC?lh++!RY)SY-r$761*Uoh)C-b5brUoL}^v<$i;-jQbdbPb6jBqbygP%RK8xm zll7A5naI}Pn7jNCsD|A$gCQDjOr#WDcd7(}#b6&hP|(XI^%Fw!T8C)QqO!j=wS}%T z_5w|#uQXo-K{F?IN^7I1dkswu(pFSQqij~UKoAUZYa6Mvp(=P1V+^m&Ncz`fFWBx9R)R=O2|fiKG?JL$U!@e{O6j;Mtp>$>L3Z zVGXgDB4~CORC-K~oaVlBFYgV3$3Iy`NWDng+Kj^*(0^Vznr3xRi0U8XG>GD^uFIm) z#_P=8AHQf_7~kHm_LHm1N%^Usn|EV+%$?B-tPS^hz-jA_!#HV}ffSv7^7cH1nq!u+ zJWOeIIfsT8I(aLbGlOZ#YX)V0j%Hwe%cWkAL(Y18Z+eST$8e}T=?H*Vp9V@3dh17T z&fr7R4v8X@SM)<3C$GxtioTGl2p_qtVmETION1W~l%uK@6$vz-DA zs80YTo_}nLvWqyqa|UhOMk@8BzvOFRqG}zz&a9HVYD0Jx>pG&J*Bu_IYkkmwlrcs> z&wK7Cphwq~cvE@eWVA!4&eC1{oGTq#XSQSkg%L<8upV2Nn4~o`vU-vof}cX{)mBXY zM=U8em{rI@B&?fTv2b_SSa^ z*rk8*vtN3$%LUi|`bdA&#}7mKEW*RRKC(_a7azfv0TusN$6Otiq~2%tfyM^shIDQ8 zBb;B+oKB+@tDkxp$Qq6aU?L=949x-4s=%1MKPrW?!>4l`ge5z2(1b4;Eje=+Dvw8i zXpdsZ&gT^%KL_#O>HSI`#vmt{I3X*s3N)E)38{n;v*CDOKn943m{~8|prY zb9(mqNm^nbP~xiF4StU7x>8=8sIv`hLwV;yPVbCF>tECcGWs(Pt<)E+7!8q-dJl0+ z5Y6TbqwX?p5v8p&E;a())$2_Gci(3ufEzjU^PX|?zs-i21<1R2+E-X&PYm9N%y>Cc32$|s8&eEdS73teyBRgd62}O zRbHeJ6C0-1e`7<9G&1u2zWvmsb7BoO(5xZ@{OiV|inHM-t6sax1{(d3L&V!g79gX~ z?dV{6X1DPuKJIfbRFvh!KX~g)X;!|D6@FvXE@9m;cMY0%Z zC`wt6ib(zkE_6P71C3`iAHe?Dlz)9-N__{G&$Rq%!1cQq|BFc4XhSY!HkSY-Bqj=F ziO%oyqUt^|Fl=mXU9P3`K>>(fu@78a=}RgO4m68GpvCWisHrjc`xJpzKMTFx1g|84 zj3uxv!w3nb(A8ia170n>o zoIS~*oaEL-R`ZmU%z$L2*yX0|E+WA+uufm?fTC)?p=F0D2E4nXj=E2HTYUdGt6<() zQW-7~c^b^+_f1_xLq$7L=Gsp;atiGk$i&+Vt-30<<#*zrg5nAllOC2)cgRb84#*v) zu>&0D^WqS=x>Kwi*6SwoK6$q0O7NDdpm(im(>)#Oi_UJ6mssu&CAuKLKIXu3nziI) zln@=dS7IcB-5*}q$2gc#1U@_C_Hik=zHW^CQqtAAi_*MfN+3*_|{zq{oC^@=Mf zTs`PwKszc+;-K)nYm-BF!g@a`V)H;w92(bChxw%jvggo@j0%c5kW4#~5l6cU4(mBE zr>Gohi$XDhD(%sVZm-|I?`%GEvu~t;wWF9c4XVnd%l!O9(n}RgP;AMmiA^5AmhP|t z-`9Jk#CvAHd*=9i=7@WxZ=*!oy6kd7{~GyiiRBT?d`DC>ot0Jg#Iuhm)3LOKHK&xH znc5H-=w*1dMn0g>WlFRM;)#M3YVqEKuvkaVq(XRNp0<9i-2aMPxlG*y5L4D5H&SD_q35K{`oC2v$fToW@8R1W#LIt)|S ztF9K3p*tT(i_mUv9`YsBL09+aD0ksYFCu{^j*K_u{t7$>rxk;6KrP=sJ&%6Ru?%S4 zsh^OsJh8l?P{^y!*g*!8k!7=22>y64pM~aWJQD`JE+y2MuCo4(M4vHFhDiNFc(}=N z5)(waI+I9PBnZ9Rx*y9tF>`Tr^|;Qol_ku*6-(UUU z#t2lz%)Ya|1+sWGMeBI+Vh^Ac z%7-y$b?UxrTGx|PMmJ%(!>HN&-nU}i!OxM(LLpIbU(P zPx__8)?%HjHn|3_eSsjp@n#ud`ied<1}xY)p`$l-Tk?D zUXZq8V}WPspl%0x;h7DbL(*7Bv4ivJ;fUNIL`!F6(C3b=gfziw+2w=gO+E)X!`5zb2ai}z14&+-}Cnvu8ZfMcM_T%(5W4k5#XP|b=F)y4;ITI zakm7RWK&+hqXt4 z?ruKlUNYc5lIwGJyA59)|J(L7BjoidQivvOm6Gxc^ueSWrPkeF!&!A@4vG&XcYjW^ zIhvy0fy}M4y3;9brtseQPOQOl>xZ98SZa9)!P3B9IYY_ppKBhnWMx&TUj*Ln1FNyR zx_P<>YKL0|OwRgn#B2hu8UBL+cGG0rKTxw@N5*bQGNE?z%K@u>@jgrx9LQwf1%cJN zvXN|hI3R(JI8Vwyl{+9>W9#oxMIM`S%6;x+4rOg@&S)|B4sQ*QE;vePsw8&-RTVu` z>L`jtD$-=ZoIQ}GHCQt!Q@~&WEgQeR`=xC%mVC5Z1bo572Eo;V4(!&RWiI`?+aI4> zBs!JL>=C|ezRfv!K|R!=@jedfWqV3KCczN}TiR`NxsB9TN7hbo94q|nl^pB%Qg`1V z>X;NBvE)NPElI|UdnRa-waaM3(rCltXanYGgZrL(x|91OH|n?MKXMof1aF2lYrZ=_ zI-9thn>X3p0(zD5qceU5*{Lk5p?TpRY;naL$HVFC5}&ud8&`LB*oBJ4e$37&F6f5( z#j$Z|5GaC5;~N>>^HD4}ibzWbYZz|HDUQ&S00S*se3q}V!LkM-;cn^QHszNWfIdD@ zVNO-?v*aY={a%t7?1!6XafMHwfr*1_M(`qp11)S$Kvqi>3xC{0?SlY+bJp{BTEUYePu8XS&fig=%}I zo%B@0#;803CX&ZU_1BTw5vx_k+-P}!WtqNNm=~m02PIrqm!&KY(zM7XuTH}o!nnh^Z|9^u5i6+3bs ziD8LO_#Xns04S;0&pTSFuxErn-@A<$P+0160)1zi3&DrWk!@Laaz{QD8*u|jkG@d; zheYEl@c*4eGtweYbOfIqM?G5|3GqjO2#EC#(|?8bCnOfZGCYVK7f|K|emZ8iYF{+` zOp%v^eh&v^qU#0ecFPkVE(WD7tTXQN3ADDfr$1SB$}})T(|@7iT>V(;&|j;}>~pBO ztD_)k4f37C$TDoy7j4afS<>PPKzA6hErIoYR@aSs17uv4JY$3!=SaQ2SGb+n{=#CYc_p(n{nhfvDZ2`OPO|Wn++U2gf>G8DC^&YLBtMbK=llf;|K!7AR zRZ|&j7AjBml!MC^-4$+2R?s{#&OL`@Q-S&j`2XPeCUQP3O$bj)O`4s( zK1l>uHNMzyS~|FiSx)U#O`vMlYJ#9!-(y%0O|pgs{7bfGO17@~AGYL-%o{Fl2c$lC z6SdEK;CVg}5(1xE^n6eq8X18Og2xYxK}KTH50RUKz{$(*p z(=g(y6}87MMYI=Gd=SVS97*JM!Bb|6sTapD(BR0Y7^cY=1Et}^R zT)KQj`NI=b@)-%#>Vy;&#S#o_u$&=9ZI9XJ#G#nI(v)qYGbwhg!kL^Wl#>&1$&q2Jzma{S}-C}4fW z(36Y|4RvWawy!#UKp^1ZMN*k9DPT*n3LsLM7hSd%hK=jb;ozPc@h9bs+0ApT&e0DR zdB6J#;idYHG1ufMKtj^3o6)ad8r~`Ox~GzkH^fhTlneRoWEbS6_Yp%)!sBv9(I1Eu z%H;O2x!4jqI4CqtRqDeb6Hz40+Vm;kCdn~ZoJzJ=jC^-xiFZZ)H?#HYUVT!8vgAPX z0nOE8y|0J9k}lL3!*gfS$7S27?Ia&SIx`6a%U*E-nX4btPiea`N(~Uy0c)exMud( z`g{tV2Q;;{wS&jW^0I1Oxi}4A5y?1waMDuuf`svD`%gQpKF~gIG6T3UL1>QLw&@UjXa zLH(uAZ?$R9H=WSW?Fzs2Sn+?yh;WnUi+)B4|14uH8W+lgUgq1M_4RyO5zh1eM~=pG zK+_bwzSsgg#%PCkBc1ZWUVHa$F!Ti3d<9A?_0(UF&6P9bX zEw6|_HERf{6u0{3^hjgu6b8YnM)pAUWo_BU^e51WOMMSneiSA5Ia$K#hGzt-7fLk3 z1ls*k_iIdgte&L@LKA0J&x|QZZpjv%({*wSn1sCR)CJBa7T*--t`?O5D5S8t z=qNPqN?K{VUcz#}Tk`pLn(f0^?=NTC3}GE@UA8#gJw1~Z+B{E}BeZ}K4a|&8BZj<6 zkd|c70I#L!`z|qPg%j4qtkuiXjyA1R)z0f~xu{G%PFDd>%UG4rU>NI|{R>7%1jE27 zkgm#=C=SKm*7fm=O2P~M+=~kmBDPVEI<6%IDri0yT*SoS0qCAr6==)%H6gu8AA?Cd z3!EvC&18?N!%n_Z?CycUHIS-@Y>003L>pEy@MopSfM=hg1-%53dm7Uks03pg{Zv0;Y*osP5znvqo0R zxIis9EW}WkuG5(L$|Ysgp1SJZ8n82>ua1E-j52%DvRu!v&%J}(Jg!&cU}PQDVoX~& zl>!mqt^Ok)XUgy%w)O+|dAII<1xq5877S=OrF$@u&4fn+1aQ*4s=(|f zx2x-oj{4M3kzPSe%1}xw6zW>5_ji?*4FO90I7q`TJJSDfFIW4OURT0T^;Yccs#j2c zTy5_KDo>B)KXQll9(uZ4;IqF^)e}ejX_}hrIj9hRR_cSTjK^!B1L{EoOa23l;Y)N% zEC>h@$fCLF;uK6q45oyHo6gv*iQsyZABWS~*30(3b7k|VTIh=~1pLHz?GbHTvYHMp z;XD6{bZ0}o#e7U9Bw&_mP5r{dVU{)u)wtjcU=RycfH?)6oEJz4ZxqRM_#(?9P#_3U zs(8bmX`-LB1kYCVlXlio+B`!O!XYS9uT$Q49u1*t(2gNehT6x-u?@7(AXn1G^?6d+ zin7t#O>_)LFvX-Vn!(B0kAozfiw@5Z>l`+45?fDCk9;jJ(}`(Kg~@NlYLkTOTyX)h>|R$eDG!_;px0mW@^Esn5?`0sblrt%R&Wi*d7eC4Y47XzRbEhmcyQi5R3)-|{bt=ch#_^=__Gk+ zw>xi5*2vEo)(qxPx}g zb!-|YLcOf9|H?d0C3^dotuEsdlaNFLo_`daoY+7zC@Zu2RuI(~?`f{P!`YL(2&n$# zS)lUBzAy9A@`AikZc;q*s9D%7cFj)qMc-B%r86fsr$T4=wQ}*UDy90K2QuzlL%SMA z9Ja#mY)W9!M`3eATS5Dw{nfQY*q-*x>L4pdOm1*p6S7RG2L0K4>m*(_-Lz2HTn6^U zu#^g9ma99xat5Dz2G6Lk@Qc6#@&|ervO;{K$Xf%QSB(gEgyFHX7_@p@g!#%n=_Rf` zKVHSX#T>36k;Yi+K7?sd1aF)Yed1WX9Me3%NZ^8rkK~1Fk7h18-#R8b89VQL@1UiF ztt+GN5l`3lE8SvJpd%sF8zqzYPv{6x1_#*~;1d%^WOzN`H8>qf+}~alF~ig)Y_9Bn z@`_p|_IJ%C_KBv~4Ckskq1}UCvvl&!@aTK#piIA}Y|FJr&EWyLqAY8HQZEI_On6HO zoTsu82_RY~%sgx?s`%|u*(>=CI*GwY$H%}%H$Ok$yzI0n_$GIdwwv7V=s(UCkRG!b ziqDb2EW)qtc1jLdNQ;S{VRY1-4ygC)zPR1^I8nr(&i-ni=IjP*wW~|WmT?gl**&Fo zER*fFet}TZ_t&GmitwKN+BiEqi_7oK(rFg=a5f_JiklV&dTbT`?vzE@p8f=meExdl zc<@0JOY3K~C`y?Ea|c+T>4goF%C-O5d6Wyl=V7k%C4ZAV35Es1YS=)Y&Sf;ZQI%kj zZ5`_%AzTKggyUJk9*UWBE;GI?W6=1XC++1CSW28w?r8g|B>H(4;u6ubXC%zhV#2CA z+OK>1PF1D4E}7hGak5kRT9?AD3yhCK(dS8|9WNPMDDy|?w7;&Pa7GaNIB*T95KuWp z!-|?_FfiJ==&GEjs*&Fr3uf$de|eK%?len!%|R47k-XUzvhjOE0-2C1lCv;!BXoCl z!8AA?`1<$=n~a_b>_+`Tr|8GATyDn#<{Fxe%h;lhOC9xxU4eo;Im_JM7d^yMF3FQ3 z6rAGoR`-zmvUEom_D2M0Q~Ix-_gZ?L9!h^x@5RfuJ$jimK83N1cXaY2>AWKeqZS2r zf|-?o9~0Z1@l?%A2kB2ES|*hW(`R3UB{CS=KOZ2Dy}ICd@YMVal_~Q&3;{q3 zAV9g&jrw@FNKsW4Yp%vJ(0n4#aBDDm<%I5p))2;fJqFeAtv|b~y`8I>lfrM{itdTr zv@-7rkNx-pv5z(63(a?4Qx5#e`i+fwxVw!g{yuY>#>a-_#*taPjFIMPB=S%UV^WVEf9enWz^vXjx?Y za_u(RrGG-X|`a^AH43%^8X1B-+DH(*byk<{3!uyCGJ zKidW$+$pe9V=6xQUu+h~t!>;YN z;)4(8HA3NwJuyp{I9gX9j0Q{z8)C_b8sds7lV0vsof04Qa0$F=ZBUXuPjkYcifE3{ z4-IoG+*2N%2_zBvWa1~}t&nZH!|zB#T($Vaqna3EuvvYF>pf9I_$>l~ z4bJmU(hanA06%<`|s~|Se;xZ z6id@@;1>GfL?SSC*0(rHyR@p)`wv#f*Vi5aIbFge|2J52@os;RJk$>B>HO{n-`wKPeQu!9-h4^jTg{t}Jg@_U}uqMnhf-h>S`*I z7bYH=Y!%p4z^@mP!M77kA7OOA(3-xw@`>P_vACg-kDh&B9n~SHmq7*YW3;kqdzFIL zw&>}a5}LF!f@i^Fm#wgk-5#4CdhSNIM_#J5FvG>VwNDW60rQc&OSj%WV7^Asw}IY3 z;Zw1o*3!1$3idaa)>HtP2R7VnFgY1(lbU_emAKmwFgw+3p}E6Voz0M}GXvX}5-)Vx zy}#GZnWDY0)LKH1EA(aqaI2#Ab1^Zo4=Q%?Fn0#s&4n>^v=ZYRt`}Bm(_1Y8NM)}G z^ZV(Qbt0S-k5CZU3pglC)V9$WJ_`R3f*Lfn6m7C!iks%N3kVFRF19@RP(_O(Ko54- z1kKlDUk5mTxH^vu8*WUw{&kSbxH^eJ&Z$rMq1wLYFtIEKB8J#KIC}jYm?(X!o9Seb zLTTQq{%}E_*GRh(uU9Sa2_Bk~;U>|^{)?$drxd7!!@yS#S!MbVq;!zK60fdnPuv74 zG_nUh?>u`yK>7wWQH7`N%-NmG%UN!57=Bv-*KyAreXQt7a=Jx13Cs&7cB16snbCoT z5Ol^C(B*gvZXXKk&|ohEArNkd1C&J(Nv%xsHfXCAIoWwU5{{?!tRihbm7zNM(A))` z{-#vAz}52W<}9ncPHdN{)8P)d_r8HzAbkirKIvuzN=c+VJCmwnYFxlPnTU8BV4qo zk!0I-tIcu1PzT7&!8*L}?G~%n;4uGZGBw>f`%$sN);hyuoin>nlbpDGE?%?f=%GSpJQ+$fGiYJ-7ZYq*h_+ ztglKqaaADdW}fBz_S)@dd|niX$#1agLnr0EoGpp^6A0>$jw))DtH8XJ0<Lgn|sFXWK4$BIVamzMkQtj~XSzb!n07B8i-;fqc%PZ55EPy;$e7TN%HJDG5?e}(c{*KF}D!7NSA_j^?rlmBw1C%ZY~aA zVF|i%#9JdJI_2>Y`$4*T-50t`>bY%#Tx!K&O;*7>Bo-N25w<%f)foS>=s0D^JA|T_ zm#HtWOF3FJ#ph|ZZ?GiZ-e0*X3H{_Pm1GiTNr@8s6Hh55fp`c)rzp%&v#69RGk?~Y zuG4lw-ot&IrcKtn3hB7-$}sy(9JeFSKs=d(rMJc&DES*xs)CqL>Rp3ZfA3zk8hx#9 zv+&~Ql~m)s67gXvUPu`UO8aB2P1g~H{@d;q6L6`sWzPENXaL@W5eJ=3<2SrJyHWh+R*z>FS6Z9 zZL0>gW9^L4q#ZZsp=O%#e^D<(@gb+`#_HzPGq%AtN3+f2hN&QHrYoV6gRRjmSnC(NKSH6zZ-iO$-HQAzmE=}#p)k&$ z$bAfErY#!}%39S$mIuBrsIzbKTV3^M!?iu;=vOl&#DcF^ciCZV{nQOz74e2+$1Xd# zQcT<5nV{+H-L!u*B;vk7>OOM%7=3fZ?>~fT&>ryecx*!0ucE~$pbf#DjUD4_9YEGx zASyldN%CMKlI-U6FDioLWvJ5wTNW4|Yr0$C!0~ePRp2bkYpUBP_6)KI1=$OiDWb;v zS@2x%0GS6&h_46C`d=E|#_3JWcuS8UJs5Sb-QAFP@7fItbD>81wq?>!-iUbzxZzSe zH2ASDA+H>5hjYsMm@d6nw+hkEVP@KWrU8e_VZ9o8+q_I+xq)D_4?gIE2}RRFzSESX+QV(=s}0IoWaKVGR3&%?o%uDbOidCn;xziJoR|}z+DE%8 zi0f|5Cgy_`60~*lsZ5JWJ~g^Dm)F>d&oogV+Zj#Nh6>6kTlXeX9{_lgp(ROmTKNS- zK|bL@?3KGrGvQj(fM|NUedO+^)gbO(hy>k6vNUNz%*Oz#OKSI(YYP^a>qcTfC5FhvQNQNmUqr%*W{OxxhP2U4{ z<%r;pq9G5o>K2?~t6fA{d{#!uX-e${!7`v$O9t)Z9EqD!{4A%eR_NNkNKV(^c*y&_ z8651js8~Y3?Xt=&%XK8Tb>B?2XjSyeSiLoI5$bA&v=xKGvqPz<{`=5k!5pLm-K2oT zNPS`BzI}EKW-CTZ<#@c5te6LkNc|H7m3i1(gf*|tYE@mF&5cCPL}$v3@YZeO&dmC= z(G`12>bk^DKTw;Uy7onXs(ymUX@&yRgV)Yh1*|X*IjeA&?rr~RgraGc^iv{D?Q<*O zoQ#f#7kqQJtzphLnd>eigCO#qHEsumLOQ*nG9)P zVWRTpp#TI_iGjeaxZxDhm53&MI!^);sq7F4axWk@`PQ;`V_$3*x?Z`MzT@+BoSI1C zDAj`AsA>6f<^Qe1?Su)7>CrtfhI&B|KeTztB*{j9>Z^)d*#@yOfvd};Xo|qmqbo8)a6)C;lE@hgO|h#v-4*7~01nn(0274$Is6@Qj1ZuuP_dpIaGYtE+ z-5p6%hJk^JiRu1uvrQMDD+08JmKr$hOm<`0eIW!s#i2q-N=m-7P!H8eKZOue{-&6GcQy*$U3h<%uNn_y26_cOm`W*Q5JbNUs3V zz<2YtjKirsDu7H(_TM`dgaXvxJ#y)fK_Dusa?>GvATR32`B0GaKvq-8v#2*|TQQ`df;biS$%}3B?bT9n$eZoM7qM8t}TF@AQ|_?MgxyGD0XQD2R!R zOG~`IyE=*t3k$Qbq{sVH5-J8#14gb;CZZqRhYqw7Df9pWgnJFm&9z{vsa^oC=v08J zuQw5&7+_y!Xp$p|KgY{ecFmy}9dUAyMHBpij9MXGXKYH@1NgQ8 zv@)R})CJgu{7NuB+#S(LWs*N#_B4eH1%U}v)Qs8(Nq&st1CZ{?SXt4n=WD6hfd5cM zhiq!pr2E42kEaSq02p62RLK|-Xn;@A6^b)4H!ib|40t!vDzvt@ zLjvJ-pX+ycCpfZe7y19MgRq`D2umS0?UipUP-gI9cbp2CQrQyUWhF3t_9TE3Vkksx zhSuwob*i?n&RFq(N!LD~K|p2n=M|I6if%Ntj7V;q1@7aU$!g26iM~+_=}fbc^zQ(5 zz*zezk$s4o9x|8lIApa%D72^m-#!p)gq77#6)?7Mfo`09f>2 z;=MXpZV_T*W3%8yt4#mXJFlL4r^c-h{8`Lkvp*hJ(4D(eQc+6bZ}sr_`+>$n3!Y@i zU0C35G8lkcO=koVAEl&FaAaJa*JE=G)c_emVgO%$#EJ#K21@&8aE_o9F;V@mm!yCR z=)n@EbV@!84xjULRVy8Wh=HEkj-hTOPADhxCT?^ka+Hz%NbzW%uA|<^H&Y)^bH{ao zQH!H&T|Z&5T@z!_s)TN9YYPerQmo7=oaJs5Y(iT1tn+uegvA!g=|Sri--z0p{F;8#w}Ay-|^)d{)rv z`p!kY$jmCPa(lUEEi`kcQe9G&>vK)I5G+Vpf{C~>K}!}{-+X(&DTjAm_8q=%U#Y) ztIa21Yin!SEY>;l(i}l-9}&fQ#u)9@T}}+LRK2fx+kgWdx5Z~P@&c)X#tiqhEI8H zgkp)ops(;jGtmGr!_LaeigCyX>}+4Exdf%ZU5_G$AK4F8gF`V|L=)sZCk~oI6(22F ze4#R{)ywV*7U|(bI_t7_ADh`RNPMhsrCJ{y=DRjn<+RF}Kue@nXzk8tC|8|41b8k2 zRXB(}%v}SQ>=ia0Z0^(FvGFV3l>g9~Yq&Lg3>9b*3Jj=8u<%GE*OieB{rH<00D?gu zEzWc;zz3#uzt6KCTQm~%D!Xm@y78K!)K$YT&wpt1FSyg>|0~CDbx<-oaAplVyXnkg zUl0h3vhTrR$_LBT92|x0_0}7T?K<3=C8(4u zp)Q=amK|LkkaN>Dtz6Z9eDipkWuU?hK1ScQXc3q+`Ip4)4gp2y0IME|QYn6AE3S(zir^sshB0p48%8%yNjtNml0f>*YBC5G_ z0wd7K_`I^d<6P2EHjJOij#@&UKOUi7>VbWs&}Y!yb}?c;*Mgwx^wS0o8{)=u`<;`p zsGc^fNy4Y~pHM$GcPgs2{S)Go^)H)N-i!hKbecylGeN`P6_poX5^3yKkc`3z0pN4)#(&l?y%&P`(mzxQ&Rs;Tvrd9?F?N?zfCp;E{lwk>y)mk(ukqE0M0LRIf4|VI{87qc zidrlA6ajhV#Sx22!LD*lBC*~Kkic{M)an)qZnAR+cz%|v`#X~9jx|qH|NPL80P%p` z#c4~gSG3?zV5wTS_hC zz^X73Im-+7#K%>hI7|@zXyD9xBvxG&CJT0V>A8lv-Dd_ak8@19lXo; z{2_^`o}$aH5rDe8x1XKtU{j}_UCsURP+l^NHXd}MYxA+SCY-#W-^m>j)$)g_z#vL= zAAHIG-05@X%chVpHN1k0>mH7e%@GtbUIr0VBTV=qYzaJjD!{DSB-vTn_n#|GD=#+a zvEIc{dw=Cl1AT2yK3vEsSk5Urk4kh*H-p2tFgse{YU*{MSU$zzxXLTr?{pu5+9uGBpv4` z1>}%ec;Kgu(WGQ$JEF)$GXZbT*)|P*{TAcl#u?`aZensoGw$R<%P$_{wQk}b8sdA( z7|goBc`4HsjobN{l$?U%N&jZgP!X?0N?JOaP=ortX+)t~@1izHElU-!wg#vRG$xpml=kFn$B+FO=NKC@2yDj;@=QZ2t$*etJT*S&}Bft!|{{R!bj&Cn4_h+jlD;>jr z0YZRY6cG_|eRtGCCD|7=14~6iL;oi3^e>&K01a4W)ZtAF{oxA&Tl?ebS?zZe0sru? zlB7@aEt%bDqhn*yR{mJ{_#uGokWSsl-0tu40e_Oon=}BN-n>FLmx88*uB@yqH|&7z zg4bY O_>&fw7b_Jp@ckbyu=>RS literal 0 HcmV?d00001 diff --git a/src/doc/rustc-dev-guide/src/img/llvm-cov-show-01.png b/src/doc/rustc-dev-guide/src/img/llvm-cov-show-01.png new file mode 100644 index 0000000000000000000000000000000000000000..35f04594347a398ca8321faf85fa018b192fa843 GIT binary patch literal 416748 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 eb{ffNh(JNO) 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�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ℑ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%0Arl<=>f7dzSI3d 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 A5C8xG literal 0 HcmV?d00001 diff --git a/src/doc/rustc-dev-guide/src/img/rustc_stages.svg b/src/doc/rustc-dev-guide/src/img/rustc_stages.svg index b6671aa7cc..25f7ab11b4 100644 --- a/src/doc/rustc-dev-guide/src/img/rustc_stages.svg +++ b/src/doc/rustc-dev-guide/src/img/rustc_stages.svg @@ -1,2 +1,3 @@ + -
    Download
    Download
    beta
    beta
    stage0
    stage0
    Builds
    Builds
    stage0
    stage0
    Outputs
    Outputs
    libstd
    libstd
    Copy
    Copy
    stage0-std
    stage0-std
    stage0-sysroot
    stage0-sysroot
    Builds
    Builds
    stage0
    stage0
    Outputs
    Outputs
    libtest
    libtest
    Copy
    Copy
    stage0-test
    stage0-test
    stage0-sysroot
    stage0-sysroot
    Builds
    Builds
    stage0
    stage0
    Outputs
    Outputs
    rustc
    rustc
    Copy
    Copy
    stage0-rustc
    stage0-rustc
    stage0-sysroot
    stage0-sysroot
    llvm
    llvm
    Builds
    Builds
    stage0
    stage0
    Outputs
    Outputs
    codegen
    codegen
    stage0-codegen
    stage0-codegen
    Stage 0
    Stage 0
    Copy
    Copy
    stage0-rustc
    stage0-codegen
    stage0-sysroot
    [Not supported by viewer]
    stage1
    stage1
    Builds
    Builds
    stage1
    stage1
    Outputs
    Outputs
    libstd
    libstd
    Copy
    Copy
    stage1-std
    stage1-std
    stage1/lib/rustlib
    stage1/lib/rustlib
    Builds
    Builds
    stage1
    stage1
    Outputs
    Outputs
    libtest
    libtest
    Copy
    Copy
    stage1-test
    stage1-test
    stage1/lib/rustlib
    stage1/lib/rustlib
    Builds
    Builds
    stage1
    stage1
    Outputs
    Outputs
    rustc
    rustc
    Copy
    Copy
    stage1-rustc
    stage1-rustc
    stage1/lib/rustlib
    stage1/lib/rustlib
    Builds
    Builds
    stage1
    stage1
    Outputs
    Outputs
    codegen
    codegen
    stage1-codegen
    stage1-codegen
    Stage 1
    [Not supported by viewer]
    Copy
    Copy
    stage1-rustc
    stage1-codegen
    stage1/lib/rustlib
    [Not supported by viewer]
    stage2
    stage2
    Builds
    Builds
    stage2
    stage2
    Outputs
    Outputs
    rustdoc
    rustdoc
    Copy
    [Not supported by viewer]
    stage2-tools
    stage2-tools
    Builds
    Builds
    stage0
    stage0
    bootstrap
    bootstrap
    llvm
    llvm
    stage2
    stage2
    Stage 2
    [Not supported by viewer]
    \ No newline at end of file +
    Download
    Download
    beta
    beta
    stage0
    stage0
    Builds
    Builds
    stage0
    stage0
    Outputs
    Outputs
    libtest/libstd
    libtest/libstd
    Copy
    Copy
    stage0-std
    stage0-std
    stage0-sysroot
    stage0-sysroot
    Builds
    Builds
    stage0
    stage0
    Outputs
    Outputs
    rustc
    rustc
    Copy
    Copy
    stage0-rustc
    stage0-rustc
    stage0-sysroot
    stage0-sysroot
    llvm
    llvm
    Builds
    Builds
    stage0
    stage0
    Outputs
    Outputs
    codegen
    codegen
    stage0-codegen
    stage0-codegen
    Stage 0
    Stage 0
    Copy
    Copy
    stage0-rustc
    stage0-codegen
    stage0-sysroot
    stage0-rustc...
    stage1
    stage1
    Builds
    Builds
    stage1
    stage1
    Outputs
    Outputs
    libtest/libstd
    libtest/libstd
    Copy
    Copy
    stage1-std
    stage1-std
    stage1/lib/rustlib
    stage1/lib/rustlib
    Builds
    Builds
    stage1
    stage1
    Outputs
    Outputs
    rustc
    rustc
    Copy
    Copy
    stage1-rustc
    stage1-rustc
    stage1/lib/rustlib
    stage1/lib/rustlib
    Builds
    Builds
    stage1
    stage1
    Outputs
    Outputs
    codegen
    codegen
    stage1-codegen
    stage1-codegen
    Stage 1
    Stage 1
    Copy
    Copy
    stage1-rustc
    stage1-codegen
    stage1/lib/rustlib
    stage1-rustc...
    stage2
    stage2
    Builds
    Builds
    stage2
    stage2
    Outputs
    Outputs
    rustdoc
    rustdoc
    Copy
    Copy
    stage2-tools
    stage2-tools
    Builds
    Builds
    stage0
    stage0
    bootstrap
    bootstrap
    llvm
    llvm
    stage2
    stage2
    Stage 2
    Stage 2
    Viewer does not support full SVG 1.1
    \ No newline at end of file diff --git a/src/doc/rustc-dev-guide/src/img/wpa-initial-memory.png b/src/doc/rustc-dev-guide/src/img/wpa-initial-memory.png new file mode 100644 index 0000000000000000000000000000000000000000..b6020667ef00ff3a1efbf7007e6df8344baaa5cd GIT binary patch literal 312637 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
    (116}c`2`OXfEf)^q_t4U0_CFvR@wS6HYQ%o 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

    "); } -fn item_opaque_ty(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::OpaqueTy) { - w.write_str("
    ");
    -    render_attributes(w, it, false);
    -    write!(
    -        w,
    -        "type {}{}{where_clause} = impl {bounds};
    ", - it.name.as_ref().unwrap(), - t.generics.print(cx.cache()), - where_clause = - WhereClause { gens: &t.generics, indent: 0, end_newline: true }.print(cx.cache()), - bounds = bounds(&t.bounds, false, cx.cache()) - ); - - document(w, cx, it, None); - - // Render any items associated directly to this alias, as otherwise they - // won't be visible anywhere in the docs. It would be nice to also show - // associated items from the aliased type (see discussion in #32077), but - // we need #14072 to make sense of the generics. - 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) { - w.write_str("
    ");
    -    render_attributes(w, it, false);
    -    write!(
    -        w,
    -        "trait {}{}{} = {};
    ", - it.name.as_ref().unwrap(), - t.generics.print(cx.cache()), - WhereClause { gens: &t.generics, indent: 0, end_newline: true }.print(cx.cache()), - bounds(&t.bounds, true, cx.cache()) - ); - - document(w, cx, it, None); - - // Render any items associated directly to this alias, as otherwise they - // won't be visible anywhere in the docs. It would be nice to also show - // associated items from the aliased type (see discussion in #32077), but - // we need #14072 to make sense of the generics. - render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) -} - -fn item_typedef(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Typedef) { - w.write_str("
    ");
    -    render_attributes(w, it, false);
    -    write!(
    -        w,
    -        "type {}{}{where_clause} = {type_};
    ", - it.name.as_ref().unwrap(), - t.generics.print(cx.cache()), - where_clause = - WhereClause { gens: &t.generics, indent: 0, end_newline: true }.print(cx.cache()), - type_ = t.type_.print(cx.cache()) - ); - - document(w, cx, it, None); - - // Render any items associated directly to this alias, as otherwise they - // won't be visible anywhere in the docs. It would be nice to also show - // associated items from the aliased type (see discussion in #32077), but - // we need #14072 to make sense of the generics. - render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) -} - -fn item_foreign_type(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) { - w.write_str("
    extern {\n");
    -    render_attributes(w, it, false);
    -    write!(
    -        w,
    -        "    {}type {};\n}}
    ", - it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()), - it.name.as_ref().unwrap(), - ); - - document(w, cx, it, None); - - render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) -} - fn print_sidebar(cx: &Context<'_>, it: &clean::Item, buffer: &mut Buffer) { let parentlen = cx.current.len() - if it.is_mod() { 1 } else { 0 }; @@ -4807,65 +2382,8 @@ fn sidebar_foreign_type(cx: &Context<'_>, 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| { - highlight::render_with_highlighting( - &t.source, - w, - Some("macro"), - None, - None, - it.source.span().edition(), - ); - }); - document(w, cx, it, None) -} - -fn item_proc_macro(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, m: &clean::ProcMacro) { - let name = it.name.as_ref().expect("proc-macros always have names"); - match m.kind { - MacroKind::Bang => { - w.push_str("
    ");
    -            write!(w, "{}!() {{ /* proc-macro */ }}", name);
    -            w.push_str("
    "); - } - MacroKind::Attr => { - w.push_str("
    ");
    -            write!(w, "#[{}]", name);
    -            w.push_str("
    "); - } - MacroKind::Derive => { - w.push_str("
    ");
    -            write!(w, "#[derive({})]", name);
    -            if !m.helpers.is_empty() {
    -                w.push_str("\n{\n");
    -                w.push_str("    // Attributes available to this derive:\n");
    -                for attr in &m.helpers {
    -                    writeln!(w, "    #[{}]", attr);
    -                }
    -                w.push_str("}\n");
    -            }
    -            w.push_str("
    "); - } - } - document(w, cx, it, None) -} - -fn item_primitive(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) { - document(w, cx, it, None); - render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) -} - -fn item_keyword(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) { - document(w, cx, it, None) -} - crate const BASIC_KEYWORDS: &str = "rust, rustlang, rust-lang"; -fn make_item_keywords(it: &clean::Item) -> String { - format!("{}, {}", BASIC_KEYWORDS, it.name.as_ref().unwrap()) -} - /// Returns a list of all paths used in the type. /// This is used to help deduplicate imported impls /// for reexported types. If any of the contained diff --git a/src/librustdoc/html/render/print_item.rs b/src/librustdoc/html/render/print_item.rs new file mode 100644 index 0000000000..6cdd383802 --- /dev/null +++ b/src/librustdoc/html/render/print_item.rs @@ -0,0 +1,1420 @@ +use std::cmp::Ordering; + +use rustc_data_structures::fx::FxHashMap; +use rustc_hir as hir; +use rustc_hir::def::CtorKind; +use rustc_hir::def_id::DefId; +use rustc_middle::middle::stability; +use rustc_middle::ty::TyCtxt; +use rustc_span::hygiene::MacroKind; +use rustc_span::symbol::{kw, sym, Symbol}; + +use super::{ + collect_paths_for_type, document, ensure_trailing_slash, item_ty_to_strs, render_assoc_item, + render_assoc_items, render_attributes, render_impl, render_stability_since_raw, spotlight_decl, + write_srclink, AssocItemLink, Context, +}; +use crate::clean::{self, GetDefId}; +use crate::formats::cache::Cache; +use crate::formats::item_type::ItemType; +use crate::formats::{AssocItemRender, FormatRenderer, Impl, RenderMode}; +use crate::html::escape::Escape; +use crate::html::format::{print_abi_with_space, Buffer, Function, PrintWithSpace, WhereClause}; +use crate::html::highlight; +use crate::html::markdown::MarkdownSummaryLine; + +pub(super) fn print_item(cx: &Context<'_>, item: &clean::Item, buf: &mut Buffer) { + debug_assert!(!item.is_stripped()); + // Write the breadcrumb trail header for the top + buf.write_str("

    "); + let name = match *item.kind { + clean::ModuleItem(ref m) => { + if m.is_crate { + "Crate " + } else { + "Module " + } + } + clean::FunctionItem(..) | clean::ForeignFunctionItem(..) => "Function ", + clean::TraitItem(..) => "Trait ", + clean::StructItem(..) => "Struct ", + clean::UnionItem(..) => "Union ", + clean::EnumItem(..) => "Enum ", + clean::TypedefItem(..) => "Type Definition ", + clean::MacroItem(..) => "Macro ", + clean::ProcMacroItem(ref mac) => match mac.kind { + MacroKind::Bang => "Macro ", + MacroKind::Attr => "Attribute Macro ", + MacroKind::Derive => "Derive Macro ", + }, + clean::PrimitiveItem(..) => "Primitive Type ", + clean::StaticItem(..) | clean::ForeignStaticItem(..) => "Static ", + clean::ConstantItem(..) => "Constant ", + clean::ForeignTypeItem => "Foreign Type ", + clean::KeywordItem(..) => "Keyword ", + clean::OpaqueTyItem(..) => "Opaque Type ", + clean::TraitAliasItem(..) => "Trait Alias ", + _ => { + // We don't generate pages for any other type. + unreachable!(); + } + }; + buf.write_str(name); + if !item.is_primitive() && !item.is_keyword() { + let cur = &cx.current; + let amt = if item.is_mod() { cur.len() - 1 } else { cur.len() }; + for (i, component) in cur.iter().enumerate().take(amt) { + write!( + buf, + "{}::", + "../".repeat(cur.len() - i - 1), + component + ); + } + } + write!(buf, "{}", item.type_(), item.name.as_ref().unwrap()); + + buf.write_str(""); // in-band + buf.write_str(""); + render_stability_since_raw( + buf, + item.stable_since(cx.tcx()).as_deref(), + item.const_stable_since(cx.tcx()).as_deref(), + None, + None, + ); + buf.write_str( + "\ + \ + []\ + \ + ", + ); + + // Write `src` tag + // + // When this item is part of a `crate use` in a downstream crate, the + // [src] link in the downstream documentation will actually come back to + // this page, and this link will be auto-clicked. The `id` attribute is + // used to find the link to auto-click. + if cx.shared.include_sources && !item.is_primitive() { + write_srclink(cx, item, buf); + } + + buf.write_str("

    "); // out-of-band + + match *item.kind { + clean::ModuleItem(ref m) => item_module(buf, cx, item, &m.items), + clean::FunctionItem(ref f) | clean::ForeignFunctionItem(ref f) => { + item_function(buf, cx, item, f) + } + clean::TraitItem(ref t) => item_trait(buf, cx, item, t), + clean::StructItem(ref s) => item_struct(buf, cx, item, s), + clean::UnionItem(ref s) => item_union(buf, cx, item, s), + clean::EnumItem(ref e) => item_enum(buf, cx, item, e), + clean::TypedefItem(ref t, _) => item_typedef(buf, cx, item, t), + clean::MacroItem(ref m) => item_macro(buf, cx, item, m), + clean::ProcMacroItem(ref m) => item_proc_macro(buf, cx, item, m), + clean::PrimitiveItem(_) => item_primitive(buf, cx, item), + clean::StaticItem(ref i) | clean::ForeignStaticItem(ref i) => item_static(buf, cx, item, i), + clean::ConstantItem(ref c) => item_constant(buf, cx, item, c), + clean::ForeignTypeItem => item_foreign_type(buf, cx, item), + clean::KeywordItem(_) => item_keyword(buf, cx, item), + clean::OpaqueTyItem(ref e) => item_opaque_ty(buf, cx, item, e), + clean::TraitAliasItem(ref ta) => item_trait_alias(buf, cx, item, ta), + _ => { + // We don't generate pages for any other type. + unreachable!(); + } + } +} + +fn item_module(w: &mut Buffer, cx: &Context<'_>, item: &clean::Item, items: &[clean::Item]) { + document(w, cx, item, None); + + let mut indices = (0..items.len()).filter(|i| !items[*i].is_stripped()).collect::>(); + + // the order of item types in the listing + fn reorder(ty: ItemType) -> u8 { + match ty { + ItemType::ExternCrate => 0, + ItemType::Import => 1, + ItemType::Primitive => 2, + ItemType::Module => 3, + ItemType::Macro => 4, + ItemType::Struct => 5, + ItemType::Enum => 6, + ItemType::Constant => 7, + ItemType::Static => 8, + ItemType::Trait => 9, + ItemType::Function => 10, + ItemType::Typedef => 12, + ItemType::Union => 13, + _ => 14 + ty as u8, + } + } + + fn cmp( + i1: &clean::Item, + i2: &clean::Item, + idx1: usize, + idx2: usize, + tcx: TyCtxt<'_>, + ) -> Ordering { + let ty1 = i1.type_(); + let ty2 = i2.type_(); + if ty1 != ty2 { + return (reorder(ty1), idx1).cmp(&(reorder(ty2), idx2)); + } + let s1 = i1.stability(tcx).as_ref().map(|s| s.level); + let s2 = i2.stability(tcx).as_ref().map(|s| s.level); + if let (Some(a), Some(b)) = (s1, s2) { + match (a.is_stable(), b.is_stable()) { + (true, true) | (false, false) => {} + (false, true) => return Ordering::Less, + (true, false) => return Ordering::Greater, + } + } + let lhs = i1.name.unwrap_or(kw::Empty).as_str(); + let rhs = i2.name.unwrap_or(kw::Empty).as_str(); + compare_names(&lhs, &rhs) + } + + if cx.shared.sort_modules_alphabetically { + indices.sort_by(|&i1, &i2| cmp(&items[i1], &items[i2], i1, i2, cx.tcx())); + } + // This call is to remove re-export duplicates in cases such as: + // + // ``` + // crate mod foo { + // crate mod bar { + // crate trait Double { fn foo(); } + // } + // } + // + // crate use foo::bar::*; + // crate use foo::*; + // ``` + // + // `Double` will appear twice in the generated docs. + // + // FIXME: This code is quite ugly and could be improved. Small issue: DefId + // can be identical even if the elements are different (mostly in imports). + // So in case this is an import, we keep everything by adding a "unique id" + // (which is the position in the vector). + indices.dedup_by_key(|i| { + ( + items[*i].def_id, + if items[*i].name.as_ref().is_some() { Some(full_path(cx, &items[*i])) } else { None }, + items[*i].type_(), + if items[*i].is_import() { *i } else { 0 }, + ) + }); + + debug!("{:?}", indices); + let mut curty = None; + for &idx in &indices { + let myitem = &items[idx]; + if myitem.is_stripped() { + continue; + } + + let myty = Some(myitem.type_()); + if curty == Some(ItemType::ExternCrate) && myty == Some(ItemType::Import) { + // Put `extern crate` and `use` re-exports in the same section. + curty = myty; + } else if myty != curty { + if curty.is_some() { + w.write_str(""); + } + curty = myty; + let (short, name) = item_ty_to_strs(&myty.unwrap()); + write!( + w, + "

    \ + {name}

    \n", + id = cx.derive_id(short.to_owned()), + name = name + ); + } + + match *myitem.kind { + clean::ExternCrateItem { ref src } => { + use crate::html::format::anchor; + + match *src { + Some(ref src) => write!( + w, + ""); + } + + clean::ImportItem(ref import) => { + write!( + w, + "", + myitem.visibility.print_with_space(cx.tcx(), myitem.def_id, cx.cache()), + import.print(cx.cache()) + ); + } + + _ => { + if myitem.name.is_none() { + continue; + } + + let unsafety_flag = match *myitem.kind { + clean::FunctionItem(ref func) | clean::ForeignFunctionItem(ref func) + if func.header.unsafety == hir::Unsafety::Unsafe => + { + "⚠" + } + _ => "", + }; + + let stab = myitem.stability_class(cx.tcx()); + let add = if stab.is_some() { " " } else { "" }; + + let doc_value = myitem.doc_value().unwrap_or_default(); + write!( + w, + "\ + \ + \ + ", + name = *myitem.name.as_ref().unwrap(), + stab_tags = extra_info_tags(myitem, item, cx.tcx()), + docs = MarkdownSummaryLine(&doc_value, &myitem.links(&cx.cache)).into_string(), + class = myitem.type_(), + add = add, + stab = stab.unwrap_or_else(String::new), + unsafety_flag = unsafety_flag, + href = item_path(myitem.type_(), &myitem.name.unwrap().as_str()), + 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(" "), + ); + } + } + } + + if curty.is_some() { + w.write_str("
    {}extern crate {} as {};", + myitem.visibility.print_with_space(cx.tcx(), myitem.def_id, cx.cache()), + anchor(myitem.def_id, &*src.as_str(), cx.cache()), + myitem.name.as_ref().unwrap(), + ), + None => write!( + w, + "
    {}extern crate {};", + myitem.visibility.print_with_space(cx.tcx(), myitem.def_id, cx.cache()), + anchor(myitem.def_id, &*myitem.name.as_ref().unwrap().as_str(), cx.cache()), + ), + } + w.write_str("
    {}{}
    {name}{unsafety_flag}{stab_tags}{docs}
    "); + } +} + +/// Render the stability, deprecation and portability tags that are displayed in the item's summary +/// at the module level. +fn extra_info_tags(item: &clean::Item, parent: &clean::Item, tcx: TyCtxt<'_>) -> String { + let mut tags = String::new(); + + fn tag_html(class: &str, title: &str, contents: &str) -> String { + format!(r#"{}"#, class, Escape(title), contents) + } + + // The trailing space after each tag is to space it properly against the rest of the docs. + if let Some(depr) = &item.deprecation(tcx) { + let mut message = "Deprecated"; + if !stability::deprecation_in_effect( + depr.is_since_rustc_version, + depr.since.map(|s| s.as_str()).as_deref(), + ) { + message = "Deprecation planned"; + } + tags += &tag_html("deprecated", "", message); + } + + // The "rustc_private" crates are permanently unstable so it makes no sense + // to render "unstable" everywhere. + if item + .stability(tcx) + .as_ref() + .map(|s| s.level.is_unstable() && s.feature != sym::rustc_private) + == Some(true) + { + tags += &tag_html("unstable", "", "Experimental"); + } + + let cfg = match (&item.attrs.cfg, parent.attrs.cfg.as_ref()) { + (Some(cfg), Some(parent_cfg)) => cfg.simplify_with(parent_cfg), + (cfg, _) => cfg.as_deref().cloned(), + }; + + debug!("Portability {:?} - {:?} = {:?}", item.attrs.cfg, parent.attrs.cfg, cfg); + if let Some(ref cfg) = cfg { + tags += &tag_html("portability", &cfg.render_long_plain(), &cfg.render_short_html()); + } + + tags +} + +fn item_function(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, f: &clean::Function) { + let header_len = format!( + "{}{}{}{}{:#}fn {}{:#}", + it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()), + f.header.constness.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(cx.cache()) + ) + .len(); + w.write_str("
    ");
    +    render_attributes(w, it, false);
    +    write!(
    +        w,
    +        "{vis}{constness}{asyncness}{unsafety}{abi}fn \
    +         {name}{generics}{decl}{spotlight}{where_clause}
    ", + vis = it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()), + 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(cx.cache()), + where_clause = + WhereClause { gens: &f.generics, indent: 0, end_newline: true }.print(cx.cache()), + decl = Function { decl: &f.decl, header_len, indent: 0, asyncness: f.header.asyncness } + .print(cx.cache()), + spotlight = spotlight_decl(&f.decl, cx.cache()), + ); + document(w, cx, it, None) +} + +fn item_trait(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Trait) { + let bounds = bounds(&t.bounds, false, cx.cache()); + let types = t.items.iter().filter(|m| m.is_associated_type()).collect::>(); + let consts = t.items.iter().filter(|m| m.is_associated_const()).collect::>(); + let required = t.items.iter().filter(|m| m.is_ty_method()).collect::>(); + let provided = t.items.iter().filter(|m| m.is_method()).collect::>(); + + // Output the trait definition + wrap_into_docblock(w, |w| { + w.write_str("
    ");
    +        render_attributes(w, it, true);
    +        write!(
    +            w,
    +            "{}{}{}trait {}{}{}",
    +            it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()),
    +            t.unsafety.print_with_space(),
    +            if t.is_auto { "auto " } else { "" },
    +            it.name.as_ref().unwrap(),
    +            t.generics.print(cx.cache()),
    +            bounds
    +        );
    +
    +        if !t.generics.where_predicates.is_empty() {
    +            let where_ = WhereClause { gens: &t.generics, indent: 0, end_newline: true };
    +            write!(w, "{}", where_.print(cx.cache()));
    +        } else {
    +            w.write_str(" ");
    +        }
    +
    +        if t.items.is_empty() {
    +            w.write_str("{ }");
    +        } else {
    +            // FIXME: we should be using a derived_id for the Anchors here
    +            w.write_str("{\n");
    +            for t in &types {
    +                render_assoc_item(w, t, AssocItemLink::Anchor(None), ItemType::Trait, cx);
    +                w.write_str(";\n");
    +            }
    +            if !types.is_empty() && !consts.is_empty() {
    +                w.write_str("\n");
    +            }
    +            for t in &consts {
    +                render_assoc_item(w, t, AssocItemLink::Anchor(None), ItemType::Trait, cx);
    +                w.write_str(";\n");
    +            }
    +            if !consts.is_empty() && !required.is_empty() {
    +                w.write_str("\n");
    +            }
    +            for (pos, m) in required.iter().enumerate() {
    +                render_assoc_item(w, m, AssocItemLink::Anchor(None), ItemType::Trait, cx);
    +                w.write_str(";\n");
    +
    +                if pos < required.len() - 1 {
    +                    w.write_str("
    "); + } + } + if !required.is_empty() && !provided.is_empty() { + w.write_str("\n"); + } + for (pos, m) in provided.iter().enumerate() { + render_assoc_item(w, m, AssocItemLink::Anchor(None), ItemType::Trait, cx); + match *m.kind { + clean::MethodItem(ref inner, _) + if !inner.generics.where_predicates.is_empty() => + { + w.write_str(",\n { ... }\n"); + } + _ => { + w.write_str(" { ... }\n"); + } + } + if pos < provided.len() - 1 { + w.write_str("
    "); + } + } + w.write_str("}"); + } + w.write_str("
    ") + }); + + // Trait documentation + document(w, cx, it, None); + + fn write_small_section_header(w: &mut Buffer, id: &str, title: &str, extra_content: &str) { + write!( + w, + "

    \ + {1}\ +

    {2}", + id, title, extra_content + ) + } + + fn write_loading_content(w: &mut Buffer, extra_content: &str) { + write!(w, "{}Loading content...", extra_content) + } + + fn trait_item(w: &mut Buffer, cx: &Context<'_>, m: &clean::Item, t: &clean::Item) { + let name = m.name.as_ref().unwrap(); + info!("Documenting {} on {:?}", name, t.name); + let item_type = m.type_(); + let id = cx.derive_id(format!("{}.{}", item_type, name)); + write!(w, "

    ", id = id,); + render_assoc_item(w, m, AssocItemLink::Anchor(Some(&id)), ItemType::Impl, cx); + w.write_str(""); + render_stability_since(w, m, t, cx.tcx()); + write_srclink(cx, m, w); + w.write_str("

    "); + document(w, cx, m, Some(t)); + } + + if !types.is_empty() { + write_small_section_header( + w, + "associated-types", + "Associated Types", + "
    ", + ); + for t in types { + trait_item(w, cx, t, it); + } + write_loading_content(w, "
    "); + } + + if !consts.is_empty() { + write_small_section_header( + w, + "associated-const", + "Associated Constants", + "
    ", + ); + for t in consts { + trait_item(w, cx, t, it); + } + write_loading_content(w, "
    "); + } + + // Output the documentation for each function individually + if !required.is_empty() { + 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", + "
    ", + ); + for m in provided { + trait_item(w, cx, m, it); + } + write_loading_content(w, "
    "); + } + + // If there are methods directly on this trait object, render them here. + render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All); + + 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 = FxHashMap::default(); + for implementor in implementors { + match implementor.inner_impl().for_ { + clean::ResolvedPath { ref path, did, is_generic: false, .. } + | clean::BorrowedRef { + type_: box clean::ResolvedPath { ref path, did, is_generic: false, .. }, + .. + } => { + let &mut (prev_did, ref mut has_duplicates) = + implementor_dups.entry(path.last()).or_insert((did, false)); + if prev_did != did { + *has_duplicates = true; + } + } + _ => {} + } + } + + let (local, foreign) = implementors.iter().partition::, _>(|i| { + i.inner_impl() + .for_ + .def_id_full(cx.cache()) + .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); + + synthetic.sort_by(|a, b| compare_impl(a, b, cx.cache())); + concrete.sort_by(|a, b| compare_impl(a, b, cx.cache())); + + if !foreign.is_empty() { + write_small_section_header(w, "foreign-impls", "Implementations on Foreign Types", ""); + + for implementor in foreign { + let assoc_link = AssocItemLink::GotoSource( + implementor.impl_item.def_id, + &implementor.inner_impl().provided_trait_methods, + ); + render_impl( + w, + cx, + &implementor, + it, + assoc_link, + RenderMode::Normal, + implementor.impl_item.stable_since(cx.tcx()).as_deref(), + implementor.impl_item.const_stable_since(cx.tcx()).as_deref(), + false, + None, + true, + false, + &[], + ); + } + write_loading_content(w, ""); + } + + write_small_section_header( + w, + "implementors", + "Implementors", + "
    ", + ); + for implementor in concrete { + render_implementor(cx, implementor, it, w, &implementor_dups, &[]); + } + write_loading_content(w, "
    "); + + if t.is_auto { + write_small_section_header( + w, + "synthetic-implementors", + "Auto implementors", + "
    ", + ); + for implementor in synthetic { + render_implementor( + cx, + implementor, + it, + w, + &implementor_dups, + &collect_paths_for_type(implementor.inner_impl().for_.clone(), &cx.cache), + ); + } + 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_loading_content(w, "
    "); + + if t.is_auto { + write_small_section_header( + w, + "synthetic-implementors", + "Auto implementors", + "
    ", + ); + write_loading_content(w, "
    "); + } + } + + write!( + w, + "", + 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 item_trait_alias(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::TraitAlias) { + w.write_str("
    ");
    +    render_attributes(w, it, false);
    +    write!(
    +        w,
    +        "trait {}{}{} = {};
    ", + it.name.as_ref().unwrap(), + t.generics.print(cx.cache()), + WhereClause { gens: &t.generics, indent: 0, end_newline: true }.print(cx.cache()), + bounds(&t.bounds, true, cx.cache()) + ); + + document(w, cx, it, None); + + // Render any items associated directly to this alias, as otherwise they + // won't be visible anywhere in the docs. It would be nice to also show + // associated items from the aliased type (see discussion in #32077), but + // we need #14072 to make sense of the generics. + render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) +} + +fn item_opaque_ty(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::OpaqueTy) { + w.write_str("
    ");
    +    render_attributes(w, it, false);
    +    write!(
    +        w,
    +        "type {}{}{where_clause} = impl {bounds};
    ", + it.name.as_ref().unwrap(), + t.generics.print(cx.cache()), + where_clause = + WhereClause { gens: &t.generics, indent: 0, end_newline: true }.print(cx.cache()), + bounds = bounds(&t.bounds, false, cx.cache()) + ); + + document(w, cx, it, None); + + // Render any items associated directly to this alias, as otherwise they + // won't be visible anywhere in the docs. It would be nice to also show + // associated items from the aliased type (see discussion in #32077), but + // we need #14072 to make sense of the generics. + render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) +} + +fn item_typedef(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Typedef) { + w.write_str("
    ");
    +    render_attributes(w, it, false);
    +    write!(
    +        w,
    +        "type {}{}{where_clause} = {type_};
    ", + it.name.as_ref().unwrap(), + t.generics.print(cx.cache()), + where_clause = + WhereClause { gens: &t.generics, indent: 0, end_newline: true }.print(cx.cache()), + type_ = t.type_.print(cx.cache()) + ); + + document(w, cx, it, None); + + // Render any items associated directly to this alias, as otherwise they + // won't be visible anywhere in the docs. It would be nice to also show + // associated items from the aliased type (see discussion in #32077), but + // we need #14072 to make sense of the generics. + render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) +} + +fn item_union(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Union) { + wrap_into_docblock(w, |w| { + w.write_str("
    ");
    +        render_attributes(w, it, true);
    +        render_union(w, it, Some(&s.generics), &s.fields, "", true, cx);
    +        w.write_str("
    ") + }); + + document(w, cx, it, None); + let mut fields = s + .fields + .iter() + .filter_map(|f| match *f.kind { + clean::StructFieldItem(ref ty) => Some((f, ty)), + _ => None, + }) + .peekable(); + if fields.peek().is_some() { + 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, + "\ + \ + {name}: {ty}\ + ", + id = id, + name = name, + shortty = ItemType::StructField, + ty = ty.print(cx.cache()) + ); + if let Some(stability_class) = field.stability_class(cx.tcx()) { + write!(w, "", stab = stability_class); + } + document(w, cx, field, Some(it)); + } + } + render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) +} + +fn item_enum(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, e: &clean::Enum) { + wrap_into_docblock(w, |w| { + w.write_str("
    ");
    +        render_attributes(w, it, true);
    +        write!(
    +            w,
    +            "{}enum {}{}{}",
    +            it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()),
    +            it.name.as_ref().unwrap(),
    +            e.generics.print(cx.cache()),
    +            WhereClause { gens: &e.generics, indent: 0, end_newline: true }.print(cx.cache())
    +        );
    +        if e.variants.is_empty() && !e.variants_stripped {
    +            w.write_str(" {}");
    +        } else {
    +            w.write_str(" {\n");
    +            for v in &e.variants {
    +                w.write_str("    ");
    +                let name = v.name.as_ref().unwrap();
    +                match *v.kind {
    +                    clean::VariantItem(ref var) => match var {
    +                        clean::Variant::CLike => write!(w, "{}", name),
    +                        clean::Variant::Tuple(ref tys) => {
    +                            write!(w, "{}(", name);
    +                            for (i, ty) in tys.iter().enumerate() {
    +                                if i > 0 {
    +                                    w.write_str(", ")
    +                                }
    +                                write!(w, "{}", ty.print(cx.cache()));
    +                            }
    +                            w.write_str(")");
    +                        }
    +                        clean::Variant::Struct(ref s) => {
    +                            render_struct(w, v, None, s.struct_type, &s.fields, "    ", false, cx);
    +                        }
    +                    },
    +                    _ => unreachable!(),
    +                }
    +                w.write_str(",\n");
    +            }
    +
    +            if e.variants_stripped {
    +                w.write_str("    // some variants omitted\n");
    +            }
    +            w.write_str("}");
    +        }
    +        w.write_str("
    ") + }); + + document(w, cx, it, None); + if !e.variants.is_empty() { + write!( + w, + "

    + Variants{}

    \n", + 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())); + write!( + w, + "
    \ + \ + {name}", + id = id, + name = variant.name.as_ref().unwrap() + ); + if let clean::VariantItem(clean::Variant::Tuple(ref tys)) = *variant.kind { + w.write_str("("); + for (i, ty) in tys.iter().enumerate() { + if i > 0 { + w.write_str(", "); + } + write!(w, "{}", ty.print(cx.cache())); + } + w.write_str(")"); + } + w.write_str("
    "); + document(w, cx, variant, Some(it)); + document_non_exhaustive(w, variant); + + use crate::clean::Variant; + if let clean::VariantItem(Variant::Struct(ref s)) = *variant.kind { + 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.kind { + let id = cx.derive_id(format!( + "variant.{}.field.{}", + variant.name.as_ref().unwrap(), + field.name.as_ref().unwrap() + )); + write!( + w, + "\ + \ + {f}: {t}\ + ", + id = id, + f = field.name.as_ref().unwrap(), + t = ty.print(cx.cache()) + ); + document(w, cx, field, Some(variant)); + } + } + w.write_str("
    "); + } + render_stability_since(w, variant, it, cx.tcx()); + } + } + render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) +} + +fn item_macro(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, t: &clean::Macro) { + wrap_into_docblock(w, |w| { + highlight::render_with_highlighting( + &t.source, + w, + Some("macro"), + None, + None, + it.source.span().edition(), + ); + }); + document(w, cx, it, None) +} + +fn item_proc_macro(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, m: &clean::ProcMacro) { + let name = it.name.as_ref().expect("proc-macros always have names"); + match m.kind { + MacroKind::Bang => { + w.push_str("
    ");
    +            write!(w, "{}!() {{ /* proc-macro */ }}", name);
    +            w.push_str("
    "); + } + MacroKind::Attr => { + w.push_str("
    ");
    +            write!(w, "#[{}]", name);
    +            w.push_str("
    "); + } + MacroKind::Derive => { + w.push_str("
    ");
    +            write!(w, "#[derive({})]", name);
    +            if !m.helpers.is_empty() {
    +                w.push_str("\n{\n");
    +                w.push_str("    // Attributes available to this derive:\n");
    +                for attr in &m.helpers {
    +                    writeln!(w, "    #[{}]", attr);
    +                }
    +                w.push_str("}\n");
    +            }
    +            w.push_str("
    "); + } + } + document(w, cx, it, None) +} + +fn item_primitive(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) { + document(w, cx, it, None); + render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) +} + +fn item_constant(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, c: &clean::Constant) { + w.write_str("
    ");
    +    render_attributes(w, it, false);
    +
    +    write!(
    +        w,
    +        "{vis}const {name}: {typ}",
    +        vis = it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()),
    +        name = it.name.as_ref().unwrap(),
    +        typ = c.type_.print(cx.cache()),
    +    );
    +
    +    if c.value.is_some() || c.is_literal {
    +        write!(w, " = {expr};", expr = Escape(&c.expr));
    +    } else {
    +        w.write_str(";");
    +    }
    +
    +    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));
    +            }
    +        }
    +    }
    +
    +    w.write_str("
    "); + document(w, cx, it, None) +} + +fn item_struct(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Struct) { + wrap_into_docblock(w, |w| { + w.write_str("
    ");
    +        render_attributes(w, it, true);
    +        render_struct(w, it, Some(&s.generics), s.struct_type, &s.fields, "", true, cx);
    +        w.write_str("
    ") + }); + + document(w, cx, it, None); + let mut fields = s + .fields + .iter() + .filter_map(|f| match *f.kind { + clean::StructFieldItem(ref ty) => Some((f, ty)), + _ => None, + }) + .peekable(); + if let CtorKind::Fictive = s.struct_type { + if fields.peek().is_some() { + write!( + w, + "

    + Fields{}

    ", + 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() + )); + write!( + w, + "\ + \ + {name}: {ty}\ + ", + item_type = ItemType::StructField, + id = id, + name = field.name.as_ref().unwrap(), + ty = ty.print(cx.cache()) + ); + document(w, cx, field, Some(it)); + } + } + } + render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) +} + +fn item_static(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item, s: &clean::Static) { + w.write_str("
    ");
    +    render_attributes(w, it, false);
    +    write!(
    +        w,
    +        "{vis}static {mutability}{name}: {typ}
    ", + vis = it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()), + mutability = s.mutability.print_with_space(), + name = it.name.as_ref().unwrap(), + typ = s.type_.print(cx.cache()) + ); + document(w, cx, it, None) +} + +fn item_foreign_type(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) { + w.write_str("
    extern {\n");
    +    render_attributes(w, it, false);
    +    write!(
    +        w,
    +        "    {}type {};\n}}
    ", + it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()), + it.name.as_ref().unwrap(), + ); + + document(w, cx, it, None); + + render_assoc_items(w, cx, it, it.def_id, AssocItemRender::All) +} + +fn item_keyword(w: &mut Buffer, cx: &Context<'_>, it: &clean::Item) { + document(w, cx, it, None) +} + +/// Compare two strings treating multi-digit numbers as single units (i.e. natural sort order). +crate fn compare_names(mut lhs: &str, mut rhs: &str) -> Ordering { + /// Takes a non-numeric and a numeric part from the given &str. + fn take_parts<'a>(s: &mut &'a str) -> (&'a str, &'a str) { + let i = s.find(|c: char| c.is_ascii_digit()); + let (a, b) = s.split_at(i.unwrap_or(s.len())); + let i = b.find(|c: char| !c.is_ascii_digit()); + let (b, c) = b.split_at(i.unwrap_or(b.len())); + *s = c; + (a, b) + } + + while !lhs.is_empty() || !rhs.is_empty() { + let (la, lb) = take_parts(&mut lhs); + let (ra, rb) = take_parts(&mut rhs); + // First process the non-numeric part. + match la.cmp(ra) { + Ordering::Equal => (), + x => return x, + } + // Then process the numeric part, if both sides have one (and they fit in a u64). + if let (Ok(ln), Ok(rn)) = (lb.parse::(), rb.parse::()) { + match ln.cmp(&rn) { + Ordering::Equal => (), + x => return x, + } + } + // Then process the numeric part again, but this time as strings. + match lb.cmp(rb) { + Ordering::Equal => (), + x => return x, + } + } + + Ordering::Equal +} + +pub(super) fn full_path(cx: &Context<'_>, item: &clean::Item) -> String { + let mut s = cx.current.join("::"); + s.push_str("::"); + s.push_str(&item.name.unwrap().as_str()); + s +} + +pub(super) fn item_path(ty: ItemType, name: &str) -> String { + match ty { + ItemType::Module => format!("{}index.html", ensure_trailing_slash(name)), + _ => format!("{}.{}.html", ty, name), + } +} + +fn bounds(t_bounds: &[clean::GenericBound], trait_alias: bool, cache: &Cache) -> String { + let mut bounds = String::new(); + if !t_bounds.is_empty() { + if !trait_alias { + bounds.push_str(": "); + } + for (i, p) in t_bounds.iter().enumerate() { + if i > 0 { + bounds.push_str(" + "); + } + bounds.push_str(&p.print(cache).to_string()); + } + } + bounds +} + +fn wrap_into_docblock(w: &mut Buffer, f: F) +where + F: FnOnce(&mut Buffer), +{ + w.write_str("
    "); + f(w); + w.write_str("
    ") +} + +fn render_stability_since( + w: &mut Buffer, + item: &clean::Item, + containing_item: &clean::Item, + tcx: TyCtxt<'_>, +) { + render_stability_since_raw( + w, + item.stable_since(tcx).as_deref(), + item.const_stable_since(tcx).as_deref(), + containing_item.stable_since(tcx).as_deref(), + containing_item.const_stable_since(tcx).as_deref(), + ) +} + +fn compare_impl<'a, 'b>(lhs: &'a &&Impl, rhs: &'b &&Impl, cache: &Cache) -> Ordering { + let lhs = format!("{}", lhs.inner_impl().print(cache, false)); + let rhs = format!("{}", rhs.inner_impl().print(cache, false)); + + // lhs and rhs are formatted as HTML, which may be unnecessary + compare_names(&lhs, &rhs) +} + +fn render_implementor( + cx: &Context<'_>, + implementor: &Impl, + trait_: &clean::Item, + w: &mut Buffer, + implementor_dups: &FxHashMap, + 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 { + type_: box clean::ResolvedPath { ref path, is_generic: false, .. }, + .. + } => implementor_dups[&path.last()].1, + _ => false, + }; + render_impl( + w, + cx, + implementor, + trait_, + AssocItemLink::Anchor(None), + RenderMode::Normal, + trait_.stable_since(cx.tcx()).as_deref(), + trait_.const_stable_since(cx.tcx()).as_deref(), + false, + Some(use_absolute), + false, + false, + aliases, + ); +} + +fn render_union( + w: &mut Buffer, + it: &clean::Item, + g: Option<&clean::Generics>, + fields: &[clean::Item], + tab: &str, + structhead: bool, + cx: &Context<'_>, +) { + write!( + w, + "{}{}{}", + it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()), + if structhead { "union " } else { "" }, + it.name.as_ref().unwrap() + ); + if let Some(g) = g { + write!(w, "{}", g.print(cx.cache())); + write!(w, "{}", WhereClause { gens: g, indent: 0, end_newline: true }.print(cx.cache())); + } + + write!(w, " {{\n{}", tab); + for field in fields { + if let clean::StructFieldItem(ref ty) = *field.kind { + write!( + w, + " {}{}: {},\n{}", + field.visibility.print_with_space(cx.tcx(), field.def_id, cx.cache()), + field.name.as_ref().unwrap(), + ty.print(cx.cache()), + tab + ); + } + } + + if it.has_stripped_fields().unwrap() { + write!(w, " // some fields omitted\n{}", tab); + } + w.write_str("}"); +} + +fn render_struct( + w: &mut Buffer, + it: &clean::Item, + g: Option<&clean::Generics>, + ty: CtorKind, + fields: &[clean::Item], + tab: &str, + structhead: bool, + cx: &Context<'_>, +) { + write!( + w, + "{}{}{}", + it.visibility.print_with_space(cx.tcx(), it.def_id, cx.cache()), + if structhead { "struct " } else { "" }, + it.name.as_ref().unwrap() + ); + if let Some(g) = g { + write!(w, "{}", g.print(cx.cache())) + } + match ty { + CtorKind::Fictive => { + if let Some(g) = g { + write!( + w, + "{}", + WhereClause { gens: g, indent: 0, end_newline: true }.print(cx.cache()) + ) + } + let mut has_visible_fields = false; + w.write_str(" {"); + for field in fields { + if let clean::StructFieldItem(ref ty) = *field.kind { + write!( + w, + "\n{} {}{}: {},", + tab, + field.visibility.print_with_space(cx.tcx(), field.def_id, cx.cache()), + field.name.as_ref().unwrap(), + ty.print(cx.cache()) + ); + has_visible_fields = true; + } + } + + if has_visible_fields { + if it.has_stripped_fields().unwrap() { + write!(w, "\n{} // some fields omitted", tab); + } + write!(w, "\n{}", tab); + } else if it.has_stripped_fields().unwrap() { + // If there are no visible fields we can just display + // `{ /* fields omitted */ }` to save space. + write!(w, " /* fields omitted */ "); + } + w.write_str("}"); + } + CtorKind::Fn => { + w.write_str("("); + for (i, field) in fields.iter().enumerate() { + if i > 0 { + w.write_str(", "); + } + match *field.kind { + clean::StrippedItem(box clean::StructFieldItem(..)) => write!(w, "_"), + clean::StructFieldItem(ref ty) => { + write!( + w, + "{}{}", + field.visibility.print_with_space(cx.tcx(), field.def_id, cx.cache()), + ty.print(cx.cache()) + ) + } + _ => unreachable!(), + } + } + w.write_str(")"); + if let Some(g) = g { + write!( + w, + "{}", + WhereClause { gens: g, indent: 0, end_newline: false }.print(cx.cache()) + ) + } + w.write_str(";"); + } + CtorKind::Const => { + // Needed for PhantomData. + if let Some(g) = g { + write!( + w, + "{}", + WhereClause { gens: g, indent: 0, end_newline: false }.print(cx.cache()) + ) + } + w.write_str(";"); + } + } +} + +fn document_non_exhaustive_header(item: &clean::Item) -> &str { + if item.is_non_exhaustive() { " (Non-exhaustive)" } else { "" } +} + +fn document_non_exhaustive(w: &mut Buffer, item: &clean::Item) { + if item.is_non_exhaustive() { + write!(w, "
    ", { + if item.is_struct() { + "struct" + } else if item.is_enum() { + "enum" + } else if item.is_variant() { + "variant" + } else { + "type" + } + }); + + if item.is_struct() { + w.write_str( + "Non-exhaustive structs could have additional fields added in future. \ + Therefore, non-exhaustive structs cannot be constructed in external crates \ + using the traditional Struct {{ .. }} syntax; cannot be \ + matched against without a wildcard ..; and \ + struct update syntax will not work.", + ); + } else if item.is_enum() { + w.write_str( + "Non-exhaustive enums could have additional variants added in future. \ + Therefore, when matching against variants of non-exhaustive enums, an \ + extra wildcard arm must be added to account for any future variants.", + ); + } else if item.is_variant() { + w.write_str( + "Non-exhaustive enum variants could have additional fields added in future. \ + Therefore, non-exhaustive enum variants cannot be constructed in external \ + crates and cannot be matched against.", + ); + } else { + w.write_str( + "This type will require a wildcard arm in any match statements or constructors.", + ); + } + + w.write_str("
    "); + } +} diff --git a/src/librustdoc/html/render/tests.rs b/src/librustdoc/html/render/tests.rs index 224c794fb3..3175fbe566 100644 --- a/src/librustdoc/html/render/tests.rs +++ b/src/librustdoc/html/render/tests.rs @@ -1,4 +1,7 @@ -use super::*; +use std::cmp::Ordering; + +use super::print_item::compare_names; +use super::{AllTypes, Buffer}; #[test] fn test_compare_names() { diff --git a/src/librustdoc/html/render/write_shared.rs b/src/librustdoc/html/render/write_shared.rs new file mode 100644 index 0000000000..02ad01aa29 --- /dev/null +++ b/src/librustdoc/html/render/write_shared.rs @@ -0,0 +1,551 @@ +use std::ffi::OsStr; +use std::fmt::Write; +use std::fs::{self, File}; +use std::io::prelude::*; +use std::io::{self, BufReader}; +use std::lazy::SyncLazy as Lazy; +use std::path::{Component, Path, PathBuf}; + +use itertools::Itertools; +use rustc_data_structures::flock; +use rustc_data_structures::fx::{FxHashMap, FxHashSet}; +use serde::Serialize; + +use super::{collect_paths_for_type, ensure_trailing_slash, Context, BASIC_KEYWORDS}; +use crate::clean::Crate; +use crate::config::RenderOptions; +use crate::docfs::{DocFS, PathError}; +use crate::error::Error; +use crate::formats::FormatRenderer; +use crate::html::{layout, static_files}; + +crate static FILES_UNVERSIONED: Lazy> = Lazy::new(|| { + map! { + "FiraSans-Regular.woff2" => static_files::fira_sans::REGULAR2, + "FiraSans-Medium.woff2" => static_files::fira_sans::MEDIUM2, + "FiraSans-Regular.woff" => static_files::fira_sans::REGULAR, + "FiraSans-Medium.woff" => static_files::fira_sans::MEDIUM, + "FiraSans-LICENSE.txt" => static_files::fira_sans::LICENSE, + "SourceSerifPro-Regular.ttf.woff" => static_files::source_serif_pro::REGULAR, + "SourceSerifPro-Bold.ttf.woff" => static_files::source_serif_pro::BOLD, + "SourceSerifPro-It.ttf.woff" => static_files::source_serif_pro::ITALIC, + "SourceSerifPro-LICENSE.md" => static_files::source_serif_pro::LICENSE, + "SourceCodePro-Regular.woff" => static_files::source_code_pro::REGULAR, + "SourceCodePro-Semibold.woff" => static_files::source_code_pro::SEMIBOLD, + "SourceCodePro-LICENSE.txt" => static_files::source_code_pro::LICENSE, + "LICENSE-MIT.txt" => static_files::LICENSE_MIT, + "LICENSE-APACHE.txt" => static_files::LICENSE_APACHE, + "COPYRIGHT.txt" => static_files::COPYRIGHT, + } +}); + +pub(super) fn write_shared( + cx: &Context<'_>, + krate: &Crate, + search_index: String, + options: &RenderOptions, +) -> Result<(), Error> { + // Write out the shared files. Note that these are shared among all rustdoc + // docs placed in the output directory, so this needs to be a synchronized + // operation with respect to all other rustdocs running around. + let lock_file = cx.dst.join(".lock"); + let _lock = try_err!(flock::Lock::new(&lock_file, true, true, true), &lock_file); + + // Add all the static files. These may already exist, but we just + // overwrite them anyway to make sure that they're fresh and up-to-date. + + write_minify( + &cx.shared.fs, + cx.path("rustdoc.css"), + static_files::RUSTDOC_CSS, + options.enable_minification, + )?; + write_minify( + &cx.shared.fs, + cx.path("settings.css"), + static_files::SETTINGS_CSS, + options.enable_minification, + )?; + write_minify( + &cx.shared.fs, + cx.path("noscript.css"), + static_files::NOSCRIPT_CSS, + options.enable_minification, + )?; + + // To avoid "light.css" to be overwritten, we'll first run over the received themes and only + // then we'll run over the "official" styles. + let mut themes: FxHashSet = FxHashSet::default(); + + for entry in &cx.shared.style_files { + let theme = try_none!(try_none!(entry.path.file_stem(), &entry.path).to_str(), &entry.path); + let extension = + try_none!(try_none!(entry.path.extension(), &entry.path).to_str(), &entry.path); + + // Handle the official themes + match theme { + "light" => write_minify( + &cx.shared.fs, + cx.path("light.css"), + static_files::themes::LIGHT, + options.enable_minification, + )?, + "dark" => write_minify( + &cx.shared.fs, + cx.path("dark.css"), + static_files::themes::DARK, + options.enable_minification, + )?, + "ayu" => write_minify( + &cx.shared.fs, + cx.path("ayu.css"), + static_files::themes::AYU, + options.enable_minification, + )?, + _ => { + // Handle added third-party themes + let content = try_err!(fs::read(&entry.path), &entry.path); + cx.shared + .fs + .write(cx.path(&format!("{}.{}", theme, extension)), content.as_slice())?; + } + }; + + themes.insert(theme.to_owned()); + } + + let write = |p, c| cx.shared.fs.write(p, c); + if (*cx.shared).layout.logo.is_empty() { + write(cx.path("rust-logo.png"), static_files::RUST_LOGO)?; + } + if (*cx.shared).layout.favicon.is_empty() { + write(cx.path("favicon.svg"), static_files::RUST_FAVICON_SVG)?; + write(cx.path("favicon-16x16.png"), static_files::RUST_FAVICON_PNG_16)?; + write(cx.path("favicon-32x32.png"), static_files::RUST_FAVICON_PNG_32)?; + } + write(cx.path("brush.svg"), static_files::BRUSH_SVG)?; + write(cx.path("wheel.svg"), static_files::WHEEL_SVG)?; + write(cx.path("down-arrow.svg"), static_files::DOWN_ARROW_SVG)?; + + let mut themes: Vec<&String> = themes.iter().collect(); + themes.sort(); + // To avoid theme switch latencies as much as possible, we put everything theme related + // at the beginning of the html files into another js file. + let theme_js = format!( + r#"var themes = document.getElementById("theme-choices"); +var themePicker = document.getElementById("theme-picker"); + +function showThemeButtonState() {{ + themes.style.display = "block"; + themePicker.style.borderBottomRightRadius = "0"; + themePicker.style.borderBottomLeftRadius = "0"; +}} + +function hideThemeButtonState() {{ + themes.style.display = "none"; + themePicker.style.borderBottomRightRadius = "3px"; + themePicker.style.borderBottomLeftRadius = "3px"; +}} + +function switchThemeButtonState() {{ + if (themes.style.display === "block") {{ + hideThemeButtonState(); + }} else {{ + showThemeButtonState(); + }} +}}; + +function handleThemeButtonsBlur(e) {{ + var active = document.activeElement; + var related = e.relatedTarget; + + if (active.id !== "theme-picker" && + (!active.parentNode || active.parentNode.id !== "theme-choices") && + (!related || + (related.id !== "theme-picker" && + (!related.parentNode || related.parentNode.id !== "theme-choices")))) {{ + hideThemeButtonState(); + }} +}} + +themePicker.onclick = switchThemeButtonState; +themePicker.onblur = handleThemeButtonsBlur; +{}.forEach(function(item) {{ + var but = document.createElement("button"); + but.textContent = item; + but.onclick = function(el) {{ + switchTheme(currentTheme, mainTheme, item, true); + useSystemTheme(false); + }}; + but.onblur = handleThemeButtonsBlur; + themes.appendChild(but); +}});"#, + serde_json::to_string(&themes).unwrap() + ); + + write_minify(&cx.shared.fs, cx.path("theme.js"), &theme_js, options.enable_minification)?; + write_minify( + &cx.shared.fs, + cx.path("main.js"), + static_files::MAIN_JS, + options.enable_minification, + )?; + write_minify( + &cx.shared.fs, + cx.path("settings.js"), + static_files::SETTINGS_JS, + options.enable_minification, + )?; + if cx.shared.include_sources { + write_minify( + &cx.shared.fs, + cx.path("source-script.js"), + static_files::sidebar::SOURCE_SCRIPT, + options.enable_minification, + )?; + } + + { + write_minify( + &cx.shared.fs, + cx.path("storage.js"), + &format!( + "var resourcesSuffix = \"{}\";{}", + cx.shared.resource_suffix, + static_files::STORAGE_JS + ), + options.enable_minification, + )?; + } + + if let Some(ref css) = cx.shared.layout.css_file_extension { + let out = cx.path("theme.css"); + let buffer = try_err!(fs::read_to_string(css), css); + if !options.enable_minification { + cx.shared.fs.write(&out, &buffer)?; + } else { + write_minify(&cx.shared.fs, out, &buffer, options.enable_minification)?; + } + } + write_minify( + &cx.shared.fs, + cx.path("normalize.css"), + static_files::NORMALIZE_CSS, + options.enable_minification, + )?; + for (file, contents) in &*FILES_UNVERSIONED { + write(cx.dst.join(file), contents)?; + } + + fn collect(path: &Path, krate: &str, key: &str) -> io::Result<(Vec, Vec)> { + let mut ret = Vec::new(); + let mut krates = Vec::new(); + + if path.exists() { + let prefix = format!(r#"{}["{}"]"#, key, krate); + for line in BufReader::new(File::open(path)?).lines() { + let line = line?; + if !line.starts_with(key) { + continue; + } + if line.starts_with(&prefix) { + continue; + } + ret.push(line.to_string()); + krates.push( + line[key.len() + 2..] + .split('"') + .next() + .map(|s| s.to_owned()) + .unwrap_or_else(String::new), + ); + } + } + Ok((ret, krates)) + } + + fn collect_json(path: &Path, krate: &str) -> io::Result<(Vec, Vec)> { + let mut ret = Vec::new(); + let mut krates = Vec::new(); + + if path.exists() { + let prefix = format!("\"{}\"", krate); + for line in BufReader::new(File::open(path)?).lines() { + let line = line?; + if !line.starts_with('"') { + continue; + } + if line.starts_with(&prefix) { + continue; + } + if line.ends_with(",\\") { + ret.push(line[..line.len() - 2].to_string()); + } else { + // Ends with "\\" (it's the case for the last added crate line) + ret.push(line[..line.len() - 1].to_string()); + } + krates.push( + line.split('"') + .find(|s| !s.is_empty()) + .map(|s| s.to_owned()) + .unwrap_or_else(String::new), + ); + } + } + Ok((ret, krates)) + } + + use std::ffi::OsString; + + #[derive(Debug)] + struct Hierarchy { + elem: OsString, + children: FxHashMap, + elems: FxHashSet, + } + + impl Hierarchy { + fn new(elem: OsString) -> Hierarchy { + Hierarchy { elem, children: FxHashMap::default(), elems: FxHashSet::default() } + } + + fn to_json_string(&self) -> String { + let mut subs: Vec<&Hierarchy> = self.children.values().collect(); + subs.sort_unstable_by(|a, b| a.elem.cmp(&b.elem)); + let mut files = self + .elems + .iter() + .map(|s| format!("\"{}\"", s.to_str().expect("invalid osstring conversion"))) + .collect::>(); + files.sort_unstable(); + let subs = subs.iter().map(|s| s.to_json_string()).collect::>().join(","); + let dirs = + if subs.is_empty() { String::new() } else { format!(",\"dirs\":[{}]", subs) }; + let files = files.join(","); + let files = + if files.is_empty() { String::new() } else { format!(",\"files\":[{}]", files) }; + format!( + "{{\"name\":\"{name}\"{dirs}{files}}}", + name = self.elem.to_str().expect("invalid osstring conversion"), + dirs = dirs, + files = files + ) + } + } + + if cx.shared.include_sources { + let mut hierarchy = Hierarchy::new(OsString::new()); + for source in cx + .shared + .local_sources + .iter() + .filter_map(|p| p.0.strip_prefix(&cx.shared.src_root).ok()) + { + let mut h = &mut hierarchy; + let mut elems = source + .components() + .filter_map(|s| match s { + Component::Normal(s) => Some(s.to_owned()), + _ => None, + }) + .peekable(); + loop { + let cur_elem = elems.next().expect("empty file path"); + if elems.peek().is_none() { + h.elems.insert(cur_elem); + break; + } else { + let e = cur_elem.clone(); + h = h.children.entry(cur_elem.clone()).or_insert_with(|| Hierarchy::new(e)); + } + } + } + + let dst = cx.dst.join(&format!("source-files{}.js", cx.shared.resource_suffix)); + let (mut all_sources, _krates) = + try_err!(collect(&dst, &krate.name.as_str(), "sourcesIndex"), &dst); + all_sources.push(format!( + "sourcesIndex[\"{}\"] = {};", + &krate.name, + hierarchy.to_json_string() + )); + all_sources.sort(); + let v = format!( + "var N = null;var sourcesIndex = {{}};\n{}\ncreateSourceSidebar();\n", + all_sources.join("\n") + ); + cx.shared.fs.write(&dst, v.as_bytes())?; + } + + // Update the search index and crate list. + let dst = cx.dst.join(&format!("search-index{}.js", cx.shared.resource_suffix)); + let (mut all_indexes, mut krates) = try_err!(collect_json(&dst, &krate.name.as_str()), &dst); + all_indexes.push(search_index); + krates.push(krate.name.to_string()); + krates.sort(); + + // Sort the indexes by crate so the file will be generated identically even + // with rustdoc running in parallel. + all_indexes.sort(); + { + let mut v = String::from("var searchIndex = JSON.parse('{\\\n"); + v.push_str(&all_indexes.join(",\\\n")); + v.push_str("\\\n}');\ninitSearch(searchIndex);"); + cx.shared.fs.write(&dst, &v)?; + } + + let crate_list_dst = cx.dst.join(&format!("crates{}.js", cx.shared.resource_suffix)); + let crate_list = + format!("window.ALL_CRATES = [{}];", krates.iter().map(|k| format!("\"{}\"", k)).join(",")); + cx.shared.fs.write(&crate_list_dst, &crate_list)?; + + if options.enable_index_page { + if let Some(index_page) = options.index_page.clone() { + let mut md_opts = options.clone(); + md_opts.output = cx.dst.clone(); + md_opts.external_html = (*cx.shared).layout.external_html.clone(); + + crate::markdown::render(&index_page, md_opts, cx.shared.edition) + .map_err(|e| Error::new(e, &index_page))?; + } else { + let dst = cx.dst.join("index.html"); + let page = layout::Page { + title: "Index of crates", + css_class: "mod", + root_path: "./", + static_root_path: cx.shared.static_root_path.as_deref(), + description: "List of crates", + keywords: BASIC_KEYWORDS, + resource_suffix: &cx.shared.resource_suffix, + extra_scripts: &[], + static_extra_scripts: &[], + }; + + let content = format!( + "

    \ + List of all crates\ +

      {}
    ", + krates + .iter() + .map(|s| { + format!( + "
  • {}
  • ", + ensure_trailing_slash(s), + s + ) + }) + .collect::() + ); + let v = layout::render(&cx.shared.layout, &page, "", content, &cx.shared.style_files); + cx.shared.fs.write(&dst, v.as_bytes())?; + } + } + + // Update the list of all implementors for traits + let dst = cx.dst.join("implementors"); + for (&did, imps) in &cx.cache.implementors { + // Private modules can leak through to this phase of rustdoc, which + // could contain implementations for otherwise private types. In some + // rare cases we could find an implementation for an item which wasn't + // indexed, so we just skip this step in that case. + // + // FIXME: this is a vague explanation for why this can't be a `get`, in + // theory it should be... + let &(ref remote_path, remote_item_type) = match cx.cache.paths.get(&did) { + Some(p) => p, + None => match cx.cache.external_paths.get(&did) { + Some(p) => p, + None => continue, + }, + }; + + #[derive(Serialize)] + struct Implementor { + text: String, + synthetic: bool, + types: Vec, + } + + let implementors = imps + .iter() + .filter_map(|imp| { + // If the trait and implementation are in the same crate, then + // there's no need to emit information about it (there's inlining + // going on). If they're in different crates then the crate defining + // the trait will be interested in our implementation. + // + // If the implementation is from another crate then that crate + // should add it. + if imp.impl_item.def_id.krate == did.krate || !imp.impl_item.def_id.is_local() { + None + } else { + Some(Implementor { + text: imp.inner_impl().print(cx.cache(), false).to_string(), + synthetic: imp.inner_impl().synthetic, + types: collect_paths_for_type(imp.inner_impl().for_.clone(), cx.cache()), + }) + } + }) + .collect::>(); + + // Only create a js file if we have impls to add to it. If the trait is + // documented locally though we always create the file to avoid dead + // links. + if implementors.is_empty() && !cx.cache.paths.contains_key(&did) { + continue; + } + + let implementors = format!( + r#"implementors["{}"] = {};"#, + krate.name, + serde_json::to_string(&implementors).unwrap() + ); + + let mut mydst = dst.clone(); + for part in &remote_path[..remote_path.len() - 1] { + mydst.push(part); + } + cx.shared.ensure_dir(&mydst)?; + mydst.push(&format!("{}.{}.js", remote_item_type, remote_path[remote_path.len() - 1])); + + let (mut all_implementors, _) = + try_err!(collect(&mydst, &krate.name.as_str(), "implementors"), &mydst); + all_implementors.push(implementors); + // Sort the implementors by crate so the file will be generated + // identically even with rustdoc running in parallel. + all_implementors.sort(); + + let mut v = String::from("(function() {var implementors = {};\n"); + for implementor in &all_implementors { + writeln!(v, "{}", *implementor).unwrap(); + } + v.push_str( + "if (window.register_implementors) {\ + window.register_implementors(implementors);\ + } else {\ + window.pending_implementors = implementors;\ + }", + ); + v.push_str("})()"); + cx.shared.fs.write(&mydst, &v)?; + } + Ok(()) +} + +fn write_minify( + fs: &DocFS, + dst: PathBuf, + contents: &str, + enable_minification: bool, +) -> Result<(), Error> { + if enable_minification { + if dst.extension() == Some(&OsStr::new("css")) { + let res = try_none!(minifier::css::minify(contents).ok(), &dst); + fs.write(dst, res.as_bytes()) + } else { + fs.write(dst, minifier::js::minify(contents).as_bytes()) + } + } else { + fs.write(dst, contents.as_bytes()) + } +} diff --git a/src/librustdoc/html/sources.rs b/src/librustdoc/html/sources.rs index bbb833e54a..689cda76cc 100644 --- a/src/librustdoc/html/sources.rs +++ b/src/librustdoc/html/sources.rs @@ -70,8 +70,8 @@ impl DocFolder for SourceCollector<'_, '_> { } } -impl SourceCollector<'_, '_> { - fn sess(&self) -> &Session { +impl SourceCollector<'_, 'tcx> { + fn sess(&self) -> &'tcx Session { &self.scx.tcx.sess } diff --git a/src/librustdoc/html/static/FiraSans-Medium.woff2 b/src/librustdoc/html/static/FiraSans-Medium.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..7a1e5fc548ef28137a32150b6aa50a568cd53d02 GIT binary patch literal 132780 zcmV)OK(@bkPew8T0RR910tT!A5dZ)H1}xYB0tQ0>1REj%00000000000000000000 z0000Qg9sah=5QQ=l?Dc20D+=N2!T=wmlqKT3XYIyjJ6g5HUcCA(i{uYAOHj)1&tR6 zf!8YxfjL_}mDK{IL|ch%AbMV-M#7??B zC`?czOpXFm{bNFpGoFCSsqs3IaA>E8vzb{uH{ZmA&=YcDQ8dT^;w6%qWKI?544Pws zWmp1XB)Be!u}G#Ng%xo~mytl%j%&049`tIL$u)AFp`) z)lF;Ofpe(GTEm21fR@c%zaVQ$KZGoc%34*K8JMT=D&5#4g;mdS1t#ZmG+5MN#gfdy zUC<43b_=GmKGcI8GBg2~(XQ<-uY-ki9lLVNWzu+=B(ZY|BS>;NSJ-qNZ1IWd}m+365Np5y>HuxAxUSEw&Q3GRiO zejdA{#D?#cz2zlKW!nE`$%^@6^y8!)+4UrImN0mJfeW{UIE^ z+=+D`=qc67L!oAj;2D^m)zmaFv4WOnbwLgg$L}Y_Br#1JdbdCD9?G!mm90;^6@gQz zkTEUlOn;FHzY-24#A%w|;I;5gWYm0ZA8zaQDy*tUbV)~aq88!3>HwT#8=MQiP$L))~Yow@|Lw74+TKsL1TQ{SZ) zi_+j+V2fG7M8>3W=zf{h9NLsg;m~?uN)$MB8%zq5%%RI#ZLJ}P6l{aRgU5oIUg3u) zlnkVINbvg+QS_go5x78ee+?eSj5TIxGMWLV1eWptogdIx0|&7RZa@;Gjh?hvP{w#J z7vug9iZu{<4004lI%+W}ZJR=pM)E3rJ zNPP@sKJtVq&lnf1sIf(m?X)ls@{`I%cHGcI<|lIZLi*^Z@clRYR(-pF@+xP9oD5Kb zJi0L$Rg- zdSZX=$+=ykBB%4s4%Qc9YVCPD z-T%$>z2kx?Ov)oz0I+~I4p^lkqX=|7tX|=P<*Ef^ZA;B&sa+noLks{ONPp_HV>(@G zRDl#C`T?BEu#Pm(T(4KYA5{in`zj3ZP>qc$agHGbG$x_PYK$PjNu}FK#v6eC`LSPv z*g@PNgJm=%!AmnTZ68#w2%O>5@DE z6@_Vqj*}(VP&iaI-C1RQN}Vue^3!%&k*lQd`r1J72%ZJt@F=3GX~>*4m-~ISm``u! zl-o*kBAcSj+9L)9;2=vnz@02SH=lL2NIDg&%aa7cUQZZVAyxT*WY2c)1K6j~6FC~P zGnkFe=$y%!Y{Avd1*H@gfmq+2gJ=GKl5ENTbbIZrn=(d4|4$9{clN#}NgMkI zw8aYsEm5)?1B=_X2C-g{ZsG&?`y@VrThhzO-!#w(483XaAHa0J`)5QupuKkR*aKf`u%2e5c$wS8Gpy-BdPv+wbL@;Fif1$u<=W)K=klUPDuP z0SFX8075vHg=@MWFh~G0%FKV#75YYqBO2j?w7^IB&78fnxe8I0qDxoV+&X;}=BTIN z<=Yxw>W0Q=;%0Ag?{Jl{(=kKBJmTMNN1%lK71(667>u@LD=!n8IQ?p`6Uw47B04%c zj+w7_=DSmrrL;|HOH0`#)JM56JjxCG%LV;mG9-aOX~C-_x}sm~c;5Gez!z=yS>#C; zIPjFn%cy@e{X%yDP^RenBj{fp3n_!xyFSn_phjJ`-7sj13=56$@v`l4))1_Jf-$=$ z_HS(>A&ag7S-cMZ5uLvINK-jnE~P-63lB$W5{7Bj$$@KGq9YjSTE}lw8p&1HSN%WL zT##f`FVk}G1FB;|q}5>|7;L>@aRHPP1sIctRk#t~OMw6Y3Sex8LKeLTZ;*82tu4X> z{F+(bAL0;g!fjJNlwfz9tQO}(xaq&U3j_(0lon56v<$dHsZgUPOj5Y6Gx=)XuclKr zXWzV9>OA>nJNyCMGR#!K321JMpa2%l$j8aTX;oB-1OEBvWPh-|`vry*4lNMucwmWi znA4JbKg~B#+T~;!(`Az6?|mQ35IfwmF;HL!Mj8raQ$p^Y$2fx2JFER$YX3c8IZ3um zQbY+jpk%i@-dwMknZNpZv0BcpzTJ<1_`llu@6OgbGnzz_K*WK0b~O81!ofryXvtZ^#qW_69M!R_4sJ{aE@MUw^gt55x#quN z777~*T9=)d0Z_2;|DW!E`J&K?r8(guHtFzS^9=ldpFtB1D1G_=LLR#|EB-AK;g`{gbE|Nh)1Q7NZrT%bEe? z$mCsKnXBbqbf7P<)1*~zEeG+EmIFX-W&eFVVsaCn|Nr}x4_J1_7Pu6lqE7Vwv)b*j zJQ&QXNS9BfeHi>$EEW(8&;QS5`nMd_@~v?b>nh}AN|?kHStUhYPy*Eo{o>y8Uv7Co zt}uI6csF{@|Iz!CX0FQ!Au{+*S@g+uaGsGJS zA+ev7fQGwq5Ga3B-z+c&juu!StJ?8 z3WR6l0R{MS{IZNiFl56q{KRI2U$qZ^ zzf>@)5gLVXSUH7b-8PC*vnVWf9nK*XLLb*ZAiiJvpLF;3?%I}+Lt-1)f5-ruGD+u- zw(9nbgYMG@noW5eHO?ZM_sCcdDMFXAnV_K|aTx$){-NKO&C)rQ^5aH$jA?>3+?h5r99atsc}wYJ`cABh zS7pae2e_T*7e9bM|I;+BKfY$)VDBV4v2+MwdUIS|*?IAo#=2r-9u_qzlWgxL)mD%jli#e4arw zckX^kYMOhU=$4L}rg~vlH@0@~2>(dmpPZbDl1M9}aP`O{#Ol*|s8XAXlCFiIT1)+; z+_iiXE=s5V*h|G@Op$b+1A)EnT-cc`AzaIxNL3 zY4L)A;iPmi!w-w95<+X$*y{d)w+}6{hwUGt(@9W8b0N_zG*W>={@@L)!J-a6EK;kw z7`x!dgD?I}pan|6Ap2%M<>+-<@E2>v-aN0r=;wcWM(vYG1j0B1d#mWUuA6wI#7X@B zrs-2D(sh;7biyiZ9rK+x#aYc<_i#9Z=VU`dM;gY`6zW*D6omq(!$h3FTYxZaeCKzLk5JCtcgfOPxb|f$mG&hw0j=#oR zyKmcpNRd!Pju65jeCCgpSH}O{q$wgr=gyq^Jia^iGj}SQG#C*?FhLk$L@?eAazle$$hA<4vQhlo8teL*=kq$@kaauEeC5c#^CYE6s-svAp zvoQI49k#3K3zHtM~5~2!^kFpO5r?L9$7{#u)3n zS~*&2<@wS6#I}0hz*vZ}=%z&sF!VqhD=MJq-TlZP+3df+sazRde>!(6P@zDvKmrL8 zBIf|z-7gR>BlY|>wF?u1i|1LELx@3$sfuv_NAsl^y(ii6ft*>la zlzD$s(&p3k4JG6Oxts3sH_wm>jU&()61n#me=G$av#Cc$sV&{tRURMdiC?1Sxp zgVd$;gw!`G<1Cwrd0AMdm34t4!4!mqQZOOmh(hLPv=urrC@hKdD{PODy2T+$9wo_? zqSA7S9)qJMtJoV$E+5^2JtdUniaj}X7elE??^50)y&o%oIDq_@cKoB;_)lW|zr$+U zZNLV+TY+ngfm~-j)}`h;_nvNi|9)_4j5%@ zg34bv0kSBhf+lb}N3;2&gp5(WqA0C#Bb@oPu$* zYSdSzPs{1K;D&bCF4)qIJM8GEUG@y~9tTF<=g4FSoY?sxSIjF%T(e(2<`svvlYd&1 z*H6!c6?ShoHOYMF7?@btxp?>lg+;|X`GPZ>X+>2{T?3OWW{Zje1VI`<+%31%bk110 zTndT0l~MGd@oJw}do{{@wka66L{LgPW==k9`<*KiuAv6oAIt^{O#tWeyMM>v;@$tQ z_=I5b2_wi?Pl#OPqdXsJqpQBY^qt=fGtM*$)cA`AO$;^d!sPe*_w^rLQtfIkd2z|! z(;D~A9J2gp^W6yK?vDeGL`F-c?w0XgTQdtniN=DDg*4%K2BT=PrvPyzYn8(oKH7J&@BmpyqTeM zc7YaC7WPdO=H)o(oNNUqIbod{Q1Q9}n9Cnw3L;Wtk7all-`kOaQ&|T21|5?xb@V(Z{@Q)BC8`pgfbI z6V|N|>I5lh(7n@o59O*F13yr$=nDeorxs8im#IqB`jRSyN(sMt1wadIpO2UnCrdaU zWu@oY1a224(Zq=COfaPsNfD{vYWqQ{e_6vKJ7j)b5~+{`#4Kg1mfFdk0@Gy^g@+ih z5$3n9&u-8U$4jN!G(3_oem60aSMprp(n|I~j&Lo=Nryjev1@e`ll@F-m00hftRSch zLdQPz;~Q%m2wC;MB1n$gfi#jy^@3zyfe$s9yAj$KzW)|AppOGV;ueKF?J0Om33iZF zH2QESbBeBhr8%;JG&k?G^;uI3LN1^z7@bfffy;zkgc4!qGNjbwxYVvATG_s&ImBv>hcRa@`sN$>ALE{Y5R^Mm2oq{7=g?Xp`(#$S)|+u z3jrcAMTF~KoyZlAN)eS*onfUfq?HSy&Etuwmonp1ZCAdIgO^#Cw%ib4^x;$ipc=$f z1qai_L7W^9EW}Eyp4%AENkS0oi!3^_=pt2i3A>+LKgwV%@3^cbFi=2R^a)KMXqk}~gCGH{ zY0(C0Xrj?iq(-4X88Et&VVc)mFgfd$mQuX3y;=99 z{$KZZ?Oe7-51BQOw`*}CNoH~zJXIS#j}vI|$1Yj*^Xc_bi0Aa086j)E-rU*~?%BOC z)8&r#4OJ+1n+PQd7M=&-%&66revC~7+h`A2xxssk)0P=&qn4;jxF0}~d6LtvGP-Sn zfnmOyY2PTvVL`y0%Zy1L3j^XcyQ8| z%!#RYkY1#=d&h}~W;K)yaCxR?hXU>`2viQY476{69PDP1u`xKYMIVBp=COFjJAwgO zZCZss!%74uy}?9oEoKv#i0tI3jcwxJ1`;~ehbrBI;4p?g!t{`|cr}z!$p~i3;|3(5 zwjgE((_gOpjXIabD-LCcv`InBA(YiR_b;5QqcPTL$>7VkK*XfT{e7-c?hz7+$-LXZ z9g}_n?UxHHhW!?HU%I>GGZ)JWa9xN|TAj)=@UD_Q;eQY3oBEg3$;N9-gN3E~GbNcm z5*Zc03D`agV`kf*^fSiaFIoXvpn1uyJ}kE{JGKiWPe@F<2crJ)?3tVJQ!~7va71ic zL1tu_yNfs%NfKx!eF;_mc_J0KbMrt>(~JrBA(28;390vVBZd7T^kL}RoYgkgyPZ)# zPuLe!hgJilBlJ1nUv;4A@{O-Ioc!Gl^?9sy3YUk&`6 z6w$5AuVtT!yzByK3N6B4l0!=z-=YhY44kLc(oTrAG}rQiFfIB)<=DVDz&niu8DiV4 z=rRV(P%(tPEbMDBd9Y~+g5mC7pqaOP>gP5XxBYc*lsg-pD#Fr+6vQZNXzV7b4d_vj zDOiKaH>rOp^_q7^MV=Dd(qnc__3u%Vg`Gr!77bp6KmcupoT#@32z@TQ<{^lSQ=@(+?5l;2j{uq z4hJ6_r{rdgIZMCMvi#$_??tVbdo25oV3dOo-$O417uyN1+CHxVkt zurJw{r1I<_z(z)!BG-7ajZ!05H{k?~tp@I>0mw^l&6AOU(P8+UuasI4Pwh_(Hk=>> zl@=DnQh;I~rlaDU@JE~wmjVM%FehA@xCYo#ED94!*~dSiJrizY3f0_3Ec=h?+G&R& z&vY9!Zq~BR{fyP$TEG13=C?(G2P*f0FaRY;de<*jPj&#yUz`?HEU+t4PNtpShYz`? z-d;^W7pzjir5DgY!^uXW<7xF&ox(9%-bUHWK`X$}o6E55nKEuCPZeXXT2Qp#e^mEH zrobcrqcX{?&^b@^rLCB3gj+>-L2(BiZ$d+bZbw|ZD*m8tK=)k5`l4!qiRdY377(hcX$q)>8x~Ly$ZwT<27>R- z-HpU!|3~Im+@XgedKCBNX#vCgU3^Tm^kwsh=+}nT>2obs*i8su%!qD%p&jJJq-%H=7gQ(cqhphyOjIL;qvT5)mF6RpjUMZr;0BjVssm!zE*}(Yg)!?d4ezx3fE<)=9P@Z@{x-#e^LdzeBoAaXfw1;nHHh(#2Ec5mLE7DMFv=e+`}qJe96Sb+7K=ia!JquQ>CBLpH9>1 zr&#;1WD|PVA6cCay)S9U7z@@tZ|^_LWepb+K7#m6_G6Z_etQw3(O!;5pw`|e^lA=$ z^3_W6bpl5Kkb-%r^kK`>R?#HIvbsr=d*oZn@|hxzyX!i|Z@K=BAZ6sfUu6ERt88^> zZ-X?M{N*Nz9#cLG3;V4rOy0D!$CS$tOi=>5K zrTmt%&Pf@W^FcC5a5PGQfcPLV1X}QbYFtxBr%`}9TF^5xvvP398>yF&#if4`8sCcW zHyFNXm<%?D*q^6BhszM$A!LYyeTMvCYbwvl66e^Qp0kcQKQ=6Ko{RF!8i8|Fygs)} zoEwNcH){&#-jY9@$La6?M2nu!OZn>x_P6uC%)F2Dwf^V%PD;`!*MG1m;QZM7!3#t` zBtQ0yG>+HS1Y3+qoB# zSR%V{29%?mc&xKr%t0TLPzXBn1;7NsXF>*MA}}VX0H=VOHq$dctji2(1)HZnLc~n3fg#Hj+0Z%^u`=~ zQR-R4a;u75E1Rf<-Nft7_S7hAP1M$%Ddrz+Mig_A6-pqr5-uY*Old#dL}Rn|+rwoEkhU++uQ+YC)&C0!}fCa9pn=IdbCZwhV0wMaW$boN;uWIhC!au=dYAdL9* zI7yL44n>qvwb#*9*+$nt438!(U! zG{dRLy+G{}RKw99rO_T)0#ljkpfwb3df{hCMi`?MZ6s(?%n*5&P+`s5VC#Xz4tp?t z4v{H2esszy<2iauk(c6YrQYjW6Z4q`QHy62Rf-L8*Ugqp5&%N|N-?m{N@0K;&lCo} z8wz`rQYTC3_}r<^b*8V`9>X7~YRe~AsFYI|rRLk&69bpZc8wI!)wOUW*C~3ssp+<_ zJ7pzRft`1(r_{qz*z%$}d92=up7Oe$we)3QDzm89e(*`vo7Q`QGkqvK^QG@=|JS5K zQQmRJInW{OG-UOE#s+(bloFvsSg*0HbSzz|pt_bFr*ZKk^go$DdH+|_m8)%9*K(am(bO?-wu=uuC!d}fn{+=tmvmlzTS-C>vk z*vHet;j_P#9~h;G9Sq9G(K)TmaMU!~(er|FV78ev$1^t8asS|YbN_@qNu-Vwlb9Hh znhaCqr-aJXl7<{l({B;h)^vmobcu1!iKaJw>fw~S`!>CV=CS9^(ygT&_X_$%ey-(S zFq=b|sSejz@UvxL@lStR#!P*=QK%(9m5@pw`^fpk_o>fV1<2>NY3lSz68o&6B^>y( zd*y9!<=(*HtocUUdw<4v&Mw7(Vvz6s096prk9_fm8a3eB^K{X?SKsO}oC0np(IG(!y@I5aS{)^JLeXM)I9ZNlg{_-xLm>2Lq$ z-8s-l!5{#nv5X~2bnm1j~>DxcHamrDmexHYh+wE?{HOfabwW|B^3MtTl*?z0V< z%b=Q{82pkw>?PN8Q0zJQyyq}+(u^rnSFfIF(kymIP(14LK>&hJR!4HwU=Ch@3w0h* z2N=E2NSi?7sl#}mJh#MFu*f9AW#g1A@5QZ3*&`qe%HD4+>Q+4dUiPI~e_wiA>j1KF z>&;Z+sTGarFqOn>L;I0z>PQ*4xFtW~$7<}PJrD;%F8RWc#}QX7W|&f?Sh2!EuG;f& z`gfra>V*>Dd^2Yb0}g0t_MK=J`OC6lyT;$yNz>06R7;E+YoKr-tk(wcqRu*?g%;0w zF3$7O_>Lrz#8?_Tso}*zTvBqWt|PI3L!s{ht-8sp8Vv%~bRe(vg^)&4IVwXEi1Tk# zEMK_>t_Ke24*SyR0FF8XNaZ7t_q3Up#O-K~cl=wNA;YqHrrgrG-JE*6>G%Kj5CRrw|e9e;uy}J%d2O+{CmIgf zeeq@1I01$~g2H4nC3(@mi0qVuQ6IAnf#O4bMqs0M0>Apkpp>nnW8e9P8o7K4zP!nJ z7OO4F>k8U25)c<(Ne3{ZM3q%U6NL{J&PGtMf}!I+%4ZNLL=uHMG=K&WJb0d^XN&x0 zT^clK!g8b^H8ckVs{gMNuiPsHBxl?`j53=1b@@v?NiiqQC?$wHaR(tH2qX{-Enw#+ zZW_x#iEJa6kBZ2T>1lwL0#+hDI2nNGSE4mu@5(-`DN!R13Aboa8(>Tb;834Pyo&#( z4FIHLFi?MQqZGVi=uQj=RB%XV&`OtzAD8J;6L1ykR;Vu4RCK+4|B|W8|L<2Cn zu9P7sCsZ+SBsm!Wh23&!4ZbKP>fI>PXy=Mbf@@w2<);<9wPv&L0=By0!5`pJA|!;_ z0+^pL&>#pW+*Fhb?1N9h24b^}n<)S`ri{CZ+SucBQlIxbyl)gp>!=4SB=l{<*LV`| z?cjEKfs@p+QItzbdD-B>@*07b>teZAq>y!QvetX^1iw^kJK+dGUn=QKr5R|-1<4^x z2^Qho=8?J9GS)Y?C|G8`7dJSvJ8BTbxk^w45|I*nA4~v?%qUI$D`hkypc@#*pMx3^ey0|bzZpk0d7b-pH3Ml}+|PgtdQD)k003n11BivN zV1u%7oK!%Y_NkHUVH{gvg&7XGjTinqLWsy15>y0Ih#Za}bDBDj5-QV84GlWkLNC49 zaYY|PGsg6u&#^>%Qh{WyafQI#V4vh}2-7|RE{Hdr z9NDnJODE8c3s8A!6bvA_dRFD@t{C^)%_jPDJ9jkMDFFBLfX8`~&-2n+*-x+Yb#Czh z-g%|-7KM!8uZ6@P5)ywRB>qB3{0(U{WrwDDy>bF(b%r*lgS2@!dEW9Y^1SC+GRIPJ z!~`m9ptAucTVS^f9{UhHJ_tu?&tb%(F9zA*PJs0=20&!nGjXk?{Cm^ff-h;<}=XCnM z!MhKizV`3(P|&Pn;ovQ{8sLZgh~Apr+pVh{&tAC!Sq1l=((~upBiWbyNGBlh2vjt5 zhLZ*+7IrQkKEYME=Wb*$dT|tBTvA$2QCU@8Q#*A7B)YURJPq37lG1XD%Bt$d*qznj zx4+^#!I7DnN#`QJ8i(D>PRoM4J5xiZv*HZ=o`Ias{{ZRI6SgO&?`v~YQdwQen1@%r zCntFoQ~x?uuXW(?JGyJsKeF^BD=m?)UJjFMH#53v#}jDtK?(91-T3ILvH06gIk@+9 z-33J*=9{&M1QDf(b3*AHdE&KMnDXiJ7A&7T*SmDTe8C=$>Q`a5k||8R>3KWZem$$9 zYVP%@y-Q!1J6fok^2qGwv+keWOixpdvO^0%YecIMf4r|@{mPuPAb4eJ-OoGh&X?0m zD#f*!0ibfdWP!G)FFMe>V1t1+2SID27aibMeW`-asI=<;o!gR8Nw7q+Xw*uwcF-Y+ z^pZl7gwdgcNX4E=LzzA49Z7?j51=BOzaa$J#zYW7w8BM@*{^&DG?4}W{y6+Ag-pKc zCnCs1fJlc{?FJ6zNuFez+s3ht%zQt=<>m&!G?_M3Jx~9G|JiJv0#YsNnlNvZW?b@R zqPOW#0guu+1u*Na*c|O|7PMthR(uYJ9Q!zv4=U>t{P>7diBR@0wS557e$qbG_9x5Z z_c)OTFlQw-QjMAFxbLdJ5vX#2|8ZdA_q=c)cYJb0psCYm_nvI=AVr4=Dl+=!-4w^_|^72x`K8J6}OR&9|cs zrQgm|Ui~h`Acu=2y)0F+ic2tUT`{_{8=~M$s~xd_qqeJsN^mz-;7uw%XgOPravEU{yxvLj$%LR zu~-{H^`h1*<*)j}iAGi^M5vK<$=3OA@{OpJ#UTF9JC`~Df@(pERnDvzuiI z=};wjUe{Td5rlg<6c+T%tw+HkhQ{Mn@%5>Yl}sj`)>pLMlDJw)c*V`cOT|6e2Xx2? zBHk*Ng=g}vjMbK!9~ifC0WWa3(;kKL?}$a?*Re7GX8Cu4MgM%X|MoBusk>@D(I%Um z+Xd>_bO2&53Wyv)DSaJ}!Uf)w;0bJ_5VXle4bc_j7-R{9^ylR@^L2iYnsbkiqlsBc z3s%a(r_q%zA1vQYw3X0h zb|(3rvJSX0obi&p!dnLuksQadI8F%fde%K}`3*5HUX04OG5=o%$_k52Ji5#@oludc za$btt`rEP9|F6MxkVotM1Faq!t2o+;IlZp`)A}}*H&i{>#jb4EgKBWAcjRt((Bth{ ztolCkGQ7E!yPrb!eIE7ek^Bg+{pKV7PK~cW1*)HqvmI^Jl91;)fa+IaEdx0PlrEt9 zHD52^g|_rc3D<8ys(b2A@9=w2`zfkFk+-kcIgwg!oHJ?}g8URlWvCz#Qb$xYbTJ@r zFBKW+uueM;;}ufNMje+9Enx0D9aXhUyqR zrFmHDUo^)>3RKNB)15Ux97xeB?)BD2gS@g?W=ypfUdSKm_KU;TqPQ(&a zHobGtv`%dK{Z0{aDiZrJ69++u%TyM}=)?deVH1qSA&*x(;ew~&n>#ZNYY%6t}4`ofr%d$b5nZu>Mj?gA zEvp^Q*KX_8=pi#X&bMy6y*GgTK17Oe?8?NR+B1~blGO@OLu1<7JK963ALYQq*|AQ6 zd01itkprS=rG8CcWs2A$uEz+XNT`arVP9lPu1b`SK_`6rXJ@j>c7|-CbCL7%7jWPT zUH<%vt|{Qr8_t}yqFYyiIj_9KM3fy0UjKm}>7JhMf5yfEFZ@bx{7xVINnhdHZrY&? z91LyG&Uy}Jt#eS|dF;;Cw-O=l?4=^%&W`l@M?0z=&5n)?Y9d=QI>3I&bxbx{x~HBU z-}ylsu0`pnah)b@T63XV1j?v#eLXr6D67qRwfzKbyU|8_q3HIZuM*hK;8{9?P6V^s zA}8_u1x(t3>9WC8?81yL3WPS@5e8xSw}T-W2E#Ip5TL+WLF$6mlfBU=VSS_YFX;#y z73P|C5F9UVZiD-s-2i*t7WVs)hDg6UY=dK#6SJu^W?bIW_w@*uuwQvAAD3amBt!aK zzvdbk+&S8^E!@iop)VO1>;rb-p^n|d6zQ}CFOjfIGLDY305%Q?xBpFI2M*u_O`Ix= zZ-)Q_3Vc@m0}XH*1R)Irku0hfwH%v`>pHF`+^S5Z3ZOt)DE4KcI8rz@N4EE3^#ZYv zFNW){*PFmy07(t%Lf-|n9R)g&ni|OqHLZUK`cn8+^aQMTI}Z(N^+csy4j#7e0hsS; zVM&CQYHzD`FfA5#8srYN%##N&A*O?*HrztyF*G{US_NYBMxcMD#XLB*fMB!)~R?#7}C?x*Z- z%*5S1T2fT{v&`M34N709-Hx^YBy&%WGm&8^kB2FRxhG-@uG9S6hBCz1_9B7pg9CMf zn@IE!gbOsv&HFy&M*-vmme&t*$|(vJ!h?h&$Sp-R<}q>i=pGj4Uw<8NiV|MA7B*#) z&^}spB%C^qTXZ3!i}BY7bk`@vSyo9i`di?cl*)}A>J~3xO5YqrUp)AAE>_OsT=~{v zEJ}1*>FOQoFcvK^of5E&9}7efux3#2eurx~r!M(@YF%TZYodi|d!O0pLfazS$psJl zC>X+LO8PVU9*=*qJ~DT<*s$uhpzSFC#8=ek77 zvfZN7E(wyot&XQ9C#RlnCsGqchJ=}tukrU46>9>6$S4J+5@O%iQ3~TDLeVSZ(z+Vs z1St>ggRkoQq*L`mJrWo{zh3Xwi|+O0wVtG^7RtI}p_DPK>xpzrluZ1)0e$%^t7S>Q zT0VzMe*P0za*FG43+|0On=xX95(VQyIvg36?$q{X?;ST_*;+iNnYe?et<9FXhZbNd zubRQax3eGAFltd9;?|NAar*82{ah=yGEtq|E~ul4wsvto(FXUVaL|!XCv6rM7?}i6 zL1)IAV#<*Ltbp^LVm`RKrm!Oe0N6l%Xgq)$kf$DDbYxthFzR@qwW3e4cgF*xYED~= z8mcm3NUboAbl~2mc;Kz~lR}6f#tBM=jO|a7FXlCQOb$w$5I2Vk^G@rSqeGAmI#)ip$!aD4W3bX)0*^^0wD&;k zh!%7Ei)*Fjhv?pApsl>r&@LYpypC?*!B%^}?vZa#k^vvmy3f*0LOIdyk4 zxlg#aYS?ucJ}({sce@$Tila$I8aWiXOjWK^liQ*D-AsQGdypMyP9}d1Ffx;a|9bIA zL6TTBxiBoWMM(*zeoNnl(q%�|o|A<_G9#bJ&K$mXTSM@kZfZ^-ZYS)6EG~kHJ{! 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

    TIWHPC<_9>em(Cvlhuf-BD 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 literal 0 HcmV?d00001 diff --git a/src/librustdoc/html/static/FiraSans-Regular.woff2 b/src/librustdoc/html/static/FiraSans-Regular.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..e766e06ccb0d457fcdc8d4428efb796c7772a497 GIT binary patch literal 129188 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

    )Thpg9J)x+@B(n?maf9&#`PQNHtKX<@|CQ`> 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 N#!G)s; 0) { if (obj.length > GENERICS_DATA && obj[GENERICS_DATA].length >= val.generics.length) { - var elems = obj[GENERICS_DATA].slice(0); + var elems = Object.create(null); + var elength = object[GENERICS_DATA].length; + for (var x = 0; x < elength; ++x) { + elems[getObjectNameFromId(obj[GENERICS_DATA][x])] += 1; + } var total = 0; var done = 0; // We need to find the type that matches the most to remove it in order // to move forward. var vlength = val.generics.length; - for (var y = 0; y < vlength; ++y) { - var lev = { pos: -1, lev: MAX_LEV_DISTANCE + 1}; - var firstGeneric = getObjectFromId(val.generics[y]).name; - for (var x = 0, elength = elems.length; x < elength; ++x) { - var tmp_lev = levenshtein(getObjectFromId(elems[x]).name, - firstGeneric); - if (tmp_lev < lev.lev) { - lev.lev = tmp_lev; - lev.pos = x; + for (x = 0; x < vlength; ++x) { + var lev = MAX_LEV_DISTANCE + 1; + var firstGeneric = getObjectNameFromId(val.generics[x]); + var match = null; + if (elems[firstGeneric]) { + match = firstGeneric; + lev = 0; + } else { + for (elem_name in elems) { + tmp_lev = levenshtein(elem_name, firstGeneric); + if (tmp_lev < lev) { + lev = tmp_lev; + match = elem_name; + } } } - if (lev.pos !== -1) { - elems.splice(lev.pos, 1); - lev_distance = Math.min(lev.lev, lev_distance); - total += lev.lev; + if (match !== null) { + elems[match] -= 1; + if (elems[match] == 0) { + delete elems[match]; + } + total += lev; done += 1; } else { return MAX_LEV_DISTANCE + 1; @@ -876,25 +901,27 @@ function defocusSearchBar() { // Check for type name and type generics (if any). function checkType(obj, val, literalSearch) { var lev_distance = MAX_LEV_DISTANCE + 1; - var len, x, y, e_len, firstGeneric; + var len, x, firstGeneric; if (obj[NAME] === val.name) { if (literalSearch === true) { if (val.generics && val.generics.length !== 0) { if (obj.length > GENERICS_DATA && obj[GENERICS_DATA].length >= val.generics.length) { - var elems = obj[GENERICS_DATA].slice(0); - var allFound = true; + var elems = Object.create(null); + len = obj[GENERICS_DATA].length; + for (x = 0; x < len; ++x) { + elems[getObjectNameFromId(obj[GENERICS_DATA][x])] += 1; + } + var allFound = true; len = val.generics.length; - for (y = 0; allFound === true && y < len; ++y) { - allFound = false; - firstGeneric = getObjectFromId(val.generics[y]).name; - e_len = elems.length; - for (x = 0; allFound === false && x < e_len; ++x) { - allFound = getObjectFromId(elems[x]).name === firstGeneric; - } - if (allFound === true) { - elems.splice(x - 1, 1); + for (x = 0; x < len; ++x) { + firstGeneric = getObjectNameFromId(val.generics[x]); + if (elems[firstGeneric]) { + elems[firstGeneric] -= 1; + } else { + allFound = false; + break; } } if (allFound === true) { @@ -1062,13 +1089,6 @@ function defocusSearchBar() { return false; } - function generateId(ty) { - if (ty.parent && ty.parent.name) { - return itemTypes[ty.ty] + ty.path + ty.parent.name + ty.name; - } - return itemTypes[ty.ty] + ty.path + ty.name; - } - function createAliasFromItem(item) { return { crate: item.crate, @@ -1154,7 +1174,7 @@ function defocusSearchBar() { in_args = findArg(searchIndex[i], val, true, typeFilter); returned = checkReturned(searchIndex[i], val, true, typeFilter); ty = searchIndex[i]; - fullId = generateId(ty); + fullId = ty.id; if (searchWords[i] === val.name && typePassesFilter(typeFilter, searchIndex[i].ty) @@ -1204,7 +1224,7 @@ function defocusSearchBar() { if (!type) { continue; } - fullId = generateId(ty); + fullId = ty.id; returned = checkReturned(ty, output, true, NO_TYPE_FILTER); if (output.name === "*" || returned === true) { @@ -1288,15 +1308,15 @@ function defocusSearchBar() { var index = -1; // we want lev results to go lower than others lev = MAX_LEV_DISTANCE + 1; - fullId = generateId(ty); + fullId = ty.id; if (searchWords[j].indexOf(split[i]) > -1 || searchWords[j].indexOf(val) > -1 || - searchWords[j].replace(/_/g, "").indexOf(val) > -1) + ty.normalizedName.indexOf(val) > -1) { // filter type: ... queries if (typePassesFilter(typeFilter, ty.ty) && results[fullId] === undefined) { - index = searchWords[j].replace(/_/g, "").indexOf(val); + index = ty.normalizedName.indexOf(val); } } if ((lev = levenshtein(searchWords[j], val)) <= MAX_LEV_DISTANCE) { @@ -1544,9 +1564,9 @@ function defocusSearchBar() { } else if (type === "structfield" && parentType === "variant") { // Structfields belonging to variants are special: the // final path element is the enum name. - var splitPath = item.path.split("::"); - var enumName = splitPath.pop(); - path = splitPath.join("::"); + var enumNameIdx = item.path.lastIndexOf("::"); + var enumName = item.path.substr(enumNameIdx + 2); + path = item.path.substr(0, enumNameIdx); displayPath = path + "::" + enumName + "::" + myparent.name + "::"; anchor = "#variant." + myparent.name + ".field." + name; pageType = "enum"; @@ -1824,8 +1844,9 @@ function defocusSearchBar() { function buildIndex(rawSearchIndex) { searchIndex = []; var searchWords = []; - var i; + var i, word; var currentIndex = 0; + var id = 0; for (var crate in rawSearchIndex) { if (!hasOwnProperty(rawSearchIndex, crate)) { continue; } @@ -1833,23 +1854,39 @@ function defocusSearchBar() { var crateSize = 0; searchWords.push(crate); - searchIndex.push({ + var normalizedName = crate.indexOf("_") === -1 + ? crate + : crate.replace(/_/g, ""); + // This object should have exactly the same set of fields as the "row" + // object defined below. Your JavaScript runtime will thank you. + // https://mathiasbynens.be/notes/shapes-ics + var crateRow = { crate: crate, ty: 1, // == ExternCrate name: crate, path: "", desc: rawSearchIndex[crate].doc, + parent: undefined, type: null, - }); + id: id, + normalizedName: normalizedName, + }; + id += 1; + searchIndex.push(crateRow); currentIndex += 1; - // an array of [(Number) item type, - // (String) name, - // (String) full path or empty string for previous path, - // (String) description, - // (Number | null) the parent path index to `paths`] - // (Object | null) the type of the function (if any) - var items = rawSearchIndex[crate].i; + // an array of (Number) item types + var itemTypes = rawSearchIndex[crate].t; + // an array of (String) item names + var itemNames = rawSearchIndex[crate].n; + // an array of (String) full paths (or empty string for previous path) + var itemPaths = rawSearchIndex[crate].q; + // an array of (String) descriptions + var itemDescs = rawSearchIndex[crate].d; + // an array of (Number) the parent path index + 1 to `paths`, or 0 if none + var itemParentIdxs = rawSearchIndex[crate].i; + // an array of (Object | null) the type of the function, if any + var itemFunctionSearchTypes = rawSearchIndex[crate].f; // an array of [(Number) item type, // (String) name] var paths = rawSearchIndex[crate].p; @@ -1863,36 +1900,41 @@ function defocusSearchBar() { paths[i] = {ty: paths[i][0], name: paths[i][1]}; } - // convert `items` into an object form, and construct word indices. + // convert `item*` into an object form, and construct word indices. // // before any analysis is performed lets gather the search terms to // search against apart from the rest of the data. This is a quick // operation that is cached for the life of the page state so that // all other search operations have access to this cached data for // faster analysis operations - len = items.length; + len = itemTypes.length; var lastPath = ""; for (i = 0; i < len; ++i) { - var rawRow = items[i]; - if (!rawRow[2]) { - rawRow[2] = lastPath; + // This object should have exactly the same set of fields as the "crateRow" + // object defined above. + if (typeof itemNames[i] === "string") { + word = itemNames[i].toLowerCase(); + searchWords.push(word); + } else { + word = ""; + searchWords.push(""); } + var normalizedName = word.indexOf("_") === -1 + ? word + : word.replace(/_/g, ""); var row = { crate: crate, - ty: rawRow[0], - name: rawRow[1], - path: rawRow[2], - desc: rawRow[3], - parent: paths[rawRow[4]], - type: rawRow[5], + ty: itemTypes[i], + name: itemNames[i], + path: itemPaths[i] ? itemPaths[i] : lastPath, + desc: itemDescs[i], + parent: itemParentIdxs[i] > 0 ? paths[itemParentIdxs[i] - 1] : undefined, + type: itemFunctionSearchTypes[i], + id: id, + normalizedName: normalizedName, }; + id += 1; searchIndex.push(row); - if (typeof row.name === "string") { - var word = row.name.toLowerCase(); - searchWords.push(word); - } else { - searchWords.push(""); - } lastPath = row.path; crateSize += 1; } @@ -1917,8 +1959,8 @@ function defocusSearchBar() { return searchWords; } - function startSearch() { - var callback = function() { + function registerSearchEvents() { + var searchAfter500ms = function() { clearInputTimeout(); if (search_input.value.length === 0) { if (browserSupportsHistoryApi()) { @@ -1930,8 +1972,8 @@ function defocusSearchBar() { searchTimeout = setTimeout(search, 500); } }; - search_input.onkeyup = callback; - search_input.oninput = callback; + search_input.onkeyup = searchAfter500ms; + search_input.oninput = searchAfter500ms; document.getElementsByClassName("search-form")[0].onsubmit = function(e) { e.preventDefault(); clearInputTimeout(); @@ -1994,12 +2036,31 @@ function defocusSearchBar() { } }); } - search(); + + // This is required in firefox to avoid this problem: Navigating to a search result + // with the keyboard, hitting enter, and then hitting back would take you back to + // the doc page, rather than the search that should overlay it. + // This was an interaction between the back-forward cache and our handlers + // that try to sync state between the URL and the search input. To work around it, + // do a small amount of re-init on page show. + window.onpageshow = function(){ + var qSearch = getQueryStringParams().search; + if (search_input.value === "" && qSearch) { + search_input.value = qSearch; + } + search(); + }; } index = buildIndex(rawSearchIndex); - startSearch(); + registerSearchEvents(); + // If there's a search term in the URL, execute the search now. + if (getQueryStringParams().search) { + search(); + } + }; + function addSidebarCrates(crates) { // Draw a convenient sidebar of known crates if we have a listing if (window.rootPath === "../" || window.rootPath === "./") { var sidebar = document.getElementsByClassName("sidebar-elems")[0]; @@ -2010,14 +2071,6 @@ function defocusSearchBar() { var ul = document.createElement("ul"); div.appendChild(ul); - var crates = []; - for (var crate in rawSearchIndex) { - if (!hasOwnProperty(rawSearchIndex, crate)) { - continue; - } - crates.push(crate); - } - crates.sort(); for (var i = 0; i < crates.length; ++i) { var klass = "crate"; if (window.rootPath !== "./" && crates[i] === window.currentCrate) { @@ -2025,9 +2078,6 @@ function defocusSearchBar() { } var link = document.createElement("a"); link.href = window.rootPath + crates[i] + "/index.html"; - // The summary in the search index has HTML, so we need to - // dynamically render it as plaintext. - link.title = convertHTMLToPlaintext(rawSearchIndex[crates[i]].doc); link.className = klass; link.textContent = crates[i]; @@ -2038,26 +2088,8 @@ function defocusSearchBar() { sidebar.appendChild(div); } } - }; - - /** - * Convert HTML to plaintext: - * - * * Replace "foo" with "`foo`" - * * Strip all other HTML tags - * - * Used by the dynamic sidebar crate list renderer. - * - * @param {[string]} html [The HTML to convert] - * @return {[string]} [The resulting plaintext] - */ - function convertHTMLToPlaintext(html) { - var x = document.createElement("div"); - x.innerHTML = html.replace('', '`').replace('', '`'); - return x.innerText; } - // delayed sidebar rendering. window.initSidebarItems = function(items) { var sidebar = document.getElementsByClassName("sidebar-elems")[0]; @@ -2194,7 +2226,7 @@ function defocusSearchBar() { return "+"; } // button will collapse the section - // note that this text is also set in the HTML template in render.rs + // note that this text is also set in the HTML template in ../render/mod.rs return "\u2212"; // "\u2212" is "−" minus sign } @@ -2837,43 +2869,17 @@ function defocusSearchBar() { }); } - function enableSearchInput() { - if (search_input) { - search_input.removeAttribute('disabled'); - } - } - - window.addSearchOptions = function(crates) { + function addSearchOptions(crates) { var elem = document.getElementById("crate-search"); if (!elem) { - enableSearchInput(); return; } - var crates_text = []; - if (Object.keys(crates).length > 1) { - for (var crate in crates) { - if (hasOwnProperty(crates, crate)) { - crates_text.push(crate); - } - } - } - crates_text.sort(function(a, b) { - var lower_a = a.toLowerCase(); - var lower_b = b.toLowerCase(); - - if (lower_a < lower_b) { - return -1; - } else if (lower_a > lower_b) { - return 1; - } - return 0; - }); var savedCrate = getSettingValue("saved-filter-crate"); - for (var i = 0, len = crates_text.length; i < len; ++i) { + for (var i = 0, len = crates.length; i < len; ++i) { var option = document.createElement("option"); - option.value = crates_text[i]; - option.innerText = crates_text[i]; + option.value = crates[i]; + option.innerText = crates[i]; elem.appendChild(option); // Set the crate filter from saved storage, if the current page has the saved crate // filter. @@ -2881,11 +2887,10 @@ function defocusSearchBar() { // If not, ignore the crate filter -- we want to support filtering for crates on sites // like doc.rust-lang.org where the crates may differ from page to page while on the // same domain. - if (crates_text[i] === savedCrate) { + if (crates[i] === savedCrate) { elem.value = savedCrate; } } - enableSearchInput(); }; function buildHelperPopup() { @@ -2908,10 +2913,14 @@ function defocusSearchBar() { ["⏎", "Go to active search result"], ["+", "Expand all sections"], ["-", "Collapse all sections"], - ].map(x => "

    " + - x[0].split(" ") - .map((y, index) => (index & 1) === 0 ? "" + y + "" : " " + y + " ") - .join("") + "
    " + x[1] + "
    ").join(""); + ].map(function(x) { + return "
    " + + x[0].split(" ") + .map(function(y, index) { + return (index & 1) === 0 ? "" + y + "" : " " + y + " "; + }) + .join("") + "
    " + x[1] + "
    "; + }).join(""); var div_shortcuts = document.createElement("div"); addClass(div_shortcuts, "shortcuts"); div_shortcuts.innerHTML = "

    Keyboard Shortcuts

    " + shortcuts + "
    "; @@ -2929,7 +2938,9 @@ function defocusSearchBar() { "You can look for items with an exact name by putting double quotes around \ your request: \"string\"", "Look for items inside another one by searching for a path: vec::Vec", - ].map(x => "

    " + x + "

    ").join(""); + ].map(function(x) { + return "

    " + x + "

    "; + }).join(""); var div_infos = document.createElement("div"); addClass(div_infos, "infos"); div_infos.innerHTML = "

    Search Tricks

    " + infos; @@ -2944,12 +2955,48 @@ function defocusSearchBar() { buildHelperPopup = function() {}; } + function loadScript(url) { + var script = document.createElement('script'); + script.src = url; + document.head.append(script); + } + + function setupSearchLoader() { + var searchLoaded = false; + function loadSearch() { + if (!searchLoaded) { + searchLoaded = true; + loadScript(window.searchJS); + } + } + + // `crates{version}.js` should always be loaded before this script, so we can use it safely. + addSearchOptions(window.ALL_CRATES); + addSidebarCrates(window.ALL_CRATES); + + search_input.addEventListener("focus", function() { + search_input.origPlaceholder = search_input.placeholder; + search_input.placeholder = "Type your search here."; + loadSearch(); + }); + search_input.addEventListener("blur", function() { + search_input.placeholder = search_input.origPlaceholder; + }); + search_input.removeAttribute('disabled'); + + var crateSearchDropDown = document.getElementById("crate-search"); + // `crateSearchDropDown` can be null in case there is only crate because in that case, the + // crate filter dropdown is removed. + if (crateSearchDropDown) { + crateSearchDropDown.addEventListener("focus", loadSearch); + } + var params = getQueryStringParams(); + if (params.search !== undefined) { + loadSearch(); + } + } + onHashChange(null); window.onhashchange = onHashChange; + setupSearchLoader(); }()); - -// This is required in firefox. Explanations: when going back in the history, firefox doesn't re-run -// the JS, therefore preventing rustdoc from setting a few things required to be able to reload the -// previous search results (if you navigated to a search result with the keyboard, pressed enter on -// it to navigate to that result, and then came back to this page). -window.onunload = function(){}; diff --git a/src/librustdoc/html/static/noscript.css b/src/librustdoc/html/static/noscript.css index ffa1a7639a..c9fed989ec 100644 --- a/src/librustdoc/html/static/noscript.css +++ b/src/librustdoc/html/static/noscript.css @@ -23,3 +23,13 @@ rules. #main .impl-items .hidden { display: block !important; } + +#main .impl-items h4.hidden { + /* Without this rule, the version and the "[src]" span aren't on the same line as the header. */ + display: flex !important; +} + +#main .attributes { + /* Since there is no toggle (the "[-]") when JS is disabled, no need for this margin either. */ + margin-left: 0 !important; +} diff --git a/src/librustdoc/html/static/rustdoc.css b/src/librustdoc/html/static/rustdoc.css index 56f17b7a61..4f287cde73 100644 --- a/src/librustdoc/html/static/rustdoc.css +++ b/src/librustdoc/html/static/rustdoc.css @@ -3,13 +3,19 @@ font-family: 'Fira Sans'; font-style: normal; font-weight: 400; - src: local('Fira Sans'), url("FiraSans-Regular.woff") format('woff'); + src: local('Fira Sans'), + url("FiraSans-Regular.woff2") format("woff2"), + url("FiraSans-Regular.woff") format('woff'); + font-display: swap; } @font-face { font-family: 'Fira Sans'; font-style: normal; font-weight: 500; - src: local('Fira Sans Medium'), url("FiraSans-Medium.woff") format('woff'); + src: local('Fira Sans Medium'), + url("FiraSans-Medium.woff2") format("woff2"), + url("FiraSans-Medium.woff") format('woff'); + font-display: swap; } /* See SourceSerifPro-LICENSE.txt for the Source Serif Pro license. */ @@ -18,18 +24,21 @@ font-style: normal; font-weight: 400; src: local('Source Serif Pro'), url("SourceSerifPro-Regular.ttf.woff") format('woff'); + font-display: swap; } @font-face { font-family: 'Source Serif Pro'; font-style: italic; font-weight: 400; src: local('Source Serif Pro Italic'), url("SourceSerifPro-It.ttf.woff") format('woff'); + font-display: swap; } @font-face { font-family: 'Source Serif Pro'; font-style: normal; font-weight: 700; src: local('Source Serif Pro Bold'), url("SourceSerifPro-Bold.ttf.woff") format('woff'); + font-display: swap; } /* See SourceCodePro-LICENSE.txt for the Source Code Pro license. */ @@ -40,12 +49,14 @@ /* Avoid using locally installed font because bad versions are in circulation: * see https://github.com/rust-lang/rust/issues/24355 */ src: url("SourceCodePro-Regular.woff") format('woff'); + font-display: swap; } @font-face { font-family: 'Source Code Pro'; font-style: normal; font-weight: 600; src: url("SourceCodePro-Semibold.woff") format('woff'); + font-display: swap; } * { @@ -125,11 +136,12 @@ h1, h2, h3, h4, #source-sidebar, #sidebar-toggle, /* This selector is for the items listed in the "all items" page. */ #main > ul.docblock > li > a { - font-family: "Fira Sans", sans-serif; + font-family: "Fira Sans", Arial, sans-serif; } .content ul.crate a.crate { - font: 16px/1.6 "Fira Sans"; + font-size: 16px/1.6; + font-family: "Fira Sans", Arial, sans-serif; } ol, ul { @@ -336,10 +348,10 @@ nav.sub { .rustdoc:not(.source) .example-wrap { display: inline-flex; margin-bottom: 10px; - position: relative; } .example-wrap { + position: relative; width: 100%; } @@ -471,7 +483,7 @@ h4 > code, h3 > code, .invisible > code { } #main > .since { top: inherit; - font-family: "Fira Sans", sans-serif; + font-family: "Fira Sans", Arial, sans-serif; } .content table:not(.table-display) { @@ -680,6 +692,7 @@ a { width: calc(100% - 63px); } #crate-search { + min-width: 115px; margin-top: 5px; padding: 6px; padding-right: 19px; @@ -1289,7 +1302,7 @@ h4 > .notable-traits { .help-button { right: 30px; - font-family: "Fira Sans",sans-serif; + font-family: "Fira Sans", Arial, sans-serif; text-align: center; font-size: 17px; } @@ -1331,7 +1344,7 @@ h4 > .notable-traits { @media (min-width: 701px) { /* In case there is no documentation before a code block, we need to add some margin at the top to prevent an overlay between the "collapse toggle" and the information tooltip. - However, it's needed needed with smaller screen width because the doc/code block is always put + However, it's not needed with smaller screen width because the doc/code block is always put "one line" below. */ .information:first-child > .tooltip { margin-top: 16px; diff --git a/src/librustdoc/html/static/storage.js b/src/librustdoc/html/static/storage.js index 9c5ac1625a..b8b6fcbaf3 100644 --- a/src/librustdoc/html/static/storage.js +++ b/src/librustdoc/html/static/storage.js @@ -89,35 +89,20 @@ function hasOwnProperty(obj, property) { return Object.prototype.hasOwnProperty.call(obj, property); } -function usableLocalStorage() { - // Check if the browser supports localStorage at all: - if (typeof Storage === "undefined") { - return false; - } - // Check if we can access it; this access will fail if the browser - // preferences deny access to localStorage, e.g., to prevent storage of - // "cookies" (or cookie-likes, as is the case here). - try { - return window.localStorage !== null && window.localStorage !== undefined; - } catch(err) { - // Storage is supported, but browser preferences deny access to it. - return false; - } -} - function updateLocalStorage(name, value) { - if (usableLocalStorage()) { - localStorage[name] = value; - } else { - // No Web Storage support so we do nothing + try { + window.localStorage.setItem(name, value); + } catch(e) { + // localStorage is not accessible, do nothing } } function getCurrentValue(name) { - if (usableLocalStorage() && localStorage[name] !== undefined) { - return localStorage[name]; + try { + return window.localStorage.getItem(name); + } catch(e) { + return null; } - return null; } function switchTheme(styleElem, mainStyleElem, newTheme, saveTheme) { @@ -172,7 +157,7 @@ var updateSystemTheme = (function() { if (!window.matchMedia) { // fallback to the CSS computed value return function() { - let cssTheme = getComputedStyle(document.documentElement) + var cssTheme = getComputedStyle(document.documentElement) .getPropertyValue('content'); switchTheme( diff --git a/src/librustdoc/html/static/themes/ayu.css b/src/librustdoc/html/static/themes/ayu.css index fd8153519a..7374aee71f 100644 --- a/src/librustdoc/html/static/themes/ayu.css +++ b/src/librustdoc/html/static/themes/ayu.css @@ -266,7 +266,7 @@ a { .stab.portability > code { color: #e6e1cf; - background-color: transparent; + background: none; } #help > div { diff --git a/src/librustdoc/html/static/themes/dark.css b/src/librustdoc/html/static/themes/dark.css index 9eeccd038a..88ac3252bb 100644 --- a/src/librustdoc/html/static/themes/dark.css +++ b/src/librustdoc/html/static/themes/dark.css @@ -222,10 +222,7 @@ a.test-arrow { .stab.unstable { background: #FFF5D6; border-color: #FFC600; color: #2f2f2f; } .stab.deprecated { background: #F3DFFF; border-color: #7F0087; color: #2f2f2f; } .stab.portability { background: #C4ECFF; border-color: #7BA5DB; color: #2f2f2f; } - -.stab.portability > code { - color: #ddd; -} +.stab.portability > code { background: none; } #help > div { background: #4d4d4d; diff --git a/src/librustdoc/html/static/themes/light.css b/src/librustdoc/html/static/themes/light.css index 814043b35a..9bc21102aa 100644 --- a/src/librustdoc/html/static/themes/light.css +++ b/src/librustdoc/html/static/themes/light.css @@ -220,10 +220,7 @@ a.test-arrow { .stab.unstable { background: #FFF5D6; border-color: #FFC600; } .stab.deprecated { background: #F3DFFF; border-color: #7F0087; } .stab.portability { background: #C4ECFF; border-color: #7BA5DB; } - -.stab.portability > code { - color: #000; -} +.stab.portability > code { background: none; } #help > div { background: #e9e9e9; diff --git a/src/librustdoc/html/static_files.rs b/src/librustdoc/html/static_files.rs index 132ac42c42..701e106df6 100644 --- a/src/librustdoc/html/static_files.rs +++ b/src/librustdoc/html/static_files.rs @@ -76,9 +76,15 @@ crate mod fira_sans { /// The file `FiraSans-Regular.woff`, the Regular variant of the Fira Sans font. crate static REGULAR: &[u8] = include_bytes!("static/FiraSans-Regular.woff"); + /// The file `FiraSans-Regular.woff2`, the Regular variant of the Fira Sans font in woff2. + crate static REGULAR2: &[u8] = include_bytes!("static/FiraSans-Regular.woff2"); + /// The file `FiraSans-Medium.woff`, the Medium variant of the Fira Sans font. crate static MEDIUM: &[u8] = include_bytes!("static/FiraSans-Medium.woff"); + /// The file `FiraSans-Medium.woff2`, the Medium variant of the Fira Sans font in woff2. + crate static MEDIUM2: &[u8] = include_bytes!("static/FiraSans-Medium.woff2"); + /// The file `FiraSans-LICENSE.txt`, the license text for the Fira Sans font. crate static LICENSE: &[u8] = include_bytes!("static/FiraSans-LICENSE.txt"); } diff --git a/src/librustdoc/json/conversions.rs b/src/librustdoc/json/conversions.rs index 026d8f96de..063d8aab1e 100644 --- a/src/librustdoc/json/conversions.rs +++ b/src/librustdoc/json/conversions.rs @@ -2,50 +2,55 @@ //! the `clean` types but with some fields removed or stringified to simplify the output and not //! expose unstable compiler internals. +#![allow(rustc::default_hash_types)] + use std::convert::From; use rustc_ast::ast; use rustc_hir::def::CtorKind; +use rustc_middle::ty::TyCtxt; use rustc_span::def_id::{DefId, CRATE_DEF_INDEX}; +use rustc_span::symbol::Symbol; use rustc_span::Pos; use rustdoc_json_types::*; use crate::clean; +use crate::clean::utils::print_const_expr; use crate::formats::item_type::ItemType; use crate::json::JsonRenderer; +use std::collections::HashSet; impl JsonRenderer<'_> { pub(super) fn convert_item(&self, item: clean::Item) -> Option { - let item_type = ItemType::from(&item); let deprecation = item.deprecation(self.tcx); let clean::Item { source, name, attrs, kind, visibility, def_id } = item; - match *kind { - clean::StrippedItem(_) => None, - kind => Some(Item { - id: from_def_id(def_id), - crate_id: def_id.krate.as_u32(), - name: name.map(|sym| sym.to_string()), - source: self.convert_span(source), - visibility: self.convert_visibility(visibility), - docs: attrs.collapsed_doc_value(), - links: attrs - .links - .into_iter() - .filter_map(|clean::ItemLink { link, did, .. }| { - did.map(|did| (link, from_def_id(did))) - }) - .collect(), - attrs: attrs - .other_attrs - .iter() - .map(rustc_ast_pretty::pprust::attribute_to_string) - .collect(), - deprecation: deprecation.map(from_deprecation), - kind: item_type.into(), - inner: kind.into(), - }), - } + let inner = match *kind { + clean::StrippedItem(_) => return None, + x => from_clean_item_kind(x, self.tcx, &name), + }; + Some(Item { + id: from_def_id(def_id), + crate_id: def_id.krate.as_u32(), + name: name.map(|sym| sym.to_string()), + source: self.convert_span(source), + visibility: self.convert_visibility(visibility), + docs: attrs.collapsed_doc_value(), + links: attrs + .links + .into_iter() + .filter_map(|clean::ItemLink { link, did, .. }| { + did.map(|did| (link, from_def_id(did))) + }) + .collect(), + attrs: attrs + .other_attrs + .iter() + .map(rustc_ast_pretty::pprust::attribute_to_string) + .collect(), + deprecation: deprecation.map(from_deprecation), + inner, + }) } fn convert_span(&self, span: clean::Span) -> Option { @@ -144,45 +149,44 @@ crate fn from_def_id(did: DefId) -> Id { Id(format!("{}:{}", did.krate.as_u32(), u32::from(did.index))) } -impl From for ItemEnum { - fn from(item: clean::ItemKind) -> Self { - use clean::ItemKind::*; - match item { - ModuleItem(m) => ItemEnum::ModuleItem(m.into()), - ExternCrateItem(c, a) => { - ItemEnum::ExternCrateItem { name: c.to_string(), rename: a.map(|x| x.to_string()) } - } - ImportItem(i) => ItemEnum::ImportItem(i.into()), - StructItem(s) => ItemEnum::StructItem(s.into()), - UnionItem(u) => ItemEnum::UnionItem(u.into()), - StructFieldItem(f) => ItemEnum::StructFieldItem(f.into()), - EnumItem(e) => ItemEnum::EnumItem(e.into()), - VariantItem(v) => ItemEnum::VariantItem(v.into()), - FunctionItem(f) => ItemEnum::FunctionItem(f.into()), - ForeignFunctionItem(f) => ItemEnum::FunctionItem(f.into()), - TraitItem(t) => ItemEnum::TraitItem(t.into()), - TraitAliasItem(t) => ItemEnum::TraitAliasItem(t.into()), - MethodItem(m, _) => ItemEnum::MethodItem(from_function_method(m, true)), - TyMethodItem(m) => ItemEnum::MethodItem(from_function_method(m, false)), - ImplItem(i) => ItemEnum::ImplItem(i.into()), - StaticItem(s) => ItemEnum::StaticItem(s.into()), - ForeignStaticItem(s) => ItemEnum::StaticItem(s.into()), - ForeignTypeItem => ItemEnum::ForeignTypeItem, - TypedefItem(t, _) => ItemEnum::TypedefItem(t.into()), - OpaqueTyItem(t) => ItemEnum::OpaqueTyItem(t.into()), - ConstantItem(c) => ItemEnum::ConstantItem(c.into()), - MacroItem(m) => ItemEnum::MacroItem(m.source), - ProcMacroItem(m) => ItemEnum::ProcMacroItem(m.into()), - AssocConstItem(t, s) => ItemEnum::AssocConstItem { type_: t.into(), default: s }, - AssocTypeItem(g, t) => ItemEnum::AssocTypeItem { - bounds: g.into_iter().map(Into::into).collect(), - default: t.map(Into::into), - }, - StrippedItem(inner) => (*inner).into(), - PrimitiveItem(_) | KeywordItem(_) => { - panic!("{:?} is not supported for JSON output", item) - } +fn from_clean_item_kind(item: clean::ItemKind, tcx: TyCtxt<'_>, name: &Option) -> ItemEnum { + use clean::ItemKind::*; + match item { + ModuleItem(m) => ItemEnum::Module(m.into()), + ImportItem(i) => ItemEnum::Import(i.into()), + StructItem(s) => ItemEnum::Struct(s.into()), + UnionItem(u) => ItemEnum::Union(u.into()), + StructFieldItem(f) => ItemEnum::StructField(f.into()), + EnumItem(e) => ItemEnum::Enum(e.into()), + VariantItem(v) => ItemEnum::Variant(v.into()), + FunctionItem(f) => ItemEnum::Function(f.into()), + ForeignFunctionItem(f) => ItemEnum::Function(f.into()), + TraitItem(t) => ItemEnum::Trait(t.into()), + TraitAliasItem(t) => ItemEnum::TraitAlias(t.into()), + MethodItem(m, _) => ItemEnum::Method(from_function_method(m, true)), + TyMethodItem(m) => ItemEnum::Method(from_function_method(m, false)), + ImplItem(i) => ItemEnum::Impl(i.into()), + StaticItem(s) => ItemEnum::Static(from_clean_static(s, tcx)), + ForeignStaticItem(s) => ItemEnum::Static(from_clean_static(s, tcx)), + ForeignTypeItem => ItemEnum::ForeignType, + TypedefItem(t, _) => ItemEnum::Typedef(t.into()), + OpaqueTyItem(t) => ItemEnum::OpaqueTy(t.into()), + ConstantItem(c) => ItemEnum::Constant(c.into()), + MacroItem(m) => ItemEnum::Macro(m.source), + ProcMacroItem(m) => ItemEnum::ProcMacro(m.into()), + AssocConstItem(t, s) => ItemEnum::AssocConst { type_: t.into(), default: s }, + AssocTypeItem(g, t) => ItemEnum::AssocType { + bounds: g.into_iter().map(Into::into).collect(), + default: t.map(Into::into), + }, + StrippedItem(inner) => from_clean_item_kind(*inner, tcx, name), + PrimitiveItem(_) | KeywordItem(_) => { + panic!("{:?} is not supported for JSON output", item) } + ExternCrateItem { ref src } => ItemEnum::ExternCrate { + name: name.as_ref().unwrap().to_string(), + rename: src.map(|x| x.to_string()), + }, } } @@ -225,24 +229,31 @@ crate fn from_ctor_kind(struct_type: CtorKind) -> StructType { } } -fn stringify_header(header: &rustc_hir::FnHeader) -> String { - let mut s = String::from(header.unsafety.prefix_str()); - if header.asyncness == rustc_hir::IsAsync::Async { - s.push_str("async ") +crate fn from_fn_header(header: &rustc_hir::FnHeader) -> HashSet { + let mut v = HashSet::new(); + + if let rustc_hir::Unsafety::Unsafe = header.unsafety { + v.insert(Qualifiers::Unsafe); + } + + if let rustc_hir::IsAsync::Async = header.asyncness { + v.insert(Qualifiers::Async); } - if header.constness == rustc_hir::Constness::Const { - s.push_str("const ") + + if let rustc_hir::Constness::Const = header.constness { + v.insert(Qualifiers::Const); } - s + + v } impl From for Function { fn from(function: clean::Function) -> Self { - let clean::Function { decl, generics, header, all_types: _, ret_types: _ } = function; + let clean::Function { decl, generics, header } = function; Function { decl: decl.into(), generics: generics.into(), - header: stringify_header(&header), + header: from_fn_header(&header), abi: header.abi.to_string(), } } @@ -364,7 +375,13 @@ impl From for FunctionPointer { fn from(bare_decl: clean::BareFunctionDecl) -> Self { let clean::BareFunctionDecl { unsafety, generic_params, decl, abi } = bare_decl; FunctionPointer { - is_unsafe: unsafety == rustc_hir::Unsafety::Unsafe, + header: if let rustc_hir::Unsafety::Unsafe = unsafety { + let mut hs = HashSet::new(); + hs.insert(Qualifiers::Unsafe); + hs + } else { + HashSet::new() + }, generic_params: generic_params.into_iter().map(Into::into).collect(), decl: decl.into(), abi: abi.to_string(), @@ -392,7 +409,7 @@ impl From for FnDecl { impl From for Trait { fn from(trait_: clean::Trait) -> Self { - let clean::Trait { unsafety, items, generics, bounds, is_spotlight: _, is_auto } = trait_; + let clean::Trait { unsafety, items, generics, bounds, is_auto } = trait_; Trait { is_auto, is_unsafe: unsafety == rustc_hir::Unsafety::Unsafe, @@ -435,11 +452,12 @@ impl From for Impl { } crate fn from_function_method(function: clean::Function, has_body: bool) -> Method { - let clean::Function { header, decl, generics, all_types: _, ret_types: _ } = function; + let clean::Function { header, decl, generics } = function; Method { decl: decl.into(), generics: generics.into(), - header: stringify_header(&header), + header: from_fn_header(&header), + abi: header.abi.to_string(), has_body, } } @@ -534,13 +552,11 @@ impl From for OpaqueTy { } } -impl From for Static { - fn from(stat: clean::Static) -> Self { - Static { - type_: stat.type_.into(), - mutable: stat.mutability == ast::Mutability::Mut, - expr: stat.expr, - } +fn from_clean_static(stat: clean::Static, tcx: TyCtxt<'_>) -> Static { + Static { + type_: stat.type_.into(), + mutable: stat.mutability == ast::Mutability::Mut, + expr: stat.expr.map(|e| print_const_expr(tcx, e)).unwrap_or_default(), } } diff --git a/src/librustdoc/json/mod.rs b/src/librustdoc/json/mod.rs index 876b1b56de..b762fd7e18 100644 --- a/src/librustdoc/json/mod.rs +++ b/src/librustdoc/json/mod.rs @@ -19,7 +19,7 @@ use rustc_span::edition::Edition; use rustdoc_json_types as types; use crate::clean; -use crate::config::{RenderInfo, RenderOptions}; +use crate::config::RenderOptions; use crate::error::Error; use crate::formats::cache::Cache; use crate::formats::FormatRenderer; @@ -37,8 +37,8 @@ crate struct JsonRenderer<'tcx> { cache: Rc, } -impl JsonRenderer<'_> { - fn sess(&self) -> &Session { +impl JsonRenderer<'tcx> { + fn sess(&self) -> &'tcx Session { self.tcx.sess } @@ -87,6 +87,7 @@ impl JsonRenderer<'_> { .filter_map(|(&id, trait_item)| { // only need to synthesize items for external traits if !id.is_local() { + let trait_item = &trait_item.trait_; trait_item.items.clone().into_iter().for_each(|i| self.item(i).unwrap()); Some(( from_def_id(id), @@ -107,8 +108,7 @@ impl JsonRenderer<'_> { .last() .map(Clone::clone), visibility: types::Visibility::Public, - kind: types::ItemKind::Trait, - inner: types::ItemEnum::TraitItem(trait_item.clone().into()), + inner: types::ItemEnum::Trait(trait_item.clone().into()), source: None, docs: Default::default(), links: Default::default(), @@ -132,7 +132,6 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> { fn init( krate: clean::Crate, options: RenderOptions, - _render_info: RenderInfo, _edition: Edition, cache: Cache, tcx: TyCtxt<'tcx>, @@ -149,6 +148,10 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> { )) } + fn make_child_renderer(&self) -> Self { + self.clone() + } + /// Inserts an item into the index. This should be used rather than directly calling insert on /// the hashmap because certain items (traits and types) need to have their mappings for trait /// implementations filled out before they're inserted. @@ -158,11 +161,11 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> { let id = item.def_id; if let Some(mut new_item) = self.convert_item(item) { - if let types::ItemEnum::TraitItem(ref mut t) = new_item.inner { + if let types::ItemEnum::Trait(ref mut t) = new_item.inner { t.implementors = self.get_trait_implementors(id) - } else if let types::ItemEnum::StructItem(ref mut s) = new_item.inner { + } else if let types::ItemEnum::Struct(ref mut s) = new_item.inner { s.impls = self.get_impls(id) - } else if let types::ItemEnum::EnumItem(ref mut e) = new_item.inner { + } else if let types::ItemEnum::Enum(ref mut e) = new_item.inner { e.impls = self.get_impls(id) } let removed = self.index.borrow_mut().insert(from_def_id(id), new_item.clone()); @@ -183,7 +186,7 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> { match &*item.kind { // These don't have names so they don't get added to the output by default ImportItem(_) => self.item(item.clone()).unwrap(), - ExternCrateItem(_, _) => self.item(item.clone()).unwrap(), + ExternCrateItem { .. } => self.item(item.clone()).unwrap(), ImplItem(i) => i.items.iter().for_each(|i| self.item(i.clone()).unwrap()), _ => {} } @@ -199,7 +202,7 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> { fn after_krate( &mut self, - krate: &clean::Crate, + _krate: &clean::Crate, _diag: &rustc_errors::Handler, ) -> Result<(), Error> { debug!("Done with crate"); @@ -210,7 +213,7 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> { #[allow(rustc::default_hash_types)] let output = types::Crate { root: types::Id(String::from("0:0")), - crate_version: krate.version.clone(), + crate_version: self.cache.crate_version.clone(), includes_private: self.cache.document_private, index: index.into_iter().collect(), paths: self @@ -243,7 +246,7 @@ impl<'tcx> FormatRenderer<'tcx> for JsonRenderer<'tcx> { ) }) .collect(), - format_version: 3, + format_version: 4, }; let mut p = self.out_path.clone(); p.push(output.index.get(&output.root).unwrap().name.clone().unwrap()); diff --git a/src/librustdoc/lib.rs b/src/librustdoc/lib.rs index 18bc275572..9e84324544 100644 --- a/src/librustdoc/lib.rs +++ b/src/librustdoc/lib.rs @@ -14,7 +14,6 @@ #![feature(never_type)] #![feature(once_cell)] #![feature(type_ascription)] -#![feature(str_split_once)] #![feature(iter_intersperse)] #![recursion_limit = "256"] #![deny(rustc::internal)] @@ -46,10 +45,12 @@ extern crate rustc_infer; extern crate rustc_interface; extern crate rustc_lexer; extern crate rustc_lint; +extern crate rustc_lint_defs; extern crate rustc_metadata; extern crate rustc_middle; extern crate rustc_mir; extern crate rustc_parse; +extern crate rustc_passes; extern crate rustc_resolve; extern crate rustc_session; extern crate rustc_span as rustc_span; @@ -70,6 +71,24 @@ use rustc_session::config::{make_crate_type_option, ErrorOutputType, RustcOptGro use rustc_session::getopts; use rustc_session::{early_error, early_warn}; +/// A macro to create a FxHashMap. +/// +/// Example: +/// +/// ``` +/// let letters = map!{"a" => "b", "c" => "d"}; +/// ``` +/// +/// Trailing commas are allowed. +/// Commas between elements are required (even if the expression is a block). +macro_rules! map { + ($( $key: expr => $val: expr ),* $(,)*) => {{ + let mut map = ::rustc_data_structures::fx::FxHashMap::default(); + $( map.insert($key, $val); )* + map + }} +} + #[macro_use] mod externalfiles; @@ -86,6 +105,7 @@ mod formats; // used by the error-index generator, so it needs to be public pub mod html; mod json; +crate mod lint; mod markdown; mod passes; mod theme; @@ -95,7 +115,19 @@ mod visit_lib; pub fn main() { rustc_driver::set_sigpipe_handler(); rustc_driver::install_ice_hook(); + + // When using CI artifacts (with `download_stage1 = true`), tracing is unconditionally built + // with `--features=static_max_level_info`, which disables almost all rustdoc logging. To avoid + // this, compile our own version of `tracing` that logs all levels. + // NOTE: this compiles both versions of tracing unconditionally, because + // - The compile time hit is not that bad, especially compared to rustdoc's incremental times, and + // - Otherwise, there's no warning that logging is being ignored when `download_stage1 = true`. + // NOTE: The reason this doesn't show double logging when `download_stage1 = false` and + // `debug_logging = true` is because all rustc logging goes to its version of tracing (the one + // in the sysroot), and all of rustdoc's logging goes to its version (the one in Cargo.toml). + init_logging(); rustc_driver::init_env_logger("RUSTDOC_LOG"); + let exit_code = rustc_driver::catch_with_exit_code(|| match get_args() { Some(args) => main_args(&args), _ => Err(ErrorReported), @@ -103,6 +135,68 @@ pub fn main() { process::exit(exit_code); } +fn init_logging() { + use std::io; + + // FIXME remove these and use winapi 0.3 instead + // Duplicates: bootstrap/compile.rs, librustc_errors/emitter.rs, rustc_driver/lib.rs + #[cfg(unix)] + fn stdout_isatty() -> bool { + extern crate libc; + unsafe { libc::isatty(libc::STDOUT_FILENO) != 0 } + } + + #[cfg(windows)] + fn stdout_isatty() -> bool { + extern crate winapi; + use winapi::um::consoleapi::GetConsoleMode; + use winapi::um::processenv::GetStdHandle; + use winapi::um::winbase::STD_OUTPUT_HANDLE; + + unsafe { + let handle = GetStdHandle(STD_OUTPUT_HANDLE); + let mut out = 0; + GetConsoleMode(handle, &mut out) != 0 + } + } + + let color_logs = match std::env::var("RUSTDOC_LOG_COLOR") { + Ok(value) => match value.as_ref() { + "always" => true, + "never" => false, + "auto" => stdout_isatty(), + _ => early_error( + ErrorOutputType::default(), + &format!( + "invalid log color value '{}': expected one of always, never, or auto", + value + ), + ), + }, + Err(std::env::VarError::NotPresent) => stdout_isatty(), + Err(std::env::VarError::NotUnicode(_value)) => early_error( + ErrorOutputType::default(), + "non-Unicode log color value: expected one of always, never, or auto", + ), + }; + let filter = tracing_subscriber::EnvFilter::from_env("RUSTDOC_LOG"); + let layer = tracing_tree::HierarchicalLayer::default() + .with_writer(io::stderr) + .with_indent_lines(true) + .with_ansi(color_logs) + .with_targets(true) + .with_wraparound(10) + .with_verbose_exit(true) + .with_verbose_entry(true) + .with_indent_amount(2); + #[cfg(parallel_compiler)] + let layer = layer.with_thread_ids(true).with_thread_names(true); + + use tracing_subscriber::layer::SubscriberExt; + let subscriber = tracing_subscriber::Registry::default().with(filter).with(layer); + tracing::subscriber::set_global_default(subscriber).unwrap(); +} + fn get_args() -> Option> { env::args_os() .enumerate() @@ -423,6 +517,16 @@ fn opts() -> Vec { o.optopt("", "test-builder", "The rustc-like binary to use as the test builder", "PATH") }), unstable("check", |o| o.optflag("", "check", "Run rustdoc checks")), + unstable("generate-redirect-map", |o| { + o.optflag( + "", + "generate-redirect-map", + "Generate JSON file at the top level instead of generating HTML redirection files", + ) + }), + unstable("print", |o| { + o.optmulti("", "print", "Rustdoc information to print on stdout", "[unversioned-files]") + }), ] } @@ -432,13 +536,16 @@ fn usage(argv0: &str) { (option.apply)(&mut options); } println!("{}", options.usage(&format!("{} [options] ", argv0))); + println!(" @path Read newline separated options from `path`\n"); println!("More information available at https://doc.rust-lang.org/rustdoc/what-is-rustdoc.html") } /// A result type used by several functions under `main()`. type MainResult = Result<(), ErrorReported>; -fn main_args(args: &[String]) -> MainResult { +fn main_args(at_args: &[String]) -> MainResult { + let args = rustc_driver::args::arg_expand_all(at_args); + let mut options = getopts::Options::new(); for option in opts() { (option.apply)(&mut options); @@ -477,12 +584,12 @@ fn wrap_return(diag: &rustc_errors::Handler, res: Result<(), String>) -> MainRes fn run_renderer<'tcx, T: formats::FormatRenderer<'tcx>>( krate: clean::Crate, renderopts: config::RenderOptions, - render_info: config::RenderInfo, + cache: formats::cache::Cache, diag: &rustc_errors::Handler, edition: rustc_span::edition::Edition, tcx: TyCtxt<'tcx>, ) -> MainResult { - match formats::run_format::(krate, renderopts, render_info, &diag, edition, tcx) { + match formats::run_format::(krate, renderopts, cache, &diag, edition, tcx) { Ok(_) => Ok(()), Err(e) => { let mut msg = diag.struct_err(&format!("couldn't generate documentation: {}", e.error)); @@ -551,7 +658,7 @@ fn main_options(options: config::Options) -> MainResult { let mut global_ctxt = abort_on_err(queries.global_ctxt(), sess).peek_mut(); global_ctxt.enter(|tcx| { - let (mut krate, render_info, render_opts) = sess.time("run_global_ctxt", || { + let (krate, render_opts, mut cache) = sess.time("run_global_ctxt", || { core::run_global_ctxt( tcx, resolver, @@ -563,7 +670,7 @@ fn main_options(options: config::Options) -> MainResult { }); info!("finished with rustc"); - krate.version = crate_version; + cache.crate_version = crate_version; if show_coverage { // if we ran coverage, bail early, we don't need to also generate docs at this point @@ -582,7 +689,7 @@ fn main_options(options: config::Options) -> MainResult { run_renderer::>( krate, render_opts, - render_info, + cache, &diag, edition, tcx, @@ -592,7 +699,7 @@ fn main_options(options: config::Options) -> MainResult { run_renderer::>( krate, render_opts, - render_info, + cache, &diag, edition, tcx, diff --git a/src/librustdoc/lint.rs b/src/librustdoc/lint.rs new file mode 100644 index 0000000000..ffa2f7a47f --- /dev/null +++ b/src/librustdoc/lint.rs @@ -0,0 +1,188 @@ +use rustc_data_structures::fx::FxHashMap; +use rustc_lint::LintStore; +use rustc_lint_defs::{declare_tool_lint, Lint, LintId}; +use rustc_session::{lint, Session}; + +use std::lazy::SyncLazy as Lazy; + +/// This function is used to setup the lint initialization. By default, in rustdoc, everything +/// is "allowed". Depending if we run in test mode or not, we want some of them to be at their +/// default level. For example, the "INVALID_CODEBLOCK_ATTRIBUTES" lint is activated in both +/// modes. +/// +/// A little detail easy to forget is that there is a way to set the lint level for all lints +/// through the "WARNINGS" lint. To prevent this to happen, we set it back to its "normal" level +/// inside this function. +/// +/// It returns a tuple containing: +/// * Vector of tuples of lints' name and their associated "max" level +/// * HashMap of lint id with their associated "max" level +pub(crate) fn init_lints( + mut allowed_lints: Vec, + lint_opts: Vec<(String, lint::Level)>, + filter_call: F, +) -> (Vec<(String, lint::Level)>, FxHashMap) +where + F: Fn(&lint::Lint) -> Option<(String, lint::Level)>, +{ + let warnings_lint_name = lint::builtin::WARNINGS.name; + + allowed_lints.push(warnings_lint_name.to_owned()); + allowed_lints.extend(lint_opts.iter().map(|(lint, _)| lint).cloned()); + + let lints = || { + lint::builtin::HardwiredLints::get_lints() + .into_iter() + .chain(rustc_lint::SoftLints::get_lints().into_iter()) + }; + + let lint_opts = lints() + .filter_map(|lint| { + // Permit feature-gated lints to avoid feature errors when trying to + // allow all lints. + if lint.feature_gate.is_some() || allowed_lints.iter().any(|l| lint.name == l) { + None + } else { + filter_call(lint) + } + }) + .chain(lint_opts.into_iter()) + .collect::>(); + + let lint_caps = lints() + .filter_map(|lint| { + // We don't want to allow *all* lints so let's ignore + // those ones. + if allowed_lints.iter().any(|l| lint.name == l) { + None + } else { + Some((lint::LintId::of(lint), lint::Allow)) + } + }) + .collect(); + (lint_opts, lint_caps) +} + +macro_rules! declare_rustdoc_lint { + ($(#[$attr:meta])* $name: ident, $level: ident, $descr: literal $(,)?) => { + declare_tool_lint! { + $(#[$attr])* pub rustdoc::$name, $level, $descr + } + } +} + +declare_rustdoc_lint! { + /// The `broken_intra_doc_links` lint detects failures in resolving + /// intra-doc link targets. This is a `rustdoc` only lint, see the + /// documentation in the [rustdoc book]. + /// + /// [rustdoc book]: ../../../rustdoc/lints.html#broken_intra_doc_links + BROKEN_INTRA_DOC_LINKS, + Warn, + "failures in resolving intra-doc link targets" +} + +declare_rustdoc_lint! { + /// This is a subset of `broken_intra_doc_links` that warns when linking from + /// a public item to a private one. This is a `rustdoc` only lint, see the + /// documentation in the [rustdoc book]. + /// + /// [rustdoc book]: ../../../rustdoc/lints.html#private_intra_doc_links + PRIVATE_INTRA_DOC_LINKS, + Warn, + "linking from a public item to a private one" +} + +declare_rustdoc_lint! { + /// The `invalid_codeblock_attributes` lint detects code block attributes + /// in documentation examples that have potentially mis-typed values. This + /// is a `rustdoc` only lint, see the documentation in the [rustdoc book]. + /// + /// [rustdoc book]: ../../../rustdoc/lints.html#invalid_codeblock_attributes + INVALID_CODEBLOCK_ATTRIBUTES, + Warn, + "codeblock attribute looks a lot like a known one" +} + +declare_rustdoc_lint! { + /// The `missing_crate_level_docs` lint detects if documentation is + /// missing at the crate root. This is a `rustdoc` only lint, see the + /// documentation in the [rustdoc book]. + /// + /// [rustdoc book]: ../../../rustdoc/lints.html#missing_crate_level_docs + MISSING_CRATE_LEVEL_DOCS, + Allow, + "detects crates with no crate-level documentation" +} + +declare_rustdoc_lint! { + /// The `missing_doc_code_examples` lint detects publicly-exported items + /// without code samples in their documentation. This is a `rustdoc` only + /// lint, see the documentation in the [rustdoc book]. + /// + /// [rustdoc book]: ../../../rustdoc/lints.html#missing_doc_code_examples + MISSING_DOC_CODE_EXAMPLES, + Allow, + "detects publicly-exported items without code samples in their documentation" +} + +declare_rustdoc_lint! { + /// The `private_doc_tests` lint detects code samples in docs of private + /// items not documented by `rustdoc`. This is a `rustdoc` only lint, see + /// the documentation in the [rustdoc book]. + /// + /// [rustdoc book]: ../../../rustdoc/lints.html#private_doc_tests + PRIVATE_DOC_TESTS, + Allow, + "detects code samples in docs of private items not documented by rustdoc" +} + +declare_rustdoc_lint! { + /// The `invalid_html_tags` lint detects invalid HTML tags. This is a + /// `rustdoc` only lint, see the documentation in the [rustdoc book]. + /// + /// [rustdoc book]: ../../../rustdoc/lints.html#invalid_html_tags + INVALID_HTML_TAGS, + Allow, + "detects invalid HTML tags in doc comments" +} + +declare_rustdoc_lint! { + /// The `non_autolinks` lint detects when a URL could be written using + /// only angle brackets. This is a `rustdoc` only lint, see the + /// documentation in the [rustdoc book]. + /// + /// [rustdoc book]: ../../../rustdoc/lints.html#non_autolinks + NON_AUTOLINKS, + Warn, + "detects URLs that could be written using only angle brackets" +} + +crate static RUSTDOC_LINTS: Lazy> = Lazy::new(|| { + vec![ + BROKEN_INTRA_DOC_LINKS, + PRIVATE_INTRA_DOC_LINKS, + MISSING_DOC_CODE_EXAMPLES, + PRIVATE_DOC_TESTS, + INVALID_CODEBLOCK_ATTRIBUTES, + INVALID_HTML_TAGS, + NON_AUTOLINKS, + MISSING_CRATE_LEVEL_DOCS, + ] +}); + +crate fn register_lints(_sess: &Session, lint_store: &mut LintStore) { + lint_store.register_lints(&**RUSTDOC_LINTS); + lint_store.register_group( + true, + "rustdoc::all", + Some("rustdoc"), + RUSTDOC_LINTS.iter().map(|&lint| LintId::of(lint)).collect(), + ); + for lint in &*RUSTDOC_LINTS { + let name = lint.name_lower(); + lint_store.register_alias(&name.replace("rustdoc::", ""), &name); + } + lint_store + .register_renamed("intra_doc_link_resolution_failure", "rustdoc::broken_intra_doc_links"); +} diff --git a/src/librustdoc/passes/calculate_doc_coverage.rs b/src/librustdoc/passes/calculate_doc_coverage.rs index cdbff62d06..0e97512862 100644 --- a/src/librustdoc/passes/calculate_doc_coverage.rs +++ b/src/librustdoc/passes/calculate_doc_coverage.rs @@ -20,8 +20,8 @@ crate const CALCULATE_DOC_COVERAGE: Pass = Pass { description: "counts the number of items with and without documentation", }; -fn calculate_doc_coverage(krate: clean::Crate, ctx: &DocContext<'_>) -> clean::Crate { - let mut calc = CoverageCalculator::new(ctx); +fn calculate_doc_coverage(krate: clean::Crate, ctx: &mut DocContext<'_>) -> clean::Crate { + let mut calc = CoverageCalculator { items: Default::default(), ctx }; let krate = calc.fold_crate(krate); calc.print_results(); @@ -101,7 +101,7 @@ impl ops::AddAssign for ItemCount { struct CoverageCalculator<'a, 'b> { items: BTreeMap, - ctx: &'a DocContext<'b>, + ctx: &'a mut DocContext<'b>, } fn limit_filename_len(filename: String) -> String { @@ -115,10 +115,6 @@ fn limit_filename_len(filename: String) -> String { } impl<'a, 'b> CoverageCalculator<'a, 'b> { - fn new(ctx: &'a DocContext<'b>) -> CoverageCalculator<'a, 'b> { - CoverageCalculator { items: Default::default(), ctx } - } - fn to_json(&self) -> String { serde_json::to_string( &self @@ -131,7 +127,7 @@ impl<'a, 'b> CoverageCalculator<'a, 'b> { } fn print_results(&self) { - let output_format = self.ctx.renderinfo.borrow().output_format; + let output_format = self.ctx.output_format; if output_format.is_json() { println!("{}", self.to_json()); return; @@ -197,7 +193,7 @@ impl<'a, 'b> fold::DocFolder for CoverageCalculator<'a, 'b> { // don't count items in stripped modules return Some(i); } - clean::ImportItem(..) | clean::ExternCrateItem(..) => { + clean::ImportItem(..) | clean::ExternCrateItem { .. } => { // docs on `use` and `extern crate` statements are not displayed, so they're not // worth counting return Some(i); diff --git a/src/librustdoc/passes/check_code_block_syntax.rs b/src/librustdoc/passes/check_code_block_syntax.rs index 9516130034..98886139f3 100644 --- a/src/librustdoc/passes/check_code_block_syntax.rs +++ b/src/librustdoc/passes/check_code_block_syntax.rs @@ -17,7 +17,7 @@ crate const CHECK_CODE_BLOCK_SYNTAX: Pass = Pass { description: "validates syntax inside Rust code blocks", }; -crate fn check_code_block_syntax(krate: clean::Crate, cx: &DocContext<'_>) -> clean::Crate { +crate fn check_code_block_syntax(krate: clean::Crate, cx: &mut DocContext<'_>) -> clean::Crate { SyntaxChecker { cx }.fold_crate(krate) } @@ -48,9 +48,12 @@ impl<'a, 'tcx> SyntaxChecker<'a, 'tcx> { let buffer = buffer.borrow(); if buffer.has_errors || is_empty { - let mut diag = if let Some(sp) = - super::source_span_for_markdown_range(self.cx, &dox, &code_block.range, &item.attrs) - { + let mut diag = if let Some(sp) = super::source_span_for_markdown_range( + self.cx.tcx, + &dox, + &code_block.range, + &item.attrs, + ) { let (warning_message, suggest_using_text) = if buffer.has_errors { ("could not parse code block as Rust code", true) } else { diff --git a/src/librustdoc/passes/collect_intra_doc_links.rs b/src/librustdoc/passes/collect_intra_doc_links.rs index f0c254ede6..ec5994b762 100644 --- a/src/librustdoc/passes/collect_intra_doc_links.rs +++ b/src/librustdoc/passes/collect_intra_doc_links.rs @@ -16,10 +16,7 @@ use rustc_hir::def_id::{CrateNum, DefId}; use rustc_middle::ty::TyCtxt; use rustc_middle::{bug, ty}; use rustc_resolve::ParentScope; -use rustc_session::lint::{ - builtin::{BROKEN_INTRA_DOC_LINKS, PRIVATE_INTRA_DOC_LINKS}, - Lint, -}; +use rustc_session::lint::Lint; use rustc_span::hygiene::{MacroKind, SyntaxContext}; use rustc_span::symbol::{sym, Ident, Symbol}; use rustc_span::DUMMY_SP; @@ -37,6 +34,7 @@ use crate::clean::{self, utils::find_nearest_parent_module, Crate, Item, ItemLin use crate::core::DocContext; use crate::fold::DocFolder; use crate::html::markdown::{markdown_links, MarkdownLink}; +use crate::lint::{BROKEN_INTRA_DOC_LINKS, PRIVATE_INTRA_DOC_LINKS}; use crate::passes::Pass; use super::span_of_attrs; @@ -47,8 +45,14 @@ crate const COLLECT_INTRA_DOC_LINKS: Pass = Pass { description: "resolves intra-doc links", }; -crate fn collect_intra_doc_links(krate: Crate, cx: &DocContext<'_>) -> Crate { - LinkCollector::new(cx).fold_crate(krate) +crate fn collect_intra_doc_links(krate: Crate, cx: &mut DocContext<'_>) -> Crate { + LinkCollector { + cx, + mod_ids: Vec::new(), + kind_side_channel: Cell::new(None), + visited_links: FxHashMap::default(), + } + .fold_crate(krate) } /// Top-level errors emitted by this pass. @@ -128,15 +132,20 @@ impl TryFrom for Res { } } -#[derive(Debug)] /// A link failed to resolve. +#[derive(Debug)] enum ResolutionFailure<'a> { /// This resolved, but with the wrong namespace. - /// - /// `Namespace` is the namespace specified with a disambiguator - /// (as opposed to the actual namespace of the `Res`). - WrongNamespace(Res, /* disambiguated */ Namespace), - /// The link failed to resolve. `resolution_failure` should look to see if there's + WrongNamespace { + /// What the link resolved to. + res: Res, + /// The expected namespace for the resolution, determined from the link's disambiguator. + /// + /// E.g., for `[fn@Result]` this is [`Namespace::ValueNS`], + /// even though `Result`'s actual namespace is [`Namespace::TypeNS`]. + expected_ns: Namespace, + }, + /// The link failed to resolve. [`resolution_failure`] should look to see if there's /// a more helpful error that can be given. NotResolved { /// The scope the link was resolved in. @@ -151,12 +160,11 @@ enum ResolutionFailure<'a> { unresolved: Cow<'a, str>, }, /// This happens when rustdoc can't determine the parent scope for an item. - /// /// It is always a bug in rustdoc. NoParentItem, /// This link has malformed generic parameters; e.g., the angle brackets are unbalanced. MalformedGenerics(MalformedGenerics), - /// Used to communicate that this should be ignored, but shouldn't be reported to the user + /// Used to communicate that this should be ignored, but shouldn't be reported to the user. /// /// This happens when there is no disambiguator and one of the namespaces /// failed to resolve. @@ -210,7 +218,7 @@ impl ResolutionFailure<'a> { /// Returns the full resolution of the link, if present. fn full_res(&self) -> Option { match self { - Self::WrongNamespace(res, _) => Some(*res), + Self::WrongNamespace { res, expected_ns: _ } => Some(*res), _ => None, } } @@ -257,7 +265,7 @@ struct CachedLink { } struct LinkCollector<'a, 'tcx> { - cx: &'a DocContext<'tcx>, + cx: &'a mut DocContext<'tcx>, /// A stack of modules used to decide what scope to resolve in. /// /// The last module will be used if the parent scope of the current item is @@ -273,15 +281,6 @@ struct LinkCollector<'a, 'tcx> { } impl<'a, 'tcx> LinkCollector<'a, 'tcx> { - fn new(cx: &'a DocContext<'tcx>) -> Self { - LinkCollector { - cx, - mod_ids: Vec::new(), - kind_side_channel: Cell::new(None), - visited_links: FxHashMap::default(), - } - } - /// Given a full link, parse it as an [enum struct variant]. /// /// In particular, this will return an error whenever there aren't three @@ -293,7 +292,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { path_str: &'path str, module_id: DefId, ) -> Result<(Res, Option), ErrorKind<'path>> { - let cx = self.cx; + let tcx = self.cx.tcx; let no_res = || ResolutionFailure::NotResolved { module_id, partial_res: None, @@ -317,7 +316,8 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { // If there's no third component, we saw `[a::b]` before and it failed to resolve. // So there's no partial res. .ok_or_else(no_res)?; - let ty_res = cx + let ty_res = self + .cx .enter_resolver(|resolver| { resolver.resolve_str_path_error(DUMMY_SP, &path, TypeNS, module_id) }) @@ -326,18 +326,17 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { match ty_res { Res::Def(DefKind::Enum, did) => { - if cx - .tcx + if tcx .inherent_impls(did) .iter() - .flat_map(|imp| cx.tcx.associated_items(*imp).in_definition_order()) + .flat_map(|imp| tcx.associated_items(*imp).in_definition_order()) .any(|item| item.ident.name == variant_name) { // This is just to let `fold_item` know that this shouldn't be considered; // it's a bug for the error to make it to the user return Err(ResolutionFailure::Dummy.into()); } - match cx.tcx.type_of(did).kind() { + match tcx.type_of(did).kind() { ty::Adt(def, _) if def.is_enum() => { if def.all_fields().any(|item| item.ident.name == variant_field_name) { Ok(( @@ -380,20 +379,14 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { item_name: Symbol, item_str: &'path str, ) -> Result<(Res, Option), ErrorKind<'path>> { - let cx = self.cx; + let tcx = self.cx.tcx; prim_ty - .impls(cx.tcx) + .impls(tcx) .into_iter() .find_map(|&impl_| { - cx.tcx - .associated_items(impl_) - .find_by_name_and_namespace( - cx.tcx, - Ident::with_dummy_span(item_name), - ns, - impl_, - ) + tcx.associated_items(impl_) + .find_by_name_and_namespace(tcx, Ident::with_dummy_span(item_name), ns, impl_) .map(|item| { let kind = item.kind; self.kind_side_channel.set(Some((kind.as_def_kind(), item.def_id))); @@ -434,9 +427,8 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { path_str: &'a str, module_id: DefId, ) -> Result> { - let cx = self.cx; let path = ast::Path::from_ident(Ident::from_str(path_str)); - cx.enter_resolver(|resolver| { + self.cx.enter_resolver(|resolver| { // FIXME(jynelson): does this really need 3 separate lookups? if let Ok((Some(ext), res)) = resolver.resolve_macro_path( &path, @@ -492,13 +484,13 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { /// Resolves a string as a path within a particular namespace. Returns an /// optional URL fragment in the case of variants and methods. fn resolve<'path>( - &self, + &mut self, path_str: &'path str, ns: Namespace, module_id: DefId, extra_fragment: &Option, ) -> Result<(Res, Option), ErrorKind<'path>> { - let cx = self.cx; + let tcx = self.cx.tcx; if let Some(res) = self.resolve_path(path_str, ns, module_id) { match res { @@ -506,7 +498,9 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { // item a separate function. Res::Def(DefKind::AssocFn | DefKind::AssocConst, _) => assert_eq!(ns, ValueNS), Res::Def(DefKind::AssocTy, _) => assert_eq!(ns, TypeNS), - Res::Def(DefKind::Variant, _) => return handle_variant(cx, res, extra_fragment), + Res::Def(DefKind::Variant, _) => { + return handle_variant(self.cx, res, extra_fragment); + } // Not a trait item; just return what we found. Res::Primitive(ty) => { if extra_fragment.is_some() { @@ -573,13 +567,12 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { ) => { debug!("looking for associated item named {} for item {:?}", item_name, did); // Checks if item_name belongs to `impl SomeItem` - let assoc_item = cx - .tcx + let assoc_item = tcx .inherent_impls(did) .iter() .flat_map(|&imp| { - cx.tcx.associated_items(imp).find_by_name_and_namespace( - cx.tcx, + tcx.associated_items(imp).find_by_name_and_namespace( + tcx, Ident::with_dummy_span(item_name), ns, imp, @@ -595,7 +588,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { // something like [`ambi_fn`](::ambi_fn) .or_else(|| { let kind = - resolve_associated_trait_item(did, module_id, item_name, ns, &self.cx); + resolve_associated_trait_item(did, module_id, item_name, ns, self.cx); debug!("got associated item kind {:?}", kind); kind }); @@ -619,7 +612,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { debug!("looking for variants or fields named {} for {:?}", item_name, did); // FIXME(jynelson): why is this different from // `variant_field`? - match cx.tcx.type_of(did).kind() { + match tcx.type_of(did).kind() { ty::Adt(def, _) => { let field = if def.is_enum() { def.all_fields().find(|item| item.ident.name == item_name) @@ -660,10 +653,9 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { None } } - Res::Def(DefKind::Trait, did) => cx - .tcx + Res::Def(DefKind::Trait, did) => tcx .associated_items(did) - .find_by_name_and_namespace(cx.tcx, Ident::with_dummy_span(item_name), ns, did) + .find_by_name_and_namespace(tcx, Ident::with_dummy_span(item_name), ns, did) .map(|item| { let kind = match item.kind { ty::AssocKind::Const => "associatedconstant", @@ -707,7 +699,7 @@ impl<'a, 'tcx> LinkCollector<'a, 'tcx> { /// This returns the `Res` even if it was erroneous for some reason /// (such as having invalid URL fragments or being in the wrong namespace). fn check_full_res( - &self, + &mut self, ns: Namespace, path_str: &str, module_id: DefId, @@ -741,7 +733,7 @@ fn resolve_associated_trait_item( module: DefId, item_name: Symbol, ns: Namespace, - cx: &DocContext<'_>, + cx: &mut DocContext<'_>, ) -> Option<(ty::AssocKind, DefId)> { // FIXME: this should also consider blanket impls (`impl X for T`). Unfortunately // `get_auto_trait_and_blanket_impls` is broken because the caching behavior is wrong. In the @@ -766,10 +758,10 @@ fn resolve_associated_trait_item( /// /// NOTE: this cannot be a query because more traits could be available when more crates are compiled! /// So it is not stable to serialize cross-crate. -fn traits_implemented_by(cx: &DocContext<'_>, type_: DefId, module: DefId) -> FxHashSet { - let mut cache = cx.module_trait_cache.borrow_mut(); - let in_scope_traits = cache.entry(module).or_insert_with(|| { - cx.enter_resolver(|resolver| { +fn traits_implemented_by(cx: &mut DocContext<'_>, type_: DefId, module: DefId) -> FxHashSet { + let mut resolver = cx.resolver.borrow_mut(); + let in_scope_traits = cx.module_trait_cache.entry(module).or_insert_with(|| { + resolver.access(|resolver| { let parent_scope = &ParentScope::module(resolver.get_module(module), resolver); resolver .traits_in_scope(None, parent_scope, SyntaxContext::root(), None) @@ -779,13 +771,14 @@ fn traits_implemented_by(cx: &DocContext<'_>, type_: DefId, module: DefId) -> Fx }) }); - let ty = cx.tcx.type_of(type_); + let tcx = cx.tcx; + let ty = tcx.type_of(type_); let iter = in_scope_traits.iter().flat_map(|&trait_| { trace!("considering explicit impl for trait {:?}", trait_); // Look at each trait implementation to see if it's an impl for `did` - cx.tcx.find_map_relevant_impl(trait_, ty, |impl_| { - let trait_ref = cx.tcx.impl_trait_ref(impl_).expect("this is not an inherent impl"); + tcx.find_map_relevant_impl(trait_, ty, |impl_| { + let trait_ref = tcx.impl_trait_ref(impl_).expect("this is not an inherent impl"); // Check if these are the same type. let impl_type = trait_ref.self_ty(); trace!( @@ -844,6 +837,14 @@ impl<'a, 'tcx> DocFolder for LinkCollector<'a, 'tcx> { debug!("looking for the `Self` type"); let self_id = if item.is_fake() { None + // Checking if the item is a field in an enum variant + } else if (matches!(self.cx.tcx.def_kind(item.def_id), DefKind::Field) + && matches!( + self.cx.tcx.def_kind(self.cx.tcx.parent(item.def_id).unwrap()), + DefKind::Variant + )) + { + self.cx.tcx.parent(item.def_id).and_then(|item_id| self.cx.tcx.parent(item_id)) } else if matches!( self.cx.tcx.def_kind(item.def_id), DefKind::AssocConst @@ -948,12 +949,18 @@ impl LinkCollector<'_, '_> { return None; } - let cx = self.cx; let link = ori_link.link.replace("`", ""); let parts = link.split('#').collect::>(); let (link, extra_fragment) = if parts.len() > 2 { // A valid link can't have multiple #'s - anchor_failure(cx, &item, &link, dox, ori_link.range, AnchorFailure::MultipleAnchors); + anchor_failure( + self.cx, + &item, + &link, + dox, + ori_link.range, + AnchorFailure::MultipleAnchors, + ); return None; } else if parts.len() == 2 { if parts[0].trim().is_empty() { @@ -1105,7 +1112,7 @@ impl LinkCollector<'_, '_> { if matches!(disambiguator, Some(Disambiguator::Primitive)) { if fragment.is_some() { anchor_failure( - cx, + self.cx, &item, path_str, dox, @@ -1119,7 +1126,7 @@ impl LinkCollector<'_, '_> { } else { // `[char]` when a `char` module is in scope let candidates = vec![res, prim]; - ambiguity_error(cx, &item, path_str, dox, ori_link.range, candidates); + ambiguity_error(self.cx, &item, path_str, dox, ori_link.range, candidates); return None; } } @@ -1140,7 +1147,7 @@ impl LinkCollector<'_, '_> { suggest_disambiguator(resolved, diag, path_str, dox, sp, &ori_link.range); }; report_diagnostic( - cx, + self.cx.tcx, BROKEN_INTRA_DOC_LINKS, &msg, &item, @@ -1151,11 +1158,12 @@ impl LinkCollector<'_, '_> { }; let verify = |kind: DefKind, id: DefId| { - debug!("intra-doc link to {} resolved to {:?}", path_str, res); + let (kind, id) = self.kind_side_channel.take().unwrap_or((kind, id)); + debug!("intra-doc link to {} resolved to {:?} (id: {:?})", path_str, res, id); // Disallow e.g. linking to enums with `struct@` debug!("saw kind {:?} with disambiguator {:?}", kind, disambiguator); - match (self.kind_side_channel.take().map(|(kind, _)| kind).unwrap_or(kind), disambiguator) { + match (kind, disambiguator) { | (DefKind::Const | DefKind::ConstParam | DefKind::AssocConst | DefKind::AnonConst, Some(Disambiguator::Kind(DefKind::Const))) // NOTE: this allows 'method' to mean both normal functions and associated functions // This can't cause ambiguity because both are in the same namespace. @@ -1186,11 +1194,11 @@ impl LinkCollector<'_, '_> { if self.cx.tcx.privacy_access_levels(LOCAL_CRATE).is_exported(hir_src) && !self.cx.tcx.privacy_access_levels(LOCAL_CRATE).is_exported(hir_dst) { - privacy_error(cx, &item, &path_str, dox, &ori_link); + privacy_error(self.cx, &item, &path_str, dox, &ori_link); } } - Some((kind, id)) + Some(()) }; match res { @@ -1213,7 +1221,7 @@ impl LinkCollector<'_, '_> { && !self.cx.tcx.features().intra_doc_pointers { let span = super::source_span_for_markdown_range( - cx, + self.cx.tcx, dox, &ori_link.range, &item.attrs, @@ -1244,8 +1252,8 @@ impl LinkCollector<'_, '_> { Some(ItemLink { link: ori_link.link, link_text, did: None, fragment }) } Res::Def(kind, id) => { - let (kind, id) = verify(kind, id)?; - let id = clean::register_res(cx, rustc_hir::def::Res::Def(kind, id)); + verify(kind, id)?; + let id = clean::register_res(self.cx, rustc_hir::def::Res::Def(kind, id)); Some(ItemLink { link: ori_link.link, link_text, did: Some(id), fragment }) } } @@ -1301,7 +1309,7 @@ impl LinkCollector<'_, '_> { /// After parsing the disambiguator, resolve the main part of the link. // FIXME(jynelson): wow this is just so much fn resolve_with_disambiguator( - &self, + &mut self, key: &ResolutionInfo, diag: DiagnosticInfo<'_>, ) -> Option<(Res, Option)> { @@ -1311,20 +1319,20 @@ impl LinkCollector<'_, '_> { let extra_fragment = &key.extra_fragment; match disambiguator.map(Disambiguator::ns) { - Some(ns @ (ValueNS | TypeNS)) => { - match self.resolve(path_str, ns, base_node, extra_fragment) { + Some(expected_ns @ (ValueNS | TypeNS)) => { + match self.resolve(path_str, expected_ns, base_node, extra_fragment) { Ok(res) => Some(res), Err(ErrorKind::Resolve(box mut kind)) => { // We only looked in one namespace. Try to give a better error if possible. if kind.full_res().is_none() { - let other_ns = if ns == ValueNS { TypeNS } else { ValueNS }; + let other_ns = if expected_ns == ValueNS { TypeNS } else { ValueNS }; // FIXME: really it should be `resolution_failure` that does this, not `resolve_with_disambiguator` // See https://github.com/rust-lang/rust/pull/76955#discussion_r493953382 for a good approach for &new_ns in &[other_ns, MacroNS] { if let Some(res) = self.check_full_res(new_ns, path_str, base_node, extra_fragment) { - kind = ResolutionFailure::WrongNamespace(res, ns); + kind = ResolutionFailure::WrongNamespace { res, expected_ns }; break; } } @@ -1399,7 +1407,7 @@ impl LinkCollector<'_, '_> { // Constructors are picked up in the type namespace. match res { Res::Def(DefKind::Ctor(..), _) => { - Err(ResolutionFailure::WrongNamespace(res, TypeNS)) + Err(ResolutionFailure::WrongNamespace { res, expected_ns: TypeNS }) } _ => { match (fragment, extra_fragment.clone()) { @@ -1460,7 +1468,8 @@ impl LinkCollector<'_, '_> { if let Some(res) = self.check_full_res(ns, path_str, base_node, extra_fragment) { - kind = ResolutionFailure::WrongNamespace(res, MacroNS); + kind = + ResolutionFailure::WrongNamespace { res, expected_ns: MacroNS }; break; } } @@ -1666,7 +1675,7 @@ impl Suggestion { /// parameter of the callback will contain it, and the primary span of the diagnostic will be set /// to it. fn report_diagnostic( - cx: &DocContext<'_>, + tcx: TyCtxt<'_>, lint: &'static Lint, msg: &str, item: &Item, @@ -1674,7 +1683,7 @@ fn report_diagnostic( link_range: &Range, decorate: impl FnOnce(&mut DiagnosticBuilder<'_>, Option), ) { - let hir_id = match cx.as_local_hir_id(item.def_id) { + let hir_id = match DocContext::as_local_hir_id(tcx, item.def_id) { Some(hir_id) => hir_id, None => { // If non-local, no need to check anything. @@ -1686,10 +1695,10 @@ fn report_diagnostic( let attrs = &item.attrs; let sp = span_of_attrs(attrs).unwrap_or(item.source.span()); - cx.tcx.struct_span_lint_hir(lint, hir_id, sp, |lint| { + tcx.struct_span_lint_hir(lint, hir_id, sp, |lint| { let mut diag = lint.build(msg); - let span = super::source_span_for_markdown_range(cx, dox, link_range, attrs); + let span = super::source_span_for_markdown_range(tcx, dox, link_range, attrs); if let Some(sp) = span { diag.set_span(sp); @@ -1724,7 +1733,7 @@ fn report_diagnostic( /// handled earlier. For example, if passed `Item::Crate(std)` and `path_str` /// `std::io::Error::x`, this will resolve `std::io::Error`. fn resolution_failure( - collector: &LinkCollector<'_, '_>, + collector: &mut LinkCollector<'_, '_>, item: &Item, path_str: &str, disambiguator: Option, @@ -1734,7 +1743,7 @@ fn resolution_failure( ) { let tcx = collector.cx.tcx; report_diagnostic( - collector.cx, + tcx, BROKEN_INTRA_DOC_LINKS, &format!("unresolved link to `{}`", path_str), item, @@ -1892,7 +1901,7 @@ fn resolution_failure( let note = match failure { ResolutionFailure::NotResolved { .. } => unreachable!("handled above"), ResolutionFailure::Dummy => continue, - ResolutionFailure::WrongNamespace(res, expected_ns) => { + ResolutionFailure::WrongNamespace { res, expected_ns } => { if let Res::Def(kind, _) = res { let disambiguator = Disambiguator::Kind(kind); suggest_disambiguator( @@ -1913,7 +1922,7 @@ fn resolution_failure( } ResolutionFailure::NoParentItem => { diag.level = rustc_errors::Level::Bug; - "all intra doc links should have a parent item".to_owned() + "all intra-doc links should have a parent item".to_owned() } ResolutionFailure::MalformedGenerics(variant) => match variant { MalformedGenerics::UnbalancedAngleBrackets => { @@ -1965,7 +1974,7 @@ fn anchor_failure( ), }; - report_diagnostic(cx, BROKEN_INTRA_DOC_LINKS, &msg, item, dox, &link_range, |diag, sp| { + report_diagnostic(cx.tcx, BROKEN_INTRA_DOC_LINKS, &msg, item, dox, &link_range, |diag, sp| { if let Some(sp) = sp { diag.span_label(sp, "contains invalid anchor"); } @@ -2005,7 +2014,7 @@ fn ambiguity_error( } } - report_diagnostic(cx, BROKEN_INTRA_DOC_LINKS, &msg, item, dox, &link_range, |diag, sp| { + report_diagnostic(cx.tcx, BROKEN_INTRA_DOC_LINKS, &msg, item, dox, &link_range, |diag, sp| { if let Some(sp) = sp { diag.span_label(sp, "ambiguous link"); } else { @@ -2058,7 +2067,7 @@ fn privacy_error(cx: &DocContext<'_>, item: &Item, path_str: &str, dox: &str, li let msg = format!("public documentation for `{}` links to private item `{}`", item_name, path_str); - report_diagnostic(cx, PRIVATE_INTRA_DOC_LINKS, &msg, item, dox, &link.range, |diag, sp| { + report_diagnostic(cx.tcx, PRIVATE_INTRA_DOC_LINKS, &msg, item, dox, &link.range, |diag, sp| { if let Some(sp) = sp { diag.span_label(sp, "this item is private"); } diff --git a/src/librustdoc/passes/collect_trait_impls.rs b/src/librustdoc/passes/collect_trait_impls.rs index 6f992b3a91..685451b87e 100644 --- a/src/librustdoc/passes/collect_trait_impls.rs +++ b/src/librustdoc/passes/collect_trait_impls.rs @@ -14,9 +14,11 @@ crate const COLLECT_TRAIT_IMPLS: Pass = Pass { description: "retrieves trait impls for items in the crate", }; -crate fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate { - let mut synth = SyntheticImplCollector::new(cx); - let mut krate = cx.sess().time("collect_synthetic_impls", || synth.fold_crate(krate)); +crate fn collect_trait_impls(krate: Crate, cx: &mut DocContext<'_>) -> Crate { + let (mut krate, synth_impls) = cx.sess().time("collect_synthetic_impls", || { + let mut synth = SyntheticImplCollector { cx, impls: Vec::new() }; + (synth.fold_crate(krate), synth.impls) + }); let prims: FxHashSet = krate.primitives.iter().map(|p| p.1).collect(); @@ -44,13 +46,10 @@ crate fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate { // FIXME(eddyb) is this `doc(hidden)` check needed? if !cx.tcx.get_attrs(def_id).lists(sym::doc).has_word(sym::hidden) { - let self_ty = cx.tcx.type_of(def_id); - let impls = get_auto_trait_and_blanket_impls(cx, self_ty, def_id); - let mut renderinfo = cx.renderinfo.borrow_mut(); - - new_items.extend(impls.filter(|i| renderinfo.inlined.insert(i.def_id))); + let impls = get_auto_trait_and_blanket_impls(cx, def_id); + new_items.extend(impls.filter(|i| cx.inlined.insert(i.def_id))); } - }) + }); } } @@ -58,8 +57,8 @@ crate fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate { // doesn't work with it anyway, so pull them from the HIR map instead let mut extra_attrs = Vec::new(); for &trait_did in cx.tcx.all_traits(LOCAL_CRATE).iter() { - for &impl_node in cx.tcx.hir().trait_impls(trait_did) { - let impl_did = cx.tcx.hir().local_def_id(impl_node).to_def_id(); + for &impl_did in cx.tcx.hir().trait_impls(trait_did) { + let impl_did = impl_did.to_def_id(); cx.tcx.sess.prof.generic_activity("build_local_trait_impl").run(|| { let mut parent = cx.tcx.parent(impl_did); while let Some(did) = parent { @@ -142,7 +141,7 @@ crate fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate { panic!("collect-trait-impls can't run"); }; - items.extend(synth.impls); + items.extend(synth_impls); for it in new_items.drain(..) { if let ImplItem(Impl { ref for_, ref trait_, ref blanket_impl, .. }) = *it.kind { if !(cleaner.keep_impl(for_) @@ -160,26 +159,16 @@ crate fn collect_trait_impls(krate: Crate, cx: &DocContext<'_>) -> Crate { } struct SyntheticImplCollector<'a, 'tcx> { - cx: &'a DocContext<'tcx>, + cx: &'a mut DocContext<'tcx>, impls: Vec, } -impl<'a, 'tcx> SyntheticImplCollector<'a, 'tcx> { - fn new(cx: &'a DocContext<'tcx>) -> Self { - SyntheticImplCollector { cx, impls: Vec::new() } - } -} - impl<'a, 'tcx> DocFolder for SyntheticImplCollector<'a, 'tcx> { fn fold_item(&mut self, i: Item) -> Option { if i.is_struct() || i.is_enum() || i.is_union() { // FIXME(eddyb) is this `doc(hidden)` check needed? if !self.cx.tcx.get_attrs(i.def_id).lists(sym::doc).has_word(sym::hidden) { - self.impls.extend(get_auto_trait_and_blanket_impls( - self.cx, - self.cx.tcx.type_of(i.def_id), - i.def_id, - )); + self.impls.extend(get_auto_trait_and_blanket_impls(self.cx, i.def_id)); } } diff --git a/src/librustdoc/passes/doc_test_lints.rs b/src/librustdoc/passes/doc_test_lints.rs index 11f572560d..951258db9e 100644 --- a/src/librustdoc/passes/doc_test_lints.rs +++ b/src/librustdoc/passes/doc_test_lints.rs @@ -9,8 +9,10 @@ use crate::clean::*; use crate::core::DocContext; use crate::fold::DocFolder; use crate::html::markdown::{find_testable_code, ErrorCodes, Ignore, LangString}; +use crate::visit_ast::inherits_doc_hidden; use rustc_middle::lint::LintLevelSource; use rustc_session::lint; +use rustc_span::symbol::sym; crate const CHECK_PRIVATE_ITEMS_DOC_TESTS: Pass = Pass { name: "check-private-items-doc-tests", @@ -19,27 +21,20 @@ crate const CHECK_PRIVATE_ITEMS_DOC_TESTS: Pass = Pass { }; struct PrivateItemDocTestLinter<'a, 'tcx> { - cx: &'a DocContext<'tcx>, + cx: &'a mut DocContext<'tcx>, } -impl<'a, 'tcx> PrivateItemDocTestLinter<'a, 'tcx> { - fn new(cx: &'a DocContext<'tcx>) -> Self { - PrivateItemDocTestLinter { cx } - } -} - -crate fn check_private_items_doc_tests(krate: Crate, cx: &DocContext<'_>) -> Crate { - let mut coll = PrivateItemDocTestLinter::new(cx); +crate fn check_private_items_doc_tests(krate: Crate, cx: &mut DocContext<'_>) -> Crate { + let mut coll = PrivateItemDocTestLinter { cx }; coll.fold_crate(krate) } impl<'a, 'tcx> DocFolder for PrivateItemDocTestLinter<'a, 'tcx> { fn fold_item(&mut self, item: Item) -> Option { - let cx = self.cx; let dox = item.attrs.collapsed_doc_value().unwrap_or_else(String::new); - look_for_tests(&cx, &dox, &item); + look_for_tests(self.cx, &dox, &item); Some(self.fold_item_recur(item)) } @@ -58,30 +53,36 @@ impl crate::doctest::Tester for Tests { } crate fn should_have_doc_example(cx: &DocContext<'_>, item: &clean::Item) -> bool { - if matches!( - *item.kind, - clean::StructFieldItem(_) - | clean::VariantItem(_) - | clean::AssocConstItem(_, _) - | clean::AssocTypeItem(_, _) - | clean::TypedefItem(_, _) - | clean::StaticItem(_) - | clean::ConstantItem(_) - | clean::ExternCrateItem(_, _) - | clean::ImportItem(_) - | clean::PrimitiveItem(_) - | clean::KeywordItem(_) - ) { + if !cx.cache.access_levels.is_public(item.def_id) + || matches!( + *item.kind, + clean::StructFieldItem(_) + | clean::VariantItem(_) + | clean::AssocConstItem(_, _) + | clean::AssocTypeItem(_, _) + | clean::TypedefItem(_, _) + | clean::StaticItem(_) + | clean::ConstantItem(_) + | clean::ExternCrateItem { .. } + | clean::ImportItem(_) + | clean::PrimitiveItem(_) + | clean::KeywordItem(_) + ) + { return false; } let hir_id = cx.tcx.hir().local_def_id_to_hir_id(item.def_id.expect_local()); - let (level, source) = - cx.tcx.lint_level_at_node(lint::builtin::MISSING_DOC_CODE_EXAMPLES, hir_id); + if cx.tcx.hir().attrs(hir_id).lists(sym::doc).has_word(sym::hidden) + || inherits_doc_hidden(cx.tcx, hir_id) + { + return false; + } + let (level, source) = cx.tcx.lint_level_at_node(crate::lint::MISSING_DOC_CODE_EXAMPLES, hir_id); level != lint::Level::Allow || matches!(source, LintLevelSource::Default) } crate fn look_for_tests<'tcx>(cx: &DocContext<'tcx>, dox: &str, item: &Item) { - let hir_id = match cx.as_local_hir_id(item.def_id) { + let hir_id = match DocContext::as_local_hir_id(cx.tcx, item.def_id) { Some(hir_id) => hir_id, None => { // If non-local, no need to check anything. @@ -98,16 +99,15 @@ crate fn look_for_tests<'tcx>(cx: &DocContext<'tcx>, dox: &str, item: &Item) { debug!("reporting error for {:?} (hir_id={:?})", item, hir_id); let sp = span_of_attrs(&item.attrs).unwrap_or(item.source.span()); cx.tcx.struct_span_lint_hir( - lint::builtin::MISSING_DOC_CODE_EXAMPLES, + crate::lint::MISSING_DOC_CODE_EXAMPLES, hir_id, sp, |lint| lint.build("missing code example in this documentation").emit(), ); } - } else if tests.found_tests > 0 && !cx.renderinfo.borrow().access_levels.is_public(item.def_id) - { + } else if tests.found_tests > 0 && !cx.cache.access_levels.is_public(item.def_id) { cx.tcx.struct_span_lint_hir( - lint::builtin::PRIVATE_DOC_TESTS, + crate::lint::PRIVATE_DOC_TESTS, hir_id, span_of_attrs(&item.attrs).unwrap_or(item.source.span()), |lint| lint.build("documentation test in private item").emit(), diff --git a/src/librustdoc/passes/html_tags.rs b/src/librustdoc/passes/html_tags.rs index 38ec2bef0a..23364b6fec 100644 --- a/src/librustdoc/passes/html_tags.rs +++ b/src/librustdoc/passes/html_tags.rs @@ -5,7 +5,6 @@ use crate::fold::DocFolder; use crate::html::markdown::opts; use core::ops::Range; use pulldown_cmark::{Event, Parser, Tag}; -use rustc_session::lint; use std::iter::Peekable; use std::str::CharIndices; @@ -16,20 +15,14 @@ crate const CHECK_INVALID_HTML_TAGS: Pass = Pass { }; struct InvalidHtmlTagsLinter<'a, 'tcx> { - cx: &'a DocContext<'tcx>, + cx: &'a mut DocContext<'tcx>, } -impl<'a, 'tcx> InvalidHtmlTagsLinter<'a, 'tcx> { - fn new(cx: &'a DocContext<'tcx>) -> Self { - InvalidHtmlTagsLinter { cx } - } -} - -crate fn check_invalid_html_tags(krate: Crate, cx: &DocContext<'_>) -> Crate { +crate fn check_invalid_html_tags(krate: Crate, cx: &mut DocContext<'_>) -> Crate { if !cx.tcx.sess.is_nightly_build() { krate } else { - let mut coll = InvalidHtmlTagsLinter::new(cx); + let mut coll = InvalidHtmlTagsLinter { cx }; coll.fold_crate(krate) } @@ -174,7 +167,8 @@ fn extract_tags( impl<'a, 'tcx> DocFolder for InvalidHtmlTagsLinter<'a, 'tcx> { fn fold_item(&mut self, item: Item) -> Option { - let hir_id = match self.cx.as_local_hir_id(item.def_id) { + let tcx = self.cx.tcx; + let hir_id = match DocContext::as_local_hir_id(tcx, item.def_id) { Some(hir_id) => hir_id, None => { // If non-local, no need to check anything. @@ -183,13 +177,13 @@ impl<'a, 'tcx> DocFolder for InvalidHtmlTagsLinter<'a, 'tcx> { }; let dox = item.attrs.collapsed_doc_value().unwrap_or_default(); if !dox.is_empty() { - let cx = &self.cx; let report_diag = |msg: &str, range: &Range| { - let sp = match super::source_span_for_markdown_range(cx, &dox, range, &item.attrs) { + let sp = match super::source_span_for_markdown_range(tcx, &dox, range, &item.attrs) + { Some(sp) => sp, None => span_of_attrs(&item.attrs).unwrap_or(item.source.span()), }; - cx.tcx.struct_span_lint_hir(lint::builtin::INVALID_HTML_TAGS, hir_id, sp, |lint| { + tcx.struct_span_lint_hir(crate::lint::INVALID_HTML_TAGS, hir_id, sp, |lint| { lint.build(msg).emit() }); }; diff --git a/src/librustdoc/passes/mod.rs b/src/librustdoc/passes/mod.rs index 7ac42c7599..4c639c8496 100644 --- a/src/librustdoc/passes/mod.rs +++ b/src/librustdoc/passes/mod.rs @@ -1,6 +1,7 @@ //! Contains information about "passes", used to modify crate information during the documentation //! process. +use rustc_middle::ty::TyCtxt; use rustc_span::{InnerSpan, Span, DUMMY_SP}; use std::ops::Range; @@ -53,7 +54,7 @@ crate use self::html_tags::CHECK_INVALID_HTML_TAGS; #[derive(Copy, Clone)] crate struct Pass { crate name: &'static str, - crate run: fn(clean::Crate, &DocContext<'_>) -> clean::Crate, + crate run: fn(clean::Crate, &mut DocContext<'_>) -> clean::Crate, crate description: &'static str, } @@ -167,7 +168,7 @@ crate fn span_of_attrs(attrs: &clean::Attributes) -> Option { /// attributes are not all sugared doc comments. It's difficult to calculate the correct span in /// that case due to escaping and other source features. crate fn source_span_for_markdown_range( - cx: &DocContext<'_>, + tcx: TyCtxt<'_>, markdown: &str, md_range: &Range, attrs: &clean::Attributes, @@ -179,7 +180,7 @@ crate fn source_span_for_markdown_range( return None; } - let snippet = cx.sess().source_map().span_to_snippet(span_of_attrs(attrs)?).ok()?; + let snippet = tcx.sess.source_map().span_to_snippet(span_of_attrs(attrs)?).ok()?; let starting_line = markdown[..md_range.start].matches('\n').count(); let ending_line = starting_line + markdown[md_range.start..md_range.end].matches('\n').count(); diff --git a/src/librustdoc/passes/non_autolinks.rs b/src/librustdoc/passes/non_autolinks.rs index efb5df08ca..16ad940c62 100644 --- a/src/librustdoc/passes/non_autolinks.rs +++ b/src/librustdoc/passes/non_autolinks.rs @@ -7,7 +7,6 @@ use core::ops::Range; use pulldown_cmark::{Event, LinkType, Parser, Tag}; use regex::Regex; use rustc_errors::Applicability; -use rustc_session::lint; crate const CHECK_NON_AUTOLINKS: Pass = Pass { name: "check-non-autolinks", @@ -23,15 +22,11 @@ const URL_REGEX: &str = concat!( ); struct NonAutolinksLinter<'a, 'tcx> { - cx: &'a DocContext<'tcx>, + cx: &'a mut DocContext<'tcx>, regex: Regex, } impl<'a, 'tcx> NonAutolinksLinter<'a, 'tcx> { - fn new(cx: &'a DocContext<'tcx>) -> Self { - Self { cx, regex: Regex::new(URL_REGEX).expect("failed to build regex") } - } - fn find_raw_urls( &self, text: &str, @@ -52,11 +47,12 @@ impl<'a, 'tcx> NonAutolinksLinter<'a, 'tcx> { } } -crate fn check_non_autolinks(krate: Crate, cx: &DocContext<'_>) -> Crate { +crate fn check_non_autolinks(krate: Crate, cx: &mut DocContext<'_>) -> Crate { if !cx.tcx.sess.is_nightly_build() { krate } else { - let mut coll = NonAutolinksLinter::new(cx); + let mut coll = + NonAutolinksLinter { cx, regex: Regex::new(URL_REGEX).expect("failed to build regex") }; coll.fold_crate(krate) } @@ -64,7 +60,7 @@ crate fn check_non_autolinks(krate: Crate, cx: &DocContext<'_>) -> Crate { impl<'a, 'tcx> DocFolder for NonAutolinksLinter<'a, 'tcx> { fn fold_item(&mut self, item: Item) -> Option { - let hir_id = match self.cx.as_local_hir_id(item.def_id) { + let hir_id = match DocContext::as_local_hir_id(self.cx.tcx, item.def_id) { Some(hir_id) => hir_id, None => { // If non-local, no need to check anything. @@ -74,10 +70,10 @@ impl<'a, 'tcx> DocFolder for NonAutolinksLinter<'a, 'tcx> { let dox = item.attrs.collapsed_doc_value().unwrap_or_default(); if !dox.is_empty() { let report_diag = |cx: &DocContext<'_>, msg: &str, url: &str, range: Range| { - let sp = super::source_span_for_markdown_range(cx, &dox, &range, &item.attrs) + let sp = super::source_span_for_markdown_range(cx.tcx, &dox, &range, &item.attrs) .or_else(|| span_of_attrs(&item.attrs)) .unwrap_or(item.source.span()); - cx.tcx.struct_span_lint_hir(lint::builtin::NON_AUTOLINKS, hir_id, sp, |lint| { + cx.tcx.struct_span_lint_hir(crate::lint::NON_AUTOLINKS, hir_id, sp, |lint| { lint.build(msg) .span_suggestion( sp, diff --git a/src/librustdoc/passes/propagate_doc_cfg.rs b/src/librustdoc/passes/propagate_doc_cfg.rs index 6722d7c2fc..2369ff78b1 100644 --- a/src/librustdoc/passes/propagate_doc_cfg.rs +++ b/src/librustdoc/passes/propagate_doc_cfg.rs @@ -12,7 +12,7 @@ crate const PROPAGATE_DOC_CFG: Pass = Pass { description: "propagates `#[doc(cfg(...))]` to child items", }; -crate fn propagate_doc_cfg(cr: Crate, _: &DocContext<'_>) -> Crate { +crate fn propagate_doc_cfg(cr: Crate, _: &mut DocContext<'_>) -> Crate { CfgPropagator { parent_cfg: None }.fold_crate(cr) } diff --git a/src/librustdoc/passes/strip_hidden.rs b/src/librustdoc/passes/strip_hidden.rs index 79f8562c47..c742d32cb6 100644 --- a/src/librustdoc/passes/strip_hidden.rs +++ b/src/librustdoc/passes/strip_hidden.rs @@ -15,7 +15,7 @@ crate const STRIP_HIDDEN: Pass = Pass { }; /// Strip items marked `#[doc(hidden)]` -crate fn strip_hidden(krate: clean::Crate, _: &DocContext<'_>) -> clean::Crate { +crate fn strip_hidden(krate: clean::Crate, _: &mut DocContext<'_>) -> clean::Crate { let mut retained = DefIdSet::default(); // strip all #[doc(hidden)] items diff --git a/src/librustdoc/passes/strip_priv_imports.rs b/src/librustdoc/passes/strip_priv_imports.rs index 6eeaabacbc..63869324cb 100644 --- a/src/librustdoc/passes/strip_priv_imports.rs +++ b/src/librustdoc/passes/strip_priv_imports.rs @@ -9,6 +9,6 @@ crate const STRIP_PRIV_IMPORTS: Pass = Pass { description: "strips all private import statements (`use`, `extern crate`) from a crate", }; -crate fn strip_priv_imports(krate: clean::Crate, _: &DocContext<'_>) -> clean::Crate { +crate fn strip_priv_imports(krate: clean::Crate, _: &mut DocContext<'_>) -> clean::Crate { ImportStripper.fold_crate(krate) } diff --git a/src/librustdoc/passes/strip_private.rs b/src/librustdoc/passes/strip_private.rs index e812bcd87f..fc8bbc9715 100644 --- a/src/librustdoc/passes/strip_private.rs +++ b/src/librustdoc/passes/strip_private.rs @@ -14,16 +14,15 @@ crate const STRIP_PRIVATE: Pass = Pass { /// Strip private items from the point of view of a crate or externally from a /// crate, specified by the `xcrate` flag. -crate fn strip_private(mut krate: clean::Crate, cx: &DocContext<'_>) -> clean::Crate { +crate fn strip_private(mut krate: clean::Crate, cx: &mut DocContext<'_>) -> clean::Crate { // This stripper collects all *retained* nodes. let mut retained = DefIdSet::default(); - let access_levels = cx.renderinfo.borrow().access_levels.clone(); // strip all private items { let mut stripper = Stripper { retained: &mut retained, - access_levels: &access_levels, + access_levels: &cx.cache.access_levels, update_retained: true, }; krate = ImportStripper.fold_crate(stripper.fold_crate(krate)); diff --git a/src/librustdoc/passes/stripper.rs b/src/librustdoc/passes/stripper.rs index 162b70973b..44d54563f2 100644 --- a/src/librustdoc/passes/stripper.rs +++ b/src/librustdoc/passes/stripper.rs @@ -66,7 +66,7 @@ impl<'a> DocFolder for Stripper<'a> { } // handled in the `strip-priv-imports` pass - clean::ExternCrateItem(..) | clean::ImportItem(..) => {} + clean::ExternCrateItem { .. } | clean::ImportItem(..) => {} clean::ImplItem(..) => {} @@ -161,7 +161,9 @@ crate struct ImportStripper; impl DocFolder for ImportStripper { fn fold_item(&mut self, i: Item) -> Option { match *i.kind { - clean::ExternCrateItem(..) | clean::ImportItem(..) if !i.visibility.is_public() => None, + clean::ExternCrateItem { .. } | clean::ImportItem(..) if !i.visibility.is_public() => { + None + } _ => Some(self.fold_item_recur(i)), } } diff --git a/src/librustdoc/passes/unindent_comments.rs b/src/librustdoc/passes/unindent_comments.rs index 1cad480d4e..da2eda7364 100644 --- a/src/librustdoc/passes/unindent_comments.rs +++ b/src/librustdoc/passes/unindent_comments.rs @@ -14,7 +14,7 @@ crate const UNINDENT_COMMENTS: Pass = Pass { description: "removes excess indentation on comments in order for markdown to like it", }; -crate fn unindent_comments(krate: clean::Crate, _: &DocContext<'_>) -> clean::Crate { +crate fn unindent_comments(krate: clean::Crate, _: &mut DocContext<'_>) -> clean::Crate { CommentCleaner.fold_crate(krate) } diff --git a/src/librustdoc/visit_ast.rs b/src/librustdoc/visit_ast.rs index 7d161ca364..b6782fb75d 100644 --- a/src/librustdoc/visit_ast.rs +++ b/src/librustdoc/visit_ast.rs @@ -29,6 +29,16 @@ fn def_id_to_path(tcx: TyCtxt<'_>, did: DefId) -> Vec { std::iter::once(crate_name).chain(relative).collect() } +crate fn inherits_doc_hidden(tcx: TyCtxt<'_>, mut node: hir::HirId) -> bool { + while let Some(id) = tcx.hir().get_enclosing_scope(node) { + node = id; + if tcx.hir().attrs(node).lists(sym::doc).has_word(sym::hidden) { + return true; + } + } + false +} + // Also, is there some reason that this doesn't use the 'visit' // framework from syntax?. @@ -89,7 +99,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { // (since a direct parent isn't necessarily a module, c.f. #77828). let macro_parent_def_id = { use rustc_middle::ty::DefIdTree; - tcx.parent(tcx.hir().local_def_id(def.hir_id).to_def_id()).unwrap() + tcx.parent(def.def_id.to_def_id()).unwrap() }; let macro_parent_path = tcx.def_path(macro_parent_def_id); // HACK: rustdoc has no way to lookup `doctree::Module`s by their HirId. Instead, @@ -113,7 +123,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { assert_eq!(cur_mod_def_id, macro_parent_def_id); cur_mod.macros.push((def, None)); } - self.cx.renderinfo.get_mut().exact_paths = self.exact_paths; + self.cx.cache.exact_paths = self.exact_paths; top_level_module } @@ -132,8 +142,8 @@ 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 { - let item = self.cx.tcx.hir().expect_item(i.id); + for &i in m.item_ids { + let item = self.cx.tcx.hir().item(i); self.visit_item(item, None, &mut om); } self.inside_public_path = orig_inside_public_path; @@ -158,19 +168,6 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { 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) { - return true; - } - if node == hir::CRATE_HIR_ID { - break; - } - } - false - } - debug!("maybe_inline_local res: {:?}", res); let tcx = self.cx.tcx; @@ -199,12 +196,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { } else { // All items need to be handled here in case someone wishes to link // to them with intra-doc links - self.cx - .renderinfo - .get_mut() - .access_levels - .map - .insert(did, AccessLevel::Public); + self.cx.cache.access_levels.map.insert(did, AccessLevel::Public); } } } @@ -216,8 +208,8 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { None => return false, }; - let is_private = !self.cx.renderinfo.borrow().access_levels.is_public(res_did); - let is_hidden = inherits_doc_hidden(self.cx, res_hir_id); + let is_private = !self.cx.cache.access_levels.is_public(res_did); + let is_hidden = inherits_doc_hidden(self.cx.tcx, res_hir_id); // Only inline if requested or if the item would otherwise be stripped. if (!please_inline && !is_private && !is_hidden) || is_no_inline { @@ -231,8 +223,8 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { 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 { - let i = self.cx.tcx.hir().expect_item(i.id); + for &i in m.item_ids { + let i = self.cx.tcx.hir().item(i); self.visit_item(i, None, om); } self.inlining = prev; @@ -270,8 +262,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { let name = renamed.unwrap_or(item.ident.name); if item.vis.node.is_pub() { - let def_id = self.cx.tcx.hir().local_def_id(item.hir_id); - self.store_path(def_id.to_def_id()); + self.store_path(item.def_id.to_def_id()); } match item.kind { @@ -294,10 +285,12 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { return; } + let attrs = self.cx.tcx.hir().attrs(item.hir_id()); + // 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() { + let please_inline = attrs.iter().any(|item| match item.meta_item_list() { Some(ref list) if item.has_name(sym::doc) => { list.iter().any(|i| i.has_name(sym::inline)) } @@ -305,7 +298,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { }); let ident = if is_glob { None } else { Some(name) }; if self.maybe_inline_local( - item.hir_id, + item.hir_id(), path.res, ident, is_glob, @@ -322,7 +315,7 @@ impl<'a, 'tcx> RustdocVisitor<'a, 'tcx> { om.mods.push(self.visit_mod_contents( item.span, &item.vis, - item.hir_id, + item.hir_id(), m, Some(name), )); diff --git a/src/librustdoc/visit_lib.rs b/src/librustdoc/visit_lib.rs index 0bf22562ea..3e06b41731 100644 --- a/src/librustdoc/visit_lib.rs +++ b/src/librustdoc/visit_lib.rs @@ -25,7 +25,7 @@ impl<'a, 'tcx> LibEmbargoVisitor<'a, 'tcx> { crate 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, + access_levels: &mut cx.cache.access_levels, prev_level: Some(AccessLevel::Public), visited_mods: FxHashSet::default(), } diff --git a/src/rustdoc-json-types/Cargo.toml b/src/rustdoc-json-types/Cargo.toml index 7bba16a68b..9c02d5e645 100644 --- a/src/rustdoc-json-types/Cargo.toml +++ b/src/rustdoc-json-types/Cargo.toml @@ -9,3 +9,6 @@ path = "lib.rs" [dependencies] serde = { version = "1.0", features = ["derive"] } + +[dev-dependencies] +serde_json = "1.0" diff --git a/src/rustdoc-json-types/lib.rs b/src/rustdoc-json-types/lib.rs index 083f99e4a6..4e7794fe61 100644 --- a/src/rustdoc-json-types/lib.rs +++ b/src/rustdoc-json-types/lib.rs @@ -3,7 +3,7 @@ //! These types are the public API exposed through the `--output-format json` flag. The [`Crate`] //! struct is the root of the JSON blob and all other items are contained within. -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use std::path::PathBuf; use serde::{Deserialize, Serialize}; @@ -76,7 +76,7 @@ pub struct Item { /// Stringified versions of the attributes on this item (e.g. `"#[inline]"`) pub attrs: Vec, pub deprecation: Option, - pub kind: ItemKind, + #[serde(flatten)] pub inner: ItemEnum, } @@ -96,8 +96,8 @@ pub struct Deprecation { pub note: Option, } -#[serde(rename_all = "snake_case")] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "snake_case")] pub enum Visibility { Public, /// For the most part items are private by default. The exceptions are associated items of @@ -112,8 +112,8 @@ pub enum Visibility { }, } -#[serde(rename_all = "snake_case")] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "snake_case")] pub enum GenericArgs { /// <'a, 32, B: Copy, C = u32> AngleBracketed { args: Vec, bindings: Vec }, @@ -121,8 +121,8 @@ pub enum GenericArgs { Parenthesized { inputs: Vec, output: Option }, } -#[serde(rename_all = "snake_case")] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "snake_case")] pub enum GenericArg { Lifetime(String), Type(Type), @@ -144,8 +144,8 @@ pub struct TypeBinding { pub binding: TypeBindingKind, } -#[serde(rename_all = "snake_case")] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "snake_case")] pub enum TypeBindingKind { Equality(Type), Constraint(Vec), @@ -154,8 +154,8 @@ pub enum TypeBindingKind { #[derive(Clone, Debug, PartialEq, Eq, Hash, Serialize, Deserialize)] pub struct Id(pub String); -#[serde(rename_all = "snake_case")] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "snake_case")] pub enum ItemKind { Module, ExternCrate, @@ -184,49 +184,49 @@ pub enum ItemKind { Keyword, } -#[serde(untagged)] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(tag = "kind", content = "inner", rename_all = "snake_case")] pub enum ItemEnum { - ModuleItem(Module), - ExternCrateItem { + Module(Module), + ExternCrate { name: String, rename: Option, }, - ImportItem(Import), + Import(Import), - UnionItem(Union), - StructItem(Struct), - StructFieldItem(Type), - EnumItem(Enum), - VariantItem(Variant), + Union(Union), + Struct(Struct), + StructField(Type), + Enum(Enum), + Variant(Variant), - FunctionItem(Function), + Function(Function), - TraitItem(Trait), - TraitAliasItem(TraitAlias), - MethodItem(Method), - ImplItem(Impl), + Trait(Trait), + TraitAlias(TraitAlias), + Method(Method), + Impl(Impl), - TypedefItem(Typedef), - OpaqueTyItem(OpaqueTy), - ConstantItem(Constant), + Typedef(Typedef), + OpaqueTy(OpaqueTy), + Constant(Constant), - StaticItem(Static), + Static(Static), /// `type`s from an extern block - ForeignTypeItem, + ForeignType, /// Declarative macro_rules! macro - MacroItem(String), - ProcMacroItem(ProcMacro), + Macro(String), + ProcMacro(ProcMacro), - AssocConstItem { + AssocConst { #[serde(rename = "type")] type_: Type, /// e.g. `const X: usize = 5;` default: Option, }, - AssocTypeItem { + AssocType { bounds: Vec, /// e.g. `type X = usize;` default: Option, @@ -264,28 +264,37 @@ pub struct Enum { pub impls: Vec, } +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "snake_case")] #[serde(tag = "variant_kind", content = "variant_inner")] -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub enum Variant { Plain, Tuple(Vec), Struct(Vec), } -#[serde(rename_all = "snake_case")] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "snake_case")] pub enum StructType { Plain, Tuple, Unit, } +#[non_exhaustive] +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq, Eq, Hash)] +#[serde(rename_all = "snake_case")] +pub enum Qualifiers { + Const, + Unsafe, + Async, +} + #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct Function { pub decl: FnDecl, pub generics: Generics, - pub header: String, + pub header: HashSet, pub abi: String, } @@ -293,7 +302,8 @@ pub struct Function { pub struct Method { pub decl: FnDecl, pub generics: Generics, - pub header: String, + pub header: HashSet, + pub abi: String, pub has_body: bool, } @@ -309,24 +319,24 @@ pub struct GenericParamDef { pub kind: GenericParamDefKind, } -#[serde(rename_all = "snake_case")] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "snake_case")] pub enum GenericParamDefKind { Lifetime, Type { bounds: Vec, default: Option }, Const(Type), } -#[serde(rename_all = "snake_case")] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "snake_case")] pub enum WherePredicate { BoundPredicate { ty: Type, bounds: Vec }, RegionPredicate { lifetime: String, bounds: Vec }, EqPredicate { lhs: Type, rhs: Type }, } -#[serde(rename_all = "snake_case")] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "snake_case")] pub enum GenericBound { TraitBound { #[serde(rename = "trait")] @@ -338,17 +348,17 @@ pub enum GenericBound { Outlives(String), } -#[serde(rename_all = "snake_case")] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "snake_case")] pub enum TraitBoundModifier { None, Maybe, MaybeConst, } +#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] #[serde(rename_all = "snake_case")] #[serde(tag = "kind", content = "inner")] -#[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub enum Type { /// Structs, enums, and traits ResolvedPath { @@ -403,9 +413,9 @@ pub enum Type { #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] pub struct FunctionPointer { - pub is_unsafe: bool, - pub generic_params: Vec, pub decl: FnDecl, + pub generic_params: Vec, + pub header: HashSet, pub abi: String, } @@ -447,8 +457,8 @@ pub struct Impl { pub blanket_impl: Option, } -#[serde(rename_all = "snake_case")] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "snake_case")] pub struct Import { /// The full path being imported. pub span: String, @@ -467,8 +477,8 @@ pub struct ProcMacro { pub helpers: Vec, } -#[serde(rename_all = "snake_case")] #[derive(Clone, Debug, Serialize, Deserialize, PartialEq)] +#[serde(rename_all = "snake_case")] pub enum MacroKind { /// A bang macro `foo!()`. Bang, @@ -498,3 +508,6 @@ pub struct Static { pub mutable: bool, pub expr: String, } + +#[cfg(test)] +mod tests; diff --git a/src/rustdoc-json-types/tests.rs b/src/rustdoc-json-types/tests.rs new file mode 100644 index 0000000000..e7f6447ed8 --- /dev/null +++ b/src/rustdoc-json-types/tests.rs @@ -0,0 +1,34 @@ +use super::*; + +#[test] +fn test_struct_info_roundtrip() { + let s = ItemEnum::Struct(Struct { + struct_type: StructType::Plain, + generics: Generics { params: vec![], where_predicates: vec![] }, + fields_stripped: false, + fields: vec![], + impls: vec![], + }); + + let struct_json = serde_json::to_string(&s).unwrap(); + + let de_s = serde_json::from_str(&struct_json).unwrap(); + + assert_eq!(s, de_s); +} + +#[test] +fn test_union_info_roundtrip() { + let u = ItemEnum::Union(Union { + generics: Generics { params: vec![], where_predicates: vec![] }, + fields_stripped: false, + fields: vec![], + impls: vec![], + }); + + let union_json = serde_json::to_string(&u).unwrap(); + + let de_u = serde_json::from_str(&union_json).unwrap(); + + assert_eq!(u, de_u); +} diff --git a/src/stage0.txt b/src/stage0.txt index a85f8550d4..22c2799673 100644 --- a/src/stage0.txt +++ b/src/stage0.txt @@ -12,8 +12,8 @@ # stable release's version number. `date` is the date where the release we're # bootstrapping off was released. -date: 2021-02-11 -rustc: 1.50.0 +date: 2021-03-25 +rustc: 1.51.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 diff --git a/src/test/assembly/asm/arm-types.rs b/src/test/assembly/asm/arm-types.rs index 64b7c93cbc..09901a7a39 100644 --- a/src/test/assembly/asm/arm-types.rs +++ b/src/test/assembly/asm/arm-types.rs @@ -91,6 +91,15 @@ pub unsafe fn sym_static() { asm!("adr r0, {}", sym extern_static); } +// Regression test for #82052. +// CHECK-LABEL: issue_82052 +// CHECK: push {{.*}}lr +// CHECK: @APP +// CHECK: @NO_APP +pub unsafe fn issue_82052() { + asm!("", out("r14") _); +} + macro_rules! check { ($func:ident $ty:ident $class:ident $mov:literal) => { #[no_mangle] diff --git a/src/test/assembly/asm/riscv-types.rs b/src/test/assembly/asm/riscv-types.rs index 67dda1024f..47518cdcf1 100644 --- a/src/test/assembly/asm/riscv-types.rs +++ b/src/test/assembly/asm/riscv-types.rs @@ -5,6 +5,7 @@ //[riscv32] compile-flags: --target riscv32imac-unknown-none-elf // compile-flags: -C target-feature=+d // needs-llvm-components: riscv +// min-system-llvm-version: 12.0 #![feature(no_core, lang_items, rustc_attrs)] #![crate_type = "rlib"] @@ -99,45 +100,45 @@ macro_rules! check_reg { // CHECK-LABEL: reg_i8: // CHECK: #APP -// CHECK: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}} +// CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}} // CHECK: #NO_APP check!(reg_i8 i8 reg "mv"); // CHECK-LABEL: reg_i16: // CHECK: #APP -// CHECK: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}} +// CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}} // CHECK: #NO_APP check!(reg_i16 i16 reg "mv"); // CHECK-LABEL: reg_i32: // CHECK: #APP -// CHECK: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}} +// CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}} // CHECK: #NO_APP check!(reg_i32 i32 reg "mv"); // CHECK-LABEL: reg_f32: // CHECK: #APP -// CHECK: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}} +// CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}} // CHECK: #NO_APP check!(reg_f32 f32 reg "mv"); // riscv64-LABEL: reg_i64: // riscv64: #APP -// riscv64: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}} +// riscv64: mv {{[a-z0-9]+}}, {{[a-z0-9]+}} // riscv64: #NO_APP #[cfg(riscv64)] check!(reg_i64 i64 reg "mv"); // riscv64-LABEL: reg_f64: // riscv64: #APP -// riscv64: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}} +// riscv64: mv {{[a-z0-9]+}}, {{[a-z0-9]+}} // riscv64: #NO_APP #[cfg(riscv64)] check!(reg_f64 f64 reg "mv"); // CHECK-LABEL: reg_ptr: // CHECK: #APP -// CHECK: add {{[a-z0-9]+}}, zero, {{[a-z0-9]+}} +// CHECK: mv {{[a-z0-9]+}}, {{[a-z0-9]+}} // CHECK: #NO_APP check!(reg_ptr ptr reg "mv"); @@ -155,45 +156,45 @@ check!(freg_f64 f64 freg "fmv.d"); // CHECK-LABEL: a0_i8: // CHECK: #APP -// CHECK: add a0, zero, a0 +// CHECK: mv a0, a0 // CHECK: #NO_APP check_reg!(a0_i8 i8 "a0" "mv"); // CHECK-LABEL: a0_i16: // CHECK: #APP -// CHECK: add a0, zero, a0 +// CHECK: mv a0, a0 // CHECK: #NO_APP check_reg!(a0_i16 i16 "a0" "mv"); // CHECK-LABEL: a0_i32: // CHECK: #APP -// CHECK: add a0, zero, a0 +// CHECK: mv a0, a0 // CHECK: #NO_APP check_reg!(a0_i32 i32 "a0" "mv"); // CHECK-LABEL: a0_f32: // CHECK: #APP -// CHECK: add a0, zero, a0 +// CHECK: mv a0, a0 // CHECK: #NO_APP check_reg!(a0_f32 f32 "a0" "mv"); // riscv64-LABEL: a0_i64: // riscv64: #APP -// riscv64: add a0, zero, a0 +// riscv64: mv a0, a0 // riscv64: #NO_APP #[cfg(riscv64)] check_reg!(a0_i64 i64 "a0" "mv"); // riscv64-LABEL: a0_f64: // riscv64: #APP -// riscv64: add a0, zero, a0 +// riscv64: mv a0, a0 // riscv64: #NO_APP #[cfg(riscv64)] check_reg!(a0_f64 f64 "a0" "mv"); // CHECK-LABEL: a0_ptr: // CHECK: #APP -// CHECK: add a0, zero, a0 +// CHECK: mv a0, a0 // CHECK: #NO_APP check_reg!(a0_ptr ptr "a0" "mv"); diff --git a/src/test/assembly/stack-probes.rs b/src/test/assembly/stack-probes.rs new file mode 100644 index 0000000000..9597e242f1 --- /dev/null +++ b/src/test/assembly/stack-probes.rs @@ -0,0 +1,42 @@ +// min-llvm-version: 11.0.1 +// revisions: x86_64 i686 +// assembly-output: emit-asm +//[x86_64] compile-flags: --target x86_64-unknown-linux-gnu +//[i686] compile-flags: --target i686-unknown-linux-gnu +// compile-flags: -C llvm-args=--x86-asm-syntax=intel + +#![feature(no_core, lang_items)] +#![crate_type = "lib"] +#![no_core] + +#[lang = "sized"] +trait Sized {} +#[lang = "copy"] +trait Copy {} + +impl Copy for u8 {} + +// Check that inline-asm stack probes are generated correctly. +// To avoid making this test fragile to slight asm changes, +// we only check that the stack pointer is decremented by a page at a time, +// instead of matching the whole probe sequence. + +// CHECK-LABEL: small_stack_probe: +#[no_mangle] +pub fn small_stack_probe(x: u8, f: fn([u8; 8192])) { + // CHECK-NOT: __rust_probestack + // x86_64: sub rsp, 4096 + // i686: sub esp, 4096 + let a = [x; 8192]; + f(a); +} + +// CHECK-LABEL: big_stack_probe: +#[no_mangle] +pub fn big_stack_probe(x: u8, f: fn([u8; 65536])) { + // CHECK-NOT: __rust_probestack + // x86_64: sub rsp, 4096 + // i686: sub esp, 4096 + let a = [x; 65536]; + f(a); +} diff --git a/src/test/assembly/target-feature-multiple.rs b/src/test/assembly/target-feature-multiple.rs new file mode 100644 index 0000000000..4c2073678b --- /dev/null +++ b/src/test/assembly/target-feature-multiple.rs @@ -0,0 +1,41 @@ +// assembly-output: emit-asm +// needs-llvm-components: x86 +// revisions: TWOFLAGS SINGLEFLAG +// compile-flags: --target=x86_64-unknown-linux-gnu +// [TWOFLAGS] compile-flags: -C target-feature=+rdrnd -C target-feature=+rdseed +// [SINGLEFLAG] compile-flags: -C target-feature=+rdrnd,+rdseed + +// Target features set via flags aren't necessarily reflected in the IR, so the only way to test +// them is to build code that requires the features to be enabled to work. +// +// In this particular test if `rdrnd,rdseed` somehow didn't make it to LLVM, the instruction +// selection should crash. +// +// > LLVM ERROR: Cannot select: 0x7f00f400c010: i32,i32,ch = X86ISD::RDSEED 0x7f00f400bfa8:2 +// > In function: foo +// +// See also src/test/codegen/target-feature-overrides.rs +#![feature(no_core, lang_items, link_llvm_intrinsics, abi_unadjusted)] +#![crate_type = "lib"] +#![no_core] + +#[lang = "sized"] +trait Sized {} +#[lang = "copy"] +trait Copy {} + +// Use of these requires target features to be enabled +extern "unadjusted" { + #[link_name = "llvm.x86.rdrand.32"] + fn x86_rdrand32_step() -> (u32, i32); + #[link_name = "llvm.x86.rdseed.32"] + fn x86_rdseed32_step() -> (u32, i32); +} + +#[no_mangle] +pub unsafe fn foo() -> (u32, u32) { + // CHECK-LABEL: foo: + // CHECK: rdrand + // CHECK: rdseed + (x86_rdrand32_step().0, x86_rdseed32_step().0) +} 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 adde5745fe..f58117f44d 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 std::intrinsics::drop_in_place:: - shim(Some(StructWithDtor)) @@ drop_in_place_intrinsic-cgu.0[Internal] +//~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(Some(StructWithDtor)) @@ 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 std::intrinsics::drop_in_place::<[StructWithDtor; 2]> - shim(Some([StructWithDtor; 2])) @@ drop_in_place_intrinsic-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::<[StructWithDtor; 2]> - shim(Some([StructWithDtor; 2])) @@ drop_in_place_intrinsic-cgu.0[Internal] let x = [StructWithDtor(0), StructWithDtor(1)]; drop_slice_in_place(&x); @@ -30,7 +30,7 @@ fn drop_slice_in_place(x: &[StructWithDtor]) { // This is the interesting thing in this test case: Normally we would // 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 std::intrinsics::drop_in_place::<[StructWithDtor]> - shim(Some([StructWithDtor])) @@ drop_in_place_intrinsic-cgu.0[Internal] - ::std::intrinsics::drop_in_place(x as *const _ as *mut [StructWithDtor]); + //~ MONO_ITEM fn std::ptr::drop_in_place::<[StructWithDtor]> - shim(Some([StructWithDtor])) @@ 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 45e4a0d6d7..948098b0cb 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 { struct NonGenericNoDrop(i32); struct NonGenericWithDrop(i32); -//~ MONO_ITEM fn std::intrinsics::drop_in_place:: - shim(Some(NonGenericWithDrop)) @@ generic_drop_glue-cgu.0[Internal] +//~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(Some(NonGenericWithDrop)) @@ generic_drop_glue-cgu.0[Internal] impl Drop for NonGenericWithDrop { //~ MONO_ITEM fn ::drop @@ -47,11 +47,11 @@ impl Drop for NonGenericWithDrop { //~ MONO_ITEM fn start #[start] fn start(_: isize, _: *const *const u8) -> isize { - //~ MONO_ITEM fn std::intrinsics::drop_in_place::> - shim(Some(StructWithDrop)) @@ generic_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::> - shim(Some(StructWithDrop)) @@ generic_drop_glue-cgu.0[Internal] //~ MONO_ITEM fn as std::ops::Drop>::drop let _ = StructWithDrop { x: 0i8, y: 'a' }.x; - //~ MONO_ITEM fn std::intrinsics::drop_in_place::> - shim(Some(StructWithDrop<&str, NonGenericNoDrop>)) @@ generic_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::> - shim(Some(StructWithDrop<&str, NonGenericNoDrop>)) @@ generic_drop_glue-cgu.0[Internal] //~ MONO_ITEM fn as std::ops::Drop>::drop 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 std::intrinsics::drop_in_place::> - shim(Some(StructNoDrop)) @@ generic_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::> - shim(Some(StructNoDrop)) @@ generic_drop_glue-cgu.0[Internal] let _ = StructNoDrop { x: NonGenericWithDrop(0), y: 0f64 }.y; - //~ MONO_ITEM fn std::intrinsics::drop_in_place::> - shim(Some(EnumWithDrop)) @@ generic_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::> - shim(Some(EnumWithDrop)) @@ generic_drop_glue-cgu.0[Internal] //~ MONO_ITEM fn as std::ops::Drop>::drop let _ = match EnumWithDrop::A::(0) { EnumWithDrop::A(x) => x, EnumWithDrop::B(x) => x as i32 }; - //~ MONO_ITEM fn std::intrinsics::drop_in_place::> - shim(Some(EnumWithDrop)) @@ generic_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::> - shim(Some(EnumWithDrop)) @@ generic_drop_glue-cgu.0[Internal] //~ MONO_ITEM fn as std::ops::Drop>::drop let _ = match EnumWithDrop::B::(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 ce6757a047..919c43738f 100644 --- a/src/test/codegen-units/item-collection/instantiation-through-vtable.rs +++ b/src/test/codegen-units/item-collection/instantiation-through-vtable.rs @@ -23,13 +23,13 @@ impl Trait for Struct { fn start(_: isize, _: *const *const u8) -> isize { let s1 = Struct { _a: 0u32 }; - //~ MONO_ITEM fn std::intrinsics::drop_in_place::> - shim(None) @@ instantiation_through_vtable-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::> - shim(None) @@ instantiation_through_vtable-cgu.0[Internal] //~ MONO_ITEM fn as Trait>::foo //~ MONO_ITEM fn as Trait>::bar let _ = &s1 as &Trait; let s1 = Struct { _a: 0u64 }; - //~ MONO_ITEM fn std::intrinsics::drop_in_place::> - shim(None) @@ instantiation_through_vtable-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::> - shim(None) @@ instantiation_through_vtable-cgu.0[Internal] //~ MONO_ITEM fn as Trait>::foo //~ MONO_ITEM fn as Trait>::bar 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 b583771681..720421d3e0 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 std::intrinsics::drop_in_place:: - shim(Some(StructWithDrop)) @@ non_generic_drop_glue-cgu.0[Internal] +//~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(Some(StructWithDrop)) @@ non_generic_drop_glue-cgu.0[Internal] struct StructWithDrop { x: i32 } @@ -19,7 +19,7 @@ struct StructNoDrop { x: i32 } -//~ MONO_ITEM fn std::intrinsics::drop_in_place:: - shim(Some(EnumWithDrop)) @@ non_generic_drop_glue-cgu.0[Internal] +//~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(Some(EnumWithDrop)) @@ 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 c0489a6a25..2ec572b437 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 std::intrinsics::drop_in_place:: - shim(Some(Root)) @@ transitive_drop_glue-cgu.0[Internal] +//~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(Some(Root)) @@ transitive_drop_glue-cgu.0[Internal] struct Root(Intermediate); -//~ MONO_ITEM fn std::intrinsics::drop_in_place:: - shim(Some(Intermediate)) @@ transitive_drop_glue-cgu.0[Internal] +//~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(Some(Intermediate)) @@ transitive_drop_glue-cgu.0[Internal] struct Intermediate(Leaf); -//~ MONO_ITEM fn std::intrinsics::drop_in_place:: - shim(Some(Leaf)) @@ transitive_drop_glue-cgu.0[Internal] +//~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(Some(Leaf)) @@ transitive_drop_glue-cgu.0[Internal] struct Leaf; impl Drop for Leaf { @@ -30,15 +30,15 @@ impl Drop for LeafGen { fn start(_: isize, _: *const *const u8) -> isize { let _ = Root(Intermediate(Leaf)); - //~ MONO_ITEM fn std::intrinsics::drop_in_place::> - shim(Some(RootGen)) @@ transitive_drop_glue-cgu.0[Internal] - //~ MONO_ITEM fn std::intrinsics::drop_in_place::> - shim(Some(IntermediateGen)) @@ transitive_drop_glue-cgu.0[Internal] - //~ MONO_ITEM fn std::intrinsics::drop_in_place::> - shim(Some(LeafGen)) @@ transitive_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::> - shim(Some(RootGen)) @@ transitive_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::> - shim(Some(IntermediateGen)) @@ transitive_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::> - shim(Some(LeafGen)) @@ transitive_drop_glue-cgu.0[Internal] //~ MONO_ITEM fn as std::ops::Drop>::drop let _ = RootGen(IntermediateGen(LeafGen(0u32))); - //~ MONO_ITEM fn std::intrinsics::drop_in_place::> - shim(Some(RootGen)) @@ transitive_drop_glue-cgu.0[Internal] - //~ MONO_ITEM fn std::intrinsics::drop_in_place::> - shim(Some(IntermediateGen)) @@ transitive_drop_glue-cgu.0[Internal] - //~ MONO_ITEM fn std::intrinsics::drop_in_place::> - shim(Some(LeafGen)) @@ transitive_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::> - shim(Some(RootGen)) @@ transitive_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::> - shim(Some(IntermediateGen)) @@ transitive_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::> - shim(Some(LeafGen)) @@ transitive_drop_glue-cgu.0[Internal] //~ MONO_ITEM fn as std::ops::Drop>::drop 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 d34835ae69..232570779c 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 std::intrinsics::drop_in_place:: - shim(Some(Dropped)) @@ tuple_drop_glue-cgu.0[Internal] +//~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(Some(Dropped)) @@ tuple_drop_glue-cgu.0[Internal] struct Dropped; impl Drop for Dropped { @@ -16,11 +16,11 @@ impl Drop for Dropped { //~ MONO_ITEM fn start #[start] fn start(_: isize, _: *const *const u8) -> isize { - //~ MONO_ITEM fn std::intrinsics::drop_in_place::<(u32, Dropped)> - shim(Some((u32, Dropped))) @@ tuple_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::<(u32, Dropped)> - shim(Some((u32, Dropped))) @@ tuple_drop_glue-cgu.0[Internal] let x = (0u32, Dropped); - //~ MONO_ITEM fn std::intrinsics::drop_in_place::<(i16, (Dropped, bool))> - shim(Some((i16, (Dropped, bool)))) @@ tuple_drop_glue-cgu.0[Internal] - //~ MONO_ITEM fn std::intrinsics::drop_in_place::<(Dropped, bool)> - shim(Some((Dropped, bool))) @@ tuple_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::<(i16, (Dropped, bool))> - shim(Some((i16, (Dropped, bool)))) @@ tuple_drop_glue-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::<(Dropped, bool)> - shim(Some((Dropped, 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 9421bf106b..1b963a24ce 100644 --- a/src/test/codegen-units/item-collection/unsizing.rs +++ b/src/test/codegen-units/item-collection/unsizing.rs @@ -48,13 +48,13 @@ impl, U: ?Sized> CoerceUnsized> for Wrapper fn start(_: isize, _: *const *const u8) -> isize { // simple case let bool_sized = &true; - //~ MONO_ITEM fn std::intrinsics::drop_in_place:: - shim(None) @@ unsizing-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(None) @@ unsizing-cgu.0[Internal] //~ MONO_ITEM fn ::foo let _bool_unsized = bool_sized as &Trait; let char_sized = &'a'; - //~ MONO_ITEM fn std::intrinsics::drop_in_place:: - shim(None) @@ unsizing-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(None) @@ unsizing-cgu.0[Internal] //~ MONO_ITEM fn ::foo 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 std::intrinsics::drop_in_place:: - shim(None) @@ unsizing-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(None) @@ unsizing-cgu.0[Internal] //~ MONO_ITEM fn ::foo let _struct_unsized = struct_sized as &Struct; // custom coercion let wrapper_sized = Wrapper(&0u32); - //~ MONO_ITEM fn std::intrinsics::drop_in_place:: - shim(None) @@ unsizing-cgu.0[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(None) @@ unsizing-cgu.0[Internal] //~ MONO_ITEM fn ::foo let _wrapper_sized = wrapper_sized as Wrapper; diff --git a/src/test/codegen-units/partitioning/extern-drop-glue.rs b/src/test/codegen-units/partitioning/extern-drop-glue.rs index 3de1bdb86c..6232b9edf8 100644 --- a/src/test/codegen-units/partitioning/extern-drop-glue.rs +++ b/src/test/codegen-units/partitioning/extern-drop-glue.rs @@ -12,13 +12,13 @@ // aux-build:cgu_extern_drop_glue.rs extern crate cgu_extern_drop_glue; -//~ MONO_ITEM fn std::intrinsics::drop_in_place:: - shim(Some(cgu_extern_drop_glue::Struct)) @@ extern_drop_glue-fallback.cgu[External] +//~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(Some(cgu_extern_drop_glue::Struct)) @@ extern_drop_glue-fallback.cgu[External] struct LocalStruct(cgu_extern_drop_glue::Struct); //~ MONO_ITEM fn user @@ extern_drop_glue[External] pub fn user() { - //~ MONO_ITEM fn std::intrinsics::drop_in_place:: - shim(Some(LocalStruct)) @@ extern_drop_glue-fallback.cgu[External] + //~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(Some(LocalStruct)) @@ extern_drop_glue-fallback.cgu[External] let _ = LocalStruct(cgu_extern_drop_glue::Struct(0)); } @@ -29,7 +29,7 @@ pub mod mod1 { //~ MONO_ITEM fn mod1::user @@ extern_drop_glue-mod1[External] pub fn user() { - //~ MONO_ITEM fn std::intrinsics::drop_in_place:: - shim(Some(mod1::LocalStruct)) @@ extern_drop_glue-fallback.cgu[External] + //~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(Some(mod1::LocalStruct)) @@ extern_drop_glue-fallback.cgu[External] 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 98108615ce..3017e4f949 100644 --- a/src/test/codegen-units/partitioning/local-drop-glue.rs +++ b/src/test/codegen-units/partitioning/local-drop-glue.rs @@ -8,7 +8,7 @@ #![allow(dead_code)] #![crate_type = "rlib"] -//~ MONO_ITEM fn std::intrinsics::drop_in_place:: - shim(Some(Struct)) @@ local_drop_glue-fallback.cgu[External] +//~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(Some(Struct)) @@ local_drop_glue-fallback.cgu[External] struct Struct { _a: u32, } @@ -18,7 +18,7 @@ impl Drop for Struct { fn drop(&mut self) {} } -//~ MONO_ITEM fn std::intrinsics::drop_in_place:: - shim(Some(Outer)) @@ local_drop_glue-fallback.cgu[External] +//~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(Some(Outer)) @@ local_drop_glue-fallback.cgu[External] struct Outer { _a: Struct, } @@ -31,10 +31,10 @@ pub fn user() { pub mod mod1 { use super::Struct; - //~ MONO_ITEM fn std::intrinsics::drop_in_place:: - shim(Some(mod1::Struct2)) @@ local_drop_glue-fallback.cgu[External] + //~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(Some(mod1::Struct2)) @@ local_drop_glue-fallback.cgu[External] struct Struct2 { _a: Struct, - //~ MONO_ITEM fn std::intrinsics::drop_in_place::<(u32, Struct)> - shim(Some((u32, Struct))) @@ local_drop_glue-fallback.cgu[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place::<(u32, Struct)> - shim(Some((u32, Struct))) @@ local_drop_glue-fallback.cgu[Internal] _b: (u32, Struct), } diff --git a/src/test/codegen-units/partitioning/vtable-through-const.rs b/src/test/codegen-units/partitioning/vtable-through-const.rs index 03dbac6179..8028c4f5f0 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 start #[start] fn start(_: isize, _: *const *const u8) -> isize { - //~ MONO_ITEM fn std::intrinsics::drop_in_place:: - shim(None) @@ vtable_through_const[Internal] + //~ MONO_ITEM fn std::ptr::drop_in_place:: - shim(None) @@ 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/asm-sanitize-llvm.rs b/src/test/codegen/asm-sanitize-llvm.rs new file mode 100644 index 0000000000..fe09caa697 --- /dev/null +++ b/src/test/codegen/asm-sanitize-llvm.rs @@ -0,0 +1,32 @@ +// FIXME(nagisa): remove the flags here once all targets support `asm!`. +// compile-flags: --target x86_64-unknown-linux-gnu + +// Verify we sanitize the special tokens for the LLVM inline-assembly, ensuring people won't +// inadvertently rely on the LLVM-specific syntax and features. +#![no_core] +#![feature(no_core, lang_items, rustc_attrs)] +#![crate_type = "rlib"] + +#[rustc_builtin_macro] +macro_rules! asm { + () => {}; +} + +#[lang = "sized"] +trait Sized {} +#[lang = "copy"] +trait Copy {} + +pub unsafe fn we_escape_dollar_signs() { + // CHECK: call void asm sideeffect alignstack inteldialect "banana$$:" + asm!( + r"banana$:", + ) +} + +pub unsafe fn we_escape_escapes_too() { + // CHECK: call void asm sideeffect alignstack inteldialect "banana\{{(\\|5C)}}36:" + asm!( + r"banana\36:", + ) +} diff --git a/src/test/codegen/codemodels.rs b/src/test/codegen/codemodels.rs new file mode 100644 index 0000000000..2328f5feb4 --- /dev/null +++ b/src/test/codegen/codemodels.rs @@ -0,0 +1,20 @@ +// only-x86_64 + +// revisions: NOMODEL MODEL-SMALL MODEL-KERNEL MODEL-MEDIUM MODEL-LARGE +//[NOMODEL] compile-flags: +//[MODEL-SMALL] compile-flags: -C code-model=small +//[MODEL-KERNEL] compile-flags: -C code-model=kernel +//[MODEL-MEDIUM] compile-flags: -C code-model=medium +//[MODEL-LARGE] compile-flags: -C code-model=large + +#![crate_type = "lib"] + +// MODEL-SMALL: !llvm.module.flags = !{{{.*}}} +// MODEL-SMALL: !{{[0-9]+}} = !{i32 1, !"Code Model", i32 1} +// MODEL-KERNEL: !llvm.module.flags = !{{{.*}}} +// MODEL-KERNEL: !{{[0-9]+}} = !{i32 1, !"Code Model", i32 2} +// MODEL-MEDIUM: !llvm.module.flags = !{{{.*}}} +// MODEL-MEDIUM: !{{[0-9]+}} = !{i32 1, !"Code Model", i32 3} +// MODEL-LARGE: !llvm.module.flags = !{{{.*}}} +// MODEL-LARGE: !{{[0-9]+}} = !{i32 1, !"Code Model", i32 4} +// NOMODEL-NOT: Code Model diff --git a/src/test/codegen/debug-compile-unit-path.rs b/src/test/codegen/debug-compile-unit-path.rs new file mode 100644 index 0000000000..fcb66e0857 --- /dev/null +++ b/src/test/codegen/debug-compile-unit-path.rs @@ -0,0 +1,9 @@ +// compile-flags: -g --remap-path-prefix={{cwd}}=/cwd/ --remap-path-prefix={{src-base}}=/base/ +// ignore-tidy-linelength +// +// Ensure that we remap the compile unit directory and that we set it to the compilers current +// working directory and not something else. +#![crate_type="rlib"] + +// CHECK-DAG: [[FILE:![0-9]*]] = !DIFile(filename: "/base/debug-compile-unit-path.rs{{.*}}", directory: "/cwd/") +// CHECK-DAG: {{![0-9]*}} = distinct !DICompileUnit({{.*}}file: [[FILE]] diff --git a/src/test/codegen/drop.rs b/src/test/codegen/drop.rs index 99a791464a..b35d5c8355 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::intrinsics::drop_in_place::` +// comment, that's `; call core::ptr::drop_in_place::` // for the `v0` mangling, should switch to matching on that once `legacy` is gone. // CHECK-NOT: call void @{{.*}}drop_in_place{{.*}}SomeUniqueName // CHECK: invoke void @{{.*}}drop_in_place{{.*}}SomeUniqueName diff --git a/src/test/codegen/enum-bounds-check-issue-82871.rs b/src/test/codegen/enum-bounds-check-issue-82871.rs new file mode 100644 index 0000000000..e779e2ef27 --- /dev/null +++ b/src/test/codegen/enum-bounds-check-issue-82871.rs @@ -0,0 +1,16 @@ +// compile-flags: -O +// min-llvm-version: 11.0 + +#![crate_type = "lib"] + +#[repr(C)] +pub enum E { + A, +} + +// CHECK-LABEL: @index +#[no_mangle] +pub fn index(x: &[u32; 3], ind: E) -> u32{ + // CHECK-NOT: panic_bounds_check + x[ind as usize] +} diff --git a/src/test/codegen/function-arguments.rs b/src/test/codegen/function-arguments.rs index 3511c7c518..a1da4faf5d 100644 --- a/src/test/codegen/function-arguments.rs +++ b/src/test/codegen/function-arguments.rs @@ -1,5 +1,6 @@ // compile-flags: -C no-prepopulate-passes // ignore-tidy-linelength +// min-system-llvm-version: 12.0 #![crate_type = "lib"] #![feature(rustc_attrs)] @@ -73,7 +74,7 @@ pub fn _box(x: Box) -> Box { x } -// CHECK: @struct_return(%S* noalias nocapture sret dereferenceable(32){{( %0)?}}) +// CHECK: @struct_return(%S* noalias nocapture sret(%S) dereferenceable(32){{( %0)?}}) #[no_mangle] pub fn struct_return() -> S { S { diff --git a/src/test/codegen/issue-59352.rs b/src/test/codegen/issue-59352.rs index 28bb859123..d271fe027e 100644 --- a/src/test/codegen/issue-59352.rs +++ b/src/test/codegen/issue-59352.rs @@ -5,8 +5,8 @@ // Once the optimizer can do that, mir-opt/issues/issue-59352.rs will need to be updated and this // test case should be removed as it will become redundant. -// mir-opt-level=2 enables inlining and enables LLVM to optimize away the unreachable panic call. -// compile-flags: -O -Z mir-opt-level=2 +// mir-opt-level=3 enables inlining and enables LLVM to optimize away the unreachable panic call. +// compile-flags: -O -Z mir-opt-level=3 #![crate_type = "rlib"] diff --git a/src/test/codegen/issue-73031.rs b/src/test/codegen/issue-73031.rs new file mode 100644 index 0000000000..6ba4d707f4 --- /dev/null +++ b/src/test/codegen/issue-73031.rs @@ -0,0 +1,27 @@ +// min-llvm-version: 12.0.0 +// compile-flags: -O +#![crate_type = "lib"] + +// Test that LLVM can eliminate the unreachable `All::None` branch. + +pub enum All { + None, + Foo, + Bar, +} + +// CHECK-LABEL: @issue_73031 +#[no_mangle] +pub fn issue_73031(a: &mut All, q: i32) -> i32 { + *a = if q == 5 { + All::Foo + } else { + All::Bar + }; + match *a { + // CHECK-NOT: panic + All::None => panic!(), + All::Foo => 1, + All::Bar => 2, + } +} diff --git a/src/test/codegen/issue-75525-bounds-checks.rs b/src/test/codegen/issue-75525-bounds-checks.rs new file mode 100644 index 0000000000..a03c63c1d0 --- /dev/null +++ b/src/test/codegen/issue-75525-bounds-checks.rs @@ -0,0 +1,27 @@ +// Regression test for #75525, verifies that no bounds checks are generated. + +// min-llvm-version: 12.0.0 +// compile-flags: -O + +#![crate_type = "lib"] + +// CHECK-LABEL: @f0 +// CHECK-NOT: panic +#[no_mangle] +pub fn f0(idx: usize, buf: &[u8; 10]) -> u8 { + if idx < 8 { buf[idx + 1] } else { 0 } +} + +// CHECK-LABEL: @f1 +// CHECK-NOT: panic +#[no_mangle] +pub fn f1(idx: usize, buf: &[u8; 10]) -> u8 { + if idx > 5 && idx < 8 { buf[idx - 1] } else { 0 } +} + +// CHECK-LABEL: @f2 +// CHECK-NOT: panic +#[no_mangle] +pub fn f2(idx: usize, buf: &[u8; 10]) -> u8 { + if idx > 5 && idx < 8 { buf[idx] } else { 0 } +} diff --git a/src/test/codegen/issue-75546.rs b/src/test/codegen/issue-75546.rs new file mode 100644 index 0000000000..49e4d4c7ec --- /dev/null +++ b/src/test/codegen/issue-75546.rs @@ -0,0 +1,16 @@ +// min-llvm-version: 12.0.0 +// compile-flags: -O +#![crate_type = "lib"] + +// Test that LLVM can eliminate the impossible `i == 0` check. + +// CHECK-LABEL: @issue_75546 +#[no_mangle] +pub fn issue_75546() { + let mut i = 1u32; + while i < u32::MAX { + // CHECK-NOT: panic + if i == 0 { panic!(); } + i += 1; + } +} diff --git a/src/test/codegen/issue-77812.rs b/src/test/codegen/issue-77812.rs new file mode 100644 index 0000000000..95042579ad --- /dev/null +++ b/src/test/codegen/issue-77812.rs @@ -0,0 +1,33 @@ +// min-llvm-version: 12.0.0 +// compile-flags: -O +#![crate_type = "lib"] + +// Test that LLVM can eliminate the unreachable `Variant::Zero` branch. + +#[derive(Copy, Clone, Eq, PartialEq)] +pub enum Variant { + Zero, + One, + Two, +} + +extern { + fn exf1(); + fn exf2(); +} + +pub static mut GLOBAL: Variant = Variant::Zero; + +// CHECK-LABEL: @issue_77812 +#[no_mangle] +pub unsafe fn issue_77812() { + let g = GLOBAL; + if g != Variant::Zero { + match g { + Variant::One => exf1(), + Variant::Two => exf2(), + // CHECK-NOT: panic + Variant::Zero => panic!(), + } + } +} diff --git a/src/test/codegen/loop.rs b/src/test/codegen/loop.rs deleted file mode 100644 index e54298eed0..0000000000 --- a/src/test/codegen/loop.rs +++ /dev/null @@ -1,15 +0,0 @@ -// compile-flags: -C opt-level=3 - -#![crate_type = "lib"] - -// CHECK-LABEL: @check_loop -#[no_mangle] -pub fn check_loop() -> u8 { - // CHECK-NOT: unreachable - call_looper() -} - -#[no_mangle] -fn call_looper() -> ! { - loop {} -} diff --git a/src/test/codegen/naked-noinline.rs b/src/test/codegen/naked-noinline.rs index 2a2208d4fc..d9e6f6c34e 100644 --- a/src/test/codegen/naked-noinline.rs +++ b/src/test/codegen/naked-noinline.rs @@ -1,5 +1,5 @@ // Checks that naked functions are never inlined. -// compile-flags: -O -Zmir-opt-level=2 +// compile-flags: -O -Zmir-opt-level=3 // ignore-wasm32 #![crate_type = "lib"] #![feature(asm)] diff --git a/src/test/codegen/non-terminate/infinite-loop-1.rs b/src/test/codegen/non-terminate/infinite-loop-1.rs index 56b360e0a7..8f9a53d19d 100644 --- a/src/test/codegen/non-terminate/infinite-loop-1.rs +++ b/src/test/codegen/non-terminate/infinite-loop-1.rs @@ -1,4 +1,5 @@ -// compile-flags: -C opt-level=3 -Z insert-sideeffect +// min-llvm-version: 12.0 +// compile-flags: -C opt-level=3 #![crate_type = "lib"] diff --git a/src/test/codegen/non-terminate/infinite-loop-2.rs b/src/test/codegen/non-terminate/infinite-loop-2.rs index 2921ab6dc0..a4c76de1e3 100644 --- a/src/test/codegen/non-terminate/infinite-loop-2.rs +++ b/src/test/codegen/non-terminate/infinite-loop-2.rs @@ -1,4 +1,5 @@ -// compile-flags: -C opt-level=3 -Z insert-sideeffect +// min-llvm-version: 12.0 +// compile-flags: -C opt-level=3 #![crate_type = "lib"] diff --git a/src/test/codegen/non-terminate/infinite-recursion.rs b/src/test/codegen/non-terminate/infinite-recursion.rs index 1f292ce379..ccb22afbc7 100644 --- a/src/test/codegen/non-terminate/infinite-recursion.rs +++ b/src/test/codegen/non-terminate/infinite-recursion.rs @@ -1,4 +1,5 @@ -// compile-flags: -C opt-level=3 -Z insert-sideeffect +// min-llvm-version: 12.0 +// compile-flags: -C opt-level=3 #![crate_type = "lib"] diff --git a/src/test/codegen/non-terminate/nonempty-infinite-loop.rs b/src/test/codegen/non-terminate/nonempty-infinite-loop.rs new file mode 100644 index 0000000000..896b7e8721 --- /dev/null +++ b/src/test/codegen/non-terminate/nonempty-infinite-loop.rs @@ -0,0 +1,29 @@ +// min-llvm-version: 12.0 +// compile-flags: -C opt-level=3 + +#![crate_type = "lib"] + +// Verify that we don't miscompile this even if rustc didn't apply the trivial loop detection to +// insert the sideeffect intrinsic. + +fn infinite_loop() -> u8 { + let mut x = 0; + // CHECK-NOT: sideeffect + loop { + if x == 42 { + x = 0; + } else { + x = 42; + } + } +} + +// CHECK-LABEL: @test +#[no_mangle] +fn test() -> u8 { + // CHECK-NOT: unreachable + // CHECK: br label %{{.+}} + // CHECK-NOT: unreachable + let x = infinite_loop(); + x +} diff --git a/src/test/codegen/packed.rs b/src/test/codegen/packed.rs index f3f5202206..c31e8457dc 100644 --- a/src/test/codegen/packed.rs +++ b/src/test/codegen/packed.rs @@ -52,7 +52,7 @@ pub struct BigPacked2 { #[no_mangle] pub fn call_pkd1(f: fn() -> Array) -> BigPacked1 { // CHECK: [[ALLOCA:%[_a-z0-9]+]] = alloca %Array -// CHECK: call void %{{.*}}(%Array* noalias nocapture sret dereferenceable(32) [[ALLOCA]]) +// CHECK: call void %{{.*}}(%Array* noalias nocapture sret{{.*}} dereferenceable(32) [[ALLOCA]]) // CHECK: call void @llvm.memcpy.{{.*}}(i8* align 1 %{{.*}}, i8* align 4 %{{.*}}, i{{[0-9]+}} 32, i1 false) // check that calls whose destination is a field of a packed struct // go through an alloca rather than calling the function with an @@ -64,7 +64,7 @@ pub fn call_pkd1(f: fn() -> Array) -> BigPacked1 { #[no_mangle] pub fn call_pkd2(f: fn() -> Array) -> BigPacked2 { // CHECK: [[ALLOCA:%[_a-z0-9]+]] = alloca %Array -// CHECK: call void %{{.*}}(%Array* noalias nocapture sret dereferenceable(32) [[ALLOCA]]) +// CHECK: call void %{{.*}}(%Array* noalias nocapture sret{{.*}} dereferenceable(32) [[ALLOCA]]) // CHECK: call void @llvm.memcpy.{{.*}}(i8* align 2 %{{.*}}, i8* align 4 %{{.*}}, i{{[0-9]+}} 32, i1 false) // check that calls whose destination is a field of a packed struct // go through an alloca rather than calling the function with an diff --git a/src/test/codegen/repr-transparent-aggregates-1.rs b/src/test/codegen/repr-transparent-aggregates-1.rs index 2b8d3c8bc1..847b94fac7 100644 --- a/src/test/codegen/repr-transparent-aggregates-1.rs +++ b/src/test/codegen/repr-transparent-aggregates-1.rs @@ -1,7 +1,7 @@ // compile-flags: -C no-prepopulate-passes // ignore-tidy-linelength -// min-system-llvm-version: 9.0 +// min-system-llvm-version: 12.0 // ignore-arm // ignore-aarch64 // ignore-mips @@ -34,19 +34,19 @@ pub enum TeBigS { Variant(BigS), } -// CHECK: define void @test_BigS(%BigS* [[BIGS_RET_ATTRS:.*]], %BigS* [[BIGS_ARG_ATTRS1:.*]] byval(%BigS) [[BIGS_ARG_ATTRS2:.*]]) +// CHECK: define void @test_BigS(%BigS* [[BIGS_RET_ATTRS1:.*]] sret(%BigS) [[BIGS_RET_ATTRS2:.*]], %BigS* [[BIGS_ARG_ATTRS1:.*]] byval(%BigS) [[BIGS_ARG_ATTRS2:.*]]) #[no_mangle] pub extern "C" fn test_BigS(_: BigS) -> BigS { loop {} } -// CHECK: define void @test_TsBigS(%TsBigS* [[BIGS_RET_ATTRS]], %TsBigS* [[BIGS_ARG_ATTRS1]] byval(%TsBigS) [[BIGS_ARG_ATTRS2:.*]]) +// CHECK: define void @test_TsBigS(%TsBigS* [[BIGS_RET_ATTRS1]] sret(%TsBigS) [[BIGS_RET_ATTRS2]], %TsBigS* [[BIGS_ARG_ATTRS1]] byval(%TsBigS) [[BIGS_ARG_ATTRS2:.*]]) #[no_mangle] pub extern "C" fn test_TsBigS(_: TsBigS) -> TsBigS { loop {} } -// CHECK: define void @test_TuBigS(%TuBigS* [[BIGS_RET_ATTRS]], %TuBigS* [[BIGS_ARG_ATTRS1]] byval(%TuBigS) [[BIGS_ARG_ATTRS2:.*]]) +// CHECK: define void @test_TuBigS(%TuBigS* [[BIGS_RET_ATTRS1]] sret(%TuBigS) [[BIGS_RET_ATTRS2]], %TuBigS* [[BIGS_ARG_ATTRS1]] byval(%TuBigS) [[BIGS_ARG_ATTRS2:.*]]) #[no_mangle] pub extern "C" fn test_TuBigS(_: TuBigS) -> TuBigS { loop {} } -// CHECK: define void @test_TeBigS(%"TeBigS::Variant"* [[BIGS_RET_ATTRS]], %"TeBigS::Variant"* [[BIGS_ARG_ATTRS1]] byval(%"TeBigS::Variant") [[BIGS_ARG_ATTRS2]]) +// CHECK: define void @test_TeBigS(%"TeBigS::Variant"* [[BIGS_RET_ATTRS1]] sret(%"TeBigS::Variant") [[BIGS_RET_ATTRS2]], %"TeBigS::Variant"* [[BIGS_ARG_ATTRS1]] byval(%"TeBigS::Variant") [[BIGS_ARG_ATTRS2]]) #[no_mangle] pub extern "C" fn test_TeBigS(_: TeBigS) -> TeBigS { loop {} } @@ -70,18 +70,18 @@ pub enum TeBigU { Variant(BigU), } -// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS:.*]], %BigU* [[BIGU_ARG_ATTRS1:.*]] byval(%BigU) [[BIGU_ARG_ATTRS2:.*]]) +// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS1:.*]] sret(%BigU) [[BIGU_RET_ATTRS2:.*]], %BigU* [[BIGU_ARG_ATTRS1:.*]] byval(%BigU) [[BIGU_ARG_ATTRS2:.*]]) #[no_mangle] pub extern "C" fn test_BigU(_: BigU) -> BigU { loop {} } -// CHECK: define void @test_TsBigU(%TsBigU* [[BIGU_RET_ATTRS:.*]], %TsBigU* [[BIGU_ARG_ATTRS1]] byval(%TsBigU) [[BIGU_ARG_ATTRS2]]) +// CHECK: define void @test_TsBigU(%TsBigU* [[BIGU_RET_ATTRS1:.*]] sret(%TsBigU) [[BIGU_RET_ATTRS2:.*]], %TsBigU* [[BIGU_ARG_ATTRS1]] byval(%TsBigU) [[BIGU_ARG_ATTRS2]]) #[no_mangle] pub extern "C" fn test_TsBigU(_: TsBigU) -> TsBigU { loop {} } -// CHECK: define void @test_TuBigU(%TuBigU* [[BIGU_RET_ATTRS]], %TuBigU* [[BIGU_ARG_ATTRS1]] byval(%TuBigU) [[BIGU_ARG_ATTRS2]]) +// CHECK: define void @test_TuBigU(%TuBigU* [[BIGU_RET_ATTRS1]] sret(%TuBigU) [[BIGU_RET_ATTRS2:.*]], %TuBigU* [[BIGU_ARG_ATTRS1]] byval(%TuBigU) [[BIGU_ARG_ATTRS2]]) #[no_mangle] pub extern "C" fn test_TuBigU(_: TuBigU) -> TuBigU { loop {} } -// CHECK: define void @test_TeBigU(%"TeBigU::Variant"* [[BIGU_RET_ATTRS]], %"TeBigU::Variant"* [[BIGU_ARG_ATTRS1]] byval(%"TeBigU::Variant") [[BIGU_ARG_ATTRS2]]) +// CHECK: define void @test_TeBigU(%"TeBigU::Variant"* [[BIGU_RET_ATTRS1]] sret(%"TeBigU::Variant") [[BIGU_RET_ATTRS2:.*]], %"TeBigU::Variant"* [[BIGU_ARG_ATTRS1]] byval(%"TeBigU::Variant") [[BIGU_ARG_ATTRS2]]) #[no_mangle] pub extern "C" fn test_TeBigU(_: TeBigU) -> TeBigU { loop {} } diff --git a/src/test/codegen/repr-transparent-aggregates-2.rs b/src/test/codegen/repr-transparent-aggregates-2.rs index 07e5af11f3..1fb12d92bd 100644 --- a/src/test/codegen/repr-transparent-aggregates-2.rs +++ b/src/test/codegen/repr-transparent-aggregates-2.rs @@ -1,5 +1,7 @@ // compile-flags: -C no-prepopulate-passes +// ignore-tidy-linelength +// min-system-llvm-version: 12.0 // ignore-aarch64 // ignore-emscripten // ignore-mips64 @@ -36,19 +38,19 @@ pub enum TeBigS { Variant(BigS), } -// CHECK: define void @test_BigS(%BigS* [[BIGS_RET_ATTRS:.*]], [16 x i32] +// CHECK: define void @test_BigS(%BigS* [[BIGS_RET_ATTRS1:.*]] sret(%BigS) [[BIGS_RET_ATTRS2:.*]], [16 x i32] #[no_mangle] pub extern fn test_BigS(_: BigS) -> BigS { loop {} } -// CHECK: define void @test_TsBigS(%TsBigS* [[BIGS_RET_ATTRS]], [16 x i32] +// CHECK: define void @test_TsBigS(%TsBigS* [[BIGS_RET_ATTRS1]] sret(%TsBigS) [[BIGS_RET_ATTRS2]], [16 x i32] #[no_mangle] pub extern fn test_TsBigS(_: TsBigS) -> TsBigS { loop {} } -// CHECK: define void @test_TuBigS(%TuBigS* [[BIGS_RET_ATTRS]], [16 x i32] +// CHECK: define void @test_TuBigS(%TuBigS* [[BIGS_RET_ATTRS1]] sret(%TuBigS) [[BIGS_RET_ATTRS2]], [16 x i32] #[no_mangle] pub extern fn test_TuBigS(_: TuBigS) -> TuBigS { loop {} } -// CHECK: define void @test_TeBigS(%"TeBigS::Variant"* [[BIGS_RET_ATTRS]], [16 x i32] +// CHECK: define void @test_TeBigS(%"TeBigS::Variant"* [[BIGS_RET_ATTRS1]] sret(%"TeBigS::Variant") [[BIGS_RET_ATTRS2]], [16 x i32] #[no_mangle] pub extern fn test_TeBigS(_: TeBigS) -> TeBigS { loop {} } @@ -72,18 +74,18 @@ pub enum TeBigU { Variant(BigU), } -// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS:.*]], [16 x i32] +// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS1:.*]] sret(%BigU) [[BIGU_RET_ATTRS2:.*]], [16 x i32] #[no_mangle] pub extern fn test_BigU(_: BigU) -> BigU { loop {} } -// CHECK: define void @test_TsBigU(%TsBigU* [[BIGU_RET_ATTRS:.*]], [16 x i32] +// CHECK: define void @test_TsBigU(%TsBigU* [[BIGU_RET_ATTRS1]] sret(%TsBigU) [[BIGU_RET_ATTRS2]], [16 x i32] #[no_mangle] pub extern fn test_TsBigU(_: TsBigU) -> TsBigU { loop {} } -// CHECK: define void @test_TuBigU(%TuBigU* [[BIGU_RET_ATTRS]], [16 x i32] +// CHECK: define void @test_TuBigU(%TuBigU* [[BIGU_RET_ATTRS1]] sret(%TuBigU) [[BIGU_RET_ATTRS2]], [16 x i32] #[no_mangle] pub extern fn test_TuBigU(_: TuBigU) -> TuBigU { loop {} } -// CHECK: define void @test_TeBigU(%"TeBigU::Variant"* [[BIGU_RET_ATTRS]], [16 x i32] +// CHECK: define void @test_TeBigU(%"TeBigU::Variant"* [[BIGU_RET_ATTRS1]] sret(%"TeBigU::Variant") [[BIGU_RET_ATTRS2]], [16 x i32] #[no_mangle] pub extern fn test_TeBigU(_: TeBigU) -> TeBigU { loop {} } diff --git a/src/test/codegen/repr-transparent-aggregates-3.rs b/src/test/codegen/repr-transparent-aggregates-3.rs index e538be6878..3381764bfc 100644 --- a/src/test/codegen/repr-transparent-aggregates-3.rs +++ b/src/test/codegen/repr-transparent-aggregates-3.rs @@ -1,5 +1,7 @@ // compile-flags: -C no-prepopulate-passes +// ignore-tidy-linelength +// min-system-llvm-version: 12.0 // only-mips64 // See repr-transparent.rs @@ -25,19 +27,19 @@ pub enum TeBigS { Variant(BigS), } -// CHECK: define void @test_BigS(%BigS* [[BIGS_RET_ATTRS:.*]], [8 x i64] +// CHECK: define void @test_BigS(%BigS* [[BIGS_RET_ATTRS1:.*]] sret(%BigS) [[BIGS_RET_ATTRS2:.*]], [8 x i64] #[no_mangle] pub extern fn test_BigS(_: BigS) -> BigS { loop {} } -// CHECK: define void @test_TsBigS(%TsBigS* [[BIGS_RET_ATTRS]], [8 x i64] +// CHECK: define void @test_TsBigS(%TsBigS* [[BIGS_RET_ATTRS1]] sret(%TsBigS) [[BIGS_RET_ATTRS2]], [8 x i64] #[no_mangle] pub extern fn test_TsBigS(_: TsBigS) -> TsBigS { loop {} } -// CHECK: define void @test_TuBigS(%TuBigS* [[BIGS_RET_ATTRS]], [8 x i64] +// CHECK: define void @test_TuBigS(%TuBigS* [[BIGS_RET_ATTRS1]] sret(%TuBigS) [[BIGS_RET_ATTRS2]], [8 x i64] #[no_mangle] pub extern fn test_TuBigS(_: TuBigS) -> TuBigS { loop {} } -// CHECK: define void @test_TeBigS(%"TeBigS::Variant"* [[BIGS_RET_ATTRS]], [8 x i64] +// CHECK: define void @test_TeBigS(%"TeBigS::Variant"* [[BIGS_RET_ATTRS1]] sret(%"TeBigS::Variant") [[BIGS_RET_ATTRS2]], [8 x i64] #[no_mangle] pub extern fn test_TeBigS(_: TeBigS) -> TeBigS { loop {} } @@ -61,18 +63,18 @@ pub enum TeBigU { Variant(BigU), } -// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS:.*]], [8 x i64] +// CHECK: define void @test_BigU(%BigU* [[BIGU_RET_ATTRS1:.*]] sret(%BigU) [[BIGU_RET_ATTRS2:.*]], [8 x i64] #[no_mangle] pub extern fn test_BigU(_: BigU) -> BigU { loop {} } -// CHECK: define void @test_TsBigU(%TsBigU* [[BIGU_RET_ATTRS:.*]], [8 x i64] +// CHECK: define void @test_TsBigU(%TsBigU* [[BIGU_RET_ATTRS1]] sret(%TsBigU) [[BIGU_RET_ATTRS2]], [8 x i64] #[no_mangle] pub extern fn test_TsBigU(_: TsBigU) -> TsBigU { loop {} } -// CHECK: define void @test_TuBigU(%TuBigU* [[BIGU_RET_ATTRS]], [8 x i64] +// CHECK: define void @test_TuBigU(%TuBigU* [[BIGU_RET_ATTRS1]] sret(%TuBigU) [[BIGU_RET_ATTRS2]], [8 x i64] #[no_mangle] pub extern fn test_TuBigU(_: TuBigU) -> TuBigU { loop {} } -// CHECK: define void @test_TeBigU(%"TeBigU::Variant"* [[BIGU_RET_ATTRS]], [8 x i64] +// CHECK: define void @test_TeBigU(%"TeBigU::Variant"* [[BIGU_RET_ATTRS1]] sret(%"TeBigU::Variant") [[BIGU_RET_ATTRS2]], [8 x i64] #[no_mangle] pub extern fn test_TeBigU(_: TeBigU) -> TeBigU { loop {} } diff --git a/src/test/codegen/sanitizer-no-sanitize-inlining.rs b/src/test/codegen/sanitizer-no-sanitize-inlining.rs index be0547afa4..f4af60baef 100644 --- a/src/test/codegen/sanitizer-no-sanitize-inlining.rs +++ b/src/test/codegen/sanitizer-no-sanitize-inlining.rs @@ -4,8 +4,8 @@ // needs-sanitizer-address // needs-sanitizer-leak // revisions: ASAN LSAN -//[ASAN] compile-flags: -Zsanitizer=address -C opt-level=3 -Z mir-opt-level=3 -//[LSAN] compile-flags: -Zsanitizer=leak -C opt-level=3 -Z mir-opt-level=3 +//[ASAN] compile-flags: -Zsanitizer=address -C opt-level=3 -Z mir-opt-level=4 +//[LSAN] compile-flags: -Zsanitizer=leak -C opt-level=3 -Z mir-opt-level=4 #![crate_type="lib"] #![feature(no_sanitize)] diff --git a/src/test/codegen/stack-probes.rs b/src/test/codegen/stack-probes.rs index 9bd351df3e..b05787df8e 100644 --- a/src/test/codegen/stack-probes.rs +++ b/src/test/codegen/stack-probes.rs @@ -13,10 +13,12 @@ // ignore-emscripten // ignore-windows // compile-flags: -C no-prepopulate-passes +// min-llvm-version: 11.0.1 #![crate_type = "lib"] #[no_mangle] pub fn foo() { // CHECK: @foo() unnamed_addr #0 +// CHECK: attributes #0 = { {{.*}}"probe-stack"="inline-asm"{{.*}} } } diff --git a/src/test/codegen/target-feature-multiple.rs b/src/test/codegen/target-feature-multiple.rs deleted file mode 100644 index f71a9c3c58..0000000000 --- a/src/test/codegen/target-feature-multiple.rs +++ /dev/null @@ -1,9 +0,0 @@ -// only-x86_64 -// compile-flags: -C target-feature=+sse2,-avx,+avx2 -C target-feature=+avx,-avx2 - -#![crate_type = "lib"] - -#[no_mangle] -pub fn foo() { - // CHECK: attributes #0 = { {{.*}}"target-features"="+sse2,-avx,+avx2,+avx,-avx2"{{.*}} } -} diff --git a/src/test/codegen/target-feature-on-functions.rs b/src/test/codegen/target-feature-on-functions.rs deleted file mode 100644 index d4d39d08b1..0000000000 --- a/src/test/codegen/target-feature-on-functions.rs +++ /dev/null @@ -1,9 +0,0 @@ -// only-x86_64 -// compile-flags: -C target-feature=+avx - -#![crate_type = "lib"] - -#[no_mangle] -pub fn foo() { - // CHECK: attributes #0 = { {{.*}}"target-features"="+avx"{{.*}} } -} diff --git a/src/test/codegen/target-feature-overrides.rs b/src/test/codegen/target-feature-overrides.rs new file mode 100644 index 0000000000..2c19cfd8c2 --- /dev/null +++ b/src/test/codegen/target-feature-overrides.rs @@ -0,0 +1,47 @@ +// revisions: COMPAT INCOMPAT +// needs-llvm-components: x86 +// compile-flags: --target=x86_64-unknown-linux-gnu -Copt-level=3 +// [COMPAT] compile-flags: -Ctarget-feature=+avx2,+avx +// [INCOMPAT] compile-flags: -Ctarget-feature=-avx2,-avx + +// See also src/test/assembly/target-feature-multiple.rs +#![feature(no_core, lang_items)] +#![crate_type = "lib"] +#![no_core] + + +#[lang = "sized"] +trait Sized {} +#[lang = "copy"] +trait Copy {} + +extern "C" { + fn peach() -> u32; +} + +#[inline] +#[target_feature(enable = "avx")] +#[no_mangle] +pub unsafe fn apple() -> u32 { +// CHECK-LABEL: @apple() +// CHECK-SAME: [[APPLEATTRS:#[0-9]+]] { +// CHECK: {{.*}}call{{.*}}@peach + peach() +} + +// target features same as global (not reflected or overriden in IR) +#[no_mangle] +pub unsafe fn banana() -> u32 { +// CHECK-LABEL: @banana() +// CHECK-SAME: [[BANANAATTRS:#[0-9]+]] { +// COMPAT: {{.*}}call{{.*}}@peach +// INCOMPAT: {{.*}}call{{.*}}@apple + apple() // Compatible for inline in COMPAT revision and can't be inlined in INCOMPAT +} + +// CHECK: attributes [[APPLEATTRS]] +// COMPAT-SAME: "target-features"="+avx2,+avx,+avx" +// INCOMPAT-SAME: "target-features"="-avx2,-avx,+avx" +// CHECK: attributes [[BANANAATTRS]] +// CHECK-NOT: target-features +// CHECK-SAME: } diff --git a/src/test/codegen/try_identity.rs b/src/test/codegen/try_identity.rs index d30b706eaf..81e2435e5b 100644 --- a/src/test/codegen/try_identity.rs +++ b/src/test/codegen/try_identity.rs @@ -1,4 +1,4 @@ -// compile-flags: -C no-prepopulate-passes -Z mir-opt-level=2 -Zunsound-mir-opts +// compile-flags: -C no-prepopulate-passes -O -Z mir-opt-level=3 -Zunsound-mir-opts // Ensure that `x?` has no overhead on `Result` due to identity `match`es in lowering. // This requires inlining to trigger the MIR optimizations in `SimplifyArmIdentity`. diff --git a/src/test/codegen/unwind-abis/c-unwind-abi-panic-abort.rs b/src/test/codegen/unwind-abis/c-unwind-abi-panic-abort.rs new file mode 100644 index 0000000000..afd65ff674 --- /dev/null +++ b/src/test/codegen/unwind-abis/c-unwind-abi-panic-abort.rs @@ -0,0 +1,18 @@ +// compile-flags: -C panic=abort -C opt-level=0 + +// Test that `nounwind` atributes are applied to `C-unwind` extern functions when the +// code is compiled with `panic=abort`. We disable optimizations above to prevent LLVM from +// inferring the attribute. + +#![crate_type = "lib"] +#![feature(c_unwind)] + +// CHECK: @rust_item_that_can_unwind() unnamed_addr #0 { +#[no_mangle] +pub extern "C-unwind" fn rust_item_that_can_unwind() { +} + +// Now, make sure that the LLVM attributes for this functions are correct. First, make +// sure that the first item is correctly marked with the `nounwind` attribute: +// +// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } diff --git a/src/test/codegen/unwind-abis/c-unwind-abi.rs b/src/test/codegen/unwind-abis/c-unwind-abi.rs new file mode 100644 index 0000000000..f157653675 --- /dev/null +++ b/src/test/codegen/unwind-abis/c-unwind-abi.rs @@ -0,0 +1,29 @@ +// compile-flags: -C opt-level=0 + +// Test that `nounwind` atributes are correctly applied to exported `C` and `C-unwind` extern +// functions. `C-unwind` functions MUST NOT have this attribute. We disable optimizations above +// to prevent LLVM from inferring the attribute. + +#![crate_type = "lib"] +#![feature(c_unwind)] + +// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { +#[no_mangle] +pub extern "C" fn rust_item_that_cannot_unwind() { +} + +// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { +#[no_mangle] +pub extern "C-unwind" fn rust_item_that_can_unwind() { +} + +// Now, make some assertions that the LLVM attributes for these functions are correct. First, make +// sure that the first item is correctly marked with the `nounwind` attribute: +// +// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } +// +// Next, let's assert that the second item, which CAN unwind, does not have this attribute. +// +// CHECK: attributes #1 = { +// CHECK-NOT: nounwind +// CHECK: } diff --git a/src/test/codegen/unwind-abis/stdcall-unwind-abi.rs b/src/test/codegen/unwind-abis/stdcall-unwind-abi.rs new file mode 100644 index 0000000000..ed804ca278 --- /dev/null +++ b/src/test/codegen/unwind-abis/stdcall-unwind-abi.rs @@ -0,0 +1,32 @@ +// compile-flags: -C opt-level=0 +// ignore-arm stdcall isn't supported +// ignore-aarch64 stdcall isn't supported +// ignore-riscv64 stdcall isn't supported + +// Test that `nounwind` atributes are correctly applied to exported `stdcall` and `stdcall-unwind` +// extern functions. `stdcall-unwind` functions MUST NOT have this attribute. We disable +// optimizations above to prevent LLVM from inferring the attribute. + +#![crate_type = "lib"] +#![feature(c_unwind)] + +// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { +#[no_mangle] +pub extern "stdcall" fn rust_item_that_cannot_unwind() { +} + +// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { +#[no_mangle] +pub extern "stdcall-unwind" fn rust_item_that_can_unwind() { +} + +// Now, make some assertions that the LLVM attributes for these functions are correct. First, make +// sure that the first item is correctly marked with the `nounwind` attribute: +// +// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } +// +// Next, let's assert that the second item, which CAN unwind, does not have this attribute. +// +// CHECK: attributes #1 = { +// CHECK-NOT: nounwind +// CHECK: } diff --git a/src/test/codegen/unwind-abis/system-unwind-abi.rs b/src/test/codegen/unwind-abis/system-unwind-abi.rs new file mode 100644 index 0000000000..c4d5132835 --- /dev/null +++ b/src/test/codegen/unwind-abis/system-unwind-abi.rs @@ -0,0 +1,29 @@ +// compile-flags: -C opt-level=0 + +// Test that `nounwind` atributes are correctly applied to exported `system` and `system-unwind` +// extern functions. `system-unwind` functions MUST NOT have this attribute. We disable +// optimizations above to prevent LLVM from inferring the attribute. + +#![crate_type = "lib"] +#![feature(c_unwind)] + +// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { +#[no_mangle] +pub extern "system" fn rust_item_that_cannot_unwind() { +} + +// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { +#[no_mangle] +pub extern "system-unwind" fn rust_item_that_can_unwind() { +} + +// Now, make some assertions that the LLVM attributes for these functions are correct. First, make +// sure that the first item is correctly marked with the `nounwind` attribute: +// +// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } +// +// Next, let's assert that the second item, which CAN unwind, does not have this attribute. +// +// CHECK: attributes #1 = { +// CHECK-NOT: nounwind +// CHECK: } diff --git a/src/test/codegen/unwind-abis/thiscall-unwind-abi.rs b/src/test/codegen/unwind-abis/thiscall-unwind-abi.rs new file mode 100644 index 0000000000..aaa63ae55c --- /dev/null +++ b/src/test/codegen/unwind-abis/thiscall-unwind-abi.rs @@ -0,0 +1,33 @@ +// compile-flags: -C opt-level=0 +// ignore-arm thiscall isn't supported +// ignore-aarch64 thiscall isn't supported +// ignore-riscv64 thiscall isn't supported + +// Test that `nounwind` atributes are correctly applied to exported `thiscall` and +// `thiscall-unwind` extern functions. `thiscall-unwind` functions MUST NOT have this attribute. We +// disable optimizations above to prevent LLVM from inferring the attribute. + +#![crate_type = "lib"] +#![feature(abi_thiscall)] +#![feature(c_unwind)] + +// CHECK: @rust_item_that_cannot_unwind() unnamed_addr #0 { +#[no_mangle] +pub extern "thiscall" fn rust_item_that_cannot_unwind() { +} + +// CHECK: @rust_item_that_can_unwind() unnamed_addr #1 { +#[no_mangle] +pub extern "thiscall-unwind" fn rust_item_that_can_unwind() { +} + +// Now, make some assertions that the LLVM attributes for these functions are correct. First, make +// sure that the first item is correctly marked with the `nounwind` attribute: +// +// CHECK: attributes #0 = { {{.*}}nounwind{{.*}} } +// +// Next, let's assert that the second item, which CAN unwind, does not have this attribute. +// +// CHECK: attributes #1 = { +// CHECK-NOT: nounwind +// CHECK: } diff --git a/src/test/incremental/cyclic-trait-hierarchy.rs b/src/test/incremental/cyclic-trait-hierarchy.rs index 03bb5eea76..b502e7207d 100644 --- a/src/test/incremental/cyclic-trait-hierarchy.rs +++ b/src/test/incremental/cyclic-trait-hierarchy.rs @@ -3,11 +3,11 @@ // revisions: rpass1 cfail2 #[cfg(rpass1)] -pub trait T2 { } +pub trait T2 {} #[cfg(cfail2)] -pub trait T2: T1 { } -//[cfail2]~^ ERROR cycle detected when computing the supertraits of `T2` +pub trait T2: T1 {} +//[cfail2]~^ ERROR cycle detected when computing the super predicates of `T2` -pub trait T1: T2 { } +pub trait T1: T2 {} -fn main() { } +fn main() {} diff --git a/src/test/incremental/hashes/enum_defs.rs b/src/test/incremental/hashes/enum_defs.rs index 624870cc9e..c73c03ca14 100644 --- a/src/test/incremental/hashes/enum_defs.rs +++ b/src/test/incremental/hashes/enum_defs.rs @@ -335,7 +335,7 @@ enum EnumAddMustUse { } #[cfg(not(cfail1))] -#[rustc_clean(cfg="cfail2", except="hir_owner,hir_owner_nodes")] +#[rustc_clean(cfg="cfail2")] #[rustc_clean(cfg="cfail3")] #[must_use] enum EnumAddMustUse { @@ -353,7 +353,7 @@ enum EnumAddReprC { } #[cfg(not(cfail1))] -#[rustc_clean(cfg="cfail2", except="hir_owner,hir_owner_nodes,type_of")] +#[rustc_clean(cfg="cfail2", except="type_of")] #[rustc_clean(cfg="cfail3")] #[repr(C)] enum EnumAddReprC { diff --git a/src/test/incremental/hashes/extern_mods.rs b/src/test/incremental/hashes/extern_mods.rs index dd77516775..7a92313433 100644 --- a/src/test/incremental/hashes/extern_mods.rs +++ b/src/test/incremental/hashes/extern_mods.rs @@ -154,7 +154,7 @@ extern "C" { } #[cfg(not(cfail1))] -#[rustc_dirty(cfg = "cfail2", except = "hir_owner_nodes")] +#[rustc_dirty(cfg = "cfail2", except = "hir_owner,hir_owner_nodes")] #[rustc_clean(cfg = "cfail3")] #[link_args = "-foo -bar -baz"] extern "C" { @@ -169,7 +169,7 @@ extern "C" { } #[cfg(not(cfail1))] -#[rustc_dirty(cfg = "cfail2", except = "hir_owner_nodes")] +#[rustc_dirty(cfg = "cfail2", except = "hir_owner,hir_owner_nodes")] #[rustc_clean(cfg = "cfail3")] #[link(name = "bar")] extern "C" { diff --git a/src/test/incremental/hashes/function_interfaces.rs b/src/test/incremental/hashes/function_interfaces.rs index 706cbcf4ca..ed67b2dcb0 100644 --- a/src/test/incremental/hashes/function_interfaces.rs +++ b/src/test/incremental/hashes/function_interfaces.rs @@ -194,7 +194,7 @@ pub fn second_lifetime_bound<'a, 'b, T: 'a + 'b>() {} pub fn inline() {} #[cfg(not(cfail1))] -#[rustc_clean(cfg = "cfail2", except = "hir_owner, hir_owner_nodes")] +#[rustc_clean(cfg = "cfail2")] #[rustc_clean(cfg = "cfail3")] #[inline] pub fn inline() {} @@ -206,7 +206,7 @@ pub fn inline() {} pub fn inline_never() {} #[cfg(not(cfail1))] -#[rustc_clean(cfg = "cfail2", except = "hir_owner, hir_owner_nodes")] +#[rustc_clean(cfg = "cfail2")] #[rustc_clean(cfg = "cfail3")] #[inline(never)] pub fn inline_never() {} @@ -217,7 +217,7 @@ pub fn inline_never() {} pub fn no_mangle() {} #[cfg(not(cfail1))] -#[rustc_clean(cfg = "cfail2", except = "hir_owner, hir_owner_nodes")] +#[rustc_clean(cfg = "cfail2")] #[rustc_clean(cfg = "cfail3")] #[no_mangle] pub fn no_mangle() {} @@ -228,7 +228,7 @@ pub fn no_mangle() {} pub fn linkage() {} #[cfg(not(cfail1))] -#[rustc_clean(cfg = "cfail2", except = "hir_owner, hir_owner_nodes")] +#[rustc_clean(cfg = "cfail2")] #[rustc_clean(cfg = "cfail3")] #[linkage = "weak_odr"] pub fn linkage() {} diff --git a/src/test/incremental/hashes/inherent_impls.rs b/src/test/incremental/hashes/inherent_impls.rs index 2e98abae58..ae8f2ace21 100644 --- a/src/test/incremental/hashes/inherent_impls.rs +++ b/src/test/incremental/hashes/inherent_impls.rs @@ -214,7 +214,7 @@ impl Foo { #[rustc_clean(cfg="cfail2")] #[rustc_clean(cfg="cfail3")] impl Foo { - #[rustc_clean(cfg="cfail2", except="hir_owner,hir_owner_nodes")] + #[rustc_clean(cfg="cfail2")] #[rustc_clean(cfg="cfail3")] #[inline] pub fn make_method_inline(&self) -> u8 { 0 } @@ -431,7 +431,7 @@ impl Foo { #[rustc_clean(cfg="cfail2")] #[rustc_clean(cfg="cfail3")] impl Foo { - #[rustc_clean(cfg="cfail2", except="hir_owner,hir_owner_nodes")] + #[rustc_clean(cfg="cfail2")] #[rustc_clean(cfg="cfail3")] #[no_mangle] pub fn add_no_mangle_to_method(&self) { } diff --git a/src/test/incremental/hashes/statics.rs b/src/test/incremental/hashes/statics.rs index caf4e12cc4..6f4089c60f 100644 --- a/src/test/incremental/hashes/statics.rs +++ b/src/test/incremental/hashes/statics.rs @@ -41,7 +41,7 @@ static mut STATIC_MUTABILITY: u8 = 0; static STATIC_LINKAGE: u8 = 0; #[cfg(not(cfail1))] -#[rustc_clean(cfg="cfail2", except="hir_owner,hir_owner_nodes")] +#[rustc_clean(cfg="cfail2")] #[rustc_clean(cfg="cfail3")] #[linkage="weak_odr"] static STATIC_LINKAGE: u8 = 0; @@ -52,7 +52,7 @@ static STATIC_LINKAGE: u8 = 0; static STATIC_NO_MANGLE: u8 = 0; #[cfg(not(cfail1))] -#[rustc_clean(cfg="cfail2", except="hir_owner,hir_owner_nodes")] +#[rustc_clean(cfg="cfail2")] #[rustc_clean(cfg="cfail3")] #[no_mangle] static STATIC_NO_MANGLE: u8 = 0; @@ -63,7 +63,7 @@ static STATIC_NO_MANGLE: u8 = 0; static STATIC_THREAD_LOCAL: u8 = 0; #[cfg(not(cfail1))] -#[rustc_clean(cfg="cfail2", except="hir_owner,hir_owner_nodes")] +#[rustc_clean(cfg="cfail2")] #[rustc_clean(cfg="cfail3")] #[thread_local] static STATIC_THREAD_LOCAL: u8 = 0; diff --git a/src/test/incremental/hashes/struct_defs.rs b/src/test/incremental/hashes/struct_defs.rs index a42bd9261f..1339a1e5bf 100644 --- a/src/test/incremental/hashes/struct_defs.rs +++ b/src/test/incremental/hashes/struct_defs.rs @@ -24,8 +24,8 @@ pub struct LayoutPacked; #[cfg(not(cfail1))] -#[rustc_dirty(label="hir_owner", cfg="cfail2")] -#[rustc_dirty(label="hir_owner_nodes", cfg="cfail2")] +#[rustc_clean(label="hir_owner", cfg="cfail2")] +#[rustc_clean(label="hir_owner_nodes", cfg="cfail2")] #[rustc_dirty(label="type_of", cfg="cfail2")] #[rustc_clean(label="generics_of", cfg="cfail2")] #[rustc_clean(label="predicates_of", cfg="cfail2")] @@ -41,8 +41,8 @@ pub struct LayoutPacked; struct LayoutC; #[cfg(not(cfail1))] -#[rustc_dirty(label="hir_owner", cfg="cfail2")] -#[rustc_dirty(label="hir_owner_nodes", cfg="cfail2")] +#[rustc_clean(label="hir_owner", cfg="cfail2")] +#[rustc_clean(label="hir_owner_nodes", cfg="cfail2")] #[rustc_dirty(label="type_of", cfg="cfail2")] #[rustc_clean(label="generics_of", cfg="cfail2")] #[rustc_clean(label="predicates_of", cfg="cfail2")] diff --git a/src/test/incremental/hashes/trait_impls.rs b/src/test/incremental/hashes/trait_impls.rs index ddec6ff8ee..e9118da5a6 100644 --- a/src/test/incremental/hashes/trait_impls.rs +++ b/src/test/incremental/hashes/trait_impls.rs @@ -457,7 +457,7 @@ impl AddNoMangleToMethod for Foo { #[rustc_clean(label="hir_owner", cfg="cfail2")] #[rustc_clean(label="hir_owner", cfg="cfail3")] impl AddNoMangleToMethod for Foo { - #[rustc_dirty(label="hir_owner", cfg="cfail2")] + #[rustc_clean(label="hir_owner", cfg="cfail2")] #[rustc_clean(label="hir_owner", cfg="cfail3")] #[no_mangle] fn add_no_mangle_to_method(&self) { } @@ -478,7 +478,7 @@ impl MakeMethodInline for Foo { #[rustc_clean(label="hir_owner", cfg="cfail2")] #[rustc_clean(label="hir_owner", cfg="cfail3")] impl MakeMethodInline for Foo { - #[rustc_dirty(label="hir_owner", cfg="cfail2")] + #[rustc_clean(label="hir_owner", cfg="cfail2")] #[rustc_clean(label="hir_owner", cfg="cfail3")] #[inline] fn make_method_inline(&self) -> u8 { 0 } diff --git a/src/test/incremental/issue-82920-predicate-order-miscompile.rs b/src/test/incremental/issue-82920-predicate-order-miscompile.rs new file mode 100644 index 0000000000..793af679c9 --- /dev/null +++ b/src/test/incremental/issue-82920-predicate-order-miscompile.rs @@ -0,0 +1,31 @@ +// revisions: rpass1 rpass2 + +trait MyTrait: One + Two {} +impl One for T { + fn method_one(&self) -> usize { + 1 + } +} +impl Two for T { + fn method_two(&self) -> usize { + 2 + } +} +impl MyTrait for T {} + +fn main() { + let a: &dyn MyTrait = &true; + assert_eq!(a.method_one(), 1); + assert_eq!(a.method_two(), 2); +} + +// Re-order traits 'One' and 'Two' between compilation +// sessions + +#[cfg(rpass1)] +trait One { fn method_one(&self) -> usize; } + +trait Two { fn method_two(&self) -> usize; } + +#[cfg(rpass2)] +trait One { fn method_one(&self) -> usize; } diff --git a/src/test/mir-opt/const_goto.issue_77355_opt.ConstGoto.diff b/src/test/mir-opt/const_goto.issue_77355_opt.ConstGoto.diff new file mode 100644 index 0000000000..ddb9a8034e --- /dev/null +++ b/src/test/mir-opt/const_goto.issue_77355_opt.ConstGoto.diff @@ -0,0 +1,52 @@ +- // MIR for `issue_77355_opt` before ConstGoto ++ // MIR for `issue_77355_opt` after ConstGoto + + fn issue_77355_opt(_1: Foo) -> u64 { + debug num => _1; // in scope 0 at $DIR/const_goto.rs:11:20: 11:23 + let mut _0: u64; // return place in scope 0 at $DIR/const_goto.rs:11:33: 11:36 +- let mut _2: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL +- let mut _3: isize; // in scope 0 at $DIR/const_goto.rs:12:22: 12:28 ++ let mut _2: isize; // in scope 0 at $DIR/const_goto.rs:12:22: 12:28 + + bb0: { +- StorageLive(_2); // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL +- _3 = discriminant(_1); // scope 0 at $DIR/const_goto.rs:12:22: 12:28 +- switchInt(move _3) -> [1_isize: bb2, 2_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/const_goto.rs:12:22: 12:28 ++ _2 = discriminant(_1); // scope 0 at $DIR/const_goto.rs:12:22: 12:28 ++ switchInt(move _2) -> [1_isize: bb2, 2_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/const_goto.rs:12:22: 12:28 + } + + bb1: { +- _2 = const false; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL +- goto -> bb3; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL ++ _0 = const 42_u64; // scope 0 at $DIR/const_goto.rs:12:53: 12:55 ++ goto -> bb3; // scope 0 at $DIR/const_goto.rs:12:5: 12:57 + } + + bb2: { +- _2 = const true; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL +- goto -> bb3; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL +- } +- +- bb3: { +- switchInt(move _2) -> [false: bb5, otherwise: bb4]; // scope 0 at $DIR/const_goto.rs:12:5: 12:57 +- } +- +- bb4: { + _0 = const 23_u64; // scope 0 at $DIR/const_goto.rs:12:41: 12:43 +- goto -> bb6; // scope 0 at $DIR/const_goto.rs:12:5: 12:57 ++ goto -> bb3; // scope 0 at $DIR/const_goto.rs:12:5: 12:57 + } + +- bb5: { +- _0 = const 42_u64; // scope 0 at $DIR/const_goto.rs:12:53: 12:55 +- goto -> bb6; // scope 0 at $DIR/const_goto.rs:12:5: 12:57 +- } +- +- bb6: { +- StorageDead(_2); // scope 0 at $DIR/const_goto.rs:12:56: 12:57 ++ bb3: { + return; // scope 0 at $DIR/const_goto.rs:13:2: 13:2 + } + } + diff --git a/src/test/mir-opt/const_goto.rs b/src/test/mir-opt/const_goto.rs new file mode 100644 index 0000000000..939902e70e --- /dev/null +++ b/src/test/mir-opt/const_goto.rs @@ -0,0 +1,16 @@ +pub enum Foo { + A, + B, + C, + D, + E, + F, +} + +// EMIT_MIR const_goto.issue_77355_opt.ConstGoto.diff +fn issue_77355_opt(num: Foo) -> u64 { + if matches!(num, Foo::B | Foo::C) { 23 } else { 42 } +} +fn main() { + issue_77355_opt(Foo::A); +} diff --git a/src/test/mir-opt/const_goto_const_eval_fail.f.ConstGoto.diff b/src/test/mir-opt/const_goto_const_eval_fail.f.ConstGoto.diff new file mode 100644 index 0000000000..f0103fc420 --- /dev/null +++ b/src/test/mir-opt/const_goto_const_eval_fail.f.ConstGoto.diff @@ -0,0 +1,51 @@ +- // MIR for `f` before ConstGoto ++ // MIR for `f` after ConstGoto + + fn f() -> u64 { + let mut _0: u64; // return place in scope 0 at $DIR/const_goto_const_eval_fail.rs:6:44: 6:47 + let mut _1: bool; // in scope 0 at $DIR/const_goto_const_eval_fail.rs:7:11: 12:6 + let mut _2: i32; // in scope 0 at $DIR/const_goto_const_eval_fail.rs:8:15: 8:16 + + bb0: { + StorageLive(_1); // scope 0 at $DIR/const_goto_const_eval_fail.rs:7:11: 12:6 + StorageLive(_2); // scope 0 at $DIR/const_goto_const_eval_fail.rs:8:15: 8:16 + _2 = const A; // scope 0 at $DIR/const_goto_const_eval_fail.rs:8:15: 8:16 + switchInt(_2) -> [1_i32: bb2, 2_i32: bb2, 3_i32: bb2, otherwise: bb1]; // scope 0 at $DIR/const_goto_const_eval_fail.rs:9:13: 9:14 + } + + bb1: { + _1 = const true; // scope 0 at $DIR/const_goto_const_eval_fail.rs:10:18: 10:22 + goto -> bb3; // scope 0 at $DIR/const_goto_const_eval_fail.rs:8:9: 11:10 + } + + bb2: { + _1 = const B; // scope 0 at $DIR/const_goto_const_eval_fail.rs:9:26: 9:27 +- goto -> bb3; // scope 0 at $DIR/const_goto_const_eval_fail.rs:8:9: 11:10 ++ switchInt(_1) -> [false: bb4, otherwise: bb3]; // scope 0 at $DIR/const_goto_const_eval_fail.rs:13:9: 13:14 + } + + bb3: { +- switchInt(_1) -> [false: bb5, otherwise: bb4]; // scope 0 at $DIR/const_goto_const_eval_fail.rs:13:9: 13:14 +- } +- +- bb4: { + _0 = const 2_u64; // scope 0 at $DIR/const_goto_const_eval_fail.rs:14:17: 14:18 +- goto -> bb6; // scope 0 at $DIR/const_goto_const_eval_fail.rs:7:5: 15:6 ++ goto -> bb5; // scope 0 at $DIR/const_goto_const_eval_fail.rs:7:5: 15:6 + } + +- bb5: { ++ bb4: { + _0 = const 1_u64; // scope 0 at $DIR/const_goto_const_eval_fail.rs:13:18: 13:19 +- goto -> bb6; // scope 0 at $DIR/const_goto_const_eval_fail.rs:7:5: 15:6 ++ goto -> bb5; // scope 0 at $DIR/const_goto_const_eval_fail.rs:7:5: 15:6 + } + +- bb6: { ++ bb5: { + StorageDead(_2); // scope 0 at $DIR/const_goto_const_eval_fail.rs:16:1: 16:2 + StorageDead(_1); // scope 0 at $DIR/const_goto_const_eval_fail.rs:16:1: 16:2 + return; // scope 0 at $DIR/const_goto_const_eval_fail.rs:16:2: 16:2 + } + } + diff --git a/src/test/mir-opt/const_goto_const_eval_fail.rs b/src/test/mir-opt/const_goto_const_eval_fail.rs new file mode 100644 index 0000000000..3b85fe6ab3 --- /dev/null +++ b/src/test/mir-opt/const_goto_const_eval_fail.rs @@ -0,0 +1,16 @@ +#![feature(min_const_generics)] +#![crate_type = "lib"] + +// If const eval fails, then don't crash +// EMIT_MIR const_goto_const_eval_fail.f.ConstGoto.diff +pub fn f() -> u64 { + match { + match A { + 1 | 2 | 3 => B, + _ => true, + } + } { + false => 1, + true => 2, + } +} diff --git a/src/test/mir-opt/const_prop/boolean_identities.rs b/src/test/mir-opt/const_prop/boolean_identities.rs index 6dae07dfbd..57164e3e79 100644 --- a/src/test/mir-opt/const_prop/boolean_identities.rs +++ b/src/test/mir-opt/const_prop/boolean_identities.rs @@ -1,4 +1,4 @@ -// compile-flags: -O -Zmir-opt-level=3 +// compile-flags: -O -Zmir-opt-level=4 // EMIT_MIR boolean_identities.test.ConstProp.diff pub fn test(x: bool, y: bool) -> bool { diff --git a/src/test/mir-opt/const_prop/control_flow_simplification.hello.PreCodegen.before.mir b/src/test/mir-opt/const_prop/control_flow_simplification.hello.PreCodegen.before.mir index c2f75e5dae..30512d0bbe 100644 --- a/src/test/mir-opt/const_prop/control_flow_simplification.hello.PreCodegen.before.mir +++ b/src/test/mir-opt/const_prop/control_flow_simplification.hello.PreCodegen.before.mir @@ -4,7 +4,6 @@ fn hello() -> () { let mut _0: (); // return place in scope 0 at $DIR/control-flow-simplification.rs:11:14: 11:14 bb0: { - _0 = const (); // scope 0 at $DIR/control-flow-simplification.rs:14:6: 14:6 return; // scope 0 at $DIR/control-flow-simplification.rs:15:2: 15:2 } } diff --git a/src/test/mir-opt/const_prop/issue-66971.rs b/src/test/mir-opt/const_prop/issue-66971.rs index 986177b5c0..81eccae46b 100644 --- a/src/test/mir-opt/const_prop/issue-66971.rs +++ b/src/test/mir-opt/const_prop/issue-66971.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=2 +// compile-flags: -Z mir-opt-level=3 // Due to a bug in propagating scalar pairs the assertion below used to fail. In the expected // outputs below, after ConstProp this is how _2 would look like with the bug: diff --git a/src/test/mir-opt/const_prop/issue-67019.rs b/src/test/mir-opt/const_prop/issue-67019.rs index d277bd5869..c78b8b9717 100644 --- a/src/test/mir-opt/const_prop/issue-67019.rs +++ b/src/test/mir-opt/const_prop/issue-67019.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=2 +// compile-flags: -Z mir-opt-level=3 // This used to ICE in const-prop diff --git a/src/test/mir-opt/const_prop/mult_by_zero.rs b/src/test/mir-opt/const_prop/mult_by_zero.rs index 1cb50155b5..b0ecdf1818 100644 --- a/src/test/mir-opt/const_prop/mult_by_zero.rs +++ b/src/test/mir-opt/const_prop/mult_by_zero.rs @@ -1,4 +1,4 @@ -// compile-flags: -O -Zmir-opt-level=3 +// compile-flags: -O -Zmir-opt-level=4 // EMIT_MIR mult_by_zero.test.ConstProp.diff fn test(x : i32) -> i32 { diff --git a/src/test/mir-opt/const_prop/optimizes_into_variable.main.SimplifyLocals.after.32bit.mir b/src/test/mir-opt/const_prop/optimizes_into_variable.main.SimplifyLocals.after.32bit.mir index a78a6341c2..c6f1d86ae3 100644 --- a/src/test/mir-opt/const_prop/optimizes_into_variable.main.SimplifyLocals.after.32bit.mir +++ b/src/test/mir-opt/const_prop/optimizes_into_variable.main.SimplifyLocals.after.32bit.mir @@ -22,7 +22,6 @@ fn main() -> () { _2 = const 3_i32; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 StorageLive(_3); // scope 2 at $DIR/optimizes_into_variable.rs:14:9: 14:10 _3 = const 42_u32; // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:38 - _0 = const (); // scope 0 at $DIR/optimizes_into_variable.rs:11:11: 15:2 StorageDead(_3); // scope 2 at $DIR/optimizes_into_variable.rs:15:1: 15:2 StorageDead(_2); // scope 1 at $DIR/optimizes_into_variable.rs:15:1: 15:2 StorageDead(_1); // scope 0 at $DIR/optimizes_into_variable.rs:15:1: 15:2 diff --git a/src/test/mir-opt/const_prop/optimizes_into_variable.main.SimplifyLocals.after.64bit.mir b/src/test/mir-opt/const_prop/optimizes_into_variable.main.SimplifyLocals.after.64bit.mir index a78a6341c2..c6f1d86ae3 100644 --- a/src/test/mir-opt/const_prop/optimizes_into_variable.main.SimplifyLocals.after.64bit.mir +++ b/src/test/mir-opt/const_prop/optimizes_into_variable.main.SimplifyLocals.after.64bit.mir @@ -22,7 +22,6 @@ fn main() -> () { _2 = const 3_i32; // scope 1 at $DIR/optimizes_into_variable.rs:13:13: 13:34 StorageLive(_3); // scope 2 at $DIR/optimizes_into_variable.rs:14:9: 14:10 _3 = const 42_u32; // scope 2 at $DIR/optimizes_into_variable.rs:14:13: 14:38 - _0 = const (); // scope 0 at $DIR/optimizes_into_variable.rs:11:11: 15:2 StorageDead(_3); // scope 2 at $DIR/optimizes_into_variable.rs:15:1: 15:2 StorageDead(_2); // scope 1 at $DIR/optimizes_into_variable.rs:15:1: 15:2 StorageDead(_1); // scope 0 at $DIR/optimizes_into_variable.rs:15:1: 15:2 diff --git a/src/test/mir-opt/deduplicate_blocks.is_line_doc_comment_2.DeduplicateBlocks.diff b/src/test/mir-opt/deduplicate_blocks.is_line_doc_comment_2.DeduplicateBlocks.diff new file mode 100644 index 0000000000..b0c97f4237 --- /dev/null +++ b/src/test/mir-opt/deduplicate_blocks.is_line_doc_comment_2.DeduplicateBlocks.diff @@ -0,0 +1,107 @@ +- // MIR for `is_line_doc_comment_2` before DeduplicateBlocks ++ // MIR for `is_line_doc_comment_2` after DeduplicateBlocks + + fn is_line_doc_comment_2(_1: &str) -> bool { + debug s => _1; // in scope 0 at $DIR/deduplicate_blocks.rs:2:36: 2:37 + let mut _0: bool; // return place in scope 0 at $DIR/deduplicate_blocks.rs:2:48: 2:52 + let mut _2: &[u8]; // in scope 0 at $DIR/deduplicate_blocks.rs:3:11: 3:23 + let mut _3: &str; // in scope 0 at $DIR/deduplicate_blocks.rs:3:11: 3:12 + let mut _4: usize; // in scope 0 at $DIR/deduplicate_blocks.rs:5:9: 5:31 + let mut _5: bool; // in scope 0 at $DIR/deduplicate_blocks.rs:5:9: 5:31 + let mut _6: usize; // in scope 0 at $DIR/deduplicate_blocks.rs:4:9: 4:37 + let mut _7: bool; // in scope 0 at $DIR/deduplicate_blocks.rs:4:9: 4:37 + scope 1 (inlined core::str::::as_bytes) { // at $DIR/deduplicate_blocks.rs:3:11: 3:23 + debug self => _3; // in scope 1 at $DIR/deduplicate_blocks.rs:3:11: 3:23 + let mut _8: &str; // in scope 1 at $DIR/deduplicate_blocks.rs:3:11: 3:23 + scope 2 { + } + } + + bb0: { + StorageLive(_2); // scope 0 at $DIR/deduplicate_blocks.rs:3:11: 3:23 + StorageLive(_3); // scope 0 at $DIR/deduplicate_blocks.rs:3:11: 3:12 + _3 = _1; // scope 0 at $DIR/deduplicate_blocks.rs:3:11: 3:12 + StorageLive(_8); // scope 2 at $DIR/deduplicate_blocks.rs:3:11: 3:23 + _8 = _3; // scope 2 at $DIR/deduplicate_blocks.rs:3:11: 3:23 +- _2 = transmute::<&str, &[u8]>(move _8) -> bb14; // scope 2 at $DIR/deduplicate_blocks.rs:3:11: 3:23 ++ _2 = transmute::<&str, &[u8]>(move _8) -> bb12; // scope 2 at $DIR/deduplicate_blocks.rs:3:11: 3:23 + // mir::Constant + // + span: $DIR/deduplicate_blocks.rs:3:11: 3:23 + // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(&str) -> &[u8] {std::intrinsics::transmute::<&str, &[u8]>}, val: Value(Scalar()) } + } + + bb1: { + switchInt((*_2)[0 of 4]) -> [47_u8: bb2, otherwise: bb5]; // scope 0 at $DIR/deduplicate_blocks.rs:4:10: 4:14 + } + + bb2: { + switchInt((*_2)[1 of 4]) -> [47_u8: bb3, otherwise: bb5]; // scope 0 at $DIR/deduplicate_blocks.rs:4:16: 4:20 + } + + bb3: { + switchInt((*_2)[2 of 4]) -> [47_u8: bb4, otherwise: bb5]; // scope 0 at $DIR/deduplicate_blocks.rs:4:22: 4:26 + } + + bb4: { +- switchInt((*_2)[3 of 4]) -> [47_u8: bb10, otherwise: bb5]; // scope 0 at $DIR/deduplicate_blocks.rs:4:28: 4:32 ++ switchInt((*_2)[3 of 4]) -> [47_u8: bb9, otherwise: bb5]; // scope 0 at $DIR/deduplicate_blocks.rs:4:28: 4:32 + } + + bb5: { + _4 = Len((*_2)); // scope 0 at $DIR/deduplicate_blocks.rs:5:9: 5:31 + _5 = Ge(move _4, const 3_usize); // scope 0 at $DIR/deduplicate_blocks.rs:5:9: 5:31 + switchInt(move _5) -> [false: bb9, otherwise: bb6]; // scope 0 at $DIR/deduplicate_blocks.rs:5:9: 5:31 + } + + bb6: { + switchInt((*_2)[0 of 3]) -> [47_u8: bb7, otherwise: bb9]; // scope 0 at $DIR/deduplicate_blocks.rs:5:10: 5:14 + } + + bb7: { + switchInt((*_2)[1 of 3]) -> [47_u8: bb8, otherwise: bb9]; // scope 0 at $DIR/deduplicate_blocks.rs:5:16: 5:20 + } + + bb8: { +- switchInt((*_2)[2 of 3]) -> [47_u8: bb11, 33_u8: bb12, otherwise: bb9]; // scope 0 at $DIR/deduplicate_blocks.rs:5:22: 5:26 ++ switchInt((*_2)[2 of 3]) -> [47_u8: bb10, 33_u8: bb10, otherwise: bb9]; // scope 0 at $DIR/deduplicate_blocks.rs:5:22: 5:26 + } + + bb9: { +- _0 = const false; // scope 0 at $DIR/deduplicate_blocks.rs:7:14: 7:19 +- goto -> bb13; // scope 0 at $DIR/deduplicate_blocks.rs:3:5: 8:6 +- } +- +- bb10: { + _0 = const false; // scope 0 at $DIR/deduplicate_blocks.rs:4:41: 4:46 +- goto -> bb13; // scope 0 at $DIR/deduplicate_blocks.rs:3:5: 8:6 ++ goto -> bb11; // scope 0 at $DIR/deduplicate_blocks.rs:3:5: 8:6 + } + +- bb11: { +- _0 = const true; // scope 0 at $DIR/deduplicate_blocks.rs:5:35: 5:39 +- goto -> bb13; // scope 0 at $DIR/deduplicate_blocks.rs:3:5: 8:6 +- } +- +- bb12: { ++ bb10: { + _0 = const true; // scope 0 at $DIR/deduplicate_blocks.rs:6:35: 6:39 +- goto -> bb13; // scope 0 at $DIR/deduplicate_blocks.rs:3:5: 8:6 ++ goto -> bb11; // scope 0 at $DIR/deduplicate_blocks.rs:3:5: 8:6 + } + +- bb13: { ++ bb11: { + StorageDead(_2); // scope 0 at $DIR/deduplicate_blocks.rs:9:1: 9:2 + return; // scope 0 at $DIR/deduplicate_blocks.rs:9:2: 9:2 + } + +- bb14: { ++ bb12: { + StorageDead(_8); // scope 2 at $DIR/deduplicate_blocks.rs:3:11: 3:23 + StorageDead(_3); // scope 0 at $DIR/deduplicate_blocks.rs:3:22: 3:23 + _6 = Len((*_2)); // scope 0 at $DIR/deduplicate_blocks.rs:4:9: 4:37 + _7 = Ge(move _6, const 4_usize); // scope 0 at $DIR/deduplicate_blocks.rs:4:9: 4:37 + switchInt(move _7) -> [false: bb5, otherwise: bb1]; // scope 0 at $DIR/deduplicate_blocks.rs:4:9: 4:37 + } + } + diff --git a/src/test/mir-opt/deduplicate_blocks.rs b/src/test/mir-opt/deduplicate_blocks.rs new file mode 100644 index 0000000000..f8f7361dc0 --- /dev/null +++ b/src/test/mir-opt/deduplicate_blocks.rs @@ -0,0 +1,13 @@ +// EMIT_MIR deduplicate_blocks.is_line_doc_comment_2.DeduplicateBlocks.diff +pub const fn is_line_doc_comment_2(s: &str) -> bool { + match s.as_bytes() { + [b'/', b'/', b'/', b'/', ..] => false, + [b'/', b'/', b'/', ..] => true, + [b'/', b'/', b'!', ..] => true, + _ => false, + } +} + +fn main() { + is_line_doc_comment_2("asd"); +} diff --git a/src/test/mir-opt/dest-prop/branch.rs b/src/test/mir-opt/dest-prop/branch.rs index 7e0e40671d..fffcf82b3f 100644 --- a/src/test/mir-opt/dest-prop/branch.rs +++ b/src/test/mir-opt/dest-prop/branch.rs @@ -1,5 +1,5 @@ //! Tests that assignment in both branches of an `if` are eliminated. - +// compile-flags: -Zunsound-mir-opts fn val() -> i32 { 1 } diff --git a/src/test/mir-opt/dest-prop/copy_propagation_arg.rs b/src/test/mir-opt/dest-prop/copy_propagation_arg.rs index b5188a8b4b..4179624778 100644 --- a/src/test/mir-opt/dest-prop/copy_propagation_arg.rs +++ b/src/test/mir-opt/dest-prop/copy_propagation_arg.rs @@ -1,6 +1,6 @@ // Check that DestinationPropagation does not propagate an assignment to a function argument // (doing so can break usages of the original argument value) - +// compile-flags: -Zunsound-mir-opts fn dummy(x: u8) -> u8 { x } diff --git a/src/test/mir-opt/dest-prop/cycle.main.DestinationPropagation.diff b/src/test/mir-opt/dest-prop/cycle.main.DestinationPropagation.diff index 1fbda50f78..621a747e13 100644 --- a/src/test/mir-opt/dest-prop/cycle.main.DestinationPropagation.diff +++ b/src/test/mir-opt/dest-prop/cycle.main.DestinationPropagation.diff @@ -56,7 +56,6 @@ StorageLive(_6); // scope 3 at $DIR/cycle.rs:14:10: 14:11 - _6 = _1; // scope 3 at $DIR/cycle.rs:14:10: 14:11 + _6 = _4; // scope 3 at $DIR/cycle.rs:14:10: 14:11 - _5 = const (); // scope 4 at $DIR/cycle.rs:14:5: 14:12 StorageDead(_6); // scope 3 at $DIR/cycle.rs:14:11: 14:12 StorageDead(_5); // scope 3 at $DIR/cycle.rs:14:12: 14:13 _0 = const (); // scope 0 at $DIR/cycle.rs:8:11: 15:2 diff --git a/src/test/mir-opt/dest-prop/cycle.rs b/src/test/mir-opt/dest-prop/cycle.rs index 7fbffb1335..c9187d4086 100644 --- a/src/test/mir-opt/dest-prop/cycle.rs +++ b/src/test/mir-opt/dest-prop/cycle.rs @@ -1,5 +1,5 @@ //! Tests that cyclic assignments don't hang DestinationPropagation, and result in reasonable code. - +// compile-flags: -Zunsound-mir-opts fn val() -> i32 { 1 } diff --git a/src/test/mir-opt/dest-prop/simple.rs b/src/test/mir-opt/dest-prop/simple.rs index 4655f96699..3627d479a9 100644 --- a/src/test/mir-opt/dest-prop/simple.rs +++ b/src/test/mir-opt/dest-prop/simple.rs @@ -1,5 +1,5 @@ //! Copy of `nrvo-simple.rs`, to ensure that full dest-prop handles it too. - +// compile-flags: -Zunsound-mir-opts // EMIT_MIR simple.nrvo.DestinationPropagation.diff fn nrvo(init: fn(&mut [u8; 1024])) -> [u8; 1024] { let mut buf = [0; 1024]; diff --git a/src/test/mir-opt/dest-prop/union.main.DestinationPropagation.diff b/src/test/mir-opt/dest-prop/union.main.DestinationPropagation.diff index 0ff3e4b2dc..a3368dcfcc 100644 --- a/src/test/mir-opt/dest-prop/union.main.DestinationPropagation.diff +++ b/src/test/mir-opt/dest-prop/union.main.DestinationPropagation.diff @@ -31,7 +31,6 @@ StorageLive(_3); // scope 1 at $DIR/union.rs:15:5: 15:27 StorageLive(_4); // scope 1 at $DIR/union.rs:15:10: 15:26 _4 = (_1.0: u32); // scope 2 at $DIR/union.rs:15:19: 15:24 - _3 = const (); // scope 3 at $DIR/union.rs:15:5: 15:27 StorageDead(_4); // scope 1 at $DIR/union.rs:15:26: 15:27 StorageDead(_3); // scope 1 at $DIR/union.rs:15:27: 15:28 _0 = const (); // scope 0 at $DIR/union.rs:8:11: 16:2 diff --git a/src/test/mir-opt/dest-prop/union.rs b/src/test/mir-opt/dest-prop/union.rs index b9d831389e..0ac9661a66 100644 --- a/src/test/mir-opt/dest-prop/union.rs +++ b/src/test/mir-opt/dest-prop/union.rs @@ -1,5 +1,5 @@ //! Tests that projections through unions cancel `DestinationPropagation`. - +// compile-flags: -Zunsound-mir-opts fn val() -> u32 { 1 } diff --git a/src/test/mir-opt/early_otherwise_branch.rs b/src/test/mir-opt/early_otherwise_branch.rs index 7700344208..b2caf7d7b8 100644 --- a/src/test/mir-opt/early_otherwise_branch.rs +++ b/src/test/mir-opt/early_otherwise_branch.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=3 +// compile-flags: -Z mir-opt-level=4 -Z unsound-mir-opts // EMIT_MIR early_otherwise_branch.opt1.EarlyOtherwiseBranch.diff fn opt1(x: Option, y: Option) -> u32 { match (x, y) { diff --git a/src/test/mir-opt/early_otherwise_branch_3_element_tuple.rs b/src/test/mir-opt/early_otherwise_branch_3_element_tuple.rs index 1d6877d67d..8527c01d75 100644 --- a/src/test/mir-opt/early_otherwise_branch_3_element_tuple.rs +++ b/src/test/mir-opt/early_otherwise_branch_3_element_tuple.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=3 +// compile-flags: -Z mir-opt-level=4 -Z unsound-mir-opts // EMIT_MIR early_otherwise_branch_3_element_tuple.opt1.EarlyOtherwiseBranch.diff fn opt1(x: Option, y: Option, z: Option) -> u32 { diff --git a/src/test/mir-opt/early_otherwise_branch_68867.rs b/src/test/mir-opt/early_otherwise_branch_68867.rs index b822c58f55..e11337643d 100644 --- a/src/test/mir-opt/early_otherwise_branch_68867.rs +++ b/src/test/mir-opt/early_otherwise_branch_68867.rs @@ -1,5 +1,5 @@ // ignore-tidy-linelength -// compile-flags: -Z mir-opt-level=3 -Zunsound-mir-opts +// compile-flags: -Z mir-opt-level=4 -Zunsound-mir-opts // example from #68867 type CSSFloat = f32; diff --git a/src/test/mir-opt/early_otherwise_branch_68867.try_sum.EarlyOtherwiseBranch.before-SimplifyBranches-final.after.diff b/src/test/mir-opt/early_otherwise_branch_68867.try_sum.EarlyOtherwiseBranch.before-SimplifyBranches-final.after.diff index f51a08ed73..1b292cdd79 100644 --- a/src/test/mir-opt/early_otherwise_branch_68867.try_sum.EarlyOtherwiseBranch.before-SimplifyBranches-final.after.diff +++ b/src/test/mir-opt/early_otherwise_branch_68867.try_sum.EarlyOtherwiseBranch.before-SimplifyBranches-final.after.diff @@ -1,7 +1,7 @@ - // MIR for `try_sum` before EarlyOtherwiseBranch + // MIR for `try_sum` after SimplifyBranches-final - fn try_sum(_1: &ViewportPercentageLength, _2: &ViewportPercentageLength) -> std::result::Result { + fn try_sum(_1: &ViewportPercentageLength, _2: &ViewportPercentageLength) -> Result { debug x => _1; // in scope 0 at $DIR/early_otherwise_branch_68867.rs:18:5: 18:6 debug other => _2; // in scope 0 at $DIR/early_otherwise_branch_68867.rs:19:5: 19:10 let mut _0: std::result::Result; // return place in scope 0 at $DIR/early_otherwise_branch_68867.rs:20:6: 20:42 diff --git a/src/test/mir-opt/early_otherwise_branch_68867.try_sum.EarlyOtherwiseBranch.diff b/src/test/mir-opt/early_otherwise_branch_68867.try_sum.EarlyOtherwiseBranch.diff index 05ef6721e6..d20ee78459 100644 --- a/src/test/mir-opt/early_otherwise_branch_68867.try_sum.EarlyOtherwiseBranch.diff +++ b/src/test/mir-opt/early_otherwise_branch_68867.try_sum.EarlyOtherwiseBranch.diff @@ -1,7 +1,7 @@ - // MIR for `try_sum` before EarlyOtherwiseBranch + // MIR for `try_sum` after EarlyOtherwiseBranch - fn try_sum(_1: &ViewportPercentageLength, _2: &ViewportPercentageLength) -> std::result::Result { + fn try_sum(_1: &ViewportPercentageLength, _2: &ViewportPercentageLength) -> Result { debug x => _1; // in scope 0 at $DIR/early_otherwise_branch_68867.rs:18:5: 18:6 debug other => _2; // in scope 0 at $DIR/early_otherwise_branch_68867.rs:19:5: 19:10 let mut _0: std::result::Result; // return place in scope 0 at $DIR/early_otherwise_branch_68867.rs:20:6: 20:42 diff --git a/src/test/mir-opt/early_otherwise_branch_noopt.rs b/src/test/mir-opt/early_otherwise_branch_noopt.rs index bd15f520df..aa9ddf485b 100644 --- a/src/test/mir-opt/early_otherwise_branch_noopt.rs +++ b/src/test/mir-opt/early_otherwise_branch_noopt.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=3 +// compile-flags: -Z mir-opt-level=4 // must not optimize as it does not follow the pattern of // left and right hand side being the same variant diff --git a/src/test/mir-opt/funky_arms.float_to_exponential_common.ConstProp.diff b/src/test/mir-opt/funky_arms.float_to_exponential_common.ConstProp.diff index bb79cd80e5..caa02abf01 100644 --- a/src/test/mir-opt/funky_arms.float_to_exponential_common.ConstProp.diff +++ b/src/test/mir-opt/funky_arms.float_to_exponential_common.ConstProp.diff @@ -1,7 +1,7 @@ - // MIR for `float_to_exponential_common` before ConstProp + // MIR for `float_to_exponential_common` after ConstProp - fn float_to_exponential_common(_1: &mut Formatter, _2: &T, _3: bool) -> std::result::Result<(), std::fmt::Error> { + fn float_to_exponential_common(_1: &mut Formatter, _2: &T, _3: bool) -> Result<(), std::fmt::Error> { debug fmt => _1; // in scope 0 at $DIR/funky_arms.rs:11:35: 11:38 debug num => _2; // in scope 0 at $DIR/funky_arms.rs:11:60: 11:63 debug upper => _3; // in scope 0 at $DIR/funky_arms.rs:11:69: 11:74 diff --git a/src/test/mir-opt/inline/inline-into-box-place.rs b/src/test/mir-opt/inline/inline-into-box-place.rs index 57298605b1..049a97816f 100644 --- a/src/test/mir-opt/inline/inline-into-box-place.rs +++ b/src/test/mir-opt/inline/inline-into-box-place.rs @@ -1,6 +1,6 @@ // ignore-endian-big // ignore-wasm32-bare compiled with panic=abort by default -// compile-flags: -Z mir-opt-level=3 +// compile-flags: -Z mir-opt-level=4 // EMIT_MIR_FOR_EACH_BIT_WIDTH #![feature(box_syntax)] // EMIT_MIR inline_into_box_place.main.Inline.diff diff --git a/src/test/mir-opt/inline/inline-trait-method_2.rs b/src/test/mir-opt/inline/inline-trait-method_2.rs index 6e5de8315a..378e71a256 100644 --- a/src/test/mir-opt/inline/inline-trait-method_2.rs +++ b/src/test/mir-opt/inline/inline-trait-method_2.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z span_free_formats -Z mir-opt-level=3 +// compile-flags: -Z span_free_formats -Z mir-opt-level=4 // EMIT_MIR inline_trait_method_2.test2.Inline.after.mir fn test2(x: &dyn X) -> bool { diff --git a/src/test/mir-opt/inline/inline_closure_captures.foo.Inline.after.mir b/src/test/mir-opt/inline/inline_closure_captures.foo.Inline.after.mir index a861eab39d..a7c2c93aad 100644 --- a/src/test/mir-opt/inline/inline_closure_captures.foo.Inline.after.mir +++ b/src/test/mir-opt/inline/inline_closure_captures.foo.Inline.after.mir @@ -17,7 +17,8 @@ fn foo(_1: T, _2: i32) -> (i32, T) { debug _q => _9; // in scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 debug q => (*((*_6).0: &i32)); // in scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 debug t => (*((*_6).1: &T)); // in scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 - let mut _10: T; // in scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 + let mut _10: i32; // in scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 + let mut _11: T; // in scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 } } @@ -39,10 +40,13 @@ fn foo(_1: T, _2: i32) -> (i32, T) { (_7.0: i32) = move _8; // scope 1 at $DIR/inline-closure-captures.rs:12:5: 12:9 StorageLive(_9); // scope 1 at $DIR/inline-closure-captures.rs:12:5: 12:9 _9 = move (_7.0: i32); // scope 1 at $DIR/inline-closure-captures.rs:12:5: 12:9 - (_0.0: i32) = (*((*_6).0: &i32)); // scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 StorageLive(_10); // scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 - _10 = (*((*_6).1: &T)); // scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 - (_0.1: T) = move _10; // scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 + _10 = (*((*_6).0: &i32)); // scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 + StorageLive(_11); // scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 + _11 = (*((*_6).1: &T)); // scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 + (_0.0: i32) = move _10; // scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 + (_0.1: T) = move _11; // scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 + StorageDead(_11); // scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 StorageDead(_10); // scope 2 at $DIR/inline-closure-captures.rs:12:5: 12:9 StorageDead(_9); // scope 1 at $DIR/inline-closure-captures.rs:12:5: 12:9 StorageDead(_8); // scope 1 at $DIR/inline-closure-captures.rs:12:8: 12:9 diff --git a/src/test/mir-opt/inline/inline_compatibility.inlined_no_sanitize.Inline.diff b/src/test/mir-opt/inline/inline_compatibility.inlined_no_sanitize.Inline.diff index c95cf47695..77eb326cd8 100644 --- a/src/test/mir-opt/inline/inline_compatibility.inlined_no_sanitize.Inline.diff +++ b/src/test/mir-opt/inline/inline_compatibility.inlined_no_sanitize.Inline.diff @@ -16,7 +16,6 @@ - } - - bb1: { -+ _1 = const (); // scope 1 at $DIR/inline-compatibility.rs:24:5: 24:18 StorageDead(_1); // scope 0 at $DIR/inline-compatibility.rs:24:18: 24:19 _0 = const (); // scope 0 at $DIR/inline-compatibility.rs:23:37: 25:2 return; // scope 0 at $DIR/inline-compatibility.rs:25:2: 25:2 diff --git a/src/test/mir-opt/inline/inline_compatibility.inlined_target_feature.Inline.diff b/src/test/mir-opt/inline/inline_compatibility.inlined_target_feature.Inline.diff index 2bb9283432..a32db48715 100644 --- a/src/test/mir-opt/inline/inline_compatibility.inlined_target_feature.Inline.diff +++ b/src/test/mir-opt/inline/inline_compatibility.inlined_target_feature.Inline.diff @@ -16,7 +16,6 @@ - } - - bb1: { -+ _1 = const (); // scope 1 at $DIR/inline-compatibility.rs:13:5: 13:21 StorageDead(_1); // scope 0 at $DIR/inline-compatibility.rs:13:21: 13:22 _0 = const (); // scope 0 at $DIR/inline-compatibility.rs:12:40: 14:2 return; // scope 0 at $DIR/inline-compatibility.rs:14:2: 14:2 diff --git a/src/test/mir-opt/inline/inline_cycle.two.Inline.diff b/src/test/mir-opt/inline/inline_cycle.two.Inline.diff index b44baca9bf..aaf65c5d0a 100644 --- a/src/test/mir-opt/inline/inline_cycle.two.Inline.diff +++ b/src/test/mir-opt/inline/inline_cycle.two.Inline.diff @@ -37,7 +37,6 @@ + StorageDead(_5); // scope 1 at $DIR/inline-cycle.rs:49:5: 49:12 + StorageDead(_4); // scope 1 at $DIR/inline-cycle.rs:49:5: 49:12 + StorageDead(_3); // scope 1 at $DIR/inline-cycle.rs:49:5: 49:12 -+ _1 = const (); // scope 1 at $DIR/inline-cycle.rs:49:5: 49:12 + StorageDead(_2); // scope 0 at $DIR/inline-cycle.rs:49:5: 49:12 StorageDead(_1); // scope 0 at $DIR/inline-cycle.rs:49:12: 49:13 _0 = const (); // scope 0 at $DIR/inline-cycle.rs:48:10: 50:2 diff --git a/src/test/mir-opt/inline/inline_diverging.h.Inline.diff b/src/test/mir-opt/inline/inline_diverging.h.Inline.diff index 07994eb3c1..e2fad5b60e 100644 --- a/src/test/mir-opt/inline/inline_diverging.h.Inline.diff +++ b/src/test/mir-opt/inline/inline_diverging.h.Inline.diff @@ -5,18 +5,20 @@ let mut _0: (); // return place in scope 0 at $DIR/inline-diverging.rs:21:12: 21:12 let _1: (!, !); // in scope 0 at $DIR/inline-diverging.rs:22:5: 22:22 + let mut _2: fn() -> ! {sleep}; // in scope 0 at $DIR/inline-diverging.rs:22:5: 22:22 -+ let mut _7: (); // in scope 0 at $DIR/inline-diverging.rs:22:5: 22:22 -+ let mut _8: (); // in scope 0 at $DIR/inline-diverging.rs:22:5: 22:22 ++ let mut _9: (); // in scope 0 at $DIR/inline-diverging.rs:22:5: 22:22 ++ let mut _10: (); // in scope 0 at $DIR/inline-diverging.rs:22:5: 22:22 + scope 1 (inlined call_twice:: ! {sleep}>) { // at $DIR/inline-diverging.rs:22:5: 22:22 + debug f => _2; // in scope 1 at $DIR/inline-diverging.rs:22:5: 22:22 + let _3: !; // in scope 1 at $DIR/inline-diverging.rs:22:5: 22:22 + let mut _4: &fn() -> ! {sleep}; // in scope 1 at $DIR/inline-diverging.rs:22:5: 22:22 -+ let mut _5: &fn() -> ! {sleep}; // in scope 1 at $DIR/inline-diverging.rs:22:5: 22:22 -+ let mut _6: !; // in scope 1 at $DIR/inline-diverging.rs:22:5: 22:22 ++ let mut _6: &fn() -> ! {sleep}; // in scope 1 at $DIR/inline-diverging.rs:22:5: 22:22 ++ let mut _7: !; // in scope 1 at $DIR/inline-diverging.rs:22:5: 22:22 ++ let mut _8: !; // in scope 1 at $DIR/inline-diverging.rs:22:5: 22:22 + scope 2 { + debug a => _3; // in scope 2 at $DIR/inline-diverging.rs:22:5: 22:22 ++ let _5: !; // in scope 2 at $DIR/inline-diverging.rs:22:5: 22:22 + scope 3 { -+ debug b => _6; // in scope 3 at $DIR/inline-diverging.rs:22:5: 22:22 ++ debug b => _5; // in scope 3 at $DIR/inline-diverging.rs:22:5: 22:22 + } + scope 6 (inlined ! {sleep} as Fn<()>>::call - shim(fn() -> ! {sleep})) { // at $DIR/inline-diverging.rs:22:5: 22:22 + scope 7 (inlined sleep) { // at $DIR/inline-diverging.rs:22:5: 22:22 @@ -40,13 +42,12 @@ - // mir::Constant // + span: $DIR/inline-diverging.rs:22:16: 22:21 // + literal: Const { ty: fn() -> ! {sleep}, val: Value(Scalar()) } -+ StorageLive(_6); // scope 0 at $DIR/inline-diverging.rs:22:5: 22:22 + StorageLive(_3); // scope 1 at $DIR/inline-diverging.rs:22:5: 22:22 + StorageLive(_4); // scope 1 at $DIR/inline-diverging.rs:22:5: 22:22 + _4 = &_2; // scope 1 at $DIR/inline-diverging.rs:22:5: 22:22 -+ StorageLive(_7); // scope 1 at $DIR/inline-diverging.rs:22:5: 22:22 -+ _7 = const (); // scope 1 at $DIR/inline-diverging.rs:22:5: 22:22 -+ goto -> bb1; // scope 5 at $DIR/inline-diverging.rs:22:5: 22:22 ++ StorageLive(_9); // scope 1 at $DIR/inline-diverging.rs:22:5: 22:22 ++ _9 = const (); // scope 1 at $DIR/inline-diverging.rs:22:5: 22:22 ++ goto -> bb1; // scope 4 at $DIR/inline-diverging.rs:22:5: 22:22 } bb1: { diff --git a/src/test/mir-opt/inline/inline_generator.main.Inline.diff b/src/test/mir-opt/inline/inline_generator.main.Inline.diff index 066ac8d82d..fba88c83eb 100644 --- a/src/test/mir-opt/inline/inline_generator.main.Inline.diff +++ b/src/test/mir-opt/inline/inline_generator.main.Inline.diff @@ -24,9 +24,12 @@ + } + } + scope 6 (inlined g::{closure#0}) { // at $DIR/inline-generator.rs:9:14: 9:46 -+ debug a => _8; // in scope 6 at $DIR/inline-generator.rs:9:14: 9:46 -+ let mut _8: bool; // in scope 6 at $DIR/inline-generator.rs:9:14: 9:46 -+ let mut _9: u32; // in scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ debug a => _11; // in scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ let mut _8: i32; // in scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ let mut _9: bool; // in scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ let mut _10: bool; // in scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ let _11: bool; // in scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ let mut _12: u32; // in scope 6 at $DIR/inline-generator.rs:9:14: 9:46 + } bb0: { @@ -65,16 +68,18 @@ - // + literal: Const { ty: for<'r> fn(std::pin::Pin<&'r mut impl std::ops::Generator>, bool) -> std::ops::GeneratorState< as std::ops::Generator>::Yield, as std::ops::Generator>::Return> { as std::ops::Generator>::resume}, val: Value(Scalar()) } + StorageLive(_7); // scope 0 at $DIR/inline-generator.rs:9:14: 9:46 + _7 = const false; // scope 0 at $DIR/inline-generator.rs:9:14: 9:46 -+ StorageLive(_8); // scope 0 at $DIR/inline-generator.rs:9:14: 9:46 -+ StorageLive(_9); // scope 0 at $DIR/inline-generator.rs:9:14: 9:46 -+ _9 = discriminant((*(_2.0: &mut [generator@$DIR/inline-generator.rs:15:5: 15:41 {bool, i32}]))); // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 -+ switchInt(move _9) -> [0_u32: bb3, 1_u32: bb8, 3_u32: bb7, otherwise: bb9]; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ StorageLive(_10); // scope 0 at $DIR/inline-generator.rs:9:14: 9:46 ++ StorageLive(_11); // scope 0 at $DIR/inline-generator.rs:9:14: 9:46 ++ StorageLive(_12); // scope 0 at $DIR/inline-generator.rs:9:14: 9:46 ++ _12 = discriminant((*(_2.0: &mut [generator@$DIR/inline-generator.rs:15:5: 15:41 {bool, i32}]))); // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ switchInt(move _12) -> [0_u32: bb3, 1_u32: bb8, 3_u32: bb7, otherwise: bb9]; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 } - bb3: { + bb1: { -+ StorageDead(_9); // scope 0 at $DIR/inline-generator.rs:9:14: 9:46 -+ StorageDead(_8); // scope 0 at $DIR/inline-generator.rs:9:14: 9:46 ++ StorageDead(_12); // scope 0 at $DIR/inline-generator.rs:9:14: 9:46 ++ StorageDead(_11); // scope 0 at $DIR/inline-generator.rs:9:14: 9:46 ++ StorageDead(_10); // scope 0 at $DIR/inline-generator.rs:9:14: 9:46 + StorageDead(_7); // scope 0 at $DIR/inline-generator.rs:9:14: 9:46 StorageDead(_2); // scope 0 at $DIR/inline-generator.rs:9:45: 9:46 StorageDead(_4); // scope 0 at $DIR/inline-generator.rs:9:46: 9:47 @@ -89,28 +94,36 @@ + } + + bb3: { -+ _8 = move _7; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 -+ switchInt(move _8) -> [false: bb5, otherwise: bb4]; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ _11 = move _7; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ StorageLive(_8); // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ StorageLive(_9); // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ _9 = _11; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ switchInt(move _9) -> [false: bb5, otherwise: bb4]; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 + } + + bb4: { -+ ((_1 as Yielded).0: i32) = const 7_i32; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ _8 = const 7_i32; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 + goto -> bb6; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 + } + + bb5: { -+ ((_1 as Yielded).0: i32) = const 13_i32; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ _8 = const 13_i32; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 + goto -> bb6; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 + } + + bb6: { ++ StorageDead(_9); // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ ((_1 as Yielded).0: i32) = move _8; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 + discriminant(_1) = 0; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 + discriminant((*(_2.0: &mut [generator@$DIR/inline-generator.rs:15:5: 15:41 {bool, i32}]))) = 3; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 + goto -> bb1; // scope 0 at $DIR/inline-generator.rs:15:11: 15:39 + } + + bb7: { -+ ((_1 as Complete).0: bool) = move _7; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ StorageLive(_8); // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ _10 = move _7; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ StorageDead(_8); // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 ++ ((_1 as Complete).0: bool) = move _10; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 + discriminant(_1) = 1; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 + discriminant((*(_2.0: &mut [generator@$DIR/inline-generator.rs:15:5: 15:41 {bool, i32}]))) = 1; // scope 6 at $DIR/inline-generator.rs:9:14: 9:46 + goto -> bb1; // scope 0 at $DIR/inline-generator.rs:15:41: 15:41 diff --git a/src/test/mir-opt/inline/inline_instruction_set.default.Inline.diff b/src/test/mir-opt/inline/inline_instruction_set.default.Inline.diff index 334cf5a08e..916244f1f6 100644 --- a/src/test/mir-opt/inline/inline_instruction_set.default.Inline.diff +++ b/src/test/mir-opt/inline/inline_instruction_set.default.Inline.diff @@ -36,7 +36,6 @@ - } - - bb3: { -+ _3 = const (); // scope 1 at $DIR/inline-instruction-set.rs:53:5: 53:30 StorageDead(_3); // scope 0 at $DIR/inline-instruction-set.rs:53:30: 53:31 _0 = const (); // scope 0 at $DIR/inline-instruction-set.rs:50:18: 54:2 return; // scope 0 at $DIR/inline-instruction-set.rs:54:2: 54:2 diff --git a/src/test/mir-opt/inline/inline_instruction_set.t32.Inline.diff b/src/test/mir-opt/inline/inline_instruction_set.t32.Inline.diff index 920b68c9da..8907bae917 100644 --- a/src/test/mir-opt/inline/inline_instruction_set.t32.Inline.diff +++ b/src/test/mir-opt/inline/inline_instruction_set.t32.Inline.diff @@ -27,7 +27,6 @@ - } - - bb2: { -+ _2 = const (); // scope 1 at $DIR/inline-instruction-set.rs:43:5: 43:26 StorageDead(_2); // scope 0 at $DIR/inline-instruction-set.rs:43:26: 43:27 StorageLive(_3); // scope 0 at $DIR/inline-instruction-set.rs:46:5: 46:30 - _3 = instruction_set_default() -> bb3; // scope 0 at $DIR/inline-instruction-set.rs:46:5: 46:30 diff --git a/src/test/mir-opt/inline/inline_options.main.Inline.after.mir b/src/test/mir-opt/inline/inline_options.main.Inline.after.mir index 4cbdde2ba0..865cf25863 100644 --- a/src/test/mir-opt/inline/inline_options.main.Inline.after.mir +++ b/src/test/mir-opt/inline/inline_options.main.Inline.after.mir @@ -48,7 +48,6 @@ fn main() -> () { bb4: { StorageDead(_5); // scope 1 at $DIR/inline-options.rs:10:5: 10:21 - _2 = const (); // scope 1 at $DIR/inline-options.rs:10:5: 10:21 StorageDead(_2); // scope 0 at $DIR/inline-options.rs:10:21: 10:22 _0 = const (); // scope 0 at $DIR/inline-options.rs:8:11: 11:2 return; // scope 0 at $DIR/inline-options.rs:11:2: 11:2 diff --git a/src/test/mir-opt/inline/inline_shims.drop.Inline.diff b/src/test/mir-opt/inline/inline_shims.drop.Inline.diff index 092ff42c3b..9494c4c641 100644 --- a/src/test/mir-opt/inline/inline_shims.drop.Inline.diff +++ b/src/test/mir-opt/inline/inline_shims.drop.Inline.diff @@ -11,7 +11,7 @@ scope 1 { } scope 2 { -+ scope 3 (inlined drop_in_place::> - shim(Some(Option))) { // at $DIR/inline-shims.rs:12:14: 12:40 ++ scope 3 (inlined std::ptr::drop_in_place::> - shim(Some(Option))) { // at $DIR/inline-shims.rs:12:14: 12:40 + let mut _6: isize; // in scope 3 at $DIR/inline-shims.rs:12:14: 12:40 + let mut _7: isize; // in scope 3 at $DIR/inline-shims.rs:12:14: 12:40 + } @@ -21,10 +21,10 @@ StorageLive(_3); // scope 0 at $DIR/inline-shims.rs:11:5: 11:42 StorageLive(_4); // scope 1 at $DIR/inline-shims.rs:11:38: 11:39 _4 = _1; // scope 1 at $DIR/inline-shims.rs:11:38: 11:39 - _3 = drop_in_place::>(move _4) -> bb1; // scope 1 at $DIR/inline-shims.rs:11:14: 11:40 + _3 = std::ptr::drop_in_place::>(move _4) -> bb1; // scope 1 at $DIR/inline-shims.rs:11:14: 11:40 // mir::Constant // + span: $DIR/inline-shims.rs:11:14: 11:37 - // + literal: Const { ty: unsafe fn(*mut std::vec::Vec
    ) {std::intrinsics::drop_in_place::>}, val: Value(Scalar()) } + // + literal: Const { ty: unsafe fn(*mut std::vec::Vec) {std::ptr::drop_in_place::>}, val: Value(Scalar()) } } bb1: { @@ -32,10 +32,10 @@ StorageDead(_3); // scope 0 at $DIR/inline-shims.rs:11:41: 11:42 StorageLive(_5); // scope 2 at $DIR/inline-shims.rs:12:38: 12:39 _5 = _2; // scope 2 at $DIR/inline-shims.rs:12:38: 12:39 -- _0 = drop_in_place::>(move _5) -> bb2; // scope 2 at $DIR/inline-shims.rs:12:14: 12:40 +- _0 = std::ptr::drop_in_place::>(move _5) -> bb2; // scope 2 at $DIR/inline-shims.rs:12:14: 12:40 - // mir::Constant - // + span: $DIR/inline-shims.rs:12:14: 12:37 -- // + literal: Const { ty: unsafe fn(*mut std::option::Option) {std::intrinsics::drop_in_place::>}, val: Value(Scalar()) } +- // + literal: Const { ty: unsafe fn(*mut std::option::Option) {std::ptr::drop_in_place::>}, val: Value(Scalar()) } + StorageLive(_6); // scope 2 at $DIR/inline-shims.rs:12:14: 12:40 + StorageLive(_7); // scope 2 at $DIR/inline-shims.rs:12:14: 12:40 + _6 = discriminant((*_5)); // scope 3 at $DIR/inline-shims.rs:12:14: 12:40 diff --git a/src/test/mir-opt/inline/issue_76997_inline_scopes_parenting.main.Inline.after.mir b/src/test/mir-opt/inline/issue_76997_inline_scopes_parenting.main.Inline.after.mir index 3d386e3b17..e5ce03a453 100644 --- a/src/test/mir-opt/inline/issue_76997_inline_scopes_parenting.main.Inline.after.mir +++ b/src/test/mir-opt/inline/issue_76997_inline_scopes_parenting.main.Inline.after.mir @@ -29,7 +29,6 @@ fn main() -> () { _5 = move (_3.0: ()); // scope 1 at $DIR/issue-76997-inline-scopes-parenting.rs:6:5: 6:10 StorageLive(_6); // scope 2 at $DIR/issue-76997-inline-scopes-parenting.rs:6:5: 6:10 _6 = const (); // scope 2 at $DIR/issue-76997-inline-scopes-parenting.rs:6:5: 6:10 - _0 = const (); // scope 3 at $DIR/issue-76997-inline-scopes-parenting.rs:6:5: 6:10 StorageDead(_6); // scope 2 at $DIR/issue-76997-inline-scopes-parenting.rs:6:5: 6:10 StorageDead(_5); // scope 1 at $DIR/issue-76997-inline-scopes-parenting.rs:6:5: 6:10 StorageDead(_4); // scope 1 at $DIR/issue-76997-inline-scopes-parenting.rs:6:9: 6:10 diff --git a/src/test/mir-opt/issue_73223.main.PreCodegen.32bit.diff b/src/test/mir-opt/issue_73223.main.PreCodegen.32bit.diff index 9139f2cf60..f6e6614bb6 100644 --- a/src/test/mir-opt/issue_73223.main.PreCodegen.32bit.diff +++ b/src/test/mir-opt/issue_73223.main.PreCodegen.32bit.diff @@ -6,58 +6,32 @@ let _1: i32; // in scope 0 at $DIR/issue-73223.rs:2:9: 2:14 let mut _2: std::option::Option; // in scope 0 at $DIR/issue-73223.rs:2:23: 2:30 let _3: i32; // in scope 0 at $DIR/issue-73223.rs:3:14: 3:15 - let mut _5: (&i32, &i32); // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _6: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _9: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _10: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _11: i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _12: std::fmt::Arguments; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _13: &[&str; 3]; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _14: &[std::fmt::ArgumentV1; 2]; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let _15: [std::fmt::ArgumentV1; 2]; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _16: (&&i32, &&i32); // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let _17: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _18: &&i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _19: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _20: std::fmt::ArgumentV1; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _21: std::fmt::ArgumentV1; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL + let mut _5: i32; // in scope 0 at $DIR/issue-73223.rs:7:22: 7:27 + let mut _6: (&i32, &i32); // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _7: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _8: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _11: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _12: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _13: i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _15: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _16: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _17: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _18: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _19: std::option::Option; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL scope 1 { debug split => _1; // in scope 1 at $DIR/issue-73223.rs:2:9: 2:14 let _4: std::option::Option; // in scope 1 at $DIR/issue-73223.rs:7:9: 7:14 scope 3 { debug _prev => _4; // in scope 3 at $DIR/issue-73223.rs:7:9: 7:14 - let _7: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _8: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _9: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _10: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _20: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL scope 4 { - debug left_val => _7; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - debug right_val => _8; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + debug left_val => _9; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + debug right_val => _10; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _14: core::panicking::AssertKind; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL scope 5 { - debug arg0 => _24; // in scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - debug arg1 => _27; // in scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - scope 6 (inlined ArgumentV1::new::<&i32>) { // at $SRC_DIR/core/src/panic.rs:LL:COL - debug x => _24; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - debug f => _23; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _22: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _23: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _24: &&i32; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - scope 7 { - } - } - scope 8 (inlined ArgumentV1::new::<&i32>) { // at $SRC_DIR/core/src/panic.rs:LL:COL - debug x => _27; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - debug f => _26; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _25: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _26: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _27: &&i32; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - scope 9 { - } - } - } - scope 10 (inlined Arguments::new_v1) { // at $SRC_DIR/core/src/panic.rs:LL:COL - debug pieces => (_12.0: &[&str]); // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - debug args => _29; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _28: std::option::Option<&[std::fmt::rt::v1::Argument]>; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _29: &[std::fmt::ArgumentV1]; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL + debug kind => _14; // in scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL } } } @@ -76,116 +50,76 @@ _1 = _3; // scope 2 at $DIR/issue-73223.rs:3:20: 3:21 StorageDead(_3); // scope 0 at $DIR/issue-73223.rs:3:20: 3:21 StorageDead(_2); // scope 0 at $DIR/issue-73223.rs:5:6: 5:7 - ((_4 as Some).0: i32) = _1; // scope 1 at $DIR/issue-73223.rs:7:22: 7:27 + StorageLive(_4); // scope 1 at $DIR/issue-73223.rs:7:9: 7:14 + StorageLive(_5); // scope 1 at $DIR/issue-73223.rs:7:22: 7:27 + _5 = _1; // scope 1 at $DIR/issue-73223.rs:7:22: 7:27 + ((_4 as Some).0: i32) = move _5; // scope 1 at $DIR/issue-73223.rs:7:17: 7:28 discriminant(_4) = 1; // scope 1 at $DIR/issue-73223.rs:7:17: 7:28 - (_5.0: &i32) = &_1; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _6 = const main::promoted[1]; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_5); // scope 1 at $DIR/issue-73223.rs:7:27: 7:28 + StorageLive(_6); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_7); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _7 = &_1; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_8); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _20 = const main::promoted[0]; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL // ty::Const // + ty: &i32 - // + val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[1])) + // + val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) // mir::Constant // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: &i32, val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[1])) } - (_5.1: &i32) = move _6; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_7); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _7 = (_5.0: &i32); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_8); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _8 = (_5.1: &i32); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_9); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_10); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + // + literal: Const { ty: &i32, val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) } + _8 = _20; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + (_6.0: &i32) = move _7; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + (_6.1: &i32) = move _8; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_8); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_7); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_9); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _9 = (_6.0: &i32); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_10); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _10 = (_6.1: &i32); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL StorageLive(_11); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _11 = (*_7); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _10 = Eq(move _11, const 1_i32); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageDead(_11); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _9 = Not(move _10); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageDead(_10); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - switchInt(move _9) -> [false: bb2, otherwise: bb1]; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_12); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_13); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _13 = (*_9); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _12 = Eq(move _13, const 1_i32); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_13); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _11 = Not(move _12); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_12); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + switchInt(move _11) -> [false: bb2, otherwise: bb1]; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL } bb1: { - _13 = const main::promoted[0]; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - // ty::Const - // + ty: &[&str; 3] - // + val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) + StorageLive(_14); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + discriminant(_14) = 0; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_15); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_16); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _16 = _9; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _15 = _16; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_17); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_18); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _18 = _10; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _17 = _18; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_19); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + discriminant(_19) = 0; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + core::panicking::assert_failed::(const core::panicking::AssertKind::Eq, move _15, move _17, move _19); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL // mir::Constant // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: &[&str; 3], val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) } - (_12.0: &[&str]) = move _13 as &[&str] (Pointer(Unsize)); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_15); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_17); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _17 = _7; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - (_16.0: &&i32) = &_17; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_18); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_19); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _19 = _8; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _18 = &_19; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - (_16.1: &&i32) = move _18; // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_18); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - _24 = (_16.0: &&i32); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _27 = (_16.1: &&i32); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _23 = <&i32 as Debug>::fmt as for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + // + literal: Const { ty: for<'r, 's, 't0> fn(core::panicking::AssertKind, &'r i32, &'s i32, std::option::Option>) -> ! {core::panicking::assert_failed::}, val: Value(Scalar()) } + // ty::Const + // + ty: core::panicking::AssertKind + // + val: Value(Scalar(0x00)) // mir::Constant // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {<&i32 as std::fmt::Debug>::fmt}, val: Value(Scalar()) } - StorageLive(_22); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - _22 = transmute:: fn(&'r &i32, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>(move _23) -> bb3; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) -> for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {std::intrinsics::transmute:: fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>}, val: Value(Scalar()) } + // + literal: Const { ty: core::panicking::AssertKind, val: Value(Scalar(0x00)) } } bb2: { - StorageDead(_9); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageDead(_8); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageDead(_7); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _0 = const (); // scope 0 at $DIR/issue-73223.rs:1:11: 9:2 + StorageDead(_11); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_10); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_9); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_6); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_4); // scope 1 at $DIR/issue-73223.rs:9:1: 9:2 StorageDead(_1); // scope 0 at $DIR/issue-73223.rs:9:1: 9:2 return; // scope 0 at $DIR/issue-73223.rs:9:2: 9:2 } - - bb3: { - (_20.0: &core::fmt::Opaque) = transmute::<&&i32, &core::fmt::Opaque>(move _24) -> bb4; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(&&i32) -> &core::fmt::Opaque {std::intrinsics::transmute::<&&i32, &core::fmt::Opaque>}, val: Value(Scalar()) } - } - - bb4: { - (_20.1: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) = move _22; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_22); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - _26 = <&i32 as Debug>::fmt as for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {<&i32 as std::fmt::Debug>::fmt}, val: Value(Scalar()) } - StorageLive(_25); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - _25 = transmute:: fn(&'r &i32, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>(move _26) -> bb5; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) -> for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {std::intrinsics::transmute:: fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>}, val: Value(Scalar()) } - } - - bb5: { - (_21.0: &core::fmt::Opaque) = transmute::<&&i32, &core::fmt::Opaque>(move _27) -> bb6; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(&&i32) -> &core::fmt::Opaque {std::intrinsics::transmute::<&&i32, &core::fmt::Opaque>}, val: Value(Scalar()) } - } - - bb6: { - (_21.1: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) = move _25; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_25); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - _15 = [move _20, move _21]; // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - _14 = &_15; // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - _29 = move _14 as &[std::fmt::ArgumentV1] (Pointer(Unsize)); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_28); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - discriminant(_28) = 0; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - (_12.1: std::option::Option<&[std::fmt::rt::v1::Argument]>) = move _28; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - (_12.2: &[std::fmt::ArgumentV1]) = move _29; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_28); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - core::panicking::panic_fmt(move _12); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: for<'r> fn(std::fmt::Arguments<'r>) -> ! {core::panicking::panic_fmt}, val: Value(Scalar()) } - } } diff --git a/src/test/mir-opt/issue_73223.main.PreCodegen.64bit.diff b/src/test/mir-opt/issue_73223.main.PreCodegen.64bit.diff index 9139f2cf60..f6e6614bb6 100644 --- a/src/test/mir-opt/issue_73223.main.PreCodegen.64bit.diff +++ b/src/test/mir-opt/issue_73223.main.PreCodegen.64bit.diff @@ -6,58 +6,32 @@ let _1: i32; // in scope 0 at $DIR/issue-73223.rs:2:9: 2:14 let mut _2: std::option::Option; // in scope 0 at $DIR/issue-73223.rs:2:23: 2:30 let _3: i32; // in scope 0 at $DIR/issue-73223.rs:3:14: 3:15 - let mut _5: (&i32, &i32); // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _6: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _9: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _10: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _11: i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _12: std::fmt::Arguments; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _13: &[&str; 3]; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _14: &[std::fmt::ArgumentV1; 2]; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let _15: [std::fmt::ArgumentV1; 2]; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _16: (&&i32, &&i32); // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let _17: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _18: &&i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _19: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _20: std::fmt::ArgumentV1; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _21: std::fmt::ArgumentV1; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL + let mut _5: i32; // in scope 0 at $DIR/issue-73223.rs:7:22: 7:27 + let mut _6: (&i32, &i32); // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _7: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _8: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _11: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _12: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _13: i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _15: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _16: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _17: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _18: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _19: std::option::Option; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL scope 1 { debug split => _1; // in scope 1 at $DIR/issue-73223.rs:2:9: 2:14 let _4: std::option::Option; // in scope 1 at $DIR/issue-73223.rs:7:9: 7:14 scope 3 { debug _prev => _4; // in scope 3 at $DIR/issue-73223.rs:7:9: 7:14 - let _7: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _8: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _9: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _10: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _20: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL scope 4 { - debug left_val => _7; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - debug right_val => _8; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + debug left_val => _9; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + debug right_val => _10; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _14: core::panicking::AssertKind; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL scope 5 { - debug arg0 => _24; // in scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - debug arg1 => _27; // in scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - scope 6 (inlined ArgumentV1::new::<&i32>) { // at $SRC_DIR/core/src/panic.rs:LL:COL - debug x => _24; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - debug f => _23; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _22: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _23: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _24: &&i32; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - scope 7 { - } - } - scope 8 (inlined ArgumentV1::new::<&i32>) { // at $SRC_DIR/core/src/panic.rs:LL:COL - debug x => _27; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - debug f => _26; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _25: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _26: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _27: &&i32; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - scope 9 { - } - } - } - scope 10 (inlined Arguments::new_v1) { // at $SRC_DIR/core/src/panic.rs:LL:COL - debug pieces => (_12.0: &[&str]); // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - debug args => _29; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _28: std::option::Option<&[std::fmt::rt::v1::Argument]>; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _29: &[std::fmt::ArgumentV1]; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL + debug kind => _14; // in scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL } } } @@ -76,116 +50,76 @@ _1 = _3; // scope 2 at $DIR/issue-73223.rs:3:20: 3:21 StorageDead(_3); // scope 0 at $DIR/issue-73223.rs:3:20: 3:21 StorageDead(_2); // scope 0 at $DIR/issue-73223.rs:5:6: 5:7 - ((_4 as Some).0: i32) = _1; // scope 1 at $DIR/issue-73223.rs:7:22: 7:27 + StorageLive(_4); // scope 1 at $DIR/issue-73223.rs:7:9: 7:14 + StorageLive(_5); // scope 1 at $DIR/issue-73223.rs:7:22: 7:27 + _5 = _1; // scope 1 at $DIR/issue-73223.rs:7:22: 7:27 + ((_4 as Some).0: i32) = move _5; // scope 1 at $DIR/issue-73223.rs:7:17: 7:28 discriminant(_4) = 1; // scope 1 at $DIR/issue-73223.rs:7:17: 7:28 - (_5.0: &i32) = &_1; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _6 = const main::promoted[1]; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_5); // scope 1 at $DIR/issue-73223.rs:7:27: 7:28 + StorageLive(_6); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_7); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _7 = &_1; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_8); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _20 = const main::promoted[0]; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL // ty::Const // + ty: &i32 - // + val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[1])) + // + val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) // mir::Constant // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: &i32, val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[1])) } - (_5.1: &i32) = move _6; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_7); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _7 = (_5.0: &i32); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_8); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _8 = (_5.1: &i32); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_9); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_10); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + // + literal: Const { ty: &i32, val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) } + _8 = _20; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + (_6.0: &i32) = move _7; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + (_6.1: &i32) = move _8; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_8); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_7); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_9); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _9 = (_6.0: &i32); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_10); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _10 = (_6.1: &i32); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL StorageLive(_11); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _11 = (*_7); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _10 = Eq(move _11, const 1_i32); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageDead(_11); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _9 = Not(move _10); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageDead(_10); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - switchInt(move _9) -> [false: bb2, otherwise: bb1]; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_12); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_13); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _13 = (*_9); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _12 = Eq(move _13, const 1_i32); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_13); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _11 = Not(move _12); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_12); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + switchInt(move _11) -> [false: bb2, otherwise: bb1]; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL } bb1: { - _13 = const main::promoted[0]; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - // ty::Const - // + ty: &[&str; 3] - // + val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) + StorageLive(_14); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + discriminant(_14) = 0; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_15); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_16); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _16 = _9; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _15 = _16; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_17); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_18); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _18 = _10; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _17 = _18; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_19); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + discriminant(_19) = 0; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + core::panicking::assert_failed::(const core::panicking::AssertKind::Eq, move _15, move _17, move _19); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL // mir::Constant // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: &[&str; 3], val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) } - (_12.0: &[&str]) = move _13 as &[&str] (Pointer(Unsize)); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_15); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_17); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _17 = _7; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - (_16.0: &&i32) = &_17; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_18); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_19); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _19 = _8; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _18 = &_19; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - (_16.1: &&i32) = move _18; // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_18); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - _24 = (_16.0: &&i32); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _27 = (_16.1: &&i32); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _23 = <&i32 as Debug>::fmt as for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + // + literal: Const { ty: for<'r, 's, 't0> fn(core::panicking::AssertKind, &'r i32, &'s i32, std::option::Option>) -> ! {core::panicking::assert_failed::}, val: Value(Scalar()) } + // ty::Const + // + ty: core::panicking::AssertKind + // + val: Value(Scalar(0x00)) // mir::Constant // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {<&i32 as std::fmt::Debug>::fmt}, val: Value(Scalar()) } - StorageLive(_22); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - _22 = transmute:: fn(&'r &i32, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>(move _23) -> bb3; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) -> for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {std::intrinsics::transmute:: fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>}, val: Value(Scalar()) } + // + literal: Const { ty: core::panicking::AssertKind, val: Value(Scalar(0x00)) } } bb2: { - StorageDead(_9); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageDead(_8); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageDead(_7); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _0 = const (); // scope 0 at $DIR/issue-73223.rs:1:11: 9:2 + StorageDead(_11); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_10); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_9); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_6); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageDead(_4); // scope 1 at $DIR/issue-73223.rs:9:1: 9:2 StorageDead(_1); // scope 0 at $DIR/issue-73223.rs:9:1: 9:2 return; // scope 0 at $DIR/issue-73223.rs:9:2: 9:2 } - - bb3: { - (_20.0: &core::fmt::Opaque) = transmute::<&&i32, &core::fmt::Opaque>(move _24) -> bb4; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(&&i32) -> &core::fmt::Opaque {std::intrinsics::transmute::<&&i32, &core::fmt::Opaque>}, val: Value(Scalar()) } - } - - bb4: { - (_20.1: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) = move _22; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_22); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - _26 = <&i32 as Debug>::fmt as for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {<&i32 as std::fmt::Debug>::fmt}, val: Value(Scalar()) } - StorageLive(_25); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - _25 = transmute:: fn(&'r &i32, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>(move _26) -> bb5; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) -> for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {std::intrinsics::transmute:: fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>}, val: Value(Scalar()) } - } - - bb5: { - (_21.0: &core::fmt::Opaque) = transmute::<&&i32, &core::fmt::Opaque>(move _27) -> bb6; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(&&i32) -> &core::fmt::Opaque {std::intrinsics::transmute::<&&i32, &core::fmt::Opaque>}, val: Value(Scalar()) } - } - - bb6: { - (_21.1: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) = move _25; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_25); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - _15 = [move _20, move _21]; // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - _14 = &_15; // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - _29 = move _14 as &[std::fmt::ArgumentV1] (Pointer(Unsize)); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_28); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - discriminant(_28) = 0; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - (_12.1: std::option::Option<&[std::fmt::rt::v1::Argument]>) = move _28; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - (_12.2: &[std::fmt::ArgumentV1]) = move _29; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_28); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - core::panicking::panic_fmt(move _12); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: for<'r> fn(std::fmt::Arguments<'r>) -> ! {core::panicking::panic_fmt}, val: Value(Scalar()) } - } } diff --git a/src/test/mir-opt/issue_73223.main.SimplifyArmIdentity.32bit.diff b/src/test/mir-opt/issue_73223.main.SimplifyArmIdentity.32bit.diff index 0eea0bf0a0..bd24522271 100644 --- a/src/test/mir-opt/issue_73223.main.SimplifyArmIdentity.32bit.diff +++ b/src/test/mir-opt/issue_73223.main.SimplifyArmIdentity.32bit.diff @@ -18,27 +18,14 @@ let mut _16: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL let mut _17: i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL let mut _18: i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _19: !; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _20: std::fmt::Arguments; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _21: &[&str]; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _22: &[&str; 3]; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _23: &[&str; 3]; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _24: [&str; 3]; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _25: &[std::fmt::ArgumentV1]; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _26: &[std::fmt::ArgumentV1; 2]; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let _27: &[std::fmt::ArgumentV1; 2]; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let _28: [std::fmt::ArgumentV1; 2]; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _29: (&&i32, &&i32); // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _30: &&i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _31: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _32: &&i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _33: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _36: std::fmt::ArgumentV1; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _37: &&i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _38: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _39: std::fmt::ArgumentV1; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _40: &&i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _41: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _19: !; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _21: !; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _22: core::panicking::AssertKind; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _23: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _24: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _25: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _26: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _27: std::option::Option; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL scope 1 { debug split => _1; // in scope 1 at $DIR/issue-73223.rs:2:9: 2:14 let _6: std::option::Option; // in scope 1 at $DIR/issue-73223.rs:7:9: 7:14 @@ -46,43 +33,13 @@ debug _prev => _6; // in scope 3 at $DIR/issue-73223.rs:7:9: 7:14 let _13: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL let _14: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _43: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _28: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL scope 4 { debug left_val => _13; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL debug right_val => _14; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _34: &&i32; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _35: &&i32; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _42: &[&str; 3]; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _20: core::panicking::AssertKind; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL scope 5 { - debug arg0 => _34; // in scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - debug arg1 => _35; // in scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - scope 6 (inlined ArgumentV1::new::<&i32>) { // at $SRC_DIR/core/src/panic.rs:LL:COL - debug x => _37; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - debug f => _38; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _44: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _45: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _46: &core::fmt::Opaque; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _47: &&i32; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - scope 7 { - } - } - scope 8 (inlined ArgumentV1::new::<&i32>) { // at $SRC_DIR/core/src/panic.rs:LL:COL - debug x => _40; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - debug f => _41; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _48: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _49: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _50: &core::fmt::Opaque; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _51: &&i32; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - scope 9 { - } - } - } - scope 10 (inlined Arguments::new_v1) { // at $SRC_DIR/core/src/panic.rs:LL:COL - debug pieces => _21; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - debug args => _25; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _52: &[&str]; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _53: std::option::Option<&[std::fmt::rt::v1::Argument]>; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _54: &[std::fmt::ArgumentV1]; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL + debug kind => _20; // in scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL } } } @@ -124,14 +81,14 @@ StorageLive(_10); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL _10 = &_1; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL StorageLive(_11); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _43 = const main::promoted[1]; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _28 = const main::promoted[0]; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL // ty::Const // + ty: &i32 - // + val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[1])) + // + val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) // mir::Constant // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: &i32, val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[1])) } - _11 = _43; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + // + literal: Const { ty: &i32, val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) } + _11 = _28; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL (_9.0: &i32) = move _10; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL (_9.1: &i32) = move _11; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL StorageDead(_11); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL @@ -155,58 +112,37 @@ } bb3: { - StorageLive(_19); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_20); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_21); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_22); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_23); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _42 = const main::promoted[0]; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_20); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + discriminant(_20) = 0; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_21); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_22); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _22 = const core::panicking::AssertKind::Eq; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL // ty::Const - // + ty: &[&str; 3] - // + val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) + // + ty: core::panicking::AssertKind + // + val: Value(Scalar(0x00)) // mir::Constant // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: &[&str; 3], val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) } - _23 = _42; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _22 = _23; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _21 = move _22 as &[&str] (Pointer(Unsize)); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageDead(_22); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_25); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_26); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_27); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_28); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_29); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_30); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_31); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _31 = _13; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _30 = &_31; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_32); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_33); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _33 = _14; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _32 = &_33; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - (_29.0: &&i32) = move _30; // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - (_29.1: &&i32) = move _32; // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_32); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_30); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_34); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _34 = (_29.0: &&i32); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_35); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _35 = (_29.1: &&i32); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_36); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_37); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _37 = _34; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_38); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _38 = <&i32 as Debug>::fmt as for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + // + literal: Const { ty: core::panicking::AssertKind, val: Value(Scalar(0x00)) } + StorageLive(_23); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_24); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _24 = _13; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _23 = _24; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_25); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_26); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _26 = _14; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _25 = _26; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_27); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + discriminant(_27) = 0; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + core::panicking::assert_failed::(const core::panicking::AssertKind::Eq, move _23, move _25, move _27); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL // mir::Constant // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {<&i32 as std::fmt::Debug>::fmt}, val: Value(Scalar()) } - StorageLive(_44); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_45); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - _45 = _38; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - _44 = transmute:: fn(&'r &i32, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>(move _45) -> bb5; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL + // + literal: Const { ty: for<'r, 's, 't0> fn(core::panicking::AssertKind, &'r i32, &'s i32, std::option::Option>) -> ! {core::panicking::assert_failed::}, val: Value(Scalar()) } + // ty::Const + // + ty: core::panicking::AssertKind + // + val: Value(Scalar(0x00)) // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) -> for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {std::intrinsics::transmute:: fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>}, val: Value(Scalar()) } + // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL + // + literal: Const { ty: core::panicking::AssertKind, val: Value(Scalar(0x00)) } } bb4: { @@ -221,89 +157,5 @@ StorageDead(_1); // scope 0 at $DIR/issue-73223.rs:9:1: 9:2 return; // scope 0 at $DIR/issue-73223.rs:9:2: 9:2 } - - bb5: { - StorageDead(_45); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_46); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_47); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - _47 = _37; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - _46 = transmute::<&&i32, &core::fmt::Opaque>(move _47) -> bb6; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(&&i32) -> &core::fmt::Opaque {std::intrinsics::transmute::<&&i32, &core::fmt::Opaque>}, val: Value(Scalar()) } - } - - bb6: { - StorageDead(_47); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - (_36.0: &core::fmt::Opaque) = move _46; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - (_36.1: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) = move _44; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_46); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_44); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_38); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_37); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_39); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_40); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _40 = _35; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_41); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _41 = <&i32 as Debug>::fmt as for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {<&i32 as std::fmt::Debug>::fmt}, val: Value(Scalar()) } - StorageLive(_48); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_49); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - _49 = _41; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - _48 = transmute:: fn(&'r &i32, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>(move _49) -> bb7; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) -> for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {std::intrinsics::transmute:: fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>}, val: Value(Scalar()) } - } - - bb7: { - StorageDead(_49); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_50); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_51); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - _51 = _40; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - _50 = transmute::<&&i32, &core::fmt::Opaque>(move _51) -> bb8; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(&&i32) -> &core::fmt::Opaque {std::intrinsics::transmute::<&&i32, &core::fmt::Opaque>}, val: Value(Scalar()) } - } - - bb8: { - StorageDead(_51); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - (_39.0: &core::fmt::Opaque) = move _50; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - (_39.1: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) = move _48; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_50); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_48); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_41); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_40); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - _28 = [move _36, move _39]; // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_39); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_36); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_35); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_34); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - _27 = &_28; // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - _26 = _27; // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - _25 = move _26 as &[std::fmt::ArgumentV1] (Pointer(Unsize)); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_26); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_52); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - _52 = _21; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_53); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - discriminant(_53) = 0; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_54); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - _54 = _25; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - (_20.0: &[&str]) = move _52; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - (_20.1: std::option::Option<&[std::fmt::rt::v1::Argument]>) = move _53; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - (_20.2: &[std::fmt::ArgumentV1]) = move _54; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_54); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_53); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_52); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_25); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_21); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - core::panicking::panic_fmt(move _20); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: for<'r> fn(std::fmt::Arguments<'r>) -> ! {core::panicking::panic_fmt}, val: Value(Scalar()) } - } } diff --git a/src/test/mir-opt/issue_73223.main.SimplifyArmIdentity.64bit.diff b/src/test/mir-opt/issue_73223.main.SimplifyArmIdentity.64bit.diff index 0eea0bf0a0..bd24522271 100644 --- a/src/test/mir-opt/issue_73223.main.SimplifyArmIdentity.64bit.diff +++ b/src/test/mir-opt/issue_73223.main.SimplifyArmIdentity.64bit.diff @@ -18,27 +18,14 @@ let mut _16: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL let mut _17: i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL let mut _18: i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _19: !; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _20: std::fmt::Arguments; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _21: &[&str]; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _22: &[&str; 3]; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _23: &[&str; 3]; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _24: [&str; 3]; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _25: &[std::fmt::ArgumentV1]; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _26: &[std::fmt::ArgumentV1; 2]; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let _27: &[std::fmt::ArgumentV1; 2]; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let _28: [std::fmt::ArgumentV1; 2]; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _29: (&&i32, &&i32); // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _30: &&i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _31: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _32: &&i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _33: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _36: std::fmt::ArgumentV1; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _37: &&i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _38: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _39: std::fmt::ArgumentV1; // in scope 0 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _40: &&i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _41: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _19: !; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _21: !; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _22: core::panicking::AssertKind; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _23: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _24: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _25: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _26: &i32; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _27: std::option::Option; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL scope 1 { debug split => _1; // in scope 1 at $DIR/issue-73223.rs:2:9: 2:14 let _6: std::option::Option; // in scope 1 at $DIR/issue-73223.rs:7:9: 7:14 @@ -46,43 +33,13 @@ debug _prev => _6; // in scope 3 at $DIR/issue-73223.rs:7:9: 7:14 let _13: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL let _14: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _43: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let mut _28: &i32; // in scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL scope 4 { debug left_val => _13; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL debug right_val => _14; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _34: &&i32; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let _35: &&i32; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _42: &[&str; 3]; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + let _20: core::panicking::AssertKind; // in scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL scope 5 { - debug arg0 => _34; // in scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - debug arg1 => _35; // in scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - scope 6 (inlined ArgumentV1::new::<&i32>) { // at $SRC_DIR/core/src/panic.rs:LL:COL - debug x => _37; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - debug f => _38; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _44: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _45: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _46: &core::fmt::Opaque; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _47: &&i32; // in scope 6 at $SRC_DIR/core/src/panic.rs:LL:COL - scope 7 { - } - } - scope 8 (inlined ArgumentV1::new::<&i32>) { // at $SRC_DIR/core/src/panic.rs:LL:COL - debug x => _40; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - debug f => _41; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _48: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _49: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _50: &core::fmt::Opaque; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _51: &&i32; // in scope 8 at $SRC_DIR/core/src/panic.rs:LL:COL - scope 9 { - } - } - } - scope 10 (inlined Arguments::new_v1) { // at $SRC_DIR/core/src/panic.rs:LL:COL - debug pieces => _21; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - debug args => _25; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _52: &[&str]; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _53: std::option::Option<&[std::fmt::rt::v1::Argument]>; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - let mut _54: &[std::fmt::ArgumentV1]; // in scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL + debug kind => _20; // in scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL } } } @@ -124,14 +81,14 @@ StorageLive(_10); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL _10 = &_1; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL StorageLive(_11); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _43 = const main::promoted[1]; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _28 = const main::promoted[0]; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL // ty::Const // + ty: &i32 - // + val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[1])) + // + val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) // mir::Constant // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: &i32, val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[1])) } - _11 = _43; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + // + literal: Const { ty: &i32, val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) } + _11 = _28; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL (_9.0: &i32) = move _10; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL (_9.1: &i32) = move _11; // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL StorageDead(_11); // scope 3 at $SRC_DIR/core/src/macros/mod.rs:LL:COL @@ -155,58 +112,37 @@ } bb3: { - StorageLive(_19); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_20); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_21); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_22); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_23); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _42 = const main::promoted[0]; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_20); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + discriminant(_20) = 0; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_21); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_22); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _22 = const core::panicking::AssertKind::Eq; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL // ty::Const - // + ty: &[&str; 3] - // + val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) + // + ty: core::panicking::AssertKind + // + val: Value(Scalar(0x00)) // mir::Constant // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: &[&str; 3], val: Unevaluated(WithOptConstParam { did: DefId(0:3 ~ issue_73223[317d]::main), const_param_did: None }, [], Some(promoted[0])) } - _23 = _42; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _22 = _23; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _21 = move _22 as &[&str] (Pointer(Unsize)); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageDead(_22); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_25); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_26); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_27); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_28); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_29); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_30); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_31); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _31 = _13; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _30 = &_31; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_32); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_33); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _33 = _14; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _32 = &_33; // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - (_29.0: &&i32) = move _30; // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - (_29.1: &&i32) = move _32; // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_32); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_30); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_34); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _34 = (_29.0: &&i32); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_35); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _35 = (_29.1: &&i32); // scope 4 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_36); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_37); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _37 = _34; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_38); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _38 = <&i32 as Debug>::fmt as for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + // + literal: Const { ty: core::panicking::AssertKind, val: Value(Scalar(0x00)) } + StorageLive(_23); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_24); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _24 = _13; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _23 = _24; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_25); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_26); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _26 = _14; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + _25 = _26; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + StorageLive(_27); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + discriminant(_27) = 0; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL + core::panicking::assert_failed::(const core::panicking::AssertKind::Eq, move _23, move _25, move _27); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL // mir::Constant // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {<&i32 as std::fmt::Debug>::fmt}, val: Value(Scalar()) } - StorageLive(_44); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_45); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - _45 = _38; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - _44 = transmute:: fn(&'r &i32, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>(move _45) -> bb5; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL + // + literal: Const { ty: for<'r, 's, 't0> fn(core::panicking::AssertKind, &'r i32, &'s i32, std::option::Option>) -> ! {core::panicking::assert_failed::}, val: Value(Scalar()) } + // ty::Const + // + ty: core::panicking::AssertKind + // + val: Value(Scalar(0x00)) // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) -> for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {std::intrinsics::transmute:: fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>}, val: Value(Scalar()) } + // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL + // + literal: Const { ty: core::panicking::AssertKind, val: Value(Scalar(0x00)) } } bb4: { @@ -221,89 +157,5 @@ StorageDead(_1); // scope 0 at $DIR/issue-73223.rs:9:1: 9:2 return; // scope 0 at $DIR/issue-73223.rs:9:2: 9:2 } - - bb5: { - StorageDead(_45); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_46); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_47); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - _47 = _37; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - _46 = transmute::<&&i32, &core::fmt::Opaque>(move _47) -> bb6; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(&&i32) -> &core::fmt::Opaque {std::intrinsics::transmute::<&&i32, &core::fmt::Opaque>}, val: Value(Scalar()) } - } - - bb6: { - StorageDead(_47); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - (_36.0: &core::fmt::Opaque) = move _46; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - (_36.1: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) = move _44; // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_46); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_44); // scope 7 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_38); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_37); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_39); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_40); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _40 = _35; // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageLive(_41); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _41 = <&i32 as Debug>::fmt as for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)); // scope 5 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/macros/mod.rs:LL:COL - // + literal: Const { ty: for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {<&i32 as std::fmt::Debug>::fmt}, val: Value(Scalar()) } - StorageLive(_48); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_49); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - _49 = _41; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - _48 = transmute:: fn(&'r &i32, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>(move _49) -> bb7; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(for<'r, 's, 't0> fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) -> for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> {std::intrinsics::transmute:: fn(&'r &i32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>, for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>>}, val: Value(Scalar()) } - } - - bb7: { - StorageDead(_49); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_50); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_51); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - _51 = _40; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - _50 = transmute::<&&i32, &core::fmt::Opaque>(move _51) -> bb8; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: unsafe extern "rust-intrinsic" fn(&&i32) -> &core::fmt::Opaque {std::intrinsics::transmute::<&&i32, &core::fmt::Opaque>}, val: Value(Scalar()) } - } - - bb8: { - StorageDead(_51); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - (_39.0: &core::fmt::Opaque) = move _50; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - (_39.1: for<'r, 's, 't0> fn(&'r core::fmt::Opaque, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error>) = move _48; // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_50); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_48); // scope 9 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_41); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_40); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - _28 = [move _36, move _39]; // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_39); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_36); // scope 5 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_35); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_34); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - _27 = &_28; // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - _26 = _27; // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - _25 = move _26 as &[std::fmt::ArgumentV1] (Pointer(Unsize)); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_26); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_52); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - _52 = _21; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_53); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - discriminant(_53) = 0; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageLive(_54); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - _54 = _25; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - (_20.0: &[&str]) = move _52; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - (_20.1: std::option::Option<&[std::fmt::rt::v1::Argument]>) = move _53; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - (_20.2: &[std::fmt::ArgumentV1]) = move _54; // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_54); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_53); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_52); // scope 10 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_25); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - StorageDead(_21); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - core::panicking::panic_fmt(move _20); // scope 4 at $SRC_DIR/core/src/panic.rs:LL:COL - // mir::Constant - // + span: $SRC_DIR/core/src/panic.rs:LL:COL - // + literal: Const { ty: for<'r> fn(std::fmt::Arguments<'r>) -> ! {core::panicking::panic_fmt}, val: Value(Scalar()) } - } } diff --git a/src/test/mir-opt/issues/issue-59352.rs b/src/test/mir-opt/issues/issue-59352.rs index 9e59337a01..1e0045555a 100644 --- a/src/test/mir-opt/issues/issue-59352.rs +++ b/src/test/mir-opt/issues/issue-59352.rs @@ -7,7 +7,7 @@ // removed. // EMIT_MIR issue_59352.num_to_digit.PreCodegen.after.mir -// compile-flags: -Z mir-opt-level=2 -Z span_free_formats +// compile-flags: -Z mir-opt-level=3 -Z span_free_formats pub fn num_to_digit(num: char) -> u32 { // CHECK-NOT: panic diff --git a/src/test/mir-opt/issues/issue_59352.num_to_digit.PreCodegen.after.mir b/src/test/mir-opt/issues/issue_59352.num_to_digit.PreCodegen.after.mir index 04a8c94e00..19d161ac2b 100644 --- a/src/test/mir-opt/issues/issue_59352.num_to_digit.PreCodegen.after.mir +++ b/src/test/mir-opt/issues/issue_59352.num_to_digit.PreCodegen.after.mir @@ -3,36 +3,39 @@ fn num_to_digit(_1: char) -> u32 { debug num => _1; // in scope 0 at $DIR/issue-59352.rs:12:21: 12:24 let mut _0: u32; // return place in scope 0 at $DIR/issue-59352.rs:12:35: 12:38 - let mut _2: bool; // in scope 0 at $DIR/issue-59352.rs:14:8: 14:23 + let mut _2: char; // in scope 0 at $DIR/issue-59352.rs:14:8: 14:11 let mut _3: std::option::Option; // in scope 0 at $DIR/issue-59352.rs:14:26: 14:41 let mut _4: char; // in scope 0 at $DIR/issue-59352.rs:14:26: 14:29 let mut _5: u32; // in scope 0 at $DIR/issue-59352.rs:14:8: 14:23 - let mut _10: isize; // in scope 0 at $DIR/issue-59352.rs:14:8: 14:23 + let mut _11: isize; // in scope 0 at $DIR/issue-59352.rs:14:8: 14:23 scope 1 (inlined char::methods::::is_digit) { // at $DIR/issue-59352.rs:14:8: 14:23 - debug self => _8; // in scope 1 at $DIR/issue-59352.rs:14:8: 14:23 + debug self => _2; // in scope 1 at $DIR/issue-59352.rs:14:8: 14:23 debug radix => _5; // in scope 1 at $DIR/issue-59352.rs:14:8: 14:23 let mut _6: &std::option::Option; // in scope 1 at $DIR/issue-59352.rs:14:8: 14:23 let _7: std::option::Option; // in scope 1 at $DIR/issue-59352.rs:14:8: 14:23 let mut _8: char; // in scope 1 at $DIR/issue-59352.rs:14:8: 14:23 scope 2 (inlined Option::::is_some) { // at $DIR/issue-59352.rs:14:8: 14:23 debug self => _6; // in scope 2 at $DIR/issue-59352.rs:14:8: 14:23 + let mut _9: isize; // in scope 2 at $DIR/issue-59352.rs:14:8: 14:23 } } scope 3 (inlined #[track_caller] Option::::unwrap) { // at $DIR/issue-59352.rs:14:26: 14:50 debug self => _3; // in scope 3 at $DIR/issue-59352.rs:14:26: 14:50 - let mut _9: isize; // in scope 3 at $DIR/issue-59352.rs:14:26: 14:50 + let mut _10: isize; // in scope 3 at $DIR/issue-59352.rs:14:26: 14:50 scope 4 { debug val => _0; // in scope 4 at $DIR/issue-59352.rs:14:26: 14:50 } } bb0: { - StorageLive(_2); // scope 0 at $DIR/issue-59352.rs:14:8: 14:23 - _8 = _1; // scope 0 at $DIR/issue-59352.rs:14:8: 14:11 + StorageLive(_2); // scope 0 at $DIR/issue-59352.rs:14:8: 14:11 + _2 = _1; // scope 0 at $DIR/issue-59352.rs:14:8: 14:11 StorageLive(_5); // scope 0 at $DIR/issue-59352.rs:14:8: 14:23 _5 = const 8_u32; // scope 0 at $DIR/issue-59352.rs:14:8: 14:23 StorageLive(_6); // scope 1 at $DIR/issue-59352.rs:14:8: 14:23 StorageLive(_7); // scope 1 at $DIR/issue-59352.rs:14:8: 14:23 + StorageLive(_8); // scope 1 at $DIR/issue-59352.rs:14:8: 14:23 + _8 = _2; // scope 1 at $DIR/issue-59352.rs:14:8: 14:23 _7 = char::methods::::to_digit(move _8, const 8_u32) -> bb5; // scope 1 at $DIR/issue-59352.rs:14:8: 14:23 // mir::Constant // + span: $DIR/issue-59352.rs:14:8: 14:23 @@ -40,6 +43,7 @@ fn num_to_digit(_1: char) -> u32 { } bb1: { + StorageDead(_11); // scope 0 at $DIR/issue-59352.rs:14:5: 14:63 StorageLive(_3); // scope 0 at $DIR/issue-59352.rs:14:26: 14:41 StorageLive(_4); // scope 0 at $DIR/issue-59352.rs:14:26: 14:29 _4 = _1; // scope 0 at $DIR/issue-59352.rs:14:26: 14:29 @@ -50,30 +54,35 @@ fn num_to_digit(_1: char) -> u32 { } bb2: { + StorageDead(_11); // scope 0 at $DIR/issue-59352.rs:14:5: 14:63 _0 = const 0_u32; // scope 0 at $DIR/issue-59352.rs:14:60: 14:61 goto -> bb4; // scope 0 at $DIR/issue-59352.rs:14:5: 14:63 } bb3: { StorageDead(_4); // scope 0 at $DIR/issue-59352.rs:14:40: 14:41 - StorageLive(_9); // scope 0 at $DIR/issue-59352.rs:14:26: 14:50 - _9 = discriminant(_3); // scope 3 at $DIR/issue-59352.rs:14:26: 14:50 - switchInt(move _9) -> [0_isize: bb6, 1_isize: bb8, otherwise: bb7]; // scope 3 at $DIR/issue-59352.rs:14:26: 14:50 + StorageLive(_10); // scope 0 at $DIR/issue-59352.rs:14:26: 14:50 + _10 = discriminant(_3); // scope 3 at $DIR/issue-59352.rs:14:26: 14:50 + switchInt(move _10) -> [0_isize: bb6, 1_isize: bb8, otherwise: bb7]; // scope 3 at $DIR/issue-59352.rs:14:26: 14:50 } bb4: { - StorageDead(_2); // scope 0 at $DIR/issue-59352.rs:14:62: 14:63 return; // scope 0 at $DIR/issue-59352.rs:15:2: 15:2 } bb5: { _6 = &_7; // scope 1 at $DIR/issue-59352.rs:14:8: 14:23 - _10 = discriminant((*_6)); // scope 2 at $DIR/issue-59352.rs:14:8: 14:23 - _2 = Eq(_10, const 1_isize); // scope 2 at $DIR/issue-59352.rs:14:8: 14:23 + StorageDead(_8); // scope 1 at $DIR/issue-59352.rs:14:8: 14:23 + StorageLive(_9); // scope 1 at $DIR/issue-59352.rs:14:8: 14:23 + _9 = discriminant((*_6)); // scope 2 at $DIR/issue-59352.rs:14:8: 14:23 + StorageLive(_11); // scope 2 at $DIR/issue-59352.rs:14:8: 14:23 + _11 = move _9; // scope 2 at $DIR/issue-59352.rs:14:8: 14:23 + StorageDead(_9); // scope 1 at $DIR/issue-59352.rs:14:8: 14:23 StorageDead(_6); // scope 1 at $DIR/issue-59352.rs:14:8: 14:23 StorageDead(_7); // scope 1 at $DIR/issue-59352.rs:14:8: 14:23 StorageDead(_5); // scope 0 at $DIR/issue-59352.rs:14:8: 14:23 - switchInt(move _2) -> [false: bb2, otherwise: bb1]; // scope 0 at $DIR/issue-59352.rs:14:5: 14:63 + StorageDead(_2); // scope 0 at $DIR/issue-59352.rs:14:22: 14:23 + switchInt(move _11) -> [1_isize: bb1, otherwise: bb2]; // scope 0 at $DIR/issue-59352.rs:14:5: 14:63 } bb6: { @@ -95,7 +104,7 @@ fn num_to_digit(_1: char) -> u32 { bb8: { _0 = move ((_3 as Some).0: u32); // scope 3 at $DIR/issue-59352.rs:14:26: 14:50 - StorageDead(_9); // scope 0 at $DIR/issue-59352.rs:14:26: 14:50 + StorageDead(_10); // scope 0 at $DIR/issue-59352.rs:14:26: 14:50 StorageDead(_3); // scope 0 at $DIR/issue-59352.rs:14:49: 14:50 goto -> bb4; // scope 0 at $DIR/issue-59352.rs:14:5: 14:63 } diff --git a/src/test/mir-opt/lower_intrinsics.f_u64.PreCodegen.before.mir b/src/test/mir-opt/lower_intrinsics.f_u64.PreCodegen.before.mir index 740a6e0edb..380f6ce9ba 100644 --- a/src/test/mir-opt/lower_intrinsics.f_u64.PreCodegen.before.mir +++ b/src/test/mir-opt/lower_intrinsics.f_u64.PreCodegen.before.mir @@ -2,9 +2,9 @@ fn f_u64() -> () { let mut _0: (); // return place in scope 0 at $DIR/lower_intrinsics.rs:34:16: 34:16 + let mut _1: u64; // in scope 0 at $DIR/lower_intrinsics.rs:35:5: 35:21 scope 1 (inlined f_dispatch::) { // at $DIR/lower_intrinsics.rs:35:5: 35:21 debug t => _1; // in scope 1 at $DIR/lower_intrinsics.rs:35:5: 35:21 - let mut _1: u64; // in scope 1 at $DIR/lower_intrinsics.rs:35:5: 35:21 let _2: (); // in scope 1 at $DIR/lower_intrinsics.rs:35:5: 35:21 let mut _3: u64; // in scope 1 at $DIR/lower_intrinsics.rs:35:5: 35:21 scope 2 (inlined std::mem::size_of::) { // at $DIR/lower_intrinsics.rs:35:5: 35:21 @@ -12,6 +12,7 @@ fn f_u64() -> () { } bb0: { + StorageLive(_1); // scope 0 at $DIR/lower_intrinsics.rs:35:5: 35:21 _1 = const 0_u64; // scope 0 at $DIR/lower_intrinsics.rs:35:5: 35:21 StorageLive(_2); // scope 1 at $DIR/lower_intrinsics.rs:35:5: 35:21 StorageLive(_3); // scope 1 at $DIR/lower_intrinsics.rs:35:5: 35:21 @@ -25,7 +26,7 @@ fn f_u64() -> () { bb1: { StorageDead(_3); // scope 1 at $DIR/lower_intrinsics.rs:35:5: 35:21 StorageDead(_2); // scope 1 at $DIR/lower_intrinsics.rs:35:5: 35:21 - _0 = const (); // scope 0 at $DIR/lower_intrinsics.rs:34:16: 36:2 + StorageDead(_1); // scope 0 at $DIR/lower_intrinsics.rs:35:5: 35:21 return; // scope 0 at $DIR/lower_intrinsics.rs:36:2: 36:2 } } diff --git a/src/test/mir-opt/lower_intrinsics.f_unit.PreCodegen.before.mir b/src/test/mir-opt/lower_intrinsics.f_unit.PreCodegen.before.mir index f8857eda73..2b9ffaaf97 100644 --- a/src/test/mir-opt/lower_intrinsics.f_unit.PreCodegen.before.mir +++ b/src/test/mir-opt/lower_intrinsics.f_unit.PreCodegen.before.mir @@ -22,7 +22,6 @@ fn f_unit() -> () { bb1: { StorageDead(_2); // scope 1 at $DIR/lower_intrinsics.rs:29:5: 29:19 StorageDead(_1); // scope 0 at $DIR/lower_intrinsics.rs:29:18: 29:19 - _0 = const (); // scope 0 at $DIR/lower_intrinsics.rs:28:17: 30:2 return; // scope 0 at $DIR/lower_intrinsics.rs:30:2: 30:2 } } diff --git a/src/test/mir-opt/matches_reduce_branches.bar.MatchBranchSimplification.32bit.diff b/src/test/mir-opt/matches_reduce_branches.bar.MatchBranchSimplification.32bit.diff index d3a29aa5d5..a52c6ae351 100644 --- a/src/test/mir-opt/matches_reduce_branches.bar.MatchBranchSimplification.32bit.diff +++ b/src/test/mir-opt/matches_reduce_branches.bar.MatchBranchSimplification.32bit.diff @@ -2,87 +2,84 @@ + // MIR for `bar` after MatchBranchSimplification fn bar(_1: i32) -> (bool, bool, bool, bool) { - debug i => _1; // in scope 0 at $DIR/matches_reduce_branches.rs:12:8: 12:9 - let mut _0: (bool, bool, bool, bool); // return place in scope 0 at $DIR/matches_reduce_branches.rs:12:19: 12:43 - let _2: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:13:9: 13:10 - let _6: (); // in scope 0 at $DIR/matches_reduce_branches.rs:18:5: 33:6 - let mut _7: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:35:6: 35:7 - let mut _8: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:35:9: 35:10 - let mut _9: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:35:12: 35:13 - let mut _10: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:35:15: 35:16 -+ let mut _11: i32; // in scope 0 at $DIR/matches_reduce_branches.rs:19:9: 19:10 + debug i => _1; // in scope 0 at $DIR/matches_reduce_branches.rs:13:8: 13:9 + let mut _0: (bool, bool, bool, bool); // return place in scope 0 at $DIR/matches_reduce_branches.rs:13:19: 13:43 + let _2: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:14:9: 14:10 + let _6: (); // in scope 0 at $DIR/matches_reduce_branches.rs:19:5: 34:6 + let mut _7: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:36:6: 36:7 + let mut _8: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:36:9: 36:10 + let mut _9: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:36:12: 36:13 + let mut _10: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:36:15: 36:16 ++ let mut _11: i32; // in scope 0 at $DIR/matches_reduce_branches.rs:20:9: 20:10 scope 1 { - debug a => _2; // in scope 1 at $DIR/matches_reduce_branches.rs:13:9: 13:10 - let _3: bool; // in scope 1 at $DIR/matches_reduce_branches.rs:14:9: 14:10 + debug a => _2; // in scope 1 at $DIR/matches_reduce_branches.rs:14:9: 14:10 + let _3: bool; // in scope 1 at $DIR/matches_reduce_branches.rs:15:9: 15:10 scope 2 { - debug b => _3; // in scope 2 at $DIR/matches_reduce_branches.rs:14:9: 14:10 - let _4: bool; // in scope 2 at $DIR/matches_reduce_branches.rs:15:9: 15:10 + debug b => _3; // in scope 2 at $DIR/matches_reduce_branches.rs:15:9: 15:10 + let _4: bool; // in scope 2 at $DIR/matches_reduce_branches.rs:16:9: 16:10 scope 3 { - debug c => _4; // in scope 3 at $DIR/matches_reduce_branches.rs:15:9: 15:10 - let _5: bool; // in scope 3 at $DIR/matches_reduce_branches.rs:16:9: 16:10 + debug c => _4; // in scope 3 at $DIR/matches_reduce_branches.rs:16:9: 16:10 + let _5: bool; // in scope 3 at $DIR/matches_reduce_branches.rs:17:9: 17:10 scope 4 { - debug d => _5; // in scope 4 at $DIR/matches_reduce_branches.rs:16:9: 16:10 + debug d => _5; // in scope 4 at $DIR/matches_reduce_branches.rs:17:9: 17:10 } } } } bb0: { - StorageLive(_2); // scope 0 at $DIR/matches_reduce_branches.rs:13:9: 13:10 - StorageLive(_3); // scope 1 at $DIR/matches_reduce_branches.rs:14:9: 14:10 - StorageLive(_4); // scope 2 at $DIR/matches_reduce_branches.rs:15:9: 15:10 - StorageLive(_5); // scope 3 at $DIR/matches_reduce_branches.rs:16:9: 16:10 - StorageLive(_6); // scope 4 at $DIR/matches_reduce_branches.rs:18:5: 33:6 -- switchInt(_1) -> [7_i32: bb2, otherwise: bb1]; // scope 4 at $DIR/matches_reduce_branches.rs:19:9: 19:10 -+ StorageLive(_11); // scope 4 at $DIR/matches_reduce_branches.rs:19:9: 19:10 -+ _11 = _1; // scope 4 at $DIR/matches_reduce_branches.rs:19:9: 19:10 -+ _2 = Ne(_11, const 7_i32); // scope 4 at $DIR/matches_reduce_branches.rs:20:13: 20:22 -+ _3 = Eq(_11, const 7_i32); // scope 4 at $DIR/matches_reduce_branches.rs:21:13: 21:21 -+ _4 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:22:13: 22:22 -+ _5 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:23:13: 23:21 -+ StorageDead(_11); // scope 4 at $DIR/matches_reduce_branches.rs:19:9: 19:10 -+ goto -> bb3; // scope 4 at $DIR/matches_reduce_branches.rs:19:9: 19:10 - } - - bb1: { - _2 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:27:13: 27:21 - _3 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:28:13: 28:22 - _4 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:29:13: 29:22 - _5 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:30:13: 30:21 - goto -> bb3; // scope 4 at $DIR/matches_reduce_branches.rs:18:5: 33:6 - } - - bb2: { - _2 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:20:13: 20:22 - _3 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:21:13: 21:21 - _4 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:22:13: 22:22 - _5 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:23:13: 23:21 - goto -> bb3; // scope 4 at $DIR/matches_reduce_branches.rs:18:5: 33:6 - } - - bb3: { - StorageDead(_6); // scope 4 at $DIR/matches_reduce_branches.rs:33:6: 33:7 - StorageLive(_7); // scope 4 at $DIR/matches_reduce_branches.rs:35:6: 35:7 - _7 = _2; // scope 4 at $DIR/matches_reduce_branches.rs:35:6: 35:7 - StorageLive(_8); // scope 4 at $DIR/matches_reduce_branches.rs:35:9: 35:10 - _8 = _3; // scope 4 at $DIR/matches_reduce_branches.rs:35:9: 35:10 - StorageLive(_9); // scope 4 at $DIR/matches_reduce_branches.rs:35:12: 35:13 - _9 = _4; // scope 4 at $DIR/matches_reduce_branches.rs:35:12: 35:13 - StorageLive(_10); // scope 4 at $DIR/matches_reduce_branches.rs:35:15: 35:16 - _10 = _5; // scope 4 at $DIR/matches_reduce_branches.rs:35:15: 35:16 - (_0.0: bool) = move _7; // scope 4 at $DIR/matches_reduce_branches.rs:35:5: 35:17 - (_0.1: bool) = move _8; // scope 4 at $DIR/matches_reduce_branches.rs:35:5: 35:17 - (_0.2: bool) = move _9; // scope 4 at $DIR/matches_reduce_branches.rs:35:5: 35:17 - (_0.3: bool) = move _10; // scope 4 at $DIR/matches_reduce_branches.rs:35:5: 35:17 - StorageDead(_10); // scope 4 at $DIR/matches_reduce_branches.rs:35:16: 35:17 - StorageDead(_9); // scope 4 at $DIR/matches_reduce_branches.rs:35:16: 35:17 - StorageDead(_8); // scope 4 at $DIR/matches_reduce_branches.rs:35:16: 35:17 - StorageDead(_7); // scope 4 at $DIR/matches_reduce_branches.rs:35:16: 35:17 - StorageDead(_5); // scope 3 at $DIR/matches_reduce_branches.rs:36:1: 36:2 - StorageDead(_4); // scope 2 at $DIR/matches_reduce_branches.rs:36:1: 36:2 - StorageDead(_3); // scope 1 at $DIR/matches_reduce_branches.rs:36:1: 36:2 - StorageDead(_2); // scope 0 at $DIR/matches_reduce_branches.rs:36:1: 36:2 - return; // scope 0 at $DIR/matches_reduce_branches.rs:36:2: 36:2 + StorageLive(_2); // scope 0 at $DIR/matches_reduce_branches.rs:14:9: 14:10 + StorageLive(_3); // scope 1 at $DIR/matches_reduce_branches.rs:15:9: 15:10 + StorageLive(_4); // scope 2 at $DIR/matches_reduce_branches.rs:16:9: 16:10 + StorageLive(_5); // scope 3 at $DIR/matches_reduce_branches.rs:17:9: 17:10 + StorageLive(_6); // scope 4 at $DIR/matches_reduce_branches.rs:19:5: 34:6 +- switchInt(_1) -> [7_i32: bb2, otherwise: bb1]; // scope 4 at $DIR/matches_reduce_branches.rs:20:9: 20:10 +- } +- +- bb1: { +- _2 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:28:13: 28:21 +- _3 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:29:13: 29:22 +- _4 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:30:13: 30:22 +- _5 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:31:13: 31:21 +- goto -> bb3; // scope 4 at $DIR/matches_reduce_branches.rs:19:5: 34:6 +- } +- +- bb2: { +- _2 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:21:13: 21:22 +- _3 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:22:13: 22:21 ++ StorageLive(_11); // scope 4 at $DIR/matches_reduce_branches.rs:20:9: 20:10 ++ _11 = _1; // scope 4 at $DIR/matches_reduce_branches.rs:20:9: 20:10 ++ _2 = Ne(_11, const 7_i32); // scope 4 at $DIR/matches_reduce_branches.rs:21:13: 21:22 ++ _3 = Eq(_11, const 7_i32); // scope 4 at $DIR/matches_reduce_branches.rs:22:13: 22:21 + _4 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:23:13: 23:22 + _5 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:24:13: 24:21 +- goto -> bb3; // scope 4 at $DIR/matches_reduce_branches.rs:19:5: 34:6 +- } +- +- bb3: { ++ StorageDead(_11); // scope 4 at $DIR/matches_reduce_branches.rs:20:9: 20:10 + StorageDead(_6); // scope 4 at $DIR/matches_reduce_branches.rs:34:6: 34:7 + StorageLive(_7); // scope 4 at $DIR/matches_reduce_branches.rs:36:6: 36:7 + _7 = _2; // scope 4 at $DIR/matches_reduce_branches.rs:36:6: 36:7 + StorageLive(_8); // scope 4 at $DIR/matches_reduce_branches.rs:36:9: 36:10 + _8 = _3; // scope 4 at $DIR/matches_reduce_branches.rs:36:9: 36:10 + StorageLive(_9); // scope 4 at $DIR/matches_reduce_branches.rs:36:12: 36:13 + _9 = _4; // scope 4 at $DIR/matches_reduce_branches.rs:36:12: 36:13 + StorageLive(_10); // scope 4 at $DIR/matches_reduce_branches.rs:36:15: 36:16 + _10 = _5; // scope 4 at $DIR/matches_reduce_branches.rs:36:15: 36:16 + (_0.0: bool) = move _7; // scope 4 at $DIR/matches_reduce_branches.rs:36:5: 36:17 + (_0.1: bool) = move _8; // scope 4 at $DIR/matches_reduce_branches.rs:36:5: 36:17 + (_0.2: bool) = move _9; // scope 4 at $DIR/matches_reduce_branches.rs:36:5: 36:17 + (_0.3: bool) = move _10; // scope 4 at $DIR/matches_reduce_branches.rs:36:5: 36:17 + StorageDead(_10); // scope 4 at $DIR/matches_reduce_branches.rs:36:16: 36:17 + StorageDead(_9); // scope 4 at $DIR/matches_reduce_branches.rs:36:16: 36:17 + StorageDead(_8); // scope 4 at $DIR/matches_reduce_branches.rs:36:16: 36:17 + StorageDead(_7); // scope 4 at $DIR/matches_reduce_branches.rs:36:16: 36:17 + StorageDead(_5); // scope 3 at $DIR/matches_reduce_branches.rs:37:1: 37:2 + StorageDead(_4); // scope 2 at $DIR/matches_reduce_branches.rs:37:1: 37:2 + StorageDead(_3); // scope 1 at $DIR/matches_reduce_branches.rs:37:1: 37:2 + StorageDead(_2); // scope 0 at $DIR/matches_reduce_branches.rs:37:1: 37:2 + return; // scope 0 at $DIR/matches_reduce_branches.rs:37:2: 37:2 } } diff --git a/src/test/mir-opt/matches_reduce_branches.bar.MatchBranchSimplification.64bit.diff b/src/test/mir-opt/matches_reduce_branches.bar.MatchBranchSimplification.64bit.diff index d3a29aa5d5..a52c6ae351 100644 --- a/src/test/mir-opt/matches_reduce_branches.bar.MatchBranchSimplification.64bit.diff +++ b/src/test/mir-opt/matches_reduce_branches.bar.MatchBranchSimplification.64bit.diff @@ -2,87 +2,84 @@ + // MIR for `bar` after MatchBranchSimplification fn bar(_1: i32) -> (bool, bool, bool, bool) { - debug i => _1; // in scope 0 at $DIR/matches_reduce_branches.rs:12:8: 12:9 - let mut _0: (bool, bool, bool, bool); // return place in scope 0 at $DIR/matches_reduce_branches.rs:12:19: 12:43 - let _2: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:13:9: 13:10 - let _6: (); // in scope 0 at $DIR/matches_reduce_branches.rs:18:5: 33:6 - let mut _7: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:35:6: 35:7 - let mut _8: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:35:9: 35:10 - let mut _9: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:35:12: 35:13 - let mut _10: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:35:15: 35:16 -+ let mut _11: i32; // in scope 0 at $DIR/matches_reduce_branches.rs:19:9: 19:10 + debug i => _1; // in scope 0 at $DIR/matches_reduce_branches.rs:13:8: 13:9 + let mut _0: (bool, bool, bool, bool); // return place in scope 0 at $DIR/matches_reduce_branches.rs:13:19: 13:43 + let _2: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:14:9: 14:10 + let _6: (); // in scope 0 at $DIR/matches_reduce_branches.rs:19:5: 34:6 + let mut _7: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:36:6: 36:7 + let mut _8: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:36:9: 36:10 + let mut _9: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:36:12: 36:13 + let mut _10: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:36:15: 36:16 ++ let mut _11: i32; // in scope 0 at $DIR/matches_reduce_branches.rs:20:9: 20:10 scope 1 { - debug a => _2; // in scope 1 at $DIR/matches_reduce_branches.rs:13:9: 13:10 - let _3: bool; // in scope 1 at $DIR/matches_reduce_branches.rs:14:9: 14:10 + debug a => _2; // in scope 1 at $DIR/matches_reduce_branches.rs:14:9: 14:10 + let _3: bool; // in scope 1 at $DIR/matches_reduce_branches.rs:15:9: 15:10 scope 2 { - debug b => _3; // in scope 2 at $DIR/matches_reduce_branches.rs:14:9: 14:10 - let _4: bool; // in scope 2 at $DIR/matches_reduce_branches.rs:15:9: 15:10 + debug b => _3; // in scope 2 at $DIR/matches_reduce_branches.rs:15:9: 15:10 + let _4: bool; // in scope 2 at $DIR/matches_reduce_branches.rs:16:9: 16:10 scope 3 { - debug c => _4; // in scope 3 at $DIR/matches_reduce_branches.rs:15:9: 15:10 - let _5: bool; // in scope 3 at $DIR/matches_reduce_branches.rs:16:9: 16:10 + debug c => _4; // in scope 3 at $DIR/matches_reduce_branches.rs:16:9: 16:10 + let _5: bool; // in scope 3 at $DIR/matches_reduce_branches.rs:17:9: 17:10 scope 4 { - debug d => _5; // in scope 4 at $DIR/matches_reduce_branches.rs:16:9: 16:10 + debug d => _5; // in scope 4 at $DIR/matches_reduce_branches.rs:17:9: 17:10 } } } } bb0: { - StorageLive(_2); // scope 0 at $DIR/matches_reduce_branches.rs:13:9: 13:10 - StorageLive(_3); // scope 1 at $DIR/matches_reduce_branches.rs:14:9: 14:10 - StorageLive(_4); // scope 2 at $DIR/matches_reduce_branches.rs:15:9: 15:10 - StorageLive(_5); // scope 3 at $DIR/matches_reduce_branches.rs:16:9: 16:10 - StorageLive(_6); // scope 4 at $DIR/matches_reduce_branches.rs:18:5: 33:6 -- switchInt(_1) -> [7_i32: bb2, otherwise: bb1]; // scope 4 at $DIR/matches_reduce_branches.rs:19:9: 19:10 -+ StorageLive(_11); // scope 4 at $DIR/matches_reduce_branches.rs:19:9: 19:10 -+ _11 = _1; // scope 4 at $DIR/matches_reduce_branches.rs:19:9: 19:10 -+ _2 = Ne(_11, const 7_i32); // scope 4 at $DIR/matches_reduce_branches.rs:20:13: 20:22 -+ _3 = Eq(_11, const 7_i32); // scope 4 at $DIR/matches_reduce_branches.rs:21:13: 21:21 -+ _4 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:22:13: 22:22 -+ _5 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:23:13: 23:21 -+ StorageDead(_11); // scope 4 at $DIR/matches_reduce_branches.rs:19:9: 19:10 -+ goto -> bb3; // scope 4 at $DIR/matches_reduce_branches.rs:19:9: 19:10 - } - - bb1: { - _2 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:27:13: 27:21 - _3 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:28:13: 28:22 - _4 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:29:13: 29:22 - _5 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:30:13: 30:21 - goto -> bb3; // scope 4 at $DIR/matches_reduce_branches.rs:18:5: 33:6 - } - - bb2: { - _2 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:20:13: 20:22 - _3 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:21:13: 21:21 - _4 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:22:13: 22:22 - _5 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:23:13: 23:21 - goto -> bb3; // scope 4 at $DIR/matches_reduce_branches.rs:18:5: 33:6 - } - - bb3: { - StorageDead(_6); // scope 4 at $DIR/matches_reduce_branches.rs:33:6: 33:7 - StorageLive(_7); // scope 4 at $DIR/matches_reduce_branches.rs:35:6: 35:7 - _7 = _2; // scope 4 at $DIR/matches_reduce_branches.rs:35:6: 35:7 - StorageLive(_8); // scope 4 at $DIR/matches_reduce_branches.rs:35:9: 35:10 - _8 = _3; // scope 4 at $DIR/matches_reduce_branches.rs:35:9: 35:10 - StorageLive(_9); // scope 4 at $DIR/matches_reduce_branches.rs:35:12: 35:13 - _9 = _4; // scope 4 at $DIR/matches_reduce_branches.rs:35:12: 35:13 - StorageLive(_10); // scope 4 at $DIR/matches_reduce_branches.rs:35:15: 35:16 - _10 = _5; // scope 4 at $DIR/matches_reduce_branches.rs:35:15: 35:16 - (_0.0: bool) = move _7; // scope 4 at $DIR/matches_reduce_branches.rs:35:5: 35:17 - (_0.1: bool) = move _8; // scope 4 at $DIR/matches_reduce_branches.rs:35:5: 35:17 - (_0.2: bool) = move _9; // scope 4 at $DIR/matches_reduce_branches.rs:35:5: 35:17 - (_0.3: bool) = move _10; // scope 4 at $DIR/matches_reduce_branches.rs:35:5: 35:17 - StorageDead(_10); // scope 4 at $DIR/matches_reduce_branches.rs:35:16: 35:17 - StorageDead(_9); // scope 4 at $DIR/matches_reduce_branches.rs:35:16: 35:17 - StorageDead(_8); // scope 4 at $DIR/matches_reduce_branches.rs:35:16: 35:17 - StorageDead(_7); // scope 4 at $DIR/matches_reduce_branches.rs:35:16: 35:17 - StorageDead(_5); // scope 3 at $DIR/matches_reduce_branches.rs:36:1: 36:2 - StorageDead(_4); // scope 2 at $DIR/matches_reduce_branches.rs:36:1: 36:2 - StorageDead(_3); // scope 1 at $DIR/matches_reduce_branches.rs:36:1: 36:2 - StorageDead(_2); // scope 0 at $DIR/matches_reduce_branches.rs:36:1: 36:2 - return; // scope 0 at $DIR/matches_reduce_branches.rs:36:2: 36:2 + StorageLive(_2); // scope 0 at $DIR/matches_reduce_branches.rs:14:9: 14:10 + StorageLive(_3); // scope 1 at $DIR/matches_reduce_branches.rs:15:9: 15:10 + StorageLive(_4); // scope 2 at $DIR/matches_reduce_branches.rs:16:9: 16:10 + StorageLive(_5); // scope 3 at $DIR/matches_reduce_branches.rs:17:9: 17:10 + StorageLive(_6); // scope 4 at $DIR/matches_reduce_branches.rs:19:5: 34:6 +- switchInt(_1) -> [7_i32: bb2, otherwise: bb1]; // scope 4 at $DIR/matches_reduce_branches.rs:20:9: 20:10 +- } +- +- bb1: { +- _2 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:28:13: 28:21 +- _3 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:29:13: 29:22 +- _4 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:30:13: 30:22 +- _5 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:31:13: 31:21 +- goto -> bb3; // scope 4 at $DIR/matches_reduce_branches.rs:19:5: 34:6 +- } +- +- bb2: { +- _2 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:21:13: 21:22 +- _3 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:22:13: 22:21 ++ StorageLive(_11); // scope 4 at $DIR/matches_reduce_branches.rs:20:9: 20:10 ++ _11 = _1; // scope 4 at $DIR/matches_reduce_branches.rs:20:9: 20:10 ++ _2 = Ne(_11, const 7_i32); // scope 4 at $DIR/matches_reduce_branches.rs:21:13: 21:22 ++ _3 = Eq(_11, const 7_i32); // scope 4 at $DIR/matches_reduce_branches.rs:22:13: 22:21 + _4 = const false; // scope 4 at $DIR/matches_reduce_branches.rs:23:13: 23:22 + _5 = const true; // scope 4 at $DIR/matches_reduce_branches.rs:24:13: 24:21 +- goto -> bb3; // scope 4 at $DIR/matches_reduce_branches.rs:19:5: 34:6 +- } +- +- bb3: { ++ StorageDead(_11); // scope 4 at $DIR/matches_reduce_branches.rs:20:9: 20:10 + StorageDead(_6); // scope 4 at $DIR/matches_reduce_branches.rs:34:6: 34:7 + StorageLive(_7); // scope 4 at $DIR/matches_reduce_branches.rs:36:6: 36:7 + _7 = _2; // scope 4 at $DIR/matches_reduce_branches.rs:36:6: 36:7 + StorageLive(_8); // scope 4 at $DIR/matches_reduce_branches.rs:36:9: 36:10 + _8 = _3; // scope 4 at $DIR/matches_reduce_branches.rs:36:9: 36:10 + StorageLive(_9); // scope 4 at $DIR/matches_reduce_branches.rs:36:12: 36:13 + _9 = _4; // scope 4 at $DIR/matches_reduce_branches.rs:36:12: 36:13 + StorageLive(_10); // scope 4 at $DIR/matches_reduce_branches.rs:36:15: 36:16 + _10 = _5; // scope 4 at $DIR/matches_reduce_branches.rs:36:15: 36:16 + (_0.0: bool) = move _7; // scope 4 at $DIR/matches_reduce_branches.rs:36:5: 36:17 + (_0.1: bool) = move _8; // scope 4 at $DIR/matches_reduce_branches.rs:36:5: 36:17 + (_0.2: bool) = move _9; // scope 4 at $DIR/matches_reduce_branches.rs:36:5: 36:17 + (_0.3: bool) = move _10; // scope 4 at $DIR/matches_reduce_branches.rs:36:5: 36:17 + StorageDead(_10); // scope 4 at $DIR/matches_reduce_branches.rs:36:16: 36:17 + StorageDead(_9); // scope 4 at $DIR/matches_reduce_branches.rs:36:16: 36:17 + StorageDead(_8); // scope 4 at $DIR/matches_reduce_branches.rs:36:16: 36:17 + StorageDead(_7); // scope 4 at $DIR/matches_reduce_branches.rs:36:16: 36:17 + StorageDead(_5); // scope 3 at $DIR/matches_reduce_branches.rs:37:1: 37:2 + StorageDead(_4); // scope 2 at $DIR/matches_reduce_branches.rs:37:1: 37:2 + StorageDead(_3); // scope 1 at $DIR/matches_reduce_branches.rs:37:1: 37:2 + StorageDead(_2); // scope 0 at $DIR/matches_reduce_branches.rs:37:1: 37:2 + return; // scope 0 at $DIR/matches_reduce_branches.rs:37:2: 37:2 } } diff --git a/src/test/mir-opt/matches_reduce_branches.foo.MatchBranchSimplification.32bit.diff b/src/test/mir-opt/matches_reduce_branches.foo.MatchBranchSimplification.32bit.diff index 2024034823..9f0db1db1b 100644 --- a/src/test/mir-opt/matches_reduce_branches.foo.MatchBranchSimplification.32bit.diff +++ b/src/test/mir-opt/matches_reduce_branches.foo.MatchBranchSimplification.32bit.diff @@ -2,45 +2,29 @@ + // MIR for `foo` after MatchBranchSimplification fn foo(_1: Option<()>) -> () { - debug bar => _1; // in scope 0 at $DIR/matches_reduce_branches.rs:6:8: 6:11 - let mut _0: (); // return place in scope 0 at $DIR/matches_reduce_branches.rs:6:25: 6:25 - let mut _2: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _3: isize; // in scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 -+ let mut _4: isize; // in scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 + debug bar => _1; // in scope 0 at $DIR/matches_reduce_branches.rs:7:8: 7:11 + let mut _0: (); // return place in scope 0 at $DIR/matches_reduce_branches.rs:7:25: 7:25 + let mut _2: isize; // in scope 0 at $DIR/matches_reduce_branches.rs:8:22: 8:26 ++ let mut _3: isize; // in scope 0 at $DIR/matches_reduce_branches.rs:8:22: 8:26 bb0: { - StorageLive(_2); // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _3 = discriminant(_1); // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 -- switchInt(move _3) -> [0_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 -+ StorageLive(_4); // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 -+ _4 = move _3; // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 -+ _2 = Eq(_4, const 0_isize); // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL -+ StorageDead(_4); // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 -+ goto -> bb3; // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 - } - - bb1: { - _2 = const false; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - goto -> bb3; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - } - - bb2: { - _2 = const true; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - goto -> bb3; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - } - - bb3: { - switchInt(move _2) -> [false: bb4, otherwise: bb5]; // scope 0 at $DIR/matches_reduce_branches.rs:7:5: 9:6 - } - - bb4: { - _0 = const (); // scope 0 at $DIR/matches_reduce_branches.rs:9:6: 9:6 - goto -> bb5; // scope 0 at $DIR/matches_reduce_branches.rs:7:5: 9:6 - } - - bb5: { - StorageDead(_2); // scope 0 at $DIR/matches_reduce_branches.rs:9:5: 9:6 - return; // scope 0 at $DIR/matches_reduce_branches.rs:10:2: 10:2 + _2 = discriminant(_1); // scope 0 at $DIR/matches_reduce_branches.rs:8:22: 8:26 +- switchInt(move _2) -> [0_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/matches_reduce_branches.rs:8:22: 8:26 +- } +- +- bb1: { +- goto -> bb3; // scope 0 at $DIR/matches_reduce_branches.rs:8:5: 10:6 +- } +- +- bb2: { +- goto -> bb3; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL +- } +- +- bb3: { ++ StorageLive(_3); // scope 0 at $DIR/matches_reduce_branches.rs:8:22: 8:26 ++ _3 = move _2; // scope 0 at $DIR/matches_reduce_branches.rs:8:22: 8:26 ++ StorageDead(_3); // scope 0 at $DIR/matches_reduce_branches.rs:8:22: 8:26 + return; // scope 0 at $DIR/matches_reduce_branches.rs:11:2: 11:2 } } diff --git a/src/test/mir-opt/matches_reduce_branches.foo.MatchBranchSimplification.64bit.diff b/src/test/mir-opt/matches_reduce_branches.foo.MatchBranchSimplification.64bit.diff index 2024034823..9f0db1db1b 100644 --- a/src/test/mir-opt/matches_reduce_branches.foo.MatchBranchSimplification.64bit.diff +++ b/src/test/mir-opt/matches_reduce_branches.foo.MatchBranchSimplification.64bit.diff @@ -2,45 +2,29 @@ + // MIR for `foo` after MatchBranchSimplification fn foo(_1: Option<()>) -> () { - debug bar => _1; // in scope 0 at $DIR/matches_reduce_branches.rs:6:8: 6:11 - let mut _0: (); // return place in scope 0 at $DIR/matches_reduce_branches.rs:6:25: 6:25 - let mut _2: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _3: isize; // in scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 -+ let mut _4: isize; // in scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 + debug bar => _1; // in scope 0 at $DIR/matches_reduce_branches.rs:7:8: 7:11 + let mut _0: (); // return place in scope 0 at $DIR/matches_reduce_branches.rs:7:25: 7:25 + let mut _2: isize; // in scope 0 at $DIR/matches_reduce_branches.rs:8:22: 8:26 ++ let mut _3: isize; // in scope 0 at $DIR/matches_reduce_branches.rs:8:22: 8:26 bb0: { - StorageLive(_2); // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _3 = discriminant(_1); // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 -- switchInt(move _3) -> [0_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 -+ StorageLive(_4); // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 -+ _4 = move _3; // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 -+ _2 = Eq(_4, const 0_isize); // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL -+ StorageDead(_4); // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 -+ goto -> bb3; // scope 0 at $DIR/matches_reduce_branches.rs:7:22: 7:26 - } - - bb1: { - _2 = const false; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - goto -> bb3; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - } - - bb2: { - _2 = const true; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - goto -> bb3; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - } - - bb3: { - switchInt(move _2) -> [false: bb4, otherwise: bb5]; // scope 0 at $DIR/matches_reduce_branches.rs:7:5: 9:6 - } - - bb4: { - _0 = const (); // scope 0 at $DIR/matches_reduce_branches.rs:9:6: 9:6 - goto -> bb5; // scope 0 at $DIR/matches_reduce_branches.rs:7:5: 9:6 - } - - bb5: { - StorageDead(_2); // scope 0 at $DIR/matches_reduce_branches.rs:9:5: 9:6 - return; // scope 0 at $DIR/matches_reduce_branches.rs:10:2: 10:2 + _2 = discriminant(_1); // scope 0 at $DIR/matches_reduce_branches.rs:8:22: 8:26 +- switchInt(move _2) -> [0_isize: bb2, otherwise: bb1]; // scope 0 at $DIR/matches_reduce_branches.rs:8:22: 8:26 +- } +- +- bb1: { +- goto -> bb3; // scope 0 at $DIR/matches_reduce_branches.rs:8:5: 10:6 +- } +- +- bb2: { +- goto -> bb3; // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL +- } +- +- bb3: { ++ StorageLive(_3); // scope 0 at $DIR/matches_reduce_branches.rs:8:22: 8:26 ++ _3 = move _2; // scope 0 at $DIR/matches_reduce_branches.rs:8:22: 8:26 ++ StorageDead(_3); // scope 0 at $DIR/matches_reduce_branches.rs:8:22: 8:26 + return; // scope 0 at $DIR/matches_reduce_branches.rs:11:2: 11:2 } } diff --git a/src/test/mir-opt/matches_reduce_branches.foo.PreCodegen.before.32bit.mir b/src/test/mir-opt/matches_reduce_branches.foo.PreCodegen.before.32bit.mir new file mode 100644 index 0000000000..e3b318c949 --- /dev/null +++ b/src/test/mir-opt/matches_reduce_branches.foo.PreCodegen.before.32bit.mir @@ -0,0 +1,10 @@ +// MIR for `foo` before PreCodegen + +fn foo(_1: Option<()>) -> () { + debug bar => _1; // in scope 0 at $DIR/matches_reduce_branches.rs:7:8: 7:11 + let mut _0: (); // return place in scope 0 at $DIR/matches_reduce_branches.rs:7:25: 7:25 + + bb0: { + return; // scope 0 at $DIR/matches_reduce_branches.rs:11:2: 11:2 + } +} diff --git a/src/test/mir-opt/matches_reduce_branches.foo.PreCodegen.before.64bit.mir b/src/test/mir-opt/matches_reduce_branches.foo.PreCodegen.before.64bit.mir new file mode 100644 index 0000000000..e3b318c949 --- /dev/null +++ b/src/test/mir-opt/matches_reduce_branches.foo.PreCodegen.before.64bit.mir @@ -0,0 +1,10 @@ +// MIR for `foo` before PreCodegen + +fn foo(_1: Option<()>) -> () { + debug bar => _1; // in scope 0 at $DIR/matches_reduce_branches.rs:7:8: 7:11 + let mut _0: (); // return place in scope 0 at $DIR/matches_reduce_branches.rs:7:25: 7:25 + + bb0: { + return; // scope 0 at $DIR/matches_reduce_branches.rs:11:2: 11:2 + } +} diff --git a/src/test/mir-opt/matches_reduce_branches.match_nested_if.MatchBranchSimplification.32bit.diff b/src/test/mir-opt/matches_reduce_branches.match_nested_if.MatchBranchSimplification.32bit.diff index 1d89585235..410320e643 100644 --- a/src/test/mir-opt/matches_reduce_branches.match_nested_if.MatchBranchSimplification.32bit.diff +++ b/src/test/mir-opt/matches_reduce_branches.match_nested_if.MatchBranchSimplification.32bit.diff @@ -2,115 +2,110 @@ + // MIR for `match_nested_if` after MatchBranchSimplification fn match_nested_if() -> bool { - let mut _0: bool; // return place in scope 0 at $DIR/matches_reduce_branches.rs:38:25: 38:29 - let _1: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:39:9: 39:12 - let mut _2: (); // in scope 0 at $DIR/matches_reduce_branches.rs:39:21: 39:23 - let mut _3: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 - let mut _4: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 - let mut _5: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 - let mut _6: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:24: 40:28 -+ let mut _7: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 -+ let mut _8: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 -+ let mut _9: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ let mut _10: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 + let mut _0: bool; // return place in scope 0 at $DIR/matches_reduce_branches.rs:39:25: 39:29 + let _1: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:9: 40:12 + let mut _2: (); // in scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:23 + let mut _3: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 + let mut _4: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 + let mut _5: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 + let mut _6: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:24: 41:28 ++ let mut _7: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 ++ let mut _8: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 ++ let mut _9: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 ++ let mut _10: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 scope 1 { - debug val => _1; // in scope 1 at $DIR/matches_reduce_branches.rs:39:9: 39:12 + debug val => _1; // in scope 1 at $DIR/matches_reduce_branches.rs:40:9: 40:12 } bb0: { - StorageLive(_1); // scope 0 at $DIR/matches_reduce_branches.rs:39:9: 39:12 - StorageLive(_2); // scope 0 at $DIR/matches_reduce_branches.rs:39:21: 39:23 - StorageLive(_3); // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 - StorageLive(_4); // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 - StorageLive(_5); // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 - StorageLive(_6); // scope 0 at $DIR/matches_reduce_branches.rs:40:24: 40:28 - _6 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:40:24: 40:28 -- switchInt(move _6) -> [false: bb2, otherwise: bb1]; // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 -+ StorageLive(_7); // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 -+ _7 = move _6; // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 -+ _5 = Ne(_7, const false); // scope 0 at $DIR/matches_reduce_branches.rs:40:42: 40:47 -+ StorageDead(_7); // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 -+ goto -> bb3; // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 - } - - bb1: { - _5 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:40:30: 40:34 - goto -> bb3; // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 - } - - bb2: { - _5 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:40:42: 40:47 - goto -> bb3; // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 - } - - bb3: { - StorageDead(_6); // scope 0 at $DIR/matches_reduce_branches.rs:40:47: 40:48 -- switchInt(move _5) -> [false: bb5, otherwise: bb4]; // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 -+ StorageLive(_8); // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 -+ _8 = move _5; // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 -+ _4 = Ne(_8, const false); // scope 0 at $DIR/matches_reduce_branches.rs:40:62: 40:67 -+ StorageDead(_8); // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 -+ goto -> bb6; // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 - } - - bb4: { - _4 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:40:50: 40:54 - goto -> bb6; // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 - } - - bb5: { - _4 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:40:62: 40:67 - goto -> bb6; // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 - } - - bb6: { - StorageDead(_5); // scope 0 at $DIR/matches_reduce_branches.rs:40:67: 40:68 -- switchInt(move _4) -> [false: bb8, otherwise: bb7]; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ StorageLive(_9); // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ _9 = move _4; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ _3 = Ne(_9, const false); // scope 0 at $DIR/matches_reduce_branches.rs:40:82: 40:87 -+ StorageDead(_9); // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ goto -> bb9; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 - } - - bb7: { - _3 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:40:70: 40:74 - goto -> bb9; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 - } - - bb8: { - _3 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:40:82: 40:87 - goto -> bb9; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 - } - - bb9: { - StorageDead(_4); // scope 0 at $DIR/matches_reduce_branches.rs:40:87: 40:88 -- switchInt(move _3) -> [false: bb11, otherwise: bb10]; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ StorageLive(_10); // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ _10 = move _3; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ StorageDead(_3); // scope 0 at $DIR/matches_reduce_branches.rs:40:95: 40:96 -+ _1 = Ne(_10, const false); // scope 0 at $DIR/matches_reduce_branches.rs:41:14: 41:19 -+ StorageDead(_10); // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ goto -> bb12; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 - } - - bb10: { - StorageDead(_3); // scope 0 at $DIR/matches_reduce_branches.rs:40:95: 40:96 - _1 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:40:92: 40:96 - goto -> bb12; // scope 0 at $DIR/matches_reduce_branches.rs:39:15: 42:6 - } - - bb11: { - StorageDead(_3); // scope 0 at $DIR/matches_reduce_branches.rs:40:95: 40:96 - _1 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:41:14: 41:19 - goto -> bb12; // scope 0 at $DIR/matches_reduce_branches.rs:39:15: 42:6 - } - - bb12: { - StorageDead(_2); // scope 0 at $DIR/matches_reduce_branches.rs:42:6: 42:7 - _0 = _1; // scope 1 at $DIR/matches_reduce_branches.rs:43:5: 43:8 - StorageDead(_1); // scope 0 at $DIR/matches_reduce_branches.rs:44:1: 44:2 - return; // scope 0 at $DIR/matches_reduce_branches.rs:44:2: 44:2 + StorageLive(_1); // scope 0 at $DIR/matches_reduce_branches.rs:40:9: 40:12 + StorageLive(_2); // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:23 + StorageLive(_3); // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 + StorageLive(_4); // scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 + StorageLive(_5); // scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 + StorageLive(_6); // scope 0 at $DIR/matches_reduce_branches.rs:41:24: 41:28 + _6 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:41:24: 41:28 +- switchInt(move _6) -> [false: bb2, otherwise: bb1]; // scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 +- } +- +- bb1: { +- _5 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:41:31: 41:35 +- goto -> bb3; // scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 +- } +- +- bb2: { +- _5 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:41:45: 41:50 +- goto -> bb3; // scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 +- } +- +- bb3: { ++ StorageLive(_7); // scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 ++ _7 = move _6; // scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 ++ _5 = Ne(_7, const false); // scope 0 at $DIR/matches_reduce_branches.rs:41:45: 41:50 ++ StorageDead(_7); // scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 + StorageDead(_6); // scope 0 at $DIR/matches_reduce_branches.rs:41:51: 41:52 +- switchInt(move _5) -> [false: bb5, otherwise: bb4]; // scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 +- } +- +- bb4: { +- _4 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:41:55: 41:59 +- goto -> bb6; // scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 +- } +- +- bb5: { +- _4 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:41:69: 41:74 +- goto -> bb6; // scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 +- } +- +- bb6: { ++ StorageLive(_8); // scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 ++ _8 = move _5; // scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 ++ _4 = Ne(_8, const false); // scope 0 at $DIR/matches_reduce_branches.rs:41:69: 41:74 ++ StorageDead(_8); // scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 + StorageDead(_5); // scope 0 at $DIR/matches_reduce_branches.rs:41:75: 41:76 +- switchInt(move _4) -> [false: bb8, otherwise: bb7]; // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 +- } +- +- bb7: { +- _3 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:42:13: 42:17 +- goto -> bb9; // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 +- } +- +- bb8: { +- _3 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:44:13: 44:18 +- goto -> bb9; // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 +- } +- +- bb9: { ++ StorageLive(_9); // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 ++ _9 = move _4; // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 ++ _3 = Ne(_9, const false); // scope 0 at $DIR/matches_reduce_branches.rs:44:13: 44:18 ++ StorageDead(_9); // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 + StorageDead(_4); // scope 0 at $DIR/matches_reduce_branches.rs:45:9: 45:10 +- switchInt(move _3) -> [false: bb11, otherwise: bb10]; // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 +- } +- +- bb10: { ++ StorageLive(_10); // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 ++ _10 = move _3; // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 + StorageDead(_3); // scope 0 at $DIR/matches_reduce_branches.rs:48:9: 48:10 +- _1 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:47:13: 47:17 +- goto -> bb12; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 50:6 +- } +- +- bb11: { +- StorageDead(_3); // scope 0 at $DIR/matches_reduce_branches.rs:48:9: 48:10 +- _1 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:49:14: 49:19 +- goto -> bb12; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 50:6 +- } +- +- bb12: { ++ _1 = Ne(_10, const false); // scope 0 at $DIR/matches_reduce_branches.rs:49:14: 49:19 ++ StorageDead(_10); // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 + StorageDead(_2); // scope 0 at $DIR/matches_reduce_branches.rs:50:6: 50:7 + _0 = _1; // scope 1 at $DIR/matches_reduce_branches.rs:51:5: 51:8 + StorageDead(_1); // scope 0 at $DIR/matches_reduce_branches.rs:52:1: 52:2 + return; // scope 0 at $DIR/matches_reduce_branches.rs:52:2: 52:2 } } diff --git a/src/test/mir-opt/matches_reduce_branches.match_nested_if.MatchBranchSimplification.64bit.diff b/src/test/mir-opt/matches_reduce_branches.match_nested_if.MatchBranchSimplification.64bit.diff index 1d89585235..410320e643 100644 --- a/src/test/mir-opt/matches_reduce_branches.match_nested_if.MatchBranchSimplification.64bit.diff +++ b/src/test/mir-opt/matches_reduce_branches.match_nested_if.MatchBranchSimplification.64bit.diff @@ -2,115 +2,110 @@ + // MIR for `match_nested_if` after MatchBranchSimplification fn match_nested_if() -> bool { - let mut _0: bool; // return place in scope 0 at $DIR/matches_reduce_branches.rs:38:25: 38:29 - let _1: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:39:9: 39:12 - let mut _2: (); // in scope 0 at $DIR/matches_reduce_branches.rs:39:21: 39:23 - let mut _3: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 - let mut _4: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 - let mut _5: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 - let mut _6: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:24: 40:28 -+ let mut _7: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 -+ let mut _8: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 -+ let mut _9: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ let mut _10: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 + let mut _0: bool; // return place in scope 0 at $DIR/matches_reduce_branches.rs:39:25: 39:29 + let _1: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:40:9: 40:12 + let mut _2: (); // in scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:23 + let mut _3: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 + let mut _4: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 + let mut _5: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 + let mut _6: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:24: 41:28 ++ let mut _7: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 ++ let mut _8: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 ++ let mut _9: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 ++ let mut _10: bool; // in scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 scope 1 { - debug val => _1; // in scope 1 at $DIR/matches_reduce_branches.rs:39:9: 39:12 + debug val => _1; // in scope 1 at $DIR/matches_reduce_branches.rs:40:9: 40:12 } bb0: { - StorageLive(_1); // scope 0 at $DIR/matches_reduce_branches.rs:39:9: 39:12 - StorageLive(_2); // scope 0 at $DIR/matches_reduce_branches.rs:39:21: 39:23 - StorageLive(_3); // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 - StorageLive(_4); // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 - StorageLive(_5); // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 - StorageLive(_6); // scope 0 at $DIR/matches_reduce_branches.rs:40:24: 40:28 - _6 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:40:24: 40:28 -- switchInt(move _6) -> [false: bb2, otherwise: bb1]; // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 -+ StorageLive(_7); // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 -+ _7 = move _6; // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 -+ _5 = Ne(_7, const false); // scope 0 at $DIR/matches_reduce_branches.rs:40:42: 40:47 -+ StorageDead(_7); // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 -+ goto -> bb3; // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 - } - - bb1: { - _5 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:40:30: 40:34 - goto -> bb3; // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 - } - - bb2: { - _5 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:40:42: 40:47 - goto -> bb3; // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:48 - } - - bb3: { - StorageDead(_6); // scope 0 at $DIR/matches_reduce_branches.rs:40:47: 40:48 -- switchInt(move _5) -> [false: bb5, otherwise: bb4]; // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 -+ StorageLive(_8); // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 -+ _8 = move _5; // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 -+ _4 = Ne(_8, const false); // scope 0 at $DIR/matches_reduce_branches.rs:40:62: 40:67 -+ StorageDead(_8); // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 -+ goto -> bb6; // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 - } - - bb4: { - _4 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:40:50: 40:54 - goto -> bb6; // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 - } - - bb5: { - _4 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:40:62: 40:67 - goto -> bb6; // scope 0 at $DIR/matches_reduce_branches.rs:40:18: 40:68 - } - - bb6: { - StorageDead(_5); // scope 0 at $DIR/matches_reduce_branches.rs:40:67: 40:68 -- switchInt(move _4) -> [false: bb8, otherwise: bb7]; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ StorageLive(_9); // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ _9 = move _4; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ _3 = Ne(_9, const false); // scope 0 at $DIR/matches_reduce_branches.rs:40:82: 40:87 -+ StorageDead(_9); // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ goto -> bb9; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 - } - - bb7: { - _3 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:40:70: 40:74 - goto -> bb9; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 - } - - bb8: { - _3 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:40:82: 40:87 - goto -> bb9; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 - } - - bb9: { - StorageDead(_4); // scope 0 at $DIR/matches_reduce_branches.rs:40:87: 40:88 -- switchInt(move _3) -> [false: bb11, otherwise: bb10]; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ StorageLive(_10); // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ _10 = move _3; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ StorageDead(_3); // scope 0 at $DIR/matches_reduce_branches.rs:40:95: 40:96 -+ _1 = Ne(_10, const false); // scope 0 at $DIR/matches_reduce_branches.rs:41:14: 41:19 -+ StorageDead(_10); // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 -+ goto -> bb12; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 40:88 - } - - bb10: { - StorageDead(_3); // scope 0 at $DIR/matches_reduce_branches.rs:40:95: 40:96 - _1 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:40:92: 40:96 - goto -> bb12; // scope 0 at $DIR/matches_reduce_branches.rs:39:15: 42:6 - } - - bb11: { - StorageDead(_3); // scope 0 at $DIR/matches_reduce_branches.rs:40:95: 40:96 - _1 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:41:14: 41:19 - goto -> bb12; // scope 0 at $DIR/matches_reduce_branches.rs:39:15: 42:6 - } - - bb12: { - StorageDead(_2); // scope 0 at $DIR/matches_reduce_branches.rs:42:6: 42:7 - _0 = _1; // scope 1 at $DIR/matches_reduce_branches.rs:43:5: 43:8 - StorageDead(_1); // scope 0 at $DIR/matches_reduce_branches.rs:44:1: 44:2 - return; // scope 0 at $DIR/matches_reduce_branches.rs:44:2: 44:2 + StorageLive(_1); // scope 0 at $DIR/matches_reduce_branches.rs:40:9: 40:12 + StorageLive(_2); // scope 0 at $DIR/matches_reduce_branches.rs:40:21: 40:23 + StorageLive(_3); // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 + StorageLive(_4); // scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 + StorageLive(_5); // scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 + StorageLive(_6); // scope 0 at $DIR/matches_reduce_branches.rs:41:24: 41:28 + _6 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:41:24: 41:28 +- switchInt(move _6) -> [false: bb2, otherwise: bb1]; // scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 +- } +- +- bb1: { +- _5 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:41:31: 41:35 +- goto -> bb3; // scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 +- } +- +- bb2: { +- _5 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:41:45: 41:50 +- goto -> bb3; // scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 +- } +- +- bb3: { ++ StorageLive(_7); // scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 ++ _7 = move _6; // scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 ++ _5 = Ne(_7, const false); // scope 0 at $DIR/matches_reduce_branches.rs:41:45: 41:50 ++ StorageDead(_7); // scope 0 at $DIR/matches_reduce_branches.rs:41:21: 41:52 + StorageDead(_6); // scope 0 at $DIR/matches_reduce_branches.rs:41:51: 41:52 +- switchInt(move _5) -> [false: bb5, otherwise: bb4]; // scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 +- } +- +- bb4: { +- _4 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:41:55: 41:59 +- goto -> bb6; // scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 +- } +- +- bb5: { +- _4 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:41:69: 41:74 +- goto -> bb6; // scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 +- } +- +- bb6: { ++ StorageLive(_8); // scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 ++ _8 = move _5; // scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 ++ _4 = Ne(_8, const false); // scope 0 at $DIR/matches_reduce_branches.rs:41:69: 41:74 ++ StorageDead(_8); // scope 0 at $DIR/matches_reduce_branches.rs:41:18: 41:76 + StorageDead(_5); // scope 0 at $DIR/matches_reduce_branches.rs:41:75: 41:76 +- switchInt(move _4) -> [false: bb8, otherwise: bb7]; // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 +- } +- +- bb7: { +- _3 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:42:13: 42:17 +- goto -> bb9; // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 +- } +- +- bb8: { +- _3 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:44:13: 44:18 +- goto -> bb9; // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 +- } +- +- bb9: { ++ StorageLive(_9); // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 ++ _9 = move _4; // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 ++ _3 = Ne(_9, const false); // scope 0 at $DIR/matches_reduce_branches.rs:44:13: 44:18 ++ StorageDead(_9); // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 + StorageDead(_4); // scope 0 at $DIR/matches_reduce_branches.rs:45:9: 45:10 +- switchInt(move _3) -> [false: bb11, otherwise: bb10]; // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 +- } +- +- bb10: { ++ StorageLive(_10); // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 ++ _10 = move _3; // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 + StorageDead(_3); // scope 0 at $DIR/matches_reduce_branches.rs:48:9: 48:10 +- _1 = const true; // scope 0 at $DIR/matches_reduce_branches.rs:47:13: 47:17 +- goto -> bb12; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 50:6 +- } +- +- bb11: { +- StorageDead(_3); // scope 0 at $DIR/matches_reduce_branches.rs:48:9: 48:10 +- _1 = const false; // scope 0 at $DIR/matches_reduce_branches.rs:49:14: 49:19 +- goto -> bb12; // scope 0 at $DIR/matches_reduce_branches.rs:40:15: 50:6 +- } +- +- bb12: { ++ _1 = Ne(_10, const false); // scope 0 at $DIR/matches_reduce_branches.rs:49:14: 49:19 ++ StorageDead(_10); // scope 0 at $DIR/matches_reduce_branches.rs:41:15: 45:10 + StorageDead(_2); // scope 0 at $DIR/matches_reduce_branches.rs:50:6: 50:7 + _0 = _1; // scope 1 at $DIR/matches_reduce_branches.rs:51:5: 51:8 + StorageDead(_1); // scope 0 at $DIR/matches_reduce_branches.rs:52:1: 52:2 + return; // scope 0 at $DIR/matches_reduce_branches.rs:52:2: 52:2 } } diff --git a/src/test/mir-opt/matches_reduce_branches.rs b/src/test/mir-opt/matches_reduce_branches.rs index e95a62aeeb..51be3884d4 100644 --- a/src/test/mir-opt/matches_reduce_branches.rs +++ b/src/test/mir-opt/matches_reduce_branches.rs @@ -1,11 +1,12 @@ // EMIT_MIR_FOR_EACH_BIT_WIDTH // EMIT_MIR matches_reduce_branches.foo.MatchBranchSimplification.diff +// EMIT_MIR matches_reduce_branches.foo.PreCodegen.before.mir // EMIT_MIR matches_reduce_branches.bar.MatchBranchSimplification.diff // EMIT_MIR matches_reduce_branches.match_nested_if.MatchBranchSimplification.diff fn foo(bar: Option<()>) { if matches!(bar, None) { - () + () } } @@ -37,15 +38,22 @@ fn bar(i: i32) -> (bool, bool, bool, bool) { fn match_nested_if() -> bool { let val = match () { - () if if if if true {true} else {false} {true} else {false} {true} else {false} => true, + () if if if if true { true } else { false } { true } else { false } { + true + } else { + false + } => + { + true + } _ => false, }; val } fn main() { - let _ = foo(None); - let _ = foo(Some(())); - let _ = bar(0); - let _ = match_nested_if(); + let _ = foo(None); + let _ = foo(Some(())); + let _ = bar(0); + let _ = match_nested_if(); } diff --git a/src/test/mir-opt/multiple_return_terminators.rs b/src/test/mir-opt/multiple_return_terminators.rs index b73a51d483..a2b902d148 100644 --- a/src/test/mir-opt/multiple_return_terminators.rs +++ b/src/test/mir-opt/multiple_return_terminators.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=3 +// compile-flags: -Z mir-opt-level=4 // EMIT_MIR multiple_return_terminators.test.MultipleReturnTerminators.diff fn test(x: bool) { diff --git a/src/test/mir-opt/multiple_return_terminators.test.MultipleReturnTerminators.diff b/src/test/mir-opt/multiple_return_terminators.test.MultipleReturnTerminators.diff index fb25cb9002..3dd526cfbc 100644 --- a/src/test/mir-opt/multiple_return_terminators.test.MultipleReturnTerminators.diff +++ b/src/test/mir-opt/multiple_return_terminators.test.MultipleReturnTerminators.diff @@ -13,12 +13,10 @@ } bb1: { - _0 = const (); // scope 0 at $DIR/multiple_return_terminators.rs:5:10: 7:6 goto -> bb3; // scope 0 at $DIR/multiple_return_terminators.rs:5:5: 9:6 } bb2: { - _0 = const (); // scope 0 at $DIR/multiple_return_terminators.rs:7:12: 9:6 goto -> bb3; // scope 0 at $DIR/multiple_return_terminators.rs:5:5: 9:6 } diff --git a/src/test/mir-opt/not_equal_false.opt.InstCombine.diff b/src/test/mir-opt/not_equal_false.opt.InstCombine.diff index dc3a6a36d9..6fe28c0149 100644 --- a/src/test/mir-opt/not_equal_false.opt.InstCombine.diff +++ b/src/test/mir-opt/not_equal_false.opt.InstCombine.diff @@ -1,59 +1,35 @@ - // MIR for `opt` before InstCombine + // MIR for `opt` after InstCombine - fn opt(_1: Option<()>) -> bool { + fn opt(_1: bool) -> u32 { debug x => _1; // in scope 0 at $DIR/not_equal_false.rs:3:8: 3:9 - let mut _0: bool; // return place in scope 0 at $DIR/not_equal_false.rs:3:26: 3:30 - let mut _2: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _3: isize; // in scope 0 at $DIR/not_equal_false.rs:4:17: 4:21 - let mut _4: bool; // in scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - let mut _5: isize; // in scope 0 at $DIR/not_equal_false.rs:4:38: 4:45 - let mut _6: isize; // in scope 0 at $DIR/not_equal_false.rs:4:17: 4:21 - let mut _7: isize; // in scope 0 at $DIR/not_equal_false.rs:4:38: 4:45 - let mut _8: bool; // in scope 0 at $DIR/not_equal_false.rs:4:5: 4:46 + let mut _0: u32; // return place in scope 0 at $DIR/not_equal_false.rs:3:20: 3:23 + let mut _2: bool; // in scope 0 at $DIR/not_equal_false.rs:4:8: 4:18 + let mut _3: bool; // in scope 0 at $DIR/not_equal_false.rs:4:8: 4:9 bb0: { - StorageLive(_2); // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _3 = discriminant(_1); // scope 0 at $DIR/not_equal_false.rs:4:17: 4:21 - StorageLive(_6); // scope 0 at $DIR/not_equal_false.rs:4:17: 4:21 - _6 = move _3; // scope 0 at $DIR/not_equal_false.rs:4:17: 4:21 - _2 = Eq(_6, const 0_isize); // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageDead(_6); // scope 0 at $DIR/not_equal_false.rs:4:17: 4:21 - goto -> bb4; // scope 0 at $DIR/not_equal_false.rs:4:17: 4:21 + StorageLive(_2); // scope 0 at $DIR/not_equal_false.rs:4:8: 4:18 + StorageLive(_3); // scope 0 at $DIR/not_equal_false.rs:4:8: 4:9 + _3 = _1; // scope 0 at $DIR/not_equal_false.rs:4:8: 4:9 +- _2 = Ne(move _3, const false); // scope 0 at $DIR/not_equal_false.rs:4:8: 4:18 ++ _2 = move _3; // scope 0 at $DIR/not_equal_false.rs:4:8: 4:18 + StorageDead(_3); // scope 0 at $DIR/not_equal_false.rs:4:17: 4:18 + switchInt(move _2) -> [false: bb2, otherwise: bb1]; // scope 0 at $DIR/not_equal_false.rs:4:5: 4:35 } bb1: { - _0 = const true; // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46 - goto -> bb3; // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46 + _0 = const 0_u32; // scope 0 at $DIR/not_equal_false.rs:4:21: 4:22 + goto -> bb3; // scope 0 at $DIR/not_equal_false.rs:4:5: 4:35 } bb2: { - StorageLive(_4); // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - _5 = discriminant(_1); // scope 0 at $DIR/not_equal_false.rs:4:38: 4:45 - StorageLive(_7); // scope 0 at $DIR/not_equal_false.rs:4:38: 4:45 - _7 = move _5; // scope 0 at $DIR/not_equal_false.rs:4:38: 4:45 - _4 = Eq(_7, const 1_isize); // scope 0 at $SRC_DIR/core/src/macros/mod.rs:LL:COL - StorageDead(_7); // scope 0 at $DIR/not_equal_false.rs:4:38: 4:45 - goto -> bb5; // scope 0 at $DIR/not_equal_false.rs:4:38: 4:45 + _0 = const 1_u32; // scope 0 at $DIR/not_equal_false.rs:4:32: 4:33 + goto -> bb3; // scope 0 at $DIR/not_equal_false.rs:4:5: 4:35 } bb3: { - StorageDead(_4); // scope 0 at $DIR/not_equal_false.rs:4:45: 4:46 - StorageDead(_2); // scope 0 at $DIR/not_equal_false.rs:4:45: 4:46 + StorageDead(_2); // scope 0 at $DIR/not_equal_false.rs:4:34: 4:35 return; // scope 0 at $DIR/not_equal_false.rs:5:2: 5:2 } - - bb4: { - switchInt(move _2) -> [false: bb2, otherwise: bb1]; // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46 - } - - bb5: { - StorageLive(_8); // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46 - _8 = move _4; // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46 -- _0 = Ne(_8, const false); // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46 -+ _0 = _8; // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46 - StorageDead(_8); // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46 - goto -> bb3; // scope 0 at $DIR/not_equal_false.rs:4:5: 4:46 - } } diff --git a/src/test/mir-opt/not_equal_false.rs b/src/test/mir-opt/not_equal_false.rs index a98a2834e8..5fbb848dcb 100644 --- a/src/test/mir-opt/not_equal_false.rs +++ b/src/test/mir-opt/not_equal_false.rs @@ -1,9 +1,9 @@ // EMIT_MIR not_equal_false.opt.InstCombine.diff -fn opt(x: Option<()>) -> bool { - matches!(x, None) || matches!(x, Some(_)) +fn opt(x: bool) -> u32 { + if x != false { 0 } else { 1 } } fn main() { - opt(None); + opt(false); } diff --git a/src/test/mir-opt/receiver-ptr-mutability.rs b/src/test/mir-opt/receiver-ptr-mutability.rs new file mode 100644 index 0000000000..8e2ff0451c --- /dev/null +++ b/src/test/mir-opt/receiver-ptr-mutability.rs @@ -0,0 +1,20 @@ +// EMIT_MIR receiver_ptr_mutability.main.mir_map.0.mir + +#![feature(arbitrary_self_types)] + +struct Test {} + +impl Test { + fn x(self: *const Self) { + println!("x called"); + } +} + +fn main() { + let ptr: *mut Test = std::ptr::null_mut(); + ptr.x(); + + // Test autoderefs + let ptr_ref: &&&&*mut Test = &&&&ptr; + ptr_ref.x(); +} diff --git a/src/test/mir-opt/receiver_ptr_mutability.main.mir_map.0.mir b/src/test/mir-opt/receiver_ptr_mutability.main.mir_map.0.mir new file mode 100644 index 0000000000..d2d96ff468 --- /dev/null +++ b/src/test/mir-opt/receiver_ptr_mutability.main.mir_map.0.mir @@ -0,0 +1,96 @@ +// MIR for `main` 0 mir_map + +| User Type Annotations +| 0: Canonical { max_universe: U0, variables: [], value: Ty(*mut Test) } at $DIR/receiver-ptr-mutability.rs:14:14: 14:23 +| 1: Canonical { max_universe: U0, variables: [], value: Ty(*mut Test) } at $DIR/receiver-ptr-mutability.rs:14:14: 14:23 +| 2: Canonical { max_universe: U0, variables: [CanonicalVarInfo { kind: Region(U0) }, CanonicalVarInfo { kind: Region(U0) }, CanonicalVarInfo { kind: Region(U0) }, CanonicalVarInfo { kind: Region(U0) }], value: Ty(&&&&*mut Test) } at $DIR/receiver-ptr-mutability.rs:18:18: 18:31 +| 3: Canonical { max_universe: U0, variables: [CanonicalVarInfo { kind: Region(U0) }, CanonicalVarInfo { kind: Region(U0) }, CanonicalVarInfo { kind: Region(U0) }, CanonicalVarInfo { kind: Region(U0) }], value: Ty(&&&&*mut Test) } at $DIR/receiver-ptr-mutability.rs:18:18: 18:31 +| +fn main() -> () { + let mut _0: (); // return place in scope 0 at $DIR/receiver-ptr-mutability.rs:13:11: 13:11 + let _1: *mut Test as UserTypeProjection { base: UserType(0), projs: [] }; // in scope 0 at $DIR/receiver-ptr-mutability.rs:14:9: 14:12 + let _2: (); // in scope 0 at $DIR/receiver-ptr-mutability.rs:15:5: 15:12 + let mut _3: *const Test; // in scope 0 at $DIR/receiver-ptr-mutability.rs:15:5: 15:8 + let mut _4: *mut Test; // in scope 0 at $DIR/receiver-ptr-mutability.rs:15:5: 15:8 + let _6: &&&&*mut Test; // in scope 0 at $DIR/receiver-ptr-mutability.rs:18:34: 18:41 + let _7: &&&*mut Test; // in scope 0 at $DIR/receiver-ptr-mutability.rs:18:35: 18:41 + let _8: &&*mut Test; // in scope 0 at $DIR/receiver-ptr-mutability.rs:18:36: 18:41 + let _9: &*mut Test; // in scope 0 at $DIR/receiver-ptr-mutability.rs:18:37: 18:41 + let _10: (); // in scope 0 at $DIR/receiver-ptr-mutability.rs:19:5: 19:16 + let mut _11: *const Test; // in scope 0 at $DIR/receiver-ptr-mutability.rs:19:5: 19:12 + let mut _12: *mut Test; // in scope 0 at $DIR/receiver-ptr-mutability.rs:19:5: 19:12 + scope 1 { + debug ptr => _1; // in scope 1 at $DIR/receiver-ptr-mutability.rs:14:9: 14:12 + let _5: &&&&*mut Test as UserTypeProjection { base: UserType(2), projs: [] }; // in scope 1 at $DIR/receiver-ptr-mutability.rs:18:9: 18:16 + scope 2 { + debug ptr_ref => _5; // in scope 2 at $DIR/receiver-ptr-mutability.rs:18:9: 18:16 + } + } + + bb0: { + StorageLive(_1); // scope 0 at $DIR/receiver-ptr-mutability.rs:14:9: 14:12 + _1 = null_mut::() -> [return: bb1, unwind: bb4]; // scope 0 at $DIR/receiver-ptr-mutability.rs:14:26: 14:46 + // mir::Constant + // + span: $DIR/receiver-ptr-mutability.rs:14:26: 14:44 + // + literal: Const { ty: fn() -> *mut Test {std::ptr::null_mut::}, val: Value(Scalar()) } + } + + bb1: { + FakeRead(ForLet, _1); // scope 0 at $DIR/receiver-ptr-mutability.rs:14:9: 14:12 + AscribeUserType(_1, o, UserTypeProjection { base: UserType(1), projs: [] }); // scope 0 at $DIR/receiver-ptr-mutability.rs:14:14: 14:23 + StorageLive(_2); // scope 1 at $DIR/receiver-ptr-mutability.rs:15:5: 15:12 + StorageLive(_3); // scope 1 at $DIR/receiver-ptr-mutability.rs:15:5: 15:8 + StorageLive(_4); // scope 1 at $DIR/receiver-ptr-mutability.rs:15:5: 15:8 + _4 = _1; // scope 1 at $DIR/receiver-ptr-mutability.rs:15:5: 15:8 + _3 = move _4 as *const Test (Pointer(MutToConstPointer)); // scope 1 at $DIR/receiver-ptr-mutability.rs:15:5: 15:8 + StorageDead(_4); // scope 1 at $DIR/receiver-ptr-mutability.rs:15:7: 15:8 + _2 = Test::x(move _3) -> [return: bb2, unwind: bb4]; // scope 1 at $DIR/receiver-ptr-mutability.rs:15:5: 15:12 + // mir::Constant + // + span: $DIR/receiver-ptr-mutability.rs:15:9: 15:10 + // + literal: Const { ty: fn(*const Test) {Test::x}, val: Value(Scalar()) } + } + + bb2: { + StorageDead(_3); // scope 1 at $DIR/receiver-ptr-mutability.rs:15:11: 15:12 + StorageDead(_2); // scope 1 at $DIR/receiver-ptr-mutability.rs:15:12: 15:13 + StorageLive(_5); // scope 1 at $DIR/receiver-ptr-mutability.rs:18:9: 18:16 + StorageLive(_6); // scope 1 at $DIR/receiver-ptr-mutability.rs:18:34: 18:41 + StorageLive(_7); // scope 1 at $DIR/receiver-ptr-mutability.rs:18:35: 18:41 + StorageLive(_8); // scope 1 at $DIR/receiver-ptr-mutability.rs:18:36: 18:41 + StorageLive(_9); // scope 1 at $DIR/receiver-ptr-mutability.rs:18:37: 18:41 + _9 = &_1; // scope 1 at $DIR/receiver-ptr-mutability.rs:18:37: 18:41 + _8 = &_9; // scope 1 at $DIR/receiver-ptr-mutability.rs:18:36: 18:41 + _7 = &_8; // scope 1 at $DIR/receiver-ptr-mutability.rs:18:35: 18:41 + _6 = &_7; // scope 1 at $DIR/receiver-ptr-mutability.rs:18:34: 18:41 + _5 = &(*_6); // scope 1 at $DIR/receiver-ptr-mutability.rs:18:34: 18:41 + FakeRead(ForLet, _5); // scope 1 at $DIR/receiver-ptr-mutability.rs:18:9: 18:16 + AscribeUserType(_5, o, UserTypeProjection { base: UserType(3), projs: [] }); // scope 1 at $DIR/receiver-ptr-mutability.rs:18:18: 18:31 + StorageDead(_6); // scope 1 at $DIR/receiver-ptr-mutability.rs:18:41: 18:42 + StorageLive(_10); // scope 2 at $DIR/receiver-ptr-mutability.rs:19:5: 19:16 + StorageLive(_11); // scope 2 at $DIR/receiver-ptr-mutability.rs:19:5: 19:12 + StorageLive(_12); // scope 2 at $DIR/receiver-ptr-mutability.rs:19:5: 19:12 + _12 = (*(*(*(*_5)))); // scope 2 at $DIR/receiver-ptr-mutability.rs:19:5: 19:12 + _11 = move _12 as *const Test (Pointer(MutToConstPointer)); // scope 2 at $DIR/receiver-ptr-mutability.rs:19:5: 19:12 + StorageDead(_12); // scope 2 at $DIR/receiver-ptr-mutability.rs:19:11: 19:12 + _10 = Test::x(move _11) -> [return: bb3, unwind: bb4]; // scope 2 at $DIR/receiver-ptr-mutability.rs:19:5: 19:16 + // mir::Constant + // + span: $DIR/receiver-ptr-mutability.rs:19:13: 19:14 + // + literal: Const { ty: fn(*const Test) {Test::x}, val: Value(Scalar()) } + } + + bb3: { + StorageDead(_11); // scope 2 at $DIR/receiver-ptr-mutability.rs:19:15: 19:16 + StorageDead(_10); // scope 2 at $DIR/receiver-ptr-mutability.rs:19:16: 19:17 + _0 = const (); // scope 0 at $DIR/receiver-ptr-mutability.rs:13:11: 20:2 + StorageDead(_9); // scope 1 at $DIR/receiver-ptr-mutability.rs:20:1: 20:2 + StorageDead(_8); // scope 1 at $DIR/receiver-ptr-mutability.rs:20:1: 20:2 + StorageDead(_7); // scope 1 at $DIR/receiver-ptr-mutability.rs:20:1: 20:2 + StorageDead(_5); // scope 1 at $DIR/receiver-ptr-mutability.rs:20:1: 20:2 + StorageDead(_1); // scope 0 at $DIR/receiver-ptr-mutability.rs:20:1: 20:2 + return; // scope 0 at $DIR/receiver-ptr-mutability.rs:20:2: 20:2 + } + + bb4 (cleanup): { + resume; // scope 0 at $DIR/receiver-ptr-mutability.rs:13:1: 20:2 + } +} diff --git a/src/test/mir-opt/remove_storage_markers.main.RemoveStorageMarkers.diff b/src/test/mir-opt/remove_storage_markers.main.RemoveStorageMarkers.diff new file mode 100644 index 0000000000..dd8a925104 --- /dev/null +++ b/src/test/mir-opt/remove_storage_markers.main.RemoveStorageMarkers.diff @@ -0,0 +1,115 @@ +- // MIR for `main` before RemoveStorageMarkers ++ // MIR for `main` after RemoveStorageMarkers + + fn main() -> () { + let mut _0: (); // return place in scope 0 at $DIR/remove_storage_markers.rs:6:11: 6:11 + let mut _1: i32; // in scope 0 at $DIR/remove_storage_markers.rs:7:9: 7:16 + let mut _2: std::ops::Range; // in scope 0 at $DIR/remove_storage_markers.rs:8:14: 8:19 + let mut _3: std::ops::Range; // in scope 0 at $DIR/remove_storage_markers.rs:8:14: 8:19 + let mut _5: (); // in scope 0 at $DIR/remove_storage_markers.rs:6:1: 11:2 + let _7: (); // in scope 0 at $DIR/remove_storage_markers.rs:8:14: 8:19 + let mut _8: std::option::Option; // in scope 0 at $DIR/remove_storage_markers.rs:8:14: 8:19 + let mut _9: &mut std::ops::Range; // in scope 0 at $DIR/remove_storage_markers.rs:8:14: 8:19 + let mut _10: &mut std::ops::Range; // in scope 0 at $DIR/remove_storage_markers.rs:8:14: 8:19 + let mut _11: isize; // in scope 0 at $DIR/remove_storage_markers.rs:8:9: 8:10 + let mut _13: i32; // in scope 0 at $DIR/remove_storage_markers.rs:8:9: 8:10 + let mut _14: !; // in scope 0 at $DIR/remove_storage_markers.rs:8:5: 10:6 + let _16: (); // in scope 0 at $DIR/remove_storage_markers.rs:8:20: 10:6 + let mut _17: i32; // in scope 0 at $DIR/remove_storage_markers.rs:9:16: 9:17 + scope 1 { + debug sum => _1; // in scope 1 at $DIR/remove_storage_markers.rs:7:9: 7:16 + let mut _4: std::ops::Range; // in scope 1 at $DIR/remove_storage_markers.rs:8:14: 8:19 + scope 2 { + debug iter => _4; // in scope 2 at $DIR/remove_storage_markers.rs:8:14: 8:19 + let mut _6: i32; // in scope 2 at $DIR/remove_storage_markers.rs:8:14: 8:19 + scope 3 { + debug __next => _6; // in scope 3 at $DIR/remove_storage_markers.rs:8:14: 8:19 + let _12: i32; // in scope 3 at $DIR/remove_storage_markers.rs:8:9: 8:10 + let _15: i32; // in scope 3 at $DIR/remove_storage_markers.rs:8:9: 8:10 + scope 4 { + debug val => _12; // in scope 4 at $DIR/remove_storage_markers.rs:8:9: 8:10 + } + scope 5 { + debug i => _15; // in scope 5 at $DIR/remove_storage_markers.rs:8:9: 8:10 + } + } + } + scope 6 (inlined as IntoIterator>::into_iter) { // at $DIR/remove_storage_markers.rs:8:14: 8:19 + debug self => _3; // in scope 6 at $DIR/remove_storage_markers.rs:8:14: 8:19 + } + } + + bb0: { +- StorageLive(_1); // scope 0 at $DIR/remove_storage_markers.rs:7:9: 7:16 + _1 = const 0_i32; // scope 0 at $DIR/remove_storage_markers.rs:7:19: 7:20 +- StorageLive(_2); // scope 1 at $DIR/remove_storage_markers.rs:8:14: 8:19 +- StorageLive(_3); // scope 1 at $DIR/remove_storage_markers.rs:8:14: 8:19 + (_3.0: i32) = const 0_i32; // scope 1 at $DIR/remove_storage_markers.rs:8:14: 8:19 + (_3.1: i32) = const 10_i32; // scope 1 at $DIR/remove_storage_markers.rs:8:14: 8:19 + _2 = move _3; // scope 6 at $DIR/remove_storage_markers.rs:8:14: 8:19 +- StorageDead(_3); // scope 1 at $DIR/remove_storage_markers.rs:8:18: 8:19 +- StorageLive(_4); // scope 1 at $DIR/remove_storage_markers.rs:8:14: 8:19 + _4 = move _2; // scope 1 at $DIR/remove_storage_markers.rs:8:14: 8:19 + goto -> bb1; // scope 2 at $DIR/remove_storage_markers.rs:8:5: 10:6 + } + + bb1: { +- StorageLive(_6); // scope 2 at $DIR/remove_storage_markers.rs:8:14: 8:19 +- StorageLive(_7); // scope 3 at $DIR/remove_storage_markers.rs:8:14: 8:19 +- StorageLive(_8); // scope 3 at $DIR/remove_storage_markers.rs:8:14: 8:19 +- StorageLive(_9); // scope 3 at $DIR/remove_storage_markers.rs:8:14: 8:19 +- StorageLive(_10); // scope 3 at $DIR/remove_storage_markers.rs:8:14: 8:19 + _10 = &mut _4; // scope 3 at $DIR/remove_storage_markers.rs:8:14: 8:19 + _9 = &mut (*_10); // scope 3 at $DIR/remove_storage_markers.rs:8:14: 8:19 + _8 = as Iterator>::next(move _9) -> bb2; // scope 3 at $DIR/remove_storage_markers.rs:8:14: 8:19 + // mir::Constant + // + span: $DIR/remove_storage_markers.rs:8:14: 8:19 + // + literal: Const { ty: for<'r> fn(&'r mut std::ops::Range) -> std::option::Option< as std::iter::Iterator>::Item> { as std::iter::Iterator>::next}, val: Value(Scalar()) } + } + + bb2: { +- StorageDead(_9); // scope 3 at $DIR/remove_storage_markers.rs:8:18: 8:19 + _11 = discriminant(_8); // scope 3 at $DIR/remove_storage_markers.rs:8:9: 8:10 + switchInt(move _11) -> [0_isize: bb3, otherwise: bb4]; // scope 3 at $DIR/remove_storage_markers.rs:8:9: 8:10 + } + + bb3: { + _0 = const (); // scope 3 at $DIR/remove_storage_markers.rs:8:5: 10:6 +- StorageDead(_10); // scope 3 at $DIR/remove_storage_markers.rs:8:18: 8:19 +- StorageDead(_8); // scope 3 at $DIR/remove_storage_markers.rs:8:18: 8:19 +- StorageDead(_7); // scope 3 at $DIR/remove_storage_markers.rs:8:18: 8:19 +- StorageDead(_6); // scope 2 at $DIR/remove_storage_markers.rs:10:5: 10:6 +- StorageDead(_4); // scope 1 at $DIR/remove_storage_markers.rs:10:5: 10:6 +- StorageDead(_2); // scope 1 at $DIR/remove_storage_markers.rs:8:18: 8:19 +- StorageDead(_1); // scope 0 at $DIR/remove_storage_markers.rs:11:1: 11:2 + return; // scope 0 at $DIR/remove_storage_markers.rs:11:2: 11:2 + } + + bb4: { +- StorageLive(_12); // scope 3 at $DIR/remove_storage_markers.rs:8:9: 8:10 + _12 = ((_8 as Some).0: i32); // scope 3 at $DIR/remove_storage_markers.rs:8:9: 8:10 +- StorageLive(_13); // scope 4 at $DIR/remove_storage_markers.rs:8:9: 8:10 + _13 = _12; // scope 4 at $DIR/remove_storage_markers.rs:8:9: 8:10 + _6 = move _13; // scope 4 at $DIR/remove_storage_markers.rs:8:9: 8:10 + _7 = const (); // scope 4 at $DIR/remove_storage_markers.rs:8:9: 8:10 +- StorageDead(_13); // scope 4 at $DIR/remove_storage_markers.rs:8:9: 8:10 +- StorageDead(_12); // scope 3 at $DIR/remove_storage_markers.rs:8:9: 8:10 +- StorageDead(_10); // scope 3 at $DIR/remove_storage_markers.rs:8:18: 8:19 +- StorageDead(_8); // scope 3 at $DIR/remove_storage_markers.rs:8:18: 8:19 +- StorageDead(_7); // scope 3 at $DIR/remove_storage_markers.rs:8:18: 8:19 +- StorageLive(_15); // scope 3 at $DIR/remove_storage_markers.rs:8:9: 8:10 + _15 = _6; // scope 3 at $DIR/remove_storage_markers.rs:8:14: 8:19 +- StorageLive(_16); // scope 5 at $DIR/remove_storage_markers.rs:8:20: 10:6 +- StorageLive(_17); // scope 5 at $DIR/remove_storage_markers.rs:9:16: 9:17 + _17 = _15; // scope 5 at $DIR/remove_storage_markers.rs:9:16: 9:17 + _1 = Add(_1, move _17); // scope 5 at $DIR/remove_storage_markers.rs:9:9: 9:17 +- StorageDead(_17); // scope 5 at $DIR/remove_storage_markers.rs:9:16: 9:17 + _16 = const (); // scope 5 at $DIR/remove_storage_markers.rs:8:20: 10:6 +- StorageDead(_16); // scope 5 at $DIR/remove_storage_markers.rs:10:5: 10:6 + _5 = const (); // scope 2 at $DIR/remove_storage_markers.rs:8:5: 10:6 +- StorageDead(_15); // scope 3 at $DIR/remove_storage_markers.rs:10:5: 10:6 +- StorageDead(_6); // scope 2 at $DIR/remove_storage_markers.rs:10:5: 10:6 + goto -> bb1; // scope 2 at $DIR/remove_storage_markers.rs:8:5: 10:6 + } + } + diff --git a/src/test/mir-opt/remove_storage_markers.rs b/src/test/mir-opt/remove_storage_markers.rs new file mode 100644 index 0000000000..c144d3ff79 --- /dev/null +++ b/src/test/mir-opt/remove_storage_markers.rs @@ -0,0 +1,11 @@ +// Checks that storage markers are removed at opt-level=0. +// +// compile-flags: -C opt-level=0 -Coverflow-checks=off + +// EMIT_MIR remove_storage_markers.main.RemoveStorageMarkers.diff +fn main() { + let mut sum = 0; + for i in 0..10 { + sum += i; + } +} diff --git a/src/test/mir-opt/remove_unneeded_drops.cannot_opt_generic.RemoveUnneededDrops.diff b/src/test/mir-opt/remove_unneeded_drops.cannot_opt_generic.RemoveUnneededDrops.diff index e55ee287ba..2fc64fa8f5 100644 --- a/src/test/mir-opt/remove_unneeded_drops.cannot_opt_generic.RemoveUnneededDrops.diff +++ b/src/test/mir-opt/remove_unneeded_drops.cannot_opt_generic.RemoveUnneededDrops.diff @@ -14,7 +14,6 @@ StorageLive(_2); // scope 0 at $DIR/remove_unneeded_drops.rs:21:5: 21:12 StorageLive(_3); // scope 0 at $DIR/remove_unneeded_drops.rs:21:10: 21:11 _3 = move _1; // scope 0 at $DIR/remove_unneeded_drops.rs:21:10: 21:11 - _2 = const (); // scope 1 at $DIR/remove_unneeded_drops.rs:21:5: 21:12 drop(_3) -> [return: bb2, unwind: bb1]; // scope 1 at $DIR/remove_unneeded_drops.rs:21:5: 21:12 } diff --git a/src/test/mir-opt/remove_unneeded_drops.dont_opt.RemoveUnneededDrops.diff b/src/test/mir-opt/remove_unneeded_drops.dont_opt.RemoveUnneededDrops.diff index e5ad8f1ac7..18fdac1bc0 100644 --- a/src/test/mir-opt/remove_unneeded_drops.dont_opt.RemoveUnneededDrops.diff +++ b/src/test/mir-opt/remove_unneeded_drops.dont_opt.RemoveUnneededDrops.diff @@ -14,7 +14,6 @@ StorageLive(_2); // scope 0 at $DIR/remove_unneeded_drops.rs:9:5: 9:12 StorageLive(_3); // scope 0 at $DIR/remove_unneeded_drops.rs:9:10: 9:11 _3 = move _1; // scope 0 at $DIR/remove_unneeded_drops.rs:9:10: 9:11 - _2 = const (); // scope 1 at $DIR/remove_unneeded_drops.rs:9:5: 9:12 drop(_3) -> [return: bb2, unwind: bb1]; // scope 1 at $DIR/remove_unneeded_drops.rs:9:5: 9:12 } diff --git a/src/test/mir-opt/remove_unneeded_drops.opt.RemoveUnneededDrops.diff b/src/test/mir-opt/remove_unneeded_drops.opt.RemoveUnneededDrops.diff index bddf0e2103..1eb3d73676 100644 --- a/src/test/mir-opt/remove_unneeded_drops.opt.RemoveUnneededDrops.diff +++ b/src/test/mir-opt/remove_unneeded_drops.opt.RemoveUnneededDrops.diff @@ -14,7 +14,6 @@ StorageLive(_2); // scope 0 at $DIR/remove_unneeded_drops.rs:4:5: 4:12 StorageLive(_3); // scope 0 at $DIR/remove_unneeded_drops.rs:4:10: 4:11 _3 = _1; // scope 0 at $DIR/remove_unneeded_drops.rs:4:10: 4:11 - _2 = const (); // scope 1 at $DIR/remove_unneeded_drops.rs:4:5: 4:12 - drop(_3) -> bb1; // scope 1 at $DIR/remove_unneeded_drops.rs:4:5: 4:12 - } - diff --git a/src/test/mir-opt/remove_unneeded_drops.opt_generic_copy.RemoveUnneededDrops.diff b/src/test/mir-opt/remove_unneeded_drops.opt_generic_copy.RemoveUnneededDrops.diff index 87fb8a295c..9b8a50e854 100644 --- a/src/test/mir-opt/remove_unneeded_drops.opt_generic_copy.RemoveUnneededDrops.diff +++ b/src/test/mir-opt/remove_unneeded_drops.opt_generic_copy.RemoveUnneededDrops.diff @@ -14,7 +14,6 @@ StorageLive(_2); // scope 0 at $DIR/remove_unneeded_drops.rs:14:5: 14:12 StorageLive(_3); // scope 0 at $DIR/remove_unneeded_drops.rs:14:10: 14:11 _3 = _1; // scope 0 at $DIR/remove_unneeded_drops.rs:14:10: 14:11 - _2 = const (); // scope 1 at $DIR/remove_unneeded_drops.rs:14:5: 14:12 - drop(_3) -> bb1; // scope 1 at $DIR/remove_unneeded_drops.rs:14:5: 14:12 - } - diff --git a/src/test/mir-opt/retag.core.ptr-drop_in_place.Test.SimplifyCfg-make_shim.after.mir b/src/test/mir-opt/retag.core.ptr-drop_in_place.Test.SimplifyCfg-make_shim.after.mir index d0268cf207..aadc1db0e0 100644 --- a/src/test/mir-opt/retag.core.ptr-drop_in_place.Test.SimplifyCfg-make_shim.after.mir +++ b/src/test/mir-opt/retag.core.ptr-drop_in_place.Test.SimplifyCfg-make_shim.after.mir @@ -1,6 +1,6 @@ -// MIR for `drop_in_place` after SimplifyCfg-make_shim +// MIR for `std::ptr::drop_in_place` after SimplifyCfg-make_shim -fn drop_in_place(_1: *mut Test) -> () { +fn std::ptr::drop_in_place(_1: *mut Test) -> () { let mut _0: (); // return place in scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL let mut _2: &mut Test; // in scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL let mut _3: (); // in scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL diff --git a/src/test/mir-opt/simplify-arm-identity.rs b/src/test/mir-opt/simplify-arm-identity.rs index 0a59032e87..bedc86bbac 100644 --- a/src/test/mir-opt/simplify-arm-identity.rs +++ b/src/test/mir-opt/simplify-arm-identity.rs @@ -1,7 +1,7 @@ // Checks that `SimplifyArmIdentity` is not applied if enums have incompatible layouts. // Regression test for issue #66856. // -// compile-flags: -Zmir-opt-level=2 +// compile-flags: -Zmir-opt-level=3 // EMIT_MIR_FOR_EACH_BIT_WIDTH enum Src { diff --git a/src/test/mir-opt/simplify-arm.rs b/src/test/mir-opt/simplify-arm.rs index a7df786357..50b5147e0c 100644 --- a/src/test/mir-opt/simplify-arm.rs +++ b/src/test/mir-opt/simplify-arm.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=2 -Zunsound-mir-opts +// compile-flags: -Z mir-opt-level=3 -Zunsound-mir-opts // EMIT_MIR simplify_arm.id.SimplifyArmIdentity.diff // EMIT_MIR simplify_arm.id.SimplifyBranchSame.diff // EMIT_MIR simplify_arm.id_result.SimplifyArmIdentity.diff diff --git a/src/test/mir-opt/simplify_arm.id_result.SimplifyArmIdentity.diff b/src/test/mir-opt/simplify_arm.id_result.SimplifyArmIdentity.diff index 253e3236ff..40c18fb728 100644 --- a/src/test/mir-opt/simplify_arm.id_result.SimplifyArmIdentity.diff +++ b/src/test/mir-opt/simplify_arm.id_result.SimplifyArmIdentity.diff @@ -1,7 +1,7 @@ - // MIR for `id_result` before SimplifyArmIdentity + // MIR for `id_result` after SimplifyArmIdentity - fn id_result(_1: std::result::Result) -> std::result::Result { + fn id_result(_1: Result) -> Result { debug r => _1; // in scope 0 at $DIR/simplify-arm.rs:16:14: 16:15 let mut _0: std::result::Result; // return place in scope 0 at $DIR/simplify-arm.rs:16:37: 16:52 let mut _2: isize; // in scope 0 at $DIR/simplify-arm.rs:18:9: 18:14 diff --git a/src/test/mir-opt/simplify_arm.id_result.SimplifyBranchSame.diff b/src/test/mir-opt/simplify_arm.id_result.SimplifyBranchSame.diff index 23cf43c531..596dbabead 100644 --- a/src/test/mir-opt/simplify_arm.id_result.SimplifyBranchSame.diff +++ b/src/test/mir-opt/simplify_arm.id_result.SimplifyBranchSame.diff @@ -1,7 +1,7 @@ - // MIR for `id_result` before SimplifyBranchSame + // MIR for `id_result` after SimplifyBranchSame - fn id_result(_1: std::result::Result) -> std::result::Result { + fn id_result(_1: Result) -> Result { debug r => _1; // in scope 0 at $DIR/simplify-arm.rs:16:14: 16:15 let mut _0: std::result::Result; // return place in scope 0 at $DIR/simplify-arm.rs:16:37: 16:52 let mut _2: isize; // in scope 0 at $DIR/simplify-arm.rs:18:9: 18:14 diff --git a/src/test/mir-opt/simplify_arm.id_try.SimplifyArmIdentity.diff b/src/test/mir-opt/simplify_arm.id_try.SimplifyArmIdentity.diff index 84d8214122..ccb3b71817 100644 --- a/src/test/mir-opt/simplify_arm.id_try.SimplifyArmIdentity.diff +++ b/src/test/mir-opt/simplify_arm.id_try.SimplifyArmIdentity.diff @@ -1,7 +1,7 @@ - // MIR for `id_try` before SimplifyArmIdentity + // MIR for `id_try` after SimplifyArmIdentity - fn id_try(_1: std::result::Result) -> std::result::Result { + fn id_try(_1: Result) -> Result { debug r => _1; // in scope 0 at $DIR/simplify-arm.rs:23:11: 23:12 let mut _0: std::result::Result; // return place in scope 0 at $DIR/simplify-arm.rs:23:34: 23:49 let _2: u8; // in scope 0 at $DIR/simplify-arm.rs:24:9: 24:10 @@ -26,7 +26,7 @@ - debug t => _9; // in scope 7 at $DIR/simplify-arm.rs:24:14: 24:15 + debug t => ((_0 as Err).0: i32); // in scope 7 at $DIR/simplify-arm.rs:24:14: 24:15 } - scope 8 (inlined as Try>::from_error) { // at $DIR/simplify-arm.rs:24:13: 24:15 + scope 8 (inlined as Try>::from_error) { // at $DIR/simplify-arm.rs:24:13: 24:15 - debug v => _8; // in scope 8 at $DIR/simplify-arm.rs:24:13: 24:15 + debug v => ((_0 as Err).0: i32); // in scope 8 at $DIR/simplify-arm.rs:24:13: 24:15 let mut _12: i32; // in scope 8 at $DIR/simplify-arm.rs:24:13: 24:15 @@ -39,7 +39,7 @@ scope 5 { } } - scope 6 (inlined as Try>::into_result) { // at $DIR/simplify-arm.rs:24:13: 24:15 + scope 6 (inlined as Try>::into_result) { // at $DIR/simplify-arm.rs:24:13: 24:15 debug self => _4; // in scope 6 at $DIR/simplify-arm.rs:24:13: 24:15 } diff --git a/src/test/mir-opt/simplify_arm.id_try.SimplifyBranchSame.diff b/src/test/mir-opt/simplify_arm.id_try.SimplifyBranchSame.diff index aa050655cd..ec8ac30228 100644 --- a/src/test/mir-opt/simplify_arm.id_try.SimplifyBranchSame.diff +++ b/src/test/mir-opt/simplify_arm.id_try.SimplifyBranchSame.diff @@ -1,7 +1,7 @@ - // MIR for `id_try` before SimplifyBranchSame + // MIR for `id_try` after SimplifyBranchSame - fn id_try(_1: std::result::Result) -> std::result::Result { + fn id_try(_1: Result) -> Result { debug r => _1; // in scope 0 at $DIR/simplify-arm.rs:23:11: 23:12 let mut _0: std::result::Result; // return place in scope 0 at $DIR/simplify-arm.rs:23:34: 23:49 let _2: u8; // in scope 0 at $DIR/simplify-arm.rs:24:9: 24:10 @@ -23,7 +23,7 @@ scope 7 (inlined >::from) { // at $DIR/simplify-arm.rs:24:14: 24:15 debug t => ((_0 as Err).0: i32); // in scope 7 at $DIR/simplify-arm.rs:24:14: 24:15 } - scope 8 (inlined as Try>::from_error) { // at $DIR/simplify-arm.rs:24:13: 24:15 + scope 8 (inlined as Try>::from_error) { // at $DIR/simplify-arm.rs:24:13: 24:15 debug v => ((_0 as Err).0: i32); // in scope 8 at $DIR/simplify-arm.rs:24:13: 24:15 let mut _12: i32; // in scope 8 at $DIR/simplify-arm.rs:24:13: 24:15 } @@ -34,7 +34,7 @@ scope 5 { } } - scope 6 (inlined as Try>::into_result) { // at $DIR/simplify-arm.rs:24:13: 24:15 + scope 6 (inlined as Try>::into_result) { // at $DIR/simplify-arm.rs:24:13: 24:15 debug self => _4; // in scope 6 at $DIR/simplify-arm.rs:24:13: 24:15 } diff --git a/src/test/mir-opt/simplify_locals.c.SimplifyLocals.diff b/src/test/mir-opt/simplify_locals.c.SimplifyLocals.diff index dbac7dff9e..ff9e2671ad 100644 --- a/src/test/mir-opt/simplify_locals.c.SimplifyLocals.diff +++ b/src/test/mir-opt/simplify_locals.c.SimplifyLocals.diff @@ -17,10 +17,15 @@ StorageLive(_1); // scope 0 at $DIR/simplify-locals.rs:14:9: 14:14 _1 = [const 0_u8; 10]; // scope 0 at $DIR/simplify-locals.rs:14:17: 14:26 - StorageLive(_2); // scope 1 at $DIR/simplify-locals.rs:16:20: 16:26 -- _3 = &_1; // scope 1 at $DIR/simplify-locals.rs:16:20: 16:26 +- StorageLive(_3); // scope 1 at $DIR/simplify-locals.rs:16:20: 16:26 +- StorageLive(_4); // scope 1 at $DIR/simplify-locals.rs:16:20: 16:26 +- _4 = &_1; // scope 1 at $DIR/simplify-locals.rs:16:20: 16:26 +- _3 = _4; // scope 1 at $DIR/simplify-locals.rs:16:20: 16:26 - _2 = move _3 as &[u8] (Pointer(Unsize)); // scope 1 at $DIR/simplify-locals.rs:16:20: 16:26 +- StorageDead(_3); // scope 1 at $DIR/simplify-locals.rs:16:25: 16:26 +- StorageDead(_4); // scope 1 at $DIR/simplify-locals.rs:16:26: 16:27 - StorageDead(_2); // scope 1 at $DIR/simplify-locals.rs:16:26: 16:27 - _0 = const (); // scope 0 at $DIR/simplify-locals.rs:13:8: 17:2 +- _0 = const (); // scope 0 at $DIR/simplify-locals.rs:13:8: 17:2 StorageDead(_1); // scope 0 at $DIR/simplify-locals.rs:17:1: 17:2 return; // scope 0 at $DIR/simplify-locals.rs:17:2: 17:2 } diff --git a/src/test/mir-opt/simplify_locals.d1.SimplifyLocals.diff b/src/test/mir-opt/simplify_locals.d1.SimplifyLocals.diff index 76bf175d07..caa2a17700 100644 --- a/src/test/mir-opt/simplify_locals.d1.SimplifyLocals.diff +++ b/src/test/mir-opt/simplify_locals.d1.SimplifyLocals.diff @@ -11,7 +11,7 @@ - StorageLive(_1); // scope 0 at $DIR/simplify-locals.rs:22:13: 22:17 - discriminant(_1) = 0; // scope 0 at $DIR/simplify-locals.rs:22:13: 22:17 - StorageDead(_1); // scope 0 at $DIR/simplify-locals.rs:22:17: 22:18 - _0 = const (); // scope 0 at $DIR/simplify-locals.rs:20:9: 23:2 +- _0 = const (); // scope 0 at $DIR/simplify-locals.rs:20:9: 23:2 return; // scope 0 at $DIR/simplify-locals.rs:23:2: 23:2 } } diff --git a/src/test/mir-opt/simplify_locals.d2.SimplifyLocals.diff b/src/test/mir-opt/simplify_locals.d2.SimplifyLocals.diff index c06fa09053..80496d9a42 100644 --- a/src/test/mir-opt/simplify_locals.d2.SimplifyLocals.diff +++ b/src/test/mir-opt/simplify_locals.d2.SimplifyLocals.diff @@ -31,7 +31,7 @@ - // + literal: Const { ty: E, val: Value(Scalar(0x01)) } - StorageDead(_1); // scope 0 at $DIR/simplify-locals.rs:28:25: 28:26 - StorageDead(_2); // scope 0 at $DIR/simplify-locals.rs:28:26: 28:27 - _0 = const (); // scope 0 at $DIR/simplify-locals.rs:26:9: 29:2 +- _0 = const (); // scope 0 at $DIR/simplify-locals.rs:26:9: 29:2 return; // scope 0 at $DIR/simplify-locals.rs:29:2: 29:2 } } diff --git a/src/test/mir-opt/simplify_locals.r.SimplifyLocals.diff b/src/test/mir-opt/simplify_locals.r.SimplifyLocals.diff index 85cf398d31..7d36e1a992 100644 --- a/src/test/mir-opt/simplify_locals.r.SimplifyLocals.diff +++ b/src/test/mir-opt/simplify_locals.r.SimplifyLocals.diff @@ -23,7 +23,7 @@ - StorageLive(_3); // scope 2 at $DIR/simplify-locals.rs:36:13: 36:19 - _3 = &mut _1; // scope 2 at $DIR/simplify-locals.rs:36:13: 36:19 - StorageDead(_3); // scope 2 at $DIR/simplify-locals.rs:36:19: 36:20 - _0 = const (); // scope 0 at $DIR/simplify-locals.rs:32:8: 37:2 +- _0 = const (); // scope 0 at $DIR/simplify-locals.rs:32:8: 37:2 StorageDead(_1); // scope 0 at $DIR/simplify-locals.rs:37:1: 37:2 return; // scope 0 at $DIR/simplify-locals.rs:37:2: 37:2 } diff --git a/src/test/mir-opt/simplify_locals.t1.SimplifyLocals.diff b/src/test/mir-opt/simplify_locals.t1.SimplifyLocals.diff index 991a0721cc..89275418d6 100644 --- a/src/test/mir-opt/simplify_locals.t1.SimplifyLocals.diff +++ b/src/test/mir-opt/simplify_locals.t1.SimplifyLocals.diff @@ -15,7 +15,7 @@ - _1 = (*_2); // scope 1 at $DIR/simplify-locals.rs:44:14: 44:15 - StorageDead(_2); // scope 0 at $DIR/simplify-locals.rs:44:17: 44:18 - StorageDead(_1); // scope 0 at $DIR/simplify-locals.rs:44:17: 44:18 - _0 = const (); // scope 0 at $DIR/simplify-locals.rs:42:9: 45:2 +- _0 = const (); // scope 0 at $DIR/simplify-locals.rs:42:9: 45:2 return; // scope 0 at $DIR/simplify-locals.rs:45:2: 45:2 } } diff --git a/src/test/mir-opt/simplify_locals.t2.SimplifyLocals.diff b/src/test/mir-opt/simplify_locals.t2.SimplifyLocals.diff index 6c9ed96e78..b2344c871e 100644 --- a/src/test/mir-opt/simplify_locals.t2.SimplifyLocals.diff +++ b/src/test/mir-opt/simplify_locals.t2.SimplifyLocals.diff @@ -15,7 +15,7 @@ - _1 = &mut (*_2); // scope 1 at $DIR/simplify-locals.rs:50:14: 50:20 - StorageDead(_2); // scope 0 at $DIR/simplify-locals.rs:50:22: 50:23 - StorageDead(_1); // scope 0 at $DIR/simplify-locals.rs:50:22: 50:23 - _0 = const (); // scope 0 at $DIR/simplify-locals.rs:48:9: 51:2 +- _0 = const (); // scope 0 at $DIR/simplify-locals.rs:48:9: 51:2 return; // scope 0 at $DIR/simplify-locals.rs:51:2: 51:2 } } diff --git a/src/test/mir-opt/simplify_locals.t3.SimplifyLocals.diff b/src/test/mir-opt/simplify_locals.t3.SimplifyLocals.diff index 2d5fb352f8..95982f0a9c 100644 --- a/src/test/mir-opt/simplify_locals.t3.SimplifyLocals.diff +++ b/src/test/mir-opt/simplify_locals.t3.SimplifyLocals.diff @@ -19,7 +19,7 @@ - StorageDead(_3); // scope 0 at $DIR/simplify-locals.rs:56:23: 56:24 - StorageDead(_2); // scope 0 at $DIR/simplify-locals.rs:56:23: 56:24 - StorageDead(_1); // scope 0 at $DIR/simplify-locals.rs:56:23: 56:24 - _0 = const (); // scope 0 at $DIR/simplify-locals.rs:54:9: 57:2 +- _0 = const (); // scope 0 at $DIR/simplify-locals.rs:54:9: 57:2 return; // scope 0 at $DIR/simplify-locals.rs:57:2: 57:2 } } diff --git a/src/test/mir-opt/simplify_locals_fixedpoint.foo.SimplifyLocals.diff b/src/test/mir-opt/simplify_locals_fixedpoint.foo.SimplifyLocals.diff index 70725e5f14..69da1c7be8 100644 --- a/src/test/mir-opt/simplify_locals_fixedpoint.foo.SimplifyLocals.diff +++ b/src/test/mir-opt/simplify_locals_fixedpoint.foo.SimplifyLocals.diff @@ -30,7 +30,7 @@ } bb1: { - _0 = const (); // scope 0 at $DIR/simplify-locals-fixedpoint.rs:8:6: 8:6 +- _0 = const (); // scope 0 at $DIR/simplify-locals-fixedpoint.rs:8:6: 8:6 goto -> bb7; // scope 0 at $DIR/simplify-locals-fixedpoint.rs:4:5: 8:6 } @@ -51,12 +51,12 @@ } bb4: { - _0 = const (); // scope 1 at $DIR/simplify-locals-fixedpoint.rs:5:21: 7:10 +- _0 = const (); // scope 1 at $DIR/simplify-locals-fixedpoint.rs:5:21: 7:10 goto -> bb6; // scope 1 at $DIR/simplify-locals-fixedpoint.rs:5:9: 7:10 } bb5: { - _0 = const (); // scope 1 at $DIR/simplify-locals-fixedpoint.rs:7:10: 7:10 +- _0 = const (); // scope 1 at $DIR/simplify-locals-fixedpoint.rs:7:10: 7:10 goto -> bb6; // scope 1 at $DIR/simplify-locals-fixedpoint.rs:5:9: 7:10 } diff --git a/src/test/mir-opt/simplify_locals_removes_unused_consts.main.SimplifyLocals.diff b/src/test/mir-opt/simplify_locals_removes_unused_consts.main.SimplifyLocals.diff index 34f8ca870c..8d6d531bd3 100644 --- a/src/test/mir-opt/simplify_locals_removes_unused_consts.main.SimplifyLocals.diff +++ b/src/test/mir-opt/simplify_locals_removes_unused_consts.main.SimplifyLocals.diff @@ -71,8 +71,8 @@ - StorageDead(_9); // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:34: 16:35 - StorageDead(_11); // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:35: 16:36 - StorageDead(_8); // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:35: 16:36 +- _0 = const (); // scope 0 at $DIR/simplify-locals-removes-unused-consts.rs:12:11: 17:2 + StorageDead(_2); // scope 1 at $DIR/simplify-locals-removes-unused-consts.rs:16:35: 16:36 - _0 = const (); // scope 0 at $DIR/simplify-locals-removes-unused-consts.rs:12:11: 17:2 return; // scope 0 at $DIR/simplify-locals-removes-unused-consts.rs:17:2: 17:2 } } diff --git a/src/test/mir-opt/simplify_try.try_identity.DestinationPropagation.diff b/src/test/mir-opt/simplify_try.try_identity.DestinationPropagation.diff index 3ba0af991f..b1bae447f9 100644 --- a/src/test/mir-opt/simplify_try.try_identity.DestinationPropagation.diff +++ b/src/test/mir-opt/simplify_try.try_identity.DestinationPropagation.diff @@ -1,7 +1,7 @@ - // MIR for `try_identity` before DestinationPropagation + // MIR for `try_identity` after DestinationPropagation - fn try_identity(_1: std::result::Result) -> std::result::Result { + fn try_identity(_1: Result) -> Result { debug x => _1; // in scope 0 at $DIR/simplify_try.rs:7:17: 7:18 let mut _0: std::result::Result; // return place in scope 0 at $DIR/simplify_try.rs:7:41: 7:57 let _2: u32; // in scope 0 at $DIR/simplify_try.rs:8:9: 8:10 @@ -23,7 +23,7 @@ scope 7 (inlined >::from) { // at $DIR/simplify_try.rs:8:14: 8:15 debug t => ((_0 as Err).0: i32); // in scope 7 at $DIR/simplify_try.rs:8:14: 8:15 } - scope 8 (inlined as Try>::from_error) { // at $DIR/simplify_try.rs:8:13: 8:15 + scope 8 (inlined as Try>::from_error) { // at $DIR/simplify_try.rs:8:13: 8:15 debug v => ((_0 as Err).0: i32); // in scope 8 at $DIR/simplify_try.rs:8:13: 8:15 let mut _12: i32; // in scope 8 at $DIR/simplify_try.rs:8:13: 8:15 } @@ -34,7 +34,7 @@ scope 5 { } } - scope 6 (inlined as Try>::into_result) { // at $DIR/simplify_try.rs:8:13: 8:15 + scope 6 (inlined as Try>::into_result) { // at $DIR/simplify_try.rs:8:13: 8:15 - debug self => _4; // in scope 6 at $DIR/simplify_try.rs:8:13: 8:15 + debug self => _0; // in scope 6 at $DIR/simplify_try.rs:8:13: 8:15 } diff --git a/src/test/mir-opt/simplify_try.try_identity.SimplifyArmIdentity.diff b/src/test/mir-opt/simplify_try.try_identity.SimplifyArmIdentity.diff index 9c91762eb4..df274852f6 100644 --- a/src/test/mir-opt/simplify_try.try_identity.SimplifyArmIdentity.diff +++ b/src/test/mir-opt/simplify_try.try_identity.SimplifyArmIdentity.diff @@ -1,7 +1,7 @@ - // MIR for `try_identity` before SimplifyArmIdentity + // MIR for `try_identity` after SimplifyArmIdentity - fn try_identity(_1: std::result::Result) -> std::result::Result { + fn try_identity(_1: Result) -> Result { debug x => _1; // in scope 0 at $DIR/simplify_try.rs:7:17: 7:18 let mut _0: std::result::Result; // return place in scope 0 at $DIR/simplify_try.rs:7:41: 7:57 let _2: u32; // in scope 0 at $DIR/simplify_try.rs:8:9: 8:10 @@ -26,7 +26,7 @@ - debug t => _9; // in scope 7 at $DIR/simplify_try.rs:8:14: 8:15 + debug t => ((_0 as Err).0: i32); // in scope 7 at $DIR/simplify_try.rs:8:14: 8:15 } - scope 8 (inlined as Try>::from_error) { // at $DIR/simplify_try.rs:8:13: 8:15 + scope 8 (inlined as Try>::from_error) { // at $DIR/simplify_try.rs:8:13: 8:15 - debug v => _8; // in scope 8 at $DIR/simplify_try.rs:8:13: 8:15 + debug v => ((_0 as Err).0: i32); // in scope 8 at $DIR/simplify_try.rs:8:13: 8:15 let mut _12: i32; // in scope 8 at $DIR/simplify_try.rs:8:13: 8:15 @@ -39,7 +39,7 @@ scope 5 { } } - scope 6 (inlined as Try>::into_result) { // at $DIR/simplify_try.rs:8:13: 8:15 + scope 6 (inlined as Try>::into_result) { // at $DIR/simplify_try.rs:8:13: 8:15 debug self => _4; // in scope 6 at $DIR/simplify_try.rs:8:13: 8:15 } diff --git a/src/test/mir-opt/simplify_try.try_identity.SimplifyBranchSame.after.mir b/src/test/mir-opt/simplify_try.try_identity.SimplifyBranchSame.after.mir index cd8436a971..37274691fb 100644 --- a/src/test/mir-opt/simplify_try.try_identity.SimplifyBranchSame.after.mir +++ b/src/test/mir-opt/simplify_try.try_identity.SimplifyBranchSame.after.mir @@ -1,6 +1,6 @@ // MIR for `try_identity` after SimplifyBranchSame -fn try_identity(_1: std::result::Result) -> std::result::Result { +fn try_identity(_1: Result) -> Result { debug x => _1; // in scope 0 at $DIR/simplify_try.rs:7:17: 7:18 let mut _0: std::result::Result; // return place in scope 0 at $DIR/simplify_try.rs:7:41: 7:57 let _2: u32; // in scope 0 at $DIR/simplify_try.rs:8:9: 8:10 @@ -22,7 +22,7 @@ fn try_identity(_1: std::result::Result) -> std::result::Result>::from) { // at $DIR/simplify_try.rs:8:14: 8:15 debug t => ((_0 as Err).0: i32); // in scope 7 at $DIR/simplify_try.rs:8:14: 8:15 } - scope 8 (inlined as Try>::from_error) { // at $DIR/simplify_try.rs:8:13: 8:15 + scope 8 (inlined as Try>::from_error) { // at $DIR/simplify_try.rs:8:13: 8:15 debug v => ((_0 as Err).0: i32); // in scope 8 at $DIR/simplify_try.rs:8:13: 8:15 let mut _12: i32; // in scope 8 at $DIR/simplify_try.rs:8:13: 8:15 } @@ -33,7 +33,7 @@ fn try_identity(_1: std::result::Result) -> std::result::Result as Try>::into_result) { // at $DIR/simplify_try.rs:8:13: 8:15 + scope 6 (inlined as Try>::into_result) { // at $DIR/simplify_try.rs:8:13: 8:15 debug self => _4; // in scope 6 at $DIR/simplify_try.rs:8:13: 8:15 } diff --git a/src/test/mir-opt/simplify_try.try_identity.SimplifyLocals.after.mir b/src/test/mir-opt/simplify_try.try_identity.SimplifyLocals.after.mir index 73f77f35a2..f8adcced4b 100644 --- a/src/test/mir-opt/simplify_try.try_identity.SimplifyLocals.after.mir +++ b/src/test/mir-opt/simplify_try.try_identity.SimplifyLocals.after.mir @@ -1,6 +1,6 @@ // MIR for `try_identity` after SimplifyLocals -fn try_identity(_1: std::result::Result) -> std::result::Result { +fn try_identity(_1: Result) -> Result { debug x => _1; // in scope 0 at $DIR/simplify_try.rs:7:17: 7:18 let mut _0: std::result::Result; // return place in scope 0 at $DIR/simplify_try.rs:7:41: 7:57 scope 1 { @@ -12,7 +12,7 @@ fn try_identity(_1: std::result::Result) -> std::result::Result>::from) { // at $DIR/simplify_try.rs:8:14: 8:15 debug t => ((_0 as Err).0: i32); // in scope 7 at $DIR/simplify_try.rs:8:14: 8:15 } - scope 8 (inlined as Try>::from_error) { // at $DIR/simplify_try.rs:8:13: 8:15 + scope 8 (inlined as Try>::from_error) { // at $DIR/simplify_try.rs:8:13: 8:15 debug v => ((_0 as Err).0: i32); // in scope 8 at $DIR/simplify_try.rs:8:13: 8:15 } } @@ -22,7 +22,7 @@ fn try_identity(_1: std::result::Result) -> std::result::Result as Try>::into_result) { // at $DIR/simplify_try.rs:8:13: 8:15 + scope 6 (inlined as Try>::into_result) { // at $DIR/simplify_try.rs:8:13: 8:15 debug self => _0; // in scope 6 at $DIR/simplify_try.rs:8:13: 8:15 } diff --git a/src/test/mir-opt/slice_drop_shim.core.ptr-drop_in_place.[String].AddMovesForPackedDrops.before.32bit.mir b/src/test/mir-opt/slice_drop_shim.core.ptr-drop_in_place.[String].AddMovesForPackedDrops.before.32bit.mir index 8051c61bce..54ca9dc668 100644 --- a/src/test/mir-opt/slice_drop_shim.core.ptr-drop_in_place.[String].AddMovesForPackedDrops.before.32bit.mir +++ b/src/test/mir-opt/slice_drop_shim.core.ptr-drop_in_place.[String].AddMovesForPackedDrops.before.32bit.mir @@ -1,6 +1,6 @@ -// MIR for `drop_in_place` before AddMovesForPackedDrops +// MIR for `std::ptr::drop_in_place` before AddMovesForPackedDrops -fn drop_in_place(_1: *mut [String]) -> () { +fn std::ptr::drop_in_place(_1: *mut [String]) -> () { let mut _0: (); // return place in scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL let mut _2: usize; // in scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL let mut _3: usize; // in scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL diff --git a/src/test/mir-opt/slice_drop_shim.core.ptr-drop_in_place.[String].AddMovesForPackedDrops.before.64bit.mir b/src/test/mir-opt/slice_drop_shim.core.ptr-drop_in_place.[String].AddMovesForPackedDrops.before.64bit.mir index 8051c61bce..54ca9dc668 100644 --- a/src/test/mir-opt/slice_drop_shim.core.ptr-drop_in_place.[String].AddMovesForPackedDrops.before.64bit.mir +++ b/src/test/mir-opt/slice_drop_shim.core.ptr-drop_in_place.[String].AddMovesForPackedDrops.before.64bit.mir @@ -1,6 +1,6 @@ -// MIR for `drop_in_place` before AddMovesForPackedDrops +// MIR for `std::ptr::drop_in_place` before AddMovesForPackedDrops -fn drop_in_place(_1: *mut [String]) -> () { +fn std::ptr::drop_in_place(_1: *mut [String]) -> () { let mut _0: (); // return place in scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL let mut _2: usize; // in scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL let mut _3: usize; // in scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL diff --git a/src/test/mir-opt/uninhabited_enum.process_void.SimplifyLocals.after.mir b/src/test/mir-opt/uninhabited_enum.process_void.SimplifyLocals.after.mir index 539ed71071..eeaabb7b98 100644 --- a/src/test/mir-opt/uninhabited_enum.process_void.SimplifyLocals.after.mir +++ b/src/test/mir-opt/uninhabited_enum.process_void.SimplifyLocals.after.mir @@ -13,7 +13,6 @@ fn process_void(_1: *const Void) -> () { bb0: { StorageLive(_2); // scope 0 at $DIR/uninhabited-enum.rs:14:8: 14:14 _2 = &(*_1); // scope 2 at $DIR/uninhabited-enum.rs:14:26: 14:33 - _0 = const (); // scope 0 at $DIR/uninhabited-enum.rs:13:41: 17:2 StorageDead(_2); // scope 0 at $DIR/uninhabited-enum.rs:17:1: 17:2 return; // scope 0 at $DIR/uninhabited-enum.rs:17:2: 17:2 } diff --git a/src/test/mir-opt/unusual_item_types.core.ptr-drop_in_place.Vec_i32_.AddMovesForPackedDrops.before.32bit.mir b/src/test/mir-opt/unusual_item_types.core.ptr-drop_in_place.Vec_i32_.AddMovesForPackedDrops.before.32bit.mir index e4af5b3dfa..97c83010e2 100644 --- a/src/test/mir-opt/unusual_item_types.core.ptr-drop_in_place.Vec_i32_.AddMovesForPackedDrops.before.32bit.mir +++ b/src/test/mir-opt/unusual_item_types.core.ptr-drop_in_place.Vec_i32_.AddMovesForPackedDrops.before.32bit.mir @@ -1,6 +1,6 @@ -// MIR for `drop_in_place` before AddMovesForPackedDrops +// MIR for `std::ptr::drop_in_place` before AddMovesForPackedDrops -fn drop_in_place(_1: *mut Vec) -> () { +fn std::ptr::drop_in_place(_1: *mut Vec) -> () { let mut _0: (); // return place in scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL let mut _2: &mut std::vec::Vec; // in scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL let mut _3: (); // in scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL diff --git a/src/test/mir-opt/unusual_item_types.core.ptr-drop_in_place.Vec_i32_.AddMovesForPackedDrops.before.64bit.mir b/src/test/mir-opt/unusual_item_types.core.ptr-drop_in_place.Vec_i32_.AddMovesForPackedDrops.before.64bit.mir index e4af5b3dfa..97c83010e2 100644 --- a/src/test/mir-opt/unusual_item_types.core.ptr-drop_in_place.Vec_i32_.AddMovesForPackedDrops.before.64bit.mir +++ b/src/test/mir-opt/unusual_item_types.core.ptr-drop_in_place.Vec_i32_.AddMovesForPackedDrops.before.64bit.mir @@ -1,6 +1,6 @@ -// MIR for `drop_in_place` before AddMovesForPackedDrops +// MIR for `std::ptr::drop_in_place` before AddMovesForPackedDrops -fn drop_in_place(_1: *mut Vec) -> () { +fn std::ptr::drop_in_place(_1: *mut Vec) -> () { let mut _0: (); // return place in scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL let mut _2: &mut std::vec::Vec; // in scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL let mut _3: (); // in scope 0 at $SRC_DIR/core/src/ptr/mod.rs:LL:COL diff --git a/src/test/mir-opt/while_let_loops.change_loop_body.PreCodegen.after.32bit.mir b/src/test/mir-opt/while_let_loops.change_loop_body.PreCodegen.after.32bit.mir index dae0cbb65a..b6767077d4 100644 --- a/src/test/mir-opt/while_let_loops.change_loop_body.PreCodegen.after.32bit.mir +++ b/src/test/mir-opt/while_let_loops.change_loop_body.PreCodegen.after.32bit.mir @@ -10,7 +10,6 @@ fn change_loop_body() -> () { bb0: { StorageLive(_1); // scope 0 at $DIR/while_let_loops.rs:6:9: 6:15 _1 = const 0_i32; // scope 0 at $DIR/while_let_loops.rs:6:18: 6:19 - _0 = const (); // scope 1 at $DIR/while_let_loops.rs:7:5: 10:6 StorageDead(_1); // scope 0 at $DIR/while_let_loops.rs:11:1: 11:2 return; // scope 0 at $DIR/while_let_loops.rs:11:2: 11:2 } diff --git a/src/test/mir-opt/while_let_loops.change_loop_body.PreCodegen.after.64bit.mir b/src/test/mir-opt/while_let_loops.change_loop_body.PreCodegen.after.64bit.mir index dae0cbb65a..b6767077d4 100644 --- a/src/test/mir-opt/while_let_loops.change_loop_body.PreCodegen.after.64bit.mir +++ b/src/test/mir-opt/while_let_loops.change_loop_body.PreCodegen.after.64bit.mir @@ -10,7 +10,6 @@ fn change_loop_body() -> () { bb0: { StorageLive(_1); // scope 0 at $DIR/while_let_loops.rs:6:9: 6:15 _1 = const 0_i32; // scope 0 at $DIR/while_let_loops.rs:6:18: 6:19 - _0 = const (); // scope 1 at $DIR/while_let_loops.rs:7:5: 10:6 StorageDead(_1); // scope 0 at $DIR/while_let_loops.rs:11:1: 11:2 return; // scope 0 at $DIR/while_let_loops.rs:11:2: 11:2 } diff --git a/src/test/mir-opt/while_storage.while_loop.PreCodegen.after.mir b/src/test/mir-opt/while_storage.while_loop.PreCodegen.after.mir index 0c034891a8..eb3ab1c31e 100644 --- a/src/test/mir-opt/while_storage.while_loop.PreCodegen.after.mir +++ b/src/test/mir-opt/while_storage.while_loop.PreCodegen.after.mir @@ -24,7 +24,6 @@ fn while_loop(_1: bool) -> () { } bb2: { - _0 = const (); // scope 0 at $DIR/while-storage.rs:10:5: 14:6 goto -> bb7; // scope 0 at $DIR/while-storage.rs:10:5: 14:6 } @@ -44,7 +43,6 @@ fn while_loop(_1: bool) -> () { } bb5: { - _0 = const (); // scope 0 at $DIR/while-storage.rs:12:13: 12:18 StorageDead(_4); // scope 0 at $DIR/while-storage.rs:13:9: 13:10 goto -> bb7; // scope 0 at $DIR/while-storage.rs:1:1: 1:1 } diff --git a/src/test/pretty/asm.pp b/src/test/pretty/asm.pp index b3d188dd70..c86d8a1197 100644 --- a/src/test/pretty/asm.pp +++ b/src/test/pretty/asm.pp @@ -2,7 +2,7 @@ #![no_std] #![feature(asm)] #[prelude_import] -use ::std::prelude::v1::*; +use ::std::prelude::rust_2015::*; #[macro_use] extern crate std; diff --git a/src/test/pretty/cast-lt.pp b/src/test/pretty/cast-lt.pp index 47a7dac95b..4f6a924909 100644 --- a/src/test/pretty/cast-lt.pp +++ b/src/test/pretty/cast-lt.pp @@ -1,7 +1,7 @@ #![feature(prelude_import)] #![no_std] #[prelude_import] -use ::std::prelude::v1::*; +use ::std::prelude::rust_2015::*; #[macro_use] extern crate std; // pretty-compare-only diff --git a/src/test/pretty/dollar-crate.pp b/src/test/pretty/dollar-crate.pp index 131cd0a67c..f4be3c1c63 100644 --- a/src/test/pretty/dollar-crate.pp +++ b/src/test/pretty/dollar-crate.pp @@ -1,7 +1,7 @@ #![feature(prelude_import)] #![no_std] #[prelude_import] -use ::std::prelude::v1::*; +use ::std::prelude::rust_2015::*; #[macro_use] extern crate std; // pretty-compare-only diff --git a/src/test/pretty/expanded-and-path-remap-80832.pp b/src/test/pretty/expanded-and-path-remap-80832.pp index 6dbc19e9d9..1579ea41cf 100644 --- a/src/test/pretty/expanded-and-path-remap-80832.pp +++ b/src/test/pretty/expanded-and-path-remap-80832.pp @@ -1,7 +1,7 @@ #![feature(prelude_import)] #![no_std] #[prelude_import] -use ::std::prelude::v1::*; +use ::std::prelude::rust_2015::*; #[macro_use] extern crate std; // Test for issue 80832 diff --git a/src/test/pretty/gat-bounds.rs b/src/test/pretty/gat-bounds.rs index 789e4bc80a..8877c6cc99 100644 --- a/src/test/pretty/gat-bounds.rs +++ b/src/test/pretty/gat-bounds.rs @@ -13,4 +13,6 @@ impl X for () { type Y where Self: Sized = u32; } +fn f = i32>>() {} + fn main() { } diff --git a/src/test/pretty/issue-12590-c.pp b/src/test/pretty/issue-12590-c.pp index 1761c0653c..dd0b8899b2 100644 --- a/src/test/pretty/issue-12590-c.pp +++ b/src/test/pretty/issue-12590-c.pp @@ -1,7 +1,7 @@ #![feature(prelude_import)] #![no_std] #[prelude_import] -use ::std::prelude::v1::*; +use ::std::prelude::rust_2015::*; #[macro_use] extern crate std; // pretty-compare-only diff --git a/src/test/pretty/issue-4264.pp b/src/test/pretty/issue-4264.pp index 7b0a00282f..199aee0562 100644 --- a/src/test/pretty/issue-4264.pp +++ b/src/test/pretty/issue-4264.pp @@ -1,5 +1,5 @@ #[prelude_import] -use ::std::prelude::v1::*; +use ::std::prelude::rust_2015::*; #[macro_use] extern crate std; // pretty-compare-only diff --git a/src/test/pretty/macro_rules.rs b/src/test/pretty/macro_rules.rs new file mode 100644 index 0000000000..da223d164f --- /dev/null +++ b/src/test/pretty/macro_rules.rs @@ -0,0 +1,19 @@ +// pp-exact + +macro_rules! brace { () => { } ; } + +macro_rules! bracket[() => { } ;]; + +macro_rules! paren(() => { } ;); + +macro_rules! matcher_brackets { + (paren) => { } ; (bracket) => { } ; (brace) => { } ; +} + +macro_rules! all_fragments { + ($ b : block, $ e : expr, $ i : ident, $ it : item, $ l : lifetime, $ lit + : literal, $ m : meta, $ p : pat, $ pth : path, $ s : stmt, $ tt : tt, $ + ty : ty, $ vis : vis) => { } ; +} + +fn main() { } diff --git a/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/Makefile b/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/Makefile new file mode 100644 index 0000000000..a8515c533a --- /dev/null +++ b/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/Makefile @@ -0,0 +1,30 @@ +-include ../tools.mk + +all: archive + # Compile `main.rs`, which will link into our library, and run it. + $(RUSTC) main.rs + $(call RUN,main) + +ifdef IS_MSVC +archive: add.o panic.o + # Now, create an archive using these two objects. + $(AR) crus $(TMPDIR)/add.lib $(TMPDIR)/add.o $(TMPDIR)/panic.o +else +archive: add.o panic.o + # Now, create an archive using these two objects. + $(AR) crus $(TMPDIR)/libadd.a $(TMPDIR)/add.o $(TMPDIR)/panic.o +endif + +# Compile `panic.rs` into an object file. +# +# Note that we invoke `rustc` directly, so we may emit an object rather +# than an archive. We'll do that later. +panic.o: + $(BARE_RUSTC) $(RUSTFLAGS) \ + --out-dir $(TMPDIR) \ + --emit=obj panic.rs + +# Compile `add.c` into an object file. +add.o: + $(call COMPILE_OBJ,$(TMPDIR)/add.o,add.c) + diff --git a/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/add.c b/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/add.c new file mode 100644 index 0000000000..444359451f --- /dev/null +++ b/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/add.c @@ -0,0 +1,12 @@ +#ifdef _WIN32 +__declspec(dllexport) +#endif + +// An external function, defined in Rust. +extern void panic_if_greater_than_10(unsigned x); + +unsigned add_small_numbers(unsigned a, unsigned b) { + unsigned c = a + b; + panic_if_greater_than_10(c); + return c; +} diff --git a/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/main.rs b/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/main.rs new file mode 100644 index 0000000000..78a71219c7 --- /dev/null +++ b/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/main.rs @@ -0,0 +1,35 @@ +//! A test for calling `C-unwind` functions across foreign function boundaries. +//! +//! This test triggers a panic in a Rust library that our foreign function invokes. This shows +//! that we can unwind through the C code in that library, and catch the underlying panic. +#![feature(c_unwind)] + +use std::panic::{catch_unwind, AssertUnwindSafe}; + +fn main() { + // Call `add_small_numbers`, passing arguments that will NOT trigger a panic. + let (a, b) = (9, 1); + let c = unsafe { add_small_numbers(a, b) }; + assert_eq!(c, 10); + + // Call `add_small_numbers`, passing arguments that will trigger a panic, and catch it. + let caught_unwind = catch_unwind(AssertUnwindSafe(|| { + let (a, b) = (10, 1); + let _c = unsafe { add_small_numbers(a, b) }; + unreachable!("should have unwound instead of returned"); + })); + + // Assert that we did indeed panic, then unwrap and downcast the panic into the sum. + assert!(caught_unwind.is_err()); + let panic_obj = caught_unwind.unwrap_err(); + let msg = panic_obj.downcast_ref::().unwrap(); + assert_eq!(msg, "11"); +} + +#[link(name = "add", kind = "static")] +extern "C-unwind" { + /// An external function, defined in C. + /// + /// Returns the sum of two numbers, or panics if the sum is greater than 10. + fn add_small_numbers(a: u32, b: u32) -> u32; +} diff --git a/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/panic.rs b/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/panic.rs new file mode 100644 index 0000000000..a99a04d5c6 --- /dev/null +++ b/src/test/run-make-fulldeps/c-unwind-abi-catch-lib-panic/panic.rs @@ -0,0 +1,12 @@ +#![crate_type = "staticlib"] +#![feature(c_unwind)] + +/// This function will panic if `x` is greater than 10. +/// +/// This function is called by `add_small_numbers`. +#[no_mangle] +pub extern "C-unwind" fn panic_if_greater_than_10(x: u32) { + if x > 10 { + panic!("{}", x); // That is too big! + } +} diff --git a/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/Makefile b/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/Makefile new file mode 100644 index 0000000000..9553b7aeeb --- /dev/null +++ b/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/Makefile @@ -0,0 +1,5 @@ +-include ../tools.mk + +all: $(call NATIVE_STATICLIB,add) + $(RUSTC) main.rs + $(call RUN,main) || exit 1 diff --git a/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/add.c b/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/add.c new file mode 100644 index 0000000000..444359451f --- /dev/null +++ b/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/add.c @@ -0,0 +1,12 @@ +#ifdef _WIN32 +__declspec(dllexport) +#endif + +// An external function, defined in Rust. +extern void panic_if_greater_than_10(unsigned x); + +unsigned add_small_numbers(unsigned a, unsigned b) { + unsigned c = a + b; + panic_if_greater_than_10(c); + return c; +} diff --git a/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/main.rs b/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/main.rs new file mode 100644 index 0000000000..15d38d7216 --- /dev/null +++ b/src/test/run-make-fulldeps/c-unwind-abi-catch-panic/main.rs @@ -0,0 +1,44 @@ +//! A test for calling `C-unwind` functions across foreign function boundaries. +//! +//! This test triggers a panic when calling a foreign function that calls *back* into Rust. +#![feature(c_unwind)] + +use std::panic::{catch_unwind, AssertUnwindSafe}; + +fn main() { + // Call `add_small_numbers`, passing arguments that will NOT trigger a panic. + let (a, b) = (9, 1); + let c = unsafe { add_small_numbers(a, b) }; + assert_eq!(c, 10); + + // Call `add_small_numbers`, passing arguments that will trigger a panic, and catch it. + let caught_unwind = catch_unwind(AssertUnwindSafe(|| { + let (a, b) = (10, 1); + let _c = unsafe { add_small_numbers(a, b) }; + unreachable!("should have unwound instead of returned"); + })); + + // Assert that we did indeed panic, then unwrap and downcast the panic into the sum. + assert!(caught_unwind.is_err()); + let panic_obj = caught_unwind.unwrap_err(); + let msg = panic_obj.downcast_ref::().unwrap(); + assert_eq!(msg, "11"); +} + +#[link(name = "add", kind = "static")] +extern "C-unwind" { + /// An external function, defined in C. + /// + /// Returns the sum of two numbers, or panics if the sum is greater than 10. + fn add_small_numbers(a: u32, b: u32) -> u32; +} + +/// This function will panic if `x` is greater than 10. +/// +/// This function is called by `add_small_numbers`. +#[no_mangle] +pub extern "C-unwind" fn panic_if_greater_than_10(x: u32) { + if x > 10 { + panic!("{}", x); // That is too big! + } +} diff --git a/src/test/run-make-fulldeps/coverage-reports/Makefile b/src/test/run-make-fulldeps/coverage-reports/Makefile index a700cf68cd..af75ec5e24 100644 --- a/src/test/run-make-fulldeps/coverage-reports/Makefile +++ b/src/test/run-make-fulldeps/coverage-reports/Makefile @@ -1,4 +1,3 @@ -# ignore-test Broken; accidentally silently ignored on Linux CI; FIXME(#81688) # needs-profiler-support # ignore-windows-gnu # min-llvm-version: 11.0 @@ -83,13 +82,13 @@ endif %: $(SOURCEDIR)/lib/%.rs # Compile the test library with coverage instrumentation $(RUSTC) $(SOURCEDIR)/lib/$@.rs \ - $$( grep -q '^\/\/ require-rust-edition-2018' $(SOURCEDIR)/lib/$@.rs && echo "--edition=2018" ) \ + $$( sed -nE 's#^// compile-flags:(.*)#\1# p' $(SOURCEDIR)/lib/$@.rs) \ --crate-type rlib -Zinstrument-coverage %: $(SOURCEDIR)/%.rs # Compile the test program with coverage instrumentation $(RUSTC) $(SOURCEDIR)/$@.rs \ - $$( grep -q '^\/\/ require-rust-edition-2018' $(SOURCEDIR)/$@.rs && echo "--edition=2018" ) \ + $$( sed -nE 's#^// compile-flags:(.*)#\1# p' $(SOURCEDIR)/$@.rs) \ -L "$(TMPDIR)" -Zinstrument-coverage # Run it in order to generate some profiling data, @@ -108,7 +107,7 @@ endif # Run it through rustdoc as well to cover doctests LLVM_PROFILE_FILE="$(TMPDIR)"/$@-%p.profraw \ $(RUSTDOC) --crate-name workaround_for_79771 --test $(SOURCEDIR)/$@.rs \ - $$( grep -q '^\/\/ require-rust-edition-2018' $(SOURCEDIR)/$@.rs && echo "--edition=2018" ) \ + $$( sed -nE 's#^// compile-flags:(.*)#\1# p' $(SOURCEDIR)/$@.rs) \ -L "$(TMPDIR)" -Zinstrument-coverage \ -Z unstable-options --persist-doctests=$(TMPDIR)/rustdoc-$@ @@ -128,7 +127,7 @@ endif $$( \ for file in $(TMPDIR)/rustdoc-$@/*/rust_out; \ do \ - [[ -x $$file ]] && printf "%s %s " -object $$file; \ + [ -x "$$file" ] && printf "%s %s " -object $$file; \ done \ ) \ 2> "$(TMPDIR)"/show_coverage_stderr.$@.txt \ diff --git a/src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.async.txt b/src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.async.txt index 824bddaa40..3f9403e6f7 100644 --- a/src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.async.txt +++ b/src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.async.txt @@ -1,6 +1,6 @@ 1| |#![allow(unused_assignments, dead_code)] 2| | - 3| |// require-rust-edition-2018 + 3| |// compile-flags: --edition=2018 4| | 5| 1|async fn c(x: u8) -> u8 { 6| 1| if x == 8 { diff --git a/src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.inline.txt b/src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.inline.txt new file mode 100644 index 0000000000..6148d89ed7 --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.inline.txt @@ -0,0 +1,53 @@ + 1| |// compile-flags: -Zinline-mir + 2| | + 3| |use std::fmt::Display; + 4| | + 5| 1|fn main() { + 6| 1| permutations(&['a', 'b', 'c']); + 7| 1|} + 8| | + 9| |#[inline(always)] + 10| 1|fn permutations(xs: &[T]) { + 11| 1| let mut ys = xs.to_owned(); + 12| 1| permutate(&mut ys, 0); + 13| 1|} + 14| | + 15| 16|fn permutate(xs: &mut [T], k: usize) { + 16| 16| let n = length(xs); + 17| 16| if k == n { + 18| 6| display(xs); + 19| 10| } else if k < n { + 20| 15| for i in k..n { + ^10 + 21| 15| swap(xs, i, k); + 22| 15| permutate(xs, k + 1); + 23| 15| swap(xs, i, k); + 24| 15| } + 25| 0| } else { + 26| 0| error(); + 27| 0| } + 28| 16|} + 29| | + 30| 16|fn length(xs: &[T]) -> usize { + 31| 16| xs.len() + 32| 16|} + 33| | + 34| |#[inline] + 35| 30|fn swap(xs: &mut [T], i: usize, j: usize) { + 36| 30| let t = xs[i]; + 37| 30| xs[i] = xs[j]; + 38| 30| xs[j] = t; + 39| 30|} + 40| | + 41| 6|fn display(xs: &[T]) { + 42| 18| for x in xs { + 43| 18| print!("{}", x); + 44| 18| } + 45| 6| println!(); + 46| 6|} + 47| | + 48| |#[inline(always)] + 49| |fn error() { + 50| | panic!("error"); + 51| |} + diff --git a/src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.partial_eq.txt b/src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.partial_eq.txt index 0fe124f12d..9cc9a4d47a 100644 --- a/src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.partial_eq.txt +++ b/src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.partial_eq.txt @@ -2,11 +2,11 @@ 2| |// structure of this test. 3| | 4| 2|#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] - ^0 ^0 ^0 ^0 ^1 ^0 ^0^0 + ^0 ^0 ^0 ^0 ^1 ^1 ^0^0 5| |pub struct Version { 6| | major: usize, - 7| 1| minor: usize, // Count: 1 - `PartialOrd` compared `minor` values in 3.2.1 vs. 3.3.0 - 8| 0| patch: usize, // Count: 0 - `PartialOrd` was determined by `minor` (2 < 3) + 7| | minor: usize, + 8| | patch: usize, 9| |} 10| | 11| |impl Version { @@ -45,19 +45,4 @@ 44| |`function_source_hash` without a code region, if necessary. 45| | 46| |*/ - 47| | - 48| |// FIXME(#79626): The derived traits get coverage, which is great, but some of the traits appear - 49| |// to get two coverage execution counts at different positions: - 50| |// - 51| |// ```text - 52| |// 4| 2|#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] - 53| |// ^0 ^0 ^0 ^0 ^1 ^0 ^0^0 - 54| |// ```text - 55| |// - 56| |// `PartialEq`, `PartialOrd`, and `Ord` (and possibly `Eq`, if the trait name was longer than 2 - 57| |// characters) have counts at their first and last characters. - 58| |// - 59| |// Why is this? Why does `PartialOrd` have two values (1 and 0)? This must mean we are checking - 60| |// distinct coverages, so maybe we don't want to eliminate one of them. Should we merge them? - 61| |// If merged, do we lose some information? diff --git a/src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.uses_crate.txt b/src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.uses_crate.txt index e14e733fff..bc2f673349 100644 --- a/src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.uses_crate.txt +++ b/src/test/run-make-fulldeps/coverage-reports/expected_show_coverage.uses_crate.txt @@ -19,12 +19,12 @@ 18| 2| println!("used_only_from_bin_crate_generic_function with {:?}", arg); 19| 2|} ------------------ - | used_crate::used_only_from_bin_crate_generic_function::<&str>: + | used_crate::used_only_from_bin_crate_generic_function::<&alloc::vec::Vec>: | 17| 1|pub fn used_only_from_bin_crate_generic_function(arg: T) { | 18| 1| println!("used_only_from_bin_crate_generic_function with {:?}", arg); | 19| 1|} ------------------ - | used_crate::used_only_from_bin_crate_generic_function::<&alloc::vec::Vec>: + | used_crate::used_only_from_bin_crate_generic_function::<&str>: | 17| 1|pub fn used_only_from_bin_crate_generic_function(arg: T) { | 18| 1| println!("used_only_from_bin_crate_generic_function with {:?}", arg); | 19| 1|} @@ -93,9 +93,6 @@ 59| 1| used_only_from_this_lib_crate_generic_function(some_vec); 60| 1| used_only_from_this_lib_crate_generic_function("used ONLY from library used_crate.rs"); 61| 1|} - ------------------ - | Unexecuted instantiation: used_crate::use_this_lib_crate - ------------------ 62| | 63| |// FIXME(#79651): `used_from_bin_crate_and_lib_crate_generic_function()` is covered and executed 64| |// `2` times, but the coverage output also shows (at the bottom of the coverage report): diff --git a/src/test/run-make-fulldeps/coverage-spanview/Makefile b/src/test/run-make-fulldeps/coverage-spanview/Makefile index 2713e7d52f..b0bfa7074d 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/Makefile +++ b/src/test/run-make-fulldeps/coverage-spanview/Makefile @@ -38,10 +38,9 @@ endif %: $(SOURCEDIR)/lib/%.rs # Compile the test library with coverage instrumentation $(RUSTC) $(SOURCEDIR)/lib/$@.rs \ - $$( grep -q '^\/\/ require-rust-edition-2018' $(SOURCEDIR)/lib/$@.rs && \ - echo "--edition=2018" \ - ) \ + $$( sed -nE 's#^// compile-flags:(.*)#\1# p' $(SOURCEDIR)/lib/$@.rs) \ --crate-type rlib \ + -Ztrim-diagnostic-paths=no \ -Zinstrument-coverage \ -Zdump-mir=InstrumentCoverage \ -Zdump-mir-spanview \ @@ -69,10 +68,9 @@ endif %: $(SOURCEDIR)/%.rs # Compile the test program with coverage instrumentation $(RUSTC) $(SOURCEDIR)/$@.rs \ - $$( grep -q '^\/\/ require-rust-edition-2018' $(SOURCEDIR)/$@.rs && \ - echo "--edition=2018" \ - ) \ + $$( sed -nE 's#^// compile-flags:(.*)#\1# p' $(SOURCEDIR)/$@.rs) \ -L "$(TMPDIR)" \ + -Ztrim-diagnostic-paths=no \ -Zinstrument-coverage \ -Zdump-mir=InstrumentCoverage \ -Zdump-mir-spanview \ diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.abort/abort.might_abort.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.abort/abort.might_abort.-------.InstrumentCoverage.0.html index b058dce298..a302b974ae 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.abort/abort.might_abort.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.abort/abort.might_abort.-------.InstrumentCoverage.0.html @@ -81,10 +81,10 @@ For revisions in Pull Requests (PR): 7:9-7:33: @1[18]: _13 = &(*_32) 7:9-7:33: @1[19]: _12 = &(*_13) 7:9-7:33: @1[20]: _11 = move _12 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -7:9-7:33: @1.Call: _6 = Arguments::new_v1(move _7, move _11) -> [return: bb3, unwind: bb7] -7:9-7:33: @3.Call: _5 = _print(move _6) -> [return: bb4, unwind: bb7] +7:9-7:33: @1.Call: _6 = std::fmt::Arguments::new_v1(move _7, move _11) -> [return: bb3, unwind: bb7] +7:9-7:33: @3.Call: _5 = std::io::_print(move _6) -> [return: bb4, unwind: bb7] 7:9-7:33: @4[5]: _4 = const () -8:9-8:37: @4.Call: begin_panic::<&str>(const "panics and aborts") -> bb7">@1,3,4⦊println!("aborting..."); +8:9-8:37: @4.Call: std::rt::begin_panic::<&str>(const "panics and aborts") -> bb7">@1,3,4⦊println!("aborting..."); panic!("panics and aborts");⦉@1,3,4 +8:9-8:37: @4.Call: std::rt::begin_panic::<&str>(const "panics and aborts") -> bb7"> panic!("panics and aborts");⦉@1,3,4 } else @2,5,6⦊{ @@ -124,8 +124,8 @@ For revisions in Pull Requests (PR): 10:9-10:33: @2[18]: _27 = &(*_30) 10:9-10:33: @2[19]: _26 = &(*_27) 10:9-10:33: @2[20]: _25 = move _26 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -10:9-10:33: @2.Call: _20 = Arguments::new_v1(move _21, move _25) -> [return: bb5, unwind: bb7] -10:9-10:33: @5.Call: _19 = _print(move _20) -> [return: bb6, unwind: bb7] +10:9-10:33: @2.Call: _20 = std::fmt::Arguments::new_v1(move _21, move _25) -> [return: bb5, unwind: bb7] +10:9-10:33: @5.Call: _19 = std::io::_print(move _20) -> [return: bb6, unwind: bb7] 10:9-10:33: @6[5]: _18 = const () 9:12-11:6: @6[7]: _0 = const () 12:2-12:2: @6.Return: return"> println!("Don't Panic"); @@ -139,8 +139,8 @@ For revisions in Pull Requests (PR): 10:9-10:33: @2[18]: _27 = &(*_30) 10:9-10:33: @2[19]: _26 = &(*_27) 10:9-10:33: @2[20]: _25 = move _26 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -10:9-10:33: @2.Call: _20 = Arguments::new_v1(move _21, move _25) -> [return: bb5, unwind: bb7] -10:9-10:33: @5.Call: _19 = _print(move _20) -> [return: bb6, unwind: bb7] +10:9-10:33: @2.Call: _20 = std::fmt::Arguments::new_v1(move _21, move _25) -> [return: bb5, unwind: bb7] +10:9-10:33: @5.Call: _19 = std::io::_print(move _20) -> [return: bb6, unwind: bb7] 10:9-10:33: @6[5]: _18 = const () 9:12-11:6: @6[7]: _0 = const () 12:2-12:2: @6.Return: return"> } @@ -154,8 +154,8 @@ For revisions in Pull Requests (PR): 10:9-10:33: @2[18]: _27 = &(*_30) 10:9-10:33: @2[19]: _26 = &(*_27) 10:9-10:33: @2[20]: _25 = move _26 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -10:9-10:33: @2.Call: _20 = Arguments::new_v1(move _21, move _25) -> [return: bb5, unwind: bb7] -10:9-10:33: @5.Call: _19 = _print(move _20) -> [return: bb6, unwind: bb7] +10:9-10:33: @2.Call: _20 = std::fmt::Arguments::new_v1(move _21, move _25) -> [return: bb5, unwind: bb7] +10:9-10:33: @5.Call: _19 = std::io::_print(move _20) -> [return: bb6, unwind: bb7] 10:9-10:33: @6[5]: _18 = const () 9:12-11:6: @6[7]: _0 = const () 12:2-12:2: @6.Return: return">}⦉@2,5,6
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.assert/assert.might_fail_assert.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.assert/assert.might_fail_assert.-------.InstrumentCoverage.0.html index 823bb0cfd8..db72a5306f 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.assert/assert.might_fail_assert.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.assert/assert.might_fail_assert.-------.InstrumentCoverage.0.html @@ -70,8 +70,8 @@ For revisions in Pull Requests (PR):
    @0,1,2,3,4⦊fn might_fail_assert(one_plus_one: u32) ⦉@0,1,2,3,4{ - @0,1,2,3,4⦊println!("does 1 + 1 = {}?", one_plus_one);⦉@0,1,2,3,4 - assert_eq!(@0,1,2,3,4⦊1 + 1⦉@0,1,2,3,4, one_plus_one, @5,7,8,9,10,11⦊"the argument was wrong"⦉@5,7,8,9,10,11); + assert_eq!(@0,1,2,3,4⦊1 + 1⦉@0,1,2,3,4, one_plus_one, @5,7⦊"the argument was wrong"⦉@5,7); }@6⦊‸⦉@6
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#0}.-------.InstrumentCoverage.0.html index 0f37df23fe..64fc1568b0 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#0}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#0}.-------.InstrumentCoverage.0.html @@ -73,12 +73,12 @@ For revisions in Pull Requests (PR): 24:38-24:74: @1[5]: FakeRead(ForMatchedPlace, _13) 24:38-24:74: @1[7]: _25 = (_13.0: &std::fmt::Arguments) 24:38-24:74: @1[10]: _27 = &(*_25) -24:38-24:74: @1[12]: _28 = <Arguments as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r std::fmt::Arguments, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -24:38-24:74: @1.Call: _26 = ArgumentV1::new::<Arguments>(move _27, move _28) -> [return: bb2, unwind: bb4] +24:38-24:74: @1[12]: _28 = <std::fmt::Arguments as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r std::fmt::Arguments, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +24:38-24:74: @1.Call: _26 = std::fmt::ArgumentV1::new::<std::fmt::Arguments>(move _27, move _28) -> [return: bb2, unwind: bb4] 24:38-24:74: @2[2]: _12 = [move _26] 24:38-24:74: @2[5]: _11 = &_12 24:38-24:74: @2[6]: _10 = &(*_11) 24:38-24:74: @2[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -24:38-24:74: @2.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb3, unwind: bb4]">@0,1,2,3⦊‸⦉@0,1,2,3$crate::panicking::panic_fmt($crate::format_args!($fmt, $($arg)+))
    +24:38-24:74: @2.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb3, unwind: bb4]">@0,1,2,3⦊‸⦉@0,1,2,3$crate::panicking::panic_fmt($crate::format_args!($fmt, $($arg)+))
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#1}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#1}.-------.InstrumentCoverage.0.html index 828b9cebd6..1bbcfa5744 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#1}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#1}.-------.InstrumentCoverage.0.html @@ -73,12 +73,12 @@ For revisions in Pull Requests (PR): 24:38-24:74: @1[5]: FakeRead(ForMatchedPlace, _13) 24:38-24:74: @1[7]: _25 = (_13.0: &std::fmt::Arguments) 24:38-24:74: @1[10]: _27 = &(*_25) -24:38-24:74: @1[12]: _28 = <Arguments as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r std::fmt::Arguments, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -24:38-24:74: @1.Call: _26 = ArgumentV1::new::<Arguments>(move _27, move _28) -> [return: bb2, unwind: bb4] +24:38-24:74: @1[12]: _28 = <std::fmt::Arguments as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r std::fmt::Arguments, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +24:38-24:74: @1.Call: _26 = std::fmt::ArgumentV1::new::<std::fmt::Arguments>(move _27, move _28) -> [return: bb2, unwind: bb4] 24:38-24:74: @2[2]: _12 = [move _26] 24:38-24:74: @2[5]: _11 = &_12 24:38-24:74: @2[6]: _10 = &(*_11) 24:38-24:74: @2[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -24:38-24:74: @2.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb3, unwind: bb4]">@0,1,2,3⦊‸⦉@0,1,2,3$crate::panicking::panic_fmt($crate::format_args!($fmt, $($arg)+))
    +24:38-24:74: @2.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb3, unwind: bb4]">@0,1,2,3⦊‸⦉@0,1,2,3$crate::panicking::panic_fmt($crate::format_args!($fmt, $($arg)+))
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#2}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#2}.-------.InstrumentCoverage.0.html index 28b10e59b5..14cb98d20c 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#2}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on-VTABLE-{closure#2}.-------.InstrumentCoverage.0.html @@ -73,12 +73,12 @@ For revisions in Pull Requests (PR): 24:38-24:74: @1[5]: FakeRead(ForMatchedPlace, _13) 24:38-24:74: @1[7]: _25 = (_13.0: &std::fmt::Arguments) 24:38-24:74: @1[10]: _27 = &(*_25) -24:38-24:74: @1[12]: _28 = <Arguments as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r std::fmt::Arguments, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -24:38-24:74: @1.Call: _26 = ArgumentV1::new::<Arguments>(move _27, move _28) -> [return: bb2, unwind: bb4] +24:38-24:74: @1[12]: _28 = <std::fmt::Arguments as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r std::fmt::Arguments, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +24:38-24:74: @1.Call: _26 = std::fmt::ArgumentV1::new::<std::fmt::Arguments>(move _27, move _28) -> [return: bb2, unwind: bb4] 24:38-24:74: @2[2]: _12 = [move _26] 24:38-24:74: @2[5]: _11 = &_12 24:38-24:74: @2[6]: _10 = &(*_11) 24:38-24:74: @2[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -24:38-24:74: @2.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb3, unwind: bb4]">@0,1,2,3⦊‸⦉@0,1,2,3$crate::panicking::panic_fmt($crate::format_args!($fmt, $($arg)+))
    +24:38-24:74: @2.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb3, unwind: bb4]">@0,1,2,3⦊‸⦉@0,1,2,3$crate::panicking::panic_fmt($crate::format_args!($fmt, $($arg)+))
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on.-------.InstrumentCoverage.0.html index 81310c8cb2..9a5bd6e42c 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.executor-block_on.-------.InstrumentCoverage.0.html @@ -70,166 +70,166 @@ For revisions in Pull Requests (PR):
    @0,1,2,3,4,5⦊pub fn block_on<F: Future>(mut future: F) -> F::Output { let mut future = unsafe { Pin::new_unchecked(&mut future) }; static VTABLE: RawWakerVTable = RawWakerVTable::new( |_| unimplemented!("clone"), |_| unimplemented!("wake"), |_| unimplemented!("wake_by_ref"), |_| (), ); let waker = unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &VTABLE)) }; let mut context = Context::from_waker(&waker)⦉@0,1,2,3,4,5; loop { if let Poll::Ready(@10,12,14,15,16,17⦊val⦉@10,12,14,15,16,17) = @6,7,8,9⦊future.as_mut().poll(&mut context)⦉@6,7,8,9 { break @10,12,14,15,16,17⦊val⦉@10,12,14,15,16,17; }@11,13⦊‸⦉@11,13 diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.main.-------.InstrumentCoverage.0.html index 313a36ed6c..b892af0ed3 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.async/async.main.-------.InstrumentCoverage.0.html @@ -72,118 +72,118 @@ For revisions in Pull Requests (PR):
    @0,1,2,3,4,5,6,7,8,9,10,11,12,13⦊fn main() { let _ = g(10); let _ = h(9); let mut future = Box::pin(i(8)); j(7); l(6); let _ = m(5); executor::block_on(future.as_mut()); }⦉@0,1,2,3,4,5,6,7,8,9,10,11,12,13
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#0}.-------.InstrumentCoverage.0.html index b4b171dc95..3998295a05 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#0}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#0}.-------.InstrumentCoverage.0.html @@ -86,11 +86,11 @@ For revisions in Pull Requests (PR): 36:21-38:10: @1[1]: _3 = const ()"> }⦉@1@2⦊‸⦉@2 @3,4⦊"alt string 2".to_owned() }⦉@3,4
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#10}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#10}.-------.InstrumentCoverage.0.html index c1edc3eb92..3bdfe71b48 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#10}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#10}.-------.InstrumentCoverage.0.html @@ -86,11 +86,11 @@ For revisions in Pull Requests (PR): 21:29-23:18: @1[1]: _3 = const ()"> }⦉@1@2⦊‸⦉@2 @3,4⦊"alt string 1".to_owned() }⦉@3,4
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#11}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#11}.-------.InstrumentCoverage.0.html index 24c1cadaca..4b3f04b5a0 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#11}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#11}.-------.InstrumentCoverage.0.html @@ -86,11 +86,11 @@ For revisions in Pull Requests (PR): 63:29-65:18: @1[1]: _3 = const ()"> }⦉@1@2⦊‸⦉@2 @3,4⦊"alt string 3".to_owned() }⦉@3,4
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#1}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#1}.-------.InstrumentCoverage.0.html index 7a3921c5ae..8ae494178f 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#1}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#1}.-------.InstrumentCoverage.0.html @@ -86,11 +86,11 @@ For revisions in Pull Requests (PR): 78:21-80:10: @1[1]: _3 = const ()"> }⦉@1@2⦊‸⦉@2 @3,4⦊"alt string 4".to_owned() }⦉@3,4
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#2}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#2}.-------.InstrumentCoverage.0.html index 5071842aa1..ad40ba57d6 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#2}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#2}.-------.InstrumentCoverage.0.html @@ -94,13 +94,13 @@ For revisions in Pull Requests (PR): 103:9-103:29: @3[23]: _18 = (_16.0: &&str) 103:9-103:29: @3[26]: _20 = &(*_18) 103:9-103:29: @3[28]: _21 = <&str as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r &str, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -103:9-103:29: @3.Call: _19 = ArgumentV1::new::<&str>(move _20, move _21) -> [return: bb4, unwind: bb8] +103:9-103:29: @3.Call: _19 = std::fmt::ArgumentV1::new::<&str>(move _20, move _21) -> [return: bb4, unwind: bb8] 103:9-103:29: @4[2]: _15 = [move _19] 103:9-103:29: @4[5]: _14 = &_15 103:9-103:29: @4[6]: _13 = &(*_14) 103:9-103:29: @4[7]: _12 = move _13 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -103:9-103:29: @4.Call: _7 = Arguments::new_v1(move _8, move _12) -> [return: bb5, unwind: bb8] -103:9-103:29: @5.Call: _6 = format(move _7) -> [return: bb6, unwind: bb8] +103:9-103:29: @4.Call: _7 = std::fmt::Arguments::new_v1(move _8, move _12) -> [return: bb5, unwind: bb8] +103:9-103:29: @5.Call: _6 = std::fmt::format(move _7) -> [return: bb6, unwind: bb8] 103:9-103:29: @6[1]: FakeRead(ForLet, _6) 103:9-103:29: @6[6]: _0 = move _6 104:6-104:6: @7.Return: return">@3,4,5,6,7⦊format!("'{}'", val) @@ -114,13 +114,13 @@ For revisions in Pull Requests (PR): 103:9-103:29: @3[23]: _18 = (_16.0: &&str) 103:9-103:29: @3[26]: _20 = &(*_18) 103:9-103:29: @3[28]: _21 = <&str as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r &str, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -103:9-103:29: @3.Call: _19 = ArgumentV1::new::<&str>(move _20, move _21) -> [return: bb4, unwind: bb8] +103:9-103:29: @3.Call: _19 = std::fmt::ArgumentV1::new::<&str>(move _20, move _21) -> [return: bb4, unwind: bb8] 103:9-103:29: @4[2]: _15 = [move _19] 103:9-103:29: @4[5]: _14 = &_15 103:9-103:29: @4[6]: _13 = &(*_14) 103:9-103:29: @4[7]: _12 = move _13 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -103:9-103:29: @4.Call: _7 = Arguments::new_v1(move _8, move _12) -> [return: bb5, unwind: bb8] -103:9-103:29: @5.Call: _6 = format(move _7) -> [return: bb6, unwind: bb8] +103:9-103:29: @4.Call: _7 = std::fmt::Arguments::new_v1(move _8, move _12) -> [return: bb5, unwind: bb8] +103:9-103:29: @5.Call: _6 = std::fmt::format(move _7) -> [return: bb6, unwind: bb8] 103:9-103:29: @6[1]: FakeRead(ForLet, _6) 103:9-103:29: @6[6]: _0 = move _6 104:6-104:6: @7.Return: return"> }⦉@3,4,5,6,7
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#3}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#3}.-------.InstrumentCoverage.0.html index 0940775840..23101d76a8 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#3}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#3}.-------.InstrumentCoverage.0.html @@ -81,11 +81,11 @@ For revisions in Pull Requests (PR): 124:21-126:10: @1[1]: _3 = const ()"> }⦉@1@2⦊‸⦉@2 @3,4⦊"closure should be unused".to_owned() }⦉@3,4
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#5}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#5}.-------.InstrumentCoverage.0.html index 9ff7a13522..1c19aa8eee 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#5}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#5}.-------.InstrumentCoverage.0.html @@ -69,47 +69,47 @@ For revisions in Pull Requests (PR): -
    @0,1,2⦊{ - $crate::io::_print($crate::format_args_nl!($($arg)*)); - }⦉@0,1,2
    +
    @0,1,2⦊{ + $crate::io::_print($crate::format_args_nl!($($arg)*)); + }⦉@0,1,2
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#6}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#6}.-------.InstrumentCoverage.0.html index d479211aa3..74c75c6c46 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#6}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#6}.-------.InstrumentCoverage.0.html @@ -79,8 +79,8 @@ For revisions in Pull Requests (PR): 141:61-141:83: @0[17]: _11 = &(*_14) 141:61-141:83: @0[18]: _10 = &(*_11) 141:61-141:83: @0[19]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -141:61-141:83: @0.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb1, unwind: bb3] -141:61-141:83: @1.Call: _3 = _print(move _4) -> [return: bb2, unwind: bb3] +141:61-141:83: @0.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb1, unwind: bb3] +141:61-141:83: @1.Call: _3 = std::io::_print(move _4) -> [return: bb2, unwind: bb3] 141:61-141:83: @2[5]: _0 = const () 141:85-141:85: @2.Return: return">@0,1,2⦊{ println!("not called") }⦉@0,1,2
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#7}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#7}.-------.InstrumentCoverage.0.html index 2734c0b246..386fb1b9e6 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#7}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#7}.-------.InstrumentCoverage.0.html @@ -79,8 +79,8 @@ For revisions in Pull Requests (PR): 144:9-144:31: @0[17]: _11 = &(*_14) 144:9-144:31: @0[18]: _10 = &(*_11) 144:9-144:31: @0[19]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -144:9-144:31: @0.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb1, unwind: bb3] -144:9-144:31: @1.Call: _3 = _print(move _4) -> [return: bb2, unwind: bb3] +144:9-144:31: @0.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb1, unwind: bb3] +144:9-144:31: @1.Call: _3 = std::io::_print(move _4) -> [return: bb2, unwind: bb3] 144:9-144:31: @2[5]: _0 = const () 145:6-145:6: @2.Return: return">@0,1,2⦊{ println!("not called") }⦉@0,1,2
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#8}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#8}.-------.InstrumentCoverage.0.html index a032df54ea..f9da6ac9df 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#8}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#8}.-------.InstrumentCoverage.0.html @@ -81,8 +81,8 @@ For revisions in Pull Requests (PR): 149:9-149:31: @0[17]: _11 = &(*_14) 149:9-149:31: @0[18]: _10 = &(*_11) 149:9-149:31: @0[19]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -149:9-149:31: @0.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb1, unwind: bb3] -149:9-149:31: @1.Call: _3 = _print(move _4) -> [return: bb2, unwind: bb3] +149:9-149:31: @0.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb1, unwind: bb3] +149:9-149:31: @1.Call: _3 = std::io::_print(move _4) -> [return: bb2, unwind: bb3] 149:9-149:31: @2[5]: _0 = const () 149:33-149:33: @2.Return: return">@0,1,2⦊{ println!("not called") }⦉@0,1,2
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#9}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#9}.-------.InstrumentCoverage.0.html index 3c174e03eb..e259fc9bb6 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#9}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main-{closure#9}.-------.InstrumentCoverage.0.html @@ -81,8 +81,8 @@ For revisions in Pull Requests (PR): 153:9-153:31: @0[17]: _11 = &(*_14) 153:9-153:31: @0[18]: _10 = &(*_11) 153:9-153:31: @0[19]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -153:9-153:31: @0.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb1, unwind: bb3] -153:9-153:31: @1.Call: _3 = _print(move _4) -> [return: bb2, unwind: bb3] +153:9-153:31: @0.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb1, unwind: bb3] +153:9-153:31: @1.Call: _3 = std::io::_print(move _4) -> [return: bb2, unwind: bb3] 153:9-153:31: @2[5]: _0 = const () 153:33-153:33: @2.Return: return">@0,1,2⦊{ println!("not called") }⦉@0,1,2
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main.-------.InstrumentCoverage.0.html index 702c793706..a7d1728114 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.closure/closure.main.-------.InstrumentCoverage.0.html @@ -69,516 +69,516 @@ For revisions in Pull Requests (PR): -
    @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,37,38,39,40,41,42⦊fn main() { - // Initialize test constants in a way that cannot be determined at compile time, to ensure - // rustc and LLVM cannot optimize out statements (or coverage counters) downstream from - // dependent conditions. - let is_true = std::env::args().len() == 1; - let is_false = ! is_true; - - let mut some_string = Some(String::from("the string content")); - println!( - "The string or alt: {}" - , - some_string - . - unwrap_or_else - ( - ⦉@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,37,38,39,40,41,42|| { @@ -587,327 +587,327 @@ For revisions in Pull Requests (PR): countdown = 10; } "alt string 1".to_owned() - } }@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,37,38,39,40,41,42⦊ - ) - ); - - some_string = Some(String::from("the string content")); - let - a - = - ⦉@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,37,38,39,40,41,42|| @@ -917,39 +917,39 @@ For revisions in Pull Requests (PR): countdown = 10; } "alt string 2".to_owned() - } }@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,37,38,39,40,41,42⦊; - println!( - "The string or alt: {}" - , - some_string - . - unwrap_or_else - ( - a - ) - ); - - some_string = None; - println!( - "The string or alt: {}" - , - some_string - . - unwrap_or_else - ( - ⦉@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,37,38,39,40,41,42|| { @@ -2561,39 +2561,39 @@ For revisions in Pull Requests (PR): countdown = 10; } "alt string 3".to_owned() - } }@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,37,38,39,40,41,42⦊ - ) - ); - - some_string = None; - let - a - = - ⦉@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,37,38,39,40,41,42|| @@ -3296,39 +3296,39 @@ For revisions in Pull Requests (PR): countdown = 10; } "alt string 4".to_owned() - } }@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,37,38,39,40,41,42⦊; - println!( - "The string or alt: {}" - , - some_string - . - unwrap_or_else - ( - a - ) - ); - - let - quote_closure - = - countdown = 10; } format!("'{}'", val) - } }@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,37,38,39,40,41,42⦊; - println!( - "Repeated, quoted string: {:?}" - , - std::iter::repeat("repeat me") - .take(5) - .map - ( - quote_closure - ) - .collect::<Vec<_>>() - ); - - let - _unused_closure - = - ⦉@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,37,38,39,40,41,42| @@ -7149,39 +7149,39 @@ For revisions in Pull Requests (PR): countdown = 10; } "closure should be unused".to_owned() - } }@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,37,38,39,40,41,42⦊; - - let mut countdown = 10; - let _short_unused_closure = ⦉@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,37,38,39,40,41,42| _unused_arg: u8 | countdown += 1 let _short_unused_closure = ⦉@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,37,38,39,40,41,42| _unused_arg: u8 | countdown += 1@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,37,38,39,40,41,42⦊; - - // Macros can sometimes confuse the coverage results. Compare this next assignment, with an - // unused closure that invokes the `println!()` macro, with the closure assignment above, that - // does not use a macro. The closure above correctly shows `0` executions. - let _short_unused_closure = ⦉@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,37,38,39,40,41,42| _unused_arg: u8 | println!("not called") let _short_unused_closure = ⦉@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,37,38,39,40,41,42| _unused_arg: u8 | println!("not called")@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,37,38,39,40,41,42⦊; - // The closure assignment above is executed, with a line count of `1`, but the `println!()` - // could not have been called, and yet, there is no indication that it wasn't... - - // ...but adding block braces gives the expected result, showing the block was not executed. - let _short_unused_closure_block = ⦉@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,37,38,39,40,41,42| _unused_arg: u8 | { println!("not called") } let _short_unused_closure_block = ⦉@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,37,38,39,40,41,42| _unused_arg: u8 | { println!("not called") }@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,37,38,39,40,41,42⦊; - - let _shortish_unused_closure = ⦉@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,37,38,39,40,41,42| _unused_arg: u8 | { println!("not called") - } }@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,37,38,39,40,41,42⦊; - - let _as_short_unused_closure = ⦉@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,37,38,39,40,41,42| _unused_arg: u8 - | { println!("not called") } | { println!("not called") }@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,37,38,39,40,41,42⦊; - - let _almost_as_short_unused_closure = ⦉@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,37,38,39,40,41,42| _unused_arg: u8 - | { println!("not called") } | { println!("not called") }@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,37,38,39,40,41,42⦊ - ; -@3⦊countdown > 7⦉@3 { @4,6⦊countdown -= 4; +12:9-12:10: @6[1]: _4 = const main::B">@4,6⦊countdown -= 4; B⦉@4,6 +12:9-12:10: @6[1]: _4 = const main::B"> B⦉@4,6 } else if @5⦊countdown > 2⦉@5 { if @74,87,88⦊should_be_reachable = countdown; println!("reached"); return⦉@74,87,88; }; diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.dead_code/dead_code.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.dead_code/dead_code.main.-------.InstrumentCoverage.0.html index 421fe27825..be06ddd126 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.dead_code/dead_code.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.dead_code/dead_code.main.-------.InstrumentCoverage.0.html @@ -69,65 +69,65 @@ For revisions in Pull Requests (PR): -
    @0,1,2,3⦊fn main() { - // Initialize test constants in a way that cannot be determined at compile time, to ensure - // rustc and LLVM cannot optimize out statements (or coverage counters) downstream from - // dependent conditions. - let is_true = std::env::args().len() == 1; - - let mut countdown = 0; -@0,1,2,3⦊fn unused_fn() { - // Initialize test constants in a way that cannot be determined at compile time, to ensure - // rustc and LLVM cannot optimize out statements (or coverage counters) downstream from - // dependent conditions. - let is_true = std::env::args().len() == 1; - - let mut countdown = 0; -@0,1,2,3⦊pub fn unused_pub_fn_not_in_library() { - // Initialize test constants in a way that cannot be determined at compile time, to ensure - // rustc and LLVM cannot optimize out statements (or coverage counters) downstream from - // dependent conditions. - let is_true = std::env::args().len() == 1; - - let mut countdown = 0; -@0⦊fn main() ⦉@0{ if @0⦊true⦉@0 { - @4⦊@3,5,6,7⦊assert_eq!(1, 1);⦉@3,5,6,7⦉@4 + @4⦊@3⦊assert_eq!(1, 1);⦉@3⦉@4 } else { - @9⦊@8,10,11,12⦊assert_eq!(1, 2);⦉@8,10,11,12⦉@9 + @6⦊@5⦊assert_eq!(1, 2);⦉@5⦉@6 } -}@13⦊‸⦉@13
    +}@7⦊‸⦉@7
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.doctest_crate/doctest_crate.fn_run_in_doctests.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.doctest_crate/doctest_crate.fn_run_in_doctests.-------.InstrumentCoverage.0.html index 02c25cc904..3a41d3482b 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.doctest_crate/doctest_crate.fn_run_in_doctests.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.doctest_crate/doctest_crate.fn_run_in_doctests.-------.InstrumentCoverage.0.html @@ -71,103 +71,43 @@ For revisions in Pull Requests (PR):
    @0⦊pub fn fn_run_in_doctests(conditional: usize) ⦉@0{ match @0⦊conditional⦉@0 { - 1 => @7⦊@6,8,9,10⦊assert_eq!(1, 1)⦉@6,8,9,10⦉@7, // this is run, - 2 => @13⦊@12,14,15,16⦊assert_eq!(1, 1)⦉@12,14,15,16⦉@13, // this, - 3 => @19⦊@18,20,21,22⦊assert_eq!(1, 1)⦉@18,20,21,22⦉@19, // and this too - _ => @24⦊@23,25,26,27⦊assert_eq!(1, 2)⦉@23,25,26,27⦉@24, // however this is not + 1 => @7⦊@6⦊assert_eq!(1, 1)⦉@6⦉@7, // this is run, + 2 => @10⦊@9⦊assert_eq!(1, 1)⦉@9⦉@10, // this, + 3 => @13⦊@12⦊assert_eq!(1, 1)⦉@12⦉@13, // and this too + _ => @15⦊@14⦊assert_eq!(1, 2)⦉@14⦉@15, // however this is not } -}@28⦊‸⦉@28
    +}@16⦊‸⦉@16
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.drop_trait/drop_trait.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.drop_trait/drop_trait.main.-------.InstrumentCoverage.0.html index 3b5d1e2cda..66a6e776a0 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.drop_trait/drop_trait.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.drop_trait/drop_trait.main.-------.InstrumentCoverage.0.html @@ -109,8 +109,8 @@ For revisions in Pull Requests (PR): 20:9-20:43: @1[18]: _15 = &(*_20) 20:9-20:43: @1[19]: _14 = &(*_15) 20:9-20:43: @1[20]: _13 = move _14 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -20:9-20:43: @1.Call: _8 = Arguments::new_v1(move _9, move _13) -> [return: bb3, unwind: bb11] -20:9-20:43: @3.Call: _7 = _print(move _8) -> [return: bb4, unwind: bb11] +20:9-20:43: @1.Call: _8 = std::fmt::Arguments::new_v1(move _9, move _13) -> [return: bb3, unwind: bb11] +20:9-20:43: @3.Call: _7 = std::io::_print(move _8) -> [return: bb4, unwind: bb11] 20:9-20:43: @4[5]: _6 = const () 21:16-21:22: @4[7]: _0 = std::result::Result::<(), u8>::Err(const 1_u8)">@1,3,4,8,9⦊println!("Exiting with error..."); return Err(1)⦉@1,3,4,8,9; } @0,1,2,3⦊fn drop(&mut self) { - println!("BOOM times {}!!!", self.strength); - }⦉@0,1,2,3
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.generics/generics.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.generics/generics.main.-------.InstrumentCoverage.0.html index 0373b38e1b..098c140425 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.generics/generics.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.generics/generics.main.-------.InstrumentCoverage.0.html @@ -178,8 +178,8 @@ For revisions in Pull Requests (PR): 31:9-31:43: @4[18]: _21 = &(*_26) 31:9-31:43: @4[19]: _20 = &(*_21) 31:9-31:43: @4[20]: _19 = move _20 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -31:9-31:43: @4.Call: _14 = Arguments::new_v1(move _15, move _19) -> [return: bb6, unwind: bb14] -31:9-31:43: @6.Call: _13 = _print(move _14) -> [return: bb7, unwind: bb14] +31:9-31:43: @4.Call: _14 = std::fmt::Arguments::new_v1(move _15, move _19) -> [return: bb6, unwind: bb14] +31:9-31:43: @6.Call: _13 = std::io::_print(move _14) -> [return: bb7, unwind: bb14] 31:9-31:43: @7[5]: _12 = const () 32:16-32:22: @7[7]: _0 = std::result::Result::<(), u8>::Err(const 1_u8)">@4,6,7,11,12⦊println!("Exiting with error..."); return Err(1)⦉@4,6,7,11,12; } @0,1,2,3⦊fn drop(&mut self) { - println!("BOOM times {}!!!", self.strength); - }⦉@0,1,2,3
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.if/if.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.if/if.main.-------.InstrumentCoverage.0.html index dd9ba4a190..d6eccf5784 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.if/if.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.if/if.main.-------.InstrumentCoverage.0.html @@ -69,153 +69,153 @@ For revisions in Pull Requests (PR): -
    @0,1,2,3⦊fn main() { - // Initialize test constants in a way that cannot be determined at compile time, to ensure - // rustc and LLVM cannot optimize out statements (or coverage counters) downstream from - // dependent conditions. - let - is_true - = - std::env::args().len() - == - 1 - ; - let - mut - countdown - = - 0 - ; - if -@0,1,2,3⦊fn main() { - // Initialize test constants in a way that cannot be determined at compile time, to ensure - // rustc and LLVM cannot optimize out statements (or coverage counters) downstream from - // dependent conditions. - let is_true = std::env::args().len() == 1; - - let mut countdown = 0; - if - + + +inline.display - Coverage Spans + + + +
    @0,1⦊fn display<T: Display>(xs: &[T]) ⦉@0,1{ + for @6,8,9,10,11⦊x⦉@6,8,9,10,11 in @6,8,9,10,11⦊xs { + print!("{}", x); + }⦉@6,8,9,10,11 + @5,12,13⦊println!(); +}⦉@5,12,13
    + + diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-gt-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.error.-------.InstrumentCoverage.0.html similarity index 62% rename from src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-gt-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html rename to src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.error.-------.InstrumentCoverage.0.html index 2b9a13fe06..bbf19c3e44 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-gt-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.error.-------.InstrumentCoverage.0.html @@ -2,7 +2,7 @@ -partial_eq.{impl#2}-gt-{closure#0}-{closure#0} - Coverage Spans +inline.error - Coverage Spans -
    minor: usize, // Count: 1 - `PartialOrd` compared `minor` values in 3.2.1 vs. 3.3.0 - @0,1,2⦊patch: usize⦉@0,1,2
    +
    @0,1⦊fn error() { + panic!("error"); +}⦉@0,1
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-ge-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.length.-------.InstrumentCoverage.0.html similarity index 62% rename from src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-ge-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html rename to src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.length.-------.InstrumentCoverage.0.html index 47f9ab2bd5..8e8efb6d9f 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-ge-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.length.-------.InstrumentCoverage.0.html @@ -2,7 +2,7 @@ -partial_eq.{impl#2}-ge-{closure#0}-{closure#0} - Coverage Spans +inline.length - Coverage Spans -
    minor: usize, // Count: 1 - `PartialOrd` compared `minor` values in 3.2.1 vs. 3.3.0 - @0,1,2⦊patch: usize⦉@0,1,2
    +
    @0,1⦊fn length<T>(xs: &[T]) -> usize { + xs.len() +}⦉@0,1
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-ge.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.main.-------.InstrumentCoverage.0.html similarity index 54% rename from src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-ge.-------.InstrumentCoverage.0.html rename to src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.main.-------.InstrumentCoverage.0.html index 60a832b2e2..4ec2e9beed 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-ge.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.main.-------.InstrumentCoverage.0.html @@ -2,7 +2,7 @@ -partial_eq.{impl#2}-ge - Coverage Spans +inline.main - Coverage Spans -
    @0,1,2,3,4⦊‸⦉@0,1,2,3,4PartialOrd
    +
    @0,1⦊fn main() { + permutations(&['a', 'b', 'c']); +}⦉@0,1
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.permutate.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.permutate.-------.InstrumentCoverage.0.html new file mode 100644 index 0000000000..fd72973ccd --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.permutate.-------.InstrumentCoverage.0.html @@ -0,0 +1,183 @@ + + + + +inline.permutate - Coverage Spans + + + +
    @0,1⦊fn permutate<T: Copy + Display>(xs: &mut [T], k: usize) { + let n = length(xs); + if k == n⦉@0,1 @2,4⦊{ + display(xs); + }⦉@2,4 else if @3⦊k < n⦉@3 { + for @12,14,15,16,17,18⦊i⦉@12,14,15,16,17,18 in @5,7⦊k..n⦉@5,7 @12,14,15,16,17,18⦊{ + swap(xs, i, k); + permutate(xs, k + 1); + swap(xs, i, k); + }⦉@12,14,15,16,17,18 + } else @6,19⦊{ + error(); + }⦉@6,19 +}@21⦊‸⦉@21
    + + diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.permutations.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.permutations.-------.InstrumentCoverage.0.html new file mode 100644 index 0000000000..4bfd22f3cd --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.permutations.-------.InstrumentCoverage.0.html @@ -0,0 +1,113 @@ + + + + +inline.permutations - Coverage Spans + + + +
    @0,1,2,3,4⦊fn permutations<T: Copy + Display>(xs: &[T]) { + let mut ys = xs.to_owned(); + permutate(&mut ys, 0); +}⦉@0,1,2,3,4
    + + diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.swap.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.swap.-------.InstrumentCoverage.0.html new file mode 100644 index 0000000000..4c3f63093d --- /dev/null +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inline/inline.swap.-------.InstrumentCoverage.0.html @@ -0,0 +1,173 @@ + + + + +inline.swap - Coverage Spans + + + +
    @0,1,2,3,4⦊fn swap<T: Copy>(xs: &mut [T], i: usize, j: usize) { + let t = xs[i]; + xs[i] = xs[j]; + xs[j] = t; +}⦉@0,1,2,3,4
    + + diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main-InTrait-default_trait_func.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main-InTrait-default_trait_func.-------.InstrumentCoverage.0.html index 29548fa112..1dc5bb64e0 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main-InTrait-default_trait_func.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main-InTrait-default_trait_func.-------.InstrumentCoverage.0.html @@ -69,24 +69,24 @@ For revisions in Pull Requests (PR): -
    @0,1,2⦊fn default_trait_func(&mut self) { - in_func(IN_CONST); - self.trait_func(IN_CONST); - }⦉@0,1,2
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main-in_func.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main-in_func.-------.InstrumentCoverage.0.html index 8b5257b02b..82724e5e86 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main-in_func.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main-in_func.-------.InstrumentCoverage.0.html @@ -76,7 +76,7 @@ For revisions in Pull Requests (PR): 20:17-20:22: @0[8]: _6 = CheckedAdd(_4, _5) 20:17-20:22: @1[0]: _3 = move (_6.0: u32) 20:13-20:14: @1[3]: FakeRead(ForLet, _3) -21:18-21:26: @1[9]: _23 = const in_func::promoted[0] +21:18-21:26: @1[9]: _23 = const main::in_func::promoted[0] 21:18-21:26: @1[10]: _11 = &(*_23) 21:18-21:26: @1[11]: _10 = &(*_11) 21:18-21:26: @1[12]: _9 = move _10 as &[&str] (Pointer(Unsize)) @@ -86,13 +86,13 @@ For revisions in Pull Requests (PR): 21:9-21:30: @1[25]: _19 = (_17.0: &u32) 21:9-21:30: @1[28]: _21 = &(*_19) 21:9-21:30: @1[30]: _22 = <u32 as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r u32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -21:9-21:30: @1.Call: _20 = ArgumentV1::new::<u32>(move _21, move _22) -> [return: bb2, unwind: bb5] +21:9-21:30: @1.Call: _20 = std::fmt::ArgumentV1::new::<u32>(move _21, move _22) -> [return: bb2, unwind: bb5] 21:9-21:30: @2[2]: _16 = [move _20] 21:9-21:30: @2[5]: _15 = &_16 21:9-21:30: @2[6]: _14 = &(*_15) 21:9-21:30: @2[7]: _13 = move _14 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -21:9-21:30: @2.Call: _8 = Arguments::new_v1(move _9, move _13) -> [return: bb3, unwind: bb5] -21:9-21:30: @3.Call: _7 = _print(move _8) -> [return: bb4, unwind: bb5] +21:9-21:30: @2.Call: _8 = std::fmt::Arguments::new_v1(move _9, move _13) -> [return: bb3, unwind: bb5] +21:9-21:30: @3.Call: _7 = std::io::_print(move _8) -> [return: bb4, unwind: bb5] 21:9-21:30: @4[6]: _0 = const () 22:6-22:6: @4.Return: return">@0,1,2,3,4⦊fn in_func(a: u32) {
    let b = 1; let c = a + b; println!("c = {}", c) }⦉@0,1,2,3,4
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main-{impl#0}-trait_func.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main-{impl#0}-trait_func.-------.InstrumentCoverage.0.html index ee1e033904..b00a781a0a 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main-{impl#0}-trait_func.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main-{impl#0}-trait_func.-------.InstrumentCoverage.0.html @@ -73,28 +73,28 @@ For revisions in Pull Requests (PR): 41:13-41:41: @0[2]: _4 = CheckedAdd(((*_1).0: u32), _3) 41:13-41:41: @1[0]: ((*_1).0: u32) = move (_4.0: u32) 42:21-42:41: @1[4]: _6 = ((*_1).0: u32) -42:13-42:42: @1.Call: _5 = in_func(move _6) -> [return: bb2, unwind: bb3] +42:13-42:42: @1.Call: _5 = main::in_func(move _6) -> [return: bb2, unwind: bb3] 40:45-43:10: @2[2]: _0 = const () 43:10-43:10: @2.Return: return">@0,1,2⦊fn trait_func(&mut self, incr: u32) { self.in_struct_field += incr; in_func(self.in_struct_field); }⦉@0,1,2
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main.-------.InstrumentCoverage.0.html index d21710b724..4a1003dfbe 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.inner_items/inner_items.main.-------.InstrumentCoverage.0.html @@ -73,33 +73,33 @@ For revisions in Pull Requests (PR): // Initialize test constants in a way that cannot be determined at compile time, to ensure // rustc and LLVM cannot optimize out statements (or coverage counters) downstream from // dependent conditions. - let let @0,1,2,3⦊is_true = std::env::args().len() == 1; - - let mut countdown = 0; - type InType = String; if @6⦊is_true⦉@6 @7,9⦊{ in_func(countdown); }⦉@7,9@8⦊‸⦉@8 - let let @10,11⦊mut val = InStruct { - in_struct_field: 101, - }; - - val.default_trait_func(); -}⦉@10,11
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.lazy_boolean/lazy_boolean.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.lazy_boolean/lazy_boolean.main.-------.InstrumentCoverage.0.html index 0cfe2119fb..358e2e2bbb 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.lazy_boolean/lazy_boolean.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.lazy_boolean/lazy_boolean.main.-------.InstrumentCoverage.0.html @@ -69,9 +69,9 @@ For revisions in Pull Requests (PR): -
    @0,1,2,3⦊fn main() { - // Initialize test constants in a way that cannot be determined at compile time, to ensure - // rustc and LLVM cannot optimize out statements (or coverage counters) downstream from - // dependent conditions. - let is_true = std::env::args().len() == 1; - - let (mut a, mut b, mut c) = (0, 0, 0); -@0,1,2,3⦊fn main() { @@ -102,14 +102,14 @@ For revisions in Pull Requests (PR): 24:5-24:34: @0[23]: FakeRead(ForMatchedPlace, _13) 24:5-24:34: @0[25]: _15 = (_13.0: &DebugTest) 24:5-24:34: @0[28]: _17 = &(*_15) -24:5-24:34: @0[30]: _18 = <DebugTest as Debug>::fmt as for<'r, 's, 't0> fn(&'r DebugTest, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -24:5-24:34: @0.Call: _16 = ArgumentV1::new::<DebugTest>(move _17, move _18) -> [return: bb1, unwind: bb4] +24:5-24:34: @0[30]: _18 = <DebugTest as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r DebugTest, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +24:5-24:34: @0.Call: _16 = std::fmt::ArgumentV1::new::<DebugTest>(move _17, move _18) -> [return: bb1, unwind: bb4] 24:5-24:34: @1[2]: _12 = [move _16] 24:5-24:34: @1[5]: _11 = &_12 24:5-24:34: @1[6]: _10 = &(*_11) 24:5-24:34: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -24:5-24:34: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb4] -24:5-24:34: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb4] +24:5-24:34: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb4] +24:5-24:34: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb4] 24:5-24:34: @3[6]: _2 = const () 22:11-25:2: @3[8]: _0 = const () 25:2-25:2: @3.Return: return"> let debug_test = DebugTest; @@ -124,14 +124,14 @@ For revisions in Pull Requests (PR): 24:5-24:34: @0[23]: FakeRead(ForMatchedPlace, _13) 24:5-24:34: @0[25]: _15 = (_13.0: &DebugTest) 24:5-24:34: @0[28]: _17 = &(*_15) -24:5-24:34: @0[30]: _18 = <DebugTest as Debug>::fmt as for<'r, 's, 't0> fn(&'r DebugTest, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -24:5-24:34: @0.Call: _16 = ArgumentV1::new::<DebugTest>(move _17, move _18) -> [return: bb1, unwind: bb4] +24:5-24:34: @0[30]: _18 = <DebugTest as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r DebugTest, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +24:5-24:34: @0.Call: _16 = std::fmt::ArgumentV1::new::<DebugTest>(move _17, move _18) -> [return: bb1, unwind: bb4] 24:5-24:34: @1[2]: _12 = [move _16] 24:5-24:34: @1[5]: _11 = &_12 24:5-24:34: @1[6]: _10 = &(*_11) 24:5-24:34: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -24:5-24:34: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb4] -24:5-24:34: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb4] +24:5-24:34: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb4] +24:5-24:34: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb4] 24:5-24:34: @3[6]: _2 = const () 22:11-25:2: @3[8]: _0 = const () 25:2-25:2: @3.Return: return"> println!("{:?}", debug_test); @@ -146,14 +146,14 @@ For revisions in Pull Requests (PR): 24:5-24:34: @0[23]: FakeRead(ForMatchedPlace, _13) 24:5-24:34: @0[25]: _15 = (_13.0: &DebugTest) 24:5-24:34: @0[28]: _17 = &(*_15) -24:5-24:34: @0[30]: _18 = <DebugTest as Debug>::fmt as for<'r, 's, 't0> fn(&'r DebugTest, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -24:5-24:34: @0.Call: _16 = ArgumentV1::new::<DebugTest>(move _17, move _18) -> [return: bb1, unwind: bb4] +24:5-24:34: @0[30]: _18 = <DebugTest as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r DebugTest, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +24:5-24:34: @0.Call: _16 = std::fmt::ArgumentV1::new::<DebugTest>(move _17, move _18) -> [return: bb1, unwind: bb4] 24:5-24:34: @1[2]: _12 = [move _16] 24:5-24:34: @1[5]: _11 = &_12 24:5-24:34: @1[6]: _10 = &(*_11) 24:5-24:34: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -24:5-24:34: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb4] -24:5-24:34: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb4] +24:5-24:34: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb4] +24:5-24:34: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb4] 24:5-24:34: @3[6]: _2 = const () 22:11-25:2: @3[8]: _0 = const () 25:2-25:2: @3.Return: return">}⦉@0,1,2,3
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.loops_branches/loops_branches.{impl#0}-fmt.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.loops_branches/loops_branches.{impl#0}-fmt.-------.InstrumentCoverage.0.html index b3f344f7fc..f6f08b6a77 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.loops_branches/loops_branches.{impl#0}-fmt.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.loops_branches/loops_branches.{impl#0}-fmt.-------.InstrumentCoverage.0.html @@ -77,20 +77,20 @@ For revisions in Pull Requests (PR): }⦉@6,8 }@3⦊‸⦉@3 @9,10,11,12⦊write!(f, "error")⦉@9,10,11,12@9,10,11,12⦊write!(f, "error")⦉@9,10,11,12@14,16,17,18⦊?⦉@14,16,17,18; +15:31-15:32: @16.Call: _27 = <std::fmt::Error as std::convert::From<std::fmt::Error>>::from(move _28) -> [return: bb17, unwind: bb21]">@14,16,17,18⦊?⦉@14,16,17,18; } else @2⦊{ }⦉@2 @0,1,2,3⦊fn main() { - // Initialize test constants in a way that cannot be determined at compile time, to ensure - // rustc and LLVM cannot optimize out statements (or coverage counters) downstream from - // dependent conditions. - let is_true = std::env::args().len() == 1; - - let mut a: u8 = 0; - let mut b: u8 = 0; -@0,1,2,3⦊fn main() { - let is_true = std::env::args().len() == 1; -@14,16⦊_⦉@14,16 in @10,11,12⦊0..50⦉@10,11,12 { if @14,16⦊a < 30⦉@14,16 { diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.overflow/overflow.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.overflow/overflow.main.-------.InstrumentCoverage.0.html index ca3515689d..2a9b1b10ef 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.overflow/overflow.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.overflow/overflow.main.-------.InstrumentCoverage.0.html @@ -89,13 +89,13 @@ For revisions in Pull Requests (PR): 20:13-20:44: @8[23]: _23 = (_21.0: &u32) 20:13-20:44: @8[26]: _25 = &(*_23) 20:13-20:44: @8[28]: _26 = <u32 as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r u32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -20:13-20:44: @8.Call: _24 = ArgumentV1::new::<u32>(move _25, move _26) -> [return: bb9, unwind: bb21] +20:13-20:44: @8.Call: _24 = std::fmt::ArgumentV1::new::<u32>(move _25, move _26) -> [return: bb9, unwind: bb21] 20:13-20:44: @9[2]: _20 = [move _24] 20:13-20:44: @9[5]: _19 = &_20 20:13-20:44: @9[6]: _18 = &(*_19) 20:13-20:44: @9[7]: _17 = move _18 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -20:13-20:44: @9.Call: _12 = Arguments::new_v1(move _13, move _17) -> [return: bb10, unwind: bb21] -20:13-20:44: @10.Call: _11 = _print(move _12) -> [return: bb11, unwind: bb21] +20:13-20:44: @9.Call: _12 = std::fmt::Arguments::new_v1(move _13, move _17) -> [return: bb10, unwind: bb21] +20:13-20:44: @10.Call: _11 = std::io::_print(move _12) -> [return: bb11, unwind: bb21] 20:13-20:44: @11[6]: _10 = const () 18:27-21:10: @11[8]: _6 = const ()">@6,8,9,10,11⦊{ let result = might_overflow(10); println!("Result: {}", result); }⦉@6,8,9,10,11 else if @7⦊countdown < 5⦉@7 @12,14,15,16,17⦊{ let result = might_overflow(1); println!("Result: {}", result); }⦉@12,14,15,16,17@13⦊‸⦉@13 @1,3,4⦊{ println!("this will probably overflow"); }⦉@1,3,4@2⦊‸⦉@2 let @5,6,7,8,9,10,11,12,13⦊add_to = u32::MAX - 5; @@ -175,16 +175,16 @@ For revisions in Pull Requests (PR): 9:5-9:56: @6[29]: _34 = (_30.1: &u32) 9:5-9:56: @6[32]: _36 = &(*_33) 9:5-9:56: @6[34]: _37 = <u32 as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r u32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -9:5-9:56: @6.Call: _35 = ArgumentV1::new::<u32>(move _36, move _37) -> [return: bb7, unwind: bb14] +9:5-9:56: @6.Call: _35 = std::fmt::ArgumentV1::new::<u32>(move _36, move _37) -> [return: bb7, unwind: bb14] 9:5-9:56: @7[4]: _39 = &(*_34) 9:5-9:56: @7[6]: _40 = <u32 as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r u32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -9:5-9:56: @7.Call: _38 = ArgumentV1::new::<u32>(move _39, move _40) -> [return: bb8, unwind: bb14] +9:5-9:56: @7.Call: _38 = std::fmt::ArgumentV1::new::<u32>(move _39, move _40) -> [return: bb8, unwind: bb14] 9:5-9:56: @8[2]: _29 = [move _35, move _38] 9:5-9:56: @8[7]: _28 = &_29 9:5-9:56: @8[8]: _27 = &(*_28) 9:5-9:56: @8[9]: _26 = move _27 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -9:5-9:56: @8.Call: _21 = Arguments::new_v1(move _22, move _26) -> [return: bb9, unwind: bb14] -9:5-9:56: @9.Call: _20 = _print(move _21) -> [return: bb10, unwind: bb14] +9:5-9:56: @8.Call: _21 = std::fmt::Arguments::new_v1(move _22, move _26) -> [return: bb9, unwind: bb14] +9:5-9:56: @9.Call: _20 = std::io::_print(move _21) -> [return: bb10, unwind: bb14] 9:5-9:56: @10[6]: _19 = const () 10:18-10:24: @10[10]: _42 = _1 10:27-10:33: @10[12]: _43 = _17 @@ -201,8 +201,8 @@ For revisions in Pull Requests (PR): 11:5-11:49: @11[22]: _54 = &(*_57) 11:5-11:49: @11[23]: _53 = &(*_54) 11:5-11:49: @11[24]: _52 = move _53 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -11:5-11:49: @11.Call: _47 = Arguments::new_v1(move _48, move _52) -> [return: bb12, unwind: bb14] -11:5-11:49: @12.Call: _46 = _print(move _47) -> [return: bb13, unwind: bb14] +11:5-11:49: @11.Call: _47 = std::fmt::Arguments::new_v1(move _48, move _52) -> [return: bb12, unwind: bb14] +11:5-11:49: @12.Call: _46 = std::io::_print(move _47) -> [return: bb13, unwind: bb14] 11:5-11:49: @13[5]: _45 = const () 12:5-12:11: @13[7]: _0 = _41 13:2-13:2: @13.Return: return"> println!("does {} + {} overflow?", add_to, to_add); @@ -221,16 +221,16 @@ For revisions in Pull Requests (PR): 9:5-9:56: @6[29]: _34 = (_30.1: &u32) 9:5-9:56: @6[32]: _36 = &(*_33) 9:5-9:56: @6[34]: _37 = <u32 as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r u32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -9:5-9:56: @6.Call: _35 = ArgumentV1::new::<u32>(move _36, move _37) -> [return: bb7, unwind: bb14] +9:5-9:56: @6.Call: _35 = std::fmt::ArgumentV1::new::<u32>(move _36, move _37) -> [return: bb7, unwind: bb14] 9:5-9:56: @7[4]: _39 = &(*_34) 9:5-9:56: @7[6]: _40 = <u32 as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r u32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -9:5-9:56: @7.Call: _38 = ArgumentV1::new::<u32>(move _39, move _40) -> [return: bb8, unwind: bb14] +9:5-9:56: @7.Call: _38 = std::fmt::ArgumentV1::new::<u32>(move _39, move _40) -> [return: bb8, unwind: bb14] 9:5-9:56: @8[2]: _29 = [move _35, move _38] 9:5-9:56: @8[7]: _28 = &_29 9:5-9:56: @8[8]: _27 = &(*_28) 9:5-9:56: @8[9]: _26 = move _27 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -9:5-9:56: @8.Call: _21 = Arguments::new_v1(move _22, move _26) -> [return: bb9, unwind: bb14] -9:5-9:56: @9.Call: _20 = _print(move _21) -> [return: bb10, unwind: bb14] +9:5-9:56: @8.Call: _21 = std::fmt::Arguments::new_v1(move _22, move _26) -> [return: bb9, unwind: bb14] +9:5-9:56: @9.Call: _20 = std::io::_print(move _21) -> [return: bb10, unwind: bb14] 9:5-9:56: @10[6]: _19 = const () 10:18-10:24: @10[10]: _42 = _1 10:27-10:33: @10[12]: _43 = _17 @@ -247,8 +247,8 @@ For revisions in Pull Requests (PR): 11:5-11:49: @11[22]: _54 = &(*_57) 11:5-11:49: @11[23]: _53 = &(*_54) 11:5-11:49: @11[24]: _52 = move _53 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -11:5-11:49: @11.Call: _47 = Arguments::new_v1(move _48, move _52) -> [return: bb12, unwind: bb14] -11:5-11:49: @12.Call: _46 = _print(move _47) -> [return: bb13, unwind: bb14] +11:5-11:49: @11.Call: _47 = std::fmt::Arguments::new_v1(move _48, move _52) -> [return: bb12, unwind: bb14] +11:5-11:49: @12.Call: _46 = std::io::_print(move _47) -> [return: bb13, unwind: bb14] 11:5-11:49: @13[5]: _45 = const () 12:5-12:11: @13[7]: _0 = _41 13:2-13:2: @13.Return: return"> let result = to_add + add_to; @@ -267,16 +267,16 @@ For revisions in Pull Requests (PR): 9:5-9:56: @6[29]: _34 = (_30.1: &u32) 9:5-9:56: @6[32]: _36 = &(*_33) 9:5-9:56: @6[34]: _37 = <u32 as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r u32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -9:5-9:56: @6.Call: _35 = ArgumentV1::new::<u32>(move _36, move _37) -> [return: bb7, unwind: bb14] +9:5-9:56: @6.Call: _35 = std::fmt::ArgumentV1::new::<u32>(move _36, move _37) -> [return: bb7, unwind: bb14] 9:5-9:56: @7[4]: _39 = &(*_34) 9:5-9:56: @7[6]: _40 = <u32 as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r u32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -9:5-9:56: @7.Call: _38 = ArgumentV1::new::<u32>(move _39, move _40) -> [return: bb8, unwind: bb14] +9:5-9:56: @7.Call: _38 = std::fmt::ArgumentV1::new::<u32>(move _39, move _40) -> [return: bb8, unwind: bb14] 9:5-9:56: @8[2]: _29 = [move _35, move _38] 9:5-9:56: @8[7]: _28 = &_29 9:5-9:56: @8[8]: _27 = &(*_28) 9:5-9:56: @8[9]: _26 = move _27 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -9:5-9:56: @8.Call: _21 = Arguments::new_v1(move _22, move _26) -> [return: bb9, unwind: bb14] -9:5-9:56: @9.Call: _20 = _print(move _21) -> [return: bb10, unwind: bb14] +9:5-9:56: @8.Call: _21 = std::fmt::Arguments::new_v1(move _22, move _26) -> [return: bb9, unwind: bb14] +9:5-9:56: @9.Call: _20 = std::io::_print(move _21) -> [return: bb10, unwind: bb14] 9:5-9:56: @10[6]: _19 = const () 10:18-10:24: @10[10]: _42 = _1 10:27-10:33: @10[12]: _43 = _17 @@ -293,8 +293,8 @@ For revisions in Pull Requests (PR): 11:5-11:49: @11[22]: _54 = &(*_57) 11:5-11:49: @11[23]: _53 = &(*_54) 11:5-11:49: @11[24]: _52 = move _53 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -11:5-11:49: @11.Call: _47 = Arguments::new_v1(move _48, move _52) -> [return: bb12, unwind: bb14] -11:5-11:49: @12.Call: _46 = _print(move _47) -> [return: bb13, unwind: bb14] +11:5-11:49: @11.Call: _47 = std::fmt::Arguments::new_v1(move _48, move _52) -> [return: bb12, unwind: bb14] +11:5-11:49: @12.Call: _46 = std::io::_print(move _47) -> [return: bb13, unwind: bb14] 11:5-11:49: @13[5]: _45 = const () 12:5-12:11: @13[7]: _0 = _41 13:2-13:2: @13.Return: return"> println!("continuing after overflow check"); @@ -313,16 +313,16 @@ For revisions in Pull Requests (PR): 9:5-9:56: @6[29]: _34 = (_30.1: &u32) 9:5-9:56: @6[32]: _36 = &(*_33) 9:5-9:56: @6[34]: _37 = <u32 as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r u32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -9:5-9:56: @6.Call: _35 = ArgumentV1::new::<u32>(move _36, move _37) -> [return: bb7, unwind: bb14] +9:5-9:56: @6.Call: _35 = std::fmt::ArgumentV1::new::<u32>(move _36, move _37) -> [return: bb7, unwind: bb14] 9:5-9:56: @7[4]: _39 = &(*_34) 9:5-9:56: @7[6]: _40 = <u32 as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r u32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -9:5-9:56: @7.Call: _38 = ArgumentV1::new::<u32>(move _39, move _40) -> [return: bb8, unwind: bb14] +9:5-9:56: @7.Call: _38 = std::fmt::ArgumentV1::new::<u32>(move _39, move _40) -> [return: bb8, unwind: bb14] 9:5-9:56: @8[2]: _29 = [move _35, move _38] 9:5-9:56: @8[7]: _28 = &_29 9:5-9:56: @8[8]: _27 = &(*_28) 9:5-9:56: @8[9]: _26 = move _27 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -9:5-9:56: @8.Call: _21 = Arguments::new_v1(move _22, move _26) -> [return: bb9, unwind: bb14] -9:5-9:56: @9.Call: _20 = _print(move _21) -> [return: bb10, unwind: bb14] +9:5-9:56: @8.Call: _21 = std::fmt::Arguments::new_v1(move _22, move _26) -> [return: bb9, unwind: bb14] +9:5-9:56: @9.Call: _20 = std::io::_print(move _21) -> [return: bb10, unwind: bb14] 9:5-9:56: @10[6]: _19 = const () 10:18-10:24: @10[10]: _42 = _1 10:27-10:33: @10[12]: _43 = _17 @@ -339,8 +339,8 @@ For revisions in Pull Requests (PR): 11:5-11:49: @11[22]: _54 = &(*_57) 11:5-11:49: @11[23]: _53 = &(*_54) 11:5-11:49: @11[24]: _52 = move _53 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -11:5-11:49: @11.Call: _47 = Arguments::new_v1(move _48, move _52) -> [return: bb12, unwind: bb14] -11:5-11:49: @12.Call: _46 = _print(move _47) -> [return: bb13, unwind: bb14] +11:5-11:49: @11.Call: _47 = std::fmt::Arguments::new_v1(move _48, move _52) -> [return: bb12, unwind: bb14] +11:5-11:49: @12.Call: _46 = std::io::_print(move _47) -> [return: bb13, unwind: bb14] 11:5-11:49: @13[5]: _45 = const () 12:5-12:11: @13[7]: _0 = _41 13:2-13:2: @13.Return: return"> result @@ -359,16 +359,16 @@ For revisions in Pull Requests (PR): 9:5-9:56: @6[29]: _34 = (_30.1: &u32) 9:5-9:56: @6[32]: _36 = &(*_33) 9:5-9:56: @6[34]: _37 = <u32 as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r u32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -9:5-9:56: @6.Call: _35 = ArgumentV1::new::<u32>(move _36, move _37) -> [return: bb7, unwind: bb14] +9:5-9:56: @6.Call: _35 = std::fmt::ArgumentV1::new::<u32>(move _36, move _37) -> [return: bb7, unwind: bb14] 9:5-9:56: @7[4]: _39 = &(*_34) 9:5-9:56: @7[6]: _40 = <u32 as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r u32, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -9:5-9:56: @7.Call: _38 = ArgumentV1::new::<u32>(move _39, move _40) -> [return: bb8, unwind: bb14] +9:5-9:56: @7.Call: _38 = std::fmt::ArgumentV1::new::<u32>(move _39, move _40) -> [return: bb8, unwind: bb14] 9:5-9:56: @8[2]: _29 = [move _35, move _38] 9:5-9:56: @8[7]: _28 = &_29 9:5-9:56: @8[8]: _27 = &(*_28) 9:5-9:56: @8[9]: _26 = move _27 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -9:5-9:56: @8.Call: _21 = Arguments::new_v1(move _22, move _26) -> [return: bb9, unwind: bb14] -9:5-9:56: @9.Call: _20 = _print(move _21) -> [return: bb10, unwind: bb14] +9:5-9:56: @8.Call: _21 = std::fmt::Arguments::new_v1(move _22, move _26) -> [return: bb9, unwind: bb14] +9:5-9:56: @9.Call: _20 = std::io::_print(move _21) -> [return: bb10, unwind: bb14] 9:5-9:56: @10[6]: _19 = const () 10:18-10:24: @10[10]: _42 = _1 10:27-10:33: @10[12]: _43 = _17 @@ -385,8 +385,8 @@ For revisions in Pull Requests (PR): 11:5-11:49: @11[22]: _54 = &(*_57) 11:5-11:49: @11[23]: _53 = &(*_54) 11:5-11:49: @11[24]: _52 = move _53 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -11:5-11:49: @11.Call: _47 = Arguments::new_v1(move _48, move _52) -> [return: bb12, unwind: bb14] -11:5-11:49: @12.Call: _46 = _print(move _47) -> [return: bb13, unwind: bb14] +11:5-11:49: @11.Call: _47 = std::fmt::Arguments::new_v1(move _48, move _52) -> [return: bb12, unwind: bb14] +11:5-11:49: @12.Call: _46 = std::io::_print(move _47) -> [return: bb13, unwind: bb14] 11:5-11:49: @13[5]: _45 = const () 12:5-12:11: @13[7]: _0 = _41 13:2-13:2: @13.Return: return">}⦉@5,6,7,8,9,10,11,12,13
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.panic_unwind/panic_unwind.might_panic.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.panic_unwind/panic_unwind.might_panic.-------.InstrumentCoverage.0.html index 86d9875b47..32988629ba 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.panic_unwind/panic_unwind.might_panic.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.panic_unwind/panic_unwind.might_panic.-------.InstrumentCoverage.0.html @@ -81,10 +81,10 @@ For revisions in Pull Requests (PR): 6:9-6:34: @1[18]: _13 = &(*_32) 6:9-6:34: @1[19]: _12 = &(*_13) 6:9-6:34: @1[20]: _11 = move _12 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -6:9-6:34: @1.Call: _6 = Arguments::new_v1(move _7, move _11) -> [return: bb3, unwind: bb7] -6:9-6:34: @3.Call: _5 = _print(move _6) -> [return: bb4, unwind: bb7] +6:9-6:34: @1.Call: _6 = std::fmt::Arguments::new_v1(move _7, move _11) -> [return: bb3, unwind: bb7] +6:9-6:34: @3.Call: _5 = std::io::_print(move _6) -> [return: bb4, unwind: bb7] 6:9-6:34: @4[5]: _4 = const () -7:9-7:26: @4.Call: begin_panic::<&str>(const "panics") -> bb7">@1,3,4⦊println!("panicking..."); +7:9-7:26: @4.Call: std::rt::begin_panic::<&str>(const "panics") -> bb7">@1,3,4⦊println!("panicking..."); panic!("panics");⦉@1,3,4 +7:9-7:26: @4.Call: std::rt::begin_panic::<&str>(const "panics") -> bb7"> panic!("panics");⦉@1,3,4 } else @2,5,6⦊{ @@ -124,8 +124,8 @@ For revisions in Pull Requests (PR): 9:9-9:33: @2[18]: _27 = &(*_30) 9:9-9:33: @2[19]: _26 = &(*_27) 9:9-9:33: @2[20]: _25 = move _26 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -9:9-9:33: @2.Call: _20 = Arguments::new_v1(move _21, move _25) -> [return: bb5, unwind: bb7] -9:9-9:33: @5.Call: _19 = _print(move _20) -> [return: bb6, unwind: bb7] +9:9-9:33: @2.Call: _20 = std::fmt::Arguments::new_v1(move _21, move _25) -> [return: bb5, unwind: bb7] +9:9-9:33: @5.Call: _19 = std::io::_print(move _20) -> [return: bb6, unwind: bb7] 9:9-9:33: @6[5]: _18 = const () 8:12-10:6: @6[7]: _0 = const () 11:2-11:2: @6.Return: return"> println!("Don't Panic"); @@ -139,8 +139,8 @@ For revisions in Pull Requests (PR): 9:9-9:33: @2[18]: _27 = &(*_30) 9:9-9:33: @2[19]: _26 = &(*_27) 9:9-9:33: @2[20]: _25 = move _26 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -9:9-9:33: @2.Call: _20 = Arguments::new_v1(move _21, move _25) -> [return: bb5, unwind: bb7] -9:9-9:33: @5.Call: _19 = _print(move _20) -> [return: bb6, unwind: bb7] +9:9-9:33: @2.Call: _20 = std::fmt::Arguments::new_v1(move _21, move _25) -> [return: bb5, unwind: bb7] +9:9-9:33: @5.Call: _19 = std::io::_print(move _20) -> [return: bb6, unwind: bb7] 9:9-9:33: @6[5]: _18 = const () 8:12-10:6: @6[7]: _0 = const () 11:2-11:2: @6.Return: return"> } @@ -154,8 +154,8 @@ For revisions in Pull Requests (PR): 9:9-9:33: @2[18]: _27 = &(*_30) 9:9-9:33: @2[19]: _26 = &(*_27) 9:9-9:33: @2[20]: _25 = move _26 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -9:9-9:33: @2.Call: _20 = Arguments::new_v1(move _21, move _25) -> [return: bb5, unwind: bb7] -9:9-9:33: @5.Call: _19 = _print(move _20) -> [return: bb6, unwind: bb7] +9:9-9:33: @2.Call: _20 = std::fmt::Arguments::new_v1(move _21, move _25) -> [return: bb5, unwind: bb7] +9:9-9:33: @5.Call: _19 = std::io::_print(move _20) -> [return: bb6, unwind: bb7] 9:9-9:33: @6[5]: _18 = const () 8:12-10:6: @6[7]: _0 = const () 11:2-11:2: @6.Return: return">}⦉@2,5,6
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.main.-------.InstrumentCoverage.0.html index 6d9d63decc..3e307c4f46 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.main.-------.InstrumentCoverage.0.html @@ -81,7 +81,7 @@ For revisions in Pull Requests (PR): 25:49-25:62: @2[20]: _16 = &_2 25:64-25:77: @2[24]: _19 = &_1 25:80-25:93: @2[26]: _20 = &_2 -25:64-25:93: @2.Call: _18 = <Version as PartialOrd>::lt(move _19, move _20) -> [return: bb3, unwind: bb9] +25:64-25:93: @2.Call: _18 = <Version as std::cmp::PartialOrd>::lt(move _19, move _20) -> [return: bb3, unwind: bb9] 25:64-25:93: @3[2]: _17 = &_18 25:5-25:95: @3[3]: _14 = (move _15, move _16, move _17) 25:5-25:95: @3[7]: FakeRead(ForMatchedPlace, _14) @@ -89,20 +89,20 @@ For revisions in Pull Requests (PR): 25:5-25:95: @3[11]: _22 = (_14.1: &Version) 25:5-25:95: @3[13]: _23 = (_14.2: &bool) 25:5-25:95: @3[16]: _25 = &(*_21) -25:5-25:95: @3[18]: _26 = <Version as Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @3.Call: _24 = ArgumentV1::new::<Version>(move _25, move _26) -> [return: bb4, unwind: bb9] +25:5-25:95: @3[18]: _26 = <Version as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +25:5-25:95: @3.Call: _24 = std::fmt::ArgumentV1::new::<Version>(move _25, move _26) -> [return: bb4, unwind: bb9] 25:5-25:95: @4[4]: _28 = &(*_22) -25:5-25:95: @4[6]: _29 = <Version as Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @4.Call: _27 = ArgumentV1::new::<Version>(move _28, move _29) -> [return: bb5, unwind: bb9] +25:5-25:95: @4[6]: _29 = <Version as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +25:5-25:95: @4.Call: _27 = std::fmt::ArgumentV1::new::<Version>(move _28, move _29) -> [return: bb5, unwind: bb9] 25:5-25:95: @5[4]: _31 = &(*_23) 25:5-25:95: @5[6]: _32 = <bool as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r bool, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @5.Call: _30 = ArgumentV1::new::<bool>(move _31, move _32) -> [return: bb6, unwind: bb9] +25:5-25:95: @5.Call: _30 = std::fmt::ArgumentV1::new::<bool>(move _31, move _32) -> [return: bb6, unwind: bb9] 25:5-25:95: @6[2]: _13 = [move _24, move _27, move _30] 25:5-25:95: @6[9]: _12 = &_13 25:5-25:95: @6[10]: _11 = &(*_12) 25:5-25:95: @6[11]: _10 = move _11 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -25:5-25:95: @6.Call: _5 = Arguments::new_v1(move _6, move _10) -> [return: bb7, unwind: bb9] -25:5-25:95: @7.Call: _4 = _print(move _5) -> [return: bb8, unwind: bb9] +25:5-25:95: @6.Call: _5 = std::fmt::Arguments::new_v1(move _6, move _10) -> [return: bb7, unwind: bb9] +25:5-25:95: @7.Call: _4 = std::io::_print(move _5) -> [return: bb8, unwind: bb9] 25:5-25:95: @8[7]: _3 = const () 21:11-26:2: @8[9]: _0 = const () 26:2-26:2: @8.Return: return">@0,1,2,3,4,5,6,7,8⦊fn main() { @@ -118,7 +118,7 @@ For revisions in Pull Requests (PR): 25:49-25:62: @2[20]: _16 = &_2 25:64-25:77: @2[24]: _19 = &_1 25:80-25:93: @2[26]: _20 = &_2 -25:64-25:93: @2.Call: _18 = <Version as PartialOrd>::lt(move _19, move _20) -> [return: bb3, unwind: bb9] +25:64-25:93: @2.Call: _18 = <Version as std::cmp::PartialOrd>::lt(move _19, move _20) -> [return: bb3, unwind: bb9] 25:64-25:93: @3[2]: _17 = &_18 25:5-25:95: @3[3]: _14 = (move _15, move _16, move _17) 25:5-25:95: @3[7]: FakeRead(ForMatchedPlace, _14) @@ -126,20 +126,20 @@ For revisions in Pull Requests (PR): 25:5-25:95: @3[11]: _22 = (_14.1: &Version) 25:5-25:95: @3[13]: _23 = (_14.2: &bool) 25:5-25:95: @3[16]: _25 = &(*_21) -25:5-25:95: @3[18]: _26 = <Version as Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @3.Call: _24 = ArgumentV1::new::<Version>(move _25, move _26) -> [return: bb4, unwind: bb9] +25:5-25:95: @3[18]: _26 = <Version as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +25:5-25:95: @3.Call: _24 = std::fmt::ArgumentV1::new::<Version>(move _25, move _26) -> [return: bb4, unwind: bb9] 25:5-25:95: @4[4]: _28 = &(*_22) -25:5-25:95: @4[6]: _29 = <Version as Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @4.Call: _27 = ArgumentV1::new::<Version>(move _28, move _29) -> [return: bb5, unwind: bb9] +25:5-25:95: @4[6]: _29 = <Version as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +25:5-25:95: @4.Call: _27 = std::fmt::ArgumentV1::new::<Version>(move _28, move _29) -> [return: bb5, unwind: bb9] 25:5-25:95: @5[4]: _31 = &(*_23) 25:5-25:95: @5[6]: _32 = <bool as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r bool, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @5.Call: _30 = ArgumentV1::new::<bool>(move _31, move _32) -> [return: bb6, unwind: bb9] +25:5-25:95: @5.Call: _30 = std::fmt::ArgumentV1::new::<bool>(move _31, move _32) -> [return: bb6, unwind: bb9] 25:5-25:95: @6[2]: _13 = [move _24, move _27, move _30] 25:5-25:95: @6[9]: _12 = &_13 25:5-25:95: @6[10]: _11 = &(*_12) 25:5-25:95: @6[11]: _10 = move _11 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -25:5-25:95: @6.Call: _5 = Arguments::new_v1(move _6, move _10) -> [return: bb7, unwind: bb9] -25:5-25:95: @7.Call: _4 = _print(move _5) -> [return: bb8, unwind: bb9] +25:5-25:95: @6.Call: _5 = std::fmt::Arguments::new_v1(move _6, move _10) -> [return: bb7, unwind: bb9] +25:5-25:95: @7.Call: _4 = std::io::_print(move _5) -> [return: bb8, unwind: bb9] 25:5-25:95: @8[7]: _3 = const () 21:11-26:2: @8[9]: _0 = const () 26:2-26:2: @8.Return: return"> let version_3_2_1 = Version::new(3, 2, 1); @@ -155,7 +155,7 @@ For revisions in Pull Requests (PR): 25:49-25:62: @2[20]: _16 = &_2 25:64-25:77: @2[24]: _19 = &_1 25:80-25:93: @2[26]: _20 = &_2 -25:64-25:93: @2.Call: _18 = <Version as PartialOrd>::lt(move _19, move _20) -> [return: bb3, unwind: bb9] +25:64-25:93: @2.Call: _18 = <Version as std::cmp::PartialOrd>::lt(move _19, move _20) -> [return: bb3, unwind: bb9] 25:64-25:93: @3[2]: _17 = &_18 25:5-25:95: @3[3]: _14 = (move _15, move _16, move _17) 25:5-25:95: @3[7]: FakeRead(ForMatchedPlace, _14) @@ -163,20 +163,20 @@ For revisions in Pull Requests (PR): 25:5-25:95: @3[11]: _22 = (_14.1: &Version) 25:5-25:95: @3[13]: _23 = (_14.2: &bool) 25:5-25:95: @3[16]: _25 = &(*_21) -25:5-25:95: @3[18]: _26 = <Version as Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @3.Call: _24 = ArgumentV1::new::<Version>(move _25, move _26) -> [return: bb4, unwind: bb9] +25:5-25:95: @3[18]: _26 = <Version as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +25:5-25:95: @3.Call: _24 = std::fmt::ArgumentV1::new::<Version>(move _25, move _26) -> [return: bb4, unwind: bb9] 25:5-25:95: @4[4]: _28 = &(*_22) -25:5-25:95: @4[6]: _29 = <Version as Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @4.Call: _27 = ArgumentV1::new::<Version>(move _28, move _29) -> [return: bb5, unwind: bb9] +25:5-25:95: @4[6]: _29 = <Version as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +25:5-25:95: @4.Call: _27 = std::fmt::ArgumentV1::new::<Version>(move _28, move _29) -> [return: bb5, unwind: bb9] 25:5-25:95: @5[4]: _31 = &(*_23) 25:5-25:95: @5[6]: _32 = <bool as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r bool, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @5.Call: _30 = ArgumentV1::new::<bool>(move _31, move _32) -> [return: bb6, unwind: bb9] +25:5-25:95: @5.Call: _30 = std::fmt::ArgumentV1::new::<bool>(move _31, move _32) -> [return: bb6, unwind: bb9] 25:5-25:95: @6[2]: _13 = [move _24, move _27, move _30] 25:5-25:95: @6[9]: _12 = &_13 25:5-25:95: @6[10]: _11 = &(*_12) 25:5-25:95: @6[11]: _10 = move _11 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -25:5-25:95: @6.Call: _5 = Arguments::new_v1(move _6, move _10) -> [return: bb7, unwind: bb9] -25:5-25:95: @7.Call: _4 = _print(move _5) -> [return: bb8, unwind: bb9] +25:5-25:95: @6.Call: _5 = std::fmt::Arguments::new_v1(move _6, move _10) -> [return: bb7, unwind: bb9] +25:5-25:95: @7.Call: _4 = std::io::_print(move _5) -> [return: bb8, unwind: bb9] 25:5-25:95: @8[7]: _3 = const () 21:11-26:2: @8[9]: _0 = const () 26:2-26:2: @8.Return: return"> let version_3_3_0 = Version::new(3, 3, 0); @@ -192,7 +192,7 @@ For revisions in Pull Requests (PR): 25:49-25:62: @2[20]: _16 = &_2 25:64-25:77: @2[24]: _19 = &_1 25:80-25:93: @2[26]: _20 = &_2 -25:64-25:93: @2.Call: _18 = <Version as PartialOrd>::lt(move _19, move _20) -> [return: bb3, unwind: bb9] +25:64-25:93: @2.Call: _18 = <Version as std::cmp::PartialOrd>::lt(move _19, move _20) -> [return: bb3, unwind: bb9] 25:64-25:93: @3[2]: _17 = &_18 25:5-25:95: @3[3]: _14 = (move _15, move _16, move _17) 25:5-25:95: @3[7]: FakeRead(ForMatchedPlace, _14) @@ -200,20 +200,20 @@ For revisions in Pull Requests (PR): 25:5-25:95: @3[11]: _22 = (_14.1: &Version) 25:5-25:95: @3[13]: _23 = (_14.2: &bool) 25:5-25:95: @3[16]: _25 = &(*_21) -25:5-25:95: @3[18]: _26 = <Version as Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @3.Call: _24 = ArgumentV1::new::<Version>(move _25, move _26) -> [return: bb4, unwind: bb9] +25:5-25:95: @3[18]: _26 = <Version as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +25:5-25:95: @3.Call: _24 = std::fmt::ArgumentV1::new::<Version>(move _25, move _26) -> [return: bb4, unwind: bb9] 25:5-25:95: @4[4]: _28 = &(*_22) -25:5-25:95: @4[6]: _29 = <Version as Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @4.Call: _27 = ArgumentV1::new::<Version>(move _28, move _29) -> [return: bb5, unwind: bb9] +25:5-25:95: @4[6]: _29 = <Version as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +25:5-25:95: @4.Call: _27 = std::fmt::ArgumentV1::new::<Version>(move _28, move _29) -> [return: bb5, unwind: bb9] 25:5-25:95: @5[4]: _31 = &(*_23) 25:5-25:95: @5[6]: _32 = <bool as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r bool, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @5.Call: _30 = ArgumentV1::new::<bool>(move _31, move _32) -> [return: bb6, unwind: bb9] +25:5-25:95: @5.Call: _30 = std::fmt::ArgumentV1::new::<bool>(move _31, move _32) -> [return: bb6, unwind: bb9] 25:5-25:95: @6[2]: _13 = [move _24, move _27, move _30] 25:5-25:95: @6[9]: _12 = &_13 25:5-25:95: @6[10]: _11 = &(*_12) 25:5-25:95: @6[11]: _10 = move _11 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -25:5-25:95: @6.Call: _5 = Arguments::new_v1(move _6, move _10) -> [return: bb7, unwind: bb9] -25:5-25:95: @7.Call: _4 = _print(move _5) -> [return: bb8, unwind: bb9] +25:5-25:95: @6.Call: _5 = std::fmt::Arguments::new_v1(move _6, move _10) -> [return: bb7, unwind: bb9] +25:5-25:95: @7.Call: _4 = std::io::_print(move _5) -> [return: bb8, unwind: bb9] 25:5-25:95: @8[7]: _3 = const () 21:11-26:2: @8[9]: _0 = const () 26:2-26:2: @8.Return: return"> @@ -229,7 +229,7 @@ For revisions in Pull Requests (PR): 25:49-25:62: @2[20]: _16 = &_2 25:64-25:77: @2[24]: _19 = &_1 25:80-25:93: @2[26]: _20 = &_2 -25:64-25:93: @2.Call: _18 = <Version as PartialOrd>::lt(move _19, move _20) -> [return: bb3, unwind: bb9] +25:64-25:93: @2.Call: _18 = <Version as std::cmp::PartialOrd>::lt(move _19, move _20) -> [return: bb3, unwind: bb9] 25:64-25:93: @3[2]: _17 = &_18 25:5-25:95: @3[3]: _14 = (move _15, move _16, move _17) 25:5-25:95: @3[7]: FakeRead(ForMatchedPlace, _14) @@ -237,20 +237,20 @@ For revisions in Pull Requests (PR): 25:5-25:95: @3[11]: _22 = (_14.1: &Version) 25:5-25:95: @3[13]: _23 = (_14.2: &bool) 25:5-25:95: @3[16]: _25 = &(*_21) -25:5-25:95: @3[18]: _26 = <Version as Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @3.Call: _24 = ArgumentV1::new::<Version>(move _25, move _26) -> [return: bb4, unwind: bb9] +25:5-25:95: @3[18]: _26 = <Version as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +25:5-25:95: @3.Call: _24 = std::fmt::ArgumentV1::new::<Version>(move _25, move _26) -> [return: bb4, unwind: bb9] 25:5-25:95: @4[4]: _28 = &(*_22) -25:5-25:95: @4[6]: _29 = <Version as Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @4.Call: _27 = ArgumentV1::new::<Version>(move _28, move _29) -> [return: bb5, unwind: bb9] +25:5-25:95: @4[6]: _29 = <Version as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +25:5-25:95: @4.Call: _27 = std::fmt::ArgumentV1::new::<Version>(move _28, move _29) -> [return: bb5, unwind: bb9] 25:5-25:95: @5[4]: _31 = &(*_23) 25:5-25:95: @5[6]: _32 = <bool as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r bool, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @5.Call: _30 = ArgumentV1::new::<bool>(move _31, move _32) -> [return: bb6, unwind: bb9] +25:5-25:95: @5.Call: _30 = std::fmt::ArgumentV1::new::<bool>(move _31, move _32) -> [return: bb6, unwind: bb9] 25:5-25:95: @6[2]: _13 = [move _24, move _27, move _30] 25:5-25:95: @6[9]: _12 = &_13 25:5-25:95: @6[10]: _11 = &(*_12) 25:5-25:95: @6[11]: _10 = move _11 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -25:5-25:95: @6.Call: _5 = Arguments::new_v1(move _6, move _10) -> [return: bb7, unwind: bb9] -25:5-25:95: @7.Call: _4 = _print(move _5) -> [return: bb8, unwind: bb9] +25:5-25:95: @6.Call: _5 = std::fmt::Arguments::new_v1(move _6, move _10) -> [return: bb7, unwind: bb9] +25:5-25:95: @7.Call: _4 = std::io::_print(move _5) -> [return: bb8, unwind: bb9] 25:5-25:95: @8[7]: _3 = const () 21:11-26:2: @8[9]: _0 = const () 26:2-26:2: @8.Return: return"> println!("{:?} < {:?} = {}", version_3_2_1, version_3_3_0, version_3_2_1 < version_3_3_0); @@ -266,7 +266,7 @@ For revisions in Pull Requests (PR): 25:49-25:62: @2[20]: _16 = &_2 25:64-25:77: @2[24]: _19 = &_1 25:80-25:93: @2[26]: _20 = &_2 -25:64-25:93: @2.Call: _18 = <Version as PartialOrd>::lt(move _19, move _20) -> [return: bb3, unwind: bb9] +25:64-25:93: @2.Call: _18 = <Version as std::cmp::PartialOrd>::lt(move _19, move _20) -> [return: bb3, unwind: bb9] 25:64-25:93: @3[2]: _17 = &_18 25:5-25:95: @3[3]: _14 = (move _15, move _16, move _17) 25:5-25:95: @3[7]: FakeRead(ForMatchedPlace, _14) @@ -274,20 +274,20 @@ For revisions in Pull Requests (PR): 25:5-25:95: @3[11]: _22 = (_14.1: &Version) 25:5-25:95: @3[13]: _23 = (_14.2: &bool) 25:5-25:95: @3[16]: _25 = &(*_21) -25:5-25:95: @3[18]: _26 = <Version as Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @3.Call: _24 = ArgumentV1::new::<Version>(move _25, move _26) -> [return: bb4, unwind: bb9] +25:5-25:95: @3[18]: _26 = <Version as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +25:5-25:95: @3.Call: _24 = std::fmt::ArgumentV1::new::<Version>(move _25, move _26) -> [return: bb4, unwind: bb9] 25:5-25:95: @4[4]: _28 = &(*_22) -25:5-25:95: @4[6]: _29 = <Version as Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @4.Call: _27 = ArgumentV1::new::<Version>(move _28, move _29) -> [return: bb5, unwind: bb9] +25:5-25:95: @4[6]: _29 = <Version as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r Version, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +25:5-25:95: @4.Call: _27 = std::fmt::ArgumentV1::new::<Version>(move _28, move _29) -> [return: bb5, unwind: bb9] 25:5-25:95: @5[4]: _31 = &(*_23) 25:5-25:95: @5[6]: _32 = <bool as std::fmt::Display>::fmt as for<'r, 's, 't0> fn(&'r bool, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -25:5-25:95: @5.Call: _30 = ArgumentV1::new::<bool>(move _31, move _32) -> [return: bb6, unwind: bb9] +25:5-25:95: @5.Call: _30 = std::fmt::ArgumentV1::new::<bool>(move _31, move _32) -> [return: bb6, unwind: bb9] 25:5-25:95: @6[2]: _13 = [move _24, move _27, move _30] 25:5-25:95: @6[9]: _12 = &_13 25:5-25:95: @6[10]: _11 = &(*_12) 25:5-25:95: @6[11]: _10 = move _11 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -25:5-25:95: @6.Call: _5 = Arguments::new_v1(move _6, move _10) -> [return: bb7, unwind: bb9] -25:5-25:95: @7.Call: _4 = _print(move _5) -> [return: bb8, unwind: bb9] +25:5-25:95: @6.Call: _5 = std::fmt::Arguments::new_v1(move _6, move _10) -> [return: bb7, unwind: bb9] +25:5-25:95: @7.Call: _4 = std::io::_print(move _5) -> [return: bb8, unwind: bb9] 25:5-25:95: @8[7]: _3 = const () 21:11-26:2: @8[9]: _0 = const () 26:2-26:2: @8.Return: return">}⦉@0,1,2,3,4,5,6,7,8
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-ge-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-ge-{closure#0}.-------.InstrumentCoverage.0.html deleted file mode 100644 index 9f0c29c50b..0000000000 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-ge-{closure#0}.-------.InstrumentCoverage.0.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - -partial_eq.{impl#2}-ge-{closure#0} - Coverage Spans - - - -
    major: usize, - @0,1,2,3⦊‸⦉@0,1,2,3minor: usize
    - - diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-gt-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-gt-{closure#0}.-------.InstrumentCoverage.0.html deleted file mode 100644 index ff7e783dd6..0000000000 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-gt-{closure#0}.-------.InstrumentCoverage.0.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - -partial_eq.{impl#2}-gt-{closure#0} - Coverage Spans - - - -
    major: usize, - @0,1,2,3⦊‸⦉@0,1,2,3minor: usize
    - - diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-gt.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-gt.-------.InstrumentCoverage.0.html deleted file mode 100644 index f6b9dc9776..0000000000 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-gt.-------.InstrumentCoverage.0.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - -partial_eq.{impl#2}-gt - Coverage Spans - - - -
    @0,1,2,3,4⦊‸⦉@0,1,2,3,4PartialOrd
    - - diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-le-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-le-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html deleted file mode 100644 index 5c95a635f0..0000000000 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-le-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - -partial_eq.{impl#2}-le-{closure#0}-{closure#0} - Coverage Spans - - - -
    minor: usize, // Count: 1 - `PartialOrd` compared `minor` values in 3.2.1 vs. 3.3.0 - @0,1,2⦊patch: usize⦉@0,1,2
    - - diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-le-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-le-{closure#0}.-------.InstrumentCoverage.0.html deleted file mode 100644 index 6eb894a166..0000000000 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-le-{closure#0}.-------.InstrumentCoverage.0.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - -partial_eq.{impl#2}-le-{closure#0} - Coverage Spans - - - -
    major: usize, - @0,1,2,3⦊‸⦉@0,1,2,3minor: usize
    - - diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-le.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-le.-------.InstrumentCoverage.0.html deleted file mode 100644 index fb7e520faf..0000000000 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-le.-------.InstrumentCoverage.0.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - -partial_eq.{impl#2}-le - Coverage Spans - - - -
    @0,1,2,3,4⦊‸⦉@0,1,2,3,4PartialOrd
    - - diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-lt-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-lt-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html deleted file mode 100644 index b2b3e172d5..0000000000 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-lt-{closure#0}-{closure#0}.-------.InstrumentCoverage.0.html +++ /dev/null @@ -1,82 +0,0 @@ - - - - -partial_eq.{impl#2}-lt-{closure#0}-{closure#0} - Coverage Spans - - - -
    minor: usize, // Count: 1 - `PartialOrd` compared `minor` values in 3.2.1 vs. 3.3.0 - @0,1,2⦊patch: usize⦉@0,1,2
    - - diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-lt-{closure#0}.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-lt-{closure#0}.-------.InstrumentCoverage.0.html deleted file mode 100644 index e54849345b..0000000000 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-lt-{closure#0}.-------.InstrumentCoverage.0.html +++ /dev/null @@ -1,83 +0,0 @@ - - - - -partial_eq.{impl#2}-lt-{closure#0} - Coverage Spans - - - -
    major: usize, - @0,1,2,3⦊‸⦉@0,1,2,3minor: usize
    - - diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-lt.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-lt.-------.InstrumentCoverage.0.html deleted file mode 100644 index f111ad0045..0000000000 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#2}-lt.-------.InstrumentCoverage.0.html +++ /dev/null @@ -1,92 +0,0 @@ - - - - -partial_eq.{impl#2}-lt - Coverage Spans - - - -
    @0,1,2,3,4⦊‸⦉@0,1,2,3,4PartialOrd
    - - diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#7}-fmt.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#7}-fmt.-------.InstrumentCoverage.0.html index 94c77025ec..930492f248 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#7}-fmt.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#7}-fmt.-------.InstrumentCoverage.0.html @@ -73,41 +73,38 @@ For revisions in Pull Requests (PR): 4:17-4:22: @0[2]: _3 = &((*_1).0: usize) 4:17-4:22: @0[4]: _4 = &((*_1).1: usize) 4:17-4:22: @0[6]: _5 = &((*_1).2: usize) -4:17-4:22: @0[9]: _7 = &mut (*_2) -4:17-4:22: @0[12]: _9 = const "Version" -4:17-4:22: @0[13]: _8 = &(*_9) -4:17-4:22: @0.Call: _6 = Formatter::debug_struct(move _7, move _8) -> [return: bb1, unwind: bb6] -4:17-4:22: @1[2]: FakeRead(ForLet, _6) -4:17-4:22: @1[7]: _12 = &mut _6 -4:17-4:22: @1[8]: _11 = &mut (*_12) -4:17-4:22: @1[11]: _14 = const "major" -4:17-4:22: @1[12]: _13 = &(*_14) -4:17-4:22: @1[17]: _18 = &(*_3) -4:17-4:22: @1[18]: _17 = &_18 -4:17-4:22: @1[19]: _16 = &(*_17) -4:17-4:22: @1[20]: _15 = move _16 as &dyn std::fmt::Debug (Pointer(Unsize)) -4:17-4:22: @1.Call: _10 = DebugStruct::field(move _11, move _13, move _15) -> [return: bb2, unwind: bb6] -4:17-4:22: @2[11]: _21 = &mut _6 -4:17-4:22: @2[12]: _20 = &mut (*_21) -4:17-4:22: @2[15]: _23 = const "minor" -4:17-4:22: @2[16]: _22 = &(*_23) -4:17-4:22: @2[21]: _27 = &(*_4) -4:17-4:22: @2[22]: _26 = &_27 -4:17-4:22: @2[23]: _25 = &(*_26) -4:17-4:22: @2[24]: _24 = move _25 as &dyn std::fmt::Debug (Pointer(Unsize)) -4:17-4:22: @2.Call: _19 = DebugStruct::field(move _20, move _22, move _24) -> [return: bb3, unwind: bb6] -4:17-4:22: @3[11]: _30 = &mut _6 -4:17-4:22: @3[12]: _29 = &mut (*_30) -4:17-4:22: @3[15]: _32 = const "patch" -4:17-4:22: @3[16]: _31 = &(*_32) -4:17-4:22: @3[21]: _36 = &(*_5) -4:17-4:22: @3[22]: _35 = &_36 -4:17-4:22: @3[23]: _34 = &(*_35) -4:17-4:22: @3[24]: _33 = move _34 as &dyn std::fmt::Debug (Pointer(Unsize)) -4:17-4:22: @3.Call: _28 = DebugStruct::field(move _29, move _31, move _33) -> [return: bb4, unwind: bb6] -4:17-4:22: @4[10]: _38 = &mut _6 -4:17-4:22: @4[11]: _37 = &mut (*_38) -4:17-4:22: @4.Call: _0 = DebugStruct::finish(move _37) -> [return: bb5, unwind: bb6] +4:17-4:22: @0[10]: _8 = &mut (*_2) +4:17-4:22: @0[13]: _10 = const "Version" +4:17-4:22: @0[14]: _9 = &(*_10) +4:17-4:22: @0.Call: _7 = std::fmt::Formatter::debug_struct(move _8, move _9) -> [return: bb1, unwind: bb6] +4:17-4:22: @1[2]: _6 = &mut _7 +4:17-4:22: @1[3]: FakeRead(ForLet, _6) +4:17-4:22: @1[7]: _12 = &mut (*_6) +4:17-4:22: @1[10]: _14 = const "major" +4:17-4:22: @1[11]: _13 = &(*_14) +4:17-4:22: @1[16]: _18 = &(*_3) +4:17-4:22: @1[17]: _17 = &_18 +4:17-4:22: @1[18]: _16 = &(*_17) +4:17-4:22: @1[19]: _15 = move _16 as &dyn std::fmt::Debug (Pointer(Unsize)) +4:17-4:22: @1.Call: _11 = std::fmt::DebugStruct::field(move _12, move _13, move _15) -> [return: bb2, unwind: bb6] +4:17-4:22: @2[9]: _20 = &mut (*_6) +4:17-4:22: @2[12]: _22 = const "minor" +4:17-4:22: @2[13]: _21 = &(*_22) +4:17-4:22: @2[18]: _26 = &(*_4) +4:17-4:22: @2[19]: _25 = &_26 +4:17-4:22: @2[20]: _24 = &(*_25) +4:17-4:22: @2[21]: _23 = move _24 as &dyn std::fmt::Debug (Pointer(Unsize)) +4:17-4:22: @2.Call: _19 = std::fmt::DebugStruct::field(move _20, move _21, move _23) -> [return: bb3, unwind: bb6] +4:17-4:22: @3[9]: _28 = &mut (*_6) +4:17-4:22: @3[12]: _30 = const "patch" +4:17-4:22: @3[13]: _29 = &(*_30) +4:17-4:22: @3[18]: _34 = &(*_5) +4:17-4:22: @3[19]: _33 = &_34 +4:17-4:22: @3[20]: _32 = &(*_33) +4:17-4:22: @3[21]: _31 = move _32 as &dyn std::fmt::Debug (Pointer(Unsize)) +4:17-4:22: @3.Call: _27 = std::fmt::DebugStruct::field(move _28, move _29, move _31) -> [return: bb4, unwind: bb6] +4:17-4:22: @4[8]: _35 = &mut (*_6) +4:17-4:22: @4.Call: _0 = std::fmt::DebugStruct::finish(move _35) -> [return: bb5, unwind: bb6] 4:22-4:22: @5.Return: return">@0,1,2,3,4,5⦊Debug⦉@0,1,2,3,4,5
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#8}-clone.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#8}-clone.-------.InstrumentCoverage.0.html index 27a2ab7182..f1c9839334 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#8}-clone.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.partial_eq/partial_eq.{impl#8}-clone.-------.InstrumentCoverage.0.html @@ -75,13 +75,13 @@ For revisions in Pull Requests (PR): 4:10-4:15: @0[6]: _4 = &((*_1).2: usize) 4:10-4:15: @0[10]: _7 = &(*_2) 4:10-4:15: @0[11]: _6 = &(*_7) -4:10-4:15: @0.Call: _5 = <usize as Clone>::clone(move _6) -> [return: bb1, unwind: bb4] +4:10-4:15: @0.Call: _5 = <usize as std::clone::Clone>::clone(move _6) -> [return: bb1, unwind: bb4] 4:10-4:15: @1[4]: _10 = &(*_3) 4:10-4:15: @1[5]: _9 = &(*_10) -4:10-4:15: @1.Call: _8 = <usize as Clone>::clone(move _9) -> [return: bb2, unwind: bb4] +4:10-4:15: @1.Call: _8 = <usize as std::clone::Clone>::clone(move _9) -> [return: bb2, unwind: bb4] 4:10-4:15: @2[4]: _13 = &(*_4) 4:10-4:15: @2[5]: _12 = &(*_13) -4:10-4:15: @2.Call: _11 = <usize as Clone>::clone(move _12) -> [return: bb3, unwind: bb4] +4:10-4:15: @2.Call: _11 = <usize as std::clone::Clone>::clone(move _12) -> [return: bb3, unwind: bb4] 4:10-4:15: @3[1]: _0 = Version { major: move _5, minor: move _8, patch: move _11 } 4:15-4:15: @3.Return: return">@0,1,2,3⦊Clone⦉@0,1,2,3
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.simple_loop/simple_loop.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.simple_loop/simple_loop.main.-------.InstrumentCoverage.0.html index f528b698d4..6b911eea34 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.simple_loop/simple_loop.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.simple_loop/simple_loop.main.-------.InstrumentCoverage.0.html @@ -69,81 +69,81 @@ For revisions in Pull Requests (PR): -
    @0,1,2,3⦊fn main() { - // Initialize test constants in a way that cannot be determined at compile time, to ensure - // rustc and LLVM cannot optimize out statements (or coverage counters) downstream from - // dependent conditions. - let is_true = std::env::args().len() == 1; - - let mut countdown = 0; - - if -@0,1,2,3⦊fn main() { - // Initialize test constants in a way that cannot be determined at compile time, to ensure - // rustc and LLVM cannot optimize out statements (or coverage counters) downstream from - // dependent conditions. - let is_true = std::env::args().len() == 1; - - let mut countdown = 1; - in @8,9,10⦊0..2⦉@8,9,10 { let z diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.try_error_result/try_error_result.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.try_error_result/try_error_result.main.-------.InstrumentCoverage.0.html index 41404759c3..5b0c5cb072 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.try_error_result/try_error_result.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.try_error_result/try_error_result.main.-------.InstrumentCoverage.0.html @@ -84,7 +84,7 @@ For revisions in Pull Requests (PR): in @2,3,4⦊0..10⦉@2,3,4 { { @10,12,13⦊call(/*return_error=*/ true)⦉@10,12,13@15,17,18,19⦊?⦉@15,17,18,19; +27:41-27:42: @17.Call: _26 = <() as std::convert::From<()>>::from(move _27) -> [return: bb18, unwind: bb39]">@15,17,18,19⦊?⦉@15,17,18,19; @14,20,21⦊call(/*return_error=*/ false)⦉@14,20,21@23,25,26,27⦊?⦉@23,25,26,27; +28:42-28:43: @25.Call: _35 = <() as std::convert::From<()>>::from(move _36) -> [return: bb26, unwind: bb39]">@23,25,26,27⦊?⦉@23,25,26,27; } else { @11,28,29⦊call(/*return_error=*/ false)⦉@11,28,29@31,33,34,35⦊?⦉@31,33,34,35; +32:42-32:43: @33.Call: _44 = <() as std::convert::From<()>>::from(move _45) -> [return: bb34, unwind: bb39]">@31,33,34,35⦊?⦉@31,33,34,35; } } @0,1,2,3⦊pub fn unused_function() { - let is_true = std::env::args().len() == 1; - let mut countdown = 2; -@0,1,2,3,4⦊pub fn unused_generic_function<T: Debug>(arg: T) { @@ -98,14 +98,14 @@ For revisions in Pull Requests (PR): 34:5-34:56: @0[20]: FakeRead(ForMatchedPlace, _13) 34:5-34:56: @0[22]: _15 = (_13.0: &T) 34:5-34:56: @0[25]: _17 = &(*_15) -34:5-34:56: @0[27]: _18 = <T as Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -34:5-34:56: @0.Call: _16 = ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] +34:5-34:56: @0[27]: _18 = <T as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +34:5-34:56: @0.Call: _16 = std::fmt::ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] 34:5-34:56: @1[2]: _12 = [move _16] 34:5-34:56: @1[5]: _11 = &_12 34:5-34:56: @1[6]: _10 = &(*_11) 34:5-34:56: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -34:5-34:56: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] -34:5-34:56: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb5] +34:5-34:56: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] +34:5-34:56: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb5] 34:5-34:56: @3[6]: _2 = const () 33:50-35:2: @3[8]: _0 = const () 35:2-35:2: @4.Return: return"> println!("unused_generic_function with {:?}", arg); @@ -118,14 +118,14 @@ For revisions in Pull Requests (PR): 34:5-34:56: @0[20]: FakeRead(ForMatchedPlace, _13) 34:5-34:56: @0[22]: _15 = (_13.0: &T) 34:5-34:56: @0[25]: _17 = &(*_15) -34:5-34:56: @0[27]: _18 = <T as Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -34:5-34:56: @0.Call: _16 = ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] +34:5-34:56: @0[27]: _18 = <T as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +34:5-34:56: @0.Call: _16 = std::fmt::ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] 34:5-34:56: @1[2]: _12 = [move _16] 34:5-34:56: @1[5]: _11 = &_12 34:5-34:56: @1[6]: _10 = &(*_11) 34:5-34:56: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -34:5-34:56: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] -34:5-34:56: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb5] +34:5-34:56: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] +34:5-34:56: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb5] 34:5-34:56: @3[6]: _2 = const () 33:50-35:2: @3[8]: _0 = const () 35:2-35:2: @4.Return: return">}⦉@0,1,2,3,4
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.unused_private_function.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.unused_private_function.-------.InstrumentCoverage.0.html index 6424e03fc7..78228594e3 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.unused_private_function.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.unused_private_function.-------.InstrumentCoverage.0.html @@ -69,36 +69,36 @@ For revisions in Pull Requests (PR): -
    @0,1,2,3⦊fn unused_private_function() { - let is_true = std::env::args().len() == 1; - let mut countdown = 2; -@0,1,2,3,4,5,6,7,8⦊fn use_this_lib_crate() { @@ -88,10 +88,10 @@ For revisions in Pull Requests (PR): 58:20-58:36: @2[6]: (*_6) = [const 5_i32, const 6_i32, const 7_i32, const 8_i32] 58:20-58:36: @2[7]: _5 = move _6 58:20-58:36: @2[8]: _4 = move _5 as std::boxed::Box<[i32]> (Pointer(Unsize)) -58:20-58:36: @4.Call: _3 = slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] +58:20-58:36: @4.Call: _3 = std::slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] 58:9-58:17: @5[1]: FakeRead(ForLet, _3) 59:52-59:60: @5[4]: _8 = move _3 -59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] +59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<std::vec::Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] 60:5-60:91: @6.Call: _9 = used_only_from_this_lib_crate_generic_function::<&str>(const "used ONLY from library used_crate.rs") -> [return: bb7, unwind: bb10] 53:25-61:2: @7[1]: _0 = const () 61:2-61:2: @8.Return: return"> used_from_bin_crate_and_lib_crate_generic_function("used from library used_crate.rs"); @@ -101,10 +101,10 @@ For revisions in Pull Requests (PR): 58:20-58:36: @2[6]: (*_6) = [const 5_i32, const 6_i32, const 7_i32, const 8_i32] 58:20-58:36: @2[7]: _5 = move _6 58:20-58:36: @2[8]: _4 = move _5 as std::boxed::Box<[i32]> (Pointer(Unsize)) -58:20-58:36: @4.Call: _3 = slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] +58:20-58:36: @4.Call: _3 = std::slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] 58:9-58:17: @5[1]: FakeRead(ForLet, _3) 59:52-59:60: @5[4]: _8 = move _3 -59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] +59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<std::vec::Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] 60:5-60:91: @6.Call: _9 = used_only_from_this_lib_crate_generic_function::<&str>(const "used ONLY from library used_crate.rs") -> [return: bb7, unwind: bb10] 53:25-61:2: @7[1]: _0 = const () 61:2-61:2: @8.Return: return"> used_with_same_type_from_bin_crate_and_lib_crate_generic_function( @@ -114,10 +114,10 @@ For revisions in Pull Requests (PR): 58:20-58:36: @2[6]: (*_6) = [const 5_i32, const 6_i32, const 7_i32, const 8_i32] 58:20-58:36: @2[7]: _5 = move _6 58:20-58:36: @2[8]: _4 = move _5 as std::boxed::Box<[i32]> (Pointer(Unsize)) -58:20-58:36: @4.Call: _3 = slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] +58:20-58:36: @4.Call: _3 = std::slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] 58:9-58:17: @5[1]: FakeRead(ForLet, _3) 59:52-59:60: @5[4]: _8 = move _3 -59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] +59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<std::vec::Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] 60:5-60:91: @6.Call: _9 = used_only_from_this_lib_crate_generic_function::<&str>(const "used ONLY from library used_crate.rs") -> [return: bb7, unwind: bb10] 53:25-61:2: @7[1]: _0 = const () 61:2-61:2: @8.Return: return"> "used from library used_crate.rs", @@ -127,10 +127,10 @@ For revisions in Pull Requests (PR): 58:20-58:36: @2[6]: (*_6) = [const 5_i32, const 6_i32, const 7_i32, const 8_i32] 58:20-58:36: @2[7]: _5 = move _6 58:20-58:36: @2[8]: _4 = move _5 as std::boxed::Box<[i32]> (Pointer(Unsize)) -58:20-58:36: @4.Call: _3 = slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] +58:20-58:36: @4.Call: _3 = std::slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] 58:9-58:17: @5[1]: FakeRead(ForLet, _3) 59:52-59:60: @5[4]: _8 = move _3 -59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] +59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<std::vec::Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] 60:5-60:91: @6.Call: _9 = used_only_from_this_lib_crate_generic_function::<&str>(const "used ONLY from library used_crate.rs") -> [return: bb7, unwind: bb10] 53:25-61:2: @7[1]: _0 = const () 61:2-61:2: @8.Return: return"> ); @@ -140,10 +140,10 @@ For revisions in Pull Requests (PR): 58:20-58:36: @2[6]: (*_6) = [const 5_i32, const 6_i32, const 7_i32, const 8_i32] 58:20-58:36: @2[7]: _5 = move _6 58:20-58:36: @2[8]: _4 = move _5 as std::boxed::Box<[i32]> (Pointer(Unsize)) -58:20-58:36: @4.Call: _3 = slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] +58:20-58:36: @4.Call: _3 = std::slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] 58:9-58:17: @5[1]: FakeRead(ForLet, _3) 59:52-59:60: @5[4]: _8 = move _3 -59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] +59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<std::vec::Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] 60:5-60:91: @6.Call: _9 = used_only_from_this_lib_crate_generic_function::<&str>(const "used ONLY from library used_crate.rs") -> [return: bb7, unwind: bb10] 53:25-61:2: @7[1]: _0 = const () 61:2-61:2: @8.Return: return"> let some_vec = vec![5, 6, 7, 8]; @@ -153,10 +153,10 @@ For revisions in Pull Requests (PR): 58:20-58:36: @2[6]: (*_6) = [const 5_i32, const 6_i32, const 7_i32, const 8_i32] 58:20-58:36: @2[7]: _5 = move _6 58:20-58:36: @2[8]: _4 = move _5 as std::boxed::Box<[i32]> (Pointer(Unsize)) -58:20-58:36: @4.Call: _3 = slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] +58:20-58:36: @4.Call: _3 = std::slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] 58:9-58:17: @5[1]: FakeRead(ForLet, _3) 59:52-59:60: @5[4]: _8 = move _3 -59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] +59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<std::vec::Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] 60:5-60:91: @6.Call: _9 = used_only_from_this_lib_crate_generic_function::<&str>(const "used ONLY from library used_crate.rs") -> [return: bb7, unwind: bb10] 53:25-61:2: @7[1]: _0 = const () 61:2-61:2: @8.Return: return"> used_only_from_this_lib_crate_generic_function(some_vec); @@ -166,10 +166,10 @@ For revisions in Pull Requests (PR): 58:20-58:36: @2[6]: (*_6) = [const 5_i32, const 6_i32, const 7_i32, const 8_i32] 58:20-58:36: @2[7]: _5 = move _6 58:20-58:36: @2[8]: _4 = move _5 as std::boxed::Box<[i32]> (Pointer(Unsize)) -58:20-58:36: @4.Call: _3 = slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] +58:20-58:36: @4.Call: _3 = std::slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] 58:9-58:17: @5[1]: FakeRead(ForLet, _3) 59:52-59:60: @5[4]: _8 = move _3 -59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] +59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<std::vec::Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] 60:5-60:91: @6.Call: _9 = used_only_from_this_lib_crate_generic_function::<&str>(const "used ONLY from library used_crate.rs") -> [return: bb7, unwind: bb10] 53:25-61:2: @7[1]: _0 = const () 61:2-61:2: @8.Return: return"> used_only_from_this_lib_crate_generic_function("used ONLY from library used_crate.rs"); @@ -179,10 +179,10 @@ For revisions in Pull Requests (PR): 58:20-58:36: @2[6]: (*_6) = [const 5_i32, const 6_i32, const 7_i32, const 8_i32] 58:20-58:36: @2[7]: _5 = move _6 58:20-58:36: @2[8]: _4 = move _5 as std::boxed::Box<[i32]> (Pointer(Unsize)) -58:20-58:36: @4.Call: _3 = slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] +58:20-58:36: @4.Call: _3 = std::slice::<impl [i32]>::into_vec::<std::alloc::Global>(move _4) -> [return: bb5, unwind: bb12] 58:9-58:17: @5[1]: FakeRead(ForLet, _3) 59:52-59:60: @5[4]: _8 = move _3 -59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] +59:5-59:61: @5.Call: _7 = used_only_from_this_lib_crate_generic_function::<std::vec::Vec<i32>>(move _8) -> [return: bb6, unwind: bb9] 60:5-60:91: @6.Call: _9 = used_only_from_this_lib_crate_generic_function::<&str>(const "used ONLY from library used_crate.rs") -> [return: bb7, unwind: bb10] 53:25-61:2: @7[1]: _0 = const () 61:2-61:2: @8.Return: return">}⦉@0,1,2,3,4,5,6,7,8
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_from_bin_crate_and_lib_crate_generic_function.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_from_bin_crate_and_lib_crate_generic_function.-------.InstrumentCoverage.0.html index 8b994a6962..61a709c472 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_from_bin_crate_and_lib_crate_generic_function.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_from_bin_crate_and_lib_crate_generic_function.-------.InstrumentCoverage.0.html @@ -78,14 +78,14 @@ For revisions in Pull Requests (PR): 26:5-26:83: @0[20]: FakeRead(ForMatchedPlace, _13) 26:5-26:83: @0[22]: _15 = (_13.0: &T) 26:5-26:83: @0[25]: _17 = &(*_15) -26:5-26:83: @0[27]: _18 = <T as Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -26:5-26:83: @0.Call: _16 = ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] +26:5-26:83: @0[27]: _18 = <T as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +26:5-26:83: @0.Call: _16 = std::fmt::ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] 26:5-26:83: @1[2]: _12 = [move _16] 26:5-26:83: @1[5]: _11 = &_12 26:5-26:83: @1[6]: _10 = &(*_11) 26:5-26:83: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -26:5-26:83: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] -26:5-26:83: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb5] +26:5-26:83: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] +26:5-26:83: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb5] 26:5-26:83: @3[6]: _2 = const () 25:77-27:2: @3[8]: _0 = const () 27:2-27:2: @4.Return: return">@0,1,2,3,4⦊pub fn used_from_bin_crate_and_lib_crate_generic_function<T: Debug>(arg: T) { @@ -98,14 +98,14 @@ For revisions in Pull Requests (PR): 26:5-26:83: @0[20]: FakeRead(ForMatchedPlace, _13) 26:5-26:83: @0[22]: _15 = (_13.0: &T) 26:5-26:83: @0[25]: _17 = &(*_15) -26:5-26:83: @0[27]: _18 = <T as Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -26:5-26:83: @0.Call: _16 = ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] +26:5-26:83: @0[27]: _18 = <T as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +26:5-26:83: @0.Call: _16 = std::fmt::ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] 26:5-26:83: @1[2]: _12 = [move _16] 26:5-26:83: @1[5]: _11 = &_12 26:5-26:83: @1[6]: _10 = &(*_11) 26:5-26:83: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -26:5-26:83: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] -26:5-26:83: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb5] +26:5-26:83: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] +26:5-26:83: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb5] 26:5-26:83: @3[6]: _2 = const () 25:77-27:2: @3[8]: _0 = const () 27:2-27:2: @4.Return: return"> println!("used_from_bin_crate_and_lib_crate_generic_function with {:?}", arg); @@ -118,14 +118,14 @@ For revisions in Pull Requests (PR): 26:5-26:83: @0[20]: FakeRead(ForMatchedPlace, _13) 26:5-26:83: @0[22]: _15 = (_13.0: &T) 26:5-26:83: @0[25]: _17 = &(*_15) -26:5-26:83: @0[27]: _18 = <T as Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -26:5-26:83: @0.Call: _16 = ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] +26:5-26:83: @0[27]: _18 = <T as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +26:5-26:83: @0.Call: _16 = std::fmt::ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] 26:5-26:83: @1[2]: _12 = [move _16] 26:5-26:83: @1[5]: _11 = &_12 26:5-26:83: @1[6]: _10 = &(*_11) 26:5-26:83: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -26:5-26:83: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] -26:5-26:83: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb5] +26:5-26:83: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] +26:5-26:83: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb5] 26:5-26:83: @3[6]: _2 = const () 25:77-27:2: @3[8]: _0 = const () 27:2-27:2: @4.Return: return">}⦉@0,1,2,3,4
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_function.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_function.-------.InstrumentCoverage.0.html index d35f191b64..974a24b2c6 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_function.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_function.-------.InstrumentCoverage.0.html @@ -73,25 +73,25 @@ For revisions in Pull Requests (PR): // Initialize test constants in a way that cannot be determined at compile time, to ensure // rustc and LLVM cannot optimize out statements (or coverage counters) downstream from // dependent conditions. - let let @0,1,2,3⦊is_true = std::env::args().len() == 1; - let mut countdown = 0; -@0,1,2,3,4⦊pub fn used_only_from_bin_crate_generic_function<T: Debug>(arg: T) { @@ -98,14 +98,14 @@ For revisions in Pull Requests (PR): 18:5-18:74: @0[20]: FakeRead(ForMatchedPlace, _13) 18:5-18:74: @0[22]: _15 = (_13.0: &T) 18:5-18:74: @0[25]: _17 = &(*_15) -18:5-18:74: @0[27]: _18 = <T as Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -18:5-18:74: @0.Call: _16 = ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] +18:5-18:74: @0[27]: _18 = <T as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +18:5-18:74: @0.Call: _16 = std::fmt::ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] 18:5-18:74: @1[2]: _12 = [move _16] 18:5-18:74: @1[5]: _11 = &_12 18:5-18:74: @1[6]: _10 = &(*_11) 18:5-18:74: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -18:5-18:74: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] -18:5-18:74: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb5] +18:5-18:74: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] +18:5-18:74: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb5] 18:5-18:74: @3[6]: _2 = const () 17:68-19:2: @3[8]: _0 = const () 19:2-19:2: @4.Return: return"> println!("used_only_from_bin_crate_generic_function with {:?}", arg); @@ -118,14 +118,14 @@ For revisions in Pull Requests (PR): 18:5-18:74: @0[20]: FakeRead(ForMatchedPlace, _13) 18:5-18:74: @0[22]: _15 = (_13.0: &T) 18:5-18:74: @0[25]: _17 = &(*_15) -18:5-18:74: @0[27]: _18 = <T as Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -18:5-18:74: @0.Call: _16 = ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] +18:5-18:74: @0[27]: _18 = <T as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +18:5-18:74: @0.Call: _16 = std::fmt::ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] 18:5-18:74: @1[2]: _12 = [move _16] 18:5-18:74: @1[5]: _11 = &_12 18:5-18:74: @1[6]: _10 = &(*_11) 18:5-18:74: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -18:5-18:74: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] -18:5-18:74: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb5] +18:5-18:74: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] +18:5-18:74: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb5] 18:5-18:74: @3[6]: _2 = const () 17:68-19:2: @3[8]: _0 = const () 19:2-19:2: @4.Return: return">}⦉@0,1,2,3,4
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_only_from_this_lib_crate_generic_function.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_only_from_this_lib_crate_generic_function.-------.InstrumentCoverage.0.html index 76bc057dd0..63944eb9ab 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_only_from_this_lib_crate_generic_function.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_only_from_this_lib_crate_generic_function.-------.InstrumentCoverage.0.html @@ -78,14 +78,14 @@ For revisions in Pull Requests (PR): 22:5-22:79: @0[20]: FakeRead(ForMatchedPlace, _13) 22:5-22:79: @0[22]: _15 = (_13.0: &T) 22:5-22:79: @0[25]: _17 = &(*_15) -22:5-22:79: @0[27]: _18 = <T as Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -22:5-22:79: @0.Call: _16 = ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] +22:5-22:79: @0[27]: _18 = <T as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +22:5-22:79: @0.Call: _16 = std::fmt::ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] 22:5-22:79: @1[2]: _12 = [move _16] 22:5-22:79: @1[5]: _11 = &_12 22:5-22:79: @1[6]: _10 = &(*_11) 22:5-22:79: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -22:5-22:79: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] -22:5-22:79: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb5] +22:5-22:79: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] +22:5-22:79: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb5] 22:5-22:79: @3[6]: _2 = const () 21:73-23:2: @3[8]: _0 = const () 23:2-23:2: @4.Return: return">@0,1,2,3,4⦊pub fn used_only_from_this_lib_crate_generic_function<T: Debug>(arg: T) { @@ -98,14 +98,14 @@ For revisions in Pull Requests (PR): 22:5-22:79: @0[20]: FakeRead(ForMatchedPlace, _13) 22:5-22:79: @0[22]: _15 = (_13.0: &T) 22:5-22:79: @0[25]: _17 = &(*_15) -22:5-22:79: @0[27]: _18 = <T as Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -22:5-22:79: @0.Call: _16 = ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] +22:5-22:79: @0[27]: _18 = <T as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +22:5-22:79: @0.Call: _16 = std::fmt::ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] 22:5-22:79: @1[2]: _12 = [move _16] 22:5-22:79: @1[5]: _11 = &_12 22:5-22:79: @1[6]: _10 = &(*_11) 22:5-22:79: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -22:5-22:79: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] -22:5-22:79: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb5] +22:5-22:79: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] +22:5-22:79: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb5] 22:5-22:79: @3[6]: _2 = const () 21:73-23:2: @3[8]: _0 = const () 23:2-23:2: @4.Return: return"> println!("used_only_from_this_lib_crate_generic_function with {:?}", arg); @@ -118,14 +118,14 @@ For revisions in Pull Requests (PR): 22:5-22:79: @0[20]: FakeRead(ForMatchedPlace, _13) 22:5-22:79: @0[22]: _15 = (_13.0: &T) 22:5-22:79: @0[25]: _17 = &(*_15) -22:5-22:79: @0[27]: _18 = <T as Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -22:5-22:79: @0.Call: _16 = ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] +22:5-22:79: @0[27]: _18 = <T as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +22:5-22:79: @0.Call: _16 = std::fmt::ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] 22:5-22:79: @1[2]: _12 = [move _16] 22:5-22:79: @1[5]: _11 = &_12 22:5-22:79: @1[6]: _10 = &(*_11) 22:5-22:79: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -22:5-22:79: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] -22:5-22:79: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb5] +22:5-22:79: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] +22:5-22:79: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb5] 22:5-22:79: @3[6]: _2 = const () 21:73-23:2: @3[8]: _0 = const () 23:2-23:2: @4.Return: return">}⦉@0,1,2,3,4
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_with_same_type_from_bin_crate_and_lib_crate_generic_function.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_with_same_type_from_bin_crate_and_lib_crate_generic_function.-------.InstrumentCoverage.0.html index a2f4b7e19e..b146180fbd 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_with_same_type_from_bin_crate_and_lib_crate_generic_function.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.used_crate/used_crate.used_with_same_type_from_bin_crate_and_lib_crate_generic_function.-------.InstrumentCoverage.0.html @@ -78,14 +78,14 @@ For revisions in Pull Requests (PR): 30:5-30:98: @0[20]: FakeRead(ForMatchedPlace, _13) 30:5-30:98: @0[22]: _15 = (_13.0: &T) 30:5-30:98: @0[25]: _17 = &(*_15) -30:5-30:98: @0[27]: _18 = <T as Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -30:5-30:98: @0.Call: _16 = ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] +30:5-30:98: @0[27]: _18 = <T as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +30:5-30:98: @0.Call: _16 = std::fmt::ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] 30:5-30:98: @1[2]: _12 = [move _16] 30:5-30:98: @1[5]: _11 = &_12 30:5-30:98: @1[6]: _10 = &(*_11) 30:5-30:98: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -30:5-30:98: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] -30:5-30:98: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb5] +30:5-30:98: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] +30:5-30:98: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb5] 30:5-30:98: @3[6]: _2 = const () 29:92-31:2: @3[8]: _0 = const () 31:2-31:2: @4.Return: return">@0,1,2,3,4⦊pub fn used_with_same_type_from_bin_crate_and_lib_crate_generic_function<T: Debug>(arg: T) { @@ -98,14 +98,14 @@ For revisions in Pull Requests (PR): 30:5-30:98: @0[20]: FakeRead(ForMatchedPlace, _13) 30:5-30:98: @0[22]: _15 = (_13.0: &T) 30:5-30:98: @0[25]: _17 = &(*_15) -30:5-30:98: @0[27]: _18 = <T as Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -30:5-30:98: @0.Call: _16 = ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] +30:5-30:98: @0[27]: _18 = <T as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +30:5-30:98: @0.Call: _16 = std::fmt::ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] 30:5-30:98: @1[2]: _12 = [move _16] 30:5-30:98: @1[5]: _11 = &_12 30:5-30:98: @1[6]: _10 = &(*_11) 30:5-30:98: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -30:5-30:98: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] -30:5-30:98: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb5] +30:5-30:98: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] +30:5-30:98: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb5] 30:5-30:98: @3[6]: _2 = const () 29:92-31:2: @3[8]: _0 = const () 31:2-31:2: @4.Return: return"> println!("used_with_same_type_from_bin_crate_and_lib_crate_generic_function with {:?}", arg); @@ -118,14 +118,14 @@ For revisions in Pull Requests (PR): 30:5-30:98: @0[20]: FakeRead(ForMatchedPlace, _13) 30:5-30:98: @0[22]: _15 = (_13.0: &T) 30:5-30:98: @0[25]: _17 = &(*_15) -30:5-30:98: @0[27]: _18 = <T as Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) -30:5-30:98: @0.Call: _16 = ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] +30:5-30:98: @0[27]: _18 = <T as std::fmt::Debug>::fmt as for<'r, 's, 't0> fn(&'r T, &'s mut std::fmt::Formatter<'t0>) -> std::result::Result<(), std::fmt::Error> (Pointer(ReifyFnPointer)) +30:5-30:98: @0.Call: _16 = std::fmt::ArgumentV1::new::<T>(move _17, move _18) -> [return: bb1, unwind: bb5] 30:5-30:98: @1[2]: _12 = [move _16] 30:5-30:98: @1[5]: _11 = &_12 30:5-30:98: @1[6]: _10 = &(*_11) 30:5-30:98: @1[7]: _9 = move _10 as &[std::fmt::ArgumentV1] (Pointer(Unsize)) -30:5-30:98: @1.Call: _4 = Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] -30:5-30:98: @2.Call: _3 = _print(move _4) -> [return: bb3, unwind: bb5] +30:5-30:98: @1.Call: _4 = std::fmt::Arguments::new_v1(move _5, move _9) -> [return: bb2, unwind: bb5] +30:5-30:98: @2.Call: _3 = std::io::_print(move _4) -> [return: bb3, unwind: bb5] 30:5-30:98: @3[6]: _2 = const () 29:92-31:2: @3[8]: _0 = const () 31:2-31:2: @4.Return: return">}⦉@0,1,2,3,4
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.uses_crate/uses_crate.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.uses_crate/uses_crate.main.-------.InstrumentCoverage.0.html index acb2c7d63f..28cf051ecf 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.uses_crate/uses_crate.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.uses_crate/uses_crate.main.-------.InstrumentCoverage.0.html @@ -69,124 +69,124 @@ For revisions in Pull Requests (PR): -
    @0,1,2,3,4,5,6,7,8,9⦊fn main() { - used_crate::used_function(); - let some_vec = vec![1, 2, 3, 4]; - used_crate::used_only_from_bin_crate_generic_function(&some_vec); - used_crate::used_only_from_bin_crate_generic_function("used from bin uses_crate.rs"); - used_crate::used_from_bin_crate_and_lib_crate_generic_function(some_vec); - used_crate::used_with_same_type_from_bin_crate_and_lib_crate_generic_function("interesting?"); -}⦉@0,1,2,3,4,5,6,7,8,9
    diff --git a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.yield/yield.main.-------.InstrumentCoverage.0.html b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.yield/yield.main.-------.InstrumentCoverage.0.html index 99e56393ea..4c0c0d562b 100644 --- a/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.yield/yield.main.-------.InstrumentCoverage.0.html +++ b/src/test/run-make-fulldeps/coverage-spanview/expected_mir_dump.yield/yield.main.-------.InstrumentCoverage.0.html @@ -76,26 +76,26 @@ For revisions in Pull Requests (PR): }; match @0,1,2⦊Pin::new(&mut generator).resume(()) { GeneratorState::Yielded(1)⦉@0,1,2 => @4,6,7,8⦊{}⦉@4,6,7,8 - _ => @5⦊panic!("unexpected value from resume")⦉@5, + _ => @5⦊panic!("unexpected value from resume")⦉@5, } match @4,6,7,8⦊Pin::new(&mut generator).resume(())⦉@4,6,7,8 { - GeneratorState::Complete(@10,11⦊"foo"⦉@10,11) => @12,13,14,15⦊{}⦉@12,13,14,15 - _ => @9⦊panic!("unexpected value from resume")⦉@9, + GeneratorState::Complete(@10,11⦊"foo"⦉@10,11) => @12,13,14,15⦊{}⦉@12,13,14,15 + _ => @9⦊panic!("unexpected value from resume")⦉@9, } let @12,13,14,15⦊mut generator⦉@12,13,14,15 = || { @@ -106,32 +106,32 @@ For revisions in Pull Requests (PR): }; match @12,13,14,15⦊Pin::new(&mut generator).resume(()) { GeneratorState::Yielded(1)⦉@12,13,14,15 => @17,19,20,21⦊{}⦉@17,19,20,21 - _ => @18⦊panic!("unexpected value from resume")⦉@18, + _ => @18⦊panic!("unexpected value from resume")⦉@18, } match @17,19,20,21⦊Pin::new(&mut generator).resume(()) { GeneratorState::Yielded(2)⦉@17,19,20,21 => @23,25⦊{}⦉@23,25 - _ => @24⦊panic!("unexpected value from resume")⦉@24, + _ => @24⦊panic!("unexpected value from resume")⦉@24, } }@23,25⦊‸⦉@23,25
    diff --git a/src/test/run-make-fulldeps/coverage/async.rs b/src/test/run-make-fulldeps/coverage/async.rs index 5553af9246..d5ec32deac 100644 --- a/src/test/run-make-fulldeps/coverage/async.rs +++ b/src/test/run-make-fulldeps/coverage/async.rs @@ -1,6 +1,6 @@ #![allow(unused_assignments, dead_code)] -// require-rust-edition-2018 +// compile-flags: --edition=2018 async fn c(x: u8) -> u8 { if x == 8 { diff --git a/src/test/run-make-fulldeps/coverage/coverage_tools.mk b/src/test/run-make-fulldeps/coverage/coverage_tools.mk index 11fd824e52..38643aaf90 100644 --- a/src/test/run-make-fulldeps/coverage/coverage_tools.mk +++ b/src/test/run-make-fulldeps/coverage/coverage_tools.mk @@ -12,5 +12,3 @@ # Enabling `-C link-dead-code` is not necessary when compiling with `-Z instrument-coverage`, # due to improvements in the coverage map generation, to add unreachable functions known to Rust. # Therefore, `-C link-dead-code` is no longer automatically enabled. - -UNAME = $(shell uname) diff --git a/src/test/run-make-fulldeps/coverage/inline.rs b/src/test/run-make-fulldeps/coverage/inline.rs new file mode 100644 index 0000000000..9cfab9ddba --- /dev/null +++ b/src/test/run-make-fulldeps/coverage/inline.rs @@ -0,0 +1,51 @@ +// compile-flags: -Zinline-mir + +use std::fmt::Display; + +fn main() { + permutations(&['a', 'b', 'c']); +} + +#[inline(always)] +fn permutations(xs: &[T]) { + let mut ys = xs.to_owned(); + permutate(&mut ys, 0); +} + +fn permutate(xs: &mut [T], k: usize) { + let n = length(xs); + if k == n { + display(xs); + } else if k < n { + for i in k..n { + swap(xs, i, k); + permutate(xs, k + 1); + swap(xs, i, k); + } + } else { + error(); + } +} + +fn length(xs: &[T]) -> usize { + xs.len() +} + +#[inline] +fn swap(xs: &mut [T], i: usize, j: usize) { + let t = xs[i]; + xs[i] = xs[j]; + xs[j] = t; +} + +fn display(xs: &[T]) { + for x in xs { + print!("{}", x); + } + println!(); +} + +#[inline(always)] +fn error() { + panic!("error"); +} diff --git a/src/test/run-make-fulldeps/coverage/partial_eq.rs b/src/test/run-make-fulldeps/coverage/partial_eq.rs index 7d265ba66a..4ceaba9b11 100644 --- a/src/test/run-make-fulldeps/coverage/partial_eq.rs +++ b/src/test/run-make-fulldeps/coverage/partial_eq.rs @@ -4,8 +4,8 @@ #[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] pub struct Version { major: usize, - minor: usize, // Count: 1 - `PartialOrd` compared `minor` values in 3.2.1 vs. 3.3.0 - patch: usize, // Count: 0 - `PartialOrd` was determined by `minor` (2 < 3) + minor: usize, + patch: usize, } impl Version { @@ -44,18 +44,3 @@ one expression, which is allowed, but the `function_source_hash` was only passed `function_source_hash` without a code region, if necessary. */ - -// FIXME(#79626): The derived traits get coverage, which is great, but some of the traits appear -// to get two coverage execution counts at different positions: -// -// ```text -// 4| 2|#[derive(Clone, Debug, PartialEq, Eq, PartialOrd, Ord)] -// ^0 ^0 ^0 ^0 ^1 ^0 ^0^0 -// ```text -// -// `PartialEq`, `PartialOrd`, and `Ord` (and possibly `Eq`, if the trait name was longer than 2 -// characters) have counts at their first and last characters. -// -// Why is this? Why does `PartialOrd` have two values (1 and 0)? This must mean we are checking -// distinct coverages, so maybe we don't want to eliminate one of them. Should we merge them? -// If merged, do we lose some information? diff --git a/src/test/run-make-fulldeps/issue-19371/foo.rs b/src/test/run-make-fulldeps/issue-19371/foo.rs index fdd7e8b24c..4acabbb70e 100644 --- a/src/test/run-make-fulldeps/issue-19371/foo.rs +++ b/src/test/run-make-fulldeps/issue-19371/foo.rs @@ -57,6 +57,7 @@ fn compile(code: String, output: PathBuf, sysroot: PathBuf) { diagnostic_output: DiagnosticOutput::Default, stderr: None, lint_caps: Default::default(), + parse_sess_created: None, register_lints: None, override_queries: None, make_codegen_backend: None, diff --git a/src/test/run-make-fulldeps/pgo-use/Makefile b/src/test/run-make-fulldeps/pgo-use/Makefile index cb5e9e9a45..01bc211df1 100644 --- a/src/test/run-make-fulldeps/pgo-use/Makefile +++ b/src/test/run-make-fulldeps/pgo-use/Makefile @@ -12,12 +12,11 @@ # `else` branch. Accordingly, we expect the function that is never called to # be marked as cold. # -# The program is compiled with `-Copt-level=s` because this setting disables -# LLVM's pre-inlining pass (i.e. a pass that does some inlining before it adds -# the profiling instrumentation). Disabling this pass leads to rather -# predictable IR which we need for this test to be stable. +# Disable the pre-inlining pass (i.e. a pass that does some inlining before +# it adds the profiling instrumentation). Disabling this pass leads to +# rather predictable IR which we need for this test to be stable. -COMMON_FLAGS=-Copt-level=s -Ccodegen-units=1 +COMMON_FLAGS=-Copt-level=2 -Ccodegen-units=1 -Cllvm-args=-disable-preinline # LLVM doesn't support instrumenting binaries that use SEH: # https://github.com/rust-lang/rust/issues/61002 diff --git a/src/test/run-make-fulldeps/print-unversioned-files/Makefile b/src/test/run-make-fulldeps/print-unversioned-files/Makefile new file mode 100644 index 0000000000..e368f61cdd --- /dev/null +++ b/src/test/run-make-fulldeps/print-unversioned-files/Makefile @@ -0,0 +1,4 @@ +-include ../tools.mk + +all: + $(RUSTDOC) -Z unstable-options --print unversioned-files | sort | diff - unversioned-files.txt diff --git a/src/test/run-make-fulldeps/print-unversioned-files/unversioned-files.txt b/src/test/run-make-fulldeps/print-unversioned-files/unversioned-files.txt new file mode 100644 index 0000000000..c5a9bf2438 --- /dev/null +++ b/src/test/run-make-fulldeps/print-unversioned-files/unversioned-files.txt @@ -0,0 +1,15 @@ +COPYRIGHT.txt +FiraSans-LICENSE.txt +FiraSans-Medium.woff +FiraSans-Medium.woff2 +FiraSans-Regular.woff +FiraSans-Regular.woff2 +LICENSE-APACHE.txt +LICENSE-MIT.txt +SourceCodePro-LICENSE.txt +SourceCodePro-Regular.woff +SourceCodePro-Semibold.woff +SourceSerifPro-Bold.ttf.woff +SourceSerifPro-It.ttf.woff +SourceSerifPro-LICENSE.md +SourceSerifPro-Regular.ttf.woff diff --git a/src/test/run-make-fulldeps/rustdoc-map-file/Makefile b/src/test/run-make-fulldeps/rustdoc-map-file/Makefile new file mode 100644 index 0000000000..ce977fa0ce --- /dev/null +++ b/src/test/run-make-fulldeps/rustdoc-map-file/Makefile @@ -0,0 +1,5 @@ +-include ../tools.mk + +all: + $(RUSTDOC) -Z unstable-options --generate-redirect-map foo.rs -o "$(TMPDIR)/out" + "$(PYTHON)" validate_json.py "$(TMPDIR)/out" diff --git a/src/test/run-make-fulldeps/rustdoc-map-file/expected.json b/src/test/run-make-fulldeps/rustdoc-map-file/expected.json new file mode 100644 index 0000000000..6b1ccbeac3 --- /dev/null +++ b/src/test/run-make-fulldeps/rustdoc-map-file/expected.json @@ -0,0 +1,5 @@ +{ + "foo/macro.foo!.html": "foo/macro.foo.html", + "foo/private/struct.Quz.html": "foo/struct.Quz.html", + "foo/hidden/struct.Bar.html": "foo/struct.Bar.html" +} diff --git a/src/test/run-make-fulldeps/rustdoc-map-file/foo.rs b/src/test/run-make-fulldeps/rustdoc-map-file/foo.rs new file mode 100644 index 0000000000..e12b9d2292 --- /dev/null +++ b/src/test/run-make-fulldeps/rustdoc-map-file/foo.rs @@ -0,0 +1,16 @@ +pub use private::Quz; +pub use hidden::Bar; + +mod private { + pub struct Quz; +} + +#[doc(hidden)] +pub mod hidden { + pub struct Bar; +} + +#[macro_export] +macro_rules! foo { + () => {} +} diff --git a/src/test/run-make-fulldeps/rustdoc-map-file/validate_json.py b/src/test/run-make-fulldeps/rustdoc-map-file/validate_json.py new file mode 100755 index 0000000000..5c14c90b70 --- /dev/null +++ b/src/test/run-make-fulldeps/rustdoc-map-file/validate_json.py @@ -0,0 +1,41 @@ +#!/usr/bin/env python + +import os +import sys +import json + + +def find_redirect_map_file(folder, errors): + for root, dirs, files in os.walk(folder): + for name in files: + if not name.endswith("redirect-map.json"): + continue + with open(os.path.join(root, name)) as f: + data = json.load(f) + with open("expected.json") as f: + expected = json.load(f) + for key in expected: + if expected[key] != data.get(key): + errors.append("Expected `{}` for key `{}`, found: `{}`".format( + expected[key], key, data.get(key))) + else: + del data[key] + for key in data: + errors.append("Extra data not expected: key: `{}`, data: `{}`".format( + key, data[key])) + return True + return False + + +if len(sys.argv) != 2: + print("Expected doc directory to check!") + sys.exit(1) + +errors = [] +if not find_redirect_map_file(sys.argv[1], errors): + print("Didn't find the map file in `{}`...".format(sys.argv[1])) + sys.exit(1) +for err in errors: + print("=> {}".format(err)) +if len(errors) != 0: + sys.exit(1) diff --git a/src/test/run-make-fulldeps/simd-ffi/simd.rs b/src/test/run-make-fulldeps/simd-ffi/simd.rs index 717da367fe..d11cfd77c5 100644 --- a/src/test/run-make-fulldeps/simd-ffi/simd.rs +++ b/src/test/run-make-fulldeps/simd-ffi/simd.rs @@ -75,3 +75,8 @@ auto trait Freeze {} macro_rules! Copy { () => {}; } +#[macro_export] +#[rustc_builtin_macro] +macro_rules! derive { + () => {}; +} diff --git a/src/test/run-make-fulldeps/split-debuginfo/Makefile b/src/test/run-make-fulldeps/split-debuginfo/Makefile index e8e62efe01..c89f2ae834 100644 --- a/src/test/run-make-fulldeps/split-debuginfo/Makefile +++ b/src/test/run-make-fulldeps/split-debuginfo/Makefile @@ -1,5 +1,7 @@ -include ../tools.mk +# min-llvm-version: 11.0 + all: off packed unpacked ifeq ($(UNAME),Darwin) diff --git a/src/test/run-make-fulldeps/split-dwarf/Makefile b/src/test/run-make-fulldeps/split-dwarf/Makefile index 93dfc8e76a..f56b4168b2 100644 --- a/src/test/run-make-fulldeps/split-dwarf/Makefile +++ b/src/test/run-make-fulldeps/split-dwarf/Makefile @@ -1,8 +1,9 @@ -include ../tools.mk # only-linux +# min-llvm-version: 11.0 all: - $(RUSTC) -Z unstable-options -C split-debuginfo=packed foo.rs -g + $(RUSTC) -Z unstable-options -C split-debuginfo=packed -C debuginfo=2 foo.rs -g rm $(TMPDIR)/foo.dwp rm $(TMPDIR)/$(call BIN,foo) diff --git a/src/test/run-make-fulldeps/tools.mk b/src/test/run-make-fulldeps/tools.mk index 634c9ece3f..a1a076dd74 100644 --- a/src/test/run-make-fulldeps/tools.mk +++ b/src/test/run-make-fulldeps/tools.mk @@ -21,6 +21,21 @@ CGREP := "$(S)/src/etc/cat-and-grep.sh" # diff with common flags for multi-platform diffs against text output DIFF := diff -u --strip-trailing-cr +# Some of the Rust CI platforms use `/bin/dash` to run `shell` script in +# Makefiles. Other platforms, including many developer platforms, default to +# `/bin/bash`. (In many cases, `make` is actually using `/bin/sh`, but `sh` +# is configured to execute one or the other shell binary). `dash` features +# support only a small subset of `bash` features, so `dash` can be thought of as +# the lowest common denominator, and tests should be validated against `dash` +# whenever possible. Most developer platforms include `/bin/dash`, but to ensure +# tests still work when `/bin/dash`, if not available, this `SHELL` override is +# conditional: +ifndef IS_WINDOWS # dash interprets backslashes in executable paths incorrectly +ifneq (,$(wildcard /bin/dash)) +SHELL := /bin/dash +endif +endif + # This is the name of the binary we will generate and run; use this # e.g. for `$(CC) -o $(RUN_BINFILE)`. RUN_BINFILE = $(TMPDIR)/$(1) diff --git a/src/test/run-make-fulldeps/treat-err-as-bug/Makefile b/src/test/run-make-fulldeps/treat-err-as-bug/Makefile deleted file mode 100644 index 57cac76aec..0000000000 --- a/src/test/run-make-fulldeps/treat-err-as-bug/Makefile +++ /dev/null @@ -1,7 +0,0 @@ --include ../tools.mk - -all: - $(RUSTC) err.rs -Z treat-err-as-bug 2>&1 \ - | $(CGREP) "panicked at 'aborting due to \`-Z treat-err-as-bug=1\`'" - $(RUSTC) delay_span_bug.rs -Z treat-err-as-bug 2>&1 \ - | $(CGREP) "panicked at 'aborting due to \`-Z treat-err-as-bug=1\`'" diff --git a/src/test/run-make-fulldeps/treat-err-as-bug/delay_span_bug.rs b/src/test/run-make-fulldeps/treat-err-as-bug/delay_span_bug.rs deleted file mode 100644 index dad33e498b..0000000000 --- a/src/test/run-make-fulldeps/treat-err-as-bug/delay_span_bug.rs +++ /dev/null @@ -1,4 +0,0 @@ -#![feature(rustc_attrs)] - -#[rustc_error(delay_span_bug_from_inside_query)] -fn main() {} diff --git a/src/test/run-make-fulldeps/treat-err-as-bug/err.rs b/src/test/run-make-fulldeps/treat-err-as-bug/err.rs deleted file mode 100644 index 136b2f3070..0000000000 --- a/src/test/run-make-fulldeps/treat-err-as-bug/err.rs +++ /dev/null @@ -1,3 +0,0 @@ -#![crate_type="rlib"] - -pub static C: u32 = 0-1; diff --git a/src/test/run-make/const_fn_mir/dump.mir b/src/test/run-make/const_fn_mir/dump.mir index 3dac42c678..724b263008 100644 --- a/src/test/run-make/const_fn_mir/dump.mir +++ b/src/test/run-make/const_fn_mir/dump.mir @@ -5,7 +5,6 @@ fn main() -> () { let _1: i32; // in scope 0 at main.rs:9:5: 9:10 bb0: { - StorageLive(_1); // scope 0 at main.rs:9:5: 9:10 _1 = foo() -> bb1; // scope 0 at main.rs:9:5: 9:10 // mir::Constant // + span: main.rs:9:5: 9:8 @@ -13,8 +12,6 @@ fn main() -> () { } bb1: { - StorageDead(_1); // scope 0 at main.rs:9:10: 9:11 - _0 = const (); // scope 0 at main.rs:8:11: 10:2 return; // scope 0 at main.rs:10:2: 10:2 } } diff --git a/src/test/run-make/issue-83112-incr-test-moved-file/Makefile b/src/test/run-make/issue-83112-incr-test-moved-file/Makefile new file mode 100644 index 0000000000..76ecaba0f6 --- /dev/null +++ b/src/test/run-make/issue-83112-incr-test-moved-file/Makefile @@ -0,0 +1,25 @@ +include ../../run-make-fulldeps/tools.mk + +# FIXME https://github.com/rust-lang/rust/issues/78911 +# ignore-32bit wrong/no cross compiler and sometimes we pass wrong gcc args (-m64) + +# Regression test for issue #83112 +# The generated test harness code contains spans with a dummy location, +# but a non-dummy SyntaxContext. Previously, the incremental cache was encoding +# these spans as a full span (with a source file index), instead of skipping +# the encoding of the location information. If the file gest moved, the hash +# of the span will be unchanged (since it has a dummy location), so the incr +# cache would end up try to load a non-existent file using the previously +# enccoded source file id. + +SRC=$(TMPDIR)/src +INCR=$(TMPDIR)/incr + +all: + mkdir $(SRC) + mkdir $(SRC)/mydir + mkdir $(INCR) + cp main.rs $(SRC)/main.rs + $(RUSTC) --test -C incremental=$(INCR) $(SRC)/main.rs + mv $(SRC)/main.rs $(SRC)/mydir/main.rs + $(RUSTC) --test -C incremental=$(INCR) $(SRC)/mydir/main.rs diff --git a/src/test/run-make/issue-83112-incr-test-moved-file/main.rs b/src/test/run-make/issue-83112-incr-test-moved-file/main.rs new file mode 100644 index 0000000000..f328e4d9d0 --- /dev/null +++ b/src/test/run-make/issue-83112-incr-test-moved-file/main.rs @@ -0,0 +1 @@ +fn main() {} diff --git a/src/test/run-make/libtest-thread-limit/Makefile b/src/test/run-make/libtest-thread-limit/Makefile new file mode 100644 index 0000000000..29c1bc71d8 --- /dev/null +++ b/src/test/run-make/libtest-thread-limit/Makefile @@ -0,0 +1,7 @@ +-include ../../run-make-fulldeps/tools.mk + +# only-linux + +all: + $(RUSTC) test.rs --test --target $(TARGET) + $(shell ulimit -p 0 && $(call RUN,test)) diff --git a/src/test/run-make/libtest-thread-limit/test.rs b/src/test/run-make/libtest-thread-limit/test.rs new file mode 100644 index 0000000000..d899411a49 --- /dev/null +++ b/src/test/run-make/libtest-thread-limit/test.rs @@ -0,0 +1,16 @@ +#![feature(once_cell)] + +use std::{io::ErrorKind, lazy::SyncOnceCell, thread::{self, Builder, ThreadId}}; + +static THREAD_ID: SyncOnceCell = SyncOnceCell::new(); + +#[test] +fn spawn_thread_would_block() { + assert_eq!(Builder::new().spawn(|| unreachable!()).unwrap_err().kind(), ErrorKind::WouldBlock); + THREAD_ID.set(thread::current().id()).unwrap(); +} + +#[test] +fn run_in_same_thread() { + assert_eq!(*THREAD_ID.get().unwrap(), thread::current().id()); +} diff --git a/src/test/rustdoc-gui/basic-code.goml b/src/test/rustdoc-gui/basic-code.goml new file mode 100644 index 0000000000..8da4656625 --- /dev/null +++ b/src/test/rustdoc-gui/basic-code.goml @@ -0,0 +1,3 @@ +goto: file://|DOC_PATH|/index.html +click: ".srclink" +assert: (".line-numbers", 1) diff --git a/src/test/rustdoc-gui/basic.goml b/src/test/rustdoc-gui/basic.goml new file mode 100644 index 0000000000..ed23300860 --- /dev/null +++ b/src/test/rustdoc-gui/basic.goml @@ -0,0 +1,4 @@ +goto: file://|DOC_PATH|/index.html +assert: ("#functions") +goto: ./struct.Foo.html +assert: ("div.type-decl") diff --git a/src/test/rustdoc-gui/code-sidebar-toggle.goml b/src/test/rustdoc-gui/code-sidebar-toggle.goml new file mode 100644 index 0000000000..69fc860244 --- /dev/null +++ b/src/test/rustdoc-gui/code-sidebar-toggle.goml @@ -0,0 +1,6 @@ +goto: file://|DOC_PATH|/index.html +click: ".srclink" +click: "#sidebar-toggle" +wait-for: 500 +fail: true +assert: ("#source-sidebar", { "left": "-300px" }) diff --git a/src/test/rustdoc-gui/lib.rs b/src/test/rustdoc-gui/lib.rs new file mode 100644 index 0000000000..15d8dcc6e8 --- /dev/null +++ b/src/test/rustdoc-gui/lib.rs @@ -0,0 +1,72 @@ +//! The point of this crate is to be able to have enough different "kinds" of +//! documentation generated so we can test each different features. + +#![crate_name = "test_docs"] + +use std::fmt; + +/// Basic function with some code examples: +/// +/// ``` +/// println!("nothing fancy"); +/// ``` +/// +/// A failing to compile one: +/// +/// ```compile_fail +/// println!("where did my argument {} go? :'("); +/// ``` +/// +/// An ignored one: +/// +/// ```ignore (it's a test) +/// Let's say I'm just some text will ya? +/// ``` +pub fn foo() {} + +/// Just a normal struct. +pub struct Foo; + +impl Foo { + #[must_use] + pub fn must_use(&self) -> bool { true } +} + +/// Just a normal enum. +pub enum WhoLetTheDogOut { + /// Woof! + Woof, + /// Meoooooooow... + Meow, +} + +/// Who doesn't love to wrap a `format!` call? +pub fn some_more_function(t: &T) -> String { + format!("{:?}", t) +} + +/// Woohoo! A trait! +pub trait AnotherOne { + /// Some func 1. + fn func1(); + + /// Some func 2. + fn func2(); + + /// Some func 3. + fn func3(); +} + +/// Check for "i" signs in lists! +/// +/// 1. elem 1 +/// 2.test 1 +/// ```compile_fail +/// fn foo() {} +/// ``` +/// 3. elem 3 +/// 4. ```ignore (it's a test) +/// fn foo() {} +/// ``` +/// 5. elem 5 +pub fn check_list_code_block() {} diff --git a/src/test/rustdoc-gui/list_code_block.goml b/src/test/rustdoc-gui/list_code_block.goml new file mode 100644 index 0000000000..6f2465a558 --- /dev/null +++ b/src/test/rustdoc-gui/list_code_block.goml @@ -0,0 +1,3 @@ +goto: file://|DOC_PATH|/index.html +goto: ./fn.check_list_code_block.html +assert: ("pre.rust.fn") diff --git a/src/test/rustdoc-gui/nojs-attr-pos.goml b/src/test/rustdoc-gui/nojs-attr-pos.goml new file mode 100644 index 0000000000..35daa4cb9e --- /dev/null +++ b/src/test/rustdoc-gui/nojs-attr-pos.goml @@ -0,0 +1,5 @@ +// Check that the attributes are well positioned when javascript is disabled (since +// there is no toggle to display) +javascript: false +goto: file://|DOC_PATH|/struct.Foo.html +assert: (".attributes", {"margin-left": "0px"}) diff --git a/src/test/rustdoc-gui/search-input-mobile.goml b/src/test/rustdoc-gui/search-input-mobile.goml new file mode 100644 index 0000000000..3eec3459a6 --- /dev/null +++ b/src/test/rustdoc-gui/search-input-mobile.goml @@ -0,0 +1,11 @@ +// Test to ensure that you can click on the search input, whatever the width. +// The PR which fixed it is: https://github.com/rust-lang/rust/pull/81592 +goto: file://|DOC_PATH|/index.html +size: (463, 700) +// We first check that the search input isn't already focused. +assert-false: ("input.search-input:focus") +click: "input.search-input" +reload: +size: (750, 700) +click: "input.search-input" +assert: ("input.search-input:focus") diff --git a/src/test/rustdoc-gui/shortcuts.goml b/src/test/rustdoc-gui/shortcuts.goml new file mode 100644 index 0000000000..c35b48f57f --- /dev/null +++ b/src/test/rustdoc-gui/shortcuts.goml @@ -0,0 +1,26 @@ +// Check that the various shortcuts are working. +goto: file://|DOC_PATH|/index.html +// We first check that the search input isn't already focused. +assert-false: "input.search-input:focus" +press-key: "s" +assert: "input.search-input:focus" +press-key: "Escape" +assert-false: "input.search-input:focus" +// We now check for the help popup. +press-key: "?" +assert: ("#help", {"display": "flex"}) +assert-false: "#help.hidden" +press-key: "Escape" +assert: ("#help.hidden", {"display": "none"}) +// Check for the themes list. +assert: ("#theme-choices", {"display": "none"}) +press-key: "t" +assert: ("#theme-choices", {"display": "block"}) +press-key: "t" +// We ensure that 't' hides back the menu. +assert: ("#theme-choices", {"display": "none"}) +press-key: "t" +assert: ("#theme-choices", {"display": "block"}) +press-key: "Escape" +// We ensure that 'Escape' hides the menu too. +assert: ("#theme-choices", {"display": "none"}) diff --git a/src/test/rustdoc-gui/theme-change.goml b/src/test/rustdoc-gui/theme-change.goml new file mode 100644 index 0000000000..5bd65f61f4 --- /dev/null +++ b/src/test/rustdoc-gui/theme-change.goml @@ -0,0 +1,10 @@ +goto: file://|DOC_PATH|/index.html +click: "#theme-picker" +click: "#theme-choices > button:first-child" +wait-for: 500 +// should be the ayu theme so let's check the color +assert: ("body", { "background-color": "rgb(15, 20, 25)" }) +click: "#theme-choices > button:last-child" +wait-for: 500 +// should be the light theme so let's check the color +assert: ("body", { "background-color": "rgb(255, 255, 255)" }) diff --git a/src/test/rustdoc-gui/toggle-docs.goml b/src/test/rustdoc-gui/toggle-docs.goml new file mode 100644 index 0000000000..1ded33f659 --- /dev/null +++ b/src/test/rustdoc-gui/toggle-docs.goml @@ -0,0 +1,7 @@ +goto: file://|DOC_PATH|/index.html +click: "#toggle-all-docs" +wait-for: 5000 +assert: ("#main > div.docblock.hidden-by-usual-hider") +click: "#toggle-all-docs" +wait-for: 5000 +assert: ("#main > div.docblock.hidden-by-usual-hider", 0) diff --git a/src/test/rustdoc-json/fn_pointer/header.rs b/src/test/rustdoc-json/fn_pointer/header.rs new file mode 100644 index 0000000000..a5038e0cd2 --- /dev/null +++ b/src/test/rustdoc-json/fn_pointer/header.rs @@ -0,0 +1,5 @@ +// @has header.json "$.index[*][?(@.name=='FnPointer')].inner.type.inner.header" "[]" +pub type FnPointer = fn(); + +// @has - "$.index[*][?(@.name=='UnsafePointer')].inner.type.inner.header" '["unsafe"]' +pub type UnsafePointer = unsafe fn(); diff --git a/src/test/rustdoc-json/fns/header.rs b/src/test/rustdoc-json/fns/header.rs new file mode 100644 index 0000000000..29741dd50d --- /dev/null +++ b/src/test/rustdoc-json/fns/header.rs @@ -0,0 +1,22 @@ +// edition:2018 + +// @has header.json "$.index[*][?(@.name=='nothing_fn')].inner.header" "[]" +pub fn nothing_fn() {} + +// @has - "$.index[*][?(@.name=='const_fn')].inner.header" '["const"]' +pub const fn const_fn() {} + +// @has - "$.index[*][?(@.name=='async_fn')].inner.header" '["async"]' +pub async fn async_fn() {} + +// @count - "$.index[*][?(@.name=='async_unsafe_fn')].inner.header[*]" 2 +// @has - "$.index[*][?(@.name=='async_unsafe_fn')].inner.header[*]" '"async"' +// @has - "$.index[*][?(@.name=='async_unsafe_fn')].inner.header[*]" '"unsafe"' +pub async unsafe fn async_unsafe_fn() {} + +// @count - "$.index[*][?(@.name=='const_unsafe_fn')].inner.header[*]" 2 +// @has - "$.index[*][?(@.name=='const_unsafe_fn')].inner.header[*]" '"const"' +// @has - "$.index[*][?(@.name=='const_unsafe_fn')].inner.header[*]" '"unsafe"' +pub const unsafe fn const_unsafe_fn() {} + +// It's impossible for a function to be both const and async, so no test for that diff --git a/src/test/rustdoc-json/method_abi.rs b/src/test/rustdoc-json/method_abi.rs new file mode 100644 index 0000000000..6fabbc8361 --- /dev/null +++ b/src/test/rustdoc-json/method_abi.rs @@ -0,0 +1,25 @@ +// @has method_abi.json "$.index[*][?(@.name=='Foo')]" +pub struct Foo; + +impl Foo { + // @has - "$.index[*][?(@.name=='abi_rust')].inner.abi" '"\"Rust\""' + pub fn abi_rust() {} + + // @has - "$.index[*][?(@.name=='abi_c')].inner.abi" '"\"C\""' + pub extern "C" fn abi_c() {} + + // @has - "$.index[*][?(@.name=='abi_system')].inner.abi" '"\"system\""' + pub extern "system" fn abi_system() {} +} + +// @has method_abi.json "$.index[*][?(@.name=='Bar')]" +pub trait Bar { + // @has - "$.index[*][?(@.name=='trait_abi_rust')].inner.abi" '"\"Rust\""' + fn trait_abi_rust(); + + // @has - "$.index[*][?(@.name=='trait_abi_c')].inner.abi" '"\"C\""' + extern "C" fn trait_abi_c(); + + // @has - "$.index[*][?(@.name=='trait_abi_system')].inner.abi" '"\"system\""' + extern "system" fn trait_abi_system(); +} diff --git a/src/test/rustdoc-json/methods/header.rs b/src/test/rustdoc-json/methods/header.rs new file mode 100644 index 0000000000..50a3db75ef --- /dev/null +++ b/src/test/rustdoc-json/methods/header.rs @@ -0,0 +1,26 @@ +// edition:2018 + +pub struct Foo; + +impl Foo { + // @has header.json "$.index[*][?(@.name=='nothing_meth')].inner.header" "[]" + pub fn nothing_meth() {} + + // @has - "$.index[*][?(@.name=='const_meth')].inner.header" '["const"]' + pub const fn const_meth() {} + + // @has - "$.index[*][?(@.name=='async_meth')].inner.header" '["async"]' + pub async fn async_meth() {} + + // @count - "$.index[*][?(@.name=='async_unsafe_meth')].inner.header[*]" 2 + // @has - "$.index[*][?(@.name=='async_unsafe_meth')].inner.header[*]" '"async"' + // @has - "$.index[*][?(@.name=='async_unsafe_meth')].inner.header[*]" '"unsafe"' + pub async unsafe fn async_unsafe_meth() {} + + // @count - "$.index[*][?(@.name=='const_unsafe_meth')].inner.header[*]" 2 + // @has - "$.index[*][?(@.name=='const_unsafe_meth')].inner.header[*]" '"const"' + // @has - "$.index[*][?(@.name=='const_unsafe_meth')].inner.header[*]" '"unsafe"' + pub const unsafe fn const_unsafe_meth() {} + + // It's impossible for a method to be both const and async, so no test for that +} diff --git a/src/test/rustdoc-json/nested.rs b/src/test/rustdoc-json/nested.rs index 7e705255d9..5bb66f7f6f 100644 --- a/src/test/rustdoc-json/nested.rs +++ b/src/test/rustdoc-json/nested.rs @@ -1,24 +1,30 @@ // edition:2018 +// compile-flags: --crate-version 1.0.0 -// @has nested.json "$.index[*][?(@.name=='nested')].kind" \"module\" -// @has - "$.index[*][?(@.name=='nested')].inner.is_crate" true +// @is nested.json "$.crate_version" \"1.0.0\" +// @is - "$.index[*][?(@.name=='nested')].kind" \"module\" +// @is - "$.index[*][?(@.name=='nested')].inner.is_crate" true // @count - "$.index[*][?(@.name=='nested')].inner.items[*]" 1 -// @has nested.json "$.index[*][?(@.name=='l1')].kind" \"module\" -// @has - "$.index[*][?(@.name=='l1')].inner.is_crate" false +// @is nested.json "$.index[*][?(@.name=='l1')].kind" \"module\" +// @is - "$.index[*][?(@.name=='l1')].inner.is_crate" false // @count - "$.index[*][?(@.name=='l1')].inner.items[*]" 2 pub mod l1 { - // @has nested.json "$.index[*][?(@.name=='l3')].kind" \"module\" - // @has - "$.index[*][?(@.name=='l3')].inner.is_crate" false + // @is nested.json "$.index[*][?(@.name=='l3')].kind" \"module\" + // @is - "$.index[*][?(@.name=='l3')].inner.is_crate" false // @count - "$.index[*][?(@.name=='l3')].inner.items[*]" 1 + // @set l3_id = - "$.index[*][?(@.name=='l3')].id" + // @has - "$.index[*][?(@.name=='l1')].inner.items[*]" $l3_id pub mod l3 { - // @has nested.json "$.index[*][?(@.name=='L4')].kind" \"struct\" - // @has - "$.index[*][?(@.name=='L4')].inner.struct_type" \"unit\" + // @is nested.json "$.index[*][?(@.name=='L4')].kind" \"struct\" + // @is - "$.index[*][?(@.name=='L4')].inner.struct_type" \"unit\" + // @set l4_id = - "$.index[*][?(@.name=='L4')].id" + // @has - "$.index[*][?(@.name=='l3')].inner.items[*]" $l4_id pub struct L4; } - // @has nested.json "$.index[*][?(@.inner.span=='l3::L4')].kind" \"import\" - // @has - "$.index[*][?(@.inner.span=='l3::L4')].inner.glob" false + // @is nested.json "$.index[*][?(@.inner.span=='l3::L4')].kind" \"import\" + // @is - "$.index[*][?(@.inner.span=='l3::L4')].inner.glob" false pub use l3::L4; } diff --git a/src/test/rustdoc-json/reexport/glob_extern.rs b/src/test/rustdoc-json/reexport/glob_extern.rs new file mode 100644 index 0000000000..831c185f6b --- /dev/null +++ b/src/test/rustdoc-json/reexport/glob_extern.rs @@ -0,0 +1,17 @@ +// edition:2018 + +#![no_core] +#![feature(no_core)] + +// @!has glob_extern.json "$.index[*][?(@.name=='mod1')]" +mod mod1 { + extern "C" { + // @set public_fn_id = - "$.index[*][?(@.name=='public_fn')].id" + pub fn public_fn(); + // @!has - "$.index[*][?(@.name=='private_fn')]" + fn private_fn(); + } +} + +// @has - "$.index[*][?(@.name=='glob_extern')].inner.items[*]" $public_fn_id +pub use mod1::*; diff --git a/src/test/rustdoc-json/reexport/glob_private.rs b/src/test/rustdoc-json/reexport/glob_private.rs new file mode 100644 index 0000000000..e907de9236 --- /dev/null +++ b/src/test/rustdoc-json/reexport/glob_private.rs @@ -0,0 +1,27 @@ +// edition:2018 + +#![no_core] +#![feature(no_core)] + +// @!has glob_private.json "$.index[*][?(@.name=='mod1')]" +mod mod1 { + // @!has - "$.index[*][?(@.name=='mod2')]" + mod mod2 { + // @set m2pub_id = - "$.index[*][?(@.name=='Mod2Public')].id" + pub struct Mod2Public; + + // @!has - "$.index[*][?(@.name=='Mod2Private')]" + struct Mod2Private; + } + pub use self::mod2::*; + + // @set m1pub_id = - "$.index[*][?(@.name=='Mod1Public')].id" + pub struct Mod1Public; + + // @!has - "$.index[*][?(@.name=='Mod1Private')]" + struct Mod1Private; +} +pub use mod1::*; + +// @has - "$.index[*][?(@.name=='glob_private')].inner.items[*]" $m2pub_id +// @has - "$.index[*][?(@.name=='glob_private')].inner.items[*]" $m1pub_id diff --git a/src/test/rustdoc-json/reexport/rename_public.rs b/src/test/rustdoc-json/reexport/rename_public.rs new file mode 100644 index 0000000000..8c2d7200d0 --- /dev/null +++ b/src/test/rustdoc-json/reexport/rename_public.rs @@ -0,0 +1,17 @@ +// edition:2018 + +#![no_core] +#![feature(no_core)] + +// @set inner_id = rename_public.json "$.index[*][?(@.name=='inner')].id" +// @has - "$.index[*][?(@.name=='rename_public')].inner.items[*]" $inner_id +pub mod inner { + // @set public_id = - "$.index[*][?(@.name=='Public')].id" + // @has - "$.index[*][?(@.name=='inner')].inner.items[*]" $public_id + pub struct Public; +} +// @set import_id = - "$.index[*][?(@.inner.name=='NewName')].id" +// @!has - "$.index[*][?(@.inner.name=='Public')]" +// @has - "$.index[*][?(@.name=='rename_public')].inner.items[*]" $import_id +// @is - "$.index[*][?(@.inner.name=='NewName')].inner.span" \"inner::Public\" +pub use inner::Public as NewName; diff --git a/src/test/rustdoc-json/reexport/simple_private.rs b/src/test/rustdoc-json/reexport/simple_private.rs new file mode 100644 index 0000000000..658b121e6c --- /dev/null +++ b/src/test/rustdoc-json/reexport/simple_private.rs @@ -0,0 +1,13 @@ +// edition:2018 + +#![no_core] +#![feature(no_core)] + +// @!has simple_private.json "$.index[*][?(@.name=='inner')]" +mod inner { + // @set pub_id = - "$.index[*][?(@.name=='Public')].id" + pub struct Public; +} + +// @has - "$.index[*][?(@.name=='simple_private')].inner.items[*]" $pub_id +pub use inner::Public; diff --git a/src/test/rustdoc-json/reexport/simple_public.rs b/src/test/rustdoc-json/reexport/simple_public.rs new file mode 100644 index 0000000000..0c97a2e7b4 --- /dev/null +++ b/src/test/rustdoc-json/reexport/simple_public.rs @@ -0,0 +1,18 @@ +// edition:2018 + +#![no_core] +#![feature(no_core)] + +// @set inner_id = simple_public.json "$.index[*][?(@.name=='inner')].id" +// @has - "$.index[*][?(@.name=='simple_public')].inner.items[*]" $inner_id +pub mod inner { + + // @set public_id = - "$.index[*][?(@.name=='Public')].id" + // @has - "$.index[*][?(@.name=='inner')].inner.items[*]" $public_id + pub struct Public; +} + +// @set import_id = - "$.index[*][?(@.inner.name=='Public')].id" +// @has - "$.index[*][?(@.name=='simple_public')].inner.items[*]" $import_id +// @is - "$.index[*][?(@.inner.name=='Public')].inner.span" \"inner::Public\" +pub use inner::Public; diff --git a/src/test/rustdoc-ui/assoc-item-not-in-scope.rs b/src/test/rustdoc-ui/assoc-item-not-in-scope.rs index c5bb4305db..0976515f4a 100644 --- a/src/test/rustdoc-ui/assoc-item-not-in-scope.rs +++ b/src/test/rustdoc-ui/assoc-item-not-in-scope.rs @@ -1,4 +1,4 @@ -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] #[derive(Debug)] /// Link to [`S::fmt`] diff --git a/src/test/rustdoc-ui/assoc-item-not-in-scope.stderr b/src/test/rustdoc-ui/assoc-item-not-in-scope.stderr index 92d27179e8..358871b532 100644 --- a/src/test/rustdoc-ui/assoc-item-not-in-scope.stderr +++ b/src/test/rustdoc-ui/assoc-item-not-in-scope.stderr @@ -7,8 +7,8 @@ LL | /// Link to [`S::fmt`] note: the lint level is defined here --> $DIR/assoc-item-not-in-scope.rs:1:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/rustdoc-ui/check-attr-test.rs b/src/test/rustdoc-ui/check-attr-test.rs index 665f330e34..023d620bea 100644 --- a/src/test/rustdoc-ui/check-attr-test.rs +++ b/src/test/rustdoc-ui/check-attr-test.rs @@ -1,6 +1,6 @@ // compile-flags:--test -#![deny(invalid_codeblock_attributes)] +#![deny(rustdoc::invalid_codeblock_attributes)] /// foo /// diff --git a/src/test/rustdoc-ui/check-attr-test.stderr b/src/test/rustdoc-ui/check-attr-test.stderr index 1e067a5d21..affd0372a1 100644 --- a/src/test/rustdoc-ui/check-attr-test.stderr +++ b/src/test/rustdoc-ui/check-attr-test.stderr @@ -11,8 +11,8 @@ error: unknown attribute `compile-fail`. Did you mean `compile_fail`? note: the lint level is defined here --> $DIR/check-attr-test.rs:3:9 | -3 | #![deny(invalid_codeblock_attributes)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +3 | #![deny(rustdoc::invalid_codeblock_attributes)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = help: the code block will either not be tested if not marked as a rust one or won't fail if it compiles successfully error: unknown attribute `compilefail`. Did you mean `compile_fail`? diff --git a/src/test/rustdoc-ui/check-attr.rs b/src/test/rustdoc-ui/check-attr.rs index 9e02eab753..763bc4c6cd 100644 --- a/src/test/rustdoc-ui/check-attr.rs +++ b/src/test/rustdoc-ui/check-attr.rs @@ -1,4 +1,4 @@ -#![deny(invalid_codeblock_attributes)] +#![deny(rustdoc::invalid_codeblock_attributes)] /// foo //~^ ERROR diff --git a/src/test/rustdoc-ui/check-attr.stderr b/src/test/rustdoc-ui/check-attr.stderr index 919eb047ee..9312cfb76f 100644 --- a/src/test/rustdoc-ui/check-attr.stderr +++ b/src/test/rustdoc-ui/check-attr.stderr @@ -13,8 +13,8 @@ LL | | /// ``` note: the lint level is defined here --> $DIR/check-attr.rs:1:9 | -LL | #![deny(invalid_codeblock_attributes)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::invalid_codeblock_attributes)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = help: the code block will either not be tested if not marked as a rust one or won't fail if it compiles successfully error: unknown attribute `compilefail`. Did you mean `compile_fail`? diff --git a/src/test/rustdoc-ui/check-doc-alias-attr.rs b/src/test/rustdoc-ui/check-doc-alias-attr.rs index 912e35f916..719b98604c 100644 --- a/src/test/rustdoc-ui/check-doc-alias-attr.rs +++ b/src/test/rustdoc-ui/check-doc-alias-attr.rs @@ -1,11 +1,11 @@ #![crate_type = "lib"] #[doc(alias = "foo")] // ok! +#[doc(alias("bar", "baz"))] // ok! pub struct Bar; #[doc(alias)] //~ ERROR #[doc(alias = 0)] //~ ERROR -#[doc(alias("bar"))] //~ ERROR #[doc(alias = "\"")] //~ ERROR #[doc(alias = "\n")] //~ ERROR #[doc(alias = " @@ -13,4 +13,16 @@ pub struct Bar; #[doc(alias = "\t")] //~ ERROR #[doc(alias = " hello")] //~ ERROR #[doc(alias = "hello ")] //~ ERROR +#[doc(alias = "")] //~ ERROR pub struct Foo; + +#[doc(alias(0))] //~ ERROR +#[doc(alias("\""))] //~ ERROR +#[doc(alias("\n"))] //~ ERROR +#[doc(alias(" +"))] //~^ ERROR +#[doc(alias("\t"))] //~ ERROR +#[doc(alias(" hello"))] //~ ERROR +#[doc(alias("hello "))] //~ ERROR +#[doc(alias(""))] //~ ERROR +pub struct Foo2; diff --git a/src/test/rustdoc-ui/check-doc-alias-attr.stderr b/src/test/rustdoc-ui/check-doc-alias-attr.stderr index 1c7fc83bb8..f99d69dc10 100644 --- a/src/test/rustdoc-ui/check-doc-alias-attr.stderr +++ b/src/test/rustdoc-ui/check-doc-alias-attr.stderr @@ -1,21 +1,15 @@ -error: doc alias attribute expects a string: #[doc(alias = "a")] - --> $DIR/check-doc-alias-attr.rs:6:7 +error: doc alias attribute expects a string `#[doc(alias = "a")]` or a list of strings `#[doc(alias("a", "b"))]` + --> $DIR/check-doc-alias-attr.rs:7:7 | LL | #[doc(alias)] | ^^^^^ -error: doc alias attribute expects a string: #[doc(alias = "a")] - --> $DIR/check-doc-alias-attr.rs:7:7 +error: doc alias attribute expects a string `#[doc(alias = "a")]` or a list of strings `#[doc(alias("a", "b"))]` + --> $DIR/check-doc-alias-attr.rs:8:7 | LL | #[doc(alias = 0)] | ^^^^^^^^^ -error: doc alias attribute expects a string: #[doc(alias = "a")] - --> $DIR/check-doc-alias-attr.rs:8:7 - | -LL | #[doc(alias("bar"))] - | ^^^^^^^^^^^^ - error: '\"' character isn't allowed in `#[doc(alias = "...")]` --> $DIR/check-doc-alias-attr.rs:9:15 | @@ -54,5 +48,61 @@ error: `#[doc(alias = "...")]` cannot start or end with ' ' LL | #[doc(alias = "hello ")] | ^^^^^^^^ -error: aborting due to 9 previous errors +error: `#[doc(alias = "...")]` attribute cannot have empty value + --> $DIR/check-doc-alias-attr.rs:16:15 + | +LL | #[doc(alias = "")] + | ^^ + +error: `#[doc(alias("a"))]` expects string literals + --> $DIR/check-doc-alias-attr.rs:19:13 + | +LL | #[doc(alias(0))] + | ^ + +error: '\"' character isn't allowed in `#[doc(alias("..."))]` + --> $DIR/check-doc-alias-attr.rs:20:13 + | +LL | #[doc(alias("\""))] + | ^^^^ + +error: '\n' character isn't allowed in `#[doc(alias("..."))]` + --> $DIR/check-doc-alias-attr.rs:21:13 + | +LL | #[doc(alias("\n"))] + | ^^^^ + +error: '\n' character isn't allowed in `#[doc(alias("..."))]` + --> $DIR/check-doc-alias-attr.rs:22:13 + | +LL | #[doc(alias(" + | _____________^ +LL | | "))] + | |_^ + +error: '\t' character isn't allowed in `#[doc(alias("..."))]` + --> $DIR/check-doc-alias-attr.rs:24:13 + | +LL | #[doc(alias("\t"))] + | ^^^^ + +error: `#[doc(alias("..."))]` cannot start or end with ' ' + --> $DIR/check-doc-alias-attr.rs:25:13 + | +LL | #[doc(alias(" hello"))] + | ^^^^^^^^ + +error: `#[doc(alias("..."))]` cannot start or end with ' ' + --> $DIR/check-doc-alias-attr.rs:26:13 + | +LL | #[doc(alias("hello "))] + | ^^^^^^^^ + +error: `#[doc(alias("..."))]` attribute cannot have empty value + --> $DIR/check-doc-alias-attr.rs:27:13 + | +LL | #[doc(alias(""))] + | ^^ + +error: aborting due to 17 previous errors diff --git a/src/test/rustdoc-ui/check-fail.rs b/src/test/rustdoc-ui/check-fail.rs index 291fc112c3..2355d6a3d6 100644 --- a/src/test/rustdoc-ui/check-fail.rs +++ b/src/test/rustdoc-ui/check-fail.rs @@ -1,7 +1,7 @@ // compile-flags: -Z unstable-options --check #![deny(missing_docs)] -#![deny(rustdoc)] +#![deny(rustdoc::all)] //! ```rust,testharness //~^ ERROR diff --git a/src/test/rustdoc-ui/check-fail.stderr b/src/test/rustdoc-ui/check-fail.stderr index b4f255642d..2758c5490a 100644 --- a/src/test/rustdoc-ui/check-fail.stderr +++ b/src/test/rustdoc-ui/check-fail.stderr @@ -19,9 +19,9 @@ LL | pub fn foo() {} note: the lint level is defined here --> $DIR/check-fail.rs:4:9 | -LL | #![deny(rustdoc)] - | ^^^^^^^ - = note: `#[deny(missing_doc_code_examples)]` implied by `#[deny(rustdoc)]` +LL | #![deny(rustdoc::all)] + | ^^^^^^^^^^^^ + = note: `#[deny(rustdoc::missing_doc_code_examples)]` implied by `#[deny(rustdoc::all)]` error: unknown attribute `testharness`. Did you mean `test_harness`? --> $DIR/check-fail.rs:6:1 @@ -35,9 +35,9 @@ LL | | //! ``` note: the lint level is defined here --> $DIR/check-fail.rs:4:9 | -LL | #![deny(rustdoc)] - | ^^^^^^^ - = note: `#[deny(invalid_codeblock_attributes)]` implied by `#[deny(rustdoc)]` +LL | #![deny(rustdoc::all)] + | ^^^^^^^^^^^^ + = note: `#[deny(rustdoc::invalid_codeblock_attributes)]` implied by `#[deny(rustdoc::all)]` = help: the code block will either not be tested if not marked as a rust one or the code will be wrapped inside a main function error: unknown attribute `testharness`. Did you mean `test_harness`? diff --git a/src/test/rustdoc-ui/check.rs b/src/test/rustdoc-ui/check.rs index 022c56214d..65a56e03d9 100644 --- a/src/test/rustdoc-ui/check.rs +++ b/src/test/rustdoc-ui/check.rs @@ -4,7 +4,7 @@ #![warn(missing_docs)] //~^ WARN //~^^ WARN -#![warn(rustdoc)] +#![warn(rustdoc::all)] pub fn foo() {} //~^ WARN diff --git a/src/test/rustdoc-ui/check.stderr b/src/test/rustdoc-ui/check.stderr index 27e5a73614..2e1fc1eca4 100644 --- a/src/test/rustdoc-ui/check.stderr +++ b/src/test/rustdoc-ui/check.stderr @@ -4,7 +4,7 @@ warning: missing documentation for the crate LL | / #![warn(missing_docs)] LL | | LL | | -LL | | #![warn(rustdoc)] +LL | | #![warn(rustdoc::all)] LL | | LL | | pub fn foo() {} | |_______________^ @@ -21,13 +21,24 @@ warning: missing documentation for a function LL | pub fn foo() {} | ^^^^^^^^^^^^ +warning: no documentation found for this crate's top-level module + | +note: the lint level is defined here + --> $DIR/check.rs:7:9 + | +LL | #![warn(rustdoc::all)] + | ^^^^^^^^^^^^ + = note: `#[warn(rustdoc::missing_crate_level_docs)]` implied by `#[warn(rustdoc::all)]` + = help: The following guide may be of use: + https://doc.rust-lang.org/nightly/rustdoc/how-to-write-documentation.html + warning: missing code example in this documentation --> $DIR/check.rs:4:1 | LL | / #![warn(missing_docs)] LL | | LL | | -LL | | #![warn(rustdoc)] +LL | | #![warn(rustdoc::all)] LL | | LL | | pub fn foo() {} | |_______________^ @@ -35,9 +46,9 @@ LL | | pub fn foo() {} note: the lint level is defined here --> $DIR/check.rs:7:9 | -LL | #![warn(rustdoc)] - | ^^^^^^^ - = note: `#[warn(missing_doc_code_examples)]` implied by `#[warn(rustdoc)]` +LL | #![warn(rustdoc::all)] + | ^^^^^^^^^^^^ + = note: `#[warn(rustdoc::missing_doc_code_examples)]` implied by `#[warn(rustdoc::all)]` warning: missing code example in this documentation --> $DIR/check.rs:9:1 @@ -45,5 +56,5 @@ warning: missing code example in this documentation LL | pub fn foo() {} | ^^^^^^^^^^^^^^^ -warning: 4 warnings emitted +warning: 5 warnings emitted diff --git a/src/test/rustdoc-ui/commandline-argfile-badutf8.args b/src/test/rustdoc-ui/commandline-argfile-badutf8.args new file mode 100644 index 0000000000..c070b0c240 --- /dev/null +++ b/src/test/rustdoc-ui/commandline-argfile-badutf8.args @@ -0,0 +1,2 @@ +--cfg +unbroken€ \ No newline at end of file diff --git a/src/test/rustdoc-ui/commandline-argfile-badutf8.rs b/src/test/rustdoc-ui/commandline-argfile-badutf8.rs new file mode 100644 index 0000000000..e2984e3ca9 --- /dev/null +++ b/src/test/rustdoc-ui/commandline-argfile-badutf8.rs @@ -0,0 +1,12 @@ +// Check to see if we can get parameters from an @argsfile file +// +// compile-flags: --cfg cmdline_set @{{src-base}}/commandline-argfile-badutf8.args + +#[cfg(not(cmdline_set))] +compile_error!("cmdline_set not set"); + +#[cfg(not(unbroken))] +compile_error!("unbroken not set"); + +fn main() { +} diff --git a/src/test/rustdoc-ui/commandline-argfile-badutf8.stderr b/src/test/rustdoc-ui/commandline-argfile-badutf8.stderr new file mode 100644 index 0000000000..9af6fc0a51 --- /dev/null +++ b/src/test/rustdoc-ui/commandline-argfile-badutf8.stderr @@ -0,0 +1,2 @@ +error: Failed to load argument file: Utf8 error in $DIR/commandline-argfile-badutf8.args + diff --git a/src/test/rustdoc-ui/commandline-argfile-missing.rs b/src/test/rustdoc-ui/commandline-argfile-missing.rs new file mode 100644 index 0000000000..020c3ff3c7 --- /dev/null +++ b/src/test/rustdoc-ui/commandline-argfile-missing.rs @@ -0,0 +1,15 @@ +// Check to see if we can get parameters from an @argsfile file +// +// ignore-tidy-linelength +// 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 + +#[cfg(not(cmdline_set))] +compile_error!("cmdline_set not set"); + +#[cfg(not(unbroken))] +compile_error!("unbroken not set"); + +fn main() { +} diff --git a/src/test/rustdoc-ui/commandline-argfile-missing.stderr b/src/test/rustdoc-ui/commandline-argfile-missing.stderr new file mode 100644 index 0000000000..179ad83100 --- /dev/null +++ b/src/test/rustdoc-ui/commandline-argfile-missing.stderr @@ -0,0 +1,2 @@ +error: Failed to load argument file: IO Error: $DIR/commandline-argfile-missing.args: $FILE_MISSING (os error $ERR) + diff --git a/src/test/rustdoc-ui/commandline-argfile.args b/src/test/rustdoc-ui/commandline-argfile.args new file mode 100644 index 0000000000..972938bf6c --- /dev/null +++ b/src/test/rustdoc-ui/commandline-argfile.args @@ -0,0 +1,2 @@ +--cfg +unbroken \ No newline at end of file diff --git a/src/test/rustdoc-ui/commandline-argfile.rs b/src/test/rustdoc-ui/commandline-argfile.rs new file mode 100644 index 0000000000..cc8c8722c1 --- /dev/null +++ b/src/test/rustdoc-ui/commandline-argfile.rs @@ -0,0 +1,13 @@ +// Check to see if we can get parameters from an @argsfile file +// +// check-pass +// compile-flags: --cfg cmdline_set @{{src-base}}/commandline-argfile.args + +#[cfg(not(cmdline_set))] +compile_error!("cmdline_set not set"); + +#[cfg(not(unbroken))] +compile_error!("unbroken not set"); + +fn main() { +} diff --git a/src/test/rustdoc-ui/deny-intra-link-resolution-failure.rs b/src/test/rustdoc-ui/deny-intra-link-resolution-failure.rs index 54e7689f31..09da124b16 100644 --- a/src/test/rustdoc-ui/deny-intra-link-resolution-failure.rs +++ b/src/test/rustdoc-ui/deny-intra-link-resolution-failure.rs @@ -1,4 +1,4 @@ -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] /// [v2] //~ ERROR pub fn foo() {} diff --git a/src/test/rustdoc-ui/deny-intra-link-resolution-failure.stderr b/src/test/rustdoc-ui/deny-intra-link-resolution-failure.stderr index 9ec9dd4bc9..67d9c3989f 100644 --- a/src/test/rustdoc-ui/deny-intra-link-resolution-failure.stderr +++ b/src/test/rustdoc-ui/deny-intra-link-resolution-failure.stderr @@ -7,8 +7,8 @@ LL | /// [v2] note: the lint level is defined here --> $DIR/deny-intra-link-resolution-failure.rs:1:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]` error: aborting due to previous error diff --git a/src/test/rustdoc-ui/deprecated-attrs.rs b/src/test/rustdoc-ui/deprecated-attrs.rs index 0d5dfa733f..5febc5eb9c 100644 --- a/src/test/rustdoc-ui/deprecated-attrs.rs +++ b/src/test/rustdoc-ui/deprecated-attrs.rs @@ -1,7 +1,17 @@ // check-pass +// compile-flags: --passes unknown-pass +// error-pattern: ignoring unknown pass `unknown-pass` -#![doc(no_default_passes, passes = "collapse-docs unindent-comments")] - -struct SomeStruct; - -pub struct OtherStruct; +#![doc(no_default_passes)] +//~^ WARNING attribute is deprecated +//~| NOTE see issue #44136 +//~| HELP use `#![doc(document_private_items)]` +#![doc(passes = "collapse-docs unindent-comments")] +//~^ WARNING attribute is deprecated +//~| NOTE see issue #44136 +//~| WARNING ignoring unknown pass +//~| NOTE `collapse-docs` pass was removed +#![doc(plugins = "xxx")] +//~^ WARNING attribute is deprecated +//~| NOTE see issue #44136 +//~| WARNING no longer functions; see CVE diff --git a/src/test/rustdoc-ui/deprecated-attrs.stderr b/src/test/rustdoc-ui/deprecated-attrs.stderr index f68fb46744..b855cedf52 100644 --- a/src/test/rustdoc-ui/deprecated-attrs.stderr +++ b/src/test/rustdoc-ui/deprecated-attrs.stderr @@ -1,11 +1,42 @@ -warning: the `#![doc(no_default_passes)]` attribute is considered deprecated +warning: the `passes` flag is deprecated | - = warning: see issue #44136 for more information + = note: see issue #44136 for more information + +warning: ignoring unknown pass `unknown-pass` + +warning: the `#![doc(no_default_passes)]` attribute is deprecated + --> $DIR/deprecated-attrs.rs:5:8 + | +LL | #![doc(no_default_passes)] + | ^^^^^^^^^^^^^^^^^ + | + = note: see issue #44136 for more information = help: you may want to use `#![doc(document_private_items)]` -warning: the `#![doc(passes = "...")]` attribute is considered deprecated +warning: the `#![doc(passes = "...")]` attribute is deprecated + --> $DIR/deprecated-attrs.rs:9:8 + | +LL | #![doc(passes = "collapse-docs unindent-comments")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #44136 for more information + +warning: ignoring unknown pass `collapse-docs` + --> $DIR/deprecated-attrs.rs:9:17 + | +LL | #![doc(passes = "collapse-docs unindent-comments")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: the `collapse-docs` pass was removed in #80261 + +warning: the `#![doc(plugins = "...")]` attribute is deprecated + --> $DIR/deprecated-attrs.rs:14:8 + | +LL | #![doc(plugins = "xxx")] + | ^^^^^^^^^^^^^^^ | - = warning: see issue #44136 for more information + = note: see issue #44136 for more information + = warning: `#![doc(plugins = "...")]` no longer functions; see CVE-2018-1000622 -warning: 2 warnings emitted +warning: 5 warnings emitted diff --git a/src/test/rustdoc-ui/doc-alias-crate-level.stderr b/src/test/rustdoc-ui/doc-alias-crate-level.stderr index 9e746cba05..fc8095e03c 100644 --- a/src/test/rustdoc-ui/doc-alias-crate-level.stderr +++ b/src/test/rustdoc-ui/doc-alias-crate-level.stderr @@ -4,7 +4,7 @@ error: '\'' character isn't allowed in `#[doc(alias = "...")]` LL | #[doc(alias = "shouldn't work!")] | ^^^^^^^^^^^^^^^^^ -error: `#![doc(alias = "...")]` isn't allowed as a crate level attribute +error: `#![doc(alias = "...")]` isn't allowed as a crate-level attribute --> $DIR/doc-alias-crate-level.rs:1:8 | LL | #![doc(alias = "crate-level-not-working")] diff --git a/src/test/rustdoc-ui/doc-attr.rs b/src/test/rustdoc-ui/doc-attr.rs new file mode 100644 index 0000000000..980d1c0e20 --- /dev/null +++ b/src/test/rustdoc-ui/doc-attr.rs @@ -0,0 +1,25 @@ +#![crate_type = "lib"] +#![deny(warnings)] +#![doc(as_ptr)] +//~^ ERROR unknown `doc` attribute +//~^^ WARN + +#[doc(as_ptr)] +//~^ ERROR unknown `doc` attribute +//~^^ WARN +pub fn foo() {} + +#[doc(123)] +//~^ ERROR invalid `doc` attribute +//~| WARN +#[doc("hello", "bar")] +//~^ ERROR invalid `doc` attribute +//~| WARN +//~| ERROR invalid `doc` attribute +//~| WARN +#[doc(foo::bar, crate::bar::baz = "bye")] +//~^ ERROR unknown `doc` attribute +//~| WARN +//~| ERROR unknown `doc` attribute +//~| WARN +fn bar() {} diff --git a/src/test/rustdoc-ui/doc-attr.stderr b/src/test/rustdoc-ui/doc-attr.stderr new file mode 100644 index 0000000000..cc2494c92e --- /dev/null +++ b/src/test/rustdoc-ui/doc-attr.stderr @@ -0,0 +1,71 @@ +error: unknown `doc` attribute `as_ptr` + --> $DIR/doc-attr.rs:7:7 + | +LL | #[doc(as_ptr)] + | ^^^^^^ + | +note: the lint level is defined here + --> $DIR/doc-attr.rs:2:9 + | +LL | #![deny(warnings)] + | ^^^^^^^^ + = note: `#[deny(invalid_doc_attributes)]` implied by `#[deny(warnings)]` + = 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 #82730 + +error: invalid `doc` attribute + --> $DIR/doc-attr.rs:12:7 + | +LL | #[doc(123)] + | ^^^ + | + = 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 #82730 + +error: invalid `doc` attribute + --> $DIR/doc-attr.rs:15:7 + | +LL | #[doc("hello", "bar")] + | ^^^^^^^ + | + = 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 #82730 + +error: invalid `doc` attribute + --> $DIR/doc-attr.rs:15:16 + | +LL | #[doc("hello", "bar")] + | ^^^^^ + | + = 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 #82730 + +error: unknown `doc` attribute `foo::bar` + --> $DIR/doc-attr.rs:20:7 + | +LL | #[doc(foo::bar, crate::bar::baz = "bye")] + | ^^^^^^^^ + | + = 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 #82730 + +error: unknown `doc` attribute `crate::bar::baz` + --> $DIR/doc-attr.rs:20:17 + | +LL | #[doc(foo::bar, crate::bar::baz = "bye")] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = 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 #82730 + +error: unknown `doc` attribute `as_ptr` + --> $DIR/doc-attr.rs:3:8 + | +LL | #![doc(as_ptr)] + | ^^^^^^ + | + = 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 #82730 + +error: aborting due to 7 previous errors + diff --git a/src/test/rustdoc-ui/doc-attr2.rs b/src/test/rustdoc-ui/doc-attr2.rs new file mode 100644 index 0000000000..3fb484644d --- /dev/null +++ b/src/test/rustdoc-ui/doc-attr2.rs @@ -0,0 +1,11 @@ +#![crate_type = "lib"] +#![deny(warnings)] + +#[doc(test(no_crate_inject))] //~ ERROR +//~^ WARN +pub fn foo() {} + +pub mod bar { + #![doc(test(no_crate_inject))] //~ ERROR + //~^ WARN +} diff --git a/src/test/rustdoc-ui/doc-attr2.stderr b/src/test/rustdoc-ui/doc-attr2.stderr new file mode 100644 index 0000000000..643107318b --- /dev/null +++ b/src/test/rustdoc-ui/doc-attr2.stderr @@ -0,0 +1,26 @@ +error: `#![doc(test(...)]` is only allowed as a crate-level attribute + --> $DIR/doc-attr2.rs:4:7 + | +LL | #[doc(test(no_crate_inject))] + | ^^^^^^^^^^^^^^^^^^^^^ + | +note: the lint level is defined here + --> $DIR/doc-attr2.rs:2:9 + | +LL | #![deny(warnings)] + | ^^^^^^^^ + = note: `#[deny(invalid_doc_attributes)]` implied by `#[deny(warnings)]` + = 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 #82730 + +error: `#![doc(test(...)]` is only allowed as a crate-level attribute + --> $DIR/doc-attr2.rs:9:12 + | +LL | #![doc(test(no_crate_inject))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = 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 #82730 + +error: aborting due to 2 previous errors + diff --git a/src/test/rustdoc-ui/doc-without-codeblock.rs b/src/test/rustdoc-ui/doc-without-codeblock.rs index 5ad8e8a826..6812a45415 100644 --- a/src/test/rustdoc-ui/doc-without-codeblock.rs +++ b/src/test/rustdoc-ui/doc-without-codeblock.rs @@ -1,4 +1,4 @@ -#![deny(missing_doc_code_examples)] //~ ERROR missing code example in this documentation +#![deny(rustdoc::missing_doc_code_examples)] //~ ERROR missing code example in this documentation /// Some docs. //~^ ERROR missing code example in this documentation diff --git a/src/test/rustdoc-ui/doc-without-codeblock.stderr b/src/test/rustdoc-ui/doc-without-codeblock.stderr index 3372304f44..aac537e978 100644 --- a/src/test/rustdoc-ui/doc-without-codeblock.stderr +++ b/src/test/rustdoc-ui/doc-without-codeblock.stderr @@ -1,7 +1,7 @@ error: missing code example in this documentation --> $DIR/doc-without-codeblock.rs:1:1 | -LL | / #![deny(missing_doc_code_examples)] +LL | / #![deny(rustdoc::missing_doc_code_examples)] LL | | LL | | /// Some docs. LL | | @@ -13,8 +13,8 @@ LL | | } note: the lint level is defined here --> $DIR/doc-without-codeblock.rs:1:9 | -LL | #![deny(missing_doc_code_examples)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::missing_doc_code_examples)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: missing code example in this documentation --> $DIR/doc-without-codeblock.rs:7:1 diff --git a/src/test/rustdoc-ui/error-in-impl-trait/trait-alias-closure.rs b/src/test/rustdoc-ui/error-in-impl-trait/trait-alias-closure.rs index 31dd786cbb..3e7b428023 100644 --- a/src/test/rustdoc-ui/error-in-impl-trait/trait-alias-closure.rs +++ b/src/test/rustdoc-ui/error-in-impl-trait/trait-alias-closure.rs @@ -1,5 +1,5 @@ // check-pass -#![feature(type_alias_impl_trait)] +#![feature(min_type_alias_impl_trait)] pub trait ValidTrait {} type ImplTrait = impl ValidTrait; diff --git a/src/test/rustdoc-ui/error-in-impl-trait/trait-alias.rs b/src/test/rustdoc-ui/error-in-impl-trait/trait-alias.rs index c18a024af4..7ebf4d544d 100644 --- a/src/test/rustdoc-ui/error-in-impl-trait/trait-alias.rs +++ b/src/test/rustdoc-ui/error-in-impl-trait/trait-alias.rs @@ -1,5 +1,5 @@ // check-pass -#![feature(type_alias_impl_trait)] +#![feature(min_type_alias_impl_trait)] pub trait ValidTrait {} type ImplTrait = impl ValidTrait; diff --git a/src/test/rustdoc-ui/intra-doc/alias-ice.rs b/src/test/rustdoc-ui/intra-doc/alias-ice.rs index c053e378e7..51922caeb2 100644 --- a/src/test/rustdoc-ui/intra-doc/alias-ice.rs +++ b/src/test/rustdoc-ui/intra-doc/alias-ice.rs @@ -1,4 +1,4 @@ -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] pub type TypeAlias = usize; diff --git a/src/test/rustdoc-ui/intra-doc/alias-ice.stderr b/src/test/rustdoc-ui/intra-doc/alias-ice.stderr index 3db5fad4cf..5e7ffeeb8a 100644 --- a/src/test/rustdoc-ui/intra-doc/alias-ice.stderr +++ b/src/test/rustdoc-ui/intra-doc/alias-ice.stderr @@ -7,8 +7,8 @@ LL | /// [broken cross-reference](TypeAlias::hoge) note: the lint level is defined here --> $DIR/alias-ice.rs:1:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/rustdoc-ui/intra-doc/ambiguity.rs b/src/test/rustdoc-ui/intra-doc/ambiguity.rs index f63435337c..1f3dc722ef 100644 --- a/src/test/rustdoc-ui/intra-doc/ambiguity.rs +++ b/src/test/rustdoc-ui/intra-doc/ambiguity.rs @@ -1,4 +1,4 @@ -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] #![allow(non_camel_case_types)] #![allow(non_upper_case_globals)] diff --git a/src/test/rustdoc-ui/intra-doc/ambiguity.stderr b/src/test/rustdoc-ui/intra-doc/ambiguity.stderr index 7e967dc88b..0f23b9b8ad 100644 --- a/src/test/rustdoc-ui/intra-doc/ambiguity.stderr +++ b/src/test/rustdoc-ui/intra-doc/ambiguity.stderr @@ -7,8 +7,8 @@ LL | /// [true] note: the lint level is defined here --> $DIR/ambiguity.rs:1:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: to link to the module, prefix with `mod@` | LL | /// [mod@true] diff --git a/src/test/rustdoc-ui/intra-doc/anchors.rs b/src/test/rustdoc-ui/intra-doc/anchors.rs index ccefd2e6fa..009b291be1 100644 --- a/src/test/rustdoc-ui/intra-doc/anchors.rs +++ b/src/test/rustdoc-ui/intra-doc/anchors.rs @@ -1,4 +1,4 @@ -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] // A few tests on anchors. diff --git a/src/test/rustdoc-ui/intra-doc/anchors.stderr b/src/test/rustdoc-ui/intra-doc/anchors.stderr index 5b272d960d..97b0cea0c1 100644 --- a/src/test/rustdoc-ui/intra-doc/anchors.stderr +++ b/src/test/rustdoc-ui/intra-doc/anchors.stderr @@ -7,8 +7,8 @@ LL | /// Or maybe [Foo::f#hola]. note: the lint level is defined here --> $DIR/anchors.rs:1:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: `hello#people#!` contains multiple anchors --> $DIR/anchors.rs:31:28 diff --git a/src/test/rustdoc-ui/intra-doc/broken-reexport.rs b/src/test/rustdoc-ui/intra-doc/broken-reexport.rs index ef261359eb..862faa50b4 100644 --- a/src/test/rustdoc-ui/intra-doc/broken-reexport.rs +++ b/src/test/rustdoc-ui/intra-doc/broken-reexport.rs @@ -1,7 +1,7 @@ // aux-build:intra-doc-broken.rs // check-pass -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] extern crate intra_doc_broken; diff --git a/src/test/rustdoc-ui/intra-doc/disambiguator-mismatch.rs b/src/test/rustdoc-ui/intra-doc/disambiguator-mismatch.rs index b9c8e033b1..596623190a 100644 --- a/src/test/rustdoc-ui/intra-doc/disambiguator-mismatch.rs +++ b/src/test/rustdoc-ui/intra-doc/disambiguator-mismatch.rs @@ -1,4 +1,4 @@ -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] //~^ NOTE lint level is defined pub enum S {} diff --git a/src/test/rustdoc-ui/intra-doc/disambiguator-mismatch.stderr b/src/test/rustdoc-ui/intra-doc/disambiguator-mismatch.stderr index 2f5f3daa29..5d4d4a699e 100644 --- a/src/test/rustdoc-ui/intra-doc/disambiguator-mismatch.stderr +++ b/src/test/rustdoc-ui/intra-doc/disambiguator-mismatch.stderr @@ -7,8 +7,8 @@ LL | /// Link to [struct@S] note: the lint level is defined here --> $DIR/disambiguator-mismatch.rs:1:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: this link resolved to an enum, which is not a struct error: incompatible link kind for `S` diff --git a/src/test/rustdoc-ui/intra-doc/double-anchor.stderr b/src/test/rustdoc-ui/intra-doc/double-anchor.stderr index 1cd9231ede..c0241b98b7 100644 --- a/src/test/rustdoc-ui/intra-doc/double-anchor.stderr +++ b/src/test/rustdoc-ui/intra-doc/double-anchor.stderr @@ -4,7 +4,7 @@ warning: `with#anchor#error` contains multiple anchors LL | /// docs [label][with#anchor#error] | ^^^^^^^^^^^^^^^^^ contains invalid anchor | - = note: `#[warn(broken_intra_doc_links)]` on by default + = note: `#[warn(rustdoc::broken_intra_doc_links)]` on by default warning: 1 warning emitted diff --git a/src/test/rustdoc-ui/intra-doc/errors.rs b/src/test/rustdoc-ui/intra-doc/errors.rs index 81e42643ae..b29f7c29b5 100644 --- a/src/test/rustdoc-ui/intra-doc/errors.rs +++ b/src/test/rustdoc-ui/intra-doc/errors.rs @@ -1,4 +1,4 @@ -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] //~^ NOTE lint level is defined // FIXME: this should say that it was skipped (maybe an allowed by default lint?) diff --git a/src/test/rustdoc-ui/intra-doc/errors.stderr b/src/test/rustdoc-ui/intra-doc/errors.stderr index 21c806108e..0611517205 100644 --- a/src/test/rustdoc-ui/intra-doc/errors.stderr +++ b/src/test/rustdoc-ui/intra-doc/errors.stderr @@ -7,8 +7,8 @@ LL | /// [path::to::nonexistent::module] note: the lint level is defined here --> $DIR/errors.rs:1:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: unresolved link to `path::to::nonexistent::macro` --> $DIR/errors.rs:11:6 diff --git a/src/test/rustdoc-ui/intra-doc/incompatible-primitive-disambiguator.rs b/src/test/rustdoc-ui/intra-doc/incompatible-primitive-disambiguator.rs index 0d1d5d1134..3088bcd465 100644 --- a/src/test/rustdoc-ui/intra-doc/incompatible-primitive-disambiguator.rs +++ b/src/test/rustdoc-ui/intra-doc/incompatible-primitive-disambiguator.rs @@ -1,3 +1,3 @@ -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] //! [static@u8::MIN] //~^ ERROR incompatible link kind diff --git a/src/test/rustdoc-ui/intra-doc/incompatible-primitive-disambiguator.stderr b/src/test/rustdoc-ui/intra-doc/incompatible-primitive-disambiguator.stderr index ed1c10f9e0..d4dcc493c8 100644 --- a/src/test/rustdoc-ui/intra-doc/incompatible-primitive-disambiguator.stderr +++ b/src/test/rustdoc-ui/intra-doc/incompatible-primitive-disambiguator.stderr @@ -7,8 +7,8 @@ LL | //! [static@u8::MIN] note: the lint level is defined here --> $DIR/incompatible-primitive-disambiguator.rs:1:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = note: this link resolved to an associated constant, which is not a static error: aborting due to previous error diff --git a/src/test/rustdoc-ui/intra-doc/malformed-generics.rs b/src/test/rustdoc-ui/intra-doc/malformed-generics.rs index 9c54092146..15e02925ed 100644 --- a/src/test/rustdoc-ui/intra-doc/malformed-generics.rs +++ b/src/test/rustdoc-ui/intra-doc/malformed-generics.rs @@ -1,4 +1,4 @@ -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] //! [Vec<] //~ ERROR //! [Vec $DIR/malformed-generics.rs:1:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: unresolved link to `Vec $DIR/malformed-generics.rs:4:6 diff --git a/src/test/rustdoc-ui/intra-doc/non-path-primitives.rs b/src/test/rustdoc-ui/intra-doc/non-path-primitives.rs index 6785c4c43f..75159979e8 100644 --- a/src/test/rustdoc-ui/intra-doc/non-path-primitives.rs +++ b/src/test/rustdoc-ui/intra-doc/non-path-primitives.rs @@ -1,4 +1,4 @@ -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] #![feature(intra_doc_pointers)] // These are links that could reasonably expected to work, but don't. diff --git a/src/test/rustdoc-ui/intra-doc/non-path-primitives.stderr b/src/test/rustdoc-ui/intra-doc/non-path-primitives.stderr index 174758504a..610c830560 100644 --- a/src/test/rustdoc-ui/intra-doc/non-path-primitives.stderr +++ b/src/test/rustdoc-ui/intra-doc/non-path-primitives.stderr @@ -7,8 +7,8 @@ LL | //! [[T]::rotate_left] note: the lint level is defined here --> $DIR/non-path-primitives.rs:1:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]` error: unresolved link to `Z` diff --git a/src/test/rustdoc-ui/intra-doc/prim-conflict.rs b/src/test/rustdoc-ui/intra-doc/prim-conflict.rs index 85738ceae8..2c1a8b5357 100644 --- a/src/test/rustdoc-ui/intra-doc/prim-conflict.rs +++ b/src/test/rustdoc-ui/intra-doc/prim-conflict.rs @@ -1,4 +1,4 @@ -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] //~^ NOTE lint level is defined /// [char] diff --git a/src/test/rustdoc-ui/intra-doc/prim-conflict.stderr b/src/test/rustdoc-ui/intra-doc/prim-conflict.stderr index 01275f8d9a..e4bd9fd4b8 100644 --- a/src/test/rustdoc-ui/intra-doc/prim-conflict.stderr +++ b/src/test/rustdoc-ui/intra-doc/prim-conflict.stderr @@ -7,8 +7,8 @@ LL | /// [char] note: the lint level is defined here --> $DIR/prim-conflict.rs:1:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: to link to the module, prefix with `mod@` | LL | /// [mod@char] diff --git a/src/test/rustdoc-ui/intra-doc/private.private.stderr b/src/test/rustdoc-ui/intra-doc/private.private.stderr index 6e11ec3e87..cae5b1f20e 100644 --- a/src/test/rustdoc-ui/intra-doc/private.private.stderr +++ b/src/test/rustdoc-ui/intra-doc/private.private.stderr @@ -1,11 +1,19 @@ warning: public documentation for `DocMe` links to private item `DontDocMe` --> $DIR/private.rs:5:11 | -LL | /// docs [DontDocMe] +LL | /// docs [DontDocMe] [DontDocMe::f] | ^^^^^^^^^ this item is private | - = note: `#[warn(private_intra_doc_links)]` on by default + = note: `#[warn(rustdoc::private_intra_doc_links)]` on by default = note: this link resolves only because you passed `--document-private-items`, but will break without -warning: 1 warning emitted +warning: public documentation for `DocMe` links to private item `DontDocMe::f` + --> $DIR/private.rs:5:23 + | +LL | /// docs [DontDocMe] [DontDocMe::f] + | ^^^^^^^^^^^^ this item is private + | + = note: this link resolves only because you passed `--document-private-items`, but will break without + +warning: 2 warnings emitted diff --git a/src/test/rustdoc-ui/intra-doc/private.public.stderr b/src/test/rustdoc-ui/intra-doc/private.public.stderr index 3a6a4b6645..05b202e37f 100644 --- a/src/test/rustdoc-ui/intra-doc/private.public.stderr +++ b/src/test/rustdoc-ui/intra-doc/private.public.stderr @@ -1,11 +1,19 @@ warning: public documentation for `DocMe` links to private item `DontDocMe` --> $DIR/private.rs:5:11 | -LL | /// docs [DontDocMe] +LL | /// docs [DontDocMe] [DontDocMe::f] | ^^^^^^^^^ this item is private | - = note: `#[warn(private_intra_doc_links)]` on by default + = note: `#[warn(rustdoc::private_intra_doc_links)]` on by default = note: this link will resolve properly if you pass `--document-private-items` -warning: 1 warning emitted +warning: public documentation for `DocMe` links to private item `DontDocMe::f` + --> $DIR/private.rs:5:23 + | +LL | /// docs [DontDocMe] [DontDocMe::f] + | ^^^^^^^^^^^^ this item is private + | + = note: this link will resolve properly if you pass `--document-private-items` + +warning: 2 warnings emitted diff --git a/src/test/rustdoc-ui/intra-doc/private.rs b/src/test/rustdoc-ui/intra-doc/private.rs index 613236d75d..3782864305 100644 --- a/src/test/rustdoc-ui/intra-doc/private.rs +++ b/src/test/rustdoc-ui/intra-doc/private.rs @@ -2,8 +2,13 @@ // revisions: public private // [private]compile-flags: --document-private-items -/// docs [DontDocMe] +/// docs [DontDocMe] [DontDocMe::f] //~^ WARNING public documentation for `DocMe` links to private item `DontDocMe` +//~| WARNING public documentation for `DocMe` links to private item `DontDocMe::f` // FIXME: for [private] we should also make sure the link was actually generated pub struct DocMe; struct DontDocMe; + +impl DontDocMe { + fn f() {} +} diff --git a/src/test/rustdoc-ui/intra-doc/span-ice-55723.rs b/src/test/rustdoc-ui/intra-doc/span-ice-55723.rs index 7764a6df6e..041ec29325 100644 --- a/src/test/rustdoc-ui/intra-doc/span-ice-55723.rs +++ b/src/test/rustdoc-ui/intra-doc/span-ice-55723.rs @@ -1,4 +1,4 @@ -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] // An error in calculating spans while reporting intra-doc link resolution errors caused rustdoc to // attempt to slice in the middle of a multibyte character. See diff --git a/src/test/rustdoc-ui/intra-doc/span-ice-55723.stderr b/src/test/rustdoc-ui/intra-doc/span-ice-55723.stderr index 10ca14e850..bf4ab9fdd1 100644 --- a/src/test/rustdoc-ui/intra-doc/span-ice-55723.stderr +++ b/src/test/rustdoc-ui/intra-doc/span-ice-55723.stderr @@ -7,8 +7,8 @@ LL | /// (arr[i]) note: the lint level is defined here --> $DIR/span-ice-55723.rs:1:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]` error: aborting due to previous error diff --git a/src/test/rustdoc-ui/intra-doc/unused-extern-crate.rs b/src/test/rustdoc-ui/intra-doc/unused-extern-crate.rs index 186503cf69..9565830930 100644 --- a/src/test/rustdoc-ui/intra-doc/unused-extern-crate.rs +++ b/src/test/rustdoc-ui/intra-doc/unused-extern-crate.rs @@ -1,5 +1,5 @@ // compile-flags: --extern zip=whatever.rlib -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] /// See [zip] crate. //~^ ERROR unresolved pub struct ArrayZip; diff --git a/src/test/rustdoc-ui/intra-doc/unused-extern-crate.stderr b/src/test/rustdoc-ui/intra-doc/unused-extern-crate.stderr index b3b57fd131..5c0df1d1b9 100644 --- a/src/test/rustdoc-ui/intra-doc/unused-extern-crate.stderr +++ b/src/test/rustdoc-ui/intra-doc/unused-extern-crate.stderr @@ -7,8 +7,8 @@ LL | /// See [zip] crate. note: the lint level is defined here --> $DIR/unused-extern-crate.rs:2:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]` error: aborting due to previous error diff --git a/src/test/rustdoc-ui/intra-doc/warning-crlf.stderr b/src/test/rustdoc-ui/intra-doc/warning-crlf.stderr index 01e4282003..d46df92649 100644 --- a/src/test/rustdoc-ui/intra-doc/warning-crlf.stderr +++ b/src/test/rustdoc-ui/intra-doc/warning-crlf.stderr @@ -4,7 +4,7 @@ warning: unresolved link to `error` LL | /// [error] | ^^^^^ no item named `error` in scope | - = note: `#[warn(broken_intra_doc_links)]` on by default + = note: `#[warn(rustdoc::broken_intra_doc_links)]` on by default = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]` warning: unresolved link to `error1` diff --git a/src/test/rustdoc-ui/intra-doc/warning.stderr b/src/test/rustdoc-ui/intra-doc/warning.stderr index 430d18165a..135c432e05 100644 --- a/src/test/rustdoc-ui/intra-doc/warning.stderr +++ b/src/test/rustdoc-ui/intra-doc/warning.stderr @@ -4,7 +4,7 @@ warning: unresolved link to `Foo::baz` LL | //! Test with [Foo::baz], [Bar::foo], ... | ^^^^^^^^ the struct `Foo` has no field or associated item named `baz` | - = note: `#[warn(broken_intra_doc_links)]` on by default + = note: `#[warn(rustdoc::broken_intra_doc_links)]` on by default warning: unresolved link to `Bar::foo` --> $DIR/warning.rs:3:35 diff --git a/src/test/rustdoc-ui/invalid-html-tags.rs b/src/test/rustdoc-ui/invalid-html-tags.rs index 9c2fc4beb5..cec44b6d2c 100644 --- a/src/test/rustdoc-ui/invalid-html-tags.rs +++ b/src/test/rustdoc-ui/invalid-html-tags.rs @@ -1,4 +1,4 @@ -#![deny(invalid_html_tags)] +#![deny(rustdoc::invalid_html_tags)] //!

    💩

    //~^ ERROR unclosed HTML tag `p` diff --git a/src/test/rustdoc-ui/invalid-html-tags.stderr b/src/test/rustdoc-ui/invalid-html-tags.stderr index aa9ace006b..335e100c89 100644 --- a/src/test/rustdoc-ui/invalid-html-tags.stderr +++ b/src/test/rustdoc-ui/invalid-html-tags.stderr @@ -7,8 +7,8 @@ LL | //!

    💩

    (par_iter: P) -> Self + where + P: IntoParallelIterator, + { + let mut map = HashMap::default(); + map.par_extend(par_iter); + map + } +} + +/// Extend a hash map with items from a parallel iterator. +impl ParallelExtend<(K, V)> for HashMap +where + K: Eq + Hash + Send, + V: Send, + S: BuildHasher, +{ + fn par_extend(&mut self, par_iter: I) + where + I: IntoParallelIterator, + { + extend(self, par_iter); + } +} + +/// Extend a hash map with copied items from a parallel iterator. +impl<'a, K, V, S> ParallelExtend<(&'a K, &'a V)> for HashMap +where + K: Copy + Eq + Hash + Sync, + V: Copy + Sync, + S: BuildHasher, +{ + fn par_extend(&mut self, par_iter: I) + where + I: IntoParallelIterator, + { + extend(self, par_iter); + } +} + +// This is equal to the normal `HashMap` -- no custom advantage. +fn extend(map: &mut HashMap, par_iter: I) +where + K: Eq + Hash, + S: BuildHasher, + I: IntoParallelIterator, + HashMap: Extend, +{ + let (list, len) = super::helpers::collect(par_iter); + + // Keys may be already present or show multiple times in the iterator. + // Reserve the entire length if the map is empty. + // Otherwise reserve half the length (rounded up), so the map + // will only resize twice in the worst case. + let reserve = if map.is_empty() { len } else { (len + 1) / 2 }; + map.reserve(reserve); + for vec in list { + map.extend(vec); + } +} + +#[cfg(test)] +mod test_par_map { + use alloc::vec::Vec; + use core::hash::{Hash, Hasher}; + use core::sync::atomic::{AtomicUsize, Ordering}; + + use rayon::prelude::*; + + use crate::hash_map::HashMap; + + struct Dropable<'a> { + k: usize, + counter: &'a AtomicUsize, + } + + impl Dropable<'_> { + fn new(k: usize, counter: &AtomicUsize) -> Dropable<'_> { + counter.fetch_add(1, Ordering::Relaxed); + + Dropable { k, counter } + } + } + + impl Drop for Dropable<'_> { + fn drop(&mut self) { + self.counter.fetch_sub(1, Ordering::Relaxed); + } + } + + impl Clone for Dropable<'_> { + fn clone(&self) -> Self { + Dropable::new(self.k, self.counter) + } + } + + impl Hash for Dropable<'_> { + fn hash(&self, state: &mut H) + where + H: Hasher, + { + self.k.hash(state) + } + } + + impl PartialEq for Dropable<'_> { + fn eq(&self, other: &Self) -> bool { + self.k == other.k + } + } + + impl Eq for Dropable<'_> {} + + #[test] + fn test_into_iter_drops() { + let key = AtomicUsize::new(0); + let value = AtomicUsize::new(0); + + let hm = { + let mut hm = HashMap::new(); + + assert_eq!(key.load(Ordering::Relaxed), 0); + assert_eq!(value.load(Ordering::Relaxed), 0); + + for i in 0..100 { + let d1 = Dropable::new(i, &key); + let d2 = Dropable::new(i + 100, &value); + hm.insert(d1, d2); + } + + assert_eq!(key.load(Ordering::Relaxed), 100); + assert_eq!(value.load(Ordering::Relaxed), 100); + + hm + }; + + // By the way, ensure that cloning doesn't screw up the dropping. + drop(hm.clone()); + + assert_eq!(key.load(Ordering::Relaxed), 100); + assert_eq!(value.load(Ordering::Relaxed), 100); + + // Ensure that dropping the iterator does not leak anything. + drop(hm.clone().into_par_iter()); + + { + assert_eq!(key.load(Ordering::Relaxed), 100); + assert_eq!(value.load(Ordering::Relaxed), 100); + + // retain only half + let _v: Vec<_> = hm + .into_par_iter() + .filter(|&(ref key, _)| key.k < 50) + .collect(); + + assert_eq!(key.load(Ordering::Relaxed), 50); + assert_eq!(value.load(Ordering::Relaxed), 50); + }; + + assert_eq!(key.load(Ordering::Relaxed), 0); + assert_eq!(value.load(Ordering::Relaxed), 0); + } + + #[test] + fn test_drain_drops() { + let key = AtomicUsize::new(0); + let value = AtomicUsize::new(0); + + let mut hm = { + let mut hm = HashMap::new(); + + assert_eq!(key.load(Ordering::Relaxed), 0); + assert_eq!(value.load(Ordering::Relaxed), 0); + + for i in 0..100 { + let d1 = Dropable::new(i, &key); + let d2 = Dropable::new(i + 100, &value); + hm.insert(d1, d2); + } + + assert_eq!(key.load(Ordering::Relaxed), 100); + assert_eq!(value.load(Ordering::Relaxed), 100); + + hm + }; + + // By the way, ensure that cloning doesn't screw up the dropping. + drop(hm.clone()); + + assert_eq!(key.load(Ordering::Relaxed), 100); + assert_eq!(value.load(Ordering::Relaxed), 100); + + // Ensure that dropping the drain iterator does not leak anything. + drop(hm.clone().par_drain()); + + { + assert_eq!(key.load(Ordering::Relaxed), 100); + assert_eq!(value.load(Ordering::Relaxed), 100); + + // retain only half + let _v: Vec<_> = hm.drain().filter(|&(ref key, _)| key.k < 50).collect(); + assert!(hm.is_empty()); + + assert_eq!(key.load(Ordering::Relaxed), 50); + assert_eq!(value.load(Ordering::Relaxed), 50); + }; + + assert_eq!(key.load(Ordering::Relaxed), 0); + assert_eq!(value.load(Ordering::Relaxed), 0); + } + + #[test] + fn test_empty_iter() { + let mut m: HashMap = HashMap::new(); + assert_eq!(m.par_drain().count(), 0); + assert_eq!(m.par_keys().count(), 0); + assert_eq!(m.par_values().count(), 0); + assert_eq!(m.par_values_mut().count(), 0); + assert_eq!(m.par_iter().count(), 0); + assert_eq!(m.par_iter_mut().count(), 0); + assert_eq!(m.len(), 0); + assert!(m.is_empty()); + assert_eq!(m.into_par_iter().count(), 0); + } + + #[test] + fn test_iterate() { + let mut m = HashMap::with_capacity(4); + for i in 0..32 { + assert!(m.insert(i, i * 2).is_none()); + } + assert_eq!(m.len(), 32); + + let observed = AtomicUsize::new(0); + + m.par_iter().for_each(|(k, v)| { + assert_eq!(*v, *k * 2); + observed.fetch_or(1 << *k, Ordering::Relaxed); + }); + assert_eq!(observed.into_inner(), 0xFFFF_FFFF); + } + + #[test] + fn test_keys() { + let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')]; + let map: HashMap<_, _> = vec.into_par_iter().collect(); + let keys: Vec<_> = map.par_keys().cloned().collect(); + assert_eq!(keys.len(), 3); + assert!(keys.contains(&1)); + assert!(keys.contains(&2)); + assert!(keys.contains(&3)); + } + + #[test] + fn test_values() { + let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')]; + let map: HashMap<_, _> = vec.into_par_iter().collect(); + let values: Vec<_> = map.par_values().cloned().collect(); + assert_eq!(values.len(), 3); + assert!(values.contains(&'a')); + assert!(values.contains(&'b')); + assert!(values.contains(&'c')); + } + + #[test] + fn test_values_mut() { + let vec = vec![(1, 1), (2, 2), (3, 3)]; + let mut map: HashMap<_, _> = vec.into_par_iter().collect(); + map.par_values_mut().for_each(|value| *value = (*value) * 2); + let values: Vec<_> = map.par_values().cloned().collect(); + assert_eq!(values.len(), 3); + assert!(values.contains(&2)); + assert!(values.contains(&4)); + assert!(values.contains(&6)); + } + + #[test] + fn test_eq() { + let mut m1 = HashMap::new(); + m1.insert(1, 2); + m1.insert(2, 3); + m1.insert(3, 4); + + let mut m2 = HashMap::new(); + m2.insert(1, 2); + m2.insert(2, 3); + + assert!(!m1.par_eq(&m2)); + + m2.insert(3, 4); + + assert!(m1.par_eq(&m2)); + } + + #[test] + fn test_from_iter() { + let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]; + + let map: HashMap<_, _> = xs.par_iter().cloned().collect(); + + for &(k, v) in &xs { + assert_eq!(map.get(&k), Some(&v)); + } + } + + #[test] + fn test_extend_ref() { + let mut a = HashMap::new(); + a.insert(1, "one"); + let mut b = HashMap::new(); + b.insert(2, "two"); + b.insert(3, "three"); + + a.par_extend(&b); + + assert_eq!(a.len(), 3); + assert_eq!(a[&1], "one"); + assert_eq!(a[&2], "two"); + assert_eq!(a[&3], "three"); + } +} diff --git a/vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/mod.rs b/vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/mod.rs new file mode 100644 index 0000000000..99337a1ce3 --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/mod.rs @@ -0,0 +1,4 @@ +mod helpers; +pub(crate) mod map; +pub(crate) mod raw; +pub(crate) mod set; diff --git a/vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/raw.rs b/vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/raw.rs new file mode 100644 index 0000000000..1bd2c1779c --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/raw.rs @@ -0,0 +1,199 @@ +use crate::raw::Bucket; +use crate::raw::{RawIter, RawIterRange, RawTable}; +use crate::scopeguard::guard; +use alloc::alloc::dealloc; +use core::marker::PhantomData; +use core::mem; +use core::ptr::NonNull; +use rayon::iter::{ + plumbing::{self, Folder, UnindexedConsumer, UnindexedProducer}, + ParallelIterator, +}; + +/// Parallel iterator which returns a raw pointer to every full bucket in the table. +pub struct RawParIter { + iter: RawIterRange, +} + +impl From> for RawParIter { + fn from(it: RawIter) -> Self { + RawParIter { iter: it.iter } + } +} + +impl ParallelIterator for RawParIter { + type Item = Bucket; + + #[cfg_attr(feature = "inline-more", inline)] + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + let producer = ParIterProducer { iter: self.iter }; + plumbing::bridge_unindexed(producer, consumer) + } +} + +/// Producer which returns a `Bucket` for every element. +struct ParIterProducer { + iter: RawIterRange, +} + +impl UnindexedProducer for ParIterProducer { + type Item = Bucket; + + #[cfg_attr(feature = "inline-more", inline)] + fn split(self) -> (Self, Option) { + let (left, right) = self.iter.split(); + let left = ParIterProducer { iter: left }; + let right = right.map(|right| ParIterProducer { iter: right }); + (left, right) + } + + #[cfg_attr(feature = "inline-more", inline)] + fn fold_with(self, folder: F) -> F + where + F: Folder, + { + folder.consume_iter(self.iter) + } +} + +/// Parallel iterator which consumes a table and returns elements. +pub struct RawIntoParIter { + table: RawTable, +} + +impl ParallelIterator for RawIntoParIter { + type Item = T; + + #[cfg_attr(feature = "inline-more", inline)] + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + let iter = unsafe { self.table.iter().iter }; + let _guard = guard(self.table.into_alloc(), |alloc| { + if let Some((ptr, layout)) = *alloc { + unsafe { + dealloc(ptr.as_ptr(), layout); + } + } + }); + let producer = ParDrainProducer { iter }; + plumbing::bridge_unindexed(producer, consumer) + } +} + +/// Parallel iterator which consumes elements without freeing the table storage. +pub struct RawParDrain<'a, T> { + // We don't use a &'a mut RawTable because we want RawParDrain to be + // covariant over T. + table: NonNull>, + marker: PhantomData<&'a RawTable>, +} + +unsafe impl Send for RawParDrain<'_, T> {} + +impl ParallelIterator for RawParDrain<'_, T> { + type Item = T; + + #[cfg_attr(feature = "inline-more", inline)] + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + let _guard = guard(self.table, |table| unsafe { + table.as_mut().clear_no_drop() + }); + let iter = unsafe { self.table.as_ref().iter().iter }; + mem::forget(self); + let producer = ParDrainProducer { iter }; + plumbing::bridge_unindexed(producer, consumer) + } +} + +impl Drop for RawParDrain<'_, T> { + fn drop(&mut self) { + // If drive_unindexed is not called then simply clear the table. + unsafe { self.table.as_mut().clear() } + } +} + +/// Producer which will consume all elements in the range, even if it is dropped +/// halfway through. +struct ParDrainProducer { + iter: RawIterRange, +} + +impl UnindexedProducer for ParDrainProducer { + type Item = T; + + #[cfg_attr(feature = "inline-more", inline)] + fn split(self) -> (Self, Option) { + let (left, right) = self.iter.clone().split(); + mem::forget(self); + let left = ParDrainProducer { iter: left }; + let right = right.map(|right| ParDrainProducer { iter: right }); + (left, right) + } + + #[cfg_attr(feature = "inline-more", inline)] + fn fold_with(mut self, mut folder: F) -> F + where + F: Folder, + { + // Make sure to modify the iterator in-place so that any remaining + // elements are processed in our Drop impl. + while let Some(item) = self.iter.next() { + folder = folder.consume(unsafe { item.read() }); + if folder.full() { + return folder; + } + } + + // If we processed all elements then we don't need to run the drop. + mem::forget(self); + folder + } +} + +impl Drop for ParDrainProducer { + #[cfg_attr(feature = "inline-more", inline)] + fn drop(&mut self) { + // Drop all remaining elements + if mem::needs_drop::() { + while let Some(item) = self.iter.next() { + unsafe { + item.drop(); + } + } + } + } +} + +impl RawTable { + /// Returns a parallel iterator over the elements in a `RawTable`. + #[cfg_attr(feature = "inline-more", inline)] + pub unsafe fn par_iter(&self) -> RawParIter { + RawParIter { + iter: self.iter().iter, + } + } + + /// Returns a parallel iterator over the elements in a `RawTable`. + #[cfg_attr(feature = "inline-more", inline)] + pub fn into_par_iter(self) -> RawIntoParIter { + RawIntoParIter { table: self } + } + + /// Returns a parallel iterator which consumes all elements of a `RawTable` + /// without freeing its memory allocation. + #[cfg_attr(feature = "inline-more", inline)] + pub fn par_drain(&mut self) -> RawParDrain<'_, T> { + RawParDrain { + table: NonNull::from(self), + marker: PhantomData, + } + } +} diff --git a/vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/set.rs b/vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/set.rs new file mode 100644 index 0000000000..53d2660d58 --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/set.rs @@ -0,0 +1,646 @@ +//! Rayon extensions for `HashSet`. + +use crate::hash_set::HashSet; +use core::hash::{BuildHasher, Hash}; +use rayon::iter::plumbing::UnindexedConsumer; +use rayon::iter::{FromParallelIterator, IntoParallelIterator, ParallelExtend, ParallelIterator}; + +/// Parallel iterator over elements of a consumed set. +/// +/// This iterator is created by the [`into_par_iter`] method on [`HashSet`] +/// (provided by the [`IntoParallelIterator`] trait). +/// See its documentation for more. +/// +/// [`into_par_iter`]: /hashbrown/struct.HashSet.html#method.into_par_iter +/// [`HashSet`]: /hashbrown/struct.HashSet.html +/// [`IntoParallelIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelIterator.html +pub struct IntoParIter { + set: HashSet, +} + +impl ParallelIterator for IntoParIter { + type Item = T; + + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + self.set + .map + .into_par_iter() + .map(|(k, _)| k) + .drive_unindexed(consumer) + } +} + +/// Parallel draining iterator over entries of a set. +/// +/// This iterator is created by the [`par_drain`] method on [`HashSet`]. +/// See its documentation for more. +/// +/// [`par_drain`]: /hashbrown/struct.HashSet.html#method.par_drain +/// [`HashSet`]: /hashbrown/struct.HashSet.html +pub struct ParDrain<'a, T, S> { + set: &'a mut HashSet, +} + +impl ParallelIterator for ParDrain<'_, T, S> { + type Item = T; + + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + self.set + .map + .par_drain() + .map(|(k, _)| k) + .drive_unindexed(consumer) + } +} + +/// Parallel iterator over shared references to elements in a set. +/// +/// This iterator is created by the [`par_iter`] method on [`HashSet`] +/// (provided by the [`IntoParallelRefIterator`] trait). +/// See its documentation for more. +/// +/// [`par_iter`]: /hashbrown/struct.HashSet.html#method.par_iter +/// [`HashSet`]: /hashbrown/struct.HashSet.html +/// [`IntoParallelRefIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelRefIterator.html +pub struct ParIter<'a, T, S> { + set: &'a HashSet, +} + +impl<'a, T: Sync, S: Sync> ParallelIterator for ParIter<'a, T, S> { + type Item = &'a T; + + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + self.set.map.par_keys().drive_unindexed(consumer) + } +} + +/// Parallel iterator over shared references to elements in the difference of +/// sets. +/// +/// This iterator is created by the [`par_difference`] method on [`HashSet`]. +/// See its documentation for more. +/// +/// [`par_difference`]: /hashbrown/struct.HashSet.html#method.par_difference +/// [`HashSet`]: /hashbrown/struct.HashSet.html +pub struct ParDifference<'a, T, S> { + a: &'a HashSet, + b: &'a HashSet, +} + +impl<'a, T, S> ParallelIterator for ParDifference<'a, T, S> +where + T: Eq + Hash + Sync, + S: BuildHasher + Sync, +{ + type Item = &'a T; + + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + self.a + .into_par_iter() + .filter(|&x| !self.b.contains(x)) + .drive_unindexed(consumer) + } +} + +/// Parallel iterator over shared references to elements in the symmetric +/// difference of sets. +/// +/// This iterator is created by the [`par_symmetric_difference`] method on +/// [`HashSet`]. +/// See its documentation for more. +/// +/// [`par_symmetric_difference`]: /hashbrown/struct.HashSet.html#method.par_symmetric_difference +/// [`HashSet`]: /hashbrown/struct.HashSet.html +pub struct ParSymmetricDifference<'a, T, S> { + a: &'a HashSet, + b: &'a HashSet, +} + +impl<'a, T, S> ParallelIterator for ParSymmetricDifference<'a, T, S> +where + T: Eq + Hash + Sync, + S: BuildHasher + Sync, +{ + type Item = &'a T; + + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + self.a + .par_difference(self.b) + .chain(self.b.par_difference(self.a)) + .drive_unindexed(consumer) + } +} + +/// Parallel iterator over shared references to elements in the intersection of +/// sets. +/// +/// This iterator is created by the [`par_intersection`] method on [`HashSet`]. +/// See its documentation for more. +/// +/// [`par_intersection`]: /hashbrown/struct.HashSet.html#method.par_intersection +/// [`HashSet`]: /hashbrown/struct.HashSet.html +pub struct ParIntersection<'a, T, S> { + a: &'a HashSet, + b: &'a HashSet, +} + +impl<'a, T, S> ParallelIterator for ParIntersection<'a, T, S> +where + T: Eq + Hash + Sync, + S: BuildHasher + Sync, +{ + type Item = &'a T; + + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + self.a + .into_par_iter() + .filter(|&x| self.b.contains(x)) + .drive_unindexed(consumer) + } +} + +/// Parallel iterator over shared references to elements in the union of sets. +/// +/// This iterator is created by the [`par_union`] method on [`HashSet`]. +/// See its documentation for more. +/// +/// [`par_union`]: /hashbrown/struct.HashSet.html#method.par_union +/// [`HashSet`]: /hashbrown/struct.HashSet.html +pub struct ParUnion<'a, T, S> { + a: &'a HashSet, + b: &'a HashSet, +} + +impl<'a, T, S> ParallelIterator for ParUnion<'a, T, S> +where + T: Eq + Hash + Sync, + S: BuildHasher + Sync, +{ + type Item = &'a T; + + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + self.a + .into_par_iter() + .chain(self.b.par_difference(self.a)) + .drive_unindexed(consumer) + } +} + +impl HashSet +where + T: Eq + Hash + Sync, + S: BuildHasher + Sync, +{ + /// Visits (potentially in parallel) the values representing the difference, + /// i.e. the values that are in `self` but not in `other`. + #[cfg_attr(feature = "inline-more", inline)] + pub fn par_difference<'a>(&'a self, other: &'a Self) -> ParDifference<'a, T, S> { + ParDifference { a: self, b: other } + } + + /// Visits (potentially in parallel) the values representing the symmetric + /// difference, i.e. the values that are in `self` or in `other` but not in both. + #[cfg_attr(feature = "inline-more", inline)] + pub fn par_symmetric_difference<'a>( + &'a self, + other: &'a Self, + ) -> ParSymmetricDifference<'a, T, S> { + ParSymmetricDifference { a: self, b: other } + } + + /// Visits (potentially in parallel) the values representing the + /// intersection, i.e. the values that are both in `self` and `other`. + #[cfg_attr(feature = "inline-more", inline)] + pub fn par_intersection<'a>(&'a self, other: &'a Self) -> ParIntersection<'a, T, S> { + ParIntersection { a: self, b: other } + } + + /// Visits (potentially in parallel) the values representing the union, + /// i.e. all the values in `self` or `other`, without duplicates. + #[cfg_attr(feature = "inline-more", inline)] + pub fn par_union<'a>(&'a self, other: &'a Self) -> ParUnion<'a, T, S> { + ParUnion { a: self, b: other } + } + + /// Returns `true` if `self` has no elements in common with `other`. + /// This is equivalent to checking for an empty intersection. + /// + /// This method runs in a potentially parallel fashion. + pub fn par_is_disjoint(&self, other: &Self) -> bool { + self.into_par_iter().all(|x| !other.contains(x)) + } + + /// Returns `true` if the set is a subset of another, + /// i.e. `other` contains at least all the values in `self`. + /// + /// This method runs in a potentially parallel fashion. + pub fn par_is_subset(&self, other: &Self) -> bool { + if self.len() <= other.len() { + self.into_par_iter().all(|x| other.contains(x)) + } else { + false + } + } + + /// Returns `true` if the set is a superset of another, + /// i.e. `self` contains at least all the values in `other`. + /// + /// This method runs in a potentially parallel fashion. + pub fn par_is_superset(&self, other: &Self) -> bool { + other.par_is_subset(self) + } + + /// Returns `true` if the set is equal to another, + /// i.e. both sets contain the same values. + /// + /// This method runs in a potentially parallel fashion. + pub fn par_eq(&self, other: &Self) -> bool { + self.len() == other.len() && self.par_is_subset(other) + } +} + +impl HashSet +where + T: Eq + Hash + Send, + S: BuildHasher + Send, +{ + /// Consumes (potentially in parallel) all values in an arbitrary order, + /// while preserving the set's allocated memory for reuse. + #[cfg_attr(feature = "inline-more", inline)] + pub fn par_drain(&mut self) -> ParDrain<'_, T, S> { + ParDrain { set: self } + } +} + +impl IntoParallelIterator for HashSet { + type Item = T; + type Iter = IntoParIter; + + #[cfg_attr(feature = "inline-more", inline)] + fn into_par_iter(self) -> Self::Iter { + IntoParIter { set: self } + } +} + +impl<'a, T: Sync, S: Sync> IntoParallelIterator for &'a HashSet { + type Item = &'a T; + type Iter = ParIter<'a, T, S>; + + #[cfg_attr(feature = "inline-more", inline)] + fn into_par_iter(self) -> Self::Iter { + ParIter { set: self } + } +} + +/// Collect values from a parallel iterator into a hashset. +impl FromParallelIterator for HashSet +where + T: Eq + Hash + Send, + S: BuildHasher + Default, +{ + fn from_par_iter

    (par_iter: P) -> Self + where + P: IntoParallelIterator, + { + let mut set = HashSet::default(); + set.par_extend(par_iter); + set + } +} + +/// Extend a hash set with items from a parallel iterator. +impl ParallelExtend for HashSet +where + T: Eq + Hash + Send, + S: BuildHasher, +{ + fn par_extend(&mut self, par_iter: I) + where + I: IntoParallelIterator, + { + extend(self, par_iter); + } +} + +/// Extend a hash set with copied items from a parallel iterator. +impl<'a, T, S> ParallelExtend<&'a T> for HashSet +where + T: 'a + Copy + Eq + Hash + Sync, + S: BuildHasher, +{ + fn par_extend(&mut self, par_iter: I) + where + I: IntoParallelIterator, + { + extend(self, par_iter); + } +} + +// This is equal to the normal `HashSet` -- no custom advantage. +fn extend(set: &mut HashSet, par_iter: I) +where + T: Eq + Hash, + S: BuildHasher, + I: IntoParallelIterator, + HashSet: Extend, +{ + let (list, len) = super::helpers::collect(par_iter); + + // Values may be already present or show multiple times in the iterator. + // Reserve the entire length if the set is empty. + // Otherwise reserve half the length (rounded up), so the set + // will only resize twice in the worst case. + let reserve = if set.is_empty() { len } else { (len + 1) / 2 }; + set.reserve(reserve); + for vec in list { + set.extend(vec); + } +} + +#[cfg(test)] +mod test_par_set { + use alloc::vec::Vec; + use core::sync::atomic::{AtomicUsize, Ordering}; + + use rayon::prelude::*; + + use crate::hash_set::HashSet; + + #[test] + fn test_disjoint() { + let mut xs = HashSet::new(); + let mut ys = HashSet::new(); + assert!(xs.par_is_disjoint(&ys)); + assert!(ys.par_is_disjoint(&xs)); + assert!(xs.insert(5)); + assert!(ys.insert(11)); + assert!(xs.par_is_disjoint(&ys)); + assert!(ys.par_is_disjoint(&xs)); + assert!(xs.insert(7)); + assert!(xs.insert(19)); + assert!(xs.insert(4)); + assert!(ys.insert(2)); + assert!(ys.insert(-11)); + assert!(xs.par_is_disjoint(&ys)); + assert!(ys.par_is_disjoint(&xs)); + assert!(ys.insert(7)); + assert!(!xs.par_is_disjoint(&ys)); + assert!(!ys.par_is_disjoint(&xs)); + } + + #[test] + fn test_subset_and_superset() { + let mut a = HashSet::new(); + assert!(a.insert(0)); + assert!(a.insert(5)); + assert!(a.insert(11)); + assert!(a.insert(7)); + + let mut b = HashSet::new(); + assert!(b.insert(0)); + assert!(b.insert(7)); + assert!(b.insert(19)); + assert!(b.insert(250)); + assert!(b.insert(11)); + assert!(b.insert(200)); + + assert!(!a.par_is_subset(&b)); + assert!(!a.par_is_superset(&b)); + assert!(!b.par_is_subset(&a)); + assert!(!b.par_is_superset(&a)); + + assert!(b.insert(5)); + + assert!(a.par_is_subset(&b)); + assert!(!a.par_is_superset(&b)); + assert!(!b.par_is_subset(&a)); + assert!(b.par_is_superset(&a)); + } + + #[test] + fn test_iterate() { + let mut a = HashSet::new(); + for i in 0..32 { + assert!(a.insert(i)); + } + let observed = AtomicUsize::new(0); + a.par_iter().for_each(|k| { + observed.fetch_or(1 << *k, Ordering::Relaxed); + }); + assert_eq!(observed.into_inner(), 0xFFFF_FFFF); + } + + #[test] + fn test_intersection() { + let mut a = HashSet::new(); + let mut b = HashSet::new(); + + assert!(a.insert(11)); + assert!(a.insert(1)); + assert!(a.insert(3)); + assert!(a.insert(77)); + assert!(a.insert(103)); + assert!(a.insert(5)); + assert!(a.insert(-5)); + + assert!(b.insert(2)); + assert!(b.insert(11)); + assert!(b.insert(77)); + assert!(b.insert(-9)); + assert!(b.insert(-42)); + assert!(b.insert(5)); + assert!(b.insert(3)); + + let expected = [3, 5, 11, 77]; + let i = a + .par_intersection(&b) + .map(|x| { + assert!(expected.contains(x)); + 1 + }) + .sum::(); + assert_eq!(i, expected.len()); + } + + #[test] + fn test_difference() { + let mut a = HashSet::new(); + let mut b = HashSet::new(); + + assert!(a.insert(1)); + assert!(a.insert(3)); + assert!(a.insert(5)); + assert!(a.insert(9)); + assert!(a.insert(11)); + + assert!(b.insert(3)); + assert!(b.insert(9)); + + let expected = [1, 5, 11]; + let i = a + .par_difference(&b) + .map(|x| { + assert!(expected.contains(x)); + 1 + }) + .sum::(); + assert_eq!(i, expected.len()); + } + + #[test] + fn test_symmetric_difference() { + let mut a = HashSet::new(); + let mut b = HashSet::new(); + + assert!(a.insert(1)); + assert!(a.insert(3)); + assert!(a.insert(5)); + assert!(a.insert(9)); + assert!(a.insert(11)); + + assert!(b.insert(-2)); + assert!(b.insert(3)); + assert!(b.insert(9)); + assert!(b.insert(14)); + assert!(b.insert(22)); + + let expected = [-2, 1, 5, 11, 14, 22]; + let i = a + .par_symmetric_difference(&b) + .map(|x| { + assert!(expected.contains(x)); + 1 + }) + .sum::(); + assert_eq!(i, expected.len()); + } + + #[test] + fn test_union() { + let mut a = HashSet::new(); + let mut b = HashSet::new(); + + assert!(a.insert(1)); + assert!(a.insert(3)); + assert!(a.insert(5)); + assert!(a.insert(9)); + assert!(a.insert(11)); + assert!(a.insert(16)); + assert!(a.insert(19)); + assert!(a.insert(24)); + + assert!(b.insert(-2)); + assert!(b.insert(1)); + assert!(b.insert(5)); + assert!(b.insert(9)); + assert!(b.insert(13)); + assert!(b.insert(19)); + + let expected = [-2, 1, 3, 5, 9, 11, 13, 16, 19, 24]; + let i = a + .par_union(&b) + .map(|x| { + assert!(expected.contains(x)); + 1 + }) + .sum::(); + assert_eq!(i, expected.len()); + } + + #[test] + fn test_from_iter() { + let xs = [1, 2, 3, 4, 5, 6, 7, 8, 9]; + + let set: HashSet<_> = xs.par_iter().cloned().collect(); + + for x in &xs { + assert!(set.contains(x)); + } + } + + #[test] + fn test_move_iter() { + let hs = { + let mut hs = HashSet::new(); + + hs.insert('a'); + hs.insert('b'); + + hs + }; + + let v = hs.into_par_iter().collect::>(); + assert!(v == ['a', 'b'] || v == ['b', 'a']); + } + + #[test] + fn test_eq() { + // These constants once happened to expose a bug in insert(). + // I'm keeping them around to prevent a regression. + let mut s1 = HashSet::new(); + + s1.insert(1); + s1.insert(2); + s1.insert(3); + + let mut s2 = HashSet::new(); + + s2.insert(1); + s2.insert(2); + + assert!(!s1.par_eq(&s2)); + + s2.insert(3); + + assert!(s1.par_eq(&s2)); + } + + #[test] + fn test_extend_ref() { + let mut a = HashSet::new(); + a.insert(1); + + a.par_extend(&[2, 3, 4][..]); + + assert_eq!(a.len(), 4); + assert!(a.contains(&1)); + assert!(a.contains(&2)); + assert!(a.contains(&3)); + assert!(a.contains(&4)); + + let mut b = HashSet::new(); + b.insert(5); + b.insert(6); + + a.par_extend(&b); + + assert_eq!(a.len(), 6); + assert!(a.contains(&1)); + assert!(a.contains(&2)); + assert!(a.contains(&3)); + assert!(a.contains(&4)); + assert!(a.contains(&5)); + assert!(a.contains(&6)); + } +} diff --git a/vendor/hashbrown-0.9.1/src/external_trait_impls/serde.rs b/vendor/hashbrown-0.9.1/src/external_trait_impls/serde.rs new file mode 100644 index 0000000000..7816e78039 --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/external_trait_impls/serde.rs @@ -0,0 +1,200 @@ +mod size_hint { + use core::cmp; + + /// This presumably exists to prevent denial of service attacks. + /// + /// Original discussion: https://github.com/serde-rs/serde/issues/1114. + #[cfg_attr(feature = "inline-more", inline)] + pub(super) fn cautious(hint: Option) -> usize { + cmp::min(hint.unwrap_or(0), 4096) + } +} + +mod map { + use core::fmt; + use core::hash::{BuildHasher, Hash}; + use core::marker::PhantomData; + use serde::de::{Deserialize, Deserializer, MapAccess, Visitor}; + use serde::ser::{Serialize, Serializer}; + + use crate::hash_map::HashMap; + + use super::size_hint; + + impl Serialize for HashMap + where + K: Serialize + Eq + Hash, + V: Serialize, + H: BuildHasher, + { + #[cfg_attr(feature = "inline-more", inline)] + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.collect_map(self) + } + } + + impl<'de, K, V, S> Deserialize<'de> for HashMap + where + K: Deserialize<'de> + Eq + Hash, + V: Deserialize<'de>, + S: BuildHasher + Default, + { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct MapVisitor { + marker: PhantomData>, + } + + impl<'de, K, V, S> Visitor<'de> for MapVisitor + where + K: Deserialize<'de> + Eq + Hash, + V: Deserialize<'de>, + S: BuildHasher + Default, + { + type Value = HashMap; + + fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter.write_str("a map") + } + + #[cfg_attr(feature = "inline-more", inline)] + fn visit_map(self, mut map: A) -> Result + where + A: MapAccess<'de>, + { + let mut values = HashMap::with_capacity_and_hasher( + size_hint::cautious(map.size_hint()), + S::default(), + ); + + while let Some((key, value)) = map.next_entry()? { + values.insert(key, value); + } + + Ok(values) + } + } + + let visitor = MapVisitor { + marker: PhantomData, + }; + deserializer.deserialize_map(visitor) + } + } +} + +mod set { + use core::fmt; + use core::hash::{BuildHasher, Hash}; + use core::marker::PhantomData; + use serde::de::{Deserialize, Deserializer, SeqAccess, Visitor}; + use serde::ser::{Serialize, Serializer}; + + use crate::hash_set::HashSet; + + use super::size_hint; + + impl Serialize for HashSet + where + T: Serialize + Eq + Hash, + H: BuildHasher, + { + #[cfg_attr(feature = "inline-more", inline)] + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + serializer.collect_seq(self) + } + } + + impl<'de, T, S> Deserialize<'de> for HashSet + where + T: Deserialize<'de> + Eq + Hash, + S: BuildHasher + Default, + { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + struct SeqVisitor { + marker: PhantomData>, + } + + impl<'de, T, S> Visitor<'de> for SeqVisitor + where + T: Deserialize<'de> + Eq + Hash, + S: BuildHasher + Default, + { + type Value = HashSet; + + fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter.write_str("a sequence") + } + + #[cfg_attr(feature = "inline-more", inline)] + fn visit_seq(self, mut seq: A) -> Result + where + A: SeqAccess<'de>, + { + let mut values = HashSet::with_capacity_and_hasher( + size_hint::cautious(seq.size_hint()), + S::default(), + ); + + while let Some(value) = seq.next_element()? { + values.insert(value); + } + + Ok(values) + } + } + + let visitor = SeqVisitor { + marker: PhantomData, + }; + deserializer.deserialize_seq(visitor) + } + + fn deserialize_in_place(deserializer: D, place: &mut Self) -> Result<(), D::Error> + where + D: Deserializer<'de>, + { + struct SeqInPlaceVisitor<'a, T, S>(&'a mut HashSet); + + impl<'a, 'de, T, S> Visitor<'de> for SeqInPlaceVisitor<'a, T, S> + where + T: Deserialize<'de> + Eq + Hash, + S: BuildHasher + Default, + { + type Value = (); + + fn expecting(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result { + formatter.write_str("a sequence") + } + + #[cfg_attr(feature = "inline-more", inline)] + fn visit_seq(self, mut seq: A) -> Result + where + A: SeqAccess<'de>, + { + self.0.clear(); + self.0.reserve(size_hint::cautious(seq.size_hint())); + + while let Some(value) = seq.next_element()? { + self.0.insert(value); + } + + Ok(()) + } + } + + deserializer.deserialize_seq(SeqInPlaceVisitor(place)) + } + } +} diff --git a/vendor/hashbrown-0.9.1/src/lib.rs b/vendor/hashbrown-0.9.1/src/lib.rs new file mode 100644 index 0000000000..3aff40a4ff --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/lib.rs @@ -0,0 +1,112 @@ +//! This crate is a Rust port of Google's high-performance [SwissTable] hash +//! map, adapted to make it a drop-in replacement for Rust's standard `HashMap` +//! and `HashSet` types. +//! +//! The original C++ version of [SwissTable] can be found [here], and this +//! [CppCon talk] gives an overview of how the algorithm works. +//! +//! [SwissTable]: https://abseil.io/blog/20180927-swisstables +//! [here]: https://github.com/abseil/abseil-cpp/blob/master/absl/container/internal/raw_hash_set.h +//! [CppCon talk]: https://www.youtube.com/watch?v=ncHmEUmJZf4 + +#![no_std] +#![cfg_attr( + feature = "nightly", + feature(test, core_intrinsics, dropck_eyepatch, min_specialization, extend_one) +)] +#![allow( + clippy::doc_markdown, + clippy::module_name_repetitions, + clippy::must_use_candidate, + clippy::option_if_let_else +)] +#![warn(missing_docs)] +#![warn(rust_2018_idioms)] + +#[cfg(test)] +#[macro_use] +extern crate std; + +#[cfg_attr(test, macro_use)] +extern crate alloc; + +#[cfg(feature = "nightly")] +#[cfg(doctest)] +doc_comment::doctest!("../README.md"); + +#[macro_use] +mod macros; + +#[cfg(feature = "raw")] +/// Experimental and unsafe `RawTable` API. This module is only available if the +/// `raw` feature is enabled. +pub mod raw { + // The RawTable API is still experimental and is not properly documented yet. + #[allow(missing_docs)] + #[path = "mod.rs"] + mod inner; + pub use inner::*; + + #[cfg(feature = "rayon")] + pub mod rayon { + pub use crate::external_trait_impls::rayon::raw::*; + } +} +#[cfg(not(feature = "raw"))] +mod raw; + +mod external_trait_impls; +mod map; +#[cfg(feature = "rustc-internal-api")] +mod rustc_entry; +mod scopeguard; +mod set; + +pub mod hash_map { + //! A hash map implemented with quadratic probing and SIMD lookup. + pub use crate::map::*; + + #[cfg(feature = "rustc-internal-api")] + pub use crate::rustc_entry::*; + + #[cfg(feature = "rayon")] + /// [rayon]-based parallel iterator types for hash maps. + /// You will rarely need to interact with it directly unless you have need + /// to name one of the iterator types. + /// + /// [rayon]: https://docs.rs/rayon/1.0/rayon + pub mod rayon { + pub use crate::external_trait_impls::rayon::map::*; + } +} +pub mod hash_set { + //! A hash set implemented as a `HashMap` where the value is `()`. + pub use crate::set::*; + + #[cfg(feature = "rayon")] + /// [rayon]-based parallel iterator types for hash sets. + /// You will rarely need to interact with it directly unless you have need + /// to name one of the iterator types. + /// + /// [rayon]: https://docs.rs/rayon/1.0/rayon + pub mod rayon { + pub use crate::external_trait_impls::rayon::set::*; + } +} + +pub use crate::map::HashMap; +pub use crate::set::HashSet; + +/// The error type for `try_reserve` methods. +#[derive(Clone, PartialEq, Eq, Debug)] +pub enum TryReserveError { + /// Error due to the computed capacity exceeding the collection's maximum + /// (usually `isize::MAX` bytes). + CapacityOverflow, + + /// The memory allocator returned an error + AllocError { + /// The layout of the allocation request that failed. + layout: alloc::alloc::Layout, + }, +} diff --git a/vendor/hashbrown-0.9.1/src/macros.rs b/vendor/hashbrown-0.9.1/src/macros.rs new file mode 100644 index 0000000000..0279597313 --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/macros.rs @@ -0,0 +1,69 @@ +// See the cfg-if crate. +macro_rules! cfg_if { + // match if/else chains with a final `else` + ($( + if #[cfg($($meta:meta),*)] { $($it:item)* } + ) else * else { + $($it2:item)* + }) => { + cfg_if! { + @__items + () ; + $( ( ($($meta),*) ($($it)*) ), )* + ( () ($($it2)*) ), + } + }; + + // match if/else chains lacking a final `else` + ( + if #[cfg($($i_met:meta),*)] { $($i_it:item)* } + $( + else if #[cfg($($e_met:meta),*)] { $($e_it:item)* } + )* + ) => { + cfg_if! { + @__items + () ; + ( ($($i_met),*) ($($i_it)*) ), + $( ( ($($e_met),*) ($($e_it)*) ), )* + ( () () ), + } + }; + + // Internal and recursive macro to emit all the items + // + // 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 + // #[cfg] will require all `$m` matchers specified and must also negate + // all previous matchers. + cfg_if! { @__apply cfg(all($($m,)* not(any($($not),*)))), $($it)* } + + // 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)* } + }; + + // Internal macro to Apply a cfg attribute to a list of items + (@__apply $m:meta, $($it:item)*) => { + $(#[$m] $it)* + }; +} + +// Helper macro for specialization. This also helps avoid parse errors if the +// default fn syntax for specialization changes in the future. +#[cfg(feature = "nightly")] +macro_rules! default_fn { + ($($tt:tt)*) => { + default $($tt)* + } +} +#[cfg(not(feature = "nightly"))] +macro_rules! default_fn { + ($($tt:tt)*) => { + $($tt)* + } +} diff --git a/vendor/hashbrown-0.9.1/src/map.rs b/vendor/hashbrown-0.9.1/src/map.rs new file mode 100644 index 0000000000..1ccba3157d --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/map.rs @@ -0,0 +1,4524 @@ +use crate::raw::{Bucket, RawDrain, RawIntoIter, RawIter, RawTable}; +use crate::TryReserveError; +use core::borrow::Borrow; +use core::fmt::{self, Debug}; +use core::hash::{BuildHasher, Hash, Hasher}; +use core::iter::{FromIterator, FusedIterator}; +use core::marker::PhantomData; +use core::mem; +use core::ops::Index; + +/// Default hasher for `HashMap`. +#[cfg(feature = "ahash")] +pub type DefaultHashBuilder = ahash::RandomState; + +/// Dummy default hasher for `HashMap`. +#[cfg(not(feature = "ahash"))] +pub enum DefaultHashBuilder {} + +/// A hash map implemented with quadratic probing and SIMD lookup. +/// +/// The default hashing algorithm is currently [`AHash`], though this is +/// subject to change at any point in the future. This hash function is very +/// fast for all types of keys, but this algorithm will typically *not* protect +/// against attacks such as HashDoS. +/// +/// The hashing algorithm can be replaced on a per-`HashMap` basis using the +/// [`default`], [`with_hasher`], and [`with_capacity_and_hasher`] methods. Many +/// alternative algorithms are available on crates.io, such as the [`fnv`] crate. +/// +/// It is required that the keys implement the [`Eq`] and [`Hash`] traits, although +/// this can frequently be achieved by using `#[derive(PartialEq, Eq, Hash)]`. +/// If you implement these yourself, it is important that the following +/// property holds: +/// +/// ```text +/// k1 == k2 -> hash(k1) == hash(k2) +/// ``` +/// +/// In other words, if two keys are equal, their hashes must be equal. +/// +/// It is a logic error for a key to be modified in such a way that the key's +/// hash, as determined by the [`Hash`] trait, or its equality, as determined by +/// the [`Eq`] trait, changes while it is in the map. This is normally only +/// possible through [`Cell`], [`RefCell`], global state, I/O, or unsafe code. +/// +/// It is also a logic error for the [`Hash`] implementation of a key to panic. +/// This is generally only possible if the trait is implemented manually. If a +/// panic does occur then the contents of the `HashMap` may become corrupted and +/// some items may be dropped from the table. +/// +/// # Examples +/// +/// ``` +/// use hashbrown::HashMap; +/// +/// // Type inference lets us omit an explicit type signature (which +/// // would be `HashMap` in this example). +/// let mut book_reviews = HashMap::new(); +/// +/// // Review some books. +/// book_reviews.insert( +/// "Adventures of Huckleberry Finn".to_string(), +/// "My favorite book.".to_string(), +/// ); +/// book_reviews.insert( +/// "Grimms' Fairy Tales".to_string(), +/// "Masterpiece.".to_string(), +/// ); +/// book_reviews.insert( +/// "Pride and Prejudice".to_string(), +/// "Very enjoyable.".to_string(), +/// ); +/// book_reviews.insert( +/// "The Adventures of Sherlock Holmes".to_string(), +/// "Eye lyked it alot.".to_string(), +/// ); +/// +/// // Check for a specific one. +/// // When collections store owned values (String), they can still be +/// // queried using references (&str). +/// if !book_reviews.contains_key("Les Misérables") { +/// println!("We've got {} reviews, but Les Misérables ain't one.", +/// book_reviews.len()); +/// } +/// +/// // oops, this review has a lot of spelling mistakes, let's delete it. +/// book_reviews.remove("The Adventures of Sherlock Holmes"); +/// +/// // Look up the values associated with some keys. +/// let to_find = ["Pride and Prejudice", "Alice's Adventure in Wonderland"]; +/// for &book in &to_find { +/// match book_reviews.get(book) { +/// Some(review) => println!("{}: {}", book, review), +/// None => println!("{} is unreviewed.", book) +/// } +/// } +/// +/// // Look up the value for a key (will panic if the key is not found). +/// println!("Review for Jane: {}", book_reviews["Pride and Prejudice"]); +/// +/// // Iterate over everything. +/// for (book, review) in &book_reviews { +/// println!("{}: \"{}\"", book, review); +/// } +/// ``` +/// +/// `HashMap` also implements an [`Entry API`](#method.entry), which allows +/// for more complex methods of getting, setting, updating and removing keys and +/// their values: +/// +/// ``` +/// use hashbrown::HashMap; +/// +/// // type inference lets us omit an explicit type signature (which +/// // would be `HashMap<&str, u8>` in this example). +/// let mut player_stats = HashMap::new(); +/// +/// fn random_stat_buff() -> u8 { +/// // could actually return some random value here - let's just return +/// // some fixed value for now +/// 42 +/// } +/// +/// // insert a key only if it doesn't already exist +/// player_stats.entry("health").or_insert(100); +/// +/// // insert a key using a function that provides a new value only if it +/// // doesn't already exist +/// player_stats.entry("defence").or_insert_with(random_stat_buff); +/// +/// // update a key, guarding against the key possibly not being set +/// let stat = player_stats.entry("attack").or_insert(100); +/// *stat += random_stat_buff(); +/// ``` +/// +/// The easiest way to use `HashMap` with a custom key type is to derive [`Eq`] and [`Hash`]. +/// We must also derive [`PartialEq`]. +/// +/// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html +/// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html +/// [`PartialEq`]: https://doc.rust-lang.org/std/cmp/trait.PartialEq.html +/// [`RefCell`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html +/// [`Cell`]: https://doc.rust-lang.org/std/cell/struct.Cell.html +/// [`default`]: #method.default +/// [`with_hasher`]: #method.with_hasher +/// [`with_capacity_and_hasher`]: #method.with_capacity_and_hasher +/// [`fnv`]: https://crates.io/crates/fnv +/// [`AHash`]: https://crates.io/crates/ahash +/// +/// ``` +/// use hashbrown::HashMap; +/// +/// #[derive(Hash, Eq, PartialEq, Debug)] +/// struct Viking { +/// name: String, +/// country: String, +/// } +/// +/// impl Viking { +/// /// Creates a new Viking. +/// fn new(name: &str, country: &str) -> Viking { +/// Viking { name: name.to_string(), country: country.to_string() } +/// } +/// } +/// +/// // Use a HashMap to store the vikings' health points. +/// let mut vikings = HashMap::new(); +/// +/// vikings.insert(Viking::new("Einar", "Norway"), 25); +/// vikings.insert(Viking::new("Olaf", "Denmark"), 24); +/// vikings.insert(Viking::new("Harald", "Iceland"), 12); +/// +/// // Use derived implementation to print the status of the vikings. +/// for (viking, health) in &vikings { +/// println!("{:?} has {} hp", viking, health); +/// } +/// ``` +/// +/// A `HashMap` with fixed list of elements can be initialized from an array: +/// +/// ``` +/// use hashbrown::HashMap; +/// +/// let timber_resources: HashMap<&str, i32> = [("Norway", 100), ("Denmark", 50), ("Iceland", 10)] +/// .iter().cloned().collect(); +/// // use the values stored in map +/// ``` +pub struct HashMap { + pub(crate) hash_builder: S, + pub(crate) table: RawTable<(K, V)>, +} + +impl Clone for HashMap { + fn clone(&self) -> Self { + HashMap { + hash_builder: self.hash_builder.clone(), + table: self.table.clone(), + } + } + + fn clone_from(&mut self, source: &Self) { + self.table.clone_from(&source.table); + + // Update hash_builder only if we successfully cloned all elements. + self.hash_builder.clone_from(&source.hash_builder); + } +} + +#[cfg_attr(feature = "inline-more", inline)] +pub(crate) fn make_hash(hash_builder: &impl BuildHasher, val: &K) -> u64 { + let mut state = hash_builder.build_hasher(); + val.hash(&mut state); + state.finish() +} + +#[cfg(feature = "ahash")] +impl HashMap { + /// Creates an empty `HashMap`. + /// + /// The hash map is initially created with a capacity of 0, so it will not allocate until it + /// is first inserted into. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// let mut map: HashMap<&str, i32> = HashMap::new(); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn new() -> Self { + Self::default() + } + + /// Creates an empty `HashMap` with the specified capacity. + /// + /// The hash map will be able to hold at least `capacity` elements without + /// reallocating. If `capacity` is 0, the hash map will not allocate. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// let mut map: HashMap<&str, i32> = HashMap::with_capacity(10); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn with_capacity(capacity: usize) -> Self { + Self::with_capacity_and_hasher(capacity, DefaultHashBuilder::default()) + } +} + +impl HashMap { + /// Creates an empty `HashMap` which will use the given hash builder to hash + /// keys. + /// + /// The created map has the default initial capacity. + /// + /// Warning: `hash_builder` is normally randomly generated, and + /// is designed to allow HashMaps to be resistant to attacks that + /// cause many collisions and very poor performance. Setting it + /// manually using this function can expose a DoS attack vector. + /// + /// The `hash_builder` passed should implement the [`BuildHasher`] trait for + /// the HashMap to be useful, see its documentation for details. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::DefaultHashBuilder; + /// + /// let s = DefaultHashBuilder::default(); + /// let mut map = HashMap::with_hasher(s); + /// map.insert(1, 2); + /// ``` + /// + /// [`BuildHasher`]: ../../std/hash/trait.BuildHasher.html + #[cfg_attr(feature = "inline-more", inline)] + pub const fn with_hasher(hash_builder: S) -> Self { + Self { + hash_builder, + table: RawTable::new(), + } + } + + /// Creates an empty `HashMap` with the specified capacity, using `hash_builder` + /// to hash the keys. + /// + /// The hash map will be able to hold at least `capacity` elements without + /// reallocating. If `capacity` is 0, the hash map will not allocate. + /// + /// Warning: `hash_builder` is normally randomly generated, and + /// is designed to allow HashMaps to be resistant to attacks that + /// cause many collisions and very poor performance. Setting it + /// manually using this function can expose a DoS attack vector. + /// + /// The `hash_builder` passed should implement the [`BuildHasher`] trait for + /// the HashMap to be useful, see its documentation for details. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::DefaultHashBuilder; + /// + /// let s = DefaultHashBuilder::default(); + /// let mut map = HashMap::with_capacity_and_hasher(10, s); + /// map.insert(1, 2); + /// ``` + /// + /// [`BuildHasher`]: ../../std/hash/trait.BuildHasher.html + #[cfg_attr(feature = "inline-more", inline)] + pub fn with_capacity_and_hasher(capacity: usize, hash_builder: S) -> Self { + Self { + hash_builder, + table: RawTable::with_capacity(capacity), + } + } + + /// Returns a reference to the map's [`BuildHasher`]. + /// + /// [`BuildHasher`]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::DefaultHashBuilder; + /// + /// let hasher = DefaultHashBuilder::default(); + /// let map: HashMap = HashMap::with_hasher(hasher); + /// let hasher: &DefaultHashBuilder = map.hasher(); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn hasher(&self) -> &S { + &self.hash_builder + } + + /// Returns the number of elements the map can hold without reallocating. + /// + /// This number is a lower bound; the `HashMap` might be able to hold + /// more, but is guaranteed to be able to hold at least this many. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// let map: HashMap = HashMap::with_capacity(100); + /// assert!(map.capacity() >= 100); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn capacity(&self) -> usize { + self.table.capacity() + } + + /// An iterator visiting all keys in arbitrary order. + /// The iterator element type is `&'a K`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert("a", 1); + /// map.insert("b", 2); + /// map.insert("c", 3); + /// + /// for key in map.keys() { + /// println!("{}", key); + /// } + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn keys(&self) -> Keys<'_, K, V> { + Keys { inner: self.iter() } + } + + /// An iterator visiting all values in arbitrary order. + /// The iterator element type is `&'a V`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert("a", 1); + /// map.insert("b", 2); + /// map.insert("c", 3); + /// + /// for val in map.values() { + /// println!("{}", val); + /// } + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn values(&self) -> Values<'_, K, V> { + Values { inner: self.iter() } + } + + /// An iterator visiting all values mutably in arbitrary order. + /// The iterator element type is `&'a mut V`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map = HashMap::new(); + /// + /// map.insert("a", 1); + /// map.insert("b", 2); + /// map.insert("c", 3); + /// + /// for val in map.values_mut() { + /// *val = *val + 10; + /// } + /// + /// for val in map.values() { + /// println!("{}", val); + /// } + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn values_mut(&mut self) -> ValuesMut<'_, K, V> { + ValuesMut { + inner: self.iter_mut(), + } + } + + /// An iterator visiting all key-value pairs in arbitrary order. + /// The iterator element type is `(&'a K, &'a V)`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert("a", 1); + /// map.insert("b", 2); + /// map.insert("c", 3); + /// + /// for (key, val) in map.iter() { + /// println!("key: {} val: {}", key, val); + /// } + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn iter(&self) -> Iter<'_, K, V> { + // Here we tie the lifetime of self to the iter. + unsafe { + Iter { + inner: self.table.iter(), + marker: PhantomData, + } + } + } + + /// An iterator visiting all key-value pairs in arbitrary order, + /// with mutable references to the values. + /// The iterator element type is `(&'a K, &'a mut V)`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert("a", 1); + /// map.insert("b", 2); + /// map.insert("c", 3); + /// + /// // Update all values + /// for (_, val) in map.iter_mut() { + /// *val *= 2; + /// } + /// + /// for (key, val) in &map { + /// println!("key: {} val: {}", key, val); + /// } + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn iter_mut(&mut self) -> IterMut<'_, K, V> { + // Here we tie the lifetime of self to the iter. + unsafe { + IterMut { + inner: self.table.iter(), + marker: PhantomData, + } + } + } + + #[cfg(test)] + #[cfg_attr(feature = "inline-more", inline)] + fn raw_capacity(&self) -> usize { + self.table.buckets() + } + + /// Returns the number of elements in the map. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut a = HashMap::new(); + /// assert_eq!(a.len(), 0); + /// a.insert(1, "a"); + /// assert_eq!(a.len(), 1); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn len(&self) -> usize { + self.table.len() + } + + /// Returns `true` if the map contains no elements. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut a = HashMap::new(); + /// assert!(a.is_empty()); + /// a.insert(1, "a"); + /// assert!(!a.is_empty()); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn is_empty(&self) -> bool { + self.len() == 0 + } + + /// Clears the map, returning all key-value pairs as an iterator. Keeps the + /// allocated memory for reuse. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut a = HashMap::new(); + /// a.insert(1, "a"); + /// a.insert(2, "b"); + /// + /// for (k, v) in a.drain().take(1) { + /// assert!(k == 1 || k == 2); + /// assert!(v == "a" || v == "b"); + /// } + /// + /// assert!(a.is_empty()); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn drain(&mut self) -> Drain<'_, K, V> { + Drain { + inner: self.table.drain(), + } + } + + /// Retains only the elements specified by the predicate. + /// + /// In other words, remove all pairs `(k, v)` such that `f(&k,&mut v)` returns `false`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap = (0..8).map(|x|(x, x*10)).collect(); + /// map.retain(|&k, _| k % 2 == 0); + /// assert_eq!(map.len(), 4); + /// ``` + pub fn retain(&mut self, mut f: F) + where + F: FnMut(&K, &mut V) -> bool, + { + // Here we only use `iter` as a temporary, preventing use-after-free + unsafe { + for item in self.table.iter() { + let &mut (ref key, ref mut value) = item.as_mut(); + if !f(key, value) { + self.table.erase(item); + } + } + } + } + + /// Drains elements which are true under the given predicate, + /// and returns an iterator over the removed items. + /// + /// In other words, move all pairs `(k, v)` such that `f(&k,&mut v)` returns `true` out + /// into another iterator. + /// + /// When the returned DrainedFilter is dropped, any remaining elements that satisfy + /// the predicate are dropped from the table. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap = (0..8).map(|x| (x, x)).collect(); + /// let drained: HashMap = map.drain_filter(|k, _v| k % 2 == 0).collect(); + /// + /// let mut evens = drained.keys().cloned().collect::>(); + /// let mut odds = map.keys().cloned().collect::>(); + /// evens.sort(); + /// odds.sort(); + /// + /// assert_eq!(evens, vec![0, 2, 4, 6]); + /// assert_eq!(odds, vec![1, 3, 5, 7]); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn drain_filter(&mut self, f: F) -> DrainFilter<'_, K, V, F> + where + F: FnMut(&K, &mut V) -> bool, + { + DrainFilter { + f, + inner: DrainFilterInner { + iter: unsafe { self.table.iter() }, + table: &mut self.table, + }, + } + } + + /// Clears the map, removing all key-value pairs. Keeps the allocated memory + /// for reuse. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut a = HashMap::new(); + /// a.insert(1, "a"); + /// a.clear(); + /// assert!(a.is_empty()); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn clear(&mut self) { + self.table.clear(); + } +} + +impl HashMap +where + K: Eq + Hash, + S: BuildHasher, +{ + /// Reserves capacity for at least `additional` more elements to be inserted + /// in the `HashMap`. The collection may reserve more space to avoid + /// frequent reallocations. + /// + /// # Panics + /// + /// Panics if the new allocation size overflows [`usize`]. + /// + /// [`usize`]: https://doc.rust-lang.org/std/primitive.usize.html + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// let mut map: HashMap<&str, i32> = HashMap::new(); + /// map.reserve(10); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn reserve(&mut self, additional: usize) { + let hash_builder = &self.hash_builder; + self.table + .reserve(additional, |x| make_hash(hash_builder, &x.0)); + } + + /// Tries to reserve capacity for at least `additional` more elements to be inserted + /// in the given `HashMap`. The collection may reserve more space to avoid + /// frequent reallocations. + /// + /// # Errors + /// + /// If the capacity overflows, or the allocator reports a failure, then an error + /// is returned. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// let mut map: HashMap<&str, isize> = HashMap::new(); + /// map.try_reserve(10).expect("why is the test harness OOMing on 10 bytes?"); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> { + let hash_builder = &self.hash_builder; + self.table + .try_reserve(additional, |x| make_hash(hash_builder, &x.0)) + } + + /// Shrinks the capacity of the map as much as possible. It will drop + /// down as much as possible while maintaining the internal rules + /// and possibly leaving some space in accordance with the resize policy. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap = HashMap::with_capacity(100); + /// map.insert(1, 2); + /// map.insert(3, 4); + /// assert!(map.capacity() >= 100); + /// map.shrink_to_fit(); + /// assert!(map.capacity() >= 2); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn shrink_to_fit(&mut self) { + let hash_builder = &self.hash_builder; + self.table.shrink_to(0, |x| make_hash(hash_builder, &x.0)); + } + + /// Shrinks the capacity of the map with a lower limit. It will drop + /// down no lower than the supplied limit while maintaining the internal rules + /// and possibly leaving some space in accordance with the resize policy. + /// + /// This function does nothing if the current capacity is smaller than the + /// supplied minimum capacity. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap = HashMap::with_capacity(100); + /// map.insert(1, 2); + /// map.insert(3, 4); + /// assert!(map.capacity() >= 100); + /// map.shrink_to(10); + /// assert!(map.capacity() >= 10); + /// map.shrink_to(0); + /// assert!(map.capacity() >= 2); + /// map.shrink_to(10); + /// assert!(map.capacity() >= 2); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn shrink_to(&mut self, min_capacity: usize) { + let hash_builder = &self.hash_builder; + self.table + .shrink_to(min_capacity, |x| make_hash(hash_builder, &x.0)); + } + + /// Gets the given key's corresponding entry in the map for in-place manipulation. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut letters = HashMap::new(); + /// + /// for ch in "a short treatise on fungi".chars() { + /// let counter = letters.entry(ch).or_insert(0); + /// *counter += 1; + /// } + /// + /// assert_eq!(letters[&'s'], 2); + /// assert_eq!(letters[&'t'], 3); + /// assert_eq!(letters[&'u'], 1); + /// assert_eq!(letters.get(&'y'), None); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn entry(&mut self, key: K) -> Entry<'_, K, V, S> { + let hash = make_hash(&self.hash_builder, &key); + if let Some(elem) = self.table.find(hash, |q| q.0.eq(&key)) { + Entry::Occupied(OccupiedEntry { + hash, + key: Some(key), + elem, + table: self, + }) + } else { + Entry::Vacant(VacantEntry { + hash, + key, + table: self, + }) + } + } + + /// Returns a reference to the value corresponding to the key. + /// + /// The key may be any borrowed form of the map's key type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the key type. + /// + /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html + /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert(1, "a"); + /// assert_eq!(map.get(&1), Some(&"a")); + /// assert_eq!(map.get(&2), None); + /// ``` + #[inline] + pub fn get(&self, k: &Q) -> Option<&V> + where + K: Borrow, + Q: Hash + Eq, + { + // Avoid `Option::map` because it bloats LLVM IR. + match self.get_inner(k) { + Some(&(_, ref v)) => Some(v), + None => None, + } + } + + /// Returns the key-value pair corresponding to the supplied key. + /// + /// The supplied key may be any borrowed form of the map's key type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the key type. + /// + /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html + /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert(1, "a"); + /// assert_eq!(map.get_key_value(&1), Some((&1, &"a"))); + /// assert_eq!(map.get_key_value(&2), None); + /// ``` + #[inline] + pub fn get_key_value(&self, k: &Q) -> Option<(&K, &V)> + where + K: Borrow, + Q: Hash + Eq, + { + // Avoid `Option::map` because it bloats LLVM IR. + match self.get_inner(k) { + Some(&(ref key, ref value)) => Some((key, value)), + None => None, + } + } + + #[inline] + fn get_inner(&self, k: &Q) -> Option<&(K, V)> + where + K: Borrow, + Q: Hash + Eq, + { + let hash = make_hash(&self.hash_builder, k); + self.table.get(hash, |x| k.eq(x.0.borrow())) + } + + /// Returns the key-value pair corresponding to the supplied key, with a mutable reference to value. + /// + /// The supplied key may be any borrowed form of the map's key type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the key type. + /// + /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html + /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert(1, "a"); + /// let (k, v) = map.get_key_value_mut(&1).unwrap(); + /// assert_eq!(k, &1); + /// assert_eq!(v, &mut "a"); + /// *v = "b"; + /// assert_eq!(map.get_key_value_mut(&1), Some((&1, &mut "b"))); + /// assert_eq!(map.get_key_value_mut(&2), None); + /// ``` + #[inline] + pub fn get_key_value_mut(&mut self, k: &Q) -> Option<(&K, &mut V)> + where + K: Borrow, + Q: Hash + Eq, + { + // Avoid `Option::map` because it bloats LLVM IR. + match self.get_inner_mut(k) { + Some(&mut (ref key, ref mut value)) => Some((key, value)), + None => None, + } + } + + /// Returns `true` if the map contains a value for the specified key. + /// + /// The key may be any borrowed form of the map's key type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the key type. + /// + /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html + /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert(1, "a"); + /// assert_eq!(map.contains_key(&1), true); + /// assert_eq!(map.contains_key(&2), false); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn contains_key(&self, k: &Q) -> bool + where + K: Borrow, + Q: Hash + Eq, + { + self.get_inner(k).is_some() + } + + /// Returns a mutable reference to the value corresponding to the key. + /// + /// The key may be any borrowed form of the map's key type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the key type. + /// + /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html + /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert(1, "a"); + /// if let Some(x) = map.get_mut(&1) { + /// *x = "b"; + /// } + /// assert_eq!(map[&1], "b"); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn get_mut(&mut self, k: &Q) -> Option<&mut V> + where + K: Borrow, + Q: Hash + Eq, + { + // Avoid `Option::map` because it bloats LLVM IR. + match self.get_inner_mut(k) { + Some(&mut (_, ref mut v)) => Some(v), + None => None, + } + } + + #[inline] + fn get_inner_mut(&mut self, k: &Q) -> Option<&mut (K, V)> + where + K: Borrow, + Q: Hash + Eq, + { + let hash = make_hash(&self.hash_builder, k); + self.table.get_mut(hash, |x| k.eq(x.0.borrow())) + } + + /// Inserts a key-value pair into the map. + /// + /// If the map did not have this key present, [`None`] is returned. + /// + /// If the map did have this key present, the value is updated, and the old + /// value is returned. The key is not updated, though; this matters for + /// types that can be `==` without being identical. See the [module-level + /// documentation] for more. + /// + /// [`None`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.None + /// [module-level documentation]: index.html#insert-and-complex-keys + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map = HashMap::new(); + /// assert_eq!(map.insert(37, "a"), None); + /// assert_eq!(map.is_empty(), false); + /// + /// map.insert(37, "b"); + /// assert_eq!(map.insert(37, "c"), Some("b")); + /// assert_eq!(map[&37], "c"); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn insert(&mut self, k: K, v: V) -> Option { + let hash = make_hash(&self.hash_builder, &k); + if let Some((_, item)) = self.table.get_mut(hash, |x| k.eq(&x.0)) { + Some(mem::replace(item, v)) + } else { + let hash_builder = &self.hash_builder; + self.table + .insert(hash, (k, v), |x| make_hash(hash_builder, &x.0)); + None + } + } + + /// Removes a key from the map, returning the value at the key if the key + /// was previously in the map. + /// + /// The key may be any borrowed form of the map's key type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the key type. + /// + /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html + /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert(1, "a"); + /// assert_eq!(map.remove(&1), Some("a")); + /// assert_eq!(map.remove(&1), None); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn remove(&mut self, k: &Q) -> Option + where + K: Borrow, + Q: Hash + Eq, + { + // Avoid `Option::map` because it bloats LLVM IR. + match self.remove_entry(k) { + Some((_, v)) => Some(v), + None => None, + } + } + + /// Removes a key from the map, returning the stored key and value if the + /// key was previously in the map. + /// + /// The key may be any borrowed form of the map's key type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the key type. + /// + /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html + /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert(1, "a"); + /// assert_eq!(map.remove_entry(&1), Some((1, "a"))); + /// assert_eq!(map.remove(&1), None); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn remove_entry(&mut self, k: &Q) -> Option<(K, V)> + where + K: Borrow, + Q: Hash + Eq, + { + let hash = make_hash(&self.hash_builder, &k); + self.table.remove_entry(hash, |x| k.eq(x.0.borrow())) + } +} + +impl HashMap { + /// Creates a raw entry builder for the HashMap. + /// + /// Raw entries provide the lowest level of control for searching and + /// manipulating a map. They must be manually initialized with a hash and + /// then manually searched. After this, insertions into a vacant entry + /// still require an owned key to be provided. + /// + /// Raw entries are useful for such exotic situations as: + /// + /// * Hash memoization + /// * Deferring the creation of an owned key until it is known to be required + /// * Using a search key that doesn't work with the Borrow trait + /// * Using custom comparison logic without newtype wrappers + /// + /// Because raw entries provide much more low-level control, it's much easier + /// to put the HashMap into an inconsistent state which, while memory-safe, + /// will cause the map to produce seemingly random results. Higher-level and + /// more foolproof APIs like `entry` should be preferred when possible. + /// + /// In particular, the hash used to initialized the raw entry must still be + /// consistent with the hash of the key that is ultimately stored in the entry. + /// This is because implementations of HashMap may need to recompute hashes + /// when resizing, at which point only the keys are available. + /// + /// Raw entries give mutable access to the keys. This must not be used + /// to modify how the key would compare or hash, as the map will not re-evaluate + /// where the key should go, meaning the keys may become "lost" if their + /// location does not reflect their state. For instance, if you change a key + /// so that the map now contains keys which compare equal, search may start + /// acting erratically, with two keys randomly masking each other. Implementations + /// are free to assume this doesn't happen (within the limits of memory-safety). + #[cfg_attr(feature = "inline-more", inline)] + pub fn raw_entry_mut(&mut self) -> RawEntryBuilderMut<'_, K, V, S> { + RawEntryBuilderMut { map: self } + } + + /// Creates a raw immutable entry builder for the HashMap. + /// + /// Raw entries provide the lowest level of control for searching and + /// manipulating a map. They must be manually initialized with a hash and + /// then manually searched. + /// + /// This is useful for + /// * Hash memoization + /// * Using a search key that doesn't work with the Borrow trait + /// * Using custom comparison logic without newtype wrappers + /// + /// Unless you are in such a situation, higher-level and more foolproof APIs like + /// `get` should be preferred. + /// + /// Immutable raw entries have very limited use; you might instead want `raw_entry_mut`. + #[cfg_attr(feature = "inline-more", inline)] + pub fn raw_entry(&self) -> RawEntryBuilder<'_, K, V, S> { + RawEntryBuilder { map: self } + } +} + +impl PartialEq for HashMap +where + K: Eq + Hash, + V: PartialEq, + S: BuildHasher, +{ + fn eq(&self, other: &Self) -> bool { + if self.len() != other.len() { + return false; + } + + self.iter() + .all(|(key, value)| other.get(key).map_or(false, |v| *value == *v)) + } +} + +impl Eq for HashMap +where + K: Eq + Hash, + V: Eq, + S: BuildHasher, +{ +} + +impl Debug for HashMap +where + K: Debug, + V: Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_map().entries(self.iter()).finish() + } +} + +impl Default for HashMap +where + S: Default, +{ + /// Creates an empty `HashMap`, with the `Default` value for the hasher. + #[cfg_attr(feature = "inline-more", inline)] + fn default() -> Self { + Self::with_hasher(Default::default()) + } +} + +impl Index<&Q> for HashMap +where + K: Eq + Hash + Borrow, + Q: Eq + Hash, + S: BuildHasher, +{ + type Output = V; + + /// Returns a reference to the value corresponding to the supplied key. + /// + /// # Panics + /// + /// Panics if the key is not present in the `HashMap`. + #[cfg_attr(feature = "inline-more", inline)] + fn index(&self, key: &Q) -> &V { + self.get(key).expect("no entry found for key") + } +} + +/// An iterator over the entries of a `HashMap`. +/// +/// This `struct` is created by the [`iter`] method on [`HashMap`]. See its +/// documentation for more. +/// +/// [`iter`]: struct.HashMap.html#method.iter +/// [`HashMap`]: struct.HashMap.html +pub struct Iter<'a, K, V> { + inner: RawIter<(K, V)>, + marker: PhantomData<(&'a K, &'a V)>, +} + +// FIXME(#26925) Remove in favor of `#[derive(Clone)]` +impl Clone for Iter<'_, K, V> { + #[cfg_attr(feature = "inline-more", inline)] + fn clone(&self) -> Self { + Iter { + inner: self.inner.clone(), + marker: PhantomData, + } + } +} + +impl fmt::Debug for Iter<'_, K, V> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_list().entries(self.clone()).finish() + } +} + +/// A mutable iterator over the entries of a `HashMap`. +/// +/// This `struct` is created by the [`iter_mut`] method on [`HashMap`]. See its +/// documentation for more. +/// +/// [`iter_mut`]: struct.HashMap.html#method.iter_mut +/// [`HashMap`]: struct.HashMap.html +pub struct IterMut<'a, K, V> { + inner: RawIter<(K, V)>, + // To ensure invariance with respect to V + marker: PhantomData<(&'a K, &'a mut V)>, +} + +// We override the default Send impl which has K: Sync instead of K: Send. Both +// are correct, but this one is more general since it allows keys which +// implement Send but not Sync. +unsafe impl Send for IterMut<'_, K, V> {} + +impl IterMut<'_, K, V> { + /// Returns a iterator of references over the remaining items. + #[cfg_attr(feature = "inline-more", inline)] + pub(super) fn iter(&self) -> Iter<'_, K, V> { + Iter { + inner: self.inner.clone(), + marker: PhantomData, + } + } +} + +/// An owning iterator over the entries of a `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 +/// [`HashMap`]: struct.HashMap.html +pub struct IntoIter { + inner: RawIntoIter<(K, V)>, +} + +impl IntoIter { + /// Returns a iterator of references over the remaining items. + #[cfg_attr(feature = "inline-more", inline)] + pub(super) fn iter(&self) -> Iter<'_, K, V> { + Iter { + inner: self.inner.iter(), + marker: PhantomData, + } + } +} + +/// An iterator over the keys of a `HashMap`. +/// +/// This `struct` is created by the [`keys`] method on [`HashMap`]. See its +/// documentation for more. +/// +/// [`keys`]: struct.HashMap.html#method.keys +/// [`HashMap`]: struct.HashMap.html +pub struct Keys<'a, K, V> { + inner: Iter<'a, K, V>, +} + +// FIXME(#26925) Remove in favor of `#[derive(Clone)]` +impl Clone for Keys<'_, K, V> { + #[cfg_attr(feature = "inline-more", inline)] + fn clone(&self) -> Self { + Keys { + inner: self.inner.clone(), + } + } +} + +impl fmt::Debug for Keys<'_, K, V> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_list().entries(self.clone()).finish() + } +} + +/// An iterator over the values of a `HashMap`. +/// +/// This `struct` is created by the [`values`] method on [`HashMap`]. See its +/// documentation for more. +/// +/// [`values`]: struct.HashMap.html#method.values +/// [`HashMap`]: struct.HashMap.html +pub struct Values<'a, K, V> { + inner: Iter<'a, K, V>, +} + +// FIXME(#26925) Remove in favor of `#[derive(Clone)]` +impl Clone for Values<'_, K, V> { + #[cfg_attr(feature = "inline-more", inline)] + fn clone(&self) -> Self { + Values { + inner: self.inner.clone(), + } + } +} + +impl fmt::Debug for Values<'_, K, V> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_list().entries(self.clone()).finish() + } +} + +/// A draining iterator over the entries of a `HashMap`. +/// +/// This `struct` is created by the [`drain`] method on [`HashMap`]. See its +/// documentation for more. +/// +/// [`drain`]: struct.HashMap.html#method.drain +/// [`HashMap`]: struct.HashMap.html +pub struct Drain<'a, K, V> { + inner: RawDrain<'a, (K, V)>, +} + +impl Drain<'_, K, V> { + /// Returns a iterator of references over the remaining items. + #[cfg_attr(feature = "inline-more", inline)] + pub(super) fn iter(&self) -> Iter<'_, K, V> { + Iter { + inner: self.inner.iter(), + marker: PhantomData, + } + } +} + +/// A draining iterator over entries of a `HashMap` which don't satisfy the predicate `f`. +/// +/// This `struct` is created by the [`drain_filter`] method on [`HashMap`]. See its +/// documentation for more. +/// +/// [`drain_filter`]: struct.HashMap.html#method.drain_filter +/// [`HashMap`]: struct.HashMap.html +pub struct DrainFilter<'a, K, V, F> +where + F: FnMut(&K, &mut V) -> bool, +{ + f: F, + inner: DrainFilterInner<'a, K, V>, +} + +impl<'a, K, V, F> Drop for DrainFilter<'a, K, V, F> +where + F: FnMut(&K, &mut V) -> bool, +{ + #[cfg_attr(feature = "inline-more", inline)] + fn drop(&mut self) { + while let Some(item) = self.next() { + let guard = ConsumeAllOnDrop(self); + drop(item); + mem::forget(guard); + } + } +} + +pub(super) struct ConsumeAllOnDrop<'a, T: Iterator>(pub &'a mut T); + +impl Drop for ConsumeAllOnDrop<'_, T> { + #[cfg_attr(feature = "inline-more", inline)] + fn drop(&mut self) { + self.0.for_each(drop) + } +} + +impl Iterator for DrainFilter<'_, K, V, F> +where + F: FnMut(&K, &mut V) -> bool, +{ + type Item = (K, V); + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option { + self.inner.next(&mut self.f) + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + (0, self.inner.iter.size_hint().1) + } +} + +impl FusedIterator for DrainFilter<'_, K, V, F> where F: FnMut(&K, &mut V) -> bool {} + +/// Portions of `DrainFilter` shared with `set::DrainFilter` +pub(super) struct DrainFilterInner<'a, K, V> { + pub iter: RawIter<(K, V)>, + pub table: &'a mut RawTable<(K, V)>, +} + +impl DrainFilterInner<'_, K, V> { + #[cfg_attr(feature = "inline-more", inline)] + pub(super) fn next(&mut self, f: &mut F) -> Option<(K, V)> + where + F: FnMut(&K, &mut V) -> bool, + { + unsafe { + while let Some(item) = self.iter.next() { + let &mut (ref key, ref mut value) = item.as_mut(); + if f(key, value) { + return Some(self.table.remove(item)); + } + } + } + None + } +} + +/// A mutable iterator over the values of a `HashMap`. +/// +/// This `struct` is created by the [`values_mut`] method on [`HashMap`]. See its +/// documentation for more. +/// +/// [`values_mut`]: struct.HashMap.html#method.values_mut +/// [`HashMap`]: struct.HashMap.html +pub struct ValuesMut<'a, K, V> { + inner: IterMut<'a, K, V>, +} + +/// A builder for computing where in a [`HashMap`] a key-value pair would be stored. +/// +/// See the [`HashMap::raw_entry_mut`] docs for usage examples. +/// +/// [`HashMap::raw_entry_mut`]: struct.HashMap.html#method.raw_entry_mut +pub struct RawEntryBuilderMut<'a, K, V, S> { + map: &'a mut HashMap, +} + +/// A view into a single entry in a map, which may either be vacant or occupied. +/// +/// This is a lower-level version of [`Entry`]. +/// +/// This `enum` is constructed through the [`raw_entry_mut`] method on [`HashMap`], +/// then calling one of the methods of that [`RawEntryBuilderMut`]. +/// +/// [`HashMap`]: struct.HashMap.html +/// [`Entry`]: enum.Entry.html +/// [`raw_entry_mut`]: struct.HashMap.html#method.raw_entry_mut +/// [`RawEntryBuilderMut`]: struct.RawEntryBuilderMut.html +pub enum RawEntryMut<'a, K, V, S> { + /// An occupied entry. + Occupied(RawOccupiedEntryMut<'a, K, V, S>), + /// A vacant entry. + Vacant(RawVacantEntryMut<'a, K, V, S>), +} + +/// A view into an occupied entry in a `HashMap`. +/// It is part of the [`RawEntryMut`] enum. +/// +/// [`RawEntryMut`]: enum.RawEntryMut.html +pub struct RawOccupiedEntryMut<'a, K, V, S> { + elem: Bucket<(K, V)>, + table: &'a mut RawTable<(K, V)>, + hash_builder: &'a S, +} + +unsafe impl Send for RawOccupiedEntryMut<'_, K, V, S> +where + K: Send, + V: Send, + S: Sync, +{ +} +unsafe impl Sync for RawOccupiedEntryMut<'_, K, V, S> +where + K: Sync, + V: Sync, + S: Sync, +{ +} + +/// A view into a vacant entry in a `HashMap`. +/// It is part of the [`RawEntryMut`] enum. +/// +/// [`RawEntryMut`]: enum.RawEntryMut.html +pub struct RawVacantEntryMut<'a, K, V, S> { + table: &'a mut RawTable<(K, V)>, + hash_builder: &'a S, +} + +/// A builder for computing where in a [`HashMap`] a key-value pair would be stored. +/// +/// See the [`HashMap::raw_entry`] docs for usage examples. +/// +/// [`HashMap::raw_entry`]: struct.HashMap.html#method.raw_entry +pub struct RawEntryBuilder<'a, K, V, S> { + map: &'a HashMap, +} + +impl<'a, K, V, S> RawEntryBuilderMut<'a, K, V, S> { + /// Creates a `RawEntryMut` from the given key. + #[cfg_attr(feature = "inline-more", inline)] + #[allow(clippy::wrong_self_convention)] + pub fn from_key(self, k: &Q) -> RawEntryMut<'a, K, V, S> + where + S: BuildHasher, + K: Borrow, + Q: Hash + Eq, + { + let mut hasher = self.map.hash_builder.build_hasher(); + k.hash(&mut hasher); + self.from_key_hashed_nocheck(hasher.finish(), k) + } + + /// Creates a `RawEntryMut` from the given key and its hash. + #[inline] + #[allow(clippy::wrong_self_convention)] + pub fn from_key_hashed_nocheck(self, hash: u64, k: &Q) -> RawEntryMut<'a, K, V, S> + where + K: Borrow, + Q: Eq, + { + self.from_hash(hash, |q| q.borrow().eq(k)) + } +} + +impl<'a, K, V, S> RawEntryBuilderMut<'a, K, V, S> { + /// Creates a `RawEntryMut` from the given hash. + #[cfg_attr(feature = "inline-more", inline)] + #[allow(clippy::wrong_self_convention)] + pub fn from_hash(self, hash: u64, is_match: F) -> RawEntryMut<'a, K, V, S> + where + for<'b> F: FnMut(&'b K) -> bool, + { + self.search(hash, is_match) + } + + #[cfg_attr(feature = "inline-more", inline)] + fn search(self, hash: u64, mut is_match: F) -> RawEntryMut<'a, K, V, S> + where + for<'b> F: FnMut(&'b K) -> bool, + { + match self.map.table.find(hash, |(k, _)| is_match(k)) { + Some(elem) => RawEntryMut::Occupied(RawOccupiedEntryMut { + elem, + table: &mut self.map.table, + hash_builder: &self.map.hash_builder, + }), + None => RawEntryMut::Vacant(RawVacantEntryMut { + table: &mut self.map.table, + hash_builder: &self.map.hash_builder, + }), + } + } +} + +impl<'a, K, V, S> RawEntryBuilder<'a, K, V, S> { + /// Access an entry by key. + #[cfg_attr(feature = "inline-more", inline)] + #[allow(clippy::wrong_self_convention)] + pub fn from_key(self, k: &Q) -> Option<(&'a K, &'a V)> + where + S: BuildHasher, + K: Borrow, + Q: Hash + Eq, + { + let mut hasher = self.map.hash_builder.build_hasher(); + k.hash(&mut hasher); + self.from_key_hashed_nocheck(hasher.finish(), k) + } + + /// Access an entry by a key and its hash. + #[cfg_attr(feature = "inline-more", inline)] + #[allow(clippy::wrong_self_convention)] + pub fn from_key_hashed_nocheck(self, hash: u64, k: &Q) -> Option<(&'a K, &'a V)> + where + K: Borrow, + Q: Eq, + { + self.from_hash(hash, |q| q.borrow().eq(k)) + } + + #[cfg_attr(feature = "inline-more", inline)] + fn search(self, hash: u64, mut is_match: F) -> Option<(&'a K, &'a V)> + where + F: FnMut(&K) -> bool, + { + match self.map.table.get(hash, |(k, _)| is_match(k)) { + Some(&(ref key, ref value)) => Some((key, value)), + None => None, + } + } + + /// Access an entry by hash. + #[cfg_attr(feature = "inline-more", inline)] + #[allow(clippy::wrong_self_convention)] + pub fn from_hash(self, hash: u64, is_match: F) -> Option<(&'a K, &'a V)> + where + F: FnMut(&K) -> bool, + { + self.search(hash, is_match) + } +} + +impl<'a, K, V, S> RawEntryMut<'a, K, V, S> { + /// Sets the value of the entry, and returns a RawOccupiedEntryMut. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// let entry = map.raw_entry_mut().from_key("horseyland").insert("horseyland", 37); + /// + /// assert_eq!(entry.remove_entry(), ("horseyland", 37)); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn insert(self, key: K, value: V) -> RawOccupiedEntryMut<'a, K, V, S> + where + K: Hash, + S: BuildHasher, + { + match self { + RawEntryMut::Occupied(mut entry) => { + entry.insert(value); + entry + } + RawEntryMut::Vacant(entry) => entry.insert_entry(key, value), + } + } + + /// Ensures a value is in the entry by inserting the default if empty, and returns + /// mutable references to the key and value in the entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// + /// map.raw_entry_mut().from_key("poneyland").or_insert("poneyland", 3); + /// assert_eq!(map["poneyland"], 3); + /// + /// *map.raw_entry_mut().from_key("poneyland").or_insert("poneyland", 10).1 *= 2; + /// assert_eq!(map["poneyland"], 6); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn or_insert(self, default_key: K, default_val: V) -> (&'a mut K, &'a mut V) + where + K: Hash, + S: BuildHasher, + { + match self { + RawEntryMut::Occupied(entry) => entry.into_key_value(), + RawEntryMut::Vacant(entry) => entry.insert(default_key, default_val), + } + } + + /// Ensures a value is in the entry by inserting the result of the default function if empty, + /// and returns mutable references to the key and value in the entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, String> = HashMap::new(); + /// + /// map.raw_entry_mut().from_key("poneyland").or_insert_with(|| { + /// ("poneyland", "hoho".to_string()) + /// }); + /// + /// assert_eq!(map["poneyland"], "hoho".to_string()); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn or_insert_with(self, default: F) -> (&'a mut K, &'a mut V) + where + F: FnOnce() -> (K, V), + K: Hash, + S: BuildHasher, + { + match self { + RawEntryMut::Occupied(entry) => entry.into_key_value(), + RawEntryMut::Vacant(entry) => { + let (k, v) = default(); + entry.insert(k, v) + } + } + } + + /// Provides in-place mutable access to an occupied entry before any + /// potential inserts into the map. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// + /// map.raw_entry_mut() + /// .from_key("poneyland") + /// .and_modify(|_k, v| { *v += 1 }) + /// .or_insert("poneyland", 42); + /// assert_eq!(map["poneyland"], 42); + /// + /// map.raw_entry_mut() + /// .from_key("poneyland") + /// .and_modify(|_k, v| { *v += 1 }) + /// .or_insert("poneyland", 0); + /// assert_eq!(map["poneyland"], 43); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn and_modify(self, f: F) -> Self + where + F: FnOnce(&mut K, &mut V), + { + match self { + RawEntryMut::Occupied(mut entry) => { + { + let (k, v) = entry.get_key_value_mut(); + f(k, v); + } + RawEntryMut::Occupied(entry) + } + RawEntryMut::Vacant(entry) => RawEntryMut::Vacant(entry), + } + } + + /// Provides shared access to the key and owned access to the value of + /// an occupied entry and allows to replace or remove it based on the + /// value of the returned option. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::RawEntryMut; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// + /// let entry = map + /// .raw_entry_mut() + /// .from_key("poneyland") + /// .and_replace_entry_with(|_k, _v| panic!()); + /// + /// match entry { + /// RawEntryMut::Vacant(_) => {}, + /// RawEntryMut::Occupied(_) => panic!(), + /// } + /// + /// map.insert("poneyland", 42); + /// + /// let entry = map + /// .raw_entry_mut() + /// .from_key("poneyland") + /// .and_replace_entry_with(|k, v| { + /// assert_eq!(k, &"poneyland"); + /// assert_eq!(v, 42); + /// Some(v + 1) + /// }); + /// + /// match entry { + /// RawEntryMut::Occupied(e) => { + /// assert_eq!(e.key(), &"poneyland"); + /// assert_eq!(e.get(), &43); + /// }, + /// RawEntryMut::Vacant(_) => panic!(), + /// } + /// + /// assert_eq!(map["poneyland"], 43); + /// + /// let entry = map + /// .raw_entry_mut() + /// .from_key("poneyland") + /// .and_replace_entry_with(|_k, _v| None); + /// + /// match entry { + /// RawEntryMut::Vacant(_) => {}, + /// RawEntryMut::Occupied(_) => panic!(), + /// } + /// + /// assert!(!map.contains_key("poneyland")); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn and_replace_entry_with(self, f: F) -> Self + where + F: FnOnce(&K, V) -> Option, + { + match self { + RawEntryMut::Occupied(entry) => entry.replace_entry_with(f), + RawEntryMut::Vacant(_) => self, + } + } +} + +impl<'a, K, V, S> RawOccupiedEntryMut<'a, K, V, S> { + /// Gets a reference to the key in the entry. + #[cfg_attr(feature = "inline-more", inline)] + pub fn key(&self) -> &K { + unsafe { &self.elem.as_ref().0 } + } + + /// Gets a mutable reference to the key in the entry. + #[cfg_attr(feature = "inline-more", inline)] + pub fn key_mut(&mut self) -> &mut K { + unsafe { &mut self.elem.as_mut().0 } + } + + /// Converts the entry into a mutable reference to the key in the entry + /// with a lifetime bound to the map itself. + #[cfg_attr(feature = "inline-more", inline)] + pub fn into_key(self) -> &'a mut K { + unsafe { &mut self.elem.as_mut().0 } + } + + /// Gets a reference to the value in the entry. + #[cfg_attr(feature = "inline-more", inline)] + pub fn get(&self) -> &V { + unsafe { &self.elem.as_ref().1 } + } + + /// Converts the OccupiedEntry into a mutable reference to the value in the entry + /// with a lifetime bound to the map itself. + #[cfg_attr(feature = "inline-more", inline)] + pub fn into_mut(self) -> &'a mut V { + unsafe { &mut self.elem.as_mut().1 } + } + + /// Gets a mutable reference to the value in the entry. + #[cfg_attr(feature = "inline-more", inline)] + pub fn get_mut(&mut self) -> &mut V { + unsafe { &mut self.elem.as_mut().1 } + } + + /// Gets a reference to the key and value in the entry. + #[cfg_attr(feature = "inline-more", inline)] + pub fn get_key_value(&mut self) -> (&K, &V) { + unsafe { + let &(ref key, ref value) = self.elem.as_ref(); + (key, value) + } + } + + /// Gets a mutable reference to the key and value in the entry. + #[cfg_attr(feature = "inline-more", inline)] + pub fn get_key_value_mut(&mut self) -> (&mut K, &mut V) { + unsafe { + let &mut (ref mut key, ref mut value) = self.elem.as_mut(); + (key, value) + } + } + + /// Converts the OccupiedEntry into a mutable reference to the key and value in the entry + /// with a lifetime bound to the map itself. + #[cfg_attr(feature = "inline-more", inline)] + pub fn into_key_value(self) -> (&'a mut K, &'a mut V) { + unsafe { + let &mut (ref mut key, ref mut value) = self.elem.as_mut(); + (key, value) + } + } + + /// Sets the value of the entry, and returns the entry's old value. + #[cfg_attr(feature = "inline-more", inline)] + pub fn insert(&mut self, value: V) -> V { + mem::replace(self.get_mut(), value) + } + + /// Sets the value of the entry, and returns the entry's old value. + #[cfg_attr(feature = "inline-more", inline)] + pub fn insert_key(&mut self, key: K) -> K { + mem::replace(self.key_mut(), key) + } + + /// Takes the value out of the entry, and returns it. + #[cfg_attr(feature = "inline-more", inline)] + pub fn remove(self) -> V { + self.remove_entry().1 + } + + /// Take the ownership of the key and value from the map. + #[cfg_attr(feature = "inline-more", inline)] + pub fn remove_entry(self) -> (K, V) { + unsafe { self.table.remove(self.elem) } + } + + /// Provides shared access to the key and owned access to the value of + /// the entry and allows to replace or remove it based on the + /// value of the returned option. + #[cfg_attr(feature = "inline-more", inline)] + pub fn replace_entry_with(self, f: F) -> RawEntryMut<'a, K, V, S> + where + F: FnOnce(&K, V) -> Option, + { + unsafe { + let still_occupied = self + .table + .replace_bucket_with(self.elem.clone(), |(key, value)| { + f(&key, value).map(|new_value| (key, new_value)) + }); + + if still_occupied { + RawEntryMut::Occupied(self) + } else { + RawEntryMut::Vacant(RawVacantEntryMut { + table: self.table, + hash_builder: self.hash_builder, + }) + } + } + } +} + +impl<'a, K, V, S> RawVacantEntryMut<'a, K, V, S> { + /// Sets the value of the entry with the VacantEntry's key, + /// and returns a mutable reference to it. + #[cfg_attr(feature = "inline-more", inline)] + pub fn insert(self, key: K, value: V) -> (&'a mut K, &'a mut V) + where + K: Hash, + S: BuildHasher, + { + let mut hasher = self.hash_builder.build_hasher(); + key.hash(&mut hasher); + self.insert_hashed_nocheck(hasher.finish(), key, value) + } + + /// Sets the value of the entry with the VacantEntry's key, + /// and returns a mutable reference to it. + #[cfg_attr(feature = "inline-more", inline)] + #[allow(clippy::shadow_unrelated)] + pub fn insert_hashed_nocheck(self, hash: u64, key: K, value: V) -> (&'a mut K, &'a mut V) + where + K: Hash, + S: BuildHasher, + { + let hash_builder = self.hash_builder; + self.insert_with_hasher(hash, key, value, |k| make_hash(hash_builder, k)) + } + + /// Set the value of an entry with a custom hasher function. + #[cfg_attr(feature = "inline-more", inline)] + pub fn insert_with_hasher( + self, + hash: u64, + key: K, + value: V, + hasher: H, + ) -> (&'a mut K, &'a mut V) + where + H: Fn(&K) -> u64, + { + let &mut (ref mut k, ref mut v) = self + .table + .insert_entry(hash, (key, value), |x| hasher(&x.0)); + (k, v) + } + + #[cfg_attr(feature = "inline-more", inline)] + fn insert_entry(self, key: K, value: V) -> RawOccupiedEntryMut<'a, K, V, S> + where + K: Hash, + S: BuildHasher, + { + let hash_builder = self.hash_builder; + let mut hasher = self.hash_builder.build_hasher(); + key.hash(&mut hasher); + + let elem = self.table.insert(hasher.finish(), (key, value), |k| { + make_hash(hash_builder, &k.0) + }); + RawOccupiedEntryMut { + elem, + table: self.table, + hash_builder: self.hash_builder, + } + } +} + +impl Debug for RawEntryBuilderMut<'_, K, V, S> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("RawEntryBuilder").finish() + } +} + +impl Debug for RawEntryMut<'_, K, V, S> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match *self { + RawEntryMut::Vacant(ref v) => f.debug_tuple("RawEntry").field(v).finish(), + RawEntryMut::Occupied(ref o) => f.debug_tuple("RawEntry").field(o).finish(), + } + } +} + +impl Debug for RawOccupiedEntryMut<'_, K, V, S> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("RawOccupiedEntryMut") + .field("key", self.key()) + .field("value", self.get()) + .finish() + } +} + +impl Debug for RawVacantEntryMut<'_, K, V, S> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("RawVacantEntryMut").finish() + } +} + +impl Debug for RawEntryBuilder<'_, K, V, S> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("RawEntryBuilder").finish() + } +} + +/// A view into a single entry in a map, which may either be vacant or occupied. +/// +/// This `enum` is constructed from the [`entry`] method on [`HashMap`]. +/// +/// [`HashMap`]: struct.HashMap.html +/// [`entry`]: struct.HashMap.html#method.entry +pub enum Entry<'a, K, V, S> { + /// An occupied entry. + Occupied(OccupiedEntry<'a, K, V, S>), + + /// A vacant entry. + Vacant(VacantEntry<'a, K, V, S>), +} + +impl Debug for Entry<'_, K, V, S> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + match *self { + Entry::Vacant(ref v) => f.debug_tuple("Entry").field(v).finish(), + Entry::Occupied(ref o) => f.debug_tuple("Entry").field(o).finish(), + } + } +} + +/// A view into an occupied entry in a `HashMap`. +/// It is part of the [`Entry`] enum. +/// +/// [`Entry`]: enum.Entry.html +pub struct OccupiedEntry<'a, K, V, S> { + hash: u64, + key: Option, + elem: Bucket<(K, V)>, + table: &'a mut HashMap, +} + +unsafe impl Send for OccupiedEntry<'_, K, V, S> +where + K: Send, + V: Send, + S: Send, +{ +} +unsafe impl Sync for OccupiedEntry<'_, K, V, S> +where + K: Sync, + V: Sync, + S: Sync, +{ +} + +impl Debug for OccupiedEntry<'_, K, V, S> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("OccupiedEntry") + .field("key", self.key()) + .field("value", self.get()) + .finish() + } +} + +/// A view into a vacant entry in a `HashMap`. +/// It is part of the [`Entry`] enum. +/// +/// [`Entry`]: enum.Entry.html +pub struct VacantEntry<'a, K, V, S> { + hash: u64, + key: K, + table: &'a mut HashMap, +} + +impl Debug for VacantEntry<'_, K, V, S> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("VacantEntry").field(self.key()).finish() + } +} + +impl<'a, K, V, S> IntoIterator for &'a HashMap { + type Item = (&'a K, &'a V); + type IntoIter = Iter<'a, K, V>; + + #[cfg_attr(feature = "inline-more", inline)] + fn into_iter(self) -> Iter<'a, K, V> { + self.iter() + } +} + +impl<'a, K, V, S> IntoIterator for &'a mut HashMap { + type Item = (&'a K, &'a mut V); + type IntoIter = IterMut<'a, K, V>; + + #[cfg_attr(feature = "inline-more", inline)] + fn into_iter(self) -> IterMut<'a, K, V> { + self.iter_mut() + } +} + +impl IntoIterator for HashMap { + type Item = (K, V); + type IntoIter = IntoIter; + + /// Creates a consuming iterator, that is, one that moves each key-value + /// pair out of the map in arbitrary order. The map cannot be used after + /// calling this. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map = HashMap::new(); + /// map.insert("a", 1); + /// map.insert("b", 2); + /// map.insert("c", 3); + /// + /// // Not possible with .iter() + /// let vec: Vec<(&str, i32)> = map.into_iter().collect(); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + fn into_iter(self) -> IntoIter { + IntoIter { + inner: self.table.into_iter(), + } + } +} + +impl<'a, K, V> Iterator for Iter<'a, K, V> { + type Item = (&'a K, &'a V); + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option<(&'a K, &'a V)> { + // Avoid `Option::map` because it bloats LLVM IR. + match self.inner.next() { + Some(x) => unsafe { + let r = x.as_ref(); + Some((&r.0, &r.1)) + }, + None => None, + } + } + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + self.inner.size_hint() + } +} +impl ExactSizeIterator for Iter<'_, K, V> { + #[cfg_attr(feature = "inline-more", inline)] + fn len(&self) -> usize { + self.inner.len() + } +} + +impl FusedIterator for Iter<'_, K, V> {} + +impl<'a, K, V> Iterator for IterMut<'a, K, V> { + type Item = (&'a K, &'a mut V); + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option<(&'a K, &'a mut V)> { + // Avoid `Option::map` because it bloats LLVM IR. + match self.inner.next() { + Some(x) => unsafe { + let r = x.as_mut(); + Some((&r.0, &mut r.1)) + }, + None => None, + } + } + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + self.inner.size_hint() + } +} +impl ExactSizeIterator for IterMut<'_, K, V> { + #[cfg_attr(feature = "inline-more", inline)] + fn len(&self) -> usize { + self.inner.len() + } +} +impl FusedIterator for IterMut<'_, K, V> {} + +impl fmt::Debug for IterMut<'_, K, V> +where + K: fmt::Debug, + V: fmt::Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_list().entries(self.iter()).finish() + } +} + +impl Iterator for IntoIter { + type Item = (K, V); + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option<(K, V)> { + self.inner.next() + } + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + self.inner.size_hint() + } +} +impl ExactSizeIterator for IntoIter { + #[cfg_attr(feature = "inline-more", inline)] + fn len(&self) -> usize { + self.inner.len() + } +} +impl FusedIterator for IntoIter {} + +impl fmt::Debug for IntoIter { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_list().entries(self.iter()).finish() + } +} + +impl<'a, K, V> Iterator for Keys<'a, K, V> { + type Item = &'a K; + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option<&'a K> { + // Avoid `Option::map` because it bloats LLVM IR. + match self.inner.next() { + Some((k, _)) => Some(k), + None => None, + } + } + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + self.inner.size_hint() + } +} +impl ExactSizeIterator for Keys<'_, K, V> { + #[cfg_attr(feature = "inline-more", inline)] + fn len(&self) -> usize { + self.inner.len() + } +} +impl FusedIterator for Keys<'_, K, V> {} + +impl<'a, K, V> Iterator for Values<'a, K, V> { + type Item = &'a V; + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option<&'a V> { + // Avoid `Option::map` because it bloats LLVM IR. + match self.inner.next() { + Some((_, v)) => Some(v), + None => None, + } + } + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + self.inner.size_hint() + } +} +impl ExactSizeIterator for Values<'_, K, V> { + #[cfg_attr(feature = "inline-more", inline)] + fn len(&self) -> usize { + self.inner.len() + } +} +impl FusedIterator for Values<'_, K, V> {} + +impl<'a, K, V> Iterator for ValuesMut<'a, K, V> { + type Item = &'a mut V; + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option<&'a mut V> { + // Avoid `Option::map` because it bloats LLVM IR. + match self.inner.next() { + Some((_, v)) => Some(v), + None => None, + } + } + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + self.inner.size_hint() + } +} +impl ExactSizeIterator for ValuesMut<'_, K, V> { + #[cfg_attr(feature = "inline-more", inline)] + fn len(&self) -> usize { + self.inner.len() + } +} +impl FusedIterator for ValuesMut<'_, K, V> {} + +impl fmt::Debug for ValuesMut<'_, K, V> +where + K: fmt::Debug, + V: fmt::Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_list().entries(self.inner.iter()).finish() + } +} + +impl<'a, K, V> Iterator for Drain<'a, K, V> { + type Item = (K, V); + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option<(K, V)> { + self.inner.next() + } + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + self.inner.size_hint() + } +} +impl ExactSizeIterator for Drain<'_, K, V> { + #[cfg_attr(feature = "inline-more", inline)] + fn len(&self) -> usize { + self.inner.len() + } +} +impl FusedIterator for Drain<'_, K, V> {} + +impl fmt::Debug for Drain<'_, K, V> +where + K: fmt::Debug, + V: fmt::Debug, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_list().entries(self.iter()).finish() + } +} + +impl<'a, K, V, S> Entry<'a, K, V, S> { + /// Sets the value of the entry, and returns an OccupiedEntry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// let entry = map.entry("horseyland").insert(37); + /// + /// assert_eq!(entry.key(), &"horseyland"); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn insert(self, value: V) -> OccupiedEntry<'a, K, V, S> + where + K: Hash, + S: BuildHasher, + { + match self { + Entry::Occupied(mut entry) => { + entry.insert(value); + entry + } + Entry::Vacant(entry) => entry.insert_entry(value), + } + } + + /// Ensures a value is in the entry by inserting the default if empty, and returns + /// a mutable reference to the value in the entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// + /// map.entry("poneyland").or_insert(3); + /// assert_eq!(map["poneyland"], 3); + /// + /// *map.entry("poneyland").or_insert(10) *= 2; + /// assert_eq!(map["poneyland"], 6); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn or_insert(self, default: V) -> &'a mut V + where + K: Hash, + S: BuildHasher, + { + match self { + Entry::Occupied(entry) => entry.into_mut(), + Entry::Vacant(entry) => entry.insert(default), + } + } + + /// Ensures a value is in the entry by inserting the result of the default function if empty, + /// and returns a mutable reference to the value in the entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, String> = HashMap::new(); + /// let s = "hoho".to_string(); + /// + /// map.entry("poneyland").or_insert_with(|| s); + /// + /// assert_eq!(map["poneyland"], "hoho".to_string()); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn or_insert_with V>(self, default: F) -> &'a mut V + where + K: Hash, + S: BuildHasher, + { + match self { + Entry::Occupied(entry) => entry.into_mut(), + Entry::Vacant(entry) => entry.insert(default()), + } + } + + /// Ensures a value is in the entry by inserting, if empty, the result of the default function, + /// which takes the key as its argument, and returns a mutable reference to the value in the + /// entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, usize> = HashMap::new(); + /// + /// map.entry("poneyland").or_insert_with_key(|key| key.chars().count()); + /// + /// assert_eq!(map["poneyland"], 9); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn or_insert_with_key V>(self, default: F) -> &'a mut V + where + K: Hash, + S: BuildHasher, + { + match self { + Entry::Occupied(entry) => entry.into_mut(), + Entry::Vacant(entry) => { + let value = default(entry.key()); + entry.insert(value) + } + } + } + + /// Returns a reference to this entry's key. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// assert_eq!(map.entry("poneyland").key(), &"poneyland"); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn key(&self) -> &K { + match *self { + Entry::Occupied(ref entry) => entry.key(), + Entry::Vacant(ref entry) => entry.key(), + } + } + + /// Provides in-place mutable access to an occupied entry before any + /// potential inserts into the map. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// + /// map.entry("poneyland") + /// .and_modify(|e| { *e += 1 }) + /// .or_insert(42); + /// assert_eq!(map["poneyland"], 42); + /// + /// map.entry("poneyland") + /// .and_modify(|e| { *e += 1 }) + /// .or_insert(42); + /// assert_eq!(map["poneyland"], 43); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn and_modify(self, f: F) -> Self + where + F: FnOnce(&mut V), + { + match self { + Entry::Occupied(mut entry) => { + f(entry.get_mut()); + Entry::Occupied(entry) + } + Entry::Vacant(entry) => Entry::Vacant(entry), + } + } + + /// Provides shared access to the key and owned access to the value of + /// an occupied entry and allows to replace or remove it based on the + /// value of the returned option. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::Entry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// + /// let entry = map + /// .entry("poneyland") + /// .and_replace_entry_with(|_k, _v| panic!()); + /// + /// match entry { + /// Entry::Vacant(e) => { + /// assert_eq!(e.key(), &"poneyland"); + /// } + /// Entry::Occupied(_) => panic!(), + /// } + /// + /// map.insert("poneyland", 42); + /// + /// let entry = map + /// .entry("poneyland") + /// .and_replace_entry_with(|k, v| { + /// assert_eq!(k, &"poneyland"); + /// assert_eq!(v, 42); + /// Some(v + 1) + /// }); + /// + /// match entry { + /// Entry::Occupied(e) => { + /// assert_eq!(e.key(), &"poneyland"); + /// assert_eq!(e.get(), &43); + /// } + /// Entry::Vacant(_) => panic!(), + /// } + /// + /// assert_eq!(map["poneyland"], 43); + /// + /// let entry = map + /// .entry("poneyland") + /// .and_replace_entry_with(|_k, _v| None); + /// + /// match entry { + /// Entry::Vacant(e) => assert_eq!(e.key(), &"poneyland"), + /// Entry::Occupied(_) => panic!(), + /// } + /// + /// assert!(!map.contains_key("poneyland")); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn and_replace_entry_with(self, f: F) -> Self + where + F: FnOnce(&K, V) -> Option, + { + match self { + Entry::Occupied(entry) => entry.replace_entry_with(f), + Entry::Vacant(_) => self, + } + } +} + +impl<'a, K, V: Default, S> Entry<'a, K, V, S> { + /// Ensures a value is in the entry by inserting the default value if empty, + /// and returns a mutable reference to the value in the entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, Option> = HashMap::new(); + /// map.entry("poneyland").or_default(); + /// + /// assert_eq!(map["poneyland"], None); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn or_default(self) -> &'a mut V + where + K: Hash, + S: BuildHasher, + { + match self { + Entry::Occupied(entry) => entry.into_mut(), + Entry::Vacant(entry) => entry.insert(Default::default()), + } + } +} + +impl<'a, K, V, S> OccupiedEntry<'a, K, V, S> { + /// Gets a reference to the key in the entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// map.entry("poneyland").or_insert(12); + /// assert_eq!(map.entry("poneyland").key(), &"poneyland"); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn key(&self) -> &K { + unsafe { &self.elem.as_ref().0 } + } + + /// Take the ownership of the key and value from the map. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::Entry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// map.entry("poneyland").or_insert(12); + /// + /// if let Entry::Occupied(o) = map.entry("poneyland") { + /// // We delete the entry from the map. + /// o.remove_entry(); + /// } + /// + /// assert_eq!(map.contains_key("poneyland"), false); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn remove_entry(self) -> (K, V) { + unsafe { self.table.table.remove(self.elem) } + } + + /// Gets a reference to the value in the entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::Entry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// map.entry("poneyland").or_insert(12); + /// + /// if let Entry::Occupied(o) = map.entry("poneyland") { + /// assert_eq!(o.get(), &12); + /// } + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn get(&self) -> &V { + unsafe { &self.elem.as_ref().1 } + } + + /// Gets a mutable reference to the value in the entry. + /// + /// If you need a reference to the `OccupiedEntry` which may outlive the + /// destruction of the `Entry` value, see [`into_mut`]. + /// + /// [`into_mut`]: #method.into_mut + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::Entry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// map.entry("poneyland").or_insert(12); + /// + /// assert_eq!(map["poneyland"], 12); + /// if let Entry::Occupied(mut o) = map.entry("poneyland") { + /// *o.get_mut() += 10; + /// assert_eq!(*o.get(), 22); + /// + /// // We can use the same Entry multiple times. + /// *o.get_mut() += 2; + /// } + /// + /// assert_eq!(map["poneyland"], 24); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn get_mut(&mut self) -> &mut V { + unsafe { &mut self.elem.as_mut().1 } + } + + /// Converts the OccupiedEntry into a mutable reference to the value in the entry + /// with a lifetime bound to the map itself. + /// + /// If you need multiple references to the `OccupiedEntry`, see [`get_mut`]. + /// + /// [`get_mut`]: #method.get_mut + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::Entry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// map.entry("poneyland").or_insert(12); + /// + /// assert_eq!(map["poneyland"], 12); + /// if let Entry::Occupied(o) = map.entry("poneyland") { + /// *o.into_mut() += 10; + /// } + /// + /// assert_eq!(map["poneyland"], 22); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn into_mut(self) -> &'a mut V { + unsafe { &mut self.elem.as_mut().1 } + } + + /// Sets the value of the entry, and returns the entry's old value. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::Entry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// map.entry("poneyland").or_insert(12); + /// + /// if let Entry::Occupied(mut o) = map.entry("poneyland") { + /// assert_eq!(o.insert(15), 12); + /// } + /// + /// assert_eq!(map["poneyland"], 15); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn insert(&mut self, mut value: V) -> V { + let old_value = self.get_mut(); + mem::swap(&mut value, old_value); + value + } + + /// Takes the value out of the entry, and returns it. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::Entry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// map.entry("poneyland").or_insert(12); + /// + /// if let Entry::Occupied(o) = map.entry("poneyland") { + /// assert_eq!(o.remove(), 12); + /// } + /// + /// assert_eq!(map.contains_key("poneyland"), false); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn remove(self) -> V { + self.remove_entry().1 + } + + /// Replaces the entry, returning the old key and value. The new key in the hash map will be + /// the key used to create this entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::hash_map::{Entry, HashMap}; + /// use std::rc::Rc; + /// + /// let mut map: HashMap, u32> = HashMap::new(); + /// map.insert(Rc::new("Stringthing".to_string()), 15); + /// + /// let my_key = Rc::new("Stringthing".to_string()); + /// + /// if let Entry::Occupied(entry) = map.entry(my_key) { + /// // Also replace the key with a handle to our other key. + /// let (old_key, old_value): (Rc, u32) = entry.replace_entry(16); + /// } + /// + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn replace_entry(self, value: V) -> (K, V) { + let entry = unsafe { self.elem.as_mut() }; + + let old_key = mem::replace(&mut entry.0, self.key.unwrap()); + let old_value = mem::replace(&mut entry.1, value); + + (old_key, old_value) + } + + /// Replaces the key in the hash map with the key used to create this entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::hash_map::{Entry, HashMap}; + /// use std::rc::Rc; + /// + /// let mut map: HashMap, u32> = HashMap::new(); + /// let mut known_strings: Vec> = Vec::new(); + /// + /// // Initialise known strings, run program, etc. + /// + /// reclaim_memory(&mut map, &known_strings); + /// + /// fn reclaim_memory(map: &mut HashMap, u32>, known_strings: &[Rc] ) { + /// for s in known_strings { + /// if let Entry::Occupied(entry) = map.entry(s.clone()) { + /// // Replaces the entry's key with our version of it in `known_strings`. + /// entry.replace_key(); + /// } + /// } + /// } + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn replace_key(self) -> K { + let entry = unsafe { self.elem.as_mut() }; + mem::replace(&mut entry.0, self.key.unwrap()) + } + + /// Provides shared access to the key and owned access to the value of + /// the entry and allows to replace or remove it based on the + /// value of the returned option. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::Entry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// map.insert("poneyland", 42); + /// + /// let entry = match map.entry("poneyland") { + /// Entry::Occupied(e) => { + /// e.replace_entry_with(|k, v| { + /// assert_eq!(k, &"poneyland"); + /// assert_eq!(v, 42); + /// Some(v + 1) + /// }) + /// } + /// Entry::Vacant(_) => panic!(), + /// }; + /// + /// match entry { + /// Entry::Occupied(e) => { + /// assert_eq!(e.key(), &"poneyland"); + /// assert_eq!(e.get(), &43); + /// } + /// Entry::Vacant(_) => panic!(), + /// } + /// + /// assert_eq!(map["poneyland"], 43); + /// + /// let entry = match map.entry("poneyland") { + /// Entry::Occupied(e) => e.replace_entry_with(|_k, _v| None), + /// Entry::Vacant(_) => panic!(), + /// }; + /// + /// match entry { + /// Entry::Vacant(e) => { + /// assert_eq!(e.key(), &"poneyland"); + /// } + /// Entry::Occupied(_) => panic!(), + /// } + /// + /// assert!(!map.contains_key("poneyland")); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn replace_entry_with(self, f: F) -> Entry<'a, K, V, S> + where + F: FnOnce(&K, V) -> Option, + { + unsafe { + let mut spare_key = None; + + self.table + .table + .replace_bucket_with(self.elem.clone(), |(key, value)| { + if let Some(new_value) = f(&key, value) { + Some((key, new_value)) + } else { + spare_key = Some(key); + None + } + }); + + if let Some(key) = spare_key { + Entry::Vacant(VacantEntry { + hash: self.hash, + key, + table: self.table, + }) + } else { + Entry::Occupied(self) + } + } + } +} + +impl<'a, K, V, S> VacantEntry<'a, K, V, S> { + /// Gets a reference to the key that would be used when inserting a value + /// through the `VacantEntry`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// assert_eq!(map.entry("poneyland").key(), &"poneyland"); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn key(&self) -> &K { + &self.key + } + + /// Take ownership of the key. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::Entry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// + /// if let Entry::Vacant(v) = map.entry("poneyland") { + /// v.into_key(); + /// } + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn into_key(self) -> K { + self.key + } + + /// Sets the value of the entry with the VacantEntry's key, + /// and returns a mutable reference to it. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::Entry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// + /// if let Entry::Vacant(o) = map.entry("poneyland") { + /// o.insert(37); + /// } + /// assert_eq!(map["poneyland"], 37); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn insert(self, value: V) -> &'a mut V + where + K: Hash, + S: BuildHasher, + { + let hash_builder = &self.table.hash_builder; + let table = &mut self.table.table; + let entry = table.insert_entry(self.hash, (self.key, value), |x| { + make_hash(hash_builder, &x.0) + }); + &mut entry.1 + } + + #[cfg_attr(feature = "inline-more", inline)] + fn insert_entry(self, value: V) -> OccupiedEntry<'a, K, V, S> + where + K: Hash, + S: BuildHasher, + { + let hash_builder = &self.table.hash_builder; + let elem = self.table.table.insert(self.hash, (self.key, value), |x| { + make_hash(hash_builder, &x.0) + }); + OccupiedEntry { + hash: self.hash, + key: None, + elem, + table: self.table, + } + } +} + +impl FromIterator<(K, V)> for HashMap +where + K: Eq + Hash, + S: BuildHasher + Default, +{ + #[cfg_attr(feature = "inline-more", inline)] + fn from_iter>(iter: T) -> Self { + let iter = iter.into_iter(); + let mut map = Self::with_capacity_and_hasher(iter.size_hint().0, S::default()); + iter.for_each(|(k, v)| { + map.insert(k, v); + }); + map + } +} + +/// Inserts all new key-values from the iterator and replaces values with existing +/// keys with new values returned from the iterator. +impl Extend<(K, V)> for HashMap +where + K: Eq + Hash, + S: BuildHasher, +{ + #[cfg_attr(feature = "inline-more", inline)] + fn extend>(&mut self, iter: T) { + // Keys may be already present or show multiple times in the iterator. + // Reserve the entire hint lower bound if the map is empty. + // Otherwise reserve half the hint (rounded up), so the map + // will only resize twice in the worst case. + let iter = iter.into_iter(); + let reserve = if self.is_empty() { + iter.size_hint().0 + } else { + (iter.size_hint().0 + 1) / 2 + }; + self.reserve(reserve); + iter.for_each(move |(k, v)| { + self.insert(k, v); + }); + } + + #[inline] + #[cfg(feature = "nightly")] + fn extend_one(&mut self, (k, v): (K, V)) { + self.insert(k, v); + } + + #[inline] + #[cfg(feature = "nightly")] + fn extend_reserve(&mut self, additional: usize) { + // Keys may be already present or show multiple times in the iterator. + // Reserve the entire hint lower bound if the map is empty. + // Otherwise reserve half the hint (rounded up), so the map + // will only resize twice in the worst case. + let reserve = if self.is_empty() { + additional + } else { + (additional + 1) / 2 + }; + self.reserve(reserve); + } +} + +impl<'a, K, V, S> Extend<(&'a K, &'a V)> for HashMap +where + K: Eq + Hash + Copy, + V: Copy, + S: BuildHasher, +{ + #[cfg_attr(feature = "inline-more", inline)] + fn extend>(&mut self, iter: T) { + self.extend(iter.into_iter().map(|(&key, &value)| (key, value))); + } + + #[inline] + #[cfg(feature = "nightly")] + fn extend_one(&mut self, (k, v): (&'a K, &'a V)) { + self.insert(*k, *v); + } + + #[inline] + #[cfg(feature = "nightly")] + fn extend_reserve(&mut self, additional: usize) { + Extend::<(K, V)>::extend_reserve(self, additional); + } +} + +#[allow(dead_code)] +fn assert_covariance() { + fn map_key<'new>(v: HashMap<&'static str, u8>) -> HashMap<&'new str, u8> { + v + } + fn map_val<'new>(v: HashMap) -> HashMap { + v + } + fn iter_key<'a, 'new>(v: Iter<'a, &'static str, u8>) -> Iter<'a, &'new str, u8> { + v + } + fn iter_val<'a, 'new>(v: Iter<'a, u8, &'static str>) -> Iter<'a, u8, &'new str> { + v + } + fn into_iter_key<'new>(v: IntoIter<&'static str, u8>) -> IntoIter<&'new str, u8> { + v + } + fn into_iter_val<'new>(v: IntoIter) -> IntoIter { + v + } + fn keys_key<'a, 'new>(v: Keys<'a, &'static str, u8>) -> Keys<'a, &'new str, u8> { + v + } + fn keys_val<'a, 'new>(v: Keys<'a, u8, &'static str>) -> Keys<'a, u8, &'new str> { + v + } + fn values_key<'a, 'new>(v: Values<'a, &'static str, u8>) -> Values<'a, &'new str, u8> { + v + } + fn values_val<'a, 'new>(v: Values<'a, u8, &'static str>) -> Values<'a, u8, &'new str> { + v + } + fn drain<'new>( + d: Drain<'static, &'static str, &'static str>, + ) -> Drain<'new, &'new str, &'new str> { + d + } +} + +#[cfg(test)] +mod test_map { + use super::DefaultHashBuilder; + use super::Entry::{Occupied, Vacant}; + use super::{HashMap, RawEntryMut}; + use crate::TryReserveError::*; + use rand::{rngs::SmallRng, Rng, SeedableRng}; + use std::cell::RefCell; + use std::usize; + use std::vec::Vec; + + #[test] + fn test_zero_capacities() { + type HM = HashMap; + + let m = HM::new(); + assert_eq!(m.capacity(), 0); + + let m = HM::default(); + assert_eq!(m.capacity(), 0); + + let m = HM::with_hasher(DefaultHashBuilder::default()); + assert_eq!(m.capacity(), 0); + + let m = HM::with_capacity(0); + assert_eq!(m.capacity(), 0); + + let m = HM::with_capacity_and_hasher(0, DefaultHashBuilder::default()); + assert_eq!(m.capacity(), 0); + + let mut m = HM::new(); + m.insert(1, 1); + m.insert(2, 2); + m.remove(&1); + m.remove(&2); + m.shrink_to_fit(); + assert_eq!(m.capacity(), 0); + + let mut m = HM::new(); + m.reserve(0); + assert_eq!(m.capacity(), 0); + } + + #[test] + fn test_create_capacity_zero() { + let mut m = HashMap::with_capacity(0); + + assert!(m.insert(1, 1).is_none()); + + assert!(m.contains_key(&1)); + assert!(!m.contains_key(&0)); + } + + #[test] + fn test_insert() { + let mut m = HashMap::new(); + assert_eq!(m.len(), 0); + assert!(m.insert(1, 2).is_none()); + assert_eq!(m.len(), 1); + assert!(m.insert(2, 4).is_none()); + assert_eq!(m.len(), 2); + assert_eq!(*m.get(&1).unwrap(), 2); + assert_eq!(*m.get(&2).unwrap(), 4); + } + + #[test] + fn test_clone() { + let mut m = HashMap::new(); + assert_eq!(m.len(), 0); + assert!(m.insert(1, 2).is_none()); + assert_eq!(m.len(), 1); + assert!(m.insert(2, 4).is_none()); + assert_eq!(m.len(), 2); + let m2 = m.clone(); + assert_eq!(*m2.get(&1).unwrap(), 2); + assert_eq!(*m2.get(&2).unwrap(), 4); + assert_eq!(m2.len(), 2); + } + + #[test] + fn test_clone_from() { + let mut m = HashMap::new(); + let mut m2 = HashMap::new(); + assert_eq!(m.len(), 0); + assert!(m.insert(1, 2).is_none()); + assert_eq!(m.len(), 1); + assert!(m.insert(2, 4).is_none()); + assert_eq!(m.len(), 2); + m2.clone_from(&m); + assert_eq!(*m2.get(&1).unwrap(), 2); + assert_eq!(*m2.get(&2).unwrap(), 4); + assert_eq!(m2.len(), 2); + } + + thread_local! { static DROP_VECTOR: RefCell> = RefCell::new(Vec::new()) } + + #[derive(Hash, PartialEq, Eq)] + struct Droppable { + k: usize, + } + + impl Droppable { + fn new(k: usize) -> Droppable { + DROP_VECTOR.with(|slot| { + slot.borrow_mut()[k] += 1; + }); + + Droppable { k } + } + } + + impl Drop for Droppable { + fn drop(&mut self) { + DROP_VECTOR.with(|slot| { + slot.borrow_mut()[self.k] -= 1; + }); + } + } + + impl Clone for Droppable { + fn clone(&self) -> Self { + Droppable::new(self.k) + } + } + + #[test] + fn test_drops() { + DROP_VECTOR.with(|slot| { + *slot.borrow_mut() = vec![0; 200]; + }); + + { + let mut m = HashMap::new(); + + DROP_VECTOR.with(|v| { + for i in 0..200 { + assert_eq!(v.borrow()[i], 0); + } + }); + + for i in 0..100 { + let d1 = Droppable::new(i); + let d2 = Droppable::new(i + 100); + m.insert(d1, d2); + } + + DROP_VECTOR.with(|v| { + for i in 0..200 { + assert_eq!(v.borrow()[i], 1); + } + }); + + for i in 0..50 { + let k = Droppable::new(i); + let v = m.remove(&k); + + assert!(v.is_some()); + + DROP_VECTOR.with(|v| { + assert_eq!(v.borrow()[i], 1); + assert_eq!(v.borrow()[i + 100], 1); + }); + } + + DROP_VECTOR.with(|v| { + for i in 0..50 { + assert_eq!(v.borrow()[i], 0); + assert_eq!(v.borrow()[i + 100], 0); + } + + for i in 50..100 { + assert_eq!(v.borrow()[i], 1); + assert_eq!(v.borrow()[i + 100], 1); + } + }); + } + + DROP_VECTOR.with(|v| { + for i in 0..200 { + assert_eq!(v.borrow()[i], 0); + } + }); + } + + #[test] + fn test_into_iter_drops() { + DROP_VECTOR.with(|v| { + *v.borrow_mut() = vec![0; 200]; + }); + + let hm = { + let mut hm = HashMap::new(); + + DROP_VECTOR.with(|v| { + for i in 0..200 { + assert_eq!(v.borrow()[i], 0); + } + }); + + for i in 0..100 { + let d1 = Droppable::new(i); + let d2 = Droppable::new(i + 100); + hm.insert(d1, d2); + } + + DROP_VECTOR.with(|v| { + for i in 0..200 { + assert_eq!(v.borrow()[i], 1); + } + }); + + hm + }; + + // By the way, ensure that cloning doesn't screw up the dropping. + drop(hm.clone()); + + { + let mut half = hm.into_iter().take(50); + + DROP_VECTOR.with(|v| { + for i in 0..200 { + assert_eq!(v.borrow()[i], 1); + } + }); + + for _ in half.by_ref() {} + + DROP_VECTOR.with(|v| { + let nk = (0..100).filter(|&i| v.borrow()[i] == 1).count(); + + let nv = (0..100).filter(|&i| v.borrow()[i + 100] == 1).count(); + + assert_eq!(nk, 50); + assert_eq!(nv, 50); + }); + }; + + DROP_VECTOR.with(|v| { + for i in 0..200 { + assert_eq!(v.borrow()[i], 0); + } + }); + } + + #[test] + fn test_empty_remove() { + let mut m: HashMap = HashMap::new(); + assert_eq!(m.remove(&0), None); + } + + #[test] + fn test_empty_entry() { + let mut m: HashMap = HashMap::new(); + match m.entry(0) { + Occupied(_) => panic!(), + Vacant(_) => {} + } + assert!(*m.entry(0).or_insert(true)); + assert_eq!(m.len(), 1); + } + + #[test] + fn test_empty_iter() { + let mut m: HashMap = HashMap::new(); + assert_eq!(m.drain().next(), None); + assert_eq!(m.keys().next(), None); + assert_eq!(m.values().next(), None); + assert_eq!(m.values_mut().next(), None); + assert_eq!(m.iter().next(), None); + assert_eq!(m.iter_mut().next(), None); + assert_eq!(m.len(), 0); + assert!(m.is_empty()); + assert_eq!(m.into_iter().next(), None); + } + + #[test] + #[cfg_attr(miri, ignore)] // FIXME: takes too long + fn test_lots_of_insertions() { + let mut m = HashMap::new(); + + // Try this a few times to make sure we never screw up the hashmap's + // internal state. + for _ in 0..10 { + assert!(m.is_empty()); + + for i in 1..1001 { + assert!(m.insert(i, i).is_none()); + + for j in 1..=i { + let r = m.get(&j); + assert_eq!(r, Some(&j)); + } + + for j in i + 1..1001 { + let r = m.get(&j); + assert_eq!(r, None); + } + } + + for i in 1001..2001 { + assert!(!m.contains_key(&i)); + } + + // remove forwards + for i in 1..1001 { + assert!(m.remove(&i).is_some()); + + for j in 1..=i { + assert!(!m.contains_key(&j)); + } + + for j in i + 1..1001 { + assert!(m.contains_key(&j)); + } + } + + for i in 1..1001 { + assert!(!m.contains_key(&i)); + } + + for i in 1..1001 { + assert!(m.insert(i, i).is_none()); + } + + // remove backwards + for i in (1..1001).rev() { + assert!(m.remove(&i).is_some()); + + for j in i..1001 { + assert!(!m.contains_key(&j)); + } + + for j in 1..i { + assert!(m.contains_key(&j)); + } + } + } + } + + #[test] + fn test_find_mut() { + let mut m = HashMap::new(); + assert!(m.insert(1, 12).is_none()); + assert!(m.insert(2, 8).is_none()); + assert!(m.insert(5, 14).is_none()); + let new = 100; + match m.get_mut(&5) { + None => panic!(), + Some(x) => *x = new, + } + assert_eq!(m.get(&5), Some(&new)); + } + + #[test] + fn test_insert_overwrite() { + let mut m = HashMap::new(); + assert!(m.insert(1, 2).is_none()); + assert_eq!(*m.get(&1).unwrap(), 2); + assert!(!m.insert(1, 3).is_none()); + assert_eq!(*m.get(&1).unwrap(), 3); + } + + #[test] + fn test_insert_conflicts() { + let mut m = HashMap::with_capacity(4); + assert!(m.insert(1, 2).is_none()); + assert!(m.insert(5, 3).is_none()); + assert!(m.insert(9, 4).is_none()); + assert_eq!(*m.get(&9).unwrap(), 4); + assert_eq!(*m.get(&5).unwrap(), 3); + assert_eq!(*m.get(&1).unwrap(), 2); + } + + #[test] + fn test_conflict_remove() { + let mut m = HashMap::with_capacity(4); + assert!(m.insert(1, 2).is_none()); + assert_eq!(*m.get(&1).unwrap(), 2); + assert!(m.insert(5, 3).is_none()); + assert_eq!(*m.get(&1).unwrap(), 2); + assert_eq!(*m.get(&5).unwrap(), 3); + assert!(m.insert(9, 4).is_none()); + assert_eq!(*m.get(&1).unwrap(), 2); + assert_eq!(*m.get(&5).unwrap(), 3); + assert_eq!(*m.get(&9).unwrap(), 4); + assert!(m.remove(&1).is_some()); + assert_eq!(*m.get(&9).unwrap(), 4); + assert_eq!(*m.get(&5).unwrap(), 3); + } + + #[test] + fn test_is_empty() { + let mut m = HashMap::with_capacity(4); + assert!(m.insert(1, 2).is_none()); + assert!(!m.is_empty()); + assert!(m.remove(&1).is_some()); + assert!(m.is_empty()); + } + + #[test] + fn test_remove() { + let mut m = HashMap::new(); + m.insert(1, 2); + assert_eq!(m.remove(&1), Some(2)); + assert_eq!(m.remove(&1), None); + } + + #[test] + fn test_remove_entry() { + let mut m = HashMap::new(); + m.insert(1, 2); + assert_eq!(m.remove_entry(&1), Some((1, 2))); + assert_eq!(m.remove(&1), None); + } + + #[test] + fn test_iterate() { + let mut m = HashMap::with_capacity(4); + for i in 0..32 { + assert!(m.insert(i, i * 2).is_none()); + } + assert_eq!(m.len(), 32); + + let mut observed: u32 = 0; + + for (k, v) in &m { + assert_eq!(*v, *k * 2); + observed |= 1 << *k; + } + assert_eq!(observed, 0xFFFF_FFFF); + } + + #[test] + fn test_keys() { + let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')]; + let map: HashMap<_, _> = vec.into_iter().collect(); + let keys: Vec<_> = map.keys().cloned().collect(); + assert_eq!(keys.len(), 3); + assert!(keys.contains(&1)); + assert!(keys.contains(&2)); + assert!(keys.contains(&3)); + } + + #[test] + fn test_values() { + let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')]; + let map: HashMap<_, _> = vec.into_iter().collect(); + let values: Vec<_> = map.values().cloned().collect(); + assert_eq!(values.len(), 3); + assert!(values.contains(&'a')); + assert!(values.contains(&'b')); + assert!(values.contains(&'c')); + } + + #[test] + fn test_values_mut() { + let vec = vec![(1, 1), (2, 2), (3, 3)]; + let mut map: HashMap<_, _> = vec.into_iter().collect(); + for value in map.values_mut() { + *value = (*value) * 2 + } + let values: Vec<_> = map.values().cloned().collect(); + assert_eq!(values.len(), 3); + assert!(values.contains(&2)); + assert!(values.contains(&4)); + assert!(values.contains(&6)); + } + + #[test] + fn test_find() { + let mut m = HashMap::new(); + assert!(m.get(&1).is_none()); + m.insert(1, 2); + match m.get(&1) { + None => panic!(), + Some(v) => assert_eq!(*v, 2), + } + } + + #[test] + fn test_eq() { + let mut m1 = HashMap::new(); + m1.insert(1, 2); + m1.insert(2, 3); + m1.insert(3, 4); + + let mut m2 = HashMap::new(); + m2.insert(1, 2); + m2.insert(2, 3); + + assert!(m1 != m2); + + m2.insert(3, 4); + + assert_eq!(m1, m2); + } + + #[test] + fn test_show() { + let mut map = HashMap::new(); + let empty: HashMap = HashMap::new(); + + map.insert(1, 2); + map.insert(3, 4); + + let map_str = format!("{:?}", map); + + assert!(map_str == "{1: 2, 3: 4}" || map_str == "{3: 4, 1: 2}"); + assert_eq!(format!("{:?}", empty), "{}"); + } + + #[test] + fn test_expand() { + let mut m = HashMap::new(); + + assert_eq!(m.len(), 0); + assert!(m.is_empty()); + + let mut i = 0; + let old_raw_cap = m.raw_capacity(); + while old_raw_cap == m.raw_capacity() { + m.insert(i, i); + i += 1; + } + + assert_eq!(m.len(), i); + assert!(!m.is_empty()); + } + + #[test] + fn test_behavior_resize_policy() { + let mut m = HashMap::new(); + + assert_eq!(m.len(), 0); + assert_eq!(m.raw_capacity(), 1); + assert!(m.is_empty()); + + m.insert(0, 0); + m.remove(&0); + assert!(m.is_empty()); + let initial_raw_cap = m.raw_capacity(); + m.reserve(initial_raw_cap); + let raw_cap = m.raw_capacity(); + + assert_eq!(raw_cap, initial_raw_cap * 2); + + let mut i = 0; + for _ in 0..raw_cap * 3 / 4 { + m.insert(i, i); + i += 1; + } + // three quarters full + + assert_eq!(m.len(), i); + assert_eq!(m.raw_capacity(), raw_cap); + + for _ in 0..raw_cap / 4 { + m.insert(i, i); + i += 1; + } + // half full + + let new_raw_cap = m.raw_capacity(); + assert_eq!(new_raw_cap, raw_cap * 2); + + for _ in 0..raw_cap / 2 - 1 { + i -= 1; + m.remove(&i); + assert_eq!(m.raw_capacity(), new_raw_cap); + } + // A little more than one quarter full. + m.shrink_to_fit(); + assert_eq!(m.raw_capacity(), raw_cap); + // again, a little more than half full + for _ in 0..raw_cap / 2 { + i -= 1; + m.remove(&i); + } + m.shrink_to_fit(); + + assert_eq!(m.len(), i); + assert!(!m.is_empty()); + assert_eq!(m.raw_capacity(), initial_raw_cap); + } + + #[test] + fn test_reserve_shrink_to_fit() { + let mut m = HashMap::new(); + m.insert(0, 0); + m.remove(&0); + assert!(m.capacity() >= m.len()); + for i in 0..128 { + m.insert(i, i); + } + m.reserve(256); + + let usable_cap = m.capacity(); + for i in 128..(128 + 256) { + m.insert(i, i); + assert_eq!(m.capacity(), usable_cap); + } + + for i in 100..(128 + 256) { + assert_eq!(m.remove(&i), Some(i)); + } + m.shrink_to_fit(); + + assert_eq!(m.len(), 100); + assert!(!m.is_empty()); + assert!(m.capacity() >= m.len()); + + for i in 0..100 { + assert_eq!(m.remove(&i), Some(i)); + } + m.shrink_to_fit(); + m.insert(0, 0); + + assert_eq!(m.len(), 1); + assert!(m.capacity() >= m.len()); + assert_eq!(m.remove(&0), Some(0)); + } + + #[test] + fn test_from_iter() { + let xs = [(1, 1), (2, 2), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]; + + let map: HashMap<_, _> = xs.iter().cloned().collect(); + + for &(k, v) in &xs { + assert_eq!(map.get(&k), Some(&v)); + } + + assert_eq!(map.iter().len(), xs.len() - 1); + } + + #[test] + fn test_size_hint() { + let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]; + + let map: HashMap<_, _> = xs.iter().cloned().collect(); + + let mut iter = map.iter(); + + for _ in iter.by_ref().take(3) {} + + assert_eq!(iter.size_hint(), (3, Some(3))); + } + + #[test] + fn test_iter_len() { + let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]; + + let map: HashMap<_, _> = xs.iter().cloned().collect(); + + let mut iter = map.iter(); + + for _ in iter.by_ref().take(3) {} + + assert_eq!(iter.len(), 3); + } + + #[test] + fn test_mut_size_hint() { + let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]; + + let mut map: HashMap<_, _> = xs.iter().cloned().collect(); + + let mut iter = map.iter_mut(); + + for _ in iter.by_ref().take(3) {} + + assert_eq!(iter.size_hint(), (3, Some(3))); + } + + #[test] + fn test_iter_mut_len() { + let xs = [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5), (6, 6)]; + + let mut map: HashMap<_, _> = xs.iter().cloned().collect(); + + let mut iter = map.iter_mut(); + + for _ in iter.by_ref().take(3) {} + + assert_eq!(iter.len(), 3); + } + + #[test] + fn test_index() { + let mut map = HashMap::new(); + + map.insert(1, 2); + map.insert(2, 1); + map.insert(3, 4); + + assert_eq!(map[&2], 1); + } + + #[test] + #[should_panic] + fn test_index_nonexistent() { + let mut map = HashMap::new(); + + map.insert(1, 2); + map.insert(2, 1); + map.insert(3, 4); + + map[&4]; + } + + #[test] + fn test_entry() { + let xs = [(1, 10), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)]; + + let mut map: HashMap<_, _> = xs.iter().cloned().collect(); + + // Existing key (insert) + match map.entry(1) { + Vacant(_) => unreachable!(), + Occupied(mut view) => { + assert_eq!(view.get(), &10); + assert_eq!(view.insert(100), 10); + } + } + assert_eq!(map.get(&1).unwrap(), &100); + assert_eq!(map.len(), 6); + + // Existing key (update) + match map.entry(2) { + Vacant(_) => unreachable!(), + Occupied(mut view) => { + let v = view.get_mut(); + let new_v = (*v) * 10; + *v = new_v; + } + } + assert_eq!(map.get(&2).unwrap(), &200); + assert_eq!(map.len(), 6); + + // Existing key (take) + match map.entry(3) { + Vacant(_) => unreachable!(), + Occupied(view) => { + assert_eq!(view.remove(), 30); + } + } + assert_eq!(map.get(&3), None); + assert_eq!(map.len(), 5); + + // Inexistent key (insert) + match map.entry(10) { + Occupied(_) => unreachable!(), + Vacant(view) => { + assert_eq!(*view.insert(1000), 1000); + } + } + assert_eq!(map.get(&10).unwrap(), &1000); + assert_eq!(map.len(), 6); + } + + #[test] + fn test_entry_take_doesnt_corrupt() { + #![allow(deprecated)] //rand + // Test for #19292 + fn check(m: &HashMap) { + for k in m.keys() { + assert!(m.contains_key(k), "{} is in keys() but not in the map?", k); + } + } + + let mut m = HashMap::new(); + + let mut rng = { + let seed = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; + SmallRng::from_seed(seed) + }; + + // Populate the map with some items. + for _ in 0..50 { + let x = rng.gen_range(-10, 10); + m.insert(x, ()); + } + + for _ in 0..1000 { + let x = rng.gen_range(-10, 10); + match m.entry(x) { + Vacant(_) => {} + Occupied(e) => { + e.remove(); + } + } + + check(&m); + } + } + + #[test] + fn test_extend_ref() { + let mut a = HashMap::new(); + a.insert(1, "one"); + let mut b = HashMap::new(); + b.insert(2, "two"); + b.insert(3, "three"); + + a.extend(&b); + + assert_eq!(a.len(), 3); + assert_eq!(a[&1], "one"); + assert_eq!(a[&2], "two"); + assert_eq!(a[&3], "three"); + } + + #[test] + fn test_capacity_not_less_than_len() { + let mut a = HashMap::new(); + let mut item = 0; + + for _ in 0..116 { + a.insert(item, 0); + item += 1; + } + + assert!(a.capacity() > a.len()); + + let free = a.capacity() - a.len(); + for _ in 0..free { + a.insert(item, 0); + item += 1; + } + + assert_eq!(a.len(), a.capacity()); + + // Insert at capacity should cause allocation. + a.insert(item, 0); + assert!(a.capacity() > a.len()); + } + + #[test] + fn test_occupied_entry_key() { + let mut a = HashMap::new(); + let key = "hello there"; + let value = "value goes here"; + assert!(a.is_empty()); + a.insert(key.clone(), value.clone()); + assert_eq!(a.len(), 1); + assert_eq!(a[key], value); + + match a.entry(key.clone()) { + Vacant(_) => panic!(), + Occupied(e) => assert_eq!(key, *e.key()), + } + assert_eq!(a.len(), 1); + assert_eq!(a[key], value); + } + + #[test] + fn test_vacant_entry_key() { + let mut a = HashMap::new(); + let key = "hello there"; + let value = "value goes here"; + + assert!(a.is_empty()); + match a.entry(key.clone()) { + Occupied(_) => panic!(), + Vacant(e) => { + assert_eq!(key, *e.key()); + e.insert(value.clone()); + } + } + assert_eq!(a.len(), 1); + assert_eq!(a[key], value); + } + + #[test] + fn test_occupied_entry_replace_entry_with() { + let mut a = HashMap::new(); + + let key = "a key"; + let value = "an initial value"; + let new_value = "a new value"; + + let entry = a.entry(key).insert(value).replace_entry_with(|k, v| { + assert_eq!(k, &key); + assert_eq!(v, value); + Some(new_value) + }); + + match entry { + Occupied(e) => { + assert_eq!(e.key(), &key); + assert_eq!(e.get(), &new_value); + } + Vacant(_) => panic!(), + } + + assert_eq!(a[key], new_value); + assert_eq!(a.len(), 1); + + let entry = match a.entry(key) { + Occupied(e) => e.replace_entry_with(|k, v| { + assert_eq!(k, &key); + assert_eq!(v, new_value); + None + }), + Vacant(_) => panic!(), + }; + + match entry { + Vacant(e) => assert_eq!(e.key(), &key), + Occupied(_) => panic!(), + } + + assert!(!a.contains_key(key)); + assert_eq!(a.len(), 0); + } + + #[test] + fn test_entry_and_replace_entry_with() { + let mut a = HashMap::new(); + + let key = "a key"; + let value = "an initial value"; + let new_value = "a new value"; + + let entry = a.entry(key).and_replace_entry_with(|_, _| panic!()); + + match entry { + Vacant(e) => assert_eq!(e.key(), &key), + Occupied(_) => panic!(), + } + + a.insert(key, value); + + let entry = a.entry(key).and_replace_entry_with(|k, v| { + assert_eq!(k, &key); + assert_eq!(v, value); + Some(new_value) + }); + + match entry { + Occupied(e) => { + assert_eq!(e.key(), &key); + assert_eq!(e.get(), &new_value); + } + Vacant(_) => panic!(), + } + + assert_eq!(a[key], new_value); + assert_eq!(a.len(), 1); + + let entry = a.entry(key).and_replace_entry_with(|k, v| { + assert_eq!(k, &key); + assert_eq!(v, new_value); + None + }); + + match entry { + Vacant(e) => assert_eq!(e.key(), &key), + Occupied(_) => panic!(), + } + + assert!(!a.contains_key(key)); + assert_eq!(a.len(), 0); + } + + #[test] + fn test_raw_occupied_entry_replace_entry_with() { + let mut a = HashMap::new(); + + let key = "a key"; + let value = "an initial value"; + let new_value = "a new value"; + + let entry = a + .raw_entry_mut() + .from_key(&key) + .insert(key, value) + .replace_entry_with(|k, v| { + assert_eq!(k, &key); + assert_eq!(v, value); + Some(new_value) + }); + + match entry { + RawEntryMut::Occupied(e) => { + assert_eq!(e.key(), &key); + assert_eq!(e.get(), &new_value); + } + RawEntryMut::Vacant(_) => panic!(), + } + + assert_eq!(a[key], new_value); + assert_eq!(a.len(), 1); + + let entry = match a.raw_entry_mut().from_key(&key) { + RawEntryMut::Occupied(e) => e.replace_entry_with(|k, v| { + assert_eq!(k, &key); + assert_eq!(v, new_value); + None + }), + RawEntryMut::Vacant(_) => panic!(), + }; + + match entry { + RawEntryMut::Vacant(_) => {} + RawEntryMut::Occupied(_) => panic!(), + } + + assert!(!a.contains_key(key)); + assert_eq!(a.len(), 0); + } + + #[test] + fn test_raw_entry_and_replace_entry_with() { + let mut a = HashMap::new(); + + let key = "a key"; + let value = "an initial value"; + let new_value = "a new value"; + + let entry = a + .raw_entry_mut() + .from_key(&key) + .and_replace_entry_with(|_, _| panic!()); + + match entry { + RawEntryMut::Vacant(_) => {} + RawEntryMut::Occupied(_) => panic!(), + } + + a.insert(key, value); + + let entry = a + .raw_entry_mut() + .from_key(&key) + .and_replace_entry_with(|k, v| { + assert_eq!(k, &key); + assert_eq!(v, value); + Some(new_value) + }); + + match entry { + RawEntryMut::Occupied(e) => { + assert_eq!(e.key(), &key); + assert_eq!(e.get(), &new_value); + } + RawEntryMut::Vacant(_) => panic!(), + } + + assert_eq!(a[key], new_value); + assert_eq!(a.len(), 1); + + let entry = a + .raw_entry_mut() + .from_key(&key) + .and_replace_entry_with(|k, v| { + assert_eq!(k, &key); + assert_eq!(v, new_value); + None + }); + + match entry { + RawEntryMut::Vacant(_) => {} + RawEntryMut::Occupied(_) => panic!(), + } + + assert!(!a.contains_key(key)); + assert_eq!(a.len(), 0); + } + + #[test] + fn test_replace_entry_with_doesnt_corrupt() { + #![allow(deprecated)] //rand + // Test for #19292 + fn check(m: &HashMap) { + for k in m.keys() { + assert!(m.contains_key(k), "{} is in keys() but not in the map?", k); + } + } + + let mut m = HashMap::new(); + + let mut rng = { + let seed = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]; + SmallRng::from_seed(seed) + }; + + // Populate the map with some items. + for _ in 0..50 { + let x = rng.gen_range(-10, 10); + m.insert(x, ()); + } + + for _ in 0..1000 { + let x = rng.gen_range(-10, 10); + m.entry(x).and_replace_entry_with(|_, _| None); + check(&m); + } + } + + #[test] + fn test_retain() { + let mut map: HashMap = (0..100).map(|x| (x, x * 10)).collect(); + + map.retain(|&k, _| k % 2 == 0); + assert_eq!(map.len(), 50); + assert_eq!(map[&2], 20); + assert_eq!(map[&4], 40); + assert_eq!(map[&6], 60); + } + + #[test] + fn test_drain_filter() { + { + let mut map: HashMap = (0..8).map(|x| (x, x * 10)).collect(); + let drained = map.drain_filter(|&k, _| k % 2 == 0); + let mut out = drained.collect::>(); + out.sort_unstable(); + assert_eq!(vec![(0, 0), (2, 20), (4, 40), (6, 60)], out); + assert_eq!(map.len(), 4); + } + { + let mut map: HashMap = (0..8).map(|x| (x, x * 10)).collect(); + drop(map.drain_filter(|&k, _| k % 2 == 0)); + assert_eq!(map.len(), 4); + } + } + + #[test] + #[cfg_attr(miri, ignore)] // FIXME: no OOM signalling (https://github.com/rust-lang/miri/issues/613) + fn test_try_reserve() { + let mut empty_bytes: HashMap = HashMap::new(); + + const MAX_USIZE: usize = usize::MAX; + + if let Err(CapacityOverflow) = empty_bytes.try_reserve(MAX_USIZE) { + } else { + panic!("usize::MAX should trigger an overflow!"); + } + + if let Err(AllocError { .. }) = empty_bytes.try_reserve(MAX_USIZE / 8) { + } else { + // This may succeed if there is enough free memory. Attempt to + // allocate a second hashmap to ensure the allocation will fail. + let mut empty_bytes2: HashMap = HashMap::new(); + if let Err(AllocError { .. }) = empty_bytes2.try_reserve(MAX_USIZE / 8) { + } else { + panic!("usize::MAX / 8 should trigger an OOM!"); + } + } + } + + #[test] + fn test_raw_entry() { + use super::RawEntryMut::{Occupied, Vacant}; + + let xs = [(1i32, 10i32), (2, 20), (3, 30), (4, 40), (5, 50), (6, 60)]; + + let mut map: HashMap<_, _> = xs.iter().cloned().collect(); + + let compute_hash = |map: &HashMap, k: i32| -> u64 { + use core::hash::{BuildHasher, Hash, Hasher}; + + let mut hasher = map.hasher().build_hasher(); + k.hash(&mut hasher); + hasher.finish() + }; + + // Existing key (insert) + match map.raw_entry_mut().from_key(&1) { + Vacant(_) => unreachable!(), + Occupied(mut view) => { + assert_eq!(view.get(), &10); + assert_eq!(view.insert(100), 10); + } + } + 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.len(), 6); + + // Existing key (update) + match map.raw_entry_mut().from_key(&2) { + Vacant(_) => unreachable!(), + Occupied(mut view) => { + let v = view.get_mut(); + let new_v = (*v) * 10; + *v = new_v; + } + } + 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.len(), 6); + + // Existing key (take) + let hash3 = compute_hash(&map, 3); + match map.raw_entry_mut().from_key_hashed_nocheck(hash3, &3) { + Vacant(_) => unreachable!(), + Occupied(view) => { + assert_eq!(view.remove_entry(), (3, 30)); + } + } + assert_eq!(map.raw_entry().from_key(&3), None); + assert_eq!(map.raw_entry().from_hash(hash3, |k| *k == 3), None); + assert_eq!(map.raw_entry().from_key_hashed_nocheck(hash3, &3), None); + assert_eq!(map.len(), 5); + + // Nonexistent key (insert) + match map.raw_entry_mut().from_key(&10) { + Occupied(_) => unreachable!(), + Vacant(view) => { + assert_eq!(view.insert(10, 1000), (&mut 10, &mut 1000)); + } + } + assert_eq!(map.raw_entry().from_key(&10).unwrap(), (&10, &1000)); + assert_eq!(map.len(), 6); + + // Ensure all lookup methods produce equivalent results. + for k in 0..12 { + let hash = compute_hash(&map, k); + let v = map.get(&k).cloned(); + let kv = v.as_ref().map(|v| (&k, v)); + + assert_eq!(map.raw_entry().from_key(&k), kv); + assert_eq!(map.raw_entry().from_hash(hash, |q| *q == k), kv); + assert_eq!(map.raw_entry().from_key_hashed_nocheck(hash, &k), kv); + + match map.raw_entry_mut().from_key(&k) { + Occupied(mut o) => assert_eq!(Some(o.get_key_value()), kv), + Vacant(_) => assert_eq!(v, None), + } + match map.raw_entry_mut().from_key_hashed_nocheck(hash, &k) { + Occupied(mut o) => assert_eq!(Some(o.get_key_value()), kv), + Vacant(_) => assert_eq!(v, None), + } + match map.raw_entry_mut().from_hash(hash, |q| *q == k) { + Occupied(mut o) => assert_eq!(Some(o.get_key_value()), kv), + Vacant(_) => assert_eq!(v, None), + } + } + } + + #[test] + fn test_key_without_hash_impl() { + #[derive(Debug)] + struct IntWrapper(u64); + + let mut m: HashMap = HashMap::default(); + { + assert!(m.raw_entry().from_hash(0, |k| k.0 == 0).is_none()); + } + { + let vacant_entry = match m.raw_entry_mut().from_hash(0, |k| k.0 == 0) { + RawEntryMut::Occupied(..) => panic!("Found entry for key 0"), + RawEntryMut::Vacant(e) => e, + }; + vacant_entry.insert_with_hasher(0, IntWrapper(0), (), |k| k.0); + } + { + assert!(m.raw_entry().from_hash(0, |k| k.0 == 0).is_some()); + assert!(m.raw_entry().from_hash(1, |k| k.0 == 1).is_none()); + assert!(m.raw_entry().from_hash(2, |k| k.0 == 2).is_none()); + } + { + let vacant_entry = match m.raw_entry_mut().from_hash(1, |k| k.0 == 1) { + RawEntryMut::Occupied(..) => panic!("Found entry for key 1"), + RawEntryMut::Vacant(e) => e, + }; + vacant_entry.insert_with_hasher(1, IntWrapper(1), (), |k| k.0); + } + { + assert!(m.raw_entry().from_hash(0, |k| k.0 == 0).is_some()); + assert!(m.raw_entry().from_hash(1, |k| k.0 == 1).is_some()); + assert!(m.raw_entry().from_hash(2, |k| k.0 == 2).is_none()); + } + { + let occupied_entry = match m.raw_entry_mut().from_hash(0, |k| k.0 == 0) { + RawEntryMut::Occupied(e) => e, + RawEntryMut::Vacant(..) => panic!("Couldn't find entry for key 0"), + }; + occupied_entry.remove(); + } + assert!(m.raw_entry().from_hash(0, |k| k.0 == 0).is_none()); + assert!(m.raw_entry().from_hash(1, |k| k.0 == 1).is_some()); + assert!(m.raw_entry().from_hash(2, |k| k.0 == 2).is_none()); + } + + #[test] + #[cfg(feature = "raw")] + fn test_into_iter_refresh() { + use core::hash::{BuildHasher, Hash, Hasher}; + + #[cfg(miri)] + const N: usize = 32; + #[cfg(not(miri))] + const N: usize = 128; + + let mut rng = rand::thread_rng(); + for n in 0..N { + let mut m = HashMap::new(); + for i in 0..n { + assert!(m.insert(i, 2 * i).is_none()); + } + let hasher = m.hasher().clone(); + + let mut it = unsafe { m.table.iter() }; + assert_eq!(it.len(), n); + + let mut i = 0; + let mut left = n; + let mut removed = Vec::new(); + loop { + // occasionally remove some elements + if i < n && rng.gen_bool(0.1) { + let mut hsh = hasher.build_hasher(); + i.hash(&mut hsh); + let hash = hsh.finish(); + + unsafe { + let e = m.table.find(hash, |q| q.0.eq(&i)); + if let Some(e) = e { + it.reflect_remove(&e); + let t = m.table.remove(e); + removed.push(t); + left -= 1; + } else { + assert!(removed.contains(&(i, 2 * i)), "{} not in {:?}", i, removed); + let e = m + .table + .insert(hash, (i, 2 * i), |x| super::make_hash(&hasher, &x.0)); + it.reflect_insert(&e); + if let Some(p) = removed.iter().position(|e| e == &(i, 2 * i)) { + removed.swap_remove(p); + } + left += 1; + } + } + } + + let e = it.next(); + if e.is_none() { + break; + } + assert!(i < n); + let t = unsafe { e.unwrap().as_ref() }; + assert!(!removed.contains(t)); + let (k, v) = t; + assert_eq!(*v, 2 * k); + i += 1; + } + assert!(i <= n); + + // just for safety: + assert_eq!(m.table.len(), left); + } + } + + #[test] + fn test_const_with_hasher() { + use core::hash::BuildHasher; + use std::borrow::ToOwned; + use std::collections::hash_map::DefaultHasher; + + #[derive(Clone)] + struct MyHasher; + impl BuildHasher for MyHasher { + type Hasher = DefaultHasher; + + fn build_hasher(&self) -> DefaultHasher { + DefaultHasher::new() + } + } + + const EMPTY_MAP: HashMap = + HashMap::with_hasher(MyHasher); + + let mut map = EMPTY_MAP.clone(); + map.insert(17, "seventeen".to_owned()); + assert_eq!("seventeen", map[&17]); + } +} diff --git a/vendor/hashbrown-0.9.1/src/raw/bitmask.rs b/vendor/hashbrown-0.9.1/src/raw/bitmask.rs new file mode 100644 index 0000000000..99b2d5341b --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/raw/bitmask.rs @@ -0,0 +1,122 @@ +use super::imp::{BitMaskWord, BITMASK_MASK, BITMASK_STRIDE}; +#[cfg(feature = "nightly")] +use core::intrinsics; + +/// A bit mask which contains the result of a `Match` operation on a `Group` and +/// allows iterating through them. +/// +/// The bit mask is arranged so that low-order bits represent lower memory +/// addresses for group match results. +/// +/// For implementation reasons, the bits in the set may be sparsely packed, so +/// that there is only one bit-per-byte used (the high bit, 7). If this is the +/// case, `BITMASK_STRIDE` will be 8 to indicate a divide-by-8 should be +/// performed on counts/indices to normalize this difference. `BITMASK_MASK` is +/// similarly a mask of all the actually-used bits. +#[derive(Copy, Clone)] +pub struct BitMask(pub BitMaskWord); + +#[allow(clippy::use_self)] +impl BitMask { + /// Returns a new `BitMask` with all bits inverted. + #[inline] + #[must_use] + pub fn invert(self) -> Self { + BitMask(self.0 ^ BITMASK_MASK) + } + + /// Flip the bit in the mask for the entry at the given index. + /// + /// Returns the bit's previous state. + #[inline] + #[allow(clippy::cast_ptr_alignment)] + #[cfg(feature = "raw")] + pub unsafe fn flip(&mut self, index: usize) -> bool { + // NOTE: The + BITMASK_STRIDE - 1 is to set the high bit. + let mask = 1 << (index * BITMASK_STRIDE + BITMASK_STRIDE - 1); + self.0 ^= mask; + // The bit was set if the bit is now 0. + self.0 & mask == 0 + } + + /// Returns a new `BitMask` with the lowest bit removed. + #[inline] + #[must_use] + pub fn remove_lowest_bit(self) -> Self { + BitMask(self.0 & (self.0 - 1)) + } + /// Returns whether the `BitMask` has at least one set bit. + #[inline] + pub fn any_bit_set(self) -> bool { + self.0 != 0 + } + + /// Returns the first set bit in the `BitMask`, if there is one. + #[inline] + pub fn lowest_set_bit(self) -> Option { + if self.0 == 0 { + None + } else { + Some(unsafe { self.lowest_set_bit_nonzero() }) + } + } + + /// Returns the first set bit in the `BitMask`, if there is one. The + /// bitmask must not be empty. + #[inline] + #[cfg(feature = "nightly")] + pub unsafe fn lowest_set_bit_nonzero(self) -> usize { + intrinsics::cttz_nonzero(self.0) as usize / BITMASK_STRIDE + } + #[inline] + #[cfg(not(feature = "nightly"))] + pub unsafe fn lowest_set_bit_nonzero(self) -> usize { + self.trailing_zeros() + } + + /// Returns the number of trailing zeroes in the `BitMask`. + #[inline] + pub fn trailing_zeros(self) -> usize { + // ARM doesn't have a trailing_zeroes instruction, and instead uses + // reverse_bits (RBIT) + leading_zeroes (CLZ). However older ARM + // versions (pre-ARMv7) don't have RBIT and need to emulate it + // instead. Since we only have 1 bit set in each byte on ARM, we can + // use swap_bytes (REV) + leading_zeroes instead. + if cfg!(target_arch = "arm") && BITMASK_STRIDE % 8 == 0 { + self.0.swap_bytes().leading_zeros() as usize / BITMASK_STRIDE + } else { + self.0.trailing_zeros() as usize / BITMASK_STRIDE + } + } + + /// Returns the number of leading zeroes in the `BitMask`. + #[inline] + pub fn leading_zeros(self) -> usize { + self.0.leading_zeros() as usize / BITMASK_STRIDE + } +} + +impl IntoIterator for BitMask { + type Item = usize; + type IntoIter = BitMaskIter; + + #[inline] + fn into_iter(self) -> BitMaskIter { + BitMaskIter(self) + } +} + +/// Iterator over the contents of a `BitMask`, returning the indicies of set +/// bits. +pub struct BitMaskIter(BitMask); + +impl Iterator for BitMaskIter { + type Item = usize; + + #[inline] + fn next(&mut self) -> Option { + let bit = self.0.lowest_set_bit()?; + self.0 = self.0.remove_lowest_bit(); + Some(bit) + } +} diff --git a/vendor/hashbrown-0.9.1/src/raw/generic.rs b/vendor/hashbrown-0.9.1/src/raw/generic.rs new file mode 100644 index 0000000000..26f8c58969 --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/raw/generic.rs @@ -0,0 +1,151 @@ +use super::bitmask::BitMask; +use super::EMPTY; +use core::{mem, ptr}; + +// Use the native word size as the group size. Using a 64-bit group size on +// a 32-bit architecture will just end up being more expensive because +// shifts and multiplies will need to be emulated. +#[cfg(any( + target_pointer_width = "64", + target_arch = "aarch64", + target_arch = "x86_64", +))] +type GroupWord = u64; +#[cfg(all( + target_pointer_width = "32", + not(target_arch = "aarch64"), + not(target_arch = "x86_64"), +))] +type GroupWord = u32; + +pub type BitMaskWord = GroupWord; +pub const BITMASK_STRIDE: usize = 8; +// We only care about the highest bit of each byte for the mask. +#[allow(clippy::cast_possible_truncation, clippy::unnecessary_cast)] +pub const BITMASK_MASK: BitMaskWord = 0x8080_8080_8080_8080_u64 as GroupWord; + +/// Helper function to replicate a byte across a `GroupWord`. +#[inline] +fn repeat(byte: u8) -> GroupWord { + GroupWord::from_ne_bytes([byte; Group::WIDTH]) +} + +/// Abstraction over a group of control bytes which can be scanned in +/// parallel. +/// +/// This implementation uses a word-sized integer. +#[derive(Copy, Clone)] +pub struct Group(GroupWord); + +// We perform all operations in the native endianess, and convert to +// little-endian just before creating a BitMask. The can potentially +// enable the compiler to eliminate unnecessary byte swaps if we are +// only checking whether a BitMask is empty. +#[allow(clippy::use_self)] +impl Group { + /// Number of bytes in the group. + pub const WIDTH: usize = mem::size_of::(); + + /// Returns a full group of empty bytes, suitable for use as the initial + /// value for an empty hash table. + /// + /// This is guaranteed to be aligned to the group size. + pub const fn static_empty() -> &'static [u8; Group::WIDTH] { + #[repr(C)] + struct AlignedBytes { + _align: [Group; 0], + bytes: [u8; Group::WIDTH], + }; + const ALIGNED_BYTES: AlignedBytes = AlignedBytes { + _align: [], + bytes: [EMPTY; Group::WIDTH], + }; + &ALIGNED_BYTES.bytes + } + + /// Loads a group of bytes starting at the given address. + #[inline] + #[allow(clippy::cast_ptr_alignment)] // unaligned load + pub unsafe fn load(ptr: *const u8) -> Self { + Group(ptr::read_unaligned(ptr as *const _)) + } + + /// Loads a group of bytes starting at the given address, which must be + /// aligned to `mem::align_of::()`. + #[inline] + #[allow(clippy::cast_ptr_alignment)] + pub unsafe fn load_aligned(ptr: *const u8) -> Self { + // FIXME: use align_offset once it stabilizes + debug_assert_eq!(ptr as usize & (mem::align_of::() - 1), 0); + Group(ptr::read(ptr as *const _)) + } + + /// Stores the group of bytes to the given address, which must be + /// aligned to `mem::align_of::()`. + #[inline] + #[allow(clippy::cast_ptr_alignment)] + pub unsafe fn store_aligned(self, ptr: *mut u8) { + // FIXME: use align_offset once it stabilizes + debug_assert_eq!(ptr as usize & (mem::align_of::() - 1), 0); + ptr::write(ptr as *mut _, self.0); + } + + /// Returns a `BitMask` indicating all bytes in the group which *may* + /// have the given value. + /// + /// This function may return a false positive in certain cases where + /// the byte in the group differs from the searched value only in its + /// lowest bit. This is fine because: + /// - This never happens for `EMPTY` and `DELETED`, only full entries. + /// - The check for key equality will catch these. + /// - This only happens if there is at least 1 true match. + /// - The chance of this happening is very low (< 1% chance per byte). + #[inline] + pub fn match_byte(self, byte: u8) -> BitMask { + // This algorithm is derived from + // http://graphics.stanford.edu/~seander/bithacks.html##ValueInWord + let cmp = self.0 ^ repeat(byte); + BitMask((cmp.wrapping_sub(repeat(0x01)) & !cmp & repeat(0x80)).to_le()) + } + + /// Returns a `BitMask` indicating all bytes in the group which are + /// `EMPTY`. + #[inline] + pub fn match_empty(self) -> BitMask { + // If the high bit is set, then the byte must be either: + // 1111_1111 (EMPTY) or 1000_0000 (DELETED). + // So we can just check if the top two bits are 1 by ANDing them. + BitMask((self.0 & (self.0 << 1) & repeat(0x80)).to_le()) + } + + /// Returns a `BitMask` indicating all bytes in the group which are + /// `EMPTY` or `DELETED`. + #[inline] + pub fn match_empty_or_deleted(self) -> BitMask { + // A byte is EMPTY or DELETED iff the high bit is set + BitMask((self.0 & repeat(0x80)).to_le()) + } + + /// Returns a `BitMask` indicating all bytes in the group which are full. + #[inline] + pub fn match_full(self) -> BitMask { + self.match_empty_or_deleted().invert() + } + + /// Performs the following transformation on all bytes in the group: + /// - `EMPTY => EMPTY` + /// - `DELETED => EMPTY` + /// - `FULL => DELETED` + #[inline] + pub fn convert_special_to_empty_and_full_to_deleted(self) -> Self { + // Map high_bit = 1 (EMPTY or DELETED) to 1111_1111 + // and high_bit = 0 (FULL) to 1000_0000 + // + // Here's this logic expanded to concrete values: + // let full = 1000_0000 (true) or 0000_0000 (false) + // !1000_0000 + 1 = 0111_1111 + 1 = 1000_0000 (no carry) + // !0000_0000 + 0 = 1111_1111 + 0 = 1111_1111 (no carry) + let full = !self.0 & repeat(0x80); + Group(!full + (full >> 7)) + } +} diff --git a/vendor/hashbrown-0.9.1/src/raw/mod.rs b/vendor/hashbrown-0.9.1/src/raw/mod.rs new file mode 100644 index 0000000000..32fec98476 --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/raw/mod.rs @@ -0,0 +1,1924 @@ +use crate::alloc::alloc::{alloc, dealloc, handle_alloc_error}; +use crate::scopeguard::guard; +use crate::TryReserveError; +use core::alloc::Layout; +use core::hint; +use core::iter::FusedIterator; +use core::marker::PhantomData; +use core::mem; +use core::mem::ManuallyDrop; +use core::ptr::NonNull; + +cfg_if! { + // Use the SSE2 implementation if possible: it allows us to scan 16 buckets + // at once instead of 8. We don't bother with AVX since it would require + // runtime dispatch and wouldn't gain us much anyways: the probability of + // finding a match drops off drastically after the first few buckets. + // + // I attempted an implementation on ARM using NEON instructions, but it + // turns out that most NEON instructions have multi-cycle latency, which in + // the end outweighs any gains over the generic implementation. + if #[cfg(all( + target_feature = "sse2", + any(target_arch = "x86", target_arch = "x86_64"), + not(miri) + ))] { + mod sse2; + use sse2 as imp; + } else { + #[path = "generic.rs"] + mod generic; + use generic as imp; + } +} + +mod bitmask; + +use self::bitmask::{BitMask, BitMaskIter}; +use self::imp::Group; + +// Branch prediction hint. This is currently only available on nightly but it +// consistently improves performance by 10-15%. +#[cfg(feature = "nightly")] +use core::intrinsics::{likely, unlikely}; +#[cfg(not(feature = "nightly"))] +#[inline] +fn likely(b: bool) -> bool { + b +} +#[cfg(not(feature = "nightly"))] +#[inline] +fn unlikely(b: bool) -> bool { + b +} + +#[cfg(feature = "nightly")] +#[cfg_attr(feature = "inline-more", inline)] +unsafe fn offset_from(to: *const T, from: *const T) -> usize { + to.offset_from(from) as usize +} +#[cfg(not(feature = "nightly"))] +#[cfg_attr(feature = "inline-more", inline)] +unsafe fn offset_from(to: *const T, from: *const T) -> usize { + (to as usize - from as usize) / mem::size_of::() +} + +/// Whether memory allocation errors should return an error or abort. +#[derive(Copy, Clone)] +enum Fallibility { + Fallible, + Infallible, +} + +impl Fallibility { + /// Error to return on capacity overflow. + #[cfg_attr(feature = "inline-more", inline)] + fn capacity_overflow(self) -> TryReserveError { + match self { + Fallibility::Fallible => TryReserveError::CapacityOverflow, + Fallibility::Infallible => panic!("Hash table capacity overflow"), + } + } + + /// Error to return on allocation error. + #[cfg_attr(feature = "inline-more", inline)] + fn alloc_err(self, layout: Layout) -> TryReserveError { + match self { + Fallibility::Fallible => TryReserveError::AllocError { layout }, + Fallibility::Infallible => handle_alloc_error(layout), + } + } +} + +/// Control byte value for an empty bucket. +const EMPTY: u8 = 0b1111_1111; + +/// Control byte value for a deleted bucket. +const DELETED: u8 = 0b1000_0000; + +/// Checks whether a control byte represents a full bucket (top bit is clear). +#[inline] +fn is_full(ctrl: u8) -> bool { + ctrl & 0x80 == 0 +} + +/// Checks whether a control byte represents a special value (top bit is set). +#[inline] +fn is_special(ctrl: u8) -> bool { + ctrl & 0x80 != 0 +} + +/// Checks whether a special control value is EMPTY (just check 1 bit). +#[inline] +fn special_is_empty(ctrl: u8) -> bool { + debug_assert!(is_special(ctrl)); + ctrl & 0x01 != 0 +} + +/// Primary hash function, used to select the initial bucket to probe from. +#[inline] +#[allow(clippy::cast_possible_truncation)] +fn h1(hash: u64) -> usize { + // On 32-bit platforms we simply ignore the higher hash bits. + hash as usize +} + +/// Secondary hash function, saved in the low 7 bits of the control byte. +#[inline] +#[allow(clippy::cast_possible_truncation)] +fn h2(hash: u64) -> u8 { + // Grab the top 7 bits of the hash. While the hash is normally a full 64-bit + // value, some hash functions (such as FxHash) produce a usize result + // instead, which means that the top 32 bits are 0 on 32-bit platforms. + let hash_len = usize::min(mem::size_of::(), mem::size_of::()); + let top7 = hash >> (hash_len * 8 - 7); + (top7 & 0x7f) as u8 // truncation +} + +/// Probe sequence based on triangular numbers, which is guaranteed (since our +/// table size is a power of two) to visit every group of elements exactly once. +/// +/// A triangular probe has us jump by 1 more group every time. So first we +/// jump by 1 group (meaning we just continue our linear scan), then 2 groups +/// (skipping over 1 group), then 3 groups (skipping over 2 groups), and so on. +/// +/// Proof that the probe will visit every group in the table: +/// +struct ProbeSeq { + bucket_mask: usize, + pos: usize, + stride: usize, +} + +impl Iterator for ProbeSeq { + type Item = usize; + + #[inline] + fn next(&mut self) -> Option { + // We should have found an empty bucket by now and ended the probe. + debug_assert!( + self.stride <= self.bucket_mask, + "Went past end of probe sequence" + ); + + let result = self.pos; + self.stride += Group::WIDTH; + self.pos += self.stride; + self.pos &= self.bucket_mask; + Some(result) + } +} + +/// Returns the number of buckets needed to hold the given number of items, +/// taking the maximum load factor into account. +/// +/// Returns `None` if an overflow occurs. +// Workaround for emscripten bug emscripten-core/emscripten-fastcomp#258 +#[cfg_attr(target_os = "emscripten", inline(never))] +#[cfg_attr(not(target_os = "emscripten"), inline)] +fn capacity_to_buckets(cap: usize) -> Option { + debug_assert_ne!(cap, 0); + + // For small tables we require at least 1 empty bucket so that lookups are + // guaranteed to terminate if an element doesn't exist in the table. + if cap < 8 { + // We don't bother with a table size of 2 buckets since that can only + // hold a single element. Instead we skip directly to a 4 bucket table + // which can hold 3 elements. + return Some(if cap < 4 { 4 } else { 8 }); + } + + // Otherwise require 1/8 buckets to be empty (87.5% load) + // + // Be careful when modifying this, calculate_layout relies on the + // overflow check here. + let adjusted_cap = cap.checked_mul(8)? / 7; + + // Any overflows will have been caught by the checked_mul. Also, any + // rounding errors from the division above will be cleaned up by + // next_power_of_two (which can't overflow because of the previous divison). + Some(adjusted_cap.next_power_of_two()) +} + +/// Returns the maximum effective capacity for the given bucket mask, taking +/// the maximum load factor into account. +#[inline] +fn bucket_mask_to_capacity(bucket_mask: usize) -> usize { + if bucket_mask < 8 { + // For tables with 1/2/4/8 buckets, we always reserve one empty slot. + // Keep in mind that the bucket mask is one less than the bucket count. + bucket_mask + } else { + // For larger tables we reserve 12.5% of the slots as empty. + ((bucket_mask + 1) / 8) * 7 + } +} + +/// Returns a Layout which describes the allocation required for a hash table, +/// and the offset of the control bytes in the allocation. +/// (the offset is also one past last element of buckets) +/// +/// Returns `None` if an overflow occurs. +#[cfg_attr(feature = "inline-more", inline)] +#[cfg(feature = "nightly")] +fn calculate_layout(buckets: usize) -> Option<(Layout, usize)> { + debug_assert!(buckets.is_power_of_two()); + + // Array of buckets + let data = Layout::array::(buckets).ok()?; + + // Array of control bytes. This must be aligned to the group size. + // + // We add `Group::WIDTH` control bytes at the end of the array which + // replicate the bytes at the start of the array and thus avoids the need to + // perform bounds-checking while probing. + // + // There is no possible overflow here since buckets is a power of two and + // Group::WIDTH is a small number. + let ctrl = unsafe { Layout::from_size_align_unchecked(buckets + Group::WIDTH, Group::WIDTH) }; + + data.extend(ctrl).ok() +} + +/// Returns a Layout which describes the allocation required for a hash table, +/// and the offset of the control bytes in the allocation. +/// (the offset is also one past last element of buckets) +/// +/// Returns `None` if an overflow occurs. +#[cfg_attr(feature = "inline-more", inline)] +#[cfg(not(feature = "nightly"))] +fn calculate_layout(buckets: usize) -> Option<(Layout, usize)> { + debug_assert!(buckets.is_power_of_two()); + + // Manual layout calculation since Layout methods are not yet stable. + let ctrl_align = usize::max(mem::align_of::(), Group::WIDTH); + let ctrl_offset = mem::size_of::() + .checked_mul(buckets)? + .checked_add(ctrl_align - 1)? + & !(ctrl_align - 1); + let len = ctrl_offset.checked_add(buckets + Group::WIDTH)?; + + Some(( + unsafe { Layout::from_size_align_unchecked(len, ctrl_align) }, + ctrl_offset, + )) +} + +/// A reference to a hash table bucket containing a `T`. +/// +/// This is usually just a pointer to the element itself. However if the element +/// is a ZST, then we instead track the index of the element in the table so +/// that `erase` works properly. +pub struct Bucket { + // Actually it is pointer to next element than element itself + // this is needed to maintain pointer arithmetic invariants + // keeping direct pointer to element introduces difficulty. + // Using `NonNull` for variance and niche layout + ptr: NonNull, +} + +// This Send impl is needed for rayon support. This is safe since Bucket is +// never exposed in a public API. +unsafe impl Send for Bucket {} + +impl Clone for Bucket { + #[cfg_attr(feature = "inline-more", inline)] + fn clone(&self) -> Self { + Self { ptr: self.ptr } + } +} + +impl Bucket { + #[cfg_attr(feature = "inline-more", inline)] + unsafe fn from_base_index(base: NonNull, index: usize) -> Self { + let ptr = if mem::size_of::() == 0 { + // won't overflow because index must be less than length + (index + 1) as *mut T + } else { + base.as_ptr().sub(index) + }; + Self { + ptr: NonNull::new_unchecked(ptr), + } + } + #[cfg_attr(feature = "inline-more", inline)] + unsafe fn to_base_index(&self, base: NonNull) -> usize { + if mem::size_of::() == 0 { + self.ptr.as_ptr() as usize - 1 + } else { + offset_from(base.as_ptr(), self.ptr.as_ptr()) + } + } + #[cfg_attr(feature = "inline-more", inline)] + pub unsafe fn as_ptr(&self) -> *mut T { + if mem::size_of::() == 0 { + // Just return an arbitrary ZST pointer which is properly aligned + mem::align_of::() as *mut T + } else { + self.ptr.as_ptr().sub(1) + } + } + #[cfg_attr(feature = "inline-more", inline)] + unsafe fn next_n(&self, offset: usize) -> Self { + let ptr = if mem::size_of::() == 0 { + (self.ptr.as_ptr() as usize + offset) as *mut T + } else { + self.ptr.as_ptr().sub(offset) + }; + Self { + ptr: NonNull::new_unchecked(ptr), + } + } + #[cfg_attr(feature = "inline-more", inline)] + pub unsafe fn drop(&self) { + self.as_ptr().drop_in_place(); + } + #[cfg_attr(feature = "inline-more", inline)] + pub unsafe fn read(&self) -> T { + self.as_ptr().read() + } + #[cfg_attr(feature = "inline-more", inline)] + pub unsafe fn write(&self, val: T) { + self.as_ptr().write(val); + } + #[cfg_attr(feature = "inline-more", inline)] + pub unsafe fn as_ref<'a>(&self) -> &'a T { + &*self.as_ptr() + } + #[cfg_attr(feature = "inline-more", inline)] + pub unsafe fn as_mut<'a>(&self) -> &'a mut T { + &mut *self.as_ptr() + } + #[cfg_attr(feature = "inline-more", inline)] + pub unsafe fn copy_from_nonoverlapping(&self, other: &Self) { + self.as_ptr().copy_from_nonoverlapping(other.as_ptr(), 1); + } +} + +/// A raw hash table with an unsafe API. +pub struct RawTable { + // Mask to get an index from a hash value. The value is one less than the + // number of buckets in the table. + bucket_mask: usize, + + // [Padding], T1, T2, ..., Tlast, C1, C2, ... + // ^ points here + ctrl: NonNull, + + // Number of elements that can be inserted before we need to grow the table + growth_left: usize, + + // Number of elements in the table, only really used by len() + items: usize, + + // Tell dropck that we own instances of T. + marker: PhantomData, +} + +impl RawTable { + /// Creates a new empty hash table without allocating any memory. + /// + /// In effect this returns a table with exactly 1 bucket. However we can + /// leave the data pointer dangling since that bucket is never written to + /// due to our load factor forcing us to always have at least 1 free bucket. + #[cfg_attr(feature = "inline-more", inline)] + pub const fn new() -> Self { + Self { + // Be careful to cast the entire slice to a raw pointer. + ctrl: unsafe { NonNull::new_unchecked(Group::static_empty() as *const _ as *mut u8) }, + bucket_mask: 0, + items: 0, + growth_left: 0, + marker: PhantomData, + } + } + + /// Allocates a new hash table with the given number of buckets. + /// + /// The control bytes are left uninitialized. + #[cfg_attr(feature = "inline-more", inline)] + unsafe fn new_uninitialized( + buckets: usize, + fallability: Fallibility, + ) -> Result { + debug_assert!(buckets.is_power_of_two()); + + // Avoid `Option::ok_or_else` because it bloats LLVM IR. + let (layout, ctrl_offset) = match calculate_layout::(buckets) { + Some(lco) => lco, + None => return Err(fallability.capacity_overflow()), + }; + let ptr = match NonNull::new(alloc(layout)) { + Some(ptr) => ptr, + None => return Err(fallability.alloc_err(layout)), + }; + let ctrl = NonNull::new_unchecked(ptr.as_ptr().add(ctrl_offset)); + Ok(Self { + ctrl, + bucket_mask: buckets - 1, + items: 0, + growth_left: bucket_mask_to_capacity(buckets - 1), + marker: PhantomData, + }) + } + + /// Attempts to allocate a new hash table with at least enough capacity + /// for inserting the given number of elements without reallocating. + fn fallible_with_capacity( + capacity: usize, + fallability: Fallibility, + ) -> Result { + if capacity == 0 { + Ok(Self::new()) + } else { + unsafe { + // Avoid `Option::ok_or_else` because it bloats LLVM IR. + let buckets = match capacity_to_buckets(capacity) { + Some(buckets) => buckets, + None => return Err(fallability.capacity_overflow()), + }; + let result = Self::new_uninitialized(buckets, fallability)?; + result.ctrl(0).write_bytes(EMPTY, result.num_ctrl_bytes()); + + Ok(result) + } + } + } + + /// Attempts to allocate a new hash table with at least enough capacity + /// for inserting the given number of elements without reallocating. + #[cfg(feature = "raw")] + pub fn try_with_capacity(capacity: usize) -> Result { + Self::fallible_with_capacity(capacity, Fallibility::Fallible) + } + + /// Allocates a new hash table with at least enough capacity for inserting + /// the given number of elements without reallocating. + pub fn with_capacity(capacity: usize) -> Self { + // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. + match Self::fallible_with_capacity(capacity, Fallibility::Infallible) { + Ok(capacity) => capacity, + Err(_) => unsafe { hint::unreachable_unchecked() }, + } + } + + /// Deallocates the table without dropping any entries. + #[cfg_attr(feature = "inline-more", inline)] + unsafe fn free_buckets(&mut self) { + // Avoid `Option::unwrap_or_else` because it bloats LLVM IR. + let (layout, ctrl_offset) = match calculate_layout::(self.buckets()) { + Some(lco) => lco, + None => hint::unreachable_unchecked(), + }; + dealloc(self.ctrl.as_ptr().sub(ctrl_offset), layout); + } + + /// Returns pointer to one past last element of data table. + #[cfg_attr(feature = "inline-more", inline)] + pub unsafe fn data_end(&self) -> NonNull { + NonNull::new_unchecked(self.ctrl.as_ptr() as *mut T) + } + + /// Returns pointer to start of data table. + #[cfg_attr(feature = "inline-more", inline)] + #[cfg(feature = "nightly")] + pub unsafe fn data_start(&self) -> *mut T { + self.data_end().as_ptr().wrapping_sub(self.buckets()) + } + + /// Returns the index of a bucket from a `Bucket`. + #[cfg_attr(feature = "inline-more", inline)] + pub unsafe fn bucket_index(&self, bucket: &Bucket) -> usize { + bucket.to_base_index(self.data_end()) + } + + /// Returns a pointer to a control byte. + #[cfg_attr(feature = "inline-more", inline)] + unsafe fn ctrl(&self, index: usize) -> *mut u8 { + debug_assert!(index < self.num_ctrl_bytes()); + self.ctrl.as_ptr().add(index) + } + + /// Returns a pointer to an element in the table. + #[cfg_attr(feature = "inline-more", inline)] + pub unsafe fn bucket(&self, index: usize) -> Bucket { + debug_assert_ne!(self.bucket_mask, 0); + debug_assert!(index < self.buckets()); + Bucket::from_base_index(self.data_end(), index) + } + + /// Erases an element from the table without dropping it. + #[cfg_attr(feature = "inline-more", inline)] + #[deprecated(since = "0.8.1", note = "use erase or remove instead")] + pub unsafe fn erase_no_drop(&mut self, item: &Bucket) { + let index = self.bucket_index(item); + debug_assert!(is_full(*self.ctrl(index))); + let index_before = index.wrapping_sub(Group::WIDTH) & self.bucket_mask; + let empty_before = Group::load(self.ctrl(index_before)).match_empty(); + let empty_after = Group::load(self.ctrl(index)).match_empty(); + + // If we are inside a continuous block of Group::WIDTH full or deleted + // cells then a probe window may have seen a full block when trying to + // insert. We therefore need to keep that block non-empty so that + // lookups will continue searching to the next probe window. + // + // Note that in this context `leading_zeros` refers to the bytes at the + // end of a group, while `trailing_zeros` refers to the bytes at the + // begining of a group. + let ctrl = if empty_before.leading_zeros() + empty_after.trailing_zeros() >= Group::WIDTH { + DELETED + } else { + self.growth_left += 1; + EMPTY + }; + self.set_ctrl(index, ctrl); + self.items -= 1; + } + + /// Erases an element from the table, dropping it in place. + #[cfg_attr(feature = "inline-more", inline)] + #[allow(clippy::needless_pass_by_value)] + #[allow(deprecated)] + pub unsafe fn erase(&mut self, item: Bucket) { + // Erase the element from the table first since drop might panic. + self.erase_no_drop(&item); + item.drop(); + } + + /// Finds and erases an element from the table, dropping it in place. + /// Returns true if an element was found. + #[cfg(feature = "raw")] + #[cfg_attr(feature = "inline-more", inline)] + pub fn erase_entry(&mut self, hash: u64, eq: impl FnMut(&T) -> bool) -> bool { + // Avoid `Option::map` because it bloats LLVM IR. + if let Some(bucket) = self.find(hash, eq) { + unsafe { self.erase(bucket) }; + true + } else { + false + } + } + + /// Removes an element from the table, returning it. + #[cfg_attr(feature = "inline-more", inline)] + #[allow(clippy::needless_pass_by_value)] + #[allow(deprecated)] + pub unsafe fn remove(&mut self, item: Bucket) -> T { + self.erase_no_drop(&item); + item.read() + } + + /// Finds and removes an element from the table, returning it. + #[cfg_attr(feature = "inline-more", inline)] + pub fn remove_entry(&mut self, hash: u64, eq: impl FnMut(&T) -> bool) -> Option { + // Avoid `Option::map` because it bloats LLVM IR. + match self.find(hash, eq) { + Some(bucket) => Some(unsafe { self.remove(bucket) }), + None => None, + } + } + + /// Returns an iterator for a probe sequence on the table. + /// + /// This iterator never terminates, but is guaranteed to visit each bucket + /// group exactly once. The loop using `probe_seq` must terminate upon + /// reaching a group containing an empty bucket. + #[cfg_attr(feature = "inline-more", inline)] + fn probe_seq(&self, hash: u64) -> ProbeSeq { + ProbeSeq { + bucket_mask: self.bucket_mask, + pos: h1(hash) & self.bucket_mask, + stride: 0, + } + } + + /// Sets a control byte, and possibly also the replicated control byte at + /// the end of the array. + #[cfg_attr(feature = "inline-more", inline)] + unsafe fn set_ctrl(&self, index: usize, ctrl: u8) { + // Replicate the first Group::WIDTH control bytes at the end of + // the array without using a branch: + // - If index >= Group::WIDTH then index == index2. + // - Otherwise index2 == self.bucket_mask + 1 + index. + // + // The very last replicated control byte is never actually read because + // we mask the initial index for unaligned loads, but we write it + // anyways because it makes the set_ctrl implementation simpler. + // + // If there are fewer buckets than Group::WIDTH then this code will + // replicate the buckets at the end of the trailing group. For example + // with 2 buckets and a group size of 4, the control bytes will look + // like this: + // + // Real | Replicated + // --------------------------------------------- + // | [A] | [B] | [EMPTY] | [EMPTY] | [A] | [B] | + // --------------------------------------------- + let index2 = ((index.wrapping_sub(Group::WIDTH)) & self.bucket_mask) + Group::WIDTH; + + *self.ctrl(index) = ctrl; + *self.ctrl(index2) = ctrl; + } + + /// Searches for an empty or deleted bucket which is suitable for inserting + /// a new element. + /// + /// There must be at least 1 empty bucket in the table. + #[cfg_attr(feature = "inline-more", inline)] + fn find_insert_slot(&self, hash: u64) -> usize { + for pos in self.probe_seq(hash) { + unsafe { + let group = Group::load(self.ctrl(pos)); + if let Some(bit) = group.match_empty_or_deleted().lowest_set_bit() { + let result = (pos + bit) & self.bucket_mask; + + // In tables smaller than the group width, trailing control + // bytes outside the range of the table are filled with + // EMPTY entries. These will unfortunately trigger a + // match, but once masked may point to a full bucket that + // is already occupied. We detect this situation here and + // perform a second scan starting at the begining of the + // table. This second scan is guaranteed to find an empty + // slot (due to the load factor) before hitting the trailing + // control bytes (containing EMPTY). + if unlikely(is_full(*self.ctrl(result))) { + debug_assert!(self.bucket_mask < Group::WIDTH); + debug_assert_ne!(pos, 0); + return Group::load_aligned(self.ctrl(0)) + .match_empty_or_deleted() + .lowest_set_bit_nonzero(); + } else { + return result; + } + } + } + } + + // probe_seq never returns. + unreachable!(); + } + + /// Marks all table buckets as empty without dropping their contents. + #[cfg_attr(feature = "inline-more", inline)] + pub fn clear_no_drop(&mut self) { + if !self.is_empty_singleton() { + unsafe { + self.ctrl(0).write_bytes(EMPTY, self.num_ctrl_bytes()); + } + } + self.items = 0; + self.growth_left = bucket_mask_to_capacity(self.bucket_mask); + } + + /// Removes all elements from the table without freeing the backing memory. + #[cfg_attr(feature = "inline-more", inline)] + pub fn clear(&mut self) { + // Ensure that the table is reset even if one of the drops panic + let self_ = guard(self, |self_| self_.clear_no_drop()); + + if mem::needs_drop::() && self_.len() != 0 { + unsafe { + for item in self_.iter() { + item.drop(); + } + } + } + } + + /// Shrinks the table to fit `max(self.len(), min_size)` elements. + #[cfg_attr(feature = "inline-more", inline)] + pub fn shrink_to(&mut self, min_size: usize, hasher: impl Fn(&T) -> u64) { + // Calculate the minimal number of elements that we need to reserve + // space for. + let min_size = usize::max(self.items, min_size); + if min_size == 0 { + *self = Self::new(); + return; + } + + // Calculate the number of buckets that we need for this number of + // elements. If the calculation overflows then the requested bucket + // count must be larger than what we have right and nothing needs to be + // done. + let min_buckets = match capacity_to_buckets(min_size) { + Some(buckets) => buckets, + None => return, + }; + + // If we have more buckets than we need, shrink the table. + if min_buckets < self.buckets() { + // Fast path if the table is empty + if self.items == 0 { + *self = Self::with_capacity(min_size) + } else { + // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. + if self + .resize(min_size, hasher, Fallibility::Infallible) + .is_err() + { + unsafe { hint::unreachable_unchecked() } + } + } + } + } + + /// Ensures that at least `additional` items can be inserted into the table + /// without reallocation. + #[cfg_attr(feature = "inline-more", inline)] + pub fn reserve(&mut self, additional: usize, hasher: impl Fn(&T) -> u64) { + if additional > self.growth_left { + // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. + if self + .reserve_rehash(additional, hasher, Fallibility::Infallible) + .is_err() + { + unsafe { hint::unreachable_unchecked() } + } + } + } + + /// Tries to ensure that at least `additional` items can be inserted into + /// the table without reallocation. + #[cfg_attr(feature = "inline-more", inline)] + pub fn try_reserve( + &mut self, + additional: usize, + hasher: impl Fn(&T) -> u64, + ) -> Result<(), TryReserveError> { + if additional > self.growth_left { + self.reserve_rehash(additional, hasher, Fallibility::Fallible) + } else { + Ok(()) + } + } + + /// Out-of-line slow path for `reserve` and `try_reserve`. + #[cold] + #[inline(never)] + fn reserve_rehash( + &mut self, + additional: usize, + hasher: impl Fn(&T) -> u64, + fallability: Fallibility, + ) -> Result<(), TryReserveError> { + // Avoid `Option::ok_or_else` because it bloats LLVM IR. + let new_items = match self.items.checked_add(additional) { + Some(new_items) => new_items, + None => return Err(fallability.capacity_overflow()), + }; + let full_capacity = bucket_mask_to_capacity(self.bucket_mask); + if new_items <= full_capacity / 2 { + // Rehash in-place without re-allocating if we have plenty of spare + // capacity that is locked up due to DELETED entries. + self.rehash_in_place(hasher); + Ok(()) + } else { + // Otherwise, conservatively resize to at least the next size up + // to avoid churning deletes into frequent rehashes. + self.resize( + usize::max(new_items, full_capacity + 1), + hasher, + fallability, + ) + } + } + + /// Rehashes the contents of the table in place (i.e. without changing the + /// allocation). + /// + /// If `hasher` panics then some the table's contents may be lost. + fn rehash_in_place(&mut self, hasher: impl Fn(&T) -> u64) { + unsafe { + // Bulk convert all full control bytes to DELETED, and all DELETED + // control bytes to EMPTY. This effectively frees up all buckets + // containing a DELETED entry. + for i in (0..self.buckets()).step_by(Group::WIDTH) { + let group = Group::load_aligned(self.ctrl(i)); + let group = group.convert_special_to_empty_and_full_to_deleted(); + group.store_aligned(self.ctrl(i)); + } + + // Fix up the trailing control bytes. See the comments in set_ctrl + // for the handling of tables smaller than the group width. + if self.buckets() < Group::WIDTH { + self.ctrl(0) + .copy_to(self.ctrl(Group::WIDTH), self.buckets()); + } else { + self.ctrl(0) + .copy_to(self.ctrl(self.buckets()), Group::WIDTH); + } + + // If the hash function panics then properly clean up any elements + // that we haven't rehashed yet. We unfortunately can't preserve the + // element since we lost their hash and have no way of recovering it + // without risking another panic. + let mut guard = guard(self, |self_| { + if mem::needs_drop::() { + for i in 0..self_.buckets() { + if *self_.ctrl(i) == DELETED { + self_.set_ctrl(i, EMPTY); + self_.bucket(i).drop(); + self_.items -= 1; + } + } + } + self_.growth_left = bucket_mask_to_capacity(self_.bucket_mask) - self_.items; + }); + + // At this point, DELETED elements are elements that we haven't + // rehashed yet. Find them and re-insert them at their ideal + // position. + 'outer: for i in 0..guard.buckets() { + if *guard.ctrl(i) != DELETED { + continue; + } + 'inner: loop { + // Hash the current item + let item = guard.bucket(i); + let hash = hasher(item.as_ref()); + + // Search for a suitable place to put it + let new_i = guard.find_insert_slot(hash); + + // Probing works by scanning through all of the control + // bytes in groups, which may not be aligned to the group + // size. If both the new and old position fall within the + // same unaligned group, then there is no benefit in moving + // it and we can just continue to the next item. + let probe_index = |pos: usize| { + (pos.wrapping_sub(guard.probe_seq(hash).pos) & guard.bucket_mask) + / Group::WIDTH + }; + if likely(probe_index(i) == probe_index(new_i)) { + guard.set_ctrl(i, h2(hash)); + continue 'outer; + } + + // We are moving the current item to a new position. Write + // our H2 to the control byte of the new position. + let prev_ctrl = *guard.ctrl(new_i); + guard.set_ctrl(new_i, h2(hash)); + + if prev_ctrl == EMPTY { + // If the target slot is empty, simply move the current + // element into the new slot and clear the old control + // byte. + guard.set_ctrl(i, EMPTY); + guard.bucket(new_i).copy_from_nonoverlapping(&item); + continue 'outer; + } else { + // If the target slot is occupied, swap the two elements + // and then continue processing the element that we just + // swapped into the old slot. + debug_assert_eq!(prev_ctrl, DELETED); + mem::swap(guard.bucket(new_i).as_mut(), item.as_mut()); + continue 'inner; + } + } + } + + guard.growth_left = bucket_mask_to_capacity(guard.bucket_mask) - guard.items; + mem::forget(guard); + } + } + + /// Allocates a new table of a different size and moves the contents of the + /// current table into it. + fn resize( + &mut self, + capacity: usize, + hasher: impl Fn(&T) -> u64, + fallability: Fallibility, + ) -> Result<(), TryReserveError> { + unsafe { + debug_assert!(self.items <= capacity); + + // Allocate and initialize the new table. + let mut new_table = Self::fallible_with_capacity(capacity, fallability)?; + new_table.growth_left -= self.items; + new_table.items = self.items; + + // The hash function may panic, in which case we simply free the new + // table without dropping any elements that may have been copied into + // it. + // + // This guard is also used to free the old table on success, see + // the comment at the bottom of this function. + let mut new_table = guard(ManuallyDrop::new(new_table), |new_table| { + if !new_table.is_empty_singleton() { + new_table.free_buckets(); + } + }); + + // Copy all elements to the new table. + for item in self.iter() { + // This may panic. + let hash = hasher(item.as_ref()); + + // We can use a simpler version of insert() here since: + // - there are no DELETED entries. + // - we know there is enough space in the table. + // - all elements are unique. + let index = new_table.find_insert_slot(hash); + new_table.set_ctrl(index, h2(hash)); + new_table.bucket(index).copy_from_nonoverlapping(&item); + } + + // We successfully copied all elements without panicking. Now replace + // self with the new table. The old table will have its memory freed but + // the items will not be dropped (since they have been moved into the + // new table). + mem::swap(self, &mut new_table); + + Ok(()) + } + } + + /// Inserts a new element into the table, and returns its raw bucket. + /// + /// This does not check if the given element already exists in the table. + #[cfg_attr(feature = "inline-more", inline)] + pub fn insert(&mut self, hash: u64, value: T, hasher: impl Fn(&T) -> u64) -> Bucket { + unsafe { + let mut index = self.find_insert_slot(hash); + + // We can avoid growing the table once we have reached our load + // factor if we are replacing a tombstone. This works since the + // number of EMPTY slots does not change in this case. + let old_ctrl = *self.ctrl(index); + if unlikely(self.growth_left == 0 && special_is_empty(old_ctrl)) { + self.reserve(1, hasher); + index = self.find_insert_slot(hash); + } + + let bucket = self.bucket(index); + self.growth_left -= special_is_empty(old_ctrl) as usize; + self.set_ctrl(index, h2(hash)); + bucket.write(value); + self.items += 1; + bucket + } + } + + /// Inserts a new element into the table, and returns a mutable reference to it. + /// + /// This does not check if the given element already exists in the table. + #[cfg_attr(feature = "inline-more", inline)] + pub fn insert_entry(&mut self, hash: u64, value: T, hasher: impl Fn(&T) -> u64) -> &mut T { + unsafe { self.insert(hash, value, hasher).as_mut() } + } + + /// Inserts a new element into the table, without growing the table. + /// + /// There must be enough space in the table to insert the new element. + /// + /// This does not check if the given element already exists in the table. + #[cfg_attr(feature = "inline-more", inline)] + #[cfg(any(feature = "raw", feature = "rustc-internal-api"))] + pub fn insert_no_grow(&mut self, hash: u64, value: T) -> Bucket { + unsafe { + let index = self.find_insert_slot(hash); + let bucket = self.bucket(index); + + // If we are replacing a DELETED entry then we don't need to update + // the load counter. + let old_ctrl = *self.ctrl(index); + self.growth_left -= special_is_empty(old_ctrl) as usize; + + self.set_ctrl(index, h2(hash)); + bucket.write(value); + self.items += 1; + bucket + } + } + + /// Temporary removes a bucket, applying the given function to the removed + /// element and optionally put back the returned value in the same bucket. + /// + /// Returns `true` if the bucket still contains an element + /// + /// This does not check if the given bucket is actually occupied. + #[cfg_attr(feature = "inline-more", inline)] + pub unsafe fn replace_bucket_with(&mut self, bucket: Bucket, f: F) -> bool + where + F: FnOnce(T) -> Option, + { + let index = self.bucket_index(&bucket); + let old_ctrl = *self.ctrl(index); + debug_assert!(is_full(old_ctrl)); + let old_growth_left = self.growth_left; + let item = self.remove(bucket); + if let Some(new_item) = f(item) { + self.growth_left = old_growth_left; + self.set_ctrl(index, old_ctrl); + self.items += 1; + self.bucket(index).write(new_item); + true + } else { + false + } + } + + /// Searches for an element in the table. + #[inline] + pub fn find(&self, hash: u64, mut eq: impl FnMut(&T) -> bool) -> Option> { + unsafe { + for bucket in self.iter_hash(hash) { + let elm = bucket.as_ref(); + if likely(eq(elm)) { + return Some(bucket); + } + } + None + } + } + + /// Gets a reference to an element in the table. + #[inline] + pub fn get(&self, hash: u64, eq: impl FnMut(&T) -> bool) -> Option<&T> { + // Avoid `Option::map` because it bloats LLVM IR. + match self.find(hash, eq) { + Some(bucket) => Some(unsafe { bucket.as_ref() }), + None => None, + } + } + + /// Gets a mutable reference to an element in the table. + #[inline] + pub fn get_mut(&mut self, hash: u64, eq: impl FnMut(&T) -> bool) -> Option<&mut T> { + // Avoid `Option::map` because it bloats LLVM IR. + match self.find(hash, eq) { + Some(bucket) => Some(unsafe { bucket.as_mut() }), + None => None, + } + } + + /// Returns the number of elements the map can hold without reallocating. + /// + /// This number is a lower bound; the table might be able to hold + /// more, but is guaranteed to be able to hold at least this many. + #[cfg_attr(feature = "inline-more", inline)] + pub fn capacity(&self) -> usize { + self.items + self.growth_left + } + + /// Returns the number of elements in the table. + #[cfg_attr(feature = "inline-more", inline)] + pub fn len(&self) -> usize { + self.items + } + + /// Returns the number of buckets in the table. + #[cfg_attr(feature = "inline-more", inline)] + pub fn buckets(&self) -> usize { + self.bucket_mask + 1 + } + + /// Returns the number of control bytes in the table. + #[cfg_attr(feature = "inline-more", inline)] + fn num_ctrl_bytes(&self) -> usize { + self.bucket_mask + 1 + Group::WIDTH + } + + /// Returns whether this table points to the empty singleton with a capacity + /// of 0. + #[cfg_attr(feature = "inline-more", inline)] + fn is_empty_singleton(&self) -> bool { + self.bucket_mask == 0 + } + + /// Returns an iterator over every element in the table. It is up to + /// the caller to ensure that the `RawTable` outlives the `RawIter`. + /// Because we cannot make the `next` method unsafe on the `RawIter` + /// struct, we have to make the `iter` method unsafe. + #[cfg_attr(feature = "inline-more", inline)] + pub unsafe fn iter(&self) -> RawIter { + let data = Bucket::from_base_index(self.data_end(), 0); + RawIter { + iter: RawIterRange::new(self.ctrl.as_ptr(), data, self.buckets()), + items: self.items, + } + } + + /// Returns an iterator over occupied buckets that could match a given hash. + /// + /// In rare cases, the iterator may return a bucket with a different hash. + /// + /// It is up to the caller to ensure that the `RawTable` outlives the + /// `RawIterHash`. Because we cannot make the `next` method unsafe on the + /// `RawIterHash` struct, we have to make the `iter_hash` method unsafe. + #[cfg_attr(feature = "inline-more", inline)] + pub unsafe fn iter_hash(&self, hash: u64) -> RawIterHash<'_, T> { + RawIterHash::new(self, hash) + } + + /// Returns an iterator which removes all elements from the table without + /// freeing the memory. + #[cfg_attr(feature = "inline-more", inline)] + pub fn drain(&mut self) -> RawDrain<'_, T> { + unsafe { + let iter = self.iter(); + self.drain_iter_from(iter) + } + } + + /// Returns an iterator which removes all elements from the table without + /// freeing the memory. + /// + /// Iteration starts at the provided iterator's current location. + /// + /// It is up to the caller to ensure that the iterator is valid for this + /// `RawTable` and covers all items that remain in the table. + #[cfg_attr(feature = "inline-more", inline)] + pub unsafe fn drain_iter_from(&mut self, iter: RawIter) -> RawDrain<'_, T> { + debug_assert_eq!(iter.len(), self.len()); + RawDrain { + iter, + table: ManuallyDrop::new(mem::replace(self, Self::new())), + orig_table: NonNull::from(self), + marker: PhantomData, + } + } + + /// Returns an iterator which consumes all elements from the table. + /// + /// Iteration starts at the provided iterator's current location. + /// + /// It is up to the caller to ensure that the iterator is valid for this + /// `RawTable` and covers all items that remain in the table. + pub unsafe fn into_iter_from(self, iter: RawIter) -> RawIntoIter { + debug_assert_eq!(iter.len(), self.len()); + + let alloc = self.into_alloc(); + RawIntoIter { + iter, + alloc, + marker: PhantomData, + } + } + + /// Converts the table into a raw allocation. The contents of the table + /// should be dropped using a `RawIter` before freeing the allocation. + #[cfg_attr(feature = "inline-more", inline)] + pub(crate) fn into_alloc(self) -> Option<(NonNull, Layout)> { + let alloc = if self.is_empty_singleton() { + None + } else { + // Avoid `Option::unwrap_or_else` because it bloats LLVM IR. + let (layout, ctrl_offset) = match calculate_layout::(self.buckets()) { + Some(lco) => lco, + None => unsafe { hint::unreachable_unchecked() }, + }; + Some(( + unsafe { NonNull::new_unchecked(self.ctrl.as_ptr().sub(ctrl_offset)) }, + layout, + )) + }; + mem::forget(self); + alloc + } +} + +unsafe impl Send for RawTable where T: Send {} +unsafe impl Sync for RawTable where T: Sync {} + +impl Clone for RawTable { + fn clone(&self) -> Self { + if self.is_empty_singleton() { + Self::new() + } else { + unsafe { + let mut new_table = ManuallyDrop::new( + // Avoid `Result::ok_or_else` because it bloats LLVM IR. + match Self::new_uninitialized(self.buckets(), Fallibility::Infallible) { + Ok(table) => table, + Err(_) => hint::unreachable_unchecked(), + }, + ); + + new_table.clone_from_spec(self, |new_table| { + // We need to free the memory allocated for the new table. + new_table.free_buckets(); + }); + + // Return the newly created table. + ManuallyDrop::into_inner(new_table) + } + } + } + + fn clone_from(&mut self, source: &Self) { + if source.is_empty_singleton() { + *self = Self::new(); + } else { + unsafe { + // First, drop all our elements without clearing the control bytes. + if mem::needs_drop::() && self.len() != 0 { + for item in self.iter() { + item.drop(); + } + } + + // If necessary, resize our table to match the source. + if self.buckets() != source.buckets() { + // Skip our drop by using ptr::write. + if !self.is_empty_singleton() { + self.free_buckets(); + } + (self as *mut Self).write( + // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. + match Self::new_uninitialized(source.buckets(), Fallibility::Infallible) { + Ok(table) => table, + Err(_) => hint::unreachable_unchecked(), + }, + ); + } + + self.clone_from_spec(source, |self_| { + // We need to leave the table in an empty state. + self_.clear_no_drop() + }); + } + } + } +} + +/// Specialization of `clone_from` for `Copy` types +trait RawTableClone { + unsafe fn clone_from_spec(&mut self, source: &Self, on_panic: impl FnMut(&mut Self)); +} +impl RawTableClone for RawTable { + #[cfg_attr(feature = "inline-more", inline)] + default_fn! { + unsafe fn clone_from_spec(&mut self, source: &Self, on_panic: impl FnMut(&mut Self)) { + self.clone_from_impl(source, on_panic); + } + } +} +#[cfg(feature = "nightly")] +impl RawTableClone for RawTable { + #[cfg_attr(feature = "inline-more", inline)] + unsafe fn clone_from_spec(&mut self, source: &Self, _on_panic: impl FnMut(&mut Self)) { + source + .ctrl(0) + .copy_to_nonoverlapping(self.ctrl(0), self.num_ctrl_bytes()); + source + .data_start() + .copy_to_nonoverlapping(self.data_start(), self.buckets()); + + self.items = source.items; + self.growth_left = source.growth_left; + } +} + +impl RawTable { + /// Common code for clone and clone_from. Assumes `self.buckets() == source.buckets()`. + #[cfg_attr(feature = "inline-more", inline)] + unsafe fn clone_from_impl(&mut self, source: &Self, mut on_panic: impl FnMut(&mut Self)) { + // Copy the control bytes unchanged. We do this in a single pass + source + .ctrl(0) + .copy_to_nonoverlapping(self.ctrl(0), self.num_ctrl_bytes()); + + // The cloning of elements may panic, in which case we need + // to make sure we drop only the elements that have been + // cloned so far. + let mut guard = guard((0, &mut *self), |(index, self_)| { + if mem::needs_drop::() && self_.len() != 0 { + for i in 0..=*index { + if is_full(*self_.ctrl(i)) { + self_.bucket(i).drop(); + } + } + } + + // Depending on whether we were called from clone or clone_from, we + // either need to free the memory for the destination table or just + // clear the control bytes. + on_panic(self_); + }); + + for from in source.iter() { + let index = source.bucket_index(&from); + let to = guard.1.bucket(index); + to.write(from.as_ref().clone()); + + // Update the index in case we need to unwind. + guard.0 = index; + } + + // Successfully cloned all items, no need to clean up. + mem::forget(guard); + + self.items = source.items; + self.growth_left = source.growth_left; + } + + /// Variant of `clone_from` to use when a hasher is available. + #[cfg(feature = "raw")] + pub fn clone_from_with_hasher(&mut self, source: &Self, hasher: impl Fn(&T) -> u64) { + // If we have enough capacity in the table, just clear it and insert + // elements one by one. We don't do this if we have the same number of + // buckets as the source since we can just copy the contents directly + // in that case. + if self.buckets() != source.buckets() + && bucket_mask_to_capacity(self.bucket_mask) >= source.len() + { + self.clear(); + + let guard_self = guard(&mut *self, |self_| { + // Clear the partially copied table if a panic occurs, otherwise + // items and growth_left will be out of sync with the contents + // of the table. + self_.clear(); + }); + + unsafe { + for item in source.iter() { + // This may panic. + let item = item.as_ref().clone(); + let hash = hasher(&item); + + // We can use a simpler version of insert() here since: + // - there are no DELETED entries. + // - we know there is enough space in the table. + // - all elements are unique. + let index = guard_self.find_insert_slot(hash); + guard_self.set_ctrl(index, h2(hash)); + guard_self.bucket(index).write(item); + } + } + + // Successfully cloned all items, no need to clean up. + mem::forget(guard_self); + + self.items = source.items; + self.growth_left -= source.items; + } else { + self.clone_from(source); + } + } +} + +#[cfg(feature = "nightly")] +unsafe impl<#[may_dangle] T> Drop for RawTable { + #[cfg_attr(feature = "inline-more", inline)] + fn drop(&mut self) { + if !self.is_empty_singleton() { + unsafe { + if mem::needs_drop::() && self.len() != 0 { + for item in self.iter() { + item.drop(); + } + } + self.free_buckets(); + } + } + } +} +#[cfg(not(feature = "nightly"))] +impl Drop for RawTable { + #[cfg_attr(feature = "inline-more", inline)] + fn drop(&mut self) { + if !self.is_empty_singleton() { + unsafe { + if mem::needs_drop::() && self.len() != 0 { + for item in self.iter() { + item.drop(); + } + } + self.free_buckets(); + } + } + } +} + +impl IntoIterator for RawTable { + type Item = T; + type IntoIter = RawIntoIter; + + #[cfg_attr(feature = "inline-more", inline)] + fn into_iter(self) -> RawIntoIter { + unsafe { + let iter = self.iter(); + self.into_iter_from(iter) + } + } +} + +/// Iterator over a sub-range of a table. Unlike `RawIter` this iterator does +/// not track an item count. +pub(crate) struct RawIterRange { + // Mask of full buckets in the current group. Bits are cleared from this + // mask as each element is processed. + current_group: BitMask, + + // Pointer to the buckets for the current group. + data: Bucket, + + // Pointer to the next group of control bytes, + // Must be aligned to the group size. + next_ctrl: *const u8, + + // Pointer one past the last control byte of this range. + end: *const u8, +} + +impl RawIterRange { + /// Returns a `RawIterRange` covering a subset of a table. + /// + /// The control byte address must be aligned to the group size. + #[cfg_attr(feature = "inline-more", inline)] + unsafe fn new(ctrl: *const u8, data: Bucket, len: usize) -> Self { + debug_assert_ne!(len, 0); + debug_assert_eq!(ctrl as usize % Group::WIDTH, 0); + let end = ctrl.add(len); + + // Load the first group and advance ctrl to point to the next group + let current_group = Group::load_aligned(ctrl).match_full(); + let next_ctrl = ctrl.add(Group::WIDTH); + + Self { + current_group, + data, + next_ctrl, + end, + } + } + + /// Splits a `RawIterRange` into two halves. + /// + /// Returns `None` if the remaining range is smaller than or equal to the + /// group width. + #[cfg_attr(feature = "inline-more", inline)] + #[cfg(feature = "rayon")] + pub(crate) fn split(mut self) -> (Self, Option>) { + unsafe { + if self.end <= self.next_ctrl { + // Nothing to split if the group that we are current processing + // is the last one. + (self, None) + } else { + // len is the remaining number of elements after the group that + // we are currently processing. It must be a multiple of the + // group size (small tables are caught by the check above). + let len = offset_from(self.end, self.next_ctrl); + debug_assert_eq!(len % Group::WIDTH, 0); + + // Split the remaining elements into two halves, but round the + // midpoint down in case there is an odd number of groups + // remaining. This ensures that: + // - The tail is at least 1 group long. + // - The split is roughly even considering we still have the + // current group to process. + let mid = (len / 2) & !(Group::WIDTH - 1); + + let tail = Self::new( + self.next_ctrl.add(mid), + self.data.next_n(Group::WIDTH).next_n(mid), + len - mid, + ); + debug_assert_eq!( + self.data.next_n(Group::WIDTH).next_n(mid).ptr, + tail.data.ptr + ); + debug_assert_eq!(self.end, tail.end); + self.end = self.next_ctrl.add(mid); + debug_assert_eq!(self.end.add(Group::WIDTH), tail.next_ctrl); + (self, Some(tail)) + } + } + } +} + +// We make raw iterators unconditionally Send and Sync, and let the PhantomData +// in the actual iterator implementations determine the real Send/Sync bounds. +unsafe impl Send for RawIterRange {} +unsafe impl Sync for RawIterRange {} + +impl Clone for RawIterRange { + #[cfg_attr(feature = "inline-more", inline)] + fn clone(&self) -> Self { + Self { + data: self.data.clone(), + next_ctrl: self.next_ctrl, + current_group: self.current_group, + end: self.end, + } + } +} + +impl Iterator for RawIterRange { + type Item = Bucket; + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option> { + unsafe { + loop { + if let Some(index) = self.current_group.lowest_set_bit() { + self.current_group = self.current_group.remove_lowest_bit(); + return Some(self.data.next_n(index)); + } + + if self.next_ctrl >= self.end { + return None; + } + + // We might read past self.end up to the next group boundary, + // but this is fine because it only occurs on tables smaller + // than the group size where the trailing control bytes are all + // EMPTY. On larger tables self.end is guaranteed to be aligned + // to the group size (since tables are power-of-two sized). + self.current_group = Group::load_aligned(self.next_ctrl).match_full(); + self.data = self.data.next_n(Group::WIDTH); + self.next_ctrl = self.next_ctrl.add(Group::WIDTH); + } + } + } + + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + // We don't have an item count, so just guess based on the range size. + ( + 0, + Some(unsafe { offset_from(self.end, self.next_ctrl) + Group::WIDTH }), + ) + } +} + +impl FusedIterator for RawIterRange {} + +/// Iterator which returns a raw pointer to every full bucket in the table. +/// +/// For maximum flexibility this iterator is not bound by a lifetime, but you +/// must observe several rules when using it: +/// - You must not free the hash table while iterating (including via growing/shrinking). +/// - It is fine to erase a bucket that has been yielded by the iterator. +/// - Erasing a bucket that has not yet been yielded by the iterator may still +/// result in the iterator yielding that bucket (unless `reflect_remove` is called). +/// - It is unspecified whether an element inserted after the iterator was +/// created will be yielded by that iterator (unless `reflect_insert` is called). +/// - The order in which the iterator yields bucket is unspecified and may +/// change in the future. +pub struct RawIter { + pub(crate) iter: RawIterRange, + items: usize, +} + +impl RawIter { + /// Refresh the iterator so that it reflects a removal from the given bucket. + /// + /// For the iterator to remain valid, this method must be called once + /// for each removed bucket before `next` is called again. + /// + /// This method should be called _before_ the removal is made. It is not necessary to call this + /// method if you are removing an item that this iterator yielded in the past. + #[cfg(feature = "raw")] + pub fn reflect_remove(&mut self, b: &Bucket) { + self.reflect_toggle_full(b, false); + } + + /// Refresh the iterator so that it reflects an insertion into the given bucket. + /// + /// For the iterator to remain valid, this method must be called once + /// for each insert before `next` is called again. + /// + /// This method does not guarantee that an insertion of a bucket witha greater + /// index than the last one yielded will be reflected in the iterator. + /// + /// This method should be called _after_ the given insert is made. + #[cfg(feature = "raw")] + pub fn reflect_insert(&mut self, b: &Bucket) { + self.reflect_toggle_full(b, true); + } + + /// Refresh the iterator so that it reflects a change to the state of the given bucket. + #[cfg(feature = "raw")] + fn reflect_toggle_full(&mut self, b: &Bucket, is_insert: bool) { + unsafe { + if b.as_ptr() > self.iter.data.as_ptr() { + // The iterator has already passed the bucket's group. + // So the toggle isn't relevant to this iterator. + return; + } + + if self.iter.next_ctrl < self.iter.end + && b.as_ptr() <= self.iter.data.next_n(Group::WIDTH).as_ptr() + { + // The iterator has not yet reached the bucket's group. + // We don't need to reload anything, but we do need to adjust the item count. + + if cfg!(debug_assertions) { + // Double-check that the user isn't lying to us by checking the bucket state. + // To do that, we need to find its control byte. We know that self.iter.data is + // at self.iter.next_ctrl - Group::WIDTH, so we work from there: + let offset = offset_from(self.iter.data.as_ptr(), b.as_ptr()); + let ctrl = self.iter.next_ctrl.sub(Group::WIDTH).add(offset); + // This method should be called _before_ a removal, or _after_ an insert, + // so in both cases the ctrl byte should indicate that the bucket is full. + assert!(is_full(*ctrl)); + } + + if is_insert { + self.items += 1; + } else { + self.items -= 1; + } + + return; + } + + // The iterator is at the bucket group that the toggled bucket is in. + // We need to do two things: + // + // - Determine if the iterator already yielded the toggled bucket. + // If it did, we're done. + // - Otherwise, update the iterator cached group so that it won't + // yield a to-be-removed bucket, or _will_ yield a to-be-added bucket. + // We'll also need ot update the item count accordingly. + if let Some(index) = self.iter.current_group.lowest_set_bit() { + let next_bucket = self.iter.data.next_n(index); + if b.as_ptr() > next_bucket.as_ptr() { + // The toggled bucket is "before" the bucket the iterator would yield next. We + // therefore don't need to do anything --- the iterator has already passed the + // bucket in question. + // + // The item count must already be correct, since a removal or insert "prior" to + // the iterator's position wouldn't affect the item count. + } else { + // The removed bucket is an upcoming bucket. We need to make sure it does _not_ + // get yielded, and also that it's no longer included in the item count. + // + // NOTE: We can't just reload the group here, both since that might reflect + // inserts we've already passed, and because that might inadvertently unset the + // bits for _other_ removals. If we do that, we'd have to also decrement the + // item count for those other bits that we unset. But the presumably subsequent + // call to reflect for those buckets might _also_ decrement the item count. + // Instead, we _just_ flip the bit for the particular bucket the caller asked + // us to reflect. + let our_bit = offset_from(self.iter.data.as_ptr(), b.as_ptr()); + let was_full = self.iter.current_group.flip(our_bit); + debug_assert_ne!(was_full, is_insert); + + if is_insert { + self.items += 1; + } else { + self.items -= 1; + } + + if cfg!(debug_assertions) { + if b.as_ptr() == next_bucket.as_ptr() { + // The removed bucket should no longer be next + debug_assert_ne!(self.iter.current_group.lowest_set_bit(), Some(index)); + } else { + // We should not have changed what bucket comes next. + debug_assert_eq!(self.iter.current_group.lowest_set_bit(), Some(index)); + } + } + } + } else { + // We must have already iterated past the removed item. + } + } + } +} + +impl Clone for RawIter { + #[cfg_attr(feature = "inline-more", inline)] + fn clone(&self) -> Self { + Self { + iter: self.iter.clone(), + items: self.items, + } + } +} + +impl Iterator for RawIter { + type Item = Bucket; + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option> { + if let Some(b) = self.iter.next() { + self.items -= 1; + Some(b) + } else { + // We don't check against items == 0 here to allow the + // compiler to optimize away the item count entirely if the + // iterator length is never queried. + debug_assert_eq!(self.items, 0); + None + } + } + + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + (self.items, Some(self.items)) + } +} + +impl ExactSizeIterator for RawIter {} +impl FusedIterator for RawIter {} + +/// Iterator which consumes a table and returns elements. +pub struct RawIntoIter { + iter: RawIter, + alloc: Option<(NonNull, Layout)>, + marker: PhantomData, +} + +impl RawIntoIter { + #[cfg_attr(feature = "inline-more", inline)] + pub fn iter(&self) -> RawIter { + self.iter.clone() + } +} + +unsafe impl Send for RawIntoIter where T: Send {} +unsafe impl Sync for RawIntoIter where T: Sync {} + +#[cfg(feature = "nightly")] +unsafe impl<#[may_dangle] T> Drop for RawIntoIter { + #[cfg_attr(feature = "inline-more", inline)] + fn drop(&mut self) { + unsafe { + // Drop all remaining elements + if mem::needs_drop::() && self.iter.len() != 0 { + while let Some(item) = self.iter.next() { + item.drop(); + } + } + + // Free the table + if let Some((ptr, layout)) = self.alloc { + dealloc(ptr.as_ptr(), layout); + } + } + } +} +#[cfg(not(feature = "nightly"))] +impl Drop for RawIntoIter { + #[cfg_attr(feature = "inline-more", inline)] + fn drop(&mut self) { + unsafe { + // Drop all remaining elements + if mem::needs_drop::() && self.iter.len() != 0 { + while let Some(item) = self.iter.next() { + item.drop(); + } + } + + // Free the table + if let Some((ptr, layout)) = self.alloc { + dealloc(ptr.as_ptr(), layout); + } + } + } +} + +impl Iterator for RawIntoIter { + type Item = T; + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option { + unsafe { Some(self.iter.next()?.read()) } + } + + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } +} + +impl ExactSizeIterator for RawIntoIter {} +impl FusedIterator for RawIntoIter {} + +/// Iterator which consumes elements without freeing the table storage. +pub struct RawDrain<'a, T> { + iter: RawIter, + + // The table is moved into the iterator for the duration of the drain. This + // ensures that an empty table is left if the drain iterator is leaked + // without dropping. + table: ManuallyDrop>, + orig_table: NonNull>, + + // We don't use a &'a mut RawTable because we want RawDrain to be + // covariant over T. + marker: PhantomData<&'a RawTable>, +} + +impl RawDrain<'_, T> { + #[cfg_attr(feature = "inline-more", inline)] + pub fn iter(&self) -> RawIter { + self.iter.clone() + } +} + +unsafe impl Send for RawDrain<'_, T> where T: Send {} +unsafe impl Sync for RawDrain<'_, T> where T: Sync {} + +impl Drop for RawDrain<'_, T> { + #[cfg_attr(feature = "inline-more", inline)] + fn drop(&mut self) { + unsafe { + // Drop all remaining elements. Note that this may panic. + if mem::needs_drop::() && self.iter.len() != 0 { + while let Some(item) = self.iter.next() { + item.drop(); + } + } + + // Reset the contents of the table now that all elements have been + // dropped. + self.table.clear_no_drop(); + + // Move the now empty table back to its original location. + self.orig_table + .as_ptr() + .copy_from_nonoverlapping(&*self.table, 1); + } + } +} + +impl Iterator for RawDrain<'_, T> { + type Item = T; + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option { + unsafe { + let item = self.iter.next()?; + Some(item.read()) + } + } + + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } +} + +impl ExactSizeIterator for RawDrain<'_, T> {} +impl FusedIterator for RawDrain<'_, T> {} + +/// Iterator over occupied buckets that could match a given hash. +/// +/// In rare cases, the iterator may return a bucket with a different hash. +pub struct RawIterHash<'a, T> { + table: &'a RawTable, + + // The top 7 bits of the hash. + h2_hash: u8, + + // The sequence of groups to probe in the search. + probe_seq: ProbeSeq, + + // The current group and its position. + pos: usize, + group: Group, + + // The elements within the group with a matching h2-hash. + bitmask: BitMaskIter, +} + +impl<'a, T> RawIterHash<'a, T> { + fn new(table: &'a RawTable, hash: u64) -> Self { + unsafe { + let h2_hash = h2(hash); + let mut probe_seq = table.probe_seq(hash); + let pos = probe_seq.next().unwrap(); + let group = Group::load(table.ctrl(pos)); + let bitmask = group.match_byte(h2_hash).into_iter(); + + RawIterHash { + table, + h2_hash, + probe_seq, + pos, + group, + bitmask, + } + } + } +} + +impl<'a, T> Iterator for RawIterHash<'a, T> { + type Item = Bucket; + + fn next(&mut self) -> Option> { + unsafe { + loop { + if let Some(bit) = self.bitmask.next() { + let index = (self.pos + bit) & self.table.bucket_mask; + let bucket = self.table.bucket(index); + return Some(bucket); + } + if likely(self.group.match_empty().any_bit_set()) { + return None; + } + self.pos = self.probe_seq.next().unwrap(); + self.group = Group::load(self.table.ctrl(self.pos)); + self.bitmask = self.group.match_byte(self.h2_hash).into_iter(); + } + } + } +} diff --git a/vendor/hashbrown-0.9.1/src/raw/sse2.rs b/vendor/hashbrown-0.9.1/src/raw/sse2.rs new file mode 100644 index 0000000000..a27bc0910f --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/raw/sse2.rs @@ -0,0 +1,144 @@ +use super::bitmask::BitMask; +use super::EMPTY; +use core::mem; + +#[cfg(target_arch = "x86")] +use core::arch::x86; +#[cfg(target_arch = "x86_64")] +use core::arch::x86_64 as x86; + +pub type BitMaskWord = u16; +pub const BITMASK_STRIDE: usize = 1; +pub const BITMASK_MASK: BitMaskWord = 0xffff; + +/// Abstraction over a group of control bytes which can be scanned in +/// parallel. +/// +/// This implementation uses a 128-bit SSE value. +#[derive(Copy, Clone)] +pub struct Group(x86::__m128i); + +// FIXME: https://github.com/rust-lang/rust-clippy/issues/3859 +#[allow(clippy::use_self)] +impl Group { + /// Number of bytes in the group. + pub const WIDTH: usize = mem::size_of::(); + + /// Returns a full group of empty bytes, suitable for use as the initial + /// value for an empty hash table. + /// + /// This is guaranteed to be aligned to the group size. + pub const fn static_empty() -> &'static [u8; Group::WIDTH] { + #[repr(C)] + struct AlignedBytes { + _align: [Group; 0], + bytes: [u8; Group::WIDTH], + }; + const ALIGNED_BYTES: AlignedBytes = AlignedBytes { + _align: [], + bytes: [EMPTY; Group::WIDTH], + }; + &ALIGNED_BYTES.bytes + } + + /// Loads a group of bytes starting at the given address. + #[inline] + #[allow(clippy::cast_ptr_alignment)] // unaligned load + pub unsafe fn load(ptr: *const u8) -> Self { + Group(x86::_mm_loadu_si128(ptr as *const _)) + } + + /// Loads a group of bytes starting at the given address, which must be + /// aligned to `mem::align_of::()`. + #[inline] + #[allow(clippy::cast_ptr_alignment)] + pub unsafe fn load_aligned(ptr: *const u8) -> Self { + // FIXME: use align_offset once it stabilizes + debug_assert_eq!(ptr as usize & (mem::align_of::() - 1), 0); + Group(x86::_mm_load_si128(ptr as *const _)) + } + + /// Stores the group of bytes to the given address, which must be + /// aligned to `mem::align_of::()`. + #[inline] + #[allow(clippy::cast_ptr_alignment)] + pub unsafe fn store_aligned(self, ptr: *mut u8) { + // FIXME: use align_offset once it stabilizes + debug_assert_eq!(ptr as usize & (mem::align_of::() - 1), 0); + x86::_mm_store_si128(ptr as *mut _, self.0); + } + + /// Returns a `BitMask` indicating all bytes in the group which have + /// the given value. + #[inline] + pub fn match_byte(self, byte: u8) -> BitMask { + #[allow( + clippy::cast_possible_wrap, // byte: u8 as i8 + // byte: i32 as u16 + // note: _mm_movemask_epi8 returns a 16-bit mask in a i32, the + // upper 16-bits of the i32 are zeroed: + clippy::cast_sign_loss, + clippy::cast_possible_truncation + )] + unsafe { + let cmp = x86::_mm_cmpeq_epi8(self.0, x86::_mm_set1_epi8(byte as i8)); + BitMask(x86::_mm_movemask_epi8(cmp) as u16) + } + } + + /// Returns a `BitMask` indicating all bytes in the group which are + /// `EMPTY`. + #[inline] + pub fn match_empty(self) -> BitMask { + self.match_byte(EMPTY) + } + + /// Returns a `BitMask` indicating all bytes in the group which are + /// `EMPTY` or `DELETED`. + #[inline] + pub fn match_empty_or_deleted(self) -> BitMask { + #[allow( + // byte: i32 as u16 + // note: _mm_movemask_epi8 returns a 16-bit mask in a i32, the + // upper 16-bits of the i32 are zeroed: + clippy::cast_sign_loss, + clippy::cast_possible_truncation + )] + unsafe { + // A byte is EMPTY or DELETED iff the high bit is set + BitMask(x86::_mm_movemask_epi8(self.0) as u16) + } + } + + /// Returns a `BitMask` indicating all bytes in the group which are full. + #[inline] + pub fn match_full(&self) -> BitMask { + self.match_empty_or_deleted().invert() + } + + /// Performs the following transformation on all bytes in the group: + /// - `EMPTY => EMPTY` + /// - `DELETED => EMPTY` + /// - `FULL => DELETED` + #[inline] + pub fn convert_special_to_empty_and_full_to_deleted(self) -> Self { + // Map high_bit = 1 (EMPTY or DELETED) to 1111_1111 + // and high_bit = 0 (FULL) to 1000_0000 + // + // Here's this logic expanded to concrete values: + // let special = 0 > byte = 1111_1111 (true) or 0000_0000 (false) + // 1111_1111 | 1000_0000 = 1111_1111 + // 0000_0000 | 1000_0000 = 1000_0000 + #[allow( + clippy::cast_possible_wrap, // byte: 0x80_u8 as i8 + )] + unsafe { + let zero = x86::_mm_setzero_si128(); + let special = x86::_mm_cmpgt_epi8(zero, self.0); + Group(x86::_mm_or_si128( + special, + x86::_mm_set1_epi8(0x80_u8 as i8), + )) + } + } +} diff --git a/vendor/hashbrown-0.9.1/src/rustc_entry.rs b/vendor/hashbrown-0.9.1/src/rustc_entry.rs new file mode 100644 index 0000000000..b6ea7bc5c0 --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/rustc_entry.rs @@ -0,0 +1,618 @@ +use self::RustcEntry::*; +use crate::map::{make_hash, Drain, HashMap, IntoIter, Iter, IterMut}; +use crate::raw::{Bucket, RawTable}; +use core::fmt::{self, Debug}; +use core::hash::{BuildHasher, Hash}; +use core::mem; + +impl HashMap +where + K: Eq + Hash, + S: BuildHasher, +{ + /// Gets the given key's corresponding entry in the map for in-place manipulation. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut letters = HashMap::new(); + /// + /// for ch in "a short treatise on fungi".chars() { + /// let counter = letters.rustc_entry(ch).or_insert(0); + /// *counter += 1; + /// } + /// + /// assert_eq!(letters[&'s'], 2); + /// assert_eq!(letters[&'t'], 3); + /// assert_eq!(letters[&'u'], 1); + /// assert_eq!(letters.get(&'y'), None); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn rustc_entry(&mut self, key: K) -> RustcEntry<'_, K, V> { + let hash = make_hash(&self.hash_builder, &key); + if let Some(elem) = self.table.find(hash, |q| q.0.eq(&key)) { + RustcEntry::Occupied(RustcOccupiedEntry { + key: Some(key), + elem, + table: &mut self.table, + }) + } else { + // Ideally we would put this in VacantEntry::insert, but Entry is not + // generic over the BuildHasher and adding a generic parameter would be + // a breaking change. + self.reserve(1); + + RustcEntry::Vacant(RustcVacantEntry { + hash, + key, + table: &mut self.table, + }) + } + } +} + +/// A view into a single entry in a map, which may either be vacant or occupied. +/// +/// This `enum` is constructed from the [`entry`] method on [`HashMap`]. +/// +/// [`HashMap`]: struct.HashMap.html +/// [`entry`]: struct.HashMap.html#method.rustc_entry +pub enum RustcEntry<'a, K, V> { + /// An occupied entry. + Occupied(RustcOccupiedEntry<'a, K, V>), + + /// A vacant entry. + Vacant(RustcVacantEntry<'a, K, V>), +} + +impl Debug for RustcEntry<'_, 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(), + } + } +} + +/// A view into an occupied entry in a `HashMap`. +/// It is part of the [`RustcEntry`] enum. +/// +/// [`RustcEntry`]: enum.RustcEntry.html +pub struct RustcOccupiedEntry<'a, K, V> { + key: Option, + elem: Bucket<(K, V)>, + table: &'a mut RawTable<(K, V)>, +} + +unsafe impl Send for RustcOccupiedEntry<'_, K, V> +where + K: Send, + V: Send, +{ +} +unsafe impl Sync for RustcOccupiedEntry<'_, K, V> +where + K: Sync, + V: Sync, +{ +} + +impl Debug for RustcOccupiedEntry<'_, K, V> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("OccupiedEntry") + .field("key", self.key()) + .field("value", self.get()) + .finish() + } +} + +/// A view into a vacant entry in a `HashMap`. +/// It is part of the [`RustcEntry`] enum. +/// +/// [`RustcEntry`]: enum.RustcEntry.html +pub struct RustcVacantEntry<'a, K, V> { + hash: u64, + key: K, + table: &'a mut RawTable<(K, V)>, +} + +impl Debug for RustcVacantEntry<'_, K, V> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_tuple("VacantEntry").field(self.key()).finish() + } +} + +impl<'a, K, V> RustcEntry<'a, K, V> { + /// Sets the value of the entry, and returns a RustcOccupiedEntry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// let entry = map.entry("horseyland").insert(37); + /// + /// assert_eq!(entry.key(), &"horseyland"); + /// ``` + pub fn insert(self, value: V) -> RustcOccupiedEntry<'a, K, V> { + match self { + Vacant(entry) => entry.insert_entry(value), + Occupied(mut entry) => { + entry.insert(value); + entry + } + } + } + + /// Ensures a value is in the entry by inserting the default if empty, and returns + /// a mutable reference to the value in the entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// + /// map.rustc_entry("poneyland").or_insert(3); + /// assert_eq!(map["poneyland"], 3); + /// + /// *map.rustc_entry("poneyland").or_insert(10) *= 2; + /// assert_eq!(map["poneyland"], 6); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn or_insert(self, default: V) -> &'a mut V + where + K: Hash, + { + match self { + Occupied(entry) => entry.into_mut(), + Vacant(entry) => entry.insert(default), + } + } + + /// Ensures a value is in the entry by inserting the result of the default function if empty, + /// and returns a mutable reference to the value in the entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, String> = HashMap::new(); + /// let s = "hoho".to_string(); + /// + /// map.rustc_entry("poneyland").or_insert_with(|| s); + /// + /// assert_eq!(map["poneyland"], "hoho".to_string()); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn or_insert_with V>(self, default: F) -> &'a mut V + where + K: Hash, + { + match self { + Occupied(entry) => entry.into_mut(), + Vacant(entry) => entry.insert(default()), + } + } + + /// Returns a reference to this entry's key. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// assert_eq!(map.rustc_entry("poneyland").key(), &"poneyland"); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn key(&self) -> &K { + match *self { + Occupied(ref entry) => entry.key(), + Vacant(ref entry) => entry.key(), + } + } + + /// Provides in-place mutable access to an occupied entry before any + /// potential inserts into the map. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// + /// map.rustc_entry("poneyland") + /// .and_modify(|e| { *e += 1 }) + /// .or_insert(42); + /// assert_eq!(map["poneyland"], 42); + /// + /// map.rustc_entry("poneyland") + /// .and_modify(|e| { *e += 1 }) + /// .or_insert(42); + /// assert_eq!(map["poneyland"], 43); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn and_modify(self, f: F) -> Self + where + F: FnOnce(&mut V), + { + match self { + Occupied(mut entry) => { + f(entry.get_mut()); + Occupied(entry) + } + Vacant(entry) => Vacant(entry), + } + } +} + +impl<'a, K, V: Default> RustcEntry<'a, K, V> { + /// Ensures a value is in the entry by inserting the default value if empty, + /// and returns a mutable reference to the value in the entry. + /// + /// # Examples + /// + /// ``` + /// # fn main() { + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, Option> = HashMap::new(); + /// map.rustc_entry("poneyland").or_default(); + /// + /// assert_eq!(map["poneyland"], None); + /// # } + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn or_default(self) -> &'a mut V + where + K: Hash, + { + match self { + Occupied(entry) => entry.into_mut(), + Vacant(entry) => entry.insert(Default::default()), + } + } +} + +impl<'a, K, V> RustcOccupiedEntry<'a, K, V> { + /// Gets a reference to the key in the entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// map.rustc_entry("poneyland").or_insert(12); + /// assert_eq!(map.rustc_entry("poneyland").key(), &"poneyland"); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn key(&self) -> &K { + unsafe { &self.elem.as_ref().0 } + } + + /// Take the ownership of the key and value from the map. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::RustcEntry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// map.rustc_entry("poneyland").or_insert(12); + /// + /// if let RustcEntry::Occupied(o) = map.rustc_entry("poneyland") { + /// // We delete the entry from the map. + /// o.remove_entry(); + /// } + /// + /// assert_eq!(map.contains_key("poneyland"), false); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn remove_entry(self) -> (K, V) { + unsafe { self.table.remove(self.elem) } + } + + /// Gets a reference to the value in the entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::RustcEntry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// map.rustc_entry("poneyland").or_insert(12); + /// + /// if let RustcEntry::Occupied(o) = map.rustc_entry("poneyland") { + /// assert_eq!(o.get(), &12); + /// } + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn get(&self) -> &V { + unsafe { &self.elem.as_ref().1 } + } + + /// Gets a mutable reference to the value in the entry. + /// + /// If you need a reference to the `RustcOccupiedEntry` which may outlive the + /// destruction of the `RustcEntry` value, see [`into_mut`]. + /// + /// [`into_mut`]: #method.into_mut + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::RustcEntry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// map.rustc_entry("poneyland").or_insert(12); + /// + /// assert_eq!(map["poneyland"], 12); + /// if let RustcEntry::Occupied(mut o) = map.rustc_entry("poneyland") { + /// *o.get_mut() += 10; + /// assert_eq!(*o.get(), 22); + /// + /// // We can use the same RustcEntry multiple times. + /// *o.get_mut() += 2; + /// } + /// + /// assert_eq!(map["poneyland"], 24); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn get_mut(&mut self) -> &mut V { + unsafe { &mut self.elem.as_mut().1 } + } + + /// Converts the RustcOccupiedEntry into a mutable reference to the value in the entry + /// with a lifetime bound to the map itself. + /// + /// If you need multiple references to the `RustcOccupiedEntry`, see [`get_mut`]. + /// + /// [`get_mut`]: #method.get_mut + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::RustcEntry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// map.rustc_entry("poneyland").or_insert(12); + /// + /// assert_eq!(map["poneyland"], 12); + /// if let RustcEntry::Occupied(o) = map.rustc_entry("poneyland") { + /// *o.into_mut() += 10; + /// } + /// + /// assert_eq!(map["poneyland"], 22); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn into_mut(self) -> &'a mut V { + unsafe { &mut self.elem.as_mut().1 } + } + + /// Sets the value of the entry, and returns the entry's old value. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::RustcEntry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// map.rustc_entry("poneyland").or_insert(12); + /// + /// if let RustcEntry::Occupied(mut o) = map.rustc_entry("poneyland") { + /// assert_eq!(o.insert(15), 12); + /// } + /// + /// assert_eq!(map["poneyland"], 15); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn insert(&mut self, mut value: V) -> V { + let old_value = self.get_mut(); + mem::swap(&mut value, old_value); + value + } + + /// Takes the value out of the entry, and returns it. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::RustcEntry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// map.rustc_entry("poneyland").or_insert(12); + /// + /// if let RustcEntry::Occupied(o) = map.rustc_entry("poneyland") { + /// assert_eq!(o.remove(), 12); + /// } + /// + /// assert_eq!(map.contains_key("poneyland"), false); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn remove(self) -> V { + self.remove_entry().1 + } + + /// Replaces the entry, returning the old key and value. The new key in the hash map will be + /// the key used to create this entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::hash_map::{RustcEntry, HashMap}; + /// use std::rc::Rc; + /// + /// let mut map: HashMap, u32> = HashMap::new(); + /// map.insert(Rc::new("Stringthing".to_string()), 15); + /// + /// let my_key = Rc::new("Stringthing".to_string()); + /// + /// if let RustcEntry::Occupied(entry) = map.rustc_entry(my_key) { + /// // Also replace the key with a handle to our other key. + /// let (old_key, old_value): (Rc, u32) = entry.replace_entry(16); + /// } + /// + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn replace_entry(self, value: V) -> (K, V) { + let entry = unsafe { self.elem.as_mut() }; + + let old_key = mem::replace(&mut entry.0, self.key.unwrap()); + let old_value = mem::replace(&mut entry.1, value); + + (old_key, old_value) + } + + /// Replaces the key in the hash map with the key used to create this entry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::hash_map::{RustcEntry, HashMap}; + /// use std::rc::Rc; + /// + /// let mut map: HashMap, u32> = HashMap::new(); + /// let mut known_strings: Vec> = Vec::new(); + /// + /// // Initialise known strings, run program, etc. + /// + /// reclaim_memory(&mut map, &known_strings); + /// + /// fn reclaim_memory(map: &mut HashMap, u32>, known_strings: &[Rc] ) { + /// for s in known_strings { + /// if let RustcEntry::Occupied(entry) = map.rustc_entry(s.clone()) { + /// // Replaces the entry's key with our version of it in `known_strings`. + /// entry.replace_key(); + /// } + /// } + /// } + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn replace_key(self) -> K { + let entry = unsafe { self.elem.as_mut() }; + mem::replace(&mut entry.0, self.key.unwrap()) + } +} + +impl<'a, K, V> RustcVacantEntry<'a, K, V> { + /// Gets a reference to the key that would be used when inserting a value + /// through the `RustcVacantEntry`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// assert_eq!(map.rustc_entry("poneyland").key(), &"poneyland"); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn key(&self) -> &K { + &self.key + } + + /// Take ownership of the key. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::RustcEntry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// + /// if let RustcEntry::Vacant(v) = map.rustc_entry("poneyland") { + /// v.into_key(); + /// } + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn into_key(self) -> K { + self.key + } + + /// Sets the value of the entry with the RustcVacantEntry's key, + /// and returns a mutable reference to it. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::RustcEntry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// + /// if let RustcEntry::Vacant(o) = map.rustc_entry("poneyland") { + /// o.insert(37); + /// } + /// assert_eq!(map["poneyland"], 37); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn insert(self, value: V) -> &'a mut V { + let bucket = self.table.insert_no_grow(self.hash, (self.key, value)); + unsafe { &mut bucket.as_mut().1 } + } + + /// Sets the value of the entry with the RustcVacantEntry's key, + /// and returns a RustcOccupiedEntry. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::RustcEntry; + /// + /// let mut map: HashMap<&str, u32> = HashMap::new(); + /// + /// if let RustcEntry::Vacant(v) = map.rustc_entry("poneyland") { + /// let o = v.insert_entry(37); + /// assert_eq!(o.get(), &37); + /// } + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn insert_entry(self, value: V) -> RustcOccupiedEntry<'a, K, V> { + let bucket = self.table.insert_no_grow(self.hash, (self.key, value)); + RustcOccupiedEntry { + key: None, + elem: bucket, + table: self.table, + } + } +} + +impl IterMut<'_, K, V> { + /// Returns a iterator of references over the remaining items. + #[cfg_attr(feature = "inline-more", inline)] + pub fn rustc_iter(&self) -> Iter<'_, K, V> { + self.iter() + } +} + +impl IntoIter { + /// Returns a iterator of references over the remaining items. + #[cfg_attr(feature = "inline-more", inline)] + pub fn rustc_iter(&self) -> Iter<'_, K, V> { + self.iter() + } +} + +impl Drain<'_, K, V> { + /// Returns a iterator of references over the remaining items. + #[cfg_attr(feature = "inline-more", inline)] + pub fn rustc_iter(&self) -> Iter<'_, K, V> { + self.iter() + } +} diff --git a/vendor/hashbrown-0.9.1/src/scopeguard.rs b/vendor/hashbrown-0.9.1/src/scopeguard.rs new file mode 100644 index 0000000000..32c9694372 --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/scopeguard.rs @@ -0,0 +1,49 @@ +// Extracted from the scopeguard crate +use core::ops::{Deref, DerefMut}; + +pub struct ScopeGuard +where + F: FnMut(&mut T), +{ + dropfn: F, + value: T, +} + +#[cfg_attr(feature = "inline-more", inline)] +pub fn guard(value: T, dropfn: F) -> ScopeGuard +where + F: FnMut(&mut T), +{ + ScopeGuard { dropfn, value } +} + +impl Deref for ScopeGuard +where + F: FnMut(&mut T), +{ + type Target = T; + #[cfg_attr(feature = "inline-more", inline)] + fn deref(&self) -> &T { + &self.value + } +} + +impl DerefMut for ScopeGuard +where + F: FnMut(&mut T), +{ + #[cfg_attr(feature = "inline-more", inline)] + fn deref_mut(&mut self) -> &mut T { + &mut self.value + } +} + +impl Drop for ScopeGuard +where + F: FnMut(&mut T), +{ + #[cfg_attr(feature = "inline-more", inline)] + fn drop(&mut self) { + (self.dropfn)(&mut self.value) + } +} diff --git a/vendor/hashbrown-0.9.1/src/set.rs b/vendor/hashbrown-0.9.1/src/set.rs new file mode 100644 index 0000000000..b8460fd3b6 --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/set.rs @@ -0,0 +1,2119 @@ +use crate::TryReserveError; +use alloc::borrow::ToOwned; +use core::borrow::Borrow; +use core::fmt; +use core::hash::{BuildHasher, Hash}; +use core::iter::{Chain, FromIterator, FusedIterator}; +use core::mem; +use core::ops::{BitAnd, BitOr, BitXor, Sub}; + +use super::map::{self, ConsumeAllOnDrop, DefaultHashBuilder, DrainFilterInner, HashMap, Keys}; + +// Future Optimization (FIXME!) +// ============================= +// +// Iteration over zero sized values is a noop. There is no need +// for `bucket.val` in the case of HashSet. I suppose we would need HKT +// to get rid of it properly. + +/// A hash set implemented as a `HashMap` where the value is `()`. +/// +/// As with the [`HashMap`] type, a `HashSet` requires that the elements +/// implement the [`Eq`] and [`Hash`] traits. This can frequently be achieved by +/// using `#[derive(PartialEq, Eq, Hash)]`. If you implement these yourself, +/// it is important that the following property holds: +/// +/// ```text +/// k1 == k2 -> hash(k1) == hash(k2) +/// ``` +/// +/// In other words, if two keys are equal, their hashes must be equal. +/// +/// +/// It is a logic error for an item to be modified in such a way that the +/// item's hash, as determined by the [`Hash`] trait, or its equality, as +/// determined by the [`Eq`] trait, changes while it is in the set. This is +/// normally only possible through [`Cell`], [`RefCell`], global state, I/O, or +/// unsafe code. +/// +/// It is also a logic error for the [`Hash`] implementation of a key to panic. +/// This is generally only possible if the trait is implemented manually. If a +/// panic does occur then the contents of the `HashSet` may become corrupted and +/// some items may be dropped from the table. +/// +/// # Examples +/// +/// ``` +/// use hashbrown::HashSet; +/// // Type inference lets us omit an explicit type signature (which +/// // would be `HashSet` in this example). +/// let mut books = HashSet::new(); +/// +/// // Add some books. +/// books.insert("A Dance With Dragons".to_string()); +/// books.insert("To Kill a Mockingbird".to_string()); +/// books.insert("The Odyssey".to_string()); +/// books.insert("The Great Gatsby".to_string()); +/// +/// // Check for a specific one. +/// if !books.contains("The Winds of Winter") { +/// println!("We have {} books, but The Winds of Winter ain't one.", +/// books.len()); +/// } +/// +/// // Remove a book. +/// books.remove("The Odyssey"); +/// +/// // Iterate over everything. +/// for book in &books { +/// println!("{}", book); +/// } +/// ``` +/// +/// The easiest way to use `HashSet` with a custom type is to derive +/// [`Eq`] and [`Hash`]. We must also derive [`PartialEq`], this will in the +/// future be implied by [`Eq`]. +/// +/// ``` +/// use hashbrown::HashSet; +/// #[derive(Hash, Eq, PartialEq, Debug)] +/// struct Viking { +/// name: String, +/// power: usize, +/// } +/// +/// let mut vikings = HashSet::new(); +/// +/// vikings.insert(Viking { name: "Einar".to_string(), power: 9 }); +/// vikings.insert(Viking { name: "Einar".to_string(), power: 9 }); +/// vikings.insert(Viking { name: "Olaf".to_string(), power: 4 }); +/// vikings.insert(Viking { name: "Harald".to_string(), power: 8 }); +/// +/// // Use derived implementation to print the vikings. +/// for x in &vikings { +/// println!("{:?}", x); +/// } +/// ``` +/// +/// A `HashSet` with fixed list of elements can be initialized from an array: +/// +/// ``` +/// use hashbrown::HashSet; +/// +/// let viking_names: HashSet<&'static str> = +/// [ "Einar", "Olaf", "Harald" ].iter().cloned().collect(); +/// // use the values stored in the set +/// ``` +/// +/// [`Cell`]: https://doc.rust-lang.org/std/cell/struct.Cell.html +/// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html +/// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html +/// [`HashMap`]: struct.HashMap.html +/// [`PartialEq`]: https://doc.rust-lang.org/std/cmp/trait.PartialEq.html +/// [`RefCell`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html +pub struct HashSet { + pub(crate) map: HashMap, +} + +impl Clone for HashSet { + fn clone(&self) -> Self { + HashSet { + map: self.map.clone(), + } + } + + fn clone_from(&mut self, source: &Self) { + self.map.clone_from(&source.map); + } +} + +#[cfg(feature = "ahash")] +impl HashSet { + /// Creates an empty `HashSet`. + /// + /// The hash set is initially created with a capacity of 0, so it will not allocate until it + /// is first inserted into. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// let set: HashSet = HashSet::new(); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn new() -> Self { + Self { + map: HashMap::new(), + } + } + + /// Creates an empty `HashSet` with the specified capacity. + /// + /// The hash set will be able to hold at least `capacity` elements without + /// reallocating. If `capacity` is 0, the hash set will not allocate. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// let set: HashSet = HashSet::with_capacity(10); + /// assert!(set.capacity() >= 10); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn with_capacity(capacity: usize) -> Self { + Self { + map: HashMap::with_capacity(capacity), + } + } +} + +impl HashSet { + /// Creates a new empty hash set which will use the given hasher to hash + /// keys. + /// + /// The hash set is also created with the default initial capacity. + /// + /// Warning: `hasher` is normally randomly generated, and + /// is designed to allow `HashSet`s to be resistant to attacks that + /// cause many collisions and very poor performance. Setting it + /// manually using this function can expose a DoS attack vector. + /// + /// The `hash_builder` passed should implement the [`BuildHasher`] trait for + /// the HashMap to be useful, see its documentation for details. + /// + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// use hashbrown::hash_map::DefaultHashBuilder; + /// + /// let s = DefaultHashBuilder::default(); + /// let mut set = HashSet::with_hasher(s); + /// set.insert(2); + /// ``` + /// + /// [`BuildHasher`]: ../../std/hash/trait.BuildHasher.html + #[cfg_attr(feature = "inline-more", inline)] + pub const fn with_hasher(hasher: S) -> Self { + Self { + map: HashMap::with_hasher(hasher), + } + } + + /// Creates an empty `HashSet` with the specified capacity, using + /// `hasher` to hash the keys. + /// + /// The hash set will be able to hold at least `capacity` elements without + /// reallocating. If `capacity` is 0, the hash set will not allocate. + /// + /// Warning: `hasher` is normally randomly generated, and + /// is designed to allow `HashSet`s to be resistant to attacks that + /// cause many collisions and very poor performance. Setting it + /// manually using this function can expose a DoS attack vector. + /// + /// The `hash_builder` passed should implement the [`BuildHasher`] trait for + /// the HashMap to be useful, see its documentation for details. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// use hashbrown::hash_map::DefaultHashBuilder; + /// + /// let s = DefaultHashBuilder::default(); + /// let mut set = HashSet::with_capacity_and_hasher(10, s); + /// set.insert(1); + /// ``` + /// + /// [`BuildHasher`]: ../../std/hash/trait.BuildHasher.html + #[cfg_attr(feature = "inline-more", inline)] + pub fn with_capacity_and_hasher(capacity: usize, hasher: S) -> Self { + Self { + map: HashMap::with_capacity_and_hasher(capacity, hasher), + } + } + + /// Returns the number of elements the set can hold without reallocating. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// let set: HashSet = HashSet::with_capacity(100); + /// assert!(set.capacity() >= 100); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn capacity(&self) -> usize { + self.map.capacity() + } + + /// An iterator visiting all elements in arbitrary order. + /// The iterator element type is `&'a T`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// let mut set = HashSet::new(); + /// set.insert("a"); + /// set.insert("b"); + /// + /// // Will print in an arbitrary order. + /// for x in set.iter() { + /// println!("{}", x); + /// } + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn iter(&self) -> Iter<'_, T> { + Iter { + iter: self.map.keys(), + } + } + + /// Returns the number of elements in the set. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let mut v = HashSet::new(); + /// assert_eq!(v.len(), 0); + /// v.insert(1); + /// assert_eq!(v.len(), 1); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn len(&self) -> usize { + self.map.len() + } + + /// Returns `true` if the set contains no elements. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let mut v = HashSet::new(); + /// assert!(v.is_empty()); + /// v.insert(1); + /// assert!(!v.is_empty()); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn is_empty(&self) -> bool { + self.map.is_empty() + } + + /// Clears the set, returning all elements in an iterator. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let mut set: HashSet<_> = [1, 2, 3].iter().cloned().collect(); + /// assert!(!set.is_empty()); + /// + /// // print 1, 2, 3 in an arbitrary order + /// for i in set.drain() { + /// println!("{}", i); + /// } + /// + /// assert!(set.is_empty()); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn drain(&mut self) -> Drain<'_, T> { + Drain { + iter: self.map.drain(), + } + } + + /// Retains only the elements specified by the predicate. + /// + /// In other words, remove all elements `e` such that `f(&e)` returns `false`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let xs = [1,2,3,4,5,6]; + /// let mut set: HashSet = xs.iter().cloned().collect(); + /// set.retain(|&k| k % 2 == 0); + /// assert_eq!(set.len(), 3); + /// ``` + pub fn retain(&mut self, mut f: F) + where + F: FnMut(&T) -> bool, + { + self.map.retain(|k, _| f(k)); + } + + /// Drains elements which are true under the given predicate, + /// and returns an iterator over the removed items. + /// + /// In other words, move all elements `e` such that `f(&e)` returns `true` out + /// into another iterator. + /// + /// When the returned DrainedFilter is dropped, any remaining elements that satisfy + /// the predicate are dropped from the set. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let mut set: HashSet = (0..8).collect(); + /// let drained: HashSet = set.drain_filter(|v| v % 2 == 0).collect(); + /// + /// let mut evens = drained.into_iter().collect::>(); + /// let mut odds = set.into_iter().collect::>(); + /// evens.sort(); + /// odds.sort(); + /// + /// assert_eq!(evens, vec![0, 2, 4, 6]); + /// assert_eq!(odds, vec![1, 3, 5, 7]); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn drain_filter(&mut self, f: F) -> DrainFilter<'_, T, F> + where + F: FnMut(&T) -> bool, + { + DrainFilter { + f, + inner: DrainFilterInner { + iter: unsafe { self.map.table.iter() }, + table: &mut self.map.table, + }, + } + } + + /// Clears the set, removing all values. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let mut v = HashSet::new(); + /// v.insert(1); + /// v.clear(); + /// assert!(v.is_empty()); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn clear(&mut self) { + self.map.clear() + } + + /// Returns a reference to the set's [`BuildHasher`]. + /// + /// [`BuildHasher`]: https://doc.rust-lang.org/std/hash/trait.BuildHasher.html + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// use hashbrown::hash_map::DefaultHashBuilder; + /// + /// let hasher = DefaultHashBuilder::default(); + /// let set: HashSet = HashSet::with_hasher(hasher); + /// let hasher: &DefaultHashBuilder = set.hasher(); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn hasher(&self) -> &S { + self.map.hasher() + } +} + +impl HashSet +where + T: Eq + Hash, + S: BuildHasher, +{ + /// Reserves capacity for at least `additional` more elements to be inserted + /// in the `HashSet`. The collection may reserve more space to avoid + /// frequent reallocations. + /// + /// # Panics + /// + /// Panics if the new allocation size overflows `usize`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// let mut set: HashSet = HashSet::new(); + /// set.reserve(10); + /// assert!(set.capacity() >= 10); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn reserve(&mut self, additional: usize) { + self.map.reserve(additional) + } + + /// Tries to reserve capacity for at least `additional` more elements to be inserted + /// in the given `HashSet`. The collection may reserve more space to avoid + /// frequent reallocations. + /// + /// # Errors + /// + /// If the capacity overflows, or the allocator reports a failure, then an error + /// is returned. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// let mut set: HashSet = HashSet::new(); + /// set.try_reserve(10).expect("why is the test harness OOMing on 10 bytes?"); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> { + self.map.try_reserve(additional) + } + + /// Shrinks the capacity of the set as much as possible. It will drop + /// down as much as possible while maintaining the internal rules + /// and possibly leaving some space in accordance with the resize policy. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let mut set = HashSet::with_capacity(100); + /// set.insert(1); + /// set.insert(2); + /// assert!(set.capacity() >= 100); + /// set.shrink_to_fit(); + /// assert!(set.capacity() >= 2); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn shrink_to_fit(&mut self) { + self.map.shrink_to_fit() + } + + /// Shrinks the capacity of the set with a lower limit. It will drop + /// down no lower than the supplied limit while maintaining the internal rules + /// and possibly leaving some space in accordance with the resize policy. + /// + /// Panics if the current capacity is smaller than the supplied + /// minimum capacity. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let mut set = HashSet::with_capacity(100); + /// set.insert(1); + /// set.insert(2); + /// assert!(set.capacity() >= 100); + /// set.shrink_to(10); + /// assert!(set.capacity() >= 10); + /// set.shrink_to(0); + /// assert!(set.capacity() >= 2); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn shrink_to(&mut self, min_capacity: usize) { + self.map.shrink_to(min_capacity) + } + + /// Visits the values representing the difference, + /// i.e., the values that are in `self` but not in `other`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// let a: HashSet<_> = [1, 2, 3].iter().cloned().collect(); + /// let b: HashSet<_> = [4, 2, 3, 4].iter().cloned().collect(); + /// + /// // Can be seen as `a - b`. + /// for x in a.difference(&b) { + /// println!("{}", x); // Print 1 + /// } + /// + /// let diff: HashSet<_> = a.difference(&b).collect(); + /// assert_eq!(diff, [1].iter().collect()); + /// + /// // Note that difference is not symmetric, + /// // and `b - a` means something else: + /// let diff: HashSet<_> = b.difference(&a).collect(); + /// assert_eq!(diff, [4].iter().collect()); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn difference<'a>(&'a self, other: &'a Self) -> Difference<'a, T, S> { + Difference { + iter: self.iter(), + other, + } + } + + /// Visits the values representing the symmetric difference, + /// i.e., the values that are in `self` or in `other` but not in both. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// let a: HashSet<_> = [1, 2, 3].iter().cloned().collect(); + /// let b: HashSet<_> = [4, 2, 3, 4].iter().cloned().collect(); + /// + /// // Print 1, 4 in arbitrary order. + /// for x in a.symmetric_difference(&b) { + /// println!("{}", x); + /// } + /// + /// let diff1: HashSet<_> = a.symmetric_difference(&b).collect(); + /// let diff2: HashSet<_> = b.symmetric_difference(&a).collect(); + /// + /// assert_eq!(diff1, diff2); + /// assert_eq!(diff1, [1, 4].iter().collect()); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn symmetric_difference<'a>(&'a self, other: &'a Self) -> SymmetricDifference<'a, T, S> { + SymmetricDifference { + iter: self.difference(other).chain(other.difference(self)), + } + } + + /// Visits the values representing the intersection, + /// i.e., the values that are both in `self` and `other`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// let a: HashSet<_> = [1, 2, 3].iter().cloned().collect(); + /// let b: HashSet<_> = [4, 2, 3, 4].iter().cloned().collect(); + /// + /// // Print 2, 3 in arbitrary order. + /// for x in a.intersection(&b) { + /// println!("{}", x); + /// } + /// + /// let intersection: HashSet<_> = a.intersection(&b).collect(); + /// assert_eq!(intersection, [2, 3].iter().collect()); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, T, S> { + let (smaller, larger) = if self.len() <= other.len() { + (self, other) + } else { + (other, self) + }; + Intersection { + iter: smaller.iter(), + other: larger, + } + } + + /// Visits the values representing the union, + /// i.e., all the values in `self` or `other`, without duplicates. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// let a: HashSet<_> = [1, 2, 3].iter().cloned().collect(); + /// let b: HashSet<_> = [4, 2, 3, 4].iter().cloned().collect(); + /// + /// // Print 1, 2, 3, 4 in arbitrary order. + /// for x in a.union(&b) { + /// println!("{}", x); + /// } + /// + /// let union: HashSet<_> = a.union(&b).collect(); + /// assert_eq!(union, [1, 2, 3, 4].iter().collect()); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, T, S> { + let (smaller, larger) = if self.len() >= other.len() { + (self, other) + } else { + (other, self) + }; + Union { + iter: larger.iter().chain(smaller.difference(larger)), + } + } + + /// Returns `true` if the set contains a value. + /// + /// The value may be any borrowed form of the set's value type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the value type. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let set: HashSet<_> = [1, 2, 3].iter().cloned().collect(); + /// assert_eq!(set.contains(&1), true); + /// assert_eq!(set.contains(&4), false); + /// ``` + /// + /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html + /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html + #[cfg_attr(feature = "inline-more", inline)] + pub fn contains(&self, value: &Q) -> bool + where + T: Borrow, + Q: Hash + Eq, + { + self.map.contains_key(value) + } + + /// Returns a reference to the value in the set, if any, that is equal to the given value. + /// + /// The value may be any borrowed form of the set's value type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the value type. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let set: HashSet<_> = [1, 2, 3].iter().cloned().collect(); + /// assert_eq!(set.get(&2), Some(&2)); + /// assert_eq!(set.get(&4), None); + /// ``` + /// + /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html + /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html + #[cfg_attr(feature = "inline-more", inline)] + pub fn get(&self, value: &Q) -> Option<&T> + where + T: Borrow, + Q: Hash + Eq, + { + // Avoid `Option::map` because it bloats LLVM IR. + match self.map.get_key_value(value) { + Some((k, _)) => Some(k), + None => None, + } + } + + /// Inserts the given `value` into the set if it is not present, then + /// returns a reference to the value in the set. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let mut set: HashSet<_> = [1, 2, 3].iter().cloned().collect(); + /// assert_eq!(set.len(), 3); + /// assert_eq!(set.get_or_insert(2), &2); + /// assert_eq!(set.get_or_insert(100), &100); + /// assert_eq!(set.len(), 4); // 100 was inserted + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn get_or_insert(&mut self, value: T) -> &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(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 + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let mut set: HashSet = ["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] + pub fn get_or_insert_owned(&mut self, value: &Q) -> &T + where + T: Borrow, + Q: Hash + Eq + ToOwned, + { + // 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. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let mut set: HashSet = ["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_with(pet, str::to_owned); + /// assert_eq!(value, pet); + /// } + /// assert_eq!(set.len(), 4); // a new "fish" was inserted + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn get_or_insert_with(&mut self, value: &Q, f: F) -> &T + where + T: Borrow, + 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`. + self.map + .raw_entry_mut() + .from_key(value) + .or_insert_with(|| (f(value), ())) + .0 + } + + /// Returns `true` if `self` has no elements in common with `other`. + /// This is equivalent to checking for an empty intersection. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let a: HashSet<_> = [1, 2, 3].iter().cloned().collect(); + /// let mut b = HashSet::new(); + /// + /// assert_eq!(a.is_disjoint(&b), true); + /// b.insert(4); + /// assert_eq!(a.is_disjoint(&b), true); + /// b.insert(1); + /// assert_eq!(a.is_disjoint(&b), false); + /// ``` + pub fn is_disjoint(&self, other: &Self) -> bool { + self.iter().all(|v| !other.contains(v)) + } + + /// Returns `true` if the set is a subset of another, + /// i.e., `other` contains at least all the values in `self`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let sup: HashSet<_> = [1, 2, 3].iter().cloned().collect(); + /// let mut set = HashSet::new(); + /// + /// assert_eq!(set.is_subset(&sup), true); + /// set.insert(2); + /// assert_eq!(set.is_subset(&sup), true); + /// set.insert(4); + /// assert_eq!(set.is_subset(&sup), false); + /// ``` + pub fn is_subset(&self, other: &Self) -> bool { + self.len() <= other.len() && self.iter().all(|v| other.contains(v)) + } + + /// Returns `true` if the set is a superset of another, + /// i.e., `self` contains at least all the values in `other`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let sub: HashSet<_> = [1, 2].iter().cloned().collect(); + /// let mut set = HashSet::new(); + /// + /// assert_eq!(set.is_superset(&sub), false); + /// + /// set.insert(0); + /// set.insert(1); + /// assert_eq!(set.is_superset(&sub), false); + /// + /// set.insert(2); + /// assert_eq!(set.is_superset(&sub), true); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn is_superset(&self, other: &Self) -> bool { + other.is_subset(self) + } + + /// Adds a value to the set. + /// + /// If the set did not have this value present, `true` is returned. + /// + /// If the set did have this value present, `false` is returned. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let mut set = HashSet::new(); + /// + /// assert_eq!(set.insert(2), true); + /// assert_eq!(set.insert(2), false); + /// assert_eq!(set.len(), 1); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn insert(&mut self, value: T) -> bool { + self.map.insert(value, ()).is_none() + } + + /// Adds a value to the set, replacing the existing value, if any, that is equal to the given + /// one. Returns the replaced value. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let mut set = HashSet::new(); + /// set.insert(Vec::::new()); + /// + /// assert_eq!(set.get(&[][..]).unwrap().capacity(), 0); + /// set.replace(Vec::with_capacity(10)); + /// assert_eq!(set.get(&[][..]).unwrap().capacity(), 10); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn replace(&mut self, value: T) -> Option { + match self.map.entry(value) { + map::Entry::Occupied(occupied) => Some(occupied.replace_key()), + map::Entry::Vacant(vacant) => { + vacant.insert(()); + None + } + } + } + + /// Removes a value from the set. Returns whether the value was + /// present in the set. + /// + /// The value may be any borrowed form of the set's value type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the value type. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let mut set = HashSet::new(); + /// + /// set.insert(2); + /// assert_eq!(set.remove(&2), true); + /// assert_eq!(set.remove(&2), false); + /// ``` + /// + /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html + /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html + #[cfg_attr(feature = "inline-more", inline)] + pub fn remove(&mut self, value: &Q) -> bool + where + T: Borrow, + Q: Hash + Eq, + { + self.map.remove(value).is_some() + } + + /// Removes and returns the value in the set, if any, that is equal to the given one. + /// + /// The value may be any borrowed form of the set's value type, but + /// [`Hash`] and [`Eq`] on the borrowed form *must* match those for + /// the value type. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let mut set: HashSet<_> = [1, 2, 3].iter().cloned().collect(); + /// assert_eq!(set.take(&2), Some(2)); + /// assert_eq!(set.take(&2), None); + /// ``` + /// + /// [`Eq`]: https://doc.rust-lang.org/std/cmp/trait.Eq.html + /// [`Hash`]: https://doc.rust-lang.org/std/hash/trait.Hash.html + #[cfg_attr(feature = "inline-more", inline)] + pub fn take(&mut self, value: &Q) -> Option + where + T: Borrow, + Q: Hash + Eq, + { + // Avoid `Option::map` because it bloats LLVM IR. + match self.map.remove_entry(value) { + Some((k, _)) => Some(k), + None => None, + } + } +} + +impl PartialEq for HashSet +where + T: Eq + Hash, + S: BuildHasher, +{ + fn eq(&self, other: &Self) -> bool { + if self.len() != other.len() { + return false; + } + + self.iter().all(|key| other.contains(key)) + } +} + +impl Eq for HashSet +where + T: Eq + Hash, + S: BuildHasher, +{ +} + +impl fmt::Debug for HashSet +where + T: Eq + Hash + fmt::Debug, + S: BuildHasher, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_set().entries(self.iter()).finish() + } +} + +impl FromIterator for HashSet +where + T: Eq + Hash, + S: BuildHasher + Default, +{ + #[cfg_attr(feature = "inline-more", inline)] + fn from_iter>(iter: I) -> Self { + let mut set = Self::with_hasher(Default::default()); + set.extend(iter); + set + } +} + +impl Extend for HashSet +where + T: Eq + Hash, + S: BuildHasher, +{ + #[cfg_attr(feature = "inline-more", inline)] + fn extend>(&mut self, iter: I) { + self.map.extend(iter.into_iter().map(|k| (k, ()))); + } + + #[inline] + #[cfg(feature = "nightly")] + fn extend_one(&mut self, k: T) { + self.map.insert(k, ()); + } + + #[inline] + #[cfg(feature = "nightly")] + fn extend_reserve(&mut self, additional: usize) { + Extend::<(T, ())>::extend_reserve(&mut self.map, additional); + } +} + +impl<'a, T, S> Extend<&'a T> for HashSet +where + T: 'a + Eq + Hash + Copy, + S: BuildHasher, +{ + #[cfg_attr(feature = "inline-more", inline)] + fn extend>(&mut self, iter: I) { + self.extend(iter.into_iter().cloned()); + } + + #[inline] + #[cfg(feature = "nightly")] + fn extend_one(&mut self, k: &'a T) { + self.map.insert(*k, ()); + } + + #[inline] + #[cfg(feature = "nightly")] + fn extend_reserve(&mut self, additional: usize) { + Extend::<(T, ())>::extend_reserve(&mut self.map, additional); + } +} + +impl Default for HashSet +where + S: Default, +{ + /// Creates an empty `HashSet` with the `Default` value for the hasher. + #[cfg_attr(feature = "inline-more", inline)] + fn default() -> Self { + Self { + map: HashMap::default(), + } + } +} + +impl BitOr<&HashSet> for &HashSet +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, +{ + type Output = HashSet; + + /// Returns the union of `self` and `rhs` as a new `HashSet`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let a: HashSet<_> = vec![1, 2, 3].into_iter().collect(); + /// let b: HashSet<_> = vec![3, 4, 5].into_iter().collect(); + /// + /// let set = &a | &b; + /// + /// let mut i = 0; + /// let expected = [1, 2, 3, 4, 5]; + /// for x in &set { + /// assert!(expected.contains(x)); + /// i += 1; + /// } + /// assert_eq!(i, expected.len()); + /// ``` + fn bitor(self, rhs: &HashSet) -> HashSet { + self.union(rhs).cloned().collect() + } +} + +impl BitAnd<&HashSet> for &HashSet +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, +{ + type Output = HashSet; + + /// Returns the intersection of `self` and `rhs` as a new `HashSet`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let a: HashSet<_> = vec![1, 2, 3].into_iter().collect(); + /// let b: HashSet<_> = vec![2, 3, 4].into_iter().collect(); + /// + /// let set = &a & &b; + /// + /// let mut i = 0; + /// let expected = [2, 3]; + /// for x in &set { + /// assert!(expected.contains(x)); + /// i += 1; + /// } + /// assert_eq!(i, expected.len()); + /// ``` + fn bitand(self, rhs: &HashSet) -> HashSet { + self.intersection(rhs).cloned().collect() + } +} + +impl BitXor<&HashSet> for &HashSet +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, +{ + type Output = HashSet; + + /// Returns the symmetric difference of `self` and `rhs` as a new `HashSet`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let a: HashSet<_> = vec![1, 2, 3].into_iter().collect(); + /// let b: HashSet<_> = vec![3, 4, 5].into_iter().collect(); + /// + /// let set = &a ^ &b; + /// + /// let mut i = 0; + /// let expected = [1, 2, 4, 5]; + /// for x in &set { + /// assert!(expected.contains(x)); + /// i += 1; + /// } + /// assert_eq!(i, expected.len()); + /// ``` + fn bitxor(self, rhs: &HashSet) -> HashSet { + self.symmetric_difference(rhs).cloned().collect() + } +} + +impl Sub<&HashSet> for &HashSet +where + T: Eq + Hash + Clone, + S: BuildHasher + Default, +{ + type Output = HashSet; + + /// Returns the difference of `self` and `rhs` as a new `HashSet`. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// + /// let a: HashSet<_> = vec![1, 2, 3].into_iter().collect(); + /// let b: HashSet<_> = vec![3, 4, 5].into_iter().collect(); + /// + /// let set = &a - &b; + /// + /// let mut i = 0; + /// let expected = [1, 2]; + /// for x in &set { + /// assert!(expected.contains(x)); + /// i += 1; + /// } + /// assert_eq!(i, expected.len()); + /// ``` + fn sub(self, rhs: &HashSet) -> HashSet { + self.difference(rhs).cloned().collect() + } +} + +/// An iterator over the items of a `HashSet`. +/// +/// This `struct` is created by the [`iter`] method on [`HashSet`]. +/// See its documentation for more. +/// +/// [`HashSet`]: struct.HashSet.html +/// [`iter`]: struct.HashSet.html#method.iter +pub struct Iter<'a, K> { + iter: Keys<'a, K, ()>, +} + +/// An owning iterator over the items of a `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 +/// [`into_iter`]: struct.HashSet.html#method.into_iter +pub struct IntoIter { + iter: map::IntoIter, +} + +/// A draining iterator over the items of a `HashSet`. +/// +/// This `struct` is created by the [`drain`] method on [`HashSet`]. +/// See its documentation for more. +/// +/// [`HashSet`]: struct.HashSet.html +/// [`drain`]: struct.HashSet.html#method.drain +pub struct Drain<'a, K> { + iter: map::Drain<'a, K, ()>, +} + +/// A draining iterator over entries of a `HashSet` which don't satisfy the predicate `f`. +/// +/// This `struct` is created by the [`drain_filter`] method on [`HashSet`]. See its +/// documentation for more. +/// +/// [`drain_filter`]: struct.HashSet.html#method.drain_filter +/// [`HashSet`]: struct.HashSet.html +pub struct DrainFilter<'a, K, F> +where + F: FnMut(&K) -> bool, +{ + f: F, + inner: DrainFilterInner<'a, K, ()>, +} + +/// A lazy iterator producing elements in the intersection of `HashSet`s. +/// +/// This `struct` is created by the [`intersection`] method on [`HashSet`]. +/// See its documentation for more. +/// +/// [`HashSet`]: struct.HashSet.html +/// [`intersection`]: struct.HashSet.html#method.intersection +pub struct Intersection<'a, T, S> { + // iterator of the first set + iter: Iter<'a, T>, + // the second set + other: &'a HashSet, +} + +/// A lazy iterator producing elements in the difference of `HashSet`s. +/// +/// This `struct` is created by the [`difference`] method on [`HashSet`]. +/// See its documentation for more. +/// +/// [`HashSet`]: struct.HashSet.html +/// [`difference`]: struct.HashSet.html#method.difference +pub struct Difference<'a, T, S> { + // iterator of the first set + iter: Iter<'a, T>, + // the second set + other: &'a HashSet, +} + +/// A lazy iterator producing elements in the symmetric difference of `HashSet`s. +/// +/// This `struct` is created by the [`symmetric_difference`] method on +/// [`HashSet`]. See its documentation for more. +/// +/// [`HashSet`]: struct.HashSet.html +/// [`symmetric_difference`]: struct.HashSet.html#method.symmetric_difference +pub struct SymmetricDifference<'a, T, S> { + iter: Chain, Difference<'a, T, S>>, +} + +/// A lazy iterator producing elements in the union of `HashSet`s. +/// +/// This `struct` is created by the [`union`] method on [`HashSet`]. +/// See its documentation for more. +/// +/// [`HashSet`]: struct.HashSet.html +/// [`union`]: struct.HashSet.html#method.union +pub struct Union<'a, T, S> { + iter: Chain, Difference<'a, T, S>>, +} + +impl<'a, T, S> IntoIterator for &'a HashSet { + type Item = &'a T; + type IntoIter = Iter<'a, T>; + + #[cfg_attr(feature = "inline-more", inline)] + fn into_iter(self) -> Iter<'a, T> { + self.iter() + } +} + +impl IntoIterator for HashSet { + type Item = T; + type IntoIter = IntoIter; + + /// Creates a consuming iterator, that is, one that moves each value out + /// of the set in arbitrary order. The set cannot be used after calling + /// this. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// let mut set = HashSet::new(); + /// set.insert("a".to_string()); + /// set.insert("b".to_string()); + /// + /// // Not possible to collect to a Vec with a regular `.iter()`. + /// let v: Vec = set.into_iter().collect(); + /// + /// // Will print in an arbitrary order. + /// for x in &v { + /// println!("{}", x); + /// } + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + fn into_iter(self) -> IntoIter { + IntoIter { + iter: self.map.into_iter(), + } + } +} + +impl Clone for Iter<'_, K> { + #[cfg_attr(feature = "inline-more", inline)] + fn clone(&self) -> Self { + Iter { + iter: self.iter.clone(), + } + } +} +impl<'a, K> Iterator for Iter<'a, K> { + type Item = &'a K; + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option<&'a K> { + self.iter.next() + } + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } +} +impl<'a, K> ExactSizeIterator for Iter<'a, K> { + #[cfg_attr(feature = "inline-more", inline)] + fn len(&self) -> usize { + self.iter.len() + } +} +impl FusedIterator for Iter<'_, K> {} + +impl fmt::Debug for Iter<'_, K> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_list().entries(self.clone()).finish() + } +} + +impl Iterator for IntoIter { + type Item = K; + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option { + // Avoid `Option::map` because it bloats LLVM IR. + match self.iter.next() { + Some((k, _)) => Some(k), + None => None, + } + } + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } +} +impl ExactSizeIterator for IntoIter { + #[cfg_attr(feature = "inline-more", inline)] + fn len(&self) -> usize { + self.iter.len() + } +} +impl FusedIterator for IntoIter {} + +impl fmt::Debug for IntoIter { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let entries_iter = self.iter.iter().map(|(k, _)| k); + f.debug_list().entries(entries_iter).finish() + } +} + +impl Iterator for Drain<'_, K> { + type Item = K; + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option { + // Avoid `Option::map` because it bloats LLVM IR. + match self.iter.next() { + Some((k, _)) => Some(k), + None => None, + } + } + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } +} +impl ExactSizeIterator for Drain<'_, K> { + #[cfg_attr(feature = "inline-more", inline)] + fn len(&self) -> usize { + self.iter.len() + } +} +impl FusedIterator for Drain<'_, K> {} + +impl fmt::Debug for Drain<'_, K> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let entries_iter = self.iter.iter().map(|(k, _)| k); + f.debug_list().entries(entries_iter).finish() + } +} + +impl<'a, K, F> Drop for DrainFilter<'a, K, F> +where + F: FnMut(&K) -> bool, +{ + #[cfg_attr(feature = "inline-more", inline)] + fn drop(&mut self) { + while let Some(item) = self.next() { + let guard = ConsumeAllOnDrop(self); + drop(item); + mem::forget(guard); + } + } +} + +impl Iterator for DrainFilter<'_, K, F> +where + F: FnMut(&K) -> bool, +{ + type Item = K; + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option { + let f = &mut self.f; + let (k, _) = self.inner.next(&mut |k, _| f(k))?; + Some(k) + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + (0, self.inner.iter.size_hint().1) + } +} + +impl FusedIterator for DrainFilter<'_, K, F> where F: FnMut(&K) -> bool {} + +impl Clone for Intersection<'_, T, S> { + #[cfg_attr(feature = "inline-more", inline)] + fn clone(&self) -> Self { + Intersection { + iter: self.iter.clone(), + ..*self + } + } +} + +impl<'a, T, S> Iterator for Intersection<'a, T, S> +where + T: Eq + Hash, + S: BuildHasher, +{ + type Item = &'a T; + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option<&'a T> { + loop { + let elt = self.iter.next()?; + if self.other.contains(elt) { + return Some(elt); + } + } + } + + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + let (_, upper) = self.iter.size_hint(); + (0, upper) + } +} + +impl fmt::Debug for Intersection<'_, T, S> +where + T: fmt::Debug + Eq + Hash, + S: BuildHasher, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_list().entries(self.clone()).finish() + } +} + +impl FusedIterator for Intersection<'_, T, S> +where + T: Eq + Hash, + S: BuildHasher, +{ +} + +impl Clone for Difference<'_, T, S> { + #[cfg_attr(feature = "inline-more", inline)] + fn clone(&self) -> Self { + Difference { + iter: self.iter.clone(), + ..*self + } + } +} + +impl<'a, T, S> Iterator for Difference<'a, T, S> +where + T: Eq + Hash, + S: BuildHasher, +{ + type Item = &'a T; + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option<&'a T> { + loop { + let elt = self.iter.next()?; + if !self.other.contains(elt) { + return Some(elt); + } + } + } + + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + let (_, upper) = self.iter.size_hint(); + (0, upper) + } +} + +impl FusedIterator for Difference<'_, T, S> +where + T: Eq + Hash, + S: BuildHasher, +{ +} + +impl fmt::Debug for Difference<'_, T, S> +where + T: fmt::Debug + Eq + Hash, + S: BuildHasher, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_list().entries(self.clone()).finish() + } +} + +impl Clone for SymmetricDifference<'_, T, S> { + #[cfg_attr(feature = "inline-more", inline)] + fn clone(&self) -> Self { + SymmetricDifference { + iter: self.iter.clone(), + } + } +} + +impl<'a, T, S> Iterator for SymmetricDifference<'a, T, S> +where + T: Eq + Hash, + S: BuildHasher, +{ + type Item = &'a T; + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option<&'a T> { + self.iter.next() + } + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } +} + +impl FusedIterator for SymmetricDifference<'_, T, S> +where + T: Eq + Hash, + S: BuildHasher, +{ +} + +impl fmt::Debug for SymmetricDifference<'_, T, S> +where + T: fmt::Debug + Eq + Hash, + S: BuildHasher, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_list().entries(self.clone()).finish() + } +} + +impl Clone for Union<'_, T, S> { + #[cfg_attr(feature = "inline-more", inline)] + fn clone(&self) -> Self { + Union { + iter: self.iter.clone(), + } + } +} + +impl FusedIterator for Union<'_, T, S> +where + T: Eq + Hash, + S: BuildHasher, +{ +} + +impl fmt::Debug for Union<'_, T, S> +where + T: fmt::Debug + Eq + Hash, + S: BuildHasher, +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_list().entries(self.clone()).finish() + } +} + +impl<'a, T, S> Iterator for Union<'a, T, S> +where + T: Eq + Hash, + S: BuildHasher, +{ + type Item = &'a T; + + #[cfg_attr(feature = "inline-more", inline)] + fn next(&mut self) -> Option<&'a T> { + self.iter.next() + } + #[cfg_attr(feature = "inline-more", inline)] + fn size_hint(&self) -> (usize, Option) { + self.iter.size_hint() + } +} + +#[allow(dead_code)] +fn assert_covariance() { + fn set<'new>(v: HashSet<&'static str>) -> HashSet<&'new str> { + v + } + fn iter<'a, 'new>(v: Iter<'a, &'static str>) -> Iter<'a, &'new str> { + v + } + fn into_iter<'new>(v: IntoIter<&'static str>) -> IntoIter<&'new str> { + v + } + fn difference<'a, 'new>( + v: Difference<'a, &'static str, DefaultHashBuilder>, + ) -> Difference<'a, &'new str, DefaultHashBuilder> { + v + } + fn symmetric_difference<'a, 'new>( + v: SymmetricDifference<'a, &'static str, DefaultHashBuilder>, + ) -> SymmetricDifference<'a, &'new str, DefaultHashBuilder> { + v + } + fn intersection<'a, 'new>( + v: Intersection<'a, &'static str, DefaultHashBuilder>, + ) -> Intersection<'a, &'new str, DefaultHashBuilder> { + v + } + fn union<'a, 'new>( + v: Union<'a, &'static str, DefaultHashBuilder>, + ) -> Union<'a, &'new str, DefaultHashBuilder> { + v + } + fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> { + d + } +} + +#[cfg(test)] +mod test_set { + use super::super::map::DefaultHashBuilder; + use super::HashSet; + use std::vec::Vec; + + #[test] + fn test_zero_capacities() { + type HS = HashSet; + + let s = HS::new(); + assert_eq!(s.capacity(), 0); + + let s = HS::default(); + assert_eq!(s.capacity(), 0); + + let s = HS::with_hasher(DefaultHashBuilder::default()); + assert_eq!(s.capacity(), 0); + + let s = HS::with_capacity(0); + assert_eq!(s.capacity(), 0); + + let s = HS::with_capacity_and_hasher(0, DefaultHashBuilder::default()); + assert_eq!(s.capacity(), 0); + + let mut s = HS::new(); + s.insert(1); + s.insert(2); + s.remove(&1); + s.remove(&2); + s.shrink_to_fit(); + assert_eq!(s.capacity(), 0); + + let mut s = HS::new(); + s.reserve(0); + assert_eq!(s.capacity(), 0); + } + + #[test] + fn test_disjoint() { + let mut xs = HashSet::new(); + let mut ys = HashSet::new(); + assert!(xs.is_disjoint(&ys)); + assert!(ys.is_disjoint(&xs)); + assert!(xs.insert(5)); + assert!(ys.insert(11)); + assert!(xs.is_disjoint(&ys)); + assert!(ys.is_disjoint(&xs)); + assert!(xs.insert(7)); + assert!(xs.insert(19)); + assert!(xs.insert(4)); + assert!(ys.insert(2)); + assert!(ys.insert(-11)); + assert!(xs.is_disjoint(&ys)); + assert!(ys.is_disjoint(&xs)); + assert!(ys.insert(7)); + assert!(!xs.is_disjoint(&ys)); + assert!(!ys.is_disjoint(&xs)); + } + + #[test] + fn test_subset_and_superset() { + let mut a = HashSet::new(); + assert!(a.insert(0)); + assert!(a.insert(5)); + assert!(a.insert(11)); + assert!(a.insert(7)); + + let mut b = HashSet::new(); + assert!(b.insert(0)); + assert!(b.insert(7)); + assert!(b.insert(19)); + assert!(b.insert(250)); + assert!(b.insert(11)); + assert!(b.insert(200)); + + assert!(!a.is_subset(&b)); + assert!(!a.is_superset(&b)); + assert!(!b.is_subset(&a)); + assert!(!b.is_superset(&a)); + + assert!(b.insert(5)); + + assert!(a.is_subset(&b)); + assert!(!a.is_superset(&b)); + assert!(!b.is_subset(&a)); + assert!(b.is_superset(&a)); + } + + #[test] + fn test_iterate() { + let mut a = HashSet::new(); + for i in 0..32 { + assert!(a.insert(i)); + } + let mut observed: u32 = 0; + for k in &a { + observed |= 1 << *k; + } + assert_eq!(observed, 0xFFFF_FFFF); + } + + #[test] + fn test_intersection() { + let mut a = HashSet::new(); + let mut b = HashSet::new(); + + assert!(a.insert(11)); + assert!(a.insert(1)); + assert!(a.insert(3)); + assert!(a.insert(77)); + assert!(a.insert(103)); + assert!(a.insert(5)); + assert!(a.insert(-5)); + + assert!(b.insert(2)); + assert!(b.insert(11)); + assert!(b.insert(77)); + assert!(b.insert(-9)); + assert!(b.insert(-42)); + assert!(b.insert(5)); + assert!(b.insert(3)); + + let mut i = 0; + let expected = [3, 5, 11, 77]; + for x in a.intersection(&b) { + assert!(expected.contains(x)); + i += 1 + } + assert_eq!(i, expected.len()); + } + + #[test] + fn test_difference() { + let mut a = HashSet::new(); + let mut b = HashSet::new(); + + assert!(a.insert(1)); + assert!(a.insert(3)); + assert!(a.insert(5)); + assert!(a.insert(9)); + assert!(a.insert(11)); + + assert!(b.insert(3)); + assert!(b.insert(9)); + + let mut i = 0; + let expected = [1, 5, 11]; + for x in a.difference(&b) { + assert!(expected.contains(x)); + i += 1 + } + assert_eq!(i, expected.len()); + } + + #[test] + fn test_symmetric_difference() { + let mut a = HashSet::new(); + let mut b = HashSet::new(); + + assert!(a.insert(1)); + assert!(a.insert(3)); + assert!(a.insert(5)); + assert!(a.insert(9)); + assert!(a.insert(11)); + + assert!(b.insert(-2)); + assert!(b.insert(3)); + assert!(b.insert(9)); + assert!(b.insert(14)); + assert!(b.insert(22)); + + let mut i = 0; + let expected = [-2, 1, 5, 11, 14, 22]; + for x in a.symmetric_difference(&b) { + assert!(expected.contains(x)); + i += 1 + } + assert_eq!(i, expected.len()); + } + + #[test] + fn test_union() { + let mut a = HashSet::new(); + let mut b = HashSet::new(); + + assert!(a.insert(1)); + assert!(a.insert(3)); + assert!(a.insert(5)); + assert!(a.insert(9)); + assert!(a.insert(11)); + assert!(a.insert(16)); + assert!(a.insert(19)); + assert!(a.insert(24)); + + assert!(b.insert(-2)); + assert!(b.insert(1)); + assert!(b.insert(5)); + assert!(b.insert(9)); + assert!(b.insert(13)); + assert!(b.insert(19)); + + let mut i = 0; + let expected = [-2, 1, 3, 5, 9, 11, 13, 16, 19, 24]; + for x in a.union(&b) { + assert!(expected.contains(x)); + i += 1 + } + assert_eq!(i, expected.len()); + } + + #[test] + fn test_from_iter() { + let xs = [1, 2, 2, 3, 4, 5, 6, 7, 8, 9]; + + let set: HashSet<_> = xs.iter().cloned().collect(); + + for x in &xs { + assert!(set.contains(x)); + } + + assert_eq!(set.iter().len(), xs.len() - 1); + } + + #[test] + fn test_move_iter() { + let hs = { + let mut hs = HashSet::new(); + + hs.insert('a'); + hs.insert('b'); + + hs + }; + + let v = hs.into_iter().collect::>(); + assert!(v == ['a', 'b'] || v == ['b', 'a']); + } + + #[test] + fn test_eq() { + // These constants once happened to expose a bug in insert(). + // I'm keeping them around to prevent a regression. + let mut s1 = HashSet::new(); + + s1.insert(1); + s1.insert(2); + s1.insert(3); + + let mut s2 = HashSet::new(); + + s2.insert(1); + s2.insert(2); + + assert!(s1 != s2); + + s2.insert(3); + + assert_eq!(s1, s2); + } + + #[test] + fn test_show() { + let mut set = HashSet::new(); + let empty = HashSet::::new(); + + set.insert(1); + set.insert(2); + + let set_str = format!("{:?}", set); + + assert!(set_str == "{1, 2}" || set_str == "{2, 1}"); + assert_eq!(format!("{:?}", empty), "{}"); + } + + #[test] + fn test_trivial_drain() { + let mut s = HashSet::::new(); + for _ in s.drain() {} + assert!(s.is_empty()); + drop(s); + + let mut s = HashSet::::new(); + drop(s.drain()); + assert!(s.is_empty()); + } + + #[test] + fn test_drain() { + let mut s: HashSet<_> = (1..100).collect(); + + // try this a bunch of times to make sure we don't screw up internal state. + for _ in 0..20 { + assert_eq!(s.len(), 99); + + { + let mut last_i = 0; + let mut d = s.drain(); + for (i, x) in d.by_ref().take(50).enumerate() { + last_i = i; + assert!(x != 0); + } + assert_eq!(last_i, 49); + } + + for _ in &s { + panic!("s should be empty!"); + } + + // reset to try again. + s.extend(1..100); + } + } + + #[test] + fn test_replace() { + use core::hash; + + #[derive(Debug)] + struct Foo(&'static str, i32); + + impl PartialEq for Foo { + fn eq(&self, other: &Self) -> bool { + self.0 == other.0 + } + } + + impl Eq for Foo {} + + impl hash::Hash for Foo { + fn hash(&self, h: &mut H) { + self.0.hash(h); + } + } + + let mut s = HashSet::new(); + assert_eq!(s.replace(Foo("a", 1)), None); + assert_eq!(s.len(), 1); + assert_eq!(s.replace(Foo("a", 2)), Some(Foo("a", 1))); + assert_eq!(s.len(), 1); + + let mut it = s.iter(); + assert_eq!(it.next(), Some(&Foo("a", 2))); + assert_eq!(it.next(), None); + } + + #[test] + fn test_extend_ref() { + let mut a = HashSet::new(); + a.insert(1); + + a.extend(&[2, 3, 4]); + + assert_eq!(a.len(), 4); + assert!(a.contains(&1)); + assert!(a.contains(&2)); + assert!(a.contains(&3)); + assert!(a.contains(&4)); + + let mut b = HashSet::new(); + b.insert(5); + b.insert(6); + + a.extend(&b); + + assert_eq!(a.len(), 6); + assert!(a.contains(&1)); + assert!(a.contains(&2)); + assert!(a.contains(&3)); + assert!(a.contains(&4)); + assert!(a.contains(&5)); + assert!(a.contains(&6)); + } + + #[test] + fn test_retain() { + let xs = [1, 2, 3, 4, 5, 6]; + let mut set: HashSet = xs.iter().cloned().collect(); + set.retain(|&k| k % 2 == 0); + assert_eq!(set.len(), 3); + assert!(set.contains(&2)); + assert!(set.contains(&4)); + assert!(set.contains(&6)); + } + + #[test] + fn test_drain_filter() { + { + let mut set: HashSet = (0..8).collect(); + let drained = set.drain_filter(|&k| k % 2 == 0); + let mut out = drained.collect::>(); + out.sort_unstable(); + assert_eq!(vec![0, 2, 4, 6], out); + assert_eq!(set.len(), 4); + } + { + let mut set: HashSet = (0..8).collect(); + drop(set.drain_filter(|&k| k % 2 == 0)); + assert_eq!(set.len(), 4, "Removes non-matching items on drop"); + } + } + + #[test] + fn test_const_with_hasher() { + use core::hash::BuildHasher; + use std::collections::hash_map::DefaultHasher; + + #[derive(Clone)] + struct MyHasher; + impl BuildHasher for MyHasher { + type Hasher = DefaultHasher; + + fn build_hasher(&self) -> DefaultHasher { + DefaultHasher::new() + } + } + + const EMPTY_SET: HashSet = HashSet::with_hasher(MyHasher); + + let mut set = EMPTY_SET.clone(); + set.insert(19); + assert!(set.contains(&19)); + } +} diff --git a/vendor/hashbrown-0.9.1/tests/hasher.rs b/vendor/hashbrown-0.9.1/tests/hasher.rs new file mode 100644 index 0000000000..e455e3d3c9 --- /dev/null +++ b/vendor/hashbrown-0.9.1/tests/hasher.rs @@ -0,0 +1,65 @@ +//! Sanity check that alternate hashers work correctly. + +#![cfg(not(miri))] // FIXME: takes too long + +use hashbrown::HashSet; +use std::hash::{BuildHasher, BuildHasherDefault, Hasher}; + +fn check() { + let range = 0..1_000; + + let mut set = HashSet::::default(); + set.extend(range.clone()); + + assert!(!set.contains(&i32::min_value())); + assert!(!set.contains(&(range.start - 1))); + for i in range.clone() { + assert!(set.contains(&i)); + } + assert!(!set.contains(&range.end)); + assert!(!set.contains(&i32::max_value())); +} + +/// Use hashbrown's default hasher. +#[test] +fn default() { + check::(); +} + +/// Use std's default hasher. +#[test] +fn random_state() { + check::(); +} + +/// Use a constant 0 hash. +#[test] +fn zero() { + #[derive(Default)] + struct ZeroHasher; + + impl Hasher for ZeroHasher { + fn finish(&self) -> u64 { + 0 + } + fn write(&mut self, _: &[u8]) {} + } + + check::>(); +} + +/// Use a constant maximum hash. +#[test] +fn max() { + #[derive(Default)] + struct MaxHasher; + + impl Hasher for MaxHasher { + fn finish(&self) -> u64 { + u64::max_value() + } + fn write(&mut self, _: &[u8]) {} + } + + check::>(); +} diff --git a/vendor/hashbrown-0.9.1/tests/rayon.rs b/vendor/hashbrown-0.9.1/tests/rayon.rs new file mode 100644 index 0000000000..39b47708dd --- /dev/null +++ b/vendor/hashbrown-0.9.1/tests/rayon.rs @@ -0,0 +1,533 @@ +#![cfg(feature = "rayon")] + +#[macro_use] +extern crate lazy_static; + +use hashbrown::{HashMap, HashSet}; +use rayon::iter::{ + IntoParallelIterator, IntoParallelRefIterator, IntoParallelRefMutIterator, ParallelExtend, + ParallelIterator, +}; + +macro_rules! assert_eq3 { + ($e1:expr, $e2:expr, $e3:expr) => {{ + assert_eq!($e1, $e2); + assert_eq!($e1, $e3); + assert_eq!($e2, $e3); + }}; +} + +lazy_static! { + static ref MAP_EMPTY: HashMap = HashMap::new(); + static ref MAP: HashMap = { + let mut m = HashMap::new(); + m.insert('b', 20); + m.insert('a', 10); + m.insert('c', 30); + m.insert('e', 50); + m.insert('f', 60); + m.insert('d', 40); + m + }; +} + +#[test] +fn map_seq_par_equivalence_iter_empty() { + let vec_seq = MAP_EMPTY.iter().collect::>(); + let vec_par = MAP_EMPTY.par_iter().collect::>(); + + assert_eq3!(vec_seq, vec_par, []); +} + +#[test] +fn map_seq_par_equivalence_iter() { + let mut vec_seq = MAP.iter().collect::>(); + let mut vec_par = MAP.par_iter().collect::>(); + + assert_eq!(vec_seq, vec_par); + + // Do not depend on the exact order of values + let expected_sorted = [ + (&'a', &10), + (&'b', &20), + (&'c', &30), + (&'d', &40), + (&'e', &50), + (&'f', &60), + ]; + + vec_seq.sort_unstable(); + vec_par.sort_unstable(); + + assert_eq3!(vec_seq, vec_par, expected_sorted); +} + +#[test] +fn map_seq_par_equivalence_keys_empty() { + let vec_seq = MAP_EMPTY.keys().collect::>(); + let vec_par = MAP_EMPTY.par_keys().collect::>(); + + let expected: [&char; 0] = []; + + assert_eq3!(vec_seq, vec_par, expected); +} + +#[test] +fn map_seq_par_equivalence_keys() { + let mut vec_seq = MAP.keys().collect::>(); + let mut vec_par = MAP.par_keys().collect::>(); + + assert_eq!(vec_seq, vec_par); + + // Do not depend on the exact order of values + let expected_sorted = [&'a', &'b', &'c', &'d', &'e', &'f']; + + vec_seq.sort_unstable(); + vec_par.sort_unstable(); + + assert_eq3!(vec_seq, vec_par, expected_sorted); +} + +#[test] +fn map_seq_par_equivalence_values_empty() { + let vec_seq = MAP_EMPTY.values().collect::>(); + let vec_par = MAP_EMPTY.par_values().collect::>(); + + let expected: [&u32; 0] = []; + + assert_eq3!(vec_seq, vec_par, expected); +} + +#[test] +fn map_seq_par_equivalence_values() { + let mut vec_seq = MAP.values().collect::>(); + let mut vec_par = MAP.par_values().collect::>(); + + assert_eq!(vec_seq, vec_par); + + // Do not depend on the exact order of values + let expected_sorted = [&10, &20, &30, &40, &50, &60]; + + vec_seq.sort_unstable(); + vec_par.sort_unstable(); + + assert_eq3!(vec_seq, vec_par, expected_sorted); +} + +#[test] +fn map_seq_par_equivalence_iter_mut_empty() { + let mut map1 = MAP_EMPTY.clone(); + let mut map2 = MAP_EMPTY.clone(); + + let vec_seq = map1.iter_mut().collect::>(); + let vec_par = map2.par_iter_mut().collect::>(); + + assert_eq3!(vec_seq, vec_par, []); +} + +#[test] +fn map_seq_par_equivalence_iter_mut() { + let mut map1 = MAP.clone(); + let mut map2 = MAP.clone(); + + let mut vec_seq = map1.iter_mut().collect::>(); + let mut vec_par = map2.par_iter_mut().collect::>(); + + assert_eq!(vec_seq, vec_par); + + // Do not depend on the exact order of values + let expected_sorted = [ + (&'a', &mut 10), + (&'b', &mut 20), + (&'c', &mut 30), + (&'d', &mut 40), + (&'e', &mut 50), + (&'f', &mut 60), + ]; + + vec_seq.sort_unstable(); + vec_par.sort_unstable(); + + assert_eq3!(vec_seq, vec_par, expected_sorted); +} + +#[test] +fn map_seq_par_equivalence_values_mut_empty() { + let mut map1 = MAP_EMPTY.clone(); + let mut map2 = MAP_EMPTY.clone(); + + let vec_seq = map1.values_mut().collect::>(); + let vec_par = map2.par_values_mut().collect::>(); + + let expected: [&u32; 0] = []; + + assert_eq3!(vec_seq, vec_par, expected); +} + +#[test] +fn map_seq_par_equivalence_values_mut() { + let mut map1 = MAP.clone(); + let mut map2 = MAP.clone(); + + let mut vec_seq = map1.values_mut().collect::>(); + let mut vec_par = map2.par_values_mut().collect::>(); + + assert_eq!(vec_seq, vec_par); + + // Do not depend on the exact order of values + let expected_sorted = [&mut 10, &mut 20, &mut 30, &mut 40, &mut 50, &mut 60]; + + vec_seq.sort_unstable(); + vec_par.sort_unstable(); + + assert_eq3!(vec_seq, vec_par, expected_sorted); +} + +#[test] +fn map_seq_par_equivalence_into_iter_empty() { + let vec_seq = MAP_EMPTY.clone().into_iter().collect::>(); + let vec_par = MAP_EMPTY.clone().into_par_iter().collect::>(); + + assert_eq3!(vec_seq, vec_par, []); +} + +#[test] +fn map_seq_par_equivalence_into_iter() { + let mut vec_seq = MAP.clone().into_iter().collect::>(); + let mut vec_par = MAP.clone().into_par_iter().collect::>(); + + assert_eq!(vec_seq, vec_par); + + // Do not depend on the exact order of values + let expected_sorted = [ + ('a', 10), + ('b', 20), + ('c', 30), + ('d', 40), + ('e', 50), + ('f', 60), + ]; + + vec_seq.sort_unstable(); + vec_par.sort_unstable(); + + assert_eq3!(vec_seq, vec_par, expected_sorted); +} + +lazy_static! { + static ref MAP_VEC_EMPTY: Vec<(char, u32)> = vec![]; + static ref MAP_VEC: Vec<(char, u32)> = vec![ + ('b', 20), + ('a', 10), + ('c', 30), + ('e', 50), + ('f', 60), + ('d', 40), + ]; +} + +#[test] +fn map_seq_par_equivalence_collect_empty() { + let map_expected = MAP_EMPTY.clone(); + let map_seq = MAP_VEC_EMPTY.clone().into_iter().collect::>(); + let map_par = MAP_VEC_EMPTY + .clone() + .into_par_iter() + .collect::>(); + + assert_eq!(map_seq, map_par); + assert_eq!(map_seq, map_expected); + assert_eq!(map_par, map_expected); +} + +#[test] +fn map_seq_par_equivalence_collect() { + let map_expected = MAP.clone(); + let map_seq = MAP_VEC.clone().into_iter().collect::>(); + let map_par = MAP_VEC.clone().into_par_iter().collect::>(); + + assert_eq!(map_seq, map_par); + assert_eq!(map_seq, map_expected); + assert_eq!(map_par, map_expected); +} + +lazy_static! { + static ref MAP_EXISTING_EMPTY: HashMap = HashMap::new(); + static ref MAP_EXISTING: HashMap = { + let mut m = HashMap::new(); + m.insert('b', 20); + m.insert('a', 10); + m + }; + static ref MAP_EXTENSION_EMPTY: Vec<(char, u32)> = vec![]; + static ref MAP_EXTENSION: Vec<(char, u32)> = vec![('c', 30), ('e', 50), ('f', 60), ('d', 40),]; +} + +#[test] +fn map_seq_par_equivalence_existing_empty_extend_empty() { + let expected = HashMap::new(); + let mut map_seq = MAP_EXISTING_EMPTY.clone(); + let mut map_par = MAP_EXISTING_EMPTY.clone(); + + map_seq.extend(MAP_EXTENSION_EMPTY.iter().cloned()); + map_par.par_extend(MAP_EXTENSION_EMPTY.par_iter().cloned()); + + assert_eq3!(map_seq, map_par, expected); +} + +#[test] +fn map_seq_par_equivalence_existing_empty_extend() { + let expected = MAP_EXTENSION.iter().cloned().collect::>(); + let mut map_seq = MAP_EXISTING_EMPTY.clone(); + let mut map_par = MAP_EXISTING_EMPTY.clone(); + + map_seq.extend(MAP_EXTENSION.iter().cloned()); + map_par.par_extend(MAP_EXTENSION.par_iter().cloned()); + + assert_eq3!(map_seq, map_par, expected); +} + +#[test] +fn map_seq_par_equivalence_existing_extend_empty() { + let expected = MAP_EXISTING.clone(); + let mut map_seq = MAP_EXISTING.clone(); + let mut map_par = MAP_EXISTING.clone(); + + map_seq.extend(MAP_EXTENSION_EMPTY.iter().cloned()); + map_par.par_extend(MAP_EXTENSION_EMPTY.par_iter().cloned()); + + assert_eq3!(map_seq, map_par, expected); +} + +#[test] +fn map_seq_par_equivalence_existing_extend() { + let expected = MAP.clone(); + let mut map_seq = MAP_EXISTING.clone(); + let mut map_par = MAP_EXISTING.clone(); + + map_seq.extend(MAP_EXTENSION.iter().cloned()); + map_par.par_extend(MAP_EXTENSION.par_iter().cloned()); + + assert_eq3!(map_seq, map_par, expected); +} + +lazy_static! { + static ref SET_EMPTY: HashSet = HashSet::new(); + static ref SET: HashSet = { + let mut s = HashSet::new(); + s.insert('b'); + s.insert('a'); + s.insert('c'); + s.insert('e'); + s.insert('f'); + s.insert('d'); + s + }; +} + +#[test] +fn set_seq_par_equivalence_iter_empty() { + let vec_seq = SET_EMPTY.iter().collect::>(); + let vec_par = SET_EMPTY.par_iter().collect::>(); + + let expected: [&char; 0] = []; + + assert_eq3!(vec_seq, vec_par, expected); +} + +#[test] +fn set_seq_par_equivalence_iter() { + let mut vec_seq = SET.iter().collect::>(); + let mut vec_par = SET.par_iter().collect::>(); + + assert_eq!(vec_seq, vec_par); + + // Do not depend on the exact order of values + let expected_sorted = [&'a', &'b', &'c', &'d', &'e', &'f']; + + vec_seq.sort_unstable(); + vec_par.sort_unstable(); + + assert_eq3!(vec_seq, vec_par, expected_sorted); +} + +#[test] +fn set_seq_par_equivalence_into_iter_empty() { + let vec_seq = SET_EMPTY.clone().into_iter().collect::>(); + let vec_par = SET_EMPTY.clone().into_par_iter().collect::>(); + + assert_eq3!(vec_seq, vec_par, []); +} + +#[test] +fn set_seq_par_equivalence_into_iter() { + let mut vec_seq = SET.clone().into_iter().collect::>(); + let mut vec_par = SET.clone().into_par_iter().collect::>(); + + assert_eq!(vec_seq, vec_par); + + // Do not depend on the exact order of values + let expected_sorted = ['a', 'b', 'c', 'd', 'e', 'f']; + + vec_seq.sort_unstable(); + vec_par.sort_unstable(); + + assert_eq3!(vec_seq, vec_par, expected_sorted); +} + +lazy_static! { + static ref SET_VEC_EMPTY: Vec = vec![]; + static ref SET_VEC: Vec = vec!['b', 'a', 'c', 'e', 'f', 'd',]; +} + +#[test] +fn set_seq_par_equivalence_collect_empty() { + let set_expected = SET_EMPTY.clone(); + let set_seq = SET_VEC_EMPTY.clone().into_iter().collect::>(); + let set_par = SET_VEC_EMPTY + .clone() + .into_par_iter() + .collect::>(); + + assert_eq!(set_seq, set_par); + assert_eq!(set_seq, set_expected); + assert_eq!(set_par, set_expected); +} + +#[test] +fn set_seq_par_equivalence_collect() { + let set_expected = SET.clone(); + let set_seq = SET_VEC.clone().into_iter().collect::>(); + let set_par = SET_VEC.clone().into_par_iter().collect::>(); + + assert_eq!(set_seq, set_par); + assert_eq!(set_seq, set_expected); + assert_eq!(set_par, set_expected); +} + +lazy_static! { + static ref SET_EXISTING_EMPTY: HashSet = HashSet::new(); + static ref SET_EXISTING: HashSet = { + let mut s = HashSet::new(); + s.insert('b'); + s.insert('a'); + s + }; + static ref SET_EXTENSION_EMPTY: Vec = vec![]; + static ref SET_EXTENSION: Vec = vec!['c', 'e', 'f', 'd',]; +} + +#[test] +fn set_seq_par_equivalence_existing_empty_extend_empty() { + let expected = HashSet::new(); + let mut set_seq = SET_EXISTING_EMPTY.clone(); + let mut set_par = SET_EXISTING_EMPTY.clone(); + + set_seq.extend(SET_EXTENSION_EMPTY.iter().cloned()); + set_par.par_extend(SET_EXTENSION_EMPTY.par_iter().cloned()); + + assert_eq3!(set_seq, set_par, expected); +} + +#[test] +fn set_seq_par_equivalence_existing_empty_extend() { + let expected = SET_EXTENSION.iter().cloned().collect::>(); + let mut set_seq = SET_EXISTING_EMPTY.clone(); + let mut set_par = SET_EXISTING_EMPTY.clone(); + + set_seq.extend(SET_EXTENSION.iter().cloned()); + set_par.par_extend(SET_EXTENSION.par_iter().cloned()); + + assert_eq3!(set_seq, set_par, expected); +} + +#[test] +fn set_seq_par_equivalence_existing_extend_empty() { + let expected = SET_EXISTING.clone(); + let mut set_seq = SET_EXISTING.clone(); + let mut set_par = SET_EXISTING.clone(); + + set_seq.extend(SET_EXTENSION_EMPTY.iter().cloned()); + set_par.par_extend(SET_EXTENSION_EMPTY.par_iter().cloned()); + + assert_eq3!(set_seq, set_par, expected); +} + +#[test] +fn set_seq_par_equivalence_existing_extend() { + let expected = SET.clone(); + let mut set_seq = SET_EXISTING.clone(); + let mut set_par = SET_EXISTING.clone(); + + set_seq.extend(SET_EXTENSION.iter().cloned()); + set_par.par_extend(SET_EXTENSION.par_iter().cloned()); + + assert_eq3!(set_seq, set_par, expected); +} + +lazy_static! { + static ref SET_A: HashSet = ['a', 'b', 'c', 'd'].iter().cloned().collect(); + static ref SET_B: HashSet = ['a', 'b', 'e', 'f'].iter().cloned().collect(); + static ref SET_DIFF_AB: HashSet = ['c', 'd'].iter().cloned().collect(); + static ref SET_DIFF_BA: HashSet = ['e', 'f'].iter().cloned().collect(); + static ref SET_SYMM_DIFF_AB: HashSet = ['c', 'd', 'e', 'f'].iter().cloned().collect(); + static ref SET_INTERSECTION_AB: HashSet = ['a', 'b'].iter().cloned().collect(); + static ref SET_UNION_AB: HashSet = + ['a', 'b', 'c', 'd', 'e', 'f'].iter().cloned().collect(); +} + +#[test] +fn set_seq_par_equivalence_difference() { + let diff_ab_seq = SET_A.difference(&*SET_B).cloned().collect::>(); + let diff_ab_par = SET_A + .par_difference(&*SET_B) + .cloned() + .collect::>(); + + assert_eq3!(diff_ab_seq, diff_ab_par, *SET_DIFF_AB); + + let diff_ba_seq = SET_B.difference(&*SET_A).cloned().collect::>(); + let diff_ba_par = SET_B + .par_difference(&*SET_A) + .cloned() + .collect::>(); + + assert_eq3!(diff_ba_seq, diff_ba_par, *SET_DIFF_BA); +} + +#[test] +fn set_seq_par_equivalence_symmetric_difference() { + let symm_diff_ab_seq = SET_A + .symmetric_difference(&*SET_B) + .cloned() + .collect::>(); + let symm_diff_ab_par = SET_A + .par_symmetric_difference(&*SET_B) + .cloned() + .collect::>(); + + assert_eq3!(symm_diff_ab_seq, symm_diff_ab_par, *SET_SYMM_DIFF_AB); +} + +#[test] +fn set_seq_par_equivalence_intersection() { + let intersection_ab_seq = SET_A.intersection(&*SET_B).cloned().collect::>(); + let intersection_ab_par = SET_A + .par_intersection(&*SET_B) + .cloned() + .collect::>(); + + assert_eq3!( + intersection_ab_seq, + intersection_ab_par, + *SET_INTERSECTION_AB + ); +} + +#[test] +fn set_seq_par_equivalence_union() { + let union_ab_seq = SET_A.union(&*SET_B).cloned().collect::>(); + let union_ab_par = SET_A.par_union(&*SET_B).cloned().collect::>(); + + assert_eq3!(union_ab_seq, union_ab_par, *SET_UNION_AB); +} diff --git a/vendor/hashbrown-0.9.1/tests/serde.rs b/vendor/hashbrown-0.9.1/tests/serde.rs new file mode 100644 index 0000000000..570bf70da9 --- /dev/null +++ b/vendor/hashbrown-0.9.1/tests/serde.rs @@ -0,0 +1,65 @@ +#![cfg(feature = "serde")] + +use core::hash::BuildHasherDefault; +use hashbrown::{HashMap, HashSet}; +use rustc_hash::FxHasher; +use serde_test::{assert_tokens, Token}; + +// We use FxHash for this test because we rely on the ordering +type FxHashMap = HashMap>; +type FxHashSet = HashSet>; + +#[test] +fn map_serde_tokens_empty() { + let map = FxHashMap::::default(); + + assert_tokens(&map, &[Token::Map { len: Some(0) }, Token::MapEnd]); +} + +#[test] +fn map_serde_tokens() { + let mut map = FxHashMap::default(); + map.insert('b', 20); + map.insert('a', 10); + map.insert('c', 30); + + assert_tokens( + &map, + &[ + Token::Map { len: Some(3) }, + Token::Char('a'), + Token::I32(10), + Token::Char('b'), + Token::I32(20), + Token::Char('c'), + Token::I32(30), + Token::MapEnd, + ], + ); +} + +#[test] +fn set_serde_tokens_empty() { + let set = FxHashSet::::default(); + + assert_tokens(&set, &[Token::Seq { len: Some(0) }, Token::SeqEnd]); +} + +#[test] +fn set_serde_tokens() { + let mut set = FxHashSet::default(); + set.insert(20); + set.insert(10); + set.insert(30); + + assert_tokens( + &set, + &[ + Token::Seq { len: Some(3) }, + Token::I32(20), + Token::I32(10), + Token::I32(30), + Token::SeqEnd, + ], + ); +} diff --git a/vendor/hashbrown-0.9.1/tests/set.rs b/vendor/hashbrown-0.9.1/tests/set.rs new file mode 100644 index 0000000000..3fc0717053 --- /dev/null +++ b/vendor/hashbrown-0.9.1/tests/set.rs @@ -0,0 +1,30 @@ +#![cfg(not(miri))] // FIXME: takes too long + +use hashbrown::HashSet; +use rand::{distributions::Alphanumeric, rngs::SmallRng, Rng, SeedableRng}; + +#[test] +fn test_hashset_insert_remove() { + let mut m: HashSet> = HashSet::new(); + //let num: u32 = 4096; + //let tx: Vec> = (0..num).map(|i| (i..(16 + i)).collect()).collect(); + let seed: [u8; 16] = [ + 130, 220, 246, 217, 111, 124, 221, 189, 190, 234, 121, 93, 67, 95, 100, 43, + ]; + + let rng = &mut SmallRng::from_seed(seed); + let tx: Vec> = (0..4096) + .map(|_| (rng.sample_iter(&Alphanumeric).take(32).collect())) + .collect(); + + for _ in 0..32 { + for i in 0..4096 { + assert_eq!(m.contains(&tx[i].clone()), false); + assert_eq!(m.insert(tx[i].clone()), true); + } + for i in 0..4096 { + println!("removing {} {:?}", i, tx[i]); + assert_eq!(m.remove(&tx[i]), true); + } + } +} diff --git a/vendor/hashbrown/.cargo-checksum.json b/vendor/hashbrown/.cargo-checksum.json index 53328fd47f..76b64167df 100644 --- a/vendor/hashbrown/.cargo-checksum.json +++ b/vendor/hashbrown/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"5a7c89b011b8a47ae3c3097d0badc86dadeac1084ce459cc9888f3f6519d7e47","Cargo.toml":"ba475021bd4563dde7d812713dbb79fc9fc7f522ad58bd0deaeed9ebadff69ef","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2","README.md":"29d265575e99c6e4b8960fa0a17571580c8973b91b1b2ce63b9b83f8e1bdc58a","benches/bench.rs":"a3f8426559ebf68d93e37edee0bf83c28f18572b394b22e47dbff33e25cac403","clippy.toml":"7535949f908c6d9aea4f9a9f3a7625552c93fc29e963d059d40f4def9d77ea7b","src/external_trait_impls/mod.rs":"d69528827794524cfd9acbeacc1ac4f6131e3c7574311e6d919f818f65fbff07","src/external_trait_impls/rayon/helpers.rs":"d4fbca4db924925548f8dab8eb94cf4a3955a53c5e1ff15f59c460546c394034","src/external_trait_impls/rayon/map.rs":"eee0d42bd8cd347d49cfb1332f15297ca63b864c3690299a3ccd6d52c22c67de","src/external_trait_impls/rayon/mod.rs":"156de9c1ad0123334ea3b7e5a17444faf1b8bf971aa88a1f23e2f2d1c3021141","src/external_trait_impls/rayon/raw.rs":"d1b2415a4c3c42279f99a23bcf45c80ddb9a641c7f7974d42ed4d55f57bf6854","src/external_trait_impls/rayon/set.rs":"59afc7b1cdc985a85952d456e34eada4ca2fedf90d2a14dccf98a69f8f496137","src/external_trait_impls/serde.rs":"9306fb6e0e339398dc23ba9e7400a9a28d713df248e8b260e3d4dc44f799e101","src/lib.rs":"a455a0387b0133114247380659c2825713a4b91ef38a45f737007b47a2c30ee4","src/macros.rs":"0b1e9a55e8f5232b82f7e56f352a98904b35ddfca015377cf71daa31939baabf","src/map.rs":"56dc55edfd3c818d8c69464ec9edce9e3fe40e5975c02a2965e0a15878a08295","src/raw/bitmask.rs":"05e72c64957af7383001ca43a827cc5b3a8a39d00fac332ecea2fd7d2704099c","src/raw/generic.rs":"28da6bb3a722dcaa26cb5aba9e028111f32212dc9ce0c323e8f39ff5f367385e","src/raw/mod.rs":"ad887f865799502e852a3c100a49cc785ee97cb755b8394b31f87ed24fffa836","src/raw/sse2.rs":"ff332a9104558fe6a86b85ab975b6f43d4a042c634d5dc6cf70cf1d71d97ad7d","src/rustc_entry.rs":"64e47870015a9f152340017b79e2262e5c70d0f42b4fc2dfa48dd25ca70465f7","src/scopeguard.rs":"337cde60c9e1109cd19d4fa53529014cef1e3d5900dffde82f647881df1505f7","src/set.rs":"4ec68cf40a41bbc50da754047893640c62c55f612e03c43e3e3e837a23defc6d","tests/hasher.rs":"9a8fdf67e4415618e16729969c386eefe71408cded5d46cf7b67d969276a3452","tests/rayon.rs":"2286707a87b139f41902c82488c355b9fb402a3e734f392f3a73e87b9b932795","tests/serde.rs":"eed27382c0e43f67e402cd9eed20dea23ef5582e1a26a183e708ca9217a559e0","tests/set.rs":"374bd312c01a01cf8953bbbc9494f431b260c2657d7c79cc250e977b869a76ad"},"package":"d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"} \ No newline at end of file +{"files":{"CHANGELOG.md":"1a8531a56ec5114e4946dadad379f880881fad2db75e6affdeafc72415bc56d2","Cargo.toml":"b3bb242d7e332f49f444f49f4e11d3ecac44f21aeaa6bb8b69b39e8000e38fa7","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2","README.md":"742ce1a4c92dada5f73ce594b224b646ff4aefe702768ec2eb39bd937a5a8fd3","benches/bench.rs":"43546a3d5aed2dd8f71f5d236f4df63d82a3767aec90d86f4ab1d1496619b45d","clippy.toml":"7535949f908c6d9aea4f9a9f3a7625552c93fc29e963d059d40f4def9d77ea7b","src/external_trait_impls/mod.rs":"d69528827794524cfd9acbeacc1ac4f6131e3c7574311e6d919f818f65fbff07","src/external_trait_impls/rayon/helpers.rs":"d4fbca4db924925548f8dab8eb94cf4a3955a53c5e1ff15f59c460546c394034","src/external_trait_impls/rayon/map.rs":"eee6371f2875085b286e950a32d13c3eff3c7280e7ea6ad346d322e7a00e7b7b","src/external_trait_impls/rayon/mod.rs":"156de9c1ad0123334ea3b7e5a17444faf1b8bf971aa88a1f23e2f2d1c3021141","src/external_trait_impls/rayon/raw.rs":"ddf349051bada9a9ebd027686e03ac2f12d74dd1b3f98a36aac257e13bac57fa","src/external_trait_impls/rayon/set.rs":"c4c44d44e56c2f59e9e1355662e29d8744ac96645ca4414127a359fb46cb0fbf","src/external_trait_impls/serde.rs":"9306fb6e0e339398dc23ba9e7400a9a28d713df248e8b260e3d4dc44f799e101","src/lib.rs":"dd3c2b1f41eb63f727e99791a9e33dcd8ed98f3348deafe4c8db112af3f62d24","src/macros.rs":"0b1e9a55e8f5232b82f7e56f352a98904b35ddfca015377cf71daa31939baabf","src/map.rs":"13be541072e0aaa15e0632eb253d2ffb29e8e4e9a0efc22baa15172ddca23c85","src/raw/alloc.rs":"893da7047ff4eb3291a3dee62c954f489c8b7666aa01ef6aeda8adf2549869c0","src/raw/bitmask.rs":"05e72c64957af7383001ca43a827cc5b3a8a39d00fac332ecea2fd7d2704099c","src/raw/generic.rs":"b31590616e76dfcca635e3aa9a8a0059b3af9a5afe6b0c5ebc98a7d96d63e8ed","src/raw/mod.rs":"a0d0b0508d41e08bfc16e5db1dd4f80cd29ca26e656a803821d1eb56a1f249b3","src/raw/sse2.rs":"a775ddd8830593bb10e2a4a11b2ce16d900a68e0b3763f24715f8f7fa9c2f69d","src/rustc_entry.rs":"148fae9e8bf4893820648c3c80b24c7161c828d103f3b2a2d7bbc32fe6605eb1","src/scopeguard.rs":"808655b3e98512fdcee5a4597e7763a6be99582ba8d77e5ba5ca130d85a97211","src/set.rs":"2bc180fd8502a62d1d478441d40395591374eb5ca1b16a3e6c8bec1266095576","tests/hasher.rs":"9a8fdf67e4415618e16729969c386eefe71408cded5d46cf7b67d969276a3452","tests/rayon.rs":"2286707a87b139f41902c82488c355b9fb402a3e734f392f3a73e87b9b932795","tests/serde.rs":"6bac8054db722dd049901b37a6e006535bac30f425eb5cd91af19b5bc1dfe78e","tests/set.rs":"374bd312c01a01cf8953bbbc9494f431b260c2657d7c79cc250e977b869a76ad"},"package":"362385356d610bd1e5a408ddf8d022041774b683f345a1d2cfcb4f60f8ae2db5"} \ No newline at end of file diff --git a/vendor/hashbrown/CHANGELOG.md b/vendor/hashbrown/CHANGELOG.md index b6eb671f95..132ab75055 100644 --- a/vendor/hashbrown/CHANGELOG.md +++ b/vendor/hashbrown/CHANGELOG.md @@ -7,6 +7,38 @@ and this project adheres to [Semantic Versioning](http://semver.org/). ## [Unreleased] +## [v0.11.0] - 2021-03-14 + +## Added +- Added safe `try_insert_no_grow` method to `RawTable`. (#229) +- Added support for `bumpalo` as an allocator without the `nightly` feature. (#231) +- Implemented `Default` for `RawTable`. (#237) +- Added new safe methods `RawTable::get_each_mut`, `HashMap::get_each_mut`, and + `HashMap::get_each_key_value_mut`. (#239) +- Added `From>` for `HashSet`. (#235) +- Added `try_insert` method to `HashMap`. (#247) + +## Changed +- The minimum Rust version has been bumped to 1.49.0. (#230) +- Significantly improved compilation times by reducing the amount of generated IR. (#205) + +## Removed +- We no longer re-export the unstable allocator items from the standard library, nor the stable shims approximating the same. (#227) +- Removed hasher specialization support from `aHash`, which was resulting in inconsistent hashes being generated for a key. (#248) + +## Fixed +- Fixed union length comparison. (#228) + +## ~~[v0.10.0] - 2021-01-16~~ + +This release was _yanked_ due to inconsistent hashes being generated with the `nightly` feature. (#248) + +## Changed +- Parametrized `RawTable`, `HashSet` and `HashMap` over an allocator. (#133) +- Improved branch prediction hints on stable. (#209) +- Optimized hashing of primitive types with AHash using specialization. (#207) +- Only instantiate `RawTable`'s reserve functions once per key-value. (#204) + ## [v0.9.1] - 2020-09-28 ## Added @@ -263,7 +295,9 @@ This release was _yanked_ due to a breaking change for users of `no-default-feat - Initial release -[Unreleased]: https://github.com/rust-lang/hashbrown/compare/v0.9.1...HEAD +[Unreleased]: https://github.com/rust-lang/hashbrown/compare/v0.11.0...HEAD +[v0.11.0]: https://github.com/rust-lang/hashbrown/compare/v0.10.0...v0.11.0 +[v0.10.0]: https://github.com/rust-lang/hashbrown/compare/v0.9.1...v0.10.0 [v0.9.1]: https://github.com/rust-lang/hashbrown/compare/v0.9.0...v0.9.1 [v0.9.0]: https://github.com/rust-lang/hashbrown/compare/v0.8.2...v0.9.0 [v0.8.2]: https://github.com/rust-lang/hashbrown/compare/v0.8.1...v0.8.2 diff --git a/vendor/hashbrown/Cargo.toml b/vendor/hashbrown/Cargo.toml index 7be0341b33..2a01cb346e 100644 --- a/vendor/hashbrown/Cargo.toml +++ b/vendor/hashbrown/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "hashbrown" -version = "0.9.1" +version = "0.11.0" authors = ["Amanieu d'Antras "] exclude = [".travis.yml", "bors.toml", "/ci/*"] description = "A Rust port of Google's SwissTable hash map" @@ -25,7 +25,7 @@ repository = "https://github.com/rust-lang/hashbrown" [package.metadata.docs.rs] features = ["nightly", "rayon", "serde", "raw"] [dependencies.ahash] -version = "0.4.4" +version = "0.7.0" optional = true default-features = false @@ -34,6 +34,10 @@ version = "1.0.0" optional = true package = "rustc-std-workspace-alloc" +[dependencies.bumpalo] +version = "3.5.0" +optional = true + [dependencies.compiler_builtins] version = "0.1.2" optional = true @@ -54,8 +58,11 @@ default-features = false [dev-dependencies.doc-comment] version = "0.3.1" +[dev-dependencies.fnv] +version = "1.0.7" + [dev-dependencies.lazy_static] -version = "1.2" +version = "1.4" [dev-dependencies.rand] version = "0.7.3" @@ -64,9 +71,6 @@ features = ["small_rng"] [dev-dependencies.rayon] version = "1.0" -[dev-dependencies.rustc-hash] -version = "=1.0" - [dev-dependencies.serde_test] version = "1.0" diff --git a/vendor/hashbrown/README.md b/vendor/hashbrown/README.md index 2e431710fc..86664c4ce7 100644 --- a/vendor/hashbrown/README.md +++ b/vendor/hashbrown/README.md @@ -4,7 +4,7 @@ hashbrown [![Build Status](https://travis-ci.com/rust-lang/hashbrown.svg?branch=master)](https://travis-ci.com/rust-lang/hashbrown) [![Crates.io](https://img.shields.io/crates/v/hashbrown.svg)](https://crates.io/crates/hashbrown) [![Documentation](https://docs.rs/hashbrown/badge.svg)](https://docs.rs/hashbrown) -[![Rust](https://img.shields.io/badge/rust-1.36.0%2B-blue.svg?maxAge=3600)](https://github.com/rust-lang/hashbrown) +[![Rust](https://img.shields.io/badge/rust-1.49.0%2B-blue.svg?maxAge=3600)](https://github.com/rust-lang/hashbrown) This crate is a Rust port of Google's high-performance [SwissTable] hash map, adapted to make it a drop-in replacement for Rust's standard `HashMap` @@ -26,7 +26,8 @@ in environments without `std`, such as embedded systems and kernels. ## Features - Drop-in replacement for the standard library `HashMap` and `HashSet` types. -- Uses `AHash` as the default hasher, which is much faster than SipHash. +- Uses [AHash](https://github.com/tkaitchuck/aHash) as the default hasher, which is much faster than SipHash. + However, AHash does *not provide the same level of HashDoS resistance* as SipHash, so if that is important to you, you might want to consider using a different hasher. - Around 2x faster than the previous standard library `HashMap`. - Lower memory usage: only 1 byte of overhead per entry instead of 8. - Compatible with `#[no_std]` (but requires a global allocator with the `alloc` crate). @@ -37,47 +38,46 @@ in environments without `std`, such as embedded systems and kernels. Compared to the previous implementation of `std::collections::HashMap` (Rust 1.35). -With the hashbrown default AHash hasher (not HashDoS-resistant): - -```text - name oldstdhash ns/iter hashbrown ns/iter diff ns/iter diff % speedup - insert_ahash_highbits 20,846 7,397 -13,449 -64.52% x 2.82 - insert_ahash_random 20,515 7,796 -12,719 -62.00% x 2.63 - insert_ahash_serial 21,668 7,264 -14,404 -66.48% x 2.98 - insert_erase_ahash_highbits 29,570 17,498 -12,072 -40.83% x 1.69 - insert_erase_ahash_random 39,569 17,474 -22,095 -55.84% x 2.26 - insert_erase_ahash_serial 32,073 17,332 -14,741 -45.96% x 1.85 - iter_ahash_highbits 1,572 2,087 515 32.76% x 0.75 - iter_ahash_random 1,609 2,074 465 28.90% x 0.78 - iter_ahash_serial 2,293 2,120 -173 -7.54% x 1.08 - lookup_ahash_highbits 3,460 4,403 943 27.25% x 0.79 - lookup_ahash_random 6,377 3,911 -2,466 -38.67% x 1.63 - lookup_ahash_serial 3,629 3,586 -43 -1.18% x 1.01 - lookup_fail_ahash_highbits 5,286 3,411 -1,875 -35.47% x 1.55 - lookup_fail_ahash_random 12,365 4,171 -8,194 -66.27% x 2.96 - lookup_fail_ahash_serial 4,902 3,240 -1,662 -33.90% x 1.51 -``` - -With the libstd default SipHash hasher (HashDoS-resistant): - -```text - name oldstdhash ns/iter hashbrown ns/iter diff ns/iter diff % speedup - insert_std_highbits 32,598 20,199 -12,399 -38.04% x 1.61 - insert_std_random 29,824 20,760 -9,064 -30.39% x 1.44 - insert_std_serial 33,151 17,256 -15,895 -47.95% x 1.92 - insert_erase_std_highbits 74,731 48,735 -25,996 -34.79% x 1.53 - insert_erase_std_random 73,828 47,649 -26,179 -35.46% x 1.55 - insert_erase_std_serial 73,864 40,147 -33,717 -45.65% x 1.84 - iter_std_highbits 1,518 2,264 746 49.14% x 0.67 - iter_std_random 1,502 2,414 912 60.72% x 0.62 - iter_std_serial 6,361 2,118 -4,243 -66.70% x 3.00 - lookup_std_highbits 21,705 16,962 -4,743 -21.85% x 1.28 - lookup_std_random 21,654 17,158 -4,496 -20.76% x 1.26 - lookup_std_serial 18,726 14,509 -4,217 -22.52% x 1.29 - lookup_fail_std_highbits 25,852 17,323 -8,529 -32.99% x 1.49 - lookup_fail_std_random 25,913 17,760 -8,153 -31.46% x 1.46 - lookup_fail_std_serial 22,648 14,839 -7,809 -34.48% x 1.53 -``` +With the hashbrown default AHash hasher: + +| name | oldstdhash ns/iter | hashbrown ns/iter | diff ns/iter | diff % | speedup | +|:------------------------|:-------------------:|------------------:|:------------:|---------:|---------| +| insert_ahash_highbits | 18,865 | 8,020 | -10,845 | -57.49% | x 2.35 | +| insert_ahash_random | 19,711 | 8,019 | -11,692 | -59.32% | x 2.46 | +| insert_ahash_serial | 19,365 | 6,463 | -12,902 | -66.63% | x 3.00 | +| insert_erase_ahash_highbits | 51,136 | 17,916 | -33,220 | -64.96% | x 2.85 | +| insert_erase_ahash_random | 51,157 | 17,688 | -33,469 | -65.42% | x 2.89 | +| insert_erase_ahash_serial | 45,479 | 14,895 | -30,584 | -67.25% | x 3.05 | +| iter_ahash_highbits | 1,399 | 1,092 | -307 | -21.94% | x 1.28 | +| iter_ahash_random | 1,586 | 1,059 | -527 | -33.23% | x 1.50 | +| iter_ahash_serial | 3,168 | 1,079 | -2,089 | -65.94% | x 2.94 | +| lookup_ahash_highbits | 32,351 | 4,792 | -27,559 | -85.19% | x 6.75 | +| lookup_ahash_random | 17,419 | 4,817 | -12,602 | -72.35% | x 3.62 | +| lookup_ahash_serial | 15,254 | 3,606 | -11,648 | -76.36% | x 4.23 | +| lookup_fail_ahash_highbits | 21,187 | 4,369 | -16,818 | -79.38% | x 4.85 | +| lookup_fail_ahash_random | 21,550 | 4,395 | -17,155 | -79.61% | x 4.90 | +| lookup_fail_ahash_serial | 19,450 | 3,176 | -16,274 | -83.67% | x 6.12 | + + +With the libstd default SipHash hasher: + +|name | oldstdhash ns/iter | hashbrown ns/iter | diff ns/iter | diff % | speedup | +|:------------------------|:-------------------:|------------------:|:------------:|---------:|---------| +|insert_std_highbits |19,216 |16,885 | -2,331 | -12.13% | x 1.14 | +|insert_std_random |19,179 |17,034 | -2,145 | -11.18% | x 1.13 | +|insert_std_serial |19,462 |17,493 | -1,969 | -10.12% | x 1.11 | +|insert_erase_std_highbits |50,825 |35,847 | -14,978 | -29.47% | x 1.42 | +|insert_erase_std_random |51,448 |35,392 | -16,056 | -31.21% | x 1.45 | +|insert_erase_std_serial |87,711 |38,091 | -49,620 | -56.57% | x 2.30 | +|iter_std_highbits |1,378 |1,159 | -219 | -15.89% | x 1.19 | +|iter_std_random |1,395 |1,132 | -263 | -18.85% | x 1.23 | +|iter_std_serial |1,704 |1,105 | -599 | -35.15% | x 1.54 | +|lookup_std_highbits |17,195 |13,642 | -3,553 | -20.66% | x 1.26 | +|lookup_std_random |17,181 |13,773 | -3,408 | -19.84% | x 1.25 | +|lookup_std_serial |15,483 |13,651 | -1,832 | -11.83% | x 1.13 | +|lookup_fail_std_highbits |20,926 |13,474 | -7,452 | -35.61% | x 1.55 | +|lookup_fail_std_random |21,766 |13,505 | -8,261 | -37.95% | x 1.61 | +|lookup_fail_std_serial |19,336 |13,519 | -5,817 | -30.08% | x 1.43 | ## Usage @@ -85,7 +85,7 @@ Add this to your `Cargo.toml`: ```toml [dependencies] -hashbrown = "0.9" +hashbrown = "0.11" ``` Then: @@ -96,19 +96,19 @@ use hashbrown::HashMap; let mut map = HashMap::new(); map.insert(1, "one"); ``` - +## Flags This crate has the following Cargo features: -- `nightly`: Enables nightly-only features: `#[may_dangle]`. +- `nightly`: Enables nightly-only features including: `#[may_dangle]`. - `serde`: Enables serde serialization support. - `rayon`: Enables rayon parallel iterator support. - `raw`: Enables access to the experimental and unsafe `RawTable` API. - `inline-more`: Adds inline hints to most functions, improving run-time performance at the cost of compilation time. (enabled by default) +- `bumpalo`: Provides a `BumpWrapper` type which allows `bumpalo` to be used for memory allocation. - `ahash`: Compiles with ahash as default hasher. (enabled by default) -- `ahash-compile-time-rng`: Activates the `compile-time-rng` feature of ahash, to increase the - DOS-resistance, but can result in issues for `no_std` builds. More details in - [issue#124](https://github.com/rust-lang/hashbrown/issues/124). (enabled by default) +- `ahash-compile-time-rng`: Activates the `compile-time-rng` feature of ahash. For targets with no random number generator +this pre-generates seeds at compile time and embeds them as constants. See [aHash's documentation](https://github.com/tkaitchuck/aHash#flags) (disabled by default) ## License diff --git a/vendor/hashbrown/benches/bench.rs b/vendor/hashbrown/benches/bench.rs index 771e7169a5..568c513e10 100644 --- a/vendor/hashbrown/benches/bench.rs +++ b/vendor/hashbrown/benches/bench.rs @@ -9,8 +9,11 @@ extern crate test; use test::{black_box, Bencher}; use hashbrown::hash_map::DefaultHashBuilder; -use hashbrown::HashMap; -use std::collections::hash_map::RandomState; +use hashbrown::{HashMap, HashSet}; +use std::{ + collections::hash_map::RandomState, + sync::atomic::{self, AtomicUsize}, +}; const SIZE: usize = 1000; @@ -40,6 +43,20 @@ impl Iterator for RandomKeys { } } +// Just an arbitrary side effect to make the maps not shortcircuit to the non-dropping path +// when dropping maps/entries (most real world usages likely have drop in the key or value) +lazy_static::lazy_static! { + static ref SIDE_EFFECT: AtomicUsize = AtomicUsize::new(0); +} + +#[derive(Clone)] +struct DropType(usize); +impl Drop for DropType { + fn drop(&mut self) { + SIDE_EFFECT.fetch_add(self.0, atomic::Ordering::SeqCst); + } +} + macro_rules! bench_suite { ($bench_macro:ident, $bench_ahash_serial:ident, $bench_std_serial:ident, $bench_ahash_highbits:ident, $bench_std_highbits:ident, @@ -69,10 +86,11 @@ macro_rules! bench_insert { b.iter(|| { m.clear(); for i in ($keydist).take(SIZE) { - m.insert(i, i); + m.insert(i, (DropType(i), [i; 20])); } black_box(&mut m); - }) + }); + eprintln!("{}", SIDE_EFFECT.load(atomic::Ordering::SeqCst)); } }; } @@ -87,13 +105,38 @@ bench_suite!( insert_std_random ); +macro_rules! bench_grow_insert { + ($name:ident, $maptype:ident, $keydist:expr) => { + #[bench] + fn $name(b: &mut Bencher) { + b.iter(|| { + let mut m = $maptype::default(); + for i in ($keydist).take(SIZE) { + m.insert(i, DropType(i)); + } + black_box(&mut m); + }) + } + }; +} + +bench_suite!( + bench_grow_insert, + grow_insert_ahash_serial, + grow_insert_std_serial, + grow_insert_ahash_highbits, + grow_insert_std_highbits, + grow_insert_ahash_random, + grow_insert_std_random +); + macro_rules! bench_insert_erase { ($name:ident, $maptype:ident, $keydist:expr) => { #[bench] fn $name(b: &mut Bencher) { let mut base = $maptype::default(); for i in ($keydist).take(SIZE) { - base.insert(i, i); + base.insert(i, DropType(i)); } let skip = $keydist.skip(SIZE); b.iter(|| { @@ -103,11 +146,12 @@ macro_rules! bench_insert_erase { // While keeping the size constant, // replace the first keydist with the second. for (add, remove) in (&mut add_iter).zip(&mut remove_iter).take(SIZE) { - m.insert(add, add); + m.insert(add, DropType(add)); black_box(m.remove(&remove)); } black_box(m); - }) + }); + eprintln!("{}", SIDE_EFFECT.load(atomic::Ordering::SeqCst)); } }; } @@ -128,14 +172,15 @@ macro_rules! bench_lookup { fn $name(b: &mut Bencher) { let mut m = $maptype::default(); for i in $keydist.take(SIZE) { - m.insert(i, i); + m.insert(i, DropType(i)); } b.iter(|| { for i in $keydist.take(SIZE) { black_box(m.get(&i)); } - }) + }); + eprintln!("{}", SIDE_EFFECT.load(atomic::Ordering::SeqCst)); } }; } @@ -157,7 +202,7 @@ macro_rules! bench_lookup_fail { let mut m = $maptype::default(); let mut iter = $keydist; for i in (&mut iter).take(SIZE) { - m.insert(i, i); + m.insert(i, DropType(i)); } b.iter(|| { @@ -185,7 +230,7 @@ macro_rules! bench_iter { fn $name(b: &mut Bencher) { let mut m = $maptype::default(); for i in ($keydist).take(SIZE) { - m.insert(i, i); + m.insert(i, DropType(i)); } b.iter(|| { @@ -211,7 +256,7 @@ bench_suite!( fn clone_small(b: &mut Bencher) { let mut m = HashMap::new(); for i in 0..10 { - m.insert(i, i); + m.insert(i, DropType(i)); } b.iter(|| { @@ -224,7 +269,7 @@ fn clone_from_small(b: &mut Bencher) { let mut m = HashMap::new(); let mut m2 = HashMap::new(); for i in 0..10 { - m.insert(i, i); + m.insert(i, DropType(i)); } b.iter(|| { @@ -237,7 +282,7 @@ fn clone_from_small(b: &mut Bencher) { fn clone_large(b: &mut Bencher) { let mut m = HashMap::new(); for i in 0..1000 { - m.insert(i, i); + m.insert(i, DropType(i)); } b.iter(|| { @@ -250,7 +295,7 @@ fn clone_from_large(b: &mut Bencher) { let mut m = HashMap::new(); let mut m2 = HashMap::new(); for i in 0..1000 { - m.insert(i, i); + m.insert(i, DropType(i)); } b.iter(|| { @@ -258,3 +303,29 @@ fn clone_from_large(b: &mut Bencher) { black_box(&mut m2); }) } + +#[bench] +fn rehash_in_place(b: &mut Bencher) { + b.iter(|| { + let mut set = HashSet::new(); + + // Each loop triggers one rehash + for _ in 0..10 { + for i in 0..224 { + set.insert(i); + } + + assert_eq!( + set.capacity(), + 224, + "The set must be at or close to capacity to trigger a re hashing" + ); + + for i in 100..1400 { + set.remove(&(i - 100)); + set.insert(i); + } + set.clear(); + } + }); +} diff --git a/vendor/hashbrown/src/external_trait_impls/rayon/map.rs b/vendor/hashbrown/src/external_trait_impls/rayon/map.rs index 334f8bb58b..61b7380611 100644 --- a/vendor/hashbrown/src/external_trait_impls/rayon/map.rs +++ b/vendor/hashbrown/src/external_trait_impls/rayon/map.rs @@ -1,8 +1,11 @@ //! Rayon extensions for `HashMap`. +use super::raw::{RawIntoParIter, RawParDrain, RawParIter}; use crate::hash_map::HashMap; +use crate::raw::{Allocator, Global}; use core::fmt; use core::hash::{BuildHasher, Hash}; +use core::marker::PhantomData; use rayon::iter::plumbing::UnindexedConsumer; use rayon::iter::{FromParallelIterator, IntoParallelIterator, ParallelExtend, ParallelIterator}; @@ -15,11 +18,12 @@ use rayon::iter::{FromParallelIterator, IntoParallelIterator, ParallelExtend, Pa /// [`par_iter`]: /hashbrown/struct.HashMap.html#method.par_iter /// [`HashMap`]: /hashbrown/struct.HashMap.html /// [`IntoParallelRefIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelRefIterator.html -pub struct ParIter<'a, K, V, S> { - map: &'a HashMap, +pub struct ParIter<'a, K, V> { + inner: RawParIter<(K, V)>, + marker: PhantomData<(&'a K, &'a V)>, } -impl<'a, K: Sync, V: Sync, S: Sync> ParallelIterator for ParIter<'a, K, V, S> { +impl<'a, K: Sync, V: Sync> ParallelIterator for ParIter<'a, K, V> { type Item = (&'a K, &'a V); #[cfg_attr(feature = "inline-more", inline)] @@ -27,7 +31,7 @@ impl<'a, K: Sync, V: Sync, S: Sync> ParallelIterator for ParIter<'a, K, V, S> { where C: UnindexedConsumer, { - unsafe { self.map.table.par_iter() } + self.inner .map(|x| unsafe { let r = x.as_ref(); (&r.0, &r.1) @@ -36,16 +40,23 @@ impl<'a, K: Sync, V: Sync, S: Sync> ParallelIterator for ParIter<'a, K, V, S> { } } -impl Clone for ParIter<'_, K, V, S> { +impl Clone for ParIter<'_, K, V> { #[cfg_attr(feature = "inline-more", inline)] fn clone(&self) -> Self { - ParIter { map: self.map } + Self { + inner: self.inner.clone(), + marker: PhantomData, + } } } -impl fmt::Debug for ParIter<'_, K, V, S> { +impl fmt::Debug for ParIter<'_, K, V> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.map.iter().fmt(f) + let iter = unsafe { self.inner.iter() }.map(|x| unsafe { + let r = x.as_ref(); + (&r.0, &r.1) + }); + f.debug_list().entries(iter).finish() } } @@ -56,11 +67,12 @@ impl fmt::Debug for Pa /// /// [`par_keys`]: /hashbrown/struct.HashMap.html#method.par_keys /// [`HashMap`]: /hashbrown/struct.HashMap.html -pub struct ParKeys<'a, K, V, S> { - map: &'a HashMap, +pub struct ParKeys<'a, K, V> { + inner: RawParIter<(K, V)>, + marker: PhantomData<(&'a K, &'a V)>, } -impl<'a, K: Sync, V: Sync, S: Sync> ParallelIterator for ParKeys<'a, K, V, S> { +impl<'a, K: Sync, V: Sync> ParallelIterator for ParKeys<'a, K, V> { type Item = &'a K; #[cfg_attr(feature = "inline-more", inline)] @@ -68,22 +80,26 @@ impl<'a, K: Sync, V: Sync, S: Sync> ParallelIterator for ParKeys<'a, K, V, S> { where C: UnindexedConsumer, { - unsafe { self.map.table.par_iter() } + self.inner .map(|x| unsafe { &x.as_ref().0 }) .drive_unindexed(consumer) } } -impl Clone for ParKeys<'_, K, V, S> { +impl Clone for ParKeys<'_, K, V> { #[cfg_attr(feature = "inline-more", inline)] fn clone(&self) -> Self { - ParKeys { map: self.map } + Self { + inner: self.inner.clone(), + marker: PhantomData, + } } } -impl fmt::Debug for ParKeys<'_, K, V, S> { +impl fmt::Debug for ParKeys<'_, K, V> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.map.keys().fmt(f) + let iter = unsafe { self.inner.iter() }.map(|x| unsafe { &x.as_ref().0 }); + f.debug_list().entries(iter).finish() } } @@ -94,11 +110,12 @@ impl fmt::Debug for ParKeys<'_, K, /// /// [`par_values`]: /hashbrown/struct.HashMap.html#method.par_values /// [`HashMap`]: /hashbrown/struct.HashMap.html -pub struct ParValues<'a, K, V, S> { - map: &'a HashMap, +pub struct ParValues<'a, K, V> { + inner: RawParIter<(K, V)>, + marker: PhantomData<(&'a K, &'a V)>, } -impl<'a, K: Sync, V: Sync, S: Sync> ParallelIterator for ParValues<'a, K, V, S> { +impl<'a, K: Sync, V: Sync> ParallelIterator for ParValues<'a, K, V> { type Item = &'a V; #[cfg_attr(feature = "inline-more", inline)] @@ -106,22 +123,26 @@ impl<'a, K: Sync, V: Sync, S: Sync> ParallelIterator for ParValues<'a, K, V, S> where C: UnindexedConsumer, { - unsafe { self.map.table.par_iter() } + self.inner .map(|x| unsafe { &x.as_ref().1 }) .drive_unindexed(consumer) } } -impl Clone for ParValues<'_, K, V, S> { +impl Clone for ParValues<'_, K, V> { #[cfg_attr(feature = "inline-more", inline)] fn clone(&self) -> Self { - ParValues { map: self.map } + Self { + inner: self.inner.clone(), + marker: PhantomData, + } } } -impl fmt::Debug for ParValues<'_, K, V, S> { +impl fmt::Debug for ParValues<'_, K, V> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.map.values().fmt(f) + let iter = unsafe { self.inner.iter() }.map(|x| unsafe { &x.as_ref().1 }); + f.debug_list().entries(iter).finish() } } @@ -134,11 +155,12 @@ impl fmt::Debug for ParValues<'_, K /// [`par_iter_mut`]: /hashbrown/struct.HashMap.html#method.par_iter_mut /// [`HashMap`]: /hashbrown/struct.HashMap.html /// [`IntoParallelRefMutIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelRefMutIterator.html -pub struct ParIterMut<'a, K, V, S> { - map: &'a mut HashMap, +pub struct ParIterMut<'a, K, V> { + inner: RawParIter<(K, V)>, + marker: PhantomData<(&'a K, &'a mut V)>, } -impl<'a, K: Send + Sync, V: Send, S: Send> ParallelIterator for ParIterMut<'a, K, V, S> { +impl<'a, K: Sync, V: Send> ParallelIterator for ParIterMut<'a, K, V> { type Item = (&'a K, &'a mut V); #[cfg_attr(feature = "inline-more", inline)] @@ -146,7 +168,7 @@ impl<'a, K: Send + Sync, V: Send, S: Send> ParallelIterator for ParIterMut<'a, K where C: UnindexedConsumer, { - unsafe { self.map.table.par_iter() } + self.inner .map(|x| unsafe { let r = x.as_mut(); (&r.0, &mut r.1) @@ -155,11 +177,13 @@ impl<'a, K: Send + Sync, V: Send, S: Send> ParallelIterator for ParIterMut<'a, K } } -impl fmt::Debug - for ParIterMut<'_, K, V, S> -{ +impl fmt::Debug for ParIterMut<'_, K, V> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.map.iter().fmt(f) + ParIter { + inner: self.inner.clone(), + marker: PhantomData, + } + .fmt(f) } } @@ -170,11 +194,12 @@ impl fmt::Debug /// /// [`par_values_mut`]: /hashbrown/struct.HashMap.html#method.par_values_mut /// [`HashMap`]: /hashbrown/struct.HashMap.html -pub struct ParValuesMut<'a, K, V, S> { - map: &'a mut HashMap, +pub struct ParValuesMut<'a, K, V> { + inner: RawParIter<(K, V)>, + marker: PhantomData<(&'a K, &'a mut V)>, } -impl<'a, K: Send, V: Send, S: Send> ParallelIterator for ParValuesMut<'a, K, V, S> { +impl<'a, K: Sync, V: Send> ParallelIterator for ParValuesMut<'a, K, V> { type Item = &'a mut V; #[cfg_attr(feature = "inline-more", inline)] @@ -182,15 +207,19 @@ impl<'a, K: Send, V: Send, S: Send> ParallelIterator for ParValuesMut<'a, K, V, where C: UnindexedConsumer, { - unsafe { self.map.table.par_iter() } + self.inner .map(|x| unsafe { &mut x.as_mut().1 }) .drive_unindexed(consumer) } } -impl fmt::Debug for ParValuesMut<'_, K, V, S> { +impl fmt::Debug for ParValuesMut<'_, K, V> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.map.values().fmt(f) + ParValues { + inner: self.inner.clone(), + marker: PhantomData, + } + .fmt(f) } } @@ -203,11 +232,11 @@ impl fmt::Debug for ParValuesMut<'_ /// [`into_par_iter`]: /hashbrown/struct.HashMap.html#method.into_par_iter /// [`HashMap`]: /hashbrown/struct.HashMap.html /// [`IntoParallelIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelIterator.html -pub struct IntoParIter { - map: HashMap, +pub struct IntoParIter { + inner: RawIntoParIter<(K, V), A>, } -impl ParallelIterator for IntoParIter { +impl ParallelIterator for IntoParIter { type Item = (K, V); #[cfg_attr(feature = "inline-more", inline)] @@ -215,13 +244,19 @@ impl ParallelIterator for IntoParIter { where C: UnindexedConsumer, { - self.map.table.into_par_iter().drive_unindexed(consumer) + self.inner.drive_unindexed(consumer) } } -impl fmt::Debug for IntoParIter { +impl fmt::Debug + for IntoParIter +{ fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.map.iter().fmt(f) + ParIter { + inner: unsafe { self.inner.par_iter() }, + marker: PhantomData, + } + .fmt(f) } } @@ -232,11 +267,11 @@ impl fmt::Debug for In /// /// [`par_drain`]: /hashbrown/struct.HashMap.html#method.par_drain /// [`HashMap`]: /hashbrown/struct.HashMap.html -pub struct ParDrain<'a, K, V, S> { - map: &'a mut HashMap, +pub struct ParDrain<'a, K, V, A: Allocator + Clone = Global> { + inner: RawParDrain<'a, (K, V), A>, } -impl ParallelIterator for ParDrain<'_, K, V, S> { +impl ParallelIterator for ParDrain<'_, K, V, A> { type Item = (K, V); #[cfg_attr(feature = "inline-more", inline)] @@ -244,52 +279,68 @@ impl ParallelIterator for ParDrain<'_, K, V, S> { where C: UnindexedConsumer, { - self.map.table.par_drain().drive_unindexed(consumer) + self.inner.drive_unindexed(consumer) } } -impl fmt::Debug - for ParDrain<'_, K, V, S> +impl fmt::Debug + for ParDrain<'_, K, V, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - self.map.iter().fmt(f) + ParIter { + inner: unsafe { self.inner.par_iter() }, + marker: PhantomData, + } + .fmt(f) } } -impl HashMap { +impl HashMap { /// Visits (potentially in parallel) immutably borrowed keys in an arbitrary order. #[cfg_attr(feature = "inline-more", inline)] - pub fn par_keys(&self) -> ParKeys<'_, K, V, S> { - ParKeys { map: self } + pub fn par_keys(&self) -> ParKeys<'_, K, V> { + ParKeys { + inner: unsafe { self.table.par_iter() }, + marker: PhantomData, + } } /// Visits (potentially in parallel) immutably borrowed values in an arbitrary order. #[cfg_attr(feature = "inline-more", inline)] - pub fn par_values(&self) -> ParValues<'_, K, V, S> { - ParValues { map: self } + pub fn par_values(&self) -> ParValues<'_, K, V> { + ParValues { + inner: unsafe { self.table.par_iter() }, + marker: PhantomData, + } } } -impl HashMap { +impl HashMap { /// Visits (potentially in parallel) mutably borrowed values in an arbitrary order. #[cfg_attr(feature = "inline-more", inline)] - pub fn par_values_mut(&mut self) -> ParValuesMut<'_, K, V, S> { - ParValuesMut { map: self } + pub fn par_values_mut(&mut self) -> ParValuesMut<'_, K, V> { + ParValuesMut { + inner: unsafe { self.table.par_iter() }, + marker: PhantomData, + } } /// Consumes (potentially in parallel) all values in an arbitrary order, /// while preserving the map's allocated memory for reuse. #[cfg_attr(feature = "inline-more", inline)] - pub fn par_drain(&mut self) -> ParDrain<'_, K, V, S> { - ParDrain { map: self } + pub fn par_drain(&mut self) -> ParDrain<'_, K, V, A> { + ParDrain { + inner: self.table.par_drain(), + } } } -impl HashMap +impl HashMap where K: Eq + Hash + Sync, V: PartialEq + Sync, S: BuildHasher + Sync, + A: Allocator + Clone + Sync, { /// Returns `true` if the map is equal to another, /// i.e. both maps contain the same keys mapped to the same values. @@ -303,33 +354,47 @@ where } } -impl IntoParallelIterator for HashMap { +impl IntoParallelIterator + for HashMap +{ type Item = (K, V); - type Iter = IntoParIter; + type Iter = IntoParIter; #[cfg_attr(feature = "inline-more", inline)] fn into_par_iter(self) -> Self::Iter { - IntoParIter { map: self } + IntoParIter { + inner: self.table.into_par_iter(), + } } } -impl<'a, K: Sync, V: Sync, S: Sync> IntoParallelIterator for &'a HashMap { +impl<'a, K: Sync, V: Sync, S, A: Allocator + Clone> IntoParallelIterator + for &'a HashMap +{ type Item = (&'a K, &'a V); - type Iter = ParIter<'a, K, V, S>; + type Iter = ParIter<'a, K, V>; #[cfg_attr(feature = "inline-more", inline)] fn into_par_iter(self) -> Self::Iter { - ParIter { map: self } + ParIter { + inner: unsafe { self.table.par_iter() }, + marker: PhantomData, + } } } -impl<'a, K: Send + Sync, V: Send, S: Send> IntoParallelIterator for &'a mut HashMap { +impl<'a, K: Sync, V: Send, S, A: Allocator + Clone> IntoParallelIterator + for &'a mut HashMap +{ type Item = (&'a K, &'a mut V); - type Iter = ParIterMut<'a, K, V, S>; + type Iter = ParIterMut<'a, K, V>; #[cfg_attr(feature = "inline-more", inline)] fn into_par_iter(self) -> Self::Iter { - ParIterMut { map: self } + ParIterMut { + inner: unsafe { self.table.par_iter() }, + marker: PhantomData, + } } } @@ -337,7 +402,7 @@ impl<'a, K: Send + Sync, V: Send, S: Send> IntoParallelIterator for &'a mut Hash /// hashmap. If multiple pairs correspond to the same key, then the /// ones produced earlier in the parallel iterator will be /// overwritten, just as with a sequential iterator. -impl FromParallelIterator<(K, V)> for HashMap +impl FromParallelIterator<(K, V)> for HashMap where K: Eq + Hash + Send, V: Send, @@ -354,11 +419,12 @@ where } /// Extend a hash map with items from a parallel iterator. -impl ParallelExtend<(K, V)> for HashMap +impl ParallelExtend<(K, V)> for HashMap where K: Eq + Hash + Send, V: Send, S: BuildHasher, + A: Allocator + Clone, { fn par_extend(&mut self, par_iter: I) where @@ -369,11 +435,12 @@ where } /// Extend a hash map with copied items from a parallel iterator. -impl<'a, K, V, S> ParallelExtend<(&'a K, &'a V)> for HashMap +impl<'a, K, V, S, A> ParallelExtend<(&'a K, &'a V)> for HashMap where K: Copy + Eq + Hash + Sync, V: Copy + Sync, S: BuildHasher, + A: Allocator + Clone, { fn par_extend(&mut self, par_iter: I) where @@ -384,12 +451,13 @@ where } // This is equal to the normal `HashMap` -- no custom advantage. -fn extend(map: &mut HashMap, par_iter: I) +fn extend(map: &mut HashMap, par_iter: I) where K: Eq + Hash, S: BuildHasher, I: IntoParallelIterator, - HashMap: Extend, + A: Allocator + Clone, + HashMap: Extend, { let (list, len) = super::helpers::collect(par_iter); diff --git a/vendor/hashbrown/src/external_trait_impls/rayon/raw.rs b/vendor/hashbrown/src/external_trait_impls/rayon/raw.rs index 1bd2c1779c..18da1eacdc 100644 --- a/vendor/hashbrown/src/external_trait_impls/rayon/raw.rs +++ b/vendor/hashbrown/src/external_trait_impls/rayon/raw.rs @@ -1,5 +1,5 @@ use crate::raw::Bucket; -use crate::raw::{RawIter, RawIterRange, RawTable}; +use crate::raw::{Allocator, Global, RawIter, RawIterRange, RawTable}; use crate::scopeguard::guard; use alloc::alloc::dealloc; use core::marker::PhantomData; @@ -15,6 +15,22 @@ pub struct RawParIter { iter: RawIterRange, } +impl RawParIter { + #[cfg_attr(feature = "inline-more", inline)] + pub(super) unsafe fn iter(&self) -> RawIterRange { + self.iter.clone() + } +} + +impl Clone for RawParIter { + #[cfg_attr(feature = "inline-more", inline)] + fn clone(&self) -> Self { + Self { + iter: self.iter.clone(), + } + } +} + impl From> for RawParIter { fn from(it: RawIter) -> Self { RawParIter { iter: it.iter } @@ -60,11 +76,18 @@ impl UnindexedProducer for ParIterProducer { } /// Parallel iterator which consumes a table and returns elements. -pub struct RawIntoParIter { - table: RawTable, +pub struct RawIntoParIter { + table: RawTable, } -impl ParallelIterator for RawIntoParIter { +impl RawIntoParIter { + #[cfg_attr(feature = "inline-more", inline)] + pub(super) unsafe fn par_iter(&self) -> RawParIter { + self.table.par_iter() + } +} + +impl ParallelIterator for RawIntoParIter { type Item = T; #[cfg_attr(feature = "inline-more", inline)] @@ -73,7 +96,7 @@ impl ParallelIterator for RawIntoParIter { C: UnindexedConsumer, { let iter = unsafe { self.table.iter().iter }; - let _guard = guard(self.table.into_alloc(), |alloc| { + let _guard = guard(self.table.into_allocation(), |alloc| { if let Some((ptr, layout)) = *alloc { unsafe { dealloc(ptr.as_ptr(), layout); @@ -86,16 +109,23 @@ impl ParallelIterator for RawIntoParIter { } /// Parallel iterator which consumes elements without freeing the table storage. -pub struct RawParDrain<'a, T> { +pub struct RawParDrain<'a, T, A: Allocator + Clone = Global> { // We don't use a &'a mut RawTable because we want RawParDrain to be // covariant over T. - table: NonNull>, - marker: PhantomData<&'a RawTable>, + table: NonNull>, + marker: PhantomData<&'a RawTable>, } -unsafe impl Send for RawParDrain<'_, T> {} +unsafe impl Send for RawParDrain<'_, T, A> {} + +impl RawParDrain<'_, T, A> { + #[cfg_attr(feature = "inline-more", inline)] + pub(super) unsafe fn par_iter(&self) -> RawParIter { + self.table.as_ref().par_iter() + } +} -impl ParallelIterator for RawParDrain<'_, T> { +impl ParallelIterator for RawParDrain<'_, T, A> { type Item = T; #[cfg_attr(feature = "inline-more", inline)] @@ -113,7 +143,7 @@ impl ParallelIterator for RawParDrain<'_, T> { } } -impl Drop for RawParDrain<'_, T> { +impl Drop for RawParDrain<'_, T, A> { fn drop(&mut self) { // If drive_unindexed is not called then simply clear the table. unsafe { self.table.as_mut().clear() } @@ -172,7 +202,7 @@ impl Drop for ParDrainProducer { } } -impl RawTable { +impl RawTable { /// Returns a parallel iterator over the elements in a `RawTable`. #[cfg_attr(feature = "inline-more", inline)] pub unsafe fn par_iter(&self) -> RawParIter { @@ -183,14 +213,14 @@ impl RawTable { /// Returns a parallel iterator over the elements in a `RawTable`. #[cfg_attr(feature = "inline-more", inline)] - pub fn into_par_iter(self) -> RawIntoParIter { + pub fn into_par_iter(self) -> RawIntoParIter { RawIntoParIter { table: self } } /// Returns a parallel iterator which consumes all elements of a `RawTable` /// without freeing its memory allocation. #[cfg_attr(feature = "inline-more", inline)] - pub fn par_drain(&mut self) -> RawParDrain<'_, T> { + pub fn par_drain(&mut self) -> RawParDrain<'_, T, A> { RawParDrain { table: NonNull::from(self), marker: PhantomData, diff --git a/vendor/hashbrown/src/external_trait_impls/rayon/set.rs b/vendor/hashbrown/src/external_trait_impls/rayon/set.rs index 53d2660d58..ee4f6e6693 100644 --- a/vendor/hashbrown/src/external_trait_impls/rayon/set.rs +++ b/vendor/hashbrown/src/external_trait_impls/rayon/set.rs @@ -1,6 +1,8 @@ //! Rayon extensions for `HashSet`. +use super::map; use crate::hash_set::HashSet; +use crate::raw::{Allocator, Global}; use core::hash::{BuildHasher, Hash}; use rayon::iter::plumbing::UnindexedConsumer; use rayon::iter::{FromParallelIterator, IntoParallelIterator, ParallelExtend, ParallelIterator}; @@ -14,22 +16,18 @@ use rayon::iter::{FromParallelIterator, IntoParallelIterator, ParallelExtend, Pa /// [`into_par_iter`]: /hashbrown/struct.HashSet.html#method.into_par_iter /// [`HashSet`]: /hashbrown/struct.HashSet.html /// [`IntoParallelIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelIterator.html -pub struct IntoParIter { - set: HashSet, +pub struct IntoParIter { + inner: map::IntoParIter, } -impl ParallelIterator for IntoParIter { +impl ParallelIterator for IntoParIter { type Item = T; fn drive_unindexed(self, consumer: C) -> C::Result where C: UnindexedConsumer, { - self.set - .map - .into_par_iter() - .map(|(k, _)| k) - .drive_unindexed(consumer) + self.inner.map(|(k, _)| k).drive_unindexed(consumer) } } @@ -40,22 +38,18 @@ impl ParallelIterator for IntoParIter { /// /// [`par_drain`]: /hashbrown/struct.HashSet.html#method.par_drain /// [`HashSet`]: /hashbrown/struct.HashSet.html -pub struct ParDrain<'a, T, S> { - set: &'a mut HashSet, +pub struct ParDrain<'a, T, A: Allocator + Clone = Global> { + inner: map::ParDrain<'a, T, (), A>, } -impl ParallelIterator for ParDrain<'_, T, S> { +impl ParallelIterator for ParDrain<'_, T, A> { type Item = T; fn drive_unindexed(self, consumer: C) -> C::Result where C: UnindexedConsumer, { - self.set - .map - .par_drain() - .map(|(k, _)| k) - .drive_unindexed(consumer) + self.inner.map(|(k, _)| k).drive_unindexed(consumer) } } @@ -68,18 +62,18 @@ impl ParallelIterator for ParDrain<'_, T, S> { /// [`par_iter`]: /hashbrown/struct.HashSet.html#method.par_iter /// [`HashSet`]: /hashbrown/struct.HashSet.html /// [`IntoParallelRefIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelRefIterator.html -pub struct ParIter<'a, T, S> { - set: &'a HashSet, +pub struct ParIter<'a, T> { + inner: map::ParKeys<'a, T, ()>, } -impl<'a, T: Sync, S: Sync> ParallelIterator for ParIter<'a, T, S> { +impl<'a, T: Sync> ParallelIterator for ParIter<'a, T> { type Item = &'a T; fn drive_unindexed(self, consumer: C) -> C::Result where C: UnindexedConsumer, { - self.set.map.par_keys().drive_unindexed(consumer) + self.inner.drive_unindexed(consumer) } } @@ -91,15 +85,16 @@ impl<'a, T: Sync, S: Sync> ParallelIterator for ParIter<'a, T, S> { /// /// [`par_difference`]: /hashbrown/struct.HashSet.html#method.par_difference /// [`HashSet`]: /hashbrown/struct.HashSet.html -pub struct ParDifference<'a, T, S> { - a: &'a HashSet, - b: &'a HashSet, +pub struct ParDifference<'a, T, S, A: Allocator + Clone = Global> { + a: &'a HashSet, + b: &'a HashSet, } -impl<'a, T, S> ParallelIterator for ParDifference<'a, T, S> +impl<'a, T, S, A> ParallelIterator for ParDifference<'a, T, S, A> where T: Eq + Hash + Sync, S: BuildHasher + Sync, + A: Allocator + Clone + Sync, { type Item = &'a T; @@ -123,15 +118,16 @@ where /// /// [`par_symmetric_difference`]: /hashbrown/struct.HashSet.html#method.par_symmetric_difference /// [`HashSet`]: /hashbrown/struct.HashSet.html -pub struct ParSymmetricDifference<'a, T, S> { - a: &'a HashSet, - b: &'a HashSet, +pub struct ParSymmetricDifference<'a, T, S, A: Allocator + Clone = Global> { + a: &'a HashSet, + b: &'a HashSet, } -impl<'a, T, S> ParallelIterator for ParSymmetricDifference<'a, T, S> +impl<'a, T, S, A> ParallelIterator for ParSymmetricDifference<'a, T, S, A> where T: Eq + Hash + Sync, S: BuildHasher + Sync, + A: Allocator + Clone + Sync, { type Item = &'a T; @@ -154,15 +150,16 @@ where /// /// [`par_intersection`]: /hashbrown/struct.HashSet.html#method.par_intersection /// [`HashSet`]: /hashbrown/struct.HashSet.html -pub struct ParIntersection<'a, T, S> { - a: &'a HashSet, - b: &'a HashSet, +pub struct ParIntersection<'a, T, S, A: Allocator + Clone = Global> { + a: &'a HashSet, + b: &'a HashSet, } -impl<'a, T, S> ParallelIterator for ParIntersection<'a, T, S> +impl<'a, T, S, A> ParallelIterator for ParIntersection<'a, T, S, A> where T: Eq + Hash + Sync, S: BuildHasher + Sync, + A: Allocator + Clone + Sync, { type Item = &'a T; @@ -184,15 +181,16 @@ where /// /// [`par_union`]: /hashbrown/struct.HashSet.html#method.par_union /// [`HashSet`]: /hashbrown/struct.HashSet.html -pub struct ParUnion<'a, T, S> { - a: &'a HashSet, - b: &'a HashSet, +pub struct ParUnion<'a, T, S, A: Allocator + Clone = Global> { + a: &'a HashSet, + b: &'a HashSet, } -impl<'a, T, S> ParallelIterator for ParUnion<'a, T, S> +impl<'a, T, S, A> ParallelIterator for ParUnion<'a, T, S, A> where T: Eq + Hash + Sync, S: BuildHasher + Sync, + A: Allocator + Clone + Sync, { type Item = &'a T; @@ -200,22 +198,37 @@ where where C: UnindexedConsumer, { - self.a + // We'll iterate one set in full, and only the remaining difference from the other. + // Use the smaller set for the difference in order to reduce hash lookups. + let (smaller, larger) = if self.a.len() <= self.b.len() { + (self.a, self.b) + } else { + (self.b, self.a) + }; + larger .into_par_iter() - .chain(self.b.par_difference(self.a)) + .chain(smaller.par_difference(larger)) .drive_unindexed(consumer) } } -impl HashSet +impl HashSet where T: Eq + Hash + Sync, S: BuildHasher + Sync, + A: Allocator + Clone + Sync, { + /// Visits (potentially in parallel) the values representing the union, + /// i.e. all the values in `self` or `other`, without duplicates. + #[cfg_attr(feature = "inline-more", inline)] + pub fn par_union<'a>(&'a self, other: &'a Self) -> ParUnion<'a, T, S, A> { + ParUnion { a: self, b: other } + } + /// Visits (potentially in parallel) the values representing the difference, /// i.e. the values that are in `self` but not in `other`. #[cfg_attr(feature = "inline-more", inline)] - pub fn par_difference<'a>(&'a self, other: &'a Self) -> ParDifference<'a, T, S> { + pub fn par_difference<'a>(&'a self, other: &'a Self) -> ParDifference<'a, T, S, A> { ParDifference { a: self, b: other } } @@ -225,24 +238,17 @@ where pub fn par_symmetric_difference<'a>( &'a self, other: &'a Self, - ) -> ParSymmetricDifference<'a, T, S> { + ) -> ParSymmetricDifference<'a, T, S, A> { ParSymmetricDifference { a: self, b: other } } /// Visits (potentially in parallel) the values representing the /// intersection, i.e. the values that are both in `self` and `other`. #[cfg_attr(feature = "inline-more", inline)] - pub fn par_intersection<'a>(&'a self, other: &'a Self) -> ParIntersection<'a, T, S> { + pub fn par_intersection<'a>(&'a self, other: &'a Self) -> ParIntersection<'a, T, S, A> { ParIntersection { a: self, b: other } } - /// Visits (potentially in parallel) the values representing the union, - /// i.e. all the values in `self` or `other`, without duplicates. - #[cfg_attr(feature = "inline-more", inline)] - pub fn par_union<'a>(&'a self, other: &'a Self) -> ParUnion<'a, T, S> { - ParUnion { a: self, b: other } - } - /// Returns `true` if `self` has no elements in common with `other`. /// This is equivalent to checking for an empty intersection. /// @@ -280,41 +286,47 @@ where } } -impl HashSet +impl HashSet where T: Eq + Hash + Send, - S: BuildHasher + Send, + A: Allocator + Clone + Send, { /// Consumes (potentially in parallel) all values in an arbitrary order, /// while preserving the set's allocated memory for reuse. #[cfg_attr(feature = "inline-more", inline)] - pub fn par_drain(&mut self) -> ParDrain<'_, T, S> { - ParDrain { set: self } + pub fn par_drain(&mut self) -> ParDrain<'_, T, A> { + ParDrain { + inner: self.map.par_drain(), + } } } -impl IntoParallelIterator for HashSet { +impl IntoParallelIterator for HashSet { type Item = T; - type Iter = IntoParIter; + type Iter = IntoParIter; #[cfg_attr(feature = "inline-more", inline)] fn into_par_iter(self) -> Self::Iter { - IntoParIter { set: self } + IntoParIter { + inner: self.map.into_par_iter(), + } } } -impl<'a, T: Sync, S: Sync> IntoParallelIterator for &'a HashSet { +impl<'a, T: Sync, S, A: Allocator + Clone> IntoParallelIterator for &'a HashSet { type Item = &'a T; - type Iter = ParIter<'a, T, S>; + type Iter = ParIter<'a, T>; #[cfg_attr(feature = "inline-more", inline)] fn into_par_iter(self) -> Self::Iter { - ParIter { set: self } + ParIter { + inner: self.map.par_keys(), + } } } /// Collect values from a parallel iterator into a hashset. -impl FromParallelIterator for HashSet +impl FromParallelIterator for HashSet where T: Eq + Hash + Send, S: BuildHasher + Default, @@ -330,7 +342,7 @@ where } /// Extend a hash set with items from a parallel iterator. -impl ParallelExtend for HashSet +impl ParallelExtend for HashSet where T: Eq + Hash + Send, S: BuildHasher, @@ -344,7 +356,7 @@ where } /// Extend a hash set with copied items from a parallel iterator. -impl<'a, T, S> ParallelExtend<&'a T> for HashSet +impl<'a, T, S> ParallelExtend<&'a T> for HashSet where T: 'a + Copy + Eq + Hash + Sync, S: BuildHasher, @@ -358,12 +370,13 @@ where } // This is equal to the normal `HashSet` -- no custom advantage. -fn extend(set: &mut HashSet, par_iter: I) +fn extend(set: &mut HashSet, par_iter: I) where T: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, I: IntoParallelIterator, - HashSet: Extend, + HashSet: Extend, { let (list, len) = super::helpers::collect(par_iter); diff --git a/vendor/hashbrown/src/lib.rs b/vendor/hashbrown/src/lib.rs index 3aff40a4ff..af3c3a44e0 100644 --- a/vendor/hashbrown/src/lib.rs +++ b/vendor/hashbrown/src/lib.rs @@ -12,13 +12,25 @@ #![no_std] #![cfg_attr( feature = "nightly", - feature(test, core_intrinsics, dropck_eyepatch, min_specialization, extend_one) + feature( + test, + core_intrinsics, + dropck_eyepatch, + min_specialization, + extend_one, + allocator_api, + slice_ptr_get, + nonnull_slice_from_raw_parts, + maybe_uninit_array_assume_init + ) )] #![allow( clippy::doc_markdown, clippy::module_name_repetitions, clippy::must_use_candidate, - clippy::option_if_let_else + clippy::option_if_let_else, + clippy::redundant_else, + clippy::manual_map )] #![warn(missing_docs)] #![warn(rust_2018_idioms)] @@ -48,6 +60,11 @@ pub mod raw { pub use inner::*; #[cfg(feature = "rayon")] + /// [rayon]-based parallel iterator types for hash maps. + /// You will rarely need to interact with it directly unless you have need + /// to name one of the iterator types. + /// + /// [rayon]: https://docs.rs/rayon/1.0/rayon pub mod rayon { pub use crate::external_trait_impls::rayon::raw::*; } @@ -110,3 +127,35 @@ pub enum TryReserveError { layout: alloc::alloc::Layout, }, } + +/// The error type for [`RawTable::get_each_mut`](crate::raw::RawTable::get_each_mut), +/// [`HashMap::get_each_mut`], and [`HashMap::get_each_key_value_mut`]. +#[cfg(feature = "nightly")] +#[derive(Clone, PartialEq, Eq, Debug)] +pub enum UnavailableMutError { + /// The requested entry is not present in the table. + Absent, + /// The requested entry is present, but a mutable reference to it was already created and + /// returned from this call to `get_each_mut` or `get_each_key_value_mut`. + /// + /// Includes the index of the existing mutable reference in the returned array. + Duplicate(usize), +} + +/// Wrapper around `Bump` which allows it to be used as an allocator for +/// `HashMap`, `HashSet` and `RawTable`. +/// +/// `Bump` can be used directly without this wrapper on nightly if you enable +/// the `allocator-api` feature of the `bumpalo` crate. +#[cfg(feature = "bumpalo")] +#[derive(Clone, Copy, Debug)] +pub struct BumpWrapper<'a>(&'a bumpalo::Bump); + +#[cfg(feature = "bumpalo")] +#[test] +fn test_bumpalo() { + use bumpalo::Bump; + let bump = Bump::new(); + let mut map = HashMap::new_in(BumpWrapper(&bump)); + map.insert(0, 1); +} diff --git a/vendor/hashbrown/src/map.rs b/vendor/hashbrown/src/map.rs index 1ccba3157d..717eac6062 100644 --- a/vendor/hashbrown/src/map.rs +++ b/vendor/hashbrown/src/map.rs @@ -1,11 +1,15 @@ -use crate::raw::{Bucket, RawDrain, RawIntoIter, RawIter, RawTable}; +use crate::raw::{Allocator, Bucket, Global, RawDrain, RawIntoIter, RawIter, RawTable}; use crate::TryReserveError; +#[cfg(feature = "nightly")] +use crate::UnavailableMutError; use core::borrow::Borrow; use core::fmt::{self, Debug}; -use core::hash::{BuildHasher, Hash, Hasher}; +use core::hash::{BuildHasher, Hash}; use core::iter::{FromIterator, FusedIterator}; use core::marker::PhantomData; use core::mem; +#[cfg(feature = "nightly")] +use core::mem::MaybeUninit; use core::ops::Index; /// Default hasher for `HashMap`. @@ -185,9 +189,9 @@ pub enum DefaultHashBuilder {} /// .iter().cloned().collect(); /// // use the values stored in map /// ``` -pub struct HashMap { +pub struct HashMap { pub(crate) hash_builder: S, - pub(crate) table: RawTable<(K, V)>, + pub(crate) table: RawTable<(K, V), A>, } impl Clone for HashMap { @@ -206,8 +210,60 @@ impl Clone for HashMap { } } +/// Ensures that a single closure type across uses of this which, in turn prevents multiple +/// instances of any functions like RawTable::reserve from being generated #[cfg_attr(feature = "inline-more", inline)] -pub(crate) fn make_hash(hash_builder: &impl BuildHasher, val: &K) -> u64 { +pub(crate) fn make_hasher(hash_builder: &S) -> impl Fn(&(Q, V)) -> u64 + '_ +where + K: Borrow, + Q: Hash, + S: BuildHasher, +{ + move |val| make_hash::(hash_builder, &val.0) +} + +/// Ensures that a single closure type across uses of this which, in turn prevents multiple +/// instances of any functions like RawTable::reserve from being generated +#[cfg_attr(feature = "inline-more", inline)] +fn equivalent_key(k: &Q) -> impl Fn(&(K, V)) -> bool + '_ +where + K: Borrow, + Q: ?Sized + Eq, +{ + move |x| k.eq(x.0.borrow()) +} + +/// Ensures that a single closure type across uses of this which, in turn prevents multiple +/// instances of any functions like RawTable::reserve from being generated +#[cfg_attr(feature = "inline-more", inline)] +fn equivalent(k: &Q) -> impl Fn(&K) -> bool + '_ +where + K: Borrow, + Q: ?Sized + Eq, +{ + move |x| k.eq(x.borrow()) +} + +#[cfg_attr(feature = "inline-more", inline)] +pub(crate) fn make_hash(hash_builder: &S, val: &Q) -> u64 +where + K: Borrow, + Q: Hash + ?Sized, + S: BuildHasher, +{ + use core::hash::Hasher; + let mut state = hash_builder.build_hasher(); + val.hash(&mut state); + state.finish() +} + +#[cfg_attr(feature = "inline-more", inline)] +pub(crate) fn make_insert_hash(hash_builder: &S, val: &K) -> u64 +where + K: Hash, + S: BuildHasher, +{ + use core::hash::Hasher; let mut state = hash_builder.build_hasher(); val.hash(&mut state); state.finish() @@ -248,6 +304,27 @@ impl HashMap { } } +#[cfg(feature = "ahash")] +impl HashMap { + /// Creates an empty `HashMap` using the given allocator. + /// + /// The hash map is initially created with a capacity of 0, so it will not allocate until it + /// is first inserted into. + #[cfg_attr(feature = "inline-more", inline)] + pub fn new_in(alloc: A) -> Self { + Self::with_hasher_in(DefaultHashBuilder::default(), alloc) + } + + /// Creates an empty `HashMap` with the specified capacity using the given allocator. + /// + /// The hash map will be able to hold at least `capacity` elements without + /// reallocating. If `capacity` is 0, the hash map will not allocate. + #[cfg_attr(feature = "inline-more", inline)] + pub fn with_capacity_in(capacity: usize, alloc: A) -> Self { + Self::with_capacity_and_hasher_in(capacity, DefaultHashBuilder::default(), alloc) + } +} + impl HashMap { /// Creates an empty `HashMap` which will use the given hash builder to hash /// keys. @@ -315,6 +392,65 @@ impl HashMap { table: RawTable::with_capacity(capacity), } } +} + +impl HashMap { + /// Creates an empty `HashMap` which will use the given hash builder to hash + /// keys. It will be allocated with the given allocator. + /// + /// The created map has the default initial capacity. + /// + /// Warning: `hash_builder` is normally randomly generated, and + /// is designed to allow HashMaps to be resistant to attacks that + /// cause many collisions and very poor performance. Setting it + /// manually using this function can expose a DoS attack vector. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::DefaultHashBuilder; + /// + /// let s = DefaultHashBuilder::default(); + /// let mut map = HashMap::with_hasher(s); + /// map.insert(1, 2); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn with_hasher_in(hash_builder: S, alloc: A) -> Self { + Self { + hash_builder, + table: RawTable::new_in(alloc), + } + } + + /// Creates an empty `HashMap` with the specified capacity, using `hash_builder` + /// to hash the keys. It will be allocated with the given allocator. + /// + /// The hash map will be able to hold at least `capacity` elements without + /// reallocating. If `capacity` is 0, the hash map will not allocate. + /// + /// Warning: `hash_builder` is normally randomly generated, and + /// is designed to allow HashMaps to be resistant to attacks that + /// cause many collisions and very poor performance. Setting it + /// manually using this function can expose a DoS attack vector. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashMap; + /// use hashbrown::hash_map::DefaultHashBuilder; + /// + /// let s = DefaultHashBuilder::default(); + /// let mut map = HashMap::with_capacity_and_hasher(10, s); + /// map.insert(1, 2); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn with_capacity_and_hasher_in(capacity: usize, hash_builder: S, alloc: A) -> Self { + Self { + hash_builder, + table: RawTable::with_capacity_in(capacity, alloc), + } + } /// Returns a reference to the map's [`BuildHasher`]. /// @@ -547,7 +683,7 @@ impl HashMap { /// assert!(a.is_empty()); /// ``` #[cfg_attr(feature = "inline-more", inline)] - pub fn drain(&mut self) -> Drain<'_, K, V> { + pub fn drain(&mut self) -> Drain<'_, K, V, A> { Drain { inner: self.table.drain(), } @@ -607,7 +743,7 @@ impl HashMap { /// assert_eq!(odds, vec![1, 3, 5, 7]); /// ``` #[cfg_attr(feature = "inline-more", inline)] - pub fn drain_filter(&mut self, f: F) -> DrainFilter<'_, K, V, F> + pub fn drain_filter(&mut self, f: F) -> DrainFilter<'_, K, V, F, A> where F: FnMut(&K, &mut V) -> bool, { @@ -639,10 +775,11 @@ impl HashMap { } } -impl HashMap +impl HashMap where K: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { /// Reserves capacity for at least `additional` more elements to be inserted /// in the `HashMap`. The collection may reserve more space to avoid @@ -663,9 +800,8 @@ where /// ``` #[cfg_attr(feature = "inline-more", inline)] pub fn reserve(&mut self, additional: usize) { - let hash_builder = &self.hash_builder; self.table - .reserve(additional, |x| make_hash(hash_builder, &x.0)); + .reserve(additional, make_hasher::(&self.hash_builder)); } /// Tries to reserve capacity for at least `additional` more elements to be inserted @@ -686,9 +822,8 @@ where /// ``` #[cfg_attr(feature = "inline-more", inline)] pub fn try_reserve(&mut self, additional: usize) -> Result<(), TryReserveError> { - let hash_builder = &self.hash_builder; self.table - .try_reserve(additional, |x| make_hash(hash_builder, &x.0)) + .try_reserve(additional, make_hasher::(&self.hash_builder)) } /// Shrinks the capacity of the map as much as possible. It will drop @@ -709,8 +844,8 @@ where /// ``` #[cfg_attr(feature = "inline-more", inline)] pub fn shrink_to_fit(&mut self) { - let hash_builder = &self.hash_builder; - self.table.shrink_to(0, |x| make_hash(hash_builder, &x.0)); + self.table + .shrink_to(0, make_hasher::(&self.hash_builder)); } /// Shrinks the capacity of the map with a lower limit. It will drop @@ -738,9 +873,8 @@ where /// ``` #[cfg_attr(feature = "inline-more", inline)] pub fn shrink_to(&mut self, min_capacity: usize) { - let hash_builder = &self.hash_builder; self.table - .shrink_to(min_capacity, |x| make_hash(hash_builder, &x.0)); + .shrink_to(min_capacity, make_hasher::(&self.hash_builder)); } /// Gets the given key's corresponding entry in the map for in-place manipulation. @@ -763,9 +897,9 @@ where /// assert_eq!(letters.get(&'y'), None); /// ``` #[cfg_attr(feature = "inline-more", inline)] - pub fn entry(&mut self, key: K) -> Entry<'_, K, V, S> { - let hash = make_hash(&self.hash_builder, &key); - if let Some(elem) = self.table.find(hash, |q| q.0.eq(&key)) { + pub fn entry(&mut self, key: K) -> Entry<'_, K, V, S, A> { + let hash = make_insert_hash::(&self.hash_builder, &key); + if let Some(elem) = self.table.find(hash, equivalent_key(&key)) { Entry::Occupied(OccupiedEntry { hash, key: Some(key), @@ -851,8 +985,8 @@ where K: Borrow, Q: Hash + Eq, { - let hash = make_hash(&self.hash_builder, k); - self.table.get(hash, |x| k.eq(x.0.borrow())) + let hash = make_hash::(&self.hash_builder, k); + self.table.get(hash, equivalent_key(k)) } /// Returns the key-value pair corresponding to the supplied key, with a mutable reference to value. @@ -959,8 +1093,143 @@ where K: Borrow, Q: Hash + Eq, { - let hash = make_hash(&self.hash_builder, k); - self.table.get_mut(hash, |x| k.eq(x.0.borrow())) + let hash = make_hash::(&self.hash_builder, k); + self.table.get_mut(hash, equivalent_key(k)) + } + + /// Attempts to get mutable references to `N` values in the map at once. + /// + /// Returns an array of length `N` with the results of each query. For soundness, + /// at most one mutable reference will be returned to any value. An + /// `Err(UnavailableMutError::Duplicate(i))` in the returned array indicates that a suitable + /// key-value pair exists, but a mutable reference to the value already occurs at index `i` in + /// the returned array. + /// + /// This method is available only if the `nightly` feature is enabled. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::{HashMap, UnavailableMutError}; + /// + /// let mut libraries = HashMap::new(); + /// libraries.insert("Bodleian Library".to_string(), 1602); + /// libraries.insert("Athenæum".to_string(), 1807); + /// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691); + /// libraries.insert("Library of Congress".to_string(), 1800); + /// + /// let got = libraries.get_each_mut([ + /// "Athenæum", + /// "New York Public Library", + /// "Athenæum", + /// "Library of Congress", + /// ]); + /// assert_eq!( + /// got, + /// [ + /// Ok(&mut 1807), + /// Err(UnavailableMutError::Absent), + /// Err(UnavailableMutError::Duplicate(0)), + /// Ok(&mut 1800), + /// ] + /// ); + /// ``` + #[cfg(feature = "nightly")] + pub fn get_each_mut( + &mut self, + ks: [&Q; N], + ) -> [Result<&'_ mut V, UnavailableMutError>; N] + where + K: Borrow, + Q: Hash + Eq, + { + let mut pairs = self.get_each_inner_mut(ks); + // TODO use `MaybeUninit::uninit_array` here instead once that's stable. + let mut out: [MaybeUninit>; N] = + unsafe { MaybeUninit::uninit().assume_init() }; + for i in 0..N { + out[i] = MaybeUninit::new( + mem::replace(&mut pairs[i], Err(UnavailableMutError::Absent)).map(|(_, v)| v), + ); + } + unsafe { MaybeUninit::array_assume_init(out) } + } + + /// Attempts to get mutable references to `N` values in the map at once, with immutable + /// references to the corresponding keys. + /// + /// Returns an array of length `N` with the results of each query. For soundness, + /// at most one mutable reference will be returned to any value. An + /// `Err(UnavailableMutError::Duplicate(i))` in the returned array indicates that a suitable + /// key-value pair exists, but a mutable reference to the value already occurs at index `i` in + /// the returned array. + /// + /// This method is available only if the `nightly` feature is enabled. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::{HashMap, UnavailableMutError}; + /// + /// let mut libraries = HashMap::new(); + /// libraries.insert("Bodleian Library".to_string(), 1602); + /// libraries.insert("Athenæum".to_string(), 1807); + /// libraries.insert("Herzogin-Anna-Amalia-Bibliothek".to_string(), 1691); + /// libraries.insert("Library of Congress".to_string(), 1800); + /// + /// let got = libraries.get_each_key_value_mut([ + /// "Bodleian Library", + /// "Herzogin-Anna-Amalia-Bibliothek", + /// "Herzogin-Anna-Amalia-Bibliothek", + /// "Gewandhaus", + /// ]); + /// assert_eq!( + /// got, + /// [ + /// Ok((&"Bodleian Library".to_string(), &mut 1602)), + /// Ok((&"Herzogin-Anna-Amalia-Bibliothek".to_string(), &mut 1691)), + /// Err(UnavailableMutError::Duplicate(1)), + /// Err(UnavailableMutError::Absent), + /// ] + /// ); + /// ``` + #[cfg(feature = "nightly")] + pub fn get_each_key_value_mut( + &mut self, + ks: [&Q; N], + ) -> [Result<(&'_ K, &'_ mut V), UnavailableMutError>; N] + where + K: Borrow, + Q: Hash + Eq, + { + let mut pairs = self.get_each_inner_mut(ks); + // TODO use `MaybeUninit::uninit_array` here instead once that's stable. + let mut out: [MaybeUninit>; N] = + unsafe { MaybeUninit::uninit().assume_init() }; + for i in 0..N { + out[i] = MaybeUninit::new( + mem::replace(&mut pairs[i], Err(UnavailableMutError::Absent)) + .map(|(k, v)| (&*k, v)), + ); + } + unsafe { MaybeUninit::array_assume_init(out) } + } + + #[cfg(feature = "nightly")] + fn get_each_inner_mut( + &mut self, + ks: [&Q; N], + ) -> [Result<&'_ mut (K, V), UnavailableMutError>; N] + where + K: Borrow, + Q: Hash + Eq, + { + let mut hashes = [0_u64; N]; + for i in 0..N { + hashes[i] = make_hash::(&self.hash_builder, ks[i]); + } + self.table + .get_each_mut(hashes, |i, (k, _)| ks[i].eq(k.borrow())) } /// Inserts a key-value pair into the map. @@ -990,17 +1259,51 @@ where /// ``` #[cfg_attr(feature = "inline-more", inline)] pub fn insert(&mut self, k: K, v: V) -> Option { - let hash = make_hash(&self.hash_builder, &k); - if let Some((_, item)) = self.table.get_mut(hash, |x| k.eq(&x.0)) { + let hash = make_insert_hash::(&self.hash_builder, &k); + if let Some((_, item)) = self.table.get_mut(hash, equivalent_key(&k)) { Some(mem::replace(item, v)) } else { - let hash_builder = &self.hash_builder; self.table - .insert(hash, (k, v), |x| make_hash(hash_builder, &x.0)); + .insert(hash, (k, v), make_hasher::(&self.hash_builder)); None } } + /// Tries to insert a key-value pair into the map, and returns + /// a mutable reference to the value in the entry. + /// + /// # Errors + /// + /// If the map already had this key present, nothing is updated, and + /// an error containing the occupied entry and the value is returned. + /// + /// # Examples + /// + /// Basic usage: + /// + /// ``` + /// use hashbrown::HashMap; + /// + /// let mut map = HashMap::new(); + /// assert_eq!(map.try_insert(37, "a").unwrap(), &"a"); + /// + /// let err = map.try_insert(37, "b").unwrap_err(); + /// assert_eq!(err.entry.key(), &37); + /// assert_eq!(err.entry.get(), &"a"); + /// assert_eq!(err.value, "b"); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn try_insert( + &mut self, + key: K, + value: V, + ) -> Result<&mut V, OccupiedError<'_, K, V, S, A>> { + match self.entry(key) { + Entry::Occupied(entry) => Err(OccupiedError { entry, value }), + Entry::Vacant(entry) => Ok(entry.insert(value)), + } + } + /// Removes a key from the map, returning the value at the key if the key /// was previously in the map. /// @@ -1060,12 +1363,12 @@ where K: Borrow, Q: Hash + Eq, { - let hash = make_hash(&self.hash_builder, &k); - self.table.remove_entry(hash, |x| k.eq(x.0.borrow())) + let hash = make_hash::(&self.hash_builder, k); + self.table.remove_entry(hash, equivalent_key(k)) } } -impl HashMap { +impl HashMap { /// Creates a raw entry builder for the HashMap. /// /// Raw entries provide the lowest level of control for searching and @@ -1098,7 +1401,7 @@ impl HashMap { /// acting erratically, with two keys randomly masking each other. Implementations /// are free to assume this doesn't happen (within the limits of memory-safety). #[cfg_attr(feature = "inline-more", inline)] - pub fn raw_entry_mut(&mut self) -> RawEntryBuilderMut<'_, K, V, S> { + pub fn raw_entry_mut(&mut self) -> RawEntryBuilderMut<'_, K, V, S, A> { RawEntryBuilderMut { map: self } } @@ -1118,16 +1421,17 @@ impl HashMap { /// /// Immutable raw entries have very limited use; you might instead want `raw_entry_mut`. #[cfg_attr(feature = "inline-more", inline)] - pub fn raw_entry(&self) -> RawEntryBuilder<'_, K, V, S> { + pub fn raw_entry(&self) -> RawEntryBuilder<'_, K, V, S, A> { RawEntryBuilder { map: self } } } -impl PartialEq for HashMap +impl PartialEq for HashMap where K: Eq + Hash, V: PartialEq, S: BuildHasher, + A: Allocator + Clone, { fn eq(&self, other: &Self) -> bool { if self.len() != other.len() { @@ -1139,40 +1443,44 @@ where } } -impl Eq for HashMap +impl Eq for HashMap where K: Eq + Hash, V: Eq, S: BuildHasher, + A: Allocator + Clone, { } -impl Debug for HashMap +impl Debug for HashMap where K: Debug, V: Debug, + A: Allocator + Clone, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_map().entries(self.iter()).finish() } } -impl Default for HashMap +impl Default for HashMap where S: Default, + A: Default + Allocator + Clone, { - /// Creates an empty `HashMap`, with the `Default` value for the hasher. + /// Creates an empty `HashMap`, with the `Default` value for the hasher and allocator. #[cfg_attr(feature = "inline-more", inline)] fn default() -> Self { - Self::with_hasher(Default::default()) + Self::with_hasher_in(Default::default(), Default::default()) } } -impl Index<&Q> for HashMap +impl Index<&Q> for HashMap where K: Eq + Hash + Borrow, Q: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { type Output = V; @@ -1252,11 +1560,11 @@ impl IterMut<'_, K, V> { /// /// [`into_iter`]: struct.HashMap.html#method.into_iter /// [`HashMap`]: struct.HashMap.html -pub struct IntoIter { - inner: RawIntoIter<(K, V)>, +pub struct IntoIter { + inner: RawIntoIter<(K, V), A>, } -impl IntoIter { +impl IntoIter { /// Returns a iterator of references over the remaining items. #[cfg_attr(feature = "inline-more", inline)] pub(super) fn iter(&self) -> Iter<'_, K, V> { @@ -1328,11 +1636,11 @@ impl fmt::Debug for Values<'_, K, V> { /// /// [`drain`]: struct.HashMap.html#method.drain /// [`HashMap`]: struct.HashMap.html -pub struct Drain<'a, K, V> { - inner: RawDrain<'a, (K, V)>, +pub struct Drain<'a, K, V, A: Allocator + Clone = Global> { + inner: RawDrain<'a, (K, V), A>, } -impl Drain<'_, K, V> { +impl Drain<'_, K, V, A> { /// Returns a iterator of references over the remaining items. #[cfg_attr(feature = "inline-more", inline)] pub(super) fn iter(&self) -> Iter<'_, K, V> { @@ -1350,17 +1658,18 @@ impl Drain<'_, K, V> { /// /// [`drain_filter`]: struct.HashMap.html#method.drain_filter /// [`HashMap`]: struct.HashMap.html -pub struct DrainFilter<'a, K, V, F> +pub struct DrainFilter<'a, K, V, F, A: Allocator + Clone = Global> where F: FnMut(&K, &mut V) -> bool, { f: F, - inner: DrainFilterInner<'a, K, V>, + inner: DrainFilterInner<'a, K, V, A>, } -impl<'a, K, V, F> Drop for DrainFilter<'a, K, V, F> +impl<'a, K, V, F, A> Drop for DrainFilter<'a, K, V, F, A> where F: FnMut(&K, &mut V) -> bool, + A: Allocator + Clone, { #[cfg_attr(feature = "inline-more", inline)] fn drop(&mut self) { @@ -1381,9 +1690,10 @@ impl Drop for ConsumeAllOnDrop<'_, T> { } } -impl Iterator for DrainFilter<'_, K, V, F> +impl Iterator for DrainFilter<'_, K, V, F, A> where F: FnMut(&K, &mut V) -> bool, + A: Allocator + Clone, { type Item = (K, V); @@ -1401,12 +1711,12 @@ where impl FusedIterator for DrainFilter<'_, K, V, F> where F: FnMut(&K, &mut V) -> bool {} /// Portions of `DrainFilter` shared with `set::DrainFilter` -pub(super) struct DrainFilterInner<'a, K, V> { +pub(super) struct DrainFilterInner<'a, K, V, A: Allocator + Clone> { pub iter: RawIter<(K, V)>, - pub table: &'a mut RawTable<(K, V)>, + pub table: &'a mut RawTable<(K, V), A>, } -impl DrainFilterInner<'_, K, V> { +impl DrainFilterInner<'_, K, V, A> { #[cfg_attr(feature = "inline-more", inline)] pub(super) fn next(&mut self, f: &mut F) -> Option<(K, V)> where @@ -1440,8 +1750,8 @@ pub struct ValuesMut<'a, K, V> { /// See the [`HashMap::raw_entry_mut`] docs for usage examples. /// /// [`HashMap::raw_entry_mut`]: struct.HashMap.html#method.raw_entry_mut -pub struct RawEntryBuilderMut<'a, K, V, S> { - map: &'a mut HashMap, +pub struct RawEntryBuilderMut<'a, K, V, S, A: Allocator + Clone = Global> { + map: &'a mut HashMap, } /// A view into a single entry in a map, which may either be vacant or occupied. @@ -1455,35 +1765,35 @@ pub struct RawEntryBuilderMut<'a, K, V, S> { /// [`Entry`]: enum.Entry.html /// [`raw_entry_mut`]: struct.HashMap.html#method.raw_entry_mut /// [`RawEntryBuilderMut`]: struct.RawEntryBuilderMut.html -pub enum RawEntryMut<'a, K, V, S> { +pub enum RawEntryMut<'a, K, V, S, A: Allocator + Clone = Global> { /// An occupied entry. - Occupied(RawOccupiedEntryMut<'a, K, V, S>), + Occupied(RawOccupiedEntryMut<'a, K, V, S, A>), /// A vacant entry. - Vacant(RawVacantEntryMut<'a, K, V, S>), + Vacant(RawVacantEntryMut<'a, K, V, S, A>), } /// A view into an occupied entry in a `HashMap`. /// It is part of the [`RawEntryMut`] enum. /// /// [`RawEntryMut`]: enum.RawEntryMut.html -pub struct RawOccupiedEntryMut<'a, K, V, S> { +pub struct RawOccupiedEntryMut<'a, K, V, S, A: Allocator + Clone = Global> { elem: Bucket<(K, V)>, - table: &'a mut RawTable<(K, V)>, + table: &'a mut RawTable<(K, V), A>, hash_builder: &'a S, } -unsafe impl Send for RawOccupiedEntryMut<'_, K, V, S> +unsafe impl Send for RawOccupiedEntryMut<'_, K, V, S, A> where K: Send, V: Send, - S: Sync, + A: Send + Allocator + Clone, { } -unsafe impl Sync for RawOccupiedEntryMut<'_, K, V, S> +unsafe impl Sync for RawOccupiedEntryMut<'_, K, V, S, A> where K: Sync, V: Sync, - S: Sync, + A: Send + Allocator + Clone, { } @@ -1491,8 +1801,8 @@ where /// It is part of the [`RawEntryMut`] enum. /// /// [`RawEntryMut`]: enum.RawEntryMut.html -pub struct RawVacantEntryMut<'a, K, V, S> { - table: &'a mut RawTable<(K, V)>, +pub struct RawVacantEntryMut<'a, K, V, S, A: Allocator + Clone = Global> { + table: &'a mut RawTable<(K, V), A>, hash_builder: &'a S, } @@ -1501,42 +1811,41 @@ pub struct RawVacantEntryMut<'a, K, V, S> { /// See the [`HashMap::raw_entry`] docs for usage examples. /// /// [`HashMap::raw_entry`]: struct.HashMap.html#method.raw_entry -pub struct RawEntryBuilder<'a, K, V, S> { - map: &'a HashMap, +pub struct RawEntryBuilder<'a, K, V, S, A: Allocator + Clone = Global> { + map: &'a HashMap, } -impl<'a, K, V, S> RawEntryBuilderMut<'a, K, V, S> { +impl<'a, K, V, S, A: Allocator + Clone> RawEntryBuilderMut<'a, K, V, S, A> { /// Creates a `RawEntryMut` from the given key. #[cfg_attr(feature = "inline-more", inline)] #[allow(clippy::wrong_self_convention)] - pub fn from_key(self, k: &Q) -> RawEntryMut<'a, K, V, S> + pub fn from_key(self, k: &Q) -> RawEntryMut<'a, K, V, S, A> where S: BuildHasher, K: Borrow, Q: Hash + Eq, { - let mut hasher = self.map.hash_builder.build_hasher(); - k.hash(&mut hasher); - self.from_key_hashed_nocheck(hasher.finish(), k) + let hash = make_hash::(&self.map.hash_builder, k); + self.from_key_hashed_nocheck(hash, k) } /// Creates a `RawEntryMut` from the given key and its hash. #[inline] #[allow(clippy::wrong_self_convention)] - pub fn from_key_hashed_nocheck(self, hash: u64, k: &Q) -> RawEntryMut<'a, K, V, S> + pub fn from_key_hashed_nocheck(self, hash: u64, k: &Q) -> RawEntryMut<'a, K, V, S, A> where K: Borrow, Q: Eq, { - self.from_hash(hash, |q| q.borrow().eq(k)) + self.from_hash(hash, equivalent(k)) } } -impl<'a, K, V, S> RawEntryBuilderMut<'a, K, V, S> { +impl<'a, K, V, S, A: Allocator + Clone> RawEntryBuilderMut<'a, K, V, S, A> { /// Creates a `RawEntryMut` from the given hash. #[cfg_attr(feature = "inline-more", inline)] #[allow(clippy::wrong_self_convention)] - pub fn from_hash(self, hash: u64, is_match: F) -> RawEntryMut<'a, K, V, S> + pub fn from_hash(self, hash: u64, is_match: F) -> RawEntryMut<'a, K, V, S, A> where for<'b> F: FnMut(&'b K) -> bool, { @@ -1544,7 +1853,7 @@ impl<'a, K, V, S> RawEntryBuilderMut<'a, K, V, S> { } #[cfg_attr(feature = "inline-more", inline)] - fn search(self, hash: u64, mut is_match: F) -> RawEntryMut<'a, K, V, S> + fn search(self, hash: u64, mut is_match: F) -> RawEntryMut<'a, K, V, S, A> where for<'b> F: FnMut(&'b K) -> bool, { @@ -1562,7 +1871,7 @@ impl<'a, K, V, S> RawEntryBuilderMut<'a, K, V, S> { } } -impl<'a, K, V, S> RawEntryBuilder<'a, K, V, S> { +impl<'a, K, V, S, A: Allocator + Clone> RawEntryBuilder<'a, K, V, S, A> { /// Access an entry by key. #[cfg_attr(feature = "inline-more", inline)] #[allow(clippy::wrong_self_convention)] @@ -1572,9 +1881,8 @@ impl<'a, K, V, S> RawEntryBuilder<'a, K, V, S> { K: Borrow, Q: Hash + Eq, { - let mut hasher = self.map.hash_builder.build_hasher(); - k.hash(&mut hasher); - self.from_key_hashed_nocheck(hasher.finish(), k) + let hash = make_hash::(&self.map.hash_builder, k); + self.from_key_hashed_nocheck(hash, k) } /// Access an entry by a key and its hash. @@ -1585,7 +1893,7 @@ impl<'a, K, V, S> RawEntryBuilder<'a, K, V, S> { K: Borrow, Q: Eq, { - self.from_hash(hash, |q| q.borrow().eq(k)) + self.from_hash(hash, equivalent(k)) } #[cfg_attr(feature = "inline-more", inline)] @@ -1610,7 +1918,7 @@ impl<'a, K, V, S> RawEntryBuilder<'a, K, V, S> { } } -impl<'a, K, V, S> RawEntryMut<'a, K, V, S> { +impl<'a, K, V, S, A: Allocator + Clone> RawEntryMut<'a, K, V, S, A> { /// Sets the value of the entry, and returns a RawOccupiedEntryMut. /// /// # Examples @@ -1624,7 +1932,7 @@ impl<'a, K, V, S> RawEntryMut<'a, K, V, S> { /// assert_eq!(entry.remove_entry(), ("horseyland", 37)); /// ``` #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(self, key: K, value: V) -> RawOccupiedEntryMut<'a, K, V, S> + pub fn insert(self, key: K, value: V) -> RawOccupiedEntryMut<'a, K, V, S, A> where K: Hash, S: BuildHasher, @@ -1804,7 +2112,7 @@ impl<'a, K, V, S> RawEntryMut<'a, K, V, S> { } } -impl<'a, K, V, S> RawOccupiedEntryMut<'a, K, V, S> { +impl<'a, K, V, S, A: Allocator + Clone> RawOccupiedEntryMut<'a, K, V, S, A> { /// Gets a reference to the key in the entry. #[cfg_attr(feature = "inline-more", inline)] pub fn key(&self) -> &K { @@ -1899,7 +2207,7 @@ impl<'a, K, V, S> RawOccupiedEntryMut<'a, K, V, S> { /// the entry and allows to replace or remove it based on the /// value of the returned option. #[cfg_attr(feature = "inline-more", inline)] - pub fn replace_entry_with(self, f: F) -> RawEntryMut<'a, K, V, S> + pub fn replace_entry_with(self, f: F) -> RawEntryMut<'a, K, V, S, A> where F: FnOnce(&K, V) -> Option, { @@ -1922,7 +2230,7 @@ impl<'a, K, V, S> RawOccupiedEntryMut<'a, K, V, S> { } } -impl<'a, K, V, S> RawVacantEntryMut<'a, K, V, S> { +impl<'a, K, V, S, A: Allocator + Clone> RawVacantEntryMut<'a, K, V, S, A> { /// Sets the value of the entry with the VacantEntry's key, /// and returns a mutable reference to it. #[cfg_attr(feature = "inline-more", inline)] @@ -1931,9 +2239,8 @@ impl<'a, K, V, S> RawVacantEntryMut<'a, K, V, S> { K: Hash, S: BuildHasher, { - let mut hasher = self.hash_builder.build_hasher(); - key.hash(&mut hasher); - self.insert_hashed_nocheck(hasher.finish(), key, value) + let hash = make_insert_hash::(self.hash_builder, &key); + self.insert_hashed_nocheck(hash, key, value) } /// Sets the value of the entry with the VacantEntry's key, @@ -1945,8 +2252,12 @@ impl<'a, K, V, S> RawVacantEntryMut<'a, K, V, S> { K: Hash, S: BuildHasher, { - let hash_builder = self.hash_builder; - self.insert_with_hasher(hash, key, value, |k| make_hash(hash_builder, k)) + let &mut (ref mut k, ref mut v) = self.table.insert_entry( + hash, + (key, value), + make_hasher::(self.hash_builder), + ); + (k, v) } /// Set the value of an entry with a custom hasher function. @@ -1968,18 +2279,17 @@ impl<'a, K, V, S> RawVacantEntryMut<'a, K, V, S> { } #[cfg_attr(feature = "inline-more", inline)] - fn insert_entry(self, key: K, value: V) -> RawOccupiedEntryMut<'a, K, V, S> + fn insert_entry(self, key: K, value: V) -> RawOccupiedEntryMut<'a, K, V, S, A> where K: Hash, S: BuildHasher, { - let hash_builder = self.hash_builder; - let mut hasher = self.hash_builder.build_hasher(); - key.hash(&mut hasher); - - let elem = self.table.insert(hasher.finish(), (key, value), |k| { - make_hash(hash_builder, &k.0) - }); + let hash = make_insert_hash::(self.hash_builder, &key); + let elem = self.table.insert( + hash, + (key, value), + make_hasher::(self.hash_builder), + ); RawOccupiedEntryMut { elem, table: self.table, @@ -1988,13 +2298,13 @@ impl<'a, K, V, S> RawVacantEntryMut<'a, K, V, S> { } } -impl Debug for RawEntryBuilderMut<'_, K, V, S> { +impl Debug for RawEntryBuilderMut<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("RawEntryBuilder").finish() } } -impl Debug for RawEntryMut<'_, K, V, S> { +impl Debug for RawEntryMut<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { RawEntryMut::Vacant(ref v) => f.debug_tuple("RawEntry").field(v).finish(), @@ -2003,7 +2313,7 @@ impl Debug for RawEntryMut<'_, K, V, S> { } } -impl Debug for RawOccupiedEntryMut<'_, K, V, S> { +impl Debug for RawOccupiedEntryMut<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("RawOccupiedEntryMut") .field("key", self.key()) @@ -2012,13 +2322,13 @@ impl Debug for RawOccupiedEntryMut<'_, K, V, S> { } } -impl Debug for RawVacantEntryMut<'_, K, V, S> { +impl Debug for RawVacantEntryMut<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("RawVacantEntryMut").finish() } } -impl Debug for RawEntryBuilder<'_, K, V, S> { +impl Debug for RawEntryBuilder<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("RawEntryBuilder").finish() } @@ -2030,15 +2340,18 @@ impl Debug for RawEntryBuilder<'_, K, V, S> { /// /// [`HashMap`]: struct.HashMap.html /// [`entry`]: struct.HashMap.html#method.entry -pub enum Entry<'a, K, V, S> { +pub enum Entry<'a, K, V, S, A = Global> +where + A: Allocator + Clone, +{ /// An occupied entry. - Occupied(OccupiedEntry<'a, K, V, S>), + Occupied(OccupiedEntry<'a, K, V, S, A>), /// A vacant entry. - Vacant(VacantEntry<'a, K, V, S>), + Vacant(VacantEntry<'a, K, V, S, A>), } -impl Debug for Entry<'_, K, V, S> { +impl Debug for Entry<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { Entry::Vacant(ref v) => f.debug_tuple("Entry").field(v).finish(), @@ -2051,29 +2364,31 @@ impl Debug for Entry<'_, K, V, S> { /// It is part of the [`Entry`] enum. /// /// [`Entry`]: enum.Entry.html -pub struct OccupiedEntry<'a, K, V, S> { +pub struct OccupiedEntry<'a, K, V, S, A: Allocator + Clone = Global> { hash: u64, key: Option, elem: Bucket<(K, V)>, - table: &'a mut HashMap, + table: &'a mut HashMap, } -unsafe impl Send for OccupiedEntry<'_, K, V, S> +unsafe impl Send for OccupiedEntry<'_, K, V, S, A> where K: Send, V: Send, S: Send, + A: Send + Allocator + Clone, { } -unsafe impl Sync for OccupiedEntry<'_, K, V, S> +unsafe impl Sync for OccupiedEntry<'_, K, V, S, A> where K: Sync, V: Sync, S: Sync, + A: Sync + Allocator + Clone, { } -impl Debug for OccupiedEntry<'_, K, V, S> { +impl Debug for OccupiedEntry<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("OccupiedEntry") .field("key", self.key()) @@ -2086,19 +2401,53 @@ impl Debug for OccupiedEntry<'_, K, V, S> { /// It is part of the [`Entry`] enum. /// /// [`Entry`]: enum.Entry.html -pub struct VacantEntry<'a, K, V, S> { +pub struct VacantEntry<'a, K, V, S, A: Allocator + Clone = Global> { hash: u64, key: K, - table: &'a mut HashMap, + table: &'a mut HashMap, } -impl Debug for VacantEntry<'_, K, V, S> { +impl Debug for VacantEntry<'_, K, V, S, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_tuple("VacantEntry").field(self.key()).finish() } } -impl<'a, K, V, S> IntoIterator for &'a HashMap { +/// The error returned by [`try_insert`](HashMap::try_insert) when the key already exists. +/// +/// Contains the occupied entry, and the value that was not inserted. +pub struct OccupiedError<'a, K, V, S, A: Allocator + Clone = Global> { + /// The entry in the map that was already occupied. + pub entry: OccupiedEntry<'a, K, V, S, A>, + /// The value which was not inserted, because the entry was already occupied. + pub value: V, +} + +impl Debug for OccupiedError<'_, K, V, S, A> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + f.debug_struct("OccupiedError") + .field("key", self.entry.key()) + .field("old_value", self.entry.get()) + .field("new_value", &self.value) + .finish() + } +} + +impl<'a, K: Debug, V: Debug, S, A: Allocator + Clone> fmt::Display + for OccupiedError<'a, K, V, S, A> +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + write!( + f, + "failed to insert {:?}, key {:?} already exists with value {:?}", + self.value, + self.entry.key(), + self.entry.get(), + ) + } +} + +impl<'a, K, V, S, A: Allocator + Clone> IntoIterator for &'a HashMap { type Item = (&'a K, &'a V); type IntoIter = Iter<'a, K, V>; @@ -2108,7 +2457,7 @@ impl<'a, K, V, S> IntoIterator for &'a HashMap { } } -impl<'a, K, V, S> IntoIterator for &'a mut HashMap { +impl<'a, K, V, S, A: Allocator + Clone> IntoIterator for &'a mut HashMap { type Item = (&'a K, &'a mut V); type IntoIter = IterMut<'a, K, V>; @@ -2118,9 +2467,9 @@ impl<'a, K, V, S> IntoIterator for &'a mut HashMap { } } -impl IntoIterator for HashMap { +impl IntoIterator for HashMap { type Item = (K, V); - type IntoIter = IntoIter; + type IntoIter = IntoIter; /// Creates a consuming iterator, that is, one that moves each key-value /// pair out of the map in arbitrary order. The map cannot be used after @@ -2140,7 +2489,7 @@ impl IntoIterator for HashMap { /// let vec: Vec<(&str, i32)> = map.into_iter().collect(); /// ``` #[cfg_attr(feature = "inline-more", inline)] - fn into_iter(self) -> IntoIter { + fn into_iter(self) -> IntoIter { IntoIter { inner: self.table.into_iter(), } @@ -2212,7 +2561,7 @@ where } } -impl Iterator for IntoIter { +impl Iterator for IntoIter { type Item = (K, V); #[cfg_attr(feature = "inline-more", inline)] @@ -2224,15 +2573,15 @@ impl Iterator for IntoIter { self.inner.size_hint() } } -impl ExactSizeIterator for IntoIter { +impl ExactSizeIterator for IntoIter { #[cfg_attr(feature = "inline-more", inline)] fn len(&self) -> usize { self.inner.len() } } -impl FusedIterator for IntoIter {} +impl FusedIterator for IntoIter {} -impl fmt::Debug for IntoIter { +impl fmt::Debug for IntoIter { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.iter()).finish() } @@ -2320,7 +2669,7 @@ where } } -impl<'a, K, V> Iterator for Drain<'a, K, V> { +impl<'a, K, V, A: Allocator + Clone> Iterator for Drain<'a, K, V, A> { type Item = (K, V); #[cfg_attr(feature = "inline-more", inline)] @@ -2332,25 +2681,26 @@ impl<'a, K, V> Iterator for Drain<'a, K, V> { self.inner.size_hint() } } -impl ExactSizeIterator for Drain<'_, K, V> { +impl ExactSizeIterator for Drain<'_, K, V, A> { #[cfg_attr(feature = "inline-more", inline)] fn len(&self) -> usize { self.inner.len() } } -impl FusedIterator for Drain<'_, K, V> {} +impl FusedIterator for Drain<'_, K, V, A> {} -impl fmt::Debug for Drain<'_, K, V> +impl fmt::Debug for Drain<'_, K, V, A> where K: fmt::Debug, V: fmt::Debug, + A: Allocator + Clone, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.iter()).finish() } } -impl<'a, K, V, S> Entry<'a, K, V, S> { +impl<'a, K, V, S, A: Allocator + Clone> Entry<'a, K, V, S, A> { /// Sets the value of the entry, and returns an OccupiedEntry. /// /// # Examples @@ -2364,7 +2714,7 @@ impl<'a, K, V, S> Entry<'a, K, V, S> { /// assert_eq!(entry.key(), &"horseyland"); /// ``` #[cfg_attr(feature = "inline-more", inline)] - pub fn insert(self, value: V) -> OccupiedEntry<'a, K, V, S> + pub fn insert(self, value: V) -> OccupiedEntry<'a, K, V, S, A> where K: Hash, S: BuildHasher, @@ -2433,9 +2783,12 @@ impl<'a, K, V, S> Entry<'a, K, V, S> { } } - /// Ensures a value is in the entry by inserting, if empty, the result of the default function, - /// which takes the key as its argument, and returns a mutable reference to the value in the - /// entry. + /// Ensures a value is in the entry by inserting, if empty, the result of the default function. + /// This method allows for generating key-derived values for insertion by providing the default + /// function a reference to the key that was moved during the `.entry(key)` method call. + /// + /// The reference to the moved key is provided so that cloning or copying the key is + /// unnecessary, unlike with `.or_insert_with(|| ... )`. /// /// # Examples /// @@ -2581,7 +2934,7 @@ impl<'a, K, V, S> Entry<'a, K, V, S> { } } -impl<'a, K, V: Default, S> Entry<'a, K, V, S> { +impl<'a, K, V: Default, S, A: Allocator + Clone> Entry<'a, K, V, S, A> { /// Ensures a value is in the entry by inserting the default value if empty, /// and returns a mutable reference to the value in the entry. /// @@ -2608,7 +2961,7 @@ impl<'a, K, V: Default, S> Entry<'a, K, V, S> { } } -impl<'a, K, V, S> OccupiedEntry<'a, K, V, S> { +impl<'a, K, V, S, A: Allocator + Clone> OccupiedEntry<'a, K, V, S, A> { /// Gets a reference to the key in the entry. /// /// # Examples @@ -2777,6 +3130,10 @@ impl<'a, K, V, S> OccupiedEntry<'a, K, V, S> { /// Replaces the entry, returning the old key and value. The new key in the hash map will be /// the key used to create this entry. /// + /// # Panics + /// + /// Will panic if this OccupiedEntry was created through [`Entry::insert`]. + /// /// # Examples /// /// ``` @@ -2806,6 +3163,10 @@ impl<'a, K, V, S> OccupiedEntry<'a, K, V, S> { /// Replaces the key in the hash map with the key used to create this entry. /// + /// # Panics + /// + /// Will panic if this OccupiedEntry was created through [`Entry::insert`]. + /// /// # Examples /// /// ``` @@ -2883,7 +3244,7 @@ impl<'a, K, V, S> OccupiedEntry<'a, K, V, S> { /// assert!(!map.contains_key("poneyland")); /// ``` #[cfg_attr(feature = "inline-more", inline)] - pub fn replace_entry_with(self, f: F) -> Entry<'a, K, V, S> + pub fn replace_entry_with(self, f: F) -> Entry<'a, K, V, S, A> where F: FnOnce(&K, V) -> Option, { @@ -2914,7 +3275,7 @@ impl<'a, K, V, S> OccupiedEntry<'a, K, V, S> { } } -impl<'a, K, V, S> VacantEntry<'a, K, V, S> { +impl<'a, K, V, S, A: Allocator + Clone> VacantEntry<'a, K, V, S, A> { /// Gets a reference to the key that would be used when inserting a value /// through the `VacantEntry`. /// @@ -2972,24 +3333,26 @@ impl<'a, K, V, S> VacantEntry<'a, K, V, S> { K: Hash, S: BuildHasher, { - let hash_builder = &self.table.hash_builder; let table = &mut self.table.table; - let entry = table.insert_entry(self.hash, (self.key, value), |x| { - make_hash(hash_builder, &x.0) - }); + let entry = table.insert_entry( + self.hash, + (self.key, value), + make_hasher::(&self.table.hash_builder), + ); &mut entry.1 } #[cfg_attr(feature = "inline-more", inline)] - fn insert_entry(self, value: V) -> OccupiedEntry<'a, K, V, S> + fn insert_entry(self, value: V) -> OccupiedEntry<'a, K, V, S, A> where K: Hash, S: BuildHasher, { - let hash_builder = &self.table.hash_builder; - let elem = self.table.table.insert(self.hash, (self.key, value), |x| { - make_hash(hash_builder, &x.0) - }); + let elem = self.table.table.insert( + self.hash, + (self.key, value), + make_hasher::(&self.table.hash_builder), + ); OccupiedEntry { hash: self.hash, key: None, @@ -2999,15 +3362,17 @@ impl<'a, K, V, S> VacantEntry<'a, K, V, S> { } } -impl FromIterator<(K, V)> for HashMap +impl FromIterator<(K, V)> for HashMap where K: Eq + Hash, S: BuildHasher + Default, + A: Default + Allocator + Clone, { #[cfg_attr(feature = "inline-more", inline)] fn from_iter>(iter: T) -> Self { let iter = iter.into_iter(); - let mut map = Self::with_capacity_and_hasher(iter.size_hint().0, S::default()); + let mut map = + Self::with_capacity_and_hasher_in(iter.size_hint().0, S::default(), A::default()); iter.for_each(|(k, v)| { map.insert(k, v); }); @@ -3017,10 +3382,11 @@ where /// Inserts all new key-values from the iterator and replaces values with existing /// keys with new values returned from the iterator. -impl Extend<(K, V)> for HashMap +impl Extend<(K, V)> for HashMap where K: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { #[cfg_attr(feature = "inline-more", inline)] fn extend>(&mut self, iter: T) { @@ -3062,11 +3428,12 @@ where } } -impl<'a, K, V, S> Extend<(&'a K, &'a V)> for HashMap +impl<'a, K, V, S, A> Extend<(&'a K, &'a V)> for HashMap where K: Eq + Hash + Copy, V: Copy, S: BuildHasher, + A: Allocator + Clone, { #[cfg_attr(feature = "inline-more", inline)] fn extend>(&mut self, iter: T) { @@ -3100,10 +3467,14 @@ fn assert_covariance() { fn iter_val<'a, 'new>(v: Iter<'a, u8, &'static str>) -> Iter<'a, u8, &'new str> { v } - fn into_iter_key<'new>(v: IntoIter<&'static str, u8>) -> IntoIter<&'new str, u8> { + fn into_iter_key<'new, A: Allocator + Clone>( + v: IntoIter<&'static str, u8, A>, + ) -> IntoIter<&'new str, u8, A> { v } - fn into_iter_val<'new>(v: IntoIter) -> IntoIter { + fn into_iter_val<'new, A: Allocator + Clone>( + v: IntoIter, + ) -> IntoIter { v } fn keys_key<'a, 'new>(v: Keys<'a, &'static str, u8>) -> Keys<'a, &'new str, u8> { @@ -3132,6 +3503,7 @@ mod test_map { use super::{HashMap, RawEntryMut}; use crate::TryReserveError::*; use rand::{rngs::SmallRng, Rng, SeedableRng}; + use std::borrow::ToOwned; use std::cell::RefCell; use std::usize; use std::vec::Vec; @@ -4287,11 +4659,7 @@ mod test_map { let mut map: HashMap<_, _> = xs.iter().cloned().collect(); let compute_hash = |map: &HashMap, k: i32| -> u64 { - use core::hash::{BuildHasher, Hash, Hasher}; - - let mut hasher = map.hasher().build_hasher(); - k.hash(&mut hasher); - hasher.finish() + super::make_insert_hash::(map.hasher(), &k) }; // Existing key (insert) @@ -4468,9 +4836,11 @@ mod test_map { left -= 1; } else { assert!(removed.contains(&(i, 2 * i)), "{} not in {:?}", i, removed); - let e = m - .table - .insert(hash, (i, 2 * i), |x| super::make_hash(&hasher, &x.0)); + let e = m.table.insert( + hash, + (i, 2 * i), + super::make_hasher::(&hasher), + ); it.reflect_insert(&e); if let Some(p) = removed.iter().position(|e| e == &(i, 2 * i)) { removed.swap_remove(p); @@ -4501,7 +4871,6 @@ mod test_map { #[test] fn test_const_with_hasher() { use core::hash::BuildHasher; - use std::borrow::ToOwned; use std::collections::hash_map::DefaultHasher; #[derive(Clone)] @@ -4521,4 +4890,33 @@ mod test_map { map.insert(17, "seventeen".to_owned()); assert_eq!("seventeen", map[&17]); } + + #[test] + #[cfg(feature = "nightly")] + fn test_get_each_mut() { + use crate::UnavailableMutError::*; + + let mut map = HashMap::new(); + map.insert("foo".to_owned(), 0); + map.insert("bar".to_owned(), 10); + map.insert("baz".to_owned(), 20); + map.insert("qux".to_owned(), 30); + + let xs = map.get_each_mut(["foo", "dud", "foo", "qux"]); + assert_eq!( + xs, + [Ok(&mut 0), Err(Absent), Err(Duplicate(0)), Ok(&mut 30)] + ); + + let ys = map.get_each_key_value_mut(["bar", "baz", "baz", "dip"]); + assert_eq!( + ys, + [ + Ok((&"bar".to_owned(), &mut 10)), + Ok((&"baz".to_owned(), &mut 20)), + Err(Duplicate(1)), + Err(Absent), + ] + ); + } } diff --git a/vendor/hashbrown/src/raw/alloc.rs b/vendor/hashbrown/src/raw/alloc.rs new file mode 100644 index 0000000000..de6c455064 --- /dev/null +++ b/vendor/hashbrown/src/raw/alloc.rs @@ -0,0 +1,72 @@ +pub(crate) use self::inner::{do_alloc, Allocator, Global}; + +#[cfg(feature = "nightly")] +mod inner { + use crate::alloc::alloc::Layout; + pub use crate::alloc::alloc::{Allocator, Global}; + use core::ptr::NonNull; + + #[allow(clippy::map_err_ignore)] + pub fn do_alloc(alloc: &A, layout: Layout) -> Result, ()> { + alloc + .allocate(layout) + .map(|ptr| ptr.as_non_null_ptr()) + .map_err(|_| ()) + } + + #[cfg(feature = "bumpalo")] + unsafe impl Allocator for crate::BumpWrapper<'_> { + #[inline] + fn allocate(&self, layout: Layout) -> Result, core::alloc::AllocError> { + match self.0.try_alloc_layout(layout) { + Ok(ptr) => Ok(NonNull::slice_from_raw_parts(ptr, layout.size())), + Err(_) => Err(core::alloc::AllocError), + } + } + #[inline] + unsafe fn deallocate(&self, _ptr: NonNull, _layout: Layout) {} + } +} + +#[cfg(not(feature = "nightly"))] +mod inner { + use crate::alloc::alloc::{alloc, dealloc, Layout}; + use core::ptr::NonNull; + + pub unsafe trait Allocator { + fn allocate(&self, layout: Layout) -> Result, ()>; + unsafe fn deallocate(&self, ptr: NonNull, layout: Layout); + } + + #[derive(Copy, Clone)] + pub struct Global; + unsafe impl Allocator for Global { + #[inline] + fn allocate(&self, layout: Layout) -> Result, ()> { + unsafe { NonNull::new(alloc(layout)).ok_or(()) } + } + #[inline] + unsafe fn deallocate(&self, ptr: NonNull, layout: Layout) { + dealloc(ptr.as_ptr(), layout) + } + } + impl Default for Global { + #[inline] + fn default() -> Self { + Global + } + } + + pub fn do_alloc(alloc: &A, layout: Layout) -> Result, ()> { + alloc.allocate(layout) + } + + #[cfg(feature = "bumpalo")] + unsafe impl Allocator for crate::BumpWrapper<'_> { + #[allow(clippy::map_err_ignore)] + fn allocate(&self, layout: Layout) -> Result, ()> { + self.0.try_alloc_layout(layout).map_err(|_| ()) + } + unsafe fn deallocate(&self, _ptr: NonNull, _layout: Layout) {} + } +} diff --git a/vendor/hashbrown/src/raw/generic.rs b/vendor/hashbrown/src/raw/generic.rs index 26f8c58969..ef066e8d08 100644 --- a/vendor/hashbrown/src/raw/generic.rs +++ b/vendor/hashbrown/src/raw/generic.rs @@ -55,7 +55,7 @@ impl Group { struct AlignedBytes { _align: [Group; 0], bytes: [u8; Group::WIDTH], - }; + } const ALIGNED_BYTES: AlignedBytes = AlignedBytes { _align: [], bytes: [EMPTY; Group::WIDTH], @@ -67,7 +67,7 @@ impl Group { #[inline] #[allow(clippy::cast_ptr_alignment)] // unaligned load pub unsafe fn load(ptr: *const u8) -> Self { - Group(ptr::read_unaligned(ptr as *const _)) + Group(ptr::read_unaligned(ptr.cast())) } /// Loads a group of bytes starting at the given address, which must be @@ -77,7 +77,7 @@ impl Group { pub unsafe fn load_aligned(ptr: *const u8) -> Self { // FIXME: use align_offset once it stabilizes debug_assert_eq!(ptr as usize & (mem::align_of::() - 1), 0); - Group(ptr::read(ptr as *const _)) + Group(ptr::read(ptr.cast())) } /// Stores the group of bytes to the given address, which must be @@ -87,7 +87,7 @@ impl Group { pub unsafe fn store_aligned(self, ptr: *mut u8) { // FIXME: use align_offset once it stabilizes debug_assert_eq!(ptr as usize & (mem::align_of::() - 1), 0); - ptr::write(ptr as *mut _, self.0); + ptr::write(ptr.cast(), self.0); } /// Returns a `BitMask` indicating all bytes in the group which *may* diff --git a/vendor/hashbrown/src/raw/mod.rs b/vendor/hashbrown/src/raw/mod.rs index 32fec98476..3ae6980333 100644 --- a/vendor/hashbrown/src/raw/mod.rs +++ b/vendor/hashbrown/src/raw/mod.rs @@ -1,12 +1,15 @@ -use crate::alloc::alloc::{alloc, dealloc, handle_alloc_error}; +use crate::alloc::alloc::{handle_alloc_error, Layout}; use crate::scopeguard::guard; use crate::TryReserveError; -use core::alloc::Layout; +#[cfg(feature = "nightly")] +use crate::UnavailableMutError; use core::hint; use core::iter::FusedIterator; use core::marker::PhantomData; use core::mem; use core::mem::ManuallyDrop; +#[cfg(feature = "nightly")] +use core::mem::MaybeUninit; use core::ptr::NonNull; cfg_if! { @@ -32,6 +35,9 @@ cfg_if! { } } +mod alloc; +pub(crate) use self::alloc::{do_alloc, Allocator, Global}; + mod bitmask; use self::bitmask::{BitMask, BitMaskIter}; @@ -41,14 +47,28 @@ use self::imp::Group; // consistently improves performance by 10-15%. #[cfg(feature = "nightly")] use core::intrinsics::{likely, unlikely}; + +// On stable we can use #[cold] to get a equivalent effect: this attributes +// suggests that the function is unlikely to be called +#[cfg(not(feature = "nightly"))] +#[inline] +#[cold] +fn cold() {} + #[cfg(not(feature = "nightly"))] #[inline] fn likely(b: bool) -> bool { + if !b { + cold() + } b } #[cfg(not(feature = "nightly"))] #[inline] fn unlikely(b: bool) -> bool { + if b { + cold() + } b } @@ -145,27 +165,22 @@ fn h2(hash: u64) -> u8 { /// Proof that the probe will visit every group in the table: /// struct ProbeSeq { - bucket_mask: usize, pos: usize, stride: usize, } -impl Iterator for ProbeSeq { - type Item = usize; - +impl ProbeSeq { #[inline] - fn next(&mut self) -> Option { + fn move_next(&mut self, bucket_mask: usize) { // We should have found an empty bucket by now and ended the probe. debug_assert!( - self.stride <= self.bucket_mask, + self.stride <= bucket_mask, "Went past end of probe sequence" ); - let result = self.pos; self.stride += Group::WIDTH; self.pos += self.stride; - self.pos &= self.bucket_mask; - Some(result) + self.pos &= bucket_mask; } } @@ -214,30 +229,39 @@ fn bucket_mask_to_capacity(bucket_mask: usize) -> usize { } } -/// Returns a Layout which describes the allocation required for a hash table, -/// and the offset of the control bytes in the allocation. -/// (the offset is also one past last element of buckets) -/// -/// Returns `None` if an overflow occurs. -#[cfg_attr(feature = "inline-more", inline)] -#[cfg(feature = "nightly")] -fn calculate_layout(buckets: usize) -> Option<(Layout, usize)> { - debug_assert!(buckets.is_power_of_two()); +/// Helper which allows the max calculation for ctrl_align to be statically computed for each T +/// while keeping the rest of `calculate_layout_for` independent of `T` +#[derive(Copy, Clone)] +struct TableLayout { + size: usize, + ctrl_align: usize, +} + +impl TableLayout { + #[inline] + fn new() -> Self { + let layout = Layout::new::(); + Self { + size: layout.size(), + ctrl_align: usize::max(layout.align(), Group::WIDTH), + } + } - // Array of buckets - let data = Layout::array::(buckets).ok()?; + #[inline] + fn calculate_layout_for(self, buckets: usize) -> Option<(Layout, usize)> { + debug_assert!(buckets.is_power_of_two()); - // Array of control bytes. This must be aligned to the group size. - // - // We add `Group::WIDTH` control bytes at the end of the array which - // replicate the bytes at the start of the array and thus avoids the need to - // perform bounds-checking while probing. - // - // There is no possible overflow here since buckets is a power of two and - // Group::WIDTH is a small number. - let ctrl = unsafe { Layout::from_size_align_unchecked(buckets + Group::WIDTH, Group::WIDTH) }; + let TableLayout { size, ctrl_align } = self; + // Manual layout calculation since Layout methods are not yet stable. + let ctrl_offset = + size.checked_mul(buckets)?.checked_add(ctrl_align - 1)? & !(ctrl_align - 1); + let len = ctrl_offset.checked_add(buckets + Group::WIDTH)?; - data.extend(ctrl).ok() + Some(( + unsafe { Layout::from_size_align_unchecked(len, ctrl_align) }, + ctrl_offset, + )) + } } /// Returns a Layout which describes the allocation required for a hash table, @@ -246,22 +270,8 @@ fn calculate_layout(buckets: usize) -> Option<(Layout, usize)> { /// /// Returns `None` if an overflow occurs. #[cfg_attr(feature = "inline-more", inline)] -#[cfg(not(feature = "nightly"))] fn calculate_layout(buckets: usize) -> Option<(Layout, usize)> { - debug_assert!(buckets.is_power_of_two()); - - // Manual layout calculation since Layout methods are not yet stable. - let ctrl_align = usize::max(mem::align_of::(), Group::WIDTH); - let ctrl_offset = mem::size_of::() - .checked_mul(buckets)? - .checked_add(ctrl_align - 1)? - & !(ctrl_align - 1); - let len = ctrl_offset.checked_add(buckets + Group::WIDTH)?; - - Some(( - unsafe { Layout::from_size_align_unchecked(len, ctrl_align) }, - ctrl_offset, - )) + TableLayout::new::().calculate_layout_for(buckets) } /// A reference to a hash table bucket containing a `T`. @@ -310,12 +320,12 @@ impl Bucket { } } #[cfg_attr(feature = "inline-more", inline)] - pub unsafe fn as_ptr(&self) -> *mut T { + pub fn as_ptr(&self) -> *mut T { if mem::size_of::() == 0 { // Just return an arbitrary ZST pointer which is properly aligned mem::align_of::() as *mut T } else { - self.ptr.as_ptr().sub(1) + unsafe { self.ptr.as_ptr().sub(1) } } } #[cfg_attr(feature = "inline-more", inline)] @@ -356,7 +366,15 @@ impl Bucket { } /// A raw hash table with an unsafe API. -pub struct RawTable { +pub struct RawTable { + table: RawTableInner, + // Tell dropck that we own instances of T. + marker: PhantomData, +} + +/// Non-generic part of `RawTable` which allows functions to be instantiated only once regardless +/// of how many different key-value types are used. +struct RawTableInner { // Mask to get an index from a hash value. The value is one less than the // number of buckets in the table. bucket_mask: usize, @@ -371,11 +389,10 @@ pub struct RawTable { // Number of elements in the table, only really used by len() items: usize, - // Tell dropck that we own instances of T. - marker: PhantomData, + alloc: A, } -impl RawTable { +impl RawTable { /// Creates a new empty hash table without allocating any memory. /// /// In effect this returns a table with exactly 1 bucket. However we can @@ -384,11 +401,36 @@ impl RawTable { #[cfg_attr(feature = "inline-more", inline)] pub const fn new() -> Self { Self { - // Be careful to cast the entire slice to a raw pointer. - ctrl: unsafe { NonNull::new_unchecked(Group::static_empty() as *const _ as *mut u8) }, - bucket_mask: 0, - items: 0, - growth_left: 0, + table: RawTableInner::new_in(Global), + marker: PhantomData, + } + } + + /// Attempts to allocate a new hash table with at least enough capacity + /// for inserting the given number of elements without reallocating. + #[cfg(feature = "raw")] + pub fn try_with_capacity(capacity: usize) -> Result { + Self::try_with_capacity_in(capacity, Global) + } + + /// Allocates a new hash table with at least enough capacity for inserting + /// the given number of elements without reallocating. + pub fn with_capacity(capacity: usize) -> Self { + Self::with_capacity_in(capacity, Global) + } +} + +impl RawTable { + /// Creates a new empty hash table without allocating any memory, using the + /// given allocator. + /// + /// In effect this returns a table with exactly 1 bucket. However we can + /// leave the data pointer dangling since that bucket is never written to + /// due to our load factor forcing us to always have at least 1 free bucket. + #[cfg_attr(feature = "inline-more", inline)] + pub fn new_in(alloc: A) -> Self { + Self { + table: RawTableInner::new_in(alloc), marker: PhantomData, } } @@ -398,26 +440,19 @@ impl RawTable { /// The control bytes are left uninitialized. #[cfg_attr(feature = "inline-more", inline)] unsafe fn new_uninitialized( + alloc: A, buckets: usize, - fallability: Fallibility, + fallibility: Fallibility, ) -> Result { debug_assert!(buckets.is_power_of_two()); - // Avoid `Option::ok_or_else` because it bloats LLVM IR. - let (layout, ctrl_offset) = match calculate_layout::(buckets) { - Some(lco) => lco, - None => return Err(fallability.capacity_overflow()), - }; - let ptr = match NonNull::new(alloc(layout)) { - Some(ptr) => ptr, - None => return Err(fallability.alloc_err(layout)), - }; - let ctrl = NonNull::new_unchecked(ptr.as_ptr().add(ctrl_offset)); Ok(Self { - ctrl, - bucket_mask: buckets - 1, - items: 0, - growth_left: bucket_mask_to_capacity(buckets - 1), + table: RawTableInner::new_uninitialized( + alloc, + TableLayout::new::(), + buckets, + fallibility, + )?, marker: PhantomData, }) } @@ -425,38 +460,33 @@ impl RawTable { /// Attempts to allocate a new hash table with at least enough capacity /// for inserting the given number of elements without reallocating. fn fallible_with_capacity( + alloc: A, capacity: usize, - fallability: Fallibility, + fallibility: Fallibility, ) -> Result { - if capacity == 0 { - Ok(Self::new()) - } else { - unsafe { - // Avoid `Option::ok_or_else` because it bloats LLVM IR. - let buckets = match capacity_to_buckets(capacity) { - Some(buckets) => buckets, - None => return Err(fallability.capacity_overflow()), - }; - let result = Self::new_uninitialized(buckets, fallability)?; - result.ctrl(0).write_bytes(EMPTY, result.num_ctrl_bytes()); - - Ok(result) - } - } + Ok(Self { + table: RawTableInner::fallible_with_capacity( + alloc, + TableLayout::new::(), + capacity, + fallibility, + )?, + marker: PhantomData, + }) } - /// Attempts to allocate a new hash table with at least enough capacity - /// for inserting the given number of elements without reallocating. + /// Attempts to allocate a new hash table using the given allocator, with at least enough + /// capacity for inserting the given number of elements without reallocating. #[cfg(feature = "raw")] - pub fn try_with_capacity(capacity: usize) -> Result { - Self::fallible_with_capacity(capacity, Fallibility::Fallible) + pub fn try_with_capacity_in(capacity: usize, alloc: A) -> Result { + Self::fallible_with_capacity(alloc, capacity, Fallibility::Fallible) } - /// Allocates a new hash table with at least enough capacity for inserting - /// the given number of elements without reallocating. - pub fn with_capacity(capacity: usize) -> Self { + /// Allocates a new hash table using the given allocator, with at least enough capacity for + /// inserting the given number of elements without reallocating. + pub fn with_capacity_in(capacity: usize, alloc: A) -> Self { // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. - match Self::fallible_with_capacity(capacity, Fallibility::Infallible) { + match Self::fallible_with_capacity(alloc, capacity, Fallibility::Infallible) { Ok(capacity) => capacity, Err(_) => unsafe { hint::unreachable_unchecked() }, } @@ -465,18 +495,13 @@ impl RawTable { /// Deallocates the table without dropping any entries. #[cfg_attr(feature = "inline-more", inline)] unsafe fn free_buckets(&mut self) { - // Avoid `Option::unwrap_or_else` because it bloats LLVM IR. - let (layout, ctrl_offset) = match calculate_layout::(self.buckets()) { - Some(lco) => lco, - None => hint::unreachable_unchecked(), - }; - dealloc(self.ctrl.as_ptr().sub(ctrl_offset), layout); + self.table.free_buckets(TableLayout::new::()) } /// Returns pointer to one past last element of data table. #[cfg_attr(feature = "inline-more", inline)] pub unsafe fn data_end(&self) -> NonNull { - NonNull::new_unchecked(self.ctrl.as_ptr() as *mut T) + NonNull::new_unchecked(self.table.ctrl.as_ptr().cast()) } /// Returns pointer to start of data table. @@ -492,17 +517,10 @@ impl RawTable { bucket.to_base_index(self.data_end()) } - /// Returns a pointer to a control byte. - #[cfg_attr(feature = "inline-more", inline)] - unsafe fn ctrl(&self, index: usize) -> *mut u8 { - debug_assert!(index < self.num_ctrl_bytes()); - self.ctrl.as_ptr().add(index) - } - /// Returns a pointer to an element in the table. #[cfg_attr(feature = "inline-more", inline)] pub unsafe fn bucket(&self, index: usize) -> Bucket { - debug_assert_ne!(self.bucket_mask, 0); + debug_assert_ne!(self.table.bucket_mask, 0); debug_assert!(index < self.buckets()); Bucket::from_base_index(self.data_end(), index) } @@ -512,27 +530,7 @@ impl RawTable { #[deprecated(since = "0.8.1", note = "use erase or remove instead")] pub unsafe fn erase_no_drop(&mut self, item: &Bucket) { let index = self.bucket_index(item); - debug_assert!(is_full(*self.ctrl(index))); - let index_before = index.wrapping_sub(Group::WIDTH) & self.bucket_mask; - let empty_before = Group::load(self.ctrl(index_before)).match_empty(); - let empty_after = Group::load(self.ctrl(index)).match_empty(); - - // If we are inside a continuous block of Group::WIDTH full or deleted - // cells then a probe window may have seen a full block when trying to - // insert. We therefore need to keep that block non-empty so that - // lookups will continue searching to the next probe window. - // - // Note that in this context `leading_zeros` refers to the bytes at the - // end of a group, while `trailing_zeros` refers to the bytes at the - // begining of a group. - let ctrl = if empty_before.leading_zeros() + empty_after.trailing_zeros() >= Group::WIDTH { - DELETED - } else { - self.growth_left += 1; - EMPTY - }; - self.set_ctrl(index, ctrl); - self.items -= 1; + self.table.erase(index) } /// Erases an element from the table, dropping it in place. @@ -578,109 +576,26 @@ impl RawTable { } } - /// Returns an iterator for a probe sequence on the table. - /// - /// This iterator never terminates, but is guaranteed to visit each bucket - /// group exactly once. The loop using `probe_seq` must terminate upon - /// reaching a group containing an empty bucket. - #[cfg_attr(feature = "inline-more", inline)] - fn probe_seq(&self, hash: u64) -> ProbeSeq { - ProbeSeq { - bucket_mask: self.bucket_mask, - pos: h1(hash) & self.bucket_mask, - stride: 0, - } - } - - /// Sets a control byte, and possibly also the replicated control byte at - /// the end of the array. - #[cfg_attr(feature = "inline-more", inline)] - unsafe fn set_ctrl(&self, index: usize, ctrl: u8) { - // Replicate the first Group::WIDTH control bytes at the end of - // the array without using a branch: - // - If index >= Group::WIDTH then index == index2. - // - Otherwise index2 == self.bucket_mask + 1 + index. - // - // The very last replicated control byte is never actually read because - // we mask the initial index for unaligned loads, but we write it - // anyways because it makes the set_ctrl implementation simpler. - // - // If there are fewer buckets than Group::WIDTH then this code will - // replicate the buckets at the end of the trailing group. For example - // with 2 buckets and a group size of 4, the control bytes will look - // like this: - // - // Real | Replicated - // --------------------------------------------- - // | [A] | [B] | [EMPTY] | [EMPTY] | [A] | [B] | - // --------------------------------------------- - let index2 = ((index.wrapping_sub(Group::WIDTH)) & self.bucket_mask) + Group::WIDTH; - - *self.ctrl(index) = ctrl; - *self.ctrl(index2) = ctrl; - } - - /// Searches for an empty or deleted bucket which is suitable for inserting - /// a new element. - /// - /// There must be at least 1 empty bucket in the table. - #[cfg_attr(feature = "inline-more", inline)] - fn find_insert_slot(&self, hash: u64) -> usize { - for pos in self.probe_seq(hash) { - unsafe { - let group = Group::load(self.ctrl(pos)); - if let Some(bit) = group.match_empty_or_deleted().lowest_set_bit() { - let result = (pos + bit) & self.bucket_mask; - - // In tables smaller than the group width, trailing control - // bytes outside the range of the table are filled with - // EMPTY entries. These will unfortunately trigger a - // match, but once masked may point to a full bucket that - // is already occupied. We detect this situation here and - // perform a second scan starting at the begining of the - // table. This second scan is guaranteed to find an empty - // slot (due to the load factor) before hitting the trailing - // control bytes (containing EMPTY). - if unlikely(is_full(*self.ctrl(result))) { - debug_assert!(self.bucket_mask < Group::WIDTH); - debug_assert_ne!(pos, 0); - return Group::load_aligned(self.ctrl(0)) - .match_empty_or_deleted() - .lowest_set_bit_nonzero(); - } else { - return result; - } - } - } - } - - // probe_seq never returns. - unreachable!(); - } - /// Marks all table buckets as empty without dropping their contents. #[cfg_attr(feature = "inline-more", inline)] pub fn clear_no_drop(&mut self) { - if !self.is_empty_singleton() { - unsafe { - self.ctrl(0).write_bytes(EMPTY, self.num_ctrl_bytes()); - } - } - self.items = 0; - self.growth_left = bucket_mask_to_capacity(self.bucket_mask); + self.table.clear_no_drop() } /// Removes all elements from the table without freeing the backing memory. #[cfg_attr(feature = "inline-more", inline)] pub fn clear(&mut self) { // Ensure that the table is reset even if one of the drops panic - let self_ = guard(self, |self_| self_.clear_no_drop()); + let mut self_ = guard(self, |self_| self_.clear_no_drop()); + unsafe { + self_.drop_elements(); + } + } - if mem::needs_drop::() && self_.len() != 0 { - unsafe { - for item in self_.iter() { - item.drop(); - } + unsafe fn drop_elements(&mut self) { + if mem::needs_drop::() && self.len() != 0 { + for item in self.iter() { + item.drop(); } } } @@ -690,9 +605,9 @@ impl RawTable { pub fn shrink_to(&mut self, min_size: usize, hasher: impl Fn(&T) -> u64) { // Calculate the minimal number of elements that we need to reserve // space for. - let min_size = usize::max(self.items, min_size); + let min_size = usize::max(self.table.items, min_size); if min_size == 0 { - *self = Self::new(); + *self = Self::new_in(self.table.alloc.clone()); return; } @@ -708,8 +623,8 @@ impl RawTable { // If we have more buckets than we need, shrink the table. if min_buckets < self.buckets() { // Fast path if the table is empty - if self.items == 0 { - *self = Self::with_capacity(min_size) + if self.table.items == 0 { + *self = Self::with_capacity_in(min_size, self.table.alloc.clone()) } else { // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. if self @@ -726,7 +641,7 @@ impl RawTable { /// without reallocation. #[cfg_attr(feature = "inline-more", inline)] pub fn reserve(&mut self, additional: usize, hasher: impl Fn(&T) -> u64) { - if additional > self.growth_left { + if additional > self.table.growth_left { // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. if self .reserve_rehash(additional, hasher, Fallibility::Infallible) @@ -745,7 +660,7 @@ impl RawTable { additional: usize, hasher: impl Fn(&T) -> u64, ) -> Result<(), TryReserveError> { - if additional > self.growth_left { + if additional > self.table.growth_left { self.reserve_rehash(additional, hasher, Fallibility::Fallible) } else { Ok(()) @@ -759,14 +674,14 @@ impl RawTable { &mut self, additional: usize, hasher: impl Fn(&T) -> u64, - fallability: Fallibility, + fallibility: Fallibility, ) -> Result<(), TryReserveError> { // Avoid `Option::ok_or_else` because it bloats LLVM IR. - let new_items = match self.items.checked_add(additional) { + let new_items = match self.table.items.checked_add(additional) { Some(new_items) => new_items, - None => return Err(fallability.capacity_overflow()), + None => return Err(fallibility.capacity_overflow()), }; - let full_capacity = bucket_mask_to_capacity(self.bucket_mask); + let full_capacity = bucket_mask_to_capacity(self.table.bucket_mask); if new_items <= full_capacity / 2 { // Rehash in-place without re-allocating if we have plenty of spare // capacity that is locked up due to DELETED entries. @@ -778,7 +693,7 @@ impl RawTable { self.resize( usize::max(new_items, full_capacity + 1), hasher, - fallability, + fallibility, ) } } @@ -789,35 +704,18 @@ impl RawTable { /// If `hasher` panics then some the table's contents may be lost. fn rehash_in_place(&mut self, hasher: impl Fn(&T) -> u64) { unsafe { - // Bulk convert all full control bytes to DELETED, and all DELETED - // control bytes to EMPTY. This effectively frees up all buckets - // containing a DELETED entry. - for i in (0..self.buckets()).step_by(Group::WIDTH) { - let group = Group::load_aligned(self.ctrl(i)); - let group = group.convert_special_to_empty_and_full_to_deleted(); - group.store_aligned(self.ctrl(i)); - } - - // Fix up the trailing control bytes. See the comments in set_ctrl - // for the handling of tables smaller than the group width. - if self.buckets() < Group::WIDTH { - self.ctrl(0) - .copy_to(self.ctrl(Group::WIDTH), self.buckets()); - } else { - self.ctrl(0) - .copy_to(self.ctrl(self.buckets()), Group::WIDTH); - } - // If the hash function panics then properly clean up any elements // that we haven't rehashed yet. We unfortunately can't preserve the // element since we lost their hash and have no way of recovering it // without risking another panic. - let mut guard = guard(self, |self_| { + self.table.prepare_rehash_in_place(); + + let mut guard = guard(&mut self.table, move |self_| { if mem::needs_drop::() { for i in 0..self_.buckets() { if *self_.ctrl(i) == DELETED { self_.set_ctrl(i, EMPTY); - self_.bucket(i).drop(); + self_.bucket::(i).drop(); self_.items -= 1; } } @@ -832,6 +730,7 @@ impl RawTable { if *guard.ctrl(i) != DELETED { continue; } + 'inner: loop { // Hash the current item let item = guard.bucket(i); @@ -845,25 +744,19 @@ impl RawTable { // size. If both the new and old position fall within the // same unaligned group, then there is no benefit in moving // it and we can just continue to the next item. - let probe_index = |pos: usize| { - (pos.wrapping_sub(guard.probe_seq(hash).pos) & guard.bucket_mask) - / Group::WIDTH - }; - if likely(probe_index(i) == probe_index(new_i)) { - guard.set_ctrl(i, h2(hash)); + if likely(guard.is_in_same_group(i, new_i, hash)) { + guard.set_ctrl_h2(i, hash); continue 'outer; } // We are moving the current item to a new position. Write // our H2 to the control byte of the new position. - let prev_ctrl = *guard.ctrl(new_i); - guard.set_ctrl(new_i, h2(hash)); - + let prev_ctrl = guard.replace_ctrl_h2(new_i, hash); if prev_ctrl == EMPTY { + guard.set_ctrl(i, EMPTY); // If the target slot is empty, simply move the current // element into the new slot and clear the old control // byte. - guard.set_ctrl(i, EMPTY); guard.bucket(new_i).copy_from_nonoverlapping(&item); continue 'outer; } else { @@ -888,27 +781,12 @@ impl RawTable { &mut self, capacity: usize, hasher: impl Fn(&T) -> u64, - fallability: Fallibility, + fallibility: Fallibility, ) -> Result<(), TryReserveError> { unsafe { - debug_assert!(self.items <= capacity); - - // Allocate and initialize the new table. - let mut new_table = Self::fallible_with_capacity(capacity, fallability)?; - new_table.growth_left -= self.items; - new_table.items = self.items; - - // The hash function may panic, in which case we simply free the new - // table without dropping any elements that may have been copied into - // it. - // - // This guard is also used to free the old table on success, see - // the comment at the bottom of this function. - let mut new_table = guard(ManuallyDrop::new(new_table), |new_table| { - if !new_table.is_empty_singleton() { - new_table.free_buckets(); - } - }); + let mut new_table = + self.table + .prepare_resize(TableLayout::new::(), capacity, fallibility)?; // Copy all elements to the new table. for item in self.iter() { @@ -919,8 +797,7 @@ impl RawTable { // - there are no DELETED entries. // - we know there is enough space in the table. // - all elements are unique. - let index = new_table.find_insert_slot(hash); - new_table.set_ctrl(index, h2(hash)); + let (index, _) = new_table.prepare_insert_slot(hash); new_table.bucket(index).copy_from_nonoverlapping(&item); } @@ -928,7 +805,7 @@ impl RawTable { // self with the new table. The old table will have its memory freed but // the items will not be dropped (since they have been moved into the // new table). - mem::swap(self, &mut new_table); + mem::swap(&mut self.table, &mut new_table); Ok(()) } @@ -940,26 +817,46 @@ impl RawTable { #[cfg_attr(feature = "inline-more", inline)] pub fn insert(&mut self, hash: u64, value: T, hasher: impl Fn(&T) -> u64) -> Bucket { unsafe { - let mut index = self.find_insert_slot(hash); + let mut index = self.table.find_insert_slot(hash); // We can avoid growing the table once we have reached our load // factor if we are replacing a tombstone. This works since the // number of EMPTY slots does not change in this case. - let old_ctrl = *self.ctrl(index); - if unlikely(self.growth_left == 0 && special_is_empty(old_ctrl)) { + let old_ctrl = *self.table.ctrl(index); + if unlikely(self.table.growth_left == 0 && special_is_empty(old_ctrl)) { self.reserve(1, hasher); - index = self.find_insert_slot(hash); + index = self.table.find_insert_slot(hash); } + self.table.record_item_insert_at(index, old_ctrl, hash); + let bucket = self.bucket(index); - self.growth_left -= special_is_empty(old_ctrl) as usize; - self.set_ctrl(index, h2(hash)); bucket.write(value); - self.items += 1; bucket } } + /// Attempts to insert a new element without growing the table and return its raw bucket. + /// + /// Returns an `Err` containing the given element if inserting it would require growing the + /// table. + /// + /// This does not check if the given element already exists in the table. + #[cfg(feature = "raw")] + #[cfg_attr(feature = "inline-more", inline)] + pub fn try_insert_no_grow(&mut self, hash: u64, value: T) -> Result, T> { + unsafe { + match self.table.prepare_insert_no_grow(hash) { + Ok(index) => { + let bucket = self.bucket(index); + bucket.write(value); + Ok(bucket) + } + Err(()) => Err(value), + } + } + } + /// Inserts a new element into the table, and returns a mutable reference to it. /// /// This does not check if the given element already exists in the table. @@ -977,17 +874,15 @@ impl RawTable { #[cfg(any(feature = "raw", feature = "rustc-internal-api"))] pub fn insert_no_grow(&mut self, hash: u64, value: T) -> Bucket { unsafe { - let index = self.find_insert_slot(hash); - let bucket = self.bucket(index); + let (index, old_ctrl) = self.table.prepare_insert_slot(hash); + let bucket = self.table.bucket(index); // If we are replacing a DELETED entry then we don't need to update // the load counter. - let old_ctrl = *self.ctrl(index); - self.growth_left -= special_is_empty(old_ctrl) as usize; + self.table.growth_left -= special_is_empty(old_ctrl) as usize; - self.set_ctrl(index, h2(hash)); bucket.write(value); - self.items += 1; + self.table.items += 1; bucket } } @@ -1004,14 +899,14 @@ impl RawTable { F: FnOnce(T) -> Option, { let index = self.bucket_index(&bucket); - let old_ctrl = *self.ctrl(index); + let old_ctrl = *self.table.ctrl(index); debug_assert!(is_full(old_ctrl)); - let old_growth_left = self.growth_left; + let old_growth_left = self.table.growth_left; let item = self.remove(bucket); if let Some(new_item) = f(item) { - self.growth_left = old_growth_left; - self.set_ctrl(index, old_ctrl); - self.items += 1; + self.table.growth_left = old_growth_left; + self.table.set_ctrl(index, old_ctrl); + self.table.items += 1; self.bucket(index).write(new_item); true } else { @@ -1053,38 +948,83 @@ impl RawTable { } } + /// Attempts to get mutable references to `N` entries in the table at once. + /// + /// Returns an array of length `N` with the results of each query. For soundness, + /// at most one mutable reference will be returned to any entry. An + /// `Err(UnavailableMutError::Duplicate(i))` in the returned array indicates that a suitable + /// entry exists, but a mutable reference to it already occurs at index `i` in the returned + /// array. + /// + /// The `eq` argument should be a closure such that `eq(i, k)` returns true if `k` is equal to + /// the `i`th key to be looked up. + /// + /// This method is available only if the `nightly` feature is enabled. + #[cfg(feature = "nightly")] + pub fn get_each_mut( + &mut self, + hashes: [u64; N], + mut eq: impl FnMut(usize, &T) -> bool, + ) -> [Result<&'_ mut T, UnavailableMutError>; N] { + // Collect the requested buckets. + // TODO use `MaybeUninit::uninit_array` here instead once that's stable. + let mut buckets: [MaybeUninit>>; N] = + unsafe { MaybeUninit::uninit().assume_init() }; + for i in 0..N { + buckets[i] = MaybeUninit::new(self.find(hashes[i], |k| eq(i, k))); + } + let buckets: [Option>; N] = unsafe { MaybeUninit::array_assume_init(buckets) }; + + // Walk through the buckets, checking for duplicates and building up the output array. + // TODO use `MaybeUninit::uninit_array` here instead once that's stable. + let mut out: [MaybeUninit>; N] = + unsafe { MaybeUninit::uninit().assume_init() }; + for i in 0..N { + out[i] = MaybeUninit::new( + #[allow(clippy::never_loop)] + 'outer: loop { + for j in 0..i { + match (&buckets[j], &buckets[i]) { + // These two buckets are the same, and we can't safely return a second + // mutable reference to the same entry. + (Some(prev), Some(cur)) if prev.as_ptr() == cur.as_ptr() => { + break 'outer Err(UnavailableMutError::Duplicate(j)); + } + _ => {} + } + } + // This bucket is distinct from all previous buckets (or it doesn't exist), so + // we're clear to return the result of the lookup. + break match &buckets[i] { + None => Err(UnavailableMutError::Absent), + Some(bkt) => unsafe { Ok(bkt.as_mut()) }, + }; + }, + ) + } + + unsafe { MaybeUninit::array_assume_init(out) } + } + /// Returns the number of elements the map can hold without reallocating. /// /// This number is a lower bound; the table might be able to hold /// more, but is guaranteed to be able to hold at least this many. #[cfg_attr(feature = "inline-more", inline)] pub fn capacity(&self) -> usize { - self.items + self.growth_left + self.table.items + self.table.growth_left } /// Returns the number of elements in the table. #[cfg_attr(feature = "inline-more", inline)] pub fn len(&self) -> usize { - self.items + self.table.items } /// Returns the number of buckets in the table. #[cfg_attr(feature = "inline-more", inline)] pub fn buckets(&self) -> usize { - self.bucket_mask + 1 - } - - /// Returns the number of control bytes in the table. - #[cfg_attr(feature = "inline-more", inline)] - fn num_ctrl_bytes(&self) -> usize { - self.bucket_mask + 1 + Group::WIDTH - } - - /// Returns whether this table points to the empty singleton with a capacity - /// of 0. - #[cfg_attr(feature = "inline-more", inline)] - fn is_empty_singleton(&self) -> bool { - self.bucket_mask == 0 + self.table.bucket_mask + 1 } /// Returns an iterator over every element in the table. It is up to @@ -1095,8 +1035,8 @@ impl RawTable { pub unsafe fn iter(&self) -> RawIter { let data = Bucket::from_base_index(self.data_end(), 0); RawIter { - iter: RawIterRange::new(self.ctrl.as_ptr(), data, self.buckets()), - items: self.items, + iter: RawIterRange::new(self.table.ctrl.as_ptr(), data, self.table.buckets()), + items: self.table.items, } } @@ -1108,14 +1048,14 @@ impl RawTable { /// `RawIterHash`. Because we cannot make the `next` method unsafe on the /// `RawIterHash` struct, we have to make the `iter_hash` method unsafe. #[cfg_attr(feature = "inline-more", inline)] - pub unsafe fn iter_hash(&self, hash: u64) -> RawIterHash<'_, T> { + pub unsafe fn iter_hash(&self, hash: u64) -> RawIterHash<'_, T, A> { RawIterHash::new(self, hash) } /// Returns an iterator which removes all elements from the table without /// freeing the memory. #[cfg_attr(feature = "inline-more", inline)] - pub fn drain(&mut self) -> RawDrain<'_, T> { + pub fn drain(&mut self) -> RawDrain<'_, T, A> { unsafe { let iter = self.iter(); self.drain_iter_from(iter) @@ -1130,11 +1070,11 @@ impl RawTable { /// It is up to the caller to ensure that the iterator is valid for this /// `RawTable` and covers all items that remain in the table. #[cfg_attr(feature = "inline-more", inline)] - pub unsafe fn drain_iter_from(&mut self, iter: RawIter) -> RawDrain<'_, T> { + pub unsafe fn drain_iter_from(&mut self, iter: RawIter) -> RawDrain<'_, T, A> { debug_assert_eq!(iter.len(), self.len()); RawDrain { iter, - table: ManuallyDrop::new(mem::replace(self, Self::new())), + table: ManuallyDrop::new(mem::replace(self, Self::new_in(self.table.alloc.clone()))), orig_table: NonNull::from(self), marker: PhantomData, } @@ -1146,31 +1086,33 @@ impl RawTable { /// /// It is up to the caller to ensure that the iterator is valid for this /// `RawTable` and covers all items that remain in the table. - pub unsafe fn into_iter_from(self, iter: RawIter) -> RawIntoIter { + pub unsafe fn into_iter_from(self, iter: RawIter) -> RawIntoIter { debug_assert_eq!(iter.len(), self.len()); - let alloc = self.into_alloc(); + let alloc = self.table.alloc.clone(); + let allocation = self.into_allocation(); RawIntoIter { iter, - alloc, + allocation, marker: PhantomData, + alloc, } } /// Converts the table into a raw allocation. The contents of the table /// should be dropped using a `RawIter` before freeing the allocation. #[cfg_attr(feature = "inline-more", inline)] - pub(crate) fn into_alloc(self) -> Option<(NonNull, Layout)> { - let alloc = if self.is_empty_singleton() { + pub(crate) fn into_allocation(self) -> Option<(NonNull, Layout)> { + let alloc = if self.table.is_empty_singleton() { None } else { // Avoid `Option::unwrap_or_else` because it bloats LLVM IR. - let (layout, ctrl_offset) = match calculate_layout::(self.buckets()) { + let (layout, ctrl_offset) = match calculate_layout::(self.table.buckets()) { Some(lco) => lco, None => unsafe { hint::unreachable_unchecked() }, }; Some(( - unsafe { NonNull::new_unchecked(self.ctrl.as_ptr().sub(ctrl_offset)) }, + unsafe { NonNull::new_unchecked(self.table.ctrl.as_ptr().sub(ctrl_offset)) }, layout, )) }; @@ -1179,18 +1121,364 @@ impl RawTable { } } -unsafe impl Send for RawTable where T: Send {} -unsafe impl Sync for RawTable where T: Sync {} +unsafe impl Send for RawTable where T: Send {} +unsafe impl Sync for RawTable where T: Sync {} + +impl RawTableInner { + #[cfg_attr(feature = "inline-more", inline)] + const fn new_in(alloc: A) -> Self { + Self { + // Be careful to cast the entire slice to a raw pointer. + ctrl: unsafe { NonNull::new_unchecked(Group::static_empty() as *const _ as *mut u8) }, + bucket_mask: 0, + items: 0, + growth_left: 0, + alloc, + } + } +} + +impl RawTableInner { + #[cfg_attr(feature = "inline-more", inline)] + unsafe fn new_uninitialized( + alloc: A, + table_layout: TableLayout, + buckets: usize, + fallibility: Fallibility, + ) -> Result { + debug_assert!(buckets.is_power_of_two()); + + // Avoid `Option::ok_or_else` because it bloats LLVM IR. + let (layout, ctrl_offset) = match table_layout.calculate_layout_for(buckets) { + Some(lco) => lco, + None => return Err(fallibility.capacity_overflow()), + }; + + let ptr: NonNull = match do_alloc(&alloc, layout) { + Ok(block) => block.cast(), + Err(_) => return Err(fallibility.alloc_err(layout)), + }; + + let ctrl = NonNull::new_unchecked(ptr.as_ptr().add(ctrl_offset)); + Ok(Self { + ctrl, + bucket_mask: buckets - 1, + items: 0, + growth_left: bucket_mask_to_capacity(buckets - 1), + alloc, + }) + } + + #[inline] + fn fallible_with_capacity( + alloc: A, + table_layout: TableLayout, + capacity: usize, + fallibility: Fallibility, + ) -> Result { + if capacity == 0 { + Ok(Self::new_in(alloc)) + } else { + unsafe { + let buckets = + capacity_to_buckets(capacity).ok_or_else(|| fallibility.capacity_overflow())?; + + let result = Self::new_uninitialized(alloc, table_layout, buckets, fallibility)?; + result.ctrl(0).write_bytes(EMPTY, result.num_ctrl_bytes()); + + Ok(result) + } + } + } + + /// Searches for an empty or deleted bucket which is suitable for inserting + /// a new element and sets the hash for that slot. + /// + /// There must be at least 1 empty bucket in the table. + #[inline] + unsafe fn prepare_insert_slot(&self, hash: u64) -> (usize, u8) { + let index = self.find_insert_slot(hash); + let old_ctrl = *self.ctrl(index); + self.set_ctrl_h2(index, hash); + (index, old_ctrl) + } + + /// Searches for an empty or deleted bucket which is suitable for inserting + /// a new element. + /// + /// There must be at least 1 empty bucket in the table. + #[inline] + fn find_insert_slot(&self, hash: u64) -> usize { + let mut probe_seq = self.probe_seq(hash); + loop { + unsafe { + let group = Group::load(self.ctrl(probe_seq.pos)); + if let Some(bit) = group.match_empty_or_deleted().lowest_set_bit() { + let result = (probe_seq.pos + bit) & self.bucket_mask; + + // In tables smaller than the group width, trailing control + // bytes outside the range of the table are filled with + // EMPTY entries. These will unfortunately trigger a + // match, but once masked may point to a full bucket that + // is already occupied. We detect this situation here and + // perform a second scan starting at the begining of the + // table. This second scan is guaranteed to find an empty + // slot (due to the load factor) before hitting the trailing + // control bytes (containing EMPTY). + if unlikely(is_full(*self.ctrl(result))) { + debug_assert!(self.bucket_mask < Group::WIDTH); + debug_assert_ne!(probe_seq.pos, 0); + return Group::load_aligned(self.ctrl(0)) + .match_empty_or_deleted() + .lowest_set_bit_nonzero(); + } + + return result; + } + } + probe_seq.move_next(self.bucket_mask); + } + } + + #[allow(clippy::mut_mut)] + #[inline] + unsafe fn prepare_rehash_in_place(&mut self) { + // Bulk convert all full control bytes to DELETED, and all DELETED + // control bytes to EMPTY. This effectively frees up all buckets + // containing a DELETED entry. + for i in (0..self.buckets()).step_by(Group::WIDTH) { + let group = Group::load_aligned(self.ctrl(i)); + let group = group.convert_special_to_empty_and_full_to_deleted(); + group.store_aligned(self.ctrl(i)); + } + + // Fix up the trailing control bytes. See the comments in set_ctrl + // for the handling of tables smaller than the group width. + if self.buckets() < Group::WIDTH { + self.ctrl(0) + .copy_to(self.ctrl(Group::WIDTH), self.buckets()); + } else { + self.ctrl(0) + .copy_to(self.ctrl(self.buckets()), Group::WIDTH); + } + } + + #[cfg_attr(feature = "inline-more", inline)] + unsafe fn bucket(&self, index: usize) -> Bucket { + debug_assert_ne!(self.bucket_mask, 0); + debug_assert!(index < self.buckets()); + Bucket::from_base_index(self.data_end(), index) + } + + #[cfg_attr(feature = "inline-more", inline)] + unsafe fn data_end(&self) -> NonNull { + NonNull::new_unchecked(self.ctrl.as_ptr().cast()) + } + + /// Returns an iterator-like object for a probe sequence on the table. + /// + /// This iterator never terminates, but is guaranteed to visit each bucket + /// group exactly once. The loop using `probe_seq` must terminate upon + /// reaching a group containing an empty bucket. + #[inline] + fn probe_seq(&self, hash: u64) -> ProbeSeq { + ProbeSeq { + pos: h1(hash) & self.bucket_mask, + stride: 0, + } + } + + /// Returns the index of a bucket for which a value must be inserted if there is enough rooom + /// in the table, otherwise returns error + #[cfg(feature = "raw")] + #[inline] + unsafe fn prepare_insert_no_grow(&mut self, hash: u64) -> Result { + let index = self.find_insert_slot(hash); + let old_ctrl = *self.ctrl(index); + if unlikely(self.growth_left == 0 && special_is_empty(old_ctrl)) { + Err(()) + } else { + self.record_item_insert_at(index, old_ctrl, hash); + Ok(index) + } + } + + #[inline] + unsafe fn record_item_insert_at(&mut self, index: usize, old_ctrl: u8, hash: u64) { + self.growth_left -= special_is_empty(old_ctrl) as usize; + self.set_ctrl_h2(index, hash); + self.items += 1; + } + + #[inline] + fn is_in_same_group(&self, i: usize, new_i: usize, hash: u64) -> bool { + let probe_seq_pos = self.probe_seq(hash).pos; + let probe_index = + |pos: usize| (pos.wrapping_sub(probe_seq_pos) & self.bucket_mask) / Group::WIDTH; + probe_index(i) == probe_index(new_i) + } + + /// Sets a control byte to the hash, and possibly also the replicated control byte at + /// the end of the array. + #[inline] + unsafe fn set_ctrl_h2(&self, index: usize, hash: u64) { + self.set_ctrl(index, h2(hash)) + } + + #[inline] + unsafe fn replace_ctrl_h2(&self, index: usize, hash: u64) -> u8 { + let prev_ctrl = *self.ctrl(index); + self.set_ctrl_h2(index, hash); + prev_ctrl + } + + /// Sets a control byte, and possibly also the replicated control byte at + /// the end of the array. + #[inline] + unsafe fn set_ctrl(&self, index: usize, ctrl: u8) { + // Replicate the first Group::WIDTH control bytes at the end of + // the array without using a branch: + // - If index >= Group::WIDTH then index == index2. + // - Otherwise index2 == self.bucket_mask + 1 + index. + // + // The very last replicated control byte is never actually read because + // we mask the initial index for unaligned loads, but we write it + // anyways because it makes the set_ctrl implementation simpler. + // + // If there are fewer buckets than Group::WIDTH then this code will + // replicate the buckets at the end of the trailing group. For example + // with 2 buckets and a group size of 4, the control bytes will look + // like this: + // + // Real | Replicated + // --------------------------------------------- + // | [A] | [B] | [EMPTY] | [EMPTY] | [A] | [B] | + // --------------------------------------------- + let index2 = ((index.wrapping_sub(Group::WIDTH)) & self.bucket_mask) + Group::WIDTH; + + *self.ctrl(index) = ctrl; + *self.ctrl(index2) = ctrl; + } -impl Clone for RawTable { + /// Returns a pointer to a control byte. + #[inline] + unsafe fn ctrl(&self, index: usize) -> *mut u8 { + debug_assert!(index < self.num_ctrl_bytes()); + self.ctrl.as_ptr().add(index) + } + + #[inline] + fn buckets(&self) -> usize { + self.bucket_mask + 1 + } + + #[inline] + fn num_ctrl_bytes(&self) -> usize { + self.bucket_mask + 1 + Group::WIDTH + } + + #[inline] + fn is_empty_singleton(&self) -> bool { + self.bucket_mask == 0 + } + + #[allow(clippy::mut_mut)] + #[inline] + unsafe fn prepare_resize( + &self, + table_layout: TableLayout, + capacity: usize, + fallibility: Fallibility, + ) -> Result, TryReserveError> { + debug_assert!(self.items <= capacity); + + // Allocate and initialize the new table. + let mut new_table = RawTableInner::fallible_with_capacity( + self.alloc.clone(), + table_layout, + capacity, + fallibility, + )?; + new_table.growth_left -= self.items; + new_table.items = self.items; + + // The hash function may panic, in which case we simply free the new + // table without dropping any elements that may have been copied into + // it. + // + // This guard is also used to free the old table on success, see + // the comment at the bottom of this function. + Ok(guard(new_table, move |self_| { + if !self_.is_empty_singleton() { + self_.free_buckets(table_layout); + } + })) + } + + #[inline] + unsafe fn free_buckets(&mut self, table_layout: TableLayout) { + // Avoid `Option::unwrap_or_else` because it bloats LLVM IR. + let (layout, ctrl_offset) = match table_layout.calculate_layout_for(self.buckets()) { + Some(lco) => lco, + None => hint::unreachable_unchecked(), + }; + self.alloc.deallocate( + NonNull::new_unchecked(self.ctrl.as_ptr().sub(ctrl_offset)), + layout, + ); + } + + /// Marks all table buckets as empty without dropping their contents. + #[inline] + fn clear_no_drop(&mut self) { + if !self.is_empty_singleton() { + unsafe { + self.ctrl(0).write_bytes(EMPTY, self.num_ctrl_bytes()); + } + } + self.items = 0; + self.growth_left = bucket_mask_to_capacity(self.bucket_mask); + } + + #[inline] + unsafe fn erase(&mut self, index: usize) { + debug_assert!(is_full(*self.ctrl(index))); + let index_before = index.wrapping_sub(Group::WIDTH) & self.bucket_mask; + let empty_before = Group::load(self.ctrl(index_before)).match_empty(); + let empty_after = Group::load(self.ctrl(index)).match_empty(); + + // If we are inside a continuous block of Group::WIDTH full or deleted + // cells then a probe window may have seen a full block when trying to + // insert. We therefore need to keep that block non-empty so that + // lookups will continue searching to the next probe window. + // + // Note that in this context `leading_zeros` refers to the bytes at the + // end of a group, while `trailing_zeros` refers to the bytes at the + // begining of a group. + let ctrl = if empty_before.leading_zeros() + empty_after.trailing_zeros() >= Group::WIDTH { + DELETED + } else { + self.growth_left += 1; + EMPTY + }; + self.set_ctrl(index, ctrl); + self.items -= 1; + } +} + +impl Clone for RawTable { fn clone(&self) -> Self { - if self.is_empty_singleton() { - Self::new() + if self.table.is_empty_singleton() { + Self::new_in(self.table.alloc.clone()) } else { unsafe { let mut new_table = ManuallyDrop::new( // Avoid `Result::ok_or_else` because it bloats LLVM IR. - match Self::new_uninitialized(self.buckets(), Fallibility::Infallible) { + match Self::new_uninitialized( + self.table.alloc.clone(), + self.table.buckets(), + Fallibility::Infallible, + ) { Ok(table) => table, Err(_) => hint::unreachable_unchecked(), }, @@ -1208,26 +1496,26 @@ impl Clone for RawTable { } fn clone_from(&mut self, source: &Self) { - if source.is_empty_singleton() { - *self = Self::new(); + if source.table.is_empty_singleton() { + *self = Self::new_in(self.table.alloc.clone()); } else { unsafe { // First, drop all our elements without clearing the control bytes. - if mem::needs_drop::() && self.len() != 0 { - for item in self.iter() { - item.drop(); - } - } + self.drop_elements(); // If necessary, resize our table to match the source. if self.buckets() != source.buckets() { // Skip our drop by using ptr::write. - if !self.is_empty_singleton() { + if !self.table.is_empty_singleton() { self.free_buckets(); } (self as *mut Self).write( // Avoid `Result::unwrap_or_else` because it bloats LLVM IR. - match Self::new_uninitialized(source.buckets(), Fallibility::Infallible) { + match Self::new_uninitialized( + self.table.alloc.clone(), + source.buckets(), + Fallibility::Infallible, + ) { Ok(table) => table, Err(_) => hint::unreachable_unchecked(), }, @@ -1247,7 +1535,7 @@ impl Clone for RawTable { trait RawTableClone { unsafe fn clone_from_spec(&mut self, source: &Self, on_panic: impl FnMut(&mut Self)); } -impl RawTableClone for RawTable { +impl RawTableClone for RawTable { #[cfg_attr(feature = "inline-more", inline)] default_fn! { unsafe fn clone_from_spec(&mut self, source: &Self, on_panic: impl FnMut(&mut Self)) { @@ -1256,29 +1544,31 @@ impl RawTableClone for RawTable { } } #[cfg(feature = "nightly")] -impl RawTableClone for RawTable { +impl RawTableClone for RawTable { #[cfg_attr(feature = "inline-more", inline)] unsafe fn clone_from_spec(&mut self, source: &Self, _on_panic: impl FnMut(&mut Self)) { source + .table .ctrl(0) - .copy_to_nonoverlapping(self.ctrl(0), self.num_ctrl_bytes()); + .copy_to_nonoverlapping(self.table.ctrl(0), self.table.num_ctrl_bytes()); source .data_start() - .copy_to_nonoverlapping(self.data_start(), self.buckets()); + .copy_to_nonoverlapping(self.data_start(), self.table.buckets()); - self.items = source.items; - self.growth_left = source.growth_left; + self.table.items = source.table.items; + self.table.growth_left = source.table.growth_left; } } -impl RawTable { +impl RawTable { /// Common code for clone and clone_from. Assumes `self.buckets() == source.buckets()`. #[cfg_attr(feature = "inline-more", inline)] unsafe fn clone_from_impl(&mut self, source: &Self, mut on_panic: impl FnMut(&mut Self)) { // Copy the control bytes unchanged. We do this in a single pass source + .table .ctrl(0) - .copy_to_nonoverlapping(self.ctrl(0), self.num_ctrl_bytes()); + .copy_to_nonoverlapping(self.table.ctrl(0), self.table.num_ctrl_bytes()); // The cloning of elements may panic, in which case we need // to make sure we drop only the elements that have been @@ -1286,7 +1576,7 @@ impl RawTable { let mut guard = guard((0, &mut *self), |(index, self_)| { if mem::needs_drop::() && self_.len() != 0 { for i in 0..=*index { - if is_full(*self_.ctrl(i)) { + if is_full(*self_.table.ctrl(i)) { self_.bucket(i).drop(); } } @@ -1310,8 +1600,8 @@ impl RawTable { // Successfully cloned all items, no need to clean up. mem::forget(guard); - self.items = source.items; - self.growth_left = source.growth_left; + self.table.items = source.table.items; + self.table.growth_left = source.table.growth_left; } /// Variant of `clone_from` to use when a hasher is available. @@ -1321,8 +1611,8 @@ impl RawTable { // elements one by one. We don't do this if we have the same number of // buckets as the source since we can just copy the contents directly // in that case. - if self.buckets() != source.buckets() - && bucket_mask_to_capacity(self.bucket_mask) >= source.len() + if self.table.buckets() != source.table.buckets() + && bucket_mask_to_capacity(self.table.bucket_mask) >= source.len() { self.clear(); @@ -1343,8 +1633,7 @@ impl RawTable { // - there are no DELETED entries. // - we know there is enough space in the table. // - all elements are unique. - let index = guard_self.find_insert_slot(hash); - guard_self.set_ctrl(index, h2(hash)); + let (index, _) = guard_self.table.prepare_insert_slot(hash); guard_self.bucket(index).write(item); } } @@ -1352,53 +1641,52 @@ impl RawTable { // Successfully cloned all items, no need to clean up. mem::forget(guard_self); - self.items = source.items; - self.growth_left -= source.items; + self.table.items = source.table.items; + self.table.growth_left -= source.table.items; } else { self.clone_from(source); } } } +impl Default for RawTable { + #[cfg_attr(feature = "inline-more", inline)] + fn default() -> Self { + Self::new_in(Default::default()) + } +} + #[cfg(feature = "nightly")] -unsafe impl<#[may_dangle] T> Drop for RawTable { +unsafe impl<#[may_dangle] T, A: Allocator + Clone> Drop for RawTable { #[cfg_attr(feature = "inline-more", inline)] fn drop(&mut self) { - if !self.is_empty_singleton() { + if !self.table.is_empty_singleton() { unsafe { - if mem::needs_drop::() && self.len() != 0 { - for item in self.iter() { - item.drop(); - } - } + self.drop_elements(); self.free_buckets(); } } } } #[cfg(not(feature = "nightly"))] -impl Drop for RawTable { +impl Drop for RawTable { #[cfg_attr(feature = "inline-more", inline)] fn drop(&mut self) { - if !self.is_empty_singleton() { + if !self.table.is_empty_singleton() { unsafe { - if mem::needs_drop::() && self.len() != 0 { - for item in self.iter() { - item.drop(); - } - } + self.drop_elements(); self.free_buckets(); } } } } -impl IntoIterator for RawTable { +impl IntoIterator for RawTable { type Item = T; - type IntoIter = RawIntoIter; + type IntoIter = RawIntoIter; #[cfg_attr(feature = "inline-more", inline)] - fn into_iter(self) -> RawIntoIter { + fn into_iter(self) -> RawIntoIter { unsafe { let iter = self.iter(); self.into_iter_from(iter) @@ -1681,6 +1969,14 @@ impl RawIter { } } } + + unsafe fn drop_elements(&mut self) { + if mem::needs_drop::() && self.len() != 0 { + for item in self { + item.drop(); + } + } + } } impl Clone for RawIter { @@ -1720,62 +2016,55 @@ impl ExactSizeIterator for RawIter {} impl FusedIterator for RawIter {} /// Iterator which consumes a table and returns elements. -pub struct RawIntoIter { +pub struct RawIntoIter { iter: RawIter, - alloc: Option<(NonNull, Layout)>, + allocation: Option<(NonNull, Layout)>, marker: PhantomData, + alloc: A, } -impl RawIntoIter { +impl RawIntoIter { #[cfg_attr(feature = "inline-more", inline)] pub fn iter(&self) -> RawIter { self.iter.clone() } } -unsafe impl Send for RawIntoIter where T: Send {} -unsafe impl Sync for RawIntoIter where T: Sync {} +unsafe impl Send for RawIntoIter where T: Send {} +unsafe impl Sync for RawIntoIter where T: Sync {} #[cfg(feature = "nightly")] -unsafe impl<#[may_dangle] T> Drop for RawIntoIter { +unsafe impl<#[may_dangle] T, A: Allocator + Clone> Drop for RawIntoIter { #[cfg_attr(feature = "inline-more", inline)] fn drop(&mut self) { unsafe { // Drop all remaining elements - if mem::needs_drop::() && self.iter.len() != 0 { - while let Some(item) = self.iter.next() { - item.drop(); - } - } + self.iter.drop_elements(); // Free the table - if let Some((ptr, layout)) = self.alloc { - dealloc(ptr.as_ptr(), layout); + if let Some((ptr, layout)) = self.allocation { + self.alloc.deallocate(ptr, layout); } } } } #[cfg(not(feature = "nightly"))] -impl Drop for RawIntoIter { +impl Drop for RawIntoIter { #[cfg_attr(feature = "inline-more", inline)] fn drop(&mut self) { unsafe { // Drop all remaining elements - if mem::needs_drop::() && self.iter.len() != 0 { - while let Some(item) = self.iter.next() { - item.drop(); - } - } + self.iter.drop_elements(); // Free the table - if let Some((ptr, layout)) = self.alloc { - dealloc(ptr.as_ptr(), layout); + if let Some((ptr, layout)) = self.allocation { + self.alloc.deallocate(ptr, layout); } } } } -impl Iterator for RawIntoIter { +impl Iterator for RawIntoIter { type Item = T; #[cfg_attr(feature = "inline-more", inline)] @@ -1789,44 +2078,40 @@ impl Iterator for RawIntoIter { } } -impl ExactSizeIterator for RawIntoIter {} -impl FusedIterator for RawIntoIter {} +impl ExactSizeIterator for RawIntoIter {} +impl FusedIterator for RawIntoIter {} /// Iterator which consumes elements without freeing the table storage. -pub struct RawDrain<'a, T> { +pub struct RawDrain<'a, T, A: Allocator + Clone = Global> { iter: RawIter, // The table is moved into the iterator for the duration of the drain. This // ensures that an empty table is left if the drain iterator is leaked // without dropping. - table: ManuallyDrop>, - orig_table: NonNull>, + table: ManuallyDrop>, + orig_table: NonNull>, // We don't use a &'a mut RawTable because we want RawDrain to be // covariant over T. - marker: PhantomData<&'a RawTable>, + marker: PhantomData<&'a RawTable>, } -impl RawDrain<'_, T> { +impl RawDrain<'_, T, A> { #[cfg_attr(feature = "inline-more", inline)] pub fn iter(&self) -> RawIter { self.iter.clone() } } -unsafe impl Send for RawDrain<'_, T> where T: Send {} -unsafe impl Sync for RawDrain<'_, T> where T: Sync {} +unsafe impl Send for RawDrain<'_, T, A> where T: Send {} +unsafe impl Sync for RawDrain<'_, T, A> where T: Sync {} -impl Drop for RawDrain<'_, T> { +impl Drop for RawDrain<'_, T, A> { #[cfg_attr(feature = "inline-more", inline)] fn drop(&mut self) { unsafe { // Drop all remaining elements. Note that this may panic. - if mem::needs_drop::() && self.iter.len() != 0 { - while let Some(item) = self.iter.next() { - item.drop(); - } - } + self.iter.drop_elements(); // Reset the contents of the table now that all elements have been // dropped. @@ -1840,7 +2125,7 @@ impl Drop for RawDrain<'_, T> { } } -impl Iterator for RawDrain<'_, T> { +impl Iterator for RawDrain<'_, T, A> { type Item = T; #[cfg_attr(feature = "inline-more", inline)] @@ -1857,14 +2142,19 @@ impl Iterator for RawDrain<'_, T> { } } -impl ExactSizeIterator for RawDrain<'_, T> {} -impl FusedIterator for RawDrain<'_, T> {} +impl ExactSizeIterator for RawDrain<'_, T, A> {} +impl FusedIterator for RawDrain<'_, T, A> {} /// Iterator over occupied buckets that could match a given hash. /// /// In rare cases, the iterator may return a bucket with a different hash. -pub struct RawIterHash<'a, T> { - table: &'a RawTable, +pub struct RawIterHash<'a, T, A: Allocator + Clone = Global> { + inner: RawIterHashInner<'a, A>, + _marker: PhantomData, +} + +struct RawIterHashInner<'a, A: Allocator + Clone> { + table: &'a RawTableInner, // The top 7 bits of the hash. h2_hash: u8, @@ -1872,28 +2162,34 @@ pub struct RawIterHash<'a, T> { // The sequence of groups to probe in the search. probe_seq: ProbeSeq, - // The current group and its position. - pos: usize, group: Group, // The elements within the group with a matching h2-hash. bitmask: BitMaskIter, } -impl<'a, T> RawIterHash<'a, T> { - fn new(table: &'a RawTable, hash: u64) -> Self { +impl<'a, T, A: Allocator + Clone> RawIterHash<'a, T, A> { + #[cfg_attr(feature = "inline-more", inline)] + fn new(table: &'a RawTable, hash: u64) -> Self { + RawIterHash { + inner: RawIterHashInner::new(&table.table, hash), + _marker: PhantomData, + } + } +} +impl<'a, A: Allocator + Clone> RawIterHashInner<'a, A> { + #[cfg_attr(feature = "inline-more", inline)] + fn new(table: &'a RawTableInner, hash: u64) -> Self { unsafe { let h2_hash = h2(hash); - let mut probe_seq = table.probe_seq(hash); - let pos = probe_seq.next().unwrap(); - let group = Group::load(table.ctrl(pos)); + let probe_seq = table.probe_seq(hash); + let group = Group::load(table.ctrl(probe_seq.pos)); let bitmask = group.match_byte(h2_hash).into_iter(); - RawIterHash { + RawIterHashInner { table, h2_hash, probe_seq, - pos, group, bitmask, } @@ -1901,24 +2197,66 @@ impl<'a, T> RawIterHash<'a, T> { } } -impl<'a, T> Iterator for RawIterHash<'a, T> { +impl<'a, T, A: Allocator + Clone> Iterator for RawIterHash<'a, T, A> { type Item = Bucket; fn next(&mut self) -> Option> { + unsafe { + match self.inner.next() { + Some(index) => Some(self.inner.table.bucket(index)), + None => None, + } + } + } +} + +impl<'a, A: Allocator + Clone> Iterator for RawIterHashInner<'a, A> { + type Item = usize; + + fn next(&mut self) -> Option { unsafe { loop { if let Some(bit) = self.bitmask.next() { - let index = (self.pos + bit) & self.table.bucket_mask; - let bucket = self.table.bucket(index); - return Some(bucket); + let index = (self.probe_seq.pos + bit) & self.table.bucket_mask; + return Some(index); } if likely(self.group.match_empty().any_bit_set()) { return None; } - self.pos = self.probe_seq.next().unwrap(); - self.group = Group::load(self.table.ctrl(self.pos)); + self.probe_seq.move_next(self.table.bucket_mask); + self.group = Group::load(self.table.ctrl(self.probe_seq.pos)); self.bitmask = self.group.match_byte(self.h2_hash).into_iter(); } } } } + +#[cfg(test)] +mod test_map { + use super::*; + + #[test] + fn rehash() { + let mut table = RawTable::new(); + let hasher = |i: &u64| *i; + for i in 0..100 { + table.insert(i, i, hasher); + } + + for i in 0..100 { + unsafe { + assert_eq!(table.find(i, |x| *x == i).map(|b| b.read()), Some(i)); + } + assert!(table.find(i + 100, |x| *x == i + 100).is_none()); + } + + table.rehash_in_place(hasher); + + for i in 0..100 { + unsafe { + assert_eq!(table.find(i, |x| *x == i).map(|b| b.read()), Some(i)); + } + assert!(table.find(i + 100, |x| *x == i + 100).is_none()); + } + } +} diff --git a/vendor/hashbrown/src/raw/sse2.rs b/vendor/hashbrown/src/raw/sse2.rs index a27bc0910f..eed9684858 100644 --- a/vendor/hashbrown/src/raw/sse2.rs +++ b/vendor/hashbrown/src/raw/sse2.rs @@ -28,12 +28,13 @@ impl Group { /// value for an empty hash table. /// /// This is guaranteed to be aligned to the group size. + #[allow(clippy::items_after_statements)] pub const fn static_empty() -> &'static [u8; Group::WIDTH] { #[repr(C)] struct AlignedBytes { _align: [Group; 0], bytes: [u8; Group::WIDTH], - }; + } const ALIGNED_BYTES: AlignedBytes = AlignedBytes { _align: [], bytes: [EMPTY; Group::WIDTH], @@ -45,7 +46,7 @@ impl Group { #[inline] #[allow(clippy::cast_ptr_alignment)] // unaligned load pub unsafe fn load(ptr: *const u8) -> Self { - Group(x86::_mm_loadu_si128(ptr as *const _)) + Group(x86::_mm_loadu_si128(ptr.cast())) } /// Loads a group of bytes starting at the given address, which must be @@ -55,7 +56,7 @@ impl Group { pub unsafe fn load_aligned(ptr: *const u8) -> Self { // FIXME: use align_offset once it stabilizes debug_assert_eq!(ptr as usize & (mem::align_of::() - 1), 0); - Group(x86::_mm_load_si128(ptr as *const _)) + Group(x86::_mm_load_si128(ptr.cast())) } /// Stores the group of bytes to the given address, which must be @@ -65,7 +66,7 @@ impl Group { pub unsafe fn store_aligned(self, ptr: *mut u8) { // FIXME: use align_offset once it stabilizes debug_assert_eq!(ptr as usize & (mem::align_of::() - 1), 0); - x86::_mm_store_si128(ptr as *mut _, self.0); + x86::_mm_store_si128(ptr.cast(), self.0); } /// Returns a `BitMask` indicating all bytes in the group which have diff --git a/vendor/hashbrown/src/rustc_entry.rs b/vendor/hashbrown/src/rustc_entry.rs index b6ea7bc5c0..1793c4a600 100644 --- a/vendor/hashbrown/src/rustc_entry.rs +++ b/vendor/hashbrown/src/rustc_entry.rs @@ -1,14 +1,15 @@ use self::RustcEntry::*; -use crate::map::{make_hash, Drain, HashMap, IntoIter, Iter, IterMut}; -use crate::raw::{Bucket, RawTable}; +use crate::map::{make_insert_hash, Drain, HashMap, IntoIter, Iter, IterMut}; +use crate::raw::{Allocator, Bucket, Global, RawTable}; use core::fmt::{self, Debug}; use core::hash::{BuildHasher, Hash}; use core::mem; -impl HashMap +impl HashMap where K: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { /// Gets the given key's corresponding entry in the map for in-place manipulation. /// @@ -30,8 +31,8 @@ where /// assert_eq!(letters.get(&'y'), None); /// ``` #[cfg_attr(feature = "inline-more", inline)] - pub fn rustc_entry(&mut self, key: K) -> RustcEntry<'_, K, V> { - let hash = make_hash(&self.hash_builder, &key); + pub fn rustc_entry(&mut self, key: K) -> RustcEntry<'_, K, V, A> { + let hash = make_insert_hash(&self.hash_builder, &key); if let Some(elem) = self.table.find(hash, |q| q.0.eq(&key)) { RustcEntry::Occupied(RustcOccupiedEntry { key: Some(key), @@ -59,15 +60,18 @@ where /// /// [`HashMap`]: struct.HashMap.html /// [`entry`]: struct.HashMap.html#method.rustc_entry -pub enum RustcEntry<'a, K, V> { +pub enum RustcEntry<'a, K, V, A = Global> +where + A: Allocator + Clone, +{ /// An occupied entry. - Occupied(RustcOccupiedEntry<'a, K, V>), + Occupied(RustcOccupiedEntry<'a, K, V, A>), /// A vacant entry. - Vacant(RustcVacantEntry<'a, K, V>), + Vacant(RustcVacantEntry<'a, K, V, A>), } -impl Debug for RustcEntry<'_, K, V> { +impl Debug for RustcEntry<'_, K, V, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match *self { Vacant(ref v) => f.debug_tuple("Entry").field(v).finish(), @@ -80,26 +84,31 @@ impl Debug for RustcEntry<'_, K, V> { /// It is part of the [`RustcEntry`] enum. /// /// [`RustcEntry`]: enum.RustcEntry.html -pub struct RustcOccupiedEntry<'a, K, V> { +pub struct RustcOccupiedEntry<'a, K, V, A = Global> +where + A: Allocator + Clone, +{ key: Option, elem: Bucket<(K, V)>, - table: &'a mut RawTable<(K, V)>, + table: &'a mut RawTable<(K, V), A>, } -unsafe impl Send for RustcOccupiedEntry<'_, K, V> +unsafe impl Send for RustcOccupiedEntry<'_, K, V, A> where K: Send, V: Send, + A: Allocator + Clone + Send, { } -unsafe impl Sync for RustcOccupiedEntry<'_, K, V> +unsafe impl Sync for RustcOccupiedEntry<'_, K, V, A> where K: Sync, V: Sync, + A: Allocator + Clone + Sync, { } -impl Debug for RustcOccupiedEntry<'_, K, V> { +impl Debug for RustcOccupiedEntry<'_, K, V, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("OccupiedEntry") .field("key", self.key()) @@ -112,19 +121,22 @@ impl Debug for RustcOccupiedEntry<'_, K, V> { /// It is part of the [`RustcEntry`] enum. /// /// [`RustcEntry`]: enum.RustcEntry.html -pub struct RustcVacantEntry<'a, K, V> { +pub struct RustcVacantEntry<'a, K, V, A = Global> +where + A: Allocator + Clone, +{ hash: u64, key: K, - table: &'a mut RawTable<(K, V)>, + table: &'a mut RawTable<(K, V), A>, } -impl Debug for RustcVacantEntry<'_, K, V> { +impl Debug for RustcVacantEntry<'_, K, V, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_tuple("VacantEntry").field(self.key()).finish() } } -impl<'a, K, V> RustcEntry<'a, K, V> { +impl<'a, K, V, A: Allocator + Clone> RustcEntry<'a, K, V, A> { /// Sets the value of the entry, and returns a RustcOccupiedEntry. /// /// # Examples @@ -137,7 +149,7 @@ impl<'a, K, V> RustcEntry<'a, K, V> { /// /// assert_eq!(entry.key(), &"horseyland"); /// ``` - pub fn insert(self, value: V) -> RustcOccupiedEntry<'a, K, V> { + pub fn insert(self, value: V) -> RustcOccupiedEntry<'a, K, V, A> { match self { Vacant(entry) => entry.insert_entry(value), Occupied(mut entry) => { @@ -253,7 +265,7 @@ impl<'a, K, V> RustcEntry<'a, K, V> { } } -impl<'a, K, V: Default> RustcEntry<'a, K, V> { +impl<'a, K, V: Default, A: Allocator + Clone> RustcEntry<'a, K, V, A> { /// Ensures a value is in the entry by inserting the default value if empty, /// and returns a mutable reference to the value in the entry. /// @@ -281,7 +293,7 @@ impl<'a, K, V: Default> RustcEntry<'a, K, V> { } } -impl<'a, K, V> RustcOccupiedEntry<'a, K, V> { +impl<'a, K, V, A: Allocator + Clone> RustcOccupiedEntry<'a, K, V, A> { /// Gets a reference to the key in the entry. /// /// # Examples @@ -508,7 +520,7 @@ impl<'a, K, V> RustcOccupiedEntry<'a, K, V> { } } -impl<'a, K, V> RustcVacantEntry<'a, K, V> { +impl<'a, K, V, A: Allocator + Clone> RustcVacantEntry<'a, K, V, A> { /// Gets a reference to the key that would be used when inserting a value /// through the `RustcVacantEntry`. /// @@ -583,7 +595,7 @@ impl<'a, K, V> RustcVacantEntry<'a, K, V> { /// } /// ``` #[cfg_attr(feature = "inline-more", inline)] - pub fn insert_entry(self, value: V) -> RustcOccupiedEntry<'a, K, V> { + pub fn insert_entry(self, value: V) -> RustcOccupiedEntry<'a, K, V, A> { let bucket = self.table.insert_no_grow(self.hash, (self.key, value)); RustcOccupiedEntry { key: None, diff --git a/vendor/hashbrown/src/scopeguard.rs b/vendor/hashbrown/src/scopeguard.rs index 32c9694372..4e9bf045ad 100644 --- a/vendor/hashbrown/src/scopeguard.rs +++ b/vendor/hashbrown/src/scopeguard.rs @@ -9,7 +9,7 @@ where value: T, } -#[cfg_attr(feature = "inline-more", inline)] +#[inline] pub fn guard(value: T, dropfn: F) -> ScopeGuard where F: FnMut(&mut T), @@ -22,7 +22,7 @@ where F: FnMut(&mut T), { type Target = T; - #[cfg_attr(feature = "inline-more", inline)] + #[inline] fn deref(&self) -> &T { &self.value } @@ -32,7 +32,7 @@ impl DerefMut for ScopeGuard where F: FnMut(&mut T), { - #[cfg_attr(feature = "inline-more", inline)] + #[inline] fn deref_mut(&mut self) -> &mut T { &mut self.value } @@ -42,7 +42,7 @@ impl Drop for ScopeGuard where F: FnMut(&mut T), { - #[cfg_attr(feature = "inline-more", inline)] + #[inline] fn drop(&mut self) { (self.dropfn)(&mut self.value) } diff --git a/vendor/hashbrown/src/set.rs b/vendor/hashbrown/src/set.rs index b8460fd3b6..8ceaf1200b 100644 --- a/vendor/hashbrown/src/set.rs +++ b/vendor/hashbrown/src/set.rs @@ -8,6 +8,7 @@ use core::mem; use core::ops::{BitAnd, BitOr, BitXor, Sub}; use super::map::{self, ConsumeAllOnDrop, DefaultHashBuilder, DrainFilterInner, HashMap, Keys}; +use crate::raw::{Allocator, Global}; // Future Optimization (FIXME!) // ============================= @@ -71,7 +72,7 @@ use super::map::{self, ConsumeAllOnDrop, DefaultHashBuilder, DrainFilterInner, H /// ``` /// /// The easiest way to use `HashSet` with a custom type is to derive -/// [`Eq`] and [`Hash`]. We must also derive [`PartialEq`], this will in the +/// [`Eq`] and [`Hash`]. We must also derive [`PartialEq`]. This will in the /// future be implied by [`Eq`]. /// /// ``` @@ -111,8 +112,8 @@ use super::map::{self, ConsumeAllOnDrop, DefaultHashBuilder, DrainFilterInner, H /// [`HashMap`]: struct.HashMap.html /// [`PartialEq`]: https://doc.rust-lang.org/std/cmp/trait.PartialEq.html /// [`RefCell`]: https://doc.rust-lang.org/std/cell/struct.RefCell.html -pub struct HashSet { - pub(crate) map: HashMap, +pub struct HashSet { + pub(crate) map: HashMap, } impl Clone for HashSet { @@ -167,73 +168,47 @@ impl HashSet { } } -impl HashSet { - /// Creates a new empty hash set which will use the given hasher to hash - /// keys. - /// - /// The hash set is also created with the default initial capacity. - /// - /// Warning: `hasher` is normally randomly generated, and - /// is designed to allow `HashSet`s to be resistant to attacks that - /// cause many collisions and very poor performance. Setting it - /// manually using this function can expose a DoS attack vector. - /// - /// The `hash_builder` passed should implement the [`BuildHasher`] trait for - /// the HashMap to be useful, see its documentation for details. +#[cfg(feature = "ahash")] +impl HashSet { + /// Creates an empty `HashSet`. /// + /// The hash set is initially created with a capacity of 0, so it will not allocate until it + /// is first inserted into. /// /// # Examples /// /// ``` /// use hashbrown::HashSet; - /// use hashbrown::hash_map::DefaultHashBuilder; - /// - /// let s = DefaultHashBuilder::default(); - /// let mut set = HashSet::with_hasher(s); - /// set.insert(2); + /// let set: HashSet = HashSet::new(); /// ``` - /// - /// [`BuildHasher`]: ../../std/hash/trait.BuildHasher.html #[cfg_attr(feature = "inline-more", inline)] - pub const fn with_hasher(hasher: S) -> Self { + pub fn new_in(alloc: A) -> Self { Self { - map: HashMap::with_hasher(hasher), + map: HashMap::new_in(alloc), } } - /// Creates an empty `HashSet` with the specified capacity, using - /// `hasher` to hash the keys. + /// Creates an empty `HashSet` with the specified capacity. /// /// The hash set will be able to hold at least `capacity` elements without /// reallocating. If `capacity` is 0, the hash set will not allocate. /// - /// Warning: `hasher` is normally randomly generated, and - /// is designed to allow `HashSet`s to be resistant to attacks that - /// cause many collisions and very poor performance. Setting it - /// manually using this function can expose a DoS attack vector. - /// - /// The `hash_builder` passed should implement the [`BuildHasher`] trait for - /// the HashMap to be useful, see its documentation for details. - /// /// # Examples /// /// ``` /// use hashbrown::HashSet; - /// use hashbrown::hash_map::DefaultHashBuilder; - /// - /// let s = DefaultHashBuilder::default(); - /// let mut set = HashSet::with_capacity_and_hasher(10, s); - /// set.insert(1); + /// let set: HashSet = HashSet::with_capacity(10); + /// assert!(set.capacity() >= 10); /// ``` - /// - /// [`BuildHasher`]: ../../std/hash/trait.BuildHasher.html #[cfg_attr(feature = "inline-more", inline)] - pub fn with_capacity_and_hasher(capacity: usize, hasher: S) -> Self { + pub fn with_capacity_in(capacity: usize, alloc: A) -> Self { Self { - map: HashMap::with_capacity_and_hasher(capacity, hasher), + map: HashMap::with_capacity_in(capacity, alloc), } } +} +impl HashSet { /// Returns the number of elements the set can hold without reallocating. /// /// # Examples @@ -323,7 +298,7 @@ impl HashSet { /// assert!(set.is_empty()); /// ``` #[cfg_attr(feature = "inline-more", inline)] - pub fn drain(&mut self) -> Drain<'_, T> { + pub fn drain(&mut self) -> Drain<'_, T, A> { Drain { iter: self.map.drain(), } @@ -376,7 +351,7 @@ impl HashSet { /// assert_eq!(odds, vec![1, 3, 5, 7]); /// ``` #[cfg_attr(feature = "inline-more", inline)] - pub fn drain_filter(&mut self, f: F) -> DrainFilter<'_, T, F> + pub fn drain_filter(&mut self, f: F) -> DrainFilter<'_, T, F, A> where F: FnMut(&T) -> bool, { @@ -405,6 +380,134 @@ impl HashSet { pub fn clear(&mut self) { self.map.clear() } +} + +impl HashSet { + /// Creates a new empty hash set which will use the given hasher to hash + /// keys. + /// + /// The hash set is also created with the default initial capacity. + /// + /// Warning: `hasher` is normally randomly generated, and + /// is designed to allow `HashSet`s to be resistant to attacks that + /// cause many collisions and very poor performance. Setting it + /// manually using this function can expose a DoS attack vector. + /// + /// The `hash_builder` passed should implement the [`BuildHasher`] trait for + /// the HashMap to be useful, see its documentation for details. + /// + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// use hashbrown::hash_map::DefaultHashBuilder; + /// + /// let s = DefaultHashBuilder::default(); + /// let mut set = HashSet::with_hasher(s); + /// set.insert(2); + /// ``` + /// + /// [`BuildHasher`]: ../../std/hash/trait.BuildHasher.html + #[cfg_attr(feature = "inline-more", inline)] + pub const fn with_hasher(hasher: S) -> Self { + Self { + map: HashMap::with_hasher(hasher), + } + } + + /// Creates an empty `HashSet` with the specified capacity, using + /// `hasher` to hash the keys. + /// + /// The hash set will be able to hold at least `capacity` elements without + /// reallocating. If `capacity` is 0, the hash set will not allocate. + /// + /// Warning: `hasher` is normally randomly generated, and + /// is designed to allow `HashSet`s to be resistant to attacks that + /// cause many collisions and very poor performance. Setting it + /// manually using this function can expose a DoS attack vector. + /// + /// The `hash_builder` passed should implement the [`BuildHasher`] trait for + /// the HashMap to be useful, see its documentation for details. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// use hashbrown::hash_map::DefaultHashBuilder; + /// + /// let s = DefaultHashBuilder::default(); + /// let mut set = HashSet::with_capacity_and_hasher(10, s); + /// set.insert(1); + /// ``` + /// + /// [`BuildHasher`]: ../../std/hash/trait.BuildHasher.html + #[cfg_attr(feature = "inline-more", inline)] + pub fn with_capacity_and_hasher(capacity: usize, hasher: S) -> Self { + Self { + map: HashMap::with_capacity_and_hasher(capacity, hasher), + } + } +} + +impl HashSet +where + A: Allocator + Clone, +{ + /// Creates a new empty hash set which will use the given hasher to hash + /// keys. + /// + /// The hash set is also created with the default initial capacity. + /// + /// Warning: `hasher` is normally randomly generated, and + /// is designed to allow `HashSet`s to be resistant to attacks that + /// cause many collisions and very poor performance. Setting it + /// manually using this function can expose a DoS attack vector. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// use hashbrown::hash_map::DefaultHashBuilder; + /// + /// let s = DefaultHashBuilder::default(); + /// let mut set = HashSet::with_hasher(s); + /// set.insert(2); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn with_hasher_in(hasher: S, alloc: A) -> Self { + Self { + map: HashMap::with_hasher_in(hasher, alloc), + } + } + + /// Creates an empty `HashSet` with the specified capacity, using + /// `hasher` to hash the keys. + /// + /// The hash set will be able to hold at least `capacity` elements without + /// reallocating. If `capacity` is 0, the hash set will not allocate. + /// + /// Warning: `hasher` is normally randomly generated, and + /// is designed to allow `HashSet`s to be resistant to attacks that + /// cause many collisions and very poor performance. Setting it + /// manually using this function can expose a DoS attack vector. + /// + /// # Examples + /// + /// ``` + /// use hashbrown::HashSet; + /// use hashbrown::hash_map::DefaultHashBuilder; + /// + /// let s = DefaultHashBuilder::default(); + /// let mut set = HashSet::with_capacity_and_hasher(10, s); + /// set.insert(1); + /// ``` + #[cfg_attr(feature = "inline-more", inline)] + pub fn with_capacity_and_hasher_in(capacity: usize, hasher: S, alloc: A) -> Self { + Self { + map: HashMap::with_capacity_and_hasher_in(capacity, hasher, alloc), + } + } /// Returns a reference to the set's [`BuildHasher`]. /// @@ -426,10 +529,11 @@ impl HashSet { } } -impl HashSet +impl HashSet where T: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { /// Reserves capacity for at least `additional` more elements to be inserted /// in the `HashSet`. The collection may reserve more space to avoid @@ -544,7 +648,7 @@ where /// assert_eq!(diff, [4].iter().collect()); /// ``` #[cfg_attr(feature = "inline-more", inline)] - pub fn difference<'a>(&'a self, other: &'a Self) -> Difference<'a, T, S> { + pub fn difference<'a>(&'a self, other: &'a Self) -> Difference<'a, T, S, A> { Difference { iter: self.iter(), other, @@ -573,7 +677,7 @@ where /// assert_eq!(diff1, [1, 4].iter().collect()); /// ``` #[cfg_attr(feature = "inline-more", inline)] - pub fn symmetric_difference<'a>(&'a self, other: &'a Self) -> SymmetricDifference<'a, T, S> { + pub fn symmetric_difference<'a>(&'a self, other: &'a Self) -> SymmetricDifference<'a, T, S, A> { SymmetricDifference { iter: self.difference(other).chain(other.difference(self)), } @@ -598,7 +702,7 @@ where /// assert_eq!(intersection, [2, 3].iter().collect()); /// ``` #[cfg_attr(feature = "inline-more", inline)] - pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, T, S> { + pub fn intersection<'a>(&'a self, other: &'a Self) -> Intersection<'a, T, S, A> { let (smaller, larger) = if self.len() <= other.len() { (self, other) } else { @@ -629,8 +733,10 @@ where /// assert_eq!(union, [1, 2, 3, 4].iter().collect()); /// ``` #[cfg_attr(feature = "inline-more", inline)] - pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, T, S> { - let (smaller, larger) = if self.len() >= other.len() { + pub fn union<'a>(&'a self, other: &'a Self) -> Union<'a, T, S, A> { + // We'll iterate one set in full, and only the remaining difference from the other. + // Use the smaller set for the difference in order to reduce hash lookups. + let (smaller, larger) = if self.len() <= other.len() { (self, other) } else { (other, self) @@ -967,10 +1073,11 @@ where } } -impl PartialEq for HashSet +impl PartialEq for HashSet where T: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { fn eq(&self, other: &Self) -> bool { if self.len() != other.len() { @@ -981,40 +1088,53 @@ where } } -impl Eq for HashSet +impl Eq for HashSet where T: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { } -impl fmt::Debug for HashSet +impl fmt::Debug for HashSet where T: Eq + Hash + fmt::Debug, S: BuildHasher, + A: Allocator + Clone, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_set().entries(self.iter()).finish() } } -impl FromIterator for HashSet +impl From> for HashSet +where + A: Allocator + Clone, +{ + fn from(map: HashMap) -> Self { + Self { map } + } +} + +impl FromIterator for HashSet where T: Eq + Hash, S: BuildHasher + Default, + A: Default + Allocator + Clone, { #[cfg_attr(feature = "inline-more", inline)] fn from_iter>(iter: I) -> Self { - let mut set = Self::with_hasher(Default::default()); + let mut set = Self::with_hasher_in(Default::default(), Default::default()); set.extend(iter); set } } -impl Extend for HashSet +impl Extend for HashSet where T: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { #[cfg_attr(feature = "inline-more", inline)] fn extend>(&mut self, iter: I) { @@ -1034,10 +1154,11 @@ where } } -impl<'a, T, S> Extend<&'a T> for HashSet +impl<'a, T, S, A> Extend<&'a T> for HashSet where T: 'a + Eq + Hash + Copy, S: BuildHasher, + A: Allocator + Clone, { #[cfg_attr(feature = "inline-more", inline)] fn extend>(&mut self, iter: I) { @@ -1057,9 +1178,10 @@ where } } -impl Default for HashSet +impl Default for HashSet where S: Default, + A: Default + Allocator + Clone, { /// Creates an empty `HashSet` with the `Default` value for the hasher. #[cfg_attr(feature = "inline-more", inline)] @@ -1070,10 +1192,11 @@ where } } -impl BitOr<&HashSet> for &HashSet +impl BitOr<&HashSet> for &HashSet where T: Eq + Hash + Clone, S: BuildHasher + Default, + A: Allocator + Clone, { type Output = HashSet; @@ -1097,15 +1220,16 @@ where /// } /// assert_eq!(i, expected.len()); /// ``` - fn bitor(self, rhs: &HashSet) -> HashSet { + fn bitor(self, rhs: &HashSet) -> HashSet { self.union(rhs).cloned().collect() } } -impl BitAnd<&HashSet> for &HashSet +impl BitAnd<&HashSet> for &HashSet where T: Eq + Hash + Clone, S: BuildHasher + Default, + A: Allocator + Clone, { type Output = HashSet; @@ -1129,7 +1253,7 @@ where /// } /// assert_eq!(i, expected.len()); /// ``` - fn bitand(self, rhs: &HashSet) -> HashSet { + fn bitand(self, rhs: &HashSet) -> HashSet { self.intersection(rhs).cloned().collect() } } @@ -1216,8 +1340,8 @@ pub struct Iter<'a, K> { /// /// [`HashSet`]: struct.HashSet.html /// [`into_iter`]: struct.HashSet.html#method.into_iter -pub struct IntoIter { - iter: map::IntoIter, +pub struct IntoIter { + iter: map::IntoIter, } /// A draining iterator over the items of a `HashSet`. @@ -1227,8 +1351,8 @@ pub struct IntoIter { /// /// [`HashSet`]: struct.HashSet.html /// [`drain`]: struct.HashSet.html#method.drain -pub struct Drain<'a, K> { - iter: map::Drain<'a, K, ()>, +pub struct Drain<'a, K, A: Allocator + Clone = Global> { + iter: map::Drain<'a, K, (), A>, } /// A draining iterator over entries of a `HashSet` which don't satisfy the predicate `f`. @@ -1238,12 +1362,12 @@ pub struct Drain<'a, K> { /// /// [`drain_filter`]: struct.HashSet.html#method.drain_filter /// [`HashSet`]: struct.HashSet.html -pub struct DrainFilter<'a, K, F> +pub struct DrainFilter<'a, K, F, A: Allocator + Clone = Global> where F: FnMut(&K) -> bool, { f: F, - inner: DrainFilterInner<'a, K, ()>, + inner: DrainFilterInner<'a, K, (), A>, } /// A lazy iterator producing elements in the intersection of `HashSet`s. @@ -1253,11 +1377,11 @@ where /// /// [`HashSet`]: struct.HashSet.html /// [`intersection`]: struct.HashSet.html#method.intersection -pub struct Intersection<'a, T, S> { +pub struct Intersection<'a, T, S, A: Allocator + Clone = Global> { // iterator of the first set iter: Iter<'a, T>, // the second set - other: &'a HashSet, + other: &'a HashSet, } /// A lazy iterator producing elements in the difference of `HashSet`s. @@ -1267,11 +1391,11 @@ pub struct Intersection<'a, T, S> { /// /// [`HashSet`]: struct.HashSet.html /// [`difference`]: struct.HashSet.html#method.difference -pub struct Difference<'a, T, S> { +pub struct Difference<'a, T, S, A: Allocator + Clone = Global> { // iterator of the first set iter: Iter<'a, T>, // the second set - other: &'a HashSet, + other: &'a HashSet, } /// A lazy iterator producing elements in the symmetric difference of `HashSet`s. @@ -1281,8 +1405,8 @@ pub struct Difference<'a, T, S> { /// /// [`HashSet`]: struct.HashSet.html /// [`symmetric_difference`]: struct.HashSet.html#method.symmetric_difference -pub struct SymmetricDifference<'a, T, S> { - iter: Chain, Difference<'a, T, S>>, +pub struct SymmetricDifference<'a, T, S, A: Allocator + Clone = Global> { + iter: Chain, Difference<'a, T, S, A>>, } /// A lazy iterator producing elements in the union of `HashSet`s. @@ -1292,11 +1416,11 @@ pub struct SymmetricDifference<'a, T, S> { /// /// [`HashSet`]: struct.HashSet.html /// [`union`]: struct.HashSet.html#method.union -pub struct Union<'a, T, S> { - iter: Chain, Difference<'a, T, S>>, +pub struct Union<'a, T, S, A: Allocator + Clone = Global> { + iter: Chain, Difference<'a, T, S, A>>, } -impl<'a, T, S> IntoIterator for &'a HashSet { +impl<'a, T, S, A: Allocator + Clone> IntoIterator for &'a HashSet { type Item = &'a T; type IntoIter = Iter<'a, T>; @@ -1306,9 +1430,9 @@ impl<'a, T, S> IntoIterator for &'a HashSet { } } -impl IntoIterator for HashSet { +impl IntoIterator for HashSet { type Item = T; - type IntoIter = IntoIter; + type IntoIter = IntoIter; /// Creates a consuming iterator, that is, one that moves each value out /// of the set in arbitrary order. The set cannot be used after calling @@ -1331,7 +1455,7 @@ impl IntoIterator for HashSet { /// } /// ``` #[cfg_attr(feature = "inline-more", inline)] - fn into_iter(self) -> IntoIter { + fn into_iter(self) -> IntoIter { IntoIter { iter: self.map.into_iter(), } @@ -1372,7 +1496,7 @@ impl fmt::Debug for Iter<'_, K> { } } -impl Iterator for IntoIter { +impl Iterator for IntoIter { type Item = K; #[cfg_attr(feature = "inline-more", inline)] @@ -1388,22 +1512,22 @@ impl Iterator for IntoIter { self.iter.size_hint() } } -impl ExactSizeIterator for IntoIter { +impl ExactSizeIterator for IntoIter { #[cfg_attr(feature = "inline-more", inline)] fn len(&self) -> usize { self.iter.len() } } -impl FusedIterator for IntoIter {} +impl FusedIterator for IntoIter {} -impl fmt::Debug for IntoIter { +impl fmt::Debug for IntoIter { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let entries_iter = self.iter.iter().map(|(k, _)| k); f.debug_list().entries(entries_iter).finish() } } -impl Iterator for Drain<'_, K> { +impl Iterator for Drain<'_, K, A> { type Item = K; #[cfg_attr(feature = "inline-more", inline)] @@ -1419,22 +1543,22 @@ impl Iterator for Drain<'_, K> { self.iter.size_hint() } } -impl ExactSizeIterator for Drain<'_, K> { +impl ExactSizeIterator for Drain<'_, K, A> { #[cfg_attr(feature = "inline-more", inline)] fn len(&self) -> usize { self.iter.len() } } -impl FusedIterator for Drain<'_, K> {} +impl FusedIterator for Drain<'_, K, A> {} -impl fmt::Debug for Drain<'_, K> { +impl fmt::Debug for Drain<'_, K, A> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let entries_iter = self.iter.iter().map(|(k, _)| k); f.debug_list().entries(entries_iter).finish() } } -impl<'a, K, F> Drop for DrainFilter<'a, K, F> +impl<'a, K, F, A: Allocator + Clone> Drop for DrainFilter<'a, K, F, A> where F: FnMut(&K) -> bool, { @@ -1448,7 +1572,7 @@ where } } -impl Iterator for DrainFilter<'_, K, F> +impl Iterator for DrainFilter<'_, K, F, A> where F: FnMut(&K) -> bool, { @@ -1467,9 +1591,12 @@ where } } -impl FusedIterator for DrainFilter<'_, K, F> where F: FnMut(&K) -> bool {} +impl FusedIterator for DrainFilter<'_, K, F, A> where + F: FnMut(&K) -> bool +{ +} -impl Clone for Intersection<'_, T, S> { +impl Clone for Intersection<'_, T, S, A> { #[cfg_attr(feature = "inline-more", inline)] fn clone(&self) -> Self { Intersection { @@ -1479,10 +1606,11 @@ impl Clone for Intersection<'_, T, S> { } } -impl<'a, T, S> Iterator for Intersection<'a, T, S> +impl<'a, T, S, A> Iterator for Intersection<'a, T, S, A> where T: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { type Item = &'a T; @@ -1503,24 +1631,26 @@ where } } -impl fmt::Debug for Intersection<'_, T, S> +impl fmt::Debug for Intersection<'_, T, S, A> where T: fmt::Debug + Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.clone()).finish() } } -impl FusedIterator for Intersection<'_, T, S> +impl FusedIterator for Intersection<'_, T, S, A> where T: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { } -impl Clone for Difference<'_, T, S> { +impl Clone for Difference<'_, T, S, A> { #[cfg_attr(feature = "inline-more", inline)] fn clone(&self) -> Self { Difference { @@ -1530,10 +1660,11 @@ impl Clone for Difference<'_, T, S> { } } -impl<'a, T, S> Iterator for Difference<'a, T, S> +impl<'a, T, S, A> Iterator for Difference<'a, T, S, A> where T: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { type Item = &'a T; @@ -1554,24 +1685,26 @@ where } } -impl FusedIterator for Difference<'_, T, S> +impl FusedIterator for Difference<'_, T, S, A> where T: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { } -impl fmt::Debug for Difference<'_, T, S> +impl fmt::Debug for Difference<'_, T, S, A> where T: fmt::Debug + Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.clone()).finish() } } -impl Clone for SymmetricDifference<'_, T, S> { +impl Clone for SymmetricDifference<'_, T, S, A> { #[cfg_attr(feature = "inline-more", inline)] fn clone(&self) -> Self { SymmetricDifference { @@ -1580,10 +1713,11 @@ impl Clone for SymmetricDifference<'_, T, S> { } } -impl<'a, T, S> Iterator for SymmetricDifference<'a, T, S> +impl<'a, T, S, A> Iterator for SymmetricDifference<'a, T, S, A> where T: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { type Item = &'a T; @@ -1597,24 +1731,26 @@ where } } -impl FusedIterator for SymmetricDifference<'_, T, S> +impl FusedIterator for SymmetricDifference<'_, T, S, A> where T: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { } -impl fmt::Debug for SymmetricDifference<'_, T, S> +impl fmt::Debug for SymmetricDifference<'_, T, S, A> where T: fmt::Debug + Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.clone()).finish() } } -impl Clone for Union<'_, T, S> { +impl Clone for Union<'_, T, S, A> { #[cfg_attr(feature = "inline-more", inline)] fn clone(&self) -> Self { Union { @@ -1623,27 +1759,30 @@ impl Clone for Union<'_, T, S> { } } -impl FusedIterator for Union<'_, T, S> +impl FusedIterator for Union<'_, T, S, A> where T: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { } -impl fmt::Debug for Union<'_, T, S> +impl fmt::Debug for Union<'_, T, S, A> where T: fmt::Debug + Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_list().entries(self.clone()).finish() } } -impl<'a, T, S> Iterator for Union<'a, T, S> +impl<'a, T, S, A> Iterator for Union<'a, T, S, A> where T: Eq + Hash, S: BuildHasher, + A: Allocator + Clone, { type Item = &'a T; @@ -1665,30 +1804,34 @@ fn assert_covariance() { fn iter<'a, 'new>(v: Iter<'a, &'static str>) -> Iter<'a, &'new str> { v } - fn into_iter<'new>(v: IntoIter<&'static str>) -> IntoIter<&'new str> { + fn into_iter<'new, A: Allocator + Clone>( + v: IntoIter<&'static str, A>, + ) -> IntoIter<&'new str, A> { v } - fn difference<'a, 'new>( - v: Difference<'a, &'static str, DefaultHashBuilder>, - ) -> Difference<'a, &'new str, DefaultHashBuilder> { + fn difference<'a, 'new, A: Allocator + Clone>( + v: Difference<'a, &'static str, DefaultHashBuilder, A>, + ) -> Difference<'a, &'new str, DefaultHashBuilder, A> { v } - fn symmetric_difference<'a, 'new>( - v: SymmetricDifference<'a, &'static str, DefaultHashBuilder>, - ) -> SymmetricDifference<'a, &'new str, DefaultHashBuilder> { + fn symmetric_difference<'a, 'new, A: Allocator + Clone>( + v: SymmetricDifference<'a, &'static str, DefaultHashBuilder, A>, + ) -> SymmetricDifference<'a, &'new str, DefaultHashBuilder, A> { v } - fn intersection<'a, 'new>( - v: Intersection<'a, &'static str, DefaultHashBuilder>, - ) -> Intersection<'a, &'new str, DefaultHashBuilder> { + fn intersection<'a, 'new, A: Allocator + Clone>( + v: Intersection<'a, &'static str, DefaultHashBuilder, A>, + ) -> Intersection<'a, &'new str, DefaultHashBuilder, A> { v } - fn union<'a, 'new>( - v: Union<'a, &'static str, DefaultHashBuilder>, - ) -> Union<'a, &'new str, DefaultHashBuilder> { + fn union<'a, 'new, A: Allocator + Clone>( + v: Union<'a, &'static str, DefaultHashBuilder, A>, + ) -> Union<'a, &'new str, DefaultHashBuilder, A> { v } - fn drain<'new>(d: Drain<'static, &'static str>) -> Drain<'new, &'new str> { + fn drain<'new, A: Allocator + Clone>( + d: Drain<'static, &'static str, A>, + ) -> Drain<'new, &'new str, A> { d } } @@ -1904,6 +2047,23 @@ mod test_set { assert_eq!(i, expected.len()); } + #[test] + fn test_from_map() { + let mut a = crate::HashMap::new(); + a.insert(1, ()); + a.insert(2, ()); + a.insert(3, ()); + a.insert(4, ()); + + let a: HashSet<_> = a.into(); + + assert_eq!(a.len(), 4); + assert!(a.contains(&1)); + assert!(a.contains(&2)); + assert!(a.contains(&3)); + assert!(a.contains(&4)); + } + #[test] fn test_from_iter() { let xs = [1, 2, 2, 3, 4, 5, 6, 7, 8, 9]; @@ -2116,4 +2276,24 @@ mod test_set { set.insert(19); assert!(set.contains(&19)); } + + #[test] + fn rehash_in_place() { + let mut set = HashSet::new(); + + for i in 0..224 { + set.insert(i); + } + + assert_eq!( + set.capacity(), + 224, + "The set must be at or close to capacity to trigger a re hashing" + ); + + for i in 100..1400 { + set.remove(&(i - 100)); + set.insert(i); + } + } } diff --git a/vendor/hashbrown/tests/serde.rs b/vendor/hashbrown/tests/serde.rs index 570bf70da9..a642348b3b 100644 --- a/vendor/hashbrown/tests/serde.rs +++ b/vendor/hashbrown/tests/serde.rs @@ -1,24 +1,24 @@ #![cfg(feature = "serde")] use core::hash::BuildHasherDefault; +use fnv::FnvHasher; use hashbrown::{HashMap, HashSet}; -use rustc_hash::FxHasher; use serde_test::{assert_tokens, Token}; -// We use FxHash for this test because we rely on the ordering -type FxHashMap = HashMap>; -type FxHashSet = HashSet>; +// We use FnvHash for this test because we rely on the ordering +type FnvHashMap = HashMap>; +type FnvHashSet = HashSet>; #[test] fn map_serde_tokens_empty() { - let map = FxHashMap::::default(); + let map = FnvHashMap::::default(); assert_tokens(&map, &[Token::Map { len: Some(0) }, Token::MapEnd]); } #[test] fn map_serde_tokens() { - let mut map = FxHashMap::default(); + let mut map = FnvHashMap::default(); map.insert('b', 20); map.insert('a', 10); map.insert('c', 30); @@ -29,10 +29,10 @@ fn map_serde_tokens() { Token::Map { len: Some(3) }, Token::Char('a'), Token::I32(10), - Token::Char('b'), - Token::I32(20), Token::Char('c'), Token::I32(30), + Token::Char('b'), + Token::I32(20), Token::MapEnd, ], ); @@ -40,14 +40,14 @@ fn map_serde_tokens() { #[test] fn set_serde_tokens_empty() { - let set = FxHashSet::::default(); + let set = FnvHashSet::::default(); assert_tokens(&set, &[Token::Seq { len: Some(0) }, Token::SeqEnd]); } #[test] fn set_serde_tokens() { - let mut set = FxHashSet::default(); + let mut set = FnvHashSet::default(); set.insert(20); set.insert(10); set.insert(30); @@ -56,9 +56,9 @@ fn set_serde_tokens() { &set, &[ Token::Seq { len: Some(3) }, + Token::I32(30), Token::I32(20), Token::I32(10), - Token::I32(30), Token::SeqEnd, ], ); diff --git a/vendor/idna/.cargo-checksum.json b/vendor/idna/.cargo-checksum.json index e11f2c081d..8a9c776f2f 100644 --- a/vendor/idna/.cargo-checksum.json +++ b/vendor/idna/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"af4fe12b69e1354864a33c43eab5f8466d435a216b35c8fb4b6b567d11dfb28a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e","src/IdnaMappingTable.txt":"813a8308aeff8bcb9368751e1fd0ad7cc467130965d53ac860f82c4d0d11523f","src/lib.rs":"590280903e929c7eadd5473faf67c48293d734b9a75ea42798264b6b10d3f33f","src/make_uts46_mapping_table.py":"fd4ff62fc27dc8d15d5b61c3504f5f754aded1c3e16c1179506adff5df766d74","src/punycode.rs":"fe078681e4a565615b71a7f8ce92373de59f09cffc1aac074822b0e1630a0cba","src/uts46.rs":"96b47ff8cc1a992bfc2f8b9138eb9a92908dce1de2e6457cc7e6d2a187fe0b5d","src/uts46_mapping_table.rs":"9d0b645182592709ea87c6db7ca1c4e1d9b2826b68efd746f764cafcb0545da2","tests/IdnaTest.txt":"921c68e5d3fbb631b26140d232af90040fc4df612857d1894641ded319e52822","tests/punycode.rs":"5a786d09f2bbedfdbd9ac18c99af25ecaf097710b5760792c328c78c1750a209","tests/punycode_tests.json":"3d4ac0cf25984c37b9ce197f5df680a0136f728fb8ec82bc76624e42139eb3a8","tests/tests.rs":"84d56979840dcbb1100cc5e0a5450be642b1e5dfc76abf853da121035903e5ae","tests/unit.rs":"4a20fded1ac8bc5177f28ae49dcbb25f9a646300de4524ce8ca20258a558d3fc","tests/uts46.rs":"ce896ba3d39f0d8e82975b97d2b9540e37b3928d07eb2dd2fb4a83f4deb4873d"},"package":"02e2673c30ee86b5b96a9cb52ad15718aa1f966f5ab9ad54a8b95d5ca33120a9"} \ No newline at end of file +{"files":{"Cargo.toml":"f06264f03f56352df5d6119c3916c611793a76e860f56f479d6541d5472954f0","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e","benches/all.rs":"e734b9c9092ed66986725f86cfe90f3756cfddb058af308b796ba494f9beefc2","src/IdnaMappingTable.txt":"87d6553a4b86bc49dcade38bf26b745cd81800eb8af295dc3fb99b4729eaea38","src/lib.rs":"d61b2bfcf4265b9a41eedd1de33ab49ea615e3c06df944321b30c57950a85342","src/make_uts46_mapping_table.py":"917055fa841f813de2bcf79cc79b595da3d5551559ee768db8660ab77cb26c34","src/punycode.rs":"dceeb0467197f892d2c777711b3c6647238f52f3976dfca5a8f8957500fd3599","src/uts46.rs":"c3e23fa4e3666ad48a8f79ddcfb64111405d510bb1f2f64baf4158f2331ef58b","src/uts46_mapping_table.rs":"942fff78147c61da942f5f3a7ff4e90f9d7a00a29285733ac3fc3357eb2ed06f","tests/IdnaTestV2.txt":"c6f3778b0545fd150c8063286c7f5adc901e16557eddccc3751213646d07593d","tests/punycode.rs":"e6fb978f48445d1525a6b97351c41c5393a1612a35f85b9a7f45b8794fce9aba","tests/punycode_tests.json":"3d4ac0cf25984c37b9ce197f5df680a0136f728fb8ec82bc76624e42139eb3a8","tests/tests.rs":"de7425a3e4e6e871255721107803704d1431246601fa9c87105224d88dfe60d6","tests/unit.rs":"a53756af9f3f9fe0906f19e4e062477e02e83a76b17676acf1e829dcd288fbc7","tests/uts46.rs":"ca91d48811d366fb9e32d7aa79cfda1261b93c271b6ed7fb5535de9a2500205b"},"package":"89829a5d69c23d348314a7ac337fe39173b61149a9864deabd260983aed48c21"} \ No newline at end of file diff --git a/vendor/idna/Cargo.toml b/vendor/idna/Cargo.toml index f1eb2807b2..566689278d 100644 --- a/vendor/idna/Cargo.toml +++ b/vendor/idna/Cargo.toml @@ -11,8 +11,9 @@ # will likely look very different (and much more reasonable) [package] +edition = "2018" name = "idna" -version = "0.2.0" +version = "0.2.2" authors = ["The rust-url developers"] autotests = false description = "IDNA (Internationalizing Domain Names in Applications) and Punycode." @@ -20,7 +21,6 @@ license = "MIT/Apache-2.0" repository = "https://github.com/servo/rust-url/" [lib] -test = false doctest = false [[test]] @@ -29,6 +29,10 @@ harness = false [[test]] name = "unit" + +[[bench]] +name = "all" +harness = false [dependencies.matches] version = "0.1" @@ -36,7 +40,13 @@ version = "0.1" version = "0.3" [dependencies.unicode-normalization] -version = "0.1.5" +version = "0.1.17" +[dev-dependencies.assert_matches] +version = "1.3" + +[dev-dependencies.bencher] +version = "0.1" + [dev-dependencies.rustc-test] version = "0.3" diff --git a/vendor/idna/benches/all.rs b/vendor/idna/benches/all.rs new file mode 100644 index 0000000000..157e4af251 --- /dev/null +++ b/vendor/idna/benches/all.rs @@ -0,0 +1,53 @@ +#[macro_use] +extern crate bencher; +extern crate idna; + +use bencher::{black_box, Bencher}; +use idna::Config; + +fn to_unicode_puny_label(bench: &mut Bencher) { + let encoded = "abc.xn--mgbcm"; + let config = Config::default(); + bench.iter(|| config.to_unicode(black_box(encoded))); +} + +fn to_unicode_ascii(bench: &mut Bencher) { + let encoded = "example.com"; + let config = Config::default(); + bench.iter(|| config.to_unicode(black_box(encoded))); +} + +fn to_unicode_merged_label(bench: &mut Bencher) { + let encoded = "Beispiel.xn--vermgensberater-ctb"; + let config = Config::default(); + bench.iter(|| config.to_unicode(black_box(encoded))); +} + +fn to_ascii_puny_label(bench: &mut Bencher) { + let encoded = "abc.ابج"; + let config = Config::default(); + bench.iter(|| config.to_ascii(black_box(encoded))); +} + +fn to_ascii_simple(bench: &mut Bencher) { + let encoded = "example.com"; + let config = Config::default(); + bench.iter(|| config.to_ascii(black_box(encoded))); +} + +fn to_ascii_merged(bench: &mut Bencher) { + let encoded = "beispiel.vermögensberater"; + let config = Config::default(); + bench.iter(|| config.to_ascii(black_box(encoded))); +} + +benchmark_group!( + benches, + to_unicode_puny_label, + to_unicode_ascii, + to_unicode_merged_label, + to_ascii_puny_label, + to_ascii_simple, + to_ascii_merged, +); +benchmark_main!(benches); diff --git a/vendor/idna/src/IdnaMappingTable.txt b/vendor/idna/src/IdnaMappingTable.txt index 295606447f..5995088466 100644 --- a/vendor/idna/src/IdnaMappingTable.txt +++ b/vendor/idna/src/IdnaMappingTable.txt @@ -1,8405 +1,8727 @@ -# 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 - +# IdnaMappingTable.txt +# Date: 2019-11-07, 13:44:35 GMT +# © 2019 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 for UTS #46 +# Version: 13.0.0 +# +# For documentation and usage, 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 ; valid # 11.0 ARMENIAN SMALL LETTER TURNED AYB +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 ; valid # 11.0 ARMENIAN SMALL LETTER YI WITH STROKE +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..05EE ; disallowed # NA .. +05EF ; valid # 11.0 HEBREW YOD TRIANGLE +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..07FC ; disallowed # NA .. +07FD ; valid # 11.0 NKO DANTAYALAN +07FE..07FF ; valid ; ; NV8 # 11.0 NKO DOROME SIGN..NKO TAMAN SIGN +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..08C7 ; valid # 13.0 ARABIC LETTER PEH WITH SMALL V..ARABIC LETTER LAM WITH SMALL ARABIC LETTER TAH ABOVE +08C8..08D2 ; disallowed # NA .. +08D3 ; valid # 11.0 ARABIC SMALL LOW WAW +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 ; valid # 11.0 BENGALI SANDHI MARK +09FF..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 ; valid ; ; NV8 # 11.0 GURMUKHI ABBREVIATION SIGN +0A77..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..0B54 ; disallowed # NA .. +0B55 ; valid # 13.0 ORIYA SIGN OVERLINE +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 ; valid # 11.0 TELUGU SIGN COMBINING ANUSVARA ABOVE +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..0C76 ; disallowed # NA .. +0C77 ; valid ; ; NV8 # 12.0 TELUGU SIGN SIDDHAM +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 ; valid ; ; NV8 # 11.0 KANNADA SIGN SIDDHAM +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 ; valid # 13.0 MALAYALAM LETTER VEDIC ANUSVARA +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 ; disallowed # NA +0D81 ; valid # 13.0 SINHALA SIGN CANDRABINDU +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 ; disallowed # NA +0E86 ; valid # 12.0 LAO LETTER PALI GHA +0E87..0E88 ; valid # 1.1 LAO LETTER NGO..LAO LETTER CO +0E89 ; valid # 12.0 LAO LETTER PALI CHA +0E8A ; valid # 1.1 LAO LETTER SO TAM +0E8B ; disallowed # NA +0E8C ; valid # 12.0 LAO LETTER PALI JHA +0E8D ; valid # 1.1 LAO LETTER NYO +0E8E..0E93 ; valid # 12.0 LAO LETTER PALI NYA..LAO LETTER PALI NNA +0E94..0E97 ; valid # 1.1 LAO LETTER DO..LAO LETTER THO TAM +0E98 ; valid # 12.0 LAO LETTER PALI DHA +0E99..0E9F ; valid # 1.1 LAO LETTER NO..LAO LETTER FO SUNG +0EA0 ; valid # 12.0 LAO LETTER PALI BHA +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 ; valid # 12.0 LAO LETTER SANSKRIT SHA..LAO LETTER SANSKRIT SSA +0EAA..0EAB ; valid # 1.1 LAO LETTER SO SUNG..LAO LETTER HO SUNG +0EAC ; valid # 12.0 LAO LETTER PALI LLA +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 ; valid # 12.0 LAO SIGN PALI VIRAMA +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 ; valid # 11.0 MONGOLIAN LETTER CHA WITH TWO DOTS +1879..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..1AC0 ; valid # 13.0 COMBINING LATIN SMALL LETTER W BELOW..COMBINING LATIN SMALL LETTER TURNED W BELOW +1AC1..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..1C8F ; disallowed # NA .. +1C90 ; mapped ; 10D0 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER AN +1C91 ; mapped ; 10D1 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER BAN +1C92 ; mapped ; 10D2 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER GAN +1C93 ; mapped ; 10D3 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER DON +1C94 ; mapped ; 10D4 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER EN +1C95 ; mapped ; 10D5 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER VIN +1C96 ; mapped ; 10D6 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER ZEN +1C97 ; mapped ; 10D7 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER TAN +1C98 ; mapped ; 10D8 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER IN +1C99 ; mapped ; 10D9 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER KAN +1C9A ; mapped ; 10DA # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER LAS +1C9B ; mapped ; 10DB # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER MAN +1C9C ; mapped ; 10DC # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER NAR +1C9D ; mapped ; 10DD # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER ON +1C9E ; mapped ; 10DE # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER PAR +1C9F ; mapped ; 10DF # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER ZHAR +1CA0 ; mapped ; 10E0 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER RAE +1CA1 ; mapped ; 10E1 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER SAN +1CA2 ; mapped ; 10E2 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER TAR +1CA3 ; mapped ; 10E3 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER UN +1CA4 ; mapped ; 10E4 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER PHAR +1CA5 ; mapped ; 10E5 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER KHAR +1CA6 ; mapped ; 10E6 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER GHAN +1CA7 ; mapped ; 10E7 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER QAR +1CA8 ; mapped ; 10E8 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER SHIN +1CA9 ; mapped ; 10E9 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER CHIN +1CAA ; mapped ; 10EA # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER CAN +1CAB ; mapped ; 10EB # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER JIL +1CAC ; mapped ; 10EC # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER CIL +1CAD ; mapped ; 10ED # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER CHAR +1CAE ; mapped ; 10EE # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER XAN +1CAF ; mapped ; 10EF # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER JHAN +1CB0 ; mapped ; 10F0 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER HAE +1CB1 ; mapped ; 10F1 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER HE +1CB2 ; mapped ; 10F2 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER HIE +1CB3 ; mapped ; 10F3 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER WE +1CB4 ; mapped ; 10F4 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER HAR +1CB5 ; mapped ; 10F5 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER HOE +1CB6 ; mapped ; 10F6 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER FI +1CB7 ; mapped ; 10F7 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER YN +1CB8 ; mapped ; 10F8 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER ELIFI +1CB9 ; mapped ; 10F9 # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER TURNED GAN +1CBA ; mapped ; 10FA # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER AIN +1CBB..1CBC ; disallowed # NA .. +1CBD ; mapped ; 10FD # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER AEN +1CBE ; mapped ; 10FE # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER HARD SIGN +1CBF ; mapped ; 10FF # 11.0 GEORGIAN MTAVRULI CAPITAL LETTER LABIAL SIGN +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 ; valid # 12.0 VEDIC SIGN DOUBLE ANUSVARA ANTARGOMUKHA +1CFB..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 ; disallowed # NA +2B97 ; valid ; ; NV8 # 13.0 SYMBOL FOR TYPE A ELECTRONICS +2B98..2BB9 ; valid ; ; NV8 # 7.0 THREE-D TOP-LIGHTED LEFTWARDS EQUILATERAL ARROWHEAD..UP ARROWHEAD IN A RECTANGLE BOX +2BBA..2BBC ; valid ; ; NV8 # 11.0 OVERLAPPING WHITE SQUARES..OVERLAPPING BLACK SQUARES +2BBD..2BC8 ; valid ; ; NV8 # 7.0 BALLOT BOX WITH LIGHT X..BLACK MEDIUM RIGHT-POINTING TRIANGLE CENTRED +2BC9 ; valid ; ; NV8 # 12.0 NEPTUNE FORM TWO +2BCA..2BD1 ; valid ; ; NV8 # 7.0 TOP HALF BLACK CIRCLE..UNCERTAINTY SIGN +2BD2 ; valid ; ; NV8 # 10.0 GROUP MARK +2BD3..2BEB ; valid ; ; NV8 # 11.0 PLUTO FORM TWO..STAR WITH RIGHT HALF BLACK +2BEC..2BEF ; valid ; ; NV8 # 8.0 LEFTWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS..DOWNWARDS TWO-HEADED ARROW WITH TRIANGLE ARROWHEADS +2BF0..2BFE ; valid ; ; NV8 # 11.0 ERIS FORM ONE..REVERSED RIGHT ANGLE +2BFF ; valid ; ; NV8 # 12.0 HELLSCHREIBER PAUSE SYMBOL +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..2E4E ; valid ; ; NV8 # 11.0 DOTTED SOLIDUS..PUNCTUS ELEVATUS MARK +2E4F ; valid ; ; NV8 # 12.0 CORNISH VERSE DIVIDER +2E50..2E52 ; valid ; ; NV8 # 13.0 CROSS PATTY WITH RIGHT CROSSBAR..TIRONIAN SIGN CAPITAL ET +2E53..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 ; valid # 11.0 BOPOMOFO LETTER NN +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 ; valid # 13.0 BOPOMOFO FINAL LETTER G..BOPOMOFO LETTER AH +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 ; mapped ; 4EE4 548C # 12.1 SQUARE ERA NAME REIWA +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 ; valid # 13.0 CJK UNIFIED IDEOGRAPH-4DB6..CJK UNIFIED IDEOGRAPH-4DBF +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..9FEF ; valid # 11.0 CJK UNIFIED IDEOGRAPH-9FEB..CJK UNIFIED IDEOGRAPH-9FEF +9FF0..9FFC ; valid # 13.0 CJK UNIFIED IDEOGRAPH-9FF0..CJK UNIFIED IDEOGRAPH-9FFC +9FFD..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 ; valid # 11.0 LATIN LETTER SMALL CAPITAL Q +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 ; mapped ; A7B9 # 11.0 LATIN CAPITAL LETTER U WITH STROKE +A7B9 ; valid # 11.0 LATIN SMALL LETTER U WITH STROKE +A7BA ; mapped ; A7BB # 12.0 LATIN CAPITAL LETTER GLOTTAL A +A7BB ; valid # 12.0 LATIN SMALL LETTER GLOTTAL A +A7BC ; mapped ; A7BD # 12.0 LATIN CAPITAL LETTER GLOTTAL I +A7BD ; valid # 12.0 LATIN SMALL LETTER GLOTTAL I +A7BE ; mapped ; A7BF # 12.0 LATIN CAPITAL LETTER GLOTTAL U +A7BF ; valid # 12.0 LATIN SMALL LETTER GLOTTAL U +A7C0..A7C1 ; disallowed # NA .. +A7C2 ; mapped ; A7C3 # 12.0 LATIN CAPITAL LETTER ANGLICANA W +A7C3 ; valid # 12.0 LATIN SMALL LETTER ANGLICANA W +A7C4 ; mapped ; A794 # 12.0 LATIN CAPITAL LETTER C WITH PALATAL HOOK +A7C5 ; mapped ; 0282 # 12.0 LATIN CAPITAL LETTER S WITH HOOK +A7C6 ; mapped ; 1D8E # 12.0 LATIN CAPITAL LETTER Z WITH PALATAL HOOK +A7C7 ; mapped ; A7C8 # 13.0 LATIN CAPITAL LETTER D WITH SHORT STROKE OVERLAY +A7C8 ; valid # 13.0 LATIN SMALL LETTER D WITH SHORT STROKE OVERLAY +A7C9 ; mapped ; A7CA # 13.0 LATIN CAPITAL LETTER S WITH SHORT STROKE OVERLAY +A7CA ; valid # 13.0 LATIN SMALL LETTER S WITH SHORT STROKE OVERLAY +A7CB..A7F4 ; disallowed # NA .. +A7F5 ; mapped ; A7F6 # 13.0 LATIN CAPITAL LETTER REVERSED HALF H +A7F6 ; valid # 13.0 LATIN SMALL LETTER REVERSED HALF H +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 ; valid # 13.0 SYLOTI NAGRI SIGN ALTERNATE HASANTA +A82D..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 ; valid # 11.0 DEVANAGARI LETTER AY..DEVANAGARI VOWEL SIGN AY +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..AB67 ; valid # 12.0 LATIN SMALL LETTER DZ DIGRAPH WITH RETROFLEX HOOK..LATIN SMALL LETTER TS DIGRAPH WITH RETROFLEX HOOK +AB68 ; valid # 13.0 LATIN SMALL LETTER TURNED R WITH MIDDLE TILDE +AB69 ; mapped ; 028D # 13.0 MODIFIER LETTER SMALL TURNED W +AB6A..AB6B ; valid ; ; NV8 # 13.0 MODIFIER LETTER LEFT TACK..MODIFIER LETTER RIGHT TACK +AB6C..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 ; valid ; ; NV8 # 13.0 ASCIA SYMBOL +1019D..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..10A35 ; valid # 11.0 KHAROSHTHI LETTER TTTA..KHAROSHTHI LETTER VHA +10A36..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 ; valid ; ; NV8 # 11.0 KHAROSHTHI FRACTION ONE HALF +10A49..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..10D27 ; valid # 11.0 HANIFI ROHINGYA LETTER A..HANIFI ROHINGYA SIGN TASSI +10D28..10D2F ; disallowed # NA .. +10D30..10D39 ; valid # 11.0 HANIFI ROHINGYA DIGIT ZERO..HANIFI ROHINGYA DIGIT NINE +10D3A..10E5F ; disallowed # NA .. +10E60..10E7E ; valid ; ; NV8 # 5.2 RUMI DIGIT ONE..RUMI FRACTION TWO THIRDS +10E7F ; disallowed # NA +10E80..10EA9 ; valid # 13.0 YEZIDI LETTER ELIF..YEZIDI LETTER ET +10EAA ; disallowed # NA +10EAB..10EAC ; valid # 13.0 YEZIDI COMBINING HAMZA MARK..YEZIDI COMBINING MADDA MARK +10EAD ; valid ; ; NV8 # 13.0 YEZIDI HYPHENATION MARK +10EAE..10EAF ; disallowed # NA .. +10EB0..10EB1 ; valid # 13.0 YEZIDI LETTER LAM WITH DOT ABOVE..YEZIDI LETTER YOT WITH CIRCUMFLEX ABOVE +10EB2..10EFF ; disallowed # NA .. +10F00..10F1C ; valid # 11.0 OLD SOGDIAN LETTER ALEPH..OLD SOGDIAN LETTER FINAL TAW WITH VERTICAL TAIL +10F1D..10F26 ; valid ; ; NV8 # 11.0 OLD SOGDIAN NUMBER ONE..OLD SOGDIAN FRACTION ONE HALF +10F27 ; valid # 11.0 OLD SOGDIAN LIGATURE AYIN-DALETH +10F28..10F2F ; disallowed # NA .. +10F30..10F50 ; valid # 11.0 SOGDIAN LETTER ALEPH..SOGDIAN COMBINING STROKE BELOW +10F51..10F59 ; valid ; ; NV8 # 11.0 SOGDIAN NUMBER ONE..SOGDIAN PUNCTUATION HALF CIRCLE WITH DOT +10F5A..10FAF ; disallowed # NA .. +10FB0..10FC4 ; valid # 13.0 CHORASMIAN LETTER ALEPH..CHORASMIAN LETTER TAW +10FC5..10FCB ; valid ; ; NV8 # 13.0 CHORASMIAN NUMBER ONE..CHORASMIAN NUMBER ONE HUNDRED +10FCC..10FDF ; disallowed # NA .. +10FE0..10FF6 ; valid # 12.0 ELYMAIC LETTER ALEPH..ELYMAIC LIGATURE ZAYIN-YODH +10FF7..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..110CC ; disallowed # NA .. +110CD ; disallowed # 11.0 KAITHI NUMBER SIGN ABOVE +110CE..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..11146 ; valid # 11.0 CHAKMA LETTER LHAA..CHAKMA VOWEL SIGN EI +11147 ; valid # 13.0 CHAKMA LETTER VAA +11148..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..111CC ; valid # 8.0 SHARADA SANDHI MARK..SHARADA EXTRA SHORT VOWEL MARK +111CD ; valid ; ; NV8 # 7.0 SHARADA SUTRA MARK +111CE..111CF ; valid # 13.0 SHARADA VOWEL SIGN PRISHTHAMATRA E..SHARADA SIGN INVERTED CANDRABINDU +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 ; disallowed # NA +1133B ; valid # 11.0 COMBINING BINDU BELOW +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 ; valid ; ; NV8 # 13.0 NEWA DOUBLE COMMA +1145B ; valid ; ; NV8 # 9.0 NEWA PLACEHOLDER MARK +1145C ; disallowed # NA +1145D ; valid ; ; NV8 # 9.0 NEWA INSERTION SIGN +1145E ; valid # 11.0 NEWA SANDHI MARK +1145F ; valid # 12.0 NEWA LETTER VEDIC ANUSVARA +11460..11461 ; valid # 13.0 NEWA SIGN JIHVAMULIYA..NEWA SIGN UPADHMANIYA +11462..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 ; valid # 12.0 TAKRI LETTER ARCHAIC KHA +116B9..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 ; valid # 11.0 AHOM LETTER ALTERNATE BA +1171B..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..117FF ; disallowed # NA .. +11800..1183A ; valid # 11.0 DOGRA LETTER A..DOGRA SIGN NUKTA +1183B ; valid ; ; NV8 # 11.0 DOGRA ABBREVIATION SIGN +1183C..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..11906 ; valid # 13.0 DIVES AKURU LETTER A..DIVES AKURU LETTER E +11907..11908 ; disallowed # NA .. +11909 ; valid # 13.0 DIVES AKURU LETTER O +1190A..1190B ; disallowed # NA .. +1190C..11913 ; valid # 13.0 DIVES AKURU LETTER KA..DIVES AKURU LETTER JA +11914 ; disallowed # NA +11915..11916 ; valid # 13.0 DIVES AKURU LETTER NYA..DIVES AKURU LETTER TTA +11917 ; disallowed # NA +11918..11935 ; valid # 13.0 DIVES AKURU LETTER DDA..DIVES AKURU VOWEL SIGN E +11936 ; disallowed # NA +11937..11938 ; valid # 13.0 DIVES AKURU VOWEL SIGN AI..DIVES AKURU VOWEL SIGN O +11939..1193A ; disallowed # NA .. +1193B..11943 ; valid # 13.0 DIVES AKURU SIGN ANUSVARA..DIVES AKURU SIGN NUKTA +11944..11946 ; valid ; ; NV8 # 13.0 DIVES AKURU DOUBLE DANDA..DIVES AKURU END OF TEXT MARK +11947..1194F ; disallowed # NA .. +11950..11959 ; valid # 13.0 DIVES AKURU DIGIT ZERO..DIVES AKURU DIGIT NINE +1195A..1199F ; disallowed # NA .. +119A0..119A7 ; valid # 12.0 NANDINAGARI LETTER A..NANDINAGARI LETTER VOCALIC RR +119A8..119A9 ; disallowed # NA .. +119AA..119D7 ; valid # 12.0 NANDINAGARI LETTER E..NANDINAGARI VOWEL SIGN VOCALIC RR +119D8..119D9 ; disallowed # NA .. +119DA..119E1 ; valid # 12.0 NANDINAGARI VOWEL SIGN E..NANDINAGARI SIGN AVAGRAHA +119E2 ; valid ; ; NV8 # 12.0 NANDINAGARI SIGN SIDDHAM +119E3..119E4 ; valid # 12.0 NANDINAGARI HEADSTROKE..NANDINAGARI VOWEL SIGN PRISHTHAMATRA E +119E5..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 ; valid # 12.0 SOYOMBO SIGN JIHVAMULIYA..SOYOMBO SIGN UPADHMANIYA +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 ; valid # 11.0 SOYOMBO MARK PLUTA +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..11D5F ; disallowed # NA .. +11D60..11D65 ; valid # 11.0 GUNJALA GONDI LETTER A..GUNJALA GONDI LETTER UU +11D66 ; disallowed # NA +11D67..11D68 ; valid # 11.0 GUNJALA GONDI LETTER EE..GUNJALA GONDI LETTER AI +11D69 ; disallowed # NA +11D6A..11D8E ; valid # 11.0 GUNJALA GONDI LETTER OO..GUNJALA GONDI VOWEL SIGN UU +11D8F ; disallowed # NA +11D90..11D91 ; valid # 11.0 GUNJALA GONDI VOWEL SIGN EE..GUNJALA GONDI VOWEL SIGN AI +11D92 ; disallowed # NA +11D93..11D98 ; valid # 11.0 GUNJALA GONDI VOWEL SIGN OO..GUNJALA GONDI OM +11D99..11D9F ; disallowed # NA .. +11DA0..11DA9 ; valid # 11.0 GUNJALA GONDI DIGIT ZERO..GUNJALA GONDI DIGIT NINE +11DAA..11EDF ; disallowed # NA .. +11EE0..11EF6 ; valid # 11.0 MAKASAR LETTER KA..MAKASAR VOWEL SIGN O +11EF7..11EF8 ; valid ; ; NV8 # 11.0 MAKASAR PASSIMBANG..MAKASAR END OF SECTION +11EF9..11FAF ; disallowed # NA .. +11FB0 ; valid # 13.0 LISU LETTER YHA +11FB1..11FBF ; disallowed # NA .. +11FC0..11FF1 ; valid ; ; NV8 # 12.0 TAMIL FRACTION ONE THREE-HUNDRED-AND-TWENTIETH..TAMIL SIGN VAKAIYARAA +11FF2..11FFE ; disallowed # NA .. +11FFF ; valid ; ; NV8 # 12.0 TAMIL PUNCTUATION END OF TEXT +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 ; disallowed # NA +13430..13438 ; disallowed # 12.0 EGYPTIAN HIEROGLYPH VERTICAL JOINER..EGYPTIAN HIEROGLYPH END SEGMENT +13439..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..16E3F ; disallowed # NA .. +16E40 ; mapped ; 16E60 # 11.0 MEDEFAIDRIN CAPITAL LETTER M +16E41 ; mapped ; 16E61 # 11.0 MEDEFAIDRIN CAPITAL LETTER S +16E42 ; mapped ; 16E62 # 11.0 MEDEFAIDRIN CAPITAL LETTER V +16E43 ; mapped ; 16E63 # 11.0 MEDEFAIDRIN CAPITAL LETTER W +16E44 ; mapped ; 16E64 # 11.0 MEDEFAIDRIN CAPITAL LETTER ATIU +16E45 ; mapped ; 16E65 # 11.0 MEDEFAIDRIN CAPITAL LETTER Z +16E46 ; mapped ; 16E66 # 11.0 MEDEFAIDRIN CAPITAL LETTER KP +16E47 ; mapped ; 16E67 # 11.0 MEDEFAIDRIN CAPITAL LETTER P +16E48 ; mapped ; 16E68 # 11.0 MEDEFAIDRIN CAPITAL LETTER T +16E49 ; mapped ; 16E69 # 11.0 MEDEFAIDRIN CAPITAL LETTER G +16E4A ; mapped ; 16E6A # 11.0 MEDEFAIDRIN CAPITAL LETTER F +16E4B ; mapped ; 16E6B # 11.0 MEDEFAIDRIN CAPITAL LETTER I +16E4C ; mapped ; 16E6C # 11.0 MEDEFAIDRIN CAPITAL LETTER K +16E4D ; mapped ; 16E6D # 11.0 MEDEFAIDRIN CAPITAL LETTER A +16E4E ; mapped ; 16E6E # 11.0 MEDEFAIDRIN CAPITAL LETTER J +16E4F ; mapped ; 16E6F # 11.0 MEDEFAIDRIN CAPITAL LETTER E +16E50 ; mapped ; 16E70 # 11.0 MEDEFAIDRIN CAPITAL LETTER B +16E51 ; mapped ; 16E71 # 11.0 MEDEFAIDRIN CAPITAL LETTER C +16E52 ; mapped ; 16E72 # 11.0 MEDEFAIDRIN CAPITAL LETTER U +16E53 ; mapped ; 16E73 # 11.0 MEDEFAIDRIN CAPITAL LETTER YU +16E54 ; mapped ; 16E74 # 11.0 MEDEFAIDRIN CAPITAL LETTER L +16E55 ; mapped ; 16E75 # 11.0 MEDEFAIDRIN CAPITAL LETTER Q +16E56 ; mapped ; 16E76 # 11.0 MEDEFAIDRIN CAPITAL LETTER HP +16E57 ; mapped ; 16E77 # 11.0 MEDEFAIDRIN CAPITAL LETTER NY +16E58 ; mapped ; 16E78 # 11.0 MEDEFAIDRIN CAPITAL LETTER X +16E59 ; mapped ; 16E79 # 11.0 MEDEFAIDRIN CAPITAL LETTER D +16E5A ; mapped ; 16E7A # 11.0 MEDEFAIDRIN CAPITAL LETTER OE +16E5B ; mapped ; 16E7B # 11.0 MEDEFAIDRIN CAPITAL LETTER N +16E5C ; mapped ; 16E7C # 11.0 MEDEFAIDRIN CAPITAL LETTER R +16E5D ; mapped ; 16E7D # 11.0 MEDEFAIDRIN CAPITAL LETTER O +16E5E ; mapped ; 16E7E # 11.0 MEDEFAIDRIN CAPITAL LETTER AI +16E5F ; mapped ; 16E7F # 11.0 MEDEFAIDRIN CAPITAL LETTER Y +16E60..16E7F ; valid # 11.0 MEDEFAIDRIN SMALL LETTER M..MEDEFAIDRIN SMALL LETTER Y +16E80..16E9A ; valid ; ; NV8 # 11.0 MEDEFAIDRIN DIGIT ZERO..MEDEFAIDRIN EXCLAMATION OH +16E9B..16EFF ; disallowed # NA .. +16F00..16F44 ; valid # 6.1 MIAO LETTER PA..MIAO LETTER HHA +16F45..16F4A ; valid # 12.0 MIAO LETTER BRI..MIAO LETTER RTE +16F4B..16F4E ; disallowed # NA .. +16F4F ; valid # 12.0 MIAO SIGN CONSONANT MODIFIER BAR +16F50..16F7E ; valid # 6.1 MIAO LETTER NASALIZATION..MIAO VOWEL SIGN NG +16F7F..16F87 ; valid # 12.0 MIAO VOWEL SIGN UOG..MIAO VOWEL SIGN UI +16F88..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 ; valid ; ; NV8 # 12.0 OLD CHINESE HOOK MARK +16FE3 ; valid # 12.0 OLD CHINESE ITERATION MARK +16FE4 ; valid # 13.0 KHITAN SMALL SCRIPT FILLER +16FE5..16FEF ; disallowed # NA .. +16FF0..16FF1 ; valid # 13.0 VIETNAMESE ALTERNATE READING MARK CA..VIETNAMESE ALTERNATE READING MARK NHAY +16FF2..16FFF ; disallowed # NA .. +17000..187EC ; valid # 9.0 TANGUT IDEOGRAPH-17000..TANGUT IDEOGRAPH-187EC +187ED..187F1 ; valid # 11.0 TANGUT IDEOGRAPH-187ED..TANGUT IDEOGRAPH-187F1 +187F2..187F7 ; valid # 12.0 TANGUT IDEOGRAPH-187F2..TANGUT IDEOGRAPH-187F7 +187F8..187FF ; disallowed # NA .. +18800..18AF2 ; valid # 9.0 TANGUT COMPONENT-001..TANGUT COMPONENT-755 +18AF3..18CD5 ; valid # 13.0 TANGUT COMPONENT-756..KHITAN SMALL SCRIPT CHARACTER-18CD5 +18CD6..18CFF ; disallowed # NA .. +18D00..18D08 ; valid # 13.0 TANGUT IDEOGRAPH-18D00..TANGUT IDEOGRAPH-18D08 +18D09..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..1B14F ; disallowed # NA .. +1B150..1B152 ; valid # 12.0 HIRAGANA LETTER SMALL WI..HIRAGANA LETTER SMALL WO +1B153..1B163 ; disallowed # NA .. +1B164..1B167 ; valid # 12.0 KATAKANA LETTER SMALL WI..KATAKANA LETTER SMALL N +1B168..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..1D2DF ; disallowed # NA .. +1D2E0..1D2F3 ; valid ; ; NV8 # 11.0 MAYAN NUMERAL ZERO..MAYAN NUMERAL NINETEEN +1D2F4..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..1D378 ; valid ; ; NV8 # 11.0 IDEOGRAPHIC TALLY MARK ONE..TALLY MARK FIVE +1D379..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..1E0FF ; disallowed # NA .. +1E100..1E12C ; valid # 12.0 NYIAKENG PUACHUE HMONG LETTER MA..NYIAKENG PUACHUE HMONG LETTER W +1E12D..1E12F ; disallowed # NA .. +1E130..1E13D ; valid # 12.0 NYIAKENG PUACHUE HMONG TONE-B..NYIAKENG PUACHUE HMONG SYLLABLE LENGTHENER +1E13E..1E13F ; disallowed # NA .. +1E140..1E149 ; valid # 12.0 NYIAKENG PUACHUE HMONG DIGIT ZERO..NYIAKENG PUACHUE HMONG DIGIT NINE +1E14A..1E14D ; disallowed # NA .. +1E14E ; valid # 12.0 NYIAKENG PUACHUE HMONG LOGOGRAM NYAJ +1E14F ; valid ; ; NV8 # 12.0 NYIAKENG PUACHUE HMONG CIRCLED CA +1E150..1E2BF ; disallowed # NA .. +1E2C0..1E2F9 ; valid # 12.0 WANCHO LETTER AA..WANCHO DIGIT NINE +1E2FA..1E2FE ; disallowed # NA .. +1E2FF ; valid ; ; NV8 # 12.0 WANCHO NGUN SIGN +1E300..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 ; valid # 12.0 ADLAM NASALIZATION MARK +1E94C..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..1EC70 ; disallowed # NA .. +1EC71..1ECB4 ; valid ; ; NV8 # 11.0 INDIC SIYAQ NUMBER ONE..INDIC SIYAQ ALTERNATE LAKH MARK +1ECB5..1ED00 ; disallowed # NA .. +1ED01..1ED3D ; valid ; ; NV8 # 12.0 OTTOMAN SIYAQ NUMBER ONE..OTTOMAN SIYAQ FRACTION ONE SIXTH +1ED3E..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 ; valid ; ; NV8 # 13.0 CIRCLED ZERO WITH SLASH..CIRCLED DOLLAR SIGN WITH OVERLAID BACKSLASH +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 ; valid ; ; NV8 # 11.0 COPYLEFT SYMBOL +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 ; mapped ; 006D 0072 # 12.0 RAISED MR SIGN +1F16D..1F16F ; valid ; ; NV8 # 13.0 CIRCLED CC..CIRCLED HUMAN FIGURE +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 ; valid ; ; NV8 # 13.0 MASK WORK SYMBOL +1F1AE..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 ; valid ; ; NV8 # 12.0 HINDU TEMPLE +1F6D6..1F6D7 ; valid ; ; NV8 # 13.0 HUT..ELEVATOR +1F6D8..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 ; valid ; ; NV8 # 11.0 SKATEBOARD +1F6FA ; valid ; ; NV8 # 12.0 AUTO RICKSHAW +1F6FB..1F6FC ; valid ; ; NV8 # 13.0 PICKUP TRUCK..ROLLER SKATE +1F6FD..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..1F7D8 ; valid ; ; NV8 # 11.0 CIRCLED TRIANGLE..NEGATIVE CIRCLED SQUARE +1F7D9..1F7DF ; disallowed # NA .. +1F7E0..1F7EB ; valid ; ; NV8 # 12.0 LARGE ORANGE CIRCLE..LARGE BROWN SQUARE +1F7EC..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..1F8AF ; disallowed # NA .. +1F8B0..1F8B1 ; valid ; ; NV8 # 13.0 ARROW POINTING UPWARDS THEN NORTH WEST..ARROW POINTING RIGHTWARDS THEN CURVING SOUTH WEST +1F8B2..1F8FF ; disallowed # NA .. +1F900..1F90B ; valid ; ; NV8 # 10.0 CIRCLED CROSS FORMEE WITH FOUR DOTS..DOWNWARD FACING NOTCHED HOOK WITH DOT +1F90C ; valid ; ; NV8 # 13.0 PINCHED FINGERS +1F90D..1F90F ; valid ; ; NV8 # 12.0 WHITE HEART..PINCHING HAND +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 ; valid ; ; NV8 # 12.0 DIVING MASK +1F940..1F94B ; valid ; ; NV8 # 9.0 WILTED FLOWER..MARTIAL ARTS UNIFORM +1F94C ; valid ; ; NV8 # 10.0 CURLING STONE +1F94D..1F94F ; valid ; ; NV8 # 11.0 LACROSSE STICK AND BALL..FLYING DISC +1F950..1F95E ; valid ; ; NV8 # 9.0 CROISSANT..PANCAKES +1F95F..1F96B ; valid ; ; NV8 # 10.0 DUMPLING..CANNED FOOD +1F96C..1F970 ; valid ; ; NV8 # 11.0 LEAFY GREEN..SMILING FACE WITH SMILING EYES AND THREE HEARTS +1F971 ; valid ; ; NV8 # 12.0 YAWNING FACE +1F972 ; valid ; ; NV8 # 13.0 SMILING FACE WITH TEAR +1F973..1F976 ; valid ; ; NV8 # 11.0 FACE WITH PARTY HORN AND PARTY HAT..FREEZING FACE +1F977..1F978 ; valid ; ; NV8 # 13.0 NINJA..DISGUISED FACE +1F979 ; disallowed # NA +1F97A ; valid ; ; NV8 # 11.0 FACE WITH PLEADING EYES +1F97B ; valid ; ; NV8 # 12.0 SARI +1F97C..1F97F ; valid ; ; NV8 # 11.0 LAB COAT..FLAT SHOE +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..1F9A2 ; valid ; ; NV8 # 11.0 KANGAROO..SWAN +1F9A3..1F9A4 ; valid ; ; NV8 # 13.0 MAMMOTH..DODO +1F9A5..1F9AA ; valid ; ; NV8 # 12.0 SLOTH..OYSTER +1F9AB..1F9AD ; valid ; ; NV8 # 13.0 BEAVER..SEAL +1F9AE..1F9AF ; valid ; ; NV8 # 12.0 GUIDE DOG..PROBING CANE +1F9B0..1F9B9 ; valid ; ; NV8 # 11.0 EMOJI COMPONENT RED HAIR..SUPERVILLAIN +1F9BA..1F9BF ; valid ; ; NV8 # 12.0 SAFETY VEST..MECHANICAL LEG +1F9C0 ; valid ; ; NV8 # 8.0 CHEESE WEDGE +1F9C1..1F9C2 ; valid ; ; NV8 # 11.0 CUPCAKE..SALT SHAKER +1F9C3..1F9CA ; valid ; ; NV8 # 12.0 BEVERAGE BOX..ICE CUBE +1F9CB ; valid ; ; NV8 # 13.0 BUBBLE TEA +1F9CC ; disallowed # NA +1F9CD..1F9CF ; valid ; ; NV8 # 12.0 STANDING PERSON..DEAF PERSON +1F9D0..1F9E6 ; valid ; ; NV8 # 10.0 FACE WITH MONOCLE..SOCKS +1F9E7..1F9FF ; valid ; ; NV8 # 11.0 RED GIFT ENVELOPE..NAZAR AMULET +1FA00..1FA53 ; valid ; ; NV8 # 12.0 NEUTRAL CHESS KING..BLACK CHESS KNIGHT-BISHOP +1FA54..1FA5F ; disallowed # NA .. +1FA60..1FA6D ; valid ; ; NV8 # 11.0 XIANGQI RED GENERAL..XIANGQI BLACK SOLDIER +1FA6E..1FA6F ; disallowed # NA .. +1FA70..1FA73 ; valid ; ; NV8 # 12.0 BALLET SHOES..SHORTS +1FA74 ; valid ; ; NV8 # 13.0 THONG SANDAL +1FA75..1FA77 ; disallowed # NA .. +1FA78..1FA7A ; valid ; ; NV8 # 12.0 DROP OF BLOOD..STETHOSCOPE +1FA7B..1FA7F ; disallowed # NA .. +1FA80..1FA82 ; valid ; ; NV8 # 12.0 YO-YO..PARACHUTE +1FA83..1FA86 ; valid ; ; NV8 # 13.0 BOOMERANG..NESTING DOLLS +1FA87..1FA8F ; disallowed # NA .. +1FA90..1FA95 ; valid ; ; NV8 # 12.0 RINGED PLANET..BANJO +1FA96..1FAA8 ; valid ; ; NV8 # 13.0 MILITARY HELMET..ROCK +1FAA9..1FAAF ; disallowed # NA .. +1FAB0..1FAB6 ; valid ; ; NV8 # 13.0 FLY..FEATHER +1FAB7..1FABF ; disallowed # NA .. +1FAC0..1FAC2 ; valid ; ; NV8 # 13.0 ANATOMICAL HEART..PEOPLE HUGGING +1FAC3..1FACF ; disallowed # NA .. +1FAD0..1FAD6 ; valid ; ; NV8 # 13.0 BLUEBERRIES..TEAPOT +1FAD7..1FAFF ; disallowed # NA .. +1FB00..1FB92 ; valid ; ; NV8 # 13.0 BLOCK SEXTANT-1..UPPER HALF INVERSE MEDIUM SHADE AND LOWER HALF BLOCK +1FB93 ; disallowed # NA +1FB94..1FBCA ; valid ; ; NV8 # 13.0 LEFT HALF INVERSE MEDIUM SHADE AND RIGHT HALF BLOCK..WHITE UP-POINTING CHEVRON +1FBCB..1FBEF ; disallowed # NA .. +1FBF0 ; mapped ; 0030 # 13.0 SEGMENTED DIGIT ZERO +1FBF1 ; mapped ; 0031 # 13.0 SEGMENTED DIGIT ONE +1FBF2 ; mapped ; 0032 # 13.0 SEGMENTED DIGIT TWO +1FBF3 ; mapped ; 0033 # 13.0 SEGMENTED DIGIT THREE +1FBF4 ; mapped ; 0034 # 13.0 SEGMENTED DIGIT FOUR +1FBF5 ; mapped ; 0035 # 13.0 SEGMENTED DIGIT FIVE +1FBF6 ; mapped ; 0036 # 13.0 SEGMENTED DIGIT SIX +1FBF7 ; mapped ; 0037 # 13.0 SEGMENTED DIGIT SEVEN +1FBF8 ; mapped ; 0038 # 13.0 SEGMENTED DIGIT EIGHT +1FBF9 ; mapped ; 0039 # 13.0 SEGMENTED DIGIT NINE +1FBFA..1FFFD ; disallowed # NA .. +1FFFE..1FFFF ; disallowed # 2.0 .. +20000..2A6D6 ; valid # 3.1 CJK UNIFIED IDEOGRAPH-20000..CJK UNIFIED IDEOGRAPH-2A6D6 +2A6D7..2A6DD ; valid # 13.0 CJK UNIFIED IDEOGRAPH-2A6D7..CJK UNIFIED IDEOGRAPH-2A6DD +2A6DE..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..3134A ; valid # 13.0 CJK UNIFIED IDEOGRAPH-30000..CJK UNIFIED IDEOGRAPH-3134A +3134B..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/src/lib.rs b/vendor/idna/src/lib.rs index b1d858fe85..b87d4a15e7 100644 --- a/vendor/idna/src/lib.rs +++ b/vendor/idna/src/lib.rs @@ -34,13 +34,11 @@ #[macro_use] extern crate matches; -extern crate unicode_bidi; -extern crate unicode_normalization; pub mod punycode; mod uts46; -pub use uts46::{Config, Errors}; +pub use crate::uts46::{Config, Errors, Idna}; /// The [domain to ASCII](https://url.spec.whatwg.org/#concept-domain-to-ascii) algorithm. /// diff --git a/vendor/idna/src/make_uts46_mapping_table.py b/vendor/idna/src/make_uts46_mapping_table.py index 16e4feb44b..4f72bbd095 100644 --- a/vendor/idna/src/make_uts46_mapping_table.py +++ b/vendor/idna/src/make_uts46_mapping_table.py @@ -10,12 +10,11 @@ # 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. +// Copyright 2013-2020 The rust-url developers. // // Licensed under the Apache License, Version 2.0 or the MIT license @@ -32,7 +31,7 @@ def escape_char(c): return "\\u{%x}" % ord(c[0]) def char(s): - return unichr(int(s, 16)) + return chr(int(s, 16)) strtab = collections.OrderedDict() strtab_offset = 0 @@ -79,6 +78,12 @@ for line in txt: unicode_str = u''.join(char(c) for c in fields[2].strip().split(' ')) elif mapping == "Deviation": unicode_str = u'' + + if len(fields) > 3: + assert fields[3].strip() in ('NV8', 'XV8'), fields[3] + assert mapping == 'Valid', mapping + mapping = 'DisallowedIdna2008' + ranges.append((first, last, mapping, unicode_str)) def mergeable_key(r): @@ -87,7 +92,7 @@ def mergeable_key(r): # 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') + assert mapping in ('Valid', 'Ignored', 'Disallowed', 'DisallowedStd3Valid', 'DisallowedIdna2008') return mapping grouped_ranges = itertools.groupby(ranges, key=mergeable_key) @@ -107,7 +112,7 @@ for (k, g) in grouped_ranges: # the codepoint space. a, b = itertools.tee(group) next(b, None) - for (g1, g2) in itertools.izip(a, b): + for (g1, g2) in zip(a, b): last_char = int(g1[1], 16) next_char = int(g2[0], 16) if last_char + 1 == next_char: @@ -117,11 +122,7 @@ for (k, g) in grouped_ranges: # 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)) + optimized_ranges.append((group[0][0], group[-1][1]) + group[0][2:]) def is_single_char_range(r): (first, last, _, _) = r @@ -149,33 +150,25 @@ def merge_single_char_ranges(ranges): 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 +print("static TABLE: &[(char, u16)] = &[") + 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)) + index = offset | single offset += block_len + start = escape_char(char(ranges[0][0])) + print(" ('%s', %s)," % (start, index)) + print("];\n") -print("static MAPPING_TABLE: &'static [Mapping] = &[") +print("static MAPPING_TABLE: &[Mapping] = &[") for ranges in optimized_ranges: for (first, last, mapping, unicode_str) in ranges: @@ -188,5 +181,5 @@ 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()]))) +print("static STRING_TABLE: &str = \"%s\";" + % '\\\n '.join(itertools.chain(*[escape_str(s) for s in strtab.keys()]))) diff --git a/vendor/idna/src/punycode.rs b/vendor/idna/src/punycode.rs index 829684b149..a237504e22 100644 --- a/vendor/idna/src/punycode.rs +++ b/vendor/idna/src/punycode.rs @@ -52,81 +52,157 @@ pub fn decode_to_string(input: &str) -> Option { /// 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, + Some(Decoder::default().decode(input).ok()?.collect()) +} + +#[derive(Default)] +pub(crate) struct Decoder { + insertions: Vec<(usize, char)>, +} + +impl Decoder { + /// Split the input iterator and return a Vec with insertions of encoded characters + pub(crate) fn decode<'a>(&'a mut self, input: &'a str) -> Result, ()> { + self.insertions.clear(); + // Handle "basic" (ASCII) code points. + // They are encoded as-is before the last delimiter, if any. + let (base, input) = match input.rfind(DELIMITER) { + None => ("", input), + Some(position) => ( + &input[..position], + if position > 0 { + &input[position + 1..] + } else { + input + }, + ), }; - // Decode a generalized variable-length integer into delta, - // which gets added to i. + + let base_len = base.len(); + let mut length = base_len as u32; + let mut code_point = INITIAL_N; + let mut bias = INITIAL_BIAS; + let mut i = 0; + let mut iter = input.bytes(); 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 + let previous_i = i; + let mut weight = 1; + let mut k = BASE; + let mut byte = match iter.next() { + None => break, + Some(byte) => byte, }; - if digit < t { - break; + + // 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 Err(()), + } as u32; + if digit > (u32::MAX - i) / weight { + return Err(()); // 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 Err(()); // Overflow + } + weight *= BASE - t; + k += BASE; + byte = match iter.next() { + None => return Err(()), // End of input before the end of this delta + Some(byte) => byte, + }; } - if weight > u32::MAX / (BASE - t) { - return None; // Overflow + + bias = adapt(i - previous_i, length + 1, previous_i == 0); + if i / (length + 1) > u32::MAX - code_point { + return Err(()); // 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, + + // 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 Err(()), }; + + // Move earlier insertions farther out in the string + for (idx, _) in &mut self.insertions { + if *idx >= i as usize { + *idx += 1; + } + } + self.insertions.push((i as usize, c)); + length += 1; + i += 1; } - 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 + + self.insertions.sort_by_key(|(i, _)| *i); + Ok(Decode { + base: base.chars(), + insertions: &self.insertions, + inserted: 0, + position: 0, + len: base_len + self.insertions.len(), + }) + } +} + +pub(crate) struct Decode<'a> { + base: std::str::Chars<'a>, + pub(crate) insertions: &'a [(usize, char)], + inserted: usize, + position: usize, + len: usize, +} + +impl<'a> Iterator for Decode<'a> { + type Item = char; + + fn next(&mut self) -> Option { + loop { + match self.insertions.get(self.inserted) { + Some((pos, c)) if *pos == self.position => { + self.inserted += 1; + self.position += 1; + return Some(*c); + } + _ => {} + } + if let Some(c) = self.base.next() { + self.position += 1; + return Some(c); + } else if self.inserted >= self.insertions.len() { + return None; + } } - // 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) + + fn size_hint(&self) -> (usize, Option) { + let len = self.len - self.position; + (len, Some(len)) + } +} + +impl<'a> ExactSizeIterator for Decode<'a> { + fn len(&self) -> usize { + self.len - self.position + } } /// Convert an Unicode `str` to Punycode. @@ -134,7 +210,8 @@ pub fn decode(input: &str) -> Option> { /// This is a convenience wrapper around `encode`. #[inline] pub fn encode_str(input: &str) -> Option { - encode(&input.chars().collect::>()) + let mut buf = String::with_capacity(input.len()); + encode_into(input.chars(), &mut buf).ok().map(|()| buf) } /// Convert Unicode to Punycode. @@ -142,42 +219,54 @@ pub fn encode_str(input: &str) -> Option { /// 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 { + let mut buf = String::with_capacity(input.len()); + encode_into(input.iter().copied(), &mut buf) + .ok() + .map(|()| buf) +} + +pub(crate) fn encode_into(input: I, output: &mut String) -> Result<(), ()> +where + I: Iterator + Clone, +{ // 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; + let (mut input_length, mut basic_length) = (0, 0); + for c in input.clone() { + input_length += 1; + if c.is_ascii() { + output.push(c); + basic_length += 1; + } + } + if basic_length > 0 { - output.push_str("-") + output.push('-') } 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) + .clone() + .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 + return Err(()); // 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 { + for c in input.clone() { let c = c as u32; if c < code_point { delta += 1; if delta == 0 { - return None; // Overflow + return Err(()); // Overflow } } if c == code_point { @@ -209,14 +298,14 @@ pub fn encode(input: &[char]) -> Option { delta += 1; code_point += 1; } - Some(output) + Ok(()) } #[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 + 0..=25 => (value as u8 + b'a') as char, // a..z + 26..=35 => (value as u8 - 26 + b'0') as char, // 0..9 _ => panic!(), } } diff --git a/vendor/idna/src/uts46.rs b/vendor/idna/src/uts46.rs index b860acc427..0b7d27af54 100644 --- a/vendor/idna/src/uts46.rs +++ b/vendor/idna/src/uts46.rs @@ -10,15 +10,15 @@ //! (Unicode Technical Standard #46)](http://www.unicode.org/reports/tr46/) use self::Mapping::*; -use punycode; -use std::cmp::Ordering::{Equal, Greater, Less}; +use crate::punycode; +use std::{error::Error as StdError, fmt}; use unicode_bidi::{bidi_class, BidiClass}; use unicode_normalization::char::is_combining_mark; -use unicode_normalization::UnicodeNormalization; +use unicode_normalization::{is_nfc, UnicodeNormalization}; include!("uts46_mapping_table.rs"); -const PUNYCODE_PREFIX: &'static str = "xn--"; +const PUNYCODE_PREFIX: &str = "xn--"; #[derive(Debug)] struct StringTableSlice { @@ -47,67 +47,93 @@ enum Mapping { Disallowed, DisallowedStd3Valid, DisallowedStd3Mapped(StringTableSlice), -} - -struct Range { - from: char, - to: char, + DisallowedIdna2008, } 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 idx = match TABLE.binary_search_by_key(&codepoint, |&val| val.0) { + Ok(idx) => idx, + Err(idx) => idx - 1, + }; - let x = INDEX_TABLE[i]; - let single = (x & SINGLE_MARKER) != 0; - let offset = !SINGLE_MARKER & x; + const SINGLE_MARKER: u16 = 1 << 15; - if single { - &MAPPING_TABLE[offset as usize] - } else { - &MAPPING_TABLE[(offset + (codepoint as u16 - TABLE[i].from as u16)) as usize] - } - }) - .unwrap() + let (base, x) = TABLE[idx]; + 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 - base as u16)) as usize] + } } -fn map_char(codepoint: char, config: Config, 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 config.transitional_processing { - output.push_str(decode_slice(slice)) - } else { - output.push(codepoint) - } - } - Mapping::Disallowed => { - errors.push(Error::DissallowedCharacter); - output.push(codepoint); - } - Mapping::DisallowedStd3Valid => { - if config.use_std3_ascii_rules { - errors.push(Error::DissallowedByStd3AsciiRules); +struct Mapper<'a> { + chars: std::str::Chars<'a>, + config: Config, + errors: &'a mut Errors, + slice: Option>, +} + +impl<'a> Iterator for Mapper<'a> { + type Item = char; + + fn next(&mut self) -> Option { + loop { + if let Some(s) = &mut self.slice { + match s.next() { + Some(c) => return Some(c), + None => { + self.slice = None; + } + } } - output.push(codepoint) - } - Mapping::DisallowedStd3Mapped(ref slice) => { - if config.use_std3_ascii_rules { - errors.push(Error::DissallowedMappedInStd3); + + let codepoint = self.chars.next()?; + if let '.' | '-' | 'a'..='z' | '0'..='9' = codepoint { + return Some(codepoint); } - output.push_str(decode_slice(slice)) + + return Some(match *find_char(codepoint) { + Mapping::Valid => codepoint, + Mapping::Ignored => continue, + Mapping::Mapped(ref slice) => { + self.slice = Some(decode_slice(slice).chars()); + continue; + } + Mapping::Deviation(ref slice) => { + if self.config.transitional_processing { + self.slice = Some(decode_slice(slice).chars()); + continue; + } else { + codepoint + } + } + Mapping::Disallowed => { + self.errors.disallowed_character = true; + codepoint + } + Mapping::DisallowedStd3Valid => { + if self.config.use_std3_ascii_rules { + self.errors.disallowed_by_std3_ascii_rules = true; + }; + codepoint + } + Mapping::DisallowedStd3Mapped(ref slice) => { + if self.config.use_std3_ascii_rules { + self.errors.disallowed_mapped_in_std3 = true; + }; + self.slice = Some(decode_slice(slice).chars()); + continue; + } + Mapping::DisallowedIdna2008 => { + if self.config.use_idna_2008_rules { + self.errors.disallowed_in_idna_2008 = true; + } + codepoint + } + }); } } } @@ -130,26 +156,19 @@ fn passes_bidi(label: &str, is_bidi_domain: bool) -> bool { // 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; - } + while let Some(c) = chars.next() { + if !matches!( + bidi_class(c), + BidiClass::L + | BidiClass::EN + | BidiClass::ES + | BidiClass::CS + | BidiClass::ET + | BidiClass::ON + | BidiClass::BN + | BidiClass::NSM + ) { + return false; } } @@ -183,37 +202,28 @@ fn passes_bidi(label: &str, is_bidi_domain: bool) -> bool { 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; - } + for c in chars { + let char_class = bidi_class(c); + if char_class == BidiClass::EN { + found_en = true; + } else 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; - } + 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; } } // Rule 3 @@ -254,24 +264,21 @@ fn passes_bidi(label: &str, is_bidi_domain: bool) -> bool { } } - return true; + true } +/// Check the validity criteria for the given label +/// +/// V1 (NFC) and V8 (Bidi) are checked inside `processing()` to prevent doing duplicate work. +/// /// http://www.unicode.org/reports/tr46/#Validity_Criteria -fn validate_full(label: &str, is_bidi_domain: bool, config: Config, 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, config, errors); - } -} - -fn validate(label: &str, is_bidi_domain: bool, config: Config, errors: &mut Vec) { +fn check_validity(label: &str, config: Config, errors: &mut Errors) { let first_char = label.chars().next(); if first_char == None { // Empty string, pass + return; } + // 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 @@ -279,96 +286,215 @@ fn validate(label: &str, is_bidi_domain: bool, config: Config, errors: &mut Vec< // https://github.com/whatwg/url/issues/53 // V3: neither begin nor end with a U+002D HYPHEN-MINUS - else if config.check_hyphens && (label.starts_with("-") || label.ends_with("-")) { - errors.push(Error::ValidityCriteria); + if config.check_hyphens && (label.starts_with('-') || label.ends_with('-')) { + errors.check_hyphens = true; + return; } + // 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); + if is_combining_mark(first_char.unwrap()) { + errors.start_combining_mark = true; + return; } + // V6: Check against Mapping Table - else if label.chars().any(|c| match *find_char(c) { - Mapping::Valid => false, + if label.chars().any(|c| match *find_char(c) { + Mapping::Valid | Mapping::DisallowedIdna2008 => false, Mapping::Deviation(_) => config.transitional_processing, Mapping::DisallowedStd3Valid => config.use_std3_ascii_rules, _ => true, }) { - errors.push(Error::ValidityCriteria); + errors.invalid_mapping = true; + return; } + // 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); - } + // V8: Bidi rules are checked inside `processing()` } /// http://www.unicode.org/reports/tr46/#Processing -fn processing(domain: &str, config: Config, errors: &mut Vec) -> String { - let mut mapped = String::with_capacity(domain.len()); +#[allow(clippy::manual_strip)] // introduced in 1.45, MSRV is 1.36 +fn processing( + domain: &str, + config: Config, + normalized: &mut String, + output: &mut String, +) -> Errors { + // Weed out the simple cases: only allow all lowercase ASCII characters and digits where none + // of the labels start with PUNYCODE_PREFIX and labels don't start or end with hyphen. + let (mut prev, mut simple, mut puny_prefix) = ('?', !domain.is_empty(), 0); for c in domain.chars() { - map_char(c, config, &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; - } + if c == '.' { + if prev == '-' { + simple = false; + break; + } + puny_prefix = 0; + continue; + } else if puny_prefix == 0 && c == '-' { + simple = false; + break; + } else if puny_prefix < 5 { + if c == ['x', 'n', '-', '-'][puny_prefix] { + puny_prefix += 1; + if puny_prefix == 4 { + simple = false; + break; } + } else { + puny_prefix = 5; } } + if !c.is_ascii_lowercase() && !c.is_ascii_digit() { + simple = false; + break; + } + prev = c; + } + + if simple { + output.push_str(domain); + return Errors::default(); } - let mut validated = String::new(); - let mut first = true; + normalized.clear(); + let mut errors = Errors::default(); + let offset = output.len(); + + let iter = Mapper { + chars: domain.chars(), + config, + errors: &mut errors, + slice: None, + }; + + normalized.extend(iter.nfc()); + + let mut decoder = punycode::Decoder::default(); + let non_transitional = config.transitional_processing(false); + let (mut first, mut has_bidi_labels) = (true, false); for label in normalized.split('.') { if !first { - validated.push('.'); + output.push('.'); } first = false; if label.starts_with(PUNYCODE_PREFIX) { - match punycode::decode_to_string(&label[PUNYCODE_PREFIX.len()..]) { - Some(decoded_label) => { - let config = config.transitional_processing(false); - validate_full(&decoded_label, is_bidi_domain, config, errors); - validated.push_str(&decoded_label) + match decoder.decode(&label[PUNYCODE_PREFIX.len()..]) { + Ok(decode) => { + let start = output.len(); + output.extend(decode); + let decoded_label = &output[start..]; + + if !has_bidi_labels { + has_bidi_labels |= is_bidi_domain(decoded_label); + } + + if !errors.is_err() { + if !is_nfc(&decoded_label) { + errors.nfc = true; + } else { + check_validity(decoded_label, non_transitional, &mut errors); + } + } + } + Err(()) => { + has_bidi_labels = true; + errors.punycode = true; } - None => errors.push(Error::PunycodeError), } } else { + if !has_bidi_labels { + has_bidi_labels |= is_bidi_domain(label); + } + // `normalized` is already `NFC` so we can skip that check - validate(label, is_bidi_domain, config, errors); - validated.push_str(label) + check_validity(label, config, &mut errors); + output.push_str(label) + } + } + + for label in output[offset..].split('.') { + // V8: Bidi rules + // + // TODO: Add *CheckBidi* flag + if !passes_bidi(label, has_bidi_labels) { + errors.check_bidi = true; + break; + } + } + + errors +} + +#[derive(Default)] +pub struct Idna { + config: Config, + normalized: String, + output: String, +} + +impl Idna { + pub fn new(config: Config) -> Self { + Self { + config, + normalized: String::new(), + output: String::new(), + } + } + + /// http://www.unicode.org/reports/tr46/#ToASCII + #[allow(clippy::wrong_self_convention)] + pub fn to_ascii<'a>(&'a mut self, domain: &str, out: &mut String) -> Result<(), Errors> { + let mut errors = processing(domain, self.config, &mut self.normalized, &mut self.output); + + let mut first = true; + for label in self.output.split('.') { + if !first { + out.push('.'); + } + first = false; + + if label.is_ascii() { + out.push_str(label); + } else { + let offset = out.len(); + out.push_str(PUNYCODE_PREFIX); + if let Err(()) = punycode::encode_into(label.chars(), out) { + errors.punycode = true; + out.truncate(offset); + } + } } + + if self.config.verify_dns_length { + let domain = if out.ends_with('.') { + &out[..out.len() - 1] + } else { + &*out + }; + if domain.is_empty() || domain.split('.').any(|label| label.is_empty()) { + errors.too_short_for_dns = true; + } + if domain.len() > 253 || domain.split('.').any(|label| label.len() > 63) { + errors.too_long_for_dns = true; + } + } + + errors.into() + } + + /// http://www.unicode.org/reports/tr46/#ToUnicode + #[allow(clippy::wrong_self_convention)] + pub fn to_unicode<'a>(&'a mut self, domain: &str, out: &mut String) -> Result<(), Errors> { + processing(domain, self.config, &mut self.normalized, out).into() } - validated } #[derive(Clone, Copy)] @@ -377,6 +503,7 @@ pub struct Config { transitional_processing: bool, verify_dns_length: bool, check_hyphens: bool, + use_idna_2008_rules: bool, } /// The defaults are that of https://url.spec.whatwg.org/#idna @@ -391,6 +518,7 @@ impl Default for Config { // Only use for to_ascii, not to_unicode verify_dns_length: false, + use_idna_2008_rules: false, } } } @@ -420,76 +548,181 @@ impl Config { self } + #[inline] + pub fn use_idna_2008_rules(mut self, value: bool) -> Self { + self.use_idna_2008_rules = value; + self + } + /// http://www.unicode.org/reports/tr46/#ToASCII pub fn to_ascii(self, domain: &str) -> Result { - let mut errors = Vec::new(); let mut result = String::new(); - let mut first = true; - for label in processing(domain, self, &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), - } - } + let mut codec = Idna::new(self); + codec.to_ascii(domain, &mut result).map(|()| result) + } + + /// http://www.unicode.org/reports/tr46/#ToUnicode + pub fn to_unicode(self, domain: &str) -> (String, Result<(), Errors>) { + let mut codec = Idna::new(self); + let mut out = String::with_capacity(domain.len()); + let result = codec.to_unicode(domain, &mut out); + (out, result) + } +} + +fn is_bidi_domain(s: &str) -> bool { + for c in s.chars() { + if c.is_ascii_graphic() { + continue; + } + match bidi_class(c) { + BidiClass::R | BidiClass::AL | BidiClass::AN => return true, + _ => {} } + } + false +} - if self.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) +/// Errors recorded during UTS #46 processing. +/// +/// This is opaque for now, indicating what types of errors have been encountered at least once. +/// More details may be exposed in the future. +#[derive(Default)] +pub struct Errors { + punycode: bool, + check_hyphens: bool, + check_bidi: bool, + start_combining_mark: bool, + invalid_mapping: bool, + nfc: bool, + disallowed_by_std3_ascii_rules: bool, + disallowed_mapped_in_std3: bool, + disallowed_character: bool, + too_long_for_dns: bool, + too_short_for_dns: bool, + disallowed_in_idna_2008: bool, +} + +impl Errors { + fn is_err(&self) -> bool { + let Errors { + punycode, + check_hyphens, + check_bidi, + start_combining_mark, + invalid_mapping, + nfc, + disallowed_by_std3_ascii_rules, + disallowed_mapped_in_std3, + disallowed_character, + too_long_for_dns, + too_short_for_dns, + disallowed_in_idna_2008, + } = *self; + punycode + || check_hyphens + || check_bidi + || start_combining_mark + || invalid_mapping + || nfc + || disallowed_by_std3_ascii_rules + || disallowed_mapped_in_std3 + || disallowed_character + || too_long_for_dns + || too_short_for_dns + || disallowed_in_idna_2008 + } +} + +impl fmt::Debug for Errors { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let Errors { + punycode, + check_hyphens, + check_bidi, + start_combining_mark, + invalid_mapping, + nfc, + disallowed_by_std3_ascii_rules, + disallowed_mapped_in_std3, + disallowed_character, + too_long_for_dns, + too_short_for_dns, + disallowed_in_idna_2008, + } = *self; + + let fields = [ + ("punycode", punycode), + ("check_hyphens", check_hyphens), + ("check_bidi", check_bidi), + ("start_combining_mark", start_combining_mark), + ("invalid_mapping", invalid_mapping), + ("nfc", nfc), + ( + "disallowed_by_std3_ascii_rules", + disallowed_by_std3_ascii_rules, + ), + ("disallowed_mapped_in_std3", disallowed_mapped_in_std3), + ("disallowed_character", disallowed_character), + ("too_long_for_dns", too_long_for_dns), + ("too_short_for_dns", too_short_for_dns), + ("disallowed_in_idna_2008", disallowed_in_idna_2008), + ]; + + let mut empty = true; + f.write_str("Errors { ")?; + for (name, val) in &fields { + if *val { + if !empty { + f.write_str(", ")?; + } + f.write_str(*name)?; + empty = false; } } - if errors.is_empty() { - Ok(result) + + if !empty { + f.write_str(" }") } else { - Err(Errors(errors)) + f.write_str("}") } } +} - /// http://www.unicode.org/reports/tr46/#ToUnicode - pub fn to_unicode(self, domain: &str) -> (String, Result<(), Errors>) { - let mut errors = Vec::new(); - let domain = processing(domain, self, &mut errors); - let errors = if errors.is_empty() { +impl From for Result<(), Errors> { + fn from(e: Errors) -> Result<(), Errors> { + if !e.is_err() { Ok(()) } else { - Err(Errors(errors)) - }; - (domain, errors) + Err(e) + } } } -#[derive(PartialEq, Eq, Clone, Copy, Debug)] -enum Error { - PunycodeError, - ValidityCriteria, - DissallowedByStd3AsciiRules, - DissallowedMappedInStd3, - DissallowedCharacter, - TooLongForDns, - TooShortForDns, +impl StdError for Errors {} + +impl fmt::Display for Errors { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + fmt::Debug::fmt(self, f) + } } -/// 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); +#[cfg(test)] +mod tests { + use super::{find_char, Mapping}; + + #[test] + fn mapping_fast_path() { + assert_matches!(find_char('-'), &Mapping::Valid); + assert_matches!(find_char('.'), &Mapping::Valid); + for c in &['0', '1', '2', '3', '4', '5', '6', '7', '8', '9'] { + assert_matches!(find_char(*c), &Mapping::Valid); + } + for c in &[ + 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', + 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z', + ] { + assert_matches!(find_char(*c), &Mapping::Valid); + } + } +} diff --git a/vendor/idna/src/uts46_mapping_table.rs b/vendor/idna/src/uts46_mapping_table.rs index 2733290d69..7eb2aadf07 100644 --- a/vendor/idna/src/uts46_mapping_table.rs +++ b/vendor/idna/src/uts46_mapping_table.rs @@ -1,4 +1,4 @@ -// Copyright 2013-2014 The rust-url developers. +// Copyright 2013-2020 The rust-url developers. // // Licensed under the Apache License, Version 2.0 or the MIT license @@ -8,3169 +8,1892 @@ // 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 TABLE: &[(char, u16)] = &[ + ('\u{0}', 32768), + ('\u{2d}', 32769), + ('\u{2f}', 32770), + ('\u{30}', 32771), + ('\u{3a}', 32772), + ('\u{41}', 5), + ('\u{5b}', 32799), + ('\u{61}', 32800), + ('\u{7b}', 32801), + ('\u{80}', 32802), + ('\u{a0}', 32803), + ('\u{a1}', 32804), + ('\u{a8}', 37), + ('\u{ab}', 32808), + ('\u{ad}', 41), + ('\u{b0}', 32812), + ('\u{b2}', 45), + ('\u{e0}', 32859), + ('\u{f7}', 32860), + ('\u{f8}', 32861), + ('\u{100}', 94), + ('\u{132}', 32912), + ('\u{134}', 145), + ('\u{137}', 32916), + ('\u{139}', 149), + ('\u{13f}', 32923), + ('\u{141}', 156), + ('\u{18c}', 32999), + ('\u{18e}', 232), + ('\u{199}', 33011), + ('\u{19c}', 244), + ('\u{1aa}', 33026), + ('\u{1ac}', 259), + ('\u{1b9}', 33040), + ('\u{1bc}', 33041), + ('\u{1bd}', 33042), + ('\u{1c4}', 33043), + ('\u{1c7}', 33044), + ('\u{1ca}', 33045), + ('\u{1cd}', 278), + ('\u{1dc}', 33061), + ('\u{1de}', 294), + ('\u{1ef}', 33079), + ('\u{1f1}', 33080), + ('\u{1f4}', 313), + ('\u{233}', 33144), + ('\u{23a}', 377), + ('\u{23f}', 33150), + ('\u{241}', 383), + ('\u{24f}', 33165), + ('\u{2b0}', 398), + ('\u{2b9}', 33175), + ('\u{2c2}', 33176), + ('\u{2c6}', 33177), + ('\u{2d2}', 33178), + ('\u{2d8}', 411), + ('\u{2de}', 33185), + ('\u{2e0}', 418), + ('\u{2e5}', 33191), + ('\u{2ec}', 424), + ('\u{2ef}', 33195), + ('\u{300}', 33196), + ('\u{340}', 429), + ('\u{346}', 33203), + ('\u{34f}', 33204), + ('\u{350}', 33205), + ('\u{370}', 438), + ('\u{378}', 33214), + ('\u{37a}', 33215), + ('\u{37b}', 33216), + ('\u{37e}', 449), + ('\u{380}', 33219), + ('\u{384}', 452), + ('\u{3ac}', 33260), + ('\u{3c2}', 33261), + ('\u{3c3}', 33262), + ('\u{3cf}', 495), + ('\u{3fb}', 33307), + ('\u{3fd}', 540), + ('\u{430}', 33359), + ('\u{460}', 592), + ('\u{483}', 33395), + ('\u{488}', 33396), + ('\u{48a}', 629), + ('\u{4ce}', 33465), + ('\u{4d0}', 698), + ('\u{557}', 33601), + ('\u{559}', 33602), + ('\u{55a}', 33603), + ('\u{560}', 33604), + ('\u{587}', 837), + ('\u{589}', 33607), + ('\u{58b}', 33608), + ('\u{58d}', 33609), + ('\u{590}', 33610), + ('\u{591}', 33611), + ('\u{5be}', 844), + ('\u{5c1}', 33615), + ('\u{5c3}', 33616), + ('\u{5c4}', 33617), + ('\u{5c6}', 850), + ('\u{5c8}', 33620), + ('\u{5d0}', 33621), + ('\u{5eb}', 33622), + ('\u{5ef}', 33623), + ('\u{5f5}', 33624), + ('\u{606}', 33625), + ('\u{610}', 33626), + ('\u{61b}', 33627), + ('\u{61c}', 33628), + ('\u{61e}', 33629), + ('\u{620}', 33630), + ('\u{640}', 33631), + ('\u{641}', 33632), + ('\u{66a}', 33633), + ('\u{66e}', 33634), + ('\u{675}', 867), + ('\u{679}', 33639), + ('\u{6d4}', 33640), + ('\u{6d5}', 33641), + ('\u{6dd}', 874), + ('\u{6df}', 33644), + ('\u{6e9}', 33645), + ('\u{6ea}', 33646), + ('\u{700}', 33647), + ('\u{70e}', 33648), + ('\u{710}', 33649), + ('\u{74b}', 33650), + ('\u{74d}', 33651), + ('\u{7b2}', 33652), + ('\u{7c0}', 33653), + ('\u{7f6}', 33654), + ('\u{7fb}', 33655), + ('\u{7fd}', 33656), + ('\u{7fe}', 33657), + ('\u{800}', 33658), + ('\u{82e}', 33659), + ('\u{830}', 33660), + ('\u{83f}', 33661), + ('\u{840}', 33662), + ('\u{85c}', 33663), + ('\u{85e}', 896), + ('\u{860}', 33666), + ('\u{86b}', 33667), + ('\u{8a0}', 33668), + ('\u{8b5}', 33669), + ('\u{8b6}', 33670), + ('\u{8c8}', 33671), + ('\u{8d3}', 33672), + ('\u{8e2}', 33673), + ('\u{8e3}', 33674), + ('\u{958}', 907), + ('\u{960}', 33683), + ('\u{964}', 33684), + ('\u{966}', 33685), + ('\u{970}', 33686), + ('\u{971}', 33687), + ('\u{984}', 33688), + ('\u{985}', 33689), + ('\u{98d}', 33690), + ('\u{98f}', 33691), + ('\u{991}', 33692), + ('\u{993}', 33693), + ('\u{9a9}', 33694), + ('\u{9aa}', 33695), + ('\u{9b1}', 928), + ('\u{9b3}', 33698), + ('\u{9b6}', 33699), + ('\u{9ba}', 33700), + ('\u{9bc}', 33701), + ('\u{9c5}', 33702), + ('\u{9c7}', 33703), + ('\u{9c9}', 33704), + ('\u{9cb}', 33705), + ('\u{9cf}', 33706), + ('\u{9d7}', 33707), + ('\u{9d8}', 33708), + ('\u{9dc}', 941), + ('\u{9e0}', 33713), + ('\u{9e4}', 33714), + ('\u{9e6}', 33715), + ('\u{9f2}', 33716), + ('\u{9fc}', 949), + ('\u{9ff}', 33720), + ('\u{a01}', 33721), + ('\u{a04}', 33722), + ('\u{a05}', 33723), + ('\u{a0b}', 33724), + ('\u{a0f}', 33725), + ('\u{a11}', 33726), + ('\u{a13}', 33727), + ('\u{a29}', 33728), + ('\u{a2a}', 33729), + ('\u{a31}', 962), + ('\u{a38}', 33737), + ('\u{a3a}', 33738), + ('\u{a3c}', 971), + ('\u{a3e}', 33741), + ('\u{a43}', 33742), + ('\u{a47}', 33743), + ('\u{a49}', 33744), + ('\u{a4b}', 33745), + ('\u{a4e}', 33746), + ('\u{a51}', 33747), + ('\u{a52}', 33748), + ('\u{a59}', 981), + ('\u{a5f}', 33755), + ('\u{a66}', 33756), + ('\u{a76}', 33757), + ('\u{a77}', 33758), + ('\u{a81}', 33759), + ('\u{a84}', 33760), + ('\u{a85}', 33761), + ('\u{a8e}', 33762), + ('\u{a8f}', 33763), + ('\u{a92}', 33764), + ('\u{a93}', 33765), + ('\u{aa9}', 33766), + ('\u{aaa}', 33767), + ('\u{ab1}', 33768), + ('\u{ab2}', 33769), + ('\u{ab4}', 33770), + ('\u{ab5}', 33771), + ('\u{aba}', 33772), + ('\u{abc}', 33773), + ('\u{ac6}', 33774), + ('\u{ac7}', 33775), + ('\u{aca}', 33776), + ('\u{acb}', 33777), + ('\u{ace}', 33778), + ('\u{ad0}', 33779), + ('\u{ad1}', 33780), + ('\u{ae0}', 33781), + ('\u{ae4}', 33782), + ('\u{ae6}', 33783), + ('\u{af0}', 33784), + ('\u{af2}', 33785), + ('\u{af9}', 33786), + ('\u{b00}', 33787), + ('\u{b01}', 33788), + ('\u{b04}', 33789), + ('\u{b05}', 33790), + ('\u{b0d}', 33791), + ('\u{b0f}', 33792), + ('\u{b11}', 33793), + ('\u{b13}', 33794), + ('\u{b29}', 33795), + ('\u{b2a}', 33796), + ('\u{b31}', 33797), + ('\u{b32}', 33798), + ('\u{b34}', 33799), + ('\u{b35}', 33800), + ('\u{b3a}', 33801), + ('\u{b3c}', 33802), + ('\u{b45}', 33803), + ('\u{b47}', 33804), + ('\u{b49}', 33805), + ('\u{b4b}', 33806), + ('\u{b4e}', 33807), + ('\u{b55}', 33808), + ('\u{b58}', 33809), + ('\u{b5c}', 1042), + ('\u{b5f}', 33813), + ('\u{b64}', 33814), + ('\u{b66}', 33815), + ('\u{b70}', 1048), + ('\u{b72}', 33818), + ('\u{b78}', 33819), + ('\u{b82}', 33820), + ('\u{b84}', 33821), + ('\u{b85}', 33822), + ('\u{b8b}', 33823), + ('\u{b8e}', 33824), + ('\u{b91}', 33825), + ('\u{b92}', 33826), + ('\u{b96}', 33827), + ('\u{b99}', 33828), + ('\u{b9b}', 1061), + ('\u{b9e}', 33832), + ('\u{ba0}', 33833), + ('\u{ba3}', 33834), + ('\u{ba5}', 33835), + ('\u{ba8}', 33836), + ('\u{bab}', 33837), + ('\u{bae}', 33838), + ('\u{bba}', 33839), + ('\u{bbe}', 33840), + ('\u{bc3}', 33841), + ('\u{bc6}', 33842), + ('\u{bc9}', 33843), + ('\u{bca}', 33844), + ('\u{bce}', 33845), + ('\u{bd0}', 33846), + ('\u{bd1}', 33847), + ('\u{bd7}', 33848), + ('\u{bd8}', 33849), + ('\u{be6}', 33850), + ('\u{bf0}', 33851), + ('\u{bfb}', 33852), + ('\u{c00}', 33853), + ('\u{c0d}', 33854), + ('\u{c0e}', 33855), + ('\u{c11}', 33856), + ('\u{c12}', 33857), + ('\u{c29}', 33858), + ('\u{c2a}', 33859), + ('\u{c3a}', 33860), + ('\u{c3d}', 33861), + ('\u{c45}', 33862), + ('\u{c46}', 33863), + ('\u{c49}', 33864), + ('\u{c4a}', 33865), + ('\u{c4e}', 33866), + ('\u{c55}', 33867), + ('\u{c57}', 33868), + ('\u{c58}', 33869), + ('\u{c5b}', 33870), + ('\u{c60}', 33871), + ('\u{c64}', 33872), + ('\u{c66}', 33873), + ('\u{c70}', 33874), + ('\u{c77}', 33875), + ('\u{c80}', 33876), + ('\u{c84}', 33877), + ('\u{c85}', 33878), + ('\u{c8d}', 33879), + ('\u{c8e}', 33880), + ('\u{c91}', 33881), + ('\u{c92}', 33882), + ('\u{ca9}', 33883), + ('\u{caa}', 33884), + ('\u{cb4}', 33885), + ('\u{cb5}', 33886), + ('\u{cba}', 33887), + ('\u{cbc}', 33888), + ('\u{cc5}', 33889), + ('\u{cc6}', 33890), + ('\u{cc9}', 33891), + ('\u{cca}', 33892), + ('\u{cce}', 33893), + ('\u{cd5}', 33894), + ('\u{cd7}', 33895), + ('\u{cde}', 1128), + ('\u{ce0}', 33898), + ('\u{ce4}', 33899), + ('\u{ce6}', 33900), + ('\u{cf0}', 33901), + ('\u{cf1}', 33902), + ('\u{cf3}', 33903), + ('\u{d00}', 33904), + ('\u{d0d}', 33905), + ('\u{d0e}', 33906), + ('\u{d11}', 33907), + ('\u{d12}', 33908), + ('\u{d45}', 33909), + ('\u{d46}', 33910), + ('\u{d49}', 33911), + ('\u{d4a}', 33912), + ('\u{d4f}', 33913), + ('\u{d50}', 33914), + ('\u{d54}', 33915), + ('\u{d58}', 33916), + ('\u{d5f}', 33917), + ('\u{d64}', 33918), + ('\u{d66}', 33919), + ('\u{d70}', 33920), + ('\u{d7a}', 33921), + ('\u{d80}', 33922), + ('\u{d81}', 33923), + ('\u{d84}', 33924), + ('\u{d85}', 33925), + ('\u{d97}', 33926), + ('\u{d9a}', 33927), + ('\u{db2}', 33928), + ('\u{db3}', 33929), + ('\u{dbc}', 1162), + ('\u{dbe}', 33932), + ('\u{dc0}', 33933), + ('\u{dc7}', 33934), + ('\u{dca}', 33935), + ('\u{dcb}', 33936), + ('\u{dcf}', 33937), + ('\u{dd5}', 1170), + ('\u{dd8}', 33941), + ('\u{de0}', 33942), + ('\u{de6}', 33943), + ('\u{df0}', 33944), + ('\u{df2}', 33945), + ('\u{df4}', 33946), + ('\u{df5}', 33947), + ('\u{e01}', 33948), + ('\u{e33}', 33949), + ('\u{e34}', 33950), + ('\u{e3b}', 33951), + ('\u{e3f}', 33952), + ('\u{e40}', 33953), + ('\u{e4f}', 33954), + ('\u{e50}', 33955), + ('\u{e5a}', 33956), + ('\u{e5c}', 33957), + ('\u{e81}', 33958), + ('\u{e83}', 1191), + ('\u{e86}', 33962), + ('\u{e8b}', 33963), + ('\u{e8c}', 33964), + ('\u{ea4}', 1197), + ('\u{ea7}', 33968), + ('\u{eb3}', 33969), + ('\u{eb4}', 33970), + ('\u{ebe}', 33971), + ('\u{ec0}', 33972), + ('\u{ec5}', 1205), + ('\u{ec8}', 33976), + ('\u{ece}', 33977), + ('\u{ed0}', 33978), + ('\u{eda}', 33979), + ('\u{edc}', 1212), + ('\u{ede}', 33982), + ('\u{ee0}', 33983), + ('\u{f00}', 33984), + ('\u{f01}', 33985), + ('\u{f0b}', 1218), + ('\u{f0d}', 33988), + ('\u{f18}', 33989), + ('\u{f1a}', 33990), + ('\u{f20}', 33991), + ('\u{f2a}', 33992), + ('\u{f35}', 1225), + ('\u{f3a}', 33998), + ('\u{f3e}', 33999), + ('\u{f43}', 34000), + ('\u{f44}', 34001), + ('\u{f48}', 34002), + ('\u{f49}', 34003), + ('\u{f4d}', 34004), + ('\u{f4e}', 34005), + ('\u{f52}', 34006), + ('\u{f53}', 34007), + ('\u{f57}', 34008), + ('\u{f58}', 34009), + ('\u{f5c}', 34010), + ('\u{f5d}', 34011), + ('\u{f69}', 34012), + ('\u{f6a}', 34013), + ('\u{f6d}', 34014), + ('\u{f71}', 34015), + ('\u{f73}', 1248), + ('\u{f7a}', 34023), + ('\u{f81}', 34024), + ('\u{f82}', 34025), + ('\u{f85}', 34026), + ('\u{f86}', 34027), + ('\u{f93}', 34028), + ('\u{f94}', 34029), + ('\u{f98}', 34030), + ('\u{f99}', 34031), + ('\u{f9d}', 34032), + ('\u{f9e}', 34033), + ('\u{fa2}', 34034), + ('\u{fa3}', 34035), + ('\u{fa7}', 34036), + ('\u{fa8}', 34037), + ('\u{fac}', 34038), + ('\u{fad}', 34039), + ('\u{fb9}', 34040), + ('\u{fba}', 34041), + ('\u{fbd}', 34042), + ('\u{fbe}', 34043), + ('\u{fc6}', 34044), + ('\u{fc7}', 34045), + ('\u{fcd}', 34046), + ('\u{fce}', 34047), + ('\u{fdb}', 34048), + ('\u{1000}', 34049), + ('\u{104a}', 34050), + ('\u{1050}', 34051), + ('\u{109e}', 34052), + ('\u{10a0}', 34053), + ('\u{10c7}', 34054), + ('\u{10c8}', 34055), + ('\u{10cd}', 34056), + ('\u{10ce}', 34057), + ('\u{10d0}', 34058), + ('\u{10fb}', 1291), + ('\u{10fd}', 34061), + ('\u{1100}', 34062), + ('\u{115f}', 34063), + ('\u{1161}', 34064), + ('\u{1200}', 34065), + ('\u{1249}', 34066), + ('\u{124a}', 34067), + ('\u{124e}', 34068), + ('\u{1250}', 34069), + ('\u{1257}', 1302), + ('\u{125a}', 34073), + ('\u{125e}', 34074), + ('\u{1260}', 34075), + ('\u{1289}', 34076), + ('\u{128a}', 34077), + ('\u{128e}', 34078), + ('\u{1290}', 34079), + ('\u{12b1}', 34080), + ('\u{12b2}', 34081), + ('\u{12b6}', 34082), + ('\u{12b8}', 34083), + ('\u{12bf}', 1316), + ('\u{12c2}', 34087), + ('\u{12c6}', 34088), + ('\u{12c8}', 34089), + ('\u{12d7}', 34090), + ('\u{12d8}', 34091), + ('\u{1311}', 34092), + ('\u{1312}', 34093), + ('\u{1316}', 34094), + ('\u{1318}', 34095), + ('\u{135b}', 34096), + ('\u{135d}', 34097), + ('\u{1360}', 34098), + ('\u{137d}', 34099), + ('\u{1380}', 34100), + ('\u{1390}', 34101), + ('\u{139a}', 34102), + ('\u{13a0}', 34103), + ('\u{13f6}', 34104), + ('\u{13f8}', 1337), + ('\u{13fe}', 34111), + ('\u{1400}', 34112), + ('\u{1401}', 34113), + ('\u{166d}', 34114), + ('\u{166f}', 34115), + ('\u{1680}', 34116), + ('\u{1681}', 34117), + ('\u{169b}', 34118), + ('\u{169d}', 34119), + ('\u{16a0}', 34120), + ('\u{16eb}', 34121), + ('\u{16f1}', 34122), + ('\u{16f9}', 34123), + ('\u{1700}', 34124), + ('\u{170d}', 34125), + ('\u{170e}', 34126), + ('\u{1715}', 34127), + ('\u{1720}', 34128), + ('\u{1735}', 34129), + ('\u{1737}', 34130), + ('\u{1740}', 34131), + ('\u{1754}', 34132), + ('\u{1760}', 34133), + ('\u{176d}', 34134), + ('\u{176e}', 34135), + ('\u{1771}', 34136), + ('\u{1772}', 34137), + ('\u{1774}', 34138), + ('\u{1780}', 34139), + ('\u{17b4}', 34140), + ('\u{17b6}', 34141), + ('\u{17d4}', 34142), + ('\u{17d7}', 34143), + ('\u{17d8}', 34144), + ('\u{17dc}', 34145), + ('\u{17de}', 34146), + ('\u{17e0}', 34147), + ('\u{17ea}', 34148), + ('\u{17f0}', 34149), + ('\u{17fa}', 34150), + ('\u{1800}', 34151), + ('\u{1806}', 34152), + ('\u{1807}', 34153), + ('\u{180b}', 34154), + ('\u{180e}', 34155), + ('\u{1810}', 34156), + ('\u{181a}', 34157), + ('\u{1820}', 34158), + ('\u{1879}', 34159), + ('\u{1880}', 34160), + ('\u{18ab}', 34161), + ('\u{18b0}', 34162), + ('\u{18f6}', 34163), + ('\u{1900}', 34164), + ('\u{191f}', 34165), + ('\u{1920}', 34166), + ('\u{192c}', 34167), + ('\u{1930}', 34168), + ('\u{193c}', 34169), + ('\u{1940}', 34170), + ('\u{1941}', 34171), + ('\u{1944}', 34172), + ('\u{1946}', 34173), + ('\u{196e}', 34174), + ('\u{1970}', 34175), + ('\u{1975}', 34176), + ('\u{1980}', 34177), + ('\u{19ac}', 34178), + ('\u{19b0}', 34179), + ('\u{19ca}', 34180), + ('\u{19d0}', 34181), + ('\u{19da}', 34182), + ('\u{19db}', 34183), + ('\u{19de}', 34184), + ('\u{1a00}', 34185), + ('\u{1a1c}', 34186), + ('\u{1a1e}', 34187), + ('\u{1a20}', 34188), + ('\u{1a5f}', 34189), + ('\u{1a60}', 34190), + ('\u{1a7d}', 34191), + ('\u{1a7f}', 34192), + ('\u{1a8a}', 34193), + ('\u{1a90}', 34194), + ('\u{1a9a}', 34195), + ('\u{1aa0}', 34196), + ('\u{1aa7}', 34197), + ('\u{1aa8}', 34198), + ('\u{1aae}', 34199), + ('\u{1ab0}', 34200), + ('\u{1abe}', 34201), + ('\u{1abf}', 34202), + ('\u{1ac1}', 34203), + ('\u{1b00}', 34204), + ('\u{1b4c}', 34205), + ('\u{1b50}', 34206), + ('\u{1b5a}', 34207), + ('\u{1b6b}', 34208), + ('\u{1b74}', 34209), + ('\u{1b7d}', 34210), + ('\u{1b80}', 34211), + ('\u{1bf4}', 34212), + ('\u{1bfc}', 34213), + ('\u{1c00}', 34214), + ('\u{1c38}', 34215), + ('\u{1c3b}', 34216), + ('\u{1c40}', 34217), + ('\u{1c4a}', 34218), + ('\u{1c4d}', 34219), + ('\u{1c7e}', 34220), + ('\u{1c80}', 1453), + ('\u{1c84}', 34225), + ('\u{1c86}', 1458), + ('\u{1c89}', 34229), + ('\u{1c90}', 1462), + ('\u{1cbb}', 34273), + ('\u{1cbd}', 1506), + ('\u{1cc0}', 34277), + ('\u{1cc8}', 34278), + ('\u{1cd0}', 34279), + ('\u{1cd3}', 34280), + ('\u{1cd4}', 34281), + ('\u{1cfb}', 34282), + ('\u{1d00}', 34283), + ('\u{1d2c}', 1516), + ('\u{1d6b}', 34347), + ('\u{1d78}', 34348), + ('\u{1d79}', 34349), + ('\u{1d9b}', 1582), + ('\u{1dc0}', 34387), + ('\u{1dfa}', 34388), + ('\u{1dfb}', 34389), + ('\u{1e00}', 1622), + ('\u{1e95}', 34539), + ('\u{1e9a}', 1772), + ('\u{1e9c}', 34542), + ('\u{1e9e}', 1775), + ('\u{1eff}', 34640), + ('\u{1f08}', 1873), + ('\u{1f10}', 34649), + ('\u{1f16}', 34650), + ('\u{1f18}', 1883), + ('\u{1f1e}', 34657), + ('\u{1f20}', 34658), + ('\u{1f28}', 1891), + ('\u{1f30}', 34667), + ('\u{1f38}', 1900), + ('\u{1f40}', 34676), + ('\u{1f46}', 34677), + ('\u{1f48}', 1910), + ('\u{1f4e}', 34684), + ('\u{1f50}', 34685), + ('\u{1f58}', 1918), + ('\u{1f60}', 34694), + ('\u{1f68}', 1927), + ('\u{1f7e}', 34717), + ('\u{1f80}', 1950), + ('\u{1fb0}', 34766), + ('\u{1fb2}', 1999), + ('\u{1fd0}', 34797), + ('\u{1fd3}', 34798), + ('\u{1fd4}', 34799), + ('\u{1fd6}', 34800), + ('\u{1fd8}', 2033), + ('\u{1fe0}', 34809), + ('\u{1fe3}', 34810), + ('\u{1fe4}', 34811), + ('\u{1fe8}', 2044), + ('\u{1ff0}', 34820), + ('\u{1ff2}', 2053), + ('\u{2000}', 34835), + ('\u{200b}', 34836), + ('\u{200c}', 34837), + ('\u{200e}', 34838), + ('\u{2010}', 2071), + ('\u{2012}', 34841), + ('\u{2017}', 34842), + ('\u{2018}', 34843), + ('\u{2024}', 34844), + ('\u{2027}', 34845), + ('\u{2028}', 34846), + ('\u{202f}', 34847), + ('\u{2030}', 34848), + ('\u{2033}', 2081), + ('\u{2038}', 34854), + ('\u{203c}', 2087), + ('\u{203f}', 34858), + ('\u{2047}', 2091), + ('\u{204a}', 34862), + ('\u{2057}', 34863), + ('\u{2058}', 34864), + ('\u{205f}', 2097), + ('\u{2061}', 34867), + ('\u{2064}', 34868), + ('\u{2065}', 34869), + ('\u{2070}', 2102), + ('\u{2072}', 34872), + ('\u{2074}', 2105), + ('\u{209d}', 34914), + ('\u{20a0}', 34915), + ('\u{20a8}', 34916), + ('\u{20a9}', 34917), + ('\u{20c0}', 34918), + ('\u{20d0}', 34919), + ('\u{20f1}', 34920), + ('\u{2100}', 2153), + ('\u{210b}', 34932), + ('\u{210f}', 34933), + ('\u{2110}', 34934), + ('\u{2112}', 34935), + ('\u{2114}', 2168), + ('\u{2117}', 34939), + ('\u{2119}', 2172), + ('\u{211b}', 34942), + ('\u{211e}', 34943), + ('\u{2120}', 2176), + ('\u{212f}', 34959), + ('\u{2131}', 2192), + ('\u{213d}', 34972), + ('\u{213f}', 2205), + ('\u{2141}', 34975), + ('\u{2145}', 34976), + ('\u{2147}', 2209), + ('\u{214a}', 34980), + ('\u{214e}', 2213), + ('\u{2180}', 35031), + ('\u{2183}', 2264), + ('\u{2185}', 35034), + ('\u{2189}', 35035), + ('\u{218a}', 35036), + ('\u{218c}', 35037), + ('\u{2190}', 35038), + ('\u{222c}', 2271), + ('\u{2231}', 35044), + ('\u{2260}', 35045), + ('\u{2261}', 35046), + ('\u{226e}', 35047), + ('\u{2270}', 35048), + ('\u{2329}', 2281), + ('\u{232b}', 35051), + ('\u{2427}', 35052), + ('\u{2440}', 35053), + ('\u{244b}', 35054), + ('\u{2460}', 2287), + ('\u{2488}', 35095), + ('\u{249c}', 2328), + ('\u{24eb}', 35175), + ('\u{2a0c}', 35176), + ('\u{2a0d}', 35177), + ('\u{2a74}', 2410), + ('\u{2a77}', 35181), + ('\u{2adc}', 35182), + ('\u{2add}', 35183), + ('\u{2b74}', 35184), + ('\u{2b76}', 35185), + ('\u{2b96}', 35186), + ('\u{2b97}', 35187), + ('\u{2c00}', 2420), + ('\u{2c30}', 35236), + ('\u{2c5f}', 2469), + ('\u{2c65}', 35243), + ('\u{2c67}', 2476), + ('\u{2c73}', 35256), + ('\u{2c75}', 35257), + ('\u{2c76}', 35258), + ('\u{2c7c}', 2491), + ('\u{2ce3}', 35362), + ('\u{2ce5}', 35363), + ('\u{2ceb}', 2596), + ('\u{2cee}', 35367), + ('\u{2cf2}', 2600), + ('\u{2cf4}', 35370), + ('\u{2cf9}', 35371), + ('\u{2d00}', 35372), + ('\u{2d26}', 2605), + ('\u{2d28}', 35375), + ('\u{2d2d}', 35376), + ('\u{2d2e}', 35377), + ('\u{2d30}', 35378), + ('\u{2d68}', 35379), + ('\u{2d6f}', 2612), + ('\u{2d71}', 35382), + ('\u{2d7f}', 35383), + ('\u{2d97}', 35384), + ('\u{2da0}', 35385), + ('\u{2da7}', 35386), + ('\u{2da8}', 35387), + ('\u{2daf}', 35388), + ('\u{2db0}', 35389), + ('\u{2db7}', 35390), + ('\u{2db8}', 35391), + ('\u{2dbf}', 35392), + ('\u{2dc0}', 35393), + ('\u{2dc7}', 35394), + ('\u{2dc8}', 35395), + ('\u{2dcf}', 35396), + ('\u{2dd0}', 35397), + ('\u{2dd7}', 35398), + ('\u{2dd8}', 35399), + ('\u{2ddf}', 35400), + ('\u{2de0}', 35401), + ('\u{2e00}', 35402), + ('\u{2e2f}', 35403), + ('\u{2e30}', 35404), + ('\u{2e53}', 35405), + ('\u{2e80}', 35406), + ('\u{2e9a}', 35407), + ('\u{2e9b}', 35408), + ('\u{2e9f}', 35409), + ('\u{2ea0}', 35410), + ('\u{2ef3}', 35411), + ('\u{2ef4}', 35412), + ('\u{2f00}', 2645), + ('\u{2fd6}', 35627), + ('\u{3000}', 2860), + ('\u{3003}', 35631), + ('\u{3005}', 35632), + ('\u{3008}', 35633), + ('\u{302a}', 35634), + ('\u{302e}', 35635), + ('\u{3036}', 2868), + ('\u{303d}', 35643), + ('\u{3040}', 35644), + ('\u{3041}', 35645), + ('\u{3097}', 35646), + ('\u{3099}', 35647), + ('\u{309b}', 2880), + ('\u{309d}', 35650), + ('\u{309f}', 2883), + ('\u{30a1}', 35653), + ('\u{30ff}', 35654), + ('\u{3100}', 35655), + ('\u{3105}', 35656), + ('\u{3130}', 2889), + ('\u{3190}', 35753), + ('\u{3192}', 2986), + ('\u{31a0}', 35768), + ('\u{31c0}', 35769), + ('\u{31e4}', 35770), + ('\u{31f0}', 35771), + ('\u{3200}', 3004), + ('\u{3248}', 35844), + ('\u{3250}', 3077), + ('\u{3400}', 36277), + ('\u{4dc0}', 36278), + ('\u{4e00}', 36279), + ('\u{9ffd}', 36280), + ('\u{a000}', 36281), + ('\u{a48d}', 36282), + ('\u{a490}', 36283), + ('\u{a4c7}', 36284), + ('\u{a4d0}', 36285), + ('\u{a4fe}', 36286), + ('\u{a500}', 36287), + ('\u{a60d}', 36288), + ('\u{a610}', 36289), + ('\u{a62c}', 36290), + ('\u{a640}', 3523), + ('\u{a66d}', 36336), + ('\u{a670}', 36337), + ('\u{a674}', 36338), + ('\u{a67e}', 3571), + ('\u{a69e}', 36371), + ('\u{a6e6}', 36372), + ('\u{a6f0}', 36373), + ('\u{a6f2}', 36374), + ('\u{a6f8}', 36375), + ('\u{a700}', 36376), + ('\u{a717}', 36377), + ('\u{a720}', 36378), + ('\u{a722}', 3611), + ('\u{a72f}', 36392), + ('\u{a732}', 3625), + ('\u{a771}', 36456), + ('\u{a779}', 3689), + ('\u{a787}', 36471), + ('\u{a789}', 36472), + ('\u{a78b}', 3705), + ('\u{a78e}', 36476), + ('\u{a790}', 3709), + ('\u{a793}', 36480), + ('\u{a796}', 3713), + ('\u{a7c0}', 36523), + ('\u{a7c2}', 3756), + ('\u{a7cb}', 36533), + ('\u{a7f5}', 36534), + ('\u{a7f6}', 36535), + ('\u{a7f8}', 3768), + ('\u{a7fa}', 36538), + ('\u{a828}', 36539), + ('\u{a82c}', 36540), + ('\u{a82d}', 36541), + ('\u{a830}', 36542), + ('\u{a83a}', 36543), + ('\u{a840}', 36544), + ('\u{a874}', 36545), + ('\u{a878}', 36546), + ('\u{a880}', 36547), + ('\u{a8c6}', 36548), + ('\u{a8ce}', 36549), + ('\u{a8d0}', 36550), + ('\u{a8da}', 36551), + ('\u{a8e0}', 36552), + ('\u{a8f8}', 36553), + ('\u{a8fb}', 3786), + ('\u{a8fd}', 36556), + ('\u{a92e}', 36557), + ('\u{a930}', 36558), + ('\u{a954}', 36559), + ('\u{a95f}', 36560), + ('\u{a97d}', 36561), + ('\u{a980}', 36562), + ('\u{a9c1}', 36563), + ('\u{a9ce}', 36564), + ('\u{a9cf}', 36565), + ('\u{a9da}', 36566), + ('\u{a9de}', 36567), + ('\u{a9e0}', 36568), + ('\u{a9ff}', 36569), + ('\u{aa00}', 36570), + ('\u{aa37}', 36571), + ('\u{aa40}', 36572), + ('\u{aa4e}', 36573), + ('\u{aa50}', 36574), + ('\u{aa5a}', 36575), + ('\u{aa5c}', 36576), + ('\u{aa60}', 36577), + ('\u{aa77}', 36578), + ('\u{aa7a}', 36579), + ('\u{aac3}', 36580), + ('\u{aadb}', 36581), + ('\u{aade}', 36582), + ('\u{aae0}', 36583), + ('\u{aaf0}', 36584), + ('\u{aaf2}', 36585), + ('\u{aaf7}', 36586), + ('\u{ab01}', 36587), + ('\u{ab07}', 36588), + ('\u{ab09}', 36589), + ('\u{ab0f}', 36590), + ('\u{ab11}', 36591), + ('\u{ab17}', 36592), + ('\u{ab20}', 36593), + ('\u{ab27}', 36594), + ('\u{ab28}', 36595), + ('\u{ab2f}', 36596), + ('\u{ab30}', 36597), + ('\u{ab5b}', 3830), + ('\u{ab60}', 36603), + ('\u{ab69}', 36604), + ('\u{ab6a}', 36605), + ('\u{ab6c}', 36606), + ('\u{ab70}', 3839), + ('\u{abc0}', 36687), + ('\u{abeb}', 36688), + ('\u{abec}', 36689), + ('\u{abee}', 36690), + ('\u{abf0}', 36691), + ('\u{abfa}', 36692), + ('\u{ac00}', 36693), + ('\u{d7a4}', 36694), + ('\u{d7b0}', 36695), + ('\u{d7c7}', 36696), + ('\u{d7cb}', 36697), + ('\u{d7fc}', 36698), + ('\u{f900}', 3931), + ('\u{f907}', 36706), + ('\u{f909}', 3939), + ('\u{fa0e}', 36968), + ('\u{fa10}', 4201), + ('\u{fa13}', 36972), + ('\u{fa15}', 4205), + ('\u{fa23}', 36987), + ('\u{fa25}', 4220), + ('\u{fa27}', 36990), + ('\u{fa2a}', 4223), + ('\u{fa5d}', 37042), + ('\u{fa5f}', 4275), + ('\u{fa6e}', 37058), + ('\u{fa70}', 4291), + ('\u{fada}', 37165), + ('\u{fb00}', 4398), + ('\u{fb05}', 37171), + ('\u{fb07}', 37172), + ('\u{fb13}', 4405), + ('\u{fb18}', 37178), + ('\u{fb1d}', 4411), + ('\u{fb50}', 37230), + ('\u{fb52}', 37231), + ('\u{fb56}', 37232), + ('\u{fb5a}', 37233), + ('\u{fb5e}', 37234), + ('\u{fb62}', 37235), + ('\u{fb66}', 37236), + ('\u{fb6a}', 37237), + ('\u{fb6e}', 37238), + ('\u{fb72}', 37239), + ('\u{fb76}', 37240), + ('\u{fb7a}', 37241), + ('\u{fb7e}', 37242), + ('\u{fb82}', 37243), + ('\u{fb84}', 37244), + ('\u{fb86}', 37245), + ('\u{fb88}', 37246), + ('\u{fb8a}', 37247), + ('\u{fb8c}', 37248), + ('\u{fb8e}', 37249), + ('\u{fb92}', 37250), + ('\u{fb96}', 37251), + ('\u{fb9a}', 37252), + ('\u{fb9e}', 37253), + ('\u{fba0}', 37254), + ('\u{fba4}', 37255), + ('\u{fba6}', 37256), + ('\u{fbaa}', 37257), + ('\u{fbae}', 37258), + ('\u{fbb0}', 37259), + ('\u{fbb2}', 37260), + ('\u{fbc2}', 37261), + ('\u{fbd3}', 37262), + ('\u{fbd7}', 37263), + ('\u{fbd9}', 37264), + ('\u{fbdb}', 37265), + ('\u{fbdd}', 37266), + ('\u{fbde}', 37267), + ('\u{fbe0}', 37268), + ('\u{fbe2}', 37269), + ('\u{fbe4}', 37270), + ('\u{fbe8}', 37271), + ('\u{fbea}', 37272), + ('\u{fbec}', 37273), + ('\u{fbee}', 37274), + ('\u{fbf0}', 37275), + ('\u{fbf2}', 37276), + ('\u{fbf4}', 37277), + ('\u{fbf6}', 37278), + ('\u{fbf9}', 37279), + ('\u{fbfc}', 37280), + ('\u{fc00}', 4513), + ('\u{fd3c}', 37597), + ('\u{fd3e}', 37598), + ('\u{fd40}', 37599), + ('\u{fd50}', 37600), + ('\u{fd51}', 37601), + ('\u{fd53}', 4834), + ('\u{fd58}', 37607), + ('\u{fd5a}', 4840), + ('\u{fd5f}', 37613), + ('\u{fd61}', 37614), + ('\u{fd62}', 37615), + ('\u{fd64}', 37616), + ('\u{fd66}', 37617), + ('\u{fd67}', 37618), + ('\u{fd69}', 37619), + ('\u{fd6a}', 37620), + ('\u{fd6c}', 37621), + ('\u{fd6e}', 37622), + ('\u{fd6f}', 37623), + ('\u{fd71}', 37624), + ('\u{fd73}', 4857), + ('\u{fd76}', 37628), + ('\u{fd78}', 4861), + ('\u{fd7c}', 37633), + ('\u{fd7e}', 4866), + ('\u{fd83}', 37639), + ('\u{fd85}', 37640), + ('\u{fd87}', 37641), + ('\u{fd89}', 4874), + ('\u{fd90}', 37649), + ('\u{fd92}', 4882), + ('\u{fd97}', 37655), + ('\u{fd99}', 4888), + ('\u{fd9c}', 37659), + ('\u{fd9e}', 4892), + ('\u{fdc8}', 37702), + ('\u{fdf0}', 4935), + ('\u{fdfe}', 37717), + ('\u{fe00}', 37718), + ('\u{fe10}', 4951), + ('\u{fe19}', 37728), + ('\u{fe20}', 37729), + ('\u{fe30}', 4962), + ('\u{fe33}', 37733), + ('\u{fe35}', 4966), + ('\u{fe45}', 37750), + ('\u{fe47}', 4983), + ('\u{fe49}', 37753), + ('\u{fe4d}', 37754), + ('\u{fe50}', 4987), + ('\u{fe52}', 37757), + ('\u{fe54}', 4990), + ('\u{fe6c}', 37782), + ('\u{fe70}', 5015), + ('\u{fe81}', 37800), + ('\u{fe83}', 37801), + ('\u{fe85}', 37802), + ('\u{fe87}', 37803), + ('\u{fe89}', 37804), + ('\u{fe8d}', 37805), + ('\u{fe8f}', 37806), + ('\u{fe93}', 37807), + ('\u{fe95}', 37808), + ('\u{fe99}', 37809), + ('\u{fe9d}', 37810), + ('\u{fea1}', 37811), + ('\u{fea5}', 37812), + ('\u{fea9}', 37813), + ('\u{feab}', 37814), + ('\u{fead}', 37815), + ('\u{feaf}', 37816), + ('\u{feb1}', 37817), + ('\u{feb5}', 37818), + ('\u{feb9}', 37819), + ('\u{febd}', 37820), + ('\u{fec1}', 37821), + ('\u{fec5}', 37822), + ('\u{fec9}', 37823), + ('\u{fecd}', 37824), + ('\u{fed1}', 37825), + ('\u{fed5}', 37826), + ('\u{fed9}', 37827), + ('\u{fedd}', 37828), + ('\u{fee1}', 37829), + ('\u{fee5}', 37830), + ('\u{fee9}', 37831), + ('\u{feed}', 37832), + ('\u{feef}', 37833), + ('\u{fef1}', 37834), + ('\u{fef5}', 37835), + ('\u{fef7}', 37836), + ('\u{fef9}', 37837), + ('\u{fefb}', 37838), + ('\u{fefd}', 37839), + ('\u{feff}', 5072), + ('\u{ffbf}', 38032), + ('\u{ffc2}', 5265), + ('\u{ffc8}', 38039), + ('\u{ffca}', 5272), + ('\u{ffd0}', 38046), + ('\u{ffd2}', 5279), + ('\u{ffd8}', 38053), + ('\u{ffda}', 5286), + ('\u{ffdd}', 38057), + ('\u{ffe0}', 5290), + ('\u{ffef}', 38073), + ('\u{10000}', 38074), + ('\u{1000c}', 38075), + ('\u{1000d}', 38076), + ('\u{10027}', 38077), + ('\u{10028}', 38078), + ('\u{1003b}', 38079), + ('\u{1003c}', 38080), + ('\u{1003e}', 38081), + ('\u{1003f}', 38082), + ('\u{1004e}', 38083), + ('\u{10050}', 38084), + ('\u{1005e}', 38085), + ('\u{10080}', 38086), + ('\u{100fb}', 38087), + ('\u{10100}', 38088), + ('\u{10103}', 38089), + ('\u{10107}', 38090), + ('\u{10134}', 38091), + ('\u{10137}', 38092), + ('\u{1018f}', 38093), + ('\u{10190}', 38094), + ('\u{1019d}', 38095), + ('\u{101a0}', 38096), + ('\u{101a1}', 38097), + ('\u{101d0}', 38098), + ('\u{101fd}', 38099), + ('\u{101fe}', 38100), + ('\u{10280}', 38101), + ('\u{1029d}', 38102), + ('\u{102a0}', 38103), + ('\u{102d1}', 38104), + ('\u{102e0}', 38105), + ('\u{102e1}', 38106), + ('\u{102fc}', 38107), + ('\u{10300}', 38108), + ('\u{10320}', 38109), + ('\u{10324}', 38110), + ('\u{1032d}', 38111), + ('\u{10341}', 38112), + ('\u{10342}', 38113), + ('\u{1034a}', 38114), + ('\u{1034b}', 38115), + ('\u{10350}', 38116), + ('\u{1037b}', 38117), + ('\u{10380}', 38118), + ('\u{1039e}', 5351), + ('\u{103a0}', 38121), + ('\u{103c4}', 38122), + ('\u{103c8}', 38123), + ('\u{103d0}', 38124), + ('\u{103d6}', 38125), + ('\u{10400}', 5358), + ('\u{10428}', 38166), + ('\u{1049e}', 38167), + ('\u{104a0}', 38168), + ('\u{104aa}', 38169), + ('\u{104b0}', 5402), + ('\u{104d4}', 38206), + ('\u{104d8}', 38207), + ('\u{104fc}', 38208), + ('\u{10500}', 38209), + ('\u{10528}', 38210), + ('\u{10530}', 38211), + ('\u{10564}', 38212), + ('\u{1056f}', 38213), + ('\u{10570}', 38214), + ('\u{10600}', 38215), + ('\u{10737}', 38216), + ('\u{10740}', 38217), + ('\u{10756}', 38218), + ('\u{10760}', 38219), + ('\u{10768}', 38220), + ('\u{10800}', 38221), + ('\u{10806}', 38222), + ('\u{10808}', 5455), + ('\u{1080a}', 38225), + ('\u{10836}', 38226), + ('\u{10837}', 38227), + ('\u{10839}', 38228), + ('\u{1083c}', 38229), + ('\u{1083d}', 38230), + ('\u{1083f}', 38231), + ('\u{10856}', 38232), + ('\u{10857}', 38233), + ('\u{10860}', 38234), + ('\u{10877}', 38235), + ('\u{10880}', 38236), + ('\u{1089f}', 38237), + ('\u{108a7}', 38238), + ('\u{108b0}', 38239), + ('\u{108e0}', 38240), + ('\u{108f3}', 38241), + ('\u{108f4}', 38242), + ('\u{108f6}', 38243), + ('\u{108fb}', 38244), + ('\u{10900}', 38245), + ('\u{10916}', 38246), + ('\u{1091c}', 38247), + ('\u{1091f}', 38248), + ('\u{10920}', 38249), + ('\u{1093a}', 38250), + ('\u{1093f}', 38251), + ('\u{10940}', 38252), + ('\u{10980}', 38253), + ('\u{109b8}', 38254), + ('\u{109bc}', 38255), + ('\u{109be}', 38256), + ('\u{109c0}', 38257), + ('\u{109d0}', 38258), + ('\u{109d2}', 38259), + ('\u{10a00}', 38260), + ('\u{10a04}', 38261), + ('\u{10a05}', 38262), + ('\u{10a07}', 38263), + ('\u{10a0c}', 38264), + ('\u{10a14}', 38265), + ('\u{10a15}', 38266), + ('\u{10a18}', 38267), + ('\u{10a19}', 38268), + ('\u{10a36}', 38269), + ('\u{10a38}', 38270), + ('\u{10a3b}', 38271), + ('\u{10a3f}', 38272), + ('\u{10a40}', 38273), + ('\u{10a49}', 38274), + ('\u{10a50}', 38275), + ('\u{10a59}', 38276), + ('\u{10a60}', 38277), + ('\u{10a7d}', 38278), + ('\u{10a80}', 38279), + ('\u{10a9d}', 38280), + ('\u{10aa0}', 38281), + ('\u{10ac0}', 38282), + ('\u{10ac8}', 38283), + ('\u{10ac9}', 38284), + ('\u{10ae7}', 38285), + ('\u{10aeb}', 38286), + ('\u{10af7}', 38287), + ('\u{10b00}', 38288), + ('\u{10b36}', 38289), + ('\u{10b39}', 38290), + ('\u{10b40}', 38291), + ('\u{10b56}', 38292), + ('\u{10b58}', 38293), + ('\u{10b60}', 38294), + ('\u{10b73}', 38295), + ('\u{10b78}', 38296), + ('\u{10b80}', 38297), + ('\u{10b92}', 38298), + ('\u{10b99}', 38299), + ('\u{10b9d}', 38300), + ('\u{10ba9}', 38301), + ('\u{10bb0}', 38302), + ('\u{10c00}', 38303), + ('\u{10c49}', 38304), + ('\u{10c80}', 5537), + ('\u{10cb3}', 38356), + ('\u{10cc0}', 38357), + ('\u{10cf3}', 38358), + ('\u{10cfa}', 38359), + ('\u{10d00}', 38360), + ('\u{10d28}', 38361), + ('\u{10d30}', 38362), + ('\u{10d3a}', 38363), + ('\u{10e60}', 38364), + ('\u{10e7f}', 38365), + ('\u{10e80}', 38366), + ('\u{10eaa}', 38367), + ('\u{10eab}', 38368), + ('\u{10ead}', 38369), + ('\u{10eae}', 38370), + ('\u{10eb0}', 38371), + ('\u{10eb2}', 38372), + ('\u{10f00}', 38373), + ('\u{10f1d}', 38374), + ('\u{10f27}', 38375), + ('\u{10f28}', 38376), + ('\u{10f30}', 38377), + ('\u{10f51}', 38378), + ('\u{10f5a}', 38379), + ('\u{10fb0}', 38380), + ('\u{10fc5}', 38381), + ('\u{10fcc}', 38382), + ('\u{10fe0}', 38383), + ('\u{10ff7}', 38384), + ('\u{11000}', 38385), + ('\u{11047}', 38386), + ('\u{1104e}', 38387), + ('\u{11052}', 38388), + ('\u{11066}', 38389), + ('\u{11070}', 38390), + ('\u{1107f}', 38391), + ('\u{110bb}', 38392), + ('\u{110bd}', 38393), + ('\u{110be}', 38394), + ('\u{110c2}', 38395), + ('\u{110d0}', 38396), + ('\u{110e9}', 38397), + ('\u{110f0}', 38398), + ('\u{110fa}', 38399), + ('\u{11100}', 38400), + ('\u{11135}', 38401), + ('\u{11136}', 38402), + ('\u{11140}', 38403), + ('\u{11144}', 38404), + ('\u{11148}', 38405), + ('\u{11150}', 38406), + ('\u{11174}', 38407), + ('\u{11176}', 38408), + ('\u{11177}', 38409), + ('\u{11180}', 38410), + ('\u{111c5}', 38411), + ('\u{111c9}', 38412), + ('\u{111cd}', 38413), + ('\u{111ce}', 38414), + ('\u{111db}', 5647), + ('\u{111dd}', 38417), + ('\u{111e0}', 38418), + ('\u{111e1}', 38419), + ('\u{111f5}', 38420), + ('\u{11200}', 38421), + ('\u{11212}', 38422), + ('\u{11213}', 38423), + ('\u{11238}', 38424), + ('\u{1123e}', 38425), + ('\u{1123f}', 38426), + ('\u{11280}', 38427), + ('\u{11287}', 5660), + ('\u{1128a}', 38431), + ('\u{1128e}', 38432), + ('\u{1128f}', 38433), + ('\u{1129e}', 38434), + ('\u{1129f}', 38435), + ('\u{112a9}', 38436), + ('\u{112aa}', 38437), + ('\u{112b0}', 38438), + ('\u{112eb}', 38439), + ('\u{112f0}', 38440), + ('\u{112fa}', 38441), + ('\u{11300}', 38442), + ('\u{11304}', 38443), + ('\u{11305}', 38444), + ('\u{1130d}', 38445), + ('\u{1130f}', 38446), + ('\u{11311}', 38447), + ('\u{11313}', 38448), + ('\u{11329}', 38449), + ('\u{1132a}', 38450), + ('\u{11331}', 38451), + ('\u{11332}', 38452), + ('\u{11334}', 38453), + ('\u{11335}', 38454), + ('\u{1133a}', 38455), + ('\u{1133b}', 38456), + ('\u{11345}', 38457), + ('\u{11347}', 38458), + ('\u{11349}', 38459), + ('\u{1134b}', 38460), + ('\u{1134e}', 38461), + ('\u{11350}', 38462), + ('\u{11351}', 38463), + ('\u{11357}', 38464), + ('\u{11358}', 38465), + ('\u{1135d}', 38466), + ('\u{11364}', 38467), + ('\u{11366}', 38468), + ('\u{1136d}', 38469), + ('\u{11370}', 38470), + ('\u{11375}', 38471), + ('\u{11400}', 38472), + ('\u{1144b}', 38473), + ('\u{11450}', 38474), + ('\u{1145a}', 38475), + ('\u{1145c}', 5708), + ('\u{1145e}', 38478), + ('\u{11462}', 38479), + ('\u{11480}', 38480), + ('\u{114c6}', 5713), + ('\u{114c8}', 38483), + ('\u{114d0}', 38484), + ('\u{114da}', 38485), + ('\u{11580}', 38486), + ('\u{115b6}', 38487), + ('\u{115b8}', 38488), + ('\u{115c1}', 38489), + ('\u{115d8}', 38490), + ('\u{115de}', 38491), + ('\u{11600}', 38492), + ('\u{11641}', 38493), + ('\u{11644}', 38494), + ('\u{11645}', 38495), + ('\u{11650}', 38496), + ('\u{1165a}', 38497), + ('\u{11660}', 38498), + ('\u{1166d}', 38499), + ('\u{11680}', 38500), + ('\u{116b9}', 38501), + ('\u{116c0}', 38502), + ('\u{116ca}', 38503), + ('\u{11700}', 38504), + ('\u{1171b}', 38505), + ('\u{1171d}', 38506), + ('\u{1172c}', 38507), + ('\u{11730}', 38508), + ('\u{1173a}', 38509), + ('\u{11740}', 38510), + ('\u{11800}', 38511), + ('\u{1183b}', 38512), + ('\u{1183c}', 38513), + ('\u{118a0}', 5746), + ('\u{118c0}', 38546), + ('\u{118ea}', 38547), + ('\u{118f3}', 38548), + ('\u{118ff}', 38549), + ('\u{11907}', 38550), + ('\u{11909}', 38551), + ('\u{1190a}', 38552), + ('\u{1190c}', 38553), + ('\u{11914}', 38554), + ('\u{11915}', 38555), + ('\u{11917}', 38556), + ('\u{11918}', 38557), + ('\u{11936}', 38558), + ('\u{11937}', 38559), + ('\u{11939}', 38560), + ('\u{1193b}', 38561), + ('\u{11944}', 38562), + ('\u{11947}', 38563), + ('\u{11950}', 38564), + ('\u{1195a}', 38565), + ('\u{119a0}', 38566), + ('\u{119a8}', 38567), + ('\u{119aa}', 38568), + ('\u{119d8}', 38569), + ('\u{119da}', 38570), + ('\u{119e2}', 38571), + ('\u{119e3}', 38572), + ('\u{119e5}', 38573), + ('\u{11a00}', 38574), + ('\u{11a3f}', 38575), + ('\u{11a47}', 38576), + ('\u{11a48}', 38577), + ('\u{11a50}', 38578), + ('\u{11a9a}', 38579), + ('\u{11a9d}', 38580), + ('\u{11a9e}', 38581), + ('\u{11aa3}', 38582), + ('\u{11ac0}', 38583), + ('\u{11af9}', 38584), + ('\u{11c00}', 38585), + ('\u{11c09}', 38586), + ('\u{11c0a}', 38587), + ('\u{11c37}', 38588), + ('\u{11c38}', 38589), + ('\u{11c41}', 38590), + ('\u{11c46}', 38591), + ('\u{11c50}', 38592), + ('\u{11c5a}', 38593), + ('\u{11c6d}', 38594), + ('\u{11c70}', 38595), + ('\u{11c72}', 38596), + ('\u{11c90}', 38597), + ('\u{11c92}', 38598), + ('\u{11ca8}', 38599), + ('\u{11ca9}', 38600), + ('\u{11cb7}', 38601), + ('\u{11d00}', 38602), + ('\u{11d07}', 38603), + ('\u{11d08}', 38604), + ('\u{11d0a}', 38605), + ('\u{11d0b}', 38606), + ('\u{11d37}', 38607), + ('\u{11d3a}', 5840), + ('\u{11d3c}', 38610), + ('\u{11d3e}', 38611), + ('\u{11d3f}', 38612), + ('\u{11d48}', 38613), + ('\u{11d50}', 38614), + ('\u{11d5a}', 38615), + ('\u{11d60}', 38616), + ('\u{11d66}', 38617), + ('\u{11d67}', 38618), + ('\u{11d69}', 38619), + ('\u{11d6a}', 38620), + ('\u{11d8f}', 38621), + ('\u{11d90}', 38622), + ('\u{11d92}', 38623), + ('\u{11d93}', 38624), + ('\u{11d99}', 38625), + ('\u{11da0}', 38626), + ('\u{11daa}', 38627), + ('\u{11ee0}', 38628), + ('\u{11ef7}', 38629), + ('\u{11ef9}', 38630), + ('\u{11fb0}', 38631), + ('\u{11fb1}', 38632), + ('\u{11fc0}', 38633), + ('\u{11ff2}', 38634), + ('\u{11fff}', 38635), + ('\u{12000}', 38636), + ('\u{1239a}', 38637), + ('\u{12400}', 38638), + ('\u{1246f}', 38639), + ('\u{12470}', 38640), + ('\u{12475}', 38641), + ('\u{12480}', 38642), + ('\u{12544}', 38643), + ('\u{13000}', 38644), + ('\u{1342f}', 38645), + ('\u{14400}', 38646), + ('\u{14647}', 38647), + ('\u{16800}', 38648), + ('\u{16a39}', 38649), + ('\u{16a40}', 38650), + ('\u{16a5f}', 38651), + ('\u{16a60}', 38652), + ('\u{16a6a}', 38653), + ('\u{16a6e}', 38654), + ('\u{16a70}', 38655), + ('\u{16ad0}', 38656), + ('\u{16aee}', 38657), + ('\u{16af0}', 38658), + ('\u{16af5}', 38659), + ('\u{16af6}', 38660), + ('\u{16b00}', 38661), + ('\u{16b37}', 38662), + ('\u{16b40}', 38663), + ('\u{16b44}', 38664), + ('\u{16b46}', 38665), + ('\u{16b50}', 38666), + ('\u{16b5a}', 38667), + ('\u{16b5b}', 38668), + ('\u{16b62}', 38669), + ('\u{16b63}', 38670), + ('\u{16b78}', 38671), + ('\u{16b7d}', 38672), + ('\u{16b90}', 38673), + ('\u{16e40}', 5906), + ('\u{16e60}', 38706), + ('\u{16e80}', 38707), + ('\u{16e9b}', 38708), + ('\u{16f00}', 38709), + ('\u{16f4b}', 38710), + ('\u{16f4f}', 38711), + ('\u{16f88}', 38712), + ('\u{16f8f}', 38713), + ('\u{16fa0}', 38714), + ('\u{16fe0}', 38715), + ('\u{16fe2}', 38716), + ('\u{16fe3}', 38717), + ('\u{16fe5}', 38718), + ('\u{16ff0}', 38719), + ('\u{16ff2}', 38720), + ('\u{17000}', 38721), + ('\u{187f8}', 38722), + ('\u{18800}', 38723), + ('\u{18cd6}', 38724), + ('\u{18d00}', 38725), + ('\u{18d09}', 38726), + ('\u{1b000}', 38727), + ('\u{1b11f}', 38728), + ('\u{1b150}', 38729), + ('\u{1b153}', 38730), + ('\u{1b164}', 38731), + ('\u{1b168}', 38732), + ('\u{1b170}', 38733), + ('\u{1b2fc}', 38734), + ('\u{1bc00}', 38735), + ('\u{1bc6b}', 38736), + ('\u{1bc70}', 38737), + ('\u{1bc7d}', 38738), + ('\u{1bc80}', 38739), + ('\u{1bc89}', 38740), + ('\u{1bc90}', 38741), + ('\u{1bc9a}', 38742), + ('\u{1bc9c}', 38743), + ('\u{1bc9d}', 38744), + ('\u{1bc9f}', 38745), + ('\u{1bca0}', 38746), + ('\u{1bca4}', 38747), + ('\u{1d000}', 38748), + ('\u{1d0f6}', 38749), + ('\u{1d100}', 38750), + ('\u{1d127}', 38751), + ('\u{1d129}', 38752), + ('\u{1d15e}', 5985), + ('\u{1d165}', 38760), + ('\u{1d173}', 38761), + ('\u{1d17b}', 38762), + ('\u{1d1bb}', 5995), + ('\u{1d1c1}', 38769), + ('\u{1d1e9}', 38770), + ('\u{1d200}', 38771), + ('\u{1d246}', 38772), + ('\u{1d2e0}', 38773), + ('\u{1d2f4}', 38774), + ('\u{1d300}', 38775), + ('\u{1d357}', 38776), + ('\u{1d360}', 38777), + ('\u{1d379}', 38778), + ('\u{1d400}', 6011), + ('\u{1d4a0}', 38939), + ('\u{1d4a2}', 38940), + ('\u{1d4a3}', 38941), + ('\u{1d4a5}', 6174), + ('\u{1d4a7}', 38944), + ('\u{1d4a9}', 6177), + ('\u{1d50b}', 39043), + ('\u{1d50d}', 6276), + ('\u{1d547}', 39102), + ('\u{1d54a}', 6335), + ('\u{1d6a6}', 39451), + ('\u{1d6a8}', 6684), + ('\u{1d6d3}', 39495), + ('\u{1d6d5}', 6728), + ('\u{1d70d}', 39552), + ('\u{1d70f}', 6785), + ('\u{1d747}', 39609), + ('\u{1d749}', 6842), + ('\u{1d781}', 39666), + ('\u{1d783}', 6899), + ('\u{1d7bb}', 39723), + ('\u{1d7bd}', 6956), + ('\u{1d7ca}', 39737), + ('\u{1d7cc}', 39738), + ('\u{1d7ce}', 6971), + ('\u{1d800}', 39789), + ('\u{1da00}', 39790), + ('\u{1da37}', 39791), + ('\u{1da3b}', 39792), + ('\u{1da6d}', 39793), + ('\u{1da75}', 39794), + ('\u{1da76}', 39795), + ('\u{1da84}', 39796), + ('\u{1da85}', 39797), + ('\u{1da8c}', 39798), + ('\u{1da9b}', 39799), + ('\u{1daa0}', 39800), + ('\u{1daa1}', 39801), + ('\u{1dab0}', 39802), + ('\u{1e000}', 39803), + ('\u{1e007}', 39804), + ('\u{1e008}', 39805), + ('\u{1e019}', 39806), + ('\u{1e01b}', 39807), + ('\u{1e022}', 39808), + ('\u{1e023}', 39809), + ('\u{1e025}', 39810), + ('\u{1e026}', 39811), + ('\u{1e02b}', 39812), + ('\u{1e100}', 39813), + ('\u{1e12d}', 39814), + ('\u{1e130}', 39815), + ('\u{1e13e}', 39816), + ('\u{1e140}', 39817), + ('\u{1e14a}', 39818), + ('\u{1e14e}', 7051), + ('\u{1e150}', 39821), + ('\u{1e2c0}', 39822), + ('\u{1e2fa}', 39823), + ('\u{1e2ff}', 39824), + ('\u{1e300}', 39825), + ('\u{1e800}', 39826), + ('\u{1e8c5}', 39827), + ('\u{1e8c7}', 39828), + ('\u{1e8d0}', 39829), + ('\u{1e8d7}', 39830), + ('\u{1e900}', 7063), + ('\u{1e922}', 39865), + ('\u{1e94c}', 39866), + ('\u{1e950}', 39867), + ('\u{1e95a}', 39868), + ('\u{1e95e}', 39869), + ('\u{1e960}', 39870), + ('\u{1ec71}', 39871), + ('\u{1ecb5}', 39872), + ('\u{1ed01}', 39873), + ('\u{1ed3e}', 39874), + ('\u{1ee00}', 7107), + ('\u{1ee25}', 39912), + ('\u{1ee27}', 7145), + ('\u{1ee3c}', 39934), + ('\u{1ee42}', 39935), + ('\u{1ee43}', 39936), + ('\u{1ee47}', 7169), + ('\u{1ee55}', 39951), + ('\u{1ee57}', 7184), + ('\u{1ee65}', 39966), + ('\u{1ee67}', 7199), + ('\u{1ee9c}', 40020), + ('\u{1eea1}', 7253), + ('\u{1eebc}', 40048), + ('\u{1eef0}', 40049), + ('\u{1eef2}', 40050), + ('\u{1f000}', 40051), + ('\u{1f02c}', 40052), + ('\u{1f030}', 40053), + ('\u{1f094}', 40054), + ('\u{1f0a0}', 40055), + ('\u{1f0af}', 40056), + ('\u{1f0b1}', 40057), + ('\u{1f0c0}', 40058), + ('\u{1f0c1}', 40059), + ('\u{1f0d0}', 40060), + ('\u{1f0d1}', 40061), + ('\u{1f0f6}', 40062), + ('\u{1f101}', 7295), + ('\u{1f10b}', 40073), + ('\u{1f110}', 7306), + ('\u{1f150}', 40138), + ('\u{1f16a}', 7371), + ('\u{1f16d}', 40142), + ('\u{1f190}', 40143), + ('\u{1f191}', 40144), + ('\u{1f1ae}', 40145), + ('\u{1f1e6}', 40146), + ('\u{1f200}', 7379), + ('\u{1f203}', 40150), + ('\u{1f210}', 7383), + ('\u{1f23c}', 40195), + ('\u{1f240}', 7428), + ('\u{1f249}', 40205), + ('\u{1f250}', 7438), + ('\u{1f252}', 40208), + ('\u{1f260}', 40209), + ('\u{1f266}', 40210), + ('\u{1f300}', 40211), + ('\u{1f6d8}', 40212), + ('\u{1f6e0}', 40213), + ('\u{1f6ed}', 40214), + ('\u{1f6f0}', 40215), + ('\u{1f6fd}', 40216), + ('\u{1f700}', 40217), + ('\u{1f774}', 40218), + ('\u{1f780}', 40219), + ('\u{1f7d9}', 40220), + ('\u{1f7e0}', 40221), + ('\u{1f7ec}', 40222), + ('\u{1f800}', 40223), + ('\u{1f80c}', 40224), + ('\u{1f810}', 40225), + ('\u{1f848}', 40226), + ('\u{1f850}', 40227), + ('\u{1f85a}', 40228), + ('\u{1f860}', 40229), + ('\u{1f888}', 40230), + ('\u{1f890}', 40231), + ('\u{1f8ae}', 40232), + ('\u{1f8b0}', 40233), + ('\u{1f8b2}', 40234), + ('\u{1f900}', 40235), + ('\u{1f979}', 40236), + ('\u{1f97a}', 40237), + ('\u{1f9cc}', 40238), + ('\u{1f9cd}', 40239), + ('\u{1fa54}', 40240), + ('\u{1fa60}', 40241), + ('\u{1fa6e}', 40242), + ('\u{1fa70}', 40243), + ('\u{1fa75}', 40244), + ('\u{1fa78}', 40245), + ('\u{1fa7b}', 40246), + ('\u{1fa80}', 40247), + ('\u{1fa87}', 40248), + ('\u{1fa90}', 40249), + ('\u{1faa9}', 40250), + ('\u{1fab0}', 40251), + ('\u{1fab7}', 40252), + ('\u{1fac0}', 40253), + ('\u{1fac3}', 40254), + ('\u{1fad0}', 40255), + ('\u{1fad7}', 40256), + ('\u{1fb00}', 40257), + ('\u{1fb93}', 40258), + ('\u{1fb94}', 40259), + ('\u{1fbcb}', 40260), + ('\u{1fbf0}', 7493), + ('\u{1fbfa}', 40271), + ('\u{20000}', 40272), + ('\u{2a6de}', 40273), + ('\u{2a700}', 40274), + ('\u{2b735}', 40275), + ('\u{2b740}', 40276), + ('\u{2b81e}', 40277), + ('\u{2b820}', 40278), + ('\u{2cea2}', 40279), + ('\u{2ceb0}', 40280), + ('\u{2ebe1}', 40281), + ('\u{2f800}', 7514), + ('\u{2f831}', 40331), + ('\u{2f834}', 7564), + ('\u{2f845}', 40349), + ('\u{2f847}', 7582), + ('\u{2f86a}', 40385), + ('\u{2f86c}', 7618), + ('\u{2f891}', 40423), + ('\u{2f893}', 40424), + ('\u{2f894}', 40425), + ('\u{2f896}', 7658), + ('\u{2f92c}', 40576), + ('\u{2f92e}', 7809), + ('\u{2f946}', 40601), + ('\u{2f948}', 7834), + ('\u{2f95d}', 40623), + ('\u{2f95f}', 7856), + ('\u{2f9fe}', 40783), + ('\u{2fa00}', 8016), + ('\u{2fa1e}', 40814), + ('\u{30000}', 40815), + ('\u{3134b}', 40816), + ('\u{e0100}', 40817), + ('\u{e01f0}', 40818), ]; -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] = &[ +static MAPPING_TABLE: &[Mapping] = &[ DisallowedStd3Valid, Valid, DisallowedStd3Valid, @@ -3207,28 +1930,29 @@ static MAPPING_TABLE: &'static [Mapping] = &[ DisallowedStd3Valid, Disallowed, DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 0, byte_len: 1 }), - Valid, + DisallowedIdna2008, DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 0, byte_len: 3 }), - Valid, + DisallowedIdna2008, Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), - Valid, + DisallowedIdna2008, Ignored, - Valid, + DisallowedIdna2008, DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 0, byte_len: 3 }), - Valid, + DisallowedIdna2008, 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 }), + DisallowedIdna2008, 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, + DisallowedIdna2008, 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, + DisallowedIdna2008, 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 }), @@ -3252,7 +1976,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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, + DisallowedIdna2008, 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 }), @@ -3262,6 +1986,8 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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, + DisallowedIdna2008, + 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 }), @@ -3576,18 +2302,26 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, 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, + DisallowedIdna2008, 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 }), + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, 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 }), @@ -3694,7 +2428,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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, + DisallowedIdna2008, 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 }), @@ -3786,6 +2520,9 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 2, byte_len: 2 }), Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, 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 }), @@ -3992,45 +2729,69 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 3, byte_len: 2 }), Disallowed, Valid, - Disallowed, + DisallowedIdna2008, Valid, Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 3, byte_len: 4 }), - Disallowed, Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, Disallowed, Valid, Disallowed, + DisallowedIdna2008, Valid, + DisallowedIdna2008, Disallowed, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, 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, + DisallowedIdna2008, Valid, Disallowed, + DisallowedIdna2008, Valid, - Disallowed, + DisallowedIdna2008, Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, + DisallowedIdna2008, + Valid, + Disallowed, + DisallowedIdna2008, Disallowed, Valid, Disallowed, + DisallowedIdna2008, + Disallowed, Valid, Disallowed, Valid, @@ -4049,6 +2810,10 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, Disallowed, @@ -4077,6 +2842,10 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, Disallowed, @@ -4114,6 +2883,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 4, byte_len: 6 }), Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, @@ -4140,6 +2910,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, @@ -4171,8 +2942,9 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, - Disallowed, + DisallowedIdna2008, Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, @@ -4205,6 +2977,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, @@ -4228,8 +3001,9 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Disallowed, Valid, Disallowed, + DisallowedIdna2008, Valid, - Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, @@ -4265,12 +3039,15 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, - Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, Disallowed, @@ -4295,14 +3072,17 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 4, byte_len: 6 }), Valid, Disallowed, + DisallowedIdna2008, Valid, - Disallowed, + DisallowedIdna2008, Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, @@ -4315,7 +3095,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, - Disallowed, + Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 4, byte_len: 6 }), Valid, Disallowed, Valid, @@ -4325,25 +3105,26 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, - Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 4, byte_len: 6 }), - 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, - Disallowed, + DisallowedIdna2008, Valid, - Disallowed, + Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 4, byte_len: 3 }), + DisallowedIdna2008, Valid, - Disallowed, + DisallowedIdna2008, 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 }), + DisallowedIdna2008, Valid, - Disallowed, + DisallowedIdna2008, Valid, - Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 4, byte_len: 3 }), + DisallowedIdna2008, + Valid, + DisallowedIdna2008, Valid, Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 4, byte_len: 6 }), Valid, @@ -4371,6 +3152,8 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 4, byte_len: 6 }), Valid, + DisallowedIdna2008, + Valid, Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 4, byte_len: 6 }), Valid, Disallowed, @@ -4386,20 +3169,28 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 4, byte_len: 6 }), Valid, Disallowed, + DisallowedIdna2008, Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, 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, + DisallowedIdna2008, Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 4, byte_len: 3 }), Valid, + DisallowedIdna2008, Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, @@ -4433,8 +3224,10 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, @@ -4445,14 +3238,16 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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, + DisallowedIdna2008, Valid, - Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, - Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, @@ -4460,6 +3255,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, @@ -4472,10 +3268,18 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, - Disallowed, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, Valid, Disallowed, Valid, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, Ignored, Disallowed, Valid, @@ -4492,8 +3296,9 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Disallowed, Valid, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, @@ -4503,9 +3308,12 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, + DisallowedIdna2008, Valid, Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, @@ -4514,21 +3322,31 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Disallowed, Valid, Disallowed, + DisallowedIdna2008, Valid, + DisallowedIdna2008, Disallowed, Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, + DisallowedIdna2008, Valid, Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, + DisallowedIdna2008, 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 }), @@ -4538,9 +3356,58 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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, + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 5, byte_len: 3 }), + 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: 36, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 4, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 5, byte_len: 3 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 5, byte_len: 3 }), + DisallowedIdna2008, Disallowed, Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 0, byte_len: 1 }), @@ -4567,15 +3434,15 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 156, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 160, 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: 163, 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 }), @@ -4583,15 +3450,15 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 165, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 168, 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: 171, 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: 174, 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 }), @@ -4609,136 +3476,46 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 177, 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: 179, 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: 163, 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: 181, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 185, 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: 187, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 5, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 203, 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: 205, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 207, 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: 209, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 211, 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: 213, 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: 215, 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: 218, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 220, 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 }), @@ -4800,9 +3577,6 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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, @@ -4893,6 +3667,9 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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 }), + Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 6, byte_len: 3 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 0, byte_len: 2 }), Valid, Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 6, byte_len: 3 }), Valid, @@ -4901,67 +3678,157 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 6, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 6, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 6, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 6, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 6, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 6, byte_len: 3 }), + Valid, 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 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 6, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 6, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 6, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 6, byte_len: 3 }), + Valid, 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 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 6, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 6, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 6, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 7, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 7, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 7, byte_len: 3 }), + Valid, 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 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 7, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 7, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 7, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 7, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 7, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 7, byte_len: 3 }), + Valid, 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 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 7, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 7, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 7, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 7, byte_len: 3 }), + Valid, 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, + Valid, Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 7, byte_len: 3 }), - Disallowed, + Valid, Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 7, byte_len: 3 }), - Disallowed, + Valid, 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 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 7, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 7, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 7, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 7, byte_len: 3 }), + Valid, 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 }), + Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 7, byte_len: 3 }), + Valid, + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 7, byte_len: 3 }), + Disallowed, + Valid, + Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 7, byte_len: 3 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 7, byte_len: 3 }), + Valid, + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 7, byte_len: 3 }), + Disallowed, + Valid, + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 7, byte_len: 3 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 7, byte_len: 3 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 7, byte_len: 3 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 7, byte_len: 3 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 7, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 7, byte_len: 3 }), Valid, Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 2, byte_len: 2 }), Valid, @@ -4977,188 +3844,188 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 226, byte_start_hi: 7, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 7, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 7, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 7, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 7, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 7, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 7, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 7, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 7, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 7, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 7, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 7, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 8, byte_len: 5 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 8, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 8, byte_len: 4 }), + Disallowed, + Valid, + Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 8, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 8, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 8, 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: 95, byte_start_hi: 8, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 8, 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 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 8, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 8, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 8, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 137, 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: 141, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 146, 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: 149, 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 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 8, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 8, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 8, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 8, byte_len: 5 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 8, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 167, 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: 169, byte_start_hi: 8, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 8, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 175, 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 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 8, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 8, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 8, byte_len: 5 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 8, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 193, 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: 195, byte_start_hi: 8, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 8, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 201, 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 }), + Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 8, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 207, 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 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 212, 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 }), + Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 8, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 222, 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: 226, byte_start_hi: 8, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 231, 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: 234, 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 }), + Mapped(StringTableSlice { byte_start_lo: 218, 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 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 237, 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 }), + Deviation(StringTableSlice { byte_start_lo: 240, 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, + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 8, byte_len: 3 }), + DisallowedIdna2008, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 8, byte_len: 3 }), + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, 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, + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 8, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 8, byte_len: 9 }), + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 9, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 9, byte_len: 9 }), + DisallowedIdna2008, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 9, byte_len: 2 }), + DisallowedIdna2008, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 9, byte_len: 3 }), + DisallowedIdna2008, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 9, byte_len: 2 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 9, byte_len: 2 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 9, byte_len: 2 }), + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 9, byte_len: 12 }), + DisallowedIdna2008, 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: 43, byte_start_hi: 9, 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: 44, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 9, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 9, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 9, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 9, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 9, 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: 9, 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 }), + Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 9, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 9, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 9, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 9, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 9, 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 }), @@ -5174,210 +4041,213 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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, + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 9, byte_len: 2 }), + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, 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 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 9, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 9, 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: 65, byte_start_hi: 9, byte_len: 3 }), + DisallowedIdna2008, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 9, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 9, 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 }), + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 9, 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, + DisallowedIdna2008, 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: 77, byte_start_hi: 9, byte_len: 2 }), + DisallowedIdna2008, 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, + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 9, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 9, byte_len: 2 }), + DisallowedIdna2008, Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Valid, + DisallowedIdna2008, Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 2, byte_len: 2 }), - Valid, + DisallowedIdna2008, Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 0, byte_len: 1 }), - Valid, + DisallowedIdna2008, 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, + DisallowedIdna2008, 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: 86, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 9, 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 }), + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 9, 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: 97, byte_start_hi: 9, byte_len: 3 }), + DisallowedIdna2008, 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 }), + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 9, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 9, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 9, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 9, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 9, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 9, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 9, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 9, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 9, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 9, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 9, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 9, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 9, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 9, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 9, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 176, 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: 180, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 9, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 185, 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: 187, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 9, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 9, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 196, 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: 198, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 200, 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: 180, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 9, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 185, 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: 187, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 9, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 9, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 196, 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: 198, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 200, 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, + DisallowedIdna2008, Disallowed, Valid, - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 9, byte_len: 5 }), - Valid, + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 9, byte_len: 5 }), + DisallowedIdna2008, 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, + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 9, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 9, byte_len: 9 }), + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 9, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 9, byte_len: 9 }), + DisallowedIdna2008, DisallowedStd3Valid, - Valid, + DisallowedIdna2008, 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, + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 9, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 9, byte_len: 3 }), + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, 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: 44, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 10, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 10, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 10, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 10, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 10, byte_len: 2 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 10, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 10, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 10, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 10, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 10, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 10, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 10, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 10, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 10, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 10, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 10, byte_len: 4 }), + Disallowed, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 156, 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 }), @@ -5430,209 +4300,204 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 43, byte_start_hi: 9, byte_len: 1 }), + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 10, byte_len: 12 }), + DisallowedIdna2008, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 10, byte_len: 2 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 10, byte_len: 3 }), + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 10, byte_len: 5 }), + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, 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 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 11, byte_len: 3 }), + Disallowed, + Valid, + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 11, byte_len: 3 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 11, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 11, byte_len: 2 }), 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 }), + Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 11, 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 }), + Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 5, byte_len: 2 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 11, 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 }), + Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 11, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 11, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 11, byte_len: 3 }), + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 11, byte_len: 3 }), Valid, - Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 11, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 11, byte_len: 3 }), Valid, Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, @@ -5641,8 +4506,8 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Disallowed, Valid, Disallowed, - Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 11, byte_len: 3 }), - Valid, + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 12, byte_len: 3 }), + DisallowedIdna2008, Disallowed, Valid, Disallowed, @@ -5663,59 +4528,17 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, - Disallowed, + DisallowedIdna2008, Valid, + DisallowedIdna2008, 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 }), + DisallowedIdna2008, 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 }), + DisallowedIdna2008, Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 12, byte_len: 3 }), + DisallowedIdna2008, Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 12, byte_len: 3 }), + Disallowed, 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 }), @@ -5885,30 +4708,16 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 5, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 14, byte_len: 3 }), 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 }), @@ -5944,23 +4753,43 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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 }), + Disallowed, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 0, byte_len: 1 }), + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 14, byte_len: 1 }), + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 14, byte_len: 3 }), + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 14, byte_len: 3 }), + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Disallowed, + Valid, + Disallowed, + Valid, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 14, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 14, byte_len: 4 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 14, byte_len: 6 }), + DisallowedIdna2008, + Valid, + Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 14, byte_len: 6 }), + Disallowed, + Valid, + Disallowed, 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 }), @@ -6003,86 +4832,104 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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 }), + Disallowed, 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, + Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 15, byte_len: 3 }), + Disallowed, + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 10, 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: 193, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 12, byte_len: 3 }), Valid, + DisallowedIdna2008, 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: 233, byte_start_hi: 15, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 15, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 15, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 15, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 15, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 16, byte_len: 8 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 16, byte_len: 8 }), + Disallowed, 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 }), @@ -6092,554 +4939,484 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 16, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 17, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 17, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 17, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 17, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 17, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 17, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 17, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 17, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 17, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 17, byte_len: 5 }), 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: 208, byte_start_hi: 12, byte_len: 3 }), Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 17, byte_len: 3 }), + DisallowedIdna2008, 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: 64, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 170, 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: 188, 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: 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: 230, 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: 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: 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: 112, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 17, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 17, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 17, byte_len: 3 }), + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 10, 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: 193, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 79, 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: 9, 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: 232, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 13, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 103, 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: 163, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 17, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 18, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 18, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 18, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 18, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 18, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 18, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 18, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 18, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 18, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 18, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 18, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 18, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 18, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 18, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 18, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 18, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 18, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 18, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 18, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 18, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 18, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 18, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 18, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 18, byte_len: 2 }), + 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: 88, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 18, byte_len: 6 }), 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: 241, byte_start_hi: 18, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 18, byte_len: 12 }), 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: 30, byte_start_hi: 19, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 19, byte_len: 9 }), 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: 63, byte_start_hi: 19, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 19, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 19, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 19, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 19, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 19, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 19, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 19, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 19, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 19, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 19, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 19, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 19, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 19, byte_len: 15 }), + Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 19, byte_len: 18 }), + Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 19, byte_len: 15 }), + Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 19, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 19, byte_len: 15 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 20, byte_len: 15 }), + Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 20, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 20, byte_len: 9 }), 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: 50, byte_start_hi: 20, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 20, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 20, byte_len: 15 }), + Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 20, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 20, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 20, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 20, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 20, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 20, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 20, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 20, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 20, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 20, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 20, byte_len: 15 }), + Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 20, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 20, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 20, byte_len: 15 }), + Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 20, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 20, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 20, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 20, byte_len: 15 }), + Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 20, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 21, byte_len: 15 }), 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: 34, byte_start_hi: 21, byte_len: 15 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 21, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 21, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 21, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 21, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 21, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 21, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 21, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 21, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 21, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 21, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 21, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 21, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 21, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 21, byte_len: 9 }), 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: 184, byte_start_hi: 21, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 21, byte_len: 15 }), + Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 21, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 21, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 21, byte_len: 15 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 21, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 21, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 22, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 22, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 22, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 22, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 22, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 22, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 22, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 22, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 22, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 22, byte_len: 15 }), + Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 22, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 22, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 22, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 22, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 22, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 22, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 22, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 22, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 22, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 22, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 22, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 22, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 22, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 22, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 22, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 22, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 22, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 22, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 22, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 22, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 22, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 22, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 22, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 22, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 22, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 22, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 22, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 22, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 22, byte_len: 2 }), 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: 238, byte_start_hi: 22, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 22, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 22, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 22, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 22, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 22, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 23, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 23, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 23, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 23, byte_len: 12 }), 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: 34, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 37, 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: 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: 50, byte_start_hi: 23, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 23, byte_len: 3 }), 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: 66, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 23, byte_len: 2 }), 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: 98, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 23, byte_len: 3 }), 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: 112, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 23, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 23, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 23, byte_len: 7 }), + Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 23, byte_len: 8 }), + Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 23, byte_len: 3 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 23, byte_len: 6 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 234, 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: 236, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 23, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 23, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 23, byte_len: 2 }), 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 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 24, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 24, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 24, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 24, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 24, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 24, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 24, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 24, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 24, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 24, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 24, byte_len: 3 }), Valid, - Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, Disallowed, - Valid, + DisallowedIdna2008, 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 }), + DisallowedIdna2008, 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 }), + DisallowedIdna2008, 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 }), @@ -6650,6 +5427,8 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Mapped(StringTableSlice { byte_start_lo: 170, 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: 173, byte_start_hi: 24, byte_len: 3 }), Valid, Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 24, byte_len: 3 }), @@ -6684,6 +5463,10 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 24, byte_len: 3 }), Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + 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 }), @@ -6694,13 +5477,12 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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 }), + Valid, 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 }), @@ -6713,8 +5495,16 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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 }), + 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, + DisallowedIdna2008, Valid, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, 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 }), @@ -6739,1338 +5529,1477 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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, + Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 25, byte_len: 3 }), 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, + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 25, 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, + Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 25, byte_len: 3 }), Valid, - Disallowed, + Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 25, byte_len: 3 }), Valid, - Disallowed, + Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 25, byte_len: 3 }), 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 }), + Valid, 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 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 25, byte_len: 3 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 25, byte_len: 3 }), + Valid, 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 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 25, byte_len: 3 }), + Valid, + DisallowedIdna2008, Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 25, byte_len: 3 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 5, byte_len: 2 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 25, byte_len: 3 }), + Valid, 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 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 1, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 5, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 25, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 5, byte_len: 2 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 25, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 25, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 5, byte_len: 2 }), 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 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 25, byte_len: 3 }), + Valid, + Disallowed, Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 25, byte_len: 3 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 25, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 5, byte_len: 2 }), 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 }), + Valid, Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 25, byte_len: 3 }), + Valid, + Disallowed, 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, + 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, + DisallowedIdna2008, + Valid, + Disallowed, + DisallowedIdna2008, + Disallowed, + Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Valid, + Disallowed, + DisallowedIdna2008, Disallowed, Valid, + DisallowedIdna2008, 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 }), + Valid, + Disallowed, + DisallowedIdna2008, + Valid, + Disallowed, + Valid, + Disallowed, + Valid, + Disallowed, + Valid, + Disallowed, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Valid, + Disallowed, + Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Valid, + Disallowed, + Valid, + Disallowed, + Valid, + Disallowed, + Valid, + Disallowed, + Valid, + Disallowed, + Valid, + Disallowed, + Valid, + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 16, 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: 72, byte_start_hi: 11, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 25, byte_len: 3 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 25, byte_len: 2 }), + DisallowedIdna2008, + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 25, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 25, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 25, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 25, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 25, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 25, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 26, byte_len: 3 }), + Valid, + DisallowedIdna2008, + Valid, + Disallowed, + Valid, + Disallowed, + Valid, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 13, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 26, 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 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 13, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 13, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 66, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 72, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 216, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 222, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 252, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 2, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 8, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 14, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 13, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 13, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 13, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 13, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 29, byte_len: 3 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 29, byte_len: 3 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 29, byte_len: 3 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 13, 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: 239, byte_start_hi: 29, byte_len: 3 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 29, byte_len: 3 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 29, byte_len: 3 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 30, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 30, byte_len: 3 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 52, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 31, byte_len: 3 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 31, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 31, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 31, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 31, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 31, byte_len: 4 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 31, byte_len: 4 }), + Valid, + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 31, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 86, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 9, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 31, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 31, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 31, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 31, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 31, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 31, byte_len: 2 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 31, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 31, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 31, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 32, byte_len: 4 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 32, byte_len: 4 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 32, byte_len: 4 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 32, byte_len: 4 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 32, byte_len: 4 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 32, byte_len: 2 }), + DisallowedIdna2008, + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 32, 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, + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 34, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 34, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 34, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 34, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 34, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 34, byte_len: 5 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 34, byte_len: 5 }), + Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 32, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 34, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 34, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 34, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 34, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 35, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 33, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 35, byte_len: 4 }), + DisallowedIdna2008, + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 36, byte_len: 6 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 83, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 36, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 35, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 37, byte_len: 6 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 37, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 37, byte_len: 8 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 37, byte_len: 8 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 37, byte_len: 8 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 37, byte_len: 8 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 37, byte_len: 8 }), + Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 37, byte_len: 8 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 37, byte_len: 8 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 37, byte_len: 6 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 37, byte_len: 33 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 38, byte_len: 15 }), + Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 38, byte_len: 8 }), + DisallowedIdna2008, 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 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 38, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 38, byte_len: 3 }), Disallowed, - DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 37, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 38, 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 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 38, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 38, byte_len: 3 }), + Disallowed, + Valid, + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 38, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 9, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 9, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 38, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 38, byte_len: 3 }), + 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: 72, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 9, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 9, 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 }), + DisallowedIdna2008, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 9, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 38, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 38, 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 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 38, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 38, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 9, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 9, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 38, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 38, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 9, byte_len: 1 }), + Disallowed, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 38, byte_len: 1 }), + Disallowed, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 38, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 38, byte_len: 3 }), + Valid, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 38, byte_len: 3 }), + Disallowed, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 38, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 38, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 38, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 38, byte_len: 4 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 38, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 38, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 38, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 38, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 229, 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 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 9, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 9, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 9, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 38, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 38, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 14, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 38, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 9, 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 }), + Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 9, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 38, 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 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 9, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 38, 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 }), @@ -8097,12 +7026,12 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 212, 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 }), @@ -8129,147 +7058,147 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 38, byte_len: 1 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 38, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 14, byte_len: 1 }), 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 }), + Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 38, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 39, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 39, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 39, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 39, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 39, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 39, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 39, 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 }), + Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 154, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 160, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 163, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 18, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 39, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 39, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 39, 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 }), + 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 }), + Disallowed, + 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 }), + Disallowed, + 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 }), + Disallowed, + 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, + 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 }), 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 }), + Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 39, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 39, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 39, 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 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 39, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 39, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 39, 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 }), + Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 39, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 39, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 39, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 39, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 56, byte_start_hi: 39, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 39, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 62, byte_start_hi: 39, byte_len: 3 }), Disallowed, Valid, Disallowed, @@ -8285,10 +7214,17 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Disallowed, Valid, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, @@ -8296,105 +7232,114 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, Valid, Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 39, byte_len: 4 }), Valid, Disallowed, Valid, Disallowed, + Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 39, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 40, byte_len: 4 }), + 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 }), + DisallowedIdna2008, Disallowed, Valid, Disallowed, @@ -8414,20 +7359,33 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Disallowed, Valid, Disallowed, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, Valid, Disallowed, + DisallowedIdna2008, + Disallowed, Valid, Disallowed, Valid, Disallowed, + DisallowedIdna2008, Valid, + DisallowedIdna2008, Disallowed, + DisallowedIdna2008, Valid, Disallowed, + DisallowedIdna2008, + Disallowed, Valid, Disallowed, + DisallowedIdna2008, Valid, + DisallowedIdna2008, Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, @@ -8441,96 +7399,128 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, + DisallowedIdna2008, + Disallowed, + Valid, + DisallowedIdna2008, Valid, + DisallowedIdna2008, Disallowed, Valid, + DisallowedIdna2008, + Valid, + Disallowed, + DisallowedIdna2008, Disallowed, Valid, Disallowed, + DisallowedIdna2008, Valid, Disallowed, + DisallowedIdna2008, Valid, Disallowed, + DisallowedIdna2008, Valid, Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, Valid, Disallowed, + Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 40, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 41, byte_len: 4 }), + Disallowed, Valid, Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, Disallowed, + DisallowedIdna2008, + Disallowed, Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, + DisallowedIdna2008, 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 }), + Valid, + DisallowedIdna2008, Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, Disallowed, Valid, Disallowed, @@ -8539,14 +7529,29 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, Disallowed, Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, Disallowed, @@ -8557,6 +7562,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, @@ -8593,21 +7599,33 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, Disallowed, Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, Disallowed, + DisallowedIdna2008, + Disallowed, Valid, Disallowed, Valid, @@ -8617,10 +7635,45 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, + DisallowedIdna2008, Disallowed, + Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 157, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 41, byte_len: 4 }), Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, @@ -8635,39 +7688,8 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, 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, @@ -8675,10 +7697,17 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, @@ -8687,9 +7716,12 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, + DisallowedIdna2008, Disallowed, + DisallowedIdna2008, Valid, Disallowed, Valid, @@ -8723,11 +7755,19 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, Valid, Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, Valid, Disallowed, Valid, @@ -8740,19 +7780,60 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Disallowed, Valid, Disallowed, + DisallowedIdna2008, + Disallowed, Valid, Disallowed, Valid, + DisallowedIdna2008, Disallowed, Valid, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, + DisallowedIdna2008, + Disallowed, Valid, Disallowed, Valid, Disallowed, + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 41, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 17, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 29, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 53, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 42, byte_len: 4 }), Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, @@ -8761,6 +7842,8 @@ static MAPPING_TABLE: &'static [Mapping] = &[ Valid, Disallowed, Valid, + DisallowedIdna2008, + Valid, Disallowed, Valid, Disallowed, @@ -8769,36 +7852,58 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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 }), + Disallowed, 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 }), + Disallowed, Valid, Disallowed, Valid, Disallowed, Valid, Disallowed, + DisallowedIdna2008, Valid, + DisallowedIdna2008, + Ignored, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 42, byte_len: 8 }), + Mapped(StringTableSlice { byte_start_lo: 69, byte_start_hi: 42, byte_len: 8 }), + Mapped(StringTableSlice { byte_start_lo: 77, byte_start_hi: 42, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 89, byte_start_hi: 42, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 42, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 42, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 42, byte_len: 12 }), + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 42, byte_len: 8 }), + Mapped(StringTableSlice { byte_start_lo: 145, byte_start_hi: 42, byte_len: 8 }), + Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 42, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 42, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 42, byte_len: 12 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 42, byte_len: 12 }), + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, 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 }), @@ -9470,8 +8575,8 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 42, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 42, 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 }), @@ -9498,7 +8603,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 205, byte_start_hi: 42, 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 }), @@ -9523,7 +8628,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 208, byte_start_hi: 42, 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 }), @@ -9555,7 +8660,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 205, byte_start_hi: 42, 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 }), @@ -9580,7 +8685,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 208, byte_start_hi: 42, 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 }), @@ -9612,7 +8717,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 205, byte_start_hi: 42, 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 }), @@ -9637,7 +8742,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 208, byte_start_hi: 42, 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 }), @@ -9669,7 +8774,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 205, byte_start_hi: 42, 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 }), @@ -9694,7 +8799,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 208, byte_start_hi: 42, 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 }), @@ -9726,7 +8831,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 205, byte_start_hi: 42, 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 }), @@ -9751,7 +8856,7 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 208, byte_start_hi: 42, 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 }), @@ -9760,61 +8865,65 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 9, 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: 44, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 9, 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: 44, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 9, 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: 44, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 9, 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: 44, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 9, 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: 44, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 9, byte_len: 1 }), + DisallowedIdna2008, Valid, - Disallowed, + DisallowedIdna2008, Valid, - Disallowed, + DisallowedIdna2008, + Valid, + DisallowedIdna2008, Valid, + DisallowedIdna2008, Disallowed, Valid, Disallowed, @@ -9830,278 +8939,299 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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 }), + Valid, + DisallowedIdna2008, 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 }), + Valid, 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 }), + DisallowedIdna2008, Disallowed, - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 38, byte_len: 2 }), + Valid, Disallowed, - Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 37, byte_len: 2 }), + DisallowedIdna2008, + Valid, 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 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 255, byte_start_hi: 42, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 7, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 11, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 23, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 27, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 59, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 43, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 75, byte_start_hi: 43, byte_len: 4 }), + 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: 4 }), + Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 43, byte_len: 4 }), + Valid, Disallowed, - Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 42, byte_len: 2 }), + Valid, 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 }), + DisallowedIdna2008, Disallowed, - Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 38, byte_len: 2 }), + DisallowedIdna2008, 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 }), + DisallowedIdna2008, 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 }), + Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 175, 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: 213, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 43, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 32, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 43, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 43, 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: 161, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 151, byte_start_hi: 32, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 43, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 43, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 43, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 213, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 38, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 38, byte_len: 2 }), + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 43, byte_len: 2 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 43, byte_len: 2 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 43, byte_len: 2 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 43, byte_len: 2 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 43, byte_len: 2 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 43, byte_len: 2 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 43, byte_len: 2 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 43, byte_len: 2 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 43, byte_len: 2 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 43, byte_len: 2 }), + DisallowedIdna2008, + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 96, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 99, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 102, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 105, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 138, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 144, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 147, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 150, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 10, byte_len: 3 }), + DisallowedStd3Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 10, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 43, 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: 205, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 43, byte_len: 2 }), + DisallowedIdna2008, 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 }), @@ -10128,120 +9258,145 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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: 126, byte_start_hi: 43, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 23, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 43, 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 }), + Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 43, byte_len: 2 }), + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 135, byte_start_hi: 43, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 43, byte_len: 2 }), + Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 43, byte_len: 2 }), + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 141, byte_start_hi: 43, byte_len: 2 }), + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 43, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 43, byte_len: 6 }), + Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 18, byte_len: 3 }), Disallowed, - Valid, - Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 42, byte_len: 2 }), - Valid, + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 12, 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: 3 }), + Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 176, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 13, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 193, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 15, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 219, byte_start_hi: 13, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 166, byte_start_hi: 17, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 43, byte_len: 3 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 43, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 44, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 44, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 44, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 44, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 44, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 44, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 44, byte_len: 9 }), + Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 44, byte_len: 9 }), 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 }), + 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 }), 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 }), + DisallowedIdna2008, 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 }), + DisallowedIdna2008, 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 }), + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, Disallowed, - Valid, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + DisallowedIdna2008, + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 9, 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: 44, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 46, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 9, byte_len: 1 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 9, byte_len: 1 }), Disallowed, Valid, Disallowed, @@ -10251,544 +9406,548 @@ static MAPPING_TABLE: &'static [Mapping] = &[ 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 }), + Valid, 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: 79, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 44, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 44, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 30, 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: 123, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 44, byte_len: 4 }), 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: 185, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 44, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 44, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 43, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 44, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 205, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 208, byte_start_hi: 44, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 233, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 236, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 239, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 242, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 245, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 248, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 44, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 4, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 30, byte_len: 3 }), 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: 170, byte_start_hi: 29, 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: 37, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 45, byte_len: 4 }), 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: 164, byte_start_hi: 43, 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: 59, byte_start_hi: 45, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 45, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 82, byte_start_hi: 45, byte_len: 3 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 45, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 45, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 45, byte_len: 3 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 120, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 123, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 126, byte_start_hi: 45, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 45, byte_len: 4 }), 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: 140, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 164, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 167, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 170, byte_start_hi: 45, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 177, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 180, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 45, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 172, byte_start_hi: 12, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 45, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 197, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 200, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 45, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 45, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 211, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 229, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 232, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 49, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 45, byte_len: 4 }), 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: 245, byte_start_hi: 30, 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: 55, byte_start_hi: 30, 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: 7, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 10, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 251, byte_start_hi: 26, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 46, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 38, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 41, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 44, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 50, byte_start_hi: 46, byte_len: 4 }), 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: 78, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 46, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 109, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 118, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 79, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 13, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 46, byte_len: 3 }), 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: 133, byte_start_hi: 46, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 46, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 153, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 174, byte_start_hi: 46, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 178, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 181, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 184, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 187, byte_start_hi: 46, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 191, byte_start_hi: 46, byte_len: 3 }), 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: 27, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 203, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 46, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 46, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 46, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 46, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 225, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 228, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 20, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 249, byte_start_hi: 46, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 46, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 47, byte_len: 3 }), 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: 6, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 16, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 19, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 22, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 26, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 30, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 33, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 25, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 42, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 45, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 48, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 61, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 65, byte_start_hi: 47, byte_len: 3 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 68, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 47, byte_len: 4 }), 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: 84, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 92, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 98, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 101, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 110, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 113, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 116, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 129, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 132, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 47, byte_len: 3 }), 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: 151, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 158, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 55, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 161, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 169, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 173, byte_start_hi: 47, byte_len: 4 }), 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: 180, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 58, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 148, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 189, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 196, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 210, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 29, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 214, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 112, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 220, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 223, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 226, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 230, byte_start_hi: 47, byte_len: 4 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 47, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 254, byte_start_hi: 47, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 48, byte_len: 3 }), 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: 29, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 32, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 35, byte_start_hi: 48, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 39, byte_start_hi: 48, byte_len: 4 }), 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: 57, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 30, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 63, byte_start_hi: 48, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 48, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 71, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 74, byte_start_hi: 48, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 78, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 81, byte_start_hi: 48, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 88, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 91, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 94, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 48, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 48, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 48, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 48, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 45, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 119, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 125, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 128, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 131, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 134, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 137, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 140, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 143, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 48, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 36, byte_start_hi: 28, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 156, byte_start_hi: 48, byte_len: 3 }), 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: 139, byte_start_hi: 30, 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: 180, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 183, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 48, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 190, byte_start_hi: 48, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 194, byte_start_hi: 48, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 198, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 201, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 204, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 48, byte_len: 3 }), 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: 214, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 217, byte_start_hi: 48, byte_len: 4 }), 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 }), + Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 48, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 48, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 235, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 238, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 115, byte_start_hi: 27, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 241, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 244, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 247, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 48, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 0, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 85, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 3, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 6, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 49, byte_len: 3 }), + Disallowed, + Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 186, byte_start_hi: 13, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 28, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 31, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 34, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 37, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 40, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 43, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 47, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 51, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 54, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 57, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 103, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 207, byte_start_hi: 13, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 60, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 64, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 67, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 70, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 73, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 76, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 80, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 84, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 87, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 90, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 93, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 97, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 106, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 100, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 104, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 108, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 111, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 114, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 117, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 121, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 130, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 133, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 136, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 139, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 142, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 146, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 149, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 152, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 155, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 159, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 162, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 165, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 168, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 171, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 175, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 179, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 182, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 185, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 188, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 192, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 195, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 124, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 199, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 202, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 206, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 209, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 212, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 215, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 218, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 221, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 224, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 227, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 127, byte_start_hi: 31, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 231, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 234, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 237, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 240, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 243, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 246, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 250, byte_start_hi: 49, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 253, byte_start_hi: 49, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 1, byte_start_hi: 50, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 5, byte_start_hi: 50, byte_len: 4 }), + Mapped(StringTableSlice { byte_start_lo: 95, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 9, byte_start_hi: 50, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 107, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 12, byte_start_hi: 50, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 15, byte_start_hi: 50, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 18, byte_start_hi: 50, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 21, byte_start_hi: 50, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 122, byte_start_hi: 14, byte_len: 3 }), + Mapped(StringTableSlice { byte_start_lo: 24, byte_start_hi: 50, byte_len: 4 }), + Disallowed, + Valid, Disallowed, Ignored, Disallowed, ]; -static STRING_TABLE: &'static str = "\u{61}\ +static STRING_TABLE: &str = "\u{61}\ \u{62}\ \u{63}\ \u{64}\ @@ -11419,6 +10578,51 @@ static STRING_TABLE: &'static str = "\u{61}\ \u{13f4}\ \u{13f5}\ \u{a64b}\ + \u{10d0}\ + \u{10d1}\ + \u{10d2}\ + \u{10d3}\ + \u{10d4}\ + \u{10d5}\ + \u{10d6}\ + \u{10d7}\ + \u{10d8}\ + \u{10d9}\ + \u{10da}\ + \u{10db}\ + \u{10dd}\ + \u{10de}\ + \u{10df}\ + \u{10e0}\ + \u{10e1}\ + \u{10e2}\ + \u{10e3}\ + \u{10e4}\ + \u{10e5}\ + \u{10e6}\ + \u{10e7}\ + \u{10e8}\ + \u{10e9}\ + \u{10ea}\ + \u{10eb}\ + \u{10ec}\ + \u{10ed}\ + \u{10ee}\ + \u{10ef}\ + \u{10f0}\ + \u{10f1}\ + \u{10f2}\ + \u{10f3}\ + \u{10f4}\ + \u{10f5}\ + \u{10f6}\ + \u{10f7}\ + \u{10f8}\ + \u{10f9}\ + \u{10fa}\ + \u{10fd}\ + \u{10fe}\ + \u{10ff}\ \u{250}\ \u{251}\ \u{1d02}\ @@ -12932,6 +12136,8 @@ static STRING_TABLE: &'static str = "\u{61}\ \u{30f0}\ \u{30f1}\ \u{30f2}\ + \u{4ee4}\ + \u{548c}\ \u{30a2}\ \u{30d1}\ \u{30fc}\ @@ -13734,8 +12940,19 @@ static STRING_TABLE: &'static str = "\u{61}\ \u{ab53}\ \u{a7b5}\ \u{a7b7}\ + \u{a7b9}\ + \u{a7bb}\ + \u{a7bd}\ + \u{a7bf}\ + \u{a7c3}\ + \u{a794}\ + \u{1d8e}\ + \u{a7c8}\ + \u{a7ca}\ + \u{a7f6}\ \u{ab37}\ \u{ab52}\ + \u{28d}\ \u{13a0}\ \u{13a1}\ \u{13a2}\ @@ -15362,6 +14579,38 @@ static STRING_TABLE: &'static str = "\u{61}\ \u{118dd}\ \u{118de}\ \u{118df}\ + \u{16e60}\ + \u{16e61}\ + \u{16e62}\ + \u{16e63}\ + \u{16e64}\ + \u{16e65}\ + \u{16e66}\ + \u{16e67}\ + \u{16e68}\ + \u{16e69}\ + \u{16e6a}\ + \u{16e6b}\ + \u{16e6c}\ + \u{16e6d}\ + \u{16e6e}\ + \u{16e6f}\ + \u{16e70}\ + \u{16e71}\ + \u{16e72}\ + \u{16e73}\ + \u{16e74}\ + \u{16e75}\ + \u{16e76}\ + \u{16e77}\ + \u{16e78}\ + \u{16e79}\ + \u{16e7a}\ + \u{16e7b}\ + \u{16e7c}\ + \u{16e7d}\ + \u{16e7e}\ + \u{16e7f}\ \u{1d157}\ \u{1d165}\ \u{1d158}\ @@ -15476,6 +14725,8 @@ static STRING_TABLE: &'static str = "\u{61}\ \u{63}\ \u{6d}\ \u{64}\ + \u{6d}\ + \u{72}\ \u{64}\ \u{6a}\ \u{307b}\ diff --git a/vendor/idna/tests/IdnaTest.txt b/vendor/idna/tests/IdnaTest.txt deleted file mode 100644 index 123a1f0617..0000000000 --- a/vendor/idna/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/tests/IdnaTestV2.txt b/vendor/idna/tests/IdnaTestV2.txt new file mode 100644 index 0000000000..28c5b64e0e --- /dev/null +++ b/vendor/idna/tests/IdnaTestV2.txt @@ -0,0 +1,6334 @@ +# IdnaTestV2.txt +# Date: 2019-11-07, 13:47:27 GMT +# © 2019 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 for UTS #46 +# Version: 13.0.0 +# +# For documentation and usage, see http://www.unicode.org/reports/tr46 +# +# Test cases for verifying UTS #46 conformance. +# +# FORMAT: +# +# This file is in UTF-8, where characters may be escaped using the \uXXXX or \x{XXXX} +# convention where they could otherwise have a confusing display. +# These characters include control codes and combining marks. +# +# 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: source - The source string to be tested +# Column 2: toUnicode - The result of applying toUnicode to the source, +# with Transitional_Processing=false. +# A blank value means the same as the source value. +# Column 3: toUnicodeStatus - A set of status codes, each corresponding to a particular test. +# A blank value means [] (no errors). +# Column 4: toAsciiN - The result of applying toASCII to the source, +# with Transitional_Processing=false. +# A blank value means the same as the toUnicode value. +# Column 5: toAsciiNStatus - A set of status codes, each corresponding to a particular test. +# A blank value means the same as the toUnicodeStatus value. +# An explicit [] means no errors. +# Column 6: toAsciiT - The result of applying toASCII to the source, +# with Transitional_Processing=true. +# A blank value means the same as the toAsciiN value. +# Column 7: toAsciiTStatus - A set of status codes, each corresponding to a particular test. +# A blank value means the same as the toAsciiNStatus value. +# An explicit [] means no errors. +# +# The line comments currently show visible characters that have been escaped. +# +# CONFORMANCE: +# +# To test for conformance to UTS #46, an implementation will perform the toUnicode, toAsciiN, and +# toAsciiT operations on the source string, then verify the resulting strings and relevant status +# values. +# +# If the implementation converts illegal code points into U+FFFD (as per +# http://www.unicode.org/reports/tr46/proposed.html#Processing) then the string comparisons need to +# account for that by treating U+FFFD in the actual value as a wildcard when comparing to the +# expected value in the test file. +# +# A status in toUnicode, toAsciiN or toAsciiT is indicated by a value in square brackets, +# such as "[B5 B6]". In such a case, the contents is a list of status codes based on the step +# numbers in UTS #46 and IDNA2008, with the following formats. +# +# Pn for Section 4 Processing step n +# Vn for 4.1 Validity Criteria step n +# U1 for UseSTD3ASCIIRules +# An for 4.2 ToASCII step n +# Bn for Bidi (in IDNA2008) +# Cn for ContextJ (in IDNA2008) +# Xn for toUnicode issues (see below) +# +# Thus C1 = Appendix A.1. ZERO WIDTH NON-JOINER, and C2 = Appendix A.2. ZERO WIDTH JOINER. +# (The CONTEXTO tests are optional for client software, and not tested here.) +# +# Implementations that allow values of particular input flags to be false would ignore +# the corresponding status codes listed in the table below when testing for errors. +# +# VerifyDnsLength: P4 +# CheckHyphens: V2, V3 +# CheckBidi: V8 +# CheckJoiners: V7 +# UseSTD3ASCIIRules: U1 +# +# Implementations may be more strict than the default settings for UTS #46. +# In particular, an implementation conformant to IDNA2008 would disallow the input for lines +# marked with NV8. +# +# Implementations need only record that there is an error: they need not reproduce the +# precise status codes (after removing the ignored status values). +# +# Compatibility errors +# +# The special error codes X3 and X4_2 are now returned where a toASCII error code +# was formerly being generated in toUnicode due to an empty label. +# +# A3 was being generated in the following cases (in addition to its normal usage). +# • an empty label in toUnicode. In this case, it is replaced by X3. +# +# A4_2 was being generated in the following case (in addition to its normal usage). +# • an empty label in V8 (CheckBidi). In this case, it is being replaced by X4_2. +# ============================================================================================ +fass.de; ; ; ; ; ; # fass.de +faß.de; ; ; xn--fa-hia.de; ; fass.de; # faß.de +Faß.de; faß.de; ; xn--fa-hia.de; ; fass.de; # faß.de +xn--fa-hia.de; faß.de; ; xn--fa-hia.de; ; ; # faß.de + +# BIDI TESTS + +àא; ; [B5, B6]; xn--0ca24w; ; ; # àא +àא; àא; [B5, B6]; xn--0ca24w; ; ; # àא +Àא; àא; [B5, B6]; xn--0ca24w; ; ; # àא +Àא; àא; [B5, B6]; xn--0ca24w; ; ; # àא +xn--0ca24w; àא; [B5, B6]; xn--0ca24w; ; ; # àא +0à.א; ; [B1]; xn--0-sfa.xn--4db; ; ; # 0à.א +0à.א; 0à.א; [B1]; xn--0-sfa.xn--4db; ; ; # 0à.א +0À.א; 0à.א; [B1]; xn--0-sfa.xn--4db; ; ; # 0à.א +0À.א; 0à.א; [B1]; xn--0-sfa.xn--4db; ; ; # 0à.א +xn--0-sfa.xn--4db; 0à.א; [B1]; xn--0-sfa.xn--4db; ; ; # 0à.א +à.א̈; ; ; xn--0ca.xn--ssa73l; ; ; # à.א̈ +à.א̈; à.א̈; ; xn--0ca.xn--ssa73l; ; ; # à.א̈ +À.א̈; à.א̈; ; xn--0ca.xn--ssa73l; ; ; # à.א̈ +À.א̈; à.א̈; ; xn--0ca.xn--ssa73l; ; ; # à.א̈ +xn--0ca.xn--ssa73l; à.א̈; ; xn--0ca.xn--ssa73l; ; ; # à.א̈ +à.א0٠א; ; [B4]; xn--0ca.xn--0-zhcb98c; ; ; # à.א0٠א +à.א0٠א; à.א0٠א; [B4]; xn--0ca.xn--0-zhcb98c; ; ; # à.א0٠א +À.א0٠א; à.א0٠א; [B4]; xn--0ca.xn--0-zhcb98c; ; ; # à.א0٠א +À.א0٠א; à.א0٠א; [B4]; xn--0ca.xn--0-zhcb98c; ; ; # à.א0٠א +xn--0ca.xn--0-zhcb98c; à.א0٠א; [B4]; xn--0ca.xn--0-zhcb98c; ; ; # à.א0٠א +̈.א; ; [B1, B3, B6, V5]; xn--ssa.xn--4db; ; ; # ̈.א +xn--ssa.xn--4db; ̈.א; [B1, B3, B6, V5]; xn--ssa.xn--4db; ; ; # ̈.א +à.א0٠; ; [B4]; xn--0ca.xn--0-zhc74b; ; ; # à.א0٠ +à.א0٠; à.א0٠; [B4]; xn--0ca.xn--0-zhc74b; ; ; # à.א0٠ +À.א0٠; à.א0٠; [B4]; xn--0ca.xn--0-zhc74b; ; ; # à.א0٠ +À.א0٠; à.א0٠; [B4]; xn--0ca.xn--0-zhc74b; ; ; # à.א0٠ +xn--0ca.xn--0-zhc74b; à.א0٠; [B4]; xn--0ca.xn--0-zhc74b; ; ; # à.א0٠ +àˇ.א; ; [B6]; xn--0ca88g.xn--4db; ; ; # àˇ.א +àˇ.א; àˇ.א; [B6]; xn--0ca88g.xn--4db; ; ; # àˇ.א +Àˇ.א; àˇ.א; [B6]; xn--0ca88g.xn--4db; ; ; # àˇ.א +Àˇ.א; àˇ.א; [B6]; xn--0ca88g.xn--4db; ; ; # àˇ.א +xn--0ca88g.xn--4db; àˇ.א; [B6]; xn--0ca88g.xn--4db; ; ; # àˇ.א +à̈.א; ; ; xn--0ca81i.xn--4db; ; ; # à̈.א +à̈.א; à̈.א; ; xn--0ca81i.xn--4db; ; ; # à̈.א +À̈.א; à̈.א; ; xn--0ca81i.xn--4db; ; ; # à̈.א +À̈.א; à̈.א; ; xn--0ca81i.xn--4db; ; ; # à̈.א +xn--0ca81i.xn--4db; à̈.א; ; xn--0ca81i.xn--4db; ; ; # à̈.א + +# CONTEXT TESTS + +a‌b; ; [C1]; xn--ab-j1t; ; ab; [] # ab +A‌B; a‌b; [C1]; xn--ab-j1t; ; ab; [] # ab +A‌b; a‌b; [C1]; xn--ab-j1t; ; ab; [] # ab +ab; ; ; ; ; ; # ab +xn--ab-j1t; a‌b; [C1]; xn--ab-j1t; ; ; # ab +a्‌b; ; ; xn--ab-fsf604u; ; xn--ab-fsf; # a्b +A्‌B; a्‌b; ; xn--ab-fsf604u; ; xn--ab-fsf; # a्b +A्‌b; a्‌b; ; xn--ab-fsf604u; ; xn--ab-fsf; # a्b +xn--ab-fsf; a्b; ; xn--ab-fsf; ; ; # a्b +a्b; ; ; xn--ab-fsf; ; ; # a्b +A्B; a्b; ; xn--ab-fsf; ; ; # a्b +A्b; a्b; ; xn--ab-fsf; ; ; # a्b +xn--ab-fsf604u; a्‌b; ; xn--ab-fsf604u; ; ; # a्b +̈‌̈بb; ; [B1, C1, V5]; xn--b-bcba413a2w8b; ; xn--b-bcba413a; [B1, V5] # ̈̈بb +̈‌̈بB; ̈‌̈بb; [B1, C1, V5]; xn--b-bcba413a2w8b; ; xn--b-bcba413a; [B1, V5] # ̈̈بb +xn--b-bcba413a; ̈̈بb; [B1, V5]; xn--b-bcba413a; ; ; # ̈̈بb +xn--b-bcba413a2w8b; ̈‌̈بb; [B1, C1, V5]; xn--b-bcba413a2w8b; ; ; # ̈̈بb +aب̈‌̈; ; [B5, B6, C1]; xn--a-ccba213a5w8b; ; xn--a-ccba213a; [B5, B6] # aب̈̈ +Aب̈‌̈; aب̈‌̈; [B5, B6, C1]; xn--a-ccba213a5w8b; ; xn--a-ccba213a; [B5, B6] # aب̈̈ +xn--a-ccba213a; aب̈̈; [B5, B6]; xn--a-ccba213a; ; ; # aب̈̈ +xn--a-ccba213a5w8b; aب̈‌̈; [B5, B6, C1]; xn--a-ccba213a5w8b; ; ; # aب̈̈ +aب̈‌̈بb; ; [B5]; xn--ab-uuba211bca8057b; ; xn--ab-uuba211bca; # aب̈̈بb +Aب̈‌̈بB; aب̈‌̈بb; [B5]; xn--ab-uuba211bca8057b; ; xn--ab-uuba211bca; # aب̈̈بb +Aب̈‌̈بb; aب̈‌̈بb; [B5]; xn--ab-uuba211bca8057b; ; xn--ab-uuba211bca; # aب̈̈بb +xn--ab-uuba211bca; aب̈̈بb; [B5]; xn--ab-uuba211bca; ; ; # aب̈̈بb +xn--ab-uuba211bca8057b; aب̈‌̈بb; [B5]; xn--ab-uuba211bca8057b; ; ; # aب̈̈بb +a‍b; ; [C2]; xn--ab-m1t; ; ab; [] # ab +A‍B; a‍b; [C2]; xn--ab-m1t; ; ab; [] # ab +A‍b; a‍b; [C2]; xn--ab-m1t; ; ab; [] # ab +xn--ab-m1t; a‍b; [C2]; xn--ab-m1t; ; ; # ab +a्‍b; ; ; xn--ab-fsf014u; ; xn--ab-fsf; # a्b +A्‍B; a्‍b; ; xn--ab-fsf014u; ; xn--ab-fsf; # a्b +A्‍b; a्‍b; ; xn--ab-fsf014u; ; xn--ab-fsf; # a्b +xn--ab-fsf014u; a्‍b; ; xn--ab-fsf014u; ; ; # a्b +̈‍̈بb; ; [B1, C2, V5]; xn--b-bcba413a7w8b; ; xn--b-bcba413a; [B1, V5] # ̈̈بb +̈‍̈بB; ̈‍̈بb; [B1, C2, V5]; xn--b-bcba413a7w8b; ; xn--b-bcba413a; [B1, V5] # ̈̈بb +xn--b-bcba413a7w8b; ̈‍̈بb; [B1, C2, V5]; xn--b-bcba413a7w8b; ; ; # ̈̈بb +aب̈‍̈; ; [B5, B6, C2]; xn--a-ccba213abx8b; ; xn--a-ccba213a; [B5, B6] # aب̈̈ +Aب̈‍̈; aب̈‍̈; [B5, B6, C2]; xn--a-ccba213abx8b; ; xn--a-ccba213a; [B5, B6] # aب̈̈ +xn--a-ccba213abx8b; aب̈‍̈; [B5, B6, C2]; xn--a-ccba213abx8b; ; ; # aب̈̈ +aب̈‍̈بb; ; [B5, C2]; xn--ab-uuba211bca5157b; ; xn--ab-uuba211bca; [B5] # aب̈̈بb +Aب̈‍̈بB; aب̈‍̈بb; [B5, C2]; xn--ab-uuba211bca5157b; ; xn--ab-uuba211bca; [B5] # aب̈̈بb +Aب̈‍̈بb; aب̈‍̈بb; [B5, C2]; xn--ab-uuba211bca5157b; ; xn--ab-uuba211bca; [B5] # aب̈̈بb +xn--ab-uuba211bca5157b; aب̈‍̈بb; [B5, C2]; xn--ab-uuba211bca5157b; ; ; # aب̈̈بb + +# SELECTED TESTS + +¡; ; ; xn--7a; ; ; # ¡ +xn--7a; ¡; ; xn--7a; ; ; # ¡ +᧚; ; ; xn--pkf; ; ; # ᧚ +xn--pkf; ᧚; ; xn--pkf; ; ; # ᧚ +。; .; [X4_2]; ; [A4_2]; ; # . +.; ; [X4_2]; ; [A4_2]; ; # . +ꭠ; ; ; xn--3y9a; ; ; # ꭠ +xn--3y9a; ꭠ; ; xn--3y9a; ; ; # ꭠ +1234567890ä1234567890123456789012345678901234567890123456; ; ; xn--12345678901234567890123456789012345678901234567890123456-fxe; [A4_2]; ; # 1234567890ä1234567890123456789012345678901234567890123456 +1234567890ä1234567890123456789012345678901234567890123456; 1234567890ä1234567890123456789012345678901234567890123456; ; xn--12345678901234567890123456789012345678901234567890123456-fxe; [A4_2]; ; # 1234567890ä1234567890123456789012345678901234567890123456 +1234567890Ä1234567890123456789012345678901234567890123456; 1234567890ä1234567890123456789012345678901234567890123456; ; xn--12345678901234567890123456789012345678901234567890123456-fxe; [A4_2]; ; # 1234567890ä1234567890123456789012345678901234567890123456 +1234567890Ä1234567890123456789012345678901234567890123456; 1234567890ä1234567890123456789012345678901234567890123456; ; xn--12345678901234567890123456789012345678901234567890123456-fxe; [A4_2]; ; # 1234567890ä1234567890123456789012345678901234567890123456 +xn--12345678901234567890123456789012345678901234567890123456-fxe; 1234567890ä1234567890123456789012345678901234567890123456; ; xn--12345678901234567890123456789012345678901234567890123456-fxe; [A4_2]; ; # 1234567890ä1234567890123456789012345678901234567890123456 +www.eXample.cOm; www.example.com; ; ; ; ; # www.example.com +Bücher.de; bücher.de; ; xn--bcher-kva.de; ; ; # bücher.de +Bücher.de; bücher.de; ; xn--bcher-kva.de; ; ; # bücher.de +bücher.de; bücher.de; ; xn--bcher-kva.de; ; ; # bücher.de +bücher.de; ; ; xn--bcher-kva.de; ; ; # bücher.de +BÜCHER.DE; bücher.de; ; xn--bcher-kva.de; ; ; # bücher.de +BÜCHER.DE; bücher.de; ; xn--bcher-kva.de; ; ; # bücher.de +xn--bcher-kva.de; bücher.de; ; xn--bcher-kva.de; ; ; # bücher.de +ÖBB; öbb; ; xn--bb-eka; ; ; # öbb +ÖBB; öbb; ; xn--bb-eka; ; ; # öbb +öbb; öbb; ; xn--bb-eka; ; ; # öbb +öbb; ; ; xn--bb-eka; ; ; # öbb +Öbb; öbb; ; xn--bb-eka; ; ; # öbb +Öbb; öbb; ; xn--bb-eka; ; ; # öbb +xn--bb-eka; öbb; ; xn--bb-eka; ; ; # öbb +βόλος.com; ; ; xn--nxasmm1c.com; ; xn--nxasmq6b.com; # βόλος.com +βόλος.com; βόλος.com; ; xn--nxasmm1c.com; ; xn--nxasmq6b.com; # βόλος.com +ΒΌΛΟΣ.COM; βόλοσ.com; ; xn--nxasmq6b.com; ; ; # βόλοσ.com +ΒΌΛΟΣ.COM; βόλοσ.com; ; xn--nxasmq6b.com; ; ; # βόλοσ.com +βόλοσ.com; ; ; xn--nxasmq6b.com; ; ; # βόλοσ.com +βόλοσ.com; βόλοσ.com; ; xn--nxasmq6b.com; ; ; # βόλοσ.com +Βόλοσ.com; βόλοσ.com; ; xn--nxasmq6b.com; ; ; # βόλοσ.com +Βόλοσ.com; βόλοσ.com; ; xn--nxasmq6b.com; ; ; # βόλοσ.com +xn--nxasmq6b.com; βόλοσ.com; ; xn--nxasmq6b.com; ; ; # βόλοσ.com +Βόλος.com; βόλος.com; ; xn--nxasmm1c.com; ; xn--nxasmq6b.com; # βόλος.com +Βόλος.com; βόλος.com; ; xn--nxasmm1c.com; ; xn--nxasmq6b.com; # βόλος.com +xn--nxasmm1c.com; βόλος.com; ; xn--nxasmm1c.com; ; ; # βόλος.com +xn--nxasmm1c; βόλος; ; xn--nxasmm1c; ; ; # βόλος +βόλος; ; ; xn--nxasmm1c; ; xn--nxasmq6b; # βόλος +βόλος; βόλος; ; xn--nxasmm1c; ; xn--nxasmq6b; # βόλος +ΒΌΛΟΣ; βόλοσ; ; xn--nxasmq6b; ; ; # βόλοσ +ΒΌΛΟΣ; βόλοσ; ; xn--nxasmq6b; ; ; # βόλοσ +βόλοσ; ; ; xn--nxasmq6b; ; ; # βόλοσ +βόλοσ; βόλοσ; ; xn--nxasmq6b; ; ; # βόλοσ +Βόλοσ; βόλοσ; ; xn--nxasmq6b; ; ; # βόλοσ +Βόλοσ; βόλοσ; ; xn--nxasmq6b; ; ; # βόλοσ +xn--nxasmq6b; βόλοσ; ; xn--nxasmq6b; ; ; # βόλοσ +Βόλος; βόλος; ; xn--nxasmm1c; ; xn--nxasmq6b; # βόλος +Βόλος; βόλος; ; xn--nxasmm1c; ; xn--nxasmq6b; # βόλος +www.ශ්‍රී.com; ; ; www.xn--10cl1a0b660p.com; ; www.xn--10cl1a0b.com; # www.ශ්රී.com +WWW.ශ්‍රී.COM; www.ශ්‍රී.com; ; www.xn--10cl1a0b660p.com; ; www.xn--10cl1a0b.com; # www.ශ්රී.com +Www.ශ්‍රී.com; www.ශ්‍රී.com; ; www.xn--10cl1a0b660p.com; ; www.xn--10cl1a0b.com; # www.ශ්රී.com +www.xn--10cl1a0b.com; www.ශ්රී.com; ; www.xn--10cl1a0b.com; ; ; # www.ශ්රී.com +www.ශ්රී.com; ; ; www.xn--10cl1a0b.com; ; ; # www.ශ්රී.com +WWW.ශ්රී.COM; www.ශ්රී.com; ; www.xn--10cl1a0b.com; ; ; # www.ශ්රී.com +Www.ශ්රී.com; www.ශ්රී.com; ; www.xn--10cl1a0b.com; ; ; # www.ශ්රී.com +www.xn--10cl1a0b660p.com; www.ශ්‍රී.com; ; www.xn--10cl1a0b660p.com; ; ; # www.ශ්රී.com +نامه‌ای; ; ; xn--mgba3gch31f060k; ; xn--mgba3gch31f; # نامهای +xn--mgba3gch31f; نامهای; ; xn--mgba3gch31f; ; ; # نامهای +نامهای; ; ; xn--mgba3gch31f; ; ; # نامهای +xn--mgba3gch31f060k; نامه‌ای; ; xn--mgba3gch31f060k; ; ; # نامهای +xn--mgba3gch31f060k.com; نامه‌ای.com; ; xn--mgba3gch31f060k.com; ; ; # نامهای.com +نامه‌ای.com; ; ; xn--mgba3gch31f060k.com; ; xn--mgba3gch31f.com; # نامهای.com +نامه‌ای.COM; نامه‌ای.com; ; xn--mgba3gch31f060k.com; ; xn--mgba3gch31f.com; # نامهای.com +xn--mgba3gch31f.com; نامهای.com; ; xn--mgba3gch31f.com; ; ; # نامهای.com +نامهای.com; ; ; xn--mgba3gch31f.com; ; ; # نامهای.com +نامهای.COM; نامهای.com; ; xn--mgba3gch31f.com; ; ; # نامهای.com +a.b.c。d。; a.b.c.d.; ; ; ; ; # a.b.c.d. +a.b.c。d。; a.b.c.d.; ; ; ; ; # a.b.c.d. +A.B.C。D。; a.b.c.d.; ; ; ; ; # a.b.c.d. +A.b.c。D。; a.b.c.d.; ; ; ; ; # a.b.c.d. +a.b.c.d.; ; ; ; ; ; # a.b.c.d. +A.B.C。D。; a.b.c.d.; ; ; ; ; # a.b.c.d. +A.b.c。D。; a.b.c.d.; ; ; ; ; # a.b.c.d. +Ü.xn--tda; ü.ü; ; xn--tda.xn--tda; ; ; # ü.ü +Ü.xn--tda; ü.ü; ; xn--tda.xn--tda; ; ; # ü.ü +ü.xn--tda; ü.ü; ; xn--tda.xn--tda; ; ; # ü.ü +ü.xn--tda; ü.ü; ; xn--tda.xn--tda; ; ; # ü.ü +Ü.XN--TDA; ü.ü; ; xn--tda.xn--tda; ; ; # ü.ü +Ü.XN--TDA; ü.ü; ; xn--tda.xn--tda; ; ; # ü.ü +Ü.xn--Tda; ü.ü; ; xn--tda.xn--tda; ; ; # ü.ü +Ü.xn--Tda; ü.ü; ; xn--tda.xn--tda; ; ; # ü.ü +xn--tda.xn--tda; ü.ü; ; xn--tda.xn--tda; ; ; # ü.ü +ü.ü; ; ; xn--tda.xn--tda; ; ; # ü.ü +ü.ü; ü.ü; ; xn--tda.xn--tda; ; ; # ü.ü +Ü.Ü; ü.ü; ; xn--tda.xn--tda; ; ; # ü.ü +Ü.Ü; ü.ü; ; xn--tda.xn--tda; ; ; # ü.ü +Ü.ü; ü.ü; ; xn--tda.xn--tda; ; ; # ü.ü +Ü.ü; ü.ü; ; xn--tda.xn--tda; ; ; # ü.ü +xn--u-ccb; ü; [V1]; xn--u-ccb; ; ; # ü +a⒈com; ; [P1, V6]; xn--acom-0w1b; ; ; # a⒈com +a1.com; ; ; ; ; ; # a1.com +A⒈COM; a⒈com; [P1, V6]; xn--acom-0w1b; ; ; # a⒈com +A⒈Com; a⒈com; [P1, V6]; xn--acom-0w1b; ; ; # a⒈com +xn--acom-0w1b; a⒈com; [V6]; xn--acom-0w1b; ; ; # a⒈com +xn--a-ecp.ru; a⒈.ru; [V6]; xn--a-ecp.ru; ; ; # a⒈.ru +xn--0.pt; ; [P4]; ; ; ; # xn--0.pt +xn--a.pt; €.pt; [V6]; xn--a.pt; ; ; # .pt +xn--a-Ä.pt; xn--a-ä.pt; [P4]; xn--xn--a--gua.pt; ; ; # xn--a-ä.pt +xn--a-Ä.pt; xn--a-ä.pt; [P4]; xn--xn--a--gua.pt; ; ; # xn--a-ä.pt +xn--a-ä.pt; xn--a-ä.pt; [P4]; xn--xn--a--gua.pt; ; ; # xn--a-ä.pt +xn--a-ä.pt; ; [P4]; xn--xn--a--gua.pt; ; ; # xn--a-ä.pt +XN--A-Ä.PT; xn--a-ä.pt; [P4]; xn--xn--a--gua.pt; ; ; # xn--a-ä.pt +XN--A-Ä.PT; xn--a-ä.pt; [P4]; xn--xn--a--gua.pt; ; ; # xn--a-ä.pt +Xn--A-Ä.pt; xn--a-ä.pt; [P4]; xn--xn--a--gua.pt; ; ; # xn--a-ä.pt +Xn--A-Ä.pt; xn--a-ä.pt; [P4]; xn--xn--a--gua.pt; ; ; # xn--a-ä.pt +xn--xn--a--gua.pt; xn--a-ä.pt; [V2]; xn--xn--a--gua.pt; ; ; # xn--a-ä.pt +日本語。JP; 日本語.jp; ; xn--wgv71a119e.jp; ; ; # 日本語.jp +日本語。JP; 日本語.jp; ; xn--wgv71a119e.jp; ; ; # 日本語.jp +日本語。jp; 日本語.jp; ; xn--wgv71a119e.jp; ; ; # 日本語.jp +日本語。Jp; 日本語.jp; ; xn--wgv71a119e.jp; ; ; # 日本語.jp +xn--wgv71a119e.jp; 日本語.jp; ; xn--wgv71a119e.jp; ; ; # 日本語.jp +日本語.jp; ; ; xn--wgv71a119e.jp; ; ; # 日本語.jp +日本語.JP; 日本語.jp; ; xn--wgv71a119e.jp; ; ; # 日本語.jp +日本語.Jp; 日本語.jp; ; xn--wgv71a119e.jp; ; ; # 日本語.jp +日本語。jp; 日本語.jp; ; xn--wgv71a119e.jp; ; ; # 日本語.jp +日本語。Jp; 日本語.jp; ; xn--wgv71a119e.jp; ; ; # 日本語.jp +☕; ; ; xn--53h; ; ; # ☕ +xn--53h; ☕; ; xn--53h; ; ; # ☕ +1.aß‌‍b‌‍cßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß̂ßz; ; [C1, C2]; 1.xn--abcdexyz-qyacaaabaaaaaaabaaaaaaaaabaaaaaaaaabaaaaaaaa010ze2isb1140zba8cc; [C1, C2, A4_2]; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; [A4_2] # 1.aßbcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß̂ßz +1.ASS‌‍B‌‍CSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSŜSSZ; 1.ass‌‍b‌‍cssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1, C2]; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa69989dba9gc; [C1, C2, A4_2]; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; [A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz +1.ASS‌‍B‌‍CSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSŜSSZ; 1.ass‌‍b‌‍cssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1, C2]; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa69989dba9gc; [C1, C2, A4_2]; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; [A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz +1.ass‌‍b‌‍cssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; ; [C1, C2]; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa69989dba9gc; [C1, C2, A4_2]; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; [A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz +1.ass‌‍b‌‍cssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; 1.ass‌‍b‌‍cssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1, C2]; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa69989dba9gc; [C1, C2, A4_2]; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; [A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz +1.Ass‌‍b‌‍cssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; 1.ass‌‍b‌‍cssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1, C2]; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa69989dba9gc; [C1, C2, A4_2]; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; [A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz +1.Ass‌‍b‌‍cssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; 1.ass‌‍b‌‍cssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1, C2]; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa69989dba9gc; [C1, C2, A4_2]; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; [A4_2] # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz +1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; ; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; [A4_2]; ; # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz +1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; ; ; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; [A4_2]; ; # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz +1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; ; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; [A4_2]; ; # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz +1.ASSBCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSŜSSZ; 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; ; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; [A4_2]; ; # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz +1.ASSBCSSSSSSSSDΣΣSSSSSSSSSSSSSSSSESSSSSSSSSSSSSSSSSSSSXSSSSSSSSSSSSSSSSSSSSYSSSSSSSSSSSSSSSŜSSZ; 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; ; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; [A4_2]; ; # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz +1.Assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; ; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; [A4_2]; ; # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz +1.Assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; ; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; [A4_2]; ; # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz +1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa69989dba9gc; 1.ass‌‍b‌‍cssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz; [C1, C2]; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa69989dba9gc; [C1, C2, A4_2]; ; # 1.assbcssssssssdσσssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssŝssz +1.Aß‌‍b‌‍cßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß̂ßz; 1.aß‌‍b‌‍cßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß̂ßz; [C1, C2]; 1.xn--abcdexyz-qyacaaabaaaaaaabaaaaaaaaabaaaaaaaaabaaaaaaaa010ze2isb1140zba8cc; [C1, C2, A4_2]; 1.xn--assbcssssssssdssssssssssssssssessssssssssssssssssssxssssssssssssssssssssysssssssssssssssssz-pxq1419aa; [A4_2] # 1.aßbcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß̂ßz +1.xn--abcdexyz-qyacaaabaaaaaaabaaaaaaaaabaaaaaaaaabaaaaaaaa010ze2isb1140zba8cc; 1.aß‌‍b‌‍cßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß̂ßz; [C1, C2]; 1.xn--abcdexyz-qyacaaabaaaaaaabaaaaaaaaabaaaaaaaaabaaaaaaaa010ze2isb1140zba8cc; [C1, C2, A4_2]; ; # 1.aßbcßßßßdςσßßßßßßßßeßßßßßßßßßßxßßßßßßßßßßyßßßßßßßß̂ßz +‌x‍n‌-‍-bß; ; [C1, C2]; xn--xn--b-pqa5796ccahd; ; xn--bss; [] # xn--bß +‌X‍N‌-‍-BSS; ‌x‍n‌-‍-bss; [C1, C2]; xn--xn--bss-7z6ccid; ; xn--bss; [] # xn--bss +‌x‍n‌-‍-bss; ; [C1, C2]; xn--xn--bss-7z6ccid; ; xn--bss; [] # xn--bss +‌X‍n‌-‍-Bss; ‌x‍n‌-‍-bss; [C1, C2]; xn--xn--bss-7z6ccid; ; xn--bss; [] # xn--bss +xn--bss; 夙; ; xn--bss; ; ; # 夙 +夙; ; ; xn--bss; ; ; # 夙 +xn--xn--bss-7z6ccid; ‌x‍n‌-‍-bss; [C1, C2]; xn--xn--bss-7z6ccid; ; ; # xn--bss +‌X‍n‌-‍-Bß; ‌x‍n‌-‍-bß; [C1, C2]; xn--xn--b-pqa5796ccahd; ; xn--bss; [] # xn--bß +xn--xn--b-pqa5796ccahd; ‌x‍n‌-‍-bß; [C1, C2]; xn--xn--b-pqa5796ccahd; ; ; # xn--bß +ˣ͏ℕ​﹣­-᠌ℬ︀ſ⁤𝔰󠇯ffl; 夡夞夜夙; ; xn--bssffl; ; ; # 夡夞夜夙 +x͏N​-­-᠌B︀s⁤s󠇯ffl; 夡夞夜夙; ; xn--bssffl; ; ; # 夡夞夜夙 +x͏n​-­-᠌b︀s⁤s󠇯ffl; 夡夞夜夙; ; xn--bssffl; ; ; # 夡夞夜夙 +X͏N​-­-᠌B︀S⁤S󠇯FFL; 夡夞夜夙; ; xn--bssffl; ; ; # 夡夞夜夙 +X͏n​-­-᠌B︀s⁤s󠇯ffl; 夡夞夜夙; ; xn--bssffl; ; ; # 夡夞夜夙 +xn--bssffl; 夡夞夜夙; ; xn--bssffl; ; ; # 夡夞夜夙 +夡夞夜夙; ; ; xn--bssffl; ; ; # 夡夞夜夙 +ˣ͏ℕ​﹣­-᠌ℬ︀S⁤𝔰󠇯FFL; 夡夞夜夙; ; xn--bssffl; ; ; # 夡夞夜夙 +x͏N​-­-᠌B︀S⁤s󠇯FFL; 夡夞夜夙; ; xn--bssffl; ; ; # 夡夞夜夙 +ˣ͏ℕ​﹣­-᠌ℬ︀s⁤𝔰󠇯ffl; 夡夞夜夙; ; xn--bssffl; ; ; # 夡夞夜夙 +123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; ; ; ; ; # 123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; ; ; ; ; # 123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. +123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; ; ; ; [A4_1]; ; # 123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012 +123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901234.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; ; ; ; [A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901234.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890 +123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901234.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; ; ; ; [A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901234.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890. +123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901234.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; ; ; [A4_1, A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901234.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +ä1234567890123456789012345678901234567890123456789012345; ; ; xn--1234567890123456789012345678901234567890123456789012345-9te; ; ; # ä1234567890123456789012345678901234567890123456789012345 +ä1234567890123456789012345678901234567890123456789012345; ä1234567890123456789012345678901234567890123456789012345; ; xn--1234567890123456789012345678901234567890123456789012345-9te; ; ; # ä1234567890123456789012345678901234567890123456789012345 +Ä1234567890123456789012345678901234567890123456789012345; ä1234567890123456789012345678901234567890123456789012345; ; xn--1234567890123456789012345678901234567890123456789012345-9te; ; ; # ä1234567890123456789012345678901234567890123456789012345 +Ä1234567890123456789012345678901234567890123456789012345; ä1234567890123456789012345678901234567890123456789012345; ; xn--1234567890123456789012345678901234567890123456789012345-9te; ; ; # ä1234567890123456789012345678901234567890123456789012345 +xn--1234567890123456789012345678901234567890123456789012345-9te; ä1234567890123456789012345678901234567890123456789012345; ; xn--1234567890123456789012345678901234567890123456789012345-9te; ; ; # ä1234567890123456789012345678901234567890123456789012345 +123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +123456789012345678901234567890123456789012345678901234567890123.1234567890Ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +123456789012345678901234567890123456789012345678901234567890123.1234567890Ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. +123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. +123456789012345678901234567890123456789012345678901234567890123.1234567890Ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. +123456789012345678901234567890123456789012345678901234567890123.1234567890Ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. +123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901.; ; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901. +123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; ; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; [A4_1]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012 +123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; [A4_1]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012 +123456789012345678901234567890123456789012345678901234567890123.1234567890Ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; [A4_1]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012 +123456789012345678901234567890123456789012345678901234567890123.1234567890Ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; [A4_1]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012 +123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; ; 123456789012345678901234567890123456789012345678901234567890123.xn--1234567890123456789012345678901234567890123456789012345-kue.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012; [A4_1]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä123456789012345678901234567890123456789012345.123456789012345678901234567890123456789012345678901234567890123.12345678901234567890123456789012345678901234567890123456789012 +123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; ; ; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; [A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890 +123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; ; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; [A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890 +123456789012345678901234567890123456789012345678901234567890123.1234567890Ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; ; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; [A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890 +123456789012345678901234567890123456789012345678901234567890123.1234567890Ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; ; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; [A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890 +123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; ; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890; [A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890 +123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; ; ; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; [A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890. +123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; ; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; [A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890. +123456789012345678901234567890123456789012345678901234567890123.1234567890Ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; ; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; [A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890. +123456789012345678901234567890123456789012345678901234567890123.1234567890Ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; ; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; [A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890. +123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; ; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890.; [A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.123456789012345678901234567890123456789012345678901234567890. +123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; ; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; [A4_1, A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; [A4_1, A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +123456789012345678901234567890123456789012345678901234567890123.1234567890Ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; [A4_1, A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +123456789012345678901234567890123456789012345678901234567890123.1234567890Ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; [A4_1, A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; ; 123456789012345678901234567890123456789012345678901234567890123.xn--12345678901234567890123456789012345678901234567890123456-fxe.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901; [A4_1, A4_2]; ; # 123456789012345678901234567890123456789012345678901234567890123.1234567890ä1234567890123456789012345678901234567890123456.123456789012345678901234567890123456789012345678901234567890123.1234567890123456789012345678901234567890123456789012345678901 +a.b..-q--a-.e; ; [V2, V3, X4_2]; ; [V2, V3, A4_2]; ; # a.b..-q--a-.e +a.b..-q--ä-.e; ; [V2, V3, X4_2]; a.b..xn---q----jra.e; [V2, V3, A4_2]; ; # a.b..-q--ä-.e +a.b..-q--ä-.e; a.b..-q--ä-.e; [V2, V3, X4_2]; a.b..xn---q----jra.e; [V2, V3, A4_2]; ; # a.b..-q--ä-.e +A.B..-Q--Ä-.E; a.b..-q--ä-.e; [V2, V3, X4_2]; a.b..xn---q----jra.e; [V2, V3, A4_2]; ; # a.b..-q--ä-.e +A.B..-Q--Ä-.E; a.b..-q--ä-.e; [V2, V3, X4_2]; a.b..xn---q----jra.e; [V2, V3, A4_2]; ; # a.b..-q--ä-.e +A.b..-Q--Ä-.E; a.b..-q--ä-.e; [V2, V3, X4_2]; a.b..xn---q----jra.e; [V2, V3, A4_2]; ; # a.b..-q--ä-.e +A.b..-Q--Ä-.E; a.b..-q--ä-.e; [V2, V3, X4_2]; a.b..xn---q----jra.e; [V2, V3, A4_2]; ; # a.b..-q--ä-.e +a.b..xn---q----jra.e; a.b..-q--ä-.e; [V2, V3, X4_2]; a.b..xn---q----jra.e; [V2, V3, A4_2]; ; # a.b..-q--ä-.e +a..c; ; [X4_2]; ; [A4_2]; ; # a..c +a.-b.; ; [V3]; ; ; ; # a.-b. +a.b-.c; ; [V3]; ; ; ; # a.b-.c +a.-.c; ; [V3]; ; ; ; # a.-.c +a.bc--de.f; ; [V2]; ; ; ; # a.bc--de.f +ä.­.c; ä..c; [X4_2]; xn--4ca..c; [A4_2]; ; # ä..c +ä.­.c; ä..c; [X4_2]; xn--4ca..c; [A4_2]; ; # ä..c +Ä.­.C; ä..c; [X4_2]; xn--4ca..c; [A4_2]; ; # ä..c +Ä.­.C; ä..c; [X4_2]; xn--4ca..c; [A4_2]; ; # ä..c +xn--4ca..c; ä..c; [X4_2]; xn--4ca..c; [A4_2]; ; # ä..c +ä.-b.; ; [V3]; xn--4ca.-b.; ; ; # ä.-b. +ä.-b.; ä.-b.; [V3]; xn--4ca.-b.; ; ; # ä.-b. +Ä.-B.; ä.-b.; [V3]; xn--4ca.-b.; ; ; # ä.-b. +Ä.-B.; ä.-b.; [V3]; xn--4ca.-b.; ; ; # ä.-b. +xn--4ca.-b.; ä.-b.; [V3]; xn--4ca.-b.; ; ; # ä.-b. +ä.b-.c; ; [V3]; xn--4ca.b-.c; ; ; # ä.b-.c +ä.b-.c; ä.b-.c; [V3]; xn--4ca.b-.c; ; ; # ä.b-.c +Ä.B-.C; ä.b-.c; [V3]; xn--4ca.b-.c; ; ; # ä.b-.c +Ä.B-.C; ä.b-.c; [V3]; xn--4ca.b-.c; ; ; # ä.b-.c +Ä.b-.C; ä.b-.c; [V3]; xn--4ca.b-.c; ; ; # ä.b-.c +Ä.b-.C; ä.b-.c; [V3]; xn--4ca.b-.c; ; ; # ä.b-.c +xn--4ca.b-.c; ä.b-.c; [V3]; xn--4ca.b-.c; ; ; # ä.b-.c +ä.-.c; ; [V3]; xn--4ca.-.c; ; ; # ä.-.c +ä.-.c; ä.-.c; [V3]; xn--4ca.-.c; ; ; # ä.-.c +Ä.-.C; ä.-.c; [V3]; xn--4ca.-.c; ; ; # ä.-.c +Ä.-.C; ä.-.c; [V3]; xn--4ca.-.c; ; ; # ä.-.c +xn--4ca.-.c; ä.-.c; [V3]; xn--4ca.-.c; ; ; # ä.-.c +ä.bc--de.f; ; [V2]; xn--4ca.bc--de.f; ; ; # ä.bc--de.f +ä.bc--de.f; ä.bc--de.f; [V2]; xn--4ca.bc--de.f; ; ; # ä.bc--de.f +Ä.BC--DE.F; ä.bc--de.f; [V2]; xn--4ca.bc--de.f; ; ; # ä.bc--de.f +Ä.BC--DE.F; ä.bc--de.f; [V2]; xn--4ca.bc--de.f; ; ; # ä.bc--de.f +Ä.bc--De.f; ä.bc--de.f; [V2]; xn--4ca.bc--de.f; ; ; # ä.bc--de.f +Ä.bc--De.f; ä.bc--de.f; [V2]; xn--4ca.bc--de.f; ; ; # ä.bc--de.f +xn--4ca.bc--de.f; ä.bc--de.f; [V2]; xn--4ca.bc--de.f; ; ; # ä.bc--de.f +a.b.̈c.d; ; [V5]; a.b.xn--c-bcb.d; ; ; # a.b.̈c.d +A.B.̈C.D; a.b.̈c.d; [V5]; a.b.xn--c-bcb.d; ; ; # a.b.̈c.d +A.b.̈c.d; a.b.̈c.d; [V5]; a.b.xn--c-bcb.d; ; ; # a.b.̈c.d +a.b.xn--c-bcb.d; a.b.̈c.d; [V5]; a.b.xn--c-bcb.d; ; ; # a.b.̈c.d +A0; a0; ; ; ; ; # a0 +0A; 0a; ; ; ; ; # 0a +0A.א; 0a.א; [B1]; 0a.xn--4db; ; ; # 0a.א +0a.א; ; [B1]; 0a.xn--4db; ; ; # 0a.א +0a.xn--4db; 0a.א; [B1]; 0a.xn--4db; ; ; # 0a.א +c.xn--0-eha.xn--4db; c.0ü.א; [B1]; c.xn--0-eha.xn--4db; ; ; # c.0ü.א +b-.א; ; [B6, V3]; b-.xn--4db; ; ; # b-.א +B-.א; b-.א; [B6, V3]; b-.xn--4db; ; ; # b-.א +b-.xn--4db; b-.א; [B6, V3]; b-.xn--4db; ; ; # b-.א +d.xn----dha.xn--4db; d.ü-.א; [B6, V3]; d.xn----dha.xn--4db; ; ; # d.ü-.א +aא; ; [B5, B6]; xn--a-0hc; ; ; # aא +Aא; aא; [B5, B6]; xn--a-0hc; ; ; # aא +xn--a-0hc; aא; [B5, B6]; xn--a-0hc; ; ; # aא +אׇ; ; ; xn--vdbr; ; ; # אׇ +xn--vdbr; אׇ; ; xn--vdbr; ; ; # אׇ +א9ׇ; ; ; xn--9-ihcz; ; ; # א9ׇ +xn--9-ihcz; א9ׇ; ; xn--9-ihcz; ; ; # א9ׇ +אaׇ; ; [B2, B3]; xn--a-ihcz; ; ; # אaׇ +אAׇ; אaׇ; [B2, B3]; xn--a-ihcz; ; ; # אaׇ +xn--a-ihcz; אaׇ; [B2, B3]; xn--a-ihcz; ; ; # אaׇ +את; ; ; xn--4db6c; ; ; # את +xn--4db6c; את; ; xn--4db6c; ; ; # את +א׳ת; ; ; xn--4db6c0a; ; ; # א׳ת +xn--4db6c0a; א׳ת; ; xn--4db6c0a; ; ; # א׳ת +aאTz; aאtz; [B5]; xn--atz-qpe; ; ; # aאtz +aאtz; ; [B5]; xn--atz-qpe; ; ; # aאtz +AאTZ; aאtz; [B5]; xn--atz-qpe; ; ; # aאtz +Aאtz; aאtz; [B5]; xn--atz-qpe; ; ; # aאtz +xn--atz-qpe; aאtz; [B5]; xn--atz-qpe; ; ; # aאtz +אTת; אtת; [B2]; xn--t-zhc3f; ; ; # אtת +אtת; ; [B2]; xn--t-zhc3f; ; ; # אtת +xn--t-zhc3f; אtת; [B2]; xn--t-zhc3f; ; ; # אtת +א7ת; ; ; xn--7-zhc3f; ; ; # א7ת +xn--7-zhc3f; א7ת; ; xn--7-zhc3f; ; ; # א7ת +א٧ת; ; ; xn--4db6c6t; ; ; # א٧ת +xn--4db6c6t; א٧ת; ; xn--4db6c6t; ; ; # א٧ת +a7٧z; ; [B5]; xn--a7z-06e; ; ; # a7٧z +A7٧Z; a7٧z; [B5]; xn--a7z-06e; ; ; # a7٧z +A7٧z; a7٧z; [B5]; xn--a7z-06e; ; ; # a7٧z +xn--a7z-06e; a7٧z; [B5]; xn--a7z-06e; ; ; # a7٧z +א7٧ת; ; [B4]; xn--7-zhc3fty; ; ; # א7٧ת +xn--7-zhc3fty; א7٧ת; [B4]; xn--7-zhc3fty; ; ; # א7٧ת +ஹ்‍; ; ; xn--dmc4b194h; ; xn--dmc4b; # ஹ் +xn--dmc4b; ஹ்; ; xn--dmc4b; ; ; # ஹ் +ஹ்; ; ; xn--dmc4b; ; ; # ஹ் +xn--dmc4b194h; ஹ்‍; ; xn--dmc4b194h; ; ; # ஹ் +ஹ‍; ; [C2]; xn--dmc225h; ; xn--dmc; [] # ஹ +xn--dmc; ஹ; ; xn--dmc; ; ; # ஹ +ஹ; ; ; xn--dmc; ; ; # ஹ +xn--dmc225h; ஹ‍; [C2]; xn--dmc225h; ; ; # ஹ +‍; ; [C2]; xn--1ug; ; ; [A4_2] # +; ; [X4_2]; ; [A4_2]; ; # +xn--1ug; ‍; [C2]; xn--1ug; ; ; # +ஹ்‌; ; ; xn--dmc4by94h; ; xn--dmc4b; # ஹ் +xn--dmc4by94h; ஹ்‌; ; xn--dmc4by94h; ; ; # ஹ் +ஹ‌; ; [C1]; xn--dmc025h; ; xn--dmc; [] # ஹ +xn--dmc025h; ஹ‌; [C1]; xn--dmc025h; ; ; # ஹ +‌; ; [C1]; xn--0ug; ; ; [A4_2] # +xn--0ug; ‌; [C1]; xn--0ug; ; ; # +لٰ‌ۭۯ; ; ; xn--ghb2gxqia7523a; ; xn--ghb2gxqia; # لٰۭۯ +xn--ghb2gxqia; لٰۭۯ; ; xn--ghb2gxqia; ; ; # لٰۭۯ +لٰۭۯ; ; ; xn--ghb2gxqia; ; ; # لٰۭۯ +xn--ghb2gxqia7523a; لٰ‌ۭۯ; ; xn--ghb2gxqia7523a; ; ; # لٰۭۯ +لٰ‌ۯ; ; ; xn--ghb2g3qq34f; ; xn--ghb2g3q; # لٰۯ +xn--ghb2g3q; لٰۯ; ; xn--ghb2g3q; ; ; # لٰۯ +لٰۯ; ; ; xn--ghb2g3q; ; ; # لٰۯ +xn--ghb2g3qq34f; لٰ‌ۯ; ; xn--ghb2g3qq34f; ; ; # لٰۯ +ل‌ۭۯ; ; ; xn--ghb25aga828w; ; xn--ghb25aga; # لۭۯ +xn--ghb25aga; لۭۯ; ; xn--ghb25aga; ; ; # لۭۯ +لۭۯ; ; ; xn--ghb25aga; ; ; # لۭۯ +xn--ghb25aga828w; ل‌ۭۯ; ; xn--ghb25aga828w; ; ; # لۭۯ +ل‌ۯ; ; ; xn--ghb65a953d; ; xn--ghb65a; # لۯ +xn--ghb65a; لۯ; ; xn--ghb65a; ; ; # لۯ +لۯ; ; ; xn--ghb65a; ; ; # لۯ +xn--ghb65a953d; ل‌ۯ; ; xn--ghb65a953d; ; ; # لۯ +لٰ‌ۭ; ; [B3, C1]; xn--ghb2gxqy34f; ; xn--ghb2gxq; [] # لٰۭ +xn--ghb2gxq; لٰۭ; ; xn--ghb2gxq; ; ; # لٰۭ +لٰۭ; ; ; xn--ghb2gxq; ; ; # لٰۭ +xn--ghb2gxqy34f; لٰ‌ۭ; [B3, C1]; xn--ghb2gxqy34f; ; ; # لٰۭ +ۯ‌ۯ; ; [C1]; xn--cmba004q; ; xn--cmba; [] # ۯۯ +xn--cmba; ۯۯ; ; xn--cmba; ; ; # ۯۯ +ۯۯ; ; ; xn--cmba; ; ; # ۯۯ +xn--cmba004q; ۯ‌ۯ; [C1]; xn--cmba004q; ; ; # ۯۯ +ل‌; ; [B3, C1]; xn--ghb413k; ; xn--ghb; [] # ل +xn--ghb; ل; ; xn--ghb; ; ; # ل +ل; ; ; xn--ghb; ; ; # ل +xn--ghb413k; ل‌; [B3, C1]; xn--ghb413k; ; ; # ل +a。。b; a..b; [X4_2]; ; [A4_2]; ; # a..b +A。。B; a..b; [X4_2]; ; [A4_2]; ; # a..b +a..b; ; [X4_2]; ; [A4_2]; ; # a..b +‍。。ڹ‌; ‍..ڹ‌; [B1, B3, C1, C2, X4_2]; xn--1ug..xn--skb080k; [B1, B3, C1, C2, A4_2]; ..xn--skb; [A4_2] # ..ڹ +..xn--skb; ..ڹ; [X4_2]; ..xn--skb; [A4_2]; ; # ..ڹ +xn--1ug..xn--skb080k; ‍..ڹ‌; [B1, B3, C1, C2, X4_2]; xn--1ug..xn--skb080k; [B1, B3, C1, C2, A4_2]; ; # ..ڹ +א0٠; ; [B4]; xn--0-zhc74b; ; ; # א0٠ +xn--0-zhc74b; א0٠; [B4]; xn--0-zhc74b; ; ; # א0٠ +$; ; [P1, V6]; ; ; ; # $ + +# RANDOMIZED TESTS + +c.0ü.א; ; [B1]; c.xn--0-eha.xn--4db; ; ; # c.0ü.א +c.0ü.א; c.0ü.א; [B1]; c.xn--0-eha.xn--4db; ; ; # c.0ü.א +C.0Ü.א; c.0ü.א; [B1]; c.xn--0-eha.xn--4db; ; ; # c.0ü.א +C.0Ü.א; c.0ü.א; [B1]; c.xn--0-eha.xn--4db; ; ; # c.0ü.א +C.0ü.א; c.0ü.א; [B1]; c.xn--0-eha.xn--4db; ; ; # c.0ü.א +C.0ü.א; c.0ü.א; [B1]; c.xn--0-eha.xn--4db; ; ; # c.0ü.א +⒕∝ٟ򓤦.-󠄯; ⒕∝ٟ򓤦.-; [P1, V3, V6]; xn--7hb713lfwbi1311b.-; ; ; # ⒕∝ٟ.- +14.∝ٟ򓤦.-󠄯; 14.∝ٟ򓤦.-; [P1, V3, V6]; 14.xn--7hb713l3v90n.-; ; ; # 14.∝ٟ.- +14.xn--7hb713l3v90n.-; 14.∝ٟ򓤦.-; [V3, V6]; 14.xn--7hb713l3v90n.-; ; ; # 14.∝ٟ.- +xn--7hb713lfwbi1311b.-; ⒕∝ٟ򓤦.-; [V3, V6]; xn--7hb713lfwbi1311b.-; ; ; # ⒕∝ٟ.- +ꡣ.ߏ; ; ; xn--8c9a.xn--qsb; ; ; # ꡣ.ߏ +xn--8c9a.xn--qsb; ꡣ.ߏ; ; xn--8c9a.xn--qsb; ; ; # ꡣ.ߏ +≯؃。-; ≯؃.-; [B1, P1, V3, V6]; xn--lfb566l.-; ; ; # ≯.- +≯؃。-; ≯؃.-; [B1, P1, V3, V6]; xn--lfb566l.-; ; ; # ≯.- +≯؃。-; ≯؃.-; [B1, P1, V3, V6]; xn--lfb566l.-; ; ; # ≯.- +≯؃。-; ≯؃.-; [B1, P1, V3, V6]; xn--lfb566l.-; ; ; # ≯.- +xn--lfb566l.-; ≯؃.-; [B1, V3, V6]; xn--lfb566l.-; ; ; # ≯.- +⾛𐹧⾕.ᅟ󠗰ςႭ; 走𐹧谷.ᅟ󠗰ςႭ; [B5, P1, V6]; xn--6g3a1x434z.xn--3xa827dhpae6345i; ; xn--6g3a1x434z.xn--4xa627dhpae6345i; # 走𐹧谷.ςႭ +走𐹧谷.ᅟ󠗰ςႭ; ; [B5, P1, V6]; xn--6g3a1x434z.xn--3xa827dhpae6345i; ; xn--6g3a1x434z.xn--4xa627dhpae6345i; # 走𐹧谷.ςႭ +走𐹧谷.ᅟ󠗰ςⴍ; ; [B5, P1, V6]; xn--6g3a1x434z.xn--3xa380eotvh7453a; ; xn--6g3a1x434z.xn--4xa180eotvh7453a; # 走𐹧谷.ςⴍ +走𐹧谷.ᅟ󠗰ΣႭ; 走𐹧谷.ᅟ󠗰σႭ; [B5, P1, V6]; xn--6g3a1x434z.xn--4xa627dhpae6345i; ; ; # 走𐹧谷.σႭ +走𐹧谷.ᅟ󠗰σⴍ; ; [B5, P1, V6]; xn--6g3a1x434z.xn--4xa180eotvh7453a; ; ; # 走𐹧谷.σⴍ +走𐹧谷.ᅟ󠗰Σⴍ; 走𐹧谷.ᅟ󠗰σⴍ; [B5, P1, V6]; xn--6g3a1x434z.xn--4xa180eotvh7453a; ; ; # 走𐹧谷.σⴍ +xn--6g3a1x434z.xn--4xa180eotvh7453a; 走𐹧谷.ᅟ󠗰σⴍ; [B5, V6]; xn--6g3a1x434z.xn--4xa180eotvh7453a; ; ; # 走𐹧谷.σⴍ +xn--6g3a1x434z.xn--4xa627dhpae6345i; 走𐹧谷.ᅟ󠗰σႭ; [B5, V6]; xn--6g3a1x434z.xn--4xa627dhpae6345i; ; ; # 走𐹧谷.σႭ +xn--6g3a1x434z.xn--3xa380eotvh7453a; 走𐹧谷.ᅟ󠗰ςⴍ; [B5, V6]; xn--6g3a1x434z.xn--3xa380eotvh7453a; ; ; # 走𐹧谷.ςⴍ +xn--6g3a1x434z.xn--3xa827dhpae6345i; 走𐹧谷.ᅟ󠗰ςႭ; [B5, V6]; xn--6g3a1x434z.xn--3xa827dhpae6345i; ; ; # 走𐹧谷.ςႭ +⾛𐹧⾕.ᅟ󠗰ςⴍ; 走𐹧谷.ᅟ󠗰ςⴍ; [B5, P1, V6]; xn--6g3a1x434z.xn--3xa380eotvh7453a; ; xn--6g3a1x434z.xn--4xa180eotvh7453a; # 走𐹧谷.ςⴍ +⾛𐹧⾕.ᅟ󠗰ΣႭ; 走𐹧谷.ᅟ󠗰σႭ; [B5, P1, V6]; xn--6g3a1x434z.xn--4xa627dhpae6345i; ; ; # 走𐹧谷.σႭ +⾛𐹧⾕.ᅟ󠗰σⴍ; 走𐹧谷.ᅟ󠗰σⴍ; [B5, P1, V6]; xn--6g3a1x434z.xn--4xa180eotvh7453a; ; ; # 走𐹧谷.σⴍ +⾛𐹧⾕.ᅟ󠗰Σⴍ; 走𐹧谷.ᅟ󠗰σⴍ; [B5, P1, V6]; xn--6g3a1x434z.xn--4xa180eotvh7453a; ; ; # 走𐹧谷.σⴍ +‍≠ᢙ≯.솣-ᡴႠ; ; [C2, P1, V6]; xn--jbf929a90b0b.xn----6zg521d196p; ; xn--jbf911clb.xn----6zg521d196p; [P1, V6] # ≠ᢙ≯.솣-ᡴႠ +‍≠ᢙ≯.솣-ᡴႠ; ‍≠ᢙ≯.솣-ᡴႠ; [C2, P1, V6]; xn--jbf929a90b0b.xn----6zg521d196p; ; xn--jbf911clb.xn----6zg521d196p; [P1, V6] # ≠ᢙ≯.솣-ᡴႠ +‍≠ᢙ≯.솣-ᡴⴀ; ‍≠ᢙ≯.솣-ᡴⴀ; [C2, P1, V6]; xn--jbf929a90b0b.xn----p9j493ivi4l; ; xn--jbf911clb.xn----p9j493ivi4l; [P1, V6] # ≠ᢙ≯.솣-ᡴⴀ +‍≠ᢙ≯.솣-ᡴⴀ; ; [C2, P1, V6]; xn--jbf929a90b0b.xn----p9j493ivi4l; ; xn--jbf911clb.xn----p9j493ivi4l; [P1, V6] # ≠ᢙ≯.솣-ᡴⴀ +xn--jbf911clb.xn----p9j493ivi4l; ≠ᢙ≯.솣-ᡴⴀ; [V6]; xn--jbf911clb.xn----p9j493ivi4l; ; ; # ≠ᢙ≯.솣-ᡴⴀ +xn--jbf929a90b0b.xn----p9j493ivi4l; ‍≠ᢙ≯.솣-ᡴⴀ; [C2, V6]; xn--jbf929a90b0b.xn----p9j493ivi4l; ; ; # ≠ᢙ≯.솣-ᡴⴀ +xn--jbf911clb.xn----6zg521d196p; ≠ᢙ≯.솣-ᡴႠ; [V6]; xn--jbf911clb.xn----6zg521d196p; ; ; # ≠ᢙ≯.솣-ᡴႠ +xn--jbf929a90b0b.xn----6zg521d196p; ‍≠ᢙ≯.솣-ᡴႠ; [C2, V6]; xn--jbf929a90b0b.xn----6zg521d196p; ; ; # ≠ᢙ≯.솣-ᡴႠ +񯞜.𐿇ྡྷݽ؀; 񯞜.𐿇ྡྷݽ؀; [P1, V6]; xn--gw68a.xn--ifb57ev2psc6027m; ; ; # .𐿇ྡྷݽ +񯞜.𐿇ྡྷݽ؀; 񯞜.𐿇ྡྷݽ؀; [P1, V6]; xn--gw68a.xn--ifb57ev2psc6027m; ; ; # .𐿇ྡྷݽ +񯞜.𐿇ྡྷݽ؀; ; [P1, V6]; xn--gw68a.xn--ifb57ev2psc6027m; ; ; # .𐿇ྡྷݽ +xn--gw68a.xn--ifb57ev2psc6027m; 񯞜.𐿇ྡྷݽ؀; [V6]; xn--gw68a.xn--ifb57ev2psc6027m; ; ; # .𐿇ྡྷݽ +𣳔̃.𑓂; ; [V5]; xn--nsa95820a.xn--wz1d; ; ; # 𣳔̃.𑓂 +xn--nsa95820a.xn--wz1d; 𣳔̃.𑓂; [V5]; xn--nsa95820a.xn--wz1d; ; ; # 𣳔̃.𑓂 +𞤀𞥅񘐱。󠄌Ⴣꡥ; 𞤢𞥅񘐱.Ⴣꡥ; [B2, B3, P1, V6]; xn--9d6hgcy3556a.xn--7nd0578e; ; ; # 𞤢𞥅.Ⴣꡥ +𞤢𞥅񘐱。󠄌ⴣꡥ; 𞤢𞥅񘐱.ⴣꡥ; [B2, B3, P1, V6]; xn--9d6hgcy3556a.xn--rlju750b; ; ; # 𞤢𞥅.ⴣꡥ +xn--9d6hgcy3556a.xn--rlju750b; 𞤢𞥅񘐱.ⴣꡥ; [B2, B3, V6]; xn--9d6hgcy3556a.xn--rlju750b; ; ; # 𞤢𞥅.ⴣꡥ +xn--9d6hgcy3556a.xn--7nd0578e; 𞤢𞥅񘐱.Ⴣꡥ; [B2, B3, V6]; xn--9d6hgcy3556a.xn--7nd0578e; ; ; # 𞤢𞥅.Ⴣꡥ +𞤀𞥅񘐱。󠄌ⴣꡥ; 𞤢𞥅񘐱.ⴣꡥ; [B2, B3, P1, V6]; xn--9d6hgcy3556a.xn--rlju750b; ; ; # 𞤢𞥅.ⴣꡥ +࣢𑁿ς𖬱。󠅡렧; ࣢𑁿ς𖬱.렧; [B1, P1, V6]; xn--3xa73xp48ys2xc.xn--kn2b; ; xn--4xa53xp48ys2xc.xn--kn2b; # 𑁿ς𖬱.렧 +࣢𑁿ς𖬱。󠅡렧; ࣢𑁿ς𖬱.렧; [B1, P1, V6]; xn--3xa73xp48ys2xc.xn--kn2b; ; xn--4xa53xp48ys2xc.xn--kn2b; # 𑁿ς𖬱.렧 +࣢𑁿Σ𖬱。󠅡렧; ࣢𑁿σ𖬱.렧; [B1, P1, V6]; xn--4xa53xp48ys2xc.xn--kn2b; ; ; # 𑁿σ𖬱.렧 +࣢𑁿Σ𖬱。󠅡렧; ࣢𑁿σ𖬱.렧; [B1, P1, V6]; xn--4xa53xp48ys2xc.xn--kn2b; ; ; # 𑁿σ𖬱.렧 +࣢𑁿σ𖬱。󠅡렧; ࣢𑁿σ𖬱.렧; [B1, P1, V6]; xn--4xa53xp48ys2xc.xn--kn2b; ; ; # 𑁿σ𖬱.렧 +࣢𑁿σ𖬱。󠅡렧; ࣢𑁿σ𖬱.렧; [B1, P1, V6]; xn--4xa53xp48ys2xc.xn--kn2b; ; ; # 𑁿σ𖬱.렧 +xn--4xa53xp48ys2xc.xn--kn2b; ࣢𑁿σ𖬱.렧; [B1, V6]; xn--4xa53xp48ys2xc.xn--kn2b; ; ; # 𑁿σ𖬱.렧 +xn--3xa73xp48ys2xc.xn--kn2b; ࣢𑁿ς𖬱.렧; [B1, V6]; xn--3xa73xp48ys2xc.xn--kn2b; ; ; # 𑁿ς𖬱.렧 +-‍。𞤍‌‍⒈; -‍.𞤯‌‍⒈; [B1, C1, C2, P1, V3, V6]; xn----ugn.xn--0ugc555aiv51d; ; -.xn--tsh3666n; [B1, P1, V3, V6] # -.𞤯⒈ +-‍。𞤍‌‍1.; -‍.𞤯‌‍1.; [B1, C1, C2, V3]; xn----ugn.xn--1-rgnd61297b.; ; -.xn--1-0i8r.; [B1, V3] # -.𞤯1. +-‍。𞤯‌‍1.; -‍.𞤯‌‍1.; [B1, C1, C2, V3]; xn----ugn.xn--1-rgnd61297b.; ; -.xn--1-0i8r.; [B1, V3] # -.𞤯1. +-.xn--1-0i8r.; -.𞤯1.; [B1, V3]; -.xn--1-0i8r.; ; ; # -.𞤯1. +xn----ugn.xn--1-rgnd61297b.; -‍.𞤯‌‍1.; [B1, C1, C2, V3]; xn----ugn.xn--1-rgnd61297b.; ; ; # -.𞤯1. +-‍。𞤯‌‍⒈; -‍.𞤯‌‍⒈; [B1, C1, C2, P1, V3, V6]; xn----ugn.xn--0ugc555aiv51d; ; -.xn--tsh3666n; [B1, P1, V3, V6] # -.𞤯⒈ +-.xn--tsh3666n; -.𞤯⒈; [B1, V3, V6]; -.xn--tsh3666n; ; ; # -.𞤯⒈ +xn----ugn.xn--0ugc555aiv51d; -‍.𞤯‌‍⒈; [B1, C1, C2, V3, V6]; xn----ugn.xn--0ugc555aiv51d; ; ; # -.𞤯⒈ +‌򅎭.Ⴒ𑇀; ; [C1, P1, V6]; xn--0ug15083f.xn--qnd6272k; ; xn--bn95b.xn--qnd6272k; [P1, V6] # .Ⴒ𑇀 +‌򅎭.ⴒ𑇀; ; [C1, P1, V6]; xn--0ug15083f.xn--9kj2034e; ; xn--bn95b.xn--9kj2034e; [P1, V6] # .ⴒ𑇀 +xn--bn95b.xn--9kj2034e; 򅎭.ⴒ𑇀; [V6]; xn--bn95b.xn--9kj2034e; ; ; # .ⴒ𑇀 +xn--0ug15083f.xn--9kj2034e; ‌򅎭.ⴒ𑇀; [C1, V6]; xn--0ug15083f.xn--9kj2034e; ; ; # .ⴒ𑇀 +xn--bn95b.xn--qnd6272k; 򅎭.Ⴒ𑇀; [V6]; xn--bn95b.xn--qnd6272k; ; ; # .Ⴒ𑇀 +xn--0ug15083f.xn--qnd6272k; ‌򅎭.Ⴒ𑇀; [C1, V6]; xn--0ug15083f.xn--qnd6272k; ; ; # .Ⴒ𑇀 +繱𑖿‍.8︒; 繱𑖿‍.8︒; [P1, V6]; xn--1ug6928ac48e.xn--8-o89h; ; xn--gl0as212a.xn--8-o89h; # 繱𑖿.8︒ +繱𑖿‍.8。; 繱𑖿‍.8.; ; xn--1ug6928ac48e.8.; ; xn--gl0as212a.8.; # 繱𑖿.8. +xn--gl0as212a.8.; 繱𑖿.8.; ; xn--gl0as212a.8.; ; ; # 繱𑖿.8. +繱𑖿.8.; ; ; xn--gl0as212a.8.; ; ; # 繱𑖿.8. +xn--1ug6928ac48e.8.; 繱𑖿‍.8.; ; xn--1ug6928ac48e.8.; ; ; # 繱𑖿.8. +繱𑖿‍.8.; ; ; xn--1ug6928ac48e.8.; ; xn--gl0as212a.8.; # 繱𑖿.8. +xn--gl0as212a.xn--8-o89h; 繱𑖿.8︒; [V6]; xn--gl0as212a.xn--8-o89h; ; ; # 繱𑖿.8︒ +xn--1ug6928ac48e.xn--8-o89h; 繱𑖿‍.8︒; [V6]; xn--1ug6928ac48e.xn--8-o89h; ; ; # 繱𑖿.8︒ +󠆾.𞀈; .𞀈; [V5, X4_2]; .xn--ph4h; [V5, A4_2]; ; # .𞀈 +󠆾.𞀈; .𞀈; [V5, X4_2]; .xn--ph4h; [V5, A4_2]; ; # .𞀈 +.xn--ph4h; .𞀈; [V5, X4_2]; .xn--ph4h; [V5, A4_2]; ; # .𞀈 +ß۫。‍; ß۫.‍; [C2]; xn--zca012a.xn--1ug; ; xn--ss-59d.; [] # ß۫. +SS۫。‍; ss۫.‍; [C2]; xn--ss-59d.xn--1ug; ; xn--ss-59d.; [] # ss۫. +ss۫。‍; ss۫.‍; [C2]; xn--ss-59d.xn--1ug; ; xn--ss-59d.; [] # ss۫. +Ss۫。‍; ss۫.‍; [C2]; xn--ss-59d.xn--1ug; ; xn--ss-59d.; [] # ss۫. +xn--ss-59d.; ss۫.; ; xn--ss-59d.; ; ; # ss۫. +ss۫.; ; ; xn--ss-59d.; ; ; # ss۫. +SS۫.; ss۫.; ; xn--ss-59d.; ; ; # ss۫. +Ss۫.; ss۫.; ; xn--ss-59d.; ; ; # ss۫. +xn--ss-59d.xn--1ug; ss۫.‍; [C2]; xn--ss-59d.xn--1ug; ; ; # ss۫. +xn--zca012a.xn--1ug; ß۫.‍; [C2]; xn--zca012a.xn--1ug; ; ; # ß۫. +󠐵‌⒈.󠎇; 󠐵‌⒈.󠎇; [C1, P1, V6]; xn--0ug88o47900b.xn--tv36e; ; xn--tshz2001k.xn--tv36e; [P1, V6] # ⒈. +󠐵‌1..󠎇; ; [C1, P1, V6, X4_2]; xn--1-rgn37671n..xn--tv36e; [C1, P1, V6, A4_2]; xn--1-bs31m..xn--tv36e; [P1, V6, A4_2] # 1.. +xn--1-bs31m..xn--tv36e; 󠐵1..󠎇; [V6, X4_2]; xn--1-bs31m..xn--tv36e; [V6, A4_2]; ; # 1.. +xn--1-rgn37671n..xn--tv36e; 󠐵‌1..󠎇; [C1, V6, X4_2]; xn--1-rgn37671n..xn--tv36e; [C1, V6, A4_2]; ; # 1.. +xn--tshz2001k.xn--tv36e; 󠐵⒈.󠎇; [V6]; xn--tshz2001k.xn--tv36e; ; ; # ⒈. +xn--0ug88o47900b.xn--tv36e; 󠐵‌⒈.󠎇; [C1, V6]; xn--0ug88o47900b.xn--tv36e; ; ; # ⒈. +󟈣ٟꪲß。󌓧; 󟈣ٟꪲß.󌓧; [P1, V6]; xn--zca92z0t7n5w96j.xn--bb79d; ; xn--ss-3xd2839nncy1m.xn--bb79d; # ٟꪲß. +󟈣ٟꪲSS。󌓧; 󟈣ٟꪲss.󌓧; [P1, V6]; xn--ss-3xd2839nncy1m.xn--bb79d; ; ; # ٟꪲss. +󟈣ٟꪲss。󌓧; 󟈣ٟꪲss.󌓧; [P1, V6]; xn--ss-3xd2839nncy1m.xn--bb79d; ; ; # ٟꪲss. +󟈣ٟꪲSs。󌓧; 󟈣ٟꪲss.󌓧; [P1, V6]; xn--ss-3xd2839nncy1m.xn--bb79d; ; ; # ٟꪲss. +xn--ss-3xd2839nncy1m.xn--bb79d; 󟈣ٟꪲss.󌓧; [V6]; xn--ss-3xd2839nncy1m.xn--bb79d; ; ; # ٟꪲss. +xn--zca92z0t7n5w96j.xn--bb79d; 󟈣ٟꪲß.󌓧; [V6]; xn--zca92z0t7n5w96j.xn--bb79d; ; ; # ٟꪲß. +ݴ‌𞤿。𽘐䉜‍񿤼; ݴ‌𞤿.𽘐䉜‍񿤼; [C1, C2, P1, V6]; xn--4pb607jjt73a.xn--1ug236ke314donv1a; ; xn--4pb2977v.xn--z0nt555ukbnv; [P1, V6] # ݴ𞤿.䉜 +ݴ‌𞤝。𽘐䉜‍񿤼; ݴ‌𞤿.𽘐䉜‍񿤼; [C1, C2, P1, V6]; xn--4pb607jjt73a.xn--1ug236ke314donv1a; ; xn--4pb2977v.xn--z0nt555ukbnv; [P1, V6] # ݴ𞤿.䉜 +xn--4pb2977v.xn--z0nt555ukbnv; ݴ𞤿.𽘐䉜񿤼; [V6]; xn--4pb2977v.xn--z0nt555ukbnv; ; ; # ݴ𞤿.䉜 +xn--4pb607jjt73a.xn--1ug236ke314donv1a; ݴ‌𞤿.𽘐䉜‍񿤼; [C1, C2, V6]; xn--4pb607jjt73a.xn--1ug236ke314donv1a; ; ; # ݴ𞤿.䉜 +򔭜ςᡱ⒈.≮𑄳‍𐮍; ; [B1, P1, V6]; xn--3xa407hkzinr77u.xn--1ug85gn777ahze; ; xn--4xa207hkzinr77u.xn--gdh5392g6sd; # ςᡱ⒈.≮𑄳𐮍 +򔭜ςᡱ⒈.≮𑄳‍𐮍; 򔭜ςᡱ⒈.≮𑄳‍𐮍; [B1, P1, V6]; xn--3xa407hkzinr77u.xn--1ug85gn777ahze; ; xn--4xa207hkzinr77u.xn--gdh5392g6sd; # ςᡱ⒈.≮𑄳𐮍 +򔭜ςᡱ1..≮𑄳‍𐮍; ; [B1, P1, V6, X4_2]; xn--1-xmb999meq63t..xn--1ug85gn777ahze; [B1, P1, V6, A4_2]; xn--1-zmb699meq63t..xn--gdh5392g6sd; # ςᡱ1..≮𑄳𐮍 +򔭜ςᡱ1..≮𑄳‍𐮍; 򔭜ςᡱ1..≮𑄳‍𐮍; [B1, P1, V6, X4_2]; xn--1-xmb999meq63t..xn--1ug85gn777ahze; [B1, P1, V6, A4_2]; xn--1-zmb699meq63t..xn--gdh5392g6sd; # ςᡱ1..≮𑄳𐮍 +򔭜Σᡱ1..≮𑄳‍𐮍; 򔭜σᡱ1..≮𑄳‍𐮍; [B1, P1, V6, X4_2]; xn--1-zmb699meq63t..xn--1ug85gn777ahze; [B1, P1, V6, A4_2]; xn--1-zmb699meq63t..xn--gdh5392g6sd; # σᡱ1..≮𑄳𐮍 +򔭜Σᡱ1..≮𑄳‍𐮍; 򔭜σᡱ1..≮𑄳‍𐮍; [B1, P1, V6, X4_2]; xn--1-zmb699meq63t..xn--1ug85gn777ahze; [B1, P1, V6, A4_2]; xn--1-zmb699meq63t..xn--gdh5392g6sd; # σᡱ1..≮𑄳𐮍 +򔭜σᡱ1..≮𑄳‍𐮍; ; [B1, P1, V6, X4_2]; xn--1-zmb699meq63t..xn--1ug85gn777ahze; [B1, P1, V6, A4_2]; xn--1-zmb699meq63t..xn--gdh5392g6sd; # σᡱ1..≮𑄳𐮍 +򔭜σᡱ1..≮𑄳‍𐮍; 򔭜σᡱ1..≮𑄳‍𐮍; [B1, P1, V6, X4_2]; xn--1-zmb699meq63t..xn--1ug85gn777ahze; [B1, P1, V6, A4_2]; xn--1-zmb699meq63t..xn--gdh5392g6sd; # σᡱ1..≮𑄳𐮍 +xn--1-zmb699meq63t..xn--gdh5392g6sd; 򔭜σᡱ1..≮𑄳𐮍; [B1, V6, X4_2]; xn--1-zmb699meq63t..xn--gdh5392g6sd; [B1, V6, A4_2]; ; # σᡱ1..≮𑄳𐮍 +xn--1-zmb699meq63t..xn--1ug85gn777ahze; 򔭜σᡱ1..≮𑄳‍𐮍; [B1, V6, X4_2]; xn--1-zmb699meq63t..xn--1ug85gn777ahze; [B1, V6, A4_2]; ; # σᡱ1..≮𑄳𐮍 +xn--1-xmb999meq63t..xn--1ug85gn777ahze; 򔭜ςᡱ1..≮𑄳‍𐮍; [B1, V6, X4_2]; xn--1-xmb999meq63t..xn--1ug85gn777ahze; [B1, V6, A4_2]; ; # ςᡱ1..≮𑄳𐮍 +򔭜Σᡱ⒈.≮𑄳‍𐮍; 򔭜σᡱ⒈.≮𑄳‍𐮍; [B1, P1, V6]; xn--4xa207hkzinr77u.xn--1ug85gn777ahze; ; xn--4xa207hkzinr77u.xn--gdh5392g6sd; # σᡱ⒈.≮𑄳𐮍 +򔭜Σᡱ⒈.≮𑄳‍𐮍; 򔭜σᡱ⒈.≮𑄳‍𐮍; [B1, P1, V6]; xn--4xa207hkzinr77u.xn--1ug85gn777ahze; ; xn--4xa207hkzinr77u.xn--gdh5392g6sd; # σᡱ⒈.≮𑄳𐮍 +򔭜σᡱ⒈.≮𑄳‍𐮍; ; [B1, P1, V6]; xn--4xa207hkzinr77u.xn--1ug85gn777ahze; ; xn--4xa207hkzinr77u.xn--gdh5392g6sd; # σᡱ⒈.≮𑄳𐮍 +򔭜σᡱ⒈.≮𑄳‍𐮍; 򔭜σᡱ⒈.≮𑄳‍𐮍; [B1, P1, V6]; xn--4xa207hkzinr77u.xn--1ug85gn777ahze; ; xn--4xa207hkzinr77u.xn--gdh5392g6sd; # σᡱ⒈.≮𑄳𐮍 +xn--4xa207hkzinr77u.xn--gdh5392g6sd; 򔭜σᡱ⒈.≮𑄳𐮍; [B1, V6]; xn--4xa207hkzinr77u.xn--gdh5392g6sd; ; ; # σᡱ⒈.≮𑄳𐮍 +xn--4xa207hkzinr77u.xn--1ug85gn777ahze; 򔭜σᡱ⒈.≮𑄳‍𐮍; [B1, V6]; xn--4xa207hkzinr77u.xn--1ug85gn777ahze; ; ; # σᡱ⒈.≮𑄳𐮍 +xn--3xa407hkzinr77u.xn--1ug85gn777ahze; 򔭜ςᡱ⒈.≮𑄳‍𐮍; [B1, V6]; xn--3xa407hkzinr77u.xn--1ug85gn777ahze; ; ; # ςᡱ⒈.≮𑄳𐮍 +ㅤ्Ⴀ័.᠋; ㅤ्Ⴀ័.; [P1, V6]; xn--n3b468azngju2a.; ; ; # ्Ⴀ័. +ᅠ्Ⴀ័.᠋; ᅠ्Ⴀ័.; [P1, V6]; xn--n3b468aoqa89r.; ; ; # ्Ⴀ័. +ᅠ्ⴀ័.᠋; ᅠ्ⴀ័.; [P1, V6]; xn--n3b742bkqf4ty.; ; ; # ्ⴀ័. +xn--n3b742bkqf4ty.; ᅠ्ⴀ័.; [V6]; xn--n3b742bkqf4ty.; ; ; # ्ⴀ័. +xn--n3b468aoqa89r.; ᅠ्Ⴀ័.; [V6]; xn--n3b468aoqa89r.; ; ; # ्Ⴀ័. +ㅤ्ⴀ័.᠋; ㅤ्ⴀ័.; [P1, V6]; xn--n3b445e53po6d.; ; ; # ्ⴀ័. +xn--n3b445e53po6d.; ㅤ्ⴀ័.; [V6]; xn--n3b445e53po6d.; ; ; # ्ⴀ័. +xn--n3b468azngju2a.; ㅤ्Ⴀ័.; [V6]; xn--n3b468azngju2a.; ; ; # ्Ⴀ័. +❣‍.্𑰽ؒꤩ; ❣‍.্𑰽ؒꤩ; [C2, V5]; xn--1ugy10a.xn--0fb32q3w7q2g4d; ; xn--pei.xn--0fb32q3w7q2g4d; [V5] # ❣.্𑰽ؒꤩ +❣‍.্𑰽ؒꤩ; ; [C2, V5]; xn--1ugy10a.xn--0fb32q3w7q2g4d; ; xn--pei.xn--0fb32q3w7q2g4d; [V5] # ❣.্𑰽ؒꤩ +xn--pei.xn--0fb32q3w7q2g4d; ❣.্𑰽ؒꤩ; [V5]; xn--pei.xn--0fb32q3w7q2g4d; ; ; # ❣.্𑰽ؒꤩ +xn--1ugy10a.xn--0fb32q3w7q2g4d; ❣‍.্𑰽ؒꤩ; [C2, V5]; xn--1ugy10a.xn--0fb32q3w7q2g4d; ; ; # ❣.্𑰽ؒꤩ +≮𐳺𐹄.≯񪮸ꡅ; ; [B1, P1, V6]; xn--gdh7943gk2a.xn--hdh1383c5e36c; ; ; # ≮𐳺.≯ꡅ +≮𐳺𐹄.≯񪮸ꡅ; ≮𐳺𐹄.≯񪮸ꡅ; [B1, P1, V6]; xn--gdh7943gk2a.xn--hdh1383c5e36c; ; ; # ≮𐳺.≯ꡅ +xn--gdh7943gk2a.xn--hdh1383c5e36c; ≮𐳺𐹄.≯񪮸ꡅ; [B1, V6]; xn--gdh7943gk2a.xn--hdh1383c5e36c; ; ; # ≮𐳺.≯ꡅ +ೌ𐧅𐳏󠲺。್ᠦ; ೌ𐧅𐳏󠲺.್ᠦ; [B1, P1, V5, V6]; xn--7tc6360ky5bn2732c.xn--8tc429c; ; ; # ೌ𐧅𐳏.್ᠦ +ೌ𐧅𐳏󠲺。್ᠦ; ೌ𐧅𐳏󠲺.್ᠦ; [B1, P1, V5, V6]; xn--7tc6360ky5bn2732c.xn--8tc429c; ; ; # ೌ𐧅𐳏.್ᠦ +ೌ𐧅𐲏󠲺。್ᠦ; ೌ𐧅𐳏󠲺.್ᠦ; [B1, P1, V5, V6]; xn--7tc6360ky5bn2732c.xn--8tc429c; ; ; # ೌ𐧅𐳏.್ᠦ +xn--7tc6360ky5bn2732c.xn--8tc429c; ೌ𐧅𐳏󠲺.್ᠦ; [B1, V5, V6]; xn--7tc6360ky5bn2732c.xn--8tc429c; ; ; # ೌ𐧅𐳏.್ᠦ +ೌ𐧅𐲏󠲺。್ᠦ; ೌ𐧅𐳏󠲺.್ᠦ; [B1, P1, V5, V6]; xn--7tc6360ky5bn2732c.xn--8tc429c; ; ; # ೌ𐧅𐳏.್ᠦ +͉。𧡫; ͉.𧡫; [V5]; xn--nua.xn--bc6k; ; ; # ͉.𧡫 +xn--nua.xn--bc6k; ͉.𧡫; [V5]; xn--nua.xn--bc6k; ; ; # ͉.𧡫 +𑰿󠅦.ᅠ; 𑰿.ᅠ; [P1, V5, V6]; xn--ok3d.xn--psd; ; ; # 𑰿. +𑰿󠅦.ᅠ; 𑰿.ᅠ; [P1, V5, V6]; xn--ok3d.xn--psd; ; ; # 𑰿. +xn--ok3d.xn--psd; 𑰿.ᅠ; [V5, V6]; xn--ok3d.xn--psd; ; ; # 𑰿. +-𞤆‍。󸼄𞳒; -𞤨‍.󸼄𞳒; [B1, B5, B6, C2, P1, V3, V6]; xn----ugnx367r.xn--846h96596c; ; xn----ni8r.xn--846h96596c; [B1, B5, B6, P1, V3, V6] # -𞤨. +-𞤨‍。󸼄𞳒; -𞤨‍.󸼄𞳒; [B1, B5, B6, C2, P1, V3, V6]; xn----ugnx367r.xn--846h96596c; ; xn----ni8r.xn--846h96596c; [B1, B5, B6, P1, V3, V6] # -𞤨. +xn----ni8r.xn--846h96596c; -𞤨.󸼄𞳒; [B1, B5, B6, V3, V6]; xn----ni8r.xn--846h96596c; ; ; # -𞤨. +xn----ugnx367r.xn--846h96596c; -𞤨‍.󸼄𞳒; [B1, B5, B6, C2, V3, V6]; xn----ugnx367r.xn--846h96596c; ; ; # -𞤨. +ꡏ󠇶≯𳾽。᷽⾇滸𐹰; ꡏ󠇶≯𳾽.᷽舛滸𐹰; [B1, P1, V5, V6]; xn--hdh7483cu6twwki8e.xn--yfg0765a58l0n6k; ; ; # ꡏ≯.᷽舛滸𐹰 +ꡏ󠇶≯𳾽。᷽⾇滸𐹰; ꡏ󠇶≯𳾽.᷽舛滸𐹰; [B1, P1, V5, V6]; xn--hdh7483cu6twwki8e.xn--yfg0765a58l0n6k; ; ; # ꡏ≯.᷽舛滸𐹰 +ꡏ󠇶≯𳾽。᷽舛滸𐹰; ꡏ󠇶≯𳾽.᷽舛滸𐹰; [B1, P1, V5, V6]; xn--hdh7483cu6twwki8e.xn--yfg0765a58l0n6k; ; ; # ꡏ≯.᷽舛滸𐹰 +ꡏ󠇶≯𳾽。᷽舛滸𐹰; ꡏ󠇶≯𳾽.᷽舛滸𐹰; [B1, P1, V5, V6]; xn--hdh7483cu6twwki8e.xn--yfg0765a58l0n6k; ; ; # ꡏ≯.᷽舛滸𐹰 +xn--hdh7483cu6twwki8e.xn--yfg0765a58l0n6k; ꡏ󠇶≯𳾽.᷽舛滸𐹰; [B1, V5, V6]; xn--hdh7483cu6twwki8e.xn--yfg0765a58l0n6k; ; ; # ꡏ≯.᷽舛滸𐹰 +蔏。𑰺; 蔏.𑰺; [V5]; xn--uy1a.xn--jk3d; ; ; # 蔏.𑰺 +蔏。𑰺; 蔏.𑰺; [V5]; xn--uy1a.xn--jk3d; ; ; # 蔏.𑰺 +xn--uy1a.xn--jk3d; 蔏.𑰺; [V5]; xn--uy1a.xn--jk3d; ; ; # 蔏.𑰺 +𝟿𐮋。󠄊; 9𐮋.; [B1]; xn--9-rv5i.; ; ; # 9𐮋. +9𐮋。󠄊; 9𐮋.; [B1]; xn--9-rv5i.; ; ; # 9𐮋. +xn--9-rv5i.; 9𐮋.; [B1]; xn--9-rv5i.; ; ; # 9𐮋. +󟇇-䟖F。ߋ⒈٢; 󟇇-䟖f.ߋ⒈٢; [B4, P1, V6]; xn---f-mz8b08788k.xn--bib53ev44d; ; ; # -䟖f.ߋ⒈٢ +󟇇-䟖F。ߋ1.٢; 󟇇-䟖f.ߋ1.٢; [B1, P1, V6]; xn---f-mz8b08788k.xn--1-ybd.xn--bib; ; ; # -䟖f.ߋ1.٢ +󟇇-䟖f。ߋ1.٢; 󟇇-䟖f.ߋ1.٢; [B1, P1, V6]; xn---f-mz8b08788k.xn--1-ybd.xn--bib; ; ; # -䟖f.ߋ1.٢ +xn---f-mz8b08788k.xn--1-ybd.xn--bib; 󟇇-䟖f.ߋ1.٢; [B1, V6]; xn---f-mz8b08788k.xn--1-ybd.xn--bib; ; ; # -䟖f.ߋ1.٢ +󟇇-䟖f。ߋ⒈٢; 󟇇-䟖f.ߋ⒈٢; [B4, P1, V6]; xn---f-mz8b08788k.xn--bib53ev44d; ; ; # -䟖f.ߋ⒈٢ +xn---f-mz8b08788k.xn--bib53ev44d; 󟇇-䟖f.ߋ⒈٢; [B4, V6]; xn---f-mz8b08788k.xn--bib53ev44d; ; ; # -䟖f.ߋ⒈٢ +‌。𐹺; ‌.𐹺; [B1, C1]; xn--0ug.xn--yo0d; ; .xn--yo0d; [B1, A4_2] # .𐹺 +‌。𐹺; ‌.𐹺; [B1, C1]; xn--0ug.xn--yo0d; ; .xn--yo0d; [B1, A4_2] # .𐹺 +.xn--yo0d; .𐹺; [B1, X4_2]; .xn--yo0d; [B1, A4_2]; ; # .𐹺 +xn--0ug.xn--yo0d; ‌.𐹺; [B1, C1]; xn--0ug.xn--yo0d; ; ; # .𐹺 +𐡆.≯‌-𞥀; ; [B1, C1, P1, V6]; xn--le9c.xn----rgn40iy359e; ; xn--le9c.xn----ogo9956r; [B1, P1, V6] # 𐡆.≯-𞥀 +𐡆.≯‌-𞥀; 𐡆.≯‌-𞥀; [B1, C1, P1, V6]; xn--le9c.xn----rgn40iy359e; ; xn--le9c.xn----ogo9956r; [B1, P1, V6] # 𐡆.≯-𞥀 +𐡆.≯‌-𞤞; 𐡆.≯‌-𞥀; [B1, C1, P1, V6]; xn--le9c.xn----rgn40iy359e; ; xn--le9c.xn----ogo9956r; [B1, P1, V6] # 𐡆.≯-𞥀 +𐡆.≯‌-𞤞; 𐡆.≯‌-𞥀; [B1, C1, P1, V6]; xn--le9c.xn----rgn40iy359e; ; xn--le9c.xn----ogo9956r; [B1, P1, V6] # 𐡆.≯-𞥀 +xn--le9c.xn----ogo9956r; 𐡆.≯-𞥀; [B1, V6]; xn--le9c.xn----ogo9956r; ; ; # 𐡆.≯-𞥀 +xn--le9c.xn----rgn40iy359e; 𐡆.≯‌-𞥀; [B1, C1, V6]; xn--le9c.xn----rgn40iy359e; ; ; # 𐡆.≯-𞥀 +󠁀-。≠ﳗ; 󠁀-.≠هج; [B1, P1, V3, V6]; xn----f411m.xn--rgb7c611j; ; ; # -.≠هج +󠁀-。≠ﳗ; 󠁀-.≠هج; [B1, P1, V3, V6]; xn----f411m.xn--rgb7c611j; ; ; # -.≠هج +󠁀-。≠هج; 󠁀-.≠هج; [B1, P1, V3, V6]; xn----f411m.xn--rgb7c611j; ; ; # -.≠هج +󠁀-。≠هج; 󠁀-.≠هج; [B1, P1, V3, V6]; xn----f411m.xn--rgb7c611j; ; ; # -.≠هج +xn----f411m.xn--rgb7c611j; 󠁀-.≠هج; [B1, V3, V6]; xn----f411m.xn--rgb7c611j; ; ; # -.≠هج +񻬹𑈵。‍𞨶; 񻬹𑈵.‍𞨶; [B1, C2, P1, V6]; xn--8g1d12120a.xn--1ug6651p; ; xn--8g1d12120a.xn--5l6h; [P1, V6] # 𑈵. +xn--8g1d12120a.xn--5l6h; 񻬹𑈵.𞨶; [V6]; xn--8g1d12120a.xn--5l6h; ; ; # 𑈵. +xn--8g1d12120a.xn--1ug6651p; 񻬹𑈵.‍𞨶; [B1, C2, V6]; xn--8g1d12120a.xn--1ug6651p; ; ; # 𑈵. +𑋧꧀2。㧉򒖄; 𑋧꧀2.㧉򒖄; [P1, V5, V6]; xn--2-5z4eu89y.xn--97l02706d; ; ; # 𑋧꧀2.㧉 +𑋧꧀2。㧉򒖄; 𑋧꧀2.㧉򒖄; [P1, V5, V6]; xn--2-5z4eu89y.xn--97l02706d; ; ; # 𑋧꧀2.㧉 +xn--2-5z4eu89y.xn--97l02706d; 𑋧꧀2.㧉򒖄; [V5, V6]; xn--2-5z4eu89y.xn--97l02706d; ; ; # 𑋧꧀2.㧉 +‌𽬄𐹴𞩥。≯6; ‌𽬄𐹴𞩥.≯6; [B1, C1, P1, V6]; xn--0ug7105gf5wfxepq.xn--6-ogo; ; xn--so0du768aim9m.xn--6-ogo; [B1, B5, B6, P1, V6] # 𐹴.≯6 +‌𽬄𐹴𞩥。≯6; ‌𽬄𐹴𞩥.≯6; [B1, C1, P1, V6]; xn--0ug7105gf5wfxepq.xn--6-ogo; ; xn--so0du768aim9m.xn--6-ogo; [B1, B5, B6, P1, V6] # 𐹴.≯6 +xn--so0du768aim9m.xn--6-ogo; 𽬄𐹴𞩥.≯6; [B1, B5, B6, V6]; xn--so0du768aim9m.xn--6-ogo; ; ; # 𐹴.≯6 +xn--0ug7105gf5wfxepq.xn--6-ogo; ‌𽬄𐹴𞩥.≯6; [B1, C1, V6]; xn--0ug7105gf5wfxepq.xn--6-ogo; ; ; # 𐹴.≯6 +𑁿.𐹦𻞵-‍; 𑁿.𐹦𻞵-‍; [B1, B3, B6, C2, P1, V5, V6]; xn--q30d.xn----ugn1088hfsxv; ; xn--q30d.xn----i26i1299n; [B1, B3, B6, P1, V3, V5, V6] # 𑁿.𐹦- +𑁿.𐹦𻞵-‍; ; [B1, B3, B6, C2, P1, V5, V6]; xn--q30d.xn----ugn1088hfsxv; ; xn--q30d.xn----i26i1299n; [B1, B3, B6, P1, V3, V5, V6] # 𑁿.𐹦- +xn--q30d.xn----i26i1299n; 𑁿.𐹦𻞵-; [B1, B3, B6, V3, V5, V6]; xn--q30d.xn----i26i1299n; ; ; # 𑁿.𐹦- +xn--q30d.xn----ugn1088hfsxv; 𑁿.𐹦𻞵-‍; [B1, B3, B6, C2, V5, V6]; xn--q30d.xn----ugn1088hfsxv; ; ; # 𑁿.𐹦- +⤸ς𺱀。ᅠ; ⤸ς𺱀.ᅠ; [P1, V6]; xn--3xa392qmp03d.xn--cl7c; ; xn--4xa192qmp03d.xn--cl7c; # ⤸ς. +⤸ς𺱀。ᅠ; ⤸ς𺱀.ᅠ; [P1, V6]; xn--3xa392qmp03d.xn--psd; ; xn--4xa192qmp03d.xn--psd; # ⤸ς. +⤸Σ𺱀。ᅠ; ⤸σ𺱀.ᅠ; [P1, V6]; xn--4xa192qmp03d.xn--psd; ; ; # ⤸σ. +⤸σ𺱀。ᅠ; ⤸σ𺱀.ᅠ; [P1, V6]; xn--4xa192qmp03d.xn--psd; ; ; # ⤸σ. +xn--4xa192qmp03d.xn--psd; ⤸σ𺱀.ᅠ; [V6]; xn--4xa192qmp03d.xn--psd; ; ; # ⤸σ. +xn--3xa392qmp03d.xn--psd; ⤸ς𺱀.ᅠ; [V6]; xn--3xa392qmp03d.xn--psd; ; ; # ⤸ς. +⤸Σ𺱀。ᅠ; ⤸σ𺱀.ᅠ; [P1, V6]; xn--4xa192qmp03d.xn--cl7c; ; ; # ⤸σ. +⤸σ𺱀。ᅠ; ⤸σ𺱀.ᅠ; [P1, V6]; xn--4xa192qmp03d.xn--cl7c; ; ; # ⤸σ. +xn--4xa192qmp03d.xn--cl7c; ⤸σ𺱀.ᅠ; [V6]; xn--4xa192qmp03d.xn--cl7c; ; ; # ⤸σ. +xn--3xa392qmp03d.xn--cl7c; ⤸ς𺱀.ᅠ; [V6]; xn--3xa392qmp03d.xn--cl7c; ; ; # ⤸ς. +ݥဵ𐫔ە.𐦬𑋪Ⴃ; ; [B2, B3, P1, V6]; xn--llb10as9tqp5y.xn--bnd9168j21f; ; ; # ݥဵ𐫔ە.𐦬𑋪Ⴃ +ݥဵ𐫔ە.𐦬𑋪ⴃ; ; [B2, B3]; xn--llb10as9tqp5y.xn--ukj7371e21f; ; ; # ݥဵ𐫔ە.𐦬𑋪ⴃ +xn--llb10as9tqp5y.xn--ukj7371e21f; ݥဵ𐫔ە.𐦬𑋪ⴃ; [B2, B3]; xn--llb10as9tqp5y.xn--ukj7371e21f; ; ; # ݥဵ𐫔ە.𐦬𑋪ⴃ +xn--llb10as9tqp5y.xn--bnd9168j21f; ݥဵ𐫔ە.𐦬𑋪Ⴃ; [B2, B3, V6]; xn--llb10as9tqp5y.xn--bnd9168j21f; ; ; # ݥဵ𐫔ە.𐦬𑋪Ⴃ +١᭄-킼.᮪ؖ٬≯; ; [B1, B5, B6, P1, V5, V6]; xn----9pc551nk39n.xn--4fb6o571degg; ; ; # ١᭄-킼.᮪ؖ٬≯ +١᭄-킼.᮪ؖ٬≯; ١᭄-킼.᮪ؖ٬≯; [B1, B5, B6, P1, V5, V6]; xn----9pc551nk39n.xn--4fb6o571degg; ; ; # ١᭄-킼.᮪ؖ٬≯ +xn----9pc551nk39n.xn--4fb6o571degg; ١᭄-킼.᮪ؖ٬≯; [B1, B5, B6, V5, V6]; xn----9pc551nk39n.xn--4fb6o571degg; ; ; # ١᭄-킼.᮪ؖ٬≯ +-。ۂ؄򅖡𑓂; -.ۂ؄򅖡𑓂; [B1, B2, B3, P1, V3, V6]; -.xn--mfb39a7208dzgs3d; ; ; # -.ۂ𑓂 +-。ۂ؄򅖡𑓂; -.ۂ؄򅖡𑓂; [B1, B2, B3, P1, V3, V6]; -.xn--mfb39a7208dzgs3d; ; ; # -.ۂ𑓂 +-.xn--mfb39a7208dzgs3d; -.ۂ؄򅖡𑓂; [B1, B2, B3, V3, V6]; -.xn--mfb39a7208dzgs3d; ; ; # -.ۂ𑓂 +‍󯑖󠁐.ֽ𙮰ꡝ𐋡; ‍󯑖󠁐.ֽ𙮰ꡝ𐋡; [C2, P1, V5, V6]; xn--1ug66101lt8me.xn--ldb8734fg0qcyzzg; ; xn--b726ey18m.xn--ldb8734fg0qcyzzg; [P1, V5, V6] # .ֽꡝ𐋡 +‍󯑖󠁐.ֽ𙮰ꡝ𐋡; ; [C2, P1, V5, V6]; xn--1ug66101lt8me.xn--ldb8734fg0qcyzzg; ; xn--b726ey18m.xn--ldb8734fg0qcyzzg; [P1, V5, V6] # .ֽꡝ𐋡 +xn--b726ey18m.xn--ldb8734fg0qcyzzg; 󯑖󠁐.ֽ𙮰ꡝ𐋡; [V5, V6]; xn--b726ey18m.xn--ldb8734fg0qcyzzg; ; ; # .ֽꡝ𐋡 +xn--1ug66101lt8me.xn--ldb8734fg0qcyzzg; ‍󯑖󠁐.ֽ𙮰ꡝ𐋡; [C2, V5, V6]; xn--1ug66101lt8me.xn--ldb8734fg0qcyzzg; ; ; # .ֽꡝ𐋡 +︒􃈵ς񀠇。𐮈; ︒􃈵ς񀠇.𐮈; [B1, P1, V6]; xn--3xa3729jwz5t7gl5f.xn--f29c; ; xn--4xa1729jwz5t7gl5f.xn--f29c; # ︒ς.𐮈 +。􃈵ς񀠇。𐮈; .􃈵ς񀠇.𐮈; [P1, V6, X4_2]; .xn--3xa88573c7n64d.xn--f29c; [P1, V6, A4_2]; .xn--4xa68573c7n64d.xn--f29c; # .ς.𐮈 +。􃈵Σ񀠇。𐮈; .􃈵σ񀠇.𐮈; [P1, V6, X4_2]; .xn--4xa68573c7n64d.xn--f29c; [P1, V6, A4_2]; ; # .σ.𐮈 +。􃈵σ񀠇。𐮈; .􃈵σ񀠇.𐮈; [P1, V6, X4_2]; .xn--4xa68573c7n64d.xn--f29c; [P1, V6, A4_2]; ; # .σ.𐮈 +.xn--4xa68573c7n64d.xn--f29c; .􃈵σ񀠇.𐮈; [V6, X4_2]; .xn--4xa68573c7n64d.xn--f29c; [V6, A4_2]; ; # .σ.𐮈 +.xn--3xa88573c7n64d.xn--f29c; .􃈵ς񀠇.𐮈; [V6, X4_2]; .xn--3xa88573c7n64d.xn--f29c; [V6, A4_2]; ; # .ς.𐮈 +︒􃈵Σ񀠇。𐮈; ︒􃈵σ񀠇.𐮈; [B1, P1, V6]; xn--4xa1729jwz5t7gl5f.xn--f29c; ; ; # ︒σ.𐮈 +︒􃈵σ񀠇。𐮈; ︒􃈵σ񀠇.𐮈; [B1, P1, V6]; xn--4xa1729jwz5t7gl5f.xn--f29c; ; ; # ︒σ.𐮈 +xn--4xa1729jwz5t7gl5f.xn--f29c; ︒􃈵σ񀠇.𐮈; [B1, V6]; xn--4xa1729jwz5t7gl5f.xn--f29c; ; ; # ︒σ.𐮈 +xn--3xa3729jwz5t7gl5f.xn--f29c; ︒􃈵ς񀠇.𐮈; [B1, V6]; xn--3xa3729jwz5t7gl5f.xn--f29c; ; ; # ︒ς.𐮈 +ߙ.ۮ󆾃≯󠅲; ߙ.ۮ󆾃≯; [B2, B3, P1, V6]; xn--0sb.xn--bmb691l0524t; ; ; # ߙ.ۮ≯ +ߙ.ۮ󆾃≯󠅲; ߙ.ۮ󆾃≯; [B2, B3, P1, V6]; xn--0sb.xn--bmb691l0524t; ; ; # ߙ.ۮ≯ +ߙ.ۮ󆾃≯󠅲; ߙ.ۮ󆾃≯; [B2, B3, P1, V6]; xn--0sb.xn--bmb691l0524t; ; ; # ߙ.ۮ≯ +ߙ.ۮ󆾃≯󠅲; ߙ.ۮ󆾃≯; [B2, B3, P1, V6]; xn--0sb.xn--bmb691l0524t; ; ; # ߙ.ۮ≯ +xn--0sb.xn--bmb691l0524t; ߙ.ۮ󆾃≯; [B2, B3, V6]; xn--0sb.xn--bmb691l0524t; ; ; # ߙ.ۮ≯ +ᩳ󚙸.𐭍; ; [B1, P1, V5, V6]; xn--2of22352n.xn--q09c; ; ; # ᩳ.𐭍 +xn--2of22352n.xn--q09c; ᩳ󚙸.𐭍; [B1, V5, V6]; xn--2of22352n.xn--q09c; ; ; # ᩳ.𐭍 +⒉󠊓≠。Ⴟ⬣Ⴈ; ⒉󠊓≠.Ⴟ⬣Ⴈ; [P1, V6]; xn--1ch07f91401d.xn--gnd9b297j; ; ; # ⒉≠.Ⴟ⬣Ⴈ +⒉󠊓≠。Ⴟ⬣Ⴈ; ⒉󠊓≠.Ⴟ⬣Ⴈ; [P1, V6]; xn--1ch07f91401d.xn--gnd9b297j; ; ; # ⒉≠.Ⴟ⬣Ⴈ +2.󠊓≠。Ⴟ⬣Ⴈ; 2.󠊓≠.Ⴟ⬣Ⴈ; [P1, V6]; 2.xn--1chz4101l.xn--gnd9b297j; ; ; # 2.≠.Ⴟ⬣Ⴈ +2.󠊓≠。Ⴟ⬣Ⴈ; 2.󠊓≠.Ⴟ⬣Ⴈ; [P1, V6]; 2.xn--1chz4101l.xn--gnd9b297j; ; ; # 2.≠.Ⴟ⬣Ⴈ +2.󠊓≠。ⴟ⬣ⴈ; 2.󠊓≠.ⴟ⬣ⴈ; [P1, V6]; 2.xn--1chz4101l.xn--45iz7d6b; ; ; # 2.≠.ⴟ⬣ⴈ +2.󠊓≠。ⴟ⬣ⴈ; 2.󠊓≠.ⴟ⬣ⴈ; [P1, V6]; 2.xn--1chz4101l.xn--45iz7d6b; ; ; # 2.≠.ⴟ⬣ⴈ +2.xn--1chz4101l.xn--45iz7d6b; 2.󠊓≠.ⴟ⬣ⴈ; [V6]; 2.xn--1chz4101l.xn--45iz7d6b; ; ; # 2.≠.ⴟ⬣ⴈ +2.xn--1chz4101l.xn--gnd9b297j; 2.󠊓≠.Ⴟ⬣Ⴈ; [V6]; 2.xn--1chz4101l.xn--gnd9b297j; ; ; # 2.≠.Ⴟ⬣Ⴈ +⒉󠊓≠。ⴟ⬣ⴈ; ⒉󠊓≠.ⴟ⬣ⴈ; [P1, V6]; xn--1ch07f91401d.xn--45iz7d6b; ; ; # ⒉≠.ⴟ⬣ⴈ +⒉󠊓≠。ⴟ⬣ⴈ; ⒉󠊓≠.ⴟ⬣ⴈ; [P1, V6]; xn--1ch07f91401d.xn--45iz7d6b; ; ; # ⒉≠.ⴟ⬣ⴈ +xn--1ch07f91401d.xn--45iz7d6b; ⒉󠊓≠.ⴟ⬣ⴈ; [V6]; xn--1ch07f91401d.xn--45iz7d6b; ; ; # ⒉≠.ⴟ⬣ⴈ +xn--1ch07f91401d.xn--gnd9b297j; ⒉󠊓≠.Ⴟ⬣Ⴈ; [V6]; xn--1ch07f91401d.xn--gnd9b297j; ; ; # ⒉≠.Ⴟ⬣Ⴈ +-󠉱ྸჅ。-𐹽ݴ𞣑; -󠉱ྸჅ.-𐹽ݴ𞣑; [B1, P1, V3, V6]; xn----xmg12fm2555h.xn----05c4213ryr0g; ; ; # -ྸჅ.-𐹽ݴ𞣑 +-󠉱ྸⴥ。-𐹽ݴ𞣑; -󠉱ྸⴥ.-𐹽ݴ𞣑; [B1, P1, V3, V6]; xn----xmg317tgv352a.xn----05c4213ryr0g; ; ; # -ྸⴥ.-𐹽ݴ𞣑 +xn----xmg317tgv352a.xn----05c4213ryr0g; -󠉱ྸⴥ.-𐹽ݴ𞣑; [B1, V3, V6]; xn----xmg317tgv352a.xn----05c4213ryr0g; ; ; # -ྸⴥ.-𐹽ݴ𞣑 +xn----xmg12fm2555h.xn----05c4213ryr0g; -󠉱ྸჅ.-𐹽ݴ𞣑; [B1, V3, V6]; xn----xmg12fm2555h.xn----05c4213ryr0g; ; ; # -ྸჅ.-𐹽ݴ𞣑 +ٙ。𑄴︒اߝ; ٙ.𑄴︒اߝ; [B1, B3, B6, P1, V5, V6]; xn--1hb.xn--mgb09fp820c08pa; ; ; # ٙ.𑄴︒اߝ +ٙ。𑄴。اߝ; ٙ.𑄴.اߝ; [B1, B3, B6, V5]; xn--1hb.xn--w80d.xn--mgb09f; ; ; # ٙ.𑄴.اߝ +xn--1hb.xn--w80d.xn--mgb09f; ٙ.𑄴.اߝ; [B1, B3, B6, V5]; xn--1hb.xn--w80d.xn--mgb09f; ; ; # ٙ.𑄴.اߝ +xn--1hb.xn--mgb09fp820c08pa; ٙ.𑄴︒اߝ; [B1, B3, B6, V5, V6]; xn--1hb.xn--mgb09fp820c08pa; ; ; # ٙ.𑄴︒اߝ +Ⴙظ.󠆓‍; Ⴙظ.‍; [B1, B5, B6, C2, P1, V6]; xn--3gb194c.xn--1ug; ; xn--3gb194c.; [B5, B6, P1, V6] # Ⴙظ. +ⴙظ.󠆓‍; ⴙظ.‍; [B1, B5, B6, C2]; xn--3gb910r.xn--1ug; ; xn--3gb910r.; [B5, B6] # ⴙظ. +xn--3gb910r.; ⴙظ.; [B5, B6]; xn--3gb910r.; ; ; # ⴙظ. +xn--3gb910r.xn--1ug; ⴙظ.‍; [B1, B5, B6, C2]; xn--3gb910r.xn--1ug; ; ; # ⴙظ. +xn--3gb194c.; Ⴙظ.; [B5, B6, V6]; xn--3gb194c.; ; ; # Ⴙظ. +xn--3gb194c.xn--1ug; Ⴙظ.‍; [B1, B5, B6, C2, V6]; xn--3gb194c.xn--1ug; ; ; # Ⴙظ. +󠆸。₆0𐺧ݖ; .60𐺧ݖ; [B1, P1, V6, X4_2]; .xn--60-cke9470y; [B1, P1, V6, A4_2]; ; # .60𐺧ݖ +󠆸。60𐺧ݖ; .60𐺧ݖ; [B1, P1, V6, X4_2]; .xn--60-cke9470y; [B1, P1, V6, A4_2]; ; # .60𐺧ݖ +.xn--60-cke9470y; .60𐺧ݖ; [B1, V6, X4_2]; .xn--60-cke9470y; [B1, V6, A4_2]; ; # .60𐺧ݖ +6ࡏ。-𑈴; 6ࡏ.-𑈴; [B1, V3]; xn--6-jjd.xn----6n8i; ; ; # 6ࡏ.-𑈴 +6ࡏ。-𑈴; 6ࡏ.-𑈴; [B1, V3]; xn--6-jjd.xn----6n8i; ; ; # 6ࡏ.-𑈴 +xn--6-jjd.xn----6n8i; 6ࡏ.-𑈴; [B1, V3]; xn--6-jjd.xn----6n8i; ; ; # 6ࡏ.-𑈴 +‍񋌿𐹰。્ς𞰎ࣖ; ‍񋌿𐹰.્ς𞰎ࣖ; [B1, C2, P1, V5, V6]; xn--1ugx105gq26y.xn--3xa41xcwbfz15g; ; xn--oo0d1330n.xn--4xa21xcwbfz15g; [B1, B5, B6, P1, V5, V6] # 𐹰.્ςࣖ +‍񋌿𐹰。્ς𞰎ࣖ; ‍񋌿𐹰.્ς𞰎ࣖ; [B1, C2, P1, V5, V6]; xn--1ugx105gq26y.xn--3xa41xcwbfz15g; ; xn--oo0d1330n.xn--4xa21xcwbfz15g; [B1, B5, B6, P1, V5, V6] # 𐹰.્ςࣖ +‍񋌿𐹰。્Σ𞰎ࣖ; ‍񋌿𐹰.્σ𞰎ࣖ; [B1, C2, P1, V5, V6]; xn--1ugx105gq26y.xn--4xa21xcwbfz15g; ; xn--oo0d1330n.xn--4xa21xcwbfz15g; [B1, B5, B6, P1, V5, V6] # 𐹰.્σࣖ +‍񋌿𐹰。્σ𞰎ࣖ; ‍񋌿𐹰.્σ𞰎ࣖ; [B1, C2, P1, V5, V6]; xn--1ugx105gq26y.xn--4xa21xcwbfz15g; ; xn--oo0d1330n.xn--4xa21xcwbfz15g; [B1, B5, B6, P1, V5, V6] # 𐹰.્σࣖ +xn--oo0d1330n.xn--4xa21xcwbfz15g; 񋌿𐹰.્σ𞰎ࣖ; [B1, B5, B6, V5, V6]; xn--oo0d1330n.xn--4xa21xcwbfz15g; ; ; # 𐹰.્σࣖ +xn--1ugx105gq26y.xn--4xa21xcwbfz15g; ‍񋌿𐹰.્σ𞰎ࣖ; [B1, C2, V5, V6]; xn--1ugx105gq26y.xn--4xa21xcwbfz15g; ; ; # 𐹰.્σࣖ +xn--1ugx105gq26y.xn--3xa41xcwbfz15g; ‍񋌿𐹰.્ς𞰎ࣖ; [B1, C2, V5, V6]; xn--1ugx105gq26y.xn--3xa41xcwbfz15g; ; ; # 𐹰.્ςࣖ +‍񋌿𐹰。્Σ𞰎ࣖ; ‍񋌿𐹰.્σ𞰎ࣖ; [B1, C2, P1, V5, V6]; xn--1ugx105gq26y.xn--4xa21xcwbfz15g; ; xn--oo0d1330n.xn--4xa21xcwbfz15g; [B1, B5, B6, P1, V5, V6] # 𐹰.્σࣖ +‍񋌿𐹰。્σ𞰎ࣖ; ‍񋌿𐹰.્σ𞰎ࣖ; [B1, C2, P1, V5, V6]; xn--1ugx105gq26y.xn--4xa21xcwbfz15g; ; xn--oo0d1330n.xn--4xa21xcwbfz15g; [B1, B5, B6, P1, V5, V6] # 𐹰.્σࣖ +⒈񟄜Ⴓ⒪.්򘘶ࢋ𐹢; ⒈񟄜Ⴓ⒪.්򘘶ࢋ𐹢; [B1, P1, V5, V6]; xn--rnd762h7cx3027d.xn--3xb99xpx1yoes3e; ; ; # ⒈Ⴓ⒪.්𐹢 +1.񟄜Ⴓ(o).්򘘶ࢋ𐹢; ; [B1, B6, P1, V5, V6]; 1.xn--(o)-7sn88849j.xn--3xb99xpx1yoes3e; ; ; # 1.Ⴓ(o).්𐹢 +1.񟄜ⴓ(o).්򘘶ࢋ𐹢; ; [B1, B6, P1, V5, V6]; 1.xn--(o)-ej1bu5389e.xn--3xb99xpx1yoes3e; ; ; # 1.ⴓ(o).්𐹢 +1.񟄜Ⴓ(O).්򘘶ࢋ𐹢; 1.񟄜Ⴓ(o).්򘘶ࢋ𐹢; [B1, B6, P1, V5, V6]; 1.xn--(o)-7sn88849j.xn--3xb99xpx1yoes3e; ; ; # 1.Ⴓ(o).්𐹢 +1.xn--(o)-7sn88849j.xn--3xb99xpx1yoes3e; 1.񟄜Ⴓ(o).්򘘶ࢋ𐹢; [B1, B6, P1, V5, V6]; 1.xn--(o)-7sn88849j.xn--3xb99xpx1yoes3e; ; ; # 1.Ⴓ(o).්𐹢 +1.xn--(o)-ej1bu5389e.xn--3xb99xpx1yoes3e; 1.񟄜ⴓ(o).්򘘶ࢋ𐹢; [B1, B6, P1, V5, V6]; 1.xn--(o)-ej1bu5389e.xn--3xb99xpx1yoes3e; ; ; # 1.ⴓ(o).්𐹢 +⒈񟄜ⴓ⒪.්򘘶ࢋ𐹢; ⒈񟄜ⴓ⒪.්򘘶ࢋ𐹢; [B1, P1, V5, V6]; xn--tsh0ds63atl31n.xn--3xb99xpx1yoes3e; ; ; # ⒈ⴓ⒪.්𐹢 +xn--tsh0ds63atl31n.xn--3xb99xpx1yoes3e; ⒈񟄜ⴓ⒪.්򘘶ࢋ𐹢; [B1, V5, V6]; xn--tsh0ds63atl31n.xn--3xb99xpx1yoes3e; ; ; # ⒈ⴓ⒪.්𐹢 +xn--rnd762h7cx3027d.xn--3xb99xpx1yoes3e; ⒈񟄜Ⴓ⒪.්򘘶ࢋ𐹢; [B1, V5, V6]; xn--rnd762h7cx3027d.xn--3xb99xpx1yoes3e; ; ; # ⒈Ⴓ⒪.්𐹢 +𞤷.𐮐𞢁𐹠ؤ; ; ; xn--ve6h.xn--jgb1694kz0b2176a; ; ; # 𞤷.𐮐𞢁𐹠ؤ +𞤷.𐮐𞢁𐹠ؤ; 𞤷.𐮐𞢁𐹠ؤ; ; xn--ve6h.xn--jgb1694kz0b2176a; ; ; # 𞤷.𐮐𞢁𐹠ؤ +𞤕.𐮐𞢁𐹠ؤ; 𞤷.𐮐𞢁𐹠ؤ; ; xn--ve6h.xn--jgb1694kz0b2176a; ; ; # 𞤷.𐮐𞢁𐹠ؤ +𞤕.𐮐𞢁𐹠ؤ; 𞤷.𐮐𞢁𐹠ؤ; ; xn--ve6h.xn--jgb1694kz0b2176a; ; ; # 𞤷.𐮐𞢁𐹠ؤ +xn--ve6h.xn--jgb1694kz0b2176a; 𞤷.𐮐𞢁𐹠ؤ; ; xn--ve6h.xn--jgb1694kz0b2176a; ; ; # 𞤷.𐮐𞢁𐹠ؤ +𐲈-。𑄳񢌻; 𐳈-.𑄳񢌻; [B1, B3, P1, V3, V5, V6]; xn----ue6i.xn--v80d6662t; ; ; # 𐳈-.𑄳 +𐲈-。𑄳񢌻; 𐳈-.𑄳񢌻; [B1, B3, P1, V3, V5, V6]; xn----ue6i.xn--v80d6662t; ; ; # 𐳈-.𑄳 +𐳈-。𑄳񢌻; 𐳈-.𑄳񢌻; [B1, B3, P1, V3, V5, V6]; xn----ue6i.xn--v80d6662t; ; ; # 𐳈-.𑄳 +xn----ue6i.xn--v80d6662t; 𐳈-.𑄳񢌻; [B1, B3, V3, V5, V6]; xn----ue6i.xn--v80d6662t; ; ; # 𐳈-.𑄳 +𐳈-。𑄳񢌻; 𐳈-.𑄳񢌻; [B1, B3, P1, V3, V5, V6]; xn----ue6i.xn--v80d6662t; ; ; # 𐳈-.𑄳 +-󠉖ꡧ.󠊂񇆃🄉; -󠉖ꡧ.󠊂񇆃🄉; [P1, V3, V6]; xn----hg4ei0361g.xn--207ht163h7m94c; ; ; # -ꡧ.🄉 +-󠉖ꡧ.󠊂񇆃8,; ; [P1, V3, V6]; xn----hg4ei0361g.xn--8,-k362evu488a; ; ; # -ꡧ.8, +xn----hg4ei0361g.xn--8,-k362evu488a; -󠉖ꡧ.󠊂񇆃8,; [P1, V3, V6]; xn----hg4ei0361g.xn--8,-k362evu488a; ; ; # -ꡧ.8, +xn----hg4ei0361g.xn--207ht163h7m94c; -󠉖ꡧ.󠊂񇆃🄉; [V3, V6]; xn----hg4ei0361g.xn--207ht163h7m94c; ; ; # -ꡧ.🄉 +󠾛󠈴臯𧔤.ݨ𝟝; 󠾛󠈴臯𧔤.ݨ5; [B1, P1, V6]; xn--zb1at733hm579ddhla.xn--5-b5c; ; ; # 臯𧔤.ݨ5 +󠾛󠈴臯𧔤.ݨ5; ; [B1, P1, V6]; xn--zb1at733hm579ddhla.xn--5-b5c; ; ; # 臯𧔤.ݨ5 +xn--zb1at733hm579ddhla.xn--5-b5c; 󠾛󠈴臯𧔤.ݨ5; [B1, V6]; xn--zb1at733hm579ddhla.xn--5-b5c; ; ; # 臯𧔤.ݨ5 +≮𐹣.𝨿; ≮𐹣.𝨿; [B1, B3, B6, P1, V5, V6]; xn--gdh1504g.xn--e92h; ; ; # ≮𐹣.𝨿 +≮𐹣.𝨿; ≮𐹣.𝨿; [B1, B3, B6, P1, V5, V6]; xn--gdh1504g.xn--e92h; ; ; # ≮𐹣.𝨿 +≮𐹣.𝨿; ; [B1, B3, B6, P1, V5, V6]; xn--gdh1504g.xn--e92h; ; ; # ≮𐹣.𝨿 +≮𐹣.𝨿; ≮𐹣.𝨿; [B1, B3, B6, P1, V5, V6]; xn--gdh1504g.xn--e92h; ; ; # ≮𐹣.𝨿 +xn--gdh1504g.xn--e92h; ≮𐹣.𝨿; [B1, B3, B6, V5, V6]; xn--gdh1504g.xn--e92h; ; ; # ≮𐹣.𝨿 +𐹯ᯛ੍。脥; 𐹯ᯛ੍.脥; [B1]; xn--ybc101g3m1p.xn--740a; ; ; # 𐹯ᯛ੍.脥 +𐹯ᯛ੍。脥; 𐹯ᯛ੍.脥; [B1]; xn--ybc101g3m1p.xn--740a; ; ; # 𐹯ᯛ੍.脥 +xn--ybc101g3m1p.xn--740a; 𐹯ᯛ੍.脥; [B1]; xn--ybc101g3m1p.xn--740a; ; ; # 𐹯ᯛ੍.脥 +᭄ᅟ𞷿򃀍.-; ; [B1, B5, P1, V3, V5, V6]; xn--osd971cpx70btgt8b.-; ; ; # ᭄.- +xn--osd971cpx70btgt8b.-; ᭄ᅟ𞷿򃀍.-; [B1, B5, V3, V5, V6]; xn--osd971cpx70btgt8b.-; ; ; # ᭄.- +‌。͔; ‌.͔; [C1, V5]; xn--0ug.xn--yua; ; .xn--yua; [V5, A4_2] # .͔ +‌。͔; ‌.͔; [C1, V5]; xn--0ug.xn--yua; ; .xn--yua; [V5, A4_2] # .͔ +.xn--yua; .͔; [V5, X4_2]; .xn--yua; [V5, A4_2]; ; # .͔ +xn--0ug.xn--yua; ‌.͔; [C1, V5]; xn--0ug.xn--yua; ; ; # .͔ +𞤥󠅮.ᡄႮ; 𞤥.ᡄႮ; [P1, V6]; xn--de6h.xn--mnd799a; ; ; # 𞤥.ᡄႮ +𞤥󠅮.ᡄႮ; 𞤥.ᡄႮ; [P1, V6]; xn--de6h.xn--mnd799a; ; ; # 𞤥.ᡄႮ +𞤥󠅮.ᡄⴎ; 𞤥.ᡄⴎ; ; xn--de6h.xn--37e857h; ; ; # 𞤥.ᡄⴎ +𞤃󠅮.ᡄႮ; 𞤥.ᡄႮ; [P1, V6]; xn--de6h.xn--mnd799a; ; ; # 𞤥.ᡄႮ +𞤃󠅮.ᡄⴎ; 𞤥.ᡄⴎ; ; xn--de6h.xn--37e857h; ; ; # 𞤥.ᡄⴎ +xn--de6h.xn--37e857h; 𞤥.ᡄⴎ; ; xn--de6h.xn--37e857h; ; ; # 𞤥.ᡄⴎ +𞤥.ᡄⴎ; ; ; xn--de6h.xn--37e857h; ; ; # 𞤥.ᡄⴎ +𞤃.ᡄႮ; 𞤥.ᡄႮ; [P1, V6]; xn--de6h.xn--mnd799a; ; ; # 𞤥.ᡄႮ +𞤃.ᡄⴎ; 𞤥.ᡄⴎ; ; xn--de6h.xn--37e857h; ; ; # 𞤥.ᡄⴎ +xn--de6h.xn--mnd799a; 𞤥.ᡄႮ; [V6]; xn--de6h.xn--mnd799a; ; ; # 𞤥.ᡄႮ +𞤥󠅮.ᡄⴎ; 𞤥.ᡄⴎ; ; xn--de6h.xn--37e857h; ; ; # 𞤥.ᡄⴎ +𞤃󠅮.ᡄႮ; 𞤥.ᡄႮ; [P1, V6]; xn--de6h.xn--mnd799a; ; ; # 𞤥.ᡄႮ +𞤃󠅮.ᡄⴎ; 𞤥.ᡄⴎ; ; xn--de6h.xn--37e857h; ; ; # 𞤥.ᡄⴎ +𞤥.ᡄႮ; ; [P1, V6]; xn--de6h.xn--mnd799a; ; ; # 𞤥.ᡄႮ +𞤧𝨨Ξ.𪺏㛨❸; 𞤧𝨨ξ.𪺏㛨❸; [B2, B3, B6]; xn--zxa5691vboja.xn--bfi293ci119b; ; ; # 𞤧𝨨ξ.𪺏㛨❸ +𞤧𝨨Ξ.𪺏㛨❸; 𞤧𝨨ξ.𪺏㛨❸; [B2, B3, B6]; xn--zxa5691vboja.xn--bfi293ci119b; ; ; # 𞤧𝨨ξ.𪺏㛨❸ +𞤧𝨨ξ.𪺏㛨❸; ; [B2, B3, B6]; xn--zxa5691vboja.xn--bfi293ci119b; ; ; # 𞤧𝨨ξ.𪺏㛨❸ +𞤅𝨨Ξ.𪺏㛨❸; 𞤧𝨨ξ.𪺏㛨❸; [B2, B3, B6]; xn--zxa5691vboja.xn--bfi293ci119b; ; ; # 𞤧𝨨ξ.𪺏㛨❸ +𞤅𝨨ξ.𪺏㛨❸; 𞤧𝨨ξ.𪺏㛨❸; [B2, B3, B6]; xn--zxa5691vboja.xn--bfi293ci119b; ; ; # 𞤧𝨨ξ.𪺏㛨❸ +xn--zxa5691vboja.xn--bfi293ci119b; 𞤧𝨨ξ.𪺏㛨❸; [B2, B3, B6]; xn--zxa5691vboja.xn--bfi293ci119b; ; ; # 𞤧𝨨ξ.𪺏㛨❸ +𞤧𝨨ξ.𪺏㛨❸; 𞤧𝨨ξ.𪺏㛨❸; [B2, B3, B6]; xn--zxa5691vboja.xn--bfi293ci119b; ; ; # 𞤧𝨨ξ.𪺏㛨❸ +𞤅𝨨Ξ.𪺏㛨❸; 𞤧𝨨ξ.𪺏㛨❸; [B2, B3, B6]; xn--zxa5691vboja.xn--bfi293ci119b; ; ; # 𞤧𝨨ξ.𪺏㛨❸ +𞤅𝨨ξ.𪺏㛨❸; 𞤧𝨨ξ.𪺏㛨❸; [B2, B3, B6]; xn--zxa5691vboja.xn--bfi293ci119b; ; ; # 𞤧𝨨ξ.𪺏㛨❸ +᠆몆‌-。Ⴛ𐦅︒; ᠆몆‌-.Ⴛ𐦅︒; [B1, B5, B6, C1, P1, V3, V6]; xn----e3j425bsk1o.xn--znd2362jhgh; ; xn----e3j6620g.xn--znd2362jhgh; [B1, B5, B6, P1, V3, V6] # ᠆몆-.Ⴛ𐦅︒ +᠆몆‌-。Ⴛ𐦅︒; ᠆몆‌-.Ⴛ𐦅︒; [B1, B5, B6, C1, P1, V3, V6]; xn----e3j425bsk1o.xn--znd2362jhgh; ; xn----e3j6620g.xn--znd2362jhgh; [B1, B5, B6, P1, V3, V6] # ᠆몆-.Ⴛ𐦅︒ +᠆몆‌-。Ⴛ𐦅。; ᠆몆‌-.Ⴛ𐦅.; [B1, B5, B6, C1, P1, V3, V6]; xn----e3j425bsk1o.xn--znd4948j.; ; xn----e3j6620g.xn--znd4948j.; [B1, B5, B6, P1, V3, V6] # ᠆몆-.Ⴛ𐦅. +᠆몆‌-。Ⴛ𐦅。; ᠆몆‌-.Ⴛ𐦅.; [B1, B5, B6, C1, P1, V3, V6]; xn----e3j425bsk1o.xn--znd4948j.; ; xn----e3j6620g.xn--znd4948j.; [B1, B5, B6, P1, V3, V6] # ᠆몆-.Ⴛ𐦅. +᠆몆‌-。ⴛ𐦅。; ᠆몆‌-.ⴛ𐦅.; [B1, B5, B6, C1, P1, V3, V6]; xn----e3j425bsk1o.xn--jlju661e.; ; xn----e3j6620g.xn--jlju661e.; [B1, B5, B6, P1, V3, V6] # ᠆몆-.ⴛ𐦅. +᠆몆‌-。ⴛ𐦅。; ᠆몆‌-.ⴛ𐦅.; [B1, B5, B6, C1, P1, V3, V6]; xn----e3j425bsk1o.xn--jlju661e.; ; xn----e3j6620g.xn--jlju661e.; [B1, B5, B6, P1, V3, V6] # ᠆몆-.ⴛ𐦅. +xn----e3j6620g.xn--jlju661e.; ᠆몆-.ⴛ𐦅.; [B1, B5, B6, V3, V6]; xn----e3j6620g.xn--jlju661e.; ; ; # ᠆몆-.ⴛ𐦅. +xn----e3j425bsk1o.xn--jlju661e.; ᠆몆‌-.ⴛ𐦅.; [B1, B5, B6, C1, V3, V6]; xn----e3j425bsk1o.xn--jlju661e.; ; ; # ᠆몆-.ⴛ𐦅. +xn----e3j6620g.xn--znd4948j.; ᠆몆-.Ⴛ𐦅.; [B1, B5, B6, V3, V6]; xn----e3j6620g.xn--znd4948j.; ; ; # ᠆몆-.Ⴛ𐦅. +xn----e3j425bsk1o.xn--znd4948j.; ᠆몆‌-.Ⴛ𐦅.; [B1, B5, B6, C1, V3, V6]; xn----e3j425bsk1o.xn--znd4948j.; ; ; # ᠆몆-.Ⴛ𐦅. +᠆몆‌-。ⴛ𐦅︒; ᠆몆‌-.ⴛ𐦅︒; [B1, B5, B6, C1, P1, V3, V6]; xn----e3j425bsk1o.xn--jlj4997dhgh; ; xn----e3j6620g.xn--jlj4997dhgh; [B1, B5, B6, P1, V3, V6] # ᠆몆-.ⴛ𐦅︒ +᠆몆‌-。ⴛ𐦅︒; ᠆몆‌-.ⴛ𐦅︒; [B1, B5, B6, C1, P1, V3, V6]; xn----e3j425bsk1o.xn--jlj4997dhgh; ; xn----e3j6620g.xn--jlj4997dhgh; [B1, B5, B6, P1, V3, V6] # ᠆몆-.ⴛ𐦅︒ +xn----e3j6620g.xn--jlj4997dhgh; ᠆몆-.ⴛ𐦅︒; [B1, B5, B6, V3, V6]; xn----e3j6620g.xn--jlj4997dhgh; ; ; # ᠆몆-.ⴛ𐦅︒ +xn----e3j425bsk1o.xn--jlj4997dhgh; ᠆몆‌-.ⴛ𐦅︒; [B1, B5, B6, C1, V3, V6]; xn----e3j425bsk1o.xn--jlj4997dhgh; ; ; # ᠆몆-.ⴛ𐦅︒ +xn----e3j6620g.xn--znd2362jhgh; ᠆몆-.Ⴛ𐦅︒; [B1, B5, B6, V3, V6]; xn----e3j6620g.xn--znd2362jhgh; ; ; # ᠆몆-.Ⴛ𐦅︒ +xn----e3j425bsk1o.xn--znd2362jhgh; ᠆몆‌-.Ⴛ𐦅︒; [B1, B5, B6, C1, V3, V6]; xn----e3j425bsk1o.xn--znd2362jhgh; ; ; # ᠆몆-.Ⴛ𐦅︒ +󠾳.︒⥱‌𐹬; ; [B1, C1, P1, V6]; xn--uf66e.xn--0ugz28axl3pqxna; ; xn--uf66e.xn--qtiz073e3ik; [B1, P1, V6] # .︒⥱𐹬 +󠾳.。⥱‌𐹬; 󠾳..⥱‌𐹬; [B1, C1, P1, V6, X4_2]; xn--uf66e..xn--0ugz28as66q; [B1, C1, P1, V6, A4_2]; xn--uf66e..xn--qti2829e; [B1, P1, V6, A4_2] # ..⥱𐹬 +xn--uf66e..xn--qti2829e; 󠾳..⥱𐹬; [B1, V6, X4_2]; xn--uf66e..xn--qti2829e; [B1, V6, A4_2]; ; # ..⥱𐹬 +xn--uf66e..xn--0ugz28as66q; 󠾳..⥱‌𐹬; [B1, C1, V6, X4_2]; xn--uf66e..xn--0ugz28as66q; [B1, C1, V6, A4_2]; ; # ..⥱𐹬 +xn--uf66e.xn--qtiz073e3ik; 󠾳.︒⥱𐹬; [B1, V6]; xn--uf66e.xn--qtiz073e3ik; ; ; # .︒⥱𐹬 +xn--uf66e.xn--0ugz28axl3pqxna; 󠾳.︒⥱‌𐹬; [B1, C1, V6]; xn--uf66e.xn--0ugz28axl3pqxna; ; ; # .︒⥱𐹬 +𐯖.𐹠Ⴑ񚇜𐫊; ; [B1, P1, V6]; xn--n49c.xn--pnd4619jwicl862o; ; ; # .𐹠Ⴑ𐫊 +𐯖.𐹠ⴑ񚇜𐫊; ; [B1, P1, V6]; xn--n49c.xn--8kj8702ewicl862o; ; ; # .𐹠ⴑ𐫊 +xn--n49c.xn--8kj8702ewicl862o; 𐯖.𐹠ⴑ񚇜𐫊; [B1, V6]; xn--n49c.xn--8kj8702ewicl862o; ; ; # .𐹠ⴑ𐫊 +xn--n49c.xn--pnd4619jwicl862o; 𐯖.𐹠Ⴑ񚇜𐫊; [B1, V6]; xn--n49c.xn--pnd4619jwicl862o; ; ; # .𐹠Ⴑ𐫊 +ྤ񱤯.𝟭Ⴛ; ྤ񱤯.1Ⴛ; [P1, V5, V6]; xn--0fd40533g.xn--1-q1g; ; ; # ྤ.1Ⴛ +ྤ񱤯.1Ⴛ; ; [P1, V5, V6]; xn--0fd40533g.xn--1-q1g; ; ; # ྤ.1Ⴛ +ྤ񱤯.1ⴛ; ; [P1, V5, V6]; xn--0fd40533g.xn--1-tws; ; ; # ྤ.1ⴛ +xn--0fd40533g.xn--1-tws; ྤ񱤯.1ⴛ; [V5, V6]; xn--0fd40533g.xn--1-tws; ; ; # ྤ.1ⴛ +xn--0fd40533g.xn--1-q1g; ྤ񱤯.1Ⴛ; [V5, V6]; xn--0fd40533g.xn--1-q1g; ; ; # ྤ.1Ⴛ +ྤ񱤯.𝟭ⴛ; ྤ񱤯.1ⴛ; [P1, V5, V6]; xn--0fd40533g.xn--1-tws; ; ; # ྤ.1ⴛ +-ࠦ齀。릿𐸋; -ࠦ齀.릿𐸋; [B1, B5, B6, P1, V3, V6]; xn----6gd0617i.xn--7y2bm55m; ; ; # -ࠦ齀.릿 +-ࠦ齀。릿𐸋; -ࠦ齀.릿𐸋; [B1, B5, B6, P1, V3, V6]; xn----6gd0617i.xn--7y2bm55m; ; ; # -ࠦ齀.릿 +xn----6gd0617i.xn--7y2bm55m; -ࠦ齀.릿𐸋; [B1, B5, B6, V3, V6]; xn----6gd0617i.xn--7y2bm55m; ; ; # -ࠦ齀.릿 +󠔊ܜ鹝꾗。񾵐‍‍⏃; 󠔊ܜ鹝꾗.񾵐‍‍⏃; [B1, B6, C2, P1, V6]; xn--mnb6558e91kyq533a.xn--1uga46zs309y; ; xn--mnb6558e91kyq533a.xn--6mh27269e; [B1, B6, P1, V6] # ܜ鹝꾗.⏃ +󠔊ܜ鹝꾗。񾵐‍‍⏃; 󠔊ܜ鹝꾗.񾵐‍‍⏃; [B1, B6, C2, P1, V6]; xn--mnb6558e91kyq533a.xn--1uga46zs309y; ; xn--mnb6558e91kyq533a.xn--6mh27269e; [B1, B6, P1, V6] # ܜ鹝꾗.⏃ +xn--mnb6558e91kyq533a.xn--6mh27269e; 󠔊ܜ鹝꾗.񾵐⏃; [B1, B6, V6]; xn--mnb6558e91kyq533a.xn--6mh27269e; ; ; # ܜ鹝꾗.⏃ +xn--mnb6558e91kyq533a.xn--1uga46zs309y; 󠔊ܜ鹝꾗.񾵐‍‍⏃; [B1, B6, C2, V6]; xn--mnb6558e91kyq533a.xn--1uga46zs309y; ; ; # ܜ鹝꾗.⏃ +≮.-܈--; ≮.-܈--; [B1, P1, V2, V3, V6]; xn--gdh.xn------eqf; ; ; # ≮.-܈-- +≮.-܈--; ≮.-܈--; [B1, P1, V2, V3, V6]; xn--gdh.xn------eqf; ; ; # ≮.-܈-- +≮.-܈--; ; [B1, P1, V2, V3, V6]; xn--gdh.xn------eqf; ; ; # ≮.-܈-- +≮.-܈--; ≮.-܈--; [B1, P1, V2, V3, V6]; xn--gdh.xn------eqf; ; ; # ≮.-܈-- +xn--gdh.xn------eqf; ≮.-܈--; [B1, V2, V3, V6]; xn--gdh.xn------eqf; ; ; # ≮.-܈-- +𐹸󠋳。‍ς𝟩; 𐹸󠋳.‍ς7; [B1, C2, P1, V6]; xn--wo0di5177c.xn--7-xmb248s; ; xn--wo0di5177c.xn--7-zmb; [B1, P1, V6] # 𐹸.ς7 +𐹸󠋳。‍ς7; 𐹸󠋳.‍ς7; [B1, C2, P1, V6]; xn--wo0di5177c.xn--7-xmb248s; ; xn--wo0di5177c.xn--7-zmb; [B1, P1, V6] # 𐹸.ς7 +𐹸󠋳。‍Σ7; 𐹸󠋳.‍σ7; [B1, C2, P1, V6]; xn--wo0di5177c.xn--7-zmb938s; ; xn--wo0di5177c.xn--7-zmb; [B1, P1, V6] # 𐹸.σ7 +𐹸󠋳。‍σ7; 𐹸󠋳.‍σ7; [B1, C2, P1, V6]; xn--wo0di5177c.xn--7-zmb938s; ; xn--wo0di5177c.xn--7-zmb; [B1, P1, V6] # 𐹸.σ7 +xn--wo0di5177c.xn--7-zmb; 𐹸󠋳.σ7; [B1, V6]; xn--wo0di5177c.xn--7-zmb; ; ; # 𐹸.σ7 +xn--wo0di5177c.xn--7-zmb938s; 𐹸󠋳.‍σ7; [B1, C2, V6]; xn--wo0di5177c.xn--7-zmb938s; ; ; # 𐹸.σ7 +xn--wo0di5177c.xn--7-xmb248s; 𐹸󠋳.‍ς7; [B1, C2, V6]; xn--wo0di5177c.xn--7-xmb248s; ; ; # 𐹸.ς7 +𐹸󠋳。‍Σ𝟩; 𐹸󠋳.‍σ7; [B1, C2, P1, V6]; xn--wo0di5177c.xn--7-zmb938s; ; xn--wo0di5177c.xn--7-zmb; [B1, P1, V6] # 𐹸.σ7 +𐹸󠋳。‍σ𝟩; 𐹸󠋳.‍σ7; [B1, C2, P1, V6]; xn--wo0di5177c.xn--7-zmb938s; ; xn--wo0di5177c.xn--7-zmb; [B1, P1, V6] # 𐹸.σ7 +ς򅜌8.𞭤; ς򅜌8.𞭤; [P1, V6]; xn--8-xmb44974n.xn--su6h; ; xn--8-zmb14974n.xn--su6h; # ς8. +ς򅜌8.𞭤; ; [P1, V6]; xn--8-xmb44974n.xn--su6h; ; xn--8-zmb14974n.xn--su6h; # ς8. +Σ򅜌8.𞭤; σ򅜌8.𞭤; [P1, V6]; xn--8-zmb14974n.xn--su6h; ; ; # σ8. +σ򅜌8.𞭤; ; [P1, V6]; xn--8-zmb14974n.xn--su6h; ; ; # σ8. +xn--8-zmb14974n.xn--su6h; σ򅜌8.𞭤; [V6]; xn--8-zmb14974n.xn--su6h; ; ; # σ8. +xn--8-xmb44974n.xn--su6h; ς򅜌8.𞭤; [V6]; xn--8-xmb44974n.xn--su6h; ; ; # ς8. +Σ򅜌8.𞭤; σ򅜌8.𞭤; [P1, V6]; xn--8-zmb14974n.xn--su6h; ; ; # σ8. +σ򅜌8.𞭤; σ򅜌8.𞭤; [P1, V6]; xn--8-zmb14974n.xn--su6h; ; ; # σ8. +‌ᡑ🄀ڄ.-𐫄𑲤; ‌ᡑ🄀ڄ.-𐫄𑲤; [B1, C1, P1, V3, V6]; xn--9ib722gvtfi563c.xn----ek5i065b; ; xn--9ib722gbw95a.xn----ek5i065b; [B1, B5, B6, P1, V3, V6] # ᡑ🄀ڄ.-𐫄𑲤 +‌ᡑ0.ڄ.-𐫄𑲤; ; [B1, C1, V3]; xn--0-o7j263b.xn--9ib.xn----ek5i065b; ; xn--0-o7j.xn--9ib.xn----ek5i065b; [B1, V3] # ᡑ0.ڄ.-𐫄𑲤 +xn--0-o7j.xn--9ib.xn----ek5i065b; ᡑ0.ڄ.-𐫄𑲤; [B1, V3]; xn--0-o7j.xn--9ib.xn----ek5i065b; ; ; # ᡑ0.ڄ.-𐫄𑲤 +xn--0-o7j263b.xn--9ib.xn----ek5i065b; ‌ᡑ0.ڄ.-𐫄𑲤; [B1, C1, V3]; xn--0-o7j263b.xn--9ib.xn----ek5i065b; ; ; # ᡑ0.ڄ.-𐫄𑲤 +xn--9ib722gbw95a.xn----ek5i065b; ᡑ🄀ڄ.-𐫄𑲤; [B1, B5, B6, V3, V6]; xn--9ib722gbw95a.xn----ek5i065b; ; ; # ᡑ🄀ڄ.-𐫄𑲤 +xn--9ib722gvtfi563c.xn----ek5i065b; ‌ᡑ🄀ڄ.-𐫄𑲤; [B1, C1, V3, V6]; xn--9ib722gvtfi563c.xn----ek5i065b; ; ; # ᡑ🄀ڄ.-𐫄𑲤 +𖠍。𐪿넯򞵲; 𖠍.𐪿넯򞵲; [B2, B3, P1, V6]; xn--4e9e.xn--l60bj21opd57g; ; ; # 𖠍.넯 +𖠍。𐪿넯򞵲; 𖠍.𐪿넯򞵲; [B2, B3, P1, V6]; xn--4e9e.xn--l60bj21opd57g; ; ; # 𖠍.넯 +xn--4e9e.xn--l60bj21opd57g; 𖠍.𐪿넯򞵲; [B2, B3, V6]; xn--4e9e.xn--l60bj21opd57g; ; ; # 𖠍.넯 +᠇Ⴘ。؃Ⴈ𝆊; ᠇Ⴘ.؃Ⴈ𝆊; [B1, P1, V6]; xn--wnd558a.xn--lfb465c1v87a; ; ; # ᠇Ⴘ.Ⴈ𝆊 +᠇ⴘ。؃ⴈ𝆊; ᠇ⴘ.؃ⴈ𝆊; [B1, P1, V6]; xn--d6e009h.xn--lfb290rfu3z; ; ; # ᠇ⴘ.ⴈ𝆊 +xn--d6e009h.xn--lfb290rfu3z; ᠇ⴘ.؃ⴈ𝆊; [B1, V6]; xn--d6e009h.xn--lfb290rfu3z; ; ; # ᠇ⴘ.ⴈ𝆊 +xn--wnd558a.xn--lfb465c1v87a; ᠇Ⴘ.؃Ⴈ𝆊; [B1, V6]; xn--wnd558a.xn--lfb465c1v87a; ; ; # ᠇Ⴘ.Ⴈ𝆊 +⒚󠋑𞤰。牣٧Ⴜᣥ; ⒚󠋑𞤰.牣٧Ⴜᣥ; [B1, B5, P1, V6]; xn--cthy466n29j3e.xn--gib404ccxgh00h; ; ; # ⒚𞤰.牣٧Ⴜᣥ +19.󠋑𞤰。牣٧Ⴜᣥ; 19.󠋑𞤰.牣٧Ⴜᣥ; [B1, B5, P1, V6]; 19.xn--oe6h75760c.xn--gib404ccxgh00h; ; ; # 19.𞤰.牣٧Ⴜᣥ +19.󠋑𞤰。牣٧ⴜᣥ; 19.󠋑𞤰.牣٧ⴜᣥ; [B1, B5, P1, V6]; 19.xn--oe6h75760c.xn--gib285gtxo2l9d; ; ; # 19.𞤰.牣٧ⴜᣥ +19.󠋑𞤎。牣٧Ⴜᣥ; 19.󠋑𞤰.牣٧Ⴜᣥ; [B1, B5, P1, V6]; 19.xn--oe6h75760c.xn--gib404ccxgh00h; ; ; # 19.𞤰.牣٧Ⴜᣥ +19.󠋑𞤎。牣٧ⴜᣥ; 19.󠋑𞤰.牣٧ⴜᣥ; [B1, B5, P1, V6]; 19.xn--oe6h75760c.xn--gib285gtxo2l9d; ; ; # 19.𞤰.牣٧ⴜᣥ +19.xn--oe6h75760c.xn--gib285gtxo2l9d; 19.󠋑𞤰.牣٧ⴜᣥ; [B1, B5, V6]; 19.xn--oe6h75760c.xn--gib285gtxo2l9d; ; ; # 19.𞤰.牣٧ⴜᣥ +19.xn--oe6h75760c.xn--gib404ccxgh00h; 19.󠋑𞤰.牣٧Ⴜᣥ; [B1, B5, V6]; 19.xn--oe6h75760c.xn--gib404ccxgh00h; ; ; # 19.𞤰.牣٧Ⴜᣥ +⒚󠋑𞤰。牣٧ⴜᣥ; ⒚󠋑𞤰.牣٧ⴜᣥ; [B1, B5, P1, V6]; xn--cthy466n29j3e.xn--gib285gtxo2l9d; ; ; # ⒚𞤰.牣٧ⴜᣥ +⒚󠋑𞤎。牣٧Ⴜᣥ; ⒚󠋑𞤰.牣٧Ⴜᣥ; [B1, B5, P1, V6]; xn--cthy466n29j3e.xn--gib404ccxgh00h; ; ; # ⒚𞤰.牣٧Ⴜᣥ +⒚󠋑𞤎。牣٧ⴜᣥ; ⒚󠋑𞤰.牣٧ⴜᣥ; [B1, B5, P1, V6]; xn--cthy466n29j3e.xn--gib285gtxo2l9d; ; ; # ⒚𞤰.牣٧ⴜᣥ +xn--cthy466n29j3e.xn--gib285gtxo2l9d; ⒚󠋑𞤰.牣٧ⴜᣥ; [B1, B5, V6]; xn--cthy466n29j3e.xn--gib285gtxo2l9d; ; ; # ⒚𞤰.牣٧ⴜᣥ +xn--cthy466n29j3e.xn--gib404ccxgh00h; ⒚󠋑𞤰.牣٧Ⴜᣥ; [B1, B5, V6]; xn--cthy466n29j3e.xn--gib404ccxgh00h; ; ; # ⒚𞤰.牣٧Ⴜᣥ +-𐋱𐰽⒈.Ⴓ; ; [B1, P1, V3, V6]; xn----ecp0206g90h.xn--rnd; ; ; # -𐋱𐰽⒈.Ⴓ +-𐋱𐰽1..Ⴓ; ; [B1, P1, V3, V6, X4_2]; xn---1-895nq11a..xn--rnd; [B1, P1, V3, V6, A4_2]; ; # -𐋱𐰽1..Ⴓ +-𐋱𐰽1..ⴓ; ; [B1, V3, X4_2]; xn---1-895nq11a..xn--blj; [B1, V3, A4_2]; ; # -𐋱𐰽1..ⴓ +xn---1-895nq11a..xn--blj; -𐋱𐰽1..ⴓ; [B1, V3, X4_2]; xn---1-895nq11a..xn--blj; [B1, V3, A4_2]; ; # -𐋱𐰽1..ⴓ +xn---1-895nq11a..xn--rnd; -𐋱𐰽1..Ⴓ; [B1, V3, V6, X4_2]; xn---1-895nq11a..xn--rnd; [B1, V3, V6, A4_2]; ; # -𐋱𐰽1..Ⴓ +-𐋱𐰽⒈.ⴓ; ; [B1, P1, V3, V6]; xn----ecp0206g90h.xn--blj; ; ; # -𐋱𐰽⒈.ⴓ +xn----ecp0206g90h.xn--blj; -𐋱𐰽⒈.ⴓ; [B1, V3, V6]; xn----ecp0206g90h.xn--blj; ; ; # -𐋱𐰽⒈.ⴓ +xn----ecp0206g90h.xn--rnd; -𐋱𐰽⒈.Ⴓ; [B1, V3, V6]; xn----ecp0206g90h.xn--rnd; ; ; # -𐋱𐰽⒈.Ⴓ +‌긃.榶-; ; [C1, V3]; xn--0ug3307c.xn----d87b; ; xn--ej0b.xn----d87b; [V3] # 긃.榶- +‌긃.榶-; ‌긃.榶-; [C1, V3]; xn--0ug3307c.xn----d87b; ; xn--ej0b.xn----d87b; [V3] # 긃.榶- +xn--ej0b.xn----d87b; 긃.榶-; [V3]; xn--ej0b.xn----d87b; ; ; # 긃.榶- +xn--0ug3307c.xn----d87b; ‌긃.榶-; [C1, V3]; xn--0ug3307c.xn----d87b; ; ; # 긃.榶- +뉓泓𜵽.্‍; ; [P1, V5, V6]; xn--lwwp69lqs7m.xn--b7b605i; ; xn--lwwp69lqs7m.xn--b7b; # 뉓泓.্ +뉓泓𜵽.্‍; 뉓泓𜵽.্‍; [P1, V5, V6]; xn--lwwp69lqs7m.xn--b7b605i; ; xn--lwwp69lqs7m.xn--b7b; # 뉓泓.্ +xn--lwwp69lqs7m.xn--b7b; 뉓泓𜵽.্; [V5, V6]; xn--lwwp69lqs7m.xn--b7b; ; ; # 뉓泓.্ +xn--lwwp69lqs7m.xn--b7b605i; 뉓泓𜵽.্‍; [V5, V6]; xn--lwwp69lqs7m.xn--b7b605i; ; ; # 뉓泓.্ +‍𐹴ß。ິ⭵񪅌; ‍𐹴ß.ິ⭵񪅌; [B1, C2, P1, V5, V6]; xn--zca770nip7n.xn--57c638l8774i; ; xn--ss-ti3o.xn--57c638l8774i; [B1, P1, V5, V6] # 𐹴ß.ິ +‍𐹴ß。ິ⭵񪅌; ‍𐹴ß.ິ⭵񪅌; [B1, C2, P1, V5, V6]; xn--zca770nip7n.xn--57c638l8774i; ; xn--ss-ti3o.xn--57c638l8774i; [B1, P1, V5, V6] # 𐹴ß.ິ +‍𐹴SS。ິ⭵񪅌; ‍𐹴ss.ິ⭵񪅌; [B1, C2, P1, V5, V6]; xn--ss-l1t5169j.xn--57c638l8774i; ; xn--ss-ti3o.xn--57c638l8774i; [B1, P1, V5, V6] # 𐹴ss.ິ +‍𐹴ss。ິ⭵񪅌; ‍𐹴ss.ິ⭵񪅌; [B1, C2, P1, V5, V6]; xn--ss-l1t5169j.xn--57c638l8774i; ; xn--ss-ti3o.xn--57c638l8774i; [B1, P1, V5, V6] # 𐹴ss.ິ +‍𐹴Ss。ິ⭵񪅌; ‍𐹴ss.ິ⭵񪅌; [B1, C2, P1, V5, V6]; xn--ss-l1t5169j.xn--57c638l8774i; ; xn--ss-ti3o.xn--57c638l8774i; [B1, P1, V5, V6] # 𐹴ss.ິ +xn--ss-ti3o.xn--57c638l8774i; 𐹴ss.ິ⭵񪅌; [B1, V5, V6]; xn--ss-ti3o.xn--57c638l8774i; ; ; # 𐹴ss.ິ +xn--ss-l1t5169j.xn--57c638l8774i; ‍𐹴ss.ິ⭵񪅌; [B1, C2, V5, V6]; xn--ss-l1t5169j.xn--57c638l8774i; ; ; # 𐹴ss.ິ +xn--zca770nip7n.xn--57c638l8774i; ‍𐹴ß.ິ⭵񪅌; [B1, C2, V5, V6]; xn--zca770nip7n.xn--57c638l8774i; ; ; # 𐹴ß.ິ +‍𐹴SS。ິ⭵񪅌; ‍𐹴ss.ິ⭵񪅌; [B1, C2, P1, V5, V6]; xn--ss-l1t5169j.xn--57c638l8774i; ; xn--ss-ti3o.xn--57c638l8774i; [B1, P1, V5, V6] # 𐹴ss.ິ +‍𐹴ss。ິ⭵񪅌; ‍𐹴ss.ິ⭵񪅌; [B1, C2, P1, V5, V6]; xn--ss-l1t5169j.xn--57c638l8774i; ; xn--ss-ti3o.xn--57c638l8774i; [B1, P1, V5, V6] # 𐹴ss.ິ +‍𐹴Ss。ິ⭵񪅌; ‍𐹴ss.ິ⭵񪅌; [B1, C2, P1, V5, V6]; xn--ss-l1t5169j.xn--57c638l8774i; ; xn--ss-ti3o.xn--57c638l8774i; [B1, P1, V5, V6] # 𐹴ss.ິ +᭄.᮪-≮≠; ᭄.᮪-≮≠; [P1, V5, V6]; xn--1uf.xn----nmlz65aub; ; ; # ᭄.᮪-≮≠ +᭄.᮪-≮≠; ᭄.᮪-≮≠; [P1, V5, V6]; xn--1uf.xn----nmlz65aub; ; ; # ᭄.᮪-≮≠ +᭄.᮪-≮≠; ; [P1, V5, V6]; xn--1uf.xn----nmlz65aub; ; ; # ᭄.᮪-≮≠ +᭄.᮪-≮≠; ᭄.᮪-≮≠; [P1, V5, V6]; xn--1uf.xn----nmlz65aub; ; ; # ᭄.᮪-≮≠ +xn--1uf.xn----nmlz65aub; ᭄.᮪-≮≠; [V5, V6]; xn--1uf.xn----nmlz65aub; ; ; # ᭄.᮪-≮≠ +᯳Ⴑᅟ.𑄴Ⅎ; ᯳Ⴑᅟ.𑄴Ⅎ; [P1, V5, V6]; xn--pnd26a55x.xn--f3g7465g; ; ; # ᯳Ⴑ.𑄴Ⅎ +᯳Ⴑᅟ.𑄴Ⅎ; ; [P1, V5, V6]; xn--pnd26a55x.xn--f3g7465g; ; ; # ᯳Ⴑ.𑄴Ⅎ +᯳ⴑᅟ.𑄴ⅎ; ; [P1, V5, V6]; xn--osd925cvyn.xn--73g3065g; ; ; # ᯳ⴑ.𑄴ⅎ +᯳Ⴑᅟ.𑄴ⅎ; ; [P1, V5, V6]; xn--pnd26a55x.xn--73g3065g; ; ; # ᯳Ⴑ.𑄴ⅎ +xn--pnd26a55x.xn--73g3065g; ᯳Ⴑᅟ.𑄴ⅎ; [V5, V6]; xn--pnd26a55x.xn--73g3065g; ; ; # ᯳Ⴑ.𑄴ⅎ +xn--osd925cvyn.xn--73g3065g; ᯳ⴑᅟ.𑄴ⅎ; [V5, V6]; xn--osd925cvyn.xn--73g3065g; ; ; # ᯳ⴑ.𑄴ⅎ +xn--pnd26a55x.xn--f3g7465g; ᯳Ⴑᅟ.𑄴Ⅎ; [V5, V6]; xn--pnd26a55x.xn--f3g7465g; ; ; # ᯳Ⴑ.𑄴Ⅎ +᯳ⴑᅟ.𑄴ⅎ; ᯳ⴑᅟ.𑄴ⅎ; [P1, V5, V6]; xn--osd925cvyn.xn--73g3065g; ; ; # ᯳ⴑ.𑄴ⅎ +᯳Ⴑᅟ.𑄴ⅎ; ᯳Ⴑᅟ.𑄴ⅎ; [P1, V5, V6]; xn--pnd26a55x.xn--73g3065g; ; ; # ᯳Ⴑ.𑄴ⅎ +𜉆。Ⴃ𐴣𐹹똯; 𜉆.Ⴃ𐴣𐹹똯; [B5, P1, V6]; xn--187g.xn--bnd4785f8r8bdeb; ; ; # .Ⴃ𐴣𐹹똯 +𜉆。Ⴃ𐴣𐹹똯; 𜉆.Ⴃ𐴣𐹹똯; [B5, P1, V6]; xn--187g.xn--bnd4785f8r8bdeb; ; ; # .Ⴃ𐴣𐹹똯 +𜉆。ⴃ𐴣𐹹똯; 𜉆.ⴃ𐴣𐹹똯; [B5, P1, V6]; xn--187g.xn--ukjy205b8rscdeb; ; ; # .ⴃ𐴣𐹹똯 +𜉆。ⴃ𐴣𐹹똯; 𜉆.ⴃ𐴣𐹹똯; [B5, P1, V6]; xn--187g.xn--ukjy205b8rscdeb; ; ; # .ⴃ𐴣𐹹똯 +xn--187g.xn--ukjy205b8rscdeb; 𜉆.ⴃ𐴣𐹹똯; [B5, V6]; xn--187g.xn--ukjy205b8rscdeb; ; ; # .ⴃ𐴣𐹹똯 +xn--187g.xn--bnd4785f8r8bdeb; 𜉆.Ⴃ𐴣𐹹똯; [B5, V6]; xn--187g.xn--bnd4785f8r8bdeb; ; ; # .Ⴃ𐴣𐹹똯 +𐫀。⳻󠙾󠄷ㅤ; 𐫀.⳻󠙾ㅤ; [B1, P1, V6]; xn--pw9c.xn--mkj83l4v899a; ; ; # 𐫀.⳻ +𐫀。⳻󠙾󠄷ᅠ; 𐫀.⳻󠙾ᅠ; [B1, P1, V6]; xn--pw9c.xn--psd742lxt32w; ; ; # 𐫀.⳻ +xn--pw9c.xn--psd742lxt32w; 𐫀.⳻󠙾ᅠ; [B1, V6]; xn--pw9c.xn--psd742lxt32w; ; ; # 𐫀.⳻ +xn--pw9c.xn--mkj83l4v899a; 𐫀.⳻󠙾ㅤ; [B1, V6]; xn--pw9c.xn--mkj83l4v899a; ; ; # 𐫀.⳻ +ޚ⾇.ܞ-𐋰; ޚ舛.ܞ-𐋰; [B2, B3]; xn--7qb6383d.xn----20c3154q; ; ; # ޚ舛.ܞ-𐋰 +ޚ舛.ܞ-𐋰; ; [B2, B3]; xn--7qb6383d.xn----20c3154q; ; ; # ޚ舛.ܞ-𐋰 +xn--7qb6383d.xn----20c3154q; ޚ舛.ܞ-𐋰; [B2, B3]; xn--7qb6383d.xn----20c3154q; ; ; # ޚ舛.ܞ-𐋰 +Ⴉ猕󹛫≮.︒; Ⴉ猕󹛫≮.︒; [P1, V6]; xn--hnd212gz32d54x5r.xn--y86c; ; ; # Ⴉ猕≮.︒ +Ⴉ猕󹛫≮.︒; Ⴉ猕󹛫≮.︒; [P1, V6]; xn--hnd212gz32d54x5r.xn--y86c; ; ; # Ⴉ猕≮.︒ +Ⴉ猕󹛫≮.。; Ⴉ猕󹛫≮..; [P1, V6, X4_2]; xn--hnd212gz32d54x5r..; [P1, V6, A4_2]; ; # Ⴉ猕≮.. +Ⴉ猕󹛫≮.。; Ⴉ猕󹛫≮..; [P1, V6, X4_2]; xn--hnd212gz32d54x5r..; [P1, V6, A4_2]; ; # Ⴉ猕≮.. +ⴉ猕󹛫≮.。; ⴉ猕󹛫≮..; [P1, V6, X4_2]; xn--gdh892bbz0d5438s..; [P1, V6, A4_2]; ; # ⴉ猕≮.. +ⴉ猕󹛫≮.。; ⴉ猕󹛫≮..; [P1, V6, X4_2]; xn--gdh892bbz0d5438s..; [P1, V6, A4_2]; ; # ⴉ猕≮.. +xn--gdh892bbz0d5438s..; ⴉ猕󹛫≮..; [V6, X4_2]; xn--gdh892bbz0d5438s..; [V6, A4_2]; ; # ⴉ猕≮.. +xn--hnd212gz32d54x5r..; Ⴉ猕󹛫≮..; [V6, X4_2]; xn--hnd212gz32d54x5r..; [V6, A4_2]; ; # Ⴉ猕≮.. +ⴉ猕󹛫≮.︒; ⴉ猕󹛫≮.︒; [P1, V6]; xn--gdh892bbz0d5438s.xn--y86c; ; ; # ⴉ猕≮.︒ +ⴉ猕󹛫≮.︒; ⴉ猕󹛫≮.︒; [P1, V6]; xn--gdh892bbz0d5438s.xn--y86c; ; ; # ⴉ猕≮.︒ +xn--gdh892bbz0d5438s.xn--y86c; ⴉ猕󹛫≮.︒; [V6]; xn--gdh892bbz0d5438s.xn--y86c; ; ; # ⴉ猕≮.︒ +xn--hnd212gz32d54x5r.xn--y86c; Ⴉ猕󹛫≮.︒; [V6]; xn--hnd212gz32d54x5r.xn--y86c; ; ; # Ⴉ猕≮.︒ +🏮。ث鳳ߢ󠅉; 🏮.ث鳳ߢ; [B1, B2]; xn--8m8h.xn--qgb29f6z90a; ; ; # 🏮.ث鳳ߢ +🏮。ث鳳ߢ󠅉; 🏮.ث鳳ߢ; [B1, B2]; xn--8m8h.xn--qgb29f6z90a; ; ; # 🏮.ث鳳ߢ +xn--8m8h.xn--qgb29f6z90a; 🏮.ث鳳ߢ; [B1, B2]; xn--8m8h.xn--qgb29f6z90a; ; ; # 🏮.ث鳳ߢ +‍𐹶。ß; ‍𐹶.ß; [B1, C2]; xn--1ug9105g.xn--zca; ; xn--uo0d.ss; [B1] # 𐹶.ß +‍𐹶。SS; ‍𐹶.ss; [B1, C2]; xn--1ug9105g.ss; ; xn--uo0d.ss; [B1] # 𐹶.ss +‍𐹶。ss; ‍𐹶.ss; [B1, C2]; xn--1ug9105g.ss; ; xn--uo0d.ss; [B1] # 𐹶.ss +‍𐹶。Ss; ‍𐹶.ss; [B1, C2]; xn--1ug9105g.ss; ; xn--uo0d.ss; [B1] # 𐹶.ss +xn--uo0d.ss; 𐹶.ss; [B1]; xn--uo0d.ss; ; ; # 𐹶.ss +xn--1ug9105g.ss; ‍𐹶.ss; [B1, C2]; xn--1ug9105g.ss; ; ; # 𐹶.ss +xn--1ug9105g.xn--zca; ‍𐹶.ß; [B1, C2]; xn--1ug9105g.xn--zca; ; ; # 𐹶.ß +Å둄-.‌; å둄-.‌; [C1, V3]; xn----1fa1788k.xn--0ug; ; xn----1fa1788k.; [V3] # å둄-. +Å둄-.‌; å둄-.‌; [C1, V3]; xn----1fa1788k.xn--0ug; ; xn----1fa1788k.; [V3] # å둄-. +Å둄-.‌; å둄-.‌; [C1, V3]; xn----1fa1788k.xn--0ug; ; xn----1fa1788k.; [V3] # å둄-. +Å둄-.‌; å둄-.‌; [C1, V3]; xn----1fa1788k.xn--0ug; ; xn----1fa1788k.; [V3] # å둄-. +å둄-.‌; å둄-.‌; [C1, V3]; xn----1fa1788k.xn--0ug; ; xn----1fa1788k.; [V3] # å둄-. +å둄-.‌; ; [C1, V3]; xn----1fa1788k.xn--0ug; ; xn----1fa1788k.; [V3] # å둄-. +xn----1fa1788k.; å둄-.; [V3]; xn----1fa1788k.; ; ; # å둄-. +xn----1fa1788k.xn--0ug; å둄-.‌; [C1, V3]; xn----1fa1788k.xn--0ug; ; ; # å둄-. +å둄-.‌; å둄-.‌; [C1, V3]; xn----1fa1788k.xn--0ug; ; xn----1fa1788k.; [V3] # å둄-. +å둄-.‌; å둄-.‌; [C1, V3]; xn----1fa1788k.xn--0ug; ; xn----1fa1788k.; [V3] # å둄-. +゙򬎑ᷗ𞤀.򱲢-॓; ゙򬎑ᷗ𞤢.򱲢-॓; [B1, B6, P1, V5, V6]; xn--veg121fwg63altj9d.xn----eyd92688s; ; ; # ゙ᷗ𞤢.-॓ +゙򬎑ᷗ𞤢.򱲢-॓; ; [B1, B6, P1, V5, V6]; xn--veg121fwg63altj9d.xn----eyd92688s; ; ; # ゙ᷗ𞤢.-॓ +xn--veg121fwg63altj9d.xn----eyd92688s; ゙򬎑ᷗ𞤢.򱲢-॓; [B1, B6, V5, V6]; xn--veg121fwg63altj9d.xn----eyd92688s; ; ; # ゙ᷗ𞤢.-॓ +ς.ß񴱄۝⵿; ; [B5, B6, P1, V6]; xn--3xa.xn--zca281az71b8x73m; ; xn--4xa.xn--ss-y8d4760biv60n; # ς.ß⵿ +Σ.SS񴱄۝⵿; σ.ss񴱄۝⵿; [B5, B6, P1, V6]; xn--4xa.xn--ss-y8d4760biv60n; ; ; # σ.ss⵿ +σ.ss񴱄۝⵿; ; [B5, B6, P1, V6]; xn--4xa.xn--ss-y8d4760biv60n; ; ; # σ.ss⵿ +Σ.ss񴱄۝⵿; σ.ss񴱄۝⵿; [B5, B6, P1, V6]; xn--4xa.xn--ss-y8d4760biv60n; ; ; # σ.ss⵿ +xn--4xa.xn--ss-y8d4760biv60n; σ.ss񴱄۝⵿; [B5, B6, V6]; xn--4xa.xn--ss-y8d4760biv60n; ; ; # σ.ss⵿ +Σ.ß񴱄۝⵿; σ.ß񴱄۝⵿; [B5, B6, P1, V6]; xn--4xa.xn--zca281az71b8x73m; ; xn--4xa.xn--ss-y8d4760biv60n; # σ.ß⵿ +σ.ß񴱄۝⵿; ; [B5, B6, P1, V6]; xn--4xa.xn--zca281az71b8x73m; ; xn--4xa.xn--ss-y8d4760biv60n; # σ.ß⵿ +xn--4xa.xn--zca281az71b8x73m; σ.ß񴱄۝⵿; [B5, B6, V6]; xn--4xa.xn--zca281az71b8x73m; ; ; # σ.ß⵿ +xn--3xa.xn--zca281az71b8x73m; ς.ß񴱄۝⵿; [B5, B6, V6]; xn--3xa.xn--zca281az71b8x73m; ; ; # ς.ß⵿ +ꡀ𞀟。٫֙; ꡀ𞀟.٫֙; [B1]; xn--8b9a1720d.xn--kcb33b; ; ; # ꡀ𞀟.٫֙ +ꡀ𞀟。٫֙; ꡀ𞀟.٫֙; [B1]; xn--8b9a1720d.xn--kcb33b; ; ; # ꡀ𞀟.٫֙ +xn--8b9a1720d.xn--kcb33b; ꡀ𞀟.٫֙; [B1]; xn--8b9a1720d.xn--kcb33b; ; ; # ꡀ𞀟.٫֙ +򈛉‌ࢩ。⧅񘘡-𐭡; 򈛉‌ࢩ.⧅񘘡-𐭡; [B1, B5, B6, C1, P1, V6]; xn--yyb780jll63m.xn----zir1232guu71b; ; xn--yyb56242i.xn----zir1232guu71b; [B1, B5, B6, P1, V6] # ࢩ.⧅-𐭡 +򈛉‌ࢩ。⧅񘘡-𐭡; 򈛉‌ࢩ.⧅񘘡-𐭡; [B1, B5, B6, C1, P1, V6]; xn--yyb780jll63m.xn----zir1232guu71b; ; xn--yyb56242i.xn----zir1232guu71b; [B1, B5, B6, P1, V6] # ࢩ.⧅-𐭡 +xn--yyb56242i.xn----zir1232guu71b; 򈛉ࢩ.⧅񘘡-𐭡; [B1, B5, B6, V6]; xn--yyb56242i.xn----zir1232guu71b; ; ; # ࢩ.⧅-𐭡 +xn--yyb780jll63m.xn----zir1232guu71b; 򈛉‌ࢩ.⧅񘘡-𐭡; [B1, B5, B6, C1, V6]; xn--yyb780jll63m.xn----zir1232guu71b; ; ; # ࢩ.⧅-𐭡 +룱‍𰍨‌。𝨖︒; 룱‍𰍨‌.𝨖︒; [C1, C2, P1, V5, V6]; xn--0ugb3358ili2v.xn--y86cl899a; ; xn--ct2b0738h.xn--y86cl899a; [P1, V5, V6] # 룱𰍨.𝨖︒ +룱‍𰍨‌。𝨖︒; 룱‍𰍨‌.𝨖︒; [C1, C2, P1, V5, V6]; xn--0ugb3358ili2v.xn--y86cl899a; ; xn--ct2b0738h.xn--y86cl899a; [P1, V5, V6] # 룱𰍨.𝨖︒ +룱‍𰍨‌。𝨖。; 룱‍𰍨‌.𝨖.; [C1, C2, P1, V5, V6]; xn--0ugb3358ili2v.xn--772h.; ; xn--ct2b0738h.xn--772h.; [P1, V5, V6] # 룱𰍨.𝨖. +룱‍𰍨‌。𝨖。; 룱‍𰍨‌.𝨖.; [C1, C2, P1, V5, V6]; xn--0ugb3358ili2v.xn--772h.; ; xn--ct2b0738h.xn--772h.; [P1, V5, V6] # 룱𰍨.𝨖. +xn--ct2b0738h.xn--772h.; 룱𰍨.𝨖.; [V5, V6]; xn--ct2b0738h.xn--772h.; ; ; # 룱𰍨.𝨖. +xn--0ugb3358ili2v.xn--772h.; 룱‍𰍨‌.𝨖.; [C1, C2, V5, V6]; xn--0ugb3358ili2v.xn--772h.; ; ; # 룱𰍨.𝨖. +xn--ct2b0738h.xn--y86cl899a; 룱𰍨.𝨖︒; [V5, V6]; xn--ct2b0738h.xn--y86cl899a; ; ; # 룱𰍨.𝨖︒ +xn--0ugb3358ili2v.xn--y86cl899a; 룱‍𰍨‌.𝨖︒; [C1, C2, V5, V6]; xn--0ugb3358ili2v.xn--y86cl899a; ; ; # 룱𰍨.𝨖︒ +🄄.᳜⒈ß; 🄄.᳜⒈ß; [P1, V5, V6]; xn--x07h.xn--zca344lmif; ; xn--x07h.xn--ss-k1r094b; # 🄄.᳜⒈ß +3,.᳜1.ß; ; [P1, V5, V6]; 3,.xn--1-43l.xn--zca; ; 3,.xn--1-43l.ss; # 3,.᳜1.ß +3,.᳜1.SS; 3,.᳜1.ss; [P1, V5, V6]; 3,.xn--1-43l.ss; ; ; # 3,.᳜1.ss +3,.᳜1.ss; ; [P1, V5, V6]; 3,.xn--1-43l.ss; ; ; # 3,.᳜1.ss +3,.᳜1.Ss; 3,.᳜1.ss; [P1, V5, V6]; 3,.xn--1-43l.ss; ; ; # 3,.᳜1.ss +3,.xn--1-43l.ss; 3,.᳜1.ss; [P1, V5, V6]; 3,.xn--1-43l.ss; ; ; # 3,.᳜1.ss +3,.xn--1-43l.xn--zca; 3,.᳜1.ß; [P1, V5, V6]; 3,.xn--1-43l.xn--zca; ; ; # 3,.᳜1.ß +🄄.᳜⒈SS; 🄄.᳜⒈ss; [P1, V5, V6]; xn--x07h.xn--ss-k1r094b; ; ; # 🄄.᳜⒈ss +🄄.᳜⒈ss; 🄄.᳜⒈ss; [P1, V5, V6]; xn--x07h.xn--ss-k1r094b; ; ; # 🄄.᳜⒈ss +🄄.᳜⒈Ss; 🄄.᳜⒈ss; [P1, V5, V6]; xn--x07h.xn--ss-k1r094b; ; ; # 🄄.᳜⒈ss +xn--x07h.xn--ss-k1r094b; 🄄.᳜⒈ss; [V5, V6]; xn--x07h.xn--ss-k1r094b; ; ; # 🄄.᳜⒈ss +xn--x07h.xn--zca344lmif; 🄄.᳜⒈ß; [V5, V6]; xn--x07h.xn--zca344lmif; ; ; # 🄄.᳜⒈ß +񇌍⵿。𞼓򡄨𑐺; 񇌍⵿.𞼓򡄨𑐺; [B2, B3, P1, V6]; xn--eoj16016a.xn--0v1d3848a3lr0d; ; ; # ⵿.𑐺 +񇌍⵿。𞼓򡄨𑐺; 񇌍⵿.𞼓򡄨𑐺; [B2, B3, P1, V6]; xn--eoj16016a.xn--0v1d3848a3lr0d; ; ; # ⵿.𑐺 +xn--eoj16016a.xn--0v1d3848a3lr0d; 񇌍⵿.𞼓򡄨𑐺; [B2, B3, V6]; xn--eoj16016a.xn--0v1d3848a3lr0d; ; ; # ⵿.𑐺 +်्᷽.≠‍㇛; ်्᷽.≠‍㇛; [C2, P1, V5, V6]; xn--n3b956a9zm.xn--1ug63gz5w; ; xn--n3b956a9zm.xn--1ch912d; [P1, V5, V6] # ်्᷽.≠㇛ +်्᷽.≠‍㇛; ်्᷽.≠‍㇛; [C2, P1, V5, V6]; xn--n3b956a9zm.xn--1ug63gz5w; ; xn--n3b956a9zm.xn--1ch912d; [P1, V5, V6] # ်्᷽.≠㇛ +်्᷽.≠‍㇛; ်्᷽.≠‍㇛; [C2, P1, V5, V6]; xn--n3b956a9zm.xn--1ug63gz5w; ; xn--n3b956a9zm.xn--1ch912d; [P1, V5, V6] # ်्᷽.≠㇛ +်्᷽.≠‍㇛; ; [C2, P1, V5, V6]; xn--n3b956a9zm.xn--1ug63gz5w; ; xn--n3b956a9zm.xn--1ch912d; [P1, V5, V6] # ်्᷽.≠㇛ +်्᷽.≠‍㇛; ်्᷽.≠‍㇛; [C2, P1, V5, V6]; xn--n3b956a9zm.xn--1ug63gz5w; ; xn--n3b956a9zm.xn--1ch912d; [P1, V5, V6] # ်्᷽.≠㇛ +xn--n3b956a9zm.xn--1ch912d; ်्᷽.≠㇛; [V5, V6]; xn--n3b956a9zm.xn--1ch912d; ; ; # ်्᷽.≠㇛ +xn--n3b956a9zm.xn--1ug63gz5w; ်्᷽.≠‍㇛; [C2, V5, V6]; xn--n3b956a9zm.xn--1ug63gz5w; ; ; # ်्᷽.≠㇛ +Ⴁ𐋨娤.‍̼٢𑖿; ; [B1, C2, P1, V6]; xn--8md2578ag21g.xn--9ta62ngt6aou8t; ; xn--8md2578ag21g.xn--9ta62nrv36a; [B1, P1, V5, V6] # Ⴁ𐋨娤.̼٢𑖿 +ⴁ𐋨娤.‍̼٢𑖿; ; [B1, C2]; xn--skjw75lg29h.xn--9ta62ngt6aou8t; ; xn--skjw75lg29h.xn--9ta62nrv36a; [B1, V5] # ⴁ𐋨娤.̼٢𑖿 +xn--skjw75lg29h.xn--9ta62nrv36a; ⴁ𐋨娤.̼٢𑖿; [B1, V5]; xn--skjw75lg29h.xn--9ta62nrv36a; ; ; # ⴁ𐋨娤.̼٢𑖿 +xn--skjw75lg29h.xn--9ta62ngt6aou8t; ⴁ𐋨娤.‍̼٢𑖿; [B1, C2]; xn--skjw75lg29h.xn--9ta62ngt6aou8t; ; ; # ⴁ𐋨娤.̼٢𑖿 +xn--8md2578ag21g.xn--9ta62nrv36a; Ⴁ𐋨娤.̼٢𑖿; [B1, V5, V6]; xn--8md2578ag21g.xn--9ta62nrv36a; ; ; # Ⴁ𐋨娤.̼٢𑖿 +xn--8md2578ag21g.xn--9ta62ngt6aou8t; Ⴁ𐋨娤.‍̼٢𑖿; [B1, C2, V6]; xn--8md2578ag21g.xn--9ta62ngt6aou8t; ; ; # Ⴁ𐋨娤.̼٢𑖿 +🄀Ⴄ٩ࠠ。⒈ྶß; 🄀Ⴄ٩ࠠ.⒈ྶß; [B1, P1, V6]; xn--iib29f26o6n43c.xn--zca117e3vp; ; xn--iib29f26o6n43c.xn--ss-1sj588o; # 🄀Ⴄ٩ࠠ.⒈ྶß +0.Ⴄ٩ࠠ。1.ྶß; 0.Ⴄ٩ࠠ.1.ྶß; [B1, B5, B6, P1, V5, V6]; 0.xn--iib29f26o.1.xn--zca117e; ; 0.xn--iib29f26o.1.xn--ss-1sj; # 0.Ⴄ٩ࠠ.1.ྶß +0.ⴄ٩ࠠ。1.ྶß; 0.ⴄ٩ࠠ.1.ྶß; [B1, B5, B6, V5]; 0.xn--iib29fp25e.1.xn--zca117e; ; 0.xn--iib29fp25e.1.xn--ss-1sj; # 0.ⴄ٩ࠠ.1.ྶß +0.Ⴄ٩ࠠ。1.ྶSS; 0.Ⴄ٩ࠠ.1.ྶss; [B1, B5, B6, P1, V5, V6]; 0.xn--iib29f26o.1.xn--ss-1sj; ; ; # 0.Ⴄ٩ࠠ.1.ྶss +0.ⴄ٩ࠠ。1.ྶss; 0.ⴄ٩ࠠ.1.ྶss; [B1, B5, B6, V5]; 0.xn--iib29fp25e.1.xn--ss-1sj; ; ; # 0.ⴄ٩ࠠ.1.ྶss +0.Ⴄ٩ࠠ。1.ྶSs; 0.Ⴄ٩ࠠ.1.ྶss; [B1, B5, B6, P1, V5, V6]; 0.xn--iib29f26o.1.xn--ss-1sj; ; ; # 0.Ⴄ٩ࠠ.1.ྶss +0.xn--iib29f26o.1.xn--ss-1sj; 0.Ⴄ٩ࠠ.1.ྶss; [B1, B5, B6, V5, V6]; 0.xn--iib29f26o.1.xn--ss-1sj; ; ; # 0.Ⴄ٩ࠠ.1.ྶss +0.xn--iib29fp25e.1.xn--ss-1sj; 0.ⴄ٩ࠠ.1.ྶss; [B1, B5, B6, V5]; 0.xn--iib29fp25e.1.xn--ss-1sj; ; ; # 0.ⴄ٩ࠠ.1.ྶss +0.xn--iib29fp25e.1.xn--zca117e; 0.ⴄ٩ࠠ.1.ྶß; [B1, B5, B6, V5]; 0.xn--iib29fp25e.1.xn--zca117e; ; ; # 0.ⴄ٩ࠠ.1.ྶß +0.xn--iib29f26o.1.xn--zca117e; 0.Ⴄ٩ࠠ.1.ྶß; [B1, B5, B6, V5, V6]; 0.xn--iib29f26o.1.xn--zca117e; ; ; # 0.Ⴄ٩ࠠ.1.ྶß +🄀ⴄ٩ࠠ。⒈ྶß; 🄀ⴄ٩ࠠ.⒈ྶß; [B1, P1, V6]; xn--iib29fp25e0219a.xn--zca117e3vp; ; xn--iib29fp25e0219a.xn--ss-1sj588o; # 🄀ⴄ٩ࠠ.⒈ྶß +🄀Ⴄ٩ࠠ。⒈ྶSS; 🄀Ⴄ٩ࠠ.⒈ྶss; [B1, P1, V6]; xn--iib29f26o6n43c.xn--ss-1sj588o; ; ; # 🄀Ⴄ٩ࠠ.⒈ྶss +🄀ⴄ٩ࠠ。⒈ྶss; 🄀ⴄ٩ࠠ.⒈ྶss; [B1, P1, V6]; xn--iib29fp25e0219a.xn--ss-1sj588o; ; ; # 🄀ⴄ٩ࠠ.⒈ྶss +🄀Ⴄ٩ࠠ。⒈ྶSs; 🄀Ⴄ٩ࠠ.⒈ྶss; [B1, P1, V6]; xn--iib29f26o6n43c.xn--ss-1sj588o; ; ; # 🄀Ⴄ٩ࠠ.⒈ྶss +xn--iib29f26o6n43c.xn--ss-1sj588o; 🄀Ⴄ٩ࠠ.⒈ྶss; [B1, V6]; xn--iib29f26o6n43c.xn--ss-1sj588o; ; ; # 🄀Ⴄ٩ࠠ.⒈ྶss +xn--iib29fp25e0219a.xn--ss-1sj588o; 🄀ⴄ٩ࠠ.⒈ྶss; [B1, V6]; xn--iib29fp25e0219a.xn--ss-1sj588o; ; ; # 🄀ⴄ٩ࠠ.⒈ྶss +xn--iib29fp25e0219a.xn--zca117e3vp; 🄀ⴄ٩ࠠ.⒈ྶß; [B1, V6]; xn--iib29fp25e0219a.xn--zca117e3vp; ; ; # 🄀ⴄ٩ࠠ.⒈ྶß +xn--iib29f26o6n43c.xn--zca117e3vp; 🄀Ⴄ٩ࠠ.⒈ྶß; [B1, V6]; xn--iib29f26o6n43c.xn--zca117e3vp; ; ; # 🄀Ⴄ٩ࠠ.⒈ྶß +≠.‌-٫; ; [B1, C1, P1, V6]; xn--1ch.xn----vqc597q; ; xn--1ch.xn----vqc; [B1, P1, V3, V6] # ≠.-٫ +≠.‌-٫; ≠.‌-٫; [B1, C1, P1, V6]; xn--1ch.xn----vqc597q; ; xn--1ch.xn----vqc; [B1, P1, V3, V6] # ≠.-٫ +xn--1ch.xn----vqc; ≠.-٫; [B1, V3, V6]; xn--1ch.xn----vqc; ; ; # ≠.-٫ +xn--1ch.xn----vqc597q; ≠.‌-٫; [B1, C1, V6]; xn--1ch.xn----vqc597q; ; ; # ≠.-٫ +٠۱。󠳶𞠁٥; ٠۱.󠳶𞠁٥; [B1, P1, V6]; xn--8hb40a.xn--eib7967vner3e; ; ; # ٠۱.𞠁٥ +٠۱。󠳶𞠁٥; ٠۱.󠳶𞠁٥; [B1, P1, V6]; xn--8hb40a.xn--eib7967vner3e; ; ; # ٠۱.𞠁٥ +xn--8hb40a.xn--eib7967vner3e; ٠۱.󠳶𞠁٥; [B1, V6]; xn--8hb40a.xn--eib7967vner3e; ; ; # ٠۱.𞠁٥ +‌٣⒖。󱅉𽷛᯳; ‌٣⒖.󱅉𽷛᯳; [B1, C1, P1, V6]; xn--cib152kwgd.xn--1zf13512buy41d; ; xn--cib675m.xn--1zf13512buy41d; [B1, P1, V6] # ٣⒖.᯳ +‌٣15.。󱅉𽷛᯳; ‌٣15..󱅉𽷛᯳; [B1, C1, P1, V6, X4_2]; xn--15-gyd983x..xn--1zf13512buy41d; [B1, C1, P1, V6, A4_2]; xn--15-gyd..xn--1zf13512buy41d; [B1, P1, V6, A4_2] # ٣15..᯳ +xn--15-gyd..xn--1zf13512buy41d; ٣15..󱅉𽷛᯳; [B1, V6, X4_2]; xn--15-gyd..xn--1zf13512buy41d; [B1, V6, A4_2]; ; # ٣15..᯳ +xn--15-gyd983x..xn--1zf13512buy41d; ‌٣15..󱅉𽷛᯳; [B1, C1, V6, X4_2]; xn--15-gyd983x..xn--1zf13512buy41d; [B1, C1, V6, A4_2]; ; # ٣15..᯳ +xn--cib675m.xn--1zf13512buy41d; ٣⒖.󱅉𽷛᯳; [B1, V6]; xn--cib675m.xn--1zf13512buy41d; ; ; # ٣⒖.᯳ +xn--cib152kwgd.xn--1zf13512buy41d; ‌٣⒖.󱅉𽷛᯳; [B1, C1, V6]; xn--cib152kwgd.xn--1zf13512buy41d; ; ; # ٣⒖.᯳ +᯳.-逋񳦭󙙮; ; [P1, V3, V5, V6]; xn--1zf.xn----483d46987byr50b; ; ; # ᯳.-逋 +xn--1zf.xn----483d46987byr50b; ᯳.-逋񳦭󙙮; [V3, V5, V6]; xn--1zf.xn----483d46987byr50b; ; ; # ᯳.-逋 +ݖ。ㅤ‍ς; ݖ.ㅤ‍ς; [C2, P1, V6]; xn--9ob.xn--3xa995lq2l; ; xn--9ob.xn--4xa574u; [P1, V6] # ݖ.ς +ݖ。ᅠ‍ς; ݖ.ᅠ‍ς; [C2, P1, V6]; xn--9ob.xn--3xa580ebol; ; xn--9ob.xn--4xa380e; [P1, V6] # ݖ.ς +ݖ。ᅠ‍Σ; ݖ.ᅠ‍σ; [C2, P1, V6]; xn--9ob.xn--4xa380ebol; ; xn--9ob.xn--4xa380e; [P1, V6] # ݖ.σ +ݖ。ᅠ‍σ; ݖ.ᅠ‍σ; [C2, P1, V6]; xn--9ob.xn--4xa380ebol; ; xn--9ob.xn--4xa380e; [P1, V6] # ݖ.σ +xn--9ob.xn--4xa380e; ݖ.ᅠσ; [V6]; xn--9ob.xn--4xa380e; ; ; # ݖ.σ +xn--9ob.xn--4xa380ebol; ݖ.ᅠ‍σ; [C2, V6]; xn--9ob.xn--4xa380ebol; ; ; # ݖ.σ +xn--9ob.xn--3xa580ebol; ݖ.ᅠ‍ς; [C2, V6]; xn--9ob.xn--3xa580ebol; ; ; # ݖ.ς +ݖ。ㅤ‍Σ; ݖ.ㅤ‍σ; [C2, P1, V6]; xn--9ob.xn--4xa795lq2l; ; xn--9ob.xn--4xa574u; [P1, V6] # ݖ.σ +ݖ。ㅤ‍σ; ݖ.ㅤ‍σ; [C2, P1, V6]; xn--9ob.xn--4xa795lq2l; ; xn--9ob.xn--4xa574u; [P1, V6] # ݖ.σ +xn--9ob.xn--4xa574u; ݖ.ㅤσ; [V6]; xn--9ob.xn--4xa574u; ; ; # ݖ.σ +xn--9ob.xn--4xa795lq2l; ݖ.ㅤ‍σ; [C2, V6]; xn--9ob.xn--4xa795lq2l; ; ; # ݖ.σ +xn--9ob.xn--3xa995lq2l; ݖ.ㅤ‍ς; [C2, V6]; xn--9ob.xn--3xa995lq2l; ; ; # ݖ.ς +ᡆႣ。󞢧̕‍‍; ᡆႣ.󞢧̕‍‍; [C2, P1, V6]; xn--bnd320b.xn--5sa649la993427a; ; xn--bnd320b.xn--5sa98523p; [P1, V6] # ᡆႣ.̕ +ᡆႣ。󞢧̕‍‍; ᡆႣ.󞢧̕‍‍; [C2, P1, V6]; xn--bnd320b.xn--5sa649la993427a; ; xn--bnd320b.xn--5sa98523p; [P1, V6] # ᡆႣ.̕ +ᡆⴃ。󞢧̕‍‍; ᡆⴃ.󞢧̕‍‍; [C2, P1, V6]; xn--57e237h.xn--5sa649la993427a; ; xn--57e237h.xn--5sa98523p; [P1, V6] # ᡆⴃ.̕ +xn--57e237h.xn--5sa98523p; ᡆⴃ.󞢧̕; [V6]; xn--57e237h.xn--5sa98523p; ; ; # ᡆⴃ.̕ +xn--57e237h.xn--5sa649la993427a; ᡆⴃ.󞢧̕‍‍; [C2, V6]; xn--57e237h.xn--5sa649la993427a; ; ; # ᡆⴃ.̕ +xn--bnd320b.xn--5sa98523p; ᡆႣ.󞢧̕; [V6]; xn--bnd320b.xn--5sa98523p; ; ; # ᡆႣ.̕ +xn--bnd320b.xn--5sa649la993427a; ᡆႣ.󞢧̕‍‍; [C2, V6]; xn--bnd320b.xn--5sa649la993427a; ; ; # ᡆႣ.̕ +ᡆⴃ。󞢧̕‍‍; ᡆⴃ.󞢧̕‍‍; [C2, P1, V6]; xn--57e237h.xn--5sa649la993427a; ; xn--57e237h.xn--5sa98523p; [P1, V6] # ᡆⴃ.̕ +㭄‍ࡏ𑚵.ς𐮮‌‍; 㭄‍ࡏ𑚵.ς𐮮‌‍; [B5, B6, C1, C2]; xn--ewb962jfitku4r.xn--3xa895lda6932v; ; xn--ewb302xhu1l.xn--4xa0426k; [B5, B6] # 㭄ࡏ𑚵.ς𐮮 +㭄‍ࡏ𑚵.ς𐮮‌‍; ; [B5, B6, C1, C2]; xn--ewb962jfitku4r.xn--3xa895lda6932v; ; xn--ewb302xhu1l.xn--4xa0426k; [B5, B6] # 㭄ࡏ𑚵.ς𐮮 +㭄‍ࡏ𑚵.Σ𐮮‌‍; 㭄‍ࡏ𑚵.σ𐮮‌‍; [B5, B6, C1, C2]; xn--ewb962jfitku4r.xn--4xa695lda6932v; ; xn--ewb302xhu1l.xn--4xa0426k; [B5, B6] # 㭄ࡏ𑚵.σ𐮮 +㭄‍ࡏ𑚵.σ𐮮‌‍; ; [B5, B6, C1, C2]; xn--ewb962jfitku4r.xn--4xa695lda6932v; ; xn--ewb302xhu1l.xn--4xa0426k; [B5, B6] # 㭄ࡏ𑚵.σ𐮮 +xn--ewb302xhu1l.xn--4xa0426k; 㭄ࡏ𑚵.σ𐮮; [B5, B6]; xn--ewb302xhu1l.xn--4xa0426k; ; ; # 㭄ࡏ𑚵.σ𐮮 +xn--ewb962jfitku4r.xn--4xa695lda6932v; 㭄‍ࡏ𑚵.σ𐮮‌‍; [B5, B6, C1, C2]; xn--ewb962jfitku4r.xn--4xa695lda6932v; ; ; # 㭄ࡏ𑚵.σ𐮮 +xn--ewb962jfitku4r.xn--3xa895lda6932v; 㭄‍ࡏ𑚵.ς𐮮‌‍; [B5, B6, C1, C2]; xn--ewb962jfitku4r.xn--3xa895lda6932v; ; ; # 㭄ࡏ𑚵.ς𐮮 +㭄‍ࡏ𑚵.Σ𐮮‌‍; 㭄‍ࡏ𑚵.σ𐮮‌‍; [B5, B6, C1, C2]; xn--ewb962jfitku4r.xn--4xa695lda6932v; ; xn--ewb302xhu1l.xn--4xa0426k; [B5, B6] # 㭄ࡏ𑚵.σ𐮮 +㭄‍ࡏ𑚵.σ𐮮‌‍; 㭄‍ࡏ𑚵.σ𐮮‌‍; [B5, B6, C1, C2]; xn--ewb962jfitku4r.xn--4xa695lda6932v; ; xn--ewb302xhu1l.xn--4xa0426k; [B5, B6] # 㭄ࡏ𑚵.σ𐮮 +឵。𞯸ꡀ🄋; ឵.𞯸ꡀ🄋; [B1, B2, B3, B6, P1, V5, V6]; xn--03e.xn--8b9ar252dngd; ; ; # .ꡀ🄋 +xn--03e.xn--8b9ar252dngd; ឵.𞯸ꡀ🄋; [B1, B2, B3, B6, V5, V6]; xn--03e.xn--8b9ar252dngd; ; ; # .ꡀ🄋 +󐪺暑.⾑٨; 󐪺暑.襾٨; [B5, B6, P1, V6]; xn--tlvq3513e.xn--hib9228d; ; ; # 暑.襾٨ +󐪺暑.襾٨; ; [B5, B6, P1, V6]; xn--tlvq3513e.xn--hib9228d; ; ; # 暑.襾٨ +xn--tlvq3513e.xn--hib9228d; 󐪺暑.襾٨; [B5, B6, V6]; xn--tlvq3513e.xn--hib9228d; ; ; # 暑.襾٨ +󠄚≯ꡢ。࢑᷿; ≯ꡢ.࢑᷿; [B1, P1, V6]; xn--hdh7783c.xn--9xb680i; ; ; # ≯ꡢ.᷿ +󠄚≯ꡢ。࢑᷿; ≯ꡢ.࢑᷿; [B1, P1, V6]; xn--hdh7783c.xn--9xb680i; ; ; # ≯ꡢ.᷿ +xn--hdh7783c.xn--9xb680i; ≯ꡢ.࢑᷿; [B1, V6]; xn--hdh7783c.xn--9xb680i; ; ; # ≯ꡢ.᷿ +ﷃ𮁱୍𐨿.󐧤Ⴗ; كمم𮁱୍𐨿.󐧤Ⴗ; [B2, B3, P1, V6]; xn--fhbea662czx68a2tju.xn--vnd55511o; ; ; # كمم𮁱୍𐨿.Ⴗ +كمم𮁱୍𐨿.󐧤Ⴗ; ; [B2, B3, P1, V6]; xn--fhbea662czx68a2tju.xn--vnd55511o; ; ; # كمم𮁱୍𐨿.Ⴗ +كمم𮁱୍𐨿.󐧤ⴗ; ; [B2, B3, P1, V6]; xn--fhbea662czx68a2tju.xn--fljz2846h; ; ; # كمم𮁱୍𐨿.ⴗ +xn--fhbea662czx68a2tju.xn--fljz2846h; كمم𮁱୍𐨿.󐧤ⴗ; [B2, B3, V6]; xn--fhbea662czx68a2tju.xn--fljz2846h; ; ; # كمم𮁱୍𐨿.ⴗ +xn--fhbea662czx68a2tju.xn--vnd55511o; كمم𮁱୍𐨿.󐧤Ⴗ; [B2, B3, V6]; xn--fhbea662czx68a2tju.xn--vnd55511o; ; ; # كمم𮁱୍𐨿.Ⴗ +ﷃ𮁱୍𐨿.󐧤ⴗ; كمم𮁱୍𐨿.󐧤ⴗ; [B2, B3, P1, V6]; xn--fhbea662czx68a2tju.xn--fljz2846h; ; ; # كمم𮁱୍𐨿.ⴗ +𞀨。᭄򡛨𞎇; 𞀨.᭄򡛨𞎇; [P1, V5, V6]; xn--mi4h.xn--1uf6843smg20c; ; ; # 𞀨.᭄ +𞀨。᭄򡛨𞎇; 𞀨.᭄򡛨𞎇; [P1, V5, V6]; xn--mi4h.xn--1uf6843smg20c; ; ; # 𞀨.᭄ +xn--mi4h.xn--1uf6843smg20c; 𞀨.᭄򡛨𞎇; [V5, V6]; xn--mi4h.xn--1uf6843smg20c; ; ; # 𞀨.᭄ +󠣼‌.𐺰‌ᡟ; 󠣼‌.𐺰‌ᡟ; [B1, B2, B3, C1, P1, V6]; xn--0ug18531l.xn--v8e340bp21t; ; xn--q046e.xn--v8e7227j; [B1, B2, B3, P1, V6] # .𐺰ᡟ +󠣼‌.𐺰‌ᡟ; ; [B1, B2, B3, C1, P1, V6]; xn--0ug18531l.xn--v8e340bp21t; ; xn--q046e.xn--v8e7227j; [B1, B2, B3, P1, V6] # .𐺰ᡟ +xn--q046e.xn--v8e7227j; 󠣼.𐺰ᡟ; [B1, B2, B3, V6]; xn--q046e.xn--v8e7227j; ; ; # .𐺰ᡟ +xn--0ug18531l.xn--v8e340bp21t; 󠣼‌.𐺰‌ᡟ; [B1, B2, B3, C1, V6]; xn--0ug18531l.xn--v8e340bp21t; ; ; # .𐺰ᡟ +ᢛ󨅟ß.ጧ; ; [P1, V6]; xn--zca562jc642x.xn--p5d; ; xn--ss-7dp66033t.xn--p5d; # ᢛß.ጧ +ᢛ󨅟SS.ጧ; ᢛ󨅟ss.ጧ; [P1, V6]; xn--ss-7dp66033t.xn--p5d; ; ; # ᢛss.ጧ +ᢛ󨅟ss.ጧ; ; [P1, V6]; xn--ss-7dp66033t.xn--p5d; ; ; # ᢛss.ጧ +ᢛ󨅟Ss.ጧ; ᢛ󨅟ss.ጧ; [P1, V6]; xn--ss-7dp66033t.xn--p5d; ; ; # ᢛss.ጧ +xn--ss-7dp66033t.xn--p5d; ᢛ󨅟ss.ጧ; [V6]; xn--ss-7dp66033t.xn--p5d; ; ; # ᢛss.ጧ +xn--zca562jc642x.xn--p5d; ᢛ󨅟ß.ጧ; [V6]; xn--zca562jc642x.xn--p5d; ; ; # ᢛß.ጧ +⮒‌.񒚗‌; ; [C1, P1, V6]; xn--0ugx66b.xn--0ugz2871c; ; xn--b9i.xn--5p9y; [P1, V6] # ⮒. +xn--b9i.xn--5p9y; ⮒.񒚗; [V6]; xn--b9i.xn--5p9y; ; ; # ⮒. +xn--0ugx66b.xn--0ugz2871c; ⮒‌.񒚗‌; [C1, V6]; xn--0ugx66b.xn--0ugz2871c; ; ; # ⮒. +𞤂񹞁𐹯。Ⴜ; 𞤤񹞁𐹯.Ⴜ; [B2, P1, V6]; xn--no0dr648a51o3b.xn--0nd; ; ; # 𞤤𐹯.Ⴜ +𞤤񹞁𐹯。ⴜ; 𞤤񹞁𐹯.ⴜ; [B2, P1, V6]; xn--no0dr648a51o3b.xn--klj; ; ; # 𞤤𐹯.ⴜ +xn--no0dr648a51o3b.xn--klj; 𞤤񹞁𐹯.ⴜ; [B2, V6]; xn--no0dr648a51o3b.xn--klj; ; ; # 𞤤𐹯.ⴜ +xn--no0dr648a51o3b.xn--0nd; 𞤤񹞁𐹯.Ⴜ; [B2, V6]; xn--no0dr648a51o3b.xn--0nd; ; ; # 𞤤𐹯.Ⴜ +𞤂񹞁𐹯。ⴜ; 𞤤񹞁𐹯.ⴜ; [B2, P1, V6]; xn--no0dr648a51o3b.xn--klj; ; ; # 𞤤𐹯.ⴜ +𐹵⮣‌𑄰。񷴿ﲷ; 𐹵⮣‌𑄰.񷴿ضم; [B1, B5, B6, C1, P1, V6]; xn--0ug586bcj8p7jc.xn--1gb4a66004i; ; xn--s9i5458e7yb.xn--1gb4a66004i; [B1, B5, B6, P1, V6] # 𐹵⮣𑄰.ضم +𐹵⮣‌𑄰。񷴿ضم; 𐹵⮣‌𑄰.񷴿ضم; [B1, B5, B6, C1, P1, V6]; xn--0ug586bcj8p7jc.xn--1gb4a66004i; ; xn--s9i5458e7yb.xn--1gb4a66004i; [B1, B5, B6, P1, V6] # 𐹵⮣𑄰.ضم +xn--s9i5458e7yb.xn--1gb4a66004i; 𐹵⮣𑄰.񷴿ضم; [B1, B5, B6, V6]; xn--s9i5458e7yb.xn--1gb4a66004i; ; ; # 𐹵⮣𑄰.ضم +xn--0ug586bcj8p7jc.xn--1gb4a66004i; 𐹵⮣‌𑄰.񷴿ضم; [B1, B5, B6, C1, V6]; xn--0ug586bcj8p7jc.xn--1gb4a66004i; ; ; # 𐹵⮣𑄰.ضم +Ⴒ。デß𞤵్; Ⴒ.デß𞤵్; [B5, B6, P1, V6]; xn--qnd.xn--zca669cmr3a0f28a; ; xn--qnd.xn--ss-9nh3648ahh20b; # Ⴒ.デß𞤵్ +Ⴒ。デß𞤵్; Ⴒ.デß𞤵్; [B5, B6, P1, V6]; xn--qnd.xn--zca669cmr3a0f28a; ; xn--qnd.xn--ss-9nh3648ahh20b; # Ⴒ.デß𞤵్ +ⴒ。デß𞤵్; ⴒ.デß𞤵్; [B5, B6]; xn--9kj.xn--zca669cmr3a0f28a; ; xn--9kj.xn--ss-9nh3648ahh20b; # ⴒ.デß𞤵్ +ⴒ。デß𞤵్; ⴒ.デß𞤵్; [B5, B6]; xn--9kj.xn--zca669cmr3a0f28a; ; xn--9kj.xn--ss-9nh3648ahh20b; # ⴒ.デß𞤵్ +Ⴒ。デSS𞤓్; Ⴒ.デss𞤵్; [B5, B6, P1, V6]; xn--qnd.xn--ss-9nh3648ahh20b; ; ; # Ⴒ.デss𞤵్ +Ⴒ。デSS𞤓్; Ⴒ.デss𞤵్; [B5, B6, P1, V6]; xn--qnd.xn--ss-9nh3648ahh20b; ; ; # Ⴒ.デss𞤵్ +ⴒ。デss𞤵్; ⴒ.デss𞤵్; [B5, B6]; xn--9kj.xn--ss-9nh3648ahh20b; ; ; # ⴒ.デss𞤵్ +ⴒ。デss𞤵్; ⴒ.デss𞤵్; [B5, B6]; xn--9kj.xn--ss-9nh3648ahh20b; ; ; # ⴒ.デss𞤵్ +Ⴒ。デSs𞤵్; Ⴒ.デss𞤵్; [B5, B6, P1, V6]; xn--qnd.xn--ss-9nh3648ahh20b; ; ; # Ⴒ.デss𞤵్ +Ⴒ。デSs𞤵్; Ⴒ.デss𞤵్; [B5, B6, P1, V6]; xn--qnd.xn--ss-9nh3648ahh20b; ; ; # Ⴒ.デss𞤵్ +xn--qnd.xn--ss-9nh3648ahh20b; Ⴒ.デss𞤵్; [B5, B6, V6]; xn--qnd.xn--ss-9nh3648ahh20b; ; ; # Ⴒ.デss𞤵్ +xn--9kj.xn--ss-9nh3648ahh20b; ⴒ.デss𞤵్; [B5, B6]; xn--9kj.xn--ss-9nh3648ahh20b; ; ; # ⴒ.デss𞤵్ +xn--9kj.xn--zca669cmr3a0f28a; ⴒ.デß𞤵్; [B5, B6]; xn--9kj.xn--zca669cmr3a0f28a; ; ; # ⴒ.デß𞤵్ +xn--qnd.xn--zca669cmr3a0f28a; Ⴒ.デß𞤵్; [B5, B6, V6]; xn--qnd.xn--zca669cmr3a0f28a; ; ; # Ⴒ.デß𞤵్ +Ⴒ。デSS𞤵్; Ⴒ.デss𞤵్; [B5, B6, P1, V6]; xn--qnd.xn--ss-9nh3648ahh20b; ; ; # Ⴒ.デss𞤵్ +Ⴒ。デSS𞤵్; Ⴒ.デss𞤵్; [B5, B6, P1, V6]; xn--qnd.xn--ss-9nh3648ahh20b; ; ; # Ⴒ.デss𞤵్ +𑁿്.7-ߒ; 𑁿്.7-ߒ; [B1, B3, B6, V5]; xn--wxc1283k.xn--7--yue; ; ; # 𑁿്.7-ߒ +𑁿്.7-ߒ; ; [B1, B3, B6, V5]; xn--wxc1283k.xn--7--yue; ; ; # 𑁿്.7-ߒ +xn--wxc1283k.xn--7--yue; 𑁿്.7-ߒ; [B1, B3, B6, V5]; xn--wxc1283k.xn--7--yue; ; ; # 𑁿്.7-ߒ +≯𑜫󠭇.᜴񒞤𑍬ᢧ; ; [P1, V5, V6]; xn--hdhx157g68o0g.xn--c0e65eu616c34o7a; ; ; # ≯𑜫.᜴𑍬ᢧ +≯𑜫󠭇.᜴񒞤𑍬ᢧ; ≯𑜫󠭇.᜴񒞤𑍬ᢧ; [P1, V5, V6]; xn--hdhx157g68o0g.xn--c0e65eu616c34o7a; ; ; # ≯𑜫.᜴𑍬ᢧ +xn--hdhx157g68o0g.xn--c0e65eu616c34o7a; ≯𑜫󠭇.᜴񒞤𑍬ᢧ; [V5, V6]; xn--hdhx157g68o0g.xn--c0e65eu616c34o7a; ; ; # ≯𑜫.᜴𑍬ᢧ +ᷛ򎐙Ⴗ쏔。ށ; ᷛ򎐙Ⴗ쏔.ށ; [B1, P1, V5, V6]; xn--vnd148d733ky6n9e.xn--iqb; ; ; # ᷛႷ쏔.ށ +ᷛ򎐙Ⴗ쏔。ށ; ᷛ򎐙Ⴗ쏔.ށ; [B1, P1, V5, V6]; xn--vnd148d733ky6n9e.xn--iqb; ; ; # ᷛႷ쏔.ށ +ᷛ򎐙ⴗ쏔。ށ; ᷛ򎐙ⴗ쏔.ށ; [B1, P1, V5, V6]; xn--zegy26dw47iy6w2f.xn--iqb; ; ; # ᷛⴗ쏔.ށ +ᷛ򎐙ⴗ쏔。ށ; ᷛ򎐙ⴗ쏔.ށ; [B1, P1, V5, V6]; xn--zegy26dw47iy6w2f.xn--iqb; ; ; # ᷛⴗ쏔.ށ +xn--zegy26dw47iy6w2f.xn--iqb; ᷛ򎐙ⴗ쏔.ށ; [B1, V5, V6]; xn--zegy26dw47iy6w2f.xn--iqb; ; ; # ᷛⴗ쏔.ށ +xn--vnd148d733ky6n9e.xn--iqb; ᷛ򎐙Ⴗ쏔.ށ; [B1, V5, V6]; xn--vnd148d733ky6n9e.xn--iqb; ; ; # ᷛႷ쏔.ށ +ß。𐋳Ⴌྸ; ß.𐋳Ⴌྸ; [P1, V6]; xn--zca.xn--lgd10cu829c; ; ss.xn--lgd10cu829c; # ß.𐋳Ⴌྸ +ß。𐋳Ⴌྸ; ß.𐋳Ⴌྸ; [P1, V6]; xn--zca.xn--lgd10cu829c; ; ss.xn--lgd10cu829c; # ß.𐋳Ⴌྸ +ß。𐋳ⴌྸ; ß.𐋳ⴌྸ; ; xn--zca.xn--lgd921mvv0m; ; ss.xn--lgd921mvv0m; # ß.𐋳ⴌྸ +SS。𐋳Ⴌྸ; ss.𐋳Ⴌྸ; [P1, V6]; ss.xn--lgd10cu829c; ; ; # ss.𐋳Ⴌྸ +ss。𐋳ⴌྸ; ss.𐋳ⴌྸ; ; ss.xn--lgd921mvv0m; ; ; # ss.𐋳ⴌྸ +Ss。𐋳Ⴌྸ; ss.𐋳Ⴌྸ; [P1, V6]; ss.xn--lgd10cu829c; ; ; # ss.𐋳Ⴌྸ +ss.xn--lgd10cu829c; ss.𐋳Ⴌྸ; [V6]; ss.xn--lgd10cu829c; ; ; # ss.𐋳Ⴌྸ +ss.xn--lgd921mvv0m; ss.𐋳ⴌྸ; ; ss.xn--lgd921mvv0m; ; ; # ss.𐋳ⴌྸ +ss.𐋳ⴌྸ; ; ; ss.xn--lgd921mvv0m; ; ; # ss.𐋳ⴌྸ +SS.𐋳Ⴌྸ; ss.𐋳Ⴌྸ; [P1, V6]; ss.xn--lgd10cu829c; ; ; # ss.𐋳Ⴌྸ +Ss.𐋳Ⴌྸ; ss.𐋳Ⴌྸ; [P1, V6]; ss.xn--lgd10cu829c; ; ; # ss.𐋳Ⴌྸ +xn--zca.xn--lgd921mvv0m; ß.𐋳ⴌྸ; ; xn--zca.xn--lgd921mvv0m; ; ; # ß.𐋳ⴌྸ +ß.𐋳ⴌྸ; ; ; xn--zca.xn--lgd921mvv0m; ; ss.xn--lgd921mvv0m; # ß.𐋳ⴌྸ +xn--zca.xn--lgd10cu829c; ß.𐋳Ⴌྸ; [V6]; xn--zca.xn--lgd10cu829c; ; ; # ß.𐋳Ⴌྸ +ß。𐋳ⴌྸ; ß.𐋳ⴌྸ; ; xn--zca.xn--lgd921mvv0m; ; ss.xn--lgd921mvv0m; # ß.𐋳ⴌྸ +SS。𐋳Ⴌྸ; ss.𐋳Ⴌྸ; [P1, V6]; ss.xn--lgd10cu829c; ; ; # ss.𐋳Ⴌྸ +ss。𐋳ⴌྸ; ss.𐋳ⴌྸ; ; ss.xn--lgd921mvv0m; ; ; # ss.𐋳ⴌྸ +Ss。𐋳Ⴌྸ; ss.𐋳Ⴌྸ; [P1, V6]; ss.xn--lgd10cu829c; ; ; # ss.𐋳Ⴌྸ +-ڞ𐶡.‌⾝্; -ڞ𐶡.‌身্; [B1, C1, P1, V3, V6]; xn----stc7013r.xn--b7b305imj2f; ; xn----stc7013r.xn--b7b1419d; [B1, P1, V3, V6] # -ڞ.身্ +-ڞ𐶡.‌身্; ; [B1, C1, P1, V3, V6]; xn----stc7013r.xn--b7b305imj2f; ; xn----stc7013r.xn--b7b1419d; [B1, P1, V3, V6] # -ڞ.身্ +xn----stc7013r.xn--b7b1419d; -ڞ𐶡.身্; [B1, V3, V6]; xn----stc7013r.xn--b7b1419d; ; ; # -ڞ.身্ +xn----stc7013r.xn--b7b305imj2f; -ڞ𐶡.‌身্; [B1, C1, V3, V6]; xn----stc7013r.xn--b7b305imj2f; ; ; # -ڞ.身্ +😮ݤ𑈵𞀖.💅‍; 😮ݤ𑈵𞀖.💅‍; [B1, C2]; xn--opb4277kuc7elqsa.xn--1ug5265p; ; xn--opb4277kuc7elqsa.xn--kr8h; [B1] # 😮ݤ𑈵𞀖.💅 +😮ݤ𑈵𞀖.💅‍; ; [B1, C2]; xn--opb4277kuc7elqsa.xn--1ug5265p; ; xn--opb4277kuc7elqsa.xn--kr8h; [B1] # 😮ݤ𑈵𞀖.💅 +xn--opb4277kuc7elqsa.xn--kr8h; 😮ݤ𑈵𞀖.💅; [B1]; xn--opb4277kuc7elqsa.xn--kr8h; ; ; # 😮ݤ𑈵𞀖.💅 +xn--opb4277kuc7elqsa.xn--1ug5265p; 😮ݤ𑈵𞀖.💅‍; [B1, C2]; xn--opb4277kuc7elqsa.xn--1ug5265p; ; ; # 😮ݤ𑈵𞀖.💅 +ࣲ‍꙳ܒ.ᢏ‌󠍄; ; [B1, B6, C1, C2, P1, V5, V6]; xn--cnb37g904be26j.xn--89e849ax9363a; ; xn--cnb37gdy00a.xn--89e02253p; [B1, B6, P1, V5, V6] # ࣲ꙳ܒ.ᢏ +xn--cnb37gdy00a.xn--89e02253p; ࣲ꙳ܒ.ᢏ󠍄; [B1, B6, V5, V6]; xn--cnb37gdy00a.xn--89e02253p; ; ; # ࣲ꙳ܒ.ᢏ +xn--cnb37g904be26j.xn--89e849ax9363a; ࣲ‍꙳ܒ.ᢏ‌󠍄; [B1, B6, C1, C2, V5, V6]; xn--cnb37g904be26j.xn--89e849ax9363a; ; ; # ࣲ꙳ܒ.ᢏ +Ⴑ.ڿ𞯓ᠲ; Ⴑ.ڿ𞯓ᠲ; [B2, B3, P1, V6]; xn--pnd.xn--ykb840gd555a; ; ; # Ⴑ.ڿᠲ +Ⴑ.ڿ𞯓ᠲ; ; [B2, B3, P1, V6]; xn--pnd.xn--ykb840gd555a; ; ; # Ⴑ.ڿᠲ +ⴑ.ڿ𞯓ᠲ; ; [B2, B3, P1, V6]; xn--8kj.xn--ykb840gd555a; ; ; # ⴑ.ڿᠲ +xn--8kj.xn--ykb840gd555a; ⴑ.ڿ𞯓ᠲ; [B2, B3, V6]; xn--8kj.xn--ykb840gd555a; ; ; # ⴑ.ڿᠲ +xn--pnd.xn--ykb840gd555a; Ⴑ.ڿ𞯓ᠲ; [B2, B3, V6]; xn--pnd.xn--ykb840gd555a; ; ; # Ⴑ.ڿᠲ +ⴑ.ڿ𞯓ᠲ; ⴑ.ڿ𞯓ᠲ; [B2, B3, P1, V6]; xn--8kj.xn--ykb840gd555a; ; ; # ⴑ.ڿᠲ +ᩚ𛦝్。𚝬𝟵; ᩚ𛦝్.𚝬9; [P1, V5, V6]; xn--lqc703ebm93a.xn--9-000p; ; ; # ᩚ్.9 +ᩚ𛦝్。𚝬9; ᩚ𛦝్.𚝬9; [P1, V5, V6]; xn--lqc703ebm93a.xn--9-000p; ; ; # ᩚ్.9 +xn--lqc703ebm93a.xn--9-000p; ᩚ𛦝్.𚝬9; [V5, V6]; xn--lqc703ebm93a.xn--9-000p; ; ; # ᩚ్.9 +‌ڠ𿺆𝟗。Ⴣ꒘ﳐ񐘖; ‌ڠ𿺆9.Ⴣ꒘مخ񐘖; [B1, B5, C1, P1, V6]; xn--9-vtc736qts91g.xn--tgb9bz61cfn8mw3t2c; ; xn--9-vtc42319e.xn--tgb9bz61cfn8mw3t2c; [B2, B5, P1, V6] # ڠ9.Ⴣ꒘مخ +‌ڠ𿺆9。Ⴣ꒘مخ񐘖; ‌ڠ𿺆9.Ⴣ꒘مخ񐘖; [B1, B5, C1, P1, V6]; xn--9-vtc736qts91g.xn--tgb9bz61cfn8mw3t2c; ; xn--9-vtc42319e.xn--tgb9bz61cfn8mw3t2c; [B2, B5, P1, V6] # ڠ9.Ⴣ꒘مخ +‌ڠ𿺆9。ⴣ꒘مخ񐘖; ‌ڠ𿺆9.ⴣ꒘مخ񐘖; [B1, B5, C1, P1, V6]; xn--9-vtc736qts91g.xn--tgb9bz87p833hw316c; ; xn--9-vtc42319e.xn--tgb9bz87p833hw316c; [B2, B5, P1, V6] # ڠ9.ⴣ꒘مخ +xn--9-vtc42319e.xn--tgb9bz87p833hw316c; ڠ𿺆9.ⴣ꒘مخ񐘖; [B2, B5, V6]; xn--9-vtc42319e.xn--tgb9bz87p833hw316c; ; ; # ڠ9.ⴣ꒘مخ +xn--9-vtc736qts91g.xn--tgb9bz87p833hw316c; ‌ڠ𿺆9.ⴣ꒘مخ񐘖; [B1, B5, C1, V6]; xn--9-vtc736qts91g.xn--tgb9bz87p833hw316c; ; ; # ڠ9.ⴣ꒘مخ +xn--9-vtc42319e.xn--tgb9bz61cfn8mw3t2c; ڠ𿺆9.Ⴣ꒘مخ񐘖; [B2, B5, V6]; xn--9-vtc42319e.xn--tgb9bz61cfn8mw3t2c; ; ; # ڠ9.Ⴣ꒘مخ +xn--9-vtc736qts91g.xn--tgb9bz61cfn8mw3t2c; ‌ڠ𿺆9.Ⴣ꒘مخ񐘖; [B1, B5, C1, V6]; xn--9-vtc736qts91g.xn--tgb9bz61cfn8mw3t2c; ; ; # ڠ9.Ⴣ꒘مخ +‌ڠ𿺆𝟗。ⴣ꒘ﳐ񐘖; ‌ڠ𿺆9.ⴣ꒘مخ񐘖; [B1, B5, C1, P1, V6]; xn--9-vtc736qts91g.xn--tgb9bz87p833hw316c; ; xn--9-vtc42319e.xn--tgb9bz87p833hw316c; [B2, B5, P1, V6] # ڠ9.ⴣ꒘مخ +ᡖ。̟񗛨ஂ-; ᡖ.̟񗛨ஂ-; [P1, V3, V5, V6]; xn--m8e.xn----mdb555dkk71m; ; ; # ᡖ.̟ஂ- +ᡖ。̟񗛨ஂ-; ᡖ.̟񗛨ஂ-; [P1, V3, V5, V6]; xn--m8e.xn----mdb555dkk71m; ; ; # ᡖ.̟ஂ- +xn--m8e.xn----mdb555dkk71m; ᡖ.̟񗛨ஂ-; [V3, V5, V6]; xn--m8e.xn----mdb555dkk71m; ; ; # ᡖ.̟ஂ- +𞠠浘。絧𞀀; 𞠠浘.絧𞀀; [B2, B3]; xn--e0wp491f.xn--ud0a3573e; ; ; # 𞠠浘.絧𞀀 +xn--e0wp491f.xn--ud0a3573e; 𞠠浘.絧𞀀; [B2, B3]; xn--e0wp491f.xn--ud0a3573e; ; ; # 𞠠浘.絧𞀀 +֖Ⴋ.𝟳≯︒︊; ֖Ⴋ.7≯︒; [P1, V5, V6]; xn--hcb887c.xn--7-pgoy530h; ; ; # ֖Ⴋ.7≯︒ +֖Ⴋ.𝟳≯︒︊; ֖Ⴋ.7≯︒; [P1, V5, V6]; xn--hcb887c.xn--7-pgoy530h; ; ; # ֖Ⴋ.7≯︒ +֖Ⴋ.7≯。︊; ֖Ⴋ.7≯.; [P1, V5, V6]; xn--hcb887c.xn--7-pgo.; ; ; # ֖Ⴋ.7≯. +֖Ⴋ.7≯。︊; ֖Ⴋ.7≯.; [P1, V5, V6]; xn--hcb887c.xn--7-pgo.; ; ; # ֖Ⴋ.7≯. +֖ⴋ.7≯。︊; ֖ⴋ.7≯.; [P1, V5, V6]; xn--hcb613r.xn--7-pgo.; ; ; # ֖ⴋ.7≯. +֖ⴋ.7≯。︊; ֖ⴋ.7≯.; [P1, V5, V6]; xn--hcb613r.xn--7-pgo.; ; ; # ֖ⴋ.7≯. +xn--hcb613r.xn--7-pgo.; ֖ⴋ.7≯.; [V5, V6]; xn--hcb613r.xn--7-pgo.; ; ; # ֖ⴋ.7≯. +xn--hcb887c.xn--7-pgo.; ֖Ⴋ.7≯.; [V5, V6]; xn--hcb887c.xn--7-pgo.; ; ; # ֖Ⴋ.7≯. +֖ⴋ.𝟳≯︒︊; ֖ⴋ.7≯︒; [P1, V5, V6]; xn--hcb613r.xn--7-pgoy530h; ; ; # ֖ⴋ.7≯︒ +֖ⴋ.𝟳≯︒︊; ֖ⴋ.7≯︒; [P1, V5, V6]; xn--hcb613r.xn--7-pgoy530h; ; ; # ֖ⴋ.7≯︒ +xn--hcb613r.xn--7-pgoy530h; ֖ⴋ.7≯︒; [V5, V6]; xn--hcb613r.xn--7-pgoy530h; ; ; # ֖ⴋ.7≯︒ +xn--hcb887c.xn--7-pgoy530h; ֖Ⴋ.7≯︒; [V5, V6]; xn--hcb887c.xn--7-pgoy530h; ; ; # ֖Ⴋ.7≯︒ +‍F𑓂。󠺨︒ݾ𐹢; ‍f𑓂.󠺨︒ݾ𐹢; [B1, C2, P1, V6]; xn--f-tgn9761i.xn--fqb1637j8hky9452a; ; xn--f-kq9i.xn--fqb1637j8hky9452a; [B1, P1, V6] # f𑓂.︒ݾ𐹢 +‍F𑓂。󠺨。ݾ𐹢; ‍f𑓂.󠺨.ݾ𐹢; [B1, C2, P1, V6]; xn--f-tgn9761i.xn--7656e.xn--fqb4175k; ; xn--f-kq9i.xn--7656e.xn--fqb4175k; [B1, P1, V6] # f𑓂..ݾ𐹢 +‍f𑓂。󠺨。ݾ𐹢; ‍f𑓂.󠺨.ݾ𐹢; [B1, C2, P1, V6]; xn--f-tgn9761i.xn--7656e.xn--fqb4175k; ; xn--f-kq9i.xn--7656e.xn--fqb4175k; [B1, P1, V6] # f𑓂..ݾ𐹢 +xn--f-kq9i.xn--7656e.xn--fqb4175k; f𑓂.󠺨.ݾ𐹢; [B1, V6]; xn--f-kq9i.xn--7656e.xn--fqb4175k; ; ; # f𑓂..ݾ𐹢 +xn--f-tgn9761i.xn--7656e.xn--fqb4175k; ‍f𑓂.󠺨.ݾ𐹢; [B1, C2, V6]; xn--f-tgn9761i.xn--7656e.xn--fqb4175k; ; ; # f𑓂..ݾ𐹢 +‍f𑓂。󠺨︒ݾ𐹢; ‍f𑓂.󠺨︒ݾ𐹢; [B1, C2, P1, V6]; xn--f-tgn9761i.xn--fqb1637j8hky9452a; ; xn--f-kq9i.xn--fqb1637j8hky9452a; [B1, P1, V6] # f𑓂.︒ݾ𐹢 +xn--f-kq9i.xn--fqb1637j8hky9452a; f𑓂.󠺨︒ݾ𐹢; [B1, V6]; xn--f-kq9i.xn--fqb1637j8hky9452a; ; ; # f𑓂.︒ݾ𐹢 +xn--f-tgn9761i.xn--fqb1637j8hky9452a; ‍f𑓂.󠺨︒ݾ𐹢; [B1, C2, V6]; xn--f-tgn9761i.xn--fqb1637j8hky9452a; ; ; # f𑓂.︒ݾ𐹢 +ࡅ🄇𐼗︒。𐹻𑜫; ࡅ🄇𐼗︒.𐹻𑜫; [B1, B3, P1, V6]; xn--3vb4696jpxkjh7s.xn--zo0di2m; ; ; # ࡅ🄇𐼗︒.𐹻𑜫 +ࡅ6,𐼗。。𐹻𑜫; ࡅ6,𐼗..𐹻𑜫; [B1, P1, V6, X4_2]; xn--6,-r4e4420y..xn--zo0di2m; [B1, P1, V6, A4_2]; ; # ࡅ6,𐼗..𐹻𑜫 +xn--6,-r4e4420y..xn--zo0di2m; ࡅ6,𐼗..𐹻𑜫; [B1, P1, V6, X4_2]; xn--6,-r4e4420y..xn--zo0di2m; [B1, P1, V6, A4_2]; ; # ࡅ6,𐼗..𐹻𑜫 +xn--3vb4696jpxkjh7s.xn--zo0di2m; ࡅ🄇𐼗︒.𐹻𑜫; [B1, B3, V6]; xn--3vb4696jpxkjh7s.xn--zo0di2m; ; ; # ࡅ🄇𐼗︒.𐹻𑜫 +𐹈.᷀𑈱𐦭; ; [B1, P1, V5, V6]; xn--jn0d.xn--7dg0871h3lf; ; ; # .᷀𑈱𐦭 +xn--jn0d.xn--7dg0871h3lf; 𐹈.᷀𑈱𐦭; [B1, V5, V6]; xn--jn0d.xn--7dg0871h3lf; ; ; # .᷀𑈱𐦭 +Ⴂ䠺。𞤃񅏎󙮦ړ; Ⴂ䠺.𞤥񅏎󙮦ړ; [B2, P1, V6]; xn--9md875z.xn--pjb9818vg4xno967d; ; ; # Ⴂ䠺.𞤥ړ +ⴂ䠺。𞤥񅏎󙮦ړ; ⴂ䠺.𞤥񅏎󙮦ړ; [B2, P1, V6]; xn--tkj638f.xn--pjb9818vg4xno967d; ; ; # ⴂ䠺.𞤥ړ +xn--tkj638f.xn--pjb9818vg4xno967d; ⴂ䠺.𞤥񅏎󙮦ړ; [B2, V6]; xn--tkj638f.xn--pjb9818vg4xno967d; ; ; # ⴂ䠺.𞤥ړ +xn--9md875z.xn--pjb9818vg4xno967d; Ⴂ䠺.𞤥񅏎󙮦ړ; [B2, V6]; xn--9md875z.xn--pjb9818vg4xno967d; ; ; # Ⴂ䠺.𞤥ړ +ⴂ䠺。𞤃񅏎󙮦ړ; ⴂ䠺.𞤥񅏎󙮦ړ; [B2, P1, V6]; xn--tkj638f.xn--pjb9818vg4xno967d; ; ; # ⴂ䠺.𞤥ړ +🄇伐︒.𜙚꣄; ; [P1, V6]; xn--woqs083bel0g.xn--0f9ao925c; ; ; # 🄇伐︒.꣄ +6,伐。.𜙚꣄; 6,伐..𜙚꣄; [P1, V6, X4_2]; xn--6,-7i3c..xn--0f9ao925c; [P1, V6, A4_2]; ; # 6,伐..꣄ +xn--6,-7i3c..xn--0f9ao925c; 6,伐..𜙚꣄; [P1, V6, X4_2]; xn--6,-7i3c..xn--0f9ao925c; [P1, V6, A4_2]; ; # 6,伐..꣄ +xn--woqs083bel0g.xn--0f9ao925c; 🄇伐︒.𜙚꣄; [V6]; xn--woqs083bel0g.xn--0f9ao925c; ; ; # 🄇伐︒.꣄ +‍𐹠꯭。‍𐫓Ⴚ𑂹; ‍𐹠꯭.‍𐫓Ⴚ𑂹; [B1, C2, P1, V6]; xn--1ugz126coy7bdbm.xn--ynd959evs1pv6e; ; xn--429az70n29i.xn--ynd3619jqyd; [B1, B2, B3, P1, V6] # 𐹠꯭.𐫓Ⴚ𑂹 +‍𐹠꯭。‍𐫓ⴚ𑂹; ‍𐹠꯭.‍𐫓ⴚ𑂹; [B1, C2, P1, V6]; xn--1ugz126coy7bdbm.xn--1ug062chv7ov6e; ; xn--429az70n29i.xn--ilj7702eqyd; [B1, B2, B3, P1, V6] # 𐹠꯭.𐫓ⴚ𑂹 +xn--429az70n29i.xn--ilj7702eqyd; 𐹠꯭.𐫓ⴚ𑂹; [B1, B2, B3, V6]; xn--429az70n29i.xn--ilj7702eqyd; ; ; # 𐹠꯭.𐫓ⴚ𑂹 +xn--1ugz126coy7bdbm.xn--1ug062chv7ov6e; ‍𐹠꯭.‍𐫓ⴚ𑂹; [B1, C2, V6]; xn--1ugz126coy7bdbm.xn--1ug062chv7ov6e; ; ; # 𐹠꯭.𐫓ⴚ𑂹 +xn--429az70n29i.xn--ynd3619jqyd; 𐹠꯭.𐫓Ⴚ𑂹; [B1, B2, B3, V6]; xn--429az70n29i.xn--ynd3619jqyd; ; ; # 𐹠꯭.𐫓Ⴚ𑂹 +xn--1ugz126coy7bdbm.xn--ynd959evs1pv6e; ‍𐹠꯭.‍𐫓Ⴚ𑂹; [B1, C2, V6]; xn--1ugz126coy7bdbm.xn--ynd959evs1pv6e; ; ; # 𐹠꯭.𐫓Ⴚ𑂹 +󠆠.񷐴󌟈; .񷐴󌟈; [P1, V6, X4_2]; .xn--rx21bhv12i; [P1, V6, A4_2]; ; # . +󠆠.񷐴󌟈; .񷐴󌟈; [P1, V6, X4_2]; .xn--rx21bhv12i; [P1, V6, A4_2]; ; # . +.xn--rx21bhv12i; .񷐴󌟈; [V6, X4_2]; .xn--rx21bhv12i; [V6, A4_2]; ; # . +𐫃‌Ⴆ.≠𞷙; ; [B1, B2, B3, C1, P1, V6]; xn--end799ekr1p.xn--1ch2802p; ; xn--end1719j.xn--1ch2802p; [B1, B2, B3, P1, V6] # 𐫃Ⴆ.≠ +𐫃‌Ⴆ.≠𞷙; 𐫃‌Ⴆ.≠𞷙; [B1, B2, B3, C1, P1, V6]; xn--end799ekr1p.xn--1ch2802p; ; xn--end1719j.xn--1ch2802p; [B1, B2, B3, P1, V6] # 𐫃Ⴆ.≠ +𐫃‌ⴆ.≠𞷙; 𐫃‌ⴆ.≠𞷙; [B1, B2, B3, C1, P1, V6]; xn--0ug132csv7o.xn--1ch2802p; ; xn--xkjz802e.xn--1ch2802p; [B1, B2, B3, P1, V6] # 𐫃ⴆ.≠ +𐫃‌ⴆ.≠𞷙; ; [B1, B2, B3, C1, P1, V6]; xn--0ug132csv7o.xn--1ch2802p; ; xn--xkjz802e.xn--1ch2802p; [B1, B2, B3, P1, V6] # 𐫃ⴆ.≠ +xn--xkjz802e.xn--1ch2802p; 𐫃ⴆ.≠𞷙; [B1, B2, B3, V6]; xn--xkjz802e.xn--1ch2802p; ; ; # 𐫃ⴆ.≠ +xn--0ug132csv7o.xn--1ch2802p; 𐫃‌ⴆ.≠𞷙; [B1, B2, B3, C1, V6]; xn--0ug132csv7o.xn--1ch2802p; ; ; # 𐫃ⴆ.≠ +xn--end1719j.xn--1ch2802p; 𐫃Ⴆ.≠𞷙; [B1, B2, B3, V6]; xn--end1719j.xn--1ch2802p; ; ; # 𐫃Ⴆ.≠ +xn--end799ekr1p.xn--1ch2802p; 𐫃‌Ⴆ.≠𞷙; [B1, B2, B3, C1, V6]; xn--end799ekr1p.xn--1ch2802p; ; ; # 𐫃Ⴆ.≠ +󠁲𙩢𝟥ꘌ.ࡁ; 󠁲𙩢3ꘌ.ࡁ; [B1, P1, V6]; xn--3-0g3es485d8i15h.xn--zvb; ; ; # 3ꘌ.ࡁ +󠁲𙩢3ꘌ.ࡁ; ; [B1, P1, V6]; xn--3-0g3es485d8i15h.xn--zvb; ; ; # 3ꘌ.ࡁ +xn--3-0g3es485d8i15h.xn--zvb; 󠁲𙩢3ꘌ.ࡁ; [B1, V6]; xn--3-0g3es485d8i15h.xn--zvb; ; ; # 3ꘌ.ࡁ +-.ᢆ󡲣-; ; [P1, V3, V5, V6]; -.xn----pbkx6497q; ; ; # -.ᢆ- +-.xn----pbkx6497q; -.ᢆ󡲣-; [V3, V5, V6]; -.xn----pbkx6497q; ; ; # -.ᢆ- +󲚗‌。‌𞰆ς; 󲚗‌.‌𞰆ς; [B1, B6, C1, P1, V6]; xn--0ug76062m.xn--3xa795lhn92a; ; xn--qp42f.xn--4xa3011w; [B2, B3, P1, V6] # .ς +󲚗‌。‌𞰆ς; 󲚗‌.‌𞰆ς; [B1, B6, C1, P1, V6]; xn--0ug76062m.xn--3xa795lhn92a; ; xn--qp42f.xn--4xa3011w; [B2, B3, P1, V6] # .ς +󲚗‌。‌𞰆Σ; 󲚗‌.‌𞰆σ; [B1, B6, C1, P1, V6]; xn--0ug76062m.xn--4xa595lhn92a; ; xn--qp42f.xn--4xa3011w; [B2, B3, P1, V6] # .σ +󲚗‌。‌𞰆σ; 󲚗‌.‌𞰆σ; [B1, B6, C1, P1, V6]; xn--0ug76062m.xn--4xa595lhn92a; ; xn--qp42f.xn--4xa3011w; [B2, B3, P1, V6] # .σ +xn--qp42f.xn--4xa3011w; 󲚗.𞰆σ; [B2, B3, V6]; xn--qp42f.xn--4xa3011w; ; ; # .σ +xn--0ug76062m.xn--4xa595lhn92a; 󲚗‌.‌𞰆σ; [B1, B6, C1, V6]; xn--0ug76062m.xn--4xa595lhn92a; ; ; # .σ +xn--0ug76062m.xn--3xa795lhn92a; 󲚗‌.‌𞰆ς; [B1, B6, C1, V6]; xn--0ug76062m.xn--3xa795lhn92a; ; ; # .ς +󲚗‌。‌𞰆Σ; 󲚗‌.‌𞰆σ; [B1, B6, C1, P1, V6]; xn--0ug76062m.xn--4xa595lhn92a; ; xn--qp42f.xn--4xa3011w; [B2, B3, P1, V6] # .σ +󲚗‌。‌𞰆σ; 󲚗‌.‌𞰆σ; [B1, B6, C1, P1, V6]; xn--0ug76062m.xn--4xa595lhn92a; ; xn--qp42f.xn--4xa3011w; [B2, B3, P1, V6] # .σ +堕𑓂ᬂ。𐮇𞤽‌-; 堕𑓂ᬂ.𐮇𞤽‌-; [B3, C1, V3]; xn--5sf345zdk8h.xn----rgnt157hwl9g; ; xn--5sf345zdk8h.xn----iv5iw606c; [B3, V3] # 堕𑓂ᬂ.𐮇𞤽- +堕𑓂ᬂ。𐮇𞤛‌-; 堕𑓂ᬂ.𐮇𞤽‌-; [B3, C1, V3]; xn--5sf345zdk8h.xn----rgnt157hwl9g; ; xn--5sf345zdk8h.xn----iv5iw606c; [B3, V3] # 堕𑓂ᬂ.𐮇𞤽- +xn--5sf345zdk8h.xn----iv5iw606c; 堕𑓂ᬂ.𐮇𞤽-; [B3, V3]; xn--5sf345zdk8h.xn----iv5iw606c; ; ; # 堕𑓂ᬂ.𐮇𞤽- +xn--5sf345zdk8h.xn----rgnt157hwl9g; 堕𑓂ᬂ.𐮇𞤽‌-; [B3, C1, V3]; xn--5sf345zdk8h.xn----rgnt157hwl9g; ; ; # 堕𑓂ᬂ.𐮇𞤽- +𐹶𑁆ᡕ𞤢。ᡥςتς; 𐹶𑁆ᡕ𞤢.ᡥςتς; [B1, B5]; xn--l8e1317j1ebz456b.xn--3xaa16plx4a; ; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; # 𐹶𑁆ᡕ𞤢.ᡥςتς +𐹶𑁆ᡕ𞤢。ᡥςتς; 𐹶𑁆ᡕ𞤢.ᡥςتς; [B1, B5]; xn--l8e1317j1ebz456b.xn--3xaa16plx4a; ; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; # 𐹶𑁆ᡕ𞤢.ᡥςتς +𐹶𑁆ᡕ𞤀。ᡥΣتΣ; 𐹶𑁆ᡕ𞤢.ᡥσتσ; [B1, B5]; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; ; ; # 𐹶𑁆ᡕ𞤢.ᡥσتσ +𐹶𑁆ᡕ𞤢。ᡥσتσ; 𐹶𑁆ᡕ𞤢.ᡥσتσ; [B1, B5]; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; ; ; # 𐹶𑁆ᡕ𞤢.ᡥσتσ +xn--l8e1317j1ebz456b.xn--4xaa85plx4a; 𐹶𑁆ᡕ𞤢.ᡥσتσ; [B1, B5]; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; ; ; # 𐹶𑁆ᡕ𞤢.ᡥσتσ +xn--l8e1317j1ebz456b.xn--3xaa16plx4a; 𐹶𑁆ᡕ𞤢.ᡥςتς; [B1, B5]; xn--l8e1317j1ebz456b.xn--3xaa16plx4a; ; ; # 𐹶𑁆ᡕ𞤢.ᡥςتς +𐹶𑁆ᡕ𞤀。ᡥΣتΣ; 𐹶𑁆ᡕ𞤢.ᡥσتσ; [B1, B5]; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; ; ; # 𐹶𑁆ᡕ𞤢.ᡥσتσ +𐹶𑁆ᡕ𞤢。ᡥσتσ; 𐹶𑁆ᡕ𞤢.ᡥσتσ; [B1, B5]; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; ; ; # 𐹶𑁆ᡕ𞤢.ᡥσتσ +𐹶𑁆ᡕ𞤢。ᡥΣتΣ; 𐹶𑁆ᡕ𞤢.ᡥσتσ; [B1, B5]; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; ; ; # 𐹶𑁆ᡕ𞤢.ᡥσتσ +𐹶𑁆ᡕ𞤢。ᡥΣتσ; 𐹶𑁆ᡕ𞤢.ᡥσتσ; [B1, B5]; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; ; ; # 𐹶𑁆ᡕ𞤢.ᡥσتσ +𐹶𑁆ᡕ𞤢。ᡥΣتς; 𐹶𑁆ᡕ𞤢.ᡥσتς; [B1, B5]; xn--l8e1317j1ebz456b.xn--3xab95plx4a; ; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; # 𐹶𑁆ᡕ𞤢.ᡥσتς +𐹶𑁆ᡕ𞤢。ᡥσتς; 𐹶𑁆ᡕ𞤢.ᡥσتς; [B1, B5]; xn--l8e1317j1ebz456b.xn--3xab95plx4a; ; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; # 𐹶𑁆ᡕ𞤢.ᡥσتς +xn--l8e1317j1ebz456b.xn--3xab95plx4a; 𐹶𑁆ᡕ𞤢.ᡥσتς; [B1, B5]; xn--l8e1317j1ebz456b.xn--3xab95plx4a; ; ; # 𐹶𑁆ᡕ𞤢.ᡥσتς +𐹶𑁆ᡕ𞤢。ᡥΣتΣ; 𐹶𑁆ᡕ𞤢.ᡥσتσ; [B1, B5]; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; ; ; # 𐹶𑁆ᡕ𞤢.ᡥσتσ +𐹶𑁆ᡕ𞤢。ᡥΣتσ; 𐹶𑁆ᡕ𞤢.ᡥσتσ; [B1, B5]; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; ; ; # 𐹶𑁆ᡕ𞤢.ᡥσتσ +𐹶𑁆ᡕ𞤢。ᡥΣتς; 𐹶𑁆ᡕ𞤢.ᡥσتς; [B1, B5]; xn--l8e1317j1ebz456b.xn--3xab95plx4a; ; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; # 𐹶𑁆ᡕ𞤢.ᡥσتς +𐹶𑁆ᡕ𞤢。ᡥσتς; 𐹶𑁆ᡕ𞤢.ᡥσتς; [B1, B5]; xn--l8e1317j1ebz456b.xn--3xab95plx4a; ; xn--l8e1317j1ebz456b.xn--4xaa85plx4a; # 𐹶𑁆ᡕ𞤢.ᡥσتς +󏒰.-𝟻ß; 󏒰.-5ß; [P1, V3, V6]; xn--t960e.xn---5-hia; ; xn--t960e.-5ss; # .-5ß +󏒰.-5ß; ; [P1, V3, V6]; xn--t960e.xn---5-hia; ; xn--t960e.-5ss; # .-5ß +󏒰.-5SS; 󏒰.-5ss; [P1, V3, V6]; xn--t960e.-5ss; ; ; # .-5ss +󏒰.-5ss; ; [P1, V3, V6]; xn--t960e.-5ss; ; ; # .-5ss +xn--t960e.-5ss; 󏒰.-5ss; [V3, V6]; xn--t960e.-5ss; ; ; # .-5ss +xn--t960e.xn---5-hia; 󏒰.-5ß; [V3, V6]; xn--t960e.xn---5-hia; ; ; # .-5ß +󏒰.-𝟻SS; 󏒰.-5ss; [P1, V3, V6]; xn--t960e.-5ss; ; ; # .-5ss +󏒰.-𝟻ss; 󏒰.-5ss; [P1, V3, V6]; xn--t960e.-5ss; ; ; # .-5ss +󏒰.-𝟻Ss; 󏒰.-5ss; [P1, V3, V6]; xn--t960e.-5ss; ; ; # .-5ss +󏒰.-5Ss; 󏒰.-5ss; [P1, V3, V6]; xn--t960e.-5ss; ; ; # .-5ss +‍𐨿.🤒Ⴥ򑮶; ; [C2, P1, V6]; xn--1ug9533g.xn--9nd3211w0gz4b; ; xn--0s9c.xn--9nd3211w0gz4b; [P1, V5, V6] # 𐨿.🤒Ⴥ +‍𐨿.🤒ⴥ򑮶; ; [C2, P1, V6]; xn--1ug9533g.xn--tljz038l0gz4b; ; xn--0s9c.xn--tljz038l0gz4b; [P1, V5, V6] # 𐨿.🤒ⴥ +xn--0s9c.xn--tljz038l0gz4b; 𐨿.🤒ⴥ򑮶; [V5, V6]; xn--0s9c.xn--tljz038l0gz4b; ; ; # 𐨿.🤒ⴥ +xn--1ug9533g.xn--tljz038l0gz4b; ‍𐨿.🤒ⴥ򑮶; [C2, V6]; xn--1ug9533g.xn--tljz038l0gz4b; ; ; # 𐨿.🤒ⴥ +xn--0s9c.xn--9nd3211w0gz4b; 𐨿.🤒Ⴥ򑮶; [V5, V6]; xn--0s9c.xn--9nd3211w0gz4b; ; ; # 𐨿.🤒Ⴥ +xn--1ug9533g.xn--9nd3211w0gz4b; ‍𐨿.🤒Ⴥ򑮶; [C2, V6]; xn--1ug9533g.xn--9nd3211w0gz4b; ; ; # 𐨿.🤒Ⴥ +𵋅。ß𬵩‍; 𵋅.ß𬵩‍; [C2, P1, V6]; xn--ey1p.xn--zca870nz438b; ; xn--ey1p.xn--ss-eq36b; [P1, V6] # .ß𬵩 +𵋅。SS𬵩‍; 𵋅.ss𬵩‍; [C2, P1, V6]; xn--ey1p.xn--ss-n1tx0508a; ; xn--ey1p.xn--ss-eq36b; [P1, V6] # .ss𬵩 +𵋅。ss𬵩‍; 𵋅.ss𬵩‍; [C2, P1, V6]; xn--ey1p.xn--ss-n1tx0508a; ; xn--ey1p.xn--ss-eq36b; [P1, V6] # .ss𬵩 +𵋅。Ss𬵩‍; 𵋅.ss𬵩‍; [C2, P1, V6]; xn--ey1p.xn--ss-n1tx0508a; ; xn--ey1p.xn--ss-eq36b; [P1, V6] # .ss𬵩 +xn--ey1p.xn--ss-eq36b; 𵋅.ss𬵩; [V6]; xn--ey1p.xn--ss-eq36b; ; ; # .ss𬵩 +xn--ey1p.xn--ss-n1tx0508a; 𵋅.ss𬵩‍; [C2, V6]; xn--ey1p.xn--ss-n1tx0508a; ; ; # .ss𬵩 +xn--ey1p.xn--zca870nz438b; 𵋅.ß𬵩‍; [C2, V6]; xn--ey1p.xn--zca870nz438b; ; ; # .ß𬵩 +‌𭉝。߱́𞹻; ‌𭉝.߱́غ; [B1, C1, V5]; xn--0ugy003y.xn--lsa46nuub; ; xn--634m.xn--lsa46nuub; [B1, V5] # 𭉝.߱́غ +‌𭉝。߱́غ; ‌𭉝.߱́غ; [B1, C1, V5]; xn--0ugy003y.xn--lsa46nuub; ; xn--634m.xn--lsa46nuub; [B1, V5] # 𭉝.߱́غ +xn--634m.xn--lsa46nuub; 𭉝.߱́غ; [B1, V5]; xn--634m.xn--lsa46nuub; ; ; # 𭉝.߱́غ +xn--0ugy003y.xn--lsa46nuub; ‌𭉝.߱́غ; [B1, C1, V5]; xn--0ugy003y.xn--lsa46nuub; ; ; # 𭉝.߱́غ +𞼌‌𑈶。𐹡; 𞼌‌𑈶.𐹡; [B1, B3, C1, P1, V6]; xn--0ug7946gzpxf.xn--8n0d; ; xn--9g1d1288a.xn--8n0d; [B1, P1, V6] # 𑈶.𐹡 +xn--9g1d1288a.xn--8n0d; 𞼌𑈶.𐹡; [B1, V6]; xn--9g1d1288a.xn--8n0d; ; ; # 𑈶.𐹡 +xn--0ug7946gzpxf.xn--8n0d; 𞼌‌𑈶.𐹡; [B1, B3, C1, V6]; xn--0ug7946gzpxf.xn--8n0d; ; ; # 𑈶.𐹡 +󠅯򇽭‌🜭。𑖿᪻ς≠; 򇽭‌🜭.𑖿᪻ς≠; [C1, P1, V5, V6]; xn--0ug3766p5nm1b.xn--3xa578i1mfjw7y; ; xn--zb9h5968x.xn--4xa378i1mfjw7y; [P1, V5, V6] # 🜭.𑖿᪻ς≠ +󠅯򇽭‌🜭。𑖿᪻ς≠; 򇽭‌🜭.𑖿᪻ς≠; [C1, P1, V5, V6]; xn--0ug3766p5nm1b.xn--3xa578i1mfjw7y; ; xn--zb9h5968x.xn--4xa378i1mfjw7y; [P1, V5, V6] # 🜭.𑖿᪻ς≠ +󠅯򇽭‌🜭。𑖿᪻ς≠; 򇽭‌🜭.𑖿᪻ς≠; [C1, P1, V5, V6]; xn--0ug3766p5nm1b.xn--3xa578i1mfjw7y; ; xn--zb9h5968x.xn--4xa378i1mfjw7y; [P1, V5, V6] # 🜭.𑖿᪻ς≠ +󠅯򇽭‌🜭。𑖿᪻ς≠; 򇽭‌🜭.𑖿᪻ς≠; [C1, P1, V5, V6]; xn--0ug3766p5nm1b.xn--3xa578i1mfjw7y; ; xn--zb9h5968x.xn--4xa378i1mfjw7y; [P1, V5, V6] # 🜭.𑖿᪻ς≠ +󠅯򇽭‌🜭。𑖿᪻Σ≠; 򇽭‌🜭.𑖿᪻σ≠; [C1, P1, V5, V6]; xn--0ug3766p5nm1b.xn--4xa378i1mfjw7y; ; xn--zb9h5968x.xn--4xa378i1mfjw7y; [P1, V5, V6] # 🜭.𑖿᪻σ≠ +󠅯򇽭‌🜭。𑖿᪻Σ≠; 򇽭‌🜭.𑖿᪻σ≠; [C1, P1, V5, V6]; xn--0ug3766p5nm1b.xn--4xa378i1mfjw7y; ; xn--zb9h5968x.xn--4xa378i1mfjw7y; [P1, V5, V6] # 🜭.𑖿᪻σ≠ +󠅯򇽭‌🜭。𑖿᪻σ≠; 򇽭‌🜭.𑖿᪻σ≠; [C1, P1, V5, V6]; xn--0ug3766p5nm1b.xn--4xa378i1mfjw7y; ; xn--zb9h5968x.xn--4xa378i1mfjw7y; [P1, V5, V6] # 🜭.𑖿᪻σ≠ +󠅯򇽭‌🜭。𑖿᪻σ≠; 򇽭‌🜭.𑖿᪻σ≠; [C1, P1, V5, V6]; xn--0ug3766p5nm1b.xn--4xa378i1mfjw7y; ; xn--zb9h5968x.xn--4xa378i1mfjw7y; [P1, V5, V6] # 🜭.𑖿᪻σ≠ +xn--zb9h5968x.xn--4xa378i1mfjw7y; 򇽭🜭.𑖿᪻σ≠; [V5, V6]; xn--zb9h5968x.xn--4xa378i1mfjw7y; ; ; # 🜭.𑖿᪻σ≠ +xn--0ug3766p5nm1b.xn--4xa378i1mfjw7y; 򇽭‌🜭.𑖿᪻σ≠; [C1, V5, V6]; xn--0ug3766p5nm1b.xn--4xa378i1mfjw7y; ; ; # 🜭.𑖿᪻σ≠ +xn--0ug3766p5nm1b.xn--3xa578i1mfjw7y; 򇽭‌🜭.𑖿᪻ς≠; [C1, V5, V6]; xn--0ug3766p5nm1b.xn--3xa578i1mfjw7y; ; ; # 🜭.𑖿᪻ς≠ +󠅯򇽭‌🜭。𑖿᪻Σ≠; 򇽭‌🜭.𑖿᪻σ≠; [C1, P1, V5, V6]; xn--0ug3766p5nm1b.xn--4xa378i1mfjw7y; ; xn--zb9h5968x.xn--4xa378i1mfjw7y; [P1, V5, V6] # 🜭.𑖿᪻σ≠ +󠅯򇽭‌🜭。𑖿᪻Σ≠; 򇽭‌🜭.𑖿᪻σ≠; [C1, P1, V5, V6]; xn--0ug3766p5nm1b.xn--4xa378i1mfjw7y; ; xn--zb9h5968x.xn--4xa378i1mfjw7y; [P1, V5, V6] # 🜭.𑖿᪻σ≠ +󠅯򇽭‌🜭。𑖿᪻σ≠; 򇽭‌🜭.𑖿᪻σ≠; [C1, P1, V5, V6]; xn--0ug3766p5nm1b.xn--4xa378i1mfjw7y; ; xn--zb9h5968x.xn--4xa378i1mfjw7y; [P1, V5, V6] # 🜭.𑖿᪻σ≠ +󠅯򇽭‌🜭。𑖿᪻σ≠; 򇽭‌🜭.𑖿᪻σ≠; [C1, P1, V5, V6]; xn--0ug3766p5nm1b.xn--4xa378i1mfjw7y; ; xn--zb9h5968x.xn--4xa378i1mfjw7y; [P1, V5, V6] # 🜭.𑖿᪻σ≠ +⒋。⒈‍򳴢; ⒋.⒈‍򳴢; [C2, P1, V6]; xn--wsh.xn--1ug58o74922a; ; xn--wsh.xn--tsh07994h; [P1, V6] # ⒋.⒈ +4.。1.‍򳴢; 4..1.‍򳴢; [C2, P1, V6, X4_2]; 4..1.xn--1ug64613i; [C2, P1, V6, A4_2]; 4..1.xn--sf51d; [P1, V6, A4_2] # 4..1. +4..1.xn--sf51d; 4..1.򳴢; [V6, X4_2]; 4..1.xn--sf51d; [V6, A4_2]; ; # 4..1. +4..1.xn--1ug64613i; 4..1.‍򳴢; [C2, V6, X4_2]; 4..1.xn--1ug64613i; [C2, V6, A4_2]; ; # 4..1. +xn--wsh.xn--tsh07994h; ⒋.⒈򳴢; [V6]; xn--wsh.xn--tsh07994h; ; ; # ⒋.⒈ +xn--wsh.xn--1ug58o74922a; ⒋.⒈‍򳴢; [C2, V6]; xn--wsh.xn--1ug58o74922a; ; ; # ⒋.⒈ +لß。᩠𐇽򾅢𞤾; لß.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--zca57y.xn--jof2298hn83fln78f; ; xn--ss-svd.xn--jof2298hn83fln78f; # لß.᩠𐇽𞤾 +لß。᩠𐇽򾅢𞤾; لß.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--zca57y.xn--jof2298hn83fln78f; ; xn--ss-svd.xn--jof2298hn83fln78f; # لß.᩠𐇽𞤾 +لß。᩠𐇽򾅢𞤾; لß.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--zca57y.xn--jof2298hn83fln78f; ; xn--ss-svd.xn--jof2298hn83fln78f; # لß.᩠𐇽𞤾 +لSS。᩠𐇽򾅢𞤜; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +لss。᩠𐇽򾅢𞤾; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +لss。᩠𐇽򾅢𞤜; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +xn--ss-svd.xn--jof2298hn83fln78f; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +لß。᩠𐇽򾅢𞤜; لß.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--zca57y.xn--jof2298hn83fln78f; ; xn--ss-svd.xn--jof2298hn83fln78f; # لß.᩠𐇽𞤾 +xn--zca57y.xn--jof2298hn83fln78f; لß.᩠𐇽򾅢𞤾; [B1, B2, B3, V5, V6]; xn--zca57y.xn--jof2298hn83fln78f; ; ; # لß.᩠𐇽𞤾 +لSS。᩠𐇽򾅢𞤜; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +لss。᩠𐇽򾅢𞤾; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +لss。᩠𐇽򾅢𞤜; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +لß。᩠𐇽򾅢𞤜; لß.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--zca57y.xn--jof2298hn83fln78f; ; xn--ss-svd.xn--jof2298hn83fln78f; # لß.᩠𐇽𞤾 +لSS。᩠𐇽򾅢𞤜; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +لss。᩠𐇽򾅢𞤾; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +لss。᩠𐇽򾅢𞤜; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +لß。᩠𐇽򾅢𞤜; لß.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--zca57y.xn--jof2298hn83fln78f; ; xn--ss-svd.xn--jof2298hn83fln78f; # لß.᩠𐇽𞤾 +لSS。᩠𐇽򾅢𞤾; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +لSs。᩠𐇽򾅢𞤾; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +لSS。᩠𐇽򾅢𞤾; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +لSs。᩠𐇽򾅢𞤾; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +لSS。᩠𐇽򾅢𞤾; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +لSs。᩠𐇽򾅢𞤾; لss.᩠𐇽򾅢𞤾; [B1, B2, B3, P1, V5, V6]; xn--ss-svd.xn--jof2298hn83fln78f; ; ; # لss.᩠𐇽𞤾 +𐹽𑄳񼜲.ᷟី꠆𑜫; ; [B1, B3, B6, P1, V5, V6]; xn--1o0di0c0652w.xn--33e362arr1l153d; ; ; # 𐹽𑄳.ᷟី꠆𑜫 +xn--1o0di0c0652w.xn--33e362arr1l153d; 𐹽𑄳񼜲.ᷟី꠆𑜫; [B1, B3, B6, V5, V6]; xn--1o0di0c0652w.xn--33e362arr1l153d; ; ; # 𐹽𑄳.ᷟី꠆𑜫 +Ⴓ𑜫‍򗭓.ڧ𑰶; Ⴓ𑜫‍򗭓.ڧ𑰶; [P1, V6]; xn--rnd479ep20q7x12e.xn--9jb4223l; ; xn--rnd8945ky009c.xn--9jb4223l; # Ⴓ𑜫.ڧ𑰶 +Ⴓ𑜫‍򗭓.ڧ𑰶; ; [P1, V6]; xn--rnd479ep20q7x12e.xn--9jb4223l; ; xn--rnd8945ky009c.xn--9jb4223l; # Ⴓ𑜫.ڧ𑰶 +ⴓ𑜫‍򗭓.ڧ𑰶; ; [P1, V6]; xn--1ugy52cym7p7xu5e.xn--9jb4223l; ; xn--blj6306ey091d.xn--9jb4223l; # ⴓ𑜫.ڧ𑰶 +xn--blj6306ey091d.xn--9jb4223l; ⴓ𑜫򗭓.ڧ𑰶; [V6]; xn--blj6306ey091d.xn--9jb4223l; ; ; # ⴓ𑜫.ڧ𑰶 +xn--1ugy52cym7p7xu5e.xn--9jb4223l; ⴓ𑜫‍򗭓.ڧ𑰶; [V6]; xn--1ugy52cym7p7xu5e.xn--9jb4223l; ; ; # ⴓ𑜫.ڧ𑰶 +xn--rnd8945ky009c.xn--9jb4223l; Ⴓ𑜫򗭓.ڧ𑰶; [V6]; xn--rnd8945ky009c.xn--9jb4223l; ; ; # Ⴓ𑜫.ڧ𑰶 +xn--rnd479ep20q7x12e.xn--9jb4223l; Ⴓ𑜫‍򗭓.ڧ𑰶; [V6]; xn--rnd479ep20q7x12e.xn--9jb4223l; ; ; # Ⴓ𑜫.ڧ𑰶 +ⴓ𑜫‍򗭓.ڧ𑰶; ⴓ𑜫‍򗭓.ڧ𑰶; [P1, V6]; xn--1ugy52cym7p7xu5e.xn--9jb4223l; ; xn--blj6306ey091d.xn--9jb4223l; # ⴓ𑜫.ڧ𑰶 +𐨿.🄆—; ; [P1, V5, V6]; xn--0s9c.xn--8ug8324p; ; ; # 𐨿.🄆— +𐨿.5,—; ; [P1, V5, V6]; xn--0s9c.xn--5,-81t; ; ; # 𐨿.5,— +xn--0s9c.xn--5,-81t; 𐨿.5,—; [P1, V5, V6]; xn--0s9c.xn--5,-81t; ; ; # 𐨿.5,— +xn--0s9c.xn--8ug8324p; 𐨿.🄆—; [V5, V6]; xn--0s9c.xn--8ug8324p; ; ; # 𐨿.🄆— +򔊱񁦮۸。󠾭-; 򔊱񁦮۸.󠾭-; [P1, V3, V6]; xn--lmb18944c0g2z.xn----2k81m; ; ; # ۸.- +xn--lmb18944c0g2z.xn----2k81m; 򔊱񁦮۸.󠾭-; [V3, V6]; xn--lmb18944c0g2z.xn----2k81m; ; ; # ۸.- +𼗸ߍ𐹮。۝ᡎᠴ; 𼗸ߍ𐹮.۝ᡎᠴ; [B1, B5, B6, P1, V6]; xn--osb0855kcc2r.xn--tlb299fhc; ; ; # ߍ𐹮.ᡎᠴ +xn--osb0855kcc2r.xn--tlb299fhc; 𼗸ߍ𐹮.۝ᡎᠴ; [B1, B5, B6, V6]; xn--osb0855kcc2r.xn--tlb299fhc; ; ; # ߍ𐹮.ᡎᠴ +‍ᠮႾ🄂.🚗ࡁ𮹌‌; ; [B1, C1, C2, P1, V6]; xn--2nd129ay2gnw71c.xn--zvb692j9664aic1g; ; xn--2nd129ai554b.xn--zvb3124wpkpf; [B1, P1, V6] # ᠮႾ🄂.🚗ࡁ +‍ᠮႾ1,.🚗ࡁ𮹌‌; ; [B1, C1, C2, P1, V6]; xn--1,-ogkx89c39j.xn--zvb692j9664aic1g; ; xn--1,-ogkx89c.xn--zvb3124wpkpf; [B1, B6, P1, V6] # ᠮႾ1,.🚗ࡁ +‍ᠮⴞ1,.🚗ࡁ𮹌‌; ; [B1, C1, C2, P1, V6]; xn--1,-v3o161c53q.xn--zvb692j9664aic1g; ; xn--1,-v3o625k.xn--zvb3124wpkpf; [B1, B6, P1, V6] # ᠮⴞ1,.🚗ࡁ +xn--1,-v3o625k.xn--zvb3124wpkpf; ᠮⴞ1,.🚗ࡁ𮹌; [B1, B6, P1, V6]; xn--1,-v3o625k.xn--zvb3124wpkpf; ; ; # ᠮⴞ1,.🚗ࡁ +xn--1,-v3o161c53q.xn--zvb692j9664aic1g; ‍ᠮⴞ1,.🚗ࡁ𮹌‌; [B1, C1, C2, P1, V6]; xn--1,-v3o161c53q.xn--zvb692j9664aic1g; ; ; # ᠮⴞ1,.🚗ࡁ +xn--1,-ogkx89c.xn--zvb3124wpkpf; ᠮႾ1,.🚗ࡁ𮹌; [B1, B6, P1, V6]; xn--1,-ogkx89c.xn--zvb3124wpkpf; ; ; # ᠮႾ1,.🚗ࡁ +xn--1,-ogkx89c39j.xn--zvb692j9664aic1g; ‍ᠮႾ1,.🚗ࡁ𮹌‌; [B1, C1, C2, P1, V6]; xn--1,-ogkx89c39j.xn--zvb692j9664aic1g; ; ; # ᠮႾ1,.🚗ࡁ +‍ᠮⴞ🄂.🚗ࡁ𮹌‌; ; [B1, C1, C2, P1, V6]; xn--h7e341b0wlbv45b.xn--zvb692j9664aic1g; ; xn--h7e438h1p44a.xn--zvb3124wpkpf; [B1, P1, V6] # ᠮⴞ🄂.🚗ࡁ +xn--h7e438h1p44a.xn--zvb3124wpkpf; ᠮⴞ🄂.🚗ࡁ𮹌; [B1, V6]; xn--h7e438h1p44a.xn--zvb3124wpkpf; ; ; # ᠮⴞ🄂.🚗ࡁ +xn--h7e341b0wlbv45b.xn--zvb692j9664aic1g; ‍ᠮⴞ🄂.🚗ࡁ𮹌‌; [B1, C1, C2, V6]; xn--h7e341b0wlbv45b.xn--zvb692j9664aic1g; ; ; # ᠮⴞ🄂.🚗ࡁ +xn--2nd129ai554b.xn--zvb3124wpkpf; ᠮႾ🄂.🚗ࡁ𮹌; [B1, V6]; xn--2nd129ai554b.xn--zvb3124wpkpf; ; ; # ᠮႾ🄂.🚗ࡁ +xn--2nd129ay2gnw71c.xn--zvb692j9664aic1g; ‍ᠮႾ🄂.🚗ࡁ𮹌‌; [B1, C1, C2, V6]; xn--2nd129ay2gnw71c.xn--zvb692j9664aic1g; ; ; # ᠮႾ🄂.🚗ࡁ +؁ڗ.𑚶񼡷⾆; ؁ڗ.𑚶񼡷舌; [B1, P1, V5, V6]; xn--jfb41a.xn--tc1ap851axo39c; ; ; # ڗ.𑚶舌 +؁ڗ.𑚶񼡷舌; ; [B1, P1, V5, V6]; xn--jfb41a.xn--tc1ap851axo39c; ; ; # ڗ.𑚶舌 +xn--jfb41a.xn--tc1ap851axo39c; ؁ڗ.𑚶񼡷舌; [B1, V5, V6]; xn--jfb41a.xn--tc1ap851axo39c; ; ; # ڗ.𑚶舌 +🞅󠳡󜍙.񲖷; ; [P1, V6]; xn--ie9hi1349bqdlb.xn--oj69a; ; ; # 🞅. +xn--ie9hi1349bqdlb.xn--oj69a; 🞅󠳡󜍙.񲖷; [V6]; xn--ie9hi1349bqdlb.xn--oj69a; ; ; # 🞅. +⃧񯡎-򫣝.4Ⴄ‌; ; [C1, P1, V5, V6]; xn----9snu5320fi76w.xn--4-f0g649i; ; xn----9snu5320fi76w.xn--4-f0g; [P1, V5, V6] # ⃧-.4Ⴄ +⃧񯡎-򫣝.4ⴄ‌; ; [C1, P1, V5, V6]; xn----9snu5320fi76w.xn--4-sgn589c; ; xn----9snu5320fi76w.xn--4-ivs; [P1, V5, V6] # ⃧-.4ⴄ +xn----9snu5320fi76w.xn--4-ivs; ⃧񯡎-򫣝.4ⴄ; [V5, V6]; xn----9snu5320fi76w.xn--4-ivs; ; ; # ⃧-.4ⴄ +xn----9snu5320fi76w.xn--4-sgn589c; ⃧񯡎-򫣝.4ⴄ‌; [C1, V5, V6]; xn----9snu5320fi76w.xn--4-sgn589c; ; ; # ⃧-.4ⴄ +xn----9snu5320fi76w.xn--4-f0g; ⃧񯡎-򫣝.4Ⴄ; [V5, V6]; xn----9snu5320fi76w.xn--4-f0g; ; ; # ⃧-.4Ⴄ +xn----9snu5320fi76w.xn--4-f0g649i; ⃧񯡎-򫣝.4Ⴄ‌; [C1, V5, V6]; xn----9snu5320fi76w.xn--4-f0g649i; ; ; # ⃧-.4Ⴄ +ᚭ。𝌠ß𖫱; ᚭ.𝌠ß𖫱; ; xn--hwe.xn--zca4946pblnc; ; xn--hwe.xn--ss-ci1ub261a; # ᚭ.𝌠ß𖫱 +ᚭ。𝌠ß𖫱; ᚭ.𝌠ß𖫱; ; xn--hwe.xn--zca4946pblnc; ; xn--hwe.xn--ss-ci1ub261a; # ᚭ.𝌠ß𖫱 +ᚭ。𝌠SS𖫱; ᚭ.𝌠ss𖫱; ; xn--hwe.xn--ss-ci1ub261a; ; ; # ᚭ.𝌠ss𖫱 +ᚭ。𝌠ss𖫱; ᚭ.𝌠ss𖫱; ; xn--hwe.xn--ss-ci1ub261a; ; ; # ᚭ.𝌠ss𖫱 +ᚭ。𝌠Ss𖫱; ᚭ.𝌠ss𖫱; ; xn--hwe.xn--ss-ci1ub261a; ; ; # ᚭ.𝌠ss𖫱 +xn--hwe.xn--ss-ci1ub261a; ᚭ.𝌠ss𖫱; ; xn--hwe.xn--ss-ci1ub261a; ; ; # ᚭ.𝌠ss𖫱 +ᚭ.𝌠ss𖫱; ; ; xn--hwe.xn--ss-ci1ub261a; ; ; # ᚭ.𝌠ss𖫱 +ᚭ.𝌠SS𖫱; ᚭ.𝌠ss𖫱; ; xn--hwe.xn--ss-ci1ub261a; ; ; # ᚭ.𝌠ss𖫱 +ᚭ.𝌠Ss𖫱; ᚭ.𝌠ss𖫱; ; xn--hwe.xn--ss-ci1ub261a; ; ; # ᚭ.𝌠ss𖫱 +xn--hwe.xn--zca4946pblnc; ᚭ.𝌠ß𖫱; ; xn--hwe.xn--zca4946pblnc; ; ; # ᚭ.𝌠ß𖫱 +ᚭ.𝌠ß𖫱; ; ; xn--hwe.xn--zca4946pblnc; ; xn--hwe.xn--ss-ci1ub261a; # ᚭ.𝌠ß𖫱 +ᚭ。𝌠SS𖫱; ᚭ.𝌠ss𖫱; ; xn--hwe.xn--ss-ci1ub261a; ; ; # ᚭ.𝌠ss𖫱 +ᚭ。𝌠ss𖫱; ᚭ.𝌠ss𖫱; ; xn--hwe.xn--ss-ci1ub261a; ; ; # ᚭ.𝌠ss𖫱 +ᚭ。𝌠Ss𖫱; ᚭ.𝌠ss𖫱; ; xn--hwe.xn--ss-ci1ub261a; ; ; # ᚭ.𝌠ss𖫱 +₁。𞤫ꡪ; 1.𞤫ꡪ; [B1, B2, B3]; 1.xn--gd9al691d; ; ; # 1.𞤫ꡪ +1。𞤫ꡪ; 1.𞤫ꡪ; [B1, B2, B3]; 1.xn--gd9al691d; ; ; # 1.𞤫ꡪ +1。𞤉ꡪ; 1.𞤫ꡪ; [B1, B2, B3]; 1.xn--gd9al691d; ; ; # 1.𞤫ꡪ +1.xn--gd9al691d; 1.𞤫ꡪ; [B1, B2, B3]; 1.xn--gd9al691d; ; ; # 1.𞤫ꡪ +₁。𞤉ꡪ; 1.𞤫ꡪ; [B1, B2, B3]; 1.xn--gd9al691d; ; ; # 1.𞤫ꡪ +𯻼‌.𞶞򻙤񥘇; ; [B2, B3, B6, C1, P1, V6]; xn--0ug27500a.xn--2b7hs861pl540a; ; xn--kg4n.xn--2b7hs861pl540a; [B2, B3, P1, V6] # . +xn--kg4n.xn--2b7hs861pl540a; 𯻼.𞶞򻙤񥘇; [B2, B3, V6]; xn--kg4n.xn--2b7hs861pl540a; ; ; # . +xn--0ug27500a.xn--2b7hs861pl540a; 𯻼‌.𞶞򻙤񥘇; [B2, B3, B6, C1, V6]; xn--0ug27500a.xn--2b7hs861pl540a; ; ; # . +𑑄≯。𑜤; 𑑄≯.𑜤; [P1, V5, V6]; xn--hdh5636g.xn--ci2d; ; ; # 𑑄≯.𑜤 +𑑄≯。𑜤; 𑑄≯.𑜤; [P1, V5, V6]; xn--hdh5636g.xn--ci2d; ; ; # 𑑄≯.𑜤 +𑑄≯。𑜤; 𑑄≯.𑜤; [P1, V5, V6]; xn--hdh5636g.xn--ci2d; ; ; # 𑑄≯.𑜤 +𑑄≯。𑜤; 𑑄≯.𑜤; [P1, V5, V6]; xn--hdh5636g.xn--ci2d; ; ; # 𑑄≯.𑜤 +xn--hdh5636g.xn--ci2d; 𑑄≯.𑜤; [V5, V6]; xn--hdh5636g.xn--ci2d; ; ; # 𑑄≯.𑜤 +Ⴋ≮𱲆。‍ާ𐋣; Ⴋ≮𱲆.‍ާ𐋣; [C2, P1, V6]; xn--jnd802gsm17c.xn--lrb506jqr4n; ; xn--jnd802gsm17c.xn--lrb6479j; [P1, V5, V6] # Ⴋ≮.ާ𐋣 +Ⴋ≮𱲆。‍ާ𐋣; Ⴋ≮𱲆.‍ާ𐋣; [C2, P1, V6]; xn--jnd802gsm17c.xn--lrb506jqr4n; ; xn--jnd802gsm17c.xn--lrb6479j; [P1, V5, V6] # Ⴋ≮.ާ𐋣 +ⴋ≮𱲆。‍ާ𐋣; ⴋ≮𱲆.‍ާ𐋣; [C2, P1, V6]; xn--gdhz03bxt42d.xn--lrb506jqr4n; ; xn--gdhz03bxt42d.xn--lrb6479j; [P1, V5, V6] # ⴋ≮.ާ𐋣 +ⴋ≮𱲆。‍ާ𐋣; ⴋ≮𱲆.‍ާ𐋣; [C2, P1, V6]; xn--gdhz03bxt42d.xn--lrb506jqr4n; ; xn--gdhz03bxt42d.xn--lrb6479j; [P1, V5, V6] # ⴋ≮.ާ𐋣 +xn--gdhz03bxt42d.xn--lrb6479j; ⴋ≮𱲆.ާ𐋣; [V5, V6]; xn--gdhz03bxt42d.xn--lrb6479j; ; ; # ⴋ≮.ާ𐋣 +xn--gdhz03bxt42d.xn--lrb506jqr4n; ⴋ≮𱲆.‍ާ𐋣; [C2, V6]; xn--gdhz03bxt42d.xn--lrb506jqr4n; ; ; # ⴋ≮.ާ𐋣 +xn--jnd802gsm17c.xn--lrb6479j; Ⴋ≮𱲆.ާ𐋣; [V5, V6]; xn--jnd802gsm17c.xn--lrb6479j; ; ; # Ⴋ≮.ާ𐋣 +xn--jnd802gsm17c.xn--lrb506jqr4n; Ⴋ≮𱲆.‍ާ𐋣; [C2, V6]; xn--jnd802gsm17c.xn--lrb506jqr4n; ; ; # Ⴋ≮.ާ𐋣 +្.򆽒≯; ; [P1, V5, V6]; xn--u4e.xn--hdhx0084f; ; ; # ្.≯ +្.򆽒≯; ្.򆽒≯; [P1, V5, V6]; xn--u4e.xn--hdhx0084f; ; ; # ្.≯ +xn--u4e.xn--hdhx0084f; ្.򆽒≯; [V5, V6]; xn--u4e.xn--hdhx0084f; ; ; # ្.≯ +񏁇᜴.𐨺É⬓𑄴; 񏁇᜴.𐨺é⬓𑄴; [P1, V5, V6]; xn--c0e34564d.xn--9ca207st53lg3f; ; ; # ᜴.𐨺é⬓𑄴 +񏁇᜴.𐨺É⬓𑄴; 񏁇᜴.𐨺é⬓𑄴; [P1, V5, V6]; xn--c0e34564d.xn--9ca207st53lg3f; ; ; # ᜴.𐨺é⬓𑄴 +񏁇᜴.𐨺É⬓𑄴; 񏁇᜴.𐨺é⬓𑄴; [P1, V5, V6]; xn--c0e34564d.xn--9ca207st53lg3f; ; ; # ᜴.𐨺é⬓𑄴 +񏁇᜴.𐨺É⬓𑄴; 񏁇᜴.𐨺é⬓𑄴; [P1, V5, V6]; xn--c0e34564d.xn--9ca207st53lg3f; ; ; # ᜴.𐨺é⬓𑄴 +񏁇᜴.𐨺é⬓𑄴; 񏁇᜴.𐨺é⬓𑄴; [P1, V5, V6]; xn--c0e34564d.xn--9ca207st53lg3f; ; ; # ᜴.𐨺é⬓𑄴 +񏁇᜴.𐨺é⬓𑄴; ; [P1, V5, V6]; xn--c0e34564d.xn--9ca207st53lg3f; ; ; # ᜴.𐨺é⬓𑄴 +xn--c0e34564d.xn--9ca207st53lg3f; 񏁇᜴.𐨺é⬓𑄴; [V5, V6]; xn--c0e34564d.xn--9ca207st53lg3f; ; ; # ᜴.𐨺é⬓𑄴 +񏁇᜴.𐨺é⬓𑄴; 񏁇᜴.𐨺é⬓𑄴; [P1, V5, V6]; xn--c0e34564d.xn--9ca207st53lg3f; ; ; # ᜴.𐨺é⬓𑄴 +񏁇᜴.𐨺é⬓𑄴; 񏁇᜴.𐨺é⬓𑄴; [P1, V5, V6]; xn--c0e34564d.xn--9ca207st53lg3f; ; ; # ᜴.𐨺é⬓𑄴 +ᢇ‍꣄。︒𞤺; ᢇ‍꣄.︒𞤺; [B1, B6, C2, P1, V6]; xn--09e669a6x8j.xn--y86cv562b; ; xn--09e4694e.xn--y86cv562b; [B1, P1, V6] # ᢇ꣄.︒𞤺 +ᢇ‍꣄。。𞤺; ᢇ‍꣄..𞤺; [B6, C2, X4_2]; xn--09e669a6x8j..xn--ye6h; [B6, C2, A4_2]; xn--09e4694e..xn--ye6h; [A4_2] # ᢇ꣄..𞤺 +ᢇ‍꣄。。𞤘; ᢇ‍꣄..𞤺; [B6, C2, X4_2]; xn--09e669a6x8j..xn--ye6h; [B6, C2, A4_2]; xn--09e4694e..xn--ye6h; [A4_2] # ᢇ꣄..𞤺 +xn--09e4694e..xn--ye6h; ᢇ꣄..𞤺; [X4_2]; xn--09e4694e..xn--ye6h; [A4_2]; ; # ᢇ꣄..𞤺 +xn--09e669a6x8j..xn--ye6h; ᢇ‍꣄..𞤺; [B6, C2, X4_2]; xn--09e669a6x8j..xn--ye6h; [B6, C2, A4_2]; ; # ᢇ꣄..𞤺 +ᢇ‍꣄。︒𞤘; ᢇ‍꣄.︒𞤺; [B1, B6, C2, P1, V6]; xn--09e669a6x8j.xn--y86cv562b; ; xn--09e4694e.xn--y86cv562b; [B1, P1, V6] # ᢇ꣄.︒𞤺 +xn--09e4694e.xn--y86cv562b; ᢇ꣄.︒𞤺; [B1, V6]; xn--09e4694e.xn--y86cv562b; ; ; # ᢇ꣄.︒𞤺 +xn--09e669a6x8j.xn--y86cv562b; ᢇ‍꣄.︒𞤺; [B1, B6, C2, V6]; xn--09e669a6x8j.xn--y86cv562b; ; ; # ᢇ꣄.︒𞤺 +𞩬򖙱᜔‌。رު≮; 𞩬򖙱᜔‌.رު≮; [B2, B3, P1, V6]; xn--fze607b9651bjwl7c.xn--wgb86el10d; ; xn--fze3930v7hz6b.xn--wgb86el10d; # ᜔.رު≮ +𞩬򖙱᜔‌。رު≮; 𞩬򖙱᜔‌.رު≮; [B2, B3, P1, V6]; xn--fze607b9651bjwl7c.xn--wgb86el10d; ; xn--fze3930v7hz6b.xn--wgb86el10d; # ᜔.رު≮ +𞩬򖙱᜔‌。رު≮; 𞩬򖙱᜔‌.رު≮; [B2, B3, P1, V6]; xn--fze607b9651bjwl7c.xn--wgb86el10d; ; xn--fze3930v7hz6b.xn--wgb86el10d; # ᜔.رު≮ +𞩬򖙱᜔‌。رު≮; 𞩬򖙱᜔‌.رު≮; [B2, B3, P1, V6]; xn--fze607b9651bjwl7c.xn--wgb86el10d; ; xn--fze3930v7hz6b.xn--wgb86el10d; # ᜔.رު≮ +xn--fze3930v7hz6b.xn--wgb86el10d; 𞩬򖙱᜔.رު≮; [B2, B3, V6]; xn--fze3930v7hz6b.xn--wgb86el10d; ; ; # ᜔.رު≮ +xn--fze607b9651bjwl7c.xn--wgb86el10d; 𞩬򖙱᜔‌.رު≮; [B2, B3, V6]; xn--fze607b9651bjwl7c.xn--wgb86el10d; ; ; # ᜔.رު≮ +Ⴣ.ٓᢤ; Ⴣ.ٓᢤ; [P1, V5, V6]; xn--7nd.xn--vhb294g; ; ; # Ⴣ.ٓᢤ +Ⴣ.ٓᢤ; ; [P1, V5, V6]; xn--7nd.xn--vhb294g; ; ; # Ⴣ.ٓᢤ +ⴣ.ٓᢤ; ; [V5]; xn--rlj.xn--vhb294g; ; ; # ⴣ.ٓᢤ +xn--rlj.xn--vhb294g; ⴣ.ٓᢤ; [V5]; xn--rlj.xn--vhb294g; ; ; # ⴣ.ٓᢤ +xn--7nd.xn--vhb294g; Ⴣ.ٓᢤ; [V5, V6]; xn--7nd.xn--vhb294g; ; ; # Ⴣ.ٓᢤ +ⴣ.ٓᢤ; ⴣ.ٓᢤ; [V5]; xn--rlj.xn--vhb294g; ; ; # ⴣ.ٓᢤ +󠄈ࠓ.싉򄆻Ⴤ򂡐; ࠓ.싉򄆻Ⴤ򂡐; [P1, V6]; xn--oub.xn--8nd9522gpe69cviva; ; ; # ࠓ.싉Ⴤ +󠄈ࠓ.싉򄆻Ⴤ򂡐; ࠓ.싉򄆻Ⴤ򂡐; [P1, V6]; xn--oub.xn--8nd9522gpe69cviva; ; ; # ࠓ.싉Ⴤ +󠄈ࠓ.싉򄆻Ⴤ򂡐; ࠓ.싉򄆻Ⴤ򂡐; [P1, V6]; xn--oub.xn--8nd9522gpe69cviva; ; ; # ࠓ.싉Ⴤ +󠄈ࠓ.싉򄆻Ⴤ򂡐; ࠓ.싉򄆻Ⴤ򂡐; [P1, V6]; xn--oub.xn--8nd9522gpe69cviva; ; ; # ࠓ.싉Ⴤ +󠄈ࠓ.싉򄆻ⴤ򂡐; ࠓ.싉򄆻ⴤ򂡐; [P1, V6]; xn--oub.xn--sljz109bpe25dviva; ; ; # ࠓ.싉ⴤ +󠄈ࠓ.싉򄆻ⴤ򂡐; ࠓ.싉򄆻ⴤ򂡐; [P1, V6]; xn--oub.xn--sljz109bpe25dviva; ; ; # ࠓ.싉ⴤ +xn--oub.xn--sljz109bpe25dviva; ࠓ.싉򄆻ⴤ򂡐; [V6]; xn--oub.xn--sljz109bpe25dviva; ; ; # ࠓ.싉ⴤ +xn--oub.xn--8nd9522gpe69cviva; ࠓ.싉򄆻Ⴤ򂡐; [V6]; xn--oub.xn--8nd9522gpe69cviva; ; ; # ࠓ.싉Ⴤ +󠄈ࠓ.싉򄆻ⴤ򂡐; ࠓ.싉򄆻ⴤ򂡐; [P1, V6]; xn--oub.xn--sljz109bpe25dviva; ; ; # ࠓ.싉ⴤ +󠄈ࠓ.싉򄆻ⴤ򂡐; ࠓ.싉򄆻ⴤ򂡐; [P1, V6]; xn--oub.xn--sljz109bpe25dviva; ; ; # ࠓ.싉ⴤ +ꨬ𑲫≮.⤂; ꨬ𑲫≮.⤂; [P1, V5, V6]; xn--gdh1854cn19c.xn--kqi; ; ; # ꨬ𑲫≮.⤂ +ꨬ𑲫≮.⤂; ꨬ𑲫≮.⤂; [P1, V5, V6]; xn--gdh1854cn19c.xn--kqi; ; ; # ꨬ𑲫≮.⤂ +ꨬ𑲫≮.⤂; ; [P1, V5, V6]; xn--gdh1854cn19c.xn--kqi; ; ; # ꨬ𑲫≮.⤂ +ꨬ𑲫≮.⤂; ꨬ𑲫≮.⤂; [P1, V5, V6]; xn--gdh1854cn19c.xn--kqi; ; ; # ꨬ𑲫≮.⤂ +xn--gdh1854cn19c.xn--kqi; ꨬ𑲫≮.⤂; [V5, V6]; xn--gdh1854cn19c.xn--kqi; ; ; # ꨬ𑲫≮.⤂ +؄𐩔≮Ⴢ.Ⴃ; ؄𐩔≮Ⴢ.Ⴃ; [B1, P1, V6]; xn--mfb416c0jox02t.xn--bnd; ; ; # 𐩔≮Ⴢ.Ⴃ +؄𐩔≮Ⴢ.Ⴃ; ؄𐩔≮Ⴢ.Ⴃ; [B1, P1, V6]; xn--mfb416c0jox02t.xn--bnd; ; ; # 𐩔≮Ⴢ.Ⴃ +؄𐩔≮Ⴢ.Ⴃ; ; [B1, P1, V6]; xn--mfb416c0jox02t.xn--bnd; ; ; # 𐩔≮Ⴢ.Ⴃ +؄𐩔≮Ⴢ.Ⴃ; ؄𐩔≮Ⴢ.Ⴃ; [B1, P1, V6]; xn--mfb416c0jox02t.xn--bnd; ; ; # 𐩔≮Ⴢ.Ⴃ +؄𐩔≮ⴢ.ⴃ; ؄𐩔≮ⴢ.ⴃ; [B1, P1, V6]; xn--mfb266l4khr54u.xn--ukj; ; ; # 𐩔≮ⴢ.ⴃ +؄𐩔≮ⴢ.ⴃ; ; [B1, P1, V6]; xn--mfb266l4khr54u.xn--ukj; ; ; # 𐩔≮ⴢ.ⴃ +؄𐩔≮Ⴢ.ⴃ; ; [B1, P1, V6]; xn--mfb416c0jox02t.xn--ukj; ; ; # 𐩔≮Ⴢ.ⴃ +؄𐩔≮Ⴢ.ⴃ; ؄𐩔≮Ⴢ.ⴃ; [B1, P1, V6]; xn--mfb416c0jox02t.xn--ukj; ; ; # 𐩔≮Ⴢ.ⴃ +xn--mfb416c0jox02t.xn--ukj; ؄𐩔≮Ⴢ.ⴃ; [B1, V6]; xn--mfb416c0jox02t.xn--ukj; ; ; # 𐩔≮Ⴢ.ⴃ +xn--mfb266l4khr54u.xn--ukj; ؄𐩔≮ⴢ.ⴃ; [B1, V6]; xn--mfb266l4khr54u.xn--ukj; ; ; # 𐩔≮ⴢ.ⴃ +xn--mfb416c0jox02t.xn--bnd; ؄𐩔≮Ⴢ.Ⴃ; [B1, V6]; xn--mfb416c0jox02t.xn--bnd; ; ; # 𐩔≮Ⴢ.Ⴃ +؄𐩔≮ⴢ.ⴃ; ؄𐩔≮ⴢ.ⴃ; [B1, P1, V6]; xn--mfb266l4khr54u.xn--ukj; ; ; # 𐩔≮ⴢ.ⴃ +؄𐩔≮ⴢ.ⴃ; ؄𐩔≮ⴢ.ⴃ; [B1, P1, V6]; xn--mfb266l4khr54u.xn--ukj; ; ; # 𐩔≮ⴢ.ⴃ +؄𐩔≮Ⴢ.ⴃ; ؄𐩔≮Ⴢ.ⴃ; [B1, P1, V6]; xn--mfb416c0jox02t.xn--ukj; ; ; # 𐩔≮Ⴢ.ⴃ +؄𐩔≮Ⴢ.ⴃ; ؄𐩔≮Ⴢ.ⴃ; [B1, P1, V6]; xn--mfb416c0jox02t.xn--ukj; ; ; # 𐩔≮Ⴢ.ⴃ +𑁅。-; 𑁅.-; [V3, V5]; xn--210d.-; ; ; # 𑁅.- +xn--210d.-; 𑁅.-; [V3, V5]; xn--210d.-; ; ; # 𑁅.- +්򕸽󠧱。饈≠٤; ්򕸽󠧱.饈≠٤; [B1, B5, B6, P1, V5, V6]; xn--h1c25913jfwov.xn--dib144ler5f; ; ; # ්.饈≠٤ +්򕸽󠧱。饈≠٤; ්򕸽󠧱.饈≠٤; [B1, B5, B6, P1, V5, V6]; xn--h1c25913jfwov.xn--dib144ler5f; ; ; # ්.饈≠٤ +්򕸽󠧱。饈≠٤; ්򕸽󠧱.饈≠٤; [B1, B5, B6, P1, V5, V6]; xn--h1c25913jfwov.xn--dib144ler5f; ; ; # ්.饈≠٤ +්򕸽󠧱。饈≠٤; ්򕸽󠧱.饈≠٤; [B1, B5, B6, P1, V5, V6]; xn--h1c25913jfwov.xn--dib144ler5f; ; ; # ්.饈≠٤ +xn--h1c25913jfwov.xn--dib144ler5f; ්򕸽󠧱.饈≠٤; [B1, B5, B6, V5, V6]; xn--h1c25913jfwov.xn--dib144ler5f; ; ; # ්.饈≠٤ +𞥃ᠠ⁷。≯邅⬻4; 𞥃ᠠ7.≯邅⬻4; [B1, B2, P1, V6]; xn--7-v4j2826w.xn--4-ogoy01bou3i; ; ; # 𞥃ᠠ7.≯邅⬻4 +𞥃ᠠ⁷。≯邅⬻4; 𞥃ᠠ7.≯邅⬻4; [B1, B2, P1, V6]; xn--7-v4j2826w.xn--4-ogoy01bou3i; ; ; # 𞥃ᠠ7.≯邅⬻4 +𞥃ᠠ7。≯邅⬻4; 𞥃ᠠ7.≯邅⬻4; [B1, B2, P1, V6]; xn--7-v4j2826w.xn--4-ogoy01bou3i; ; ; # 𞥃ᠠ7.≯邅⬻4 +𞥃ᠠ7。≯邅⬻4; 𞥃ᠠ7.≯邅⬻4; [B1, B2, P1, V6]; xn--7-v4j2826w.xn--4-ogoy01bou3i; ; ; # 𞥃ᠠ7.≯邅⬻4 +𞤡ᠠ7。≯邅⬻4; 𞥃ᠠ7.≯邅⬻4; [B1, B2, P1, V6]; xn--7-v4j2826w.xn--4-ogoy01bou3i; ; ; # 𞥃ᠠ7.≯邅⬻4 +𞤡ᠠ7。≯邅⬻4; 𞥃ᠠ7.≯邅⬻4; [B1, B2, P1, V6]; xn--7-v4j2826w.xn--4-ogoy01bou3i; ; ; # 𞥃ᠠ7.≯邅⬻4 +xn--7-v4j2826w.xn--4-ogoy01bou3i; 𞥃ᠠ7.≯邅⬻4; [B1, B2, V6]; xn--7-v4j2826w.xn--4-ogoy01bou3i; ; ; # 𞥃ᠠ7.≯邅⬻4 +𞤡ᠠ⁷。≯邅⬻4; 𞥃ᠠ7.≯邅⬻4; [B1, B2, P1, V6]; xn--7-v4j2826w.xn--4-ogoy01bou3i; ; ; # 𞥃ᠠ7.≯邅⬻4 +𞤡ᠠ⁷。≯邅⬻4; 𞥃ᠠ7.≯邅⬻4; [B1, B2, P1, V6]; xn--7-v4j2826w.xn--4-ogoy01bou3i; ; ; # 𞥃ᠠ7.≯邅⬻4 +򠿯ᡳ-𑐻.𐹴𐋫؅󑎳; ; [B1, B6, P1, V6]; xn----m9j3429kxmy7e.xn--nfb7950kdihrp812a; ; ; # ᡳ-𑐻.𐹴𐋫 +xn----m9j3429kxmy7e.xn--nfb7950kdihrp812a; 򠿯ᡳ-𑐻.𐹴𐋫؅󑎳; [B1, B6, V6]; xn----m9j3429kxmy7e.xn--nfb7950kdihrp812a; ; ; # ᡳ-𑐻.𐹴𐋫 +򠶆ࡅੑ.넨-󶧈; ; [B5, B6, P1, V6]; xn--3vb26hb6834b.xn----i37ez0957g; ; ; # ࡅੑ.넨- +򠶆ࡅੑ.넨-󶧈; 򠶆ࡅੑ.넨-󶧈; [B5, B6, P1, V6]; xn--3vb26hb6834b.xn----i37ez0957g; ; ; # ࡅੑ.넨- +xn--3vb26hb6834b.xn----i37ez0957g; 򠶆ࡅੑ.넨-󶧈; [B5, B6, V6]; xn--3vb26hb6834b.xn----i37ez0957g; ; ; # ࡅੑ.넨- +ꡦᡑ‍⒈。𐋣-; ꡦᡑ‍⒈.𐋣-; [C2, P1, V3, V6]; xn--h8e470bl0d838o.xn----381i; ; xn--h8e863drj7h.xn----381i; [P1, V3, V6] # ꡦᡑ⒈.𐋣- +ꡦᡑ‍1.。𐋣-; ꡦᡑ‍1..𐋣-; [C2, V3, X4_2]; xn--1-o7j663bdl7m..xn----381i; [C2, V3, A4_2]; xn--1-o7j0610f..xn----381i; [V3, A4_2] # ꡦᡑ1..𐋣- +xn--1-o7j0610f..xn----381i; ꡦᡑ1..𐋣-; [V3, X4_2]; xn--1-o7j0610f..xn----381i; [V3, A4_2]; ; # ꡦᡑ1..𐋣- +xn--1-o7j663bdl7m..xn----381i; ꡦᡑ‍1..𐋣-; [C2, V3, X4_2]; xn--1-o7j663bdl7m..xn----381i; [C2, V3, A4_2]; ; # ꡦᡑ1..𐋣- +xn--h8e863drj7h.xn----381i; ꡦᡑ⒈.𐋣-; [V3, V6]; xn--h8e863drj7h.xn----381i; ; ; # ꡦᡑ⒈.𐋣- +xn--h8e470bl0d838o.xn----381i; ꡦᡑ‍⒈.𐋣-; [C2, V3, V6]; xn--h8e470bl0d838o.xn----381i; ; ; # ꡦᡑ⒈.𐋣- +Ⴌ。􍼠ﭩ; Ⴌ.􍼠ٹ; [B5, B6, P1, V6]; xn--knd.xn--yib19191t; ; ; # Ⴌ.ٹ +Ⴌ。􍼠ٹ; Ⴌ.􍼠ٹ; [B5, B6, P1, V6]; xn--knd.xn--yib19191t; ; ; # Ⴌ.ٹ +ⴌ。􍼠ٹ; ⴌ.􍼠ٹ; [B5, B6, P1, V6]; xn--3kj.xn--yib19191t; ; ; # ⴌ.ٹ +xn--3kj.xn--yib19191t; ⴌ.􍼠ٹ; [B5, B6, V6]; xn--3kj.xn--yib19191t; ; ; # ⴌ.ٹ +xn--knd.xn--yib19191t; Ⴌ.􍼠ٹ; [B5, B6, V6]; xn--knd.xn--yib19191t; ; ; # Ⴌ.ٹ +ⴌ。􍼠ﭩ; ⴌ.􍼠ٹ; [B5, B6, P1, V6]; xn--3kj.xn--yib19191t; ; ; # ⴌ.ٹ +𐮁𐭱.྄፞-ᳺ; ; [B1, V5]; xn--r19c5a.xn----xjg270ag3m; ; ; # 𐮁𐭱.྄፞-ᳺ +xn--r19c5a.xn----xjg270ag3m; 𐮁𐭱.྄፞-ᳺ; [B1, V5]; xn--r19c5a.xn----xjg270ag3m; ; ; # 𐮁𐭱.྄፞-ᳺ +⒈䰹‍-。웈; ⒈䰹‍-.웈; [C2, P1, V3, V6]; xn----tgnx5rjr6c.xn--kp5b; ; xn----dcp160o.xn--kp5b; [P1, V3, V6] # ⒈䰹-.웈 +⒈䰹‍-。웈; ⒈䰹‍-.웈; [C2, P1, V3, V6]; xn----tgnx5rjr6c.xn--kp5b; ; xn----dcp160o.xn--kp5b; [P1, V3, V6] # ⒈䰹-.웈 +1.䰹‍-。웈; 1.䰹‍-.웈; [C2, V3]; 1.xn----tgnz80r.xn--kp5b; ; 1.xn----zw5a.xn--kp5b; [V3] # 1.䰹-.웈 +1.䰹‍-。웈; 1.䰹‍-.웈; [C2, V3]; 1.xn----tgnz80r.xn--kp5b; ; 1.xn----zw5a.xn--kp5b; [V3] # 1.䰹-.웈 +1.xn----zw5a.xn--kp5b; 1.䰹-.웈; [V3]; 1.xn----zw5a.xn--kp5b; ; ; # 1.䰹-.웈 +1.xn----tgnz80r.xn--kp5b; 1.䰹‍-.웈; [C2, V3]; 1.xn----tgnz80r.xn--kp5b; ; ; # 1.䰹-.웈 +xn----dcp160o.xn--kp5b; ⒈䰹-.웈; [V3, V6]; xn----dcp160o.xn--kp5b; ; ; # ⒈䰹-.웈 +xn----tgnx5rjr6c.xn--kp5b; ⒈䰹‍-.웈; [C2, V3, V6]; xn----tgnx5rjr6c.xn--kp5b; ; ; # ⒈䰹-.웈 +て。‌󠳽߳; て.‌󠳽߳; [C1, P1, V6]; xn--m9j.xn--rtb154j9l73w; ; xn--m9j.xn--rtb10784p; [P1, V6] # て.߳ +xn--m9j.xn--rtb10784p; て.󠳽߳; [V6]; xn--m9j.xn--rtb10784p; ; ; # て.߳ +xn--m9j.xn--rtb154j9l73w; て.‌󠳽߳; [C1, V6]; xn--m9j.xn--rtb154j9l73w; ; ; # て.߳ +ς。꧀ۧ; ς.꧀ۧ; [V5]; xn--3xa.xn--3lb1944f; ; xn--4xa.xn--3lb1944f; # ς.꧀ۧ +ς。꧀ۧ; ς.꧀ۧ; [V5]; xn--3xa.xn--3lb1944f; ; xn--4xa.xn--3lb1944f; # ς.꧀ۧ +Σ。꧀ۧ; σ.꧀ۧ; [V5]; xn--4xa.xn--3lb1944f; ; ; # σ.꧀ۧ +σ。꧀ۧ; σ.꧀ۧ; [V5]; xn--4xa.xn--3lb1944f; ; ; # σ.꧀ۧ +xn--4xa.xn--3lb1944f; σ.꧀ۧ; [V5]; xn--4xa.xn--3lb1944f; ; ; # σ.꧀ۧ +xn--3xa.xn--3lb1944f; ς.꧀ۧ; [V5]; xn--3xa.xn--3lb1944f; ; ; # ς.꧀ۧ +Σ。꧀ۧ; σ.꧀ۧ; [V5]; xn--4xa.xn--3lb1944f; ; ; # σ.꧀ۧ +σ。꧀ۧ; σ.꧀ۧ; [V5]; xn--4xa.xn--3lb1944f; ; ; # σ.꧀ۧ +்󥫅򌉑.ႢႵ; ; [P1, V5, V6]; xn--xmc83135idcxza.xn--9md2b; ; ; # ்.ႢႵ +்󥫅򌉑.ⴂⴕ; ; [P1, V5, V6]; xn--xmc83135idcxza.xn--tkjwb; ; ; # ்.ⴂⴕ +்󥫅򌉑.Ⴂⴕ; ; [P1, V5, V6]; xn--xmc83135idcxza.xn--9md086l; ; ; # ்.Ⴂⴕ +xn--xmc83135idcxza.xn--9md086l; ்󥫅򌉑.Ⴂⴕ; [V5, V6]; xn--xmc83135idcxza.xn--9md086l; ; ; # ்.Ⴂⴕ +xn--xmc83135idcxza.xn--tkjwb; ்󥫅򌉑.ⴂⴕ; [V5, V6]; xn--xmc83135idcxza.xn--tkjwb; ; ; # ்.ⴂⴕ +xn--xmc83135idcxza.xn--9md2b; ்󥫅򌉑.ႢႵ; [V5, V6]; xn--xmc83135idcxza.xn--9md2b; ; ; # ்.ႢႵ +ᰲ🄈⾛֦.‍򯥤߽; ᰲ🄈走֦.‍򯥤߽; [C2, P1, V5, V6]; xn--xcb756i493fwi5o.xn--1tb334j1197q; ; xn--xcb756i493fwi5o.xn--1tb13454l; [P1, V5, V6] # ᰲ🄈走֦.߽ +ᰲ7,走֦.‍򯥤߽; ; [C2, P1, V5, V6]; xn--7,-bid991urn3k.xn--1tb334j1197q; ; xn--7,-bid991urn3k.xn--1tb13454l; [P1, V5, V6] # ᰲ7,走֦.߽ +xn--7,-bid991urn3k.xn--1tb13454l; ᰲ7,走֦.򯥤߽; [P1, V5, V6]; xn--7,-bid991urn3k.xn--1tb13454l; ; ; # ᰲ7,走֦.߽ +xn--7,-bid991urn3k.xn--1tb334j1197q; ᰲ7,走֦.‍򯥤߽; [C2, P1, V5, V6]; xn--7,-bid991urn3k.xn--1tb334j1197q; ; ; # ᰲ7,走֦.߽ +xn--xcb756i493fwi5o.xn--1tb13454l; ᰲ🄈走֦.򯥤߽; [V5, V6]; xn--xcb756i493fwi5o.xn--1tb13454l; ; ; # ᰲ🄈走֦.߽ +xn--xcb756i493fwi5o.xn--1tb334j1197q; ᰲ🄈走֦.‍򯥤߽; [C2, V5, V6]; xn--xcb756i493fwi5o.xn--1tb334j1197q; ; ; # ᰲ🄈走֦.߽ +ᢗ。Ӏ񝄻; ᢗ.Ӏ񝄻; [P1, V6]; xn--hbf.xn--d5a86117e; ; ; # ᢗ.Ӏ +ᢗ。Ӏ񝄻; ᢗ.Ӏ񝄻; [P1, V6]; xn--hbf.xn--d5a86117e; ; ; # ᢗ.Ӏ +ᢗ。ӏ񝄻; ᢗ.ӏ񝄻; [P1, V6]; xn--hbf.xn--s5a83117e; ; ; # ᢗ.ӏ +xn--hbf.xn--s5a83117e; ᢗ.ӏ񝄻; [V6]; xn--hbf.xn--s5a83117e; ; ; # ᢗ.ӏ +xn--hbf.xn--d5a86117e; ᢗ.Ӏ񝄻; [V6]; xn--hbf.xn--d5a86117e; ; ; # ᢗ.Ӏ +ᢗ。ӏ񝄻; ᢗ.ӏ񝄻; [P1, V6]; xn--hbf.xn--s5a83117e; ; ; # ᢗ.ӏ +٨-。񠏇🝆ᄾ; ٨-.񠏇🝆ᄾ; [B1, P1, V3, V6]; xn----oqc.xn--qrd1699v327w; ; ; # ٨-.🝆ᄾ +xn----oqc.xn--qrd1699v327w; ٨-.񠏇🝆ᄾ; [B1, V3, V6]; xn----oqc.xn--qrd1699v327w; ; ; # ٨-.🝆ᄾ +-𐋷𖾑。󠆬; -𐋷𖾑.; [V3]; xn----991iq40y.; ; ; # -𐋷𖾑. +xn----991iq40y.; -𐋷𖾑.; [V3]; xn----991iq40y.; ; ; # -𐋷𖾑. +‌𐹳🐴멈.꯭񐡼; ; [B1, C1, P1, V5, V6]; xn--0ug6681d406b7bwk.xn--429a8682s; ; xn--422b325mqb6i.xn--429a8682s; [B1, P1, V5, V6] # 𐹳🐴멈.꯭ +‌𐹳🐴멈.꯭񐡼; ‌𐹳🐴멈.꯭񐡼; [B1, C1, P1, V5, V6]; xn--0ug6681d406b7bwk.xn--429a8682s; ; xn--422b325mqb6i.xn--429a8682s; [B1, P1, V5, V6] # 𐹳🐴멈.꯭ +xn--422b325mqb6i.xn--429a8682s; 𐹳🐴멈.꯭񐡼; [B1, V5, V6]; xn--422b325mqb6i.xn--429a8682s; ; ; # 𐹳🐴멈.꯭ +xn--0ug6681d406b7bwk.xn--429a8682s; ‌𐹳🐴멈.꯭񐡼; [B1, C1, V5, V6]; xn--0ug6681d406b7bwk.xn--429a8682s; ; ; # 𐹳🐴멈.꯭ +≮.ݩ؃; ; [B1, P1, V6]; xn--gdh.xn--lfb92e; ; ; # ≮.ݩ +≮.ݩ؃; ≮.ݩ؃; [B1, P1, V6]; xn--gdh.xn--lfb92e; ; ; # ≮.ݩ +xn--gdh.xn--lfb92e; ≮.ݩ؃; [B1, V6]; xn--gdh.xn--lfb92e; ; ; # ≮.ݩ +𐶭⾆。‌𑚶򟱃𞰘; 𐶭舌.‌𑚶򟱃𞰘; [B1, B2, B3, C1, P1, V6]; xn--tc1ao37z.xn--0ugx728gi1nfwqz2e; ; xn--tc1ao37z.xn--6e2dw557azds2d; [B2, B3, B5, B6, P1, V5, V6] # 舌.𑚶 +𐶭舌。‌𑚶򟱃𞰘; 𐶭舌.‌𑚶򟱃𞰘; [B1, B2, B3, C1, P1, V6]; xn--tc1ao37z.xn--0ugx728gi1nfwqz2e; ; xn--tc1ao37z.xn--6e2dw557azds2d; [B2, B3, B5, B6, P1, V5, V6] # 舌.𑚶 +xn--tc1ao37z.xn--6e2dw557azds2d; 𐶭舌.𑚶򟱃𞰘; [B2, B3, B5, B6, V5, V6]; xn--tc1ao37z.xn--6e2dw557azds2d; ; ; # 舌.𑚶 +xn--tc1ao37z.xn--0ugx728gi1nfwqz2e; 𐶭舌.‌𑚶򟱃𞰘; [B1, B2, B3, C1, V6]; xn--tc1ao37z.xn--0ugx728gi1nfwqz2e; ; ; # 舌.𑚶 +‌Ⴠ-.𝟷ς𞴺ς; ‌Ⴠ-.1ς𞴺ς; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-ymba92321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1ς𞴺ς +‌Ⴠ-.1ς𞴺ς; ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-ymba92321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1ς𞴺ς +‌ⴠ-.1ς𞴺ς; ; [B1, C1, V3]; xn----rgn530d.xn--1-ymba92321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, V3] # ⴠ-.1ς𞴺ς +‌Ⴠ-.1Σ𞴺Σ; ‌Ⴠ-.1σ𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-0mba52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1σ𞴺σ +‌ⴠ-.1σ𞴺σ; ; [B1, C1, V3]; xn----rgn530d.xn--1-0mba52321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, V3] # ⴠ-.1σ𞴺σ +‌Ⴠ-.1σ𞴺Σ; ‌Ⴠ-.1σ𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-0mba52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1σ𞴺σ +xn----z1g.xn--1-0mba52321c; Ⴠ-.1σ𞴺σ; [B1, B6, V3, V6]; xn----z1g.xn--1-0mba52321c; ; ; # Ⴠ-.1σ𞴺σ +xn----z1g168i.xn--1-0mba52321c; ‌Ⴠ-.1σ𞴺σ; [B1, C1, V3, V6]; xn----z1g168i.xn--1-0mba52321c; ; ; # Ⴠ-.1σ𞴺σ +xn----2ws.xn--1-0mba52321c; ⴠ-.1σ𞴺σ; [B1, B6, V3]; xn----2ws.xn--1-0mba52321c; ; ; # ⴠ-.1σ𞴺σ +xn----rgn530d.xn--1-0mba52321c; ‌ⴠ-.1σ𞴺σ; [B1, C1, V3]; xn----rgn530d.xn--1-0mba52321c; ; ; # ⴠ-.1σ𞴺σ +‌Ⴠ-.1ς𞴺Σ; ‌Ⴠ-.1ς𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-ymbd52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1ς𞴺σ +‌ⴠ-.1ς𞴺σ; ; [B1, C1, V3]; xn----rgn530d.xn--1-ymbd52321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, V3] # ⴠ-.1ς𞴺σ +xn----rgn530d.xn--1-ymbd52321c; ‌ⴠ-.1ς𞴺σ; [B1, C1, V3]; xn----rgn530d.xn--1-ymbd52321c; ; ; # ⴠ-.1ς𞴺σ +xn----z1g168i.xn--1-ymbd52321c; ‌Ⴠ-.1ς𞴺σ; [B1, C1, V3, V6]; xn----z1g168i.xn--1-ymbd52321c; ; ; # Ⴠ-.1ς𞴺σ +xn----rgn530d.xn--1-ymba92321c; ‌ⴠ-.1ς𞴺ς; [B1, C1, V3]; xn----rgn530d.xn--1-ymba92321c; ; ; # ⴠ-.1ς𞴺ς +xn----z1g168i.xn--1-ymba92321c; ‌Ⴠ-.1ς𞴺ς; [B1, C1, V3, V6]; xn----z1g168i.xn--1-ymba92321c; ; ; # Ⴠ-.1ς𞴺ς +‌ⴠ-.𝟷ς𞴺ς; ‌ⴠ-.1ς𞴺ς; [B1, C1, V3]; xn----rgn530d.xn--1-ymba92321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, V3] # ⴠ-.1ς𞴺ς +‌Ⴠ-.𝟷Σ𞴺Σ; ‌Ⴠ-.1σ𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-0mba52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1σ𞴺σ +‌ⴠ-.𝟷σ𞴺σ; ‌ⴠ-.1σ𞴺σ; [B1, C1, V3]; xn----rgn530d.xn--1-0mba52321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, V3] # ⴠ-.1σ𞴺σ +‌Ⴠ-.𝟷σ𞴺Σ; ‌Ⴠ-.1σ𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-0mba52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1σ𞴺σ +‌Ⴠ-.𝟷ς𞴺Σ; ‌Ⴠ-.1ς𞴺σ; [B1, C1, P1, V3, V6]; xn----z1g168i.xn--1-ymbd52321c; ; xn----z1g.xn--1-0mba52321c; [B1, B6, P1, V3, V6] # Ⴠ-.1ς𞴺σ +‌ⴠ-.𝟷ς𞴺σ; ‌ⴠ-.1ς𞴺σ; [B1, C1, V3]; xn----rgn530d.xn--1-ymbd52321c; ; xn----2ws.xn--1-0mba52321c; [B1, B6, V3] # ⴠ-.1ς𞴺σ +𑲘󠄒𓑡。𝟪Ⴜ; 𑲘𓑡.8Ⴜ; [P1, V5, V6]; xn--7m3d291b.xn--8-s1g; ; ; # 𑲘.8Ⴜ +𑲘󠄒𓑡。8Ⴜ; 𑲘𓑡.8Ⴜ; [P1, V5, V6]; xn--7m3d291b.xn--8-s1g; ; ; # 𑲘.8Ⴜ +𑲘󠄒𓑡。8ⴜ; 𑲘𓑡.8ⴜ; [P1, V5, V6]; xn--7m3d291b.xn--8-vws; ; ; # 𑲘.8ⴜ +xn--7m3d291b.xn--8-vws; 𑲘𓑡.8ⴜ; [V5, V6]; xn--7m3d291b.xn--8-vws; ; ; # 𑲘.8ⴜ +xn--7m3d291b.xn--8-s1g; 𑲘𓑡.8Ⴜ; [V5, V6]; xn--7m3d291b.xn--8-s1g; ; ; # 𑲘.8Ⴜ +𑲘󠄒𓑡。𝟪ⴜ; 𑲘𓑡.8ⴜ; [P1, V5, V6]; xn--7m3d291b.xn--8-vws; ; ; # 𑲘.8ⴜ +䪏ګߠु。뭕ᢝឹ; 䪏ګߠु.뭕ᢝឹ; [B5, B6]; xn--ekb23dj4at01n.xn--43e96bh910b; ; ; # 䪏ګߠु.뭕ᢝឹ +䪏ګߠु。뭕ᢝឹ; 䪏ګߠु.뭕ᢝឹ; [B5, B6]; xn--ekb23dj4at01n.xn--43e96bh910b; ; ; # 䪏ګߠु.뭕ᢝឹ +䪏ګߠु。뭕ᢝឹ; 䪏ګߠु.뭕ᢝឹ; [B5, B6]; xn--ekb23dj4at01n.xn--43e96bh910b; ; ; # 䪏ګߠु.뭕ᢝឹ +䪏ګߠु。뭕ᢝឹ; 䪏ګߠु.뭕ᢝឹ; [B5, B6]; xn--ekb23dj4at01n.xn--43e96bh910b; ; ; # 䪏ګߠु.뭕ᢝឹ +xn--ekb23dj4at01n.xn--43e96bh910b; 䪏ګߠु.뭕ᢝឹ; [B5, B6]; xn--ekb23dj4at01n.xn--43e96bh910b; ; ; # 䪏ګߠु.뭕ᢝឹ +᮫。🂉󠁰; ᮫.🂉󠁰; [P1, V5, V6]; xn--zxf.xn--fx7ho0250c; ; ; # ᮫.🂉 +᮫。🂉󠁰; ᮫.🂉󠁰; [P1, V5, V6]; xn--zxf.xn--fx7ho0250c; ; ; # ᮫.🂉 +xn--zxf.xn--fx7ho0250c; ᮫.🂉󠁰; [V5, V6]; xn--zxf.xn--fx7ho0250c; ; ; # ᮫.🂉 +󩎃ૄ。ς‍𐹮𑈵; 󩎃ૄ.ς‍𐹮𑈵; [B5, C2, P1, V6]; xn--dfc53161q.xn--3xa006lzo7nsfd; ; xn--dfc53161q.xn--4xa8467k5mc; [B5, P1, V6] # ૄ.ς𐹮𑈵 +󩎃ૄ。Σ‍𐹮𑈵; 󩎃ૄ.σ‍𐹮𑈵; [B5, C2, P1, V6]; xn--dfc53161q.xn--4xa895lzo7nsfd; ; xn--dfc53161q.xn--4xa8467k5mc; [B5, P1, V6] # ૄ.σ𐹮𑈵 +󩎃ૄ。σ‍𐹮𑈵; 󩎃ૄ.σ‍𐹮𑈵; [B5, C2, P1, V6]; xn--dfc53161q.xn--4xa895lzo7nsfd; ; xn--dfc53161q.xn--4xa8467k5mc; [B5, P1, V6] # ૄ.σ𐹮𑈵 +xn--dfc53161q.xn--4xa8467k5mc; 󩎃ૄ.σ𐹮𑈵; [B5, V6]; xn--dfc53161q.xn--4xa8467k5mc; ; ; # ૄ.σ𐹮𑈵 +xn--dfc53161q.xn--4xa895lzo7nsfd; 󩎃ૄ.σ‍𐹮𑈵; [B5, C2, V6]; xn--dfc53161q.xn--4xa895lzo7nsfd; ; ; # ૄ.σ𐹮𑈵 +xn--dfc53161q.xn--3xa006lzo7nsfd; 󩎃ૄ.ς‍𐹮𑈵; [B5, C2, V6]; xn--dfc53161q.xn--3xa006lzo7nsfd; ; ; # ૄ.ς𐹮𑈵 +𐫀ᡂ𑜫.𑘿; 𐫀ᡂ𑜫.𑘿; [B1, B2, B3, B6, V5]; xn--17e9625js1h.xn--sb2d; ; ; # 𐫀ᡂ𑜫.𑘿 +𐫀ᡂ𑜫.𑘿; ; [B1, B2, B3, B6, V5]; xn--17e9625js1h.xn--sb2d; ; ; # 𐫀ᡂ𑜫.𑘿 +xn--17e9625js1h.xn--sb2d; 𐫀ᡂ𑜫.𑘿; [B1, B2, B3, B6, V5]; xn--17e9625js1h.xn--sb2d; ; ; # 𐫀ᡂ𑜫.𑘿 +󬚶󸋖򖩰-。‌; 󬚶󸋖򖩰-.‌; [C1, P1, V3, V6]; xn----7i12hu122k9ire.xn--0ug; ; xn----7i12hu122k9ire.; [P1, V3, V6] # -. +xn----7i12hu122k9ire.; 󬚶󸋖򖩰-.; [V3, V6]; xn----7i12hu122k9ire.; ; ; # -. +xn----7i12hu122k9ire.xn--0ug; 󬚶󸋖򖩰-.‌; [C1, V3, V6]; xn----7i12hu122k9ire.xn--0ug; ; ; # -. +𐹣.߂; 𐹣.߂; [B1]; xn--bo0d.xn--dsb; ; ; # 𐹣.߂ +𐹣.߂; ; [B1]; xn--bo0d.xn--dsb; ; ; # 𐹣.߂ +xn--bo0d.xn--dsb; 𐹣.߂; [B1]; xn--bo0d.xn--dsb; ; ; # 𐹣.߂ +-ߡ。Ↄ; -ߡ.Ↄ; [B1, P1, V3, V6]; xn----8cd.xn--q5g; ; ; # -ߡ.Ↄ +-ߡ。Ↄ; -ߡ.Ↄ; [B1, P1, V3, V6]; xn----8cd.xn--q5g; ; ; # -ߡ.Ↄ +-ߡ。ↄ; -ߡ.ↄ; [B1, V3]; xn----8cd.xn--r5g; ; ; # -ߡ.ↄ +xn----8cd.xn--r5g; -ߡ.ↄ; [B1, V3]; xn----8cd.xn--r5g; ; ; # -ߡ.ↄ +xn----8cd.xn--q5g; -ߡ.Ↄ; [B1, V3, V6]; xn----8cd.xn--q5g; ; ; # -ߡ.Ↄ +-ߡ。ↄ; -ߡ.ↄ; [B1, V3]; xn----8cd.xn--r5g; ; ; # -ߡ.ↄ +‍-︒󠄄。ß哑‌𐵿; ‍-︒.ß哑‌𐵿; [B1, B5, B6, C1, C2, P1, V6]; xn----tgnt341h.xn--zca670n5f0binyk; ; xn----o89h.xn--ss-h46c5711e; [B1, B5, B6, P1, V3, V6] # -︒.ß哑 +‍-。󠄄。ß哑‌𐵿; ‍-..ß哑‌𐵿; [B1, B5, B6, C1, C2, P1, V3, V6, X4_2]; xn----tgn..xn--zca670n5f0binyk; [B1, B5, B6, C1, C2, P1, V3, V6, A4_2]; -..xn--ss-h46c5711e; [B1, B5, B6, P1, V3, V6, A4_2] # -..ß哑 +‍-。󠄄。SS哑‌𐵿; ‍-..ss哑‌𐵿; [B1, B5, B6, C1, C2, P1, V3, V6, X4_2]; xn----tgn..xn--ss-k1ts75zb8ym; [B1, B5, B6, C1, C2, P1, V3, V6, A4_2]; -..xn--ss-h46c5711e; [B1, B5, B6, P1, V3, V6, A4_2] # -..ss哑 +‍-。󠄄。ss哑‌𐵿; ‍-..ss哑‌𐵿; [B1, B5, B6, C1, C2, P1, V3, V6, X4_2]; xn----tgn..xn--ss-k1ts75zb8ym; [B1, B5, B6, C1, C2, P1, V3, V6, A4_2]; -..xn--ss-h46c5711e; [B1, B5, B6, P1, V3, V6, A4_2] # -..ss哑 +‍-。󠄄。Ss哑‌𐵿; ‍-..ss哑‌𐵿; [B1, B5, B6, C1, C2, P1, V3, V6, X4_2]; xn----tgn..xn--ss-k1ts75zb8ym; [B1, B5, B6, C1, C2, P1, V3, V6, A4_2]; -..xn--ss-h46c5711e; [B1, B5, B6, P1, V3, V6, A4_2] # -..ss哑 +-..xn--ss-h46c5711e; -..ss哑𐵿; [B1, B5, B6, V3, V6, X4_2]; -..xn--ss-h46c5711e; [B1, B5, B6, V3, V6, A4_2]; ; # -..ss哑 +xn----tgn..xn--ss-k1ts75zb8ym; ‍-..ss哑‌𐵿; [B1, B5, B6, C1, C2, V3, V6, X4_2]; xn----tgn..xn--ss-k1ts75zb8ym; [B1, B5, B6, C1, C2, V3, V6, A4_2]; ; # -..ss哑 +xn----tgn..xn--zca670n5f0binyk; ‍-..ß哑‌𐵿; [B1, B5, B6, C1, C2, V3, V6, X4_2]; xn----tgn..xn--zca670n5f0binyk; [B1, B5, B6, C1, C2, V3, V6, A4_2]; ; # -..ß哑 +‍-︒󠄄。SS哑‌𐵿; ‍-︒.ss哑‌𐵿; [B1, B5, B6, C1, C2, P1, V6]; xn----tgnt341h.xn--ss-k1ts75zb8ym; ; xn----o89h.xn--ss-h46c5711e; [B1, B5, B6, P1, V3, V6] # -︒.ss哑 +‍-︒󠄄。ss哑‌𐵿; ‍-︒.ss哑‌𐵿; [B1, B5, B6, C1, C2, P1, V6]; xn----tgnt341h.xn--ss-k1ts75zb8ym; ; xn----o89h.xn--ss-h46c5711e; [B1, B5, B6, P1, V3, V6] # -︒.ss哑 +‍-︒󠄄。Ss哑‌𐵿; ‍-︒.ss哑‌𐵿; [B1, B5, B6, C1, C2, P1, V6]; xn----tgnt341h.xn--ss-k1ts75zb8ym; ; xn----o89h.xn--ss-h46c5711e; [B1, B5, B6, P1, V3, V6] # -︒.ss哑 +xn----o89h.xn--ss-h46c5711e; -︒.ss哑𐵿; [B1, B5, B6, V3, V6]; xn----o89h.xn--ss-h46c5711e; ; ; # -︒.ss哑 +xn----tgnt341h.xn--ss-k1ts75zb8ym; ‍-︒.ss哑‌𐵿; [B1, B5, B6, C1, C2, V6]; xn----tgnt341h.xn--ss-k1ts75zb8ym; ; ; # -︒.ss哑 +xn----tgnt341h.xn--zca670n5f0binyk; ‍-︒.ß哑‌𐵿; [B1, B5, B6, C1, C2, V6]; xn----tgnt341h.xn--zca670n5f0binyk; ; ; # -︒.ß哑 +︒.𑑂︯; ︒.𑑂︯; [P1, V5, V6]; xn--y86c.xn--s96cu30b; ; ; # ︒.𑑂︯ +︒.𑑂︯; ︒.𑑂︯; [P1, V5, V6]; xn--y86c.xn--s96cu30b; ; ; # ︒.𑑂︯ +。.𑑂︯; ..𑑂︯; [V5, X4_2]; ..xn--s96cu30b; [V5, A4_2]; ; # ..𑑂︯ +..xn--s96cu30b; ..𑑂︯; [V5, X4_2]; ..xn--s96cu30b; [V5, A4_2]; ; # ..𑑂︯ +xn--y86c.xn--s96cu30b; ︒.𑑂︯; [V5, V6]; xn--y86c.xn--s96cu30b; ; ; # ︒.𑑂︯ +꤬。‍; ꤬.‍; [C2, V5]; xn--zi9a.xn--1ug; ; xn--zi9a.; [V5] # ꤬. +xn--zi9a.; ꤬.; [V5]; xn--zi9a.; ; ; # ꤬. +xn--zi9a.xn--1ug; ꤬.‍; [C2, V5]; xn--zi9a.xn--1ug; ; ; # ꤬. +‍󠸡。ﳗ; ‍󠸡.هج; [B1, C2, P1, V6]; xn--1ug80651l.xn--rgb7c; ; xn--d356e.xn--rgb7c; [B1, P1, V6] # .هج +‍󠸡。هج; ‍󠸡.هج; [B1, C2, P1, V6]; xn--1ug80651l.xn--rgb7c; ; xn--d356e.xn--rgb7c; [B1, P1, V6] # .هج +xn--d356e.xn--rgb7c; 󠸡.هج; [B1, V6]; xn--d356e.xn--rgb7c; ; ; # .هج +xn--1ug80651l.xn--rgb7c; ‍󠸡.هج; [B1, C2, V6]; xn--1ug80651l.xn--rgb7c; ; ; # .هج +-Ⴄ𝟢٣.𑍴ς; -Ⴄ0٣.𑍴ς; [B1, P1, V3, V5, V6]; xn---0-iyd216h.xn--3xa1220l; ; xn---0-iyd216h.xn--4xa9120l; # -Ⴄ0٣.𑍴ς +-Ⴄ0٣.𑍴ς; ; [B1, P1, V3, V5, V6]; xn---0-iyd216h.xn--3xa1220l; ; xn---0-iyd216h.xn--4xa9120l; # -Ⴄ0٣.𑍴ς +-ⴄ0٣.𑍴ς; ; [B1, V3, V5]; xn---0-iyd8660b.xn--3xa1220l; ; xn---0-iyd8660b.xn--4xa9120l; # -ⴄ0٣.𑍴ς +-Ⴄ0٣.𑍴Σ; -Ⴄ0٣.𑍴σ; [B1, P1, V3, V5, V6]; xn---0-iyd216h.xn--4xa9120l; ; ; # -Ⴄ0٣.𑍴σ +-ⴄ0٣.𑍴σ; ; [B1, V3, V5]; xn---0-iyd8660b.xn--4xa9120l; ; ; # -ⴄ0٣.𑍴σ +xn---0-iyd8660b.xn--4xa9120l; -ⴄ0٣.𑍴σ; [B1, V3, V5]; xn---0-iyd8660b.xn--4xa9120l; ; ; # -ⴄ0٣.𑍴σ +xn---0-iyd216h.xn--4xa9120l; -Ⴄ0٣.𑍴σ; [B1, V3, V5, V6]; xn---0-iyd216h.xn--4xa9120l; ; ; # -Ⴄ0٣.𑍴σ +xn---0-iyd8660b.xn--3xa1220l; -ⴄ0٣.𑍴ς; [B1, V3, V5]; xn---0-iyd8660b.xn--3xa1220l; ; ; # -ⴄ0٣.𑍴ς +xn---0-iyd216h.xn--3xa1220l; -Ⴄ0٣.𑍴ς; [B1, V3, V5, V6]; xn---0-iyd216h.xn--3xa1220l; ; ; # -Ⴄ0٣.𑍴ς +-ⴄ𝟢٣.𑍴ς; -ⴄ0٣.𑍴ς; [B1, V3, V5]; xn---0-iyd8660b.xn--3xa1220l; ; xn---0-iyd8660b.xn--4xa9120l; # -ⴄ0٣.𑍴ς +-Ⴄ𝟢٣.𑍴Σ; -Ⴄ0٣.𑍴σ; [B1, P1, V3, V5, V6]; xn---0-iyd216h.xn--4xa9120l; ; ; # -Ⴄ0٣.𑍴σ +-ⴄ𝟢٣.𑍴σ; -ⴄ0٣.𑍴σ; [B1, V3, V5]; xn---0-iyd8660b.xn--4xa9120l; ; ; # -ⴄ0٣.𑍴σ +󦈄。-; 󦈄.-; [P1, V3, V6]; xn--xm38e.-; ; ; # .- +xn--xm38e.-; 󦈄.-; [V3, V6]; xn--xm38e.-; ; ; # .- +⋠𐋮.򶈮༘ß≯; ⋠𐋮.򶈮༘ß≯; [P1, V6]; xn--pgh4639f.xn--zca593eo6oc013y; ; xn--pgh4639f.xn--ss-ifj426nle504a; # ⋠𐋮.༘ß≯ +⋠𐋮.򶈮༘ß≯; ⋠𐋮.򶈮༘ß≯; [P1, V6]; xn--pgh4639f.xn--zca593eo6oc013y; ; xn--pgh4639f.xn--ss-ifj426nle504a; # ⋠𐋮.༘ß≯ +⋠𐋮.򶈮༘ß≯; ; [P1, V6]; xn--pgh4639f.xn--zca593eo6oc013y; ; xn--pgh4639f.xn--ss-ifj426nle504a; # ⋠𐋮.༘ß≯ +⋠𐋮.򶈮༘ß≯; ⋠𐋮.򶈮༘ß≯; [P1, V6]; xn--pgh4639f.xn--zca593eo6oc013y; ; xn--pgh4639f.xn--ss-ifj426nle504a; # ⋠𐋮.༘ß≯ +⋠𐋮.򶈮༘SS≯; ⋠𐋮.򶈮༘ss≯; [P1, V6]; xn--pgh4639f.xn--ss-ifj426nle504a; ; ; # ⋠𐋮.༘ss≯ +⋠𐋮.򶈮༘SS≯; ⋠𐋮.򶈮༘ss≯; [P1, V6]; xn--pgh4639f.xn--ss-ifj426nle504a; ; ; # ⋠𐋮.༘ss≯ +⋠𐋮.򶈮༘ss≯; ; [P1, V6]; xn--pgh4639f.xn--ss-ifj426nle504a; ; ; # ⋠𐋮.༘ss≯ +⋠𐋮.򶈮༘ss≯; ⋠𐋮.򶈮༘ss≯; [P1, V6]; xn--pgh4639f.xn--ss-ifj426nle504a; ; ; # ⋠𐋮.༘ss≯ +⋠𐋮.򶈮༘Ss≯; ⋠𐋮.򶈮༘ss≯; [P1, V6]; xn--pgh4639f.xn--ss-ifj426nle504a; ; ; # ⋠𐋮.༘ss≯ +⋠𐋮.򶈮༘Ss≯; ⋠𐋮.򶈮༘ss≯; [P1, V6]; xn--pgh4639f.xn--ss-ifj426nle504a; ; ; # ⋠𐋮.༘ss≯ +xn--pgh4639f.xn--ss-ifj426nle504a; ⋠𐋮.򶈮༘ss≯; [V6]; xn--pgh4639f.xn--ss-ifj426nle504a; ; ; # ⋠𐋮.༘ss≯ +xn--pgh4639f.xn--zca593eo6oc013y; ⋠𐋮.򶈮༘ß≯; [V6]; xn--pgh4639f.xn--zca593eo6oc013y; ; ; # ⋠𐋮.༘ß≯ +⋠𐋮.򶈮༘SS≯; ⋠𐋮.򶈮༘ss≯; [P1, V6]; xn--pgh4639f.xn--ss-ifj426nle504a; ; ; # ⋠𐋮.༘ss≯ +⋠𐋮.򶈮༘SS≯; ⋠𐋮.򶈮༘ss≯; [P1, V6]; xn--pgh4639f.xn--ss-ifj426nle504a; ; ; # ⋠𐋮.༘ss≯ +⋠𐋮.򶈮༘ss≯; ⋠𐋮.򶈮༘ss≯; [P1, V6]; xn--pgh4639f.xn--ss-ifj426nle504a; ; ; # ⋠𐋮.༘ss≯ +⋠𐋮.򶈮༘ss≯; ⋠𐋮.򶈮༘ss≯; [P1, V6]; xn--pgh4639f.xn--ss-ifj426nle504a; ; ; # ⋠𐋮.༘ss≯ +⋠𐋮.򶈮༘Ss≯; ⋠𐋮.򶈮༘ss≯; [P1, V6]; xn--pgh4639f.xn--ss-ifj426nle504a; ; ; # ⋠𐋮.༘ss≯ +⋠𐋮.򶈮༘Ss≯; ⋠𐋮.򶈮༘ss≯; [P1, V6]; xn--pgh4639f.xn--ss-ifj426nle504a; ; ; # ⋠𐋮.༘ss≯ +1𐋸٤。󠢮ﮤ񷝊; 1𐋸٤.󠢮ۀ񷝊; [B1, P1, V6]; xn--1-hqc3905q.xn--zkb83268gqee4a; ; ; # 1𐋸٤.ۀ +1𐋸٤。󠢮ۀ񷝊; 1𐋸٤.󠢮ۀ񷝊; [B1, P1, V6]; xn--1-hqc3905q.xn--zkb83268gqee4a; ; ; # 1𐋸٤.ۀ +1𐋸٤。󠢮ۀ񷝊; 1𐋸٤.󠢮ۀ񷝊; [B1, P1, V6]; xn--1-hqc3905q.xn--zkb83268gqee4a; ; ; # 1𐋸٤.ۀ +xn--1-hqc3905q.xn--zkb83268gqee4a; 1𐋸٤.󠢮ۀ񷝊; [B1, V6]; xn--1-hqc3905q.xn--zkb83268gqee4a; ; ; # 1𐋸٤.ۀ +儭-。𐹴Ⴢ񥳠‌; 儭-.𐹴Ⴢ񥳠‌; [B1, B6, C1, P1, V3, V6]; xn----gz7a.xn--6nd249ejl4pusr7b; ; xn----gz7a.xn--6nd5001kyw98a; [B1, B6, P1, V3, V6] # 儭-.𐹴Ⴢ +儭-。𐹴Ⴢ񥳠‌; 儭-.𐹴Ⴢ񥳠‌; [B1, B6, C1, P1, V3, V6]; xn----gz7a.xn--6nd249ejl4pusr7b; ; xn----gz7a.xn--6nd5001kyw98a; [B1, B6, P1, V3, V6] # 儭-.𐹴Ⴢ +儭-。𐹴ⴢ񥳠‌; 儭-.𐹴ⴢ񥳠‌; [B1, B6, C1, P1, V3, V6]; xn----gz7a.xn--0ug472cfq0pus98b; ; xn----gz7a.xn--qlj9223eywx0b; [B1, B6, P1, V3, V6] # 儭-.𐹴ⴢ +xn----gz7a.xn--qlj9223eywx0b; 儭-.𐹴ⴢ񥳠; [B1, B6, V3, V6]; xn----gz7a.xn--qlj9223eywx0b; ; ; # 儭-.𐹴ⴢ +xn----gz7a.xn--0ug472cfq0pus98b; 儭-.𐹴ⴢ񥳠‌; [B1, B6, C1, V3, V6]; xn----gz7a.xn--0ug472cfq0pus98b; ; ; # 儭-.𐹴ⴢ +xn----gz7a.xn--6nd5001kyw98a; 儭-.𐹴Ⴢ񥳠; [B1, B6, V3, V6]; xn----gz7a.xn--6nd5001kyw98a; ; ; # 儭-.𐹴Ⴢ +xn----gz7a.xn--6nd249ejl4pusr7b; 儭-.𐹴Ⴢ񥳠‌; [B1, B6, C1, V3, V6]; xn----gz7a.xn--6nd249ejl4pusr7b; ; ; # 儭-.𐹴Ⴢ +儭-。𐹴ⴢ񥳠‌; 儭-.𐹴ⴢ񥳠‌; [B1, B6, C1, P1, V3, V6]; xn----gz7a.xn--0ug472cfq0pus98b; ; xn----gz7a.xn--qlj9223eywx0b; [B1, B6, P1, V3, V6] # 儭-.𐹴ⴢ +𝟺𐋷ڹ.𞤭򿍡; 4𐋷ڹ.𞤭򿍡; [B1, B2, B3, P1, V6]; xn--4-cvc5384q.xn--le6hi7322b; ; ; # 4𐋷ڹ.𞤭 +4𐋷ڹ.𞤭򿍡; ; [B1, B2, B3, P1, V6]; xn--4-cvc5384q.xn--le6hi7322b; ; ; # 4𐋷ڹ.𞤭 +4𐋷ڹ.𞤋򿍡; 4𐋷ڹ.𞤭򿍡; [B1, B2, B3, P1, V6]; xn--4-cvc5384q.xn--le6hi7322b; ; ; # 4𐋷ڹ.𞤭 +xn--4-cvc5384q.xn--le6hi7322b; 4𐋷ڹ.𞤭򿍡; [B1, B2, B3, V6]; xn--4-cvc5384q.xn--le6hi7322b; ; ; # 4𐋷ڹ.𞤭 +𝟺𐋷ڹ.𞤋򿍡; 4𐋷ڹ.𞤭򿍡; [B1, B2, B3, P1, V6]; xn--4-cvc5384q.xn--le6hi7322b; ; ; # 4𐋷ڹ.𞤭 +≯-ꡋ𑲣.⒈𐹭; ; [B1, P1, V6]; xn----ogox061d5i8d.xn--tsh0666f; ; ; # ≯-ꡋ𑲣.⒈𐹭 +≯-ꡋ𑲣.⒈𐹭; ≯-ꡋ𑲣.⒈𐹭; [B1, P1, V6]; xn----ogox061d5i8d.xn--tsh0666f; ; ; # ≯-ꡋ𑲣.⒈𐹭 +≯-ꡋ𑲣.1.𐹭; ; [B1, P1, V6]; xn----ogox061d5i8d.1.xn--lo0d; ; ; # ≯-ꡋ𑲣.1.𐹭 +≯-ꡋ𑲣.1.𐹭; ≯-ꡋ𑲣.1.𐹭; [B1, P1, V6]; xn----ogox061d5i8d.1.xn--lo0d; ; ; # ≯-ꡋ𑲣.1.𐹭 +xn----ogox061d5i8d.1.xn--lo0d; ≯-ꡋ𑲣.1.𐹭; [B1, V6]; xn----ogox061d5i8d.1.xn--lo0d; ; ; # ≯-ꡋ𑲣.1.𐹭 +xn----ogox061d5i8d.xn--tsh0666f; ≯-ꡋ𑲣.⒈𐹭; [B1, V6]; xn----ogox061d5i8d.xn--tsh0666f; ; ; # ≯-ꡋ𑲣.⒈𐹭 +̰.󰜱蚀; ̰.󰜱蚀; [P1, V5, V6]; xn--xta.xn--e91aw9417e; ; ; # ̰.蚀 +̰.󰜱蚀; ; [P1, V5, V6]; xn--xta.xn--e91aw9417e; ; ; # ̰.蚀 +xn--xta.xn--e91aw9417e; ̰.󰜱蚀; [V5, V6]; xn--xta.xn--e91aw9417e; ; ; # ̰.蚀 +יּႸ.𞡼𑇀ß⃗; יּႸ.𞡼𑇀ß⃗; [B2, B3, P1, V6]; xn--kdb1d867b.xn--zca284nhg9nrrxg; ; xn--kdb1d867b.xn--ss-yju5690ken9h; # יּႸ.𞡼𑇀ß⃗ +יּႸ.𞡼𑇀ß⃗; ; [B2, B3, P1, V6]; xn--kdb1d867b.xn--zca284nhg9nrrxg; ; xn--kdb1d867b.xn--ss-yju5690ken9h; # יּႸ.𞡼𑇀ß⃗ +יּⴘ.𞡼𑇀ß⃗; ; [B2, B3]; xn--kdb1d278n.xn--zca284nhg9nrrxg; ; xn--kdb1d278n.xn--ss-yju5690ken9h; # יּⴘ.𞡼𑇀ß⃗ +יּႸ.𞡼𑇀SS⃗; יּႸ.𞡼𑇀ss⃗; [B2, B3, P1, V6]; xn--kdb1d867b.xn--ss-yju5690ken9h; ; ; # יּႸ.𞡼𑇀ss⃗ +יּⴘ.𞡼𑇀ss⃗; ; [B2, B3]; xn--kdb1d278n.xn--ss-yju5690ken9h; ; ; # יּⴘ.𞡼𑇀ss⃗ +xn--kdb1d278n.xn--ss-yju5690ken9h; יּⴘ.𞡼𑇀ss⃗; [B2, B3]; xn--kdb1d278n.xn--ss-yju5690ken9h; ; ; # יּⴘ.𞡼𑇀ss⃗ +xn--kdb1d867b.xn--ss-yju5690ken9h; יּႸ.𞡼𑇀ss⃗; [B2, B3, V6]; xn--kdb1d867b.xn--ss-yju5690ken9h; ; ; # יּႸ.𞡼𑇀ss⃗ +xn--kdb1d278n.xn--zca284nhg9nrrxg; יּⴘ.𞡼𑇀ß⃗; [B2, B3]; xn--kdb1d278n.xn--zca284nhg9nrrxg; ; ; # יּⴘ.𞡼𑇀ß⃗ +xn--kdb1d867b.xn--zca284nhg9nrrxg; יּႸ.𞡼𑇀ß⃗; [B2, B3, V6]; xn--kdb1d867b.xn--zca284nhg9nrrxg; ; ; # יּႸ.𞡼𑇀ß⃗ +יּⴘ.𞡼𑇀ß⃗; יּⴘ.𞡼𑇀ß⃗; [B2, B3]; xn--kdb1d278n.xn--zca284nhg9nrrxg; ; xn--kdb1d278n.xn--ss-yju5690ken9h; # יּⴘ.𞡼𑇀ß⃗ +יּႸ.𞡼𑇀SS⃗; יּႸ.𞡼𑇀ss⃗; [B2, B3, P1, V6]; xn--kdb1d867b.xn--ss-yju5690ken9h; ; ; # יּႸ.𞡼𑇀ss⃗ +יּⴘ.𞡼𑇀ss⃗; יּⴘ.𞡼𑇀ss⃗; [B2, B3]; xn--kdb1d278n.xn--ss-yju5690ken9h; ; ; # יּⴘ.𞡼𑇀ss⃗ +יּႸ.𞡼𑇀ss⃗; ; [B2, B3, P1, V6]; xn--kdb1d867b.xn--ss-yju5690ken9h; ; ; # יּႸ.𞡼𑇀ss⃗ +יּႸ.𞡼𑇀ss⃗; יּႸ.𞡼𑇀ss⃗; [B2, B3, P1, V6]; xn--kdb1d867b.xn--ss-yju5690ken9h; ; ; # יּႸ.𞡼𑇀ss⃗ +ᮣ𐹰򁱓。凬; ᮣ𐹰򁱓.凬; [B1, P1, V5, V6]; xn--rxfz314ilg20c.xn--t9q; ; ; # ᮣ𐹰.凬 +ᮣ𐹰򁱓。凬; ᮣ𐹰򁱓.凬; [B1, P1, V5, V6]; xn--rxfz314ilg20c.xn--t9q; ; ; # ᮣ𐹰.凬 +xn--rxfz314ilg20c.xn--t9q; ᮣ𐹰򁱓.凬; [B1, V5, V6]; xn--rxfz314ilg20c.xn--t9q; ; ; # ᮣ𐹰.凬 +🢟🄈‍ꡎ。྄; 🢟🄈‍ꡎ.྄; [C2, P1, V5, V6]; xn--1ug4874cfd0kbmg.xn--3ed; ; xn--nc9aq743ds0e.xn--3ed; [P1, V5, V6] # 🢟🄈ꡎ.྄ +🢟7,‍ꡎ。྄; 🢟7,‍ꡎ.྄; [C2, P1, V5, V6]; xn--7,-n1t0654eqo3o.xn--3ed; ; xn--7,-gh9hg322i.xn--3ed; [P1, V5, V6] # 🢟7,ꡎ.྄ +xn--7,-gh9hg322i.xn--3ed; 🢟7,ꡎ.྄; [P1, V5, V6]; xn--7,-gh9hg322i.xn--3ed; ; ; # 🢟7,ꡎ.྄ +xn--7,-n1t0654eqo3o.xn--3ed; 🢟7,‍ꡎ.྄; [C2, P1, V5, V6]; xn--7,-n1t0654eqo3o.xn--3ed; ; ; # 🢟7,ꡎ.྄ +xn--nc9aq743ds0e.xn--3ed; 🢟🄈ꡎ.྄; [V5, V6]; xn--nc9aq743ds0e.xn--3ed; ; ; # 🢟🄈ꡎ.྄ +xn--1ug4874cfd0kbmg.xn--3ed; 🢟🄈‍ꡎ.྄; [C2, V5, V6]; xn--1ug4874cfd0kbmg.xn--3ed; ; ; # 🢟🄈ꡎ.྄ +ꡔ。္ᢇ; ꡔ.္ᢇ; [V5]; xn--tc9a.xn--9jd663b; ; ; # ꡔ.္ᢇ +xn--tc9a.xn--9jd663b; ꡔ.္ᢇ; [V5]; xn--tc9a.xn--9jd663b; ; ; # ꡔ.္ᢇ +⃫≮.𝨖; ; [P1, V5, V6]; xn--e1g71d.xn--772h; ; ; # ⃫≮.𝨖 +⃫≮.𝨖; ⃫≮.𝨖; [P1, V5, V6]; xn--e1g71d.xn--772h; ; ; # ⃫≮.𝨖 +xn--e1g71d.xn--772h; ⃫≮.𝨖; [V5, V6]; xn--e1g71d.xn--772h; ; ; # ⃫≮.𝨖 +Ⴢ≯褦.ᠪߪႾݧ; Ⴢ≯褦.ᠪߪႾݧ; [B5, B6, P1, V6]; xn--6nd461g478e.xn--rpb5x49td2h; ; ; # Ⴢ≯褦.ᠪߪႾݧ +Ⴢ≯褦.ᠪߪႾݧ; Ⴢ≯褦.ᠪߪႾݧ; [B5, B6, P1, V6]; xn--6nd461g478e.xn--rpb5x49td2h; ; ; # Ⴢ≯褦.ᠪߪႾݧ +Ⴢ≯褦.ᠪߪႾݧ; ; [B5, B6, P1, V6]; xn--6nd461g478e.xn--rpb5x49td2h; ; ; # Ⴢ≯褦.ᠪߪႾݧ +Ⴢ≯褦.ᠪߪႾݧ; Ⴢ≯褦.ᠪߪႾݧ; [B5, B6, P1, V6]; xn--6nd461g478e.xn--rpb5x49td2h; ; ; # Ⴢ≯褦.ᠪߪႾݧ +ⴢ≯褦.ᠪߪⴞݧ; ⴢ≯褦.ᠪߪⴞݧ; [B5, B6, P1, V6]; xn--hdh433bev8e.xn--rpb5x392bcyt; ; ; # ⴢ≯褦.ᠪߪⴞݧ +ⴢ≯褦.ᠪߪⴞݧ; ; [B5, B6, P1, V6]; xn--hdh433bev8e.xn--rpb5x392bcyt; ; ; # ⴢ≯褦.ᠪߪⴞݧ +Ⴢ≯褦.ᠪߪⴞݧ; ; [B5, B6, P1, V6]; xn--6nd461g478e.xn--rpb5x392bcyt; ; ; # Ⴢ≯褦.ᠪߪⴞݧ +Ⴢ≯褦.ᠪߪⴞݧ; Ⴢ≯褦.ᠪߪⴞݧ; [B5, B6, P1, V6]; xn--6nd461g478e.xn--rpb5x392bcyt; ; ; # Ⴢ≯褦.ᠪߪⴞݧ +xn--6nd461g478e.xn--rpb5x392bcyt; Ⴢ≯褦.ᠪߪⴞݧ; [B5, B6, V6]; xn--6nd461g478e.xn--rpb5x392bcyt; ; ; # Ⴢ≯褦.ᠪߪⴞݧ +xn--hdh433bev8e.xn--rpb5x392bcyt; ⴢ≯褦.ᠪߪⴞݧ; [B5, B6, V6]; xn--hdh433bev8e.xn--rpb5x392bcyt; ; ; # ⴢ≯褦.ᠪߪⴞݧ +xn--6nd461g478e.xn--rpb5x49td2h; Ⴢ≯褦.ᠪߪႾݧ; [B5, B6, V6]; xn--6nd461g478e.xn--rpb5x49td2h; ; ; # Ⴢ≯褦.ᠪߪႾݧ +ⴢ≯褦.ᠪߪⴞݧ; ⴢ≯褦.ᠪߪⴞݧ; [B5, B6, P1, V6]; xn--hdh433bev8e.xn--rpb5x392bcyt; ; ; # ⴢ≯褦.ᠪߪⴞݧ +ⴢ≯褦.ᠪߪⴞݧ; ⴢ≯褦.ᠪߪⴞݧ; [B5, B6, P1, V6]; xn--hdh433bev8e.xn--rpb5x392bcyt; ; ; # ⴢ≯褦.ᠪߪⴞݧ +Ⴢ≯褦.ᠪߪⴞݧ; Ⴢ≯褦.ᠪߪⴞݧ; [B5, B6, P1, V6]; xn--6nd461g478e.xn--rpb5x392bcyt; ; ; # Ⴢ≯褦.ᠪߪⴞݧ +Ⴢ≯褦.ᠪߪⴞݧ; Ⴢ≯褦.ᠪߪⴞݧ; [B5, B6, P1, V6]; xn--6nd461g478e.xn--rpb5x392bcyt; ; ; # Ⴢ≯褦.ᠪߪⴞݧ +򊉆󠆒‌꥓。𞤙ٻꡘ; 򊉆‌꥓.𞤻ٻꡘ; [B2, B3, C1, P1, V6]; xn--0ug8815chtz0e.xn--0ib8893fegvj; ; xn--3j9al6189a.xn--0ib8893fegvj; [B2, B3, P1, V6] # ꥓.𞤻ٻꡘ +򊉆󠆒‌꥓。𞤻ٻꡘ; 򊉆‌꥓.𞤻ٻꡘ; [B2, B3, C1, P1, V6]; xn--0ug8815chtz0e.xn--0ib8893fegvj; ; xn--3j9al6189a.xn--0ib8893fegvj; [B2, B3, P1, V6] # ꥓.𞤻ٻꡘ +xn--3j9al6189a.xn--0ib8893fegvj; 򊉆꥓.𞤻ٻꡘ; [B2, B3, V6]; xn--3j9al6189a.xn--0ib8893fegvj; ; ; # ꥓.𞤻ٻꡘ +xn--0ug8815chtz0e.xn--0ib8893fegvj; 򊉆‌꥓.𞤻ٻꡘ; [B2, B3, C1, V6]; xn--0ug8815chtz0e.xn--0ib8893fegvj; ; ; # ꥓.𞤻ٻꡘ +‌.≯; ; [C1, P1, V6]; xn--0ug.xn--hdh; ; .xn--hdh; [P1, V6, A4_2] # .≯ +‌.≯; ‌.≯; [C1, P1, V6]; xn--0ug.xn--hdh; ; .xn--hdh; [P1, V6, A4_2] # .≯ +.xn--hdh; .≯; [V6, X4_2]; .xn--hdh; [V6, A4_2]; ; # .≯ +xn--0ug.xn--hdh; ‌.≯; [C1, V6]; xn--0ug.xn--hdh; ; ; # .≯ +𰅧񣩠-.꯭-悜; 𰅧񣩠-.꯭-悜; [P1, V3, V5, V6]; xn----7m53aj640l.xn----8f4br83t; ; ; # 𰅧-.꯭-悜 +𰅧񣩠-.꯭-悜; ; [P1, V3, V5, V6]; xn----7m53aj640l.xn----8f4br83t; ; ; # 𰅧-.꯭-悜 +xn----7m53aj640l.xn----8f4br83t; 𰅧񣩠-.꯭-悜; [V3, V5, V6]; xn----7m53aj640l.xn----8f4br83t; ; ; # 𰅧-.꯭-悜 +ᡉ𶓧⬞ᢜ.-‍𞣑‮; ; [C2, P1, V3, V6]; xn--87e0ol04cdl39e.xn----ugn5e3763s; ; xn--87e0ol04cdl39e.xn----qinu247r; [P1, V3, V6] # ᡉ⬞ᢜ.-𞣑 +xn--87e0ol04cdl39e.xn----qinu247r; ᡉ𶓧⬞ᢜ.-𞣑‮; [V3, V6]; xn--87e0ol04cdl39e.xn----qinu247r; ; ; # ᡉ⬞ᢜ.-𞣑 +xn--87e0ol04cdl39e.xn----ugn5e3763s; ᡉ𶓧⬞ᢜ.-‍𞣑‮; [C2, V3, V6]; xn--87e0ol04cdl39e.xn----ugn5e3763s; ; ; # ᡉ⬞ᢜ.-𞣑 +⒐‌衃Ⴝ.ڂႴ; ; [B1, B2, B3, C1, P1, V6]; xn--1nd159ecmd785k.xn--7ib433c; ; xn--1nd362hy16e.xn--7ib433c; [B1, B2, B3, P1, V6] # ⒐衃Ⴝ.ڂႴ +9.‌衃Ⴝ.ڂႴ; ; [B1, B2, B3, C1, P1, V6]; 9.xn--1nd159e1y2f.xn--7ib433c; ; 9.xn--1nd9032d.xn--7ib433c; [B1, B2, B3, P1, V6] # 9.衃Ⴝ.ڂႴ +9.‌衃ⴝ.ڂⴔ; ; [B1, B2, B3, C1]; 9.xn--0ug862cbm5e.xn--7ib268q; ; 9.xn--llj1920a.xn--7ib268q; [B1, B2, B3] # 9.衃ⴝ.ڂⴔ +9.‌衃Ⴝ.ڂⴔ; ; [B1, B2, B3, C1, P1, V6]; 9.xn--1nd159e1y2f.xn--7ib268q; ; 9.xn--1nd9032d.xn--7ib268q; [B1, B2, B3, P1, V6] # 9.衃Ⴝ.ڂⴔ +9.xn--1nd9032d.xn--7ib268q; 9.衃Ⴝ.ڂⴔ; [B1, B2, B3, V6]; 9.xn--1nd9032d.xn--7ib268q; ; ; # 9.衃Ⴝ.ڂⴔ +9.xn--1nd159e1y2f.xn--7ib268q; 9.‌衃Ⴝ.ڂⴔ; [B1, B2, B3, C1, V6]; 9.xn--1nd159e1y2f.xn--7ib268q; ; ; # 9.衃Ⴝ.ڂⴔ +9.xn--llj1920a.xn--7ib268q; 9.衃ⴝ.ڂⴔ; [B1, B2, B3]; 9.xn--llj1920a.xn--7ib268q; ; ; # 9.衃ⴝ.ڂⴔ +9.xn--0ug862cbm5e.xn--7ib268q; 9.‌衃ⴝ.ڂⴔ; [B1, B2, B3, C1]; 9.xn--0ug862cbm5e.xn--7ib268q; ; ; # 9.衃ⴝ.ڂⴔ +9.xn--1nd9032d.xn--7ib433c; 9.衃Ⴝ.ڂႴ; [B1, B2, B3, V6]; 9.xn--1nd9032d.xn--7ib433c; ; ; # 9.衃Ⴝ.ڂႴ +9.xn--1nd159e1y2f.xn--7ib433c; 9.‌衃Ⴝ.ڂႴ; [B1, B2, B3, C1, V6]; 9.xn--1nd159e1y2f.xn--7ib433c; ; ; # 9.衃Ⴝ.ڂႴ +⒐‌衃ⴝ.ڂⴔ; ; [B1, B2, B3, C1, P1, V6]; xn--0ugx0px1izu2h.xn--7ib268q; ; xn--1shy52abz3f.xn--7ib268q; [B1, B2, B3, P1, V6] # ⒐衃ⴝ.ڂⴔ +⒐‌衃Ⴝ.ڂⴔ; ; [B1, B2, B3, C1, P1, V6]; xn--1nd159ecmd785k.xn--7ib268q; ; xn--1nd362hy16e.xn--7ib268q; [B1, B2, B3, P1, V6] # ⒐衃Ⴝ.ڂⴔ +xn--1nd362hy16e.xn--7ib268q; ⒐衃Ⴝ.ڂⴔ; [B1, B2, B3, V6]; xn--1nd362hy16e.xn--7ib268q; ; ; # ⒐衃Ⴝ.ڂⴔ +xn--1nd159ecmd785k.xn--7ib268q; ⒐‌衃Ⴝ.ڂⴔ; [B1, B2, B3, C1, V6]; xn--1nd159ecmd785k.xn--7ib268q; ; ; # ⒐衃Ⴝ.ڂⴔ +xn--1shy52abz3f.xn--7ib268q; ⒐衃ⴝ.ڂⴔ; [B1, B2, B3, V6]; xn--1shy52abz3f.xn--7ib268q; ; ; # ⒐衃ⴝ.ڂⴔ +xn--0ugx0px1izu2h.xn--7ib268q; ⒐‌衃ⴝ.ڂⴔ; [B1, B2, B3, C1, V6]; xn--0ugx0px1izu2h.xn--7ib268q; ; ; # ⒐衃ⴝ.ڂⴔ +xn--1nd362hy16e.xn--7ib433c; ⒐衃Ⴝ.ڂႴ; [B1, B2, B3, V6]; xn--1nd362hy16e.xn--7ib433c; ; ; # ⒐衃Ⴝ.ڂႴ +xn--1nd159ecmd785k.xn--7ib433c; ⒐‌衃Ⴝ.ڂႴ; [B1, B2, B3, C1, V6]; xn--1nd159ecmd785k.xn--7ib433c; ; ; # ⒐衃Ⴝ.ڂႴ +ߡ‌。--⸬; ߡ‌.--⸬; [B1, B3, C1, V3]; xn--8sb884j.xn-----iw2a; ; xn--8sb.xn-----iw2a; [B1, V3] # ߡ.--⸬ +xn--8sb.xn-----iw2a; ߡ.--⸬; [B1, V3]; xn--8sb.xn-----iw2a; ; ; # ߡ.--⸬ +xn--8sb884j.xn-----iw2a; ߡ‌.--⸬; [B1, B3, C1, V3]; xn--8sb884j.xn-----iw2a; ; ; # ߡ.--⸬ +𞥓.ܘ; 𞥓.ܘ; ; xn--of6h.xn--inb; ; ; # 𞥓.ܘ +𞥓.ܘ; ; ; xn--of6h.xn--inb; ; ; # 𞥓.ܘ +xn--of6h.xn--inb; 𞥓.ܘ; ; xn--of6h.xn--inb; ; ; # 𞥓.ܘ +󠄽-.-්; -.-්; [V3]; -.xn----ptf; ; ; # -.-් +󠄽-.-්; -.-්; [V3]; -.xn----ptf; ; ; # -.-් +-.xn----ptf; -.-්; [V3]; -.xn----ptf; ; ; # -.-් +󠇝ݛ-.ᤧ; ݛ-.ᤧ; [B1, B3, B6, V3, V5]; xn----k4c.xn--lff; ; ; # ݛ-.ᤧ +xn----k4c.xn--lff; ݛ-.ᤧ; [B1, B3, B6, V3, V5]; xn----k4c.xn--lff; ; ; # ݛ-.ᤧ +𞤴󠆹⦉𐹺.꠆⒌󘤸; 𞤴⦉𐹺.꠆⒌󘤸; [B1, P1, V5, V6]; xn--fuix729epewf.xn--xsh5029b6e77i; ; ; # 𞤴⦉𐹺.꠆⒌ +𞤴󠆹⦉𐹺.꠆5.󘤸; 𞤴⦉𐹺.꠆5.󘤸; [B1, P1, V5, V6]; xn--fuix729epewf.xn--5-w93e.xn--7b83e; ; ; # 𞤴⦉𐹺.꠆5. +𞤒󠆹⦉𐹺.꠆5.󘤸; 𞤴⦉𐹺.꠆5.󘤸; [B1, P1, V5, V6]; xn--fuix729epewf.xn--5-w93e.xn--7b83e; ; ; # 𞤴⦉𐹺.꠆5. +xn--fuix729epewf.xn--5-w93e.xn--7b83e; 𞤴⦉𐹺.꠆5.󘤸; [B1, V5, V6]; xn--fuix729epewf.xn--5-w93e.xn--7b83e; ; ; # 𞤴⦉𐹺.꠆5. +𞤒󠆹⦉𐹺.꠆⒌󘤸; 𞤴⦉𐹺.꠆⒌󘤸; [B1, P1, V5, V6]; xn--fuix729epewf.xn--xsh5029b6e77i; ; ; # 𞤴⦉𐹺.꠆⒌ +xn--fuix729epewf.xn--xsh5029b6e77i; 𞤴⦉𐹺.꠆⒌󘤸; [B1, V5, V6]; xn--fuix729epewf.xn--xsh5029b6e77i; ; ; # 𞤴⦉𐹺.꠆⒌ +󠄸₀。𑖿‌𐦂‍; 0.𑖿‌𐦂‍; [B1, C2, V5]; 0.xn--0ugc8040p9hk; ; 0.xn--mn9cz2s; [B1, V5] # 0.𑖿𐦂 +󠄸0。𑖿‌𐦂‍; 0.𑖿‌𐦂‍; [B1, C2, V5]; 0.xn--0ugc8040p9hk; ; 0.xn--mn9cz2s; [B1, V5] # 0.𑖿𐦂 +0.xn--mn9cz2s; 0.𑖿𐦂; [B1, V5]; 0.xn--mn9cz2s; ; ; # 0.𑖿𐦂 +0.xn--0ugc8040p9hk; 0.𑖿‌𐦂‍; [B1, C2, V5]; 0.xn--0ugc8040p9hk; ; ; # 0.𑖿𐦂 +Ⴚ𐋸󠄄。𝟝ퟶ်; Ⴚ𐋸.5ퟶ်; [P1, V6]; xn--ynd2415j.xn--5-dug9054m; ; ; # Ⴚ𐋸.5ퟶ် +Ⴚ𐋸󠄄。5ퟶ်; Ⴚ𐋸.5ퟶ်; [P1, V6]; xn--ynd2415j.xn--5-dug9054m; ; ; # Ⴚ𐋸.5ퟶ် +ⴚ𐋸󠄄。5ퟶ်; ⴚ𐋸.5ퟶ်; ; xn--ilj2659d.xn--5-dug9054m; ; ; # ⴚ𐋸.5ퟶ် +xn--ilj2659d.xn--5-dug9054m; ⴚ𐋸.5ퟶ်; ; xn--ilj2659d.xn--5-dug9054m; ; ; # ⴚ𐋸.5ퟶ် +ⴚ𐋸.5ퟶ်; ; ; xn--ilj2659d.xn--5-dug9054m; ; ; # ⴚ𐋸.5ퟶ် +Ⴚ𐋸.5ퟶ်; ; [P1, V6]; xn--ynd2415j.xn--5-dug9054m; ; ; # Ⴚ𐋸.5ퟶ် +xn--ynd2415j.xn--5-dug9054m; Ⴚ𐋸.5ퟶ်; [V6]; xn--ynd2415j.xn--5-dug9054m; ; ; # Ⴚ𐋸.5ퟶ် +ⴚ𐋸󠄄。𝟝ퟶ်; ⴚ𐋸.5ퟶ်; ; xn--ilj2659d.xn--5-dug9054m; ; ; # ⴚ𐋸.5ퟶ် +‍-ᠹ﹪.ᷡᤢ; ; [C2, P1, V5, V6]; xn----c6j614b1z4v.xn--gff52t; ; xn----c6jx047j.xn--gff52t; [P1, V3, V5, V6] # -ᠹ﹪.ᷡᤢ +‍-ᠹ%.ᷡᤢ; ; [C2, P1, V5, V6]; xn---%-u4oy48b.xn--gff52t; ; xn---%-u4o.xn--gff52t; [P1, V3, V5, V6] # -ᠹ%.ᷡᤢ +xn---%-u4o.xn--gff52t; -ᠹ%.ᷡᤢ; [P1, V3, V5, V6]; xn---%-u4o.xn--gff52t; ; ; # -ᠹ%.ᷡᤢ +xn---%-u4oy48b.xn--gff52t; ‍-ᠹ%.ᷡᤢ; [C2, P1, V5, V6]; xn---%-u4oy48b.xn--gff52t; ; ; # -ᠹ%.ᷡᤢ +xn----c6jx047j.xn--gff52t; -ᠹ﹪.ᷡᤢ; [V3, V5, V6]; xn----c6jx047j.xn--gff52t; ; ; # -ᠹ﹪.ᷡᤢ +xn----c6j614b1z4v.xn--gff52t; ‍-ᠹ﹪.ᷡᤢ; [C2, V5, V6]; xn----c6j614b1z4v.xn--gff52t; ; ; # -ᠹ﹪.ᷡᤢ +≠.ᠿ; ; [P1, V6]; xn--1ch.xn--y7e; ; ; # ≠.ᠿ +≠.ᠿ; ≠.ᠿ; [P1, V6]; xn--1ch.xn--y7e; ; ; # ≠.ᠿ +xn--1ch.xn--y7e; ≠.ᠿ; [V6]; xn--1ch.xn--y7e; ; ; # ≠.ᠿ +ܣ֣。㌪; ܣ֣.ハイツ; ; xn--ucb18e.xn--eck4c5a; ; ; # ܣ֣.ハイツ +ܣ֣。ハイツ; ܣ֣.ハイツ; ; xn--ucb18e.xn--eck4c5a; ; ; # ܣ֣.ハイツ +xn--ucb18e.xn--eck4c5a; ܣ֣.ハイツ; ; xn--ucb18e.xn--eck4c5a; ; ; # ܣ֣.ハイツ +ܣ֣.ハイツ; ; ; xn--ucb18e.xn--eck4c5a; ; ; # ܣ֣.ハイツ +𞷥󠆀≮.⵿-; 𞷥≮.⵿-; [B1, B3, P1, V3, V5, V6]; xn--gdhx802p.xn----i2s; ; ; # ≮.⵿- +𞷥󠆀≮.⵿-; 𞷥≮.⵿-; [B1, B3, P1, V3, V5, V6]; xn--gdhx802p.xn----i2s; ; ; # ≮.⵿- +xn--gdhx802p.xn----i2s; 𞷥≮.⵿-; [B1, B3, V3, V5, V6]; xn--gdhx802p.xn----i2s; ; ; # ≮.⵿- +₆榎򦖎്。𞤅ۭﱚ󠮨; 6榎򦖎്.𞤧ۭيي󠮨; [B1, B3, P1, V6]; xn--6-kmf4691ejv41j.xn--mhba10ch545mn8v8h; ; ; # 6榎്.𞤧ۭيي +6榎򦖎്。𞤅ۭيي󠮨; 6榎򦖎്.𞤧ۭيي󠮨; [B1, B3, P1, V6]; xn--6-kmf4691ejv41j.xn--mhba10ch545mn8v8h; ; ; # 6榎്.𞤧ۭيي +6榎򦖎്。𞤧ۭيي󠮨; 6榎򦖎്.𞤧ۭيي󠮨; [B1, B3, P1, V6]; xn--6-kmf4691ejv41j.xn--mhba10ch545mn8v8h; ; ; # 6榎്.𞤧ۭيي +xn--6-kmf4691ejv41j.xn--mhba10ch545mn8v8h; 6榎򦖎്.𞤧ۭيي󠮨; [B1, B3, V6]; xn--6-kmf4691ejv41j.xn--mhba10ch545mn8v8h; ; ; # 6榎്.𞤧ۭيي +₆榎򦖎്。𞤧ۭﱚ󠮨; 6榎򦖎്.𞤧ۭيي󠮨; [B1, B3, P1, V6]; xn--6-kmf4691ejv41j.xn--mhba10ch545mn8v8h; ; ; # 6榎്.𞤧ۭيي +𣩫.򌑲; 𣩫.򌑲; [P1, V6]; xn--td3j.xn--4628b; ; ; # 𣩫. +𣩫.򌑲; ; [P1, V6]; xn--td3j.xn--4628b; ; ; # 𣩫. +xn--td3j.xn--4628b; 𣩫.򌑲; [V6]; xn--td3j.xn--4628b; ; ; # 𣩫. +‍︒。ڹ‌; ‍︒.ڹ‌; [B1, B3, C1, C2, P1, V6]; xn--1ug2658f.xn--skb080k; ; xn--y86c.xn--skb; [B1, P1, V6] # ︒.ڹ +xn--y86c.xn--skb; ︒.ڹ; [B1, V6]; xn--y86c.xn--skb; ; ; # ︒.ڹ +xn--1ug2658f.xn--skb080k; ‍︒.ڹ‌; [B1, B3, C1, C2, V6]; xn--1ug2658f.xn--skb080k; ; ; # ︒.ڹ +xn--skb; ڹ; ; xn--skb; ; ; # ڹ +ڹ; ; ; xn--skb; ; ; # ڹ +𐹦‌𐹶。; 𐹦‌𐹶.; [B1, C1, P1, V6]; xn--0ug4994goba.xn--sxg; ; xn--eo0d6a.xn--sxg; [B1, P1, V6] # 𐹦𐹶. +xn--eo0d6a.xn--sxg; 𐹦𐹶.; [B1, V6]; xn--eo0d6a.xn--sxg; ; ; # 𐹦𐹶. +xn--0ug4994goba.xn--sxg; 𐹦‌𐹶.; [B1, C1, V6]; xn--0ug4994goba.xn--sxg; ; ; # 𐹦𐹶. +్𝨾֩𝟭。-𑜨; ్𝨾֩1.-𑜨; [V3, V5]; xn--1-rfc312cdp45c.xn----nq0j; ; ; # ్𝨾֩1.-𑜨 +్𝨾֩1。-𑜨; ్𝨾֩1.-𑜨; [V3, V5]; xn--1-rfc312cdp45c.xn----nq0j; ; ; # ్𝨾֩1.-𑜨 +xn--1-rfc312cdp45c.xn----nq0j; ్𝨾֩1.-𑜨; [V3, V5]; xn--1-rfc312cdp45c.xn----nq0j; ; ; # ్𝨾֩1.-𑜨 +򣿈。뙏; 򣿈.뙏; [P1, V6]; xn--ph26c.xn--281b; ; ; # .뙏 +򣿈。뙏; 򣿈.뙏; [P1, V6]; xn--ph26c.xn--281b; ; ; # .뙏 +xn--ph26c.xn--281b; 򣿈.뙏; [V6]; xn--ph26c.xn--281b; ; ; # .뙏 +񕨚󠄌󑽀ᡀ.ࢶ; 񕨚󑽀ᡀ.ࢶ; [P1, V6]; xn--z7e98100evc01b.xn--czb; ; ; # ᡀ.ࢶ +xn--z7e98100evc01b.xn--czb; 񕨚󑽀ᡀ.ࢶ; [V6]; xn--z7e98100evc01b.xn--czb; ; ; # ᡀ.ࢶ +‍。񅁛; ‍.񅁛; [C2, P1, V6]; xn--1ug.xn--6x4u; ; .xn--6x4u; [P1, V6, A4_2] # . +‍。񅁛; ‍.񅁛; [C2, P1, V6]; xn--1ug.xn--6x4u; ; .xn--6x4u; [P1, V6, A4_2] # . +.xn--6x4u; .񅁛; [V6, X4_2]; .xn--6x4u; [V6, A4_2]; ; # . +xn--1ug.xn--6x4u; ‍.񅁛; [C2, V6]; xn--1ug.xn--6x4u; ; ; # . +ࡋ皥.-; ࡋ皥.-; [B1, B2, B3, V3]; xn--9vb4167c.-; ; ; # ࡋ皥.- +ࡋ皥.-; ; [B1, B2, B3, V3]; xn--9vb4167c.-; ; ; # ࡋ皥.- +xn--9vb4167c.-; ࡋ皥.-; [B1, B2, B3, V3]; xn--9vb4167c.-; ; ; # ࡋ皥.- +𐣸̕𐮇.⒈ꡦ; 𐣸̕𐮇.⒈ꡦ; [B1, P1, V6]; xn--5sa9915kgvb.xn--tshw539b; ; ; # ̕𐮇.⒈ꡦ +𐣸̕𐮇.1.ꡦ; ; [B1, P1, V6]; xn--5sa9915kgvb.1.xn--cd9a; ; ; # ̕𐮇.1.ꡦ +xn--5sa9915kgvb.1.xn--cd9a; 𐣸̕𐮇.1.ꡦ; [B1, V6]; xn--5sa9915kgvb.1.xn--cd9a; ; ; # ̕𐮇.1.ꡦ +xn--5sa9915kgvb.xn--tshw539b; 𐣸̕𐮇.⒈ꡦ; [B1, V6]; xn--5sa9915kgvb.xn--tshw539b; ; ; # ̕𐮇.⒈ꡦ +Ⴛ‌֢‍。ᅠā𐹦; Ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, P1, V6]; xn--tcb597cdmmfa.xn--yda9741khjj; ; xn--tcb597c.xn--yda9741khjj; [B5, B6, P1, V6] # Ⴛ֢.ā𐹦 +Ⴛ‌֢‍。ᅠā𐹦; Ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, P1, V6]; xn--tcb597cdmmfa.xn--yda9741khjj; ; xn--tcb597c.xn--yda9741khjj; [B5, B6, P1, V6] # Ⴛ֢.ā𐹦 +Ⴛ‌֢‍。ᅠā𐹦; Ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, P1, V6]; xn--tcb597cdmmfa.xn--yda594fdn5q; ; xn--tcb597c.xn--yda594fdn5q; [B5, B6, P1, V6] # Ⴛ֢.ā𐹦 +Ⴛ‌֢‍。ᅠā𐹦; Ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, P1, V6]; xn--tcb597cdmmfa.xn--yda594fdn5q; ; xn--tcb597c.xn--yda594fdn5q; [B5, B6, P1, V6] # Ⴛ֢.ā𐹦 +ⴛ‌֢‍。ᅠā𐹦; ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, P1, V6]; xn--tcb736kea974k.xn--yda594fdn5q; ; xn--tcb323r.xn--yda594fdn5q; [B5, B6, P1, V6] # ⴛ֢.ā𐹦 +ⴛ‌֢‍。ᅠā𐹦; ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, P1, V6]; xn--tcb736kea974k.xn--yda594fdn5q; ; xn--tcb323r.xn--yda594fdn5q; [B5, B6, P1, V6] # ⴛ֢.ā𐹦 +Ⴛ‌֢‍。ᅠĀ𐹦; Ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, P1, V6]; xn--tcb597cdmmfa.xn--yda594fdn5q; ; xn--tcb597c.xn--yda594fdn5q; [B5, B6, P1, V6] # Ⴛ֢.ā𐹦 +Ⴛ‌֢‍。ᅠĀ𐹦; Ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, P1, V6]; xn--tcb597cdmmfa.xn--yda594fdn5q; ; xn--tcb597c.xn--yda594fdn5q; [B5, B6, P1, V6] # Ⴛ֢.ā𐹦 +xn--tcb597c.xn--yda594fdn5q; Ⴛ֢.ᅠā𐹦; [B5, B6, V6]; xn--tcb597c.xn--yda594fdn5q; ; ; # Ⴛ֢.ā𐹦 +xn--tcb597cdmmfa.xn--yda594fdn5q; Ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, V6]; xn--tcb597cdmmfa.xn--yda594fdn5q; ; ; # Ⴛ֢.ā𐹦 +xn--tcb323r.xn--yda594fdn5q; ⴛ֢.ᅠā𐹦; [B5, B6, V6]; xn--tcb323r.xn--yda594fdn5q; ; ; # ⴛ֢.ā𐹦 +xn--tcb736kea974k.xn--yda594fdn5q; ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, V6]; xn--tcb736kea974k.xn--yda594fdn5q; ; ; # ⴛ֢.ā𐹦 +ⴛ‌֢‍。ᅠā𐹦; ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, P1, V6]; xn--tcb736kea974k.xn--yda9741khjj; ; xn--tcb323r.xn--yda9741khjj; [B5, B6, P1, V6] # ⴛ֢.ā𐹦 +ⴛ‌֢‍。ᅠā𐹦; ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, P1, V6]; xn--tcb736kea974k.xn--yda9741khjj; ; xn--tcb323r.xn--yda9741khjj; [B5, B6, P1, V6] # ⴛ֢.ā𐹦 +Ⴛ‌֢‍。ᅠĀ𐹦; Ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, P1, V6]; xn--tcb597cdmmfa.xn--yda9741khjj; ; xn--tcb597c.xn--yda9741khjj; [B5, B6, P1, V6] # Ⴛ֢.ā𐹦 +Ⴛ‌֢‍。ᅠĀ𐹦; Ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, P1, V6]; xn--tcb597cdmmfa.xn--yda9741khjj; ; xn--tcb597c.xn--yda9741khjj; [B5, B6, P1, V6] # Ⴛ֢.ā𐹦 +xn--tcb597c.xn--yda9741khjj; Ⴛ֢.ᅠā𐹦; [B5, B6, V6]; xn--tcb597c.xn--yda9741khjj; ; ; # Ⴛ֢.ā𐹦 +xn--tcb597cdmmfa.xn--yda9741khjj; Ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, V6]; xn--tcb597cdmmfa.xn--yda9741khjj; ; ; # Ⴛ֢.ā𐹦 +xn--tcb323r.xn--yda9741khjj; ⴛ֢.ᅠā𐹦; [B5, B6, V6]; xn--tcb323r.xn--yda9741khjj; ; ; # ⴛ֢.ā𐹦 +xn--tcb736kea974k.xn--yda9741khjj; ⴛ‌֢‍.ᅠā𐹦; [B5, B6, C1, C2, V6]; xn--tcb736kea974k.xn--yda9741khjj; ; ; # ⴛ֢.ā𐹦 +‌。曳⾑𐋰≯; ‌.曳襾𐋰≯; [C1, P1, V6]; xn--0ug2139f.xn--hdh501y8wvfs5h; ; xn--vn7c.xn--hdh501y8wvfs5h; [P1, V6] # .曳襾𐋰≯ +‌。曳⾑𐋰≯; ‌.曳襾𐋰≯; [C1, P1, V6]; xn--0ug2139f.xn--hdh501y8wvfs5h; ; xn--vn7c.xn--hdh501y8wvfs5h; [P1, V6] # .曳襾𐋰≯ +‌。曳襾𐋰≯; ‌.曳襾𐋰≯; [C1, P1, V6]; xn--0ug2139f.xn--hdh501y8wvfs5h; ; xn--vn7c.xn--hdh501y8wvfs5h; [P1, V6] # .曳襾𐋰≯ +‌。曳襾𐋰≯; ‌.曳襾𐋰≯; [C1, P1, V6]; xn--0ug2139f.xn--hdh501y8wvfs5h; ; xn--vn7c.xn--hdh501y8wvfs5h; [P1, V6] # .曳襾𐋰≯ +xn--vn7c.xn--hdh501y8wvfs5h; .曳襾𐋰≯; [V6]; xn--vn7c.xn--hdh501y8wvfs5h; ; ; # .曳襾𐋰≯ +xn--0ug2139f.xn--hdh501y8wvfs5h; ‌.曳襾𐋰≯; [C1, V6]; xn--0ug2139f.xn--hdh501y8wvfs5h; ; ; # .曳襾𐋰≯ +≯⒈。ß; ≯⒈.ß; [P1, V6]; xn--hdh84f.xn--zca; ; xn--hdh84f.ss; # ≯⒈.ß +≯⒈。ß; ≯⒈.ß; [P1, V6]; xn--hdh84f.xn--zca; ; xn--hdh84f.ss; # ≯⒈.ß +≯1.。ß; ≯1..ß; [P1, V6, X4_2]; xn--1-ogo..xn--zca; [P1, V6, A4_2]; xn--1-ogo..ss; # ≯1..ß +≯1.。ß; ≯1..ß; [P1, V6, X4_2]; xn--1-ogo..xn--zca; [P1, V6, A4_2]; xn--1-ogo..ss; # ≯1..ß +≯1.。SS; ≯1..ss; [P1, V6, X4_2]; xn--1-ogo..ss; [P1, V6, A4_2]; ; # ≯1..ss +≯1.。SS; ≯1..ss; [P1, V6, X4_2]; xn--1-ogo..ss; [P1, V6, A4_2]; ; # ≯1..ss +≯1.。ss; ≯1..ss; [P1, V6, X4_2]; xn--1-ogo..ss; [P1, V6, A4_2]; ; # ≯1..ss +≯1.。ss; ≯1..ss; [P1, V6, X4_2]; xn--1-ogo..ss; [P1, V6, A4_2]; ; # ≯1..ss +≯1.。Ss; ≯1..ss; [P1, V6, X4_2]; xn--1-ogo..ss; [P1, V6, A4_2]; ; # ≯1..ss +≯1.。Ss; ≯1..ss; [P1, V6, X4_2]; xn--1-ogo..ss; [P1, V6, A4_2]; ; # ≯1..ss +xn--1-ogo..ss; ≯1..ss; [V6, X4_2]; xn--1-ogo..ss; [V6, A4_2]; ; # ≯1..ss +xn--1-ogo..xn--zca; ≯1..ß; [V6, X4_2]; xn--1-ogo..xn--zca; [V6, A4_2]; ; # ≯1..ß +≯⒈。SS; ≯⒈.ss; [P1, V6]; xn--hdh84f.ss; ; ; # ≯⒈.ss +≯⒈。SS; ≯⒈.ss; [P1, V6]; xn--hdh84f.ss; ; ; # ≯⒈.ss +≯⒈。ss; ≯⒈.ss; [P1, V6]; xn--hdh84f.ss; ; ; # ≯⒈.ss +≯⒈。ss; ≯⒈.ss; [P1, V6]; xn--hdh84f.ss; ; ; # ≯⒈.ss +≯⒈。Ss; ≯⒈.ss; [P1, V6]; xn--hdh84f.ss; ; ; # ≯⒈.ss +≯⒈。Ss; ≯⒈.ss; [P1, V6]; xn--hdh84f.ss; ; ; # ≯⒈.ss +xn--hdh84f.ss; ≯⒈.ss; [V6]; xn--hdh84f.ss; ; ; # ≯⒈.ss +xn--hdh84f.xn--zca; ≯⒈.ß; [V6]; xn--hdh84f.xn--zca; ; ; # ≯⒈.ß +٧‍ﮖ。ߚ-₆Ⴙ; ٧‍ڳ.ߚ-6Ⴙ; [B1, B2, B3, C2, P1, V6]; xn--gib6m343e.xn---6-lve002g; ; xn--gib6m.xn---6-lve002g; [B1, B2, B3, P1, V6] # ٧ڳ.ߚ-6Ⴙ +٧‍ڳ。ߚ-6Ⴙ; ٧‍ڳ.ߚ-6Ⴙ; [B1, B2, B3, C2, P1, V6]; xn--gib6m343e.xn---6-lve002g; ; xn--gib6m.xn---6-lve002g; [B1, B2, B3, P1, V6] # ٧ڳ.ߚ-6Ⴙ +٧‍ڳ。ߚ-6ⴙ; ٧‍ڳ.ߚ-6ⴙ; [B1, B2, B3, C2]; xn--gib6m343e.xn---6-lve6529a; ; xn--gib6m.xn---6-lve6529a; [B1, B2, B3] # ٧ڳ.ߚ-6ⴙ +xn--gib6m.xn---6-lve6529a; ٧ڳ.ߚ-6ⴙ; [B1, B2, B3]; xn--gib6m.xn---6-lve6529a; ; ; # ٧ڳ.ߚ-6ⴙ +xn--gib6m343e.xn---6-lve6529a; ٧‍ڳ.ߚ-6ⴙ; [B1, B2, B3, C2]; xn--gib6m343e.xn---6-lve6529a; ; ; # ٧ڳ.ߚ-6ⴙ +xn--gib6m.xn---6-lve002g; ٧ڳ.ߚ-6Ⴙ; [B1, B2, B3, V6]; xn--gib6m.xn---6-lve002g; ; ; # ٧ڳ.ߚ-6Ⴙ +xn--gib6m343e.xn---6-lve002g; ٧‍ڳ.ߚ-6Ⴙ; [B1, B2, B3, C2, V6]; xn--gib6m343e.xn---6-lve002g; ; ; # ٧ڳ.ߚ-6Ⴙ +٧‍ﮖ。ߚ-₆ⴙ; ٧‍ڳ.ߚ-6ⴙ; [B1, B2, B3, C2]; xn--gib6m343e.xn---6-lve6529a; ; xn--gib6m.xn---6-lve6529a; [B1, B2, B3] # ٧ڳ.ߚ-6ⴙ +‌。≠; ‌.≠; [C1, P1, V6]; xn--0ug.xn--1ch; ; .xn--1ch; [P1, V6, A4_2] # .≠ +‌。≠; ‌.≠; [C1, P1, V6]; xn--0ug.xn--1ch; ; .xn--1ch; [P1, V6, A4_2] # .≠ +‌。≠; ‌.≠; [C1, P1, V6]; xn--0ug.xn--1ch; ; .xn--1ch; [P1, V6, A4_2] # .≠ +‌。≠; ‌.≠; [C1, P1, V6]; xn--0ug.xn--1ch; ; .xn--1ch; [P1, V6, A4_2] # .≠ +.xn--1ch; .≠; [V6, X4_2]; .xn--1ch; [V6, A4_2]; ; # .≠ +xn--0ug.xn--1ch; ‌.≠; [C1, V6]; xn--0ug.xn--1ch; ; ; # .≠ +𑖿𝨔.ᡟ𑖿ᭂ‌; ; [C1, V5]; xn--461dw464a.xn--v8e29ldzfo952a; ; xn--461dw464a.xn--v8e29loy65a; [V5] # 𑖿𝨔.ᡟ𑖿ᭂ +xn--461dw464a.xn--v8e29loy65a; 𑖿𝨔.ᡟ𑖿ᭂ; [V5]; xn--461dw464a.xn--v8e29loy65a; ; ; # 𑖿𝨔.ᡟ𑖿ᭂ +xn--461dw464a.xn--v8e29ldzfo952a; 𑖿𝨔.ᡟ𑖿ᭂ‌; [C1, V5]; xn--461dw464a.xn--v8e29ldzfo952a; ; ; # 𑖿𝨔.ᡟ𑖿ᭂ +򔣳‍򑝱.𖬴Ↄ≠-; ; [C2, P1, V3, V5, V6]; xn--1ug15151gkb5a.xn----61n81bt713h; ; xn--6j00chy9a.xn----61n81bt713h; [P1, V3, V5, V6] # .𖬴Ↄ≠- +򔣳‍򑝱.𖬴Ↄ≠-; 򔣳‍򑝱.𖬴Ↄ≠-; [C2, P1, V3, V5, V6]; xn--1ug15151gkb5a.xn----61n81bt713h; ; xn--6j00chy9a.xn----61n81bt713h; [P1, V3, V5, V6] # .𖬴Ↄ≠- +򔣳‍򑝱.𖬴ↄ≠-; 򔣳‍򑝱.𖬴ↄ≠-; [C2, P1, V3, V5, V6]; xn--1ug15151gkb5a.xn----81n51bt713h; ; xn--6j00chy9a.xn----81n51bt713h; [P1, V3, V5, V6] # .𖬴ↄ≠- +򔣳‍򑝱.𖬴ↄ≠-; ; [C2, P1, V3, V5, V6]; xn--1ug15151gkb5a.xn----81n51bt713h; ; xn--6j00chy9a.xn----81n51bt713h; [P1, V3, V5, V6] # .𖬴ↄ≠- +xn--6j00chy9a.xn----81n51bt713h; 򔣳򑝱.𖬴ↄ≠-; [V3, V5, V6]; xn--6j00chy9a.xn----81n51bt713h; ; ; # .𖬴ↄ≠- +xn--1ug15151gkb5a.xn----81n51bt713h; 򔣳‍򑝱.𖬴ↄ≠-; [C2, V3, V5, V6]; xn--1ug15151gkb5a.xn----81n51bt713h; ; ; # .𖬴ↄ≠- +xn--6j00chy9a.xn----61n81bt713h; 򔣳򑝱.𖬴Ↄ≠-; [V3, V5, V6]; xn--6j00chy9a.xn----61n81bt713h; ; ; # .𖬴Ↄ≠- +xn--1ug15151gkb5a.xn----61n81bt713h; 򔣳‍򑝱.𖬴Ↄ≠-; [C2, V3, V5, V6]; xn--1ug15151gkb5a.xn----61n81bt713h; ; ; # .𖬴Ↄ≠- +ߢς‍𝟳。蔑򛖢; ߢς‍7.蔑򛖢; [B2, C2, P1, V6]; xn--7-xmb182aez5a.xn--wy1ao4929b; ; xn--7-zmb872a.xn--wy1ao4929b; [B2, P1, V6] # ߢς7.蔑 +ߢς‍7。蔑򛖢; ߢς‍7.蔑򛖢; [B2, C2, P1, V6]; xn--7-xmb182aez5a.xn--wy1ao4929b; ; xn--7-zmb872a.xn--wy1ao4929b; [B2, P1, V6] # ߢς7.蔑 +ߢΣ‍7。蔑򛖢; ߢσ‍7.蔑򛖢; [B2, C2, P1, V6]; xn--7-zmb872aez5a.xn--wy1ao4929b; ; xn--7-zmb872a.xn--wy1ao4929b; [B2, P1, V6] # ߢσ7.蔑 +ߢσ‍7。蔑򛖢; ߢσ‍7.蔑򛖢; [B2, C2, P1, V6]; xn--7-zmb872aez5a.xn--wy1ao4929b; ; xn--7-zmb872a.xn--wy1ao4929b; [B2, P1, V6] # ߢσ7.蔑 +xn--7-zmb872a.xn--wy1ao4929b; ߢσ7.蔑򛖢; [B2, V6]; xn--7-zmb872a.xn--wy1ao4929b; ; ; # ߢσ7.蔑 +xn--7-zmb872aez5a.xn--wy1ao4929b; ߢσ‍7.蔑򛖢; [B2, C2, V6]; xn--7-zmb872aez5a.xn--wy1ao4929b; ; ; # ߢσ7.蔑 +xn--7-xmb182aez5a.xn--wy1ao4929b; ߢς‍7.蔑򛖢; [B2, C2, V6]; xn--7-xmb182aez5a.xn--wy1ao4929b; ; ; # ߢς7.蔑 +ߢΣ‍𝟳。蔑򛖢; ߢσ‍7.蔑򛖢; [B2, C2, P1, V6]; xn--7-zmb872aez5a.xn--wy1ao4929b; ; xn--7-zmb872a.xn--wy1ao4929b; [B2, P1, V6] # ߢσ7.蔑 +ߢσ‍𝟳。蔑򛖢; ߢσ‍7.蔑򛖢; [B2, C2, P1, V6]; xn--7-zmb872aez5a.xn--wy1ao4929b; ; xn--7-zmb872a.xn--wy1ao4929b; [B2, P1, V6] # ߢσ7.蔑 +𐹰.؀; ; [B1, P1, V6]; xn--oo0d.xn--ifb; ; ; # 𐹰. +xn--oo0d.xn--ifb; 𐹰.؀; [B1, V6]; xn--oo0d.xn--ifb; ; ; # 𐹰. +-ࢨ.𱠖; ; [B1, P1, V3, V6]; xn----mod.xn--5o9n; ; ; # -ࢨ. +xn----mod.xn--5o9n; -ࢨ.𱠖; [B1, V3, V6]; xn----mod.xn--5o9n; ; ; # -ࢨ. +≯𞱸󠇀。誆⒈; ≯𞱸.誆⒈; [B1, P1, V6]; xn--hdh7151p.xn--tsh1248a; ; ; # ≯𞱸.誆⒈ +≯𞱸󠇀。誆⒈; ≯𞱸.誆⒈; [B1, P1, V6]; xn--hdh7151p.xn--tsh1248a; ; ; # ≯𞱸.誆⒈ +≯𞱸󠇀。誆1.; ≯𞱸.誆1.; [B1, P1, V6]; xn--hdh7151p.xn--1-dy1d.; ; ; # ≯𞱸.誆1. +≯𞱸󠇀。誆1.; ≯𞱸.誆1.; [B1, P1, V6]; xn--hdh7151p.xn--1-dy1d.; ; ; # ≯𞱸.誆1. +xn--hdh7151p.xn--1-dy1d.; ≯𞱸.誆1.; [B1, V6]; xn--hdh7151p.xn--1-dy1d.; ; ; # ≯𞱸.誆1. +xn--hdh7151p.xn--tsh1248a; ≯𞱸.誆⒈; [B1, V6]; xn--hdh7151p.xn--tsh1248a; ; ; # ≯𞱸.誆⒈ +ؖ𞥙䐊ِ.︒م↺ڜ; ؖ𞥙䐊ِ.︒م↺ڜ; [B1, P1, V5, V6]; xn--4fb0j490qjg4x.xn--hhb8o948euo5r; ; ; # ؖ𞥙䐊ِ.︒م↺ڜ +ؖ𞥙䐊ِ.。م↺ڜ; ؖ𞥙䐊ِ..م↺ڜ; [B1, V5, X4_2]; xn--4fb0j490qjg4x..xn--hhb8o948e; [B1, V5, A4_2]; ; # ؖ𞥙䐊ِ..م↺ڜ +xn--4fb0j490qjg4x..xn--hhb8o948e; ؖ𞥙䐊ِ..م↺ڜ; [B1, V5, X4_2]; xn--4fb0j490qjg4x..xn--hhb8o948e; [B1, V5, A4_2]; ; # ؖ𞥙䐊ِ..م↺ڜ +xn--4fb0j490qjg4x.xn--hhb8o948euo5r; ؖ𞥙䐊ِ.︒م↺ڜ; [B1, V5, V6]; xn--4fb0j490qjg4x.xn--hhb8o948euo5r; ; ; # ؖ𞥙䐊ِ.︒م↺ڜ +퀬-?񶳒.‌ૅ󩸤۴; ; [C1, P1, V6]; 퀬-?񶳒.xn--hmb76q48y18505a; [C1, P1, V6, A3]; 퀬-?񶳒.xn--hmb76q74166b; [P1, V5, V6, A3] # 퀬-.ૅ۴ +퀬-?񶳒.‌ૅ󩸤۴; 퀬-?񶳒.‌ૅ󩸤۴; [C1, P1, V6]; 퀬-?񶳒.xn--hmb76q48y18505a; [C1, P1, V6, A3]; 퀬-?񶳒.xn--hmb76q74166b; [P1, V5, V6, A3] # 퀬-.ૅ۴ +퀬-?񶳒.xn--hmb76q74166b; 퀬-?񶳒.ૅ󩸤۴; [P1, V5, V6]; 퀬-?񶳒.xn--hmb76q74166b; [P1, V5, V6, A3]; ; # 퀬-.ૅ۴ +퀬-?񶳒.xn--hmb76q74166b; 퀬-?񶳒.ૅ󩸤۴; [P1, V5, V6]; 퀬-?񶳒.xn--hmb76q74166b; [P1, V5, V6, A3]; ; # 퀬-.ૅ۴ +퀬-?񶳒.XN--HMB76Q74166B; 퀬-?񶳒.ૅ󩸤۴; [P1, V5, V6]; 퀬-?񶳒.xn--hmb76q74166b; [P1, V5, V6, A3]; ; # 퀬-.ૅ۴ +퀬-?񶳒.XN--HMB76Q74166B; 퀬-?񶳒.ૅ󩸤۴; [P1, V5, V6]; 퀬-?񶳒.xn--hmb76q74166b; [P1, V5, V6, A3]; ; # 퀬-.ૅ۴ +퀬-?񶳒.Xn--Hmb76q74166b; 퀬-?񶳒.ૅ󩸤۴; [P1, V5, V6]; 퀬-?񶳒.xn--hmb76q74166b; [P1, V5, V6, A3]; ; # 퀬-.ૅ۴ +퀬-?񶳒.Xn--Hmb76q74166b; 퀬-?񶳒.ૅ󩸤۴; [P1, V5, V6]; 퀬-?񶳒.xn--hmb76q74166b; [P1, V5, V6, A3]; ; # 퀬-.ૅ۴ +퀬-?񶳒.xn--hmb76q48y18505a; 퀬-?񶳒.‌ૅ󩸤۴; [C1, P1, V6]; 퀬-?񶳒.xn--hmb76q48y18505a; [C1, P1, V6, A3]; ; # 퀬-.ૅ۴ +퀬-?񶳒.xn--hmb76q48y18505a; 퀬-?񶳒.‌ૅ󩸤۴; [C1, P1, V6]; 퀬-?񶳒.xn--hmb76q48y18505a; [C1, P1, V6, A3]; ; # 퀬-.ૅ۴ +퀬-?񶳒.XN--HMB76Q48Y18505A; 퀬-?񶳒.‌ૅ󩸤۴; [C1, P1, V6]; 퀬-?񶳒.xn--hmb76q48y18505a; [C1, P1, V6, A3]; ; # 퀬-.ૅ۴ +퀬-?񶳒.XN--HMB76Q48Y18505A; 퀬-?񶳒.‌ૅ󩸤۴; [C1, P1, V6]; 퀬-?񶳒.xn--hmb76q48y18505a; [C1, P1, V6, A3]; ; # 퀬-.ૅ۴ +퀬-?񶳒.Xn--Hmb76q48y18505a; 퀬-?񶳒.‌ૅ󩸤۴; [C1, P1, V6]; 퀬-?񶳒.xn--hmb76q48y18505a; [C1, P1, V6, A3]; ; # 퀬-.ૅ۴ +퀬-?񶳒.Xn--Hmb76q48y18505a; 퀬-?񶳒.‌ૅ󩸤۴; [C1, P1, V6]; 퀬-?񶳒.xn--hmb76q48y18505a; [C1, P1, V6, A3]; ; # 퀬-.ૅ۴ +Ⴌ.𐹾︒𑁿𞾄; ; [B1, P1, V6]; xn--knd.xn--y86c030a9ob6374b; ; ; # Ⴌ.𐹾︒𑁿 +Ⴌ.𐹾。𑁿𞾄; Ⴌ.𐹾.𑁿𞾄; [B1, P1, V5, V6]; xn--knd.xn--2o0d.xn--q30dg029a; ; ; # Ⴌ.𐹾.𑁿 +ⴌ.𐹾。𑁿𞾄; ⴌ.𐹾.𑁿𞾄; [B1, P1, V5, V6]; xn--3kj.xn--2o0d.xn--q30dg029a; ; ; # ⴌ.𐹾.𑁿 +xn--3kj.xn--2o0d.xn--q30dg029a; ⴌ.𐹾.𑁿𞾄; [B1, V5, V6]; xn--3kj.xn--2o0d.xn--q30dg029a; ; ; # ⴌ.𐹾.𑁿 +xn--knd.xn--2o0d.xn--q30dg029a; Ⴌ.𐹾.𑁿𞾄; [B1, V5, V6]; xn--knd.xn--2o0d.xn--q30dg029a; ; ; # Ⴌ.𐹾.𑁿 +ⴌ.𐹾︒𑁿𞾄; ; [B1, P1, V6]; xn--3kj.xn--y86c030a9ob6374b; ; ; # ⴌ.𐹾︒𑁿 +xn--3kj.xn--y86c030a9ob6374b; ⴌ.𐹾︒𑁿𞾄; [B1, V6]; xn--3kj.xn--y86c030a9ob6374b; ; ; # ⴌ.𐹾︒𑁿 +xn--knd.xn--y86c030a9ob6374b; Ⴌ.𐹾︒𑁿𞾄; [B1, V6]; xn--knd.xn--y86c030a9ob6374b; ; ; # Ⴌ.𐹾︒𑁿 +񧞿╏。𞩕󠁾; 񧞿╏.𞩕󠁾; [B3, B6, P1, V6]; xn--iyh90030d.xn--1m6hs0260c; ; ; # ╏. +xn--iyh90030d.xn--1m6hs0260c; 񧞿╏.𞩕󠁾; [B3, B6, V6]; xn--iyh90030d.xn--1m6hs0260c; ; ; # ╏. +‍┮󠇐.ఀ్᜴‍; ‍┮.ఀ్᜴‍; [C2, V5]; xn--1ug04r.xn--eoc8m432a40i; ; xn--kxh.xn--eoc8m432a; [V5] # ┮.ఀ్᜴ +‍┮󠇐.ఀ్᜴‍; ‍┮.ఀ్᜴‍; [C2, V5]; xn--1ug04r.xn--eoc8m432a40i; ; xn--kxh.xn--eoc8m432a; [V5] # ┮.ఀ్᜴ +xn--kxh.xn--eoc8m432a; ┮.ఀ్᜴; [V5]; xn--kxh.xn--eoc8m432a; ; ; # ┮.ఀ్᜴ +xn--1ug04r.xn--eoc8m432a40i; ‍┮.ఀ్᜴‍; [C2, V5]; xn--1ug04r.xn--eoc8m432a40i; ; ; # ┮.ఀ్᜴ +򹚪。🄂; 򹚪.🄂; [P1, V6]; xn--n433d.xn--v07h; ; ; # .🄂 +򹚪。1,; 򹚪.1,; [P1, V6]; xn--n433d.1,; ; ; # .1, +xn--n433d.1,; 򹚪.1,; [P1, V6]; xn--n433d.1,; ; ; # .1, +xn--n433d.xn--v07h; 򹚪.🄂; [V6]; xn--n433d.xn--v07h; ; ; # .🄂 +𑍨刍.🛦; ; [V5]; xn--rbry728b.xn--y88h; ; ; # 𑍨刍.🛦 +xn--rbry728b.xn--y88h; 𑍨刍.🛦; [V5]; xn--rbry728b.xn--y88h; ; ; # 𑍨刍.🛦 +󠌏3。ᯱ𝟒; 󠌏3.ᯱ4; [P1, V5, V6]; xn--3-ib31m.xn--4-pql; ; ; # 3.ᯱ4 +󠌏3。ᯱ4; 󠌏3.ᯱ4; [P1, V5, V6]; xn--3-ib31m.xn--4-pql; ; ; # 3.ᯱ4 +xn--3-ib31m.xn--4-pql; 󠌏3.ᯱ4; [V5, V6]; xn--3-ib31m.xn--4-pql; ; ; # 3.ᯱ4 +ڇ6Ⴔ辘.ﴢڇ‌; ڇ6Ⴔ辘.صيڇ‌; [B2, B3, C1, P1, V6]; xn--6-gsc039eqq6k.xn--0gb6bxkx18g; ; xn--6-gsc039eqq6k.xn--0gb6bxk; [B2, B3, P1, V6] # ڇ6Ⴔ辘.صيڇ +ڇ6Ⴔ辘.صيڇ‌; ; [B2, B3, C1, P1, V6]; xn--6-gsc039eqq6k.xn--0gb6bxkx18g; ; xn--6-gsc039eqq6k.xn--0gb6bxk; [B2, B3, P1, V6] # ڇ6Ⴔ辘.صيڇ +ڇ6ⴔ辘.صيڇ‌; ; [B2, B3, C1]; xn--6-gsc2270akm6f.xn--0gb6bxkx18g; ; xn--6-gsc2270akm6f.xn--0gb6bxk; [B2, B3] # ڇ6ⴔ辘.صيڇ +xn--6-gsc2270akm6f.xn--0gb6bxk; ڇ6ⴔ辘.صيڇ; [B2, B3]; xn--6-gsc2270akm6f.xn--0gb6bxk; ; ; # ڇ6ⴔ辘.صيڇ +xn--6-gsc2270akm6f.xn--0gb6bxkx18g; ڇ6ⴔ辘.صيڇ‌; [B2, B3, C1]; xn--6-gsc2270akm6f.xn--0gb6bxkx18g; ; ; # ڇ6ⴔ辘.صيڇ +xn--6-gsc039eqq6k.xn--0gb6bxk; ڇ6Ⴔ辘.صيڇ; [B2, B3, V6]; xn--6-gsc039eqq6k.xn--0gb6bxk; ; ; # ڇ6Ⴔ辘.صيڇ +xn--6-gsc039eqq6k.xn--0gb6bxkx18g; ڇ6Ⴔ辘.صيڇ‌; [B2, B3, C1, V6]; xn--6-gsc039eqq6k.xn--0gb6bxkx18g; ; ; # ڇ6Ⴔ辘.صيڇ +ڇ6ⴔ辘.ﴢڇ‌; ڇ6ⴔ辘.صيڇ‌; [B2, B3, C1]; xn--6-gsc2270akm6f.xn--0gb6bxkx18g; ; xn--6-gsc2270akm6f.xn--0gb6bxk; [B2, B3] # ڇ6ⴔ辘.صيڇ +󠄍.𐮭𞰬򻫞۹; .𐮭𞰬򻫞۹; [B2, P1, V6, X4_2]; .xn--mmb3954kd0uf1zx7f; [B2, P1, V6, A4_2]; ; # .𐮭۹ +.xn--mmb3954kd0uf1zx7f; .𐮭𞰬򻫞۹; [B2, V6, X4_2]; .xn--mmb3954kd0uf1zx7f; [B2, V6, A4_2]; ; # .𐮭۹ +꡽≯.򻲀򒳄; ꡽≯.򻲀򒳄; [P1, V6]; xn--hdh8193c.xn--5z40cp629b; ; ; # ≯. +꡽≯.򻲀򒳄; ꡽≯.򻲀򒳄; [P1, V6]; xn--hdh8193c.xn--5z40cp629b; ; ; # ≯. +꡽≯.򻲀򒳄; ; [P1, V6]; xn--hdh8193c.xn--5z40cp629b; ; ; # ≯. +꡽≯.򻲀򒳄; ꡽≯.򻲀򒳄; [P1, V6]; xn--hdh8193c.xn--5z40cp629b; ; ; # ≯. +xn--hdh8193c.xn--5z40cp629b; ꡽≯.򻲀򒳄; [V6]; xn--hdh8193c.xn--5z40cp629b; ; ; # ≯. +ςოٻ.ςܔ; ; [B5, B6]; xn--3xa80l26n.xn--3xa41o; ; xn--4xa60l26n.xn--4xa21o; # ςოٻ.ςܔ +ΣᲝٻ.Σܔ; σოٻ.σܔ; [B5, B6]; xn--4xa60l26n.xn--4xa21o; ; ; # σოٻ.σܔ +σოٻ.σܔ; ; [B5, B6]; xn--4xa60l26n.xn--4xa21o; ; ; # σოٻ.σܔ +Σოٻ.σܔ; σოٻ.σܔ; [B5, B6]; xn--4xa60l26n.xn--4xa21o; ; ; # σოٻ.σܔ +xn--4xa60l26n.xn--4xa21o; σოٻ.σܔ; [B5, B6]; xn--4xa60l26n.xn--4xa21o; ; ; # σოٻ.σܔ +Σოٻ.ςܔ; σოٻ.ςܔ; [B5, B6]; xn--4xa60l26n.xn--3xa41o; ; xn--4xa60l26n.xn--4xa21o; # σოٻ.ςܔ +σოٻ.ςܔ; ; [B5, B6]; xn--4xa60l26n.xn--3xa41o; ; xn--4xa60l26n.xn--4xa21o; # σოٻ.ςܔ +xn--4xa60l26n.xn--3xa41o; σოٻ.ςܔ; [B5, B6]; xn--4xa60l26n.xn--3xa41o; ; ; # σოٻ.ςܔ +xn--3xa80l26n.xn--3xa41o; ςოٻ.ςܔ; [B5, B6]; xn--3xa80l26n.xn--3xa41o; ; ; # ςოٻ.ςܔ +Σოٻ.Σܔ; σოٻ.σܔ; [B5, B6]; xn--4xa60l26n.xn--4xa21o; ; ; # σოٻ.σܔ +򄖚݈𠄯ݟ。󠛩; 򄖚݈𠄯ݟ.󠛩; [B1, B5, B6, P1, V6]; xn--vob0c4369twfv8b.xn--kl46e; ; ; # ݈𠄯ݟ. +򄖚݈𠄯ݟ。󠛩; 򄖚݈𠄯ݟ.󠛩; [B1, B5, B6, P1, V6]; xn--vob0c4369twfv8b.xn--kl46e; ; ; # ݈𠄯ݟ. +xn--vob0c4369twfv8b.xn--kl46e; 򄖚݈𠄯ݟ.󠛩; [B1, B5, B6, V6]; xn--vob0c4369twfv8b.xn--kl46e; ; ; # ݈𠄯ݟ. +󠳛.‍䤫≠Ⴞ; 󠳛.‍䤫≠Ⴞ; [C2, P1, V6]; xn--1t56e.xn--2nd159e9vb743e; ; xn--1t56e.xn--2nd141ghl2a; [P1, V6] # .䤫≠Ⴞ +󠳛.‍䤫≠Ⴞ; 󠳛.‍䤫≠Ⴞ; [C2, P1, V6]; xn--1t56e.xn--2nd159e9vb743e; ; xn--1t56e.xn--2nd141ghl2a; [P1, V6] # .䤫≠Ⴞ +󠳛.‍䤫≠Ⴞ; ; [C2, P1, V6]; xn--1t56e.xn--2nd159e9vb743e; ; xn--1t56e.xn--2nd141ghl2a; [P1, V6] # .䤫≠Ⴞ +󠳛.‍䤫≠Ⴞ; 󠳛.‍䤫≠Ⴞ; [C2, P1, V6]; xn--1t56e.xn--2nd159e9vb743e; ; xn--1t56e.xn--2nd141ghl2a; [P1, V6] # .䤫≠Ⴞ +󠳛.‍䤫≠ⴞ; 󠳛.‍䤫≠ⴞ; [C2, P1, V6]; xn--1t56e.xn--1ug73gzzpwi3a; ; xn--1t56e.xn--1ch153bqvw; [P1, V6] # .䤫≠ⴞ +󠳛.‍䤫≠ⴞ; ; [C2, P1, V6]; xn--1t56e.xn--1ug73gzzpwi3a; ; xn--1t56e.xn--1ch153bqvw; [P1, V6] # .䤫≠ⴞ +xn--1t56e.xn--1ch153bqvw; 󠳛.䤫≠ⴞ; [V6]; xn--1t56e.xn--1ch153bqvw; ; ; # .䤫≠ⴞ +xn--1t56e.xn--1ug73gzzpwi3a; 󠳛.‍䤫≠ⴞ; [C2, V6]; xn--1t56e.xn--1ug73gzzpwi3a; ; ; # .䤫≠ⴞ +xn--1t56e.xn--2nd141ghl2a; 󠳛.䤫≠Ⴞ; [V6]; xn--1t56e.xn--2nd141ghl2a; ; ; # .䤫≠Ⴞ +xn--1t56e.xn--2nd159e9vb743e; 󠳛.‍䤫≠Ⴞ; [C2, V6]; xn--1t56e.xn--2nd159e9vb743e; ; ; # .䤫≠Ⴞ +󠳛.‍䤫≠ⴞ; 󠳛.‍䤫≠ⴞ; [C2, P1, V6]; xn--1t56e.xn--1ug73gzzpwi3a; ; xn--1t56e.xn--1ch153bqvw; [P1, V6] # .䤫≠ⴞ +󠳛.‍䤫≠ⴞ; 󠳛.‍䤫≠ⴞ; [C2, P1, V6]; xn--1t56e.xn--1ug73gzzpwi3a; ; xn--1t56e.xn--1ch153bqvw; [P1, V6] # .䤫≠ⴞ +𐽘𑈵.𐹣🕥; 𐽘𑈵.𐹣🕥; [B1, B2, B3]; xn--bv0d02c.xn--bo0dq650b; ; ; # 𐽘𑈵.𐹣🕥 +𐽘𑈵.𐹣🕥; ; [B1, B2, B3]; xn--bv0d02c.xn--bo0dq650b; ; ; # 𐽘𑈵.𐹣🕥 +xn--bv0d02c.xn--bo0dq650b; 𐽘𑈵.𐹣🕥; [B1, B2, B3]; xn--bv0d02c.xn--bo0dq650b; ; ; # 𐽘𑈵.𐹣🕥 +⒊⒈𑁄。9; ⒊⒈𑁄.9; [P1, V6]; xn--tshd3512p.9; ; ; # ⒊⒈𑁄.9 +3.1.𑁄。9; 3.1.𑁄.9; [V5]; 3.1.xn--110d.9; ; ; # 3.1.𑁄.9 +3.1.xn--110d.9; 3.1.𑁄.9; [V5]; 3.1.xn--110d.9; ; ; # 3.1.𑁄.9 +xn--tshd3512p.9; ⒊⒈𑁄.9; [V6]; xn--tshd3512p.9; ; ; # ⒊⒈𑁄.9 +-‌ⷱ≮.𐹱򭏴4₉; -‌ⷱ≮.𐹱򭏴49; [B1, C1, P1, V3, V6]; xn----sgn20i14s.xn--49-ki3om2611f; ; xn----ngo823c.xn--49-ki3om2611f; [B1, P1, V3, V6] # -ⷱ≮.𐹱49 +-‌ⷱ≮.𐹱򭏴4₉; -‌ⷱ≮.𐹱򭏴49; [B1, C1, P1, V3, V6]; xn----sgn20i14s.xn--49-ki3om2611f; ; xn----ngo823c.xn--49-ki3om2611f; [B1, P1, V3, V6] # -ⷱ≮.𐹱49 +-‌ⷱ≮.𐹱򭏴49; ; [B1, C1, P1, V3, V6]; xn----sgn20i14s.xn--49-ki3om2611f; ; xn----ngo823c.xn--49-ki3om2611f; [B1, P1, V3, V6] # -ⷱ≮.𐹱49 +-‌ⷱ≮.𐹱򭏴49; -‌ⷱ≮.𐹱򭏴49; [B1, C1, P1, V3, V6]; xn----sgn20i14s.xn--49-ki3om2611f; ; xn----ngo823c.xn--49-ki3om2611f; [B1, P1, V3, V6] # -ⷱ≮.𐹱49 +xn----ngo823c.xn--49-ki3om2611f; -ⷱ≮.𐹱򭏴49; [B1, V3, V6]; xn----ngo823c.xn--49-ki3om2611f; ; ; # -ⷱ≮.𐹱49 +xn----sgn20i14s.xn--49-ki3om2611f; -‌ⷱ≮.𐹱򭏴49; [B1, C1, V3, V6]; xn----sgn20i14s.xn--49-ki3om2611f; ; ; # -ⷱ≮.𐹱49 +-≯딾。ࡇ; -≯딾.ࡇ; [B1, P1, V3, V6]; xn----pgow547d.xn--5vb; ; ; # -≯딾.ࡇ +-≯딾。ࡇ; -≯딾.ࡇ; [B1, P1, V3, V6]; xn----pgow547d.xn--5vb; ; ; # -≯딾.ࡇ +-≯딾。ࡇ; -≯딾.ࡇ; [B1, P1, V3, V6]; xn----pgow547d.xn--5vb; ; ; # -≯딾.ࡇ +-≯딾。ࡇ; -≯딾.ࡇ; [B1, P1, V3, V6]; xn----pgow547d.xn--5vb; ; ; # -≯딾.ࡇ +xn----pgow547d.xn--5vb; -≯딾.ࡇ; [B1, V3, V6]; xn----pgow547d.xn--5vb; ; ; # -≯딾.ࡇ +𑙢⒈𐹠-。󠗐‌; 𑙢⒈𐹠-.󠗐‌; [B1, C1, P1, V3, V6]; xn----dcpy090hiyg.xn--0ug23321l; ; xn----dcpy090hiyg.xn--jd46e; [B1, P1, V3, V6] # 𑙢⒈𐹠-. +𑙢1.𐹠-。󠗐‌; 𑙢1.𐹠-.󠗐‌; [B1, C1, P1, V3, V6]; xn--1-bf0j.xn----516i.xn--0ug23321l; ; xn--1-bf0j.xn----516i.xn--jd46e; [B1, P1, V3, V6] # 𑙢1.𐹠-. +xn--1-bf0j.xn----516i.xn--jd46e; 𑙢1.𐹠-.󠗐; [B1, V3, V6]; xn--1-bf0j.xn----516i.xn--jd46e; ; ; # 𑙢1.𐹠-. +xn--1-bf0j.xn----516i.xn--0ug23321l; 𑙢1.𐹠-.󠗐‌; [B1, C1, V3, V6]; xn--1-bf0j.xn----516i.xn--0ug23321l; ; ; # 𑙢1.𐹠-. +xn----dcpy090hiyg.xn--jd46e; 𑙢⒈𐹠-.󠗐; [B1, V3, V6]; xn----dcpy090hiyg.xn--jd46e; ; ; # 𑙢⒈𐹠-. +xn----dcpy090hiyg.xn--0ug23321l; 𑙢⒈𐹠-.󠗐‌; [B1, C1, V3, V6]; xn----dcpy090hiyg.xn--0ug23321l; ; ; # 𑙢⒈𐹠-. +͊.𐨎; ͊.𐨎; [V5]; xn--oua.xn--mr9c; ; ; # ͊.𐨎 +͊.𐨎; ; [V5]; xn--oua.xn--mr9c; ; ; # ͊.𐨎 +xn--oua.xn--mr9c; ͊.𐨎; [V5]; xn--oua.xn--mr9c; ; ; # ͊.𐨎 +훉≮。ิ; 훉≮.ิ; [P1, V5, V6]; xn--gdh2512e.xn--i4c; ; ; # 훉≮.ิ +훉≮。ิ; 훉≮.ิ; [P1, V5, V6]; xn--gdh2512e.xn--i4c; ; ; # 훉≮.ิ +훉≮。ิ; 훉≮.ิ; [P1, V5, V6]; xn--gdh2512e.xn--i4c; ; ; # 훉≮.ิ +훉≮。ิ; 훉≮.ิ; [P1, V5, V6]; xn--gdh2512e.xn--i4c; ; ; # 훉≮.ิ +xn--gdh2512e.xn--i4c; 훉≮.ิ; [V5, V6]; xn--gdh2512e.xn--i4c; ; ; # 훉≮.ิ +ⷷ򞣉🃘.𴈇𝟸ٙ𞤯; ⷷ򞣉🃘.𴈇2ٙ𞤯; [B1, B5, B6, P1, V5, V6]; xn--trj8045le6s9b.xn--2-upc23918acjsj; ; ; # ⷷ🃘.2ٙ𞤯 +ⷷ򞣉🃘.𴈇2ٙ𞤯; ; [B1, B5, B6, P1, V5, V6]; xn--trj8045le6s9b.xn--2-upc23918acjsj; ; ; # ⷷ🃘.2ٙ𞤯 +ⷷ򞣉🃘.𴈇2ٙ𞤍; ⷷ򞣉🃘.𴈇2ٙ𞤯; [B1, B5, B6, P1, V5, V6]; xn--trj8045le6s9b.xn--2-upc23918acjsj; ; ; # ⷷ🃘.2ٙ𞤯 +xn--trj8045le6s9b.xn--2-upc23918acjsj; ⷷ򞣉🃘.𴈇2ٙ𞤯; [B1, B5, B6, V5, V6]; xn--trj8045le6s9b.xn--2-upc23918acjsj; ; ; # ⷷ🃘.2ٙ𞤯 +ⷷ򞣉🃘.𴈇𝟸ٙ𞤍; ⷷ򞣉🃘.𴈇2ٙ𞤯; [B1, B5, B6, P1, V5, V6]; xn--trj8045le6s9b.xn--2-upc23918acjsj; ; ; # ⷷ🃘.2ٙ𞤯 +󗇩ßᢞ‌。٠𞷻ﳔ-; 󗇩ßᢞ‌.٠𞷻نخ-; [B1, B6, C1, P1, V3, V6]; xn--zca272jbif10059a.xn----dnc5e1er384z; ; xn--ss-jepz4596r.xn----dnc5e1er384z; [B1, P1, V3, V6] # ßᢞ.٠نخ- +󗇩ßᢞ‌。٠𞷻نخ-; 󗇩ßᢞ‌.٠𞷻نخ-; [B1, B6, C1, P1, V3, V6]; xn--zca272jbif10059a.xn----dnc5e1er384z; ; xn--ss-jepz4596r.xn----dnc5e1er384z; [B1, P1, V3, V6] # ßᢞ.٠نخ- +󗇩SSᢞ‌。٠𞷻نخ-; 󗇩ssᢞ‌.٠𞷻نخ-; [B1, B6, C1, P1, V3, V6]; xn--ss-jep006bqt765b.xn----dnc5e1er384z; ; xn--ss-jepz4596r.xn----dnc5e1er384z; [B1, P1, V3, V6] # ssᢞ.٠نخ- +󗇩ssᢞ‌。٠𞷻نخ-; 󗇩ssᢞ‌.٠𞷻نخ-; [B1, B6, C1, P1, V3, V6]; xn--ss-jep006bqt765b.xn----dnc5e1er384z; ; xn--ss-jepz4596r.xn----dnc5e1er384z; [B1, P1, V3, V6] # ssᢞ.٠نخ- +󗇩Ssᢞ‌。٠𞷻نخ-; 󗇩ssᢞ‌.٠𞷻نخ-; [B1, B6, C1, P1, V3, V6]; xn--ss-jep006bqt765b.xn----dnc5e1er384z; ; xn--ss-jepz4596r.xn----dnc5e1er384z; [B1, P1, V3, V6] # ssᢞ.٠نخ- +xn--ss-jepz4596r.xn----dnc5e1er384z; 󗇩ssᢞ.٠𞷻نخ-; [B1, V3, V6]; xn--ss-jepz4596r.xn----dnc5e1er384z; ; ; # ssᢞ.٠نخ- +xn--ss-jep006bqt765b.xn----dnc5e1er384z; 󗇩ssᢞ‌.٠𞷻نخ-; [B1, B6, C1, V3, V6]; xn--ss-jep006bqt765b.xn----dnc5e1er384z; ; ; # ssᢞ.٠نخ- +xn--zca272jbif10059a.xn----dnc5e1er384z; 󗇩ßᢞ‌.٠𞷻نخ-; [B1, B6, C1, V3, V6]; xn--zca272jbif10059a.xn----dnc5e1er384z; ; ; # ßᢞ.٠نخ- +󗇩SSᢞ‌。٠𞷻ﳔ-; 󗇩ssᢞ‌.٠𞷻نخ-; [B1, B6, C1, P1, V3, V6]; xn--ss-jep006bqt765b.xn----dnc5e1er384z; ; xn--ss-jepz4596r.xn----dnc5e1er384z; [B1, P1, V3, V6] # ssᢞ.٠نخ- +󗇩ssᢞ‌。٠𞷻ﳔ-; 󗇩ssᢞ‌.٠𞷻نخ-; [B1, B6, C1, P1, V3, V6]; xn--ss-jep006bqt765b.xn----dnc5e1er384z; ; xn--ss-jepz4596r.xn----dnc5e1er384z; [B1, P1, V3, V6] # ssᢞ.٠نخ- +󗇩Ssᢞ‌。٠𞷻ﳔ-; 󗇩ssᢞ‌.٠𞷻نخ-; [B1, B6, C1, P1, V3, V6]; xn--ss-jep006bqt765b.xn----dnc5e1er384z; ; xn--ss-jepz4596r.xn----dnc5e1er384z; [B1, P1, V3, V6] # ssᢞ.٠نخ- +ꡆ。Ↄྵ놮-; ꡆ.Ↄྵ놮-; [P1, V3, V6]; xn--fc9a.xn----qmg787k869k; ; ; # ꡆ.Ↄྵ놮- +ꡆ。Ↄྵ놮-; ꡆ.Ↄྵ놮-; [P1, V3, V6]; xn--fc9a.xn----qmg787k869k; ; ; # ꡆ.Ↄྵ놮- +ꡆ。ↄྵ놮-; ꡆ.ↄྵ놮-; [V3]; xn--fc9a.xn----qmg097k469k; ; ; # ꡆ.ↄྵ놮- +ꡆ。ↄྵ놮-; ꡆ.ↄྵ놮-; [V3]; xn--fc9a.xn----qmg097k469k; ; ; # ꡆ.ↄྵ놮- +xn--fc9a.xn----qmg097k469k; ꡆ.ↄྵ놮-; [V3]; xn--fc9a.xn----qmg097k469k; ; ; # ꡆ.ↄྵ놮- +xn--fc9a.xn----qmg787k869k; ꡆ.Ↄྵ놮-; [V3, V6]; xn--fc9a.xn----qmg787k869k; ; ; # ꡆ.Ↄྵ놮- +ﶭ‍.񥰌ک; لمي‍.񥰌ک; [B3, B5, B6, C2, P1, V6]; xn--ghbcp494x.xn--ckb36214f; ; xn--ghbcp.xn--ckb36214f; [B5, B6, P1, V6] # لمي.ک +لمي‍.񥰌ک; ; [B3, B5, B6, C2, P1, V6]; xn--ghbcp494x.xn--ckb36214f; ; xn--ghbcp.xn--ckb36214f; [B5, B6, P1, V6] # لمي.ک +xn--ghbcp.xn--ckb36214f; لمي.񥰌ک; [B5, B6, V6]; xn--ghbcp.xn--ckb36214f; ; ; # لمي.ک +xn--ghbcp494x.xn--ckb36214f; لمي‍.񥰌ک; [B3, B5, B6, C2, V6]; xn--ghbcp494x.xn--ckb36214f; ; ; # لمي.ک +Ⴜᰯ𐳒≯。۠ᜲྺ; Ⴜᰯ𐳒≯.۠ᜲྺ; [B1, B3, B5, B6, P1, V5, V6]; xn--0nd679cf3eq67y.xn--wlb646b4ng; ; ; # Ⴜᰯ𐳒≯.۠ᜲྺ +Ⴜᰯ𐳒≯。۠ᜲྺ; Ⴜᰯ𐳒≯.۠ᜲྺ; [B1, B3, B5, B6, P1, V5, V6]; xn--0nd679cf3eq67y.xn--wlb646b4ng; ; ; # Ⴜᰯ𐳒≯.۠ᜲྺ +ⴜᰯ𐳒≯。۠ᜲྺ; ⴜᰯ𐳒≯.۠ᜲྺ; [B1, B3, B5, B6, P1, V5, V6]; xn--r1f68xh1jgv7u.xn--wlb646b4ng; ; ; # ⴜᰯ𐳒≯.۠ᜲྺ +ⴜᰯ𐳒≯。۠ᜲྺ; ⴜᰯ𐳒≯.۠ᜲྺ; [B1, B3, B5, B6, P1, V5, V6]; xn--r1f68xh1jgv7u.xn--wlb646b4ng; ; ; # ⴜᰯ𐳒≯.۠ᜲྺ +Ⴜᰯ𐲒≯。۠ᜲྺ; Ⴜᰯ𐳒≯.۠ᜲྺ; [B1, B3, B5, B6, P1, V5, V6]; xn--0nd679cf3eq67y.xn--wlb646b4ng; ; ; # Ⴜᰯ𐳒≯.۠ᜲྺ +Ⴜᰯ𐲒≯。۠ᜲྺ; Ⴜᰯ𐳒≯.۠ᜲྺ; [B1, B3, B5, B6, P1, V5, V6]; xn--0nd679cf3eq67y.xn--wlb646b4ng; ; ; # Ⴜᰯ𐳒≯.۠ᜲྺ +xn--0nd679cf3eq67y.xn--wlb646b4ng; Ⴜᰯ𐳒≯.۠ᜲྺ; [B1, B3, B5, B6, V5, V6]; xn--0nd679cf3eq67y.xn--wlb646b4ng; ; ; # Ⴜᰯ𐳒≯.۠ᜲྺ +xn--r1f68xh1jgv7u.xn--wlb646b4ng; ⴜᰯ𐳒≯.۠ᜲྺ; [B1, B3, B5, B6, V5, V6]; xn--r1f68xh1jgv7u.xn--wlb646b4ng; ; ; # ⴜᰯ𐳒≯.۠ᜲྺ +𐋵。ﳬ; 𐋵.كم; [B1]; xn--p97c.xn--fhbe; ; ; # 𐋵.كم +𐋵。كم; 𐋵.كم; [B1]; xn--p97c.xn--fhbe; ; ; # 𐋵.كم +xn--p97c.xn--fhbe; 𐋵.كم; [B1]; xn--p97c.xn--fhbe; ; ; # 𐋵.كم +𐋵.كم; ; [B1]; xn--p97c.xn--fhbe; ; ; # 𐋵.كم +≮𝅶.񱲁ꫬ⹈󰥭; ≮𝅶.񱲁ꫬ⹈󰥭; [P1, V6]; xn--gdh0880o.xn--4tjx101bsg00ds9pyc; ; ; # ≮.ꫬ⹈ +≮𝅶.񱲁ꫬ⹈󰥭; ≮𝅶.񱲁ꫬ⹈󰥭; [P1, V6]; xn--gdh0880o.xn--4tjx101bsg00ds9pyc; ; ; # ≮.ꫬ⹈ +≮𝅶.񱲁ꫬ⹈󰥭; ; [P1, V6]; xn--gdh0880o.xn--4tjx101bsg00ds9pyc; ; ; # ≮.ꫬ⹈ +≮𝅶.񱲁ꫬ⹈󰥭; ≮𝅶.񱲁ꫬ⹈󰥭; [P1, V6]; xn--gdh0880o.xn--4tjx101bsg00ds9pyc; ; ; # ≮.ꫬ⹈ +xn--gdh0880o.xn--4tjx101bsg00ds9pyc; ≮𝅶.񱲁ꫬ⹈󰥭; [V6]; xn--gdh0880o.xn--4tjx101bsg00ds9pyc; ; ; # ≮.ꫬ⹈ +ⷰ͘ᢕ.͡𐹷󠴍; ⷰ͘ᢕ.͡𐹷󠴍; [B1, P1, V5, V6]; xn--2ua889htsp.xn--cva2687k2tv0g; ; ; # ⷰ͘ᢕ.͡𐹷 +ⷰ͘ᢕ.͡𐹷󠴍; ; [B1, P1, V5, V6]; xn--2ua889htsp.xn--cva2687k2tv0g; ; ; # ⷰ͘ᢕ.͡𐹷 +xn--2ua889htsp.xn--cva2687k2tv0g; ⷰ͘ᢕ.͡𐹷󠴍; [B1, V5, V6]; xn--2ua889htsp.xn--cva2687k2tv0g; ; ; # ⷰ͘ᢕ.͡𐹷 +ﵹᡐ‌ڭ.𑋪ׇ; غممᡐ‌ڭ.𑋪ׇ; [B1, B2, B3, B6, V5]; xn--5gbwa03bg24eptk.xn--vdb1198k; ; xn--5gbwa03bg24e.xn--vdb1198k; # غممᡐڭ.𑋪ׇ +غممᡐ‌ڭ.𑋪ׇ; ; [B1, B2, B3, B6, V5]; xn--5gbwa03bg24eptk.xn--vdb1198k; ; xn--5gbwa03bg24e.xn--vdb1198k; # غممᡐڭ.𑋪ׇ +xn--5gbwa03bg24e.xn--vdb1198k; غممᡐڭ.𑋪ׇ; [B1, B2, B3, B6, V5]; xn--5gbwa03bg24e.xn--vdb1198k; ; ; # غممᡐڭ.𑋪ׇ +xn--5gbwa03bg24eptk.xn--vdb1198k; غممᡐ‌ڭ.𑋪ׇ; [B1, B2, B3, B6, V5]; xn--5gbwa03bg24eptk.xn--vdb1198k; ; ; # غممᡐڭ.𑋪ׇ +𑑂。‍󥞀🞕򥁔; 𑑂.‍󥞀🞕򥁔; [C2, P1, V5, V6]; xn--8v1d.xn--1ug1386plvx1cd8vya; ; xn--8v1d.xn--ye9h41035a2qqs; [P1, V5, V6] # 𑑂.🞕 +𑑂。‍󥞀🞕򥁔; 𑑂.‍󥞀🞕򥁔; [C2, P1, V5, V6]; xn--8v1d.xn--1ug1386plvx1cd8vya; ; xn--8v1d.xn--ye9h41035a2qqs; [P1, V5, V6] # 𑑂.🞕 +xn--8v1d.xn--ye9h41035a2qqs; 𑑂.󥞀🞕򥁔; [V5, V6]; xn--8v1d.xn--ye9h41035a2qqs; ; ; # 𑑂.🞕 +xn--8v1d.xn--1ug1386plvx1cd8vya; 𑑂.‍󥞀🞕򥁔; [C2, V5, V6]; xn--8v1d.xn--1ug1386plvx1cd8vya; ; ; # 𑑂.🞕 +-ש。⒚; -ש.⒚; [B1, P1, V3, V6]; xn----gjc.xn--cth; ; ; # -ש.⒚ +-ש。19.; -ש.19.; [B1, V3]; xn----gjc.19.; ; ; # -ש.19. +xn----gjc.19.; -ש.19.; [B1, V3]; xn----gjc.19.; ; ; # -ש.19. +xn----gjc.xn--cth; -ש.⒚; [B1, V3, V6]; xn----gjc.xn--cth; ; ; # -ש.⒚ +􊾻ࡅ‌。ᢎ‍; 􊾻ࡅ‌.ᢎ‍; [B5, B6, C1, C2, P1, V6]; xn--3vb882jz4411a.xn--79e259a; ; xn--3vb50049s.xn--79e; [B5, B6, P1, V6] # ࡅ.ᢎ +􊾻ࡅ‌。ᢎ‍; 􊾻ࡅ‌.ᢎ‍; [B5, B6, C1, C2, P1, V6]; xn--3vb882jz4411a.xn--79e259a; ; xn--3vb50049s.xn--79e; [B5, B6, P1, V6] # ࡅ.ᢎ +xn--3vb50049s.xn--79e; 􊾻ࡅ.ᢎ; [B5, B6, V6]; xn--3vb50049s.xn--79e; ; ; # ࡅ.ᢎ +xn--3vb882jz4411a.xn--79e259a; 􊾻ࡅ‌.ᢎ‍; [B5, B6, C1, C2, V6]; xn--3vb882jz4411a.xn--79e259a; ; ; # ࡅ.ᢎ +ßুᷭ。ؠ8₅; ßুᷭ.ؠ85; ; xn--zca266bwrr.xn--85-psd; ; xn--ss-e2f077r.xn--85-psd; # ßুᷭ.ؠ85 +ßুᷭ。ؠ85; ßুᷭ.ؠ85; ; xn--zca266bwrr.xn--85-psd; ; xn--ss-e2f077r.xn--85-psd; # ßুᷭ.ؠ85 +SSুᷭ。ؠ85; ssুᷭ.ؠ85; ; xn--ss-e2f077r.xn--85-psd; ; ; # ssুᷭ.ؠ85 +ssুᷭ。ؠ85; ssুᷭ.ؠ85; ; xn--ss-e2f077r.xn--85-psd; ; ; # ssুᷭ.ؠ85 +Ssুᷭ。ؠ85; ssুᷭ.ؠ85; ; xn--ss-e2f077r.xn--85-psd; ; ; # ssুᷭ.ؠ85 +xn--ss-e2f077r.xn--85-psd; ssুᷭ.ؠ85; ; xn--ss-e2f077r.xn--85-psd; ; ; # ssুᷭ.ؠ85 +ssুᷭ.ؠ85; ; ; xn--ss-e2f077r.xn--85-psd; ; ; # ssুᷭ.ؠ85 +SSুᷭ.ؠ85; ssুᷭ.ؠ85; ; xn--ss-e2f077r.xn--85-psd; ; ; # ssুᷭ.ؠ85 +Ssুᷭ.ؠ85; ssুᷭ.ؠ85; ; xn--ss-e2f077r.xn--85-psd; ; ; # ssুᷭ.ؠ85 +xn--zca266bwrr.xn--85-psd; ßুᷭ.ؠ85; ; xn--zca266bwrr.xn--85-psd; ; ; # ßুᷭ.ؠ85 +ßুᷭ.ؠ85; ; ; xn--zca266bwrr.xn--85-psd; ; xn--ss-e2f077r.xn--85-psd; # ßুᷭ.ؠ85 +SSুᷭ。ؠ8₅; ssুᷭ.ؠ85; ; xn--ss-e2f077r.xn--85-psd; ; ; # ssুᷭ.ؠ85 +ssুᷭ。ؠ8₅; ssুᷭ.ؠ85; ; xn--ss-e2f077r.xn--85-psd; ; ; # ssুᷭ.ؠ85 +Ssুᷭ。ؠ8₅; ssুᷭ.ؠ85; ; xn--ss-e2f077r.xn--85-psd; ; ; # ssুᷭ.ؠ85 +્҄魅𝟣.₃𐹥ß; ્҄魅1.3𐹥ß; [B1, V5]; xn--1-0xb049b102o.xn--3-qfa7018r; ; xn--1-0xb049b102o.xn--3ss-nv9t; # ્҄魅1.3𐹥ß +્҄魅1.3𐹥ß; ; [B1, V5]; xn--1-0xb049b102o.xn--3-qfa7018r; ; xn--1-0xb049b102o.xn--3ss-nv9t; # ્҄魅1.3𐹥ß +્҄魅1.3𐹥SS; ્҄魅1.3𐹥ss; [B1, V5]; xn--1-0xb049b102o.xn--3ss-nv9t; ; ; # ્҄魅1.3𐹥ss +્҄魅1.3𐹥ss; ; [B1, V5]; xn--1-0xb049b102o.xn--3ss-nv9t; ; ; # ્҄魅1.3𐹥ss +્҄魅1.3𐹥Ss; ્҄魅1.3𐹥ss; [B1, V5]; xn--1-0xb049b102o.xn--3ss-nv9t; ; ; # ્҄魅1.3𐹥ss +xn--1-0xb049b102o.xn--3ss-nv9t; ્҄魅1.3𐹥ss; [B1, V5]; xn--1-0xb049b102o.xn--3ss-nv9t; ; ; # ્҄魅1.3𐹥ss +xn--1-0xb049b102o.xn--3-qfa7018r; ્҄魅1.3𐹥ß; [B1, V5]; xn--1-0xb049b102o.xn--3-qfa7018r; ; ; # ્҄魅1.3𐹥ß +્҄魅𝟣.₃𐹥SS; ્҄魅1.3𐹥ss; [B1, V5]; xn--1-0xb049b102o.xn--3ss-nv9t; ; ; # ્҄魅1.3𐹥ss +્҄魅𝟣.₃𐹥ss; ્҄魅1.3𐹥ss; [B1, V5]; xn--1-0xb049b102o.xn--3ss-nv9t; ; ; # ્҄魅1.3𐹥ss +્҄魅𝟣.₃𐹥Ss; ્҄魅1.3𐹥ss; [B1, V5]; xn--1-0xb049b102o.xn--3ss-nv9t; ; ; # ્҄魅1.3𐹥ss +ܫ。𑓂⒈𑜫󠿻; ܫ.𑓂⒈𑜫󠿻; [B1, P1, V5, V6]; xn--1nb.xn--tsh7798f6rbrt828c; ; ; # ܫ.𑓂⒈𑜫 +ܫ。𑓂1.𑜫󠿻; ܫ.𑓂1.𑜫󠿻; [B1, P1, V5, V6]; xn--1nb.xn--1-jq9i.xn--ji2dg9877c; ; ; # ܫ.𑓂1.𑜫 +xn--1nb.xn--1-jq9i.xn--ji2dg9877c; ܫ.𑓂1.𑜫󠿻; [B1, V5, V6]; xn--1nb.xn--1-jq9i.xn--ji2dg9877c; ; ; # ܫ.𑓂1.𑜫 +xn--1nb.xn--tsh7798f6rbrt828c; ܫ.𑓂⒈𑜫󠿻; [B1, V5, V6]; xn--1nb.xn--tsh7798f6rbrt828c; ; ; # ܫ.𑓂⒈𑜫 +︍છ。嵨; છ.嵨; ; xn--6dc.xn--tot; ; ; # છ.嵨 +xn--6dc.xn--tot; છ.嵨; ; xn--6dc.xn--tot; ; ; # છ.嵨 +છ.嵨; ; ; xn--6dc.xn--tot; ; ; # છ.嵨 +Ⴔ≠Ⴀ.𐹥𐹰; ; [B1, P1, V6]; xn--7md3b171g.xn--do0dwa; ; ; # Ⴔ≠Ⴀ.𐹥𐹰 +Ⴔ≠Ⴀ.𐹥𐹰; Ⴔ≠Ⴀ.𐹥𐹰; [B1, P1, V6]; xn--7md3b171g.xn--do0dwa; ; ; # Ⴔ≠Ⴀ.𐹥𐹰 +ⴔ≠ⴀ.𐹥𐹰; ⴔ≠ⴀ.𐹥𐹰; [B1, P1, V6]; xn--1ch603bxb.xn--do0dwa; ; ; # ⴔ≠ⴀ.𐹥𐹰 +ⴔ≠ⴀ.𐹥𐹰; ; [B1, P1, V6]; xn--1ch603bxb.xn--do0dwa; ; ; # ⴔ≠ⴀ.𐹥𐹰 +xn--1ch603bxb.xn--do0dwa; ⴔ≠ⴀ.𐹥𐹰; [B1, V6]; xn--1ch603bxb.xn--do0dwa; ; ; # ⴔ≠ⴀ.𐹥𐹰 +xn--7md3b171g.xn--do0dwa; Ⴔ≠Ⴀ.𐹥𐹰; [B1, V6]; xn--7md3b171g.xn--do0dwa; ; ; # Ⴔ≠Ⴀ.𐹥𐹰 +-‌⒙𐫥。𝨵; -‌⒙𐫥.𝨵; [C1, P1, V3, V5, V6]; xn----sgn18r3191a.xn--382h; ; xn----ddps939g.xn--382h; [P1, V3, V5, V6] # -⒙𐫥.𝨵 +-‌18.𐫥。𝨵; -‌18.𐫥.𝨵; [C1, V3, V5]; xn---18-9m0a.xn--rx9c.xn--382h; ; -18.xn--rx9c.xn--382h; [V3, V5] # -18.𐫥.𝨵 +-18.xn--rx9c.xn--382h; -18.𐫥.𝨵; [V3, V5]; -18.xn--rx9c.xn--382h; ; ; # -18.𐫥.𝨵 +xn---18-9m0a.xn--rx9c.xn--382h; -‌18.𐫥.𝨵; [C1, V3, V5]; xn---18-9m0a.xn--rx9c.xn--382h; ; ; # -18.𐫥.𝨵 +xn----ddps939g.xn--382h; -⒙𐫥.𝨵; [V3, V5, V6]; xn----ddps939g.xn--382h; ; ; # -⒙𐫥.𝨵 +xn----sgn18r3191a.xn--382h; -‌⒙𐫥.𝨵; [C1, V3, V5, V6]; xn----sgn18r3191a.xn--382h; ; ; # -⒙𐫥.𝨵 +︒.ʌᠣ-𐹽; ; [B1, B5, B6, P1, V6]; xn--y86c.xn----73a596nuh9t; ; ; # ︒.ʌᠣ-𐹽 +。.ʌᠣ-𐹽; ..ʌᠣ-𐹽; [B5, B6, X4_2]; ..xn----73a596nuh9t; [B5, B6, A4_2]; ; # ..ʌᠣ-𐹽 +。.Ʌᠣ-𐹽; ..ʌᠣ-𐹽; [B5, B6, X4_2]; ..xn----73a596nuh9t; [B5, B6, A4_2]; ; # ..ʌᠣ-𐹽 +..xn----73a596nuh9t; ..ʌᠣ-𐹽; [B5, B6, X4_2]; ..xn----73a596nuh9t; [B5, B6, A4_2]; ; # ..ʌᠣ-𐹽 +︒.Ʌᠣ-𐹽; ︒.ʌᠣ-𐹽; [B1, B5, B6, P1, V6]; xn--y86c.xn----73a596nuh9t; ; ; # ︒.ʌᠣ-𐹽 +xn--y86c.xn----73a596nuh9t; ︒.ʌᠣ-𐹽; [B1, B5, B6, V6]; xn--y86c.xn----73a596nuh9t; ; ; # ︒.ʌᠣ-𐹽 +︅︒。𦀾᳠; ︒.𦀾᳠; [P1, V6]; xn--y86c.xn--t6f5138v; ; ; # ︒.𦀾᳠ +︅。。𦀾᳠; ..𦀾᳠; [X4_2]; ..xn--t6f5138v; [A4_2]; ; # ..𦀾᳠ +..xn--t6f5138v; ..𦀾᳠; [X4_2]; ..xn--t6f5138v; [A4_2]; ; # ..𦀾᳠ +xn--y86c.xn--t6f5138v; ︒.𦀾᳠; [V6]; xn--y86c.xn--t6f5138v; ; ; # ︒.𦀾᳠ +xn--t6f5138v; 𦀾᳠; ; xn--t6f5138v; ; ; # 𦀾᳠ +𦀾᳠; ; ; xn--t6f5138v; ; ; # 𦀾᳠ +𞮑ß􏞞。ᡁ; 𞮑ß􏞞.ᡁ; [B2, B3, P1, V6]; xn--zca9432wb989f.xn--07e; ; xn--ss-o412ac6305g.xn--07e; # ß.ᡁ +𞮑SS􏞞。ᡁ; 𞮑ss􏞞.ᡁ; [B2, B3, P1, V6]; xn--ss-o412ac6305g.xn--07e; ; ; # ss.ᡁ +𞮑ss􏞞。ᡁ; 𞮑ss􏞞.ᡁ; [B2, B3, P1, V6]; xn--ss-o412ac6305g.xn--07e; ; ; # ss.ᡁ +𞮑Ss􏞞。ᡁ; 𞮑ss􏞞.ᡁ; [B2, B3, P1, V6]; xn--ss-o412ac6305g.xn--07e; ; ; # ss.ᡁ +xn--ss-o412ac6305g.xn--07e; 𞮑ss􏞞.ᡁ; [B2, B3, V6]; xn--ss-o412ac6305g.xn--07e; ; ; # ss.ᡁ +xn--zca9432wb989f.xn--07e; 𞮑ß􏞞.ᡁ; [B2, B3, V6]; xn--zca9432wb989f.xn--07e; ; ; # ß.ᡁ +꥓‍ج٬。𱆎󻡟‌󠅆; ꥓‍ج٬.𱆎󻡟‌; [B5, B6, C1, P1, V5, V6]; xn--rgb2k500fhq9j.xn--0ug78870a5sp9d; ; xn--rgb2k6711c.xn--ec8nj3948b; [B5, B6, P1, V5, V6] # ꥓ج٬.𱆎 +xn--rgb2k6711c.xn--ec8nj3948b; ꥓ج٬.𱆎󻡟; [B5, B6, V5, V6]; xn--rgb2k6711c.xn--ec8nj3948b; ; ; # ꥓ج٬.𱆎 +xn--rgb2k500fhq9j.xn--0ug78870a5sp9d; ꥓‍ج٬.𱆎󻡟‌; [B5, B6, C1, V5, V6]; xn--rgb2k500fhq9j.xn--0ug78870a5sp9d; ; ; # ꥓ج٬.𱆎 +󠕏.-ß‌≠; 󠕏.-ß‌≠; [C1, P1, V3, V6]; xn--u836e.xn----qfa750ve7b; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ß≠ +󠕏.-ß‌≠; 󠕏.-ß‌≠; [C1, P1, V3, V6]; xn--u836e.xn----qfa750ve7b; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ß≠ +󠕏.-ß‌≠; ; [C1, P1, V3, V6]; xn--u836e.xn----qfa750ve7b; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ß≠ +󠕏.-ß‌≠; 󠕏.-ß‌≠; [C1, P1, V3, V6]; xn--u836e.xn----qfa750ve7b; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ß≠ +󠕏.-SS‌≠; 󠕏.-ss‌≠; [C1, P1, V3, V6]; xn--u836e.xn---ss-cn0at5l; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ss≠ +󠕏.-SS‌≠; 󠕏.-ss‌≠; [C1, P1, V3, V6]; xn--u836e.xn---ss-cn0at5l; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ss≠ +󠕏.-ss‌≠; ; [C1, P1, V3, V6]; xn--u836e.xn---ss-cn0at5l; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ss≠ +󠕏.-ss‌≠; 󠕏.-ss‌≠; [C1, P1, V3, V6]; xn--u836e.xn---ss-cn0at5l; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ss≠ +󠕏.-Ss‌≠; 󠕏.-ss‌≠; [C1, P1, V3, V6]; xn--u836e.xn---ss-cn0at5l; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ss≠ +󠕏.-Ss‌≠; 󠕏.-ss‌≠; [C1, P1, V3, V6]; xn--u836e.xn---ss-cn0at5l; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ss≠ +xn--u836e.xn---ss-gl2a; 󠕏.-ss≠; [V3, V6]; xn--u836e.xn---ss-gl2a; ; ; # .-ss≠ +xn--u836e.xn---ss-cn0at5l; 󠕏.-ss‌≠; [C1, V3, V6]; xn--u836e.xn---ss-cn0at5l; ; ; # .-ss≠ +xn--u836e.xn----qfa750ve7b; 󠕏.-ß‌≠; [C1, V3, V6]; xn--u836e.xn----qfa750ve7b; ; ; # .-ß≠ +󠕏.-SS‌≠; 󠕏.-ss‌≠; [C1, P1, V3, V6]; xn--u836e.xn---ss-cn0at5l; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ss≠ +󠕏.-SS‌≠; 󠕏.-ss‌≠; [C1, P1, V3, V6]; xn--u836e.xn---ss-cn0at5l; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ss≠ +󠕏.-ss‌≠; 󠕏.-ss‌≠; [C1, P1, V3, V6]; xn--u836e.xn---ss-cn0at5l; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ss≠ +󠕏.-ss‌≠; 󠕏.-ss‌≠; [C1, P1, V3, V6]; xn--u836e.xn---ss-cn0at5l; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ss≠ +󠕏.-Ss‌≠; 󠕏.-ss‌≠; [C1, P1, V3, V6]; xn--u836e.xn---ss-cn0at5l; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ss≠ +󠕏.-Ss‌≠; 󠕏.-ss‌≠; [C1, P1, V3, V6]; xn--u836e.xn---ss-cn0at5l; ; xn--u836e.xn---ss-gl2a; [P1, V3, V6] # .-ss≠ +ᡙ‌。≯𐋲≠; ᡙ‌.≯𐋲≠; [C1, P1, V6]; xn--p8e650b.xn--1ch3a7084l; ; xn--p8e.xn--1ch3a7084l; [P1, V6] # ᡙ.≯𐋲≠ +ᡙ‌。≯𐋲≠; ᡙ‌.≯𐋲≠; [C1, P1, V6]; xn--p8e650b.xn--1ch3a7084l; ; xn--p8e.xn--1ch3a7084l; [P1, V6] # ᡙ.≯𐋲≠ +ᡙ‌。≯𐋲≠; ᡙ‌.≯𐋲≠; [C1, P1, V6]; xn--p8e650b.xn--1ch3a7084l; ; xn--p8e.xn--1ch3a7084l; [P1, V6] # ᡙ.≯𐋲≠ +ᡙ‌。≯𐋲≠; ᡙ‌.≯𐋲≠; [C1, P1, V6]; xn--p8e650b.xn--1ch3a7084l; ; xn--p8e.xn--1ch3a7084l; [P1, V6] # ᡙ.≯𐋲≠ +xn--p8e.xn--1ch3a7084l; ᡙ.≯𐋲≠; [V6]; xn--p8e.xn--1ch3a7084l; ; ; # ᡙ.≯𐋲≠ +xn--p8e650b.xn--1ch3a7084l; ᡙ‌.≯𐋲≠; [C1, V6]; xn--p8e650b.xn--1ch3a7084l; ; ; # ᡙ.≯𐋲≠ +𐹧𞲄󠁭񆼩。͎🄀; 𐹧𞲄󠁭񆼩.͎🄀; [B1, P1, V5, V6]; xn--fo0dw409aq58qrn69d.xn--sua6883w; ; ; # 𐹧𞲄.͎🄀 +𐹧𞲄󠁭񆼩。͎0.; 𐹧𞲄󠁭񆼩.͎0.; [B1, P1, V5, V6]; xn--fo0dw409aq58qrn69d.xn--0-bgb.; ; ; # 𐹧𞲄.͎0. +xn--fo0dw409aq58qrn69d.xn--0-bgb.; 𐹧𞲄󠁭񆼩.͎0.; [B1, V5, V6]; xn--fo0dw409aq58qrn69d.xn--0-bgb.; ; ; # 𐹧𞲄.͎0. +xn--fo0dw409aq58qrn69d.xn--sua6883w; 𐹧𞲄󠁭񆼩.͎🄀; [B1, V5, V6]; xn--fo0dw409aq58qrn69d.xn--sua6883w; ; ; # 𐹧𞲄.͎🄀 +Ⴄ.‍ܡ󻣋ς; Ⴄ.‍ܡ󻣋ς; [B1, C2, P1, V6]; xn--cnd.xn--3xa93o3t5ajq467a; ; xn--cnd.xn--4xa73ob5892c; [B2, B3, P1, V6] # Ⴄ.ܡς +Ⴄ.‍ܡ󻣋ς; ; [B1, C2, P1, V6]; xn--cnd.xn--3xa93o3t5ajq467a; ; xn--cnd.xn--4xa73ob5892c; [B2, B3, P1, V6] # Ⴄ.ܡς +ⴄ.‍ܡ󻣋ς; ; [B1, C2, P1, V6]; xn--vkj.xn--3xa93o3t5ajq467a; ; xn--vkj.xn--4xa73ob5892c; [B2, B3, P1, V6] # ⴄ.ܡς +Ⴄ.‍ܡ󻣋Σ; Ⴄ.‍ܡ󻣋σ; [B1, C2, P1, V6]; xn--cnd.xn--4xa73o3t5ajq467a; ; xn--cnd.xn--4xa73ob5892c; [B2, B3, P1, V6] # Ⴄ.ܡσ +ⴄ.‍ܡ󻣋σ; ; [B1, C2, P1, V6]; xn--vkj.xn--4xa73o3t5ajq467a; ; xn--vkj.xn--4xa73ob5892c; [B2, B3, P1, V6] # ⴄ.ܡσ +xn--vkj.xn--4xa73ob5892c; ⴄ.ܡ󻣋σ; [B2, B3, V6]; xn--vkj.xn--4xa73ob5892c; ; ; # ⴄ.ܡσ +xn--vkj.xn--4xa73o3t5ajq467a; ⴄ.‍ܡ󻣋σ; [B1, C2, V6]; xn--vkj.xn--4xa73o3t5ajq467a; ; ; # ⴄ.ܡσ +xn--cnd.xn--4xa73ob5892c; Ⴄ.ܡ󻣋σ; [B2, B3, V6]; xn--cnd.xn--4xa73ob5892c; ; ; # Ⴄ.ܡσ +xn--cnd.xn--4xa73o3t5ajq467a; Ⴄ.‍ܡ󻣋σ; [B1, C2, V6]; xn--cnd.xn--4xa73o3t5ajq467a; ; ; # Ⴄ.ܡσ +xn--vkj.xn--3xa93o3t5ajq467a; ⴄ.‍ܡ󻣋ς; [B1, C2, V6]; xn--vkj.xn--3xa93o3t5ajq467a; ; ; # ⴄ.ܡς +xn--cnd.xn--3xa93o3t5ajq467a; Ⴄ.‍ܡ󻣋ς; [B1, C2, V6]; xn--cnd.xn--3xa93o3t5ajq467a; ; ; # Ⴄ.ܡς +ⴄ.‍ܡ󻣋ς; ⴄ.‍ܡ󻣋ς; [B1, C2, P1, V6]; xn--vkj.xn--3xa93o3t5ajq467a; ; xn--vkj.xn--4xa73ob5892c; [B2, B3, P1, V6] # ⴄ.ܡς +Ⴄ.‍ܡ󻣋Σ; Ⴄ.‍ܡ󻣋σ; [B1, C2, P1, V6]; xn--cnd.xn--4xa73o3t5ajq467a; ; xn--cnd.xn--4xa73ob5892c; [B2, B3, P1, V6] # Ⴄ.ܡσ +ⴄ.‍ܡ󻣋σ; ⴄ.‍ܡ󻣋σ; [B1, C2, P1, V6]; xn--vkj.xn--4xa73o3t5ajq467a; ; xn--vkj.xn--4xa73ob5892c; [B2, B3, P1, V6] # ⴄ.ܡσ +򮵛ؓ.Ⴕ; ; [P1, V6]; xn--1fb94204l.xn--tnd; ; ; # ؓ.Ⴕ +򮵛ؓ.ⴕ; ; [P1, V6]; xn--1fb94204l.xn--dlj; ; ; # ؓ.ⴕ +xn--1fb94204l.xn--dlj; 򮵛ؓ.ⴕ; [V6]; xn--1fb94204l.xn--dlj; ; ; # ؓ.ⴕ +xn--1fb94204l.xn--tnd; 򮵛ؓ.Ⴕ; [V6]; xn--1fb94204l.xn--tnd; ; ; # ؓ.Ⴕ +≯ᷳ𞤥。‌꣄󠪉‍; ≯ᷳ𞤥.‌꣄󠪉‍; [B1, C1, C2, P1, V6]; xn--ofg13qyr21c.xn--0ugc0116hix29k; ; xn--ofg13qyr21c.xn--0f9au6706d; [B1, P1, V5, V6] # ≯ᷳ𞤥.꣄ +≯ᷳ𞤥。‌꣄󠪉‍; ≯ᷳ𞤥.‌꣄󠪉‍; [B1, C1, C2, P1, V6]; xn--ofg13qyr21c.xn--0ugc0116hix29k; ; xn--ofg13qyr21c.xn--0f9au6706d; [B1, P1, V5, V6] # ≯ᷳ𞤥.꣄ +≯ᷳ𞤃。‌꣄󠪉‍; ≯ᷳ𞤥.‌꣄󠪉‍; [B1, C1, C2, P1, V6]; xn--ofg13qyr21c.xn--0ugc0116hix29k; ; xn--ofg13qyr21c.xn--0f9au6706d; [B1, P1, V5, V6] # ≯ᷳ𞤥.꣄ +≯ᷳ𞤃。‌꣄󠪉‍; ≯ᷳ𞤥.‌꣄󠪉‍; [B1, C1, C2, P1, V6]; xn--ofg13qyr21c.xn--0ugc0116hix29k; ; xn--ofg13qyr21c.xn--0f9au6706d; [B1, P1, V5, V6] # ≯ᷳ𞤥.꣄ +xn--ofg13qyr21c.xn--0f9au6706d; ≯ᷳ𞤥.꣄󠪉; [B1, V5, V6]; xn--ofg13qyr21c.xn--0f9au6706d; ; ; # ≯ᷳ𞤥.꣄ +xn--ofg13qyr21c.xn--0ugc0116hix29k; ≯ᷳ𞤥.‌꣄󠪉‍; [B1, C1, C2, V6]; xn--ofg13qyr21c.xn--0ugc0116hix29k; ; ; # ≯ᷳ𞤥.꣄ +‌󠄷。򒑁; ‌.򒑁; [C1, P1, V6]; xn--0ug.xn--w720c; ; .xn--w720c; [P1, V6, A4_2] # . +‌󠄷。򒑁; ‌.򒑁; [C1, P1, V6]; xn--0ug.xn--w720c; ; .xn--w720c; [P1, V6, A4_2] # . +.xn--w720c; .򒑁; [V6, X4_2]; .xn--w720c; [V6, A4_2]; ; # . +xn--0ug.xn--w720c; ‌.򒑁; [C1, V6]; xn--0ug.xn--w720c; ; ; # . +⒈ූ焅.󗡙‍ꡟ; ; [C2, P1, V6]; xn--t1c337io97c.xn--1ugz184c9lw7i; ; xn--t1c337io97c.xn--4c9a21133d; [P1, V6] # ⒈ූ焅.ꡟ +1.ූ焅.󗡙‍ꡟ; ; [C2, P1, V5, V6]; 1.xn--t1c6981c.xn--1ugz184c9lw7i; ; 1.xn--t1c6981c.xn--4c9a21133d; [P1, V5, V6] # 1.ූ焅.ꡟ +1.xn--t1c6981c.xn--4c9a21133d; 1.ූ焅.󗡙ꡟ; [V5, V6]; 1.xn--t1c6981c.xn--4c9a21133d; ; ; # 1.ූ焅.ꡟ +1.xn--t1c6981c.xn--1ugz184c9lw7i; 1.ූ焅.󗡙‍ꡟ; [C2, V5, V6]; 1.xn--t1c6981c.xn--1ugz184c9lw7i; ; ; # 1.ූ焅.ꡟ +xn--t1c337io97c.xn--4c9a21133d; ⒈ූ焅.󗡙ꡟ; [V6]; xn--t1c337io97c.xn--4c9a21133d; ; ; # ⒈ූ焅.ꡟ +xn--t1c337io97c.xn--1ugz184c9lw7i; ⒈ූ焅.󗡙‍ꡟ; [C2, V6]; xn--t1c337io97c.xn--1ugz184c9lw7i; ; ; # ⒈ූ焅.ꡟ +᷍ς≮.ς𝪦𞤕0; ᷍ς≮.ς𝪦𞤷0; [B1, B5, P1, V5, V6]; xn--3xa744kvid.xn--0-xmb85727aggma; ; xn--4xa544kvid.xn--0-zmb55727aggma; # ᷍ς≮.ς𝪦𞤷0 +᷍ς≮.ς𝪦𞤕0; ᷍ς≮.ς𝪦𞤷0; [B1, B5, P1, V5, V6]; xn--3xa744kvid.xn--0-xmb85727aggma; ; xn--4xa544kvid.xn--0-zmb55727aggma; # ᷍ς≮.ς𝪦𞤷0 +᷍ς≮.ς𝪦𞤷0; ᷍ς≮.ς𝪦𞤷0; [B1, B5, P1, V5, V6]; xn--3xa744kvid.xn--0-xmb85727aggma; ; xn--4xa544kvid.xn--0-zmb55727aggma; # ᷍ς≮.ς𝪦𞤷0 +᷍ς≮.ς𝪦𞤷0; ; [B1, B5, P1, V5, V6]; xn--3xa744kvid.xn--0-xmb85727aggma; ; xn--4xa544kvid.xn--0-zmb55727aggma; # ᷍ς≮.ς𝪦𞤷0 +᷍Σ≮.Σ𝪦𞤕0; ᷍σ≮.σ𝪦𞤷0; [B1, B5, P1, V5, V6]; xn--4xa544kvid.xn--0-zmb55727aggma; ; ; # ᷍σ≮.σ𝪦𞤷0 +᷍Σ≮.Σ𝪦𞤕0; ᷍σ≮.σ𝪦𞤷0; [B1, B5, P1, V5, V6]; xn--4xa544kvid.xn--0-zmb55727aggma; ; ; # ᷍σ≮.σ𝪦𞤷0 +᷍σ≮.σ𝪦𞤷0; ᷍σ≮.σ𝪦𞤷0; [B1, B5, P1, V5, V6]; xn--4xa544kvid.xn--0-zmb55727aggma; ; ; # ᷍σ≮.σ𝪦𞤷0 +᷍σ≮.σ𝪦𞤷0; ; [B1, B5, P1, V5, V6]; xn--4xa544kvid.xn--0-zmb55727aggma; ; ; # ᷍σ≮.σ𝪦𞤷0 +᷍Σ≮.Σ𝪦𞤷0; ᷍σ≮.σ𝪦𞤷0; [B1, B5, P1, V5, V6]; xn--4xa544kvid.xn--0-zmb55727aggma; ; ; # ᷍σ≮.σ𝪦𞤷0 +᷍Σ≮.Σ𝪦𞤷0; ᷍σ≮.σ𝪦𞤷0; [B1, B5, P1, V5, V6]; xn--4xa544kvid.xn--0-zmb55727aggma; ; ; # ᷍σ≮.σ𝪦𞤷0 +xn--4xa544kvid.xn--0-zmb55727aggma; ᷍σ≮.σ𝪦𞤷0; [B1, B5, V5, V6]; xn--4xa544kvid.xn--0-zmb55727aggma; ; ; # ᷍σ≮.σ𝪦𞤷0 +xn--3xa744kvid.xn--0-xmb85727aggma; ᷍ς≮.ς𝪦𞤷0; [B1, B5, V5, V6]; xn--3xa744kvid.xn--0-xmb85727aggma; ; ; # ᷍ς≮.ς𝪦𞤷0 +᷍σ≮.σ𝪦𞤕0; ᷍σ≮.σ𝪦𞤷0; [B1, B5, P1, V5, V6]; xn--4xa544kvid.xn--0-zmb55727aggma; ; ; # ᷍σ≮.σ𝪦𞤷0 +᷍σ≮.σ𝪦𞤕0; ᷍σ≮.σ𝪦𞤷0; [B1, B5, P1, V5, V6]; xn--4xa544kvid.xn--0-zmb55727aggma; ; ; # ᷍σ≮.σ𝪦𞤷0 +򢦾ßֹ𐫙.֭ࢡ; ; [B1, B5, B6, P1, V5, V6]; xn--zca89v339zj118e.xn--4cb62m; ; xn--ss-xjd6058xlz50g.xn--4cb62m; # ßֹ𐫙.֭ࢡ +򢦾SSֹ𐫙.֭ࢡ; 򢦾ssֹ𐫙.֭ࢡ; [B1, B5, B6, P1, V5, V6]; xn--ss-xjd6058xlz50g.xn--4cb62m; ; ; # ssֹ𐫙.֭ࢡ +򢦾ssֹ𐫙.֭ࢡ; ; [B1, B5, B6, P1, V5, V6]; xn--ss-xjd6058xlz50g.xn--4cb62m; ; ; # ssֹ𐫙.֭ࢡ +򢦾Ssֹ𐫙.֭ࢡ; 򢦾ssֹ𐫙.֭ࢡ; [B1, B5, B6, P1, V5, V6]; xn--ss-xjd6058xlz50g.xn--4cb62m; ; ; # ssֹ𐫙.֭ࢡ +xn--ss-xjd6058xlz50g.xn--4cb62m; 򢦾ssֹ𐫙.֭ࢡ; [B1, B5, B6, V5, V6]; xn--ss-xjd6058xlz50g.xn--4cb62m; ; ; # ssֹ𐫙.֭ࢡ +xn--zca89v339zj118e.xn--4cb62m; 򢦾ßֹ𐫙.֭ࢡ; [B1, B5, B6, V5, V6]; xn--zca89v339zj118e.xn--4cb62m; ; ; # ßֹ𐫙.֭ࢡ +-𞣄。⒈; -𞣄.⒈; [B1, P1, V3, V6]; xn----xc8r.xn--tsh; ; ; # -𞣄.⒈ +-𞣄。1.; -𞣄.1.; [B1, V3]; xn----xc8r.1.; ; ; # -𞣄.1. +xn----xc8r.1.; -𞣄.1.; [B1, V3]; xn----xc8r.1.; ; ; # -𞣄.1. +xn----xc8r.xn--tsh; -𞣄.⒈; [B1, V3, V6]; xn----xc8r.xn--tsh; ; ; # -𞣄.⒈ +񈠢𐫖𝟡。ؾ𑘿; 񈠢𐫖9.ؾ𑘿; [B5, P1, V6]; xn--9-el5iv442t.xn--9gb0830l; ; ; # 𐫖9.ؾ𑘿 +񈠢𐫖9。ؾ𑘿; 񈠢𐫖9.ؾ𑘿; [B5, P1, V6]; xn--9-el5iv442t.xn--9gb0830l; ; ; # 𐫖9.ؾ𑘿 +xn--9-el5iv442t.xn--9gb0830l; 񈠢𐫖9.ؾ𑘿; [B5, V6]; xn--9-el5iv442t.xn--9gb0830l; ; ; # 𐫖9.ؾ𑘿 +٨ﲌ٨ᩝ.‍; ٨نم٨ᩝ.‍; [B1, C2]; xn--hhbb5hc956w.xn--1ug; ; xn--hhbb5hc956w.; [B1] # ٨نم٨ᩝ. +٨نم٨ᩝ.‍; ; [B1, C2]; xn--hhbb5hc956w.xn--1ug; ; xn--hhbb5hc956w.; [B1] # ٨نم٨ᩝ. +xn--hhbb5hc956w.; ٨نم٨ᩝ.; [B1]; xn--hhbb5hc956w.; ; ; # ٨نم٨ᩝ. +xn--hhbb5hc956w.xn--1ug; ٨نم٨ᩝ.‍; [B1, C2]; xn--hhbb5hc956w.xn--1ug; ; ; # ٨نم٨ᩝ. +𝟘.Ⴇ󀳑ﵐ񫃱; 0.Ⴇ󀳑تجم񫃱; [B1, B5, P1, V6]; 0.xn--pgbe9e344c2725svff8b; ; ; # 0.Ⴇتجم +0.Ⴇ󀳑تجم񫃱; ; [B1, B5, P1, V6]; 0.xn--pgbe9e344c2725svff8b; ; ; # 0.Ⴇتجم +0.ⴇ󀳑تجم񫃱; ; [B1, B5, P1, V6]; 0.xn--pgbe9ez79qd207lvff8b; ; ; # 0.ⴇتجم +0.xn--pgbe9ez79qd207lvff8b; 0.ⴇ󀳑تجم񫃱; [B1, B5, V6]; 0.xn--pgbe9ez79qd207lvff8b; ; ; # 0.ⴇتجم +0.xn--pgbe9e344c2725svff8b; 0.Ⴇ󀳑تجم񫃱; [B1, B5, V6]; 0.xn--pgbe9e344c2725svff8b; ; ; # 0.Ⴇتجم +𝟘.ⴇ󀳑ﵐ񫃱; 0.ⴇ󀳑تجم񫃱; [B1, B5, P1, V6]; 0.xn--pgbe9ez79qd207lvff8b; ; ; # 0.ⴇتجم +𑇀▍.⁞ᠰ; ; [V5]; xn--9zh3057f.xn--j7e103b; ; ; # 𑇀▍.⁞ᠰ +xn--9zh3057f.xn--j7e103b; 𑇀▍.⁞ᠰ; [V5]; xn--9zh3057f.xn--j7e103b; ; ; # 𑇀▍.⁞ᠰ +‍-ٺ.򏯩; ; [B1, C2, P1, V6]; xn----qrc357q.xn--ts49b; ; xn----qrc.xn--ts49b; [B1, P1, V3, V6] # -ٺ. +xn----qrc.xn--ts49b; -ٺ.򏯩; [B1, V3, V6]; xn----qrc.xn--ts49b; ; ; # -ٺ. +xn----qrc357q.xn--ts49b; ‍-ٺ.򏯩; [B1, C2, V6]; xn----qrc357q.xn--ts49b; ; ; # -ٺ. +ᠢ𐮂𐫘寐。‌≯✳; ᠢ𐮂𐫘寐.‌≯✳; [B1, B5, C1, P1, V6]; xn--46e6675axzzhota.xn--0ug06gu8f; ; xn--46e6675axzzhota.xn--hdh99p; [B1, B5, P1, V6] # ᠢ𐮂𐫘寐.≯✳ +ᠢ𐮂𐫘寐。‌≯✳; ᠢ𐮂𐫘寐.‌≯✳; [B1, B5, C1, P1, V6]; xn--46e6675axzzhota.xn--0ug06gu8f; ; xn--46e6675axzzhota.xn--hdh99p; [B1, B5, P1, V6] # ᠢ𐮂𐫘寐.≯✳ +ᠢ𐮂𐫘寐。‌≯✳; ᠢ𐮂𐫘寐.‌≯✳; [B1, B5, C1, P1, V6]; xn--46e6675axzzhota.xn--0ug06gu8f; ; xn--46e6675axzzhota.xn--hdh99p; [B1, B5, P1, V6] # ᠢ𐮂𐫘寐.≯✳ +ᠢ𐮂𐫘寐。‌≯✳; ᠢ𐮂𐫘寐.‌≯✳; [B1, B5, C1, P1, V6]; xn--46e6675axzzhota.xn--0ug06gu8f; ; xn--46e6675axzzhota.xn--hdh99p; [B1, B5, P1, V6] # ᠢ𐮂𐫘寐.≯✳ +xn--46e6675axzzhota.xn--hdh99p; ᠢ𐮂𐫘寐.≯✳; [B1, B5, V6]; xn--46e6675axzzhota.xn--hdh99p; ; ; # ᠢ𐮂𐫘寐.≯✳ +xn--46e6675axzzhota.xn--0ug06gu8f; ᠢ𐮂𐫘寐.‌≯✳; [B1, B5, C1, V6]; xn--46e6675axzzhota.xn--0ug06gu8f; ; ; # ᠢ𐮂𐫘寐.≯✳ +‍。󸲜ႺႴ𞨇; ‍.󸲜ႺႴ𞨇; [B1, B5, B6, C2, P1, V6]; xn--1ug.xn--sndl01647an3h1h; ; .xn--sndl01647an3h1h; [B5, B6, P1, V6, A4_2] # .ႺႴ +‍。󸲜ႺႴ𞨇; ‍.󸲜ႺႴ𞨇; [B1, B5, B6, C2, P1, V6]; xn--1ug.xn--sndl01647an3h1h; ; .xn--sndl01647an3h1h; [B5, B6, P1, V6, A4_2] # .ႺႴ +‍。󸲜ⴚⴔ𞨇; ‍.󸲜ⴚⴔ𞨇; [B1, B5, B6, C2, P1, V6]; xn--1ug.xn--cljl81825an3r4h; ; .xn--cljl81825an3r4h; [B5, B6, P1, V6, A4_2] # .ⴚⴔ +‍。󸲜Ⴚⴔ𞨇; ‍.󸲜Ⴚⴔ𞨇; [B1, B5, B6, C2, P1, V6]; xn--1ug.xn--ynd036lq981an3r4h; ; .xn--ynd036lq981an3r4h; [B5, B6, P1, V6, A4_2] # .Ⴚⴔ +.xn--ynd036lq981an3r4h; .󸲜Ⴚⴔ𞨇; [B5, B6, V6, X4_2]; .xn--ynd036lq981an3r4h; [B5, B6, V6, A4_2]; ; # .Ⴚⴔ +xn--1ug.xn--ynd036lq981an3r4h; ‍.󸲜Ⴚⴔ𞨇; [B1, B5, B6, C2, V6]; xn--1ug.xn--ynd036lq981an3r4h; ; ; # .Ⴚⴔ +.xn--cljl81825an3r4h; .󸲜ⴚⴔ𞨇; [B5, B6, V6, X4_2]; .xn--cljl81825an3r4h; [B5, B6, V6, A4_2]; ; # .ⴚⴔ +xn--1ug.xn--cljl81825an3r4h; ‍.󸲜ⴚⴔ𞨇; [B1, B5, B6, C2, V6]; xn--1ug.xn--cljl81825an3r4h; ; ; # .ⴚⴔ +.xn--sndl01647an3h1h; .󸲜ႺႴ𞨇; [B5, B6, V6, X4_2]; .xn--sndl01647an3h1h; [B5, B6, V6, A4_2]; ; # .ႺႴ +xn--1ug.xn--sndl01647an3h1h; ‍.󸲜ႺႴ𞨇; [B1, B5, B6, C2, V6]; xn--1ug.xn--sndl01647an3h1h; ; ; # .ႺႴ +‍。󸲜ⴚⴔ𞨇; ‍.󸲜ⴚⴔ𞨇; [B1, B5, B6, C2, P1, V6]; xn--1ug.xn--cljl81825an3r4h; ; .xn--cljl81825an3r4h; [B5, B6, P1, V6, A4_2] # .ⴚⴔ +‍。󸲜Ⴚⴔ𞨇; ‍.󸲜Ⴚⴔ𞨇; [B1, B5, B6, C2, P1, V6]; xn--1ug.xn--ynd036lq981an3r4h; ; .xn--ynd036lq981an3r4h; [B5, B6, P1, V6, A4_2] # .Ⴚⴔ +-3.‍ヌᢕ; ; [C2, V3]; -3.xn--fbf739aq5o; ; -3.xn--fbf115j; [V3] # -3.ヌᢕ +-3.xn--fbf115j; -3.ヌᢕ; [V3]; -3.xn--fbf115j; ; ; # -3.ヌᢕ +-3.xn--fbf739aq5o; -3.‍ヌᢕ; [C2, V3]; -3.xn--fbf739aq5o; ; ; # -3.ヌᢕ +🂃٦ß‍。󠠂򭰍𞩒-; 🂃٦ß‍.󠠂򭰍𞩒-; [B1, C2, P1, V3, V6]; xn--zca34z68yzu83b.xn----nz8rh7531csznt; ; xn--ss-pyd98921c.xn----nz8rh7531csznt; [B1, P1, V3, V6] # 🂃٦ß.- +🂃٦SS‍。󠠂򭰍𞩒-; 🂃٦ss‍.󠠂򭰍𞩒-; [B1, C2, P1, V3, V6]; xn--ss-pyd483x5k99b.xn----nz8rh7531csznt; ; xn--ss-pyd98921c.xn----nz8rh7531csznt; [B1, P1, V3, V6] # 🂃٦ss.- +🂃٦ss‍。󠠂򭰍𞩒-; 🂃٦ss‍.󠠂򭰍𞩒-; [B1, C2, P1, V3, V6]; xn--ss-pyd483x5k99b.xn----nz8rh7531csznt; ; xn--ss-pyd98921c.xn----nz8rh7531csznt; [B1, P1, V3, V6] # 🂃٦ss.- +xn--ss-pyd98921c.xn----nz8rh7531csznt; 🂃٦ss.󠠂򭰍𞩒-; [B1, V3, V6]; xn--ss-pyd98921c.xn----nz8rh7531csznt; ; ; # 🂃٦ss.- +xn--ss-pyd483x5k99b.xn----nz8rh7531csznt; 🂃٦ss‍.󠠂򭰍𞩒-; [B1, C2, V3, V6]; xn--ss-pyd483x5k99b.xn----nz8rh7531csznt; ; ; # 🂃٦ss.- +xn--zca34z68yzu83b.xn----nz8rh7531csznt; 🂃٦ß‍.󠠂򭰍𞩒-; [B1, C2, V3, V6]; xn--zca34z68yzu83b.xn----nz8rh7531csznt; ; ; # 🂃٦ß.- +🂃٦Ss‍。󠠂򭰍𞩒-; 🂃٦ss‍.󠠂򭰍𞩒-; [B1, C2, P1, V3, V6]; xn--ss-pyd483x5k99b.xn----nz8rh7531csznt; ; xn--ss-pyd98921c.xn----nz8rh7531csznt; [B1, P1, V3, V6] # 🂃٦ss.- +ꇟ-𐾺ڟ。򰀺‌; ꇟ-𐾺ڟ.򰀺‌; [B5, B6, C1, P1, V6]; xn----utc4430jd3zd.xn--0ugx6670i; ; xn----utc4430jd3zd.xn--bp20d; [B5, B6, P1, V6] # ꇟ-𐾺ڟ. +xn----utc4430jd3zd.xn--bp20d; ꇟ-𐾺ڟ.򰀺; [B5, B6, V6]; xn----utc4430jd3zd.xn--bp20d; ; ; # ꇟ-𐾺ڟ. +xn----utc4430jd3zd.xn--0ugx6670i; ꇟ-𐾺ڟ.򰀺‌; [B5, B6, C1, V6]; xn----utc4430jd3zd.xn--0ugx6670i; ; ; # ꇟ-𐾺ڟ. +٥.҄𐨗𝩋𴤃; ; [B1, P1, V5, V6]; xn--eib.xn--n3a0405kus8eft5l; ; ; # ٥.҄𐨗𝩋 +xn--eib.xn--n3a0405kus8eft5l; ٥.҄𐨗𝩋𴤃; [B1, V5, V6]; xn--eib.xn--n3a0405kus8eft5l; ; ; # ٥.҄𐨗𝩋 +-.񱼓ى𐨿; ; [B1, B5, B6, P1, V3, V6]; -.xn--lhb4124khbq4b; ; ; # -.ى𐨿 +-.xn--lhb4124khbq4b; -.񱼓ى𐨿; [B1, B5, B6, V3, V6]; -.xn--lhb4124khbq4b; ; ; # -.ى𐨿 +󾬨ς.𞶙녫ß; ; [B2, B3, P1, V6]; xn--3xa96659r.xn--zca5051g4h4i; ; xn--4xa76659r.xn--ss-d64i8755h; # ς.녫ß +󾬨ς.𞶙녫ß; 󾬨ς.𞶙녫ß; [B2, B3, P1, V6]; xn--3xa96659r.xn--zca5051g4h4i; ; xn--4xa76659r.xn--ss-d64i8755h; # ς.녫ß +󾬨Σ.𞶙녫SS; 󾬨σ.𞶙녫ss; [B2, B3, P1, V6]; xn--4xa76659r.xn--ss-d64i8755h; ; ; # σ.녫ss +󾬨Σ.𞶙녫SS; 󾬨σ.𞶙녫ss; [B2, B3, P1, V6]; xn--4xa76659r.xn--ss-d64i8755h; ; ; # σ.녫ss +󾬨σ.𞶙녫ss; ; [B2, B3, P1, V6]; xn--4xa76659r.xn--ss-d64i8755h; ; ; # σ.녫ss +󾬨σ.𞶙녫ss; 󾬨σ.𞶙녫ss; [B2, B3, P1, V6]; xn--4xa76659r.xn--ss-d64i8755h; ; ; # σ.녫ss +󾬨Σ.𞶙녫ss; 󾬨σ.𞶙녫ss; [B2, B3, P1, V6]; xn--4xa76659r.xn--ss-d64i8755h; ; ; # σ.녫ss +󾬨Σ.𞶙녫ss; 󾬨σ.𞶙녫ss; [B2, B3, P1, V6]; xn--4xa76659r.xn--ss-d64i8755h; ; ; # σ.녫ss +󾬨Σ.𞶙녫Ss; 󾬨σ.𞶙녫ss; [B2, B3, P1, V6]; xn--4xa76659r.xn--ss-d64i8755h; ; ; # σ.녫ss +󾬨Σ.𞶙녫Ss; 󾬨σ.𞶙녫ss; [B2, B3, P1, V6]; xn--4xa76659r.xn--ss-d64i8755h; ; ; # σ.녫ss +xn--4xa76659r.xn--ss-d64i8755h; 󾬨σ.𞶙녫ss; [B2, B3, V6]; xn--4xa76659r.xn--ss-d64i8755h; ; ; # σ.녫ss +󾬨Σ.𞶙녫ß; 󾬨σ.𞶙녫ß; [B2, B3, P1, V6]; xn--4xa76659r.xn--zca5051g4h4i; ; xn--4xa76659r.xn--ss-d64i8755h; # σ.녫ß +󾬨Σ.𞶙녫ß; 󾬨σ.𞶙녫ß; [B2, B3, P1, V6]; xn--4xa76659r.xn--zca5051g4h4i; ; xn--4xa76659r.xn--ss-d64i8755h; # σ.녫ß +󾬨σ.𞶙녫ß; ; [B2, B3, P1, V6]; xn--4xa76659r.xn--zca5051g4h4i; ; xn--4xa76659r.xn--ss-d64i8755h; # σ.녫ß +󾬨σ.𞶙녫ß; 󾬨σ.𞶙녫ß; [B2, B3, P1, V6]; xn--4xa76659r.xn--zca5051g4h4i; ; xn--4xa76659r.xn--ss-d64i8755h; # σ.녫ß +xn--4xa76659r.xn--zca5051g4h4i; 󾬨σ.𞶙녫ß; [B2, B3, V6]; xn--4xa76659r.xn--zca5051g4h4i; ; ; # σ.녫ß +xn--3xa96659r.xn--zca5051g4h4i; 󾬨ς.𞶙녫ß; [B2, B3, V6]; xn--3xa96659r.xn--zca5051g4h4i; ; ; # ς.녫ß +Ⅎ្‍。≠‍‌; Ⅎ្‍.≠‍‌; [C1, C2, P1, V6]; xn--u4e823bcza.xn--0ugb89o; ; xn--u4e319b.xn--1ch; [P1, V6] # Ⅎ្.≠ +Ⅎ្‍。≠‍‌; Ⅎ្‍.≠‍‌; [C1, C2, P1, V6]; xn--u4e823bcza.xn--0ugb89o; ; xn--u4e319b.xn--1ch; [P1, V6] # Ⅎ្.≠ +Ⅎ្‍。≠‍‌; Ⅎ្‍.≠‍‌; [C1, C2, P1, V6]; xn--u4e823bcza.xn--0ugb89o; ; xn--u4e319b.xn--1ch; [P1, V6] # Ⅎ្.≠ +Ⅎ្‍。≠‍‌; Ⅎ្‍.≠‍‌; [C1, C2, P1, V6]; xn--u4e823bcza.xn--0ugb89o; ; xn--u4e319b.xn--1ch; [P1, V6] # Ⅎ្.≠ +ⅎ្‍。≠‍‌; ⅎ្‍.≠‍‌; [C1, C2, P1, V6]; xn--u4e823bq1a.xn--0ugb89o; ; xn--u4e969b.xn--1ch; [P1, V6] # ⅎ្.≠ +ⅎ្‍。≠‍‌; ⅎ្‍.≠‍‌; [C1, C2, P1, V6]; xn--u4e823bq1a.xn--0ugb89o; ; xn--u4e969b.xn--1ch; [P1, V6] # ⅎ្.≠ +xn--u4e969b.xn--1ch; ⅎ្.≠; [V6]; xn--u4e969b.xn--1ch; ; ; # ⅎ្.≠ +xn--u4e823bq1a.xn--0ugb89o; ⅎ្‍.≠‍‌; [C1, C2, V6]; xn--u4e823bq1a.xn--0ugb89o; ; ; # ⅎ្.≠ +xn--u4e319b.xn--1ch; Ⅎ្.≠; [V6]; xn--u4e319b.xn--1ch; ; ; # Ⅎ្.≠ +xn--u4e823bcza.xn--0ugb89o; Ⅎ្‍.≠‍‌; [C1, C2, V6]; xn--u4e823bcza.xn--0ugb89o; ; ; # Ⅎ្.≠ +ⅎ្‍。≠‍‌; ⅎ្‍.≠‍‌; [C1, C2, P1, V6]; xn--u4e823bq1a.xn--0ugb89o; ; xn--u4e969b.xn--1ch; [P1, V6] # ⅎ្.≠ +ⅎ្‍。≠‍‌; ⅎ្‍.≠‍‌; [C1, C2, P1, V6]; xn--u4e823bq1a.xn--0ugb89o; ; xn--u4e969b.xn--1ch; [P1, V6] # ⅎ្.≠ +𐋺꫶꥓󧦉.‌᜔ڏ; 𐋺꫶꥓󧦉.‌᜔ڏ; [B1, C1, P1, V6]; xn--3j9a14ak27osbz2o.xn--ljb175f1wg; ; xn--3j9a14ak27osbz2o.xn--ljb175f; [B1, P1, V5, V6] # 𐋺꫶꥓.᜔ڏ +𐋺꫶꥓󧦉.‌᜔ڏ; ; [B1, C1, P1, V6]; xn--3j9a14ak27osbz2o.xn--ljb175f1wg; ; xn--3j9a14ak27osbz2o.xn--ljb175f; [B1, P1, V5, V6] # 𐋺꫶꥓.᜔ڏ +xn--3j9a14ak27osbz2o.xn--ljb175f; 𐋺꫶꥓󧦉.᜔ڏ; [B1, V5, V6]; xn--3j9a14ak27osbz2o.xn--ljb175f; ; ; # 𐋺꫶꥓.᜔ڏ +xn--3j9a14ak27osbz2o.xn--ljb175f1wg; 𐋺꫶꥓󧦉.‌᜔ڏ; [B1, C1, V6]; xn--3j9a14ak27osbz2o.xn--ljb175f1wg; ; ; # 𐋺꫶꥓.᜔ڏ +񺔯ྨ.≯; 񺔯ྨ.≯; [P1, V6]; xn--4fd57150h.xn--hdh; ; ; # ྨ.≯ +񺔯ྨ.≯; 񺔯ྨ.≯; [P1, V6]; xn--4fd57150h.xn--hdh; ; ; # ྨ.≯ +񺔯ྨ.≯; ; [P1, V6]; xn--4fd57150h.xn--hdh; ; ; # ྨ.≯ +񺔯ྨ.≯; 񺔯ྨ.≯; [P1, V6]; xn--4fd57150h.xn--hdh; ; ; # ྨ.≯ +xn--4fd57150h.xn--hdh; 񺔯ྨ.≯; [V6]; xn--4fd57150h.xn--hdh; ; ; # ྨ.≯ +‍𞡄Ⴓ.𐇽; ‍𞡄Ⴓ.𐇽; [B1, B3, B6, C2, P1, V5, V6]; xn--rnd379ex885a.xn--m27c; ; xn--rnd5552v.xn--m27c; [B1, B2, B3, B6, P1, V5, V6] # 𞡄Ⴓ.𐇽 +‍𞡄Ⴓ.𐇽; ; [B1, B3, B6, C2, P1, V5, V6]; xn--rnd379ex885a.xn--m27c; ; xn--rnd5552v.xn--m27c; [B1, B2, B3, B6, P1, V5, V6] # 𞡄Ⴓ.𐇽 +‍𞡄ⴓ.𐇽; ; [B1, B3, B6, C2, V5]; xn--1ugz52c4i16a.xn--m27c; ; xn--blj7492l.xn--m27c; [B1, B2, B3, B6, V5] # 𞡄ⴓ.𐇽 +xn--blj7492l.xn--m27c; 𞡄ⴓ.𐇽; [B1, B2, B3, B6, V5]; xn--blj7492l.xn--m27c; ; ; # 𞡄ⴓ.𐇽 +xn--1ugz52c4i16a.xn--m27c; ‍𞡄ⴓ.𐇽; [B1, B3, B6, C2, V5]; xn--1ugz52c4i16a.xn--m27c; ; ; # 𞡄ⴓ.𐇽 +xn--rnd5552v.xn--m27c; 𞡄Ⴓ.𐇽; [B1, B2, B3, B6, V5, V6]; xn--rnd5552v.xn--m27c; ; ; # 𞡄Ⴓ.𐇽 +xn--rnd379ex885a.xn--m27c; ‍𞡄Ⴓ.𐇽; [B1, B3, B6, C2, V5, V6]; xn--rnd379ex885a.xn--m27c; ; ; # 𞡄Ⴓ.𐇽 +‍𞡄ⴓ.𐇽; ‍𞡄ⴓ.𐇽; [B1, B3, B6, C2, V5]; xn--1ugz52c4i16a.xn--m27c; ; xn--blj7492l.xn--m27c; [B1, B2, B3, B6, V5] # 𞡄ⴓ.𐇽 +𐪒ß꣪.ᡤ; 𐪒ß꣪.ᡤ; [B2, B3]; xn--zca2517f2hvc.xn--08e; ; xn--ss-tu9hw933a.xn--08e; # 𐪒ß꣪.ᡤ +𐪒ß꣪.ᡤ; ; [B2, B3]; xn--zca2517f2hvc.xn--08e; ; xn--ss-tu9hw933a.xn--08e; # 𐪒ß꣪.ᡤ +𐪒SS꣪.ᡤ; 𐪒ss꣪.ᡤ; [B2, B3]; xn--ss-tu9hw933a.xn--08e; ; ; # 𐪒ss꣪.ᡤ +𐪒ss꣪.ᡤ; ; [B2, B3]; xn--ss-tu9hw933a.xn--08e; ; ; # 𐪒ss꣪.ᡤ +xn--ss-tu9hw933a.xn--08e; 𐪒ss꣪.ᡤ; [B2, B3]; xn--ss-tu9hw933a.xn--08e; ; ; # 𐪒ss꣪.ᡤ +xn--zca2517f2hvc.xn--08e; 𐪒ß꣪.ᡤ; [B2, B3]; xn--zca2517f2hvc.xn--08e; ; ; # 𐪒ß꣪.ᡤ +𐪒SS꣪.ᡤ; 𐪒ss꣪.ᡤ; [B2, B3]; xn--ss-tu9hw933a.xn--08e; ; ; # 𐪒ss꣪.ᡤ +𐪒ss꣪.ᡤ; 𐪒ss꣪.ᡤ; [B2, B3]; xn--ss-tu9hw933a.xn--08e; ; ; # 𐪒ss꣪.ᡤ +𐪒Ss꣪.ᡤ; 𐪒ss꣪.ᡤ; [B2, B3]; xn--ss-tu9hw933a.xn--08e; ; ; # 𐪒ss꣪.ᡤ +𐪒Ss꣪.ᡤ; 𐪒ss꣪.ᡤ; [B2, B3]; xn--ss-tu9hw933a.xn--08e; ; ; # 𐪒ss꣪.ᡤ +𐨿󠆌鸮𑚶.ς; 𐨿鸮𑚶.ς; [V5]; xn--l76a726rt2h.xn--3xa; ; xn--l76a726rt2h.xn--4xa; # 𐨿鸮𑚶.ς +𐨿󠆌鸮𑚶.Σ; 𐨿鸮𑚶.σ; [V5]; xn--l76a726rt2h.xn--4xa; ; ; # 𐨿鸮𑚶.σ +𐨿󠆌鸮𑚶.σ; 𐨿鸮𑚶.σ; [V5]; xn--l76a726rt2h.xn--4xa; ; ; # 𐨿鸮𑚶.σ +xn--l76a726rt2h.xn--4xa; 𐨿鸮𑚶.σ; [V5]; xn--l76a726rt2h.xn--4xa; ; ; # 𐨿鸮𑚶.σ +xn--l76a726rt2h.xn--3xa; 𐨿鸮𑚶.ς; [V5]; xn--l76a726rt2h.xn--3xa; ; ; # 𐨿鸮𑚶.ς +⒗𞤬。-𑚶; ⒗𞤬.-𑚶; [B1, P1, V3, V6]; xn--8shw466n.xn----4j0j; ; ; # ⒗𞤬.-𑚶 +16.𞤬。-𑚶; 16.𞤬.-𑚶; [B1, V3]; 16.xn--ke6h.xn----4j0j; ; ; # 16.𞤬.-𑚶 +16.𞤊。-𑚶; 16.𞤬.-𑚶; [B1, V3]; 16.xn--ke6h.xn----4j0j; ; ; # 16.𞤬.-𑚶 +16.xn--ke6h.xn----4j0j; 16.𞤬.-𑚶; [B1, V3]; 16.xn--ke6h.xn----4j0j; ; ; # 16.𞤬.-𑚶 +⒗𞤊。-𑚶; ⒗𞤬.-𑚶; [B1, P1, V3, V6]; xn--8shw466n.xn----4j0j; ; ; # ⒗𞤬.-𑚶 +xn--8shw466n.xn----4j0j; ⒗𞤬.-𑚶; [B1, V3, V6]; xn--8shw466n.xn----4j0j; ; ; # ⒗𞤬.-𑚶 +ࢳ𞤿⾫。𐹣ڏ⒈; ࢳ𞤿隹.𐹣ڏ⒈; [B1, B2, B3, P1, V6]; xn--8yb0383efiwk.xn--ljb064mol4n; ; ; # ࢳ𞤿隹.𐹣ڏ⒈ +ࢳ𞤿隹。𐹣ڏ1.; ࢳ𞤿隹.𐹣ڏ1.; [B1, B2, B3]; xn--8yb0383efiwk.xn--1-wsc3373r.; ; ; # ࢳ𞤿隹.𐹣ڏ1. +ࢳ𞤝隹。𐹣ڏ1.; ࢳ𞤿隹.𐹣ڏ1.; [B1, B2, B3]; xn--8yb0383efiwk.xn--1-wsc3373r.; ; ; # ࢳ𞤿隹.𐹣ڏ1. +xn--8yb0383efiwk.xn--1-wsc3373r.; ࢳ𞤿隹.𐹣ڏ1.; [B1, B2, B3]; xn--8yb0383efiwk.xn--1-wsc3373r.; ; ; # ࢳ𞤿隹.𐹣ڏ1. +ࢳ𞤝⾫。𐹣ڏ⒈; ࢳ𞤿隹.𐹣ڏ⒈; [B1, B2, B3, P1, V6]; xn--8yb0383efiwk.xn--ljb064mol4n; ; ; # ࢳ𞤿隹.𐹣ڏ⒈ +xn--8yb0383efiwk.xn--ljb064mol4n; ࢳ𞤿隹.𐹣ڏ⒈; [B1, B2, B3, V6]; xn--8yb0383efiwk.xn--ljb064mol4n; ; ; # ࢳ𞤿隹.𐹣ڏ⒈ +␳𚎛𝟧١.ᡢ8ི؀; ␳𚎛5١.ᡢ8ི؀; [B5, B6, P1, V6]; xn--5-bqc410un435a.xn--8-rkc763epjj; ; ; # 5١.ᡢ8ི +␳𚎛5١.ᡢ8ི؀; ; [B5, B6, P1, V6]; xn--5-bqc410un435a.xn--8-rkc763epjj; ; ; # 5١.ᡢ8ི +xn--5-bqc410un435a.xn--8-rkc763epjj; ␳𚎛5١.ᡢ8ི؀; [B5, B6, V6]; xn--5-bqc410un435a.xn--8-rkc763epjj; ; ; # 5١.ᡢ8ི +𐹠.🄀⒒-󨰈; ; [B1, P1, V6]; xn--7n0d.xn----xcp9757q1s13g; ; ; # 𐹠.🄀⒒- +𐹠.0.11.-󨰈; ; [B1, P1, V3, V6]; xn--7n0d.0.11.xn----8j07m; ; ; # 𐹠.0.11.- +xn--7n0d.0.11.xn----8j07m; 𐹠.0.11.-󨰈; [B1, V3, V6]; xn--7n0d.0.11.xn----8j07m; ; ; # 𐹠.0.11.- +xn--7n0d.xn----xcp9757q1s13g; 𐹠.🄀⒒-󨰈; [B1, V6]; xn--7n0d.xn----xcp9757q1s13g; ; ; # 𐹠.🄀⒒- +ς-。‌𝟭-; ς-.‌1-; [C1, V3]; xn----xmb.xn--1--i1t; ; xn----zmb.1-; [V3] # ς-.1- +ς-。‌1-; ς-.‌1-; [C1, V3]; xn----xmb.xn--1--i1t; ; xn----zmb.1-; [V3] # ς-.1- +Σ-。‌1-; σ-.‌1-; [C1, V3]; xn----zmb.xn--1--i1t; ; xn----zmb.1-; [V3] # σ-.1- +σ-。‌1-; σ-.‌1-; [C1, V3]; xn----zmb.xn--1--i1t; ; xn----zmb.1-; [V3] # σ-.1- +xn----zmb.1-; σ-.1-; [V3]; xn----zmb.1-; ; ; # σ-.1- +xn----zmb.xn--1--i1t; σ-.‌1-; [C1, V3]; xn----zmb.xn--1--i1t; ; ; # σ-.1- +xn----xmb.xn--1--i1t; ς-.‌1-; [C1, V3]; xn----xmb.xn--1--i1t; ; ; # ς-.1- +Σ-。‌𝟭-; σ-.‌1-; [C1, V3]; xn----zmb.xn--1--i1t; ; xn----zmb.1-; [V3] # σ-.1- +σ-。‌𝟭-; σ-.‌1-; [C1, V3]; xn----zmb.xn--1--i1t; ; xn----zmb.1-; [V3] # σ-.1- +᜴-ೢ.󠄩Ⴄ; ᜴-ೢ.Ⴄ; [P1, V5, V6]; xn----ggf830f.xn--cnd; ; ; # ᜴-ೢ.Ⴄ +᜴-ೢ.󠄩Ⴄ; ᜴-ೢ.Ⴄ; [P1, V5, V6]; xn----ggf830f.xn--cnd; ; ; # ᜴-ೢ.Ⴄ +᜴-ೢ.󠄩ⴄ; ᜴-ೢ.ⴄ; [V5]; xn----ggf830f.xn--vkj; ; ; # ᜴-ೢ.ⴄ +xn----ggf830f.xn--vkj; ᜴-ೢ.ⴄ; [V5]; xn----ggf830f.xn--vkj; ; ; # ᜴-ೢ.ⴄ +xn----ggf830f.xn--cnd; ᜴-ೢ.Ⴄ; [V5, V6]; xn----ggf830f.xn--cnd; ; ; # ᜴-ೢ.Ⴄ +᜴-ೢ.󠄩ⴄ; ᜴-ೢ.ⴄ; [V5]; xn----ggf830f.xn--vkj; ; ; # ᜴-ೢ.ⴄ +򭈗♋ڻ𐦥。॔⒈; 򭈗♋ڻ𐦥.॔⒈; [B1, B5, B6, P1, V5, V6]; xn--ukb372n129m3rs7f.xn--u3b240l; ; ; # ♋ڻ𐦥.॔⒈ +򭈗♋ڻ𐦥。॔1.; 򭈗♋ڻ𐦥.॔1.; [B1, B5, B6, P1, V5, V6]; xn--ukb372n129m3rs7f.xn--1-fyd.; ; ; # ♋ڻ𐦥.॔1. +xn--ukb372n129m3rs7f.xn--1-fyd.; 򭈗♋ڻ𐦥.॔1.; [B1, B5, B6, V5, V6]; xn--ukb372n129m3rs7f.xn--1-fyd.; ; ; # ♋ڻ𐦥.॔1. +xn--ukb372n129m3rs7f.xn--u3b240l; 򭈗♋ڻ𐦥.॔⒈; [B1, B5, B6, V5, V6]; xn--ukb372n129m3rs7f.xn--u3b240l; ; ; # ♋ڻ𐦥.॔⒈ +֤.ہ᪳‌; ֤.ہ᪳‌; [B1, B3, B6, C1, V5]; xn--vcb.xn--0kb623hm1d; ; xn--vcb.xn--0kb623h; [B1, B3, B6, V5] # ֤.ہ᪳ +֤.ہ᪳‌; ; [B1, B3, B6, C1, V5]; xn--vcb.xn--0kb623hm1d; ; xn--vcb.xn--0kb623h; [B1, B3, B6, V5] # ֤.ہ᪳ +xn--vcb.xn--0kb623h; ֤.ہ᪳; [B1, B3, B6, V5]; xn--vcb.xn--0kb623h; ; ; # ֤.ہ᪳ +xn--vcb.xn--0kb623hm1d; ֤.ہ᪳‌; [B1, B3, B6, C1, V5]; xn--vcb.xn--0kb623hm1d; ; ; # ֤.ہ᪳ +񢭏ࡆ≮્.𞦊; 񢭏ࡆ≮્.𞦊; [B5, B6, P1, V6]; xn--4vb80kq29ayo62l.xn--8g6h; ; ; # ࡆ≮્. +񢭏ࡆ≮્.𞦊; 񢭏ࡆ≮્.𞦊; [B5, B6, P1, V6]; xn--4vb80kq29ayo62l.xn--8g6h; ; ; # ࡆ≮્. +񢭏ࡆ≮્.𞦊; ; [B5, B6, P1, V6]; xn--4vb80kq29ayo62l.xn--8g6h; ; ; # ࡆ≮્. +񢭏ࡆ≮્.𞦊; 񢭏ࡆ≮્.𞦊; [B5, B6, P1, V6]; xn--4vb80kq29ayo62l.xn--8g6h; ; ; # ࡆ≮્. +xn--4vb80kq29ayo62l.xn--8g6h; 񢭏ࡆ≮્.𞦊; [B5, B6, V6]; xn--4vb80kq29ayo62l.xn--8g6h; ; ; # ࡆ≮્. +‍。𞀘⒈ꡍ擉; ‍.𞀘⒈ꡍ擉; [C2, P1, V5, V6]; xn--1ug.xn--tsh026uql4bew9p; ; .xn--tsh026uql4bew9p; [P1, V5, V6, A4_2] # .𞀘⒈ꡍ擉 +‍。𞀘1.ꡍ擉; ‍.𞀘1.ꡍ擉; [C2, V5]; xn--1ug.xn--1-1p4r.xn--s7uv61m; ; .xn--1-1p4r.xn--s7uv61m; [V5, A4_2] # .𞀘1.ꡍ擉 +.xn--1-1p4r.xn--s7uv61m; .𞀘1.ꡍ擉; [V5, X4_2]; .xn--1-1p4r.xn--s7uv61m; [V5, A4_2]; ; # .𞀘1.ꡍ擉 +xn--1ug.xn--1-1p4r.xn--s7uv61m; ‍.𞀘1.ꡍ擉; [C2, V5]; xn--1ug.xn--1-1p4r.xn--s7uv61m; ; ; # .𞀘1.ꡍ擉 +.xn--tsh026uql4bew9p; .𞀘⒈ꡍ擉; [V5, V6, X4_2]; .xn--tsh026uql4bew9p; [V5, V6, A4_2]; ; # .𞀘⒈ꡍ擉 +xn--1ug.xn--tsh026uql4bew9p; ‍.𞀘⒈ꡍ擉; [C2, V5, V6]; xn--1ug.xn--tsh026uql4bew9p; ; ; # .𞀘⒈ꡍ擉 +₈ߋ.ﭤ≠; 8ߋ.ٿ≠; [B1, B3, P1, V6]; xn--8-zbd.xn--4ib883l; ; ; # 8ߋ.ٿ≠ +₈ߋ.ﭤ≠; 8ߋ.ٿ≠; [B1, B3, P1, V6]; xn--8-zbd.xn--4ib883l; ; ; # 8ߋ.ٿ≠ +8ߋ.ٿ≠; ; [B1, B3, P1, V6]; xn--8-zbd.xn--4ib883l; ; ; # 8ߋ.ٿ≠ +8ߋ.ٿ≠; 8ߋ.ٿ≠; [B1, B3, P1, V6]; xn--8-zbd.xn--4ib883l; ; ; # 8ߋ.ٿ≠ +xn--8-zbd.xn--4ib883l; 8ߋ.ٿ≠; [B1, B3, V6]; xn--8-zbd.xn--4ib883l; ; ; # 8ߋ.ٿ≠ +ᢡߞ򹐣.⒒ق𑍦; ; [B1, B5, P1, V6]; xn--5sb596fi873t.xn--ehb336mvy7n; ; ; # ᢡߞ.⒒ق𑍦 +ᢡߞ򹐣.11.ق𑍦; ; [B1, B5, P1, V6]; xn--5sb596fi873t.11.xn--ehb4198k; ; ; # ᢡߞ.11.ق𑍦 +xn--5sb596fi873t.11.xn--ehb4198k; ᢡߞ򹐣.11.ق𑍦; [B1, B5, V6]; xn--5sb596fi873t.11.xn--ehb4198k; ; ; # ᢡߞ.11.ق𑍦 +xn--5sb596fi873t.xn--ehb336mvy7n; ᢡߞ򹐣.⒒ق𑍦; [B1, B5, V6]; xn--5sb596fi873t.xn--ehb336mvy7n; ; ; # ᢡߞ.⒒ق𑍦 +่-𐹺𝟜.ͣۡ⒏; ่-𐹺4.ͣۡ⒏; [B1, P1, V5, V6]; xn---4-owiz479s.xn--eva20pjv9a; ; ; # ่-𐹺4.ͣۡ⒏ +่-𐹺4.ͣۡ8.; ; [B1, V5]; xn---4-owiz479s.xn--8-ihb69x.; ; ; # ่-𐹺4.ͣۡ8. +xn---4-owiz479s.xn--8-ihb69x.; ่-𐹺4.ͣۡ8.; [B1, V5]; xn---4-owiz479s.xn--8-ihb69x.; ; ; # ่-𐹺4.ͣۡ8. +xn---4-owiz479s.xn--eva20pjv9a; ่-𐹺4.ͣۡ⒏; [B1, V5, V6]; xn---4-owiz479s.xn--eva20pjv9a; ; ; # ่-𐹺4.ͣۡ⒏ +⫐。Ⴠ-󃐢; ⫐.Ⴠ-󃐢; [P1, V6]; xn--r3i.xn----z1g58579u; ; ; # ⫐.Ⴠ- +⫐。Ⴠ-󃐢; ⫐.Ⴠ-󃐢; [P1, V6]; xn--r3i.xn----z1g58579u; ; ; # ⫐.Ⴠ- +⫐。ⴠ-󃐢; ⫐.ⴠ-󃐢; [P1, V6]; xn--r3i.xn----2wst7439i; ; ; # ⫐.ⴠ- +xn--r3i.xn----2wst7439i; ⫐.ⴠ-󃐢; [V6]; xn--r3i.xn----2wst7439i; ; ; # ⫐.ⴠ- +xn--r3i.xn----z1g58579u; ⫐.Ⴠ-󃐢; [V6]; xn--r3i.xn----z1g58579u; ; ; # ⫐.Ⴠ- +⫐。ⴠ-󃐢; ⫐.ⴠ-󃐢; [P1, V6]; xn--r3i.xn----2wst7439i; ; ; # ⫐.ⴠ- +𑑂◊.⦟∠; 𑑂◊.⦟∠; [V5]; xn--01h3338f.xn--79g270a; ; ; # 𑑂◊.⦟∠ +𑑂◊.⦟∠; ; [V5]; xn--01h3338f.xn--79g270a; ; ; # 𑑂◊.⦟∠ +xn--01h3338f.xn--79g270a; 𑑂◊.⦟∠; [V5]; xn--01h3338f.xn--79g270a; ; ; # 𑑂◊.⦟∠ +𿌰-٢。󋸛ꡂ; 𿌰-٢.󋸛ꡂ; [B5, B6, P1, V6]; xn----dqc20828e.xn--bc9an2879c; ; ; # -٢.ꡂ +xn----dqc20828e.xn--bc9an2879c; 𿌰-٢.󋸛ꡂ; [B5, B6, V6]; xn----dqc20828e.xn--bc9an2879c; ; ; # -٢.ꡂ +ٸ。󠏬݁𞪭𐹪; يٴ.󠏬݁𞪭𐹪; [B1, P1, V6]; xn--mhb8f.xn--oob2585kfdsfsbo7h; ; ; # يٴ.݁𐹪 +يٴ。󠏬݁𞪭𐹪; يٴ.󠏬݁𞪭𐹪; [B1, P1, V6]; xn--mhb8f.xn--oob2585kfdsfsbo7h; ; ; # يٴ.݁𐹪 +xn--mhb8f.xn--oob2585kfdsfsbo7h; يٴ.󠏬݁𞪭𐹪; [B1, V6]; xn--mhb8f.xn--oob2585kfdsfsbo7h; ; ; # يٴ.݁𐹪 +𐫆ꌄ。‍ᣬ; 𐫆ꌄ.‍ᣬ; [B1, B2, B3, C2]; xn--y77ao18q.xn--wdf367a; ; xn--y77ao18q.xn--wdf; [B2, B3] # 𐫆ꌄ.ᣬ +𐫆ꌄ。‍ᣬ; 𐫆ꌄ.‍ᣬ; [B1, B2, B3, C2]; xn--y77ao18q.xn--wdf367a; ; xn--y77ao18q.xn--wdf; [B2, B3] # 𐫆ꌄ.ᣬ +xn--y77ao18q.xn--wdf; 𐫆ꌄ.ᣬ; [B2, B3]; xn--y77ao18q.xn--wdf; ; ; # 𐫆ꌄ.ᣬ +xn--y77ao18q.xn--wdf367a; 𐫆ꌄ.‍ᣬ; [B1, B2, B3, C2]; xn--y77ao18q.xn--wdf367a; ; ; # 𐫆ꌄ.ᣬ +₀٢。󅪞≯-; 0٢.󅪞≯-; [B1, B6, P1, V3, V6]; xn--0-dqc.xn----ogov3342l; ; ; # 0٢.≯- +₀٢。󅪞≯-; 0٢.󅪞≯-; [B1, B6, P1, V3, V6]; xn--0-dqc.xn----ogov3342l; ; ; # 0٢.≯- +0٢。󅪞≯-; 0٢.󅪞≯-; [B1, B6, P1, V3, V6]; xn--0-dqc.xn----ogov3342l; ; ; # 0٢.≯- +0٢。󅪞≯-; 0٢.󅪞≯-; [B1, B6, P1, V3, V6]; xn--0-dqc.xn----ogov3342l; ; ; # 0٢.≯- +xn--0-dqc.xn----ogov3342l; 0٢.󅪞≯-; [B1, B6, V3, V6]; xn--0-dqc.xn----ogov3342l; ; ; # 0٢.≯- +̜𐹫-𞯃.𐋤ࡅ; ; [B1, P1, V5, V6]; xn----gdb7046r692g.xn--3vb1349j; ; ; # ̜𐹫-.𐋤ࡅ +xn----gdb7046r692g.xn--3vb1349j; ̜𐹫-𞯃.𐋤ࡅ; [B1, V5, V6]; xn----gdb7046r692g.xn--3vb1349j; ; ; # ̜𐹫-.𐋤ࡅ +≠。𝩑𐹩Ⴡ֔; ≠.𝩑𐹩Ⴡ֔; [B1, P1, V5, V6]; xn--1ch.xn--fcb538c649rypog; ; ; # ≠.𝩑𐹩Ⴡ֔ +≠。𝩑𐹩Ⴡ֔; ≠.𝩑𐹩Ⴡ֔; [B1, P1, V5, V6]; xn--1ch.xn--fcb538c649rypog; ; ; # ≠.𝩑𐹩Ⴡ֔ +≠。𝩑𐹩Ⴡ֔; ≠.𝩑𐹩Ⴡ֔; [B1, P1, V5, V6]; xn--1ch.xn--fcb538c649rypog; ; ; # ≠.𝩑𐹩Ⴡ֔ +≠。𝩑𐹩Ⴡ֔; ≠.𝩑𐹩Ⴡ֔; [B1, P1, V5, V6]; xn--1ch.xn--fcb538c649rypog; ; ; # ≠.𝩑𐹩Ⴡ֔ +≠。𝩑𐹩ⴡ֔; ≠.𝩑𐹩ⴡ֔; [B1, P1, V5, V6]; xn--1ch.xn--fcb363rk03mypug; ; ; # ≠.𝩑𐹩ⴡ֔ +≠。𝩑𐹩ⴡ֔; ≠.𝩑𐹩ⴡ֔; [B1, P1, V5, V6]; xn--1ch.xn--fcb363rk03mypug; ; ; # ≠.𝩑𐹩ⴡ֔ +xn--1ch.xn--fcb363rk03mypug; ≠.𝩑𐹩ⴡ֔; [B1, V5, V6]; xn--1ch.xn--fcb363rk03mypug; ; ; # ≠.𝩑𐹩ⴡ֔ +xn--1ch.xn--fcb538c649rypog; ≠.𝩑𐹩Ⴡ֔; [B1, V5, V6]; xn--1ch.xn--fcb538c649rypog; ; ; # ≠.𝩑𐹩Ⴡ֔ +≠。𝩑𐹩ⴡ֔; ≠.𝩑𐹩ⴡ֔; [B1, P1, V5, V6]; xn--1ch.xn--fcb363rk03mypug; ; ; # ≠.𝩑𐹩ⴡ֔ +≠。𝩑𐹩ⴡ֔; ≠.𝩑𐹩ⴡ֔; [B1, P1, V5, V6]; xn--1ch.xn--fcb363rk03mypug; ; ; # ≠.𝩑𐹩ⴡ֔ +𖫳≠.Ⴀ𐮀; ; [B1, B5, B6, P1, V5, V6]; xn--1ch9250k.xn--7md2659j; ; ; # 𖫳≠.Ⴀ𐮀 +𖫳≠.Ⴀ𐮀; 𖫳≠.Ⴀ𐮀; [B1, B5, B6, P1, V5, V6]; xn--1ch9250k.xn--7md2659j; ; ; # 𖫳≠.Ⴀ𐮀 +𖫳≠.ⴀ𐮀; 𖫳≠.ⴀ𐮀; [B1, B5, B6, P1, V5, V6]; xn--1ch9250k.xn--rkj6232e; ; ; # 𖫳≠.ⴀ𐮀 +𖫳≠.ⴀ𐮀; ; [B1, B5, B6, P1, V5, V6]; xn--1ch9250k.xn--rkj6232e; ; ; # 𖫳≠.ⴀ𐮀 +xn--1ch9250k.xn--rkj6232e; 𖫳≠.ⴀ𐮀; [B1, B5, B6, V5, V6]; xn--1ch9250k.xn--rkj6232e; ; ; # 𖫳≠.ⴀ𐮀 +xn--1ch9250k.xn--7md2659j; 𖫳≠.Ⴀ𐮀; [B1, B5, B6, V5, V6]; xn--1ch9250k.xn--7md2659j; ; ; # 𖫳≠.Ⴀ𐮀 +󠅾ܶܦ.ᢚ閪࣢𝩟; ܶܦ.ᢚ閪࣢𝩟; [B1, B5, B6, P1, V5, V6]; xn--wnb5a.xn--l0b161fis8gbp5m; ; ; # ܶܦ.ᢚ閪𝩟 +󠅾ܶܦ.ᢚ閪࣢𝩟; ܶܦ.ᢚ閪࣢𝩟; [B1, B5, B6, P1, V5, V6]; xn--wnb5a.xn--l0b161fis8gbp5m; ; ; # ܶܦ.ᢚ閪𝩟 +xn--wnb5a.xn--l0b161fis8gbp5m; ܶܦ.ᢚ閪࣢𝩟; [B1, B5, B6, V5, V6]; xn--wnb5a.xn--l0b161fis8gbp5m; ; ; # ܶܦ.ᢚ閪𝩟 +‍󠇜ۋ꣩。⃝ྰ-ᛟ; ‍ۋ꣩.⃝ྰ-ᛟ; [B1, C2, V5]; xn--blb540ke10h.xn----gmg236cj6k; ; xn--blb8114f.xn----gmg236cj6k; [B1, V5] # ۋ꣩.⃝ྰ-ᛟ +‍󠇜ۋ꣩。⃝ྰ-ᛟ; ‍ۋ꣩.⃝ྰ-ᛟ; [B1, C2, V5]; xn--blb540ke10h.xn----gmg236cj6k; ; xn--blb8114f.xn----gmg236cj6k; [B1, V5] # ۋ꣩.⃝ྰ-ᛟ +xn--blb8114f.xn----gmg236cj6k; ۋ꣩.⃝ྰ-ᛟ; [B1, V5]; xn--blb8114f.xn----gmg236cj6k; ; ; # ۋ꣩.⃝ྰ-ᛟ +xn--blb540ke10h.xn----gmg236cj6k; ‍ۋ꣩.⃝ྰ-ᛟ; [B1, C2, V5]; xn--blb540ke10h.xn----gmg236cj6k; ; ; # ۋ꣩.⃝ྰ-ᛟ +헁󘖙ฺ󚍚。ں𝟜; 헁󘖙ฺ󚍚.ں4; [P1, V6]; xn--o4c1723h8g85gt4ya.xn--4-dvc; ; ; # 헁ฺ.ں4 +헁󘖙ฺ󚍚。ں𝟜; 헁󘖙ฺ󚍚.ں4; [P1, V6]; xn--o4c1723h8g85gt4ya.xn--4-dvc; ; ; # 헁ฺ.ں4 +헁󘖙ฺ󚍚。ں4; 헁󘖙ฺ󚍚.ں4; [P1, V6]; xn--o4c1723h8g85gt4ya.xn--4-dvc; ; ; # 헁ฺ.ں4 +헁󘖙ฺ󚍚。ں4; 헁󘖙ฺ󚍚.ں4; [P1, V6]; xn--o4c1723h8g85gt4ya.xn--4-dvc; ; ; # 헁ฺ.ں4 +xn--o4c1723h8g85gt4ya.xn--4-dvc; 헁󘖙ฺ󚍚.ں4; [V6]; xn--o4c1723h8g85gt4ya.xn--4-dvc; ; ; # 헁ฺ.ں4 +𐹭。󃱂‌Ⴞ; 𐹭.󃱂‌Ⴞ; [B1, C1, P1, V6]; xn--lo0d.xn--2nd949eqw95u; ; xn--lo0d.xn--2nd75260n; [B1, P1, V6] # 𐹭.Ⴞ +𐹭。󃱂‌Ⴞ; 𐹭.󃱂‌Ⴞ; [B1, C1, P1, V6]; xn--lo0d.xn--2nd949eqw95u; ; xn--lo0d.xn--2nd75260n; [B1, P1, V6] # 𐹭.Ⴞ +𐹭。󃱂‌ⴞ; 𐹭.󃱂‌ⴞ; [B1, C1, P1, V6]; xn--lo0d.xn--0ugx72cwi33v; ; xn--lo0d.xn--mljx1099g; [B1, P1, V6] # 𐹭.ⴞ +xn--lo0d.xn--mljx1099g; 𐹭.󃱂ⴞ; [B1, V6]; xn--lo0d.xn--mljx1099g; ; ; # 𐹭.ⴞ +xn--lo0d.xn--0ugx72cwi33v; 𐹭.󃱂‌ⴞ; [B1, C1, V6]; xn--lo0d.xn--0ugx72cwi33v; ; ; # 𐹭.ⴞ +xn--lo0d.xn--2nd75260n; 𐹭.󃱂Ⴞ; [B1, V6]; xn--lo0d.xn--2nd75260n; ; ; # 𐹭.Ⴞ +xn--lo0d.xn--2nd949eqw95u; 𐹭.󃱂‌Ⴞ; [B1, C1, V6]; xn--lo0d.xn--2nd949eqw95u; ; ; # 𐹭.Ⴞ +𐹭。󃱂‌ⴞ; 𐹭.󃱂‌ⴞ; [B1, C1, P1, V6]; xn--lo0d.xn--0ugx72cwi33v; ; xn--lo0d.xn--mljx1099g; [B1, P1, V6] # 𐹭.ⴞ +꥓.̽𑂽馋; ; [P1, V5, V6]; xn--3j9a.xn--bua0708eqzrd; ; ; # ꥓.̽馋 +xn--3j9a.xn--bua0708eqzrd; ꥓.̽𑂽馋; [V5, V6]; xn--3j9a.xn--bua0708eqzrd; ; ; # ꥓.̽馋 +󈫝򪛸‍。䜖; 󈫝򪛸‍.䜖; [C2, P1, V6]; xn--1ug30527h9mxi.xn--k0o; ; xn--g138cxw05a.xn--k0o; [P1, V6] # .䜖 +󈫝򪛸‍。䜖; 󈫝򪛸‍.䜖; [C2, P1, V6]; xn--1ug30527h9mxi.xn--k0o; ; xn--g138cxw05a.xn--k0o; [P1, V6] # .䜖 +xn--g138cxw05a.xn--k0o; 󈫝򪛸.䜖; [V6]; xn--g138cxw05a.xn--k0o; ; ; # .䜖 +xn--1ug30527h9mxi.xn--k0o; 󈫝򪛸‍.䜖; [C2, V6]; xn--1ug30527h9mxi.xn--k0o; ; ; # .䜖 +ᡯ⚉姶🄉.۷‍🎪‍; ᡯ⚉姶🄉.۷‍🎪‍; [C2, P1, V6]; xn--c9e433epi4b3j20a.xn--kmb859ja94998b; ; xn--c9e433epi4b3j20a.xn--kmb6733w; [P1, V6] # ᡯ⚉姶🄉.۷🎪 +ᡯ⚉姶8,.۷‍🎪‍; ; [C2, P1, V6]; xn--8,-g9oy26fzu4d.xn--kmb859ja94998b; ; xn--8,-g9oy26fzu4d.xn--kmb6733w; [P1, V6] # ᡯ⚉姶8,.۷🎪 +xn--8,-g9oy26fzu4d.xn--kmb6733w; ᡯ⚉姶8,.۷🎪; [P1, V6]; xn--8,-g9oy26fzu4d.xn--kmb6733w; ; ; # ᡯ⚉姶8,.۷🎪 +xn--8,-g9oy26fzu4d.xn--kmb859ja94998b; ᡯ⚉姶8,.۷‍🎪‍; [C2, P1, V6]; xn--8,-g9oy26fzu4d.xn--kmb859ja94998b; ; ; # ᡯ⚉姶8,.۷🎪 +xn--c9e433epi4b3j20a.xn--kmb6733w; ᡯ⚉姶🄉.۷🎪; [V6]; xn--c9e433epi4b3j20a.xn--kmb6733w; ; ; # ᡯ⚉姶🄉.۷🎪 +xn--c9e433epi4b3j20a.xn--kmb859ja94998b; ᡯ⚉姶🄉.۷‍🎪‍; [C2, V6]; xn--c9e433epi4b3j20a.xn--kmb859ja94998b; ; ; # ᡯ⚉姶🄉.۷🎪 +𞽀.𐹸🚖ฺ; ; [B1, P1, V6]; xn--0n7h.xn--o4c9032klszf; ; ; # .𐹸🚖ฺ +xn--0n7h.xn--o4c9032klszf; 𞽀.𐹸🚖ฺ; [B1, V6]; xn--0n7h.xn--o4c9032klszf; ; ; # .𐹸🚖ฺ +Ⴔᠵ。𐹧݇۹; Ⴔᠵ.𐹧݇۹; [B1, P1, V6]; xn--snd659a.xn--mmb9ml895e; ; ; # Ⴔᠵ.𐹧݇۹ +Ⴔᠵ。𐹧݇۹; Ⴔᠵ.𐹧݇۹; [B1, P1, V6]; xn--snd659a.xn--mmb9ml895e; ; ; # Ⴔᠵ.𐹧݇۹ +ⴔᠵ。𐹧݇۹; ⴔᠵ.𐹧݇۹; [B1]; xn--o7e997h.xn--mmb9ml895e; ; ; # ⴔᠵ.𐹧݇۹ +xn--o7e997h.xn--mmb9ml895e; ⴔᠵ.𐹧݇۹; [B1]; xn--o7e997h.xn--mmb9ml895e; ; ; # ⴔᠵ.𐹧݇۹ +xn--snd659a.xn--mmb9ml895e; Ⴔᠵ.𐹧݇۹; [B1, V6]; xn--snd659a.xn--mmb9ml895e; ; ; # Ⴔᠵ.𐹧݇۹ +ⴔᠵ。𐹧݇۹; ⴔᠵ.𐹧݇۹; [B1]; xn--o7e997h.xn--mmb9ml895e; ; ; # ⴔᠵ.𐹧݇۹ +፟ᡈ‌.︒-𖾐-; ፟ᡈ‌.︒-𖾐-; [C1, P1, V3, V5, V6]; xn--b7d82wo4h.xn-----c82nz547a; ; xn--b7d82w.xn-----c82nz547a; [P1, V3, V5, V6] # ፟ᡈ.︒-𖾐- +፟ᡈ‌.。-𖾐-; ፟ᡈ‌..-𖾐-; [C1, V3, V5, X4_2]; xn--b7d82wo4h..xn-----pe4u; [C1, V3, V5, A4_2]; xn--b7d82w..xn-----pe4u; [V3, V5, A4_2] # ፟ᡈ..-𖾐- +xn--b7d82w..xn-----pe4u; ፟ᡈ..-𖾐-; [V3, V5, X4_2]; xn--b7d82w..xn-----pe4u; [V3, V5, A4_2]; ; # ፟ᡈ..-𖾐- +xn--b7d82wo4h..xn-----pe4u; ፟ᡈ‌..-𖾐-; [C1, V3, V5, X4_2]; xn--b7d82wo4h..xn-----pe4u; [C1, V3, V5, A4_2]; ; # ፟ᡈ..-𖾐- +xn--b7d82w.xn-----c82nz547a; ፟ᡈ.︒-𖾐-; [V3, V5, V6]; xn--b7d82w.xn-----c82nz547a; ; ; # ፟ᡈ.︒-𖾐- +xn--b7d82wo4h.xn-----c82nz547a; ፟ᡈ‌.︒-𖾐-; [C1, V3, V5, V6]; xn--b7d82wo4h.xn-----c82nz547a; ; ; # ፟ᡈ.︒-𖾐- +⒈؁⒖‌.ᷰߛ; ; [B1, C1, P1, V5, V6]; xn--jfb844kmfdwb.xn--2sb914i; ; xn--jfb347mib.xn--2sb914i; [B1, P1, V5, V6] # ⒈⒖.ᷰߛ +1.؁15.‌.ᷰߛ; ; [B1, C1, P1, V5, V6]; 1.xn--15-1pd.xn--0ug.xn--2sb914i; ; 1.xn--15-1pd..xn--2sb914i; [B1, P1, V5, V6, A4_2] # 1.15..ᷰߛ +1.xn--15-1pd..xn--2sb914i; 1.؁15..ᷰߛ; [B1, V5, V6, X4_2]; 1.xn--15-1pd..xn--2sb914i; [B1, V5, V6, A4_2]; ; # 1.15..ᷰߛ +1.xn--15-1pd.xn--0ug.xn--2sb914i; 1.؁15.‌.ᷰߛ; [B1, C1, V5, V6]; 1.xn--15-1pd.xn--0ug.xn--2sb914i; ; ; # 1.15..ᷰߛ +xn--jfb347mib.xn--2sb914i; ⒈؁⒖.ᷰߛ; [B1, V5, V6]; xn--jfb347mib.xn--2sb914i; ; ; # ⒈⒖.ᷰߛ +xn--jfb844kmfdwb.xn--2sb914i; ⒈؁⒖‌.ᷰߛ; [B1, C1, V5, V6]; xn--jfb844kmfdwb.xn--2sb914i; ; ; # ⒈⒖.ᷰߛ +𝩜。-୍Ⴋ; 𝩜.-୍Ⴋ; [P1, V3, V5, V6]; xn--792h.xn----bse632b; ; ; # 𝩜.-୍Ⴋ +𝩜。-୍ⴋ; 𝩜.-୍ⴋ; [V3, V5]; xn--792h.xn----bse820x; ; ; # 𝩜.-୍ⴋ +xn--792h.xn----bse820x; 𝩜.-୍ⴋ; [V3, V5]; xn--792h.xn----bse820x; ; ; # 𝩜.-୍ⴋ +xn--792h.xn----bse632b; 𝩜.-୍Ⴋ; [V3, V5, V6]; xn--792h.xn----bse632b; ; ; # 𝩜.-୍Ⴋ +ßჀ.ؠ刯Ⴝ; ; [B2, B3, P1, V6]; xn--zca442f.xn--fgb845cb66c; ; xn--ss-wgk.xn--fgb845cb66c; # ßჀ.ؠ刯Ⴝ +ßⴠ.ؠ刯ⴝ; ; [B2, B3]; xn--zca277t.xn--fgb670rovy; ; xn--ss-j81a.xn--fgb670rovy; # ßⴠ.ؠ刯ⴝ +SSჀ.ؠ刯Ⴝ; ssჀ.ؠ刯Ⴝ; [B2, B3, P1, V6]; xn--ss-wgk.xn--fgb845cb66c; ; ; # ssჀ.ؠ刯Ⴝ +ssⴠ.ؠ刯ⴝ; ; [B2, B3]; xn--ss-j81a.xn--fgb670rovy; ; ; # ssⴠ.ؠ刯ⴝ +Ssⴠ.ؠ刯Ⴝ; ssⴠ.ؠ刯Ⴝ; [B2, B3, P1, V6]; xn--ss-j81a.xn--fgb845cb66c; ; ; # ssⴠ.ؠ刯Ⴝ +xn--ss-j81a.xn--fgb845cb66c; ssⴠ.ؠ刯Ⴝ; [B2, B3, V6]; xn--ss-j81a.xn--fgb845cb66c; ; ; # ssⴠ.ؠ刯Ⴝ +xn--ss-j81a.xn--fgb670rovy; ssⴠ.ؠ刯ⴝ; [B2, B3]; xn--ss-j81a.xn--fgb670rovy; ; ; # ssⴠ.ؠ刯ⴝ +xn--ss-wgk.xn--fgb845cb66c; ssჀ.ؠ刯Ⴝ; [B2, B3, V6]; xn--ss-wgk.xn--fgb845cb66c; ; ; # ssჀ.ؠ刯Ⴝ +xn--zca277t.xn--fgb670rovy; ßⴠ.ؠ刯ⴝ; [B2, B3]; xn--zca277t.xn--fgb670rovy; ; ; # ßⴠ.ؠ刯ⴝ +xn--zca442f.xn--fgb845cb66c; ßჀ.ؠ刯Ⴝ; [B2, B3, V6]; xn--zca442f.xn--fgb845cb66c; ; ; # ßჀ.ؠ刯Ⴝ +᮪ႣℲ。ᠳ툻ٳ; ᮪ႣℲ.ᠳ툻ٳ; [B5, B6, P1, V5, V6]; xn--bnd957cone.xn--sib102gc69k; ; ; # ᮪ႣℲ.ᠳ툻ٳ +᮪ႣℲ。ᠳ툻ٳ; ᮪ႣℲ.ᠳ툻ٳ; [B5, B6, P1, V5, V6]; xn--bnd957cone.xn--sib102gc69k; ; ; # ᮪ႣℲ.ᠳ툻ٳ +᮪ႣℲ。ᠳ툻ٳ; ᮪ႣℲ.ᠳ툻ٳ; [B5, B6, P1, V5, V6]; xn--bnd957cone.xn--sib102gc69k; ; ; # ᮪ႣℲ.ᠳ툻ٳ +᮪ႣℲ。ᠳ툻ٳ; ᮪ႣℲ.ᠳ툻ٳ; [B5, B6, P1, V5, V6]; xn--bnd957cone.xn--sib102gc69k; ; ; # ᮪ႣℲ.ᠳ툻ٳ +᮪ⴃⅎ。ᠳ툻ٳ; ᮪ⴃⅎ.ᠳ툻ٳ; [B5, B6, V5]; xn--yxf24x4ol.xn--sib102gc69k; ; ; # ᮪ⴃⅎ.ᠳ툻ٳ +᮪ⴃⅎ。ᠳ툻ٳ; ᮪ⴃⅎ.ᠳ툻ٳ; [B5, B6, V5]; xn--yxf24x4ol.xn--sib102gc69k; ; ; # ᮪ⴃⅎ.ᠳ툻ٳ +᮪Ⴃⅎ。ᠳ툻ٳ; ᮪Ⴃⅎ.ᠳ툻ٳ; [B5, B6, P1, V5, V6]; xn--bnd957c2pe.xn--sib102gc69k; ; ; # ᮪Ⴃⅎ.ᠳ툻ٳ +᮪Ⴃⅎ。ᠳ툻ٳ; ᮪Ⴃⅎ.ᠳ툻ٳ; [B5, B6, P1, V5, V6]; xn--bnd957c2pe.xn--sib102gc69k; ; ; # ᮪Ⴃⅎ.ᠳ툻ٳ +xn--bnd957c2pe.xn--sib102gc69k; ᮪Ⴃⅎ.ᠳ툻ٳ; [B5, B6, V5, V6]; xn--bnd957c2pe.xn--sib102gc69k; ; ; # ᮪Ⴃⅎ.ᠳ툻ٳ +xn--yxf24x4ol.xn--sib102gc69k; ᮪ⴃⅎ.ᠳ툻ٳ; [B5, B6, V5]; xn--yxf24x4ol.xn--sib102gc69k; ; ; # ᮪ⴃⅎ.ᠳ툻ٳ +xn--bnd957cone.xn--sib102gc69k; ᮪ႣℲ.ᠳ툻ٳ; [B5, B6, V5, V6]; xn--bnd957cone.xn--sib102gc69k; ; ; # ᮪ႣℲ.ᠳ툻ٳ +᮪ⴃⅎ。ᠳ툻ٳ; ᮪ⴃⅎ.ᠳ툻ٳ; [B5, B6, V5]; xn--yxf24x4ol.xn--sib102gc69k; ; ; # ᮪ⴃⅎ.ᠳ툻ٳ +᮪ⴃⅎ。ᠳ툻ٳ; ᮪ⴃⅎ.ᠳ툻ٳ; [B5, B6, V5]; xn--yxf24x4ol.xn--sib102gc69k; ; ; # ᮪ⴃⅎ.ᠳ툻ٳ +᮪Ⴃⅎ。ᠳ툻ٳ; ᮪Ⴃⅎ.ᠳ툻ٳ; [B5, B6, P1, V5, V6]; xn--bnd957c2pe.xn--sib102gc69k; ; ; # ᮪Ⴃⅎ.ᠳ툻ٳ +᮪Ⴃⅎ。ᠳ툻ٳ; ᮪Ⴃⅎ.ᠳ툻ٳ; [B5, B6, P1, V5, V6]; xn--bnd957c2pe.xn--sib102gc69k; ; ; # ᮪Ⴃⅎ.ᠳ툻ٳ +۬.ࢢ𐹫ټ; ; [B1, B3, B6, V5]; xn--8lb.xn--1ib31ily45b; ; ; # ۬.ࢢ𐹫ټ +xn--8lb.xn--1ib31ily45b; ۬.ࢢ𐹫ټ; [B1, B3, B6, V5]; xn--8lb.xn--1ib31ily45b; ; ; # ۬.ࢢ𐹫ټ +ڶ۟。₇꠆; ڶ۟.7꠆; [B1]; xn--pkb6f.xn--7-x93e; ; ; # ڶ۟.7꠆ +ڶ۟。7꠆; ڶ۟.7꠆; [B1]; xn--pkb6f.xn--7-x93e; ; ; # ڶ۟.7꠆ +xn--pkb6f.xn--7-x93e; ڶ۟.7꠆; [B1]; xn--pkb6f.xn--7-x93e; ; ; # ڶ۟.7꠆ +ڶ۟.7꠆; ; [B1]; xn--pkb6f.xn--7-x93e; ; ; # ڶ۟.7꠆ +Ⴣ𐹻.‌𝪣≮󠩉; ; [B1, B5, B6, C1, P1, V6]; xn--7nd8101k.xn--0ugy6gn120eb103g; ; xn--7nd8101k.xn--gdh4944ob3x3e; [B1, B5, B6, P1, V5, V6] # Ⴣ𐹻.𝪣≮ +Ⴣ𐹻.‌𝪣≮󠩉; Ⴣ𐹻.‌𝪣≮󠩉; [B1, B5, B6, C1, P1, V6]; xn--7nd8101k.xn--0ugy6gn120eb103g; ; xn--7nd8101k.xn--gdh4944ob3x3e; [B1, B5, B6, P1, V5, V6] # Ⴣ𐹻.𝪣≮ +ⴣ𐹻.‌𝪣≮󠩉; ⴣ𐹻.‌𝪣≮󠩉; [B1, B5, B6, C1, P1, V6]; xn--rlj6323e.xn--0ugy6gn120eb103g; ; xn--rlj6323e.xn--gdh4944ob3x3e; [B1, B5, B6, P1, V5, V6] # ⴣ𐹻.𝪣≮ +ⴣ𐹻.‌𝪣≮󠩉; ; [B1, B5, B6, C1, P1, V6]; xn--rlj6323e.xn--0ugy6gn120eb103g; ; xn--rlj6323e.xn--gdh4944ob3x3e; [B1, B5, B6, P1, V5, V6] # ⴣ𐹻.𝪣≮ +xn--rlj6323e.xn--gdh4944ob3x3e; ⴣ𐹻.𝪣≮󠩉; [B1, B5, B6, V5, V6]; xn--rlj6323e.xn--gdh4944ob3x3e; ; ; # ⴣ𐹻.𝪣≮ +xn--rlj6323e.xn--0ugy6gn120eb103g; ⴣ𐹻.‌𝪣≮󠩉; [B1, B5, B6, C1, V6]; xn--rlj6323e.xn--0ugy6gn120eb103g; ; ; # ⴣ𐹻.𝪣≮ +xn--7nd8101k.xn--gdh4944ob3x3e; Ⴣ𐹻.𝪣≮󠩉; [B1, B5, B6, V5, V6]; xn--7nd8101k.xn--gdh4944ob3x3e; ; ; # Ⴣ𐹻.𝪣≮ +xn--7nd8101k.xn--0ugy6gn120eb103g; Ⴣ𐹻.‌𝪣≮󠩉; [B1, B5, B6, C1, V6]; xn--7nd8101k.xn--0ugy6gn120eb103g; ; ; # Ⴣ𐹻.𝪣≮ +𝟵隁⯮.᠍‌; 9隁⯮.‌; [C1]; xn--9-mfs8024b.xn--0ug; ; xn--9-mfs8024b.; [] # 9隁⯮. +9隁⯮.᠍‌; 9隁⯮.‌; [C1]; xn--9-mfs8024b.xn--0ug; ; xn--9-mfs8024b.; [] # 9隁⯮. +xn--9-mfs8024b.; 9隁⯮.; ; xn--9-mfs8024b.; ; ; # 9隁⯮. +9隁⯮.; ; ; xn--9-mfs8024b.; ; ; # 9隁⯮. +xn--9-mfs8024b.xn--0ug; 9隁⯮.‌; [C1]; xn--9-mfs8024b.xn--0ug; ; ; # 9隁⯮. +⒏𐹧。Ⴣ྄彦; ⒏𐹧.Ⴣ྄彦; [B1, P1, V6]; xn--0sh2466f.xn--3ed15dt93o; ; ; # ⒏𐹧.Ⴣ྄彦 +8.𐹧。Ⴣ྄彦; 8.𐹧.Ⴣ྄彦; [B1, P1, V6]; 8.xn--fo0d.xn--3ed15dt93o; ; ; # 8.𐹧.Ⴣ྄彦 +8.𐹧。ⴣ྄彦; 8.𐹧.ⴣ྄彦; [B1]; 8.xn--fo0d.xn--3ed972m6o8a; ; ; # 8.𐹧.ⴣ྄彦 +8.xn--fo0d.xn--3ed972m6o8a; 8.𐹧.ⴣ྄彦; [B1]; 8.xn--fo0d.xn--3ed972m6o8a; ; ; # 8.𐹧.ⴣ྄彦 +8.xn--fo0d.xn--3ed15dt93o; 8.𐹧.Ⴣ྄彦; [B1, V6]; 8.xn--fo0d.xn--3ed15dt93o; ; ; # 8.𐹧.Ⴣ྄彦 +⒏𐹧。ⴣ྄彦; ⒏𐹧.ⴣ྄彦; [B1, P1, V6]; xn--0sh2466f.xn--3ed972m6o8a; ; ; # ⒏𐹧.ⴣ྄彦 +xn--0sh2466f.xn--3ed972m6o8a; ⒏𐹧.ⴣ྄彦; [B1, V6]; xn--0sh2466f.xn--3ed972m6o8a; ; ; # ⒏𐹧.ⴣ྄彦 +xn--0sh2466f.xn--3ed15dt93o; ⒏𐹧.Ⴣ྄彦; [B1, V6]; xn--0sh2466f.xn--3ed15dt93o; ; ; # ⒏𐹧.Ⴣ྄彦 +-问񬰔⒛。؄-񜗉橬; -问񬰔⒛.؄-񜗉橬; [B1, P1, V3, V6]; xn----hdpu849bhis3e.xn----ykc7228efm46d; ; ; # -问⒛.-橬 +-问񬰔20.。؄-񜗉橬; -问񬰔20..؄-񜗉橬; [B1, P1, V3, V6, X4_2]; xn---20-658jx1776d..xn----ykc7228efm46d; [B1, P1, V3, V6, A4_2]; ; # -问20..-橬 +xn---20-658jx1776d..xn----ykc7228efm46d; -问񬰔20..؄-񜗉橬; [B1, V3, V6, X4_2]; xn---20-658jx1776d..xn----ykc7228efm46d; [B1, V3, V6, A4_2]; ; # -问20..-橬 +xn----hdpu849bhis3e.xn----ykc7228efm46d; -问񬰔⒛.؄-񜗉橬; [B1, V3, V6]; xn----hdpu849bhis3e.xn----ykc7228efm46d; ; ; # -问⒛.-橬 +ᮬႬ‌̥。𝟸; ᮬႬ‌̥.2; [C1, P1, V5, V6]; xn--mta930emribme.2; ; xn--mta930emri.2; [P1, V5, V6] # ᮬႬ̥.2 +ᮬႬ‌̥。2; ᮬႬ‌̥.2; [C1, P1, V5, V6]; xn--mta930emribme.2; ; xn--mta930emri.2; [P1, V5, V6] # ᮬႬ̥.2 +ᮬⴌ‌̥。2; ᮬⴌ‌̥.2; [C1, V5]; xn--mta176j97cl2q.2; ; xn--mta176jjjm.2; [V5] # ᮬⴌ̥.2 +xn--mta176jjjm.2; ᮬⴌ̥.2; [V5]; xn--mta176jjjm.2; ; ; # ᮬⴌ̥.2 +xn--mta176j97cl2q.2; ᮬⴌ‌̥.2; [C1, V5]; xn--mta176j97cl2q.2; ; ; # ᮬⴌ̥.2 +xn--mta930emri.2; ᮬႬ̥.2; [V5, V6]; xn--mta930emri.2; ; ; # ᮬႬ̥.2 +xn--mta930emribme.2; ᮬႬ‌̥.2; [C1, V5, V6]; xn--mta930emribme.2; ; ; # ᮬႬ̥.2 +ᮬⴌ‌̥。𝟸; ᮬⴌ‌̥.2; [C1, V5]; xn--mta176j97cl2q.2; ; xn--mta176jjjm.2; [V5] # ᮬⴌ̥.2 +?。꠆٩󠒩; ?.꠆٩󠒩; [B1, P1, V5, V6]; ?.xn--iib9583fusy0i; [B1, P1, V5, V6, A3]; ; # .꠆٩ +?.xn--iib9583fusy0i; ?.꠆٩󠒩; [B1, P1, V5, V6]; ?.xn--iib9583fusy0i; [B1, P1, V5, V6, A3]; ; # .꠆٩ +?.XN--IIB9583FUSY0I; ?.꠆٩󠒩; [B1, P1, V5, V6]; ?.xn--iib9583fusy0i; [B1, P1, V5, V6, A3]; ; # .꠆٩ +?.Xn--Iib9583fusy0i; ?.꠆٩󠒩; [B1, P1, V5, V6]; ?.xn--iib9583fusy0i; [B1, P1, V5, V6, A3]; ; # .꠆٩ +󠄁͟⾶。₇︒눇≮; ͟飛.7︒눇≮; [P1, V5, V6]; xn--9ua0567e.xn--7-ngou006d1ttc; ; ; # ͟飛.7︒눇≮ +󠄁͟⾶。₇︒눇≮; ͟飛.7︒눇≮; [P1, V5, V6]; xn--9ua0567e.xn--7-ngou006d1ttc; ; ; # ͟飛.7︒눇≮ +󠄁͟飛。7。눇≮; ͟飛.7.눇≮; [P1, V5, V6]; xn--9ua0567e.7.xn--gdh6767c; ; ; # ͟飛.7.눇≮ +󠄁͟飛。7。눇≮; ͟飛.7.눇≮; [P1, V5, V6]; xn--9ua0567e.7.xn--gdh6767c; ; ; # ͟飛.7.눇≮ +xn--9ua0567e.7.xn--gdh6767c; ͟飛.7.눇≮; [V5, V6]; xn--9ua0567e.7.xn--gdh6767c; ; ; # ͟飛.7.눇≮ +xn--9ua0567e.xn--7-ngou006d1ttc; ͟飛.7︒눇≮; [V5, V6]; xn--9ua0567e.xn--7-ngou006d1ttc; ; ; # ͟飛.7︒눇≮ +‌︉𐹴‍.‌⿃; ‌𐹴‍.‌鳥; [B1, C1, C2]; xn--0ugc6024p.xn--0ug1920c; ; xn--so0d.xn--6x6a; [B1] # 𐹴.鳥 +‌︉𐹴‍.‌鳥; ‌𐹴‍.‌鳥; [B1, C1, C2]; xn--0ugc6024p.xn--0ug1920c; ; xn--so0d.xn--6x6a; [B1] # 𐹴.鳥 +xn--so0d.xn--6x6a; 𐹴.鳥; [B1]; xn--so0d.xn--6x6a; ; ; # 𐹴.鳥 +xn--0ugc6024p.xn--0ug1920c; ‌𐹴‍.‌鳥; [B1, C1, C2]; xn--0ugc6024p.xn--0ug1920c; ; ; # 𐹴.鳥 +🍮.‍󠗒𐦁𝨝; 🍮.‍󠗒𐦁𝨝; [B1, C2, P1, V6]; xn--lj8h.xn--1ug6603gr1pfwq37h; ; xn--lj8h.xn--ln9ci476aqmr2g; [B1, P1, V6] # 🍮.𐦁𝨝 +🍮.‍󠗒𐦁𝨝; ; [B1, C2, P1, V6]; xn--lj8h.xn--1ug6603gr1pfwq37h; ; xn--lj8h.xn--ln9ci476aqmr2g; [B1, P1, V6] # 🍮.𐦁𝨝 +xn--lj8h.xn--ln9ci476aqmr2g; 🍮.󠗒𐦁𝨝; [B1, V6]; xn--lj8h.xn--ln9ci476aqmr2g; ; ; # 🍮.𐦁𝨝 +xn--lj8h.xn--1ug6603gr1pfwq37h; 🍮.‍󠗒𐦁𝨝; [B1, C2, V6]; xn--lj8h.xn--1ug6603gr1pfwq37h; ; ; # 🍮.𐦁𝨝 +ٽृ.𞤓‍; ٽृ.𞤵‍; [B3, C2]; xn--2ib43l.xn--1ugy711p; ; xn--2ib43l.xn--te6h; [] # ٽृ.𞤵 +ٽृ.𞤵‍; ; [B3, C2]; xn--2ib43l.xn--1ugy711p; ; xn--2ib43l.xn--te6h; [] # ٽृ.𞤵 +xn--2ib43l.xn--te6h; ٽृ.𞤵; ; xn--2ib43l.xn--te6h; ; ; # ٽृ.𞤵 +ٽृ.𞤵; ; ; xn--2ib43l.xn--te6h; ; ; # ٽृ.𞤵 +ٽृ.𞤓; ٽृ.𞤵; ; xn--2ib43l.xn--te6h; ; ; # ٽृ.𞤵 +xn--2ib43l.xn--1ugy711p; ٽृ.𞤵‍; [B3, C2]; xn--2ib43l.xn--1ugy711p; ; ; # ٽृ.𞤵 +٤੍-.󥜽္񦦐; ٤੍-.󥜽္񦦐; [B1, P1, V3, V6]; xn----gqc711a.xn--9jd88234f3qm0b; ; ; # ٤੍-.္ +٤੍-.󥜽္񦦐; ; [B1, P1, V3, V6]; xn----gqc711a.xn--9jd88234f3qm0b; ; ; # ٤੍-.္ +xn----gqc711a.xn--9jd88234f3qm0b; ٤੍-.󥜽္񦦐; [B1, V3, V6]; xn----gqc711a.xn--9jd88234f3qm0b; ; ; # ٤੍-.္ +4်-𐹸。ꨩ‌𐹴≮; 4်-𐹸.ꨩ‌𐹴≮; [B1, C1, P1, V5, V6]; xn--4--e4j7831r.xn--0ugy6gjy5sl3ud; ; xn--4--e4j7831r.xn--gdh8754cz40c; [B1, P1, V5, V6] # 4်-𐹸.ꨩ𐹴≮ +4်-𐹸。ꨩ‌𐹴≮; 4်-𐹸.ꨩ‌𐹴≮; [B1, C1, P1, V5, V6]; xn--4--e4j7831r.xn--0ugy6gjy5sl3ud; ; xn--4--e4j7831r.xn--gdh8754cz40c; [B1, P1, V5, V6] # 4်-𐹸.ꨩ𐹴≮ +4်-𐹸。ꨩ‌𐹴≮; 4်-𐹸.ꨩ‌𐹴≮; [B1, C1, P1, V5, V6]; xn--4--e4j7831r.xn--0ugy6gjy5sl3ud; ; xn--4--e4j7831r.xn--gdh8754cz40c; [B1, P1, V5, V6] # 4်-𐹸.ꨩ𐹴≮ +4်-𐹸。ꨩ‌𐹴≮; 4်-𐹸.ꨩ‌𐹴≮; [B1, C1, P1, V5, V6]; xn--4--e4j7831r.xn--0ugy6gjy5sl3ud; ; xn--4--e4j7831r.xn--gdh8754cz40c; [B1, P1, V5, V6] # 4်-𐹸.ꨩ𐹴≮ +xn--4--e4j7831r.xn--gdh8754cz40c; 4်-𐹸.ꨩ𐹴≮; [B1, V5, V6]; xn--4--e4j7831r.xn--gdh8754cz40c; ; ; # 4်-𐹸.ꨩ𐹴≮ +xn--4--e4j7831r.xn--0ugy6gjy5sl3ud; 4်-𐹸.ꨩ‌𐹴≮; [B1, C1, V5, V6]; xn--4--e4j7831r.xn--0ugy6gjy5sl3ud; ; ; # 4်-𐹸.ꨩ𐹴≮ +‌。ᅠ྄ྖ; ‌.ᅠ྄ྖ; [C1, P1, V6]; xn--0ug.xn--3ed0by082k; ; .xn--3ed0by082k; [P1, V6, A4_2] # .྄ྖ +‌。ᅠ྄ྖ; ‌.ᅠ྄ྖ; [C1, P1, V6]; xn--0ug.xn--3ed0b20h; ; .xn--3ed0b20h; [P1, V6, A4_2] # .྄ྖ +.xn--3ed0b20h; .ᅠ྄ྖ; [V6, X4_2]; .xn--3ed0b20h; [V6, A4_2]; ; # .྄ྖ +xn--0ug.xn--3ed0b20h; ‌.ᅠ྄ྖ; [C1, V6]; xn--0ug.xn--3ed0b20h; ; ; # .྄ྖ +.xn--3ed0by082k; .ᅠ྄ྖ; [V6, X4_2]; .xn--3ed0by082k; [V6, A4_2]; ; # .྄ྖ +xn--0ug.xn--3ed0by082k; ‌.ᅠ྄ྖ; [C1, V6]; xn--0ug.xn--3ed0by082k; ; ; # .྄ྖ +≯򍘅.‍𐅼򲇛; ≯򍘅.‍𐅼򲇛; [C2, P1, V6]; xn--hdh84488f.xn--1ug8099fbjp4e; ; xn--hdh84488f.xn--xy7cw2886b; [P1, V6] # ≯.𐅼 +≯򍘅.‍𐅼򲇛; ≯򍘅.‍𐅼򲇛; [C2, P1, V6]; xn--hdh84488f.xn--1ug8099fbjp4e; ; xn--hdh84488f.xn--xy7cw2886b; [P1, V6] # ≯.𐅼 +≯򍘅.‍𐅼򲇛; ; [C2, P1, V6]; xn--hdh84488f.xn--1ug8099fbjp4e; ; xn--hdh84488f.xn--xy7cw2886b; [P1, V6] # ≯.𐅼 +≯򍘅.‍𐅼򲇛; ≯򍘅.‍𐅼򲇛; [C2, P1, V6]; xn--hdh84488f.xn--1ug8099fbjp4e; ; xn--hdh84488f.xn--xy7cw2886b; [P1, V6] # ≯.𐅼 +xn--hdh84488f.xn--xy7cw2886b; ≯򍘅.𐅼򲇛; [V6]; xn--hdh84488f.xn--xy7cw2886b; ; ; # ≯.𐅼 +xn--hdh84488f.xn--1ug8099fbjp4e; ≯򍘅.‍𐅼򲇛; [C2, V6]; xn--hdh84488f.xn--1ug8099fbjp4e; ; ; # ≯.𐅼 +فß𐰯。𝟕𐫫; فß𐰯.7𐫫; [B1, B2]; xn--zca96ys96y.xn--7-mm5i; ; xn--ss-jvd2339x.xn--7-mm5i; # فß𐰯.7𐫫 +فß𐰯。7𐫫; فß𐰯.7𐫫; [B1, B2]; xn--zca96ys96y.xn--7-mm5i; ; xn--ss-jvd2339x.xn--7-mm5i; # فß𐰯.7𐫫 +فSS𐰯。7𐫫; فss𐰯.7𐫫; [B1, B2]; xn--ss-jvd2339x.xn--7-mm5i; ; ; # فss𐰯.7𐫫 +فss𐰯。7𐫫; فss𐰯.7𐫫; [B1, B2]; xn--ss-jvd2339x.xn--7-mm5i; ; ; # فss𐰯.7𐫫 +xn--ss-jvd2339x.xn--7-mm5i; فss𐰯.7𐫫; [B1, B2]; xn--ss-jvd2339x.xn--7-mm5i; ; ; # فss𐰯.7𐫫 +xn--zca96ys96y.xn--7-mm5i; فß𐰯.7𐫫; [B1, B2]; xn--zca96ys96y.xn--7-mm5i; ; ; # فß𐰯.7𐫫 +فSS𐰯。𝟕𐫫; فss𐰯.7𐫫; [B1, B2]; xn--ss-jvd2339x.xn--7-mm5i; ; ; # فss𐰯.7𐫫 +فss𐰯。𝟕𐫫; فss𐰯.7𐫫; [B1, B2]; xn--ss-jvd2339x.xn--7-mm5i; ; ; # فss𐰯.7𐫫 +فSs𐰯。7𐫫; فss𐰯.7𐫫; [B1, B2]; xn--ss-jvd2339x.xn--7-mm5i; ; ; # فss𐰯.7𐫫 +فSs𐰯。𝟕𐫫; فss𐰯.7𐫫; [B1, B2]; xn--ss-jvd2339x.xn--7-mm5i; ; ; # فss𐰯.7𐫫 +ßެާࢱ。𐭁􅮙𐹲; ßެާࢱ.𐭁􅮙𐹲; [B2, B5, B6, P1, V6]; xn--zca685aoa95h.xn--e09co8cr9861c; ; xn--ss-9qet02k.xn--e09co8cr9861c; # ßެާࢱ.𐭁𐹲 +SSެާࢱ。𐭁􅮙𐹲; ssެާࢱ.𐭁􅮙𐹲; [B2, B5, B6, P1, V6]; xn--ss-9qet02k.xn--e09co8cr9861c; ; ; # ssެާࢱ.𐭁𐹲 +ssެާࢱ。𐭁􅮙𐹲; ssެާࢱ.𐭁􅮙𐹲; [B2, B5, B6, P1, V6]; xn--ss-9qet02k.xn--e09co8cr9861c; ; ; # ssެާࢱ.𐭁𐹲 +Ssެާࢱ。𐭁􅮙𐹲; ssެާࢱ.𐭁􅮙𐹲; [B2, B5, B6, P1, V6]; xn--ss-9qet02k.xn--e09co8cr9861c; ; ; # ssެާࢱ.𐭁𐹲 +xn--ss-9qet02k.xn--e09co8cr9861c; ssެާࢱ.𐭁􅮙𐹲; [B2, B5, B6, V6]; xn--ss-9qet02k.xn--e09co8cr9861c; ; ; # ssެާࢱ.𐭁𐹲 +xn--zca685aoa95h.xn--e09co8cr9861c; ßެާࢱ.𐭁􅮙𐹲; [B2, B5, B6, V6]; xn--zca685aoa95h.xn--e09co8cr9861c; ; ; # ßެާࢱ.𐭁𐹲 +-。󠉗⒌𞯛; -.󠉗⒌𞯛; [B1, P1, V3, V6]; -.xn--xsh6367n1bi3e; ; ; # -.⒌ +-。󠉗5.𞯛; -.󠉗5.𞯛; [B1, P1, V3, V6]; -.xn--5-zz21m.xn--6x6h; ; ; # -.5. +-.xn--5-zz21m.xn--6x6h; -.󠉗5.𞯛; [B1, V3, V6]; -.xn--5-zz21m.xn--6x6h; ; ; # -.5. +-.xn--xsh6367n1bi3e; -.󠉗⒌𞯛; [B1, V3, V6]; -.xn--xsh6367n1bi3e; ; ; # -.⒌ +𼎏ς.-≮ﲫ; 𼎏ς.-≮خج; [B1, P1, V3, V6]; xn--3xa13520c.xn----9mcf1400a; ; xn--4xa92520c.xn----9mcf1400a; # ς.-≮خج +𼎏ς.-≮ﲫ; 𼎏ς.-≮خج; [B1, P1, V3, V6]; xn--3xa13520c.xn----9mcf1400a; ; xn--4xa92520c.xn----9mcf1400a; # ς.-≮خج +𼎏ς.-≮خج; ; [B1, P1, V3, V6]; xn--3xa13520c.xn----9mcf1400a; ; xn--4xa92520c.xn----9mcf1400a; # ς.-≮خج +𼎏ς.-≮خج; 𼎏ς.-≮خج; [B1, P1, V3, V6]; xn--3xa13520c.xn----9mcf1400a; ; xn--4xa92520c.xn----9mcf1400a; # ς.-≮خج +𼎏Σ.-≮خج; 𼎏σ.-≮خج; [B1, P1, V3, V6]; xn--4xa92520c.xn----9mcf1400a; ; ; # σ.-≮خج +𼎏Σ.-≮خج; 𼎏σ.-≮خج; [B1, P1, V3, V6]; xn--4xa92520c.xn----9mcf1400a; ; ; # σ.-≮خج +𼎏σ.-≮خج; ; [B1, P1, V3, V6]; xn--4xa92520c.xn----9mcf1400a; ; ; # σ.-≮خج +𼎏σ.-≮خج; 𼎏σ.-≮خج; [B1, P1, V3, V6]; xn--4xa92520c.xn----9mcf1400a; ; ; # σ.-≮خج +xn--4xa92520c.xn----9mcf1400a; 𼎏σ.-≮خج; [B1, V3, V6]; xn--4xa92520c.xn----9mcf1400a; ; ; # σ.-≮خج +xn--3xa13520c.xn----9mcf1400a; 𼎏ς.-≮خج; [B1, V3, V6]; xn--3xa13520c.xn----9mcf1400a; ; ; # ς.-≮خج +𼎏Σ.-≮ﲫ; 𼎏σ.-≮خج; [B1, P1, V3, V6]; xn--4xa92520c.xn----9mcf1400a; ; ; # σ.-≮خج +𼎏Σ.-≮ﲫ; 𼎏σ.-≮خج; [B1, P1, V3, V6]; xn--4xa92520c.xn----9mcf1400a; ; ; # σ.-≮خج +𼎏σ.-≮ﲫ; 𼎏σ.-≮خج; [B1, P1, V3, V6]; xn--4xa92520c.xn----9mcf1400a; ; ; # σ.-≮خج +𼎏σ.-≮ﲫ; 𼎏σ.-≮خج; [B1, P1, V3, V6]; xn--4xa92520c.xn----9mcf1400a; ; ; # σ.-≮خج +ꡗࢸܙ.񔤔󠛙్ﰾ; ꡗࢸܙ.񔤔󠛙్كي; [B5, B6, P1, V6]; xn--jnb34fs003a.xn--fhbo927bk128mpi24d; ; ; # ꡗࢸܙ.్كي +ꡗࢸܙ.񔤔󠛙్كي; ; [B5, B6, P1, V6]; xn--jnb34fs003a.xn--fhbo927bk128mpi24d; ; ; # ꡗࢸܙ.్كي +xn--jnb34fs003a.xn--fhbo927bk128mpi24d; ꡗࢸܙ.񔤔󠛙్كي; [B5, B6, V6]; xn--jnb34fs003a.xn--fhbo927bk128mpi24d; ; ; # ꡗࢸܙ.్كي +𐠰ࢷ𞤌𐫭。𐋦៍𝩃; 𐠰ࢷ𞤮𐫭.𐋦៍𝩃; [B1]; xn--dzb5191kezbrw47a.xn--p4e3841jz9tf; ; ; # 𐠰ࢷ𞤮𐫭.𐋦៍𝩃 +𐠰ࢷ𞤮𐫭。𐋦៍𝩃; 𐠰ࢷ𞤮𐫭.𐋦៍𝩃; [B1]; xn--dzb5191kezbrw47a.xn--p4e3841jz9tf; ; ; # 𐠰ࢷ𞤮𐫭.𐋦៍𝩃 +xn--dzb5191kezbrw47a.xn--p4e3841jz9tf; 𐠰ࢷ𞤮𐫭.𐋦៍𝩃; [B1]; xn--dzb5191kezbrw47a.xn--p4e3841jz9tf; ; ; # 𐠰ࢷ𞤮𐫭.𐋦៍𝩃 +𐠰ࢷ𞤮𐫭.𐋦៍𝩃; ; [B1]; xn--dzb5191kezbrw47a.xn--p4e3841jz9tf; ; ; # 𐠰ࢷ𞤮𐫭.𐋦៍𝩃 +𐠰ࢷ𞤌𐫭.𐋦៍𝩃; 𐠰ࢷ𞤮𐫭.𐋦៍𝩃; [B1]; xn--dzb5191kezbrw47a.xn--p4e3841jz9tf; ; ; # 𐠰ࢷ𞤮𐫭.𐋦៍𝩃 +₂㘷--。ۓ‌𐫆𑖿; 2㘷--.ۓ‌𐫆𑖿; [B1, C1, V2, V3]; xn--2---u58b.xn--jlb820ku99nbgj; ; xn--2---u58b.xn--jlb8024k14g; [B1, V2, V3] # 2㘷--.ۓ𐫆𑖿 +₂㘷--。ۓ‌𐫆𑖿; 2㘷--.ۓ‌𐫆𑖿; [B1, C1, V2, V3]; xn--2---u58b.xn--jlb820ku99nbgj; ; xn--2---u58b.xn--jlb8024k14g; [B1, V2, V3] # 2㘷--.ۓ𐫆𑖿 +2㘷--。ۓ‌𐫆𑖿; 2㘷--.ۓ‌𐫆𑖿; [B1, C1, V2, V3]; xn--2---u58b.xn--jlb820ku99nbgj; ; xn--2---u58b.xn--jlb8024k14g; [B1, V2, V3] # 2㘷--.ۓ𐫆𑖿 +2㘷--。ۓ‌𐫆𑖿; 2㘷--.ۓ‌𐫆𑖿; [B1, C1, V2, V3]; xn--2---u58b.xn--jlb820ku99nbgj; ; xn--2---u58b.xn--jlb8024k14g; [B1, V2, V3] # 2㘷--.ۓ𐫆𑖿 +xn--2---u58b.xn--jlb8024k14g; 2㘷--.ۓ𐫆𑖿; [B1, V2, V3]; xn--2---u58b.xn--jlb8024k14g; ; ; # 2㘷--.ۓ𐫆𑖿 +xn--2---u58b.xn--jlb820ku99nbgj; 2㘷--.ۓ‌𐫆𑖿; [B1, C1, V2, V3]; xn--2---u58b.xn--jlb820ku99nbgj; ; ; # 2㘷--.ۓ𐫆𑖿 +-𘊻.ᡮح-; -𘊻.ᡮح-; [B1, B5, B6, V3]; xn----bp5n.xn----bnc231l; ; ; # -𘊻.ᡮح- +-𘊻.ᡮح-; ; [B1, B5, B6, V3]; xn----bp5n.xn----bnc231l; ; ; # -𘊻.ᡮح- +xn----bp5n.xn----bnc231l; -𘊻.ᡮح-; [B1, B5, B6, V3]; xn----bp5n.xn----bnc231l; ; ; # -𘊻.ᡮح- +‌-ß。ᢣ𐹭ؿ; ‌-ß.ᢣ𐹭ؿ; [B1, B5, B6, C1]; xn----qfa550v.xn--bhb925glx3p; ; -ss.xn--bhb925glx3p; [B1, B5, B6, V3] # -ß.ᢣ𐹭ؿ +‌-ß。ᢣ𐹭ؿ; ‌-ß.ᢣ𐹭ؿ; [B1, B5, B6, C1]; xn----qfa550v.xn--bhb925glx3p; ; -ss.xn--bhb925glx3p; [B1, B5, B6, V3] # -ß.ᢣ𐹭ؿ +‌-SS。ᢣ𐹭ؿ; ‌-ss.ᢣ𐹭ؿ; [B1, B5, B6, C1]; xn---ss-8m0a.xn--bhb925glx3p; ; -ss.xn--bhb925glx3p; [B1, B5, B6, V3] # -ss.ᢣ𐹭ؿ +‌-ss。ᢣ𐹭ؿ; ‌-ss.ᢣ𐹭ؿ; [B1, B5, B6, C1]; xn---ss-8m0a.xn--bhb925glx3p; ; -ss.xn--bhb925glx3p; [B1, B5, B6, V3] # -ss.ᢣ𐹭ؿ +‌-Ss。ᢣ𐹭ؿ; ‌-ss.ᢣ𐹭ؿ; [B1, B5, B6, C1]; xn---ss-8m0a.xn--bhb925glx3p; ; -ss.xn--bhb925glx3p; [B1, B5, B6, V3] # -ss.ᢣ𐹭ؿ +-ss.xn--bhb925glx3p; -ss.ᢣ𐹭ؿ; [B1, B5, B6, V3]; -ss.xn--bhb925glx3p; ; ; # -ss.ᢣ𐹭ؿ +xn---ss-8m0a.xn--bhb925glx3p; ‌-ss.ᢣ𐹭ؿ; [B1, B5, B6, C1]; xn---ss-8m0a.xn--bhb925glx3p; ; ; # -ss.ᢣ𐹭ؿ +xn----qfa550v.xn--bhb925glx3p; ‌-ß.ᢣ𐹭ؿ; [B1, B5, B6, C1]; xn----qfa550v.xn--bhb925glx3p; ; ; # -ß.ᢣ𐹭ؿ +‌-SS。ᢣ𐹭ؿ; ‌-ss.ᢣ𐹭ؿ; [B1, B5, B6, C1]; xn---ss-8m0a.xn--bhb925glx3p; ; -ss.xn--bhb925glx3p; [B1, B5, B6, V3] # -ss.ᢣ𐹭ؿ +‌-ss。ᢣ𐹭ؿ; ‌-ss.ᢣ𐹭ؿ; [B1, B5, B6, C1]; xn---ss-8m0a.xn--bhb925glx3p; ; -ss.xn--bhb925glx3p; [B1, B5, B6, V3] # -ss.ᢣ𐹭ؿ +‌-Ss。ᢣ𐹭ؿ; ‌-ss.ᢣ𐹭ؿ; [B1, B5, B6, C1]; xn---ss-8m0a.xn--bhb925glx3p; ; -ss.xn--bhb925glx3p; [B1, B5, B6, V3] # -ss.ᢣ𐹭ؿ +꧐Ӏ᮪ࣶ.눵; ꧐Ӏ᮪ࣶ.눵; [P1, V6]; xn--d5a07sn4u297k.xn--2e1b; ; ; # ꧐Ӏ᮪ࣶ.눵 +꧐Ӏ᮪ࣶ.눵; ꧐Ӏ᮪ࣶ.눵; [P1, V6]; xn--d5a07sn4u297k.xn--2e1b; ; ; # ꧐Ӏ᮪ࣶ.눵 +꧐Ӏ᮪ࣶ.눵; ; [P1, V6]; xn--d5a07sn4u297k.xn--2e1b; ; ; # ꧐Ӏ᮪ࣶ.눵 +꧐Ӏ᮪ࣶ.눵; ꧐Ӏ᮪ࣶ.눵; [P1, V6]; xn--d5a07sn4u297k.xn--2e1b; ; ; # ꧐Ӏ᮪ࣶ.눵 +꧐ӏ᮪ࣶ.눵; ꧐ӏ᮪ࣶ.눵; ; xn--s5a04sn4u297k.xn--2e1b; ; ; # ꧐ӏ᮪ࣶ.눵 +꧐ӏ᮪ࣶ.눵; ; ; xn--s5a04sn4u297k.xn--2e1b; ; ; # ꧐ӏ᮪ࣶ.눵 +xn--s5a04sn4u297k.xn--2e1b; ꧐ӏ᮪ࣶ.눵; ; xn--s5a04sn4u297k.xn--2e1b; ; ; # ꧐ӏ᮪ࣶ.눵 +xn--d5a07sn4u297k.xn--2e1b; ꧐Ӏ᮪ࣶ.눵; [V6]; xn--d5a07sn4u297k.xn--2e1b; ; ; # ꧐Ӏ᮪ࣶ.눵 +꧐ӏ᮪ࣶ.눵; ꧐ӏ᮪ࣶ.눵; ; xn--s5a04sn4u297k.xn--2e1b; ; ; # ꧐ӏ᮪ࣶ.눵 +꧐ӏ᮪ࣶ.눵; ꧐ӏ᮪ࣶ.눵; ; xn--s5a04sn4u297k.xn--2e1b; ; ; # ꧐ӏ᮪ࣶ.눵 +꣪。𖄿𑆾󠇗; ꣪.𖄿𑆾; [P1, V5, V6]; xn--3g9a.xn--ud1dz07k; ; ; # ꣪.𑆾 +꣪。𖄿𑆾󠇗; ꣪.𖄿𑆾; [P1, V5, V6]; xn--3g9a.xn--ud1dz07k; ; ; # ꣪.𑆾 +xn--3g9a.xn--ud1dz07k; ꣪.𖄿𑆾; [V5, V6]; xn--3g9a.xn--ud1dz07k; ; ; # ꣪.𑆾 +󇓓𑚳。񐷿≯⾇; 󇓓𑚳.񐷿≯舛; [P1, V6]; xn--3e2d79770c.xn--hdh0088abyy1c; ; ; # 𑚳.≯舛 +󇓓𑚳。񐷿≯⾇; 󇓓𑚳.񐷿≯舛; [P1, V6]; xn--3e2d79770c.xn--hdh0088abyy1c; ; ; # 𑚳.≯舛 +󇓓𑚳。񐷿≯舛; 󇓓𑚳.񐷿≯舛; [P1, V6]; xn--3e2d79770c.xn--hdh0088abyy1c; ; ; # 𑚳.≯舛 +󇓓𑚳。񐷿≯舛; 󇓓𑚳.񐷿≯舛; [P1, V6]; xn--3e2d79770c.xn--hdh0088abyy1c; ; ; # 𑚳.≯舛 +xn--3e2d79770c.xn--hdh0088abyy1c; 󇓓𑚳.񐷿≯舛; [V6]; xn--3e2d79770c.xn--hdh0088abyy1c; ; ; # 𑚳.≯舛 +𐫇١‌.‍‌; 𐫇١‌.‍‌; [B1, B3, C1, C2]; xn--9hb652kv99n.xn--0ugb; ; xn--9hb7344k.; [] # 𐫇١. +𐫇١‌.‍‌; ; [B1, B3, C1, C2]; xn--9hb652kv99n.xn--0ugb; ; xn--9hb7344k.; [] # 𐫇١. +xn--9hb7344k.; 𐫇١.; ; xn--9hb7344k.; ; ; # 𐫇١. +𐫇١.; ; ; xn--9hb7344k.; ; ; # 𐫇١. +xn--9hb652kv99n.xn--0ugb; 𐫇١‌.‍‌; [B1, B3, C1, C2]; xn--9hb652kv99n.xn--0ugb; ; ; # 𐫇١. +񡅈砪≯ᢑ。≯𝩚򓴔‌; 񡅈砪≯ᢑ.≯𝩚򓴔‌; [C1, P1, V6]; xn--bbf561cf95e57y3e.xn--0ugz6gc910ejro8c; ; xn--bbf561cf95e57y3e.xn--hdh0834o7mj6b; [P1, V6] # 砪≯ᢑ.≯𝩚 +񡅈砪≯ᢑ。≯𝩚򓴔‌; 񡅈砪≯ᢑ.≯𝩚򓴔‌; [C1, P1, V6]; xn--bbf561cf95e57y3e.xn--0ugz6gc910ejro8c; ; xn--bbf561cf95e57y3e.xn--hdh0834o7mj6b; [P1, V6] # 砪≯ᢑ.≯𝩚 +񡅈砪≯ᢑ。≯𝩚򓴔‌; 񡅈砪≯ᢑ.≯𝩚򓴔‌; [C1, P1, V6]; xn--bbf561cf95e57y3e.xn--0ugz6gc910ejro8c; ; xn--bbf561cf95e57y3e.xn--hdh0834o7mj6b; [P1, V6] # 砪≯ᢑ.≯𝩚 +񡅈砪≯ᢑ。≯𝩚򓴔‌; 񡅈砪≯ᢑ.≯𝩚򓴔‌; [C1, P1, V6]; xn--bbf561cf95e57y3e.xn--0ugz6gc910ejro8c; ; xn--bbf561cf95e57y3e.xn--hdh0834o7mj6b; [P1, V6] # 砪≯ᢑ.≯𝩚 +xn--bbf561cf95e57y3e.xn--hdh0834o7mj6b; 񡅈砪≯ᢑ.≯𝩚򓴔; [V6]; xn--bbf561cf95e57y3e.xn--hdh0834o7mj6b; ; ; # 砪≯ᢑ.≯𝩚 +xn--bbf561cf95e57y3e.xn--0ugz6gc910ejro8c; 񡅈砪≯ᢑ.≯𝩚򓴔‌; [C1, V6]; xn--bbf561cf95e57y3e.xn--0ugz6gc910ejro8c; ; ; # 砪≯ᢑ.≯𝩚 +Ⴥ.𑄳㊸; Ⴥ.𑄳43; [P1, V5, V6]; xn--9nd.xn--43-274o; ; ; # Ⴥ.𑄳43 +Ⴥ.𑄳43; ; [P1, V5, V6]; xn--9nd.xn--43-274o; ; ; # Ⴥ.𑄳43 +ⴥ.𑄳43; ; [V5]; xn--tlj.xn--43-274o; ; ; # ⴥ.𑄳43 +xn--tlj.xn--43-274o; ⴥ.𑄳43; [V5]; xn--tlj.xn--43-274o; ; ; # ⴥ.𑄳43 +xn--9nd.xn--43-274o; Ⴥ.𑄳43; [V5, V6]; xn--9nd.xn--43-274o; ; ; # Ⴥ.𑄳43 +ⴥ.𑄳㊸; ⴥ.𑄳43; [V5]; xn--tlj.xn--43-274o; ; ; # ⴥ.𑄳43 +𝟎٣。Ⴒᡇࣲ𐹠; 0٣.Ⴒᡇࣲ𐹠; [B1, B5, B6, P1, V6]; xn--0-fqc.xn--10b180bnwgfy0z; ; ; # 0٣.Ⴒᡇࣲ𐹠 +0٣。Ⴒᡇࣲ𐹠; 0٣.Ⴒᡇࣲ𐹠; [B1, B5, B6, P1, V6]; xn--0-fqc.xn--10b180bnwgfy0z; ; ; # 0٣.Ⴒᡇࣲ𐹠 +0٣。ⴒᡇࣲ𐹠; 0٣.ⴒᡇࣲ𐹠; [B1, B5, B6]; xn--0-fqc.xn--10b369eivp359r; ; ; # 0٣.ⴒᡇࣲ𐹠 +xn--0-fqc.xn--10b369eivp359r; 0٣.ⴒᡇࣲ𐹠; [B1, B5, B6]; xn--0-fqc.xn--10b369eivp359r; ; ; # 0٣.ⴒᡇࣲ𐹠 +xn--0-fqc.xn--10b180bnwgfy0z; 0٣.Ⴒᡇࣲ𐹠; [B1, B5, B6, V6]; xn--0-fqc.xn--10b180bnwgfy0z; ; ; # 0٣.Ⴒᡇࣲ𐹠 +𝟎٣。ⴒᡇࣲ𐹠; 0٣.ⴒᡇࣲ𐹠; [B1, B5, B6]; xn--0-fqc.xn--10b369eivp359r; ; ; # 0٣.ⴒᡇࣲ𐹠 +񗪨󠄉ᅠྷ.񸞰꥓; 񗪨ᅠྷ.񸞰꥓; [P1, V6]; xn--kgd7493jee34a.xn--3j9au7544a; ; ; # ྷ.꥓ +񗪨󠄉ᅠྷ.񸞰꥓; 񗪨ᅠྷ.񸞰꥓; [P1, V6]; xn--kgd36f9z57y.xn--3j9au7544a; ; ; # ྷ.꥓ +xn--kgd36f9z57y.xn--3j9au7544a; 񗪨ᅠྷ.񸞰꥓; [V6]; xn--kgd36f9z57y.xn--3j9au7544a; ; ; # ྷ.꥓ +xn--kgd7493jee34a.xn--3j9au7544a; 񗪨ᅠྷ.񸞰꥓; [V6]; xn--kgd7493jee34a.xn--3j9au7544a; ; ; # ྷ.꥓ +ؘ.۳‌꥓; ; [C1, V5]; xn--6fb.xn--gmb469jjf1h; ; xn--6fb.xn--gmb0524f; [V5] # ؘ.۳꥓ +xn--6fb.xn--gmb0524f; ؘ.۳꥓; [V5]; xn--6fb.xn--gmb0524f; ; ; # ؘ.۳꥓ +xn--6fb.xn--gmb469jjf1h; ؘ.۳‌꥓; [C1, V5]; xn--6fb.xn--gmb469jjf1h; ; ; # ؘ.۳꥓ +ᡌ.︒ᢑ; ᡌ.︒ᢑ; [P1, V6]; xn--c8e.xn--bbf9168i; ; ; # ᡌ.︒ᢑ +ᡌ.。ᢑ; ᡌ..ᢑ; [X4_2]; xn--c8e..xn--bbf; [A4_2]; ; # ᡌ..ᢑ +xn--c8e..xn--bbf; ᡌ..ᢑ; [X4_2]; xn--c8e..xn--bbf; [A4_2]; ; # ᡌ..ᢑ +xn--c8e.xn--bbf9168i; ᡌ.︒ᢑ; [V6]; xn--c8e.xn--bbf9168i; ; ; # ᡌ.︒ᢑ +𑋪ၳ。𞽧; 𑋪ၳ.𞽧; [B1, B3, B6, P1, V5, V6]; xn--xld7443k.xn--4o7h; ; ; # 𑋪ၳ. +𑋪ၳ。𞽧; 𑋪ၳ.𞽧; [B1, B3, B6, P1, V5, V6]; xn--xld7443k.xn--4o7h; ; ; # 𑋪ၳ. +xn--xld7443k.xn--4o7h; 𑋪ၳ.𞽧; [B1, B3, B6, V5, V6]; xn--xld7443k.xn--4o7h; ; ; # 𑋪ၳ. +𞷏。ᠢ򓘆; 𞷏.ᠢ򓘆; [P1, V6]; xn--hd7h.xn--46e66060j; ; ; # .ᠢ +xn--hd7h.xn--46e66060j; 𞷏.ᠢ򓘆; [V6]; xn--hd7h.xn--46e66060j; ; ; # .ᠢ +𑄳㴼.‌𐹡⃫񫺦; 𑄳㴼.‌𐹡⃫񫺦; [B1, C1, P1, V5, V6]; xn--iym9428c.xn--0ug46a7218cllv0c; ; xn--iym9428c.xn--e1g3464g08p3b; [B1, P1, V5, V6] # 𑄳㴼.𐹡⃫ +𑄳㴼.‌𐹡⃫񫺦; ; [B1, C1, P1, V5, V6]; xn--iym9428c.xn--0ug46a7218cllv0c; ; xn--iym9428c.xn--e1g3464g08p3b; [B1, P1, V5, V6] # 𑄳㴼.𐹡⃫ +xn--iym9428c.xn--e1g3464g08p3b; 𑄳㴼.𐹡⃫񫺦; [B1, V5, V6]; xn--iym9428c.xn--e1g3464g08p3b; ; ; # 𑄳㴼.𐹡⃫ +xn--iym9428c.xn--0ug46a7218cllv0c; 𑄳㴼.‌𐹡⃫񫺦; [B1, C1, V5, V6]; xn--iym9428c.xn--0ug46a7218cllv0c; ; ; # 𑄳㴼.𐹡⃫ +񠻟𐹳𑈯。̝; 񠻟𐹳𑈯.̝; [B1, B3, B5, B6, P1, V5, V6]; xn--ro0dw7dey96m.xn--eta; ; ; # 𐹳𑈯.̝ +񠻟𐹳𑈯。̝; 񠻟𐹳𑈯.̝; [B1, B3, B5, B6, P1, V5, V6]; xn--ro0dw7dey96m.xn--eta; ; ; # 𐹳𑈯.̝ +xn--ro0dw7dey96m.xn--eta; 񠻟𐹳𑈯.̝; [B1, B3, B5, B6, V5, V6]; xn--ro0dw7dey96m.xn--eta; ; ; # 𐹳𑈯.̝ +ᢊ뾜󠱴𑚶。࢝𐹥; ᢊ뾜󠱴𑚶.࢝𐹥; [P1, V6]; xn--39e4566fjv8bwmt6n.xn--myb6415k; ; ; # ᢊ뾜𑚶.𐹥 +ᢊ뾜󠱴𑚶。࢝𐹥; ᢊ뾜󠱴𑚶.࢝𐹥; [P1, V6]; xn--39e4566fjv8bwmt6n.xn--myb6415k; ; ; # ᢊ뾜𑚶.𐹥 +xn--39e4566fjv8bwmt6n.xn--myb6415k; ᢊ뾜󠱴𑚶.࢝𐹥; [V6]; xn--39e4566fjv8bwmt6n.xn--myb6415k; ; ; # ᢊ뾜𑚶.𐹥 +𐹥≠。𐋲󠧠‌; 𐹥≠.𐋲󠧠‌; [B1, C1, P1, V6]; xn--1ch6704g.xn--0ug3840g51u4g; ; xn--1ch6704g.xn--m97cw2999c; [B1, P1, V6] # 𐹥≠.𐋲 +𐹥≠。𐋲󠧠‌; 𐹥≠.𐋲󠧠‌; [B1, C1, P1, V6]; xn--1ch6704g.xn--0ug3840g51u4g; ; xn--1ch6704g.xn--m97cw2999c; [B1, P1, V6] # 𐹥≠.𐋲 +𐹥≠。𐋲󠧠‌; 𐹥≠.𐋲󠧠‌; [B1, C1, P1, V6]; xn--1ch6704g.xn--0ug3840g51u4g; ; xn--1ch6704g.xn--m97cw2999c; [B1, P1, V6] # 𐹥≠.𐋲 +𐹥≠。𐋲󠧠‌; 𐹥≠.𐋲󠧠‌; [B1, C1, P1, V6]; xn--1ch6704g.xn--0ug3840g51u4g; ; xn--1ch6704g.xn--m97cw2999c; [B1, P1, V6] # 𐹥≠.𐋲 +xn--1ch6704g.xn--m97cw2999c; 𐹥≠.𐋲󠧠; [B1, V6]; xn--1ch6704g.xn--m97cw2999c; ; ; # 𐹥≠.𐋲 +xn--1ch6704g.xn--0ug3840g51u4g; 𐹥≠.𐋲󠧠‌; [B1, C1, V6]; xn--1ch6704g.xn--0ug3840g51u4g; ; ; # 𐹥≠.𐋲 +ᅟ񙯠्.‍꥓𐪤; ᅟ񙯠्.‍꥓𐪤; [B1, C2, P1, V6]; xn--n3b542bb085j.xn--1ug6815co9wc; ; xn--n3b542bb085j.xn--3j9al95p; [B5, B6, P1, V5, V6] # ्.꥓ +ᅟ񙯠्.‍꥓𐪤; ; [B1, C2, P1, V6]; xn--n3b542bb085j.xn--1ug6815co9wc; ; xn--n3b542bb085j.xn--3j9al95p; [B5, B6, P1, V5, V6] # ्.꥓ +xn--n3b542bb085j.xn--3j9al95p; ᅟ񙯠्.꥓𐪤; [B5, B6, V5, V6]; xn--n3b542bb085j.xn--3j9al95p; ; ; # ्.꥓ +xn--n3b542bb085j.xn--1ug6815co9wc; ᅟ񙯠्.‍꥓𐪤; [B1, C2, V6]; xn--n3b542bb085j.xn--1ug6815co9wc; ; ; # ्.꥓ +򌋔󠆎󠆗𑲕。≮; 򌋔𑲕.≮; [P1, V6]; xn--4m3dv4354a.xn--gdh; ; ; # 𑲕.≮ +򌋔󠆎󠆗𑲕。≮; 򌋔𑲕.≮; [P1, V6]; xn--4m3dv4354a.xn--gdh; ; ; # 𑲕.≮ +xn--4m3dv4354a.xn--gdh; 򌋔𑲕.≮; [V6]; xn--4m3dv4354a.xn--gdh; ; ; # 𑲕.≮ +󠆦.ࣣ暀≠; .ࣣ暀≠; [P1, V5, V6, X4_2]; .xn--m0b461k3g2c; [P1, V5, V6, A4_2]; ; # .ࣣ暀≠ +󠆦.ࣣ暀≠; .ࣣ暀≠; [P1, V5, V6, X4_2]; .xn--m0b461k3g2c; [P1, V5, V6, A4_2]; ; # .ࣣ暀≠ +.xn--m0b461k3g2c; .ࣣ暀≠; [V5, V6, X4_2]; .xn--m0b461k3g2c; [V5, V6, A4_2]; ; # .ࣣ暀≠ +𐡤꯭。ﴰ򜖅ᷰ; 𐡤꯭.شم򜖅ᷰ; [B2, B3, P1, V6]; xn--429ak76o.xn--zgb8a701kox37t; ; ; # 𐡤꯭.شمᷰ +𐡤꯭。شم򜖅ᷰ; 𐡤꯭.شم򜖅ᷰ; [B2, B3, P1, V6]; xn--429ak76o.xn--zgb8a701kox37t; ; ; # 𐡤꯭.شمᷰ +xn--429ak76o.xn--zgb8a701kox37t; 𐡤꯭.شم򜖅ᷰ; [B2, B3, V6]; xn--429ak76o.xn--zgb8a701kox37t; ; ; # 𐡤꯭.شمᷰ +𝉃‍⒈。Ⴌ𞱓; 𝉃‍⒈.Ⴌ𞱓; [B1, B5, B6, C2, P1, V5, V6]; xn--1ug68oq348b.xn--knd8464v; ; xn--tshz828m.xn--knd8464v; [B1, B5, B6, P1, V5, V6] # 𝉃⒈.Ⴌ +𝉃‍1.。Ⴌ𞱓; 𝉃‍1..Ⴌ𞱓; [B1, B5, B6, C2, P1, V5, V6, X4_2]; xn--1-tgn9827q..xn--knd8464v; [B1, B5, B6, C2, P1, V5, V6, A4_2]; xn--1-px8q..xn--knd8464v; [B1, B5, B6, P1, V5, V6, A4_2] # 𝉃1..Ⴌ +𝉃‍1.。ⴌ𞱓; 𝉃‍1..ⴌ𞱓; [B1, B5, B6, C2, P1, V5, V6, X4_2]; xn--1-tgn9827q..xn--3kj4524l; [B1, B5, B6, C2, P1, V5, V6, A4_2]; xn--1-px8q..xn--3kj4524l; [B1, B5, B6, P1, V5, V6, A4_2] # 𝉃1..ⴌ +xn--1-px8q..xn--3kj4524l; 𝉃1..ⴌ𞱓; [B1, B5, B6, V5, V6, X4_2]; xn--1-px8q..xn--3kj4524l; [B1, B5, B6, V5, V6, A4_2]; ; # 𝉃1..ⴌ +xn--1-tgn9827q..xn--3kj4524l; 𝉃‍1..ⴌ𞱓; [B1, B5, B6, C2, V5, V6, X4_2]; xn--1-tgn9827q..xn--3kj4524l; [B1, B5, B6, C2, V5, V6, A4_2]; ; # 𝉃1..ⴌ +xn--1-px8q..xn--knd8464v; 𝉃1..Ⴌ𞱓; [B1, B5, B6, V5, V6, X4_2]; xn--1-px8q..xn--knd8464v; [B1, B5, B6, V5, V6, A4_2]; ; # 𝉃1..Ⴌ +xn--1-tgn9827q..xn--knd8464v; 𝉃‍1..Ⴌ𞱓; [B1, B5, B6, C2, V5, V6, X4_2]; xn--1-tgn9827q..xn--knd8464v; [B1, B5, B6, C2, V5, V6, A4_2]; ; # 𝉃1..Ⴌ +𝉃‍⒈。ⴌ𞱓; 𝉃‍⒈.ⴌ𞱓; [B1, B5, B6, C2, P1, V5, V6]; xn--1ug68oq348b.xn--3kj4524l; ; xn--tshz828m.xn--3kj4524l; [B1, B5, B6, P1, V5, V6] # 𝉃⒈.ⴌ +xn--tshz828m.xn--3kj4524l; 𝉃⒈.ⴌ𞱓; [B1, B5, B6, V5, V6]; xn--tshz828m.xn--3kj4524l; ; ; # 𝉃⒈.ⴌ +xn--1ug68oq348b.xn--3kj4524l; 𝉃‍⒈.ⴌ𞱓; [B1, B5, B6, C2, V5, V6]; xn--1ug68oq348b.xn--3kj4524l; ; ; # 𝉃⒈.ⴌ +xn--tshz828m.xn--knd8464v; 𝉃⒈.Ⴌ𞱓; [B1, B5, B6, V5, V6]; xn--tshz828m.xn--knd8464v; ; ; # 𝉃⒈.Ⴌ +xn--1ug68oq348b.xn--knd8464v; 𝉃‍⒈.Ⴌ𞱓; [B1, B5, B6, C2, V5, V6]; xn--1ug68oq348b.xn--knd8464v; ; ; # 𝉃⒈.Ⴌ +󠣙੍𱫘𞤸.ς񵯞􈰔; ; [B1, P1, V6]; xn--ybc0236vjvxgt5q0g.xn--3xa03737giye6b; ; xn--ybc0236vjvxgt5q0g.xn--4xa82737giye6b; # ੍𞤸.ς +󠣙੍𱫘𞤖.Σ񵯞􈰔; 󠣙੍𱫘𞤸.σ񵯞􈰔; [B1, P1, V6]; xn--ybc0236vjvxgt5q0g.xn--4xa82737giye6b; ; ; # ੍𞤸.σ +󠣙੍𱫘𞤸.σ񵯞􈰔; ; [B1, P1, V6]; xn--ybc0236vjvxgt5q0g.xn--4xa82737giye6b; ; ; # ੍𞤸.σ +󠣙੍𱫘𞤖.σ񵯞􈰔; 󠣙੍𱫘𞤸.σ񵯞􈰔; [B1, P1, V6]; xn--ybc0236vjvxgt5q0g.xn--4xa82737giye6b; ; ; # ੍𞤸.σ +xn--ybc0236vjvxgt5q0g.xn--4xa82737giye6b; 󠣙੍𱫘𞤸.σ񵯞􈰔; [B1, V6]; xn--ybc0236vjvxgt5q0g.xn--4xa82737giye6b; ; ; # ੍𞤸.σ +󠣙੍𱫘𞤖.ς񵯞􈰔; 󠣙੍𱫘𞤸.ς񵯞􈰔; [B1, P1, V6]; xn--ybc0236vjvxgt5q0g.xn--3xa03737giye6b; ; xn--ybc0236vjvxgt5q0g.xn--4xa82737giye6b; # ੍𞤸.ς +xn--ybc0236vjvxgt5q0g.xn--3xa03737giye6b; 󠣙੍𱫘𞤸.ς񵯞􈰔; [B1, V6]; xn--ybc0236vjvxgt5q0g.xn--3xa03737giye6b; ; ; # ੍𞤸.ς +󠣙੍𱫘𞤸.Σ񵯞􈰔; 󠣙੍𱫘𞤸.σ񵯞􈰔; [B1, P1, V6]; xn--ybc0236vjvxgt5q0g.xn--4xa82737giye6b; ; ; # ੍𞤸.σ +ߓ。‌𐫀򞭱; ߓ.‌𐫀򞭱; [B1, C1, P1, V6]; xn--usb.xn--0ug9553gm3v5d; ; xn--usb.xn--pw9ci1099a; [B2, B3, P1, V6] # ߓ.𐫀 +xn--usb.xn--pw9ci1099a; ߓ.𐫀򞭱; [B2, B3, V6]; xn--usb.xn--pw9ci1099a; ; ; # ߓ.𐫀 +xn--usb.xn--0ug9553gm3v5d; ߓ.‌𐫀򞭱; [B1, C1, V6]; xn--usb.xn--0ug9553gm3v5d; ; ; # ߓ.𐫀 +ᰮ𞀝.֦ꡟ𞤕󠆖; ᰮ𞀝.֦ꡟ𞤷; [B1, B3, B6, V5]; xn--q1f4493q.xn--xcb8244fifvj; ; ; # ᰮ𞀝.֦ꡟ𞤷 +ᰮ𞀝.֦ꡟ𞤷󠆖; ᰮ𞀝.֦ꡟ𞤷; [B1, B3, B6, V5]; xn--q1f4493q.xn--xcb8244fifvj; ; ; # ᰮ𞀝.֦ꡟ𞤷 +xn--q1f4493q.xn--xcb8244fifvj; ᰮ𞀝.֦ꡟ𞤷; [B1, B3, B6, V5]; xn--q1f4493q.xn--xcb8244fifvj; ; ; # ᰮ𞀝.֦ꡟ𞤷 +䂹󾖅𐋦.‍; 䂹󾖅𐋦.‍; [C2, P1, V6]; xn--0on3543c5981i.xn--1ug; ; xn--0on3543c5981i.; [P1, V6] # 䂹𐋦. +䂹󾖅𐋦.‍; ; [C2, P1, V6]; xn--0on3543c5981i.xn--1ug; ; xn--0on3543c5981i.; [P1, V6] # 䂹𐋦. +xn--0on3543c5981i.; 䂹󾖅𐋦.; [V6]; xn--0on3543c5981i.; ; ; # 䂹𐋦. +xn--0on3543c5981i.xn--1ug; 䂹󾖅𐋦.‍; [C2, V6]; xn--0on3543c5981i.xn--1ug; ; ; # 䂹𐋦. +꧀‌𐹲‌。ݧ🄉; ꧀‌𐹲‌.ݧ🄉; [B5, B6, C1, P1, V5, V6]; xn--0uga8686hdgvd.xn--rpb6081w; ; xn--7m9an32q.xn--rpb6081w; [B5, B6, P1, V5, V6] # ꧀𐹲.ݧ🄉 +꧀‌𐹲‌。ݧ8,; ꧀‌𐹲‌.ݧ8,; [B3, B5, B6, C1, P1, V5, V6]; xn--0uga8686hdgvd.xn--8,-qle; ; xn--7m9an32q.xn--8,-qle; [B3, B5, B6, P1, V5, V6] # ꧀𐹲.ݧ8, +xn--7m9an32q.xn--8,-qle; ꧀𐹲.ݧ8,; [B3, B5, B6, P1, V5, V6]; xn--7m9an32q.xn--8,-qle; ; ; # ꧀𐹲.ݧ8, +xn--0uga8686hdgvd.xn--8,-qle; ꧀‌𐹲‌.ݧ8,; [B3, B5, B6, C1, P1, V5, V6]; xn--0uga8686hdgvd.xn--8,-qle; ; ; # ꧀𐹲.ݧ8, +xn--7m9an32q.xn--rpb6081w; ꧀𐹲.ݧ🄉; [B5, B6, V5, V6]; xn--7m9an32q.xn--rpb6081w; ; ; # ꧀𐹲.ݧ🄉 +xn--0uga8686hdgvd.xn--rpb6081w; ꧀‌𐹲‌.ݧ🄉; [B5, B6, C1, V5, V6]; xn--0uga8686hdgvd.xn--rpb6081w; ; ; # ꧀𐹲.ݧ🄉 +︒。Ⴃ≯; ︒.Ⴃ≯; [P1, V6]; xn--y86c.xn--bnd622g; ; ; # ︒.Ⴃ≯ +︒。Ⴃ≯; ︒.Ⴃ≯; [P1, V6]; xn--y86c.xn--bnd622g; ; ; # ︒.Ⴃ≯ +。。Ⴃ≯; ..Ⴃ≯; [P1, V6, X4_2]; ..xn--bnd622g; [P1, V6, A4_2]; ; # ..Ⴃ≯ +。。Ⴃ≯; ..Ⴃ≯; [P1, V6, X4_2]; ..xn--bnd622g; [P1, V6, A4_2]; ; # ..Ⴃ≯ +。。ⴃ≯; ..ⴃ≯; [P1, V6, X4_2]; ..xn--hdh782b; [P1, V6, A4_2]; ; # ..ⴃ≯ +。。ⴃ≯; ..ⴃ≯; [P1, V6, X4_2]; ..xn--hdh782b; [P1, V6, A4_2]; ; # ..ⴃ≯ +..xn--hdh782b; ..ⴃ≯; [V6, X4_2]; ..xn--hdh782b; [V6, A4_2]; ; # ..ⴃ≯ +..xn--bnd622g; ..Ⴃ≯; [V6, X4_2]; ..xn--bnd622g; [V6, A4_2]; ; # ..Ⴃ≯ +︒。ⴃ≯; ︒.ⴃ≯; [P1, V6]; xn--y86c.xn--hdh782b; ; ; # ︒.ⴃ≯ +︒。ⴃ≯; ︒.ⴃ≯; [P1, V6]; xn--y86c.xn--hdh782b; ; ; # ︒.ⴃ≯ +xn--y86c.xn--hdh782b; ︒.ⴃ≯; [V6]; xn--y86c.xn--hdh782b; ; ; # ︒.ⴃ≯ +xn--y86c.xn--bnd622g; ︒.Ⴃ≯; [V6]; xn--y86c.xn--bnd622g; ; ; # ︒.Ⴃ≯ +𐹮。󠢼‍; 𐹮.󠢼‍; [B1, C2, P1, V6]; xn--mo0d.xn--1ug18431l; ; xn--mo0d.xn--wy46e; [B1, P1, V6] # 𐹮. +𐹮。󠢼‍; 𐹮.󠢼‍; [B1, C2, P1, V6]; xn--mo0d.xn--1ug18431l; ; xn--mo0d.xn--wy46e; [B1, P1, V6] # 𐹮. +xn--mo0d.xn--wy46e; 𐹮.󠢼; [B1, V6]; xn--mo0d.xn--wy46e; ; ; # 𐹮. +xn--mo0d.xn--1ug18431l; 𐹮.󠢼‍; [B1, C2, V6]; xn--mo0d.xn--1ug18431l; ; ; # 𐹮. +Ⴞ𐹨。︒ݽ‍Ⴏ; Ⴞ𐹨.︒ݽ‍Ⴏ; [B1, B5, B6, C2, P1, V6]; xn--2nd0990k.xn--eqb228bgzmvp0t; ; xn--2nd0990k.xn--eqb228b583r; [B1, B5, B6, P1, V6] # Ⴞ𐹨.︒ݽႯ +Ⴞ𐹨。。ݽ‍Ⴏ; Ⴞ𐹨..ݽ‍Ⴏ; [B2, B3, B5, B6, C2, P1, V6, X4_2]; xn--2nd0990k..xn--eqb228bgzm; [B2, B3, B5, B6, C2, P1, V6, A4_2]; xn--2nd0990k..xn--eqb228b; [B2, B3, B5, B6, P1, V6, A4_2] # Ⴞ𐹨..ݽႯ +ⴞ𐹨。。ݽ‍ⴏ; ⴞ𐹨..ݽ‍ⴏ; [B2, B3, B5, B6, C2, X4_2]; xn--mlju223e..xn--eqb096jpgj; [B2, B3, B5, B6, C2, A4_2]; xn--mlju223e..xn--eqb053q; [B2, B3, B5, B6, A4_2] # ⴞ𐹨..ݽⴏ +Ⴞ𐹨。。ݽ‍ⴏ; Ⴞ𐹨..ݽ‍ⴏ; [B2, B3, B5, B6, C2, P1, V6, X4_2]; xn--2nd0990k..xn--eqb096jpgj; [B2, B3, B5, B6, C2, P1, V6, A4_2]; xn--2nd0990k..xn--eqb053q; [B2, B3, B5, B6, P1, V6, A4_2] # Ⴞ𐹨..ݽⴏ +xn--2nd0990k..xn--eqb053q; Ⴞ𐹨..ݽⴏ; [B2, B3, B5, B6, V6, X4_2]; xn--2nd0990k..xn--eqb053q; [B2, B3, B5, B6, V6, A4_2]; ; # Ⴞ𐹨..ݽⴏ +xn--2nd0990k..xn--eqb096jpgj; Ⴞ𐹨..ݽ‍ⴏ; [B2, B3, B5, B6, C2, V6, X4_2]; xn--2nd0990k..xn--eqb096jpgj; [B2, B3, B5, B6, C2, V6, A4_2]; ; # Ⴞ𐹨..ݽⴏ +xn--mlju223e..xn--eqb053q; ⴞ𐹨..ݽⴏ; [B2, B3, B5, B6, X4_2]; xn--mlju223e..xn--eqb053q; [B2, B3, B5, B6, A4_2]; ; # ⴞ𐹨..ݽⴏ +xn--mlju223e..xn--eqb096jpgj; ⴞ𐹨..ݽ‍ⴏ; [B2, B3, B5, B6, C2, X4_2]; xn--mlju223e..xn--eqb096jpgj; [B2, B3, B5, B6, C2, A4_2]; ; # ⴞ𐹨..ݽⴏ +xn--2nd0990k..xn--eqb228b; Ⴞ𐹨..ݽႯ; [B2, B3, B5, B6, V6, X4_2]; xn--2nd0990k..xn--eqb228b; [B2, B3, B5, B6, V6, A4_2]; ; # Ⴞ𐹨..ݽႯ +xn--2nd0990k..xn--eqb228bgzm; Ⴞ𐹨..ݽ‍Ⴏ; [B2, B3, B5, B6, C2, V6, X4_2]; xn--2nd0990k..xn--eqb228bgzm; [B2, B3, B5, B6, C2, V6, A4_2]; ; # Ⴞ𐹨..ݽႯ +ⴞ𐹨。︒ݽ‍ⴏ; ⴞ𐹨.︒ݽ‍ⴏ; [B1, B5, B6, C2, P1, V6]; xn--mlju223e.xn--eqb096jpgj9y7r; ; xn--mlju223e.xn--eqb053qjk7l; [B1, B5, B6, P1, V6] # ⴞ𐹨.︒ݽⴏ +Ⴞ𐹨。︒ݽ‍ⴏ; Ⴞ𐹨.︒ݽ‍ⴏ; [B1, B5, B6, C2, P1, V6]; xn--2nd0990k.xn--eqb096jpgj9y7r; ; xn--2nd0990k.xn--eqb053qjk7l; [B1, B5, B6, P1, V6] # Ⴞ𐹨.︒ݽⴏ +xn--2nd0990k.xn--eqb053qjk7l; Ⴞ𐹨.︒ݽⴏ; [B1, B5, B6, V6]; xn--2nd0990k.xn--eqb053qjk7l; ; ; # Ⴞ𐹨.︒ݽⴏ +xn--2nd0990k.xn--eqb096jpgj9y7r; Ⴞ𐹨.︒ݽ‍ⴏ; [B1, B5, B6, C2, V6]; xn--2nd0990k.xn--eqb096jpgj9y7r; ; ; # Ⴞ𐹨.︒ݽⴏ +xn--mlju223e.xn--eqb053qjk7l; ⴞ𐹨.︒ݽⴏ; [B1, B5, B6, V6]; xn--mlju223e.xn--eqb053qjk7l; ; ; # ⴞ𐹨.︒ݽⴏ +xn--mlju223e.xn--eqb096jpgj9y7r; ⴞ𐹨.︒ݽ‍ⴏ; [B1, B5, B6, C2, V6]; xn--mlju223e.xn--eqb096jpgj9y7r; ; ; # ⴞ𐹨.︒ݽⴏ +xn--2nd0990k.xn--eqb228b583r; Ⴞ𐹨.︒ݽႯ; [B1, B5, B6, V6]; xn--2nd0990k.xn--eqb228b583r; ; ; # Ⴞ𐹨.︒ݽႯ +xn--2nd0990k.xn--eqb228bgzmvp0t; Ⴞ𐹨.︒ݽ‍Ⴏ; [B1, B5, B6, C2, V6]; xn--2nd0990k.xn--eqb228bgzmvp0t; ; ; # Ⴞ𐹨.︒ݽႯ +‌Ⴆ𝟹。-⃒-ߑ; ‌Ⴆ3.-⃒-ߑ; [B1, C1, P1, V3, V6]; xn--3-i0g939i.xn-----vue617w; ; xn--3-i0g.xn-----vue617w; [B1, P1, V3, V6] # Ⴆ3.-⃒-ߑ +‌Ⴆ3。-⃒-ߑ; ‌Ⴆ3.-⃒-ߑ; [B1, C1, P1, V3, V6]; xn--3-i0g939i.xn-----vue617w; ; xn--3-i0g.xn-----vue617w; [B1, P1, V3, V6] # Ⴆ3.-⃒-ߑ +‌ⴆ3。-⃒-ߑ; ‌ⴆ3.-⃒-ߑ; [B1, C1, V3]; xn--3-rgnv99c.xn-----vue617w; ; xn--3-lvs.xn-----vue617w; [B1, V3] # ⴆ3.-⃒-ߑ +xn--3-lvs.xn-----vue617w; ⴆ3.-⃒-ߑ; [B1, V3]; xn--3-lvs.xn-----vue617w; ; ; # ⴆ3.-⃒-ߑ +xn--3-rgnv99c.xn-----vue617w; ‌ⴆ3.-⃒-ߑ; [B1, C1, V3]; xn--3-rgnv99c.xn-----vue617w; ; ; # ⴆ3.-⃒-ߑ +xn--3-i0g.xn-----vue617w; Ⴆ3.-⃒-ߑ; [B1, V3, V6]; xn--3-i0g.xn-----vue617w; ; ; # Ⴆ3.-⃒-ߑ +xn--3-i0g939i.xn-----vue617w; ‌Ⴆ3.-⃒-ߑ; [B1, C1, V3, V6]; xn--3-i0g939i.xn-----vue617w; ; ; # Ⴆ3.-⃒-ߑ +‌ⴆ𝟹。-⃒-ߑ; ‌ⴆ3.-⃒-ߑ; [B1, C1, V3]; xn--3-rgnv99c.xn-----vue617w; ; xn--3-lvs.xn-----vue617w; [B1, V3] # ⴆ3.-⃒-ߑ +箃Ⴡ-󠁝。≠-🤖; 箃Ⴡ-󠁝.≠-🤖; [P1, V6]; xn----11g3013fy8x5m.xn----tfot873s; ; ; # 箃Ⴡ-.≠-🤖 +箃Ⴡ-󠁝。≠-🤖; 箃Ⴡ-󠁝.≠-🤖; [P1, V6]; xn----11g3013fy8x5m.xn----tfot873s; ; ; # 箃Ⴡ-.≠-🤖 +箃Ⴡ-󠁝。≠-🤖; 箃Ⴡ-󠁝.≠-🤖; [P1, V6]; xn----11g3013fy8x5m.xn----tfot873s; ; ; # 箃Ⴡ-.≠-🤖 +箃Ⴡ-󠁝。≠-🤖; 箃Ⴡ-󠁝.≠-🤖; [P1, V6]; xn----11g3013fy8x5m.xn----tfot873s; ; ; # 箃Ⴡ-.≠-🤖 +箃ⴡ-󠁝。≠-🤖; 箃ⴡ-󠁝.≠-🤖; [P1, V6]; xn----4wsr321ay823p.xn----tfot873s; ; ; # 箃ⴡ-.≠-🤖 +箃ⴡ-󠁝。≠-🤖; 箃ⴡ-󠁝.≠-🤖; [P1, V6]; xn----4wsr321ay823p.xn----tfot873s; ; ; # 箃ⴡ-.≠-🤖 +xn----4wsr321ay823p.xn----tfot873s; 箃ⴡ-󠁝.≠-🤖; [V6]; xn----4wsr321ay823p.xn----tfot873s; ; ; # 箃ⴡ-.≠-🤖 +xn----11g3013fy8x5m.xn----tfot873s; 箃Ⴡ-󠁝.≠-🤖; [V6]; xn----11g3013fy8x5m.xn----tfot873s; ; ; # 箃Ⴡ-.≠-🤖 +箃ⴡ-󠁝。≠-🤖; 箃ⴡ-󠁝.≠-🤖; [P1, V6]; xn----4wsr321ay823p.xn----tfot873s; ; ; # 箃ⴡ-.≠-🤖 +箃ⴡ-󠁝。≠-🤖; 箃ⴡ-󠁝.≠-🤖; [P1, V6]; xn----4wsr321ay823p.xn----tfot873s; ; ; # 箃ⴡ-.≠-🤖 +ߥ.ڵ; ; ; xn--dtb.xn--okb; ; ; # ߥ.ڵ +xn--dtb.xn--okb; ߥ.ڵ; ; xn--dtb.xn--okb; ; ; # ߥ.ڵ +‌‍.𞤿; ; [B1, C1, C2]; xn--0ugc.xn--3e6h; ; .xn--3e6h; [A4_2] # .𞤿 +‌‍.𞤝; ‌‍.𞤿; [B1, C1, C2]; xn--0ugc.xn--3e6h; ; .xn--3e6h; [A4_2] # .𞤿 +.xn--3e6h; .𞤿; [X4_2]; .xn--3e6h; [A4_2]; ; # .𞤿 +xn--0ugc.xn--3e6h; ‌‍.𞤿; [B1, C1, C2]; xn--0ugc.xn--3e6h; ; ; # .𞤿 +xn--3e6h; 𞤿; ; xn--3e6h; ; ; # 𞤿 +𞤿; ; ; xn--3e6h; ; ; # 𞤿 +𞤝; 𞤿; ; xn--3e6h; ; ; # 𞤿 +🜑𐹧ع.ς𑍍蜹; ; [B1]; xn--4gb3736kk4zf.xn--3xa4248dy27d; ; xn--4gb3736kk4zf.xn--4xa2248dy27d; # 🜑𐹧ع.ς𑍍蜹 +🜑𐹧ع.Σ𑍍蜹; 🜑𐹧ع.σ𑍍蜹; [B1]; xn--4gb3736kk4zf.xn--4xa2248dy27d; ; ; # 🜑𐹧ع.σ𑍍蜹 +🜑𐹧ع.σ𑍍蜹; ; [B1]; xn--4gb3736kk4zf.xn--4xa2248dy27d; ; ; # 🜑𐹧ع.σ𑍍蜹 +xn--4gb3736kk4zf.xn--4xa2248dy27d; 🜑𐹧ع.σ𑍍蜹; [B1]; xn--4gb3736kk4zf.xn--4xa2248dy27d; ; ; # 🜑𐹧ع.σ𑍍蜹 +xn--4gb3736kk4zf.xn--3xa4248dy27d; 🜑𐹧ع.ς𑍍蜹; [B1]; xn--4gb3736kk4zf.xn--3xa4248dy27d; ; ; # 🜑𐹧ع.ς𑍍蜹 +򫠐ス􆟤٩.󚃟; 򫠐ス􆟤٩.󚃟; [B5, B6, P1, V6]; xn--iib777sp230oo708a.xn--7824e; ; ; # ス٩. +򫠐ス􆟤٩.󚃟; ; [B5, B6, P1, V6]; xn--iib777sp230oo708a.xn--7824e; ; ; # ス٩. +xn--iib777sp230oo708a.xn--7824e; 򫠐ス􆟤٩.󚃟; [B5, B6, V6]; xn--iib777sp230oo708a.xn--7824e; ; ; # ス٩. +𝪣򕡝.֚?ۂ; 𝪣򕡝.֚?ۂ; [B1, P1, V5, V6]; xn--8c3hu7971a.֚?ۂ; [B1, P1, V5, V6, A3]; ; # 𝪣.֚ۂ +𝪣򕡝.֚?ۂ; 𝪣򕡝.֚?ۂ; [B1, P1, V5, V6]; xn--8c3hu7971a.֚?ۂ; [B1, P1, V5, V6, A3]; ; # 𝪣.֚ۂ +𝪣򕡝.֚?ۂ; ; [B1, P1, V5, V6]; xn--8c3hu7971a.֚?ۂ; [B1, P1, V5, V6, A3]; ; # 𝪣.֚ۂ +𝪣򕡝.֚?ۂ; 𝪣򕡝.֚?ۂ; [B1, P1, V5, V6]; xn--8c3hu7971a.֚?ۂ; [B1, P1, V5, V6, A3]; ; # 𝪣.֚ۂ +xn--8c3hu7971a.֚?ۂ; 𝪣򕡝.֚?ۂ; [B1, P1, V5, V6]; xn--8c3hu7971a.֚?ۂ; [B1, P1, V5, V6, A3]; ; # 𝪣.֚ۂ +xn--8c3hu7971a.֚?ۂ; 𝪣򕡝.֚?ۂ; [B1, P1, V5, V6]; xn--8c3hu7971a.֚?ۂ; [B1, P1, V5, V6, A3]; ; # 𝪣.֚ۂ +XN--8C3HU7971A.֚?ۂ; 𝪣򕡝.֚?ۂ; [B1, P1, V5, V6]; xn--8c3hu7971a.֚?ۂ; [B1, P1, V5, V6, A3]; ; # 𝪣.֚ۂ +XN--8C3HU7971A.֚?ۂ; 𝪣򕡝.֚?ۂ; [B1, P1, V5, V6]; xn--8c3hu7971a.֚?ۂ; [B1, P1, V5, V6, A3]; ; # 𝪣.֚ۂ +Xn--8c3hu7971a.֚?ۂ; 𝪣򕡝.֚?ۂ; [B1, P1, V5, V6]; xn--8c3hu7971a.֚?ۂ; [B1, P1, V5, V6, A3]; ; # 𝪣.֚ۂ +Xn--8c3hu7971a.֚?ۂ; 𝪣򕡝.֚?ۂ; [B1, P1, V5, V6]; xn--8c3hu7971a.֚?ۂ; [B1, P1, V5, V6, A3]; ; # 𝪣.֚ۂ +٠򪓵‌。ݗ; ٠򪓵‌.ݗ; [B1, C1, P1, V6]; xn--8hb852ke991q.xn--bpb; ; xn--8hb82030l.xn--bpb; [B1, P1, V6] # ٠.ݗ +xn--8hb82030l.xn--bpb; ٠򪓵.ݗ; [B1, V6]; xn--8hb82030l.xn--bpb; ; ; # ٠.ݗ +xn--8hb852ke991q.xn--bpb; ٠򪓵‌.ݗ; [B1, C1, V6]; xn--8hb852ke991q.xn--bpb; ; ; # ٠.ݗ +်‍‌。-‌; ်‍‌.-‌; [C1, V3, V5]; xn--bkd412fca.xn----sgn; ; xn--bkd.-; [V3, V5] # ်.- +xn--bkd.-; ်.-; [V3, V5]; xn--bkd.-; ; ; # ်.- +xn--bkd412fca.xn----sgn; ်‍‌.-‌; [C1, V3, V5]; xn--bkd412fca.xn----sgn; ; ; # ်.- +︒。᭄ᡉ; ︒.᭄ᡉ; [P1, V5, V6]; xn--y86c.xn--87e93m; ; ; # ︒.᭄ᡉ +。。᭄ᡉ; ..᭄ᡉ; [V5, X4_2]; ..xn--87e93m; [V5, A4_2]; ; # ..᭄ᡉ +..xn--87e93m; ..᭄ᡉ; [V5, X4_2]; ..xn--87e93m; [V5, A4_2]; ; # ..᭄ᡉ +xn--y86c.xn--87e93m; ︒.᭄ᡉ; [V5, V6]; xn--y86c.xn--87e93m; ; ; # ︒.᭄ᡉ +ݘß。ጫᢊݨ𝟐; ݘß.ጫᢊݨ2; [B2, B3, B5]; xn--zca724a.xn--2-b5c641gfmf; ; xn--ss-gke.xn--2-b5c641gfmf; # ݘß.ጫᢊݨ2 +ݘß。ጫᢊݨ2; ݘß.ጫᢊݨ2; [B2, B3, B5]; xn--zca724a.xn--2-b5c641gfmf; ; xn--ss-gke.xn--2-b5c641gfmf; # ݘß.ጫᢊݨ2 +ݘSS。ጫᢊݨ2; ݘss.ጫᢊݨ2; [B2, B3, B5]; xn--ss-gke.xn--2-b5c641gfmf; ; ; # ݘss.ጫᢊݨ2 +ݘss。ጫᢊݨ2; ݘss.ጫᢊݨ2; [B2, B3, B5]; xn--ss-gke.xn--2-b5c641gfmf; ; ; # ݘss.ጫᢊݨ2 +xn--ss-gke.xn--2-b5c641gfmf; ݘss.ጫᢊݨ2; [B2, B3, B5]; xn--ss-gke.xn--2-b5c641gfmf; ; ; # ݘss.ጫᢊݨ2 +xn--zca724a.xn--2-b5c641gfmf; ݘß.ጫᢊݨ2; [B2, B3, B5]; xn--zca724a.xn--2-b5c641gfmf; ; ; # ݘß.ጫᢊݨ2 +ݘSS。ጫᢊݨ𝟐; ݘss.ጫᢊݨ2; [B2, B3, B5]; xn--ss-gke.xn--2-b5c641gfmf; ; ; # ݘss.ጫᢊݨ2 +ݘss。ጫᢊݨ𝟐; ݘss.ጫᢊݨ2; [B2, B3, B5]; xn--ss-gke.xn--2-b5c641gfmf; ; ; # ݘss.ጫᢊݨ2 +ݘSs。ጫᢊݨ2; ݘss.ጫᢊݨ2; [B2, B3, B5]; xn--ss-gke.xn--2-b5c641gfmf; ; ; # ݘss.ጫᢊݨ2 +ݘSs。ጫᢊݨ𝟐; ݘss.ጫᢊݨ2; [B2, B3, B5]; xn--ss-gke.xn--2-b5c641gfmf; ; ; # ݘss.ጫᢊݨ2 +߃𞶇ᚲ.ं͓𝟚্; ߃𞶇ᚲ.ं͓2্; [B1, B2, B3, P1, V5, V6]; xn--esb067enh07a.xn--2-lgb874bjxa; ; ; # ߃ᚲ.ं͓2্ +߃𞶇ᚲ.ं͓2্; ; [B1, B2, B3, P1, V5, V6]; xn--esb067enh07a.xn--2-lgb874bjxa; ; ; # ߃ᚲ.ं͓2্ +xn--esb067enh07a.xn--2-lgb874bjxa; ߃𞶇ᚲ.ं͓2্; [B1, B2, B3, V5, V6]; xn--esb067enh07a.xn--2-lgb874bjxa; ; ; # ߃ᚲ.ं͓2্ +-᮫︒‍.񒶈񥹓; ; [C2, P1, V3, V6]; xn----qmlv7tw180a.xn--x50zy803a; ; xn----qml1407i.xn--x50zy803a; [P1, V3, V6] # -᮫︒. +-᮫。‍.񒶈񥹓; -᮫.‍.񒶈񥹓; [C2, P1, V3, V6]; xn----qml.xn--1ug.xn--x50zy803a; ; xn----qml..xn--x50zy803a; [P1, V3, V6, A4_2] # -᮫.. +xn----qml..xn--x50zy803a; -᮫..񒶈񥹓; [V3, V6, X4_2]; xn----qml..xn--x50zy803a; [V3, V6, A4_2]; ; # -᮫.. +xn----qml.xn--1ug.xn--x50zy803a; -᮫.‍.񒶈񥹓; [C2, V3, V6]; xn----qml.xn--1ug.xn--x50zy803a; ; ; # -᮫.. +xn----qml1407i.xn--x50zy803a; -᮫︒.񒶈񥹓; [V3, V6]; xn----qml1407i.xn--x50zy803a; ; ; # -᮫︒. +xn----qmlv7tw180a.xn--x50zy803a; -᮫︒‍.񒶈񥹓; [C2, V3, V6]; xn----qmlv7tw180a.xn--x50zy803a; ; ; # -᮫︒. +󠦮.≯𞀆; ; [P1, V6]; xn--t546e.xn--hdh5166o; ; ; # .≯𞀆 +󠦮.≯𞀆; 󠦮.≯𞀆; [P1, V6]; xn--t546e.xn--hdh5166o; ; ; # .≯𞀆 +xn--t546e.xn--hdh5166o; 󠦮.≯𞀆; [V6]; xn--t546e.xn--hdh5166o; ; ; # .≯𞀆 +-𑄳󠊗𐹩。𞮱; -𑄳󠊗𐹩.𞮱; [B1, P1, V3, V6]; xn----p26i72em2894c.xn--zw6h; ; ; # -𑄳𐹩. +xn----p26i72em2894c.xn--zw6h; -𑄳󠊗𐹩.𞮱; [B1, V3, V6]; xn----p26i72em2894c.xn--zw6h; ; ; # -𑄳𐹩. +ڹ.ᡳᅟ; ڹ.ᡳᅟ; [P1, V6]; xn--skb.xn--osd737a; ; ; # ڹ.ᡳ +ڹ.ᡳᅟ; ; [P1, V6]; xn--skb.xn--osd737a; ; ; # ڹ.ᡳ +xn--skb.xn--osd737a; ڹ.ᡳᅟ; [V6]; xn--skb.xn--osd737a; ; ; # ڹ.ᡳ +㨛𘱎.︒𝟕ഁ; 㨛𘱎.︒7ഁ; [P1, V6]; xn--mbm8237g.xn--7-7hf1526p; ; ; # 㨛𘱎.︒7ഁ +㨛𘱎.。7ഁ; 㨛𘱎..7ഁ; [P1, V6, X4_2]; xn--mbm8237g..xn--7-7hf; [P1, V6, A4_2]; ; # 㨛𘱎..7ഁ +xn--mbm8237g..xn--7-7hf; 㨛𘱎..7ഁ; [V6, X4_2]; xn--mbm8237g..xn--7-7hf; [V6, A4_2]; ; # 㨛𘱎..7ഁ +xn--mbm8237g.xn--7-7hf1526p; 㨛𘱎.︒7ഁ; [V6]; xn--mbm8237g.xn--7-7hf1526p; ; ; # 㨛𘱎.︒7ഁ +۝𻱧-。𞷁⁤𞤣≮; ۝𻱧-.𞷁𞤣≮; [B1, B3, P1, V3, V6]; xn----dxc06304e.xn--gdh5020pk5c; ; ; # -.𞤣≮ +۝𻱧-。𞷁⁤𞤣≮; ۝𻱧-.𞷁𞤣≮; [B1, B3, P1, V3, V6]; xn----dxc06304e.xn--gdh5020pk5c; ; ; # -.𞤣≮ +۝𻱧-。𞷁⁤𞤣≮; ۝𻱧-.𞷁𞤣≮; [B1, B3, P1, V3, V6]; xn----dxc06304e.xn--gdh5020pk5c; ; ; # -.𞤣≮ +۝𻱧-。𞷁⁤𞤣≮; ۝𻱧-.𞷁𞤣≮; [B1, B3, P1, V3, V6]; xn----dxc06304e.xn--gdh5020pk5c; ; ; # -.𞤣≮ +۝𻱧-。𞷁⁤𞤁≮; ۝𻱧-.𞷁𞤣≮; [B1, B3, P1, V3, V6]; xn----dxc06304e.xn--gdh5020pk5c; ; ; # -.𞤣≮ +۝𻱧-。𞷁⁤𞤁≮; ۝𻱧-.𞷁𞤣≮; [B1, B3, P1, V3, V6]; xn----dxc06304e.xn--gdh5020pk5c; ; ; # -.𞤣≮ +xn----dxc06304e.xn--gdh5020pk5c; ۝𻱧-.𞷁𞤣≮; [B1, B3, V3, V6]; xn----dxc06304e.xn--gdh5020pk5c; ; ; # -.𞤣≮ +۝𻱧-。𞷁⁤𞤁≮; ۝𻱧-.𞷁𞤣≮; [B1, B3, P1, V3, V6]; xn----dxc06304e.xn--gdh5020pk5c; ; ; # -.𞤣≮ +۝𻱧-。𞷁⁤𞤁≮; ۝𻱧-.𞷁𞤣≮; [B1, B3, P1, V3, V6]; xn----dxc06304e.xn--gdh5020pk5c; ; ; # -.𞤣≮ +ß‌꫶ᢥ.⊶ჁႶ; ß‌꫶ᢥ.⊶ჁႶ; [C1, P1, V6]; xn--zca682johfi89m.xn--undv409k; ; xn--ss-4epx629f.xn--undv409k; [P1, V6] # ß꫶ᢥ.⊶ჁႶ +ß‌꫶ᢥ.⊶ჁႶ; ; [C1, P1, V6]; xn--zca682johfi89m.xn--undv409k; ; xn--ss-4epx629f.xn--undv409k; [P1, V6] # ß꫶ᢥ.⊶ჁႶ +ß‌꫶ᢥ.⊶ⴡⴖ; ; [C1]; xn--zca682johfi89m.xn--ifh802b6a; ; xn--ss-4epx629f.xn--ifh802b6a; [] # ß꫶ᢥ.⊶ⴡⴖ +SS‌꫶ᢥ.⊶ჁႶ; ss‌꫶ᢥ.⊶ჁႶ; [C1, P1, V6]; xn--ss-4ep585bkm5p.xn--undv409k; ; xn--ss-4epx629f.xn--undv409k; [P1, V6] # ss꫶ᢥ.⊶ჁႶ +ss‌꫶ᢥ.⊶ⴡⴖ; ; [C1]; xn--ss-4ep585bkm5p.xn--ifh802b6a; ; xn--ss-4epx629f.xn--ifh802b6a; [] # ss꫶ᢥ.⊶ⴡⴖ +Ss‌꫶ᢥ.⊶Ⴡⴖ; ss‌꫶ᢥ.⊶Ⴡⴖ; [C1, P1, V6]; xn--ss-4ep585bkm5p.xn--5nd703gyrh; ; xn--ss-4epx629f.xn--5nd703gyrh; [P1, V6] # ss꫶ᢥ.⊶Ⴡⴖ +xn--ss-4epx629f.xn--5nd703gyrh; ss꫶ᢥ.⊶Ⴡⴖ; [V6]; xn--ss-4epx629f.xn--5nd703gyrh; ; ; # ss꫶ᢥ.⊶Ⴡⴖ +xn--ss-4ep585bkm5p.xn--5nd703gyrh; ss‌꫶ᢥ.⊶Ⴡⴖ; [C1, V6]; xn--ss-4ep585bkm5p.xn--5nd703gyrh; ; ; # ss꫶ᢥ.⊶Ⴡⴖ +xn--ss-4epx629f.xn--ifh802b6a; ss꫶ᢥ.⊶ⴡⴖ; ; xn--ss-4epx629f.xn--ifh802b6a; ; ; # ss꫶ᢥ.⊶ⴡⴖ +ss꫶ᢥ.⊶ⴡⴖ; ; ; xn--ss-4epx629f.xn--ifh802b6a; ; ; # ss꫶ᢥ.⊶ⴡⴖ +SS꫶ᢥ.⊶ჁႶ; ss꫶ᢥ.⊶ჁႶ; [P1, V6]; xn--ss-4epx629f.xn--undv409k; ; ; # ss꫶ᢥ.⊶ჁႶ +Ss꫶ᢥ.⊶Ⴡⴖ; ss꫶ᢥ.⊶Ⴡⴖ; [P1, V6]; xn--ss-4epx629f.xn--5nd703gyrh; ; ; # ss꫶ᢥ.⊶Ⴡⴖ +xn--ss-4epx629f.xn--undv409k; ss꫶ᢥ.⊶ჁႶ; [V6]; xn--ss-4epx629f.xn--undv409k; ; ; # ss꫶ᢥ.⊶ჁႶ +xn--ss-4ep585bkm5p.xn--ifh802b6a; ss‌꫶ᢥ.⊶ⴡⴖ; [C1]; xn--ss-4ep585bkm5p.xn--ifh802b6a; ; ; # ss꫶ᢥ.⊶ⴡⴖ +xn--ss-4ep585bkm5p.xn--undv409k; ss‌꫶ᢥ.⊶ჁႶ; [C1, V6]; xn--ss-4ep585bkm5p.xn--undv409k; ; ; # ss꫶ᢥ.⊶ჁႶ +xn--zca682johfi89m.xn--ifh802b6a; ß‌꫶ᢥ.⊶ⴡⴖ; [C1]; xn--zca682johfi89m.xn--ifh802b6a; ; ; # ß꫶ᢥ.⊶ⴡⴖ +xn--zca682johfi89m.xn--undv409k; ß‌꫶ᢥ.⊶ჁႶ; [C1, V6]; xn--zca682johfi89m.xn--undv409k; ; ; # ß꫶ᢥ.⊶ჁႶ +ß‌꫶ᢥ.⊶ⴡⴖ; ß‌꫶ᢥ.⊶ⴡⴖ; [C1]; xn--zca682johfi89m.xn--ifh802b6a; ; xn--ss-4epx629f.xn--ifh802b6a; [] # ß꫶ᢥ.⊶ⴡⴖ +SS‌꫶ᢥ.⊶ჁႶ; ss‌꫶ᢥ.⊶ჁႶ; [C1, P1, V6]; xn--ss-4ep585bkm5p.xn--undv409k; ; xn--ss-4epx629f.xn--undv409k; [P1, V6] # ss꫶ᢥ.⊶ჁႶ +ss‌꫶ᢥ.⊶ⴡⴖ; ss‌꫶ᢥ.⊶ⴡⴖ; [C1]; xn--ss-4ep585bkm5p.xn--ifh802b6a; ; xn--ss-4epx629f.xn--ifh802b6a; [] # ss꫶ᢥ.⊶ⴡⴖ +Ss‌꫶ᢥ.⊶Ⴡⴖ; ss‌꫶ᢥ.⊶Ⴡⴖ; [C1, P1, V6]; xn--ss-4ep585bkm5p.xn--5nd703gyrh; ; xn--ss-4epx629f.xn--5nd703gyrh; [P1, V6] # ss꫶ᢥ.⊶Ⴡⴖ +‍。ς󠁉; ‍.ς󠁉; [C2, P1, V6]; xn--1ug.xn--3xa44344p; ; .xn--4xa24344p; [P1, V6, A4_2] # .ς +‍。Σ󠁉; ‍.σ󠁉; [C2, P1, V6]; xn--1ug.xn--4xa24344p; ; .xn--4xa24344p; [P1, V6, A4_2] # .σ +‍。σ󠁉; ‍.σ󠁉; [C2, P1, V6]; xn--1ug.xn--4xa24344p; ; .xn--4xa24344p; [P1, V6, A4_2] # .σ +.xn--4xa24344p; .σ󠁉; [V6, X4_2]; .xn--4xa24344p; [V6, A4_2]; ; # .σ +xn--1ug.xn--4xa24344p; ‍.σ󠁉; [C2, V6]; xn--1ug.xn--4xa24344p; ; ; # .σ +xn--1ug.xn--3xa44344p; ‍.ς󠁉; [C2, V6]; xn--1ug.xn--3xa44344p; ; ; # .ς +𞵑ß.ݑ‍𞤛-; 𞵑ß.ݑ‍𞤽-; [B2, B3, C2, P1, V3, V6]; xn--zca5423w.xn----z3c011q9513b; ; xn--ss-2722a.xn----z3c03218a; [B2, B3, P1, V3, V6] # ß.ݑ𞤽- +𞵑ß.ݑ‍𞤽-; ; [B2, B3, C2, P1, V3, V6]; xn--zca5423w.xn----z3c011q9513b; ; xn--ss-2722a.xn----z3c03218a; [B2, B3, P1, V3, V6] # ß.ݑ𞤽- +𞵑SS.ݑ‍𞤛-; 𞵑ss.ݑ‍𞤽-; [B2, B3, C2, P1, V3, V6]; xn--ss-2722a.xn----z3c011q9513b; ; xn--ss-2722a.xn----z3c03218a; [B2, B3, P1, V3, V6] # ss.ݑ𞤽- +𞵑ss.ݑ‍𞤽-; ; [B2, B3, C2, P1, V3, V6]; xn--ss-2722a.xn----z3c011q9513b; ; xn--ss-2722a.xn----z3c03218a; [B2, B3, P1, V3, V6] # ss.ݑ𞤽- +𞵑Ss.ݑ‍𞤽-; 𞵑ss.ݑ‍𞤽-; [B2, B3, C2, P1, V3, V6]; xn--ss-2722a.xn----z3c011q9513b; ; xn--ss-2722a.xn----z3c03218a; [B2, B3, P1, V3, V6] # ss.ݑ𞤽- +xn--ss-2722a.xn----z3c03218a; 𞵑ss.ݑ𞤽-; [B2, B3, V3, V6]; xn--ss-2722a.xn----z3c03218a; ; ; # ss.ݑ𞤽- +xn--ss-2722a.xn----z3c011q9513b; 𞵑ss.ݑ‍𞤽-; [B2, B3, C2, V3, V6]; xn--ss-2722a.xn----z3c011q9513b; ; ; # ss.ݑ𞤽- +xn--zca5423w.xn----z3c011q9513b; 𞵑ß.ݑ‍𞤽-; [B2, B3, C2, V3, V6]; xn--zca5423w.xn----z3c011q9513b; ; ; # ß.ݑ𞤽- +𞵑ss.ݑ‍𞤛-; 𞵑ss.ݑ‍𞤽-; [B2, B3, C2, P1, V3, V6]; xn--ss-2722a.xn----z3c011q9513b; ; xn--ss-2722a.xn----z3c03218a; [B2, B3, P1, V3, V6] # ss.ݑ𞤽- +𞵑Ss.ݑ‍𞤛-; 𞵑ss.ݑ‍𞤽-; [B2, B3, C2, P1, V3, V6]; xn--ss-2722a.xn----z3c011q9513b; ; xn--ss-2722a.xn----z3c03218a; [B2, B3, P1, V3, V6] # ss.ݑ𞤽- +𑘽‍𞤧.𐹧󡦪-; 𑘽‍𞤧.𐹧󡦪-; [B1, C2, P1, V3, V5, V6]; xn--1ugz808gdimf.xn----k26iq1483f; ; xn--qb2ds317a.xn----k26iq1483f; [B1, P1, V3, V5, V6] # 𑘽𞤧.𐹧- +𑘽‍𞤧.𐹧󡦪-; ; [B1, C2, P1, V3, V5, V6]; xn--1ugz808gdimf.xn----k26iq1483f; ; xn--qb2ds317a.xn----k26iq1483f; [B1, P1, V3, V5, V6] # 𑘽𞤧.𐹧- +𑘽‍𞤅.𐹧󡦪-; 𑘽‍𞤧.𐹧󡦪-; [B1, C2, P1, V3, V5, V6]; xn--1ugz808gdimf.xn----k26iq1483f; ; xn--qb2ds317a.xn----k26iq1483f; [B1, P1, V3, V5, V6] # 𑘽𞤧.𐹧- +xn--qb2ds317a.xn----k26iq1483f; 𑘽𞤧.𐹧󡦪-; [B1, V3, V5, V6]; xn--qb2ds317a.xn----k26iq1483f; ; ; # 𑘽𞤧.𐹧- +xn--1ugz808gdimf.xn----k26iq1483f; 𑘽‍𞤧.𐹧󡦪-; [B1, C2, V3, V5, V6]; xn--1ugz808gdimf.xn----k26iq1483f; ; ; # 𑘽𞤧.𐹧- +𑘽‍𞤅.𐹧󡦪-; 𑘽‍𞤧.𐹧󡦪-; [B1, C2, P1, V3, V5, V6]; xn--1ugz808gdimf.xn----k26iq1483f; ; xn--qb2ds317a.xn----k26iq1483f; [B1, P1, V3, V5, V6] # 𑘽𞤧.𐹧- +⒒򨘙򳳠𑓀.-󞡊; ; [P1, V3, V6]; xn--3shy698frsu9dt1me.xn----x310m; ; ; # ⒒𑓀.- +11.򨘙򳳠𑓀.-󞡊; ; [P1, V3, V6]; 11.xn--uz1d59632bxujd.xn----x310m; ; ; # 11.𑓀.- +11.xn--uz1d59632bxujd.xn----x310m; 11.򨘙򳳠𑓀.-󞡊; [V3, V6]; 11.xn--uz1d59632bxujd.xn----x310m; ; ; # 11.𑓀.- +xn--3shy698frsu9dt1me.xn----x310m; ⒒򨘙򳳠𑓀.-󞡊; [V3, V6]; xn--3shy698frsu9dt1me.xn----x310m; ; ; # ⒒𑓀.- +-。‍; -.‍; [C2, V3]; -.xn--1ug; ; -.; [V3] # -. +-。‍; -.‍; [C2, V3]; -.xn--1ug; ; -.; [V3] # -. +-.; ; [V3]; ; ; ; # -. +-.xn--1ug; -.‍; [C2, V3]; -.xn--1ug; ; ; # -. +≮ᡬ.ς¹-?; ≮ᡬ.ς1-?; [P1, V6]; xn--88e732c.ς1-?; [P1, V6, A3]; xn--88e732c.σ1-?; # ≮ᡬ.ς1- +≮ᡬ.ς¹-?; ≮ᡬ.ς1-?; [P1, V6]; xn--88e732c.ς1-?; [P1, V6, A3]; xn--88e732c.σ1-?; # ≮ᡬ.ς1- +≮ᡬ.ς1-?; ; [P1, V6]; xn--88e732c.ς1-?; [P1, V6, A3]; xn--88e732c.σ1-?; # ≮ᡬ.ς1- +≮ᡬ.ς1-?; ≮ᡬ.ς1-?; [P1, V6]; xn--88e732c.ς1-?; [P1, V6, A3]; xn--88e732c.σ1-?; # ≮ᡬ.ς1- +≮ᡬ.Σ1-?; ≮ᡬ.σ1-?; [P1, V6]; xn--88e732c.σ1-?; [P1, V6, A3]; ; # ≮ᡬ.σ1- +≮ᡬ.Σ1-?; ≮ᡬ.σ1-?; [P1, V6]; xn--88e732c.σ1-?; [P1, V6, A3]; ; # ≮ᡬ.σ1- +≮ᡬ.σ1-?; ; [P1, V6]; xn--88e732c.σ1-?; [P1, V6, A3]; ; # ≮ᡬ.σ1- +≮ᡬ.σ1-?; ≮ᡬ.σ1-?; [P1, V6]; xn--88e732c.σ1-?; [P1, V6, A3]; ; # ≮ᡬ.σ1- +xn--88e732c.σ1-?; ≮ᡬ.σ1-?; [P1, V6]; xn--88e732c.σ1-?; [P1, V6, A3]; ; # ≮ᡬ.σ1- +XN--88E732C.Σ1-?; ≮ᡬ.σ1-?; [P1, V6]; xn--88e732c.σ1-?; [P1, V6, A3]; ; # ≮ᡬ.σ1- +xn--88e732c.ς1-?; ≮ᡬ.ς1-?; [P1, V6]; xn--88e732c.ς1-?; [P1, V6, A3]; xn--88e732c.σ1-?; # ≮ᡬ.ς1- +Xn--88e732c.ς1-?; ≮ᡬ.ς1-?; [P1, V6]; xn--88e732c.ς1-?; [P1, V6, A3]; xn--88e732c.σ1-?; # ≮ᡬ.ς1- +Xn--88e732c.σ1-?; ≮ᡬ.σ1-?; [P1, V6]; xn--88e732c.σ1-?; [P1, V6, A3]; ; # ≮ᡬ.σ1- +≮ᡬ.Σ¹-?; ≮ᡬ.σ1-?; [P1, V6]; xn--88e732c.σ1-?; [P1, V6, A3]; ; # ≮ᡬ.σ1- +≮ᡬ.Σ¹-?; ≮ᡬ.σ1-?; [P1, V6]; xn--88e732c.σ1-?; [P1, V6, A3]; ; # ≮ᡬ.σ1- +≮ᡬ.σ¹-?; ≮ᡬ.σ1-?; [P1, V6]; xn--88e732c.σ1-?; [P1, V6, A3]; ; # ≮ᡬ.σ1- +≮ᡬ.σ¹-?; ≮ᡬ.σ1-?; [P1, V6]; xn--88e732c.σ1-?; [P1, V6, A3]; ; # ≮ᡬ.σ1- +ቬ򔠼񁗶。𐨬𝟠; ቬ򔠼񁗶.𐨬8; [P1, V6]; xn--d0d41273c887z.xn--8-ob5i; ; ; # ቬ.𐨬8 +ቬ򔠼񁗶。𐨬8; ቬ򔠼񁗶.𐨬8; [P1, V6]; xn--d0d41273c887z.xn--8-ob5i; ; ; # ቬ.𐨬8 +xn--d0d41273c887z.xn--8-ob5i; ቬ򔠼񁗶.𐨬8; [V6]; xn--d0d41273c887z.xn--8-ob5i; ; ; # ቬ.𐨬8 +𐱲。蔫ݦ; 𐱲.蔫ݦ; [B5, B6, P1, V6]; xn--389c.xn--qpb7055d; ; ; # .蔫ݦ +xn--389c.xn--qpb7055d; 𐱲.蔫ݦ; [B5, B6, V6]; xn--389c.xn--qpb7055d; ; ; # .蔫ݦ +򒲧₃。ꡚ𛇑󠄳ه; 򒲧3.ꡚ𛇑ه; [B5, B6, P1, V6]; xn--3-ep59g.xn--jhb5904fcp0h; ; ; # 3.ꡚ𛇑ه +򒲧3。ꡚ𛇑󠄳ه; 򒲧3.ꡚ𛇑ه; [B5, B6, P1, V6]; xn--3-ep59g.xn--jhb5904fcp0h; ; ; # 3.ꡚ𛇑ه +xn--3-ep59g.xn--jhb5904fcp0h; 򒲧3.ꡚ𛇑ه; [B5, B6, V6]; xn--3-ep59g.xn--jhb5904fcp0h; ; ; # 3.ꡚ𛇑ه +蓸ق≠.ß; ; [B5, B6, P1, V6]; xn--ehb015lnt1e.xn--zca; ; xn--ehb015lnt1e.ss; # 蓸ق≠.ß +蓸ق≠.ß; 蓸ق≠.ß; [B5, B6, P1, V6]; xn--ehb015lnt1e.xn--zca; ; xn--ehb015lnt1e.ss; # 蓸ق≠.ß +蓸ق≠.SS; 蓸ق≠.ss; [B5, B6, P1, V6]; xn--ehb015lnt1e.ss; ; ; # 蓸ق≠.ss +蓸ق≠.SS; 蓸ق≠.ss; [B5, B6, P1, V6]; xn--ehb015lnt1e.ss; ; ; # 蓸ق≠.ss +蓸ق≠.ss; ; [B5, B6, P1, V6]; xn--ehb015lnt1e.ss; ; ; # 蓸ق≠.ss +蓸ق≠.ss; 蓸ق≠.ss; [B5, B6, P1, V6]; xn--ehb015lnt1e.ss; ; ; # 蓸ق≠.ss +蓸ق≠.Ss; 蓸ق≠.ss; [B5, B6, P1, V6]; xn--ehb015lnt1e.ss; ; ; # 蓸ق≠.ss +蓸ق≠.Ss; 蓸ق≠.ss; [B5, B6, P1, V6]; xn--ehb015lnt1e.ss; ; ; # 蓸ق≠.ss +xn--ehb015lnt1e.ss; 蓸ق≠.ss; [B5, B6, V6]; xn--ehb015lnt1e.ss; ; ; # 蓸ق≠.ss +xn--ehb015lnt1e.xn--zca; 蓸ق≠.ß; [B5, B6, V6]; xn--ehb015lnt1e.xn--zca; ; ; # 蓸ق≠.ß +ࡎٺී⒊.𐹹𞱩󠃪‌; ; [B1, C1, P1, V6]; xn--zib94gfziuq1a.xn--0ug3205g7eyf3c96h; ; xn--zib94gfziuq1a.xn--xo0dw109an237f; [B1, P1, V6] # ࡎٺී⒊.𐹹 +ࡎٺී3..𐹹𞱩󠃪‌; ; [B1, C1, P1, V6, X4_2]; xn--3-prc71ls9j..xn--0ug3205g7eyf3c96h; [B1, C1, P1, V6, A4_2]; xn--3-prc71ls9j..xn--xo0dw109an237f; [B1, P1, V6, A4_2] # ࡎٺී3..𐹹 +xn--3-prc71ls9j..xn--xo0dw109an237f; ࡎٺී3..𐹹𞱩󠃪; [B1, V6, X4_2]; xn--3-prc71ls9j..xn--xo0dw109an237f; [B1, V6, A4_2]; ; # ࡎٺී3..𐹹 +xn--3-prc71ls9j..xn--0ug3205g7eyf3c96h; ࡎٺී3..𐹹𞱩󠃪‌; [B1, C1, V6, X4_2]; xn--3-prc71ls9j..xn--0ug3205g7eyf3c96h; [B1, C1, V6, A4_2]; ; # ࡎٺී3..𐹹 +xn--zib94gfziuq1a.xn--xo0dw109an237f; ࡎٺී⒊.𐹹𞱩󠃪; [B1, V6]; xn--zib94gfziuq1a.xn--xo0dw109an237f; ; ; # ࡎٺී⒊.𐹹 +xn--zib94gfziuq1a.xn--0ug3205g7eyf3c96h; ࡎٺී⒊.𐹹𞱩󠃪‌; [B1, C1, V6]; xn--zib94gfziuq1a.xn--0ug3205g7eyf3c96h; ; ; # ࡎٺී⒊.𐹹 +ς‍-.Ⴣ𦟙; ; [C2, P1, V3, V6]; xn----xmb348s.xn--7nd64871a; ; xn----zmb.xn--7nd64871a; [P1, V3, V6] # ς-.Ⴣ𦟙 +ς‍-.ⴣ𦟙; ; [C2, V3]; xn----xmb348s.xn--rlj2573p; ; xn----zmb.xn--rlj2573p; [V3] # ς-.ⴣ𦟙 +Σ‍-.Ⴣ𦟙; σ‍-.Ⴣ𦟙; [C2, P1, V3, V6]; xn----zmb048s.xn--7nd64871a; ; xn----zmb.xn--7nd64871a; [P1, V3, V6] # σ-.Ⴣ𦟙 +σ‍-.ⴣ𦟙; ; [C2, V3]; xn----zmb048s.xn--rlj2573p; ; xn----zmb.xn--rlj2573p; [V3] # σ-.ⴣ𦟙 +xn----zmb.xn--rlj2573p; σ-.ⴣ𦟙; [V3]; xn----zmb.xn--rlj2573p; ; ; # σ-.ⴣ𦟙 +xn----zmb048s.xn--rlj2573p; σ‍-.ⴣ𦟙; [C2, V3]; xn----zmb048s.xn--rlj2573p; ; ; # σ-.ⴣ𦟙 +xn----zmb.xn--7nd64871a; σ-.Ⴣ𦟙; [V3, V6]; xn----zmb.xn--7nd64871a; ; ; # σ-.Ⴣ𦟙 +xn----zmb048s.xn--7nd64871a; σ‍-.Ⴣ𦟙; [C2, V3, V6]; xn----zmb048s.xn--7nd64871a; ; ; # σ-.Ⴣ𦟙 +xn----xmb348s.xn--rlj2573p; ς‍-.ⴣ𦟙; [C2, V3]; xn----xmb348s.xn--rlj2573p; ; ; # ς-.ⴣ𦟙 +xn----xmb348s.xn--7nd64871a; ς‍-.Ⴣ𦟙; [C2, V3, V6]; xn----xmb348s.xn--7nd64871a; ; ; # ς-.Ⴣ𦟙 +≠。🞳𝟲; ≠.🞳6; [P1, V6]; xn--1ch.xn--6-dl4s; ; ; # ≠.🞳6 +≠。🞳𝟲; ≠.🞳6; [P1, V6]; xn--1ch.xn--6-dl4s; ; ; # ≠.🞳6 +≠。🞳6; ≠.🞳6; [P1, V6]; xn--1ch.xn--6-dl4s; ; ; # ≠.🞳6 +≠。🞳6; ≠.🞳6; [P1, V6]; xn--1ch.xn--6-dl4s; ; ; # ≠.🞳6 +xn--1ch.xn--6-dl4s; ≠.🞳6; [V6]; xn--1ch.xn--6-dl4s; ; ; # ≠.🞳6 +󅬽.蠔; ; [P1, V6]; xn--g747d.xn--xl2a; ; ; # .蠔 +xn--g747d.xn--xl2a; 󅬽.蠔; [V6]; xn--g747d.xn--xl2a; ; ; # .蠔 +ࣦ‍.뼽; ࣦ‍.뼽; [C2, V5]; xn--p0b869i.xn--e43b; ; xn--p0b.xn--e43b; [V5] # ࣦ.뼽 +ࣦ‍.뼽; ࣦ‍.뼽; [C2, V5]; xn--p0b869i.xn--e43b; ; xn--p0b.xn--e43b; [V5] # ࣦ.뼽 +ࣦ‍.뼽; ; [C2, V5]; xn--p0b869i.xn--e43b; ; xn--p0b.xn--e43b; [V5] # ࣦ.뼽 +ࣦ‍.뼽; ࣦ‍.뼽; [C2, V5]; xn--p0b869i.xn--e43b; ; xn--p0b.xn--e43b; [V5] # ࣦ.뼽 +xn--p0b.xn--e43b; ࣦ.뼽; [V5]; xn--p0b.xn--e43b; ; ; # ࣦ.뼽 +xn--p0b869i.xn--e43b; ࣦ‍.뼽; [C2, V5]; xn--p0b869i.xn--e43b; ; ; # ࣦ.뼽 +₇்􃂷ے。👖ٵ-𞪑; 7்􃂷ے.👖اٴ-𞪑; [B1, P1, V6]; xn--7-rwc839aj3073c.xn----ymc5uv818oghka; ; ; # 7்ے.👖اٴ- +7்􃂷ے。👖اٴ-𞪑; 7்􃂷ے.👖اٴ-𞪑; [B1, P1, V6]; xn--7-rwc839aj3073c.xn----ymc5uv818oghka; ; ; # 7்ے.👖اٴ- +xn--7-rwc839aj3073c.xn----ymc5uv818oghka; 7்􃂷ے.👖اٴ-𞪑; [B1, V6]; xn--7-rwc839aj3073c.xn----ymc5uv818oghka; ; ; # 7்ے.👖اٴ- +-。ݻ; -.ݻ; [B1, V3]; -.xn--cqb; ; ; # -.ݻ +-。ݻ; -.ݻ; [B1, V3]; -.xn--cqb; ; ; # -.ݻ +-.xn--cqb; -.ݻ; [B1, V3]; -.xn--cqb; ; ; # -.ݻ +𑇌𵛓。-⒈ꡏܫ; 𑇌𵛓.-⒈ꡏܫ; [B1, P1, V3, V5, V6]; xn--8d1dg030h.xn----u1c466tp10j; ; ; # 𑇌.-⒈ꡏܫ +𑇌𵛓。-1.ꡏܫ; 𑇌𵛓.-1.ꡏܫ; [B1, B5, B6, P1, V3, V5, V6]; xn--8d1dg030h.-1.xn--1nb7163f; ; ; # 𑇌.-1.ꡏܫ +xn--8d1dg030h.-1.xn--1nb7163f; 𑇌𵛓.-1.ꡏܫ; [B1, B5, B6, V3, V5, V6]; xn--8d1dg030h.-1.xn--1nb7163f; ; ; # 𑇌.-1.ꡏܫ +xn--8d1dg030h.xn----u1c466tp10j; 𑇌𵛓.-⒈ꡏܫ; [B1, V3, V5, V6]; xn--8d1dg030h.xn----u1c466tp10j; ; ; # 𑇌.-⒈ꡏܫ +璛᜴گ.-; ; [B1, B5, B6, V3]; xn--ikb175frt4e.-; ; ; # 璛᜴گ.- +xn--ikb175frt4e.-; 璛᜴گ.-; [B1, B5, B6, V3]; xn--ikb175frt4e.-; ; ; # 璛᜴گ.- +󠆰ࢡ੍샕.𐹲휁; ࢡ੍샕.𐹲휁; [B1, B2, B3]; xn--qyb07fj857a.xn--728bv72h; ; ; # ࢡ੍샕.𐹲휁 +󠆰ࢡ੍샕.𐹲휁; ࢡ੍샕.𐹲휁; [B1, B2, B3]; xn--qyb07fj857a.xn--728bv72h; ; ; # ࢡ੍샕.𐹲휁 +󠆰ࢡ੍샕.𐹲휁; ࢡ੍샕.𐹲휁; [B1, B2, B3]; xn--qyb07fj857a.xn--728bv72h; ; ; # ࢡ੍샕.𐹲휁 +󠆰ࢡ੍샕.𐹲휁; ࢡ੍샕.𐹲휁; [B1, B2, B3]; xn--qyb07fj857a.xn--728bv72h; ; ; # ࢡ੍샕.𐹲휁 +xn--qyb07fj857a.xn--728bv72h; ࢡ੍샕.𐹲휁; [B1, B2, B3]; xn--qyb07fj857a.xn--728bv72h; ; ; # ࢡ੍샕.𐹲휁 +񍨽.񋸕; 񍨽.񋸕; [P1, V6]; xn--pr3x.xn--rv7w; ; ; # . +񍨽.񋸕; ; [P1, V6]; xn--pr3x.xn--rv7w; ; ; # . +xn--pr3x.xn--rv7w; 񍨽.񋸕; [V6]; xn--pr3x.xn--rv7w; ; ; # . +ٽ𞥕。𑑂𞤶Ⴍ-; ٽ𞥕.𑑂𞤶Ⴍ-; [B1, P1, V3, V5, V6]; xn--2ib0338v.xn----w0g2740ro9vg; ; ; # ٽ𞥕.𑑂𞤶Ⴍ- +ٽ𞥕。𑑂𞤶Ⴍ-; ٽ𞥕.𑑂𞤶Ⴍ-; [B1, P1, V3, V5, V6]; xn--2ib0338v.xn----w0g2740ro9vg; ; ; # ٽ𞥕.𑑂𞤶Ⴍ- +ٽ𞥕。𑑂𞤶ⴍ-; ٽ𞥕.𑑂𞤶ⴍ-; [B1, V3, V5]; xn--2ib0338v.xn----zvs0199fo91g; ; ; # ٽ𞥕.𑑂𞤶ⴍ- +ٽ𞥕。𑑂𞤔Ⴍ-; ٽ𞥕.𑑂𞤶Ⴍ-; [B1, P1, V3, V5, V6]; xn--2ib0338v.xn----w0g2740ro9vg; ; ; # ٽ𞥕.𑑂𞤶Ⴍ- +ٽ𞥕。𑑂𞤔ⴍ-; ٽ𞥕.𑑂𞤶ⴍ-; [B1, V3, V5]; xn--2ib0338v.xn----zvs0199fo91g; ; ; # ٽ𞥕.𑑂𞤶ⴍ- +xn--2ib0338v.xn----zvs0199fo91g; ٽ𞥕.𑑂𞤶ⴍ-; [B1, V3, V5]; xn--2ib0338v.xn----zvs0199fo91g; ; ; # ٽ𞥕.𑑂𞤶ⴍ- +xn--2ib0338v.xn----w0g2740ro9vg; ٽ𞥕.𑑂𞤶Ⴍ-; [B1, V3, V5, V6]; xn--2ib0338v.xn----w0g2740ro9vg; ; ; # ٽ𞥕.𑑂𞤶Ⴍ- +ٽ𞥕。𑑂𞤶ⴍ-; ٽ𞥕.𑑂𞤶ⴍ-; [B1, V3, V5]; xn--2ib0338v.xn----zvs0199fo91g; ; ; # ٽ𞥕.𑑂𞤶ⴍ- +ٽ𞥕。𑑂𞤔Ⴍ-; ٽ𞥕.𑑂𞤶Ⴍ-; [B1, P1, V3, V5, V6]; xn--2ib0338v.xn----w0g2740ro9vg; ; ; # ٽ𞥕.𑑂𞤶Ⴍ- +ٽ𞥕。𑑂𞤔ⴍ-; ٽ𞥕.𑑂𞤶ⴍ-; [B1, V3, V5]; xn--2ib0338v.xn----zvs0199fo91g; ; ; # ٽ𞥕.𑑂𞤶ⴍ- +𐯀𐸉𞧏。񢚧₄Ⴋ񂹫; 𐯀𐸉𞧏.񢚧4Ⴋ񂹫; [P1, V6]; xn--039c42bq865a.xn--4-t0g49302fnrzm; ; ; # .4Ⴋ +𐯀𐸉𞧏。񢚧4Ⴋ񂹫; 𐯀𐸉𞧏.񢚧4Ⴋ񂹫; [P1, V6]; xn--039c42bq865a.xn--4-t0g49302fnrzm; ; ; # .4Ⴋ +𐯀𐸉𞧏。񢚧4ⴋ񂹫; 𐯀𐸉𞧏.񢚧4ⴋ񂹫; [P1, V6]; xn--039c42bq865a.xn--4-wvs27840bnrzm; ; ; # .4ⴋ +xn--039c42bq865a.xn--4-wvs27840bnrzm; 𐯀𐸉𞧏.񢚧4ⴋ񂹫; [V6]; xn--039c42bq865a.xn--4-wvs27840bnrzm; ; ; # .4ⴋ +xn--039c42bq865a.xn--4-t0g49302fnrzm; 𐯀𐸉𞧏.񢚧4Ⴋ񂹫; [V6]; xn--039c42bq865a.xn--4-t0g49302fnrzm; ; ; # .4Ⴋ +𐯀𐸉𞧏。񢚧₄ⴋ񂹫; 𐯀𐸉𞧏.񢚧4ⴋ񂹫; [P1, V6]; xn--039c42bq865a.xn--4-wvs27840bnrzm; ; ; # .4ⴋ +4ڽ︒󠑥.≠; ; [B1, P1, V6]; xn--4-kvc5601q2h50i.xn--1ch; ; ; # 4ڽ︒.≠ +4ڽ︒󠑥.≠; 4ڽ︒󠑥.≠; [B1, P1, V6]; xn--4-kvc5601q2h50i.xn--1ch; ; ; # 4ڽ︒.≠ +4ڽ。󠑥.≠; 4ڽ.󠑥.≠; [B1, P1, V6]; xn--4-kvc.xn--5136e.xn--1ch; ; ; # 4ڽ..≠ +4ڽ。󠑥.≠; 4ڽ.󠑥.≠; [B1, P1, V6]; xn--4-kvc.xn--5136e.xn--1ch; ; ; # 4ڽ..≠ +xn--4-kvc.xn--5136e.xn--1ch; 4ڽ.󠑥.≠; [B1, V6]; xn--4-kvc.xn--5136e.xn--1ch; ; ; # 4ڽ..≠ +xn--4-kvc5601q2h50i.xn--1ch; 4ڽ︒󠑥.≠; [B1, V6]; xn--4-kvc5601q2h50i.xn--1ch; ; ; # 4ڽ︒.≠ +𝟓。ۗ; 5.ۗ; [V5]; 5.xn--nlb; ; ; # 5.ۗ +5。ۗ; 5.ۗ; [V5]; 5.xn--nlb; ; ; # 5.ۗ +5.xn--nlb; 5.ۗ; [V5]; 5.xn--nlb; ; ; # 5.ۗ +‌򺸩.⾕; ‌򺸩.谷; [C1, P1, V6]; xn--0ug26167i.xn--6g3a; ; xn--i183d.xn--6g3a; [P1, V6] # .谷 +‌򺸩.谷; ; [C1, P1, V6]; xn--0ug26167i.xn--6g3a; ; xn--i183d.xn--6g3a; [P1, V6] # .谷 +xn--i183d.xn--6g3a; 򺸩.谷; [V6]; xn--i183d.xn--6g3a; ; ; # .谷 +xn--0ug26167i.xn--6g3a; ‌򺸩.谷; [C1, V6]; xn--0ug26167i.xn--6g3a; ; ; # .谷 +︒󎰇‍.-ܼ‌; ; [C1, C2, P1, V3, V6]; xn--1ug1658ftw26f.xn----t2c071q; ; xn--y86c71305c.xn----t2c; [P1, V3, V6] # ︒.-ܼ +。󎰇‍.-ܼ‌; .󎰇‍.-ܼ‌; [C1, C2, P1, V3, V6, X4_2]; .xn--1ug05310k.xn----t2c071q; [C1, C2, P1, V3, V6, A4_2]; .xn--hh50e.xn----t2c; [P1, V3, V6, A4_2] # ..-ܼ +.xn--hh50e.xn----t2c; .󎰇.-ܼ; [V3, V6, X4_2]; .xn--hh50e.xn----t2c; [V3, V6, A4_2]; ; # ..-ܼ +.xn--1ug05310k.xn----t2c071q; .󎰇‍.-ܼ‌; [C1, C2, V3, V6, X4_2]; .xn--1ug05310k.xn----t2c071q; [C1, C2, V3, V6, A4_2]; ; # ..-ܼ +xn--y86c71305c.xn----t2c; ︒󎰇.-ܼ; [V3, V6]; xn--y86c71305c.xn----t2c; ; ; # ︒.-ܼ +xn--1ug1658ftw26f.xn----t2c071q; ︒󎰇‍.-ܼ‌; [C1, C2, V3, V6]; xn--1ug1658ftw26f.xn----t2c071q; ; ; # ︒.-ܼ +≯𞤟。ᡨ; ≯𞥁.ᡨ; [B1, P1, V6]; xn--hdhz520p.xn--48e; ; ; # ≯𞥁.ᡨ +≯𞤟。ᡨ; ≯𞥁.ᡨ; [B1, P1, V6]; xn--hdhz520p.xn--48e; ; ; # ≯𞥁.ᡨ +≯𞥁。ᡨ; ≯𞥁.ᡨ; [B1, P1, V6]; xn--hdhz520p.xn--48e; ; ; # ≯𞥁.ᡨ +≯𞥁。ᡨ; ≯𞥁.ᡨ; [B1, P1, V6]; xn--hdhz520p.xn--48e; ; ; # ≯𞥁.ᡨ +xn--hdhz520p.xn--48e; ≯𞥁.ᡨ; [B1, V6]; xn--hdhz520p.xn--48e; ; ; # ≯𞥁.ᡨ +ུ𫫰𝨄。ܓ𐹦; ུ𫫰𝨄.ܓ𐹦; [B1, V5]; xn--ned8985uo92e.xn--dnb6395k; ; ; # ུ𫫰𝨄.ܓ𐹦 +xn--ned8985uo92e.xn--dnb6395k; ུ𫫰𝨄.ܓ𐹦; [B1, V5]; xn--ned8985uo92e.xn--dnb6395k; ; ; # ུ𫫰𝨄.ܓ𐹦 +̼ߛ⁷𝟹。𝟬; ̼ߛ73.0; [B1, V5]; xn--73-9yb648b.0; ; ; # ̼ߛ73.0 +̼ߛ73。0; ̼ߛ73.0; [B1, V5]; xn--73-9yb648b.0; ; ; # ̼ߛ73.0 +xn--73-9yb648b.0; ̼ߛ73.0; [B1, V5]; xn--73-9yb648b.0; ; ; # ̼ߛ73.0 +‍.𝟗; ‍.9; [C2]; xn--1ug.9; ; .9; [A4_2] # .9 +‍.9; ; [C2]; xn--1ug.9; ; .9; [A4_2] # .9 +.9; ; [X4_2]; ; [A4_2]; ; # .9 +xn--1ug.9; ‍.9; [C2]; xn--1ug.9; ; ; # .9 +9; ; ; ; ; ; # 9 +ݹᡭ𪕈。ڶࣙ; ݹᡭ𪕈.ڶࣙ; [B2, B3]; xn--9pb497fs270c.xn--pkb80i; ; ; # ݹᡭ𪕈.ڶࣙ +xn--9pb497fs270c.xn--pkb80i; ݹᡭ𪕈.ڶࣙ; [B2, B3]; xn--9pb497fs270c.xn--pkb80i; ; ; # ݹᡭ𪕈.ڶࣙ +ܦ5ߢ겙。᳴𐷚; ܦ5ߢ겙.᳴𐷚; [B1, B2, B3, P1, V5, V6]; xn--5-j1c97c2483c.xn--e7f2093h; ; ; # ܦ5ߢ겙.᳴ +ܦ5ߢ겙。᳴𐷚; ܦ5ߢ겙.᳴𐷚; [B1, B2, B3, P1, V5, V6]; xn--5-j1c97c2483c.xn--e7f2093h; ; ; # ܦ5ߢ겙.᳴ +ܦ5ߢ겙。᳴𐷚; ܦ5ߢ겙.᳴𐷚; [B1, B2, B3, P1, V5, V6]; xn--5-j1c97c2483c.xn--e7f2093h; ; ; # ܦ5ߢ겙.᳴ +ܦ5ߢ겙。᳴𐷚; ܦ5ߢ겙.᳴𐷚; [B1, B2, B3, P1, V5, V6]; xn--5-j1c97c2483c.xn--e7f2093h; ; ; # ܦ5ߢ겙.᳴ +xn--5-j1c97c2483c.xn--e7f2093h; ܦ5ߢ겙.᳴𐷚; [B1, B2, B3, V5, V6]; xn--5-j1c97c2483c.xn--e7f2093h; ; ; # ܦ5ߢ겙.᳴ +Ⴍ𿣍ꡨ֮。Ⴞ‌‌; Ⴍ𿣍ꡨ֮.Ⴞ‌‌; [C1, P1, V6]; xn--5cb347co96jug15a.xn--2nd059ea; ; xn--5cb347co96jug15a.xn--2nd; [P1, V6] # Ⴍꡨ֮.Ⴞ +ⴍ𿣍ꡨ֮。ⴞ‌‌; ⴍ𿣍ꡨ֮.ⴞ‌‌; [C1, P1, V6]; xn--5cb172r175fug38a.xn--0uga051h; ; xn--5cb172r175fug38a.xn--mlj; [P1, V6] # ⴍꡨ֮.ⴞ +xn--5cb172r175fug38a.xn--mlj; ⴍ𿣍ꡨ֮.ⴞ; [V6]; xn--5cb172r175fug38a.xn--mlj; ; ; # ⴍꡨ֮.ⴞ +xn--5cb172r175fug38a.xn--0uga051h; ⴍ𿣍ꡨ֮.ⴞ‌‌; [C1, V6]; xn--5cb172r175fug38a.xn--0uga051h; ; ; # ⴍꡨ֮.ⴞ +xn--5cb347co96jug15a.xn--2nd; Ⴍ𿣍ꡨ֮.Ⴞ; [V6]; xn--5cb347co96jug15a.xn--2nd; ; ; # Ⴍꡨ֮.Ⴞ +xn--5cb347co96jug15a.xn--2nd059ea; Ⴍ𿣍ꡨ֮.Ⴞ‌‌; [C1, V6]; xn--5cb347co96jug15a.xn--2nd059ea; ; ; # Ⴍꡨ֮.Ⴞ +𐋰。󑓱; 𐋰.󑓱; [P1, V6]; xn--k97c.xn--q031e; ; ; # 𐋰. +xn--k97c.xn--q031e; 𐋰.󑓱; [V6]; xn--k97c.xn--q031e; ; ; # 𐋰. +󡎦឴୍.𐹾; ; [B1, P1, V6]; xn--9ic364dho91z.xn--2o0d; ; ; # ୍.𐹾 +xn--9ic364dho91z.xn--2o0d; 󡎦឴୍.𐹾; [B1, V6]; xn--9ic364dho91z.xn--2o0d; ; ; # ୍.𐹾 +ࣟႫ𶿸귤.򠅼𝟢휪ૣ; ࣟႫ𶿸귤.򠅼0휪ૣ; [P1, V5, V6]; xn--i0b601b6r7l2hs0a.xn--0-8le8997mulr5f; ; ; # ࣟႫ귤.0휪ૣ +ࣟႫ𶿸귤.򠅼𝟢휪ૣ; ࣟႫ𶿸귤.򠅼0휪ૣ; [P1, V5, V6]; xn--i0b601b6r7l2hs0a.xn--0-8le8997mulr5f; ; ; # ࣟႫ귤.0휪ૣ +ࣟႫ𶿸귤.򠅼0휪ૣ; ; [P1, V5, V6]; xn--i0b601b6r7l2hs0a.xn--0-8le8997mulr5f; ; ; # ࣟႫ귤.0휪ૣ +ࣟႫ𶿸귤.򠅼0휪ૣ; ࣟႫ𶿸귤.򠅼0휪ૣ; [P1, V5, V6]; xn--i0b601b6r7l2hs0a.xn--0-8le8997mulr5f; ; ; # ࣟႫ귤.0휪ૣ +ࣟⴋ𶿸귤.򠅼0휪ૣ; ࣟⴋ𶿸귤.򠅼0휪ૣ; [P1, V5, V6]; xn--i0b436pkl2g2h42a.xn--0-8le8997mulr5f; ; ; # ࣟⴋ귤.0휪ૣ +ࣟⴋ𶿸귤.򠅼0휪ૣ; ; [P1, V5, V6]; xn--i0b436pkl2g2h42a.xn--0-8le8997mulr5f; ; ; # ࣟⴋ귤.0휪ૣ +xn--i0b436pkl2g2h42a.xn--0-8le8997mulr5f; ࣟⴋ𶿸귤.򠅼0휪ૣ; [V5, V6]; xn--i0b436pkl2g2h42a.xn--0-8le8997mulr5f; ; ; # ࣟⴋ귤.0휪ૣ +xn--i0b601b6r7l2hs0a.xn--0-8le8997mulr5f; ࣟႫ𶿸귤.򠅼0휪ૣ; [V5, V6]; xn--i0b601b6r7l2hs0a.xn--0-8le8997mulr5f; ; ; # ࣟႫ귤.0휪ૣ +ࣟⴋ𶿸귤.򠅼𝟢휪ૣ; ࣟⴋ𶿸귤.򠅼0휪ૣ; [P1, V5, V6]; xn--i0b436pkl2g2h42a.xn--0-8le8997mulr5f; ; ; # ࣟⴋ귤.0휪ૣ +ࣟⴋ𶿸귤.򠅼𝟢휪ૣ; ࣟⴋ𶿸귤.򠅼0휪ૣ; [P1, V5, V6]; xn--i0b436pkl2g2h42a.xn--0-8le8997mulr5f; ; ; # ࣟⴋ귤.0휪ૣ +ބ.𞡝؁; ބ.𞡝؁; [P1, V6]; xn--lqb.xn--jfb1808v; ; ; # ބ.𞡝 +ބ.𞡝؁; ; [P1, V6]; xn--lqb.xn--jfb1808v; ; ; # ބ.𞡝 +xn--lqb.xn--jfb1808v; ބ.𞡝؁; [V6]; xn--lqb.xn--jfb1808v; ; ; # ބ.𞡝 +્₃.8꣄‍🃤; ્3.8꣄‍🃤; [V5]; xn--3-yke.xn--8-ugnv982dbkwm; ; xn--3-yke.xn--8-sl4et308f; # ્3.8꣄🃤 +્3.8꣄‍🃤; ; [V5]; xn--3-yke.xn--8-ugnv982dbkwm; ; xn--3-yke.xn--8-sl4et308f; # ્3.8꣄🃤 +xn--3-yke.xn--8-sl4et308f; ્3.8꣄🃤; [V5]; xn--3-yke.xn--8-sl4et308f; ; ; # ્3.8꣄🃤 +xn--3-yke.xn--8-ugnv982dbkwm; ્3.8꣄‍🃤; [V5]; xn--3-yke.xn--8-ugnv982dbkwm; ; ; # ્3.8꣄🃤 +℻⩷𝆆。𞤠󠆁᠌; fax⩷𝆆.𞥂; [B6]; xn--fax-4c9a1676t.xn--6e6h; ; ; # fax⩷𝆆.𞥂 +FAX⩷𝆆。𞤠󠆁᠌; fax⩷𝆆.𞥂; [B6]; xn--fax-4c9a1676t.xn--6e6h; ; ; # fax⩷𝆆.𞥂 +fax⩷𝆆。𞥂󠆁᠌; fax⩷𝆆.𞥂; [B6]; xn--fax-4c9a1676t.xn--6e6h; ; ; # fax⩷𝆆.𞥂 +Fax⩷𝆆。𞤠󠆁᠌; fax⩷𝆆.𞥂; [B6]; xn--fax-4c9a1676t.xn--6e6h; ; ; # fax⩷𝆆.𞥂 +xn--fax-4c9a1676t.xn--6e6h; fax⩷𝆆.𞥂; [B6]; xn--fax-4c9a1676t.xn--6e6h; ; ; # fax⩷𝆆.𞥂 +℻⩷𝆆。𞥂󠆁᠌; fax⩷𝆆.𞥂; [B6]; xn--fax-4c9a1676t.xn--6e6h; ; ; # fax⩷𝆆.𞥂 +FAX⩷𝆆。𞥂󠆁᠌; fax⩷𝆆.𞥂; [B6]; xn--fax-4c9a1676t.xn--6e6h; ; ; # fax⩷𝆆.𞥂 +fax⩷𝆆。𞤠󠆁᠌; fax⩷𝆆.𞥂; [B6]; xn--fax-4c9a1676t.xn--6e6h; ; ; # fax⩷𝆆.𞥂 +fax⩷𝆆.𞥂; ; [B6]; xn--fax-4c9a1676t.xn--6e6h; ; ; # fax⩷𝆆.𞥂 +FAX⩷𝆆.𞤠; fax⩷𝆆.𞥂; [B6]; xn--fax-4c9a1676t.xn--6e6h; ; ; # fax⩷𝆆.𞥂 +Fax⩷𝆆.𞤠; fax⩷𝆆.𞥂; [B6]; xn--fax-4c9a1676t.xn--6e6h; ; ; # fax⩷𝆆.𞥂 +FAX⩷𝆆.𞥂; fax⩷𝆆.𞥂; [B6]; xn--fax-4c9a1676t.xn--6e6h; ; ; # fax⩷𝆆.𞥂 +Fax⩷𝆆.𞥂; fax⩷𝆆.𞥂; [B6]; xn--fax-4c9a1676t.xn--6e6h; ; ; # fax⩷𝆆.𞥂 +ꡕ≠ၞ󮿱。𐵧󠄫ᅠ; ꡕ≠ၞ󮿱.𐵧ᅠ; [B2, B3, P1, V6]; xn--cld333gn31h0158l.xn--cl7c96v; ; ; # ꡕ≠ၞ. +ꡕ≠ၞ󮿱。𐵧󠄫ᅠ; ꡕ≠ၞ󮿱.𐵧ᅠ; [B2, B3, P1, V6]; xn--cld333gn31h0158l.xn--cl7c96v; ; ; # ꡕ≠ၞ. +ꡕ≠ၞ󮿱。𐵧󠄫ᅠ; ꡕ≠ၞ󮿱.𐵧ᅠ; [B2, B3, P1, V6]; xn--cld333gn31h0158l.xn--psd1510k; ; ; # ꡕ≠ၞ. +ꡕ≠ၞ󮿱。𐵧󠄫ᅠ; ꡕ≠ၞ󮿱.𐵧ᅠ; [B2, B3, P1, V6]; xn--cld333gn31h0158l.xn--psd1510k; ; ; # ꡕ≠ၞ. +xn--cld333gn31h0158l.xn--psd1510k; ꡕ≠ၞ󮿱.𐵧ᅠ; [B2, B3, V6]; xn--cld333gn31h0158l.xn--psd1510k; ; ; # ꡕ≠ၞ. +xn--cld333gn31h0158l.xn--cl7c96v; ꡕ≠ၞ󮿱.𐵧ᅠ; [B2, B3, V6]; xn--cld333gn31h0158l.xn--cl7c96v; ; ; # ꡕ≠ၞ. +鱊。‌; 鱊.‌; [C1]; xn--rt6a.xn--0ug; ; xn--rt6a.; [] # 鱊. +xn--rt6a.; 鱊.; ; xn--rt6a.; ; ; # 鱊. +鱊.; ; ; xn--rt6a.; ; ; # 鱊. +xn--rt6a.xn--0ug; 鱊.‌; [C1]; xn--rt6a.xn--0ug; ; ; # 鱊. +8𐹣.𑍨; 8𐹣.𑍨; [B1, B3, B6, V5]; xn--8-d26i.xn--0p1d; ; ; # 8𐹣.𑍨 +8𐹣.𑍨; ; [B1, B3, B6, V5]; xn--8-d26i.xn--0p1d; ; ; # 8𐹣.𑍨 +xn--8-d26i.xn--0p1d; 8𐹣.𑍨; [B1, B3, B6, V5]; xn--8-d26i.xn--0p1d; ; ; # 8𐹣.𑍨 +⏹𐧀.𐫯; ⏹𐧀.𐫯; [B1]; xn--qoh9161g.xn--1x9c; ; ; # ⏹𐧀.𐫯 +⏹𐧀.𐫯; ; [B1]; xn--qoh9161g.xn--1x9c; ; ; # ⏹𐧀.𐫯 +xn--qoh9161g.xn--1x9c; ⏹𐧀.𐫯; [B1]; xn--qoh9161g.xn--1x9c; ; ; # ⏹𐧀.𐫯 +𞤺ߌ4.‍; 𞤺ߌ4.‍; [B1, C2]; xn--4-0bd15808a.xn--1ug; ; xn--4-0bd15808a.; [] # 𞤺ߌ4. +𞤺ߌ4.‍; ; [B1, C2]; xn--4-0bd15808a.xn--1ug; ; xn--4-0bd15808a.; [] # 𞤺ߌ4. +𞤘ߌ4.‍; 𞤺ߌ4.‍; [B1, C2]; xn--4-0bd15808a.xn--1ug; ; xn--4-0bd15808a.; [] # 𞤺ߌ4. +xn--4-0bd15808a.; 𞤺ߌ4.; ; xn--4-0bd15808a.; ; ; # 𞤺ߌ4. +𞤺ߌ4.; ; ; xn--4-0bd15808a.; ; ; # 𞤺ߌ4. +𞤘ߌ4.; 𞤺ߌ4.; ; xn--4-0bd15808a.; ; ; # 𞤺ߌ4. +xn--4-0bd15808a.xn--1ug; 𞤺ߌ4.‍; [B1, C2]; xn--4-0bd15808a.xn--1ug; ; ; # 𞤺ߌ4. +𞤘ߌ4.‍; 𞤺ߌ4.‍; [B1, C2]; xn--4-0bd15808a.xn--1ug; ; xn--4-0bd15808a.; [] # 𞤺ߌ4. +⒗ঁ⃯-.࣢•; ; [B1, P1, V3, V6]; xn----z0d801p6kd.xn--l0b810j; ; ; # ⒗ঁ⃯-.• +16.ঁ⃯-.࣢•; ; [B1, P1, V3, V5, V6]; 16.xn----z0d801p.xn--l0b810j; ; ; # 16.ঁ⃯-.• +16.xn----z0d801p.xn--l0b810j; 16.ঁ⃯-.࣢•; [B1, V3, V5, V6]; 16.xn----z0d801p.xn--l0b810j; ; ; # 16.ঁ⃯-.• +xn----z0d801p6kd.xn--l0b810j; ⒗ঁ⃯-.࣢•; [B1, V3, V6]; xn----z0d801p6kd.xn--l0b810j; ; ; # ⒗ঁ⃯-.• +-。䏛; -.䏛; [V3]; -.xn--xco; ; ; # -.䏛 +-。䏛; -.䏛; [V3]; -.xn--xco; ; ; # -.䏛 +-.xn--xco; -.䏛; [V3]; -.xn--xco; ; ; # -.䏛 +‌񒃠.‍; ‌񒃠.‍; [C1, C2, P1, V6]; xn--0ugz7551c.xn--1ug; ; xn--dj8y.; [P1, V6] # . +‌񒃠.‍; ; [C1, C2, P1, V6]; xn--0ugz7551c.xn--1ug; ; xn--dj8y.; [P1, V6] # . +xn--dj8y.; 񒃠.; [V6]; xn--dj8y.; ; ; # . +xn--0ugz7551c.xn--1ug; ‌񒃠.‍; [C1, C2, V6]; xn--0ugz7551c.xn--1ug; ; ; # . +⒈⓰󥣇。𐹠‍򗷦Ⴕ; ⒈⓰󥣇.𐹠‍򗷦Ⴕ; [B1, C2, P1, V6]; xn--tsh0nz9380h.xn--tnd969erj4psgl3e; ; xn--tsh0nz9380h.xn--tnd1990ke579c; [B1, P1, V6] # ⒈⓰.𐹠Ⴕ +1.⓰󥣇。𐹠‍򗷦Ⴕ; 1.⓰󥣇.𐹠‍򗷦Ⴕ; [B1, C2, P1, V6]; 1.xn--svh00804k.xn--tnd969erj4psgl3e; ; 1.xn--svh00804k.xn--tnd1990ke579c; [B1, P1, V6] # 1.⓰.𐹠Ⴕ +1.⓰󥣇。𐹠‍򗷦ⴕ; 1.⓰󥣇.𐹠‍򗷦ⴕ; [B1, C2, P1, V6]; 1.xn--svh00804k.xn--1ug352csp0psg45e; ; 1.xn--svh00804k.xn--dljv223ee5t2d; [B1, P1, V6] # 1.⓰.𐹠ⴕ +1.xn--svh00804k.xn--dljv223ee5t2d; 1.⓰󥣇.𐹠򗷦ⴕ; [B1, V6]; 1.xn--svh00804k.xn--dljv223ee5t2d; ; ; # 1.⓰.𐹠ⴕ +1.xn--svh00804k.xn--1ug352csp0psg45e; 1.⓰󥣇.𐹠‍򗷦ⴕ; [B1, C2, V6]; 1.xn--svh00804k.xn--1ug352csp0psg45e; ; ; # 1.⓰.𐹠ⴕ +1.xn--svh00804k.xn--tnd1990ke579c; 1.⓰󥣇.𐹠򗷦Ⴕ; [B1, V6]; 1.xn--svh00804k.xn--tnd1990ke579c; ; ; # 1.⓰.𐹠Ⴕ +1.xn--svh00804k.xn--tnd969erj4psgl3e; 1.⓰󥣇.𐹠‍򗷦Ⴕ; [B1, C2, V6]; 1.xn--svh00804k.xn--tnd969erj4psgl3e; ; ; # 1.⓰.𐹠Ⴕ +⒈⓰󥣇。𐹠‍򗷦ⴕ; ⒈⓰󥣇.𐹠‍򗷦ⴕ; [B1, C2, P1, V6]; xn--tsh0nz9380h.xn--1ug352csp0psg45e; ; xn--tsh0nz9380h.xn--dljv223ee5t2d; [B1, P1, V6] # ⒈⓰.𐹠ⴕ +xn--tsh0nz9380h.xn--dljv223ee5t2d; ⒈⓰󥣇.𐹠򗷦ⴕ; [B1, V6]; xn--tsh0nz9380h.xn--dljv223ee5t2d; ; ; # ⒈⓰.𐹠ⴕ +xn--tsh0nz9380h.xn--1ug352csp0psg45e; ⒈⓰󥣇.𐹠‍򗷦ⴕ; [B1, C2, V6]; xn--tsh0nz9380h.xn--1ug352csp0psg45e; ; ; # ⒈⓰.𐹠ⴕ +xn--tsh0nz9380h.xn--tnd1990ke579c; ⒈⓰󥣇.𐹠򗷦Ⴕ; [B1, V6]; xn--tsh0nz9380h.xn--tnd1990ke579c; ; ; # ⒈⓰.𐹠Ⴕ +xn--tsh0nz9380h.xn--tnd969erj4psgl3e; ⒈⓰󥣇.𐹠‍򗷦Ⴕ; [B1, C2, V6]; xn--tsh0nz9380h.xn--tnd969erj4psgl3e; ; ; # ⒈⓰.𐹠Ⴕ +𞠊ᠮ-ß。᳐効؁𷣭; 𞠊ᠮ-ß.᳐効؁𷣭; [B1, B2, B3, P1, V5, V6]; xn----qfa310pg973b.xn--jfb197i791bi6x4c; ; xn---ss-21t18904a.xn--jfb197i791bi6x4c; # 𞠊ᠮ-ß.᳐効 +𞠊ᠮ-ß。᳐効؁𷣭; 𞠊ᠮ-ß.᳐効؁𷣭; [B1, B2, B3, P1, V5, V6]; xn----qfa310pg973b.xn--jfb197i791bi6x4c; ; xn---ss-21t18904a.xn--jfb197i791bi6x4c; # 𞠊ᠮ-ß.᳐効 +𞠊ᠮ-SS。᳐効؁𷣭; 𞠊ᠮ-ss.᳐効؁𷣭; [B1, B2, B3, P1, V5, V6]; xn---ss-21t18904a.xn--jfb197i791bi6x4c; ; ; # 𞠊ᠮ-ss.᳐効 +𞠊ᠮ-ss。᳐効؁𷣭; 𞠊ᠮ-ss.᳐効؁𷣭; [B1, B2, B3, P1, V5, V6]; xn---ss-21t18904a.xn--jfb197i791bi6x4c; ; ; # 𞠊ᠮ-ss.᳐効 +𞠊ᠮ-Ss。᳐効؁𷣭; 𞠊ᠮ-ss.᳐効؁𷣭; [B1, B2, B3, P1, V5, V6]; xn---ss-21t18904a.xn--jfb197i791bi6x4c; ; ; # 𞠊ᠮ-ss.᳐効 +xn---ss-21t18904a.xn--jfb197i791bi6x4c; 𞠊ᠮ-ss.᳐効؁𷣭; [B1, B2, B3, V5, V6]; xn---ss-21t18904a.xn--jfb197i791bi6x4c; ; ; # 𞠊ᠮ-ss.᳐効 +xn----qfa310pg973b.xn--jfb197i791bi6x4c; 𞠊ᠮ-ß.᳐効؁𷣭; [B1, B2, B3, V5, V6]; xn----qfa310pg973b.xn--jfb197i791bi6x4c; ; ; # 𞠊ᠮ-ß.᳐効 +𞠊ᠮ-SS。᳐効؁𷣭; 𞠊ᠮ-ss.᳐効؁𷣭; [B1, B2, B3, P1, V5, V6]; xn---ss-21t18904a.xn--jfb197i791bi6x4c; ; ; # 𞠊ᠮ-ss.᳐効 +𞠊ᠮ-ss。᳐効؁𷣭; 𞠊ᠮ-ss.᳐効؁𷣭; [B1, B2, B3, P1, V5, V6]; xn---ss-21t18904a.xn--jfb197i791bi6x4c; ; ; # 𞠊ᠮ-ss.᳐効 +𞠊ᠮ-Ss。᳐効؁𷣭; 𞠊ᠮ-ss.᳐効؁𷣭; [B1, B2, B3, P1, V5, V6]; xn---ss-21t18904a.xn--jfb197i791bi6x4c; ; ; # 𞠊ᠮ-ss.᳐効 +𑇀.󠨱; ; [P1, V5, V6]; xn--wd1d.xn--k946e; ; ; # 𑇀. +xn--wd1d.xn--k946e; 𑇀.󠨱; [V5, V6]; xn--wd1d.xn--k946e; ; ; # 𑇀. +␒3ﮈ。𝟘𐨿𐹆; ␒3ڈ.0𐨿𐹆; [B1, P1, V6]; xn--3-jsc897t.xn--0-sc5iy3h; ; ; # ␒3ڈ.0𐨿 +␒3ڈ。0𐨿𐹆; ␒3ڈ.0𐨿𐹆; [B1, P1, V6]; xn--3-jsc897t.xn--0-sc5iy3h; ; ; # ␒3ڈ.0𐨿 +xn--3-jsc897t.xn--0-sc5iy3h; ␒3ڈ.0𐨿𐹆; [B1, V6]; xn--3-jsc897t.xn--0-sc5iy3h; ; ; # ␒3ڈ.0𐨿 +ݫ6ઁࢦ。ᷣ; ݫ6ઁࢦ.ᷣ; [B1, B3, B6, V5]; xn--6-h5c06gj6c.xn--7eg; ; ; # ݫ6ઁࢦ.ᷣ +ݫ6ઁࢦ。ᷣ; ݫ6ઁࢦ.ᷣ; [B1, B3, B6, V5]; xn--6-h5c06gj6c.xn--7eg; ; ; # ݫ6ઁࢦ.ᷣ +xn--6-h5c06gj6c.xn--7eg; ݫ6ઁࢦ.ᷣ; [B1, B3, B6, V5]; xn--6-h5c06gj6c.xn--7eg; ; ; # ݫ6ઁࢦ.ᷣ +؅-𽤞Ⴂ。򅤶‍; ؅-𽤞Ⴂ.򅤶‍; [B1, B6, C2, P1, V6]; xn----0kc662fc152h.xn--1ugy3204f; ; xn----0kc662fc152h.xn--ss06b; [B1, P1, V6] # -Ⴂ. +؅-𽤞ⴂ。򅤶‍; ؅-𽤞ⴂ.򅤶‍; [B1, B6, C2, P1, V6]; xn----0kc8501a5399e.xn--1ugy3204f; ; xn----0kc8501a5399e.xn--ss06b; [B1, P1, V6] # -ⴂ. +xn----0kc8501a5399e.xn--ss06b; ؅-𽤞ⴂ.򅤶; [B1, V6]; xn----0kc8501a5399e.xn--ss06b; ; ; # -ⴂ. +xn----0kc8501a5399e.xn--1ugy3204f; ؅-𽤞ⴂ.򅤶‍; [B1, B6, C2, V6]; xn----0kc8501a5399e.xn--1ugy3204f; ; ; # -ⴂ. +xn----0kc662fc152h.xn--ss06b; ؅-𽤞Ⴂ.򅤶; [B1, V6]; xn----0kc662fc152h.xn--ss06b; ; ; # -Ⴂ. +xn----0kc662fc152h.xn--1ugy3204f; ؅-𽤞Ⴂ.򅤶‍; [B1, B6, C2, V6]; xn----0kc662fc152h.xn--1ugy3204f; ; ; # -Ⴂ. +⾆.ꡈ5≯ß; 舌.ꡈ5≯ß; [P1, V6]; xn--tc1a.xn--5-qfa988w745i; ; xn--tc1a.xn--5ss-3m2a5009e; # 舌.ꡈ5≯ß +⾆.ꡈ5≯ß; 舌.ꡈ5≯ß; [P1, V6]; xn--tc1a.xn--5-qfa988w745i; ; xn--tc1a.xn--5ss-3m2a5009e; # 舌.ꡈ5≯ß +舌.ꡈ5≯ß; ; [P1, V6]; xn--tc1a.xn--5-qfa988w745i; ; xn--tc1a.xn--5ss-3m2a5009e; # 舌.ꡈ5≯ß +舌.ꡈ5≯ß; 舌.ꡈ5≯ß; [P1, V6]; xn--tc1a.xn--5-qfa988w745i; ; xn--tc1a.xn--5ss-3m2a5009e; # 舌.ꡈ5≯ß +舌.ꡈ5≯SS; 舌.ꡈ5≯ss; [P1, V6]; xn--tc1a.xn--5ss-3m2a5009e; ; ; # 舌.ꡈ5≯ss +舌.ꡈ5≯SS; 舌.ꡈ5≯ss; [P1, V6]; xn--tc1a.xn--5ss-3m2a5009e; ; ; # 舌.ꡈ5≯ss +舌.ꡈ5≯ss; ; [P1, V6]; xn--tc1a.xn--5ss-3m2a5009e; ; ; # 舌.ꡈ5≯ss +舌.ꡈ5≯ss; 舌.ꡈ5≯ss; [P1, V6]; xn--tc1a.xn--5ss-3m2a5009e; ; ; # 舌.ꡈ5≯ss +舌.ꡈ5≯Ss; 舌.ꡈ5≯ss; [P1, V6]; xn--tc1a.xn--5ss-3m2a5009e; ; ; # 舌.ꡈ5≯ss +舌.ꡈ5≯Ss; 舌.ꡈ5≯ss; [P1, V6]; xn--tc1a.xn--5ss-3m2a5009e; ; ; # 舌.ꡈ5≯ss +xn--tc1a.xn--5ss-3m2a5009e; 舌.ꡈ5≯ss; [V6]; xn--tc1a.xn--5ss-3m2a5009e; ; ; # 舌.ꡈ5≯ss +xn--tc1a.xn--5-qfa988w745i; 舌.ꡈ5≯ß; [V6]; xn--tc1a.xn--5-qfa988w745i; ; ; # 舌.ꡈ5≯ß +⾆.ꡈ5≯SS; 舌.ꡈ5≯ss; [P1, V6]; xn--tc1a.xn--5ss-3m2a5009e; ; ; # 舌.ꡈ5≯ss +⾆.ꡈ5≯SS; 舌.ꡈ5≯ss; [P1, V6]; xn--tc1a.xn--5ss-3m2a5009e; ; ; # 舌.ꡈ5≯ss +⾆.ꡈ5≯ss; 舌.ꡈ5≯ss; [P1, V6]; xn--tc1a.xn--5ss-3m2a5009e; ; ; # 舌.ꡈ5≯ss +⾆.ꡈ5≯ss; 舌.ꡈ5≯ss; [P1, V6]; xn--tc1a.xn--5ss-3m2a5009e; ; ; # 舌.ꡈ5≯ss +⾆.ꡈ5≯Ss; 舌.ꡈ5≯ss; [P1, V6]; xn--tc1a.xn--5ss-3m2a5009e; ; ; # 舌.ꡈ5≯ss +⾆.ꡈ5≯Ss; 舌.ꡈ5≯ss; [P1, V6]; xn--tc1a.xn--5ss-3m2a5009e; ; ; # 舌.ꡈ5≯ss +્8‍.򾂈ݜ; ્8‍.򾂈ݜ; [B1, B5, B6, C2, P1, V5, V6]; xn--8-yke534n.xn--gpb79046m; ; xn--8-yke.xn--gpb79046m; [B1, B5, B6, P1, V5, V6] # ્8.ݜ +્8‍.򾂈ݜ; ; [B1, B5, B6, C2, P1, V5, V6]; xn--8-yke534n.xn--gpb79046m; ; xn--8-yke.xn--gpb79046m; [B1, B5, B6, P1, V5, V6] # ્8.ݜ +xn--8-yke.xn--gpb79046m; ્8.򾂈ݜ; [B1, B5, B6, V5, V6]; xn--8-yke.xn--gpb79046m; ; ; # ્8.ݜ +xn--8-yke534n.xn--gpb79046m; ્8‍.򾂈ݜ; [B1, B5, B6, C2, V5, V6]; xn--8-yke534n.xn--gpb79046m; ; ; # ્8.ݜ +򸷆ੰ≮򹓙.񞎧⁷󠯙ڶ; 򸷆ੰ≮򹓙.񞎧7󠯙ڶ; [B5, B6, P1, V6]; xn--ycc893jqh38rb6fa.xn--7-5uc53836ixt41c; ; ; # ੰ≮.7ڶ +򸷆ੰ≮򹓙.񞎧⁷󠯙ڶ; 򸷆ੰ≮򹓙.񞎧7󠯙ڶ; [B5, B6, P1, V6]; xn--ycc893jqh38rb6fa.xn--7-5uc53836ixt41c; ; ; # ੰ≮.7ڶ +򸷆ੰ≮򹓙.񞎧7󠯙ڶ; ; [B5, B6, P1, V6]; xn--ycc893jqh38rb6fa.xn--7-5uc53836ixt41c; ; ; # ੰ≮.7ڶ +򸷆ੰ≮򹓙.񞎧7󠯙ڶ; 򸷆ੰ≮򹓙.񞎧7󠯙ڶ; [B5, B6, P1, V6]; xn--ycc893jqh38rb6fa.xn--7-5uc53836ixt41c; ; ; # ੰ≮.7ڶ +xn--ycc893jqh38rb6fa.xn--7-5uc53836ixt41c; 򸷆ੰ≮򹓙.񞎧7󠯙ڶ; [B5, B6, V6]; xn--ycc893jqh38rb6fa.xn--7-5uc53836ixt41c; ; ; # ੰ≮.7ڶ +𞤪.ς; ; ; xn--ie6h.xn--3xa; ; xn--ie6h.xn--4xa; # 𞤪.ς +𞤈.Σ; 𞤪.σ; ; xn--ie6h.xn--4xa; ; ; # 𞤪.σ +𞤪.σ; ; ; xn--ie6h.xn--4xa; ; ; # 𞤪.σ +𞤈.σ; 𞤪.σ; ; xn--ie6h.xn--4xa; ; ; # 𞤪.σ +xn--ie6h.xn--4xa; 𞤪.σ; ; xn--ie6h.xn--4xa; ; ; # 𞤪.σ +𞤈.ς; 𞤪.ς; ; xn--ie6h.xn--3xa; ; xn--ie6h.xn--4xa; # 𞤪.ς +xn--ie6h.xn--3xa; 𞤪.ς; ; xn--ie6h.xn--3xa; ; ; # 𞤪.ς +𞤪.Σ; 𞤪.σ; ; xn--ie6h.xn--4xa; ; ; # 𞤪.σ +‌Ⴚ。ς; ‌Ⴚ.ς; [C1, P1, V6]; xn--ynd759e.xn--3xa; ; xn--ynd.xn--4xa; [P1, V6] # Ⴚ.ς +‌Ⴚ。ς; ‌Ⴚ.ς; [C1, P1, V6]; xn--ynd759e.xn--3xa; ; xn--ynd.xn--4xa; [P1, V6] # Ⴚ.ς +‌ⴚ。ς; ‌ⴚ.ς; [C1]; xn--0ug262c.xn--3xa; ; xn--ilj.xn--4xa; [] # ⴚ.ς +‌Ⴚ。Σ; ‌Ⴚ.σ; [C1, P1, V6]; xn--ynd759e.xn--4xa; ; xn--ynd.xn--4xa; [P1, V6] # Ⴚ.σ +‌ⴚ。σ; ‌ⴚ.σ; [C1]; xn--0ug262c.xn--4xa; ; xn--ilj.xn--4xa; [] # ⴚ.σ +xn--ilj.xn--4xa; ⴚ.σ; ; xn--ilj.xn--4xa; ; ; # ⴚ.σ +ⴚ.σ; ; ; xn--ilj.xn--4xa; ; ; # ⴚ.σ +Ⴚ.Σ; Ⴚ.σ; [P1, V6]; xn--ynd.xn--4xa; ; ; # Ⴚ.σ +ⴚ.ς; ; ; xn--ilj.xn--3xa; ; xn--ilj.xn--4xa; # ⴚ.ς +Ⴚ.ς; ; [P1, V6]; xn--ynd.xn--3xa; ; xn--ynd.xn--4xa; # Ⴚ.ς +xn--ynd.xn--4xa; Ⴚ.σ; [V6]; xn--ynd.xn--4xa; ; ; # Ⴚ.σ +xn--ynd.xn--3xa; Ⴚ.ς; [V6]; xn--ynd.xn--3xa; ; ; # Ⴚ.ς +xn--ilj.xn--3xa; ⴚ.ς; ; xn--ilj.xn--3xa; ; ; # ⴚ.ς +Ⴚ.σ; ; [P1, V6]; xn--ynd.xn--4xa; ; ; # Ⴚ.σ +xn--0ug262c.xn--4xa; ‌ⴚ.σ; [C1]; xn--0ug262c.xn--4xa; ; ; # ⴚ.σ +xn--ynd759e.xn--4xa; ‌Ⴚ.σ; [C1, V6]; xn--ynd759e.xn--4xa; ; ; # Ⴚ.σ +xn--0ug262c.xn--3xa; ‌ⴚ.ς; [C1]; xn--0ug262c.xn--3xa; ; ; # ⴚ.ς +xn--ynd759e.xn--3xa; ‌Ⴚ.ς; [C1, V6]; xn--ynd759e.xn--3xa; ; ; # Ⴚ.ς +‌ⴚ。ς; ‌ⴚ.ς; [C1]; xn--0ug262c.xn--3xa; ; xn--ilj.xn--4xa; [] # ⴚ.ς +‌Ⴚ。Σ; ‌Ⴚ.σ; [C1, P1, V6]; xn--ynd759e.xn--4xa; ; xn--ynd.xn--4xa; [P1, V6] # Ⴚ.σ +‌ⴚ。σ; ‌ⴚ.σ; [C1]; xn--0ug262c.xn--4xa; ; xn--ilj.xn--4xa; [] # ⴚ.σ +𞤃.𐹦; 𞤥.𐹦; [B1]; xn--de6h.xn--eo0d; ; ; # 𞤥.𐹦 +𞤃.𐹦; 𞤥.𐹦; [B1]; xn--de6h.xn--eo0d; ; ; # 𞤥.𐹦 +𞤥.𐹦; ; [B1]; xn--de6h.xn--eo0d; ; ; # 𞤥.𐹦 +xn--de6h.xn--eo0d; 𞤥.𐹦; [B1]; xn--de6h.xn--eo0d; ; ; # 𞤥.𐹦 +𞤥.𐹦; 𞤥.𐹦; [B1]; xn--de6h.xn--eo0d; ; ; # 𞤥.𐹦 +‍⾕。‌꥓̐ꡎ; ‍谷.‌꥓̐ꡎ; [C1, C2]; xn--1ug0273b.xn--0sa359l6n7g13a; ; xn--6g3a.xn--0sa8175flwa; [V5] # 谷.꥓̐ꡎ +‍⾕。‌꥓̐ꡎ; ‍谷.‌꥓̐ꡎ; [C1, C2]; xn--1ug0273b.xn--0sa359l6n7g13a; ; xn--6g3a.xn--0sa8175flwa; [V5] # 谷.꥓̐ꡎ +‍谷。‌꥓̐ꡎ; ‍谷.‌꥓̐ꡎ; [C1, C2]; xn--1ug0273b.xn--0sa359l6n7g13a; ; xn--6g3a.xn--0sa8175flwa; [V5] # 谷.꥓̐ꡎ +xn--6g3a.xn--0sa8175flwa; 谷.꥓̐ꡎ; [V5]; xn--6g3a.xn--0sa8175flwa; ; ; # 谷.꥓̐ꡎ +xn--1ug0273b.xn--0sa359l6n7g13a; ‍谷.‌꥓̐ꡎ; [C1, C2]; xn--1ug0273b.xn--0sa359l6n7g13a; ; ; # 谷.꥓̐ꡎ +ڪ-뉔.𞤐‌; ڪ-뉔.𞤲‌; [B2, B3, C1]; xn----guc3592k.xn--0ug7611p; ; xn----guc3592k.xn--qe6h; [B2, B3] # ڪ-뉔.𞤲 +ڪ-뉔.𞤐‌; ڪ-뉔.𞤲‌; [B2, B3, C1]; xn----guc3592k.xn--0ug7611p; ; xn----guc3592k.xn--qe6h; [B2, B3] # ڪ-뉔.𞤲 +ڪ-뉔.𞤐‌; ڪ-뉔.𞤲‌; [B2, B3, C1]; xn----guc3592k.xn--0ug7611p; ; xn----guc3592k.xn--qe6h; [B2, B3] # ڪ-뉔.𞤲 +ڪ-뉔.𞤐‌; ڪ-뉔.𞤲‌; [B2, B3, C1]; xn----guc3592k.xn--0ug7611p; ; xn----guc3592k.xn--qe6h; [B2, B3] # ڪ-뉔.𞤲 +ڪ-뉔.𞤲‌; ڪ-뉔.𞤲‌; [B2, B3, C1]; xn----guc3592k.xn--0ug7611p; ; xn----guc3592k.xn--qe6h; [B2, B3] # ڪ-뉔.𞤲 +ڪ-뉔.𞤲‌; ; [B2, B3, C1]; xn----guc3592k.xn--0ug7611p; ; xn----guc3592k.xn--qe6h; [B2, B3] # ڪ-뉔.𞤲 +xn----guc3592k.xn--qe6h; ڪ-뉔.𞤲; [B2, B3]; xn----guc3592k.xn--qe6h; ; ; # ڪ-뉔.𞤲 +xn----guc3592k.xn--0ug7611p; ڪ-뉔.𞤲‌; [B2, B3, C1]; xn----guc3592k.xn--0ug7611p; ; ; # ڪ-뉔.𞤲 +ڪ-뉔.𞤲‌; ڪ-뉔.𞤲‌; [B2, B3, C1]; xn----guc3592k.xn--0ug7611p; ; xn----guc3592k.xn--qe6h; [B2, B3] # ڪ-뉔.𞤲 +ڪ-뉔.𞤲‌; ڪ-뉔.𞤲‌; [B2, B3, C1]; xn----guc3592k.xn--0ug7611p; ; xn----guc3592k.xn--qe6h; [B2, B3] # ڪ-뉔.𞤲 +񔲵5ᦛς.꣄ݻܸ᳒; 񔲵5ᦛς.꣄ݻܸ᳒; [B1, P1, V5, V6]; xn--5-ymb298ng603j.xn--fob7kk44dl41k; ; xn--5-0mb988ng603j.xn--fob7kk44dl41k; # 5ᦛς.꣄ݻܸ᳒ +񔲵5ᦛς.꣄ݻܸ᳒; 񔲵5ᦛς.꣄ݻܸ᳒; [B1, P1, V5, V6]; xn--5-ymb298ng603j.xn--fob7kk44dl41k; ; xn--5-0mb988ng603j.xn--fob7kk44dl41k; # 5ᦛς.꣄ݻܸ᳒ +񔲵5ᦛς.꣄ݻܸ᳒; ; [B1, P1, V5, V6]; xn--5-ymb298ng603j.xn--fob7kk44dl41k; ; xn--5-0mb988ng603j.xn--fob7kk44dl41k; # 5ᦛς.꣄ݻܸ᳒ +񔲵5ᦛΣ.꣄ݻܸ᳒; 񔲵5ᦛσ.꣄ݻܸ᳒; [B1, P1, V5, V6]; xn--5-0mb988ng603j.xn--fob7kk44dl41k; ; ; # 5ᦛσ.꣄ݻܸ᳒ +񔲵5ᦛσ.꣄ݻܸ᳒; ; [B1, P1, V5, V6]; xn--5-0mb988ng603j.xn--fob7kk44dl41k; ; ; # 5ᦛσ.꣄ݻܸ᳒ +xn--5-0mb988ng603j.xn--fob7kk44dl41k; 񔲵5ᦛσ.꣄ݻܸ᳒; [B1, V5, V6]; xn--5-0mb988ng603j.xn--fob7kk44dl41k; ; ; # 5ᦛσ.꣄ݻܸ᳒ +xn--5-ymb298ng603j.xn--fob7kk44dl41k; 񔲵5ᦛς.꣄ݻܸ᳒; [B1, V5, V6]; xn--5-ymb298ng603j.xn--fob7kk44dl41k; ; ; # 5ᦛς.꣄ݻܸ᳒ +񔲵5ᦛΣ.꣄ݻܸ᳒; 񔲵5ᦛσ.꣄ݻܸ᳒; [B1, P1, V5, V6]; xn--5-0mb988ng603j.xn--fob7kk44dl41k; ; ; # 5ᦛσ.꣄ݻܸ᳒ +񔲵5ᦛσ.꣄ݻܸ᳒; 񔲵5ᦛσ.꣄ݻܸ᳒; [B1, P1, V5, V6]; xn--5-0mb988ng603j.xn--fob7kk44dl41k; ; ; # 5ᦛσ.꣄ݻܸ᳒ +񔲵5ᦛΣ.꣄ݻܸ᳒; 񔲵5ᦛσ.꣄ݻܸ᳒; [B1, P1, V5, V6]; xn--5-0mb988ng603j.xn--fob7kk44dl41k; ; ; # 5ᦛσ.꣄ݻܸ᳒ +񔲵5ᦛσ.꣄ݻܸ᳒; 񔲵5ᦛσ.꣄ݻܸ᳒; [B1, P1, V5, V6]; xn--5-0mb988ng603j.xn--fob7kk44dl41k; ; ; # 5ᦛσ.꣄ݻܸ᳒ +淽。ᠾ; 淽.ᠾ; ; xn--34w.xn--x7e; ; ; # 淽.ᠾ +xn--34w.xn--x7e; 淽.ᠾ; ; xn--34w.xn--x7e; ; ; # 淽.ᠾ +淽.ᠾ; ; ; xn--34w.xn--x7e; ; ; # 淽.ᠾ +𐹴𑘷。-; 𐹴𑘷.-; [B1, V3]; xn--so0do6k.-; ; ; # 𐹴𑘷.- +xn--so0do6k.-; 𐹴𑘷.-; [B1, V3]; xn--so0do6k.-; ; ; # 𐹴𑘷.- +򬨩Ⴓ❓。𑄨; 򬨩Ⴓ❓.𑄨; [P1, V5, V6]; xn--rnd896i0j14q.xn--k80d; ; ; # Ⴓ❓.𑄨 +򬨩Ⴓ❓。𑄨; 򬨩Ⴓ❓.𑄨; [P1, V5, V6]; xn--rnd896i0j14q.xn--k80d; ; ; # Ⴓ❓.𑄨 +򬨩ⴓ❓。𑄨; 򬨩ⴓ❓.𑄨; [P1, V5, V6]; xn--8di78qvw32y.xn--k80d; ; ; # ⴓ❓.𑄨 +xn--8di78qvw32y.xn--k80d; 򬨩ⴓ❓.𑄨; [V5, V6]; xn--8di78qvw32y.xn--k80d; ; ; # ⴓ❓.𑄨 +xn--rnd896i0j14q.xn--k80d; 򬨩Ⴓ❓.𑄨; [V5, V6]; xn--rnd896i0j14q.xn--k80d; ; ; # Ⴓ❓.𑄨 +򬨩ⴓ❓。𑄨; 򬨩ⴓ❓.𑄨; [P1, V5, V6]; xn--8di78qvw32y.xn--k80d; ; ; # ⴓ❓.𑄨 +‌𐹡𞤌Ⴇ。ßႣ; ‌𐹡𞤮Ⴇ.ßႣ; [B1, C1, P1, V6]; xn--fnd599eyj4pr50g.xn--zca681f; ; xn--fnd1201kegrf.xn--ss-fek; [B1, P1, V6] # 𐹡𞤮Ⴇ.ßႣ +‌𐹡𞤌Ⴇ。ßႣ; ‌𐹡𞤮Ⴇ.ßႣ; [B1, C1, P1, V6]; xn--fnd599eyj4pr50g.xn--zca681f; ; xn--fnd1201kegrf.xn--ss-fek; [B1, P1, V6] # 𐹡𞤮Ⴇ.ßႣ +‌𐹡𞤮ⴇ。ßⴃ; ‌𐹡𞤮ⴇ.ßⴃ; [B1, C1]; xn--0ug332c3q0pr56g.xn--zca417t; ; xn--ykj9323eegwf.xn--ss-151a; [B1] # 𐹡𞤮ⴇ.ßⴃ +‌𐹡𞤌Ⴇ。SSႣ; ‌𐹡𞤮Ⴇ.ssႣ; [B1, C1, P1, V6]; xn--fnd599eyj4pr50g.xn--ss-fek; ; xn--fnd1201kegrf.xn--ss-fek; [B1, P1, V6] # 𐹡𞤮Ⴇ.ssႣ +‌𐹡𞤮ⴇ。ssⴃ; ‌𐹡𞤮ⴇ.ssⴃ; [B1, C1]; xn--0ug332c3q0pr56g.xn--ss-151a; ; xn--ykj9323eegwf.xn--ss-151a; [B1] # 𐹡𞤮ⴇ.ssⴃ +‌𐹡𞤌ⴇ。Ssⴃ; ‌𐹡𞤮ⴇ.ssⴃ; [B1, C1]; xn--0ug332c3q0pr56g.xn--ss-151a; ; xn--ykj9323eegwf.xn--ss-151a; [B1] # 𐹡𞤮ⴇ.ssⴃ +xn--ykj9323eegwf.xn--ss-151a; 𐹡𞤮ⴇ.ssⴃ; [B1]; xn--ykj9323eegwf.xn--ss-151a; ; ; # 𐹡𞤮ⴇ.ssⴃ +xn--0ug332c3q0pr56g.xn--ss-151a; ‌𐹡𞤮ⴇ.ssⴃ; [B1, C1]; xn--0ug332c3q0pr56g.xn--ss-151a; ; ; # 𐹡𞤮ⴇ.ssⴃ +xn--fnd1201kegrf.xn--ss-fek; 𐹡𞤮Ⴇ.ssႣ; [B1, V6]; xn--fnd1201kegrf.xn--ss-fek; ; ; # 𐹡𞤮Ⴇ.ssႣ +xn--fnd599eyj4pr50g.xn--ss-fek; ‌𐹡𞤮Ⴇ.ssႣ; [B1, C1, V6]; xn--fnd599eyj4pr50g.xn--ss-fek; ; ; # 𐹡𞤮Ⴇ.ssႣ +xn--0ug332c3q0pr56g.xn--zca417t; ‌𐹡𞤮ⴇ.ßⴃ; [B1, C1]; xn--0ug332c3q0pr56g.xn--zca417t; ; ; # 𐹡𞤮ⴇ.ßⴃ +xn--fnd599eyj4pr50g.xn--zca681f; ‌𐹡𞤮Ⴇ.ßႣ; [B1, C1, V6]; xn--fnd599eyj4pr50g.xn--zca681f; ; ; # 𐹡𞤮Ⴇ.ßႣ +‌𐹡𞤮ⴇ。ßⴃ; ‌𐹡𞤮ⴇ.ßⴃ; [B1, C1]; xn--0ug332c3q0pr56g.xn--zca417t; ; xn--ykj9323eegwf.xn--ss-151a; [B1] # 𐹡𞤮ⴇ.ßⴃ +‌𐹡𞤌Ⴇ。SSႣ; ‌𐹡𞤮Ⴇ.ssႣ; [B1, C1, P1, V6]; xn--fnd599eyj4pr50g.xn--ss-fek; ; xn--fnd1201kegrf.xn--ss-fek; [B1, P1, V6] # 𐹡𞤮Ⴇ.ssႣ +‌𐹡𞤮ⴇ。ssⴃ; ‌𐹡𞤮ⴇ.ssⴃ; [B1, C1]; xn--0ug332c3q0pr56g.xn--ss-151a; ; xn--ykj9323eegwf.xn--ss-151a; [B1] # 𐹡𞤮ⴇ.ssⴃ +‌𐹡𞤌ⴇ。Ssⴃ; ‌𐹡𞤮ⴇ.ssⴃ; [B1, C1]; xn--0ug332c3q0pr56g.xn--ss-151a; ; xn--ykj9323eegwf.xn--ss-151a; [B1] # 𐹡𞤮ⴇ.ssⴃ +‌𐹡𞤌ⴇ。ßⴃ; ‌𐹡𞤮ⴇ.ßⴃ; [B1, C1]; xn--0ug332c3q0pr56g.xn--zca417t; ; xn--ykj9323eegwf.xn--ss-151a; [B1] # 𐹡𞤮ⴇ.ßⴃ +‌𐹡𞤌ⴇ。ssⴃ; ‌𐹡𞤮ⴇ.ssⴃ; [B1, C1]; xn--0ug332c3q0pr56g.xn--ss-151a; ; xn--ykj9323eegwf.xn--ss-151a; [B1] # 𐹡𞤮ⴇ.ssⴃ +‌𐹡𞤌Ⴇ。Ssⴃ; ‌𐹡𞤮Ⴇ.ssⴃ; [B1, C1, P1, V6]; xn--fnd599eyj4pr50g.xn--ss-151a; ; xn--fnd1201kegrf.xn--ss-151a; [B1, P1, V6] # 𐹡𞤮Ⴇ.ssⴃ +xn--fnd1201kegrf.xn--ss-151a; 𐹡𞤮Ⴇ.ssⴃ; [B1, V6]; xn--fnd1201kegrf.xn--ss-151a; ; ; # 𐹡𞤮Ⴇ.ssⴃ +xn--fnd599eyj4pr50g.xn--ss-151a; ‌𐹡𞤮Ⴇ.ssⴃ; [B1, C1, V6]; xn--fnd599eyj4pr50g.xn--ss-151a; ; ; # 𐹡𞤮Ⴇ.ssⴃ +‌𐹡𞤌ⴇ。ßⴃ; ‌𐹡𞤮ⴇ.ßⴃ; [B1, C1]; xn--0ug332c3q0pr56g.xn--zca417t; ; xn--ykj9323eegwf.xn--ss-151a; [B1] # 𐹡𞤮ⴇ.ßⴃ +‌𐹡𞤌ⴇ。ssⴃ; ‌𐹡𞤮ⴇ.ssⴃ; [B1, C1]; xn--0ug332c3q0pr56g.xn--ss-151a; ; xn--ykj9323eegwf.xn--ss-151a; [B1] # 𐹡𞤮ⴇ.ssⴃ +‌𐹡𞤌Ⴇ。Ssⴃ; ‌𐹡𞤮Ⴇ.ssⴃ; [B1, C1, P1, V6]; xn--fnd599eyj4pr50g.xn--ss-151a; ; xn--fnd1201kegrf.xn--ss-151a; [B1, P1, V6] # 𐹡𞤮Ⴇ.ssⴃ +៿。𞬳; ៿.𞬳; [P1, V6]; xn--45e.xn--et6h; ; ; # . +៿。𞬳; ៿.𞬳; [P1, V6]; xn--45e.xn--et6h; ; ; # . +xn--45e.xn--et6h; ៿.𞬳; [V6]; xn--45e.xn--et6h; ; ; # . +ْ‍。್𑚳; ْ‍.್𑚳; [C2, V5]; xn--uhb882k.xn--8tc4527k; ; xn--uhb.xn--8tc4527k; [V5] # ْ.್𑚳 +ْ‍。್𑚳; ْ‍.್𑚳; [C2, V5]; xn--uhb882k.xn--8tc4527k; ; xn--uhb.xn--8tc4527k; [V5] # ْ.್𑚳 +xn--uhb.xn--8tc4527k; ْ.್𑚳; [V5]; xn--uhb.xn--8tc4527k; ; ; # ْ.್𑚳 +xn--uhb882k.xn--8tc4527k; ْ‍.್𑚳; [C2, V5]; xn--uhb882k.xn--8tc4527k; ; ; # ْ.್𑚳 +-≠ᠻ.ݭ𞥃≮󟷺; -≠ᠻ.ݭ𞥃≮󟷺; [B1, B2, B3, P1, V3, V6]; xn----g6j886c.xn--xpb049kk353abj99f; ; ; # -≠ᠻ.ݭ𞥃≮ +-≠ᠻ.ݭ𞥃≮󟷺; -≠ᠻ.ݭ𞥃≮󟷺; [B1, B2, B3, P1, V3, V6]; xn----g6j886c.xn--xpb049kk353abj99f; ; ; # -≠ᠻ.ݭ𞥃≮ +-≠ᠻ.ݭ𞥃≮󟷺; ; [B1, B2, B3, P1, V3, V6]; xn----g6j886c.xn--xpb049kk353abj99f; ; ; # -≠ᠻ.ݭ𞥃≮ +-≠ᠻ.ݭ𞥃≮󟷺; -≠ᠻ.ݭ𞥃≮󟷺; [B1, B2, B3, P1, V3, V6]; xn----g6j886c.xn--xpb049kk353abj99f; ; ; # -≠ᠻ.ݭ𞥃≮ +-≠ᠻ.ݭ𞤡≮󟷺; -≠ᠻ.ݭ𞥃≮󟷺; [B1, B2, B3, P1, V3, V6]; xn----g6j886c.xn--xpb049kk353abj99f; ; ; # -≠ᠻ.ݭ𞥃≮ +-≠ᠻ.ݭ𞤡≮󟷺; -≠ᠻ.ݭ𞥃≮󟷺; [B1, B2, B3, P1, V3, V6]; xn----g6j886c.xn--xpb049kk353abj99f; ; ; # -≠ᠻ.ݭ𞥃≮ +xn----g6j886c.xn--xpb049kk353abj99f; -≠ᠻ.ݭ𞥃≮󟷺; [B1, B2, B3, V3, V6]; xn----g6j886c.xn--xpb049kk353abj99f; ; ; # -≠ᠻ.ݭ𞥃≮ +-≠ᠻ.ݭ𞤡≮󟷺; -≠ᠻ.ݭ𞥃≮󟷺; [B1, B2, B3, P1, V3, V6]; xn----g6j886c.xn--xpb049kk353abj99f; ; ; # -≠ᠻ.ݭ𞥃≮ +-≠ᠻ.ݭ𞤡≮󟷺; -≠ᠻ.ݭ𞥃≮󟷺; [B1, B2, B3, P1, V3, V6]; xn----g6j886c.xn--xpb049kk353abj99f; ; ; # -≠ᠻ.ݭ𞥃≮ +󠰆≯޵𐻪.򊥕≮𑁆ࡌ; 󠰆≯޵𐻪.򊥕≮𑁆ࡌ; [B1, B5, B6, P1, V6]; xn--zrb797kdm1oes34i.xn--bwb394k8k2o25n6d; ; ; # ≯.≮𑁆ࡌ +󠰆≯޵𐻪.򊥕≮𑁆ࡌ; 󠰆≯޵𐻪.򊥕≮𑁆ࡌ; [B1, B5, B6, P1, V6]; xn--zrb797kdm1oes34i.xn--bwb394k8k2o25n6d; ; ; # ≯.≮𑁆ࡌ +󠰆≯޵𐻪.򊥕≮𑁆ࡌ; ; [B1, B5, B6, P1, V6]; xn--zrb797kdm1oes34i.xn--bwb394k8k2o25n6d; ; ; # ≯.≮𑁆ࡌ +󠰆≯޵𐻪.򊥕≮𑁆ࡌ; 󠰆≯޵𐻪.򊥕≮𑁆ࡌ; [B1, B5, B6, P1, V6]; xn--zrb797kdm1oes34i.xn--bwb394k8k2o25n6d; ; ; # ≯.≮𑁆ࡌ +xn--zrb797kdm1oes34i.xn--bwb394k8k2o25n6d; 󠰆≯޵𐻪.򊥕≮𑁆ࡌ; [B1, B5, B6, V6]; xn--zrb797kdm1oes34i.xn--bwb394k8k2o25n6d; ; ; # ≯.≮𑁆ࡌ +≠󦋂.؀்-ڹ; ; [B1, P1, V6]; xn--1ch22084l.xn----qkc07co6n; ; ; # ≠.்-ڹ +≠󦋂.؀்-ڹ; ≠󦋂.؀்-ڹ; [B1, P1, V6]; xn--1ch22084l.xn----qkc07co6n; ; ; # ≠.்-ڹ +xn--1ch22084l.xn----qkc07co6n; ≠󦋂.؀்-ڹ; [B1, V6]; xn--1ch22084l.xn----qkc07co6n; ; ; # ≠.்-ڹ +៝󠁣≠。𐹼𐋤; ៝󠁣≠.𐹼𐋤; [B1, P1, V5, V6]; xn--54e694cn389z.xn--787ct8r; ; ; # ៝≠.𐹼𐋤 +៝󠁣≠。𐹼𐋤; ៝󠁣≠.𐹼𐋤; [B1, P1, V5, V6]; xn--54e694cn389z.xn--787ct8r; ; ; # ៝≠.𐹼𐋤 +៝󠁣≠。𐹼𐋤; ៝󠁣≠.𐹼𐋤; [B1, P1, V5, V6]; xn--54e694cn389z.xn--787ct8r; ; ; # ៝≠.𐹼𐋤 +៝󠁣≠。𐹼𐋤; ៝󠁣≠.𐹼𐋤; [B1, P1, V5, V6]; xn--54e694cn389z.xn--787ct8r; ; ; # ៝≠.𐹼𐋤 +xn--54e694cn389z.xn--787ct8r; ៝󠁣≠.𐹼𐋤; [B1, V5, V6]; xn--54e694cn389z.xn--787ct8r; ; ; # ៝≠.𐹼𐋤 +ß𰀻񆬗。𝩨🕮ß; ß𰀻񆬗.𝩨🕮ß; [P1, V5, V6]; xn--zca20040bgrkh.xn--zca3653v86qa; ; xn--ss-jl59biy67d.xn--ss-4d11aw87d; # ß𰀻.𝩨🕮ß +ß𰀻񆬗。𝩨🕮ß; ß𰀻񆬗.𝩨🕮ß; [P1, V5, V6]; xn--zca20040bgrkh.xn--zca3653v86qa; ; xn--ss-jl59biy67d.xn--ss-4d11aw87d; # ß𰀻.𝩨🕮ß +SS𰀻񆬗。𝩨🕮SS; ss𰀻񆬗.𝩨🕮ss; [P1, V5, V6]; xn--ss-jl59biy67d.xn--ss-4d11aw87d; ; ; # ss𰀻.𝩨🕮ss +ss𰀻񆬗。𝩨🕮ss; ss𰀻񆬗.𝩨🕮ss; [P1, V5, V6]; xn--ss-jl59biy67d.xn--ss-4d11aw87d; ; ; # ss𰀻.𝩨🕮ss +Ss𰀻񆬗。𝩨🕮Ss; ss𰀻񆬗.𝩨🕮ss; [P1, V5, V6]; xn--ss-jl59biy67d.xn--ss-4d11aw87d; ; ; # ss𰀻.𝩨🕮ss +xn--ss-jl59biy67d.xn--ss-4d11aw87d; ss𰀻񆬗.𝩨🕮ss; [V5, V6]; xn--ss-jl59biy67d.xn--ss-4d11aw87d; ; ; # ss𰀻.𝩨🕮ss +xn--zca20040bgrkh.xn--zca3653v86qa; ß𰀻񆬗.𝩨🕮ß; [V5, V6]; xn--zca20040bgrkh.xn--zca3653v86qa; ; ; # ß𰀻.𝩨🕮ß +SS𰀻񆬗。𝩨🕮SS; ss𰀻񆬗.𝩨🕮ss; [P1, V5, V6]; xn--ss-jl59biy67d.xn--ss-4d11aw87d; ; ; # ss𰀻.𝩨🕮ss +ss𰀻񆬗。𝩨🕮ss; ss𰀻񆬗.𝩨🕮ss; [P1, V5, V6]; xn--ss-jl59biy67d.xn--ss-4d11aw87d; ; ; # ss𰀻.𝩨🕮ss +Ss𰀻񆬗。𝩨🕮Ss; ss𰀻񆬗.𝩨🕮ss; [P1, V5, V6]; xn--ss-jl59biy67d.xn--ss-4d11aw87d; ; ; # ss𰀻.𝩨🕮ss +‍。‌; ‍.‌; [C1, C2]; xn--1ug.xn--0ug; ; .; [A4_2] # . +xn--1ug.xn--0ug; ‍.‌; [C1, C2]; xn--1ug.xn--0ug; ; ; # . +҃𐭞‍.ឹ𞯌򟩚; ; [B1, C2, P1, V5, V6]; xn--m3a412lrr0o.xn--43e8670vmd79b; ; xn--m3a6965k.xn--43e8670vmd79b; [B1, P1, V5, V6] # ҃𐭞.ឹ +xn--m3a6965k.xn--43e8670vmd79b; ҃𐭞.ឹ𞯌򟩚; [B1, V5, V6]; xn--m3a6965k.xn--43e8670vmd79b; ; ; # ҃𐭞.ឹ +xn--m3a412lrr0o.xn--43e8670vmd79b; ҃𐭞‍.ឹ𞯌򟩚; [B1, C2, V5, V6]; xn--m3a412lrr0o.xn--43e8670vmd79b; ; ; # ҃𐭞.ឹ +‌𐠨‌临。ꡢ򄷞ⶏ𐹣; ‌𐠨‌临.ꡢ򄷞ⶏ𐹣; [B1, B5, B6, C1, P1, V6]; xn--0uga2656aop9k.xn--uojv340bk71c99u9f; ; xn--miq9646b.xn--uojv340bk71c99u9f; [B2, B3, B5, B6, P1, V6] # 𐠨临.ꡢⶏ𐹣 +xn--miq9646b.xn--uojv340bk71c99u9f; 𐠨临.ꡢ򄷞ⶏ𐹣; [B2, B3, B5, B6, V6]; xn--miq9646b.xn--uojv340bk71c99u9f; ; ; # 𐠨临.ꡢⶏ𐹣 +xn--0uga2656aop9k.xn--uojv340bk71c99u9f; ‌𐠨‌临.ꡢ򄷞ⶏ𐹣; [B1, B5, B6, C1, V6]; xn--0uga2656aop9k.xn--uojv340bk71c99u9f; ; ; # 𐠨临.ꡢⶏ𐹣 +󠑘.󠄮; 󠑘.; [P1, V6]; xn--s136e.; ; ; # . +󠑘.󠄮; 󠑘.; [P1, V6]; xn--s136e.; ; ; # . +xn--s136e.; 󠑘.; [V6]; xn--s136e.; ; ; # . +𐫄്.꫶; 𐫄്.꫶; [B1, B3, B6, V5]; xn--wxc7880k.xn--2v9a; ; ; # 𐫄്.꫶ +𐫄്.꫶; ; [B1, B3, B6, V5]; xn--wxc7880k.xn--2v9a; ; ; # 𐫄്.꫶ +xn--wxc7880k.xn--2v9a; 𐫄്.꫶; [B1, B3, B6, V5]; xn--wxc7880k.xn--2v9a; ; ; # 𐫄്.꫶ +ꦷ󝵙멹。⒛󠨇; ꦷ󝵙멹.⒛󠨇; [P1, V5, V6]; xn--ym9av13acp85w.xn--dth22121k; ; ; # ꦷ멹.⒛ +ꦷ󝵙멹。⒛󠨇; ꦷ󝵙멹.⒛󠨇; [P1, V5, V6]; xn--ym9av13acp85w.xn--dth22121k; ; ; # ꦷ멹.⒛ +ꦷ󝵙멹。20.󠨇; ꦷ󝵙멹.20.󠨇; [P1, V5, V6]; xn--ym9av13acp85w.20.xn--d846e; ; ; # ꦷ멹.20. +ꦷ󝵙멹。20.󠨇; ꦷ󝵙멹.20.󠨇; [P1, V5, V6]; xn--ym9av13acp85w.20.xn--d846e; ; ; # ꦷ멹.20. +xn--ym9av13acp85w.20.xn--d846e; ꦷ󝵙멹.20.󠨇; [V5, V6]; xn--ym9av13acp85w.20.xn--d846e; ; ; # ꦷ멹.20. +xn--ym9av13acp85w.xn--dth22121k; ꦷ󝵙멹.⒛󠨇; [V5, V6]; xn--ym9av13acp85w.xn--dth22121k; ; ; # ꦷ멹.⒛ +Ⴅ󲬹릖󠶚.ݷ𐹳⒊; ; [B4, B6, P1, V6]; xn--dnd2167fnet0io02g.xn--7pb000mwm4n; ; ; # Ⴅ릖.ݷ𐹳⒊ +Ⴅ󲬹릖󠶚.ݷ𐹳⒊; Ⴅ󲬹릖󠶚.ݷ𐹳⒊; [B4, B6, P1, V6]; xn--dnd2167fnet0io02g.xn--7pb000mwm4n; ; ; # Ⴅ릖.ݷ𐹳⒊ +Ⴅ󲬹릖󠶚.ݷ𐹳3.; ; [B4, B6, P1, V6]; xn--dnd2167fnet0io02g.xn--3-55c6803r.; ; ; # Ⴅ릖.ݷ𐹳3. +Ⴅ󲬹릖󠶚.ݷ𐹳3.; Ⴅ󲬹릖󠶚.ݷ𐹳3.; [B4, B6, P1, V6]; xn--dnd2167fnet0io02g.xn--3-55c6803r.; ; ; # Ⴅ릖.ݷ𐹳3. +ⴅ󲬹릖󠶚.ݷ𐹳3.; ⴅ󲬹릖󠶚.ݷ𐹳3.; [B4, B6, P1, V6]; xn--wkj8016bne45io02g.xn--3-55c6803r.; ; ; # ⴅ릖.ݷ𐹳3. +ⴅ󲬹릖󠶚.ݷ𐹳3.; ; [B4, B6, P1, V6]; xn--wkj8016bne45io02g.xn--3-55c6803r.; ; ; # ⴅ릖.ݷ𐹳3. +xn--wkj8016bne45io02g.xn--3-55c6803r.; ⴅ󲬹릖󠶚.ݷ𐹳3.; [B4, B6, V6]; xn--wkj8016bne45io02g.xn--3-55c6803r.; ; ; # ⴅ릖.ݷ𐹳3. +xn--dnd2167fnet0io02g.xn--3-55c6803r.; Ⴅ󲬹릖󠶚.ݷ𐹳3.; [B4, B6, V6]; xn--dnd2167fnet0io02g.xn--3-55c6803r.; ; ; # Ⴅ릖.ݷ𐹳3. +ⴅ󲬹릖󠶚.ݷ𐹳⒊; ⴅ󲬹릖󠶚.ݷ𐹳⒊; [B4, B6, P1, V6]; xn--wkj8016bne45io02g.xn--7pb000mwm4n; ; ; # ⴅ릖.ݷ𐹳⒊ +ⴅ󲬹릖󠶚.ݷ𐹳⒊; ; [B4, B6, P1, V6]; xn--wkj8016bne45io02g.xn--7pb000mwm4n; ; ; # ⴅ릖.ݷ𐹳⒊ +xn--wkj8016bne45io02g.xn--7pb000mwm4n; ⴅ󲬹릖󠶚.ݷ𐹳⒊; [B4, B6, V6]; xn--wkj8016bne45io02g.xn--7pb000mwm4n; ; ; # ⴅ릖.ݷ𐹳⒊ +xn--dnd2167fnet0io02g.xn--7pb000mwm4n; Ⴅ󲬹릖󠶚.ݷ𐹳⒊; [B4, B6, V6]; xn--dnd2167fnet0io02g.xn--7pb000mwm4n; ; ; # Ⴅ릖.ݷ𐹳⒊ +‌。︒; ‌.︒; [C1, P1, V6]; xn--0ug.xn--y86c; ; .xn--y86c; [P1, V6, A4_2] # .︒ +‌。。; ‌..; [C1, X4_2]; xn--0ug..; [C1, A4_2]; ..; [A4_2] # .. +..; ; [X4_2]; ; [A4_2]; ; # .. +xn--0ug..; ‌..; [C1, X4_2]; xn--0ug..; [C1, A4_2]; ; # .. +.xn--y86c; .︒; [V6, X4_2]; .xn--y86c; [V6, A4_2]; ; # .︒ +xn--0ug.xn--y86c; ‌.︒; [C1, V6]; xn--0ug.xn--y86c; ; ; # .︒ +≯ݭ.₄; ≯ݭ.4; [B1, P1, V6]; xn--xpb149k.4; ; ; # ≯ݭ.4 +≯ݭ.₄; ≯ݭ.4; [B1, P1, V6]; xn--xpb149k.4; ; ; # ≯ݭ.4 +≯ݭ.4; ; [B1, P1, V6]; xn--xpb149k.4; ; ; # ≯ݭ.4 +≯ݭ.4; ≯ݭ.4; [B1, P1, V6]; xn--xpb149k.4; ; ; # ≯ݭ.4 +xn--xpb149k.4; ≯ݭ.4; [B1, V6]; xn--xpb149k.4; ; ; # ≯ݭ.4 +ᡲ-𝟹.ß-‌-; ᡲ-3.ß-‌-; [C1, V3]; xn---3-p9o.xn-----fia9303a; ; xn---3-p9o.ss--; [V2, V3] # ᡲ-3.ß-- +ᡲ-3.ß-‌-; ; [C1, V3]; xn---3-p9o.xn-----fia9303a; ; xn---3-p9o.ss--; [V2, V3] # ᡲ-3.ß-- +ᡲ-3.SS-‌-; ᡲ-3.ss-‌-; [C1, V3]; xn---3-p9o.xn--ss---276a; ; xn---3-p9o.ss--; [V2, V3] # ᡲ-3.ss-- +ᡲ-3.ss-‌-; ; [C1, V3]; xn---3-p9o.xn--ss---276a; ; xn---3-p9o.ss--; [V2, V3] # ᡲ-3.ss-- +ᡲ-3.Ss-‌-; ᡲ-3.ss-‌-; [C1, V3]; xn---3-p9o.xn--ss---276a; ; xn---3-p9o.ss--; [V2, V3] # ᡲ-3.ss-- +xn---3-p9o.ss--; ᡲ-3.ss--; [V2, V3]; xn---3-p9o.ss--; ; ; # ᡲ-3.ss-- +xn---3-p9o.xn--ss---276a; ᡲ-3.ss-‌-; [C1, V3]; xn---3-p9o.xn--ss---276a; ; ; # ᡲ-3.ss-- +xn---3-p9o.xn-----fia9303a; ᡲ-3.ß-‌-; [C1, V3]; xn---3-p9o.xn-----fia9303a; ; ; # ᡲ-3.ß-- +ᡲ-𝟹.SS-‌-; ᡲ-3.ss-‌-; [C1, V3]; xn---3-p9o.xn--ss---276a; ; xn---3-p9o.ss--; [V2, V3] # ᡲ-3.ss-- +ᡲ-𝟹.ss-‌-; ᡲ-3.ss-‌-; [C1, V3]; xn---3-p9o.xn--ss---276a; ; xn---3-p9o.ss--; [V2, V3] # ᡲ-3.ss-- +ᡲ-𝟹.Ss-‌-; ᡲ-3.ss-‌-; [C1, V3]; xn---3-p9o.xn--ss---276a; ; xn---3-p9o.ss--; [V2, V3] # ᡲ-3.ss-- +ﴈ𝟦ه󎊯。Ӏ; ضي4ه󎊯.Ӏ; [B2, B3, P1, V6]; xn--4-tnc6ck183523b.xn--d5a; ; ; # ضي4ه.Ӏ +ضي4ه󎊯。Ӏ; ضي4ه󎊯.Ӏ; [B2, B3, P1, V6]; xn--4-tnc6ck183523b.xn--d5a; ; ; # ضي4ه.Ӏ +ضي4ه󎊯。ӏ; ضي4ه󎊯.ӏ; [B2, B3, P1, V6]; xn--4-tnc6ck183523b.xn--s5a; ; ; # ضي4ه.ӏ +xn--4-tnc6ck183523b.xn--s5a; ضي4ه󎊯.ӏ; [B2, B3, V6]; xn--4-tnc6ck183523b.xn--s5a; ; ; # ضي4ه.ӏ +xn--4-tnc6ck183523b.xn--d5a; ضي4ه󎊯.Ӏ; [B2, B3, V6]; xn--4-tnc6ck183523b.xn--d5a; ; ; # ضي4ه.Ӏ +ﴈ𝟦ه󎊯。ӏ; ضي4ه󎊯.ӏ; [B2, B3, P1, V6]; xn--4-tnc6ck183523b.xn--s5a; ; ; # ضي4ه.ӏ +-.؂آ𑆾🐹; ; [B1, P1, V3, V6]; -.xn--kfb8dy983hgl7g; ; ; # -.آ𑆾🐹 +-.؂آ𑆾🐹; -.؂آ𑆾🐹; [B1, P1, V3, V6]; -.xn--kfb8dy983hgl7g; ; ; # -.آ𑆾🐹 +-.xn--kfb8dy983hgl7g; -.؂آ𑆾🐹; [B1, V3, V6]; -.xn--kfb8dy983hgl7g; ; ; # -.آ𑆾🐹 +󙶜ᢘ。᩿⺢; 󙶜ᢘ.᩿⺢; [P1, V5, V6]; xn--ibf35138o.xn--fpfz94g; ; ; # ᢘ.᩿⺢ +xn--ibf35138o.xn--fpfz94g; 󙶜ᢘ.᩿⺢; [V5, V6]; xn--ibf35138o.xn--fpfz94g; ; ; # ᢘ.᩿⺢ +≠ႷᠤႫ。?͌س觴; ≠ႷᠤႫ.?͌س觴; [B1, B5, P1, V6]; xn--jndx718cnnl.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠ႷᠤႫ.͌س觴 +≠ႷᠤႫ。?͌س觴; ≠ႷᠤႫ.?͌س觴; [B1, B5, P1, V6]; xn--jndx718cnnl.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠ႷᠤႫ.͌س觴 +≠ႷᠤႫ。?͌س觴; ≠ႷᠤႫ.?͌س觴; [B1, B5, P1, V6]; xn--jndx718cnnl.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠ႷᠤႫ.͌س觴 +≠ႷᠤႫ。?͌س觴; ≠ႷᠤႫ.?͌س觴; [B1, B5, P1, V6]; xn--jndx718cnnl.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠ႷᠤႫ.͌س觴 +≠ⴗᠤⴋ。?͌س觴; ≠ⴗᠤⴋ.?͌س觴; [B1, B5, P1, V6]; xn--66e353ce0ilb.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠ⴗᠤⴋ.͌س觴 +≠ⴗᠤⴋ。?͌س觴; ≠ⴗᠤⴋ.?͌س觴; [B1, B5, P1, V6]; xn--66e353ce0ilb.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠ⴗᠤⴋ.͌س觴 +≠Ⴗᠤⴋ。?͌س觴; ≠Ⴗᠤⴋ.?͌س觴; [B1, B5, P1, V6]; xn--vnd619as6ig6k.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠Ⴗᠤⴋ.͌س觴 +≠Ⴗᠤⴋ。?͌س觴; ≠Ⴗᠤⴋ.?͌س觴; [B1, B5, P1, V6]; xn--vnd619as6ig6k.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠Ⴗᠤⴋ.͌س觴 +xn--vnd619as6ig6k.?͌س觴; ≠Ⴗᠤⴋ.?͌س觴; [B1, B5, P1, V6]; xn--vnd619as6ig6k.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠Ⴗᠤⴋ.͌س觴 +XN--VND619AS6IG6K.?͌س觴; ≠Ⴗᠤⴋ.?͌س觴; [B1, B5, P1, V6]; xn--vnd619as6ig6k.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠Ⴗᠤⴋ.͌س觴 +Xn--Vnd619as6ig6k.?͌س觴; ≠Ⴗᠤⴋ.?͌س觴; [B1, B5, P1, V6]; xn--vnd619as6ig6k.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠Ⴗᠤⴋ.͌س觴 +xn--66e353ce0ilb.?͌س觴; ≠ⴗᠤⴋ.?͌س觴; [B1, B5, P1, V6]; xn--66e353ce0ilb.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠ⴗᠤⴋ.͌س觴 +XN--66E353CE0ILB.?͌س觴; ≠ⴗᠤⴋ.?͌س觴; [B1, B5, P1, V6]; xn--66e353ce0ilb.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠ⴗᠤⴋ.͌س觴 +Xn--66e353ce0ilb.?͌س觴; ≠ⴗᠤⴋ.?͌س觴; [B1, B5, P1, V6]; xn--66e353ce0ilb.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠ⴗᠤⴋ.͌س觴 +xn--jndx718cnnl.?͌س觴; ≠ႷᠤႫ.?͌س觴; [B1, B5, P1, V6]; xn--jndx718cnnl.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠ႷᠤႫ.͌س觴 +XN--JNDX718CNNL.?͌س觴; ≠ႷᠤႫ.?͌س觴; [B1, B5, P1, V6]; xn--jndx718cnnl.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠ႷᠤႫ.͌س觴 +Xn--Jndx718cnnl.?͌س觴; ≠ႷᠤႫ.?͌س觴; [B1, B5, P1, V6]; xn--jndx718cnnl.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠ႷᠤႫ.͌س觴 +≠ⴗᠤⴋ。?͌س觴; ≠ⴗᠤⴋ.?͌س觴; [B1, B5, P1, V6]; xn--66e353ce0ilb.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠ⴗᠤⴋ.͌س觴 +≠ⴗᠤⴋ。?͌س觴; ≠ⴗᠤⴋ.?͌س觴; [B1, B5, P1, V6]; xn--66e353ce0ilb.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠ⴗᠤⴋ.͌س觴 +≠Ⴗᠤⴋ。?͌س觴; ≠Ⴗᠤⴋ.?͌س觴; [B1, B5, P1, V6]; xn--vnd619as6ig6k.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠Ⴗᠤⴋ.͌س觴 +≠Ⴗᠤⴋ。?͌س觴; ≠Ⴗᠤⴋ.?͌س觴; [B1, B5, P1, V6]; xn--vnd619as6ig6k.?͌س觴; [B1, B5, P1, V6, A3]; ; # ≠Ⴗᠤⴋ.͌س觴 +٧.𐥨; ; [B1, P1, V6]; xn--gib.xn--vm9c; ; ; # ٧. +xn--gib.xn--vm9c; ٧.𐥨; [B1, V6]; xn--gib.xn--vm9c; ; ; # ٧. +꧀𝟯。‍񼑥𐹪᯳; ꧀3.‍񼑥𐹪᯳; [B1, C2, P1, V5, V6]; xn--3-5z4e.xn--1zf96ony8ygd68c; ; xn--3-5z4e.xn--1zfz754hncv8b; [B5, P1, V5, V6] # ꧀3.𐹪᯳ +꧀3。‍񼑥𐹪᯳; ꧀3.‍񼑥𐹪᯳; [B1, C2, P1, V5, V6]; xn--3-5z4e.xn--1zf96ony8ygd68c; ; xn--3-5z4e.xn--1zfz754hncv8b; [B5, P1, V5, V6] # ꧀3.𐹪᯳ +xn--3-5z4e.xn--1zfz754hncv8b; ꧀3.񼑥𐹪᯳; [B5, V5, V6]; xn--3-5z4e.xn--1zfz754hncv8b; ; ; # ꧀3.𐹪᯳ +xn--3-5z4e.xn--1zf96ony8ygd68c; ꧀3.‍񼑥𐹪᯳; [B1, C2, V5, V6]; xn--3-5z4e.xn--1zf96ony8ygd68c; ; ; # ꧀3.𐹪᯳ +򣕄4񠖽.≯٤𑀾󠸌; ; [B1, P1, V6]; xn--4-fg85dl688i.xn--dib174li86ntdy0i; ; ; # 4.≯٤𑀾 +򣕄4񠖽.≯٤𑀾󠸌; 򣕄4񠖽.≯٤𑀾󠸌; [B1, P1, V6]; xn--4-fg85dl688i.xn--dib174li86ntdy0i; ; ; # 4.≯٤𑀾 +xn--4-fg85dl688i.xn--dib174li86ntdy0i; 򣕄4񠖽.≯٤𑀾󠸌; [B1, V6]; xn--4-fg85dl688i.xn--dib174li86ntdy0i; ; ; # 4.≯٤𑀾 +򗆧𝟯。⒈᩶𝟚򠘌; 򗆧3.⒈᩶2򠘌; [P1, V6]; xn--3-rj42h.xn--2-13k746cq465x; ; ; # 3.⒈᩶2 +򗆧3。1.᩶2򠘌; 򗆧3.1.᩶2򠘌; [P1, V5, V6]; xn--3-rj42h.1.xn--2-13k96240l; ; ; # 3.1.᩶2 +xn--3-rj42h.1.xn--2-13k96240l; 򗆧3.1.᩶2򠘌; [V5, V6]; xn--3-rj42h.1.xn--2-13k96240l; ; ; # 3.1.᩶2 +xn--3-rj42h.xn--2-13k746cq465x; 򗆧3.⒈᩶2򠘌; [V6]; xn--3-rj42h.xn--2-13k746cq465x; ; ; # 3.⒈᩶2 +‍₅⒈。≯𝟴‍; ‍5⒈.≯8‍; [C2, P1, V6]; xn--5-tgnz5r.xn--8-ugn00i; ; xn--5-ecp.xn--8-ogo; [P1, V6] # 5⒈.≯8 +‍₅⒈。≯𝟴‍; ‍5⒈.≯8‍; [C2, P1, V6]; xn--5-tgnz5r.xn--8-ugn00i; ; xn--5-ecp.xn--8-ogo; [P1, V6] # 5⒈.≯8 +‍51.。≯8‍; ‍51..≯8‍; [C2, P1, V6, X4_2]; xn--51-l1t..xn--8-ugn00i; [C2, P1, V6, A4_2]; 51..xn--8-ogo; [P1, V6, A4_2] # 51..≯8 +‍51.。≯8‍; ‍51..≯8‍; [C2, P1, V6, X4_2]; xn--51-l1t..xn--8-ugn00i; [C2, P1, V6, A4_2]; 51..xn--8-ogo; [P1, V6, A4_2] # 51..≯8 +51..xn--8-ogo; 51..≯8; [V6, X4_2]; 51..xn--8-ogo; [V6, A4_2]; ; # 51..≯8 +xn--51-l1t..xn--8-ugn00i; ‍51..≯8‍; [C2, V6, X4_2]; xn--51-l1t..xn--8-ugn00i; [C2, V6, A4_2]; ; # 51..≯8 +xn--5-ecp.xn--8-ogo; 5⒈.≯8; [V6]; xn--5-ecp.xn--8-ogo; ; ; # 5⒈.≯8 +xn--5-tgnz5r.xn--8-ugn00i; ‍5⒈.≯8‍; [C2, V6]; xn--5-tgnz5r.xn--8-ugn00i; ; ; # 5⒈.≯8 +ꡰڗႆ.򪘙ܯ≠‌; ꡰڗႆ.򪘙ܯ≠‌; [B5, B6, C1, P1, V6]; xn--tjb002cn51k.xn--5nb448jcubcz547b; ; xn--tjb002cn51k.xn--5nb630lbj91q; [B5, B6, P1, V6] # ꡰڗႆ.ܯ≠ +ꡰڗႆ.򪘙ܯ≠‌; ꡰڗႆ.򪘙ܯ≠‌; [B5, B6, C1, P1, V6]; xn--tjb002cn51k.xn--5nb448jcubcz547b; ; xn--tjb002cn51k.xn--5nb630lbj91q; [B5, B6, P1, V6] # ꡰڗႆ.ܯ≠ +ꡰڗႆ.򪘙ܯ≠‌; ; [B5, B6, C1, P1, V6]; xn--tjb002cn51k.xn--5nb448jcubcz547b; ; xn--tjb002cn51k.xn--5nb630lbj91q; [B5, B6, P1, V6] # ꡰڗႆ.ܯ≠ +ꡰڗႆ.򪘙ܯ≠‌; ꡰڗႆ.򪘙ܯ≠‌; [B5, B6, C1, P1, V6]; xn--tjb002cn51k.xn--5nb448jcubcz547b; ; xn--tjb002cn51k.xn--5nb630lbj91q; [B5, B6, P1, V6] # ꡰڗႆ.ܯ≠ +xn--tjb002cn51k.xn--5nb630lbj91q; ꡰڗႆ.򪘙ܯ≠; [B5, B6, V6]; xn--tjb002cn51k.xn--5nb630lbj91q; ; ; # ꡰڗႆ.ܯ≠ +xn--tjb002cn51k.xn--5nb448jcubcz547b; ꡰڗႆ.򪘙ܯ≠‌; [B5, B6, C1, V6]; xn--tjb002cn51k.xn--5nb448jcubcz547b; ; ; # ꡰڗႆ.ܯ≠ +𑄱。򪌿𐹵; 𑄱.򪌿𐹵; [B1, B3, B5, B6, P1, V5, V6]; xn--t80d.xn--to0d14792b; ; ; # 𑄱.𐹵 +𑄱。򪌿𐹵; 𑄱.򪌿𐹵; [B1, B3, B5, B6, P1, V5, V6]; xn--t80d.xn--to0d14792b; ; ; # 𑄱.𐹵 +xn--t80d.xn--to0d14792b; 𑄱.򪌿𐹵; [B1, B3, B5, B6, V5, V6]; xn--t80d.xn--to0d14792b; ; ; # 𑄱.𐹵 +𝟥؀。ܽ; 3؀.ܽ; [B1, B3, B6, P1, V5, V6]; xn--3-rkc.xn--kob; ; ; # 3.ܽ +3؀。ܽ; 3؀.ܽ; [B1, B3, B6, P1, V5, V6]; xn--3-rkc.xn--kob; ; ; # 3.ܽ +xn--3-rkc.xn--kob; 3؀.ܽ; [B1, B3, B6, V5, V6]; xn--3-rkc.xn--kob; ; ; # 3.ܽ +ط𐹣٦.ݭ긷; ; [B2, B3]; xn--2gb8gu829f.xn--xpb0156f; ; ; # ط𐹣٦.ݭ긷 +ط𐹣٦.ݭ긷; ط𐹣٦.ݭ긷; [B2, B3]; xn--2gb8gu829f.xn--xpb0156f; ; ; # ط𐹣٦.ݭ긷 +xn--2gb8gu829f.xn--xpb0156f; ط𐹣٦.ݭ긷; [B2, B3]; xn--2gb8gu829f.xn--xpb0156f; ; ; # ط𐹣٦.ݭ긷 +︒Ↄⷧ򾀃.Ⴗ𐣞; ︒Ↄⷧ򾀃.Ⴗ𐣞; [B1, B5, B6, P1, V6]; xn--q5g000c056n0226g.xn--vnd8618j; ; ; # ︒Ↄⷧ.Ⴗ +。Ↄⷧ򾀃.Ⴗ𐣞; .Ↄⷧ򾀃.Ⴗ𐣞; [B5, B6, P1, V6, X4_2]; .xn--q5g000cll06u.xn--vnd8618j; [B5, B6, P1, V6, A4_2]; ; # .Ↄⷧ.Ⴗ +。ↄⷧ򾀃.ⴗ𐣞; .ↄⷧ򾀃.ⴗ𐣞; [B5, B6, P1, V6, X4_2]; .xn--r5gy00cll06u.xn--flj4541e; [B5, B6, P1, V6, A4_2]; ; # .ↄⷧ.ⴗ +.xn--r5gy00cll06u.xn--flj4541e; .ↄⷧ򾀃.ⴗ𐣞; [B5, B6, V6, X4_2]; .xn--r5gy00cll06u.xn--flj4541e; [B5, B6, V6, A4_2]; ; # .ↄⷧ.ⴗ +.xn--q5g000cll06u.xn--vnd8618j; .Ↄⷧ򾀃.Ⴗ𐣞; [B5, B6, V6, X4_2]; .xn--q5g000cll06u.xn--vnd8618j; [B5, B6, V6, A4_2]; ; # .Ↄⷧ.Ⴗ +︒ↄⷧ򾀃.ⴗ𐣞; ︒ↄⷧ򾀃.ⴗ𐣞; [B1, B5, B6, P1, V6]; xn--r5gy00c056n0226g.xn--flj4541e; ; ; # ︒ↄⷧ.ⴗ +xn--r5gy00c056n0226g.xn--flj4541e; ︒ↄⷧ򾀃.ⴗ𐣞; [B1, B5, B6, V6]; xn--r5gy00c056n0226g.xn--flj4541e; ; ; # ︒ↄⷧ.ⴗ +xn--q5g000c056n0226g.xn--vnd8618j; ︒Ↄⷧ򾀃.Ⴗ𐣞; [B1, B5, B6, V6]; xn--q5g000c056n0226g.xn--vnd8618j; ; ; # ︒Ↄⷧ.Ⴗ +؀.ֱ; ; [B1, B3, B6, P1, V5, V6]; xn--ifb.xn--8cb; ; ; # .ֱ +xn--ifb.xn--8cb; ؀.ֱ; [B1, B3, B6, V5, V6]; xn--ifb.xn--8cb; ; ; # .ֱ +ς≯。𐹽; ς≯.𐹽; [B1, B6, P1, V6]; xn--3xa028m.xn--1o0d; ; xn--4xa818m.xn--1o0d; # ς≯.𐹽 +ς≯。𐹽; ς≯.𐹽; [B1, B6, P1, V6]; xn--3xa028m.xn--1o0d; ; xn--4xa818m.xn--1o0d; # ς≯.𐹽 +ς≯。𐹽; ς≯.𐹽; [B1, B6, P1, V6]; xn--3xa028m.xn--1o0d; ; xn--4xa818m.xn--1o0d; # ς≯.𐹽 +ς≯。𐹽; ς≯.𐹽; [B1, B6, P1, V6]; xn--3xa028m.xn--1o0d; ; xn--4xa818m.xn--1o0d; # ς≯.𐹽 +Σ≯。𐹽; σ≯.𐹽; [B1, B6, P1, V6]; xn--4xa818m.xn--1o0d; ; ; # σ≯.𐹽 +Σ≯。𐹽; σ≯.𐹽; [B1, B6, P1, V6]; xn--4xa818m.xn--1o0d; ; ; # σ≯.𐹽 +σ≯。𐹽; σ≯.𐹽; [B1, B6, P1, V6]; xn--4xa818m.xn--1o0d; ; ; # σ≯.𐹽 +σ≯。𐹽; σ≯.𐹽; [B1, B6, P1, V6]; xn--4xa818m.xn--1o0d; ; ; # σ≯.𐹽 +xn--4xa818m.xn--1o0d; σ≯.𐹽; [B1, B6, V6]; xn--4xa818m.xn--1o0d; ; ; # σ≯.𐹽 +xn--3xa028m.xn--1o0d; ς≯.𐹽; [B1, B6, V6]; xn--3xa028m.xn--1o0d; ; ; # ς≯.𐹽 +Σ≯。𐹽; σ≯.𐹽; [B1, B6, P1, V6]; xn--4xa818m.xn--1o0d; ; ; # σ≯.𐹽 +Σ≯。𐹽; σ≯.𐹽; [B1, B6, P1, V6]; xn--4xa818m.xn--1o0d; ; ; # σ≯.𐹽 +σ≯。𐹽; σ≯.𐹽; [B1, B6, P1, V6]; xn--4xa818m.xn--1o0d; ; ; # σ≯.𐹽 +σ≯。𐹽; σ≯.𐹽; [B1, B6, P1, V6]; xn--4xa818m.xn--1o0d; ; ; # σ≯.𐹽 +្‍ݟ。𐹶; ្‍ݟ.𐹶; [B1, V5]; xn--jpb535fv9f.xn--uo0d; ; xn--jpb535f.xn--uo0d; # ្ݟ.𐹶 +xn--jpb535f.xn--uo0d; ្ݟ.𐹶; [B1, V5]; xn--jpb535f.xn--uo0d; ; ; # ្ݟ.𐹶 +xn--jpb535fv9f.xn--uo0d; ្‍ݟ.𐹶; [B1, V5]; xn--jpb535fv9f.xn--uo0d; ; ; # ្ݟ.𐹶 +𾷂ੂႪ񂂟.≮; ; [P1, V6]; xn--nbc493aro75ggskb.xn--gdh; ; ; # ੂႪ.≮ +𾷂ੂႪ񂂟.≮; 𾷂ੂႪ񂂟.≮; [P1, V6]; xn--nbc493aro75ggskb.xn--gdh; ; ; # ੂႪ.≮ +𾷂ੂⴊ񂂟.≮; 𾷂ੂⴊ񂂟.≮; [P1, V6]; xn--nbc229o4y27dgskb.xn--gdh; ; ; # ੂⴊ.≮ +𾷂ੂⴊ񂂟.≮; ; [P1, V6]; xn--nbc229o4y27dgskb.xn--gdh; ; ; # ੂⴊ.≮ +xn--nbc229o4y27dgskb.xn--gdh; 𾷂ੂⴊ񂂟.≮; [V6]; xn--nbc229o4y27dgskb.xn--gdh; ; ; # ੂⴊ.≮ +xn--nbc493aro75ggskb.xn--gdh; 𾷂ੂႪ񂂟.≮; [V6]; xn--nbc493aro75ggskb.xn--gdh; ; ; # ੂႪ.≮ +ꡠ.۲; ꡠ.۲; ; xn--5c9a.xn--fmb; ; ; # ꡠ.۲ +ꡠ.۲; ; ; xn--5c9a.xn--fmb; ; ; # ꡠ.۲ +xn--5c9a.xn--fmb; ꡠ.۲; ; xn--5c9a.xn--fmb; ; ; # ꡠ.۲ +𐹣񄷄。ꡬ🄄; 𐹣񄷄.ꡬ🄄; [B1, P1, V6]; xn--bo0d0203l.xn--id9a4443d; ; ; # 𐹣.ꡬ🄄 +𐹣񄷄。ꡬ3,; 𐹣񄷄.ꡬ3,; [B1, B6, P1, V6]; xn--bo0d0203l.xn--3,-yj9h; ; ; # 𐹣.ꡬ3, +xn--bo0d0203l.xn--3,-yj9h; 𐹣񄷄.ꡬ3,; [B1, B6, P1, V6]; xn--bo0d0203l.xn--3,-yj9h; ; ; # 𐹣.ꡬ3, +xn--bo0d0203l.xn--id9a4443d; 𐹣񄷄.ꡬ🄄; [B1, V6]; xn--bo0d0203l.xn--id9a4443d; ; ; # 𐹣.ꡬ🄄 +-్𞾀𑲓。‍്; -్𞾀𑲓.‍്; [B1, C2, P1, V3, V6]; xn----x6e0220sclug.xn--wxc317g; ; xn----x6e0220sclug.xn--wxc; [B1, B3, B6, P1, V3, V5, V6] # -్𑲓.് +-్𞾀𑲓。‍്; -్𞾀𑲓.‍്; [B1, C2, P1, V3, V6]; xn----x6e0220sclug.xn--wxc317g; ; xn----x6e0220sclug.xn--wxc; [B1, B3, B6, P1, V3, V5, V6] # -్𑲓.് +xn----x6e0220sclug.xn--wxc; -్𞾀𑲓.്; [B1, B3, B6, V3, V5, V6]; xn----x6e0220sclug.xn--wxc; ; ; # -్𑲓.് +xn----x6e0220sclug.xn--wxc317g; -్𞾀𑲓.‍്; [B1, C2, V3, V6]; xn----x6e0220sclug.xn--wxc317g; ; ; # -్𑲓.് +꙽‌霣🄆。‌𑁂ᬁ; ꙽‌霣🄆.‌𑁂ᬁ; [C1, P1, V5, V6]; xn--0ug4208b2vjuk63a.xn--4sf36u6u4w; ; xn--2q5a751a653w.xn--4sf0725i; [P1, V5, V6] # ꙽霣🄆.𑁂ᬁ +꙽‌霣🄆。‌𑁂ᬁ; ꙽‌霣🄆.‌𑁂ᬁ; [C1, P1, V5, V6]; xn--0ug4208b2vjuk63a.xn--4sf36u6u4w; ; xn--2q5a751a653w.xn--4sf0725i; [P1, V5, V6] # ꙽霣🄆.𑁂ᬁ +꙽‌霣5,。‌𑁂ᬁ; ꙽‌霣5,.‌𑁂ᬁ; [C1, P1, V5, V6]; xn--5,-i1tz135dnbqa.xn--4sf36u6u4w; ; xn--5,-op8g373c.xn--4sf0725i; [P1, V5, V6] # ꙽霣5,.𑁂ᬁ +xn--5,-op8g373c.xn--4sf0725i; ꙽霣5,.𑁂ᬁ; [P1, V5, V6]; xn--5,-op8g373c.xn--4sf0725i; ; ; # ꙽霣5,.𑁂ᬁ +xn--5,-i1tz135dnbqa.xn--4sf36u6u4w; ꙽‌霣5,.‌𑁂ᬁ; [C1, P1, V5, V6]; xn--5,-i1tz135dnbqa.xn--4sf36u6u4w; ; ; # ꙽霣5,.𑁂ᬁ +xn--2q5a751a653w.xn--4sf0725i; ꙽霣🄆.𑁂ᬁ; [V5, V6]; xn--2q5a751a653w.xn--4sf0725i; ; ; # ꙽霣🄆.𑁂ᬁ +xn--0ug4208b2vjuk63a.xn--4sf36u6u4w; ꙽‌霣🄆.‌𑁂ᬁ; [C1, V5, V6]; xn--0ug4208b2vjuk63a.xn--4sf36u6u4w; ; ; # ꙽霣🄆.𑁂ᬁ +兎。ᠼ󠴜𑚶𑰿; 兎.ᠼ󠴜𑚶𑰿; [P1, V6]; xn--b5q.xn--v7e6041kqqd4m251b; ; ; # 兎.ᠼ𑚶𑰿 +兎。ᠼ󠴜𑚶𑰿; 兎.ᠼ󠴜𑚶𑰿; [P1, V6]; xn--b5q.xn--v7e6041kqqd4m251b; ; ; # 兎.ᠼ𑚶𑰿 +xn--b5q.xn--v7e6041kqqd4m251b; 兎.ᠼ󠴜𑚶𑰿; [V6]; xn--b5q.xn--v7e6041kqqd4m251b; ; ; # 兎.ᠼ𑚶𑰿 +𝟙。‍𝟸‍⁷; 1.‍2‍7; [C2]; 1.xn--27-l1tb; ; 1.27; [] # 1.27 +1。‍2‍7; 1.‍2‍7; [C2]; 1.xn--27-l1tb; ; 1.27; [] # 1.27 +1.27; ; ; ; ; ; # 1.27 +1.xn--27-l1tb; 1.‍2‍7; [C2]; 1.xn--27-l1tb; ; ; # 1.27 +ᡨ-。󠻋𝟷; ᡨ-.󠻋1; [P1, V3, V6]; xn----z8j.xn--1-5671m; ; ; # ᡨ-.1 +ᡨ-。󠻋1; ᡨ-.󠻋1; [P1, V3, V6]; xn----z8j.xn--1-5671m; ; ; # ᡨ-.1 +xn----z8j.xn--1-5671m; ᡨ-.󠻋1; [V3, V6]; xn----z8j.xn--1-5671m; ; ; # ᡨ-.1 +𑰻񵀐𐫚.٨⁹; 𑰻񵀐𐫚.٨9; [B1, P1, V5, V6]; xn--gx9cr01aul57i.xn--9-oqc; ; ; # 𑰻𐫚.٨9 +𑰻񵀐𐫚.٨9; ; [B1, P1, V5, V6]; xn--gx9cr01aul57i.xn--9-oqc; ; ; # 𑰻𐫚.٨9 +xn--gx9cr01aul57i.xn--9-oqc; 𑰻񵀐𐫚.٨9; [B1, V5, V6]; xn--gx9cr01aul57i.xn--9-oqc; ; ; # 𑰻𐫚.٨9 +Ⴜ򈷭ྀ⾇。Ⴏ♀‌‌; Ⴜ򈷭ྀ舛.Ⴏ♀‌‌; [C1, P1, V6]; xn--zed54dz10wo343g.xn--nnd089ea464d; ; xn--zed54dz10wo343g.xn--nnd651i; [P1, V6] # Ⴜྀ舛.Ⴏ♀ +Ⴜ򈷭ྀ舛。Ⴏ♀‌‌; Ⴜ򈷭ྀ舛.Ⴏ♀‌‌; [C1, P1, V6]; xn--zed54dz10wo343g.xn--nnd089ea464d; ; xn--zed54dz10wo343g.xn--nnd651i; [P1, V6] # Ⴜྀ舛.Ⴏ♀ +ⴜ򈷭ྀ舛。ⴏ♀‌‌; ⴜ򈷭ྀ舛.ⴏ♀‌‌; [C1, P1, V6]; xn--zed372mdj2do3v4h.xn--0uga678bgyh; ; xn--zed372mdj2do3v4h.xn--e5h11w; [P1, V6] # ⴜྀ舛.ⴏ♀ +xn--zed372mdj2do3v4h.xn--e5h11w; ⴜ򈷭ྀ舛.ⴏ♀; [V6]; xn--zed372mdj2do3v4h.xn--e5h11w; ; ; # ⴜྀ舛.ⴏ♀ +xn--zed372mdj2do3v4h.xn--0uga678bgyh; ⴜ򈷭ྀ舛.ⴏ♀‌‌; [C1, V6]; xn--zed372mdj2do3v4h.xn--0uga678bgyh; ; ; # ⴜྀ舛.ⴏ♀ +xn--zed54dz10wo343g.xn--nnd651i; Ⴜ򈷭ྀ舛.Ⴏ♀; [V6]; xn--zed54dz10wo343g.xn--nnd651i; ; ; # Ⴜྀ舛.Ⴏ♀ +xn--zed54dz10wo343g.xn--nnd089ea464d; Ⴜ򈷭ྀ舛.Ⴏ♀‌‌; [C1, V6]; xn--zed54dz10wo343g.xn--nnd089ea464d; ; ; # Ⴜྀ舛.Ⴏ♀ +ⴜ򈷭ྀ⾇。ⴏ♀‌‌; ⴜ򈷭ྀ舛.ⴏ♀‌‌; [C1, P1, V6]; xn--zed372mdj2do3v4h.xn--0uga678bgyh; ; xn--zed372mdj2do3v4h.xn--e5h11w; [P1, V6] # ⴜྀ舛.ⴏ♀ +𑁆𝟰.‍; 𑁆4.‍; [C2, V5]; xn--4-xu7i.xn--1ug; ; xn--4-xu7i.; [V5] # 𑁆4. +𑁆4.‍; ; [C2, V5]; xn--4-xu7i.xn--1ug; ; xn--4-xu7i.; [V5] # 𑁆4. +xn--4-xu7i.; 𑁆4.; [V5]; xn--4-xu7i.; ; ; # 𑁆4. +xn--4-xu7i.xn--1ug; 𑁆4.‍; [C2, V5]; xn--4-xu7i.xn--1ug; ; ; # 𑁆4. +񮴘Ⴞ癀。𑘿‍‌붼; 񮴘Ⴞ癀.𑘿‍‌붼; [C1, P1, V5, V6]; xn--2nd6803c7q37d.xn--0ugb6122js83c; ; xn--2nd6803c7q37d.xn--et3bn23n; [P1, V5, V6] # Ⴞ癀.𑘿붼 +񮴘Ⴞ癀。𑘿‍‌붼; 񮴘Ⴞ癀.𑘿‍‌붼; [C1, P1, V5, V6]; xn--2nd6803c7q37d.xn--0ugb6122js83c; ; xn--2nd6803c7q37d.xn--et3bn23n; [P1, V5, V6] # Ⴞ癀.𑘿붼 +񮴘Ⴞ癀。𑘿‍‌붼; 񮴘Ⴞ癀.𑘿‍‌붼; [C1, P1, V5, V6]; xn--2nd6803c7q37d.xn--0ugb6122js83c; ; xn--2nd6803c7q37d.xn--et3bn23n; [P1, V5, V6] # Ⴞ癀.𑘿붼 +񮴘Ⴞ癀。𑘿‍‌붼; 񮴘Ⴞ癀.𑘿‍‌붼; [C1, P1, V5, V6]; xn--2nd6803c7q37d.xn--0ugb6122js83c; ; xn--2nd6803c7q37d.xn--et3bn23n; [P1, V5, V6] # Ⴞ癀.𑘿붼 +񮴘ⴞ癀。𑘿‍‌붼; 񮴘ⴞ癀.𑘿‍‌붼; [C1, P1, V5, V6]; xn--mlju35u7qx2f.xn--0ugb6122js83c; ; xn--mlju35u7qx2f.xn--et3bn23n; [P1, V5, V6] # ⴞ癀.𑘿붼 +񮴘ⴞ癀。𑘿‍‌붼; 񮴘ⴞ癀.𑘿‍‌붼; [C1, P1, V5, V6]; xn--mlju35u7qx2f.xn--0ugb6122js83c; ; xn--mlju35u7qx2f.xn--et3bn23n; [P1, V5, V6] # ⴞ癀.𑘿붼 +xn--mlju35u7qx2f.xn--et3bn23n; 񮴘ⴞ癀.𑘿붼; [V5, V6]; xn--mlju35u7qx2f.xn--et3bn23n; ; ; # ⴞ癀.𑘿붼 +xn--mlju35u7qx2f.xn--0ugb6122js83c; 񮴘ⴞ癀.𑘿‍‌붼; [C1, V5, V6]; xn--mlju35u7qx2f.xn--0ugb6122js83c; ; ; # ⴞ癀.𑘿붼 +xn--2nd6803c7q37d.xn--et3bn23n; 񮴘Ⴞ癀.𑘿붼; [V5, V6]; xn--2nd6803c7q37d.xn--et3bn23n; ; ; # Ⴞ癀.𑘿붼 +xn--2nd6803c7q37d.xn--0ugb6122js83c; 񮴘Ⴞ癀.𑘿‍‌붼; [C1, V5, V6]; xn--2nd6803c7q37d.xn--0ugb6122js83c; ; ; # Ⴞ癀.𑘿붼 +񮴘ⴞ癀。𑘿‍‌붼; 񮴘ⴞ癀.𑘿‍‌붼; [C1, P1, V5, V6]; xn--mlju35u7qx2f.xn--0ugb6122js83c; ; xn--mlju35u7qx2f.xn--et3bn23n; [P1, V5, V6] # ⴞ癀.𑘿붼 +񮴘ⴞ癀。𑘿‍‌붼; 񮴘ⴞ癀.𑘿‍‌붼; [C1, P1, V5, V6]; xn--mlju35u7qx2f.xn--0ugb6122js83c; ; xn--mlju35u7qx2f.xn--et3bn23n; [P1, V5, V6] # ⴞ癀.𑘿붼 +󚀅-்。ڹ; 󚀅-்.ڹ; [B6, P1, V6]; xn----mze84808x.xn--skb; ; ; # -்.ڹ +xn----mze84808x.xn--skb; 󚀅-்.ڹ; [B6, V6]; xn----mze84808x.xn--skb; ; ; # -்.ڹ +ᡃ𝟧≯ᠣ.氁񨏱ꁫ; ᡃ5≯ᠣ.氁񨏱ꁫ; [P1, V6]; xn--5-24jyf768b.xn--lqw213ime95g; ; ; # ᡃ5≯ᠣ.氁ꁫ +ᡃ𝟧≯ᠣ.氁񨏱ꁫ; ᡃ5≯ᠣ.氁񨏱ꁫ; [P1, V6]; xn--5-24jyf768b.xn--lqw213ime95g; ; ; # ᡃ5≯ᠣ.氁ꁫ +ᡃ5≯ᠣ.氁񨏱ꁫ; ; [P1, V6]; xn--5-24jyf768b.xn--lqw213ime95g; ; ; # ᡃ5≯ᠣ.氁ꁫ +ᡃ5≯ᠣ.氁񨏱ꁫ; ᡃ5≯ᠣ.氁񨏱ꁫ; [P1, V6]; xn--5-24jyf768b.xn--lqw213ime95g; ; ; # ᡃ5≯ᠣ.氁ꁫ +xn--5-24jyf768b.xn--lqw213ime95g; ᡃ5≯ᠣ.氁񨏱ꁫ; [V6]; xn--5-24jyf768b.xn--lqw213ime95g; ; ; # ᡃ5≯ᠣ.氁ꁫ +𐹬𝩇.ྲྀ; 𐹬𝩇.ྲྀ; [B1, B3, B6, V5]; xn--ko0d8295a.xn--zed3h; ; ; # 𐹬𝩇.ྲྀ +𐹬𝩇.ྲྀ; 𐹬𝩇.ྲྀ; [B1, B3, B6, V5]; xn--ko0d8295a.xn--zed3h; ; ; # 𐹬𝩇.ྲྀ +𐹬𝩇.ྲྀ; ; [B1, B3, B6, V5]; xn--ko0d8295a.xn--zed3h; ; ; # 𐹬𝩇.ྲྀ +xn--ko0d8295a.xn--zed3h; 𐹬𝩇.ྲྀ; [B1, B3, B6, V5]; xn--ko0d8295a.xn--zed3h; ; ; # 𐹬𝩇.ྲྀ +-𑈶⒏.⒎𰛢󠎭; -𑈶⒏.⒎𰛢󠎭; [P1, V3, V6]; xn----scp6252h.xn--zshy411yzpx2d; ; ; # -𑈶⒏.⒎𰛢 +-𑈶8..7.𰛢󠎭; ; [P1, V3, V6, X4_2]; xn---8-bv5o..7.xn--c35nf1622b; [P1, V3, V6, A4_2]; ; # -𑈶8..7.𰛢 +xn---8-bv5o..7.xn--c35nf1622b; -𑈶8..7.𰛢󠎭; [V3, V6, X4_2]; xn---8-bv5o..7.xn--c35nf1622b; [V3, V6, A4_2]; ; # -𑈶8..7.𰛢 +xn----scp6252h.xn--zshy411yzpx2d; -𑈶⒏.⒎𰛢󠎭; [V3, V6]; xn----scp6252h.xn--zshy411yzpx2d; ; ; # -𑈶⒏.⒎𰛢 +‌Ⴁ畝‍.≮; ‌Ⴁ畝‍.≮; [C1, C2, P1, V6]; xn--8md700fea3748f.xn--gdh; ; xn--8md0962c.xn--gdh; [P1, V6] # Ⴁ畝.≮ +‌Ⴁ畝‍.≮; ‌Ⴁ畝‍.≮; [C1, C2, P1, V6]; xn--8md700fea3748f.xn--gdh; ; xn--8md0962c.xn--gdh; [P1, V6] # Ⴁ畝.≮ +‌Ⴁ畝‍.≮; ; [C1, C2, P1, V6]; xn--8md700fea3748f.xn--gdh; ; xn--8md0962c.xn--gdh; [P1, V6] # Ⴁ畝.≮ +‌Ⴁ畝‍.≮; ‌Ⴁ畝‍.≮; [C1, C2, P1, V6]; xn--8md700fea3748f.xn--gdh; ; xn--8md0962c.xn--gdh; [P1, V6] # Ⴁ畝.≮ +‌ⴁ畝‍.≮; ‌ⴁ畝‍.≮; [C1, C2, P1, V6]; xn--0ugc160hb36e.xn--gdh; ; xn--skjy82u.xn--gdh; [P1, V6] # ⴁ畝.≮ +‌ⴁ畝‍.≮; ; [C1, C2, P1, V6]; xn--0ugc160hb36e.xn--gdh; ; xn--skjy82u.xn--gdh; [P1, V6] # ⴁ畝.≮ +xn--skjy82u.xn--gdh; ⴁ畝.≮; [V6]; xn--skjy82u.xn--gdh; ; ; # ⴁ畝.≮ +xn--0ugc160hb36e.xn--gdh; ‌ⴁ畝‍.≮; [C1, C2, V6]; xn--0ugc160hb36e.xn--gdh; ; ; # ⴁ畝.≮ +xn--8md0962c.xn--gdh; Ⴁ畝.≮; [V6]; xn--8md0962c.xn--gdh; ; ; # Ⴁ畝.≮ +xn--8md700fea3748f.xn--gdh; ‌Ⴁ畝‍.≮; [C1, C2, V6]; xn--8md700fea3748f.xn--gdh; ; ; # Ⴁ畝.≮ +‌ⴁ畝‍.≮; ‌ⴁ畝‍.≮; [C1, C2, P1, V6]; xn--0ugc160hb36e.xn--gdh; ; xn--skjy82u.xn--gdh; [P1, V6] # ⴁ畝.≮ +‌ⴁ畝‍.≮; ‌ⴁ畝‍.≮; [C1, C2, P1, V6]; xn--0ugc160hb36e.xn--gdh; ; xn--skjy82u.xn--gdh; [P1, V6] # ⴁ畝.≮ +歷。𐹻≯󳛽‍; 歷.𐹻≯󳛽‍; [B1, C2, P1, V6]; xn--nmw.xn--1ugx6gs128a1134j; ; xn--nmw.xn--hdh7804gdms2h; [B1, P1, V6] # 歷.𐹻≯ +歷。𐹻≯󳛽‍; 歷.𐹻≯󳛽‍; [B1, C2, P1, V6]; xn--nmw.xn--1ugx6gs128a1134j; ; xn--nmw.xn--hdh7804gdms2h; [B1, P1, V6] # 歷.𐹻≯ +歷。𐹻≯󳛽‍; 歷.𐹻≯󳛽‍; [B1, C2, P1, V6]; xn--nmw.xn--1ugx6gs128a1134j; ; xn--nmw.xn--hdh7804gdms2h; [B1, P1, V6] # 歷.𐹻≯ +歷。𐹻≯󳛽‍; 歷.𐹻≯󳛽‍; [B1, C2, P1, V6]; xn--nmw.xn--1ugx6gs128a1134j; ; xn--nmw.xn--hdh7804gdms2h; [B1, P1, V6] # 歷.𐹻≯ +xn--nmw.xn--hdh7804gdms2h; 歷.𐹻≯󳛽; [B1, V6]; xn--nmw.xn--hdh7804gdms2h; ; ; # 歷.𐹻≯ +xn--nmw.xn--1ugx6gs128a1134j; 歷.𐹻≯󳛽‍; [B1, C2, V6]; xn--nmw.xn--1ugx6gs128a1134j; ; ; # 歷.𐹻≯ +໋‍.鎁󠰑; ໋‍.鎁󠰑; [C2, P1, V5, V6]; xn--t8c059f.xn--iz4a43209d; ; xn--t8c.xn--iz4a43209d; [P1, V5, V6] # ໋.鎁 +໋‍.鎁󠰑; ; [C2, P1, V5, V6]; xn--t8c059f.xn--iz4a43209d; ; xn--t8c.xn--iz4a43209d; [P1, V5, V6] # ໋.鎁 +xn--t8c.xn--iz4a43209d; ໋.鎁󠰑; [V5, V6]; xn--t8c.xn--iz4a43209d; ; ; # ໋.鎁 +xn--t8c059f.xn--iz4a43209d; ໋‍.鎁󠰑; [C2, V5, V6]; xn--t8c059f.xn--iz4a43209d; ; ; # ໋.鎁 +‍‌𞤀。𱘅𐶃; ‍‌𞤢.𱘅𐶃; [B1, B5, B6, C1, C2, P1, V6]; xn--0ugb45126a.xn--wh0dj799f; ; xn--9d6h.xn--wh0dj799f; [B5, B6, P1, V6] # 𞤢. +‍‌𞤀。𱘅𐶃; ‍‌𞤢.𱘅𐶃; [B1, B5, B6, C1, C2, P1, V6]; xn--0ugb45126a.xn--wh0dj799f; ; xn--9d6h.xn--wh0dj799f; [B5, B6, P1, V6] # 𞤢. +‍‌𞤢。𱘅𐶃; ‍‌𞤢.𱘅𐶃; [B1, B5, B6, C1, C2, P1, V6]; xn--0ugb45126a.xn--wh0dj799f; ; xn--9d6h.xn--wh0dj799f; [B5, B6, P1, V6] # 𞤢. +xn--9d6h.xn--wh0dj799f; 𞤢.𱘅𐶃; [B5, B6, V6]; xn--9d6h.xn--wh0dj799f; ; ; # 𞤢. +xn--0ugb45126a.xn--wh0dj799f; ‍‌𞤢.𱘅𐶃; [B1, B5, B6, C1, C2, V6]; xn--0ugb45126a.xn--wh0dj799f; ; ; # 𞤢. +‍‌𞤢。𱘅𐶃; ‍‌𞤢.𱘅𐶃; [B1, B5, B6, C1, C2, P1, V6]; xn--0ugb45126a.xn--wh0dj799f; ; xn--9d6h.xn--wh0dj799f; [B5, B6, P1, V6] # 𞤢. +ب≠𝟫-.ς⒍𐹦≠; ب≠9-.ς⒍𐹦≠; [B3, B5, B6, P1, V3, V6]; xn--9--etd0100a.xn--3xa097mzpbzz04b; ; xn--9--etd0100a.xn--4xa887mzpbzz04b; # ب≠9-.ς⒍𐹦≠ +ب≠𝟫-.ς⒍𐹦≠; ب≠9-.ς⒍𐹦≠; [B3, B5, B6, P1, V3, V6]; xn--9--etd0100a.xn--3xa097mzpbzz04b; ; xn--9--etd0100a.xn--4xa887mzpbzz04b; # ب≠9-.ς⒍𐹦≠ +ب≠9-.ς6.𐹦≠; ; [B1, B3, P1, V3, V6]; xn--9--etd0100a.xn--6-xmb.xn--1ch8704g; ; xn--9--etd0100a.xn--6-zmb.xn--1ch8704g; # ب≠9-.ς6.𐹦≠ +ب≠9-.ς6.𐹦≠; ب≠9-.ς6.𐹦≠; [B1, B3, P1, V3, V6]; xn--9--etd0100a.xn--6-xmb.xn--1ch8704g; ; xn--9--etd0100a.xn--6-zmb.xn--1ch8704g; # ب≠9-.ς6.𐹦≠ +ب≠9-.Σ6.𐹦≠; ب≠9-.σ6.𐹦≠; [B1, B3, P1, V3, V6]; xn--9--etd0100a.xn--6-zmb.xn--1ch8704g; ; ; # ب≠9-.σ6.𐹦≠ +ب≠9-.Σ6.𐹦≠; ب≠9-.σ6.𐹦≠; [B1, B3, P1, V3, V6]; xn--9--etd0100a.xn--6-zmb.xn--1ch8704g; ; ; # ب≠9-.σ6.𐹦≠ +ب≠9-.σ6.𐹦≠; ; [B1, B3, P1, V3, V6]; xn--9--etd0100a.xn--6-zmb.xn--1ch8704g; ; ; # ب≠9-.σ6.𐹦≠ +ب≠9-.σ6.𐹦≠; ب≠9-.σ6.𐹦≠; [B1, B3, P1, V3, V6]; xn--9--etd0100a.xn--6-zmb.xn--1ch8704g; ; ; # ب≠9-.σ6.𐹦≠ +xn--9--etd0100a.xn--6-zmb.xn--1ch8704g; ب≠9-.σ6.𐹦≠; [B1, B3, V3, V6]; xn--9--etd0100a.xn--6-zmb.xn--1ch8704g; ; ; # ب≠9-.σ6.𐹦≠ +xn--9--etd0100a.xn--6-xmb.xn--1ch8704g; ب≠9-.ς6.𐹦≠; [B1, B3, V3, V6]; xn--9--etd0100a.xn--6-xmb.xn--1ch8704g; ; ; # ب≠9-.ς6.𐹦≠ +ب≠𝟫-.Σ⒍𐹦≠; ب≠9-.σ⒍𐹦≠; [B3, B5, B6, P1, V3, V6]; xn--9--etd0100a.xn--4xa887mzpbzz04b; ; ; # ب≠9-.σ⒍𐹦≠ +ب≠𝟫-.Σ⒍𐹦≠; ب≠9-.σ⒍𐹦≠; [B3, B5, B6, P1, V3, V6]; xn--9--etd0100a.xn--4xa887mzpbzz04b; ; ; # ب≠9-.σ⒍𐹦≠ +ب≠𝟫-.σ⒍𐹦≠; ب≠9-.σ⒍𐹦≠; [B3, B5, B6, P1, V3, V6]; xn--9--etd0100a.xn--4xa887mzpbzz04b; ; ; # ب≠9-.σ⒍𐹦≠ +ب≠𝟫-.σ⒍𐹦≠; ب≠9-.σ⒍𐹦≠; [B3, B5, B6, P1, V3, V6]; xn--9--etd0100a.xn--4xa887mzpbzz04b; ; ; # ب≠9-.σ⒍𐹦≠ +xn--9--etd0100a.xn--4xa887mzpbzz04b; ب≠9-.σ⒍𐹦≠; [B3, B5, B6, V3, V6]; xn--9--etd0100a.xn--4xa887mzpbzz04b; ; ; # ب≠9-.σ⒍𐹦≠ +xn--9--etd0100a.xn--3xa097mzpbzz04b; ب≠9-.ς⒍𐹦≠; [B3, B5, B6, V3, V6]; xn--9--etd0100a.xn--3xa097mzpbzz04b; ; ; # ب≠9-.ς⒍𐹦≠ +򉛴.-ᡢ֒𝨠; ; [P1, V3, V6]; xn--ep37b.xn----hec165lho83b; ; ; # .-ᡢ֒𝨠 +xn--ep37b.xn----hec165lho83b; 򉛴.-ᡢ֒𝨠; [V3, V6]; xn--ep37b.xn----hec165lho83b; ; ; # .-ᡢ֒𝨠 +ۋ⒈ß󠄽。񷋍-; ۋ⒈ß.񷋍-; [B2, B3, B6, P1, V3, V6]; xn--zca541ato3a.xn----q001f; ; xn--ss-d7d6651a.xn----q001f; # ۋ⒈ß.- +ۋ1.ß󠄽。񷋍-; ۋ1.ß.񷋍-; [B6, P1, V3, V6]; xn--1-cwc.xn--zca.xn----q001f; ; xn--1-cwc.ss.xn----q001f; # ۋ1.ß.- +ۋ1.SS󠄽。񷋍-; ۋ1.ss.񷋍-; [B6, P1, V3, V6]; xn--1-cwc.ss.xn----q001f; ; ; # ۋ1.ss.- +ۋ1.ss󠄽。񷋍-; ۋ1.ss.񷋍-; [B6, P1, V3, V6]; xn--1-cwc.ss.xn----q001f; ; ; # ۋ1.ss.- +ۋ1.Ss󠄽。񷋍-; ۋ1.ss.񷋍-; [B6, P1, V3, V6]; xn--1-cwc.ss.xn----q001f; ; ; # ۋ1.ss.- +xn--1-cwc.ss.xn----q001f; ۋ1.ss.񷋍-; [B6, V3, V6]; xn--1-cwc.ss.xn----q001f; ; ; # ۋ1.ss.- +xn--1-cwc.xn--zca.xn----q001f; ۋ1.ß.񷋍-; [B6, V3, V6]; xn--1-cwc.xn--zca.xn----q001f; ; ; # ۋ1.ß.- +ۋ⒈SS󠄽。񷋍-; ۋ⒈ss.񷋍-; [B2, B3, B6, P1, V3, V6]; xn--ss-d7d6651a.xn----q001f; ; ; # ۋ⒈ss.- +ۋ⒈ss󠄽。񷋍-; ۋ⒈ss.񷋍-; [B2, B3, B6, P1, V3, V6]; xn--ss-d7d6651a.xn----q001f; ; ; # ۋ⒈ss.- +ۋ⒈Ss󠄽。񷋍-; ۋ⒈ss.񷋍-; [B2, B3, B6, P1, V3, V6]; xn--ss-d7d6651a.xn----q001f; ; ; # ۋ⒈ss.- +xn--ss-d7d6651a.xn----q001f; ۋ⒈ss.񷋍-; [B2, B3, B6, V3, V6]; xn--ss-d7d6651a.xn----q001f; ; ; # ۋ⒈ss.- +xn--zca541ato3a.xn----q001f; ۋ⒈ß.񷋍-; [B2, B3, B6, V3, V6]; xn--zca541ato3a.xn----q001f; ; ; # ۋ⒈ß.- +𿀫.᮪ςႦ‍; 𿀫.᮪ςႦ‍; [C2, P1, V5, V6]; xn--nu4s.xn--3xa417dxriome; ; xn--nu4s.xn--4xa217dxri; [P1, V5, V6] # .᮪ςႦ +𿀫.᮪ςႦ‍; ; [C2, P1, V5, V6]; xn--nu4s.xn--3xa417dxriome; ; xn--nu4s.xn--4xa217dxri; [P1, V5, V6] # .᮪ςႦ +𿀫.᮪ςⴆ‍; ; [C2, P1, V5, V6]; xn--nu4s.xn--3xa353jk8cs1q; ; xn--nu4s.xn--4xa153j7im; [P1, V5, V6] # .᮪ςⴆ +𿀫.᮪ΣႦ‍; 𿀫.᮪σႦ‍; [C2, P1, V5, V6]; xn--nu4s.xn--4xa217dxriome; ; xn--nu4s.xn--4xa217dxri; [P1, V5, V6] # .᮪σႦ +𿀫.᮪σⴆ‍; ; [C2, P1, V5, V6]; xn--nu4s.xn--4xa153jk8cs1q; ; xn--nu4s.xn--4xa153j7im; [P1, V5, V6] # .᮪σⴆ +𿀫.᮪Σⴆ‍; 𿀫.᮪σⴆ‍; [C2, P1, V5, V6]; xn--nu4s.xn--4xa153jk8cs1q; ; xn--nu4s.xn--4xa153j7im; [P1, V5, V6] # .᮪σⴆ +xn--nu4s.xn--4xa153j7im; 𿀫.᮪σⴆ; [V5, V6]; xn--nu4s.xn--4xa153j7im; ; ; # .᮪σⴆ +xn--nu4s.xn--4xa153jk8cs1q; 𿀫.᮪σⴆ‍; [C2, V5, V6]; xn--nu4s.xn--4xa153jk8cs1q; ; ; # .᮪σⴆ +xn--nu4s.xn--4xa217dxri; 𿀫.᮪σႦ; [V5, V6]; xn--nu4s.xn--4xa217dxri; ; ; # .᮪σႦ +xn--nu4s.xn--4xa217dxriome; 𿀫.᮪σႦ‍; [C2, V5, V6]; xn--nu4s.xn--4xa217dxriome; ; ; # .᮪σႦ +xn--nu4s.xn--3xa353jk8cs1q; 𿀫.᮪ςⴆ‍; [C2, V5, V6]; xn--nu4s.xn--3xa353jk8cs1q; ; ; # .᮪ςⴆ +xn--nu4s.xn--3xa417dxriome; 𿀫.᮪ςႦ‍; [C2, V5, V6]; xn--nu4s.xn--3xa417dxriome; ; ; # .᮪ςႦ +𿀫.᮪ςⴆ‍; 𿀫.᮪ςⴆ‍; [C2, P1, V5, V6]; xn--nu4s.xn--3xa353jk8cs1q; ; xn--nu4s.xn--4xa153j7im; [P1, V5, V6] # .᮪ςⴆ +𿀫.᮪ΣႦ‍; 𿀫.᮪σႦ‍; [C2, P1, V5, V6]; xn--nu4s.xn--4xa217dxriome; ; xn--nu4s.xn--4xa217dxri; [P1, V5, V6] # .᮪σႦ +𿀫.᮪σⴆ‍; 𿀫.᮪σⴆ‍; [C2, P1, V5, V6]; xn--nu4s.xn--4xa153jk8cs1q; ; xn--nu4s.xn--4xa153j7im; [P1, V5, V6] # .᮪σⴆ +𿀫.᮪Σⴆ‍; 𿀫.᮪σⴆ‍; [C2, P1, V5, V6]; xn--nu4s.xn--4xa153jk8cs1q; ; xn--nu4s.xn--4xa153j7im; [P1, V5, V6] # .᮪σⴆ +⾆࣢.𝈴; 舌࣢.𝈴; [B1, B5, B6, P1, V6]; xn--l0b9413d.xn--kl1h; ; ; # 舌.𝈴 +舌࣢.𝈴; ; [B1, B5, B6, P1, V6]; xn--l0b9413d.xn--kl1h; ; ; # 舌.𝈴 +xn--l0b9413d.xn--kl1h; 舌࣢.𝈴; [B1, B5, B6, V6]; xn--l0b9413d.xn--kl1h; ; ; # 舌.𝈴 +⫞𐹶𖫴。⭠⒈; ⫞𐹶𖫴.⭠⒈; [B1, P1, V6]; xn--53ix188et88b.xn--tsh52w; ; ; # ⫞𐹶𖫴.⭠⒈ +⫞𐹶𖫴。⭠1.; ⫞𐹶𖫴.⭠1.; [B1]; xn--53ix188et88b.xn--1-h6r.; ; ; # ⫞𐹶𖫴.⭠1. +xn--53ix188et88b.xn--1-h6r.; ⫞𐹶𖫴.⭠1.; [B1]; xn--53ix188et88b.xn--1-h6r.; ; ; # ⫞𐹶𖫴.⭠1. +xn--53ix188et88b.xn--tsh52w; ⫞𐹶𖫴.⭠⒈; [B1, V6]; xn--53ix188et88b.xn--tsh52w; ; ; # ⫞𐹶𖫴.⭠⒈ +⒈‌ꫬ︒.્; ⒈‌ꫬ︒.્; [C1, P1, V5, V6]; xn--0ug78o720myr1c.xn--mfc; ; xn--tsh0720cse8b.xn--mfc; [P1, V5, V6] # ⒈ꫬ︒.્ +1.‌ꫬ。.્; 1.‌ꫬ..્; [C1, V5, X4_2]; 1.xn--0ug7185c..xn--mfc; [C1, V5, A4_2]; 1.xn--sv9a..xn--mfc; [V5, A4_2] # 1.ꫬ..્ +1.xn--sv9a..xn--mfc; 1.ꫬ..્; [V5, X4_2]; 1.xn--sv9a..xn--mfc; [V5, A4_2]; ; # 1.ꫬ..્ +1.xn--0ug7185c..xn--mfc; 1.‌ꫬ..્; [C1, V5, X4_2]; 1.xn--0ug7185c..xn--mfc; [C1, V5, A4_2]; ; # 1.ꫬ..્ +xn--tsh0720cse8b.xn--mfc; ⒈ꫬ︒.્; [V5, V6]; xn--tsh0720cse8b.xn--mfc; ; ; # ⒈ꫬ︒.્ +xn--0ug78o720myr1c.xn--mfc; ⒈‌ꫬ︒.્; [C1, V5, V6]; xn--0ug78o720myr1c.xn--mfc; ; ; # ⒈ꫬ︒.્ +ె。䰀٨𞭅󠅼; ె.䰀٨𞭅; [B1, B3, B5, B6, P1, V5, V6]; xn--eqc.xn--hib5476aim6t; ; ; # ె.䰀٨ +xn--eqc.xn--hib5476aim6t; ె.䰀٨𞭅; [B1, B3, B5, B6, V5, V6]; xn--eqc.xn--hib5476aim6t; ; ; # ె.䰀٨ +ß‍.᯲񄾼; ; [C2, P1, V5, V6]; xn--zca870n.xn--0zf22107b; ; ss.xn--0zf22107b; [P1, V5, V6] # ß.᯲ +SS‍.᯲񄾼; ss‍.᯲񄾼; [C2, P1, V5, V6]; xn--ss-n1t.xn--0zf22107b; ; ss.xn--0zf22107b; [P1, V5, V6] # ss.᯲ +ss‍.᯲񄾼; ; [C2, P1, V5, V6]; xn--ss-n1t.xn--0zf22107b; ; ss.xn--0zf22107b; [P1, V5, V6] # ss.᯲ +Ss‍.᯲񄾼; ss‍.᯲񄾼; [C2, P1, V5, V6]; xn--ss-n1t.xn--0zf22107b; ; ss.xn--0zf22107b; [P1, V5, V6] # ss.᯲ +ss.xn--0zf22107b; ss.᯲񄾼; [V5, V6]; ss.xn--0zf22107b; ; ; # ss.᯲ +xn--ss-n1t.xn--0zf22107b; ss‍.᯲񄾼; [C2, V5, V6]; xn--ss-n1t.xn--0zf22107b; ; ; # ss.᯲ +xn--zca870n.xn--0zf22107b; ß‍.᯲񄾼; [C2, V5, V6]; xn--zca870n.xn--0zf22107b; ; ; # ß.᯲ +𑓂‌≮.≮; ; [P1, V5, V6]; xn--0ugy6glz29a.xn--gdh; ; xn--gdhz656g.xn--gdh; # 𑓂≮.≮ +𑓂‌≮.≮; 𑓂‌≮.≮; [P1, V5, V6]; xn--0ugy6glz29a.xn--gdh; ; xn--gdhz656g.xn--gdh; # 𑓂≮.≮ +xn--gdhz656g.xn--gdh; 𑓂≮.≮; [V5, V6]; xn--gdhz656g.xn--gdh; ; ; # 𑓂≮.≮ +xn--0ugy6glz29a.xn--gdh; 𑓂‌≮.≮; [V5, V6]; xn--0ugy6glz29a.xn--gdh; ; ; # 𑓂≮.≮ +🕼.ᅠ; 🕼.ᅠ; [P1, V6]; xn--my8h.xn--cl7c; ; ; # 🕼. +🕼.ᅠ; ; [P1, V6]; xn--my8h.xn--psd; ; ; # 🕼. +xn--my8h.xn--psd; 🕼.ᅠ; [V6]; xn--my8h.xn--psd; ; ; # 🕼. +xn--my8h.xn--cl7c; 🕼.ᅠ; [V6]; xn--my8h.xn--cl7c; ; ; # 🕼. +ᡔﶂ。񷘎; ᡔلحى.񷘎; [B5, B6, P1, V6]; xn--sgb9bq785p.xn--bc31b; ; ; # ᡔلحى. +ᡔلحى。񷘎; ᡔلحى.񷘎; [B5, B6, P1, V6]; xn--sgb9bq785p.xn--bc31b; ; ; # ᡔلحى. +xn--sgb9bq785p.xn--bc31b; ᡔلحى.񷘎; [B5, B6, V6]; xn--sgb9bq785p.xn--bc31b; ; ; # ᡔلحى. +爕򳙑.𝟰気; 爕򳙑.4気; [P1, V6]; xn--1zxq3199c.xn--4-678b; ; ; # 爕.4気 +爕򳙑.4気; ; [P1, V6]; xn--1zxq3199c.xn--4-678b; ; ; # 爕.4気 +xn--1zxq3199c.xn--4-678b; 爕򳙑.4気; [V6]; xn--1zxq3199c.xn--4-678b; ; ; # 爕.4気 +⒋𑍍Ⴝ-.𞬪්ֵ; ⒋𑍍Ⴝ-.𞬪්ֵ; [B1, P1, V3, V6]; xn----t1g323mnk9t.xn--ddb152b7y23b; ; ; # ⒋𑍍Ⴝ-.්ֵ +4.𑍍Ⴝ-.𞬪්ֵ; ; [B1, B6, P1, V3, V5, V6]; 4.xn----t1g9869q.xn--ddb152b7y23b; ; ; # 4.𑍍Ⴝ-.්ֵ +4.𑍍ⴝ-.𞬪්ֵ; ; [B1, B6, P1, V3, V5, V6]; 4.xn----wwsx259f.xn--ddb152b7y23b; ; ; # 4.𑍍ⴝ-.්ֵ +4.xn----wwsx259f.xn--ddb152b7y23b; 4.𑍍ⴝ-.𞬪්ֵ; [B1, B6, V3, V5, V6]; 4.xn----wwsx259f.xn--ddb152b7y23b; ; ; # 4.𑍍ⴝ-.්ֵ +4.xn----t1g9869q.xn--ddb152b7y23b; 4.𑍍Ⴝ-.𞬪්ֵ; [B1, B6, V3, V5, V6]; 4.xn----t1g9869q.xn--ddb152b7y23b; ; ; # 4.𑍍Ⴝ-.්ֵ +⒋𑍍ⴝ-.𞬪්ֵ; ⒋𑍍ⴝ-.𞬪්ֵ; [B1, P1, V3, V6]; xn----jcp487avl3w.xn--ddb152b7y23b; ; ; # ⒋𑍍ⴝ-.්ֵ +xn----jcp487avl3w.xn--ddb152b7y23b; ⒋𑍍ⴝ-.𞬪්ֵ; [B1, V3, V6]; xn----jcp487avl3w.xn--ddb152b7y23b; ; ; # ⒋𑍍ⴝ-.්ֵ +xn----t1g323mnk9t.xn--ddb152b7y23b; ⒋𑍍Ⴝ-.𞬪්ֵ; [B1, V3, V6]; xn----t1g323mnk9t.xn--ddb152b7y23b; ; ; # ⒋𑍍Ⴝ-.්ֵ +󞝃。򑆃񉢗--; 󞝃.򑆃񉢗--; [P1, V2, V3, V6]; xn--2y75e.xn-----1l15eer88n; ; ; # .-- +xn--2y75e.xn-----1l15eer88n; 󞝃.򑆃񉢗--; [V2, V3, V6]; xn--2y75e.xn-----1l15eer88n; ; ; # .-- +‍ߟ。‌꯭; ‍ߟ.‌꯭; [B1, C1, C2]; xn--6sb394j.xn--0ug1126c; ; xn--6sb.xn--429a; [B1, B3, B6, V5] # ߟ.꯭ +‍ߟ。‌꯭; ‍ߟ.‌꯭; [B1, C1, C2]; xn--6sb394j.xn--0ug1126c; ; xn--6sb.xn--429a; [B1, B3, B6, V5] # ߟ.꯭ +xn--6sb.xn--429a; ߟ.꯭; [B1, B3, B6, V5]; xn--6sb.xn--429a; ; ; # ߟ.꯭ +xn--6sb394j.xn--0ug1126c; ‍ߟ.‌꯭; [B1, C1, C2]; xn--6sb394j.xn--0ug1126c; ; ; # ߟ.꯭ +𞮽߿ࡎ。ᢍ򝹁𐫘; 𞮽߿ࡎ.ᢍ򝹁𐫘; [B5, B6, P1, V6]; xn--3tb2nz468k.xn--69e8615j5rn5d; ; ; # ߿ࡎ.ᢍ𐫘 +𞮽߿ࡎ。ᢍ򝹁𐫘; 𞮽߿ࡎ.ᢍ򝹁𐫘; [B5, B6, P1, V6]; xn--3tb2nz468k.xn--69e8615j5rn5d; ; ; # ߿ࡎ.ᢍ𐫘 +xn--3tb2nz468k.xn--69e8615j5rn5d; 𞮽߿ࡎ.ᢍ򝹁𐫘; [B5, B6, V6]; xn--3tb2nz468k.xn--69e8615j5rn5d; ; ; # ߿ࡎ.ᢍ𐫘 +ۭ𞺌𑄚᜔.ꡞࢷ; ۭم𑄚᜔.ꡞࢷ; [B1, B5, B6, V5]; xn--hhb94ag41b739u.xn--dzb5582f; ; ; # ۭم𑄚᜔.ꡞࢷ +ۭم𑄚᜔.ꡞࢷ; ; [B1, B5, B6, V5]; xn--hhb94ag41b739u.xn--dzb5582f; ; ; # ۭم𑄚᜔.ꡞࢷ +xn--hhb94ag41b739u.xn--dzb5582f; ۭم𑄚᜔.ꡞࢷ; [B1, B5, B6, V5]; xn--hhb94ag41b739u.xn--dzb5582f; ; ; # ۭم𑄚᜔.ꡞࢷ +񻂵킃𑘶ߜ。ςؼς; 񻂵킃𑘶ߜ.ςؼς; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--3xaa51q; ; xn--3sb7483hoyvbbe76g.xn--4xaa21q; # 킃𑘶ߜ.ςؼς +񻂵킃𑘶ߜ。ςؼς; 񻂵킃𑘶ߜ.ςؼς; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--3xaa51q; ; xn--3sb7483hoyvbbe76g.xn--4xaa21q; # 킃𑘶ߜ.ςؼς +񻂵킃𑘶ߜ。ςؼς; 񻂵킃𑘶ߜ.ςؼς; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--3xaa51q; ; xn--3sb7483hoyvbbe76g.xn--4xaa21q; # 킃𑘶ߜ.ςؼς +񻂵킃𑘶ߜ。ςؼς; 񻂵킃𑘶ߜ.ςؼς; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--3xaa51q; ; xn--3sb7483hoyvbbe76g.xn--4xaa21q; # 킃𑘶ߜ.ςؼς +񻂵킃𑘶ߜ。ΣؼΣ; 񻂵킃𑘶ߜ.σؼσ; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--4xaa21q; ; ; # 킃𑘶ߜ.σؼσ +񻂵킃𑘶ߜ。ΣؼΣ; 񻂵킃𑘶ߜ.σؼσ; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--4xaa21q; ; ; # 킃𑘶ߜ.σؼσ +񻂵킃𑘶ߜ。σؼσ; 񻂵킃𑘶ߜ.σؼσ; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--4xaa21q; ; ; # 킃𑘶ߜ.σؼσ +񻂵킃𑘶ߜ。σؼσ; 񻂵킃𑘶ߜ.σؼσ; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--4xaa21q; ; ; # 킃𑘶ߜ.σؼσ +񻂵킃𑘶ߜ。Σؼσ; 񻂵킃𑘶ߜ.σؼσ; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--4xaa21q; ; ; # 킃𑘶ߜ.σؼσ +񻂵킃𑘶ߜ。Σؼσ; 񻂵킃𑘶ߜ.σؼσ; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--4xaa21q; ; ; # 킃𑘶ߜ.σؼσ +xn--3sb7483hoyvbbe76g.xn--4xaa21q; 񻂵킃𑘶ߜ.σؼσ; [B5, B6, V6]; xn--3sb7483hoyvbbe76g.xn--4xaa21q; ; ; # 킃𑘶ߜ.σؼσ +񻂵킃𑘶ߜ。Σؼς; 񻂵킃𑘶ߜ.σؼς; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--3xab31q; ; xn--3sb7483hoyvbbe76g.xn--4xaa21q; # 킃𑘶ߜ.σؼς +񻂵킃𑘶ߜ。Σؼς; 񻂵킃𑘶ߜ.σؼς; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--3xab31q; ; xn--3sb7483hoyvbbe76g.xn--4xaa21q; # 킃𑘶ߜ.σؼς +񻂵킃𑘶ߜ。σؼς; 񻂵킃𑘶ߜ.σؼς; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--3xab31q; ; xn--3sb7483hoyvbbe76g.xn--4xaa21q; # 킃𑘶ߜ.σؼς +񻂵킃𑘶ߜ。σؼς; 񻂵킃𑘶ߜ.σؼς; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--3xab31q; ; xn--3sb7483hoyvbbe76g.xn--4xaa21q; # 킃𑘶ߜ.σؼς +xn--3sb7483hoyvbbe76g.xn--3xab31q; 񻂵킃𑘶ߜ.σؼς; [B5, B6, V6]; xn--3sb7483hoyvbbe76g.xn--3xab31q; ; ; # 킃𑘶ߜ.σؼς +xn--3sb7483hoyvbbe76g.xn--3xaa51q; 񻂵킃𑘶ߜ.ςؼς; [B5, B6, V6]; xn--3sb7483hoyvbbe76g.xn--3xaa51q; ; ; # 킃𑘶ߜ.ςؼς +񻂵킃𑘶ߜ。ΣؼΣ; 񻂵킃𑘶ߜ.σؼσ; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--4xaa21q; ; ; # 킃𑘶ߜ.σؼσ +񻂵킃𑘶ߜ。ΣؼΣ; 񻂵킃𑘶ߜ.σؼσ; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--4xaa21q; ; ; # 킃𑘶ߜ.σؼσ +񻂵킃𑘶ߜ。σؼσ; 񻂵킃𑘶ߜ.σؼσ; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--4xaa21q; ; ; # 킃𑘶ߜ.σؼσ +񻂵킃𑘶ߜ。σؼσ; 񻂵킃𑘶ߜ.σؼσ; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--4xaa21q; ; ; # 킃𑘶ߜ.σؼσ +񻂵킃𑘶ߜ。Σؼσ; 񻂵킃𑘶ߜ.σؼσ; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--4xaa21q; ; ; # 킃𑘶ߜ.σؼσ +񻂵킃𑘶ߜ。Σؼσ; 񻂵킃𑘶ߜ.σؼσ; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--4xaa21q; ; ; # 킃𑘶ߜ.σؼσ +񻂵킃𑘶ߜ。Σؼς; 񻂵킃𑘶ߜ.σؼς; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--3xab31q; ; xn--3sb7483hoyvbbe76g.xn--4xaa21q; # 킃𑘶ߜ.σؼς +񻂵킃𑘶ߜ。Σؼς; 񻂵킃𑘶ߜ.σؼς; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--3xab31q; ; xn--3sb7483hoyvbbe76g.xn--4xaa21q; # 킃𑘶ߜ.σؼς +񻂵킃𑘶ߜ。σؼς; 񻂵킃𑘶ߜ.σؼς; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--3xab31q; ; xn--3sb7483hoyvbbe76g.xn--4xaa21q; # 킃𑘶ߜ.σؼς +񻂵킃𑘶ߜ。σؼς; 񻂵킃𑘶ߜ.σؼς; [B5, B6, P1, V6]; xn--3sb7483hoyvbbe76g.xn--3xab31q; ; xn--3sb7483hoyvbbe76g.xn--4xaa21q; # 킃𑘶ߜ.σؼς +蔰。󠁹ࣝ-𑈵; 蔰.󠁹ࣝ-𑈵; [P1, V6]; xn--sz1a.xn----mrd9984r3dl0i; ; ; # 蔰.ࣝ-𑈵 +xn--sz1a.xn----mrd9984r3dl0i; 蔰.󠁹ࣝ-𑈵; [V6]; xn--sz1a.xn----mrd9984r3dl0i; ; ; # 蔰.ࣝ-𑈵 +ςჅ。ݚ; ςჅ.ݚ; [P1, V6]; xn--3xa677d.xn--epb; ; xn--4xa477d.xn--epb; # ςჅ.ݚ +ςⴥ。ݚ; ςⴥ.ݚ; ; xn--3xa403s.xn--epb; ; xn--4xa203s.xn--epb; # ςⴥ.ݚ +ΣჅ。ݚ; σჅ.ݚ; [P1, V6]; xn--4xa477d.xn--epb; ; ; # σჅ.ݚ +σⴥ。ݚ; σⴥ.ݚ; ; xn--4xa203s.xn--epb; ; ; # σⴥ.ݚ +Σⴥ。ݚ; σⴥ.ݚ; ; xn--4xa203s.xn--epb; ; ; # σⴥ.ݚ +xn--4xa203s.xn--epb; σⴥ.ݚ; ; xn--4xa203s.xn--epb; ; ; # σⴥ.ݚ +σⴥ.ݚ; ; ; xn--4xa203s.xn--epb; ; ; # σⴥ.ݚ +ΣჅ.ݚ; σჅ.ݚ; [P1, V6]; xn--4xa477d.xn--epb; ; ; # σჅ.ݚ +Σⴥ.ݚ; σⴥ.ݚ; ; xn--4xa203s.xn--epb; ; ; # σⴥ.ݚ +xn--4xa477d.xn--epb; σჅ.ݚ; [V6]; xn--4xa477d.xn--epb; ; ; # σჅ.ݚ +xn--3xa403s.xn--epb; ςⴥ.ݚ; ; xn--3xa403s.xn--epb; ; ; # ςⴥ.ݚ +ςⴥ.ݚ; ; ; xn--3xa403s.xn--epb; ; xn--4xa203s.xn--epb; # ςⴥ.ݚ +xn--3xa677d.xn--epb; ςჅ.ݚ; [V6]; xn--3xa677d.xn--epb; ; ; # ςჅ.ݚ +్Ⴉ𞰓.᭲; ్Ⴉ𞰓.᭲; [B1, B3, B6, P1, V5, V6]; xn--lqc64t7t26c.xn--dwf; ; ; # ్Ⴉ.᭲ +్Ⴉ𞰓.᭲; ; [B1, B3, B6, P1, V5, V6]; xn--lqc64t7t26c.xn--dwf; ; ; # ్Ⴉ.᭲ +్ⴉ𞰓.᭲; ; [B1, B3, B6, P1, V5, V6]; xn--lqc478nlr02a.xn--dwf; ; ; # ్ⴉ.᭲ +xn--lqc478nlr02a.xn--dwf; ్ⴉ𞰓.᭲; [B1, B3, B6, V5, V6]; xn--lqc478nlr02a.xn--dwf; ; ; # ్ⴉ.᭲ +xn--lqc64t7t26c.xn--dwf; ్Ⴉ𞰓.᭲; [B1, B3, B6, V5, V6]; xn--lqc64t7t26c.xn--dwf; ; ; # ్Ⴉ.᭲ +్ⴉ𞰓.᭲; ్ⴉ𞰓.᭲; [B1, B3, B6, P1, V5, V6]; xn--lqc478nlr02a.xn--dwf; ; ; # ్ⴉ.᭲ +⮷≮񎈴󠄟。𐠄; ⮷≮񎈴.𐠄; [B1, P1, V6]; xn--gdh877a3513h.xn--pc9c; ; ; # ⮷≮.𐠄 +⮷≮񎈴󠄟。𐠄; ⮷≮񎈴.𐠄; [B1, P1, V6]; xn--gdh877a3513h.xn--pc9c; ; ; # ⮷≮.𐠄 +xn--gdh877a3513h.xn--pc9c; ⮷≮񎈴.𐠄; [B1, V6]; xn--gdh877a3513h.xn--pc9c; ; ; # ⮷≮.𐠄 +ڼ。‍ẏ‌ᡤ; ڼ.‍ẏ‌ᡤ; [B1, C1, C2]; xn--vkb.xn--08e172ax6aca; ; xn--vkb.xn--08e172a; [] # ڼ.ẏᡤ +ڼ。‍ẏ‌ᡤ; ڼ.‍ẏ‌ᡤ; [B1, C1, C2]; xn--vkb.xn--08e172ax6aca; ; xn--vkb.xn--08e172a; [] # ڼ.ẏᡤ +ڼ。‍ẏ‌ᡤ; ڼ.‍ẏ‌ᡤ; [B1, C1, C2]; xn--vkb.xn--08e172ax6aca; ; xn--vkb.xn--08e172a; [] # ڼ.ẏᡤ +ڼ。‍ẏ‌ᡤ; ڼ.‍ẏ‌ᡤ; [B1, C1, C2]; xn--vkb.xn--08e172ax6aca; ; xn--vkb.xn--08e172a; [] # ڼ.ẏᡤ +ڼ。‍Ẏ‌ᡤ; ڼ.‍ẏ‌ᡤ; [B1, C1, C2]; xn--vkb.xn--08e172ax6aca; ; xn--vkb.xn--08e172a; [] # ڼ.ẏᡤ +ڼ。‍Ẏ‌ᡤ; ڼ.‍ẏ‌ᡤ; [B1, C1, C2]; xn--vkb.xn--08e172ax6aca; ; xn--vkb.xn--08e172a; [] # ڼ.ẏᡤ +xn--vkb.xn--08e172a; ڼ.ẏᡤ; ; xn--vkb.xn--08e172a; ; ; # ڼ.ẏᡤ +ڼ.ẏᡤ; ; ; xn--vkb.xn--08e172a; ; ; # ڼ.ẏᡤ +ڼ.ẏᡤ; ڼ.ẏᡤ; ; xn--vkb.xn--08e172a; ; ; # ڼ.ẏᡤ +ڼ.Ẏᡤ; ڼ.ẏᡤ; ; xn--vkb.xn--08e172a; ; ; # ڼ.ẏᡤ +ڼ.Ẏᡤ; ڼ.ẏᡤ; ; xn--vkb.xn--08e172a; ; ; # ڼ.ẏᡤ +xn--vkb.xn--08e172ax6aca; ڼ.‍ẏ‌ᡤ; [B1, C1, C2]; xn--vkb.xn--08e172ax6aca; ; ; # ڼ.ẏᡤ +ڼ。‍Ẏ‌ᡤ; ڼ.‍ẏ‌ᡤ; [B1, C1, C2]; xn--vkb.xn--08e172ax6aca; ; xn--vkb.xn--08e172a; [] # ڼ.ẏᡤ +ڼ。‍Ẏ‌ᡤ; ڼ.‍ẏ‌ᡤ; [B1, C1, C2]; xn--vkb.xn--08e172ax6aca; ; xn--vkb.xn--08e172a; [] # ڼ.ẏᡤ +𐹹𑲛。񑂐්; 𐹹𑲛.񑂐්; [B1, P1, V6]; xn--xo0dg5v.xn--h1c39876d; ; ; # 𐹹𑲛.් +xn--xo0dg5v.xn--h1c39876d; 𐹹𑲛.񑂐්; [B1, V6]; xn--xo0dg5v.xn--h1c39876d; ; ; # 𐹹𑲛.් +-≠𑈵。嵕ﻱ۴꥓; -≠𑈵.嵕ي۴꥓; [B1, B5, P1, V3, V6]; xn----ufo4749h.xn--mhb45a235sns3c; ; ; # -≠𑈵.嵕ي۴꥓ +-≠𑈵。嵕ﻱ۴꥓; -≠𑈵.嵕ي۴꥓; [B1, B5, P1, V3, V6]; xn----ufo4749h.xn--mhb45a235sns3c; ; ; # -≠𑈵.嵕ي۴꥓ +-≠𑈵。嵕ي۴꥓; -≠𑈵.嵕ي۴꥓; [B1, B5, P1, V3, V6]; xn----ufo4749h.xn--mhb45a235sns3c; ; ; # -≠𑈵.嵕ي۴꥓ +-≠𑈵。嵕ي۴꥓; -≠𑈵.嵕ي۴꥓; [B1, B5, P1, V3, V6]; xn----ufo4749h.xn--mhb45a235sns3c; ; ; # -≠𑈵.嵕ي۴꥓ +xn----ufo4749h.xn--mhb45a235sns3c; -≠𑈵.嵕ي۴꥓; [B1, B5, V3, V6]; xn----ufo4749h.xn--mhb45a235sns3c; ; ; # -≠𑈵.嵕ي۴꥓ +‌񍸰𐹶ݮ.ہ‍≯‍; ‌񍸰𐹶ݮ.ہ‍≯‍; [B1, B3, C1, C2, P1, V6]; xn--ypb717jrx2o7v94a.xn--0kb660ka35v; ; xn--ypb5875khz9y.xn--0kb682l; [B3, B5, B6, P1, V6] # 𐹶ݮ.ہ≯ +‌񍸰𐹶ݮ.ہ‍≯‍; ‌񍸰𐹶ݮ.ہ‍≯‍; [B1, B3, C1, C2, P1, V6]; xn--ypb717jrx2o7v94a.xn--0kb660ka35v; ; xn--ypb5875khz9y.xn--0kb682l; [B3, B5, B6, P1, V6] # 𐹶ݮ.ہ≯ +‌񍸰𐹶ݮ.ہ‍≯‍; ; [B1, B3, C1, C2, P1, V6]; xn--ypb717jrx2o7v94a.xn--0kb660ka35v; ; xn--ypb5875khz9y.xn--0kb682l; [B3, B5, B6, P1, V6] # 𐹶ݮ.ہ≯ +‌񍸰𐹶ݮ.ہ‍≯‍; ‌񍸰𐹶ݮ.ہ‍≯‍; [B1, B3, C1, C2, P1, V6]; xn--ypb717jrx2o7v94a.xn--0kb660ka35v; ; xn--ypb5875khz9y.xn--0kb682l; [B3, B5, B6, P1, V6] # 𐹶ݮ.ہ≯ +xn--ypb5875khz9y.xn--0kb682l; 񍸰𐹶ݮ.ہ≯; [B3, B5, B6, V6]; xn--ypb5875khz9y.xn--0kb682l; ; ; # 𐹶ݮ.ہ≯ +xn--ypb717jrx2o7v94a.xn--0kb660ka35v; ‌񍸰𐹶ݮ.ہ‍≯‍; [B1, B3, C1, C2, V6]; xn--ypb717jrx2o7v94a.xn--0kb660ka35v; ; ; # 𐹶ݮ.ہ≯ +≮.឵ࡕ𐫔; ≮.឵ࡕ𐫔; [B1, P1, V5, V6]; xn--gdh.xn--kwb589e217p; ; ; # ≮.ࡕ𐫔 +≮.឵ࡕ𐫔; ≮.឵ࡕ𐫔; [B1, P1, V5, V6]; xn--gdh.xn--kwb589e217p; ; ; # ≮.ࡕ𐫔 +≮.឵ࡕ𐫔; ; [B1, P1, V5, V6]; xn--gdh.xn--kwb589e217p; ; ; # ≮.ࡕ𐫔 +≮.឵ࡕ𐫔; ≮.឵ࡕ𐫔; [B1, P1, V5, V6]; xn--gdh.xn--kwb589e217p; ; ; # ≮.ࡕ𐫔 +xn--gdh.xn--kwb589e217p; ≮.឵ࡕ𐫔; [B1, V5, V6]; xn--gdh.xn--kwb589e217p; ; ; # ≮.ࡕ𐫔 +𐩗‍。ႩႵ; 𐩗‍.ႩႵ; [B3, C2, P1, V6]; xn--1ug4933g.xn--hndy; ; xn--pt9c.xn--hndy; [P1, V6] # 𐩗.ႩႵ +𐩗‍。ႩႵ; 𐩗‍.ႩႵ; [B3, C2, P1, V6]; xn--1ug4933g.xn--hndy; ; xn--pt9c.xn--hndy; [P1, V6] # 𐩗.ႩႵ +𐩗‍。ⴉⴕ; 𐩗‍.ⴉⴕ; [B3, C2]; xn--1ug4933g.xn--0kjya; ; xn--pt9c.xn--0kjya; [] # 𐩗.ⴉⴕ +𐩗‍。Ⴉⴕ; 𐩗‍.Ⴉⴕ; [B3, C2, P1, V6]; xn--1ug4933g.xn--hnd666l; ; xn--pt9c.xn--hnd666l; [P1, V6] # 𐩗.Ⴉⴕ +xn--pt9c.xn--hnd666l; 𐩗.Ⴉⴕ; [V6]; xn--pt9c.xn--hnd666l; ; ; # 𐩗.Ⴉⴕ +xn--1ug4933g.xn--hnd666l; 𐩗‍.Ⴉⴕ; [B3, C2, V6]; xn--1ug4933g.xn--hnd666l; ; ; # 𐩗.Ⴉⴕ +xn--pt9c.xn--0kjya; 𐩗.ⴉⴕ; ; xn--pt9c.xn--0kjya; ; ; # 𐩗.ⴉⴕ +𐩗.ⴉⴕ; ; ; xn--pt9c.xn--0kjya; ; ; # 𐩗.ⴉⴕ +𐩗.ႩႵ; ; [P1, V6]; xn--pt9c.xn--hndy; ; ; # 𐩗.ႩႵ +𐩗.Ⴉⴕ; ; [P1, V6]; xn--pt9c.xn--hnd666l; ; ; # 𐩗.Ⴉⴕ +xn--pt9c.xn--hndy; 𐩗.ႩႵ; [V6]; xn--pt9c.xn--hndy; ; ; # 𐩗.ႩႵ +xn--1ug4933g.xn--0kjya; 𐩗‍.ⴉⴕ; [B3, C2]; xn--1ug4933g.xn--0kjya; ; ; # 𐩗.ⴉⴕ +xn--1ug4933g.xn--hndy; 𐩗‍.ႩႵ; [B3, C2, V6]; xn--1ug4933g.xn--hndy; ; ; # 𐩗.ႩႵ +𐩗‍。ⴉⴕ; 𐩗‍.ⴉⴕ; [B3, C2]; xn--1ug4933g.xn--0kjya; ; xn--pt9c.xn--0kjya; [] # 𐩗.ⴉⴕ +𐩗‍。Ⴉⴕ; 𐩗‍.Ⴉⴕ; [B3, C2, P1, V6]; xn--1ug4933g.xn--hnd666l; ; xn--pt9c.xn--hnd666l; [P1, V6] # 𐩗.Ⴉⴕ +‌‌ㄤ.̮󕨑ূ; ‌‌ㄤ.̮󕨑ূ; [C1, P1, V5, V6]; xn--0uga242k.xn--vta284a9o563a; ; xn--1fk.xn--vta284a9o563a; [P1, V5, V6] # ㄤ.̮ূ +‌‌ㄤ.̮󕨑ূ; ; [C1, P1, V5, V6]; xn--0uga242k.xn--vta284a9o563a; ; xn--1fk.xn--vta284a9o563a; [P1, V5, V6] # ㄤ.̮ূ +xn--1fk.xn--vta284a9o563a; ㄤ.̮󕨑ূ; [V5, V6]; xn--1fk.xn--vta284a9o563a; ; ; # ㄤ.̮ূ +xn--0uga242k.xn--vta284a9o563a; ‌‌ㄤ.̮󕨑ূ; [C1, V5, V6]; xn--0uga242k.xn--vta284a9o563a; ; ; # ㄤ.̮ূ +𐋻。-‌𐫄Ⴗ; 𐋻.-‌𐫄Ⴗ; [B1, C1, P1, V3, V6]; xn--v97c.xn----i1g888ih12u; ; xn--v97c.xn----i1g2513q; [B1, P1, V3, V6] # 𐋻.-𐫄Ⴗ +𐋻。-‌𐫄Ⴗ; 𐋻.-‌𐫄Ⴗ; [B1, C1, P1, V3, V6]; xn--v97c.xn----i1g888ih12u; ; xn--v97c.xn----i1g2513q; [B1, P1, V3, V6] # 𐋻.-𐫄Ⴗ +𐋻。-‌𐫄ⴗ; 𐋻.-‌𐫄ⴗ; [B1, C1, V3]; xn--v97c.xn----sgnv20du99s; ; xn--v97c.xn----lws0526f; [B1, V3] # 𐋻.-𐫄ⴗ +xn--v97c.xn----lws0526f; 𐋻.-𐫄ⴗ; [B1, V3]; xn--v97c.xn----lws0526f; ; ; # 𐋻.-𐫄ⴗ +xn--v97c.xn----sgnv20du99s; 𐋻.-‌𐫄ⴗ; [B1, C1, V3]; xn--v97c.xn----sgnv20du99s; ; ; # 𐋻.-𐫄ⴗ +xn--v97c.xn----i1g2513q; 𐋻.-𐫄Ⴗ; [B1, V3, V6]; xn--v97c.xn----i1g2513q; ; ; # 𐋻.-𐫄Ⴗ +xn--v97c.xn----i1g888ih12u; 𐋻.-‌𐫄Ⴗ; [B1, C1, V3, V6]; xn--v97c.xn----i1g888ih12u; ; ; # 𐋻.-𐫄Ⴗ +𐋻。-‌𐫄ⴗ; 𐋻.-‌𐫄ⴗ; [B1, C1, V3]; xn--v97c.xn----sgnv20du99s; ; xn--v97c.xn----lws0526f; [B1, V3] # 𐋻.-𐫄ⴗ +🙑𐷺.≠‌; 🙑𐷺.≠‌; [B1, C1, P1, V6]; xn--bl0dh970b.xn--0ug83g; ; xn--bl0dh970b.xn--1ch; [B1, P1, V6] # 🙑.≠ +🙑𐷺.≠‌; 🙑𐷺.≠‌; [B1, C1, P1, V6]; xn--bl0dh970b.xn--0ug83g; ; xn--bl0dh970b.xn--1ch; [B1, P1, V6] # 🙑.≠ +🙑𐷺.≠‌; ; [B1, C1, P1, V6]; xn--bl0dh970b.xn--0ug83g; ; xn--bl0dh970b.xn--1ch; [B1, P1, V6] # 🙑.≠ +🙑𐷺.≠‌; 🙑𐷺.≠‌; [B1, C1, P1, V6]; xn--bl0dh970b.xn--0ug83g; ; xn--bl0dh970b.xn--1ch; [B1, P1, V6] # 🙑.≠ +xn--bl0dh970b.xn--1ch; 🙑𐷺.≠; [B1, V6]; xn--bl0dh970b.xn--1ch; ; ; # 🙑.≠ +xn--bl0dh970b.xn--0ug83g; 🙑𐷺.≠‌; [B1, C1, V6]; xn--bl0dh970b.xn--0ug83g; ; ; # 🙑.≠ +ٌ᳒。𞮞⵿⧎; ٌ᳒.𞮞⵿⧎; [B1, B3, B6, P1, V5, V6]; xn--ohb646i.xn--ewi38jf765c; ; ; # ٌ᳒.⵿⧎ +ٌ᳒。𞮞⵿⧎; ٌ᳒.𞮞⵿⧎; [B1, B3, B6, P1, V5, V6]; xn--ohb646i.xn--ewi38jf765c; ; ; # ٌ᳒.⵿⧎ +xn--ohb646i.xn--ewi38jf765c; ٌ᳒.𞮞⵿⧎; [B1, B3, B6, V5, V6]; xn--ohb646i.xn--ewi38jf765c; ; ; # ٌ᳒.⵿⧎ +Ⴔ𝨨₃󠁦.𝟳𑂹ஂ; Ⴔ𝨨3󠁦.7𑂹ஂ; [P1, V6]; xn--3-b1g83426a35t0g.xn--7-cve6271r; ; ; # Ⴔ𝨨3.7𑂹ஂ +Ⴔ𝨨3󠁦.7𑂹ஂ; ; [P1, V6]; xn--3-b1g83426a35t0g.xn--7-cve6271r; ; ; # Ⴔ𝨨3.7𑂹ஂ +ⴔ𝨨3󠁦.7𑂹ஂ; ; [P1, V6]; xn--3-ews6985n35s3g.xn--7-cve6271r; ; ; # ⴔ𝨨3.7𑂹ஂ +xn--3-ews6985n35s3g.xn--7-cve6271r; ⴔ𝨨3󠁦.7𑂹ஂ; [V6]; xn--3-ews6985n35s3g.xn--7-cve6271r; ; ; # ⴔ𝨨3.7𑂹ஂ +xn--3-b1g83426a35t0g.xn--7-cve6271r; Ⴔ𝨨3󠁦.7𑂹ஂ; [V6]; xn--3-b1g83426a35t0g.xn--7-cve6271r; ; ; # Ⴔ𝨨3.7𑂹ஂ +ⴔ𝨨₃󠁦.𝟳𑂹ஂ; ⴔ𝨨3󠁦.7𑂹ஂ; [P1, V6]; xn--3-ews6985n35s3g.xn--7-cve6271r; ; ; # ⴔ𝨨3.7𑂹ஂ +䏈‌。‌⒈񱢕; 䏈‌.‌⒈񱢕; [C1, P1, V6]; xn--0ug491l.xn--0ug88oot66q; ; xn--eco.xn--tsh21126d; [P1, V6] # 䏈.⒈ +䏈‌。‌1.񱢕; 䏈‌.‌1.񱢕; [C1, P1, V6]; xn--0ug491l.xn--1-rgn.xn--ms39a; ; xn--eco.1.xn--ms39a; [P1, V6] # 䏈.1. +xn--eco.1.xn--ms39a; 䏈.1.񱢕; [V6]; xn--eco.1.xn--ms39a; ; ; # 䏈.1. +xn--0ug491l.xn--1-rgn.xn--ms39a; 䏈‌.‌1.񱢕; [C1, V6]; xn--0ug491l.xn--1-rgn.xn--ms39a; ; ; # 䏈.1. +xn--eco.xn--tsh21126d; 䏈.⒈񱢕; [V6]; xn--eco.xn--tsh21126d; ; ; # 䏈.⒈ +xn--0ug491l.xn--0ug88oot66q; 䏈‌.‌⒈񱢕; [C1, V6]; xn--0ug491l.xn--0ug88oot66q; ; ; # 䏈.⒈ +1꫶ß𑲥。ᷘ; 1꫶ß𑲥.ᷘ; [V5]; xn--1-qfa2471kdb0d.xn--weg; ; xn--1ss-ir6ln166b.xn--weg; # 1꫶ß𑲥.ᷘ +1꫶ß𑲥。ᷘ; 1꫶ß𑲥.ᷘ; [V5]; xn--1-qfa2471kdb0d.xn--weg; ; xn--1ss-ir6ln166b.xn--weg; # 1꫶ß𑲥.ᷘ +1꫶SS𑲥。ᷘ; 1꫶ss𑲥.ᷘ; [V5]; xn--1ss-ir6ln166b.xn--weg; ; ; # 1꫶ss𑲥.ᷘ +1꫶ss𑲥。ᷘ; 1꫶ss𑲥.ᷘ; [V5]; xn--1ss-ir6ln166b.xn--weg; ; ; # 1꫶ss𑲥.ᷘ +xn--1ss-ir6ln166b.xn--weg; 1꫶ss𑲥.ᷘ; [V5]; xn--1ss-ir6ln166b.xn--weg; ; ; # 1꫶ss𑲥.ᷘ +xn--1-qfa2471kdb0d.xn--weg; 1꫶ß𑲥.ᷘ; [V5]; xn--1-qfa2471kdb0d.xn--weg; ; ; # 1꫶ß𑲥.ᷘ +1꫶SS𑲥。ᷘ; 1꫶ss𑲥.ᷘ; [V5]; xn--1ss-ir6ln166b.xn--weg; ; ; # 1꫶ss𑲥.ᷘ +1꫶ss𑲥。ᷘ; 1꫶ss𑲥.ᷘ; [V5]; xn--1ss-ir6ln166b.xn--weg; ; ; # 1꫶ss𑲥.ᷘ +1꫶Ss𑲥。ᷘ; 1꫶ss𑲥.ᷘ; [V5]; xn--1ss-ir6ln166b.xn--weg; ; ; # 1꫶ss𑲥.ᷘ +1꫶Ss𑲥。ᷘ; 1꫶ss𑲥.ᷘ; [V5]; xn--1ss-ir6ln166b.xn--weg; ; ; # 1꫶ss𑲥.ᷘ +‍񫶩𞪯್。ݼ⒈; ‍񫶩𞪯್.ݼ⒈; [B1, C2, P1, V6]; xn--8tc969gzn94a4lm8a.xn--dqb689l; ; xn--8tc9875v5is1a.xn--dqb689l; [B5, B6, P1, V6] # ್.ݼ⒈ +‍񫶩𞪯್。ݼ1.; ‍񫶩𞪯್.ݼ1.; [B1, C2, P1, V6]; xn--8tc969gzn94a4lm8a.xn--1-g6c.; ; xn--8tc9875v5is1a.xn--1-g6c.; [B5, B6, P1, V6] # ್.ݼ1. +xn--8tc9875v5is1a.xn--1-g6c.; 񫶩𞪯್.ݼ1.; [B5, B6, V6]; xn--8tc9875v5is1a.xn--1-g6c.; ; ; # ್.ݼ1. +xn--8tc969gzn94a4lm8a.xn--1-g6c.; ‍񫶩𞪯್.ݼ1.; [B1, C2, V6]; xn--8tc969gzn94a4lm8a.xn--1-g6c.; ; ; # ್.ݼ1. +xn--8tc9875v5is1a.xn--dqb689l; 񫶩𞪯್.ݼ⒈; [B5, B6, V6]; xn--8tc9875v5is1a.xn--dqb689l; ; ; # ್.ݼ⒈ +xn--8tc969gzn94a4lm8a.xn--dqb689l; ‍񫶩𞪯್.ݼ⒈; [B1, C2, V6]; xn--8tc969gzn94a4lm8a.xn--dqb689l; ; ; # ್.ݼ⒈ +᪶.𞤳򓢖򻉒ߗ; ᪶.𞤳򓢖򻉒ߗ; [B1, B2, B3, B6, P1, V5, V6]; xn--zqf.xn--ysb9657vuiz5bj0ep; ; ; # ᪶.𞤳ߗ +᪶.𞤳򓢖򻉒ߗ; ; [B1, B2, B3, B6, P1, V5, V6]; xn--zqf.xn--ysb9657vuiz5bj0ep; ; ; # ᪶.𞤳ߗ +᪶.𞤑򓢖򻉒ߗ; ᪶.𞤳򓢖򻉒ߗ; [B1, B2, B3, B6, P1, V5, V6]; xn--zqf.xn--ysb9657vuiz5bj0ep; ; ; # ᪶.𞤳ߗ +xn--zqf.xn--ysb9657vuiz5bj0ep; ᪶.𞤳򓢖򻉒ߗ; [B1, B2, B3, B6, V5, V6]; xn--zqf.xn--ysb9657vuiz5bj0ep; ; ; # ᪶.𞤳ߗ +᪶.𞤑򓢖򻉒ߗ; ᪶.𞤳򓢖򻉒ߗ; [B1, B2, B3, B6, P1, V5, V6]; xn--zqf.xn--ysb9657vuiz5bj0ep; ; ; # ᪶.𞤳ߗ +ࡂ𞩚⒈.󠬌8򏳏ݰ; ࡂ𞩚⒈.󠬌8򏳏ݰ; [B1, P1, V6]; xn--0vb095ldg52a.xn--8-s5c22427ox454a; ; ; # ࡂ⒈.8ݰ +ࡂ𞩚1..󠬌8򏳏ݰ; ; [B1, P1, V6, X4_2]; xn--1-rid26318a..xn--8-s5c22427ox454a; [B1, P1, V6, A4_2]; ; # ࡂ1..8ݰ +xn--1-rid26318a..xn--8-s5c22427ox454a; ࡂ𞩚1..󠬌8򏳏ݰ; [B1, V6, X4_2]; xn--1-rid26318a..xn--8-s5c22427ox454a; [B1, V6, A4_2]; ; # ࡂ1..8ݰ +xn--0vb095ldg52a.xn--8-s5c22427ox454a; ࡂ𞩚⒈.󠬌8򏳏ݰ; [B1, V6]; xn--0vb095ldg52a.xn--8-s5c22427ox454a; ; ; # ࡂ⒈.8ݰ +͡𐫫ͩᡷ。-󠰛鞰; ͡𐫫ͩᡷ.-󠰛鞰; [B1, P1, V3, V5, V6]; xn--cvaq482npv5t.xn----yg7dt1332g; ; ; # ͡𐫫ͩᡷ.-鞰 +xn--cvaq482npv5t.xn----yg7dt1332g; ͡𐫫ͩᡷ.-󠰛鞰; [B1, V3, V5, V6]; xn--cvaq482npv5t.xn----yg7dt1332g; ; ; # ͡𐫫ͩᡷ.-鞰 +-.્剘ß𐫃; ; [B1, V3, V5]; -.xn--zca791c493duf8i; ; -.xn--ss-bqg4734erywk; # -.્剘ß𐫃 +-.્剘SS𐫃; -.્剘ss𐫃; [B1, V3, V5]; -.xn--ss-bqg4734erywk; ; ; # -.્剘ss𐫃 +-.્剘ss𐫃; ; [B1, V3, V5]; -.xn--ss-bqg4734erywk; ; ; # -.્剘ss𐫃 +-.્剘Ss𐫃; -.્剘ss𐫃; [B1, V3, V5]; -.xn--ss-bqg4734erywk; ; ; # -.્剘ss𐫃 +-.xn--ss-bqg4734erywk; -.્剘ss𐫃; [B1, V3, V5]; -.xn--ss-bqg4734erywk; ; ; # -.્剘ss𐫃 +-.xn--zca791c493duf8i; -.્剘ß𐫃; [B1, V3, V5]; -.xn--zca791c493duf8i; ; ; # -.્剘ß𐫃 +ࣻ𞵸。-; ࣻ𞵸.-; [B1, P1, V3, V5, V6]; xn--b1b2719v.-; ; ; # ࣻ.- +ࣻ𞵸。-; ࣻ𞵸.-; [B1, P1, V3, V5, V6]; xn--b1b2719v.-; ; ; # ࣻ.- +xn--b1b2719v.-; ࣻ𞵸.-; [B1, V3, V5, V6]; xn--b1b2719v.-; ; ; # ࣻ.- +⒈󠈻𐹲。≠؃𐹽; ⒈󠈻𐹲.≠؃𐹽; [B1, P1, V6]; xn--tshw766f1153g.xn--lfb536lb35n; ; ; # ⒈𐹲.≠𐹽 +⒈󠈻𐹲。≠؃𐹽; ⒈󠈻𐹲.≠؃𐹽; [B1, P1, V6]; xn--tshw766f1153g.xn--lfb536lb35n; ; ; # ⒈𐹲.≠𐹽 +1.󠈻𐹲。≠؃𐹽; 1.󠈻𐹲.≠؃𐹽; [B1, P1, V6]; 1.xn--qo0dl3077c.xn--lfb536lb35n; ; ; # 1.𐹲.≠𐹽 +1.󠈻𐹲。≠؃𐹽; 1.󠈻𐹲.≠؃𐹽; [B1, P1, V6]; 1.xn--qo0dl3077c.xn--lfb536lb35n; ; ; # 1.𐹲.≠𐹽 +1.xn--qo0dl3077c.xn--lfb536lb35n; 1.󠈻𐹲.≠؃𐹽; [B1, V6]; 1.xn--qo0dl3077c.xn--lfb536lb35n; ; ; # 1.𐹲.≠𐹽 +xn--tshw766f1153g.xn--lfb536lb35n; ⒈󠈻𐹲.≠؃𐹽; [B1, V6]; xn--tshw766f1153g.xn--lfb536lb35n; ; ; # ⒈𐹲.≠𐹽 +𐹢󠈚Ⴎ‌.㖾𐹡; ; [B1, B5, B6, C1, P1, V6]; xn--mnd289ezj4pqxp0i.xn--pelu572d; ; xn--mnd9001km0o0g.xn--pelu572d; [B1, B5, B6, P1, V6] # 𐹢Ⴎ.㖾𐹡 +𐹢󠈚ⴎ‌.㖾𐹡; ; [B1, B5, B6, C1, P1, V6]; xn--0ug342clq0pqxv4i.xn--pelu572d; ; xn--5kjx323em053g.xn--pelu572d; [B1, B5, B6, P1, V6] # 𐹢ⴎ.㖾𐹡 +xn--5kjx323em053g.xn--pelu572d; 𐹢󠈚ⴎ.㖾𐹡; [B1, B5, B6, V6]; xn--5kjx323em053g.xn--pelu572d; ; ; # 𐹢ⴎ.㖾𐹡 +xn--0ug342clq0pqxv4i.xn--pelu572d; 𐹢󠈚ⴎ‌.㖾𐹡; [B1, B5, B6, C1, V6]; xn--0ug342clq0pqxv4i.xn--pelu572d; ; ; # 𐹢ⴎ.㖾𐹡 +xn--mnd9001km0o0g.xn--pelu572d; 𐹢󠈚Ⴎ.㖾𐹡; [B1, B5, B6, V6]; xn--mnd9001km0o0g.xn--pelu572d; ; ; # 𐹢Ⴎ.㖾𐹡 +xn--mnd289ezj4pqxp0i.xn--pelu572d; 𐹢󠈚Ⴎ‌.㖾𐹡; [B1, B5, B6, C1, V6]; xn--mnd289ezj4pqxp0i.xn--pelu572d; ; ; # 𐹢Ⴎ.㖾𐹡 +򩼗.߇ᡖႳႧ; 򩼗.߇ᡖႳႧ; [B2, B3, P1, V6]; xn--te28c.xn--isb856b9a631d; ; ; # .߇ᡖႳႧ +򩼗.߇ᡖႳႧ; ; [B2, B3, P1, V6]; xn--te28c.xn--isb856b9a631d; ; ; # .߇ᡖႳႧ +򩼗.߇ᡖⴓⴇ; ; [B2, B3, P1, V6]; xn--te28c.xn--isb295fbtpmb; ; ; # .߇ᡖⴓⴇ +xn--te28c.xn--isb295fbtpmb; 򩼗.߇ᡖⴓⴇ; [B2, B3, V6]; xn--te28c.xn--isb295fbtpmb; ; ; # .߇ᡖⴓⴇ +xn--te28c.xn--isb856b9a631d; 򩼗.߇ᡖႳႧ; [B2, B3, V6]; xn--te28c.xn--isb856b9a631d; ; ; # .߇ᡖႳႧ +򩼗.߇ᡖⴓⴇ; 򩼗.߇ᡖⴓⴇ; [B2, B3, P1, V6]; xn--te28c.xn--isb295fbtpmb; ; ; # .߇ᡖⴓⴇ +򩼗.߇ᡖႳⴇ; ; [B2, B3, P1, V6]; xn--te28c.xn--isb286btrgo7w; ; ; # .߇ᡖႳⴇ +xn--te28c.xn--isb286btrgo7w; 򩼗.߇ᡖႳⴇ; [B2, B3, V6]; xn--te28c.xn--isb286btrgo7w; ; ; # .߇ᡖႳⴇ +򩼗.߇ᡖႳⴇ; 򩼗.߇ᡖႳⴇ; [B2, B3, P1, V6]; xn--te28c.xn--isb286btrgo7w; ; ; # .߇ᡖႳⴇ +‍􅍉.ڳݵ; ; [B1, C2, P1, V6]; xn--1ug39444n.xn--mkb20b; ; xn--3j78f.xn--mkb20b; [P1, V6] # .ڳݵ +xn--3j78f.xn--mkb20b; 􅍉.ڳݵ; [V6]; xn--3j78f.xn--mkb20b; ; ; # .ڳݵ +xn--1ug39444n.xn--mkb20b; ‍􅍉.ڳݵ; [B1, C2, V6]; xn--1ug39444n.xn--mkb20b; ; ; # .ڳݵ +𲤱⒛⾳.ꡦ⒈; 𲤱⒛音.ꡦ⒈; [P1, V6]; xn--dth6033bzbvx.xn--tsh9439b; ; ; # ⒛音.ꡦ⒈ +𲤱20.音.ꡦ1.; ; [P1, V6]; xn--20-9802c.xn--0w5a.xn--1-eg4e.; ; ; # 20.音.ꡦ1. +xn--20-9802c.xn--0w5a.xn--1-eg4e.; 𲤱20.音.ꡦ1.; [V6]; xn--20-9802c.xn--0w5a.xn--1-eg4e.; ; ; # 20.音.ꡦ1. +xn--dth6033bzbvx.xn--tsh9439b; 𲤱⒛音.ꡦ⒈; [V6]; xn--dth6033bzbvx.xn--tsh9439b; ; ; # ⒛音.ꡦ⒈ +ߜ8񳦓-。򞲙𑁿𐩥্; ߜ8񳦓-.򞲙𑁿𐩥্; [B2, B3, B5, B6, P1, V3, V6]; xn--8--rve13079p.xn--b7b9842k42df776x; ; ; # ߜ8-.𑁿𐩥্ +ߜ8񳦓-。򞲙𑁿𐩥্; ߜ8񳦓-.򞲙𑁿𐩥্; [B2, B3, B5, B6, P1, V3, V6]; xn--8--rve13079p.xn--b7b9842k42df776x; ; ; # ߜ8-.𑁿𐩥্ +xn--8--rve13079p.xn--b7b9842k42df776x; ߜ8񳦓-.򞲙𑁿𐩥্; [B2, B3, B5, B6, V3, V6]; xn--8--rve13079p.xn--b7b9842k42df776x; ; ; # ߜ8-.𑁿𐩥্ +Ⴕ。۰≮ß݅; Ⴕ.۰≮ß݅; [P1, V6]; xn--tnd.xn--zca912alh227g; ; xn--tnd.xn--ss-jbe65aw27i; # Ⴕ.۰≮ß݅ +Ⴕ。۰≮ß݅; Ⴕ.۰≮ß݅; [P1, V6]; xn--tnd.xn--zca912alh227g; ; xn--tnd.xn--ss-jbe65aw27i; # Ⴕ.۰≮ß݅ +ⴕ。۰≮ß݅; ⴕ.۰≮ß݅; [P1, V6]; xn--dlj.xn--zca912alh227g; ; xn--dlj.xn--ss-jbe65aw27i; # ⴕ.۰≮ß݅ +ⴕ。۰≮ß݅; ⴕ.۰≮ß݅; [P1, V6]; xn--dlj.xn--zca912alh227g; ; xn--dlj.xn--ss-jbe65aw27i; # ⴕ.۰≮ß݅ +Ⴕ。۰≮SS݅; Ⴕ.۰≮ss݅; [P1, V6]; xn--tnd.xn--ss-jbe65aw27i; ; ; # Ⴕ.۰≮ss݅ +Ⴕ。۰≮SS݅; Ⴕ.۰≮ss݅; [P1, V6]; xn--tnd.xn--ss-jbe65aw27i; ; ; # Ⴕ.۰≮ss݅ +ⴕ。۰≮ss݅; ⴕ.۰≮ss݅; [P1, V6]; xn--dlj.xn--ss-jbe65aw27i; ; ; # ⴕ.۰≮ss݅ +ⴕ。۰≮ss݅; ⴕ.۰≮ss݅; [P1, V6]; xn--dlj.xn--ss-jbe65aw27i; ; ; # ⴕ.۰≮ss݅ +Ⴕ。۰≮Ss݅; Ⴕ.۰≮ss݅; [P1, V6]; xn--tnd.xn--ss-jbe65aw27i; ; ; # Ⴕ.۰≮ss݅ +Ⴕ。۰≮Ss݅; Ⴕ.۰≮ss݅; [P1, V6]; xn--tnd.xn--ss-jbe65aw27i; ; ; # Ⴕ.۰≮ss݅ +xn--tnd.xn--ss-jbe65aw27i; Ⴕ.۰≮ss݅; [V6]; xn--tnd.xn--ss-jbe65aw27i; ; ; # Ⴕ.۰≮ss݅ +xn--dlj.xn--ss-jbe65aw27i; ⴕ.۰≮ss݅; [V6]; xn--dlj.xn--ss-jbe65aw27i; ; ; # ⴕ.۰≮ss݅ +xn--dlj.xn--zca912alh227g; ⴕ.۰≮ß݅; [V6]; xn--dlj.xn--zca912alh227g; ; ; # ⴕ.۰≮ß݅ +xn--tnd.xn--zca912alh227g; Ⴕ.۰≮ß݅; [V6]; xn--tnd.xn--zca912alh227g; ; ; # Ⴕ.۰≮ß݅ +ߩ-.𝨗꒱᭲; ; [B1, B3, V3, V5]; xn----odd.xn--dwf8994dc8wj; ; ; # ߩ-.𝨗꒱᭲ +xn----odd.xn--dwf8994dc8wj; ߩ-.𝨗꒱᭲; [B1, B3, V3, V5]; xn----odd.xn--dwf8994dc8wj; ; ; # ߩ-.𝨗꒱᭲ +𞼸‌.≯䕵⫧; ; [B1, B3, C1, P1, V6]; xn--0ugx453p.xn--hdh754ax6w; ; xn--sn7h.xn--hdh754ax6w; [B1, P1, V6] # .≯䕵⫧ +𞼸‌.≯䕵⫧; 𞼸‌.≯䕵⫧; [B1, B3, C1, P1, V6]; xn--0ugx453p.xn--hdh754ax6w; ; xn--sn7h.xn--hdh754ax6w; [B1, P1, V6] # .≯䕵⫧ +xn--sn7h.xn--hdh754ax6w; 𞼸.≯䕵⫧; [B1, V6]; xn--sn7h.xn--hdh754ax6w; ; ; # .≯䕵⫧ +xn--0ugx453p.xn--hdh754ax6w; 𞼸‌.≯䕵⫧; [B1, B3, C1, V6]; xn--0ugx453p.xn--hdh754ax6w; ; ; # .≯䕵⫧ +𐨅ßﱗ.ڬ۳︒; 𐨅ßيخ.ڬ۳︒; [B1, B3, P1, V5, V6]; xn--zca23yncs877j.xn--fkb6lp314e; ; xn--ss-ytd5i7765l.xn--fkb6lp314e; # 𐨅ßيخ.ڬ۳︒ +𐨅ßيخ.ڬ۳。; 𐨅ßيخ.ڬ۳.; [B1, V5]; xn--zca23yncs877j.xn--fkb6l.; ; xn--ss-ytd5i7765l.xn--fkb6l.; # 𐨅ßيخ.ڬ۳. +𐨅SSيخ.ڬ۳。; 𐨅ssيخ.ڬ۳.; [B1, V5]; xn--ss-ytd5i7765l.xn--fkb6l.; ; ; # 𐨅ssيخ.ڬ۳. +𐨅ssيخ.ڬ۳。; 𐨅ssيخ.ڬ۳.; [B1, V5]; xn--ss-ytd5i7765l.xn--fkb6l.; ; ; # 𐨅ssيخ.ڬ۳. +𐨅Ssيخ.ڬ۳。; 𐨅ssيخ.ڬ۳.; [B1, V5]; xn--ss-ytd5i7765l.xn--fkb6l.; ; ; # 𐨅ssيخ.ڬ۳. +xn--ss-ytd5i7765l.xn--fkb6l.; 𐨅ssيخ.ڬ۳.; [B1, V5]; xn--ss-ytd5i7765l.xn--fkb6l.; ; ; # 𐨅ssيخ.ڬ۳. +xn--zca23yncs877j.xn--fkb6l.; 𐨅ßيخ.ڬ۳.; [B1, V5]; xn--zca23yncs877j.xn--fkb6l.; ; ; # 𐨅ßيخ.ڬ۳. +𐨅SSﱗ.ڬ۳︒; 𐨅ssيخ.ڬ۳︒; [B1, B3, P1, V5, V6]; xn--ss-ytd5i7765l.xn--fkb6lp314e; ; ; # 𐨅ssيخ.ڬ۳︒ +𐨅ssﱗ.ڬ۳︒; 𐨅ssيخ.ڬ۳︒; [B1, B3, P1, V5, V6]; xn--ss-ytd5i7765l.xn--fkb6lp314e; ; ; # 𐨅ssيخ.ڬ۳︒ +𐨅Ssﱗ.ڬ۳︒; 𐨅ssيخ.ڬ۳︒; [B1, B3, P1, V5, V6]; xn--ss-ytd5i7765l.xn--fkb6lp314e; ; ; # 𐨅ssيخ.ڬ۳︒ +xn--ss-ytd5i7765l.xn--fkb6lp314e; 𐨅ssيخ.ڬ۳︒; [B1, B3, V5, V6]; xn--ss-ytd5i7765l.xn--fkb6lp314e; ; ; # 𐨅ssيخ.ڬ۳︒ +xn--zca23yncs877j.xn--fkb6lp314e; 𐨅ßيخ.ڬ۳︒; [B1, B3, V5, V6]; xn--zca23yncs877j.xn--fkb6lp314e; ; ; # 𐨅ßيخ.ڬ۳︒ +-≮🡒᳭.񏿾Ⴁܔ; ; [B1, P1, V3, V6]; xn----44l04zxt68c.xn--enb300c1597h; ; ; # -≮🡒᳭.Ⴁܔ +-≮🡒᳭.񏿾Ⴁܔ; -≮🡒᳭.񏿾Ⴁܔ; [B1, P1, V3, V6]; xn----44l04zxt68c.xn--enb300c1597h; ; ; # -≮🡒᳭.Ⴁܔ +-≮🡒᳭.񏿾ⴁܔ; -≮🡒᳭.񏿾ⴁܔ; [B1, P1, V3, V6]; xn----44l04zxt68c.xn--enb135qf106f; ; ; # -≮🡒᳭.ⴁܔ +-≮🡒᳭.񏿾ⴁܔ; ; [B1, P1, V3, V6]; xn----44l04zxt68c.xn--enb135qf106f; ; ; # -≮🡒᳭.ⴁܔ +xn----44l04zxt68c.xn--enb135qf106f; -≮🡒᳭.񏿾ⴁܔ; [B1, V3, V6]; xn----44l04zxt68c.xn--enb135qf106f; ; ; # -≮🡒᳭.ⴁܔ +xn----44l04zxt68c.xn--enb300c1597h; -≮🡒᳭.񏿾Ⴁܔ; [B1, V3, V6]; xn----44l04zxt68c.xn--enb300c1597h; ; ; # -≮🡒᳭.Ⴁܔ +𞤨。ꡏ‍‌; 𞤨.ꡏ‍‌; [B6, C1, C2]; xn--ge6h.xn--0ugb9575h; ; xn--ge6h.xn--oc9a; [] # 𞤨.ꡏ +𞤨。ꡏ‍‌; 𞤨.ꡏ‍‌; [B6, C1, C2]; xn--ge6h.xn--0ugb9575h; ; xn--ge6h.xn--oc9a; [] # 𞤨.ꡏ +𞤆。ꡏ‍‌; 𞤨.ꡏ‍‌; [B6, C1, C2]; xn--ge6h.xn--0ugb9575h; ; xn--ge6h.xn--oc9a; [] # 𞤨.ꡏ +xn--ge6h.xn--oc9a; 𞤨.ꡏ; ; xn--ge6h.xn--oc9a; ; ; # 𞤨.ꡏ +𞤨.ꡏ; ; ; xn--ge6h.xn--oc9a; ; ; # 𞤨.ꡏ +𞤆.ꡏ; 𞤨.ꡏ; ; xn--ge6h.xn--oc9a; ; ; # 𞤨.ꡏ +xn--ge6h.xn--0ugb9575h; 𞤨.ꡏ‍‌; [B6, C1, C2]; xn--ge6h.xn--0ugb9575h; ; ; # 𞤨.ꡏ +𞤆。ꡏ‍‌; 𞤨.ꡏ‍‌; [B6, C1, C2]; xn--ge6h.xn--0ugb9575h; ; xn--ge6h.xn--oc9a; [] # 𞤨.ꡏ +󠅹𑂶.ᢌ𑂹٩; 𑂶.ᢌ𑂹٩; [B1, B3, B5, B6, V5]; xn--b50d.xn--iib993gyp5p; ; ; # 𑂶.ᢌ𑂹٩ +󠅹𑂶.ᢌ𑂹٩; 𑂶.ᢌ𑂹٩; [B1, B3, B5, B6, V5]; xn--b50d.xn--iib993gyp5p; ; ; # 𑂶.ᢌ𑂹٩ +xn--b50d.xn--iib993gyp5p; 𑂶.ᢌ𑂹٩; [B1, B3, B5, B6, V5]; xn--b50d.xn--iib993gyp5p; ; ; # 𑂶.ᢌ𑂹٩ +Ⅎ󠅺񝵒。≯⾑; Ⅎ񝵒.≯襾; [P1, V6]; xn--f3g73398c.xn--hdhz171b; ; ; # Ⅎ.≯襾 +Ⅎ󠅺񝵒。≯⾑; Ⅎ񝵒.≯襾; [P1, V6]; xn--f3g73398c.xn--hdhz171b; ; ; # Ⅎ.≯襾 +Ⅎ󠅺񝵒。≯襾; Ⅎ񝵒.≯襾; [P1, V6]; xn--f3g73398c.xn--hdhz171b; ; ; # Ⅎ.≯襾 +Ⅎ󠅺񝵒。≯襾; Ⅎ񝵒.≯襾; [P1, V6]; xn--f3g73398c.xn--hdhz171b; ; ; # Ⅎ.≯襾 +ⅎ󠅺񝵒。≯襾; ⅎ񝵒.≯襾; [P1, V6]; xn--73g39298c.xn--hdhz171b; ; ; # ⅎ.≯襾 +ⅎ󠅺񝵒。≯襾; ⅎ񝵒.≯襾; [P1, V6]; xn--73g39298c.xn--hdhz171b; ; ; # ⅎ.≯襾 +xn--73g39298c.xn--hdhz171b; ⅎ񝵒.≯襾; [V6]; xn--73g39298c.xn--hdhz171b; ; ; # ⅎ.≯襾 +xn--f3g73398c.xn--hdhz171b; Ⅎ񝵒.≯襾; [V6]; xn--f3g73398c.xn--hdhz171b; ; ; # Ⅎ.≯襾 +ⅎ󠅺񝵒。≯⾑; ⅎ񝵒.≯襾; [P1, V6]; xn--73g39298c.xn--hdhz171b; ; ; # ⅎ.≯襾 +ⅎ󠅺񝵒。≯⾑; ⅎ񝵒.≯襾; [P1, V6]; xn--73g39298c.xn--hdhz171b; ; ; # ⅎ.≯襾 +ς‍ු٠。-; ς‍ු٠.-; [B1, B5, B6, C2, V3]; xn--3xa45ks2jenu.-; ; xn--4xa25ks2j.-; [B1, B5, B6, V3] # ςු٠.- +ς‍ු٠。-; ς‍ු٠.-; [B1, B5, B6, C2, V3]; xn--3xa45ks2jenu.-; ; xn--4xa25ks2j.-; [B1, B5, B6, V3] # ςු٠.- +Σ‍ු٠。-; σ‍ු٠.-; [B1, B5, B6, C2, V3]; xn--4xa25ks2jenu.-; ; xn--4xa25ks2j.-; [B1, B5, B6, V3] # σු٠.- +σ‍ු٠。-; σ‍ු٠.-; [B1, B5, B6, C2, V3]; xn--4xa25ks2jenu.-; ; xn--4xa25ks2j.-; [B1, B5, B6, V3] # σු٠.- +xn--4xa25ks2j.-; σු٠.-; [B1, B5, B6, V3]; xn--4xa25ks2j.-; ; ; # σු٠.- +xn--4xa25ks2jenu.-; σ‍ු٠.-; [B1, B5, B6, C2, V3]; xn--4xa25ks2jenu.-; ; ; # σු٠.- +xn--3xa45ks2jenu.-; ς‍ු٠.-; [B1, B5, B6, C2, V3]; xn--3xa45ks2jenu.-; ; ; # ςු٠.- +Σ‍ු٠。-; σ‍ු٠.-; [B1, B5, B6, C2, V3]; xn--4xa25ks2jenu.-; ; xn--4xa25ks2j.-; [B1, B5, B6, V3] # σු٠.- +σ‍ු٠。-; σ‍ු٠.-; [B1, B5, B6, C2, V3]; xn--4xa25ks2jenu.-; ; xn--4xa25ks2j.-; [B1, B5, B6, V3] # σු٠.- +‌.ßႩ-; ; [C1, P1, V3, V6]; xn--0ug.xn----pfa042j; ; .xn--ss--4rn; [P1, V3, V6, A4_2] # .ßႩ- +‌.ßⴉ-; ; [C1, V3]; xn--0ug.xn----pfa2305a; ; .xn--ss--bi1b; [V3, A4_2] # .ßⴉ- +‌.SSႩ-; ‌.ssႩ-; [C1, P1, V3, V6]; xn--0ug.xn--ss--4rn; ; .xn--ss--4rn; [P1, V3, V6, A4_2] # .ssႩ- +‌.ssⴉ-; ; [C1, V3]; xn--0ug.xn--ss--bi1b; ; .xn--ss--bi1b; [V3, A4_2] # .ssⴉ- +‌.Ssⴉ-; ‌.ssⴉ-; [C1, V3]; xn--0ug.xn--ss--bi1b; ; .xn--ss--bi1b; [V3, A4_2] # .ssⴉ- +.xn--ss--bi1b; .ssⴉ-; [V3, X4_2]; .xn--ss--bi1b; [V3, A4_2]; ; # .ssⴉ- +xn--0ug.xn--ss--bi1b; ‌.ssⴉ-; [C1, V3]; xn--0ug.xn--ss--bi1b; ; ; # .ssⴉ- +.xn--ss--4rn; .ssႩ-; [V3, V6, X4_2]; .xn--ss--4rn; [V3, V6, A4_2]; ; # .ssႩ- +xn--0ug.xn--ss--4rn; ‌.ssႩ-; [C1, V3, V6]; xn--0ug.xn--ss--4rn; ; ; # .ssႩ- +xn--0ug.xn----pfa2305a; ‌.ßⴉ-; [C1, V3]; xn--0ug.xn----pfa2305a; ; ; # .ßⴉ- +xn--0ug.xn----pfa042j; ‌.ßႩ-; [C1, V3, V6]; xn--0ug.xn----pfa042j; ; ; # .ßႩ- +󍭲𐫍㓱。⾑; 󍭲𐫍㓱.襾; [B5, P1, V6]; xn--u7kt691dlj09f.xn--9v2a; ; ; # 𐫍㓱.襾 +󍭲𐫍㓱。襾; 󍭲𐫍㓱.襾; [B5, P1, V6]; xn--u7kt691dlj09f.xn--9v2a; ; ; # 𐫍㓱.襾 +xn--u7kt691dlj09f.xn--9v2a; 󍭲𐫍㓱.襾; [B5, V6]; xn--u7kt691dlj09f.xn--9v2a; ; ; # 𐫍㓱.襾 +ڠ𐮋𐹰≮。≯󠦗‍; ڠ𐮋𐹰≮.≯󠦗‍; [B1, B3, C2, P1, V6]; xn--2jb053lf13nyoc.xn--1ugx6gc8096c; ; xn--2jb053lf13nyoc.xn--hdh08821l; [B1, B3, P1, V6] # ڠ𐮋𐹰≮.≯ +ڠ𐮋𐹰≮。≯󠦗‍; ڠ𐮋𐹰≮.≯󠦗‍; [B1, B3, C2, P1, V6]; xn--2jb053lf13nyoc.xn--1ugx6gc8096c; ; xn--2jb053lf13nyoc.xn--hdh08821l; [B1, B3, P1, V6] # ڠ𐮋𐹰≮.≯ +xn--2jb053lf13nyoc.xn--hdh08821l; ڠ𐮋𐹰≮.≯󠦗; [B1, B3, V6]; xn--2jb053lf13nyoc.xn--hdh08821l; ; ; # ڠ𐮋𐹰≮.≯ +xn--2jb053lf13nyoc.xn--1ugx6gc8096c; ڠ𐮋𐹰≮.≯󠦗‍; [B1, B3, C2, V6]; xn--2jb053lf13nyoc.xn--1ugx6gc8096c; ; ; # ڠ𐮋𐹰≮.≯ +𝟞。񃰶ݷࢰ⩋; 6.񃰶ݷࢰ⩋; [B1, B5, B6, P1, V6]; 6.xn--7pb04do15eq748f; ; ; # 6.ݷࢰ⩋ +6。񃰶ݷࢰ⩋; 6.񃰶ݷࢰ⩋; [B1, B5, B6, P1, V6]; 6.xn--7pb04do15eq748f; ; ; # 6.ݷࢰ⩋ +6.xn--7pb04do15eq748f; 6.񃰶ݷࢰ⩋; [B1, B5, B6, V6]; 6.xn--7pb04do15eq748f; ; ; # 6.ݷࢰ⩋ +-ﳽ。𑇀𑍴; -شى.𑇀𑍴; [B1, V3, V5]; xn----qnc7d.xn--wd1d62a; ; ; # -شى.𑇀𑍴 +-ﳽ。𑇀𑍴; -شى.𑇀𑍴; [B1, V3, V5]; xn----qnc7d.xn--wd1d62a; ; ; # -شى.𑇀𑍴 +-شى。𑇀𑍴; -شى.𑇀𑍴; [B1, V3, V5]; xn----qnc7d.xn--wd1d62a; ; ; # -شى.𑇀𑍴 +xn----qnc7d.xn--wd1d62a; -شى.𑇀𑍴; [B1, V3, V5]; xn----qnc7d.xn--wd1d62a; ; ; # -شى.𑇀𑍴 +‌󠊶𝟏.ൃ򪥐𐹬󊓶; ‌󠊶1.ൃ򪥐𐹬󊓶; [B1, C1, P1, V5, V6]; xn--1-rgnu0071n.xn--mxc0872kcu37dnmem; ; xn--1-f521m.xn--mxc0872kcu37dnmem; [B1, P1, V5, V6] # 1.ൃ𐹬 +‌󠊶1.ൃ򪥐𐹬󊓶; ; [B1, C1, P1, V5, V6]; xn--1-rgnu0071n.xn--mxc0872kcu37dnmem; ; xn--1-f521m.xn--mxc0872kcu37dnmem; [B1, P1, V5, V6] # 1.ൃ𐹬 +xn--1-f521m.xn--mxc0872kcu37dnmem; 󠊶1.ൃ򪥐𐹬󊓶; [B1, V5, V6]; xn--1-f521m.xn--mxc0872kcu37dnmem; ; ; # 1.ൃ𐹬 +xn--1-rgnu0071n.xn--mxc0872kcu37dnmem; ‌󠊶1.ൃ򪥐𐹬󊓶; [B1, C1, V5, V6]; xn--1-rgnu0071n.xn--mxc0872kcu37dnmem; ; ; # 1.ൃ𐹬 +齙--𝟰.ß; 齙--4.ß; ; xn----4-p16k.xn--zca; ; xn----4-p16k.ss; # 齙--4.ß +齙--4.ß; ; ; xn----4-p16k.xn--zca; ; xn----4-p16k.ss; # 齙--4.ß +齙--4.SS; 齙--4.ss; ; xn----4-p16k.ss; ; ; # 齙--4.ss +齙--4.ss; ; ; xn----4-p16k.ss; ; ; # 齙--4.ss +齙--4.Ss; 齙--4.ss; ; xn----4-p16k.ss; ; ; # 齙--4.ss +xn----4-p16k.ss; 齙--4.ss; ; xn----4-p16k.ss; ; ; # 齙--4.ss +xn----4-p16k.xn--zca; 齙--4.ß; ; xn----4-p16k.xn--zca; ; ; # 齙--4.ß +齙--𝟰.SS; 齙--4.ss; ; xn----4-p16k.ss; ; ; # 齙--4.ss +齙--𝟰.ss; 齙--4.ss; ; xn----4-p16k.ss; ; ; # 齙--4.ss +齙--𝟰.Ss; 齙--4.ss; ; xn----4-p16k.ss; ; ; # 齙--4.ss +᯲.𐹢𞀖‌; ; [B1, C1, V5]; xn--0zf.xn--0ug9894grqqf; ; xn--0zf.xn--9n0d2296a; [B1, V5] # ᯲.𐹢𞀖 +xn--0zf.xn--9n0d2296a; ᯲.𐹢𞀖; [B1, V5]; xn--0zf.xn--9n0d2296a; ; ; # ᯲.𐹢𞀖 +xn--0zf.xn--0ug9894grqqf; ᯲.𐹢𞀖‌; [B1, C1, V5]; xn--0zf.xn--0ug9894grqqf; ; ; # ᯲.𐹢𞀖 +󃲙󠋘。?-‍; 󃲙󠋘.?-‍; [C2, P1, V6]; xn--ct86d8w51a.?-‍; [C2, P1, V6, A3]; xn--ct86d8w51a.?-; [P1, V3, V6, A3] # .- +󃲙󠋘。?-‍; 󃲙󠋘.?-‍; [C2, P1, V6]; xn--ct86d8w51a.?-‍; [C2, P1, V6, A3]; xn--ct86d8w51a.?-; [P1, V3, V6, A3] # .- +xn--ct86d8w51a.?-; 󃲙󠋘.?-; [P1, V3, V6]; xn--ct86d8w51a.?-; [P1, V3, V6, A3]; ; # .- +XN--CT86D8W51A.?-; 󃲙󠋘.?-; [P1, V3, V6]; xn--ct86d8w51a.?-; [P1, V3, V6, A3]; ; # .- +Xn--Ct86d8w51a.?-; 󃲙󠋘.?-; [P1, V3, V6]; xn--ct86d8w51a.?-; [P1, V3, V6, A3]; ; # .- +xn--ct86d8w51a.?-‍; 󃲙󠋘.?-‍; [C2, P1, V6]; xn--ct86d8w51a.?-‍; [C2, P1, V6, A3]; xn--ct86d8w51a.?-; [P1, V3, V6, A3] # .- +XN--CT86D8W51A.?-‍; 󃲙󠋘.?-‍; [C2, P1, V6]; xn--ct86d8w51a.?-‍; [C2, P1, V6, A3]; xn--ct86d8w51a.?-; [P1, V3, V6, A3] # .- +Xn--Ct86d8w51a.?-‍; 󃲙󠋘.?-‍; [C2, P1, V6]; xn--ct86d8w51a.?-‍; [C2, P1, V6, A3]; xn--ct86d8w51a.?-; [P1, V3, V6, A3] # .- +᩠.𞵷-𝪩悎; ᩠.𞵷-𝪩悎; [B1, B2, B3, B6, P1, V5, V6]; xn--jof.xn----gf4bq282iezpa; ; ; # ᩠.-𝪩悎 +᩠.𞵷-𝪩悎; ; [B1, B2, B3, B6, P1, V5, V6]; xn--jof.xn----gf4bq282iezpa; ; ; # ᩠.-𝪩悎 +xn--jof.xn----gf4bq282iezpa; ᩠.𞵷-𝪩悎; [B1, B2, B3, B6, V5, V6]; xn--jof.xn----gf4bq282iezpa; ; ; # ᩠.-𝪩悎 +𛜯󠊛.𞤳񏥾; 𛜯󠊛.𞤳񏥾; [B2, B3, B6, P1, V6]; xn--xx5gy2741c.xn--re6hw266j; ; ; # .𞤳 +𛜯󠊛.𞤳񏥾; ; [B2, B3, B6, P1, V6]; xn--xx5gy2741c.xn--re6hw266j; ; ; # .𞤳 +𛜯󠊛.𞤑񏥾; 𛜯󠊛.𞤳񏥾; [B2, B3, B6, P1, V6]; xn--xx5gy2741c.xn--re6hw266j; ; ; # .𞤳 +xn--xx5gy2741c.xn--re6hw266j; 𛜯󠊛.𞤳񏥾; [B2, B3, B6, V6]; xn--xx5gy2741c.xn--re6hw266j; ; ; # .𞤳 +𛜯󠊛.𞤑񏥾; 𛜯󠊛.𞤳񏥾; [B2, B3, B6, P1, V6]; xn--xx5gy2741c.xn--re6hw266j; ; ; # .𞤳 +ܜ𐫒خ.𐋲; ; [B1]; xn--tgb98b8643d.xn--m97c; ; ; # ܜ𐫒خ.𐋲 +xn--tgb98b8643d.xn--m97c; ܜ𐫒خ.𐋲; [B1]; xn--tgb98b8643d.xn--m97c; ; ; # ܜ𐫒خ.𐋲 +𐼑𞤓ط࣢.?; 𐼑𞤵ط࣢.?; [P1, V6]; xn--2gb08k9w69agm0g.?; [P1, V6, A3]; ; # 𐼑𞤵ط. +𐼑𞤵ط࣢.?; ; [P1, V6]; xn--2gb08k9w69agm0g.?; [P1, V6, A3]; ; # 𐼑𞤵ط. +xn--2gb08k9w69agm0g.?; 𐼑𞤵ط࣢.?; [P1, V6]; xn--2gb08k9w69agm0g.?; [P1, V6, A3]; ; # 𐼑𞤵ط. +XN--2GB08K9W69AGM0G.?; 𐼑𞤵ط࣢.?; [P1, V6]; xn--2gb08k9w69agm0g.?; [P1, V6, A3]; ; # 𐼑𞤵ط. +Xn--2gb08k9w69agm0g.?; 𐼑𞤵ط࣢.?; [P1, V6]; xn--2gb08k9w69agm0g.?; [P1, V6, A3]; ; # 𐼑𞤵ط. +Ↄ。᳔੍𞷣; Ↄ.᳔੍𞷣; [B1, P1, V5, V6]; xn--q5g.xn--ybc995g0835a; ; ; # Ↄ.᳔੍ +Ↄ。᳔੍𞷣; Ↄ.᳔੍𞷣; [B1, P1, V5, V6]; xn--q5g.xn--ybc995g0835a; ; ; # Ↄ.᳔੍ +ↄ。᳔੍𞷣; ↄ.᳔੍𞷣; [B1, P1, V5, V6]; xn--r5g.xn--ybc995g0835a; ; ; # ↄ.᳔੍ +xn--r5g.xn--ybc995g0835a; ↄ.᳔੍𞷣; [B1, V5, V6]; xn--r5g.xn--ybc995g0835a; ; ; # ↄ.᳔੍ +xn--q5g.xn--ybc995g0835a; Ↄ.᳔੍𞷣; [B1, V5, V6]; xn--q5g.xn--ybc995g0835a; ; ; # Ↄ.᳔੍ +ↄ。᳔੍𞷣; ↄ.᳔੍𞷣; [B1, P1, V5, V6]; xn--r5g.xn--ybc995g0835a; ; ; # ↄ.᳔੍ +󠪢-。򛂏≮𑜫; 󠪢-.򛂏≮𑜫; [P1, V3, V6]; xn----bh61m.xn--gdhz157g0em1d; ; ; # -.≮𑜫 +󠪢-。򛂏≮𑜫; 󠪢-.򛂏≮𑜫; [P1, V3, V6]; xn----bh61m.xn--gdhz157g0em1d; ; ; # -.≮𑜫 +xn----bh61m.xn--gdhz157g0em1d; 󠪢-.򛂏≮𑜫; [V3, V6]; xn----bh61m.xn--gdhz157g0em1d; ; ; # -.≮𑜫 +‌󠉹‍。򌿧≮Ⴉ; ‌󠉹‍.򌿧≮Ⴉ; [C1, C2, P1, V6]; xn--0ugc90904y.xn--hnd112gpz83n; ; xn--3n36e.xn--hnd112gpz83n; [P1, V6] # .≮Ⴉ +‌󠉹‍。򌿧≮Ⴉ; ‌󠉹‍.򌿧≮Ⴉ; [C1, C2, P1, V6]; xn--0ugc90904y.xn--hnd112gpz83n; ; xn--3n36e.xn--hnd112gpz83n; [P1, V6] # .≮Ⴉ +‌󠉹‍。򌿧≮ⴉ; ‌󠉹‍.򌿧≮ⴉ; [C1, C2, P1, V6]; xn--0ugc90904y.xn--gdh992byu01p; ; xn--3n36e.xn--gdh992byu01p; [P1, V6] # .≮ⴉ +‌󠉹‍。򌿧≮ⴉ; ‌󠉹‍.򌿧≮ⴉ; [C1, C2, P1, V6]; xn--0ugc90904y.xn--gdh992byu01p; ; xn--3n36e.xn--gdh992byu01p; [P1, V6] # .≮ⴉ +xn--3n36e.xn--gdh992byu01p; 󠉹.򌿧≮ⴉ; [V6]; xn--3n36e.xn--gdh992byu01p; ; ; # .≮ⴉ +xn--0ugc90904y.xn--gdh992byu01p; ‌󠉹‍.򌿧≮ⴉ; [C1, C2, V6]; xn--0ugc90904y.xn--gdh992byu01p; ; ; # .≮ⴉ +xn--3n36e.xn--hnd112gpz83n; 󠉹.򌿧≮Ⴉ; [V6]; xn--3n36e.xn--hnd112gpz83n; ; ; # .≮Ⴉ +xn--0ugc90904y.xn--hnd112gpz83n; ‌󠉹‍.򌿧≮Ⴉ; [C1, C2, V6]; xn--0ugc90904y.xn--hnd112gpz83n; ; ; # .≮Ⴉ +𐹯-𑄴ࢼ。︒䖐⾆; 𐹯-𑄴ࢼ.︒䖐舌; [B1, P1, V6]; xn----rpd7902rclc.xn--fpo216mn07e; ; ; # 𐹯-𑄴ࢼ.︒䖐舌 +𐹯-𑄴ࢼ。。䖐舌; 𐹯-𑄴ࢼ..䖐舌; [B1, X4_2]; xn----rpd7902rclc..xn--fpo216m; [B1, A4_2]; ; # 𐹯-𑄴ࢼ..䖐舌 +xn----rpd7902rclc..xn--fpo216m; 𐹯-𑄴ࢼ..䖐舌; [B1, X4_2]; xn----rpd7902rclc..xn--fpo216m; [B1, A4_2]; ; # 𐹯-𑄴ࢼ..䖐舌 +xn----rpd7902rclc.xn--fpo216mn07e; 𐹯-𑄴ࢼ.︒䖐舌; [B1, V6]; xn----rpd7902rclc.xn--fpo216mn07e; ; ; # 𐹯-𑄴ࢼ.︒䖐舌 +𝪞Ⴐ。쪡; 𝪞Ⴐ.쪡; [P1, V5, V6]; xn--ond3755u.xn--pi6b; ; ; # 𝪞Ⴐ.쪡 +𝪞Ⴐ。쪡; 𝪞Ⴐ.쪡; [P1, V5, V6]; xn--ond3755u.xn--pi6b; ; ; # 𝪞Ⴐ.쪡 +𝪞Ⴐ。쪡; 𝪞Ⴐ.쪡; [P1, V5, V6]; xn--ond3755u.xn--pi6b; ; ; # 𝪞Ⴐ.쪡 +𝪞Ⴐ。쪡; 𝪞Ⴐ.쪡; [P1, V5, V6]; xn--ond3755u.xn--pi6b; ; ; # 𝪞Ⴐ.쪡 +𝪞ⴐ。쪡; 𝪞ⴐ.쪡; [V5]; xn--7kj1858k.xn--pi6b; ; ; # 𝪞ⴐ.쪡 +𝪞ⴐ。쪡; 𝪞ⴐ.쪡; [V5]; xn--7kj1858k.xn--pi6b; ; ; # 𝪞ⴐ.쪡 +xn--7kj1858k.xn--pi6b; 𝪞ⴐ.쪡; [V5]; xn--7kj1858k.xn--pi6b; ; ; # 𝪞ⴐ.쪡 +xn--ond3755u.xn--pi6b; 𝪞Ⴐ.쪡; [V5, V6]; xn--ond3755u.xn--pi6b; ; ; # 𝪞Ⴐ.쪡 +𝪞ⴐ。쪡; 𝪞ⴐ.쪡; [V5]; xn--7kj1858k.xn--pi6b; ; ; # 𝪞ⴐ.쪡 +𝪞ⴐ。쪡; 𝪞ⴐ.쪡; [V5]; xn--7kj1858k.xn--pi6b; ; ; # 𝪞ⴐ.쪡 +ฺ쩁𐹬.􋉳; ; [B1, P1, V5, V6]; xn--o4c4837g2zvb.xn--5f70g; ; ; # ฺ쩁𐹬. +ฺ쩁𐹬.􋉳; ฺ쩁𐹬.􋉳; [B1, P1, V5, V6]; xn--o4c4837g2zvb.xn--5f70g; ; ; # ฺ쩁𐹬. +xn--o4c4837g2zvb.xn--5f70g; ฺ쩁𐹬.􋉳; [B1, V5, V6]; xn--o4c4837g2zvb.xn--5f70g; ; ; # ฺ쩁𐹬. +ᡅ0‌。⎢󤨄; ᡅ0‌.⎢󤨄; [C1, P1, V6]; xn--0-z6jy93b.xn--8lh28773l; ; xn--0-z6j.xn--8lh28773l; [P1, V6] # ᡅ0.⎢ +ᡅ0‌。⎢󤨄; ᡅ0‌.⎢󤨄; [C1, P1, V6]; xn--0-z6jy93b.xn--8lh28773l; ; xn--0-z6j.xn--8lh28773l; [P1, V6] # ᡅ0.⎢ +xn--0-z6j.xn--8lh28773l; ᡅ0.⎢󤨄; [V6]; xn--0-z6j.xn--8lh28773l; ; ; # ᡅ0.⎢ +xn--0-z6jy93b.xn--8lh28773l; ᡅ0‌.⎢󤨄; [C1, V6]; xn--0-z6jy93b.xn--8lh28773l; ; ; # ᡅ0.⎢ +𲮚9ꍩ៓.‍ß; 𲮚9ꍩ៓.‍ß; [C2, P1, V6]; xn--9-i0j5967eg3qz.xn--zca770n; ; xn--9-i0j5967eg3qz.ss; [P1, V6] # 9ꍩ៓.ß +𲮚9ꍩ៓.‍ß; ; [C2, P1, V6]; xn--9-i0j5967eg3qz.xn--zca770n; ; xn--9-i0j5967eg3qz.ss; [P1, V6] # 9ꍩ៓.ß +𲮚9ꍩ៓.‍SS; 𲮚9ꍩ៓.‍ss; [C2, P1, V6]; xn--9-i0j5967eg3qz.xn--ss-l1t; ; xn--9-i0j5967eg3qz.ss; [P1, V6] # 9ꍩ៓.ss +𲮚9ꍩ៓.‍ss; ; [C2, P1, V6]; xn--9-i0j5967eg3qz.xn--ss-l1t; ; xn--9-i0j5967eg3qz.ss; [P1, V6] # 9ꍩ៓.ss +xn--9-i0j5967eg3qz.ss; 𲮚9ꍩ៓.ss; [V6]; xn--9-i0j5967eg3qz.ss; ; ; # 9ꍩ៓.ss +xn--9-i0j5967eg3qz.xn--ss-l1t; 𲮚9ꍩ៓.‍ss; [C2, V6]; xn--9-i0j5967eg3qz.xn--ss-l1t; ; ; # 9ꍩ៓.ss +xn--9-i0j5967eg3qz.xn--zca770n; 𲮚9ꍩ៓.‍ß; [C2, V6]; xn--9-i0j5967eg3qz.xn--zca770n; ; ; # 9ꍩ៓.ß +𲮚9ꍩ៓.‍SS; 𲮚9ꍩ៓.‍ss; [C2, P1, V6]; xn--9-i0j5967eg3qz.xn--ss-l1t; ; xn--9-i0j5967eg3qz.ss; [P1, V6] # 9ꍩ៓.ss +𲮚9ꍩ៓.‍ss; 𲮚9ꍩ៓.‍ss; [C2, P1, V6]; xn--9-i0j5967eg3qz.xn--ss-l1t; ; xn--9-i0j5967eg3qz.ss; [P1, V6] # 9ꍩ៓.ss +𲮚9ꍩ៓.‍Ss; 𲮚9ꍩ៓.‍ss; [C2, P1, V6]; xn--9-i0j5967eg3qz.xn--ss-l1t; ; xn--9-i0j5967eg3qz.ss; [P1, V6] # 9ꍩ៓.ss +𲮚9ꍩ៓.‍Ss; 𲮚9ꍩ៓.‍ss; [C2, P1, V6]; xn--9-i0j5967eg3qz.xn--ss-l1t; ; xn--9-i0j5967eg3qz.ss; [P1, V6] # 9ꍩ៓.ss +ꗷ𑆀.ݝ𐩒; ; ; xn--ju8a625r.xn--hpb0073k; ; ; # ꗷ𑆀.ݝ𐩒 +xn--ju8a625r.xn--hpb0073k; ꗷ𑆀.ݝ𐩒; ; xn--ju8a625r.xn--hpb0073k; ; ; # ꗷ𑆀.ݝ𐩒 +⒐≯-。︒򩑣-񞛠; ⒐≯-.︒򩑣-񞛠; [P1, V3, V6]; xn----ogot9g.xn----n89hl0522az9u2a; ; ; # ⒐≯-.︒- +⒐≯-。︒򩑣-񞛠; ⒐≯-.︒򩑣-񞛠; [P1, V3, V6]; xn----ogot9g.xn----n89hl0522az9u2a; ; ; # ⒐≯-.︒- +9.≯-。。򩑣-񞛠; 9.≯-..򩑣-񞛠; [P1, V3, V6, X4_2]; 9.xn----ogo..xn----xj54d1s69k; [P1, V3, V6, A4_2]; ; # 9.≯-..- +9.≯-。。򩑣-񞛠; 9.≯-..򩑣-񞛠; [P1, V3, V6, X4_2]; 9.xn----ogo..xn----xj54d1s69k; [P1, V3, V6, A4_2]; ; # 9.≯-..- +9.xn----ogo..xn----xj54d1s69k; 9.≯-..򩑣-񞛠; [V3, V6, X4_2]; 9.xn----ogo..xn----xj54d1s69k; [V3, V6, A4_2]; ; # 9.≯-..- +xn----ogot9g.xn----n89hl0522az9u2a; ⒐≯-.︒򩑣-񞛠; [V3, V6]; xn----ogot9g.xn----n89hl0522az9u2a; ; ; # ⒐≯-.︒- +򈪚ೣჁ󠢏.؝; 򈪚ೣჁ󠢏.؝; [B6, P1, V6]; xn--vuc49qvu85xmju7a.xn--cgb; ; ; # ೣჁ. +򈪚ೣჁ󠢏.؝; ; [B6, P1, V6]; xn--vuc49qvu85xmju7a.xn--cgb; ; ; # ೣჁ. +򈪚ೣⴡ󠢏.؝; ; [B6, P1, V6]; xn--vuc226n8n28lmju7a.xn--cgb; ; ; # ೣⴡ. +xn--vuc226n8n28lmju7a.xn--cgb; 򈪚ೣⴡ󠢏.؝; [B6, V6]; xn--vuc226n8n28lmju7a.xn--cgb; ; ; # ೣⴡ. +xn--vuc49qvu85xmju7a.xn--cgb; 򈪚ೣჁ󠢏.؝; [B6, V6]; xn--vuc49qvu85xmju7a.xn--cgb; ; ; # ೣჁ. +򈪚ೣⴡ󠢏.؝; 򈪚ೣⴡ󠢏.؝; [B6, P1, V6]; xn--vuc226n8n28lmju7a.xn--cgb; ; ; # ೣⴡ. +ᷫ。𐋩ظ-𐫮; ᷫ.𐋩ظ-𐫮; [B1, B3, B6, V5]; xn--gfg.xn----xnc0815qyyg; ; ; # ᷫ.𐋩ظ-𐫮 +xn--gfg.xn----xnc0815qyyg; ᷫ.𐋩ظ-𐫮; [B1, B3, B6, V5]; xn--gfg.xn----xnc0815qyyg; ; ; # ᷫ.𐋩ظ-𐫮 +싇。⾇𐳋Ⴝ; 싇.舛𐳋Ⴝ; [B5, P1, V6]; xn--9u4b.xn--1nd7519ch79d; ; ; # 싇.舛𐳋Ⴝ +싇。⾇𐳋Ⴝ; 싇.舛𐳋Ⴝ; [B5, P1, V6]; xn--9u4b.xn--1nd7519ch79d; ; ; # 싇.舛𐳋Ⴝ +싇。舛𐳋Ⴝ; 싇.舛𐳋Ⴝ; [B5, P1, V6]; xn--9u4b.xn--1nd7519ch79d; ; ; # 싇.舛𐳋Ⴝ +싇。舛𐳋Ⴝ; 싇.舛𐳋Ⴝ; [B5, P1, V6]; xn--9u4b.xn--1nd7519ch79d; ; ; # 싇.舛𐳋Ⴝ +싇。舛𐳋ⴝ; 싇.舛𐳋ⴝ; [B5]; xn--9u4b.xn--llj123yh74e; ; ; # 싇.舛𐳋ⴝ +싇。舛𐳋ⴝ; 싇.舛𐳋ⴝ; [B5]; xn--9u4b.xn--llj123yh74e; ; ; # 싇.舛𐳋ⴝ +싇。舛𐲋Ⴝ; 싇.舛𐳋Ⴝ; [B5, P1, V6]; xn--9u4b.xn--1nd7519ch79d; ; ; # 싇.舛𐳋Ⴝ +싇。舛𐲋Ⴝ; 싇.舛𐳋Ⴝ; [B5, P1, V6]; xn--9u4b.xn--1nd7519ch79d; ; ; # 싇.舛𐳋Ⴝ +싇。舛𐲋ⴝ; 싇.舛𐳋ⴝ; [B5]; xn--9u4b.xn--llj123yh74e; ; ; # 싇.舛𐳋ⴝ +싇。舛𐲋ⴝ; 싇.舛𐳋ⴝ; [B5]; xn--9u4b.xn--llj123yh74e; ; ; # 싇.舛𐳋ⴝ +xn--9u4b.xn--llj123yh74e; 싇.舛𐳋ⴝ; [B5]; xn--9u4b.xn--llj123yh74e; ; ; # 싇.舛𐳋ⴝ +xn--9u4b.xn--1nd7519ch79d; 싇.舛𐳋Ⴝ; [B5, V6]; xn--9u4b.xn--1nd7519ch79d; ; ; # 싇.舛𐳋Ⴝ +싇。⾇𐳋ⴝ; 싇.舛𐳋ⴝ; [B5]; xn--9u4b.xn--llj123yh74e; ; ; # 싇.舛𐳋ⴝ +싇。⾇𐳋ⴝ; 싇.舛𐳋ⴝ; [B5]; xn--9u4b.xn--llj123yh74e; ; ; # 싇.舛𐳋ⴝ +싇。⾇𐲋Ⴝ; 싇.舛𐳋Ⴝ; [B5, P1, V6]; xn--9u4b.xn--1nd7519ch79d; ; ; # 싇.舛𐳋Ⴝ +싇。⾇𐲋Ⴝ; 싇.舛𐳋Ⴝ; [B5, P1, V6]; xn--9u4b.xn--1nd7519ch79d; ; ; # 싇.舛𐳋Ⴝ +싇。⾇𐲋ⴝ; 싇.舛𐳋ⴝ; [B5]; xn--9u4b.xn--llj123yh74e; ; ; # 싇.舛𐳋ⴝ +싇。⾇𐲋ⴝ; 싇.舛𐳋ⴝ; [B5]; xn--9u4b.xn--llj123yh74e; ; ; # 싇.舛𐳋ⴝ +𐹠ς。‌ڿჀ; 𐹠ς.‌ڿჀ; [B1, C1, P1, V6]; xn--3xa1267k.xn--ykb632cvxm; ; xn--4xa9167k.xn--ykb632c; [B1, B2, B3, P1, V6] # 𐹠ς.ڿჀ +𐹠ς。‌ڿⴠ; 𐹠ς.‌ڿⴠ; [B1, C1]; xn--3xa1267k.xn--ykb760k9hj; ; xn--4xa9167k.xn--ykb467q; [B1, B2, B3] # 𐹠ς.ڿⴠ +𐹠Σ。‌ڿჀ; 𐹠σ.‌ڿჀ; [B1, C1, P1, V6]; xn--4xa9167k.xn--ykb632cvxm; ; xn--4xa9167k.xn--ykb632c; [B1, B2, B3, P1, V6] # 𐹠σ.ڿჀ +𐹠σ。‌ڿⴠ; 𐹠σ.‌ڿⴠ; [B1, C1]; xn--4xa9167k.xn--ykb760k9hj; ; xn--4xa9167k.xn--ykb467q; [B1, B2, B3] # 𐹠σ.ڿⴠ +𐹠Σ。‌ڿⴠ; 𐹠σ.‌ڿⴠ; [B1, C1]; xn--4xa9167k.xn--ykb760k9hj; ; xn--4xa9167k.xn--ykb467q; [B1, B2, B3] # 𐹠σ.ڿⴠ +xn--4xa9167k.xn--ykb467q; 𐹠σ.ڿⴠ; [B1, B2, B3]; xn--4xa9167k.xn--ykb467q; ; ; # 𐹠σ.ڿⴠ +xn--4xa9167k.xn--ykb760k9hj; 𐹠σ.‌ڿⴠ; [B1, C1]; xn--4xa9167k.xn--ykb760k9hj; ; ; # 𐹠σ.ڿⴠ +xn--4xa9167k.xn--ykb632c; 𐹠σ.ڿჀ; [B1, B2, B3, V6]; xn--4xa9167k.xn--ykb632c; ; ; # 𐹠σ.ڿჀ +xn--4xa9167k.xn--ykb632cvxm; 𐹠σ.‌ڿჀ; [B1, C1, V6]; xn--4xa9167k.xn--ykb632cvxm; ; ; # 𐹠σ.ڿჀ +xn--3xa1267k.xn--ykb760k9hj; 𐹠ς.‌ڿⴠ; [B1, C1]; xn--3xa1267k.xn--ykb760k9hj; ; ; # 𐹠ς.ڿⴠ +xn--3xa1267k.xn--ykb632cvxm; 𐹠ς.‌ڿჀ; [B1, C1, V6]; xn--3xa1267k.xn--ykb632cvxm; ; ; # 𐹠ς.ڿჀ +򇒐‌؄.ښ-ß; ; [B2, B3, B5, B6, C1, P1, V6]; xn--mfb144kqo32m.xn----qfa315b; ; xn--mfb98261i.xn---ss-sdf; [B2, B3, B5, B6, P1, V6] # .ښ-ß +򇒐‌؄.ښ-SS; 򇒐‌؄.ښ-ss; [B2, B3, B5, B6, C1, P1, V6]; xn--mfb144kqo32m.xn---ss-sdf; ; xn--mfb98261i.xn---ss-sdf; [B2, B3, B5, B6, P1, V6] # .ښ-ss +򇒐‌؄.ښ-ss; ; [B2, B3, B5, B6, C1, P1, V6]; xn--mfb144kqo32m.xn---ss-sdf; ; xn--mfb98261i.xn---ss-sdf; [B2, B3, B5, B6, P1, V6] # .ښ-ss +򇒐‌؄.ښ-Ss; 򇒐‌؄.ښ-ss; [B2, B3, B5, B6, C1, P1, V6]; xn--mfb144kqo32m.xn---ss-sdf; ; xn--mfb98261i.xn---ss-sdf; [B2, B3, B5, B6, P1, V6] # .ښ-ss +xn--mfb98261i.xn---ss-sdf; 򇒐؄.ښ-ss; [B2, B3, B5, B6, V6]; xn--mfb98261i.xn---ss-sdf; ; ; # .ښ-ss +xn--mfb144kqo32m.xn---ss-sdf; 򇒐‌؄.ښ-ss; [B2, B3, B5, B6, C1, V6]; xn--mfb144kqo32m.xn---ss-sdf; ; ; # .ښ-ss +xn--mfb144kqo32m.xn----qfa315b; 򇒐‌؄.ښ-ß; [B2, B3, B5, B6, C1, V6]; xn--mfb144kqo32m.xn----qfa315b; ; ; # .ښ-ß +‌‍឵ٺ.-ﮰ󅄞𐸚; ‌‍឵ٺ.-ۓ󅄞𐸚; [B1, C1, C2, P1, V3, V6]; xn--zib539f8igea.xn----twc1133r17r6g; ; xn--zib539f.xn----twc1133r17r6g; [B1, P1, V3, V5, V6] # ٺ.-ۓ +‌‍឵ٺ.-ۓ󅄞𐸚; ; [B1, C1, C2, P1, V3, V6]; xn--zib539f8igea.xn----twc1133r17r6g; ; xn--zib539f.xn----twc1133r17r6g; [B1, P1, V3, V5, V6] # ٺ.-ۓ +‌‍឵ٺ.-ۓ󅄞𐸚; ‌‍឵ٺ.-ۓ󅄞𐸚; [B1, C1, C2, P1, V3, V6]; xn--zib539f8igea.xn----twc1133r17r6g; ; xn--zib539f.xn----twc1133r17r6g; [B1, P1, V3, V5, V6] # ٺ.-ۓ +xn--zib539f.xn----twc1133r17r6g; ឵ٺ.-ۓ󅄞𐸚; [B1, V3, V5, V6]; xn--zib539f.xn----twc1133r17r6g; ; ; # ٺ.-ۓ +xn--zib539f8igea.xn----twc1133r17r6g; ‌‍឵ٺ.-ۓ󅄞𐸚; [B1, C1, C2, V3, V6]; xn--zib539f8igea.xn----twc1133r17r6g; ; ; # ٺ.-ۓ +򡶱。𐮬≠; 򡶱.𐮬≠; [B3, P1, V6]; xn--dd55c.xn--1ch3003g; ; ; # .𐮬≠ +򡶱。𐮬≠; 򡶱.𐮬≠; [B3, P1, V6]; xn--dd55c.xn--1ch3003g; ; ; # .𐮬≠ +򡶱。𐮬≠; 򡶱.𐮬≠; [B3, P1, V6]; xn--dd55c.xn--1ch3003g; ; ; # .𐮬≠ +򡶱。𐮬≠; 򡶱.𐮬≠; [B3, P1, V6]; xn--dd55c.xn--1ch3003g; ; ; # .𐮬≠ +xn--dd55c.xn--1ch3003g; 򡶱.𐮬≠; [B3, V6]; xn--dd55c.xn--1ch3003g; ; ; # .𐮬≠ +ྲ𞶅。𐹮𐹷덝۵; ྲ𞶅.𐹮𐹷덝۵; [B1, P1, V5, V6]; xn--fgd0675v.xn--imb5839fidpcbba; ; ; # ྲ.𐹮𐹷덝۵ +ྲ𞶅。𐹮𐹷덝۵; ྲ𞶅.𐹮𐹷덝۵; [B1, P1, V5, V6]; xn--fgd0675v.xn--imb5839fidpcbba; ; ; # ྲ.𐹮𐹷덝۵ +ྲ𞶅。𐹮𐹷덝۵; ྲ𞶅.𐹮𐹷덝۵; [B1, P1, V5, V6]; xn--fgd0675v.xn--imb5839fidpcbba; ; ; # ྲ.𐹮𐹷덝۵ +ྲ𞶅。𐹮𐹷덝۵; ྲ𞶅.𐹮𐹷덝۵; [B1, P1, V5, V6]; xn--fgd0675v.xn--imb5839fidpcbba; ; ; # ྲ.𐹮𐹷덝۵ +xn--fgd0675v.xn--imb5839fidpcbba; ྲ𞶅.𐹮𐹷덝۵; [B1, V5, V6]; xn--fgd0675v.xn--imb5839fidpcbba; ; ; # ྲ.𐹮𐹷덝۵ +Ⴏ󠅋-.‍Ⴉ; Ⴏ-.‍Ⴉ; [C2, P1, V3, V6]; xn----00g.xn--hnd399e; ; xn----00g.xn--hnd; [P1, V3, V6] # Ⴏ-.Ⴉ +Ⴏ󠅋-.‍Ⴉ; Ⴏ-.‍Ⴉ; [C2, P1, V3, V6]; xn----00g.xn--hnd399e; ; xn----00g.xn--hnd; [P1, V3, V6] # Ⴏ-.Ⴉ +ⴏ󠅋-.‍ⴉ; ⴏ-.‍ⴉ; [C2, V3]; xn----3vs.xn--1ug532c; ; xn----3vs.xn--0kj; [V3] # ⴏ-.ⴉ +xn----3vs.xn--0kj; ⴏ-.ⴉ; [V3]; xn----3vs.xn--0kj; ; ; # ⴏ-.ⴉ +xn----3vs.xn--1ug532c; ⴏ-.‍ⴉ; [C2, V3]; xn----3vs.xn--1ug532c; ; ; # ⴏ-.ⴉ +xn----00g.xn--hnd; Ⴏ-.Ⴉ; [V3, V6]; xn----00g.xn--hnd; ; ; # Ⴏ-.Ⴉ +xn----00g.xn--hnd399e; Ⴏ-.‍Ⴉ; [C2, V3, V6]; xn----00g.xn--hnd399e; ; ; # Ⴏ-.Ⴉ +ⴏ󠅋-.‍ⴉ; ⴏ-.‍ⴉ; [C2, V3]; xn----3vs.xn--1ug532c; ; xn----3vs.xn--0kj; [V3] # ⴏ-.ⴉ +⇧𐨏󠾈󯶅。؀󠈵󠆉; ⇧𐨏󠾈󯶅.؀󠈵; [B1, P1, V6]; xn--l8g5552g64t4g46xf.xn--ifb08144p; ; ; # ⇧𐨏. +xn--l8g5552g64t4g46xf.xn--ifb08144p; ⇧𐨏󠾈󯶅.؀󠈵; [B1, V6]; xn--l8g5552g64t4g46xf.xn--ifb08144p; ; ; # ⇧𐨏. +≠𐮂.↑🄇⒈; ; [B1, P1, V6]; xn--1chy492g.xn--45gx9iuy44d; ; ; # ≠𐮂.↑🄇⒈ +≠𐮂.↑🄇⒈; ≠𐮂.↑🄇⒈; [B1, P1, V6]; xn--1chy492g.xn--45gx9iuy44d; ; ; # ≠𐮂.↑🄇⒈ +≠𐮂.↑6,1.; ; [B1, P1, V6]; xn--1chy492g.xn--6,1-pw1a.; ; ; # ≠𐮂.↑6,1. +≠𐮂.↑6,1.; ≠𐮂.↑6,1.; [B1, P1, V6]; xn--1chy492g.xn--6,1-pw1a.; ; ; # ≠𐮂.↑6,1. +xn--1chy492g.xn--6,1-pw1a.; ≠𐮂.↑6,1.; [B1, P1, V6]; xn--1chy492g.xn--6,1-pw1a.; ; ; # ≠𐮂.↑6,1. +xn--1chy492g.xn--45gx9iuy44d; ≠𐮂.↑🄇⒈; [B1, V6]; xn--1chy492g.xn--45gx9iuy44d; ; ; # ≠𐮂.↑🄇⒈ +𝩏󠲉ß.ᢤ򄦌‌𐹫; ; [B1, B5, B6, C1, P1, V5, V6]; xn--zca3153vupz3e.xn--ubf609atw1tynn3d; ; xn--ss-zb11ap1427e.xn--ubf2596jbt61c; [B1, B5, B6, P1, V5, V6] # 𝩏ß.ᢤ𐹫 +𝩏󠲉SS.ᢤ򄦌‌𐹫; 𝩏󠲉ss.ᢤ򄦌‌𐹫; [B1, B5, B6, C1, P1, V5, V6]; xn--ss-zb11ap1427e.xn--ubf609atw1tynn3d; ; xn--ss-zb11ap1427e.xn--ubf2596jbt61c; [B1, B5, B6, P1, V5, V6] # 𝩏ss.ᢤ𐹫 +𝩏󠲉ss.ᢤ򄦌‌𐹫; ; [B1, B5, B6, C1, P1, V5, V6]; xn--ss-zb11ap1427e.xn--ubf609atw1tynn3d; ; xn--ss-zb11ap1427e.xn--ubf2596jbt61c; [B1, B5, B6, P1, V5, V6] # 𝩏ss.ᢤ𐹫 +𝩏󠲉Ss.ᢤ򄦌‌𐹫; 𝩏󠲉ss.ᢤ򄦌‌𐹫; [B1, B5, B6, C1, P1, V5, V6]; xn--ss-zb11ap1427e.xn--ubf609atw1tynn3d; ; xn--ss-zb11ap1427e.xn--ubf2596jbt61c; [B1, B5, B6, P1, V5, V6] # 𝩏ss.ᢤ𐹫 +xn--ss-zb11ap1427e.xn--ubf2596jbt61c; 𝩏󠲉ss.ᢤ򄦌𐹫; [B1, B5, B6, V5, V6]; xn--ss-zb11ap1427e.xn--ubf2596jbt61c; ; ; # 𝩏ss.ᢤ𐹫 +xn--ss-zb11ap1427e.xn--ubf609atw1tynn3d; 𝩏󠲉ss.ᢤ򄦌‌𐹫; [B1, B5, B6, C1, V5, V6]; xn--ss-zb11ap1427e.xn--ubf609atw1tynn3d; ; ; # 𝩏ss.ᢤ𐹫 +xn--zca3153vupz3e.xn--ubf609atw1tynn3d; 𝩏󠲉ß.ᢤ򄦌‌𐹫; [B1, B5, B6, C1, V5, V6]; xn--zca3153vupz3e.xn--ubf609atw1tynn3d; ; ; # 𝩏ß.ᢤ𐹫 +ß𐵳񗘁Ⴇ。ꙺ; ß𐵳񗘁Ⴇ.ꙺ; [B1, B3, B5, B6, P1, V5, V6]; xn--zca491fci5qkn79a.xn--9x8a; ; xn--ss-rek7420r4hs7b.xn--9x8a; # ßႧ.ꙺ +ß𐵳񗘁Ⴇ。ꙺ; ß𐵳񗘁Ⴇ.ꙺ; [B1, B3, B5, B6, P1, V5, V6]; xn--zca491fci5qkn79a.xn--9x8a; ; xn--ss-rek7420r4hs7b.xn--9x8a; # ßႧ.ꙺ +ß𐵳񗘁ⴇ。ꙺ; ß𐵳񗘁ⴇ.ꙺ; [B1, B3, B5, B6, P1, V5, V6]; xn--zca227tpy4lkns1b.xn--9x8a; ; xn--ss-e61ar955h4hs7b.xn--9x8a; # ßⴇ.ꙺ +SS𐵳񗘁Ⴇ。ꙺ; ss𐵳񗘁Ⴇ.ꙺ; [B1, B3, B5, B6, P1, V5, V6]; xn--ss-rek7420r4hs7b.xn--9x8a; ; ; # ssႧ.ꙺ +ss𐵳񗘁ⴇ。ꙺ; ss𐵳񗘁ⴇ.ꙺ; [B1, B3, B5, B6, P1, V5, V6]; xn--ss-e61ar955h4hs7b.xn--9x8a; ; ; # ssⴇ.ꙺ +Ss𐵳񗘁Ⴇ。ꙺ; ss𐵳񗘁Ⴇ.ꙺ; [B1, B3, B5, B6, P1, V5, V6]; xn--ss-rek7420r4hs7b.xn--9x8a; ; ; # ssႧ.ꙺ +xn--ss-rek7420r4hs7b.xn--9x8a; ss𐵳񗘁Ⴇ.ꙺ; [B1, B3, B5, B6, V5, V6]; xn--ss-rek7420r4hs7b.xn--9x8a; ; ; # ssႧ.ꙺ +xn--ss-e61ar955h4hs7b.xn--9x8a; ss𐵳񗘁ⴇ.ꙺ; [B1, B3, B5, B6, V5, V6]; xn--ss-e61ar955h4hs7b.xn--9x8a; ; ; # ssⴇ.ꙺ +xn--zca227tpy4lkns1b.xn--9x8a; ß𐵳񗘁ⴇ.ꙺ; [B1, B3, B5, B6, V5, V6]; xn--zca227tpy4lkns1b.xn--9x8a; ; ; # ßⴇ.ꙺ +xn--zca491fci5qkn79a.xn--9x8a; ß𐵳񗘁Ⴇ.ꙺ; [B1, B3, B5, B6, V5, V6]; xn--zca491fci5qkn79a.xn--9x8a; ; ; # ßႧ.ꙺ +ß𐵳񗘁ⴇ。ꙺ; ß𐵳񗘁ⴇ.ꙺ; [B1, B3, B5, B6, P1, V5, V6]; xn--zca227tpy4lkns1b.xn--9x8a; ; xn--ss-e61ar955h4hs7b.xn--9x8a; # ßⴇ.ꙺ +SS𐵳񗘁Ⴇ。ꙺ; ss𐵳񗘁Ⴇ.ꙺ; [B1, B3, B5, B6, P1, V5, V6]; xn--ss-rek7420r4hs7b.xn--9x8a; ; ; # ssႧ.ꙺ +ss𐵳񗘁ⴇ。ꙺ; ss𐵳񗘁ⴇ.ꙺ; [B1, B3, B5, B6, P1, V5, V6]; xn--ss-e61ar955h4hs7b.xn--9x8a; ; ; # ssⴇ.ꙺ +Ss𐵳񗘁Ⴇ。ꙺ; ss𐵳񗘁Ⴇ.ꙺ; [B1, B3, B5, B6, P1, V5, V6]; xn--ss-rek7420r4hs7b.xn--9x8a; ; ; # ssႧ.ꙺ +᜔。󠆣-𑋪; ᜔.-𑋪; [V3, V5]; xn--fze.xn----ly8i; ; ; # ᜔.-𑋪 +xn--fze.xn----ly8i; ᜔.-𑋪; [V3, V5]; xn--fze.xn----ly8i; ; ; # ᜔.-𑋪 +ꯨ-.򨏜ֽß; ꯨ-.򨏜ֽß; [P1, V3, V5, V6]; xn----pw5e.xn--zca50wfv060a; ; xn----pw5e.xn--ss-7jd10716y; # ꯨ-.ֽß +ꯨ-.򨏜ֽß; ; [P1, V3, V5, V6]; xn----pw5e.xn--zca50wfv060a; ; xn----pw5e.xn--ss-7jd10716y; # ꯨ-.ֽß +ꯨ-.򨏜ֽSS; ꯨ-.򨏜ֽss; [P1, V3, V5, V6]; xn----pw5e.xn--ss-7jd10716y; ; ; # ꯨ-.ֽss +ꯨ-.򨏜ֽss; ; [P1, V3, V5, V6]; xn----pw5e.xn--ss-7jd10716y; ; ; # ꯨ-.ֽss +ꯨ-.򨏜ֽSs; ꯨ-.򨏜ֽss; [P1, V3, V5, V6]; xn----pw5e.xn--ss-7jd10716y; ; ; # ꯨ-.ֽss +xn----pw5e.xn--ss-7jd10716y; ꯨ-.򨏜ֽss; [V3, V5, V6]; xn----pw5e.xn--ss-7jd10716y; ; ; # ꯨ-.ֽss +xn----pw5e.xn--zca50wfv060a; ꯨ-.򨏜ֽß; [V3, V5, V6]; xn----pw5e.xn--zca50wfv060a; ; ; # ꯨ-.ֽß +ꯨ-.򨏜ֽSS; ꯨ-.򨏜ֽss; [P1, V3, V5, V6]; xn----pw5e.xn--ss-7jd10716y; ; ; # ꯨ-.ֽss +ꯨ-.򨏜ֽss; ꯨ-.򨏜ֽss; [P1, V3, V5, V6]; xn----pw5e.xn--ss-7jd10716y; ; ; # ꯨ-.ֽss +ꯨ-.򨏜ֽSs; ꯨ-.򨏜ֽss; [P1, V3, V5, V6]; xn----pw5e.xn--ss-7jd10716y; ; ; # ꯨ-.ֽss +ᡓ-≮。٫󠅱ᡄ; ᡓ-≮.٫ᡄ; [B1, B6, P1, V6]; xn----s7j866c.xn--kib252g; ; ; # ᡓ-≮.٫ᡄ +ᡓ-≮。٫󠅱ᡄ; ᡓ-≮.٫ᡄ; [B1, B6, P1, V6]; xn----s7j866c.xn--kib252g; ; ; # ᡓ-≮.٫ᡄ +xn----s7j866c.xn--kib252g; ᡓ-≮.٫ᡄ; [B1, B6, V6]; xn----s7j866c.xn--kib252g; ; ; # ᡓ-≮.٫ᡄ +𝟥♮𑜫࣭.្𑜫8󠆏; 3♮𑜫࣭.្𑜫8; [V5]; xn--3-ksd277tlo7s.xn--8-f0jx021l; ; ; # 3♮𑜫࣭.្𑜫8 +3♮𑜫࣭.្𑜫8󠆏; 3♮𑜫࣭.្𑜫8; [V5]; xn--3-ksd277tlo7s.xn--8-f0jx021l; ; ; # 3♮𑜫࣭.្𑜫8 +xn--3-ksd277tlo7s.xn--8-f0jx021l; 3♮𑜫࣭.្𑜫8; [V5]; xn--3-ksd277tlo7s.xn--8-f0jx021l; ; ; # 3♮𑜫࣭.្𑜫8 +-。򕌀‍❡; -.򕌀‍❡; [C2, P1, V3, V6]; -.xn--1ug800aq795s; ; -.xn--nei54421f; [P1, V3, V6] # -.❡ +-。򕌀‍❡; -.򕌀‍❡; [C2, P1, V3, V6]; -.xn--1ug800aq795s; ; -.xn--nei54421f; [P1, V3, V6] # -.❡ +-.xn--nei54421f; -.򕌀❡; [V3, V6]; -.xn--nei54421f; ; ; # -.❡ +-.xn--1ug800aq795s; -.򕌀‍❡; [C2, V3, V6]; -.xn--1ug800aq795s; ; ; # -.❡ +𝟓☱𝟐򥰵。𝪮񐡳; 5☱2򥰵.𝪮񐡳; [P1, V5, V6]; xn--52-dwx47758j.xn--kd3hk431k; ; ; # 5☱2.𝪮 +5☱2򥰵。𝪮񐡳; 5☱2򥰵.𝪮񐡳; [P1, V5, V6]; xn--52-dwx47758j.xn--kd3hk431k; ; ; # 5☱2.𝪮 +xn--52-dwx47758j.xn--kd3hk431k; 5☱2򥰵.𝪮񐡳; [V5, V6]; xn--52-dwx47758j.xn--kd3hk431k; ; ; # 5☱2.𝪮 +-.-├򖦣; ; [P1, V3, V6]; -.xn----ukp70432h; ; ; # -.-├ +-.xn----ukp70432h; -.-├򖦣; [V3, V6]; -.xn----ukp70432h; ; ; # -.-├ +֥ݭ。‍󠀘; ֥ݭ.‍󠀘; [B1, C2, P1, V5, V6]; xn--wcb62g.xn--1ugy8001l; ; xn--wcb62g.xn--p526e; [B1, P1, V5, V6] # ֥ݭ. +֥ݭ。‍󠀘; ֥ݭ.‍󠀘; [B1, C2, P1, V5, V6]; xn--wcb62g.xn--1ugy8001l; ; xn--wcb62g.xn--p526e; [B1, P1, V5, V6] # ֥ݭ. +xn--wcb62g.xn--p526e; ֥ݭ.󠀘; [B1, V5, V6]; xn--wcb62g.xn--p526e; ; ; # ֥ݭ. +xn--wcb62g.xn--1ugy8001l; ֥ݭ.‍󠀘; [B1, C2, V5, V6]; xn--wcb62g.xn--1ugy8001l; ; ; # ֥ݭ. +쥥󔏉Ⴎ.‌⒈⒈𐫒; 쥥󔏉Ⴎ.‌⒈⒈𐫒; [B1, C1, P1, V6]; xn--mnd7865gcy28g.xn--0ug88oa0396u; ; xn--mnd7865gcy28g.xn--tsha6797o; [B1, P1, V6] # 쥥Ⴎ.⒈⒈𐫒 +쥥󔏉Ⴎ.‌⒈⒈𐫒; 쥥󔏉Ⴎ.‌⒈⒈𐫒; [B1, C1, P1, V6]; xn--mnd7865gcy28g.xn--0ug88oa0396u; ; xn--mnd7865gcy28g.xn--tsha6797o; [B1, P1, V6] # 쥥Ⴎ.⒈⒈𐫒 +쥥󔏉Ⴎ.‌1.1.𐫒; ; [B1, C1, P1, V6]; xn--mnd7865gcy28g.xn--1-rgn.1.xn--7w9c; ; xn--mnd7865gcy28g.1.1.xn--7w9c; [B1, P1, V6] # 쥥Ⴎ.1.1.𐫒 +쥥󔏉Ⴎ.‌1.1.𐫒; 쥥󔏉Ⴎ.‌1.1.𐫒; [B1, C1, P1, V6]; xn--mnd7865gcy28g.xn--1-rgn.1.xn--7w9c; ; xn--mnd7865gcy28g.1.1.xn--7w9c; [B1, P1, V6] # 쥥Ⴎ.1.1.𐫒 +쥥󔏉ⴎ.‌1.1.𐫒; 쥥󔏉ⴎ.‌1.1.𐫒; [B1, C1, P1, V6]; xn--5kj3511ccyw3h.xn--1-rgn.1.xn--7w9c; ; xn--5kj3511ccyw3h.1.1.xn--7w9c; [B1, P1, V6] # 쥥ⴎ.1.1.𐫒 +쥥󔏉ⴎ.‌1.1.𐫒; ; [B1, C1, P1, V6]; xn--5kj3511ccyw3h.xn--1-rgn.1.xn--7w9c; ; xn--5kj3511ccyw3h.1.1.xn--7w9c; [B1, P1, V6] # 쥥ⴎ.1.1.𐫒 +xn--5kj3511ccyw3h.1.1.xn--7w9c; 쥥󔏉ⴎ.1.1.𐫒; [B1, V6]; xn--5kj3511ccyw3h.1.1.xn--7w9c; ; ; # 쥥ⴎ.1.1.𐫒 +xn--5kj3511ccyw3h.xn--1-rgn.1.xn--7w9c; 쥥󔏉ⴎ.‌1.1.𐫒; [B1, C1, V6]; xn--5kj3511ccyw3h.xn--1-rgn.1.xn--7w9c; ; ; # 쥥ⴎ.1.1.𐫒 +xn--mnd7865gcy28g.1.1.xn--7w9c; 쥥󔏉Ⴎ.1.1.𐫒; [B1, V6]; xn--mnd7865gcy28g.1.1.xn--7w9c; ; ; # 쥥Ⴎ.1.1.𐫒 +xn--mnd7865gcy28g.xn--1-rgn.1.xn--7w9c; 쥥󔏉Ⴎ.‌1.1.𐫒; [B1, C1, V6]; xn--mnd7865gcy28g.xn--1-rgn.1.xn--7w9c; ; ; # 쥥Ⴎ.1.1.𐫒 +쥥󔏉ⴎ.‌⒈⒈𐫒; 쥥󔏉ⴎ.‌⒈⒈𐫒; [B1, C1, P1, V6]; xn--5kj3511ccyw3h.xn--0ug88oa0396u; ; xn--5kj3511ccyw3h.xn--tsha6797o; [B1, P1, V6] # 쥥ⴎ.⒈⒈𐫒 +쥥󔏉ⴎ.‌⒈⒈𐫒; 쥥󔏉ⴎ.‌⒈⒈𐫒; [B1, C1, P1, V6]; xn--5kj3511ccyw3h.xn--0ug88oa0396u; ; xn--5kj3511ccyw3h.xn--tsha6797o; [B1, P1, V6] # 쥥ⴎ.⒈⒈𐫒 +xn--5kj3511ccyw3h.xn--tsha6797o; 쥥󔏉ⴎ.⒈⒈𐫒; [B1, V6]; xn--5kj3511ccyw3h.xn--tsha6797o; ; ; # 쥥ⴎ.⒈⒈𐫒 +xn--5kj3511ccyw3h.xn--0ug88oa0396u; 쥥󔏉ⴎ.‌⒈⒈𐫒; [B1, C1, V6]; xn--5kj3511ccyw3h.xn--0ug88oa0396u; ; ; # 쥥ⴎ.⒈⒈𐫒 +xn--mnd7865gcy28g.xn--tsha6797o; 쥥󔏉Ⴎ.⒈⒈𐫒; [B1, V6]; xn--mnd7865gcy28g.xn--tsha6797o; ; ; # 쥥Ⴎ.⒈⒈𐫒 +xn--mnd7865gcy28g.xn--0ug88oa0396u; 쥥󔏉Ⴎ.‌⒈⒈𐫒; [B1, C1, V6]; xn--mnd7865gcy28g.xn--0ug88oa0396u; ; ; # 쥥Ⴎ.⒈⒈𐫒 +ࠧ𝟶ڠ-。𑄳; ࠧ0ڠ-.𑄳; [B1, B3, B6, V3, V5]; xn--0--p3d67m.xn--v80d; ; ; # ࠧ0ڠ-.𑄳 +ࠧ0ڠ-。𑄳; ࠧ0ڠ-.𑄳; [B1, B3, B6, V3, V5]; xn--0--p3d67m.xn--v80d; ; ; # ࠧ0ڠ-.𑄳 +xn--0--p3d67m.xn--v80d; ࠧ0ڠ-.𑄳; [B1, B3, B6, V3, V5]; xn--0--p3d67m.xn--v80d; ; ; # ࠧ0ڠ-.𑄳 +ς.ﷁ🞛⒈; ς.فمي🞛⒈; [P1, V6]; xn--3xa.xn--dhbip2802atb20c; ; xn--4xa.xn--dhbip2802atb20c; # ς.فمي🞛⒈ +ς.فمي🞛1.; ; ; xn--3xa.xn--1-gocmu97674d.; ; xn--4xa.xn--1-gocmu97674d.; # ς.فمي🞛1. +Σ.فمي🞛1.; σ.فمي🞛1.; ; xn--4xa.xn--1-gocmu97674d.; ; ; # σ.فمي🞛1. +σ.فمي🞛1.; ; ; xn--4xa.xn--1-gocmu97674d.; ; ; # σ.فمي🞛1. +xn--4xa.xn--1-gocmu97674d.; σ.فمي🞛1.; ; xn--4xa.xn--1-gocmu97674d.; ; ; # σ.فمي🞛1. +xn--3xa.xn--1-gocmu97674d.; ς.فمي🞛1.; ; xn--3xa.xn--1-gocmu97674d.; ; ; # ς.فمي🞛1. +Σ.ﷁ🞛⒈; σ.فمي🞛⒈; [P1, V6]; xn--4xa.xn--dhbip2802atb20c; ; ; # σ.فمي🞛⒈ +σ.ﷁ🞛⒈; σ.فمي🞛⒈; [P1, V6]; xn--4xa.xn--dhbip2802atb20c; ; ; # σ.فمي🞛⒈ +xn--4xa.xn--dhbip2802atb20c; σ.فمي🞛⒈; [V6]; xn--4xa.xn--dhbip2802atb20c; ; ; # σ.فمي🞛⒈ +xn--3xa.xn--dhbip2802atb20c; ς.فمي🞛⒈; [V6]; xn--3xa.xn--dhbip2802atb20c; ; ; # ς.فمي🞛⒈ +🗩-。𐹻󐞆񥉮; 🗩-.𐹻󐞆񥉮; [B1, P1, V3, V6]; xn----6t3s.xn--zo0d4811u6ru6a; ; ; # 🗩-.𐹻 +🗩-。𐹻󐞆񥉮; 🗩-.𐹻󐞆񥉮; [B1, P1, V3, V6]; xn----6t3s.xn--zo0d4811u6ru6a; ; ; # 🗩-.𐹻 +xn----6t3s.xn--zo0d4811u6ru6a; 🗩-.𐹻󐞆񥉮; [B1, V3, V6]; xn----6t3s.xn--zo0d4811u6ru6a; ; ; # 🗩-.𐹻 +𐡜-🔪。𝟻‌𐿀; 𐡜-🔪.5‌𐿀; [B1, B3, C1, P1, V6]; xn----5j4iv089c.xn--5-sgn7149h; ; xn----5j4iv089c.xn--5-bn7i; [B1, B3, P1, V6] # 𐡜-🔪.5𐿀 +𐡜-🔪。5‌𐿀; 𐡜-🔪.5‌𐿀; [B1, B3, C1, P1, V6]; xn----5j4iv089c.xn--5-sgn7149h; ; xn----5j4iv089c.xn--5-bn7i; [B1, B3, P1, V6] # 𐡜-🔪.5𐿀 +xn----5j4iv089c.xn--5-bn7i; 𐡜-🔪.5𐿀; [B1, B3, V6]; xn----5j4iv089c.xn--5-bn7i; ; ; # 𐡜-🔪.5𐿀 +xn----5j4iv089c.xn--5-sgn7149h; 𐡜-🔪.5‌𐿀; [B1, B3, C1, V6]; xn----5j4iv089c.xn--5-sgn7149h; ; ; # 𐡜-🔪.5𐿀 +𐹣늿‍ß.ߏ0ּ; 𐹣늿‍ß.ߏ0ּ; [B1, C2]; xn--zca770n5s4hev6c.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ß.ߏ0ּ +𐹣늿‍ß.ߏ0ּ; 𐹣늿‍ß.ߏ0ּ; [B1, C2]; xn--zca770n5s4hev6c.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ß.ߏ0ּ +𐹣늿‍ß.ߏ0ּ; ; [B1, C2]; xn--zca770n5s4hev6c.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ß.ߏ0ּ +𐹣늿‍ß.ߏ0ּ; 𐹣늿‍ß.ߏ0ּ; [B1, C2]; xn--zca770n5s4hev6c.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ß.ߏ0ּ +𐹣늿‍SS.ߏ0ּ; 𐹣늿‍ss.ߏ0ּ; [B1, C2]; xn--ss-l1tu910fo0xd.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ss.ߏ0ּ +𐹣늿‍SS.ߏ0ּ; 𐹣늿‍ss.ߏ0ּ; [B1, C2]; xn--ss-l1tu910fo0xd.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ss.ߏ0ּ +𐹣늿‍ss.ߏ0ּ; ; [B1, C2]; xn--ss-l1tu910fo0xd.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ss.ߏ0ּ +𐹣늿‍ss.ߏ0ּ; 𐹣늿‍ss.ߏ0ּ; [B1, C2]; xn--ss-l1tu910fo0xd.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ss.ߏ0ּ +xn--ss-i05i7041a.xn--0-vgc50n; 𐹣늿ss.ߏ0ּ; [B1]; xn--ss-i05i7041a.xn--0-vgc50n; ; ; # 𐹣늿ss.ߏ0ּ +xn--ss-l1tu910fo0xd.xn--0-vgc50n; 𐹣늿‍ss.ߏ0ּ; [B1, C2]; xn--ss-l1tu910fo0xd.xn--0-vgc50n; ; ; # 𐹣늿ss.ߏ0ּ +𐹣늿‍Ss.ߏ0ּ; 𐹣늿‍ss.ߏ0ּ; [B1, C2]; xn--ss-l1tu910fo0xd.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ss.ߏ0ּ +𐹣늿‍Ss.ߏ0ּ; 𐹣늿‍ss.ߏ0ּ; [B1, C2]; xn--ss-l1tu910fo0xd.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ss.ߏ0ּ +xn--zca770n5s4hev6c.xn--0-vgc50n; 𐹣늿‍ß.ߏ0ּ; [B1, C2]; xn--zca770n5s4hev6c.xn--0-vgc50n; ; ; # 𐹣늿ß.ߏ0ּ +𐹣늿‍SS.ߏ0ּ; 𐹣늿‍ss.ߏ0ּ; [B1, C2]; xn--ss-l1tu910fo0xd.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ss.ߏ0ּ +𐹣늿‍SS.ߏ0ּ; 𐹣늿‍ss.ߏ0ּ; [B1, C2]; xn--ss-l1tu910fo0xd.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ss.ߏ0ּ +𐹣늿‍ss.ߏ0ּ; 𐹣늿‍ss.ߏ0ּ; [B1, C2]; xn--ss-l1tu910fo0xd.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ss.ߏ0ּ +𐹣늿‍ss.ߏ0ּ; 𐹣늿‍ss.ߏ0ּ; [B1, C2]; xn--ss-l1tu910fo0xd.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ss.ߏ0ּ +𐹣늿‍Ss.ߏ0ּ; 𐹣늿‍ss.ߏ0ּ; [B1, C2]; xn--ss-l1tu910fo0xd.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ss.ߏ0ּ +𐹣늿‍Ss.ߏ0ּ; 𐹣늿‍ss.ߏ0ּ; [B1, C2]; xn--ss-l1tu910fo0xd.xn--0-vgc50n; ; xn--ss-i05i7041a.xn--0-vgc50n; [B1] # 𐹣늿ss.ߏ0ּ +9󠇥.󪴴ᢓ; 9.󪴴ᢓ; [P1, V6]; 9.xn--dbf91222q; ; ; # 9.ᢓ +9󠇥.󪴴ᢓ; 9.󪴴ᢓ; [P1, V6]; 9.xn--dbf91222q; ; ; # 9.ᢓ +9.xn--dbf91222q; 9.󪴴ᢓ; [V6]; 9.xn--dbf91222q; ; ; # 9.ᢓ +‌ᅠ.𐫭🠗ß⽟; ‌ᅠ.𐫭🠗ß玉; [B1, B2, B3, C1, P1, V6]; xn--0ug7719f.xn--zca2289c550e0iwi; ; xn--cl7c.xn--ss-je6eq954cp25j; [B2, B3, P1, V6] # .𐫭🠗ß玉 +‌ᅠ.𐫭🠗ß玉; ; [B1, B2, B3, C1, P1, V6]; xn--psd526e.xn--zca2289c550e0iwi; ; xn--psd.xn--ss-je6eq954cp25j; [B2, B3, P1, V6] # .𐫭🠗ß玉 +‌ᅠ.𐫭🠗SS玉; ‌ᅠ.𐫭🠗ss玉; [B1, B2, B3, C1, P1, V6]; xn--psd526e.xn--ss-je6eq954cp25j; ; xn--psd.xn--ss-je6eq954cp25j; [B2, B3, P1, V6] # .𐫭🠗ss玉 +‌ᅠ.𐫭🠗ss玉; ; [B1, B2, B3, C1, P1, V6]; xn--psd526e.xn--ss-je6eq954cp25j; ; xn--psd.xn--ss-je6eq954cp25j; [B2, B3, P1, V6] # .𐫭🠗ss玉 +‌ᅠ.𐫭🠗Ss玉; ‌ᅠ.𐫭🠗ss玉; [B1, B2, B3, C1, P1, V6]; xn--psd526e.xn--ss-je6eq954cp25j; ; xn--psd.xn--ss-je6eq954cp25j; [B2, B3, P1, V6] # .𐫭🠗ss玉 +xn--psd.xn--ss-je6eq954cp25j; ᅠ.𐫭🠗ss玉; [B2, B3, V6]; xn--psd.xn--ss-je6eq954cp25j; ; ; # .𐫭🠗ss玉 +xn--psd526e.xn--ss-je6eq954cp25j; ‌ᅠ.𐫭🠗ss玉; [B1, B2, B3, C1, V6]; xn--psd526e.xn--ss-je6eq954cp25j; ; ; # .𐫭🠗ss玉 +xn--psd526e.xn--zca2289c550e0iwi; ‌ᅠ.𐫭🠗ß玉; [B1, B2, B3, C1, V6]; xn--psd526e.xn--zca2289c550e0iwi; ; ; # .𐫭🠗ß玉 +‌ᅠ.𐫭🠗SS⽟; ‌ᅠ.𐫭🠗ss玉; [B1, B2, B3, C1, P1, V6]; xn--0ug7719f.xn--ss-je6eq954cp25j; ; xn--cl7c.xn--ss-je6eq954cp25j; [B2, B3, P1, V6] # .𐫭🠗ss玉 +‌ᅠ.𐫭🠗ss⽟; ‌ᅠ.𐫭🠗ss玉; [B1, B2, B3, C1, P1, V6]; xn--0ug7719f.xn--ss-je6eq954cp25j; ; xn--cl7c.xn--ss-je6eq954cp25j; [B2, B3, P1, V6] # .𐫭🠗ss玉 +‌ᅠ.𐫭🠗Ss⽟; ‌ᅠ.𐫭🠗ss玉; [B1, B2, B3, C1, P1, V6]; xn--0ug7719f.xn--ss-je6eq954cp25j; ; xn--cl7c.xn--ss-je6eq954cp25j; [B2, B3, P1, V6] # .𐫭🠗ss玉 +xn--cl7c.xn--ss-je6eq954cp25j; ᅠ.𐫭🠗ss玉; [B2, B3, V6]; xn--cl7c.xn--ss-je6eq954cp25j; ; ; # .𐫭🠗ss玉 +xn--0ug7719f.xn--ss-je6eq954cp25j; ‌ᅠ.𐫭🠗ss玉; [B1, B2, B3, C1, V6]; xn--0ug7719f.xn--ss-je6eq954cp25j; ; ; # .𐫭🠗ss玉 +xn--0ug7719f.xn--zca2289c550e0iwi; ‌ᅠ.𐫭🠗ß玉; [B1, B2, B3, C1, V6]; xn--0ug7719f.xn--zca2289c550e0iwi; ; ; # .𐫭🠗ß玉 +︒Ⴖͦ.‌; ︒Ⴖͦ.‌; [C1, P1, V6]; xn--hva929dl29p.xn--0ug; ; xn--hva929dl29p.; [P1, V6] # ︒Ⴖͦ. +。Ⴖͦ.‌; .Ⴖͦ.‌; [C1, P1, V6, X4_2]; .xn--hva929d.xn--0ug; [C1, P1, V6, A4_2]; .xn--hva929d.; [P1, V6, A4_2] # .Ⴖͦ. +。ⴖͦ.‌; .ⴖͦ.‌; [C1, X4_2]; .xn--hva754s.xn--0ug; [C1, A4_2]; .xn--hva754s.; [A4_2] # .ⴖͦ. +.xn--hva754s.; .ⴖͦ.; [X4_2]; .xn--hva754s.; [A4_2]; ; # .ⴖͦ. +.xn--hva754s.xn--0ug; .ⴖͦ.‌; [C1, X4_2]; .xn--hva754s.xn--0ug; [C1, A4_2]; ; # .ⴖͦ. +.xn--hva929d.; .Ⴖͦ.; [V6, X4_2]; .xn--hva929d.; [V6, A4_2]; ; # .Ⴖͦ. +.xn--hva929d.xn--0ug; .Ⴖͦ.‌; [C1, V6, X4_2]; .xn--hva929d.xn--0ug; [C1, V6, A4_2]; ; # .Ⴖͦ. +︒ⴖͦ.‌; ︒ⴖͦ.‌; [C1, P1, V6]; xn--hva754sy94k.xn--0ug; ; xn--hva754sy94k.; [P1, V6] # ︒ⴖͦ. +xn--hva754sy94k.; ︒ⴖͦ.; [V6]; xn--hva754sy94k.; ; ; # ︒ⴖͦ. +xn--hva754sy94k.xn--0ug; ︒ⴖͦ.‌; [C1, V6]; xn--hva754sy94k.xn--0ug; ; ; # ︒ⴖͦ. +xn--hva929dl29p.; ︒Ⴖͦ.; [V6]; xn--hva929dl29p.; ; ; # ︒Ⴖͦ. +xn--hva929dl29p.xn--0ug; ︒Ⴖͦ.‌; [C1, V6]; xn--hva929dl29p.xn--0ug; ; ; # ︒Ⴖͦ. +xn--hva754s.; ⴖͦ.; ; xn--hva754s.; ; ; # ⴖͦ. +ⴖͦ.; ; ; xn--hva754s.; ; ; # ⴖͦ. +Ⴖͦ.; ; [P1, V6]; xn--hva929d.; ; ; # Ⴖͦ. +xn--hva929d.; Ⴖͦ.; [V6]; xn--hva929d.; ; ; # Ⴖͦ. +ࢻ.‌Ⴃ𞀒; ࢻ.‌Ⴃ𞀒; [B1, C1, P1, V6]; xn--hzb.xn--bnd300f7225a; ; xn--hzb.xn--bnd2938u; [P1, V6] # ࢻ.Ⴃ𞀒 +ࢻ.‌Ⴃ𞀒; ; [B1, C1, P1, V6]; xn--hzb.xn--bnd300f7225a; ; xn--hzb.xn--bnd2938u; [P1, V6] # ࢻ.Ⴃ𞀒 +ࢻ.‌ⴃ𞀒; ; [B1, C1]; xn--hzb.xn--0ug822cp045a; ; xn--hzb.xn--ukj4430l; [] # ࢻ.ⴃ𞀒 +xn--hzb.xn--ukj4430l; ࢻ.ⴃ𞀒; ; xn--hzb.xn--ukj4430l; ; ; # ࢻ.ⴃ𞀒 +ࢻ.ⴃ𞀒; ; ; xn--hzb.xn--ukj4430l; ; ; # ࢻ.ⴃ𞀒 +ࢻ.Ⴃ𞀒; ; [P1, V6]; xn--hzb.xn--bnd2938u; ; ; # ࢻ.Ⴃ𞀒 +xn--hzb.xn--bnd2938u; ࢻ.Ⴃ𞀒; [V6]; xn--hzb.xn--bnd2938u; ; ; # ࢻ.Ⴃ𞀒 +xn--hzb.xn--0ug822cp045a; ࢻ.‌ⴃ𞀒; [B1, C1]; xn--hzb.xn--0ug822cp045a; ; ; # ࢻ.ⴃ𞀒 +xn--hzb.xn--bnd300f7225a; ࢻ.‌Ⴃ𞀒; [B1, C1, V6]; xn--hzb.xn--bnd300f7225a; ; ; # ࢻ.Ⴃ𞀒 +ࢻ.‌ⴃ𞀒; ࢻ.‌ⴃ𞀒; [B1, C1]; xn--hzb.xn--0ug822cp045a; ; xn--hzb.xn--ukj4430l; [] # ࢻ.ⴃ𞀒 +‍‌。2䫷󠧷; ‍‌.2䫷󠧷; [C1, C2, P1, V6]; xn--0ugb.xn--2-me5ay1273i; ; .xn--2-me5ay1273i; [P1, V6, A4_2] # .2䫷 +‍‌。2䫷󠧷; ‍‌.2䫷󠧷; [C1, C2, P1, V6]; xn--0ugb.xn--2-me5ay1273i; ; .xn--2-me5ay1273i; [P1, V6, A4_2] # .2䫷 +.xn--2-me5ay1273i; .2䫷󠧷; [V6, X4_2]; .xn--2-me5ay1273i; [V6, A4_2]; ; # .2䫷 +xn--0ugb.xn--2-me5ay1273i; ‍‌.2䫷󠧷; [C1, C2, V6]; xn--0ugb.xn--2-me5ay1273i; ; ; # .2䫷 +-𞀤󜠐。򈬖; -𞀤󜠐.򈬖; [P1, V3, V6]; xn----rq4re4997d.xn--l707b; ; ; # -𞀤. +xn----rq4re4997d.xn--l707b; -𞀤󜠐.򈬖; [V3, V6]; xn----rq4re4997d.xn--l707b; ; ; # -𞀤. +󳛂︒‌㟀.ؤ⒈; 󳛂︒‌㟀.ؤ⒈; [C1, P1, V6]; xn--0ug754gxl4ldlt0k.xn--jgb476m; ; xn--etlt457ccrq7h.xn--jgb476m; [P1, V6] # ︒㟀.ؤ⒈ +󳛂︒‌㟀.ؤ⒈; 󳛂︒‌㟀.ؤ⒈; [C1, P1, V6]; xn--0ug754gxl4ldlt0k.xn--jgb476m; ; xn--etlt457ccrq7h.xn--jgb476m; [P1, V6] # ︒㟀.ؤ⒈ +󳛂。‌㟀.ؤ1.; 󳛂.‌㟀.ؤ1.; [B1, C1, P1, V6]; xn--z272f.xn--0ug754g.xn--1-smc.; ; xn--z272f.xn--etl.xn--1-smc.; [P1, V6] # .㟀.ؤ1. +󳛂。‌㟀.ؤ1.; 󳛂.‌㟀.ؤ1.; [B1, C1, P1, V6]; xn--z272f.xn--0ug754g.xn--1-smc.; ; xn--z272f.xn--etl.xn--1-smc.; [P1, V6] # .㟀.ؤ1. +xn--z272f.xn--etl.xn--1-smc.; 󳛂.㟀.ؤ1.; [V6]; xn--z272f.xn--etl.xn--1-smc.; ; ; # .㟀.ؤ1. +xn--z272f.xn--0ug754g.xn--1-smc.; 󳛂.‌㟀.ؤ1.; [B1, C1, V6]; xn--z272f.xn--0ug754g.xn--1-smc.; ; ; # .㟀.ؤ1. +xn--etlt457ccrq7h.xn--jgb476m; 󳛂︒㟀.ؤ⒈; [V6]; xn--etlt457ccrq7h.xn--jgb476m; ; ; # ︒㟀.ؤ⒈ +xn--0ug754gxl4ldlt0k.xn--jgb476m; 󳛂︒‌㟀.ؤ⒈; [C1, V6]; xn--0ug754gxl4ldlt0k.xn--jgb476m; ; ; # ︒㟀.ؤ⒈ +𑲜ߊ𝅼。-‍; 𑲜ߊ𝅼.-‍; [B1, C2, V3, V5]; xn--lsb5482l7nre.xn----ugn; ; xn--lsb5482l7nre.-; [B1, V3, V5] # 𑲜ߊ𝅼.- +xn--lsb5482l7nre.-; 𑲜ߊ𝅼.-; [B1, V3, V5]; xn--lsb5482l7nre.-; ; ; # 𑲜ߊ𝅼.- +xn--lsb5482l7nre.xn----ugn; 𑲜ߊ𝅼.-‍; [B1, C2, V3, V5]; xn--lsb5482l7nre.xn----ugn; ; ; # 𑲜ߊ𝅼.- +‌.Ⴉ≠𐫶; ‌.Ⴉ≠𐫶; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--hnd481gv73o; ; .xn--hnd481gv73o; [B5, B6, P1, V6, A4_2] # .Ⴉ≠𐫶 +‌.Ⴉ≠𐫶; ‌.Ⴉ≠𐫶; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--hnd481gv73o; ; .xn--hnd481gv73o; [B5, B6, P1, V6, A4_2] # .Ⴉ≠𐫶 +‌.Ⴉ≠𐫶; ; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--hnd481gv73o; ; .xn--hnd481gv73o; [B5, B6, P1, V6, A4_2] # .Ⴉ≠𐫶 +‌.Ⴉ≠𐫶; ‌.Ⴉ≠𐫶; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--hnd481gv73o; ; .xn--hnd481gv73o; [B5, B6, P1, V6, A4_2] # .Ⴉ≠𐫶 +‌.ⴉ≠𐫶; ‌.ⴉ≠𐫶; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--1chx23bzj4p; ; .xn--1chx23bzj4p; [B5, B6, P1, V6, A4_2] # .ⴉ≠𐫶 +‌.ⴉ≠𐫶; ; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--1chx23bzj4p; ; .xn--1chx23bzj4p; [B5, B6, P1, V6, A4_2] # .ⴉ≠𐫶 +.xn--1chx23bzj4p; .ⴉ≠𐫶; [B5, B6, V6, X4_2]; .xn--1chx23bzj4p; [B5, B6, V6, A4_2]; ; # .ⴉ≠𐫶 +xn--0ug.xn--1chx23bzj4p; ‌.ⴉ≠𐫶; [B1, B5, B6, C1, V6]; xn--0ug.xn--1chx23bzj4p; ; ; # .ⴉ≠𐫶 +.xn--hnd481gv73o; .Ⴉ≠𐫶; [B5, B6, V6, X4_2]; .xn--hnd481gv73o; [B5, B6, V6, A4_2]; ; # .Ⴉ≠𐫶 +xn--0ug.xn--hnd481gv73o; ‌.Ⴉ≠𐫶; [B1, B5, B6, C1, V6]; xn--0ug.xn--hnd481gv73o; ; ; # .Ⴉ≠𐫶 +‌.ⴉ≠𐫶; ‌.ⴉ≠𐫶; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--1chx23bzj4p; ; .xn--1chx23bzj4p; [B5, B6, P1, V6, A4_2] # .ⴉ≠𐫶 +‌.ⴉ≠𐫶; ‌.ⴉ≠𐫶; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--1chx23bzj4p; ; .xn--1chx23bzj4p; [B5, B6, P1, V6, A4_2] # .ⴉ≠𐫶 +ݐ。≯ς; ݐ.≯ς; [B1, P1, V6]; xn--3ob.xn--3xa918m; ; xn--3ob.xn--4xa718m; # ݐ.≯ς +ݐ。≯ς; ݐ.≯ς; [B1, P1, V6]; xn--3ob.xn--3xa918m; ; xn--3ob.xn--4xa718m; # ݐ.≯ς +ݐ。≯Σ; ݐ.≯σ; [B1, P1, V6]; xn--3ob.xn--4xa718m; ; ; # ݐ.≯σ +ݐ。≯Σ; ݐ.≯σ; [B1, P1, V6]; xn--3ob.xn--4xa718m; ; ; # ݐ.≯σ +ݐ。≯σ; ݐ.≯σ; [B1, P1, V6]; xn--3ob.xn--4xa718m; ; ; # ݐ.≯σ +ݐ。≯σ; ݐ.≯σ; [B1, P1, V6]; xn--3ob.xn--4xa718m; ; ; # ݐ.≯σ +xn--3ob.xn--4xa718m; ݐ.≯σ; [B1, V6]; xn--3ob.xn--4xa718m; ; ; # ݐ.≯σ +xn--3ob.xn--3xa918m; ݐ.≯ς; [B1, V6]; xn--3ob.xn--3xa918m; ; ; # ݐ.≯ς +߼𐸆.𓖏︒񊨩Ⴐ; ; [P1, V6]; xn--0tb8725k.xn--ond3562jt18a7py9c; ; ; # .︒Ⴐ +߼𐸆.𓖏。񊨩Ⴐ; ߼𐸆.𓖏.񊨩Ⴐ; [P1, V6]; xn--0tb8725k.xn--tu8d.xn--ond97931d; ; ; # ..Ⴐ +߼𐸆.𓖏。񊨩ⴐ; ߼𐸆.𓖏.񊨩ⴐ; [P1, V6]; xn--0tb8725k.xn--tu8d.xn--7kj73887a; ; ; # ..ⴐ +xn--0tb8725k.xn--tu8d.xn--7kj73887a; ߼𐸆.𓖏.񊨩ⴐ; [V6]; xn--0tb8725k.xn--tu8d.xn--7kj73887a; ; ; # ..ⴐ +xn--0tb8725k.xn--tu8d.xn--ond97931d; ߼𐸆.𓖏.񊨩Ⴐ; [V6]; xn--0tb8725k.xn--tu8d.xn--ond97931d; ; ; # ..Ⴐ +߼𐸆.𓖏︒񊨩ⴐ; ; [P1, V6]; xn--0tb8725k.xn--7kj9008dt18a7py9c; ; ; # .︒ⴐ +xn--0tb8725k.xn--7kj9008dt18a7py9c; ߼𐸆.𓖏︒񊨩ⴐ; [V6]; xn--0tb8725k.xn--7kj9008dt18a7py9c; ; ; # .︒ⴐ +xn--0tb8725k.xn--ond3562jt18a7py9c; ߼𐸆.𓖏︒񊨩Ⴐ; [V6]; xn--0tb8725k.xn--ond3562jt18a7py9c; ; ; # .︒Ⴐ +Ⴥ⚭󠖫⋃。𑌼; Ⴥ⚭󠖫⋃.𑌼; [P1, V5, V6]; xn--9nd623g4zc5z060c.xn--ro1d; ; ; # Ⴥ⚭⋃.𑌼 +Ⴥ⚭󠖫⋃。𑌼; Ⴥ⚭󠖫⋃.𑌼; [P1, V5, V6]; xn--9nd623g4zc5z060c.xn--ro1d; ; ; # Ⴥ⚭⋃.𑌼 +ⴥ⚭󠖫⋃。𑌼; ⴥ⚭󠖫⋃.𑌼; [P1, V5, V6]; xn--vfh16m67gx1162b.xn--ro1d; ; ; # ⴥ⚭⋃.𑌼 +xn--vfh16m67gx1162b.xn--ro1d; ⴥ⚭󠖫⋃.𑌼; [V5, V6]; xn--vfh16m67gx1162b.xn--ro1d; ; ; # ⴥ⚭⋃.𑌼 +xn--9nd623g4zc5z060c.xn--ro1d; Ⴥ⚭󠖫⋃.𑌼; [V5, V6]; xn--9nd623g4zc5z060c.xn--ro1d; ; ; # Ⴥ⚭⋃.𑌼 +ⴥ⚭󠖫⋃。𑌼; ⴥ⚭󠖫⋃.𑌼; [P1, V5, V6]; xn--vfh16m67gx1162b.xn--ro1d; ; ; # ⴥ⚭⋃.𑌼 +🄈。󠷳ࡄ; 🄈.󠷳ࡄ; [B1, P1, V6]; xn--107h.xn--2vb13094p; ; ; # 🄈.ࡄ +7,。󠷳ࡄ; 7,.󠷳ࡄ; [B1, P1, V6]; 7,.xn--2vb13094p; ; ; # 7,.ࡄ +7,.xn--2vb13094p; 7,.󠷳ࡄ; [B1, P1, V6]; 7,.xn--2vb13094p; ; ; # 7,.ࡄ +xn--107h.xn--2vb13094p; 🄈.󠷳ࡄ; [B1, V6]; xn--107h.xn--2vb13094p; ; ; # 🄈.ࡄ +≮ࡆ。섖쮖ß; ≮ࡆ.섖쮖ß; [B1, P1, V6]; xn--4vb505k.xn--zca7259goug; ; xn--4vb505k.xn--ss-5z4j006a; # ≮ࡆ.섖쮖ß +≮ࡆ。섖쮖ß; ≮ࡆ.섖쮖ß; [B1, P1, V6]; xn--4vb505k.xn--zca7259goug; ; xn--4vb505k.xn--ss-5z4j006a; # ≮ࡆ.섖쮖ß +≮ࡆ。섖쮖SS; ≮ࡆ.섖쮖ss; [B1, P1, V6]; xn--4vb505k.xn--ss-5z4j006a; ; ; # ≮ࡆ.섖쮖ss +≮ࡆ。섖쮖SS; ≮ࡆ.섖쮖ss; [B1, P1, V6]; xn--4vb505k.xn--ss-5z4j006a; ; ; # ≮ࡆ.섖쮖ss +≮ࡆ。섖쮖ss; ≮ࡆ.섖쮖ss; [B1, P1, V6]; xn--4vb505k.xn--ss-5z4j006a; ; ; # ≮ࡆ.섖쮖ss +≮ࡆ。섖쮖ss; ≮ࡆ.섖쮖ss; [B1, P1, V6]; xn--4vb505k.xn--ss-5z4j006a; ; ; # ≮ࡆ.섖쮖ss +xn--4vb505k.xn--ss-5z4j006a; ≮ࡆ.섖쮖ss; [B1, V6]; xn--4vb505k.xn--ss-5z4j006a; ; ; # ≮ࡆ.섖쮖ss +≮ࡆ。섖쮖Ss; ≮ࡆ.섖쮖ss; [B1, P1, V6]; xn--4vb505k.xn--ss-5z4j006a; ; ; # ≮ࡆ.섖쮖ss +≮ࡆ。섖쮖Ss; ≮ࡆ.섖쮖ss; [B1, P1, V6]; xn--4vb505k.xn--ss-5z4j006a; ; ; # ≮ࡆ.섖쮖ss +xn--4vb505k.xn--zca7259goug; ≮ࡆ.섖쮖ß; [B1, V6]; xn--4vb505k.xn--zca7259goug; ; ; # ≮ࡆ.섖쮖ß +󠆓⛏-。ꡒ; ⛏-.ꡒ; [V3]; xn----o9p.xn--rc9a; ; ; # ⛏-.ꡒ +xn----o9p.xn--rc9a; ⛏-.ꡒ; [V3]; xn----o9p.xn--rc9a; ; ; # ⛏-.ꡒ +޻𐹳ئ𑁆。ࢧڰ‌ᢒ; ޻𐹳ئ𑁆.ࢧڰ‌ᢒ; [B2, B3, P1, V6]; xn--lgb32f2753cosb.xn--jkb91hlz1azih; ; xn--lgb32f2753cosb.xn--jkb91hlz1a; # 𐹳ئ𑁆.ࢧڰᢒ +޻𐹳ئ𑁆。ࢧڰ‌ᢒ; ޻𐹳ئ𑁆.ࢧڰ‌ᢒ; [B2, B3, P1, V6]; xn--lgb32f2753cosb.xn--jkb91hlz1azih; ; xn--lgb32f2753cosb.xn--jkb91hlz1a; # 𐹳ئ𑁆.ࢧڰᢒ +xn--lgb32f2753cosb.xn--jkb91hlz1a; ޻𐹳ئ𑁆.ࢧڰᢒ; [B2, B3, V6]; xn--lgb32f2753cosb.xn--jkb91hlz1a; ; ; # 𐹳ئ𑁆.ࢧڰᢒ +xn--lgb32f2753cosb.xn--jkb91hlz1azih; ޻𐹳ئ𑁆.ࢧڰ‌ᢒ; [B2, B3, V6]; xn--lgb32f2753cosb.xn--jkb91hlz1azih; ; ; # 𐹳ئ𑁆.ࢧڰᢒ +ࠖ.𐨕𚚕; ; [B1, B2, B3, B6, P1, V5, V6]; xn--rub.xn--tr9c248x; ; ; # ࠖ.𐨕 +xn--rub.xn--tr9c248x; ࠖ.𐨕𚚕; [B1, B2, B3, B6, V5, V6]; xn--rub.xn--tr9c248x; ; ; # ࠖ.𐨕 +--。𽊆ݧ𐽋𞠬; --.𽊆ݧ𐽋𞠬; [B1, B5, B6, P1, V3, V6]; --.xn--rpb6226k77pfh58p; ; ; # --.ݧ𐽋𞠬 +--.xn--rpb6226k77pfh58p; --.𽊆ݧ𐽋𞠬; [B1, B5, B6, V3, V6]; --.xn--rpb6226k77pfh58p; ; ; # --.ݧ𐽋𞠬 +򛭦𐋥𹸐.≯ࢰࢦ󔛣; ; [B1, P1, V6]; xn--887c2298i5mv6a.xn--vybt688qm8981a; ; ; # 𐋥.≯ࢰࢦ +򛭦𐋥𹸐.≯ࢰࢦ󔛣; 򛭦𐋥𹸐.≯ࢰࢦ󔛣; [B1, P1, V6]; xn--887c2298i5mv6a.xn--vybt688qm8981a; ; ; # 𐋥.≯ࢰࢦ +xn--887c2298i5mv6a.xn--vybt688qm8981a; 򛭦𐋥𹸐.≯ࢰࢦ󔛣; [B1, V6]; xn--887c2298i5mv6a.xn--vybt688qm8981a; ; ; # 𐋥.≯ࢰࢦ +䔛󠇒򤸞𐹧.-䤷; 䔛򤸞𐹧.-䤷; [B1, B5, B6, P1, V3, V6]; xn--2loy662coo60e.xn----0n4a; ; ; # 䔛𐹧.-䤷 +䔛󠇒򤸞𐹧.-䤷; 䔛򤸞𐹧.-䤷; [B1, B5, B6, P1, V3, V6]; xn--2loy662coo60e.xn----0n4a; ; ; # 䔛𐹧.-䤷 +xn--2loy662coo60e.xn----0n4a; 䔛򤸞𐹧.-䤷; [B1, B5, B6, V3, V6]; xn--2loy662coo60e.xn----0n4a; ; ; # 䔛𐹧.-䤷 +𐹩.‍-; 𐹩.‍-; [B1, C2, V3]; xn--ho0d.xn----tgn; ; xn--ho0d.-; [B1, V3] # 𐹩.- +𐹩.‍-; ; [B1, C2, V3]; xn--ho0d.xn----tgn; ; xn--ho0d.-; [B1, V3] # 𐹩.- +xn--ho0d.-; 𐹩.-; [B1, V3]; xn--ho0d.-; ; ; # 𐹩.- +xn--ho0d.xn----tgn; 𐹩.‍-; [B1, C2, V3]; xn--ho0d.xn----tgn; ; ; # 𐹩.- +񂈦帷。≯萺᷈-; 񂈦帷.≯萺᷈-; [P1, V3, V6]; xn--qutw175s.xn----mimu6tf67j; ; ; # 帷.≯萺᷈- +񂈦帷。≯萺᷈-; 񂈦帷.≯萺᷈-; [P1, V3, V6]; xn--qutw175s.xn----mimu6tf67j; ; ; # 帷.≯萺᷈- +񂈦帷。≯萺᷈-; 񂈦帷.≯萺᷈-; [P1, V3, V6]; xn--qutw175s.xn----mimu6tf67j; ; ; # 帷.≯萺᷈- +񂈦帷。≯萺᷈-; 񂈦帷.≯萺᷈-; [P1, V3, V6]; xn--qutw175s.xn----mimu6tf67j; ; ; # 帷.≯萺᷈- +xn--qutw175s.xn----mimu6tf67j; 񂈦帷.≯萺᷈-; [V3, V6]; xn--qutw175s.xn----mimu6tf67j; ; ; # 帷.≯萺᷈- +‍攌꯭。ᢖ-Ⴘ; ‍攌꯭.ᢖ-Ⴘ; [C2, P1, V6]; xn--1ug592ykp6b.xn----k1g451d; ; xn--p9ut19m.xn----k1g451d; [P1, V6] # 攌꯭.ᢖ-Ⴘ +‍攌꯭。ᢖ-ⴘ; ‍攌꯭.ᢖ-ⴘ; [C2]; xn--1ug592ykp6b.xn----mck373i; ; xn--p9ut19m.xn----mck373i; [] # 攌꯭.ᢖ-ⴘ +xn--p9ut19m.xn----mck373i; 攌꯭.ᢖ-ⴘ; ; xn--p9ut19m.xn----mck373i; ; ; # 攌꯭.ᢖ-ⴘ +攌꯭.ᢖ-ⴘ; ; ; xn--p9ut19m.xn----mck373i; ; ; # 攌꯭.ᢖ-ⴘ +攌꯭.ᢖ-Ⴘ; ; [P1, V6]; xn--p9ut19m.xn----k1g451d; ; ; # 攌꯭.ᢖ-Ⴘ +xn--p9ut19m.xn----k1g451d; 攌꯭.ᢖ-Ⴘ; [V6]; xn--p9ut19m.xn----k1g451d; ; ; # 攌꯭.ᢖ-Ⴘ +xn--1ug592ykp6b.xn----mck373i; ‍攌꯭.ᢖ-ⴘ; [C2]; xn--1ug592ykp6b.xn----mck373i; ; ; # 攌꯭.ᢖ-ⴘ +xn--1ug592ykp6b.xn----k1g451d; ‍攌꯭.ᢖ-Ⴘ; [C2, V6]; xn--1ug592ykp6b.xn----k1g451d; ; ; # 攌꯭.ᢖ-Ⴘ +‌ꖨ.⒗3툒۳; ‌ꖨ.⒗3툒۳; [C1, P1, V6]; xn--0ug2473c.xn--3-nyc678tu07m; ; xn--9r8a.xn--3-nyc678tu07m; [P1, V6] # ꖨ.⒗3툒۳ +‌ꖨ.⒗3툒۳; ‌ꖨ.⒗3툒۳; [C1, P1, V6]; xn--0ug2473c.xn--3-nyc678tu07m; ; xn--9r8a.xn--3-nyc678tu07m; [P1, V6] # ꖨ.⒗3툒۳ +‌ꖨ.16.3툒۳; ; [C1]; xn--0ug2473c.16.xn--3-nyc0117m; ; xn--9r8a.16.xn--3-nyc0117m; [] # ꖨ.16.3툒۳ +‌ꖨ.16.3툒۳; ‌ꖨ.16.3툒۳; [C1]; xn--0ug2473c.16.xn--3-nyc0117m; ; xn--9r8a.16.xn--3-nyc0117m; [] # ꖨ.16.3툒۳ +xn--9r8a.16.xn--3-nyc0117m; ꖨ.16.3툒۳; ; xn--9r8a.16.xn--3-nyc0117m; ; ; # ꖨ.16.3툒۳ +ꖨ.16.3툒۳; ; ; xn--9r8a.16.xn--3-nyc0117m; ; ; # ꖨ.16.3툒۳ +ꖨ.16.3툒۳; ꖨ.16.3툒۳; ; xn--9r8a.16.xn--3-nyc0117m; ; ; # ꖨ.16.3툒۳ +xn--0ug2473c.16.xn--3-nyc0117m; ‌ꖨ.16.3툒۳; [C1]; xn--0ug2473c.16.xn--3-nyc0117m; ; ; # ꖨ.16.3툒۳ +xn--9r8a.xn--3-nyc678tu07m; ꖨ.⒗3툒۳; [V6]; xn--9r8a.xn--3-nyc678tu07m; ; ; # ꖨ.⒗3툒۳ +xn--0ug2473c.xn--3-nyc678tu07m; ‌ꖨ.⒗3툒۳; [C1, V6]; xn--0ug2473c.xn--3-nyc678tu07m; ; ; # ꖨ.⒗3툒۳ +⒈걾6.𐱁ې; ; [B1, P1, V6]; xn--6-dcps419c.xn--glb1794k; ; ; # ⒈걾6.𐱁ې +⒈걾6.𐱁ې; ⒈걾6.𐱁ې; [B1, P1, V6]; xn--6-dcps419c.xn--glb1794k; ; ; # ⒈걾6.𐱁ې +1.걾6.𐱁ې; ; [B1]; 1.xn--6-945e.xn--glb1794k; ; ; # 1.걾6.𐱁ې +1.걾6.𐱁ې; 1.걾6.𐱁ې; [B1]; 1.xn--6-945e.xn--glb1794k; ; ; # 1.걾6.𐱁ې +1.xn--6-945e.xn--glb1794k; 1.걾6.𐱁ې; [B1]; 1.xn--6-945e.xn--glb1794k; ; ; # 1.걾6.𐱁ې +xn--6-dcps419c.xn--glb1794k; ⒈걾6.𐱁ې; [B1, V6]; xn--6-dcps419c.xn--glb1794k; ; ; # ⒈걾6.𐱁ې +𐲞𝟶≮≮.󠀧ع; 𐳞0≮≮.󠀧ع; [B1, B3, P1, V6]; xn--0-ngoa5711v.xn--4gb31034p; ; ; # 𐳞0≮≮.ع +𐲞𝟶≮≮.󠀧ع; 𐳞0≮≮.󠀧ع; [B1, B3, P1, V6]; xn--0-ngoa5711v.xn--4gb31034p; ; ; # 𐳞0≮≮.ع +𐲞0≮≮.󠀧ع; 𐳞0≮≮.󠀧ع; [B1, B3, P1, V6]; xn--0-ngoa5711v.xn--4gb31034p; ; ; # 𐳞0≮≮.ع +𐲞0≮≮.󠀧ع; 𐳞0≮≮.󠀧ع; [B1, B3, P1, V6]; xn--0-ngoa5711v.xn--4gb31034p; ; ; # 𐳞0≮≮.ع +𐳞0≮≮.󠀧ع; 𐳞0≮≮.󠀧ع; [B1, B3, P1, V6]; xn--0-ngoa5711v.xn--4gb31034p; ; ; # 𐳞0≮≮.ع +𐳞0≮≮.󠀧ع; ; [B1, B3, P1, V6]; xn--0-ngoa5711v.xn--4gb31034p; ; ; # 𐳞0≮≮.ع +xn--0-ngoa5711v.xn--4gb31034p; 𐳞0≮≮.󠀧ع; [B1, B3, V6]; xn--0-ngoa5711v.xn--4gb31034p; ; ; # 𐳞0≮≮.ع +𐳞𝟶≮≮.󠀧ع; 𐳞0≮≮.󠀧ع; [B1, B3, P1, V6]; xn--0-ngoa5711v.xn--4gb31034p; ; ; # 𐳞0≮≮.ع +𐳞𝟶≮≮.󠀧ع; 𐳞0≮≮.󠀧ع; [B1, B3, P1, V6]; xn--0-ngoa5711v.xn--4gb31034p; ; ; # 𐳞0≮≮.ع +ૣ.𐹺ᅟ; ; [B1, B3, B6, P1, V5, V6]; xn--8fc.xn--osd3070k; ; ; # ૣ.𐹺 +xn--8fc.xn--osd3070k; ૣ.𐹺ᅟ; [B1, B3, B6, V5, V6]; xn--8fc.xn--osd3070k; ; ; # ૣ.𐹺 +𝟏𝨙⸖.‍; 1𝨙⸖.‍; [C2]; xn--1-5bt6845n.xn--1ug; ; xn--1-5bt6845n.; [] # 1𝨙⸖. +1𝨙⸖.‍; ; [C2]; xn--1-5bt6845n.xn--1ug; ; xn--1-5bt6845n.; [] # 1𝨙⸖. +xn--1-5bt6845n.; 1𝨙⸖.; ; xn--1-5bt6845n.; ; ; # 1𝨙⸖. +1𝨙⸖.; ; ; xn--1-5bt6845n.; ; ; # 1𝨙⸖. +xn--1-5bt6845n.xn--1ug; 1𝨙⸖.‍; [C2]; xn--1-5bt6845n.xn--1ug; ; ; # 1𝨙⸖. +𞤐≠ܦ᩠。-‌ߕ; 𞤲≠ܦ᩠.-‌ߕ; [B1, C1, P1, V3, V6]; xn--wnb859grzfzw60c.xn----kcd017p; ; xn--wnb859grzfzw60c.xn----kcd; [B1, P1, V3, V6] # 𞤲≠ܦ᩠.-ߕ +𞤐≠ܦ᩠。-‌ߕ; 𞤲≠ܦ᩠.-‌ߕ; [B1, C1, P1, V3, V6]; xn--wnb859grzfzw60c.xn----kcd017p; ; xn--wnb859grzfzw60c.xn----kcd; [B1, P1, V3, V6] # 𞤲≠ܦ᩠.-ߕ +𞤐≠ܦ᩠。-‌ߕ; 𞤲≠ܦ᩠.-‌ߕ; [B1, C1, P1, V3, V6]; xn--wnb859grzfzw60c.xn----kcd017p; ; xn--wnb859grzfzw60c.xn----kcd; [B1, P1, V3, V6] # 𞤲≠ܦ᩠.-ߕ +𞤐≠ܦ᩠。-‌ߕ; 𞤲≠ܦ᩠.-‌ߕ; [B1, C1, P1, V3, V6]; xn--wnb859grzfzw60c.xn----kcd017p; ; xn--wnb859grzfzw60c.xn----kcd; [B1, P1, V3, V6] # 𞤲≠ܦ᩠.-ߕ +𞤲≠ܦ᩠。-‌ߕ; 𞤲≠ܦ᩠.-‌ߕ; [B1, C1, P1, V3, V6]; xn--wnb859grzfzw60c.xn----kcd017p; ; xn--wnb859grzfzw60c.xn----kcd; [B1, P1, V3, V6] # 𞤲≠ܦ᩠.-ߕ +𞤲≠ܦ᩠。-‌ߕ; 𞤲≠ܦ᩠.-‌ߕ; [B1, C1, P1, V3, V6]; xn--wnb859grzfzw60c.xn----kcd017p; ; xn--wnb859grzfzw60c.xn----kcd; [B1, P1, V3, V6] # 𞤲≠ܦ᩠.-ߕ +xn--wnb859grzfzw60c.xn----kcd; 𞤲≠ܦ᩠.-ߕ; [B1, V3, V6]; xn--wnb859grzfzw60c.xn----kcd; ; ; # 𞤲≠ܦ᩠.-ߕ +xn--wnb859grzfzw60c.xn----kcd017p; 𞤲≠ܦ᩠.-‌ߕ; [B1, C1, V3, V6]; xn--wnb859grzfzw60c.xn----kcd017p; ; ; # 𞤲≠ܦ᩠.-ߕ +𞤲≠ܦ᩠。-‌ߕ; 𞤲≠ܦ᩠.-‌ߕ; [B1, C1, P1, V3, V6]; xn--wnb859grzfzw60c.xn----kcd017p; ; xn--wnb859grzfzw60c.xn----kcd; [B1, P1, V3, V6] # 𞤲≠ܦ᩠.-ߕ +𞤲≠ܦ᩠。-‌ߕ; 𞤲≠ܦ᩠.-‌ߕ; [B1, C1, P1, V3, V6]; xn--wnb859grzfzw60c.xn----kcd017p; ; xn--wnb859grzfzw60c.xn----kcd; [B1, P1, V3, V6] # 𞤲≠ܦ᩠.-ߕ +𐹰ͨ-ꡧ。ٵ; 𐹰ͨ-ꡧ.اٴ; [B1]; xn----shb2387jgkqd.xn--mgb8m; ; ; # 𐹰ͨ-ꡧ.اٴ +𐹰ͨ-ꡧ。اٴ; 𐹰ͨ-ꡧ.اٴ; [B1]; xn----shb2387jgkqd.xn--mgb8m; ; ; # 𐹰ͨ-ꡧ.اٴ +xn----shb2387jgkqd.xn--mgb8m; 𐹰ͨ-ꡧ.اٴ; [B1]; xn----shb2387jgkqd.xn--mgb8m; ; ; # 𐹰ͨ-ꡧ.اٴ +F󠅟。򏗅♚; f.򏗅♚; [P1, V6]; f.xn--45hz6953f; ; ; # f.♚ +F󠅟。򏗅♚; f.򏗅♚; [P1, V6]; f.xn--45hz6953f; ; ; # f.♚ +f󠅟。򏗅♚; f.򏗅♚; [P1, V6]; f.xn--45hz6953f; ; ; # f.♚ +f.xn--45hz6953f; f.򏗅♚; [V6]; f.xn--45hz6953f; ; ; # f.♚ +f󠅟。򏗅♚; f.򏗅♚; [P1, V6]; f.xn--45hz6953f; ; ; # f.♚ +୍𑄴ᷩ。𝟮Ⴘ𞀨񃥇; ୍𑄴ᷩ.2Ⴘ𞀨񃥇; [P1, V5, V6]; xn--9ic246gs21p.xn--2-k1g43076adrwq; ; ; # ୍𑄴ᷩ.2Ⴘ𞀨 +୍𑄴ᷩ。2Ⴘ𞀨񃥇; ୍𑄴ᷩ.2Ⴘ𞀨񃥇; [P1, V5, V6]; xn--9ic246gs21p.xn--2-k1g43076adrwq; ; ; # ୍𑄴ᷩ.2Ⴘ𞀨 +୍𑄴ᷩ。2ⴘ𞀨񃥇; ୍𑄴ᷩ.2ⴘ𞀨񃥇; [P1, V5, V6]; xn--9ic246gs21p.xn--2-nws2918ndrjr; ; ; # ୍𑄴ᷩ.2ⴘ𞀨 +xn--9ic246gs21p.xn--2-nws2918ndrjr; ୍𑄴ᷩ.2ⴘ𞀨񃥇; [V5, V6]; xn--9ic246gs21p.xn--2-nws2918ndrjr; ; ; # ୍𑄴ᷩ.2ⴘ𞀨 +xn--9ic246gs21p.xn--2-k1g43076adrwq; ୍𑄴ᷩ.2Ⴘ𞀨񃥇; [V5, V6]; xn--9ic246gs21p.xn--2-k1g43076adrwq; ; ; # ୍𑄴ᷩ.2Ⴘ𞀨 +୍𑄴ᷩ。𝟮ⴘ𞀨񃥇; ୍𑄴ᷩ.2ⴘ𞀨񃥇; [P1, V5, V6]; xn--9ic246gs21p.xn--2-nws2918ndrjr; ; ; # ୍𑄴ᷩ.2ⴘ𞀨 +򓠭‌‌⒈。勉𑁅; 򓠭‌‌⒈.勉𑁅; [C1, P1, V6]; xn--0uga855aez302a.xn--4grs325b; ; xn--tsh11906f.xn--4grs325b; [P1, V6] # ⒈.勉𑁅 +򓠭‌‌1.。勉𑁅; 򓠭‌‌1..勉𑁅; [C1, P1, V6, X4_2]; xn--1-rgna61159u..xn--4grs325b; [C1, P1, V6, A4_2]; xn--1-yi00h..xn--4grs325b; [P1, V6, A4_2] # 1..勉𑁅 +xn--1-yi00h..xn--4grs325b; 򓠭1..勉𑁅; [V6, X4_2]; xn--1-yi00h..xn--4grs325b; [V6, A4_2]; ; # 1..勉𑁅 +xn--1-rgna61159u..xn--4grs325b; 򓠭‌‌1..勉𑁅; [C1, V6, X4_2]; xn--1-rgna61159u..xn--4grs325b; [C1, V6, A4_2]; ; # 1..勉𑁅 +xn--tsh11906f.xn--4grs325b; 򓠭⒈.勉𑁅; [V6]; xn--tsh11906f.xn--4grs325b; ; ; # ⒈.勉𑁅 +xn--0uga855aez302a.xn--4grs325b; 򓠭‌‌⒈.勉𑁅; [C1, V6]; xn--0uga855aez302a.xn--4grs325b; ; ; # ⒈.勉𑁅 +ᡃ.玿񫈜󕞐; ; [P1, V6]; xn--27e.xn--7cy81125a0yq4a; ; ; # ᡃ.玿 +xn--27e.xn--7cy81125a0yq4a; ᡃ.玿񫈜󕞐; [V6]; xn--27e.xn--7cy81125a0yq4a; ; ; # ᡃ.玿 +‌‌。⒈≯𝟵; ‌‌.⒈≯9; [C1, P1, V6]; xn--0uga.xn--9-ogo37g; ; .xn--9-ogo37g; [P1, V6, A4_2] # .⒈≯9 +‌‌。⒈≯𝟵; ‌‌.⒈≯9; [C1, P1, V6]; xn--0uga.xn--9-ogo37g; ; .xn--9-ogo37g; [P1, V6, A4_2] # .⒈≯9 +‌‌。1.≯9; ‌‌.1.≯9; [C1, P1, V6]; xn--0uga.1.xn--9-ogo; ; .1.xn--9-ogo; [P1, V6, A4_2] # .1.≯9 +‌‌。1.≯9; ‌‌.1.≯9; [C1, P1, V6]; xn--0uga.1.xn--9-ogo; ; .1.xn--9-ogo; [P1, V6, A4_2] # .1.≯9 +.1.xn--9-ogo; .1.≯9; [V6, X4_2]; .1.xn--9-ogo; [V6, A4_2]; ; # .1.≯9 +xn--0uga.1.xn--9-ogo; ‌‌.1.≯9; [C1, V6]; xn--0uga.1.xn--9-ogo; ; ; # .1.≯9 +.xn--9-ogo37g; .⒈≯9; [V6, X4_2]; .xn--9-ogo37g; [V6, A4_2]; ; # .⒈≯9 +xn--0uga.xn--9-ogo37g; ‌‌.⒈≯9; [C1, V6]; xn--0uga.xn--9-ogo37g; ; ; # .⒈≯9 +ᅟᷠ򐀁.𺻆≯𐮁; ; [B5, B6, P1, V6]; xn--osd615d5659o.xn--hdh5192gkm6r; ; ; # ᷠ.≯𐮁 +ᅟᷠ򐀁.𺻆≯𐮁; ᅟᷠ򐀁.𺻆≯𐮁; [B5, B6, P1, V6]; xn--osd615d5659o.xn--hdh5192gkm6r; ; ; # ᷠ.≯𐮁 +xn--osd615d5659o.xn--hdh5192gkm6r; ᅟᷠ򐀁.𺻆≯𐮁; [B5, B6, V6]; xn--osd615d5659o.xn--hdh5192gkm6r; ; ; # ᷠ.≯𐮁 +󠄫𝩤‍ؾ.𝩩-ࠞ󑼩; 𝩤‍ؾ.𝩩-ࠞ󑼩; [B1, C2, P1, V5, V6]; xn--9gb723kg862a.xn----qgd52296avol4f; ; xn--9gb5080v.xn----qgd52296avol4f; [B1, P1, V5, V6] # 𝩤ؾ.𝩩-ࠞ +xn--9gb5080v.xn----qgd52296avol4f; 𝩤ؾ.𝩩-ࠞ󑼩; [B1, V5, V6]; xn--9gb5080v.xn----qgd52296avol4f; ; ; # 𝩤ؾ.𝩩-ࠞ +xn--9gb723kg862a.xn----qgd52296avol4f; 𝩤‍ؾ.𝩩-ࠞ󑼩; [B1, C2, V5, V6]; xn--9gb723kg862a.xn----qgd52296avol4f; ; ; # 𝩤ؾ.𝩩-ࠞ +⃚.𑘿-; ⃚.𑘿-; [V3, V5]; xn--w0g.xn----bd0j; ; ; # ⃚.𑘿- +⃚.𑘿-; ; [V3, V5]; xn--w0g.xn----bd0j; ; ; # ⃚.𑘿- +xn--w0g.xn----bd0j; ⃚.𑘿-; [V3, V5]; xn--w0g.xn----bd0j; ; ; # ⃚.𑘿- +䮸ß.󠵟󠭎紙ࢨ; ; [B1, P1, V6]; xn--zca5349a.xn--xyb1370div70kpzba; ; xn--ss-sf1c.xn--xyb1370div70kpzba; # 䮸ß.紙ࢨ +䮸SS.󠵟󠭎紙ࢨ; 䮸ss.󠵟󠭎紙ࢨ; [B1, P1, V6]; xn--ss-sf1c.xn--xyb1370div70kpzba; ; ; # 䮸ss.紙ࢨ +䮸ss.󠵟󠭎紙ࢨ; ; [B1, P1, V6]; xn--ss-sf1c.xn--xyb1370div70kpzba; ; ; # 䮸ss.紙ࢨ +䮸Ss.󠵟󠭎紙ࢨ; 䮸ss.󠵟󠭎紙ࢨ; [B1, P1, V6]; xn--ss-sf1c.xn--xyb1370div70kpzba; ; ; # 䮸ss.紙ࢨ +xn--ss-sf1c.xn--xyb1370div70kpzba; 䮸ss.󠵟󠭎紙ࢨ; [B1, V6]; xn--ss-sf1c.xn--xyb1370div70kpzba; ; ; # 䮸ss.紙ࢨ +xn--zca5349a.xn--xyb1370div70kpzba; 䮸ß.󠵟󠭎紙ࢨ; [B1, V6]; xn--zca5349a.xn--xyb1370div70kpzba; ; ; # 䮸ß.紙ࢨ +-Ⴞ.-𝩨⅔𐦕; -Ⴞ.-𝩨2⁄3𐦕; [B1, P1, V3, V6]; xn----w1g.xn---23-pt0a0433lk3jj; ; ; # -Ⴞ.-𝩨2⁄3𐦕 +-Ⴞ.-𝩨2⁄3𐦕; ; [B1, P1, V3, V6]; xn----w1g.xn---23-pt0a0433lk3jj; ; ; # -Ⴞ.-𝩨2⁄3𐦕 +-ⴞ.-𝩨2⁄3𐦕; ; [B1, V3]; xn----zws.xn---23-pt0a0433lk3jj; ; ; # -ⴞ.-𝩨2⁄3𐦕 +xn----zws.xn---23-pt0a0433lk3jj; -ⴞ.-𝩨2⁄3𐦕; [B1, V3]; xn----zws.xn---23-pt0a0433lk3jj; ; ; # -ⴞ.-𝩨2⁄3𐦕 +xn----w1g.xn---23-pt0a0433lk3jj; -Ⴞ.-𝩨2⁄3𐦕; [B1, V3, V6]; xn----w1g.xn---23-pt0a0433lk3jj; ; ; # -Ⴞ.-𝩨2⁄3𐦕 +-ⴞ.-𝩨⅔𐦕; -ⴞ.-𝩨2⁄3𐦕; [B1, V3]; xn----zws.xn---23-pt0a0433lk3jj; ; ; # -ⴞ.-𝩨2⁄3𐦕 +󧈯𐹯ૂ。򖢨𐮁񇼖ᡂ; 󧈯𐹯ૂ.򖢨𐮁񇼖ᡂ; [B5, B6, P1, V6]; xn--bfc7604kv8m3g.xn--17e5565jl7zw4h16a; ; ; # 𐹯ૂ.𐮁ᡂ +󧈯𐹯ૂ。򖢨𐮁񇼖ᡂ; 󧈯𐹯ૂ.򖢨𐮁񇼖ᡂ; [B5, B6, P1, V6]; xn--bfc7604kv8m3g.xn--17e5565jl7zw4h16a; ; ; # 𐹯ૂ.𐮁ᡂ +xn--bfc7604kv8m3g.xn--17e5565jl7zw4h16a; 󧈯𐹯ૂ.򖢨𐮁񇼖ᡂ; [B5, B6, V6]; xn--bfc7604kv8m3g.xn--17e5565jl7zw4h16a; ; ; # 𐹯ૂ.𐮁ᡂ +ႂ-‍꣪.ꡊ‍񼸳; ႂ-‍꣪.ꡊ‍񼸳; [C2, P1, V5, V6]; xn----gyg250jio7k.xn--1ug8774cri56d; ; xn----gyg3618i.xn--jc9ao4185a; [P1, V5, V6] # ႂ-꣪.ꡊ +ႂ-‍꣪.ꡊ‍񼸳; ; [C2, P1, V5, V6]; xn----gyg250jio7k.xn--1ug8774cri56d; ; xn----gyg3618i.xn--jc9ao4185a; [P1, V5, V6] # ႂ-꣪.ꡊ +xn----gyg3618i.xn--jc9ao4185a; ႂ-꣪.ꡊ񼸳; [V5, V6]; xn----gyg3618i.xn--jc9ao4185a; ; ; # ႂ-꣪.ꡊ +xn----gyg250jio7k.xn--1ug8774cri56d; ႂ-‍꣪.ꡊ‍񼸳; [C2, V5, V6]; xn----gyg250jio7k.xn--1ug8774cri56d; ; ; # ႂ-꣪.ꡊ +۱。≠٨; ۱.≠٨; [B1, P1, V6]; xn--emb.xn--hib334l; ; ; # ۱.≠٨ +۱。≠٨; ۱.≠٨; [B1, P1, V6]; xn--emb.xn--hib334l; ; ; # ۱.≠٨ +xn--emb.xn--hib334l; ۱.≠٨; [B1, V6]; xn--emb.xn--hib334l; ; ; # ۱.≠٨ +𑈵廊.𐠍; ; [V5]; xn--xytw701b.xn--yc9c; ; ; # 𑈵廊.𐠍 +xn--xytw701b.xn--yc9c; 𑈵廊.𐠍; [V5]; xn--xytw701b.xn--yc9c; ; ; # 𑈵廊.𐠍 +‍͖-.-Ⴐ١; ‍͖-.-Ⴐ١; [B1, C2, P1, V3, V6]; xn----rgb661t.xn----bqc030f; ; xn----rgb.xn----bqc030f; [B1, P1, V3, V5, V6] # ͖-.-Ⴐ١ +‍͖-.-Ⴐ١; ; [B1, C2, P1, V3, V6]; xn----rgb661t.xn----bqc030f; ; xn----rgb.xn----bqc030f; [B1, P1, V3, V5, V6] # ͖-.-Ⴐ١ +‍͖-.-ⴐ١; ; [B1, C2, V3]; xn----rgb661t.xn----bqc2280a; ; xn----rgb.xn----bqc2280a; [B1, V3, V5] # ͖-.-ⴐ١ +xn----rgb.xn----bqc2280a; ͖-.-ⴐ١; [B1, V3, V5]; xn----rgb.xn----bqc2280a; ; ; # ͖-.-ⴐ١ +xn----rgb661t.xn----bqc2280a; ‍͖-.-ⴐ١; [B1, C2, V3]; xn----rgb661t.xn----bqc2280a; ; ; # ͖-.-ⴐ١ +xn----rgb.xn----bqc030f; ͖-.-Ⴐ١; [B1, V3, V5, V6]; xn----rgb.xn----bqc030f; ; ; # ͖-.-Ⴐ١ +xn----rgb661t.xn----bqc030f; ‍͖-.-Ⴐ١; [B1, C2, V3, V6]; xn----rgb661t.xn----bqc030f; ; ; # ͖-.-Ⴐ١ +‍͖-.-ⴐ١; ‍͖-.-ⴐ١; [B1, C2, V3]; xn----rgb661t.xn----bqc2280a; ; xn----rgb.xn----bqc2280a; [B1, V3, V5] # ͖-.-ⴐ١ +غ١挏󾯐.-; ; [B1, B2, B3, P1, V3, V6]; xn--5gb2f4205aqi47p.-; ; ; # غ١挏.- +xn--5gb2f4205aqi47p.-; غ١挏󾯐.-; [B1, B2, B3, V3, V6]; xn--5gb2f4205aqi47p.-; ; ; # غ١挏.- +ۯ。𐹧𞤽; ۯ.𐹧𞤽; [B1]; xn--cmb.xn--fo0dy848a; ; ; # ۯ.𐹧𞤽 +ۯ。𐹧𞤽; ۯ.𐹧𞤽; [B1]; xn--cmb.xn--fo0dy848a; ; ; # ۯ.𐹧𞤽 +ۯ。𐹧𞤛; ۯ.𐹧𞤽; [B1]; xn--cmb.xn--fo0dy848a; ; ; # ۯ.𐹧𞤽 +xn--cmb.xn--fo0dy848a; ۯ.𐹧𞤽; [B1]; xn--cmb.xn--fo0dy848a; ; ; # ۯ.𐹧𞤽 +ۯ。𐹧𞤛; ۯ.𐹧𞤽; [B1]; xn--cmb.xn--fo0dy848a; ; ; # ۯ.𐹧𞤽 +Ⴞ𶛀𛗻.ᢗ릫; Ⴞ𶛀𛗻.ᢗ릫; [P1, V6]; xn--2nd8876sgl2j.xn--hbf6853f; ; ; # Ⴞ.ᢗ릫 +Ⴞ𶛀𛗻.ᢗ릫; Ⴞ𶛀𛗻.ᢗ릫; [P1, V6]; xn--2nd8876sgl2j.xn--hbf6853f; ; ; # Ⴞ.ᢗ릫 +Ⴞ𶛀𛗻.ᢗ릫; ; [P1, V6]; xn--2nd8876sgl2j.xn--hbf6853f; ; ; # Ⴞ.ᢗ릫 +Ⴞ𶛀𛗻.ᢗ릫; Ⴞ𶛀𛗻.ᢗ릫; [P1, V6]; xn--2nd8876sgl2j.xn--hbf6853f; ; ; # Ⴞ.ᢗ릫 +ⴞ𶛀𛗻.ᢗ릫; ⴞ𶛀𛗻.ᢗ릫; [P1, V6]; xn--mlj0486jgl2j.xn--hbf6853f; ; ; # ⴞ.ᢗ릫 +ⴞ𶛀𛗻.ᢗ릫; ; [P1, V6]; xn--mlj0486jgl2j.xn--hbf6853f; ; ; # ⴞ.ᢗ릫 +xn--mlj0486jgl2j.xn--hbf6853f; ⴞ𶛀𛗻.ᢗ릫; [V6]; xn--mlj0486jgl2j.xn--hbf6853f; ; ; # ⴞ.ᢗ릫 +xn--2nd8876sgl2j.xn--hbf6853f; Ⴞ𶛀𛗻.ᢗ릫; [V6]; xn--2nd8876sgl2j.xn--hbf6853f; ; ; # Ⴞ.ᢗ릫 +ⴞ𶛀𛗻.ᢗ릫; ⴞ𶛀𛗻.ᢗ릫; [P1, V6]; xn--mlj0486jgl2j.xn--hbf6853f; ; ; # ⴞ.ᢗ릫 +ⴞ𶛀𛗻.ᢗ릫; ⴞ𶛀𛗻.ᢗ릫; [P1, V6]; xn--mlj0486jgl2j.xn--hbf6853f; ; ; # ⴞ.ᢗ릫 +󠎃󗭞ڷ𐹷。≯‌᷾; 󠎃󗭞ڷ𐹷.≯‌᷾; [B1, C1, P1, V6]; xn--qkb4516kbi06fg2id.xn--zfg59fm0c; ; xn--qkb4516kbi06fg2id.xn--zfg31q; [B1, P1, V6] # ڷ𐹷.≯᷾ +󠎃󗭞ڷ𐹷。≯‌᷾; 󠎃󗭞ڷ𐹷.≯‌᷾; [B1, C1, P1, V6]; xn--qkb4516kbi06fg2id.xn--zfg59fm0c; ; xn--qkb4516kbi06fg2id.xn--zfg31q; [B1, P1, V6] # ڷ𐹷.≯᷾ +󠎃󗭞ڷ𐹷。≯‌᷾; 󠎃󗭞ڷ𐹷.≯‌᷾; [B1, C1, P1, V6]; xn--qkb4516kbi06fg2id.xn--zfg59fm0c; ; xn--qkb4516kbi06fg2id.xn--zfg31q; [B1, P1, V6] # ڷ𐹷.≯᷾ +󠎃󗭞ڷ𐹷。≯‌᷾; 󠎃󗭞ڷ𐹷.≯‌᷾; [B1, C1, P1, V6]; xn--qkb4516kbi06fg2id.xn--zfg59fm0c; ; xn--qkb4516kbi06fg2id.xn--zfg31q; [B1, P1, V6] # ڷ𐹷.≯᷾ +xn--qkb4516kbi06fg2id.xn--zfg31q; 󠎃󗭞ڷ𐹷.≯᷾; [B1, V6]; xn--qkb4516kbi06fg2id.xn--zfg31q; ; ; # ڷ𐹷.≯᷾ +xn--qkb4516kbi06fg2id.xn--zfg59fm0c; 󠎃󗭞ڷ𐹷.≯‌᷾; [B1, C1, V6]; xn--qkb4516kbi06fg2id.xn--zfg59fm0c; ; ; # ڷ𐹷.≯᷾ +ᛎ󠅍󠐕‍。𐹾𐹪𐻝-; ᛎ󠐕‍.𐹾𐹪𐻝-; [B1, B6, C2, P1, V3, V6]; xn--fxe848bq3411a.xn----q26i2bvu; ; xn--fxe63563p.xn----q26i2bvu; [B1, B6, P1, V3, V6] # ᛎ.𐹾𐹪- +ᛎ󠅍󠐕‍。𐹾𐹪𐻝-; ᛎ󠐕‍.𐹾𐹪𐻝-; [B1, B6, C2, P1, V3, V6]; xn--fxe848bq3411a.xn----q26i2bvu; ; xn--fxe63563p.xn----q26i2bvu; [B1, B6, P1, V3, V6] # ᛎ.𐹾𐹪- +xn--fxe63563p.xn----q26i2bvu; ᛎ󠐕.𐹾𐹪𐻝-; [B1, B6, V3, V6]; xn--fxe63563p.xn----q26i2bvu; ; ; # ᛎ.𐹾𐹪- +xn--fxe848bq3411a.xn----q26i2bvu; ᛎ󠐕‍.𐹾𐹪𐻝-; [B1, B6, C2, V3, V6]; xn--fxe848bq3411a.xn----q26i2bvu; ; ; # ᛎ.𐹾𐹪- +𐹶.𐫂; ; [B1]; xn--uo0d.xn--rw9c; ; ; # 𐹶.𐫂 +xn--uo0d.xn--rw9c; 𐹶.𐫂; [B1]; xn--uo0d.xn--rw9c; ; ; # 𐹶.𐫂 +ß‍်。⒈; ß‍်.⒈; [C2, P1, V6]; xn--zca679eh2l.xn--tsh; ; xn--ss-f4j.xn--tsh; [P1, V6] # ß်.⒈ +ß‍်。1.; ß‍်.1.; [C2]; xn--zca679eh2l.1.; ; xn--ss-f4j.1.; [] # ß်.1. +SS‍်。1.; ss‍်.1.; [C2]; xn--ss-f4j585j.1.; ; xn--ss-f4j.1.; [] # ss်.1. +ss‍်。1.; ss‍်.1.; [C2]; xn--ss-f4j585j.1.; ; xn--ss-f4j.1.; [] # ss်.1. +Ss‍်。1.; ss‍်.1.; [C2]; xn--ss-f4j585j.1.; ; xn--ss-f4j.1.; [] # ss်.1. +xn--ss-f4j.1.; ss်.1.; ; xn--ss-f4j.1.; ; ; # ss်.1. +ss်.1.; ; ; xn--ss-f4j.1.; ; ; # ss်.1. +SS်.1.; ss်.1.; ; xn--ss-f4j.1.; ; ; # ss်.1. +Ss်.1.; ss်.1.; ; xn--ss-f4j.1.; ; ; # ss်.1. +xn--ss-f4j585j.1.; ss‍်.1.; [C2]; xn--ss-f4j585j.1.; ; ; # ss်.1. +xn--zca679eh2l.1.; ß‍်.1.; [C2]; xn--zca679eh2l.1.; ; ; # ß်.1. +SS‍်。⒈; ss‍်.⒈; [C2, P1, V6]; xn--ss-f4j585j.xn--tsh; ; xn--ss-f4j.xn--tsh; [P1, V6] # ss်.⒈ +ss‍်。⒈; ss‍်.⒈; [C2, P1, V6]; xn--ss-f4j585j.xn--tsh; ; xn--ss-f4j.xn--tsh; [P1, V6] # ss်.⒈ +Ss‍်。⒈; ss‍်.⒈; [C2, P1, V6]; xn--ss-f4j585j.xn--tsh; ; xn--ss-f4j.xn--tsh; [P1, V6] # ss်.⒈ +xn--ss-f4j.xn--tsh; ss်.⒈; [V6]; xn--ss-f4j.xn--tsh; ; ; # ss်.⒈ +xn--ss-f4j585j.xn--tsh; ss‍်.⒈; [C2, V6]; xn--ss-f4j585j.xn--tsh; ; ; # ss်.⒈ +xn--zca679eh2l.xn--tsh; ß‍်.⒈; [C2, V6]; xn--zca679eh2l.xn--tsh; ; ; # ß်.⒈ +୍‌𙶵𞻘。‍; ୍‌𙶵𞻘.‍; [B1, C2, P1, V5, V6]; xn--9ic637hz82z32jc.xn--1ug; ; xn--9ic6417rn4xb.; [B1, P1, V5, V6] # ୍. +xn--9ic6417rn4xb.; ୍𙶵𞻘.; [B1, V5, V6]; xn--9ic6417rn4xb.; ; ; # ୍. +xn--9ic637hz82z32jc.xn--1ug; ୍‌𙶵𞻘.‍; [B1, C2, V5, V6]; xn--9ic637hz82z32jc.xn--1ug; ; ; # ୍. +𐮅。ڼ🁕; 𐮅.ڼ🁕; [B3]; xn--c29c.xn--vkb8871w; ; ; # 𐮅.ڼ🁕 +𐮅。ڼ🁕; 𐮅.ڼ🁕; [B3]; xn--c29c.xn--vkb8871w; ; ; # 𐮅.ڼ🁕 +xn--c29c.xn--vkb8871w; 𐮅.ڼ🁕; [B3]; xn--c29c.xn--vkb8871w; ; ; # 𐮅.ڼ🁕 +ؠ្。𐫔󠀧‌𑈵; ؠ្.𐫔󠀧‌𑈵; [B2, B3, C1, P1, V6]; xn--fgb471g.xn--0ug9853g7verp838a; ; xn--fgb471g.xn--9w9c29jw3931a; [B2, B3, P1, V6] # ؠ្.𐫔𑈵 +xn--fgb471g.xn--9w9c29jw3931a; ؠ្.𐫔󠀧𑈵; [B2, B3, V6]; xn--fgb471g.xn--9w9c29jw3931a; ; ; # ؠ្.𐫔𑈵 +xn--fgb471g.xn--0ug9853g7verp838a; ؠ្.𐫔󠀧‌𑈵; [B2, B3, C1, V6]; xn--fgb471g.xn--0ug9853g7verp838a; ; ; # ؠ្.𐫔𑈵 +񋉕.𞣕𞤊; 񋉕.𞣕𞤬; [B1, P1, V5, V6]; xn--tf5w.xn--2b6hof; ; ; # .𞣕𞤬 +񋉕.𞣕𞤬; ; [B1, P1, V5, V6]; xn--tf5w.xn--2b6hof; ; ; # .𞣕𞤬 +xn--tf5w.xn--2b6hof; 񋉕.𞣕𞤬; [B1, V5, V6]; xn--tf5w.xn--2b6hof; ; ; # .𞣕𞤬 +ی𐨿.ß྄𑍬; ی𐨿.ß྄𑍬; ; xn--clb2593k.xn--zca216edt0r; ; xn--clb2593k.xn--ss-toj6092t; # ی𐨿.ß྄𑍬 +ی𐨿.ß྄𑍬; ; ; xn--clb2593k.xn--zca216edt0r; ; xn--clb2593k.xn--ss-toj6092t; # ی𐨿.ß྄𑍬 +ی𐨿.SS྄𑍬; ی𐨿.ss྄𑍬; ; xn--clb2593k.xn--ss-toj6092t; ; ; # ی𐨿.ss྄𑍬 +ی𐨿.ss྄𑍬; ; ; xn--clb2593k.xn--ss-toj6092t; ; ; # ی𐨿.ss྄𑍬 +xn--clb2593k.xn--ss-toj6092t; ی𐨿.ss྄𑍬; ; xn--clb2593k.xn--ss-toj6092t; ; ; # ی𐨿.ss྄𑍬 +xn--clb2593k.xn--zca216edt0r; ی𐨿.ß྄𑍬; ; xn--clb2593k.xn--zca216edt0r; ; ; # ی𐨿.ß྄𑍬 +ی𐨿.SS྄𑍬; ی𐨿.ss྄𑍬; ; xn--clb2593k.xn--ss-toj6092t; ; ; # ی𐨿.ss྄𑍬 +ی𐨿.ss྄𑍬; ی𐨿.ss྄𑍬; ; xn--clb2593k.xn--ss-toj6092t; ; ; # ی𐨿.ss྄𑍬 +ی𐨿.Ss྄𑍬; ی𐨿.ss྄𑍬; ; xn--clb2593k.xn--ss-toj6092t; ; ; # ی𐨿.ss྄𑍬 +ی𐨿.Ss྄𑍬; ی𐨿.ss྄𑍬; ; xn--clb2593k.xn--ss-toj6092t; ; ; # ی𐨿.ss྄𑍬 +𝟠≮‌。󠅱឴; 8≮‌.឴; [C1, P1, V5, V6]; xn--8-sgn10i.xn--z3e; ; xn--8-ngo.xn--z3e; [P1, V5, V6] # 8≮. +𝟠≮‌。󠅱឴; 8≮‌.឴; [C1, P1, V5, V6]; xn--8-sgn10i.xn--z3e; ; xn--8-ngo.xn--z3e; [P1, V5, V6] # 8≮. +8≮‌。󠅱឴; 8≮‌.឴; [C1, P1, V5, V6]; xn--8-sgn10i.xn--z3e; ; xn--8-ngo.xn--z3e; [P1, V5, V6] # 8≮. +8≮‌。󠅱឴; 8≮‌.឴; [C1, P1, V5, V6]; xn--8-sgn10i.xn--z3e; ; xn--8-ngo.xn--z3e; [P1, V5, V6] # 8≮. +xn--8-ngo.xn--z3e; 8≮.឴; [V5, V6]; xn--8-ngo.xn--z3e; ; ; # 8≮. +xn--8-sgn10i.xn--z3e; 8≮‌.឴; [C1, V5, V6]; xn--8-sgn10i.xn--z3e; ; ; # 8≮. +ᢕ≯︒񄂯.Ⴀ; ᢕ≯︒񄂯.Ⴀ; [P1, V6]; xn--fbf851cq98poxw1a.xn--7md; ; ; # ᢕ≯︒.Ⴀ +ᢕ≯︒񄂯.Ⴀ; ᢕ≯︒񄂯.Ⴀ; [P1, V6]; xn--fbf851cq98poxw1a.xn--7md; ; ; # ᢕ≯︒.Ⴀ +ᢕ≯。񄂯.Ⴀ; ᢕ≯.񄂯.Ⴀ; [P1, V6]; xn--fbf851c.xn--ko1u.xn--7md; ; ; # ᢕ≯..Ⴀ +ᢕ≯。񄂯.Ⴀ; ᢕ≯.񄂯.Ⴀ; [P1, V6]; xn--fbf851c.xn--ko1u.xn--7md; ; ; # ᢕ≯..Ⴀ +ᢕ≯。񄂯.ⴀ; ᢕ≯.񄂯.ⴀ; [P1, V6]; xn--fbf851c.xn--ko1u.xn--rkj; ; ; # ᢕ≯..ⴀ +ᢕ≯。񄂯.ⴀ; ᢕ≯.񄂯.ⴀ; [P1, V6]; xn--fbf851c.xn--ko1u.xn--rkj; ; ; # ᢕ≯..ⴀ +xn--fbf851c.xn--ko1u.xn--rkj; ᢕ≯.񄂯.ⴀ; [V6]; xn--fbf851c.xn--ko1u.xn--rkj; ; ; # ᢕ≯..ⴀ +xn--fbf851c.xn--ko1u.xn--7md; ᢕ≯.񄂯.Ⴀ; [V6]; xn--fbf851c.xn--ko1u.xn--7md; ; ; # ᢕ≯..Ⴀ +ᢕ≯︒񄂯.ⴀ; ᢕ≯︒񄂯.ⴀ; [P1, V6]; xn--fbf851cq98poxw1a.xn--rkj; ; ; # ᢕ≯︒.ⴀ +ᢕ≯︒񄂯.ⴀ; ᢕ≯︒񄂯.ⴀ; [P1, V6]; xn--fbf851cq98poxw1a.xn--rkj; ; ; # ᢕ≯︒.ⴀ +xn--fbf851cq98poxw1a.xn--rkj; ᢕ≯︒񄂯.ⴀ; [V6]; xn--fbf851cq98poxw1a.xn--rkj; ; ; # ᢕ≯︒.ⴀ +xn--fbf851cq98poxw1a.xn--7md; ᢕ≯︒񄂯.Ⴀ; [V6]; xn--fbf851cq98poxw1a.xn--7md; ; ; # ᢕ≯︒.Ⴀ +ྟ.-ࠪ; ྟ.-ࠪ; [V3, V5]; xn--vfd.xn----fhd; ; ; # ྟ.-ࠪ +ྟ.-ࠪ; ; [V3, V5]; xn--vfd.xn----fhd; ; ; # ྟ.-ࠪ +xn--vfd.xn----fhd; ྟ.-ࠪ; [V3, V5]; xn--vfd.xn----fhd; ; ; # ྟ.-ࠪ +ᵬ󠆠.핒⒒⒈􈄦; ᵬ.핒⒒⒈􈄦; [P1, V6]; xn--tbg.xn--tsht7586kyts9l; ; ; # ᵬ.핒⒒⒈ +ᵬ󠆠.핒⒒⒈􈄦; ᵬ.핒⒒⒈􈄦; [P1, V6]; xn--tbg.xn--tsht7586kyts9l; ; ; # ᵬ.핒⒒⒈ +ᵬ󠆠.핒11.1.􈄦; ᵬ.핒11.1.􈄦; [P1, V6]; xn--tbg.xn--11-5o7k.1.xn--k469f; ; ; # ᵬ.핒11.1. +ᵬ󠆠.핒11.1.􈄦; ᵬ.핒11.1.􈄦; [P1, V6]; xn--tbg.xn--11-5o7k.1.xn--k469f; ; ; # ᵬ.핒11.1. +xn--tbg.xn--11-5o7k.1.xn--k469f; ᵬ.핒11.1.􈄦; [V6]; xn--tbg.xn--11-5o7k.1.xn--k469f; ; ; # ᵬ.핒11.1. +xn--tbg.xn--tsht7586kyts9l; ᵬ.핒⒒⒈􈄦; [V6]; xn--tbg.xn--tsht7586kyts9l; ; ; # ᵬ.핒⒒⒈ +ς𑓂𐋢.٨; ς𑓂𐋢.٨; [B1]; xn--3xa8371khhl.xn--hib; ; xn--4xa6371khhl.xn--hib; # ς𑓂𐋢.٨ +ς𑓂𐋢.٨; ; [B1]; xn--3xa8371khhl.xn--hib; ; xn--4xa6371khhl.xn--hib; # ς𑓂𐋢.٨ +Σ𑓂𐋢.٨; σ𑓂𐋢.٨; [B1]; xn--4xa6371khhl.xn--hib; ; ; # σ𑓂𐋢.٨ +σ𑓂𐋢.٨; ; [B1]; xn--4xa6371khhl.xn--hib; ; ; # σ𑓂𐋢.٨ +xn--4xa6371khhl.xn--hib; σ𑓂𐋢.٨; [B1]; xn--4xa6371khhl.xn--hib; ; ; # σ𑓂𐋢.٨ +xn--3xa8371khhl.xn--hib; ς𑓂𐋢.٨; [B1]; xn--3xa8371khhl.xn--hib; ; ; # ς𑓂𐋢.٨ +Σ𑓂𐋢.٨; σ𑓂𐋢.٨; [B1]; xn--4xa6371khhl.xn--hib; ; ; # σ𑓂𐋢.٨ +σ𑓂𐋢.٨; σ𑓂𐋢.٨; [B1]; xn--4xa6371khhl.xn--hib; ; ; # σ𑓂𐋢.٨ +꥓‌𐋻‍.ⷸ𞿄𐹲; ; [B1, B6, C2, P1, V5, V6]; xn--0ugc8356he76c.xn--urju692efj0f; ; xn--3j9a531o.xn--urju692efj0f; [B1, P1, V5, V6] # ꥓𐋻.ⷸ𐹲 +xn--3j9a531o.xn--urju692efj0f; ꥓𐋻.ⷸ𞿄𐹲; [B1, V5, V6]; xn--3j9a531o.xn--urju692efj0f; ; ; # ꥓𐋻.ⷸ𐹲 +xn--0ugc8356he76c.xn--urju692efj0f; ꥓‌𐋻‍.ⷸ𞿄𐹲; [B1, B6, C2, V5, V6]; xn--0ugc8356he76c.xn--urju692efj0f; ; ; # ꥓𐋻.ⷸ𐹲 +⊼。񪧖ڕ; ⊼.񪧖ڕ; [B1, B5, B6, P1, V6]; xn--ofh.xn--rjb13118f; ; ; # ⊼.ڕ +xn--ofh.xn--rjb13118f; ⊼.񪧖ڕ; [B1, B5, B6, V6]; xn--ofh.xn--rjb13118f; ; ; # ⊼.ڕ +𐯬񖋔。󜳥; 𐯬񖋔.󜳥; [B2, B3, P1, V6]; xn--949co370q.xn--7g25e; ; ; # . +xn--949co370q.xn--7g25e; 𐯬񖋔.󜳥; [B2, B3, V6]; xn--949co370q.xn--7g25e; ; ; # . +؁𑍧ߝ。ς򬍘🀞឵; ؁𑍧ߝ.ς򬍘🀞឵; [B1, B6, P1, V6]; xn--jfb66gt010c.xn--3xa823h9p95ars26d; ; xn--jfb66gt010c.xn--4xa623h9p95ars26d; # 𑍧ߝ.ς🀞 +؁𑍧ߝ。Σ򬍘🀞឵; ؁𑍧ߝ.σ򬍘🀞឵; [B1, B6, P1, V6]; xn--jfb66gt010c.xn--4xa623h9p95ars26d; ; ; # 𑍧ߝ.σ🀞 +؁𑍧ߝ。σ򬍘🀞឵; ؁𑍧ߝ.σ򬍘🀞឵; [B1, B6, P1, V6]; xn--jfb66gt010c.xn--4xa623h9p95ars26d; ; ; # 𑍧ߝ.σ🀞 +xn--jfb66gt010c.xn--4xa623h9p95ars26d; ؁𑍧ߝ.σ򬍘🀞឵; [B1, B6, V6]; xn--jfb66gt010c.xn--4xa623h9p95ars26d; ; ; # 𑍧ߝ.σ🀞 +xn--jfb66gt010c.xn--3xa823h9p95ars26d; ؁𑍧ߝ.ς򬍘🀞឵; [B1, B6, V6]; xn--jfb66gt010c.xn--3xa823h9p95ars26d; ; ; # 𑍧ߝ.ς🀞 +-𐳲ن󠺐。꯭𝟥; -𐳲ن󠺐.꯭3; [B1, P1, V3, V5, V6]; xn----roc5482rek10i.xn--3-zw5e; ; ; # -𐳲ن.꯭3 +-𐳲ن󠺐。꯭3; -𐳲ن󠺐.꯭3; [B1, P1, V3, V5, V6]; xn----roc5482rek10i.xn--3-zw5e; ; ; # -𐳲ن.꯭3 +-𐲲ن󠺐。꯭3; -𐳲ن󠺐.꯭3; [B1, P1, V3, V5, V6]; xn----roc5482rek10i.xn--3-zw5e; ; ; # -𐳲ن.꯭3 +xn----roc5482rek10i.xn--3-zw5e; -𐳲ن󠺐.꯭3; [B1, V3, V5, V6]; xn----roc5482rek10i.xn--3-zw5e; ; ; # -𐳲ن.꯭3 +-𐲲ن󠺐。꯭𝟥; -𐳲ن󠺐.꯭3; [B1, P1, V3, V5, V6]; xn----roc5482rek10i.xn--3-zw5e; ; ; # -𐳲ن.꯭3 +‌󠴦。񲨕≮𐦜; ‌󠴦.񲨕≮𐦜; [B1, B5, B6, C1, P1, V6]; xn--0ug22251l.xn--gdhz712gzlr6b; ; xn--6v56e.xn--gdhz712gzlr6b; [B1, B5, B6, P1, V6] # .≮𐦜 +‌󠴦。񲨕≮𐦜; ‌󠴦.񲨕≮𐦜; [B1, B5, B6, C1, P1, V6]; xn--0ug22251l.xn--gdhz712gzlr6b; ; xn--6v56e.xn--gdhz712gzlr6b; [B1, B5, B6, P1, V6] # .≮𐦜 +‌󠴦。񲨕≮𐦜; ‌󠴦.񲨕≮𐦜; [B1, B5, B6, C1, P1, V6]; xn--0ug22251l.xn--gdhz712gzlr6b; ; xn--6v56e.xn--gdhz712gzlr6b; [B1, B5, B6, P1, V6] # .≮𐦜 +‌󠴦。񲨕≮𐦜; ‌󠴦.񲨕≮𐦜; [B1, B5, B6, C1, P1, V6]; xn--0ug22251l.xn--gdhz712gzlr6b; ; xn--6v56e.xn--gdhz712gzlr6b; [B1, B5, B6, P1, V6] # .≮𐦜 +xn--6v56e.xn--gdhz712gzlr6b; 󠴦.񲨕≮𐦜; [B1, B5, B6, V6]; xn--6v56e.xn--gdhz712gzlr6b; ; ; # .≮𐦜 +xn--0ug22251l.xn--gdhz712gzlr6b; ‌󠴦.񲨕≮𐦜; [B1, B5, B6, C1, V6]; xn--0ug22251l.xn--gdhz712gzlr6b; ; ; # .≮𐦜 +⒈✌򟬟.𝟡񠱣; ⒈✌򟬟.9񠱣; [P1, V6]; xn--tsh24g49550b.xn--9-o706d; ; ; # ⒈✌.9 +1.✌򟬟.9񠱣; ; [P1, V6]; 1.xn--7bi44996f.xn--9-o706d; ; ; # 1.✌.9 +1.xn--7bi44996f.xn--9-o706d; 1.✌򟬟.9񠱣; [V6]; 1.xn--7bi44996f.xn--9-o706d; ; ; # 1.✌.9 +xn--tsh24g49550b.xn--9-o706d; ⒈✌򟬟.9񠱣; [V6]; xn--tsh24g49550b.xn--9-o706d; ; ; # ⒈✌.9 +𑆾𞤬𐮆.٦ᷔ; ; [B1, V5]; xn--d29c79hf98r.xn--fib011j; ; ; # 𑆾𞤬𐮆.٦ᷔ +𑆾𞤊𐮆.٦ᷔ; 𑆾𞤬𐮆.٦ᷔ; [B1, V5]; xn--d29c79hf98r.xn--fib011j; ; ; # 𑆾𞤬𐮆.٦ᷔ +xn--d29c79hf98r.xn--fib011j; 𑆾𞤬𐮆.٦ᷔ; [B1, V5]; xn--d29c79hf98r.xn--fib011j; ; ; # 𑆾𞤬𐮆.٦ᷔ +ς.꧀꣄; ς.꧀꣄; [V5]; xn--3xa.xn--0f9ars; ; xn--4xa.xn--0f9ars; # ς.꧀꣄ +ς.꧀꣄; ; [V5]; xn--3xa.xn--0f9ars; ; xn--4xa.xn--0f9ars; # ς.꧀꣄ +Σ.꧀꣄; σ.꧀꣄; [V5]; xn--4xa.xn--0f9ars; ; ; # σ.꧀꣄ +σ.꧀꣄; ; [V5]; xn--4xa.xn--0f9ars; ; ; # σ.꧀꣄ +xn--4xa.xn--0f9ars; σ.꧀꣄; [V5]; xn--4xa.xn--0f9ars; ; ; # σ.꧀꣄ +xn--3xa.xn--0f9ars; ς.꧀꣄; [V5]; xn--3xa.xn--0f9ars; ; ; # ς.꧀꣄ +Σ.꧀꣄; σ.꧀꣄; [V5]; xn--4xa.xn--0f9ars; ; ; # σ.꧀꣄ +σ.꧀꣄; σ.꧀꣄; [V5]; xn--4xa.xn--0f9ars; ; ; # σ.꧀꣄ +𑰶‌≯𐳐.࡛; 𑰶‌≯𐳐.࡛; [B1, B3, B6, C1, P1, V5, V6]; xn--0ug06g7697ap4ma.xn--qwb; ; xn--hdhz343g3wj.xn--qwb; [B1, B3, B6, P1, V5, V6] # 𑰶≯𐳐.࡛ +𑰶‌≯𐳐.࡛; 𑰶‌≯𐳐.࡛; [B1, B3, B6, C1, P1, V5, V6]; xn--0ug06g7697ap4ma.xn--qwb; ; xn--hdhz343g3wj.xn--qwb; [B1, B3, B6, P1, V5, V6] # 𑰶≯𐳐.࡛ +𑰶‌≯𐳐.࡛; ; [B1, B3, B6, C1, P1, V5, V6]; xn--0ug06g7697ap4ma.xn--qwb; ; xn--hdhz343g3wj.xn--qwb; [B1, B3, B6, P1, V5, V6] # 𑰶≯𐳐.࡛ +𑰶‌≯𐳐.࡛; 𑰶‌≯𐳐.࡛; [B1, B3, B6, C1, P1, V5, V6]; xn--0ug06g7697ap4ma.xn--qwb; ; xn--hdhz343g3wj.xn--qwb; [B1, B3, B6, P1, V5, V6] # 𑰶≯𐳐.࡛ +𑰶‌≯𐲐.࡛; 𑰶‌≯𐳐.࡛; [B1, B3, B6, C1, P1, V5, V6]; xn--0ug06g7697ap4ma.xn--qwb; ; xn--hdhz343g3wj.xn--qwb; [B1, B3, B6, P1, V5, V6] # 𑰶≯𐳐.࡛ +𑰶‌≯𐲐.࡛; 𑰶‌≯𐳐.࡛; [B1, B3, B6, C1, P1, V5, V6]; xn--0ug06g7697ap4ma.xn--qwb; ; xn--hdhz343g3wj.xn--qwb; [B1, B3, B6, P1, V5, V6] # 𑰶≯𐳐.࡛ +xn--hdhz343g3wj.xn--qwb; 𑰶≯𐳐.࡛; [B1, B3, B6, V5, V6]; xn--hdhz343g3wj.xn--qwb; ; ; # 𑰶≯𐳐.࡛ +xn--0ug06g7697ap4ma.xn--qwb; 𑰶‌≯𐳐.࡛; [B1, B3, B6, C1, V5, V6]; xn--0ug06g7697ap4ma.xn--qwb; ; ; # 𑰶≯𐳐.࡛ +𑰶‌≯𐲐.࡛; 𑰶‌≯𐳐.࡛; [B1, B3, B6, C1, P1, V5, V6]; xn--0ug06g7697ap4ma.xn--qwb; ; xn--hdhz343g3wj.xn--qwb; [B1, B3, B6, P1, V5, V6] # 𑰶≯𐳐.࡛ +𑰶‌≯𐲐.࡛; 𑰶‌≯𐳐.࡛; [B1, B3, B6, C1, P1, V5, V6]; xn--0ug06g7697ap4ma.xn--qwb; ; xn--hdhz343g3wj.xn--qwb; [B1, B3, B6, P1, V5, V6] # 𑰶≯𐳐.࡛ +羚。≯; 羚.≯; [P1, V6]; xn--xt0a.xn--hdh; ; ; # 羚.≯ +羚。≯; 羚.≯; [P1, V6]; xn--xt0a.xn--hdh; ; ; # 羚.≯ +羚。≯; 羚.≯; [P1, V6]; xn--xt0a.xn--hdh; ; ; # 羚.≯ +羚。≯; 羚.≯; [P1, V6]; xn--xt0a.xn--hdh; ; ; # 羚.≯ +xn--xt0a.xn--hdh; 羚.≯; [V6]; xn--xt0a.xn--hdh; ; ; # 羚.≯ +𑓂᝙.ࢨ; 𑓂᝙.ࢨ; [B1, P1, V5, V6]; xn--e1e9580k.xn--xyb; ; ; # 𑓂.ࢨ +𑓂᝙.ࢨ; ; [B1, P1, V5, V6]; xn--e1e9580k.xn--xyb; ; ; # 𑓂.ࢨ +xn--e1e9580k.xn--xyb; 𑓂᝙.ࢨ; [B1, V5, V6]; xn--e1e9580k.xn--xyb; ; ; # 𑓂.ࢨ +󨣿󠇀‍。٣ҠჀ𝟑; 󨣿‍.٣ҡჀ3; [B1, B6, C2, P1, V6]; xn--1ug89936l.xn--3-ozb36kixu; ; xn--1r19e.xn--3-ozb36kixu; [B1, P1, V6] # .٣ҡჀ3 +󨣿󠇀‍。٣ҠჀ3; 󨣿‍.٣ҡჀ3; [B1, B6, C2, P1, V6]; xn--1ug89936l.xn--3-ozb36kixu; ; xn--1r19e.xn--3-ozb36kixu; [B1, P1, V6] # .٣ҡჀ3 +󨣿󠇀‍。٣ҡⴠ3; 󨣿‍.٣ҡⴠ3; [B1, B6, C2, P1, V6]; xn--1ug89936l.xn--3-ozb36ko13f; ; xn--1r19e.xn--3-ozb36ko13f; [B1, P1, V6] # .٣ҡⴠ3 +xn--1r19e.xn--3-ozb36ko13f; 󨣿.٣ҡⴠ3; [B1, V6]; xn--1r19e.xn--3-ozb36ko13f; ; ; # .٣ҡⴠ3 +xn--1ug89936l.xn--3-ozb36ko13f; 󨣿‍.٣ҡⴠ3; [B1, B6, C2, V6]; xn--1ug89936l.xn--3-ozb36ko13f; ; ; # .٣ҡⴠ3 +xn--1r19e.xn--3-ozb36kixu; 󨣿.٣ҡჀ3; [B1, V6]; xn--1r19e.xn--3-ozb36kixu; ; ; # .٣ҡჀ3 +xn--1ug89936l.xn--3-ozb36kixu; 󨣿‍.٣ҡჀ3; [B1, B6, C2, V6]; xn--1ug89936l.xn--3-ozb36kixu; ; ; # .٣ҡჀ3 +󨣿󠇀‍。٣ҡⴠ𝟑; 󨣿‍.٣ҡⴠ3; [B1, B6, C2, P1, V6]; xn--1ug89936l.xn--3-ozb36ko13f; ; xn--1r19e.xn--3-ozb36ko13f; [B1, P1, V6] # .٣ҡⴠ3 +󨣿󠇀‍。٣Ҡⴠ3; 󨣿‍.٣ҡⴠ3; [B1, B6, C2, P1, V6]; xn--1ug89936l.xn--3-ozb36ko13f; ; xn--1r19e.xn--3-ozb36ko13f; [B1, P1, V6] # .٣ҡⴠ3 +󨣿󠇀‍。٣Ҡⴠ𝟑; 󨣿‍.٣ҡⴠ3; [B1, B6, C2, P1, V6]; xn--1ug89936l.xn--3-ozb36ko13f; ; xn--1r19e.xn--3-ozb36ko13f; [B1, P1, V6] # .٣ҡⴠ3 +ᡷ。𐹢࣠; ᡷ.𐹢࣠; [B1]; xn--k9e.xn--j0b5005k; ; ; # ᡷ.𐹢࣠ +xn--k9e.xn--j0b5005k; ᡷ.𐹢࣠; [B1]; xn--k9e.xn--j0b5005k; ; ; # ᡷ.𐹢࣠ +򕮇᯳。٦񗜼្ß; 򕮇᯳.٦񗜼្ß; [B1, P1, V6]; xn--1zf58212h.xn--zca34zk4qx711k; ; xn--1zf58212h.xn--ss-pyd459o3258m; # ᯳.٦្ß +򕮇᯳。٦񗜼្ß; 򕮇᯳.٦񗜼្ß; [B1, P1, V6]; xn--1zf58212h.xn--zca34zk4qx711k; ; xn--1zf58212h.xn--ss-pyd459o3258m; # ᯳.٦្ß +򕮇᯳。٦񗜼្SS; 򕮇᯳.٦񗜼្ss; [B1, P1, V6]; xn--1zf58212h.xn--ss-pyd459o3258m; ; ; # ᯳.٦្ss +򕮇᯳。٦񗜼្ss; 򕮇᯳.٦񗜼្ss; [B1, P1, V6]; xn--1zf58212h.xn--ss-pyd459o3258m; ; ; # ᯳.٦្ss +򕮇᯳。٦񗜼្Ss; 򕮇᯳.٦񗜼្ss; [B1, P1, V6]; xn--1zf58212h.xn--ss-pyd459o3258m; ; ; # ᯳.٦្ss +xn--1zf58212h.xn--ss-pyd459o3258m; 򕮇᯳.٦񗜼្ss; [B1, V6]; xn--1zf58212h.xn--ss-pyd459o3258m; ; ; # ᯳.٦្ss +xn--1zf58212h.xn--zca34zk4qx711k; 򕮇᯳.٦񗜼្ß; [B1, V6]; xn--1zf58212h.xn--zca34zk4qx711k; ; ; # ᯳.٦្ß +򕮇᯳。٦񗜼្SS; 򕮇᯳.٦񗜼្ss; [B1, P1, V6]; xn--1zf58212h.xn--ss-pyd459o3258m; ; ; # ᯳.٦្ss +򕮇᯳。٦񗜼្ss; 򕮇᯳.٦񗜼្ss; [B1, P1, V6]; xn--1zf58212h.xn--ss-pyd459o3258m; ; ; # ᯳.٦្ss +򕮇᯳。٦񗜼្Ss; 򕮇᯳.٦񗜼្ss; [B1, P1, V6]; xn--1zf58212h.xn--ss-pyd459o3258m; ; ; # ᯳.٦្ss +٤򤽎𑲛.󠔢︒≠; ; [B1, P1, V6]; xn--dib0653l2i02d.xn--1ch7467f14u4g; ; ; # ٤𑲛.︒≠ +٤򤽎𑲛.󠔢︒≠; ٤򤽎𑲛.󠔢︒≠; [B1, P1, V6]; xn--dib0653l2i02d.xn--1ch7467f14u4g; ; ; # ٤𑲛.︒≠ +٤򤽎𑲛.󠔢。≠; ٤򤽎𑲛.󠔢.≠; [B1, P1, V6]; xn--dib0653l2i02d.xn--k736e.xn--1ch; ; ; # ٤𑲛..≠ +٤򤽎𑲛.󠔢。≠; ٤򤽎𑲛.󠔢.≠; [B1, P1, V6]; xn--dib0653l2i02d.xn--k736e.xn--1ch; ; ; # ٤𑲛..≠ +xn--dib0653l2i02d.xn--k736e.xn--1ch; ٤򤽎𑲛.󠔢.≠; [B1, V6]; xn--dib0653l2i02d.xn--k736e.xn--1ch; ; ; # ٤𑲛..≠ +xn--dib0653l2i02d.xn--1ch7467f14u4g; ٤򤽎𑲛.󠔢︒≠; [B1, V6]; xn--dib0653l2i02d.xn--1ch7467f14u4g; ; ; # ٤𑲛.︒≠ +➆񷧕ỗ⒈.򑬒񡘮࡛𝟫; ➆񷧕ỗ⒈.򑬒񡘮࡛9; [P1, V6]; xn--6lg26tvvc6v99z.xn--9-6jd87310jtcqs; ; ; # ➆ỗ⒈.࡛9 +➆񷧕ỗ⒈.򑬒񡘮࡛𝟫; ➆񷧕ỗ⒈.򑬒񡘮࡛9; [P1, V6]; xn--6lg26tvvc6v99z.xn--9-6jd87310jtcqs; ; ; # ➆ỗ⒈.࡛9 +➆񷧕ỗ1..򑬒񡘮࡛9; ; [P1, V6, X4_2]; xn--1-3xm292b6044r..xn--9-6jd87310jtcqs; [P1, V6, A4_2]; ; # ➆ỗ1..࡛9 +➆񷧕ỗ1..򑬒񡘮࡛9; ➆񷧕ỗ1..򑬒񡘮࡛9; [P1, V6, X4_2]; xn--1-3xm292b6044r..xn--9-6jd87310jtcqs; [P1, V6, A4_2]; ; # ➆ỗ1..࡛9 +➆񷧕Ỗ1..򑬒񡘮࡛9; ➆񷧕ỗ1..򑬒񡘮࡛9; [P1, V6, X4_2]; xn--1-3xm292b6044r..xn--9-6jd87310jtcqs; [P1, V6, A4_2]; ; # ➆ỗ1..࡛9 +➆񷧕Ỗ1..򑬒񡘮࡛9; ➆񷧕ỗ1..򑬒񡘮࡛9; [P1, V6, X4_2]; xn--1-3xm292b6044r..xn--9-6jd87310jtcqs; [P1, V6, A4_2]; ; # ➆ỗ1..࡛9 +xn--1-3xm292b6044r..xn--9-6jd87310jtcqs; ➆񷧕ỗ1..򑬒񡘮࡛9; [V6, X4_2]; xn--1-3xm292b6044r..xn--9-6jd87310jtcqs; [V6, A4_2]; ; # ➆ỗ1..࡛9 +➆񷧕Ỗ⒈.򑬒񡘮࡛𝟫; ➆񷧕ỗ⒈.򑬒񡘮࡛9; [P1, V6]; xn--6lg26tvvc6v99z.xn--9-6jd87310jtcqs; ; ; # ➆ỗ⒈.࡛9 +➆񷧕Ỗ⒈.򑬒񡘮࡛𝟫; ➆񷧕ỗ⒈.򑬒񡘮࡛9; [P1, V6]; xn--6lg26tvvc6v99z.xn--9-6jd87310jtcqs; ; ; # ➆ỗ⒈.࡛9 +xn--6lg26tvvc6v99z.xn--9-6jd87310jtcqs; ➆񷧕ỗ⒈.򑬒񡘮࡛9; [V6]; xn--6lg26tvvc6v99z.xn--9-6jd87310jtcqs; ; ; # ➆ỗ⒈.࡛9 +‍。𞤘; ‍.𞤺; [B1, C2]; xn--1ug.xn--ye6h; ; .xn--ye6h; [A4_2] # .𞤺 +‍。𞤘; ‍.𞤺; [B1, C2]; xn--1ug.xn--ye6h; ; .xn--ye6h; [A4_2] # .𞤺 +‍。𞤺; ‍.𞤺; [B1, C2]; xn--1ug.xn--ye6h; ; .xn--ye6h; [A4_2] # .𞤺 +.xn--ye6h; .𞤺; [X4_2]; .xn--ye6h; [A4_2]; ; # .𞤺 +xn--1ug.xn--ye6h; ‍.𞤺; [B1, C2]; xn--1ug.xn--ye6h; ; ; # .𞤺 +‍。𞤺; ‍.𞤺; [B1, C2]; xn--1ug.xn--ye6h; ; .xn--ye6h; [A4_2] # .𞤺 +xn--ye6h; 𞤺; ; xn--ye6h; ; ; # 𞤺 +𞤺; ; ; xn--ye6h; ; ; # 𞤺 +𞤘; 𞤺; ; xn--ye6h; ; ; # 𞤺 +ࠩܤ.ᢣ; ; [B1, V5]; xn--unb53c.xn--tbf; ; ; # ࠩܤ.ᢣ +xn--unb53c.xn--tbf; ࠩܤ.ᢣ; [B1, V5]; xn--unb53c.xn--tbf; ; ; # ࠩܤ.ᢣ +ܼ‌-。𓐾ß; ܼ‌-.𓐾ß; [C1, P1, V3, V5, V6]; xn----s2c071q.xn--zca7848m; ; xn----s2c.xn--ss-066q; [P1, V3, V5, V6] # ܼ-.ß +ܼ‌-。𓐾SS; ܼ‌-.𓐾ss; [C1, P1, V3, V5, V6]; xn----s2c071q.xn--ss-066q; ; xn----s2c.xn--ss-066q; [P1, V3, V5, V6] # ܼ-.ss +ܼ‌-。𓐾ss; ܼ‌-.𓐾ss; [C1, P1, V3, V5, V6]; xn----s2c071q.xn--ss-066q; ; xn----s2c.xn--ss-066q; [P1, V3, V5, V6] # ܼ-.ss +ܼ‌-。𓐾Ss; ܼ‌-.𓐾ss; [C1, P1, V3, V5, V6]; xn----s2c071q.xn--ss-066q; ; xn----s2c.xn--ss-066q; [P1, V3, V5, V6] # ܼ-.ss +xn----s2c.xn--ss-066q; ܼ-.𓐾ss; [V3, V5, V6]; xn----s2c.xn--ss-066q; ; ; # ܼ-.ss +xn----s2c071q.xn--ss-066q; ܼ‌-.𓐾ss; [C1, V3, V5, V6]; xn----s2c071q.xn--ss-066q; ; ; # ܼ-.ss +xn----s2c071q.xn--zca7848m; ܼ‌-.𓐾ß; [C1, V3, V5, V6]; xn----s2c071q.xn--zca7848m; ; ; # ܼ-.ß +‌ς🃡⒗.ೆ仧ݖ; ; [B1, B5, B6, C1, P1, V5, V6]; xn--3xa795lz9czy52d.xn--9ob79ycx2e; ; xn--4xa229nbu92a.xn--9ob79ycx2e; [B5, B6, P1, V5, V6] # ς🃡⒗.ೆ仧ݖ +‌ς🃡16..ೆ仧ݖ; ; [B1, B5, B6, C1, V5, X4_2]; xn--16-rbc1800avy99b..xn--9ob79ycx2e; [B1, B5, B6, C1, V5, A4_2]; xn--16-ubc66061c..xn--9ob79ycx2e; [B5, B6, V5, A4_2] # ς🃡16..ೆ仧ݖ +‌Σ🃡16..ೆ仧ݖ; ‌σ🃡16..ೆ仧ݖ; [B1, B5, B6, C1, V5, X4_2]; xn--16-ubc7700avy99b..xn--9ob79ycx2e; [B1, B5, B6, C1, V5, A4_2]; xn--16-ubc66061c..xn--9ob79ycx2e; [B5, B6, V5, A4_2] # σ🃡16..ೆ仧ݖ +‌σ🃡16..ೆ仧ݖ; ; [B1, B5, B6, C1, V5, X4_2]; xn--16-ubc7700avy99b..xn--9ob79ycx2e; [B1, B5, B6, C1, V5, A4_2]; xn--16-ubc66061c..xn--9ob79ycx2e; [B5, B6, V5, A4_2] # σ🃡16..ೆ仧ݖ +xn--16-ubc66061c..xn--9ob79ycx2e; σ🃡16..ೆ仧ݖ; [B5, B6, V5, X4_2]; xn--16-ubc66061c..xn--9ob79ycx2e; [B5, B6, V5, A4_2]; ; # σ🃡16..ೆ仧ݖ +xn--16-ubc7700avy99b..xn--9ob79ycx2e; ‌σ🃡16..ೆ仧ݖ; [B1, B5, B6, C1, V5, X4_2]; xn--16-ubc7700avy99b..xn--9ob79ycx2e; [B1, B5, B6, C1, V5, A4_2]; ; # σ🃡16..ೆ仧ݖ +xn--16-rbc1800avy99b..xn--9ob79ycx2e; ‌ς🃡16..ೆ仧ݖ; [B1, B5, B6, C1, V5, X4_2]; xn--16-rbc1800avy99b..xn--9ob79ycx2e; [B1, B5, B6, C1, V5, A4_2]; ; # ς🃡16..ೆ仧ݖ +‌Σ🃡⒗.ೆ仧ݖ; ‌σ🃡⒗.ೆ仧ݖ; [B1, B5, B6, C1, P1, V5, V6]; xn--4xa595lz9czy52d.xn--9ob79ycx2e; ; xn--4xa229nbu92a.xn--9ob79ycx2e; [B5, B6, P1, V5, V6] # σ🃡⒗.ೆ仧ݖ +‌σ🃡⒗.ೆ仧ݖ; ; [B1, B5, B6, C1, P1, V5, V6]; xn--4xa595lz9czy52d.xn--9ob79ycx2e; ; xn--4xa229nbu92a.xn--9ob79ycx2e; [B5, B6, P1, V5, V6] # σ🃡⒗.ೆ仧ݖ +xn--4xa229nbu92a.xn--9ob79ycx2e; σ🃡⒗.ೆ仧ݖ; [B5, B6, V5, V6]; xn--4xa229nbu92a.xn--9ob79ycx2e; ; ; # σ🃡⒗.ೆ仧ݖ +xn--4xa595lz9czy52d.xn--9ob79ycx2e; ‌σ🃡⒗.ೆ仧ݖ; [B1, B5, B6, C1, V5, V6]; xn--4xa595lz9czy52d.xn--9ob79ycx2e; ; ; # σ🃡⒗.ೆ仧ݖ +xn--3xa795lz9czy52d.xn--9ob79ycx2e; ‌ς🃡⒗.ೆ仧ݖ; [B1, B5, B6, C1, V5, V6]; xn--3xa795lz9czy52d.xn--9ob79ycx2e; ; ; # ς🃡⒗.ೆ仧ݖ +-.𞸚; -.ظ; [B1, V3]; -.xn--3gb; ; ; # -.ظ +-.ظ; ; [B1, V3]; -.xn--3gb; ; ; # -.ظ +-.xn--3gb; -.ظ; [B1, V3]; -.xn--3gb; ; ; # -.ظ +򏛓ڃ.ཾش; ; [B1, B5, B6, P1, V5, V6]; xn--8ib92728i.xn--zgb968b; ; ; # ڃ.ཾش +xn--8ib92728i.xn--zgb968b; 򏛓ڃ.ཾش; [B1, B5, B6, V5, V6]; xn--8ib92728i.xn--zgb968b; ; ; # ڃ.ཾش +࿦ࡃ񽶬.𐮏; ; [B5, P1, V6]; xn--1vb320b5m04p.xn--m29c; ; ; # ࡃ.𐮏 +xn--1vb320b5m04p.xn--m29c; ࿦ࡃ񽶬.𐮏; [B5, V6]; xn--1vb320b5m04p.xn--m29c; ; ; # ࡃ.𐮏 +2񎨠ߋß。ᠽ; 2񎨠ߋß.ᠽ; [B1, P1, V6]; xn--2-qfa924cez02l.xn--w7e; ; xn--2ss-odg83511n.xn--w7e; # 2ߋß.ᠽ +2񎨠ߋSS。ᠽ; 2񎨠ߋss.ᠽ; [B1, P1, V6]; xn--2ss-odg83511n.xn--w7e; ; ; # 2ߋss.ᠽ +2񎨠ߋss。ᠽ; 2񎨠ߋss.ᠽ; [B1, P1, V6]; xn--2ss-odg83511n.xn--w7e; ; ; # 2ߋss.ᠽ +xn--2ss-odg83511n.xn--w7e; 2񎨠ߋss.ᠽ; [B1, V6]; xn--2ss-odg83511n.xn--w7e; ; ; # 2ߋss.ᠽ +xn--2-qfa924cez02l.xn--w7e; 2񎨠ߋß.ᠽ; [B1, V6]; xn--2-qfa924cez02l.xn--w7e; ; ; # 2ߋß.ᠽ +2񎨠ߋSs。ᠽ; 2񎨠ߋss.ᠽ; [B1, P1, V6]; xn--2ss-odg83511n.xn--w7e; ; ; # 2ߋss.ᠽ +㸳ߊ≮.ێß-‍; 㸳ߊ≮.ێß-‍; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn----pfa076bys4a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێß- +㸳ߊ≮.ێß-‍; 㸳ߊ≮.ێß-‍; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn----pfa076bys4a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێß- +㸳ߊ≮.ێß-‍; ; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn----pfa076bys4a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێß- +㸳ߊ≮.ێß-‍; 㸳ߊ≮.ێß-‍; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn----pfa076bys4a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێß- +㸳ߊ≮.ێSS-‍; 㸳ߊ≮.ێss-‍; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn--ss--qjf2343a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێss- +㸳ߊ≮.ێSS-‍; 㸳ߊ≮.ێss-‍; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn--ss--qjf2343a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێss- +㸳ߊ≮.ێss-‍; ; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn--ss--qjf2343a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێss- +㸳ߊ≮.ێss-‍; 㸳ߊ≮.ێss-‍; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn--ss--qjf2343a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێss- +xn--lsb457kkut.xn--ss--qjf; 㸳ߊ≮.ێss-; [B2, B3, B5, B6, V3, V6]; xn--lsb457kkut.xn--ss--qjf; ; ; # 㸳ߊ≮.ێss- +xn--lsb457kkut.xn--ss--qjf2343a; 㸳ߊ≮.ێss-‍; [B2, B3, B5, B6, C2, V6]; xn--lsb457kkut.xn--ss--qjf2343a; ; ; # 㸳ߊ≮.ێss- +xn--lsb457kkut.xn----pfa076bys4a; 㸳ߊ≮.ێß-‍; [B2, B3, B5, B6, C2, V6]; xn--lsb457kkut.xn----pfa076bys4a; ; ; # 㸳ߊ≮.ێß- +㸳ߊ≮.ێSS-‍; 㸳ߊ≮.ێss-‍; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn--ss--qjf2343a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێss- +㸳ߊ≮.ێSS-‍; 㸳ߊ≮.ێss-‍; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn--ss--qjf2343a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێss- +㸳ߊ≮.ێss-‍; 㸳ߊ≮.ێss-‍; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn--ss--qjf2343a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێss- +㸳ߊ≮.ێss-‍; 㸳ߊ≮.ێss-‍; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn--ss--qjf2343a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێss- +㸳ߊ≮.ێSs-‍; 㸳ߊ≮.ێss-‍; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn--ss--qjf2343a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێss- +㸳ߊ≮.ێSs-‍; 㸳ߊ≮.ێss-‍; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn--ss--qjf2343a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێss- +㸳ߊ≮.ێSs-‍; 㸳ߊ≮.ێss-‍; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn--ss--qjf2343a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێss- +㸳ߊ≮.ێSs-‍; 㸳ߊ≮.ێss-‍; [B2, B3, B5, B6, C2, P1, V6]; xn--lsb457kkut.xn--ss--qjf2343a; ; xn--lsb457kkut.xn--ss--qjf; [B2, B3, B5, B6, P1, V3, V6] # 㸳ߊ≮.ێss- +-򷝬፞𑜧.ᷫ-︒; ; [P1, V3, V5, V6]; xn----b5h1837n2ok9f.xn----mkmw278h; ; ; # -፞𑜧.ᷫ-︒ +-򷝬፞𑜧.ᷫ-。; -򷝬፞𑜧.ᷫ-.; [P1, V3, V5, V6]; xn----b5h1837n2ok9f.xn----mkm.; ; ; # -፞𑜧.ᷫ-. +xn----b5h1837n2ok9f.xn----mkm.; -򷝬፞𑜧.ᷫ-.; [V3, V5, V6]; xn----b5h1837n2ok9f.xn----mkm.; ; ; # -፞𑜧.ᷫ-. +xn----b5h1837n2ok9f.xn----mkmw278h; -򷝬፞𑜧.ᷫ-︒; [V3, V5, V6]; xn----b5h1837n2ok9f.xn----mkmw278h; ; ; # -፞𑜧.ᷫ-︒ +︒.򚠡ᩙ; ; [P1, V6]; xn--y86c.xn--cof61594i; ; ; # ︒.ᩙ +。.򚠡ᩙ; ..򚠡ᩙ; [P1, V6, X4_2]; ..xn--cof61594i; [P1, V6, A4_2]; ; # ..ᩙ +..xn--cof61594i; ..򚠡ᩙ; [V6, X4_2]; ..xn--cof61594i; [V6, A4_2]; ; # ..ᩙ +xn--y86c.xn--cof61594i; ︒.򚠡ᩙ; [V6]; xn--y86c.xn--cof61594i; ; ; # ︒.ᩙ +̣ⷡ。‌⓾‌ڹ; ̣ⷡ.‌⓾‌ڹ; [B1, B3, B6, C1, V5]; xn--kta899s.xn--skb970ka771c; ; xn--kta899s.xn--skb116m; [B1, B3, B6, V5] # ̣ⷡ.⓾ڹ +xn--kta899s.xn--skb116m; ̣ⷡ.⓾ڹ; [B1, B3, B6, V5]; xn--kta899s.xn--skb116m; ; ; # ̣ⷡ.⓾ڹ +xn--kta899s.xn--skb970ka771c; ̣ⷡ.‌⓾‌ڹ; [B1, B3, B6, C1, V5]; xn--kta899s.xn--skb970ka771c; ; ; # ̣ⷡ.⓾ڹ +𞠶ᠴ۝。ၴ𞤵󠅦; 𞠶ᠴ۝.ၴ𞤵; [B1, B2, P1, V5, V6]; xn--tlb199fwl35a.xn--yld4613v; ; ; # 𞠶ᠴ.ၴ𞤵 +𞠶ᠴ۝。ၴ𞤵󠅦; 𞠶ᠴ۝.ၴ𞤵; [B1, B2, P1, V5, V6]; xn--tlb199fwl35a.xn--yld4613v; ; ; # 𞠶ᠴ.ၴ𞤵 +𞠶ᠴ۝。ၴ𞤓󠅦; 𞠶ᠴ۝.ၴ𞤵; [B1, B2, P1, V5, V6]; xn--tlb199fwl35a.xn--yld4613v; ; ; # 𞠶ᠴ.ၴ𞤵 +xn--tlb199fwl35a.xn--yld4613v; 𞠶ᠴ۝.ၴ𞤵; [B1, B2, V5, V6]; xn--tlb199fwl35a.xn--yld4613v; ; ; # 𞠶ᠴ.ၴ𞤵 +𞠶ᠴ۝。ၴ𞤓󠅦; 𞠶ᠴ۝.ၴ𞤵; [B1, B2, P1, V5, V6]; xn--tlb199fwl35a.xn--yld4613v; ; ; # 𞠶ᠴ.ၴ𞤵 +𑰺.-򑟏; ; [P1, V3, V5, V6]; xn--jk3d.xn----iz68g; ; ; # 𑰺.- +xn--jk3d.xn----iz68g; 𑰺.-򑟏; [V3, V5, V6]; xn--jk3d.xn----iz68g; ; ; # 𑰺.- +󠻩.赏; 󠻩.赏; [P1, V6]; xn--2856e.xn--6o3a; ; ; # .赏 +󠻩.赏; ; [P1, V6]; xn--2856e.xn--6o3a; ; ; # .赏 +xn--2856e.xn--6o3a; 󠻩.赏; [V6]; xn--2856e.xn--6o3a; ; ; # .赏 +ڰᠡ。Ⴁ; ڰᠡ.Ⴁ; [B2, B3, P1, V6]; xn--jkb440g.xn--8md; ; ; # ڰᠡ.Ⴁ +ڰᠡ。Ⴁ; ڰᠡ.Ⴁ; [B2, B3, P1, V6]; xn--jkb440g.xn--8md; ; ; # ڰᠡ.Ⴁ +ڰᠡ。ⴁ; ڰᠡ.ⴁ; [B2, B3]; xn--jkb440g.xn--skj; ; ; # ڰᠡ.ⴁ +xn--jkb440g.xn--skj; ڰᠡ.ⴁ; [B2, B3]; xn--jkb440g.xn--skj; ; ; # ڰᠡ.ⴁ +xn--jkb440g.xn--8md; ڰᠡ.Ⴁ; [B2, B3, V6]; xn--jkb440g.xn--8md; ; ; # ڰᠡ.Ⴁ +ڰᠡ。ⴁ; ڰᠡ.ⴁ; [B2, B3]; xn--jkb440g.xn--skj; ; ; # ڰᠡ.ⴁ +⃞Ⴊڻς。-; ⃞Ⴊڻς.-; [B1, P1, V3, V5, V6]; xn--3xa53m7zmb0q.-; ; xn--4xa33m7zmb0q.-; # ⃞Ⴊڻς.- +⃞Ⴊڻς。-; ⃞Ⴊڻς.-; [B1, P1, V3, V5, V6]; xn--3xa53m7zmb0q.-; ; xn--4xa33m7zmb0q.-; # ⃞Ⴊڻς.- +⃞ⴊڻς。-; ⃞ⴊڻς.-; [B1, V3, V5]; xn--3xa53mr38aeel.-; ; xn--4xa33mr38aeel.-; # ⃞ⴊڻς.- +⃞ႪڻΣ。-; ⃞Ⴊڻσ.-; [B1, P1, V3, V5, V6]; xn--4xa33m7zmb0q.-; ; ; # ⃞Ⴊڻσ.- +⃞ⴊڻσ。-; ⃞ⴊڻσ.-; [B1, V3, V5]; xn--4xa33mr38aeel.-; ; ; # ⃞ⴊڻσ.- +⃞Ⴊڻσ。-; ⃞Ⴊڻσ.-; [B1, P1, V3, V5, V6]; xn--4xa33m7zmb0q.-; ; ; # ⃞Ⴊڻσ.- +xn--4xa33m7zmb0q.-; ⃞Ⴊڻσ.-; [B1, V3, V5, V6]; xn--4xa33m7zmb0q.-; ; ; # ⃞Ⴊڻσ.- +xn--4xa33mr38aeel.-; ⃞ⴊڻσ.-; [B1, V3, V5]; xn--4xa33mr38aeel.-; ; ; # ⃞ⴊڻσ.- +xn--3xa53mr38aeel.-; ⃞ⴊڻς.-; [B1, V3, V5]; xn--3xa53mr38aeel.-; ; ; # ⃞ⴊڻς.- +xn--3xa53m7zmb0q.-; ⃞Ⴊڻς.-; [B1, V3, V5, V6]; xn--3xa53m7zmb0q.-; ; ; # ⃞Ⴊڻς.- +⃞ⴊڻς。-; ⃞ⴊڻς.-; [B1, V3, V5]; xn--3xa53mr38aeel.-; ; xn--4xa33mr38aeel.-; # ⃞ⴊڻς.- +⃞ႪڻΣ。-; ⃞Ⴊڻσ.-; [B1, P1, V3, V5, V6]; xn--4xa33m7zmb0q.-; ; ; # ⃞Ⴊڻσ.- +⃞ⴊڻσ。-; ⃞ⴊڻσ.-; [B1, V3, V5]; xn--4xa33mr38aeel.-; ; ; # ⃞ⴊڻσ.- +⃞Ⴊڻσ。-; ⃞Ⴊڻσ.-; [B1, P1, V3, V5, V6]; xn--4xa33m7zmb0q.-; ; ; # ⃞Ⴊڻσ.- +Ⴍ.񍇦‌; Ⴍ.񍇦‌; [C1, P1, V6]; xn--lnd.xn--0ug56448b; ; xn--lnd.xn--p01x; [P1, V6] # Ⴍ. +Ⴍ.񍇦‌; ; [C1, P1, V6]; xn--lnd.xn--0ug56448b; ; xn--lnd.xn--p01x; [P1, V6] # Ⴍ. +ⴍ.񍇦‌; ; [C1, P1, V6]; xn--4kj.xn--0ug56448b; ; xn--4kj.xn--p01x; [P1, V6] # ⴍ. +xn--4kj.xn--p01x; ⴍ.񍇦; [V6]; xn--4kj.xn--p01x; ; ; # ⴍ. +xn--4kj.xn--0ug56448b; ⴍ.񍇦‌; [C1, V6]; xn--4kj.xn--0ug56448b; ; ; # ⴍ. +xn--lnd.xn--p01x; Ⴍ.񍇦; [V6]; xn--lnd.xn--p01x; ; ; # Ⴍ. +xn--lnd.xn--0ug56448b; Ⴍ.񍇦‌; [C1, V6]; xn--lnd.xn--0ug56448b; ; ; # Ⴍ. +ⴍ.񍇦‌; ⴍ.񍇦‌; [C1, P1, V6]; xn--4kj.xn--0ug56448b; ; xn--4kj.xn--p01x; [P1, V6] # ⴍ. +򉟂󠵣.𐫫᩠󴺖᭄; ; [B2, B3, B6, P1, V6]; xn--9u37blu98h.xn--jof13bt568cork1j; ; ; # .𐫫᩠᭄ +xn--9u37blu98h.xn--jof13bt568cork1j; 򉟂󠵣.𐫫᩠󴺖᭄; [B2, B3, B6, V6]; xn--9u37blu98h.xn--jof13bt568cork1j; ; ; # .𐫫᩠᭄ +≯❊ᠯ。𐹱⺨; ≯❊ᠯ.𐹱⺨; [B1, P1, V6]; xn--i7e163ct2d.xn--vwj7372e; ; ; # ≯❊ᠯ.𐹱⺨ +≯❊ᠯ。𐹱⺨; ≯❊ᠯ.𐹱⺨; [B1, P1, V6]; xn--i7e163ct2d.xn--vwj7372e; ; ; # ≯❊ᠯ.𐹱⺨ +≯❊ᠯ。𐹱⺨; ≯❊ᠯ.𐹱⺨; [B1, P1, V6]; xn--i7e163ct2d.xn--vwj7372e; ; ; # ≯❊ᠯ.𐹱⺨ +≯❊ᠯ。𐹱⺨; ≯❊ᠯ.𐹱⺨; [B1, P1, V6]; xn--i7e163ct2d.xn--vwj7372e; ; ; # ≯❊ᠯ.𐹱⺨ +xn--i7e163ct2d.xn--vwj7372e; ≯❊ᠯ.𐹱⺨; [B1, V6]; xn--i7e163ct2d.xn--vwj7372e; ; ; # ≯❊ᠯ.𐹱⺨ +􁕜𐹧𞭁𐹩。Ⴈ𐫮Ⴏ; 􁕜𐹧𞭁𐹩.Ⴈ𐫮Ⴏ; [B5, B6, P1, V6]; xn--fo0de1270ope54j.xn--gndo2033q; ; ; # 𐹧𐹩.Ⴈ𐫮Ⴏ +􁕜𐹧𞭁𐹩。ⴈ𐫮ⴏ; 􁕜𐹧𞭁𐹩.ⴈ𐫮ⴏ; [B5, B6, P1, V6]; xn--fo0de1270ope54j.xn--zkjo0151o; ; ; # 𐹧𐹩.ⴈ𐫮ⴏ +xn--fo0de1270ope54j.xn--zkjo0151o; 􁕜𐹧𞭁𐹩.ⴈ𐫮ⴏ; [B5, B6, V6]; xn--fo0de1270ope54j.xn--zkjo0151o; ; ; # 𐹧𐹩.ⴈ𐫮ⴏ +xn--fo0de1270ope54j.xn--gndo2033q; 􁕜𐹧𞭁𐹩.Ⴈ𐫮Ⴏ; [B5, B6, V6]; xn--fo0de1270ope54j.xn--gndo2033q; ; ; # 𐹧𐹩.Ⴈ𐫮Ⴏ +𞠂。ꤦ; 𞠂.ꤦ; [B1, B3, B6, V5]; xn--145h.xn--ti9a; ; ; # 𞠂.ꤦ +xn--145h.xn--ti9a; 𞠂.ꤦ; [B1, B3, B6, V5]; xn--145h.xn--ti9a; ; ; # 𞠂.ꤦ +𝟔𐹫.့ܳ9ꡇ; 6𐹫.့ܳ9ꡇ; [B1, V5]; xn--6-t26i.xn--9-91c730e8u8n; ; ; # 6𐹫.့ܳ9ꡇ +𝟔𐹫.့ܳ9ꡇ; 6𐹫.့ܳ9ꡇ; [B1, V5]; xn--6-t26i.xn--9-91c730e8u8n; ; ; # 6𐹫.့ܳ9ꡇ +6𐹫.့ܳ9ꡇ; ; [B1, V5]; xn--6-t26i.xn--9-91c730e8u8n; ; ; # 6𐹫.့ܳ9ꡇ +xn--6-t26i.xn--9-91c730e8u8n; 6𐹫.့ܳ9ꡇ; [B1, V5]; xn--6-t26i.xn--9-91c730e8u8n; ; ; # 6𐹫.့ܳ9ꡇ +ܤ؃𞲶.ۘ; ܤ؃𞲶.ۘ; [B1, B3, B6, P1, V5, V6]; xn--lfb19ct414i.xn--olb; ; ; # ܤ.ۘ +ܤ؃𞲶.ۘ; ; [B1, B3, B6, P1, V5, V6]; xn--lfb19ct414i.xn--olb; ; ; # ܤ.ۘ +xn--lfb19ct414i.xn--olb; ܤ؃𞲶.ۘ; [B1, B3, B6, V5, V6]; xn--lfb19ct414i.xn--olb; ; ; # ܤ.ۘ +✆񱔩ꡋ.ز‍𞣴; ✆񱔩ꡋ.ز‍𞣴; [B1, C2, P1, V6]; xn--1biv525bcix0d.xn--xgb253k0m73a; ; xn--1biv525bcix0d.xn--xgb6828v; [B1, P1, V6] # ✆ꡋ.ز +✆񱔩ꡋ.ز‍𞣴; ; [B1, C2, P1, V6]; xn--1biv525bcix0d.xn--xgb253k0m73a; ; xn--1biv525bcix0d.xn--xgb6828v; [B1, P1, V6] # ✆ꡋ.ز +xn--1biv525bcix0d.xn--xgb6828v; ✆񱔩ꡋ.ز𞣴; [B1, V6]; xn--1biv525bcix0d.xn--xgb6828v; ; ; # ✆ꡋ.ز +xn--1biv525bcix0d.xn--xgb253k0m73a; ✆񱔩ꡋ.ز‍𞣴; [B1, C2, V6]; xn--1biv525bcix0d.xn--xgb253k0m73a; ; ; # ✆ꡋ.ز +ࡅ񃾰𞸍-.≠򃁟𑋪; ࡅ񃾰ن-.≠򃁟𑋪; [B1, B2, B3, P1, V3, V6]; xn----qoc64my971s.xn--1ch7585g76o3c; ; ; # ࡅن-.≠𑋪 +ࡅ񃾰𞸍-.≠򃁟𑋪; ࡅ񃾰ن-.≠򃁟𑋪; [B1, B2, B3, P1, V3, V6]; xn----qoc64my971s.xn--1ch7585g76o3c; ; ; # ࡅن-.≠𑋪 +ࡅ񃾰ن-.≠򃁟𑋪; ; [B1, B2, B3, P1, V3, V6]; xn----qoc64my971s.xn--1ch7585g76o3c; ; ; # ࡅن-.≠𑋪 +ࡅ񃾰ن-.≠򃁟𑋪; ࡅ񃾰ن-.≠򃁟𑋪; [B1, B2, B3, P1, V3, V6]; xn----qoc64my971s.xn--1ch7585g76o3c; ; ; # ࡅن-.≠𑋪 +xn----qoc64my971s.xn--1ch7585g76o3c; ࡅ񃾰ن-.≠򃁟𑋪; [B1, B2, B3, V3, V6]; xn----qoc64my971s.xn--1ch7585g76o3c; ; ; # ࡅن-.≠𑋪 +𝟛.笠; 3.笠; ; 3.xn--6vz; ; ; # 3.笠 +𝟛.笠; 3.笠; ; 3.xn--6vz; ; ; # 3.笠 +3.笠; ; ; 3.xn--6vz; ; ; # 3.笠 +3.xn--6vz; 3.笠; ; 3.xn--6vz; ; ; # 3.笠 +-‍.Ⴞ𐋷; ; [C2, P1, V3, V6]; xn----ugn.xn--2nd2315j; ; -.xn--2nd2315j; [P1, V3, V6] # -.Ⴞ𐋷 +-‍.ⴞ𐋷; ; [C2, V3]; xn----ugn.xn--mlj8559d; ; -.xn--mlj8559d; [V3] # -.ⴞ𐋷 +-.xn--mlj8559d; -.ⴞ𐋷; [V3]; -.xn--mlj8559d; ; ; # -.ⴞ𐋷 +xn----ugn.xn--mlj8559d; -‍.ⴞ𐋷; [C2, V3]; xn----ugn.xn--mlj8559d; ; ; # -.ⴞ𐋷 +-.xn--2nd2315j; -.Ⴞ𐋷; [V3, V6]; -.xn--2nd2315j; ; ; # -.Ⴞ𐋷 +xn----ugn.xn--2nd2315j; -‍.Ⴞ𐋷; [C2, V3, V6]; xn----ugn.xn--2nd2315j; ; ; # -.Ⴞ𐋷 +‍ςßܱ.்; ‍ςßܱ.்; [C2, V5]; xn--zca19ln1di19a.xn--xmc; ; xn--ss-ubc826a.xn--xmc; [V5] # ςßܱ.் +‍ςßܱ.்; ; [C2, V5]; xn--zca19ln1di19a.xn--xmc; ; xn--ss-ubc826a.xn--xmc; [V5] # ςßܱ.் +‍ΣSSܱ.்; ‍σssܱ.்; [C2, V5]; xn--ss-ubc826ab34b.xn--xmc; ; xn--ss-ubc826a.xn--xmc; [V5] # σssܱ.் +‍σssܱ.்; ; [C2, V5]; xn--ss-ubc826ab34b.xn--xmc; ; xn--ss-ubc826a.xn--xmc; [V5] # σssܱ.் +‍Σssܱ.்; ‍σssܱ.்; [C2, V5]; xn--ss-ubc826ab34b.xn--xmc; ; xn--ss-ubc826a.xn--xmc; [V5] # σssܱ.் +xn--ss-ubc826a.xn--xmc; σssܱ.்; [V5]; xn--ss-ubc826a.xn--xmc; ; ; # σssܱ.் +xn--ss-ubc826ab34b.xn--xmc; ‍σssܱ.்; [C2, V5]; xn--ss-ubc826ab34b.xn--xmc; ; ; # σssܱ.் +‍Σßܱ.்; ‍σßܱ.்; [C2, V5]; xn--zca39lk1di19a.xn--xmc; ; xn--ss-ubc826a.xn--xmc; [V5] # σßܱ.் +‍σßܱ.்; ; [C2, V5]; xn--zca39lk1di19a.xn--xmc; ; xn--ss-ubc826a.xn--xmc; [V5] # σßܱ.் +xn--zca39lk1di19a.xn--xmc; ‍σßܱ.்; [C2, V5]; xn--zca39lk1di19a.xn--xmc; ; ; # σßܱ.் +xn--zca19ln1di19a.xn--xmc; ‍ςßܱ.்; [C2, V5]; xn--zca19ln1di19a.xn--xmc; ; ; # ςßܱ.் +‍ΣSSܱ.்; ‍σssܱ.்; [C2, V5]; xn--ss-ubc826ab34b.xn--xmc; ; xn--ss-ubc826a.xn--xmc; [V5] # σssܱ.் +‍σssܱ.்; ‍σssܱ.்; [C2, V5]; xn--ss-ubc826ab34b.xn--xmc; ; xn--ss-ubc826a.xn--xmc; [V5] # σssܱ.் +‍Σssܱ.்; ‍σssܱ.்; [C2, V5]; xn--ss-ubc826ab34b.xn--xmc; ; xn--ss-ubc826a.xn--xmc; [V5] # σssܱ.் +‍Σßܱ.்; ‍σßܱ.்; [C2, V5]; xn--zca39lk1di19a.xn--xmc; ; xn--ss-ubc826a.xn--xmc; [V5] # σßܱ.் +‍σßܱ.்; ‍σßܱ.்; [C2, V5]; xn--zca39lk1di19a.xn--xmc; ; xn--ss-ubc826a.xn--xmc; [V5] # σßܱ.் +≠.‍; ≠.‍; [C2, P1, V6]; xn--1ch.xn--1ug; ; xn--1ch.; [P1, V6] # ≠. +≠.‍; ≠.‍; [C2, P1, V6]; xn--1ch.xn--1ug; ; xn--1ch.; [P1, V6] # ≠. +≠.‍; ; [C2, P1, V6]; xn--1ch.xn--1ug; ; xn--1ch.; [P1, V6] # ≠. +≠.‍; ≠.‍; [C2, P1, V6]; xn--1ch.xn--1ug; ; xn--1ch.; [P1, V6] # ≠. +xn--1ch.; ≠.; [V6]; xn--1ch.; ; ; # ≠. +xn--1ch.xn--1ug; ≠.‍; [C2, V6]; xn--1ch.xn--1ug; ; ; # ≠. +ﰁ。ಁᠼ▗򒁋; ئح.ಁᠼ▗򒁋; [B1, P1, V5, V6]; xn--lgbo.xn--2rc021dcxkrx55t; ; ; # ئح.ಁᠼ▗ +ئح。ಁᠼ▗򒁋; ئح.ಁᠼ▗򒁋; [B1, P1, V5, V6]; xn--lgbo.xn--2rc021dcxkrx55t; ; ; # ئح.ಁᠼ▗ +ئح。ಁᠼ▗򒁋; ئح.ಁᠼ▗򒁋; [B1, P1, V5, V6]; xn--lgbo.xn--2rc021dcxkrx55t; ; ; # ئح.ಁᠼ▗ +xn--lgbo.xn--2rc021dcxkrx55t; ئح.ಁᠼ▗򒁋; [B1, V5, V6]; xn--lgbo.xn--2rc021dcxkrx55t; ; ; # ئح.ಁᠼ▗ +󧋵্ς.ς𐨿; 󧋵্ς.ς𐨿; [P1, V6]; xn--3xa702av8297a.xn--3xa8055k; ; xn--4xa502av8297a.xn--4xa6055k; # ্ς.ς𐨿 +󧋵্ς.ς𐨿; ; [P1, V6]; xn--3xa702av8297a.xn--3xa8055k; ; xn--4xa502av8297a.xn--4xa6055k; # ্ς.ς𐨿 +󧋵্Σ.Σ𐨿; 󧋵্σ.σ𐨿; [P1, V6]; xn--4xa502av8297a.xn--4xa6055k; ; ; # ্σ.σ𐨿 +󧋵্σ.ς𐨿; ; [P1, V6]; xn--4xa502av8297a.xn--3xa8055k; ; xn--4xa502av8297a.xn--4xa6055k; # ্σ.ς𐨿 +󧋵্σ.σ𐨿; ; [P1, V6]; xn--4xa502av8297a.xn--4xa6055k; ; ; # ্σ.σ𐨿 +󧋵্Σ.σ𐨿; 󧋵্σ.σ𐨿; [P1, V6]; xn--4xa502av8297a.xn--4xa6055k; ; ; # ্σ.σ𐨿 +xn--4xa502av8297a.xn--4xa6055k; 󧋵্σ.σ𐨿; [V6]; xn--4xa502av8297a.xn--4xa6055k; ; ; # ্σ.σ𐨿 +󧋵্Σ.ς𐨿; 󧋵্σ.ς𐨿; [P1, V6]; xn--4xa502av8297a.xn--3xa8055k; ; xn--4xa502av8297a.xn--4xa6055k; # ্σ.ς𐨿 +xn--4xa502av8297a.xn--3xa8055k; 󧋵্σ.ς𐨿; [V6]; xn--4xa502av8297a.xn--3xa8055k; ; ; # ্σ.ς𐨿 +xn--3xa702av8297a.xn--3xa8055k; 󧋵্ς.ς𐨿; [V6]; xn--3xa702av8297a.xn--3xa8055k; ; ; # ্ς.ς𐨿 +󧋵্Σ.Σ𐨿; 󧋵্σ.σ𐨿; [P1, V6]; xn--4xa502av8297a.xn--4xa6055k; ; ; # ্σ.σ𐨿 +󧋵্σ.ς𐨿; 󧋵্σ.ς𐨿; [P1, V6]; xn--4xa502av8297a.xn--3xa8055k; ; xn--4xa502av8297a.xn--4xa6055k; # ্σ.ς𐨿 +󧋵্σ.σ𐨿; 󧋵্σ.σ𐨿; [P1, V6]; xn--4xa502av8297a.xn--4xa6055k; ; ; # ্σ.σ𐨿 +󧋵্Σ.σ𐨿; 󧋵্σ.σ𐨿; [P1, V6]; xn--4xa502av8297a.xn--4xa6055k; ; ; # ্σ.σ𐨿 +󧋵্Σ.ς𐨿; 󧋵্σ.ς𐨿; [P1, V6]; xn--4xa502av8297a.xn--3xa8055k; ; xn--4xa502av8297a.xn--4xa6055k; # ্σ.ς𐨿 +𐫓ߘ牅ࣸ。𞦤ᨗ򱍰Ⴙ; 𐫓ߘ牅ࣸ.𞦤ᨗ򱍰Ⴙ; [B2, B3, P1, V6]; xn--zsb09cu46vjs6f.xn--xnd909bv540bm5k9d; ; ; # 𐫓ߘ牅ࣸ.ᨗႹ +𐫓ߘ牅ࣸ。𞦤ᨗ򱍰Ⴙ; 𐫓ߘ牅ࣸ.𞦤ᨗ򱍰Ⴙ; [B2, B3, P1, V6]; xn--zsb09cu46vjs6f.xn--xnd909bv540bm5k9d; ; ; # 𐫓ߘ牅ࣸ.ᨗႹ +𐫓ߘ牅ࣸ。𞦤ᨗ򱍰ⴙ; 𐫓ߘ牅ࣸ.𞦤ᨗ򱍰ⴙ; [B2, B3, P1, V6]; xn--zsb09cu46vjs6f.xn--gmf469fr883am5r1e; ; ; # 𐫓ߘ牅ࣸ.ᨗⴙ +xn--zsb09cu46vjs6f.xn--gmf469fr883am5r1e; 𐫓ߘ牅ࣸ.𞦤ᨗ򱍰ⴙ; [B2, B3, V6]; xn--zsb09cu46vjs6f.xn--gmf469fr883am5r1e; ; ; # 𐫓ߘ牅ࣸ.ᨗⴙ +xn--zsb09cu46vjs6f.xn--xnd909bv540bm5k9d; 𐫓ߘ牅ࣸ.𞦤ᨗ򱍰Ⴙ; [B2, B3, V6]; xn--zsb09cu46vjs6f.xn--xnd909bv540bm5k9d; ; ; # 𐫓ߘ牅ࣸ.ᨗႹ +𐫓ߘ牅ࣸ。𞦤ᨗ򱍰ⴙ; 𐫓ߘ牅ࣸ.𞦤ᨗ򱍰ⴙ; [B2, B3, P1, V6]; xn--zsb09cu46vjs6f.xn--gmf469fr883am5r1e; ; ; # 𐫓ߘ牅ࣸ.ᨗⴙ +񣤒。륧; 񣤒.륧; [P1, V6]; xn--s264a.xn--pw2b; ; ; # .륧 +񣤒。륧; 񣤒.륧; [P1, V6]; xn--s264a.xn--pw2b; ; ; # .륧 +񣤒。륧; 񣤒.륧; [P1, V6]; xn--s264a.xn--pw2b; ; ; # .륧 +񣤒。륧; 񣤒.륧; [P1, V6]; xn--s264a.xn--pw2b; ; ; # .륧 +xn--s264a.xn--pw2b; 񣤒.륧; [V6]; xn--s264a.xn--pw2b; ; ; # .륧 +𐹷‍。󉵢; 𐹷‍.󉵢; [B1, C2, P1, V6]; xn--1ugx205g.xn--8088d; ; xn--vo0d.xn--8088d; [B1, P1, V6] # 𐹷. +xn--vo0d.xn--8088d; 𐹷.󉵢; [B1, V6]; xn--vo0d.xn--8088d; ; ; # 𐹷. +xn--1ugx205g.xn--8088d; 𐹷‍.󉵢; [B1, C2, V6]; xn--1ugx205g.xn--8088d; ; ; # 𐹷. +Ⴘۂ𑲭。-; Ⴘۂ𑲭.-; [B1, B5, B6, P1, V3, V6]; xn--1kb312c139t.-; ; ; # Ⴘۂ𑲭.- +Ⴘۂ𑲭。-; Ⴘۂ𑲭.-; [B1, B5, B6, P1, V3, V6]; xn--1kb312c139t.-; ; ; # Ⴘۂ𑲭.- +Ⴘۂ𑲭。-; Ⴘۂ𑲭.-; [B1, B5, B6, P1, V3, V6]; xn--1kb312c139t.-; ; ; # Ⴘۂ𑲭.- +Ⴘۂ𑲭。-; Ⴘۂ𑲭.-; [B1, B5, B6, P1, V3, V6]; xn--1kb312c139t.-; ; ; # Ⴘۂ𑲭.- +ⴘۂ𑲭。-; ⴘۂ𑲭.-; [B1, B5, B6, V3]; xn--1kb147qfk3n.-; ; ; # ⴘۂ𑲭.- +ⴘۂ𑲭。-; ⴘۂ𑲭.-; [B1, B5, B6, V3]; xn--1kb147qfk3n.-; ; ; # ⴘۂ𑲭.- +xn--1kb147qfk3n.-; ⴘۂ𑲭.-; [B1, B5, B6, V3]; xn--1kb147qfk3n.-; ; ; # ⴘۂ𑲭.- +xn--1kb312c139t.-; Ⴘۂ𑲭.-; [B1, B5, B6, V3, V6]; xn--1kb312c139t.-; ; ; # Ⴘۂ𑲭.- +ⴘۂ𑲭。-; ⴘۂ𑲭.-; [B1, B5, B6, V3]; xn--1kb147qfk3n.-; ; ; # ⴘۂ𑲭.- +ⴘۂ𑲭。-; ⴘۂ𑲭.-; [B1, B5, B6, V3]; xn--1kb147qfk3n.-; ; ; # ⴘۂ𑲭.- +꠆ٻ₆ᡐ。🛇ﳝ; ꠆ٻ6ᡐ.🛇يم; [B1, V5]; xn--6-rrc018krt9k.xn--hhbj61429a; ; ; # ꠆ٻ6ᡐ.🛇يم +꠆ٻ6ᡐ。🛇يم; ꠆ٻ6ᡐ.🛇يم; [B1, V5]; xn--6-rrc018krt9k.xn--hhbj61429a; ; ; # ꠆ٻ6ᡐ.🛇يم +xn--6-rrc018krt9k.xn--hhbj61429a; ꠆ٻ6ᡐ.🛇يم; [B1, V5]; xn--6-rrc018krt9k.xn--hhbj61429a; ; ; # ꠆ٻ6ᡐ.🛇يم +򸍂.㇄ᡟ𐫂آ; ; [B1, P1, V6]; xn--p292d.xn--hgb154ghrsvm2r; ; ; # .㇄ᡟ𐫂آ +򸍂.㇄ᡟ𐫂آ; 򸍂.㇄ᡟ𐫂آ; [B1, P1, V6]; xn--p292d.xn--hgb154ghrsvm2r; ; ; # .㇄ᡟ𐫂آ +xn--p292d.xn--hgb154ghrsvm2r; 򸍂.㇄ᡟ𐫂آ; [B1, V6]; xn--p292d.xn--hgb154ghrsvm2r; ; ; # .㇄ᡟ𐫂آ +ߟ򵚌。-ߩ; ߟ򵚌.-ߩ; [B1, B2, B3, P1, V3, V6]; xn--6sb88139l.xn----pdd; ; ; # ߟ.-ߩ +xn--6sb88139l.xn----pdd; ߟ򵚌.-ߩ; [B1, B2, B3, V3, V6]; xn--6sb88139l.xn----pdd; ; ; # ߟ.-ߩ +ςك⾑.‌ᢟ‌⒈; ςك襾.‌ᢟ‌⒈; [B1, B5, C1, P1, V6]; xn--3xa69jux8r.xn--pbf519aba607b; ; xn--4xa49jux8r.xn--pbf212d; [B5, P1, V6] # ςك襾.ᢟ⒈ +ςك襾.‌ᢟ‌1.; ; [B1, B5, C1]; xn--3xa69jux8r.xn--1-4ck691bba.; ; xn--4xa49jux8r.xn--1-4ck.; [B5] # ςك襾.ᢟ1. +Σك襾.‌ᢟ‌1.; σك襾.‌ᢟ‌1.; [B1, B5, C1]; xn--4xa49jux8r.xn--1-4ck691bba.; ; xn--4xa49jux8r.xn--1-4ck.; [B5] # σك襾.ᢟ1. +σك襾.‌ᢟ‌1.; ; [B1, B5, C1]; xn--4xa49jux8r.xn--1-4ck691bba.; ; xn--4xa49jux8r.xn--1-4ck.; [B5] # σك襾.ᢟ1. +xn--4xa49jux8r.xn--1-4ck.; σك襾.ᢟ1.; [B5]; xn--4xa49jux8r.xn--1-4ck.; ; ; # σك襾.ᢟ1. +xn--4xa49jux8r.xn--1-4ck691bba.; σك襾.‌ᢟ‌1.; [B1, B5, C1]; xn--4xa49jux8r.xn--1-4ck691bba.; ; ; # σك襾.ᢟ1. +xn--3xa69jux8r.xn--1-4ck691bba.; ςك襾.‌ᢟ‌1.; [B1, B5, C1]; xn--3xa69jux8r.xn--1-4ck691bba.; ; ; # ςك襾.ᢟ1. +Σك⾑.‌ᢟ‌⒈; σك襾.‌ᢟ‌⒈; [B1, B5, C1, P1, V6]; xn--4xa49jux8r.xn--pbf519aba607b; ; xn--4xa49jux8r.xn--pbf212d; [B5, P1, V6] # σك襾.ᢟ⒈ +σك⾑.‌ᢟ‌⒈; σك襾.‌ᢟ‌⒈; [B1, B5, C1, P1, V6]; xn--4xa49jux8r.xn--pbf519aba607b; ; xn--4xa49jux8r.xn--pbf212d; [B5, P1, V6] # σك襾.ᢟ⒈ +xn--4xa49jux8r.xn--pbf212d; σك襾.ᢟ⒈; [B5, V6]; xn--4xa49jux8r.xn--pbf212d; ; ; # σك襾.ᢟ⒈ +xn--4xa49jux8r.xn--pbf519aba607b; σك襾.‌ᢟ‌⒈; [B1, B5, C1, V6]; xn--4xa49jux8r.xn--pbf519aba607b; ; ; # σك襾.ᢟ⒈ +xn--3xa69jux8r.xn--pbf519aba607b; ςك襾.‌ᢟ‌⒈; [B1, B5, C1, V6]; xn--3xa69jux8r.xn--pbf519aba607b; ; ; # ςك襾.ᢟ⒈ +ᡆ𑓝.𞵆; ᡆ𑓝.𞵆; [P1, V6]; xn--57e0440k.xn--k86h; ; ; # ᡆ. +ᡆ𑓝.𞵆; ; [P1, V6]; xn--57e0440k.xn--k86h; ; ; # ᡆ. +xn--57e0440k.xn--k86h; ᡆ𑓝.𞵆; [V6]; xn--57e0440k.xn--k86h; ; ; # ᡆ. +੍𦍓ᷮ。‌ࢽ񝹲; ੍𦍓ᷮ.‌ࢽ񝹲; [B1, C1, P1, V5, V6]; xn--ybc461hph93b.xn--jzb740j1y45h; ; xn--ybc461hph93b.xn--jzb29857e; [B1, B2, B3, P1, V5, V6] # ੍𦍓ᷮ.ࢽ +੍𦍓ᷮ。‌ࢽ񝹲; ੍𦍓ᷮ.‌ࢽ񝹲; [B1, C1, P1, V5, V6]; xn--ybc461hph93b.xn--jzb740j1y45h; ; xn--ybc461hph93b.xn--jzb29857e; [B1, B2, B3, P1, V5, V6] # ੍𦍓ᷮ.ࢽ +xn--ybc461hph93b.xn--jzb29857e; ੍𦍓ᷮ.ࢽ񝹲; [B1, B2, B3, V5, V6]; xn--ybc461hph93b.xn--jzb29857e; ; ; # ੍𦍓ᷮ.ࢽ +xn--ybc461hph93b.xn--jzb740j1y45h; ੍𦍓ᷮ.‌ࢽ񝹲; [B1, C1, V5, V6]; xn--ybc461hph93b.xn--jzb740j1y45h; ; ; # ੍𦍓ᷮ.ࢽ +خ݈񅪪-.‌먿; خ݈񅪪-.‌먿; [B1, B2, B3, C1, P1, V3, V6]; xn----dnc06f42153a.xn--0ug1581d; ; xn----dnc06f42153a.xn--v22b; [B2, B3, P1, V3, V6] # خ݈-.먿 +خ݈񅪪-.‌먿; خ݈񅪪-.‌먿; [B1, B2, B3, C1, P1, V3, V6]; xn----dnc06f42153a.xn--0ug1581d; ; xn----dnc06f42153a.xn--v22b; [B2, B3, P1, V3, V6] # خ݈-.먿 +خ݈񅪪-.‌먿; ; [B1, B2, B3, C1, P1, V3, V6]; xn----dnc06f42153a.xn--0ug1581d; ; xn----dnc06f42153a.xn--v22b; [B2, B3, P1, V3, V6] # خ݈-.먿 +خ݈񅪪-.‌먿; خ݈񅪪-.‌먿; [B1, B2, B3, C1, P1, V3, V6]; xn----dnc06f42153a.xn--0ug1581d; ; xn----dnc06f42153a.xn--v22b; [B2, B3, P1, V3, V6] # خ݈-.먿 +xn----dnc06f42153a.xn--v22b; خ݈񅪪-.먿; [B2, B3, V3, V6]; xn----dnc06f42153a.xn--v22b; ; ; # خ݈-.먿 +xn----dnc06f42153a.xn--0ug1581d; خ݈񅪪-.‌먿; [B1, B2, B3, C1, V3, V6]; xn----dnc06f42153a.xn--0ug1581d; ; ; # خ݈-.먿 +􋿦。ᠽ; 􋿦.ᠽ; [P1, V6]; xn--j890g.xn--w7e; ; ; # .ᠽ +􋿦。ᠽ; 􋿦.ᠽ; [P1, V6]; xn--j890g.xn--w7e; ; ; # .ᠽ +xn--j890g.xn--w7e; 􋿦.ᠽ; [V6]; xn--j890g.xn--w7e; ; ; # .ᠽ +嬃𝍌.‍ୄ; 嬃𝍌.‍ୄ; [C2]; xn--b6s0078f.xn--0ic557h; ; xn--b6s0078f.xn--0ic; [V5] # 嬃𝍌.ୄ +嬃𝍌.‍ୄ; ; [C2]; xn--b6s0078f.xn--0ic557h; ; xn--b6s0078f.xn--0ic; [V5] # 嬃𝍌.ୄ +xn--b6s0078f.xn--0ic; 嬃𝍌.ୄ; [V5]; xn--b6s0078f.xn--0ic; ; ; # 嬃𝍌.ୄ +xn--b6s0078f.xn--0ic557h; 嬃𝍌.‍ୄ; [C2]; xn--b6s0078f.xn--0ic557h; ; ; # 嬃𝍌.ୄ +؂𝌪≯.𚋲򵁨; ؂𝌪≯.𚋲򵁨; [B1, P1, V6]; xn--kfb866llx01a.xn--wp1gm3570b; ; ; # 𝌪≯. +؂𝌪≯.𚋲򵁨; ؂𝌪≯.𚋲򵁨; [B1, P1, V6]; xn--kfb866llx01a.xn--wp1gm3570b; ; ; # 𝌪≯. +؂𝌪≯.𚋲򵁨; ; [B1, P1, V6]; xn--kfb866llx01a.xn--wp1gm3570b; ; ; # 𝌪≯. +؂𝌪≯.𚋲򵁨; ؂𝌪≯.𚋲򵁨; [B1, P1, V6]; xn--kfb866llx01a.xn--wp1gm3570b; ; ; # 𝌪≯. +xn--kfb866llx01a.xn--wp1gm3570b; ؂𝌪≯.𚋲򵁨; [B1, V6]; xn--kfb866llx01a.xn--wp1gm3570b; ; ; # 𝌪≯. +򫾥ࢷ៌꧀.𞼠; ; [B5, P1, V6]; xn--dzb638ewm4i1iy1h.xn--3m7h; ; ; # ࢷ៌꧀. +xn--dzb638ewm4i1iy1h.xn--3m7h; 򫾥ࢷ៌꧀.𞼠; [B5, V6]; xn--dzb638ewm4i1iy1h.xn--3m7h; ; ; # ࢷ៌꧀. +‌.񟛤; ; [C1, P1, V6]; xn--0ug.xn--q823a; ; .xn--q823a; [P1, V6, A4_2] # . +.xn--q823a; .񟛤; [V6, X4_2]; .xn--q823a; [V6, A4_2]; ; # . +xn--0ug.xn--q823a; ‌.񟛤; [C1, V6]; xn--0ug.xn--q823a; ; ; # . +򺛕Ⴃ䠅.𐸑; 򺛕Ⴃ䠅.𐸑; [P1, V6]; xn--bnd074zr557n.xn--yl0d; ; ; # Ⴃ䠅. +򺛕Ⴃ䠅.𐸑; ; [P1, V6]; xn--bnd074zr557n.xn--yl0d; ; ; # Ⴃ䠅. +򺛕ⴃ䠅.𐸑; ; [P1, V6]; xn--ukju77frl47r.xn--yl0d; ; ; # ⴃ䠅. +xn--ukju77frl47r.xn--yl0d; 򺛕ⴃ䠅.𐸑; [V6]; xn--ukju77frl47r.xn--yl0d; ; ; # ⴃ䠅. +xn--bnd074zr557n.xn--yl0d; 򺛕Ⴃ䠅.𐸑; [V6]; xn--bnd074zr557n.xn--yl0d; ; ; # Ⴃ䠅. +򺛕ⴃ䠅.𐸑; 򺛕ⴃ䠅.𐸑; [P1, V6]; xn--ukju77frl47r.xn--yl0d; ; ; # ⴃ䠅. +ᯱ𐹳𐹵𞤚。𝟨Ⴅ; ᯱ𐹳𐹵𞤼.6Ⴅ; [B1, P1, V5, V6]; xn--zzfy954hga2415t.xn--6-h0g; ; ; # ᯱ𐹳𐹵𞤼.6Ⴅ +ᯱ𐹳𐹵𞤚。6Ⴅ; ᯱ𐹳𐹵𞤼.6Ⴅ; [B1, P1, V5, V6]; xn--zzfy954hga2415t.xn--6-h0g; ; ; # ᯱ𐹳𐹵𞤼.6Ⴅ +ᯱ𐹳𐹵𞤼。6ⴅ; ᯱ𐹳𐹵𞤼.6ⴅ; [B1, V5]; xn--zzfy954hga2415t.xn--6-kvs; ; ; # ᯱ𐹳𐹵𞤼.6ⴅ +ᯱ𐹳𐹵𞤚。6ⴅ; ᯱ𐹳𐹵𞤼.6ⴅ; [B1, V5]; xn--zzfy954hga2415t.xn--6-kvs; ; ; # ᯱ𐹳𐹵𞤼.6ⴅ +xn--zzfy954hga2415t.xn--6-kvs; ᯱ𐹳𐹵𞤼.6ⴅ; [B1, V5]; xn--zzfy954hga2415t.xn--6-kvs; ; ; # ᯱ𐹳𐹵𞤼.6ⴅ +xn--zzfy954hga2415t.xn--6-h0g; ᯱ𐹳𐹵𞤼.6Ⴅ; [B1, V5, V6]; xn--zzfy954hga2415t.xn--6-h0g; ; ; # ᯱ𐹳𐹵𞤼.6Ⴅ +ᯱ𐹳𐹵𞤼。𝟨ⴅ; ᯱ𐹳𐹵𞤼.6ⴅ; [B1, V5]; xn--zzfy954hga2415t.xn--6-kvs; ; ; # ᯱ𐹳𐹵𞤼.6ⴅ +ᯱ𐹳𐹵𞤚。𝟨ⴅ; ᯱ𐹳𐹵𞤼.6ⴅ; [B1, V5]; xn--zzfy954hga2415t.xn--6-kvs; ; ; # ᯱ𐹳𐹵𞤼.6ⴅ +-。︒; -.︒; [P1, V3, V6]; -.xn--y86c; ; ; # -.︒ +-。。; -..; [V3, X4_2]; ; [V3, A4_2]; ; # -.. +-..; ; [V3, X4_2]; ; [V3, A4_2]; ; # -.. +-.xn--y86c; -.︒; [V3, V6]; -.xn--y86c; ; ; # -.︒ +ߛჀ。-⁵--; ߛჀ.-5--; [B1, B2, B3, P1, V2, V3, V6]; xn--2sb866b.-5--; ; ; # ߛჀ.-5-- +ߛჀ。-5--; ߛჀ.-5--; [B1, B2, B3, P1, V2, V3, V6]; xn--2sb866b.-5--; ; ; # ߛჀ.-5-- +ߛⴠ。-5--; ߛⴠ.-5--; [B1, B2, B3, V2, V3]; xn--2sb691q.-5--; ; ; # ߛⴠ.-5-- +xn--2sb691q.-5--; ߛⴠ.-5--; [B1, B2, B3, V2, V3]; xn--2sb691q.-5--; ; ; # ߛⴠ.-5-- +xn--2sb866b.-5--; ߛჀ.-5--; [B1, B2, B3, V2, V3, V6]; xn--2sb866b.-5--; ; ; # ߛჀ.-5-- +ߛⴠ。-⁵--; ߛⴠ.-5--; [B1, B2, B3, V2, V3]; xn--2sb691q.-5--; ; ; # ߛⴠ.-5-- +≯?󠑕。𐹷𐹻≯𐷒; ≯?󠑕.𐹷𐹻≯𐷒; [B1, P1, V6]; ≯?󠑕.xn--hdh8283gdoaqa; [B1, P1, V6, A3]; ; # ≯.𐹷𐹻≯ +≯?󠑕。𐹷𐹻≯𐷒; ≯?󠑕.𐹷𐹻≯𐷒; [B1, P1, V6]; ≯?󠑕.xn--hdh8283gdoaqa; [B1, P1, V6, A3]; ; # ≯.𐹷𐹻≯ +≯?󠑕。𐹷𐹻≯𐷒; ≯?󠑕.𐹷𐹻≯𐷒; [B1, P1, V6]; ≯?󠑕.xn--hdh8283gdoaqa; [B1, P1, V6, A3]; ; # ≯.𐹷𐹻≯ +≯?󠑕。𐹷𐹻≯𐷒; ≯?󠑕.𐹷𐹻≯𐷒; [B1, P1, V6]; ≯?󠑕.xn--hdh8283gdoaqa; [B1, P1, V6, A3]; ; # ≯.𐹷𐹻≯ +≯?󠑕.xn--hdh8283gdoaqa; ≯?󠑕.𐹷𐹻≯𐷒; [B1, P1, V6]; ≯?󠑕.xn--hdh8283gdoaqa; [B1, P1, V6, A3]; ; # ≯.𐹷𐹻≯ +≯?󠑕.xn--hdh8283gdoaqa; ≯?󠑕.𐹷𐹻≯𐷒; [B1, P1, V6]; ≯?󠑕.xn--hdh8283gdoaqa; [B1, P1, V6, A3]; ; # ≯.𐹷𐹻≯ +≯?󠑕.XN--HDH8283GDOAQA; ≯?󠑕.𐹷𐹻≯𐷒; [B1, P1, V6]; ≯?󠑕.xn--hdh8283gdoaqa; [B1, P1, V6, A3]; ; # ≯.𐹷𐹻≯ +≯?󠑕.XN--HDH8283GDOAQA; ≯?󠑕.𐹷𐹻≯𐷒; [B1, P1, V6]; ≯?󠑕.xn--hdh8283gdoaqa; [B1, P1, V6, A3]; ; # ≯.𐹷𐹻≯ +≯?󠑕.Xn--Hdh8283gdoaqa; ≯?󠑕.𐹷𐹻≯𐷒; [B1, P1, V6]; ≯?󠑕.xn--hdh8283gdoaqa; [B1, P1, V6, A3]; ; # ≯.𐹷𐹻≯ +≯?󠑕.Xn--Hdh8283gdoaqa; ≯?󠑕.𐹷𐹻≯𐷒; [B1, P1, V6]; ≯?󠑕.xn--hdh8283gdoaqa; [B1, P1, V6, A3]; ; # ≯.𐹷𐹻≯ +㍔ࣦݼ‍。͆򁳊𝅶؄; ルーブルࣦݼ‍.͆򁳊𝅶؄; [B1, B5, B6, C2, P1, V5, V6]; xn--dqb73ec22c9kp8cb1j.xn--kua81ls548d3608b; ; xn--dqb73el09fncab4h.xn--kua81ls548d3608b; [B1, B5, B6, P1, V5, V6] # ルーブルࣦݼ.͆ +ルーブルࣦݼ‍。͆򁳊𝅶؄; ルーブルࣦݼ‍.͆򁳊𝅶؄; [B1, B5, B6, C2, P1, V5, V6]; xn--dqb73ec22c9kp8cb1j.xn--kua81ls548d3608b; ; xn--dqb73el09fncab4h.xn--kua81ls548d3608b; [B1, B5, B6, P1, V5, V6] # ルーブルࣦݼ.͆ +ルーブルࣦݼ‍。͆򁳊𝅶؄; ルーブルࣦݼ‍.͆򁳊𝅶؄; [B1, B5, B6, C2, P1, V5, V6]; xn--dqb73ec22c9kp8cb1j.xn--kua81ls548d3608b; ; xn--dqb73el09fncab4h.xn--kua81ls548d3608b; [B1, B5, B6, P1, V5, V6] # ルーブルࣦݼ.͆ +xn--dqb73el09fncab4h.xn--kua81ls548d3608b; ルーブルࣦݼ.͆򁳊𝅶؄; [B1, B5, B6, V5, V6]; xn--dqb73el09fncab4h.xn--kua81ls548d3608b; ; ; # ルーブルࣦݼ.͆ +xn--dqb73ec22c9kp8cb1j.xn--kua81ls548d3608b; ルーブルࣦݼ‍.͆򁳊𝅶؄; [B1, B5, B6, C2, V5, V6]; xn--dqb73ec22c9kp8cb1j.xn--kua81ls548d3608b; ; ; # ルーブルࣦݼ.͆ +‍.F; ‍.f; [C2]; xn--1ug.f; ; .f; [A4_2] # .f +‍.f; ; [C2]; xn--1ug.f; ; .f; [A4_2] # .f +.f; ; [X4_2]; ; [A4_2]; ; # .f +xn--1ug.f; ‍.f; [C2]; xn--1ug.f; ; ; # .f +f; ; ; ; ; ; # f +‍㨲。ß; ‍㨲.ß; [C2]; xn--1ug914h.xn--zca; ; xn--9bm.ss; [] # 㨲.ß +‍㨲。ß; ‍㨲.ß; [C2]; xn--1ug914h.xn--zca; ; xn--9bm.ss; [] # 㨲.ß +‍㨲。SS; ‍㨲.ss; [C2]; xn--1ug914h.ss; ; xn--9bm.ss; [] # 㨲.ss +‍㨲。ss; ‍㨲.ss; [C2]; xn--1ug914h.ss; ; xn--9bm.ss; [] # 㨲.ss +‍㨲。Ss; ‍㨲.ss; [C2]; xn--1ug914h.ss; ; xn--9bm.ss; [] # 㨲.ss +xn--9bm.ss; 㨲.ss; ; xn--9bm.ss; ; ; # 㨲.ss +㨲.ss; ; ; xn--9bm.ss; ; ; # 㨲.ss +㨲.SS; 㨲.ss; ; xn--9bm.ss; ; ; # 㨲.ss +㨲.Ss; 㨲.ss; ; xn--9bm.ss; ; ; # 㨲.ss +xn--1ug914h.ss; ‍㨲.ss; [C2]; xn--1ug914h.ss; ; ; # 㨲.ss +xn--1ug914h.xn--zca; ‍㨲.ß; [C2]; xn--1ug914h.xn--zca; ; ; # 㨲.ß +‍㨲。SS; ‍㨲.ss; [C2]; xn--1ug914h.ss; ; xn--9bm.ss; [] # 㨲.ss +‍㨲。ss; ‍㨲.ss; [C2]; xn--1ug914h.ss; ; xn--9bm.ss; [] # 㨲.ss +‍㨲。Ss; ‍㨲.ss; [C2]; xn--1ug914h.ss; ; xn--9bm.ss; [] # 㨲.ss +؅پ。ࢨ; ؅پ.ࢨ; [B1, P1, V6]; xn--nfb6v.xn--xyb; ; ; # پ.ࢨ +؅پ。ࢨ; ؅پ.ࢨ; [B1, P1, V6]; xn--nfb6v.xn--xyb; ; ; # پ.ࢨ +xn--nfb6v.xn--xyb; ؅پ.ࢨ; [B1, V6]; xn--nfb6v.xn--xyb; ; ; # پ.ࢨ +⾑ݓ𞤁。𐹵ڂ; 襾ݓ𞤣.𐹵ڂ; [B1, B5, B6]; xn--6ob9577deqwl.xn--7ib5526k; ; ; # 襾ݓ𞤣.𐹵ڂ +襾ݓ𞤁。𐹵ڂ; 襾ݓ𞤣.𐹵ڂ; [B1, B5, B6]; xn--6ob9577deqwl.xn--7ib5526k; ; ; # 襾ݓ𞤣.𐹵ڂ +襾ݓ𞤣。𐹵ڂ; 襾ݓ𞤣.𐹵ڂ; [B1, B5, B6]; xn--6ob9577deqwl.xn--7ib5526k; ; ; # 襾ݓ𞤣.𐹵ڂ +xn--6ob9577deqwl.xn--7ib5526k; 襾ݓ𞤣.𐹵ڂ; [B1, B5, B6]; xn--6ob9577deqwl.xn--7ib5526k; ; ; # 襾ݓ𞤣.𐹵ڂ +⾑ݓ𞤣。𐹵ڂ; 襾ݓ𞤣.𐹵ڂ; [B1, B5, B6]; xn--6ob9577deqwl.xn--7ib5526k; ; ; # 襾ݓ𞤣.𐹵ڂ +񦴻ς-⃫。ݔ-ꡛ; 񦴻ς-⃫.ݔ-ꡛ; [B2, B3, B6, P1, V6]; xn----xmb015tuo34l.xn----53c4874j; ; xn----zmb705tuo34l.xn----53c4874j; # ς-⃫.ݔ-ꡛ +񦴻ς-⃫。ݔ-ꡛ; 񦴻ς-⃫.ݔ-ꡛ; [B2, B3, B6, P1, V6]; xn----xmb015tuo34l.xn----53c4874j; ; xn----zmb705tuo34l.xn----53c4874j; # ς-⃫.ݔ-ꡛ +񦴻Σ-⃫。ݔ-ꡛ; 񦴻σ-⃫.ݔ-ꡛ; [B2, B3, B6, P1, V6]; xn----zmb705tuo34l.xn----53c4874j; ; ; # σ-⃫.ݔ-ꡛ +񦴻σ-⃫。ݔ-ꡛ; 񦴻σ-⃫.ݔ-ꡛ; [B2, B3, B6, P1, V6]; xn----zmb705tuo34l.xn----53c4874j; ; ; # σ-⃫.ݔ-ꡛ +xn----zmb705tuo34l.xn----53c4874j; 񦴻σ-⃫.ݔ-ꡛ; [B2, B3, B6, V6]; xn----zmb705tuo34l.xn----53c4874j; ; ; # σ-⃫.ݔ-ꡛ +xn----xmb015tuo34l.xn----53c4874j; 񦴻ς-⃫.ݔ-ꡛ; [B2, B3, B6, V6]; xn----xmb015tuo34l.xn----53c4874j; ; ; # ς-⃫.ݔ-ꡛ +񦴻Σ-⃫。ݔ-ꡛ; 񦴻σ-⃫.ݔ-ꡛ; [B2, B3, B6, P1, V6]; xn----zmb705tuo34l.xn----53c4874j; ; ; # σ-⃫.ݔ-ꡛ +񦴻σ-⃫。ݔ-ꡛ; 񦴻σ-⃫.ݔ-ꡛ; [B2, B3, B6, P1, V6]; xn----zmb705tuo34l.xn----53c4874j; ; ; # σ-⃫.ݔ-ꡛ +‍.􀸨; ‍.􀸨; [C2, P1, V6]; xn--1ug.xn--h327f; ; .xn--h327f; [P1, V6, A4_2] # . +‍.􀸨; ; [C2, P1, V6]; xn--1ug.xn--h327f; ; .xn--h327f; [P1, V6, A4_2] # . +.xn--h327f; .􀸨; [V6, X4_2]; .xn--h327f; [V6, A4_2]; ; # . +xn--1ug.xn--h327f; ‍.􀸨; [C2, V6]; xn--1ug.xn--h327f; ; ; # . +񣭻񌥁。≠𝟲; 񣭻񌥁.≠6; [P1, V6]; xn--h79w4z99a.xn--6-tfo; ; ; # .≠6 +񣭻񌥁。≠𝟲; 񣭻񌥁.≠6; [P1, V6]; xn--h79w4z99a.xn--6-tfo; ; ; # .≠6 +񣭻񌥁。≠6; 񣭻񌥁.≠6; [P1, V6]; xn--h79w4z99a.xn--6-tfo; ; ; # .≠6 +񣭻񌥁。≠6; 񣭻񌥁.≠6; [P1, V6]; xn--h79w4z99a.xn--6-tfo; ; ; # .≠6 +xn--h79w4z99a.xn--6-tfo; 񣭻񌥁.≠6; [V6]; xn--h79w4z99a.xn--6-tfo; ; ; # .≠6 +󠅊ᡭ‍.𐥡; ᡭ‍.𐥡; [B6, C2, P1, V6]; xn--98e810b.xn--om9c; ; xn--98e.xn--om9c; [P1, V6] # ᡭ. +xn--98e.xn--om9c; ᡭ.𐥡; [V6]; xn--98e.xn--om9c; ; ; # ᡭ. +xn--98e810b.xn--om9c; ᡭ‍.𐥡; [B6, C2, V6]; xn--98e810b.xn--om9c; ; ; # ᡭ. +ీࡕ𐥛𑄴.󭰵; ీࡕ𐥛𑄴.󭰵; [B1, P1, V5, V6]; xn--kwb91r5112avtg.xn--o580f; ; ; # ీࡕ𑄴. +ీࡕ𐥛𑄴.󭰵; ; [B1, P1, V5, V6]; xn--kwb91r5112avtg.xn--o580f; ; ; # ీࡕ𑄴. +xn--kwb91r5112avtg.xn--o580f; ీࡕ𐥛𑄴.󭰵; [B1, V5, V6]; xn--kwb91r5112avtg.xn--o580f; ; ; # ీࡕ𑄴. +𞤮。𑇊‌≯᳦; 𞤮.𑇊‌≯᳦; [B1, C1, P1, V5, V6]; xn--me6h.xn--z6f16kn9b2642b; ; xn--me6h.xn--z6fz8ueq2v; [B1, P1, V5, V6] # 𞤮.𑇊≯᳦ +𞤮。𑇊‌≯᳦; 𞤮.𑇊‌≯᳦; [B1, C1, P1, V5, V6]; xn--me6h.xn--z6f16kn9b2642b; ; xn--me6h.xn--z6fz8ueq2v; [B1, P1, V5, V6] # 𞤮.𑇊≯᳦ +𞤌。𑇊‌≯᳦; 𞤮.𑇊‌≯᳦; [B1, C1, P1, V5, V6]; xn--me6h.xn--z6f16kn9b2642b; ; xn--me6h.xn--z6fz8ueq2v; [B1, P1, V5, V6] # 𞤮.𑇊≯᳦ +𞤌。𑇊‌≯᳦; 𞤮.𑇊‌≯᳦; [B1, C1, P1, V5, V6]; xn--me6h.xn--z6f16kn9b2642b; ; xn--me6h.xn--z6fz8ueq2v; [B1, P1, V5, V6] # 𞤮.𑇊≯᳦ +xn--me6h.xn--z6fz8ueq2v; 𞤮.𑇊≯᳦; [B1, V5, V6]; xn--me6h.xn--z6fz8ueq2v; ; ; # 𞤮.𑇊≯᳦ +xn--me6h.xn--z6f16kn9b2642b; 𞤮.𑇊‌≯᳦; [B1, C1, V5, V6]; xn--me6h.xn--z6f16kn9b2642b; ; ; # 𞤮.𑇊≯᳦ +󠄀𝟕.𞤌񛗓Ⴉ; 7.𞤮񛗓Ⴉ; [B1, B2, B3, P1, V6]; 7.xn--hnd3403vv1vv; ; ; # 7.𞤮Ⴉ +󠄀7.𞤌񛗓Ⴉ; 7.𞤮񛗓Ⴉ; [B1, B2, B3, P1, V6]; 7.xn--hnd3403vv1vv; ; ; # 7.𞤮Ⴉ +󠄀7.𞤮񛗓ⴉ; 7.𞤮񛗓ⴉ; [B1, B2, B3, P1, V6]; 7.xn--0kjz523lv1vv; ; ; # 7.𞤮ⴉ +7.xn--0kjz523lv1vv; 7.𞤮񛗓ⴉ; [B1, B2, B3, V6]; 7.xn--0kjz523lv1vv; ; ; # 7.𞤮ⴉ +7.xn--hnd3403vv1vv; 7.𞤮񛗓Ⴉ; [B1, B2, B3, V6]; 7.xn--hnd3403vv1vv; ; ; # 7.𞤮Ⴉ +󠄀𝟕.𞤮񛗓ⴉ; 7.𞤮񛗓ⴉ; [B1, B2, B3, P1, V6]; 7.xn--0kjz523lv1vv; ; ; # 7.𞤮ⴉ +󠄀7.𞤌񛗓ⴉ; 7.𞤮񛗓ⴉ; [B1, B2, B3, P1, V6]; 7.xn--0kjz523lv1vv; ; ; # 7.𞤮ⴉ +󠄀𝟕.𞤌񛗓ⴉ; 7.𞤮񛗓ⴉ; [B1, B2, B3, P1, V6]; 7.xn--0kjz523lv1vv; ; ; # 7.𞤮ⴉ +閃9𝩍。Ↄ٩ࢱ୍; 閃9𝩍.Ↄ٩ࢱ୍; [B5, B6, P1, V6]; xn--9-3j6dk517f.xn--iib28ij3c0t9a; ; ; # 閃9𝩍.Ↄ٩ࢱ୍ +閃9𝩍。ↄ٩ࢱ୍; 閃9𝩍.ↄ٩ࢱ୍; [B5, B6]; xn--9-3j6dk517f.xn--iib28ij3c4t9a; ; ; # 閃9𝩍.ↄ٩ࢱ୍ +xn--9-3j6dk517f.xn--iib28ij3c4t9a; 閃9𝩍.ↄ٩ࢱ୍; [B5, B6]; xn--9-3j6dk517f.xn--iib28ij3c4t9a; ; ; # 閃9𝩍.ↄ٩ࢱ୍ +xn--9-3j6dk517f.xn--iib28ij3c0t9a; 閃9𝩍.Ↄ٩ࢱ୍; [B5, B6, V6]; xn--9-3j6dk517f.xn--iib28ij3c0t9a; ; ; # 閃9𝩍.Ↄ٩ࢱ୍ +꫶ᢏฺ2.𐋢݅ྟ︒; ꫶ᢏฺ2.𐋢݅ྟ︒; [P1, V5, V6]; xn--2-2zf840fk16m.xn--sob093bj62sz9d; ; ; # ꫶ᢏฺ2.𐋢݅ྟ︒ +꫶ᢏฺ2.𐋢݅ྟ。; ꫶ᢏฺ2.𐋢݅ྟ.; [V5]; xn--2-2zf840fk16m.xn--sob093b2m7s.; ; ; # ꫶ᢏฺ2.𐋢݅ྟ. +xn--2-2zf840fk16m.xn--sob093b2m7s.; ꫶ᢏฺ2.𐋢݅ྟ.; [V5]; xn--2-2zf840fk16m.xn--sob093b2m7s.; ; ; # ꫶ᢏฺ2.𐋢݅ྟ. +xn--2-2zf840fk16m.xn--sob093bj62sz9d; ꫶ᢏฺ2.𐋢݅ྟ︒; [V5, V6]; xn--2-2zf840fk16m.xn--sob093bj62sz9d; ; ; # ꫶ᢏฺ2.𐋢݅ྟ︒ +󅴧。≠-󠙄⾛; 󅴧.≠-󠙄走; [P1, V6]; xn--gm57d.xn----tfo4949b3664m; ; ; # .≠-走 +󅴧。≠-󠙄⾛; 󅴧.≠-󠙄走; [P1, V6]; xn--gm57d.xn----tfo4949b3664m; ; ; # .≠-走 +󅴧。≠-󠙄走; 󅴧.≠-󠙄走; [P1, V6]; xn--gm57d.xn----tfo4949b3664m; ; ; # .≠-走 +󅴧。≠-󠙄走; 󅴧.≠-󠙄走; [P1, V6]; xn--gm57d.xn----tfo4949b3664m; ; ; # .≠-走 +xn--gm57d.xn----tfo4949b3664m; 󅴧.≠-󠙄走; [V6]; xn--gm57d.xn----tfo4949b3664m; ; ; # .≠-走 +ݮ؄Ⴊ。-≠ᅠ; ݮ؄Ⴊ.-≠ᅠ; [B1, B2, B3, P1, V3, V6]; xn--mfb73ex6r.xn----5bh589i; ; ; # ݮႪ.-≠ +ݮ؄Ⴊ。-≠ᅠ; ݮ؄Ⴊ.-≠ᅠ; [B1, B2, B3, P1, V3, V6]; xn--mfb73ex6r.xn----5bh589i; ; ; # ݮႪ.-≠ +ݮ؄ⴊ。-≠ᅠ; ݮ؄ⴊ.-≠ᅠ; [B1, B2, B3, P1, V3, V6]; xn--mfb73ek93f.xn----5bh589i; ; ; # ݮⴊ.-≠ +ݮ؄ⴊ。-≠ᅠ; ݮ؄ⴊ.-≠ᅠ; [B1, B2, B3, P1, V3, V6]; xn--mfb73ek93f.xn----5bh589i; ; ; # ݮⴊ.-≠ +xn--mfb73ek93f.xn----5bh589i; ݮ؄ⴊ.-≠ᅠ; [B1, B2, B3, V3, V6]; xn--mfb73ek93f.xn----5bh589i; ; ; # ݮⴊ.-≠ +xn--mfb73ex6r.xn----5bh589i; ݮ؄Ⴊ.-≠ᅠ; [B1, B2, B3, V3, V6]; xn--mfb73ex6r.xn----5bh589i; ; ; # ݮႪ.-≠ +ﭏ𐹧𝟒≯。‌; אל𐹧4≯.‌; [B1, B3, B4, C1, P1, V6]; xn--4-zhc0by36txt0w.xn--0ug; ; xn--4-zhc0by36txt0w.; [B3, B4, P1, V6] # אל𐹧4≯. +ﭏ𐹧𝟒≯。‌; אל𐹧4≯.‌; [B1, B3, B4, C1, P1, V6]; xn--4-zhc0by36txt0w.xn--0ug; ; xn--4-zhc0by36txt0w.; [B3, B4, P1, V6] # אל𐹧4≯. +אל𐹧4≯。‌; אל𐹧4≯.‌; [B1, B3, B4, C1, P1, V6]; xn--4-zhc0by36txt0w.xn--0ug; ; xn--4-zhc0by36txt0w.; [B3, B4, P1, V6] # אל𐹧4≯. +אל𐹧4≯。‌; אל𐹧4≯.‌; [B1, B3, B4, C1, P1, V6]; xn--4-zhc0by36txt0w.xn--0ug; ; xn--4-zhc0by36txt0w.; [B3, B4, P1, V6] # אל𐹧4≯. +xn--4-zhc0by36txt0w.; אל𐹧4≯.; [B3, B4, V6]; xn--4-zhc0by36txt0w.; ; ; # אל𐹧4≯. +xn--4-zhc0by36txt0w.xn--0ug; אל𐹧4≯.‌; [B1, B3, B4, C1, V6]; xn--4-zhc0by36txt0w.xn--0ug; ; ; # אל𐹧4≯. +𝟎。甯; 0.甯; ; 0.xn--qny; ; ; # 0.甯 +0。甯; 0.甯; ; 0.xn--qny; ; ; # 0.甯 +0.xn--qny; 0.甯; ; 0.xn--qny; ; ; # 0.甯 +0.甯; ; ; 0.xn--qny; ; ; # 0.甯 +-⾆.꫶; -舌.꫶; [V3, V5]; xn----ef8c.xn--2v9a; ; ; # -舌.꫶ +-舌.꫶; ; [V3, V5]; xn----ef8c.xn--2v9a; ; ; # -舌.꫶ +xn----ef8c.xn--2v9a; -舌.꫶; [V3, V5]; xn----ef8c.xn--2v9a; ; ; # -舌.꫶ +-。ᢘ; -.ᢘ; [V3]; -.xn--ibf; ; ; # -.ᢘ +-。ᢘ; -.ᢘ; [V3]; -.xn--ibf; ; ; # -.ᢘ +-.xn--ibf; -.ᢘ; [V3]; -.xn--ibf; ; ; # -.ᢘ +🂴Ⴋ.≮; ; [P1, V6]; xn--jnd1986v.xn--gdh; ; ; # 🂴Ⴋ.≮ +🂴Ⴋ.≮; 🂴Ⴋ.≮; [P1, V6]; xn--jnd1986v.xn--gdh; ; ; # 🂴Ⴋ.≮ +🂴ⴋ.≮; 🂴ⴋ.≮; [P1, V6]; xn--2kj7565l.xn--gdh; ; ; # 🂴ⴋ.≮ +🂴ⴋ.≮; ; [P1, V6]; xn--2kj7565l.xn--gdh; ; ; # 🂴ⴋ.≮ +xn--2kj7565l.xn--gdh; 🂴ⴋ.≮; [V6]; xn--2kj7565l.xn--gdh; ; ; # 🂴ⴋ.≮ +xn--jnd1986v.xn--gdh; 🂴Ⴋ.≮; [V6]; xn--jnd1986v.xn--gdh; ; ; # 🂴Ⴋ.≮ +璼𝨭。‌󠇟; 璼𝨭.‌; [C1]; xn--gky8837e.xn--0ug; ; xn--gky8837e.; [] # 璼𝨭. +璼𝨭。‌󠇟; 璼𝨭.‌; [C1]; xn--gky8837e.xn--0ug; ; xn--gky8837e.; [] # 璼𝨭. +xn--gky8837e.; 璼𝨭.; ; xn--gky8837e.; ; ; # 璼𝨭. +璼𝨭.; ; ; xn--gky8837e.; ; ; # 璼𝨭. +xn--gky8837e.xn--0ug; 璼𝨭.‌; [C1]; xn--gky8837e.xn--0ug; ; ; # 璼𝨭. +٩8񂍽。-5🞥; ٩8񂍽.-5🞥; [B1, P1, V3, V6]; xn--8-qqc97891f.xn---5-rp92a; ; ; # ٩8.-5🞥 +٩8񂍽。-5🞥; ٩8񂍽.-5🞥; [B1, P1, V3, V6]; xn--8-qqc97891f.xn---5-rp92a; ; ; # ٩8.-5🞥 +xn--8-qqc97891f.xn---5-rp92a; ٩8񂍽.-5🞥; [B1, V3, V6]; xn--8-qqc97891f.xn---5-rp92a; ; ; # ٩8.-5🞥 +‌.‌; ; [C1]; xn--0ug.xn--0ug; ; .; [A4_2] # . +xn--0ug.xn--0ug; ‌.‌; [C1]; xn--0ug.xn--0ug; ; ; # . +‍튛.ܖ; ; [B1, C2]; xn--1ug4441e.xn--gnb; ; xn--157b.xn--gnb; [] # 튛.ܖ +‍튛.ܖ; ‍튛.ܖ; [B1, C2]; xn--1ug4441e.xn--gnb; ; xn--157b.xn--gnb; [] # 튛.ܖ +xn--157b.xn--gnb; 튛.ܖ; ; xn--157b.xn--gnb; ; ; # 튛.ܖ +튛.ܖ; ; ; xn--157b.xn--gnb; ; ; # 튛.ܖ +튛.ܖ; 튛.ܖ; ; xn--157b.xn--gnb; ; ; # 튛.ܖ +xn--1ug4441e.xn--gnb; ‍튛.ܖ; [B1, C2]; xn--1ug4441e.xn--gnb; ; ; # 튛.ܖ +ᡋ𐹰𞽳.ݹⴞ; ; [B2, B3, B5, B6, P1, V6]; xn--b8e0417jocvf.xn--9pb883q; ; ; # ᡋ𐹰.ݹⴞ +ᡋ𐹰𞽳.ݹႾ; ; [B2, B3, B5, B6, P1, V6]; xn--b8e0417jocvf.xn--9pb068b; ; ; # ᡋ𐹰.ݹႾ +xn--b8e0417jocvf.xn--9pb068b; ᡋ𐹰𞽳.ݹႾ; [B2, B3, B5, B6, V6]; xn--b8e0417jocvf.xn--9pb068b; ; ; # ᡋ𐹰.ݹႾ +xn--b8e0417jocvf.xn--9pb883q; ᡋ𐹰𞽳.ݹⴞ; [B2, B3, B5, B6, V6]; xn--b8e0417jocvf.xn--9pb883q; ; ; # ᡋ𐹰.ݹⴞ +𐷃٢𝅻𝟧.𐹮𐹬Ⴇ; 𐷃٢𝅻5.𐹮𐹬Ⴇ; [B1, B4, P1, V6]; xn--5-cqc8833rhv7f.xn--fnd3401kfa; ; ; # ٢𝅻5.𐹮𐹬Ⴇ +𐷃٢𝅻5.𐹮𐹬Ⴇ; ; [B1, B4, P1, V6]; xn--5-cqc8833rhv7f.xn--fnd3401kfa; ; ; # ٢𝅻5.𐹮𐹬Ⴇ +𐷃٢𝅻5.𐹮𐹬ⴇ; ; [B1, B4, P1, V6]; xn--5-cqc8833rhv7f.xn--ykjz523efa; ; ; # ٢𝅻5.𐹮𐹬ⴇ +xn--5-cqc8833rhv7f.xn--ykjz523efa; 𐷃٢𝅻5.𐹮𐹬ⴇ; [B1, B4, V6]; xn--5-cqc8833rhv7f.xn--ykjz523efa; ; ; # ٢𝅻5.𐹮𐹬ⴇ +xn--5-cqc8833rhv7f.xn--fnd3401kfa; 𐷃٢𝅻5.𐹮𐹬Ⴇ; [B1, B4, V6]; xn--5-cqc8833rhv7f.xn--fnd3401kfa; ; ; # ٢𝅻5.𐹮𐹬Ⴇ +𐷃٢𝅻𝟧.𐹮𐹬ⴇ; 𐷃٢𝅻5.𐹮𐹬ⴇ; [B1, B4, P1, V6]; xn--5-cqc8833rhv7f.xn--ykjz523efa; ; ; # ٢𝅻5.𐹮𐹬ⴇ +Ⴗ.𑄴ׂꦷ񘃨; Ⴗ.𑄴ׂꦷ񘃨; [P1, V5, V6]; xn--vnd.xn--qdb0605f14ycrms3c; ; ; # Ⴗ.𑄴ׂꦷ +Ⴗ.𑄴ׂꦷ񘃨; Ⴗ.𑄴ׂꦷ񘃨; [P1, V5, V6]; xn--vnd.xn--qdb0605f14ycrms3c; ; ; # Ⴗ.𑄴ׂꦷ +Ⴗ.𑄴ׂꦷ񘃨; ; [P1, V5, V6]; xn--vnd.xn--qdb0605f14ycrms3c; ; ; # Ⴗ.𑄴ׂꦷ +ⴗ.𑄴ׂꦷ񘃨; ; [P1, V5, V6]; xn--flj.xn--qdb0605f14ycrms3c; ; ; # ⴗ.𑄴ׂꦷ +xn--flj.xn--qdb0605f14ycrms3c; ⴗ.𑄴ׂꦷ񘃨; [V5, V6]; xn--flj.xn--qdb0605f14ycrms3c; ; ; # ⴗ.𑄴ׂꦷ +xn--vnd.xn--qdb0605f14ycrms3c; Ⴗ.𑄴ׂꦷ񘃨; [V5, V6]; xn--vnd.xn--qdb0605f14ycrms3c; ; ; # Ⴗ.𑄴ׂꦷ +ⴗ.𑄴ׂꦷ񘃨; ⴗ.𑄴ׂꦷ񘃨; [P1, V5, V6]; xn--flj.xn--qdb0605f14ycrms3c; ; ; # ⴗ.𑄴ׂꦷ +ⴗ.𑄴ׂꦷ񘃨; ⴗ.𑄴ׂꦷ񘃨; [P1, V5, V6]; xn--flj.xn--qdb0605f14ycrms3c; ; ; # ⴗ.𑄴ׂꦷ +𝟾𾤘.򇕛٬; 8𾤘.򇕛٬; [B1, B5, B6, P1, V6]; xn--8-kh23b.xn--lib78461i; ; ; # 8.٬ +8𾤘.򇕛٬; ; [B1, B5, B6, P1, V6]; xn--8-kh23b.xn--lib78461i; ; ; # 8.٬ +xn--8-kh23b.xn--lib78461i; 8𾤘.򇕛٬; [B1, B5, B6, V6]; xn--8-kh23b.xn--lib78461i; ; ; # 8.٬ +⒈酫︒。ࣖ; ⒈酫︒.ࣖ; [P1, V5, V6]; xn--tsh4490bfe8c.xn--8zb; ; ; # ⒈酫︒.ࣖ +1.酫。。ࣖ; 1.酫..ࣖ; [V5, X4_2]; 1.xn--8j4a..xn--8zb; [V5, A4_2]; ; # 1.酫..ࣖ +1.xn--8j4a..xn--8zb; 1.酫..ࣖ; [V5, X4_2]; 1.xn--8j4a..xn--8zb; [V5, A4_2]; ; # 1.酫..ࣖ +xn--tsh4490bfe8c.xn--8zb; ⒈酫︒.ࣖ; [V5, V6]; xn--tsh4490bfe8c.xn--8zb; ; ; # ⒈酫︒.ࣖ +ⷣ‌≮ᩫ.‌ฺ; ; [C1, P1, V5, V6]; xn--uof63xk4bf3s.xn--o4c732g; ; xn--uof548an0j.xn--o4c; [P1, V5, V6] # ⷣ≮ᩫ.ฺ +ⷣ‌≮ᩫ.‌ฺ; ⷣ‌≮ᩫ.‌ฺ; [C1, P1, V5, V6]; xn--uof63xk4bf3s.xn--o4c732g; ; xn--uof548an0j.xn--o4c; [P1, V5, V6] # ⷣ≮ᩫ.ฺ +xn--uof548an0j.xn--o4c; ⷣ≮ᩫ.ฺ; [V5, V6]; xn--uof548an0j.xn--o4c; ; ; # ⷣ≮ᩫ.ฺ +xn--uof63xk4bf3s.xn--o4c732g; ⷣ‌≮ᩫ.‌ฺ; [C1, V5, V6]; xn--uof63xk4bf3s.xn--o4c732g; ; ; # ⷣ≮ᩫ.ฺ +𞪂。ႷႽ¹‍; 𞪂.ႷႽ1‍; [B6, C2, P1, V6]; xn--co6h.xn--1-h1gs597m; ; xn--co6h.xn--1-h1gs; [P1, V6] # .ႷႽ1 +𞪂。ႷႽ1‍; 𞪂.ႷႽ1‍; [B6, C2, P1, V6]; xn--co6h.xn--1-h1gs597m; ; xn--co6h.xn--1-h1gs; [P1, V6] # .ႷႽ1 +𞪂。ⴗⴝ1‍; 𞪂.ⴗⴝ1‍; [B6, C2, P1, V6]; xn--co6h.xn--1-ugn710dya; ; xn--co6h.xn--1-kwssa; [P1, V6] # .ⴗⴝ1 +𞪂。Ⴗⴝ1‍; 𞪂.Ⴗⴝ1‍; [B6, C2, P1, V6]; xn--co6h.xn--1-h1g398iewm; ; xn--co6h.xn--1-h1g429s; [P1, V6] # .Ⴗⴝ1 +xn--co6h.xn--1-h1g429s; 𞪂.Ⴗⴝ1; [V6]; xn--co6h.xn--1-h1g429s; ; ; # .Ⴗⴝ1 +xn--co6h.xn--1-h1g398iewm; 𞪂.Ⴗⴝ1‍; [B6, C2, V6]; xn--co6h.xn--1-h1g398iewm; ; ; # .Ⴗⴝ1 +xn--co6h.xn--1-kwssa; 𞪂.ⴗⴝ1; [V6]; xn--co6h.xn--1-kwssa; ; ; # .ⴗⴝ1 +xn--co6h.xn--1-ugn710dya; 𞪂.ⴗⴝ1‍; [B6, C2, V6]; xn--co6h.xn--1-ugn710dya; ; ; # .ⴗⴝ1 +xn--co6h.xn--1-h1gs; 𞪂.ႷႽ1; [V6]; xn--co6h.xn--1-h1gs; ; ; # .ႷႽ1 +xn--co6h.xn--1-h1gs597m; 𞪂.ႷႽ1‍; [B6, C2, V6]; xn--co6h.xn--1-h1gs597m; ; ; # .ႷႽ1 +𞪂。ⴗⴝ¹‍; 𞪂.ⴗⴝ1‍; [B6, C2, P1, V6]; xn--co6h.xn--1-ugn710dya; ; xn--co6h.xn--1-kwssa; [P1, V6] # .ⴗⴝ1 +𞪂。Ⴗⴝ¹‍; 𞪂.Ⴗⴝ1‍; [B6, C2, P1, V6]; xn--co6h.xn--1-h1g398iewm; ; xn--co6h.xn--1-h1g429s; [P1, V6] # .Ⴗⴝ1 +𑄴𑄳2.𞳿󠀳-; ; [B1, B3, P1, V3, V5, V6]; xn--2-h87ic.xn----s39r33498d; ; ; # 𑄴𑄳2.- +xn--2-h87ic.xn----s39r33498d; 𑄴𑄳2.𞳿󠀳-; [B1, B3, V3, V5, V6]; xn--2-h87ic.xn----s39r33498d; ; ; # 𑄴𑄳2.- +󠕲󟶶٥。񀁁𑄳𞤃ܐ; 󠕲󟶶٥.񀁁𑄳𞤥ܐ; [B1, B5, B6, P1, V6]; xn--eib57614py3ea.xn--9mb5737kqnpfzkwr; ; ; # ٥.𑄳𞤥ܐ +󠕲󟶶٥。񀁁𑄳𞤃ܐ; 󠕲󟶶٥.񀁁𑄳𞤥ܐ; [B1, B5, B6, P1, V6]; xn--eib57614py3ea.xn--9mb5737kqnpfzkwr; ; ; # ٥.𑄳𞤥ܐ +󠕲󟶶٥。񀁁𑄳𞤥ܐ; 󠕲󟶶٥.񀁁𑄳𞤥ܐ; [B1, B5, B6, P1, V6]; xn--eib57614py3ea.xn--9mb5737kqnpfzkwr; ; ; # ٥.𑄳𞤥ܐ +xn--eib57614py3ea.xn--9mb5737kqnpfzkwr; 󠕲󟶶٥.񀁁𑄳𞤥ܐ; [B1, B5, B6, V6]; xn--eib57614py3ea.xn--9mb5737kqnpfzkwr; ; ; # ٥.𑄳𞤥ܐ +󠕲󟶶٥。񀁁𑄳𞤥ܐ; 󠕲󟶶٥.񀁁𑄳𞤥ܐ; [B1, B5, B6, P1, V6]; xn--eib57614py3ea.xn--9mb5737kqnpfzkwr; ; ; # ٥.𑄳𞤥ܐ +ܠ򲠽𐹢ុ。ςᢈ🝭‌; ܠ򲠽𐹢ុ.ςᢈ🝭‌; [B2, B6, C1, P1, V6]; xn--qnb616fis0qzt36f.xn--3xa057h6ofgl44c; ; xn--qnb616fis0qzt36f.xn--4xa847hli46a; [B2, B6, P1, V6] # ܠ𐹢ុ.ςᢈ🝭 +ܠ򲠽𐹢ុ。ςᢈ🝭‌; ܠ򲠽𐹢ុ.ςᢈ🝭‌; [B2, B6, C1, P1, V6]; xn--qnb616fis0qzt36f.xn--3xa057h6ofgl44c; ; xn--qnb616fis0qzt36f.xn--4xa847hli46a; [B2, B6, P1, V6] # ܠ𐹢ុ.ςᢈ🝭 +ܠ򲠽𐹢ុ。Σᢈ🝭‌; ܠ򲠽𐹢ុ.σᢈ🝭‌; [B2, B6, C1, P1, V6]; xn--qnb616fis0qzt36f.xn--4xa847h6ofgl44c; ; xn--qnb616fis0qzt36f.xn--4xa847hli46a; [B2, B6, P1, V6] # ܠ𐹢ុ.σᢈ🝭 +ܠ򲠽𐹢ុ。σᢈ🝭‌; ܠ򲠽𐹢ុ.σᢈ🝭‌; [B2, B6, C1, P1, V6]; xn--qnb616fis0qzt36f.xn--4xa847h6ofgl44c; ; xn--qnb616fis0qzt36f.xn--4xa847hli46a; [B2, B6, P1, V6] # ܠ𐹢ុ.σᢈ🝭 +xn--qnb616fis0qzt36f.xn--4xa847hli46a; ܠ򲠽𐹢ុ.σᢈ🝭; [B2, B6, V6]; xn--qnb616fis0qzt36f.xn--4xa847hli46a; ; ; # ܠ𐹢ុ.σᢈ🝭 +xn--qnb616fis0qzt36f.xn--4xa847h6ofgl44c; ܠ򲠽𐹢ុ.σᢈ🝭‌; [B2, B6, C1, V6]; xn--qnb616fis0qzt36f.xn--4xa847h6ofgl44c; ; ; # ܠ𐹢ុ.σᢈ🝭 +xn--qnb616fis0qzt36f.xn--3xa057h6ofgl44c; ܠ򲠽𐹢ុ.ςᢈ🝭‌; [B2, B6, C1, V6]; xn--qnb616fis0qzt36f.xn--3xa057h6ofgl44c; ; ; # ܠ𐹢ុ.ςᢈ🝭 +ܠ򲠽𐹢ុ。Σᢈ🝭‌; ܠ򲠽𐹢ុ.σᢈ🝭‌; [B2, B6, C1, P1, V6]; xn--qnb616fis0qzt36f.xn--4xa847h6ofgl44c; ; xn--qnb616fis0qzt36f.xn--4xa847hli46a; [B2, B6, P1, V6] # ܠ𐹢ុ.σᢈ🝭 +ܠ򲠽𐹢ុ。σᢈ🝭‌; ܠ򲠽𐹢ុ.σᢈ🝭‌; [B2, B6, C1, P1, V6]; xn--qnb616fis0qzt36f.xn--4xa847h6ofgl44c; ; xn--qnb616fis0qzt36f.xn--4xa847hli46a; [B2, B6, P1, V6] # ܠ𐹢ុ.σᢈ🝭 +‍--≮。𐹧; ‍--≮.𐹧; [B1, C2, P1, V6]; xn-----l1tz1k.xn--fo0d; ; xn-----ujv.xn--fo0d; [B1, P1, V3, V6] # --≮.𐹧 +‍--≮。𐹧; ‍--≮.𐹧; [B1, C2, P1, V6]; xn-----l1tz1k.xn--fo0d; ; xn-----ujv.xn--fo0d; [B1, P1, V3, V6] # --≮.𐹧 +xn-----ujv.xn--fo0d; --≮.𐹧; [B1, V3, V6]; xn-----ujv.xn--fo0d; ; ; # --≮.𐹧 +xn-----l1tz1k.xn--fo0d; ‍--≮.𐹧; [B1, C2, V6]; xn-----l1tz1k.xn--fo0d; ; ; # --≮.𐹧 +꠆。𻚏ྰ⒕; ꠆.𻚏ྰ⒕; [P1, V5, V6]; xn--l98a.xn--dgd218hhp28d; ; ; # ꠆.ྰ⒕ +꠆。𻚏ྰ14.; ꠆.𻚏ྰ14.; [P1, V5, V6]; xn--l98a.xn--14-jsj57880f.; ; ; # ꠆.ྰ14. +xn--l98a.xn--14-jsj57880f.; ꠆.𻚏ྰ14.; [V5, V6]; xn--l98a.xn--14-jsj57880f.; ; ; # ꠆.ྰ14. +xn--l98a.xn--dgd218hhp28d; ꠆.𻚏ྰ⒕; [V5, V6]; xn--l98a.xn--dgd218hhp28d; ; ; # ꠆.ྰ⒕ +򮉂ڼ.𑆺٩; 򮉂ڼ.𑆺٩; [B1, B5, B6, P1, V5, V6]; xn--vkb92243l.xn--iib9797k; ; ; # ڼ.𑆺٩ +򮉂ڼ.𑆺٩; ; [B1, B5, B6, P1, V5, V6]; xn--vkb92243l.xn--iib9797k; ; ; # ڼ.𑆺٩ +xn--vkb92243l.xn--iib9797k; 򮉂ڼ.𑆺٩; [B1, B5, B6, V5, V6]; xn--vkb92243l.xn--iib9797k; ; ; # ڼ.𑆺٩ +󠁎ې-。𞤴; 󠁎ې-.𞤴; [B1, P1, V3, V6]; xn----mwc72685y.xn--se6h; ; ; # ې-.𞤴 +󠁎ې-。𞤒; 󠁎ې-.𞤴; [B1, P1, V3, V6]; xn----mwc72685y.xn--se6h; ; ; # ې-.𞤴 +xn----mwc72685y.xn--se6h; 󠁎ې-.𞤴; [B1, V3, V6]; xn----mwc72685y.xn--se6h; ; ; # ې-.𞤴 +𝟠4󠇗𝈻.‍𐋵⛧‍; 84𝈻.‍𐋵⛧‍; [C2]; xn--84-s850a.xn--1uga573cfq1w; ; xn--84-s850a.xn--59h6326e; [] # 84𝈻.𐋵⛧ +84󠇗𝈻.‍𐋵⛧‍; 84𝈻.‍𐋵⛧‍; [C2]; xn--84-s850a.xn--1uga573cfq1w; ; xn--84-s850a.xn--59h6326e; [] # 84𝈻.𐋵⛧ +xn--84-s850a.xn--59h6326e; 84𝈻.𐋵⛧; ; xn--84-s850a.xn--59h6326e; ; ; # 84𝈻.𐋵⛧ +84𝈻.𐋵⛧; ; ; xn--84-s850a.xn--59h6326e; ; ; # 84𝈻.𐋵⛧ +xn--84-s850a.xn--1uga573cfq1w; 84𝈻.‍𐋵⛧‍; [C2]; xn--84-s850a.xn--1uga573cfq1w; ; ; # 84𝈻.𐋵⛧ +-؁。ᡪ; -؁.ᡪ; [B1, P1, V3, V6]; xn----tkc.xn--68e; ; ; # -.ᡪ +-؁。ᡪ; -؁.ᡪ; [B1, P1, V3, V6]; xn----tkc.xn--68e; ; ; # -.ᡪ +xn----tkc.xn--68e; -؁.ᡪ; [B1, V3, V6]; xn----tkc.xn--68e; ; ; # -.ᡪ +≮𝟕.謖ß≯; ≮7.謖ß≯; [P1, V6]; xn--7-mgo.xn--zca892oly5e; ; xn--7-mgo.xn--ss-xjvv174c; # ≮7.謖ß≯ +≮𝟕.謖ß≯; ≮7.謖ß≯; [P1, V6]; xn--7-mgo.xn--zca892oly5e; ; xn--7-mgo.xn--ss-xjvv174c; # ≮7.謖ß≯ +≮7.謖ß≯; ; [P1, V6]; xn--7-mgo.xn--zca892oly5e; ; xn--7-mgo.xn--ss-xjvv174c; # ≮7.謖ß≯ +≮7.謖ß≯; ≮7.謖ß≯; [P1, V6]; xn--7-mgo.xn--zca892oly5e; ; xn--7-mgo.xn--ss-xjvv174c; # ≮7.謖ß≯ +≮7.謖SS≯; ≮7.謖ss≯; [P1, V6]; xn--7-mgo.xn--ss-xjvv174c; ; ; # ≮7.謖ss≯ +≮7.謖SS≯; ≮7.謖ss≯; [P1, V6]; xn--7-mgo.xn--ss-xjvv174c; ; ; # ≮7.謖ss≯ +≮7.謖ss≯; ; [P1, V6]; xn--7-mgo.xn--ss-xjvv174c; ; ; # ≮7.謖ss≯ +≮7.謖ss≯; ≮7.謖ss≯; [P1, V6]; xn--7-mgo.xn--ss-xjvv174c; ; ; # ≮7.謖ss≯ +≮7.謖Ss≯; ≮7.謖ss≯; [P1, V6]; xn--7-mgo.xn--ss-xjvv174c; ; ; # ≮7.謖ss≯ +≮7.謖Ss≯; ≮7.謖ss≯; [P1, V6]; xn--7-mgo.xn--ss-xjvv174c; ; ; # ≮7.謖ss≯ +xn--7-mgo.xn--ss-xjvv174c; ≮7.謖ss≯; [V6]; xn--7-mgo.xn--ss-xjvv174c; ; ; # ≮7.謖ss≯ +xn--7-mgo.xn--zca892oly5e; ≮7.謖ß≯; [V6]; xn--7-mgo.xn--zca892oly5e; ; ; # ≮7.謖ß≯ +≮𝟕.謖SS≯; ≮7.謖ss≯; [P1, V6]; xn--7-mgo.xn--ss-xjvv174c; ; ; # ≮7.謖ss≯ +≮𝟕.謖SS≯; ≮7.謖ss≯; [P1, V6]; xn--7-mgo.xn--ss-xjvv174c; ; ; # ≮7.謖ss≯ +≮𝟕.謖ss≯; ≮7.謖ss≯; [P1, V6]; xn--7-mgo.xn--ss-xjvv174c; ; ; # ≮7.謖ss≯ +≮𝟕.謖ss≯; ≮7.謖ss≯; [P1, V6]; xn--7-mgo.xn--ss-xjvv174c; ; ; # ≮7.謖ss≯ +≮𝟕.謖Ss≯; ≮7.謖ss≯; [P1, V6]; xn--7-mgo.xn--ss-xjvv174c; ; ; # ≮7.謖ss≯ +≮𝟕.謖Ss≯; ≮7.謖ss≯; [P1, V6]; xn--7-mgo.xn--ss-xjvv174c; ; ; # ≮7.謖ss≯ +朶Ⴉ𞪡.𝨽ࠥ📻-; ; [B1, B5, B6, P1, V3, V5, V6]; xn--hnd7245bd56p.xn----3gd37096apmwa; ; ; # 朶Ⴉ.𝨽ࠥ📻- +朶ⴉ𞪡.𝨽ࠥ📻-; ; [B1, B5, B6, P1, V3, V5, V6]; xn--0kjz47pd57t.xn----3gd37096apmwa; ; ; # 朶ⴉ.𝨽ࠥ📻- +xn--0kjz47pd57t.xn----3gd37096apmwa; 朶ⴉ𞪡.𝨽ࠥ📻-; [B1, B5, B6, V3, V5, V6]; xn--0kjz47pd57t.xn----3gd37096apmwa; ; ; # 朶ⴉ.𝨽ࠥ📻- +xn--hnd7245bd56p.xn----3gd37096apmwa; 朶Ⴉ𞪡.𝨽ࠥ📻-; [B1, B5, B6, V3, V5, V6]; xn--hnd7245bd56p.xn----3gd37096apmwa; ; ; # 朶Ⴉ.𝨽ࠥ📻- +𐤎。󑿰‌≮‍; 𐤎.󑿰‌≮‍; [B6, C1, C2, P1, V6]; xn--bk9c.xn--0ugc04p2u638c; ; xn--bk9c.xn--gdhx6802k; [B6, P1, V6] # 𐤎.≮ +𐤎。󑿰‌≮‍; 𐤎.󑿰‌≮‍; [B6, C1, C2, P1, V6]; xn--bk9c.xn--0ugc04p2u638c; ; xn--bk9c.xn--gdhx6802k; [B6, P1, V6] # 𐤎.≮ +xn--bk9c.xn--gdhx6802k; 𐤎.󑿰≮; [B6, V6]; xn--bk9c.xn--gdhx6802k; ; ; # 𐤎.≮ +xn--bk9c.xn--0ugc04p2u638c; 𐤎.󑿰‌≮‍; [B6, C1, C2, V6]; xn--bk9c.xn--0ugc04p2u638c; ; ; # 𐤎.≮ +񭜎⒈。‌𝟤; 񭜎⒈.‌2; [C1, P1, V6]; xn--tsh94183d.xn--2-rgn; ; xn--tsh94183d.2; [P1, V6] # ⒈.2 +񭜎1.。‌2; 񭜎1..‌2; [C1, P1, V6, X4_2]; xn--1-ex54e..xn--2-rgn; [C1, P1, V6, A4_2]; xn--1-ex54e..2; [P1, V6, A4_2] # 1..2 +xn--1-ex54e..2; 񭜎1..2; [V6, X4_2]; xn--1-ex54e..2; [V6, A4_2]; ; # 1..2 +xn--1-ex54e..xn--2-rgn; 񭜎1..‌2; [C1, V6, X4_2]; xn--1-ex54e..xn--2-rgn; [C1, V6, A4_2]; ; # 1..2 +xn--tsh94183d.2; 񭜎⒈.2; [V6]; xn--tsh94183d.2; ; ; # ⒈.2 +xn--tsh94183d.xn--2-rgn; 񭜎⒈.‌2; [C1, V6]; xn--tsh94183d.xn--2-rgn; ; ; # ⒈.2 +󠟊𐹤‍.𐹳󙄵𐹶; 󠟊𐹤‍.𐹳󙄵𐹶; [B1, C2, P1, V6]; xn--1ugy994g7k93g.xn--ro0dga22807v; ; xn--co0d98977c.xn--ro0dga22807v; [B1, P1, V6] # 𐹤.𐹳𐹶 +󠟊𐹤‍.𐹳󙄵𐹶; ; [B1, C2, P1, V6]; xn--1ugy994g7k93g.xn--ro0dga22807v; ; xn--co0d98977c.xn--ro0dga22807v; [B1, P1, V6] # 𐹤.𐹳𐹶 +xn--co0d98977c.xn--ro0dga22807v; 󠟊𐹤.𐹳󙄵𐹶; [B1, V6]; xn--co0d98977c.xn--ro0dga22807v; ; ; # 𐹤.𐹳𐹶 +xn--1ugy994g7k93g.xn--ro0dga22807v; 󠟊𐹤‍.𐹳󙄵𐹶; [B1, C2, V6]; xn--1ugy994g7k93g.xn--ro0dga22807v; ; ; # 𐹤.𐹳𐹶 +𞤴𐹻𑓂𐭝.्︇􉛯; 𞤴𐹻𑓂𐭝.्􉛯; [B1, P1, V5, V6]; xn--609c96c09grp2w.xn--n3b28708s; ; ; # 𞤴𐹻𑓂𐭝.् +𞤴𐹻𑓂𐭝.्︇􉛯; 𞤴𐹻𑓂𐭝.्􉛯; [B1, P1, V5, V6]; xn--609c96c09grp2w.xn--n3b28708s; ; ; # 𞤴𐹻𑓂𐭝.् +𞤒𐹻𑓂𐭝.्︇􉛯; 𞤴𐹻𑓂𐭝.्􉛯; [B1, P1, V5, V6]; xn--609c96c09grp2w.xn--n3b28708s; ; ; # 𞤴𐹻𑓂𐭝.् +xn--609c96c09grp2w.xn--n3b28708s; 𞤴𐹻𑓂𐭝.्􉛯; [B1, V5, V6]; xn--609c96c09grp2w.xn--n3b28708s; ; ; # 𞤴𐹻𑓂𐭝.् +𞤒𐹻𑓂𐭝.्︇􉛯; 𞤴𐹻𑓂𐭝.्􉛯; [B1, P1, V5, V6]; xn--609c96c09grp2w.xn--n3b28708s; ; ; # 𞤴𐹻𑓂𐭝.् +٨。𐹠𐹽񗮶; ٨.𐹠𐹽񗮶; [B1, P1, V6]; xn--hib.xn--7n0d2bu9196b; ; ; # ٨.𐹠𐹽 +٨。𐹠𐹽񗮶; ٨.𐹠𐹽񗮶; [B1, P1, V6]; xn--hib.xn--7n0d2bu9196b; ; ; # ٨.𐹠𐹽 +xn--hib.xn--7n0d2bu9196b; ٨.𐹠𐹽񗮶; [B1, V6]; xn--hib.xn--7n0d2bu9196b; ; ; # ٨.𐹠𐹽 +ᅠ񍀜.8򶾵ڜ; ; [B1, P1, V6]; xn--psd85033d.xn--8-otc61545t; ; ; # .8ڜ +xn--psd85033d.xn--8-otc61545t; ᅠ񍀜.8򶾵ڜ; [B1, V6]; xn--psd85033d.xn--8-otc61545t; ; ; # .8ڜ +‍‌󠆪。ß𑓃; ‍‌.ß𑓃; [C1, C2]; xn--0ugb.xn--zca0732l; ; .xn--ss-bh7o; [A4_2] # .ß𑓃 +‍‌󠆪。ß𑓃; ‍‌.ß𑓃; [C1, C2]; xn--0ugb.xn--zca0732l; ; .xn--ss-bh7o; [A4_2] # .ß𑓃 +‍‌󠆪。SS𑓃; ‍‌.ss𑓃; [C1, C2]; xn--0ugb.xn--ss-bh7o; ; .xn--ss-bh7o; [A4_2] # .ss𑓃 +‍‌󠆪。ss𑓃; ‍‌.ss𑓃; [C1, C2]; xn--0ugb.xn--ss-bh7o; ; .xn--ss-bh7o; [A4_2] # .ss𑓃 +‍‌󠆪。Ss𑓃; ‍‌.ss𑓃; [C1, C2]; xn--0ugb.xn--ss-bh7o; ; .xn--ss-bh7o; [A4_2] # .ss𑓃 +.xn--ss-bh7o; .ss𑓃; [X4_2]; .xn--ss-bh7o; [A4_2]; ; # .ss𑓃 +xn--0ugb.xn--ss-bh7o; ‍‌.ss𑓃; [C1, C2]; xn--0ugb.xn--ss-bh7o; ; ; # .ss𑓃 +xn--0ugb.xn--zca0732l; ‍‌.ß𑓃; [C1, C2]; xn--0ugb.xn--zca0732l; ; ; # .ß𑓃 +‍‌󠆪。SS𑓃; ‍‌.ss𑓃; [C1, C2]; xn--0ugb.xn--ss-bh7o; ; .xn--ss-bh7o; [A4_2] # .ss𑓃 +‍‌󠆪。ss𑓃; ‍‌.ss𑓃; [C1, C2]; xn--0ugb.xn--ss-bh7o; ; .xn--ss-bh7o; [A4_2] # .ss𑓃 +‍‌󠆪。Ss𑓃; ‍‌.ss𑓃; [C1, C2]; xn--0ugb.xn--ss-bh7o; ; .xn--ss-bh7o; [A4_2] # .ss𑓃 +xn--ss-bh7o; ss𑓃; ; xn--ss-bh7o; ; ; # ss𑓃 +ss𑓃; ; ; xn--ss-bh7o; ; ; # ss𑓃 +SS𑓃; ss𑓃; ; xn--ss-bh7o; ; ; # ss𑓃 +Ss𑓃; ss𑓃; ; xn--ss-bh7o; ; ; # ss𑓃 +︒‌ヶ䒩.ꡪ; ; [C1, P1, V6]; xn--0ug287dj0or48o.xn--gd9a; ; xn--qekw60dns9k.xn--gd9a; [P1, V6] # ︒ヶ䒩.ꡪ +。‌ヶ䒩.ꡪ; .‌ヶ䒩.ꡪ; [C1, X4_2]; .xn--0ug287dj0o.xn--gd9a; [C1, A4_2]; .xn--qekw60d.xn--gd9a; [A4_2] # .ヶ䒩.ꡪ +.xn--qekw60d.xn--gd9a; .ヶ䒩.ꡪ; [X4_2]; .xn--qekw60d.xn--gd9a; [A4_2]; ; # .ヶ䒩.ꡪ +.xn--0ug287dj0o.xn--gd9a; .‌ヶ䒩.ꡪ; [C1, X4_2]; .xn--0ug287dj0o.xn--gd9a; [C1, A4_2]; ; # .ヶ䒩.ꡪ +xn--qekw60dns9k.xn--gd9a; ︒ヶ䒩.ꡪ; [V6]; xn--qekw60dns9k.xn--gd9a; ; ; # ︒ヶ䒩.ꡪ +xn--0ug287dj0or48o.xn--gd9a; ︒‌ヶ䒩.ꡪ; [C1, V6]; xn--0ug287dj0or48o.xn--gd9a; ; ; # ︒ヶ䒩.ꡪ +xn--qekw60d.xn--gd9a; ヶ䒩.ꡪ; ; xn--qekw60d.xn--gd9a; ; ; # ヶ䒩.ꡪ +ヶ䒩.ꡪ; ; ; xn--qekw60d.xn--gd9a; ; ; # ヶ䒩.ꡪ +‌⒈𤮍.󢓋᩠; ; [C1, P1, V6]; xn--0ug88o7471d.xn--jof45148n; ; xn--tshw462r.xn--jof45148n; [P1, V6] # ⒈𤮍.᩠ +‌1.𤮍.󢓋᩠; ; [C1, P1, V6]; xn--1-rgn.xn--4x6j.xn--jof45148n; ; 1.xn--4x6j.xn--jof45148n; [P1, V6] # 1.𤮍.᩠ +1.xn--4x6j.xn--jof45148n; 1.𤮍.󢓋᩠; [V6]; 1.xn--4x6j.xn--jof45148n; ; ; # 1.𤮍.᩠ +xn--1-rgn.xn--4x6j.xn--jof45148n; ‌1.𤮍.󢓋᩠; [C1, V6]; xn--1-rgn.xn--4x6j.xn--jof45148n; ; ; # 1.𤮍.᩠ +xn--tshw462r.xn--jof45148n; ⒈𤮍.󢓋᩠; [V6]; xn--tshw462r.xn--jof45148n; ; ; # ⒈𤮍.᩠ +xn--0ug88o7471d.xn--jof45148n; ‌⒈𤮍.󢓋᩠; [C1, V6]; xn--0ug88o7471d.xn--jof45148n; ; ; # ⒈𤮍.᩠ +⒈‌𐫓󠀺。᩠񤰵‍; ⒈‌𐫓󠀺.᩠񤰵‍; [B1, C1, C2, P1, V5, V6]; xn--0ug78ol75wzcx4i.xn--jof95xex98m; ; xn--tsh4435fk263g.xn--jofz5294e; [B1, P1, V5, V6] # ⒈𐫓.᩠ +1.‌𐫓󠀺。᩠񤰵‍; 1.‌𐫓󠀺.᩠񤰵‍; [B1, C1, C2, P1, V5, V6]; 1.xn--0ug8853gk263g.xn--jof95xex98m; ; 1.xn--8w9c40377c.xn--jofz5294e; [B1, B3, P1, V5, V6] # 1.𐫓.᩠ +1.xn--8w9c40377c.xn--jofz5294e; 1.𐫓󠀺.᩠񤰵; [B1, B3, V5, V6]; 1.xn--8w9c40377c.xn--jofz5294e; ; ; # 1.𐫓.᩠ +1.xn--0ug8853gk263g.xn--jof95xex98m; 1.‌𐫓󠀺.᩠񤰵‍; [B1, C1, C2, V5, V6]; 1.xn--0ug8853gk263g.xn--jof95xex98m; ; ; # 1.𐫓.᩠ +xn--tsh4435fk263g.xn--jofz5294e; ⒈𐫓󠀺.᩠񤰵; [B1, V5, V6]; xn--tsh4435fk263g.xn--jofz5294e; ; ; # ⒈𐫓.᩠ +xn--0ug78ol75wzcx4i.xn--jof95xex98m; ⒈‌𐫓󠀺.᩠񤰵‍; [B1, C1, C2, V5, V6]; xn--0ug78ol75wzcx4i.xn--jof95xex98m; ; ; # ⒈𐫓.᩠ +𝅵。𝟫𞀈䬺⒈; 𝅵.9𞀈䬺⒈; [P1, V6]; xn--3f1h.xn--9-ecp936non25a; ; ; # .9𞀈䬺⒈ +𝅵。9𞀈䬺1.; 𝅵.9𞀈䬺1.; [P1, V6]; xn--3f1h.xn--91-030c1650n.; ; ; # .9𞀈䬺1. +xn--3f1h.xn--91-030c1650n.; 𝅵.9𞀈䬺1.; [V6]; xn--3f1h.xn--91-030c1650n.; ; ; # .9𞀈䬺1. +xn--3f1h.xn--9-ecp936non25a; 𝅵.9𞀈䬺⒈; [V6]; xn--3f1h.xn--9-ecp936non25a; ; ; # .9𞀈䬺⒈ +򡼺≯。盚ص; 򡼺≯.盚ص; [B5, B6, P1, V6]; xn--hdh30181h.xn--0gb7878c; ; ; # ≯.盚ص +򡼺≯。盚ص; 򡼺≯.盚ص; [B5, B6, P1, V6]; xn--hdh30181h.xn--0gb7878c; ; ; # ≯.盚ص +xn--hdh30181h.xn--0gb7878c; 򡼺≯.盚ص; [B5, B6, V6]; xn--hdh30181h.xn--0gb7878c; ; ; # ≯.盚ص +-񿰭ִ。-󠁊𐢸≯; -񿰭ִ.-󠁊𐢸≯; [B1, P1, V3, V6]; xn----fgc06667m.xn----pgoy615he5y4i; ; ; # -ִ.-≯ +-񿰭ִ。-󠁊𐢸≯; -񿰭ִ.-󠁊𐢸≯; [B1, P1, V3, V6]; xn----fgc06667m.xn----pgoy615he5y4i; ; ; # -ִ.-≯ +xn----fgc06667m.xn----pgoy615he5y4i; -񿰭ִ.-󠁊𐢸≯; [B1, V3, V6]; xn----fgc06667m.xn----pgoy615he5y4i; ; ; # -ִ.-≯ +󿭓᭄‌੍.𐭛񳋔; 󿭓᭄‌੍.𐭛񳋔; [B2, B3, B6, P1, V6]; xn--ybc997f6rd2n772c.xn--409c6100y; ; xn--ybc997fb5881a.xn--409c6100y; [B2, B3, P1, V6] # ᭄੍.𐭛 +󿭓᭄‌੍.𐭛񳋔; ; [B2, B3, B6, P1, V6]; xn--ybc997f6rd2n772c.xn--409c6100y; ; xn--ybc997fb5881a.xn--409c6100y; [B2, B3, P1, V6] # ᭄੍.𐭛 +xn--ybc997fb5881a.xn--409c6100y; 󿭓᭄੍.𐭛񳋔; [B2, B3, V6]; xn--ybc997fb5881a.xn--409c6100y; ; ; # ᭄੍.𐭛 +xn--ybc997f6rd2n772c.xn--409c6100y; 󿭓᭄‌੍.𐭛񳋔; [B2, B3, B6, V6]; xn--ybc997f6rd2n772c.xn--409c6100y; ; ; # ᭄੍.𐭛 +⾇.ٽ𞤴ڻ‍; 舛.ٽ𞤴ڻ‍; [B3, C2]; xn--8c1a.xn--2ib8jv19e6413b; ; xn--8c1a.xn--2ib8jn539l; [] # 舛.ٽ𞤴ڻ +舛.ٽ𞤴ڻ‍; ; [B3, C2]; xn--8c1a.xn--2ib8jv19e6413b; ; xn--8c1a.xn--2ib8jn539l; [] # 舛.ٽ𞤴ڻ +舛.ٽ𞤒ڻ‍; 舛.ٽ𞤴ڻ‍; [B3, C2]; xn--8c1a.xn--2ib8jv19e6413b; ; xn--8c1a.xn--2ib8jn539l; [] # 舛.ٽ𞤴ڻ +xn--8c1a.xn--2ib8jn539l; 舛.ٽ𞤴ڻ; ; xn--8c1a.xn--2ib8jn539l; ; ; # 舛.ٽ𞤴ڻ +舛.ٽ𞤴ڻ; ; ; xn--8c1a.xn--2ib8jn539l; ; ; # 舛.ٽ𞤴ڻ +舛.ٽ𞤒ڻ; 舛.ٽ𞤴ڻ; ; xn--8c1a.xn--2ib8jn539l; ; ; # 舛.ٽ𞤴ڻ +xn--8c1a.xn--2ib8jv19e6413b; 舛.ٽ𞤴ڻ‍; [B3, C2]; xn--8c1a.xn--2ib8jv19e6413b; ; ; # 舛.ٽ𞤴ڻ +⾇.ٽ𞤒ڻ‍; 舛.ٽ𞤴ڻ‍; [B3, C2]; xn--8c1a.xn--2ib8jv19e6413b; ; xn--8c1a.xn--2ib8jn539l; [] # 舛.ٽ𞤴ڻ +4򭆥。ݧ≯; 4򭆥.ݧ≯; [B1, B3, P1, V6]; xn--4-xn17i.xn--rpb459k; ; ; # 4.ݧ≯ +4򭆥。ݧ≯; 4򭆥.ݧ≯; [B1, B3, P1, V6]; xn--4-xn17i.xn--rpb459k; ; ; # 4.ݧ≯ +xn--4-xn17i.xn--rpb459k; 4򭆥.ݧ≯; [B1, B3, V6]; xn--4-xn17i.xn--rpb459k; ; ; # 4.ݧ≯ +𲔏𞫨񺿂硲.ڭ; 𲔏𞫨񺿂硲.ڭ; [B5, P1, V6]; xn--lcz1610fn78gk609a.xn--gkb; ; ; # 硲.ڭ +𲔏𞫨񺿂硲.ڭ; ; [B5, P1, V6]; xn--lcz1610fn78gk609a.xn--gkb; ; ; # 硲.ڭ +xn--lcz1610fn78gk609a.xn--gkb; 𲔏𞫨񺿂硲.ڭ; [B5, V6]; xn--lcz1610fn78gk609a.xn--gkb; ; ; # 硲.ڭ +‌.︈٦Ⴆ℮; ‌.٦Ⴆ℮; [B1, C1, P1, V6]; xn--0ug.xn--fib263c0yn; ; .xn--fib263c0yn; [B1, P1, V6, A4_2] # .٦Ⴆ℮ +‌.︈٦ⴆ℮; ‌.٦ⴆ℮; [B1, C1]; xn--0ug.xn--fib628k4li; ; .xn--fib628k4li; [B1, A4_2] # .٦ⴆ℮ +.xn--fib628k4li; .٦ⴆ℮; [B1, X4_2]; .xn--fib628k4li; [B1, A4_2]; ; # .٦ⴆ℮ +xn--0ug.xn--fib628k4li; ‌.٦ⴆ℮; [B1, C1]; xn--0ug.xn--fib628k4li; ; ; # .٦ⴆ℮ +.xn--fib263c0yn; .٦Ⴆ℮; [B1, V6, X4_2]; .xn--fib263c0yn; [B1, V6, A4_2]; ; # .٦Ⴆ℮ +xn--0ug.xn--fib263c0yn; ‌.٦Ⴆ℮; [B1, C1, V6]; xn--0ug.xn--fib263c0yn; ; ; # .٦Ⴆ℮ +ڣ.്‍Ϟ; ڣ.്‍ϟ; [B1, V5]; xn--5jb.xn--xya149bpvp; ; xn--5jb.xn--xya149b; # ڣ.്ϟ +ڣ.്‍Ϟ; ڣ.്‍ϟ; [B1, V5]; xn--5jb.xn--xya149bpvp; ; xn--5jb.xn--xya149b; # ڣ.്ϟ +ڣ.്‍ϟ; ; [B1, V5]; xn--5jb.xn--xya149bpvp; ; xn--5jb.xn--xya149b; # ڣ.്ϟ +xn--5jb.xn--xya149b; ڣ.്ϟ; [B1, V5]; xn--5jb.xn--xya149b; ; ; # ڣ.്ϟ +xn--5jb.xn--xya149bpvp; ڣ.്‍ϟ; [B1, V5]; xn--5jb.xn--xya149bpvp; ; ; # ڣ.്ϟ +ڣ.്‍ϟ; ڣ.്‍ϟ; [B1, V5]; xn--5jb.xn--xya149bpvp; ; xn--5jb.xn--xya149b; # ڣ.്ϟ +‌𞸇𑘿。أ𐮂-腍; ‌ح𑘿.أ𐮂-腍; [B1, B2, B3, C1]; xn--sgb953kmi8o.xn----qmc5075grs9e; ; xn--sgb4140l.xn----qmc5075grs9e; [B2, B3] # ح𑘿.أ𐮂-腍 +‌𞸇𑘿。أ𐮂-腍; ‌ح𑘿.أ𐮂-腍; [B1, B2, B3, C1]; xn--sgb953kmi8o.xn----qmc5075grs9e; ; xn--sgb4140l.xn----qmc5075grs9e; [B2, B3] # ح𑘿.أ𐮂-腍 +‌ح𑘿。أ𐮂-腍; ‌ح𑘿.أ𐮂-腍; [B1, B2, B3, C1]; xn--sgb953kmi8o.xn----qmc5075grs9e; ; xn--sgb4140l.xn----qmc5075grs9e; [B2, B3] # ح𑘿.أ𐮂-腍 +‌ح𑘿。أ𐮂-腍; ‌ح𑘿.أ𐮂-腍; [B1, B2, B3, C1]; xn--sgb953kmi8o.xn----qmc5075grs9e; ; xn--sgb4140l.xn----qmc5075grs9e; [B2, B3] # ح𑘿.أ𐮂-腍 +xn--sgb4140l.xn----qmc5075grs9e; ح𑘿.أ𐮂-腍; [B2, B3]; xn--sgb4140l.xn----qmc5075grs9e; ; ; # ح𑘿.أ𐮂-腍 +xn--sgb953kmi8o.xn----qmc5075grs9e; ‌ح𑘿.أ𐮂-腍; [B1, B2, B3, C1]; xn--sgb953kmi8o.xn----qmc5075grs9e; ; ; # ح𑘿.أ𐮂-腍 +-򭷙٫纛。𝟛񭤇🄅; -򭷙٫纛.3񭤇🄅; [B1, P1, V3, V6]; xn----vqc8143g0tt4i.xn--3-os1sn476y; ; ; # -٫纛.3🄅 +-򭷙٫纛。3񭤇4,; -򭷙٫纛.3񭤇4,; [B1, P1, V3, V6]; xn----vqc8143g0tt4i.xn--34,-8787l; ; ; # -٫纛.34, +xn----vqc8143g0tt4i.xn--34,-8787l; -򭷙٫纛.3񭤇4,; [B1, P1, V3, V6]; xn----vqc8143g0tt4i.xn--34,-8787l; ; ; # -٫纛.34, +xn----vqc8143g0tt4i.xn--3-os1sn476y; -򭷙٫纛.3񭤇🄅; [B1, V3, V6]; xn----vqc8143g0tt4i.xn--3-os1sn476y; ; ; # -٫纛.3🄅 +🔔.Ⴂߌ்𐋮; 🔔.Ⴂߌ்𐋮; [B1, B5, P1, V6]; xn--nv8h.xn--nsb46r83e8112a; ; ; # 🔔.Ⴂߌ்𐋮 +🔔.Ⴂߌ்𐋮; ; [B1, B5, P1, V6]; xn--nv8h.xn--nsb46r83e8112a; ; ; # 🔔.Ⴂߌ்𐋮 +🔔.ⴂߌ்𐋮; ; [B1, B5]; xn--nv8h.xn--nsb46rvz1b222p; ; ; # 🔔.ⴂߌ்𐋮 +xn--nv8h.xn--nsb46rvz1b222p; 🔔.ⴂߌ்𐋮; [B1, B5]; xn--nv8h.xn--nsb46rvz1b222p; ; ; # 🔔.ⴂߌ்𐋮 +xn--nv8h.xn--nsb46r83e8112a; 🔔.Ⴂߌ்𐋮; [B1, B5, V6]; xn--nv8h.xn--nsb46r83e8112a; ; ; # 🔔.Ⴂߌ்𐋮 +🔔.ⴂߌ்𐋮; 🔔.ⴂߌ்𐋮; [B1, B5]; xn--nv8h.xn--nsb46rvz1b222p; ; ; # 🔔.ⴂߌ்𐋮 +軥ڳ.-𖬵; ; [B1, B5, B6, V3]; xn--mkb5480e.xn----6u5m; ; ; # 軥ڳ.-𖬵 +xn--mkb5480e.xn----6u5m; 軥ڳ.-𖬵; [B1, B5, B6, V3]; xn--mkb5480e.xn----6u5m; ; ; # 軥ڳ.-𖬵 +𐹤ߊڶ.𐨂-; ; [B1, V3, V5]; xn--pkb56cn614d.xn----974i; ; ; # 𐹤ߊڶ.𐨂- +xn--pkb56cn614d.xn----974i; 𐹤ߊڶ.𐨂-; [B1, V3, V5]; xn--pkb56cn614d.xn----974i; ; ; # 𐹤ߊڶ.𐨂- +-󠅱0。៏᷽톇십; -0.៏᷽톇십; [V3, V5]; -0.xn--r4e872ah77nghm; ; ; # -0.៏᷽톇십 +-󠅱0。៏᷽톇십; -0.៏᷽톇십; [V3, V5]; -0.xn--r4e872ah77nghm; ; ; # -0.៏᷽톇십 +-󠅱0。៏᷽톇십; -0.៏᷽톇십; [V3, V5]; -0.xn--r4e872ah77nghm; ; ; # -0.៏᷽톇십 +-󠅱0。៏᷽톇십; -0.៏᷽톇십; [V3, V5]; -0.xn--r4e872ah77nghm; ; ; # -0.៏᷽톇십 +-0.xn--r4e872ah77nghm; -0.៏᷽톇십; [V3, V5]; -0.xn--r4e872ah77nghm; ; ; # -0.៏᷽톇십 +ꡰ︒--。៌靈𐹢񘳮; ꡰ︒--.៌靈𐹢񘳮; [B1, B6, P1, V2, V3, V5, V6]; xn-----bk9hu24z.xn--o4e6836dpxudz0v1c; ; ; # ꡰ︒--.៌靈𐹢 +ꡰ。--。៌靈𐹢񘳮; ꡰ.--.៌靈𐹢񘳮; [B1, P1, V3, V5, V6]; xn--md9a.--.xn--o4e6836dpxudz0v1c; ; ; # ꡰ.--.៌靈𐹢 +xn--md9a.--.xn--o4e6836dpxudz0v1c; ꡰ.--.៌靈𐹢񘳮; [B1, V3, V5, V6]; xn--md9a.--.xn--o4e6836dpxudz0v1c; ; ; # ꡰ.--.៌靈𐹢 +xn-----bk9hu24z.xn--o4e6836dpxudz0v1c; ꡰ︒--.៌靈𐹢񘳮; [B1, B6, V2, V3, V5, V6]; xn-----bk9hu24z.xn--o4e6836dpxudz0v1c; ; ; # ꡰ︒--.៌靈𐹢 +ᅟႿႵრ。୍; ᅟႿႵრ.୍; [P1, V5, V6]; xn--tndt4hvw.xn--9ic; ; ; # ႿႵრ.୍ +ᅟႿႵრ。୍; ᅟႿႵრ.୍; [P1, V5, V6]; xn--tndt4hvw.xn--9ic; ; ; # ႿႵრ.୍ +ᅟⴟⴕრ。୍; ᅟⴟⴕრ.୍; [P1, V5, V6]; xn--1od7wz74eeb.xn--9ic; ; ; # ⴟⴕრ.୍ +ᅟႿႵᲠ。୍; ᅟႿႵრ.୍; [P1, V5, V6]; xn--tndt4hvw.xn--9ic; ; ; # ႿႵრ.୍ +xn--tndt4hvw.xn--9ic; ᅟႿႵრ.୍; [V5, V6]; xn--tndt4hvw.xn--9ic; ; ; # ႿႵრ.୍ +xn--1od7wz74eeb.xn--9ic; ᅟⴟⴕრ.୍; [V5, V6]; xn--1od7wz74eeb.xn--9ic; ; ; # ⴟⴕრ.୍ +ᅟⴟⴕრ。୍; ᅟⴟⴕრ.୍; [P1, V5, V6]; xn--1od7wz74eeb.xn--9ic; ; ; # ⴟⴕრ.୍ +ᅟႿႵᲠ。୍; ᅟႿႵრ.୍; [P1, V5, V6]; xn--tndt4hvw.xn--9ic; ; ; # ႿႵრ.୍ +ᅟႿⴕრ。୍; ᅟႿⴕრ.୍; [P1, V5, V6]; xn--3nd0etsm92g.xn--9ic; ; ; # Ⴟⴕრ.୍ +xn--3nd0etsm92g.xn--9ic; ᅟႿⴕრ.୍; [V5, V6]; xn--3nd0etsm92g.xn--9ic; ; ; # Ⴟⴕრ.୍ +ᅟႿⴕრ。୍; ᅟႿⴕრ.୍; [P1, V5, V6]; xn--3nd0etsm92g.xn--9ic; ; ; # Ⴟⴕრ.୍ +🄃𐹠.٤󠅇; 🄃𐹠.٤; [B1, P1, V6]; xn--7n0d1189a.xn--dib; ; ; # 🄃𐹠.٤ +2,𐹠.٤󠅇; 2,𐹠.٤; [B1, P1, V6]; xn--2,-5g3o.xn--dib; ; ; # 2,𐹠.٤ +xn--2,-5g3o.xn--dib; 2,𐹠.٤; [B1, P1, V6]; xn--2,-5g3o.xn--dib; ; ; # 2,𐹠.٤ +xn--7n0d1189a.xn--dib; 🄃𐹠.٤; [B1, V6]; xn--7n0d1189a.xn--dib; ; ; # 🄃𐹠.٤ +򻲼‌ﱛ.ߒࡈ᯳; 򻲼‌ذٰ.ߒࡈ᯳; [B2, B3, B5, B6, C1, P1, V6]; xn--vgb2kq00fl213y.xn--tsb0vz43c; ; xn--vgb2kp1223g.xn--tsb0vz43c; [B2, B3, B5, B6, P1, V6] # ذٰ.ߒࡈ᯳ +򻲼‌ذٰ.ߒࡈ᯳; ; [B2, B3, B5, B6, C1, P1, V6]; xn--vgb2kq00fl213y.xn--tsb0vz43c; ; xn--vgb2kp1223g.xn--tsb0vz43c; [B2, B3, B5, B6, P1, V6] # ذٰ.ߒࡈ᯳ +xn--vgb2kp1223g.xn--tsb0vz43c; 򻲼ذٰ.ߒࡈ᯳; [B2, B3, B5, B6, V6]; xn--vgb2kp1223g.xn--tsb0vz43c; ; ; # ذٰ.ߒࡈ᯳ +xn--vgb2kq00fl213y.xn--tsb0vz43c; 򻲼‌ذٰ.ߒࡈ᯳; [B2, B3, B5, B6, C1, V6]; xn--vgb2kq00fl213y.xn--tsb0vz43c; ; ; # ذٰ.ߒࡈ᯳ +‍‍𞵪‌。ᡘ𑲭឵; ‍‍𞵪‌.ᡘ𑲭឵; [B1, C1, C2, P1, V6]; xn--0ugba05538b.xn--03e93aq365d; ; xn--l96h.xn--03e93aq365d; [P1, V6] # .ᡘ𑲭 +xn--l96h.xn--03e93aq365d; 𞵪.ᡘ𑲭឵; [V6]; xn--l96h.xn--03e93aq365d; ; ; # .ᡘ𑲭 +xn--0ugba05538b.xn--03e93aq365d; ‍‍𞵪‌.ᡘ𑲭឵; [B1, C1, C2, V6]; xn--0ugba05538b.xn--03e93aq365d; ; ; # .ᡘ𑲭 +𞷻。⚄񗑇𑁿; 𞷻.⚄񗑇𑁿; [B1, P1, V6]; xn--qe7h.xn--c7h2966f7so4a; ; ; # .⚄𑁿 +xn--qe7h.xn--c7h2966f7so4a; 𞷻.⚄񗑇𑁿; [B1, V6]; xn--qe7h.xn--c7h2966f7so4a; ; ; # .⚄𑁿 +꣄≠.𞠨٧; ꣄≠.𞠨٧; [B1, P1, V5, V6]; xn--1chy504c.xn--gib1777v; ; ; # ꣄≠.𞠨٧ +꣄≠.𞠨٧; ꣄≠.𞠨٧; [B1, P1, V5, V6]; xn--1chy504c.xn--gib1777v; ; ; # ꣄≠.𞠨٧ +꣄≠.𞠨٧; ; [B1, P1, V5, V6]; xn--1chy504c.xn--gib1777v; ; ; # ꣄≠.𞠨٧ +꣄≠.𞠨٧; ꣄≠.𞠨٧; [B1, P1, V5, V6]; xn--1chy504c.xn--gib1777v; ; ; # ꣄≠.𞠨٧ +xn--1chy504c.xn--gib1777v; ꣄≠.𞠨٧; [B1, V5, V6]; xn--1chy504c.xn--gib1777v; ; ; # ꣄≠.𞠨٧ +𝟛꣄𝆪。꣪-; 3꣄𝆪.꣪-; [V3, V5]; xn--3-sl4eu679e.xn----xn4e; ; ; # 3꣄𝆪.꣪- +𝟛꣄𝆪。꣪-; 3꣄𝆪.꣪-; [V3, V5]; xn--3-sl4eu679e.xn----xn4e; ; ; # 3꣄𝆪.꣪- +3꣄𝆪。꣪-; 3꣄𝆪.꣪-; [V3, V5]; xn--3-sl4eu679e.xn----xn4e; ; ; # 3꣄𝆪.꣪- +xn--3-sl4eu679e.xn----xn4e; 3꣄𝆪.꣪-; [V3, V5]; xn--3-sl4eu679e.xn----xn4e; ; ; # 3꣄𝆪.꣪- +ݟᮢ်Ⴇ.4; ; [B1, B2, B3, P1, V6]; xn--jpb846bmjw88a.4; ; ; # ݟᮢ်Ⴇ.4 +ݟᮢ်ⴇ.4; ; [B1, B2, B3]; xn--jpb846bjzj7pr.4; ; ; # ݟᮢ်ⴇ.4 +xn--jpb846bjzj7pr.4; ݟᮢ်ⴇ.4; [B1, B2, B3]; xn--jpb846bjzj7pr.4; ; ; # ݟᮢ်ⴇ.4 +xn--jpb846bmjw88a.4; ݟᮢ်Ⴇ.4; [B1, B2, B3, V6]; xn--jpb846bmjw88a.4; ; ; # ݟᮢ်Ⴇ.4 +ᄹ。໊򠯤󠄞; ᄹ.໊򠯤; [P1, V5, V6]; xn--lrd.xn--s8c05302k; ; ; # ᄹ.໊ +ᄹ。໊򠯤󠄞; ᄹ.໊򠯤; [P1, V5, V6]; xn--lrd.xn--s8c05302k; ; ; # ᄹ.໊ +xn--lrd.xn--s8c05302k; ᄹ.໊򠯤; [V5, V6]; xn--lrd.xn--s8c05302k; ; ; # ᄹ.໊ +Ⴆ򻢩.󠆡︉𞤍; Ⴆ򻢩.𞤯; [P1, V6]; xn--end82983m.xn--ne6h; ; ; # Ⴆ.𞤯 +Ⴆ򻢩.󠆡︉𞤍; Ⴆ򻢩.𞤯; [P1, V6]; xn--end82983m.xn--ne6h; ; ; # Ⴆ.𞤯 +ⴆ򻢩.󠆡︉𞤯; ⴆ򻢩.𞤯; [P1, V6]; xn--xkjw3965g.xn--ne6h; ; ; # ⴆ.𞤯 +xn--xkjw3965g.xn--ne6h; ⴆ򻢩.𞤯; [V6]; xn--xkjw3965g.xn--ne6h; ; ; # ⴆ.𞤯 +xn--end82983m.xn--ne6h; Ⴆ򻢩.𞤯; [V6]; xn--end82983m.xn--ne6h; ; ; # Ⴆ.𞤯 +ⴆ򻢩.󠆡︉𞤯; ⴆ򻢩.𞤯; [P1, V6]; xn--xkjw3965g.xn--ne6h; ; ; # ⴆ.𞤯 +ⴆ򻢩.󠆡︉𞤍; ⴆ򻢩.𞤯; [P1, V6]; xn--xkjw3965g.xn--ne6h; ; ; # ⴆ.𞤯 +ⴆ򻢩.󠆡︉𞤍; ⴆ򻢩.𞤯; [P1, V6]; xn--xkjw3965g.xn--ne6h; ; ; # ⴆ.𞤯 +ßࠋ︒ٻ.帼F∬‌; ßࠋ︒ٻ.帼f∫∫‌; [B5, B6, C1, P1, V6]; xn--zca68zj8ac956c.xn--f-sgn48ga6997e; ; xn--ss-k0d31nu121d.xn--f-tcoa9162d; [B5, B6, P1, V6] # ßࠋ︒ٻ.帼f∫∫ +ßࠋ。ٻ.帼F∫∫‌; ßࠋ.ٻ.帼f∫∫‌; [B5, B6, C1]; xn--zca687a.xn--0ib.xn--f-sgn48ga6997e; ; xn--ss-uze.xn--0ib.xn--f-tcoa9162d; [B5, B6] # ßࠋ.ٻ.帼f∫∫ +ßࠋ。ٻ.帼f∫∫‌; ßࠋ.ٻ.帼f∫∫‌; [B5, B6, C1]; xn--zca687a.xn--0ib.xn--f-sgn48ga6997e; ; xn--ss-uze.xn--0ib.xn--f-tcoa9162d; [B5, B6] # ßࠋ.ٻ.帼f∫∫ +SSࠋ。ٻ.帼F∫∫‌; ssࠋ.ٻ.帼f∫∫‌; [B5, B6, C1]; xn--ss-uze.xn--0ib.xn--f-sgn48ga6997e; ; xn--ss-uze.xn--0ib.xn--f-tcoa9162d; [B5, B6] # ssࠋ.ٻ.帼f∫∫ +ssࠋ。ٻ.帼f∫∫‌; ssࠋ.ٻ.帼f∫∫‌; [B5, B6, C1]; xn--ss-uze.xn--0ib.xn--f-sgn48ga6997e; ; xn--ss-uze.xn--0ib.xn--f-tcoa9162d; [B5, B6] # ssࠋ.ٻ.帼f∫∫ +Ssࠋ。ٻ.帼F∫∫‌; ssࠋ.ٻ.帼f∫∫‌; [B5, B6, C1]; xn--ss-uze.xn--0ib.xn--f-sgn48ga6997e; ; xn--ss-uze.xn--0ib.xn--f-tcoa9162d; [B5, B6] # ssࠋ.ٻ.帼f∫∫ +xn--ss-uze.xn--0ib.xn--f-tcoa9162d; ssࠋ.ٻ.帼f∫∫; [B5, B6]; xn--ss-uze.xn--0ib.xn--f-tcoa9162d; ; ; # ssࠋ.ٻ.帼f∫∫ +xn--ss-uze.xn--0ib.xn--f-sgn48ga6997e; ssࠋ.ٻ.帼f∫∫‌; [B5, B6, C1]; xn--ss-uze.xn--0ib.xn--f-sgn48ga6997e; ; ; # ssࠋ.ٻ.帼f∫∫ +xn--zca687a.xn--0ib.xn--f-sgn48ga6997e; ßࠋ.ٻ.帼f∫∫‌; [B5, B6, C1]; xn--zca687a.xn--0ib.xn--f-sgn48ga6997e; ; ; # ßࠋ.ٻ.帼f∫∫ +ßࠋ︒ٻ.帼f∬‌; ßࠋ︒ٻ.帼f∫∫‌; [B5, B6, C1, P1, V6]; xn--zca68zj8ac956c.xn--f-sgn48ga6997e; ; xn--ss-k0d31nu121d.xn--f-tcoa9162d; [B5, B6, P1, V6] # ßࠋ︒ٻ.帼f∫∫ +SSࠋ︒ٻ.帼F∬‌; ssࠋ︒ٻ.帼f∫∫‌; [B5, B6, C1, P1, V6]; xn--ss-k0d31nu121d.xn--f-sgn48ga6997e; ; xn--ss-k0d31nu121d.xn--f-tcoa9162d; [B5, B6, P1, V6] # ssࠋ︒ٻ.帼f∫∫ +ssࠋ︒ٻ.帼f∬‌; ssࠋ︒ٻ.帼f∫∫‌; [B5, B6, C1, P1, V6]; xn--ss-k0d31nu121d.xn--f-sgn48ga6997e; ; xn--ss-k0d31nu121d.xn--f-tcoa9162d; [B5, B6, P1, V6] # ssࠋ︒ٻ.帼f∫∫ +Ssࠋ︒ٻ.帼F∬‌; ssࠋ︒ٻ.帼f∫∫‌; [B5, B6, C1, P1, V6]; xn--ss-k0d31nu121d.xn--f-sgn48ga6997e; ; xn--ss-k0d31nu121d.xn--f-tcoa9162d; [B5, B6, P1, V6] # ssࠋ︒ٻ.帼f∫∫ +xn--ss-k0d31nu121d.xn--f-tcoa9162d; ssࠋ︒ٻ.帼f∫∫; [B5, B6, V6]; xn--ss-k0d31nu121d.xn--f-tcoa9162d; ; ; # ssࠋ︒ٻ.帼f∫∫ +xn--ss-k0d31nu121d.xn--f-sgn48ga6997e; ssࠋ︒ٻ.帼f∫∫‌; [B5, B6, C1, V6]; xn--ss-k0d31nu121d.xn--f-sgn48ga6997e; ; ; # ssࠋ︒ٻ.帼f∫∫ +xn--zca68zj8ac956c.xn--f-sgn48ga6997e; ßࠋ︒ٻ.帼f∫∫‌; [B5, B6, C1, V6]; xn--zca68zj8ac956c.xn--f-sgn48ga6997e; ; ; # ßࠋ︒ٻ.帼f∫∫ +󘪗。𐹴𞨌‍; 󘪗.𐹴𞨌‍; [B1, C2, P1, V6]; xn--8l83e.xn--1ug4105gsxwf; ; xn--8l83e.xn--so0dw168a; [B1, P1, V6] # .𐹴 +󘪗。𐹴𞨌‍; 󘪗.𐹴𞨌‍; [B1, C2, P1, V6]; xn--8l83e.xn--1ug4105gsxwf; ; xn--8l83e.xn--so0dw168a; [B1, P1, V6] # .𐹴 +xn--8l83e.xn--so0dw168a; 󘪗.𐹴𞨌; [B1, V6]; xn--8l83e.xn--so0dw168a; ; ; # .𐹴 +xn--8l83e.xn--1ug4105gsxwf; 󘪗.𐹴𞨌‍; [B1, C2, V6]; xn--8l83e.xn--1ug4105gsxwf; ; ; # .𐹴 +񗛨.򅟢𝟨꣄; 񗛨.򅟢6꣄; [P1, V6]; xn--mi60a.xn--6-sl4es8023c; ; ; # .6꣄ +񗛨.򅟢6꣄; ; [P1, V6]; xn--mi60a.xn--6-sl4es8023c; ; ; # .6꣄ +xn--mi60a.xn--6-sl4es8023c; 񗛨.򅟢6꣄; [V6]; xn--mi60a.xn--6-sl4es8023c; ; ; # .6꣄ +᪲ﶎ。-۹ႱႨ; ᪲مخج.-۹ႱႨ; [B1, P1, V3, V5, V6]; xn--rgbd2e831i.xn----zyc155e9a; ; ; # ᪲مخج.-۹ႱႨ +᪲مخج。-۹ႱႨ; ᪲مخج.-۹ႱႨ; [B1, P1, V3, V5, V6]; xn--rgbd2e831i.xn----zyc155e9a; ; ; # ᪲مخج.-۹ႱႨ +᪲مخج。-۹ⴑⴈ; ᪲مخج.-۹ⴑⴈ; [B1, V3, V5]; xn--rgbd2e831i.xn----zyc3430a9a; ; ; # ᪲مخج.-۹ⴑⴈ +xn--rgbd2e831i.xn----zyc3430a9a; ᪲مخج.-۹ⴑⴈ; [B1, V3, V5]; xn--rgbd2e831i.xn----zyc3430a9a; ; ; # ᪲مخج.-۹ⴑⴈ +xn--rgbd2e831i.xn----zyc155e9a; ᪲مخج.-۹ႱႨ; [B1, V3, V5, V6]; xn--rgbd2e831i.xn----zyc155e9a; ; ; # ᪲مخج.-۹ႱႨ +᪲ﶎ。-۹ⴑⴈ; ᪲مخج.-۹ⴑⴈ; [B1, V3, V5]; xn--rgbd2e831i.xn----zyc3430a9a; ; ; # ᪲مخج.-۹ⴑⴈ +᪲مخج。-۹Ⴑⴈ; ᪲مخج.-۹Ⴑⴈ; [B1, P1, V3, V5, V6]; xn--rgbd2e831i.xn----zyc875efr3a; ; ; # ᪲مخج.-۹Ⴑⴈ +xn--rgbd2e831i.xn----zyc875efr3a; ᪲مخج.-۹Ⴑⴈ; [B1, V3, V5, V6]; xn--rgbd2e831i.xn----zyc875efr3a; ; ; # ᪲مخج.-۹Ⴑⴈ +᪲ﶎ。-۹Ⴑⴈ; ᪲مخج.-۹Ⴑⴈ; [B1, P1, V3, V5, V6]; xn--rgbd2e831i.xn----zyc875efr3a; ; ; # ᪲مخج.-۹Ⴑⴈ +𞤤.-ࢣ︒; 𞤤.-ࢣ︒; [B1, P1, V3, V6]; xn--ce6h.xn----cod7069p; ; ; # 𞤤.-ࢣ︒ +𞤤.-ࢣ。; 𞤤.-ࢣ.; [B1, V3]; xn--ce6h.xn----cod.; ; ; # 𞤤.-ࢣ. +𞤂.-ࢣ。; 𞤤.-ࢣ.; [B1, V3]; xn--ce6h.xn----cod.; ; ; # 𞤤.-ࢣ. +xn--ce6h.xn----cod.; 𞤤.-ࢣ.; [B1, V3]; xn--ce6h.xn----cod.; ; ; # 𞤤.-ࢣ. +𞤂.-ࢣ︒; 𞤤.-ࢣ︒; [B1, P1, V3, V6]; xn--ce6h.xn----cod7069p; ; ; # 𞤤.-ࢣ︒ +xn--ce6h.xn----cod7069p; 𞤤.-ࢣ︒; [B1, V3, V6]; xn--ce6h.xn----cod7069p; ; ; # 𞤤.-ࢣ︒ +‌𐺨.࡙--; ; [B1, C1, P1, V3, V5, V6]; xn--0ug7905g.xn-----h6e; ; xn--9p0d.xn-----h6e; [B1, P1, V3, V5, V6] # 𐺨.࡙-- +xn--9p0d.xn-----h6e; 𐺨.࡙--; [B1, V3, V5, V6]; xn--9p0d.xn-----h6e; ; ; # 𐺨.࡙-- +xn--0ug7905g.xn-----h6e; ‌𐺨.࡙--; [B1, C1, V3, V5, V6]; xn--0ug7905g.xn-----h6e; ; ; # 𐺨.࡙-- +𐋸󮘋Ⴢ.Ⴁ; ; [P1, V6]; xn--6nd5215jr2u0h.xn--8md; ; ; # 𐋸Ⴢ.Ⴁ +𐋸󮘋ⴢ.ⴁ; ; [P1, V6]; xn--qlj1559dr224h.xn--skj; ; ; # 𐋸ⴢ.ⴁ +𐋸󮘋Ⴢ.ⴁ; ; [P1, V6]; xn--6nd5215jr2u0h.xn--skj; ; ; # 𐋸Ⴢ.ⴁ +xn--6nd5215jr2u0h.xn--skj; 𐋸󮘋Ⴢ.ⴁ; [V6]; xn--6nd5215jr2u0h.xn--skj; ; ; # 𐋸Ⴢ.ⴁ +xn--qlj1559dr224h.xn--skj; 𐋸󮘋ⴢ.ⴁ; [V6]; xn--qlj1559dr224h.xn--skj; ; ; # 𐋸ⴢ.ⴁ +xn--6nd5215jr2u0h.xn--8md; 𐋸󮘋Ⴢ.Ⴁ; [V6]; xn--6nd5215jr2u0h.xn--8md; ; ; # 𐋸Ⴢ.Ⴁ +񗑿꠆₄򩞆。𲩧󠒹ς; 񗑿꠆4򩞆.𲩧󠒹ς; [P1, V6]; xn--4-w93ej7463a9io5a.xn--3xa51142bk3f0d; ; xn--4-w93ej7463a9io5a.xn--4xa31142bk3f0d; # ꠆4.ς +񗑿꠆4򩞆。𲩧󠒹ς; 񗑿꠆4򩞆.𲩧󠒹ς; [P1, V6]; xn--4-w93ej7463a9io5a.xn--3xa51142bk3f0d; ; xn--4-w93ej7463a9io5a.xn--4xa31142bk3f0d; # ꠆4.ς +񗑿꠆4򩞆。𲩧󠒹Σ; 񗑿꠆4򩞆.𲩧󠒹σ; [P1, V6]; xn--4-w93ej7463a9io5a.xn--4xa31142bk3f0d; ; ; # ꠆4.σ +񗑿꠆4򩞆。𲩧󠒹σ; 񗑿꠆4򩞆.𲩧󠒹σ; [P1, V6]; xn--4-w93ej7463a9io5a.xn--4xa31142bk3f0d; ; ; # ꠆4.σ +xn--4-w93ej7463a9io5a.xn--4xa31142bk3f0d; 񗑿꠆4򩞆.𲩧󠒹σ; [V6]; xn--4-w93ej7463a9io5a.xn--4xa31142bk3f0d; ; ; # ꠆4.σ +xn--4-w93ej7463a9io5a.xn--3xa51142bk3f0d; 񗑿꠆4򩞆.𲩧󠒹ς; [V6]; xn--4-w93ej7463a9io5a.xn--3xa51142bk3f0d; ; ; # ꠆4.ς +񗑿꠆₄򩞆。𲩧󠒹Σ; 񗑿꠆4򩞆.𲩧󠒹σ; [P1, V6]; xn--4-w93ej7463a9io5a.xn--4xa31142bk3f0d; ; ; # ꠆4.σ +񗑿꠆₄򩞆。𲩧󠒹σ; 񗑿꠆4򩞆.𲩧󠒹σ; [P1, V6]; xn--4-w93ej7463a9io5a.xn--4xa31142bk3f0d; ; ; # ꠆4.σ +󠆀ܣ。ᷴݵ; ܣ.ᷴݵ; [B1, V5]; xn--tnb.xn--5pb136i; ; ; # ܣ.ᷴݵ +xn--tnb.xn--5pb136i; ܣ.ᷴݵ; [B1, V5]; xn--tnb.xn--5pb136i; ; ; # ܣ.ᷴݵ +𐹱ࡂ𝪨。𬼖Ⴑ‍; 𐹱ࡂ𝪨.𬼖Ⴑ‍; [B1, B6, C2, P1, V6]; xn--0vb1535kdb6e.xn--pnd879eqy33c; ; xn--0vb1535kdb6e.xn--pnd93707a; [B1, P1, V6] # 𐹱ࡂ𝪨.𬼖Ⴑ +𐹱ࡂ𝪨。𬼖Ⴑ‍; 𐹱ࡂ𝪨.𬼖Ⴑ‍; [B1, B6, C2, P1, V6]; xn--0vb1535kdb6e.xn--pnd879eqy33c; ; xn--0vb1535kdb6e.xn--pnd93707a; [B1, P1, V6] # 𐹱ࡂ𝪨.𬼖Ⴑ +𐹱ࡂ𝪨。𬼖ⴑ‍; 𐹱ࡂ𝪨.𬼖ⴑ‍; [B1, B6, C2]; xn--0vb1535kdb6e.xn--1ug742c5714c; ; xn--0vb1535kdb6e.xn--8kjz186s; [B1] # 𐹱ࡂ𝪨.𬼖ⴑ +xn--0vb1535kdb6e.xn--8kjz186s; 𐹱ࡂ𝪨.𬼖ⴑ; [B1]; xn--0vb1535kdb6e.xn--8kjz186s; ; ; # 𐹱ࡂ𝪨.𬼖ⴑ +xn--0vb1535kdb6e.xn--1ug742c5714c; 𐹱ࡂ𝪨.𬼖ⴑ‍; [B1, B6, C2]; xn--0vb1535kdb6e.xn--1ug742c5714c; ; ; # 𐹱ࡂ𝪨.𬼖ⴑ +xn--0vb1535kdb6e.xn--pnd93707a; 𐹱ࡂ𝪨.𬼖Ⴑ; [B1, V6]; xn--0vb1535kdb6e.xn--pnd93707a; ; ; # 𐹱ࡂ𝪨.𬼖Ⴑ +xn--0vb1535kdb6e.xn--pnd879eqy33c; 𐹱ࡂ𝪨.𬼖Ⴑ‍; [B1, B6, C2, V6]; xn--0vb1535kdb6e.xn--pnd879eqy33c; ; ; # 𐹱ࡂ𝪨.𬼖Ⴑ +𐹱ࡂ𝪨。𬼖ⴑ‍; 𐹱ࡂ𝪨.𬼖ⴑ‍; [B1, B6, C2]; xn--0vb1535kdb6e.xn--1ug742c5714c; ; xn--0vb1535kdb6e.xn--8kjz186s; [B1] # 𐹱ࡂ𝪨.𬼖ⴑ +᜔𐭪󠙘‍。-𐹴; ᜔𐭪󠙘‍.-𐹴; [B1, C2, P1, V3, V5, V6]; xn--fze807bso0spy14i.xn----c36i; ; xn--fze4126jujt0g.xn----c36i; [B1, P1, V3, V5, V6] # ᜔𐭪.-𐹴 +᜔𐭪󠙘‍。-𐹴; ᜔𐭪󠙘‍.-𐹴; [B1, C2, P1, V3, V5, V6]; xn--fze807bso0spy14i.xn----c36i; ; xn--fze4126jujt0g.xn----c36i; [B1, P1, V3, V5, V6] # ᜔𐭪.-𐹴 +xn--fze4126jujt0g.xn----c36i; ᜔𐭪󠙘.-𐹴; [B1, V3, V5, V6]; xn--fze4126jujt0g.xn----c36i; ; ; # ᜔𐭪.-𐹴 +xn--fze807bso0spy14i.xn----c36i; ᜔𐭪󠙘‍.-𐹴; [B1, C2, V3, V5, V6]; xn--fze807bso0spy14i.xn----c36i; ; ; # ᜔𐭪.-𐹴 +𾢬。ܩ︒쯙𝟧; 𾢬.ܩ︒쯙5; [B2, P1, V6]; xn--t92s.xn--5-p1c0712mm8rb; ; ; # .ܩ︒쯙5 +𾢬。ܩ︒쯙𝟧; 𾢬.ܩ︒쯙5; [B2, P1, V6]; xn--t92s.xn--5-p1c0712mm8rb; ; ; # .ܩ︒쯙5 +𾢬。ܩ。쯙5; 𾢬.ܩ.쯙5; [P1, V6]; xn--t92s.xn--znb.xn--5-y88f; ; ; # .ܩ.쯙5 +𾢬。ܩ。쯙5; 𾢬.ܩ.쯙5; [P1, V6]; xn--t92s.xn--znb.xn--5-y88f; ; ; # .ܩ.쯙5 +xn--t92s.xn--znb.xn--5-y88f; 𾢬.ܩ.쯙5; [V6]; xn--t92s.xn--znb.xn--5-y88f; ; ; # .ܩ.쯙5 +xn--t92s.xn--5-p1c0712mm8rb; 𾢬.ܩ︒쯙5; [B2, V6]; xn--t92s.xn--5-p1c0712mm8rb; ; ; # .ܩ︒쯙5 +𞤟-。ݢ≮뻐; 𞥁-.ݢ≮뻐; [B2, B3, P1, V3, V6]; xn----1j8r.xn--mpb269krv4i; ; ; # 𞥁-.ݢ≮뻐 +𞤟-。ݢ≮뻐; 𞥁-.ݢ≮뻐; [B2, B3, P1, V3, V6]; xn----1j8r.xn--mpb269krv4i; ; ; # 𞥁-.ݢ≮뻐 +𞥁-。ݢ≮뻐; 𞥁-.ݢ≮뻐; [B2, B3, P1, V3, V6]; xn----1j8r.xn--mpb269krv4i; ; ; # 𞥁-.ݢ≮뻐 +𞥁-。ݢ≮뻐; 𞥁-.ݢ≮뻐; [B2, B3, P1, V3, V6]; xn----1j8r.xn--mpb269krv4i; ; ; # 𞥁-.ݢ≮뻐 +xn----1j8r.xn--mpb269krv4i; 𞥁-.ݢ≮뻐; [B2, B3, V3, V6]; xn----1j8r.xn--mpb269krv4i; ; ; # 𞥁-.ݢ≮뻐 +𞥩-򊫠.ࢴ≠; 𞥩-򊫠.ࢴ≠; [B2, B3, P1, V6]; xn----cm8rp3609a.xn--9yb852k; ; ; # -.ࢴ≠ +𞥩-򊫠.ࢴ≠; 𞥩-򊫠.ࢴ≠; [B2, B3, P1, V6]; xn----cm8rp3609a.xn--9yb852k; ; ; # -.ࢴ≠ +𞥩-򊫠.ࢴ≠; ; [B2, B3, P1, V6]; xn----cm8rp3609a.xn--9yb852k; ; ; # -.ࢴ≠ +𞥩-򊫠.ࢴ≠; 𞥩-򊫠.ࢴ≠; [B2, B3, P1, V6]; xn----cm8rp3609a.xn--9yb852k; ; ; # -.ࢴ≠ +xn----cm8rp3609a.xn--9yb852k; 𞥩-򊫠.ࢴ≠; [B2, B3, V6]; xn----cm8rp3609a.xn--9yb852k; ; ; # -.ࢴ≠ +-񅂏ςႼ.١; -񅂏ςႼ.١; [B1, P1, V3, V6]; xn----ymb080hun11i.xn--9hb; ; xn----0mb770hun11i.xn--9hb; # -ςႼ.١ +-񅂏ςႼ.١; ; [B1, P1, V3, V6]; xn----ymb080hun11i.xn--9hb; ; xn----0mb770hun11i.xn--9hb; # -ςႼ.١ +-񅂏ςⴜ.١; ; [B1, P1, V3, V6]; xn----ymb2782aov12f.xn--9hb; ; xn----0mb9682aov12f.xn--9hb; # -ςⴜ.١ +-񅂏ΣႼ.١; -񅂏σႼ.١; [B1, P1, V3, V6]; xn----0mb770hun11i.xn--9hb; ; ; # -σႼ.١ +-񅂏σⴜ.١; ; [B1, P1, V3, V6]; xn----0mb9682aov12f.xn--9hb; ; ; # -σⴜ.١ +-񅂏Σⴜ.١; -񅂏σⴜ.١; [B1, P1, V3, V6]; xn----0mb9682aov12f.xn--9hb; ; ; # -σⴜ.١ +xn----0mb9682aov12f.xn--9hb; -񅂏σⴜ.١; [B1, V3, V6]; xn----0mb9682aov12f.xn--9hb; ; ; # -σⴜ.١ +xn----0mb770hun11i.xn--9hb; -񅂏σႼ.١; [B1, V3, V6]; xn----0mb770hun11i.xn--9hb; ; ; # -σႼ.١ +xn----ymb2782aov12f.xn--9hb; -񅂏ςⴜ.١; [B1, V3, V6]; xn----ymb2782aov12f.xn--9hb; ; ; # -ςⴜ.١ +xn----ymb080hun11i.xn--9hb; -񅂏ςႼ.١; [B1, V3, V6]; xn----ymb080hun11i.xn--9hb; ; ; # -ςႼ.١ +-񅂏ςⴜ.١; -񅂏ςⴜ.١; [B1, P1, V3, V6]; xn----ymb2782aov12f.xn--9hb; ; xn----0mb9682aov12f.xn--9hb; # -ςⴜ.١ +-񅂏ΣႼ.١; -񅂏σႼ.١; [B1, P1, V3, V6]; xn----0mb770hun11i.xn--9hb; ; ; # -σႼ.١ +-񅂏σⴜ.١; -񅂏σⴜ.١; [B1, P1, V3, V6]; xn----0mb9682aov12f.xn--9hb; ; ; # -σⴜ.١ +-񅂏Σⴜ.١; -񅂏σⴜ.١; [B1, P1, V3, V6]; xn----0mb9682aov12f.xn--9hb; ; ; # -σⴜ.١ +៊.‍𝟮𑀿; ៊.‍2𑀿; [C2, V5]; xn--m4e.xn--2-tgnv469h; ; xn--m4e.xn--2-ku7i; [V5] # ៊.2𑀿 +៊.‍2𑀿; ; [C2, V5]; xn--m4e.xn--2-tgnv469h; ; xn--m4e.xn--2-ku7i; [V5] # ៊.2𑀿 +xn--m4e.xn--2-ku7i; ៊.2𑀿; [V5]; xn--m4e.xn--2-ku7i; ; ; # ៊.2𑀿 +xn--m4e.xn--2-tgnv469h; ៊.‍2𑀿; [C2, V5]; xn--m4e.xn--2-tgnv469h; ; ; # ៊.2𑀿 +≯𝟖。᩠𐫓򟇑; ≯8.᩠𐫓򟇑; [B1, P1, V5, V6]; xn--8-ogo.xn--jof5303iv1z5d; ; ; # ≯8.᩠𐫓 +≯𝟖。᩠𐫓򟇑; ≯8.᩠𐫓򟇑; [B1, P1, V5, V6]; xn--8-ogo.xn--jof5303iv1z5d; ; ; # ≯8.᩠𐫓 +≯8。᩠𐫓򟇑; ≯8.᩠𐫓򟇑; [B1, P1, V5, V6]; xn--8-ogo.xn--jof5303iv1z5d; ; ; # ≯8.᩠𐫓 +≯8。᩠𐫓򟇑; ≯8.᩠𐫓򟇑; [B1, P1, V5, V6]; xn--8-ogo.xn--jof5303iv1z5d; ; ; # ≯8.᩠𐫓 +xn--8-ogo.xn--jof5303iv1z5d; ≯8.᩠𐫓򟇑; [B1, V5, V6]; xn--8-ogo.xn--jof5303iv1z5d; ; ; # ≯8.᩠𐫓 +𑲫Ↄ٤。‌; 𑲫Ↄ٤.‌; [B1, C1, P1, V5, V6]; xn--dib999kcy1p.xn--0ug; ; xn--dib999kcy1p.; [B1, P1, V5, V6] # 𑲫Ↄ٤. +𑲫Ↄ٤。‌; 𑲫Ↄ٤.‌; [B1, C1, P1, V5, V6]; xn--dib999kcy1p.xn--0ug; ; xn--dib999kcy1p.; [B1, P1, V5, V6] # 𑲫Ↄ٤. +𑲫ↄ٤。‌; 𑲫ↄ٤.‌; [B1, C1, V5]; xn--dib100l8x1p.xn--0ug; ; xn--dib100l8x1p.; [B1, V5] # 𑲫ↄ٤. +xn--dib100l8x1p.; 𑲫ↄ٤.; [B1, V5]; xn--dib100l8x1p.; ; ; # 𑲫ↄ٤. +xn--dib100l8x1p.xn--0ug; 𑲫ↄ٤.‌; [B1, C1, V5]; xn--dib100l8x1p.xn--0ug; ; ; # 𑲫ↄ٤. +xn--dib999kcy1p.; 𑲫Ↄ٤.; [B1, V5, V6]; xn--dib999kcy1p.; ; ; # 𑲫Ↄ٤. +xn--dib999kcy1p.xn--0ug; 𑲫Ↄ٤.‌; [B1, C1, V5, V6]; xn--dib999kcy1p.xn--0ug; ; ; # 𑲫Ↄ٤. +𑲫ↄ٤。‌; 𑲫ↄ٤.‌; [B1, C1, V5]; xn--dib100l8x1p.xn--0ug; ; xn--dib100l8x1p.; [B1, V5] # 𑲫ↄ٤. +ఀ𝟵‍ﲝ.‍ݐ⒈; ఀ9‍بح.‍ݐ⒈; [B1, C2, P1, V5, V6]; xn--9-1mcp570dl51a.xn--3ob977jmfd; ; xn--9-1mcp570d.xn--3ob470m; [B1, P1, V5, V6] # ఀ9بح.ݐ⒈ +ఀ9‍بح.‍ݐ1.; ; [B1, C2, V5]; xn--9-1mcp570dl51a.xn--1-x3c211q.; ; xn--9-1mcp570d.xn--1-x3c.; [B1, V5] # ఀ9بح.ݐ1. +xn--9-1mcp570d.xn--1-x3c.; ఀ9بح.ݐ1.; [B1, V5]; xn--9-1mcp570d.xn--1-x3c.; ; ; # ఀ9بح.ݐ1. +xn--9-1mcp570dl51a.xn--1-x3c211q.; ఀ9‍بح.‍ݐ1.; [B1, C2, V5]; xn--9-1mcp570dl51a.xn--1-x3c211q.; ; ; # ఀ9بح.ݐ1. +xn--9-1mcp570d.xn--3ob470m; ఀ9بح.ݐ⒈; [B1, V5, V6]; xn--9-1mcp570d.xn--3ob470m; ; ; # ఀ9بح.ݐ⒈ +xn--9-1mcp570dl51a.xn--3ob977jmfd; ఀ9‍بح.‍ݐ⒈; [B1, C2, V5, V6]; xn--9-1mcp570dl51a.xn--3ob977jmfd; ; ; # ఀ9بح.ݐ⒈ +꫶。嬶ß葽; ꫶.嬶ß葽; [V5]; xn--2v9a.xn--zca7637b14za; ; xn--2v9a.xn--ss-q40dp97m; # ꫶.嬶ß葽 +꫶。嬶SS葽; ꫶.嬶ss葽; [V5]; xn--2v9a.xn--ss-q40dp97m; ; ; # ꫶.嬶ss葽 +꫶。嬶ss葽; ꫶.嬶ss葽; [V5]; xn--2v9a.xn--ss-q40dp97m; ; ; # ꫶.嬶ss葽 +꫶。嬶Ss葽; ꫶.嬶ss葽; [V5]; xn--2v9a.xn--ss-q40dp97m; ; ; # ꫶.嬶ss葽 +xn--2v9a.xn--ss-q40dp97m; ꫶.嬶ss葽; [V5]; xn--2v9a.xn--ss-q40dp97m; ; ; # ꫶.嬶ss葽 +xn--2v9a.xn--zca7637b14za; ꫶.嬶ß葽; [V5]; xn--2v9a.xn--zca7637b14za; ; ; # ꫶.嬶ß葽 +𑚶⒈。񞻡𐹺; 𑚶⒈.񞻡𐹺; [B5, B6, P1, V5, V6]; xn--tshz969f.xn--yo0d5914s; ; ; # 𑚶⒈.𐹺 +𑚶1.。񞻡𐹺; 𑚶1..񞻡𐹺; [B5, B6, P1, V5, V6, X4_2]; xn--1-3j0j..xn--yo0d5914s; [B5, B6, P1, V5, V6, A4_2]; ; # 𑚶1..𐹺 +xn--1-3j0j..xn--yo0d5914s; 𑚶1..񞻡𐹺; [B5, B6, V5, V6, X4_2]; xn--1-3j0j..xn--yo0d5914s; [B5, B6, V5, V6, A4_2]; ; # 𑚶1..𐹺 +xn--tshz969f.xn--yo0d5914s; 𑚶⒈.񞻡𐹺; [B5, B6, V5, V6]; xn--tshz969f.xn--yo0d5914s; ; ; # 𑚶⒈.𐹺 +𑜤︒≮.񚕽ט𞾩; 𑜤︒≮.񚕽ט𞾩; [B1, B5, B6, P1, V5, V6]; xn--gdh5267fdzpa.xn--deb0091w5q9u; ; ; # 𑜤︒≮.ט +𑜤︒≮.񚕽ט𞾩; 𑜤︒≮.񚕽ט𞾩; [B1, B5, B6, P1, V5, V6]; xn--gdh5267fdzpa.xn--deb0091w5q9u; ; ; # 𑜤︒≮.ט +𑜤。≮.񚕽ט𞾩; 𑜤.≮.񚕽ט𞾩; [B1, B3, B5, B6, P1, V5, V6]; xn--ci2d.xn--gdh.xn--deb0091w5q9u; ; ; # 𑜤.≮.ט +𑜤。≮.񚕽ט𞾩; 𑜤.≮.񚕽ט𞾩; [B1, B3, B5, B6, P1, V5, V6]; xn--ci2d.xn--gdh.xn--deb0091w5q9u; ; ; # 𑜤.≮.ט +xn--ci2d.xn--gdh.xn--deb0091w5q9u; 𑜤.≮.񚕽ט𞾩; [B1, B3, B5, B6, V5, V6]; xn--ci2d.xn--gdh.xn--deb0091w5q9u; ; ; # 𑜤.≮.ט +xn--gdh5267fdzpa.xn--deb0091w5q9u; 𑜤︒≮.񚕽ט𞾩; [B1, B5, B6, V5, V6]; xn--gdh5267fdzpa.xn--deb0091w5q9u; ; ; # 𑜤︒≮.ט +󠆋؃񏦤.⇁ς򏋈򺇥; ؃񏦤.⇁ς򏋈򺇥; [B1, P1, V6]; xn--lfb04106d.xn--3xa174mxv16m8moq; ; xn--lfb04106d.xn--4xa964mxv16m8moq; # .⇁ς +󠆋؃񏦤.⇁Σ򏋈򺇥; ؃񏦤.⇁σ򏋈򺇥; [B1, P1, V6]; xn--lfb04106d.xn--4xa964mxv16m8moq; ; ; # .⇁σ +󠆋؃񏦤.⇁σ򏋈򺇥; ؃񏦤.⇁σ򏋈򺇥; [B1, P1, V6]; xn--lfb04106d.xn--4xa964mxv16m8moq; ; ; # .⇁σ +xn--lfb04106d.xn--4xa964mxv16m8moq; ؃񏦤.⇁σ򏋈򺇥; [B1, V6]; xn--lfb04106d.xn--4xa964mxv16m8moq; ; ; # .⇁σ +xn--lfb04106d.xn--3xa174mxv16m8moq; ؃񏦤.⇁ς򏋈򺇥; [B1, V6]; xn--lfb04106d.xn--3xa174mxv16m8moq; ; ; # .⇁ς +ς𑐽𵢈𑜫。𞬩‌𐫄; ς𑐽𵢈𑜫.𞬩‌𐫄; [C1, P1, V6]; xn--3xa4260lk3b8z15g.xn--0ug4653g2xzf; ; xn--4xa2260lk3b8z15g.xn--tw9ct349a; [P1, V6] # ς𑐽𑜫.𐫄 +ς𑐽𵢈𑜫。𞬩‌𐫄; ς𑐽𵢈𑜫.𞬩‌𐫄; [C1, P1, V6]; xn--3xa4260lk3b8z15g.xn--0ug4653g2xzf; ; xn--4xa2260lk3b8z15g.xn--tw9ct349a; [P1, V6] # ς𑐽𑜫.𐫄 +Σ𑐽𵢈𑜫。𞬩‌𐫄; σ𑐽𵢈𑜫.𞬩‌𐫄; [C1, P1, V6]; xn--4xa2260lk3b8z15g.xn--0ug4653g2xzf; ; xn--4xa2260lk3b8z15g.xn--tw9ct349a; [P1, V6] # σ𑐽𑜫.𐫄 +σ𑐽𵢈𑜫。𞬩‌𐫄; σ𑐽𵢈𑜫.𞬩‌𐫄; [C1, P1, V6]; xn--4xa2260lk3b8z15g.xn--0ug4653g2xzf; ; xn--4xa2260lk3b8z15g.xn--tw9ct349a; [P1, V6] # σ𑐽𑜫.𐫄 +xn--4xa2260lk3b8z15g.xn--tw9ct349a; σ𑐽𵢈𑜫.𞬩𐫄; [V6]; xn--4xa2260lk3b8z15g.xn--tw9ct349a; ; ; # σ𑐽𑜫.𐫄 +xn--4xa2260lk3b8z15g.xn--0ug4653g2xzf; σ𑐽𵢈𑜫.𞬩‌𐫄; [C1, V6]; xn--4xa2260lk3b8z15g.xn--0ug4653g2xzf; ; ; # σ𑐽𑜫.𐫄 +xn--3xa4260lk3b8z15g.xn--0ug4653g2xzf; ς𑐽𵢈𑜫.𞬩‌𐫄; [C1, V6]; xn--3xa4260lk3b8z15g.xn--0ug4653g2xzf; ; ; # ς𑐽𑜫.𐫄 +Σ𑐽𵢈𑜫。𞬩‌𐫄; σ𑐽𵢈𑜫.𞬩‌𐫄; [C1, P1, V6]; xn--4xa2260lk3b8z15g.xn--0ug4653g2xzf; ; xn--4xa2260lk3b8z15g.xn--tw9ct349a; [P1, V6] # σ𑐽𑜫.𐫄 +σ𑐽𵢈𑜫。𞬩‌𐫄; σ𑐽𵢈𑜫.𞬩‌𐫄; [C1, P1, V6]; xn--4xa2260lk3b8z15g.xn--0ug4653g2xzf; ; xn--4xa2260lk3b8z15g.xn--tw9ct349a; [P1, V6] # σ𑐽𑜫.𐫄 +-򵏽。-ﱌݛ; -򵏽.-نحݛ; [B1, P1, V3, V6]; xn----o452j.xn----cnc8e38c; ; ; # -.-نحݛ +-򵏽。-نحݛ; -򵏽.-نحݛ; [B1, P1, V3, V6]; xn----o452j.xn----cnc8e38c; ; ; # -.-نحݛ +xn----o452j.xn----cnc8e38c; -򵏽.-نحݛ; [B1, V3, V6]; xn----o452j.xn----cnc8e38c; ; ; # -.-نحݛ +⺢򇺅𝟤。‍🚷; ⺢򇺅2.‍🚷; [C2, P1, V6]; xn--2-4jtr4282f.xn--1ugz946p; ; xn--2-4jtr4282f.xn--m78h; [P1, V6] # ⺢2.🚷 +⺢򇺅2。‍🚷; ⺢򇺅2.‍🚷; [C2, P1, V6]; xn--2-4jtr4282f.xn--1ugz946p; ; xn--2-4jtr4282f.xn--m78h; [P1, V6] # ⺢2.🚷 +xn--2-4jtr4282f.xn--m78h; ⺢򇺅2.🚷; [V6]; xn--2-4jtr4282f.xn--m78h; ; ; # ⺢2.🚷 +xn--2-4jtr4282f.xn--1ugz946p; ⺢򇺅2.‍🚷; [C2, V6]; xn--2-4jtr4282f.xn--1ugz946p; ; ; # ⺢2.🚷 +೸‍ⷾ𐹲。򤐶; ೸‍ⷾ𐹲.򤐶; [B5, B6, C2, P1, V6]; xn--hvc488g69j402t.xn--3e36c; ; xn--hvc220of37m.xn--3e36c; [B5, B6, P1, V6] # ⷾ𐹲. +೸‍ⷾ𐹲。򤐶; ೸‍ⷾ𐹲.򤐶; [B5, B6, C2, P1, V6]; xn--hvc488g69j402t.xn--3e36c; ; xn--hvc220of37m.xn--3e36c; [B5, B6, P1, V6] # ⷾ𐹲. +xn--hvc220of37m.xn--3e36c; ೸ⷾ𐹲.򤐶; [B5, B6, V6]; xn--hvc220of37m.xn--3e36c; ; ; # ⷾ𐹲. +xn--hvc488g69j402t.xn--3e36c; ೸‍ⷾ𐹲.򤐶; [B5, B6, C2, V6]; xn--hvc488g69j402t.xn--3e36c; ; ; # ⷾ𐹲. +𐹢.Ⴍ₉⁸; 𐹢.Ⴍ98; [B1, P1, V6]; xn--9n0d.xn--98-7ek; ; ; # 𐹢.Ⴍ98 +𐹢.Ⴍ98; ; [B1, P1, V6]; xn--9n0d.xn--98-7ek; ; ; # 𐹢.Ⴍ98 +𐹢.ⴍ98; ; [B1]; xn--9n0d.xn--98-u61a; ; ; # 𐹢.ⴍ98 +xn--9n0d.xn--98-u61a; 𐹢.ⴍ98; [B1]; xn--9n0d.xn--98-u61a; ; ; # 𐹢.ⴍ98 +xn--9n0d.xn--98-7ek; 𐹢.Ⴍ98; [B1, V6]; xn--9n0d.xn--98-7ek; ; ; # 𐹢.Ⴍ98 +𐹢.ⴍ₉⁸; 𐹢.ⴍ98; [B1]; xn--9n0d.xn--98-u61a; ; ; # 𐹢.ⴍ98 +‌͏。ß࣢⒚≯; ‌.ß࣢⒚≯; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--zca612bx9vo5b; ; .xn--ss-9if872xjjc; [B5, B6, P1, V6, A4_2] # .ß⒚≯ +‌͏。ß࣢⒚≯; ‌.ß࣢⒚≯; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--zca612bx9vo5b; ; .xn--ss-9if872xjjc; [B5, B6, P1, V6, A4_2] # .ß⒚≯ +‌͏。ß࣢19.≯; ‌.ß࣢19.≯; [B1, B5, C1, P1, V6]; xn--0ug.xn--19-fia813f.xn--hdh; ; .xn--ss19-w0i.xn--hdh; [B1, B5, P1, V6, A4_2] # .ß19.≯ +‌͏。ß࣢19.≯; ‌.ß࣢19.≯; [B1, B5, C1, P1, V6]; xn--0ug.xn--19-fia813f.xn--hdh; ; .xn--ss19-w0i.xn--hdh; [B1, B5, P1, V6, A4_2] # .ß19.≯ +‌͏。SS࣢19.≯; ‌.ss࣢19.≯; [B1, B5, C1, P1, V6]; xn--0ug.xn--ss19-w0i.xn--hdh; ; .xn--ss19-w0i.xn--hdh; [B1, B5, P1, V6, A4_2] # .ss19.≯ +‌͏。SS࣢19.≯; ‌.ss࣢19.≯; [B1, B5, C1, P1, V6]; xn--0ug.xn--ss19-w0i.xn--hdh; ; .xn--ss19-w0i.xn--hdh; [B1, B5, P1, V6, A4_2] # .ss19.≯ +‌͏。ss࣢19.≯; ‌.ss࣢19.≯; [B1, B5, C1, P1, V6]; xn--0ug.xn--ss19-w0i.xn--hdh; ; .xn--ss19-w0i.xn--hdh; [B1, B5, P1, V6, A4_2] # .ss19.≯ +‌͏。ss࣢19.≯; ‌.ss࣢19.≯; [B1, B5, C1, P1, V6]; xn--0ug.xn--ss19-w0i.xn--hdh; ; .xn--ss19-w0i.xn--hdh; [B1, B5, P1, V6, A4_2] # .ss19.≯ +‌͏。Ss࣢19.≯; ‌.ss࣢19.≯; [B1, B5, C1, P1, V6]; xn--0ug.xn--ss19-w0i.xn--hdh; ; .xn--ss19-w0i.xn--hdh; [B1, B5, P1, V6, A4_2] # .ss19.≯ +‌͏。Ss࣢19.≯; ‌.ss࣢19.≯; [B1, B5, C1, P1, V6]; xn--0ug.xn--ss19-w0i.xn--hdh; ; .xn--ss19-w0i.xn--hdh; [B1, B5, P1, V6, A4_2] # .ss19.≯ +.xn--ss19-w0i.xn--hdh; .ss࣢19.≯; [B1, B5, V6, X4_2]; .xn--ss19-w0i.xn--hdh; [B1, B5, V6, A4_2]; ; # .ss19.≯ +xn--0ug.xn--ss19-w0i.xn--hdh; ‌.ss࣢19.≯; [B1, B5, C1, V6]; xn--0ug.xn--ss19-w0i.xn--hdh; ; ; # .ss19.≯ +xn--0ug.xn--19-fia813f.xn--hdh; ‌.ß࣢19.≯; [B1, B5, C1, V6]; xn--0ug.xn--19-fia813f.xn--hdh; ; ; # .ß19.≯ +‌͏。SS࣢⒚≯; ‌.ss࣢⒚≯; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--ss-9if872xjjc; ; .xn--ss-9if872xjjc; [B5, B6, P1, V6, A4_2] # .ss⒚≯ +‌͏。SS࣢⒚≯; ‌.ss࣢⒚≯; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--ss-9if872xjjc; ; .xn--ss-9if872xjjc; [B5, B6, P1, V6, A4_2] # .ss⒚≯ +‌͏。ss࣢⒚≯; ‌.ss࣢⒚≯; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--ss-9if872xjjc; ; .xn--ss-9if872xjjc; [B5, B6, P1, V6, A4_2] # .ss⒚≯ +‌͏。ss࣢⒚≯; ‌.ss࣢⒚≯; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--ss-9if872xjjc; ; .xn--ss-9if872xjjc; [B5, B6, P1, V6, A4_2] # .ss⒚≯ +‌͏。Ss࣢⒚≯; ‌.ss࣢⒚≯; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--ss-9if872xjjc; ; .xn--ss-9if872xjjc; [B5, B6, P1, V6, A4_2] # .ss⒚≯ +‌͏。Ss࣢⒚≯; ‌.ss࣢⒚≯; [B1, B5, B6, C1, P1, V6]; xn--0ug.xn--ss-9if872xjjc; ; .xn--ss-9if872xjjc; [B5, B6, P1, V6, A4_2] # .ss⒚≯ +.xn--ss-9if872xjjc; .ss࣢⒚≯; [B5, B6, V6, X4_2]; .xn--ss-9if872xjjc; [B5, B6, V6, A4_2]; ; # .ss⒚≯ +xn--0ug.xn--ss-9if872xjjc; ‌.ss࣢⒚≯; [B1, B5, B6, C1, V6]; xn--0ug.xn--ss-9if872xjjc; ; ; # .ss⒚≯ +xn--0ug.xn--zca612bx9vo5b; ‌.ß࣢⒚≯; [B1, B5, B6, C1, V6]; xn--0ug.xn--zca612bx9vo5b; ; ; # .ß⒚≯ +‌𞥍ᡌ.𣃔; ‌𞥍ᡌ.𣃔; [B1, C1, P1, V6]; xn--c8e180bqz13b.xn--od1j; ; xn--c8e5919u.xn--od1j; [B2, B3, P1, V6] # ᡌ.𣃔 +‌𞥍ᡌ.𣃔; ; [B1, C1, P1, V6]; xn--c8e180bqz13b.xn--od1j; ; xn--c8e5919u.xn--od1j; [B2, B3, P1, V6] # ᡌ.𣃔 +xn--c8e5919u.xn--od1j; 𞥍ᡌ.𣃔; [B2, B3, V6]; xn--c8e5919u.xn--od1j; ; ; # ᡌ.𣃔 +xn--c8e180bqz13b.xn--od1j; ‌𞥍ᡌ.𣃔; [B1, C1, V6]; xn--c8e180bqz13b.xn--od1j; ; ; # ᡌ.𣃔 +ߐ򜬝-񡢬。ྠႻ𞷏𝆬; ߐ򜬝-񡢬.ྠႻ𞷏𝆬; [B1, B2, B3, P1, V5, V6]; xn----8bd11730jefvw.xn--wfd08cd265hgsxa; ; ; # ߐ-.ྠႻ𝆬 +ߐ򜬝-񡢬。ྠⴛ𞷏𝆬; ߐ򜬝-񡢬.ྠⴛ𞷏𝆬; [B1, B2, B3, P1, V5, V6]; xn----8bd11730jefvw.xn--wfd802mpm20agsxa; ; ; # ߐ-.ྠⴛ𝆬 +xn----8bd11730jefvw.xn--wfd802mpm20agsxa; ߐ򜬝-񡢬.ྠⴛ𞷏𝆬; [B1, B2, B3, V5, V6]; xn----8bd11730jefvw.xn--wfd802mpm20agsxa; ; ; # ߐ-.ྠⴛ𝆬 +xn----8bd11730jefvw.xn--wfd08cd265hgsxa; ߐ򜬝-񡢬.ྠႻ𞷏𝆬; [B1, B2, B3, V5, V6]; xn----8bd11730jefvw.xn--wfd08cd265hgsxa; ; ; # ߐ-.ྠႻ𝆬 +𝨥。⫟𑈾; 𝨥.⫟𑈾; [V5]; xn--n82h.xn--63iw010f; ; ; # 𝨥.⫟𑈾 +xn--n82h.xn--63iw010f; 𝨥.⫟𑈾; [V5]; xn--n82h.xn--63iw010f; ; ; # 𝨥.⫟𑈾 +⾛ݓ.Ⴕ𞠬؄‍; 走ݓ.Ⴕ𞠬؄‍; [B5, B6, C2, P1, V6]; xn--6ob9779d.xn--mfb785czmm0y85b; ; xn--6ob9779d.xn--mfb785ck569a; [B5, B6, P1, V6] # 走ݓ.Ⴕ𞠬 +走ݓ.Ⴕ𞠬؄‍; ; [B5, B6, C2, P1, V6]; xn--6ob9779d.xn--mfb785czmm0y85b; ; xn--6ob9779d.xn--mfb785ck569a; [B5, B6, P1, V6] # 走ݓ.Ⴕ𞠬 +走ݓ.ⴕ𞠬؄‍; ; [B5, B6, C2, P1, V6]; xn--6ob9779d.xn--mfb444k5gjt754b; ; xn--6ob9779d.xn--mfb511rxu80a; [B5, B6, P1, V6] # 走ݓ.ⴕ𞠬 +xn--6ob9779d.xn--mfb511rxu80a; 走ݓ.ⴕ𞠬؄; [B5, B6, V6]; xn--6ob9779d.xn--mfb511rxu80a; ; ; # 走ݓ.ⴕ𞠬 +xn--6ob9779d.xn--mfb444k5gjt754b; 走ݓ.ⴕ𞠬؄‍; [B5, B6, C2, V6]; xn--6ob9779d.xn--mfb444k5gjt754b; ; ; # 走ݓ.ⴕ𞠬 +xn--6ob9779d.xn--mfb785ck569a; 走ݓ.Ⴕ𞠬؄; [B5, B6, V6]; xn--6ob9779d.xn--mfb785ck569a; ; ; # 走ݓ.Ⴕ𞠬 +xn--6ob9779d.xn--mfb785czmm0y85b; 走ݓ.Ⴕ𞠬؄‍; [B5, B6, C2, V6]; xn--6ob9779d.xn--mfb785czmm0y85b; ; ; # 走ݓ.Ⴕ𞠬 +⾛ݓ.ⴕ𞠬؄‍; 走ݓ.ⴕ𞠬؄‍; [B5, B6, C2, P1, V6]; xn--6ob9779d.xn--mfb444k5gjt754b; ; xn--6ob9779d.xn--mfb511rxu80a; [B5, B6, P1, V6] # 走ݓ.ⴕ𞠬 +-ᢗ‌🄄.𑜢; ; [C1, P1, V3, V5, V6]; xn----pck312bx563c.xn--9h2d; ; xn----pck1820x.xn--9h2d; [P1, V3, V5, V6] # -ᢗ🄄.𑜢 +-ᢗ‌3,.𑜢; ; [C1, P1, V3, V5, V6]; xn---3,-3eu051c.xn--9h2d; ; xn---3,-3eu.xn--9h2d; [P1, V3, V5, V6] # -ᢗ3,.𑜢 +xn---3,-3eu.xn--9h2d; -ᢗ3,.𑜢; [P1, V3, V5, V6]; xn---3,-3eu.xn--9h2d; ; ; # -ᢗ3,.𑜢 +xn---3,-3eu051c.xn--9h2d; -ᢗ‌3,.𑜢; [C1, P1, V3, V5, V6]; xn---3,-3eu051c.xn--9h2d; ; ; # -ᢗ3,.𑜢 +xn----pck1820x.xn--9h2d; -ᢗ🄄.𑜢; [V3, V5, V6]; xn----pck1820x.xn--9h2d; ; ; # -ᢗ🄄.𑜢 +xn----pck312bx563c.xn--9h2d; -ᢗ‌🄄.𑜢; [C1, V3, V5, V6]; xn----pck312bx563c.xn--9h2d; ; ; # -ᢗ🄄.𑜢 +≠𐸁𹏁‌.Ⴚ򳄠; ; [B1, C1, P1, V6]; xn--0ug83gn618a21ov.xn--ynd49496l; ; xn--1ch2293gv3nr.xn--ynd49496l; [B1, P1, V6] # ≠.Ⴚ +≠𐸁𹏁‌.Ⴚ򳄠; ≠𐸁𹏁‌.Ⴚ򳄠; [B1, C1, P1, V6]; xn--0ug83gn618a21ov.xn--ynd49496l; ; xn--1ch2293gv3nr.xn--ynd49496l; [B1, P1, V6] # ≠.Ⴚ +≠𐸁𹏁‌.ⴚ򳄠; ≠𐸁𹏁‌.ⴚ򳄠; [B1, C1, P1, V6]; xn--0ug83gn618a21ov.xn--ilj23531g; ; xn--1ch2293gv3nr.xn--ilj23531g; [B1, P1, V6] # ≠.ⴚ +≠𐸁𹏁‌.ⴚ򳄠; ; [B1, C1, P1, V6]; xn--0ug83gn618a21ov.xn--ilj23531g; ; xn--1ch2293gv3nr.xn--ilj23531g; [B1, P1, V6] # ≠.ⴚ +xn--1ch2293gv3nr.xn--ilj23531g; ≠𐸁𹏁.ⴚ򳄠; [B1, V6]; xn--1ch2293gv3nr.xn--ilj23531g; ; ; # ≠.ⴚ +xn--0ug83gn618a21ov.xn--ilj23531g; ≠𐸁𹏁‌.ⴚ򳄠; [B1, C1, V6]; xn--0ug83gn618a21ov.xn--ilj23531g; ; ; # ≠.ⴚ +xn--1ch2293gv3nr.xn--ynd49496l; ≠𐸁𹏁.Ⴚ򳄠; [B1, V6]; xn--1ch2293gv3nr.xn--ynd49496l; ; ; # ≠.Ⴚ +xn--0ug83gn618a21ov.xn--ynd49496l; ≠𐸁𹏁‌.Ⴚ򳄠; [B1, C1, V6]; xn--0ug83gn618a21ov.xn--ynd49496l; ; ; # ≠.Ⴚ +٩。󠇀𑇊; ٩.𑇊; [B1, B3, B6, V5]; xn--iib.xn--6d1d; ; ; # ٩.𑇊 +٩。󠇀𑇊; ٩.𑇊; [B1, B3, B6, V5]; xn--iib.xn--6d1d; ; ; # ٩.𑇊 +xn--iib.xn--6d1d; ٩.𑇊; [B1, B3, B6, V5]; xn--iib.xn--6d1d; ; ; # ٩.𑇊 +ႆ𞶀≯⒍。-; ႆ𞶀≯⒍.-; [B1, P1, V3, V5, V6]; xn--hmd482gqqb8730g.-; ; ; # ႆ≯⒍.- +ႆ𞶀≯⒍。-; ႆ𞶀≯⒍.-; [B1, P1, V3, V5, V6]; xn--hmd482gqqb8730g.-; ; ; # ႆ≯⒍.- +ႆ𞶀≯6.。-; ႆ𞶀≯6..-; [B1, P1, V3, V5, V6, X4_2]; xn--6-oyg968k7h74b..-; [B1, P1, V3, V5, V6, A4_2]; ; # ႆ≯6..- +ႆ𞶀≯6.。-; ႆ𞶀≯6..-; [B1, P1, V3, V5, V6, X4_2]; xn--6-oyg968k7h74b..-; [B1, P1, V3, V5, V6, A4_2]; ; # ႆ≯6..- +xn--6-oyg968k7h74b..-; ႆ𞶀≯6..-; [B1, V3, V5, V6, X4_2]; xn--6-oyg968k7h74b..-; [B1, V3, V5, V6, A4_2]; ; # ႆ≯6..- +xn--hmd482gqqb8730g.-; ႆ𞶀≯⒍.-; [B1, V3, V5, V6]; xn--hmd482gqqb8730g.-; ; ; # ႆ≯⒍.- +឴.쮇-; ; [P1, V3, V5, V6]; xn--z3e.xn----938f; ; ; # .쮇- +឴.쮇-; ឴.쮇-; [P1, V3, V5, V6]; xn--z3e.xn----938f; ; ; # .쮇- +xn--z3e.xn----938f; ឴.쮇-; [V3, V5, V6]; xn--z3e.xn----938f; ; ; # .쮇- +‌𑓂。⒈-􀪛; ‌𑓂.⒈-􀪛; [C1, P1, V6]; xn--0ugy057g.xn----dcp29674o; ; xn--wz1d.xn----dcp29674o; [P1, V5, V6] # 𑓂.⒈- +‌𑓂。1.-􀪛; ‌𑓂.1.-􀪛; [C1, P1, V3, V6]; xn--0ugy057g.1.xn----rg03o; ; xn--wz1d.1.xn----rg03o; [P1, V3, V5, V6] # 𑓂.1.- +xn--wz1d.1.xn----rg03o; 𑓂.1.-􀪛; [V3, V5, V6]; xn--wz1d.1.xn----rg03o; ; ; # 𑓂.1.- +xn--0ugy057g.1.xn----rg03o; ‌𑓂.1.-􀪛; [C1, V3, V6]; xn--0ugy057g.1.xn----rg03o; ; ; # 𑓂.1.- +xn--wz1d.xn----dcp29674o; 𑓂.⒈-􀪛; [V5, V6]; xn--wz1d.xn----dcp29674o; ; ; # 𑓂.⒈- +xn--0ugy057g.xn----dcp29674o; ‌𑓂.⒈-􀪛; [C1, V6]; xn--0ugy057g.xn----dcp29674o; ; ; # 𑓂.⒈- +⒈ﺮ‌。⃩🖞‌𖬴; ⒈ر‌.⃩🖞‌𖬴; [B1, C1, P1, V5, V6]; xn--wgb253kmfd.xn--0ugz6a8040fty5d; ; xn--wgb746m.xn--c1g6021kg18c; [B1, P1, V5, V6] # ⒈ر.⃩🖞𖬴 +1.ر‌。⃩🖞‌𖬴; 1.ر‌.⃩🖞‌𖬴; [B1, B3, C1, V5]; 1.xn--wgb253k.xn--0ugz6a8040fty5d; ; 1.xn--wgb.xn--c1g6021kg18c; [B1, V5] # 1.ر.⃩🖞𖬴 +1.xn--wgb.xn--c1g6021kg18c; 1.ر.⃩🖞𖬴; [B1, V5]; 1.xn--wgb.xn--c1g6021kg18c; ; ; # 1.ر.⃩🖞𖬴 +1.xn--wgb253k.xn--0ugz6a8040fty5d; 1.ر‌.⃩🖞‌𖬴; [B1, B3, C1, V5]; 1.xn--wgb253k.xn--0ugz6a8040fty5d; ; ; # 1.ر.⃩🖞𖬴 +xn--wgb746m.xn--c1g6021kg18c; ⒈ر.⃩🖞𖬴; [B1, V5, V6]; xn--wgb746m.xn--c1g6021kg18c; ; ; # ⒈ر.⃩🖞𖬴 +xn--wgb253kmfd.xn--0ugz6a8040fty5d; ⒈ر‌.⃩🖞‌𖬴; [B1, C1, V5, V6]; xn--wgb253kmfd.xn--0ugz6a8040fty5d; ; ; # ⒈ر.⃩🖞𖬴 +󌭇。𝟐ᮨߔ; 󌭇.2ᮨߔ; [B1, P1, V6]; xn--xm89d.xn--2-icd143m; ; ; # .2ᮨߔ +󌭇。2ᮨߔ; 󌭇.2ᮨߔ; [B1, P1, V6]; xn--xm89d.xn--2-icd143m; ; ; # .2ᮨߔ +xn--xm89d.xn--2-icd143m; 󌭇.2ᮨߔ; [B1, V6]; xn--xm89d.xn--2-icd143m; ; ; # .2ᮨߔ +ﶏ򫳺.ς‍𐹷; مخم򫳺.ς‍𐹷; [B2, B3, B5, B6, C2, P1, V6]; xn--tgb9bb64691z.xn--3xa006lrp7n; ; xn--tgb9bb64691z.xn--4xa6667k; [B2, B3, B5, B6, P1, V6] # مخم.ς𐹷 +مخم򫳺.ς‍𐹷; ; [B2, B3, B5, B6, C2, P1, V6]; xn--tgb9bb64691z.xn--3xa006lrp7n; ; xn--tgb9bb64691z.xn--4xa6667k; [B2, B3, B5, B6, P1, V6] # مخم.ς𐹷 +مخم򫳺.Σ‍𐹷; مخم򫳺.σ‍𐹷; [B2, B3, B5, B6, C2, P1, V6]; xn--tgb9bb64691z.xn--4xa895lrp7n; ; xn--tgb9bb64691z.xn--4xa6667k; [B2, B3, B5, B6, P1, V6] # مخم.σ𐹷 +مخم򫳺.σ‍𐹷; ; [B2, B3, B5, B6, C2, P1, V6]; xn--tgb9bb64691z.xn--4xa895lrp7n; ; xn--tgb9bb64691z.xn--4xa6667k; [B2, B3, B5, B6, P1, V6] # مخم.σ𐹷 +xn--tgb9bb64691z.xn--4xa6667k; مخم򫳺.σ𐹷; [B2, B3, B5, B6, V6]; xn--tgb9bb64691z.xn--4xa6667k; ; ; # مخم.σ𐹷 +xn--tgb9bb64691z.xn--4xa895lrp7n; مخم򫳺.σ‍𐹷; [B2, B3, B5, B6, C2, V6]; xn--tgb9bb64691z.xn--4xa895lrp7n; ; ; # مخم.σ𐹷 +xn--tgb9bb64691z.xn--3xa006lrp7n; مخم򫳺.ς‍𐹷; [B2, B3, B5, B6, C2, V6]; xn--tgb9bb64691z.xn--3xa006lrp7n; ; ; # مخم.ς𐹷 +ﶏ򫳺.Σ‍𐹷; مخم򫳺.σ‍𐹷; [B2, B3, B5, B6, C2, P1, V6]; xn--tgb9bb64691z.xn--4xa895lrp7n; ; xn--tgb9bb64691z.xn--4xa6667k; [B2, B3, B5, B6, P1, V6] # مخم.σ𐹷 +ﶏ򫳺.σ‍𐹷; مخم򫳺.σ‍𐹷; [B2, B3, B5, B6, C2, P1, V6]; xn--tgb9bb64691z.xn--4xa895lrp7n; ; xn--tgb9bb64691z.xn--4xa6667k; [B2, B3, B5, B6, P1, V6] # مخم.σ𐹷 +⒎ہ؅。꫶۵𐇽; ⒎ہ؅.꫶۵𐇽; [B1, P1, V5, V6]; xn--nfb98ai25e.xn--imb3805fxt8b; ; ; # ⒎ہ.꫶۵𐇽 +7.ہ؅。꫶۵𐇽; 7.ہ؅.꫶۵𐇽; [B1, P1, V5, V6]; 7.xn--nfb98a.xn--imb3805fxt8b; ; ; # 7.ہ.꫶۵𐇽 +7.xn--nfb98a.xn--imb3805fxt8b; 7.ہ؅.꫶۵𐇽; [B1, V5, V6]; 7.xn--nfb98a.xn--imb3805fxt8b; ; ; # 7.ہ.꫶۵𐇽 +xn--nfb98ai25e.xn--imb3805fxt8b; ⒎ہ؅.꫶۵𐇽; [B1, V5, V6]; xn--nfb98ai25e.xn--imb3805fxt8b; ; ; # ⒎ہ.꫶۵𐇽 +-ᡥ᠆󍲭。؅ᩝ𐹡; -ᡥ᠆󍲭.؅ᩝ𐹡; [B1, P1, V3, V6]; xn----f3j6s87156i.xn--nfb035hoo2p; ; ; # -ᡥ᠆.ᩝ𐹡 +xn----f3j6s87156i.xn--nfb035hoo2p; -ᡥ᠆󍲭.؅ᩝ𐹡; [B1, V3, V6]; xn----f3j6s87156i.xn--nfb035hoo2p; ; ; # -ᡥ᠆.ᩝ𐹡 +‍.ڽ٣֖; ; [B1, C2]; xn--1ug.xn--hcb32bni; ; .xn--hcb32bni; [A4_2] # .ڽ٣֖ +.xn--hcb32bni; .ڽ٣֖; [X4_2]; .xn--hcb32bni; [A4_2]; ; # .ڽ٣֖ +xn--1ug.xn--hcb32bni; ‍.ڽ٣֖; [B1, C2]; xn--1ug.xn--hcb32bni; ; ; # .ڽ٣֖ +xn--hcb32bni; ڽ٣֖; ; xn--hcb32bni; ; ; # ڽ٣֖ +ڽ٣֖; ; ; xn--hcb32bni; ; ; # ڽ٣֖ +㒧۱.Ⴚٸ‍; 㒧۱.Ⴚيٴ‍; [B5, B6, C2, P1, V6]; xn--emb715u.xn--mhb8f817ao2p; ; xn--emb715u.xn--mhb8f817a; [B5, B6, P1, V6] # 㒧۱.Ⴚيٴ +㒧۱.Ⴚيٴ‍; ; [B5, B6, C2, P1, V6]; xn--emb715u.xn--mhb8f817ao2p; ; xn--emb715u.xn--mhb8f817a; [B5, B6, P1, V6] # 㒧۱.Ⴚيٴ +㒧۱.ⴚيٴ‍; ; [B5, B6, C2]; xn--emb715u.xn--mhb8f960g03l; ; xn--emb715u.xn--mhb8fy26k; [B5, B6] # 㒧۱.ⴚيٴ +xn--emb715u.xn--mhb8fy26k; 㒧۱.ⴚيٴ; [B5, B6]; xn--emb715u.xn--mhb8fy26k; ; ; # 㒧۱.ⴚيٴ +xn--emb715u.xn--mhb8f960g03l; 㒧۱.ⴚيٴ‍; [B5, B6, C2]; xn--emb715u.xn--mhb8f960g03l; ; ; # 㒧۱.ⴚيٴ +xn--emb715u.xn--mhb8f817a; 㒧۱.Ⴚيٴ; [B5, B6, V6]; xn--emb715u.xn--mhb8f817a; ; ; # 㒧۱.Ⴚيٴ +xn--emb715u.xn--mhb8f817ao2p; 㒧۱.Ⴚيٴ‍; [B5, B6, C2, V6]; xn--emb715u.xn--mhb8f817ao2p; ; ; # 㒧۱.Ⴚيٴ +㒧۱.ⴚٸ‍; 㒧۱.ⴚيٴ‍; [B5, B6, C2]; xn--emb715u.xn--mhb8f960g03l; ; xn--emb715u.xn--mhb8fy26k; [B5, B6] # 㒧۱.ⴚيٴ +ྔꡋ-.-𖬴; ྔꡋ-.-𖬴; [V3, V5]; xn----ukg9938i.xn----4u5m; ; ; # ྔꡋ-.-𖬴 +ྔꡋ-.-𖬴; ; [V3, V5]; xn----ukg9938i.xn----4u5m; ; ; # ྔꡋ-.-𖬴 +xn----ukg9938i.xn----4u5m; ྔꡋ-.-𖬴; [V3, V5]; xn----ukg9938i.xn----4u5m; ; ; # ྔꡋ-.-𖬴 +񿒳-⋢‌.标-; 񿒳-⋢‌.标-; [C1, P1, V3, V6]; xn----sgn90kn5663a.xn----qj7b; ; xn----9mo67451g.xn----qj7b; [P1, V3, V6] # -⋢.标- +񿒳-⋢‌.标-; 񿒳-⋢‌.标-; [C1, P1, V3, V6]; xn----sgn90kn5663a.xn----qj7b; ; xn----9mo67451g.xn----qj7b; [P1, V3, V6] # -⋢.标- +񿒳-⋢‌.标-; ; [C1, P1, V3, V6]; xn----sgn90kn5663a.xn----qj7b; ; xn----9mo67451g.xn----qj7b; [P1, V3, V6] # -⋢.标- +񿒳-⋢‌.标-; 񿒳-⋢‌.标-; [C1, P1, V3, V6]; xn----sgn90kn5663a.xn----qj7b; ; xn----9mo67451g.xn----qj7b; [P1, V3, V6] # -⋢.标- +xn----9mo67451g.xn----qj7b; 񿒳-⋢.标-; [V3, V6]; xn----9mo67451g.xn----qj7b; ; ; # -⋢.标- +xn----sgn90kn5663a.xn----qj7b; 񿒳-⋢‌.标-; [C1, V3, V6]; xn----sgn90kn5663a.xn----qj7b; ; ; # -⋢.标- +ٱ.ςߜ; ٱ.ςߜ; [B5, B6]; xn--qib.xn--3xa41s; ; xn--qib.xn--4xa21s; # ٱ.ςߜ +ٱ.ςߜ; ; [B5, B6]; xn--qib.xn--3xa41s; ; xn--qib.xn--4xa21s; # ٱ.ςߜ +ٱ.Σߜ; ٱ.σߜ; [B5, B6]; xn--qib.xn--4xa21s; ; ; # ٱ.σߜ +ٱ.σߜ; ; [B5, B6]; xn--qib.xn--4xa21s; ; ; # ٱ.σߜ +xn--qib.xn--4xa21s; ٱ.σߜ; [B5, B6]; xn--qib.xn--4xa21s; ; ; # ٱ.σߜ +xn--qib.xn--3xa41s; ٱ.ςߜ; [B5, B6]; xn--qib.xn--3xa41s; ; ; # ٱ.ςߜ +ٱ.Σߜ; ٱ.σߜ; [B5, B6]; xn--qib.xn--4xa21s; ; ; # ٱ.σߜ +ٱ.σߜ; ٱ.σߜ; [B5, B6]; xn--qib.xn--4xa21s; ; ; # ٱ.σߜ +񼈶؅.ࣁ‍𑑂𱼱; 񼈶؅.ࣁ‍𑑂𱼱; [B2, B3, B5, B6, C2, P1, V6]; xn--nfb17942h.xn--nzb240jv06otevq; ; xn--nfb17942h.xn--nzb6708kx3pn; [B2, B3, B5, B6, P1, V6] # .ࣁ𑑂 +񼈶؅.ࣁ‍𑑂𱼱; ; [B2, B3, B5, B6, C2, P1, V6]; xn--nfb17942h.xn--nzb240jv06otevq; ; xn--nfb17942h.xn--nzb6708kx3pn; [B2, B3, B5, B6, P1, V6] # .ࣁ𑑂 +xn--nfb17942h.xn--nzb6708kx3pn; 񼈶؅.ࣁ𑑂𱼱; [B2, B3, B5, B6, V6]; xn--nfb17942h.xn--nzb6708kx3pn; ; ; # .ࣁ𑑂 +xn--nfb17942h.xn--nzb240jv06otevq; 񼈶؅.ࣁ‍𑑂𱼱; [B2, B3, B5, B6, C2, V6]; xn--nfb17942h.xn--nzb240jv06otevq; ; ; # .ࣁ𑑂 +𐹾𐋩𞵜。᯲; 𐹾𐋩𞵜.᯲; [B1, P1, V5, V6]; xn--d97cn8rn44p.xn--0zf; ; ; # 𐹾𐋩.᯲ +𐹾𐋩𞵜。᯲; 𐹾𐋩𞵜.᯲; [B1, P1, V5, V6]; xn--d97cn8rn44p.xn--0zf; ; ; # 𐹾𐋩.᯲ +xn--d97cn8rn44p.xn--0zf; 𐹾𐋩𞵜.᯲; [B1, V5, V6]; xn--d97cn8rn44p.xn--0zf; ; ; # 𐹾𐋩.᯲ +6ᅠᰳ󠸧.򟜊锰ܬς; ; [B1, B5, P1, V6]; xn--6-5bh476ewr517a.xn--3xa16ohw6pk078g; ; xn--6-5bh476ewr517a.xn--4xa95ohw6pk078g; # 6ᰳ.锰ܬς +6ᅠᰳ󠸧.򟜊锰ܬΣ; 6ᅠᰳ󠸧.򟜊锰ܬσ; [B1, B5, P1, V6]; xn--6-5bh476ewr517a.xn--4xa95ohw6pk078g; ; ; # 6ᰳ.锰ܬσ +6ᅠᰳ󠸧.򟜊锰ܬσ; ; [B1, B5, P1, V6]; xn--6-5bh476ewr517a.xn--4xa95ohw6pk078g; ; ; # 6ᰳ.锰ܬσ +xn--6-5bh476ewr517a.xn--4xa95ohw6pk078g; 6ᅠᰳ󠸧.򟜊锰ܬσ; [B1, B5, V6]; xn--6-5bh476ewr517a.xn--4xa95ohw6pk078g; ; ; # 6ᰳ.锰ܬσ +xn--6-5bh476ewr517a.xn--3xa16ohw6pk078g; 6ᅠᰳ󠸧.򟜊锰ܬς; [B1, B5, V6]; xn--6-5bh476ewr517a.xn--3xa16ohw6pk078g; ; ; # 6ᰳ.锰ܬς +ڳ︄񅎦𝟽。𐹽; ڳ񅎦7.𐹽; [B1, B2, P1, V6]; xn--7-yuc34665f.xn--1o0d; ; ; # ڳ7.𐹽 +ڳ︄񅎦7。𐹽; ڳ񅎦7.𐹽; [B1, B2, P1, V6]; xn--7-yuc34665f.xn--1o0d; ; ; # ڳ7.𐹽 +xn--7-yuc34665f.xn--1o0d; ڳ񅎦7.𐹽; [B1, B2, V6]; xn--7-yuc34665f.xn--1o0d; ; ; # ڳ7.𐹽 +𞮧.‌⫞; 𞮧.‌⫞; [B1, C1, P1, V6]; xn--pw6h.xn--0ug283b; ; xn--pw6h.xn--53i; [B1, P1, V6] # .⫞ +𞮧.‌⫞; ; [B1, C1, P1, V6]; xn--pw6h.xn--0ug283b; ; xn--pw6h.xn--53i; [B1, P1, V6] # .⫞ +xn--pw6h.xn--53i; 𞮧.⫞; [B1, V6]; xn--pw6h.xn--53i; ; ; # .⫞ +xn--pw6h.xn--0ug283b; 𞮧.‌⫞; [B1, C1, V6]; xn--pw6h.xn--0ug283b; ; ; # .⫞ +-񕉴.۠ᢚ-; ; [P1, V3, V5, V6]; xn----qi38c.xn----jxc827k; ; ; # -.۠ᢚ- +xn----qi38c.xn----jxc827k; -񕉴.۠ᢚ-; [V3, V5, V6]; xn----qi38c.xn----jxc827k; ; ; # -.۠ᢚ- +⌁‍𑄴.‌𝟩٬; ⌁‍𑄴.‌7٬; [B1, C1, C2]; xn--1ug38i2093a.xn--7-xqc297q; ; xn--nhh5394g.xn--7-xqc; [B1] # ⌁𑄴.7٬ +⌁‍𑄴.‌7٬; ; [B1, C1, C2]; xn--1ug38i2093a.xn--7-xqc297q; ; xn--nhh5394g.xn--7-xqc; [B1] # ⌁𑄴.7٬ +xn--nhh5394g.xn--7-xqc; ⌁𑄴.7٬; [B1]; xn--nhh5394g.xn--7-xqc; ; ; # ⌁𑄴.7٬ +xn--1ug38i2093a.xn--7-xqc297q; ⌁‍𑄴.‌7٬; [B1, C1, C2]; xn--1ug38i2093a.xn--7-xqc297q; ; ; # ⌁𑄴.7٬ +︒ﴅืﻼ。岓᯲󠾃ᡂ; ︒صىืلا.岓᯲󠾃ᡂ; [B1, P1, V6]; xn--mgb1a7bt462hf267a.xn--17e10qe61f9r71s; ; ; # ︒صىืلا.岓᯲ᡂ +。صىืلا。岓᯲󠾃ᡂ; .صىืلا.岓᯲󠾃ᡂ; [P1, V6, X4_2]; .xn--mgb1a7bt462h.xn--17e10qe61f9r71s; [P1, V6, A4_2]; ; # .صىืلا.岓᯲ᡂ +.xn--mgb1a7bt462h.xn--17e10qe61f9r71s; .صىืلا.岓᯲󠾃ᡂ; [V6, X4_2]; .xn--mgb1a7bt462h.xn--17e10qe61f9r71s; [V6, A4_2]; ; # .صىืلا.岓᯲ᡂ +xn--mgb1a7bt462hf267a.xn--17e10qe61f9r71s; ︒صىืلا.岓᯲󠾃ᡂ; [B1, V6]; xn--mgb1a7bt462hf267a.xn--17e10qe61f9r71s; ; ; # ︒صىืلا.岓᯲ᡂ +𐹨。8𑁆; 𐹨.8𑁆; [B1]; xn--go0d.xn--8-yu7i; ; ; # 𐹨.8𑁆 +xn--go0d.xn--8-yu7i; 𐹨.8𑁆; [B1]; xn--go0d.xn--8-yu7i; ; ; # 𐹨.8𑁆 +𞀕ൃ.ꡚࣺ𐹰ൄ; 𞀕ൃ.ꡚࣺ𐹰ൄ; [B1, B3, B5, B6, V5]; xn--mxc5210v.xn--90b01t8u2p1ltd; ; ; # 𞀕ൃ.ꡚࣺ𐹰ൄ +𞀕ൃ.ꡚࣺ𐹰ൄ; ; [B1, B3, B5, B6, V5]; xn--mxc5210v.xn--90b01t8u2p1ltd; ; ; # 𞀕ൃ.ꡚࣺ𐹰ൄ +xn--mxc5210v.xn--90b01t8u2p1ltd; 𞀕ൃ.ꡚࣺ𐹰ൄ; [B1, B3, B5, B6, V5]; xn--mxc5210v.xn--90b01t8u2p1ltd; ; ; # 𞀕ൃ.ꡚࣺ𐹰ൄ +󆩏𐦹̃。󠍅; 󆩏𐦹̃.󠍅; [B1, B5, B6, P1, V6]; xn--nsa1265kp9z9e.xn--xt36e; ; ; # ̃. +󆩏𐦹̃。󠍅; 󆩏𐦹̃.󠍅; [B1, B5, B6, P1, V6]; xn--nsa1265kp9z9e.xn--xt36e; ; ; # ̃. +xn--nsa1265kp9z9e.xn--xt36e; 󆩏𐦹̃.󠍅; [B1, B5, B6, V6]; xn--nsa1265kp9z9e.xn--xt36e; ; ; # ̃. +ᢌ.-࡚; ᢌ.-࡚; [V3]; xn--59e.xn----5jd; ; ; # ᢌ.-࡚ +ᢌ.-࡚; ; [V3]; xn--59e.xn----5jd; ; ; # ᢌ.-࡚ +xn--59e.xn----5jd; ᢌ.-࡚; [V3]; xn--59e.xn----5jd; ; ; # ᢌ.-࡚ +𥛛𑘶。𐹬𐲸்; 𥛛𑘶.𐹬𐲸்; [B1, P1, V6]; xn--jb2dj685c.xn--xmc5562kmcb; ; ; # 𥛛𑘶.𐹬் +𥛛𑘶。𐹬𐲸்; 𥛛𑘶.𐹬𐲸்; [B1, P1, V6]; xn--jb2dj685c.xn--xmc5562kmcb; ; ; # 𥛛𑘶.𐹬் +xn--jb2dj685c.xn--xmc5562kmcb; 𥛛𑘶.𐹬𐲸்; [B1, V6]; xn--jb2dj685c.xn--xmc5562kmcb; ; ; # 𥛛𑘶.𐹬் +Ⴐݿ.‌; Ⴐݿ.‌; [B1, B5, B6, C1, P1, V6]; xn--gqb918b.xn--0ug; ; xn--gqb918b.; [B5, B6, P1, V6] # Ⴐݿ. +Ⴐݿ.‌; ; [B1, B5, B6, C1, P1, V6]; xn--gqb918b.xn--0ug; ; xn--gqb918b.; [B5, B6, P1, V6] # Ⴐݿ. +ⴐݿ.‌; ; [B1, B5, B6, C1]; xn--gqb743q.xn--0ug; ; xn--gqb743q.; [B5, B6] # ⴐݿ. +xn--gqb743q.; ⴐݿ.; [B5, B6]; xn--gqb743q.; ; ; # ⴐݿ. +xn--gqb743q.xn--0ug; ⴐݿ.‌; [B1, B5, B6, C1]; xn--gqb743q.xn--0ug; ; ; # ⴐݿ. +xn--gqb918b.; Ⴐݿ.; [B5, B6, V6]; xn--gqb918b.; ; ; # Ⴐݿ. +xn--gqb918b.xn--0ug; Ⴐݿ.‌; [B1, B5, B6, C1, V6]; xn--gqb918b.xn--0ug; ; ; # Ⴐݿ. +ⴐݿ.‌; ⴐݿ.‌; [B1, B5, B6, C1]; xn--gqb743q.xn--0ug; ; xn--gqb743q.; [B5, B6] # ⴐݿ. +🄅𑲞-⒈。‍ᠩڥ; 🄅𑲞-⒈.‍ᠩڥ; [B1, C2, P1, V6]; xn----ecp8796hjtvg.xn--7jb180gexf; ; xn----ecp8796hjtvg.xn--7jb180g; [B1, B5, B6, P1, V6] # 🄅𑲞-⒈.ᠩڥ +4,𑲞-1.。‍ᠩڥ; 4,𑲞-1..‍ᠩڥ; [B1, C2, P1, V6, X4_2]; xn--4,-1-w401a..xn--7jb180gexf; [B1, C2, P1, V6, A4_2]; xn--4,-1-w401a..xn--7jb180g; [B1, B5, B6, P1, V6, A4_2] # 4,𑲞-1..ᠩڥ +xn--4,-1-w401a..xn--7jb180g; 4,𑲞-1..ᠩڥ; [B1, B5, B6, P1, V6, X4_2]; xn--4,-1-w401a..xn--7jb180g; [B1, B5, B6, P1, V6, A4_2]; ; # 4,𑲞-1..ᠩڥ +xn--4,-1-w401a..xn--7jb180gexf; 4,𑲞-1..‍ᠩڥ; [B1, C2, P1, V6, X4_2]; xn--4,-1-w401a..xn--7jb180gexf; [B1, C2, P1, V6, A4_2]; ; # 4,𑲞-1..ᠩڥ +xn----ecp8796hjtvg.xn--7jb180g; 🄅𑲞-⒈.ᠩڥ; [B1, B5, B6, V6]; xn----ecp8796hjtvg.xn--7jb180g; ; ; # 🄅𑲞-⒈.ᠩڥ +xn----ecp8796hjtvg.xn--7jb180gexf; 🄅𑲞-⒈.‍ᠩڥ; [B1, C2, V6]; xn----ecp8796hjtvg.xn--7jb180gexf; ; ; # 🄅𑲞-⒈.ᠩڥ +񗀤。𞤪򮿋; 񗀤.𞤪򮿋; [B2, B3, P1, V6]; xn--4240a.xn--ie6h83808a; ; ; # .𞤪 +񗀤。𞤈򮿋; 񗀤.𞤪򮿋; [B2, B3, P1, V6]; xn--4240a.xn--ie6h83808a; ; ; # .𞤪 +xn--4240a.xn--ie6h83808a; 񗀤.𞤪򮿋; [B2, B3, V6]; xn--4240a.xn--ie6h83808a; ; ; # .𞤪 +ׁ۲。𐮊٬𝨊鄨; ׁ۲.𐮊٬𝨊鄨; [B1, B2, B3, V5]; xn--pdb42d.xn--lib6412enztdwv6h; ; ; # ׁ۲.𐮊٬𝨊鄨 +ׁ۲。𐮊٬𝨊鄨; ׁ۲.𐮊٬𝨊鄨; [B1, B2, B3, V5]; xn--pdb42d.xn--lib6412enztdwv6h; ; ; # ׁ۲.𐮊٬𝨊鄨 +xn--pdb42d.xn--lib6412enztdwv6h; ׁ۲.𐮊٬𝨊鄨; [B1, B2, B3, V5]; xn--pdb42d.xn--lib6412enztdwv6h; ; ; # ׁ۲.𐮊٬𝨊鄨 +𞭳-ꡁ。ᩩ்-; 𞭳-ꡁ.ᩩ்-; [B1, B2, B3, P1, V3, V5, V6]; xn----be4e4276f.xn----lze333i; ; ; # -ꡁ.ᩩ்- +xn----be4e4276f.xn----lze333i; 𞭳-ꡁ.ᩩ்-; [B1, B2, B3, V3, V5, V6]; xn----be4e4276f.xn----lze333i; ; ; # -ꡁ.ᩩ்- +္-𚮭🞢.ß; ္-𚮭🞢.ß; [P1, V5, V6]; xn----9tg11172akr8b.xn--zca; ; xn----9tg11172akr8b.ss; # ္-🞢.ß +္-𚮭🞢.ß; ; [P1, V5, V6]; xn----9tg11172akr8b.xn--zca; ; xn----9tg11172akr8b.ss; # ္-🞢.ß +္-𚮭🞢.SS; ္-𚮭🞢.ss; [P1, V5, V6]; xn----9tg11172akr8b.ss; ; ; # ္-🞢.ss +္-𚮭🞢.ss; ; [P1, V5, V6]; xn----9tg11172akr8b.ss; ; ; # ္-🞢.ss +္-𚮭🞢.Ss; ္-𚮭🞢.ss; [P1, V5, V6]; xn----9tg11172akr8b.ss; ; ; # ္-🞢.ss +xn----9tg11172akr8b.ss; ္-𚮭🞢.ss; [V5, V6]; xn----9tg11172akr8b.ss; ; ; # ္-🞢.ss +xn----9tg11172akr8b.xn--zca; ္-𚮭🞢.ß; [V5, V6]; xn----9tg11172akr8b.xn--zca; ; ; # ္-🞢.ß +္-𚮭🞢.SS; ္-𚮭🞢.ss; [P1, V5, V6]; xn----9tg11172akr8b.ss; ; ; # ္-🞢.ss +္-𚮭🞢.ss; ္-𚮭🞢.ss; [P1, V5, V6]; xn----9tg11172akr8b.ss; ; ; # ္-🞢.ss +္-𚮭🞢.Ss; ္-𚮭🞢.ss; [P1, V5, V6]; xn----9tg11172akr8b.ss; ; ; # ္-🞢.ss +ﳲ-‌。Ⴟ‌␣; ـَّ-‌.Ⴟ‌␣; [B3, B6, C1, P1, V6]; xn----eoc6bm0504a.xn--3nd849e05c; ; xn----eoc6bm.xn--3nd240h; [B3, B6, P1, V3, V6] # ـَّ-.Ⴟ␣ +ـَّ-‌。Ⴟ‌␣; ـَّ-‌.Ⴟ‌␣; [B3, B6, C1, P1, V6]; xn----eoc6bm0504a.xn--3nd849e05c; ; xn----eoc6bm.xn--3nd240h; [B3, B6, P1, V3, V6] # ـَّ-.Ⴟ␣ +ـَّ-‌。ⴟ‌␣; ـَّ-‌.ⴟ‌␣; [B3, B6, C1]; xn----eoc6bm0504a.xn--0ug13nd0j; ; xn----eoc6bm.xn--xph904a; [B3, B6, V3] # ـَّ-.ⴟ␣ +xn----eoc6bm.xn--xph904a; ـَّ-.ⴟ␣; [B3, B6, V3]; xn----eoc6bm.xn--xph904a; ; ; # ـَّ-.ⴟ␣ +xn----eoc6bm0504a.xn--0ug13nd0j; ـَّ-‌.ⴟ‌␣; [B3, B6, C1]; xn----eoc6bm0504a.xn--0ug13nd0j; ; ; # ـَّ-.ⴟ␣ +xn----eoc6bm.xn--3nd240h; ـَّ-.Ⴟ␣; [B3, B6, V3, V6]; xn----eoc6bm.xn--3nd240h; ; ; # ـَّ-.Ⴟ␣ +xn----eoc6bm0504a.xn--3nd849e05c; ـَّ-‌.Ⴟ‌␣; [B3, B6, C1, V6]; xn----eoc6bm0504a.xn--3nd849e05c; ; ; # ـَّ-.Ⴟ␣ +ﳲ-‌。ⴟ‌␣; ـَّ-‌.ⴟ‌␣; [B3, B6, C1]; xn----eoc6bm0504a.xn--0ug13nd0j; ; xn----eoc6bm.xn--xph904a; [B3, B6, V3] # ـَّ-.ⴟ␣ +്-‍‌。񥞧₅≠; ്-‍‌.񥞧5≠; [C1, C2, P1, V5, V6]; xn----jmf215lda.xn--5-ufo50192e; ; xn----jmf.xn--5-ufo50192e; [P1, V3, V5, V6] # ്-.5≠ +്-‍‌。񥞧₅≠; ്-‍‌.񥞧5≠; [C1, C2, P1, V5, V6]; xn----jmf215lda.xn--5-ufo50192e; ; xn----jmf.xn--5-ufo50192e; [P1, V3, V5, V6] # ്-.5≠ +്-‍‌。񥞧5≠; ്-‍‌.񥞧5≠; [C1, C2, P1, V5, V6]; xn----jmf215lda.xn--5-ufo50192e; ; xn----jmf.xn--5-ufo50192e; [P1, V3, V5, V6] # ്-.5≠ +്-‍‌。񥞧5≠; ്-‍‌.񥞧5≠; [C1, C2, P1, V5, V6]; xn----jmf215lda.xn--5-ufo50192e; ; xn----jmf.xn--5-ufo50192e; [P1, V3, V5, V6] # ്-.5≠ +xn----jmf.xn--5-ufo50192e; ്-.񥞧5≠; [V3, V5, V6]; xn----jmf.xn--5-ufo50192e; ; ; # ്-.5≠ +xn----jmf215lda.xn--5-ufo50192e; ്-‍‌.񥞧5≠; [C1, C2, V5, V6]; xn----jmf215lda.xn--5-ufo50192e; ; ; # ്-.5≠ +锣。੍󠘻󠚆; 锣.੍󠘻󠚆; [P1, V5, V6]; xn--gc5a.xn--ybc83044ppga; ; ; # 锣.੍ +xn--gc5a.xn--ybc83044ppga; 锣.੍󠘻󠚆; [V5, V6]; xn--gc5a.xn--ybc83044ppga; ; ; # 锣.੍ +ؽ𑈾.ى‍꤫; ؽ𑈾.ى‍꤫; [B3, C2]; xn--8gb2338k.xn--lhb603k060h; ; xn--8gb2338k.xn--lhb0154f; [] # ؽ𑈾.ى꤫ +ؽ𑈾.ى‍꤫; ; [B3, C2]; xn--8gb2338k.xn--lhb603k060h; ; xn--8gb2338k.xn--lhb0154f; [] # ؽ𑈾.ى꤫ +xn--8gb2338k.xn--lhb0154f; ؽ𑈾.ى꤫; ; xn--8gb2338k.xn--lhb0154f; ; ; # ؽ𑈾.ى꤫ +ؽ𑈾.ى꤫; ; ; xn--8gb2338k.xn--lhb0154f; ; ; # ؽ𑈾.ى꤫ +xn--8gb2338k.xn--lhb603k060h; ؽ𑈾.ى‍꤫; [B3, C2]; xn--8gb2338k.xn--lhb603k060h; ; ; # ؽ𑈾.ى꤫ +٦⁴Ⴅ.ࢽ‌; ٦4Ⴅ.ࢽ‌; [B1, B3, C1, P1, V6]; xn--4-kqc489e.xn--jzb840j; ; xn--4-kqc489e.xn--jzb; [B1, P1, V6] # ٦4Ⴅ.ࢽ +٦4Ⴅ.ࢽ‌; ; [B1, B3, C1, P1, V6]; xn--4-kqc489e.xn--jzb840j; ; xn--4-kqc489e.xn--jzb; [B1, P1, V6] # ٦4Ⴅ.ࢽ +٦4ⴅ.ࢽ‌; ; [B1, B3, C1]; xn--4-kqc6770a.xn--jzb840j; ; xn--4-kqc6770a.xn--jzb; [B1] # ٦4ⴅ.ࢽ +xn--4-kqc6770a.xn--jzb; ٦4ⴅ.ࢽ; [B1]; xn--4-kqc6770a.xn--jzb; ; ; # ٦4ⴅ.ࢽ +xn--4-kqc6770a.xn--jzb840j; ٦4ⴅ.ࢽ‌; [B1, B3, C1]; xn--4-kqc6770a.xn--jzb840j; ; ; # ٦4ⴅ.ࢽ +xn--4-kqc489e.xn--jzb; ٦4Ⴅ.ࢽ; [B1, V6]; xn--4-kqc489e.xn--jzb; ; ; # ٦4Ⴅ.ࢽ +xn--4-kqc489e.xn--jzb840j; ٦4Ⴅ.ࢽ‌; [B1, B3, C1, V6]; xn--4-kqc489e.xn--jzb840j; ; ; # ٦4Ⴅ.ࢽ +٦⁴ⴅ.ࢽ‌; ٦4ⴅ.ࢽ‌; [B1, B3, C1]; xn--4-kqc6770a.xn--jzb840j; ; xn--4-kqc6770a.xn--jzb; [B1] # ٦4ⴅ.ࢽ +ჁႱ6̘。ßᬃ; ჁႱ6̘.ßᬃ; [P1, V6]; xn--6-8cb555h2b.xn--zca894k; ; xn--6-8cb555h2b.xn--ss-2vq; # ჁႱ6̘.ßᬃ +ⴡⴑ6̘。ßᬃ; ⴡⴑ6̘.ßᬃ; ; xn--6-8cb7433a2ba.xn--zca894k; ; xn--6-8cb7433a2ba.xn--ss-2vq; # ⴡⴑ6̘.ßᬃ +ჁႱ6̘。SSᬃ; ჁႱ6̘.ssᬃ; [P1, V6]; xn--6-8cb555h2b.xn--ss-2vq; ; ; # ჁႱ6̘.ssᬃ +ⴡⴑ6̘。ssᬃ; ⴡⴑ6̘.ssᬃ; ; xn--6-8cb7433a2ba.xn--ss-2vq; ; ; # ⴡⴑ6̘.ssᬃ +Ⴡⴑ6̘。Ssᬃ; Ⴡⴑ6̘.ssᬃ; [P1, V6]; xn--6-8cb306hms1a.xn--ss-2vq; ; ; # Ⴡⴑ6̘.ssᬃ +xn--6-8cb306hms1a.xn--ss-2vq; Ⴡⴑ6̘.ssᬃ; [V6]; xn--6-8cb306hms1a.xn--ss-2vq; ; ; # Ⴡⴑ6̘.ssᬃ +xn--6-8cb7433a2ba.xn--ss-2vq; ⴡⴑ6̘.ssᬃ; ; xn--6-8cb7433a2ba.xn--ss-2vq; ; ; # ⴡⴑ6̘.ssᬃ +ⴡⴑ6̘.ssᬃ; ; ; xn--6-8cb7433a2ba.xn--ss-2vq; ; ; # ⴡⴑ6̘.ssᬃ +ჁႱ6̘.SSᬃ; ჁႱ6̘.ssᬃ; [P1, V6]; xn--6-8cb555h2b.xn--ss-2vq; ; ; # ჁႱ6̘.ssᬃ +Ⴡⴑ6̘.Ssᬃ; Ⴡⴑ6̘.ssᬃ; [P1, V6]; xn--6-8cb306hms1a.xn--ss-2vq; ; ; # Ⴡⴑ6̘.ssᬃ +xn--6-8cb555h2b.xn--ss-2vq; ჁႱ6̘.ssᬃ; [V6]; xn--6-8cb555h2b.xn--ss-2vq; ; ; # ჁႱ6̘.ssᬃ +xn--6-8cb7433a2ba.xn--zca894k; ⴡⴑ6̘.ßᬃ; ; xn--6-8cb7433a2ba.xn--zca894k; ; ; # ⴡⴑ6̘.ßᬃ +ⴡⴑ6̘.ßᬃ; ; ; xn--6-8cb7433a2ba.xn--zca894k; ; xn--6-8cb7433a2ba.xn--ss-2vq; # ⴡⴑ6̘.ßᬃ +xn--6-8cb555h2b.xn--zca894k; ჁႱ6̘.ßᬃ; [V6]; xn--6-8cb555h2b.xn--zca894k; ; ; # ჁႱ6̘.ßᬃ +򋡐。≯𑋪; 򋡐.≯𑋪; [P1, V6]; xn--eo08b.xn--hdh3385g; ; ; # .≯𑋪 +򋡐。≯𑋪; 򋡐.≯𑋪; [P1, V6]; xn--eo08b.xn--hdh3385g; ; ; # .≯𑋪 +򋡐。≯𑋪; 򋡐.≯𑋪; [P1, V6]; xn--eo08b.xn--hdh3385g; ; ; # .≯𑋪 +򋡐。≯𑋪; 򋡐.≯𑋪; [P1, V6]; xn--eo08b.xn--hdh3385g; ; ; # .≯𑋪 +xn--eo08b.xn--hdh3385g; 򋡐.≯𑋪; [V6]; xn--eo08b.xn--hdh3385g; ; ; # .≯𑋪 +ٚ۲。‌-᯳࣢; ٚ۲.‌-᯳࣢; [B1, C1, P1, V5, V6]; xn--2hb81a.xn----xrd657l30d; ; xn--2hb81a.xn----xrd657l; [B1, P1, V3, V5, V6] # ٚ۲.-᯳ +xn--2hb81a.xn----xrd657l; ٚ۲.-᯳࣢; [B1, V3, V5, V6]; xn--2hb81a.xn----xrd657l; ; ; # ٚ۲.-᯳ +xn--2hb81a.xn----xrd657l30d; ٚ۲.‌-᯳࣢; [B1, C1, V5, V6]; xn--2hb81a.xn----xrd657l30d; ; ; # ٚ۲.-᯳ +󠄏𖬴󠲽。ᅠ; 𖬴󠲽.ᅠ; [P1, V5, V6]; xn--619ep9154c.xn--cl7c; ; ; # 𖬴. +󠄏𖬴󠲽。ᅠ; 𖬴󠲽.ᅠ; [P1, V5, V6]; xn--619ep9154c.xn--psd; ; ; # 𖬴. +xn--619ep9154c.xn--psd; 𖬴󠲽.ᅠ; [V5, V6]; xn--619ep9154c.xn--psd; ; ; # 𖬴. +xn--619ep9154c.xn--cl7c; 𖬴󠲽.ᅠ; [V5, V6]; xn--619ep9154c.xn--cl7c; ; ; # 𖬴. +ß⒈ݠ힮.􉖲󠅄؅򉔯; ß⒈ݠ힮.􉖲؅򉔯; [B5, P1, V6]; xn--zca444a0s1ao12n.xn--nfb09923ifkyyb; ; xn--ss-6ke9690a0g1q.xn--nfb09923ifkyyb; # ß⒈ݠ. +ß1.ݠ힮.􉖲󠅄؅򉔯; ß1.ݠ힮.􉖲؅򉔯; [B2, B3, B5, P1, V6]; xn--1-pfa.xn--kpb6677h.xn--nfb09923ifkyyb; ; ss1.xn--kpb6677h.xn--nfb09923ifkyyb; # ß1.ݠ. +SS1.ݠ힮.􉖲󠅄؅򉔯; ss1.ݠ힮.􉖲؅򉔯; [B2, B3, B5, P1, V6]; ss1.xn--kpb6677h.xn--nfb09923ifkyyb; ; ; # ss1.ݠ. +ss1.ݠ힮.􉖲󠅄؅򉔯; ss1.ݠ힮.􉖲؅򉔯; [B2, B3, B5, P1, V6]; ss1.xn--kpb6677h.xn--nfb09923ifkyyb; ; ; # ss1.ݠ. +Ss1.ݠ힮.􉖲󠅄؅򉔯; ss1.ݠ힮.􉖲؅򉔯; [B2, B3, B5, P1, V6]; ss1.xn--kpb6677h.xn--nfb09923ifkyyb; ; ; # ss1.ݠ. +ss1.xn--kpb6677h.xn--nfb09923ifkyyb; ss1.ݠ힮.􉖲؅򉔯; [B2, B3, B5, V6]; ss1.xn--kpb6677h.xn--nfb09923ifkyyb; ; ; # ss1.ݠ. +xn--1-pfa.xn--kpb6677h.xn--nfb09923ifkyyb; ß1.ݠ힮.􉖲؅򉔯; [B2, B3, B5, V6]; xn--1-pfa.xn--kpb6677h.xn--nfb09923ifkyyb; ; ; # ß1.ݠ. +SS⒈ݠ힮.􉖲󠅄؅򉔯; ss⒈ݠ힮.􉖲؅򉔯; [B5, P1, V6]; xn--ss-6ke9690a0g1q.xn--nfb09923ifkyyb; ; ; # ss⒈ݠ. +ss⒈ݠ힮.􉖲󠅄؅򉔯; ss⒈ݠ힮.􉖲؅򉔯; [B5, P1, V6]; xn--ss-6ke9690a0g1q.xn--nfb09923ifkyyb; ; ; # ss⒈ݠ. +Ss⒈ݠ힮.􉖲󠅄؅򉔯; ss⒈ݠ힮.􉖲؅򉔯; [B5, P1, V6]; xn--ss-6ke9690a0g1q.xn--nfb09923ifkyyb; ; ; # ss⒈ݠ. +xn--ss-6ke9690a0g1q.xn--nfb09923ifkyyb; ss⒈ݠ힮.􉖲؅򉔯; [B5, V6]; xn--ss-6ke9690a0g1q.xn--nfb09923ifkyyb; ; ; # ss⒈ݠ. +xn--zca444a0s1ao12n.xn--nfb09923ifkyyb; ß⒈ݠ힮.􉖲؅򉔯; [B5, V6]; xn--zca444a0s1ao12n.xn--nfb09923ifkyyb; ; ; # ß⒈ݠ. +󠭔.𐋱₂; 󠭔.𐋱2; [P1, V6]; xn--vi56e.xn--2-w91i; ; ; # .𐋱2 +󠭔.𐋱2; ; [P1, V6]; xn--vi56e.xn--2-w91i; ; ; # .𐋱2 +xn--vi56e.xn--2-w91i; 󠭔.𐋱2; [V6]; xn--vi56e.xn--2-w91i; ; ; # .𐋱2 +ܖे。-ßڥ‌; ܖे.-ßڥ‌; [B1, C1, V3]; xn--gnb63i.xn----qfa845bhx4a; ; xn--gnb63i.xn---ss-4ef; [B1, V3] # ܖे.-ßڥ +ܖे。-SSڥ‌; ܖे.-ssڥ‌; [B1, C1, V3]; xn--gnb63i.xn---ss-4ef9263a; ; xn--gnb63i.xn---ss-4ef; [B1, V3] # ܖे.-ssڥ +ܖे。-ssڥ‌; ܖे.-ssڥ‌; [B1, C1, V3]; xn--gnb63i.xn---ss-4ef9263a; ; xn--gnb63i.xn---ss-4ef; [B1, V3] # ܖे.-ssڥ +ܖे。-Ssڥ‌; ܖे.-ssڥ‌; [B1, C1, V3]; xn--gnb63i.xn---ss-4ef9263a; ; xn--gnb63i.xn---ss-4ef; [B1, V3] # ܖे.-ssڥ +xn--gnb63i.xn---ss-4ef; ܖे.-ssڥ; [B1, V3]; xn--gnb63i.xn---ss-4ef; ; ; # ܖे.-ssڥ +xn--gnb63i.xn---ss-4ef9263a; ܖे.-ssڥ‌; [B1, C1, V3]; xn--gnb63i.xn---ss-4ef9263a; ; ; # ܖे.-ssڥ +xn--gnb63i.xn----qfa845bhx4a; ܖे.-ßڥ‌; [B1, C1, V3]; xn--gnb63i.xn----qfa845bhx4a; ; ; # ܖे.-ßڥ +ᮩ‍ت񡚈.᳕䷉Ⴡ; ᮩ‍ت񡚈.᳕䷉Ⴡ; [B1, C2, P1, V5, V6]; xn--pgb911imgdrw34r.xn--5nd792dgv3b; ; xn--pgb911izv33i.xn--5nd792dgv3b; [B1, P1, V5, V6] # ᮩت.᳕䷉Ⴡ +ᮩ‍ت񡚈.᳕䷉Ⴡ; ; [B1, C2, P1, V5, V6]; xn--pgb911imgdrw34r.xn--5nd792dgv3b; ; xn--pgb911izv33i.xn--5nd792dgv3b; [B1, P1, V5, V6] # ᮩت.᳕䷉Ⴡ +ᮩ‍ت񡚈.᳕䷉ⴡ; ; [B1, C2, P1, V5, V6]; xn--pgb911imgdrw34r.xn--i6f270etuy; ; xn--pgb911izv33i.xn--i6f270etuy; [B1, P1, V5, V6] # ᮩت.᳕䷉ⴡ +xn--pgb911izv33i.xn--i6f270etuy; ᮩت񡚈.᳕䷉ⴡ; [B1, V5, V6]; xn--pgb911izv33i.xn--i6f270etuy; ; ; # ᮩت.᳕䷉ⴡ +xn--pgb911imgdrw34r.xn--i6f270etuy; ᮩ‍ت񡚈.᳕䷉ⴡ; [B1, C2, V5, V6]; xn--pgb911imgdrw34r.xn--i6f270etuy; ; ; # ᮩت.᳕䷉ⴡ +xn--pgb911izv33i.xn--5nd792dgv3b; ᮩت񡚈.᳕䷉Ⴡ; [B1, V5, V6]; xn--pgb911izv33i.xn--5nd792dgv3b; ; ; # ᮩت.᳕䷉Ⴡ +xn--pgb911imgdrw34r.xn--5nd792dgv3b; ᮩ‍ت񡚈.᳕䷉Ⴡ; [B1, C2, V5, V6]; xn--pgb911imgdrw34r.xn--5nd792dgv3b; ; ; # ᮩت.᳕䷉Ⴡ +ᮩ‍ت񡚈.᳕䷉ⴡ; ᮩ‍ت񡚈.᳕䷉ⴡ; [B1, C2, P1, V5, V6]; xn--pgb911imgdrw34r.xn--i6f270etuy; ; xn--pgb911izv33i.xn--i6f270etuy; [B1, P1, V5, V6] # ᮩت.᳕䷉ⴡ +⶿.ß‍; ; [C2, P1, V6]; xn--7pj.xn--zca870n; ; xn--7pj.ss; [P1, V6] # .ß +⶿.SS‍; ⶿.ss‍; [C2, P1, V6]; xn--7pj.xn--ss-n1t; ; xn--7pj.ss; [P1, V6] # .ss +⶿.ss‍; ; [C2, P1, V6]; xn--7pj.xn--ss-n1t; ; xn--7pj.ss; [P1, V6] # .ss +⶿.Ss‍; ⶿.ss‍; [C2, P1, V6]; xn--7pj.xn--ss-n1t; ; xn--7pj.ss; [P1, V6] # .ss +xn--7pj.ss; ⶿.ss; [V6]; xn--7pj.ss; ; ; # .ss +xn--7pj.xn--ss-n1t; ⶿.ss‍; [C2, V6]; xn--7pj.xn--ss-n1t; ; ; # .ss +xn--7pj.xn--zca870n; ⶿.ß‍; [C2, V6]; xn--7pj.xn--zca870n; ; ; # .ß +᯳︒.ت≯ꡂ; ; [B2, B3, B6, P1, V5, V6]; xn--1zf8957g.xn--pgb885lry5g; ; ; # ᯳︒.ت≯ꡂ +᯳︒.ت≯ꡂ; ᯳︒.ت≯ꡂ; [B2, B3, B6, P1, V5, V6]; xn--1zf8957g.xn--pgb885lry5g; ; ; # ᯳︒.ت≯ꡂ +᯳。.ت≯ꡂ; ᯳..ت≯ꡂ; [B2, B3, P1, V5, V6, X4_2]; xn--1zf..xn--pgb885lry5g; [B2, B3, P1, V5, V6, A4_2]; ; # ᯳..ت≯ꡂ +᯳。.ت≯ꡂ; ᯳..ت≯ꡂ; [B2, B3, P1, V5, V6, X4_2]; xn--1zf..xn--pgb885lry5g; [B2, B3, P1, V5, V6, A4_2]; ; # ᯳..ت≯ꡂ +xn--1zf..xn--pgb885lry5g; ᯳..ت≯ꡂ; [B2, B3, V5, V6, X4_2]; xn--1zf..xn--pgb885lry5g; [B2, B3, V5, V6, A4_2]; ; # ᯳..ت≯ꡂ +xn--1zf8957g.xn--pgb885lry5g; ᯳︒.ت≯ꡂ; [B2, B3, B6, V5, V6]; xn--1zf8957g.xn--pgb885lry5g; ; ; # ᯳︒.ت≯ꡂ +≮≠񏻃。-𫠆ڷ𐹪; ≮≠񏻃.-𫠆ڷ𐹪; [B1, P1, V3, V6]; xn--1ch1a29470f.xn----7uc5363rc1rn; ; ; # ≮≠.-𫠆ڷ𐹪 +≮≠񏻃。-𫠆ڷ𐹪; ≮≠񏻃.-𫠆ڷ𐹪; [B1, P1, V3, V6]; xn--1ch1a29470f.xn----7uc5363rc1rn; ; ; # ≮≠.-𫠆ڷ𐹪 +≮≠񏻃。-𫠆ڷ𐹪; ≮≠񏻃.-𫠆ڷ𐹪; [B1, P1, V3, V6]; xn--1ch1a29470f.xn----7uc5363rc1rn; ; ; # ≮≠.-𫠆ڷ𐹪 +≮≠񏻃。-𫠆ڷ𐹪; ≮≠񏻃.-𫠆ڷ𐹪; [B1, P1, V3, V6]; xn--1ch1a29470f.xn----7uc5363rc1rn; ; ; # ≮≠.-𫠆ڷ𐹪 +xn--1ch1a29470f.xn----7uc5363rc1rn; ≮≠񏻃.-𫠆ڷ𐹪; [B1, V3, V6]; xn--1ch1a29470f.xn----7uc5363rc1rn; ; ; # ≮≠.-𫠆ڷ𐹪 +𐹡ݷ。ꡂ; 𐹡ݷ.ꡂ; [B1]; xn--7pb5275k.xn--bc9a; ; ; # 𐹡ݷ.ꡂ +xn--7pb5275k.xn--bc9a; 𐹡ݷ.ꡂ; [B1]; xn--7pb5275k.xn--bc9a; ; ; # 𐹡ݷ.ꡂ +Ⴉ𝆅񔻅ؙ.ß𐧦𐹳ݵ; ; [B5, B6, P1, V6]; xn--7fb125cjv87a7xvz.xn--zca684a699vf2d; ; xn--7fb125cjv87a7xvz.xn--ss-zme7575xp0e; # Ⴉؙ𝆅.ß𐧦𐹳ݵ +ⴉ𝆅񔻅ؙ.ß𐧦𐹳ݵ; ; [B5, B6, P1, V6]; xn--7fb940rwt3z7xvz.xn--zca684a699vf2d; ; xn--7fb940rwt3z7xvz.xn--ss-zme7575xp0e; # ⴉؙ𝆅.ß𐧦𐹳ݵ +Ⴉ𝆅񔻅ؙ.SS𐧦𐹳ݵ; Ⴉ𝆅񔻅ؙ.ss𐧦𐹳ݵ; [B5, B6, P1, V6]; xn--7fb125cjv87a7xvz.xn--ss-zme7575xp0e; ; ; # Ⴉؙ𝆅.ss𐧦𐹳ݵ +ⴉ𝆅񔻅ؙ.ss𐧦𐹳ݵ; ; [B5, B6, P1, V6]; xn--7fb940rwt3z7xvz.xn--ss-zme7575xp0e; ; ; # ⴉؙ𝆅.ss𐧦𐹳ݵ +Ⴉ𝆅񔻅ؙ.Ss𐧦𐹳ݵ; Ⴉ𝆅񔻅ؙ.ss𐧦𐹳ݵ; [B5, B6, P1, V6]; xn--7fb125cjv87a7xvz.xn--ss-zme7575xp0e; ; ; # Ⴉؙ𝆅.ss𐧦𐹳ݵ +xn--7fb125cjv87a7xvz.xn--ss-zme7575xp0e; Ⴉ𝆅񔻅ؙ.ss𐧦𐹳ݵ; [B5, B6, V6]; xn--7fb125cjv87a7xvz.xn--ss-zme7575xp0e; ; ; # Ⴉؙ𝆅.ss𐧦𐹳ݵ +xn--7fb940rwt3z7xvz.xn--ss-zme7575xp0e; ⴉ𝆅񔻅ؙ.ss𐧦𐹳ݵ; [B5, B6, V6]; xn--7fb940rwt3z7xvz.xn--ss-zme7575xp0e; ; ; # ⴉؙ𝆅.ss𐧦𐹳ݵ +xn--7fb940rwt3z7xvz.xn--zca684a699vf2d; ⴉ𝆅񔻅ؙ.ß𐧦𐹳ݵ; [B5, B6, V6]; xn--7fb940rwt3z7xvz.xn--zca684a699vf2d; ; ; # ⴉؙ𝆅.ß𐧦𐹳ݵ +xn--7fb125cjv87a7xvz.xn--zca684a699vf2d; Ⴉ𝆅񔻅ؙ.ß𐧦𐹳ݵ; [B5, B6, V6]; xn--7fb125cjv87a7xvz.xn--zca684a699vf2d; ; ; # Ⴉؙ𝆅.ß𐧦𐹳ݵ +‍ك𐧾↙.񊽡; ; [B1, C2, P1, V6]; xn--fhb713k87ag053c.xn--7s4w; ; xn--fhb011lnp8n.xn--7s4w; [B3, P1, V6] # ك𐧾↙. +xn--fhb011lnp8n.xn--7s4w; ك𐧾↙.񊽡; [B3, V6]; xn--fhb011lnp8n.xn--7s4w; ; ; # ك𐧾↙. +xn--fhb713k87ag053c.xn--7s4w; ‍ك𐧾↙.񊽡; [B1, C2, V6]; xn--fhb713k87ag053c.xn--7s4w; ; ; # ك𐧾↙. +梉。‌; 梉.‌; [C1]; xn--7zv.xn--0ug; ; xn--7zv.; [] # 梉. +xn--7zv.; 梉.; ; xn--7zv.; ; ; # 梉. +梉.; ; ; xn--7zv.; ; ; # 梉. +xn--7zv.xn--0ug; 梉.‌; [C1]; xn--7zv.xn--0ug; ; ; # 梉. +ꡣ-≠.‍𞤗𐅢Ↄ; ꡣ-≠.‍𞤹𐅢Ↄ; [B1, B6, C2, P1, V6]; xn----ufo9661d.xn--1ug79cm620c71sh; ; xn----ufo9661d.xn--q5g0929fhm4f; [B2, B3, B6, P1, V6] # ꡣ-≠.𞤹𐅢Ↄ +ꡣ-≠.‍𞤗𐅢Ↄ; ꡣ-≠.‍𞤹𐅢Ↄ; [B1, B6, C2, P1, V6]; xn----ufo9661d.xn--1ug79cm620c71sh; ; xn----ufo9661d.xn--q5g0929fhm4f; [B2, B3, B6, P1, V6] # ꡣ-≠.𞤹𐅢Ↄ +ꡣ-≠.‍𞤹𐅢ↄ; ꡣ-≠.‍𞤹𐅢ↄ; [B1, B6, C2, P1, V6]; xn----ufo9661d.xn--1ug99cj620c71sh; ; xn----ufo9661d.xn--r5gy929fhm4f; [B2, B3, B6, P1, V6] # ꡣ-≠.𞤹𐅢ↄ +ꡣ-≠.‍𞤹𐅢ↄ; ; [B1, B6, C2, P1, V6]; xn----ufo9661d.xn--1ug99cj620c71sh; ; xn----ufo9661d.xn--r5gy929fhm4f; [B2, B3, B6, P1, V6] # ꡣ-≠.𞤹𐅢ↄ +ꡣ-≠.‍𞤗𐅢ↄ; ꡣ-≠.‍𞤹𐅢ↄ; [B1, B6, C2, P1, V6]; xn----ufo9661d.xn--1ug99cj620c71sh; ; xn----ufo9661d.xn--r5gy929fhm4f; [B2, B3, B6, P1, V6] # ꡣ-≠.𞤹𐅢ↄ +ꡣ-≠.‍𞤗𐅢ↄ; ꡣ-≠.‍𞤹𐅢ↄ; [B1, B6, C2, P1, V6]; xn----ufo9661d.xn--1ug99cj620c71sh; ; xn----ufo9661d.xn--r5gy929fhm4f; [B2, B3, B6, P1, V6] # ꡣ-≠.𞤹𐅢ↄ +xn----ufo9661d.xn--r5gy929fhm4f; ꡣ-≠.𞤹𐅢ↄ; [B2, B3, B6, V6]; xn----ufo9661d.xn--r5gy929fhm4f; ; ; # ꡣ-≠.𞤹𐅢ↄ +xn----ufo9661d.xn--1ug99cj620c71sh; ꡣ-≠.‍𞤹𐅢ↄ; [B1, B6, C2, V6]; xn----ufo9661d.xn--1ug99cj620c71sh; ; ; # ꡣ-≠.𞤹𐅢ↄ +xn----ufo9661d.xn--q5g0929fhm4f; ꡣ-≠.𞤹𐅢Ↄ; [B2, B3, B6, V6]; xn----ufo9661d.xn--q5g0929fhm4f; ; ; # ꡣ-≠.𞤹𐅢Ↄ +xn----ufo9661d.xn--1ug79cm620c71sh; ꡣ-≠.‍𞤹𐅢Ↄ; [B1, B6, C2, V6]; xn----ufo9661d.xn--1ug79cm620c71sh; ; ; # ꡣ-≠.𞤹𐅢Ↄ +ς⒐𝆫⸵。𐱢🄊𝟳; ς⒐𝆫⸵.𐱢🄊7; [B6, P1, V6]; xn--3xa019nwtghi25b.xn--7-075iy877c; ; xn--4xa809nwtghi25b.xn--7-075iy877c; # ς⒐𝆫⸵.🄊7 +ς9.𝆫⸵。𐱢9,7; ς9.𝆫⸵.𐱢9,7; [B1, P1, V5, V6]; xn--9-xmb.xn--ltj1535k.xn--9,7-r67t; ; xn--9-zmb.xn--ltj1535k.xn--9,7-r67t; # ς9.𝆫⸵.9,7 +Σ9.𝆫⸵。𐱢9,7; σ9.𝆫⸵.𐱢9,7; [B1, P1, V5, V6]; xn--9-zmb.xn--ltj1535k.xn--9,7-r67t; ; ; # σ9.𝆫⸵.9,7 +σ9.𝆫⸵。𐱢9,7; σ9.𝆫⸵.𐱢9,7; [B1, P1, V5, V6]; xn--9-zmb.xn--ltj1535k.xn--9,7-r67t; ; ; # σ9.𝆫⸵.9,7 +xn--9-zmb.xn--ltj1535k.xn--9,7-r67t; σ9.𝆫⸵.𐱢9,7; [B1, P1, V5, V6]; xn--9-zmb.xn--ltj1535k.xn--9,7-r67t; ; ; # σ9.𝆫⸵.9,7 +xn--9-xmb.xn--ltj1535k.xn--9,7-r67t; ς9.𝆫⸵.𐱢9,7; [B1, P1, V5, V6]; xn--9-xmb.xn--ltj1535k.xn--9,7-r67t; ; ; # ς9.𝆫⸵.9,7 +Σ⒐𝆫⸵。𐱢🄊𝟳; σ⒐𝆫⸵.𐱢🄊7; [B6, P1, V6]; xn--4xa809nwtghi25b.xn--7-075iy877c; ; ; # σ⒐𝆫⸵.🄊7 +σ⒐𝆫⸵。𐱢🄊𝟳; σ⒐𝆫⸵.𐱢🄊7; [B6, P1, V6]; xn--4xa809nwtghi25b.xn--7-075iy877c; ; ; # σ⒐𝆫⸵.🄊7 +xn--4xa809nwtghi25b.xn--7-075iy877c; σ⒐𝆫⸵.𐱢🄊7; [B6, V6]; xn--4xa809nwtghi25b.xn--7-075iy877c; ; ; # σ⒐𝆫⸵.🄊7 +xn--3xa019nwtghi25b.xn--7-075iy877c; ς⒐𝆫⸵.𐱢🄊7; [B6, V6]; xn--3xa019nwtghi25b.xn--7-075iy877c; ; ; # ς⒐𝆫⸵.🄊7 +ࡓ.‌ß; ࡓ.‌ß; [B1, C1]; xn--iwb.xn--zca570n; ; xn--iwb.ss; [] # ࡓ.ß +ࡓ.‌ß; ; [B1, C1]; xn--iwb.xn--zca570n; ; xn--iwb.ss; [] # ࡓ.ß +ࡓ.‌SS; ࡓ.‌ss; [B1, C1]; xn--iwb.xn--ss-i1t; ; xn--iwb.ss; [] # ࡓ.ss +ࡓ.‌ss; ; [B1, C1]; xn--iwb.xn--ss-i1t; ; xn--iwb.ss; [] # ࡓ.ss +xn--iwb.ss; ࡓ.ss; ; xn--iwb.ss; ; ; # ࡓ.ss +ࡓ.ss; ; ; xn--iwb.ss; ; ; # ࡓ.ss +ࡓ.SS; ࡓ.ss; ; xn--iwb.ss; ; ; # ࡓ.ss +xn--iwb.xn--ss-i1t; ࡓ.‌ss; [B1, C1]; xn--iwb.xn--ss-i1t; ; ; # ࡓ.ss +xn--iwb.xn--zca570n; ࡓ.‌ß; [B1, C1]; xn--iwb.xn--zca570n; ; ; # ࡓ.ß +ࡓ.‌SS; ࡓ.‌ss; [B1, C1]; xn--iwb.xn--ss-i1t; ; xn--iwb.ss; [] # ࡓ.ss +ࡓ.‌ss; ࡓ.‌ss; [B1, C1]; xn--iwb.xn--ss-i1t; ; xn--iwb.ss; [] # ࡓ.ss +ࡓ.‌Ss; ࡓ.‌ss; [B1, C1]; xn--iwb.xn--ss-i1t; ; xn--iwb.ss; [] # ࡓ.ss +ࡓ.‌Ss; ࡓ.‌ss; [B1, C1]; xn--iwb.xn--ss-i1t; ; xn--iwb.ss; [] # ࡓ.ss +񯶣-.‍ݎꥍ󠻨; ; [B1, B6, C2, P1, V3, V6]; xn----s116e.xn--1ob387jy90hq459k; ; xn----s116e.xn--1ob6504fmf40i; [B3, B6, P1, V3, V6] # -.ݎꥍ +xn----s116e.xn--1ob6504fmf40i; 񯶣-.ݎꥍ󠻨; [B3, B6, V3, V6]; xn----s116e.xn--1ob6504fmf40i; ; ; # -.ݎꥍ +xn----s116e.xn--1ob387jy90hq459k; 񯶣-.‍ݎꥍ󠻨; [B1, B6, C2, V3, V6]; xn----s116e.xn--1ob387jy90hq459k; ; ; # -.ݎꥍ +䃚蟥-。-񽒘⒈; 䃚蟥-.-񽒘⒈; [P1, V3, V6]; xn----n50a258u.xn----ecp33805f; ; ; # 䃚蟥-.-⒈ +䃚蟥-。-񽒘1.; 䃚蟥-.-񽒘1.; [P1, V3, V6]; xn----n50a258u.xn---1-up07j.; ; ; # 䃚蟥-.-1. +xn----n50a258u.xn---1-up07j.; 䃚蟥-.-񽒘1.; [V3, V6]; xn----n50a258u.xn---1-up07j.; ; ; # 䃚蟥-.-1. +xn----n50a258u.xn----ecp33805f; 䃚蟥-.-񽒘⒈; [V3, V6]; xn----n50a258u.xn----ecp33805f; ; ; # 䃚蟥-.-⒈ +𐹸䚵-ꡡ。⺇; 𐹸䚵-ꡡ.⺇; [B1]; xn----bm3an932a1l5d.xn--xvj; ; ; # 𐹸䚵-ꡡ.⺇ +xn----bm3an932a1l5d.xn--xvj; 𐹸䚵-ꡡ.⺇; [B1]; xn----bm3an932a1l5d.xn--xvj; ; ; # 𐹸䚵-ꡡ.⺇ +𑄳。᫜𐹻; 𑄳.᫜𐹻; [B1, B3, B5, B6, P1, V5, V6]; xn--v80d.xn--2rf1154i; ; ; # 𑄳.𐹻 +xn--v80d.xn--2rf1154i; 𑄳.᫜𐹻; [B1, B3, B5, B6, V5, V6]; xn--v80d.xn--2rf1154i; ; ; # 𑄳.𐹻 +≮𐹻.⒎𑂵ں؂; ; [B1, P1, V6]; xn--gdhx904g.xn--kfb18a325efm3s; ; ; # ≮𐹻.⒎𑂵ں +≮𐹻.⒎𑂵ں؂; ≮𐹻.⒎𑂵ں؂; [B1, P1, V6]; xn--gdhx904g.xn--kfb18a325efm3s; ; ; # ≮𐹻.⒎𑂵ں +≮𐹻.7.𑂵ں؂; ; [B1, P1, V5, V6]; xn--gdhx904g.7.xn--kfb18an307d; ; ; # ≮𐹻.7.𑂵ں +≮𐹻.7.𑂵ں؂; ≮𐹻.7.𑂵ں؂; [B1, P1, V5, V6]; xn--gdhx904g.7.xn--kfb18an307d; ; ; # ≮𐹻.7.𑂵ں +xn--gdhx904g.7.xn--kfb18an307d; ≮𐹻.7.𑂵ں؂; [B1, V5, V6]; xn--gdhx904g.7.xn--kfb18an307d; ; ; # ≮𐹻.7.𑂵ں +xn--gdhx904g.xn--kfb18a325efm3s; ≮𐹻.⒎𑂵ں؂; [B1, V6]; xn--gdhx904g.xn--kfb18a325efm3s; ; ; # ≮𐹻.⒎𑂵ں +ᢔ≠􋉂.‍𐋢; ; [C2, P1, V6]; xn--ebf031cf7196a.xn--1ug9540g; ; xn--ebf031cf7196a.xn--587c; [P1, V6] # ᢔ≠.𐋢 +ᢔ≠􋉂.‍𐋢; ᢔ≠􋉂.‍𐋢; [C2, P1, V6]; xn--ebf031cf7196a.xn--1ug9540g; ; xn--ebf031cf7196a.xn--587c; [P1, V6] # ᢔ≠.𐋢 +xn--ebf031cf7196a.xn--587c; ᢔ≠􋉂.𐋢; [V6]; xn--ebf031cf7196a.xn--587c; ; ; # ᢔ≠.𐋢 +xn--ebf031cf7196a.xn--1ug9540g; ᢔ≠􋉂.‍𐋢; [C2, V6]; xn--ebf031cf7196a.xn--1ug9540g; ; ; # ᢔ≠.𐋢 +𐩁≮񣊛≯.٬𞵕⳿; 𐩁≮񣊛≯.٬𞵕⳿; [B1, B2, B3, P1, V6]; xn--gdhc0519o0y27b.xn--lib468q0d21a; ; ; # 𐩁≮≯.٬⳿ +𐩁≮񣊛≯.٬𞵕⳿; 𐩁≮񣊛≯.٬𞵕⳿; [B1, B2, B3, P1, V6]; xn--gdhc0519o0y27b.xn--lib468q0d21a; ; ; # 𐩁≮≯.٬⳿ +𐩁≮񣊛≯.٬𞵕⳿; ; [B1, B2, B3, P1, V6]; xn--gdhc0519o0y27b.xn--lib468q0d21a; ; ; # 𐩁≮≯.٬⳿ +𐩁≮񣊛≯.٬𞵕⳿; 𐩁≮񣊛≯.٬𞵕⳿; [B1, B2, B3, P1, V6]; xn--gdhc0519o0y27b.xn--lib468q0d21a; ; ; # 𐩁≮≯.٬⳿ +xn--gdhc0519o0y27b.xn--lib468q0d21a; 𐩁≮񣊛≯.٬𞵕⳿; [B1, B2, B3, V6]; xn--gdhc0519o0y27b.xn--lib468q0d21a; ; ; # 𐩁≮≯.٬⳿ +-。⺐; -.⺐; [V3]; -.xn--6vj; ; ; # -.⺐ +-。⺐; -.⺐; [V3]; -.xn--6vj; ; ; # -.⺐ +-.xn--6vj; -.⺐; [V3]; -.xn--6vj; ; ; # -.⺐ +󠰩𑲬.ٜ; 󠰩𑲬.ٜ; [P1, V5, V6]; xn--sn3d59267c.xn--4hb; ; ; # 𑲬.ٜ +󠰩𑲬.ٜ; ; [P1, V5, V6]; xn--sn3d59267c.xn--4hb; ; ; # 𑲬.ٜ +xn--sn3d59267c.xn--4hb; 󠰩𑲬.ٜ; [V5, V6]; xn--sn3d59267c.xn--4hb; ; ; # 𑲬.ٜ +𐍺.񚇃‌; ; [C1, P1, V5, V6]; xn--ie8c.xn--0ug03366c; ; xn--ie8c.xn--2g51a; [P1, V5, V6] # 𐍺. +xn--ie8c.xn--2g51a; 𐍺.񚇃; [V5, V6]; xn--ie8c.xn--2g51a; ; ; # 𐍺. +xn--ie8c.xn--0ug03366c; 𐍺.񚇃‌; [C1, V5, V6]; xn--ie8c.xn--0ug03366c; ; ; # 𐍺. +ؽۣ.𐨎; ; [B1, B3, B6, V5]; xn--8gb64a.xn--mr9c; ; ; # ؽۣ.𐨎 +xn--8gb64a.xn--mr9c; ؽۣ.𐨎; [B1, B3, B6, V5]; xn--8gb64a.xn--mr9c; ; ; # ؽۣ.𐨎 +漦Ⴙς.񡻀𐴄; ; [B5, B6, P1, V6]; xn--3xa157d717e.xn--9d0d3162t; ; xn--4xa947d717e.xn--9d0d3162t; # 漦Ⴙς.𐴄 +漦ⴙς.񡻀𐴄; ; [B5, B6, P1, V6]; xn--3xa972sl47b.xn--9d0d3162t; ; xn--4xa772sl47b.xn--9d0d3162t; # 漦ⴙς.𐴄 +漦ႹΣ.񡻀𐴄; 漦Ⴙσ.񡻀𐴄; [B5, B6, P1, V6]; xn--4xa947d717e.xn--9d0d3162t; ; ; # 漦Ⴙσ.𐴄 +漦ⴙσ.񡻀𐴄; ; [B5, B6, P1, V6]; xn--4xa772sl47b.xn--9d0d3162t; ; ; # 漦ⴙσ.𐴄 +漦Ⴙσ.񡻀𐴄; ; [B5, B6, P1, V6]; xn--4xa947d717e.xn--9d0d3162t; ; ; # 漦Ⴙσ.𐴄 +xn--4xa947d717e.xn--9d0d3162t; 漦Ⴙσ.񡻀𐴄; [B5, B6, V6]; xn--4xa947d717e.xn--9d0d3162t; ; ; # 漦Ⴙσ.𐴄 +xn--4xa772sl47b.xn--9d0d3162t; 漦ⴙσ.񡻀𐴄; [B5, B6, V6]; xn--4xa772sl47b.xn--9d0d3162t; ; ; # 漦ⴙσ.𐴄 +xn--3xa972sl47b.xn--9d0d3162t; 漦ⴙς.񡻀𐴄; [B5, B6, V6]; xn--3xa972sl47b.xn--9d0d3162t; ; ; # 漦ⴙς.𐴄 +xn--3xa157d717e.xn--9d0d3162t; 漦Ⴙς.񡻀𐴄; [B5, B6, V6]; xn--3xa157d717e.xn--9d0d3162t; ; ; # 漦Ⴙς.𐴄 +𐹫踧್򫚇.󜀃⒈𝨤; ; [B1, P1, V6]; xn--8tc1437dro0d6q06h.xn--tsh2611ncu71e; ; ; # 𐹫踧್.⒈𝨤 +𐹫踧್򫚇.󜀃1.𝨤; ; [B1, B3, B6, P1, V5, V6]; xn--8tc1437dro0d6q06h.xn--1-p948l.xn--m82h; ; ; # 𐹫踧್.1.𝨤 +xn--8tc1437dro0d6q06h.xn--1-p948l.xn--m82h; 𐹫踧್򫚇.󜀃1.𝨤; [B1, B3, B6, V5, V6]; xn--8tc1437dro0d6q06h.xn--1-p948l.xn--m82h; ; ; # 𐹫踧್.1.𝨤 +xn--8tc1437dro0d6q06h.xn--tsh2611ncu71e; 𐹫踧್򫚇.󜀃⒈𝨤; [B1, V6]; xn--8tc1437dro0d6q06h.xn--tsh2611ncu71e; ; ; # 𐹫踧್.⒈𝨤 +‍≮.󠟪𹫏-; ‍≮.󠟪𹫏-; [C2, P1, V3, V6]; xn--1ug95g.xn----cr99a1w710b; ; xn--gdh.xn----cr99a1w710b; [P1, V3, V6] # ≮.- +‍≮.󠟪𹫏-; ‍≮.󠟪𹫏-; [C2, P1, V3, V6]; xn--1ug95g.xn----cr99a1w710b; ; xn--gdh.xn----cr99a1w710b; [P1, V3, V6] # ≮.- +‍≮.󠟪𹫏-; ; [C2, P1, V3, V6]; xn--1ug95g.xn----cr99a1w710b; ; xn--gdh.xn----cr99a1w710b; [P1, V3, V6] # ≮.- +‍≮.󠟪𹫏-; ‍≮.󠟪𹫏-; [C2, P1, V3, V6]; xn--1ug95g.xn----cr99a1w710b; ; xn--gdh.xn----cr99a1w710b; [P1, V3, V6] # ≮.- +xn--gdh.xn----cr99a1w710b; ≮.󠟪𹫏-; [V3, V6]; xn--gdh.xn----cr99a1w710b; ; ; # ≮.- +xn--1ug95g.xn----cr99a1w710b; ‍≮.󠟪𹫏-; [C2, V3, V6]; xn--1ug95g.xn----cr99a1w710b; ; ; # ≮.- +‍‍襔。Ⴜ5ꡮ񵝏; ‍‍襔.Ⴜ5ꡮ񵝏; [C2, P1, V6]; xn--1uga7691f.xn--5-r1g7167ipfw8d; ; xn--2u2a.xn--5-r1g7167ipfw8d; [P1, V6] # 襔.Ⴜ5ꡮ +‍‍襔。ⴜ5ꡮ񵝏; ‍‍襔.ⴜ5ꡮ񵝏; [C2, P1, V6]; xn--1uga7691f.xn--5-uws5848bpf44e; ; xn--2u2a.xn--5-uws5848bpf44e; [P1, V6] # 襔.ⴜ5ꡮ +xn--2u2a.xn--5-uws5848bpf44e; 襔.ⴜ5ꡮ񵝏; [V6]; xn--2u2a.xn--5-uws5848bpf44e; ; ; # 襔.ⴜ5ꡮ +xn--1uga7691f.xn--5-uws5848bpf44e; ‍‍襔.ⴜ5ꡮ񵝏; [C2, V6]; xn--1uga7691f.xn--5-uws5848bpf44e; ; ; # 襔.ⴜ5ꡮ +xn--2u2a.xn--5-r1g7167ipfw8d; 襔.Ⴜ5ꡮ񵝏; [V6]; xn--2u2a.xn--5-r1g7167ipfw8d; ; ; # 襔.Ⴜ5ꡮ +xn--1uga7691f.xn--5-r1g7167ipfw8d; ‍‍襔.Ⴜ5ꡮ񵝏; [C2, V6]; xn--1uga7691f.xn--5-r1g7167ipfw8d; ; ; # 襔.Ⴜ5ꡮ +𐫜𑌼‍.婀; 𐫜𑌼‍.婀; [B3, C2]; xn--1ugx063g1if.xn--q0s; ; xn--ix9c26l.xn--q0s; [] # 𐫜𑌼.婀 +𐫜𑌼‍.婀; ; [B3, C2]; xn--1ugx063g1if.xn--q0s; ; xn--ix9c26l.xn--q0s; [] # 𐫜𑌼.婀 +xn--ix9c26l.xn--q0s; 𐫜𑌼.婀; ; xn--ix9c26l.xn--q0s; ; ; # 𐫜𑌼.婀 +𐫜𑌼.婀; ; ; xn--ix9c26l.xn--q0s; ; ; # 𐫜𑌼.婀 +xn--1ugx063g1if.xn--q0s; 𐫜𑌼‍.婀; [B3, C2]; xn--1ugx063g1if.xn--q0s; ; ; # 𐫜𑌼.婀 +󠅽︒︒𐹯。⬳᩸; ︒︒𐹯.⬳᩸; [B1, P1, V6]; xn--y86ca186j.xn--7of309e; ; ; # ︒︒𐹯.⬳᩸ +󠅽。。𐹯。⬳᩸; ..𐹯.⬳᩸; [B1, X4_2]; ..xn--no0d.xn--7of309e; [B1, A4_2]; ; # ..𐹯.⬳᩸ +..xn--no0d.xn--7of309e; ..𐹯.⬳᩸; [B1, X4_2]; ..xn--no0d.xn--7of309e; [B1, A4_2]; ; # ..𐹯.⬳᩸ +xn--y86ca186j.xn--7of309e; ︒︒𐹯.⬳᩸; [B1, V6]; xn--y86ca186j.xn--7of309e; ; ; # ︒︒𐹯.⬳᩸ +𝟖ß.󠄐-?Ⴏ; 8ß.-?Ⴏ; [P1, V3, V6]; xn--8-qfa.-?Ⴏ; [P1, V3, V6, A3]; 8ss.-?Ⴏ; # 8ß.-Ⴏ +8ß.󠄐-?Ⴏ; 8ß.-?Ⴏ; [P1, V3, V6]; xn--8-qfa.-?Ⴏ; [P1, V3, V6, A3]; 8ss.-?Ⴏ; # 8ß.-Ⴏ +8ß.󠄐-?ⴏ; 8ß.-?ⴏ; [P1, V3, V6]; xn--8-qfa.-?ⴏ; [P1, V3, V6, A3]; 8ss.-?ⴏ; # 8ß.-ⴏ +8SS.󠄐-?Ⴏ; 8ss.-?Ⴏ; [P1, V3, V6]; ; [P1, V3, V6, A3]; ; # 8ss.-Ⴏ +8ss.󠄐-?ⴏ; 8ss.-?ⴏ; [P1, V3, V6]; ; [P1, V3, V6, A3]; ; # 8ss.-ⴏ +8ss.󠄐-?Ⴏ; 8ss.-?Ⴏ; [P1, V3, V6]; ; [P1, V3, V6, A3]; ; # 8ss.-Ⴏ +8ss.-?Ⴏ; ; [P1, V3, V6]; ; [P1, V3, V6, A3]; ; # 8ss.-Ⴏ +8ss.-?ⴏ; ; [P1, V3, V6]; ; [P1, V3, V6, A3]; ; # 8ss.-ⴏ +8SS.-?Ⴏ; 8ss.-?Ⴏ; [P1, V3, V6]; ; [P1, V3, V6, A3]; ; # 8ss.-Ⴏ +xn--8-qfa.-?ⴏ; 8ß.-?ⴏ; [P1, V3, V6]; xn--8-qfa.-?ⴏ; [P1, V3, V6, A3]; ; # 8ß.-ⴏ +XN--8-QFA.-?Ⴏ; 8ß.-?Ⴏ; [P1, V3, V6]; xn--8-qfa.-?Ⴏ; [P1, V3, V6, A3]; ; # 8ß.-Ⴏ +Xn--8-Qfa.-?Ⴏ; 8ß.-?Ⴏ; [P1, V3, V6]; xn--8-qfa.-?Ⴏ; [P1, V3, V6, A3]; ; # 8ß.-Ⴏ +xn--8-qfa.-?Ⴏ; 8ß.-?Ⴏ; [P1, V3, V6]; xn--8-qfa.-?Ⴏ; [P1, V3, V6, A3]; ; # 8ß.-Ⴏ +𝟖ß.󠄐-?ⴏ; 8ß.-?ⴏ; [P1, V3, V6]; xn--8-qfa.-?ⴏ; [P1, V3, V6, A3]; 8ss.-?ⴏ; # 8ß.-ⴏ +𝟖SS.󠄐-?Ⴏ; 8ss.-?Ⴏ; [P1, V3, V6]; ; [P1, V3, V6, A3]; ; # 8ss.-Ⴏ +𝟖ss.󠄐-?ⴏ; 8ss.-?ⴏ; [P1, V3, V6]; ; [P1, V3, V6, A3]; ; # 8ss.-ⴏ +𝟖ss.󠄐-?Ⴏ; 8ss.-?Ⴏ; [P1, V3, V6]; ; [P1, V3, V6, A3]; ; # 8ss.-Ⴏ +𝟖Ss.󠄐-?Ⴏ; 8ss.-?Ⴏ; [P1, V3, V6]; ; [P1, V3, V6, A3]; ; # 8ss.-Ⴏ +8Ss.󠄐-?Ⴏ; 8ss.-?Ⴏ; [P1, V3, V6]; ; [P1, V3, V6, A3]; ; # 8ss.-Ⴏ +-‍󠋟.‌𐹣Ⴅ; ; [B1, C1, C2, P1, V3, V6]; xn----ugnv7071n.xn--dnd999e4j4p; ; xn----s721m.xn--dnd9201k; [B1, P1, V3, V6] # -.𐹣Ⴅ +-‍󠋟.‌𐹣ⴅ; ; [B1, C1, C2, P1, V3, V6]; xn----ugnv7071n.xn--0ugz32cgr0p; ; xn----s721m.xn--wkj1423e; [B1, P1, V3, V6] # -.𐹣ⴅ +xn----s721m.xn--wkj1423e; -󠋟.𐹣ⴅ; [B1, V3, V6]; xn----s721m.xn--wkj1423e; ; ; # -.𐹣ⴅ +xn----ugnv7071n.xn--0ugz32cgr0p; -‍󠋟.‌𐹣ⴅ; [B1, C1, C2, V3, V6]; xn----ugnv7071n.xn--0ugz32cgr0p; ; ; # -.𐹣ⴅ +xn----s721m.xn--dnd9201k; -󠋟.𐹣Ⴅ; [B1, V3, V6]; xn----s721m.xn--dnd9201k; ; ; # -.𐹣Ⴅ +xn----ugnv7071n.xn--dnd999e4j4p; -‍󠋟.‌𐹣Ⴅ; [B1, C1, C2, V3, V6]; xn----ugnv7071n.xn--dnd999e4j4p; ; ; # -.𐹣Ⴅ +ꦹ‍큷𻶡。₂; ꦹ‍큷𻶡.2; [C2, P1, V5, V6]; xn--1ug1435cfkyaoi04d.2; ; xn--0m9as84e2e21c.2; [P1, V5, V6] # ꦹ큷.2 +ꦹ‍큷𻶡。₂; ꦹ‍큷𻶡.2; [C2, P1, V5, V6]; xn--1ug1435cfkyaoi04d.2; ; xn--0m9as84e2e21c.2; [P1, V5, V6] # ꦹ큷.2 +ꦹ‍큷𻶡。2; ꦹ‍큷𻶡.2; [C2, P1, V5, V6]; xn--1ug1435cfkyaoi04d.2; ; xn--0m9as84e2e21c.2; [P1, V5, V6] # ꦹ큷.2 +ꦹ‍큷𻶡。2; ꦹ‍큷𻶡.2; [C2, P1, V5, V6]; xn--1ug1435cfkyaoi04d.2; ; xn--0m9as84e2e21c.2; [P1, V5, V6] # ꦹ큷.2 +xn--0m9as84e2e21c.2; ꦹ큷𻶡.2; [V5, V6]; xn--0m9as84e2e21c.2; ; ; # ꦹ큷.2 +xn--1ug1435cfkyaoi04d.2; ꦹ‍큷𻶡.2; [C2, V5, V6]; xn--1ug1435cfkyaoi04d.2; ; ; # ꦹ큷.2 +?.🄄𞯘; ; [B1, P1, V6]; ?.xn--3x6hx6f; [B1, P1, V6, A3]; ; # .🄄 +?.3,𞯘; ; [B1, P1, V6]; ?.xn--3,-tb22a; [B1, P1, V6, A3]; ; # .3, +?.xn--3,-tb22a; ?.3,𞯘; [B1, P1, V6]; ?.xn--3,-tb22a; [B1, P1, V6, A3]; ; # .3, +?.XN--3,-TB22A; ?.3,𞯘; [B1, P1, V6]; ?.xn--3,-tb22a; [B1, P1, V6, A3]; ; # .3, +?.Xn--3,-Tb22a; ?.3,𞯘; [B1, P1, V6]; ?.xn--3,-tb22a; [B1, P1, V6, A3]; ; # .3, +?.xn--3x6hx6f; ?.🄄𞯘; [B1, P1, V6]; ?.xn--3x6hx6f; [B1, P1, V6, A3]; ; # .🄄 +?.XN--3X6HX6F; ?.🄄𞯘; [B1, P1, V6]; ?.xn--3x6hx6f; [B1, P1, V6, A3]; ; # .🄄 +?.Xn--3x6hx6f; ?.🄄𞯘; [B1, P1, V6]; ?.xn--3x6hx6f; [B1, P1, V6, A3]; ; # .🄄 +𝨖𐩙。۝󀡶ꣅ⒈; 𝨖𐩙.۝󀡶ꣅ⒈; [B1, P1, V5, V6]; xn--rt9cl956a.xn--tlb403mxv4g06s9i; ; ; # 𝨖.ꣅ⒈ +𝨖𐩙。۝󀡶ꣅ1.; 𝨖𐩙.۝󀡶ꣅ1.; [B1, P1, V5, V6]; xn--rt9cl956a.xn--1-dxc8545j0693i.; ; ; # 𝨖.ꣅ1. +xn--rt9cl956a.xn--1-dxc8545j0693i.; 𝨖𐩙.۝󀡶ꣅ1.; [B1, V5, V6]; xn--rt9cl956a.xn--1-dxc8545j0693i.; ; ; # 𝨖.ꣅ1. +xn--rt9cl956a.xn--tlb403mxv4g06s9i; 𝨖𐩙.۝󀡶ꣅ⒈; [B1, V5, V6]; xn--rt9cl956a.xn--tlb403mxv4g06s9i; ; ; # 𝨖.ꣅ⒈ +򒈣סڸ。Ⴈ‍; 򒈣סڸ.Ⴈ‍; [B5, B6, C2, P1, V6]; xn--meb44b57607c.xn--gnd699e; ; xn--meb44b57607c.xn--gnd; [B5, B6, P1, V6] # סڸ.Ⴈ +򒈣סڸ。ⴈ‍; 򒈣סڸ.ⴈ‍; [B5, B6, C2, P1, V6]; xn--meb44b57607c.xn--1ug232c; ; xn--meb44b57607c.xn--zkj; [B5, B6, P1, V6] # סڸ.ⴈ +xn--meb44b57607c.xn--zkj; 򒈣סڸ.ⴈ; [B5, B6, V6]; xn--meb44b57607c.xn--zkj; ; ; # סڸ.ⴈ +xn--meb44b57607c.xn--1ug232c; 򒈣סڸ.ⴈ‍; [B5, B6, C2, V6]; xn--meb44b57607c.xn--1ug232c; ; ; # סڸ.ⴈ +xn--meb44b57607c.xn--gnd; 򒈣סڸ.Ⴈ; [B5, B6, V6]; xn--meb44b57607c.xn--gnd; ; ; # סڸ.Ⴈ +xn--meb44b57607c.xn--gnd699e; 򒈣סڸ.Ⴈ‍; [B5, B6, C2, V6]; xn--meb44b57607c.xn--gnd699e; ; ; # סڸ.Ⴈ +󀚶𝨱ߦ⒈.𑗝髯‌; 󀚶𝨱ߦ⒈.𑗝髯‌; [B1, B5, C1, P1, V5, V6]; xn--etb477lq931a1f58e.xn--0ugx259bocxd; ; xn--etb477lq931a1f58e.xn--uj6at43v; [B1, B5, P1, V5, V6] # 𝨱ߦ⒈.𑗝髯 +󀚶𝨱ߦ1..𑗝髯‌; ; [B1, B5, C1, P1, V5, V6, X4_2]; xn--1-idd62296a1fr6e..xn--0ugx259bocxd; [B1, B5, C1, P1, V5, V6, A4_2]; xn--1-idd62296a1fr6e..xn--uj6at43v; [B1, B5, P1, V5, V6, A4_2] # 𝨱ߦ1..𑗝髯 +xn--1-idd62296a1fr6e..xn--uj6at43v; 󀚶𝨱ߦ1..𑗝髯; [B1, B5, V5, V6, X4_2]; xn--1-idd62296a1fr6e..xn--uj6at43v; [B1, B5, V5, V6, A4_2]; ; # 𝨱ߦ1..𑗝髯 +xn--1-idd62296a1fr6e..xn--0ugx259bocxd; 󀚶𝨱ߦ1..𑗝髯‌; [B1, B5, C1, V5, V6, X4_2]; xn--1-idd62296a1fr6e..xn--0ugx259bocxd; [B1, B5, C1, V5, V6, A4_2]; ; # 𝨱ߦ1..𑗝髯 +xn--etb477lq931a1f58e.xn--uj6at43v; 󀚶𝨱ߦ⒈.𑗝髯; [B1, B5, V5, V6]; xn--etb477lq931a1f58e.xn--uj6at43v; ; ; # 𝨱ߦ⒈.𑗝髯 +xn--etb477lq931a1f58e.xn--0ugx259bocxd; 󀚶𝨱ߦ⒈.𑗝髯‌; [B1, B5, C1, V5, V6]; xn--etb477lq931a1f58e.xn--0ugx259bocxd; ; ; # 𝨱ߦ⒈.𑗝髯 +𐫀.ډ𑌀; 𐫀.ډ𑌀; ; xn--pw9c.xn--fjb8658k; ; ; # 𐫀.ډ𑌀 +𐫀.ډ𑌀; ; ; xn--pw9c.xn--fjb8658k; ; ; # 𐫀.ډ𑌀 +xn--pw9c.xn--fjb8658k; 𐫀.ډ𑌀; ; xn--pw9c.xn--fjb8658k; ; ; # 𐫀.ډ𑌀 +𑋪.𐳝; 𑋪.𐳝; [B1, B3, B6, V5]; xn--fm1d.xn--5c0d; ; ; # 𑋪.𐳝 +𑋪.𐳝; ; [B1, B3, B6, V5]; xn--fm1d.xn--5c0d; ; ; # 𑋪.𐳝 +𑋪.𐲝; 𑋪.𐳝; [B1, B3, B6, V5]; xn--fm1d.xn--5c0d; ; ; # 𑋪.𐳝 +xn--fm1d.xn--5c0d; 𑋪.𐳝; [B1, B3, B6, V5]; xn--fm1d.xn--5c0d; ; ; # 𑋪.𐳝 +𑋪.𐲝; 𑋪.𐳝; [B1, B3, B6, V5]; xn--fm1d.xn--5c0d; ; ; # 𑋪.𐳝 +≠膣。ྃ; ≠膣.ྃ; [P1, V5, V6]; xn--1chy468a.xn--2ed; ; ; # ≠膣.ྃ +≠膣。ྃ; ≠膣.ྃ; [P1, V5, V6]; xn--1chy468a.xn--2ed; ; ; # ≠膣.ྃ +xn--1chy468a.xn--2ed; ≠膣.ྃ; [V5, V6]; xn--1chy468a.xn--2ed; ; ; # ≠膣.ྃ +񰀎-ݽ。ß; 񰀎-ݽ.ß; [B5, B6, P1, V6]; xn----j6c95618k.xn--zca; ; xn----j6c95618k.ss; # -ݽ.ß +񰀎-ݽ。ß; 񰀎-ݽ.ß; [B5, B6, P1, V6]; xn----j6c95618k.xn--zca; ; xn----j6c95618k.ss; # -ݽ.ß +񰀎-ݽ。SS; 񰀎-ݽ.ss; [B5, B6, P1, V6]; xn----j6c95618k.ss; ; ; # -ݽ.ss +񰀎-ݽ。ss; 񰀎-ݽ.ss; [B5, B6, P1, V6]; xn----j6c95618k.ss; ; ; # -ݽ.ss +񰀎-ݽ。Ss; 񰀎-ݽ.ss; [B5, B6, P1, V6]; xn----j6c95618k.ss; ; ; # -ݽ.ss +xn----j6c95618k.ss; 񰀎-ݽ.ss; [B5, B6, V6]; xn----j6c95618k.ss; ; ; # -ݽ.ss +xn----j6c95618k.xn--zca; 񰀎-ݽ.ß; [B5, B6, V6]; xn----j6c95618k.xn--zca; ; ; # -ݽ.ß +񰀎-ݽ。SS; 񰀎-ݽ.ss; [B5, B6, P1, V6]; xn----j6c95618k.ss; ; ; # -ݽ.ss +񰀎-ݽ。ss; 񰀎-ݽ.ss; [B5, B6, P1, V6]; xn----j6c95618k.ss; ; ; # -ݽ.ss +񰀎-ݽ。Ss; 񰀎-ݽ.ss; [B5, B6, P1, V6]; xn----j6c95618k.ss; ; ; # -ݽ.ss +ς𐹠ᡚ𑄳.⾭𐹽𽐖𐫜; ς𐹠ᡚ𑄳.靑𐹽𽐖𐫜; [B5, B6, P1, V6]; xn--3xa856hp23pxmc.xn--es5a888tvjc2u15h; ; xn--4xa656hp23pxmc.xn--es5a888tvjc2u15h; # ς𐹠ᡚ𑄳.靑𐹽𐫜 +ς𐹠ᡚ𑄳.靑𐹽𽐖𐫜; ; [B5, B6, P1, V6]; xn--3xa856hp23pxmc.xn--es5a888tvjc2u15h; ; xn--4xa656hp23pxmc.xn--es5a888tvjc2u15h; # ς𐹠ᡚ𑄳.靑𐹽𐫜 +Σ𐹠ᡚ𑄳.靑𐹽𽐖𐫜; σ𐹠ᡚ𑄳.靑𐹽𽐖𐫜; [B5, B6, P1, V6]; xn--4xa656hp23pxmc.xn--es5a888tvjc2u15h; ; ; # σ𐹠ᡚ𑄳.靑𐹽𐫜 +σ𐹠ᡚ𑄳.靑𐹽𽐖𐫜; ; [B5, B6, P1, V6]; xn--4xa656hp23pxmc.xn--es5a888tvjc2u15h; ; ; # σ𐹠ᡚ𑄳.靑𐹽𐫜 +xn--4xa656hp23pxmc.xn--es5a888tvjc2u15h; σ𐹠ᡚ𑄳.靑𐹽𽐖𐫜; [B5, B6, V6]; xn--4xa656hp23pxmc.xn--es5a888tvjc2u15h; ; ; # σ𐹠ᡚ𑄳.靑𐹽𐫜 +xn--3xa856hp23pxmc.xn--es5a888tvjc2u15h; ς𐹠ᡚ𑄳.靑𐹽𽐖𐫜; [B5, B6, V6]; xn--3xa856hp23pxmc.xn--es5a888tvjc2u15h; ; ; # ς𐹠ᡚ𑄳.靑𐹽𐫜 +Σ𐹠ᡚ𑄳.⾭𐹽𽐖𐫜; σ𐹠ᡚ𑄳.靑𐹽𽐖𐫜; [B5, B6, P1, V6]; xn--4xa656hp23pxmc.xn--es5a888tvjc2u15h; ; ; # σ𐹠ᡚ𑄳.靑𐹽𐫜 +σ𐹠ᡚ𑄳.⾭𐹽𽐖𐫜; σ𐹠ᡚ𑄳.靑𐹽𽐖𐫜; [B5, B6, P1, V6]; xn--4xa656hp23pxmc.xn--es5a888tvjc2u15h; ; ; # σ𐹠ᡚ𑄳.靑𐹽𐫜 +𐋷。‍; 𐋷.‍; [C2]; xn--r97c.xn--1ug; ; xn--r97c.; [] # 𐋷. +xn--r97c.; 𐋷.; ; xn--r97c.; ; ; # 𐋷. +𐋷.; ; ; xn--r97c.; ; ; # 𐋷. +xn--r97c.xn--1ug; 𐋷.‍; [C2]; xn--r97c.xn--1ug; ; ; # 𐋷. +𑰳𑈯。⥪; 𑰳𑈯.⥪; [V5]; xn--2g1d14o.xn--jti; ; ; # 𑰳𑈯.⥪ +xn--2g1d14o.xn--jti; 𑰳𑈯.⥪; [V5]; xn--2g1d14o.xn--jti; ; ; # 𑰳𑈯.⥪ +𑆀䁴񤧣.Ⴕ𝟜‌͈; 𑆀䁴񤧣.Ⴕ4‌͈; [C1, P1, V5, V6]; xn--1mnx647cg3x1b.xn--4-zfb324h32o; ; xn--1mnx647cg3x1b.xn--4-zfb324h; [P1, V5, V6] # 𑆀䁴.Ⴕ4͈ +𑆀䁴񤧣.Ⴕ4‌͈; ; [C1, P1, V5, V6]; xn--1mnx647cg3x1b.xn--4-zfb324h32o; ; xn--1mnx647cg3x1b.xn--4-zfb324h; [P1, V5, V6] # 𑆀䁴.Ⴕ4͈ +𑆀䁴񤧣.ⴕ4‌͈; ; [C1, P1, V5, V6]; xn--1mnx647cg3x1b.xn--4-zfb502tlsl; ; xn--1mnx647cg3x1b.xn--4-zfb5123a; [P1, V5, V6] # 𑆀䁴.ⴕ4͈ +xn--1mnx647cg3x1b.xn--4-zfb5123a; 𑆀䁴񤧣.ⴕ4͈; [V5, V6]; xn--1mnx647cg3x1b.xn--4-zfb5123a; ; ; # 𑆀䁴.ⴕ4͈ +xn--1mnx647cg3x1b.xn--4-zfb502tlsl; 𑆀䁴񤧣.ⴕ4‌͈; [C1, V5, V6]; xn--1mnx647cg3x1b.xn--4-zfb502tlsl; ; ; # 𑆀䁴.ⴕ4͈ +xn--1mnx647cg3x1b.xn--4-zfb324h; 𑆀䁴񤧣.Ⴕ4͈; [V5, V6]; xn--1mnx647cg3x1b.xn--4-zfb324h; ; ; # 𑆀䁴.Ⴕ4͈ +xn--1mnx647cg3x1b.xn--4-zfb324h32o; 𑆀䁴񤧣.Ⴕ4‌͈; [C1, V5, V6]; xn--1mnx647cg3x1b.xn--4-zfb324h32o; ; ; # 𑆀䁴.Ⴕ4͈ +𑆀䁴񤧣.ⴕ𝟜‌͈; 𑆀䁴񤧣.ⴕ4‌͈; [C1, P1, V5, V6]; xn--1mnx647cg3x1b.xn--4-zfb502tlsl; ; xn--1mnx647cg3x1b.xn--4-zfb5123a; [P1, V5, V6] # 𑆀䁴.ⴕ4͈ +憡?‌Ⴔ.𐋮‍≠; ; [C1, C2, P1, V6]; 憡?‌Ⴔ.xn--1ug73gl146a; [C1, C2, P1, V6, A3]; 憡?Ⴔ.xn--1chz659f; [P1, V6, A3] # 憡Ⴔ.𐋮≠ +憡?‌Ⴔ.𐋮‍≠; 憡?‌Ⴔ.𐋮‍≠; [C1, C2, P1, V6]; 憡?‌Ⴔ.xn--1ug73gl146a; [C1, C2, P1, V6, A3]; 憡?Ⴔ.xn--1chz659f; [P1, V6, A3] # 憡Ⴔ.𐋮≠ +憡?‌ⴔ.𐋮‍≠; 憡?‌ⴔ.𐋮‍≠; [C1, C2, P1, V6]; 憡?‌ⴔ.xn--1ug73gl146a; [C1, C2, P1, V6, A3]; 憡?ⴔ.xn--1chz659f; [P1, V6, A3] # 憡ⴔ.𐋮≠ +憡?‌ⴔ.𐋮‍≠; ; [C1, C2, P1, V6]; 憡?‌ⴔ.xn--1ug73gl146a; [C1, C2, P1, V6, A3]; 憡?ⴔ.xn--1chz659f; [P1, V6, A3] # 憡ⴔ.𐋮≠ +憡?ⴔ.xn--1chz659f; 憡?ⴔ.𐋮≠; [P1, V6]; 憡?ⴔ.xn--1chz659f; [P1, V6, A3]; ; # 憡ⴔ.𐋮≠ +憡?Ⴔ.XN--1CHZ659F; 憡?Ⴔ.𐋮≠; [P1, V6]; 憡?Ⴔ.xn--1chz659f; [P1, V6, A3]; ; # 憡Ⴔ.𐋮≠ +憡?Ⴔ.xn--1chz659f; 憡?Ⴔ.𐋮≠; [P1, V6]; 憡?Ⴔ.xn--1chz659f; [P1, V6, A3]; ; # 憡Ⴔ.𐋮≠ +憡?‌ⴔ.xn--1ug73gl146a; 憡?‌ⴔ.𐋮‍≠; [C1, C2, P1, V6]; 憡?‌ⴔ.xn--1ug73gl146a; [C1, C2, P1, V6, A3]; 憡?ⴔ.xn--1ug73gl146a; [C2, P1, V6, A3] # 憡ⴔ.𐋮≠ +憡?‌Ⴔ.XN--1UG73GL146A; 憡?‌Ⴔ.𐋮‍≠; [C1, C2, P1, V6]; 憡?‌Ⴔ.xn--1ug73gl146a; [C1, C2, P1, V6, A3]; 憡?Ⴔ.xn--1ug73gl146a; [C2, P1, V6, A3] # 憡Ⴔ.𐋮≠ +憡?‌Ⴔ.xn--1ug73gl146a; 憡?‌Ⴔ.𐋮‍≠; [C1, C2, P1, V6]; 憡?‌Ⴔ.xn--1ug73gl146a; [C1, C2, P1, V6, A3]; 憡?Ⴔ.xn--1ug73gl146a; [C2, P1, V6, A3] # 憡Ⴔ.𐋮≠ +憡?Ⴔ.xn--1ug73gl146a; 憡?Ⴔ.𐋮‍≠; [C2, P1, V6]; 憡?Ⴔ.xn--1ug73gl146a; [C2, P1, V6, A3]; ; # 憡Ⴔ.𐋮≠ +憡?ⴔ.xn--1ug73gl146a; 憡?ⴔ.𐋮‍≠; [C2, P1, V6]; 憡?ⴔ.xn--1ug73gl146a; [C2, P1, V6, A3]; ; # 憡ⴔ.𐋮≠ +憡?Ⴔ.XN--1UG73GL146A; 憡?Ⴔ.𐋮‍≠; [C2, P1, V6]; 憡?Ⴔ.xn--1ug73gl146a; [C2, P1, V6, A3]; ; # 憡Ⴔ.𐋮≠ diff --git a/vendor/idna/tests/punycode.rs b/vendor/idna/tests/punycode.rs index 1851a32cfc..c0123c6390 100644 --- a/vendor/idna/tests/punycode.rs +++ b/vendor/idna/tests/punycode.rs @@ -6,11 +6,11 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +use crate::test::TestFn; use idna::punycode::{decode, encode_str}; -use serde_json::Value; use serde_json::map::Map; +use serde_json::Value; use std::str::FromStr; -use test::TestFn; fn one_test(decoded: &str, encoded: &str) { match decode(encoded) { @@ -19,10 +19,10 @@ fn one_test(decoded: &str, encoded: &str) { let result = result.into_iter().collect::(); assert!( result == decoded, - format!( - "Incorrect decoding of \"{}\":\n \"{}\"\n!= \"{}\"\n", - encoded, result, decoded - ) + "Incorrect decoding of \"{}\":\n \"{}\"\n!= \"{}\"\n", + encoded, + result, + decoded ) } } @@ -31,10 +31,10 @@ fn one_test(decoded: &str, encoded: &str) { None => panic!("Encoding {} failed.", decoded), Some(result) => assert!( result == encoded, - format!( - "Incorrect encoding of \"{}\":\n \"{}\"\n!= \"{}\"\n", - decoded, result, encoded - ) + "Incorrect encoding of \"{}\":\n \"{}\"\n!= \"{}\"\n", + decoded, + result, + encoded ), } } diff --git a/vendor/idna/tests/tests.rs b/vendor/idna/tests/tests.rs index 995bbadd64..5f0f8cde35 100644 --- a/vendor/idna/tests/tests.rs +++ b/vendor/idna/tests/tests.rs @@ -1,6 +1,4 @@ -extern crate idna; -extern crate serde_json; -extern crate rustc_test as test; +use rustc_test as test; mod punycode; mod uts46; diff --git a/vendor/idna/tests/unit.rs b/vendor/idna/tests/unit.rs index e24e2a3199..84a9d54031 100644 --- a/vendor/idna/tests/unit.rs +++ b/vendor/idna/tests/unit.rs @@ -1,40 +1,133 @@ -extern crate idna; -extern crate unicode_normalization; - +use assert_matches::assert_matches; use unicode_normalization::char::is_combining_mark; -fn _to_ascii(domain: &str) -> Result { - idna::Config::default() +/// https://github.com/servo/rust-url/issues/373 +#[test] +fn test_punycode_prefix_with_length_check() { + let config = idna::Config::default() .verify_dns_length(true) - .use_std3_ascii_rules(true) - .to_ascii(domain) + .check_hyphens(true) + .use_std3_ascii_rules(true); + + assert!(config.to_ascii("xn--").is_err()); + assert!(config.to_ascii("xn---").is_err()); + assert!(config.to_ascii("xn-----").is_err()); + assert!(config.to_ascii("xn--.").is_err()); + assert!(config.to_ascii("xn--...").is_err()); + assert!(config.to_ascii(".xn--").is_err()); + assert!(config.to_ascii("...xn--").is_err()); + assert!(config.to_ascii("xn--.xn--").is_err()); + assert!(config.to_ascii("xn--.example.org").is_err()); +} + +/// https://github.com/servo/rust-url/issues/373 +#[test] +fn test_punycode_prefix_without_length_check() { + let config = idna::Config::default() + .verify_dns_length(false) + .check_hyphens(true) + .use_std3_ascii_rules(true); + + assert_eq!(config.to_ascii("xn--").unwrap(), ""); + assert!(config.to_ascii("xn---").is_err()); + assert!(config.to_ascii("xn-----").is_err()); + assert_eq!(config.to_ascii("xn--.").unwrap(), "."); + assert_eq!(config.to_ascii("xn--...").unwrap(), "..."); + assert_eq!(config.to_ascii(".xn--").unwrap(), "."); + assert_eq!(config.to_ascii("...xn--").unwrap(), "..."); + assert_eq!(config.to_ascii("xn--.xn--").unwrap(), "."); + assert_eq!(config.to_ascii("xn--.example.org").unwrap(), ".example.org"); +} + +// http://www.unicode.org/reports/tr46/#Table_Example_Processing +#[test] +fn test_examples() { + let mut codec = idna::Idna::default(); + let mut out = String::new(); + + assert_matches!(codec.to_unicode("Bloß.de", &mut out), Ok(())); + assert_eq!(out, "bloß.de"); + + out.clear(); + assert_matches!(codec.to_unicode("xn--blo-7ka.de", &mut out), Ok(())); + assert_eq!(out, "bloß.de"); + + out.clear(); + assert_matches!(codec.to_unicode("u\u{308}.com", &mut out), Ok(())); + assert_eq!(out, "ü.com"); + + out.clear(); + assert_matches!(codec.to_unicode("xn--tda.com", &mut out), Ok(())); + assert_eq!(out, "ü.com"); + + out.clear(); + assert_matches!(codec.to_unicode("xn--u-ccb.com", &mut out), Err(_)); + + out.clear(); + assert_matches!(codec.to_unicode("a⒈com", &mut out), Err(_)); + + out.clear(); + assert_matches!(codec.to_unicode("xn--a-ecp.ru", &mut out), Err(_)); + + out.clear(); + assert_matches!(codec.to_unicode("xn--0.pt", &mut out), Err(_)); + + out.clear(); + assert_matches!(codec.to_unicode("日本語。JP", &mut out), Ok(())); + assert_eq!(out, "日本語.jp"); + + out.clear(); + assert_matches!(codec.to_unicode("☕.us", &mut out), Ok(())); + assert_eq!(out, "☕.us"); } #[test] fn test_v5() { + let config = idna::Config::default() + .verify_dns_length(true) + .use_std3_ascii_rules(true); + // 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()); + assert!(config.to_ascii("\u{11C3A}").is_err()); + assert!(config.to_ascii("\u{850f}.\u{11C3A}").is_err()); + assert!(config.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" - ); + let config = idna::Config::default() + .verify_dns_length(true) + .use_std3_ascii_rules(true); + + assert_eq!(config.to_ascii("abc").unwrap(), "abc"); + assert_eq!(config.to_ascii("123").unwrap(), "123"); + assert_eq!(config.to_ascii("אבּג").unwrap(), "xn--kdb3bdf"); + assert_eq!(config.to_ascii("ابج").unwrap(), "xn--mgbcm"); + assert_eq!(config.to_ascii("abc.ابج").unwrap(), "abc.xn--mgbcm"); + assert_eq!(config.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()); + assert!(config.to_ascii("0a.\u{05D0}").is_err()); + assert!(config.to_ascii("0à.\u{05D0}").is_err()); // Bidi chars may be punycode-encoded - assert!(_to_ascii("xn--0ca24w").is_err()); + assert!(config.to_ascii("xn--0ca24w").is_err()); +} + +#[test] +fn emoji_domains() { + // HOT BEVERAGE is allowed here... + let config = idna::Config::default() + .verify_dns_length(true) + .use_std3_ascii_rules(true); + assert_eq!(config.to_ascii("☕.com").unwrap(), "xn--53h.com"); + + // ... but not here + let config = idna::Config::default() + .verify_dns_length(true) + .use_std3_ascii_rules(true) + .use_idna_2008_rules(true); + let error = format!("{:?}", config.to_ascii("☕.com").unwrap_err()); + assert!(error.contains("disallowed_in_idna_2008")); } diff --git a/vendor/idna/tests/uts46.rs b/vendor/idna/tests/uts46.rs index b3a5ff3348..72b5bcec7d 100644 --- a/vendor/idna/tests/uts46.rs +++ b/vendor/idna/tests/uts46.rs @@ -6,116 +6,142 @@ // option. This file may not be copied, modified, or distributed // except according to those terms. +use crate::test::TestFn; use std::char; -use test::TestFn; + +use idna::Errors; 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("#") { + // https://www.unicode.org/Public/idna/13.0.0/IdnaTestV2.txt + for (i, line) in include_str!("IdnaTestV2.txt").lines().enumerate() { + if line.is_empty() || line.starts_with('#') { continue; } + // Remove comments - let mut line = match line.find("#") { + let 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 source = unescape(&pieces.remove(0)); - 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) + // ToUnicode + let mut to_unicode = unescape(&pieces.remove(0)); + if to_unicode.is_empty() { + to_unicode = source.clone(); + } + let to_unicode_status = status(pieces.remove(0)); + + // ToAsciiN + let to_ascii_n = pieces.remove(0); + let to_ascii_n = if to_ascii_n.is_empty() { + to_unicode.clone() + } else { + to_ascii_n.to_owned() + }; + let to_ascii_n_status = pieces.remove(0); + let to_ascii_n_status = if to_ascii_n_status.is_empty() { + to_unicode_status.clone() } else { - "" + status(to_ascii_n_status) }; - if expected_failure { - continue; - } + // ToAsciiT + let to_ascii_t = pieces.remove(0); + let to_ascii_t = if to_ascii_t.is_empty() { + to_ascii_n.clone() + } else { + to_ascii_t.to_owned() + }; + let to_ascii_t_status = pieces.remove(0); + let to_ascii_t_status = if to_ascii_t_status.is_empty() { + to_ascii_n_status.clone() + } else { + status(to_ascii_t_status) + }; let test_name = format!("UTS #46 line {}", i + 1); add_test( test_name, TestFn::dyn_test_fn(move || { - let result = idna::Config::default() + let config = idna::Config::default() .use_std3_ascii_rules(true) .verify_dns_length(true) - .check_hyphens(true) - .transitional_processing(test_type == "T") - .to_ascii(&source); - - 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; - } + .check_hyphens(true); - 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() - } - }; + // http://unicode.org/reports/tr46/#Deviations + // applications that perform IDNA2008 lookup are not required to check + // for these contexts, so we skip all tests annotated with C* - if nv8 == "NV8" { - // This result isn't valid under IDNA2008. Skip it - return; - } + // 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/ - assert!( - result.is_ok(), - "Couldn't parse {} | original: {} | error: {:?}", - source, - original, - result.err() + // "The special error codes X3 and X4_2 are now returned where a toASCII error code + // was formerly being generated in toUnicode due to an empty label." + // This is not implemented yet, so we skip toUnicode X4_2 tests for now, too. + + let (to_unicode_value, to_unicode_result) = + config.transitional_processing(false).to_unicode(&source); + let to_unicode_result = to_unicode_result.map(|()| to_unicode_value); + check( + &source, + (&to_unicode, &to_unicode_status), + to_unicode_result, + |e| e.starts_with('C') || e == "V2" || e == "X4_2", ); - let output = result.ok().unwrap(); - assert!( - output == to_ascii, - "result: {} | expected: {} | original: {} | source: {}", - output, - to_ascii, - original, - source + + let to_ascii_n_result = config.transitional_processing(false).to_ascii(&source); + check( + &source, + (&to_ascii_n, &to_ascii_n_status), + to_ascii_n_result, + |e| e.starts_with('C') || e == "V2", + ); + + let to_ascii_t_result = config.transitional_processing(true).to_ascii(&source); + check( + &source, + (&to_ascii_t, &to_ascii_t_status), + to_ascii_t_result, + |e| e.starts_with('C') || e == "V2", ); }), ) } } +#[allow(clippy::redundant_clone)] +fn check(source: &str, expected: (&str, &[&str]), actual: Result, ignore: F) +where + F: Fn(&str) -> bool, +{ + if !expected.1.is_empty() { + if !expected.1.iter().copied().any(ignore) { + let res = actual.ok(); + assert_eq!( + res.clone(), + None, + "Expected error {:?}. result: {} | source: {}", + expected.1, + res.unwrap(), + source, + ); + } + } else { + assert!( + actual.is_ok(), + "Couldn't parse {} | error: {:?}", + source, + actual.err().unwrap(), + ); + assert_eq!(actual.unwrap(), expected.0, "source: {}", source); + } +} + fn unescape(input: &str) -> String { let mut output = String::new(); let mut chars = input.chars(); @@ -148,3 +174,20 @@ fn unescape(input: &str) -> String { } } } + +fn status(status: &str) -> Vec<&str> { + if status.is_empty() || status == "[]" { + return Vec::new(); + } + + let mut result = status.split(", ").collect::>(); + assert!(result[0].starts_with('[')); + result[0] = &result[0][1..]; + + let idx = result.len() - 1; + let last = &mut result[idx]; + assert!(last.ends_with(']')); + *last = &last[..last.len() - 1]; + + result +} diff --git a/vendor/indexmap/.cargo-checksum.json b/vendor/indexmap/.cargo-checksum.json index 4c37b47e8f..752043eec8 100644 --- a/vendor/indexmap/.cargo-checksum.json +++ b/vendor/indexmap/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"6733910b84cfce6c8df883257d56d296e94d22c22a292f405493e05c93a62d7a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"ecc269ef87fd38a1d98e30bfac9ba964a9dbd9315c3770fed98d4d7cb5882055","README.rst":"3e2c46144d88c90a36330e6c4b7b1753294276fcb6935d9118137276019d4068","benches/bench.rs":"dda3c7e3cd68b8f5c74dbd60189e89f0e43339cdc25dae7b1e5a9d25b1fb80a9","benches/faststring.rs":"2472b9d0d52031988cd31401357908fd850d15f1efa9f9761aa6b6779aad1889","build.rs":"558b4d0b9e9b3a44f7e1a2b69f7a7567ea721cd45cb54f4e458e850bf702f35c","src/equivalent.rs":"2e6ae24ef09a09b917f4e2b0f6288f901878e42f5080f61b1bd1afdcc90aba87","src/lib.rs":"a5f52cf1441511f3e71f1cbe8137410ecdbba96f95a61d039858c8f63768c36d","src/macros.rs":"cb2e9742b7e2bcadc4eb356a4ca4eb3317d1a80e293f37a3cd5a0155c5347c50","src/map.rs":"fe02d7a6c101813a8e2d20daef4a433e72f1121bb16acbc2cdb2295f1e0295ca","src/map/core.rs":"1cda3fc31a6b7ad59898b6a14b9f011c6e89cc87dd096f56e103303df9d95456","src/map/core/raw.rs":"074c97b81b9273a01241ac2e2e7640edc279b744a382c0dd11aad591aaac5333","src/mutable_keys.rs":"99fdec7c0182902ba19524f342c220b51475bcd41c44c2cb2c3f62eacb029335","src/rayon/map.rs":"cdbe6cad8e5753aca3f07b621d2bb3b480f1ae3e10697568b8c16aeb865de65b","src/rayon/mod.rs":"bf2b0fc074f20135a6734db600b04828e88dd263b3e361606be4efe8e916eafc","src/rayon/set.rs":"789efd10d41f03fa73268bae8afdc3b6582767420218a4b28f3c83c528ef726c","src/serde.rs":"d45ec8fb9c02594ca6f2e9b20764778b2b4193a24a52f1e233160a33efc6e683","src/serde_seq.rs":"c54a52fa607b6ccddda1e76e829778ca304c49b5f434edc5e582a5386c35d662","src/set.rs":"de3b76a5485061d3f7ccb1e72b86f9a98e0ffa8799a5f5eb9120c063d80f3ef5","src/util.rs":"c415261cff9f610d7331192feba0839cb05e04d3d375a5fa2f8190a29661994e","tests/equivalent_trait.rs":"efe9393069e3cfc893d2c9c0343679979578e437fdb98a10baefeced027ba310","tests/macros_full_path.rs":"c33c86d7341581fdd08e2e6375a4afca507fa603540c54a3b9e51c4cd011cd71","tests/quick.rs":"6efe8c6dfa5bdd466b3f5c491d9dfbf57fd730301849a710abff9358968218c5","tests/tests.rs":"f6dbeeb0e2950402b0e66ac52bf74c9e4197d3c5d9c0dde64a7998a2ef74d327"},"package":"4fb1fa934250de4de8aef298d81c729a7d33d8c239daa3a7575e6b92bfc7313b"} \ No newline at end of file +{"files":{"Cargo.toml":"f74227e7c2cc4c8a1b407328d3dc5224b0633b6d81bd8bca7c4902f496e05f70","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"ecc269ef87fd38a1d98e30bfac9ba964a9dbd9315c3770fed98d4d7cb5882055","README.rst":"8784bb0b101d06198fe989bbe85e5d597c6843de096faeed25a0beb2b9952722","benches/bench.rs":"dda3c7e3cd68b8f5c74dbd60189e89f0e43339cdc25dae7b1e5a9d25b1fb80a9","benches/faststring.rs":"2472b9d0d52031988cd31401357908fd850d15f1efa9f9761aa6b6779aad1889","build.rs":"558b4d0b9e9b3a44f7e1a2b69f7a7567ea721cd45cb54f4e458e850bf702f35c","src/equivalent.rs":"2e6ae24ef09a09b917f4e2b0f6288f901878e42f5080f61b1bd1afdcc90aba87","src/lib.rs":"a5f52cf1441511f3e71f1cbe8137410ecdbba96f95a61d039858c8f63768c36d","src/macros.rs":"cb2e9742b7e2bcadc4eb356a4ca4eb3317d1a80e293f37a3cd5a0155c5347c50","src/map.rs":"05b7eba2f7e2f11881e36f96abcf0038d6543ee6f1bb14b844b1a79cfc073065","src/map/core.rs":"7126a8ebc18b18e0349db01e0fbe24c3f6f40acd2346189306789dbeaaced3e0","src/map/core/raw.rs":"ef1337b6ba2820d96e34c696eeaf84c3b83cd064c2cca8f60fe9866b5caa45e6","src/mutable_keys.rs":"99fdec7c0182902ba19524f342c220b51475bcd41c44c2cb2c3f62eacb029335","src/rayon/map.rs":"cdbe6cad8e5753aca3f07b621d2bb3b480f1ae3e10697568b8c16aeb865de65b","src/rayon/mod.rs":"bf2b0fc074f20135a6734db600b04828e88dd263b3e361606be4efe8e916eafc","src/rayon/set.rs":"789efd10d41f03fa73268bae8afdc3b6582767420218a4b28f3c83c528ef726c","src/serde.rs":"d45ec8fb9c02594ca6f2e9b20764778b2b4193a24a52f1e233160a33efc6e683","src/serde_seq.rs":"c54a52fa607b6ccddda1e76e829778ca304c49b5f434edc5e582a5386c35d662","src/set.rs":"88b46246d5b39a91bf9318446bf6d8b0d7ff723ef6dd4ba4a965d67f7511f642","src/util.rs":"c415261cff9f610d7331192feba0839cb05e04d3d375a5fa2f8190a29661994e","tests/equivalent_trait.rs":"efe9393069e3cfc893d2c9c0343679979578e437fdb98a10baefeced027ba310","tests/macros_full_path.rs":"c33c86d7341581fdd08e2e6375a4afca507fa603540c54a3b9e51c4cd011cd71","tests/quick.rs":"6efe8c6dfa5bdd466b3f5c491d9dfbf57fd730301849a710abff9358968218c5","tests/tests.rs":"f6dbeeb0e2950402b0e66ac52bf74c9e4197d3c5d9c0dde64a7998a2ef74d327"},"package":"824845a0bf897a9042383849b02c1bc219c2383772efcd5c6f9766fa4b81aef3"} \ No newline at end of file diff --git a/vendor/indexmap/Cargo.toml b/vendor/indexmap/Cargo.toml index 34ac116314..54e07a98c9 100644 --- a/vendor/indexmap/Cargo.toml +++ b/vendor/indexmap/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "indexmap" -version = "1.6.1" +version = "1.6.2" authors = ["bluss", "Josh Stone "] build = "build.rs" description = "A hash table with consistent order and fast iteration.\n\nThe indexmap is a hash table where the iteration order of the key-value\npairs is independent of the hash values of the keys. It has the usual\nhash table functionality, it preserves insertion order except after\nremovals, and it allows lookup of its elements by either hash table key\nor numerical index. A corresponding hash set type is also provided.\n\nThis crate was initially published under the name ordermap, but it was renamed to\nindexmap.\n" diff --git a/vendor/indexmap/README.rst b/vendor/indexmap/README.rst index 49a71073a8..1cf5368bf0 100644 --- a/vendor/indexmap/README.rst +++ b/vendor/indexmap/README.rst @@ -66,6 +66,17 @@ which is roughly: Recent Changes ============== +- 1.6.2 + + - Fixed to match ``std`` behavior, ``OccupiedEntry::key`` now references the + existing key in the map instead of the lookup key, by @cuviper in PR 170_. + + - The new ``Entry::or_insert_with_key`` matches Rust 1.50's ``Entry`` method, + passing ``&K`` to the callback to create a value, by @cuviper in PR 175_. + +.. _170: https://github.com/bluss/indexmap/pull/170 +.. _175: https://github.com/bluss/indexmap/pull/175 + - 1.6.1 - The new ``serde_seq`` module implements ``IndexMap`` serialization as a diff --git a/vendor/indexmap/src/map.rs b/vendor/indexmap/src/map.rs index 532791cfd2..3bfaa1501c 100644 --- a/vendor/indexmap/src/map.rs +++ b/vendor/indexmap/src/map.rs @@ -509,7 +509,7 @@ where /// /// 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!** + /// the position of what used to be the last element!** /// /// Return `None` if `key` is not in map. /// @@ -525,7 +525,7 @@ where /// /// 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!** + /// the position of what used to be the last element!** /// /// Return `None` if `key` is not in map. /// @@ -545,7 +545,7 @@ where /// /// 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!** + /// the position of what used to be the last element!** /// /// Return `None` if `key` is not in map. /// @@ -751,7 +751,7 @@ impl IndexMap { /// /// 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!** + /// the position of what used to be the last element!** /// /// Computes in **O(1)** time (average). pub fn swap_remove_index(&mut self, index: usize) -> Option<(K, V)> { @@ -1648,6 +1648,28 @@ mod tests { assert_eq!(&mut TestEnum::DefaultValue, map.entry(2).or_default()); } + #[test] + fn occupied_entry_key() { + // These keys match hash and equality, but their addresses are distinct. + let (k1, k2) = (&mut 1, &mut 1); + let k1_ptr = k1 as *const i32; + let k2_ptr = k2 as *const i32; + assert_ne!(k1_ptr, k2_ptr); + + let mut map = IndexMap::new(); + map.insert(k1, "value"); + match map.entry(k2) { + Entry::Occupied(ref e) => { + // `OccupiedEntry::key` should reference the key in the map, + // not the key that was used to find the entry. + let ptr = *e.key() as *const i32; + assert_eq!(ptr, k1_ptr); + assert_ne!(ptr, k2_ptr); + } + Entry::Vacant(_) => panic!(), + } + } + #[test] fn keys() { let vec = vec![(1, 'a'), (2, 'b'), (3, 'c')]; diff --git a/vendor/indexmap/src/map/core.rs b/vendor/indexmap/src/map/core.rs index 02e99e074f..c4e725c9a3 100644 --- a/vendor/indexmap/src/map/core.rs +++ b/vendor/indexmap/src/map/core.rs @@ -445,6 +445,9 @@ pub enum Entry<'a, K, V> { } impl<'a, K, V> Entry<'a, K, V> { + /// Inserts the given default value in the entry if it is vacant and returns a mutable + /// reference to it. Otherwise a mutable reference to an already existent value is returned. + /// /// Computes in **O(1)** time (amortized average). pub fn or_insert(self, default: V) -> &'a mut V { match self { @@ -453,6 +456,9 @@ impl<'a, K, V> Entry<'a, K, V> { } } + /// Inserts the result of the `call` function in the entry if it is vacant and returns a mutable + /// reference to it. Otherwise a mutable reference to an already existent value is returned. + /// /// Computes in **O(1)** time (amortized average). pub fn or_insert_with(self, call: F) -> &'a mut V where @@ -464,6 +470,26 @@ impl<'a, K, V> Entry<'a, K, V> { } } + /// Inserts the result of the `call` function with a reference to the entry's key if it is + /// vacant, and returns a mutable reference to the new value. Otherwise a mutable reference to + /// an already existent value is returned. + /// + /// Computes in **O(1)** time (amortized average). + pub fn or_insert_with_key(self, call: F) -> &'a mut V + where + F: FnOnce(&K) -> V, + { + match self { + Entry::Occupied(entry) => entry.into_mut(), + Entry::Vacant(entry) => { + let value = call(&entry.key); + entry.insert(value) + } + } + } + + /// Gets a reference to the entry's key, either within the map if occupied, + /// or else the new key that was used to find the entry. pub fn key(&self) -> &K { match *self { Entry::Occupied(ref entry) => entry.key(), @@ -537,7 +563,7 @@ impl OccupiedEntry<'_, K, V> { /// /// 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!** + /// the position of what used to be the last element!** /// /// Computes in **O(1)** time (average). pub fn swap_remove(self) -> V { @@ -583,10 +609,12 @@ pub struct VacantEntry<'a, K, V> { } impl<'a, K, V> VacantEntry<'a, K, V> { + /// Gets a reference to the key that was used to find the entry. pub fn key(&self) -> &K { &self.key } + /// Takes ownership of the key, leaving the entry vacant. pub fn into_key(self) -> K { self.key } @@ -596,6 +624,8 @@ impl<'a, K, V> VacantEntry<'a, K, V> { self.map.len() } + /// Inserts the entry's key and the given value into the map, and returns a mutable reference + /// to the value. pub fn insert(self, value: V) -> &'a mut V { let i = self.map.push(self.hash, self.key, value); &mut self.map.entries[i].value diff --git a/vendor/indexmap/src/map/core/raw.rs b/vendor/indexmap/src/map/core/raw.rs index 3388f12361..168e1af3cb 100644 --- a/vendor/indexmap/src/map/core/raw.rs +++ b/vendor/indexmap/src/map/core/raw.rs @@ -104,14 +104,24 @@ unsafe impl Sync for OccupiedEntry<'_, K, V> {} // The parent module also adds methods that don't threaten the unsafe encapsulation. impl<'a, K, V> OccupiedEntry<'a, K, V> { + /// Gets a reference to the entry's key in the map. + /// + /// Note that this is not the key that was used to find the entry. There may be an observable + /// difference if the key type has any distinguishing features outside of `Hash` and `Eq`, like + /// extra fields or the memory address of an allocation. pub fn key(&self) -> &K { - &self.key + &self.map.entries[self.index()].key } + /// Gets a reference to the entry's value in the map. pub fn get(&self) -> &V { &self.map.entries[self.index()].value } + /// Gets a mutable reference to the entry's value in the map. + /// + /// If you need a reference which may outlive the destruction of the + /// `Entry` value, see `into_mut`. pub fn get_mut(&mut self) -> &mut V { let index = self.index(); &mut self.map.entries[index].value @@ -131,6 +141,8 @@ impl<'a, K, V> OccupiedEntry<'a, K, V> { unsafe { self.raw_bucket.read() } } + /// Converts into a mutable reference to the entry's value in the map, + /// with a lifetime bound to the map itself. pub fn into_mut(self) -> &'a mut V { let index = self.index(); &mut self.map.entries[index].value @@ -140,7 +152,7 @@ impl<'a, K, V> OccupiedEntry<'a, K, V> { /// /// 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!** + /// the position of what used to be the last element!** /// /// Computes in **O(1)** time (average). pub fn swap_remove_entry(self) -> (K, V) { diff --git a/vendor/indexmap/src/set.rs b/vendor/indexmap/src/set.rs index 29fb64f02c..aa4e774953 100644 --- a/vendor/indexmap/src/set.rs +++ b/vendor/indexmap/src/set.rs @@ -425,7 +425,7 @@ where /// /// 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!** + /// the position of what used to be the last element!** /// /// Return `false` if `value` was not in the set. /// @@ -473,7 +473,7 @@ where /// /// 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!** + /// the position of what used to be the last element!** /// /// Return `None` if `value` was not in the set. /// @@ -506,7 +506,7 @@ where /// /// 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!** + /// the position of what used to be the last element!** /// /// Return `None` if `value` was not in the set. pub fn swap_remove_full(&mut self, value: &Q) -> Option<(usize, T)> @@ -622,7 +622,7 @@ impl IndexSet { /// /// 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!** + /// the position of what used to be the last element!** /// /// Computes in **O(1)** time (average). pub fn swap_remove_index(&mut self, index: usize) -> Option { diff --git a/vendor/libc/.cargo-checksum.json b/vendor/libc/.cargo-checksum.json index 81e7ff4779..20c894d82d 100644 --- a/vendor/libc/.cargo-checksum.json +++ b/vendor/libc/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CONTRIBUTING.md":"50547f85785c64798a3bb93515b795603a78fa131fb92c7e2d1e4d7b463eb829","Cargo.toml":"9daf7eede4ad99d8807bbed4bb2ace420bf40aaf7d4a20bc89cc2674902651c4","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"a8d47ff51ca256f56a8932dba07660672dbfe3004257ca8de708aac1415937a1","README.md":"8228847944f1332882fbb00275b6f30e4a8aad08a13569c25d52cac012cc2a47","build.rs":"e487789ca77b0015d75cecb253286d4a1406f11b1ae538929414fc0506842bef","rustfmt.toml":"8a654d5787585ca8f2c20580737336fc327f411a07b0dbd4870adf6e9bdf624f","src/cloudabi/aarch64.rs":"b8550bf1fd7344972aa4db29441486f39f31482d0327534981dbb75959c29114","src/cloudabi/arm.rs":"c197e2781c2839808bd6fcef219a29705b27b992d3ef920e9cf6ac96e2022bbf","src/cloudabi/mod.rs":"d5d4488e8c0b8227f516fe13810f550a2a72af3bdfe769200ad8687c8755bdf6","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":"0bc9db9863eca7e6254c9bf150812e8ad1c1460b3228126e4a12f26b9d7a03da","src/fuchsia/no_align.rs":"303f3f1b255e0088b5715094353cf00476131d8e94e6aebb3f469557771c8b8a","src/fuchsia/x86_64.rs":"93a3632b5cf67d2a6bcb7dc0a558605252d5fe689e0f38d8aa2ec5852255ac87","src/hermit/aarch64.rs":"86048676e335944c37a63d0083d0f368ae10ceccefeed9debb3bbe08777fc682","src/hermit/mod.rs":"d3bfce41e4463d4be8020a2d063c9bfa8b665f45f1cc6cbf3163f5d01e7cb21f","src/hermit/x86_64.rs":"ab832b7524e5fb15c49ff7431165ab1a37dc4667ae0b58e8306f4c539bfa110c","src/lib.rs":"974a1808d0d94bb2f168a6007a5302deb1e64f528fd3ee8feaadaae3814378c2","src/macros.rs":"7844312c233a6889fa15395fe3106f6a8f6229211104a92f33ea3c9536eef763","src/psp.rs":"017fdd719cc85352a1c062d40edd96a821e19d25abe23b55e40ed6e7ac2892e1","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/aarch64/align.rs":"f0c321265dd7671f16106b84951ac7dd77ed2e65c6623cbf2d29e76531984770","src/unix/bsd/apple/b64/aarch64/mod.rs":"46d5d061c7a74cbc09cbdfb3bee9a600867bf4e04c0e4d0ca6c817e6033b32e1","src/unix/bsd/apple/b64/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b64/mod.rs":"f5e278a1af7fb358891d1c9be4eb7e815aaca0c5cb738d0c3604ba2208a856f7","src/unix/bsd/apple/b64/x86_64/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b64/x86_64/mod.rs":"cc6878dd130c3f255418e4da74992ae9ba6a3cdb0530772de76c518077d3b12a","src/unix/bsd/apple/mod.rs":"aa4d94b4440bd7c195f445658d0ac09555d2212bffdc9f90935ad5721e2373ec","src/unix/bsd/freebsdlike/dragonfly/errno.rs":"8295b8bb0dfd38d2cdb4d9192cdeeb534cc6c3b208170e64615fa3e0edb3e578","src/unix/bsd/freebsdlike/dragonfly/mod.rs":"6b25421a27239d46983278d2f93d9e90dc125677b420c881a0b79e1b541584da","src/unix/bsd/freebsdlike/freebsd/aarch64.rs":"14f0bd6693967d4fedec904f7042bd51f2138cb843ec4df18c911b357417cdd2","src/unix/bsd/freebsdlike/freebsd/arm.rs":"59d6a670eea562fb87686e243e0a84603d29a2028a3d4b3f99ccc01bd04d2f47","src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs":"9808d152c1196aa647f1b0f0cf84dac8c930da7d7f897a44975545e3d9d17681","src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs":"2e9b8f8af44eb75539c7688c2723745a5f10079a7faac99e43ae7534bd111f48","src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs":"61cbe45f8499bedb168106b686d4f8239472f25c7553b069eec2afe197ff2df6","src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs":"09a2441852a6dfb7e7fce28d5115ce243109deab1c569d80c67c5b634ac4bb23","src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs":"61cbe45f8499bedb168106b686d4f8239472f25c7553b069eec2afe197ff2df6","src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs":"72a87d191189486d44bc19a3296817fcf828087ce1286bca20d474a3b2602602","src/unix/bsd/freebsdlike/freebsd/mod.rs":"c12a475eed4a2ebc7f2261f82875dc6dfa33649cbb176073c03183bf26c5f5b9","src/unix/bsd/freebsdlike/freebsd/powerpc64.rs":"2dae3ecc87eac3b11657aa98915def55fc4b5c0de11fe26aae23329a54628a9a","src/unix/bsd/freebsdlike/freebsd/x86.rs":"c5005e3249eb7c93cfbac72a9e9272320d80ce7983da990ceb05a447f59a02c5","src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs":"0e1f69a88fca1c32874b1daf5db3d446fefbe518dca497f096cc9168c39dde70","src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs":"6132aa0973454379674ea6cbc77e6eace1e1032dd9f38182071388a036f1bc08","src/unix/bsd/freebsdlike/mod.rs":"b6be7822a69713966c21efb879eb45f6f9e20c1b4342b524a587ed7350a5b063","src/unix/bsd/mod.rs":"26160c60a33cec65ccc3b28277d40bd95f7f62ee857f931ada76cbc7c2694858","src/unix/bsd/netbsdlike/mod.rs":"48dd60524119c1e09b255d5472d091e7e7b2b29eab04be51b4b1e740bd022859","src/unix/bsd/netbsdlike/netbsd/aarch64.rs":"b38fc046f9a40fea28bd26328b96629f4d5d63d7524936bd6af1865d401a8716","src/unix/bsd/netbsdlike/netbsd/arm.rs":"58cdbb70b0d6f536551f0f3bb3725d2d75c4690db12c26c034e7d6ec4a924452","src/unix/bsd/netbsdlike/netbsd/mod.rs":"a70f3c73b423bf44b06f16e44934ce3536517e60b3a4e256f41340a9e5dded40","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":"253888b365d4f0dd86d3eae1a63662248514b132031d4bf5434d8a63144ce296","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":"8b8a62f392c23fe4fd1c334ca6c2828617ece19f0a59115d116d957fa348eb74","src/unix/hermit/aarch64.rs":"86048676e335944c37a63d0083d0f368ae10ceccefeed9debb3bbe08777fc682","src/unix/hermit/mod.rs":"2d8d3ce0299931199011bb73136bebbddf88edf7d263cc39d26dbfaaa1a14228","src/unix/hermit/x86_64.rs":"ab832b7524e5fb15c49ff7431165ab1a37dc4667ae0b58e8306f4c539bfa110c","src/unix/linux_like/android/b32/arm.rs":"155994121906903a2e0afad895f0b3b7546f6e54d6305a3336ce2c4dfafbfdfa","src/unix/linux_like/android/b32/mod.rs":"6b3fd3e1eb21e50d000f496729b40968b1c728f5f10d4fb18a9aef44bff383ff","src/unix/linux_like/android/b32/x86/align.rs":"812914e4241df82e32b12375ca3374615dc3a4bdd4cf31f0423c5815320c0dab","src/unix/linux_like/android/b32/x86/mod.rs":"5b1e9fcd77ca5f939acb7fb5f5da12f305b0377698d8b8989feb236e26360aa0","src/unix/linux_like/android/b64/aarch64/align.rs":"2179c3b1608fa4bf68840482bfc2b2fa3ee2faf6fcae3770f9e505cddca35c7b","src/unix/linux_like/android/b64/aarch64/mod.rs":"db23f94bc3ed46a0967dde748f0d4566fc885cc6171d0555007f3398ff99a708","src/unix/linux_like/android/b64/mod.rs":"c56f1213b01cbf63ec68810bf14b30490bd44d2d5b927ec439d45c8ec2cd282e","src/unix/linux_like/android/b64/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/android/b64/x86_64/mod.rs":"e84176d838e663d351450bad218715db1fafbb531e47ea0e262cbb45829dae89","src/unix/linux_like/android/mod.rs":"b7cfd66a54c512c9df9fbc0e25baf7ecca1f0deb0dd789f811b0e1cab72b2244","src/unix/linux_like/emscripten/align.rs":"86c95cbed7a7161b1f23ee06843e7b0e2340ad92b2cb86fe2a8ef3e0e8c36216","src/unix/linux_like/emscripten/mod.rs":"0770f13ce30b98752d5e868332bf5a55bee8389108fe9d91cf2c2bf71c237093","src/unix/linux_like/emscripten/no_align.rs":"0128e4aa721a9902754828b61b5ec7d8a86619983ed1e0544a85d35b1051fad6","src/unix/linux_like/linux/align.rs":"213e70ebed2703e14a9cf17666b21ecbf180b7bff7fa22fdbb36dbbd52df326d","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":"4932bb1e4d6b00e3eea211f241a29d08a7a6cb310633d4cb585194ac088e19b7","src/unix/linux_like/linux/gnu/b32/mips/align.rs":"429fb5e005cb7143602d430098b6ebfb7d360685b194f333dfd587472ae954ee","src/unix/linux_like/linux/gnu/b32/mips/mod.rs":"5cf043f5342c37b1cf50bc09de9baaa8d120a8827640f328a74ebbff1fe5aca0","src/unix/linux_like/linux/gnu/b32/mod.rs":"3d282f97f171ce235e687169e7a494e65c21bdc4e59c28360dae60b6c2ffa80c","src/unix/linux_like/linux/gnu/b32/powerpc.rs":"527284eff16dbbed819a12f169a4f957e1ece913a6756be32b2938610c25fc73","src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs":"b16636eff9bcd1b6e23b4a915606f230a01cd8f2752e9331eb576cb023ad27f5","src/unix/linux_like/linux/gnu/b32/sparc/align.rs":"21adbed27df73e2d1ed934aaf733a643003d7baf2bde9c48ea440895bcca6d41","src/unix/linux_like/linux/gnu/b32/sparc/mod.rs":"98cb96fb979947a2d141d298739649e241168ba7047e6cd1928abdd722281c1b","src/unix/linux_like/linux/gnu/b32/x86/align.rs":"e4bafdc4a519a7922a81b37a62bbfd1177a2f620890eef8f1fbc47162e9eb413","src/unix/linux_like/linux/gnu/b32/x86/mod.rs":"43ddb3fc0e8a9d4b32f929bdbd7dbf3e18167409a6f8e8f12aa694ce34a8d7dc","src/unix/linux_like/linux/gnu/b64/aarch64/align.rs":"2179c3b1608fa4bf68840482bfc2b2fa3ee2faf6fcae3770f9e505cddca35c7b","src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs":"21a21503ef2e095f4371044915d4bfb07a8578011cb5c713cd9f45947b0b5730","src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs":"e78c3cd197f44832338b414d1a9bc0d194f44c74db77bd7bf830c1fff62b2690","src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs":"d2bc7110c0ea616471474957cb16ef54fac9567a569d90ca82961a4eda3fadda","src/unix/linux_like/linux/gnu/b64/mips64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/linux/gnu/b64/mips64/mod.rs":"ca99bae93eb60138c698ec6b0e78f87cb1dd7181ed3c42c3281c8037c7468921","src/unix/linux_like/linux/gnu/b64/mod.rs":"7bf5c9813032db77b964ccb90bdce15236ae9ea06ea185595278ea4565c21b7b","src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs":"e29c4868bbecfa4a6cd8a2ad06193f3bbc78a468cc1dc9df83f002f1268130d9","src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs":"facd49a8dfcd9e27c8dac6ebaefb07f801a1b8aa21b8d5f477ccf654a14b9d20","src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs":"aa980f78651165fff4db9c9ff33966b3345b682a3600827b91c8141e86f0ff1e","src/unix/linux_like/linux/gnu/b64/s390x.rs":"86562ad9e0468597b13eb8a606f3df456097ad7a9df11ee8dc77c215fc2fc5fc","src/unix/linux_like/linux/gnu/b64/sparc64/align.rs":"e29c4868bbecfa4a6cd8a2ad06193f3bbc78a468cc1dc9df83f002f1268130d9","src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs":"5eaf057e149846b07af6ccc17c6c1b7abf0b4a50ee4fbb100c7c81880c235398","src/unix/linux_like/linux/gnu/b64/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs":"f047199e4267bcb63a831379c72884ccf2189b5f2879479436342b2c5b58671e","src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs":"74deaf2135168fd8a8fe3382a443d3800b95ea833e94150b265cc59a24872166","src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs":"60ff6e9aca19226714cf0c7f58f4388f5f046cf099cc4f61f9a2913d94d7e846","src/unix/linux_like/linux/gnu/mod.rs":"1be1cd3b22972dc80d5d4e6d01300032726b8049e38c43508f0a86d991fa5a11","src/unix/linux_like/linux/gnu/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/linux_like/linux/mod.rs":"3f7e58dd79738ab1cf0724cc2239a259fccc4429cb0b2106cdef1b7a101ed1c8","src/unix/linux_like/linux/musl/b32/arm/align.rs":"3e8ac052c1043764776b54c93ba4260e061df998631737a897d9d47d54f7b80c","src/unix/linux_like/linux/musl/b32/arm/mod.rs":"5f65fb836de0f5d84dfb78894a045548dab3f62af5241319ec5da46686261a90","src/unix/linux_like/linux/musl/b32/hexagon.rs":"7c6c481f70da1fe6ca759f363784e130041f3d87906c45910fc1142b5ef17970","src/unix/linux_like/linux/musl/b32/mips/align.rs":"429fb5e005cb7143602d430098b6ebfb7d360685b194f333dfd587472ae954ee","src/unix/linux_like/linux/musl/b32/mips/mod.rs":"f7adecc4a36b4eb484c168b6c21e73f02ee23f607c0a0351f773f9d9c83b8400","src/unix/linux_like/linux/musl/b32/mod.rs":"8ede3985e6243882814ce91e8ce543e7edbafc0cee5932816072b6f14207a671","src/unix/linux_like/linux/musl/b32/powerpc.rs":"cf286cbf4d2076aaa82662ace2b5c333480410fa59af5cb4542d59f04da84b31","src/unix/linux_like/linux/musl/b32/x86/align.rs":"08e77fbd7435d7dec2ff56932433bece3f02e47ce810f89004a275a86d39cbe1","src/unix/linux_like/linux/musl/b32/x86/mod.rs":"ecb903211cb7a956ad1dab4dbef3a0344d9e4df4bd7b4a49ab5cc591df114dc2","src/unix/linux_like/linux/musl/b64/aarch64/align.rs":"798a9229d70ce235394f2dd625f6c4c1e10519a94382dc5b091952b638ae2928","src/unix/linux_like/linux/musl/b64/aarch64/mod.rs":"9870fd9a953c98b775c9e17a29a66bbe8019a6236eb69a0272f42232a226521d","src/unix/linux_like/linux/musl/b64/mips64.rs":"4bfd8ee1f22a163a7037e1e401d143573bcb14cc3321da0698528e9c0b68c81a","src/unix/linux_like/linux/musl/b64/mod.rs":"8b76e92a1505ad785d4aa0b7739e0b93647a1e81910949b49cedb6c88468be9c","src/unix/linux_like/linux/musl/b64/powerpc64.rs":"8992be6cb56e403e9a712c0ca4761934f873cf89f3e6d3cc4483f43e5a192351","src/unix/linux_like/linux/musl/b64/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/linux/musl/b64/x86_64/mod.rs":"d6d98b6e5af5d9b1caa7e67fe18c3c4d76fdb92603b42efed83719a41c53defe","src/unix/linux_like/linux/musl/mod.rs":"9115ae4fa6ea6a4f56f6a4addffe643436e0a07ac4e0b118b4a43ab1a058e739","src/unix/linux_like/linux/no_align.rs":"5ed04c53bf9d27da9b4d65ba7625c6ac53330162683d1b3df98950caafa3507b","src/unix/linux_like/mod.rs":"e65c49d9ee229aee11118758e36beebd90629e2e0c59647786cb0e472837d705","src/unix/mod.rs":"01148308e021d9d616d8324e20a1911fcde65e3c11e8e74c359a468bba6fedcd","src/unix/newlib/aarch64/mod.rs":"bb269c1468a9676442554600e87417079a787fe6220dfc23b3109639259e8710","src/unix/newlib/align.rs":"28aaf87fafbc6b312622719d472d8cf65f9e5467d15339df5f73e66d8502b28a","src/unix/newlib/arm/mod.rs":"c71be856bfd7f576b2db28af9f680211cbe6c1cac7d537bbc8020b39591af07c","src/unix/newlib/mod.rs":"35ea283f645afbc7ddebba90d46875c9dc5edc8d215d4becc9e2681a909c5aa1","src/unix/newlib/no_align.rs":"7123dcec13604a11b7765c380ff3a4d0da19c39f4b03919de7857723c0cf1502","src/unix/newlib/powerpc/mod.rs":"2d0f7af28b47f7a2a6c210ebd1c1f33ed8eac62e56b5af2b856de2ad3fdc5187","src/unix/newlib/xtensa/mod.rs":"4c72003c5e692e648c7e798358c49af6901e68850dbba0624af84c40baf208f5","src/unix/no_align.rs":"c06e95373b9088266e0b14bba0954eef95f93fb2b01d951855e382d22de78e53","src/unix/redox/mod.rs":"b865c65438e102403708fa8a299d02ea635bda0879a256d99fadd0092d42f224","src/unix/solarish/compat.rs":"3f13657fc072462b85b5f937f0db1427c41acb2a714cc4f78fefba1ea8036846","src/unix/solarish/illumos.rs":"c42db942ab90813ecc7b2b32dea0e173e1e349e2e049a06021fd0dbc090c2c30","src/unix/solarish/mod.rs":"8d7ddc8dd25a9404f9181a49438d9506c676cfd4b6fa21dbe5c1f9969abc4b91","src/unix/solarish/solaris.rs":"3d3cc14b47839da1e4ec117bce1395e22ef86d8d1eb1fdcc6464d2fd8267efb4","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":"a76e9b7cd24d05ca15e412d96d4b2d39f0b2320f7823b15873c6271c16b9c52b","src/unix/uclibc/mod.rs":"2ec3fbe6853807a796632bb8920c48dda18f46823d1c5121db19c29dc86d2800","src/unix/uclibc/no_align.rs":"3f28637046524618adaa1012e26cb7ffe94b9396e6b518cccdc69d59f274d709","src/unix/uclibc/x86_64/align.rs":"4e34cebb7955e9c98ae2f310be6f8ed16a861fc3817c08543867554aeec9524e","src/unix/uclibc/x86_64/l4re.rs":"bb31053d6403091e11f95ac2203982f279f8b984a19adf30796878c45fdd8c25","src/unix/uclibc/x86_64/mod.rs":"188fbaf06a8e23cac72718b1ef7eb4bd98bdfd946aa708151f3f7e3553b65876","src/unix/uclibc/x86_64/no_align.rs":"2ccc0107a6007c70dc49e656095b64a352ca5d8f9f3e65c1dba634effbc15636","src/unix/uclibc/x86_64/other.rs":"42c3f71e58cabba373f6a55a623f3c31b85049eb64824c09c2b082b3b2d6a0a8","src/vxworks/aarch64.rs":"98f0afdc511cd02557e506c21fed6737585490a1dce7a9d4941d08c437762b99","src/vxworks/arm.rs":"acb7968ce99fe3f4abdf39d98f8133d21a4fba435b8ef7084777cb181d788e88","src/vxworks/mod.rs":"ce8eb593241f7ac0c9d5e91d535457cd169ddcb3d061d3982ba5bcf6b8d63876","src/vxworks/powerpc.rs":"acb7968ce99fe3f4abdf39d98f8133d21a4fba435b8ef7084777cb181d788e88","src/vxworks/powerpc64.rs":"98f0afdc511cd02557e506c21fed6737585490a1dce7a9d4941d08c437762b99","src/vxworks/x86.rs":"552f007f38317620b23889cb7c49d1d115841252439060122f52f434fbc6e5ba","src/vxworks/x86_64.rs":"018d92be3ad628a129eff9f2f5dfbc0883d8b8e5f2fa917b900a7f98ed6b514a","src/wasi.rs":"11e1ca29d1a446845c551d5717ec5c6081459a2a850781c9194f557d53ecf44f","src/windows/gnu/align.rs":"b2c13ec1b9f3b39a75c452c80c951dff9d0215e31d77e883b4502afb31794647","src/windows/gnu/mod.rs":"c7ab9793baaa3b6854d25fdf44266b7953533009e4fa722ca717b71d3e5d2c9d","src/windows/mod.rs":"7b74bf885712d16a3557df33ef02799dc03d4a1af953c7e6b4648954ce7a20fc","src/windows/msvc.rs":"2c2bfce66027d88021e7289139ebf5b0db258a7b6443f18872c84dbd4ef57131","tests/const_fn.rs":"cb75a1f0864f926aebe79118fc34d51a0d1ade2c20a394e7774c7e545f21f1f4"},"package":"7ccac4b00700875e6a07c6cde370d44d32fa01c5a65cdd2fca6858c479d28bb3"} \ No newline at end of file +{"files":{"CONTRIBUTING.md":"50547f85785c64798a3bb93515b795603a78fa131fb92c7e2d1e4d7b463eb829","Cargo.toml":"fb6bb6cbdf66b031372de59ed831b8c90124d96a966072d7cff5d6acee7a6657","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"a8d47ff51ca256f56a8932dba07660672dbfe3004257ca8de708aac1415937a1","README.md":"8228847944f1332882fbb00275b6f30e4a8aad08a13569c25d52cac012cc2a47","build.rs":"da312dbe6ad942063ec1e92509c672639aea86b4d73b28bbb9e5e78ca3a897e1","rustfmt.toml":"8a654d5787585ca8f2c20580737336fc327f411a07b0dbd4870adf6e9bdf624f","src/fixed_width_ints.rs":"34c60f12ec5eeb90f13ec3b954427532111c2446e69617616a97aefc1086a9f1","src/fuchsia/aarch64.rs":"378776a9e40766154a54c94c2a7b4675b5c302a38e6e42da99e67bfbaee60e56","src/fuchsia/align.rs":"ae1cf8f011a99737eabeb14ffff768e60f13b13363d7646744dbb0f443dab3d6","src/fuchsia/mod.rs":"0bc9db9863eca7e6254c9bf150812e8ad1c1460b3228126e4a12f26b9d7a03da","src/fuchsia/no_align.rs":"303f3f1b255e0088b5715094353cf00476131d8e94e6aebb3f469557771c8b8a","src/fuchsia/x86_64.rs":"93a3632b5cf67d2a6bcb7dc0a558605252d5fe689e0f38d8aa2ec5852255ac87","src/hermit/aarch64.rs":"86048676e335944c37a63d0083d0f368ae10ceccefeed9debb3bbe08777fc682","src/hermit/mod.rs":"d3bfce41e4463d4be8020a2d063c9bfa8b665f45f1cc6cbf3163f5d01e7cb21f","src/hermit/x86_64.rs":"ab832b7524e5fb15c49ff7431165ab1a37dc4667ae0b58e8306f4c539bfa110c","src/lib.rs":"d4f7452c0fe720f3a961b918b74ec86d19cef33e6b4aac08efbbad6f6d818e09","src/macros.rs":"7844312c233a6889fa15395fe3106f6a8f6229211104a92f33ea3c9536eef763","src/psp.rs":"017fdd719cc85352a1c062d40edd96a821e19d25abe23b55e40ed6e7ac2892e1","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/aarch64/align.rs":"f0c321265dd7671f16106b84951ac7dd77ed2e65c6623cbf2d29e76531984770","src/unix/bsd/apple/b64/aarch64/mod.rs":"46d5d061c7a74cbc09cbdfb3bee9a600867bf4e04c0e4d0ca6c817e6033b32e1","src/unix/bsd/apple/b64/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b64/mod.rs":"f5e278a1af7fb358891d1c9be4eb7e815aaca0c5cb738d0c3604ba2208a856f7","src/unix/bsd/apple/b64/x86_64/align.rs":"ec833a747866fe19ca2d9b4d3c9ff0385faba5edf4bd0d15fa68884c40b0e26c","src/unix/bsd/apple/b64/x86_64/mod.rs":"cc6878dd130c3f255418e4da74992ae9ba6a3cdb0530772de76c518077d3b12a","src/unix/bsd/apple/mod.rs":"1f4596b7a6e2317e57167e6a9e02fcac1052c201c0f61280b246a19147359a79","src/unix/bsd/freebsdlike/dragonfly/errno.rs":"8295b8bb0dfd38d2cdb4d9192cdeeb534cc6c3b208170e64615fa3e0edb3e578","src/unix/bsd/freebsdlike/dragonfly/mod.rs":"aceb12eb54b198ae04a64f6308eeb6ec1bf9132c9d98427134292c79f1a61c38","src/unix/bsd/freebsdlike/freebsd/aarch64.rs":"14f0bd6693967d4fedec904f7042bd51f2138cb843ec4df18c911b357417cdd2","src/unix/bsd/freebsdlike/freebsd/arm.rs":"59d6a670eea562fb87686e243e0a84603d29a2028a3d4b3f99ccc01bd04d2f47","src/unix/bsd/freebsdlike/freebsd/freebsd11/b64.rs":"9808d152c1196aa647f1b0f0cf84dac8c930da7d7f897a44975545e3d9d17681","src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs":"2e9b8f8af44eb75539c7688c2723745a5f10079a7faac99e43ae7534bd111f48","src/unix/bsd/freebsdlike/freebsd/freebsd12/b64.rs":"61cbe45f8499bedb168106b686d4f8239472f25c7553b069eec2afe197ff2df6","src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs":"09a2441852a6dfb7e7fce28d5115ce243109deab1c569d80c67c5b634ac4bb23","src/unix/bsd/freebsdlike/freebsd/freebsd13/b64.rs":"61cbe45f8499bedb168106b686d4f8239472f25c7553b069eec2afe197ff2df6","src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs":"72a87d191189486d44bc19a3296817fcf828087ce1286bca20d474a3b2602602","src/unix/bsd/freebsdlike/freebsd/mod.rs":"c12a475eed4a2ebc7f2261f82875dc6dfa33649cbb176073c03183bf26c5f5b9","src/unix/bsd/freebsdlike/freebsd/powerpc64.rs":"2dae3ecc87eac3b11657aa98915def55fc4b5c0de11fe26aae23329a54628a9a","src/unix/bsd/freebsdlike/freebsd/x86.rs":"c5005e3249eb7c93cfbac72a9e9272320d80ce7983da990ceb05a447f59a02c5","src/unix/bsd/freebsdlike/freebsd/x86_64/align.rs":"0e1f69a88fca1c32874b1daf5db3d446fefbe518dca497f096cc9168c39dde70","src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs":"6132aa0973454379674ea6cbc77e6eace1e1032dd9f38182071388a036f1bc08","src/unix/bsd/freebsdlike/mod.rs":"393d03b6c46c23b727a3de1d7644bca18c9fb68d0e91f175ac4880f64dcf37e8","src/unix/bsd/mod.rs":"26160c60a33cec65ccc3b28277d40bd95f7f62ee857f931ada76cbc7c2694858","src/unix/bsd/netbsdlike/mod.rs":"48dd60524119c1e09b255d5472d091e7e7b2b29eab04be51b4b1e740bd022859","src/unix/bsd/netbsdlike/netbsd/aarch64.rs":"b38fc046f9a40fea28bd26328b96629f4d5d63d7524936bd6af1865d401a8716","src/unix/bsd/netbsdlike/netbsd/arm.rs":"58cdbb70b0d6f536551f0f3bb3725d2d75c4690db12c26c034e7d6ec4a924452","src/unix/bsd/netbsdlike/netbsd/mod.rs":"ef048d255a598691217edd86ca9b3edd90ce5f96fc57b1a479214141c9a36ec4","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":"253888b365d4f0dd86d3eae1a63662248514b132031d4bf5434d8a63144ce296","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":"980793af95e9ce82796c8ef487aca2003a1e62f9b23dba84b81331b24f971612","src/unix/haiku/native.rs":"a35b5df389dab4dcff10c758a6714cb69263cf5f3465285d0632ea336a2a617b","src/unix/hermit/aarch64.rs":"86048676e335944c37a63d0083d0f368ae10ceccefeed9debb3bbe08777fc682","src/unix/hermit/mod.rs":"2d8d3ce0299931199011bb73136bebbddf88edf7d263cc39d26dbfaaa1a14228","src/unix/hermit/x86_64.rs":"ab832b7524e5fb15c49ff7431165ab1a37dc4667ae0b58e8306f4c539bfa110c","src/unix/linux_like/android/b32/arm.rs":"d611801c875a1066ff596ba813a80c1689aa54489bbd5bd8af4610c786d97a36","src/unix/linux_like/android/b32/mod.rs":"6b3fd3e1eb21e50d000f496729b40968b1c728f5f10d4fb18a9aef44bff383ff","src/unix/linux_like/android/b32/x86/align.rs":"812914e4241df82e32b12375ca3374615dc3a4bdd4cf31f0423c5815320c0dab","src/unix/linux_like/android/b32/x86/mod.rs":"8388bd3a0fcb5636bf965eee6dc95ae6860b85a2b555b387c868aa4d4e01ec89","src/unix/linux_like/android/b64/aarch64/align.rs":"2179c3b1608fa4bf68840482bfc2b2fa3ee2faf6fcae3770f9e505cddca35c7b","src/unix/linux_like/android/b64/aarch64/mod.rs":"db23f94bc3ed46a0967dde748f0d4566fc885cc6171d0555007f3398ff99a708","src/unix/linux_like/android/b64/mod.rs":"e3078e856e43fde9b57d8a5aa840a590f2e18517a3e8de23e9c2a3d798596f43","src/unix/linux_like/android/b64/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/android/b64/x86_64/mod.rs":"e84176d838e663d351450bad218715db1fafbb531e47ea0e262cbb45829dae89","src/unix/linux_like/android/mod.rs":"87ab84d45d989a98d99975d1d153ad0292eb33e84beb4fac1e79b417b5bfaf11","src/unix/linux_like/emscripten/align.rs":"86c95cbed7a7161b1f23ee06843e7b0e2340ad92b2cb86fe2a8ef3e0e8c36216","src/unix/linux_like/emscripten/mod.rs":"0770f13ce30b98752d5e868332bf5a55bee8389108fe9d91cf2c2bf71c237093","src/unix/linux_like/emscripten/no_align.rs":"0128e4aa721a9902754828b61b5ec7d8a86619983ed1e0544a85d35b1051fad6","src/unix/linux_like/linux/align.rs":"213e70ebed2703e14a9cf17666b21ecbf180b7bff7fa22fdbb36dbbd52df326d","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":"4932bb1e4d6b00e3eea211f241a29d08a7a6cb310633d4cb585194ac088e19b7","src/unix/linux_like/linux/gnu/b32/mips/align.rs":"429fb5e005cb7143602d430098b6ebfb7d360685b194f333dfd587472ae954ee","src/unix/linux_like/linux/gnu/b32/mips/mod.rs":"5cf043f5342c37b1cf50bc09de9baaa8d120a8827640f328a74ebbff1fe5aca0","src/unix/linux_like/linux/gnu/b32/mod.rs":"3d282f97f171ce235e687169e7a494e65c21bdc4e59c28360dae60b6c2ffa80c","src/unix/linux_like/linux/gnu/b32/powerpc.rs":"527284eff16dbbed819a12f169a4f957e1ece913a6756be32b2938610c25fc73","src/unix/linux_like/linux/gnu/b32/riscv32/mod.rs":"b16636eff9bcd1b6e23b4a915606f230a01cd8f2752e9331eb576cb023ad27f5","src/unix/linux_like/linux/gnu/b32/sparc/align.rs":"21adbed27df73e2d1ed934aaf733a643003d7baf2bde9c48ea440895bcca6d41","src/unix/linux_like/linux/gnu/b32/sparc/mod.rs":"98cb96fb979947a2d141d298739649e241168ba7047e6cd1928abdd722281c1b","src/unix/linux_like/linux/gnu/b32/x86/align.rs":"e4bafdc4a519a7922a81b37a62bbfd1177a2f620890eef8f1fbc47162e9eb413","src/unix/linux_like/linux/gnu/b32/x86/mod.rs":"43ddb3fc0e8a9d4b32f929bdbd7dbf3e18167409a6f8e8f12aa694ce34a8d7dc","src/unix/linux_like/linux/gnu/b64/aarch64/align.rs":"2179c3b1608fa4bf68840482bfc2b2fa3ee2faf6fcae3770f9e505cddca35c7b","src/unix/linux_like/linux/gnu/b64/aarch64/ilp32.rs":"21a21503ef2e095f4371044915d4bfb07a8578011cb5c713cd9f45947b0b5730","src/unix/linux_like/linux/gnu/b64/aarch64/lp64.rs":"e78c3cd197f44832338b414d1a9bc0d194f44c74db77bd7bf830c1fff62b2690","src/unix/linux_like/linux/gnu/b64/aarch64/mod.rs":"d2bc7110c0ea616471474957cb16ef54fac9567a569d90ca82961a4eda3fadda","src/unix/linux_like/linux/gnu/b64/mips64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/linux/gnu/b64/mips64/mod.rs":"ca99bae93eb60138c698ec6b0e78f87cb1dd7181ed3c42c3281c8037c7468921","src/unix/linux_like/linux/gnu/b64/mod.rs":"7bf5c9813032db77b964ccb90bdce15236ae9ea06ea185595278ea4565c21b7b","src/unix/linux_like/linux/gnu/b64/powerpc64/align.rs":"e29c4868bbecfa4a6cd8a2ad06193f3bbc78a468cc1dc9df83f002f1268130d9","src/unix/linux_like/linux/gnu/b64/powerpc64/mod.rs":"facd49a8dfcd9e27c8dac6ebaefb07f801a1b8aa21b8d5f477ccf654a14b9d20","src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs":"aa980f78651165fff4db9c9ff33966b3345b682a3600827b91c8141e86f0ff1e","src/unix/linux_like/linux/gnu/b64/s390x.rs":"86562ad9e0468597b13eb8a606f3df456097ad7a9df11ee8dc77c215fc2fc5fc","src/unix/linux_like/linux/gnu/b64/sparc64/align.rs":"e29c4868bbecfa4a6cd8a2ad06193f3bbc78a468cc1dc9df83f002f1268130d9","src/unix/linux_like/linux/gnu/b64/sparc64/mod.rs":"5eaf057e149846b07af6ccc17c6c1b7abf0b4a50ee4fbb100c7c81880c235398","src/unix/linux_like/linux/gnu/b64/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs":"f047199e4267bcb63a831379c72884ccf2189b5f2879479436342b2c5b58671e","src/unix/linux_like/linux/gnu/b64/x86_64/not_x32.rs":"74deaf2135168fd8a8fe3382a443d3800b95ea833e94150b265cc59a24872166","src/unix/linux_like/linux/gnu/b64/x86_64/x32.rs":"60ff6e9aca19226714cf0c7f58f4388f5f046cf099cc4f61f9a2913d94d7e846","src/unix/linux_like/linux/gnu/mod.rs":"a175368149ba4a0f42f0b5aa59faf4fdfd332adfe643d4ef8161609c02c210e1","src/unix/linux_like/linux/gnu/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/linux_like/linux/mod.rs":"cafa7a6b25c54451f5a72aa31833b6804e88dde7713abfe2859cafb57ab7e5ed","src/unix/linux_like/linux/musl/b32/arm/align.rs":"3e8ac052c1043764776b54c93ba4260e061df998631737a897d9d47d54f7b80c","src/unix/linux_like/linux/musl/b32/arm/mod.rs":"5f65fb836de0f5d84dfb78894a045548dab3f62af5241319ec5da46686261a90","src/unix/linux_like/linux/musl/b32/hexagon.rs":"7c6c481f70da1fe6ca759f363784e130041f3d87906c45910fc1142b5ef17970","src/unix/linux_like/linux/musl/b32/mips/align.rs":"429fb5e005cb7143602d430098b6ebfb7d360685b194f333dfd587472ae954ee","src/unix/linux_like/linux/musl/b32/mips/mod.rs":"f7adecc4a36b4eb484c168b6c21e73f02ee23f607c0a0351f773f9d9c83b8400","src/unix/linux_like/linux/musl/b32/mod.rs":"8ede3985e6243882814ce91e8ce543e7edbafc0cee5932816072b6f14207a671","src/unix/linux_like/linux/musl/b32/powerpc.rs":"cf286cbf4d2076aaa82662ace2b5c333480410fa59af5cb4542d59f04da84b31","src/unix/linux_like/linux/musl/b32/x86/align.rs":"08e77fbd7435d7dec2ff56932433bece3f02e47ce810f89004a275a86d39cbe1","src/unix/linux_like/linux/musl/b32/x86/mod.rs":"ecb903211cb7a956ad1dab4dbef3a0344d9e4df4bd7b4a49ab5cc591df114dc2","src/unix/linux_like/linux/musl/b64/aarch64/align.rs":"798a9229d70ce235394f2dd625f6c4c1e10519a94382dc5b091952b638ae2928","src/unix/linux_like/linux/musl/b64/aarch64/mod.rs":"9870fd9a953c98b775c9e17a29a66bbe8019a6236eb69a0272f42232a226521d","src/unix/linux_like/linux/musl/b64/mips64.rs":"848c8f7ba23b2bab2b070f0d37b42854605dc0bbd660a6728a3aea9a23d9f9e8","src/unix/linux_like/linux/musl/b64/mod.rs":"cf615e1d34fd657f4dffff528de2291750cd0ccceb737018022f31b10fe0d16f","src/unix/linux_like/linux/musl/b64/powerpc64.rs":"8992be6cb56e403e9a712c0ca4761934f873cf89f3e6d3cc4483f43e5a192351","src/unix/linux_like/linux/musl/b64/s390x.rs":"ad940de8bb6cd6a8efa266274dbe96045d071d90700b620949970a033236aad7","src/unix/linux_like/linux/musl/b64/x86_64/align.rs":"7169d07a9fd4716f7512719aec9fda5d8bed306dc0720ffc1b21696c9951e3c6","src/unix/linux_like/linux/musl/b64/x86_64/mod.rs":"d6d98b6e5af5d9b1caa7e67fe18c3c4d76fdb92603b42efed83719a41c53defe","src/unix/linux_like/linux/musl/mod.rs":"e0145896cb14dcd2507cfff420aec20a53b4b1dda1f32b34007ff154d0b9b63d","src/unix/linux_like/linux/no_align.rs":"5ed04c53bf9d27da9b4d65ba7625c6ac53330162683d1b3df98950caafa3507b","src/unix/linux_like/linux/uclibc/align.rs":"9ed16138d8e439bd90930845a65eafa7ebd67366e6bf633936d44014f6e4c959","src/unix/linux_like/linux/uclibc/arm/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/linux_like/linux/uclibc/arm/mod.rs":"dacb13a12c4abae440c7a600580d84c590b6b420f79b24d5a0b57e04894b45fc","src/unix/linux_like/linux/uclibc/arm/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/linux_like/linux/uclibc/mips/mips32/align.rs":"e4a3c27fe20a57b8d612c34cb05bc70646edb5cec7251957315afa53a7b9f936","src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs":"bc8833cb438c252f43801dbecc339c9527f4ca0d197563bc4cfa53093ddd7af0","src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs":"9cd223135de75315840ff9c3fd5441ba1cb632b96b5c85a76f8316c86653db25","src/unix/linux_like/linux/uclibc/mips/mips64/align.rs":"a7bdcb18a37a2d91e64d5fad83ea3edc78f5412adb28f77ab077dbb26dd08b2d","src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs":"e3085ba56cfbc528d7c3c55065880603238c333b6047ef51c58177508a487fcd","src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs":"4a18e3875698c85229599225ac3401a2a40da87e77b2ad4ef47c6fcd5a24ed30","src/unix/linux_like/linux/uclibc/mips/mod.rs":"18623e880c79e10dd1e556860460323c4d06d3b9f2db5a71fbf5ac038cf9923a","src/unix/linux_like/linux/uclibc/mod.rs":"ac2fcd42bc21b854de629730288738bb95c9d652aaa6e652f486ff935b0addbd","src/unix/linux_like/linux/uclibc/no_align.rs":"3f28637046524618adaa1012e26cb7ffe94b9396e6b518cccdc69d59f274d709","src/unix/linux_like/linux/uclibc/x86_64/l4re.rs":"bb31053d6403091e11f95ac2203982f279f8b984a19adf30796878c45fdd8c25","src/unix/linux_like/linux/uclibc/x86_64/mod.rs":"634a669cef55569498ef4bf9f86a894d795442a3c445510dec91183f6f897dac","src/unix/linux_like/linux/uclibc/x86_64/other.rs":"42c3f71e58cabba373f6a55a623f3c31b85049eb64824c09c2b082b3b2d6a0a8","src/unix/linux_like/mod.rs":"7801de13d23b89f80f4f3ff8cebaf7a92887d4ed25da2c943a159f3eca9496e8","src/unix/mod.rs":"5a4c42b444abab61f8adf0410f2a3fba94c53261d1d050372f4498f70a84931f","src/unix/newlib/aarch64/mod.rs":"bb269c1468a9676442554600e87417079a787fe6220dfc23b3109639259e8710","src/unix/newlib/align.rs":"28aaf87fafbc6b312622719d472d8cf65f9e5467d15339df5f73e66d8502b28a","src/unix/newlib/arm/mod.rs":"c71be856bfd7f576b2db28af9f680211cbe6c1cac7d537bbc8020b39591af07c","src/unix/newlib/mod.rs":"35ea283f645afbc7ddebba90d46875c9dc5edc8d215d4becc9e2681a909c5aa1","src/unix/newlib/no_align.rs":"7123dcec13604a11b7765c380ff3a4d0da19c39f4b03919de7857723c0cf1502","src/unix/newlib/powerpc/mod.rs":"2d0f7af28b47f7a2a6c210ebd1c1f33ed8eac62e56b5af2b856de2ad3fdc5187","src/unix/newlib/xtensa/mod.rs":"4c72003c5e692e648c7e798358c49af6901e68850dbba0624af84c40baf208f5","src/unix/no_align.rs":"c06e95373b9088266e0b14bba0954eef95f93fb2b01d951855e382d22de78e53","src/unix/redox/mod.rs":"b865c65438e102403708fa8a299d02ea635bda0879a256d99fadd0092d42f224","src/unix/solarish/compat.rs":"3f13657fc072462b85b5f937f0db1427c41acb2a714cc4f78fefba1ea8036846","src/unix/solarish/illumos.rs":"100845235d27978725d7ff71d58c1b1eb7b360be489056b2758c6cc7244e252e","src/unix/solarish/mod.rs":"ed57a5ad4c715a9038055fe3a57ea12f5ef97c55c3f603596e721a5cbb90ed73","src/unix/solarish/solaris.rs":"3d3cc14b47839da1e4ec117bce1395e22ef86d8d1eb1fdcc6464d2fd8267efb4","src/vxworks/aarch64.rs":"98f0afdc511cd02557e506c21fed6737585490a1dce7a9d4941d08c437762b99","src/vxworks/arm.rs":"acb7968ce99fe3f4abdf39d98f8133d21a4fba435b8ef7084777cb181d788e88","src/vxworks/mod.rs":"ce8eb593241f7ac0c9d5e91d535457cd169ddcb3d061d3982ba5bcf6b8d63876","src/vxworks/powerpc.rs":"acb7968ce99fe3f4abdf39d98f8133d21a4fba435b8ef7084777cb181d788e88","src/vxworks/powerpc64.rs":"98f0afdc511cd02557e506c21fed6737585490a1dce7a9d4941d08c437762b99","src/vxworks/x86.rs":"552f007f38317620b23889cb7c49d1d115841252439060122f52f434fbc6e5ba","src/vxworks/x86_64.rs":"018d92be3ad628a129eff9f2f5dfbc0883d8b8e5f2fa917b900a7f98ed6b514a","src/wasi.rs":"bbdfbffd96969f9028d13ad61e08db88769d47a33e45ecc683d9ae203d94130a","src/windows/gnu/align.rs":"b2c13ec1b9f3b39a75c452c80c951dff9d0215e31d77e883b4502afb31794647","src/windows/gnu/mod.rs":"c7ab9793baaa3b6854d25fdf44266b7953533009e4fa722ca717b71d3e5d2c9d","src/windows/mod.rs":"7b74bf885712d16a3557df33ef02799dc03d4a1af953c7e6b4648954ce7a20fc","src/windows/msvc.rs":"2c2bfce66027d88021e7289139ebf5b0db258a7b6443f18872c84dbd4ef57131","tests/const_fn.rs":"cb75a1f0864f926aebe79118fc34d51a0d1ade2c20a394e7774c7e545f21f1f4"},"package":"03b07a082330a35e43f63177cc01689da34fbffa0105e1246cf0311472cac73a"} \ No newline at end of file diff --git a/vendor/libc/Cargo.toml b/vendor/libc/Cargo.toml index 5d603fe4c5..34854e1780 100644 --- a/vendor/libc/Cargo.toml +++ b/vendor/libc/Cargo.toml @@ -12,7 +12,7 @@ [package] name = "libc" -version = "0.2.85" +version = "0.2.88" authors = ["The Rust Project Developers"] build = "build.rs" exclude = ["/ci/*", "/.github/*", "/.cirrus.yml", "/triagebot.toml"] diff --git a/vendor/libc/build.rs b/vendor/libc/build.rs index 27cfb02401..ef43dfb788 100644 --- a/vendor/libc/build.rs +++ b/vendor/libc/build.rs @@ -10,6 +10,7 @@ fn main() { let const_extern_fn_cargo_feature = env::var("CARGO_FEATURE_CONST_EXTERN_FN").is_ok(); let libc_ci = env::var("LIBC_CI").is_ok(); + let target = env::var("TARGET").unwrap(); if env::var("CARGO_FEATURE_USE_STD").is_ok() { println!( @@ -82,6 +83,12 @@ fn main() { } println!("cargo:rustc-cfg=libc_const_extern_fn"); } + + // For unknown reason, libiconv can't be linked by adding #[link(name = iconv)] to + // a macOS-specific struct, so we do the linking here. + if target.contains("-apple-") { + println!("cargo:rustc-link-lib=iconv"); + } } fn rustc_minor_nightly() -> Option<(u32, bool)> { diff --git a/vendor/libc/src/cloudabi/aarch64.rs b/vendor/libc/src/cloudabi/aarch64.rs deleted file mode 100644 index 4caa6d7bbc..0000000000 --- a/vendor/libc/src/cloudabi/aarch64.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub type c_char = u8; -pub type c_long = i64; -pub type c_ulong = u64; -pub type wchar_t = u32; diff --git a/vendor/libc/src/cloudabi/arm.rs b/vendor/libc/src/cloudabi/arm.rs deleted file mode 100644 index eca5360744..0000000000 --- a/vendor/libc/src/cloudabi/arm.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub type c_char = u8; -pub type c_long = i32; -pub type c_ulong = u32; -pub type wchar_t = u32; diff --git a/vendor/libc/src/cloudabi/mod.rs b/vendor/libc/src/cloudabi/mod.rs deleted file mode 100644 index 77817121d6..0000000000 --- a/vendor/libc/src/cloudabi/mod.rs +++ /dev/null @@ -1,375 +0,0 @@ -pub type c_schar = i8; -pub type c_uchar = u8; -pub type c_short = i16; -pub type c_ushort = u16; -pub type c_int = i32; -pub type c_uint = u32; -pub type c_float = f32; -pub type c_double = f64; -pub type c_longlong = i64; -pub type c_ulonglong = u64; -pub type intmax_t = i64; -pub type uintmax_t = u64; - -pub type size_t = usize; -pub type ptrdiff_t = isize; -pub type intptr_t = isize; -pub type uintptr_t = usize; -pub type ssize_t = isize; - -pub type in_addr_t = u32; -pub type in_port_t = u16; -pub type pthread_key_t = usize; -pub type pthread_t = usize; -pub type sa_family_t = u8; -pub type socklen_t = usize; -pub type time_t = i64; - -s! { - pub struct addrinfo { - pub ai_flags: ::c_int, - pub ai_family: ::c_int, - pub ai_socktype: ::c_int, - pub ai_protocol: ::c_int, - pub ai_addrlen: ::socklen_t, - pub ai_addr: *mut ::sockaddr, - pub ai_canonname: *mut ::c_char, - pub ai_next: *mut addrinfo, - } - - pub struct in_addr { - pub s_addr: in_addr_t, - } - - pub struct in6_addr { - pub s6_addr: [u8; 16], - } - - pub struct pthread_attr_t { - __detachstate: ::c_int, - __stacksize: usize, - } - - pub struct sockaddr { - pub sa_family: sa_family_t, - pub sa_data: [::c_char; 0], - } - - pub struct sockaddr_in { - pub sin_family: ::sa_family_t, - pub sin_port: ::in_port_t, - pub sin_addr: ::in_addr, - } - - pub struct sockaddr_in6 { - pub sin6_family: sa_family_t, - pub sin6_port: ::in_port_t, - pub sin6_flowinfo: u32, - pub sin6_addr: ::in6_addr, - pub sin6_scope_id: u32, - } - - pub struct sockaddr_storage { - pub ss_family: ::sa_family_t, - __ss_data: [u8; 32], - } -} - -pub const INT_MIN: c_int = -2147483648; -pub const INT_MAX: c_int = 2147483647; - -pub const _SC_NPROCESSORS_ONLN: ::c_int = 52; -pub const _SC_PAGESIZE: ::c_int = 54; - -pub const AF_INET: ::c_int = 1; -pub const AF_INET6: ::c_int = 2; - -pub const EACCES: ::c_int = 2; -pub const EADDRINUSE: ::c_int = 3; -pub const EADDRNOTAVAIL: ::c_int = 4; -pub const EAGAIN: ::c_int = 6; -pub const ECONNABORTED: ::c_int = 13; -pub const ECONNREFUSED: ::c_int = 14; -pub const ECONNRESET: ::c_int = 15; -pub const EEXIST: ::c_int = 20; -pub const EINTR: ::c_int = 27; -pub const EINVAL: ::c_int = 28; -pub const ENOENT: ::c_int = 44; -pub const ENOTCONN: ::c_int = 53; -pub const EPERM: ::c_int = 63; -pub const EPIPE: ::c_int = 64; -pub const ETIMEDOUT: ::c_int = 73; -pub const EWOULDBLOCK: ::c_int = EAGAIN; - -pub const EAI_SYSTEM: ::c_int = 9; - -pub const EXIT_FAILURE: ::c_int = 1; -pub const EXIT_SUCCESS: ::c_int = 0; - -pub const PTHREAD_STACK_MIN: ::size_t = 1024; - -pub const SOCK_DGRAM: ::c_int = 128; -pub const SOCK_STREAM: ::c_int = 130; - -#[cfg_attr(feature = "extra_traits", derive(Debug))] -pub enum FILE {} -impl ::Copy for FILE {} -impl ::Clone for FILE { - fn clone(&self) -> FILE { - *self - } -} -#[cfg_attr(feature = "extra_traits", derive(Debug))] -pub enum fpos_t {} // FIXME: fill this out with a struct -impl ::Copy for fpos_t {} -impl ::Clone for fpos_t { - fn clone(&self) -> fpos_t { - *self - } -} - -extern "C" { - pub fn isalnum(c: c_int) -> c_int; - pub fn isalpha(c: c_int) -> c_int; - pub fn iscntrl(c: c_int) -> c_int; - pub fn isdigit(c: c_int) -> c_int; - pub fn isgraph(c: c_int) -> c_int; - pub fn islower(c: c_int) -> c_int; - pub fn isprint(c: c_int) -> c_int; - pub fn ispunct(c: c_int) -> c_int; - pub fn isspace(c: c_int) -> c_int; - pub fn isupper(c: c_int) -> c_int; - pub fn isxdigit(c: c_int) -> c_int; - pub fn isblank(c: c_int) -> c_int; - pub fn tolower(c: c_int) -> c_int; - pub fn toupper(c: c_int) -> c_int; - pub fn fopen(filename: *const c_char, mode: *const c_char) -> *mut FILE; - pub fn freopen( - filename: *const c_char, - mode: *const c_char, - file: *mut FILE, - ) -> *mut FILE; - pub fn fflush(file: *mut FILE) -> c_int; - pub fn fclose(file: *mut FILE) -> c_int; - pub fn remove(filename: *const c_char) -> c_int; - pub fn rename(oldname: *const c_char, newname: *const c_char) -> c_int; - pub fn tmpfile() -> *mut FILE; - pub fn setvbuf( - stream: *mut FILE, - buffer: *mut c_char, - mode: c_int, - size: size_t, - ) -> c_int; - pub fn setbuf(stream: *mut FILE, buf: *mut c_char); - pub fn getchar() -> c_int; - pub fn putchar(c: c_int) -> c_int; - pub fn fgetc(stream: *mut FILE) -> c_int; - pub fn fgets(buf: *mut c_char, n: c_int, stream: *mut FILE) - -> *mut c_char; - pub fn fputc(c: c_int, stream: *mut FILE) -> c_int; - pub fn fputs(s: *const c_char, stream: *mut FILE) -> c_int; - pub fn puts(s: *const c_char) -> c_int; - pub fn ungetc(c: c_int, stream: *mut FILE) -> c_int; - pub fn fread( - ptr: *mut c_void, - size: size_t, - nobj: size_t, - stream: *mut FILE, - ) -> size_t; - pub fn fwrite( - ptr: *const c_void, - size: size_t, - nobj: size_t, - stream: *mut FILE, - ) -> size_t; - pub fn fseek(stream: *mut FILE, offset: c_long, whence: c_int) -> c_int; - pub fn ftell(stream: *mut FILE) -> c_long; - pub fn rewind(stream: *mut FILE); - pub fn fgetpos(stream: *mut FILE, ptr: *mut fpos_t) -> c_int; - pub fn fsetpos(stream: *mut FILE, ptr: *const fpos_t) -> c_int; - pub fn feof(stream: *mut FILE) -> c_int; - pub fn ferror(stream: *mut FILE) -> c_int; - pub fn perror(s: *const c_char); - pub fn atoi(s: *const c_char) -> c_int; - pub fn strtod(s: *const c_char, endp: *mut *mut c_char) -> c_double; - pub fn strtol( - s: *const c_char, - endp: *mut *mut c_char, - base: c_int, - ) -> c_long; - pub fn strtoul( - s: *const c_char, - endp: *mut *mut c_char, - base: c_int, - ) -> c_ulong; - pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void; - pub fn malloc(size: size_t) -> *mut c_void; - pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void; - pub fn free(p: *mut c_void); - pub fn abort() -> !; - pub fn exit(status: c_int) -> !; - pub fn _exit(status: c_int) -> !; - pub fn atexit(cb: extern "C" fn()) -> c_int; - pub fn system(s: *const c_char) -> c_int; - pub fn getenv(s: *const c_char) -> *mut c_char; - pub fn getline( - lineptr: *mut *mut c_char, - n: *mut size_t, - stream: *mut FILE, - ) -> ssize_t; - - pub fn strcpy(dst: *mut c_char, src: *const c_char) -> *mut c_char; - pub fn strncpy( - dst: *mut c_char, - src: *const c_char, - n: size_t, - ) -> *mut c_char; - pub fn strcat(s: *mut c_char, ct: *const c_char) -> *mut c_char; - pub fn strncat( - s: *mut c_char, - ct: *const c_char, - n: size_t, - ) -> *mut c_char; - pub fn strcmp(cs: *const c_char, ct: *const c_char) -> c_int; - pub fn strncmp(cs: *const c_char, ct: *const c_char, n: size_t) -> c_int; - pub fn strcoll(cs: *const c_char, ct: *const c_char) -> c_int; - pub fn strchr(cs: *const c_char, c: c_int) -> *mut c_char; - pub fn strrchr(cs: *const c_char, c: c_int) -> *mut c_char; - pub fn strspn(cs: *const c_char, ct: *const c_char) -> size_t; - pub fn strcspn(cs: *const c_char, ct: *const c_char) -> size_t; - pub fn strdup(cs: *const c_char) -> *mut c_char; - pub fn strpbrk(cs: *const c_char, ct: *const c_char) -> *mut c_char; - pub fn strstr(cs: *const c_char, ct: *const c_char) -> *mut c_char; - pub fn strcasecmp(s1: *const c_char, s2: *const c_char) -> c_int; - pub fn strncasecmp( - s1: *const c_char, - s2: *const c_char, - n: size_t, - ) -> c_int; - pub fn strlen(cs: *const c_char) -> size_t; - pub fn strnlen(cs: *const c_char, maxlen: size_t) -> size_t; - pub fn strerror(n: c_int) -> *mut c_char; - pub fn strtok(s: *mut c_char, t: *const c_char) -> *mut c_char; - pub fn strxfrm(s: *mut c_char, ct: *const c_char, n: size_t) -> size_t; - pub fn wcslen(buf: *const wchar_t) -> size_t; - pub fn wcstombs( - dest: *mut c_char, - src: *const wchar_t, - n: size_t, - ) -> ::size_t; - - pub fn memchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void; - pub fn wmemchr(cx: *const wchar_t, c: wchar_t, n: size_t) -> *mut wchar_t; - pub fn memcmp(cx: *const c_void, ct: *const c_void, n: size_t) -> c_int; - pub fn memcpy( - dest: *mut c_void, - src: *const c_void, - n: size_t, - ) -> *mut c_void; - pub fn memmove( - dest: *mut c_void, - src: *const c_void, - n: size_t, - ) -> *mut c_void; - pub fn memset(dest: *mut c_void, c: c_int, n: size_t) -> *mut c_void; - - pub fn abs(i: c_int) -> c_int; - pub fn atof(s: *const c_char) -> c_double; - pub fn labs(i: c_long) -> c_long; - pub fn rand() -> c_int; - pub fn srand(seed: c_uint); - - pub fn arc4random_buf(buf: *const ::c_void, len: ::size_t); - pub fn freeaddrinfo(res: *mut addrinfo); - pub fn gai_strerror(errcode: ::c_int) -> *const ::c_char; - pub fn getaddrinfo( - node: *const c_char, - service: *const c_char, - hints: *const addrinfo, - res: *mut *mut addrinfo, - ) -> ::c_int; - pub fn getsockopt( - sockfd: ::c_int, - level: ::c_int, - optname: ::c_int, - optval: *mut ::c_void, - optlen: *mut ::socklen_t, - ) -> ::c_int; - pub fn posix_memalign( - memptr: *mut *mut ::c_void, - align: ::size_t, - size: ::size_t, - ) -> ::c_int; - pub fn pthread_attr_destroy(attr: *mut ::pthread_attr_t) -> ::c_int; - pub fn pthread_attr_init(attr: *mut ::pthread_attr_t) -> ::c_int; - pub fn pthread_attr_setstacksize( - attr: *mut ::pthread_attr_t, - stack_size: ::size_t, - ) -> ::c_int; - pub fn pthread_create( - native: *mut ::pthread_t, - attr: *const ::pthread_attr_t, - f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, - value: *mut ::c_void, - ) -> ::c_int; - pub fn pthread_detach(thread: ::pthread_t) -> ::c_int; - pub fn pthread_getspecific(key: pthread_key_t) -> *mut ::c_void; - pub fn pthread_join( - native: ::pthread_t, - value: *mut *mut ::c_void, - ) -> ::c_int; - pub fn pthread_key_create( - key: *mut pthread_key_t, - dtor: ::Option, - ) -> ::c_int; - pub fn pthread_key_delete(key: pthread_key_t) -> ::c_int; - pub fn pthread_setspecific( - key: pthread_key_t, - value: *const ::c_void, - ) -> ::c_int; - pub fn send( - socket: ::c_int, - buf: *const ::c_void, - len: ::size_t, - flags: ::c_int, - ) -> ::ssize_t; - pub fn sysconf(name: ::c_int) -> ::c_long; -} - -cfg_if! { - if #[cfg(target_arch = "aarch64")] { - mod aarch64; - pub use self::aarch64::*; - } else if #[cfg(any(target_arch = "arm"))] { - mod arm; - pub use self::arm::*; - } else if #[cfg(any(target_arch = "x86"))] { - mod x86; - pub use self::x86::*; - } else if #[cfg(any(target_arch = "x86_64"))] { - mod x86_64; - pub use self::x86_64::*; - } else { - // Unknown target_arch - } -} - -cfg_if! { - if #[cfg(libc_core_cvoid)] { - pub use ::ffi::c_void; - } else { - // Use repr(u8) as LLVM expects `void*` to be the same as `i8*` to help - // enable more optimization opportunities around it recognizing things - // like malloc/free. - #[repr(u8)] - #[allow(missing_copy_implementations)] - #[allow(missing_debug_implementations)] - pub enum c_void { - // Two dummy variants so the #[repr] attribute can be used. - #[doc(hidden)] - __variant1, - #[doc(hidden)] - __variant2, - } - } -} diff --git a/vendor/libc/src/cloudabi/x86.rs b/vendor/libc/src/cloudabi/x86.rs deleted file mode 100644 index 2f9f39c9b9..0000000000 --- a/vendor/libc/src/cloudabi/x86.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub type c_char = i8; -pub type c_long = i32; -pub type c_ulong = u32; -pub type wchar_t = i32; diff --git a/vendor/libc/src/cloudabi/x86_64.rs b/vendor/libc/src/cloudabi/x86_64.rs deleted file mode 100644 index bb17624b1d..0000000000 --- a/vendor/libc/src/cloudabi/x86_64.rs +++ /dev/null @@ -1,4 +0,0 @@ -pub type c_char = i8; -pub type c_long = i64; -pub type c_ulong = u64; -pub type wchar_t = i32; diff --git a/vendor/libc/src/lib.rs b/vendor/libc/src/lib.rs index 6bb71c552d..30c94b0969 100644 --- a/vendor/libc/src/lib.rs +++ b/vendor/libc/src/lib.rs @@ -99,12 +99,6 @@ cfg_if! { mod windows; pub use windows::*; - } else if #[cfg(target_os = "cloudabi")] { - mod fixed_width_ints; - pub use fixed_width_ints::*; - - mod cloudabi; - pub use cloudabi::*; } else if #[cfg(target_os = "fuchsia")] { mod fixed_width_ints; pub use fixed_width_ints::*; diff --git a/vendor/libc/src/unix/bsd/apple/mod.rs b/vendor/libc/src/unix/bsd/apple/mod.rs index c167ceb128..7f321eab46 100644 --- a/vendor/libc/src/unix/bsd/apple/mod.rs +++ b/vendor/libc/src/unix/bsd/apple/mod.rs @@ -37,6 +37,8 @@ pub type sae_connid_t = u32; pub type mach_port_t = ::c_uint; +pub type iconv_t = *mut ::c_void; + deprecated_mach! { pub type vm_prot_t = ::c_int; pub type vm_size_t = ::uintptr_t; @@ -2323,6 +2325,7 @@ pub const SO_NOADDRERR: ::c_int = 0x1023; pub const SO_NWRITE: ::c_int = 0x1024; pub const SO_REUSESHAREUID: ::c_int = 0x1025; pub const SO_NOTIFYCONFLICT: ::c_int = 0x1026; +pub const SO_LINGER_SEC: ::c_int = 0x1080; pub const SO_RANDOMPORT: ::c_int = 0x1082; pub const SO_NP_EXTENSIONS: ::c_int = 0x1083; @@ -3207,6 +3210,10 @@ pub const TIME_OOP: ::c_int = 3; pub const TIME_WAIT: ::c_int = 4; pub const TIME_ERROR: ::c_int = 5; +// +pub const MNT_WAIT: ::c_int = 1; +pub const MNT_NOWAIT: ::c_int = 2; + cfg_if! { if #[cfg(libc_const_size_of)] { fn __DARWIN_ALIGN32(p: usize) -> usize { @@ -3744,6 +3751,34 @@ extern "C" { pub fn ntp_adjtime(buf: *mut timex) -> ::c_int; pub fn ntp_gettime(buf: *mut ntptimeval) -> ::c_int; + + #[cfg_attr( + all(target_os = "macos", not(target_arch = "aarch64")), + link_name = "getmntinfo$INODE64" + )] + pub fn getmntinfo(mntbufp: *mut *mut statfs, flags: ::c_int) -> ::c_int; + #[cfg_attr( + all(target_os = "macos", not(target_arch = "aarch64")), + link_name = "getfsstat$INODE64" + )] + pub fn getfsstat( + mntbufp: *mut statfs, + bufsize: ::c_int, + flags: ::c_int, + ) -> ::c_int; + + pub fn iconv_open( + tocode: *const ::c_char, + fromcode: *const ::c_char, + ) -> iconv_t; + pub fn iconv( + cd: iconv_t, + inbuf: *mut *mut ::c_char, + inbytesleft: *mut ::size_t, + outbuf: *mut *mut ::c_char, + outbytesleft: *mut ::size_t, + ) -> ::size_t; + pub fn iconv_close(cd: iconv_t) -> ::c_int; } cfg_if! { diff --git a/vendor/libc/src/unix/bsd/freebsdlike/dragonfly/mod.rs b/vendor/libc/src/unix/bsd/freebsdlike/dragonfly/mod.rs index 641fb89235..0330183d3f 100644 --- a/vendor/libc/src/unix/bsd/freebsdlike/dragonfly/mod.rs +++ b/vendor/libc/src/unix/bsd/freebsdlike/dragonfly/mod.rs @@ -17,6 +17,7 @@ pub type uuid_t = ::uuid; pub type fsblkcnt_t = u64; pub type fsfilcnt_t = u64; +pub type idtype_t = ::c_uint; pub type mqd_t = ::c_int; pub type sem_t = *mut sem; @@ -982,8 +983,17 @@ pub const _SC_V7_LPBIG_OFFBIG: ::c_int = 125; pub const _SC_THREAD_ROBUST_PRIO_INHERIT: ::c_int = 126; pub const _SC_THREAD_ROBUST_PRIO_PROTECT: ::c_int = 127; -pub const WCONTINUED: ::c_int = 4; -pub const WSTOPPED: ::c_int = 0o177; +pub const WCONTINUED: ::c_int = 0x4; +pub const WSTOPPED: ::c_int = 0x2; +pub const WNOWAIT: ::c_int = 0x8; +pub const WEXITED: ::c_int = 0x10; +pub const WTRAPPED: ::c_int = 0x20; + +// Similar to FreeBSD, only the standardized ones are exposed. +// There are more. +pub const P_PID: idtype_t = 0; +pub const P_PGID: idtype_t = 2; +pub const P_ALL: idtype_t = 7; // Values for struct rtprio (type_ field) pub const RTP_PRIO_REALTIME: ::c_ushort = 0; @@ -1061,6 +1071,13 @@ extern "C" { timeout: *mut ::timespec, ) -> ::c_int; + pub fn waitid( + idtype: idtype_t, + id: ::id_t, + infop: *mut ::siginfo_t, + options: ::c_int, + ) -> ::c_int; + pub fn freelocale(loc: ::locale_t); pub fn lwp_rtprio( diff --git a/vendor/libc/src/unix/bsd/freebsdlike/mod.rs b/vendor/libc/src/unix/bsd/freebsdlike/mod.rs index d126391f31..94d30972e8 100644 --- a/vendor/libc/src/unix/bsd/freebsdlike/mod.rs +++ b/vendor/libc/src/unix/bsd/freebsdlike/mod.rs @@ -32,6 +32,8 @@ pub type Elf64_Sxword = i64; pub type Elf64_Word = u32; pub type Elf64_Xword = u64; +pub type iconv_t = *mut ::c_void; + cfg_if! { if #[cfg(target_pointer_width = "64")] { type Elf_Addr = Elf64_Addr; @@ -270,6 +272,42 @@ s! { pub piod_len: ::size_t, } + // bpf.h + + pub struct bpf_program { + pub bf_len: ::c_uint, + pub bf_insns: *mut bpf_insn, + } + + pub struct bpf_stat { + pub bs_recv: ::c_uint, + pub bs_drop: ::c_uint, + } + + pub struct bpf_version { + pub bv_major: ::c_ushort, + pub bv_minor: ::c_ushort, + } + + pub struct bpf_hdr { + pub bh_tstamp: ::timeval, + pub bh_caplen: u32, + pub bh_datalen: u32, + pub bh_hdrlen: ::c_ushort, + } + + pub struct bpf_insn { + pub code: ::c_ushort, + pub jt: ::c_uchar, + pub jf: ::c_uchar, + pub k: u32, + } + + pub struct bpf_dltlist { + bfl_len: ::c_uint, + bfl_list: *mut ::c_uint, + } + // elf.h pub struct Elf32_Phdr { @@ -357,6 +395,14 @@ cfg_if! { } } +// Non-public helper constant +#[cfg(all(not(libc_const_size_of), target_pointer_width = "32"))] +const SIZEOF_LONG: usize = 4; +#[cfg(all(not(libc_const_size_of), target_pointer_width = "64"))] +const SIZEOF_LONG: usize = 8; +#[cfg(libc_const_size_of)] +const SIZEOF_LONG: usize = ::mem::size_of::<::c_long>(); + #[deprecated( since = "0.2.64", note = "Can vary at runtime. Use sysconf(3) instead" @@ -1214,8 +1260,7 @@ pub const ONLRET: ::tcflag_t = 0x40; pub const CMGROUP_MAX: usize = 16; // https://github.com/freebsd/freebsd/blob/master/sys/net/bpf.h -// sizeof(long) -pub const BPF_ALIGNMENT: ::c_int = 8; +pub const BPF_ALIGNMENT: usize = SIZEOF_LONG; // Values for rtprio struct (prio field) and syscall (function argument) pub const RTP_PRIO_MIN: ::c_ushort = 0; @@ -1593,6 +1638,19 @@ extern "C" { >, data: *mut ::c_void, ) -> ::c_int; + + pub fn iconv_open( + tocode: *const ::c_char, + fromcode: *const ::c_char, + ) -> iconv_t; + pub fn iconv( + cd: iconv_t, + inbuf: *mut *mut ::c_char, + inbytesleft: *mut ::size_t, + outbuf: *mut *mut ::c_char, + outbytesleft: *mut ::size_t, + ) -> ::size_t; + pub fn iconv_close(cd: iconv_t) -> ::c_int; } #[link(name = "rt")] diff --git a/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs b/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs index 4b7dbafc14..7833138798 100644 --- a/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs +++ b/vendor/libc/src/unix/bsd/netbsdlike/netbsd/mod.rs @@ -29,6 +29,8 @@ pub type Elf64_Sxword = i64; pub type Elf64_Word = u32; pub type Elf64_Xword = u64; +pub type iconv_t = *mut ::c_void; + cfg_if! { if #[cfg(target_pointer_width = "64")] { type Elf_Addr = Elf64_Addr; @@ -2081,6 +2083,19 @@ extern "C" { >, data: *mut ::c_void, ) -> ::c_int; + + pub fn iconv_open( + tocode: *const ::c_char, + fromcode: *const ::c_char, + ) -> iconv_t; + pub fn iconv( + cd: iconv_t, + inbuf: *mut *mut ::c_char, + inbytesleft: *mut ::size_t, + outbuf: *mut *mut ::c_char, + outbytesleft: *mut ::size_t, + ) -> ::size_t; + pub fn iconv_close(cd: iconv_t) -> ::c_int; } #[link(name = "util")] diff --git a/vendor/libc/src/unix/haiku/mod.rs b/vendor/libc/src/unix/haiku/mod.rs index 840e2f5551..e834a13866 100644 --- a/vendor/libc/src/unix/haiku/mod.rs +++ b/vendor/libc/src/unix/haiku/mod.rs @@ -1,9 +1,9 @@ pub type rlim_t = ::uintptr_t; pub type sa_family_t = u8; pub type pthread_key_t = ::c_int; -pub type nfds_t = ::c_long; +pub type nfds_t = ::c_ulong; pub type tcflag_t = ::c_uint; -pub type speed_t = ::c_uint; +pub type speed_t = ::c_uchar; pub type c_char = i8; pub type clock_t = i32; pub type clockid_t = i32; @@ -19,6 +19,7 @@ pub type nlink_t = i32; pub type useconds_t = u32; pub type socklen_t = u32; pub type pthread_t = ::uintptr_t; +pub type pthread_condattr_t = ::uintptr_t; pub type pthread_mutexattr_t = ::uintptr_t; pub type pthread_rwlockattr_t = ::uintptr_t; pub type sigset_t = u64; @@ -28,6 +29,7 @@ pub type pthread_attr_t = *mut ::c_void; pub type nl_item = ::c_int; pub type id_t = i32; pub type idtype_t = ::c_uint; +pub type fd_mask = u32; #[cfg_attr(feature = "extra_traits", derive(Debug))] pub enum timezone {} @@ -69,7 +71,7 @@ s! { pub struct sockaddr { pub sa_len: u8, pub sa_family: sa_family_t, - pub sa_data: [::c_char; 30], + pub sa_data: [u8; 30], } pub struct sockaddr_in { @@ -77,13 +79,13 @@ s! { pub sin_family: sa_family_t, pub sin_port: ::in_port_t, pub sin_addr: ::in_addr, - pub sin_zero: [u8; 24], + pub sin_zero: [i8; 24], } pub struct sockaddr_in6 { pub sin6_len: u8, - pub sin6_family: sa_family_t, - pub sin6_port: ::in_port_t, + pub sin6_family: u8, + pub sin6_port: u16, pub sin6_flowinfo: u32, pub sin6_addr: ::in6_addr, pub sin6_scope_id: u32, @@ -101,7 +103,8 @@ s! { } pub struct fd_set { - fds_bits: [c_ulong; FD_SETSIZE / ULONG_SIZE], + // size for 1024 bits, and a fd_mask with size u32 + fds_bits: [fd_mask; 32], } pub struct tm { @@ -114,8 +117,8 @@ s! { pub tm_wday: ::c_int, pub tm_yday: ::c_int, pub tm_isdst: ::c_int, - pub tm_gmtoff: ::c_long, - pub tm_zone: *const ::c_char, + pub tm_gmtoff: ::c_int, + pub tm_zone: *mut ::c_char, } pub struct utsname { @@ -155,16 +158,16 @@ s! { pub struct msghdr { pub msg_name: *mut ::c_void, - pub msg_namelen: ::socklen_t, + pub msg_namelen: socklen_t, pub msg_iov: *mut ::iovec, pub msg_iovlen: ::c_int, pub msg_control: *mut ::c_void, - pub msg_controllen: ::socklen_t, + pub msg_controllen: socklen_t, pub msg_flags: ::c_int, } pub struct cmsghdr { - pub cmsg_len: ::size_t, + pub cmsg_len: ::socklen_t, pub cmsg_level: ::c_int, pub cmsg_type: ::c_int, } @@ -301,22 +304,16 @@ s! { } pub struct sigaction { - pub sa_sigaction: ::sighandler_t, + pub sa_sigaction: ::sighandler_t, //actually a union with sa_handler pub sa_mask: ::sigset_t, pub sa_flags: ::c_int, sa_userdata: *mut ::c_void, } pub struct sem_t { - pub se_type: i32, - pub se_named_id: i32, // this is actually a union - pub se_unnamed: i32, - pub se_padding: [i32; 4], - } - - pub struct pthread_condattr_t { - pub process_shared: bool, - pub clock_id: i32, + pub type_: i32, + pub named_sem_id: i32, // actually a union with unnamed_sem (i32) + pub padding: [i32; 2], } } @@ -491,17 +488,6 @@ cfg_if! { } } -// intentionally not public, only used for fd_set -cfg_if! { - if #[cfg(target_pointer_width = "32")] { - const ULONG_SIZE: usize = 32; - } else if #[cfg(target_pointer_width = "64")] { - const ULONG_SIZE: usize = 64; - } else { - // Unknown target_pointer_width - } -} - pub const EXIT_FAILURE: ::c_int = 1; pub const EXIT_SUCCESS: ::c_int = 0; pub const RAND_MAX: ::c_int = 2147483647; @@ -559,7 +545,7 @@ pub const RLIMIT_STACK: ::c_int = 5; pub const RLIMIT_AS: ::c_int = 6; // Haiku specific pub const RLIMIT_NOVMON: ::c_int = 7; -pub const RLIMIT_NLIMITS: ::c_int = 8; +pub const RLIM_NLIMITS: ::c_int = 8; pub const RUSAGE_SELF: ::c_int = 0; @@ -596,18 +582,20 @@ pub const S_IFREG: ::mode_t = 32768; pub const S_IFLNK: ::mode_t = 40960; pub const S_IFSOCK: ::mode_t = 49152; pub const S_IFMT: ::mode_t = 61440; -pub const S_IRWXU: ::mode_t = 448; -pub const S_IXUSR: ::mode_t = 64; -pub const S_IWUSR: ::mode_t = 128; -pub const S_IRUSR: ::mode_t = 256; -pub const S_IRWXG: ::mode_t = 70; -pub const S_IXGRP: ::mode_t = 10; -pub const S_IWGRP: ::mode_t = 20; -pub const S_IRGRP: ::mode_t = 40; -pub const S_IRWXO: ::mode_t = 7; -pub const S_IXOTH: ::mode_t = 1; -pub const S_IWOTH: ::mode_t = 2; -pub const S_IROTH: ::mode_t = 4; + +pub const S_IRWXU: ::mode_t = 0o00700; +pub const S_IRUSR: ::mode_t = 0o00400; +pub const S_IWUSR: ::mode_t = 0o00200; +pub const S_IXUSR: ::mode_t = 0o00100; +pub const S_IRWXG: ::mode_t = 0o00070; +pub const S_IRGRP: ::mode_t = 0o00040; +pub const S_IWGRP: ::mode_t = 0o00020; +pub const S_IXGRP: ::mode_t = 0o00010; +pub const S_IRWXO: ::mode_t = 0o00007; +pub const S_IROTH: ::mode_t = 0o00004; +pub const S_IWOTH: ::mode_t = 0o00002; +pub const S_IXOTH: ::mode_t = 0o00001; + pub const F_OK: ::c_int = 0; pub const R_OK: ::c_int = 4; pub const W_OK: ::c_int = 2; @@ -707,8 +695,8 @@ pub const ENOTTY: ::c_int = -2147454966; pub const ENXIO: ::c_int = -2147454965; pub const ESPIPE: ::c_int = -2147454964; pub const ESRCH: ::c_int = -2147454963; -pub const EFPOS: ::c_int = -2147457962; -pub const ESIGPARM: ::c_int = -2147457961; +pub const EFPOS: ::c_int = -2147454962; +pub const ESIGPARM: ::c_int = -2147454961; pub const EDOM: ::c_int = -2147454960; pub const ERANGE: ::c_int = -2147454959; pub const EPROTOTYPE: ::c_int = -2147454958; @@ -756,7 +744,7 @@ pub const ETXTBSY: ::c_int = -2147454917; pub const ENOATTR: ::c_int = -2147454916; // INT_MIN -pub const ENOMEM: ::c_int = -2147454976; +pub const ENOMEM: ::c_int = -2147483648; // POSIX errors that can be mapped to BeOS error codes pub const EACCES: ::c_int = -2147483646; @@ -844,6 +832,9 @@ pub const TCP_MAXSEG: ::c_int = 0x02; pub const TCP_NOPUSH: ::c_int = 0x04; pub const TCP_NOOPT: ::c_int = 0x08; +pub const IF_NAMESIZE: ::size_t = 32; +pub const IFNAMSIZ: ::size_t = IF_NAMESIZE; + pub const IPV6_MULTICAST_IF: ::c_int = 24; pub const IPV6_MULTICAST_HOPS: ::c_int = 25; pub const IPV6_MULTICAST_LOOP: ::c_int = 26; @@ -854,7 +845,7 @@ pub const IPV6_V6ONLY: ::c_int = 30; pub const IPV6_PKTINFO: ::c_int = 31; pub const IPV6_RECVPKTINFO: ::c_int = 32; pub const IPV6_HOPLIMIT: ::c_int = 33; -pub const IPV6_REVCHOPLIMIT: ::c_int = 34; +pub const IPV6_RECVHOPLIMIT: ::c_int = 34; pub const IPV6_HOPOPTS: ::c_int = 35; pub const IPV6_DSTOPTS: ::c_int = 36; pub const IPV6_RTHDR: ::c_int = 37; @@ -1239,7 +1230,60 @@ pub const PRIO_PROCESS: ::c_int = 0; pub const PRIO_PGRP: ::c_int = 1; pub const PRIO_USER: ::c_int = 2; +pub const LOG_PID: ::c_int = 1 << 12; +pub const LOG_CONS: ::c_int = 2 << 12; +pub const LOG_ODELAY: ::c_int = 4 << 12; +pub const LOG_NDELAY: ::c_int = 8 << 12; +pub const LOG_SERIAL: ::c_int = 16 << 12; +pub const LOG_PERROR: ::c_int = 32 << 12; +pub const LOG_NOWAIT: ::c_int = 64 << 12; + +const_fn! { + {const} fn CMSG_ALIGN(len: usize) -> usize { + len + ::mem::size_of::() - 1 & !(::mem::size_of::() - 1) + } +} + f! { + pub fn CMSG_FIRSTHDR(mhdr: *const msghdr) -> *mut cmsghdr { + if (*mhdr).msg_controllen as usize >= ::mem::size_of::() { + (*mhdr).msg_control as *mut cmsghdr + } else { + 0 as *mut cmsghdr + } + } + + pub fn CMSG_DATA(cmsg: *const ::cmsghdr) -> *mut ::c_uchar { + (cmsg as *mut ::c_uchar) + .offset(CMSG_ALIGN(::mem::size_of::<::cmsghdr>()) as isize) + } + + pub {const} fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { + (CMSG_ALIGN(length as usize) + CMSG_ALIGN(::mem::size_of::())) + as ::c_uint + } + + pub fn CMSG_LEN(length: ::c_uint) -> ::c_uint { + CMSG_ALIGN(::mem::size_of::()) as ::c_uint + length + } + + pub fn CMSG_NXTHDR(mhdr: *const msghdr, + cmsg: *const cmsghdr) -> *mut cmsghdr { + if cmsg.is_null() { + return ::CMSG_FIRSTHDR(mhdr); + }; + let next = cmsg as usize + CMSG_ALIGN((*cmsg).cmsg_len as usize) + + CMSG_ALIGN(::mem::size_of::<::cmsghdr>()); + let max = (*mhdr).msg_control as usize + + (*mhdr).msg_controllen as usize; + if next > max { + 0 as *mut ::cmsghdr + } else { + (cmsg as usize + CMSG_ALIGN((*cmsg).cmsg_len as usize)) + as *mut ::cmsghdr + } + } + pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { let fd = fd as usize; let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; @@ -1368,10 +1412,10 @@ extern "C" { clock_id: ::clockid_t, ) -> ::c_int; pub fn memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; - pub fn setgroups(ngroups: ::size_t, ptr: *const ::gid_t) -> ::c_int; - pub fn ioctl(fd: ::c_int, request: ::c_int, ...) -> ::c_int; + pub fn setgroups(ngroups: ::c_int, ptr: *const ::gid_t) -> ::c_int; + pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; pub fn mprotect( - addr: *const ::c_void, + addr: *mut ::c_void, len: ::size_t, prot: ::c_int, ) -> ::c_int; @@ -1380,9 +1424,9 @@ extern "C" { sa: *const ::sockaddr, salen: ::socklen_t, host: *mut ::c_char, - hostlen: ::size_t, + hostlen: ::socklen_t, serv: *mut ::c_char, - sevlen: ::size_t, + sevlen: ::socklen_t, flags: ::c_int, ) -> ::c_int; pub fn pthread_mutex_timedlock( @@ -1455,12 +1499,12 @@ extern "C" { pub fn writev( fd: ::c_int, iov: *const ::iovec, - iovcnt: ::c_int, + count: ::size_t, ) -> ::ssize_t; pub fn readv( fd: ::c_int, iov: *const ::iovec, - iovcnt: ::c_int, + count: ::size_t, ) -> ::ssize_t; pub fn sendmsg( @@ -1553,3 +1597,6 @@ cfg_if! { pub use self::b32::*; } } + +mod native; +pub use self::native::*; diff --git a/vendor/libc/src/unix/haiku/native.rs b/vendor/libc/src/unix/haiku/native.rs new file mode 100644 index 0000000000..c5ae21a823 --- /dev/null +++ b/vendor/libc/src/unix/haiku/native.rs @@ -0,0 +1,1146 @@ +// This module contains bindings to the native Haiku API. The Haiku API +// originates from BeOS, and it was the original way to perform low level +// system and IO operations. The POSIX API was in that era was like a +// compatibility layer. In current Haiku development, both the POSIX API and +// the Haiku API are considered to be co-equal status. However, they are not +// integrated like they are on other UNIX platforms, which means that for many +// low level concepts there are two versions, like processes (POSIX) and +// teams (Haiku), or pthreads and native threads. +// +// Both the POSIX API and the Haiku API live in libroot.so, the library that is +// linked to any binary by default. +// +// This file follows the Haiku API for Haiku R1 beta 2. It is organized by the +// C/C++ header files in which the concepts can be found, while adhering to the +// style guide for this crate. + +// Helper macro to generate u32 constants. The Haiku API uses (non-standard) +// multi-character constants (like 'UPDA' or 'MSGM') to represent 32 bit +// integer constants. + +macro_rules! haiku_constant { + ($a:tt, $b:tt, $c:tt, $d:tt) => { + (($a as u32) << 24) + + (($b as u32) << 16) + + (($c as u32) << 8) + + ($d as u32) + }; +} + +// support/SupportDefs.h +pub type status_t = i32; +pub type bigtime_t = i64; +pub type nanotime_t = i64; +pub type type_code = u32; +pub type perform_code = u32; + +// kernel/OS.h +pub type area_id = i32; +pub type port_id = i32; +pub type sem_id = i32; +pub type team_id = i32; +pub type thread_id = i32; + +pub type thread_func = extern "C" fn(*mut ::c_void) -> status_t; + +// kernel/image.h +pub type image_id = i32; + +e! { + // kernel/OS.h + pub enum thread_state { + B_THREAD_RUNNING = 1, + B_THREAD_READY, + B_THREAD_RECEIVING, + B_THREAD_ASLEEP, + B_THREAD_SUSPENDED, + B_THREAD_WAITING + } + + // kernel/image.h + pub enum image_type { + B_APP_IMAGE = 1, + B_LIBRARY_IMAGE, + B_ADD_ON_IMAGE, + B_SYSTEM_IMAGE + } +} + +s! { + // kernel/OS.h + pub struct area_info { + pub area: area_id, + pub name: [::c_char; B_OS_NAME_LENGTH], + pub size: usize, + pub lock: u32, + pub protection: u32, + pub team: team_id, + pub ram_size: u32, + pub copy_count: u32, + pub in_count: u32, + pub out_count: u32, + pub address: *mut ::c_void + } + + pub struct port_info { + pub port: port_id, + pub team: team_id, + pub name: [::c_char; B_OS_NAME_LENGTH], + pub capacity: i32, + pub queue_count: i32, + pub total_count: i32, + } + + pub struct port_message_info { + pub size: ::size_t, + pub sender: ::uid_t, + pub sender_group: ::gid_t, + pub sender_team: ::team_id + } + + pub struct team_info { + team: team_id, + thread_count: i32, + image_count: i32, + area_count: i32, + debugger_nub_thread: thread_id, + debugger_nub_port: port_id, + argc: i32, + args: [::c_char; 64], + uid: ::uid_t, + gid: ::gid_t + } + + pub struct sem_info { + sem: sem_id, + team: team_id, + name: [::c_char; B_OS_NAME_LENGTH], + count: i32, + latest_holder: thread_id + } + + pub struct team_usage_info { + user_time: bigtime_t, + kernel_time: bigtime_t + } + + pub struct thread_info { + pub thread: thread_id, + pub team: team_id, + pub name: [::c_char; B_OS_NAME_LENGTH], + pub state: thread_state, + pub priority: i32, + pub sem: sem_id, + pub user_time: bigtime_t, + pub kernel_time: bigtime_t, + pub stack_base: *mut ::c_void, + pub stack_end: *mut ::c_void + } + + pub struct cpu_info { + pub active_time: bigtime_t, + pub enabled: bool + } + + pub struct system_info { + pub boot_time: bigtime_t, + pub cpu_count: u32, + pub max_pages: u64, + pub used_pages: u64, + pub cached_pages: u64, + pub block_cache_pages: u64, + pub ignored_pages: u64, + pub needed_memory: u64, + pub free_memory: u64, + pub max_swap_pages: u64, + pub free_swap_pages: u64, + pub page_faults: u32, + pub max_sems: u32, + pub used_sems: u32, + pub max_ports: u32, + pub used_ports: u32, + pub max_threads: u32, + pub used_threads: u32, + pub max_teams: u32, + pub used_teams: u32, + pub kernel_name: [::c_char; B_FILE_NAME_LENGTH], + pub kernel_build_date: [::c_char; B_OS_NAME_LENGTH], + pub kernel_build_time: [::c_char; B_OS_NAME_LENGTH], + pub kernel_version: i64, + pub abi: u32 + } + + pub struct object_wait_info { + pub object: i32, + pub type_: u16, + pub events: u16 + } + + // kernel/fs_attr.h + pub struct attr_info { + type_: u32, + size: ::off_t + } + + // kernel/fs_index.h + pub struct index_info { + type_: u32, + size: ::off_t, + modification_time: ::time_t, + creation_time: ::time_t, + uid: ::uid_t, + gid: ::gid_t + } + + //kernel/fs_info.h + pub struct fs_info { + dev: ::dev_t, + root: ::ino_t, + flags: u32, + block_size: ::off_t, + io_size: ::off_t, + total_blocks: ::off_t, + free_blocks: ::off_t, + total_nodes: ::off_t, + free_nodes: ::off_t, + device_name: [::c_char; 128], + volume_name: [::c_char; B_FILE_NAME_LENGTH], + fsh_name: [::c_char; B_OS_NAME_LENGTH] + } + + // kernel/image.h + pub struct image_info { + pub id: image_id, + pub image_type: ::c_int, + pub sequence: i32, + pub init_order: i32, + pub init_routine: extern "C" fn(), + pub term_routine: extern "C" fn(), + pub device: ::dev_t, + pub node: ::ino_t, + pub name: [::c_char; ::PATH_MAX as usize], + pub text: *mut ::c_void, + pub data: *mut ::c_void, + pub text_size: i32, + pub data_size: i32, + pub api_version: i32, + pub abi: i32 + } +} + +// kernel/OS.h +pub const B_OS_NAME_LENGTH: usize = 32; +pub const B_PAGE_SIZE: usize = 4096; +pub const B_INFINITE_TIMEOUT: usize = 9223372036854775807; + +pub const B_RELATIVE_TIMEOUT: u32 = 0x8; +pub const B_ABSOLUTE_TIMEOUT: u32 = 0x10; +pub const B_TIMEOUT_REAL_TIME_BASE: u32 = 0x40; +pub const B_ABSOLUTE_REAL_TIME_TIMEOUT: u32 = + B_ABSOLUTE_TIMEOUT | B_TIMEOUT_REAL_TIME_BASE; + +pub const B_NO_LOCK: u32 = 0; +pub const B_LAZY_LOCK: u32 = 1; +pub const B_FULL_LOCK: u32 = 2; +pub const B_CONTIGUOUS: u32 = 3; +pub const B_LOMEM: u32 = 4; +pub const B_32_BIT_FULL_LOCK: u32 = 5; +pub const B_32_BIT_CONTIGUOUS: u32 = 6; + +pub const B_ANY_ADDRESS: u32 = 0; +pub const B_EXACT_ADDRESS: u32 = 1; +pub const B_BASE_ADDRESS: u32 = 2; +pub const B_CLONE_ADDRESS: u32 = 3; +pub const B_ANY_KERNEL_ADDRESS: u32 = 4; +pub const B_RANDOMIZED_ANY_ADDRESS: u32 = 6; +pub const B_RANDOMIZED_BASE_ADDRESS: u32 = 7; + +pub const B_READ_AREA: u32 = 1 << 0; +pub const B_WRITE_AREA: u32 = 1 << 1; +pub const B_EXECUTE_AREA: u32 = 1 << 2; +pub const B_STACK_AREA: u32 = 1 << 3; +pub const B_CLONEABLE_AREA: u32 = 1 << 8; + +pub const B_CAN_INTERRUPT: u32 = 0x01; +pub const B_CHECK_PERMISSION: u32 = 0x04; +pub const B_KILL_CAN_INTERRUPT: u32 = 0x20; +pub const B_DO_NOT_RESCHEDULE: u32 = 0x02; +pub const B_RELEASE_ALL: u32 = 0x08; +pub const B_RELEASE_IF_WAITING_ONLY: u32 = 0x10; + +pub const B_CURRENT_TEAM: team_id = 0; +pub const B_SYSTEM_TEAM: team_id = 1; + +pub const B_TEAM_USAGE_SELF: i32 = 0; +pub const B_TEAM_USAGE_CHILDREN: i32 = -1; + +pub const B_IDLE_PRIORITY: i32 = 0; +pub const B_LOWEST_ACTIVE_PRIORITY: i32 = 1; +pub const B_LOW_PRIORITY: i32 = 5; +pub const B_NORMAL_PRIORITY: i32 = 10; +pub const B_DISPLAY_PRIORITY: i32 = 15; +pub const B_URGENT_DISPLAY_PRIORITY: i32 = 20; +pub const B_REAL_TIME_DISPLAY_PRIORITY: i32 = 100; +pub const B_URGENT_PRIORITY: i32 = 110; +pub const B_REAL_TIME_PRIORITY: i32 = 120; + +pub const B_SYSTEM_TIMEBASE: i32 = 0; +pub const B_FIRST_REAL_TIME_PRIORITY: i32 = B_REAL_TIME_DISPLAY_PRIORITY; + +pub const B_ONE_SHOT_ABSOLUTE_ALARM: u32 = 1; +pub const B_ONE_SHOT_RELATIVE_ALARM: u32 = 2; +pub const B_PERIODIC_ALARM: u32 = 3; + +pub const B_OBJECT_TYPE_FD: u16 = 0; +pub const B_OBJECT_TYPE_SEMAPHORE: u16 = 1; +pub const B_OBJECT_TYPE_PORT: u16 = 2; +pub const B_OBJECT_TYPE_THREAD: u16 = 3; + +pub const B_EVENT_READ: u16 = 0x0001; +pub const B_EVENT_WRITE: u16 = 0x0002; +pub const B_EVENT_ERROR: u16 = 0x0004; +pub const B_EVENT_PRIORITY_READ: u16 = 0x0008; +pub const B_EVENT_PRIORITY_WRITE: u16 = 0x0010; +pub const B_EVENT_HIGH_PRIORITY_READ: u16 = 0x0020; +pub const B_EVENT_HIGH_PRIORITY_WRITE: u16 = 0x0040; +pub const B_EVENT_DISCONNECTED: u16 = 0x0080; +pub const B_EVENT_ACQUIRE_SEMAPHORE: u16 = 0x0001; +pub const B_EVENT_INVALID: u16 = 0x1000; + +// kernel/fs_info.h +pub const B_FS_IS_READONLY: u32 = 0x00000001; +pub const B_FS_IS_REMOVABLE: u32 = 0x00000002; +pub const B_FS_IS_PERSISTENT: u32 = 0x00000004; +pub const B_FS_IS_SHARED: u32 = 0x00000008; +pub const B_FS_HAS_MIME: u32 = 0x00010000; +pub const B_FS_HAS_ATTR: u32 = 0x00020000; +pub const B_FS_HAS_QUERY: u32 = 0x00040000; +pub const B_FS_HAS_SELF_HEALING_LINKS: u32 = 0x00080000; +pub const B_FS_HAS_ALIASES: u32 = 0x00100000; +pub const B_FS_SUPPORTS_NODE_MONITORING: u32 = 0x00200000; +pub const B_FS_SUPPORTS_MONITOR_CHILDREN: u32 = 0x00400000; + +// kernel/fs_query.h +pub const B_LIVE_QUERY: u32 = 0x00000001; +pub const B_QUERY_NON_INDEXED: u32 = 0x00000002; + +// kernel/fs_volume.h +pub const B_MOUNT_READ_ONLY: u32 = 1; +pub const B_MOUNT_VIRTUAL_DEVICE: u32 = 2; +pub const B_FORCE_UNMOUNT: u32 = 1; + +// kernel/image.h +pub const B_FLUSH_DCACHE: u32 = 0x0001; +pub const B_FLUSH_ICACHE: u32 = 0x0004; +pub const B_INVALIDATE_DCACHE: u32 = 0x0002; +pub const B_INVALIDATE_ICACHE: u32 = 0x0008; + +pub const B_SYMBOL_TYPE_DATA: i32 = 0x1; +pub const B_SYMBOL_TYPE_TEXT: i32 = 0x2; +pub const B_SYMBOL_TYPE_ANY: i32 = 0x5; + +// storage/StorageDefs.h +pub const B_DEV_NAME_LENGTH: usize = 128; +pub const B_FILE_NAME_LENGTH: usize = ::FILENAME_MAX as usize; +pub const B_PATH_NAME_LENGTH: usize = ::PATH_MAX as usize; +pub const B_ATTR_NAME_LENGTH: usize = B_FILE_NAME_LENGTH - 1; +pub const B_MIME_TYPE_LENGTH: usize = B_ATTR_NAME_LENGTH - 15; +pub const B_MAX_SYMLINKS: usize = 16; + +// Haiku open modes in BFile are passed as u32 +pub const B_READ_ONLY: u32 = ::O_RDONLY as u32; +pub const B_WRITE_ONLY: u32 = ::O_WRONLY as u32; +pub const B_READ_WRITE: u32 = ::O_RDWR as u32; + +pub const B_FAIL_IF_EXISTS: u32 = ::O_EXCL as u32; +pub const B_CREATE_FILE: u32 = ::O_CREAT as u32; +pub const B_ERASE_FILE: u32 = ::O_TRUNC as u32; +pub const B_OPEN_AT_END: u32 = ::O_APPEND as u32; + +pub const B_FILE_NODE: u32 = 0x01; +pub const B_SYMLINK_NODE: u32 = 0x02; +pub const B_DIRECTORY_NODE: u32 = 0x04; +pub const B_ANY_NODE: u32 = 0x07; + +// support/Errors.h +pub const B_GENERAL_ERROR_BASE: status_t = core::i32::MIN; +pub const B_OS_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x1000; +pub const B_APP_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x2000; +pub const B_INTERFACE_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x3000; +pub const B_MEDIA_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x4000; +pub const B_TRANSLATION_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x4800; +pub const B_MIDI_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x5000; +pub const B_STORAGE_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x6000; +pub const B_POSIX_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x7000; +pub const B_MAIL_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x8000; +pub const B_PRINT_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0x9000; +pub const B_DEVICE_ERROR_BASE: status_t = B_GENERAL_ERROR_BASE + 0xa000; +pub const B_ERRORS_END: status_t = B_GENERAL_ERROR_BASE + 0xffff; + +// General errors +pub const B_NO_MEMORY: status_t = B_GENERAL_ERROR_BASE + 0; +pub const B_IO_ERROR: status_t = B_GENERAL_ERROR_BASE + 1; +pub const B_PERMISSION_DENIED: status_t = B_GENERAL_ERROR_BASE + 2; +pub const B_BAD_INDEX: status_t = B_GENERAL_ERROR_BASE + 3; +pub const B_BAD_TYPE: status_t = B_GENERAL_ERROR_BASE + 4; +pub const B_BAD_VALUE: status_t = B_GENERAL_ERROR_BASE + 5; +pub const B_MISMATCHED_VALUES: status_t = B_GENERAL_ERROR_BASE + 6; +pub const B_NAME_NOT_FOUND: status_t = B_GENERAL_ERROR_BASE + 7; +pub const B_NAME_IN_USE: status_t = B_GENERAL_ERROR_BASE + 8; +pub const B_TIMED_OUT: status_t = B_GENERAL_ERROR_BASE + 9; +pub const B_INTERRUPTED: status_t = B_GENERAL_ERROR_BASE + 10; +pub const B_WOULD_BLOCK: status_t = B_GENERAL_ERROR_BASE + 11; +pub const B_CANCELED: status_t = B_GENERAL_ERROR_BASE + 12; +pub const B_NO_INIT: status_t = B_GENERAL_ERROR_BASE + 13; +pub const B_NOT_INITIALIZED: status_t = B_GENERAL_ERROR_BASE + 13; +pub const B_BUSY: status_t = B_GENERAL_ERROR_BASE + 14; +pub const B_NOT_ALLOWED: status_t = B_GENERAL_ERROR_BASE + 15; +pub const B_BAD_DATA: status_t = B_GENERAL_ERROR_BASE + 16; +pub const B_DONT_DO_THAT: status_t = B_GENERAL_ERROR_BASE + 17; + +pub const B_ERROR: status_t = -1; +pub const B_OK: status_t = 0; +pub const B_NO_ERROR: status_t = 0; + +// Kernel kit errors +pub const B_BAD_SEM_ID: status_t = B_OS_ERROR_BASE + 0; +pub const B_NO_MORE_SEMS: status_t = B_OS_ERROR_BASE + 1; + +pub const B_BAD_THREAD_ID: status_t = B_OS_ERROR_BASE + 0x100; +pub const B_NO_MORE_THREADS: status_t = B_OS_ERROR_BASE + 0x101; +pub const B_BAD_THREAD_STATE: status_t = B_OS_ERROR_BASE + 0x102; +pub const B_BAD_TEAM_ID: status_t = B_OS_ERROR_BASE + 0x103; +pub const B_NO_MORE_TEAMS: status_t = B_OS_ERROR_BASE + 0x104; + +pub const B_BAD_PORT_ID: status_t = B_OS_ERROR_BASE + 0x200; +pub const B_NO_MORE_PORTS: status_t = B_OS_ERROR_BASE + 0x201; + +pub const B_BAD_IMAGE_ID: status_t = B_OS_ERROR_BASE + 0x300; +pub const B_BAD_ADDRESS: status_t = B_OS_ERROR_BASE + 0x301; +pub const B_NOT_AN_EXECUTABLE: status_t = B_OS_ERROR_BASE + 0x302; +pub const B_MISSING_LIBRARY: status_t = B_OS_ERROR_BASE + 0x303; +pub const B_MISSING_SYMBOL: status_t = B_OS_ERROR_BASE + 0x304; +pub const B_UNKNOWN_EXECUTABLE: status_t = B_OS_ERROR_BASE + 0x305; +pub const B_LEGACY_EXECUTABLE: status_t = B_OS_ERROR_BASE + 0x306; + +pub const B_DEBUGGER_ALREADY_INSTALLED: status_t = B_OS_ERROR_BASE + 0x400; + +// Application kit errors +pub const B_BAD_REPLY: status_t = B_APP_ERROR_BASE + 0; +pub const B_DUPLICATE_REPLY: status_t = B_APP_ERROR_BASE + 1; +pub const B_MESSAGE_TO_SELF: status_t = B_APP_ERROR_BASE + 2; +pub const B_BAD_HANDLER: status_t = B_APP_ERROR_BASE + 3; +pub const B_ALREADY_RUNNING: status_t = B_APP_ERROR_BASE + 4; +pub const B_LAUNCH_FAILED: status_t = B_APP_ERROR_BASE + 5; +pub const B_AMBIGUOUS_APP_LAUNCH: status_t = B_APP_ERROR_BASE + 6; +pub const B_UNKNOWN_MIME_TYPE: status_t = B_APP_ERROR_BASE + 7; +pub const B_BAD_SCRIPT_SYNTAX: status_t = B_APP_ERROR_BASE + 8; +pub const B_LAUNCH_FAILED_NO_RESOLVE_LINK: status_t = B_APP_ERROR_BASE + 9; +pub const B_LAUNCH_FAILED_EXECUTABLE: status_t = B_APP_ERROR_BASE + 10; +pub const B_LAUNCH_FAILED_APP_NOT_FOUND: status_t = B_APP_ERROR_BASE + 11; +pub const B_LAUNCH_FAILED_APP_IN_TRASH: status_t = B_APP_ERROR_BASE + 12; +pub const B_LAUNCH_FAILED_NO_PREFERRED_APP: status_t = B_APP_ERROR_BASE + 13; +pub const B_LAUNCH_FAILED_FILES_APP_NOT_FOUND: status_t = + B_APP_ERROR_BASE + 14; +pub const B_BAD_MIME_SNIFFER_RULE: status_t = B_APP_ERROR_BASE + 15; +pub const B_NOT_A_MESSAGE: status_t = B_APP_ERROR_BASE + 16; +pub const B_SHUTDOWN_CANCELLED: status_t = B_APP_ERROR_BASE + 17; +pub const B_SHUTTING_DOWN: status_t = B_APP_ERROR_BASE + 18; + +// Storage kit errors +pub const B_FILE_ERROR: status_t = B_STORAGE_ERROR_BASE + 0; +pub const B_FILE_NOT_FOUND: status_t = B_STORAGE_ERROR_BASE + 1; +pub const B_FILE_EXISTS: status_t = B_STORAGE_ERROR_BASE + 2; +pub const B_ENTRY_NOT_FOUND: status_t = B_STORAGE_ERROR_BASE + 3; +pub const B_NAME_TOO_LONG: status_t = B_STORAGE_ERROR_BASE + 4; +pub const B_NOT_A_DIRECTORY: status_t = B_STORAGE_ERROR_BASE + 5; +pub const B_DIRECTORY_NOT_EMPTY: status_t = B_STORAGE_ERROR_BASE + 6; +pub const B_DEVICE_FULL: status_t = B_STORAGE_ERROR_BASE + 7; +pub const B_READ_ONLY_DEVICE: status_t = B_STORAGE_ERROR_BASE + 8; +pub const B_IS_A_DIRECTORY: status_t = B_STORAGE_ERROR_BASE + 9; +pub const B_NO_MORE_FDS: status_t = B_STORAGE_ERROR_BASE + 10; +pub const B_CROSS_DEVICE_LINK: status_t = B_STORAGE_ERROR_BASE + 11; +pub const B_LINK_LIMIT: status_t = B_STORAGE_ERROR_BASE + 12; +pub const B_BUSTED_PIPE: status_t = B_STORAGE_ERROR_BASE + 13; +pub const B_UNSUPPORTED: status_t = B_STORAGE_ERROR_BASE + 14; +pub const B_PARTITION_TOO_SMALL: status_t = B_STORAGE_ERROR_BASE + 15; +pub const B_PARTIAL_READ: status_t = B_STORAGE_ERROR_BASE + 16; +pub const B_PARTIAL_WRITE: status_t = B_STORAGE_ERROR_BASE + 17; + +// Mapped posix errors +pub const B_BUFFER_OVERFLOW: status_t = ::EOVERFLOW; +pub const B_TOO_MANY_ARGS: status_t = ::E2BIG; +pub const B_FILE_TOO_LARGE: status_t = ::EFBIG; +pub const B_RESULT_NOT_REPRESENTABLE: status_t = ::ERANGE; +pub const B_DEVICE_NOT_FOUND: status_t = ::ENODEV; +pub const B_NOT_SUPPORTED: status_t = ::EOPNOTSUPP; + +// Media kit errors +pub const B_STREAM_NOT_FOUND: status_t = B_MEDIA_ERROR_BASE + 0; +pub const B_SERVER_NOT_FOUND: status_t = B_MEDIA_ERROR_BASE + 1; +pub const B_RESOURCE_NOT_FOUND: status_t = B_MEDIA_ERROR_BASE + 2; +pub const B_RESOURCE_UNAVAILABLE: status_t = B_MEDIA_ERROR_BASE + 3; +pub const B_BAD_SUBSCRIBER: status_t = B_MEDIA_ERROR_BASE + 4; +pub const B_SUBSCRIBER_NOT_ENTERED: status_t = B_MEDIA_ERROR_BASE + 5; +pub const B_BUFFER_NOT_AVAILABLE: status_t = B_MEDIA_ERROR_BASE + 6; +pub const B_LAST_BUFFER_ERROR: status_t = B_MEDIA_ERROR_BASE + 7; + +pub const B_MEDIA_SYSTEM_FAILURE: status_t = B_MEDIA_ERROR_BASE + 100; +pub const B_MEDIA_BAD_NODE: status_t = B_MEDIA_ERROR_BASE + 101; +pub const B_MEDIA_NODE_BUSY: status_t = B_MEDIA_ERROR_BASE + 102; +pub const B_MEDIA_BAD_FORMAT: status_t = B_MEDIA_ERROR_BASE + 103; +pub const B_MEDIA_BAD_BUFFER: status_t = B_MEDIA_ERROR_BASE + 104; +pub const B_MEDIA_TOO_MANY_NODES: status_t = B_MEDIA_ERROR_BASE + 105; +pub const B_MEDIA_TOO_MANY_BUFFERS: status_t = B_MEDIA_ERROR_BASE + 106; +pub const B_MEDIA_NODE_ALREADY_EXISTS: status_t = B_MEDIA_ERROR_BASE + 107; +pub const B_MEDIA_BUFFER_ALREADY_EXISTS: status_t = B_MEDIA_ERROR_BASE + 108; +pub const B_MEDIA_CANNOT_SEEK: status_t = B_MEDIA_ERROR_BASE + 109; +pub const B_MEDIA_CANNOT_CHANGE_RUN_MODE: status_t = B_MEDIA_ERROR_BASE + 110; +pub const B_MEDIA_APP_ALREADY_REGISTERED: status_t = B_MEDIA_ERROR_BASE + 111; +pub const B_MEDIA_APP_NOT_REGISTERED: status_t = B_MEDIA_ERROR_BASE + 112; +pub const B_MEDIA_CANNOT_RECLAIM_BUFFERS: status_t = B_MEDIA_ERROR_BASE + 113; +pub const B_MEDIA_BUFFERS_NOT_RECLAIMED: status_t = B_MEDIA_ERROR_BASE + 114; +pub const B_MEDIA_TIME_SOURCE_STOPPED: status_t = B_MEDIA_ERROR_BASE + 115; +pub const B_MEDIA_TIME_SOURCE_BUSY: status_t = B_MEDIA_ERROR_BASE + 116; +pub const B_MEDIA_BAD_SOURCE: status_t = B_MEDIA_ERROR_BASE + 117; +pub const B_MEDIA_BAD_DESTINATION: status_t = B_MEDIA_ERROR_BASE + 118; +pub const B_MEDIA_ALREADY_CONNECTED: status_t = B_MEDIA_ERROR_BASE + 119; +pub const B_MEDIA_NOT_CONNECTED: status_t = B_MEDIA_ERROR_BASE + 120; +pub const B_MEDIA_BAD_CLIP_FORMAT: status_t = B_MEDIA_ERROR_BASE + 121; +pub const B_MEDIA_ADDON_FAILED: status_t = B_MEDIA_ERROR_BASE + 122; +pub const B_MEDIA_ADDON_DISABLED: status_t = B_MEDIA_ERROR_BASE + 123; +pub const B_MEDIA_CHANGE_IN_PROGRESS: status_t = B_MEDIA_ERROR_BASE + 124; +pub const B_MEDIA_STALE_CHANGE_COUNT: status_t = B_MEDIA_ERROR_BASE + 125; +pub const B_MEDIA_ADDON_RESTRICTED: status_t = B_MEDIA_ERROR_BASE + 126; +pub const B_MEDIA_NO_HANDLER: status_t = B_MEDIA_ERROR_BASE + 127; +pub const B_MEDIA_DUPLICATE_FORMAT: status_t = B_MEDIA_ERROR_BASE + 128; +pub const B_MEDIA_REALTIME_DISABLED: status_t = B_MEDIA_ERROR_BASE + 129; +pub const B_MEDIA_REALTIME_UNAVAILABLE: status_t = B_MEDIA_ERROR_BASE + 130; + +// Mail kit errors +pub const B_MAIL_NO_DAEMON: status_t = B_MAIL_ERROR_BASE + 0; +pub const B_MAIL_UNKNOWN_USER: status_t = B_MAIL_ERROR_BASE + 1; +pub const B_MAIL_WRONG_PASSWORD: status_t = B_MAIL_ERROR_BASE + 2; +pub const B_MAIL_UNKNOWN_HOST: status_t = B_MAIL_ERROR_BASE + 3; +pub const B_MAIL_ACCESS_ERROR: status_t = B_MAIL_ERROR_BASE + 4; +pub const B_MAIL_UNKNOWN_FIELD: status_t = B_MAIL_ERROR_BASE + 5; +pub const B_MAIL_NO_RECIPIENT: status_t = B_MAIL_ERROR_BASE + 6; +pub const B_MAIL_INVALID_MAIL: status_t = B_MAIL_ERROR_BASE + 7; + +// Print kit errors +pub const B_NO_PRINT_SERVER: status_t = B_PRINT_ERROR_BASE + 0; + +// Device kit errors +pub const B_DEV_INVALID_IOCTL: status_t = B_DEVICE_ERROR_BASE + 0; +pub const B_DEV_NO_MEMORY: status_t = B_DEVICE_ERROR_BASE + 1; +pub const B_DEV_BAD_DRIVE_NUM: status_t = B_DEVICE_ERROR_BASE + 2; +pub const B_DEV_NO_MEDIA: status_t = B_DEVICE_ERROR_BASE + 3; +pub const B_DEV_UNREADABLE: status_t = B_DEVICE_ERROR_BASE + 4; +pub const B_DEV_FORMAT_ERROR: status_t = B_DEVICE_ERROR_BASE + 5; +pub const B_DEV_TIMEOUT: status_t = B_DEVICE_ERROR_BASE + 6; +pub const B_DEV_RECALIBRATE_ERROR: status_t = B_DEVICE_ERROR_BASE + 7; +pub const B_DEV_SEEK_ERROR: status_t = B_DEVICE_ERROR_BASE + 8; +pub const B_DEV_ID_ERROR: status_t = B_DEVICE_ERROR_BASE + 9; +pub const B_DEV_READ_ERROR: status_t = B_DEVICE_ERROR_BASE + 10; +pub const B_DEV_WRITE_ERROR: status_t = B_DEVICE_ERROR_BASE + 11; +pub const B_DEV_NOT_READY: status_t = B_DEVICE_ERROR_BASE + 12; +pub const B_DEV_MEDIA_CHANGED: status_t = B_DEVICE_ERROR_BASE + 13; +pub const B_DEV_MEDIA_CHANGE_REQUESTED: status_t = B_DEVICE_ERROR_BASE + 14; +pub const B_DEV_RESOURCE_CONFLICT: status_t = B_DEVICE_ERROR_BASE + 15; +pub const B_DEV_CONFIGURATION_ERROR: status_t = B_DEVICE_ERROR_BASE + 16; +pub const B_DEV_DISABLED_BY_USER: status_t = B_DEVICE_ERROR_BASE + 17; +pub const B_DEV_DOOR_OPEN: status_t = B_DEVICE_ERROR_BASE + 18; + +pub const B_DEV_INVALID_PIPE: status_t = B_DEVICE_ERROR_BASE + 19; +pub const B_DEV_CRC_ERROR: status_t = B_DEVICE_ERROR_BASE + 20; +pub const B_DEV_STALLED: status_t = B_DEVICE_ERROR_BASE + 21; +pub const B_DEV_BAD_PID: status_t = B_DEVICE_ERROR_BASE + 22; +pub const B_DEV_UNEXPECTED_PID: status_t = B_DEVICE_ERROR_BASE + 23; +pub const B_DEV_DATA_OVERRUN: status_t = B_DEVICE_ERROR_BASE + 24; +pub const B_DEV_DATA_UNDERRUN: status_t = B_DEVICE_ERROR_BASE + 25; +pub const B_DEV_FIFO_OVERRUN: status_t = B_DEVICE_ERROR_BASE + 26; +pub const B_DEV_FIFO_UNDERRUN: status_t = B_DEVICE_ERROR_BASE + 27; +pub const B_DEV_PENDING: status_t = B_DEVICE_ERROR_BASE + 28; +pub const B_DEV_MULTIPLE_ERRORS: status_t = B_DEVICE_ERROR_BASE + 29; +pub const B_DEV_TOO_LATE: status_t = B_DEVICE_ERROR_BASE + 30; + +// translation kit errors +pub const B_TRANSLATION_BASE_ERROR: status_t = B_TRANSLATION_ERROR_BASE + 0; +pub const B_NO_TRANSLATOR: status_t = B_TRANSLATION_ERROR_BASE + 1; +pub const B_ILLEGAL_DATA: status_t = B_TRANSLATION_ERROR_BASE + 2; + +// support/TypeConstants.h +pub const B_AFFINE_TRANSFORM_TYPE: u32 = haiku_constant!('A', 'M', 'T', 'X'); +pub const B_ALIGNMENT_TYPE: u32 = haiku_constant!('A', 'L', 'G', 'N'); +pub const B_ANY_TYPE: u32 = haiku_constant!('A', 'N', 'Y', 'T'); +pub const B_ATOM_TYPE: u32 = haiku_constant!('A', 'T', 'O', 'M'); +pub const B_ATOMREF_TYPE: u32 = haiku_constant!('A', 'T', 'M', 'R'); +pub const B_BOOL_TYPE: u32 = haiku_constant!('B', 'O', 'O', 'L'); +pub const B_CHAR_TYPE: u32 = haiku_constant!('C', 'H', 'A', 'R'); +pub const B_COLOR_8_BIT_TYPE: u32 = haiku_constant!('C', 'L', 'R', 'B'); +pub const B_DOUBLE_TYPE: u32 = haiku_constant!('D', 'B', 'L', 'E'); +pub const B_FLOAT_TYPE: u32 = haiku_constant!('F', 'L', 'O', 'T'); +pub const B_GRAYSCALE_8_BIT_TYPE: u32 = haiku_constant!('G', 'R', 'Y', 'B'); +pub const B_INT16_TYPE: u32 = haiku_constant!('S', 'H', 'R', 'T'); +pub const B_INT32_TYPE: u32 = haiku_constant!('L', 'O', 'N', 'G'); +pub const B_INT64_TYPE: u32 = haiku_constant!('L', 'L', 'N', 'G'); +pub const B_INT8_TYPE: u32 = haiku_constant!('B', 'Y', 'T', 'E'); +pub const B_LARGE_ICON_TYPE: u32 = haiku_constant!('I', 'C', 'O', 'N'); +pub const B_MEDIA_PARAMETER_GROUP_TYPE: u32 = + haiku_constant!('B', 'M', 'C', 'G'); +pub const B_MEDIA_PARAMETER_TYPE: u32 = haiku_constant!('B', 'M', 'C', 'T'); +pub const B_MEDIA_PARAMETER_WEB_TYPE: u32 = + haiku_constant!('B', 'M', 'C', 'W'); +pub const B_MESSAGE_TYPE: u32 = haiku_constant!('M', 'S', 'G', 'G'); +pub const B_MESSENGER_TYPE: u32 = haiku_constant!('M', 'S', 'N', 'G'); +pub const B_MIME_TYPE: u32 = haiku_constant!('M', 'I', 'M', 'E'); +pub const B_MINI_ICON_TYPE: u32 = haiku_constant!('M', 'I', 'C', 'N'); +pub const B_MONOCHROME_1_BIT_TYPE: u32 = haiku_constant!('M', 'N', 'O', 'B'); +pub const B_OBJECT_TYPE: u32 = haiku_constant!('O', 'P', 'T', 'R'); +pub const B_OFF_T_TYPE: u32 = haiku_constant!('O', 'F', 'F', 'T'); +pub const B_PATTERN_TYPE: u32 = haiku_constant!('P', 'A', 'T', 'N'); +pub const B_POINTER_TYPE: u32 = haiku_constant!('P', 'N', 'T', 'R'); +pub const B_POINT_TYPE: u32 = haiku_constant!('B', 'P', 'N', 'T'); +pub const B_PROPERTY_INFO_TYPE: u32 = haiku_constant!('S', 'C', 'T', 'D'); +pub const B_RAW_TYPE: u32 = haiku_constant!('R', 'A', 'W', 'T'); +pub const B_RECT_TYPE: u32 = haiku_constant!('R', 'E', 'C', 'T'); +pub const B_REF_TYPE: u32 = haiku_constant!('R', 'R', 'E', 'F'); +pub const B_RGB_32_BIT_TYPE: u32 = haiku_constant!('R', 'G', 'B', 'B'); +pub const B_RGB_COLOR_TYPE: u32 = haiku_constant!('R', 'G', 'B', 'C'); +pub const B_SIZE_TYPE: u32 = haiku_constant!('S', 'I', 'Z', 'E'); +pub const B_SIZE_T_TYPE: u32 = haiku_constant!('S', 'I', 'Z', 'T'); +pub const B_SSIZE_T_TYPE: u32 = haiku_constant!('S', 'S', 'Z', 'T'); +pub const B_STRING_TYPE: u32 = haiku_constant!('C', 'S', 'T', 'R'); +pub const B_STRING_LIST_TYPE: u32 = haiku_constant!('S', 'T', 'R', 'L'); +pub const B_TIME_TYPE: u32 = haiku_constant!('T', 'I', 'M', 'E'); +pub const B_UINT16_TYPE: u32 = haiku_constant!('U', 'S', 'H', 'T'); +pub const B_UINT32_TYPE: u32 = haiku_constant!('U', 'L', 'N', 'G'); +pub const B_UINT64_TYPE: u32 = haiku_constant!('U', 'L', 'L', 'G'); +pub const B_UINT8_TYPE: u32 = haiku_constant!('U', 'B', 'Y', 'T'); +pub const B_VECTOR_ICON_TYPE: u32 = haiku_constant!('V', 'I', 'C', 'N'); +pub const B_XATTR_TYPE: u32 = haiku_constant!('X', 'A', 'T', 'R'); +pub const B_NETWORK_ADDRESS_TYPE: u32 = haiku_constant!('N', 'W', 'A', 'D'); +pub const B_MIME_STRING_TYPE: u32 = haiku_constant!('M', 'I', 'M', 'S'); +pub const B_ASCII_TYPE: u32 = haiku_constant!('T', 'E', 'X', 'T'); + +extern "C" { + // kernel/OS.h + pub fn create_area( + name: *const ::c_char, + startAddress: *mut *mut ::c_void, + addressSpec: u32, + size: usize, + lock: u32, + protection: u32, + ) -> area_id; + pub fn clone_area( + name: *const ::c_char, + destAddress: *mut *mut ::c_void, + addressSpec: u32, + protection: u32, + source: area_id, + ) -> area_id; + pub fn find_area(name: *const ::c_char) -> area_id; + pub fn area_for(address: *mut ::c_void) -> area_id; + pub fn delete_area(id: area_id) -> status_t; + pub fn resize_area(id: area_id, newSize: usize) -> status_t; + pub fn set_area_protection(id: area_id, newProtection: u32) -> status_t; + pub fn _get_area_info( + id: area_id, + areaInfo: *mut area_info, + size: usize, + ) -> status_t; + pub fn _get_next_area_info( + team: team_id, + cookie: *mut isize, + areaInfo: *mut area_info, + size: usize, + ) -> status_t; + + pub fn create_port(capacity: i32, name: *const ::c_char) -> port_id; + pub fn find_port(name: *const ::c_char) -> port_id; + pub fn read_port( + port: port_id, + code: *mut i32, + buffer: *mut ::c_void, + bufferSize: ::size_t, + ) -> ::ssize_t; + pub fn read_port_etc( + port: port_id, + code: *mut i32, + buffer: *mut ::c_void, + bufferSize: ::size_t, + flags: u32, + timeout: bigtime_t, + ) -> ::ssize_t; + pub fn write_port( + port: port_id, + code: i32, + buffer: *const ::c_void, + bufferSize: ::size_t, + ) -> status_t; + pub fn write_port_etc( + port: port_id, + code: i32, + buffer: *const ::c_void, + bufferSize: ::size_t, + flags: u32, + timeout: bigtime_t, + ) -> status_t; + pub fn close_port(port: port_id) -> status_t; + pub fn delete_port(port: port_id) -> status_t; + pub fn port_buffer_size(port: port_id) -> ::ssize_t; + pub fn port_buffer_size_etc( + port: port_id, + flags: u32, + timeout: bigtime_t, + ) -> ::ssize_t; + pub fn port_count(port: port_id) -> ::ssize_t; + pub fn set_port_owner(port: port_id, team: team_id) -> status_t; + + pub fn _get_port_info( + port: port_id, + buf: *mut port_info, + portInfoSize: ::size_t, + ) -> status_t; + pub fn _get_next_port_info( + port: port_id, + cookie: *mut i32, + portInfo: *mut port_info, + portInfoSize: ::size_t, + ) -> status_t; + pub fn _get_port_message_info_etc( + port: port_id, + info: *mut port_message_info, + infoSize: ::size_t, + flags: u32, + timeout: bigtime_t, + ) -> status_t; + + pub fn create_sem(count: i32, name: *const ::c_char) -> sem_id; + pub fn delete_sem(id: sem_id) -> status_t; + pub fn acquire_sem(id: sem_id) -> status_t; + pub fn acquire_sem_etc( + id: sem_id, + count: i32, + flags: u32, + timeout: bigtime_t, + ) -> status_t; + pub fn release_sem(id: sem_id) -> status_t; + pub fn release_sem_etc(id: sem_id, count: i32, flags: u32) -> status_t; + pub fn switch_sem(semToBeReleased: sem_id, id: sem_id) -> status_t; + pub fn switch_sem_etc( + semToBeReleased: sem_id, + id: sem_id, + count: i32, + flags: u32, + timeout: bigtime_t, + ) -> status_t; + pub fn get_sem_count(id: sem_id, threadCount: *mut i32) -> status_t; + pub fn set_sem_owner(id: sem_id, team: team_id) -> status_t; + pub fn _get_sem_info( + id: sem_id, + info: *mut sem_info, + infoSize: ::size_t, + ) -> status_t; + pub fn _get_next_sem_info( + team: team_id, + cookie: *mut i32, + info: *mut sem_info, + infoSize: ::size_t, + ) -> status_t; + + pub fn kill_team(team: team_id) -> status_t; + pub fn _get_team_info( + team: team_id, + info: *mut team_info, + size: ::size_t, + ) -> status_t; + pub fn _get_next_team_info( + cookie: *mut i32, + info: *mut team_info, + size: ::size_t, + ) -> status_t; + + pub fn spawn_thread( + func: thread_func, + name: *const ::c_char, + priority: i32, + data: *mut ::c_void, + ) -> thread_id; + pub fn kill_thread(thread: thread_id) -> status_t; + pub fn resume_thread(thread: thread_id) -> status_t; + pub fn suspend_thread(thread: thread_id) -> status_t; + + pub fn rename_thread( + thread: thread_id, + newName: *const ::c_char, + ) -> status_t; + pub fn set_thread_priority( + thread: thread_id, + newPriority: i32, + ) -> status_t; + pub fn exit_thread(status: status_t); + pub fn wait_for_thread( + thread: thread_id, + returnValue: *mut status_t, + ) -> status_t; + pub fn on_exit_thread( + callback: extern "C" fn(*mut ::c_void), + data: *mut ::c_void, + ) -> status_t; + + pub fn find_thread(name: *const ::c_char) -> thread_id; + + pub fn send_data( + thread: thread_id, + code: i32, + buffer: *const ::c_void, + bufferSize: ::size_t, + ) -> status_t; + pub fn receive_data( + sender: *mut thread_id, + buffer: *mut ::c_void, + bufferSize: ::size_t, + ) -> i32; + pub fn has_data(thread: thread_id) -> bool; + + pub fn snooze(amount: bigtime_t) -> status_t; + pub fn snooze_etc( + amount: bigtime_t, + timeBase: ::c_int, + flags: u32, + ) -> status_t; + pub fn snooze_until(time: bigtime_t, timeBase: ::c_int) -> status_t; + + pub fn _get_thread_info( + id: thread_id, + info: *mut thread_info, + size: ::size_t, + ) -> status_t; + pub fn _get_next_thread_info( + team: team_id, + cookie: *mut i32, + info: *mut thread_info, + size: ::size_t, + ) -> status_t; + + pub fn get_pthread_thread_id(thread: ::pthread_t) -> thread_id; + + pub fn _get_team_usage_info( + team: team_id, + who: i32, + info: *mut team_usage_info, + size: ::size_t, + ) -> status_t; + + pub fn real_time_clock() -> ::c_ulong; + pub fn set_real_time_clock(secsSinceJan1st1970: ::c_ulong); + pub fn real_time_clock_usecs() -> bigtime_t; + pub fn system_time() -> bigtime_t; + pub fn system_time_nsecs() -> nanotime_t; + // set_timezone() is deprecated and a no-op + + pub fn set_alarm(when: bigtime_t, flags: u32) -> bigtime_t; + pub fn debugger(message: *const ::c_char); + pub fn disable_debugger(state: ::c_int) -> ::c_int; + + // TODO: cpuid_info struct and the get_cpuid() function + + pub fn get_system_info(info: *mut system_info) -> status_t; + pub fn get_cpu_info( + firstCPU: u32, + cpuCount: u32, + info: *mut cpu_info, + ) -> status_t; + pub fn is_computer_on() -> i32; + pub fn is_computer_on_fire() -> ::c_double; + pub fn send_signal(threadID: thread_id, signal: ::c_uint) -> ::c_int; + pub fn set_signal_stack(base: *mut ::c_void, size: ::size_t); + + pub fn wait_for_objects( + infos: *mut object_wait_info, + numInfos: ::c_int, + ) -> ::ssize_t; + pub fn wait_for_objects_etc( + infos: *mut object_wait_info, + numInfos: ::c_int, + flags: u32, + timeout: bigtime_t, + ) -> ::ssize_t; + + // kernel/fs_attr.h + pub fn fs_read_attr( + fd: ::c_int, + attribute: *const ::c_char, + type_: u32, + pos: ::off_t, + buffer: *mut ::c_void, + readBytes: ::size_t, + ) -> ::ssize_t; + pub fn fs_write_attr( + fd: ::c_int, + attribute: *const ::c_char, + type_: u32, + pos: ::off_t, + buffer: *const ::c_void, + writeBytes: ::size_t, + ) -> ::ssize_t; + pub fn fs_remove_attr(fd: ::c_int, attribute: *const ::c_char) -> ::c_int; + pub fn fs_stat_attr( + fd: ::c_int, + attribute: *const ::c_char, + attrInfo: *mut attr_info, + ) -> ::c_int; + + pub fn fs_open_attr( + path: *const ::c_char, + attribute: *const ::c_char, + type_: u32, + openMode: ::c_int, + ) -> ::c_int; + pub fn fs_fopen_attr( + fd: ::c_int, + attribute: *const ::c_char, + type_: u32, + openMode: ::c_int, + ) -> ::c_int; + pub fn fs_close_attr(fd: ::c_int) -> ::c_int; + + pub fn fs_open_attr_dir(path: *const ::c_char) -> *mut ::DIR; + pub fn fs_lopen_attr_dir(path: *const ::c_char) -> *mut ::DIR; + pub fn fs_fopen_attr_dir(fd: ::c_int) -> *mut ::DIR; + pub fn fs_close_attr_dir(dir: *mut ::DIR) -> ::c_int; + pub fn fs_read_attr_dir(dir: *mut ::DIR) -> *mut ::dirent; + pub fn fs_rewind_attr_dir(dir: *mut ::DIR); + + // kernel/fs_image.h + pub fn fs_create_index( + device: ::dev_t, + name: *const ::c_char, + type_: u32, + flags: u32, + ) -> ::c_int; + pub fn fs_remove_index(device: ::dev_t, name: *const ::c_char) -> ::c_int; + pub fn fs_stat_index( + device: ::dev_t, + name: *const ::c_char, + indexInfo: *mut index_info, + ) -> ::c_int; + + pub fn fs_open_index_dir(device: ::dev_t) -> *mut ::DIR; + pub fn fs_close_index_dir(indexDirectory: *mut ::DIR) -> ::c_int; + pub fn fs_read_index_dir(indexDirectory: *mut ::DIR) -> *mut ::dirent; + pub fn fs_rewind_index_dir(indexDirectory: *mut ::DIR); + + // kernel/fs_info.h + pub fn dev_for_path(path: *const ::c_char) -> ::dev_t; + pub fn next_dev(pos: *mut i32) -> ::dev_t; + pub fn fs_stat_dev(dev: ::dev_t, info: *mut fs_info) -> ::c_int; + + // kernel/fs_query.h + pub fn fs_open_query( + device: ::dev_t, + query: *const ::c_char, + flags: u32, + ) -> *mut ::DIR; + pub fn fs_open_live_query( + device: ::dev_t, + query: *const ::c_char, + flags: u32, + port: port_id, + token: i32, + ) -> *mut ::DIR; + pub fn fs_close_query(d: *mut ::DIR) -> ::c_int; + pub fn fs_read_query(d: *mut ::DIR) -> *mut ::dirent; + pub fn get_path_for_dirent( + dent: *mut ::dirent, + buf: *mut ::c_char, + len: ::size_t, + ) -> status_t; + + // kernel/fs_volume.h + pub fn fs_mount_volume( + where_: *const ::c_char, + device: *const ::c_char, + filesystem: *const ::c_char, + flags: u32, + parameters: *const ::c_char, + ) -> ::dev_t; + pub fn fs_unmount_volume(path: *const ::c_char, flags: u32) -> status_t; + + // kernel/image.h + pub fn load_image( + argc: i32, + argv: *mut *const ::c_char, + environ: *mut *const ::c_char, + ) -> thread_id; + pub fn load_add_on(path: *const ::c_char) -> image_id; + pub fn unload_add_on(image: image_id) -> status_t; + pub fn get_image_symbol( + image: image_id, + name: *const ::c_char, + symbolType: i32, + symbolLocation: *mut *mut ::c_void, + ) -> status_t; + pub fn get_nth_image_symbol( + image: image_id, + n: i32, + nameBuffer: *mut ::c_char, + nameLength: *mut i32, + symbolType: *mut i32, + symbolLocation: *mut *mut ::c_void, + ) -> status_t; + pub fn clear_caches(address: *mut ::c_void, length: ::size_t, flags: u32); + pub fn _get_image_info( + image: image_id, + info: *mut image_info, + size: ::size_t, + ) -> status_t; + pub fn _get_next_image_info( + team: team_id, + cookie: *mut i32, + info: *mut image_info, + size: ::size_t, + ) -> status_t; +} + +// The following functions are defined as macros in C/C++ +pub unsafe fn get_area_info(id: area_id, info: *mut area_info) -> status_t { + _get_area_info(id, info, core::mem::size_of::() as usize) +} + +pub unsafe fn get_next_area_info( + team: team_id, + cookie: *mut isize, + info: *mut area_info, +) -> status_t { + _get_next_area_info( + team, + cookie, + info, + core::mem::size_of::() as usize, + ) +} + +pub unsafe fn get_port_info(port: port_id, buf: *mut port_info) -> status_t { + _get_port_info(port, buf, core::mem::size_of::() as ::size_t) +} + +pub unsafe fn get_next_port_info( + port: port_id, + cookie: *mut i32, + portInfo: *mut port_info, +) -> status_t { + _get_next_port_info( + port, + cookie, + portInfo, + core::mem::size_of::() as ::size_t, + ) +} + +pub unsafe fn get_port_message_info_etc( + port: port_id, + info: *mut port_message_info, + flags: u32, + timeout: bigtime_t, +) -> status_t { + _get_port_message_info_etc( + port, + info, + core::mem::size_of::() as ::size_t, + flags, + timeout, + ) +} + +pub unsafe fn get_sem_info(id: sem_id, info: *mut sem_info) -> status_t { + _get_sem_info(id, info, core::mem::size_of::() as ::size_t) +} + +pub unsafe fn get_next_sem_info( + team: team_id, + cookie: *mut i32, + info: *mut sem_info, +) -> status_t { + _get_next_sem_info( + team, + cookie, + info, + core::mem::size_of::() as ::size_t, + ) +} + +pub unsafe fn get_team_info(team: team_id, info: *mut team_info) -> status_t { + _get_team_info(team, info, core::mem::size_of::() as ::size_t) +} + +pub unsafe fn get_next_team_info( + cookie: *mut i32, + info: *mut team_info, +) -> status_t { + _get_next_team_info( + cookie, + info, + core::mem::size_of::() as ::size_t, + ) +} + +pub unsafe fn get_team_usage_info( + team: team_id, + who: i32, + info: *mut team_usage_info, +) -> status_t { + _get_team_usage_info( + team, + who, + info, + core::mem::size_of::() as ::size_t, + ) +} + +pub unsafe fn get_thread_info( + id: thread_id, + info: *mut thread_info, +) -> status_t { + _get_thread_info(id, info, core::mem::size_of::() as ::size_t) +} + +pub unsafe fn get_next_thread_info( + team: team_id, + cookie: *mut i32, + info: *mut thread_info, +) -> status_t { + _get_next_thread_info( + team, + cookie, + info, + core::mem::size_of::() as ::size_t, + ) +} + +// kernel/image.h +pub unsafe fn get_image_info( + image: image_id, + info: *mut image_info, +) -> status_t { + _get_image_info( + image, + info, + core::mem::size_of::() as ::size_t, + ) +} + +pub unsafe fn get_next_image_info( + team: team_id, + cookie: *mut i32, + info: *mut image_info, +) -> status_t { + _get_next_image_info( + team, + cookie, + info, + core::mem::size_of::() as ::size_t, + ) +} diff --git a/vendor/libc/src/unix/linux_like/android/b32/arm.rs b/vendor/libc/src/unix/linux_like/android/b32/arm.rs index aa9beb7652..8a53e53994 100644 --- a/vendor/libc/src/unix/linux_like/android/b32/arm.rs +++ b/vendor/libc/src/unix/linux_like/android/b32/arm.rs @@ -521,3 +521,19 @@ pub const REG_R14: ::c_int = 14; pub const REG_R15: ::c_int = 15; pub const NGREG: ::c_int = 18; + +f! { + // Sadly, Android before 5.0 (API level 21), the accept4 syscall is not + // exposed by the libc. As work-around, we implement it through `syscall` + // directly. This workaround can be removed if the minimum version of + // Android is bumped. When the workaround is removed, `accept4` can be + // moved back to `linux_like/mod.rs` + pub fn accept4( + fd: ::c_int, + addr: *mut ::sockaddr, + len: *mut ::socklen_t, + flg: ::c_int + ) -> ::c_int { + ::syscall(SYS_accept4, fd, addr, len, flg) as ::c_int + } +} diff --git a/vendor/libc/src/unix/linux_like/android/b32/x86/mod.rs b/vendor/libc/src/unix/linux_like/android/b32/x86/mod.rs index 879ea1a174..6507cb4e07 100644 --- a/vendor/libc/src/unix/linux_like/android/b32/x86/mod.rs +++ b/vendor/libc/src/unix/linux_like/android/b32/x86/mod.rs @@ -574,6 +574,35 @@ pub const REG_EFL: ::c_int = 16; pub const REG_UESP: ::c_int = 17; pub const REG_SS: ::c_int = 18; +// socketcall values from linux/net.h (only the needed ones, and not public) +const SYS_ACCEPT4: ::c_int = 18; + +f! { + // Sadly, Android before 5.0 (API level 21), the accept4 syscall is not + // exposed by the libc. As work-around, we implement it as raw syscall. + // Note that for x86, the `accept4` syscall is not available either, + // and we must use the `socketcall` syscall instead. + // This workaround can be removed if the minimum Android version is bumped. + // When the workaround is removed, `accept4` can be moved back + // to `linux_like/mod.rs` + pub fn accept4( + fd: ::c_int, + addr: *mut ::sockaddr, + len: *mut ::socklen_t, + flg: ::c_int + ) -> ::c_int { + // Arguments are passed as array of `long int` + // (which is big enough on x86 for a pointer). + let mut args = [ + fd as ::c_long, + addr as ::c_long, + len as ::c_long, + flg as ::c_long, + ]; + ::syscall(SYS_socketcall, SYS_ACCEPT4, args[..].as_mut_ptr()) + } +} + cfg_if! { if #[cfg(libc_align)] { mod align; diff --git a/vendor/libc/src/unix/linux_like/android/b64/mod.rs b/vendor/libc/src/unix/linux_like/android/b64/mod.rs index 96244d10fe..c23e2dbf2d 100644 --- a/vendor/libc/src/unix/linux_like/android/b64/mod.rs +++ b/vendor/libc/src/unix/linux_like/android/b64/mod.rs @@ -305,6 +305,22 @@ pub const UT_LINESIZE: usize = 32; pub const UT_NAMESIZE: usize = 32; pub const UT_HOSTSIZE: usize = 256; +f! { + // Sadly, Android before 5.0 (API level 21), the accept4 syscall is not + // exposed by the libc. As work-around, we implement it through `syscall` + // directly. This workaround can be removed if the minimum version of + // Android is bumped. When the workaround is removed, `accept4` can be + // moved back to `linux_like/mod.rs` + pub fn accept4( + fd: ::c_int, + addr: *mut ::sockaddr, + len: *mut ::socklen_t, + flg: ::c_int + ) -> ::c_int { + ::syscall(SYS_accept4, fd, addr, len, flg) as ::c_int + } +} + extern "C" { pub fn getauxval(type_: ::c_ulong) -> ::c_ulong; } diff --git a/vendor/libc/src/unix/linux_like/android/mod.rs b/vendor/libc/src/unix/linux_like/android/mod.rs index 09ecdd62f6..f1d6ef4b2b 100644 --- a/vendor/libc/src/unix/linux_like/android/mod.rs +++ b/vendor/libc/src/unix/linux_like/android/mod.rs @@ -2350,20 +2350,6 @@ f! { pub fn SO_EE_OFFENDER(ee: *const ::sock_extended_err) -> *mut ::sockaddr { ee.offset(1) as *mut ::sockaddr } - - // Sadly, Android before 5.0 (API level 21), the accept4 syscall is not - // exposed by the libc. As work-around, we implement it through `syscall` - // directly. This workaround can be removed if the minimum version of - // Android is bumped. When the workaround is removed, `accept4` can be - // moved back to `linux_like/mod.rs` - pub fn accept4( - fd: ::c_int, - addr: *mut ::sockaddr, - len: *mut ::socklen_t, - flg: ::c_int - ) -> ::c_int { - syscall(SYS_accept4, fd, addr, len, flg) as ::c_int - } } extern "C" { @@ -2823,6 +2809,8 @@ extern "C" { pub fn regfree(preg: *mut ::regex_t); pub fn android_set_abort_message(msg: *const ::c_char); + + pub fn gettid() -> ::pid_t; } cfg_if! { @@ -2838,6 +2826,17 @@ cfg_if! { } impl siginfo_t { + pub unsafe fn si_addr(&self) -> *mut ::c_void { + #[repr(C)] + struct siginfo_sigfault { + _si_signo: ::c_int, + _si_errno: ::c_int, + _si_code: ::c_int, + si_addr: *mut ::c_void, + } + (*(self as *const siginfo_t as *const siginfo_sigfault)).si_addr + } + pub unsafe fn si_value(&self) -> ::sigval { #[repr(C)] struct siginfo_timer { @@ -2851,3 +2850,65 @@ impl siginfo_t { (*(self as *const siginfo_t as *const siginfo_timer)).si_sigval } } + +cfg_if! { + if #[cfg(libc_union)] { + // Internal, for casts to access union fields + #[repr(C)] + struct sifields_sigchld { + si_pid: ::pid_t, + si_uid: ::uid_t, + si_status: ::c_int, + si_utime: ::c_long, + si_stime: ::c_long, + } + impl ::Copy for sifields_sigchld {} + impl ::Clone for sifields_sigchld { + fn clone(&self) -> sifields_sigchld { + *self + } + } + + // Internal, for casts to access union fields + #[repr(C)] + union sifields { + _align_pointer: *mut ::c_void, + sigchld: sifields_sigchld, + } + + // Internal, for casts to access union fields. Note that some variants + // of sifields start with a pointer, which makes the alignment of + // sifields vary on 32-bit and 64-bit architectures. + #[repr(C)] + struct siginfo_f { + _siginfo_base: [::c_int; 3], + sifields: sifields, + } + + impl siginfo_t { + unsafe fn sifields(&self) -> &sifields { + &(*(self as *const siginfo_t as *const siginfo_f)).sifields + } + + pub unsafe fn si_pid(&self) -> ::pid_t { + self.sifields().sigchld.si_pid + } + + pub unsafe fn si_uid(&self) -> ::uid_t { + self.sifields().sigchld.si_uid + } + + pub unsafe fn si_status(&self) -> ::c_int { + self.sifields().sigchld.si_status + } + + pub unsafe fn si_utime(&self) -> ::c_long { + self.sifields().sigchld.si_utime + } + + pub unsafe fn si_stime(&self) -> ::c_long { + self.sifields().sigchld.si_stime + } + } + } +} 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 e07c677f08..600257ac03 100644 --- a/vendor/libc/src/unix/linux_like/linux/gnu/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/gnu/mod.rs @@ -13,7 +13,7 @@ s! { pub stx_uid: u32, pub stx_gid: u32, pub stx_mode: u16, - pub __statx_pad1: [u16; 1], + __statx_pad1: [u16; 1], pub stx_ino: u64, pub stx_size: u64, pub stx_blocks: u64, @@ -26,7 +26,9 @@ s! { pub stx_rdev_minor: u32, pub stx_dev_major: u32, pub stx_dev_minor: u32, - pub __statx_pad2: [u64; 14], + pub stx_mnt_id: u64, + __statx_pad2: u64, + __statx_pad3: [u64; 12], } pub struct statx_timestamp { @@ -285,6 +287,19 @@ s! { __re_nsub: ::size_t, __bitfield: u8, } + + pub struct Elf64_Chdr { + pub ch_type: ::Elf64_Word, + pub ch_reserved: ::Elf64_Word, + pub ch_size: ::Elf64_Xword, + pub ch_addralign: ::Elf64_Xword, + } + + pub struct Elf32_Chdr { + pub ch_type: ::Elf32_Word, + pub ch_size: ::Elf32_Word, + pub ch_addralign: ::Elf32_Word, + } } impl siginfo_t { @@ -618,6 +633,22 @@ pub const TCP_FASTOPEN: ::c_int = 23; pub const TCP_TIMESTAMP: ::c_int = 24; pub const TCP_FASTOPEN_CONNECT: ::c_int = 30; +pub const FAN_MARK_INODE: ::c_uint = 0x0000_0000; +pub const FAN_MARK_MOUNT: ::c_uint = 0x0000_0010; +// NOTE: FAN_MARK_FILESYSTEM requires Linux Kernel >= 4.20.0 +pub const FAN_MARK_FILESYSTEM: ::c_uint = 0x0000_0100; + +pub const AF_IB: ::c_int = 27; +pub const AF_MPLS: ::c_int = 28; +pub const AF_NFC: ::c_int = 39; +pub const AF_VSOCK: ::c_int = 40; +pub const AF_XDP: ::c_int = 44; +pub const PF_IB: ::c_int = AF_IB; +pub const PF_MPLS: ::c_int = AF_MPLS; +pub const PF_NFC: ::c_int = AF_NFC; +pub const PF_VSOCK: ::c_int = AF_VSOCK; +pub const PF_XDP: ::c_int = AF_XDP; + /* DCCP socket options */ pub const DCCP_SOCKOPT_PACKET_SIZE: ::c_int = 1; pub const DCCP_SOCKOPT_SERVICE: ::c_int = 2; @@ -644,6 +675,7 @@ pub const SIGEV_THREAD_ID: ::c_int = 4; pub const BUFSIZ: ::c_uint = 8192; pub const TMP_MAX: ::c_uint = 238328; pub const FOPEN_MAX: ::c_uint = 16; +pub const FILENAME_MAX: ::c_uint = 4096; pub const POSIX_MADV_DONTNEED: ::c_int = 4; pub const _SC_EQUIV_CLASS_MAX: ::c_int = 41; pub const _SC_CHARCLASS_NAME_MAX: ::c_int = 45; @@ -768,6 +800,9 @@ cfg_if! { pub const QNX6_SUPER_MAGIC: ::c_long = 0x68191122; pub const RDTGROUP_SUPER_MAGIC: ::c_long = 0x7655821; pub const REISERFS_SUPER_MAGIC: ::c_long = 0x52654973; + pub const SECURITYFS_MAGIC: ::c_long = 0x73636673; + pub const SELINUX_MAGIC: ::c_long = 0xf97cff8c; + pub const SMACK_MAGIC: ::c_long = 0x43415d53; pub const SMB_SUPER_MAGIC: ::c_long = 0x0000517b; pub const SYSFS_MAGIC: ::c_long = 0x62656572; pub const TMPFS_MAGIC: ::c_long = 0x01021994; @@ -819,6 +854,9 @@ cfg_if! { pub const QNX6_SUPER_MAGIC: ::c_uint = 0x68191122; pub const RDTGROUP_SUPER_MAGIC: ::c_uint = 0x7655821; pub const REISERFS_SUPER_MAGIC: ::c_uint = 0x52654973; + pub const SECURITYFS_MAGIC: ::c_uint = 0x73636673; + pub const SELINUX_MAGIC: ::c_uint = 0xf97cff8c; + pub const SMACK_MAGIC: ::c_uint = 0x43415d53; pub const SMB_SUPER_MAGIC: ::c_uint = 0x0000517b; pub const SYSFS_MAGIC: ::c_uint = 0x62656572; pub const TMPFS_MAGIC: ::c_uint = 0x01021994; @@ -855,10 +893,14 @@ pub const PTRACE_INTERRUPT: ::c_uint = 0x4207; pub const PTRACE_LISTEN: ::c_uint = 0x4208; pub const PTRACE_PEEKSIGINFO: ::c_uint = 0x4209; -pub const EPOLLWAKEUP: ::c_int = 0x20000000; +// linux/fs.h -pub const SEEK_DATA: ::c_int = 3; -pub const SEEK_HOLE: ::c_int = 4; +// Flags for preadv2/pwritev2 +pub const RWF_HIPRI: ::c_int = 0x00000001; +pub const RWF_DSYNC: ::c_int = 0x00000002; +pub const RWF_SYNC: ::c_int = 0x00000004; +pub const RWF_NOWAIT: ::c_int = 0x00000008; +pub const RWF_APPEND: ::c_int = 0x00000010; // linux/rtnetlink.h pub const TCA_PAD: ::c_ushort = 9; @@ -1171,6 +1213,7 @@ pub const STATX_SIZE: ::c_uint = 0x0200; pub const STATX_BLOCKS: ::c_uint = 0x0400; pub const STATX_BASIC_STATS: ::c_uint = 0x07ff; pub const STATX_BTIME: ::c_uint = 0x0800; +pub const STATX_MNT_ID: ::c_uint = 0x1000; pub const STATX_ALL: ::c_uint = 0x0fff; pub const STATX__RESERVED: ::c_int = 0x80000000; pub const STATX_ATTR_COMPRESSED: ::c_int = 0x0004; @@ -1420,6 +1463,20 @@ extern "C" { dirfd: ::c_int, path: *const ::c_char, ) -> ::c_int; + pub fn preadv2( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off_t, + flags: ::c_int, + ) -> ::ssize_t; + pub fn pwritev2( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off_t, + flags: ::c_int, + ) -> ::ssize_t; } extern "C" { diff --git a/vendor/libc/src/unix/linux_like/linux/mod.rs b/vendor/libc/src/unix/linux_like/linux/mod.rs index 60f78dfed2..ce71f1c7ef 100644 --- a/vendor/libc/src/unix/linux_like/linux/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/mod.rs @@ -40,6 +40,8 @@ pub type Elf64_Section = u16; pub type canid_t = u32; pub type can_err_mask_t = u32; +pub type iconv_t = *mut ::c_void; + #[cfg_attr(feature = "extra_traits", derive(Debug))] pub enum fpos64_t {} // FIXME: fill this out with a struct impl ::Copy for fpos64_t {} @@ -300,9 +302,18 @@ s! { #[cfg(target_pointer_width = "32")] pub dlpi_phnum: Elf32_Half, + // As of uClibc 1.0.36, the following fields are + // gated behind a "#if 0" block which always evaluates + // to false. So I'm just removing these, and if uClibc changes + // the #if block in the future to include the following fields, these + // will probably need including here. tsidea, skrap + #[cfg(not(target_env = "uclibc"))] pub dlpi_adds: ::c_ulonglong, + #[cfg(not(target_env = "uclibc"))] pub dlpi_subs: ::c_ulonglong, + #[cfg(not(target_env = "uclibc"))] pub dlpi_tls_modid: ::size_t, + #[cfg(not(target_env = "uclibc"))] pub dlpi_tls_data: *mut ::c_void, } @@ -406,19 +417,6 @@ s! { pub sh_entsize: Elf64_Xword, } - pub struct Elf32_Chdr { - pub ch_type: Elf32_Word, - pub ch_size: Elf32_Word, - pub ch_addralign: Elf32_Word, - } - - pub struct Elf64_Chdr { - pub ch_type: Elf64_Word, - pub ch_reserved: Elf64_Word, - pub ch_size: Elf64_Xword, - pub ch_addralign: Elf64_Xword, - } - pub struct ucred { pub pid: ::pid_t, pub uid: ::uid_t, @@ -897,78 +895,76 @@ cfg_if! { } } -pub const ABDAY_1: ::nl_item = 0x20000; -pub const ABDAY_2: ::nl_item = 0x20001; -pub const ABDAY_3: ::nl_item = 0x20002; -pub const ABDAY_4: ::nl_item = 0x20003; -pub const ABDAY_5: ::nl_item = 0x20004; -pub const ABDAY_6: ::nl_item = 0x20005; -pub const ABDAY_7: ::nl_item = 0x20006; - -pub const DAY_1: ::nl_item = 0x20007; -pub const DAY_2: ::nl_item = 0x20008; -pub const DAY_3: ::nl_item = 0x20009; -pub const DAY_4: ::nl_item = 0x2000A; -pub const DAY_5: ::nl_item = 0x2000B; -pub const DAY_6: ::nl_item = 0x2000C; -pub const DAY_7: ::nl_item = 0x2000D; - -pub const ABMON_1: ::nl_item = 0x2000E; -pub const ABMON_2: ::nl_item = 0x2000F; -pub const ABMON_3: ::nl_item = 0x20010; -pub const ABMON_4: ::nl_item = 0x20011; -pub const ABMON_5: ::nl_item = 0x20012; -pub const ABMON_6: ::nl_item = 0x20013; -pub const ABMON_7: ::nl_item = 0x20014; -pub const ABMON_8: ::nl_item = 0x20015; -pub const ABMON_9: ::nl_item = 0x20016; -pub const ABMON_10: ::nl_item = 0x20017; -pub const ABMON_11: ::nl_item = 0x20018; -pub const ABMON_12: ::nl_item = 0x20019; - -pub const MON_1: ::nl_item = 0x2001A; -pub const MON_2: ::nl_item = 0x2001B; -pub const MON_3: ::nl_item = 0x2001C; -pub const MON_4: ::nl_item = 0x2001D; -pub const MON_5: ::nl_item = 0x2001E; -pub const MON_6: ::nl_item = 0x2001F; -pub const MON_7: ::nl_item = 0x20020; -pub const MON_8: ::nl_item = 0x20021; -pub const MON_9: ::nl_item = 0x20022; -pub const MON_10: ::nl_item = 0x20023; -pub const MON_11: ::nl_item = 0x20024; -pub const MON_12: ::nl_item = 0x20025; - -pub const AM_STR: ::nl_item = 0x20026; -pub const PM_STR: ::nl_item = 0x20027; - -pub const D_T_FMT: ::nl_item = 0x20028; -pub const D_FMT: ::nl_item = 0x20029; -pub const T_FMT: ::nl_item = 0x2002A; -pub const T_FMT_AMPM: ::nl_item = 0x2002B; - -pub const ERA: ::nl_item = 0x2002C; -pub const ERA_D_FMT: ::nl_item = 0x2002E; -pub const ALT_DIGITS: ::nl_item = 0x2002F; -pub const ERA_D_T_FMT: ::nl_item = 0x20030; -pub const ERA_T_FMT: ::nl_item = 0x20031; - -pub const CODESET: ::nl_item = 14; - -pub const CRNCYSTR: ::nl_item = 0x4000F; - -pub const RUSAGE_THREAD: ::c_int = 1; -pub const RUSAGE_CHILDREN: ::c_int = -1; - -pub const RADIXCHAR: ::nl_item = 0x10000; -pub const THOUSEP: ::nl_item = 0x10001; - -pub const YESEXPR: ::nl_item = 0x50000; -pub const NOEXPR: ::nl_item = 0x50001; -pub const YESSTR: ::nl_item = 0x50002; -pub const NOSTR: ::nl_item = 0x50003; +cfg_if! { + if #[cfg(any(target_env = "gnu", target_env = "musl"))] { + pub const ABDAY_1: ::nl_item = 0x20000; + pub const ABDAY_2: ::nl_item = 0x20001; + pub const ABDAY_3: ::nl_item = 0x20002; + pub const ABDAY_4: ::nl_item = 0x20003; + pub const ABDAY_5: ::nl_item = 0x20004; + pub const ABDAY_6: ::nl_item = 0x20005; + pub const ABDAY_7: ::nl_item = 0x20006; + + pub const DAY_1: ::nl_item = 0x20007; + pub const DAY_2: ::nl_item = 0x20008; + pub const DAY_3: ::nl_item = 0x20009; + pub const DAY_4: ::nl_item = 0x2000A; + pub const DAY_5: ::nl_item = 0x2000B; + pub const DAY_6: ::nl_item = 0x2000C; + pub const DAY_7: ::nl_item = 0x2000D; + + pub const ABMON_1: ::nl_item = 0x2000E; + pub const ABMON_2: ::nl_item = 0x2000F; + pub const ABMON_3: ::nl_item = 0x20010; + pub const ABMON_4: ::nl_item = 0x20011; + pub const ABMON_5: ::nl_item = 0x20012; + pub const ABMON_6: ::nl_item = 0x20013; + pub const ABMON_7: ::nl_item = 0x20014; + pub const ABMON_8: ::nl_item = 0x20015; + pub const ABMON_9: ::nl_item = 0x20016; + pub const ABMON_10: ::nl_item = 0x20017; + pub const ABMON_11: ::nl_item = 0x20018; + pub const ABMON_12: ::nl_item = 0x20019; + + pub const MON_1: ::nl_item = 0x2001A; + pub const MON_2: ::nl_item = 0x2001B; + pub const MON_3: ::nl_item = 0x2001C; + pub const MON_4: ::nl_item = 0x2001D; + pub const MON_5: ::nl_item = 0x2001E; + pub const MON_6: ::nl_item = 0x2001F; + pub const MON_7: ::nl_item = 0x20020; + pub const MON_8: ::nl_item = 0x20021; + pub const MON_9: ::nl_item = 0x20022; + pub const MON_10: ::nl_item = 0x20023; + pub const MON_11: ::nl_item = 0x20024; + pub const MON_12: ::nl_item = 0x20025; + + pub const AM_STR: ::nl_item = 0x20026; + pub const PM_STR: ::nl_item = 0x20027; + + pub const D_T_FMT: ::nl_item = 0x20028; + pub const D_FMT: ::nl_item = 0x20029; + pub const T_FMT: ::nl_item = 0x2002A; + pub const T_FMT_AMPM: ::nl_item = 0x2002B; + + pub const ERA: ::nl_item = 0x2002C; + pub const ERA_D_FMT: ::nl_item = 0x2002E; + pub const ALT_DIGITS: ::nl_item = 0x2002F; + pub const ERA_D_T_FMT: ::nl_item = 0x20030; + pub const ERA_T_FMT: ::nl_item = 0x20031; + + pub const CODESET: ::nl_item = 14; + pub const CRNCYSTR: ::nl_item = 0x4000F; + pub const RADIXCHAR: ::nl_item = 0x10000; + pub const THOUSEP: ::nl_item = 0x10001; + pub const YESEXPR: ::nl_item = 0x50000; + pub const NOEXPR: ::nl_item = 0x50001; + pub const YESSTR: ::nl_item = 0x50002; + pub const NOSTR: ::nl_item = 0x50003; + } +} -pub const FILENAME_MAX: ::c_uint = 4096; +pub const RUSAGE_CHILDREN: ::c_int = -1; pub const L_tmpnam: ::c_uint = 20; pub const _PC_LINK_MAX: ::c_int = 0; pub const _PC_MAX_CANON: ::c_int = 1; @@ -1278,6 +1274,10 @@ pub const IFF_DETACH_QUEUE: ::c_int = 0x0400; pub const IFF_PERSIST: ::c_int = 0x0800; pub const IFF_NOFILTER: ::c_int = 0x1000; +// Since Linux 3.1 +pub const SEEK_DATA: ::c_int = 3; +pub const SEEK_HOLE: ::c_int = 4; + pub const ST_RDONLY: ::c_ulong = 1; pub const ST_NOSUID: ::c_ulong = 2; pub const ST_NODEV: ::c_ulong = 4; @@ -1298,7 +1298,6 @@ pub const RTLD_NOW: ::c_int = 0x2; pub const AT_EACCESS: ::c_int = 0x200; pub const TCP_MD5SIG: ::c_int = 14; -pub const TCP_ULP: ::c_int = 31; align_const! { pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { @@ -1344,17 +1343,6 @@ pub const IPPROTO_MPTCP: ::c_int = 262; )] pub const IPPROTO_MAX: ::c_int = 256; -pub const AF_IB: ::c_int = 27; -pub const AF_MPLS: ::c_int = 28; -pub const AF_NFC: ::c_int = 39; -pub const AF_VSOCK: ::c_int = 40; -pub const AF_XDP: ::c_int = 44; -pub const PF_IB: ::c_int = AF_IB; -pub const PF_MPLS: ::c_int = AF_MPLS; -pub const PF_NFC: ::c_int = AF_NFC; -pub const PF_VSOCK: ::c_int = AF_VSOCK; -pub const PF_XDP: ::c_int = AF_XDP; - // System V IPC pub const IPC_PRIVATE: ::key_t = 0; @@ -1371,7 +1359,6 @@ pub const MSG_INFO: ::c_int = 12; pub const MSG_NOERROR: ::c_int = 0o10000; pub const MSG_EXCEPT: ::c_int = 0o20000; -pub const MSG_COPY: ::c_int = 0o40000; pub const SHM_R: ::c_int = 0o400; pub const SHM_W: ::c_int = 0o200; @@ -1379,16 +1366,17 @@ pub const SHM_W: ::c_int = 0o200; pub const SHM_RDONLY: ::c_int = 0o10000; pub const SHM_RND: ::c_int = 0o20000; pub const SHM_REMAP: ::c_int = 0o40000; -pub const SHM_EXEC: ::c_int = 0o100000; pub const SHM_LOCK: ::c_int = 11; pub const SHM_UNLOCK: ::c_int = 12; pub const SHM_HUGETLB: ::c_int = 0o4000; +#[cfg(not(all(target_env = "uclibc", target_arch = "mips")))] pub const SHM_NORESERVE: ::c_int = 0o10000; pub const EPOLLRDHUP: ::c_int = 0x2000; pub const EPOLLEXCLUSIVE: ::c_int = 0x10000000; +pub const EPOLLWAKEUP: ::c_int = 0x20000000; pub const EPOLLONESHOT: ::c_int = 0x40000000; pub const QFMT_VFS_OLD: ::c_int = 1; @@ -1440,14 +1428,28 @@ pub const SYNC_FILE_RANGE_WAIT_BEFORE: ::c_uint = 1; pub const SYNC_FILE_RANGE_WRITE: ::c_uint = 2; pub const SYNC_FILE_RANGE_WAIT_AFTER: ::c_uint = 4; -pub const AIO_CANCELED: ::c_int = 0; -pub const AIO_NOTCANCELED: ::c_int = 1; -pub const AIO_ALLDONE: ::c_int = 2; -pub const LIO_READ: ::c_int = 0; -pub const LIO_WRITE: ::c_int = 1; -pub const LIO_NOP: ::c_int = 2; -pub const LIO_WAIT: ::c_int = 0; -pub const LIO_NOWAIT: ::c_int = 1; +cfg_if! { + if #[cfg(not(target_env = "uclibc"))] { + pub const AIO_CANCELED: ::c_int = 0; + pub const AIO_NOTCANCELED: ::c_int = 1; + pub const AIO_ALLDONE: ::c_int = 2; + pub const LIO_READ: ::c_int = 0; + pub const LIO_WRITE: ::c_int = 1; + pub const LIO_NOP: ::c_int = 2; + pub const LIO_WAIT: ::c_int = 0; + pub const LIO_NOWAIT: ::c_int = 1; + pub const RUSAGE_THREAD: ::c_int = 1; + pub const TCP_ULP: ::c_int = 31; + pub const MSG_COPY: ::c_int = 0o40000; + pub const SHM_EXEC: ::c_int = 0o100000; + pub const IPV6_MULTICAST_ALL: ::c_int = 29; + pub const IPV6_ROUTER_ALERT_ISOLATE: ::c_int = 30; + pub const PACKET_MR_UNICAST: ::c_int = 3; + pub const PTRACE_EVENT_STOP: ::c_int = 128; + pub const UDP_SEGMENT: ::c_int = 103; + pub const UDP_GRO: ::c_int = 104; + } +} pub const MREMAP_MAYMOVE: ::c_int = 1; pub const MREMAP_FIXED: ::c_int = 2; @@ -1610,8 +1612,6 @@ pub const SO_ORIGINAL_DST: ::c_int = 80; pub const IP_RECVFRAGSIZE: ::c_int = 25; pub const IPV6_FLOWINFO: ::c_int = 11; -pub const IPV6_MULTICAST_ALL: ::c_int = 29; -pub const IPV6_ROUTER_ALERT_ISOLATE: ::c_int = 30; pub const IPV6_FLOWLABEL_MGR: ::c_int = 32; pub const IPV6_FLOWINFO_SEND: ::c_int = 33; pub const IPV6_RECVFRAGSIZE: ::c_int = 77; @@ -1623,6 +1623,7 @@ pub const IPV6_RTHDR_LOOSE: ::c_int = 0; pub const IPV6_RTHDR_STRICT: ::c_int = 1; pub const IUTF8: ::tcflag_t = 0x00004000; +#[cfg(not(all(target_env = "uclibc", target_arch = "mips")))] pub const CMSPAR: ::tcflag_t = 0o10000000000; pub const MFD_CLOEXEC: ::c_uint = 0x0001; @@ -1941,7 +1942,6 @@ pub const PACKET_DROP_MEMBERSHIP: ::c_int = 2; pub const PACKET_MR_MULTICAST: ::c_int = 0; pub const PACKET_MR_PROMISC: ::c_int = 1; pub const PACKET_MR_ALLMULTI: ::c_int = 2; -pub const PACKET_MR_UNICAST: ::c_int = 3; // linux/netfilter.h pub const NF_DROP: ::c_int = 0; @@ -2062,8 +2062,6 @@ pub const SIOCSRARP: ::c_ulong = 0x00008962; pub const SIOCGIFMAP: ::c_ulong = 0x00008970; pub const SIOCSIFMAP: ::c_ulong = 0x00008971; -pub const PTRACE_EVENT_STOP: ::c_int = 128; - pub const IPTOS_TOS_MASK: u8 = 0x1E; pub const IPTOS_PREC_MASK: u8 = 0xE0; @@ -2366,8 +2364,6 @@ pub const UDP_CORK: ::c_int = 1; pub const UDP_ENCAP: ::c_int = 100; pub const UDP_NO_CHECK6_TX: ::c_int = 101; pub const UDP_NO_CHECK6_RX: ::c_int = 102; -pub const UDP_SEGMENT: ::c_int = 103; -pub const UDP_GRO: ::c_int = 104; // include/uapi/linux/mman.h pub const MAP_SHARED_VALIDATE: ::c_int = 0x3; @@ -2507,10 +2503,6 @@ pub const FAN_MARK_ADD: ::c_uint = 0x0000_0001; pub const FAN_MARK_REMOVE: ::c_uint = 0x0000_0002; pub const FAN_MARK_DONT_FOLLOW: ::c_uint = 0x0000_0004; pub const FAN_MARK_ONLYDIR: ::c_uint = 0x0000_0008; -pub const FAN_MARK_INODE: ::c_uint = 0x0000_0000; -pub const FAN_MARK_MOUNT: ::c_uint = 0x0000_0010; -// NOTE: FAN_MARK_FILESYSTEM requires Linux Kernel >= 4.20.0 -pub const FAN_MARK_FILESYSTEM: ::c_uint = 0x0000_0100; pub const FAN_MARK_IGNORED_MASK: ::c_uint = 0x0000_0020; pub const FAN_MARK_IGNORED_SURV_MODIFY: ::c_uint = 0x0000_0040; pub const FAN_MARK_FLUSH: ::c_uint = 0x0000_0080; @@ -2790,6 +2782,75 @@ f! { } } +cfg_if! { + if #[cfg(not(target_env = "uclibc"))] { + extern "C" { + pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; + pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; + pub fn aio_suspend( + aiocb_list: *const *const aiocb, + nitems: ::c_int, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn lio_listio( + mode: ::c_int, + aiocb_list: *const *mut aiocb, + nitems: ::c_int, + sevp: *mut ::sigevent, + ) -> ::c_int; + pub fn pwritev( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off_t, + ) -> ::ssize_t; + pub fn preadv( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off_t, + ) -> ::ssize_t; + pub fn getnameinfo( + sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + sevlen: ::socklen_t, + flags: ::c_int, + ) -> ::c_int; + pub fn getloadavg( + loadavg: *mut ::c_double, + nelem: ::c_int + ) -> ::c_int; + pub fn process_vm_readv( + pid: ::pid_t, + local_iov: *const ::iovec, + liovcnt: ::c_ulong, + remote_iov: *const ::iovec, + riovcnt: ::c_ulong, + flags: ::c_ulong, + ) -> isize; + pub fn process_vm_writev( + pid: ::pid_t, + local_iov: *const ::iovec, + liovcnt: ::c_ulong, + remote_iov: *const ::iovec, + riovcnt: ::c_ulong, + flags: ::c_ulong, + ) -> isize; + pub fn futimes( + fd: ::c_int, + times: *const ::timeval + ) -> ::c_int; + } + } +} + extern "C" { #[cfg_attr(not(target_env = "musl"), link_name = "__xpg_strerror_r")] pub fn strerror_r( @@ -2804,24 +2865,6 @@ extern "C" { pub fn rand() -> ::c_int; pub fn srand(seed: ::c_uint); - pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; - pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; - pub fn aio_suspend( - aiocb_list: *const *const aiocb, - nitems: ::c_int, - timeout: *const ::timespec, - ) -> ::c_int; - pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; - pub fn lio_listio( - mode: ::c_int, - aiocb_list: *const *mut aiocb, - nitems: ::c_int, - sevp: *mut ::sigevent, - ) -> ::c_int; - pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; pub fn setpwent(); @@ -3020,18 +3063,6 @@ extern "C" { new_value: *const itimerspec, old_value: *mut itimerspec, ) -> ::c_int; - pub fn pwritev( - fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int, - offset: ::off_t, - ) -> ::ssize_t; - pub fn preadv( - fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int, - offset: ::off_t, - ) -> ::ssize_t; pub fn quotactl( cmd: ::c_int, special: *const ::c_char, @@ -3101,36 +3132,10 @@ extern "C" { len: *mut ::socklen_t, flg: ::c_int, ) -> ::c_int; - pub fn getnameinfo( - sa: *const ::sockaddr, - salen: ::socklen_t, - host: *mut ::c_char, - hostlen: ::socklen_t, - serv: *mut ::c_char, - sevlen: ::socklen_t, - flags: ::c_int, - ) -> ::c_int; pub fn pthread_setschedprio( native: ::pthread_t, priority: ::c_int, ) -> ::c_int; - pub fn getloadavg(loadavg: *mut ::c_double, nelem: ::c_int) -> ::c_int; - pub fn process_vm_readv( - pid: ::pid_t, - local_iov: *const ::iovec, - liovcnt: ::c_ulong, - remote_iov: *const ::iovec, - riovcnt: ::c_ulong, - flags: ::c_ulong, - ) -> isize; - pub fn process_vm_writev( - pid: ::pid_t, - local_iov: *const ::iovec, - liovcnt: ::c_ulong, - remote_iov: *const ::iovec, - riovcnt: ::c_ulong, - flags: ::c_ulong, - ) -> isize; pub fn reboot(how_to: ::c_int) -> ::c_int; pub fn setfsgid(gid: ::gid_t) -> ::c_int; pub fn setfsuid(uid: ::uid_t) -> ::c_int; @@ -3205,7 +3210,7 @@ extern "C" { addrlen: *mut ::socklen_t, ) -> ::ssize_t; pub fn mkstemps(template: *mut ::c_char, suffixlen: ::c_int) -> ::c_int; - pub fn futimes(fd: ::c_int, times: *const ::timeval) -> ::c_int; + pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; pub fn getdomainname(name: *mut ::c_char, len: ::size_t) -> ::c_int; @@ -3576,10 +3581,28 @@ extern "C" { ) -> ::size_t; pub fn regfree(preg: *mut ::regex_t); + + pub fn iconv_open( + tocode: *const ::c_char, + fromcode: *const ::c_char, + ) -> iconv_t; + pub fn iconv( + cd: iconv_t, + inbuf: *mut *mut ::c_char, + inbytesleft: *mut ::size_t, + outbuf: *mut *mut ::c_char, + outbytesleft: *mut ::size_t, + ) -> ::size_t; + pub fn iconv_close(cd: iconv_t) -> ::c_int; + + pub fn gettid() -> ::pid_t; } cfg_if! { - if #[cfg(target_env = "musl")] { + if #[cfg(target_env = "uclibc")] { + mod uclibc; + pub use self::uclibc::*; + } else if #[cfg(target_env = "musl")] { mod musl; pub use self::musl::*; } else if #[cfg(target_env = "gnu")] { 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 06d09ea1b3..21ddc9c0e5 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 @@ -639,37 +639,37 @@ pub const F_OFD_GETLK: ::c_int = 36; pub const F_OFD_SETLK: ::c_int = 37; pub const F_OFD_SETLKW: ::c_int = 38; -pub const TCGETS: ::c_ulong = 0x540d; -pub const TCSETS: ::c_ulong = 0x540e; -pub const TCSETSW: ::c_ulong = 0x540f; -pub const TCSETSF: ::c_ulong = 0x5410; -pub const TCGETA: ::c_ulong = 0x5401; -pub const TCSETA: ::c_ulong = 0x5402; -pub const TCSETAW: ::c_ulong = 0x5403; -pub const TCSETAF: ::c_ulong = 0x5404; -pub const TCSBRK: ::c_ulong = 0x5405; -pub const TCXONC: ::c_ulong = 0x5406; -pub const TCFLSH: ::c_ulong = 0x5407; -pub const TIOCGSOFTCAR: ::c_ulong = 0x5481; -pub const TIOCSSOFTCAR: ::c_ulong = 0x5482; -pub const TIOCINQ: ::c_ulong = 0x467f; -pub const TIOCLINUX: ::c_ulong = 0x5483; -pub const TIOCGSERIAL: ::c_ulong = 0x5484; -pub const TIOCEXCL: ::c_ulong = 0x740d; -pub const TIOCNXCL: ::c_ulong = 0x740e; -pub const TIOCSCTTY: ::c_ulong = 0x5480; -pub const TIOCGPGRP: ::c_ulong = 0x40047477; -pub const TIOCSPGRP: ::c_ulong = 0x80047476; -pub const TIOCOUTQ: ::c_ulong = 0x7472; -pub const TIOCSTI: ::c_ulong = 0x5472; -pub const TIOCGWINSZ: ::c_ulong = 0x40087468; -pub const TIOCSWINSZ: ::c_ulong = 0x80087467; -pub const TIOCMGET: ::c_ulong = 0x741d; -pub const TIOCMBIS: ::c_ulong = 0x741b; -pub const TIOCMBIC: ::c_ulong = 0x741c; -pub const TIOCMSET: ::c_ulong = 0x741a; -pub const FIONREAD: ::c_ulong = 0x467f; -pub const TIOCCONS: ::c_ulong = 0x80047478; +pub const TCGETS: ::c_int = 0x540d; +pub const TCSETS: ::c_int = 0x540e; +pub const TCSETSW: ::c_int = 0x540f; +pub const TCSETSF: ::c_int = 0x5410; +pub const TCGETA: ::c_int = 0x5401; +pub const TCSETA: ::c_int = 0x5402; +pub const TCSETAW: ::c_int = 0x5403; +pub const TCSETAF: ::c_int = 0x5404; +pub const TCSBRK: ::c_int = 0x5405; +pub const TCXONC: ::c_int = 0x5406; +pub const TCFLSH: ::c_int = 0x5407; +pub const TIOCGSOFTCAR: ::c_int = 0x5481; +pub const TIOCSSOFTCAR: ::c_int = 0x5482; +pub const TIOCINQ: ::c_int = 0x467f; +pub const TIOCLINUX: ::c_int = 0x5483; +pub const TIOCGSERIAL: ::c_int = 0x5484; +pub const TIOCEXCL: ::c_int = 0x740d; +pub const TIOCNXCL: ::c_int = 0x740e; +pub const TIOCSCTTY: ::c_int = 0x5480; +pub const TIOCGPGRP: ::c_int = 0x40047477; +pub const TIOCSPGRP: ::c_int = 0x80047476_u32 as i32; +pub const TIOCOUTQ: ::c_int = 0x7472; +pub const TIOCSTI: ::c_int = 0x5472; +pub const TIOCGWINSZ: ::c_int = 0x40087468; +pub const TIOCSWINSZ: ::c_int = 0x80087467_u32 as i32; +pub const TIOCMGET: ::c_int = 0x741d; +pub const TIOCMBIS: ::c_int = 0x741b; +pub const TIOCMBIC: ::c_int = 0x741c; +pub const TIOCMSET: ::c_int = 0x741a; +pub const FIONREAD: ::c_int = 0x467f; +pub const TIOCCONS: ::c_int = 0x80047478_u32 as i32; pub const MCL_CURRENT: ::c_int = 0x0001; pub const MCL_FUTURE: ::c_int = 0x0002; diff --git a/vendor/libc/src/unix/linux_like/linux/musl/b64/mod.rs b/vendor/libc/src/unix/linux_like/linux/musl/b64/mod.rs index 62abee00d8..b3c79b06a9 100644 --- a/vendor/libc/src/unix/linux_like/linux/musl/b64/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/musl/b64/mod.rs @@ -161,6 +161,9 @@ cfg_if! { } else if #[cfg(any(target_arch = "powerpc64"))] { mod powerpc64; pub use self::powerpc64::*; + } else if #[cfg(any(target_arch = "s390x"))] { + mod s390x; + pub use self::s390x::*; } else if #[cfg(any(target_arch = "x86_64"))] { mod x86_64; pub use self::x86_64::*; diff --git a/vendor/libc/src/unix/linux_like/linux/musl/b64/s390x.rs b/vendor/libc/src/unix/linux_like/linux/musl/b64/s390x.rs new file mode 100644 index 0000000000..c81517689d --- /dev/null +++ b/vendor/libc/src/unix/linux_like/linux/musl/b64/s390x.rs @@ -0,0 +1,763 @@ +pub type blksize_t = i64; +pub type c_char = u8; +pub type nlink_t = u64; +pub type wchar_t = i32; +pub type greg_t = u64; +pub type __u64 = u64; + +s! { + pub struct ipc_perm { + pub __ipc_perm_key: ::key_t, + pub uid: ::uid_t, + pub gid: ::gid_t, + pub cuid: ::uid_t, + pub cgid: ::gid_t, + pub mode: ::mode_t, + pub __seq: ::c_int, + __pad1: ::c_long, + __pad2: ::c_long, + } + + pub struct stat { + pub st_dev: ::dev_t, + pub st_ino: ::ino_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_size: ::off_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 st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt_t, + __unused: [::c_long; 3], + } + + pub struct stat64 { + pub st_dev: ::dev_t, + pub st_ino: ::ino64_t, + pub st_nlink: ::nlink_t, + pub st_mode: ::mode_t, + pub st_uid: ::uid_t, + pub st_gid: ::gid_t, + pub st_rdev: ::dev_t, + pub st_size: ::off_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 st_blksize: ::blksize_t, + pub st_blocks: ::blkcnt64_t, + __unused: [::c_long; 3], + } + + pub struct statfs { + pub f_type: ::c_ulong, + pub f_bsize: ::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_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } + + pub struct statfs64 { + pub f_type: ::c_ulong, + pub f_bsize: ::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_fsid: ::fsid_t, + pub f_namelen: ::c_ulong, + pub f_frsize: ::c_ulong, + pub f_flags: ::c_ulong, + pub f_spare: [::c_ulong; 4], + } +} + +s_no_extra_traits! { + // FIXME: This is actually a union. + pub struct fpreg_t { + pub d: ::c_double, + // f: ::c_float, + } +} + +cfg_if! { + if #[cfg(feature = "extra_traits")] { + impl PartialEq for fpreg_t { + fn eq(&self, other: &fpreg_t) -> bool { + self.d == other.d + } + } + + impl Eq for fpreg_t {} + + impl ::fmt::Debug for fpreg_t { + fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { + f.debug_struct("fpreg_t") + .field("d", &self.d) + .finish() + } + } + + impl ::hash::Hash for fpreg_t { + fn hash(&self, state: &mut H) { + let d: u64 = unsafe { ::mem::transmute(self.d) }; + d.hash(state); + } + } + } +} + +pub const VEOF: usize = 4; +pub const RTLD_DEEPBIND: ::c_int = 0x8; + +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 EADDRINUSE: ::c_int = 98; +pub const EADDRNOTAVAIL: ::c_int = 99; +pub const ECONNABORTED: ::c_int = 103; +pub const ECONNREFUSED: ::c_int = 111; +pub const ECONNRESET: ::c_int = 104; +pub const EDEADLK: ::c_int = 35; +pub const ENOSYS: ::c_int = 38; +pub const ENOTCONN: ::c_int = 107; +pub const ETIMEDOUT: ::c_int = 110; +pub const FIOCLEX: ::c_ulong = 0x5451; +pub const FIONCLEX: ::c_ulong = 0x5450; +pub const FIONBIO: ::c_ulong = 0x5421; +pub const O_APPEND: ::c_int = 1024; +pub const O_CREAT: ::c_int = 64; +pub const O_EXCL: ::c_int = 128; +pub const O_NONBLOCK: ::c_int = 2048; +pub const SA_NOCLDWAIT: ::c_int = 2; +pub const SA_ONSTACK: ::c_int = 0x08000000; +pub const SA_SIGINFO: ::c_int = 4; +pub const SIGBUS: ::c_int = 7; +pub const SIGSTKSZ: ::size_t = 0x2000; +pub const MINSIGSTKSZ: ::size_t = 2048; +pub const SIG_SETMASK: ::c_int = 2; +pub const SOL_SOCKET: ::c_int = 1; +pub const SO_BROADCAST: ::c_int = 6; +pub const SO_ERROR: ::c_int = 4; +pub const SO_RCVTIMEO: ::c_int = 20; +pub const SO_REUSEADDR: ::c_int = 2; +pub const SO_SNDTIMEO: ::c_int = 21; +pub const SO_PROTOCOL: ::c_int = 38; +pub const SO_DOMAIN: ::c_int = 39; + +pub const SOCK_STREAM: ::c_int = 1; +pub const SOCK_DGRAM: ::c_int = 2; + +pub const O_NOCTTY: ::c_int = 256; +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 = 0x101000; +pub const O_DIRECT: ::c_int = 0x4000; +pub const O_DIRECTORY: ::c_int = 0x10000; +pub const O_NOFOLLOW: ::c_int = 0x20000; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; +pub const MAP_GROWSDOWN: ::c_int = 0x0100; +pub const MAP_LOCKED: ::c_int = 0x02000; +pub const MAP_NORESERVE: ::c_int = 0x04000; +pub const MAP_ANON: ::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 EDEADLOCK: ::c_int = 35; +pub const ENAMETOOLONG: ::c_int = 36; +pub const ENOLCK: ::c_int = 37; +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 ENETDOWN: ::c_int = 100; +pub const ENETUNREACH: ::c_int = 101; +pub const ENETRESET: ::c_int = 102; +pub const ENOBUFS: ::c_int = 105; +pub const EISCONN: ::c_int = 106; +pub const ESHUTDOWN: ::c_int = 108; +pub const ETOOMANYREFS: ::c_int = 109; +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 SO_TYPE: ::c_int = 3; +pub const SO_DONTROUTE: ::c_int = 5; +pub const SO_SNDBUF: ::c_int = 7; +pub const SO_RCVBUF: ::c_int = 8; +pub const SO_KEEPALIVE: ::c_int = 9; +pub const SO_OOBINLINE: ::c_int = 10; +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_ACCEPTCONN: ::c_int = 30; +pub const SO_SNDBUFFORCE: ::c_int = 32; +pub const SO_RCVBUFFORCE: ::c_int = 33; + +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 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_BLOCK: ::c_int = 0x000000; +pub const SIG_UNBLOCK: ::c_int = 0x01; + +pub const O_ASYNC: ::c_int = 0x2000; + +pub const VEOL: usize = 11; +pub const VEOL2: usize = 16; +pub const VMIN: usize = 6; +pub const IEXTEN: ::tcflag_t = 0x00008000; +pub const TOSTOP: ::tcflag_t = 0x00000100; +pub const FLUSHO: ::tcflag_t = 0x00001000; + +pub const EXTPROC: ::tcflag_t = 0x00010000; + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +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_OFD_GETLK: ::c_int = 36; +pub const F_OFD_SETLK: ::c_int = 37; +pub const F_OFD_SETLKW: ::c_int = 38; + +pub const TCGETS: ::c_int = 0x5401; +pub const TCSETS: ::c_int = 0x5402; +pub const TCSETSW: ::c_int = 0x5403; +pub const TCSETSF: ::c_int = 0x5404; +pub const TCGETA: ::c_int = 0x5405; +pub const TCSETA: ::c_int = 0x5406; +pub const TCSETAW: ::c_int = 0x5407; +pub const TCSETAF: ::c_int = 0x5408; +pub const TCSBRK: ::c_int = 0x5409; +pub const TCXONC: ::c_int = 0x540A; +pub const TCFLSH: ::c_int = 0x540B; +pub const TIOCGSOFTCAR: ::c_int = 0x5419; +pub const TIOCSSOFTCAR: ::c_int = 0x541A; +pub const TIOCINQ: ::c_int = 0x541B; +pub const TIOCEXCL: ::c_int = 0x540C; +pub const TIOCNXCL: ::c_int = 0x540D; +pub const TIOCSCTTY: ::c_int = 0x540E; +pub const TIOCGPGRP: ::c_int = 0x540F; +pub const TIOCSPGRP: ::c_int = 0x5410; +pub const TIOCOUTQ: ::c_int = 0x5411; +pub const TIOCSTI: ::c_int = 0x5412; +pub const TIOCGWINSZ: ::c_int = 0x5413; +pub const TIOCSWINSZ: ::c_int = 0x5414; +pub const TIOCMGET: ::c_int = 0x5415; +pub const TIOCMBIS: ::c_int = 0x5416; +pub const TIOCMBIC: ::c_int = 0x5417; +pub const TIOCMSET: ::c_int = 0x5418; +pub const FIONREAD: ::c_int = 0x541B; +pub const TIOCCONS: ::c_int = 0x541D; + +pub const TIOCLINUX: ::c_int = 0x541C; +pub const TIOCGSERIAL: ::c_int = 0x541E; +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 VTIME: usize = 5; +pub const VSWTC: usize = 7; +pub const VSTART: usize = 8; +pub const VSTOP: usize = 9; +pub const VSUSP: usize = 10; +pub const VREPRINT: usize = 12; +pub const VDISCARD: usize = 13; +pub const VWERASE: usize = 14; +pub const OLCUC: ::tcflag_t = 0o000002; +pub const ONLCR: ::tcflag_t = 0o000004; +pub const NLDLY: ::tcflag_t = 0o000400; +pub const CRDLY: ::tcflag_t = 0o003000; +pub const CR1: ::tcflag_t = 0x00000200; +pub const CR2: ::tcflag_t = 0x00000400; +pub const CR3: ::tcflag_t = 0x00000600; +pub const TABDLY: ::tcflag_t = 0o014000; +pub const TAB1: ::tcflag_t = 0x00000800; +pub const TAB2: ::tcflag_t = 0x00001000; +pub const TAB3: ::tcflag_t = 0x00001800; +pub const BSDLY: ::tcflag_t = 0o020000; +pub const BS1: ::tcflag_t = 0x00002000; +pub const FFDLY: ::tcflag_t = 0o100000; +pub const FF1: ::tcflag_t = 0x00008000; +pub const VTDLY: ::tcflag_t = 0o040000; +pub const VT1: ::tcflag_t = 0x00004000; +pub const XTABS: ::tcflag_t = 0o014000; + +pub const CBAUD: ::speed_t = 0o010017; +pub const CSIZE: ::tcflag_t = 0o000060; +pub const CS6: ::tcflag_t = 0o000020; +pub const CS7: ::tcflag_t = 0o000040; +pub const CS8: ::tcflag_t = 0o000060; +pub const CSTOPB: ::tcflag_t = 0o000100; +pub const CREAD: ::tcflag_t = 0o000200; +pub const PARENB: ::tcflag_t = 0o000400; +pub const PARODD: ::tcflag_t = 0o001000; +pub const HUPCL: ::tcflag_t = 0o002000; +pub const CLOCAL: ::tcflag_t = 0o004000; +pub const CBAUDEX: ::tcflag_t = 0o010000; +pub const BOTHER: ::speed_t = 0o010000; +pub const B57600: ::speed_t = 0o010001; +pub const B115200: ::speed_t = 0o010002; +pub const B230400: ::speed_t = 0o010003; +pub const B460800: ::speed_t = 0o010004; +pub const B500000: ::speed_t = 0o010005; +pub const B576000: ::speed_t = 0o010006; +pub const B921600: ::speed_t = 0o010007; +pub const B1000000: ::speed_t = 0o010010; +pub const B1152000: ::speed_t = 0o010011; +pub const B1500000: ::speed_t = 0o010012; +pub const B2000000: ::speed_t = 0o010013; +pub const B2500000: ::speed_t = 0o010014; +pub const B3000000: ::speed_t = 0o010015; +pub const B3500000: ::speed_t = 0o010016; +pub const B4000000: ::speed_t = 0o010017; +pub const CIBAUD: ::tcflag_t = 0o02003600000; + +pub const ISIG: ::tcflag_t = 0o000001; +pub const ICANON: ::tcflag_t = 0o000002; +pub const XCASE: ::tcflag_t = 0o000004; +pub const ECHOE: ::tcflag_t = 0o000020; +pub const ECHOK: ::tcflag_t = 0o000040; +pub const ECHONL: ::tcflag_t = 0o000100; +pub const NOFLSH: ::tcflag_t = 0o000200; +pub const ECHOCTL: ::tcflag_t = 0o001000; +pub const ECHOPRT: ::tcflag_t = 0o002000; +pub const ECHOKE: ::tcflag_t = 0o004000; +pub const PENDIN: ::tcflag_t = 0o040000; + +pub const POLLWRNORM: ::c_short = 0x100; +pub const POLLWRBAND: ::c_short = 0x200; + +pub const IXON: ::tcflag_t = 0o002000; +pub const IXOFF: ::tcflag_t = 0o010000; + +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_restart_syscall: ::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_execve: ::c_long = 11; +pub const SYS_chdir: ::c_long = 12; +pub const SYS_mknod: ::c_long = 14; +pub const SYS_chmod: ::c_long = 15; +pub const SYS_lseek: ::c_long = 19; +pub const SYS_getpid: ::c_long = 20; +pub const SYS_mount: ::c_long = 21; +pub const SYS_umount: ::c_long = 22; +pub const SYS_ptrace: ::c_long = 26; +pub const SYS_alarm: ::c_long = 27; +pub const SYS_pause: ::c_long = 29; +pub const SYS_utime: ::c_long = 30; +pub const SYS_access: ::c_long = 33; +pub const SYS_nice: ::c_long = 34; +pub const SYS_sync: ::c_long = 36; +pub const SYS_kill: ::c_long = 37; +pub const SYS_rename: ::c_long = 38; +pub const SYS_mkdir: ::c_long = 39; +pub const SYS_rmdir: ::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_brk: ::c_long = 45; +pub const SYS_signal: ::c_long = 48; +pub const SYS_acct: ::c_long = 51; +pub const SYS_umount2: ::c_long = 52; +pub const SYS_ioctl: ::c_long = 54; +pub const SYS_fcntl: ::c_long = 55; +pub const SYS_setpgid: ::c_long = 57; +pub const SYS_umask: ::c_long = 60; +pub const SYS_chroot: ::c_long = 61; +pub const SYS_ustat: ::c_long = 62; +pub const SYS_dup2: ::c_long = 63; +pub const SYS_getppid: ::c_long = 64; +pub const SYS_getpgrp: ::c_long = 65; +pub const SYS_setsid: ::c_long = 66; +pub const SYS_sigaction: ::c_long = 67; +pub const SYS_sigsuspend: ::c_long = 72; +pub const SYS_sigpending: ::c_long = 73; +pub const SYS_sethostname: ::c_long = 74; +pub const SYS_setrlimit: ::c_long = 75; +pub const SYS_getrusage: ::c_long = 77; +pub const SYS_gettimeofday: ::c_long = 78; +pub const SYS_settimeofday: ::c_long = 79; +pub const SYS_symlink: ::c_long = 83; +pub const SYS_readlink: ::c_long = 85; +pub const SYS_uselib: ::c_long = 86; +pub const SYS_swapon: ::c_long = 87; +pub const SYS_reboot: ::c_long = 88; +pub const SYS_readdir: ::c_long = 89; +pub const SYS_mmap: ::c_long = 90; +pub const SYS_munmap: ::c_long = 91; +pub const SYS_truncate: ::c_long = 92; +pub const SYS_ftruncate: ::c_long = 93; +pub const SYS_fchmod: ::c_long = 94; +pub const SYS_getpriority: ::c_long = 96; +pub const SYS_setpriority: ::c_long = 97; +pub const SYS_statfs: ::c_long = 99; +pub const SYS_fstatfs: ::c_long = 100; +pub const SYS_socketcall: ::c_long = 102; +pub const SYS_syslog: ::c_long = 103; +pub const SYS_setitimer: ::c_long = 104; +pub const SYS_getitimer: ::c_long = 105; +pub const SYS_stat: ::c_long = 106; +pub const SYS_lstat: ::c_long = 107; +pub const SYS_fstat: ::c_long = 108; +pub const SYS_lookup_dcookie: ::c_long = 110; +pub const SYS_vhangup: ::c_long = 111; +pub const SYS_idle: ::c_long = 112; +pub const SYS_wait4: ::c_long = 114; +pub const SYS_swapoff: ::c_long = 115; +pub const SYS_sysinfo: ::c_long = 116; +pub const SYS_ipc: ::c_long = 117; +pub const SYS_fsync: ::c_long = 118; +pub const SYS_sigreturn: ::c_long = 119; +pub const SYS_clone: ::c_long = 120; +pub const SYS_setdomainname: ::c_long = 121; +pub const SYS_uname: ::c_long = 122; +pub const SYS_adjtimex: ::c_long = 124; +pub const SYS_mprotect: ::c_long = 125; +pub const SYS_sigprocmask: ::c_long = 126; +pub const SYS_create_module: ::c_long = 127; +pub const SYS_init_module: ::c_long = 128; +pub const SYS_delete_module: ::c_long = 129; +pub const SYS_get_kernel_syms: ::c_long = 130; +pub const SYS_quotactl: ::c_long = 131; +pub const SYS_getpgid: ::c_long = 132; +pub const SYS_fchdir: ::c_long = 133; +pub const SYS_bdflush: ::c_long = 134; +pub const SYS_sysfs: ::c_long = 135; +pub const SYS_personality: ::c_long = 136; +pub const SYS_afs_syscall: ::c_long = 137; /* Syscall for Andrew File System */ +pub const SYS_getdents: ::c_long = 141; +pub const SYS_flock: ::c_long = 143; +pub const SYS_msync: ::c_long = 144; +pub const SYS_readv: ::c_long = 145; +pub const SYS_writev: ::c_long = 146; +pub const SYS_getsid: ::c_long = 147; +pub const SYS_fdatasync: ::c_long = 148; +pub const SYS__sysctl: ::c_long = 149; +pub const SYS_mlock: ::c_long = 150; +pub const SYS_munlock: ::c_long = 151; +pub const SYS_mlockall: ::c_long = 152; +pub const SYS_munlockall: ::c_long = 153; +pub const SYS_sched_setparam: ::c_long = 154; +pub const SYS_sched_getparam: ::c_long = 155; +pub const SYS_sched_setscheduler: ::c_long = 156; +pub const SYS_sched_getscheduler: ::c_long = 157; +pub const SYS_sched_yield: ::c_long = 158; +pub const SYS_sched_get_priority_max: ::c_long = 159; +pub const SYS_sched_get_priority_min: ::c_long = 160; +pub const SYS_sched_rr_get_interval: ::c_long = 161; +pub const SYS_nanosleep: ::c_long = 162; +pub const SYS_mremap: ::c_long = 163; +pub const SYS_query_module: ::c_long = 167; +pub const SYS_poll: ::c_long = 168; +pub const SYS_nfsservctl: ::c_long = 169; +pub const SYS_prctl: ::c_long = 172; +pub const SYS_rt_sigreturn: ::c_long = 173; +pub const SYS_rt_sigaction: ::c_long = 174; +pub const SYS_rt_sigprocmask: ::c_long = 175; +pub const SYS_rt_sigpending: ::c_long = 176; +pub const SYS_rt_sigtimedwait: ::c_long = 177; +pub const SYS_rt_sigqueueinfo: ::c_long = 178; +pub const SYS_rt_sigsuspend: ::c_long = 179; +pub const SYS_pread64: ::c_long = 180; +pub const SYS_pwrite64: ::c_long = 181; +pub const SYS_getcwd: ::c_long = 183; +pub const SYS_capget: ::c_long = 184; +pub const SYS_capset: ::c_long = 185; +pub const SYS_sigaltstack: ::c_long = 186; +pub const SYS_sendfile: ::c_long = 187; +pub const SYS_getpmsg: ::c_long = 188; +pub const SYS_putpmsg: ::c_long = 189; +pub const SYS_vfork: ::c_long = 190; +pub const SYS_pivot_root: ::c_long = 217; +pub const SYS_mincore: ::c_long = 218; +pub const SYS_madvise: ::c_long = 219; +pub const SYS_getdents64: ::c_long = 220; +pub const SYS_readahead: ::c_long = 222; +pub const SYS_setxattr: ::c_long = 224; +pub const SYS_lsetxattr: ::c_long = 225; +pub const SYS_fsetxattr: ::c_long = 226; +pub const SYS_getxattr: ::c_long = 227; +pub const SYS_lgetxattr: ::c_long = 228; +pub const SYS_fgetxattr: ::c_long = 229; +pub const SYS_listxattr: ::c_long = 230; +pub const SYS_llistxattr: ::c_long = 231; +pub const SYS_flistxattr: ::c_long = 232; +pub const SYS_removexattr: ::c_long = 233; +pub const SYS_lremovexattr: ::c_long = 234; +pub const SYS_fremovexattr: ::c_long = 235; +pub const SYS_gettid: ::c_long = 236; +pub const SYS_tkill: ::c_long = 237; +pub const SYS_futex: ::c_long = 238; +pub const SYS_sched_setaffinity: ::c_long = 239; +pub const SYS_sched_getaffinity: ::c_long = 240; +pub const SYS_tgkill: ::c_long = 241; +pub const SYS_io_setup: ::c_long = 243; +pub const SYS_io_destroy: ::c_long = 244; +pub const SYS_io_getevents: ::c_long = 245; +pub const SYS_io_submit: ::c_long = 246; +pub const SYS_io_cancel: ::c_long = 247; +pub const SYS_exit_group: ::c_long = 248; +pub const SYS_epoll_create: ::c_long = 249; +pub const SYS_epoll_ctl: ::c_long = 250; +pub const SYS_epoll_wait: ::c_long = 251; +pub const SYS_set_tid_address: ::c_long = 252; +pub const SYS_fadvise64: ::c_long = 253; +pub const SYS_timer_create: ::c_long = 254; +pub const SYS_timer_settime: ::c_long = 255; +pub const SYS_timer_gettime: ::c_long = 256; +pub const SYS_timer_getoverrun: ::c_long = 257; +pub const SYS_timer_delete: ::c_long = 258; +pub const SYS_clock_settime: ::c_long = 259; +pub const SYS_clock_gettime: ::c_long = 260; +pub const SYS_clock_getres: ::c_long = 261; +pub const SYS_clock_nanosleep: ::c_long = 262; +pub const SYS_statfs64: ::c_long = 265; +pub const SYS_fstatfs64: ::c_long = 266; +pub const SYS_remap_file_pages: ::c_long = 267; +pub const SYS_mbind: ::c_long = 268; +pub const SYS_get_mempolicy: ::c_long = 269; +pub const SYS_set_mempolicy: ::c_long = 270; +pub const SYS_mq_open: ::c_long = 271; +pub const SYS_mq_unlink: ::c_long = 272; +pub const SYS_mq_timedsend: ::c_long = 273; +pub const SYS_mq_timedreceive: ::c_long = 274; +pub const SYS_mq_notify: ::c_long = 275; +pub const SYS_mq_getsetattr: ::c_long = 276; +pub const SYS_kexec_load: ::c_long = 277; +pub const SYS_add_key: ::c_long = 278; +pub const SYS_request_key: ::c_long = 279; +pub const SYS_keyctl: ::c_long = 280; +pub const SYS_waitid: ::c_long = 281; +pub const SYS_ioprio_set: ::c_long = 282; +pub const SYS_ioprio_get: ::c_long = 283; +pub const SYS_inotify_init: ::c_long = 284; +pub const SYS_inotify_add_watch: ::c_long = 285; +pub const SYS_inotify_rm_watch: ::c_long = 286; +pub const SYS_migrate_pages: ::c_long = 287; +pub const SYS_openat: ::c_long = 288; +pub const SYS_mkdirat: ::c_long = 289; +pub const SYS_mknodat: ::c_long = 290; +pub const SYS_fchownat: ::c_long = 291; +pub const SYS_futimesat: ::c_long = 292; +pub const SYS_unlinkat: ::c_long = 294; +pub const SYS_renameat: ::c_long = 295; +pub const SYS_linkat: ::c_long = 296; +pub const SYS_symlinkat: ::c_long = 297; +pub const SYS_readlinkat: ::c_long = 298; +pub const SYS_fchmodat: ::c_long = 299; +pub const SYS_faccessat: ::c_long = 300; +pub const SYS_pselect6: ::c_long = 301; +pub const SYS_ppoll: ::c_long = 302; +pub const SYS_unshare: ::c_long = 303; +pub const SYS_set_robust_list: ::c_long = 304; +pub const SYS_get_robust_list: ::c_long = 305; +pub const SYS_splice: ::c_long = 306; +pub const SYS_sync_file_range: ::c_long = 307; +pub const SYS_tee: ::c_long = 308; +pub const SYS_vmsplice: ::c_long = 309; +pub const SYS_move_pages: ::c_long = 310; +pub const SYS_getcpu: ::c_long = 311; +pub const SYS_epoll_pwait: ::c_long = 312; +pub const SYS_utimes: ::c_long = 313; +pub const SYS_fallocate: ::c_long = 314; +pub const SYS_utimensat: ::c_long = 315; +pub const SYS_signalfd: ::c_long = 316; +pub const SYS_timerfd: ::c_long = 317; +pub const SYS_eventfd: ::c_long = 318; +pub const SYS_timerfd_create: ::c_long = 319; +pub const SYS_timerfd_settime: ::c_long = 320; +pub const SYS_timerfd_gettime: ::c_long = 321; +pub const SYS_signalfd4: ::c_long = 322; +pub const SYS_eventfd2: ::c_long = 323; +pub const SYS_inotify_init1: ::c_long = 324; +pub const SYS_pipe2: ::c_long = 325; +pub const SYS_dup3: ::c_long = 326; +pub const SYS_epoll_create1: ::c_long = 327; +pub const SYS_preadv: ::c_long = 328; +pub const SYS_pwritev: ::c_long = 329; +pub const SYS_rt_tgsigqueueinfo: ::c_long = 330; +pub const SYS_perf_event_open: ::c_long = 331; +pub const SYS_fanotify_init: ::c_long = 332; +pub const SYS_fanotify_mark: ::c_long = 333; +pub const SYS_prlimit64: ::c_long = 334; +pub const SYS_name_to_handle_at: ::c_long = 335; +pub const SYS_open_by_handle_at: ::c_long = 336; +pub const SYS_clock_adjtime: ::c_long = 337; +pub const SYS_syncfs: ::c_long = 338; +pub const SYS_setns: ::c_long = 339; +pub const SYS_process_vm_readv: ::c_long = 340; +pub const SYS_process_vm_writev: ::c_long = 341; +pub const SYS_s390_runtime_instr: ::c_long = 342; +pub const SYS_kcmp: ::c_long = 343; +pub const SYS_finit_module: ::c_long = 344; +pub const SYS_sched_setattr: ::c_long = 345; +pub const SYS_sched_getattr: ::c_long = 346; +pub const SYS_renameat2: ::c_long = 347; +pub const SYS_seccomp: ::c_long = 348; +pub const SYS_getrandom: ::c_long = 349; +pub const SYS_memfd_create: ::c_long = 350; +pub const SYS_bpf: ::c_long = 351; +pub const SYS_s390_pci_mmio_write: ::c_long = 352; +pub const SYS_s390_pci_mmio_read: ::c_long = 353; +pub const SYS_execveat: ::c_long = 354; +pub const SYS_userfaultfd: ::c_long = 355; +pub const SYS_membarrier: ::c_long = 356; +pub const SYS_recvmmsg: ::c_long = 357; +pub const SYS_sendmmsg: ::c_long = 358; +pub const SYS_socket: ::c_long = 359; +pub const SYS_socketpair: ::c_long = 360; +pub const SYS_bind: ::c_long = 361; +pub const SYS_connect: ::c_long = 362; +pub const SYS_listen: ::c_long = 363; +pub const SYS_accept4: ::c_long = 364; +pub const SYS_getsockopt: ::c_long = 365; +pub const SYS_setsockopt: ::c_long = 366; +pub const SYS_getsockname: ::c_long = 367; +pub const SYS_getpeername: ::c_long = 368; +pub const SYS_sendto: ::c_long = 369; +pub const SYS_sendmsg: ::c_long = 370; +pub const SYS_recvfrom: ::c_long = 371; +pub const SYS_recvmsg: ::c_long = 372; +pub const SYS_shutdown: ::c_long = 373; +pub const SYS_mlock2: ::c_long = 374; +pub const SYS_copy_file_range: ::c_long = 375; +pub const SYS_preadv2: ::c_long = 376; +pub const SYS_pwritev2: ::c_long = 377; +pub const SYS_lchown: ::c_long = 198; +pub const SYS_setuid: ::c_long = 213; +pub const SYS_getuid: ::c_long = 199; +pub const SYS_setgid: ::c_long = 214; +pub const SYS_getgid: ::c_long = 200; +pub const SYS_geteuid: ::c_long = 201; +pub const SYS_setreuid: ::c_long = 203; +pub const SYS_setregid: ::c_long = 204; +pub const SYS_getrlimit: ::c_long = 191; +pub const SYS_getgroups: ::c_long = 205; +pub const SYS_fchown: ::c_long = 207; +pub const SYS_setresuid: ::c_long = 208; +pub const SYS_setresgid: ::c_long = 210; +pub const SYS_getresgid: ::c_long = 211; +pub const SYS_select: ::c_long = 142; +pub const SYS_getegid: ::c_long = 202; +pub const SYS_setgroups: ::c_long = 206; +pub const SYS_getresuid: ::c_long = 209; +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; +pub const SYS_pidfd_open: ::c_long = 434; +pub const SYS_clone3: ::c_long = 435; 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 ca2322d7cc..44f7680e08 100644 --- a/vendor/libc/src/unix/linux_like/linux/musl/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/musl/mod.rs @@ -236,6 +236,19 @@ s! { pub e_termination: ::c_short, pub e_exit: ::c_short, } + + pub struct Elf64_Chdr { + pub ch_type: ::Elf64_Word, + pub ch_reserved: ::Elf64_Word, + pub ch_size: ::Elf64_Xword, + pub ch_addralign: ::Elf64_Xword, + } + + pub struct Elf32_Chdr { + pub ch_type: ::Elf32_Word, + pub ch_size: ::Elf32_Word, + pub ch_addralign: ::Elf32_Word, + } } s_no_extra_traits! { @@ -484,6 +497,7 @@ pub const EFD_CLOEXEC: ::c_int = 0x80000; pub const BUFSIZ: ::c_uint = 1024; pub const TMP_MAX: ::c_uint = 10000; pub const FOPEN_MAX: ::c_uint = 1000; +pub const FILENAME_MAX: ::c_uint = 4096; pub const O_PATH: ::c_int = 0o10000000; pub const O_EXEC: ::c_int = 0o10000000; pub const O_SEARCH: ::c_int = 0o10000000; @@ -491,8 +505,6 @@ pub const O_ACCMODE: ::c_int = 0o10000003; pub const O_NDELAY: ::c_int = O_NONBLOCK; pub const NI_MAXHOST: ::socklen_t = 255; pub const PTHREAD_STACK_MIN: ::size_t = 2048; -pub const POSIX_FADV_DONTNEED: ::c_int = 4; -pub const POSIX_FADV_NOREUSE: ::c_int = 5; pub const POSIX_MADV_DONTNEED: ::c_int = 4; @@ -555,10 +567,21 @@ pub const PTRACE_INTERRUPT: ::c_int = 0x4207; pub const PTRACE_LISTEN: ::c_int = 0x4208; pub const PTRACE_PEEKSIGINFO: ::c_int = 0x4209; -pub const EPOLLWAKEUP: ::c_int = 0x20000000; - -pub const SEEK_DATA: ::c_int = 3; -pub const SEEK_HOLE: ::c_int = 4; +pub const FAN_MARK_INODE: ::c_uint = 0x0000_0000; +pub const FAN_MARK_MOUNT: ::c_uint = 0x0000_0010; +// NOTE: FAN_MARK_FILESYSTEM requires Linux Kernel >= 4.20.0 +pub const FAN_MARK_FILESYSTEM: ::c_uint = 0x0000_0100; + +pub const AF_IB: ::c_int = 27; +pub const AF_MPLS: ::c_int = 28; +pub const AF_NFC: ::c_int = 39; +pub const AF_VSOCK: ::c_int = 40; +pub const AF_XDP: ::c_int = 44; +pub const PF_IB: ::c_int = AF_IB; +pub const PF_MPLS: ::c_int = AF_MPLS; +pub const PF_NFC: ::c_int = AF_NFC; +pub const PF_VSOCK: ::c_int = AF_VSOCK; +pub const PF_XDP: ::c_int = AF_XDP; pub const EFD_NONBLOCK: ::c_int = ::O_NONBLOCK; @@ -619,6 +642,16 @@ pub const PRIO_PROCESS: ::c_int = 0; pub const PRIO_PGRP: ::c_int = 1; pub const PRIO_USER: ::c_int = 2; +cfg_if! { + if #[cfg(target_arch = "s390x")] { + pub const POSIX_FADV_DONTNEED: ::c_int = 6; + pub const POSIX_FADV_NOREUSE: ::c_int = 7; + } else { + pub const POSIX_FADV_DONTNEED: ::c_int = 4; + pub const POSIX_FADV_NOREUSE: ::c_int = 5; + } +} + extern "C" { pub fn sendmmsg( sockfd: ::c_int, @@ -688,7 +721,8 @@ cfg_if! { if #[cfg(any(target_arch = "x86_64", target_arch = "aarch64", target_arch = "mips64", - target_arch = "powerpc64"))] { + target_arch = "powerpc64", + target_arch = "s390x"))] { mod b64; pub use self::b64::*; } else if #[cfg(any(target_arch = "x86", diff --git a/vendor/libc/src/unix/linux_like/linux/uclibc/align.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/align.rs new file mode 100644 index 0000000000..e6610bb7b9 --- /dev/null +++ b/vendor/libc/src/unix/linux_like/linux/uclibc/align.rs @@ -0,0 +1,28 @@ +macro_rules! expand_align { + () => { + s! { + #[cfg_attr(any(target_pointer_width = "32", + target_arch = "x86_64", + target_arch = "powerpc64", + target_arch = "mips64", + target_arch = "s390x", + target_arch = "sparc64"), + repr(align(4)))] + #[cfg_attr(not(any(target_pointer_width = "32", + target_arch = "x86_64", + target_arch = "powerpc64", + target_arch = "mips64", + target_arch = "s390x", + target_arch = "sparc64")), + repr(align(8)))] + pub struct pthread_mutexattr_t { + size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T], + } + + #[repr(align(4))] + pub struct pthread_condattr_t { + size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T], + } + } + }; +} diff --git a/vendor/libc/src/unix/uclibc/arm/align.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/arm/align.rs similarity index 100% rename from vendor/libc/src/unix/uclibc/arm/align.rs rename to vendor/libc/src/unix/linux_like/linux/uclibc/arm/align.rs diff --git a/vendor/libc/src/unix/uclibc/arm/mod.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/arm/mod.rs similarity index 78% rename from vendor/libc/src/unix/uclibc/arm/mod.rs rename to vendor/libc/src/unix/linux_like/linux/uclibc/arm/mod.rs index 613a11fbab..1cafdb61c4 100644 --- a/vendor/libc/src/unix/uclibc/arm/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/uclibc/arm/mod.rs @@ -17,6 +17,10 @@ pub type nlink_t = ::c_uint; pub type blksize_t = ::c_long; pub type blkcnt_t = ::c_long; +pub type fsblkcnt64_t = u64; +pub type fsfilcnt64_t = u64; +pub type __u64 = ::c_ulonglong; + s! { pub struct cmsghdr { pub cmsg_len: ::size_t, @@ -52,13 +56,13 @@ s! { pub st_blksize: ::blksize_t, pub st_blocks: ::blkcnt_t, pub st_atime: ::time_t, - pub st_atime_nsec: ::c_ulong, + pub st_atime_nsec: ::c_long, pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_ulong, + pub st_mtime_nsec: ::c_long, pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_ulong, - pub __unused4: ::c_ulong, - pub __unused5: ::c_ulong, + pub st_ctime_nsec: ::c_long, + pub __uclibc_unused4: ::c_ulong, + pub __uclibc_unused5: ::c_ulong, } pub struct stat64 @@ -76,11 +80,11 @@ s! { pub st_blksize: ::blksize_t, pub st_blocks: ::blkcnt64_t, pub st_atime: ::time_t, - pub st_atime_nsec: ::c_ulong, + pub st_atime_nsec: ::c_long, pub st_mtime: ::time_t, - pub st_mtime_nsec: ::c_ulong, + pub st_mtime_nsec: ::c_long, pub st_ctime: ::time_t, - pub st_ctime_nsec: ::c_ulong, + pub st_ctime_nsec: ::c_long, pub st_ino: ::ino64_t, } @@ -92,6 +96,23 @@ s! { pub l_pid: ::pid_t, } + pub struct sysinfo { + pub uptime: ::c_long, + pub loads: [::c_ulong; 3], + pub totalram: ::c_ulong, + pub freeram: ::c_ulong, + pub sharedram: ::c_ulong, + pub bufferram: ::c_ulong, + pub totalswap: ::c_ulong, + pub freeswap: ::c_ulong, + pub procs: ::c_ushort, + pub pad: ::c_ushort, + pub totalhigh: ::c_ulong, + pub freehigh: ::c_ulong, + pub mem_unit: ::c_uint, + pub _f: [::c_char; 8], + } + pub struct statfs { pub f_type: ::c_int, pub f_bsize: ::c_int, @@ -104,7 +125,39 @@ s! { pub f_fsid: ::fsid_t, pub f_namelen: ::c_int, pub f_frsize: ::c_int, - pub f_spare: [::c_int; 5], + pub f_flags: ::c_int, + pub f_spare: [::c_int; 4], + } + + pub struct statfs64 { + pub f_type: ::c_int, + pub f_bsize: ::c_int, + 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_int, + pub f_frsize: ::c_int, + pub f_flags: ::c_int, + pub f_spare: [::c_int; 4], + } + + 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, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], } pub struct sigset_t { @@ -113,10 +166,8 @@ s! { pub struct sigaction { pub sa_sigaction: ::sighandler_t, - // uClibc defines sa_flags as `unsigned long int`, - // but nix crate expects `int` - pub sa_flags: ::c_int, - pub sa_restorer: *mut ::c_void, + pub sa_flags: ::c_ulong, + pub sa_restorer: ::Option, pub sa_mask: sigset_t, } @@ -154,49 +205,42 @@ s! { pub __pad1: ::c_ushort, pub __seq: ::c_ushort, pub __pad2: ::c_ushort, - pub __unused1: ::c_ulong, - pub __unused2: ::c_ulong, + pub __uclibc_unused1: ::c_ulong, + pub __uclibc_unused2: ::c_ulong, } pub struct msqid_ds { pub msg_perm: ::ipc_perm, pub msg_stime: ::time_t, - pub __unused1: ::c_ulong, + pub __uclibc_unused1: ::c_ulong, pub msg_rtime: ::time_t, - pub __unused2: ::c_ulong, + pub __uclibc_unused2: ::c_ulong, pub msg_ctime: ::time_t, - pub __unused3: ::c_ulong, + pub __uclibc_unused3: ::c_ulong, pub __msg_cbytes: ::c_ulong, pub msg_qnum: ::msgqnum_t, pub msg_qbytes: ::msglen_t, pub msg_lspid: ::pid_t, pub msg_lrpid: ::pid_t, - pub __unused4: ::c_ulong, - pub __unused5: ::c_ulong, + pub __uclibc_unused4: ::c_ulong, + pub __uclibc_unused5: ::c_ulong, } pub struct shmid_ds { pub shm_perm: ::ipc_perm, pub shm_segsz: ::size_t, pub shm_atime: ::time_t, - pub __unused1: ::c_ulong, + pub __uclibc_unused1: ::c_ulong, pub shm_dtime: ::time_t, - pub __unused2: ::c_ulong, + pub __uclibc_unused2: ::c_ulong, pub shm_ctime: ::time_t, - pub __unused3: ::c_ulong, + pub __uclibc_unused3: ::c_ulong, pub shm_cpid: ::pid_t, pub shm_lpid: ::pid_t, pub shm_nattch: ::shmatt_t, - pub __unused4: ::c_ulong, - pub __unused5: ::c_ulong, - } - - pub struct ucred { - pub pid: ::pid_t, - pub uid: ::uid_t, - pub gid: ::gid_t, + pub __uclibc_unused4: ::c_ulong, + pub __uclibc_unused5: ::c_ulong, } - } pub const O_CLOEXEC: ::c_int = 0o2000000; @@ -214,33 +258,12 @@ pub const NCCS: usize = 32; // I wasn't able to find those constants // in uclibc build environment for armv7 -pub const AIO_ALLDONE: ::c_int = 2; // from linux/mod.rs -pub const AIO_CANCELED: ::c_int = 0; // from linux/mod.rs -pub const AIO_NOTCANCELED: ::c_int = 1; // from linux/mod.rs -pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; // from linux/mod.rs -pub const EPOLLEXCLUSIVE: ::c_int = 0x10000000; // from linux/mod.rs -pub const EPOLLWAKEUP: ::c_int = 0x20000000; // from linux/other/mod.rs -pub const EXTPROC: ::tcflag_t = 0o200000; // from asm-generic/termbits.h -pub const F_GETPIPE_SZ: ::c_int = 1032; // from linux_like/mod.rs -pub const F_SETPIPE_SZ: ::c_int = 1031; // from linux_like/mod.rs -pub const LIO_NOP: ::c_int = 2; // from linux/mod.rs -pub const LIO_NOWAIT: ::c_int = 1; // from linux/mod.rs -pub const LIO_READ: ::c_int = 0; // from linux/mod.rs -pub const LIO_WAIT: ::c_int = 0; // from linux/mod.rs -pub const LIO_WRITE: ::c_int = 1; // from linux/mod.rs pub const MAP_HUGETLB: ::c_int = 0x040000; // from linux/other/mod.rs -pub const O_TMPFILE: ::c_int = 0o20000000 | O_DIRECTORY; -pub const RB_KEXEC: ::c_int = 0x45584543u32 as i32; // from linux/mod.rs -pub const RB_SW_SUSPEND: ::c_int = 0xd000fce2u32 as i32; // from linux/mod.rs pub const SO_BUSY_POLL: ::c_int = 46; // from src/unix/linux_like/mod.rs pub const SO_PEEK_OFF: ::c_int = 42; // from src/unix/linux_like/mod.rs pub const SO_REUSEPORT: ::c_int = 15; // from src/unix/linux_like/mod.rs -pub const SOL_NETLINK: ::c_int = 270; // from src/unix/linux_like/mod.rs -pub const _POSIX_VDISABLE: ::cc_t = 0; // from linux/mod.rs -pub const AT_EMPTY_PATH: ::c_int = 0x1000; // from linux_like/mod.rs // autogenerated constants with hand tuned types -pub const AT_NO_AUTOMOUNT: ::c_int = 0x800; pub const B0: ::speed_t = 0; pub const B1000000: ::speed_t = 0x1008; pub const B110: ::speed_t = 0x3; @@ -278,7 +301,6 @@ pub const CBAUD: ::tcflag_t = 0x100f; pub const CBAUDEX: ::tcflag_t = 0x1000; pub const CIBAUD: ::tcflag_t = 0x100f0000; pub const CLOCAL: ::tcflag_t = 0x800; -pub const CMSPAR: ::tcflag_t = 0x40000000; pub const CPU_SETSIZE: ::c_int = 0x400; pub const CR1: ::c_int = 0x200; pub const CR2: ::c_int = 0x400; @@ -409,7 +431,6 @@ pub const HUPCL: ::tcflag_t = 0x400; pub const ICANON: ::tcflag_t = 0x2; pub const IEXTEN: ::tcflag_t = 0x8000; pub const ISIG: ::tcflag_t = 0x1; -pub const IUTF8: ::tcflag_t = 0x4000; pub const IXOFF: ::tcflag_t = 0x1000; pub const IXON: ::tcflag_t = 0x400; pub const MAP_ANON: ::c_int = 0x20; @@ -422,67 +443,45 @@ pub const MAP_NONBLOCK: ::c_int = 0x10000; pub const MAP_NORESERVE: ::c_int = 0x4000; pub const MAP_POPULATE: ::c_int = 0x8000; pub const MAP_STACK: ::c_int = 0x20000; -pub const MS_ACTIVE: u32 = 0x40000000; -pub const MS_DIRSYNC: u32 = 0x80; -pub const MS_I_VERSION: u32 = 0x800000; -pub const MS_KERNMOUNT: u32 = 0x400000; -pub const MS_MOVE: u32 = 0x2000; -pub const MS_POSIXACL: u32 = 0x10000; -pub const MS_PRIVATE: u32 = 0x40000; -pub const MS_REC: u32 = 0x4000; -pub const MS_RELATIME: u32 = 0x200000; -pub const MS_SHARED: u32 = 0x100000; -pub const MS_SILENT: u32 = 0x8000; -pub const MS_SLAVE: u32 = 0x80000; -pub const MS_STRICTATIME: u32 = 0x1000000; -pub const MS_UNBINDABLE: u32 = 0x20000; pub const NLDLY: ::tcflag_t = 0x100; pub const NOFLSH: ::tcflag_t = 0x80; -pub const OCRNL: ::c_int = 0x8; -pub const OFDEL: ::c_int = 0x80; -pub const OFILL: ::c_int = 0x40; pub const OLCUC: ::tcflag_t = 0x2; pub const ONLCR: ::tcflag_t = 0x4; -pub const ONLRET: ::tcflag_t = 0x20; -pub const ONOCR: ::tcflag_t = 0x10; pub const O_ACCMODE: ::c_int = 0x3; pub const O_APPEND: ::c_int = 0x400; +pub const O_ASYNC: ::c_int = 0o20000; pub const O_CREAT: ::c_int = 0x40; pub const O_DIRECT: ::c_int = 0x10000; pub const O_DIRECTORY: ::c_int = 0x4000; -pub const O_DSYNC: ::c_int = 0x1000; +pub const O_DSYNC: ::c_int = O_SYNC; pub const O_EXCL: ::c_int = 0x80; -pub const O_NDELAY: ::c_int = 0x800; +pub const O_FSYNC: ::c_int = O_SYNC; +pub const O_LARGEFILE: ::c_int = 0o400000; +pub const O_NDELAY: ::c_int = O_NONBLOCK; +pub const O_NOATIME: ::c_int = 0o1000000; pub const O_NOCTTY: ::c_int = 0x100; pub const O_NOFOLLOW: ::c_int = 0x8000; pub const O_NONBLOCK: ::c_int = 0x800; +pub const O_PATH: ::c_int = 0o10000000; +pub const O_RSYNC: ::c_int = O_SYNC; pub const O_SYNC: ::c_int = 0o10000; pub const O_TRUNC: ::c_int = 0x200; pub const PARENB: ::tcflag_t = 0x100; pub const PARODD: ::tcflag_t = 0x200; pub const PENDIN: ::tcflag_t = 0x4000; -pub const POLLRDBAND: ::c_short = 0x80; -pub const POLLRDNORM: ::c_short = 0x40; pub const POLLWRBAND: ::c_short = 0x200; pub const POLLWRNORM: ::c_short = 0x100; pub const PTHREAD_STACK_MIN: ::size_t = 16384; -pub const QIF_ALL: u32 = 0x3f; -pub const QIF_BLIMITS: u32 = 0x1; -pub const QIF_BTIME: u32 = 0x10; -pub const QIF_ILIMITS: u32 = 0x4; -pub const QIF_INODES: u32 = 0x8; -pub const QIF_ITIME: u32 = 0x20; -pub const QIF_LIMITS: u32 = 0x5; -pub const QIF_SPACE: u32 = 0x2; -pub const QIF_TIMES: u32 = 0x30; -pub const QIF_USAGE: u32 = 0xa; -pub const SA_NOCLDSTOP: ::c_int = 0x1; -pub const SA_NOCLDWAIT: ::c_int = 0x2; -pub const SA_NODEFER: ::c_int = 0x40000000; -pub const SA_ONSTACK: ::c_int = 0x8000000; -pub const SA_RESETHAND: ::c_int = 0x80000000; -pub const SA_RESTART: ::c_int = 0x10000000; -pub const SA_SIGINFO: ::c_int = 0x4; + +// These are typed unsigned to match sigaction +pub const SA_NOCLDSTOP: ::c_ulong = 0x1; +pub const SA_NOCLDWAIT: ::c_ulong = 0x2; +pub const SA_SIGINFO: ::c_ulong = 0x4; +pub const SA_NODEFER: ::c_ulong = 0x40000000; +pub const SA_ONSTACK: ::c_ulong = 0x8000000; +pub const SA_RESETHAND: ::c_ulong = 0x80000000; +pub const SA_RESTART: ::c_ulong = 0x10000000; + pub const SFD_CLOEXEC: ::c_int = 0x80000; pub const SFD_NONBLOCK: ::c_int = 0x800; pub const SIGBUS: ::c_int = 0x7; @@ -529,6 +528,7 @@ pub const SO_PEERCRED: ::c_int = 0x11; pub const SO_PRIORITY: ::c_int = 0xc; pub const SO_PROTOCOL: ::c_int = 0x26; pub const SO_RCVBUF: ::c_int = 0x8; +pub const SO_RCVBUFFORCE: ::c_int = 33; pub const SO_RCVLOWAT: ::c_int = 0x12; pub const SO_RCVTIMEO: ::c_int = 0x14; pub const SO_REUSEADDR: ::c_int = 0x2; @@ -562,58 +562,8 @@ pub const VTDLY: ::c_int = 0x4000; pub const VTIME: usize = 0x5; pub const VWERASE: usize = 0xe; pub const XTABS: ::tcflag_t = 0x1800; -pub const _PC_2_SYMLINKS: ::c_int = 0x14; -pub const _PC_ALLOC_SIZE_MIN: ::c_int = 0x12; -pub const _PC_ASYNC_IO: ::c_int = 0xa; -pub const _PC_FILESIZEBITS: ::c_int = 0xd; -pub const _PC_PRIO_IO: ::c_int = 0xb; -pub const _PC_REC_INCR_XFER_SIZE: ::c_int = 0xe; -pub const _PC_REC_MAX_XFER_SIZE: ::c_int = 0xf; -pub const _PC_REC_MIN_XFER_SIZE: ::c_int = 0x10; -pub const _PC_REC_XFER_ALIGN: ::c_int = 0x11; -pub const _PC_SYMLINK_MAX: ::c_int = 0x13; -pub const _PC_SYNC_IO: ::c_int = 0x9; -pub const _SC_2_PBS: ::c_int = 0xa8; -pub const _SC_2_PBS_ACCOUNTING: ::c_int = 0xa9; -pub const _SC_2_PBS_CHECKPOINT: ::c_int = 0xaf; -pub const _SC_2_PBS_LOCATE: ::c_int = 0xaa; -pub const _SC_2_PBS_MESSAGE: ::c_int = 0xab; -pub const _SC_2_PBS_TRACK: ::c_int = 0xac; -pub const _SC_ADVISORY_INFO: ::c_int = 0x84; -pub const _SC_BARRIERS: ::c_int = 0x85; -pub const _SC_CLOCK_SELECTION: ::c_int = 0x89; -pub const _SC_CPUTIME: ::c_int = 0x8a; -pub const _SC_IPV6: ::c_int = 0xeb; -pub const _SC_MONOTONIC_CLOCK: ::c_int = 0x95; -pub const _SC_RAW_SOCKETS: ::c_int = 0xec; -pub const _SC_READER_WRITER_LOCKS: ::c_int = 0x99; -pub const _SC_REGEXP: ::c_int = 0x9b; -pub const _SC_SHELL: ::c_int = 0x9d; -pub const _SC_SPAWN: ::c_int = 0x9f; -pub const _SC_SPIN_LOCKS: ::c_int = 0x9a; -pub const _SC_SPORADIC_SERVER: ::c_int = 0xa0; -pub const _SC_SS_REPL_MAX: ::c_int = 0xf1; -pub const _SC_SYMLOOP_MAX: ::c_int = 0xad; -pub const _SC_THREAD_CPUTIME: ::c_int = 0x8b; -pub const _SC_THREAD_PROCESS_SHARED: ::c_int = 0x52; -pub const _SC_THREAD_ROBUST_PRIO_INHERIT: ::c_int = 0xf7; -pub const _SC_THREAD_ROBUST_PRIO_PROTECT: ::c_int = 0xf8; -pub const _SC_THREAD_SPORADIC_SERVER: ::c_int = 0xa1; -pub const _SC_TIMEOUTS: ::c_int = 0xa4; -pub const _SC_TRACE: ::c_int = 0xb5; -pub const _SC_TRACE_EVENT_FILTER: ::c_int = 0xb6; -pub const _SC_TRACE_EVENT_NAME_MAX: ::c_int = 0xf2; -pub const _SC_TRACE_INHERIT: ::c_int = 0xb7; -pub const _SC_TRACE_LOG: ::c_int = 0xb8; -pub const _SC_TRACE_NAME_MAX: ::c_int = 0xf3; -pub const _SC_TRACE_SYS_MAX: ::c_int = 0xf4; -pub const _SC_TRACE_USER_EVENT_MAX: ::c_int = 0xf5; -pub const _SC_TYPED_MEMORY_OBJECTS: ::c_int = 0xa5; -pub const _SC_V6_ILP32_OFF32: ::c_int = 0xb0; -pub const _SC_V6_ILP32_OFFBIG: ::c_int = 0xb1; -pub const _SC_V6_LP64_OFF64: ::c_int = 0xb2; -pub const _SC_V6_LPBIG_OFFBIG: ::c_int = 0xb3; -pub const _SC_XOPEN_STREAMS: ::c_int = 0xf6; + +pub const MADV_SOFT_OFFLINE: ::c_int = 101; // Syscall table is copied from src/unix/notbsd/linux/musl/b32/arm.rs pub const SYS_restart_syscall: ::c_long = 0; @@ -967,75 +917,8 @@ pub const SYS_pkey_mprotect: ::c_long = 394; pub const SYS_pkey_alloc: ::c_long = 395; pub const SYS_pkey_free: ::c_long = 396; -fn CMSG_ALIGN(len: usize) -> usize { - len + ::mem::size_of::() - 1 & !(::mem::size_of::() - 1) -} - -f! { - pub fn CMSG_FIRSTHDR(mhdr: *const msghdr) -> *mut cmsghdr { - if (*mhdr).msg_controllen as usize >= ::mem::size_of::() { - (*mhdr).msg_control as *mut cmsghdr - } else { - 0 as *mut cmsghdr - } - } - - pub fn CMSG_DATA(cmsg: *const cmsghdr) -> *mut ::c_uchar { - cmsg.offset(1) as *mut ::c_uchar - } - - pub fn CMSG_SPACE(length: ::c_uint) -> ::c_uint { - (CMSG_ALIGN(length as usize) + CMSG_ALIGN(::mem::size_of::())) - as ::c_uint - } - - pub fn CMSG_LEN(length: ::c_uint) -> ::c_uint { - CMSG_ALIGN(::mem::size_of::()) as ::c_uint + length - } - - pub fn CMSG_NXTHDR(mhdr: *const msghdr, - cmsg: *const cmsghdr) -> *mut cmsghdr { - if ((*cmsg).cmsg_len as usize) < ::mem::size_of::() { - return 0 as *mut cmsghdr; - }; - let next = (cmsg as usize + - CMSG_ALIGN((*cmsg).cmsg_len as usize)) - as *mut cmsghdr; - let max = (*mhdr).msg_control as usize - + (*mhdr).msg_controllen as usize; - if (next.offset(1)) as usize > max || - next as usize + CMSG_ALIGN((*next).cmsg_len as usize) > max - { - 0 as *mut cmsghdr - } else { - next as *mut cmsghdr - } - } - -} - extern "C" { pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; - pub fn openpty( - amaster: *mut ::c_int, - aslave: *mut ::c_int, - name: *mut ::c_char, - termp: *mut termios, - winp: *mut ::winsize, - ) -> ::c_int; - pub fn setns(fd: ::c_int, nstype: ::c_int) -> ::c_int; - pub fn pwritev( - fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int, - offset: ::off_t, - ) -> ::ssize_t; - pub fn preadv( - fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int, - offset: ::off_t, - ) -> ::ssize_t; } cfg_if! { diff --git a/vendor/libc/src/unix/uclibc/arm/no_align.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/arm/no_align.rs similarity index 100% rename from vendor/libc/src/unix/uclibc/arm/no_align.rs rename to vendor/libc/src/unix/linux_like/linux/uclibc/arm/no_align.rs diff --git a/vendor/libc/src/unix/uclibc/mips/mips32/align.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/align.rs similarity index 100% rename from vendor/libc/src/unix/uclibc/mips/mips32/align.rs rename to vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/align.rs diff --git a/vendor/libc/src/unix/uclibc/mips/mips32/mod.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs similarity index 95% rename from vendor/libc/src/unix/uclibc/mips/mips32/mod.rs rename to vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs index 31bca589ef..6b34faeade 100644 --- a/vendor/libc/src/unix/uclibc/mips/mips32/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/mod.rs @@ -12,7 +12,10 @@ pub type blksize_t = i32; pub type nlink_t = u32; pub type fsblkcnt_t = ::c_ulong; pub type fsfilcnt_t = ::c_ulong; -pub type rlim_t = c_ulong; +pub type rlim_t = ::c_ulong; +pub type __u64 = ::c_ulonglong; +pub type fsblkcnt64_t = u64; +pub type fsfilcnt64_t = u64; s! { pub struct stat { @@ -61,6 +64,22 @@ s! { st_pad5: [::c_long; 14], } + 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_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + pub __f_spare: [::c_int; 6], + } + pub struct pthread_attr_t { __size: [u32; 9] } @@ -169,6 +188,21 @@ s! { f_spare: [::c_long; 6], } + pub struct statfs64 { + pub f_type: ::c_long, + pub f_bsize: ::c_long, + pub f_frsize: ::c_long, + pub f_blocks: ::fsblkcnt64_t, + pub f_bfree: ::fsblkcnt64_t, + pub f_files: ::fsblkcnt64_t, + pub f_ffree: ::fsblkcnt64_t, + pub f_bavail: ::fsblkcnt64_t, + pub f_fsid: ::fsid_t, + pub f_namelen: ::c_long, + pub f_flags: ::c_long, + pub f_spare: [::c_long; 5], + } + pub struct msghdr { pub msg_name: *mut ::c_void, pub msg_namelen: ::socklen_t, @@ -222,10 +256,14 @@ s! { } } -pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_ATTR_T: usize = 36; pub const __SIZEOF_PTHREAD_MUTEX_T: usize = 24; -pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32; pub const __SIZEOF_PTHREAD_MUTEXATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; +pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 32; +pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8; +pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 20; +pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; pub const RLIM_INFINITY: ::rlim_t = 0x7fffffff; @@ -599,7 +637,6 @@ extern "C" { newlen: ::size_t, ) -> ::c_int; pub fn ioctl(fd: ::c_int, request: ::c_ulong, ...) -> ::c_int; - pub fn backtrace(buf: *mut *mut ::c_void, sz: ::c_int) -> ::c_int; pub fn glob64( pattern: *const ::c_char, flags: ::c_int, @@ -609,7 +646,6 @@ extern "C" { pglob: *mut glob64_t, ) -> ::c_int; pub fn globfree64(pglob: *mut glob64_t); - pub fn ptrace(request: ::c_uint, ...) -> ::c_long; pub fn pthread_attr_getaffinity_np( attr: *const ::pthread_attr_t, cpusetsize: ::size_t, diff --git a/vendor/libc/src/unix/uclibc/mips/mips32/no_align.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs similarity index 100% rename from vendor/libc/src/unix/uclibc/mips/mips32/no_align.rs rename to vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips32/no_align.rs diff --git a/vendor/libc/src/unix/uclibc/mips/mips64/align.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/align.rs similarity index 100% rename from vendor/libc/src/unix/uclibc/mips/mips64/align.rs rename to vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/align.rs diff --git a/vendor/libc/src/unix/uclibc/mips/mips64/mod.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs similarity index 100% rename from vendor/libc/src/unix/uclibc/mips/mips64/mod.rs rename to vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/mod.rs diff --git a/vendor/libc/src/unix/uclibc/mips/mips64/no_align.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs similarity index 100% rename from vendor/libc/src/unix/uclibc/mips/mips64/no_align.rs rename to vendor/libc/src/unix/linux_like/linux/uclibc/mips/mips64/no_align.rs diff --git a/vendor/libc/src/unix/uclibc/mips/mod.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mod.rs similarity index 78% rename from vendor/libc/src/unix/uclibc/mips/mod.rs rename to vendor/libc/src/unix/linux_like/linux/uclibc/mips/mod.rs index de76971ae3..26408ff82a 100644 --- a/vendor/libc/src/unix/uclibc/mips/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/uclibc/mips/mod.rs @@ -28,8 +28,6 @@ pub const SA_RESETHAND: ::c_int = 0x80000000; pub const SA_RESTART: ::c_int = 0x10000000; pub const SA_NOCLDSTOP: ::c_int = 0x00000001; -pub const EPOLLEXCLUSIVE: ::c_int = 0x10000000; // from linux/mod.rs -pub const EPOLLWAKEUP: ::c_int = 0x20000000; // from linux/other/mod.rs pub const EPOLL_CLOEXEC: ::c_int = 0x80000; pub const EFD_CLOEXEC: ::c_int = 0x80000; @@ -37,15 +35,12 @@ pub const EFD_CLOEXEC: ::c_int = 0x80000; pub const BUFSIZ: ::c_uint = 4096; pub const TMP_MAX: ::c_uint = 238328; pub const FOPEN_MAX: ::c_uint = 16; -pub const POSIX_FADV_DONTNEED: ::c_int = 4; -pub const POSIX_FADV_NOREUSE: ::c_int = 5; pub const POSIX_MADV_DONTNEED: ::c_int = 4; pub const _SC_2_C_VERSION: ::c_int = 96; pub const O_ACCMODE: ::c_int = 3; pub const O_DIRECT: ::c_int = 0x8000; pub const O_DIRECTORY: ::c_int = 0x10000; pub const O_NOFOLLOW: ::c_int = 0x20000; -pub const ST_RELATIME: ::c_ulong = 4096; pub const NI_MAXHOST: ::socklen_t = 1025; pub const RLIMIT_NOFILE: ::c_int = 5; @@ -115,7 +110,6 @@ pub const ENOPROTOOPT: ::c_int = 99; pub const EPROTONOSUPPORT: ::c_int = 120; pub const ESOCKTNOSUPPORT: ::c_int = 121; pub const EOPNOTSUPP: ::c_int = 122; -pub const ENOTSUP: ::c_int = EOPNOTSUPP; pub const EPFNOSUPPORT: ::c_int = 123; pub const EAFNOSUPPORT: ::c_int = 124; pub const EADDRINUSE: ::c_int = 125; @@ -204,7 +198,6 @@ pub const SO_DETACH_FILTER: ::c_int = 27; pub const SO_GET_FILTER: ::c_int = SO_ATTACH_FILTER; pub const SO_PEERNAME: ::c_int = 28; pub const SO_TIMESTAMP: ::c_int = 29; -pub const SCM_TIMESTAMP: ::c_int = SO_TIMESTAMP; pub const SO_PEERSEC: ::c_int = 30; pub const SO_SNDBUFFORCE: ::c_int = 31; pub const SO_RCVBUFFORCE: ::c_int = 33; @@ -212,8 +205,6 @@ pub const SO_PASSSEC: ::c_int = 34; pub const SO_TIMESTAMPNS: ::c_int = 35; pub const SCM_TIMESTAMPNS: ::c_int = SO_TIMESTAMPNS; pub const SO_MARK: ::c_int = 36; -pub const SO_TIMESTAMPING: ::c_int = 37; -pub const SCM_TIMESTAMPING: ::c_int = SO_TIMESTAMPING; pub const SO_RXQ_OVFL: ::c_int = 40; pub const SO_WIFI_STATUS: ::c_int = 41; pub const SCM_WIFI_STATUS: ::c_int = SO_WIFI_STATUS; @@ -256,40 +247,11 @@ pub const SIG_SETMASK: ::c_int = 3; pub const SIG_BLOCK: ::c_int = 0x1; pub const SIG_UNBLOCK: ::c_int = 0x2; -pub const POLLRDNORM: ::c_short = 0x040; pub const POLLWRNORM: ::c_short = 0x004; -pub const POLLRDBAND: ::c_short = 0x080; pub const POLLWRBAND: ::c_short = 0x100; pub const PTHREAD_STACK_MIN: ::size_t = 16384; -pub const ADFS_SUPER_MAGIC: ::c_long = 0x0000adf5; -pub const AFFS_SUPER_MAGIC: ::c_long = 0x0000adff; -pub const CODA_SUPER_MAGIC: ::c_long = 0x73757245; -pub const CRAMFS_MAGIC: ::c_long = 0x28cd3d45; -pub const EFS_SUPER_MAGIC: ::c_long = 0x00414a53; -pub const EXT2_SUPER_MAGIC: ::c_long = 0x0000ef53; -pub const EXT3_SUPER_MAGIC: ::c_long = 0x0000ef53; -pub const EXT4_SUPER_MAGIC: ::c_long = 0x0000ef53; -pub const HPFS_SUPER_MAGIC: ::c_long = 0xf995e849; -pub const HUGETLBFS_MAGIC: ::c_long = 0x958458f6; -pub const ISOFS_SUPER_MAGIC: ::c_long = 0x00009660; -pub const JFFS2_SUPER_MAGIC: ::c_long = 0x000072b6; -pub const MINIX_SUPER_MAGIC: ::c_long = 0x0000137f; -pub const MINIX_SUPER_MAGIC2: ::c_long = 0x0000138f; -pub const MINIX2_SUPER_MAGIC: ::c_long = 0x00002468; -pub const MINIX2_SUPER_MAGIC2: ::c_long = 0x00002478; -pub const MSDOS_SUPER_MAGIC: ::c_long = 0x00004d44; -pub const NCP_SUPER_MAGIC: ::c_long = 0x0000564c; -pub const NFS_SUPER_MAGIC: ::c_long = 0x00006969; -pub const OPENPROM_SUPER_MAGIC: ::c_long = 0x00009fa1; -pub const PROC_SUPER_MAGIC: ::c_long = 0x00009fa0; -pub const QNX4_SUPER_MAGIC: ::c_long = 0x0000002f; -pub const REISERFS_SUPER_MAGIC: ::c_long = 0x52654973; -pub const SMB_SUPER_MAGIC: ::c_long = 0x0000517b; -pub const TMPFS_MAGIC: ::c_long = 0x01021994; -pub const USBDEVICE_SUPER_MAGIC: ::c_long = 0x00009fa2; - pub const VEOF: usize = 16; pub const VEOL: usize = 17; pub const VEOL2: usize = 6; @@ -297,37 +259,12 @@ pub const VMIN: usize = 4; pub const IEXTEN: ::tcflag_t = 0x00000100; pub const TOSTOP: ::tcflag_t = 0x00008000; pub const FLUSHO: ::tcflag_t = 0x00002000; -pub const IUTF8: ::tcflag_t = 0x00004000; pub const TCSANOW: ::c_int = 0x540e; pub const TCSADRAIN: ::c_int = 0x540f; pub const TCSAFLUSH: ::c_int = 0x5410; pub const CPU_SETSIZE: ::c_int = 0x400; -pub const PTRACE_TRACEME: ::c_uint = 0; -pub const PTRACE_PEEKTEXT: ::c_uint = 1; -pub const PTRACE_PEEKDATA: ::c_uint = 2; -pub const PTRACE_PEEKUSER: ::c_uint = 3; -pub const PTRACE_POKETEXT: ::c_uint = 4; -pub const PTRACE_POKEDATA: ::c_uint = 5; -pub const PTRACE_POKEUSER: ::c_uint = 6; -pub const PTRACE_CONT: ::c_uint = 7; -pub const PTRACE_KILL: ::c_uint = 8; -pub const PTRACE_SINGLESTEP: ::c_uint = 9; -pub const PTRACE_ATTACH: ::c_uint = 16; -pub const PTRACE_DETACH: ::c_uint = 17; -pub const PTRACE_SYSCALL: ::c_uint = 24; -pub const PTRACE_SETOPTIONS: ::c_uint = 0x4200; -pub const PTRACE_GETEVENTMSG: ::c_uint = 0x4201; -pub const PTRACE_GETSIGINFO: ::c_uint = 0x4202; -pub const PTRACE_SETSIGINFO: ::c_uint = 0x4203; -pub const PTRACE_GETFPREGS: ::c_uint = 14; -pub const PTRACE_SETFPREGS: ::c_uint = 15; -pub const PTRACE_GETFPXREGS: ::c_uint = 18; -pub const PTRACE_SETFPXREGS: ::c_uint = 19; -pub const PTRACE_GETREGS: ::c_uint = 12; -pub const PTRACE_SETREGS: ::c_uint = 13; - pub const EFD_NONBLOCK: ::c_int = 0x80; pub const F_GETLK: ::c_int = 14; @@ -370,28 +307,9 @@ pub const TIOCMSET: ::c_ulong = 0x741a; pub const FIONREAD: ::c_ulong = 0x467f; pub const TIOCCONS: ::c_ulong = 0x80047478; -pub const RTLD_DEEPBIND: ::c_int = 0x10; pub const RTLD_GLOBAL: ::c_int = 0x4; pub const RTLD_NOLOAD: ::c_int = 0x8; -pub const LINUX_REBOOT_MAGIC1: ::c_int = 0xfee1dead; -pub const LINUX_REBOOT_MAGIC2: ::c_int = 672274793; -pub const LINUX_REBOOT_MAGIC2A: ::c_int = 85072278; -pub const LINUX_REBOOT_MAGIC2B: ::c_int = 369367448; -pub const LINUX_REBOOT_MAGIC2C: ::c_int = 537993216; - -pub const LINUX_REBOOT_CMD_RESTART: ::c_int = 0x01234567; -pub const LINUX_REBOOT_CMD_HALT: ::c_int = 0xCDEF0123; -pub const LINUX_REBOOT_CMD_CAD_ON: ::c_int = 0x89ABCDEF; -pub const LINUX_REBOOT_CMD_CAD_OFF: ::c_int = 0x00000000; -pub const LINUX_REBOOT_CMD_POWER_OFF: ::c_int = 0x4321FEDC; -pub const LINUX_REBOOT_CMD_RESTART2: ::c_int = 0xA1B2C3D4; -pub const LINUX_REBOOT_CMD_SW_SUSPEND: ::c_int = 0xD000FCE2; -pub const LINUX_REBOOT_CMD_KEXEC: ::c_int = 0x45584543; - -pub const MCL_CURRENT: ::c_int = 0x0001; -pub const MCL_FUTURE: ::c_int = 0x0002; - pub const SIGSTKSZ: ::size_t = 8192; pub const CBAUD: ::tcflag_t = 0o0010017; pub const TAB1: ::tcflag_t = 0x00000800; diff --git a/vendor/libc/src/unix/linux_like/linux/uclibc/mod.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/mod.rs new file mode 100644 index 0000000000..cc5d5cdce9 --- /dev/null +++ b/vendor/libc/src/unix/linux_like/linux/uclibc/mod.rs @@ -0,0 +1,304 @@ +pub type shmatt_t = ::c_ulong; +pub type msgqnum_t = ::c_ulong; +pub type msglen_t = ::c_ulong; +pub type regoff_t = ::c_int; + +s! { + pub struct statvfs { // Different than GNU! + 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, + #[cfg(target_endian = "little")] + pub f_fsid: ::c_ulong, + #[cfg(target_pointer_width = "32")] + __f_unused: ::c_int, + #[cfg(target_endian = "big")] + pub f_fsid: ::c_ulong, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + + pub struct regex_t { + __buffer: *mut ::c_void, + __allocated: ::size_t, + __used: ::size_t, + __syntax: ::c_ulong, + __fastmap: *mut ::c_char, + __translate: *mut ::c_char, + __re_nsub: ::size_t, + __bitfield: u8, + } +} + +pub const MCL_CURRENT: ::c_int = 0x0001; +pub const MCL_FUTURE: ::c_int = 0x0002; + +pub const SIGEV_THREAD_ID: ::c_int = 4; + +pub const ADFS_SUPER_MAGIC: ::c_long = 0x0000adf5; +pub const AFFS_SUPER_MAGIC: ::c_long = 0x0000adff; +pub const AFS_SUPER_MAGIC: ::c_long = 0x5346414f; +pub const AUTOFS_SUPER_MAGIC: ::c_long = 0x0187; +pub const BINDERFS_SUPER_MAGIC: ::c_long = 0x6c6f6f70; +pub const BPF_FS_MAGIC: ::c_long = 0xcafe4a11; +pub const BTRFS_SUPER_MAGIC: ::c_long = 0x9123683e; +pub const CGROUP2_SUPER_MAGIC: ::c_long = 0x63677270; +pub const CGROUP_SUPER_MAGIC: ::c_long = 0x27e0eb; +pub const CODA_SUPER_MAGIC: ::c_long = 0x73757245; +pub const CRAMFS_MAGIC: ::c_long = 0x28cd3d45; +pub const DEBUGFS_MAGIC: ::c_long = 0x64626720; +pub const DEVPTS_SUPER_MAGIC: ::c_long = 0x1cd1; +pub const ECRYPTFS_SUPER_MAGIC: ::c_long = 0xf15f; +pub const EFS_SUPER_MAGIC: ::c_long = 0x00414a53; +pub const EXT2_SUPER_MAGIC: ::c_long = 0x0000ef53; +pub const EXT3_SUPER_MAGIC: ::c_long = 0x0000ef53; +pub const EXT4_SUPER_MAGIC: ::c_long = 0x0000ef53; +pub const F2FS_SUPER_MAGIC: ::c_long = 0xf2f52010; +pub const FUTEXFS_SUPER_MAGIC: ::c_long = 0xbad1dea; +pub const HOSTFS_SUPER_MAGIC: ::c_long = 0x00c0ffee; +pub const HPFS_SUPER_MAGIC: ::c_long = 0xf995e849; +pub const HUGETLBFS_MAGIC: ::c_long = 0x958458f6; +pub const ISOFS_SUPER_MAGIC: ::c_long = 0x00009660; +pub const JFFS2_SUPER_MAGIC: ::c_long = 0x000072b6; +pub const MINIX2_SUPER_MAGIC2: ::c_long = 0x00002478; +pub const MINIX2_SUPER_MAGIC: ::c_long = 0x00002468; +pub const MINIX3_SUPER_MAGIC: ::c_long = 0x4d5a; +pub const MINIX_SUPER_MAGIC2: ::c_long = 0x0000138f; +pub const MINIX_SUPER_MAGIC: ::c_long = 0x0000137f; +pub const MSDOS_SUPER_MAGIC: ::c_long = 0x00004d44; +pub const NCP_SUPER_MAGIC: ::c_long = 0x0000564c; +pub const NFS_SUPER_MAGIC: ::c_long = 0x00006969; +pub const NILFS_SUPER_MAGIC: ::c_long = 0x3434; +pub const OCFS2_SUPER_MAGIC: ::c_long = 0x7461636f; +pub const OPENPROM_SUPER_MAGIC: ::c_long = 0x00009fa1; +pub const OVERLAYFS_SUPER_MAGIC: ::c_long = 0x794c7630; +pub const PROC_SUPER_MAGIC: ::c_long = 0x00009fa0; +pub const QNX4_SUPER_MAGIC: ::c_long = 0x0000002f; +pub const QNX6_SUPER_MAGIC: ::c_long = 0x68191122; +pub const RDTGROUP_SUPER_MAGIC: ::c_long = 0x7655821; +pub const REISERFS_SUPER_MAGIC: ::c_long = 0x52654973; +pub const SMB_SUPER_MAGIC: ::c_long = 0x0000517b; +pub const SYSFS_MAGIC: ::c_long = 0x62656572; +pub const TMPFS_MAGIC: ::c_long = 0x01021994; +pub const TRACEFS_MAGIC: ::c_long = 0x74726163; +pub const UDF_SUPER_MAGIC: ::c_long = 0x15013346; +pub const USBDEVICE_SUPER_MAGIC: ::c_long = 0x00009fa2; +pub const XENFS_SUPER_MAGIC: ::c_long = 0xabba1974; +pub const XFS_SUPER_MAGIC: ::c_long = 0x58465342; + +pub const PTRACE_TRACEME: ::c_int = 0; +pub const PTRACE_PEEKTEXT: ::c_int = 1; +pub const PTRACE_PEEKDATA: ::c_int = 2; +pub const PTRACE_PEEKUSER: ::c_int = 3; +pub const PTRACE_POKETEXT: ::c_int = 4; +pub const PTRACE_POKEDATA: ::c_int = 5; +pub const PTRACE_POKEUSER: ::c_int = 6; +pub const PTRACE_CONT: ::c_int = 7; +pub const PTRACE_KILL: ::c_int = 8; +pub const PTRACE_SINGLESTEP: ::c_int = 9; +pub const PTRACE_GETREGS: ::c_int = 12; +pub const PTRACE_SETREGS: ::c_int = 13; +pub const PTRACE_GETFPREGS: ::c_int = 14; +pub const PTRACE_SETFPREGS: ::c_int = 15; +pub const PTRACE_ATTACH: ::c_int = 16; +pub const PTRACE_DETACH: ::c_int = 17; +pub const PTRACE_GETFPXREGS: ::c_int = 18; +pub const PTRACE_SETFPXREGS: ::c_int = 19; +pub const PTRACE_SYSCALL: ::c_int = 24; +pub const PTRACE_SETOPTIONS: ::c_int = 0x4200; +pub const PTRACE_GETEVENTMSG: ::c_int = 0x4201; +pub const PTRACE_GETSIGINFO: ::c_int = 0x4202; +pub const PTRACE_SETSIGINFO: ::c_int = 0x4203; +pub const PTRACE_GETREGSET: ::c_int = 0x4204; +pub const PTRACE_SETREGSET: ::c_int = 0x4205; +pub const PTRACE_SEIZE: ::c_int = 0x4206; +pub const PTRACE_INTERRUPT: ::c_int = 0x4207; +pub const PTRACE_LISTEN: ::c_int = 0x4208; +pub const PTRACE_O_MASK: ::c_int = 0x000000ff; + +pub const POSIX_FADV_DONTNEED: ::c_int = 4; +pub const POSIX_FADV_NOREUSE: ::c_int = 5; + +pub const RLIMIT_CPU: ::c_int = 0; +pub const RLIMIT_FSIZE: ::c_int = 1; +pub const RLIMIT_DATA: ::c_int = 2; +pub const RLIMIT_STACK: ::c_int = 3; +pub const RLIMIT_CORE: ::c_int = 4; +pub const RLIMIT_LOCKS: ::c_int = 10; +pub const RLIMIT_SIGPENDING: ::c_int = 11; +pub const RLIMIT_MSGQUEUE: ::c_int = 12; +pub const RLIMIT_NICE: ::c_int = 13; +pub const RLIMIT_RTPRIO: ::c_int = 14; + +// These are different than GNU! +pub const LC_CTYPE: ::c_int = 0; +pub const LC_NUMERIC: ::c_int = 1; +pub const LC_TIME: ::c_int = 3; +pub const LC_COLLATE: ::c_int = 4; +pub const LC_MONETARY: ::c_int = 2; +pub const LC_MESSAGES: ::c_int = 5; +pub const LC_ALL: ::c_int = 6; +// end different section + +// MS_ flags for mount(2) +pub const MS_RMT_MASK: ::c_ulong = + ::MS_RDONLY | ::MS_SYNCHRONOUS | ::MS_MANDLOCK | ::MS_I_VERSION; + +pub const ENOTSUP: ::c_int = EOPNOTSUPP; + +pub const IPV6_JOIN_GROUP: ::c_int = 20; +pub const IPV6_LEAVE_GROUP: ::c_int = 21; + +// These are different from GNU +pub const ABDAY_1: ::nl_item = 0x300; +pub const ABDAY_2: ::nl_item = 0x301; +pub const ABDAY_3: ::nl_item = 0x302; +pub const ABDAY_4: ::nl_item = 0x303; +pub const ABDAY_5: ::nl_item = 0x304; +pub const ABDAY_6: ::nl_item = 0x305; +pub const ABDAY_7: ::nl_item = 0x306; +pub const DAY_1: ::nl_item = 0x307; +pub const DAY_2: ::nl_item = 0x308; +pub const DAY_3: ::nl_item = 0x309; +pub const DAY_4: ::nl_item = 0x30A; +pub const DAY_5: ::nl_item = 0x30B; +pub const DAY_6: ::nl_item = 0x30C; +pub const DAY_7: ::nl_item = 0x30D; +pub const ABMON_1: ::nl_item = 0x30E; +pub const ABMON_2: ::nl_item = 0x30F; +pub const ABMON_3: ::nl_item = 0x310; +pub const ABMON_4: ::nl_item = 0x311; +pub const ABMON_5: ::nl_item = 0x312; +pub const ABMON_6: ::nl_item = 0x313; +pub const ABMON_7: ::nl_item = 0x314; +pub const ABMON_8: ::nl_item = 0x315; +pub const ABMON_9: ::nl_item = 0x316; +pub const ABMON_10: ::nl_item = 0x317; +pub const ABMON_11: ::nl_item = 0x318; +pub const ABMON_12: ::nl_item = 0x319; +pub const MON_1: ::nl_item = 0x31A; +pub const MON_2: ::nl_item = 0x31B; +pub const MON_3: ::nl_item = 0x31C; +pub const MON_4: ::nl_item = 0x31D; +pub const MON_5: ::nl_item = 0x31E; +pub const MON_6: ::nl_item = 0x31F; +pub const MON_7: ::nl_item = 0x320; +pub const MON_8: ::nl_item = 0x321; +pub const MON_9: ::nl_item = 0x322; +pub const MON_10: ::nl_item = 0x323; +pub const MON_11: ::nl_item = 0x324; +pub const MON_12: ::nl_item = 0x325; +pub const AM_STR: ::nl_item = 0x326; +pub const PM_STR: ::nl_item = 0x327; +pub const D_T_FMT: ::nl_item = 0x328; +pub const D_FMT: ::nl_item = 0x329; +pub const T_FMT: ::nl_item = 0x32A; +pub const T_FMT_AMPM: ::nl_item = 0x32B; +pub const ERA: ::nl_item = 0x32C; +pub const ERA_D_FMT: ::nl_item = 0x32E; +pub const ALT_DIGITS: ::nl_item = 0x32F; +pub const ERA_D_T_FMT: ::nl_item = 0x330; +pub const ERA_T_FMT: ::nl_item = 0x331; +pub const CODESET: ::nl_item = 10; +pub const CRNCYSTR: ::nl_item = 0x215; +pub const RADIXCHAR: ::nl_item = 0x100; +pub const THOUSEP: ::nl_item = 0x101; +pub const NOEXPR: ::nl_item = 0x501; +pub const YESSTR: ::nl_item = 0x502; +pub const NOSTR: ::nl_item = 0x503; + +// Different than Gnu. +pub const FILENAME_MAX: ::c_uint = 4095; + +pub const PRIO_PROCESS: ::c_int = 0; +pub const PRIO_PGRP: ::c_int = 1; +pub const PRIO_USER: ::c_int = 2; + +pub const ST_RELATIME: ::c_ulong = 4096; + +extern "C" { + pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::timezone) -> ::c_int; + + pub fn pthread_rwlockattr_getkind_np( + attr: *const ::pthread_rwlockattr_t, + val: *mut ::c_int, + ) -> ::c_int; + pub fn pthread_rwlockattr_setkind_np( + attr: *mut ::pthread_rwlockattr_t, + val: ::c_int, + ) -> ::c_int; + + pub fn ptrace(request: ::c_uint, ...) -> ::c_long; + + pub fn sendmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_int, + ) -> ::c_int; + pub fn recvmmsg( + sockfd: ::c_int, + msgvec: *mut ::mmsghdr, + vlen: ::c_uint, + flags: ::c_int, + timeout: *mut ::timespec, + ) -> ::c_int; + + pub fn openpty( + amaster: *mut ::c_int, + aslave: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize, + ) -> ::c_int; + pub fn forkpty( + amaster: *mut ::c_int, + name: *mut ::c_char, + termp: *mut termios, + winp: *mut ::winsize, + ) -> ::pid_t; + + pub fn getnameinfo( + sa: *const ::sockaddr, + salen: ::socklen_t, + host: *mut ::c_char, + hostlen: ::socklen_t, + serv: *mut ::c_char, + sevlen: ::socklen_t, + flags: ::c_int, + ) -> ::c_int; + + pub fn pwritev( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off64_t, + ) -> ::ssize_t; + pub fn preadv( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off64_t, + ) -> ::ssize_t; +} + +cfg_if! { + if #[cfg(any(target_arch = "mips", target_arch = "mips64"))] { + mod mips; + pub use self::mips::*; + } else if #[cfg(target_arch = "x86_64")] { + mod x86_64; + pub use self::x86_64::*; + } else if #[cfg(target_arch = "arm")] { + mod arm; + pub use self::arm::*; + } else { + pub use unsupported_target; + } +} diff --git a/vendor/libc/src/unix/uclibc/no_align.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/no_align.rs similarity index 100% rename from vendor/libc/src/unix/uclibc/no_align.rs rename to vendor/libc/src/unix/linux_like/linux/uclibc/no_align.rs diff --git a/vendor/libc/src/unix/uclibc/x86_64/l4re.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs similarity index 100% rename from vendor/libc/src/unix/uclibc/x86_64/l4re.rs rename to vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/l4re.rs diff --git a/vendor/libc/src/unix/uclibc/x86_64/mod.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/mod.rs similarity index 84% rename from vendor/libc/src/unix/uclibc/x86_64/mod.rs rename to vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/mod.rs index 26eca9e7ea..80c9583372 100644 --- a/vendor/libc/src/unix/uclibc/x86_64/mod.rs +++ b/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/mod.rs @@ -12,13 +12,16 @@ pub type ino_t = ::c_ulong; pub type nlink_t = ::c_uint; pub type off_t = ::c_long; pub type rlim_t = c_ulong; -pub type rlim64_t = u64; // [uClibc docs] Note stat64 has the same shape as stat for x86-64. pub type stat64 = stat; pub type suseconds_t = ::c_long; pub type time_t = ::c_int; pub type wchar_t = ::c_int; +pub type fsblkcnt64_t = u64; +pub type fsfilcnt64_t = u64; +pub type __u64 = ::c_ulong; + s! { pub struct ipc_perm { pub __key: ::key_t, @@ -143,7 +146,7 @@ s! { pub struct sigaction { pub sa_handler: ::sighandler_t, pub sa_flags: ::c_ulong, - pub sa_restorer: *mut ::c_void, + pub sa_restorer: ::Option, pub sa_mask: ::sigset_t, } @@ -167,6 +170,37 @@ s! { f_spare: [fsword_t; 5], } + pub struct statfs64 { + pub f_type: ::c_int, + pub f_bsize: ::c_int, + 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_int, + pub f_frsize: ::c_int, + pub f_flags: ::c_int, + pub f_spare: [::c_int; 4], + } + + 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, + __f_unused: ::c_int, + pub f_flag: ::c_ulong, + pub f_namemax: ::c_ulong, + __f_spare: [::c_int; 6], + } + pub struct msghdr { // FIXME pub msg_name: *mut ::c_void, pub msg_namelen: ::socklen_t, @@ -219,11 +253,6 @@ s! { __unused5: *mut ::c_void, } - pub struct rlimit64 { // FIXME - pub rlim_cur: rlim64_t, - pub rlim_max: rlim64_t, - } - pub struct cpu_set_t { // FIXME #[cfg(target_pointer_width = "32")] bits: [u32; 32], @@ -234,6 +263,21 @@ s! { pub struct fsid_t { // FIXME __val: [::c_int; 2], } + + // FIXME this is actually a union + pub struct sem_t { + #[cfg(target_pointer_width = "32")] + __size: [::c_char; 16], + #[cfg(target_pointer_width = "64")] + __size: [::c_char; 32], + __align: [::c_long; 0], + } + + pub struct cmsghdr { + pub cmsg_len: ::size_t, + pub cmsg_level: ::c_int, + pub cmsg_type: ::c_int, + } } s_no_extra_traits! { @@ -245,14 +289,6 @@ s_no_extra_traits! { pub d_type: u8, pub d_name: [::c_char; 256], } - #[allow(missing_debug_implementations)] - pub struct dirent64 { - pub d_ino: ::ino64_t, - pub d_off: ::off64_t, - pub d_reclen: u16, - pub d_type: u8, - pub d_name: [::c_char; 256], - } } // constants @@ -265,6 +301,8 @@ pub const EDEADLK: ::c_int = 35; // Resource deadlock would occur pub const ENOSYS: ::c_int = 38; // Function not implemented pub const ENOTCONN: ::c_int = 107; // Transport endpoint is not connected pub const ETIMEDOUT: ::c_int = 110; // connection timed out +pub const EOPNOTSUPP: ::c_int = 0x5f; +pub const ENODATA: ::c_int = 0x3d; pub const O_APPEND: ::c_int = 02000; pub const O_ACCMODE: ::c_int = 0003; pub const O_CLOEXEC: ::c_int = 0x80000; @@ -285,10 +323,12 @@ pub const SOL_SOCKET: ::c_int = 1; pub const SO_RCVTIMEO: ::c_int = 20; pub const SO_REUSEADDR: ::c_int = 2; pub const SO_SNDTIMEO: ::c_int = 21; +pub const SO_TIMESTAMP: ::c_int = 0x1d; pub const RLIM_INFINITY: u64 = 0xffffffffffffffff; pub const __SIZEOF_PTHREAD_COND_T: usize = 48; pub const __SIZEOF_PTHREAD_CONDATTR_T: usize = 4; pub const __SIZEOF_PTHREAD_RWLOCK_T: usize = 56; +pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8; cfg_if! { if #[cfg(target_os = "l4re")] { @@ -299,14 +339,3 @@ cfg_if! { pub use other::*; } } - -cfg_if! { - if #[cfg(libc_align)] { - #[macro_use] - mod align; - } else { - #[macro_use] - mod no_align; - } -} -expand_align!(); diff --git a/vendor/libc/src/unix/uclibc/x86_64/other.rs b/vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/other.rs similarity index 100% rename from vendor/libc/src/unix/uclibc/x86_64/other.rs rename to vendor/libc/src/unix/linux_like/linux/uclibc/x86_64/other.rs diff --git a/vendor/libc/src/unix/linux_like/mod.rs b/vendor/libc/src/unix/linux_like/mod.rs index d5299b2c38..2a1b95f10a 100644 --- a/vendor/libc/src/unix/linux_like/mod.rs +++ b/vendor/libc/src/unix/linux_like/mod.rs @@ -546,13 +546,18 @@ pub const PROT_READ: ::c_int = 1; pub const PROT_WRITE: ::c_int = 2; pub const PROT_EXEC: ::c_int = 4; -pub const LC_CTYPE: ::c_int = 0; -pub const LC_NUMERIC: ::c_int = 1; -pub const LC_TIME: ::c_int = 2; -pub const LC_COLLATE: ::c_int = 3; -pub const LC_MONETARY: ::c_int = 4; -pub const LC_MESSAGES: ::c_int = 5; -pub const LC_ALL: ::c_int = 6; +cfg_if! { + if #[cfg(not(target_env = "uclibc"))] { + pub const LC_CTYPE: ::c_int = 0; + pub const LC_NUMERIC: ::c_int = 1; + pub const LC_TIME: ::c_int = 2; + pub const LC_COLLATE: ::c_int = 3; + pub const LC_MONETARY: ::c_int = 4; + pub const LC_MESSAGES: ::c_int = 5; + pub const LC_ALL: ::c_int = 6; + } +} + pub const LC_CTYPE_MASK: ::c_int = 1 << LC_CTYPE; pub const LC_NUMERIC_MASK: ::c_int = 1 << LC_NUMERIC; pub const LC_TIME_MASK: ::c_int = 1 << LC_TIME; @@ -855,7 +860,6 @@ pub const IPPROTO_NONE: ::c_int = 59; /// IP6 destination option pub const IPPROTO_DSTOPTS: ::c_int = 60; pub const IPPROTO_MTP: ::c_int = 92; -pub const IPPROTO_BEETPH: ::c_int = 94; /// encapsulation header pub const IPPROTO_ENCAP: ::c_int = 98; /// Protocol indep. multicast @@ -866,7 +870,6 @@ pub const IPPROTO_COMP: ::c_int = 108; pub const IPPROTO_SCTP: ::c_int = 132; pub const IPPROTO_MH: ::c_int = 135; pub const IPPROTO_UDPLITE: ::c_int = 136; -pub const IPPROTO_MPLS: ::c_int = 137; /// raw IP packet pub const IPPROTO_RAW: ::c_int = 255; @@ -905,7 +908,6 @@ pub const IPV6_JOIN_ANYCAST: ::c_int = 27; pub const IPV6_LEAVE_ANYCAST: ::c_int = 28; pub const IPV6_IPSEC_POLICY: ::c_int = 34; pub const IPV6_XFRM_POLICY: ::c_int = 35; -pub const IPV6_HDRINCL: ::c_int = 36; pub const IPV6_RECVPKTINFO: ::c_int = 49; pub const IPV6_PKTINFO: ::c_int = 50; pub const IPV6_RECVHOPLIMIT: ::c_int = 51; @@ -941,8 +943,6 @@ pub const IPV6_PMTUDISC_DONT: ::c_int = 0; pub const IPV6_PMTUDISC_WANT: ::c_int = 1; pub const IPV6_PMTUDISC_DO: ::c_int = 2; pub const IPV6_PMTUDISC_PROBE: ::c_int = 3; -pub const IPV6_PMTUDISC_INTERFACE: ::c_int = 4; -pub const IPV6_PMTUDISC_OMIT: ::c_int = 5; pub const TCP_NODELAY: ::c_int = 1; pub const TCP_MAXSEG: ::c_int = 2; @@ -1081,7 +1081,6 @@ pub const CLONE_NEWUSER: ::c_int = 0x10000000; pub const CLONE_NEWPID: ::c_int = 0x20000000; pub const CLONE_NEWNET: ::c_int = 0x40000000; pub const CLONE_IO: ::c_int = 0x80000000; -pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; pub const WNOHANG: ::c_int = 0x00000001; pub const WUNTRACED: ::c_int = 0x00000002; @@ -1091,15 +1090,11 @@ pub const WCONTINUED: ::c_int = 0x00000008; pub const WNOWAIT: ::c_int = 0x01000000; // Options for personality(2). -pub const ADDR_NO_RANDOMIZE: ::c_int = 0x0040000; pub const MMAP_PAGE_ZERO: ::c_int = 0x0100000; -pub const ADDR_COMPAT_LAYOUT: ::c_int = 0x0200000; -pub const READ_IMPLIES_EXEC: ::c_int = 0x0400000; pub const ADDR_LIMIT_32BIT: ::c_int = 0x0800000; pub const SHORT_INODE: ::c_int = 0x1000000; pub const WHOLE_SECONDS: ::c_int = 0x2000000; pub const STICKY_TIMEOUTS: ::c_int = 0x4000000; -pub const ADDR_LIMIT_3GB: ::c_int = 0x8000000; // Options set using PTRACE_SETOPTIONS. pub const PTRACE_O_TRACESYSGOOD: ::c_int = 0x00000001; @@ -1110,9 +1105,6 @@ pub const PTRACE_O_TRACEEXEC: ::c_int = 0x00000010; pub const PTRACE_O_TRACEVFORKDONE: ::c_int = 0x00000020; pub const PTRACE_O_TRACEEXIT: ::c_int = 0x00000040; pub const PTRACE_O_TRACESECCOMP: ::c_int = 0x00000080; -pub const PTRACE_O_EXITKILL: ::c_int = 0x00100000; -pub const PTRACE_O_SUSPEND_SECCOMP: ::c_int = 0x00200000; -pub const PTRACE_O_MASK: ::c_int = 0x003000ff; // Wait extended result codes for the above trace options. pub const PTRACE_EVENT_FORK: ::c_int = 1; @@ -1309,6 +1301,24 @@ pub const ARPHRD_IEEE802154: u16 = 804; pub const ARPHRD_VOID: u16 = 0xFFFF; pub const ARPHRD_NONE: u16 = 0xFFFE; +cfg_if! { + if #[cfg(not(target_env = "uclibc"))] { + pub const IPPROTO_BEETPH: ::c_int = 94; + pub const IPPROTO_MPLS: ::c_int = 137; + pub const IPV6_HDRINCL: ::c_int = 36; + pub const IPV6_PMTUDISC_INTERFACE: ::c_int = 4; + pub const IPV6_PMTUDISC_OMIT: ::c_int = 5; + pub const CLONE_NEWCGROUP: ::c_int = 0x02000000; + pub const ADDR_NO_RANDOMIZE: ::c_int = 0x0040000; + pub const ADDR_COMPAT_LAYOUT: ::c_int = 0x0200000; + pub const READ_IMPLIES_EXEC: ::c_int = 0x0400000; + pub const ADDR_LIMIT_3GB: ::c_int = 0x8000000; + pub const PTRACE_O_EXITKILL: ::c_int = 0x00100000; + pub const PTRACE_O_SUSPEND_SECCOMP: ::c_int = 0x00200000; + pub const PTRACE_O_MASK: ::c_int = 0x003000ff; + } +} + const_fn! { {const} fn CMSG_ALIGN(len: usize) -> usize { len + ::mem::size_of::() - 1 & !(::mem::size_of::() - 1) @@ -1536,24 +1546,6 @@ extern "C" { count: ::size_t, offset: off64_t, ) -> ::ssize_t; - pub fn preadv64( - fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int, - offset: ::off64_t, - ) -> ::ssize_t; - pub fn pwrite64( - fd: ::c_int, - buf: *const ::c_void, - count: ::size_t, - offset: off64_t, - ) -> ::ssize_t; - pub fn pwritev64( - fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int, - offset: ::off64_t, - ) -> ::ssize_t; pub fn readdir64(dirp: *mut ::DIR) -> *mut ::dirent64; pub fn readdir64_r( dirp: *mut ::DIR, @@ -1633,19 +1625,6 @@ extern "C" { options: ::c_int, rusage: *mut ::rusage, ) -> ::pid_t; - pub fn openpty( - amaster: *mut ::c_int, - aslave: *mut ::c_int, - name: *mut ::c_char, - termp: *const termios, - winp: *const ::winsize, - ) -> ::c_int; - pub fn forkpty( - amaster: *mut ::c_int, - name: *mut ::c_char, - termp: *const termios, - winp: *const ::winsize, - ) -> ::pid_t; pub fn login_tty(fd: ::c_int) -> ::c_int; pub fn execvpe( file: *const ::c_char, @@ -1689,6 +1668,46 @@ extern "C" { pub fn uname(buf: *mut ::utsname) -> ::c_int; } +cfg_if! { + if #[cfg(not(target_env = "uclibc"))] { + extern "C" { + pub fn preadv64( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off64_t, + ) -> ::ssize_t; + pub fn pwrite64( + fd: ::c_int, + buf: *const ::c_void, + count: ::size_t, + offset: off64_t, + ) -> ::ssize_t; + pub fn pwritev64( + fd: ::c_int, + iov: *const ::iovec, + iovcnt: ::c_int, + offset: ::off64_t, + ) -> ::ssize_t; + // uclibc has separate non-const version of this function + pub fn forkpty( + amaster: *mut ::c_int, + name: *mut ::c_char, + termp: *const termios, + winp: *const ::winsize, + ) -> ::pid_t; + // uclibc has separate non-const version of this function + pub fn openpty( + amaster: *mut ::c_int, + aslave: *mut ::c_int, + name: *mut ::c_char, + termp: *const termios, + winp: *const ::winsize, + ) -> ::c_int; + } + } +} + cfg_if! { if #[cfg(target_os = "emscripten")] { mod emscripten; @@ -1696,6 +1715,9 @@ cfg_if! { } else if #[cfg(target_os = "linux")] { mod linux; pub use self::linux::*; + } else if #[cfg(target_os = "l4re")] { + mod linux; + pub use self::linux::*; } else if #[cfg(target_os = "android")] { mod android; pub use self::android::*; diff --git a/vendor/libc/src/unix/mod.rs b/vendor/libc/src/unix/mod.rs index 45a9aff4d5..b3c0b47141 100644 --- a/vendor/libc/src/unix/mod.rs +++ b/vendor/libc/src/unix/mod.rs @@ -227,7 +227,8 @@ pub const S_ISGID: ::mode_t = 0x400; pub const S_ISVTX: ::mode_t = 0x200; cfg_if! { - if #[cfg(not(any(target_os = "illumos", target_os = "solaris")))] { + if #[cfg(not(any(target_os = "haiku", target_os = "illumos", + target_os = "solaris")))] { pub const IF_NAMESIZE: ::size_t = 16; pub const IFNAMSIZ: ::size_t = IF_NAMESIZE; } @@ -260,12 +261,15 @@ pub const LOG_LOCAL5: ::c_int = 21 << 3; pub const LOG_LOCAL6: ::c_int = 22 << 3; pub const LOG_LOCAL7: ::c_int = 23 << 3; -pub const LOG_PID: ::c_int = 0x01; -pub const LOG_CONS: ::c_int = 0x02; -pub const LOG_ODELAY: ::c_int = 0x04; -pub const LOG_NDELAY: ::c_int = 0x08; -pub const LOG_NOWAIT: ::c_int = 0x10; - +cfg_if! { + if #[cfg(not(target_os = "haiku"))] { + pub const LOG_PID: ::c_int = 0x01; + pub const LOG_CONS: ::c_int = 0x02; + pub const LOG_ODELAY: ::c_int = 0x04; + pub const LOG_NDELAY: ::c_int = 0x08; + pub const LOG_NOWAIT: ::c_int = 0x10; + } +} pub const LOG_PRIMASK: ::c_int = 7; pub const LOG_FACMASK: ::c_int = 0x3f8; @@ -454,10 +458,7 @@ extern "C" { ptr: *mut *mut c_char, sizeloc: *mut size_t, ) -> *mut FILE; - pub fn open_wmemstream( - ptr: *mut *mut wchar_t, - sizeloc: *mut size_t, - ) -> *mut FILE; + pub fn fflush(file: *mut FILE) -> c_int; pub fn fclose(file: *mut FILE) -> c_int; pub fn remove(filename: *const c_char) -> c_int; @@ -622,15 +623,24 @@ extern "C" { ... ) -> ::c_int; pub fn sprintf(s: *mut ::c_char, format: *const ::c_char, ...) -> ::c_int; - #[cfg_attr(target_os = "linux", link_name = "__isoc99_fscanf")] + #[cfg_attr( + all(target_os = "linux", not(target_env = "uclibc")), + link_name = "__isoc99_fscanf" + )] pub fn fscanf( stream: *mut ::FILE, format: *const ::c_char, ... ) -> ::c_int; - #[cfg_attr(target_os = "linux", link_name = "__isoc99_scanf")] + #[cfg_attr( + all(target_os = "linux", not(target_env = "uclibc")), + link_name = "__isoc99_scanf" + )] pub fn scanf(format: *const ::c_char, ...) -> ::c_int; - #[cfg_attr(target_os = "linux", link_name = "__isoc99_sscanf")] + #[cfg_attr( + all(target_os = "linux", not(target_env = "uclibc")), + link_name = "__isoc99_sscanf" + )] pub fn sscanf(s: *const ::c_char, format: *const ::c_char, ...) -> ::c_int; pub fn getchar_unlocked() -> ::c_int; @@ -1572,6 +1582,17 @@ extern "C" { pub fn lockf(fd: ::c_int, cmd: ::c_int, len: ::off_t) -> ::c_int; } +cfg_if! { + if #[cfg(not(target_env = "uclibc"))] { + extern "C" { + pub fn open_wmemstream( + ptr: *mut *mut wchar_t, + sizeloc: *mut size_t, + ) -> *mut FILE; + } + } +} + cfg_if! { if #[cfg(not(target_os = "redox"))] { extern { @@ -1627,13 +1648,11 @@ cfg_if! { } cfg_if! { - if #[cfg(target_env = "uclibc")] { - mod uclibc; - pub use self::uclibc::*; - } else if #[cfg(target_env = "newlib")] { + if #[cfg(target_env = "newlib")] { mod newlib; pub use self::newlib::*; } else if #[cfg(any(target_os = "linux", + target_os = "l4re", target_os = "android", target_os = "emscripten"))] { mod linux_like; diff --git a/vendor/libc/src/unix/solarish/illumos.rs b/vendor/libc/src/unix/solarish/illumos.rs index 49aeb9c9d5..184f73b522 100644 --- a/vendor/libc/src/unix/solarish/illumos.rs +++ b/vendor/libc/src/unix/solarish/illumos.rs @@ -27,6 +27,12 @@ pub const TCP_KEEPCNT: ::c_int = 35; pub const TCP_KEEPINTVL: ::c_int = 36; pub const TCP_CONGESTION: ::c_int = 37; +pub const F_OFD_GETLK: ::c_int = 50; +pub const F_OFD_SETLKL: ::c_int = 51; +pub const F_OFD_SETLKW: ::c_int = 52; +pub const F_FLOCK: ::c_int = 55; +pub const F_FLOCKW: ::c_int = 56; + extern "C" { pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int; diff --git a/vendor/libc/src/unix/solarish/mod.rs b/vendor/libc/src/unix/solarish/mod.rs index 0b8757e1d0..2db4916a52 100644 --- a/vendor/libc/src/unix/solarish/mod.rs +++ b/vendor/libc/src/unix/solarish/mod.rs @@ -946,10 +946,15 @@ pub const SIGEV_NONE: ::c_int = 1; pub const SIGEV_SIGNAL: ::c_int = 2; pub const SIGEV_THREAD: ::c_int = 3; +pub const IP_RECVDSTADDR: ::c_int = 0x7; +pub const IP_SEC_OPT: ::c_int = 0x22; + pub const IPV6_UNICAST_HOPS: ::c_int = 0x5; pub const IPV6_MULTICAST_IF: ::c_int = 0x6; pub const IPV6_MULTICAST_HOPS: ::c_int = 0x7; pub const IPV6_MULTICAST_LOOP: ::c_int = 0x8; +pub const IPV6_RECVPKTINFO: ::c_int = 0x12; +pub const IPV6_SEC_OPT: ::c_int = 0x22; pub const IPV6_V6ONLY: ::c_int = 0x27; cfg_if! { @@ -994,10 +999,12 @@ pub const O_EXCL: ::c_int = 1024; pub const O_NOCTTY: ::c_int = 2048; pub const O_TRUNC: ::c_int = 512; pub const O_NOFOLLOW: ::c_int = 0x20000; +pub const O_DIRECTORY: ::c_int = 0x1000000; pub const O_SEARCH: ::c_int = 0x200000; pub const O_EXEC: ::c_int = 0x400000; pub const O_CLOEXEC: ::c_int = 0x800000; pub const O_ACCMODE: ::c_int = 0x600003; +pub const O_XATTR: ::c_int = 0x4000; pub const S_IFIFO: mode_t = 4096; pub const S_IFCHR: mode_t = 8192; pub const S_IFBLK: mode_t = 24576; @@ -1036,6 +1043,12 @@ pub const F_DUPFD_CLOEXEC: ::c_int = 37; pub const F_SETLK: ::c_int = 6; pub const F_SETLKW: ::c_int = 7; pub const F_GETLK: ::c_int = 14; +pub const F_ALLOCSP: ::c_int = 10; +pub const F_FREESP: ::c_int = 11; +pub const F_BLOCKS: ::c_int = 18; +pub const F_BLKSIZE: ::c_int = 19; +pub const F_SHARE: ::c_int = 40; +pub const F_UNSHARE: ::c_int = 41; pub const SIGHUP: ::c_int = 1; pub const SIGINT: ::c_int = 2; pub const SIGQUIT: ::c_int = 3; @@ -1264,10 +1277,13 @@ pub const EAI_SYSTEM: ::c_int = 11; pub const EAI_OVERFLOW: ::c_int = 12; pub const F_DUPFD: ::c_int = 0; +pub const F_DUP2FD: ::c_int = 9; +pub const F_DUP2FD_CLOEXEC: ::c_int = 36; pub const F_GETFD: ::c_int = 1; pub const F_SETFD: ::c_int = 2; pub const F_GETFL: ::c_int = 3; pub const F_SETFL: ::c_int = 4; +pub const F_GETXFL: ::c_int = 45; pub const SIGTRAP: ::c_int = 5; @@ -1415,6 +1431,8 @@ pub const TCP_RTO_MIN: ::c_int = 0x1a; pub const TCP_RTO_MAX: ::c_int = 0x1b; pub const TCP_LINGER2: ::c_int = 0x1c; +pub const UDP_NAT_T_ENDPOINT: ::c_int = 0x0103; + pub const SOL_SOCKET: ::c_int = 0xffff; pub const SO_DEBUG: ::c_int = 0x01; pub const SO_ACCEPTCONN: ::c_int = 0x0002; @@ -2533,7 +2551,7 @@ extern "C" { // The epoll functions are actually only present on illumos. However, // there are things using epoll on illumos (built using the - // x86_64-sun-solaris target) which would break until the illumos target is + // x86_64-pc-solaris target) which would break until the illumos target is // present in rustc. pub fn epoll_pwait( epfd: ::c_int, diff --git a/vendor/libc/src/unix/uclibc/align.rs b/vendor/libc/src/unix/uclibc/align.rs deleted file mode 100644 index 76b524d0c0..0000000000 --- a/vendor/libc/src/unix/uclibc/align.rs +++ /dev/null @@ -1,66 +0,0 @@ -macro_rules! expand_align { - () => { - s! { - #[cfg_attr(any(target_pointer_width = "32", - target_arch = "x86_64", - target_arch = "powerpc64", - target_arch = "mips64", - target_arch = "s390x", - target_arch = "sparc64"), - repr(align(4)))] - #[cfg_attr(not(any(target_pointer_width = "32", - target_arch = "x86_64", - target_arch = "powerpc64", - target_arch = "mips64", - target_arch = "s390x", - target_arch = "sparc64")), - repr(align(8)))] - pub struct pthread_mutexattr_t { - size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T], - } - - #[repr(align(4))] - pub struct pthread_condattr_t { - size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T], - } - } - - s_no_extra_traits! { - #[repr(align(8))] - #[allow(missing_debug_implementations)] - pub struct pthread_cond_t { - size: [u8; ::__SIZEOF_PTHREAD_COND_T], - } - - #[cfg_attr(all(target_pointer_width = "32", - any(target_arch = "mips", - target_arch = "arm", - target_arch = "powerpc")), - repr(align(4)))] - #[cfg_attr(any(target_pointer_width = "64", - not(any(target_arch = "mips", - target_arch = "arm", - target_arch = "powerpc"))), - repr(align(8)))] - #[allow(missing_debug_implementations)] - pub struct pthread_mutex_t { - size: [u8; ::__SIZEOF_PTHREAD_MUTEX_T], - } - - #[cfg_attr(all(target_pointer_width = "32", - any(target_arch = "mips", - target_arch = "arm", - target_arch = "powerpc")), - repr(align(4)))] - #[cfg_attr(any(target_pointer_width = "64", - not(any(target_arch = "mips", - target_arch = "arm", - target_arch = "powerpc"))), - repr(align(8)))] - #[allow(missing_debug_implementations)] - pub struct pthread_rwlock_t { - size: [u8; ::__SIZEOF_PTHREAD_RWLOCK_T], - } - } - }; -} diff --git a/vendor/libc/src/unix/uclibc/mod.rs b/vendor/libc/src/unix/uclibc/mod.rs deleted file mode 100644 index 9b9a0bf507..0000000000 --- a/vendor/libc/src/unix/uclibc/mod.rs +++ /dev/null @@ -1,2365 +0,0 @@ -pub type sa_family_t = u16; -pub type pthread_key_t = ::c_uint; -pub type speed_t = ::c_uint; -pub type tcflag_t = ::c_uint; -pub type loff_t = ::c_longlong; -pub type clockid_t = ::c_int; -pub type key_t = ::c_int; -pub type id_t = ::c_uint; -pub type useconds_t = u32; -pub type dev_t = u64; -pub type socklen_t = u32; -pub type mode_t = u32; -pub type ino64_t = u64; -pub type off64_t = i64; -pub type blkcnt64_t = i64; -pub type rlim64_t = u64; -pub type shmatt_t = ::c_ulong; -pub type mqd_t = ::c_int; -pub type msgqnum_t = ::c_ulong; -pub type msglen_t = ::c_ulong; -pub type nfds_t = ::c_ulong; -pub type nl_item = ::c_int; -pub type idtype_t = ::c_uint; -pub type Elf32_Half = u16; -pub type Elf32_Word = u32; -pub type Elf32_Off = u32; -pub type Elf32_Addr = u32; -pub type Elf64_Half = u16; -pub type Elf64_Word = u32; -pub type Elf64_Off = u64; -pub type Elf64_Addr = u64; -pub type Elf64_Xword = u64; -pub type Elf64_Sxword = i64; - -#[cfg_attr(feature = "extra_traits", derive(Debug))] -pub enum fpos64_t {} // FIXME: fill this out with a struct -impl ::Copy for fpos64_t {} -impl ::Clone for fpos64_t { - fn clone(&self) -> fpos64_t { - *self - } -} - -#[cfg_attr(feature = "extra_traits", derive(Debug))] -pub enum timezone {} -impl ::Copy for timezone {} -impl ::Clone for timezone { - fn clone(&self) -> timezone { - *self - } -} - -s! { - pub struct in_addr { - pub s_addr: ::in_addr_t, - } - - pub struct ip_mreq { - pub imr_multiaddr: in_addr, - pub imr_interface: in_addr, - } - - pub struct sockaddr { - pub sa_family: sa_family_t, - pub sa_data: [::c_char; 14], - } - - pub struct sockaddr_in { - pub sin_family: sa_family_t, - pub sin_port: ::in_port_t, - pub sin_addr: ::in_addr, - pub sin_zero: [u8; 8], - } - - pub struct sockaddr_in6 { - pub sin6_family: sa_family_t, - pub sin6_port: ::in_port_t, - pub sin6_flowinfo: u32, - pub sin6_addr: ::in6_addr, - pub sin6_scope_id: u32, - } - - pub struct addrinfo { - pub ai_flags: ::c_int, - pub ai_family: ::c_int, - pub ai_socktype: ::c_int, - pub ai_protocol: ::c_int, - pub ai_addrlen: socklen_t, - - pub ai_addr: *mut ::sockaddr, - - pub ai_canonname: *mut c_char, - - pub ai_next: *mut addrinfo, - } - - pub struct sockaddr_ll { - pub sll_family: ::c_ushort, - pub sll_protocol: ::c_ushort, - pub sll_ifindex: ::c_int, - pub sll_hatype: ::c_ushort, - pub sll_pkttype: ::c_uchar, - pub sll_halen: ::c_uchar, - pub sll_addr: [::c_uchar; 8] - } - - pub struct fd_set { - fds_bits: [::c_ulong; FD_SETSIZE / ULONG_SIZE], - } - - pub struct tm { - pub tm_sec: ::c_int, - pub tm_min: ::c_int, - pub tm_hour: ::c_int, - pub tm_mday: ::c_int, - pub tm_mon: ::c_int, - pub tm_year: ::c_int, - pub tm_wday: ::c_int, - pub tm_yday: ::c_int, - pub tm_isdst: ::c_int, - pub tm_gmtoff: ::c_long, - pub tm_zone: *const ::c_char, - } - - pub struct sched_param { - pub sched_priority: ::c_int, - } - - pub struct Dl_info { - pub dli_fname: *const ::c_char, - pub dli_fbase: *mut ::c_void, - pub dli_sname: *const ::c_char, - pub dli_saddr: *mut ::c_void, - } - - pub struct lconv { - pub decimal_point: *mut ::c_char, - pub thousands_sep: *mut ::c_char, - pub grouping: *mut ::c_char, - pub int_curr_symbol: *mut ::c_char, - pub currency_symbol: *mut ::c_char, - pub mon_decimal_point: *mut ::c_char, - pub mon_thousands_sep: *mut ::c_char, - pub mon_grouping: *mut ::c_char, - pub positive_sign: *mut ::c_char, - pub negative_sign: *mut ::c_char, - pub int_frac_digits: ::c_char, - pub frac_digits: ::c_char, - pub p_cs_precedes: ::c_char, - pub p_sep_by_space: ::c_char, - pub n_cs_precedes: ::c_char, - pub n_sep_by_space: ::c_char, - pub p_sign_posn: ::c_char, - pub n_sign_posn: ::c_char, - pub int_p_cs_precedes: ::c_char, - pub int_p_sep_by_space: ::c_char, - pub int_n_cs_precedes: ::c_char, - pub int_n_sep_by_space: ::c_char, - pub int_p_sign_posn: ::c_char, - pub int_n_sign_posn: ::c_char, - } - - pub struct rlimit64 { - pub rlim_cur: rlim64_t, - pub rlim_max: rlim64_t, - } - - pub struct glob_t { - pub gl_pathc: ::size_t, - pub gl_pathv: *mut *mut c_char, - pub gl_offs: ::size_t, - pub gl_flags: ::c_int, - - __unused1: *mut ::c_void, - __unused2: *mut ::c_void, - __unused3: *mut ::c_void, - __unused4: *mut ::c_void, - __unused5: *mut ::c_void, - } - - pub struct ifaddrs { - pub ifa_next: *mut ifaddrs, - pub ifa_name: *mut c_char, - pub ifa_flags: ::c_uint, - pub ifa_addr: *mut ::sockaddr, - pub ifa_netmask: *mut ::sockaddr, - pub ifa_ifu: *mut ::sockaddr, // FIXME This should be a union - pub ifa_data: *mut ::c_void - } - - pub struct pthread_rwlockattr_t { - __lockkind: ::c_int, - __pshared: ::c_int, - } - - pub struct passwd { - pub pw_name: *mut ::c_char, - pub pw_passwd: *mut ::c_char, - pub pw_uid: ::uid_t, - pub pw_gid: ::gid_t, - pub pw_gecos: *mut ::c_char, - pub pw_dir: *mut ::c_char, - pub pw_shell: *mut ::c_char, - } - - pub struct spwd { - pub sp_namp: *mut ::c_char, - pub sp_pwdp: *mut ::c_char, - pub sp_lstchg: ::c_long, - pub sp_min: ::c_long, - pub sp_max: ::c_long, - pub sp_warn: ::c_long, - pub sp_inact: ::c_long, - pub sp_expire: ::c_long, - pub sp_flag: ::c_ulong, - } - - 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, - #[cfg(target_endian = "little")] - pub f_fsid: ::c_ulong, - #[cfg(target_pointer_width = "32")] - __f_unused: ::c_int, - #[cfg(target_endian = "big")] - pub f_fsid: ::c_ulong, - pub f_flag: ::c_ulong, - pub f_namemax: ::c_ulong, - __f_spare: [::c_int; 6], - } - - pub struct dqblk { - pub dqb_bhardlimit: u32, - pub dqb_bsoftlimit: u32, - pub dqb_curblocks: u32, - pub dqb_ihardlimit: u32, - pub dqb_isoftlimit: u32, - pub dqb_curinodes: u32, - pub dqb_btime: ::time_t, - pub dqb_itime: ::time_t, - } - - pub struct signalfd_siginfo { - pub ssi_signo: u32, - pub ssi_errno: i32, - pub ssi_code: i32, - pub ssi_pid: u32, - pub ssi_uid: u32, - pub ssi_fd: i32, - pub ssi_tid: u32, - pub ssi_band: u32, - pub ssi_overrun: u32, - pub ssi_trapno: u32, - pub ssi_status: i32, - pub ssi_int: i32, - pub ssi_ptr: u64, - pub ssi_utime: u64, - pub ssi_stime: u64, - pub ssi_addr: u64, - pub ssi_addr_lsb: u16, - _pad2: u16, - pub ssi_syscall: i32, - pub ssi_call_addr: u64, - pub ssi_arch: u32, - _pad: [u8; 28], - } - - pub struct fsid_t { - __val: [::c_int; 2], - } - - pub struct cpu_set_t { - #[cfg(target_pointer_width = "32")] - bits: [u32; 32], - #[cfg(target_pointer_width = "64")] - bits: [u64; 16], - } - - pub struct if_nameindex { - pub if_index: ::c_uint, - pub if_name: *mut ::c_char, - } - - // System V IPC - pub struct msginfo { - pub msgpool: ::c_int, - pub msgmap: ::c_int, - pub msgmax: ::c_int, - pub msgmnb: ::c_int, - pub msgmni: ::c_int, - pub msgssz: ::c_int, - pub msgtql: ::c_int, - pub msgseg: ::c_ushort, - } - - pub struct Elf32_Phdr { - pub p_type: Elf32_Word, - pub p_offset: Elf32_Off, - pub p_vaddr: Elf32_Addr, - pub p_paddr: Elf32_Addr, - pub p_filesz: Elf32_Word, - pub p_memsz: Elf32_Word, - pub p_flags: Elf32_Word, - pub p_align: Elf32_Word, - } - - pub struct Elf64_Phdr { - pub p_type: Elf64_Word, - pub p_flags: Elf64_Word, - pub p_offset: Elf64_Off, - pub p_vaddr: Elf64_Addr, - pub p_paddr: Elf64_Addr, - pub p_filesz: Elf64_Xword, - pub p_memsz: Elf64_Xword, - pub p_align: Elf64_Xword, - } - - pub struct dl_phdr_info { - #[cfg(target_pointer_width = "64")] - pub dlpi_addr: Elf64_Addr, - #[cfg(target_pointer_width = "32")] - pub dlpi_addr: Elf32_Addr, - pub dlpi_name: *const ::c_char, - #[cfg(target_pointer_width = "64")] - pub dlpi_phdr: *const Elf64_Phdr, - #[cfg(target_pointer_width = "32")] - pub dlpi_phdr: *const Elf32_Phdr, - #[cfg(target_pointer_width = "64")] - pub dlpi_phnum: Elf64_Half, - #[cfg(target_pointer_width = "32")] - pub dlpi_phnum: Elf32_Half, - // As of uClibc 1.0.36, the following fields are - // gated behind a "#if 0" block which always evaluates - // to false. So I'm just commenting these out and if uClibc changes - // the #if block in the future to include the following fields, these - // will probably need including here. tsidea - // - // pub dlpi_adds: ::c_ulonglong, - // pub dlpi_subs: ::c_ulonglong, - // pub dlpi_tls_modid: ::size_t, - // pub dlpi_tls_data: *mut ::c_void, - } - - pub struct ucred { - pub pid: ::pid_t, - pub uid: ::uid_t, - pub gid: ::gid_t, - } -} - -s_no_extra_traits! { - #[cfg_attr( - any(target_arch = "x86", target_arch = "x86_64"), - repr(packed) - )] - #[allow(missing_debug_implementations)] - pub struct epoll_event { - pub events: u32, - pub u64: u64, - } - - #[allow(missing_debug_implementations)] - pub struct sockaddr_un { - pub sun_family: sa_family_t, - pub sun_path: [::c_char; 108] - } - - #[allow(missing_debug_implementations)] - pub struct sockaddr_storage { - pub ss_family: sa_family_t, - __ss_align: ::size_t, - #[cfg(target_pointer_width = "32")] - __ss_pad2: [u8; 128 - 2 * 4], - #[cfg(target_pointer_width = "64")] - __ss_pad2: [u8; 128 - 2 * 8], - } - - #[allow(missing_debug_implementations)] - pub struct utsname { - pub sysname: [::c_char; 65], - pub nodename: [::c_char; 65], - pub release: [::c_char; 65], - pub version: [::c_char; 65], - pub machine: [::c_char; 65], - pub domainname: [::c_char; 65] - } - - #[allow(missing_debug_implementations)] - pub struct dirent { - pub d_ino: ::ino_t, - pub d_off: ::off_t, - pub d_reclen: ::c_ushort, - pub d_type: ::c_uchar, - pub d_name: [::c_char; 256], - } - - #[allow(missing_debug_implementations)] - pub struct dirent64 { - pub d_ino: ::ino64_t, - pub d_off: ::off64_t, - pub d_reclen: ::c_ushort, - pub d_type: ::c_uchar, - pub d_name: [::c_char; 256], - } - - pub struct mq_attr { - pub mq_flags: ::c_long, - pub mq_maxmsg: ::c_long, - pub mq_msgsize: ::c_long, - pub mq_curmsgs: ::c_long, - pad: [::c_long; 4] - } - - pub struct sockaddr_nl { - pub nl_family: ::sa_family_t, - nl_pad: ::c_ushort, - pub nl_pid: u32, - pub nl_groups: u32 - } - - pub struct sigevent { - pub sigev_value: ::sigval, - pub sigev_signo: ::c_int, - pub sigev_notify: ::c_int, - // Actually a union. We only expose sigev_notify_thread_id because it's - // the most useful member - pub sigev_notify_thread_id: ::c_int, - #[cfg(target_pointer_width = "64")] - __unused1: [::c_int; 11], - #[cfg(target_pointer_width = "32")] - __unused1: [::c_int; 12] - } -} - -cfg_if! { - if #[cfg(feature = "extra_traits")] { - impl PartialEq for mq_attr { - fn eq(&self, other: &mq_attr) -> bool { - self.mq_flags == other.mq_flags && - self.mq_maxmsg == other.mq_maxmsg && - self.mq_msgsize == other.mq_msgsize && - self.mq_curmsgs == other.mq_curmsgs - } - } - impl Eq for mq_attr {} - impl ::fmt::Debug for mq_attr { - fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { - f.debug_struct("mq_attr") - .field("mq_flags", &self.mq_flags) - .field("mq_maxmsg", &self.mq_maxmsg) - .field("mq_msgsize", &self.mq_msgsize) - .field("mq_curmsgs", &self.mq_curmsgs) - .finish() - } - } - impl ::hash::Hash for mq_attr { - fn hash(&self, state: &mut H) { - self.mq_flags.hash(state); - self.mq_maxmsg.hash(state); - self.mq_msgsize.hash(state); - self.mq_curmsgs.hash(state); - } - } - - impl PartialEq for sockaddr_nl { - fn eq(&self, other: &sockaddr_nl) -> bool { - self.nl_family == other.nl_family && - self.nl_pid == other.nl_pid && - self.nl_groups == other.nl_groups - } - } - impl Eq for sockaddr_nl {} - impl ::fmt::Debug for sockaddr_nl { - fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { - f.debug_struct("sockaddr_nl") - .field("nl_family", &self.nl_family) - .field("nl_pid", &self.nl_pid) - .field("nl_groups", &self.nl_groups) - .finish() - } - } - impl ::hash::Hash for sockaddr_nl { - fn hash(&self, state: &mut H) { - self.nl_family.hash(state); - self.nl_pid.hash(state); - self.nl_groups.hash(state); - } - } - - impl PartialEq for sigevent { - fn eq(&self, other: &sigevent) -> bool { - self.sigev_value == other.sigev_value - && self.sigev_signo == other.sigev_signo - && self.sigev_notify == other.sigev_notify - && self.sigev_notify_thread_id - == other.sigev_notify_thread_id - } - } - impl Eq for sigevent {} - impl ::fmt::Debug for sigevent { - fn fmt(&self, f: &mut ::fmt::Formatter) -> ::fmt::Result { - f.debug_struct("sigevent") - .field("sigev_value", &self.sigev_value) - .field("sigev_signo", &self.sigev_signo) - .field("sigev_notify", &self.sigev_notify) - .field("sigev_notify_thread_id", - &self.sigev_notify_thread_id) - .finish() - } - } - impl ::hash::Hash for sigevent { - fn hash(&self, state: &mut H) { - self.sigev_value.hash(state); - self.sigev_signo.hash(state); - self.sigev_notify.hash(state); - self.sigev_notify_thread_id.hash(state); - } - } - } -} - -// intentionally not public, only used for fd_set -cfg_if! { - if #[cfg(target_pointer_width = "32")] { - const ULONG_SIZE: usize = 32; - } else if #[cfg(target_pointer_width = "64")] { - const ULONG_SIZE: usize = 64; - } else { - // Unknown target_pointer_width - } -} - -pub const EXIT_FAILURE: ::c_int = 1; -pub const EXIT_SUCCESS: ::c_int = 0; -pub const RAND_MAX: ::c_int = 2147483647; -pub const EOF: ::c_int = -1; -pub const SEEK_SET: ::c_int = 0; -pub const SEEK_CUR: ::c_int = 1; -pub const SEEK_END: ::c_int = 2; -pub const _IOFBF: ::c_int = 0; -pub const _IONBF: ::c_int = 2; -pub const _IOLBF: ::c_int = 1; - -pub const F_DUPFD: ::c_int = 0; -pub const F_GETFD: ::c_int = 1; -pub const F_SETFD: ::c_int = 2; -pub const F_GETFL: ::c_int = 3; -pub const F_SETFL: ::c_int = 4; - -// Linux-specific fcntls -pub const F_SETLEASE: ::c_int = 1024; -pub const F_GETLEASE: ::c_int = 1025; -pub const F_NOTIFY: ::c_int = 1026; -pub const F_DUPFD_CLOEXEC: ::c_int = 1030; - -// FIXME(#235): Include file sealing fcntls once we have a way to verify them. - -pub const SIGTRAP: ::c_int = 5; - -pub const PTHREAD_CREATE_JOINABLE: ::c_int = 0; -pub const PTHREAD_CREATE_DETACHED: ::c_int = 1; - -pub const CLOCK_REALTIME: ::clockid_t = 0; -pub const CLOCK_MONOTONIC: ::clockid_t = 1; -pub const CLOCK_PROCESS_CPUTIME_ID: ::clockid_t = 2; -pub const CLOCK_THREAD_CPUTIME_ID: ::clockid_t = 3; -// FIXME: Add these constants once uclibc gets them. -// pub const CLOCK_SGI_CYCLE: ::clockid_t = 10; -// pub const CLOCK_TAI: ::clockid_t = 11; -pub const TIMER_ABSTIME: ::c_int = 1; - -pub const RLIMIT_CPU: ::c_int = 0; -pub const RLIMIT_FSIZE: ::c_int = 1; -pub const RLIMIT_DATA: ::c_int = 2; -pub const RLIMIT_STACK: ::c_int = 3; -pub const RLIMIT_CORE: ::c_int = 4; -pub const RLIMIT_LOCKS: ::c_int = 10; -pub const RLIMIT_SIGPENDING: ::c_int = 11; -pub const RLIMIT_MSGQUEUE: ::c_int = 12; -pub const RLIMIT_NICE: ::c_int = 13; -pub const RLIMIT_RTPRIO: ::c_int = 14; - -pub const RUSAGE_SELF: ::c_int = 0; - -pub const O_RDONLY: ::c_int = 0; -pub const O_WRONLY: ::c_int = 1; -pub const O_RDWR: ::c_int = 2; - -pub const SOCK_CLOEXEC: ::c_int = O_CLOEXEC; - -pub const S_IFIFO: ::mode_t = 4096; -pub const S_IFCHR: ::mode_t = 8192; -pub const S_IFBLK: ::mode_t = 24576; -pub const S_IFDIR: ::mode_t = 16384; -pub const S_IFREG: ::mode_t = 32768; -pub const S_IFLNK: ::mode_t = 40960; -pub const S_IFSOCK: ::mode_t = 49152; -pub const S_IFMT: ::mode_t = 61440; -pub const S_IRWXU: ::mode_t = 448; -pub const S_IXUSR: ::mode_t = 64; -pub const S_IWUSR: ::mode_t = 128; -pub const S_IRUSR: ::mode_t = 256; -pub const S_IRWXG: ::mode_t = 56; -pub const S_IXGRP: ::mode_t = 8; -pub const S_IWGRP: ::mode_t = 16; -pub const S_IRGRP: ::mode_t = 32; -pub const S_IRWXO: ::mode_t = 7; -pub const S_IXOTH: ::mode_t = 1; -pub const S_IWOTH: ::mode_t = 2; -pub const S_IROTH: ::mode_t = 4; -pub const F_OK: ::c_int = 0; -pub const R_OK: ::c_int = 4; -pub const W_OK: ::c_int = 2; -pub const X_OK: ::c_int = 1; -pub const STDIN_FILENO: ::c_int = 0; -pub const STDOUT_FILENO: ::c_int = 1; -pub const STDERR_FILENO: ::c_int = 2; -pub const SIGHUP: ::c_int = 1; -pub const SIGINT: ::c_int = 2; -pub const SIGQUIT: ::c_int = 3; -pub const SIGILL: ::c_int = 4; -pub const SIGABRT: ::c_int = 6; -pub const SIGFPE: ::c_int = 8; -pub const SIGKILL: ::c_int = 9; -pub const SIGSEGV: ::c_int = 11; -pub const SIGPIPE: ::c_int = 13; -pub const SIGALRM: ::c_int = 14; -pub const SIGTERM: ::c_int = 15; - -pub const PROT_NONE: ::c_int = 0; -pub const PROT_READ: ::c_int = 1; -pub const PROT_WRITE: ::c_int = 2; -pub const PROT_EXEC: ::c_int = 4; - -pub const LC_CTYPE: ::c_int = 0; -pub const LC_NUMERIC: ::c_int = 1; -pub const LC_MONETARY: ::c_int = 2; -pub const LC_TIME: ::c_int = 3; -pub const LC_COLLATE: ::c_int = 4; -pub const LC_MESSAGES: ::c_int = 5; -pub const LC_ALL: ::c_int = 6; -pub const LC_CTYPE_MASK: ::c_int = 1 << LC_CTYPE; -pub const LC_NUMERIC_MASK: ::c_int = 1 << LC_NUMERIC; -pub const LC_TIME_MASK: ::c_int = 1 << LC_TIME; -pub const LC_COLLATE_MASK: ::c_int = 1 << LC_COLLATE; -pub const LC_MONETARY_MASK: ::c_int = 1 << LC_MONETARY; -pub const LC_MESSAGES_MASK: ::c_int = 1 << LC_MESSAGES; -// LC_ALL_MASK defined per platform - -pub const MAP_FILE: ::c_int = 0x0000; -pub const MAP_SHARED: ::c_int = 0x0001; -pub const MAP_PRIVATE: ::c_int = 0x0002; -pub const MAP_FIXED: ::c_int = 0x0010; - -pub const MAP_FAILED: *mut ::c_void = !0 as *mut ::c_void; - -// MS_ flags for msync(2) -pub const MS_ASYNC: ::c_int = 0x0001; -pub const MS_INVALIDATE: ::c_int = 0x0002; -pub const MS_SYNC: ::c_int = 0x0004; - -// MS_ flags for mount(2) -pub const MS_RDONLY: ::c_ulong = 0x01; -pub const MS_NOSUID: ::c_ulong = 0x02; -pub const MS_NODEV: ::c_ulong = 0x04; -pub const MS_NOEXEC: ::c_ulong = 0x08; -pub const MS_SYNCHRONOUS: ::c_ulong = 0x10; -pub const MS_REMOUNT: ::c_ulong = 0x20; -pub const MS_MANDLOCK: ::c_ulong = 0x40; -pub const MS_NOATIME: ::c_ulong = 0x0400; -pub const MS_NODIRATIME: ::c_ulong = 0x0800; -pub const MS_BIND: ::c_ulong = 0x1000; -pub const MS_NOUSER: ::c_ulong = 0x80000000; -pub const MS_MGC_VAL: ::c_ulong = 0xc0ed0000; -pub const MS_MGC_MSK: ::c_ulong = 0xffff0000; -pub const MS_RMT_MASK: ::c_ulong = 0x800051; - -pub const EPERM: ::c_int = 1; -pub const ENOENT: ::c_int = 2; -pub const ESRCH: ::c_int = 3; -pub const EINTR: ::c_int = 4; -pub const EIO: ::c_int = 5; -pub const ENXIO: ::c_int = 6; -pub const E2BIG: ::c_int = 7; -pub const ENOEXEC: ::c_int = 8; -pub const EBADF: ::c_int = 9; -pub const ECHILD: ::c_int = 10; -pub const EAGAIN: ::c_int = 11; -pub const ENOMEM: ::c_int = 12; -pub const EACCES: ::c_int = 13; -pub const EFAULT: ::c_int = 14; -pub const ENOTBLK: ::c_int = 15; -pub const EBUSY: ::c_int = 16; -pub const EEXIST: ::c_int = 17; -pub const EXDEV: ::c_int = 18; -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 ENFILE: ::c_int = 23; -pub const EMFILE: ::c_int = 24; -pub const ENOTTY: ::c_int = 25; -pub const ETXTBSY: ::c_int = 26; -pub const EFBIG: ::c_int = 27; -pub const ENOSPC: ::c_int = 28; -pub const ESPIPE: ::c_int = 29; -pub const EROFS: ::c_int = 30; -pub const EMLINK: ::c_int = 31; -pub const EPIPE: ::c_int = 32; -pub const EDOM: ::c_int = 33; -pub const ERANGE: ::c_int = 34; -pub const EWOULDBLOCK: ::c_int = EAGAIN; - -pub const SCM_RIGHTS: ::c_int = 0x01; -pub const SCM_CREDENTIALS: ::c_int = 0x02; - -// netinet/in.h -// NOTE: These are in addition to the constants defined in src/unix/mod.rs - -// IPPROTO_IP defined in src/unix/mod.rs -/// Hop-by-hop option header -pub const IPPROTO_HOPOPTS: ::c_int = 0; -// IPPROTO_ICMP defined in src/unix/mod.rs -/// group mgmt protocol -pub const IPPROTO_IGMP: ::c_int = 2; -/// for compatibility -pub const IPPROTO_IPIP: ::c_int = 4; -// IPPROTO_TCP defined in src/unix/mod.rs -/// exterior gateway protocol -pub const IPPROTO_EGP: ::c_int = 8; -/// pup -pub const IPPROTO_PUP: ::c_int = 12; -// IPPROTO_UDP defined in src/unix/mod.rs -/// xns idp -pub const IPPROTO_IDP: ::c_int = 22; -/// tp-4 w/ class negotiation -pub const IPPROTO_TP: ::c_int = 29; -/// DCCP -pub const IPPROTO_DCCP: ::c_int = 33; -// IPPROTO_IPV6 defined in src/unix/mod.rs -/// IP6 routing header -pub const IPPROTO_ROUTING: ::c_int = 43; -/// IP6 fragmentation header -pub const IPPROTO_FRAGMENT: ::c_int = 44; -/// resource reservation -pub const IPPROTO_RSVP: ::c_int = 46; -/// General Routing Encap. -pub const IPPROTO_GRE: ::c_int = 47; -/// IP6 Encap Sec. Payload -pub const IPPROTO_ESP: ::c_int = 50; -/// IP6 Auth Header -pub const IPPROTO_AH: ::c_int = 51; -// IPPROTO_ICMPV6 defined in src/unix/mod.rs -/// IP6 no next header -pub const IPPROTO_NONE: ::c_int = 59; -/// IP6 destination option -pub const IPPROTO_DSTOPTS: ::c_int = 60; -pub const IPPROTO_MTP: ::c_int = 92; -pub const IPPROTO_BEETPH: ::c_int = 94; -/// encapsulation header -pub const IPPROTO_ENCAP: ::c_int = 98; -/// Protocol indep. multicast -pub const IPPROTO_PIM: ::c_int = 103; -/// IP Payload Comp. Protocol -pub const IPPROTO_COMP: ::c_int = 108; -/// SCTP -pub const IPPROTO_SCTP: ::c_int = 132; -pub const IPPROTO_MH: ::c_int = 135; -pub const IPPROTO_UDPLITE: ::c_int = 136; -pub const IPPROTO_MPLS: ::c_int = 137; -/// raw IP packet -pub const IPPROTO_RAW: ::c_int = 255; -pub const IPPROTO_MAX: ::c_int = 256; - -pub const PROT_GROWSDOWN: ::c_int = 0x1000000; -pub const PROT_GROWSUP: ::c_int = 0x2000000; - -pub const MAP_TYPE: ::c_int = 0x000f; - -pub const MADV_NORMAL: ::c_int = 0; -pub const MADV_RANDOM: ::c_int = 1; -pub const MADV_SEQUENTIAL: ::c_int = 2; -pub const MADV_WILLNEED: ::c_int = 3; -pub const MADV_DONTNEED: ::c_int = 4; -pub const MADV_REMOVE: ::c_int = 9; -pub const MADV_DONTFORK: ::c_int = 10; -pub const MADV_DOFORK: ::c_int = 11; -pub const MADV_MERGEABLE: ::c_int = 12; -pub const MADV_UNMERGEABLE: ::c_int = 13; -pub const MADV_HWPOISON: ::c_int = 100; - -// https://github.com/kraj/uClibc/blob/master/include/net/if.h#L44 -pub const IFF_UP: ::c_int = 0x1; // Interface is up. -pub const IFF_BROADCAST: ::c_int = 0x2; // Broadcast address valid. -pub const IFF_DEBUG: ::c_int = 0x4; // Turn on debugging. -pub const IFF_LOOPBACK: ::c_int = 0x8; // Is a loopback net. -pub const IFF_POINTOPOINT: ::c_int = 0x10; // Interface is point-to-point link. -pub const IFF_NOTRAILERS: ::c_int = 0x20; // Avoid use of trailers. -pub const IFF_RUNNING: ::c_int = 0x40; // Resources allocated. -pub const IFF_NOARP: ::c_int = 0x80; // No address resolution protocol. -pub const IFF_PROMISC: ::c_int = 0x100; // Receive all packets. - -// Not supported -pub const IFF_ALLMULTI: ::c_int = 0x200; // Receive all multicast packets. -pub const IFF_MASTER: ::c_int = 0x400; // Master of a load balancer. -pub const IFF_SLAVE: ::c_int = 0x800; // Slave of a load balancer. -pub const IFF_MULTICAST: ::c_int = 0x1000; // Supports multicast. -pub const IFF_PORTSEL: ::c_int = 0x2000; // Can set media type. -pub const IFF_AUTOMEDIA: ::c_int = 0x4000; // Auto media select active. - -// Dialup device with changing addresses. -pub const IFF_DYNAMIC: ::c_int = 0x8000; - -pub const SOL_IP: ::c_int = 0; -pub const SOL_TCP: ::c_int = 6; -pub const SOL_IPV6: ::c_int = 41; -pub const SOL_ICMPV6: ::c_int = 58; -pub const SOL_RAW: ::c_int = 255; -pub const SOL_DECNET: ::c_int = 261; -pub const SOL_X25: ::c_int = 262; -pub const SOL_PACKET: ::c_int = 263; -pub const SOL_ATM: ::c_int = 264; -pub const SOL_AAL: ::c_int = 265; -pub const SOL_IRDA: ::c_int = 266; - -pub const AF_UNSPEC: ::c_int = 0; -pub const AF_UNIX: ::c_int = 1; -pub const AF_LOCAL: ::c_int = 1; -pub const AF_INET: ::c_int = 2; -pub const AF_AX25: ::c_int = 3; -pub const AF_IPX: ::c_int = 4; -pub const AF_APPLETALK: ::c_int = 5; -pub const AF_NETROM: ::c_int = 6; -pub const AF_BRIDGE: ::c_int = 7; -pub const AF_ATMPVC: ::c_int = 8; -pub const AF_X25: ::c_int = 9; -pub const AF_INET6: ::c_int = 10; -pub const AF_ROSE: ::c_int = 11; -pub const AF_DECnet: ::c_int = 12; -pub const AF_NETBEUI: ::c_int = 13; -pub const AF_SECURITY: ::c_int = 14; -pub const AF_KEY: ::c_int = 15; -pub const AF_NETLINK: ::c_int = 16; -pub const AF_ROUTE: ::c_int = AF_NETLINK; -pub const AF_PACKET: ::c_int = 17; -pub const AF_ASH: ::c_int = 18; -pub const AF_ECONET: ::c_int = 19; -pub const AF_ATMSVC: ::c_int = 20; -pub const AF_SNA: ::c_int = 22; -pub const AF_IRDA: ::c_int = 23; -pub const AF_PPPOX: ::c_int = 24; -pub const AF_WANPIPE: ::c_int = 25; -pub const AF_LLC: ::c_int = 26; -pub const AF_CAN: ::c_int = 29; -pub const AF_TIPC: ::c_int = 30; -pub const AF_BLUETOOTH: ::c_int = 31; -pub const AF_IUCV: ::c_int = 32; -pub const AF_RXRPC: ::c_int = 33; -pub const AF_ISDN: ::c_int = 34; -pub const AF_PHONET: ::c_int = 35; -pub const AF_IEEE802154: ::c_int = 36; -pub const AF_CAIF: ::c_int = 37; -pub const AF_ALG: ::c_int = 38; - -pub const PF_UNSPEC: ::c_int = AF_UNSPEC; -pub const PF_UNIX: ::c_int = AF_UNIX; -pub const PF_LOCAL: ::c_int = AF_LOCAL; -pub const PF_INET: ::c_int = AF_INET; -pub const PF_AX25: ::c_int = AF_AX25; -pub const PF_IPX: ::c_int = AF_IPX; -pub const PF_APPLETALK: ::c_int = AF_APPLETALK; -pub const PF_NETROM: ::c_int = AF_NETROM; -pub const PF_BRIDGE: ::c_int = AF_BRIDGE; -pub const PF_ATMPVC: ::c_int = AF_ATMPVC; -pub const PF_X25: ::c_int = AF_X25; -pub const PF_INET6: ::c_int = AF_INET6; -pub const PF_ROSE: ::c_int = AF_ROSE; -pub const PF_DECnet: ::c_int = AF_DECnet; -pub const PF_NETBEUI: ::c_int = AF_NETBEUI; -pub const PF_SECURITY: ::c_int = AF_SECURITY; -pub const PF_KEY: ::c_int = AF_KEY; -pub const PF_NETLINK: ::c_int = AF_NETLINK; -pub const PF_ROUTE: ::c_int = AF_ROUTE; -pub const PF_PACKET: ::c_int = AF_PACKET; -pub const PF_ASH: ::c_int = AF_ASH; -pub const PF_ECONET: ::c_int = AF_ECONET; -pub const PF_ATMSVC: ::c_int = AF_ATMSVC; -pub const PF_SNA: ::c_int = AF_SNA; -pub const PF_IRDA: ::c_int = AF_IRDA; -pub const PF_PPPOX: ::c_int = AF_PPPOX; -pub const PF_WANPIPE: ::c_int = AF_WANPIPE; -pub const PF_LLC: ::c_int = AF_LLC; -pub const PF_CAN: ::c_int = AF_CAN; -pub const PF_TIPC: ::c_int = AF_TIPC; -pub const PF_BLUETOOTH: ::c_int = AF_BLUETOOTH; -pub const PF_IUCV: ::c_int = AF_IUCV; -pub const PF_RXRPC: ::c_int = AF_RXRPC; -pub const PF_ISDN: ::c_int = AF_ISDN; -pub const PF_PHONET: ::c_int = AF_PHONET; -pub const PF_IEEE802154: ::c_int = AF_IEEE802154; -pub const PF_CAIF: ::c_int = AF_CAIF; -pub const PF_ALG: ::c_int = AF_ALG; - -pub const SOMAXCONN: ::c_int = 128; - -pub const MSG_OOB: ::c_int = 1; -pub const MSG_PEEK: ::c_int = 2; -pub const MSG_DONTROUTE: ::c_int = 4; -pub const MSG_CTRUNC: ::c_int = 8; -pub const MSG_TRUNC: ::c_int = 0x20; -pub const MSG_DONTWAIT: ::c_int = 0x40; -pub const MSG_EOR: ::c_int = 0x80; -pub const MSG_WAITALL: ::c_int = 0x100; -pub const MSG_FIN: ::c_int = 0x200; -pub const MSG_SYN: ::c_int = 0x400; -pub const MSG_CONFIRM: ::c_int = 0x800; -pub const MSG_RST: ::c_int = 0x1000; -pub const MSG_ERRQUEUE: ::c_int = 0x2000; -pub const MSG_NOSIGNAL: ::c_int = 0x4000; -pub const MSG_MORE: ::c_int = 0x8000; -pub const MSG_WAITFORONE: ::c_int = 0x10000; -pub const MSG_CMSG_CLOEXEC: ::c_int = 0x40000000; - -pub const SOCK_RAW: ::c_int = 3; -pub const SOCK_RDM: ::c_int = 4; -pub const IP_MULTICAST_TTL: ::c_int = 33; -pub const IP_MULTICAST_LOOP: ::c_int = 34; -pub const IP_TTL: ::c_int = 2; -pub const IP_HDRINCL: ::c_int = 3; -pub const IP_ADD_MEMBERSHIP: ::c_int = 35; -pub const IP_DROP_MEMBERSHIP: ::c_int = 36; -pub const IPV6_ADD_MEMBERSHIP: ::c_int = 20; -pub const IPV6_DROP_MEMBERSHIP: ::c_int = 21; - -pub const IPV6_JOIN_GROUP: ::c_int = 20; -pub const IPV6_LEAVE_GROUP: ::c_int = 21; - -pub const TCP_NODELAY: ::c_int = 1; -pub const TCP_MAXSEG: ::c_int = 2; -pub const TCP_CORK: ::c_int = 3; -pub const TCP_KEEPIDLE: ::c_int = 4; -pub const TCP_KEEPINTVL: ::c_int = 5; -pub const TCP_KEEPCNT: ::c_int = 6; -pub const TCP_SYNCNT: ::c_int = 7; -pub const TCP_LINGER2: ::c_int = 8; -pub const TCP_DEFER_ACCEPT: ::c_int = 9; -pub const TCP_WINDOW_CLAMP: ::c_int = 10; -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; - -pub const SO_DEBUG: ::c_int = 1; - -pub const SHUT_RD: ::c_int = 0; -pub const SHUT_WR: ::c_int = 1; -pub const SHUT_RDWR: ::c_int = 2; - -pub const LOCK_SH: ::c_int = 1; -pub const LOCK_EX: ::c_int = 2; -pub const LOCK_NB: ::c_int = 4; -pub const LOCK_UN: ::c_int = 8; - -pub const SS_ONSTACK: ::c_int = 1; -pub const SS_DISABLE: ::c_int = 2; - -pub const PATH_MAX: ::c_int = 4096; - -pub const UIO_MAXIOV: ::c_int = 1024; - -pub const FD_SETSIZE: usize = 1024; - -pub const EPOLLIN: ::c_int = 0x1; -pub const EPOLLPRI: ::c_int = 0x2; -pub const EPOLLOUT: ::c_int = 0x4; -pub const EPOLLRDNORM: ::c_int = 0x40; -pub const EPOLLRDBAND: ::c_int = 0x80; -pub const EPOLLWRNORM: ::c_int = 0x100; -pub const EPOLLWRBAND: ::c_int = 0x200; -pub const EPOLLMSG: ::c_int = 0x400; -pub const EPOLLERR: ::c_int = 0x8; -pub const EPOLLHUP: ::c_int = 0x10; -pub const EPOLLET: ::c_int = 0x80000000; - -pub const EPOLL_CTL_ADD: ::c_int = 1; -pub const EPOLL_CTL_MOD: ::c_int = 3; -pub const EPOLL_CTL_DEL: ::c_int = 2; - -pub const MNT_DETACH: ::c_int = 0x2; -pub const MNT_EXPIRE: ::c_int = 0x4; - -pub const MNT_FORCE: ::c_int = 0x1; - -pub const Q_SYNC: ::c_int = 0x600; -pub const Q_QUOTAON: ::c_int = 0x100; -pub const Q_QUOTAOFF: ::c_int = 0x200; -pub const Q_GETQUOTA: ::c_int = 0x300; -pub const Q_SETQUOTA: ::c_int = 0x400; - -pub const TCIOFF: ::c_int = 2; -pub const TCION: ::c_int = 3; -pub const TCOOFF: ::c_int = 0; -pub const TCOON: ::c_int = 1; -pub const TCIFLUSH: ::c_int = 0; -pub const TCOFLUSH: ::c_int = 1; -pub const TCIOFLUSH: ::c_int = 2; -pub const NL0: ::tcflag_t = 0x00000000; -pub const NL1: ::tcflag_t = 0x00000100; -pub const TAB0: ::tcflag_t = 0x00000000; -pub const CR0: ::tcflag_t = 0x00000000; -pub const FF0: ::tcflag_t = 0x00000000; -pub const BS0: ::tcflag_t = 0x00000000; -pub const VT0: ::tcflag_t = 0x00000000; -pub const VERASE: usize = 2; -pub const VKILL: usize = 3; -pub const VINTR: usize = 0; -pub const VQUIT: usize = 1; -pub const VLNEXT: usize = 15; -pub const IGNBRK: ::tcflag_t = 0x00000001; -pub const BRKINT: ::tcflag_t = 0x00000002; -pub const IGNPAR: ::tcflag_t = 0x00000004; -pub const PARMRK: ::tcflag_t = 0x00000008; -pub const INPCK: ::tcflag_t = 0x00000010; -pub const ISTRIP: ::tcflag_t = 0x00000020; -pub const INLCR: ::tcflag_t = 0x00000040; -pub const IGNCR: ::tcflag_t = 0x00000080; -pub const ICRNL: ::tcflag_t = 0x00000100; -pub const IXANY: ::tcflag_t = 0x00000800; -pub const IMAXBEL: ::tcflag_t = 0x00002000; -pub const OPOST: ::tcflag_t = 0x1; -pub const CS5: ::tcflag_t = 0x00000000; -pub const CRTSCTS: ::tcflag_t = 0x80000000; -pub const ECHO: ::tcflag_t = 0x00000008; - -pub const CLONE_VM: ::c_int = 0x100; -pub const CLONE_FS: ::c_int = 0x200; -pub const CLONE_FILES: ::c_int = 0x400; -pub const CLONE_SIGHAND: ::c_int = 0x800; -pub const CLONE_PTRACE: ::c_int = 0x2000; -pub const CLONE_VFORK: ::c_int = 0x4000; -pub const CLONE_PARENT: ::c_int = 0x8000; -pub const CLONE_THREAD: ::c_int = 0x10000; -pub const CLONE_NEWNS: ::c_int = 0x20000; -pub const CLONE_SYSVSEM: ::c_int = 0x40000; -pub const CLONE_SETTLS: ::c_int = 0x80000; -pub const CLONE_PARENT_SETTID: ::c_int = 0x100000; -pub const CLONE_CHILD_CLEARTID: ::c_int = 0x200000; -pub const CLONE_DETACHED: ::c_int = 0x400000; -pub const CLONE_UNTRACED: ::c_int = 0x800000; -pub const CLONE_CHILD_SETTID: ::c_int = 0x01000000; -pub const CLONE_NEWUTS: ::c_int = 0x04000000; -pub const CLONE_NEWIPC: ::c_int = 0x08000000; -pub const CLONE_NEWUSER: ::c_int = 0x10000000; -pub const CLONE_NEWPID: ::c_int = 0x20000000; -pub const CLONE_NEWNET: ::c_int = 0x40000000; -pub const CLONE_IO: ::c_int = 0x80000000; - -pub const WNOHANG: ::c_int = 0x00000001; -pub const WUNTRACED: ::c_int = 0x00000002; -pub const WSTOPPED: ::c_int = WUNTRACED; -pub const WEXITED: ::c_int = 0x00000004; -pub const WCONTINUED: ::c_int = 0x00000008; -pub const WNOWAIT: ::c_int = 0x01000000; - -pub const __WNOTHREAD: ::c_int = 0x20000000; -pub const __WALL: ::c_int = 0x40000000; -pub const __WCLONE: ::c_int = 0x80000000; - -pub const SPLICE_F_MOVE: ::c_uint = 0x01; -pub const SPLICE_F_NONBLOCK: ::c_uint = 0x02; -pub const SPLICE_F_MORE: ::c_uint = 0x04; -pub const SPLICE_F_GIFT: ::c_uint = 0x08; - -pub const RTLD_LOCAL: ::c_int = 0; -pub const RTLD_LAZY: ::c_int = 1; - -pub const POSIX_FADV_NORMAL: ::c_int = 0; -pub const POSIX_FADV_RANDOM: ::c_int = 1; -pub const POSIX_FADV_SEQUENTIAL: ::c_int = 2; -pub const POSIX_FADV_WILLNEED: ::c_int = 3; - -pub const AT_FDCWD: ::c_int = -100; -pub const AT_SYMLINK_NOFOLLOW: ::c_int = 0x100; -pub const AT_REMOVEDIR: ::c_int = 0x200; -pub const AT_EACCESS: ::c_int = 0x200; -pub const AT_SYMLINK_FOLLOW: ::c_int = 0x400; - -pub const LOG_CRON: ::c_int = 9 << 3; -pub const LOG_AUTHPRIV: ::c_int = 10 << 3; -pub const LOG_FTP: ::c_int = 11 << 3; -pub const LOG_PERROR: ::c_int = 0x20; - -pub const POLLIN: ::c_short = 0x1; -pub const POLLPRI: ::c_short = 0x2; -pub const POLLOUT: ::c_short = 0x4; -pub const POLLERR: ::c_short = 0x8; -pub const POLLHUP: ::c_short = 0x10; -pub const POLLNVAL: ::c_short = 0x20; - -pub const PIPE_BUF: usize = 4096; - -pub const SI_LOAD_SHIFT: ::c_uint = 16; - -pub const CLD_EXITED: ::c_int = 1; -pub const CLD_KILLED: ::c_int = 2; -pub const CLD_DUMPED: ::c_int = 3; -pub const CLD_TRAPPED: ::c_int = 4; -pub const CLD_STOPPED: ::c_int = 5; -pub const CLD_CONTINUED: ::c_int = 6; - -pub const SIGEV_SIGNAL: ::c_int = 0; -pub const SIGEV_NONE: ::c_int = 1; -pub const SIGEV_THREAD: ::c_int = 2; - -pub const P_ALL: idtype_t = 0; -pub const P_PID: idtype_t = 1; -pub const P_PGID: idtype_t = 2; - -pub const UTIME_OMIT: c_long = 1073741822; -pub const UTIME_NOW: c_long = 1073741823; - -pub const L_tmpnam: ::c_uint = 20; -pub const _PC_LINK_MAX: ::c_int = 0; -pub const _PC_MAX_CANON: ::c_int = 1; -pub const _PC_MAX_INPUT: ::c_int = 2; -pub const _PC_NAME_MAX: ::c_int = 3; -pub const _PC_PATH_MAX: ::c_int = 4; -pub const _PC_PIPE_BUF: ::c_int = 5; -pub const _PC_CHOWN_RESTRICTED: ::c_int = 6; -pub const _PC_NO_TRUNC: ::c_int = 7; -pub const _PC_VDISABLE: ::c_int = 8; - -pub const _SC_ARG_MAX: ::c_int = 0; -pub const _SC_CHILD_MAX: ::c_int = 1; -pub const _SC_CLK_TCK: ::c_int = 2; -pub const _SC_NGROUPS_MAX: ::c_int = 3; -pub const _SC_OPEN_MAX: ::c_int = 4; -pub const _SC_STREAM_MAX: ::c_int = 5; -pub const _SC_TZNAME_MAX: ::c_int = 6; -pub const _SC_JOB_CONTROL: ::c_int = 7; -pub const _SC_SAVED_IDS: ::c_int = 8; -pub const _SC_REALTIME_SIGNALS: ::c_int = 9; -pub const _SC_PRIORITY_SCHEDULING: ::c_int = 10; -pub const _SC_TIMERS: ::c_int = 11; -pub const _SC_ASYNCHRONOUS_IO: ::c_int = 12; -pub const _SC_PRIORITIZED_IO: ::c_int = 13; -pub const _SC_SYNCHRONIZED_IO: ::c_int = 14; -pub const _SC_FSYNC: ::c_int = 15; -pub const _SC_MAPPED_FILES: ::c_int = 16; -pub const _SC_MEMLOCK: ::c_int = 17; -pub const _SC_MEMLOCK_RANGE: ::c_int = 18; -pub const _SC_MEMORY_PROTECTION: ::c_int = 19; -pub const _SC_MESSAGE_PASSING: ::c_int = 20; -pub const _SC_SEMAPHORES: ::c_int = 21; -pub const _SC_SHARED_MEMORY_OBJECTS: ::c_int = 22; -pub const _SC_AIO_LISTIO_MAX: ::c_int = 23; -pub const _SC_AIO_MAX: ::c_int = 24; -pub const _SC_AIO_PRIO_DELTA_MAX: ::c_int = 25; -pub const _SC_DELAYTIMER_MAX: ::c_int = 26; -pub const _SC_MQ_OPEN_MAX: ::c_int = 27; -pub const _SC_MQ_PRIO_MAX: ::c_int = 28; -pub const _SC_VERSION: ::c_int = 29; -pub const _SC_PAGESIZE: ::c_int = 30; -pub const _SC_PAGE_SIZE: ::c_int = _SC_PAGESIZE; -pub const _SC_RTSIG_MAX: ::c_int = 31; -pub const _SC_SEM_NSEMS_MAX: ::c_int = 32; -pub const _SC_SEM_VALUE_MAX: ::c_int = 33; -pub const _SC_SIGQUEUE_MAX: ::c_int = 34; -pub const _SC_TIMER_MAX: ::c_int = 35; -pub const _SC_BC_BASE_MAX: ::c_int = 36; -pub const _SC_BC_DIM_MAX: ::c_int = 37; -pub const _SC_BC_SCALE_MAX: ::c_int = 38; -pub const _SC_BC_STRING_MAX: ::c_int = 39; -pub const _SC_COLL_WEIGHTS_MAX: ::c_int = 40; -pub const _SC_EXPR_NEST_MAX: ::c_int = 42; -pub const _SC_LINE_MAX: ::c_int = 43; -pub const _SC_RE_DUP_MAX: ::c_int = 44; -pub const _SC_2_VERSION: ::c_int = 46; -pub const _SC_2_C_BIND: ::c_int = 47; -pub const _SC_2_C_DEV: ::c_int = 48; -pub const _SC_2_FORT_DEV: ::c_int = 49; -pub const _SC_2_FORT_RUN: ::c_int = 50; -pub const _SC_2_SW_DEV: ::c_int = 51; -pub const _SC_2_LOCALEDEF: ::c_int = 52; -pub const _SC_IOV_MAX: ::c_int = 60; -pub const _SC_THREADS: ::c_int = 67; -pub const _SC_THREAD_SAFE_FUNCTIONS: ::c_int = 68; -pub const _SC_GETGR_R_SIZE_MAX: ::c_int = 69; -pub const _SC_GETPW_R_SIZE_MAX: ::c_int = 70; -pub const _SC_LOGIN_NAME_MAX: ::c_int = 71; -pub const _SC_TTY_NAME_MAX: ::c_int = 72; -pub const _SC_THREAD_DESTRUCTOR_ITERATIONS: ::c_int = 73; -pub const _SC_THREAD_KEYS_MAX: ::c_int = 74; -pub const _SC_THREAD_STACK_MIN: ::c_int = 75; -pub const _SC_THREAD_THREADS_MAX: ::c_int = 76; -pub const _SC_THREAD_ATTR_STACKADDR: ::c_int = 77; -pub const _SC_THREAD_ATTR_STACKSIZE: ::c_int = 78; -pub const _SC_THREAD_PRIORITY_SCHEDULING: ::c_int = 79; -pub const _SC_THREAD_PRIO_INHERIT: ::c_int = 80; -pub const _SC_THREAD_PRIO_PROTECT: ::c_int = 81; -pub const _SC_NPROCESSORS_ONLN: ::c_int = 84; -pub const _SC_ATEXIT_MAX: ::c_int = 87; -pub const _SC_XOPEN_VERSION: ::c_int = 89; -pub const _SC_XOPEN_XCU_VERSION: ::c_int = 90; -pub const _SC_XOPEN_UNIX: ::c_int = 91; -pub const _SC_XOPEN_CRYPT: ::c_int = 92; -pub const _SC_XOPEN_ENH_I18N: ::c_int = 93; -pub const _SC_XOPEN_SHM: ::c_int = 94; -pub const _SC_2_CHAR_TERM: ::c_int = 95; -pub const _SC_2_UPE: ::c_int = 97; -pub const _SC_XBS5_ILP32_OFF32: ::c_int = 125; -pub const _SC_XBS5_ILP32_OFFBIG: ::c_int = 126; -pub const _SC_XBS5_LPBIG_OFFBIG: ::c_int = 128; -pub const _SC_XOPEN_LEGACY: ::c_int = 129; -pub const _SC_XOPEN_REALTIME: ::c_int = 130; -pub const _SC_XOPEN_REALTIME_THREADS: ::c_int = 131; -pub const _SC_HOST_NAME_MAX: ::c_int = 180; - -pub const RLIM_SAVED_MAX: ::rlim_t = RLIM_INFINITY; -pub const RLIM_SAVED_CUR: ::rlim_t = RLIM_INFINITY; - -pub const GLOB_ERR: ::c_int = 1 << 0; -pub const GLOB_MARK: ::c_int = 1 << 1; -pub const GLOB_NOSORT: ::c_int = 1 << 2; -pub const GLOB_DOOFFS: ::c_int = 1 << 3; -pub const GLOB_NOCHECK: ::c_int = 1 << 4; -pub const GLOB_APPEND: ::c_int = 1 << 5; -pub const GLOB_NOESCAPE: ::c_int = 1 << 6; - -pub const GLOB_NOSPACE: ::c_int = 1; -pub const GLOB_ABORTED: ::c_int = 2; -pub const GLOB_NOMATCH: ::c_int = 3; - -pub const POSIX_MADV_NORMAL: ::c_int = 0; -pub const POSIX_MADV_RANDOM: ::c_int = 1; -pub const POSIX_MADV_SEQUENTIAL: ::c_int = 2; -pub const POSIX_MADV_WILLNEED: ::c_int = 3; - -pub const S_IEXEC: mode_t = 64; -pub const S_IWRITE: mode_t = 128; -pub const S_IREAD: mode_t = 256; - -pub const F_LOCK: ::c_int = 1; -pub const F_TEST: ::c_int = 3; -pub const F_TLOCK: ::c_int = 2; -pub const F_ULOCK: ::c_int = 0; - -pub const ST_RDONLY: ::c_ulong = 1; -pub const ST_NOSUID: ::c_ulong = 2; -pub const ST_NODEV: ::c_ulong = 4; -pub const ST_NOEXEC: ::c_ulong = 8; -pub const ST_SYNCHRONOUS: ::c_ulong = 16; -pub const ST_MANDLOCK: ::c_ulong = 64; -pub const ST_WRITE: ::c_ulong = 128; -pub const ST_APPEND: ::c_ulong = 256; -pub const ST_IMMUTABLE: ::c_ulong = 512; -pub const ST_NOATIME: ::c_ulong = 1024; -pub const ST_NODIRATIME: ::c_ulong = 2048; - -pub const RTLD_NEXT: *mut ::c_void = -1i64 as *mut ::c_void; -pub const RTLD_DEFAULT: *mut ::c_void = 0i64 as *mut ::c_void; -pub const RTLD_NODELETE: ::c_int = 0x1000; -pub const RTLD_NOW: ::c_int = 0x2; - -pub const TCP_MD5SIG: ::c_int = 14; - -align_const! { - pub const PTHREAD_MUTEX_INITIALIZER: pthread_mutex_t = pthread_mutex_t { - size: [0; __SIZEOF_PTHREAD_MUTEX_T], - }; - pub const PTHREAD_COND_INITIALIZER: pthread_cond_t = pthread_cond_t { - size: [0; __SIZEOF_PTHREAD_COND_T], - }; - pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { - size: [0; __SIZEOF_PTHREAD_RWLOCK_T], - }; -} -pub const PTHREAD_MUTEX_NORMAL: ::c_int = 0; -pub const PTHREAD_MUTEX_RECURSIVE: ::c_int = 1; -pub const PTHREAD_MUTEX_ERRORCHECK: ::c_int = 2; -pub const PTHREAD_MUTEX_DEFAULT: ::c_int = PTHREAD_MUTEX_NORMAL; -pub const __SIZEOF_PTHREAD_COND_T: usize = 48; - -pub const SCHED_OTHER: ::c_int = 0; -pub const SCHED_FIFO: ::c_int = 1; -pub const SCHED_RR: ::c_int = 2; -pub const SCHED_BATCH: ::c_int = 3; -pub const SCHED_IDLE: ::c_int = 5; - -// System V IPC -pub const IPC_PRIVATE: ::key_t = 0; - -pub const IPC_CREAT: ::c_int = 0o1000; -pub const IPC_EXCL: ::c_int = 0o2000; -pub const IPC_NOWAIT: ::c_int = 0o4000; - -pub const IPC_RMID: ::c_int = 0; -pub const IPC_SET: ::c_int = 1; -pub const IPC_STAT: ::c_int = 2; -pub const IPC_INFO: ::c_int = 3; -pub const MSG_STAT: ::c_int = 11; -pub const MSG_INFO: ::c_int = 12; - -pub const MSG_NOERROR: ::c_int = 0o10000; -pub const MSG_EXCEPT: ::c_int = 0o20000; - -pub const SHM_R: ::c_int = 0o400; -pub const SHM_W: ::c_int = 0o200; - -pub const SHM_RDONLY: ::c_int = 0o10000; -pub const SHM_RND: ::c_int = 0o20000; -pub const SHM_REMAP: ::c_int = 0o40000; - -pub const SHM_LOCK: ::c_int = 11; -pub const SHM_UNLOCK: ::c_int = 12; - -pub const SHM_HUGETLB: ::c_int = 0o4000; -pub const SHM_NORESERVE: ::c_int = 0o10000; - -pub const EPOLLRDHUP: ::c_int = 0x2000; -pub const EPOLLONESHOT: ::c_int = 0x40000000; - -pub const QFMT_VFS_OLD: ::c_int = 1; -pub const QFMT_VFS_V0: ::c_int = 2; - -pub const EFD_SEMAPHORE: ::c_int = 0x1; - -pub const LOG_NFACILITIES: ::c_int = 24; - -pub const SEM_FAILED: *mut ::sem_t = 0 as *mut sem_t; - -pub const RB_AUTOBOOT: ::c_int = 0x01234567u32 as i32; -pub const RB_HALT_SYSTEM: ::c_int = 0xcdef0123u32 as i32; -pub const RB_ENABLE_CAD: ::c_int = 0x89abcdefu32 as i32; -pub const RB_DISABLE_CAD: ::c_int = 0x00000000u32 as i32; -pub const RB_POWER_OFF: ::c_int = 0x4321fedcu32 as i32; - -pub const AI_PASSIVE: ::c_int = 0x0001; -pub const AI_CANONNAME: ::c_int = 0x0002; -pub const AI_NUMERICHOST: ::c_int = 0x0004; -pub const AI_V4MAPPED: ::c_int = 0x0008; -pub const AI_ALL: ::c_int = 0x0010; -pub const AI_ADDRCONFIG: ::c_int = 0x0020; - -pub const AI_NUMERICSERV: ::c_int = 0x0400; - -pub const EAI_BADFLAGS: ::c_int = -1; -pub const EAI_NONAME: ::c_int = -2; -pub const EAI_AGAIN: ::c_int = -3; -pub const EAI_FAIL: ::c_int = -4; -pub const EAI_NODATA: ::c_int = -5; -pub const EAI_FAMILY: ::c_int = -6; -pub const EAI_SOCKTYPE: ::c_int = -7; -pub const EAI_SERVICE: ::c_int = -8; -pub const EAI_MEMORY: ::c_int = -10; -pub const EAI_OVERFLOW: ::c_int = -12; - -pub const NI_NUMERICHOST: ::c_int = 1; -pub const NI_NUMERICSERV: ::c_int = 2; -pub const NI_NOFQDN: ::c_int = 4; -pub const NI_NAMEREQD: ::c_int = 8; -pub const NI_DGRAM: ::c_int = 16; - -pub const SYNC_FILE_RANGE_WAIT_BEFORE: ::c_uint = 1; -pub const SYNC_FILE_RANGE_WRITE: ::c_uint = 2; -pub const SYNC_FILE_RANGE_WAIT_AFTER: ::c_uint = 4; - -pub const EAI_SYSTEM: ::c_int = -11; - -pub const MREMAP_MAYMOVE: ::c_int = 1; -pub const MREMAP_FIXED: ::c_int = 2; - -pub const PR_SET_PDEATHSIG: ::c_int = 1; -pub const PR_GET_PDEATHSIG: ::c_int = 2; - -pub const PR_GET_DUMPABLE: ::c_int = 3; -pub const PR_SET_DUMPABLE: ::c_int = 4; - -pub const PR_GET_UNALIGN: ::c_int = 5; -pub const PR_SET_UNALIGN: ::c_int = 6; -pub const PR_UNALIGN_NOPRINT: ::c_int = 1; -pub const PR_UNALIGN_SIGBUS: ::c_int = 2; - -pub const PR_GET_KEEPCAPS: ::c_int = 7; -pub const PR_SET_KEEPCAPS: ::c_int = 8; - -pub const PR_GET_FPEMU: ::c_int = 9; -pub const PR_SET_FPEMU: ::c_int = 10; -pub const PR_FPEMU_NOPRINT: ::c_int = 1; -pub const PR_FPEMU_SIGFPE: ::c_int = 2; - -pub const PR_GET_FPEXC: ::c_int = 11; -pub const PR_SET_FPEXC: ::c_int = 12; -pub const PR_FP_EXC_SW_ENABLE: ::c_int = 0x80; -pub const PR_FP_EXC_DIV: ::c_int = 0x010000; -pub const PR_FP_EXC_OVF: ::c_int = 0x020000; -pub const PR_FP_EXC_UND: ::c_int = 0x040000; -pub const PR_FP_EXC_RES: ::c_int = 0x080000; -pub const PR_FP_EXC_INV: ::c_int = 0x100000; -pub const PR_FP_EXC_DISABLED: ::c_int = 0; -pub const PR_FP_EXC_NONRECOV: ::c_int = 1; -pub const PR_FP_EXC_ASYNC: ::c_int = 2; -pub const PR_FP_EXC_PRECISE: ::c_int = 3; - -pub const PR_GET_TIMING: ::c_int = 13; -pub const PR_SET_TIMING: ::c_int = 14; -pub const PR_TIMING_STATISTICAL: ::c_int = 0; -pub const PR_TIMING_TIMESTAMP: ::c_int = 1; - -pub const PR_SET_NAME: ::c_int = 15; -pub const PR_GET_NAME: ::c_int = 16; - -pub const PR_GET_ENDIAN: ::c_int = 19; -pub const PR_SET_ENDIAN: ::c_int = 20; -pub const PR_ENDIAN_BIG: ::c_int = 0; -pub const PR_ENDIAN_LITTLE: ::c_int = 1; -pub const PR_ENDIAN_PPC_LITTLE: ::c_int = 2; - -pub const PR_GET_SECCOMP: ::c_int = 21; -pub const PR_SET_SECCOMP: ::c_int = 22; - -pub const PR_CAPBSET_READ: ::c_int = 23; -pub const PR_CAPBSET_DROP: ::c_int = 24; - -pub const PR_GET_TSC: ::c_int = 25; -pub const PR_SET_TSC: ::c_int = 26; -pub const PR_TSC_ENABLE: ::c_int = 1; -pub const PR_TSC_SIGSEGV: ::c_int = 2; - -pub const PR_GET_SECUREBITS: ::c_int = 27; -pub const PR_SET_SECUREBITS: ::c_int = 28; - -pub const PR_SET_TIMERSLACK: ::c_int = 29; -pub const PR_GET_TIMERSLACK: ::c_int = 30; - -pub const PR_TASK_PERF_EVENTS_DISABLE: ::c_int = 31; -pub const PR_TASK_PERF_EVENTS_ENABLE: ::c_int = 32; - -pub const PR_MCE_KILL: ::c_int = 33; -pub const PR_MCE_KILL_CLEAR: ::c_int = 0; -pub const PR_MCE_KILL_SET: ::c_int = 1; - -pub const PR_MCE_KILL_LATE: ::c_int = 0; -pub const PR_MCE_KILL_EARLY: ::c_int = 1; -pub const PR_MCE_KILL_DEFAULT: ::c_int = 2; - -pub const PR_MCE_KILL_GET: ::c_int = 34; - -pub const PR_SET_MM: ::c_int = 35; -pub const PR_SET_MM_START_CODE: ::c_int = 1; -pub const PR_SET_MM_END_CODE: ::c_int = 2; -pub const PR_SET_MM_START_DATA: ::c_int = 3; -pub const PR_SET_MM_END_DATA: ::c_int = 4; -pub const PR_SET_MM_START_STACK: ::c_int = 5; -pub const PR_SET_MM_START_BRK: ::c_int = 6; -pub const PR_SET_MM_BRK: ::c_int = 7; -pub const PR_SET_MM_ARG_START: ::c_int = 8; -pub const PR_SET_MM_ARG_END: ::c_int = 9; -pub const PR_SET_MM_ENV_START: ::c_int = 10; -pub const PR_SET_MM_ENV_END: ::c_int = 11; -pub const PR_SET_MM_AUXV: ::c_int = 12; -pub const PR_SET_MM_EXE_FILE: ::c_int = 13; -pub const PR_SET_MM_MAP: ::c_int = 14; -pub const PR_SET_MM_MAP_SIZE: ::c_int = 15; - -pub const PR_SET_PTRACER: ::c_int = 0x59616d61; - -pub const PR_SET_CHILD_SUBREAPER: ::c_int = 36; -pub const PR_GET_CHILD_SUBREAPER: ::c_int = 37; - -pub const PR_SET_NO_NEW_PRIVS: ::c_int = 38; -pub const PR_GET_NO_NEW_PRIVS: ::c_int = 39; - -pub const PR_GET_TID_ADDRESS: ::c_int = 40; - -pub const PR_SET_THP_DISABLE: ::c_int = 41; -pub const PR_GET_THP_DISABLE: ::c_int = 42; - -pub const GRND_NONBLOCK: ::c_uint = 0x0001; -pub const GRND_RANDOM: ::c_uint = 0x0002; - -pub const ABDAY_1: ::nl_item = 0x300; -pub const ABDAY_2: ::nl_item = 0x301; -pub const ABDAY_3: ::nl_item = 0x302; -pub const ABDAY_4: ::nl_item = 0x303; -pub const ABDAY_5: ::nl_item = 0x304; -pub const ABDAY_6: ::nl_item = 0x305; -pub const ABDAY_7: ::nl_item = 0x306; - -pub const DAY_1: ::nl_item = 0x307; -pub const DAY_2: ::nl_item = 0x308; -pub const DAY_3: ::nl_item = 0x309; -pub const DAY_4: ::nl_item = 0x30A; -pub const DAY_5: ::nl_item = 0x30B; -pub const DAY_6: ::nl_item = 0x30C; -pub const DAY_7: ::nl_item = 0x30D; - -pub const ABMON_1: ::nl_item = 0x30E; -pub const ABMON_2: ::nl_item = 0x30F; -pub const ABMON_3: ::nl_item = 0x310; -pub const ABMON_4: ::nl_item = 0x311; -pub const ABMON_5: ::nl_item = 0x312; -pub const ABMON_6: ::nl_item = 0x313; -pub const ABMON_7: ::nl_item = 0x314; -pub const ABMON_8: ::nl_item = 0x315; -pub const ABMON_9: ::nl_item = 0x316; -pub const ABMON_10: ::nl_item = 0x317; -pub const ABMON_11: ::nl_item = 0x318; -pub const ABMON_12: ::nl_item = 0x319; - -pub const MON_1: ::nl_item = 0x31A; -pub const MON_2: ::nl_item = 0x31B; -pub const MON_3: ::nl_item = 0x31C; -pub const MON_4: ::nl_item = 0x31D; -pub const MON_5: ::nl_item = 0x31E; -pub const MON_6: ::nl_item = 0x31F; -pub const MON_7: ::nl_item = 0x320; -pub const MON_8: ::nl_item = 0x321; -pub const MON_9: ::nl_item = 0x322; -pub const MON_10: ::nl_item = 0x323; -pub const MON_11: ::nl_item = 0x324; -pub const MON_12: ::nl_item = 0x325; - -pub const AM_STR: ::nl_item = 0x326; -pub const PM_STR: ::nl_item = 0x327; - -pub const D_T_FMT: ::nl_item = 0x328; -pub const D_FMT: ::nl_item = 0x329; -pub const T_FMT: ::nl_item = 0x32A; -pub const T_FMT_AMPM: ::nl_item = 0x32B; - -pub const ERA: ::nl_item = 0x32C; -pub const ERA_D_FMT: ::nl_item = 0x32E; -pub const ALT_DIGITS: ::nl_item = 0x32F; -pub const ERA_D_T_FMT: ::nl_item = 0x330; -pub const ERA_T_FMT: ::nl_item = 0x331; - -pub const CODESET: ::nl_item = 10; - -pub const CRNCYSTR: ::nl_item = 0x215; - -pub const RADIXCHAR: ::nl_item = 0x100; -pub const THOUSEP: ::nl_item = 0x101; - -pub const NOEXPR: ::nl_item = 0x501; -pub const YESSTR: ::nl_item = 0x502; -pub const NOSTR: ::nl_item = 0x503; - -pub const FILENAME_MAX: ::c_uint = 4095; - -pub const PRIO_PROCESS: ::c_int = 0; -pub const PRIO_PGRP: ::c_int = 1; -pub const PRIO_USER: ::c_int = 2; - -f! { - pub fn FD_CLR(fd: ::c_int, set: *mut fd_set) -> () { - let fd = fd as usize; - let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; - (*set).fds_bits[fd / size] &= !(1 << (fd % size)); - return - } - - pub fn FD_ISSET(fd: ::c_int, set: *mut fd_set) -> bool { - let fd = fd as usize; - let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; - return ((*set).fds_bits[fd / size] & (1 << (fd % size))) != 0 - } - - pub fn FD_SET(fd: ::c_int, set: *mut fd_set) -> () { - let fd = fd as usize; - let size = ::mem::size_of_val(&(*set).fds_bits[0]) * 8; - (*set).fds_bits[fd / size] |= 1 << (fd % size); - return - } - - pub fn FD_ZERO(set: *mut fd_set) -> () { - for slot in (*set).fds_bits.iter_mut() { - *slot = 0; - } - } - - pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () { - for slot in cpuset.bits.iter_mut() { - *slot = 0; - } - } - - pub fn CPU_SET(cpu: usize, cpuset: &mut cpu_set_t) -> () { - let size_in_bits - = 8 * ::mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc - let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); - cpuset.bits[idx] |= 1 << offset; - () - } - - pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () { - let size_in_bits - = 8 * ::mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc - let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); - cpuset.bits[idx] &= !(1 << offset); - () - } - - pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool { - let size_in_bits = 8 * ::mem::size_of_val(&cpuset.bits[0]); - let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); - 0 != (cpuset.bits[idx] & (1 << offset)) - } - - pub fn CPU_EQUAL(set1: &cpu_set_t, set2: &cpu_set_t) -> bool { - set1.bits == set2.bits - } -} - -safe_f! { - pub {const} fn WIFSTOPPED(status: ::c_int) -> bool { - (status & 0xff) == 0x7f - } - - pub {const} fn WSTOPSIG(status: ::c_int) -> ::c_int { - (status >> 8) & 0xff - } - - pub {const} fn WIFCONTINUED(status: ::c_int) -> bool { - status == 0xffff - } - - pub {const} fn WIFSIGNALED(status: ::c_int) -> bool { - ((status & 0x7f) + 1) as i8 >= 2 - } - - pub {const} fn WTERMSIG(status: ::c_int) -> ::c_int { - status & 0x7f - } - - pub {const} fn WIFEXITED(status: ::c_int) -> bool { - (status & 0x7f) == 0 - } - - pub {const} fn WEXITSTATUS(status: ::c_int) -> ::c_int { - (status >> 8) & 0xff - } - - pub {const} fn WCOREDUMP(status: ::c_int) -> bool { - (status & 0x80) != 0 - } - - pub {const} fn QCMD(cmd: ::c_int, type_: ::c_int) -> ::c_int { - (cmd << 8) | (type_ & 0x00ff) - } -} - -extern "C" { - #[cfg_attr(target_os = "linux", link_name = "__xpg_strerror_r")] - pub fn strerror_r( - errnum: ::c_int, - buf: *mut c_char, - buflen: ::size_t, - ) -> ::c_int; - - pub fn sem_destroy(sem: *mut sem_t) -> ::c_int; - pub fn sem_init( - sem: *mut sem_t, - pshared: ::c_int, - value: ::c_uint, - ) -> ::c_int; - - pub fn abs(i: ::c_int) -> ::c_int; - pub fn atof(s: *const ::c_char) -> ::c_double; - pub fn labs(i: ::c_long) -> ::c_long; - pub fn rand() -> ::c_int; - pub fn srand(seed: ::c_uint); - - pub fn fdatasync(fd: ::c_int) -> ::c_int; - pub fn gettimeofday(tp: *mut ::timeval, tz: *mut ::timezone) -> ::c_int; - pub fn mincore( - addr: *mut ::c_void, - len: ::size_t, - vec: *mut ::c_uchar, - ) -> ::c_int; - pub fn clock_getres(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; - pub fn clock_gettime(clk_id: ::clockid_t, tp: *mut ::timespec) -> ::c_int; - pub fn clock_nanosleep( - clk_id: ::clockid_t, - flags: ::c_int, - rqtp: *const ::timespec, - rmtp: *mut ::timespec, - ) -> ::c_int; - pub fn clock_settime( - clk_id: ::clockid_t, - tp: *const ::timespec, - ) -> ::c_int; - pub fn prctl(option: ::c_int, ...) -> ::c_int; - pub fn pthread_getattr_np( - native: ::pthread_t, - attr: *mut ::pthread_attr_t, - ) -> ::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 memalign(align: ::size_t, size: ::size_t) -> *mut ::c_void; - pub fn setgroups(ngroups: ::size_t, ptr: *const ::gid_t) -> ::c_int; - pub fn initgroups(user: *const ::c_char, group: ::gid_t) -> ::c_int; - pub fn sched_setscheduler( - pid: ::pid_t, - policy: ::c_int, - param: *const ::sched_param, - ) -> ::c_int; - pub fn sched_getscheduler(pid: ::pid_t) -> ::c_int; - pub fn sched_get_priority_max(policy: ::c_int) -> ::c_int; - pub fn sched_get_priority_min(policy: ::c_int) -> ::c_int; - pub fn epoll_create(size: ::c_int) -> ::c_int; - pub fn epoll_create1(flags: ::c_int) -> ::c_int; - pub fn epoll_ctl( - epfd: ::c_int, - op: ::c_int, - fd: ::c_int, - event: *mut ::epoll_event, - ) -> ::c_int; - pub fn epoll_wait( - epfd: ::c_int, - events: *mut ::epoll_event, - maxevents: ::c_int, - timeout: ::c_int, - ) -> ::c_int; - pub fn pipe2(fds: *mut ::c_int, flags: ::c_int) -> ::c_int; - pub fn mount( - src: *const ::c_char, - target: *const ::c_char, - fstype: *const ::c_char, - flags: ::c_ulong, - data: *const ::c_void, - ) -> ::c_int; - pub fn umount(target: *const ::c_char) -> ::c_int; - pub fn umount2(target: *const ::c_char, flags: ::c_int) -> ::c_int; - pub fn clone( - cb: extern "C" fn(*mut ::c_void) -> ::c_int, - child_stack: *mut ::c_void, - flags: ::c_int, - arg: *mut ::c_void, - ... - ) -> ::c_int; - pub fn statfs(path: *const ::c_char, buf: *mut statfs) -> ::c_int; - pub fn fstatfs(fd: ::c_int, buf: *mut statfs) -> ::c_int; - pub fn memrchr( - cx: *const ::c_void, - c: ::c_int, - n: ::size_t, - ) -> *mut ::c_void; - pub fn syscall(num: ::c_long, ...) -> ::c_long; - pub fn sendfile( - out_fd: ::c_int, - in_fd: ::c_int, - offset: *mut off_t, - count: ::size_t, - ) -> ::ssize_t; - pub fn splice( - fd_in: ::c_int, - off_in: *mut ::loff_t, - fd_out: ::c_int, - off_out: *mut ::loff_t, - len: ::size_t, - flags: ::c_uint, - ) -> ::ssize_t; - pub fn tee( - fd_in: ::c_int, - fd_out: ::c_int, - len: ::size_t, - flags: ::c_uint, - ) -> ::ssize_t; - pub fn vmsplice( - fd: ::c_int, - iov: *const ::iovec, - nr_segs: ::size_t, - flags: ::c_uint, - ) -> ::ssize_t; - - pub fn posix_fadvise( - fd: ::c_int, - offset: ::off_t, - len: ::off_t, - advise: ::c_int, - ) -> ::c_int; - pub fn getrlimit(resource: ::c_int, rlim: *mut ::rlimit) -> ::c_int; - pub fn setrlimit(resource: ::c_int, rlim: *const ::rlimit) -> ::c_int; - pub fn futimens(fd: ::c_int, times: *const ::timespec) -> ::c_int; - pub fn utimensat( - dirfd: ::c_int, - path: *const ::c_char, - times: *const ::timespec, - flag: ::c_int, - ) -> ::c_int; - pub fn duplocale(base: ::locale_t) -> ::locale_t; - pub fn freelocale(loc: ::locale_t); - pub fn newlocale( - mask: ::c_int, - locale: *const ::c_char, - base: ::locale_t, - ) -> ::locale_t; - pub fn uselocale(loc: ::locale_t) -> ::locale_t; - pub fn creat64(path: *const c_char, mode: mode_t) -> ::c_int; - pub fn fstat64(fildes: ::c_int, buf: *mut stat64) -> ::c_int; - pub fn fstatat64( - fildes: ::c_int, - path: *const ::c_char, - buf: *mut stat64, - flag: ::c_int, - ) -> ::c_int; - pub fn ftruncate64(fd: ::c_int, length: off64_t) -> ::c_int; - pub fn getrlimit64(resource: ::c_int, rlim: *mut rlimit64) -> ::c_int; - pub fn lseek64(fd: ::c_int, offset: off64_t, whence: ::c_int) -> off64_t; - pub fn lstat64(path: *const c_char, buf: *mut stat64) -> ::c_int; - pub fn mmap64( - addr: *mut ::c_void, - len: ::size_t, - prot: ::c_int, - flags: ::c_int, - fd: ::c_int, - offset: off64_t, - ) -> *mut ::c_void; - pub fn open64(path: *const c_char, oflag: ::c_int, ...) -> ::c_int; - pub fn openat64( - fd: ::c_int, - path: *const c_char, - oflag: ::c_int, - ... - ) -> ::c_int; - pub fn pread64( - fd: ::c_int, - buf: *mut ::c_void, - count: ::size_t, - offset: off64_t, - ) -> ::ssize_t; - pub fn pwrite64( - fd: ::c_int, - buf: *const ::c_void, - count: ::size_t, - offset: off64_t, - ) -> ::ssize_t; - pub fn readdir64(dirp: *mut ::DIR) -> *mut ::dirent64; - pub fn readdir64_r( - dirp: *mut ::DIR, - entry: *mut ::dirent64, - result: *mut *mut ::dirent64, - ) -> ::c_int; - pub fn setrlimit64(resource: ::c_int, rlim: *const rlimit64) -> ::c_int; - pub fn stat64(path: *const c_char, buf: *mut stat64) -> ::c_int; - pub fn truncate64(path: *const c_char, length: off64_t) -> ::c_int; - pub fn eventfd(init: ::c_uint, flags: ::c_int) -> ::c_int; - - pub fn mknodat( - dirfd: ::c_int, - pathname: *const ::c_char, - mode: ::mode_t, - dev: dev_t, - ) -> ::c_int; - pub fn ppoll( - fds: *mut ::pollfd, - nfds: nfds_t, - timeout: *const ::timespec, - sigmask: *const sigset_t, - ) -> ::c_int; - pub fn pthread_condattr_getclock( - attr: *const pthread_condattr_t, - clock_id: *mut clockid_t, - ) -> ::c_int; - pub fn pthread_condattr_setclock( - attr: *mut pthread_condattr_t, - clock_id: ::clockid_t, - ) -> ::c_int; - pub fn pthread_condattr_setpshared( - attr: *mut pthread_condattr_t, - pshared: ::c_int, - ) -> ::c_int; - pub fn pthread_condattr_getpshared( - attr: *const pthread_condattr_t, - pshared: *mut ::c_int, - ) -> ::c_int; - pub fn sched_getaffinity( - pid: ::pid_t, - cpusetsize: ::size_t, - cpuset: *mut cpu_set_t, - ) -> ::c_int; - pub fn sched_setaffinity( - pid: ::pid_t, - cpusetsize: ::size_t, - cpuset: *const cpu_set_t, - ) -> ::c_int; - pub fn unshare(flags: ::c_int) -> ::c_int; - pub fn sem_timedwait( - sem: *mut sem_t, - abstime: *const ::timespec, - ) -> ::c_int; - pub fn sem_getvalue(sem: *mut sem_t, sval: *mut ::c_int) -> ::c_int; - pub fn accept4( - fd: ::c_int, - addr: *mut ::sockaddr, - len: *mut ::socklen_t, - flg: ::c_int, - ) -> ::c_int; - pub fn pthread_mutex_timedlock( - lock: *mut pthread_mutex_t, - abstime: *const ::timespec, - ) -> ::c_int; - pub fn pthread_mutexattr_setpshared( - attr: *mut pthread_mutexattr_t, - pshared: ::c_int, - ) -> ::c_int; - pub fn pthread_mutexattr_getpshared( - attr: *const pthread_mutexattr_t, - pshared: *mut ::c_int, - ) -> ::c_int; - pub fn pthread_rwlockattr_getkind_np( - attr: *const pthread_rwlockattr_t, - val: *mut ::c_int, - ) -> ::c_int; - pub fn pthread_rwlockattr_setkind_np( - attr: *mut pthread_rwlockattr_t, - val: ::c_int, - ) -> ::c_int; - pub fn pthread_rwlockattr_getpshared( - attr: *const pthread_rwlockattr_t, - val: *mut ::c_int, - ) -> ::c_int; - pub fn pthread_rwlockattr_setpshared( - attr: *mut pthread_rwlockattr_t, - val: ::c_int, - ) -> ::c_int; - pub fn ptsname_r( - fd: ::c_int, - buf: *mut ::c_char, - buflen: ::size_t, - ) -> ::c_int; - pub fn clearenv() -> ::c_int; - pub fn waitid( - idtype: idtype_t, - id: id_t, - infop: *mut ::siginfo_t, - options: ::c_int, - ) -> ::c_int; - - pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; - - pub fn setpwent(); - pub fn endpwent(); - pub fn getpwent() -> *mut passwd; - pub fn setspent(); - pub fn endspent(); - pub fn getspent() -> *mut spwd; - pub fn getspnam(__name: *const ::c_char) -> *mut spwd; - - pub fn shm_open( - name: *const c_char, - oflag: ::c_int, - mode: mode_t, - ) -> ::c_int; - - // System V IPC - 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; - pub fn ftok(pathname: *const ::c_char, proj_id: ::c_int) -> ::key_t; - pub fn msgctl(msqid: ::c_int, cmd: ::c_int, buf: *mut msqid_ds) - -> ::c_int; - pub fn msgget(key: ::key_t, msgflg: ::c_int) -> ::c_int; - pub fn msgrcv( - msqid: ::c_int, - msgp: *mut ::c_void, - msgsz: ::size_t, - msgtyp: ::c_long, - msgflg: ::c_int, - ) -> ::ssize_t; - pub fn msgsnd( - msqid: ::c_int, - msgp: *const ::c_void, - msgsz: ::size_t, - msgflg: ::c_int, - ) -> ::c_int; - - pub fn mprotect( - addr: *mut ::c_void, - len: ::size_t, - prot: ::c_int, - ) -> ::c_int; - pub fn __errno_location() -> *mut ::c_int; - - pub fn fopen64( - filename: *const c_char, - mode: *const c_char, - ) -> *mut ::FILE; - pub fn freopen64( - filename: *const c_char, - mode: *const c_char, - file: *mut ::FILE, - ) -> *mut ::FILE; - pub fn tmpfile64() -> *mut ::FILE; - pub fn fgetpos64(stream: *mut ::FILE, ptr: *mut fpos64_t) -> ::c_int; - pub fn fsetpos64(stream: *mut ::FILE, ptr: *const fpos64_t) -> ::c_int; - pub fn fseeko64( - stream: *mut ::FILE, - offset: ::off64_t, - whence: ::c_int, - ) -> ::c_int; - pub fn ftello64(stream: *mut ::FILE) -> ::off64_t; - pub fn readahead( - fd: ::c_int, - offset: ::off64_t, - count: ::size_t, - ) -> ::ssize_t; - pub fn getxattr( - path: *const c_char, - name: *const c_char, - value: *mut ::c_void, - size: ::size_t, - ) -> ::ssize_t; - pub fn lgetxattr( - path: *const c_char, - name: *const c_char, - value: *mut ::c_void, - size: ::size_t, - ) -> ::ssize_t; - pub fn fgetxattr( - filedes: ::c_int, - name: *const c_char, - value: *mut ::c_void, - size: ::size_t, - ) -> ::ssize_t; - pub fn setxattr( - path: *const c_char, - name: *const c_char, - value: *const ::c_void, - size: ::size_t, - flags: ::c_int, - ) -> ::c_int; - pub fn lsetxattr( - path: *const c_char, - name: *const c_char, - value: *const ::c_void, - size: ::size_t, - flags: ::c_int, - ) -> ::c_int; - pub fn fsetxattr( - filedes: ::c_int, - name: *const c_char, - value: *const ::c_void, - size: ::size_t, - flags: ::c_int, - ) -> ::c_int; - pub fn listxattr( - path: *const c_char, - list: *mut c_char, - size: ::size_t, - ) -> ::ssize_t; - pub fn llistxattr( - path: *const c_char, - list: *mut c_char, - size: ::size_t, - ) -> ::ssize_t; - pub fn flistxattr( - filedes: ::c_int, - list: *mut c_char, - size: ::size_t, - ) -> ::ssize_t; - pub fn removexattr(path: *const c_char, name: *const c_char) -> ::c_int; - pub fn lremovexattr(path: *const c_char, name: *const c_char) -> ::c_int; - pub fn fremovexattr(filedes: ::c_int, name: *const c_char) -> ::c_int; - pub fn signalfd( - fd: ::c_int, - mask: *const ::sigset_t, - flags: ::c_int, - ) -> ::c_int; - pub fn quotactl( - cmd: ::c_int, - special: *const ::c_char, - id: ::c_int, - data: *mut ::c_char, - ) -> ::c_int; - pub fn mq_open(name: *const ::c_char, oflag: ::c_int, ...) -> ::mqd_t; - pub fn mq_close(mqd: ::mqd_t) -> ::c_int; - pub fn mq_unlink(name: *const ::c_char) -> ::c_int; - pub fn mq_receive( - mqd: ::mqd_t, - msg_ptr: *mut ::c_char, - msg_len: ::size_t, - msg_prio: *mut ::c_uint, - ) -> ::ssize_t; - pub fn mq_send( - mqd: ::mqd_t, - msg_ptr: *const ::c_char, - msg_len: ::size_t, - msg_prio: ::c_uint, - ) -> ::c_int; - pub fn mq_getattr(mqd: ::mqd_t, attr: *mut ::mq_attr) -> ::c_int; - pub fn mq_setattr( - mqd: ::mqd_t, - newattr: *const ::mq_attr, - oldattr: *mut ::mq_attr, - ) -> ::c_int; - pub fn epoll_pwait( - epfd: ::c_int, - events: *mut ::epoll_event, - maxevents: ::c_int, - timeout: ::c_int, - sigmask: *const ::sigset_t, - ) -> ::c_int; - pub fn sethostname(name: *const ::c_char, len: ::size_t) -> ::c_int; - pub fn sigtimedwait( - set: *const sigset_t, - info: *mut siginfo_t, - timeout: *const ::timespec, - ) -> ::c_int; - pub fn sigwaitinfo(set: *const sigset_t, info: *mut siginfo_t) -> ::c_int; - pub fn nl_langinfo_l(item: ::nl_item, locale: ::locale_t) - -> *mut ::c_char; - pub fn prlimit( - pid: ::pid_t, - resource: ::c_int, - new_limit: *const ::rlimit, - old_limit: *mut ::rlimit, - ) -> ::c_int; - pub fn prlimit64( - pid: ::pid_t, - resource: ::c_int, - new_limit: *const ::rlimit64, - old_limit: *mut ::rlimit64, - ) -> ::c_int; - pub fn reboot(how_to: ::c_int) -> ::c_int; - pub fn setfsgid(gid: ::gid_t) -> ::c_int; - pub fn setfsuid(uid: ::uid_t) -> ::c_int; - 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; - - // Not available now on Android - pub fn mkfifoat( - dirfd: ::c_int, - pathname: *const ::c_char, - mode: ::mode_t, - ) -> ::c_int; - pub fn if_nameindex() -> *mut if_nameindex; - pub fn if_freenameindex(ptr: *mut if_nameindex); - pub fn sync_file_range( - fd: ::c_int, - offset: ::off64_t, - nbytes: ::off64_t, - flags: ::c_uint, - ) -> ::c_int; - pub fn getifaddrs(ifap: *mut *mut ::ifaddrs) -> ::c_int; - pub fn freeifaddrs(ifa: *mut ::ifaddrs); - - pub fn mremap( - addr: *mut ::c_void, - len: ::size_t, - new_len: ::size_t, - flags: ::c_int, - ... - ) -> *mut ::c_void; - - pub fn glob( - pattern: *const c_char, - flags: ::c_int, - errfunc: ::Option< - extern "C" fn(epath: *const c_char, errno: ::c_int) -> ::c_int, - >, - pglob: *mut ::glob_t, - ) -> ::c_int; - pub fn globfree(pglob: *mut ::glob_t); - - pub fn shm_unlink(name: *const ::c_char) -> ::c_int; - - pub fn seekdir(dirp: *mut ::DIR, loc: ::c_long); - - pub fn dirfd(dirp: *mut ::DIR) -> ::c_int; - - pub fn telldir(dirp: *mut ::DIR) -> ::c_long; - pub fn madvise( - addr: *mut ::c_void, - len: ::size_t, - advice: ::c_int, - ) -> ::c_int; - - pub fn msync( - addr: *mut ::c_void, - len: ::size_t, - flags: ::c_int, - ) -> ::c_int; - - pub fn recvfrom( - socket: ::c_int, - buf: *mut ::c_void, - len: ::size_t, - flags: ::c_int, - addr: *mut ::sockaddr, - addrlen: *mut ::socklen_t, - ) -> ::ssize_t; - pub fn nl_langinfo(item: ::nl_item) -> *mut ::c_char; - - pub fn bind( - socket: ::c_int, - address: *const ::sockaddr, - address_len: ::socklen_t, - ) -> ::c_int; - - pub fn writev( - fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int, - ) -> ::ssize_t; - pub fn readv( - fd: ::c_int, - iov: *const ::iovec, - iovcnt: ::c_int, - ) -> ::ssize_t; - - pub fn sendmsg( - fd: ::c_int, - msg: *const ::msghdr, - flags: ::c_int, - ) -> ::ssize_t; - pub fn recvmsg( - fd: ::c_int, - msg: *mut ::msghdr, - flags: ::c_int, - ) -> ::ssize_t; - pub fn getgrgid_r( - gid: ::gid_t, - grp: *mut ::group, - buf: *mut ::c_char, - buflen: ::size_t, - result: *mut *mut ::group, - ) -> ::c_int; - pub fn sigaltstack(ss: *const stack_t, oss: *mut stack_t) -> ::c_int; - pub fn sem_close(sem: *mut sem_t) -> ::c_int; - pub fn getdtablesize() -> ::c_int; - pub fn getgrnam_r( - name: *const ::c_char, - grp: *mut ::group, - buf: *mut ::c_char, - buflen: ::size_t, - result: *mut *mut ::group, - ) -> ::c_int; - pub fn pthread_sigmask( - how: ::c_int, - set: *const sigset_t, - oldset: *mut sigset_t, - ) -> ::c_int; - pub fn sem_open(name: *const ::c_char, oflag: ::c_int, ...) -> *mut sem_t; - pub fn getgrnam(name: *const ::c_char) -> *mut ::group; - pub fn pthread_kill(thread: ::pthread_t, sig: ::c_int) -> ::c_int; - pub fn sem_unlink(name: *const ::c_char) -> ::c_int; - pub fn daemon(nochdir: ::c_int, noclose: ::c_int) -> ::c_int; - pub fn getpwnam_r( - name: *const ::c_char, - pwd: *mut passwd, - buf: *mut ::c_char, - buflen: ::size_t, - result: *mut *mut passwd, - ) -> ::c_int; - pub fn getpwuid_r( - uid: ::uid_t, - pwd: *mut passwd, - buf: *mut ::c_char, - buflen: ::size_t, - result: *mut *mut passwd, - ) -> ::c_int; - pub fn sigwait(set: *const sigset_t, sig: *mut ::c_int) -> ::c_int; - pub fn pthread_atfork( - prepare: ::Option, - parent: ::Option, - child: ::Option, - ) -> ::c_int; - pub fn pthread_create( - native: *mut ::pthread_t, - attr: *const ::pthread_attr_t, - f: extern "C" fn(*mut ::c_void) -> *mut ::c_void, - value: *mut ::c_void, - ) -> ::c_int; - pub fn dl_iterate_phdr( - callback: ::Option< - unsafe extern "C" fn( - info: *mut ::dl_phdr_info, - size: ::size_t, - data: *mut ::c_void, - ) -> ::c_int, - >, - data: *mut ::c_void, - ) -> ::c_int; - pub fn getgrgid(gid: ::gid_t) -> *mut ::group; - pub fn popen(command: *const c_char, mode: *const c_char) -> *mut ::FILE; - pub fn uname(buf: *mut ::utsname) -> ::c_int; - pub fn getnameinfo( - sa: *const ::sockaddr, - salen: ::socklen_t, - host: *mut ::c_char, - hostlen: ::socklen_t, - serv: *mut ::c_char, - sevlen: ::socklen_t, - flags: ::c_int, - ) -> ::c_int; -} - -cfg_if! { - if #[cfg(any(target_arch = "mips", target_arch = "mips64"))] { - mod mips; - pub use self::mips::*; - } else if #[cfg(target_arch = "x86_64")] { - mod x86_64; - pub use self::x86_64::*; - } else if #[cfg(target_arch = "arm")] { - mod arm; - pub use self::arm::*; - } else { - pub use unsupported_target; - } -} - -cfg_if! { - if #[cfg(libc_align)] { - #[macro_use] - mod align; - } else { - #[macro_use] - mod no_align; - } -} - -expand_align!(); diff --git a/vendor/libc/src/unix/uclibc/x86_64/align.rs b/vendor/libc/src/unix/uclibc/x86_64/align.rs deleted file mode 100644 index e2d829b507..0000000000 --- a/vendor/libc/src/unix/uclibc/x86_64/align.rs +++ /dev/null @@ -1,77 +0,0 @@ -macro_rules! expand_align { - () => { - s! { - #[cfg_attr(target_pointer_width = "32", - repr(align(4)))] - #[cfg_attr(target_pointer_width = "64", - repr(align(8)))] - pub struct sem_t { // FIXME - #[cfg(target_pointer_width = "32")] - __size: [::c_char; 16], - #[cfg(target_pointer_width = "64")] - __size: [::c_char; 32], - } - - #[cfg_attr(any(target_pointer_width = "32", - target_arch = "x86_64", - target_arch = "powerpc64", - target_arch = "mips64", - target_arch = "s390x", - target_arch = "sparc64"), - repr(align(4)))] - #[cfg_attr(not(any(target_pointer_width = "32", - target_arch = "x86_64", - target_arch = "powerpc64", - target_arch = "mips64", - target_arch = "s390x", - target_arch = "sparc64")), - repr(align(8)))] - pub struct pthread_mutexattr_t { // FIXME - size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T], - } - - #[repr(align(4))] - pub struct pthread_condattr_t { // FIXME - size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T], - } - } - - s_no_extra_traits! { - #[cfg_attr(all(target_pointer_width = "32", - any(target_arch = "mips", - target_arch = "arm", - target_arch = "powerpc")), - repr(align(4)))] - #[cfg_attr(all(any(target_pointer_width = "64", - not(any(target_arch = "mips", - target_arch = "arm", - target_arch = "powerpc")))), - repr(align(8)))] - #[allow(missing_debug_implementations)] - pub struct pthread_mutex_t { // FIXME - size: [u8; ::__SIZEOF_PTHREAD_MUTEX_T], - } - - #[repr(align(8))] - #[allow(missing_debug_implementations)] - pub struct pthread_cond_t { // FIXME - size: [u8; ::__SIZEOF_PTHREAD_COND_T], - } - - #[cfg_attr(all(target_pointer_width = "32", - any(target_arch = "mips", - target_arch = "arm", - target_arch = "powerpc")), - repr(align(4)))] - #[cfg_attr(any(target_pointer_width = "64", - not(any(target_arch = "mips", - target_arch = "arm", - target_arch = "powerpc"))), - repr(align(8)))] - #[allow(missing_debug_implementations)] - pub struct pthread_rwlock_t { // FIXME - size: [u8; ::__SIZEOF_PTHREAD_RWLOCK_T], - } - } - }; -} diff --git a/vendor/libc/src/unix/uclibc/x86_64/no_align.rs b/vendor/libc/src/unix/uclibc/x86_64/no_align.rs deleted file mode 100644 index ffa4e523f2..0000000000 --- a/vendor/libc/src/unix/uclibc/x86_64/no_align.rs +++ /dev/null @@ -1,59 +0,0 @@ -macro_rules! expand_align { - () => { - s! { - pub struct sem_t { // FIXME - #[cfg(target_pointer_width = "32")] - __size: [::c_char; 16], - #[cfg(target_pointer_width = "64")] - __size: [::c_char; 32], - __align: [::c_long; 0], - } - - pub struct pthread_mutex_t { // FIXME - #[cfg(any(target_arch = "mips", - target_arch = "arm", - target_arch = "powerpc"))] - __align: [::c_long; 0], - #[cfg(not(any(target_arch = "mips", - target_arch = "arm", - target_arch = "powerpc")))] - __align: [::c_longlong; 0], - size: [u8; ::__SIZEOF_PTHREAD_MUTEX_T], - } - - pub struct pthread_mutexattr_t { // FIXME - #[cfg(any(target_arch = "x86_64", target_arch = "powerpc64", - target_arch = "mips64", target_arch = "s390x", - target_arch = "sparc64"))] - __align: [::c_int; 0], - #[cfg(not(any(target_arch = "x86_64", target_arch = "powerpc64", - target_arch = "mips64", target_arch = "s390x", - target_arch = "sparc64")))] - __align: [::c_long; 0], - size: [u8; ::__SIZEOF_PTHREAD_MUTEXATTR_T], - } - - pub struct pthread_cond_t { // FIXME - __align: [::c_longlong; 0], - size: [u8; ::__SIZEOF_PTHREAD_COND_T], - } - - pub struct pthread_condattr_t { // FIXME - __align: [::c_int; 0], - size: [u8; ::__SIZEOF_PTHREAD_CONDATTR_T], - } - - pub struct pthread_rwlock_t { // FIXME - #[cfg(any(target_arch = "mips", - target_arch = "arm", - target_arch = "powerpc"))] - __align: [::c_long; 0], - #[cfg(not(any(target_arch = "mips", - target_arch = "arm", - target_arch = "powerpc")))] - __align: [::c_longlong; 0], - size: [u8; ::__SIZEOF_PTHREAD_RWLOCK_T], - } - } - } -} diff --git a/vendor/libc/src/vxworks/mod.rs b/vendor/libc/src/vxworks/mod.rs old mode 100755 new mode 100644 diff --git a/vendor/libc/src/wasi.rs b/vendor/libc/src/wasi.rs index e06984c98f..9aef01a5f4 100644 --- a/vendor/libc/src/wasi.rs +++ b/vendor/libc/src/wasi.rs @@ -35,6 +35,7 @@ pub type nlink_t = u64; pub type blksize_t = c_long; pub type blkcnt_t = i64; pub type nfds_t = c_ulong; +pub type wchar_t = i32; pub type __wasi_rights_t = u64; @@ -209,6 +210,7 @@ pub const POSIX_FADV_NORMAL: c_int = 0; pub const POSIX_FADV_RANDOM: c_int = 2; pub const POSIX_FADV_SEQUENTIAL: c_int = 1; pub const POSIX_FADV_WILLNEED: c_int = 3; +pub const AT_FDCWD: ::c_int = -2; pub const AT_EACCESS: c_int = 0x0; pub const AT_SYMLINK_NOFOLLOW: c_int = 0x1; pub const AT_SYMLINK_FOLLOW: c_int = 0x2; @@ -774,9 +776,116 @@ extern "C" { pub fn __wasilibc_rmdirat(fd: c_int, path: *const c_char) -> c_int; pub fn __wasilibc_find_relpath( path: *const c_char, - relative_path: *mut *const c_char, + abs_prefix: *mut *const c_char, + relative_path: *mut *mut c_char, + relative_path_len: usize, ) -> c_int; pub fn __wasilibc_tell(fd: c_int) -> ::off_t; + pub fn __wasilibc_nocwd___wasilibc_unlinkat( + dirfd: c_int, + path: *const c_char, + ) -> c_int; + pub fn __wasilibc_nocwd___wasilibc_rmdirat( + dirfd: c_int, + path: *const c_char, + ) -> c_int; + pub fn __wasilibc_nocwd_linkat( + olddirfd: c_int, + oldpath: *const c_char, + newdirfd: c_int, + newpath: *const c_char, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_nocwd_symlinkat( + target: *const c_char, + dirfd: c_int, + path: *const c_char, + ) -> c_int; + pub fn __wasilibc_nocwd_readlinkat( + dirfd: c_int, + path: *const c_char, + buf: *mut c_char, + bufsize: usize, + ) -> isize; + pub fn __wasilibc_nocwd_faccessat( + dirfd: c_int, + path: *const c_char, + mode: c_int, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_nocwd_renameat( + olddirfd: c_int, + oldpath: *const c_char, + newdirfd: c_int, + newpath: *const c_char, + ) -> c_int; + pub fn __wasilibc_nocwd_openat_nomode( + dirfd: c_int, + path: *const c_char, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_nocwd_fstatat( + dirfd: c_int, + path: *const c_char, + buf: *mut stat, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_nocwd_mkdirat_nomode( + dirfd: c_int, + path: *const c_char, + ) -> c_int; + pub fn __wasilibc_nocwd_utimensat( + dirfd: c_int, + path: *const c_char, + times: *const ::timespec, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_nocwd_opendirat( + dirfd: c_int, + path: *const c_char, + ) -> *mut ::DIR; + pub fn __wasilibc_access( + pathname: *const c_char, + mode: c_int, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_stat( + pathname: *const c_char, + buf: *mut stat, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_utimens( + pathname: *const c_char, + times: *const ::timespec, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_link( + oldpath: *const c_char, + newpath: *const c_char, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_link_oldat( + olddirfd: c_int, + oldpath: *const c_char, + newpath: *const c_char, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_link_newat( + oldpath: *const c_char, + newdirfd: c_int, + newpath: *const c_char, + flags: c_int, + ) -> c_int; + pub fn __wasilibc_rename_oldat( + olddirfd: c_int, + oldpath: *const c_char, + newpath: *const c_char, + ) -> c_int; + pub fn __wasilibc_rename_newat( + oldpath: *const c_char, + newdirfd: c_int, + newpath: *const c_char, + ) -> c_int; pub fn arc4random() -> u32; pub fn arc4random_buf(a: *mut c_void, b: size_t); diff --git a/vendor/mdbook/.cargo-checksum.json b/vendor/mdbook/.cargo-checksum.json index d205347094..440cd0924c 100644 --- a/vendor/mdbook/.cargo-checksum.json +++ b/vendor/mdbook/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"970f2ba5f35ac9b1be39f20bd3533d265f3fc2f704be60995127ac9d3c16892f","CONTRIBUTING.md":"680cef0c70325c2e45ede352422ae249ed212c65fc5f502c2267243b89187595","Cargo.lock":"f0899daedc8a2c6346d9c66708ae8b311f8851420346338d873c02210947f4c2","Cargo.toml":"d1d453ddf863d47f3016cd49249c8514813a5e90d4e78b714ce42ee7dd7420ae","LICENSE":"af175b9d96ee93c21a036152e1b905b0b95304d4ae8c2c921c7609100ba8df7e","README.md":"dd85e2b0c935a7d489889b5b4b9eeff9f233134e70fd304a51ade7d41658952b","ci/install-hub.sh":"d229a71892d2f622fecfefe3c3046efc127b25d5aa95baea2cce3391213198fb","ci/install-rust.sh":"c7b63b4aff867d6da241c23b45121f3efa9cf62b43f839f0eb0d4d0f86580dd6","ci/make-release.sh":"8d9fc60ef6445518a58c4a3ed71156d080c1f7093cf9d499754ba7afb54d61c0","examples/nop-preprocessor.rs":"db48153fed353c761ec6a64774f4340a91b4ea8c07236ef571bd7601dc5bd17b","release.toml":"25e91966f4a77515244adf5775d638590916c550f9d25bba6024d629b71840e8","src/book/book.rs":"5146aac46a065bcaeda2457ed72e847b1c57f004abe1ab3c05be8f70662e5394","src/book/init.rs":"c3bee6cba312ef7a454157ad5c9578573945d91cdc271bcabcf2c10ee08d9f1e","src/book/mod.rs":"66082e5c832a64f1e5b3ce6501c96d9cab669a0ce6ee9f7aae7b31e4706a0c04","src/book/summary.rs":"7f5f0b45a5b31dbdfc70c4fbcde60a60d1a2a771b0f2130c2d62cb06a8af0f29","src/cmd/build.rs":"7a87f609ad245a808137c9ff67a92b14238c8b01c3afc834ce166f3ff161a58f","src/cmd/clean.rs":"411579d00103568b8e904db647b6360bd8f9b11d209f595d0a6de0a6e08f8915","src/cmd/init.rs":"e56838827c0af985656902ab4e6fb2367c86f73710915548ea6866ddd86a546a","src/cmd/mod.rs":"29116e5ca90e916a5f4ce62581a29508670ef184ec3e20569e2ad90b57472abe","src/cmd/serve.rs":"a15a0d7a7cbe9e0421fb2948e6e88e7c1206602dd211d666129e67bc973ad626","src/cmd/test.rs":"405e82cc63f212ec6f41e2017d34aba369c8d581b9c1431c8696d787aa2ee1cf","src/cmd/watch.rs":"86bcf487612c03a3d30c48094aa9b23350226e3e6fbb5850799e61d6f741b81e","src/config.rs":"5220b2d95d86ea5e14a1e75387536adefb06c21334a5911bfa4b45f1e1a7444e","src/lib.rs":"535cbee58b99d30e52114d755725ce22144b5a32c7aa676f177bf10f3f9ccf01","src/main.rs":"867f696a76921341ab1f0664c20f3efb90c2c5cbdf8da34d5a52205b33481c84","src/preprocess/cmd.rs":"efe671d1ebcb00c32f6eff55bcc9beb0b53bde9e0787e1ce8c4e4f9df5b7cf23","src/preprocess/index.rs":"d6d34bc61165dd5f42005e5d601d6729c40cacd656358ede17798effa309e508","src/preprocess/links.rs":"11bfae3d9f12317d810be890d533c6c3dea3b9e456f1168c9afae1d17e8e1ead","src/preprocess/mod.rs":"b699f993473abdf6e4abbe038c8286b14312003e5d4713d946b9ae87047270e7","src/renderer/html_handlebars/hbs_renderer.rs":"f5c12a2aecc0af84067351387a6b420a962643ba48e57598ea70ee4f27eeefc2","src/renderer/html_handlebars/helpers/mod.rs":"d83520feecce350b03b7ffaa9f34d6db2fe7316a46562be694b8eef537124191","src/renderer/html_handlebars/helpers/navigation.rs":"51d6fed8f4af42af10a66bf24804337c87cf93daba893f2f3664b3683a24a9e1","src/renderer/html_handlebars/helpers/theme.rs":"06713b5de794eaf68538e929cce58fe55a6e48afd5e9d3bb211ef47809d18af2","src/renderer/html_handlebars/helpers/toc.rs":"bb60e14da7c202f0cf073dd990ded50657d3d29fb3ec9ad01da67617d9d58da8","src/renderer/html_handlebars/mod.rs":"b6be4801cf49040edc9dad216ed12c26dce87e2dc4724ee24729e4a8b67734b0","src/renderer/html_handlebars/search.rs":"16d03de4bb22934584a7d8ceb7c46e0bfae74b29ecf47a19b40a33f1c302c10e","src/renderer/markdown_renderer.rs":"319453627fa416d44e5459a3f9f4cf07b87a4133ff97df5fc962768c9235c65f","src/renderer/mod.rs":"98f69bf711878cd6a08a8934d598c72b63d00168fb49f18d0287fe1f77d8b3bf","src/theme/FontAwesome/css/font-awesome.min.css":"799aeb25cc0373fdee0e1b1db7ad6c2f6a0e058dfadaa3379689f583213190bd","src/theme/FontAwesome/fonts/FontAwesome.otf":"444dd4366615ffc4a16d012b2fa90137065d3ccb410fa6fd5e4ddd7b5e4ffcd5","src/theme/FontAwesome/fonts/fontawesome-webfont.eot":"7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979","src/theme/FontAwesome/fonts/fontawesome-webfont.svg":"ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4","src/theme/FontAwesome/fonts/fontawesome-webfont.ttf":"aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8","src/theme/FontAwesome/fonts/fontawesome-webfont.woff":"ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07","src/theme/FontAwesome/fonts/fontawesome-webfont.woff2":"2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe","src/theme/ayu-highlight.css":"c141251b5888ccc185c31976e6cb9234f7827ae6bc4975926cafc8bca5e8f83d","src/theme/book.js":"418a647fcdc6ed5388e5c669e10cb796a8d851c2b24d97c416bcb050fdaa9008","src/theme/clipboard.min.js":"1626706afc88d95ebe1173b553ec732c6dc82a576989315fdf5e7779af738a44","src/theme/css/chrome.css":"576bd3d1e4748ab1a7e000eb110f83f1b643fa4f8339b90a9305302e5c68aaeb","src/theme/css/general.css":"4c89e3e531bc5ca322e4210c8d1868d5a97df0f2a2726a7d60c192f7d933fe19","src/theme/css/print.css":"a4278dff9af38765eb9d344aa56dcc652ac79c73afc408385b62a4b611b89c14","src/theme/css/variables.css":"ccf9aa3f3dcb79b967e13658d101b3f7b9efa914ae0c5e05ac5ed322af33c5bf","src/theme/favicon.png":"8114d1fc74f4b5621ad9afde7746ed9cf7e420be317a6e29023d2298d58aa15b","src/theme/favicon.svg":"de23e50b1c4dd6e052b3e21d444fcd4b13568b3840ac3c99d9be4e9263c0ef59","src/theme/fonts/OPEN-SANS-LICENSE.txt":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","src/theme/fonts/SOURCE-CODE-PRO-LICENSE.txt":"d1e6d465a83ba1a3be52db6484868cf5812ae9bbf91abdad3900ba0165afcf93","src/theme/fonts/fonts.css":"2db113e6ebede8403c607db3dceb5acc53c247720d5955d22f7db56beb7139b6","src/theme/fonts/mod.rs":"9b97835fbc610c46245ac52f8d40df8f28ace0c4fe7aca0847835ee83cc21a15","src/theme/fonts/open-sans-v17-all-charsets-300.woff2":"7736aa3596c468515c3209f2f9d68cfae96d94c05689bcc11a5dce426a6ee2e8","src/theme/fonts/open-sans-v17-all-charsets-300italic.woff2":"2c7b95c08df0d228caec6d4bfed06da0f7ab6b76ea5cc3f75b5c6ae416bc571b","src/theme/fonts/open-sans-v17-all-charsets-600.woff2":"486c67592731a0b36a89dba1fd0b97aeb73f236bbf60dbf28d7c6b5723c07989","src/theme/fonts/open-sans-v17-all-charsets-600italic.woff2":"1a3e865977024f444834a75a1b33b89b93134c93007ae3d6e14f24e6c88d8dfb","src/theme/fonts/open-sans-v17-all-charsets-700.woff2":"c22fe8c70c36f1d862903b772eaed864d3a8fa849473c9caff224fdb852428e4","src/theme/fonts/open-sans-v17-all-charsets-700italic.woff2":"238ae9593944112bee8dd65f8ebc5f3d3862160a8a245fbe1ee3150bc9a2fd81","src/theme/fonts/open-sans-v17-all-charsets-800.woff2":"3d2c812adf74deb36fead3ff8469800d3c0b23eb2c858ae49310291f89490146","src/theme/fonts/open-sans-v17-all-charsets-800italic.woff2":"ba1521ec219db9bc5bfec0e3e7a897369d98b30d4e853ee4aa525322784428b8","src/theme/fonts/open-sans-v17-all-charsets-italic.woff2":"6c9463f7096c0b9d610e095ed248ac1e8a8da7e92d17e9be544f3baced7b62b2","src/theme/fonts/open-sans-v17-all-charsets-regular.woff2":"2e3b1d34ac67763ab50652da19305d4b3694c6b6e6bf35f4b98411ce4af646d2","src/theme/fonts/source-code-pro-v11-all-charsets-500.woff2":"2bdd9410b0141db3cbbf4cfc3818cc6fad279e8e63940940e06cd6af76ccbfcf","src/theme/head.hbs":"56b3ab3c6eabd4723d4794ecd0a7452aa8903c55a2106d60bceacc74d76311c3","src/theme/header.hbs":"1fd27c9ccd016060dc4d6e77f12bf58b26e7c604aebe2577a67097f95a3de70a","src/theme/highlight.css":"6ebb896cc720d92a56def939b787cb25a2facfcfa9d95eeac9f979b092f15716","src/theme/highlight.js":"5a2b5dadd60831dd1f82220223e2ab18e627061912cc89b5c450ab2c8f26ff90","src/theme/index.hbs":"42a8d00d81d2afa370a0f727e1a08ddeecb0a73ae860f51baed2531816e6e662","src/theme/mod.rs":"b8224089da80257f2a6550691ef4334b5f746520dfcbf61906224e4afbcf44ba","src/theme/playground_editor/ace.js":"2a3cd908c9619862b52f621ce2a40f76b772eb51c17308b14bd26d1809af8f87","src/theme/playground_editor/editor.js":"16ca416ca77428fe23cb8e18afbd3626a6a86723d6b6e189c47da95d9e9bdc31","src/theme/playground_editor/mod.rs":"b6b0f99f00ccb83cedfe5ce892834b46936a468611d056eae0f146e59711dc5c","src/theme/playground_editor/mode-rust.js":"2c9d5c9af5ae32612aef1ca5653e3473ed40747d36ecb4a97719ff14707d8535","src/theme/playground_editor/theme-dawn.js":"4493f9c88ed7185f7bb4195be77018d21cdc439a34bd4e5da64b566eb996fbe8","src/theme/playground_editor/theme-tomorrow_night.js":"9dbe62a913ebe3fd9667f41f69c0301bacd963081c69abb0219e4acac4710f60","src/theme/redirect.hbs":"c10b6e36dda1a4f222aa61cd1c6180a2f2937397379adba2c10b9b41e446709e","src/theme/searcher/elasticlunr.min.js":"ef4e11c157b1e2e89782d30bd726f2d5ff7834ea5e26ad02474325f8b1f126c9","src/theme/searcher/mark.min.js":"09e88c2cfaf23ea8a37b5681433eafea97033af632ecc948c8c1ee9944647743","src/theme/searcher/mod.rs":"36979040719b2fa39d1b78808e41cdb6e52e0ea5137c84820b437ed015278072","src/theme/searcher/searcher.js":"597b15cf5684c9293e4ecd86ceedbf88d367fe0283ec1874acd54f8b774b545b","src/theme/tomorrow-night.css":"243cb61aa526cef79b3545b1c7f2b681747dd346867c8ceb36c69487acc390fb","src/utils/fs.rs":"7af2dccfbdd375836df1ed692290f9419c63ce05dfb713d1fd8700e9cd626cf6","src/utils/mod.rs":"e4476a3afda9964cb57e29f87ee03f4d8860cdb17a7b3fe5b56e108420adc2f6","src/utils/string.rs":"43fbd36e39ee7d729f11073e6c63f230b61ffe368712d50d0e425b4d604a28f1","src/utils/toml_ext.rs":"20f88d22b19e431e15e1e9a34f0c4b4870cf38e45c766ab221d4eeaef16b2af6","tests/alternative_backends.rs":"cbff1ccc5361202870f619d438b1d84b1bb66a23a7cc91d8ce48dd29e297ac6c","tests/build_process.rs":"a958404fc41ff5c00b08b4c69d26f0862160e20c781b4bea88977d85304b6ef5","tests/custom_preprocessors.rs":"22a5da0ed34ab2fe85d87ceb70e06c2a5065d66c363a39ce7d45715ae974ad1c","tests/dummy_book/mod.rs":"b474756f39c442ecd973a3abe3b88834d745b38db40f6c290cdce6c12c8beb91","tests/dummy_book/src/README.md":"2f6e578b9f31ff5e1d18ae40865355d59e56a23e02798bd8166751245ef4eb9b","tests/dummy_book/src/SUMMARY.md":"3384fd28e2974749eedf385bd3a996b71cc248abf545a696a3fda6180d22d31a","tests/dummy_book/src/conclusion.md":"eca0543344979e938b43debf3d310290a628e8b7b45d3d9bec63c21e61284a4c","tests/dummy_book/src/example.rs":"3be109d6faa3c6104c8fb5e8ffdfe3eba73d0a5ed4f537685fe2cf2c36e657d0","tests/dummy_book/src/first/includes.md":"747f8f1eb4d394c1fdb773acddb7ffdc641e3ad71b0d15afb0f4e2de13a729ed","tests/dummy_book/src/first/index.md":"e7d1af4cb454c0be73bf1e2f01a97541fba385cd04ac5c9a7acc99809adedee8","tests/dummy_book/src/first/markdown.md":"461753f7f5105e35bc246c752065a44ea1d238f6890bd01b7c34d0a5746f7902","tests/dummy_book/src/first/nested-test-with-anchors.rs":"6fdecb4c62201f2dae36ea7e35693238edca03dcfc42d33eaf1685bc957a6d1d","tests/dummy_book/src/first/nested-test.rs":"ca4cdf552842a957be49ffc753f7585dba3c0036a076fea68174719599d426fa","tests/dummy_book/src/first/nested.md":"485d24764340c0413939e52533ab304c07bb55bd23d0ad9e31151ff889425048","tests/dummy_book/src/first/partially-included-test-with-anchors.rs":"501d96562da17cbec46444a004340e711b3fac4b3384f12d7c4844909742c8c8","tests/dummy_book/src/first/partially-included-test.rs":"1bdd1a4f8fdc41ea10868f97de0fe315b2cc592d4cf4aabd784f17dc8c0a6e90","tests/dummy_book/src/first/recursive.md":"9b574239c94c24412dbd918d7b85f557a80cec44d245663cfe1ecdd8ed16765e","tests/dummy_book/src/first/unicode.md":"04a548a642ba5cbc346670a8b38c1aeb5ad23d5a967849783171c634b682de63","tests/dummy_book/src/intro.md":"2749920beee7f563f3ace2bbef204dc66382e052c7945bf27e66912351959a90","tests/dummy_book/src/second.md":"b1344cb47f69621ed68197b81652df1f86254b71b4e3dcbdcf707a4e1fee3340","tests/dummy_book/src/second/nested.md":"b0da2ce6ce1ac5fbda92b5cf7a6a09d39abd267095a29f177e44cd4e8d333d45","tests/dummy_book/src2/README.md":"1bcffb061e737e022f132f78a2dd3193fc0951d0b104e50ddc860d9bc260f505","tests/dummy_book/src2/SUMMARY.md":"4354bec1cae7db3c48dfe869e28e8e29958daef937b33da5e729211372ccb9c9","tests/dummy_book/src2/first/README.md":"ba505ed6c1e18c85ce2ca7070021c719933ce2cf9f28de8565c188c0e4a95d87","tests/dummy_book/src2/second/README.md":"2fb4a90a1359fe3725c3d95888452afd514b0b86bdc4e2768442a71bf5b642a0","tests/dummy_book/src2/second/index.md":"5bf990bec982b9e87d8dfb230fb2dfc96318d9065f97a3d3c5cf27bd134c8bdd","tests/init.rs":"823d7f09142c26b5e40f0769440d9fa23948dbfc9168beaa35bd1082b20bccf1","tests/parse_existing_summary_files.rs":"f4b019e66ffc7f59efd7ec9da73bb70180e4cc23ff27904bf4dfd26491ef64a3","tests/rendered_output.rs":"8adc83ee161b5ee078c80eb96d0983cceb7a104686a7b82bfe4b1b91233b2019","tests/searchindex_fixture.json":"041f7fd73588b4086cdd4db01e40493fc9ebfc3ecd063aacc845c6b565e63620","tests/summary_md_files/example_book.md":"e1dd09043d9548612b0bb4e607a8796317272aa1fe7a2bda55db6e6f47d3fc5a","tests/summary_md_files/rust_by_example.md":"c46c8eab64780297b851be196a04d573da69553f4d9c33e24fbd5fb2867efbfd","tests/summary_md_files/rust_ffi_guide.md":"26874d9ad22cfdc2a587e7a495a4404247821d2b6e8eabe07334cacc5a4ea365","tests/summary_md_files/the_book-2nd_edition.md":"7ae64929c45aa7d67560c77e5280a540c22d1b0d2f8fd85f8392ce064c2d5f0a","tests/testing.rs":"c80d579682b969045d0c067f7ae5ab425255f83642f9dfd11a42f3de75e1b4a8"},"package":"b3d948b64449003363127ed6c6139f03273982c3fe97da4cb3dee933e38ce38f"} \ No newline at end of file +{"files":{"CHANGELOG.md":"1cf70386086e440049e9c7aa2324c54f42f8f3e12b734acb81b010e6c8d906e1","CONTRIBUTING.md":"680cef0c70325c2e45ede352422ae249ed212c65fc5f502c2267243b89187595","Cargo.lock":"8daf2c9f08ff3d527ecd1ae8e873f83b1fbcda0c133327b938ffcd75adefc7d8","Cargo.toml":"d1934607341973fc5e321824d2e80dab542a291c5e1bce7653b01e4f2fd67339","LICENSE":"af175b9d96ee93c21a036152e1b905b0b95304d4ae8c2c921c7609100ba8df7e","README.md":"dd85e2b0c935a7d489889b5b4b9eeff9f233134e70fd304a51ade7d41658952b","ci/install-hub.sh":"d229a71892d2f622fecfefe3c3046efc127b25d5aa95baea2cce3391213198fb","ci/install-rust.sh":"c7b63b4aff867d6da241c23b45121f3efa9cf62b43f839f0eb0d4d0f86580dd6","ci/make-release.sh":"8d9fc60ef6445518a58c4a3ed71156d080c1f7093cf9d499754ba7afb54d61c0","examples/nop-preprocessor.rs":"db48153fed353c761ec6a64774f4340a91b4ea8c07236ef571bd7601dc5bd17b","release.toml":"25e91966f4a77515244adf5775d638590916c550f9d25bba6024d629b71840e8","src/book/book.rs":"5146aac46a065bcaeda2457ed72e847b1c57f004abe1ab3c05be8f70662e5394","src/book/init.rs":"c3bee6cba312ef7a454157ad5c9578573945d91cdc271bcabcf2c10ee08d9f1e","src/book/mod.rs":"66082e5c832a64f1e5b3ce6501c96d9cab669a0ce6ee9f7aae7b31e4706a0c04","src/book/summary.rs":"7f5f0b45a5b31dbdfc70c4fbcde60a60d1a2a771b0f2130c2d62cb06a8af0f29","src/cmd/build.rs":"7a87f609ad245a808137c9ff67a92b14238c8b01c3afc834ce166f3ff161a58f","src/cmd/clean.rs":"411579d00103568b8e904db647b6360bd8f9b11d209f595d0a6de0a6e08f8915","src/cmd/init.rs":"e56838827c0af985656902ab4e6fb2367c86f73710915548ea6866ddd86a546a","src/cmd/mod.rs":"29116e5ca90e916a5f4ce62581a29508670ef184ec3e20569e2ad90b57472abe","src/cmd/serve.rs":"a15a0d7a7cbe9e0421fb2948e6e88e7c1206602dd211d666129e67bc973ad626","src/cmd/test.rs":"405e82cc63f212ec6f41e2017d34aba369c8d581b9c1431c8696d787aa2ee1cf","src/cmd/watch.rs":"86bcf487612c03a3d30c48094aa9b23350226e3e6fbb5850799e61d6f741b81e","src/config.rs":"5220b2d95d86ea5e14a1e75387536adefb06c21334a5911bfa4b45f1e1a7444e","src/lib.rs":"535cbee58b99d30e52114d755725ce22144b5a32c7aa676f177bf10f3f9ccf01","src/main.rs":"867f696a76921341ab1f0664c20f3efb90c2c5cbdf8da34d5a52205b33481c84","src/preprocess/cmd.rs":"efe671d1ebcb00c32f6eff55bcc9beb0b53bde9e0787e1ce8c4e4f9df5b7cf23","src/preprocess/index.rs":"d6d34bc61165dd5f42005e5d601d6729c40cacd656358ede17798effa309e508","src/preprocess/links.rs":"11bfae3d9f12317d810be890d533c6c3dea3b9e456f1168c9afae1d17e8e1ead","src/preprocess/mod.rs":"b699f993473abdf6e4abbe038c8286b14312003e5d4713d946b9ae87047270e7","src/renderer/html_handlebars/hbs_renderer.rs":"1cdcb08cc57dfda534e705b61acad34c548f3242460aecace1e75be50629a2ed","src/renderer/html_handlebars/helpers/mod.rs":"d83520feecce350b03b7ffaa9f34d6db2fe7316a46562be694b8eef537124191","src/renderer/html_handlebars/helpers/navigation.rs":"51d6fed8f4af42af10a66bf24804337c87cf93daba893f2f3664b3683a24a9e1","src/renderer/html_handlebars/helpers/theme.rs":"06713b5de794eaf68538e929cce58fe55a6e48afd5e9d3bb211ef47809d18af2","src/renderer/html_handlebars/helpers/toc.rs":"bb60e14da7c202f0cf073dd990ded50657d3d29fb3ec9ad01da67617d9d58da8","src/renderer/html_handlebars/mod.rs":"b6be4801cf49040edc9dad216ed12c26dce87e2dc4724ee24729e4a8b67734b0","src/renderer/html_handlebars/search.rs":"16d03de4bb22934584a7d8ceb7c46e0bfae74b29ecf47a19b40a33f1c302c10e","src/renderer/markdown_renderer.rs":"319453627fa416d44e5459a3f9f4cf07b87a4133ff97df5fc962768c9235c65f","src/renderer/mod.rs":"98f69bf711878cd6a08a8934d598c72b63d00168fb49f18d0287fe1f77d8b3bf","src/theme/FontAwesome/css/font-awesome.min.css":"799aeb25cc0373fdee0e1b1db7ad6c2f6a0e058dfadaa3379689f583213190bd","src/theme/FontAwesome/fonts/FontAwesome.otf":"444dd4366615ffc4a16d012b2fa90137065d3ccb410fa6fd5e4ddd7b5e4ffcd5","src/theme/FontAwesome/fonts/fontawesome-webfont.eot":"7bfcab6db99d5cfbf1705ca0536ddc78585432cc5fa41bbd7ad0f009033b2979","src/theme/FontAwesome/fonts/fontawesome-webfont.svg":"ad6157926c1622ba4e1d03d478f1541368524bfc46f51e42fe0d945f7ef323e4","src/theme/FontAwesome/fonts/fontawesome-webfont.ttf":"aa58f33f239a0fb02f5c7a6c45c043d7a9ac9a093335806694ecd6d4edc0d6a8","src/theme/FontAwesome/fonts/fontawesome-webfont.woff":"ba0c59deb5450f5cb41b3f93609ee2d0d995415877ddfa223e8a8a7533474f07","src/theme/FontAwesome/fonts/fontawesome-webfont.woff2":"2adefcbc041e7d18fcf2d417879dc5a09997aa64d675b7a3c4b6ce33da13f3fe","src/theme/ayu-highlight.css":"c141251b5888ccc185c31976e6cb9234f7827ae6bc4975926cafc8bca5e8f83d","src/theme/book.js":"418a647fcdc6ed5388e5c669e10cb796a8d851c2b24d97c416bcb050fdaa9008","src/theme/clipboard.min.js":"1626706afc88d95ebe1173b553ec732c6dc82a576989315fdf5e7779af738a44","src/theme/css/chrome.css":"c98f91460c02f671a6553e7495c93fd06387aa7515f1cc0e9e7918706340c833","src/theme/css/general.css":"892aeb51ea078f4a18a60a5893552f72210cda74405bae5236af47b3567e07b8","src/theme/css/print.css":"a4278dff9af38765eb9d344aa56dcc652ac79c73afc408385b62a4b611b89c14","src/theme/css/variables.css":"fb92ac934e47e6d2d6abe9c2fd055aa7dc2f63e5a71e5caefbf85cf2b248d739","src/theme/favicon.png":"8114d1fc74f4b5621ad9afde7746ed9cf7e420be317a6e29023d2298d58aa15b","src/theme/favicon.svg":"de23e50b1c4dd6e052b3e21d444fcd4b13568b3840ac3c99d9be4e9263c0ef59","src/theme/fonts/OPEN-SANS-LICENSE.txt":"cfc7749b96f63bd31c3c42b5c471bf756814053e847c10f3eb003417bc523d30","src/theme/fonts/SOURCE-CODE-PRO-LICENSE.txt":"d1e6d465a83ba1a3be52db6484868cf5812ae9bbf91abdad3900ba0165afcf93","src/theme/fonts/fonts.css":"2db113e6ebede8403c607db3dceb5acc53c247720d5955d22f7db56beb7139b6","src/theme/fonts/mod.rs":"9b97835fbc610c46245ac52f8d40df8f28ace0c4fe7aca0847835ee83cc21a15","src/theme/fonts/open-sans-v17-all-charsets-300.woff2":"7736aa3596c468515c3209f2f9d68cfae96d94c05689bcc11a5dce426a6ee2e8","src/theme/fonts/open-sans-v17-all-charsets-300italic.woff2":"2c7b95c08df0d228caec6d4bfed06da0f7ab6b76ea5cc3f75b5c6ae416bc571b","src/theme/fonts/open-sans-v17-all-charsets-600.woff2":"486c67592731a0b36a89dba1fd0b97aeb73f236bbf60dbf28d7c6b5723c07989","src/theme/fonts/open-sans-v17-all-charsets-600italic.woff2":"1a3e865977024f444834a75a1b33b89b93134c93007ae3d6e14f24e6c88d8dfb","src/theme/fonts/open-sans-v17-all-charsets-700.woff2":"c22fe8c70c36f1d862903b772eaed864d3a8fa849473c9caff224fdb852428e4","src/theme/fonts/open-sans-v17-all-charsets-700italic.woff2":"238ae9593944112bee8dd65f8ebc5f3d3862160a8a245fbe1ee3150bc9a2fd81","src/theme/fonts/open-sans-v17-all-charsets-800.woff2":"3d2c812adf74deb36fead3ff8469800d3c0b23eb2c858ae49310291f89490146","src/theme/fonts/open-sans-v17-all-charsets-800italic.woff2":"ba1521ec219db9bc5bfec0e3e7a897369d98b30d4e853ee4aa525322784428b8","src/theme/fonts/open-sans-v17-all-charsets-italic.woff2":"6c9463f7096c0b9d610e095ed248ac1e8a8da7e92d17e9be544f3baced7b62b2","src/theme/fonts/open-sans-v17-all-charsets-regular.woff2":"2e3b1d34ac67763ab50652da19305d4b3694c6b6e6bf35f4b98411ce4af646d2","src/theme/fonts/source-code-pro-v11-all-charsets-500.woff2":"2bdd9410b0141db3cbbf4cfc3818cc6fad279e8e63940940e06cd6af76ccbfcf","src/theme/head.hbs":"56b3ab3c6eabd4723d4794ecd0a7452aa8903c55a2106d60bceacc74d76311c3","src/theme/header.hbs":"1fd27c9ccd016060dc4d6e77f12bf58b26e7c604aebe2577a67097f95a3de70a","src/theme/highlight.css":"ddc0c59ce60e40756313a7e470a9440dd31558c416c5deb6944670b60b4af014","src/theme/highlight.js":"5a2b5dadd60831dd1f82220223e2ab18e627061912cc89b5c450ab2c8f26ff90","src/theme/index.hbs":"42a8d00d81d2afa370a0f727e1a08ddeecb0a73ae860f51baed2531816e6e662","src/theme/mod.rs":"b8224089da80257f2a6550691ef4334b5f746520dfcbf61906224e4afbcf44ba","src/theme/playground_editor/ace.js":"2a3cd908c9619862b52f621ce2a40f76b772eb51c17308b14bd26d1809af8f87","src/theme/playground_editor/editor.js":"16ca416ca77428fe23cb8e18afbd3626a6a86723d6b6e189c47da95d9e9bdc31","src/theme/playground_editor/mod.rs":"b6b0f99f00ccb83cedfe5ce892834b46936a468611d056eae0f146e59711dc5c","src/theme/playground_editor/mode-rust.js":"2c9d5c9af5ae32612aef1ca5653e3473ed40747d36ecb4a97719ff14707d8535","src/theme/playground_editor/theme-dawn.js":"4493f9c88ed7185f7bb4195be77018d21cdc439a34bd4e5da64b566eb996fbe8","src/theme/playground_editor/theme-tomorrow_night.js":"9dbe62a913ebe3fd9667f41f69c0301bacd963081c69abb0219e4acac4710f60","src/theme/redirect.hbs":"c10b6e36dda1a4f222aa61cd1c6180a2f2937397379adba2c10b9b41e446709e","src/theme/searcher/elasticlunr.min.js":"ef4e11c157b1e2e89782d30bd726f2d5ff7834ea5e26ad02474325f8b1f126c9","src/theme/searcher/mark.min.js":"09e88c2cfaf23ea8a37b5681433eafea97033af632ecc948c8c1ee9944647743","src/theme/searcher/mod.rs":"36979040719b2fa39d1b78808e41cdb6e52e0ea5137c84820b437ed015278072","src/theme/searcher/searcher.js":"597b15cf5684c9293e4ecd86ceedbf88d367fe0283ec1874acd54f8b774b545b","src/theme/tomorrow-night.css":"243cb61aa526cef79b3545b1c7f2b681747dd346867c8ceb36c69487acc390fb","src/utils/fs.rs":"7af2dccfbdd375836df1ed692290f9419c63ce05dfb713d1fd8700e9cd626cf6","src/utils/mod.rs":"e4476a3afda9964cb57e29f87ee03f4d8860cdb17a7b3fe5b56e108420adc2f6","src/utils/string.rs":"43fbd36e39ee7d729f11073e6c63f230b61ffe368712d50d0e425b4d604a28f1","src/utils/toml_ext.rs":"20f88d22b19e431e15e1e9a34f0c4b4870cf38e45c766ab221d4eeaef16b2af6","tests/alternative_backends.rs":"cbff1ccc5361202870f619d438b1d84b1bb66a23a7cc91d8ce48dd29e297ac6c","tests/build_process.rs":"a958404fc41ff5c00b08b4c69d26f0862160e20c781b4bea88977d85304b6ef5","tests/custom_preprocessors.rs":"22a5da0ed34ab2fe85d87ceb70e06c2a5065d66c363a39ce7d45715ae974ad1c","tests/dummy_book/mod.rs":"b474756f39c442ecd973a3abe3b88834d745b38db40f6c290cdce6c12c8beb91","tests/dummy_book/src/README.md":"2f6e578b9f31ff5e1d18ae40865355d59e56a23e02798bd8166751245ef4eb9b","tests/dummy_book/src/SUMMARY.md":"3384fd28e2974749eedf385bd3a996b71cc248abf545a696a3fda6180d22d31a","tests/dummy_book/src/conclusion.md":"eca0543344979e938b43debf3d310290a628e8b7b45d3d9bec63c21e61284a4c","tests/dummy_book/src/example.rs":"3be109d6faa3c6104c8fb5e8ffdfe3eba73d0a5ed4f537685fe2cf2c36e657d0","tests/dummy_book/src/first/includes.md":"747f8f1eb4d394c1fdb773acddb7ffdc641e3ad71b0d15afb0f4e2de13a729ed","tests/dummy_book/src/first/index.md":"e7d1af4cb454c0be73bf1e2f01a97541fba385cd04ac5c9a7acc99809adedee8","tests/dummy_book/src/first/markdown.md":"461753f7f5105e35bc246c752065a44ea1d238f6890bd01b7c34d0a5746f7902","tests/dummy_book/src/first/nested-test-with-anchors.rs":"6fdecb4c62201f2dae36ea7e35693238edca03dcfc42d33eaf1685bc957a6d1d","tests/dummy_book/src/first/nested-test.rs":"ca4cdf552842a957be49ffc753f7585dba3c0036a076fea68174719599d426fa","tests/dummy_book/src/first/nested.md":"485d24764340c0413939e52533ab304c07bb55bd23d0ad9e31151ff889425048","tests/dummy_book/src/first/partially-included-test-with-anchors.rs":"501d96562da17cbec46444a004340e711b3fac4b3384f12d7c4844909742c8c8","tests/dummy_book/src/first/partially-included-test.rs":"1bdd1a4f8fdc41ea10868f97de0fe315b2cc592d4cf4aabd784f17dc8c0a6e90","tests/dummy_book/src/first/recursive.md":"9b574239c94c24412dbd918d7b85f557a80cec44d245663cfe1ecdd8ed16765e","tests/dummy_book/src/first/unicode.md":"04a548a642ba5cbc346670a8b38c1aeb5ad23d5a967849783171c634b682de63","tests/dummy_book/src/intro.md":"2749920beee7f563f3ace2bbef204dc66382e052c7945bf27e66912351959a90","tests/dummy_book/src/second.md":"b1344cb47f69621ed68197b81652df1f86254b71b4e3dcbdcf707a4e1fee3340","tests/dummy_book/src/second/nested.md":"b0da2ce6ce1ac5fbda92b5cf7a6a09d39abd267095a29f177e44cd4e8d333d45","tests/dummy_book/src2/README.md":"1bcffb061e737e022f132f78a2dd3193fc0951d0b104e50ddc860d9bc260f505","tests/dummy_book/src2/SUMMARY.md":"4354bec1cae7db3c48dfe869e28e8e29958daef937b33da5e729211372ccb9c9","tests/dummy_book/src2/first/README.md":"ba505ed6c1e18c85ce2ca7070021c719933ce2cf9f28de8565c188c0e4a95d87","tests/dummy_book/src2/second/README.md":"2fb4a90a1359fe3725c3d95888452afd514b0b86bdc4e2768442a71bf5b642a0","tests/dummy_book/src2/second/index.md":"5bf990bec982b9e87d8dfb230fb2dfc96318d9065f97a3d3c5cf27bd134c8bdd","tests/init.rs":"823d7f09142c26b5e40f0769440d9fa23948dbfc9168beaa35bd1082b20bccf1","tests/parse_existing_summary_files.rs":"f4b019e66ffc7f59efd7ec9da73bb70180e4cc23ff27904bf4dfd26491ef64a3","tests/rendered_output.rs":"60e1166490ca9151dd4d0a158bd545da2de2a88d53b9e7ef0a045548ae3265ca","tests/searchindex_fixture.json":"041f7fd73588b4086cdd4db01e40493fc9ebfc3ecd063aacc845c6b565e63620","tests/summary_md_files/example_book.md":"e1dd09043d9548612b0bb4e607a8796317272aa1fe7a2bda55db6e6f47d3fc5a","tests/summary_md_files/rust_by_example.md":"c46c8eab64780297b851be196a04d573da69553f4d9c33e24fbd5fb2867efbfd","tests/summary_md_files/rust_ffi_guide.md":"26874d9ad22cfdc2a587e7a495a4404247821d2b6e8eabe07334cacc5a4ea365","tests/summary_md_files/the_book-2nd_edition.md":"7ae64929c45aa7d67560c77e5280a540c22d1b0d2f8fd85f8392ce064c2d5f0a","tests/testing.rs":"c80d579682b969045d0c067f7ae5ab425255f83642f9dfd11a42f3de75e1b4a8"},"package":"28f6a882f3880ec68e96f60d6b543c34941e2f307ad10e2992e4db9acfe96529"} \ No newline at end of file diff --git a/vendor/mdbook/CHANGELOG.md b/vendor/mdbook/CHANGELOG.md index 64e6448a74..4cf4787b35 100644 --- a/vendor/mdbook/CHANGELOG.md +++ b/vendor/mdbook/CHANGELOG.md @@ -1,5 +1,19 @@ # Changelog +## mdBook 0.4.7 +[9a9eb01...c83bbd6](https://github.com/rust-lang/mdBook/compare/9a9eb01...c83bbd6) + +### Changed +- Updated shlex parser to fix a minor parsing issue (used by the + preprocessor/backend custom command config). + [#1471](https://github.com/rust-lang/mdBook/pull/1471) +- Enhanced text contrast of `light` theme to improve accessibility. + [#1470](https://github.com/rust-lang/mdBook/pull/1470) + +### Fixed +- Fixed some issues with fragment scrolling and linking. + [#1463](https://github.com/rust-lang/mdBook/pull/1463) + ## mdBook 0.4.6 [eaa6914...1a0c296](https://github.com/rust-lang/mdBook/compare/eaa6914...1a0c296) diff --git a/vendor/mdbook/Cargo.lock b/vendor/mdbook/Cargo.lock index e1abf77b31..d23a2097c3 100644 --- a/vendor/mdbook/Cargo.lock +++ b/vendor/mdbook/Cargo.lock @@ -723,7 +723,7 @@ checksum = "7ffc5c5338469d4d3ea17d269fa8ea3512ad247247c30bd2df69e68309ed0a08" [[package]] name = "mdbook" -version = "0.4.6" +version = "0.4.7" dependencies = [ "ammonia", "anyhow", @@ -1258,9 +1258,9 @@ dependencies = [ [[package]] name = "shlex" -version = "0.1.1" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2" +checksum = "42a568c8f2cd051a4d283bd6eb0343ac214c1b0f1ac19f93e1175b2dee38c73d" [[package]] name = "siphasher" diff --git a/vendor/mdbook/Cargo.toml b/vendor/mdbook/Cargo.toml index d908202827..1c4d6edf57 100644 --- a/vendor/mdbook/Cargo.toml +++ b/vendor/mdbook/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "mdbook" -version = "0.4.6" +version = "0.4.7" authors = ["Mathieu David ", "Michael-F-Bryan ", "Matt Ickstadt "] exclude = ["/guide/*"] description = "Creates a book from markdown files" @@ -90,7 +90,7 @@ version = "1.0" version = "1.0" [dependencies.shlex] -version = "0.1" +version = "1" [dependencies.tempfile] version = "3.0" diff --git a/vendor/mdbook/src/renderer/html_handlebars/hbs_renderer.rs b/vendor/mdbook/src/renderer/html_handlebars/hbs_renderer.rs index 6b934b13cb..66572d04b1 100644 --- a/vendor/mdbook/src/renderer/html_handlebars/hbs_renderer.rs +++ b/vendor/mdbook/src/renderer/html_handlebars/hbs_renderer.rs @@ -756,7 +756,7 @@ fn insert_link_into_header( *id_count += 1; format!( - r##"{text}"##, + r##"{text}"##, level = level, id = id, text = content @@ -927,27 +927,27 @@ mod tests { let inputs = vec![ ( "blah blah

    Foo

    ", - r##"blah blah

    Foo

    "##, + r##"blah blah

    Foo

    "##, ), ( "

    Foo

    ", - r##"

    Foo

    "##, + r##"

    Foo

    "##, ), ( "

    Foo^bar

    ", - r##"

    Foo^bar

    "##, + r##"

    Foo^bar

    "##, ), ( "

    ", - r##"

    "##, + r##"

    "##, ), ( "

    Hï

    ", - r##"

    Hï

    "##, + r##"

    Hï

    "##, ), ( "

    Foo

    Foo

    ", - r##"

    Foo

    Foo

    "##, + r##"

    Foo

    Foo

    "##, ), ]; diff --git a/vendor/mdbook/src/theme/css/chrome.css b/vendor/mdbook/src/theme/css/chrome.css index 9ca8633ae9..21c08b930f 100644 --- a/vendor/mdbook/src/theme/css/chrome.css +++ b/vendor/mdbook/src/theme/css/chrome.css @@ -93,7 +93,7 @@ a > .hljs { .menu-title { display: inline-block; font-weight: 200; - font-size: 2rem; + font-size: 2.4rem; line-height: var(--menu-bar-height); text-align: center; margin: 0; diff --git a/vendor/mdbook/src/theme/css/general.css b/vendor/mdbook/src/theme/css/general.css index 815dae1ad0..d437b51cce 100644 --- a/vendor/mdbook/src/theme/css/general.css +++ b/vendor/mdbook/src/theme/css/general.css @@ -45,20 +45,23 @@ h4, h5 { margin-top: 2em; } margin-top: 1em; } -h1 a.header:target::before, -h2 a.header:target::before, -h3 a.header:target::before, -h4 a.header:target::before { +h1:target::before, +h2:target::before, +h3:target::before, +h4:target::before, +h5:target::before, +h6:target::before { display: inline-block; content: "»"; margin-left: -30px; width: 30px; } -h1 a.header:target, -h2 a.header:target, -h3 a.header:target, -h4 a.header:target { +/* This is broken on Safari as of version 14, but is fixed + in Safari Technology Preview 117 which I think will be Safari 14.2. + https://bugs.webkit.org/show_bug.cgi?id=218076 +*/ +:target { scroll-margin-top: calc(var(--menu-bar-height) + 0.5em); } diff --git a/vendor/mdbook/src/theme/css/variables.css b/vendor/mdbook/src/theme/css/variables.css index 9534ec8d15..9ff64d6b3b 100644 --- a/vendor/mdbook/src/theme/css/variables.css +++ b/vendor/mdbook/src/theme/css/variables.css @@ -92,22 +92,22 @@ .light { --bg: hsl(0, 0%, 100%); - --fg: #333333; + --fg: hsl(0, 0%, 0%); --sidebar-bg: #fafafa; - --sidebar-fg: #364149; + --sidebar-fg: hsl(0, 0%, 0%); --sidebar-non-existant: #aaaaaa; - --sidebar-active: #008cff; + --sidebar-active: #1f1fff; --sidebar-spacer: #f4f4f4; - --scrollbar: #cccccc; + --scrollbar: #8F8F8F; - --icons: #cccccc; - --icons-hover: #333333; + --icons: #747474; + --icons-hover: #000000; - --links: #4183c4; + --links: #20609f; - --inline-code-color: #6e6b5e; + --inline-code-color: #301900; --theme-popup-bg: #fafafa; --theme-popup-border: #cccccc; diff --git a/vendor/mdbook/tests/rendered_output.rs b/vendor/mdbook/tests/rendered_output.rs index f0b505823d..649873ac83 100644 --- a/vendor/mdbook/tests/rendered_output.rs +++ b/vendor/mdbook/tests/rendered_output.rs @@ -104,12 +104,12 @@ fn check_correct_cross_links_in_nested_dir() { assert_contains_strings( first.join("index.html"), - &[r##"href="#some-section" id="some-section""##], + &[r##"

    "##], ); assert_contains_strings( first.join("nested.html"), - &[r##"href="#some-section" id="some-section""##], + &[r##"

    "##], ); } @@ -373,7 +373,7 @@ fn able_to_include_files_in_chapters() { let includes = temp.path().join("book/first/includes.html"); let summary_strings = &[ - r##"

    Summary

    "##, + r##"

    Summary

    "##, ">First Chapter", ]; assert_contains_strings(&includes, summary_strings); diff --git a/vendor/measureme/.cargo-checksum.json b/vendor/measureme/.cargo-checksum.json index 6dc1f5ccbb..50a735a067 100644 --- a/vendor/measureme/.cargo-checksum.json +++ b/vendor/measureme/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"210d33a45a429dd63ee51723d2d08ac1034347ff94c5b050a8c8f94265c4a00a","src/event_id.rs":"c1db7b65de1047ed0319d3dc9eca283d03762d3bbff57dbd6f3da41e7f0a3c99","src/file_header.rs":"56cc6b9e0318686571b693d89f0d40bf818c26080b85dd111c83a09d9a4cc18e","src/lib.rs":"b665435d18734edfaa78f1a3e1205056a9493565e2bf67b0aad59546397433c5","src/profiler.rs":"b3927a37fe69b51e2694f72f1f96f3581bbfce5144935ec8c93a6017de7a6bcb","src/raw_event.rs":"4942a60997be7d3bdcda4d4c52049eb98cfdb5451a580f4ea29ba303548a31d3","src/rustc.rs":"1a101e8b9038bb1cc3d5745779e30736b5e2e1f1debef6a1fbe402c836ca1ede","src/serialization.rs":"abc73f80db25d21d4a73ef0524832a69a07ce6dd0a93223c618ad696a3def77e","src/stringtable.rs":"229a8690ef018a52df0d5fe18361cff1fdb13fb6f1248d08f13ea4fed382bf7b"},"package":"22bf8d885d073610aee20e7fa205c4341ed32a761dbde96da5fd96301a8d3e82"} \ No newline at end of file +{"files":{"Cargo.toml":"61079a9abf499e3f313f709d612e933bd8e5ac18e2cd3964b2e51df3566612d2","src/counters.rs":"005d2743c40b837b49412a8e20ea719f9352c99684c884fa51b819ee4976f3bb","src/event_id.rs":"98bd9c318aa5dc52a340cafbfb023be36242b959af57226058143700282840ff","src/file_header.rs":"4057a9d61c20e0592a635cf818bc5aed913df55a260d8186757448bfc2ed2c74","src/lib.rs":"f42913b587c862178ca052299c4635c35ed28c8a234652a3ce1aa340f98c85ad","src/profiler.rs":"434349b27515f1cfc134943c2c811ab91f3141e2fde9b3387b8f30eb7c2c63ab","src/raw_event.rs":"f2b9e40f8084147ee1213658cdc66380dd7ea360ae43f1bc4f083125e58bd6ad","src/rustc.rs":"c58c5fa9b23da76bf8b873dd7cb60ae4f525cdb7587bca676cc5507b97a2c96d","src/serialization.rs":"286a750a7fc95d9611f50c8ee27e2320b96e258a0e99f54000b9c920924d455a","src/stringtable.rs":"b6c07a1c30d8189b813ad95b9fe10aecd041332042dc9d629f854efddbe53ccf"},"package":"4a98e07fe802486895addb2b5467f33f205e82c426bfaf350f5d8109b137767c"} \ No newline at end of file diff --git a/vendor/measureme/Cargo.toml b/vendor/measureme/Cargo.toml index 5d0b19a5ff..36ba610ecd 100644 --- a/vendor/measureme/Cargo.toml +++ b/vendor/measureme/Cargo.toml @@ -13,13 +13,16 @@ [package] edition = "2018" name = "measureme" -version = "9.0.0" +version = "9.1.0" authors = ["Wesley Wiser ", "Michael Woerister "] description = "Support crate for rustc's self-profiling feature" homepage = "https://github.com/rust-lang/measureme" documentation = "https://docs.rs/measureme" license = "MIT OR Apache-2.0" repository = "https://github.com/rust-lang/measureme" +[dependencies.log] +version = "0.4" + [dependencies.parking_lot] version = "0.11.0" @@ -28,5 +31,13 @@ version = "1.0.1" [dependencies.smallvec] version = "1.0" + +[features] +nightly = [] +[target."cfg(all(target_arch = \"x86_64\", target_os = \"linux\"))".dependencies.memmap] +version = "0.7" + +[target."cfg(all(target_arch = \"x86_64\", target_os = \"linux\"))".dependencies.perf-event-open-sys] +version = "1.0.1" [badges.travis-ci] repository = "rust-lang/measureme" diff --git a/vendor/measureme/src/counters.rs b/vendor/measureme/src/counters.rs new file mode 100644 index 0000000000..7d155ab315 --- /dev/null +++ b/vendor/measureme/src/counters.rs @@ -0,0 +1,1012 @@ +//! Profiling counters and their implementation. +//! +//! # Available counters +//! +//! Name (for [`Counter::by_name()`]) | Counter | OSes | CPUs +//! --------------------------------- | ------- | ---- | ---- +//! `wall-time` | [`WallTime`] | any | any +//! `instructions:u` | [`Instructions`] | Linux | `x86_64` +//! `instructions-minus-irqs:u` | [`InstructionsMinusIrqs`] | Linux | `x86_64`
    - AMD (since K8)
    - Intel (since Sandy Bridge) +//! `instructions-minus-r0420:u` | [`InstructionsMinusRaw0420`] | Linux | `x86_64`
    - AMD (Zen) +//! +//! *Note: `:u` suffixes for hardware performance counters come from the Linux `perf` +//! tool, and indicate that the counter is only active while userspace code executes +//! (i.e. it's paused while the kernel handles syscalls, interrupts, etc.).* +//! +//! # Limitations and caveats +//! +//! *Note: for more information, also see the GitHub PR which first implemented hardware +//! performance counter support ([#143](https://github.com/rust-lang/measureme/pull/143)).* +//! +//! The hardware performance counters (i.e. all counters other than `wall-time`) are limited to: +//! * nightly Rust (gated on `features = ["nightly"]`), for `asm!` +//! * Linux, for out-of-the-box performance counter reads from userspace +//! * other OSes could work through custom kernel extensions/drivers, in the future +//! * `x86_64` CPUs, mostly due to lack of other available test hardware +//! * new architectures would be easier to support (on Linux) than new OSes +//! * easiest to add would be 32-bit `x86` (aka `i686`), which would reuse +//! most of the `x86_64` CPU model detection logic +//! * specific (newer) CPU models, for certain non-standard counters +//! * e.g. `instructions-minus-irqs:u` requires a "hardware interrupts" (aka "IRQs") +//! counter, which is implemented differently between vendors / models (if at all) +//! * single-threaded programs (counters only work on the thread they were created on) +//! * for profiling `rustc`, this means only "check mode" (`--emit=metadata`), +//! is supported currently (`-Z no-llvm-threads` could also work) +//! * unclear what the best approach for handling multiple threads would be +//! * changing the API (e.g. to require per-thread profiler handles) could result +//! in a more efficient implementation, but would also be less ergonomic +//! * profiling data from multithreaded programs would be harder to use due to +//! noise from synchronization mechanisms, non-deterministic work-stealing, etc. +//! +//! For ergonomic reasons, the public API doesn't vary based on `features` or target. +//! Instead, attempting to create any unsupported counter will return `Err`, just +//! like it does for any issue detected at runtime (e.g. incompatible CPU model). +//! +//! When counting instructions specifically, these factors will impact the profiling quality: +//! * high-level non-determinism (e.g. user interactions, networking) +//! * the ideal use-case is a mostly-deterministic program, e.g. a compiler like `rustc` +//! * if I/O can be isolated to separate profiling events, and doesn't impact +//! execution in a more subtle way (see below), the deterministic parts of +//! the program can still be profiled with high accuracy +//! * intentional uses of randomness may change execution paths, though for +//! cryptographic operations specifically, "constant time" implementations +//! are preferred / necessary (in order to limit an external observer's +//! ability to infer secrets), so they're not as much of a problem +//! * even otherwise-deterministic machine-local communication (to e.g. system +//! services or drivers) can behave unpredictably (especially under load) +//! * while we haven't observed this in the wild yet, it's possible for +//! file reads/writes to be split up into multiple smaller chunks +//! (and therefore take more userspace instructions to fully read/write) +//! * low-level non-determinism (e.g. ASLR, randomized `HashMap`s, timers) +//! * ASLR ("Address Space Layout Randomization"), may be provided by the OS for +//! security reasons, or accidentally caused through allocations that depend on +//! random data (even as low-entropy as e.g. the base 10 length of a process ID) +//! * on Linux ASLR can be disabled by running the process under `setarch -R` +//! * this impacts `rustc` and LLVM, which rely on keying `HashMap`s by addresses +//! (typically of interned data) as an optimization, and while non-determinstic +//! outputs are considered bugs, the instructions executed can still vary a lot, +//! even when the externally observable behavior is perfectly repeatable +//! * `HashMap`s are involved in one more than one way: +//! * both the executed instructions, and the shape of the allocations depend +//! on both the hasher state and choice of keys (as the buckets are in +//! a flat array indexed by some of the lower bits of the key hashes) +//! * so every `HashMap` with keys being/containing addresses will amplify +//! ASLR and ASLR-like effects, making the entire program more sensitive +//! * the default hasher is randomized, and while `rustc` doesn't use it, +//! proc macros can (and will), and it's harder to disable than Linux ASLR +//! * most ways of measuring time will inherently never perfectly align with +//! exact points in the program's execution, making time behave like another +//! low-entropy source of randomness - this also means timers will elapse at +//! unpredictable points (which can further impact the rest of the execution) +//! * this includes the common thread scheduler technique of preempting the +//! currently executing thread with a periodic timer interrupt, so the exact +//! interleaving of multiple threads will likely not be reproducible without +//! special OS configuration, or tools that emulate a deterministic scheduler +//! * `jemalloc` (the allocator used by `rustc`, at least in official releases) +//! has a 10 second "purge timer", which can introduce an ASLR-like effect, +//! unless disabled with `MALLOC_CONF=dirty_decay_ms:0,muzzy_decay_ms:0` +//! * hardware flaws (whether in the design or implementation) +//! * hardware interrupts ("IRQs") and exceptions (like page faults) cause +//! overcounting (1 instruction per interrupt, possibly the `iret` from the +//! kernel handler back to the interrupted userspace program) +//! * this is the reason why `instructions-minus-irqs:u` should be preferred +//! to `instructions:u`, where the former is available +//! * there are system-wide options (e.g. `CONFIG_NO_HZ_FULL`) for removing +//! some interrupts from the cores used for profiling, but they're not as +//! complete of a solution, nor easy to set up in the first place +//! * AMD Zen CPUs have a speculative execution feature (dubbed `SpecLockMap`), +//! which can cause non-deterministic overcounting for instructions following +//! an atomic instruction (such as found in heap allocators, or `measureme`) +//! * this is automatically detected, with a `log` message pointing the user +//! to for guidance on how to +//! disable `SpecLockMap` on their system (sadly requires root access) +//! +//! Even if some of the above caveats apply for some profiling setup, as long as +//! the counters function, they can still be used, and compared with `wall-time`. +//! Chances are, they will still have less variance, as everything that impacts +//! instruction counts will also impact any time measurements. +//! +//! Also keep in mind that instruction counts do not properly reflect all kinds +//! of workloads, e.g. SIMD throughput and cache locality are unaccounted for. + +use std::error::Error; +use std::time::Instant; + +// HACK(eddyb) this is semantically `warn!` but uses `error!` because +// that's the only log level enabled by default - see also +// https://github.com/rust-lang/rust/issues/76824 +macro_rules! really_warn { + ($msg:literal $($rest:tt)*) => { + error!(concat!("[WARNING] ", $msg) $($rest)*) + } +} + +pub enum Counter { + WallTime(WallTime), + Instructions(Instructions), + InstructionsMinusIrqs(InstructionsMinusIrqs), + InstructionsMinusRaw0420(InstructionsMinusRaw0420), +} + +impl Counter { + pub fn by_name(name: &str) -> Result> { + Ok(match name { + WallTime::NAME => Counter::WallTime(WallTime::new()), + Instructions::NAME => Counter::Instructions(Instructions::new()?), + InstructionsMinusIrqs::NAME => { + Counter::InstructionsMinusIrqs(InstructionsMinusIrqs::new()?) + } + InstructionsMinusRaw0420::NAME => { + Counter::InstructionsMinusRaw0420(InstructionsMinusRaw0420::new()?) + } + _ => return Err(format!("{:?} is not a valid counter name", name).into()), + }) + } + + pub(super) fn describe_as_json(&self) -> String { + let (name, units) = match self { + Counter::WallTime(_) => ( + WallTime::NAME, + r#"[["ns", 1], ["μs", 1000], ["ms", 1000000], ["s", 1000000000]]"#, + ), + Counter::Instructions(_) => (Instructions::NAME, r#"[["instructions", 1]]"#), + Counter::InstructionsMinusIrqs(_) => { + (InstructionsMinusIrqs::NAME, r#"[["instructions", 1]]"#) + } + Counter::InstructionsMinusRaw0420(_) => { + (InstructionsMinusRaw0420::NAME, r#"[["instructions", 1]]"#) + } + }; + format!(r#"{{ "name": "{}", "units": {} }}"#, name, units) + } + + #[inline] + pub(super) fn since_start(&self) -> u64 { + match self { + Counter::WallTime(counter) => counter.since_start(), + Counter::Instructions(counter) => counter.since_start(), + Counter::InstructionsMinusIrqs(counter) => counter.since_start(), + Counter::InstructionsMinusRaw0420(counter) => counter.since_start(), + } + } +} + +/// "Monotonic clock" with nanosecond precision (using [`std::time::Instant`]). +/// +/// Can be obtained with `Counter::by_name("wall-time")`. +pub struct WallTime { + start: Instant, +} + +impl WallTime { + const NAME: &'static str = "wall-time"; + + pub fn new() -> Self { + WallTime { + start: Instant::now(), + } + } + + #[inline] + fn since_start(&self) -> u64 { + self.start.elapsed().as_nanos() as u64 + } +} + +/// "Instructions retired" hardware performance counter (userspace-only). +/// +/// Can be obtained with `Counter::by_name("instructions:u")`. +pub struct Instructions { + instructions: hw::Counter, + start: u64, +} + +impl Instructions { + const NAME: &'static str = "instructions:u"; + + pub fn new() -> Result> { + let model = hw::CpuModel::detect()?; + let instructions = hw::Counter::new(&model, HwCounterType::Instructions)?; + let start = instructions.read(); + Ok(Instructions { + instructions, + start, + }) + } + + #[inline] + fn since_start(&self) -> u64 { + self.instructions.read().wrapping_sub(self.start) + } +} + +/// More accurate [`Instructions`] (subtracting hardware interrupt counts). +/// +/// Can be obtained with `Counter::by_name("instructions-minus-irqs:u")`. +pub struct InstructionsMinusIrqs { + instructions: hw::Counter, + irqs: hw::Counter, + start: u64, +} + +impl InstructionsMinusIrqs { + const NAME: &'static str = "instructions-minus-irqs:u"; + + pub fn new() -> Result> { + let model = hw::CpuModel::detect()?; + let instructions = hw::Counter::new(&model, HwCounterType::Instructions)?; + let irqs = hw::Counter::new(&model, HwCounterType::Irqs)?; + let (start_instructions, start_irqs) = (&instructions, &irqs).read(); + let start = start_instructions.wrapping_sub(start_irqs); + Ok(InstructionsMinusIrqs { + instructions, + irqs, + start, + }) + } + + #[inline] + fn since_start(&self) -> u64 { + let (instructions, irqs) = (&self.instructions, &self.irqs).read(); + instructions.wrapping_sub(irqs).wrapping_sub(self.start) + } +} + +/// (Experimental) Like [`InstructionsMinusIrqs`] (but using an undocumented `r0420:u` counter). +/// +/// Can be obtained with `Counter::by_name("instructions-minus-r0420:u")`. +// +// HACK(eddyb) this is a variant of `instructions-minus-irqs:u`, where `r0420` +// is subtracted, instead of the usual "hardware interrupts" (aka IRQs). +// `r0420` is an undocumented counter on AMD Zen CPUs which appears to count +// both hardware interrupts and exceptions (such as page faults), though +// it's unclear yet what exactly it's counting (could even be `iret`s). +pub struct InstructionsMinusRaw0420(InstructionsMinusIrqs); + +impl InstructionsMinusRaw0420 { + const NAME: &'static str = "instructions-minus-r0420:u"; + + pub fn new() -> Result> { + let model = hw::CpuModel::detect()?; + let instructions = hw::Counter::new(&model, HwCounterType::Instructions)?; + let irqs = hw::Counter::new(&model, HwCounterType::Raw0420)?; + let (start_instructions, start_irqs) = (&instructions, &irqs).read(); + let start = start_instructions.wrapping_sub(start_irqs); + Ok(InstructionsMinusRaw0420(InstructionsMinusIrqs { + instructions, + irqs, + start, + })) + } + + #[inline] + fn since_start(&self) -> u64 { + self.0.since_start() + } +} + +trait HwCounterRead { + type Output; + fn read(&self) -> Self::Output; +} + +enum HwCounterType { + Instructions, + Irqs, + Raw0420, +} + +const BUG_REPORT_MSG: &str = + "please report this to https://github.com/rust-lang/measureme/issues/new"; + +/// Linux x86_64 implementation based on `perf_event_open` and `rdpmc`. +#[cfg(all(feature = "nightly", target_arch = "x86_64", target_os = "linux"))] +mod hw { + use memmap::{Mmap, MmapOptions}; + use perf_event_open_sys::{bindings::*, perf_event_open}; + use std::convert::TryInto; + use std::error::Error; + use std::fs; + use std::mem; + use std::os::unix::io::FromRawFd; + + pub(super) struct Counter { + mmap: Mmap, + reg_idx: u32, + } + + impl Counter { + pub(super) fn new( + model: &CpuModel, + counter_type: super::HwCounterType, + ) -> Result> { + let (type_, hw_id) = match counter_type { + super::HwCounterType::Instructions => ( + perf_type_id_PERF_TYPE_HARDWARE, + perf_hw_id_PERF_COUNT_HW_INSTRUCTIONS, + ), + super::HwCounterType::Irqs => { + (perf_type_id_PERF_TYPE_RAW, model.irqs_counter_config()?) + } + super::HwCounterType::Raw0420 => { + match model { + CpuModel::Amd(AmdGen::Zen) => {} + + _ => really_warn!( + "Counter::new: the undocumented `r0420` performance \ + counter has only been observed on AMD Zen CPUs" + ), + } + + (perf_type_id_PERF_TYPE_RAW, 0x04_20) + } + }; + Self::with_type_and_hw_id(type_, hw_id) + } + + fn with_type_and_hw_id( + type_: perf_type_id, + hw_id: u32, + ) -> Result> { + let mut attrs = perf_event_attr { + size: mem::size_of::().try_into().unwrap(), + type_, + config: hw_id.into(), + ..perf_event_attr::default() + }; + + // Only record same-thread, any CPUs, and only userspace (no kernel/hypervisor). + // NOTE(eddyb) `pid = 0`, despite talking about "process id", means + // "calling process/thread", *not* "any thread in the calling process" + // (i.e. "process" is interchangeable with "main thread of the process") + // FIXME(eddyb) introduce per-thread counters and/or use `inherit` + // (and `inherit_stat`? though they might not be appropriate here) + // to be able to read the counter on more than just the initial thread. + let pid = 0; + let cpu = -1; + let group_fd = -1; + attrs.set_exclude_kernel(1); + attrs.set_exclude_hv(1); + + let file = unsafe { + let fd = + perf_event_open(&mut attrs, pid, cpu, group_fd, PERF_FLAG_FD_CLOEXEC.into()); + if fd < 0 { + Err(std::io::Error::from_raw_os_error(-fd)) + } else { + Ok(fs::File::from_raw_fd(fd)) + } + }; + let file = file.map_err(|e| format!("perf_event_open failed: {:?}", e))?; + + let mmap = unsafe { + MmapOptions::new() + .len(mem::size_of::()) + .map(&file) + }; + let mmap = mmap.map_err(|e| format!("perf_event_mmap_page: mmap failed: {:?}", e))?; + + let mut counter = Counter { mmap, reg_idx: 0 }; + + let (version, compat_version, caps, index, pmc_width) = counter + .access_mmap_page_with_seqlock(|mp| { + ( + mp.version, + mp.compat_version, + unsafe { mp.__bindgen_anon_1.__bindgen_anon_1 }, + mp.index, + mp.pmc_width, + ) + }); + + info!( + "Counter::new: version={} compat_version={} index={:#x}", + version, compat_version, index, + ); + + if caps.cap_user_rdpmc() == 0 { + return Err(format!( + "perf_event_mmap_page: missing cap_user_rdpmc{}", + if caps.cap_bit0_is_deprecated() == 0 && caps.cap_bit0() == 1 { + " (ignoring legacy/broken rdpmc support)" + } else { + "" + } + ) + .into()); + } + + if index == 0 { + return Err(format!( + "perf_event_mmap_page: no allocated hardware register (ran out?)" + ) + .into()); + } + counter.reg_idx = index - 1; + + if (cfg!(not(accurate_seqlock_rdpmc)) || true) && pmc_width != 48 { + return Err(format!( + "perf_event_mmap_page: {}-bit hardware counter found, only 48-bit supported", + pmc_width + ) + .into()); + } + + Ok(counter) + } + + /// Try to access the mmap page, retrying the `attempt` closure as long + /// as the "seqlock" sequence number changes (which indicates the kernel + /// has updated one or more fields within the mmap page). + #[inline] + fn access_mmap_page_with_seqlock( + &self, + attempt: impl Fn(&perf_event_mmap_page) -> T, + ) -> T { + // FIXME(eddyb) it's probably UB to use regular reads, especially + // from behind `&T`, with the only synchronization being barriers. + // Probably needs atomic reads, and stronger ones at that, for the + // `lock` field, than the fields (which would be `Relaxed`?). + let mmap_page = unsafe { &*(self.mmap.as_ptr() as *const perf_event_mmap_page) }; + let barrier = || std::sync::atomic::fence(std::sync::atomic::Ordering::Acquire); + + loop { + // Grab the "seqlock" - the kernel will update this value when it + // updates any of the other fields that may be read in `attempt`. + let seq_lock = mmap_page.lock; + barrier(); + + let result = attempt(mmap_page); + + // If nothing has changed, we're done. Otherwise, keep retrying. + barrier(); + if mmap_page.lock == seq_lock { + return result; + } + } + } + } + + impl super::HwCounterRead for Counter { + type Output = u64; + + #[inline] + fn read(&self) -> u64 { + // HACK(eddyb) keep the accurate code around while not using it, + // to minimize overhead without losing the more complex implementation. + let (counter, offset, pmc_width) = if cfg!(accurate_seqlock_rdpmc) && false { + self.access_mmap_page_with_seqlock(|mp| { + let caps = unsafe { mp.__bindgen_anon_1.__bindgen_anon_1 }; + assert_ne!(caps.cap_user_rdpmc(), 0); + + ( + rdpmc(mp.index.checked_sub(1).unwrap()), + mp.offset, + mp.pmc_width, + ) + }) + } else { + (rdpmc(self.reg_idx), 0, 48) + }; + + let counter = offset + (counter as i64); + + // Sign-extend the `pmc_width`-bit value to `i64`. + (counter << (64 - pmc_width) >> (64 - pmc_width)) as u64 + } + } + + impl super::HwCounterRead for (&Counter, &Counter) { + type Output = (u64, u64); + + #[inline] + fn read(&self) -> (u64, u64) { + // HACK(eddyb) keep the accurate code around while not using it, + // to minimize overhead without losing the more complex implementation. + if (cfg!(accurate_seqlock_rdpmc) || cfg!(unserialized_rdpmc)) && false { + return (self.0.read(), self.1.read()); + } + + let pmc_width = 48; + + let (a_counter, b_counter) = rdpmc_pair(self.0.reg_idx, self.1.reg_idx); + + // Sign-extend the `pmc_width`-bit values to `i64`. + ( + ((a_counter as i64) << (64 - pmc_width) >> (64 - pmc_width)) as u64, + ((b_counter as i64) << (64 - pmc_width) >> (64 - pmc_width)) as u64, + ) + } + } + + /// Read the hardware performance counter indicated by `reg_idx`. + /// + /// If the counter is signed, sign extension should be performed based on + /// the width of the register (32 to 64 bits, e.g. 48-bit seems common). + #[inline(always)] + fn rdpmc(reg_idx: u32) -> u64 { + let (lo, hi): (u32, u32); + unsafe { + // NOTE(eddyb) below comment is outdated (the other branch uses `cpuid`). + if cfg!(unserialized_rdpmc) && false { + // FIXME(eddyb) the Intel and AMD manuals warn about the need for + // "serializing instructions" before/after `rdpmc`, if avoiding any + // reordering is desired, but do not agree on the full set of usable + // "serializing instructions" (e.g. `mfence` isn't listed in both). + // + // The only usable, and guaranteed to work, "serializing instruction" + // appears to be `cpuid`, but it doesn't seem easy to use, especially + // due to the overlap in registers with `rdpmc` itself, and it might + // have too high of a cost, compared to serialization benefits (if any). + asm!("rdpmc", in("ecx") reg_idx, out("eax") lo, out("edx") hi, options(nostack)); + } else { + asm!( + // Dummy `cpuid(0)` to serialize instruction execution. + "xor %eax, %eax", // Intel syntax: "xor eax, eax" + "cpuid", + + "mov {rdpmc_ecx:e}, %ecx", // Intel syntax: "mov ecx, {rdpmc_ecx:e}" + "rdpmc", + rdpmc_ecx = in(reg) reg_idx, + out("eax") lo, + out("edx") hi, + + // `cpuid` clobbers (not overwritten by `rdpmc`). + out("ebx") _, + out("ecx") _, + + options(nostack), + + // HACK(eddyb) LLVM 9 and older do not support modifiers + // in Intel syntax inline asm; whenever Rust minimum LLVM + // version becomes LLVM 10, remove and replace above + // instructions with Intel syntax version (from comments). + options(att_syntax), + ); + } + } + lo as u64 | (hi as u64) << 32 + } + + /// Read two hardware performance counters at once (see `rdpmc`). + /// + /// Should be more efficient/accurate than two `rdpmc` calls, as it + /// only requires one "serializing instruction", rather than two. + #[inline(always)] + fn rdpmc_pair(a_reg_idx: u32, b_reg_idx: u32) -> (u64, u64) { + let (a_lo, a_hi): (u32, u32); + let (b_lo, b_hi): (u32, u32); + unsafe { + asm!( + // Dummy `cpuid(0)` to serialize instruction execution. + "xor %eax, %eax", // Intel syntax: "xor eax, eax" + "cpuid", + + "mov {a_rdpmc_ecx:e}, %ecx", // Intel syntax: "mov ecx, {a_rdpmc_ecx:e}" + "rdpmc", + "mov %eax, {a_rdpmc_eax:e}", // Intel syntax: "mov {a_rdpmc_eax:e}, eax" + "mov %edx, {a_rdpmc_edx:e}", // Intel syntax: "mov {a_rdpmc_edx:e}, edx" + "mov {b_rdpmc_ecx:e}, %ecx", // Intel syntax: "mov ecx, {b_rdpmc_ecx:e}" + "rdpmc", + a_rdpmc_ecx = in(reg) a_reg_idx, + a_rdpmc_eax = out(reg) a_lo, + a_rdpmc_edx = out(reg) a_hi, + b_rdpmc_ecx = in(reg) b_reg_idx, + out("eax") b_lo, + out("edx") b_hi, + + // `cpuid` clobbers (not overwritten by `rdpmc`). + out("ebx") _, + out("ecx") _, + + options(nostack), + + // HACK(eddyb) LLVM 9 and older do not support modifiers + // in Intel syntax inline asm; whenever Rust minimum LLVM + // version becomes LLVM 10, remove and replace above + // instructions with Intel syntax version (from comments). + options(att_syntax), + ); + } + ( + a_lo as u64 | (a_hi as u64) << 32, + b_lo as u64 | (b_hi as u64) << 32, + ) + } + + /// Categorization of `x86_64` CPUs, primarily based on how they + /// support for counting "hardware interrupts" (documented or not). + pub(super) enum CpuModel { + Amd(AmdGen), + Intel(IntelGen), + } + + pub(super) enum AmdGen { + /// K8 (Hammer) to Jaguar / Puma. + PreZen, + + /// Zen / Zen+ / Zen 2. + Zen, + + /// Unknown AMD CPU, contemporary to/succeeding Zen/Zen+/Zen 2, + /// but likely similar to them. + UnknownMaybeZenLike, + } + + pub(super) enum IntelGen { + /// Intel CPU predating Sandy Bridge. These are the only CPUs we + /// can't support (more) accurate instruction counting on, as they + /// don't (appear to) have any way to count "hardware interrupts". + PreBridge, + + /// Sandy Bridge / Ivy Bridge: + /// * client: Sandy Bridge (M/H) / Ivy Bridge (M/H/Gladden) + /// * server: Sandy Bridge (E/EN/EP) / Ivy Bridge (E/EN/EP/EX) + /// + /// Intel doesn't document support for counting "hardware interrupts" + /// prior to Skylake, but testing found that `HW_INTERRUPTS.RECEIVED` + /// from Skylake has existed, with the same config, as far back as + /// "Sandy Bridge" (but before that it mapped to a different event). + /// + /// These are the (pre-Skylake) *Bridge CPU models confirmed so far: + /// * Sandy Bridge (client) Family 6 Model 42 + /// Intel(R) Core(TM) i5-2520M CPU @ 2.50GHz (@alyssais) + /// * Ivy Bridge (client) Family 6 Model 58 + /// Intel(R) Core(TM) i7-3520M CPU @ 2.90GHz (@eddyb) + /// + /// We later found this paper, which on page 5 lists 12 counters, + /// for each of Nehalem/Westmere, Sandy Bridge and Ivy Bridge: + /// http://web.eece.maine.edu/~vweaver/projects/deterministic/deterministic_counters.pdf + /// It appears that both Sandy Bridge and Ivy Bridge used to have + /// `HW_INTERRUPTS.RECEIVED` documented, before Intel removed every + /// mention of the counter from newer versions of their manuals. + Bridge, + + /// Haswell / Broadwell: + /// * client: Haswell (S/ULT/GT3e) / Broadwell (U/Y/S/H/C/W) + /// * server: Haswell (E/EP/EX) / Broadwell (E/EP/EX/DE/Hewitt Lake) + /// + /// Equally as undocumented as "Sandy Bridge / Ivy Bridge" (see above). + /// + /// These are the (pre-Skylake) *Well CPU models confirmed so far: + /// * Haswell (client) Family 6 Model 60 + /// Intel(R) Core(TM) i7-4790K CPU @ 4.00GHz (@m-ou-se) + /// * Haswell (server) Family 6 Model 63 + /// Intel(R) Xeon(R) CPU E5-2697 v3 @ 2.60GHz (@cuviper) + /// * Haswell (client + GT3e) Family 6 Model 70 + /// Intel(R) Core(TM) i7-4750HQ CPU @ 2.00GHz (@nagisa) + /// Intel(R) Core(TM) i7-4770HQ CPU @ 2.20GHz (@m-ou-se) + Well, + + /// Skylake / Skylake-derived: + /// * client: Skylake (Y/U/DT/H/S) / Kaby Lake (Y/U/DT/H/S/X) / Coffee Lake (U/S/H/E) + /// * server: Skylake (SP/X/DE/W) / Cascade Lake (SP/X/W) + /// + /// Both "client" and "server" product lines have documented support + /// for counting "hardware interrupts" (`HW_INTERRUPTS.RECEIVED`). + /// + /// Intel does not make it clear that future product lines, such as + /// "Ice Lake", will continue to support this (or with what config), + /// and even "Comet Lake" (aka "10th gen") isn't explicitly listed. + Lake, + + /// Unknown Intel CPU, contemporary to/succeeding *Bridge/*Well/*Lake, + /// but likely similar to them. + UnknownMaybeLakeLike, + } + + impl CpuModel { + /// Detect the model of the current CPU using `cpuid`. + pub(super) fn detect() -> Result> { + let cpuid0 = unsafe { std::arch::x86_64::__cpuid(0) }; + let cpuid1 = unsafe { std::arch::x86_64::__cpuid(1) }; + let mut vendor = [0; 12]; + vendor[0..4].copy_from_slice(&cpuid0.ebx.to_le_bytes()); + vendor[4..8].copy_from_slice(&cpuid0.edx.to_le_bytes()); + vendor[8..12].copy_from_slice(&cpuid0.ecx.to_le_bytes()); + + let vendor = std::str::from_utf8(&vendor).map_err(|_| { + format!( + "cpuid returned non-UTF-8 vendor name: cpuid(0)={:?} cpuid(1)={:?}", + cpuid0, cpuid1 + ) + })?; + + let version = cpuid1.eax; + + let mut family = (version >> 8) & 0xf; + if family == 15 { + // Extended family. + family += (version >> 20) & 0xff; + } + + let mut model = (version >> 4) & 0xf; + if family >= 15 || vendor == "GenuineIntel" && family == 6 { + // Extended model. + model += ((version >> 16) & 0xf) << 4; + } + + info!( + "CpuModel::detect: vendor={:?} family={} model={}", + vendor, family, model + ); + + match vendor { + "AuthenticAMD" => { + use self::AmdGen::*; + + let (gen, name) = match (family, model) { + (0..=14, _) | (19, _) => { + return Err(format!( + "impossible AMD64 CPU detected (Family {} Model {}); {}", + family, + model, + super::BUG_REPORT_MSG + ) + .into()); + } + + (15, _) => (PreZen, "K8 (Hammer)"), + (16, _) => (PreZen, "K10 (Barcelona/Shanghai/Istanbul)"), + (17, _) => (PreZen, "K8+K10 hybrid (Turion X2 Ultra)"), + (18, _) => (PreZen, "Fusion"), + (20, _) => (PreZen, "Bobcat"), + (21, _) => (PreZen, "Bulldozer / Piledriver / Steamroller / Excavator"), + (22, _) => (PreZen, "Jaguar / Puma"), + + (23, 1) => (Zen, "Zen (Naples/Whitehaven/Summit Ridge/Snowy Owl)"), + (23, 17) => (Zen, "Zen (Raven Ridge)"), + (23, 24) => (Zen, "Zen (Banded Kestrel/Dali) / Zen+ (Picasso)"), + (23, 8) => (Zen, "Zen+ (Pinnacle Ridge)"), + (23, 49) => (Zen, "Zen 2 (Rome/Castle Peak)"), + (23, 113) => (Zen, "Zen 2 (Matisse)"), + + (23..=0xffff_ffff, _) => { + really_warn!( + "CpuModel::detect: unknown AMD CPU (Family {} Model {}), \ + assuming Zen-like; {}", + family, + model, + super::BUG_REPORT_MSG + ); + + (UnknownMaybeZenLike, "") + } + }; + + if !name.is_empty() { + info!("CpuModel::detect: known AMD CPU: {}", name); + } + + // The `SpecLockMap` (speculative atomic aka `lock` instruction + // execution, unclear what "Map" refers to) feature in AMD Zen CPUs + // causes non-deterministic overcounting of atomic instructions, + // presumably whenever it has to roll back the speculation + // (as in, the performance counters aren't rolled back). + // Even this this may be rare when uncontended, it adds up. + // + // There is an MSR bit (`MSRC001_1020[54]`) that's not officially + // documented, but which several motherboards and profiling tools + // set whenever IBS (Instruction-Based Sampling) is in use, and + // it is sometimes referred to as "disabling `SpecLockMap`" + // (hence having a name for the feature that speculates `lock`s). + // + // One way we could detect that the bit has been set would be to + // parse `uname().release` (aka `uname -r`) and look for versions + // which are known to include the patch suggested in this thread: + // https://github.com/mozilla/rr/issues/2034#issuecomment-693761247 + // + // However, one may set the bit using e.g. `wrmsr`, even on older + // kernels, so a more reliable approach is to execute some atomics + // and look at the `SpecLockMapCommit` (`r0825:u`) Zen counter, + // which only reliably remains `0` when `SpecLockMap` is disabled. + if matches!(gen, Zen | UnknownMaybeZenLike) { + if let Ok(spec_lock_map_commit) = + Counter::with_type_and_hw_id(perf_type_id_PERF_TYPE_RAW, 0x08_25) + { + use super::HwCounterRead; + + let start_spec_lock_map_commit = spec_lock_map_commit.read(); + + // Execute an atomic (`lock`) instruction, which should + // start speculative execution for following instructions + // (as long as `SpecLockMap` isn't disabled). + let mut atomic: u64 = 0; + let mut _tmp: u64 = 0; + unsafe { + asm!( + // Intel syntax: "lock xadd [{atomic}], {tmp}" + "lock xadd {tmp}, ({atomic})", + + atomic = in(reg) &mut atomic, + tmp = inout(reg) _tmp, + + // HACK(eddyb) LLVM 9 and older do not support modifiers + // in Intel syntax inline asm; whenever Rust minimum LLVM + // version becomes LLVM 10, remove and replace above + // instructions with Intel syntax version (from comments). + options(att_syntax), + ); + } + + if spec_lock_map_commit.read() != start_spec_lock_map_commit { + really_warn!( + "CpuModel::detect: SpecLockMap detected, in AMD {} CPU; \ + this may add some non-deterministic noise - \ + for information on disabling SpecLockMap, see \ + https://github.com/mozilla/rr/wiki/Zen", + name + ); + } + } + } + + Ok(CpuModel::Amd(gen)) + } + + "GenuineIntel" => { + use self::IntelGen::*; + + let (gen, name) = match (family, model) { + // No need to name these, they're unsupported anyway. + (0..=5, _) => (PreBridge, ""), + (15, _) => (PreBridge, "Netburst"), + (6, 0..=41) => (PreBridge, ""), + + // Older Xeon Phi CPUs, misplaced in Family 6. + (6, 87) => (PreBridge, "Knights Landing"), + (6, 133) => (PreBridge, "Knights Mill"), + + // Older Atom CPUs, interleaved with other CPUs. + // FIXME(eddyb) figure out if these are like *Bridge/*Well. + (6, 53) | (6, 54) => (PreBridge, "Saltwell"), + (6, 55) | (6, 74) | (6, 77) | (6, 90) | (6, 93) => { + (PreBridge, "Silvermont") + } + (6, 76) => (PreBridge, "Airmont (Cherry Trail/Braswell)"), + + // Older server CPUs, numbered out of order. + (6, 44) => (PreBridge, "Westmere (Gulftown/EP)"), + (6, 46) => (PreBridge, "Nehalem (EX)"), + (6, 47) => (PreBridge, "Westmere (EX)"), + + (6, 42) => (Bridge, "Sandy Bridge (M/H)"), + (6, 45) => (Bridge, "Sandy Bridge (E/EN/EP)"), + (6, 58) => (Bridge, "Ivy Bridge (M/H/Gladden)"), + (6, 62) => (Bridge, "Ivy Bridge (E/EN/EP/EX)"), + + (6, 60) => (Well, "Haswell (S)"), + (6, 61) => (Well, "Broadwell (U/Y/S)"), + (6, 63) => (Well, "Haswell (E/EP/EX)"), + (6, 69) => (Well, "Haswell (ULT)"), + (6, 70) => (Well, "Haswell (GT3e)"), + (6, 71) => (Well, "Broadwell (H/C/W)"), + (6, 79) => (Well, "Broadwell (E/EP/EX)"), + (6, 86) => (Well, "Broadwell (DE/Hewitt Lake)"), + + (6, 78) => (Lake, "Skylake (Y/U)"), + (6, 85) => (Lake, "Skylake (SP/X/DE/W) / Cascade Lake (SP/X/W)"), + (6, 94) => (Lake, "Skylake (DT/H/S)"), + (6, 142) => (Lake, "Kaby Lake (Y/U) / Coffee Lake (U)"), + (6, 158) => (Lake, "Kaby Lake (DT/H/S/X) / Coffee Lake (S/H/E)"), + + (6..=14, _) | (16..=0xffff_ffff, _) => { + really_warn!( + "CpuModel::detect: unknown Intel CPU (Family {} Model {}), \ + assuming Skylake-like; {}", + family, + model, + super::BUG_REPORT_MSG + ); + + (UnknownMaybeLakeLike, "") + } + }; + + if !name.is_empty() { + info!("CpuModel::detect: known Intel CPU: {}", name); + } + + Ok(CpuModel::Intel(gen)) + } + + _ => Err(format!( + "cpuid returned unknown CPU vendor {:?}; version={:#x}", + vendor, version + ) + .into()), + } + } + + /// Return the hardware performance counter configuration for + /// counting "hardware interrupts" (documented or not). + fn irqs_counter_config(&self) -> Result> { + match self { + CpuModel::Amd(model) => match model { + AmdGen::PreZen => Ok(0x00_cf), + AmdGen::Zen | AmdGen::UnknownMaybeZenLike => Ok(0x00_2c), + }, + CpuModel::Intel(model) => match model { + IntelGen::PreBridge => Err(format!( + "counting IRQs not yet supported on Intel CPUs \ + predating Sandy Bridge; {}", + super::BUG_REPORT_MSG + ) + .into()), + IntelGen::Bridge + | IntelGen::Well + | IntelGen::Lake + | IntelGen::UnknownMaybeLakeLike => Ok(0x01_cb), + }, + } + } + } +} + +#[cfg(not(all(feature = "nightly", target_arch = "x86_64", target_os = "linux")))] +mod hw { + use std::error::Error; + + pub(super) enum Counter {} + + impl Counter { + pub(super) fn new( + model: &CpuModel, + _: super::HwCounterType, + ) -> Result> { + match *model {} + } + } + + impl super::HwCounterRead for Counter { + type Output = u64; + + #[inline] + fn read(&self) -> u64 { + match *self {} + } + } + + impl super::HwCounterRead for (&Counter, &Counter) { + type Output = (u64, u64); + + #[inline] + fn read(&self) -> (u64, u64) { + match *self.0 {} + } + } + + pub(super) enum CpuModel {} + + impl CpuModel { + pub(super) fn detect() -> Result> { + // HACK(eddyb) mark `really_warn!` (and transitively `log` macros) + // and `BUG_REPORT_MSG` as "used" to silence warnings. + if false { + really_warn!("unsupported; {}", super::BUG_REPORT_MSG); + } + + let mut msg = String::new(); + let mut add_error = |s| { + if !msg.is_empty() { + msg += "; "; + } + msg += s; + }; + + if cfg!(not(feature = "nightly")) { + add_error("only supported with measureme's \"nightly\" feature"); + } + + if cfg!(not(target_arch = "x86_64")) { + add_error("only supported architecture is x86_64"); + } + + if cfg!(not(target_os = "linux")) { + add_error("only supported OS is Linux"); + } + + Err(msg.into()) + } + } +} diff --git a/vendor/measureme/src/event_id.rs b/vendor/measureme/src/event_id.rs index 0c361a3420..7a10af42f4 100644 --- a/vendor/measureme/src/event_id.rs +++ b/vendor/measureme/src/event_id.rs @@ -1,97 +1,97 @@ -use smallvec::SmallVec; - -use crate::{Profiler, StringComponent, StringId}; - -/// Event IDs are strings conforming to the following grammar: -/// -/// ```ignore -/// =

    note: the lint level is defined here --> $DIR/invalid-html-tags.rs:1:9 | -LL | #![deny(invalid_html_tags)] - | ^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::invalid_html_tags)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ error: unclosed HTML tag `p` --> $DIR/invalid-html-tags.rs:3:9 diff --git a/src/test/rustdoc-ui/issue-58473-2.rs b/src/test/rustdoc-ui/issue-58473-2.rs index e5f3b4daf5..000b6a329c 100644 --- a/src/test/rustdoc-ui/issue-58473-2.rs +++ b/src/test/rustdoc-ui/issue-58473-2.rs @@ -1,6 +1,6 @@ // check-pass -#![deny(private_doc_tests)] +#![deny(rustdoc::private_doc_tests)] mod foo { /** diff --git a/src/test/rustdoc-ui/issue-74134.private.stderr b/src/test/rustdoc-ui/issue-74134.private.stderr index b802d7e125..457987e207 100644 --- a/src/test/rustdoc-ui/issue-74134.private.stderr +++ b/src/test/rustdoc-ui/issue-74134.private.stderr @@ -4,7 +4,7 @@ warning: public documentation for `public_item` links to private item `PrivateTy LL | /// [`PrivateType`] | ^^^^^^^^^^^^^ this item is private | - = note: `#[warn(private_intra_doc_links)]` on by default + = note: `#[warn(rustdoc::private_intra_doc_links)]` on by default = note: this link resolves only because you passed `--document-private-items`, but will break without warning: 1 warning emitted diff --git a/src/test/rustdoc-ui/issue-74134.public.stderr b/src/test/rustdoc-ui/issue-74134.public.stderr index 40aa2ece1a..07aebc3541 100644 --- a/src/test/rustdoc-ui/issue-74134.public.stderr +++ b/src/test/rustdoc-ui/issue-74134.public.stderr @@ -4,7 +4,7 @@ warning: public documentation for `public_item` links to private item `PrivateTy LL | /// [`PrivateType`] | ^^^^^^^^^^^^^ this item is private | - = note: `#[warn(private_intra_doc_links)]` on by default + = note: `#[warn(rustdoc::private_intra_doc_links)]` on by default = note: this link will resolve properly if you pass `--document-private-items` warning: 1 warning emitted diff --git a/src/test/rustdoc-ui/lint-group.rs b/src/test/rustdoc-ui/lint-group.rs index 1446f7f1c1..61555a6e68 100644 --- a/src/test/rustdoc-ui/lint-group.rs +++ b/src/test/rustdoc-ui/lint-group.rs @@ -4,7 +4,7 @@ //! println!("sup"); //! ``` -#![deny(rustdoc)] +#![deny(rustdoc::all)] /// what up, let's make an [error] /// diff --git a/src/test/rustdoc-ui/lint-group.stderr b/src/test/rustdoc-ui/lint-group.stderr index 0c111a33b6..cc6f03b03f 100644 --- a/src/test/rustdoc-ui/lint-group.stderr +++ b/src/test/rustdoc-ui/lint-group.stderr @@ -7,9 +7,9 @@ LL | /// wait, this doesn't have a doctest? note: the lint level is defined here --> $DIR/lint-group.rs:7:9 | -LL | #![deny(rustdoc)] - | ^^^^^^^ - = note: `#[deny(missing_doc_code_examples)]` implied by `#[deny(rustdoc)]` +LL | #![deny(rustdoc::all)] + | ^^^^^^^^^^^^ + = note: `#[deny(rustdoc::missing_doc_code_examples)]` implied by `#[deny(rustdoc::all)]` error: documentation test in private item --> $DIR/lint-group.rs:19:1 @@ -24,9 +24,9 @@ LL | | /// ``` note: the lint level is defined here --> $DIR/lint-group.rs:7:9 | -LL | #![deny(rustdoc)] - | ^^^^^^^ - = note: `#[deny(private_doc_tests)]` implied by `#[deny(rustdoc)]` +LL | #![deny(rustdoc::all)] + | ^^^^^^^^^^^^ + = note: `#[deny(rustdoc::private_doc_tests)]` implied by `#[deny(rustdoc::all)]` error: missing code example in this documentation --> $DIR/lint-group.rs:26:1 @@ -43,9 +43,9 @@ LL | /// what up, let's make an [error] note: the lint level is defined here --> $DIR/lint-group.rs:7:9 | -LL | #![deny(rustdoc)] - | ^^^^^^^ - = note: `#[deny(broken_intra_doc_links)]` implied by `#[deny(rustdoc)]` +LL | #![deny(rustdoc::all)] + | ^^^^^^^^^^^^ + = note: `#[deny(rustdoc::broken_intra_doc_links)]` implied by `#[deny(rustdoc::all)]` = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]` error: unclosed HTML tag `unknown` @@ -57,9 +57,9 @@ LL | /// note: the lint level is defined here --> $DIR/lint-group.rs:7:9 | -LL | #![deny(rustdoc)] - | ^^^^^^^ - = note: `#[deny(invalid_html_tags)]` implied by `#[deny(rustdoc)]` +LL | #![deny(rustdoc::all)] + | ^^^^^^^^^^^^ + = note: `#[deny(rustdoc::invalid_html_tags)]` implied by `#[deny(rustdoc::all)]` error: aborting due to 5 previous errors diff --git a/src/test/rustdoc-ui/lint-missing-doc-code-example.rs b/src/test/rustdoc-ui/lint-missing-doc-code-example.rs index ebe7a24221..41e8847792 100644 --- a/src/test/rustdoc-ui/lint-missing-doc-code-example.rs +++ b/src/test/rustdoc-ui/lint-missing-doc-code-example.rs @@ -1,5 +1,5 @@ #![deny(missing_docs)] -#![deny(missing_doc_code_examples)] +#![deny(rustdoc::missing_doc_code_examples)] //! crate level doc //! ``` @@ -12,16 +12,16 @@ /// ``` /// println!("hello"); /// ``` -fn test() { +pub fn test() { } #[allow(missing_docs)] -mod module1 { //~ ERROR +pub mod module1 { //~ ERROR } -#[allow(missing_doc_code_examples)] +#[allow(rustdoc::missing_doc_code_examples)] /// doc -mod module2 { +pub mod module2 { /// doc pub fn test() {} @@ -63,9 +63,22 @@ pub enum Enum { /// Doc //~^ ERROR #[repr(C)] -union Union { +pub union Union { /// Doc, but no code example and it's fine! a: i32, /// Doc, but no code example and it's fine! b: f32, } + + +#[doc(hidden)] +pub mod foo { + pub fn bar() {} +} + +fn babar() {} + + +mod fofoo { + pub fn tadam() {} +} diff --git a/src/test/rustdoc-ui/lint-missing-doc-code-example.stderr b/src/test/rustdoc-ui/lint-missing-doc-code-example.stderr index e02ed4a056..3715797854 100644 --- a/src/test/rustdoc-ui/lint-missing-doc-code-example.stderr +++ b/src/test/rustdoc-ui/lint-missing-doc-code-example.stderr @@ -1,15 +1,15 @@ error: missing code example in this documentation --> $DIR/lint-missing-doc-code-example.rs:19:1 | -LL | / mod module1 { +LL | / pub mod module1 { LL | | } | |_^ | note: the lint level is defined here --> $DIR/lint-missing-doc-code-example.rs:2:9 | -LL | #![deny(missing_doc_code_examples)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::missing_doc_code_examples)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: missing code example in this documentation --> $DIR/lint-missing-doc-code-example.rs:37:3 diff --git a/src/test/rustdoc-ui/no-crate-level-doc-lint.rs b/src/test/rustdoc-ui/no-crate-level-doc-lint.rs index 152a7cd88b..3939ec6827 100644 --- a/src/test/rustdoc-ui/no-crate-level-doc-lint.rs +++ b/src/test/rustdoc-ui/no-crate-level-doc-lint.rs @@ -1,3 +1,5 @@ -#![deny(missing_crate_level_docs)] +// error-pattern: no documentation found +#![deny(rustdoc::missing_crate_level_docs)] +//^~ NOTE defined here pub fn foo() {} diff --git a/src/test/rustdoc-ui/no-crate-level-doc-lint.stderr b/src/test/rustdoc-ui/no-crate-level-doc-lint.stderr index 6e7e2fb3eb..55ead1a55c 100644 --- a/src/test/rustdoc-ui/no-crate-level-doc-lint.stderr +++ b/src/test/rustdoc-ui/no-crate-level-doc-lint.stderr @@ -1,10 +1,10 @@ error: no documentation found for this crate's top-level module | note: the lint level is defined here - --> $DIR/no-crate-level-doc-lint.rs:1:9 + --> $DIR/no-crate-level-doc-lint.rs:2:9 | -LL | #![deny(missing_crate_level_docs)] - | ^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::missing_crate_level_docs)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = help: The following guide may be of use: https://doc.rust-lang.org/nightly/rustdoc/how-to-write-documentation.html diff --git a/src/test/rustdoc-ui/private-doc-test.rs b/src/test/rustdoc-ui/private-doc-test.rs index 379fa45f9f..a1f9f8dca0 100644 --- a/src/test/rustdoc-ui/private-doc-test.rs +++ b/src/test/rustdoc-ui/private-doc-test.rs @@ -1,6 +1,6 @@ // check-pass -#![deny(private_doc_tests)] +#![deny(rustdoc::private_doc_tests)] mod foo { /// private doc test diff --git a/src/test/rustdoc-ui/private-item-doc-test.rs b/src/test/rustdoc-ui/private-item-doc-test.rs index 2f1bddc7c7..1a3d6cc636 100644 --- a/src/test/rustdoc-ui/private-item-doc-test.rs +++ b/src/test/rustdoc-ui/private-item-doc-test.rs @@ -1,4 +1,4 @@ -#![deny(private_doc_tests)] +#![deny(rustdoc::private_doc_tests)] mod foo { /// private doc test diff --git a/src/test/rustdoc-ui/private-item-doc-test.stderr b/src/test/rustdoc-ui/private-item-doc-test.stderr index 70b6638b23..5df6132987 100644 --- a/src/test/rustdoc-ui/private-item-doc-test.stderr +++ b/src/test/rustdoc-ui/private-item-doc-test.stderr @@ -11,8 +11,8 @@ LL | | /// ``` note: the lint level is defined here --> $DIR/private-item-doc-test.rs:1:9 | -LL | #![deny(private_doc_tests)] - | ^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::private_doc_tests)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/rustdoc-ui/pub-export-lint.rs b/src/test/rustdoc-ui/pub-export-lint.rs index 3fd3f77400..f2e66b77bf 100644 --- a/src/test/rustdoc-ui/pub-export-lint.rs +++ b/src/test/rustdoc-ui/pub-export-lint.rs @@ -1,4 +1,4 @@ -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] /// [aloha] //~^ ERROR unresolved link to `aloha` diff --git a/src/test/rustdoc-ui/pub-export-lint.stderr b/src/test/rustdoc-ui/pub-export-lint.stderr index c345def794..c6be9c6a9f 100644 --- a/src/test/rustdoc-ui/pub-export-lint.stderr +++ b/src/test/rustdoc-ui/pub-export-lint.stderr @@ -7,8 +7,8 @@ LL | /// [aloha] note: the lint level is defined here --> $DIR/pub-export-lint.rs:1:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]` error: aborting due to previous error diff --git a/src/test/rustdoc-ui/reference-link-reports-error-once.rs b/src/test/rustdoc-ui/reference-link-reports-error-once.rs index 7957ee373c..71bd2c522f 100644 --- a/src/test/rustdoc-ui/reference-link-reports-error-once.rs +++ b/src/test/rustdoc-ui/reference-link-reports-error-once.rs @@ -1,4 +1,4 @@ -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] /// Links to [a] [link][a] /// And also a [third link][a] diff --git a/src/test/rustdoc-ui/reference-link-reports-error-once.stderr b/src/test/rustdoc-ui/reference-link-reports-error-once.stderr index 218eb334a6..b46a51e93f 100644 --- a/src/test/rustdoc-ui/reference-link-reports-error-once.stderr +++ b/src/test/rustdoc-ui/reference-link-reports-error-once.stderr @@ -7,8 +7,8 @@ LL | /// [a]: ref note: the lint level is defined here --> $DIR/reference-link-reports-error-once.rs:1:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]` error: unresolved link to `ref2` diff --git a/src/test/rustdoc-ui/reference-links.rs b/src/test/rustdoc-ui/reference-links.rs index 6e00b9f0fa..e81e034465 100644 --- a/src/test/rustdoc-ui/reference-links.rs +++ b/src/test/rustdoc-ui/reference-links.rs @@ -1,5 +1,5 @@ // Test that errors point to the reference, not to the title text. -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] //! Links to [a] [link][a] //! //! [a]: std::process::Comman diff --git a/src/test/rustdoc-ui/reference-links.stderr b/src/test/rustdoc-ui/reference-links.stderr index 3df89df21b..c98a2fd7ce 100644 --- a/src/test/rustdoc-ui/reference-links.stderr +++ b/src/test/rustdoc-ui/reference-links.stderr @@ -7,8 +7,8 @@ LL | //! [a]: std::process::Comman note: the lint level is defined here --> $DIR/reference-links.rs:2:9 | -LL | #![deny(broken_intra_doc_links)] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #![deny(rustdoc::broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/rustdoc-ui/renamed-lint-still-applies.rs b/src/test/rustdoc-ui/renamed-lint-still-applies.rs new file mode 100644 index 0000000000..8c61c1ccb6 --- /dev/null +++ b/src/test/rustdoc-ui/renamed-lint-still-applies.rs @@ -0,0 +1,6 @@ +// compile-args: --crate-type lib +#![deny(broken_intra_doc_links)] +// FIXME: the old names for rustdoc lints should warn by default once `rustdoc::` makes it to the +// stable channel. +//! [x] +//~^ ERROR unresolved link diff --git a/src/test/rustdoc-ui/renamed-lint-still-applies.stderr b/src/test/rustdoc-ui/renamed-lint-still-applies.stderr new file mode 100644 index 0000000000..8a12991558 --- /dev/null +++ b/src/test/rustdoc-ui/renamed-lint-still-applies.stderr @@ -0,0 +1,16 @@ +error: unresolved link to `x` + --> $DIR/renamed-lint-still-applies.rs:5:6 + | +LL | //! [x] + | ^ no item named `x` in scope + | +note: the lint level is defined here + --> $DIR/renamed-lint-still-applies.rs:2:9 + | +LL | #![deny(broken_intra_doc_links)] + | ^^^^^^^^^^^^^^^^^^^^^^ + = note: `#[deny(rustdoc::broken_intra_doc_links)]` implied by `#[deny(broken_intra_doc_links)]` + = help: to escape `[` and `]` characters, add '\' before them like `\[` or `\]` + +error: aborting due to previous error + diff --git a/src/test/rustdoc-ui/rustc-check-passes.rs b/src/test/rustdoc-ui/rustc-check-passes.rs new file mode 100644 index 0000000000..731cc8ba61 --- /dev/null +++ b/src/test/rustdoc-ui/rustc-check-passes.rs @@ -0,0 +1,4 @@ +#![feature(box_syntax)] +#![feature(box_syntax)] //~ ERROR + +pub fn foo() {} diff --git a/src/test/rustdoc-ui/rustc-check-passes.stderr b/src/test/rustdoc-ui/rustc-check-passes.stderr new file mode 100644 index 0000000000..9707895ff3 --- /dev/null +++ b/src/test/rustdoc-ui/rustc-check-passes.stderr @@ -0,0 +1,9 @@ +error[E0636]: the feature `box_syntax` has already been declared + --> $DIR/rustc-check-passes.rs:2:12 + | +LL | #![feature(box_syntax)] + | ^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0636`. diff --git a/src/test/rustdoc-ui/unknown-renamed-lints.rs b/src/test/rustdoc-ui/unknown-renamed-lints.rs index 7faa82ea42..a05c0c8116 100644 --- a/src/test/rustdoc-ui/unknown-renamed-lints.rs +++ b/src/test/rustdoc-ui/unknown-renamed-lints.rs @@ -4,5 +4,18 @@ //~^ NOTE lint level is defined #![deny(x)] //~^ ERROR unknown lint +#![deny(rustdoc::x)] +//~^ ERROR unknown lint: `rustdoc::x` #![deny(intra_doc_link_resolution_failure)] -//~^ ERROR lint `intra_doc_link_resolution_failure` has been renamed +//~^ ERROR renamed to `rustdoc::broken_intra_doc_links` + +#![deny(non_autolinks)] +// FIXME: the old names for rustdoc lints should warn by default once `rustdoc::` makes it to the +// stable channel. + +#![deny(rustdoc)] +//~^ ERROR removed: use `rustdoc::all` instead + +// Explicitly don't try to handle this case, it was never valid +#![deny(rustdoc::intra_doc_link_resolution_failure)] +//~^ ERROR unknown lint diff --git a/src/test/rustdoc-ui/unknown-renamed-lints.stderr b/src/test/rustdoc-ui/unknown-renamed-lints.stderr index f0917f194b..98bfb83c70 100644 --- a/src/test/rustdoc-ui/unknown-renamed-lints.stderr +++ b/src/test/rustdoc-ui/unknown-renamed-lints.stderr @@ -10,11 +10,17 @@ note: the lint level is defined here LL | #![deny(unknown_lints)] | ^^^^^^^^^^^^^ -error: lint `intra_doc_link_resolution_failure` has been renamed to `broken_intra_doc_links` +error: unknown lint: `rustdoc::x` --> $DIR/unknown-renamed-lints.rs:7:9 | +LL | #![deny(rustdoc::x)] + | ^^^^^^^^^^ + +error: lint `intra_doc_link_resolution_failure` has been renamed to `rustdoc::broken_intra_doc_links` + --> $DIR/unknown-renamed-lints.rs:9:9 + | LL | #![deny(intra_doc_link_resolution_failure)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `broken_intra_doc_links` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the new name: `rustdoc::broken_intra_doc_links` | note: the lint level is defined here --> $DIR/unknown-renamed-lints.rs:3:9 @@ -22,7 +28,19 @@ note: the lint level is defined here LL | #![deny(renamed_and_removed_lints)] | ^^^^^^^^^^^^^^^^^^^^^^^^^ +error: lint `rustdoc` has been removed: use `rustdoc::all` instead + --> $DIR/unknown-renamed-lints.rs:16:9 + | +LL | #![deny(rustdoc)] + | ^^^^^^^ + +error: unknown lint: `rustdoc::intra_doc_link_resolution_failure` + --> $DIR/unknown-renamed-lints.rs:20:9 + | +LL | #![deny(rustdoc::intra_doc_link_resolution_failure)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + error: Compilation failed, aborting rustdoc -error: aborting due to 3 previous errors +error: aborting due to 6 previous errors diff --git a/src/test/rustdoc-ui/url-improvements.rs b/src/test/rustdoc-ui/url-improvements.rs index 8531583d38..d0b43de2f0 100644 --- a/src/test/rustdoc-ui/url-improvements.rs +++ b/src/test/rustdoc-ui/url-improvements.rs @@ -1,4 +1,4 @@ -#![deny(non_autolinks)] +#![deny(rustdoc::non_autolinks)] /// [http://aa.com](http://aa.com) //~^ ERROR unneeded long form for URL @@ -59,7 +59,7 @@ pub fn c() {} /// [should_not.lint](should_not.lint) pub fn everything_is_fine_here() {} -#[allow(non_autolinks)] +#[allow(rustdoc::non_autolinks)] pub mod foo { /// https://somewhere.com/a?hello=12&bye=11#xyz pub fn bar() {} diff --git a/src/test/rustdoc-ui/url-improvements.stderr b/src/test/rustdoc-ui/url-improvements.stderr index 70ad4b06a5..f377973656 100644 --- a/src/test/rustdoc-ui/url-improvements.stderr +++ b/src/test/rustdoc-ui/url-improvements.stderr @@ -7,8 +7,8 @@ LL | /// [http://aa.com](http://aa.com) note: the lint level is defined here --> $DIR/url-improvements.rs:1:9 | -LL | #![deny(non_autolinks)] - | ^^^^^^^^^^^^^ +LL | #![deny(rustdoc::non_autolinks)] + | ^^^^^^^^^^^^^^^^^^^^^^ error: unneeded long form for URL --> $DIR/url-improvements.rs:5:5 diff --git a/src/test/rustdoc/asm-foreign.rs b/src/test/rustdoc/asm-foreign.rs new file mode 100644 index 0000000000..570ed043dd --- /dev/null +++ b/src/test/rustdoc/asm-foreign.rs @@ -0,0 +1,20 @@ +// Make sure rustdoc accepts asm! for a foreign architecture. + +#![feature(asm)] + +// @has asm_foreign/fn.aarch64.html +pub unsafe fn aarch64(a: f64, b: f64) -> f64 { + let c; + asm!("add {:d}, {:d}, d0", out(vreg) c, in(vreg) a, in("d0") { + || {}; + b + }); + c +} + +// @has asm_foreign/fn.x86.html +pub unsafe fn x86(a: f64, b: f64) -> f64 { + let c; + asm!("addsd {}, {}, xmm0", out(xmm_reg) c, in(xmm_reg) a, in("xmm0") b); + c +} diff --git a/src/test/rustdoc/asm-foreign2.rs b/src/test/rustdoc/asm-foreign2.rs new file mode 100644 index 0000000000..34e313e7ea --- /dev/null +++ b/src/test/rustdoc/asm-foreign2.rs @@ -0,0 +1,11 @@ +// only-aarch64 +// Make sure rustdoc accepts options(att_syntax) asm! on non-x86 targets. + +#![feature(asm)] + +// @has asm_foreign2/fn.x86.html +pub unsafe fn x86(x: i64) -> i64 { + let y; + asm!("movq {}, {}", in(reg) x, out(reg) y, options(att_syntax)); + y +} diff --git a/src/test/rustdoc/auxiliary/issue-73061.rs b/src/test/rustdoc/auxiliary/issue-73061.rs index e05a3bc6d9..9b4129e771 100644 --- a/src/test/rustdoc/auxiliary/issue-73061.rs +++ b/src/test/rustdoc/auxiliary/issue-73061.rs @@ -1,6 +1,6 @@ //edition:2018 -#![feature(type_alias_impl_trait)] +#![feature(min_type_alias_impl_trait)] pub trait Foo { type X: std::future::Future; diff --git a/src/test/rustdoc/description.rs b/src/test/rustdoc/description.rs new file mode 100644 index 0000000000..05ec428220 --- /dev/null +++ b/src/test/rustdoc/description.rs @@ -0,0 +1,24 @@ +#![crate_name = "foo"] +//! # Description test crate +//! +//! This is the contents of the test crate docstring. +//! It should not show up in the description. + +// @has 'foo/index.html' '//meta[@name="description"]/@content' \ +// 'Description test crate' +// @!has - '//meta[@name="description"]/@content' 'should not show up' + +// @has 'foo/foo_mod/index.html' '//meta[@name="description"]/@content' \ +// 'First paragraph description.' +// @!has - '//meta[@name="description"]/@content' 'Second paragraph' +/// First paragraph description. +/// +/// Second paragraph should not show up. +pub mod foo_mod { + pub struct __Thing {} +} + +// @has 'foo/fn.foo_fn.html' '//meta[@name="description"]/@content' \ +// 'Only paragraph.' +/// Only paragraph. +pub fn foo_fn() {} diff --git a/src/test/rustdoc/description_default.rs b/src/test/rustdoc/description_default.rs new file mode 100644 index 0000000000..21d8e04d3f --- /dev/null +++ b/src/test/rustdoc/description_default.rs @@ -0,0 +1,14 @@ +#![crate_name = "foo"] + +// @has 'foo/index.html' '//meta[@name="description"]/@content' \ +// 'API documentation for the Rust `foo` crate.' + +// @has 'foo/foo_mod/index.html' '//meta[@name="description"]/@content' \ +// 'API documentation for the Rust `foo_mod` mod in crate `foo`.' +pub mod foo_mod { + pub struct __Thing {} +} + +// @has 'foo/fn.foo_fn.html' '//meta[@name="description"]/@content' \ +// 'API documentation for the Rust `foo_fn` fn in crate `foo`.' +pub fn foo_fn() {} diff --git a/src/test/rustdoc/doc-cfg.rs b/src/test/rustdoc/doc-cfg.rs index 51a5837829..89a61a289f 100644 --- a/src/test/rustdoc/doc-cfg.rs +++ b/src/test/rustdoc/doc-cfg.rs @@ -5,6 +5,8 @@ // @!has - '//*[@id="main"]/*[@class="item-info"]/*[@class="stab portability"]' '' // @has - '//*[@id="method.unix_and_arm_only_function"]' 'fn unix_and_arm_only_function()' // @has - '//*[@class="stab portability"]' 'This is supported on Unix and ARM only.' +// @has - '//*[@id="method.wasi_and_wasm32_only_function"]' 'fn wasi_and_wasm32_only_function()' +// @has - '//*[@class="stab portability"]' 'This is supported on WASI and WebAssembly only.' pub struct Portable; // @has doc_cfg/unix_only/index.html \ @@ -37,6 +39,36 @@ pub mod unix_only { } } +// @has doc_cfg/wasi_only/index.html \ +// '//*[@id="main"]/*[@class="item-info"]/*[@class="stab portability"]' \ +// 'This is supported on WASI only.' +// @matches - '//*[@class="module-item"]//*[@class="stab portability"]' '\AWebAssembly\Z' +// @count - '//*[@class="stab portability"]' 2 +#[doc(cfg(target_os = "wasi"))] +pub mod wasi_only { + // @has doc_cfg/wasi_only/fn.wasi_only_function.html \ + // '//*[@id="main"]/*[@class="item-info"]/*[@class="stab portability"]' \ + // 'This is supported on WASI only.' + // @count - '//*[@class="stab portability"]' 1 + pub fn wasi_only_function() { + content::should::be::irrelevant(); + } + + // @has doc_cfg/wasi_only/trait.Wasm32Only.html \ + // '//*[@id="main"]/*[@class="item-info"]/*[@class="stab portability"]' \ + // 'This is supported on WASI and WebAssembly only.' + // @count - '//*[@class="stab portability"]' 1 + #[doc(cfg(target_arch = "wasm32"))] + pub trait Wasm32Only { + fn wasi_and_wasm32_only_function(); + } + + #[doc(cfg(target_arch = "wasm32"))] + impl Wasm32Only for super::Portable { + fn wasi_and_wasm32_only_function() {} + } +} + // tagging a function with `#[target_feature]` creates a doc(cfg(target_feature)) node for that // item as well diff --git a/src/test/rustdoc/ensure-src-link.rs b/src/test/rustdoc/ensure-src-link.rs new file mode 100644 index 0000000000..b7e7b11d27 --- /dev/null +++ b/src/test/rustdoc/ensure-src-link.rs @@ -0,0 +1,6 @@ +#![crate_name = "foo"] + +// This test ensures that the [src] link is present on traits items. + +// @has foo/trait.Iterator.html '//h3[@id="method.zip"]/a[@class="srclink"]' "[src]" +pub use std::iter::Iterator; diff --git a/src/test/rustdoc/extern-links.rs b/src/test/rustdoc/extern-links.rs index 991f869138..0383ccf7db 100644 --- a/src/test/rustdoc/extern-links.rs +++ b/src/test/rustdoc/extern-links.rs @@ -3,7 +3,7 @@ #![crate_name = "foo"] -extern crate extern_links; +pub extern crate extern_links; // @!has foo/index.html '//a' 'extern_links' #[doc(no_inline)] diff --git a/src/test/rustdoc/impl-trait-alias.rs b/src/test/rustdoc/impl-trait-alias.rs index 54c3f856dd..bf73a83358 100644 --- a/src/test/rustdoc/impl-trait-alias.rs +++ b/src/test/rustdoc/impl-trait-alias.rs @@ -1,4 +1,4 @@ -#![feature(type_alias_impl_trait)] +#![feature(min_type_alias_impl_trait)] trait MyTrait {} impl MyTrait for i32 {} diff --git a/src/test/rustdoc/implementor-stable-version.rs b/src/test/rustdoc/implementor-stable-version.rs index 0a065d8095..a1f3fd5a8c 100644 --- a/src/test/rustdoc/implementor-stable-version.rs +++ b/src/test/rustdoc/implementor-stable-version.rs @@ -1,3 +1,4 @@ +#![stable(feature = "bar", since = "OLD 1.0")] #![crate_name = "foo"] #![feature(staged_api)] @@ -8,6 +9,7 @@ pub trait Bar {} #[stable(feature = "baz", since = "OLD 1.0")] pub trait Baz {} +#[stable(feature = "baz", since = "OLD 1.0")] pub struct Foo; // @has foo/trait.Bar.html '//div[@id="implementors-list"]//span[@class="since"]' 'NEW 2.0' diff --git a/src/test/rustdoc/inline_cross/add-docs.rs b/src/test/rustdoc/inline_cross/add-docs.rs index 1af5e8f03b..8f0c4e5e64 100644 --- a/src/test/rustdoc/inline_cross/add-docs.rs +++ b/src/test/rustdoc/inline_cross/add-docs.rs @@ -4,6 +4,6 @@ extern crate inner; // @has add_docs/struct.MyStruct.html -// @has add_docs/struct.MyStruct.html "Doc comment from 'pub use', Doc comment from definition" +// @has add_docs/struct.MyStruct.html "Doc comment from ‘pub use’, Doc comment from definition" /// Doc comment from 'pub use', pub use inner::MyStruct; diff --git a/src/test/rustdoc/inline_cross/impl_trait.rs b/src/test/rustdoc/inline_cross/impl_trait.rs index 0ab2fa99f8..44e2c4d3fb 100644 --- a/src/test/rustdoc/inline_cross/impl_trait.rs +++ b/src/test/rustdoc/inline_cross/impl_trait.rs @@ -18,7 +18,7 @@ pub use impl_trait_aux::func2; // @has impl_trait/fn.func3.html // @has - '//pre[@class="rust fn"]' "func3(" -// @has - '//pre[@class="rust fn"]' "_x: impl Clone + Iterator>)" +// @has - '//pre[@class="rust fn"]' "_x: impl Iterator> + Clone)" // @!has - '//pre[@class="rust fn"]' 'where' pub use impl_trait_aux::func3; diff --git a/src/test/rustdoc/intra-doc/issue-82209.rs b/src/test/rustdoc/intra-doc/issue-82209.rs new file mode 100644 index 0000000000..76618cdce4 --- /dev/null +++ b/src/test/rustdoc/intra-doc/issue-82209.rs @@ -0,0 +1,11 @@ +#![crate_name = "foo"] +#![deny(broken_intra_doc_links)] +pub enum Foo { + Bar { + abc: i32, + /// [Self::Bar::abc] + xyz: i32, + }, +} + +// @has foo/enum.Foo.html '//a/@href' '../foo/enum.Foo.html#variant.Bar.field.abc' diff --git a/src/test/rustdoc/intra-doc/libstd-re-export.rs b/src/test/rustdoc/intra-doc/libstd-re-export.rs index d0af3aec66..fc0ff90438 100644 --- a/src/test/rustdoc/intra-doc/libstd-re-export.rs +++ b/src/test/rustdoc/intra-doc/libstd-re-export.rs @@ -1,3 +1,4 @@ #![deny(broken_intra_doc_links)] +#![feature(intra_doc_pointers)] pub use std::*; diff --git a/src/test/rustdoc/intra-doc/non-path-primitives.rs b/src/test/rustdoc/intra-doc/non-path-primitives.rs index 48c667ef2d..ffa02b0c63 100644 --- a/src/test/rustdoc/intra-doc/non-path-primitives.rs +++ b/src/test/rustdoc/intra-doc/non-path-primitives.rs @@ -1,7 +1,7 @@ // ignore-tidy-linelength #![crate_name = "foo"] #![feature(intra_doc_pointers)] -#![deny(broken_intra_doc_links)] +#![deny(rustdoc::broken_intra_doc_links)] // @has foo/index.html '//a[@href="https://doc.rust-lang.org/nightly/std/primitive.slice.html#method.rotate_left"]' 'slice::rotate_left' //! [slice::rotate_left] diff --git a/src/test/rustdoc/issue-28927.rs b/src/test/rustdoc/issue-28927.rs index 7b535f33bf..38a520850b 100644 --- a/src/test/rustdoc/issue-28927.rs +++ b/src/test/rustdoc/issue-28927.rs @@ -2,5 +2,5 @@ // aux-build:issue-28927-1.rs // ignore-cross-compile -extern crate issue_28927_1 as inner1; +pub extern crate issue_28927_1 as inner1; pub use inner1 as foo; diff --git a/src/test/rustdoc/playground-arg.rs b/src/test/rustdoc/playground-arg.rs index 018716ad45..dbe2297f81 100644 --- a/src/test/rustdoc/playground-arg.rs +++ b/src/test/rustdoc/playground-arg.rs @@ -11,4 +11,4 @@ pub fn dummy() {} // ensure that `extern crate foo;` was inserted into code snips automatically: -// @matches foo/index.html '//a[@class="test-arrow"][@href="https://example.com/?code=%23!%5Ballow(unused)%5D%0Aextern%20crate%20foo%3B%0Afn%20main()%20%7B%0Ause%20foo%3A%3Adummy%3B%0Adummy()%3B%0A%7D&edition=2015"]' "Run" +// @matches foo/index.html '//a[@class="test-arrow"][@href="https://example.com/?code=%23!%5Ballow(unused)%5D%0Aextern%20crate%20r%23foo%3B%0Afn%20main()%20%7B%0Ause%20foo%3A%3Adummy%3B%0Adummy()%3B%0A%7D&edition=2015"]' "Run" diff --git a/src/test/rustdoc/redirect-map-empty.rs b/src/test/rustdoc/redirect-map-empty.rs new file mode 100644 index 0000000000..e9d021e0fa --- /dev/null +++ b/src/test/rustdoc/redirect-map-empty.rs @@ -0,0 +1,6 @@ +// compile-flags: -Z unstable-options --generate-redirect-map + +#![crate_name = "foo"] + +// @!has foo/redirect-map.json +pub struct Foo; diff --git a/src/test/rustdoc/redirect-map.rs b/src/test/rustdoc/redirect-map.rs new file mode 100644 index 0000000000..b7f16b64e3 --- /dev/null +++ b/src/test/rustdoc/redirect-map.rs @@ -0,0 +1,23 @@ +// compile-flags: -Z unstable-options --generate-redirect-map + +#![crate_name = "foo"] + +// @!has foo/private/struct.Quz.html +// @!has foo/hidden/struct.Bar.html +// @has foo/redirect-map.json +pub use private::Quz; +pub use hidden::Bar; + +mod private { + pub struct Quz; +} + +#[doc(hidden)] +pub mod hidden { + pub struct Bar; +} + +#[macro_export] +macro_rules! foo { + () => {} +} diff --git a/src/test/rustdoc/return-impl-trait.rs b/src/test/rustdoc/return-impl-trait.rs index 1ccf5ac461..da4945aadf 100644 --- a/src/test/rustdoc/return-impl-trait.rs +++ b/src/test/rustdoc/return-impl-trait.rs @@ -1,4 +1,4 @@ -#![feature(type_alias_impl_trait)] +#![feature(min_type_alias_impl_trait)] pub trait Backend {} diff --git a/src/test/rustdoc/sized_trait.rs b/src/test/rustdoc/sized_trait.rs new file mode 100644 index 0000000000..26d12817af --- /dev/null +++ b/src/test/rustdoc/sized_trait.rs @@ -0,0 +1,17 @@ +#![crate_name = "foo"] + +// @has foo/struct.Bar.html +// @!has - '//h3[@id="impl-Sized"]' +pub struct Bar { + a: u16, +} + +// @has foo/struct.Foo.html +// @!has - '//h3[@id="impl-Sized"]' +pub struct Foo(T); + +// @has foo/struct.Unsized.html +// @has - '//h3[@id="impl-Sized"]/code' 'impl !Sized for Unsized' +pub struct Unsized { + data: [u8], +} diff --git a/src/test/rustdoc/smart-punct.rs b/src/test/rustdoc/smart-punct.rs new file mode 100644 index 0000000000..a1ca269955 --- /dev/null +++ b/src/test/rustdoc/smart-punct.rs @@ -0,0 +1,30 @@ +// ignore-tidy-linelength + +#![crate_name = "foo"] + +//! This is the "start" of the 'document'! How'd you know that "it's" the start? +//! +//! # Header with "smart punct'" +//! +//! [link with "smart punct'" -- yessiree!][] +//! +//! [link with "smart punct'" -- yessiree!]: https://www.rust-lang.org +//! +//! # Code should not be smart-punct'd +//! +//! `this inline code -- it shouldn't have "smart punct"` +//! +//! ``` +//! let x = "don't smart-punct me -- please!"; +//! ``` +//! +//! ```text +//! I say "don't smart-punct me -- please!" +//! ``` + +// @has "foo/index.html" "//p" "This is the “start” of the ‘document’! How’d you know that “it’s” the start?" +// @has "foo/index.html" "//h1" "Header with “smart punct’”" +// @has "foo/index.html" '//a[@href="https://www.rust-lang.org"]' "link with “smart punct’” – yessiree!" +// @has "foo/index.html" '//code' "this inline code -- it shouldn't have \"smart punct\"" +// @has "foo/index.html" '//pre' "let x = \"don't smart-punct me -- please!\";" +// @has "foo/index.html" '//pre' "I say \"don't smart-punct me -- please!\"" diff --git a/src/test/rustdoc/spotlight-from-dependency.rs b/src/test/rustdoc/spotlight-from-dependency.rs new file mode 100644 index 0000000000..ed42c43594 --- /dev/null +++ b/src/test/rustdoc/spotlight-from-dependency.rs @@ -0,0 +1,24 @@ +#![crate_name = "foo"] + +use std::iter::Iterator; + +// @has foo/struct.Odd.html +// @has - '//h4[@id="method.new"]//span[@class="notable-traits"]//code/span' 'impl Iterator for Odd' +pub struct Odd { + current: usize, +} + +impl Odd { + pub fn new() -> Odd { + Odd { current: 1 } + } +} + +impl Iterator for Odd { + type Item = usize; + + fn next(&mut self) -> Option { + self.current += 2; + Some(self.current - 2) + } +} diff --git a/src/test/rustdoc/src-links-auto-impls.rs b/src/test/rustdoc/src-links-auto-impls.rs new file mode 100644 index 0000000000..a1d183df0f --- /dev/null +++ b/src/test/rustdoc/src-links-auto-impls.rs @@ -0,0 +1,12 @@ +#![crate_name = "foo"] + +// @has foo/struct.Unsized.html +// @has - '//h3[@id="impl-Sized"]/code' 'impl !Sized for Unsized' +// @!has - '//h3[@id="impl-Sized"]/a[@class="srclink"]' '[src]' +// @has - '//h3[@id="impl-Sync"]/code' 'impl Sync for Unsized' +// @!has - '//h3[@id="impl-Sync"]/a[@class="srclink"]' '[src]' +// @has - '//h3[@id="impl-Any"]/code' 'impl Any for T' +// @has - '//h3[@id="impl-Any"]/a[@class="srclink"]' '[src]' +pub struct Unsized { + data: [u8], +} diff --git a/src/test/rustdoc/task-lists.rs b/src/test/rustdoc/task-lists.rs new file mode 100644 index 0000000000..c2e7dd60f2 --- /dev/null +++ b/src/test/rustdoc/task-lists.rs @@ -0,0 +1,13 @@ +// ignore-tidy-linelength +// FIXME: this doesn't test as much as I'd like; ideally it would have these query too: + // has task_lists/index.html '//li/input[@type="checkbox" and disabled]/following-sibling::text()' 'a' + // has task_lists/index.html '//li/input[@type="checkbox"]/following-sibling::text()' 'b' +// Unfortunately that requires LXML, because the built-in xml module doesn't support all of xpath. + +// @has task_lists/index.html '//ul/li/input[@type="checkbox"]' '' +// @has task_lists/index.html '//ul/li/input[@disabled]' '' +// @has task_lists/index.html '//ul/li' 'a' +// @has task_lists/index.html '//ul/li' 'b' +//! This tests 'task list' support, a common markdown extension. +//! - [ ] a +//! - [x] b diff --git a/src/test/rustdoc/trait-self-link.rs b/src/test/rustdoc/trait-self-link.rs index 51e1fe91f9..bac28b4401 100644 --- a/src/test/rustdoc/trait-self-link.rs +++ b/src/test/rustdoc/trait-self-link.rs @@ -1,4 +1,4 @@ -// @!has trait_self_link/trait.Foo.html //a/@href ../trait_self_link/trait.Foo.html +// @has trait_self_link/trait.Foo.html //a/@href ../trait_self_link/trait.Foo.html pub trait Foo {} pub struct Bar; diff --git a/src/test/rustdoc/unit-return.rs b/src/test/rustdoc/unit-return.rs index b1f251dae6..ae3a603151 100644 --- a/src/test/rustdoc/unit-return.rs +++ b/src/test/rustdoc/unit-return.rs @@ -10,8 +10,8 @@ pub fn f0(f: F) {} // @has 'foo/fn.f1.html' '//*[@class="rust fn"]' 'F: FnMut(u16) + Clone' pub fn f1 () + Clone>(f: F) {} -// @has 'foo/fn.f2.html' '//*[@class="rust fn"]' 'F: Clone + FnMut(u32)' +// @has 'foo/fn.f2.html' '//*[@class="rust fn"]' 'F: FnMut(u32) + Clone' pub use unit_return::f2; -// @has 'foo/fn.f3.html' '//*[@class="rust fn"]' 'F: Clone + FnMut(u64)' +// @has 'foo/fn.f3.html' '//*[@class="rust fn"]' 'F: FnMut(u64) + Clone' pub use unit_return::f3; diff --git a/src/test/ui-fulldeps/auxiliary/issue-40001-plugin.rs b/src/test/ui-fulldeps/auxiliary/issue-40001-plugin.rs index 4e9d4d3427..124dd670d0 100644 --- a/src/test/ui-fulldeps/auxiliary/issue-40001-plugin.rs +++ b/src/test/ui-fulldeps/auxiliary/issue-40001-plugin.rs @@ -49,7 +49,7 @@ impl<'tcx> LateLintPass<'tcx> for MissingAllowedAttrPass { }; let allowed = |attr| pprust::attribute_to_string(attr).contains("allowed_attr"); - if !item.attrs.iter().any(allowed) { + if !cx.tcx.hir().attrs(item.hir_id()).iter().any(allowed) { cx.lint(MISSING_ALLOWED_ATTR, |lint| { lint.build("Missing 'allowed_attr' attribute").set_span(span).emit() }); 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 736a8633da..8b1a3887f1 100644 --- a/src/test/ui-fulldeps/auxiliary/lint-for-crate-rpass.rs +++ b/src/test/ui-fulldeps/auxiliary/lint-for-crate-rpass.rs @@ -28,8 +28,9 @@ macro_rules! fake_lint_pass { impl LateLintPass<'_> for $struct { fn check_crate(&mut self, cx: &LateContext, krate: &rustc_hir::Crate) { + let attrs = cx.tcx.hir().attrs(rustc_hir::CRATE_HIR_ID); $( - if !cx.sess().contains_name(&krate.item.attrs, $attr) { + if !cx.sess().contains_name(attrs, $attr) { cx.lint(CRATE_NOT_OKAY, |lint| { let msg = format!("crate is not marked with #![{}]", $attr); lint.build(&msg).set_span(krate.item.span).emit() diff --git a/src/test/ui-fulldeps/auxiliary/lint-for-crate.rs b/src/test/ui-fulldeps/auxiliary/lint-for-crate.rs index bd477b793f..c9269d2b9b 100644 --- a/src/test/ui-fulldeps/auxiliary/lint-for-crate.rs +++ b/src/test/ui-fulldeps/auxiliary/lint-for-crate.rs @@ -27,7 +27,8 @@ declare_lint_pass!(Pass => [CRATE_NOT_OKAY]); impl<'tcx> LateLintPass<'tcx> for Pass { fn check_crate(&mut self, cx: &LateContext, krate: &rustc_hir::Crate) { - if !cx.sess().contains_name(&krate.item.attrs, Symbol::intern("crate_okay")) { + let attrs = cx.tcx.hir().attrs(rustc_hir::CRATE_HIR_ID); + if !cx.sess().contains_name(attrs, Symbol::intern("crate_okay")) { cx.lint(CRATE_NOT_OKAY, |lint| { lint.build("crate is not marked with #![crate_okay]") .set_span(krate.item.span) diff --git a/src/test/ui-fulldeps/pprust-expr-roundtrip.rs b/src/test/ui-fulldeps/pprust-expr-roundtrip.rs index bff92d8607..ac2d29c9ca 100644 --- a/src/test/ui-fulldeps/pprust-expr-roundtrip.rs +++ b/src/test/ui-fulldeps/pprust-expr-roundtrip.rs @@ -155,7 +155,9 @@ fn iter_exprs(depth: usize, f: &mut dyn FnMut(P)) { }, 17 => { let path = Path::from_ident(Ident::from_str("S")); - g(ExprKind::Struct(path, vec![], StructRest::Base(make_x()))); + g(ExprKind::Struct(P(StructExpr { + path, fields: vec![], rest: StructRest::Base(make_x()) + }))); }, 18 => { iter_exprs(depth - 1, &mut |e| g(ExprKind::Try(e))); diff --git a/src/test/ui/nullable-pointer-ffi-compat.rs b/src/test/ui/abi/nullable-pointer-ffi-compat.rs similarity index 100% rename from src/test/ui/nullable-pointer-ffi-compat.rs rename to src/test/ui/abi/nullable-pointer-ffi-compat.rs diff --git a/src/test/ui/allocator/no_std-alloc-error-handler-custom.rs b/src/test/ui/allocator/no_std-alloc-error-handler-custom.rs index 4d40c7d0d2..c9b4abbfd3 100644 --- a/src/test/ui/allocator/no_std-alloc-error-handler-custom.rs +++ b/src/test/ui/allocator/no_std-alloc-error-handler-custom.rs @@ -7,7 +7,7 @@ // compile-flags:-C panic=abort // aux-build:helper.rs -#![feature(start, rustc_private, new_uninit, panic_info_message)] +#![feature(start, rustc_private, new_uninit, panic_info_message, lang_items)] #![feature(alloc_error_handler)] #![no_std] @@ -84,6 +84,13 @@ fn panic(panic_info: &core::panic::PanicInfo) -> ! { } } +// Because we are compiling this code with `-C panic=abort`, this wouldn't normally be needed. +// However, `core` and `alloc` are both compiled with `-C panic=unwind`, which means that functions +// in these libaries will refer to `rust_eh_personality` if LLVM can not *prove* the contents won't +// unwind. So, for this test case we will define the symbol. +#[lang = "eh_personality"] +extern fn rust_eh_personality() {} + #[derive(Debug)] struct Page([[u64; 32]; 16]); diff --git a/src/test/ui/allocator/no_std-alloc-error-handler-default.rs b/src/test/ui/allocator/no_std-alloc-error-handler-default.rs index 4f8c44f176..d6cd4a6af8 100644 --- a/src/test/ui/allocator/no_std-alloc-error-handler-default.rs +++ b/src/test/ui/allocator/no_std-alloc-error-handler-default.rs @@ -8,7 +8,7 @@ // aux-build:helper.rs // gate-test-default_alloc_error_handler -#![feature(start, rustc_private, new_uninit, panic_info_message)] +#![feature(start, rustc_private, new_uninit, panic_info_message, lang_items)] #![feature(default_alloc_error_handler)] #![no_std] @@ -71,6 +71,13 @@ fn panic(panic_info: &core::panic::PanicInfo) -> ! { } } +// Because we are compiling this code with `-C panic=abort`, this wouldn't normally be needed. +// However, `core` and `alloc` are both compiled with `-C panic=unwind`, which means that functions +// in these libaries will refer to `rust_eh_personality` if LLVM can not *prove* the contents won't +// unwind. So, for this test case we will define the symbol. +#[lang = "eh_personality"] +extern fn rust_eh_personality() {} + #[derive(Debug)] struct Page([[u64; 32]; 16]); diff --git a/src/test/ui/anon-params/anon-params-denied-2018.rs b/src/test/ui/anon-params/anon-params-denied-2018.rs index 5721f5d235..95533cf3df 100644 --- a/src/test/ui/anon-params/anon-params-denied-2018.rs +++ b/src/test/ui/anon-params/anon-params-denied-2018.rs @@ -5,6 +5,20 @@ trait T { fn foo(i32); //~ expected one of `:`, `@`, or `|`, found `)` + // Also checks with `&` + fn foo_with_ref(&mut i32); + //~^ ERROR expected one of `:`, `@`, or `|`, found `)` + + fn foo_with_qualified_path(::Baz); + //~^ ERROR expected one of `(`, `...`, `..=`, `..`, `::`, `:`, `{`, or `|`, found `)` + + fn foo_with_qualified_path_and_ref(&::Baz); + //~^ ERROR expected one of `(`, `...`, `..=`, `..`, `::`, `:`, `{`, or `|`, found `)` + + fn foo_with_multiple_qualified_paths(::Baz, ::Baz); + //~^ ERROR expected one of `(`, `...`, `..=`, `..`, `::`, `:`, `{`, or `|`, found `,` + //~| ERROR expected one of `(`, `...`, `..=`, `..`, `::`, `:`, `{`, or `|`, found `)` + fn bar_with_default_impl(String, String) {} //~^ ERROR expected one of `:` //~| ERROR expected one of `:` diff --git a/src/test/ui/anon-params/anon-params-denied-2018.stderr b/src/test/ui/anon-params/anon-params-denied-2018.stderr index 840294db08..b53640cd65 100644 --- a/src/test/ui/anon-params/anon-params-denied-2018.stderr +++ b/src/test/ui/anon-params/anon-params-denied-2018.stderr @@ -18,8 +18,76 @@ help: if this is a type, explicitly ignore the parameter name LL | fn foo(_: i32); | ^^^^^^ +error: expected one of `:`, `@`, or `|`, found `)` + --> $DIR/anon-params-denied-2018.rs:9:29 + | +LL | fn foo_with_ref(&mut i32); + | ^ expected one of `:`, `@`, or `|` + | + = note: anonymous parameters are removed in the 2018 edition (see RFC 1685) +help: if this is a `self` type, give it a parameter name + | +LL | fn foo_with_ref(self: &mut i32); + | ^^^^^^^^^^^^^^ +help: if this is a parameter name, give it a type + | +LL | fn foo_with_ref(i32: &mut TypeName); + | ^^^^^^^^^^^^^^^^^^ +help: if this is a type, explicitly ignore the parameter name + | +LL | fn foo_with_ref(_: &mut i32); + | ^^^^^^^^^^^ + +error: expected one of `(`, `...`, `..=`, `..`, `::`, `:`, `{`, or `|`, found `)` + --> $DIR/anon-params-denied-2018.rs:12:47 + | +LL | fn foo_with_qualified_path(::Baz); + | ^ expected one of 8 possible tokens + | + = note: anonymous parameters are removed in the 2018 edition (see RFC 1685) +help: explicitly ignore the parameter name + | +LL | fn foo_with_qualified_path(_: ::Baz); + | ^^^^^^^^^^^^^^^^^^ + +error: expected one of `(`, `...`, `..=`, `..`, `::`, `:`, `{`, or `|`, found `)` + --> $DIR/anon-params-denied-2018.rs:15:56 + | +LL | fn foo_with_qualified_path_and_ref(&::Baz); + | ^ expected one of 8 possible tokens + | + = note: anonymous parameters are removed in the 2018 edition (see RFC 1685) +help: explicitly ignore the parameter name + | +LL | fn foo_with_qualified_path_and_ref(_: &::Baz); + | ^^^^^^^^^^^^^^^^^^^ + +error: expected one of `(`, `...`, `..=`, `..`, `::`, `:`, `{`, or `|`, found `,` + --> $DIR/anon-params-denied-2018.rs:18:57 + | +LL | fn foo_with_multiple_qualified_paths(::Baz, ::Baz); + | ^ expected one of 8 possible tokens + | + = note: anonymous parameters are removed in the 2018 edition (see RFC 1685) +help: explicitly ignore the parameter name + | +LL | fn foo_with_multiple_qualified_paths(_: ::Baz, ::Baz); + | ^^^^^^^^^^^^^^^^^^ + +error: expected one of `(`, `...`, `..=`, `..`, `::`, `:`, `{`, or `|`, found `)` + --> $DIR/anon-params-denied-2018.rs:18:74 + | +LL | fn foo_with_multiple_qualified_paths(::Baz, ::Baz); + | ^ expected one of 8 possible tokens + | + = note: anonymous parameters are removed in the 2018 edition (see RFC 1685) +help: explicitly ignore the parameter name + | +LL | fn foo_with_multiple_qualified_paths(::Baz, _: ::Baz); + | ^^^^^^^^^^^^^^^^^^ + error: expected one of `:`, `@`, or `|`, found `,` - --> $DIR/anon-params-denied-2018.rs:8:36 + --> $DIR/anon-params-denied-2018.rs:22:36 | LL | fn bar_with_default_impl(String, String) {} | ^ expected one of `:`, `@`, or `|` @@ -39,7 +107,7 @@ LL | fn bar_with_default_impl(_: String, String) {} | ^^^^^^^^^ error: expected one of `:`, `@`, or `|`, found `)` - --> $DIR/anon-params-denied-2018.rs:8:44 + --> $DIR/anon-params-denied-2018.rs:22:44 | LL | fn bar_with_default_impl(String, String) {} | ^ expected one of `:`, `@`, or `|` @@ -55,7 +123,7 @@ LL | fn bar_with_default_impl(String, _: String) {} | ^^^^^^^^^ error: expected one of `:`, `@`, or `|`, found `,` - --> $DIR/anon-params-denied-2018.rs:13:22 + --> $DIR/anon-params-denied-2018.rs:27:22 | LL | fn baz(a:usize, b, c: usize) -> usize { | ^ expected one of `:`, `@`, or `|` @@ -70,5 +138,5 @@ help: if this is a type, explicitly ignore the parameter name LL | fn baz(a:usize, _: b, c: usize) -> usize { | ^^^^ -error: aborting due to 4 previous errors +error: aborting due to 9 previous errors diff --git a/src/test/ui/array-slice-vec/vector-cast-weirdness.rs b/src/test/ui/array-slice-vec/vector-cast-weirdness.rs index 79b9243765..e8f2c71477 100644 --- a/src/test/ui/array-slice-vec/vector-cast-weirdness.rs +++ b/src/test/ui/array-slice-vec/vector-cast-weirdness.rs @@ -1,7 +1,11 @@ // Issue #14893. Tests that casts from vectors don't behave strangely in the // presence of the `_` type shorthand notation. +// // Update: after a change to the way casts are done, we have more type information // around and so the errors here are no longer exactly the same. +// +// Update: With PR #81479 some of the previously rejected cases are now allowed. +// New test cases added. struct X { y: [u8; 2], @@ -12,13 +16,19 @@ fn main() { // No longer a type mismatch - the `_` can be fully resolved by type inference. let p1: *const u8 = &x1.y as *const _; + let p1: *mut u8 = &x1.y as *mut _; + //~^ ERROR: casting `&[u8; 2]` as `*mut u8` is invalid let t1: *const [u8; 2] = &x1.y as *const _; + let t1: *mut [u8; 2] = &x1.y as *mut _; + //~^ ERROR: casting `&[u8; 2]` as `*mut [u8; 2]` is invalid let h1: *const [u8; 2] = &x1.y as *const [u8; 2]; + let t1: *mut [u8; 2] = &x1.y as *mut [u8; 2]; + //~^ ERROR: casting `&[u8; 2]` as `*mut [u8; 2]` is invalid let mut x1 = X { y: [0, 0] }; - // This is still an error since we don't allow casts from &mut [T; n] to *mut T. - let p1: *mut u8 = &mut x1.y as *mut _; //~ ERROR casting + let p1: *mut u8 = &mut x1.y as *mut _; + let p2: *const u8 = &mut x1.y as *const _; let t1: *mut [u8; 2] = &mut x1.y as *mut _; let h1: *mut [u8; 2] = &mut x1.y as *mut [u8; 2]; } diff --git a/src/test/ui/array-slice-vec/vector-cast-weirdness.stderr b/src/test/ui/array-slice-vec/vector-cast-weirdness.stderr index 37055bb75f..6fdb1ac9e3 100644 --- a/src/test/ui/array-slice-vec/vector-cast-weirdness.stderr +++ b/src/test/ui/array-slice-vec/vector-cast-weirdness.stderr @@ -1,9 +1,21 @@ -error[E0606]: casting `&mut [u8; 2]` as `*mut u8` is invalid - --> $DIR/vector-cast-weirdness.rs:21:23 +error[E0606]: casting `&[u8; 2]` as `*mut u8` is invalid + --> $DIR/vector-cast-weirdness.rs:19:23 | -LL | let p1: *mut u8 = &mut x1.y as *mut _; - | ^^^^^^^^^^^^^^^^^^^ +LL | let p1: *mut u8 = &x1.y as *mut _; + | ^^^^^^^^^^^^^^^ -error: aborting due to previous error +error[E0606]: casting `&[u8; 2]` as `*mut [u8; 2]` is invalid + --> $DIR/vector-cast-weirdness.rs:22:28 + | +LL | let t1: *mut [u8; 2] = &x1.y as *mut _; + | ^^^^^^^^^^^^^^^ + +error[E0606]: casting `&[u8; 2]` as `*mut [u8; 2]` is invalid + --> $DIR/vector-cast-weirdness.rs:25:28 + | +LL | let t1: *mut [u8; 2] = &x1.y as *mut [u8; 2]; + | ^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 3 previous errors For more information about this error, try `rustc --explain E0606`. diff --git a/src/test/ui/asm/inline-syntax.arm.stderr b/src/test/ui/asm/inline-syntax.arm.stderr new file mode 100644 index 0000000000..b1b61f0211 --- /dev/null +++ b/src/test/ui/asm/inline-syntax.arm.stderr @@ -0,0 +1,14 @@ +error: att syntax is the default syntax on this target, and trying to use this directive may cause issues + --> $DIR/inline-syntax.rs:22:15 + | +LL | asm!(".att_syntax noprefix", "nop"); + | ^^^^^^^^^^^^^^^^^^^^ help: remove this assembler directive + +error: att syntax is the default syntax on this target, and trying to use this directive may cause issues + --> $DIR/inline-syntax.rs:25:15 + | +LL | asm!(".att_syntax bbb noprefix", "nop"); + | ^^^^^^^^^^^^^^^^^^^^^^^^ help: remove this assembler directive + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/asm/inline-syntax.rs b/src/test/ui/asm/inline-syntax.rs new file mode 100644 index 0000000000..9e9c7badfc --- /dev/null +++ b/src/test/ui/asm/inline-syntax.rs @@ -0,0 +1,38 @@ +// revisions: x86_64 arm +//[x86_64] compile-flags: --target x86_64-unknown-linux-gnu +//[arm] compile-flags: --target armv7-unknown-linux-gnueabihf + +#![feature(no_core, lang_items, rustc_attrs)] +#![no_core] + +#[rustc_builtin_macro] +macro_rules! asm { + () => {}; +} + +#[lang = "sized"] +trait Sized {} + +fn main() { + unsafe { + asm!(".intel_syntax noprefix", "nop"); + //[x86_64]~^ ERROR intel syntax is the default syntax on this target + asm!(".intel_syntax aaa noprefix", "nop"); + //[x86_64]~^ ERROR intel syntax is the default syntax on this target + asm!(".att_syntax noprefix", "nop"); + //[x86_64]~^ ERROR using the .att_syntax directive may cause issues + //[arm]~^^ att syntax is the default syntax on this target + asm!(".att_syntax bbb noprefix", "nop"); + //[x86_64]~^ ERROR using the .att_syntax directive may cause issues + //[arm]~^^ att syntax is the default syntax on this target + asm!(".intel_syntax noprefix; nop"); + //[x86_64]~^ ERROR intel syntax is the default syntax on this target + + asm!( + r" + .intel_syntax noprefix + nop" + ); + //[x86_64]~^^^ ERROR intel syntax is the default syntax on this target + } +} diff --git a/src/test/ui/asm/inline-syntax.x86_64.stderr b/src/test/ui/asm/inline-syntax.x86_64.stderr new file mode 100644 index 0000000000..c54c2742a5 --- /dev/null +++ b/src/test/ui/asm/inline-syntax.x86_64.stderr @@ -0,0 +1,50 @@ +error: intel syntax is the default syntax on this target, and trying to use this directive may cause issues + --> $DIR/inline-syntax.rs:18:15 + | +LL | asm!(".intel_syntax noprefix", "nop"); + | ^^^^^^^^^^^^^^^^^^^^^^ help: remove this assembler directive + +error: intel syntax is the default syntax on this target, and trying to use this directive may cause issues + --> $DIR/inline-syntax.rs:20:15 + | +LL | asm!(".intel_syntax aaa noprefix", "nop"); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: remove this assembler directive + +error: using the .att_syntax directive may cause issues, use the att_syntax option instead + --> $DIR/inline-syntax.rs:22:15 + | +LL | asm!(".att_syntax noprefix", "nop"); + | ^^^^^^^^^^^^^^^^^^^^ + | +help: remove the assembler directive and replace it with options(att_syntax) + | +LL | asm!("", "nop", options(att_syntax)); + | -- ^^^^^^^^^^^^^^^^^^^^^ + +error: using the .att_syntax directive may cause issues, use the att_syntax option instead + --> $DIR/inline-syntax.rs:25:15 + | +LL | asm!(".att_syntax bbb noprefix", "nop"); + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: remove the assembler directive and replace it with options(att_syntax) + | +LL | asm!("", "nop", options(att_syntax)); + | -- ^^^^^^^^^^^^^^^^^^^^^ + +error: intel syntax is the default syntax on this target, and trying to use this directive may cause issues + --> $DIR/inline-syntax.rs:28:15 + | +LL | asm!(".intel_syntax noprefix; nop"); + | ^^^^^^^^^^^^^^^^^^^^^^ help: remove this assembler directive + +error: intel syntax is the default syntax on this target, and trying to use this directive may cause issues + --> $DIR/inline-syntax.rs:33:14 + | +LL | .intel_syntax noprefix + | ______________^ +LL | | nop" + | |_ help: remove this assembler directive + +error: aborting due to 6 previous errors + diff --git a/src/test/ui/assoc-inherent.rs b/src/test/ui/assoc-inherent.rs index 05329a2714..c579c962ff 100644 --- a/src/test/ui/assoc-inherent.rs +++ b/src/test/ui/assoc-inherent.rs @@ -1,9 +1,20 @@ -// Test associated types are, until #8995 is implemented, forbidden in inherent impls. +// Test that inherent associated types work with +// inherent_associated_types feature gate. + +#![feature(inherent_associated_types)] +#![allow(incomplete_features)] struct Foo; impl Foo { - type Bar = isize; //~ERROR associated types are not yet supported in inherent impls (see #8995) + type Bar = isize; } -fn main() {} +impl Foo { + type Baz; //~ ERROR associated type in `impl` without body +} + +fn main() { + let x : Foo::Bar; //~ERROR ambiguous associated type + x = 0isize; +} diff --git a/src/test/ui/assoc-inherent.stderr b/src/test/ui/assoc-inherent.stderr index f9ea3365cb..b703453fa0 100644 --- a/src/test/ui/assoc-inherent.stderr +++ b/src/test/ui/assoc-inherent.stderr @@ -1,9 +1,17 @@ -error[E0202]: associated types are not yet supported in inherent impls (see #8995) - --> $DIR/assoc-inherent.rs:6:5 +error: associated type in `impl` without body + --> $DIR/assoc-inherent.rs:14:5 | -LL | type Bar = isize; - | ^^^^^^^^^^^^^^^^^ +LL | type Baz; + | ^^^^^^^^- + | | + | help: provide a definition for the type: `= ;` -error: aborting due to previous error +error[E0223]: ambiguous associated type + --> $DIR/assoc-inherent.rs:18:13 + | +LL | let x : Foo::Bar; + | ^^^^^^^^ help: use fully-qualified syntax: `::Bar` + +error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0202`. +For more information about this error, try `rustc --explain E0223`. diff --git a/src/test/ui/associated-consts/defaults-cyclic-fail.stderr b/src/test/ui/associated-consts/defaults-cyclic-fail.stderr index 616ac9053f..3fb4ab72fe 100644 --- a/src/test/ui/associated-consts/defaults-cyclic-fail.stderr +++ b/src/test/ui/associated-consts/defaults-cyclic-fail.stderr @@ -32,7 +32,7 @@ note: ...which requires const-evaluating + checking `Tr::B`... LL | const B: u8 = Self::A; | ^^^^^^^^^^^^^^^^^^^^^^ = note: ...which again requires normalizing `<() as Tr>::A`, completing the cycle -note: cycle used when const-evaluating + checking `main::promoted[2]` +note: cycle used when const-evaluating + checking `main::promoted[1]` --> $DIR/defaults-cyclic-fail.rs:14:1 | LL | fn main() { diff --git a/src/test/ui/associated-type-bounds/ambiguous-associated-type2.rs b/src/test/ui/associated-type-bounds/ambiguous-associated-type2.rs new file mode 100644 index 0000000000..1b6d6d0ff5 --- /dev/null +++ b/src/test/ui/associated-type-bounds/ambiguous-associated-type2.rs @@ -0,0 +1,12 @@ +// ignore-tidy-linelength + +trait Foo { + type Item; +} +trait Bar { + type Item; +} +trait Baz: Foo + Bar {} +//~^ ERROR cycle detected when computing the super traits of `Baz` with associated type name `Item` [E0391] + +fn main() {} diff --git a/src/test/ui/associated-type-bounds/ambiguous-associated-type2.stderr b/src/test/ui/associated-type-bounds/ambiguous-associated-type2.stderr new file mode 100644 index 0000000000..bda1debeac --- /dev/null +++ b/src/test/ui/associated-type-bounds/ambiguous-associated-type2.stderr @@ -0,0 +1,16 @@ +error[E0391]: cycle detected when computing the super traits of `Baz` with associated type name `Item` + --> $DIR/ambiguous-associated-type2.rs:9:1 + | +LL | trait Baz: Foo + Bar {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: ...which again requires computing the super traits of `Baz` with associated type name `Item`, completing the cycle +note: cycle used when computing the super traits of `Baz` + --> $DIR/ambiguous-associated-type2.rs:9:1 + | +LL | trait Baz: Foo + Bar {} + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0391`. diff --git a/src/test/ui/associated-type-bounds/associated-item-through-where-clause.rs b/src/test/ui/associated-type-bounds/associated-item-through-where-clause.rs new file mode 100644 index 0000000000..3eb50ab554 --- /dev/null +++ b/src/test/ui/associated-type-bounds/associated-item-through-where-clause.rs @@ -0,0 +1,21 @@ +// check-pass + +trait Foo { + type Item; +} + +trait Bar +where + Self: Foo, +{ +} + +#[allow(dead_code)] +fn foo(_m: M) +where + M: Bar, + M::Item: Send, +{ +} + +fn main() {} diff --git a/src/test/ui/associated-type-bounds/bad-bounds-on-assoc-in-trait.stderr b/src/test/ui/associated-type-bounds/bad-bounds-on-assoc-in-trait.stderr index 1c493581bc..a5ebb80c83 100644 --- a/src/test/ui/associated-type-bounds/bad-bounds-on-assoc-in-trait.stderr +++ b/src/test/ui/associated-type-bounds/bad-bounds-on-assoc-in-trait.stderr @@ -1,15 +1,3 @@ -error[E0277]: `<::C as Iterator>::Item` is not an iterator - --> $DIR/bad-bounds-on-assoc-in-trait.rs:27:5 - | -LL | type C: Clone + Iterator Lam<&'a u8, App: Debug>> + Sync>; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `<::C as Iterator>::Item` is not an iterator - | - = help: the trait `Iterator` is not implemented for `<::C as Iterator>::Item` -help: consider further restricting the associated type - | -LL | trait Case1 where <::C as Iterator>::Item: Iterator { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - error[E0277]: `<::C as Iterator>::Item` cannot be sent between threads safely --> $DIR/bad-bounds-on-assoc-in-trait.rs:27:36 | @@ -27,6 +15,23 @@ help: consider further restricting the associated type LL | trait Case1 where <::C as Iterator>::Item: Send { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +error[E0277]: `<::C as Iterator>::Item` is not an iterator + --> $DIR/bad-bounds-on-assoc-in-trait.rs:27:43 + | +LL | type C: Clone + Iterator Lam<&'a u8, App: Debug>> + Sync>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `<::C as Iterator>::Item` is not an iterator + | + ::: $SRC_DIR/core/src/iter/traits/iterator.rs:LL:COL + | +LL | pub trait Iterator { + | ------------------ required by this bound in `Iterator` + | + = help: the trait `Iterator` is not implemented for `<::C as Iterator>::Item` +help: consider further restricting the associated type + | +LL | trait Case1 where <::C as Iterator>::Item: Iterator { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + error[E0277]: `<::C as Iterator>::Item` cannot be shared between threads safely --> $DIR/bad-bounds-on-assoc-in-trait.rs:27:93 | diff --git a/src/test/ui/associated-type-bounds/duplicate.full_tait.stderr b/src/test/ui/associated-type-bounds/duplicate.full_tait.stderr new file mode 100644 index 0000000000..bde2d034e2 --- /dev/null +++ b/src/test/ui/associated-type-bounds/duplicate.full_tait.stderr @@ -0,0 +1,572 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/duplicate.rs:6:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/duplicate.rs:8:12 + | +LL | #![feature(impl_trait_in_bindings)] + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:13:36 + | +LL | struct SI1> { f: T } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:15:36 + | +LL | struct SI2> { f: T } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:17:39 + | +LL | struct SI3> { f: T } + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:19:45 + | +LL | struct SW1 where T: Iterator { f: T } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:21:45 + | +LL | struct SW2 where T: Iterator { f: T } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:23:48 + | +LL | struct SW3 where T: Iterator { f: T } + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:26:34 + | +LL | enum EI1> { V(T) } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:28:34 + | +LL | enum EI2> { V(T) } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:30:37 + | +LL | enum EI3> { V(T) } + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:32:43 + | +LL | enum EW1 where T: Iterator { V(T) } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:34:43 + | +LL | enum EW2 where T: Iterator { V(T) } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:36:46 + | +LL | enum EW3 where T: Iterator { V(T) } + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:39:35 + | +LL | union UI1> { f: T } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:41:35 + | +LL | union UI2> { f: T } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:43:38 + | +LL | union UI3> { f: T } + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:45:44 + | +LL | union UW1 where T: Iterator { f: T } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:47:44 + | +LL | union UW2 where T: Iterator { f: T } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:49:47 + | +LL | union UW3 where T: Iterator { f: T } + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:52:32 + | +LL | fn FI1>() {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:54:32 + | +LL | fn FI2>() {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:56:35 + | +LL | fn FI3>() {} + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:58:43 + | +LL | fn FW1() where T: Iterator {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:60:43 + | +LL | fn FW2() where T: Iterator {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:62:46 + | +LL | fn FW3() where T: Iterator {} + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:68:40 + | +LL | fn FAPIT1(_: impl Iterator) {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:70:40 + | +LL | fn FAPIT2(_: impl Iterator) {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:72:43 + | +LL | fn FAPIT3(_: impl Iterator) {} + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:75:39 + | +LL | const CIT1: impl Iterator = iter::empty(); + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:77:39 + | +LL | const CIT2: impl Iterator = iter::empty(); + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:79:42 + | +LL | const CIT3: impl Iterator = iter::empty(); + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:81:40 + | +LL | static SIT1: impl Iterator = iter::empty(); + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:83:40 + | +LL | static SIT2: impl Iterator = iter::empty(); + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:85:43 + | +LL | static SIT3: impl Iterator = iter::empty(); + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:88:46 + | +LL | fn lit1() { let _: impl Iterator = iter::empty(); } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:90:46 + | +LL | fn lit2() { let _: impl Iterator = iter::empty(); } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:92:49 + | +LL | fn lit3() { let _: impl Iterator = iter::empty(); } + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:95:35 + | +LL | type TAI1> = T; + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:97:35 + | +LL | type TAI2> = T; + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:99:38 + | +LL | type TAI3> = T; + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:101:44 + | +LL | type TAW1 where T: Iterator = T; + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:103:44 + | +LL | type TAW2 where T: Iterator = T; + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:105:47 + | +LL | type TAW3 where T: Iterator = T; + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:108:36 + | +LL | type ETAI1> = impl Copy; + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:110:36 + | +LL | type ETAI2> = impl Copy; + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:112:39 + | +LL | type ETAI3> = impl Copy; + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:114:40 + | +LL | type ETAI4 = impl Iterator; + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:116:40 + | +LL | type ETAI5 = impl Iterator; + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:118:43 + | +LL | type ETAI6 = impl Iterator; + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:121:36 + | +LL | trait TRI1> {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:123:36 + | +LL | trait TRI2> {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:125:39 + | +LL | trait TRI3> {} + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:127:34 + | +LL | trait TRS1: Iterator {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:129:34 + | +LL | trait TRS2: Iterator {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:131:37 + | +LL | trait TRS3: Iterator {} + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:133:45 + | +LL | trait TRW1 where T: Iterator {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:135:45 + | +LL | trait TRW2 where T: Iterator {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:137:48 + | +LL | trait TRW3 where T: Iterator {} + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:139:46 + | +LL | trait TRSW1 where Self: Iterator {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:139:46 + | +LL | trait TRSW1 where Self: Iterator {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:142:46 + | +LL | trait TRSW2 where Self: Iterator {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:142:46 + | +LL | trait TRSW2 where Self: Iterator {} + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:145:49 + | +LL | trait TRSW3 where Self: Iterator {} + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:145:49 + | +LL | trait TRSW3 where Self: Iterator {} + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:155:40 + | +LL | type TADyn1 = dyn Iterator; + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:157:44 + | +LL | type TADyn2 = Box>; + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:159:43 + | +LL | type TADyn3 = dyn Iterator; + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:148:43 + | +LL | trait TRA1 { type A: Iterator; } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:150:43 + | +LL | trait TRA2 { type A: Iterator; } + | ---------- ^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified + --> $DIR/duplicate.rs:152:46 + | +LL | trait TRA3 { type A: Iterator; } + | ------------- ^^^^^^^^^^^^^ re-bound here + | | + | `Item` bound here first + +error: aborting due to 69 previous errors; 2 warnings emitted + +For more information about this error, try `rustc --explain E0719`. diff --git a/src/test/ui/associated-type-bounds/duplicate.stderr b/src/test/ui/associated-type-bounds/duplicate.min_tait.stderr similarity index 91% rename from src/test/ui/associated-type-bounds/duplicate.stderr rename to src/test/ui/associated-type-bounds/duplicate.min_tait.stderr index de2876d6b6..cc775dee4a 100644 --- a/src/test/ui/associated-type-bounds/duplicate.stderr +++ b/src/test/ui/associated-type-bounds/duplicate.min_tait.stderr @@ -1,5 +1,5 @@ warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/duplicate.rs:5:12 + --> $DIR/duplicate.rs:8:12 | LL | #![feature(impl_trait_in_bindings)] | ^^^^^^^^^^^^^^^^^^^^^^ @@ -8,7 +8,7 @@ LL | #![feature(impl_trait_in_bindings)] = note: see issue #63065 for more information error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:10:36 + --> $DIR/duplicate.rs:13:36 | LL | struct SI1> { f: T } | ---------- ^^^^^^^^^^ re-bound here @@ -16,7 +16,7 @@ LL | struct SI1> { f: T } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:12:36 + --> $DIR/duplicate.rs:15:36 | LL | struct SI2> { f: T } | ---------- ^^^^^^^^^^ re-bound here @@ -24,7 +24,7 @@ LL | struct SI2> { f: T } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:14:39 + --> $DIR/duplicate.rs:17:39 | LL | struct SI3> { f: T } | ------------- ^^^^^^^^^^^^^ re-bound here @@ -32,7 +32,7 @@ LL | struct SI3> { f: T } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:16:45 + --> $DIR/duplicate.rs:19:45 | LL | struct SW1 where T: Iterator { f: T } | ---------- ^^^^^^^^^^ re-bound here @@ -40,7 +40,7 @@ LL | struct SW1 where T: Iterator { f: T } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:18:45 + --> $DIR/duplicate.rs:21:45 | LL | struct SW2 where T: Iterator { f: T } | ---------- ^^^^^^^^^^ re-bound here @@ -48,7 +48,7 @@ LL | struct SW2 where T: Iterator { f: T } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:20:48 + --> $DIR/duplicate.rs:23:48 | LL | struct SW3 where T: Iterator { f: T } | ------------- ^^^^^^^^^^^^^ re-bound here @@ -56,7 +56,7 @@ LL | struct SW3 where T: Iterator { f: T } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:23:34 + --> $DIR/duplicate.rs:26:34 | LL | enum EI1> { V(T) } | ---------- ^^^^^^^^^^ re-bound here @@ -64,7 +64,7 @@ LL | enum EI1> { V(T) } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:25:34 + --> $DIR/duplicate.rs:28:34 | LL | enum EI2> { V(T) } | ---------- ^^^^^^^^^^ re-bound here @@ -72,7 +72,7 @@ LL | enum EI2> { V(T) } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:27:37 + --> $DIR/duplicate.rs:30:37 | LL | enum EI3> { V(T) } | ------------- ^^^^^^^^^^^^^ re-bound here @@ -80,7 +80,7 @@ LL | enum EI3> { V(T) } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:29:43 + --> $DIR/duplicate.rs:32:43 | LL | enum EW1 where T: Iterator { V(T) } | ---------- ^^^^^^^^^^ re-bound here @@ -88,7 +88,7 @@ LL | enum EW1 where T: Iterator { V(T) } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:31:43 + --> $DIR/duplicate.rs:34:43 | LL | enum EW2 where T: Iterator { V(T) } | ---------- ^^^^^^^^^^ re-bound here @@ -96,7 +96,7 @@ LL | enum EW2 where T: Iterator { V(T) } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:33:46 + --> $DIR/duplicate.rs:36:46 | LL | enum EW3 where T: Iterator { V(T) } | ------------- ^^^^^^^^^^^^^ re-bound here @@ -104,7 +104,7 @@ LL | enum EW3 where T: Iterator { V(T) } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:36:35 + --> $DIR/duplicate.rs:39:35 | LL | union UI1> { f: T } | ---------- ^^^^^^^^^^ re-bound here @@ -112,7 +112,7 @@ LL | union UI1> { f: T } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:38:35 + --> $DIR/duplicate.rs:41:35 | LL | union UI2> { f: T } | ---------- ^^^^^^^^^^ re-bound here @@ -120,7 +120,7 @@ LL | union UI2> { f: T } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:40:38 + --> $DIR/duplicate.rs:43:38 | LL | union UI3> { f: T } | ------------- ^^^^^^^^^^^^^ re-bound here @@ -128,7 +128,7 @@ LL | union UI3> { f: T } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:42:44 + --> $DIR/duplicate.rs:45:44 | LL | union UW1 where T: Iterator { f: T } | ---------- ^^^^^^^^^^ re-bound here @@ -136,7 +136,7 @@ LL | union UW1 where T: Iterator { f: T } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:44:44 + --> $DIR/duplicate.rs:47:44 | LL | union UW2 where T: Iterator { f: T } | ---------- ^^^^^^^^^^ re-bound here @@ -144,7 +144,7 @@ LL | union UW2 where T: Iterator { f: T } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:46:47 + --> $DIR/duplicate.rs:49:47 | LL | union UW3 where T: Iterator { f: T } | ------------- ^^^^^^^^^^^^^ re-bound here @@ -152,7 +152,7 @@ LL | union UW3 where T: Iterator { f: T } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:49:32 + --> $DIR/duplicate.rs:52:32 | LL | fn FI1>() {} | ---------- ^^^^^^^^^^ re-bound here @@ -160,7 +160,7 @@ LL | fn FI1>() {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:51:32 + --> $DIR/duplicate.rs:54:32 | LL | fn FI2>() {} | ---------- ^^^^^^^^^^ re-bound here @@ -168,7 +168,7 @@ LL | fn FI2>() {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:53:35 + --> $DIR/duplicate.rs:56:35 | LL | fn FI3>() {} | ------------- ^^^^^^^^^^^^^ re-bound here @@ -176,7 +176,7 @@ LL | fn FI3>() {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:55:43 + --> $DIR/duplicate.rs:58:43 | LL | fn FW1() where T: Iterator {} | ---------- ^^^^^^^^^^ re-bound here @@ -184,7 +184,7 @@ LL | fn FW1() where T: Iterator {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:57:43 + --> $DIR/duplicate.rs:60:43 | LL | fn FW2() where T: Iterator {} | ---------- ^^^^^^^^^^ re-bound here @@ -192,7 +192,7 @@ LL | fn FW2() where T: Iterator {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:59:46 + --> $DIR/duplicate.rs:62:46 | LL | fn FW3() where T: Iterator {} | ------------- ^^^^^^^^^^^^^ re-bound here @@ -200,7 +200,7 @@ LL | fn FW3() where T: Iterator {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:65:40 + --> $DIR/duplicate.rs:68:40 | LL | fn FAPIT1(_: impl Iterator) {} | ---------- ^^^^^^^^^^ re-bound here @@ -208,7 +208,7 @@ LL | fn FAPIT1(_: impl Iterator) {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:67:40 + --> $DIR/duplicate.rs:70:40 | LL | fn FAPIT2(_: impl Iterator) {} | ---------- ^^^^^^^^^^ re-bound here @@ -216,7 +216,7 @@ LL | fn FAPIT2(_: impl Iterator) {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:69:43 + --> $DIR/duplicate.rs:72:43 | LL | fn FAPIT3(_: impl Iterator) {} | ------------- ^^^^^^^^^^^^^ re-bound here @@ -224,7 +224,7 @@ LL | fn FAPIT3(_: impl Iterator) {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:72:39 + --> $DIR/duplicate.rs:75:39 | LL | const CIT1: impl Iterator = iter::empty(); | ---------- ^^^^^^^^^^ re-bound here @@ -232,7 +232,7 @@ LL | const CIT1: impl Iterator = iter::empty(); | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:74:39 + --> $DIR/duplicate.rs:77:39 | LL | const CIT2: impl Iterator = iter::empty(); | ---------- ^^^^^^^^^^ re-bound here @@ -240,7 +240,7 @@ LL | const CIT2: impl Iterator = iter::empty(); | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:76:42 + --> $DIR/duplicate.rs:79:42 | LL | const CIT3: impl Iterator = iter::empty(); | ------------- ^^^^^^^^^^^^^ re-bound here @@ -248,7 +248,7 @@ LL | const CIT3: impl Iterator = iter::empty(); | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:78:40 + --> $DIR/duplicate.rs:81:40 | LL | static SIT1: impl Iterator = iter::empty(); | ---------- ^^^^^^^^^^ re-bound here @@ -256,7 +256,7 @@ LL | static SIT1: impl Iterator = iter::empty(); | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:80:40 + --> $DIR/duplicate.rs:83:40 | LL | static SIT2: impl Iterator = iter::empty(); | ---------- ^^^^^^^^^^ re-bound here @@ -264,7 +264,7 @@ LL | static SIT2: impl Iterator = iter::empty(); | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:82:43 + --> $DIR/duplicate.rs:85:43 | LL | static SIT3: impl Iterator = iter::empty(); | ------------- ^^^^^^^^^^^^^ re-bound here @@ -272,7 +272,7 @@ LL | static SIT3: impl Iterator = iter::empty(); | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:85:46 + --> $DIR/duplicate.rs:88:46 | LL | fn lit1() { let _: impl Iterator = iter::empty(); } | ---------- ^^^^^^^^^^ re-bound here @@ -280,7 +280,7 @@ LL | fn lit1() { let _: impl Iterator = iter::empty(); } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:87:46 + --> $DIR/duplicate.rs:90:46 | LL | fn lit2() { let _: impl Iterator = iter::empty(); } | ---------- ^^^^^^^^^^ re-bound here @@ -288,7 +288,7 @@ LL | fn lit2() { let _: impl Iterator = iter::empty(); } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:89:49 + --> $DIR/duplicate.rs:92:49 | LL | fn lit3() { let _: impl Iterator = iter::empty(); } | ------------- ^^^^^^^^^^^^^ re-bound here @@ -296,7 +296,7 @@ LL | fn lit3() { let _: impl Iterator = iter::empt | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:92:35 + --> $DIR/duplicate.rs:95:35 | LL | type TAI1> = T; | ---------- ^^^^^^^^^^ re-bound here @@ -304,7 +304,7 @@ LL | type TAI1> = T; | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:94:35 + --> $DIR/duplicate.rs:97:35 | LL | type TAI2> = T; | ---------- ^^^^^^^^^^ re-bound here @@ -312,7 +312,7 @@ LL | type TAI2> = T; | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:96:38 + --> $DIR/duplicate.rs:99:38 | LL | type TAI3> = T; | ------------- ^^^^^^^^^^^^^ re-bound here @@ -320,7 +320,7 @@ LL | type TAI3> = T; | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:98:44 + --> $DIR/duplicate.rs:101:44 | LL | type TAW1 where T: Iterator = T; | ---------- ^^^^^^^^^^ re-bound here @@ -328,7 +328,7 @@ LL | type TAW1 where T: Iterator = T; | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:100:44 + --> $DIR/duplicate.rs:103:44 | LL | type TAW2 where T: Iterator = T; | ---------- ^^^^^^^^^^ re-bound here @@ -336,7 +336,7 @@ LL | type TAW2 where T: Iterator = T; | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:102:47 + --> $DIR/duplicate.rs:105:47 | LL | type TAW3 where T: Iterator = T; | ------------- ^^^^^^^^^^^^^ re-bound here @@ -344,7 +344,7 @@ LL | type TAW3 where T: Iterator = T; | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:105:36 + --> $DIR/duplicate.rs:108:36 | LL | type ETAI1> = impl Copy; | ---------- ^^^^^^^^^^ re-bound here @@ -352,7 +352,7 @@ LL | type ETAI1> = impl Copy; | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:107:36 + --> $DIR/duplicate.rs:110:36 | LL | type ETAI2> = impl Copy; | ---------- ^^^^^^^^^^ re-bound here @@ -360,7 +360,7 @@ LL | type ETAI2> = impl Copy; | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:109:39 + --> $DIR/duplicate.rs:112:39 | LL | type ETAI3> = impl Copy; | ------------- ^^^^^^^^^^^^^ re-bound here @@ -368,7 +368,7 @@ LL | type ETAI3> = impl Copy; | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:111:40 + --> $DIR/duplicate.rs:114:40 | LL | type ETAI4 = impl Iterator; | ---------- ^^^^^^^^^^ re-bound here @@ -376,7 +376,7 @@ LL | type ETAI4 = impl Iterator; | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:113:40 + --> $DIR/duplicate.rs:116:40 | LL | type ETAI5 = impl Iterator; | ---------- ^^^^^^^^^^ re-bound here @@ -384,7 +384,7 @@ LL | type ETAI5 = impl Iterator; | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:115:43 + --> $DIR/duplicate.rs:118:43 | LL | type ETAI6 = impl Iterator; | ------------- ^^^^^^^^^^^^^ re-bound here @@ -392,7 +392,7 @@ LL | type ETAI6 = impl Iterator; | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:118:36 + --> $DIR/duplicate.rs:121:36 | LL | trait TRI1> {} | ---------- ^^^^^^^^^^ re-bound here @@ -400,7 +400,7 @@ LL | trait TRI1> {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:120:36 + --> $DIR/duplicate.rs:123:36 | LL | trait TRI2> {} | ---------- ^^^^^^^^^^ re-bound here @@ -408,7 +408,7 @@ LL | trait TRI2> {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:122:39 + --> $DIR/duplicate.rs:125:39 | LL | trait TRI3> {} | ------------- ^^^^^^^^^^^^^ re-bound here @@ -416,7 +416,7 @@ LL | trait TRI3> {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:124:34 + --> $DIR/duplicate.rs:127:34 | LL | trait TRS1: Iterator {} | ---------- ^^^^^^^^^^ re-bound here @@ -424,7 +424,7 @@ LL | trait TRS1: Iterator {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:126:34 + --> $DIR/duplicate.rs:129:34 | LL | trait TRS2: Iterator {} | ---------- ^^^^^^^^^^ re-bound here @@ -432,7 +432,7 @@ LL | trait TRS2: Iterator {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:128:37 + --> $DIR/duplicate.rs:131:37 | LL | trait TRS3: Iterator {} | ------------- ^^^^^^^^^^^^^ re-bound here @@ -440,7 +440,7 @@ LL | trait TRS3: Iterator {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:130:45 + --> $DIR/duplicate.rs:133:45 | LL | trait TRW1 where T: Iterator {} | ---------- ^^^^^^^^^^ re-bound here @@ -448,7 +448,7 @@ LL | trait TRW1 where T: Iterator {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:132:45 + --> $DIR/duplicate.rs:135:45 | LL | trait TRW2 where T: Iterator {} | ---------- ^^^^^^^^^^ re-bound here @@ -456,7 +456,7 @@ LL | trait TRW2 where T: Iterator {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:134:48 + --> $DIR/duplicate.rs:137:48 | LL | trait TRW3 where T: Iterator {} | ------------- ^^^^^^^^^^^^^ re-bound here @@ -464,7 +464,7 @@ LL | trait TRW3 where T: Iterator {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:136:46 + --> $DIR/duplicate.rs:139:46 | LL | trait TRSW1 where Self: Iterator {} | ---------- ^^^^^^^^^^ re-bound here @@ -472,7 +472,7 @@ LL | trait TRSW1 where Self: Iterator {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:136:46 + --> $DIR/duplicate.rs:139:46 | LL | trait TRSW1 where Self: Iterator {} | ---------- ^^^^^^^^^^ re-bound here @@ -480,7 +480,7 @@ LL | trait TRSW1 where Self: Iterator {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:139:46 + --> $DIR/duplicate.rs:142:46 | LL | trait TRSW2 where Self: Iterator {} | ---------- ^^^^^^^^^^ re-bound here @@ -488,7 +488,7 @@ LL | trait TRSW2 where Self: Iterator {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:139:46 + --> $DIR/duplicate.rs:142:46 | LL | trait TRSW2 where Self: Iterator {} | ---------- ^^^^^^^^^^ re-bound here @@ -496,7 +496,7 @@ LL | trait TRSW2 where Self: Iterator {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:142:49 + --> $DIR/duplicate.rs:145:49 | LL | trait TRSW3 where Self: Iterator {} | ------------- ^^^^^^^^^^^^^ re-bound here @@ -504,7 +504,7 @@ LL | trait TRSW3 where Self: Iterator {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:142:49 + --> $DIR/duplicate.rs:145:49 | LL | trait TRSW3 where Self: Iterator {} | ------------- ^^^^^^^^^^^^^ re-bound here @@ -512,7 +512,7 @@ LL | trait TRSW3 where Self: Iterator {} | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:152:40 + --> $DIR/duplicate.rs:155:40 | LL | type TADyn1 = dyn Iterator; | ---------- ^^^^^^^^^^ re-bound here @@ -520,7 +520,7 @@ LL | type TADyn1 = dyn Iterator; | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:154:44 + --> $DIR/duplicate.rs:157:44 | LL | type TADyn2 = Box>; | ---------- ^^^^^^^^^^ re-bound here @@ -528,7 +528,7 @@ LL | type TADyn2 = Box>; | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:156:43 + --> $DIR/duplicate.rs:159:43 | LL | type TADyn3 = dyn Iterator; | ------------- ^^^^^^^^^^^^^ re-bound here @@ -536,7 +536,7 @@ LL | type TADyn3 = dyn Iterator; | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:145:43 + --> $DIR/duplicate.rs:148:43 | LL | trait TRA1 { type A: Iterator; } | ---------- ^^^^^^^^^^ re-bound here @@ -544,7 +544,7 @@ LL | trait TRA1 { type A: Iterator; } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:147:43 + --> $DIR/duplicate.rs:150:43 | LL | trait TRA2 { type A: Iterator; } | ---------- ^^^^^^^^^^ re-bound here @@ -552,7 +552,7 @@ LL | trait TRA2 { type A: Iterator; } | `Item` bound here first error[E0719]: the value of the associated type `Item` (from trait `Iterator`) is already specified - --> $DIR/duplicate.rs:149:46 + --> $DIR/duplicate.rs:152:46 | LL | trait TRA3 { type A: Iterator; } | ------------- ^^^^^^^^^^^^^ re-bound here diff --git a/src/test/ui/associated-type-bounds/duplicate.rs b/src/test/ui/associated-type-bounds/duplicate.rs index 39df9ba02f..a7bbeaf38e 100644 --- a/src/test/ui/associated-type-bounds/duplicate.rs +++ b/src/test/ui/associated-type-bounds/duplicate.rs @@ -1,7 +1,10 @@ // ignore-tidy-linelength #![feature(associated_type_bounds)] -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #![feature(impl_trait_in_bindings)] //~ WARN the feature `impl_trait_in_bindings` is incomplete #![feature(untagged_unions)] diff --git a/src/test/ui/associated-type-bounds/handle-predicates-that-can-define-assoc-type.rs b/src/test/ui/associated-type-bounds/handle-predicates-that-can-define-assoc-type.rs new file mode 100644 index 0000000000..b1e54ec044 --- /dev/null +++ b/src/test/ui/associated-type-bounds/handle-predicates-that-can-define-assoc-type.rs @@ -0,0 +1,10 @@ +// check-pass + +trait Foo {} +trait Bar { + type A; + type B; +} +trait Baz: Bar + Foo {} + +fn main() {} diff --git a/src/test/ui/associated-type-bounds/missing-trait-bound-for-assoc-fails.rs b/src/test/ui/associated-type-bounds/missing-trait-bound-for-assoc-fails.rs new file mode 100644 index 0000000000..07d0f8f876 --- /dev/null +++ b/src/test/ui/associated-type-bounds/missing-trait-bound-for-assoc-fails.rs @@ -0,0 +1,10 @@ +#[allow(dead_code)] +fn foo(_m: M) +where + M::Item: Temp, + //~^ ERROR cannot find trait `Temp` in this scope [E0405] + //~| ERROR associated type `Item` not found for `M` [E0220] +{ +} + +fn main() {} diff --git a/src/test/ui/associated-type-bounds/missing-trait-bound-for-assoc-fails.stderr b/src/test/ui/associated-type-bounds/missing-trait-bound-for-assoc-fails.stderr new file mode 100644 index 0000000000..bc2807b039 --- /dev/null +++ b/src/test/ui/associated-type-bounds/missing-trait-bound-for-assoc-fails.stderr @@ -0,0 +1,16 @@ +error[E0405]: cannot find trait `Temp` in this scope + --> $DIR/missing-trait-bound-for-assoc-fails.rs:4:14 + | +LL | M::Item: Temp, + | ^^^^ not found in this scope + +error[E0220]: associated type `Item` not found for `M` + --> $DIR/missing-trait-bound-for-assoc-fails.rs:4:8 + | +LL | M::Item: Temp, + | ^^^^ associated type `Item` not found + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0220, E0405. +For more information about an error, try `rustc --explain E0220`. diff --git a/src/test/ui/associated-type-bounds/super-trait-referencing-self.rs b/src/test/ui/associated-type-bounds/super-trait-referencing-self.rs new file mode 100644 index 0000000000..c82ec01f4d --- /dev/null +++ b/src/test/ui/associated-type-bounds/super-trait-referencing-self.rs @@ -0,0 +1,12 @@ +// check-pass +trait Foo { + type Bar; +} +trait Qux: Foo + AsRef {} +trait Foo2 {} + +trait Qux2: Foo2 + AsRef { + type Bar; +} + +fn main() {} diff --git a/src/test/ui/associated-type-bounds/super-trait-referencing.rs b/src/test/ui/associated-type-bounds/super-trait-referencing.rs new file mode 100644 index 0000000000..2e97535157 --- /dev/null +++ b/src/test/ui/associated-type-bounds/super-trait-referencing.rs @@ -0,0 +1,19 @@ +// check-pass + +// The goal of this test is to ensure that T: Bar +// in the where clause does not cycle + +trait Foo { + type Item; +} + +trait Bar {} + +fn baz() +where + T: Foo, + T: Bar, +{ +} + +fn main() {} diff --git a/src/test/ui/associated-type-bounds/super-trait-where-referencing-self.rs b/src/test/ui/associated-type-bounds/super-trait-where-referencing-self.rs new file mode 100644 index 0000000000..72a6be9ffc --- /dev/null +++ b/src/test/ui/associated-type-bounds/super-trait-where-referencing-self.rs @@ -0,0 +1,27 @@ +// check-pass + +// Test that we do not get a cycle due to +// resolving `Self::Bar` in the where clauses +// on a trait definition (in particular, in +// a where clause that is defining a superpredicate). + +trait Foo { + type Bar; +} +trait Qux +where + Self: Foo, + Self: AsRef, +{ +} +trait Foo2 {} + +trait Qux2 +where + Self: Foo2, + Self: AsRef, +{ + type Bar; +} + +fn main() {} diff --git a/src/test/ui/associated-type-bounds/trait-alias-impl-trait.full_tait.stderr b/src/test/ui/associated-type-bounds/trait-alias-impl-trait.full_tait.stderr new file mode 100644 index 0000000000..d4da4babf4 --- /dev/null +++ b/src/test/ui/associated-type-bounds/trait-alias-impl-trait.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/trait-alias-impl-trait.rs:6:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/associated-type-bounds/trait-alias-impl-trait.rs b/src/test/ui/associated-type-bounds/trait-alias-impl-trait.rs index 025540ce20..cf20631af5 100644 --- a/src/test/ui/associated-type-bounds/trait-alias-impl-trait.rs +++ b/src/test/ui/associated-type-bounds/trait-alias-impl-trait.rs @@ -1,7 +1,10 @@ // run-pass #![feature(associated_type_bounds)] -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::ops::Add; diff --git a/src/test/ui/associated-type-bounds/traits-assoc-anonymized.rs b/src/test/ui/associated-type-bounds/traits-assoc-anonymized.rs new file mode 100644 index 0000000000..a9d6eed810 --- /dev/null +++ b/src/test/ui/associated-type-bounds/traits-assoc-anonymized.rs @@ -0,0 +1,33 @@ +// check-pass + +pub struct LookupInternedStorage; + +impl QueryStorageOps for LookupInternedStorage +where + Q: Query, + for<'d> Q: QueryDb<'d>, +{ + fn fmt_index(&self, db: &>::DynDb) { + <>::DynDb as HasQueryGroup>::group_storage(db); + } +} + +pub trait HasQueryGroup { + fn group_storage(&self); +} + +pub trait QueryStorageOps +where + Q: Query, +{ + fn fmt_index(&self, db: &>::DynDb); +} + +pub trait QueryDb<'d> { + type DynDb: HasQueryGroup + 'd; + type Group; +} + +pub trait Query: for<'d> QueryDb<'d> {} + +fn main() {} diff --git a/src/test/ui/associated-type-bounds/traits-assoc-type-macros.rs b/src/test/ui/associated-type-bounds/traits-assoc-type-macros.rs new file mode 100644 index 0000000000..ad5c6aed97 --- /dev/null +++ b/src/test/ui/associated-type-bounds/traits-assoc-type-macros.rs @@ -0,0 +1,43 @@ +// check-pass +// compile-flags:-Cincremental=tmp/traits-assoc-type-macros + +// This test case makes sure that we can compile with incremental compilation +// enabled when there are macros, traits, inheritance and associated types involved. + +trait Deserializer { + type Error; +} + +trait Deserialize { + fn deserialize(_: D) -> D::Error + where + D: Deserializer; +} + +macro_rules! impl_deserialize { + ($name:ident) => { + impl Deserialize for $name { + fn deserialize(_: D) -> D::Error + where + D: Deserializer, + { + loop {} + } + } + }; +} + +macro_rules! formats { + { + $($name:ident,)* + } => { + $( + pub struct $name; + + impl_deserialize!($name); + )* + } +} +formats! { Foo, Bar, } + +fn main() {} diff --git a/src/test/ui/associated-types/associated-type-projection-from-multiple-supertraits.stderr b/src/test/ui/associated-types/associated-type-projection-from-multiple-supertraits.stderr index b6a88179c1..cd7c0dc4a4 100644 --- a/src/test/ui/associated-types/associated-type-projection-from-multiple-supertraits.stderr +++ b/src/test/ui/associated-types/associated-type-projection-from-multiple-supertraits.stderr @@ -20,12 +20,12 @@ LL | fn dent(c: C, color: C::Color) { | help: use fully qualified syntax to disambiguate | -LL | fn dent(c: C, color: ::Color) { - | ^^^^^^^^^^^^^^^^^ -help: use fully qualified syntax to disambiguate - | LL | fn dent(c: C, color: ::Color) { | ^^^^^^^^^^^^^^^^^^^^^ +help: use fully qualified syntax to disambiguate + | +LL | fn dent(c: C, color: ::Color) { + | ^^^^^^^^^^^^^^^^^ error[E0222]: ambiguous associated type `Color` in bounds of `BoxCar` --> $DIR/associated-type-projection-from-multiple-supertraits.rs:23:37 @@ -42,8 +42,8 @@ LL | fn dent_object(c: dyn BoxCar) { = help: consider introducing a new type parameter `T` and adding `where` constraints: where T: BoxCar, - T: Box::Color = COLOR, - T: Vehicle::Color = COLOR + T: Vehicle::Color = COLOR, + T: Box::Color = 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:23:30 @@ -73,12 +73,12 @@ LL | fn paint(c: C, d: C::Color) { | help: use fully qualified syntax to disambiguate | -LL | fn paint(c: C, d: ::Color) { - | ^^^^^^^^^^^^^^^^^ -help: use fully qualified syntax to disambiguate - | LL | fn paint(c: C, d: ::Color) { | ^^^^^^^^^^^^^^^^^^^^^ +help: use fully qualified syntax to disambiguate + | +LL | fn paint(c: C, d: ::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 diff --git a/src/test/ui/associated-types/associated-types-eq-hr.stderr b/src/test/ui/associated-types/associated-types-eq-hr.stderr index 127ab86735..6897b31fe4 100644 --- a/src/test/ui/associated-types/associated-types-eq-hr.stderr +++ b/src/test/ui/associated-types/associated-types-eq-hr.stderr @@ -31,82 +31,47 @@ LL | bar::(); error: implementation of `TheTrait` is not general enough --> $DIR/associated-types-eq-hr.rs:96:5 | -LL | / pub trait TheTrait { -LL | | type A; -LL | | -LL | | fn get(&self, t: T) -> Self::A; -LL | | } - | |_- trait `TheTrait` defined here -... -LL | tuple_one::(); - | ^^^^^^^^^^^^^^^^^^ implementation of `TheTrait` is not general enough +LL | tuple_one::(); + | ^^^^^^^^^^^^^^^^^^ implementation of `TheTrait` is not general enough | = note: `Tuple` must implement `TheTrait<(&'0 isize, &'1 isize)>`, for any two lifetimes `'0` and `'1`... - = note: ...but `Tuple` actually implements `TheTrait<(&'2 isize, &'2 isize)>`, for some specific lifetime `'2` + = note: ...but it actually implements `TheTrait<(&'2 isize, &'2 isize)>`, for some specific lifetime `'2` error: implementation of `TheTrait` is not general enough --> $DIR/associated-types-eq-hr.rs:96:5 | -LL | / pub trait TheTrait { -LL | | type A; -LL | | -LL | | fn get(&self, t: T) -> Self::A; -LL | | } - | |_- trait `TheTrait` defined here -... -LL | tuple_one::(); - | ^^^^^^^^^^^^^^^^^^ implementation of `TheTrait` is not general enough +LL | tuple_one::(); + | ^^^^^^^^^^^^^^^^^^ implementation of `TheTrait` is not general enough | = note: `Tuple` must implement `TheTrait<(&'0 isize, &'1 isize)>`, for any two lifetimes `'0` and `'1`... - = note: ...but `Tuple` actually implements `TheTrait<(&'2 isize, &'2 isize)>`, for some specific lifetime `'2` + = note: ...but it actually implements `TheTrait<(&'2 isize, &'2 isize)>`, for some specific lifetime `'2` error: implementation of `TheTrait` is not general enough --> $DIR/associated-types-eq-hr.rs:102:5 | -LL | / pub trait TheTrait { -LL | | type A; -LL | | -LL | | fn get(&self, t: T) -> Self::A; -LL | | } - | |_- trait `TheTrait` defined here -... -LL | tuple_two::(); - | ^^^^^^^^^^^^^^^^^^ implementation of `TheTrait` is not general enough +LL | tuple_two::(); + | ^^^^^^^^^^^^^^^^^^ implementation of `TheTrait` is not general enough | = note: `Tuple` must implement `TheTrait<(&'0 isize, &'1 isize)>`, for any two lifetimes `'0` and `'1`... - = note: ...but `Tuple` actually implements `TheTrait<(&'2 isize, &'2 isize)>`, for some specific lifetime `'2` + = note: ...but it actually implements `TheTrait<(&'2 isize, &'2 isize)>`, for some specific lifetime `'2` error: implementation of `TheTrait` is not general enough --> $DIR/associated-types-eq-hr.rs:102:5 | -LL | / pub trait TheTrait { -LL | | type A; -LL | | -LL | | fn get(&self, t: T) -> Self::A; -LL | | } - | |_- trait `TheTrait` defined here -... -LL | tuple_two::(); - | ^^^^^^^^^^^^^^^^^^ implementation of `TheTrait` is not general enough +LL | tuple_two::(); + | ^^^^^^^^^^^^^^^^^^ implementation of `TheTrait` is not general enough | = note: `Tuple` must implement `TheTrait<(&'0 isize, &'1 isize)>`, for any two lifetimes `'0` and `'1`... - = note: ...but `Tuple` actually implements `TheTrait<(&'2 isize, &'2 isize)>`, for some specific lifetime `'2` + = note: ...but it actually implements `TheTrait<(&'2 isize, &'2 isize)>`, for some specific lifetime `'2` error: implementation of `TheTrait` is not general enough --> $DIR/associated-types-eq-hr.rs:112:5 | -LL | / pub trait TheTrait { -LL | | type A; -LL | | -LL | | fn get(&self, t: T) -> Self::A; -LL | | } - | |_- trait `TheTrait` defined here -... -LL | tuple_four::(); - | ^^^^^^^^^^^^^^^^^^^ implementation of `TheTrait` is not general enough +LL | tuple_four::(); + | ^^^^^^^^^^^^^^^^^^^ implementation of `TheTrait` is not general enough | = note: `Tuple` must implement `TheTrait<(&'0 isize, &'1 isize)>`, for any two lifetimes `'0` and `'1`... - = note: ...but `Tuple` actually implements `TheTrait<(&'2 isize, &'2 isize)>`, for some specific lifetime `'2` + = note: ...but it actually implements `TheTrait<(&'2 isize, &'2 isize)>`, for some specific lifetime `'2` error: aborting due to 7 previous errors diff --git a/src/test/ui/associated-types/defaults-unsound-62211-1.stderr b/src/test/ui/associated-types/defaults-unsound-62211-1.stderr index 8e446cf051..bcdb50aa31 100644 --- a/src/test/ui/associated-types/defaults-unsound-62211-1.stderr +++ b/src/test/ui/associated-types/defaults-unsound-62211-1.stderr @@ -13,20 +13,6 @@ help: consider further restricting `Self` LL | trait UncheckedCopy: Sized + std::fmt::Display { | ^^^^^^^^^^^^^^^^^^^ -error[E0277]: the trait bound `Self: Deref` is not satisfied - --> $DIR/defaults-unsound-62211-1.rs:20:5 - | -LL | type Output: Copy + Deref + AddAssign<&'static str> + From + Display = Self; - | ^^^^^^^^^^^^^^^^^^^^-------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | | - | | required by this bound in `UncheckedCopy::Output` - | the trait `Deref` is not implemented for `Self` - | -help: consider further restricting `Self` - | -LL | trait UncheckedCopy: Sized + Deref { - | ^^^^^^^ - error[E0277]: cannot add-assign `&'static str` to `Self` --> $DIR/defaults-unsound-62211-1.rs:20:5 | @@ -41,6 +27,20 @@ help: consider further restricting `Self` LL | trait UncheckedCopy: Sized + AddAssign<&'static str> { | ^^^^^^^^^^^^^^^^^^^^^^^^^ +error[E0277]: the trait bound `Self: Deref` is not satisfied + --> $DIR/defaults-unsound-62211-1.rs:20:5 + | +LL | type Output: Copy + Deref + AddAssign<&'static str> + From + Display = Self; + | ^^^^^^^^^^^^^^^^^^^^-------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | | | + | | required by this bound in `UncheckedCopy::Output` + | the trait `Deref` is not implemented for `Self` + | +help: consider further restricting `Self` + | +LL | trait UncheckedCopy: Sized + Deref { + | ^^^^^^^ + error[E0277]: the trait bound `Self: Copy` is not satisfied --> $DIR/defaults-unsound-62211-1.rs:20:5 | diff --git a/src/test/ui/associated-types/defaults-unsound-62211-2.stderr b/src/test/ui/associated-types/defaults-unsound-62211-2.stderr index 93f4f497b3..fa5cf9196e 100644 --- a/src/test/ui/associated-types/defaults-unsound-62211-2.stderr +++ b/src/test/ui/associated-types/defaults-unsound-62211-2.stderr @@ -13,20 +13,6 @@ help: consider further restricting `Self` LL | trait UncheckedCopy: Sized + std::fmt::Display { | ^^^^^^^^^^^^^^^^^^^ -error[E0277]: the trait bound `Self: Deref` is not satisfied - --> $DIR/defaults-unsound-62211-2.rs:20:5 - | -LL | type Output: Copy + Deref + AddAssign<&'static str> + From + Display = Self; - | ^^^^^^^^^^^^^^^^^^^^-------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | | - | | required by this bound in `UncheckedCopy::Output` - | the trait `Deref` is not implemented for `Self` - | -help: consider further restricting `Self` - | -LL | trait UncheckedCopy: Sized + Deref { - | ^^^^^^^ - error[E0277]: cannot add-assign `&'static str` to `Self` --> $DIR/defaults-unsound-62211-2.rs:20:5 | @@ -41,6 +27,20 @@ help: consider further restricting `Self` LL | trait UncheckedCopy: Sized + AddAssign<&'static str> { | ^^^^^^^^^^^^^^^^^^^^^^^^^ +error[E0277]: the trait bound `Self: Deref` is not satisfied + --> $DIR/defaults-unsound-62211-2.rs:20:5 + | +LL | type Output: Copy + Deref + AddAssign<&'static str> + From + Display = Self; + | ^^^^^^^^^^^^^^^^^^^^-------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | | | + | | required by this bound in `UncheckedCopy::Output` + | the trait `Deref` is not implemented for `Self` + | +help: consider further restricting `Self` + | +LL | trait UncheckedCopy: Sized + Deref { + | ^^^^^^^ + error[E0277]: the trait bound `Self: Copy` is not satisfied --> $DIR/defaults-unsound-62211-2.rs:20:5 | diff --git a/src/test/ui/issues/issue-21726.rs b/src/test/ui/associated-types/issue-21726.rs similarity index 100% rename from src/test/ui/issues/issue-21726.rs rename to src/test/ui/associated-types/issue-21726.rs diff --git a/src/test/ui/issues/issue-22560.rs b/src/test/ui/associated-types/issue-22560.rs similarity index 100% rename from src/test/ui/issues/issue-22560.rs rename to src/test/ui/associated-types/issue-22560.rs diff --git a/src/test/ui/issues/issue-22560.stderr b/src/test/ui/associated-types/issue-22560.stderr similarity index 100% rename from src/test/ui/issues/issue-22560.stderr rename to src/test/ui/associated-types/issue-22560.stderr diff --git a/src/test/ui/issues/issue-23595-2.rs b/src/test/ui/associated-types/issue-23595-2.rs similarity index 100% rename from src/test/ui/issues/issue-23595-2.rs rename to src/test/ui/associated-types/issue-23595-2.rs diff --git a/src/test/ui/issues/issue-23595-2.stderr b/src/test/ui/associated-types/issue-23595-2.stderr similarity index 100% rename from src/test/ui/issues/issue-23595-2.stderr rename to src/test/ui/associated-types/issue-23595-2.stderr diff --git a/src/test/ui/issues/issue-24204.rs b/src/test/ui/associated-types/issue-24204.rs similarity index 100% rename from src/test/ui/issues/issue-24204.rs rename to src/test/ui/associated-types/issue-24204.rs diff --git a/src/test/ui/issues/issue-43784-associated-type.rs b/src/test/ui/associated-types/issue-43784-associated-type.rs similarity index 100% rename from src/test/ui/issues/issue-43784-associated-type.rs rename to src/test/ui/associated-types/issue-43784-associated-type.rs diff --git a/src/test/ui/issues/issue-43784-associated-type.stderr b/src/test/ui/associated-types/issue-43784-associated-type.stderr similarity index 100% rename from src/test/ui/issues/issue-43784-associated-type.stderr rename to src/test/ui/associated-types/issue-43784-associated-type.stderr diff --git a/src/test/ui/associated-types/issue-63591.full_tait.stderr b/src/test/ui/associated-types/issue-63591.full_tait.stderr new file mode 100644 index 0000000000..9857f7e267 --- /dev/null +++ b/src/test/ui/associated-types/issue-63591.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-63591.rs:6:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/associated-types/issue-63591.rs b/src/test/ui/associated-types/issue-63591.rs index 4d2e39f4da..bba9ae2d9e 100644 --- a/src/test/ui/associated-types/issue-63591.rs +++ b/src/test/ui/associated-types/issue-63591.rs @@ -1,7 +1,10 @@ // check-pass #![feature(associated_type_bounds)] -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() {} diff --git a/src/test/ui/issues/issue-76179.rs b/src/test/ui/associated-types/issue-76179.rs similarity index 100% rename from src/test/ui/issues/issue-76179.rs rename to src/test/ui/associated-types/issue-76179.rs diff --git a/src/test/ui/project-defer-unification.rs b/src/test/ui/associated-types/project-defer-unification.rs similarity index 100% rename from src/test/ui/project-defer-unification.rs rename to src/test/ui/associated-types/project-defer-unification.rs diff --git a/src/test/ui/ast-json/ast-json-noexpand-output.stdout b/src/test/ui/ast-json/ast-json-noexpand-output.stdout index 02342af8dc..0307875c15 100644 --- a/src/test/ui/ast-json/ast-json-noexpand-output.stdout +++ b/src/test/ui/ast-json/ast-json-noexpand-output.stdout @@ -1 +1 @@ -{"module":{"inner":{"lo":0,"hi":0},"unsafety":"No","items":[{"attrs":[],"id":0,"span":{"lo":0,"hi":0},"vis":{"kind":"Inherited","span":{"lo":0,"hi":0},"tokens":null},"ident":{"name":"core","span":{"lo":0,"hi":0}},"kind":{"variant":"ExternCrate","fields":[null]},"tokens":null}],"inline":true},"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"crate_type","span":{"lo":0,"hi":0}},"id":0,"args":null}],"tokens":null},"args":{"variant":"Eq","fields":[{"lo":0,"hi":0},{"kind":{"variant":"Interpolated","fields":[{"variant":"NtExpr","fields":[{"id":0,"kind":{"variant":"Lit","fields":[{"token":{"kind":"Str","symbol":"lib","suffix":null},"kind":{"variant":"Str","fields":["lib","Cooked"]},"span":{"lo":0,"hi":0}}]},"span":{"lo":0,"hi":0},"attrs":{"0":null},"tokens":{"0":[[{"variant":"Token","fields":[{"kind":{"variant":"Literal","fields":[{"kind":"Str","symbol":"lib","suffix":null}]},"span":{"lo":0,"hi":0}}]},"Alone"]]}}]}]},"span":{"lo":0,"hi":0}}]},"tokens":null},{"0":[[{"variant":"Token","fields":[{"kind":"Pound","span":{"lo":0,"hi":0}}]},"Joint"],[{"variant":"Token","fields":[{"kind":"Not","span":{"lo":0,"hi":0}}]},"Alone"],[{"variant":"Delimited","fields":[{"open":{"lo":0,"hi":0},"close":{"lo":0,"hi":0}},"Bracket",{"0":[[{"variant":"Token","fields":[{"kind":{"variant":"Ident","fields":["crate_type",false]},"span":{"lo":0,"hi":0}}]},"Alone"],[{"variant":"Token","fields":[{"kind":"Eq","span":{"lo":0,"hi":0}}]},"Alone"],[{"variant":"Token","fields":[{"kind":{"variant":"Literal","fields":[{"kind":"Str","symbol":"lib","suffix":null}]},"span":{"lo":0,"hi":0}}]},"Alone"]]}]},"Alone"]]}]},"id":null,"style":"Inner","span":{"lo":0,"hi":0}}],"span":{"lo":0,"hi":0},"proc_macros":[]} +{"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"crate_type","span":{"lo":0,"hi":0}},"id":0,"args":null}],"tokens":null},"args":{"variant":"Eq","fields":[{"lo":0,"hi":0},{"kind":{"variant":"Interpolated","fields":[{"variant":"NtExpr","fields":[{"id":0,"kind":{"variant":"Lit","fields":[{"token":{"kind":"Str","symbol":"lib","suffix":null},"kind":{"variant":"Str","fields":["lib","Cooked"]},"span":{"lo":0,"hi":0}}]},"span":{"lo":0,"hi":0},"attrs":{"0":null},"tokens":{"0":[[{"variant":"Token","fields":[{"kind":{"variant":"Literal","fields":[{"kind":"Str","symbol":"lib","suffix":null}]},"span":{"lo":0,"hi":0}}]},"Alone"]]}}]}]},"span":{"lo":0,"hi":0}}]},"tokens":null},{"0":[[{"variant":"Token","fields":[{"kind":"Pound","span":{"lo":0,"hi":0}}]},"Joint"],[{"variant":"Token","fields":[{"kind":"Not","span":{"lo":0,"hi":0}}]},"Alone"],[{"variant":"Delimited","fields":[{"open":{"lo":0,"hi":0},"close":{"lo":0,"hi":0}},"Bracket",{"0":[[{"variant":"Token","fields":[{"kind":{"variant":"Ident","fields":["crate_type",false]},"span":{"lo":0,"hi":0}}]},"Alone"],[{"variant":"Token","fields":[{"kind":"Eq","span":{"lo":0,"hi":0}}]},"Alone"],[{"variant":"Token","fields":[{"kind":{"variant":"Literal","fields":[{"kind":"Str","symbol":"lib","suffix":null}]},"span":{"lo":0,"hi":0}}]},"Alone"]]}]},"Alone"]]}]},"id":null,"style":"Inner","span":{"lo":0,"hi":0}}],"items":[{"attrs":[],"id":0,"span":{"lo":0,"hi":0},"vis":{"kind":"Inherited","span":{"lo":0,"hi":0},"tokens":null},"ident":{"name":"core","span":{"lo":0,"hi":0}},"kind":{"variant":"ExternCrate","fields":[null]},"tokens":null}],"span":{"lo":0,"hi":0},"proc_macros":[]} diff --git a/src/test/ui/ast-json/ast-json-output.stdout b/src/test/ui/ast-json/ast-json-output.stdout index 235f39c567..535f57bf6a 100644 --- a/src/test/ui/ast-json/ast-json-output.stdout +++ b/src/test/ui/ast-json/ast-json-output.stdout @@ -1 +1 @@ -{"module":{"inner":{"lo":0,"hi":0},"unsafety":"No","items":[{"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"prelude_import","span":{"lo":0,"hi":0}},"id":0,"args":null}],"tokens":null},"args":"Empty","tokens":null},null]},"id":null,"style":"Outer","span":{"lo":0,"hi":0}}],"id":0,"span":{"lo":0,"hi":0},"vis":{"kind":"Inherited","span":{"lo":0,"hi":0},"tokens":null},"ident":{"name":"","span":{"lo":0,"hi":0}},"kind":{"variant":"Use","fields":[{"prefix":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"{{root}}","span":{"lo":0,"hi":0}},"id":0,"args":null},{"ident":{"name":"std","span":{"lo":0,"hi":0}},"id":0,"args":null},{"ident":{"name":"prelude","span":{"lo":0,"hi":0}},"id":0,"args":null},{"ident":{"name":"v1","span":{"lo":0,"hi":0}},"id":0,"args":null}],"tokens":null},"kind":"Glob","span":{"lo":0,"hi":0}}]},"tokens":null},{"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"macro_use","span":{"lo":0,"hi":0}},"id":0,"args":null}],"tokens":null},"args":"Empty","tokens":null},null]},"id":null,"style":"Outer","span":{"lo":0,"hi":0}}],"id":0,"span":{"lo":0,"hi":0},"vis":{"kind":"Inherited","span":{"lo":0,"hi":0},"tokens":null},"ident":{"name":"std","span":{"lo":0,"hi":0}},"kind":{"variant":"ExternCrate","fields":[null]},"tokens":null},{"attrs":[],"id":0,"span":{"lo":0,"hi":0},"vis":{"kind":"Inherited","span":{"lo":0,"hi":0},"tokens":null},"ident":{"name":"core","span":{"lo":0,"hi":0}},"kind":{"variant":"ExternCrate","fields":[null]},"tokens":null}],"inline":true},"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"crate_type","span":{"lo":0,"hi":0}},"id":0,"args":null}],"tokens":null},"args":{"variant":"Eq","fields":[{"lo":0,"hi":0},{"kind":{"variant":"Interpolated","fields":[{"variant":"NtExpr","fields":[{"id":0,"kind":{"variant":"Lit","fields":[{"token":{"kind":"Str","symbol":"lib","suffix":null},"kind":{"variant":"Str","fields":["lib","Cooked"]},"span":{"lo":0,"hi":0}}]},"span":{"lo":0,"hi":0},"attrs":{"0":null},"tokens":{"0":[[{"variant":"Token","fields":[{"kind":{"variant":"Literal","fields":[{"kind":"Str","symbol":"lib","suffix":null}]},"span":{"lo":0,"hi":0}}]},"Alone"]]}}]}]},"span":{"lo":0,"hi":0}}]},"tokens":null},{"0":[[{"variant":"Token","fields":[{"kind":"Pound","span":{"lo":0,"hi":0}}]},"Joint"],[{"variant":"Token","fields":[{"kind":"Not","span":{"lo":0,"hi":0}}]},"Alone"],[{"variant":"Delimited","fields":[{"open":{"lo":0,"hi":0},"close":{"lo":0,"hi":0}},"Bracket",{"0":[[{"variant":"Token","fields":[{"kind":{"variant":"Ident","fields":["crate_type",false]},"span":{"lo":0,"hi":0}}]},"Alone"],[{"variant":"Token","fields":[{"kind":"Eq","span":{"lo":0,"hi":0}}]},"Alone"],[{"variant":"Token","fields":[{"kind":{"variant":"Literal","fields":[{"kind":"Str","symbol":"lib","suffix":null}]},"span":{"lo":0,"hi":0}}]},"Alone"]]}]},"Alone"]]}]},"id":null,"style":"Inner","span":{"lo":0,"hi":0}}],"span":{"lo":0,"hi":0},"proc_macros":[]} +{"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"crate_type","span":{"lo":0,"hi":0}},"id":0,"args":null}],"tokens":null},"args":{"variant":"Eq","fields":[{"lo":0,"hi":0},{"kind":{"variant":"Interpolated","fields":[{"variant":"NtExpr","fields":[{"id":0,"kind":{"variant":"Lit","fields":[{"token":{"kind":"Str","symbol":"lib","suffix":null},"kind":{"variant":"Str","fields":["lib","Cooked"]},"span":{"lo":0,"hi":0}}]},"span":{"lo":0,"hi":0},"attrs":{"0":null},"tokens":{"0":[[{"variant":"Token","fields":[{"kind":{"variant":"Literal","fields":[{"kind":"Str","symbol":"lib","suffix":null}]},"span":{"lo":0,"hi":0}}]},"Alone"]]}}]}]},"span":{"lo":0,"hi":0}}]},"tokens":null},{"0":[[{"variant":"Token","fields":[{"kind":"Pound","span":{"lo":0,"hi":0}}]},"Joint"],[{"variant":"Token","fields":[{"kind":"Not","span":{"lo":0,"hi":0}}]},"Alone"],[{"variant":"Delimited","fields":[{"open":{"lo":0,"hi":0},"close":{"lo":0,"hi":0}},"Bracket",{"0":[[{"variant":"Token","fields":[{"kind":{"variant":"Ident","fields":["crate_type",false]},"span":{"lo":0,"hi":0}}]},"Alone"],[{"variant":"Token","fields":[{"kind":"Eq","span":{"lo":0,"hi":0}}]},"Alone"],[{"variant":"Token","fields":[{"kind":{"variant":"Literal","fields":[{"kind":"Str","symbol":"lib","suffix":null}]},"span":{"lo":0,"hi":0}}]},"Alone"]]}]},"Alone"]]}]},"id":null,"style":"Inner","span":{"lo":0,"hi":0}}],"items":[{"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"prelude_import","span":{"lo":0,"hi":0}},"id":0,"args":null}],"tokens":null},"args":"Empty","tokens":null},null]},"id":null,"style":"Outer","span":{"lo":0,"hi":0}}],"id":0,"span":{"lo":0,"hi":0},"vis":{"kind":"Inherited","span":{"lo":0,"hi":0},"tokens":null},"ident":{"name":"","span":{"lo":0,"hi":0}},"kind":{"variant":"Use","fields":[{"prefix":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"{{root}}","span":{"lo":0,"hi":0}},"id":0,"args":null},{"ident":{"name":"std","span":{"lo":0,"hi":0}},"id":0,"args":null},{"ident":{"name":"prelude","span":{"lo":0,"hi":0}},"id":0,"args":null},{"ident":{"name":"rust_2015","span":{"lo":0,"hi":0}},"id":0,"args":null}],"tokens":null},"kind":"Glob","span":{"lo":0,"hi":0}}]},"tokens":null},{"attrs":[{"kind":{"variant":"Normal","fields":[{"path":{"span":{"lo":0,"hi":0},"segments":[{"ident":{"name":"macro_use","span":{"lo":0,"hi":0}},"id":0,"args":null}],"tokens":null},"args":"Empty","tokens":null},null]},"id":null,"style":"Outer","span":{"lo":0,"hi":0}}],"id":0,"span":{"lo":0,"hi":0},"vis":{"kind":"Inherited","span":{"lo":0,"hi":0},"tokens":null},"ident":{"name":"std","span":{"lo":0,"hi":0}},"kind":{"variant":"ExternCrate","fields":[null]},"tokens":null},{"attrs":[],"id":0,"span":{"lo":0,"hi":0},"vis":{"kind":"Inherited","span":{"lo":0,"hi":0},"tokens":null},"ident":{"name":"core","span":{"lo":0,"hi":0}},"kind":{"variant":"ExternCrate","fields":[null]},"tokens":null}],"span":{"lo":0,"hi":0},"proc_macros":[]} diff --git a/src/test/ui/async-await/async-block-control-flow-static-semantics.stderr b/src/test/ui/async-await/async-block-control-flow-static-semantics.stderr index dbdfb2e71e..919904ce3b 100644 --- a/src/test/ui/async-await/async-block-control-flow-static-semantics.stderr +++ b/src/test/ui/async-await/async-block-control-flow-static-semantics.stderr @@ -59,22 +59,22 @@ error[E0308]: mismatched types --> $DIR/async-block-control-flow-static-semantics.rs:47:44 | LL | fn rethrow_targets_async_block_not_fn() -> Result { - | ---------------------------------- ^^^^^^^^^^^^^^^^^ expected enum `std::result::Result`, found `()` + | ---------------------------------- ^^^^^^^^^^^^^^^^^ expected enum `Result`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression | - = note: expected enum `std::result::Result` + = note: expected enum `Result` found unit type `()` error[E0308]: mismatched types --> $DIR/async-block-control-flow-static-semantics.rs:56:50 | LL | fn rethrow_targets_async_block_not_async_fn() -> Result { - | ---------------------------------------- ^^^^^^^^^^^^^^^^^ expected enum `std::result::Result`, found `()` + | ---------------------------------------- ^^^^^^^^^^^^^^^^^ expected enum `Result`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression | - = note: expected enum `std::result::Result` + = note: expected enum `Result` found unit type `()` error: aborting due to 8 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 14e72c2b1e..654a3bcc92 100644 --- a/src/test/ui/async-await/dont-suggest-missing-await.stderr +++ b/src/test/ui/async-await/dont-suggest-missing-await.stderr @@ -2,11 +2,12 @@ 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 + | --- checked the `Output` of this `async fn`, found opaque type ... LL | take_u32(x) | ^ expected `u32`, found opaque type | + = note: while checking the return type of the `async fn` = note: expected type `u32` found opaque type `impl Future` help: consider `await`ing on the `Future` diff --git a/src/test/ui/async-await/generator-desc.rs b/src/test/ui/async-await/generator-desc.rs new file mode 100644 index 0000000000..5008120166 --- /dev/null +++ b/src/test/ui/async-await/generator-desc.rs @@ -0,0 +1,16 @@ +// edition:2018 +#![feature(async_closure)] +use std::future::Future; + +async fn one() {} +async fn two() {} + +fn fun>(f1: F, f2: F) {} +fn main() { + fun(async {}, async {}); + //~^ ERROR mismatched types + fun(one(), two()); + //~^ ERROR mismatched types + fun((async || {})(), (async || {})()); + //~^ ERROR mismatched types +} diff --git a/src/test/ui/async-await/generator-desc.stderr b/src/test/ui/async-await/generator-desc.stderr new file mode 100644 index 0000000000..04f191cc5e --- /dev/null +++ b/src/test/ui/async-await/generator-desc.stderr @@ -0,0 +1,51 @@ +error[E0308]: mismatched types + --> $DIR/generator-desc.rs:10:25 + | +LL | fun(async {}, async {}); + | -- ^^ expected `async` block, found a different `async` block + | | + | the expected `async` block + | + = note: expected `async` block `[static generator@$DIR/generator-desc.rs:10:15: 10:17]` + found `async` block `[static generator@$DIR/generator-desc.rs:10:25: 10:27]` + +error[E0308]: mismatched types + --> $DIR/generator-desc.rs:12:16 + | +LL | async fn one() {} + | - checked the `Output` of this `async fn`, expected opaque type +LL | async fn two() {} + | - checked the `Output` of this `async fn`, found opaque type +... +LL | fun(one(), two()); + | ^^^^^ expected opaque type, found a different opaque type + | + = note: while checking the return type of the `async fn` + = note: while checking the return type of the `async fn` + = note: expected opaque type `impl Future` (opaque type at <$DIR/generator-desc.rs:5:16>) + found opaque type `impl Future` (opaque type at <$DIR/generator-desc.rs:6:16>) + = help: consider `await`ing on both `Future`s + = note: distinct uses of `impl Trait` result in different opaque types + +error[E0308]: mismatched types + --> $DIR/generator-desc.rs:14:26 + | +LL | fun((async || {})(), (async || {})()); + | -- ^^^^^^^^^^^^^^^ expected `async` closure body, found a different `async` closure body + | | + | the expected `async` closure body + | + ::: $SRC_DIR/core/src/future/mod.rs:LL:COL + | +LL | pub const fn from_generator(gen: T) -> impl Future + | ------------------------------- + | | + | the expected opaque type + | the found opaque type + | + = note: expected opaque type `impl Future` (`async` closure body) + found opaque type `impl Future` (`async` closure body) + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/async-await/issue-61076.rs b/src/test/ui/async-await/issue-61076.rs index 8a7b166cb1..4a8e841b33 100644 --- a/src/test/ui/async-await/issue-61076.rs +++ b/src/test/ui/async-await/issue-61076.rs @@ -56,7 +56,7 @@ async fn struct_() -> Struct { } async fn tuple() -> Tuple { - //~^ NOTE the `Output` of this `async fn`'s expected opaque type + //~^ NOTE checked the `Output` of this `async fn`, expected opaque type Tuple(1i32) } @@ -92,6 +92,7 @@ async fn match_() { Tuple(_) => {} //~ ERROR mismatched types //~^ NOTE expected opaque type, found struct `Tuple` //~| NOTE expected opaque type `impl Future` + //~| NOTE while checking the return type of the `async fn` } } diff --git a/src/test/ui/async-await/issue-61076.stderr b/src/test/ui/async-await/issue-61076.stderr index db6dc3ea00..fd00522fac 100644 --- a/src/test/ui/async-await/issue-61076.stderr +++ b/src/test/ui/async-await/issue-61076.stderr @@ -61,11 +61,12 @@ error[E0308]: mismatched types --> $DIR/issue-61076.rs:92:9 | LL | async fn tuple() -> Tuple { - | ----- the `Output` of this `async fn`'s expected opaque type + | ----- checked the `Output` of this `async fn`, expected opaque type ... LL | Tuple(_) => {} | ^^^^^^^^ expected opaque type, found struct `Tuple` | + = note: while checking the return type of the `async fn` = note: expected opaque type `impl Future` found struct `Tuple` help: consider `await`ing on the `Future` diff --git a/src/test/ui/issue-74047.rs b/src/test/ui/async-await/issue-74047.rs similarity index 100% rename from src/test/ui/issue-74047.rs rename to src/test/ui/async-await/issue-74047.rs diff --git a/src/test/ui/issue-74047.stderr b/src/test/ui/async-await/issue-74047.stderr similarity index 76% rename from src/test/ui/issue-74047.stderr rename to src/test/ui/async-await/issue-74047.stderr index 8f7c91a78d..28174825d8 100644 --- a/src/test/ui/issue-74047.stderr +++ b/src/test/ui/async-await/issue-74047.stderr @@ -5,7 +5,7 @@ LL | impl TryFrom for MyStream {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `Error`, `try_from` in implementation | = help: implement the missing item: `type Error = Type;` - = help: implement the missing item: `fn try_from(_: T) -> std::result::Result>::Error> { todo!() }` + = help: implement the missing item: `fn try_from(_: T) -> Result>::Error> { todo!() }` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-77993-2.rs b/src/test/ui/async-await/issue-77993-2.rs similarity index 100% rename from src/test/ui/issues/issue-77993-2.rs rename to src/test/ui/async-await/issue-77993-2.rs diff --git a/src/test/ui/issues/issue-77993-2.stderr b/src/test/ui/async-await/issue-77993-2.stderr similarity index 100% rename from src/test/ui/issues/issue-77993-2.stderr rename to src/test/ui/async-await/issue-77993-2.stderr diff --git a/src/test/ui/async-await/issues/issue-60655-latebound-regions.full_tait.stderr b/src/test/ui/async-await/issues/issue-60655-latebound-regions.full_tait.stderr new file mode 100644 index 0000000000..cc61becd71 --- /dev/null +++ b/src/test/ui/async-await/issues/issue-60655-latebound-regions.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-60655-latebound-regions.rs:8:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/async-await/issues/issue-60655-latebound-regions.rs b/src/test/ui/async-await/issues/issue-60655-latebound-regions.rs index 66a3b07c3b..f8b6a43896 100644 --- a/src/test/ui/async-await/issues/issue-60655-latebound-regions.rs +++ b/src/test/ui/async-await/issues/issue-60655-latebound-regions.rs @@ -3,7 +3,10 @@ // check-pass // edition:2018 -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::future::Future; diff --git a/src/test/ui/async-await/issues/issue-67893.stderr b/src/test/ui/async-await/issues/issue-67893.stderr index af09f0a27b..aee2ae0e2e 100644 --- a/src/test/ui/async-await/issues/issue-67893.stderr +++ b/src/test/ui/async-await/issues/issue-67893.stderr @@ -13,9 +13,9 @@ LL | pub async fn run() { | - within this `impl Future` | = help: within `impl Future`, the trait `Send` is not implemented for `MutexGuard<'_, ()>` - = note: required because it appears within the type `for<'r, 's, 't0, 't1, 't2, 't3> {ResumeTy, Arc>, &'r Mutex<()>, std::result::Result, PoisonError>>, &'t1 MutexGuard<'t2, ()>, MutexGuard<'t3, ()>, (), impl Future}` - = note: required because it appears within the type `[static generator@run::{closure#0} for<'r, 's, 't0, 't1, 't2, 't3> {ResumeTy, Arc>, &'r Mutex<()>, std::result::Result, PoisonError>>, &'t1 MutexGuard<'t2, ()>, MutexGuard<'t3, ()>, (), impl Future}]` - = note: required because it appears within the type `from_generator::GenFuture<[static generator@run::{closure#0} for<'r, 's, 't0, 't1, 't2, 't3> {ResumeTy, Arc>, &'r Mutex<()>, std::result::Result, PoisonError>>, &'t1 MutexGuard<'t2, ()>, MutexGuard<'t3, ()>, (), impl Future}]>` + = note: required because it appears within the type `for<'r, 's, 't0, 't1, 't2, 't3> {ResumeTy, Arc>, &'r Mutex<()>, Result, PoisonError>>, &'t1 MutexGuard<'t2, ()>, MutexGuard<'t3, ()>, (), impl Future}` + = note: required because it appears within the type `[static generator@run::{closure#0} for<'r, 's, 't0, 't1, 't2, 't3> {ResumeTy, Arc>, &'r Mutex<()>, Result, PoisonError>>, &'t1 MutexGuard<'t2, ()>, MutexGuard<'t3, ()>, (), impl Future}]` + = note: required because it appears within the type `from_generator::GenFuture<[static generator@run::{closure#0} for<'r, 's, 't0, 't1, 't2, 't3> {ResumeTy, Arc>, &'r Mutex<()>, Result, PoisonError>>, &'t1 MutexGuard<'t2, ()>, MutexGuard<'t3, ()>, (), impl Future}]>` = note: required because it appears within the type `impl Future` = note: required because it appears within the type `impl Future` diff --git a/src/test/ui/async-await/issues/issue-78600.rs b/src/test/ui/async-await/issues/issue-78600.rs new file mode 100644 index 0000000000..8aaeaecf3e --- /dev/null +++ b/src/test/ui/async-await/issues/issue-78600.rs @@ -0,0 +1,12 @@ +// edition:2018 + +struct S<'a>(&'a i32); + +impl<'a> S<'a> { + async fn new(i: &'a i32) -> Result { + //~^ ERROR: `async fn` + Ok(S(&22)) + } +} + +fn main() {} diff --git a/src/test/ui/async-await/issues/issue-78600.stderr b/src/test/ui/async-await/issues/issue-78600.stderr new file mode 100644 index 0000000000..92b6614710 --- /dev/null +++ b/src/test/ui/async-await/issues/issue-78600.stderr @@ -0,0 +1,11 @@ +error[E0760]: `async fn` return type cannot contain a projection or `Self` that references lifetimes from a parent scope + --> $DIR/issue-78600.rs:6:33 + | +LL | async fn new(i: &'a i32) -> Result { + | ^^^^^^^----^^^^^ + | | + | help: consider spelling out the type instead: `S<'a>` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0760`. 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 f6e4c8be29..f789ad2a05 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 @@ -5,6 +5,7 @@ LL | async fn rec_1() { | ^ recursive `async fn` | = note: a recursive `async fn` must be rewritten to return a boxed `dyn Future` + = note: consider using the `async_recursion` crate: https://crates.io/crates/async_recursion error[E0733]: recursion in an `async fn` requires boxing --> $DIR/mutually-recursive-async-impl-trait-type.rs:9:18 @@ -13,6 +14,7 @@ LL | async fn rec_2() { | ^ recursive `async fn` | = note: a recursive `async fn` must be rewritten to return a boxed `dyn Future` + = note: consider using the `async_recursion` crate: https://crates.io/crates/async_recursion 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 892d91e3a4..63f64f4455 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 @@ -5,6 +5,7 @@ LL | async fn recursive_async_function() -> () { | ^^ recursive `async fn` | = note: a recursive `async fn` must be rewritten to return a boxed `dyn Future` + = note: consider using the `async_recursion` crate: https://crates.io/crates/async_recursion error: aborting due to previous error diff --git a/src/test/ui/repeat_count_const_in_async_fn.rs b/src/test/ui/async-await/repeat_count_const_in_async_fn.rs similarity index 100% rename from src/test/ui/repeat_count_const_in_async_fn.rs rename to src/test/ui/async-await/repeat_count_const_in_async_fn.rs 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 2151057aa7..483e52536a 100644 --- a/src/test/ui/async-await/suggest-missing-await-closure.stderr +++ b/src/test/ui/async-await/suggest-missing-await-closure.stderr @@ -2,11 +2,12 @@ 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 + | --- checked the `Output` of this `async fn`, found opaque type ... LL | take_u32(x) | ^ expected `u32`, found opaque type | + = note: while checking the return type of the `async fn` = note: expected type `u32` found opaque type `impl Future` help: consider `await`ing on the `Future` diff --git a/src/test/ui/async-await/suggest-missing-await.rs b/src/test/ui/async-await/suggest-missing-await.rs index d629054911..352a88ac10 100644 --- a/src/test/ui/async-await/suggest-missing-await.rs +++ b/src/test/ui/async-await/suggest-missing-await.rs @@ -21,7 +21,7 @@ async fn dummy() {} async fn suggest_await_in_async_fn_return() { dummy() //~^ ERROR mismatched types [E0308] - //~| HELP try adding a semicolon + //~| HELP consider using a semicolon here //~| HELP consider `await`ing on the `Future` //~| SUGGESTION .await } diff --git a/src/test/ui/async-await/suggest-missing-await.stderr b/src/test/ui/async-await/suggest-missing-await.stderr index 46615dae7e..14b5ee95ee 100644 --- a/src/test/ui/async-await/suggest-missing-await.stderr +++ b/src/test/ui/async-await/suggest-missing-await.stderr @@ -2,11 +2,12 @@ error[E0308]: mismatched types --> $DIR/suggest-missing-await.rs:12:14 | LL | async fn make_u32() -> u32 { - | --- the `Output` of this `async fn`'s found opaque type + | --- checked the `Output` of this `async fn`, found opaque type ... LL | take_u32(x) | ^ expected `u32`, found opaque type | + = note: while checking the return type of the `async fn` = note: expected type `u32` found opaque type `impl Future` help: consider `await`ing on the `Future` @@ -18,18 +19,19 @@ error[E0308]: mismatched types --> $DIR/suggest-missing-await.rs:22:5 | LL | async fn dummy() {} - | - the `Output` of this `async fn`'s found opaque type + | - checked the `Output` of this `async fn`, found opaque type ... LL | dummy() | ^^^^^^^ expected `()`, found opaque type | + = note: while checking the return type of the `async fn` = note: expected unit type `()` found opaque type `impl Future` help: consider `await`ing on the `Future` | LL | dummy().await | ^^^^^^ -help: try adding a semicolon +help: consider using a semicolon here | LL | dummy(); | ^ diff --git a/src/test/ui/attributes/attrs-on-params.rs b/src/test/ui/attributes/attrs-on-params.rs new file mode 100644 index 0000000000..0e606eac1e --- /dev/null +++ b/src/test/ui/attributes/attrs-on-params.rs @@ -0,0 +1,8 @@ +// This checks that incorrect params on function parameters are caught + +fn function(#[inline] param: u32) { + //~^ ERROR attribute should be applied to function or closure + //~| ERROR allow, cfg, cfg_attr, deny, forbid, and warn are the only allowed built-in attributes +} + +fn main() {} diff --git a/src/test/ui/attributes/attrs-on-params.stderr b/src/test/ui/attributes/attrs-on-params.stderr new file mode 100644 index 0000000000..003f43d371 --- /dev/null +++ b/src/test/ui/attributes/attrs-on-params.stderr @@ -0,0 +1,17 @@ +error: allow, cfg, cfg_attr, deny, forbid, and warn are the only allowed built-in attributes in function parameters + --> $DIR/attrs-on-params.rs:3:13 + | +LL | fn function(#[inline] param: u32) { + | ^^^^^^^^^ + +error[E0518]: attribute should be applied to function or closure + --> $DIR/attrs-on-params.rs:3:13 + | +LL | fn function(#[inline] param: u32) { + | ^^^^^^^^^----------- + | | + | not a function or closure + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0518`. diff --git a/src/test/ui/attributes/const-stability-on-macro.rs b/src/test/ui/attributes/const-stability-on-macro.rs new file mode 100644 index 0000000000..3fc60f7ce4 --- /dev/null +++ b/src/test/ui/attributes/const-stability-on-macro.rs @@ -0,0 +1,13 @@ +#[rustc_const_stable(feature = "foo", since = "0")] +//~^ ERROR macros cannot have const stability attributes +macro_rules! foo { + () => {}; +} + +#[rustc_const_unstable(feature = "bar", issue="none")] +//~^ ERROR macros cannot have const stability attributes +macro_rules! bar { + () => {}; +} + +fn main() {} diff --git a/src/test/ui/attributes/const-stability-on-macro.stderr b/src/test/ui/attributes/const-stability-on-macro.stderr new file mode 100644 index 0000000000..ef24e44d19 --- /dev/null +++ b/src/test/ui/attributes/const-stability-on-macro.stderr @@ -0,0 +1,20 @@ +error: macros cannot have const stability attributes + --> $DIR/const-stability-on-macro.rs:1:1 + | +LL | #[rustc_const_stable(feature = "foo", since = "0")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ invalid const stability attribute +LL | +LL | macro_rules! foo { + | ---------------- const stability attribute affects this macro + +error: macros cannot have const stability attributes + --> $DIR/const-stability-on-macro.rs:7:1 + | +LL | #[rustc_const_unstable(feature = "bar", issue="none")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ invalid const stability attribute +LL | +LL | macro_rules! bar { + | ---------------- const stability attribute affects this macro + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/attributes/doc-attr.rs b/src/test/ui/attributes/doc-attr.rs new file mode 100644 index 0000000000..980d1c0e20 --- /dev/null +++ b/src/test/ui/attributes/doc-attr.rs @@ -0,0 +1,25 @@ +#![crate_type = "lib"] +#![deny(warnings)] +#![doc(as_ptr)] +//~^ ERROR unknown `doc` attribute +//~^^ WARN + +#[doc(as_ptr)] +//~^ ERROR unknown `doc` attribute +//~^^ WARN +pub fn foo() {} + +#[doc(123)] +//~^ ERROR invalid `doc` attribute +//~| WARN +#[doc("hello", "bar")] +//~^ ERROR invalid `doc` attribute +//~| WARN +//~| ERROR invalid `doc` attribute +//~| WARN +#[doc(foo::bar, crate::bar::baz = "bye")] +//~^ ERROR unknown `doc` attribute +//~| WARN +//~| ERROR unknown `doc` attribute +//~| WARN +fn bar() {} diff --git a/src/test/ui/attributes/doc-attr.stderr b/src/test/ui/attributes/doc-attr.stderr new file mode 100644 index 0000000000..cc2494c92e --- /dev/null +++ b/src/test/ui/attributes/doc-attr.stderr @@ -0,0 +1,71 @@ +error: unknown `doc` attribute `as_ptr` + --> $DIR/doc-attr.rs:7:7 + | +LL | #[doc(as_ptr)] + | ^^^^^^ + | +note: the lint level is defined here + --> $DIR/doc-attr.rs:2:9 + | +LL | #![deny(warnings)] + | ^^^^^^^^ + = note: `#[deny(invalid_doc_attributes)]` implied by `#[deny(warnings)]` + = 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 #82730 + +error: invalid `doc` attribute + --> $DIR/doc-attr.rs:12:7 + | +LL | #[doc(123)] + | ^^^ + | + = 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 #82730 + +error: invalid `doc` attribute + --> $DIR/doc-attr.rs:15:7 + | +LL | #[doc("hello", "bar")] + | ^^^^^^^ + | + = 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 #82730 + +error: invalid `doc` attribute + --> $DIR/doc-attr.rs:15:16 + | +LL | #[doc("hello", "bar")] + | ^^^^^ + | + = 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 #82730 + +error: unknown `doc` attribute `foo::bar` + --> $DIR/doc-attr.rs:20:7 + | +LL | #[doc(foo::bar, crate::bar::baz = "bye")] + | ^^^^^^^^ + | + = 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 #82730 + +error: unknown `doc` attribute `crate::bar::baz` + --> $DIR/doc-attr.rs:20:17 + | +LL | #[doc(foo::bar, crate::bar::baz = "bye")] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = 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 #82730 + +error: unknown `doc` attribute `as_ptr` + --> $DIR/doc-attr.rs:3:8 + | +LL | #![doc(as_ptr)] + | ^^^^^^ + | + = 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 #82730 + +error: aborting due to 7 previous errors + diff --git a/src/test/ui/attributes/doc-attr2.rs b/src/test/ui/attributes/doc-attr2.rs new file mode 100644 index 0000000000..3fb484644d --- /dev/null +++ b/src/test/ui/attributes/doc-attr2.rs @@ -0,0 +1,11 @@ +#![crate_type = "lib"] +#![deny(warnings)] + +#[doc(test(no_crate_inject))] //~ ERROR +//~^ WARN +pub fn foo() {} + +pub mod bar { + #![doc(test(no_crate_inject))] //~ ERROR + //~^ WARN +} diff --git a/src/test/ui/attributes/doc-attr2.stderr b/src/test/ui/attributes/doc-attr2.stderr new file mode 100644 index 0000000000..643107318b --- /dev/null +++ b/src/test/ui/attributes/doc-attr2.stderr @@ -0,0 +1,26 @@ +error: `#![doc(test(...)]` is only allowed as a crate-level attribute + --> $DIR/doc-attr2.rs:4:7 + | +LL | #[doc(test(no_crate_inject))] + | ^^^^^^^^^^^^^^^^^^^^^ + | +note: the lint level is defined here + --> $DIR/doc-attr2.rs:2:9 + | +LL | #![deny(warnings)] + | ^^^^^^^^ + = note: `#[deny(invalid_doc_attributes)]` implied by `#[deny(warnings)]` + = 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 #82730 + +error: `#![doc(test(...)]` is only allowed as a crate-level attribute + --> $DIR/doc-attr2.rs:9:12 + | +LL | #![doc(test(no_crate_inject))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = 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 #82730 + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/auxiliary/legacy-const-generics.rs b/src/test/ui/auxiliary/legacy-const-generics.rs new file mode 100644 index 0000000000..67352a2fbb --- /dev/null +++ b/src/test/ui/auxiliary/legacy-const-generics.rs @@ -0,0 +1,6 @@ +#![feature(rustc_attrs)] + +#[rustc_legacy_const_generics(1)] +pub fn foo(x: usize, z: usize) -> [usize; 3] { + [x, Y, z] +} diff --git a/src/test/ui/bad/bad-sized.rs b/src/test/ui/bad/bad-sized.rs index b899c59ff2..a152196797 100644 --- a/src/test/ui/bad/bad-sized.rs +++ b/src/test/ui/bad/bad-sized.rs @@ -5,4 +5,5 @@ pub fn main() { //~^ ERROR only auto traits can be used as additional traits in a trait object //~| ERROR the size for values of type //~| ERROR the size for values of type + //~| ERROR the size for values of type } diff --git a/src/test/ui/bad/bad-sized.stderr b/src/test/ui/bad/bad-sized.stderr index 260d78b543..768893d6e2 100644 --- a/src/test/ui/bad/bad-sized.stderr +++ b/src/test/ui/bad/bad-sized.stderr @@ -31,7 +31,20 @@ LL | let x: Vec = Vec::new(); = help: the trait `Sized` is not implemented for `dyn Trait` = note: required by `Vec::::new` -error: aborting due to 3 previous errors +error[E0277]: the size for values of type `dyn Trait` cannot be known at compilation time + --> $DIR/bad-sized.rs:4:37 + | +LL | let x: Vec = Vec::new(); + | ^^^ doesn't have a size known at compile-time + | + ::: $SRC_DIR/alloc/src/vec/mod.rs:LL:COL + | +LL | pub struct Vec { + | - required by this bound in `Vec` + | + = help: the trait `Sized` is not implemented for `dyn Trait` + +error: aborting due to 4 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/binding/if-let.rs b/src/test/ui/binding/if-let.rs index 3ea8d402a3..28d57e92c3 100644 --- a/src/test/ui/binding/if-let.rs +++ b/src/test/ui/binding/if-let.rs @@ -6,7 +6,7 @@ pub fn main() { if let Some(y) = x { assert_eq!(y, 3); } else { - panic!("if-let panicked"); + panic!("`if let` panicked"); } let mut worked = false; if let Some(_) = x { @@ -54,7 +54,7 @@ pub fn main() { if let Foo::Two(b) = a { assert_eq!(b, 42_usize); } else { - panic!("panic in nested if-let"); + panic!("panic in nested `if let`"); } } } diff --git a/src/test/ui/binop/issue-77910-1.stderr b/src/test/ui/binop/issue-77910-1.stderr index e48d3e1999..2c6d572752 100644 --- a/src/test/ui/binop/issue-77910-1.stderr +++ b/src/test/ui/binop/issue-77910-1.stderr @@ -14,10 +14,13 @@ error[E0277]: `for<'r> fn(&'r i32) -> &'r i32 {foo}` doesn't implement `Debug` | LL | assert_eq!(foo, y); | ^^^^^^^^^^^^^^^^^^^ `for<'r> fn(&'r i32) -> &'r i32 {foo}` cannot be formatted using `{:?}` because it doesn't implement `Debug` + | + ::: $SRC_DIR/core/src/panicking.rs:LL:COL + | +LL | T: fmt::Debug + ?Sized, + | ---------- required by this bound in `core::panicking::assert_failed` | = help: the trait `Debug` is not implemented for `for<'r> fn(&'r i32) -> &'r i32 {foo}` - = note: required because of the requirements on the impl of `Debug` for `&for<'r> fn(&'r i32) -> &'r i32 {foo}` - = note: required by `std::fmt::Debug::fmt` = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 2 previous errors diff --git a/src/test/ui/block-result/block-must-not-have-result-while.stderr b/src/test/ui/block-result/block-must-not-have-result-while.stderr index d4845290d8..7f96aa289d 100644 --- a/src/test/ui/block-result/block-must-not-have-result-while.stderr +++ b/src/test/ui/block-result/block-must-not-have-result-while.stderr @@ -14,9 +14,7 @@ LL | | true | | ^^^^ expected `()`, found `bool` LL | | LL | | } - | | -- help: consider using a semicolon here - | |_____| - | expected this to be `()` + | |_____- expected this to be `()` error: aborting due to previous error; 1 warning emitted diff --git a/src/test/ui/block-result/unexpected-return-on-unit.stderr b/src/test/ui/block-result/unexpected-return-on-unit.stderr index 3dce459ddb..4fcd0ee2c4 100644 --- a/src/test/ui/block-result/unexpected-return-on-unit.stderr +++ b/src/test/ui/block-result/unexpected-return-on-unit.stderr @@ -4,7 +4,7 @@ error[E0308]: mismatched types LL | foo() | ^^^^^ expected `()`, found `usize` | -help: try adding a semicolon +help: consider using a semicolon here | LL | foo(); | ^ diff --git a/src/test/ui/borrowck/borrowck-assign-to-subfield.rs b/src/test/ui/borrowck/borrowck-assign-to-subfield.rs index 050d702b62..dfa3a561ec 100644 --- a/src/test/ui/borrowck/borrowck-assign-to-subfield.rs +++ b/src/test/ui/borrowck/borrowck-assign-to-subfield.rs @@ -1,5 +1,6 @@ // run-pass // pretty-expanded FIXME #23616 +#![allow(dead_code)] pub fn main() { struct A { diff --git a/src/test/ui/issues/issue-42344.rs b/src/test/ui/borrowck/issue-42344.rs similarity index 100% rename from src/test/ui/issues/issue-42344.rs rename to src/test/ui/borrowck/issue-42344.rs diff --git a/src/test/ui/issues/issue-42344.stderr b/src/test/ui/borrowck/issue-42344.stderr similarity index 100% rename from src/test/ui/issues/issue-42344.stderr rename to src/test/ui/borrowck/issue-42344.stderr diff --git a/src/test/ui/borrowck/issue-81365-1.rs b/src/test/ui/borrowck/issue-81365-1.rs new file mode 100644 index 0000000000..8e212a7701 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-1.rs @@ -0,0 +1,26 @@ +use std::ops::Deref; + +struct DerefTarget { + target_field: bool, +} +struct Container { + target: DerefTarget, + container_field: bool, +} + +impl Deref for Container { + type Target = DerefTarget; + fn deref(&self) -> &Self::Target { + &self.target + } +} + +impl Container { + fn bad_borrow(&mut self) { + let first = &self.target_field; + self.container_field = true; //~ ERROR E0506 + first; + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-81365-1.stderr b/src/test/ui/borrowck/issue-81365-1.stderr new file mode 100644 index 0000000000..ef88d7f14a --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-1.stderr @@ -0,0 +1,20 @@ +error[E0506]: cannot assign to `self.container_field` because it is borrowed + --> $DIR/issue-81365-1.rs:21:9 + | +LL | let first = &self.target_field; + | ---- borrow of `self.container_field` occurs here +LL | self.container_field = true; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here +LL | first; + | ----- borrow later used here + | + = note: borrow occurs due to deref coercion to `DerefTarget` +note: deref defined here + --> $DIR/issue-81365-1.rs:12:5 + | +LL | type Target = DerefTarget; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0506`. diff --git a/src/test/ui/borrowck/issue-81365-10.rs b/src/test/ui/borrowck/issue-81365-10.rs new file mode 100644 index 0000000000..7602e184a9 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-10.rs @@ -0,0 +1,26 @@ +use std::ops::Deref; + +struct DerefTarget { + target_field: bool, +} +struct Container { + target: DerefTarget, + container_field: bool, +} + +impl Deref for Container { + type Target = DerefTarget; + fn deref(&self) -> &Self::Target { + &self.target + } +} + +impl Container { + fn bad_borrow(&mut self) { + let first = &self.deref().target_field; + self.container_field = true; //~ ERROR E0506 + first; + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-81365-10.stderr b/src/test/ui/borrowck/issue-81365-10.stderr new file mode 100644 index 0000000000..891f70ed7f --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-10.stderr @@ -0,0 +1,13 @@ +error[E0506]: cannot assign to `self.container_field` because it is borrowed + --> $DIR/issue-81365-10.rs:21:9 + | +LL | let first = &self.deref().target_field; + | ---- borrow of `self.container_field` occurs here +LL | self.container_field = true; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here +LL | first; + | ----- borrow later used here + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0506`. diff --git a/src/test/ui/borrowck/issue-81365-11.rs b/src/test/ui/borrowck/issue-81365-11.rs new file mode 100644 index 0000000000..6b558c65d3 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-11.rs @@ -0,0 +1,32 @@ +use std::ops::{Deref, DerefMut}; + +struct DerefTarget { + target_field: bool, +} +struct Container { + target: DerefTarget, + container_field: bool, +} + +impl Deref for Container { + type Target = DerefTarget; + fn deref(&self) -> &Self::Target { + &self.target + } +} + +impl DerefMut for Container { + fn deref_mut(&mut self) -> &mut Self::Target { + &mut self.target + } +} + +impl Container { + fn bad_borrow(&mut self) { + let first = &mut self.target_field; + self.container_field = true; //~ ERROR E0506 + first; + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-81365-11.stderr b/src/test/ui/borrowck/issue-81365-11.stderr new file mode 100644 index 0000000000..0770c13663 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-11.stderr @@ -0,0 +1,13 @@ +error[E0506]: cannot assign to `self.container_field` because it is borrowed + --> $DIR/issue-81365-11.rs:27:9 + | +LL | let first = &mut self.target_field; + | ---- borrow of `self.container_field` occurs here +LL | self.container_field = true; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here +LL | first; + | ----- borrow later used here + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0506`. diff --git a/src/test/ui/borrowck/issue-81365-2.rs b/src/test/ui/borrowck/issue-81365-2.rs new file mode 100644 index 0000000000..fbbdd93b97 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-2.rs @@ -0,0 +1,30 @@ +use std::ops::Deref; + +struct DerefTarget { + target_field: bool, +} +struct Container { + target: DerefTarget, + container_field: bool, +} + +impl Deref for Container { + type Target = DerefTarget; + fn deref(&self) -> &Self::Target { + &self.target + } +} + +struct Outer { + container: Container, +} + +impl Outer { + fn bad_borrow(&mut self) { + let first = &self.container.target_field; + self.container.container_field = true; //~ ERROR E0506 + first; + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-81365-2.stderr b/src/test/ui/borrowck/issue-81365-2.stderr new file mode 100644 index 0000000000..e71edb5096 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-2.stderr @@ -0,0 +1,20 @@ +error[E0506]: cannot assign to `self.container.container_field` because it is borrowed + --> $DIR/issue-81365-2.rs:25:9 + | +LL | let first = &self.container.target_field; + | -------------- borrow of `self.container.container_field` occurs here +LL | self.container.container_field = true; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container.container_field` occurs here +LL | first; + | ----- borrow later used here + | + = note: borrow occurs due to deref coercion to `DerefTarget` +note: deref defined here + --> $DIR/issue-81365-2.rs:12:5 + | +LL | type Target = DerefTarget; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0506`. diff --git a/src/test/ui/borrowck/issue-81365-3.rs b/src/test/ui/borrowck/issue-81365-3.rs new file mode 100644 index 0000000000..9a9e3a3135 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-3.rs @@ -0,0 +1,37 @@ +use std::ops::Deref; + +struct DerefTarget { + target_field: bool, +} +struct Container { + target: DerefTarget, + container_field: bool, +} + +impl Deref for Container { + type Target = DerefTarget; + fn deref(&self) -> &Self::Target { + &self.target + } +} + +struct Outer { + container: Container, +} + +impl Deref for Outer { + type Target = Container; + fn deref(&self) -> &Self::Target { + &self.container + } +} + +impl Outer { + fn bad_borrow(&mut self) { + let first = &self.target_field; + self.container.container_field = true; //~ ERROR E0506 + first; + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-81365-3.stderr b/src/test/ui/borrowck/issue-81365-3.stderr new file mode 100644 index 0000000000..70bb6bb93a --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-3.stderr @@ -0,0 +1,20 @@ +error[E0506]: cannot assign to `self.container.container_field` because it is borrowed + --> $DIR/issue-81365-3.rs:32:9 + | +LL | let first = &self.target_field; + | ---- borrow of `self.container.container_field` occurs here +LL | self.container.container_field = true; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container.container_field` occurs here +LL | first; + | ----- borrow later used here + | + = note: borrow occurs due to deref coercion to `Container` +note: deref defined here + --> $DIR/issue-81365-3.rs:23:5 + | +LL | type Target = Container; + | ^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0506`. diff --git a/src/test/ui/borrowck/issue-81365-4.rs b/src/test/ui/borrowck/issue-81365-4.rs new file mode 100644 index 0000000000..b2643eb335 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-4.rs @@ -0,0 +1,38 @@ +use std::ops::Deref; + +struct DerefTarget { + target_field: bool, +} +struct Container { + target: DerefTarget, + container_field: bool, +} + +impl Deref for Container { + type Target = DerefTarget; + fn deref(&self) -> &Self::Target { + &self.target + } +} + +struct Outer { + container: Container, + outer_field: bool, +} + +impl Deref for Outer { + type Target = Container; + fn deref(&self) -> &Self::Target { + &self.container + } +} + +impl Outer { + fn bad_borrow(&mut self) { + let first = &self.target_field; + self.outer_field = true; //~ ERROR E0506 + first; + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-81365-4.stderr b/src/test/ui/borrowck/issue-81365-4.stderr new file mode 100644 index 0000000000..e714bb86d1 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-4.stderr @@ -0,0 +1,20 @@ +error[E0506]: cannot assign to `self.outer_field` because it is borrowed + --> $DIR/issue-81365-4.rs:33:9 + | +LL | let first = &self.target_field; + | ---- borrow of `self.outer_field` occurs here +LL | self.outer_field = true; + | ^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.outer_field` occurs here +LL | first; + | ----- borrow later used here + | + = note: borrow occurs due to deref coercion to `Container` +note: deref defined here + --> $DIR/issue-81365-4.rs:24:5 + | +LL | type Target = Container; + | ^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0506`. diff --git a/src/test/ui/borrowck/issue-81365-5.rs b/src/test/ui/borrowck/issue-81365-5.rs new file mode 100644 index 0000000000..d36b79615e --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-5.rs @@ -0,0 +1,33 @@ +use std::ops::Deref; + +struct DerefTarget { + target_field: bool, +} + +impl DerefTarget { + fn get(&self) -> &bool { + &self.target_field + } +} + +struct Container { + target: DerefTarget, + container_field: bool, +} + +impl Deref for Container { + type Target = DerefTarget; + fn deref(&self) -> &Self::Target { + &self.target + } +} + +impl Container { + fn bad_borrow(&mut self) { + let first = self.get(); + self.container_field = true; //~ ERROR E0506 + first; + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-81365-5.stderr b/src/test/ui/borrowck/issue-81365-5.stderr new file mode 100644 index 0000000000..7c0e9f43bd --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-5.stderr @@ -0,0 +1,20 @@ +error[E0506]: cannot assign to `self.container_field` because it is borrowed + --> $DIR/issue-81365-5.rs:28:9 + | +LL | let first = self.get(); + | ---- borrow of `self.container_field` occurs here +LL | self.container_field = true; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here +LL | first; + | ----- borrow later used here + | + = note: borrow occurs due to deref coercion to `DerefTarget` +note: deref defined here + --> $DIR/issue-81365-5.rs:19:5 + | +LL | type Target = DerefTarget; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0506`. diff --git a/src/test/ui/borrowck/issue-81365-6.rs b/src/test/ui/borrowck/issue-81365-6.rs new file mode 100644 index 0000000000..85ea77756b --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-6.rs @@ -0,0 +1,23 @@ +use std::ops::Deref; + +struct Container { + target: Vec<()>, + container_field: bool, +} + +impl Deref for Container { + type Target = [()]; + fn deref(&self) -> &Self::Target { + &self.target + } +} + +impl Container { + fn bad_borrow(&mut self) { + let first = &self[0]; + self.container_field = true; //~ ERROR E0506 + first; + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-81365-6.stderr b/src/test/ui/borrowck/issue-81365-6.stderr new file mode 100644 index 0000000000..85ed6acca3 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-6.stderr @@ -0,0 +1,20 @@ +error[E0506]: cannot assign to `self.container_field` because it is borrowed + --> $DIR/issue-81365-6.rs:18:9 + | +LL | let first = &self[0]; + | ---- borrow of `self.container_field` occurs here +LL | self.container_field = true; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here +LL | first; + | ----- borrow later used here + | + = note: borrow occurs due to deref coercion to `[()]` +note: deref defined here + --> $DIR/issue-81365-6.rs:9:5 + | +LL | type Target = [()]; + | ^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0506`. diff --git a/src/test/ui/borrowck/issue-81365-7.rs b/src/test/ui/borrowck/issue-81365-7.rs new file mode 100644 index 0000000000..cbf70f11a9 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-7.rs @@ -0,0 +1,24 @@ +use std::ops::Deref; + +struct DerefTarget { + target_field: bool, +} +struct Container { + target: DerefTarget, + container_field: bool, +} + +impl Deref for Container { + type Target = DerefTarget; + fn deref(&self) -> &Self::Target { + &self.target + } +} + +fn bad_borrow(c: &mut Container) { + let first = &c.target_field; + c.container_field = true; //~ ERROR E0506 + first; +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-81365-7.stderr b/src/test/ui/borrowck/issue-81365-7.stderr new file mode 100644 index 0000000000..506732ec0c --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-7.stderr @@ -0,0 +1,20 @@ +error[E0506]: cannot assign to `c.container_field` because it is borrowed + --> $DIR/issue-81365-7.rs:20:5 + | +LL | let first = &c.target_field; + | - borrow of `c.container_field` occurs here +LL | c.container_field = true; + | ^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `c.container_field` occurs here +LL | first; + | ----- borrow later used here + | + = note: borrow occurs due to deref coercion to `DerefTarget` +note: deref defined here + --> $DIR/issue-81365-7.rs:12:5 + | +LL | type Target = DerefTarget; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0506`. diff --git a/src/test/ui/borrowck/issue-81365-8.rs b/src/test/ui/borrowck/issue-81365-8.rs new file mode 100644 index 0000000000..0bb1033fb4 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-8.rs @@ -0,0 +1,26 @@ +use std::ops::Deref; + +struct DerefTarget { + target_field: bool, +} +struct Container { + target: DerefTarget, + container_field: bool, +} + +impl Deref for Container { + type Target = DerefTarget; + fn deref(&self) -> &Self::Target { + &self.target + } +} + +impl Container { + fn bad_borrow(&mut self) { + let first = &(*self).target_field; + self.container_field = true; //~ ERROR E0506 + first; + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-81365-8.stderr b/src/test/ui/borrowck/issue-81365-8.stderr new file mode 100644 index 0000000000..716b6e9b51 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-8.stderr @@ -0,0 +1,20 @@ +error[E0506]: cannot assign to `self.container_field` because it is borrowed + --> $DIR/issue-81365-8.rs:21:9 + | +LL | let first = &(*self).target_field; + | ------- borrow of `self.container_field` occurs here +LL | self.container_field = true; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here +LL | first; + | ----- borrow later used here + | + = note: borrow occurs due to deref coercion to `DerefTarget` +note: deref defined here + --> $DIR/issue-81365-8.rs:12:5 + | +LL | type Target = DerefTarget; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0506`. diff --git a/src/test/ui/borrowck/issue-81365-9.rs b/src/test/ui/borrowck/issue-81365-9.rs new file mode 100644 index 0000000000..cd57afa288 --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-9.rs @@ -0,0 +1,26 @@ +use std::ops::Deref; + +struct DerefTarget { + target_field: bool, +} +struct Container { + target: DerefTarget, + container_field: bool, +} + +impl Deref for Container { + type Target = DerefTarget; + fn deref(&self) -> &Self::Target { + &self.target + } +} + +impl Container { + fn bad_borrow(&mut self) { + let first = &Deref::deref(self).target_field; + self.container_field = true; //~ ERROR E0506 + first; + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-81365-9.stderr b/src/test/ui/borrowck/issue-81365-9.stderr new file mode 100644 index 0000000000..c7d48214fd --- /dev/null +++ b/src/test/ui/borrowck/issue-81365-9.stderr @@ -0,0 +1,13 @@ +error[E0506]: cannot assign to `self.container_field` because it is borrowed + --> $DIR/issue-81365-9.rs:21:9 + | +LL | let first = &Deref::deref(self).target_field; + | ---- borrow of `self.container_field` occurs here +LL | self.container_field = true; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ assignment to borrowed `self.container_field` occurs here +LL | first; + | ----- borrow later used here + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0506`. diff --git a/src/test/ui/borrowck/issue-82032.rs b/src/test/ui/borrowck/issue-82032.rs new file mode 100644 index 0000000000..4a01b60c1f --- /dev/null +++ b/src/test/ui/borrowck/issue-82032.rs @@ -0,0 +1,16 @@ +use std::{fs, io::*}; +use std::collections::HashMap; + +type Handle = BufWriter; +struct Thing(HashMap); + +impl Thing { + pub fn die_horribly(&mut self) { + for v in self.0.values() { + v.flush(); + //~^ ERROR cannot borrow + } + } +} + +fn main() {} diff --git a/src/test/ui/borrowck/issue-82032.stderr b/src/test/ui/borrowck/issue-82032.stderr new file mode 100644 index 0000000000..f272477a9f --- /dev/null +++ b/src/test/ui/borrowck/issue-82032.stderr @@ -0,0 +1,14 @@ +error[E0596]: cannot borrow `*v` as mutable, as it is behind a `&` reference + --> $DIR/issue-82032.rs:10:13 + | +LL | for v in self.0.values() { + | --------------- + | | | + | | help: use mutable method: `values_mut()` + | this iterator yields `&` references +LL | v.flush(); + | ^ `v` is a `&` reference, so the data it refers to cannot be borrowed as mutable + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0596`. diff --git a/src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.rs b/src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.rs new file mode 100644 index 0000000000..2e6b88a4be --- /dev/null +++ b/src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.rs @@ -0,0 +1,25 @@ +// Regression test for #82126. Checks that mismatched lifetimes and types are +// properly handled. + +// edition:2018 + +use std::sync::Mutex; + +struct MarketMultiplier {} + +impl MarketMultiplier { + fn buy(&mut self) -> &mut usize { + todo!() + } +} + +async fn buy_lock(generator: &Mutex) -> LockedMarket<'_> { + //~^ ERROR this struct takes 0 lifetime arguments but 1 lifetime argument was supplied + //~^^ ERROR this struct takes 1 type argument but 0 type arguments were supplied + LockedMarket(generator.lock().unwrap().buy()) + //~^ ERROR cannot return value referencing temporary value +} + +struct LockedMarket(T); + +fn main() {} diff --git a/src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.stderr b/src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.stderr new file mode 100644 index 0000000000..b6844f5048 --- /dev/null +++ b/src/test/ui/borrowck/issue-82126-mismatched-subst-and-hir.stderr @@ -0,0 +1,43 @@ +error[E0107]: this struct takes 0 lifetime arguments but 1 lifetime argument was supplied + --> $DIR/issue-82126-mismatched-subst-and-hir.rs:16:59 + | +LL | async fn buy_lock(generator: &Mutex) -> LockedMarket<'_> { + | ^^^^^^^^^^^^---- help: remove these generics + | | + | expected 0 lifetime arguments + | +note: struct defined here, with 0 lifetime parameters + --> $DIR/issue-82126-mismatched-subst-and-hir.rs:23:8 + | +LL | struct LockedMarket(T); + | ^^^^^^^^^^^^ + +error[E0107]: this struct takes 1 type argument but 0 type arguments were supplied + --> $DIR/issue-82126-mismatched-subst-and-hir.rs:16:59 + | +LL | async fn buy_lock(generator: &Mutex) -> LockedMarket<'_> { + | ^^^^^^^^^^^^ expected 1 type argument + | +note: struct defined here, with 1 type parameter: `T` + --> $DIR/issue-82126-mismatched-subst-and-hir.rs:23:8 + | +LL | struct LockedMarket(T); + | ^^^^^^^^^^^^ - +help: add missing type argument + | +LL | async fn buy_lock(generator: &Mutex) -> LockedMarket<'_, T> { + | ^^^ + +error[E0515]: cannot return value referencing temporary value + --> $DIR/issue-82126-mismatched-subst-and-hir.rs:19:5 + | +LL | LockedMarket(generator.lock().unwrap().buy()) + | ^^^^^^^^^^^^^-------------------------^^^^^^^ + | | | + | | temporary value created here + | returns a value referencing data owned by the current function + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0107, E0515. +For more information about an error, try `rustc --explain E0107`. diff --git a/src/test/ui/check-doc-alias-attr.stderr b/src/test/ui/check-doc-alias-attr.stderr deleted file mode 100644 index 1c7fc83bb8..0000000000 --- a/src/test/ui/check-doc-alias-attr.stderr +++ /dev/null @@ -1,58 +0,0 @@ -error: doc alias attribute expects a string: #[doc(alias = "a")] - --> $DIR/check-doc-alias-attr.rs:6:7 - | -LL | #[doc(alias)] - | ^^^^^ - -error: doc alias attribute expects a string: #[doc(alias = "a")] - --> $DIR/check-doc-alias-attr.rs:7:7 - | -LL | #[doc(alias = 0)] - | ^^^^^^^^^ - -error: doc alias attribute expects a string: #[doc(alias = "a")] - --> $DIR/check-doc-alias-attr.rs:8:7 - | -LL | #[doc(alias("bar"))] - | ^^^^^^^^^^^^ - -error: '\"' character isn't allowed in `#[doc(alias = "...")]` - --> $DIR/check-doc-alias-attr.rs:9:15 - | -LL | #[doc(alias = "\"")] - | ^^^^ - -error: '\n' character isn't allowed in `#[doc(alias = "...")]` - --> $DIR/check-doc-alias-attr.rs:10:15 - | -LL | #[doc(alias = "\n")] - | ^^^^ - -error: '\n' character isn't allowed in `#[doc(alias = "...")]` - --> $DIR/check-doc-alias-attr.rs:11:15 - | -LL | #[doc(alias = " - | _______________^ -LL | | ")] - | |_^ - -error: '\t' character isn't allowed in `#[doc(alias = "...")]` - --> $DIR/check-doc-alias-attr.rs:13:15 - | -LL | #[doc(alias = "\t")] - | ^^^^ - -error: `#[doc(alias = "...")]` cannot start or end with ' ' - --> $DIR/check-doc-alias-attr.rs:14:15 - | -LL | #[doc(alias = " hello")] - | ^^^^^^^^ - -error: `#[doc(alias = "...")]` cannot start or end with ' ' - --> $DIR/check-doc-alias-attr.rs:15:15 - | -LL | #[doc(alias = "hello ")] - | ^^^^^^^^ - -error: aborting due to 9 previous errors - diff --git a/src/test/ui/closures/2229_closure_analysis/by_value.rs b/src/test/ui/closures/2229_closure_analysis/by_value.rs index 1007fb582e..27c8fb1363 100644 --- a/src/test/ui/closures/2229_closure_analysis/by_value.rs +++ b/src/test/ui/closures/2229_closure_analysis/by_value.rs @@ -26,7 +26,8 @@ fn big_box() { //~^ First Pass analysis includes: //~| Min Capture analysis includes: let p = t.0.0; - //~^ NOTE: Capturing t[(0, 0),Deref,(0, 0)] -> ByValue + //~^ NOTE: Capturing t[(0, 0),Deref,(0, 0)] -> ImmBorrow + //~| NOTE: Capturing t[(0, 0)] -> ByValue //~| NOTE: Min Capture t[(0, 0)] -> ByValue println!("{} {:?}", t.1, p); //~^ NOTE: Capturing t[(1, 0)] -> ImmBorrow diff --git a/src/test/ui/closures/2229_closure_analysis/by_value.stderr b/src/test/ui/closures/2229_closure_analysis/by_value.stderr index fe04dbef6d..944e4c40a7 100644 --- a/src/test/ui/closures/2229_closure_analysis/by_value.stderr +++ b/src/test/ui/closures/2229_closure_analysis/by_value.stderr @@ -28,13 +28,18 @@ LL | | LL | | }; | |_____^ | -note: Capturing t[(0, 0),Deref,(0, 0)] -> ByValue +note: Capturing t[(0, 0),Deref,(0, 0)] -> ImmBorrow + --> $DIR/by_value.rs:28:17 + | +LL | let p = t.0.0; + | ^^^^^ +note: Capturing t[(0, 0)] -> ByValue --> $DIR/by_value.rs:28:17 | LL | let p = t.0.0; | ^^^^^ note: Capturing t[(1, 0)] -> ImmBorrow - --> $DIR/by_value.rs:31:29 + --> $DIR/by_value.rs:32:29 | LL | println!("{} {:?}", t.1, p); | ^^^ @@ -57,7 +62,7 @@ note: Min Capture t[(0, 0)] -> ByValue LL | let p = t.0.0; | ^^^^^ note: Min Capture t[(1, 0)] -> ImmBorrow - --> $DIR/by_value.rs:31:29 + --> $DIR/by_value.rs:32:29 | LL | println!("{} {:?}", t.1, p); | ^^^ diff --git a/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-array-diagnostics.rs b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-array-diagnostics.rs new file mode 100644 index 0000000000..cd7c25620a --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-array-diagnostics.rs @@ -0,0 +1,16 @@ +#![feature(capture_disjoint_fields)] +//~^ WARNING: the feature `capture_disjoint_fields` is incomplete +//~| `#[warn(incomplete_features)]` on by default +//~| see issue #53488 + +// Test that array access is not stored as part of closure kind origin + +fn expect_fn(_f: F) {} + +fn main() { + let s = [format!("s"), format!("s")]; + let c = || { //~ ERROR expected a closure that implements the `Fn` + let [_, _s] = s; + }; + expect_fn(c); +} diff --git a/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-array-diagnostics.stderr b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-array-diagnostics.stderr new file mode 100644 index 0000000000..bd9428771f --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-array-diagnostics.stderr @@ -0,0 +1,23 @@ +warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/closure-origin-array-diagnostics.rs:1:12 + | +LL | #![feature(capture_disjoint_fields)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53488 for more information + +error[E0525]: expected a closure that implements the `Fn` trait, but this closure only implements `FnOnce` + --> $DIR/closure-origin-array-diagnostics.rs:12:13 + | +LL | let c = || { + | ^^ this closure implements `FnOnce`, not `Fn` +LL | let [_, _s] = s; + | - closure is `FnOnce` because it moves the variable `s` out of its environment +LL | }; +LL | expect_fn(c); + | --------- the requirement to implement `Fn` derives from here + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0525`. diff --git a/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-single-variant-diagnostics.rs b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-single-variant-diagnostics.rs index 8486f03f2e..2ed0149b9d 100644 --- a/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-single-variant-diagnostics.rs +++ b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-single-variant-diagnostics.rs @@ -13,12 +13,8 @@ fn main() { let mut point = SingleVariant::Point(10, -10); let c = || { - // FIXME(project-rfc-2229#24): Change this to be a destructure pattern - // once this is fixed, to remove the warning. - if let SingleVariant::Point(ref mut x, _) = point { - //~^ WARNING: irrefutable if-let pattern - *x += 1; - } + let SingleVariant::Point(ref mut x, _) = point; + *x += 1; }; let b = c; diff --git a/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-single-variant-diagnostics.stderr b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-single-variant-diagnostics.stderr index ad66f6d7ff..402f5e4f33 100644 --- a/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-single-variant-diagnostics.stderr +++ b/src/test/ui/closures/2229_closure_analysis/diagnostics/closure-origin-single-variant-diagnostics.stderr @@ -7,19 +7,8 @@ LL | #![feature(capture_disjoint_fields)] = note: `#[warn(incomplete_features)]` on by default = note: see issue #53488 for more information -warning: irrefutable if-let pattern - --> $DIR/closure-origin-single-variant-diagnostics.rs:18:9 - | -LL | / if let SingleVariant::Point(ref mut x, _) = point { -LL | | -LL | | *x += 1; -LL | | } - | |_________^ - | - = note: `#[warn(irrefutable_let_patterns)]` on by default - error[E0382]: use of moved value: `c` - --> $DIR/closure-origin-single-variant-diagnostics.rs:25:13 + --> $DIR/closure-origin-single-variant-diagnostics.rs:21:13 | LL | let b = c; | - value moved here @@ -27,11 +16,11 @@ LL | let a = c; | ^ value used here after move | note: closure cannot be moved more than once as it is not `Copy` due to moving the variable `point.0` out of its environment - --> $DIR/closure-origin-single-variant-diagnostics.rs:18:53 + --> $DIR/closure-origin-single-variant-diagnostics.rs:16:50 | -LL | if let SingleVariant::Point(ref mut x, _) = point { - | ^^^^^ +LL | let SingleVariant::Point(ref mut x, _) = point; + | ^^^^^ -error: aborting due to previous error; 2 warnings emitted +error: aborting due to previous error; 1 warning emitted For more information about this error, try `rustc --explain E0382`. diff --git a/src/test/ui/closures/2229_closure_analysis/diagnostics/liveness.rs b/src/test/ui/closures/2229_closure_analysis/diagnostics/liveness.rs new file mode 100644 index 0000000000..09491f296f --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/diagnostics/liveness.rs @@ -0,0 +1,91 @@ +// check-pass +#![feature(capture_disjoint_fields)] +//~^ WARNING: the feature `capture_disjoint_fields` is incomplete +#![allow(unreachable_code)] +#![warn(unused)] + +#[derive(Debug)] +struct Point { + x: i32, + y: i32, +} + +pub fn f() { + let mut a = 1; + let mut c = Point{ x:1, y:0 }; + + // Captured by value, but variable is dead on entry. + (move || { + // This will not trigger a warning for unused variable as + // c.x will be treated as a Non-tracked place + c.x = 1; + println!("{}", c.x); + a = 1; //~ WARN value captured by `a` is never read + println!("{}", a); + })(); + + // Read and written to, but never actually used. + (move || { + // This will not trigger a warning for unused variable as + // c.x will be treated as a Non-tracked place + c.x += 1; + a += 1; //~ WARN unused variable: `a` + })(); + + (move || { + println!("{}", c.x); + // Value is read by closure itself on later invocations. + // This will not trigger a warning for unused variable as + // c.x will be treated as a Non-tracked place + c.x += 1; + println!("{}", a); + a += 1; + })(); + let b = Box::new(42); + (move || { + println!("{}", c.x); + // Never read because this is FnOnce closure. + // This will not trigger a warning for unused variable as + // c.x will be treated as a Non-tracked place + c.x += 1; + println!("{}", a); + a += 1; //~ WARN value assigned to `a` is never read + drop(b); + })(); +} + +#[derive(Debug)] +struct MyStruct<'a> { + x: Option<& 'a str>, + y: i32, +} + +pub fn nested() { + let mut a : Option<& str>; + a = None; + let mut b : Option<& str>; + b = None; + let mut d = MyStruct{ x: None, y: 1}; + let mut e = MyStruct{ x: None, y: 1}; + (|| { + (|| { + // This will not trigger a warning for unused variable as + // d.x will be treated as a Non-tracked place + d.x = Some("d1"); + d.x = Some("d2"); + a = Some("d1"); //~ WARN value assigned to `a` is never read + a = Some("d2"); + })(); + (move || { + // This will not trigger a warning for unused variable as + //e.x will be treated as a Non-tracked place + e.x = Some("e1"); + e.x = Some("e2"); + b = Some("e1"); //~ WARN value assigned to `b` is never read + //~| WARN unused variable: `b` + b = Some("e2"); //~ WARN value assigned to `b` is never read + })(); + })(); +} + +fn main() {} diff --git a/src/test/ui/closures/2229_closure_analysis/diagnostics/liveness.stderr b/src/test/ui/closures/2229_closure_analysis/diagnostics/liveness.stderr new file mode 100644 index 0000000000..81bbc4e1dc --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/diagnostics/liveness.stderr @@ -0,0 +1,79 @@ +warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/liveness.rs:2:12 + | +LL | #![feature(capture_disjoint_fields)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53488 for more information + +warning: value captured by `a` is never read + --> $DIR/liveness.rs:23:9 + | +LL | a = 1; + | ^ + | +note: the lint level is defined here + --> $DIR/liveness.rs:5:9 + | +LL | #![warn(unused)] + | ^^^^^^ + = note: `#[warn(unused_assignments)]` implied by `#[warn(unused)]` + = help: did you mean to capture by reference instead? + +warning: unused variable: `a` + --> $DIR/liveness.rs:32:9 + | +LL | a += 1; + | ^ + | +note: the lint level is defined here + --> $DIR/liveness.rs:5:9 + | +LL | #![warn(unused)] + | ^^^^^^ + = note: `#[warn(unused_variables)]` implied by `#[warn(unused)]` + = help: did you mean to capture by reference instead? + +warning: value assigned to `a` is never read + --> $DIR/liveness.rs:52:9 + | +LL | a += 1; + | ^ + | + = help: maybe it is overwritten before being read? + +warning: value assigned to `a` is never read + --> $DIR/liveness.rs:76:13 + | +LL | a = Some("d1"); + | ^ + | + = help: maybe it is overwritten before being read? + +warning: value assigned to `b` is never read + --> $DIR/liveness.rs:84:13 + | +LL | b = Some("e1"); + | ^ + | + = help: maybe it is overwritten before being read? + +warning: value assigned to `b` is never read + --> $DIR/liveness.rs:86:13 + | +LL | b = Some("e2"); + | ^ + | + = help: maybe it is overwritten before being read? + +warning: unused variable: `b` + --> $DIR/liveness.rs:84:13 + | +LL | b = Some("e1"); + | ^ + | + = help: did you mean to capture by reference instead? + +warning: 8 warnings emitted + diff --git a/src/test/ui/closures/2229_closure_analysis/diagnostics/liveness_unintentional_copy.rs b/src/test/ui/closures/2229_closure_analysis/diagnostics/liveness_unintentional_copy.rs new file mode 100644 index 0000000000..e2035464df --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/diagnostics/liveness_unintentional_copy.rs @@ -0,0 +1,42 @@ +// check-pass +#![feature(capture_disjoint_fields)] +//~^ WARNING: the feature `capture_disjoint_fields` is incomplete +#![warn(unused)] + +#[derive(Debug)] +struct MyStruct { + a: i32, + b: i32, +} + +pub fn unintentional_copy_one() { + let mut a = 1; + let mut last = MyStruct{ a: 1, b: 1}; + let mut f = move |s| { + // This will not trigger a warning for unused variable + // as last.a will be treated as a Non-tracked place + last.a = s; + a = s; + //~^ WARN value assigned to `a` is never read + //~| WARN unused variable: `a` + }; + f(2); + f(3); + f(4); +} + +pub fn unintentional_copy_two() { + let mut a = 1; + let mut sum = MyStruct{ a: 1, b: 0}; + (1..10).for_each(move |x| { + // This will not trigger a warning for unused variable + // as sum.b will be treated as a Non-tracked place + sum.b += x; + a += x; //~ WARN unused variable: `a` + }); +} + +fn main() { + unintentional_copy_one(); + unintentional_copy_two(); +} diff --git a/src/test/ui/closures/2229_closure_analysis/diagnostics/liveness_unintentional_copy.stderr b/src/test/ui/closures/2229_closure_analysis/diagnostics/liveness_unintentional_copy.stderr new file mode 100644 index 0000000000..35b0c22fc4 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/diagnostics/liveness_unintentional_copy.stderr @@ -0,0 +1,47 @@ +warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/liveness_unintentional_copy.rs:2:12 + | +LL | #![feature(capture_disjoint_fields)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53488 for more information + +warning: value assigned to `a` is never read + --> $DIR/liveness_unintentional_copy.rs:19:9 + | +LL | a = s; + | ^ + | +note: the lint level is defined here + --> $DIR/liveness_unintentional_copy.rs:4:9 + | +LL | #![warn(unused)] + | ^^^^^^ + = note: `#[warn(unused_assignments)]` implied by `#[warn(unused)]` + = help: maybe it is overwritten before being read? + +warning: unused variable: `a` + --> $DIR/liveness_unintentional_copy.rs:19:9 + | +LL | a = s; + | ^ + | +note: the lint level is defined here + --> $DIR/liveness_unintentional_copy.rs:4:9 + | +LL | #![warn(unused)] + | ^^^^^^ + = note: `#[warn(unused_variables)]` implied by `#[warn(unused)]` + = help: did you mean to capture by reference instead? + +warning: unused variable: `a` + --> $DIR/liveness_unintentional_copy.rs:35:9 + | +LL | a += x; + | ^ + | + = help: did you mean to capture by reference instead? + +warning: 4 warnings emitted + diff --git a/src/test/ui/closures/2229_closure_analysis/diagnostics/repr_packed.rs b/src/test/ui/closures/2229_closure_analysis/diagnostics/repr_packed.rs new file mode 100644 index 0000000000..6fce295150 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/diagnostics/repr_packed.rs @@ -0,0 +1,36 @@ +// check-pass + +#![feature(capture_disjoint_fields)] +//~^ WARNING: the feature `capture_disjoint_fields` is incomplete + +// Given how the closure desugaring is implemented (at least at the time of writing this test), +// we don't need to truncate the captured path to a reference into a packed-struct if the field +// being referenced will be moved into the closure, since it's safe to move out a field from a +// packed-struct. +// +// However to avoid surprises for the user, or issues when the closure is +// inlined we will truncate the capture to access just the struct regardless of if the field +// might get moved into the closure. +// +// It is possible for someone to try writing the code that relies on the desugaring to access a ref +// into a packed-struct without explicity using unsafe. Here we test that the compiler warns the +// user that such an access is still unsafe. +fn test_missing_unsafe_warning_on_repr_packed() { + #[repr(packed)] + struct Foo { x: String } + + let foo = Foo { x: String::new() }; + + let c = || { + println!("{}", foo.x); + //~^ WARNING: borrow of packed field is unsafe and requires unsafe function or block + //~| WARNING: this was previously accepted by the compiler but is being phased out + let _z = foo.x; + }; + + c(); +} + +fn main() { + test_missing_unsafe_warning_on_repr_packed(); +} diff --git a/src/test/ui/closures/2229_closure_analysis/diagnostics/repr_packed.stderr b/src/test/ui/closures/2229_closure_analysis/diagnostics/repr_packed.stderr new file mode 100644 index 0000000000..440b2c54c0 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/diagnostics/repr_packed.stderr @@ -0,0 +1,22 @@ +warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/repr_packed.rs:3:12 + | +LL | #![feature(capture_disjoint_fields)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53488 for more information + +warning: borrow of packed field is unsafe and requires unsafe function or block (error E0133) + --> $DIR/repr_packed.rs:25:24 + | +LL | println!("{}", foo.x); + | ^^^^^ + | + = note: `#[warn(safe_packed_borrows)]` 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 #46043 + = note: fields of packed structs might be misaligned: dereferencing a misaligned pointer or even just creating a misaligned reference is undefined behavior + +warning: 2 warnings emitted + diff --git a/src/test/ui/closures/2229_closure_analysis/migrations/precise.rs b/src/test/ui/closures/2229_closure_analysis/migrations/precise.rs new file mode 100644 index 0000000000..79702cc6b5 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/migrations/precise.rs @@ -0,0 +1,78 @@ +#![deny(disjoint_capture_drop_reorder)] +//~^ NOTE: the lint level is defined here + +#[derive(Debug)] +struct Foo(i32); +impl Drop for Foo { + fn drop(&mut self) { + println!("{:?} dropped", self.0); + } +} + +struct ConstainsDropField(Foo, Foo); + +#[derive(Debug)] +struct ContainsAndImplsDrop(Foo); +impl Drop for ContainsAndImplsDrop { + fn drop(&mut self) { + println!("{:?} dropped", self.0); + } +} + +// Test that even if all paths starting at root variable that implement Drop are captured, +// the lint is triggered if the root variable implements drop and isn't captured. +fn test_precise_analysis_parent_root_impl_drop_not_captured() { + let t = ContainsAndImplsDrop(Foo(10)); + + let c = || { + //~^ERROR: drop order affected for closure because of `capture_disjoint_fields` + //~| NOTE: drop(&(t)); + let _t = t.0; + }; + + c(); +} + +// Test that lint is triggered if a path that implements Drop is not captured by move +fn test_precise_analysis_drop_paths_not_captured_by_move() { + let t = ConstainsDropField(Foo(10), Foo(20)); + + let c = || { + //~^ERROR: drop order affected for closure because of `capture_disjoint_fields` + //~| NOTE: drop(&(t)); + let _t = t.0; + let _t = &t.1; + }; + + c(); +} + +struct S; +impl Drop for S { + fn drop(&mut self) { + } +} + +struct T(S, S); +struct U(T, T); + +// Test precise analysis for the lint works with paths longer than one. +fn test_precise_analysis_long_path_missing() { + let u = U(T(S, S), T(S, S)); + + let c = || { + //~^ERROR: drop order affected for closure because of `capture_disjoint_fields` + //~| NOTE: drop(&(u)); + let _x = u.0.0; + let _x = u.0.1; + let _x = u.1.0; + }; + + c(); +} + +fn main() { + test_precise_analysis_parent_root_impl_drop_not_captured(); + test_precise_analysis_drop_paths_not_captured_by_move(); + test_precise_analysis_long_path_missing(); +} diff --git a/src/test/ui/closures/2229_closure_analysis/migrations/precise.stderr b/src/test/ui/closures/2229_closure_analysis/migrations/precise.stderr new file mode 100644 index 0000000000..968ca395f9 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/migrations/precise.stderr @@ -0,0 +1,49 @@ +error: drop order affected for closure because of `capture_disjoint_fields` + --> $DIR/precise.rs:27:13 + | +LL | let c = || { + | _____________^ +LL | | +LL | | +LL | | let _t = t.0; +LL | | }; + | |_____^ + | +note: the lint level is defined here + --> $DIR/precise.rs:1:9 + | +LL | #![deny(disjoint_capture_drop_reorder)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + = note: drop(&(t)); + +error: drop order affected for closure because of `capture_disjoint_fields` + --> $DIR/precise.rs:40:13 + | +LL | let c = || { + | _____________^ +LL | | +LL | | +LL | | let _t = t.0; +LL | | let _t = &t.1; +LL | | }; + | |_____^ + | + = note: drop(&(t)); + +error: drop order affected for closure because of `capture_disjoint_fields` + --> $DIR/precise.rs:63:13 + | +LL | let c = || { + | _____________^ +LL | | +LL | | +LL | | let _x = u.0.0; +LL | | let _x = u.0.1; +LL | | let _x = u.1.0; +LL | | }; + | |_____^ + | + = note: drop(&(u)); + +error: aborting due to 3 previous errors + diff --git a/src/test/ui/closures/2229_closure_analysis/migrations/precise_no_migrations.rs b/src/test/ui/closures/2229_closure_analysis/migrations/precise_no_migrations.rs new file mode 100644 index 0000000000..8af48501ca --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/migrations/precise_no_migrations.rs @@ -0,0 +1,105 @@ +// run-pass + +#![deny(disjoint_capture_drop_reorder)] + +#[derive(Debug)] +struct Foo(i32); +impl Drop for Foo { + fn drop(&mut self) { + println!("{:?} dropped", self.0); + } +} + +struct ConstainsDropField(Foo, Foo); + +// Test that if all paths starting at root variable that implement Drop are captured +// then it doesn't trigger the lint. +fn test_precise_analysis_simple_1() { + let t = (Foo(10), Foo(20), Foo(30)); + + let c = || { + let _t = t.0; + let _t = t.1; + let _t = t.2; + }; + + c(); +} + +// Test that if all paths starting at root variable that implement Drop are captured +// then it doesn't trigger the lint. +fn test_precise_analysis_simple_2() { + let t = ConstainsDropField(Foo(10), Foo(20)); + + let c = || { + let _t = t.0; + let _t = t.1; + }; + + c(); +} + +#[derive(Debug)] +struct ContainsAndImplsDrop(Foo); +impl Drop for ContainsAndImplsDrop { + fn drop(&mut self) { + println!("{:?} dropped", self.0); + } +} + +// If a path isn't directly captured but requires Drop, then this tests that migrations aren't +// needed if the a parent to that path is captured. +fn test_precise_analysis_parent_captured_1() { + let t = ConstainsDropField(Foo(10), Foo(20)); + + let c = || { + let _t = t; + }; + + c(); +} + +// If a path isn't directly captured but requires Drop, then this tests that migrations aren't +// needed if the a parent to that path is captured. +fn test_precise_analysis_parent_captured_2() { + let t = ContainsAndImplsDrop(Foo(10)); + + let c = || { + let _t = t; + }; + + c(); +} + +struct S; +impl Drop for S { + fn drop(&mut self) { + } +} + +struct T(S, S); +struct U(T, T); + +// Test that if the path is longer than just one element, precise analysis works correctly. +fn test_precise_analysis_long_path() { + let u = U(T(S, S), T(S, S)); + + let c = || { + let _x = u.0.0; + let _x = u.0.1; + let _x = u.1.0; + let _x = u.1.1; + }; + + c(); +} + +fn main() { + test_precise_analysis_simple_1(); + test_precise_analysis_simple_2(); + + test_precise_analysis_parent_captured_1(); + test_precise_analysis_parent_captured_2(); + + test_precise_analysis_long_path(); +} diff --git a/src/test/ui/closures/2229_closure_analysis/move_closure.rs b/src/test/ui/closures/2229_closure_analysis/move_closure.rs index 8bdc999ca3..1c574da5f4 100644 --- a/src/test/ui/closures/2229_closure_analysis/move_closure.rs +++ b/src/test/ui/closures/2229_closure_analysis/move_closure.rs @@ -6,7 +6,25 @@ //~| NOTE: see issue #53488 #![feature(rustc_attrs)] -// Test we truncate derefs properly +fn simple_move_closure() { + struct S(String); + struct T(S); + + let t = T(S("s".into())); + let mut c = #[rustc_capture_analysis] + //~^ ERROR: attributes on expressions are experimental + //~| NOTE: see issue #15701 + move || { + //~^ ERROR: First Pass analysis includes: + //~| ERROR: Min Capture analysis includes: + t.0.0 = "new S".into(); + //~^ NOTE: Capturing t[(0, 0),(0, 0)] -> ByValue + //~| NOTE: Min Capture t[(0, 0),(0, 0)] -> ByValue + }; + c(); +} + +// Test move closure use reborrows when using references fn simple_ref() { let mut s = 10; let ref_s = &mut s; @@ -18,14 +36,14 @@ fn simple_ref() { //~^ ERROR: First Pass analysis includes: //~| ERROR: Min Capture analysis includes: *ref_s += 10; - //~^ NOTE: Capturing ref_s[Deref] -> ByValue - //~| NOTE: Min Capture ref_s[] -> ByValue + //~^ NOTE: Capturing ref_s[Deref] -> UniqueImmBorrow + //~| NOTE: Min Capture ref_s[Deref] -> UniqueImmBorrow }; c(); } -// Test we truncate derefs properly -fn struct_contains_ref_to_another_struct() { +// Test move closure use reborrows when using references +fn struct_contains_ref_to_another_struct_1() { struct S(String); struct T<'a>(&'a mut S); @@ -39,34 +57,85 @@ fn struct_contains_ref_to_another_struct() { //~^ ERROR: First Pass analysis includes: //~| ERROR: Min Capture analysis includes: t.0.0 = "new s".into(); - //~^ NOTE: Capturing t[(0, 0),Deref,(0, 0)] -> ByValue - //~| NOTE: Min Capture t[(0, 0)] -> ByValue + //~^ NOTE: Capturing t[(0, 0),Deref,(0, 0)] -> UniqueImmBorrow + //~| NOTE: Min Capture t[(0, 0),Deref,(0, 0)] -> UniqueImmBorrow }; c(); } -// Test that we don't reduce precision when there is nothing deref. -fn no_ref() { +// Test that we can use reborrows to read data of Copy types +// i.e. without truncating derefs +fn struct_contains_ref_to_another_struct_2() { + struct S(i32); + struct T<'a>(&'a S); + + let s = S(0); + let t = T(&s); + + let mut c = #[rustc_capture_analysis] + //~^ ERROR: attributes on expressions are experimental + //~| NOTE: see issue #15701 + move || { + //~^ ERROR: First Pass analysis includes: + //~| ERROR: Min Capture analysis includes: + let _t = t.0.0; + //~^ NOTE: Capturing t[(0, 0),Deref,(0, 0)] -> ImmBorrow + //~| NOTE: Min Capture t[(0, 0),Deref,(0, 0)] -> ImmBorrow + }; + + c(); +} + +// Test that we can use truncate to move out of !Copy types +fn struct_contains_ref_to_another_struct_3() { struct S(String); - struct T(S); + struct T<'a>(&'a S); + + let s = S("s".into()); + let t = T(&s); - let t = T(S("s".into())); let mut c = #[rustc_capture_analysis] //~^ ERROR: attributes on expressions are experimental //~| NOTE: see issue #15701 move || { //~^ ERROR: First Pass analysis includes: //~| ERROR: Min Capture analysis includes: - t.0.0 = "new S".into(); - //~^ NOTE: Capturing t[(0, 0),(0, 0)] -> ByValue - //~| NOTE: Min Capture t[(0, 0),(0, 0)] -> ByValue + let _t = t.0.0; + //~^ NOTE: Capturing t[(0, 0),Deref,(0, 0)] -> ImmBorrow + //~| NOTE: Capturing t[(0, 0)] -> ByValue + //~| NOTE: Min Capture t[(0, 0)] -> ByValue }; + + c(); +} + +// Test that derefs of box are truncated in move closures +fn truncate_box_derefs() { + struct S(i32); + + let b = Box::new(S(10)); + + let c = #[rustc_capture_analysis] + //~^ ERROR: attributes on expressions are experimental + //~| NOTE: see issue #15701 + move || { + //~^ ERROR: First Pass analysis includes: + //~| ERROR: Min Capture analysis includes: + let _t = b.0; + //~^ NOTE: Capturing b[Deref,(0, 0)] -> ByValue + //~| NOTE: Capturing b[] -> ByValue + //~| NOTE: Min Capture b[] -> ByValue + }; + c(); } fn main() { + simple_move_closure(); simple_ref(); - struct_contains_ref_to_another_struct(); - no_ref(); + struct_contains_ref_to_another_struct_1(); + struct_contains_ref_to_another_struct_2(); + struct_contains_ref_to_another_struct_3(); + truncate_box_derefs(); } diff --git a/src/test/ui/closures/2229_closure_analysis/move_closure.stderr b/src/test/ui/closures/2229_closure_analysis/move_closure.stderr index a745f14598..b91ef4dd85 100644 --- a/src/test/ui/closures/2229_closure_analysis/move_closure.stderr +++ b/src/test/ui/closures/2229_closure_analysis/move_closure.stderr @@ -8,7 +8,7 @@ LL | let mut c = #[rustc_capture_analysis] = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable error[E0658]: attributes on expressions are experimental - --> $DIR/move_closure.rs:35:17 + --> $DIR/move_closure.rs:32:17 | LL | let mut c = #[rustc_capture_analysis] | ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -17,7 +17,7 @@ LL | let mut c = #[rustc_capture_analysis] = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable error[E0658]: attributes on expressions are experimental - --> $DIR/move_closure.rs:55:17 + --> $DIR/move_closure.rs:53:17 | LL | let mut c = #[rustc_capture_analysis] | ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -25,6 +25,33 @@ LL | let mut c = #[rustc_capture_analysis] = note: see issue #15701 for more information = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable +error[E0658]: attributes on expressions are experimental + --> $DIR/move_closure.rs:76:17 + | +LL | let mut c = #[rustc_capture_analysis] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #15701 for more information + = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable + +error[E0658]: attributes on expressions are experimental + --> $DIR/move_closure.rs:98:17 + | +LL | let mut c = #[rustc_capture_analysis] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #15701 for more information + = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable + +error[E0658]: attributes on expressions are experimental + --> $DIR/move_closure.rs:119:13 + | +LL | let c = #[rustc_capture_analysis] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #15701 for more information + = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable + warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes --> $DIR/move_closure.rs:3:12 | @@ -40,20 +67,56 @@ error: First Pass analysis includes: LL | / move || { LL | | LL | | -LL | | *ref_s += 10; +LL | | t.0.0 = "new S".into(); +LL | | +LL | | +LL | | }; + | |_____^ + | +note: Capturing t[(0, 0),(0, 0)] -> ByValue + --> $DIR/move_closure.rs:20:9 + | +LL | t.0.0 = "new S".into(); + | ^^^^^ + +error: Min Capture analysis includes: + --> $DIR/move_closure.rs:17:5 + | +LL | / move || { +LL | | +LL | | +LL | | t.0.0 = "new S".into(); LL | | LL | | LL | | }; | |_____^ | -note: Capturing ref_s[Deref] -> ByValue +note: Min Capture t[(0, 0),(0, 0)] -> ByValue --> $DIR/move_closure.rs:20:9 | +LL | t.0.0 = "new S".into(); + | ^^^^^ + +error: First Pass analysis includes: + --> $DIR/move_closure.rs:35:5 + | +LL | / move || { +LL | | +LL | | +LL | | *ref_s += 10; +LL | | +LL | | +LL | | }; + | |_____^ + | +note: Capturing ref_s[Deref] -> UniqueImmBorrow + --> $DIR/move_closure.rs:38:9 + | LL | *ref_s += 10; | ^^^^^^ error: Min Capture analysis includes: - --> $DIR/move_closure.rs:17:5 + --> $DIR/move_closure.rs:35:5 | LL | / move || { LL | | @@ -64,14 +127,14 @@ LL | | LL | | }; | |_____^ | -note: Min Capture ref_s[] -> ByValue - --> $DIR/move_closure.rs:20:9 +note: Min Capture ref_s[Deref] -> UniqueImmBorrow + --> $DIR/move_closure.rs:38:9 | LL | *ref_s += 10; | ^^^^^^ error: First Pass analysis includes: - --> $DIR/move_closure.rs:38:5 + --> $DIR/move_closure.rs:56:5 | LL | / move || { LL | | @@ -82,14 +145,14 @@ LL | | LL | | }; | |_____^ | -note: Capturing t[(0, 0),Deref,(0, 0)] -> ByValue - --> $DIR/move_closure.rs:41:9 +note: Capturing t[(0, 0),Deref,(0, 0)] -> UniqueImmBorrow + --> $DIR/move_closure.rs:59:9 | LL | t.0.0 = "new s".into(); | ^^^^^ error: Min Capture analysis includes: - --> $DIR/move_closure.rs:38:5 + --> $DIR/move_closure.rs:56:5 | LL | / move || { LL | | @@ -100,48 +163,130 @@ LL | | LL | | }; | |_____^ | -note: Min Capture t[(0, 0)] -> ByValue - --> $DIR/move_closure.rs:41:9 +note: Min Capture t[(0, 0),Deref,(0, 0)] -> UniqueImmBorrow + --> $DIR/move_closure.rs:59:9 | LL | t.0.0 = "new s".into(); | ^^^^^ error: First Pass analysis includes: - --> $DIR/move_closure.rs:58:5 + --> $DIR/move_closure.rs:79:5 | LL | / move || { LL | | LL | | -LL | | t.0.0 = "new S".into(); +LL | | let _t = t.0.0; LL | | LL | | LL | | }; | |_____^ | -note: Capturing t[(0, 0),(0, 0)] -> ByValue - --> $DIR/move_closure.rs:61:9 +note: Capturing t[(0, 0),Deref,(0, 0)] -> ImmBorrow + --> $DIR/move_closure.rs:82:18 | -LL | t.0.0 = "new S".into(); - | ^^^^^ +LL | let _t = t.0.0; + | ^^^^^ error: Min Capture analysis includes: - --> $DIR/move_closure.rs:58:5 + --> $DIR/move_closure.rs:79:5 | LL | / move || { LL | | LL | | -LL | | t.0.0 = "new S".into(); +LL | | let _t = t.0.0; LL | | LL | | LL | | }; | |_____^ | -note: Min Capture t[(0, 0),(0, 0)] -> ByValue - --> $DIR/move_closure.rs:61:9 +note: Min Capture t[(0, 0),Deref,(0, 0)] -> ImmBorrow + --> $DIR/move_closure.rs:82:18 | -LL | t.0.0 = "new S".into(); - | ^^^^^ +LL | let _t = t.0.0; + | ^^^^^ + +error: First Pass analysis includes: + --> $DIR/move_closure.rs:101:5 + | +LL | / move || { +LL | | +LL | | +LL | | let _t = t.0.0; +... | +LL | | +LL | | }; + | |_____^ + | +note: Capturing t[(0, 0),Deref,(0, 0)] -> ImmBorrow + --> $DIR/move_closure.rs:104:18 + | +LL | let _t = t.0.0; + | ^^^^^ +note: Capturing t[(0, 0)] -> ByValue + --> $DIR/move_closure.rs:104:18 + | +LL | let _t = t.0.0; + | ^^^^^ + +error: Min Capture analysis includes: + --> $DIR/move_closure.rs:101:5 + | +LL | / move || { +LL | | +LL | | +LL | | let _t = t.0.0; +... | +LL | | +LL | | }; + | |_____^ + | +note: Min Capture t[(0, 0)] -> ByValue + --> $DIR/move_closure.rs:104:18 + | +LL | let _t = t.0.0; + | ^^^^^ + +error: First Pass analysis includes: + --> $DIR/move_closure.rs:122:5 + | +LL | / move || { +LL | | +LL | | +LL | | let _t = b.0; +... | +LL | | +LL | | }; + | |_____^ + | +note: Capturing b[Deref,(0, 0)] -> ByValue + --> $DIR/move_closure.rs:125:18 + | +LL | let _t = b.0; + | ^^^ +note: Capturing b[] -> ByValue + --> $DIR/move_closure.rs:125:18 + | +LL | let _t = b.0; + | ^^^ + +error: Min Capture analysis includes: + --> $DIR/move_closure.rs:122:5 + | +LL | / move || { +LL | | +LL | | +LL | | let _t = b.0; +... | +LL | | +LL | | }; + | |_____^ + | +note: Min Capture b[] -> ByValue + --> $DIR/move_closure.rs:125:18 + | +LL | let _t = b.0; + | ^^^ -error: aborting due to 9 previous errors; 1 warning emitted +error: aborting due to 18 previous errors; 1 warning emitted For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/closures/2229_closure_analysis/pattern-matching-should-fail.rs b/src/test/ui/closures/2229_closure_analysis/pattern-matching-should-fail.rs new file mode 100644 index 0000000000..609a11a578 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/pattern-matching-should-fail.rs @@ -0,0 +1,84 @@ +#![feature(capture_disjoint_fields)] +//~^ WARNING: the feature `capture_disjoint_fields` is incomplete +//~| `#[warn(incomplete_features)]` on by default +//~| see issue #53488 +#![feature(never_type)] + +// Should fake read the discriminant and throw an error +fn test1() { + let x: !; + let c1 = || match x { }; + //~^ ERROR: use of possibly-uninitialized variable: `x` +} + +// Should fake read the discriminant and throw an error +fn test2() { + let x: !; + let c2 = || match x { _ => () }; + //~^ ERROR: borrow of possibly-uninitialized variable: `x` +} + +// Testing single variant patterns +enum SingleVariant { + Points(u32) +} + +// Should fake read the discriminant and throw an error +fn test3() { + let variant: !; + let c = || { + //~^ ERROR: borrow of possibly-uninitialized variable: `variant` + match variant { + SingleVariant::Points(_) => {} + } + }; + c(); +} + +// Should fake read the discriminant and throw an error +fn test4() { + let variant: !; + let c = || { + //~^ ERROR: borrow of possibly-uninitialized variable: `variant` + match variant { + SingleVariant::Points(a) => { + println!("{:?}", a); + } + } + }; + c(); +} + +fn test5() { + let t: !; + let g: !; + + let a = || { + match g { }; + //~^ ERROR: use of possibly-uninitialized variable: `g` + let c = || { + match t { }; + //~^ ERROR: use of possibly-uninitialized variable: `t` + }; + + c(); + }; + +} + +// Should fake read the discriminant and throw an error +fn test6() { + let x: u8; + let c1 = || match x { }; + //~^ ERROR: use of possibly-uninitialized variable: `x` + //~| ERROR: non-exhaustive patterns: type `u8` is non-empty +} + +fn main() { + test1(); + test2(); + test3(); + test4(); + test5(); + test6(); +} diff --git a/src/test/ui/closures/2229_closure_analysis/pattern-matching-should-fail.stderr b/src/test/ui/closures/2229_closure_analysis/pattern-matching-should-fail.stderr new file mode 100644 index 0000000000..c225abb58b --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/pattern-matching-should-fail.stderr @@ -0,0 +1,72 @@ +warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/pattern-matching-should-fail.rs:1:12 + | +LL | #![feature(capture_disjoint_fields)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53488 for more information + +error[E0004]: non-exhaustive patterns: type `u8` is non-empty + --> $DIR/pattern-matching-should-fail.rs:72:23 + | +LL | let c1 = || match x { }; + | ^ + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + = note: the matched value is of type `u8` + +error[E0381]: use of possibly-uninitialized variable: `x` + --> $DIR/pattern-matching-should-fail.rs:10:23 + | +LL | let c1 = || match x { }; + | ^ use of possibly-uninitialized `x` + +error[E0381]: borrow of possibly-uninitialized variable: `x` + --> $DIR/pattern-matching-should-fail.rs:17:14 + | +LL | let c2 = || match x { _ => () }; + | ^^ - borrow occurs due to use in closure + | | + | use of possibly-uninitialized `x` + +error[E0381]: borrow of possibly-uninitialized variable: `variant` + --> $DIR/pattern-matching-should-fail.rs:29:13 + | +LL | let c = || { + | ^^ use of possibly-uninitialized `variant` +LL | +LL | match variant { + | ------- borrow occurs due to use in closure + +error[E0381]: borrow of possibly-uninitialized variable: `variant` + --> $DIR/pattern-matching-should-fail.rs:41:13 + | +LL | let c = || { + | ^^ use of possibly-uninitialized `variant` +LL | +LL | match variant { + | ------- borrow occurs due to use in closure + +error[E0381]: use of possibly-uninitialized variable: `g` + --> $DIR/pattern-matching-should-fail.rs:57:15 + | +LL | match g { }; + | ^ use of possibly-uninitialized `g` + +error[E0381]: use of possibly-uninitialized variable: `t` + --> $DIR/pattern-matching-should-fail.rs:60:19 + | +LL | match t { }; + | ^ use of possibly-uninitialized `t` + +error[E0381]: use of possibly-uninitialized variable: `x` + --> $DIR/pattern-matching-should-fail.rs:72:23 + | +LL | let c1 = || match x { }; + | ^ use of possibly-uninitialized `x` + +error: aborting due to 8 previous errors; 1 warning emitted + +Some errors have detailed explanations: E0004, E0381. +For more information about an error, try `rustc --explain E0004`. diff --git a/src/test/ui/closures/2229_closure_analysis/patterns-capture-analysis.rs b/src/test/ui/closures/2229_closure_analysis/patterns-capture-analysis.rs new file mode 100644 index 0000000000..0a877dd366 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/patterns-capture-analysis.rs @@ -0,0 +1,139 @@ +#![feature(capture_disjoint_fields)] +//~^ WARNING: the feature `capture_disjoint_fields` is incomplete +//~| NOTE: `#[warn(incomplete_features)]` on by default +//~| NOTE: see issue #53488 +#![feature(rustc_attrs)] + +// Should capture the discriminant since a variant of a multivariant enum is +// mentioned in the match arm; the discriminant is captured by the closure regardless +// of if it creates a binding +fn test_1_should_capture() { + let variant = Some(2229); + let c = #[rustc_capture_analysis] + //~^ ERROR: attributes on expressions are experimental + //~| NOTE: see issue #15701 + + || { + //~^ First Pass analysis includes: + //~| Min Capture analysis includes: + match variant { + //~^ NOTE: Capturing variant[] -> ImmBorrow + //~| NOTE: Min Capture variant[] -> ImmBorrow + Some(_) => {} + _ => {} + } + }; + c(); +} + +// Should not capture the discriminant since only a wildcard is mentioned in the +// match arm +fn test_2_should_not_capture() { + let variant = Some(2229); + let c = #[rustc_capture_analysis] + //~^ ERROR: attributes on expressions are experimental + //~| NOTE: see issue #15701 + || { + //~^ First Pass analysis includes: + match variant { + _ => {} + } + }; + c(); +} + +// Testing single variant patterns +enum SingleVariant { + Points(u32) +} + +// Should not capture the discriminant since the single variant mentioned +// in the match arm does not trigger a binding +fn test_3_should_not_capture_single_variant() { + let variant = SingleVariant::Points(1); + let c = #[rustc_capture_analysis] + //~^ ERROR: attributes on expressions are experimental + //~| NOTE: see issue #15701 + || { + //~^ First Pass analysis includes: + match variant { + SingleVariant::Points(_) => {} + } + }; + c(); +} + +// Should not capture the discriminant since the single variant mentioned +// in the match arm does not trigger a binding +fn test_6_should_capture_single_variant() { + let variant = SingleVariant::Points(1); + let c = #[rustc_capture_analysis] + //~^ ERROR: attributes on expressions are experimental + //~| NOTE: see issue #15701 + || { + //~^ First Pass analysis includes: + //~| Min Capture analysis includes: + match variant { + //~^ NOTE: Capturing variant[] -> ImmBorrow + //~| NOTE: Capturing variant[(0, 0)] -> ImmBorrow + //~| NOTE: Min Capture variant[] -> ImmBorrow + SingleVariant::Points(a) => { + println!("{:?}", a); + } + } + }; + c(); +} + +// Should not capture the discriminant since only wildcards are mentioned in the +// match arm +fn test_4_should_not_capture_array() { + let array: [i32; 3] = [0; 3]; + let c = #[rustc_capture_analysis] + //~^ ERROR: attributes on expressions are experimental + //~| NOTE: see issue #15701 + || { + //~^ First Pass analysis includes: + match array { + [_,_,_] => {} + } + }; + c(); +} + +// Testing MultiVariant patterns +enum MVariant { + A, + B, + C, +} + +// Should capture the discriminant since a variant of the multi variant enum is +// mentioned in the match arm; the discriminant is captured by the closure +// regardless of if it creates a binding +fn test_5_should_capture_multi_variant() { + let variant = MVariant::A; + let c = #[rustc_capture_analysis] + //~^ ERROR: attributes on expressions are experimental + //~| NOTE: see issue #15701 + || { + //~^ First Pass analysis includes: + //~| Min Capture analysis includes: + match variant { + //~^ NOTE: Capturing variant[] -> ImmBorrow + //~| NOTE: Min Capture variant[] -> ImmBorrow + MVariant::A => {} + _ => {} + } + }; + c(); +} + +fn main() { + test_1_should_capture(); + test_2_should_not_capture(); + test_3_should_not_capture_single_variant(); + test_6_should_capture_single_variant(); + test_4_should_not_capture_array(); + test_5_should_capture_multi_variant(); +} diff --git a/src/test/ui/closures/2229_closure_analysis/patterns-capture-analysis.stderr b/src/test/ui/closures/2229_closure_analysis/patterns-capture-analysis.stderr new file mode 100644 index 0000000000..ad3e96a575 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/patterns-capture-analysis.stderr @@ -0,0 +1,212 @@ +error[E0658]: attributes on expressions are experimental + --> $DIR/patterns-capture-analysis.rs:12:14 + | +LL | let c = #[rustc_capture_analysis] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #15701 for more information + = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable + +error[E0658]: attributes on expressions are experimental + --> $DIR/patterns-capture-analysis.rs:33:14 + | +LL | let c = #[rustc_capture_analysis] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #15701 for more information + = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable + +error[E0658]: attributes on expressions are experimental + --> $DIR/patterns-capture-analysis.rs:54:14 + | +LL | let c = #[rustc_capture_analysis] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #15701 for more information + = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable + +error[E0658]: attributes on expressions are experimental + --> $DIR/patterns-capture-analysis.rs:70:14 + | +LL | let c = #[rustc_capture_analysis] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #15701 for more information + = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable + +error[E0658]: attributes on expressions are experimental + --> $DIR/patterns-capture-analysis.rs:92:14 + | +LL | let c = #[rustc_capture_analysis] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #15701 for more information + = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable + +error[E0658]: attributes on expressions are experimental + --> $DIR/patterns-capture-analysis.rs:116:14 + | +LL | let c = #[rustc_capture_analysis] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #15701 for more information + = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable + +warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/patterns-capture-analysis.rs:1:12 + | +LL | #![feature(capture_disjoint_fields)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53488 for more information + +error: First Pass analysis includes: + --> $DIR/patterns-capture-analysis.rs:16:5 + | +LL | / || { +LL | | +LL | | +LL | | match variant { +... | +LL | | } +LL | | }; + | |_____^ + | +note: Capturing variant[] -> ImmBorrow + --> $DIR/patterns-capture-analysis.rs:19:15 + | +LL | match variant { + | ^^^^^^^ + +error: Min Capture analysis includes: + --> $DIR/patterns-capture-analysis.rs:16:5 + | +LL | / || { +LL | | +LL | | +LL | | match variant { +... | +LL | | } +LL | | }; + | |_____^ + | +note: Min Capture variant[] -> ImmBorrow + --> $DIR/patterns-capture-analysis.rs:19:15 + | +LL | match variant { + | ^^^^^^^ + +error: First Pass analysis includes: + --> $DIR/patterns-capture-analysis.rs:36:5 + | +LL | / || { +LL | | +LL | | match variant { +LL | | _ => {} +LL | | } +LL | | }; + | |_____^ + +error: First Pass analysis includes: + --> $DIR/patterns-capture-analysis.rs:57:5 + | +LL | / || { +LL | | +LL | | match variant { +LL | | SingleVariant::Points(_) => {} +LL | | } +LL | | }; + | |_____^ + +error: First Pass analysis includes: + --> $DIR/patterns-capture-analysis.rs:73:5 + | +LL | / || { +LL | | +LL | | +LL | | match variant { +... | +LL | | } +LL | | }; + | |_____^ + | +note: Capturing variant[] -> ImmBorrow + --> $DIR/patterns-capture-analysis.rs:76:15 + | +LL | match variant { + | ^^^^^^^ +note: Capturing variant[(0, 0)] -> ImmBorrow + --> $DIR/patterns-capture-analysis.rs:76:15 + | +LL | match variant { + | ^^^^^^^ + +error: Min Capture analysis includes: + --> $DIR/patterns-capture-analysis.rs:73:5 + | +LL | / || { +LL | | +LL | | +LL | | match variant { +... | +LL | | } +LL | | }; + | |_____^ + | +note: Min Capture variant[] -> ImmBorrow + --> $DIR/patterns-capture-analysis.rs:76:15 + | +LL | match variant { + | ^^^^^^^ + +error: First Pass analysis includes: + --> $DIR/patterns-capture-analysis.rs:95:5 + | +LL | / || { +LL | | +LL | | match array { +LL | | [_,_,_] => {} +LL | | } +LL | | }; + | |_____^ + +error: First Pass analysis includes: + --> $DIR/patterns-capture-analysis.rs:119:5 + | +LL | / || { +LL | | +LL | | +LL | | match variant { +... | +LL | | } +LL | | }; + | |_____^ + | +note: Capturing variant[] -> ImmBorrow + --> $DIR/patterns-capture-analysis.rs:122:15 + | +LL | match variant { + | ^^^^^^^ + +error: Min Capture analysis includes: + --> $DIR/patterns-capture-analysis.rs:119:5 + | +LL | / || { +LL | | +LL | | +LL | | match variant { +... | +LL | | } +LL | | }; + | |_____^ + | +note: Min Capture variant[] -> ImmBorrow + --> $DIR/patterns-capture-analysis.rs:122:15 + | +LL | match variant { + | ^^^^^^^ + +error: aborting due to 15 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/closures/2229_closure_analysis/repr_packed.rs b/src/test/ui/closures/2229_closure_analysis/repr_packed.rs new file mode 100644 index 0000000000..2b9ef2a76b --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/repr_packed.rs @@ -0,0 +1,103 @@ +#![feature(capture_disjoint_fields)] +//~^ WARNING: the feature `capture_disjoint_fields` is incomplete +//~| `#[warn(incomplete_features)]` on by default +//~| see issue #53488 + +#![feature(rustc_attrs)] + +// `u8` aligned at a byte and are unaffected by repr(packed). +// Therefore we can precisely (and safely) capture references to both the fields. +fn test_alignment_not_affected() { + #[repr(packed)] + struct Foo { x: u8, y: u8 } + + let mut foo = Foo { x: 0, y: 0 }; + + let mut c = #[rustc_capture_analysis] + //~^ ERROR: attributes on expressions are experimental + //~| NOTE: see issue #15701 + || { + //~^ ERROR: First Pass analysis includes: + //~| ERROR: Min Capture analysis includes: + let z1: &u8 = &foo.x; + //~^ NOTE: Capturing foo[(0, 0)] -> ImmBorrow + //~| NOTE: Min Capture foo[(0, 0)] -> ImmBorrow + let z2: &mut u8 = &mut foo.y; + //~^ NOTE: Capturing foo[(1, 0)] -> MutBorrow + //~| NOTE: Min Capture foo[(1, 0)] -> MutBorrow + + *z2 = 42; + + println!("({}, {})", z1, z2); + }; + + c(); +} + +// `String`, `u16` are not aligned at a one byte boundry and are thus affected by repr(packed). +// +// Here we test that the closure doesn't capture a reference point to `foo.x` but +// rather capture `foo` entirely. +fn test_alignment_affected() { + #[repr(packed)] + struct Foo { x: String, y: u16 } + + let mut foo = Foo { x: String::new(), y: 0 }; + + let mut c = #[rustc_capture_analysis] + //~^ ERROR: attributes on expressions are experimental + //~| NOTE: see issue #15701 + || { + //~^ ERROR: First Pass analysis includes: + //~| ERROR: Min Capture analysis includes: + let z1: &String = &foo.x; + let z2: &mut u16 = &mut foo.y; + //~^ NOTE: Capturing foo[] -> MutBorrow + //~| NOTE: Min Capture foo[] -> MutBorrow + + + *z2 = 42; + + println!("({}, {})", z1, z2); + }; + + c(); +} + +// Given how the closure desugaring is implemented (at least at the time of writing this test), +// we don't need to truncate the captured path to a reference into a packed-struct if the field +// being referenced will be moved into the closure, since it's safe to move out a field from a +// packed-struct. +// +// However to avoid surprises for the user, or issues when the closure is +// inlined we will truncate the capture to access just the struct regardless of if the field +// might get moved into the closure. +fn test_truncation_when_ref_and_move() { + #[repr(packed)] + struct Foo { x: String } + + let mut foo = Foo { x: String::new() }; + + let c = #[rustc_capture_analysis] + //~^ ERROR: attributes on expressions are experimental + //~| NOTE: see issue #15701 + || { + //~^ ERROR: First Pass analysis includes: + //~| ERROR: Min Capture analysis includes: + println!("{}", foo.x); + //~^ NOTE: Capturing foo[] -> ImmBorrow + //~| NOTE: Min Capture foo[] -> ByValue + //~| NOTE: foo[] used here + let _z = foo.x; + //~^ NOTE: Capturing foo[(0, 0)] -> ByValue + //~| NOTE: foo[] captured as ByValue here + }; + + c(); +} + +fn main() { + test_truncation_when_ref_and_move(); + test_alignment_affected(); + test_alignment_not_affected(); +} diff --git a/src/test/ui/closures/2229_closure_analysis/repr_packed.stderr b/src/test/ui/closures/2229_closure_analysis/repr_packed.stderr new file mode 100644 index 0000000000..0517dd04b6 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/repr_packed.stderr @@ -0,0 +1,165 @@ +error[E0658]: attributes on expressions are experimental + --> $DIR/repr_packed.rs:16:17 + | +LL | let mut c = #[rustc_capture_analysis] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #15701 for more information + = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable + +error[E0658]: attributes on expressions are experimental + --> $DIR/repr_packed.rs:47:17 + | +LL | let mut c = #[rustc_capture_analysis] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #15701 for more information + = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable + +error[E0658]: attributes on expressions are experimental + --> $DIR/repr_packed.rs:81:13 + | +LL | let c = #[rustc_capture_analysis] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #15701 for more information + = help: add `#![feature(stmt_expr_attributes)]` to the crate attributes to enable + +warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/repr_packed.rs:1:12 + | +LL | #![feature(capture_disjoint_fields)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53488 for more information + +error: First Pass analysis includes: + --> $DIR/repr_packed.rs:19:5 + | +LL | / || { +LL | | +LL | | +LL | | let z1: &u8 = &foo.x; +... | +LL | | println!("({}, {})", z1, z2); +LL | | }; + | |_____^ + | +note: Capturing foo[(0, 0)] -> ImmBorrow + --> $DIR/repr_packed.rs:22:24 + | +LL | let z1: &u8 = &foo.x; + | ^^^^^ +note: Capturing foo[(1, 0)] -> MutBorrow + --> $DIR/repr_packed.rs:25:32 + | +LL | let z2: &mut u8 = &mut foo.y; + | ^^^^^ + +error: Min Capture analysis includes: + --> $DIR/repr_packed.rs:19:5 + | +LL | / || { +LL | | +LL | | +LL | | let z1: &u8 = &foo.x; +... | +LL | | println!("({}, {})", z1, z2); +LL | | }; + | |_____^ + | +note: Min Capture foo[(0, 0)] -> ImmBorrow + --> $DIR/repr_packed.rs:22:24 + | +LL | let z1: &u8 = &foo.x; + | ^^^^^ +note: Min Capture foo[(1, 0)] -> MutBorrow + --> $DIR/repr_packed.rs:25:32 + | +LL | let z2: &mut u8 = &mut foo.y; + | ^^^^^ + +error: First Pass analysis includes: + --> $DIR/repr_packed.rs:50:5 + | +LL | / || { +LL | | +LL | | +LL | | let z1: &String = &foo.x; +... | +LL | | println!("({}, {})", z1, z2); +LL | | }; + | |_____^ + | +note: Capturing foo[] -> MutBorrow + --> $DIR/repr_packed.rs:54:33 + | +LL | let z2: &mut u16 = &mut foo.y; + | ^^^^^ + +error: Min Capture analysis includes: + --> $DIR/repr_packed.rs:50:5 + | +LL | / || { +LL | | +LL | | +LL | | let z1: &String = &foo.x; +... | +LL | | println!("({}, {})", z1, z2); +LL | | }; + | |_____^ + | +note: Min Capture foo[] -> MutBorrow + --> $DIR/repr_packed.rs:54:33 + | +LL | let z2: &mut u16 = &mut foo.y; + | ^^^^^ + +error: First Pass analysis includes: + --> $DIR/repr_packed.rs:84:5 + | +LL | / || { +LL | | +LL | | +LL | | println!("{}", foo.x); +... | +LL | | +LL | | }; + | |_____^ + | +note: Capturing foo[] -> ImmBorrow + --> $DIR/repr_packed.rs:87:24 + | +LL | println!("{}", foo.x); + | ^^^^^ +note: Capturing foo[(0, 0)] -> ByValue + --> $DIR/repr_packed.rs:91:18 + | +LL | let _z = foo.x; + | ^^^^^ + +error: Min Capture analysis includes: + --> $DIR/repr_packed.rs:84:5 + | +LL | / || { +LL | | +LL | | +LL | | println!("{}", foo.x); +... | +LL | | +LL | | }; + | |_____^ + | +note: Min Capture foo[] -> ByValue + --> $DIR/repr_packed.rs:87:24 + | +LL | println!("{}", foo.x); + | ^^^^^ foo[] used here +... +LL | let _z = foo.x; + | ^^^^^ foo[] captured as ByValue here + +error: aborting due to 9 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/capture_with_wildcard_match.rs b/src/test/ui/closures/2229_closure_analysis/run_pass/capture_with_wildcard_match.rs new file mode 100644 index 0000000000..eaea0dbfb5 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/capture_with_wildcard_match.rs @@ -0,0 +1,28 @@ +//check-pass +#![feature(capture_disjoint_fields)] +//~^ WARNING: the feature `capture_disjoint_fields` is incomplete + +fn test1() { + let foo : [Vec; 3] = ["String".into(), "String".into(), "String".into()]; + let c = || { + match foo { _ => () }; + }; + drop(foo); + c(); +} + +fn test2() { + let foo : Option<[Vec; 3]> = Some(["String".into(), "String".into(), "String".into()]); + let c = || { + match foo { + Some(_) => 1, + _ => 2 + }; + }; + c(); +} + +fn main() { + test1(); + test2(); +} diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/capture_with_wildcard_match.stderr b/src/test/ui/closures/2229_closure_analysis/run_pass/capture_with_wildcard_match.stderr new file mode 100644 index 0000000000..2c17a189af --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/capture_with_wildcard_match.stderr @@ -0,0 +1,11 @@ +warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/capture_with_wildcard_match.rs:2:12 + | +LL | #![feature(capture_disjoint_fields)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53488 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/destructure-pattern-closure-within-closure.rs b/src/test/ui/closures/2229_closure_analysis/run_pass/destructure-pattern-closure-within-closure.rs new file mode 100644 index 0000000000..3ad083a92d --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/destructure-pattern-closure-within-closure.rs @@ -0,0 +1,22 @@ +//check-pass +#![feature(capture_disjoint_fields)] +//~^ WARNING: the feature `capture_disjoint_fields` is incomplete +#![warn(unused)] + +fn main() { + let t = (String::from("Hello"), String::from("World")); + let g = (String::from("Mr"), String::from("Goose")); + + let a = || { + let (_, g2) = g; + //~^ WARN unused variable: `g2` + let c = || { + let (_, t2) = t; + //~^ WARN unused variable: `t2` + }; + + c(); + }; + + a(); +} diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/destructure-pattern-closure-within-closure.stderr b/src/test/ui/closures/2229_closure_analysis/run_pass/destructure-pattern-closure-within-closure.stderr new file mode 100644 index 0000000000..c4abf93412 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/destructure-pattern-closure-within-closure.stderr @@ -0,0 +1,30 @@ +warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/destructure-pattern-closure-within-closure.rs:2:12 + | +LL | #![feature(capture_disjoint_fields)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53488 for more information + +warning: unused variable: `t2` + --> $DIR/destructure-pattern-closure-within-closure.rs:14:21 + | +LL | let (_, t2) = t; + | ^^ help: if this is intentional, prefix it with an underscore: `_t2` + | +note: the lint level is defined here + --> $DIR/destructure-pattern-closure-within-closure.rs:4:9 + | +LL | #![warn(unused)] + | ^^^^^^ + = note: `#[warn(unused_variables)]` implied by `#[warn(unused)]` + +warning: unused variable: `g2` + --> $DIR/destructure-pattern-closure-within-closure.rs:11:17 + | +LL | let (_, g2) = g; + | ^^ help: if this is intentional, prefix it with an underscore: `_g2` + +warning: 3 warnings emitted + diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/destructure_patterns.rs b/src/test/ui/closures/2229_closure_analysis/run_pass/destructure_patterns.rs new file mode 100644 index 0000000000..65527648b2 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/destructure_patterns.rs @@ -0,0 +1,123 @@ +//check-pass +#![feature(capture_disjoint_fields)] +//~^ WARNING: the feature `capture_disjoint_fields` is incomplete +#![warn(unused)] + +struct Point { + x: u32, + y: u32, +} + +fn test1() { + let t = (String::from("Hello"), String::from("World")); + + let c = || { + let (t1, t2) = t; + //~^ WARN unused variable: `t1` + //~| WARN unused variable: `t2` + }; + + c(); +} + +fn test2() { + let t = (String::from("Hello"), String::from("World")); + + let c = || { + let (t1, _) = t; + //~^ WARN unused variable: `t1` + }; + + c(); +} + +fn test3() { + let t = (String::from("Hello"), String::from("World")); + + let c = || { + let (_, t2) = t; + //~^ WARN unused variable: `t2` + }; + + c(); +} + +fn test4() { + let t = (String::from("Hello"), String::from("World")); + //~^ WARN unused variable: `t` + + let c = || { + let (_, _) = t; + }; + + c(); +} + +fn test5() { + let t = (String::new(), String::new()); + let _c = || { + let _a = match t { + (t1, _) => t1, + }; + }; +} + +fn test6() { + let t = (String::new(), String::new()); + let _c = || { + let _a = match t { + (_, t2) => t2, + }; + }; +} + +fn test7() { + let t = (String::new(), String::new()); + let _c = || { + let _a = match t { + (t1, t2) => (t1, t2), + }; + }; +} + +fn test8() { + let x = 0; + //~^ WARN unused variable: `x` + let tup = (1, 2); + //~^ WARN unused variable: `tup` + let p = Point { x: 10, y: 20 }; + + let c = || { + let _ = x; + let Point { x, y } = p; + //~^ WARN unused variable: `x` + println!("{}", y); + let (_, _) = tup; + }; + + c(); +} + +fn test9() { + let _z = 9; + let t = (String::from("Hello"), String::from("World")); + + let c = || { + let (_, t) = t; + println!("{}", t); + }; + + c(); +} + +fn main() { + test1(); + test2(); + test3(); + test4(); + test5(); + test6(); + test7(); + test8(); + test9(); +} diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/destructure_patterns.stderr b/src/test/ui/closures/2229_closure_analysis/run_pass/destructure_patterns.stderr new file mode 100644 index 0000000000..fcfe9ee95f --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/destructure_patterns.stderr @@ -0,0 +1,66 @@ +warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/destructure_patterns.rs:2:12 + | +LL | #![feature(capture_disjoint_fields)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53488 for more information + +warning: unused variable: `t1` + --> $DIR/destructure_patterns.rs:15:14 + | +LL | let (t1, t2) = t; + | ^^ help: if this is intentional, prefix it with an underscore: `_t1` + | +note: the lint level is defined here + --> $DIR/destructure_patterns.rs:4:9 + | +LL | #![warn(unused)] + | ^^^^^^ + = note: `#[warn(unused_variables)]` implied by `#[warn(unused)]` + +warning: unused variable: `t2` + --> $DIR/destructure_patterns.rs:15:18 + | +LL | let (t1, t2) = t; + | ^^ help: if this is intentional, prefix it with an underscore: `_t2` + +warning: unused variable: `t1` + --> $DIR/destructure_patterns.rs:27:14 + | +LL | let (t1, _) = t; + | ^^ help: if this is intentional, prefix it with an underscore: `_t1` + +warning: unused variable: `t2` + --> $DIR/destructure_patterns.rs:38:17 + | +LL | let (_, t2) = t; + | ^^ help: if this is intentional, prefix it with an underscore: `_t2` + +warning: unused variable: `t` + --> $DIR/destructure_patterns.rs:46:9 + | +LL | let t = (String::from("Hello"), String::from("World")); + | ^ help: if this is intentional, prefix it with an underscore: `_t` + +warning: unused variable: `x` + --> $DIR/destructure_patterns.rs:92:21 + | +LL | let Point { x, y } = p; + | ^ help: try ignoring the field: `x: _` + +warning: unused variable: `x` + --> $DIR/destructure_patterns.rs:84:9 + | +LL | let x = 0; + | ^ help: if this is intentional, prefix it with an underscore: `_x` + +warning: unused variable: `tup` + --> $DIR/destructure_patterns.rs:86:9 + | +LL | let tup = (1, 2); + | ^^^ help: if this is intentional, prefix it with an underscore: `_tup` + +warning: 9 warnings emitted + diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/drop_then_use_fake_reads.rs b/src/test/ui/closures/2229_closure_analysis/run_pass/drop_then_use_fake_reads.rs new file mode 100644 index 0000000000..dae50854d8 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/drop_then_use_fake_reads.rs @@ -0,0 +1,12 @@ +//check-pass +#![feature(capture_disjoint_fields)] +//~^ WARNING: the feature `capture_disjoint_fields` is incomplete +#![feature(rustc_attrs)] + +fn main() { + let mut x = 1; + let c = || { + drop(&mut x); + match x { _ => () } + }; +} diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/drop_then_use_fake_reads.stderr b/src/test/ui/closures/2229_closure_analysis/run_pass/drop_then_use_fake_reads.stderr new file mode 100644 index 0000000000..7f811875d1 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/drop_then_use_fake_reads.stderr @@ -0,0 +1,11 @@ +warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/drop_then_use_fake_reads.rs:2:12 + | +LL | #![feature(capture_disjoint_fields)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53488 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/lit-pattern-matching-with-methods.rs b/src/test/ui/closures/2229_closure_analysis/run_pass/lit-pattern-matching-with-methods.rs new file mode 100644 index 0000000000..9c086fe4bd --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/lit-pattern-matching-with-methods.rs @@ -0,0 +1,31 @@ +//check-pass +#![feature(capture_disjoint_fields)] +//~^ WARNING: the feature `capture_disjoint_fields` is incomplete +#![warn(unused)] +#![feature(rustc_attrs)] +#![feature(btree_drain_filter)] + +use std::collections::BTreeMap; +use std::panic::{catch_unwind, AssertUnwindSafe}; + +fn main() { + let mut map = BTreeMap::new(); + map.insert("a", ()); + map.insert("b", ()); + map.insert("c", ()); + + { + let mut it = map.drain_filter(|_, _| true); + catch_unwind(AssertUnwindSafe(|| while it.next().is_some() {})).unwrap_err(); + let result = catch_unwind(AssertUnwindSafe(|| it.next())); + assert!(matches!(result, Ok(None))); + } + + { + let mut it = map.drain_filter(|_, _| true); + catch_unwind(AssertUnwindSafe(|| while let Some(_) = it.next() {})).unwrap_err(); + let result = catch_unwind(AssertUnwindSafe(|| it.next())); + assert!(matches!(result, Ok(None))); + } + +} diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/lit-pattern-matching-with-methods.stderr b/src/test/ui/closures/2229_closure_analysis/run_pass/lit-pattern-matching-with-methods.stderr new file mode 100644 index 0000000000..bc046ecad6 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/lit-pattern-matching-with-methods.stderr @@ -0,0 +1,11 @@ +warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/lit-pattern-matching-with-methods.rs:2:12 + | +LL | #![feature(capture_disjoint_fields)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53488 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/move_closure.rs b/src/test/ui/closures/2229_closure_analysis/run_pass/move_closure.rs index 4007a5a48a..afaafbda01 100644 --- a/src/test/ui/closures/2229_closure_analysis/run_pass/move_closure.rs +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/move_closure.rs @@ -56,9 +56,50 @@ fn no_ref_nested() { c(); } +struct A<'a>(&'a mut String, &'a mut String); +// Test that reborrowing works as expected for move closures +// by attempting a disjoint capture through a reference. +fn disjoint_via_ref() { + let mut x = String::new(); + let mut y = String::new(); + + let mut a = A(&mut x, &mut y); + let a = &mut a; + + let mut c1 = move || { + a.0.truncate(0); + }; + + let mut c2 = move || { + a.1.truncate(0); + }; + + c1(); + c2(); +} + +// Test that even if a path is moved into the closure, the closure is not FnOnce +// if the path is not moved by the closure call. +fn data_moved_but_not_fn_once() { + let x = Box::new(10i32); + + let c = move || { + // *x has type i32 which is Copy. So even though the box `x` will be moved + // into the closure, `x` is never moved when the closure is called, i.e. the + // ownership stays with the closure and therefore we can call the function multiple times. + let _x = *x; + }; + + c(); + c(); +} + fn main() { simple_ref(); struct_contains_ref_to_another_struct(); no_ref(); no_ref_nested(); + + disjoint_via_ref(); + data_moved_but_not_fn_once(); } diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/struct-pattern-matching-with-methods.rs b/src/test/ui/closures/2229_closure_analysis/run_pass/struct-pattern-matching-with-methods.rs new file mode 100644 index 0000000000..d260a44892 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/struct-pattern-matching-with-methods.rs @@ -0,0 +1,49 @@ +//check-pass +#![feature(capture_disjoint_fields)] +//~^ WARNING: the feature `capture_disjoint_fields` is incomplete +#![warn(unused)] +#![feature(rustc_attrs)] + +#[derive(Debug, Clone, Copy)] +enum PointType { + TwoD { x: u32, y: u32 }, + + ThreeD{ x: u32, y: u32, z: u32 } +} + +// Testing struct patterns +struct Points { + points: Vec, +} + +impl Points { + pub fn test1(&mut self) -> Vec { + (0..self.points.len()) + .filter_map(|i| { + let idx = i as usize; + match self.test2(idx) { + PointType::TwoD { .. } => Some(i), + PointType::ThreeD { .. } => None, + } + }) + .collect() + } + + pub fn test2(&mut self, i: usize) -> PointType { + self.points[i] + } +} + +fn main() { + let mut points = Points { + points: Vec::::new() + }; + + points.points.push(PointType::ThreeD { x:0, y:0, z:0 }); + points.points.push(PointType::TwoD{ x:0, y:0 }); + points.points.push(PointType::ThreeD{ x:0, y:0, z:0 }); + points.points.push(PointType::TwoD{ x:0, y:0 }); + + println!("{:?}", points.test1()); + println!("{:?}", points.points); +} diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/struct-pattern-matching-with-methods.stderr b/src/test/ui/closures/2229_closure_analysis/run_pass/struct-pattern-matching-with-methods.stderr new file mode 100644 index 0000000000..3e4303a371 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/struct-pattern-matching-with-methods.stderr @@ -0,0 +1,11 @@ +warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/struct-pattern-matching-with-methods.rs:2:12 + | +LL | #![feature(capture_disjoint_fields)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53488 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/tuple-struct-pattern-matching-with-methods.rs b/src/test/ui/closures/2229_closure_analysis/run_pass/tuple-struct-pattern-matching-with-methods.rs new file mode 100644 index 0000000000..b3bee79254 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/tuple-struct-pattern-matching-with-methods.rs @@ -0,0 +1,44 @@ +//check-pass +#![feature(capture_disjoint_fields)] +//~^ WARNING: the feature `capture_disjoint_fields` is incomplete + +#[derive(Copy, Clone)] +enum PointType { + TwoD(u32, u32), + ThreeD(u32, u32, u32) +} + +// Testing tuple struct patterns +struct Points { + points: Vec, +} + +impl Points { + pub fn test1(&mut self) -> Vec { + (0..self.points.len()) + .filter_map(|i| { + match self.test2(i) { + PointType::TwoD (..) => Some(i), + PointType::ThreeD (..) => None, + } + }) + .collect() + } + + pub fn test2(&mut self, i: usize) -> PointType { + self.points[i] + } +} + +fn main() { + let mut points = Points { + points: Vec::::new() + }; + + points.points.push(PointType::ThreeD(0,0,0)); + points.points.push(PointType::TwoD(0,0)); + points.points.push(PointType::ThreeD(0,0,1)); + points.points.push(PointType::TwoD(0,1)); + + println!("{:?}", points.test1()); +} diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/tuple-struct-pattern-matching-with-methods.stderr b/src/test/ui/closures/2229_closure_analysis/run_pass/tuple-struct-pattern-matching-with-methods.stderr new file mode 100644 index 0000000000..ded0e37b0f --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/tuple-struct-pattern-matching-with-methods.stderr @@ -0,0 +1,11 @@ +warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/tuple-struct-pattern-matching-with-methods.rs:2:12 + | +LL | #![feature(capture_disjoint_fields)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53488 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/use_of_mutable_borrow_and_fake_reads.rs b/src/test/ui/closures/2229_closure_analysis/run_pass/use_of_mutable_borrow_and_fake_reads.rs new file mode 100644 index 0000000000..0e6da8f4f1 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/use_of_mutable_borrow_and_fake_reads.rs @@ -0,0 +1,12 @@ +//check-pass +#![feature(capture_disjoint_fields)] +//~^ WARNING: the feature `capture_disjoint_fields` is incomplete +#![feature(rustc_attrs)] + +fn main() { + let mut x = 0; + let c = || { + &mut x; // mutable borrow of `x` + match x { _ => () } // fake read of `x` + }; +} diff --git a/src/test/ui/closures/2229_closure_analysis/run_pass/use_of_mutable_borrow_and_fake_reads.stderr b/src/test/ui/closures/2229_closure_analysis/run_pass/use_of_mutable_borrow_and_fake_reads.stderr new file mode 100644 index 0000000000..7d16d77bf7 --- /dev/null +++ b/src/test/ui/closures/2229_closure_analysis/run_pass/use_of_mutable_borrow_and_fake_reads.stderr @@ -0,0 +1,11 @@ +warning: the feature `capture_disjoint_fields` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/use_of_mutable_borrow_and_fake_reads.rs:2:12 + | +LL | #![feature(capture_disjoint_fields)] + | ^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53488 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/closures/issue-82438-mut-without-upvar.rs b/src/test/ui/closures/issue-82438-mut-without-upvar.rs new file mode 100644 index 0000000000..5d88e1e77d --- /dev/null +++ b/src/test/ui/closures/issue-82438-mut-without-upvar.rs @@ -0,0 +1,28 @@ +use std::error::Error; +struct A { +} + +impl A { + pub fn new() -> A { + A { + } + } + + pub fn f<'a>( + &'a self, + team_name: &'a str, + c: &'a mut dyn FnMut(String, String, u64, u64) + ) -> Result<(), Box> { + Ok(()) + } +} + + +fn main() { + let A = A::new(); + let participant_name = "A"; + + let c = |a, b, c, d| {}; + + A.f(participant_name, &mut c); //~ ERROR cannot borrow +} diff --git a/src/test/ui/closures/issue-82438-mut-without-upvar.stderr b/src/test/ui/closures/issue-82438-mut-without-upvar.stderr new file mode 100644 index 0000000000..06e2b5d0c1 --- /dev/null +++ b/src/test/ui/closures/issue-82438-mut-without-upvar.stderr @@ -0,0 +1,12 @@ +error[E0596]: cannot borrow `c` as mutable, as it is not declared as mutable + --> $DIR/issue-82438-mut-without-upvar.rs:27:27 + | +LL | let c = |a, b, c, d| {}; + | - help: consider changing this to be mutable: `mut c` +LL | +LL | A.f(participant_name, &mut c); + | ^^^^^^ cannot borrow as mutable + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0596`. diff --git a/src/test/ui/codemap_tests/unicode.stderr b/src/test/ui/codemap_tests/unicode.stderr index 61c3f4f1c9..b7ba4fa46d 100644 --- a/src/test/ui/codemap_tests/unicode.stderr +++ b/src/test/ui/codemap_tests/unicode.stderr @@ -4,7 +4,7 @@ error[E0703]: invalid ABI: found `路濫狼á́́` LL | extern "路濫狼á́́" fn foo() {} | ^^^^^^^^^ invalid ABI | - = help: valid ABIs: Rust, C, cdecl, stdcall, fastcall, vectorcall, thiscall, aapcs, win64, sysv64, ptx-kernel, msp430-interrupt, x86-interrupt, amdgpu-kernel, efiapi, avr-interrupt, avr-non-blocking-interrupt, C-cmse-nonsecure-call, system, rust-intrinsic, rust-call, platform-intrinsic, unadjusted + = help: valid ABIs: Rust, C, C-unwind, cdecl, stdcall, stdcall-unwind, fastcall, vectorcall, thiscall, thiscall-unwind, aapcs, win64, sysv64, ptx-kernel, msp430-interrupt, x86-interrupt, amdgpu-kernel, efiapi, avr-interrupt, avr-non-blocking-interrupt, C-cmse-nonsecure-call, system, system-unwind, rust-intrinsic, rust-call, platform-intrinsic, unadjusted error: aborting due to previous error diff --git a/src/test/ui/coercion/coercion-missing-tail-expected-type.stderr b/src/test/ui/coercion/coercion-missing-tail-expected-type.stderr index da8db4331d..df1fb58e25 100644 --- a/src/test/ui/coercion/coercion-missing-tail-expected-type.stderr +++ b/src/test/ui/coercion/coercion-missing-tail-expected-type.stderr @@ -12,13 +12,13 @@ error[E0308]: mismatched types --> $DIR/coercion-missing-tail-expected-type.rs:8:13 | LL | fn foo() -> Result { - | --- ^^^^^^^^^^^^^^^ expected enum `std::result::Result`, found `()` + | --- ^^^^^^^^^^^^^^^ expected enum `Result`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression LL | Ok(1); | - help: consider removing this semicolon | - = note: expected enum `std::result::Result` + = note: expected enum `Result` found unit type `()` error: aborting due to 2 previous errors diff --git a/src/test/ui/command/command-pre-exec.rs b/src/test/ui/command/command-pre-exec.rs index 8fc6a22033..819ed0b2dd 100644 --- a/src/test/ui/command/command-pre-exec.rs +++ b/src/test/ui/command/command-pre-exec.rs @@ -43,20 +43,6 @@ fn main() { assert!(output.stderr.is_empty()); assert_eq!(output.stdout, b"hello\nhello2\n"); - let output = unsafe { - Command::new(&me) - .arg("test2") - .pre_exec(|| { - env::set_var("FOO", "BAR"); - Ok(()) - }) - .output() - .unwrap() - }; - assert!(output.status.success()); - assert!(output.stderr.is_empty()); - assert!(output.stdout.is_empty()); - let output = unsafe { Command::new(&me) .arg("test3") diff --git a/src/test/ui/conditional-compilation/cfg-attr-multi-true.stderr b/src/test/ui/conditional-compilation/cfg-attr-multi-true.stderr index 21b3a6f1f3..5f278f94b9 100644 --- a/src/test/ui/conditional-compilation/cfg-attr-multi-true.stderr +++ b/src/test/ui/conditional-compilation/cfg-attr-multi-true.stderr @@ -10,7 +10,7 @@ warning: use of deprecated struct `MustUseDeprecated` --> $DIR/cfg-attr-multi-true.rs:19:5 | LL | MustUseDeprecated::new(); - | ^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^ warning: use of deprecated struct `MustUseDeprecated` --> $DIR/cfg-attr-multi-true.rs:13:17 diff --git a/src/test/ui/conditional-compilation/inner-cfg-non-inline-mod.rs b/src/test/ui/conditional-compilation/inner-cfg-non-inline-mod.rs new file mode 100644 index 0000000000..af5a6462e8 --- /dev/null +++ b/src/test/ui/conditional-compilation/inner-cfg-non-inline-mod.rs @@ -0,0 +1,7 @@ +// check-pass + +mod module_with_cfg; + +mod module_with_cfg {} // Ok, the module above is configured away by an inner attribute. + +fn main() {} diff --git a/src/test/ui/conditional-compilation/module_with_cfg.rs b/src/test/ui/conditional-compilation/module_with_cfg.rs new file mode 100644 index 0000000000..56c4baadf2 --- /dev/null +++ b/src/test/ui/conditional-compilation/module_with_cfg.rs @@ -0,0 +1,3 @@ +// ignore-test + +#![cfg_attr(all(), cfg(FALSE))] diff --git a/src/test/ui/const-generics/conservative_is_privately_uninhabited_uses_correct_param_env-1.rs b/src/test/ui/const-generics/conservative_is_privately_uninhabited_uses_correct_param_env-1.rs new file mode 100644 index 0000000000..d1bffae0d9 --- /dev/null +++ b/src/test/ui/const-generics/conservative_is_privately_uninhabited_uses_correct_param_env-1.rs @@ -0,0 +1,27 @@ +// run-pass +#![feature(const_generics, const_evaluatable_checked)] +#![allow(incomplete_features)] + +// This tests that the `conservative_is_privately_uninhabited` fn doesn't cause +// ICEs by trying to evaluate `T::ASSOC` with an incorrect `ParamEnv`. + +trait Foo { + const ASSOC: usize = 1; +} + +struct Iced(T, [(); T::ASSOC]) +where + [(); T::ASSOC]: ; + +impl Foo for u32 {} + +fn foo() +where + [(); T::ASSOC]: , +{ + let _iced: Iced = return; +} + +fn main() { + foo::(); +} diff --git a/src/test/ui/const-generics/conservative_is_privately_uninhabited_uses_correct_param_env-2.rs b/src/test/ui/const-generics/conservative_is_privately_uninhabited_uses_correct_param_env-2.rs new file mode 100644 index 0000000000..96dbac1fbe --- /dev/null +++ b/src/test/ui/const-generics/conservative_is_privately_uninhabited_uses_correct_param_env-2.rs @@ -0,0 +1,20 @@ +// run-pass +#![feature(const_generics, const_evaluatable_checked)] +#![allow(incomplete_features)] + +// This tests that the `conservative_is_privately_uninhabited` fn doesn't cause +// ICEs by trying to evaluate `T::ASSOC` with an incorrect `ParamEnv`. + +trait Foo { + const ASSOC: usize = 1; +} + +struct Iced(T, [(); T::ASSOC]) +where + [(); T::ASSOC]: ; + +impl Foo for u32 {} + +fn main() { + let _iced: Iced = return; +} diff --git a/src/test/ui/const-generics/const-argument-cross-crate-mismatch.full.stderr b/src/test/ui/const-generics/const-argument-cross-crate-mismatch.full.stderr index a35c3abc11..6ef698bd6a 100644 --- a/src/test/ui/const-generics/const-argument-cross-crate-mismatch.full.stderr +++ b/src/test/ui/const-generics/const-argument-cross-crate-mismatch.full.stderr @@ -1,11 +1,11 @@ error[E0308]: mismatched types - --> $DIR/const-argument-cross-crate-mismatch.rs:7:67 + --> $DIR/const-argument-cross-crate-mismatch.rs:9:67 | LL | let _ = const_generic_lib::function(const_generic_lib::Struct([0u8, 1u8])); | ^^^^^^^^^^ expected an array with a fixed size of 3 elements, found one with 2 elements error[E0308]: mismatched types - --> $DIR/const-argument-cross-crate-mismatch.rs:9:65 + --> $DIR/const-argument-cross-crate-mismatch.rs:11:65 | LL | let _: const_generic_lib::Alias = const_generic_lib::Struct([0u8, 1u8, 2u8]); | ^^^^^^^^^^^^^^^ expected an array with a fixed size of 2 elements, found one with 3 elements diff --git a/src/test/ui/const-generics/const-argument-cross-crate-mismatch.min.stderr b/src/test/ui/const-generics/const-argument-cross-crate-mismatch.min.stderr index a35c3abc11..6ef698bd6a 100644 --- a/src/test/ui/const-generics/const-argument-cross-crate-mismatch.min.stderr +++ b/src/test/ui/const-generics/const-argument-cross-crate-mismatch.min.stderr @@ -1,11 +1,11 @@ error[E0308]: mismatched types - --> $DIR/const-argument-cross-crate-mismatch.rs:7:67 + --> $DIR/const-argument-cross-crate-mismatch.rs:9:67 | LL | let _ = const_generic_lib::function(const_generic_lib::Struct([0u8, 1u8])); | ^^^^^^^^^^ expected an array with a fixed size of 3 elements, found one with 2 elements error[E0308]: mismatched types - --> $DIR/const-argument-cross-crate-mismatch.rs:9:65 + --> $DIR/const-argument-cross-crate-mismatch.rs:11:65 | LL | let _: const_generic_lib::Alias = const_generic_lib::Struct([0u8, 1u8, 2u8]); | ^^^^^^^^^^^^^^^ expected an array with a fixed size of 2 elements, found one with 3 elements diff --git a/src/test/ui/const-generics/const-argument-cross-crate-mismatch.rs b/src/test/ui/const-generics/const-argument-cross-crate-mismatch.rs index 9ae2ae50ba..a8f533ecea 100644 --- a/src/test/ui/const-generics/const-argument-cross-crate-mismatch.rs +++ b/src/test/ui/const-generics/const-argument-cross-crate-mismatch.rs @@ -1,5 +1,7 @@ // aux-build:const_generic_lib.rs // revisions: full min +#![cfg_attr(full, feature(const_generics))] +#![cfg_attr(full, allow(incomplete_features))] extern crate const_generic_lib; diff --git a/src/test/ui/const-generics/const-param-shadowing.stderr b/src/test/ui/const-generics/const-param-shadowing.stderr index 7447ca3ff3..17ccd2f352 100644 --- a/src/test/ui/const-generics/const-param-shadowing.stderr +++ b/src/test/ui/const-generics/const-param-shadowing.stderr @@ -4,7 +4,7 @@ error[E0747]: type provided when a constant was expected LL | fn test() -> Foo { | ^ | -help: if this generic argument was intended as a const parameter, try surrounding it with braces: +help: if this generic argument was intended as a const parameter, surround it with braces | LL | fn test() -> Foo<{ N }> { | ^ ^ diff --git a/src/test/ui/const-generics/const_evaluatable_checked/cross_crate_predicate.stderr b/src/test/ui/const-generics/const_evaluatable_checked/cross_crate_predicate.stderr index 92547ca479..1beb5315d1 100644 --- a/src/test/ui/const-generics/const_evaluatable_checked/cross_crate_predicate.stderr +++ b/src/test/ui/const-generics/const_evaluatable_checked/cross_crate_predicate.stderr @@ -4,7 +4,7 @@ error: unconstrained generic constant LL | let _ = const_evaluatable_lib::test1::(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | -help: try adding a `where` bound using this expression: where [u8; std::mem::size_of::() - 1]: Sized +help: try adding a `where` bound using this expression: `where [u8; std::mem::size_of::() - 1]: Sized` --> $DIR/auxiliary/const_evaluatable_lib.rs:6:10 | LL | [u8; std::mem::size_of::() - 1]: Sized, @@ -16,7 +16,7 @@ error: unconstrained generic constant LL | let _ = const_evaluatable_lib::test1::(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | -help: try adding a `where` bound using this expression: where [u8; std::mem::size_of::() - 1]: Sized +help: try adding a `where` bound using this expression: `where [u8; std::mem::size_of::() - 1]: Sized` --> $DIR/auxiliary/const_evaluatable_lib.rs:4:27 | LL | pub fn test1() -> [u8; std::mem::size_of::() - 1] @@ -28,7 +28,7 @@ error: unconstrained generic constant LL | let _ = const_evaluatable_lib::test1::(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | -help: try adding a `where` bound using this expression: where [u8; std::mem::size_of::() - 1]: Sized +help: try adding a `where` bound using this expression: `where [u8; std::mem::size_of::() - 1]: Sized` --> $DIR/auxiliary/const_evaluatable_lib.rs:6:10 | LL | [u8; std::mem::size_of::() - 1]: Sized, @@ -40,7 +40,7 @@ error: unconstrained generic constant LL | let _ = const_evaluatable_lib::test1::(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | -help: try adding a `where` bound using this expression: where [u8; std::mem::size_of::() - 1]: Sized +help: try adding a `where` bound using this expression: `where [u8; std::mem::size_of::() - 1]: Sized` --> $DIR/auxiliary/const_evaluatable_lib.rs:4:27 | LL | pub fn test1() -> [u8; std::mem::size_of::() - 1] diff --git a/src/test/ui/const-generics/const_evaluatable_checked/different-fn.stderr b/src/test/ui/const-generics/const_evaluatable_checked/different-fn.stderr index 00efb61000..8cdc9b5775 100644 --- a/src/test/ui/const-generics/const_evaluatable_checked/different-fn.stderr +++ b/src/test/ui/const-generics/const_evaluatable_checked/different-fn.stderr @@ -4,7 +4,7 @@ error: unconstrained generic constant LL | [0; size_of::>()] | ^^^^^^^^^^^^^^^^^^^ | -help: try adding a `where` bound using this expression: where [u8; size_of::>()]: Sized +help: try adding a `where` bound using this expression: `where [u8; size_of::>()]: Sized` --> $DIR/different-fn.rs:10:9 | LL | [0; size_of::>()] diff --git a/src/test/ui/const-generics/diagnostics.rs b/src/test/ui/const-generics/diagnostics.rs new file mode 100644 index 0000000000..1581af5ab2 --- /dev/null +++ b/src/test/ui/const-generics/diagnostics.rs @@ -0,0 +1,18 @@ +#![crate_type="lib"] +#![feature(min_const_generics)] +#![allow(incomplete_features)] + +struct A; +trait Foo {} +impl Foo for A {} +//~^ ERROR cannot find type +//~| unresolved item provided when a constant + +struct B; +impl Foo for B {} +//~^ ERROR type provided when a constant + +struct C; +impl Foo for C {} +//~^ ERROR cannot find type +//~| unresolved item provided when a constant diff --git a/src/test/ui/const-generics/diagnostics.stderr b/src/test/ui/const-generics/diagnostics.stderr new file mode 100644 index 0000000000..7d038ff955 --- /dev/null +++ b/src/test/ui/const-generics/diagnostics.stderr @@ -0,0 +1,52 @@ +error[E0412]: cannot find type `N` in this scope + --> $DIR/diagnostics.rs:7:16 + | +LL | struct A; + | ---------------------- similarly named struct `A` defined here +LL | trait Foo {} +LL | impl Foo for A {} + | ^ help: a struct with a similar name exists: `A` + +error[E0412]: cannot find type `T` in this scope + --> $DIR/diagnostics.rs:16:32 + | +LL | struct A; + | ---------------------- similarly named struct `A` defined here +... +LL | impl Foo for C {} + | ^ help: a struct with a similar name exists: `A` + +error[E0747]: unresolved item provided when a constant was expected + --> $DIR/diagnostics.rs:7:16 + | +LL | impl Foo for A {} + | ^ + | +help: if this generic argument was intended as a const parameter, surround it with braces + | +LL | impl Foo for A<{ N }> {} + | ^ ^ + +error[E0747]: type provided when a constant was expected + --> $DIR/diagnostics.rs:12:19 + | +LL | impl Foo for B {} + | - ^ + | | + | help: consider changing this type paramater to a `const`-generic: `const N: u8` + +error[E0747]: unresolved item provided when a constant was expected + --> $DIR/diagnostics.rs:16:32 + | +LL | impl Foo for C {} + | ^ + | +help: if this generic argument was intended as a const parameter, surround it with braces + | +LL | impl Foo for C {} + | ^ ^ + +error: aborting due to 5 previous errors + +Some errors have detailed explanations: E0412, E0747. +For more information about an error, try `rustc --explain E0412`. diff --git a/src/test/ui/const-generics/dont-evaluate-array-len-on-err-1.rs b/src/test/ui/const-generics/dont-evaluate-array-len-on-err-1.rs new file mode 100644 index 0000000000..afef748ff4 --- /dev/null +++ b/src/test/ui/const-generics/dont-evaluate-array-len-on-err-1.rs @@ -0,0 +1,22 @@ +#![feature(const_generics, const_evaluatable_checked)] +#![allow(incomplete_features)] + +// This tests that during error handling for the "trait not implemented" error +// we dont try to evaluate std::mem::size_of:: causing an ICE + +struct Adt; + +trait Foo { + type Assoc; + fn foo() + where + [Adt; std::mem::size_of::()]: , + { + <[Adt; std::mem::size_of::()] as Foo>::bar() + //~^ Error: the trait bound + } + + fn bar() {} +} + +fn main() {} diff --git a/src/test/ui/const-generics/dont-evaluate-array-len-on-err-1.stderr b/src/test/ui/const-generics/dont-evaluate-array-len-on-err-1.stderr new file mode 100644 index 0000000000..d894fa90ba --- /dev/null +++ b/src/test/ui/const-generics/dont-evaluate-array-len-on-err-1.stderr @@ -0,0 +1,12 @@ +error[E0277]: the trait bound `[Adt; _]: Foo` is not satisfied + --> $DIR/dont-evaluate-array-len-on-err-1.rs:15:9 + | +LL | <[Adt; std::mem::size_of::()] as Foo>::bar() + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Foo` is not implemented for `[Adt; _]` +... +LL | fn bar() {} + | -------- required by `Foo::bar` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/const-generics/invalid-enum.rs b/src/test/ui/const-generics/invalid-enum.rs index 4ca10ed8b7..32939dcd28 100644 --- a/src/test/ui/const-generics/invalid-enum.rs +++ b/src/test/ui/const-generics/invalid-enum.rs @@ -3,14 +3,14 @@ #[derive(PartialEq, Eq)] enum CompileFlag { - A, - B, + A, + B, } pub fn test_1() {} pub fn test_2(x: T) {} pub struct Example{ - x: T, + x: T, } impl Example { @@ -20,15 +20,15 @@ impl Example { pub fn main() { test_1::(); //~^ ERROR: expected type, found variant - //~| ERROR: type provided when a constant was expected + //~| ERROR: unresolved item provided when a constant was expected test_2::<_, CompileFlag::A>(0); //~^ ERROR: expected type, found variant - //~| ERROR: type provided when a constant was expected + //~| ERROR: unresolved item provided when a constant was expected let _: Example = Example { x: 0 }; //~^ ERROR: expected type, found variant - //~| ERROR: type provided when a constant was expected + //~| ERROR: unresolved item provided when a constant was expected let _: Example = Example { x: 0 }; //~^ ERROR: type provided when a constant was expected diff --git a/src/test/ui/const-generics/invalid-enum.stderr b/src/test/ui/const-generics/invalid-enum.stderr index 7822fc072e..cfbc61f025 100644 --- a/src/test/ui/const-generics/invalid-enum.stderr +++ b/src/test/ui/const-generics/invalid-enum.stderr @@ -25,13 +25,13 @@ LL | let _: Example = Example { x: 0 }; | not a type | help: try using the variant's enum: `CompileFlag` -error[E0747]: type provided when a constant was expected +error[E0747]: unresolved item provided when a constant was expected --> $DIR/invalid-enum.rs:29:18 | LL | let _: Example = Example { x: 0 }; | ^^^^^^^^^^^^^^ | -help: if this generic argument was intended as a const parameter, try surrounding it with braces: +help: if this generic argument was intended as a const parameter, surround it with braces | LL | let _: Example<{ CompileFlag::A }, _> = Example { x: 0 }; | ^ ^ @@ -42,29 +42,29 @@ error[E0747]: type provided when a constant was expected LL | let _: Example = Example { x: 0 }; | ^^^^^^^^^^^^^^^^^^^ | -help: if this generic argument was intended as a const parameter, try surrounding it with braces: +help: if this generic argument was intended as a const parameter, surround it with braces | LL | let _: Example<{ Example::ASSOC_FLAG }, _> = Example { x: 0 }; | ^ ^ -error[E0747]: type provided when a constant was expected +error[E0747]: unresolved item provided when a constant was expected --> $DIR/invalid-enum.rs:21:12 | LL | test_1::(); | ^^^^^^^^^^^^^^ | -help: if this generic argument was intended as a const parameter, try surrounding it with braces: +help: if this generic argument was intended as a const parameter, surround it with braces | LL | test_1::<{ CompileFlag::A }>(); | ^ ^ -error[E0747]: type provided when a constant was expected +error[E0747]: unresolved item provided when a constant was expected --> $DIR/invalid-enum.rs:25:15 | LL | test_2::<_, CompileFlag::A>(0); | ^^^^^^^^^^^^^^ | -help: if this generic argument was intended as a const parameter, try surrounding it with braces: +help: if this generic argument was intended as a const parameter, surround it with braces | LL | test_2::<_, { CompileFlag::A }>(0); | ^ ^ diff --git a/src/test/ui/const-generics/issue-79518-default_trait_method_normalization.rs b/src/test/ui/const-generics/issue-79518-default_trait_method_normalization.rs new file mode 100644 index 0000000000..8f02bfb937 --- /dev/null +++ b/src/test/ui/const-generics/issue-79518-default_trait_method_normalization.rs @@ -0,0 +1,21 @@ +#![feature(const_generics, const_evaluatable_checked)] +#![allow(incomplete_features)] + +// This test is a minimized reproduction for #79518 where +// during error handling for the type mismatch we would try +// to evaluate std::mem::size_of:: causing an ICE + +trait Foo { + type Assoc: PartialEq; + const AssocInstance: Self::Assoc; + + fn foo() + where + [(); std::mem::size_of::()]: , + { + Self::AssocInstance == [(); std::mem::size_of::()]; + //~^ Error: mismatched types + } +} + +fn main() {} diff --git a/src/test/ui/const-generics/issue-79518-default_trait_method_normalization.stderr b/src/test/ui/const-generics/issue-79518-default_trait_method_normalization.stderr new file mode 100644 index 0000000000..c90774e944 --- /dev/null +++ b/src/test/ui/const-generics/issue-79518-default_trait_method_normalization.stderr @@ -0,0 +1,14 @@ +error[E0308]: mismatched types + --> $DIR/issue-79518-default_trait_method_normalization.rs:16:32 + | +LL | Self::AssocInstance == [(); std::mem::size_of::()]; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected associated type, found array `[(); _]` + | + = note: expected associated type `::Assoc` + found array `[(); _]` + = help: consider constraining the associated type `::Assoc` to `[(); _]` or calling a method that returns `::Assoc` + = note: for more information, visit https://doc.rust-lang.org/book/ch19-03-advanced-traits.html + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/const-generics/issue-80561-incorrect-param-env.rs b/src/test/ui/const-generics/issue-80561-incorrect-param-env.rs new file mode 100644 index 0000000000..a34d74b29e --- /dev/null +++ b/src/test/ui/const-generics/issue-80561-incorrect-param-env.rs @@ -0,0 +1,24 @@ +// check-pass +#![feature(const_generics, const_evaluatable_checked)] +#![allow(incomplete_features)] + +// This tests that the correct `param_env` is used so that +// attempting to normalize `Self::N` does not cause an ICE. + +pub struct Foo; + +impl Foo { + pub fn foo() {} +} + +pub trait Bar { + const N: usize; + fn bar() + where + [(); Self::N]: , + { + Foo::<{ Self::N }>::foo(); + } +} + +fn main() {} diff --git a/src/test/ui/const-generics/issues/issue-75299.rs b/src/test/ui/const-generics/issues/issue-75299.rs index 23f30a1eea..9d3f25b3b4 100644 --- a/src/test/ui/const-generics/issues/issue-75299.rs +++ b/src/test/ui/const-generics/issues/issue-75299.rs @@ -1,4 +1,4 @@ -// compile-flags: -Zmir-opt-level=3 +// compile-flags: -Zmir-opt-level=4 // run-pass #![feature(const_generics)] diff --git a/src/test/ui/const-generics/type_mismatch.rs b/src/test/ui/const-generics/type_mismatch.rs new file mode 100644 index 0000000000..4a7534e371 --- /dev/null +++ b/src/test/ui/const-generics/type_mismatch.rs @@ -0,0 +1,9 @@ +fn foo() -> [u8; N] { + bar::() //~ ERROR mismatched types +} + +fn bar() -> [u8; N] {} +//~^ ERROR mismatched types +//~| ERROR mismatched types + +fn main() {} diff --git a/src/test/ui/const-generics/type_mismatch.stderr b/src/test/ui/const-generics/type_mismatch.stderr new file mode 100644 index 0000000000..f5053e4c8c --- /dev/null +++ b/src/test/ui/const-generics/type_mismatch.stderr @@ -0,0 +1,23 @@ +error[E0308]: mismatched types + --> $DIR/type_mismatch.rs:2:11 + | +LL | bar::() + | ^ expected `u8`, found `usize` + +error[E0308]: mismatched types + --> $DIR/type_mismatch.rs:5:31 + | +LL | fn bar() -> [u8; N] {} + | ^ expected `usize`, found `u8` + +error[E0308]: mismatched types + --> $DIR/type_mismatch.rs:5:26 + | +LL | fn bar() -> [u8; N] {} + | --- ^^^^^^^ expected array `[u8; N]`, found `()` + | | + | implicitly returns `()` as its body has no tail or `return` expression + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/const-generics/type_not_in_scope.rs b/src/test/ui/const-generics/type_not_in_scope.rs new file mode 100644 index 0000000000..5933701808 --- /dev/null +++ b/src/test/ui/const-generics/type_not_in_scope.rs @@ -0,0 +1,11 @@ +impl X { + //~^ ERROR cannot find type + fn getn() -> [u8; N] { + getn::() + } +} +fn getn() -> [u8; N] {} +//~^ ERROR expected type, found built-in attribute `cfg_attr` +//~| ERROR mismatched types + +fn main() {} diff --git a/src/test/ui/const-generics/type_not_in_scope.stderr b/src/test/ui/const-generics/type_not_in_scope.stderr new file mode 100644 index 0000000000..16796acb3d --- /dev/null +++ b/src/test/ui/const-generics/type_not_in_scope.stderr @@ -0,0 +1,24 @@ +error[E0412]: cannot find type `X` in this scope + --> $DIR/type_not_in_scope.rs:1:6 + | +LL | impl X { + | ^ not found in this scope + +error[E0573]: expected type, found built-in attribute `cfg_attr` + --> $DIR/type_not_in_scope.rs:7:18 + | +LL | fn getn() -> [u8; N] {} + | ^^^^^^^^ not a type + +error[E0308]: mismatched types + --> $DIR/type_not_in_scope.rs:7:33 + | +LL | fn getn() -> [u8; N] {} + | ---- ^^^^^^^ expected array `[u8; N]`, found `()` + | | + | implicitly returns `()` as its body has no tail or `return` expression + +error: aborting due to 3 previous errors + +Some errors have detailed explanations: E0308, E0412, E0573. +For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/const-ptr/out_of_bounds_read.stderr b/src/test/ui/const-ptr/out_of_bounds_read.stderr index 87b7c377b0..6c4092e3e5 100644 --- a/src/test/ui/const-ptr/out_of_bounds_read.stderr +++ b/src/test/ui/const-ptr/out_of_bounds_read.stderr @@ -1,13 +1,12 @@ error: any use of this value will cause an error - --> $SRC_DIR/core/src/intrinsics.rs:LL:COL - | -LL | unsafe { copy_nonoverlapping(src, dst, count) } - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | memory access failed: pointer must be in-bounds at offset 8, but is outside bounds of alloc6 which has size 4 - | inside `copy_nonoverlapping::` at $SRC_DIR/core/src/intrinsics.rs:LL:COL - | inside `std::ptr::read::` at $SRC_DIR/core/src/ptr/mod.rs:LL:COL - | inside `_READ` at $DIR/out_of_bounds_read.rs:13:33 + --> $SRC_DIR/core/src/ptr/mod.rs:LL:COL + | +LL | copy_nonoverlapping(src, tmp.as_mut_ptr(), 1); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | | + | memory access failed: pointer must be in-bounds at offset 8, but is outside bounds of alloc6 which has size 4 + | inside `std::ptr::read::` at $SRC_DIR/core/src/ptr/mod.rs:LL:COL + | inside `_READ` at $DIR/out_of_bounds_read.rs:13:33 | ::: $DIR/out_of_bounds_read.rs:13:5 | @@ -19,16 +18,15 @@ LL | const _READ: u32 = unsafe { ptr::read(PAST_END_PTR) }; = note: for more information, see issue #71800 error: any use of this value will cause an error - --> $SRC_DIR/core/src/intrinsics.rs:LL:COL - | -LL | unsafe { copy_nonoverlapping(src, dst, count) } - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | memory access failed: pointer must be in-bounds at offset 8, but is outside bounds of alloc6 which has size 4 - | inside `copy_nonoverlapping::` at $SRC_DIR/core/src/intrinsics.rs:LL:COL - | inside `std::ptr::read::` at $SRC_DIR/core/src/ptr/mod.rs:LL:COL - | inside `ptr::const_ptr::::read` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL - | inside `_CONST_READ` at $DIR/out_of_bounds_read.rs:14:39 + --> $SRC_DIR/core/src/ptr/mod.rs:LL:COL + | +LL | copy_nonoverlapping(src, tmp.as_mut_ptr(), 1); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | | + | memory access failed: pointer must be in-bounds at offset 8, but is outside bounds of alloc6 which has size 4 + | inside `std::ptr::read::` at $SRC_DIR/core/src/ptr/mod.rs:LL:COL + | inside `ptr::const_ptr::::read` at $SRC_DIR/core/src/ptr/const_ptr.rs:LL:COL + | inside `_CONST_READ` at $DIR/out_of_bounds_read.rs:14:39 | ::: $DIR/out_of_bounds_read.rs:14:5 | @@ -39,16 +37,15 @@ LL | const _CONST_READ: u32 = unsafe { PAST_END_PTR.read() }; = note: for more information, see issue #71800 error: any use of this value will cause an error - --> $SRC_DIR/core/src/intrinsics.rs:LL:COL - | -LL | unsafe { copy_nonoverlapping(src, dst, count) } - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | | - | memory access failed: pointer must be in-bounds at offset 8, but is outside bounds of alloc6 which has size 4 - | inside `copy_nonoverlapping::` at $SRC_DIR/core/src/intrinsics.rs:LL:COL - | inside `std::ptr::read::` at $SRC_DIR/core/src/ptr/mod.rs:LL:COL - | inside `ptr::mut_ptr::::read` at $SRC_DIR/core/src/ptr/mut_ptr.rs:LL:COL - | inside `_MUT_READ` at $DIR/out_of_bounds_read.rs:15:37 + --> $SRC_DIR/core/src/ptr/mod.rs:LL:COL + | +LL | copy_nonoverlapping(src, tmp.as_mut_ptr(), 1); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | | + | memory access failed: pointer must be in-bounds at offset 8, but is outside bounds of alloc6 which has size 4 + | inside `std::ptr::read::` at $SRC_DIR/core/src/ptr/mod.rs:LL:COL + | inside `ptr::mut_ptr::::read` at $SRC_DIR/core/src/ptr/mut_ptr.rs:LL:COL + | inside `_MUT_READ` at $DIR/out_of_bounds_read.rs:15:37 | ::: $DIR/out_of_bounds_read.rs:15:5 | diff --git a/src/test/ui/const-ptr/ptr_to_usize_cast.rs b/src/test/ui/const-ptr/ptr_to_usize_cast.rs new file mode 100644 index 0000000000..bf1e790b5d --- /dev/null +++ b/src/test/ui/const-ptr/ptr_to_usize_cast.rs @@ -0,0 +1,13 @@ +#![feature(const_raw_ptr_to_usize_cast)] + +fn main() { + const OK: usize = unsafe { 0 as *const i32 as usize }; + + const _ERROR: usize = unsafe { &0 as *const i32 as usize }; + //~^ ERROR [const_err] + //~| NOTE cannot cast pointer to integer because it was not created by cast from integer + //~| NOTE + //~| NOTE `#[deny(const_err)]` on by default + //~| WARN this was previously accepted by the compiler but is being phased out + //~| NOTE see issue #71800 +} diff --git a/src/test/ui/const-ptr/ptr_to_usize_cast.stderr b/src/test/ui/const-ptr/ptr_to_usize_cast.stderr new file mode 100644 index 0000000000..48255860bb --- /dev/null +++ b/src/test/ui/const-ptr/ptr_to_usize_cast.stderr @@ -0,0 +1,14 @@ +error: any use of this value will cause an error + --> $DIR/ptr_to_usize_cast.rs:6:36 + | +LL | const _ERROR: usize = unsafe { &0 as *const i32 as usize }; + | -------------------------------^^^^^^^^^^^^^^^^^^^^^^^^^--- + | | + | cannot cast pointer to integer because it was not created by cast from integer + | + = note: `#[deny(const_err)]` 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 #71800 + +error: aborting due to previous error + diff --git a/src/test/ui/const_evaluatable/needs_where_clause.stderr b/src/test/ui/const_evaluatable/needs_where_clause.stderr index e991c508c0..945105d1a2 100644 --- a/src/test/ui/const_evaluatable/needs_where_clause.stderr +++ b/src/test/ui/const_evaluatable/needs_where_clause.stderr @@ -4,7 +4,7 @@ error: unconstrained generic constant LL | b: [f32; complex_maths::(N)], | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | -help: try adding a `where` bound using this expression: where [u8; complex_maths::(N)]: Sized +help: try adding a `where` bound using this expression: `where [u8; complex_maths::(N)]: Sized` --> $DIR/needs_where_clause.rs:11:12 | LL | b: [f32; complex_maths::(N)], diff --git a/src/test/ui/const_evaluatable/no_where_clause.stderr b/src/test/ui/const_evaluatable/no_where_clause.stderr index 65100909e5..84a65f0d1d 100644 --- a/src/test/ui/const_evaluatable/no_where_clause.stderr +++ b/src/test/ui/const_evaluatable/no_where_clause.stderr @@ -4,7 +4,7 @@ error: unconstrained generic constant LL | b: [f32; complex_maths(N)], | ^^^^^^^^^^^^^^^^^^^^^^^ | -help: try adding a `where` bound using this expression: where [u8; complex_maths(N)]: Sized +help: try adding a `where` bound using this expression: `where [u8; complex_maths(N)]: Sized` --> $DIR/no_where_clause.rs:10:12 | LL | b: [f32; complex_maths(N)], diff --git a/src/test/ui/const_prop/inline_spans.rs b/src/test/ui/const_prop/inline_spans.rs index 32902b49d0..adc7874104 100644 --- a/src/test/ui/const_prop/inline_spans.rs +++ b/src/test/ui/const_prop/inline_spans.rs @@ -1,5 +1,5 @@ // build-fail -// compile-flags: -Zmir-opt-level=2 +// compile-flags: -Zmir-opt-level=3 #![deny(warnings)] diff --git a/src/test/ui/const_prop/inline_spans_lint_attribute.rs b/src/test/ui/const_prop/inline_spans_lint_attribute.rs index 656ff02dc6..1db53d7719 100644 --- a/src/test/ui/const_prop/inline_spans_lint_attribute.rs +++ b/src/test/ui/const_prop/inline_spans_lint_attribute.rs @@ -1,6 +1,6 @@ // Must be build-pass, because check-pass will not run const prop and thus not emit the lint anyway. // build-pass -// compile-flags: -Zmir-opt-level=2 +// compile-flags: -Zmir-opt-level=3 #![deny(warnings)] diff --git a/src/test/ui/issues/auxiliary/issue-17718-aux.rs b/src/test/ui/consts/auxiliary/issue-17718-aux.rs similarity index 100% rename from src/test/ui/issues/auxiliary/issue-17718-aux.rs rename to src/test/ui/consts/auxiliary/issue-17718-aux.rs diff --git a/src/test/ui/consts/const-as-fn.rs b/src/test/ui/consts/const-as-fn.rs new file mode 100644 index 0000000000..388f907f8d --- /dev/null +++ b/src/test/ui/consts/const-as-fn.rs @@ -0,0 +1,5 @@ +const FOO: usize = 0; + +fn main() { + FOO(); //~ ERROR expected function, found `usize` +} diff --git a/src/test/ui/consts/const-as-fn.stderr b/src/test/ui/consts/const-as-fn.stderr new file mode 100644 index 0000000000..b8dd4134b2 --- /dev/null +++ b/src/test/ui/consts/const-as-fn.stderr @@ -0,0 +1,14 @@ +error[E0618]: expected function, found `usize` + --> $DIR/const-as-fn.rs:4:5 + | +LL | const FOO: usize = 0; + | --------------------- `FOO` defined here +... +LL | FOO(); + | ^^^-- + | | + | call expression requires function + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0618`. diff --git a/src/test/ui/consts/const-blocks/fn-call-in-non-const.stderr b/src/test/ui/consts/const-blocks/fn-call-in-non-const.stderr index b75452cd21..329c6cb2b1 100644 --- a/src/test/ui/consts/const-blocks/fn-call-in-non-const.stderr +++ b/src/test/ui/consts/const-blocks/fn-call-in-non-const.stderr @@ -7,6 +7,8 @@ LL | let _: [Option; 2] = [no_copy(); 2]; = help: the following implementations were found: as Copy> = note: the `Copy` trait is required because the repeated element will be copied + = help: consider creating a new `const` item and initializing it with the result of the function call to be used in the repeat position, like `const VAL: Type = const_fn();` and `let x = [VAL; 42];` + = help: create an inline `const` block, see RFC #2920 for more information error: aborting due to previous error diff --git a/src/test/ui/consts/const-eval/const_raw_ptr_ops2.stderr b/src/test/ui/consts/const-eval/const_raw_ptr_ops2.stderr index f207674ac1..df8b33a089 100644 --- a/src/test/ui/consts/const-eval/const_raw_ptr_ops2.stderr +++ b/src/test/ui/consts/const-eval/const_raw_ptr_ops2.stderr @@ -4,7 +4,7 @@ error: any use of this value will cause an error LL | const Y2: usize = unsafe { &1 as *const i32 as usize + 1 }; | ---------------------------^^^^^^^^^^^^^^^^^^^^^^^^^------- | | - | "pointer-to-integer cast" needs an rfc before being allowed inside constants + | cannot cast pointer to integer because it was not created by cast from integer | = note: `#[deny(const_err)]` 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! 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 92231d4ced..9e5cb0d4eb 100644 --- a/src/test/ui/consts/const-eval/simd/insert_extract.rs +++ b/src/test/ui/consts/const-eval/simd/insert_extract.rs @@ -8,7 +8,7 @@ #[repr(simd)] struct i8x1(i8); #[repr(simd)] struct u16x2(u16, u16); -#[repr(simd)] struct f32x3(f32, f32, f32); +#[repr(simd)] struct f32x4(f32, f32, f32, f32); extern "platform-intrinsic" { #[rustc_const_stable(feature = "foo", since = "1.3.37")] @@ -39,19 +39,23 @@ fn main() { assert_eq!(Y1, 42); } { - const U: f32x3 = f32x3(13., 14., 15.); - const V: f32x3 = unsafe { simd_insert(U, 1_u32, 42_f32) }; + const U: f32x4 = f32x4(13., 14., 15., 16.); + const V: f32x4 = unsafe { simd_insert(U, 1_u32, 42_f32) }; const X0: f32 = V.0; const X1: f32 = V.1; const X2: f32 = V.2; + const X3: f32 = V.3; const Y0: f32 = unsafe { simd_extract(V, 0) }; const Y1: f32 = unsafe { simd_extract(V, 1) }; const Y2: f32 = unsafe { simd_extract(V, 2) }; + const Y3: f32 = unsafe { simd_extract(V, 3) }; assert_eq!(X0, 13.); assert_eq!(X1, 42.); assert_eq!(X2, 15.); + assert_eq!(X3, 16.); assert_eq!(Y0, 13.); assert_eq!(Y1, 42.); assert_eq!(Y2, 15.); + assert_eq!(Y3, 16.); } } diff --git a/src/test/ui/consts/const-eval/ub-ref.rs b/src/test/ui/consts/const-eval/ub-ref-ptr.rs similarity index 83% rename from src/test/ui/consts/const-eval/ub-ref.rs rename to src/test/ui/consts/const-eval/ub-ref-ptr.rs index e8b101fed6..f6075987d1 100644 --- a/src/test/ui/consts/const-eval/ub-ref.rs +++ b/src/test/ui/consts/const-eval/ub-ref-ptr.rs @@ -3,6 +3,12 @@ use std::mem; +#[repr(C)] +union MaybeUninit { + uninit: (), + init: T, +} + const UNALIGNED: &u16 = unsafe { mem::transmute(&[0u8; 4]) }; //~^ ERROR it is undefined behavior to use this value //~| type validation failed: encountered an unaligned reference (required 2 byte alignment but found 1) @@ -35,4 +41,9 @@ const USIZE_AS_REF: &'static u8 = unsafe { mem::transmute(1337usize) }; const USIZE_AS_BOX: Box = unsafe { mem::transmute(1337usize) }; //~^ ERROR it is undefined behavior to use this value +const UNINIT_PTR: *const i32 = unsafe { MaybeUninit { uninit: () }.init }; +//~^ ERROR it is undefined behavior to use this value +const UNINIT_FN_PTR: fn() = unsafe { MaybeUninit { uninit: () }.init }; +//~^ ERROR it is undefined behavior to use this value + fn main() {} diff --git a/src/test/ui/consts/const-eval/ub-ref.stderr b/src/test/ui/consts/const-eval/ub-ref-ptr.stderr similarity index 77% rename from src/test/ui/consts/const-eval/ub-ref.stderr rename to src/test/ui/consts/const-eval/ub-ref-ptr.stderr index 429ae69eab..7d76c5cb43 100644 --- a/src/test/ui/consts/const-eval/ub-ref.stderr +++ b/src/test/ui/consts/const-eval/ub-ref-ptr.stderr @@ -1,5 +1,5 @@ error[E0080]: it is undefined behavior to use this value - --> $DIR/ub-ref.rs:6:1 + --> $DIR/ub-ref-ptr.rs:12:1 | LL | const UNALIGNED: &u16 = unsafe { mem::transmute(&[0u8; 4]) }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered an unaligned reference (required 2 byte alignment but found 1) @@ -7,7 +7,7 @@ LL | const UNALIGNED: &u16 = unsafe { mem::transmute(&[0u8; 4]) }; = 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-ref.rs:10:1 + --> $DIR/ub-ref-ptr.rs:16:1 | LL | const UNALIGNED_BOX: Box = unsafe { mem::transmute(&[0u8; 4]) }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered an unaligned box (required 2 byte alignment but found 1) @@ -15,7 +15,7 @@ LL | const UNALIGNED_BOX: Box = unsafe { mem::transmute(&[0u8; 4]) }; = 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-ref.rs:14:1 + --> $DIR/ub-ref-ptr.rs:20:1 | LL | const NULL: &u16 = unsafe { mem::transmute(0usize) }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered a NULL reference @@ -23,7 +23,7 @@ LL | const NULL: &u16 = unsafe { mem::transmute(0usize) }; = 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-ref.rs:17:1 + --> $DIR/ub-ref-ptr.rs:23:1 | LL | const NULL_BOX: Box = unsafe { mem::transmute(0usize) }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered a NULL box @@ -31,7 +31,7 @@ LL | const NULL_BOX: Box = unsafe { mem::transmute(0usize) }; = 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-ref.rs:23:1 + --> $DIR/ub-ref-ptr.rs:29:1 | LL | const REF_AS_USIZE: usize = unsafe { mem::transmute(&0) }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered pointer to alloc14, but expected initialized plain (non-pointer) bytes @@ -39,7 +39,7 @@ LL | const REF_AS_USIZE: usize = unsafe { mem::transmute(&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/ub-ref.rs:26:1 + --> $DIR/ub-ref-ptr.rs:32:1 | LL | const REF_AS_USIZE_SLICE: &[usize] = &[unsafe { mem::transmute(&0) }]; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered a pointer at ., but expected plain (non-pointer) bytes @@ -47,7 +47,7 @@ LL | const REF_AS_USIZE_SLICE: &[usize] = &[unsafe { mem::transmute(&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/ub-ref.rs:29:1 + --> $DIR/ub-ref-ptr.rs:35:1 | LL | const REF_AS_USIZE_BOX_SLICE: Box<[usize]> = unsafe { mem::transmute::<&[usize], _>(&[mem::transmute(&0)]) }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered a pointer at ., but expected plain (non-pointer) bytes @@ -55,7 +55,7 @@ LL | const REF_AS_USIZE_BOX_SLICE: Box<[usize]> = unsafe { mem::transmute::<&[us = 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-ref.rs:32:1 + --> $DIR/ub-ref-ptr.rs:38:1 | LL | const USIZE_AS_REF: &'static u8 = unsafe { mem::transmute(1337usize) }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered a dangling reference (created from integer) @@ -63,13 +63,29 @@ LL | const USIZE_AS_REF: &'static u8 = unsafe { mem::transmute(1337usize) }; = 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-ref.rs:35:1 + --> $DIR/ub-ref-ptr.rs:41:1 | LL | const USIZE_AS_BOX: Box = unsafe { mem::transmute(1337usize) }; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered a dangling box (created from integer) | = 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 9 previous errors +error[E0080]: it is undefined behavior to use this value + --> $DIR/ub-ref-ptr.rs:44:1 + | +LL | const UNINIT_PTR: *const i32 = unsafe { MaybeUninit { uninit: () }.init }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered uninitialized raw pointer + | + = 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-ref-ptr.rs:46:1 + | +LL | const UNINIT_FN_PTR: fn() = unsafe { MaybeUninit { uninit: () }.init }; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered uninitialized bytes, but expected a function pointer + | + = 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 11 previous errors For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/consts/const-fn-in-vec.rs b/src/test/ui/consts/const-fn-in-vec.rs new file mode 100644 index 0000000000..a40290eca0 --- /dev/null +++ b/src/test/ui/consts/const-fn-in-vec.rs @@ -0,0 +1,7 @@ +fn main() { + // should hint to create an inline `const` block + // or to create a new `const` item + let strings: [String; 5] = [String::new(); 5]; + //~^ ERROR the trait bound `String: Copy` is not satisfied + println!("{:?}", strings); +} diff --git a/src/test/ui/consts/const-fn-in-vec.stderr b/src/test/ui/consts/const-fn-in-vec.stderr new file mode 100644 index 0000000000..f02cb4f1ff --- /dev/null +++ b/src/test/ui/consts/const-fn-in-vec.stderr @@ -0,0 +1,13 @@ +error[E0277]: the trait bound `String: Copy` is not satisfied + --> $DIR/const-fn-in-vec.rs:4:32 + | +LL | let strings: [String; 5] = [String::new(); 5]; + | ^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `String` + | + = note: the `Copy` trait is required because the repeated element will be copied + = help: consider creating a new `const` item and initializing it with the result of the function call to be used in the repeat position, like `const VAL: Type = const_fn();` and `let x = [VAL; 42];` + = help: create an inline `const` block, see RFC #2920 for more information + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/consts/const-int-arithmetic.rs b/src/test/ui/consts/const-int-arithmetic.rs index e0d722ede9..b9096648f9 100644 --- a/src/test/ui/consts/const-int-arithmetic.rs +++ b/src/test/ui/consts/const-int-arithmetic.rs @@ -1,10 +1,5 @@ // run-pass -#![feature(const_checked_int_methods)] -#![feature(const_euclidean_int_methods)] -#![feature(const_overflowing_int_methods)] -#![feature(const_wrapping_int_methods)] - macro_rules! suite { ($( $fn:ident -> $ty:ty { $( $label:ident : $expr:expr, $result:expr; )* } diff --git a/src/test/ui/consts/control-flow/issue-50577.stderr b/src/test/ui/consts/control-flow/issue-50577.stderr index b7b4c3a30d..39473343bc 100644 --- a/src/test/ui/consts/control-flow/issue-50577.stderr +++ b/src/test/ui/consts/control-flow/issue-50577.stderr @@ -2,10 +2,7 @@ error[E0317]: `if` may be missing an `else` clause --> $DIR/issue-50577.rs:3:16 | LL | Drop = assert_eq!(1, 1), - | ^^^^^^^^^^^^^^^^ - | | - | expected `()`, found `isize` - | found here + | ^^^^^^^^^^^^^^^^ expected `()`, found `isize` | = note: `if` expressions without `else` evaluate to `()` = help: consider adding an `else` block that evaluates to the expected type diff --git a/src/test/ui/consts/copy-intrinsic.rs b/src/test/ui/consts/copy-intrinsic.rs new file mode 100644 index 0000000000..9dc595f37f --- /dev/null +++ b/src/test/ui/consts/copy-intrinsic.rs @@ -0,0 +1,45 @@ +// ignore-tidy-linelength +#![feature(const_mut_refs, const_intrinsic_copy, const_ptr_offset)] +use std::{ptr, mem}; + +const COPY_ZERO: () = unsafe { + // Since we are not copying anything, this should be allowed. + let src = (); + let mut dst = (); + ptr::copy_nonoverlapping(&src as *const _ as *const i32, &mut dst as *mut _ as *mut i32, 0); +}; + +const COPY_OOB_1: () = unsafe { + let mut x = 0i32; + let dangle = (&mut x as *mut i32).wrapping_add(10); + // Even if the first ptr is an int ptr and this is a ZST copy, we should detect dangling 2nd ptrs. + ptr::copy_nonoverlapping(0x100 as *const i32, dangle, 0); //~ ERROR any use of this value will cause an error + //~| memory access failed: pointer must be in-bounds + //~| previously accepted +}; +const COPY_OOB_2: () = unsafe { + let x = 0i32; + let dangle = (&x as *const i32).wrapping_add(10); + // Even if the second ptr is an int ptr and this is a ZST copy, we should detect dangling 1st ptrs. + ptr::copy_nonoverlapping(dangle, 0x100 as *mut i32, 0); //~ ERROR any use of this value will cause an error + //~| memory access failed: pointer must be in-bounds + //~| previously accepted +}; + +const COPY_SIZE_OVERFLOW: () = unsafe { + let x = 0; + let mut y = 0; + ptr::copy(&x, &mut y, 1usize << (mem::size_of::() * 8 - 1)); //~ ERROR any use of this value will cause an error + //~| overflow computing total size of `copy` + //~| previously accepted +}; +const COPY_NONOVERLAPPING_SIZE_OVERFLOW: () = unsafe { + let x = 0; + let mut y = 0; + ptr::copy_nonoverlapping(&x, &mut y, 1usize << (mem::size_of::() * 8 - 1)); //~ ERROR any use of this value will cause an error + //~| overflow computing total size of `copy_nonoverlapping` + //~| previously accepted +}; + +fn main() { +} diff --git a/src/test/ui/consts/copy-intrinsic.stderr b/src/test/ui/consts/copy-intrinsic.stderr new file mode 100644 index 0000000000..2736cdeac6 --- /dev/null +++ b/src/test/ui/consts/copy-intrinsic.stderr @@ -0,0 +1,69 @@ +error: any use of this value will cause an error + --> $DIR/copy-intrinsic.rs:16:5 + | +LL | / const COPY_OOB_1: () = unsafe { +LL | | let mut x = 0i32; +LL | | let dangle = (&mut x as *mut i32).wrapping_add(10); +LL | | // Even if the first ptr is an int ptr and this is a ZST copy, we should detect dangling 2nd ptrs. +LL | | ptr::copy_nonoverlapping(0x100 as *const i32, dangle, 0); + | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ memory access failed: pointer must be in-bounds at offset 40, but is outside bounds of alloc4 which has size 4 +LL | | +LL | | +LL | | }; + | |__- + | + = note: `#[deny(const_err)]` 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 #71800 + +error: any use of this value will cause an error + --> $DIR/copy-intrinsic.rs:24:5 + | +LL | / const COPY_OOB_2: () = unsafe { +LL | | let x = 0i32; +LL | | let dangle = (&x as *const i32).wrapping_add(10); +LL | | // Even if the second ptr is an int ptr and this is a ZST copy, we should detect dangling 1st ptrs. +LL | | ptr::copy_nonoverlapping(dangle, 0x100 as *mut i32, 0); + | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ memory access failed: pointer must be in-bounds at offset 40, but is outside bounds of alloc6 which has size 4 +LL | | +LL | | +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 #71800 + +error: any use of this value will cause an error + --> $DIR/copy-intrinsic.rs:32:5 + | +LL | / const COPY_SIZE_OVERFLOW: () = unsafe { +LL | | let x = 0; +LL | | let mut y = 0; +LL | | ptr::copy(&x, &mut y, 1usize << (mem::size_of::() * 8 - 1)); + | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ overflow computing total size of `copy` +LL | | +LL | | +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 #71800 + +error: any use of this value will cause an error + --> $DIR/copy-intrinsic.rs:39:5 + | +LL | / const COPY_NONOVERLAPPING_SIZE_OVERFLOW: () = unsafe { +LL | | let x = 0; +LL | | let mut y = 0; +LL | | ptr::copy_nonoverlapping(&x, &mut y, 1usize << (mem::size_of::() * 8 - 1)); + | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ overflow computing total size of `copy_nonoverlapping` +LL | | +LL | | +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 #71800 + +error: aborting due to 4 previous errors + diff --git a/src/test/ui/issues/issue-13837.rs b/src/test/ui/consts/issue-13837.rs similarity index 100% rename from src/test/ui/issues/issue-13837.rs rename to src/test/ui/consts/issue-13837.rs diff --git a/src/test/ui/issues/issue-17718-references.rs b/src/test/ui/consts/issue-17718-references.rs similarity index 100% rename from src/test/ui/issues/issue-17718-references.rs rename to src/test/ui/consts/issue-17718-references.rs diff --git a/src/test/ui/issues/issue-17718-references.stderr b/src/test/ui/consts/issue-17718-references.stderr similarity index 100% rename from src/test/ui/issues/issue-17718-references.stderr rename to src/test/ui/consts/issue-17718-references.stderr diff --git a/src/test/ui/issues/issue-17718.rs b/src/test/ui/consts/issue-17718.rs similarity index 100% rename from src/test/ui/issues/issue-17718.rs rename to src/test/ui/consts/issue-17718.rs diff --git a/src/test/ui/issues/issue-32829.rs b/src/test/ui/consts/issue-32829.rs similarity index 100% rename from src/test/ui/issues/issue-32829.rs rename to src/test/ui/consts/issue-32829.rs diff --git a/src/test/ui/issues/issue-32829.stderr b/src/test/ui/consts/issue-32829.stderr similarity index 100% rename from src/test/ui/issues/issue-32829.stderr rename to src/test/ui/consts/issue-32829.stderr diff --git a/src/test/ui/issues/issue-33537.rs b/src/test/ui/consts/issue-33537.rs similarity index 100% rename from src/test/ui/issues/issue-33537.rs rename to src/test/ui/consts/issue-33537.rs diff --git a/src/test/ui/issues/issue-3521.fixed b/src/test/ui/consts/issue-3521.fixed similarity index 100% rename from src/test/ui/issues/issue-3521.fixed rename to src/test/ui/consts/issue-3521.fixed diff --git a/src/test/ui/issues/issue-3521.rs b/src/test/ui/consts/issue-3521.rs similarity index 100% rename from src/test/ui/issues/issue-3521.rs rename to src/test/ui/consts/issue-3521.rs diff --git a/src/test/ui/issues/issue-3521.stderr b/src/test/ui/consts/issue-3521.stderr similarity index 100% rename from src/test/ui/issues/issue-3521.stderr rename to src/test/ui/consts/issue-3521.stderr diff --git a/src/test/ui/consts/issue-51559.stderr b/src/test/ui/consts/issue-51559.stderr index fbb40c890d..d571eb5496 100644 --- a/src/test/ui/consts/issue-51559.stderr +++ b/src/test/ui/consts/issue-51559.stderr @@ -4,7 +4,7 @@ error: any use of this value will cause an error LL | pub const FOO: usize = unsafe { BAR as usize }; | --------------------------------^^^^^^^^^^^^--- | | - | "pointer-to-integer cast" needs an rfc before being allowed inside constants + | cannot cast pointer to integer because it was not created by cast from integer | = note: `#[deny(const_err)]` 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! diff --git a/src/test/ui/consts/issue-52432.stderr b/src/test/ui/consts/issue-52432.stderr index e9539d2411..2999895055 100644 --- a/src/test/ui/consts/issue-52432.stderr +++ b/src/test/ui/consts/issue-52432.stderr @@ -20,7 +20,7 @@ error[E0080]: evaluation of constant value failed --> $DIR/issue-52432.rs:7:10 | LL | [(); &(static || {}) as *const _ as usize]; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ "pointer-to-integer cast" needs an rfc before being allowed inside constants + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ cannot cast pointer to integer because it was not created by cast from integer error: aborting due to 4 previous errors diff --git a/src/test/ui/consts/issue-66345.rs b/src/test/ui/consts/issue-66345.rs index 7d0de73007..4971d96476 100644 --- a/src/test/ui/consts/issue-66345.rs +++ b/src/test/ui/consts/issue-66345.rs @@ -1,8 +1,8 @@ // run-pass -// compile-flags: -Z mir-opt-level=3 +// compile-flags: -Z mir-opt-level=4 // Checks that the compiler does not ICE when passing references to field of by-value struct -// with -Z mir-opt-level=3 +// with -Z mir-opt-level=4 fn do_nothing(_: &()) {} diff --git a/src/test/ui/consts/issue-66693-panic-in-array-len.rs b/src/test/ui/consts/issue-66693-panic-in-array-len.rs new file mode 100644 index 0000000000..718a19067a --- /dev/null +++ b/src/test/ui/consts/issue-66693-panic-in-array-len.rs @@ -0,0 +1,17 @@ +// This is a separate test from `issue-66693.rs` because array lengths are evaluated +// in a separate stage before `const`s and `statics` and so the error below is hit and +// the compiler exits before generating errors for the others. + +#![feature(const_panic)] + +fn main() { + let _ = [0i32; panic!(2f32)]; + //~^ ERROR: argument to `panic!()` in a const context must have type `&str` + + // ensure that conforming panics are handled correctly + let _ = [false; panic!()]; + //~^ ERROR: evaluation of constant value failed + + // typechecking halts before getting to this one + let _ = ['a', panic!("panic in array len")]; +} diff --git a/src/test/ui/consts/issue-66693-panic-in-array-len.stderr b/src/test/ui/consts/issue-66693-panic-in-array-len.stderr new file mode 100644 index 0000000000..e0ca9dfde0 --- /dev/null +++ b/src/test/ui/consts/issue-66693-panic-in-array-len.stderr @@ -0,0 +1,19 @@ +error: argument to `panic!()` in a const context must have type `&str` + --> $DIR/issue-66693-panic-in-array-len.rs:8:20 + | +LL | let _ = [0i32; panic!(2f32)]; + | ^^^^^^^^^^^^ + | + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0080]: evaluation of constant value failed + --> $DIR/issue-66693-panic-in-array-len.rs:12:21 + | +LL | let _ = [false; panic!()]; + | ^^^^^^^^ the evaluated program panicked at 'explicit panic', $DIR/issue-66693-panic-in-array-len.rs:12:21 + | + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0080`. diff --git a/src/test/ui/consts/issue-66693.rs b/src/test/ui/consts/issue-66693.rs new file mode 100644 index 0000000000..77fe4417d5 --- /dev/null +++ b/src/test/ui/consts/issue-66693.rs @@ -0,0 +1,24 @@ +// Tests that the compiler does not ICE when const-evaluating a `panic!()` invocation with a +// non-`&str` argument. + +#![feature(const_panic)] + +const _: () = panic!(1); +//~^ ERROR: argument to `panic!()` in a const context must have type `&str` + +static _FOO: () = panic!(true); +//~^ ERROR: argument to `panic!()` in a const context must have type `&str` + +const fn _foo() { + panic!(&1); //~ ERROR: argument to `panic!()` in a const context must have type `&str` +} + +// ensure that conforming panics don't cause an error +const _: () = panic!(); +static _BAR: () = panic!("panic in static"); + +const fn _bar() { + panic!("panic in const fn"); +} + +fn main() {} diff --git a/src/test/ui/consts/issue-66693.stderr b/src/test/ui/consts/issue-66693.stderr new file mode 100644 index 0000000000..6bbde057ea --- /dev/null +++ b/src/test/ui/consts/issue-66693.stderr @@ -0,0 +1,26 @@ +error: argument to `panic!()` in a const context must have type `&str` + --> $DIR/issue-66693.rs:13:5 + | +LL | panic!(&1); + | ^^^^^^^^^^^ + | + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error: argument to `panic!()` in a const context must have type `&str` + --> $DIR/issue-66693.rs:6:15 + | +LL | const _: () = panic!(1); + | ^^^^^^^^^ + | + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error: argument to `panic!()` in a const context must have type `&str` + --> $DIR/issue-66693.rs:9:19 + | +LL | static _FOO: () = panic!(true); + | ^^^^^^^^^^^^ + | + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to 3 previous errors + diff --git a/src/test/ui/consts/issue-67529.rs b/src/test/ui/consts/issue-67529.rs index df4bc668be..dd24c2d27e 100644 --- a/src/test/ui/consts/issue-67529.rs +++ b/src/test/ui/consts/issue-67529.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=2 +// compile-flags: -Z mir-opt-level=3 // run-pass struct Baz { diff --git a/src/test/ui/consts/issue-67640.rs b/src/test/ui/consts/issue-67640.rs index bc0ee8d386..4c71a2e022 100644 --- a/src/test/ui/consts/issue-67640.rs +++ b/src/test/ui/consts/issue-67640.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=3 +// compile-flags: -Z mir-opt-level=4 // run-pass struct X { diff --git a/src/test/ui/consts/issue-67641.rs b/src/test/ui/consts/issue-67641.rs index f50fba287a..e5a74f1565 100644 --- a/src/test/ui/consts/issue-67641.rs +++ b/src/test/ui/consts/issue-67641.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=2 +// compile-flags: -Z mir-opt-level=3 // run-pass use std::cell::Cell; diff --git a/src/test/ui/consts/issue-67862.rs b/src/test/ui/consts/issue-67862.rs index 84f72154d2..b9e96a87f1 100644 --- a/src/test/ui/consts/issue-67862.rs +++ b/src/test/ui/consts/issue-67862.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=2 +// compile-flags: -Z mir-opt-level=3 // run-pass fn e220() -> (i64, i64) { diff --git a/src/test/ui/consts/issue-76064.rs b/src/test/ui/consts/issue-76064.rs index 2da764b47c..d511f75df8 100644 --- a/src/test/ui/consts/issue-76064.rs +++ b/src/test/ui/consts/issue-76064.rs @@ -1,3 +1,5 @@ -struct Bug([u8; panic!(1)]); //~ ERROR panicking in constants is unstable +// Note: non-`&str` panic arguments gained a separate error in PR #80734 +// which is why this doesn't match the issue +struct Bug([u8; panic!("panic")]); //~ ERROR panicking in constants is unstable fn main() {} diff --git a/src/test/ui/consts/issue-76064.stderr b/src/test/ui/consts/issue-76064.stderr index f939ff3397..9bda1b7570 100644 --- a/src/test/ui/consts/issue-76064.stderr +++ b/src/test/ui/consts/issue-76064.stderr @@ -1,8 +1,8 @@ error[E0658]: panicking in constants is unstable - --> $DIR/issue-76064.rs:1:17 + --> $DIR/issue-76064.rs:3:17 | -LL | struct Bug([u8; panic!(1)]); - | ^^^^^^^^^ +LL | struct Bug([u8; panic!("panic")]); + | ^^^^^^^^^^^^^^^ | = note: see issue #51999 for more information = help: add `#![feature(const_panic)]` to the crate attributes to enable diff --git a/src/test/ui/consts/issue-79690.stderr b/src/test/ui/consts/issue-79690.stderr index 918dd4c20f..ca56ff2205 100644 --- a/src/test/ui/consts/issue-79690.stderr +++ b/src/test/ui/consts/issue-79690.stderr @@ -2,7 +2,7 @@ error[E0080]: it is undefined behavior to use this value --> $DIR/issue-79690.rs:29:1 | LL | const G: Fat = unsafe { Transmute { t: FOO }.u }; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered read of part of a pointer at .1..size.foo + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ type validation failed: encountered (potentially part of) a pointer at .1..size.foo, but expected plain (non-pointer) bytes | = 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. diff --git a/src/test/ui/consts/miri_unleashed/drop.stderr b/src/test/ui/consts/miri_unleashed/drop.stderr index eb1b42c57b..f79dc454a8 100644 --- a/src/test/ui/consts/miri_unleashed/drop.stderr +++ b/src/test/ui/consts/miri_unleashed/drop.stderr @@ -5,7 +5,7 @@ LL | pub unsafe fn drop_in_place(to_drop: *mut T) { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | | | calling non-const function ` as Drop>::drop` - | inside `drop_in_place::> - shim(Some(Vec))` at $SRC_DIR/core/src/ptr/mod.rs:LL:COL + | inside `std::ptr::drop_in_place::> - shim(Some(Vec))` at $SRC_DIR/core/src/ptr/mod.rs:LL:COL | ::: $DIR/drop.rs:18:1 | diff --git a/src/test/ui/consts/miri_unleashed/ptr_arith.rs b/src/test/ui/consts/miri_unleashed/ptr_arith.rs index 65fc49c0b2..aae6d83720 100644 --- a/src/test/ui/consts/miri_unleashed/ptr_arith.rs +++ b/src/test/ui/consts/miri_unleashed/ptr_arith.rs @@ -15,7 +15,7 @@ static INT_PTR_ARITH: () = unsafe { let x: usize = std::mem::transmute(&0); let _v = x + 0; //~^ ERROR could not evaluate static initializer - //~| NOTE pointer-to-integer cast + //~| NOTE cannot cast pointer to integer }; fn main() {} diff --git a/src/test/ui/consts/miri_unleashed/ptr_arith.stderr b/src/test/ui/consts/miri_unleashed/ptr_arith.stderr index d782a3633b..8ac4aa87f6 100644 --- a/src/test/ui/consts/miri_unleashed/ptr_arith.stderr +++ b/src/test/ui/consts/miri_unleashed/ptr_arith.stderr @@ -8,7 +8,7 @@ error[E0080]: could not evaluate static initializer --> $DIR/ptr_arith.rs:16:14 | LL | let _v = x + 0; - | ^^^^^ "pointer-to-integer cast" needs an rfc before being allowed inside constants + | ^^^^^ cannot cast pointer to integer because it was not created by cast from integer warning: skipping const checks | diff --git a/src/test/ui/consts/miri_unleashed/tls.stderr b/src/test/ui/consts/miri_unleashed/tls.stderr index 5cef636e0a..62e2dc7121 100644 --- a/src/test/ui/consts/miri_unleashed/tls.stderr +++ b/src/test/ui/consts/miri_unleashed/tls.stderr @@ -2,13 +2,13 @@ error[E0080]: could not evaluate static initializer --> $DIR/tls.rs:12:25 | LL | unsafe { let _val = A; } - | ^ cannot access thread local static (DefId(0:4 ~ tls[317d]::A)) + | ^ cannot access thread local static (DefId(0:6 ~ tls[317d]::A)) error[E0080]: could not evaluate static initializer --> $DIR/tls.rs:19:26 | LL | unsafe { let _val = &A; } - | ^ cannot access thread local static (DefId(0:4 ~ tls[317d]::A)) + | ^ cannot access thread local static (DefId(0:6 ~ tls[317d]::A)) warning: skipping const checks | diff --git a/src/test/ui/consts/ptr_comparisons.rs b/src/test/ui/consts/ptr_comparisons.rs index 0570d817fc..0fbe55f972 100644 --- a/src/test/ui/consts/ptr_comparisons.rs +++ b/src/test/ui/consts/ptr_comparisons.rs @@ -71,14 +71,14 @@ const _: *const u8 = const _: usize = unsafe { std::mem::transmute::<*const usize, usize>(FOO) + 4 }; //~^ ERROR any use of this value will cause an error -//~| NOTE "pointer-to-integer cast" needs an rfc +//~| NOTE cannot cast pointer to integer //~| NOTE //~| WARN this was previously accepted by the compiler but is being phased out //~| NOTE const _: usize = unsafe { *std::mem::transmute::<&&usize, &usize>(&FOO) + 4 }; //~^ ERROR any use of this value will cause an error -//~| NOTE "pointer-to-integer cast" needs an rfc +//~| NOTE cannot cast pointer to integer //~| NOTE //~| WARN this was previously accepted by the compiler but is being phased out //~| NOTE diff --git a/src/test/ui/consts/ptr_comparisons.stderr b/src/test/ui/consts/ptr_comparisons.stderr index c6c13e5413..9ec009c55c 100644 --- a/src/test/ui/consts/ptr_comparisons.stderr +++ b/src/test/ui/consts/ptr_comparisons.stderr @@ -36,7 +36,7 @@ error: any use of this value will cause an error LL | const _: usize = unsafe { std::mem::transmute::<*const usize, usize>(FOO) + 4 }; | --------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--- | | - | "pointer-to-integer cast" needs an rfc before being allowed inside constants + | cannot cast pointer to integer because it was not created by cast from integer | = 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 #71800 @@ -47,7 +47,7 @@ error: any use of this value will cause an error LL | const _: usize = unsafe { *std::mem::transmute::<&&usize, &usize>(&FOO) + 4 }; | --------------------------^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^--- | | - | "pointer-to-integer cast" needs an rfc before being allowed inside constants + | cannot cast pointer to integer because it was not created by cast from integer | = 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 #71800 diff --git a/src/test/ui/rvalue-static-promotion.rs b/src/test/ui/consts/rvalue-static-promotion.rs similarity index 100% rename from src/test/ui/rvalue-static-promotion.rs rename to src/test/ui/consts/rvalue-static-promotion.rs diff --git a/src/test/ui/consts/trait_specialization.rs b/src/test/ui/consts/trait_specialization.rs index 3adbbb5304..c581ef6b0f 100644 --- a/src/test/ui/consts/trait_specialization.rs +++ b/src/test/ui/consts/trait_specialization.rs @@ -1,5 +1,5 @@ // ignore-wasm32-bare which doesn't support `std::process:exit()` -// compile-flags: -Zmir-opt-level=2 +// compile-flags: -Zmir-opt-level=3 // run-pass // Tests that specialization does not cause optimizations running on polymorphic MIR to resolve diff --git a/src/test/ui/write-to-static-mut-in-static.rs b/src/test/ui/consts/write-to-static-mut-in-static.rs similarity index 100% rename from src/test/ui/write-to-static-mut-in-static.rs rename to src/test/ui/consts/write-to-static-mut-in-static.rs diff --git a/src/test/ui/write-to-static-mut-in-static.stderr b/src/test/ui/consts/write-to-static-mut-in-static.stderr similarity index 100% rename from src/test/ui/write-to-static-mut-in-static.stderr rename to src/test/ui/consts/write-to-static-mut-in-static.stderr diff --git a/src/test/ui/cycle-projection-based-on-where-clause.rs b/src/test/ui/cycle-projection-based-on-where-clause.rs deleted file mode 100644 index d3609acfdf..0000000000 --- a/src/test/ui/cycle-projection-based-on-where-clause.rs +++ /dev/null @@ -1,24 +0,0 @@ -// Example cycle where a bound on `T` uses a shorthand for `T`. This -// creates a cycle because we have to know the bounds on `T` to figure -// out what trait defines `Item`, but we can't know the bounds on `T` -// without knowing how to handle `T::Item`. -// -// Note that in the future cases like this could perhaps become legal, -// if we got more fine-grained about our cycle detection or changed -// how we handle `T::Item` resolution. - -use std::ops::Add; - -// Preamble. -trait Trait { type Item; } - -struct A - where T : Trait, - T : Add - //~^ ERROR cycle detected -{ - data: T -} - -fn main() { -} diff --git a/src/test/ui/cycle-projection-based-on-where-clause.stderr b/src/test/ui/cycle-projection-based-on-where-clause.stderr deleted file mode 100644 index 2c337cc6bf..0000000000 --- a/src/test/ui/cycle-projection-based-on-where-clause.stderr +++ /dev/null @@ -1,16 +0,0 @@ -error[E0391]: cycle detected when computing the bounds for type parameter `T` - --> $DIR/cycle-projection-based-on-where-clause.rs:17:19 - | -LL | T : Add - | ^^^^^^^ - | - = note: ...which again requires computing the bounds for type parameter `T`, completing the cycle -note: cycle used when computing explicit predicates of `A` - --> $DIR/cycle-projection-based-on-where-clause.rs:17:19 - | -LL | T : Add - | ^^^^^^^ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0391`. diff --git a/src/test/ui/cycle-trait/cycle-trait-supertrait-direct.stderr b/src/test/ui/cycle-trait/cycle-trait-supertrait-direct.stderr index 8aa3ac8abf..ee54b2fd15 100644 --- a/src/test/ui/cycle-trait/cycle-trait-supertrait-direct.stderr +++ b/src/test/ui/cycle-trait/cycle-trait-supertrait-direct.stderr @@ -1,10 +1,15 @@ -error[E0391]: cycle detected when computing the supertraits of `Chromosome` +error[E0391]: cycle detected when computing the super predicates of `Chromosome` + --> $DIR/cycle-trait-supertrait-direct.rs:3:1 + | +LL | trait Chromosome: Chromosome { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: ...which requires computing the super traits of `Chromosome`... --> $DIR/cycle-trait-supertrait-direct.rs:3:19 | LL | trait Chromosome: Chromosome { | ^^^^^^^^^^ - | - = note: ...which again requires computing the supertraits of `Chromosome`, completing the cycle + = note: ...which again requires computing the super predicates of `Chromosome`, completing the cycle note: cycle used when collecting item types in top-level module --> $DIR/cycle-trait-supertrait-direct.rs:3:1 | diff --git a/src/test/ui/cycle-trait/cycle-trait-supertrait-indirect.stderr b/src/test/ui/cycle-trait/cycle-trait-supertrait-indirect.stderr index 9740f43a4b..0a2284e0ef 100644 --- a/src/test/ui/cycle-trait/cycle-trait-supertrait-indirect.stderr +++ b/src/test/ui/cycle-trait/cycle-trait-supertrait-indirect.stderr @@ -1,16 +1,26 @@ -error[E0391]: cycle detected when computing the supertraits of `B` +error[E0391]: cycle detected when computing the super predicates of `B` + --> $DIR/cycle-trait-supertrait-indirect.rs:7:1 + | +LL | trait B: C { + | ^^^^^^^^^^ + | +note: ...which requires computing the super traits of `B`... --> $DIR/cycle-trait-supertrait-indirect.rs:7:10 | LL | trait B: C { | ^ +note: ...which requires computing the super predicates of `C`... + --> $DIR/cycle-trait-supertrait-indirect.rs:11:1 | -note: ...which requires computing the supertraits of `C`... +LL | trait C: B { } + | ^^^^^^^^^^ +note: ...which requires computing the super traits of `C`... --> $DIR/cycle-trait-supertrait-indirect.rs:11:10 | LL | trait C: B { } | ^ - = note: ...which again requires computing the supertraits of `B`, completing the cycle -note: cycle used when computing the supertraits of `A` + = note: ...which again requires computing the super predicates of `B`, completing the cycle +note: cycle used when computing the super traits of `A` --> $DIR/cycle-trait-supertrait-indirect.rs:4:10 | LL | trait A: B { diff --git a/src/test/ui/debuginfo-emit-llvm-ir-and-split-debuginfo.rs b/src/test/ui/debuginfo-emit-llvm-ir-and-split-debuginfo.rs new file mode 100644 index 0000000000..043011b331 --- /dev/null +++ b/src/test/ui/debuginfo-emit-llvm-ir-and-split-debuginfo.rs @@ -0,0 +1,7 @@ +// build-pass +// +// compile-flags: -g --emit=llvm-ir -Zunstable-options -Csplit-debuginfo=unpacked +// +// Make sure that we don't explode with an error if we don't actually end up emitting any `dwo`s, +// as would be the case if we don't actually codegen anything. +#![crate_type="rlib"] diff --git a/src/test/ui/deprecation/deprecation-in-staged-api.rs b/src/test/ui/deprecation/deprecation-in-staged-api.rs index f667de83b5..910bfd1b5e 100644 --- a/src/test/ui/deprecation/deprecation-in-staged-api.rs +++ b/src/test/ui/deprecation/deprecation-in-staged-api.rs @@ -1,8 +1,4 @@ -// #[deprecated] cannot be used in staged API - #![feature(staged_api)] - #![stable(feature = "stable_test_feature", since = "1.0.0")] - -#[deprecated] -fn main() { } //~ ERROR `#[deprecated]` cannot be used in staged API +#[deprecated] //~ ERROR `#[deprecated]` cannot be used in staged API +fn main() {} diff --git a/src/test/ui/deprecation/deprecation-in-staged-api.stderr b/src/test/ui/deprecation/deprecation-in-staged-api.stderr index c6881d5a57..cf977fa4b7 100644 --- a/src/test/ui/deprecation/deprecation-in-staged-api.stderr +++ b/src/test/ui/deprecation/deprecation-in-staged-api.stderr @@ -1,8 +1,10 @@ -error: `#[deprecated]` cannot be used in staged API; use `#[rustc_deprecated]` instead - --> $DIR/deprecation-in-staged-api.rs:8:1 +error: `#[deprecated]` cannot be used in staged API + --> $DIR/deprecation-in-staged-api.rs:3:1 | -LL | fn main() { } - | ^^^^^^^^^^^^^ +LL | #[deprecated] + | ^^^^^^^^^^^^^ use `#[rustc_deprecated]` instead +LL | fn main() {} + | ------------ error: aborting due to previous error diff --git a/src/test/ui/derives/derive-deadlock.rs b/src/test/ui/derives/derive-deadlock.rs new file mode 100644 index 0000000000..0137b1e5bf --- /dev/null +++ b/src/test/ui/derives/derive-deadlock.rs @@ -0,0 +1,6 @@ +use std as derive; + +#[derive(Default)] //~ ERROR cannot determine resolution for the attribute macro `derive` +struct S; + +fn main() {} diff --git a/src/test/ui/derives/derive-deadlock.stderr b/src/test/ui/derives/derive-deadlock.stderr new file mode 100644 index 0000000000..8d062491c6 --- /dev/null +++ b/src/test/ui/derives/derive-deadlock.stderr @@ -0,0 +1,10 @@ +error: cannot determine resolution for the attribute macro `derive` + --> $DIR/derive-deadlock.rs:3:3 + | +LL | #[derive(Default)] + | ^^^^^^ + | + = note: import resolution is stuck, try simplifying macro imports + +error: aborting due to previous error + diff --git a/src/test/ui/derives/derive-multiple-with-packed.rs b/src/test/ui/derives/derive-multiple-with-packed.rs new file mode 100644 index 0000000000..e762ee357c --- /dev/null +++ b/src/test/ui/derives/derive-multiple-with-packed.rs @@ -0,0 +1,10 @@ +// check-pass + +#[derive(Clone, Copy)] +#[derive(Debug)] // OK, even if `Copy` is in the different `#[derive]` +#[repr(packed)] +struct CacheRecordHeader { + field: u64, +} + +fn main() {} diff --git a/src/test/ui/derives/derive-partial-ord.rs b/src/test/ui/derives/derive-partial-ord.rs new file mode 100644 index 0000000000..9078a7ffa4 --- /dev/null +++ b/src/test/ui/derives/derive-partial-ord.rs @@ -0,0 +1,60 @@ +// Checks that in a derived implementation of PartialOrd the lt, le, ge, gt methods are consistent +// with partial_cmp. Also verifies that implementation is consistent with that for tuples. +// +// run-pass + +#[derive(PartialEq, PartialOrd)] +struct P(f64, f64); + +fn main() { + let values: &[f64] = &[1.0, 2.0, f64::NAN]; + for a in values { + for b in values { + for c in values { + for d in values { + // Check impl for a tuple. + check(&(*a, *b), &(*c, *d)); + + // Check derived impl. + check(&P(*a, *b), &P(*c, *d)); + + // Check that impls agree with each other. + assert_eq!( + PartialOrd::partial_cmp(&(*a, *b), &(*c, *d)), + PartialOrd::partial_cmp(&P(*a, *b), &P(*c, *d)), + ); + } + } + } + } +} + +fn check(a: &T, b: &T) { + use std::cmp::Ordering::*; + match PartialOrd::partial_cmp(a, b) { + None => { + assert!(!(a < b)); + assert!(!(a <= b)); + assert!(!(a > b)); + assert!(!(a >= b)); + } + Some(Equal) => { + assert!(!(a < b)); + assert!(a <= b); + assert!(!(a > b)); + assert!(a >= b); + } + Some(Less) => { + assert!(a < b); + assert!(a <= b); + assert!(!(a > b)); + assert!(!(a >= b)); + } + Some(Greater) => { + assert!(!(a < b)); + assert!(!(a <= b)); + assert!(a > b); + assert!(a >= b); + } + } +} diff --git a/src/test/ui/derives/derive-renamed.rs b/src/test/ui/derives/derive-renamed.rs new file mode 100644 index 0000000000..d310e5806c --- /dev/null +++ b/src/test/ui/derives/derive-renamed.rs @@ -0,0 +1,11 @@ +// check-pass +// edition:2018 + +use derive as my_derive; + +#[my_derive(Debug)] +struct S; + +fn main() { + println!("{:?}", S); // OK +} 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 4e7a8d71a1..a769c13765 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 @@ -7,10 +7,6 @@ struct Error; enum Enum { A { 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 0736e71460..9f2f47add1 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 @@ -8,46 +8,6 @@ LL | x: Error = note: required by `std::cmp::PartialOrd::partial_cmp` = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-enum-struct-variant.rs:9:6 - | -LL | x: Error - | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-enum-struct-variant.rs:9:6 - | -LL | x: Error - | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-enum-struct-variant.rs:9:6 - | -LL | x: Error - | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-enum-struct-variant.rs:9:6 - | -LL | x: Error - | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error: aborting due to 5 previous errors +error: aborting due to previous error 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 d0a6c5ab52..4f0d794e42 100644 --- a/src/test/ui/derives/derives-span-PartialOrd-enum.rs +++ b/src/test/ui/derives/derives-span-PartialOrd-enum.rs @@ -7,10 +7,6 @@ struct Error; enum Enum { A( 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 d88321b979..25073c5718 100644 --- a/src/test/ui/derives/derives-span-PartialOrd-enum.stderr +++ b/src/test/ui/derives/derives-span-PartialOrd-enum.stderr @@ -8,46 +8,6 @@ LL | Error = note: required by `std::cmp::PartialOrd::partial_cmp` = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-enum.rs:9:6 - | -LL | Error - | ^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-enum.rs:9:6 - | -LL | Error - | ^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-enum.rs:9:6 - | -LL | Error - | ^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-enum.rs:9:6 - | -LL | Error - | ^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error: aborting due to 5 previous errors +error: aborting due to previous error 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 a596a2e329..da857c6743 100644 --- a/src/test/ui/derives/derives-span-PartialOrd-struct.rs +++ b/src/test/ui/derives/derives-span-PartialOrd-struct.rs @@ -6,10 +6,6 @@ struct Error; #[derive(PartialOrd,PartialEq)] struct Struct { 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 3023517752..b514dd9993 100644 --- a/src/test/ui/derives/derives-span-PartialOrd-struct.stderr +++ b/src/test/ui/derives/derives-span-PartialOrd-struct.stderr @@ -8,46 +8,6 @@ LL | x: Error = note: required by `std::cmp::PartialOrd::partial_cmp` = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-struct.rs:8:5 - | -LL | x: Error - | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-struct.rs:8:5 - | -LL | x: Error - | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-struct.rs:8:5 - | -LL | x: Error - | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-struct.rs:8:5 - | -LL | x: Error - | ^^^^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error: aborting due to 5 previous errors +error: aborting due to previous error 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 6dd1623471..61d5076708 100644 --- a/src/test/ui/derives/derives-span-PartialOrd-tuple-struct.rs +++ b/src/test/ui/derives/derives-span-PartialOrd-tuple-struct.rs @@ -6,10 +6,6 @@ struct Error; #[derive(PartialOrd,PartialEq)] struct Struct( 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 3abf1ded8d..c098f6bfb3 100644 --- a/src/test/ui/derives/derives-span-PartialOrd-tuple-struct.stderr +++ b/src/test/ui/derives/derives-span-PartialOrd-tuple-struct.stderr @@ -8,46 +8,6 @@ LL | Error = note: required by `std::cmp::PartialOrd::partial_cmp` = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-tuple-struct.rs:8:5 - | -LL | Error - | ^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-tuple-struct.rs:8:5 - | -LL | Error - | ^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-tuple-struct.rs:8:5 - | -LL | Error - | ^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `Error` with `Error` - --> $DIR/derives-span-PartialOrd-tuple-struct.rs:8:5 - | -LL | Error - | ^^^^^ no implementation for `Error < Error` and `Error > Error` - | - = help: the trait `PartialOrd` is not implemented for `Error` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error: aborting due to 5 previous errors +error: aborting due to previous error For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/derives/deriving-meta-empty-trait-list.rs b/src/test/ui/derives/deriving-meta-empty-trait-list.rs index 4f2e31e8ef..0306ce717d 100644 --- a/src/test/ui/derives/deriving-meta-empty-trait-list.rs +++ b/src/test/ui/derives/deriving-meta-empty-trait-list.rs @@ -1,6 +1,8 @@ +// check-pass + #![deny(unused)] -#[derive()] //~ ERROR unused attribute +#[derive()] // OK struct _Bar; pub fn main() {} diff --git a/src/test/ui/derives/deriving-meta-empty-trait-list.stderr b/src/test/ui/derives/deriving-meta-empty-trait-list.stderr deleted file mode 100644 index 1fd7d58c86..0000000000 --- a/src/test/ui/derives/deriving-meta-empty-trait-list.stderr +++ /dev/null @@ -1,15 +0,0 @@ -error: unused attribute - --> $DIR/deriving-meta-empty-trait-list.rs:3:1 - | -LL | #[derive()] - | ^^^^^^^^^^^ - | -note: the lint level is defined here - --> $DIR/deriving-meta-empty-trait-list.rs:1:9 - | -LL | #![deny(unused)] - | ^^^^^^ - = note: `#[deny(unused_attributes)]` implied by `#[deny(unused)]` - -error: aborting due to previous error - diff --git a/src/test/ui/derives/issue-36617.rs b/src/test/ui/derives/issue-36617.rs index 1102f3c464..08fc82e91f 100644 --- a/src/test/ui/derives/issue-36617.rs +++ b/src/test/ui/derives/issue-36617.rs @@ -1,4 +1,3 @@ -#![derive(Copy)] //~ ERROR `derive` may only be applied to structs, enums and unions - //~| ERROR cannot determine resolution for the derive macro `Copy` +#![derive(Copy)] //~ ERROR cannot determine resolution for the attribute macro `derive` fn main() {} diff --git a/src/test/ui/derives/issue-36617.stderr b/src/test/ui/derives/issue-36617.stderr index dc6ef16925..0716764b42 100644 --- a/src/test/ui/derives/issue-36617.stderr +++ b/src/test/ui/derives/issue-36617.stderr @@ -1,17 +1,10 @@ -error[E0774]: `derive` may only be applied to structs, enums and unions - --> $DIR/issue-36617.rs:1:1 +error: cannot determine resolution for the attribute macro `derive` + --> $DIR/issue-36617.rs:1:4 | LL | #![derive(Copy)] - | ^^^^^^^^^^^^^^^^ help: try an outer attribute: `#[derive(Copy)]` - -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 2 previous errors +error: aborting due to previous error -For more information about this error, try `rustc --explain E0774`. diff --git a/src/test/ui/dest-prop/skeptic-miscompile.rs b/src/test/ui/dest-prop/skeptic-miscompile.rs index c27a1f0453..4bb61dbc7f 100644 --- a/src/test/ui/dest-prop/skeptic-miscompile.rs +++ b/src/test/ui/dest-prop/skeptic-miscompile.rs @@ -1,6 +1,6 @@ // run-pass -// compile-flags: -Zmir-opt-level=2 +// compile-flags: -Zmir-opt-level=3 trait IterExt: Iterator { fn fold_ex(mut self, init: B, mut f: F) -> B diff --git a/src/test/ui/did_you_mean/pub-macro-rules.rs b/src/test/ui/did_you_mean/pub-macro-rules.rs deleted file mode 100644 index c5393703f7..0000000000 --- a/src/test/ui/did_you_mean/pub-macro-rules.rs +++ /dev/null @@ -1,16 +0,0 @@ -#[macro_use] mod bleh { - pub macro_rules! foo { //~ ERROR can't qualify macro_rules invocation - ($n:ident) => ( - fn $n () -> i32 { - 1 - } - ) - } - -} - -foo!(meh); - -fn main() { - println!("{}", meh()); -} diff --git a/src/test/ui/did_you_mean/pub-macro-rules.stderr b/src/test/ui/did_you_mean/pub-macro-rules.stderr deleted file mode 100644 index 0bde5783b8..0000000000 --- a/src/test/ui/did_you_mean/pub-macro-rules.stderr +++ /dev/null @@ -1,8 +0,0 @@ -error: can't qualify macro_rules invocation with `pub` - --> $DIR/pub-macro-rules.rs:2:5 - | -LL | pub macro_rules! foo { - | ^^^ help: try exporting the macro: `#[macro_export]` - -error: aborting due to previous error - diff --git a/src/test/ui/directory_ownership/macro-expanded-mod.rs b/src/test/ui/directory_ownership/macro-expanded-mod.rs index 9cb159603a..fa81769e5a 100644 --- a/src/test/ui/directory_ownership/macro-expanded-mod.rs +++ b/src/test/ui/directory_ownership/macro-expanded-mod.rs @@ -2,7 +2,7 @@ macro_rules! mod_decl { ($i:ident) => { - mod $i; //~ ERROR Cannot declare a non-inline module inside a block + mod $i; //~ ERROR cannot declare a non-inline module inside a block }; } diff --git a/src/test/ui/directory_ownership/macro-expanded-mod.stderr b/src/test/ui/directory_ownership/macro-expanded-mod.stderr index f90419247c..4039728e18 100644 --- a/src/test/ui/directory_ownership/macro-expanded-mod.stderr +++ b/src/test/ui/directory_ownership/macro-expanded-mod.stderr @@ -1,4 +1,4 @@ -error: Cannot declare a non-inline module inside a block unless it has a path attribute +error: cannot declare a non-inline module inside a block unless it has a path attribute --> $DIR/macro-expanded-mod.rs:5:9 | LL | mod $i; diff --git a/src/test/ui/directory_ownership/non-inline-mod-restriction.rs b/src/test/ui/directory_ownership/non-inline-mod-restriction.rs index af31b8a492..de4f816656 100644 --- a/src/test/ui/directory_ownership/non-inline-mod-restriction.rs +++ b/src/test/ui/directory_ownership/non-inline-mod-restriction.rs @@ -1,5 +1,5 @@ // Test that non-inline modules are not allowed inside blocks. fn main() { - mod foo; //~ ERROR Cannot declare a non-inline module inside a block + mod foo; //~ ERROR cannot declare a non-inline module inside a block } diff --git a/src/test/ui/directory_ownership/non-inline-mod-restriction.stderr b/src/test/ui/directory_ownership/non-inline-mod-restriction.stderr index d034942ca5..64189bee43 100644 --- a/src/test/ui/directory_ownership/non-inline-mod-restriction.stderr +++ b/src/test/ui/directory_ownership/non-inline-mod-restriction.stderr @@ -1,4 +1,4 @@ -error: Cannot declare a non-inline module inside a block unless it has a path attribute +error: cannot declare a non-inline module inside a block unless it has a path attribute --> $DIR/non-inline-mod-restriction.rs:4:5 | LL | mod foo; diff --git a/src/test/ui/editions-crate-root-2015.rs b/src/test/ui/editions-crate-root-2015.rs new file mode 100644 index 0000000000..4c890e3ae6 --- /dev/null +++ b/src/test/ui/editions-crate-root-2015.rs @@ -0,0 +1,21 @@ +// edition:2015 + +mod inner { + fn global_inner(_: ::nonexistant::Foo) { + //~^ ERROR failed to resolve: maybe a missing crate `nonexistant`? + } + fn crate_inner(_: crate::nonexistant::Foo) { + //~^ ERROR failed to resolve: maybe a missing crate `nonexistant`? + } + + fn bare_global(_: ::nonexistant) { + //~^ ERROR cannot find type `nonexistant` in the crate root + } + fn bare_crate(_: crate::nonexistant) { + //~^ ERROR cannot find type `nonexistant` in the crate root + } +} + +fn main() { + +} diff --git a/src/test/ui/editions-crate-root-2015.stderr b/src/test/ui/editions-crate-root-2015.stderr new file mode 100644 index 0000000000..f8d65fec3d --- /dev/null +++ b/src/test/ui/editions-crate-root-2015.stderr @@ -0,0 +1,28 @@ +error[E0433]: failed to resolve: maybe a missing crate `nonexistant`? + --> $DIR/editions-crate-root-2015.rs:4:26 + | +LL | fn global_inner(_: ::nonexistant::Foo) { + | ^^^^^^^^^^^ maybe a missing crate `nonexistant`? + +error[E0433]: failed to resolve: maybe a missing crate `nonexistant`? + --> $DIR/editions-crate-root-2015.rs:7:30 + | +LL | fn crate_inner(_: crate::nonexistant::Foo) { + | ^^^^^^^^^^^ maybe a missing crate `nonexistant`? + +error[E0412]: cannot find type `nonexistant` in the crate root + --> $DIR/editions-crate-root-2015.rs:11:25 + | +LL | fn bare_global(_: ::nonexistant) { + | ^^^^^^^^^^^ not found in the crate root + +error[E0412]: cannot find type `nonexistant` in the crate root + --> $DIR/editions-crate-root-2015.rs:14:29 + | +LL | fn bare_crate(_: crate::nonexistant) { + | ^^^^^^^^^^^ not found in the crate root + +error: aborting due to 4 previous errors + +Some errors have detailed explanations: E0412, E0433. +For more information about an error, try `rustc --explain E0412`. diff --git a/src/test/ui/editions-crate-root-2018.rs b/src/test/ui/editions-crate-root-2018.rs new file mode 100644 index 0000000000..61e4329bbb --- /dev/null +++ b/src/test/ui/editions-crate-root-2018.rs @@ -0,0 +1,21 @@ +// edition:2018 + +mod inner { + fn global_inner(_: ::nonexistant::Foo) { + //~^ ERROR failed to resolve: could not find `nonexistant` in the list of imported crates + } + fn crate_inner(_: crate::nonexistant::Foo) { + //~^ ERROR failed to resolve: could not find `nonexistant` in the crate root + } + + fn bare_global(_: ::nonexistant) { + //~^ ERROR cannot find crate `nonexistant` in the list of imported crates + } + fn bare_crate(_: crate::nonexistant) { + //~^ ERROR cannot find type `nonexistant` in the crate root + } +} + +fn main() { + +} diff --git a/src/test/ui/editions-crate-root-2018.stderr b/src/test/ui/editions-crate-root-2018.stderr new file mode 100644 index 0000000000..967a5a2fca --- /dev/null +++ b/src/test/ui/editions-crate-root-2018.stderr @@ -0,0 +1,28 @@ +error[E0433]: failed to resolve: could not find `nonexistant` in the list of imported crates + --> $DIR/editions-crate-root-2018.rs:4:26 + | +LL | fn global_inner(_: ::nonexistant::Foo) { + | ^^^^^^^^^^^ could not find `nonexistant` in the list of imported crates + +error[E0433]: failed to resolve: could not find `nonexistant` in the crate root + --> $DIR/editions-crate-root-2018.rs:7:30 + | +LL | fn crate_inner(_: crate::nonexistant::Foo) { + | ^^^^^^^^^^^ could not find `nonexistant` in the crate root + +error[E0412]: cannot find crate `nonexistant` in the list of imported crates + --> $DIR/editions-crate-root-2018.rs:11:25 + | +LL | fn bare_global(_: ::nonexistant) { + | ^^^^^^^^^^^ not found in the list of imported crates + +error[E0412]: cannot find type `nonexistant` in the crate root + --> $DIR/editions-crate-root-2018.rs:14:29 + | +LL | fn bare_crate(_: crate::nonexistant) { + | ^^^^^^^^^^^ not found in the crate root + +error: aborting due to 4 previous errors + +Some errors have detailed explanations: E0412, E0433. +For more information about an error, try `rustc --explain E0412`. diff --git a/src/test/ui/editions/edition-imports-virtual-2015-gated.stderr b/src/test/ui/editions/edition-imports-virtual-2015-gated.stderr index 06605c6f20..1cde0f7214 100644 --- a/src/test/ui/editions/edition-imports-virtual-2015-gated.stderr +++ b/src/test/ui/editions/edition-imports-virtual-2015-gated.stderr @@ -2,7 +2,7 @@ error[E0432]: unresolved import `E` --> $DIR/edition-imports-virtual-2015-gated.rs:8:5 | LL | gen_gated!(); - | ^^^^^^^^^^^^^ could not find `E` in crate root + | ^^^^^^^^^^^^^ could not find `E` in the list of imported crates | = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/src/test/ui/emit-artifact-notifications.nll.stderr b/src/test/ui/emit-artifact-notifications.nll.stderr deleted file mode 100644 index 5547631a4b..0000000000 --- a/src/test/ui/emit-artifact-notifications.nll.stderr +++ /dev/null @@ -1 +0,0 @@ -{"artifact":"$TEST_BUILD_DIR/emit-artifact-notifications.nll/libemit_artifact_notifications.rmeta","emit":"metadata"} diff --git a/src/test/ui/emit-artifact-notifications.polonius.stderr b/src/test/ui/emit-artifact-notifications.polonius.stderr deleted file mode 100644 index 47b48b399c..0000000000 --- a/src/test/ui/emit-artifact-notifications.polonius.stderr +++ /dev/null @@ -1 +0,0 @@ -{"artifact":"$TEST_BUILD_DIR/emit-artifact-notifications.polonius/libemit_artifact_notifications.rmeta","emit":"metadata"} diff --git a/src/test/ui/emit-artifact-notifications.stderr b/src/test/ui/emit-artifact-notifications.stderr deleted file mode 100644 index 260d41b8f1..0000000000 --- a/src/test/ui/emit-artifact-notifications.stderr +++ /dev/null @@ -1 +0,0 @@ -{"artifact":"$TEST_BUILD_DIR/emit-artifact-notifications/libemit_artifact_notifications.rmeta","emit":"metadata"} diff --git a/src/test/ui/enum/enum-discrim-too-small2.stderr b/src/test/ui/enum/enum-discrim-too-small2.stderr index fadf6ab86b..4383067953 100644 --- a/src/test/ui/enum/enum-discrim-too-small2.stderr +++ b/src/test/ui/enum/enum-discrim-too-small2.stderr @@ -10,6 +10,7 @@ note: the lint level is defined here LL | #![deny(overflowing_literals)] | ^^^^^^^^^^^^^^^^^^^^ = note: the literal `223` does not fit into the type `i8` whose range is `-128..=127` + = help: consider using the type `u8` instead error: literal out of range for `i16` --> $DIR/enum-discrim-too-small2.rs:15:12 @@ -18,6 +19,7 @@ LL | Ci16 = 55555, | ^^^^^ | = note: the literal `55555` does not fit into the type `i16` whose range is `-32768..=32767` + = help: consider using the type `u16` instead error: literal out of range for `i32` --> $DIR/enum-discrim-too-small2.rs:22:12 @@ -26,6 +28,7 @@ LL | Ci32 = 3_000_000_000, | ^^^^^^^^^^^^^ | = note: the literal `3_000_000_000` does not fit into the type `i32` whose range is `-2147483648..=2147483647` + = help: consider using the type `u32` instead error: literal out of range for `i64` --> $DIR/enum-discrim-too-small2.rs:29:12 @@ -34,6 +37,7 @@ LL | Ci64 = 9223372036854775809, | ^^^^^^^^^^^^^^^^^^^ | = note: the literal `9223372036854775809` does not fit into the type `i64` whose range is `-9223372036854775808..=9223372036854775807` + = help: consider using the type `u64` instead error: aborting due to 4 previous errors diff --git a/src/test/ui/error-codes/E0063.rs b/src/test/ui/error-codes/E0063.rs index 37fc0a2987..58527cc0c5 100644 --- a/src/test/ui/error-codes/E0063.rs +++ b/src/test/ui/error-codes/E0063.rs @@ -32,7 +32,7 @@ fn main() { let w = SingleFoo { }; //~^ ERROR missing field `x` in initializer of `SingleFoo` let x = PluralFoo {x: 1}; - //~^ ERROR missing fields `y`, `z` in initializer of `PluralFoo` + //~^ ERROR missing fields `y` and `z` in initializer of `PluralFoo` let y = TruncatedFoo{x:1}; //~^ missing fields `a`, `b`, `y` and 1 other field in initializer of `TruncatedFoo` let z = TruncatedPluralFoo{x:1}; diff --git a/src/test/ui/error-codes/E0063.stderr b/src/test/ui/error-codes/E0063.stderr index 5d366e0c1c..5dc4927071 100644 --- a/src/test/ui/error-codes/E0063.stderr +++ b/src/test/ui/error-codes/E0063.stderr @@ -4,11 +4,11 @@ error[E0063]: missing field `x` in initializer of `SingleFoo` LL | let w = SingleFoo { }; | ^^^^^^^^^ missing `x` -error[E0063]: missing fields `y`, `z` in initializer of `PluralFoo` +error[E0063]: missing fields `y` and `z` in initializer of `PluralFoo` --> $DIR/E0063.rs:34:13 | LL | let x = PluralFoo {x: 1}; - | ^^^^^^^^^ missing `y`, `z` + | ^^^^^^^^^ missing `y` and `z` error[E0063]: missing fields `a`, `b`, `y` and 1 other field in initializer of `TruncatedFoo` --> $DIR/E0063.rs:36:13 diff --git a/src/test/ui/error-codes/E0618.stderr b/src/test/ui/error-codes/E0618.stderr index 6ddda3bf8b..714c8d1e4d 100644 --- a/src/test/ui/error-codes/E0618.stderr +++ b/src/test/ui/error-codes/E0618.stderr @@ -18,7 +18,7 @@ error[E0618]: expected function, found `i32` --> $DIR/E0618.rs:9:5 | LL | let x = 0i32; - | - `i32` defined here + | - `x` has type `i32` LL | x(); | ^-- | | diff --git a/src/test/ui/expr-if-panic.rs b/src/test/ui/expr/if/expr-if-panic-pass.rs similarity index 100% rename from src/test/ui/expr-if-panic.rs rename to src/test/ui/expr/if/expr-if-panic-pass.rs diff --git a/src/test/ui/expr/if/if-let.rs b/src/test/ui/expr/if/if-let.rs index 2ab0f9fed3..7208e388a1 100644 --- a/src/test/ui/expr/if/if-let.rs +++ b/src/test/ui/expr/if/if-let.rs @@ -4,8 +4,8 @@ fn macros() { macro_rules! foo{ ($p:pat, $e:expr, $b:block) => {{ if let $p = $e $b - //~^ WARN irrefutable if-let - //~| WARN irrefutable if-let + //~^ WARN irrefutable `if let` + //~| WARN irrefutable `if let` }} } macro_rules! bar{ @@ -23,27 +23,27 @@ fn macros() { } pub fn main() { - if let a = 1 { //~ WARN irrefutable if-let + if let a = 1 { //~ WARN irrefutable `if let` println!("irrefutable pattern"); } - if let a = 1 { //~ WARN irrefutable if-let + if let a = 1 { //~ WARN irrefutable `if let` println!("irrefutable pattern"); } else if true { - println!("else-if in irrefutable if-let"); + println!("else-if in irrefutable `if let`"); } else { - println!("else in irrefutable if-let"); + println!("else in irrefutable `if let`"); } if let 1 = 2 { println!("refutable pattern"); - } else if let a = 1 { //~ WARN irrefutable if-let + } else if let a = 1 { //~ WARN irrefutable `if let` println!("irrefutable pattern"); } if true { println!("if"); - } else if let a = 1 { //~ WARN irrefutable if-let + } else if let a = 1 { //~ WARN irrefutable `if let` println!("irrefutable pattern"); } } diff --git a/src/test/ui/expr/if/if-let.stderr b/src/test/ui/expr/if/if-let.stderr index ee2b78af3b..c64c9093ee 100644 --- a/src/test/ui/expr/if/if-let.stderr +++ b/src/test/ui/expr/if/if-let.stderr @@ -1,4 +1,4 @@ -warning: irrefutable if-let pattern +warning: irrefutable `if let` pattern --> $DIR/if-let.rs:6:13 | LL | if let $p = $e $b @@ -10,9 +10,11 @@ LL | | }); | |_______- in this macro invocation | = note: `#[warn(irrefutable_let_patterns)]` on by default + = note: this pattern will always match, so the `if let` is useless + = help: consider replacing the `if let` with a `let` = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) -warning: irrefutable if-let pattern +warning: irrefutable `if let` pattern --> $DIR/if-let.rs:6:13 | LL | if let $p = $e $b @@ -23,29 +25,37 @@ LL | | println!("irrefutable pattern"); LL | | }); | |_______- in this macro invocation | + = note: this pattern will always match, so the `if let` is useless + = help: consider replacing the `if let` with a `let` = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) -warning: irrefutable if-let pattern +warning: irrefutable `if let` pattern --> $DIR/if-let.rs:26:5 | LL | / if let a = 1 { LL | | println!("irrefutable pattern"); LL | | } | |_____^ + | + = note: this pattern will always match, so the `if let` is useless + = help: consider replacing the `if let` with a `let` -warning: irrefutable if-let pattern +warning: irrefutable `if let` pattern --> $DIR/if-let.rs:30:5 | LL | / if let a = 1 { LL | | println!("irrefutable pattern"); LL | | } else if true { -LL | | println!("else-if in irrefutable if-let"); +LL | | println!("else-if in irrefutable `if let`"); LL | | } else { -LL | | println!("else in irrefutable if-let"); +LL | | println!("else in irrefutable `if let`"); LL | | } | |_____^ + | + = note: this pattern will always match, so the `if let` is useless + = help: consider replacing the `if let` with a `let` -warning: irrefutable if-let pattern +warning: irrefutable `if let` pattern --> $DIR/if-let.rs:40:12 | LL | } else if let a = 1 { @@ -53,8 +63,11 @@ LL | } else if let a = 1 { LL | | println!("irrefutable pattern"); LL | | } | |_____^ + | + = note: this pattern will always match, so the `if let` is useless + = help: consider replacing the `if let` with a `let` -warning: irrefutable if-let pattern +warning: irrefutable `if let` pattern --> $DIR/if-let.rs:46:12 | LL | } else if let a = 1 { @@ -62,6 +75,9 @@ LL | } else if let a = 1 { LL | | println!("irrefutable pattern"); LL | | } | |_____^ + | + = note: this pattern will always match, so the `if let` is useless + = help: consider replacing the `if let` with a `let` warning: 6 warnings emitted diff --git a/src/test/ui/issues/issue-4201.rs b/src/test/ui/expr/if/issue-4201.rs similarity index 100% rename from src/test/ui/issues/issue-4201.rs rename to src/test/ui/expr/if/issue-4201.rs diff --git a/src/test/ui/issues/issue-4201.stderr b/src/test/ui/expr/if/issue-4201.stderr similarity index 100% rename from src/test/ui/issues/issue-4201.stderr rename to src/test/ui/expr/if/issue-4201.stderr diff --git a/src/test/ui/feature-gates/feature-gate-exhaustive-patterns.stderr b/src/test/ui/feature-gates/feature-gate-exhaustive-patterns.stderr index 0554759523..e079c2ddce 100644 --- a/src/test/ui/feature-gates/feature-gate-exhaustive-patterns.stderr +++ b/src/test/ui/feature-gates/feature-gate-exhaustive-patterns.stderr @@ -11,7 +11,7 @@ LL | Err(#[stable(feature = "rust1", since = "1.0.0")] E), | = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html - = note: the matched value is of type `std::result::Result` + = note: the matched value is of type `Result` help: you might want to use `if let` to ignore the variant that isn't matched | LL | if let Ok(_x) = foo() { /* */ } diff --git a/src/test/ui/feature-gates/feature-gate-inherent_associated_types.rs b/src/test/ui/feature-gates/feature-gate-inherent_associated_types.rs new file mode 100644 index 0000000000..fc7c6dbc02 --- /dev/null +++ b/src/test/ui/feature-gates/feature-gate-inherent_associated_types.rs @@ -0,0 +1,10 @@ +// Test that inherent associated types cannot be used when inherent_associated_types +// feature gate is not used. + +struct Foo; + +impl Foo { + type Bar = isize; //~ERROR inherent associated types are unstable +} + +fn main() {} diff --git a/src/test/ui/feature-gates/feature-gate-inherent_associated_types.stderr b/src/test/ui/feature-gates/feature-gate-inherent_associated_types.stderr new file mode 100644 index 0000000000..76e65d239f --- /dev/null +++ b/src/test/ui/feature-gates/feature-gate-inherent_associated_types.stderr @@ -0,0 +1,12 @@ +error[E0658]: inherent associated types are unstable + --> $DIR/feature-gate-inherent_associated_types.rs:7:5 + | +LL | type Bar = isize; + | ^^^^^^^^^^^^^^^^^ + | + = note: see issue #8995 for more information + = help: add `#![feature(inherent_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/feature-gates/feature-gate-min_type_alias_impl_trait.rs b/src/test/ui/feature-gates/feature-gate-min_type_alias_impl_trait.rs new file mode 100644 index 0000000000..ffe297a5a6 --- /dev/null +++ b/src/test/ui/feature-gates/feature-gate-min_type_alias_impl_trait.rs @@ -0,0 +1,50 @@ +// ignore-compare-mode-chalk +use std::fmt::Debug; + +type Foo = impl Debug; //~ ERROR `impl Trait` in type aliases is unstable + +trait Bar { + type Baa: Debug; + fn define() -> Self::Baa; +} + +impl Bar for () { + type Baa = impl Debug; //~ ERROR `impl Trait` in type aliases is unstable + fn define() -> Self::Baa { + 0 + } +} + +fn define() -> Foo { + 0 +} + +trait TraitWithDefault { + type Assoc = impl Debug; + //~^ ERROR associated type defaults are unstable + //~| ERROR `impl Trait` not allowed outside of function + //~| ERROR `impl Trait` in type aliases is unstable +} + +type NestedFree = (Vec, impl Debug, impl Iterator); +//~^ ERROR `impl Trait` in type aliases is unstable +//~| ERROR `impl Trait` in type aliases is unstable +//~| ERROR `impl Trait` in type aliases is unstable +//~| ERROR `impl Trait` in type aliases is unstable + +fn define_multiple() -> NestedFree { + (vec![true], 0u8, 0i32..1) +} + +impl Bar for u8 { + type Baa = (Vec, impl Debug, impl Iterator + Debug); + //~^ ERROR `impl Trait` in type aliases is unstable + //~| ERROR `impl Trait` in type aliases is unstable + //~| ERROR `impl Trait` in type aliases is unstable + //~| ERROR `impl Trait` in type aliases is unstable + fn define() -> Self::Baa { + (vec![true], 0u8, 0i32..1) + } +} + +fn main() {} diff --git a/src/test/ui/feature-gates/feature-gate-min_type_alias_impl_trait.stderr b/src/test/ui/feature-gates/feature-gate-min_type_alias_impl_trait.stderr new file mode 100644 index 0000000000..b82867c670 --- /dev/null +++ b/src/test/ui/feature-gates/feature-gate-min_type_alias_impl_trait.stderr @@ -0,0 +1,118 @@ +error[E0658]: `impl Trait` in type aliases is unstable + --> $DIR/feature-gate-min_type_alias_impl_trait.rs:4:12 + | +LL | type Foo = impl Debug; + | ^^^^^^^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable + +error[E0658]: `impl Trait` in type aliases is unstable + --> $DIR/feature-gate-min_type_alias_impl_trait.rs:12:16 + | +LL | type Baa = impl Debug; + | ^^^^^^^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable + +error[E0658]: associated type defaults are unstable + --> $DIR/feature-gate-min_type_alias_impl_trait.rs:23:5 + | +LL | type Assoc = impl Debug; + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #29661 for more information + = help: add `#![feature(associated_type_defaults)]` to the crate attributes to enable + +error[E0658]: `impl Trait` in type aliases is unstable + --> $DIR/feature-gate-min_type_alias_impl_trait.rs:23:18 + | +LL | type Assoc = impl Debug; + | ^^^^^^^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable + +error[E0658]: `impl Trait` in type aliases is unstable + --> $DIR/feature-gate-min_type_alias_impl_trait.rs:29:24 + | +LL | type NestedFree = (Vec, impl Debug, impl Iterator); + | ^^^^^^^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable + +error[E0658]: `impl Trait` in type aliases is unstable + --> $DIR/feature-gate-min_type_alias_impl_trait.rs:29:37 + | +LL | type NestedFree = (Vec, impl Debug, impl Iterator); + | ^^^^^^^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable + +error[E0658]: `impl Trait` in type aliases is unstable + --> $DIR/feature-gate-min_type_alias_impl_trait.rs:29:49 + | +LL | type NestedFree = (Vec, impl Debug, impl Iterator); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable + +error[E0658]: `impl Trait` in type aliases is unstable + --> $DIR/feature-gate-min_type_alias_impl_trait.rs:29:70 + | +LL | type NestedFree = (Vec, impl Debug, impl Iterator); + | ^^^^^^^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable + +error[E0658]: `impl Trait` in type aliases is unstable + --> $DIR/feature-gate-min_type_alias_impl_trait.rs:40:21 + | +LL | type Baa = (Vec, impl Debug, impl Iterator + Debug); + | ^^^^^^^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable + +error[E0658]: `impl Trait` in type aliases is unstable + --> $DIR/feature-gate-min_type_alias_impl_trait.rs:40:34 + | +LL | type Baa = (Vec, impl Debug, impl Iterator + Debug); + | ^^^^^^^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable + +error[E0658]: `impl Trait` in type aliases is unstable + --> $DIR/feature-gate-min_type_alias_impl_trait.rs:40:46 + | +LL | type Baa = (Vec, impl Debug, impl Iterator + Debug); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable + +error[E0658]: `impl Trait` in type aliases is unstable + --> $DIR/feature-gate-min_type_alias_impl_trait.rs:40:67 + | +LL | type Baa = (Vec, impl Debug, impl Iterator + Debug); + | ^^^^^^^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable + +error[E0562]: `impl Trait` not allowed outside of function and inherent method return types + --> $DIR/feature-gate-min_type_alias_impl_trait.rs:23:18 + | +LL | type Assoc = impl Debug; + | ^^^^^^^^^^ + +error: aborting due to 13 previous errors + +Some errors have detailed explanations: E0562, E0658. +For more information about an error, try `rustc --explain E0562`. diff --git a/src/test/ui/feature-gates/feature-gate-pub_macro_rules.rs b/src/test/ui/feature-gates/feature-gate-pub_macro_rules.rs new file mode 100644 index 0000000000..5504ec317a --- /dev/null +++ b/src/test/ui/feature-gates/feature-gate-pub_macro_rules.rs @@ -0,0 +1,10 @@ +pub macro_rules! m1 { () => {} } //~ ERROR `pub` on `macro_rules` items is unstable + +#[cfg(FALSE)] +pub macro_rules! m2 { () => {} } //~ ERROR `pub` on `macro_rules` items is unstable + +pub(crate) macro_rules! m3 { () => {} } //~ ERROR `pub` on `macro_rules` items is unstable + +pub(in self) macro_rules! m4 { () => {} } //~ ERROR `pub` on `macro_rules` items is unstable + +fn main() {} diff --git a/src/test/ui/feature-gates/feature-gate-pub_macro_rules.stderr b/src/test/ui/feature-gates/feature-gate-pub_macro_rules.stderr new file mode 100644 index 0000000000..bfaec398d9 --- /dev/null +++ b/src/test/ui/feature-gates/feature-gate-pub_macro_rules.stderr @@ -0,0 +1,39 @@ +error[E0658]: `pub` on `macro_rules` items is unstable + --> $DIR/feature-gate-pub_macro_rules.rs:1:1 + | +LL | pub macro_rules! m1 { () => {} } + | ^^^ + | + = note: see issue #78855 for more information + = help: add `#![feature(pub_macro_rules)]` to the crate attributes to enable + +error[E0658]: `pub` on `macro_rules` items is unstable + --> $DIR/feature-gate-pub_macro_rules.rs:4:1 + | +LL | pub macro_rules! m2 { () => {} } + | ^^^ + | + = note: see issue #78855 for more information + = help: add `#![feature(pub_macro_rules)]` to the crate attributes to enable + +error[E0658]: `pub` on `macro_rules` items is unstable + --> $DIR/feature-gate-pub_macro_rules.rs:6:1 + | +LL | pub(crate) macro_rules! m3 { () => {} } + | ^^^^^^^^^^ + | + = note: see issue #78855 for more information + = help: add `#![feature(pub_macro_rules)]` to the crate attributes to enable + +error[E0658]: `pub` on `macro_rules` items is unstable + --> $DIR/feature-gate-pub_macro_rules.rs:8:1 + | +LL | pub(in self) macro_rules! m4 { () => {} } + | ^^^^^^^^^^^^ + | + = note: see issue #78855 for more information + = help: add `#![feature(pub_macro_rules)]` 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/feature-gates/feature-gate-type_alias_impl_trait.rs b/src/test/ui/feature-gates/feature-gate-type_alias_impl_trait.rs index ffe297a5a6..dfd82a25f4 100644 --- a/src/test/ui/feature-gates/feature-gate-type_alias_impl_trait.rs +++ b/src/test/ui/feature-gates/feature-gate-type_alias_impl_trait.rs @@ -1,50 +1,37 @@ // ignore-compare-mode-chalk +#![feature(min_type_alias_impl_trait)] use std::fmt::Debug; -type Foo = impl Debug; //~ ERROR `impl Trait` in type aliases is unstable +type Foo = impl Debug; +//~^ ERROR could not find defining uses -trait Bar { - type Baa: Debug; - fn define() -> Self::Baa; +struct Bar(Foo); +fn define() -> Bar { + Bar(42) //~ ERROR mismatched types } -impl Bar for () { - type Baa = impl Debug; //~ ERROR `impl Trait` in type aliases is unstable - fn define() -> Self::Baa { - 0 - } -} - -fn define() -> Foo { - 0 -} +type Foo2 = impl Debug; -trait TraitWithDefault { - type Assoc = impl Debug; - //~^ ERROR associated type defaults are unstable - //~| ERROR `impl Trait` not allowed outside of function - //~| ERROR `impl Trait` in type aliases is unstable +fn define2() { + let x = || -> Foo2 { 42 }; //~ ERROR not permitted here } -type NestedFree = (Vec, impl Debug, impl Iterator); -//~^ ERROR `impl Trait` in type aliases is unstable -//~| ERROR `impl Trait` in type aliases is unstable -//~| ERROR `impl Trait` in type aliases is unstable -//~| ERROR `impl Trait` in type aliases is unstable +type Foo3 = impl Debug; +//~^ ERROR could not find defining uses -fn define_multiple() -> NestedFree { - (vec![true], 0u8, 0i32..1) +fn define3(x: Foo3) { + let y: i32 = x; //~ ERROR mismatched types } +fn define3_1() { + define3(42) //~ ERROR mismatched types +} + +type Foo4 = impl Debug; +//~^ ERROR could not find defining uses -impl Bar for u8 { - type Baa = (Vec, impl Debug, impl Iterator + Debug); - //~^ ERROR `impl Trait` in type aliases is unstable - //~| ERROR `impl Trait` in type aliases is unstable - //~| ERROR `impl Trait` in type aliases is unstable - //~| ERROR `impl Trait` in type aliases is unstable - fn define() -> Self::Baa { - (vec![true], 0u8, 0i32..1) - } +fn define4() { + let y: Foo4 = 42; + //~^ ERROR not permitted here } fn main() {} 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 b32cf94985..43fd76ef0e 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 @@ -1,118 +1,78 @@ -error[E0658]: `impl Trait` in type aliases is unstable - --> $DIR/feature-gate-type_alias_impl_trait.rs:4:12 +error[E0308]: mismatched types + --> $DIR/feature-gate-type_alias_impl_trait.rs:10:9 | LL | type Foo = impl Debug; - | ^^^^^^^^^^ + | ---------- the expected opaque type +... +LL | Bar(42) + | ^^ expected opaque type, found integer | - = note: see issue #63063 for more information - = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + = note: expected opaque type `impl Debug` + found type `{integer}` -error[E0658]: `impl Trait` in type aliases is unstable - --> $DIR/feature-gate-type_alias_impl_trait.rs:12:16 +error[E0658]: type alias impl trait is not permitted here + --> $DIR/feature-gate-type_alias_impl_trait.rs:16:19 | -LL | type Baa = impl Debug; - | ^^^^^^^^^^ +LL | let x = || -> Foo2 { 42 }; + | ^^^^ | = note: see issue #63063 for more information = 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:23:5 - | -LL | type Assoc = impl Debug; - | ^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: see issue #29661 for more information - = help: add `#![feature(associated_type_defaults)]` to the crate attributes to enable - -error[E0658]: `impl Trait` in type aliases is unstable +error[E0308]: mismatched types --> $DIR/feature-gate-type_alias_impl_trait.rs:23:18 | -LL | type Assoc = impl Debug; - | ^^^^^^^^^^ +LL | type Foo3 = impl Debug; + | ---------- the found opaque type +... +LL | let y: i32 = x; + | --- ^ expected `i32`, found opaque type + | | + | expected due to this | - = note: see issue #63063 for more information - = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + = note: expected type `i32` + found opaque type `impl Debug` -error[E0658]: `impl Trait` in type aliases is unstable - --> $DIR/feature-gate-type_alias_impl_trait.rs:29:24 +error[E0308]: mismatched types + --> $DIR/feature-gate-type_alias_impl_trait.rs:26:13 | -LL | type NestedFree = (Vec, impl Debug, impl Iterator); - | ^^^^^^^^^^ +LL | type Foo3 = impl Debug; + | ---------- the expected opaque type +... +LL | define3(42) + | ^^ expected opaque type, found integer | - = note: see issue #63063 for more information - = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + = note: expected opaque type `impl Debug` + found type `{integer}` -error[E0658]: `impl Trait` in type aliases is unstable - --> $DIR/feature-gate-type_alias_impl_trait.rs:29:37 +error[E0658]: type alias impl trait is not permitted here + --> $DIR/feature-gate-type_alias_impl_trait.rs:33:12 | -LL | type NestedFree = (Vec, impl Debug, impl Iterator); - | ^^^^^^^^^^ +LL | let y: Foo4 = 42; + | ^^^^ | - = note: see issue #63063 for more information - = 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:29:49 - | -LL | type NestedFree = (Vec, impl Debug, impl Iterator); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: see issue #63063 for more information - = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable -error[E0658]: `impl Trait` in type aliases is unstable - --> $DIR/feature-gate-type_alias_impl_trait.rs:29:70 - | -LL | type NestedFree = (Vec, impl Debug, impl Iterator); - | ^^^^^^^^^^ +error: could not find defining uses + --> $DIR/feature-gate-type_alias_impl_trait.rs:5:12 | - = note: see issue #63063 for more information - = 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:40:21 - | -LL | type Baa = (Vec, impl Debug, impl Iterator + Debug); - | ^^^^^^^^^^ - | - = note: see issue #63063 for more information - = 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:40:34 - | -LL | type Baa = (Vec, impl Debug, impl Iterator + Debug); - | ^^^^^^^^^^ - | - = note: see issue #63063 for more information - = 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:40:46 - | -LL | type Baa = (Vec, impl Debug, impl Iterator + Debug); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: see issue #63063 for more information - = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable +LL | type Foo = impl Debug; + | ^^^^^^^^^^ -error[E0658]: `impl Trait` in type aliases is unstable - --> $DIR/feature-gate-type_alias_impl_trait.rs:40:67 - | -LL | type Baa = (Vec, impl Debug, impl Iterator + Debug); - | ^^^^^^^^^^ +error: could not find defining uses + --> $DIR/feature-gate-type_alias_impl_trait.rs:19:13 | - = note: see issue #63063 for more information - = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable +LL | type Foo3 = impl Debug; + | ^^^^^^^^^^ -error[E0562]: `impl Trait` not allowed outside of function and inherent method return types - --> $DIR/feature-gate-type_alias_impl_trait.rs:23:18 +error: could not find defining uses + --> $DIR/feature-gate-type_alias_impl_trait.rs:29:13 | -LL | type Assoc = impl Debug; - | ^^^^^^^^^^ +LL | type Foo4 = impl Debug; + | ^^^^^^^^^^ -error: aborting due to 13 previous errors +error: aborting due to 8 previous errors -Some errors have detailed explanations: E0562, E0658. -For more information about an error, try `rustc --explain E0562`. +Some errors have detailed explanations: E0308, E0658. +For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/feature-gates/feature-gate-unsafe_block_in_unsafe_fn.rs b/src/test/ui/feature-gates/feature-gate-unsafe_block_in_unsafe_fn.rs deleted file mode 100644 index 61e512a12a..0000000000 --- a/src/test/ui/feature-gates/feature-gate-unsafe_block_in_unsafe_fn.rs +++ /dev/null @@ -1,6 +0,0 @@ -#![deny(unsafe_op_in_unsafe_fn)] -//~^ ERROR the `unsafe_op_in_unsafe_fn` lint is unstable -//~| ERROR the `unsafe_op_in_unsafe_fn` lint is unstable -//~| ERROR the `unsafe_op_in_unsafe_fn` lint is unstable - -fn main() {} diff --git a/src/test/ui/feature-gates/feature-gate-unsafe_block_in_unsafe_fn.stderr b/src/test/ui/feature-gates/feature-gate-unsafe_block_in_unsafe_fn.stderr deleted file mode 100644 index c5cad4a98d..0000000000 --- a/src/test/ui/feature-gates/feature-gate-unsafe_block_in_unsafe_fn.stderr +++ /dev/null @@ -1,30 +0,0 @@ -error[E0658]: the `unsafe_op_in_unsafe_fn` lint is unstable - --> $DIR/feature-gate-unsafe_block_in_unsafe_fn.rs:1:1 - | -LL | #![deny(unsafe_op_in_unsafe_fn)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: see issue #71668 for more information - = help: add `#![feature(unsafe_block_in_unsafe_fn)]` to the crate attributes to enable - -error[E0658]: the `unsafe_op_in_unsafe_fn` lint is unstable - --> $DIR/feature-gate-unsafe_block_in_unsafe_fn.rs:1:1 - | -LL | #![deny(unsafe_op_in_unsafe_fn)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: see issue #71668 for more information - = help: add `#![feature(unsafe_block_in_unsafe_fn)]` to the crate attributes to enable - -error[E0658]: the `unsafe_op_in_unsafe_fn` lint is unstable - --> $DIR/feature-gate-unsafe_block_in_unsafe_fn.rs:1:1 - | -LL | #![deny(unsafe_op_in_unsafe_fn)] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: see issue #71668 for more information - = help: add `#![feature(unsafe_block_in_unsafe_fn)]` 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/issue-43106-gating-of-builtin-attrs.stderr b/src/test/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr index c908d2589c..c864ccc868 100644 --- a/src/test/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr +++ b/src/test/ui/feature-gates/issue-43106-gating-of-builtin-attrs.stderr @@ -493,6 +493,30 @@ LL | #![feature(rust1)] | = note: `#[warn(stable_features)]` on by default +warning: unused attribute + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:46:1 + | +LL | #![plugin_registrar] + | ^^^^^^^^^^^^^^^^^^^^ + +warning: unused attribute + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:60:1 + | +LL | #![should_panic] + | ^^^^^^^^^^^^^^^^ + +warning: unused attribute + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:61:1 + | +LL | #![ignore] + | ^^^^^^^^^^ + +warning: unused attribute + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:67:1 + | +LL | #![proc_macro_derive()] + | ^^^^^^^^^^^^^^^^^^^^^^^ + warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:191:5 | @@ -517,6 +541,12 @@ warning: unused attribute LL | #[macro_use] impl S { } | ^^^^^^^^^^^^ +warning: unused attribute + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:204:1 + | +LL | #[macro_export] + | ^^^^^^^^^^^^^^^ + warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:207:17 | @@ -548,10 +578,10 @@ LL | #[macro_export] impl S { } | ^^^^^^^^^^^^^^^ warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:204:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:223:1 | -LL | #[macro_export] - | ^^^^^^^^^^^^^^^ +LL | #[plugin_registrar] + | ^^^^^^^^^^^^^^^^^^^ warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:228:17 @@ -577,12 +607,6 @@ warning: unused attribute LL | #[plugin_registrar] impl S { } | ^^^^^^^^^^^^^^^^^^^ -warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:223:1 - | -LL | #[plugin_registrar] - | ^^^^^^^^^^^^^^^^^^^ - warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:301:5 | @@ -607,6 +631,12 @@ warning: unused attribute LL | #[path = "3800"] impl S { } | ^^^^^^^^^^^^^^^^ +warning: unused attribute + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:314:1 + | +LL | #[automatically_derived] + | ^^^^^^^^^^^^^^^^^^^^^^^^ + warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:317:17 | @@ -638,10 +668,10 @@ LL | #[automatically_derived] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^^^ warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:314:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:361:1 | -LL | #[automatically_derived] - | ^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #[should_panic] + | ^^^^^^^^^^^^^^^ warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:364:17 @@ -674,10 +704,10 @@ LL | #[should_panic] impl S { } | ^^^^^^^^^^^^^^^ warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:361:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:380:1 | -LL | #[should_panic] - | ^^^^^^^^^^^^^^^ +LL | #[ignore] + | ^^^^^^^^^ warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:383:17 @@ -710,10 +740,10 @@ LL | #[ignore] impl S { } | ^^^^^^^^^ warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:380:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:399:1 | -LL | #[ignore] - | ^^^^^^^^^ +LL | #[no_implicit_prelude] + | ^^^^^^^^^^^^^^^^^^^^^^ warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:402:17 @@ -746,10 +776,10 @@ LL | #[no_implicit_prelude] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^ warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:399:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:418:1 | -LL | #[no_implicit_prelude] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #[reexport_test_harness_main = "2900"] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:421:17 @@ -781,12 +811,6 @@ warning: unused attribute LL | #[reexport_test_harness_main = "2900"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:418:1 - | -LL | #[reexport_test_harness_main = "2900"] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:445:5 | @@ -811,6 +835,18 @@ warning: unused attribute LL | #[macro_escape] impl S { } | ^^^^^^^^^^^^^^^ +warning: unused attribute + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:458:1 + | +LL | #[no_std] + | ^^^^^^^^^ + +warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![foo]` + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:458:1 + | +LL | #[no_std] + | ^^^^^^^^^ + warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:462:17 | @@ -872,16 +908,16 @@ LL | #[no_std] impl S { } | ^^^^^^^^^ warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:458:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:659:1 | -LL | #[no_std] - | ^^^^^^^^^ +LL | #[crate_name = "0900"] + | ^^^^^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![foo]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:458:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:659:1 | -LL | #[no_std] - | ^^^^^^^^^ +LL | #[crate_name = "0900"] + | ^^^^^^^^^^^^^^^^^^^^^^ warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:663:17 @@ -944,15 +980,15 @@ LL | #[crate_name = "0900"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^ warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:659:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:684:1 | -LL | #[crate_name = "0900"] +LL | #[crate_type = "0800"] | ^^^^^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![foo]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:659:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:684:1 | -LL | #[crate_name = "0900"] +LL | #[crate_type = "0800"] | ^^^^^^^^^^^^^^^^^^^^^^ warning: unused attribute @@ -1016,16 +1052,16 @@ LL | #[crate_type = "0800"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^ warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:684:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:709:1 | -LL | #[crate_type = "0800"] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #[feature(x0600)] + | ^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![foo]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:684:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:709:1 | -LL | #[crate_type = "0800"] - | ^^^^^^^^^^^^^^^^^^^^^^ +LL | #[feature(x0600)] + | ^^^^^^^^^^^^^^^^^ warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:713:17 @@ -1088,16 +1124,16 @@ LL | #[feature(x0600)] impl S { } | ^^^^^^^^^^^^^^^^^ warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:709:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:735:1 | -LL | #[feature(x0600)] - | ^^^^^^^^^^^^^^^^^ +LL | #[no_main] + | ^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![foo]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:709:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:735:1 | -LL | #[feature(x0600)] - | ^^^^^^^^^^^^^^^^^ +LL | #[no_main] + | ^^^^^^^^^^ warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:739:17 @@ -1160,16 +1196,16 @@ LL | #[no_main] impl S { } | ^^^^^^^^^^ warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:735:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:773:1 | -LL | #[no_main] - | ^^^^^^^^^^ +LL | #[recursion_limit="0200"] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![foo]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:735:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:773:1 | -LL | #[no_main] - | ^^^^^^^^^^ +LL | #[recursion_limit="0200"] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:777:17 @@ -1232,16 +1268,16 @@ LL | #[recursion_limit="0200"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^^^^ warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:773:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:798:1 | -LL | #[recursion_limit="0200"] - | ^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #[type_length_limit="0100"] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![foo]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:773:1 + --> $DIR/issue-43106-gating-of-builtin-attrs.rs:798:1 | -LL | #[recursion_limit="0200"] - | ^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | #[type_length_limit="0100"] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ warning: unused attribute --> $DIR/issue-43106-gating-of-builtin-attrs.rs:802:17 @@ -1303,41 +1339,5 @@ warning: crate-level attribute should be an inner attribute: add an exclamation LL | #[type_length_limit="0100"] impl S { } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ -warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:798:1 - | -LL | #[type_length_limit="0100"] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -warning: crate-level attribute should be an inner attribute: add an exclamation mark: `#![foo]` - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:798:1 - | -LL | #[type_length_limit="0100"] - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:46:1 - | -LL | #![plugin_registrar] - | ^^^^^^^^^^^^^^^^^^^^ - -warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:60:1 - | -LL | #![should_panic] - | ^^^^^^^^^^^^^^^^ - -warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:61:1 - | -LL | #![ignore] - | ^^^^^^^^^^ - -warning: unused attribute - --> $DIR/issue-43106-gating-of-builtin-attrs.rs:67:1 - | -LL | #![proc_macro_derive()] - | ^^^^^^^^^^^^^^^^^^^^^^^ - warning: 205 warnings emitted diff --git a/src/test/ui/feature-gates/issue-43106-gating-of-derive.rs b/src/test/ui/feature-gates/issue-43106-gating-of-derive.rs index c5d9e0db4d..5404b8c04b 100644 --- a/src/test/ui/feature-gates/issue-43106-gating-of-derive.rs +++ b/src/test/ui/feature-gates/issue-43106-gating-of-derive.rs @@ -6,6 +6,7 @@ mod derive { mod inner { #![derive(Debug)] } //~^ ERROR `derive` may only be applied to structs, enums and unions + //~| ERROR inner macro attributes are unstable #[derive(Debug)] //~^ ERROR `derive` may only be applied to structs, enums and unions diff --git a/src/test/ui/feature-gates/issue-43106-gating-of-derive.stderr b/src/test/ui/feature-gates/issue-43106-gating-of-derive.stderr index ffec76f409..9b1f4f4621 100644 --- a/src/test/ui/feature-gates/issue-43106-gating-of-derive.stderr +++ b/src/test/ui/feature-gates/issue-43106-gating-of-derive.stderr @@ -4,30 +4,40 @@ error[E0774]: `derive` may only be applied to structs, enums and unions LL | #[derive(Debug)] | ^^^^^^^^^^^^^^^^ +error[E0658]: inner macro attributes are unstable + --> $DIR/issue-43106-gating-of-derive.rs:7:20 + | +LL | mod inner { #![derive(Debug)] } + | ^^^^^^ + | + = note: see issue #54726 for more information + = help: add `#![feature(custom_inner_attributes)]` to the crate attributes to enable + error[E0774]: `derive` may only be applied to structs, enums and unions --> $DIR/issue-43106-gating-of-derive.rs:7:17 | LL | mod inner { #![derive(Debug)] } - | ^^^^^^^^^^^^^^^^^ help: try an outer attribute: `#[derive(Debug)]` + | ^^^^^^^^^^^^^^^^^ error[E0774]: `derive` may only be applied to structs, enums and unions - --> $DIR/issue-43106-gating-of-derive.rs:10:5 + --> $DIR/issue-43106-gating-of-derive.rs:11:5 | LL | #[derive(Debug)] | ^^^^^^^^^^^^^^^^ error[E0774]: `derive` may only be applied to structs, enums and unions - --> $DIR/issue-43106-gating-of-derive.rs:23:5 + --> $DIR/issue-43106-gating-of-derive.rs:24:5 | LL | #[derive(Debug)] | ^^^^^^^^^^^^^^^^ error[E0774]: `derive` may only be applied to structs, enums and unions - --> $DIR/issue-43106-gating-of-derive.rs:27:5 + --> $DIR/issue-43106-gating-of-derive.rs:28:5 | LL | #[derive(Debug)] | ^^^^^^^^^^^^^^^^ -error: aborting due to 5 previous errors +error: aborting due to 6 previous errors -For more information about this error, try `rustc --explain E0774`. +Some errors have detailed explanations: E0658, E0774. +For more information about an error, try `rustc --explain E0658`. diff --git a/src/test/ui/feature-gates/unstable-attribute-allow-issue-0.stderr b/src/test/ui/feature-gates/unstable-attribute-allow-issue-0.stderr index 7bbaf92fc6..4ed42101af 100644 --- a/src/test/ui/feature-gates/unstable-attribute-allow-issue-0.stderr +++ b/src/test/ui/feature-gates/unstable-attribute-allow-issue-0.stderr @@ -16,3 +16,4 @@ LL | #[unstable(feature = "unstable_test_feature", issue = "something")] error: aborting due to 2 previous errors +For more information about this error, try `rustc --explain E0545`. diff --git a/src/test/ui/fmt/format-args-capture.rs b/src/test/ui/fmt/format-args-capture.rs index d5886a1355..6c97a807b0 100644 --- a/src/test/ui/fmt/format-args-capture.rs +++ b/src/test/ui/fmt/format-args-capture.rs @@ -5,6 +5,7 @@ fn main() { named_argument_takes_precedence_to_captured(); formatting_parameters_can_be_captured(); + capture_raw_strings_and_idents(); #[cfg(panic = "unwind")] { @@ -25,6 +26,16 @@ fn named_argument_takes_precedence_to_captured() { assert_eq!(&s, "positional-named-captured"); } +fn capture_raw_strings_and_idents() { + let r#type = "apple"; + let s = format!(r#"The fruit is an {type}"#); + assert_eq!(&s, "The fruit is an apple"); + + let r#type = "orange"; + let s = format!(r"The fruit is an {type}"); + assert_eq!(&s, "The fruit is an orange"); +} + #[cfg(panic = "unwind")] fn panic_with_single_argument_does_not_get_formatted() { // panic! with a single argument does not perform string formatting. diff --git a/src/test/ui/cleanup-rvalue-during-if-and-while.rs b/src/test/ui/for-loop-while/cleanup-rvalue-during-if-and-while.rs similarity index 100% rename from src/test/ui/cleanup-rvalue-during-if-and-while.rs rename to src/test/ui/for-loop-while/cleanup-rvalue-during-if-and-while.rs diff --git a/src/test/ui/generator/auto-trait-regions.stderr b/src/test/ui/generator/auto-trait-regions.stderr index 5ec462e104..da3d3249f0 100644 --- a/src/test/ui/generator/auto-trait-regions.stderr +++ b/src/test/ui/generator/auto-trait-regions.stderr @@ -1,33 +1,24 @@ error: implementation of `Foo` is not general enough --> $DIR/auto-trait-regions.rs:31: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` + = note: `&'0 OnlyFooIfStaticRef` must implement `Foo`, for any lifetime `'0`... + = note: ...but `Foo` is actually implemented for the type `&'static OnlyFooIfStaticRef` error: implementation of `Foo` is not general enough --> $DIR/auto-trait-regions.rs:31: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` + = note: `&'0 OnlyFooIfStaticRef` must implement `Foo`, for any lifetime `'0`... + = note: ...but `Foo` is actually implemented for the type `&'static OnlyFooIfStaticRef` error: implementation of `Foo` is not general enough --> $DIR/auto-trait-regions.rs:50:5 | -LL | auto trait Foo {} - | ----------------- trait `Foo` defined here -... LL | assert_foo(gen); | ^^^^^^^^^^ implementation of `Foo` is not general enough | @@ -37,9 +28,6 @@ LL | assert_foo(gen); error: implementation of `Foo` is not general enough --> $DIR/auto-trait-regions.rs:50:5 | -LL | auto trait Foo {} - | ----------------- trait `Foo` defined here -... LL | assert_foo(gen); | ^^^^^^^^^^ implementation of `Foo` is not general enough | diff --git a/src/test/ui/generator/layout-error.full_tait.stderr b/src/test/ui/generator/layout-error.full_tait.stderr new file mode 100644 index 0000000000..805a4d1d00 --- /dev/null +++ b/src/test/ui/generator/layout-error.full_tait.stderr @@ -0,0 +1,26 @@ +error[E0425]: cannot find value `Foo` in this scope + --> $DIR/layout-error.rs:25:17 + | +LL | let a = Foo; + | ^^^ not found in this scope + +warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/layout-error.rs:8:32 + | +LL | #![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63065 for more information + +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/layout-error.rs:8:56 + | +LL | #![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63063 for more information + +error: aborting due to previous error; 2 warnings emitted + +For more information about this error, try `rustc --explain E0425`. diff --git a/src/test/ui/generator/layout-error.min_tait.stderr b/src/test/ui/generator/layout-error.min_tait.stderr new file mode 100644 index 0000000000..be469d781b --- /dev/null +++ b/src/test/ui/generator/layout-error.min_tait.stderr @@ -0,0 +1,40 @@ +error[E0425]: cannot find value `Foo` in this scope + --> $DIR/layout-error.rs:25:17 + | +LL | let a = Foo; + | ^^^ not found in this scope + +error[E0658]: type alias impl trait is not permitted here + --> $DIR/layout-error.rs:31:27 + | +LL | Task::spawn(&POOL, || cb()); + | ^ + | + = note: see issue #63063 for more information + = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + +error[E0658]: type alias impl trait is not permitted here + --> $DIR/layout-error.rs:30:28 + | +LL | static POOL: Task = Task::new(); + | ^^^^^^^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable + +error: concrete type differs from previous defining opaque type use + --> $DIR/layout-error.rs:31:24 + | +LL | Task::spawn(&POOL, || cb()); + | ^^^^^^^ expected `[type error]`, got `impl Future` + | +note: previous use here + --> $DIR/layout-error.rs:30:5 + | +LL | static POOL: Task = Task::new(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 4 previous errors + +Some errors have detailed explanations: E0425, E0658. +For more information about an error, try `rustc --explain E0425`. diff --git a/src/test/ui/generator/layout-error.rs b/src/test/ui/generator/layout-error.rs index 059867277a..9f15a6b2ec 100644 --- a/src/test/ui/generator/layout-error.rs +++ b/src/test/ui/generator/layout-error.rs @@ -3,12 +3,16 @@ // // edition:2018 -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete +//[full_tait]~| WARN incomplete use std::future::Future; pub struct Task(F); impl Task { - fn new() -> Self { + const fn new() -> Self { todo!() } fn spawn(&self, _: impl FnOnce() -> F) { @@ -23,6 +27,7 @@ fn main() { type F = impl Future; // Check that statics are inhabited computes they layout. - static POOL: Task = Task::new(); - Task::spawn(&POOL, || cb()); + static POOL: Task = Task::new(); //[min_tait]~ ERROR not permitted here + Task::spawn(&POOL, || cb()); //[min_tait]~ ERROR type alias impl trait is not permitted here + //[min_tait]~^ ERROR concrete type differs from previous } diff --git a/src/test/ui/generator/layout-error.stderr b/src/test/ui/generator/layout-error.stderr deleted file mode 100644 index b1a258f4f2..0000000000 --- a/src/test/ui/generator/layout-error.stderr +++ /dev/null @@ -1,9 +0,0 @@ -error[E0425]: cannot find value `Foo` in this scope - --> $DIR/layout-error.rs:21:17 - | -LL | let a = Foo; - | ^^^ not found in this scope - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0425`. diff --git a/src/test/ui/generator/metadata-sufficient-for-layout.full_tait.stderr b/src/test/ui/generator/metadata-sufficient-for-layout.full_tait.stderr new file mode 100644 index 0000000000..ce874c1518 --- /dev/null +++ b/src/test/ui/generator/metadata-sufficient-for-layout.full_tait.stderr @@ -0,0 +1,25 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/metadata-sufficient-for-layout.rs:10:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/metadata-sufficient-for-layout.rs:10:55 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + +error: fatal error triggered by #[rustc_error] + --> $DIR/metadata-sufficient-for-layout.rs:29:1 + | +LL | fn main() {} + | ^^^^^^^^^ + +error: aborting due to previous error; 2 warnings emitted + diff --git a/src/test/ui/generator/metadata-sufficient-for-layout.min_tait.stderr b/src/test/ui/generator/metadata-sufficient-for-layout.min_tait.stderr new file mode 100644 index 0000000000..e2b0d3622a --- /dev/null +++ b/src/test/ui/generator/metadata-sufficient-for-layout.min_tait.stderr @@ -0,0 +1,24 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/metadata-sufficient-for-layout.rs:22:23 + | +LL | static A: Option = None; + | ^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable + +error: concrete type differs from previous defining opaque type use + --> $DIR/metadata-sufficient-for-layout.rs:25:1 + | +LL | fn f() -> F { metadata_sufficient_for_layout::g() } + | ^^^^^^^^^^^ expected `[type error]`, got `impl Generator` + | +note: previous use here + --> $DIR/metadata-sufficient-for-layout.rs:22:1 + | +LL | static A: Option = None; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/generator/metadata-sufficient-for-layout.rs b/src/test/ui/generator/metadata-sufficient-for-layout.rs index 9c82359a0b..f206093d97 100644 --- a/src/test/ui/generator/metadata-sufficient-for-layout.rs +++ b/src/test/ui/generator/metadata-sufficient-for-layout.rs @@ -4,9 +4,12 @@ // Regression test for #80998. // // aux-build:metadata-sufficient-for-layout.rs -// check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait, rustc_attrs)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] +//[full_tait]~^ WARN incomplete +//[full_tait]~| WARN incomplete #![feature(generator_trait)] extern crate metadata_sufficient_for_layout; @@ -17,7 +20,10 @@ type F = impl Generator<(), Yield = (), Return = ()>; // Static queries the layout of the generator. static A: Option = None; +//[min_tait]~^ ERROR not permitted here fn f() -> F { metadata_sufficient_for_layout::g() } +//[min_tait]~^ ERROR concrete type differs -fn main() {} +#[rustc_error] +fn main() {} //[full_tait]~ ERROR diff --git a/src/test/ui/generator/print/generator-print-verbose-1.stderr b/src/test/ui/generator/print/generator-print-verbose-1.stderr index b5c63584c6..78100318dc 100644 --- a/src/test/ui/generator/print/generator-print-verbose-1.stderr +++ b/src/test/ui/generator/print/generator-print-verbose-1.stderr @@ -12,7 +12,7 @@ note: generator is not `Send` as this value is used across a yield --> $DIR/generator-print-verbose-1.rs:35:9 | LL | let _non_send_gen = make_non_send_generator(); - | ------------- has type `Opaque(DefId(0:24 ~ generator_print_verbose_1[317d]::make_non_send_generator::{opaque#0}), [])` which is not `Send` + | ------------- has type `Opaque(DefId(0:34 ~ generator_print_verbose_1[317d]::make_non_send_generator::{opaque#0}), [])` which is not `Send` LL | yield; | ^^^^^ yield occurs here, with `_non_send_gen` maybe used later LL | }; @@ -30,10 +30,10 @@ LL | require_send(send_gen); = help: the trait `Sync` is not implemented for `RefCell` = note: required because of the requirements on the impl of `Send` for `Arc>` = note: required because it appears within the type `[make_gen2>>::{closure#0} upvar_tys=(Arc>) {()}]` - = note: required because it appears within the type `Opaque(DefId(0:29 ~ generator_print_verbose_1[317d]::make_gen2::{opaque#0}), [std::sync::Arc>])` - = note: required because it appears within the type `Opaque(DefId(0:32 ~ generator_print_verbose_1[317d]::make_non_send_generator2::{opaque#0}), [])` - = note: required because it appears within the type `{Opaque(DefId(0:32 ~ generator_print_verbose_1[317d]::make_non_send_generator2::{opaque#0}), []), ()}` - = note: required because it appears within the type `[test2::{closure#0} upvar_tys=() {Opaque(DefId(0:32 ~ generator_print_verbose_1[317d]::make_non_send_generator2::{opaque#0}), []), ()}]` + = note: required because it appears within the type `Opaque(DefId(0:39 ~ generator_print_verbose_1[317d]::make_gen2::{opaque#0}), [std::sync::Arc>])` + = note: required because it appears within the type `Opaque(DefId(0:42 ~ generator_print_verbose_1[317d]::make_non_send_generator2::{opaque#0}), [])` + = note: required because it appears within the type `{Opaque(DefId(0:42 ~ generator_print_verbose_1[317d]::make_non_send_generator2::{opaque#0}), []), ()}` + = note: required because it appears within the type `[test2::{closure#0} upvar_tys=() {Opaque(DefId(0:42 ~ generator_print_verbose_1[317d]::make_non_send_generator2::{opaque#0}), []), ()}]` error: aborting due to 2 previous errors diff --git a/src/test/ui/generator/type-mismatch-signature-deduction.stderr b/src/test/ui/generator/type-mismatch-signature-deduction.stderr index 4abc0542c5..30e23ea8f6 100644 --- a/src/test/ui/generator/type-mismatch-signature-deduction.stderr +++ b/src/test/ui/generator/type-mismatch-signature-deduction.stderr @@ -2,11 +2,11 @@ error[E0308]: mismatched types --> $DIR/type-mismatch-signature-deduction.rs:13:9 | LL | 5 - | ^ expected enum `std::result::Result`, found integer + | ^ expected enum `Result`, found integer | - = note: expected type `std::result::Result<{integer}, _>` + = note: expected type `Result<{integer}, _>` found type `{integer}` -note: return type inferred to be `std::result::Result<{integer}, _>` here +note: return type inferred to be `Result<{integer}, _>` here --> $DIR/type-mismatch-signature-deduction.rs:8:20 | LL | return Ok(6); @@ -16,9 +16,9 @@ error[E0271]: type mismatch resolving `<[generator@$DIR/type-mismatch-signature- --> $DIR/type-mismatch-signature-deduction.rs:5:13 | LL | fn foo() -> impl Generator { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `std::result::Result`, found `i32` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `Result`, found `i32` | - = note: expected enum `std::result::Result<{integer}, _>` + = note: expected enum `Result<{integer}, _>` found type `i32` error: aborting due to 2 previous errors diff --git a/src/test/ui/generator/yield-outside-generator-issue-78653.rs b/src/test/ui/generator/yield-outside-generator-issue-78653.rs new file mode 100644 index 0000000000..4e8050c81b --- /dev/null +++ b/src/test/ui/generator/yield-outside-generator-issue-78653.rs @@ -0,0 +1,7 @@ +#![feature(generators)] + +fn main() { + yield || for i in 0 { } + //~^ ERROR yield expression outside of generator literal + //~| ERROR `{integer}` is not an iterator +} diff --git a/src/test/ui/generator/yield-outside-generator-issue-78653.stderr b/src/test/ui/generator/yield-outside-generator-issue-78653.stderr new file mode 100644 index 0000000000..f0c7cb0e5d --- /dev/null +++ b/src/test/ui/generator/yield-outside-generator-issue-78653.stderr @@ -0,0 +1,21 @@ +error[E0627]: yield expression outside of generator literal + --> $DIR/yield-outside-generator-issue-78653.rs:4:5 + | +LL | yield || for i in 0 { } + | ^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0277]: `{integer}` is not an iterator + --> $DIR/yield-outside-generator-issue-78653.rs:4:23 + | +LL | yield || for i in 0 { } + | ^ `{integer}` is not an iterator + | + = help: the trait `Iterator` is not implemented for `{integer}` + = 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` + = note: required because of the requirements on the impl of `IntoIterator` for `{integer}` + = note: required by `into_iter` + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0277, E0627. +For more information about an error, try `rustc --explain E0277`. diff --git a/src/test/ui/generic-associated-types/const-generics-gat-in-trait-return-type-1.rs b/src/test/ui/generic-associated-types/const-generics-gat-in-trait-return-type-1.rs new file mode 100644 index 0000000000..ab33ef6f24 --- /dev/null +++ b/src/test/ui/generic-associated-types/const-generics-gat-in-trait-return-type-1.rs @@ -0,0 +1,22 @@ +// run-pass +#![feature(generic_associated_types)] +#![allow(incomplete_features)] + +// This test unsures that with_opt_const_param returns the +// def_id of the N param in the Foo::Assoc GAT. + +trait Foo { + type Assoc; + fn foo(&self) -> Self::Assoc<3>; +} + +impl Foo for () { + type Assoc = [(); N]; + fn foo(&self) -> Self::Assoc<3> { + [(); 3] + } +} + +fn main() { + assert_eq!(().foo(), [(); 3]); +} diff --git a/src/test/ui/generic-associated-types/const-generics-gat-in-trait-return-type-2.rs b/src/test/ui/generic-associated-types/const-generics-gat-in-trait-return-type-2.rs new file mode 100644 index 0000000000..ba9a82ae72 --- /dev/null +++ b/src/test/ui/generic-associated-types/const-generics-gat-in-trait-return-type-2.rs @@ -0,0 +1,22 @@ +// run-pass +#![feature(generic_associated_types)] +#![allow(incomplete_features)] + +// This test unsures that with_opt_const_param returns the +// def_id of the N param in the Foo::Assoc GAT. + +trait Foo { + type Assoc; + fn foo(&self) -> Self::Assoc; +} + +impl Foo for () { + type Assoc = [(); N]; + fn foo(&self) -> Self::Assoc { + [(); N] + } +} + +fn main() { + assert_eq!(().foo::<10>(), [(); 10]); +} diff --git a/src/test/ui/generic-associated-types/const-generics-gat-in-trait-return-type-3.rs b/src/test/ui/generic-associated-types/const-generics-gat-in-trait-return-type-3.rs new file mode 100644 index 0000000000..9da5334056 --- /dev/null +++ b/src/test/ui/generic-associated-types/const-generics-gat-in-trait-return-type-3.rs @@ -0,0 +1,27 @@ +// run-pass +#![feature(generic_associated_types)] +#![allow(incomplete_features)] + +// This test unsures that with_opt_const_param returns the +// def_id of the N param in the Bar::Assoc GAT. + +trait Bar { + type Assoc; +} +trait Foo: Bar { + fn foo(&self) -> Self::Assoc<3>; +} + +impl Bar for () { + type Assoc = [(); N]; +} + +impl Foo for () { + fn foo(&self) -> Self::Assoc<3> { + [(); 3] + } +} + +fn main() { + assert_eq!(().foo(), [(); 3]); +} diff --git a/src/test/ui/generic-associated-types/constraint-assoc-type-suggestion.rs b/src/test/ui/generic-associated-types/constraint-assoc-type-suggestion.rs new file mode 100644 index 0000000000..36db3d1bb9 --- /dev/null +++ b/src/test/ui/generic-associated-types/constraint-assoc-type-suggestion.rs @@ -0,0 +1,17 @@ +// Test that correct syntax is used in suggestion to constrain associated type + +#![feature(generic_associated_types)] +//~^ WARNING the feature `generic_associated_types` is incomplete + +trait X { + type Y; +} + +fn f(a: T::Y) { + //~^ HELP consider constraining the associated type `::Y` to `Vec` + //~| SUGGESTION Y = Vec> + let b: Vec = a; + //~^ ERROR mismatched types +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/constraint-assoc-type-suggestion.stderr b/src/test/ui/generic-associated-types/constraint-assoc-type-suggestion.stderr new file mode 100644 index 0000000000..ecf559d9e9 --- /dev/null +++ b/src/test/ui/generic-associated-types/constraint-assoc-type-suggestion.stderr @@ -0,0 +1,27 @@ +warning: the feature `generic_associated_types` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/constraint-assoc-type-suggestion.rs:3:12 + | +LL | #![feature(generic_associated_types)] + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #44265 for more information + +error[E0308]: mismatched types + --> $DIR/constraint-assoc-type-suggestion.rs:13:23 + | +LL | let b: Vec = a; + | -------- ^ expected struct `Vec`, found associated type + | | + | expected due to this + | + = note: expected struct `Vec` + found associated type `::Y` +help: consider constraining the associated type `::Y` to `Vec` + | +LL | fn f = Vec>>(a: T::Y) { + | ^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/generic-associated-types/generic-associated-type-bounds.rs b/src/test/ui/generic-associated-types/generic-associated-type-bounds.rs new file mode 100644 index 0000000000..8094450e5e --- /dev/null +++ b/src/test/ui/generic-associated-types/generic-associated-type-bounds.rs @@ -0,0 +1,35 @@ +// run-pass + +#![allow(incomplete_features)] +#![feature(generic_associated_types)] + +pub trait X { + type Y<'a>; + fn m(&self) -> Self::Y<'_>; +} + +impl X for () { + type Y<'a> = &'a (); + + fn m(&self) -> Self::Y<'_> { + self + } +} + +fn f(x: &impl for<'a> X = &'a ()>) -> &() { + x.m() +} + +fn g X = &'a ()>>(x: &T) -> &() { + x.m() +} + +fn h(x: &()) -> &() { + x.m() +} + +fn main() { + f(&()); + g(&()); + h(&()); +} diff --git a/src/test/ui/generic-associated-types/issue-76535.rs b/src/test/ui/generic-associated-types/issue-76535.rs index 2b4757d8d1..5e73a88298 100644 --- a/src/test/ui/generic-associated-types/issue-76535.rs +++ b/src/test/ui/generic-associated-types/issue-76535.rs @@ -1,11 +1,11 @@ #![feature(generic_associated_types)] - //~^ WARNING the feature +//~^ WARNING the feature pub trait SubTrait {} pub trait SuperTrait { type SubType<'a>: SubTrait; - //~^ ERROR missing generics for associated + //~^ ERROR missing generics for associated fn get_sub<'a>(&'a mut self) -> Self::SubType<'a>; } @@ -36,6 +36,4 @@ impl SuperTrait for SuperStruct { fn main() { let sub: Box> = Box::new(SuperStruct::new(0)); - //~^ ERROR the trait - //~| ERROR the trait } diff --git a/src/test/ui/generic-associated-types/issue-76535.stderr b/src/test/ui/generic-associated-types/issue-76535.stderr index ce4875af9c..17661e0d90 100644 --- a/src/test/ui/generic-associated-types/issue-76535.stderr +++ b/src/test/ui/generic-associated-types/issue-76535.stderr @@ -23,41 +23,6 @@ help: use angle brackets to add missing lifetime argument LL | type SubType<'a><'a>: SubTrait; | ^^^^ -error[E0038]: the trait `SuperTrait` cannot be made into an object - --> $DIR/issue-76535.rs:38:14 - | -LL | let sub: Box> = Box::new(SuperStruct::new(0)); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `SuperTrait` cannot be made into an object - | - = help: consider moving `get_sub` to another trait -note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit - --> $DIR/issue-76535.rs:10:37 - | -LL | pub trait SuperTrait { - | ---------- this trait cannot be made into an object... -... -LL | fn get_sub<'a>(&'a mut self) -> Self::SubType<'a>; - | ^^^^^^^^^^^^^^^^^ ...because method `get_sub` references the `Self` type in its return type - -error[E0038]: the trait `SuperTrait` cannot be made into an object - --> $DIR/issue-76535.rs:38:57 - | -LL | let sub: Box> = Box::new(SuperStruct::new(0)); - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `SuperTrait` cannot be made into an object - | - = help: consider moving `get_sub` to another trait -note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit - --> $DIR/issue-76535.rs:10:37 - | -LL | pub trait SuperTrait { - | ---------- this trait cannot be made into an object... -... -LL | fn get_sub<'a>(&'a mut self) -> Self::SubType<'a>; - | ^^^^^^^^^^^^^^^^^ ...because method `get_sub` references the `Self` type in its return type - = note: required because of the requirements on the impl of `CoerceUnsized>>>` for `Box` - = note: required by cast to type `Box>>` - -error: aborting due to 3 previous errors; 1 warning emitted +error: aborting due to previous error; 1 warning emitted -Some errors have detailed explanations: E0038, E0107. -For more information about an error, try `rustc --explain E0038`. +For more information about this error, try `rustc --explain E0107`. diff --git a/src/test/ui/generic-associated-types/issue-79422.rs b/src/test/ui/generic-associated-types/issue-79422.rs index 26b38430dd..aeb33ca546 100644 --- a/src/test/ui/generic-associated-types/issue-79422.rs +++ b/src/test/ui/generic-associated-types/issue-79422.rs @@ -19,7 +19,7 @@ impl<'a, T> RefCont<'a, T> for Box { trait MapLike { type VRefCont<'a>: RefCont<'a, V>; - //~^ ERROR missing generics + //~^ ERROR missing generics fn get<'a>(&'a self, key: &K) -> Option>; } @@ -42,6 +42,5 @@ impl MapLike for Source { fn main() { let m = Box::new(std::collections::BTreeMap::::new()) as Box>>; - //~^ ERROR the trait - //~^^^ ERROR the trait + //~^^ ERROR type mismatch resolving } diff --git a/src/test/ui/generic-associated-types/issue-79422.stderr b/src/test/ui/generic-associated-types/issue-79422.stderr index d2e1296271..a119bff03e 100644 --- a/src/test/ui/generic-associated-types/issue-79422.stderr +++ b/src/test/ui/generic-associated-types/issue-79422.stderr @@ -14,41 +14,17 @@ help: use angle brackets to add missing lifetime argument LL | type VRefCont<'a><'a>: RefCont<'a, V>; | ^^^^ -error[E0038]: the trait `MapLike` cannot be made into an object - --> $DIR/issue-79422.rs:44:12 - | -LL | as Box>>; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `MapLike` cannot be made into an object - | - = help: consider moving `get` to another trait -note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit - --> $DIR/issue-79422.rs:23:38 - | -LL | trait MapLike { - | ------- this trait cannot be made into an object... -... -LL | fn get<'a>(&'a self, key: &K) -> Option>; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get` references the `Self` type in its return type - -error[E0038]: the trait `MapLike` cannot be made into an object +error[E0271]: type mismatch resolving ` as MapLike>::VRefCont<'static> == (dyn RefCont<'_, u8> + 'static)` --> $DIR/issue-79422.rs:43:13 | LL | let m = Box::new(std::collections::BTreeMap::::new()) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ `MapLike` cannot be made into an object - | - = help: consider moving `get` to another trait -note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit - --> $DIR/issue-79422.rs:23:38 + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected trait object `dyn RefCont`, found reference | -LL | trait MapLike { - | ------- this trait cannot be made into an object... -... -LL | fn get<'a>(&'a self, key: &K) -> Option>; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ ...because method `get` references the `Self` type in its return type - = note: required because of the requirements on the impl of `CoerceUnsized + 'static)>>>` for `Box>` - = note: required by cast to type `Box + 'static)>>` + = note: expected trait object `(dyn RefCont<'_, u8> + 'static)` + found reference `&'static u8` + = note: required for the cast to the object type `dyn MapLike + 'static)>` -error: aborting due to 3 previous errors +error: aborting due to 2 previous errors -Some errors have detailed explanations: E0038, E0107. -For more information about an error, try `rustc --explain E0038`. +Some errors have detailed explanations: E0107, E0271. +For more information about an error, try `rustc --explain E0107`. diff --git a/src/test/ui/generic-associated-types/issue-81712-cyclic-traits.rs b/src/test/ui/generic-associated-types/issue-81712-cyclic-traits.rs new file mode 100644 index 0000000000..934870afc1 --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-81712-cyclic-traits.rs @@ -0,0 +1,21 @@ +// Regression test for #81712. + +#![feature(generic_associated_types)] +#![allow(incomplete_features)] + +trait A { + type BType: B; +} + +trait B { + type AType: A; +} +trait C { + type DType: D; + //~^ ERROR: missing generics for associated type `C::DType` [E0107] +} +trait D { + type CType: C; +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/issue-81712-cyclic-traits.stderr b/src/test/ui/generic-associated-types/issue-81712-cyclic-traits.stderr new file mode 100644 index 0000000000..75f68cd314 --- /dev/null +++ b/src/test/ui/generic-associated-types/issue-81712-cyclic-traits.stderr @@ -0,0 +1,19 @@ +error[E0107]: missing generics for associated type `C::DType` + --> $DIR/issue-81712-cyclic-traits.rs:14:10 + | +LL | type DType: D; + | ^^^^^ expected 1 type argument + | +note: associated type defined here, with 1 type parameter: `T` + --> $DIR/issue-81712-cyclic-traits.rs:14:10 + | +LL | type DType: D; + | ^^^^^ - +help: use angle brackets to add missing type argument + | +LL | type DType: D; + | ^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0107`. diff --git a/src/test/ui/generic-associated-types/method-unsatified-assoc-type-predicate.rs b/src/test/ui/generic-associated-types/method-unsatified-assoc-type-predicate.rs new file mode 100644 index 0000000000..2de4c7b849 --- /dev/null +++ b/src/test/ui/generic-associated-types/method-unsatified-assoc-type-predicate.rs @@ -0,0 +1,35 @@ +// Test that the predicate printed in an unresolved method error prints the +// generics for a generic associated type. + +#![feature(generic_associated_types)] +//~^ WARNING the feature `generic_associated_types` is incomplete +//~| NOTE `#[warn(incomplete_features)]` on by default +//~| NOTE see issue #44265 + +trait X { + type Y; +} + +trait M { + fn f(&self) {} +} + +impl = i32>> M for T {} + +struct S; +//~^ NOTE method `f` not found for this +//~| NOTE doesn't satisfy `::Y = i32` +//~| NOTE doesn't satisfy `S: M` + +impl X for S { + type Y = bool; +} + +fn f(a: S) { + a.f(); + //~^ ERROR the method `f` exists for struct `S`, but its trait bounds were not satisfied + //~| NOTE method cannot be called on `S` due to unsatisfied trait bounds + //~| NOTE the following trait bounds were not satisfied: +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/method-unsatified-assoc-type-predicate.stderr b/src/test/ui/generic-associated-types/method-unsatified-assoc-type-predicate.stderr new file mode 100644 index 0000000000..c94155d13c --- /dev/null +++ b/src/test/ui/generic-associated-types/method-unsatified-assoc-type-predicate.stderr @@ -0,0 +1,29 @@ +warning: the feature `generic_associated_types` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/method-unsatified-assoc-type-predicate.rs:4:12 + | +LL | #![feature(generic_associated_types)] + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #44265 for more information + +error[E0599]: the method `f` exists for struct `S`, but its trait bounds were not satisfied + --> $DIR/method-unsatified-assoc-type-predicate.rs:29:7 + | +LL | struct S; + | --------- + | | + | method `f` not found for this + | doesn't satisfy `::Y = i32` + | doesn't satisfy `S: M` +... +LL | a.f(); + | ^ method cannot be called on `S` due to unsatisfied trait bounds + | + = note: the following trait bounds were not satisfied: + `::Y = i32` + which is required by `S: M` + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0599`. diff --git a/src/test/ui/generic-associated-types/projection-type-lifetime-mismatch.rs b/src/test/ui/generic-associated-types/projection-type-lifetime-mismatch.rs new file mode 100644 index 0000000000..0024e127a9 --- /dev/null +++ b/src/test/ui/generic-associated-types/projection-type-lifetime-mismatch.rs @@ -0,0 +1,36 @@ +#![allow(incomplete_features)] +#![feature(generic_associated_types)] + +pub trait X { + type Y<'a>; + fn m(&self) -> Self::Y<'_>; +} + +impl X for () { + type Y<'a> = &'a (); + + fn m(&self) -> Self::Y<'_> { + self + } +} + +fn f(x: &impl for<'a> X = &'a ()>) -> &'static () { + x.m() + //~^ ERROR explicit lifetime required +} + +fn g X = &'a ()>>(x: &T) -> &'static () { + x.m() + //~^ ERROR explicit lifetime required +} + +fn h(x: &()) -> &'static () { + x.m() + //~^ ERROR explicit lifetime required +} + +fn main() { + f(&()); + g(&()); + h(&()); +} diff --git a/src/test/ui/generic-associated-types/projection-type-lifetime-mismatch.stderr b/src/test/ui/generic-associated-types/projection-type-lifetime-mismatch.stderr new file mode 100644 index 0000000000..13b765dfa5 --- /dev/null +++ b/src/test/ui/generic-associated-types/projection-type-lifetime-mismatch.stderr @@ -0,0 +1,27 @@ +error[E0621]: explicit lifetime required in the type of `x` + --> $DIR/projection-type-lifetime-mismatch.rs:18:5 + | +LL | fn f(x: &impl for<'a> X = &'a ()>) -> &'static () { + | ------------------------------- help: add explicit lifetime `'static` to the type of `x`: `&'static impl for<'a> X = &'a ()>` +LL | x.m() + | ^^^^^ lifetime `'static` required + +error[E0621]: explicit lifetime required in the type of `x` + --> $DIR/projection-type-lifetime-mismatch.rs:23:5 + | +LL | fn g X = &'a ()>>(x: &T) -> &'static () { + | -- help: add explicit lifetime `'static` to the type of `x`: `&'static T` +LL | x.m() + | ^^^^^ lifetime `'static` required + +error[E0621]: explicit lifetime required in the type of `x` + --> $DIR/projection-type-lifetime-mismatch.rs:28:5 + | +LL | fn h(x: &()) -> &'static () { + | --- help: add explicit lifetime `'static` to the type of `x`: `&'static ()` +LL | x.m() + | ^^^^^ lifetime `'static` required + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0621`. diff --git a/src/test/ui/generic-associated-types/unsatified-item-lifetime-bound.rs b/src/test/ui/generic-associated-types/unsatified-item-lifetime-bound.rs new file mode 100644 index 0000000000..7bcc7ba752 --- /dev/null +++ b/src/test/ui/generic-associated-types/unsatified-item-lifetime-bound.rs @@ -0,0 +1,28 @@ +#![allow(incomplete_features)] +#![feature(generic_associated_types)] + +pub trait X { + type Y<'a: 'static>; + //~^ WARNING unnecessary lifetime parameter +} + +impl X for () { + type Y<'a> = &'a (); +} + +struct B<'a, T: for<'r> X = &'r ()>> { + f: ::Y<'a>, + //~^ ERROR lifetime bound not satisfied +} + +struct C<'a, T: X> { + f: ::Y<'a>, + //~^ ERROR lifetime bound not satisfied +} + +struct D<'a> { + f: <() as X>::Y<'a>, + //~^ ERROR lifetime bound not satisfied +} + +fn main() {} diff --git a/src/test/ui/generic-associated-types/unsatified-item-lifetime-bound.stderr b/src/test/ui/generic-associated-types/unsatified-item-lifetime-bound.stderr new file mode 100644 index 0000000000..1c81d33ccf --- /dev/null +++ b/src/test/ui/generic-associated-types/unsatified-item-lifetime-bound.stderr @@ -0,0 +1,50 @@ +warning: unnecessary lifetime parameter `'a` + --> $DIR/unsatified-item-lifetime-bound.rs:5:12 + | +LL | type Y<'a: 'static>; + | ^^^^^^^^^^^ + | + = help: you can use the `'static` lifetime directly, in place of `'a` + +error[E0478]: lifetime bound not satisfied + --> $DIR/unsatified-item-lifetime-bound.rs:14:8 + | +LL | f: ::Y<'a>, + | ^^^^^^^^^^^^^^^ + | +note: lifetime parameter instantiated with the lifetime `'a` as defined on the struct at 13:10 + --> $DIR/unsatified-item-lifetime-bound.rs:13:10 + | +LL | struct B<'a, T: for<'r> X = &'r ()>> { + | ^^ + = note: but lifetime parameter must outlive the static lifetime + +error[E0478]: lifetime bound not satisfied + --> $DIR/unsatified-item-lifetime-bound.rs:19:8 + | +LL | f: ::Y<'a>, + | ^^^^^^^^^^^^^^^ + | +note: lifetime parameter instantiated with the lifetime `'a` as defined on the struct at 18:10 + --> $DIR/unsatified-item-lifetime-bound.rs:18:10 + | +LL | struct C<'a, T: X> { + | ^^ + = note: but lifetime parameter must outlive the static lifetime + +error[E0478]: lifetime bound not satisfied + --> $DIR/unsatified-item-lifetime-bound.rs:24:8 + | +LL | f: <() as X>::Y<'a>, + | ^^^^^^^^^^^^^^^^ + | +note: lifetime parameter instantiated with the lifetime `'a` as defined on the struct at 23:10 + --> $DIR/unsatified-item-lifetime-bound.rs:23:10 + | +LL | struct D<'a> { + | ^^ + = note: but lifetime parameter must outlive the static lifetime + +error: aborting due to 3 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0478`. diff --git a/src/test/ui/generics/issue-32498.rs b/src/test/ui/generics/issue-32498.rs new file mode 100644 index 0000000000..1b54401097 --- /dev/null +++ b/src/test/ui/generics/issue-32498.rs @@ -0,0 +1,16 @@ +// run-pass +#![allow(dead_code)] + +// Making sure that no overflow occurs. + +struct L { + n: Option, +} +type L8 = L>>>>>>>; +type L64 = L8>>>; + +fn main() { + use std::mem::size_of; + assert_eq!(size_of::>>(), 1); + assert_eq!(size_of::>>>(), 1); +} diff --git a/src/test/ui/generics/wrong-number-of-args.rs b/src/test/ui/generics/wrong-number-of-args.rs index 6b99865202..2994ca3c75 100644 --- a/src/test/ui/generics/wrong-number-of-args.rs +++ b/src/test/ui/generics/wrong-number-of-args.rs @@ -139,7 +139,7 @@ mod stdlib { mod result { type A = Result; - //~^ ERROR missing generics for enum `std::result::Result` + //~^ ERROR missing generics for enum `Result` //~| HELP use angle brackets type B = Result; diff --git a/src/test/ui/generics/wrong-number-of-args.stderr b/src/test/ui/generics/wrong-number-of-args.stderr index 2a34fba2c4..73bd76aa5f 100644 --- a/src/test/ui/generics/wrong-number-of-args.stderr +++ b/src/test/ui/generics/wrong-number-of-args.stderr @@ -365,7 +365,7 @@ note: struct defined here, with at most 3 type parameters: `K`, `V`, `S` LL | pub struct HashMap { | ^^^^^^^ - - - -error[E0107]: missing generics for enum `std::result::Result` +error[E0107]: missing generics for enum `Result` --> $DIR/wrong-number-of-args.rs:141:18 | LL | type A = Result; diff --git a/src/test/ui/hrtb/due-to-where-clause.stderr b/src/test/ui/hrtb/due-to-where-clause.stderr index e4096ec059..520938a633 100644 --- a/src/test/ui/hrtb/due-to-where-clause.stderr +++ b/src/test/ui/hrtb/due-to-where-clause.stderr @@ -3,9 +3,6 @@ error: implementation of `Foo` is not general enough | LL | test::(&mut 42); | ^^^^^^^^^^^^ implementation of `Foo` is not general enough -... -LL | trait Foo<'a> {} - | ---------------- trait `Foo` defined here | = note: `FooS<'_>` must implement `Foo<'0>`, for any lifetime `'0`... = note: ...but `FooS<'_>` actually implements `Foo<'1>`, for some specific lifetime `'1` diff --git a/src/test/ui/hrtb/hrtb-cache-issue-54302.stderr b/src/test/ui/hrtb/hrtb-cache-issue-54302.stderr index 003f326593..f014eab860 100644 --- a/src/test/ui/hrtb/hrtb-cache-issue-54302.stderr +++ b/src/test/ui/hrtb/hrtb-cache-issue-54302.stderr @@ -1,9 +1,6 @@ error: implementation of `Deserialize` is not general enough --> $DIR/hrtb-cache-issue-54302.rs:19:5 | -LL | trait Deserialize<'de> {} - | ------------------------- trait `Deserialize` defined here -... LL | assert_deserialize_owned::<&'static str>(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Deserialize` is not general enough | diff --git a/src/test/ui/hrtb/hrtb-conflate-regions.stderr b/src/test/ui/hrtb/hrtb-conflate-regions.stderr index 45573814d1..b1d4c0bf37 100644 --- a/src/test/ui/hrtb/hrtb-conflate-regions.stderr +++ b/src/test/ui/hrtb/hrtb-conflate-regions.stderr @@ -1,16 +1,11 @@ error: implementation of `Foo` is not general enough --> $DIR/hrtb-conflate-regions.rs:27:10 | -LL | / trait Foo { -LL | | fn foo(&self, x: X) { } -LL | | } - | |_- trait `Foo` defined here -... -LL | fn b() { want_foo2::(); } - | ^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough +LL | fn b() { want_foo2::(); } + | ^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough | = note: `SomeStruct` must implement `Foo<(&'0 isize, &'1 isize)>`, for any two lifetimes `'0` and `'1`... - = note: ...but `SomeStruct` actually implements `Foo<(&'2 isize, &'2 isize)>`, for some specific lifetime `'2` + = note: ...but it actually implements `Foo<(&'2 isize, &'2 isize)>`, for some specific lifetime `'2` error: aborting due to previous error diff --git a/src/test/ui/hrtb/hrtb-exists-forall-trait-contravariant.stderr b/src/test/ui/hrtb/hrtb-exists-forall-trait-contravariant.stderr index fe8209d054..613f4dc495 100644 --- a/src/test/ui/hrtb/hrtb-exists-forall-trait-contravariant.stderr +++ b/src/test/ui/hrtb/hrtb-exists-forall-trait-contravariant.stderr @@ -1,14 +1,11 @@ error: implementation of `Trait` is not general enough --> $DIR/hrtb-exists-forall-trait-contravariant.rs:34:5 | -LL | trait Trait {} - | ----------------- trait `Trait` defined here -... LL | foo::<()>(); | ^^^^^^^^^ implementation of `Trait` is not general enough | = note: `()` must implement `Trait fn(&'b u32)>` - = note: ...but `()` actually implements `Trait`, for some specific lifetime `'0` + = note: ...but it actually implements `Trait`, for some specific lifetime `'0` error: aborting due to previous error diff --git a/src/test/ui/hrtb/hrtb-exists-forall-trait-invariant.stderr b/src/test/ui/hrtb/hrtb-exists-forall-trait-invariant.stderr index 8bd23aa901..b487ce3e0f 100644 --- a/src/test/ui/hrtb/hrtb-exists-forall-trait-invariant.stderr +++ b/src/test/ui/hrtb/hrtb-exists-forall-trait-invariant.stderr @@ -1,14 +1,11 @@ error: implementation of `Trait` is not general enough --> $DIR/hrtb-exists-forall-trait-invariant.rs:28:5 | -LL | trait Trait {} - | ----------------- trait `Trait` defined here -... LL | foo::<()>(); | ^^^^^^^^^ implementation of `Trait` is not general enough | = note: `()` must implement `Trait fn(Cell<&'b u32>)>` - = note: ...but `()` actually implements `Trait)>`, for some specific lifetime `'0` + = note: ...but it actually implements `Trait)>`, for some specific lifetime `'0` error: aborting due to previous error diff --git a/src/test/ui/hrtb/hrtb-just-for-static.stderr b/src/test/ui/hrtb/hrtb-just-for-static.stderr index 5e3014317f..ffc83aab4a 100644 --- a/src/test/ui/hrtb/hrtb-just-for-static.stderr +++ b/src/test/ui/hrtb/hrtb-just-for-static.stderr @@ -1,27 +1,17 @@ error: implementation of `Foo` is not general enough --> $DIR/hrtb-just-for-static.rs:24:5 | -LL | / trait Foo { -LL | | fn foo(&self, x: X) { } -LL | | } - | |_- trait `Foo` defined here -... -LL | want_hrtb::() - | ^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough +LL | want_hrtb::() + | ^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough | = note: `StaticInt` must implement `Foo<&'0 isize>`, for any lifetime `'0`... - = note: ...but `StaticInt` actually implements `Foo<&'1 isize>`, for some specific lifetime `'1` + = note: ...but it actually implements `Foo<&'static isize>` error: implementation of `Foo` is not general enough --> $DIR/hrtb-just-for-static.rs:30:5 | -LL | / trait Foo { -LL | | fn foo(&self, x: X) { } -LL | | } - | |_- trait `Foo` defined here -... -LL | want_hrtb::<&'a u32>() - | ^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough +LL | want_hrtb::<&'a u32>() + | ^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough | = note: `Foo<&'0 isize>` would have to be implemented for the type `&'a u32`, for any lifetime `'0`... = note: ...but `Foo<&'1 isize>` is actually implemented for the type `&'1 u32`, for some specific lifetime `'1` diff --git a/src/test/ui/hrtb/hrtb-perfect-forwarding.nll.stderr b/src/test/ui/hrtb/hrtb-perfect-forwarding.nll.stderr index edce0e6702..c3dd794957 100644 --- a/src/test/ui/hrtb/hrtb-perfect-forwarding.nll.stderr +++ b/src/test/ui/hrtb/hrtb-perfect-forwarding.nll.stderr @@ -1,11 +1,11 @@ warning: function cannot return without recursing - --> $DIR/hrtb-perfect-forwarding.rs:22:1 + --> $DIR/hrtb-perfect-forwarding.rs:16:1 | -LL | / fn no_hrtb<'b,T>(mut t: T) -LL | | where T : Bar<&'b isize> +LL | / fn no_hrtb<'b, T>(mut t: T) +LL | | where +LL | | T: Bar<&'b isize>, LL | | { -LL | | // OK -- `T : Bar<&'b isize>`, and thus the impl above ensures that -LL | | // `&mut T : Bar<&'b isize>`. +... | LL | | no_hrtb(&mut t); | | --------------- recursive call site LL | | } @@ -15,12 +15,12 @@ LL | | } = help: a `loop` may express intention better if this is on purpose warning: function cannot return without recursing - --> $DIR/hrtb-perfect-forwarding.rs:30:1 + --> $DIR/hrtb-perfect-forwarding.rs:25:1 | LL | / fn bar_hrtb(mut t: T) -LL | | where T : for<'b> Bar<&'b isize> +LL | | where +LL | | T: for<'b> Bar<&'b isize>, LL | | { -LL | | // OK -- `T : for<'b> Bar<&'b isize>`, and thus the impl above ... | LL | | bar_hrtb(&mut t); | | ---------------- recursive call site @@ -30,25 +30,26 @@ LL | | } = help: a `loop` may express intention better if this is on purpose warning: function cannot return without recursing - --> $DIR/hrtb-perfect-forwarding.rs:39:1 + --> $DIR/hrtb-perfect-forwarding.rs:35:1 | -LL | / fn foo_hrtb_bar_not<'b,T>(mut t: T) -LL | | where T : for<'a> Foo<&'a isize> + Bar<&'b isize> +LL | / fn foo_hrtb_bar_not<'b, T>(mut t: T) +LL | | where +LL | | T: for<'a> Foo<&'a isize> + Bar<&'b isize>, LL | | { -LL | | // Not OK -- The forwarding impl for `Foo` requires that `Bar` also ... | LL | | foo_hrtb_bar_not(&mut t); | | ------------------------ recursive call site LL | | +LL | | LL | | } | |_^ cannot return without recursing | = help: a `loop` may express intention better if this is on purpose error: lifetime may not live long enough - --> $DIR/hrtb-perfect-forwarding.rs:46:5 + --> $DIR/hrtb-perfect-forwarding.rs:43:5 | -LL | fn foo_hrtb_bar_not<'b,T>(mut t: T) +LL | fn foo_hrtb_bar_not<'b, T>(mut t: T) | -- lifetime `'b` defined here ... LL | foo_hrtb_bar_not(&mut t); @@ -57,18 +58,19 @@ 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 + --> $DIR/hrtb-perfect-forwarding.rs:43:5 | LL | foo_hrtb_bar_not(&mut t); | ^^^^^^^^^^^^^^^^^^^^^^^^ warning: function cannot return without recursing - --> $DIR/hrtb-perfect-forwarding.rs:50:1 + --> $DIR/hrtb-perfect-forwarding.rs:48:1 | LL | / fn foo_hrtb_bar_hrtb(mut t: T) -LL | | where T : for<'a> Foo<&'a isize> + for<'b> Bar<&'b isize> +LL | | where +LL | | T: for<'a> Foo<&'a isize> + for<'b> Bar<&'b isize>, LL | | { -LL | | // OK -- now we have `T : for<'b> Bar&'b isize>`. +LL | | // OK -- now we have `T : for<'b> Bar<&'b isize>`. LL | | foo_hrtb_bar_hrtb(&mut t); | | ------------------------- recursive call site LL | | } diff --git a/src/test/ui/hrtb/hrtb-perfect-forwarding.rs b/src/test/ui/hrtb/hrtb-perfect-forwarding.rs index 0303a764c1..441a788359 100644 --- a/src/test/ui/hrtb/hrtb-perfect-forwarding.rs +++ b/src/test/ui/hrtb/hrtb-perfect-forwarding.rs @@ -2,25 +2,20 @@ // is being applied to `for<'a> Foo<&'a mut X>`. Issue #19730. trait Foo { - fn foo(&mut self, x: X) { } + fn foo(&mut self, x: X) {} } trait Bar { - fn bar(&mut self, x: X) { } + fn bar(&mut self, x: X) {} } -impl<'a,X,F> Foo for &'a mut F - where F : Foo + Bar -{ -} +impl<'a, X, F> Foo for &'a mut F where F: Foo + Bar {} -impl<'a,X,F> Bar for &'a mut F - where F : Bar -{ -} +impl<'a, X, F> Bar for &'a mut F where F: Bar {} -fn no_hrtb<'b,T>(mut t: T) - where T : Bar<&'b isize> +fn no_hrtb<'b, T>(mut t: T) +where + T: Bar<&'b isize>, { // OK -- `T : Bar<&'b isize>`, and thus the impl above ensures that // `&mut T : Bar<&'b isize>`. @@ -28,7 +23,8 @@ fn no_hrtb<'b,T>(mut t: T) } fn bar_hrtb(mut t: T) - where T : for<'b> Bar<&'b isize> +where + T: for<'b> Bar<&'b isize>, { // OK -- `T : for<'b> Bar<&'b isize>`, and thus the impl above // ensures that `&mut T : for<'b> Bar<&'b isize>`. This is an @@ -36,22 +32,25 @@ fn bar_hrtb(mut t: T) bar_hrtb(&mut t); } -fn foo_hrtb_bar_not<'b,T>(mut t: T) - where T : for<'a> Foo<&'a isize> + Bar<&'b isize> +fn foo_hrtb_bar_not<'b, T>(mut t: T) +where + T: for<'a> Foo<&'a isize> + Bar<&'b isize>, { // Not OK -- The forwarding impl for `Foo` requires that `Bar` also // be implemented. Thus to satisfy `&mut T : for<'a> Foo<&'a // 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 + foo_hrtb_bar_not(&mut t); + //~^ ERROR implementation of `Bar` is not general enough + //~| ERROR implementation of `Bar` is not general enough } fn foo_hrtb_bar_hrtb(mut t: T) - where T : for<'a> Foo<&'a isize> + for<'b> Bar<&'b isize> +where + T: for<'a> Foo<&'a isize> + for<'b> Bar<&'b isize>, { - // OK -- now we have `T : for<'b> Bar&'b isize>`. + // OK -- now we have `T : for<'b> Bar<&'b isize>`. foo_hrtb_bar_hrtb(&mut t); } -fn main() { } +fn main() {} diff --git a/src/test/ui/hrtb/hrtb-perfect-forwarding.stderr b/src/test/ui/hrtb/hrtb-perfect-forwarding.stderr index ed810d443b..07ff9b96e4 100644 --- a/src/test/ui/hrtb/hrtb-perfect-forwarding.stderr +++ b/src/test/ui/hrtb/hrtb-perfect-forwarding.stderr @@ -1,41 +1,20 @@ -error[E0308]: mismatched types - --> $DIR/hrtb-perfect-forwarding.rs:46:5 +error: implementation of `Bar` is not general enough + --> $DIR/hrtb-perfect-forwarding.rs:43:5 | LL | foo_hrtb_bar_not(&mut t); - | ^^^^^^^^^^^^^^^^ lifetime mismatch + | ^^^^^^^^^^^^^^^^ implementation of `Bar` is not general enough | - = note: expected type `Bar<&'a isize>` - found type `Bar<&'b isize>` -note: the required lifetime does not necessarily outlive the lifetime `'b` as defined on the function body at 39:21 - --> $DIR/hrtb-perfect-forwarding.rs:39:21 - | -LL | fn foo_hrtb_bar_not<'b,T>(mut t: T) - | ^^ -note: the lifetime requirement is introduced here - --> $DIR/hrtb-perfect-forwarding.rs:40:15 - | -LL | where T : for<'a> Foo<&'a isize> + Bar<&'b isize> - | ^^^^^^^^^^^^^^^^^^^^^^ + = note: `T` must implement `Bar<&'0 isize>`, for any lifetime `'0`... + = note: ...but it actually implements `Bar<&'b isize>` -error[E0308]: mismatched types - --> $DIR/hrtb-perfect-forwarding.rs:46:5 +error: implementation of `Bar` is not general enough + --> $DIR/hrtb-perfect-forwarding.rs:43:5 | LL | foo_hrtb_bar_not(&mut t); - | ^^^^^^^^^^^^^^^^ lifetime mismatch - | - = note: expected type `Bar<&'a isize>` - found type `Bar<&'b isize>` -note: the lifetime `'b` as defined on the function body at 39:21 doesn't meet the lifetime requirements - --> $DIR/hrtb-perfect-forwarding.rs:39:21 - | -LL | fn foo_hrtb_bar_not<'b,T>(mut t: T) - | ^^ -note: the lifetime requirement is introduced here - --> $DIR/hrtb-perfect-forwarding.rs:40:15 + | ^^^^^^^^^^^^^^^^ implementation of `Bar` is not general enough | -LL | where T : for<'a> Foo<&'a isize> + Bar<&'b isize> - | ^^^^^^^^^^^^^^^^^^^^^^ + = note: `T` must implement `Bar<&'0 isize>`, for any lifetime `'0`... + = note: ...but it actually implements `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-46989.stderr b/src/test/ui/hrtb/issue-46989.stderr index c85c37ff92..f3d906cae4 100644 --- a/src/test/ui/hrtb/issue-46989.stderr +++ b/src/test/ui/hrtb/issue-46989.stderr @@ -1,9 +1,6 @@ error: implementation of `Foo` is not general enough --> $DIR/issue-46989.rs:38:5 | -LL | trait Foo {} - | ------------ trait `Foo` defined here -... LL | assert_foo::(); | ^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough | diff --git a/src/test/ui/issues/issue-40847.rs b/src/test/ui/hygiene/issue-40847.rs similarity index 100% rename from src/test/ui/issues/issue-40847.rs rename to src/test/ui/hygiene/issue-40847.rs diff --git a/src/test/ui/impl-trait/associated-impl-trait-type-generic-trait.full_tait.stderr b/src/test/ui/impl-trait/associated-impl-trait-type-generic-trait.full_tait.stderr new file mode 100644 index 0000000000..174c4c62da --- /dev/null +++ b/src/test/ui/impl-trait/associated-impl-trait-type-generic-trait.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/associated-impl-trait-type-generic-trait.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/impl-trait/associated-impl-trait-type-generic-trait.rs b/src/test/ui/impl-trait/associated-impl-trait-type-generic-trait.rs index 6c7c46b0e3..b2dad596ff 100644 --- a/src/test/ui/impl-trait/associated-impl-trait-type-generic-trait.rs +++ b/src/test/ui/impl-trait/associated-impl-trait-type-generic-trait.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete // build-pass (FIXME(62277): could be check-pass?) trait Bar {} diff --git a/src/test/ui/impl-trait/associated-impl-trait-type-trivial.full_tait.stderr b/src/test/ui/impl-trait/associated-impl-trait-type-trivial.full_tait.stderr new file mode 100644 index 0000000000..e3dd4a60b4 --- /dev/null +++ b/src/test/ui/impl-trait/associated-impl-trait-type-trivial.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/associated-impl-trait-type-trivial.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/impl-trait/associated-impl-trait-type-trivial.rs b/src/test/ui/impl-trait/associated-impl-trait-type-trivial.rs index cdda341cad..c101ba2294 100644 --- a/src/test/ui/impl-trait/associated-impl-trait-type-trivial.rs +++ b/src/test/ui/impl-trait/associated-impl-trait-type-trivial.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete // build-pass (FIXME(62277): could be check-pass?) trait Bar {} diff --git a/src/test/ui/impl-trait/associated-impl-trait-type.full_tait.stderr b/src/test/ui/impl-trait/associated-impl-trait-type.full_tait.stderr new file mode 100644 index 0000000000..39147b00a3 --- /dev/null +++ b/src/test/ui/impl-trait/associated-impl-trait-type.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/associated-impl-trait-type.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/impl-trait/associated-impl-trait-type.rs b/src/test/ui/impl-trait/associated-impl-trait-type.rs index d0661d66f4..5c28eba226 100644 --- a/src/test/ui/impl-trait/associated-impl-trait-type.rs +++ b/src/test/ui/impl-trait/associated-impl-trait-type.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete // build-pass (FIXME(62277): could be check-pass?) trait Bar {} diff --git a/src/test/ui/impl-trait/auto-trait.full_tait.stderr b/src/test/ui/impl-trait/auto-trait.full_tait.stderr new file mode 100644 index 0000000000..7ac08ab492 --- /dev/null +++ b/src/test/ui/impl-trait/auto-trait.full_tait.stderr @@ -0,0 +1,21 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/auto-trait.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0119]: conflicting implementations of trait `AnotherTrait` for type `D`: + --> $DIR/auto-trait.rs:24:1 + | +LL | impl AnotherTrait for T {} + | -------------------------------- first implementation here +... +LL | impl AnotherTrait for D { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `D` + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0119`. diff --git a/src/test/ui/impl-trait/auto-trait.stderr b/src/test/ui/impl-trait/auto-trait.min_tait.stderr similarity index 93% rename from src/test/ui/impl-trait/auto-trait.stderr rename to src/test/ui/impl-trait/auto-trait.min_tait.stderr index 16fe1b56b5..a497dd67e9 100644 --- a/src/test/ui/impl-trait/auto-trait.stderr +++ b/src/test/ui/impl-trait/auto-trait.min_tait.stderr @@ -1,5 +1,5 @@ error[E0119]: conflicting implementations of trait `AnotherTrait` for type `D`: - --> $DIR/auto-trait.rs:21:1 + --> $DIR/auto-trait.rs:24:1 | LL | impl AnotherTrait for T {} | -------------------------------- first implementation here diff --git a/src/test/ui/impl-trait/auto-trait.rs b/src/test/ui/impl-trait/auto-trait.rs index cf2773f4ef..c965a34c12 100644 --- a/src/test/ui/impl-trait/auto-trait.rs +++ b/src/test/ui/impl-trait/auto-trait.rs @@ -1,6 +1,9 @@ // Tests that type alias impls traits do not leak auto-traits for // the purposes of coherence checking -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait OpaqueTrait {} impl OpaqueTrait for T {} diff --git a/src/test/ui/impl-trait/bound-normalization-pass.rs b/src/test/ui/impl-trait/bound-normalization-pass.rs index 3e6884ef10..6a01753b4c 100644 --- a/src/test/ui/impl-trait/bound-normalization-pass.rs +++ b/src/test/ui/impl-trait/bound-normalization-pass.rs @@ -4,7 +4,7 @@ //[sa] compile-flags: -Z save-analysis //-^ To make this the regression test for #75962. -#![feature(type_alias_impl_trait)] +#![feature(min_type_alias_impl_trait)] #![feature(impl_trait_in_bindings)] //~^ WARNING the feature `impl_trait_in_bindings` is incomplete diff --git a/src/test/ui/impl-trait/impl-trait-in-macro.rs b/src/test/ui/impl-trait/impl-trait-in-macro.rs new file mode 100644 index 0000000000..3165c9b991 --- /dev/null +++ b/src/test/ui/impl-trait/impl-trait-in-macro.rs @@ -0,0 +1,20 @@ +use std::fmt::Debug; + +macro_rules! i { + ($($tr:tt)*) => { impl $($tr)* }; +} + +fn foo(x: i!(Debug), y: i!(Debug)) -> String { + let mut a = x; + a = y; //~ ERROR mismatched + format!("{:?}", a) +} + +trait S {} + +fn much_universe, U: IntoIterator)>>( + _: i!(Debug + Clone), +) { +} + +fn main() {} diff --git a/src/test/ui/impl-trait/impl-trait-in-macro.stderr b/src/test/ui/impl-trait/impl-trait-in-macro.stderr new file mode 100644 index 0000000000..b5f9986ce4 --- /dev/null +++ b/src/test/ui/impl-trait/impl-trait-in-macro.stderr @@ -0,0 +1,20 @@ +error[E0308]: mismatched types + --> $DIR/impl-trait-in-macro.rs:9:9 + | +LL | ($($tr:tt)*) => { impl $($tr)* }; + | ---- + | | + | expected type parameter + | found type parameter +... +LL | a = y; + | ^ expected type parameter `impl Debug`, found a different type parameter `impl Debug` + | + = note: expected type parameter `impl Debug` (type parameter `impl Debug`) + found type parameter `impl Debug` (type parameter `impl Debug`) + = note: a type parameter was expected, but a different one was found; you might be missing a type parameter or trait bound + = note: for more information, visit https://doc.rust-lang.org/book/ch10-02-traits.html#traits-as-parameters + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/impl-trait/issue-55872-1.full_tait.stderr b/src/test/ui/impl-trait/issue-55872-1.full_tait.stderr new file mode 100644 index 0000000000..5195333884 --- /dev/null +++ b/src/test/ui/impl-trait/issue-55872-1.full_tait.stderr @@ -0,0 +1,57 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-55872-1.rs:4:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0276]: impl has stricter requirements than trait + --> $DIR/issue-55872-1.rs:18:5 + | +LL | fn foo() -> Self::E; + | ----------------------- definition of `foo` from trait +... +LL | fn foo() -> Self::E { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl has extra requirement `T: Default` + +error[E0277]: the trait bound `S: Copy` is not satisfied in `(S, T)` + --> $DIR/issue-55872-1.rs:14:14 + | +LL | type E = impl Copy; + | ^^^^^^^^^ within `(S, T)`, the trait `Copy` is not implemented for `S` + | + = note: required because it appears within the type `(S, T)` +help: consider further restricting this bound + | +LL | impl Bar for S { + | ^^^^^^ + +error[E0277]: the trait bound `T: Copy` is not satisfied in `(S, T)` + --> $DIR/issue-55872-1.rs:14:14 + | +LL | type E = impl Copy; + | ^^^^^^^^^ within `(S, T)`, the trait `Copy` is not implemented for `T` + | + = note: required because it appears within the type `(S, T)` +help: consider further restricting this bound + | +LL | fn foo() -> Self::E { + | ^^^^^^ + +error: type parameter `T` is part of concrete type but not used in parameter list for the `impl Trait` type alias + --> $DIR/issue-55872-1.rs:18:37 + | +LL | fn foo() -> Self::E { + | _____________________________________^ +LL | | +LL | | +LL | | (S::default(), T::default()) +LL | | } + | |_____^ + +error: aborting due to 4 previous errors; 1 warning emitted + +Some errors have detailed explanations: E0276, E0277. +For more information about an error, try `rustc --explain E0276`. diff --git a/src/test/ui/impl-trait/issue-55872-1.stderr b/src/test/ui/impl-trait/issue-55872-1.min_tait.stderr similarity index 91% rename from src/test/ui/impl-trait/issue-55872-1.stderr rename to src/test/ui/impl-trait/issue-55872-1.min_tait.stderr index 64c536cf1f..26fc200c2a 100644 --- a/src/test/ui/impl-trait/issue-55872-1.stderr +++ b/src/test/ui/impl-trait/issue-55872-1.min_tait.stderr @@ -1,5 +1,5 @@ error[E0276]: impl has stricter requirements than trait - --> $DIR/issue-55872-1.rs:15:5 + --> $DIR/issue-55872-1.rs:18:5 | LL | fn foo() -> Self::E; | ----------------------- definition of `foo` from trait @@ -8,7 +8,7 @@ LL | fn foo() -> Self::E { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ impl has extra requirement `T: Default` error[E0277]: the trait bound `S: Copy` is not satisfied in `(S, T)` - --> $DIR/issue-55872-1.rs:11:14 + --> $DIR/issue-55872-1.rs:14:14 | LL | type E = impl Copy; | ^^^^^^^^^ within `(S, T)`, the trait `Copy` is not implemented for `S` @@ -20,7 +20,7 @@ LL | impl Bar for S { | ^^^^^^ error[E0277]: the trait bound `T: Copy` is not satisfied in `(S, T)` - --> $DIR/issue-55872-1.rs:11:14 + --> $DIR/issue-55872-1.rs:14:14 | LL | type E = impl Copy; | ^^^^^^^^^ within `(S, T)`, the trait `Copy` is not implemented for `T` @@ -32,7 +32,7 @@ LL | fn foo() -> Self::E { | ^^^^^^ error: type parameter `T` is part of concrete type but not used in parameter list for the `impl Trait` type alias - --> $DIR/issue-55872-1.rs:15:37 + --> $DIR/issue-55872-1.rs:18:37 | LL | fn foo() -> Self::E { | _____________________________________^ diff --git a/src/test/ui/impl-trait/issue-55872-1.rs b/src/test/ui/impl-trait/issue-55872-1.rs index a746ed09af..e5e437cd84 100644 --- a/src/test/ui/impl-trait/issue-55872-1.rs +++ b/src/test/ui/impl-trait/issue-55872-1.rs @@ -1,5 +1,8 @@ // ignore-tidy-linelength -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete pub trait Bar { type E: Copy; diff --git a/src/test/ui/impl-trait/issue-55872-2.full_tait.stderr b/src/test/ui/impl-trait/issue-55872-2.full_tait.stderr new file mode 100644 index 0000000000..14a5c0ba97 --- /dev/null +++ b/src/test/ui/impl-trait/issue-55872-2.full_tait.stderr @@ -0,0 +1,28 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-55872-2.rs:7:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0277]: the trait bound `impl Future: Copy` is not satisfied + --> $DIR/issue-55872-2.rs:17:14 + | +LL | type E = impl std::marker::Copy; + | ^^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `impl Future` + +error: type parameter `T` is part of concrete type but not used in parameter list for the `impl Trait` type alias + --> $DIR/issue-55872-2.rs:19:28 + | +LL | fn foo() -> Self::E { + | ____________________________^ +LL | | +LL | | async {} +LL | | } + | |_____^ + +error: aborting due to 2 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/impl-trait/issue-55872-2.stderr b/src/test/ui/impl-trait/issue-55872-2.min_tait.stderr similarity index 89% rename from src/test/ui/impl-trait/issue-55872-2.stderr rename to src/test/ui/impl-trait/issue-55872-2.min_tait.stderr index f954ce9f09..c8df502345 100644 --- a/src/test/ui/impl-trait/issue-55872-2.stderr +++ b/src/test/ui/impl-trait/issue-55872-2.min_tait.stderr @@ -1,11 +1,11 @@ error[E0277]: the trait bound `impl Future: Copy` is not satisfied - --> $DIR/issue-55872-2.rs:14:14 + --> $DIR/issue-55872-2.rs:17:14 | LL | type E = impl std::marker::Copy; | ^^^^^^^^^^^^^^^^^^^^^^ the trait `Copy` is not implemented for `impl Future` error: type parameter `T` is part of concrete type but not used in parameter list for the `impl Trait` type alias - --> $DIR/issue-55872-2.rs:16:28 + --> $DIR/issue-55872-2.rs:19:28 | LL | fn foo() -> Self::E { | ____________________________^ diff --git a/src/test/ui/impl-trait/issue-55872-2.rs b/src/test/ui/impl-trait/issue-55872-2.rs index ee09a66ef5..9c2e9b860c 100644 --- a/src/test/ui/impl-trait/issue-55872-2.rs +++ b/src/test/ui/impl-trait/issue-55872-2.rs @@ -2,7 +2,10 @@ // ignore-tidy-linelength // ignore-compare-mode-chalk -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete pub trait Bar { type E: Copy; @@ -14,7 +17,7 @@ impl Bar for S { type E = impl std::marker::Copy; //~^ ERROR the trait bound `impl Future: Copy` is not satisfied [E0277] fn foo() -> Self::E { - //~^ ERROR type parameter `T` is part of concrete type but not used in parameter list for the `impl Trait` type alias + //~^ ERROR type parameter `T` is part of concrete type but not used in parameter list for the `impl Trait` type alias async {} } } diff --git a/src/test/ui/impl-trait/issue-55872.full_tait.stderr b/src/test/ui/impl-trait/issue-55872.full_tait.stderr new file mode 100644 index 0000000000..5a35689a73 --- /dev/null +++ b/src/test/ui/impl-trait/issue-55872.full_tait.stderr @@ -0,0 +1,21 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-55872.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: type parameter `T` is part of concrete type but not used in parameter list for the `impl Trait` type alias + --> $DIR/issue-55872.rs:17:28 + | +LL | fn foo() -> Self::E { + | ____________________________^ +LL | | +LL | | || () +LL | | } + | |_____^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/impl-trait/issue-55872.stderr b/src/test/ui/impl-trait/issue-55872.min_tait.stderr similarity index 89% rename from src/test/ui/impl-trait/issue-55872.stderr rename to src/test/ui/impl-trait/issue-55872.min_tait.stderr index 41d7beb22f..9baf283464 100644 --- a/src/test/ui/impl-trait/issue-55872.stderr +++ b/src/test/ui/impl-trait/issue-55872.min_tait.stderr @@ -1,5 +1,5 @@ error: type parameter `T` is part of concrete type but not used in parameter list for the `impl Trait` type alias - --> $DIR/issue-55872.rs:14:28 + --> $DIR/issue-55872.rs:17:28 | LL | fn foo() -> Self::E { | ____________________________^ diff --git a/src/test/ui/impl-trait/issue-55872.rs b/src/test/ui/impl-trait/issue-55872.rs index b12bfbcda9..9a31cf521b 100644 --- a/src/test/ui/impl-trait/issue-55872.rs +++ b/src/test/ui/impl-trait/issue-55872.rs @@ -1,6 +1,9 @@ // ignore-tidy-linelength // ignore-compare-mode-chalk -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete pub trait Bar { type E: Copy; diff --git a/src/test/ui/impl-trait/issues/issue-53457.full_tait.stderr b/src/test/ui/impl-trait/issues/issue-53457.full_tait.stderr new file mode 100644 index 0000000000..906578c291 --- /dev/null +++ b/src/test/ui/impl-trait/issues/issue-53457.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-53457.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/impl-trait/issues/issue-53457.rs b/src/test/ui/impl-trait/issues/issue-53457.rs index 3f97502492..c44e7f01f2 100644 --- a/src/test/ui/impl-trait/issues/issue-53457.rs +++ b/src/test/ui/impl-trait/issues/issue-53457.rs @@ -1,6 +1,9 @@ // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete type X = impl Clone; diff --git a/src/test/ui/impl-trait/issues/issue-70877.stderr b/src/test/ui/impl-trait/issues/issue-70877.full_tait.stderr similarity index 95% rename from src/test/ui/impl-trait/issues/issue-70877.stderr rename to src/test/ui/impl-trait/issues/issue-70877.full_tait.stderr index 3ef7087b08..bd4d4fdf2a 100644 --- a/src/test/ui/impl-trait/issues/issue-70877.stderr +++ b/src/test/ui/impl-trait/issues/issue-70877.full_tait.stderr @@ -1,5 +1,5 @@ error[E0271]: type mismatch resolving `::Item == Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> Option + 'static)>` - --> $DIR/issue-70877.rs:9:12 + --> $DIR/issue-70877.rs:11:12 | LL | type FooRet = impl std::fmt::Debug; | -------------------- the expected opaque type diff --git a/src/test/ui/impl-trait/issues/issue-70877.min_tait.stderr b/src/test/ui/impl-trait/issues/issue-70877.min_tait.stderr new file mode 100644 index 0000000000..bd4d4fdf2a --- /dev/null +++ b/src/test/ui/impl-trait/issues/issue-70877.min_tait.stderr @@ -0,0 +1,15 @@ +error[E0271]: type mismatch resolving `::Item == Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> Option + 'static)>` + --> $DIR/issue-70877.rs:11:12 + | +LL | type FooRet = impl std::fmt::Debug; + | -------------------- the expected opaque type +... +LL | type Foo = impl Iterator; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected opaque type, found enum `Option` + | + = note: expected struct `Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> impl Debug + 'static)>` + found struct `Box<(dyn for<'r> Fn(&'r (dyn ToString + 'r)) -> Option + 'static)>` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0271`. diff --git a/src/test/ui/impl-trait/issues/issue-70877.rs b/src/test/ui/impl-trait/issues/issue-70877.rs index a4a59f98fd..7ca0f90e2d 100644 --- a/src/test/ui/impl-trait/issues/issue-70877.rs +++ b/src/test/ui/impl-trait/issues/issue-70877.rs @@ -1,4 +1,6 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] #![feature(impl_trait_in_bindings)] #![allow(incomplete_features)] diff --git a/src/test/ui/impl-trait/issues/issue-78722.full_tait.stderr b/src/test/ui/impl-trait/issues/issue-78722.full_tait.stderr new file mode 100644 index 0000000000..d7327aa46b --- /dev/null +++ b/src/test/ui/impl-trait/issues/issue-78722.full_tait.stderr @@ -0,0 +1,35 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-78722.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-78722.rs:7:12 + | +LL | #![feature(impl_trait_in_bindings)] + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + +error: `async` blocks are not allowed in constants + --> $DIR/issue-78722.rs:17:20 + | +LL | let f: F = async { 1 }; + | ^^^^^^^^^^^ + +error[E0493]: destructors cannot be evaluated at compile-time + --> $DIR/issue-78722.rs:17:13 + | +LL | let f: F = async { 1 }; + | ^ constants cannot evaluate destructors +... +LL | }], + | - value is dropped here + +error: aborting due to 2 previous errors; 2 warnings emitted + +For more information about this error, try `rustc --explain E0493`. diff --git a/src/test/ui/impl-trait/issues/issue-78722.stderr b/src/test/ui/impl-trait/issues/issue-78722.min_tait.stderr similarity index 89% rename from src/test/ui/impl-trait/issues/issue-78722.stderr rename to src/test/ui/impl-trait/issues/issue-78722.min_tait.stderr index 0e1e92b912..01ec71e7a5 100644 --- a/src/test/ui/impl-trait/issues/issue-78722.stderr +++ b/src/test/ui/impl-trait/issues/issue-78722.min_tait.stderr @@ -1,5 +1,5 @@ warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/issue-78722.rs:4:12 + --> $DIR/issue-78722.rs:7:12 | LL | #![feature(impl_trait_in_bindings)] | ^^^^^^^^^^^^^^^^^^^^^^ @@ -8,13 +8,13 @@ LL | #![feature(impl_trait_in_bindings)] = note: see issue #63065 for more information error: `async` blocks are not allowed in constants - --> $DIR/issue-78722.rs:14:20 + --> $DIR/issue-78722.rs:17:20 | LL | let f: F = async { 1 }; | ^^^^^^^^^^^ error[E0493]: destructors cannot be evaluated at compile-time - --> $DIR/issue-78722.rs:14:13 + --> $DIR/issue-78722.rs:17:13 | LL | let f: F = async { 1 }; | ^ constants cannot evaluate destructors diff --git a/src/test/ui/impl-trait/issues/issue-78722.rs b/src/test/ui/impl-trait/issues/issue-78722.rs index 58734d3a44..0999ec63e0 100644 --- a/src/test/ui/impl-trait/issues/issue-78722.rs +++ b/src/test/ui/impl-trait/issues/issue-78722.rs @@ -1,6 +1,9 @@ // edition:2018 -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #![feature(impl_trait_in_bindings)] //~^ WARN the feature `impl_trait_in_bindings` is incomplete diff --git a/src/test/ui/impl-trait/multiple-lifetimes/error-handling-2.full_tait.stderr b/src/test/ui/impl-trait/multiple-lifetimes/error-handling-2.full_tait.stderr new file mode 100644 index 0000000000..b2ebc7230b --- /dev/null +++ b/src/test/ui/impl-trait/multiple-lifetimes/error-handling-2.full_tait.stderr @@ -0,0 +1,24 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/error-handling-2.rs:6:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds + --> $DIR/error-handling-2.rs:16:60 + | +LL | fn foo<'a: 'b, 'b, 'c>(x: &'static i32, mut y: &'a i32) -> E<'b, 'c> { + | ^^^^^^^^^ + | +note: hidden type `*mut &'a i32` captures the lifetime `'a` as defined on the function body at 16:8 + --> $DIR/error-handling-2.rs:16:8 + | +LL | fn foo<'a: 'b, 'b, 'c>(x: &'static i32, mut y: &'a i32) -> E<'b, 'c> { + | ^^ + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0700`. diff --git a/src/test/ui/impl-trait/multiple-lifetimes/error-handling-2.stderr b/src/test/ui/impl-trait/multiple-lifetimes/error-handling-2.min_tait.stderr similarity index 82% rename from src/test/ui/impl-trait/multiple-lifetimes/error-handling-2.stderr rename to src/test/ui/impl-trait/multiple-lifetimes/error-handling-2.min_tait.stderr index 59105f1180..53745c290d 100644 --- a/src/test/ui/impl-trait/multiple-lifetimes/error-handling-2.stderr +++ b/src/test/ui/impl-trait/multiple-lifetimes/error-handling-2.min_tait.stderr @@ -1,11 +1,11 @@ error[E0700]: hidden type for `impl Trait` captures lifetime that does not appear in bounds - --> $DIR/error-handling-2.rs:13:60 + --> $DIR/error-handling-2.rs:16:60 | LL | fn foo<'a: 'b, 'b, 'c>(x: &'static i32, mut y: &'a i32) -> E<'b, 'c> { | ^^^^^^^^^ | -note: hidden type `*mut &'a i32` captures the lifetime `'a` as defined on the function body at 13:8 - --> $DIR/error-handling-2.rs:13:8 +note: hidden type `*mut &'a i32` captures the lifetime `'a` as defined on the function body at 16:8 + --> $DIR/error-handling-2.rs:16:8 | LL | fn foo<'a: 'b, 'b, 'c>(x: &'static i32, mut y: &'a i32) -> E<'b, 'c> { | ^^ diff --git a/src/test/ui/impl-trait/multiple-lifetimes/error-handling-2.rs b/src/test/ui/impl-trait/multiple-lifetimes/error-handling-2.rs index 96d891b2cf..196ddf9b8e 100644 --- a/src/test/ui/impl-trait/multiple-lifetimes/error-handling-2.rs +++ b/src/test/ui/impl-trait/multiple-lifetimes/error-handling-2.rs @@ -1,7 +1,10 @@ // compile-flags:-Zborrowck=mir #![feature(member_constraints)] -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #[derive(Clone)] struct CopyIfEq(T, U); diff --git a/src/test/ui/impl-trait/multiple-lifetimes/error-handling.full_tait.stderr b/src/test/ui/impl-trait/multiple-lifetimes/error-handling.full_tait.stderr new file mode 100644 index 0000000000..d7a9e5463b --- /dev/null +++ b/src/test/ui/impl-trait/multiple-lifetimes/error-handling.full_tait.stderr @@ -0,0 +1,24 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/error-handling.rs:6:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: lifetime may not live long enough + --> $DIR/error-handling.rs:26:16 + | +LL | fn foo<'a, 'b, 'c>(x: &'static i32, mut y: &'a i32) -> E<'b, 'c> { + | -- -- lifetime `'b` defined here + | | + | lifetime `'a` defined here +... +LL | let _: &'b i32 = *u.0; + | ^^^^^^^ type annotation requires that `'a` must outlive `'b` + | + = help: consider adding the following bound: `'a: 'b` + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/impl-trait/multiple-lifetimes/error-handling.stderr b/src/test/ui/impl-trait/multiple-lifetimes/error-handling.min_tait.stderr similarity index 92% rename from src/test/ui/impl-trait/multiple-lifetimes/error-handling.stderr rename to src/test/ui/impl-trait/multiple-lifetimes/error-handling.min_tait.stderr index 6ce3aaf49e..e2d745cdec 100644 --- a/src/test/ui/impl-trait/multiple-lifetimes/error-handling.stderr +++ b/src/test/ui/impl-trait/multiple-lifetimes/error-handling.min_tait.stderr @@ -1,5 +1,5 @@ error: lifetime may not live long enough - --> $DIR/error-handling.rs:23:16 + --> $DIR/error-handling.rs:26:16 | LL | fn foo<'a, 'b, 'c>(x: &'static i32, mut y: &'a i32) -> E<'b, 'c> { | -- -- lifetime `'b` defined here diff --git a/src/test/ui/impl-trait/multiple-lifetimes/error-handling.rs b/src/test/ui/impl-trait/multiple-lifetimes/error-handling.rs index 8d02d63509..b5adabb7ab 100644 --- a/src/test/ui/impl-trait/multiple-lifetimes/error-handling.rs +++ b/src/test/ui/impl-trait/multiple-lifetimes/error-handling.rs @@ -1,7 +1,10 @@ // compile-flags:-Zborrowck=mir #![feature(member_constraints)] -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #[derive(Clone)] struct CopyIfEq(T, U); diff --git a/src/test/ui/impl-trait/multiple-lifetimes/ordinary-bounds-pick-original-type-alias-impl-trait.rs b/src/test/ui/impl-trait/multiple-lifetimes/ordinary-bounds-pick-original-type-alias-impl-trait.rs index 877940c740..9d345502aa 100644 --- a/src/test/ui/impl-trait/multiple-lifetimes/ordinary-bounds-pick-original-type-alias-impl-trait.rs +++ b/src/test/ui/impl-trait/multiple-lifetimes/ordinary-bounds-pick-original-type-alias-impl-trait.rs @@ -4,8 +4,7 @@ //[mir]compile-flags: -Z borrowck=mir #![feature(member_constraints)] -#![feature(type_alias_impl_trait)] - +#![feature(min_type_alias_impl_trait)] trait Trait<'a, 'b> { } impl Trait<'_, '_> for T { } diff --git a/src/test/ui/impl-trait/negative-reasoning.full_tait.stderr b/src/test/ui/impl-trait/negative-reasoning.full_tait.stderr new file mode 100644 index 0000000000..2611205893 --- /dev/null +++ b/src/test/ui/impl-trait/negative-reasoning.full_tait.stderr @@ -0,0 +1,23 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/negative-reasoning.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0119]: conflicting implementations of trait `AnotherTrait` for type `D`: + --> $DIR/negative-reasoning.rs:22:1 + | +LL | impl AnotherTrait for T {} + | ------------------------------------------- first implementation here +... +LL | impl AnotherTrait for D { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ conflicting implementation for `D` + | + = note: upstream crates may add a new impl of trait `std::fmt::Debug` for type `impl OpaqueTrait` in future versions + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0119`. diff --git a/src/test/ui/impl-trait/negative-reasoning.stderr b/src/test/ui/impl-trait/negative-reasoning.min_tait.stderr similarity index 94% rename from src/test/ui/impl-trait/negative-reasoning.stderr rename to src/test/ui/impl-trait/negative-reasoning.min_tait.stderr index e43d8c857b..bd74b56fec 100644 --- a/src/test/ui/impl-trait/negative-reasoning.stderr +++ b/src/test/ui/impl-trait/negative-reasoning.min_tait.stderr @@ -1,5 +1,5 @@ error[E0119]: conflicting implementations of trait `AnotherTrait` for type `D`: - --> $DIR/negative-reasoning.rs:19:1 + --> $DIR/negative-reasoning.rs:22:1 | LL | impl AnotherTrait for T {} | ------------------------------------------- first implementation here diff --git a/src/test/ui/impl-trait/negative-reasoning.rs b/src/test/ui/impl-trait/negative-reasoning.rs index d173fe83fb..7f608cc99d 100644 --- a/src/test/ui/impl-trait/negative-reasoning.rs +++ b/src/test/ui/impl-trait/negative-reasoning.rs @@ -1,6 +1,9 @@ // Tests that we cannot assume that an opaque type does *not* implement some // other trait -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait OpaqueTrait {} impl OpaqueTrait for T {} diff --git a/src/test/ui/impl-trait/trait_type.stderr b/src/test/ui/impl-trait/trait_type.stderr index e94f2c7021..961bb73511 100644 --- a/src/test/ui/impl-trait/trait_type.stderr +++ b/src/test/ui/impl-trait/trait_type.stderr @@ -4,7 +4,7 @@ error[E0053]: method `fmt` has an incompatible type for trait LL | fn fmt(&self, x: &str) -> () { } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ types differ in mutability | - = note: expected fn pointer `fn(&MyType, &mut Formatter<'_>) -> std::result::Result<(), std::fmt::Error>` + = note: expected fn pointer `fn(&MyType, &mut Formatter<'_>) -> Result<(), std::fmt::Error>` found fn pointer `fn(&MyType, &str)` error[E0050]: method `fmt` has 1 parameter but the declaration in trait `std::fmt::Display::fmt` has 2 @@ -13,7 +13,7 @@ error[E0050]: method `fmt` has 1 parameter but the declaration in trait `std::fm LL | fn fmt(&self) -> () { } | ^^^^^ expected 2 parameters, found 1 | - = note: `fmt` from trait: `fn(&Self, &mut Formatter<'_>) -> std::result::Result<(), std::fmt::Error>` + = note: `fmt` from trait: `fn(&Self, &mut Formatter<'_>) -> Result<(), std::fmt::Error>` error[E0186]: method `fmt` has a `&self` declaration in the trait, but not in the impl --> $DIR/trait_type.rs:17:4 @@ -21,7 +21,7 @@ error[E0186]: method `fmt` has a `&self` declaration in the trait, but not in th LL | fn fmt() -> () { } | ^^^^^^^^^^^^^^ expected `&self` in impl | - = note: `fmt` from trait: `fn(&Self, &mut Formatter<'_>) -> std::result::Result<(), std::fmt::Error>` + = note: `fmt` from trait: `fn(&Self, &mut Formatter<'_>) -> Result<(), std::fmt::Error>` error[E0046]: not all trait items implemented, missing: `fmt` --> $DIR/trait_type.rs:21:1 @@ -29,7 +29,7 @@ error[E0046]: not all trait items implemented, missing: `fmt` LL | impl std::fmt::Display for MyType4 {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `fmt` in implementation | - = help: implement the missing item: `fn fmt(&self, _: &mut Formatter<'_>) -> std::result::Result<(), std::fmt::Error> { todo!() }` + = help: implement the missing item: `fn fmt(&self, _: &mut Formatter<'_>) -> Result<(), std::fmt::Error> { todo!() }` error: aborting due to 4 previous errors diff --git a/src/test/ui/impl-trait/type-alias-generic-param.full_tait.stderr b/src/test/ui/impl-trait/type-alias-generic-param.full_tait.stderr new file mode 100644 index 0000000000..965e3e4887 --- /dev/null +++ b/src/test/ui/impl-trait/type-alias-generic-param.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/type-alias-generic-param.rs:8:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/impl-trait/type-alias-generic-param.rs b/src/test/ui/impl-trait/type-alias-generic-param.rs index d834d9bb11..733e10e56f 100644 --- a/src/test/ui/impl-trait/type-alias-generic-param.rs +++ b/src/test/ui/impl-trait/type-alias-generic-param.rs @@ -3,7 +3,10 @@ // types in 'item' position when generic parameters are involved // // run-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait Meow { type MeowType; diff --git a/src/test/ui/impl-trait/type-alias-impl-trait-in-fn-body.full_tait.stderr b/src/test/ui/impl-trait/type-alias-impl-trait-in-fn-body.full_tait.stderr new file mode 100644 index 0000000000..ec939e5718 --- /dev/null +++ b/src/test/ui/impl-trait/type-alias-impl-trait-in-fn-body.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/type-alias-impl-trait-in-fn-body.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/impl-trait/type-alias-impl-trait-in-fn-body.rs b/src/test/ui/impl-trait/type-alias-impl-trait-in-fn-body.rs index 91be4efd56..32ca4af304 100644 --- a/src/test/ui/impl-trait/type-alias-impl-trait-in-fn-body.rs +++ b/src/test/ui/impl-trait/type-alias-impl-trait-in-fn-body.rs @@ -1,6 +1,9 @@ // build-pass (FIXME(62277): could be check-pass?) -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::fmt::Debug; diff --git a/src/test/ui/impl-trait/universal-two-impl-traits.rs b/src/test/ui/impl-trait/universal-two-impl-traits.rs index 1ed47d8f49..689c240128 100644 --- a/src/test/ui/impl-trait/universal-two-impl-traits.rs +++ b/src/test/ui/impl-trait/universal-two-impl-traits.rs @@ -6,4 +6,11 @@ fn foo(x: impl Debug, y: impl Debug) -> String { format!("{:?}", a) } -fn main() { } +trait S {} + +fn much_universe, U: IntoIterator>>( + _: impl Debug + Clone, +) { +} + +fn main() {} diff --git a/src/test/ui/impl-trait/where-allowed.stderr b/src/test/ui/impl-trait/where-allowed.stderr index 93f9724140..3fdeddc0a8 100644 --- a/src/test/ui/impl-trait/where-allowed.stderr +++ b/src/test/ui/impl-trait/where-allowed.stderr @@ -23,7 +23,7 @@ LL | type Out = impl Debug; | ^^^^^^^^^^ | = note: see issue #63063 for more information - = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable error[E0658]: `impl Trait` in type aliases is unstable --> $DIR/where-allowed.rs:157:23 @@ -32,7 +32,7 @@ LL | type InTypeAlias = impl Debug; | ^^^^^^^^^^ | = note: see issue #63063 for more information - = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable error[E0658]: `impl Trait` in type aliases is unstable --> $DIR/where-allowed.rs:161:39 @@ -41,7 +41,7 @@ LL | type InReturnInTypeAlias = fn() -> impl Debug; | ^^^^^^^^^^ | = note: see issue #63063 for more information - = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable error[E0562]: `impl Trait` not allowed outside of function and inherent method return types --> $DIR/where-allowed.rs:15:40 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 016c48118b..4cda077585 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 @@ -24,10 +24,10 @@ LL | extern crate std as Vec; LL | define_vec!(); | -------------- in this macro invocation note: `Vec` could also refer to the struct defined here - --> $SRC_DIR/std/src/prelude/v1.rs:LL:COL + --> $SRC_DIR/std/src/prelude/mod.rs:LL:COL | -LL | pub use crate::vec::Vec; - | ^^^^^^^^^^^^^^^ +LL | pub use super::v1::*; + | ^^^^^^^^^^^^ = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 2 previous errors diff --git a/src/test/ui/inference/auxiliary/inference_unstable_iterator.rs b/src/test/ui/inference/auxiliary/inference_unstable_iterator.rs index 0dc09704e7..91fc398f74 100644 --- a/src/test/ui/inference/auxiliary/inference_unstable_iterator.rs +++ b/src/test/ui/inference/auxiliary/inference_unstable_iterator.rs @@ -8,7 +8,11 @@ pub trait IpuIterator { fn ipu_flatten(&self) -> u32 { 0 } + #[unstable(feature = "assoc_const_ipu_iter", issue = "99999")] + const C: i32; } #[stable(feature = "ipu_iterator", since = "1.0.0")] -impl IpuIterator for char {} +impl IpuIterator for char { + const C: i32 = 42; +} diff --git a/src/test/ui/inference/auxiliary/inference_unstable_itertools.rs b/src/test/ui/inference/auxiliary/inference_unstable_itertools.rs index 964f35ddad..e00adda5c3 100644 --- a/src/test/ui/inference/auxiliary/inference_unstable_itertools.rs +++ b/src/test/ui/inference/auxiliary/inference_unstable_itertools.rs @@ -2,6 +2,10 @@ pub trait IpuItertools { fn ipu_flatten(&self) -> u32 { 1 } + + const C: i32; } -impl IpuItertools for char {} +impl IpuItertools for char { + const C: i32 = 1; +} diff --git a/src/test/ui/inference/cannot-infer-closure-circular.stderr b/src/test/ui/inference/cannot-infer-closure-circular.stderr index 5efb400a4c..211ae13e46 100644 --- a/src/test/ui/inference/cannot-infer-closure-circular.stderr +++ b/src/test/ui/inference/cannot-infer-closure-circular.stderr @@ -1,8 +1,8 @@ -error[E0282]: type annotations needed for `std::result::Result<(), E>` +error[E0282]: type annotations needed for `Result<(), E>` --> $DIR/cannot-infer-closure-circular.rs:7:14 | LL | let x = |r| { - | ^ consider giving this closure parameter the explicit type `std::result::Result<(), E>`, with the type parameters specified + | ^ consider giving this closure parameter the explicit type `Result<(), E>`, with the type parameters specified error: aborting due to previous error diff --git a/src/test/ui/inference/cannot-infer-closure.stderr b/src/test/ui/inference/cannot-infer-closure.stderr index 475ed00d10..0dcce9e990 100644 --- a/src/test/ui/inference/cannot-infer-closure.stderr +++ b/src/test/ui/inference/cannot-infer-closure.stderr @@ -1,4 +1,4 @@ -error[E0282]: type annotations needed for the closure `fn((), ()) -> std::result::Result<(), _>` +error[E0282]: type annotations needed for the closure `fn((), ()) -> Result<(), _>` --> $DIR/cannot-infer-closure.rs:3:15 | LL | Err(a)?; @@ -7,8 +7,8 @@ LL | Err(a)?; = note: `?` implicitly converts the error value into a type implementing `From<()>` help: give this closure an explicit return type without `_` placeholders | -LL | let x = |a: (), b: ()| -> std::result::Result<(), _> { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | let x = |a: (), b: ()| -> Result<(), _> { + | ^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/inference/cannot-infer-partial-try-return.stderr b/src/test/ui/inference/cannot-infer-partial-try-return.stderr index a64503fa66..86e2126e1a 100644 --- a/src/test/ui/inference/cannot-infer-partial-try-return.stderr +++ b/src/test/ui/inference/cannot-infer-partial-try-return.stderr @@ -1,4 +1,4 @@ -error[E0282]: type annotations needed for the closure `fn() -> std::result::Result<(), QualifiedError<_>>` +error[E0282]: type annotations needed for the closure `fn() -> Result<(), QualifiedError<_>>` --> $DIR/cannot-infer-partial-try-return.rs:19:9 | LL | infallible()?; @@ -7,8 +7,8 @@ LL | infallible()?; = note: `?` implicitly converts the error value into `QualifiedError<_>` using its implementation of `From` help: give this closure an explicit return type without `_` placeholders | -LL | let x = || -> std::result::Result<(), QualifiedError<_>> { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | let x = || -> Result<(), QualifiedError<_>> { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/inference/inference_unstable.rs b/src/test/ui/inference/inference_unstable.rs index 0b95770018..86bb62b8a5 100644 --- a/src/test/ui/inference/inference_unstable.rs +++ b/src/test/ui/inference/inference_unstable.rs @@ -14,6 +14,9 @@ use inference_unstable_itertools::IpuItertools; fn main() { assert_eq!('x'.ipu_flatten(), 1); - //~^ WARN a method with this name may be added to the standard library in the future - //~^^ WARN once this method is added to the standard library, the ambiguity may cause an error +//~^ WARN an associated function with this name may be added to the standard library in the future +//~| WARN once this associated item is added to the standard library, the ambiguity may cause an + assert_eq!(char::C, 1); +//~^ WARN an associated constant with this name may be added to the standard library in the future +//~| WARN once this associated item is added to the standard library, the ambiguity may cause an } diff --git a/src/test/ui/inference/inference_unstable.stderr b/src/test/ui/inference/inference_unstable.stderr index df52012463..2c282e610b 100644 --- a/src/test/ui/inference/inference_unstable.stderr +++ b/src/test/ui/inference/inference_unstable.stderr @@ -1,14 +1,24 @@ -warning: a method with this name may be added to the standard library in the future +warning: an associated function with this name may be added to the standard library in the future --> $DIR/inference_unstable.rs:16:20 | LL | assert_eq!('x'.ipu_flatten(), 1); | ^^^^^^^^^^^ | = note: `#[warn(unstable_name_collisions)]` on by default - = warning: once this method is added to the standard library, the ambiguity may cause an error or change in behavior! + = warning: once this associated item is added to the standard library, the ambiguity may cause an error or change in behavior! = note: for more information, see issue #48919 = help: call with fully qualified syntax `inference_unstable_itertools::IpuItertools::ipu_flatten(...)` to keep using the current method = help: add `#![feature(ipu_flatten)]` to the crate attributes to enable `inference_unstable_iterator::IpuIterator::ipu_flatten` -warning: 1 warning emitted +warning: an associated constant with this name may be added to the standard library in the future + --> $DIR/inference_unstable.rs:19:16 + | +LL | assert_eq!(char::C, 1); + | ^^^^^^^ help: use the fully qualified path to the associated const: `::C` + | + = warning: once this associated item is added to the standard library, the ambiguity may cause an error or change in behavior! + = note: for more information, see issue #48919 + = help: add `#![feature(assoc_const_ipu_iter)]` to the crate attributes to enable `inference_unstable_iterator::IpuIterator::C` + +warning: 2 warnings emitted diff --git a/src/test/ui/inference/issue-72616.stderr b/src/test/ui/inference/issue-72616.stderr index d811988c9c..3c9d864c42 100644 --- a/src/test/ui/inference/issue-72616.stderr +++ b/src/test/ui/inference/issue-72616.stderr @@ -2,7 +2,7 @@ error[E0283]: type annotations needed --> $DIR/issue-72616.rs:20:30 | LL | if String::from("a") == "a".try_into().unwrap() {} - | ^^ -------------- this method call resolves to `std::result::Result>::Error>` + | ^^ -------------- this method call resolves to `Result>::Error>` | | | cannot infer type | diff --git a/src/test/ui/invalid/invalid-no-sanitize.stderr b/src/test/ui/invalid/invalid-no-sanitize.stderr index e9983e5fbd..4c0b17c7d3 100644 --- a/src/test/ui/invalid/invalid-no-sanitize.stderr +++ b/src/test/ui/invalid/invalid-no-sanitize.stderr @@ -4,7 +4,7 @@ error: invalid argument for `no_sanitize` LL | #[no_sanitize(brontosaurus)] | ^^^^^^^^^^^^ | - = note: expected one of: `address`, `memory` or `thread` + = note: expected one of: `address`, `hwaddress`, `memory` or `thread` error: aborting due to previous error diff --git a/src/test/ui/invalid-rustc_args_required_const-arguments.rs b/src/test/ui/invalid/invalid-rustc_args_required_const-arguments.rs similarity index 100% rename from src/test/ui/invalid-rustc_args_required_const-arguments.rs rename to src/test/ui/invalid/invalid-rustc_args_required_const-arguments.rs diff --git a/src/test/ui/invalid-rustc_args_required_const-arguments.stderr b/src/test/ui/invalid/invalid-rustc_args_required_const-arguments.stderr similarity index 100% rename from src/test/ui/invalid-rustc_args_required_const-arguments.stderr rename to src/test/ui/invalid/invalid-rustc_args_required_const-arguments.stderr diff --git a/src/test/ui/invalid/invalid-rustc_legacy_const_generics-arguments.rs b/src/test/ui/invalid/invalid-rustc_legacy_const_generics-arguments.rs new file mode 100644 index 0000000000..3d8478f06d --- /dev/null +++ b/src/test/ui/invalid/invalid-rustc_legacy_const_generics-arguments.rs @@ -0,0 +1,38 @@ +#![feature(rustc_attrs)] + +#[rustc_legacy_const_generics(0)] //~ ERROR #[rustc_legacy_const_generics] must have one index for +fn foo1() {} + +#[rustc_legacy_const_generics(1)] //~ ERROR index exceeds number of arguments +fn foo2() {} + +#[rustc_legacy_const_generics(2)] //~ ERROR index exceeds number of arguments +fn foo3(_: u8) {} + +#[rustc_legacy_const_generics(a)] //~ ERROR arguments should be non-negative integers +fn foo4() {} + +#[rustc_legacy_const_generics(1, a, 2, b)] //~ ERROR arguments should be non-negative integers +fn foo5() {} + +#[rustc_legacy_const_generics(0)] //~ ERROR attribute should be applied to a function +struct S; + +#[rustc_legacy_const_generics(0usize)] //~ ERROR suffixed literals are not allowed in attributes +fn foo6() {} + +extern { + #[rustc_legacy_const_generics(1)] //~ ERROR attribute should be applied to a function + fn foo7(); //~ ERROR foreign items may not have const parameters +} + +#[rustc_legacy_const_generics(0)] //~ ERROR #[rustc_legacy_const_generics] functions must only have +fn foo8() {} + +#[rustc_legacy_const_generics] //~ ERROR malformed `rustc_legacy_const_generics` attribute +fn bar1() {} + +#[rustc_legacy_const_generics = 1] //~ ERROR malformed `rustc_legacy_const_generics` attribute +fn bar2() {} + +fn main() {} diff --git a/src/test/ui/invalid/invalid-rustc_legacy_const_generics-arguments.stderr b/src/test/ui/invalid/invalid-rustc_legacy_const_generics-arguments.stderr new file mode 100644 index 0000000000..1f55a8e72d --- /dev/null +++ b/src/test/ui/invalid/invalid-rustc_legacy_const_generics-arguments.stderr @@ -0,0 +1,87 @@ +error: suffixed literals are not allowed in attributes + --> $DIR/invalid-rustc_legacy_const_generics-arguments.rs:21:31 + | +LL | #[rustc_legacy_const_generics(0usize)] + | ^^^^^^ + | + = help: instead of using a suffixed literal (`1u8`, `1.0f32`, etc.), use an unsuffixed version (`1`, `1.0`, etc.) + +error: malformed `rustc_legacy_const_generics` attribute input + --> $DIR/invalid-rustc_legacy_const_generics-arguments.rs:32:1 + | +LL | #[rustc_legacy_const_generics] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: must be of the form: `#[rustc_legacy_const_generics(N)]` + +error: malformed `rustc_legacy_const_generics` attribute input + --> $DIR/invalid-rustc_legacy_const_generics-arguments.rs:35:1 + | +LL | #[rustc_legacy_const_generics = 1] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: must be of the form: `#[rustc_legacy_const_generics(N)]` + +error: #[rustc_legacy_const_generics] must have one index for each generic parameter + --> $DIR/invalid-rustc_legacy_const_generics-arguments.rs:3:1 + | +LL | #[rustc_legacy_const_generics(0)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | fn foo1() {} + | - generic parameters + +error: index exceeds number of arguments + --> $DIR/invalid-rustc_legacy_const_generics-arguments.rs:6:31 + | +LL | #[rustc_legacy_const_generics(1)] + | ^ there is only 1 argument + +error: index exceeds number of arguments + --> $DIR/invalid-rustc_legacy_const_generics-arguments.rs:9:31 + | +LL | #[rustc_legacy_const_generics(2)] + | ^ there are only 2 arguments + +error: arguments should be non-negative integers + --> $DIR/invalid-rustc_legacy_const_generics-arguments.rs:12:31 + | +LL | #[rustc_legacy_const_generics(a)] + | ^ + +error: arguments should be non-negative integers + --> $DIR/invalid-rustc_legacy_const_generics-arguments.rs:15:34 + | +LL | #[rustc_legacy_const_generics(1, a, 2, b)] + | ^ ^ + +error: attribute should be applied to a function + --> $DIR/invalid-rustc_legacy_const_generics-arguments.rs:18:1 + | +LL | #[rustc_legacy_const_generics(0)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | struct S; + | --------- not a function + +error: #[rustc_legacy_const_generics] functions must only have const generics + --> $DIR/invalid-rustc_legacy_const_generics-arguments.rs:29:1 + | +LL | #[rustc_legacy_const_generics(0)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | fn foo8() {} + | - non-const generic parameter + +error: attribute should be applied to a function + --> $DIR/invalid-rustc_legacy_const_generics-arguments.rs:25:5 + | +LL | #[rustc_legacy_const_generics(1)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | fn foo7(); + | -------------------------- not a function + +error[E0044]: foreign items may not have const parameters + --> $DIR/invalid-rustc_legacy_const_generics-arguments.rs:26:5 + | +LL | fn foo7(); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ can't have const parameters + | + = help: replace the const parameters with concrete consts + +error: aborting due to 12 previous errors + +For more information about this error, try `rustc --explain E0044`. diff --git a/src/test/ui/invalid/invalid_rustc_layout_scalar_valid_range.rs b/src/test/ui/invalid/invalid_rustc_layout_scalar_valid_range.rs new file mode 100644 index 0000000000..06cf8c0f0f --- /dev/null +++ b/src/test/ui/invalid/invalid_rustc_layout_scalar_valid_range.rs @@ -0,0 +1,30 @@ +#![feature(rustc_attrs)] + +#[rustc_layout_scalar_valid_range_start(u32::MAX)] //~ ERROR +pub struct A(u32); + +#[rustc_layout_scalar_valid_range_end(1, 2)] //~ ERROR +pub struct B(u8); + +#[rustc_layout_scalar_valid_range_end(a = "a")] //~ ERROR +pub struct C(i32); + +#[rustc_layout_scalar_valid_range_end(1)] //~ ERROR +enum E { + X = 1, + Y = 14, +} + +#[rustc_layout_scalar_valid_range_start(rustc_layout_scalar_valid_range_start)] //~ ERROR +struct NonZero(T); + +fn not_field() -> impl Send { + NonZero(false) +} + +fn main() { + let _ = A(0); + let _ = B(0); + let _ = C(0); + let _ = E::X; +} diff --git a/src/test/ui/invalid/invalid_rustc_layout_scalar_valid_range.stderr b/src/test/ui/invalid/invalid_rustc_layout_scalar_valid_range.stderr new file mode 100644 index 0000000000..7879e7358c --- /dev/null +++ b/src/test/ui/invalid/invalid_rustc_layout_scalar_valid_range.stderr @@ -0,0 +1,37 @@ +error: expected exactly one integer literal argument + --> $DIR/invalid_rustc_layout_scalar_valid_range.rs:3:1 + | +LL | #[rustc_layout_scalar_valid_range_start(u32::MAX)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: expected exactly one integer literal argument + --> $DIR/invalid_rustc_layout_scalar_valid_range.rs:6:1 + | +LL | #[rustc_layout_scalar_valid_range_end(1, 2)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: expected exactly one integer literal argument + --> $DIR/invalid_rustc_layout_scalar_valid_range.rs:9:1 + | +LL | #[rustc_layout_scalar_valid_range_end(a = "a")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: attribute should be applied to a struct + --> $DIR/invalid_rustc_layout_scalar_valid_range.rs:12:1 + | +LL | #[rustc_layout_scalar_valid_range_end(1)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | / enum E { +LL | | X = 1, +LL | | Y = 14, +LL | | } + | |_- not a struct + +error: expected exactly one integer literal argument + --> $DIR/invalid_rustc_layout_scalar_valid_range.rs:18:1 + | +LL | #[rustc_layout_scalar_valid_range_start(rustc_layout_scalar_valid_range_start)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 5 previous errors + diff --git a/src/test/ui/issues/issue-10969.stderr b/src/test/ui/issues/issue-10969.stderr index 9e28a665e3..f64b61aaeb 100644 --- a/src/test/ui/issues/issue-10969.stderr +++ b/src/test/ui/issues/issue-10969.stderr @@ -2,7 +2,7 @@ error[E0618]: expected function, found `i32` --> $DIR/issue-10969.rs:2:5 | LL | fn func(i: i32) { - | - `i32` defined here + | - `i` has type `i32` LL | i(); | ^-- | | @@ -12,7 +12,7 @@ error[E0618]: expected function, found `i32` --> $DIR/issue-10969.rs:6:5 | LL | let i = 0i32; - | - `i32` defined here + | - `i` has type `i32` LL | i(); | ^-- | | diff --git a/src/test/ui/issues/issue-11844.stderr b/src/test/ui/issues/issue-11844.stderr index 00eecbc9a9..9d7470e7af 100644 --- a/src/test/ui/issues/issue-11844.stderr +++ b/src/test/ui/issues/issue-11844.stderr @@ -4,10 +4,10 @@ error[E0308]: mismatched types LL | match a { | - this expression has type `Option>` LL | Ok(a) => - | ^^^^^ expected enum `Option`, found enum `std::result::Result` + | ^^^^^ expected enum `Option`, found enum `Result` | = note: expected enum `Option>` - found enum `std::result::Result<_, _>` + found enum `Result<_, _>` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-12511.stderr b/src/test/ui/issues/issue-12511.stderr index 37e38ff60a..5f2b98c523 100644 --- a/src/test/ui/issues/issue-12511.stderr +++ b/src/test/ui/issues/issue-12511.stderr @@ -1,15 +1,25 @@ -error[E0391]: cycle detected when computing the supertraits of `T1` +error[E0391]: cycle detected when computing the super predicates of `T1` + --> $DIR/issue-12511.rs:1:1 + | +LL | trait T1 : T2 { + | ^^^^^^^^^^^^^ + | +note: ...which requires computing the super traits of `T1`... --> $DIR/issue-12511.rs:1:12 | LL | trait T1 : T2 { | ^^ +note: ...which requires computing the super predicates of `T2`... + --> $DIR/issue-12511.rs:5:1 | -note: ...which requires computing the supertraits of `T2`... +LL | trait T2 : T1 { + | ^^^^^^^^^^^^^ +note: ...which requires computing the super traits of `T2`... --> $DIR/issue-12511.rs:5:12 | LL | trait T2 : T1 { | ^^ - = note: ...which again requires computing the supertraits of `T1`, completing the cycle + = note: ...which again requires computing the super predicates of `T1`, completing the cycle note: cycle used when collecting item types in top-level module --> $DIR/issue-12511.rs:1:1 | diff --git a/src/test/ui/issues/issue-12552.stderr b/src/test/ui/issues/issue-12552.stderr index 1594c9f503..3d8852ca74 100644 --- a/src/test/ui/issues/issue-12552.stderr +++ b/src/test/ui/issues/issue-12552.stderr @@ -2,23 +2,23 @@ error[E0308]: mismatched types --> $DIR/issue-12552.rs:6:5 | LL | match t { - | - this expression has type `std::result::Result<_, {integer}>` + | - this expression has type `Result<_, {integer}>` LL | Some(k) => match k { - | ^^^^^^^ expected enum `std::result::Result`, found enum `Option` + | ^^^^^^^ expected enum `Result`, found enum `Option` | - = note: expected enum `std::result::Result<_, {integer}>` + = note: expected enum `Result<_, {integer}>` found enum `Option<_>` error[E0308]: mismatched types --> $DIR/issue-12552.rs:9:5 | LL | match t { - | - this expression has type `std::result::Result<_, {integer}>` + | - this expression has type `Result<_, {integer}>` ... LL | None => () - | ^^^^ expected enum `std::result::Result`, found enum `Option` + | ^^^^ expected enum `Result`, found enum `Option` | - = note: expected enum `std::result::Result<_, {integer}>` + = note: expected enum `Result<_, {integer}>` found enum `Option<_>` error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-13466.rs b/src/test/ui/issues/issue-13466.rs index 8048dae123..a420c7704a 100644 --- a/src/test/ui/issues/issue-13466.rs +++ b/src/test/ui/issues/issue-13466.rs @@ -8,13 +8,13 @@ pub fn main() { Ok(u) => u, //~^ ERROR mismatched types //~| expected enum `Option<{integer}>` - //~| found enum `std::result::Result<_, _>` - //~| expected enum `Option`, found enum `std::result::Result` + //~| found enum `Result<_, _>` + //~| expected enum `Option`, found enum `Result` Err(e) => panic!(e) //~^ ERROR mismatched types //~| expected enum `Option<{integer}>` - //~| found enum `std::result::Result<_, _>` - //~| expected enum `Option`, found enum `std::result::Result` + //~| found enum `Result<_, _>` + //~| expected enum `Option`, found enum `Result` }; } diff --git a/src/test/ui/issues/issue-13466.stderr b/src/test/ui/issues/issue-13466.stderr index 792cc398bb..c78466f4e8 100644 --- a/src/test/ui/issues/issue-13466.stderr +++ b/src/test/ui/issues/issue-13466.stderr @@ -4,10 +4,10 @@ error[E0308]: mismatched types LL | let _x: usize = match Some(1) { | ------- this expression has type `Option<{integer}>` LL | Ok(u) => u, - | ^^^^^ expected enum `Option`, found enum `std::result::Result` + | ^^^^^ expected enum `Option`, found enum `Result` | = note: expected enum `Option<{integer}>` - found enum `std::result::Result<_, _>` + found enum `Result<_, _>` error[E0308]: mismatched types --> $DIR/issue-13466.rs:14:9 @@ -16,10 +16,10 @@ LL | let _x: usize = match Some(1) { | ------- this expression has type `Option<{integer}>` ... LL | Err(e) => panic!(e) - | ^^^^^^ expected enum `Option`, found enum `std::result::Result` + | ^^^^^^ expected enum `Option`, found enum `Result` | = note: expected enum `Option<{integer}>` - found enum `std::result::Result<_, _>` + found enum `Result<_, _>` error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-16683.stderr b/src/test/ui/issues/issue-16683.stderr index 6efc12df8f..35bcf286c4 100644 --- a/src/test/ui/issues/issue-16683.stderr +++ b/src/test/ui/issues/issue-16683.stderr @@ -4,11 +4,11 @@ error[E0495]: cannot infer an appropriate lifetime for autoref due to conflictin LL | self.a(); | ^ | -note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 3:5... - --> $DIR/issue-16683.rs:3:5 +note: first, the lifetime cannot outlive the anonymous lifetime defined on the method body at 3:10... + --> $DIR/issue-16683.rs:3:10 | LL | fn b(&self) { - | ^^^^^^^^^^^ + | ^^^^^ note: ...so that reference does not outlive borrowed content --> $DIR/issue-16683.rs:4:9 | diff --git a/src/test/ui/issues/issue-17740.stderr b/src/test/ui/issues/issue-17740.stderr index 9fe80232a1..995f5f1fc3 100644 --- a/src/test/ui/issues/issue-17740.stderr +++ b/src/test/ui/issues/issue-17740.stderr @@ -6,11 +6,11 @@ LL | fn bar(self: &mut Foo) { | = note: expected struct `Foo<'a>` found struct `Foo<'_>` -note: the anonymous lifetime #2 defined on the method body at 6:5... - --> $DIR/issue-17740.rs:6:5 +note: the anonymous lifetime defined on the method body at 6:23... + --> $DIR/issue-17740.rs:6:23 | LL | fn bar(self: &mut Foo) { - | ^^^^^^^^^^^^^^^^^^^^^^ + | ^^^ note: ...does not necessarily outlive the lifetime `'a` as defined on the impl at 5:7 --> $DIR/issue-17740.rs:5:7 | @@ -30,11 +30,11 @@ note: the lifetime `'a` as defined on the impl at 5:7... | LL | impl <'a> Foo<'a>{ | ^^ -note: ...does not necessarily outlive the anonymous lifetime #2 defined on the method body at 6:5 - --> $DIR/issue-17740.rs:6:5 +note: ...does not necessarily outlive the anonymous lifetime defined on the method body at 6:23 + --> $DIR/issue-17740.rs:6:23 | LL | fn bar(self: &mut Foo) { - | ^^^^^^^^^^^^^^^^^^^^^^ + | ^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-17758.stderr b/src/test/ui/issues/issue-17758.stderr index f82e0f53a2..846e8939b5 100644 --- a/src/test/ui/issues/issue-17758.stderr +++ b/src/test/ui/issues/issue-17758.stderr @@ -4,11 +4,11 @@ error[E0495]: cannot infer an appropriate lifetime for autoref due to conflictin LL | self.foo(); | ^^^ | -note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 6:5... - --> $DIR/issue-17758.rs:6:5 +note: first, the lifetime cannot outlive the anonymous lifetime defined on the method body at 6:12... + --> $DIR/issue-17758.rs:6:12 | LL | fn bar(&self) { - | ^^^^^^^^^^^^^ + | ^^^^^ note: ...so that reference does not outlive borrowed content --> $DIR/issue-17758.rs:7:9 | diff --git a/src/test/ui/issues/issue-17800.stderr b/src/test/ui/issues/issue-17800.stderr index fc034a0cbf..7df86d7326 100644 --- a/src/test/ui/issues/issue-17800.stderr +++ b/src/test/ui/issues/issue-17800.stderr @@ -2,7 +2,12 @@ error[E0769]: tuple variant `MyOption::MySome` written as struct variant --> $DIR/issue-17800.rs:8:9 | LL | MyOption::MySome { x: 42 } => (), - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ help: use the tuple variant pattern syntax instead: `MyOption::MySome(42)` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +help: use the tuple variant pattern syntax instead + | +LL | MyOption::MySome(42) => (), + | ^^^^ error: aborting due to previous error diff --git a/src/test/ui/issues/issue-17905-2.stderr b/src/test/ui/issues/issue-17905-2.stderr index c762a4ab49..3c27f70585 100644 --- a/src/test/ui/issues/issue-17905-2.stderr +++ b/src/test/ui/issues/issue-17905-2.stderr @@ -6,11 +6,11 @@ LL | fn say(self: &Pair<&str, isize>) { | = note: expected struct `Pair<&str, _>` found struct `Pair<&str, _>` -note: the anonymous lifetime #2 defined on the method body at 8:5... - --> $DIR/issue-17905-2.rs:8:5 +note: the anonymous lifetime defined on the method body at 8:24... + --> $DIR/issue-17905-2.rs:8:24 | LL | fn say(self: &Pair<&str, isize>) { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^ note: ...does not necessarily outlive the lifetime `'_` as defined on the impl at 5:5 --> $DIR/issue-17905-2.rs:5:5 | @@ -30,11 +30,11 @@ note: the lifetime `'_` as defined on the impl at 5:5... | LL | &str, | ^ -note: ...does not necessarily outlive the anonymous lifetime #2 defined on the method body at 8:5 - --> $DIR/issue-17905-2.rs:8:5 +note: ...does not necessarily outlive the anonymous lifetime defined on the method body at 8:24 + --> $DIR/issue-17905-2.rs:8:24 | LL | fn say(self: &Pair<&str, isize>) { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-18919.stderr b/src/test/ui/issues/issue-18919.stderr index ece714c949..d4b93eb074 100644 --- a/src/test/ui/issues/issue-18919.stderr +++ b/src/test/ui/issues/issue-18919.stderr @@ -14,7 +14,7 @@ help: you could relax the implicit `Sized` bound on `T` if it were used through LL | enum Option { | ^ this could be changed to `T: ?Sized`... LL | Some(T), - | - ...if indirection was used here: `Box` + | - ...if indirection were used here: `Box` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-19991.rs b/src/test/ui/issues/issue-19991.rs index 0f3f83001d..1f3b73f96d 100644 --- a/src/test/ui/issues/issue-19991.rs +++ b/src/test/ui/issues/issue-19991.rs @@ -1,4 +1,4 @@ -// Test if the sugared if-let construct correctly prints "missing an else clause" when an else +// 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" fn main() { diff --git a/src/test/ui/issues/issue-20772.stderr b/src/test/ui/issues/issue-20772.stderr index d64636310a..4aecc7eab4 100644 --- a/src/test/ui/issues/issue-20772.stderr +++ b/src/test/ui/issues/issue-20772.stderr @@ -1,4 +1,4 @@ -error[E0391]: cycle detected when computing the supertraits of `T` +error[E0391]: cycle detected when computing the super traits of `T` with associated type name `Item` --> $DIR/issue-20772.rs:1:1 | LL | / trait T : Iterator @@ -6,8 +6,8 @@ LL | | LL | | {} | |__^ | - = note: ...which again requires computing the supertraits of `T`, completing the cycle -note: cycle used when collecting item types in top-level module + = note: ...which again requires computing the super traits of `T` with associated type name `Item`, completing the cycle +note: cycle used when computing the super traits of `T` --> $DIR/issue-20772.rs:1:1 | LL | / trait T : Iterator diff --git a/src/test/ui/issues/issue-20825.stderr b/src/test/ui/issues/issue-20825.stderr index 5f9709d1c6..ccbe06d9c0 100644 --- a/src/test/ui/issues/issue-20825.stderr +++ b/src/test/ui/issues/issue-20825.stderr @@ -1,11 +1,11 @@ -error[E0391]: cycle detected when computing the supertraits of `Processor` +error[E0391]: cycle detected when computing the super traits of `Processor` with associated type name `Input` --> $DIR/issue-20825.rs:5:1 | LL | pub trait Processor: Subscriber { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: ...which again requires computing the supertraits of `Processor`, completing the cycle -note: cycle used when collecting item types in top-level module + = note: ...which again requires computing the super traits of `Processor` with associated type name `Input`, completing the cycle +note: cycle used when computing the super traits of `Processor` --> $DIR/issue-20825.rs:5:1 | LL | pub trait Processor: Subscriber { diff --git a/src/test/ui/issues/issue-20831-debruijn.stderr b/src/test/ui/issues/issue-20831-debruijn.stderr index bcfb6b70b2..e68482d1ca 100644 --- a/src/test/ui/issues/issue-20831-debruijn.stderr +++ b/src/test/ui/issues/issue-20831-debruijn.stderr @@ -4,11 +4,11 @@ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` d LL | fn subscribe(&mut self, t : Box::Output> + 'a>) { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | -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 +note: first, the lifetime cannot outlive the anonymous lifetime defined on the method body at 28:58... + --> $DIR/issue-20831-debruijn.rs:28:58 | LL | fn subscribe(&mut self, t : Box::Output> + 'a>) { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ 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 | diff --git a/src/test/ui/issues/issue-21332.rs b/src/test/ui/issues/issue-21332.rs index 1b13f000b8..6547f3a9b1 100644 --- a/src/test/ui/issues/issue-21332.rs +++ b/src/test/ui/issues/issue-21332.rs @@ -4,7 +4,7 @@ impl Iterator for S { type Item = i32; fn next(&mut self) -> Result { Ok(7) } //~^ ERROR method `next` has an incompatible type for trait - //~| expected enum `Option`, found enum `std::result::Result` + //~| expected enum `Option`, found enum `Result` } fn main() {} diff --git a/src/test/ui/issues/issue-21332.stderr b/src/test/ui/issues/issue-21332.stderr index 1d6ddd2660..35863fbebe 100644 --- a/src/test/ui/issues/issue-21332.stderr +++ b/src/test/ui/issues/issue-21332.stderr @@ -2,10 +2,10 @@ error[E0053]: method `next` has an incompatible type for trait --> $DIR/issue-21332.rs:5:5 | LL | fn next(&mut self) -> Result { Ok(7) } - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `Option`, found enum `std::result::Result` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected enum `Option`, found enum `Result` | = note: expected fn pointer `fn(&mut S) -> Option` - found fn pointer `fn(&mut S) -> std::result::Result` + found fn pointer `fn(&mut S) -> Result` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-21701.stderr b/src/test/ui/issues/issue-21701.stderr index 77bb3802d8..0405ce551b 100644 --- a/src/test/ui/issues/issue-21701.stderr +++ b/src/test/ui/issues/issue-21701.stderr @@ -2,7 +2,7 @@ error[E0618]: expected function, found `U` --> $DIR/issue-21701.rs:2:13 | LL | fn foo(t: U) { - | - `U` defined here + | - `t` has type `U` LL | let y = t(); | ^-- | | diff --git a/src/test/ui/issues/issue-22468.stderr b/src/test/ui/issues/issue-22468.stderr index 8d8601b311..3fff91acbc 100644 --- a/src/test/ui/issues/issue-22468.stderr +++ b/src/test/ui/issues/issue-22468.stderr @@ -2,7 +2,7 @@ error[E0618]: expected function, found `&str` --> $DIR/issue-22468.rs:3:13 | LL | let foo = "bar"; - | --- `&str` defined here + | --- `foo` has type `&str` LL | let x = foo("baz"); | ^^^------- | | diff --git a/src/test/ui/issues/issue-22673.rs b/src/test/ui/issues/issue-22673.rs index ba8057b684..4b9b4d6b23 100644 --- a/src/test/ui/issues/issue-22673.rs +++ b/src/test/ui/issues/issue-22673.rs @@ -1,5 +1,6 @@ -trait Expr : PartialEq { - //~^ ERROR: cycle detected +// check-pass + +trait Expr: PartialEq { type Item; } diff --git a/src/test/ui/issues/issue-22673.stderr b/src/test/ui/issues/issue-22673.stderr deleted file mode 100644 index 9e7e4b218b..0000000000 --- a/src/test/ui/issues/issue-22673.stderr +++ /dev/null @@ -1,16 +0,0 @@ -error[E0391]: cycle detected when computing the supertraits of `Expr` - --> $DIR/issue-22673.rs:1:1 - | -LL | trait Expr : PartialEq { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - | - = note: ...which again requires computing the supertraits of `Expr`, completing the cycle -note: cycle used when collecting item types in top-level module - --> $DIR/issue-22673.rs:1:1 - | -LL | trait Expr : PartialEq { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0391`. diff --git a/src/test/ui/issues/issue-23281.stderr b/src/test/ui/issues/issue-23281.stderr index d8046497b9..a3d2583292 100644 --- a/src/test/ui/issues/issue-23281.stderr +++ b/src/test/ui/issues/issue-23281.stderr @@ -14,7 +14,7 @@ help: you could relax the implicit `Sized` bound on `T` if it were used through LL | struct Vec { | ^ this could be changed to `T: ?Sized`... LL | t: T, - | - ...if indirection was used here: `Box` + | - ...if indirection were used here: `Box` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-23458.rs b/src/test/ui/issues/issue-23458.rs index 423b19c3eb..1762d21832 100644 --- a/src/test/ui/issues/issue-23458.rs +++ b/src/test/ui/issues/issue-23458.rs @@ -1,5 +1,5 @@ #![feature(llvm_asm)] - +// compile-flags: -Ccodegen-units=1 // build-fail // only-x86_64 diff --git a/src/test/ui/issues/issue-26237.stderr b/src/test/ui/issues/issue-26237.stderr index f58c1bfe64..91d28a5e1e 100644 --- a/src/test/ui/issues/issue-26237.stderr +++ b/src/test/ui/issues/issue-26237.stderr @@ -5,7 +5,7 @@ LL | $not_a_function($some_argument) | ------------------------------- call expression requires function ... LL | let mut value_a = 0; - | ----------- `{integer}` defined here + | ----------- `value_a` has type `{integer}` LL | let mut value_b = 0; LL | macro_panic!(value_a, value_b); | ^^^^^^^ diff --git a/src/test/ui/issues/issue-2633-2.rs b/src/test/ui/issues/issue-2633-2.rs deleted file mode 100644 index 02c1a16630..0000000000 --- a/src/test/ui/issues/issue-2633-2.rs +++ /dev/null @@ -1,14 +0,0 @@ -// run-pass -// pretty-expanded FIXME #23616 - -#![feature(box_syntax)] - - -fn a_val(x: Box, y: Box) -> isize { - *x + *y -} - -pub fn main() { - let z: Box<_> = box 22; - a_val(z.clone(), z.clone()); -} diff --git a/src/test/ui/issues/issue-2633.rs b/src/test/ui/issues/issue-2633.rs deleted file mode 100644 index 7e8cea75fc..0000000000 --- a/src/test/ui/issues/issue-2633.rs +++ /dev/null @@ -1,31 +0,0 @@ -// run-pass -#![allow(dead_code)] -#![allow(non_camel_case_types)] - -#[derive(Copy, Clone)] -struct cat { - meow: extern "Rust" fn(), -} - -fn meow() { - println!("meow") -} - -fn cat() -> cat { - cat { - meow: meow, - } -} - -#[derive(Copy, Clone)] -struct KittyInfo {kitty: cat} - -// Code compiles and runs successfully if we add a + before the first arg -fn nyan(kitty: cat, _kitty_info: KittyInfo) { - (kitty.meow)(); -} - -pub fn main() { - let kitty = cat(); - nyan(kitty, KittyInfo {kitty: kitty}); -} diff --git a/src/test/ui/issues/issue-27033.stderr b/src/test/ui/issues/issue-27033.stderr index ad48fc23a3..fa42611d0b 100644 --- a/src/test/ui/issues/issue-27033.stderr +++ b/src/test/ui/issues/issue-27033.stderr @@ -4,10 +4,10 @@ error[E0530]: match bindings cannot shadow unit variants LL | None @ _ => {} | ^^^^ cannot be named the same as a unit variant | - ::: $SRC_DIR/std/src/prelude/v1.rs:LL:COL + ::: $SRC_DIR/std/src/prelude/mod.rs:LL:COL | -LL | pub use crate::option::Option::{self, None, Some}; - | ---- the unit variant `None` is defined here +LL | pub use super::v1::*; + | ------------ the unit variant `None` is defined here error[E0530]: match bindings cannot shadow constants --> $DIR/issue-27033.rs:7:9 diff --git a/src/test/ui/issues/issue-27942.stderr b/src/test/ui/issues/issue-27942.stderr index 6ce0fa37a8..80eecb42d1 100644 --- a/src/test/ui/issues/issue-27942.stderr +++ b/src/test/ui/issues/issue-27942.stderr @@ -6,11 +6,11 @@ LL | fn select(&self) -> BufferViewHandle; | = note: expected type `Resources<'_>` found type `Resources<'a>` -note: the anonymous lifetime #1 defined on the method body at 5:5... - --> $DIR/issue-27942.rs:5:5 +note: the anonymous lifetime defined on the method body at 5:15... + --> $DIR/issue-27942.rs:5:15 | LL | fn select(&self) -> BufferViewHandle; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^ note: ...does not necessarily outlive the lifetime `'a` as defined on the trait at 3:18 --> $DIR/issue-27942.rs:3:18 | @@ -30,11 +30,11 @@ note: the lifetime `'a` as defined on the trait at 3:18... | LL | pub trait Buffer<'a, R: Resources<'a>> { | ^^ -note: ...does not necessarily outlive the anonymous lifetime #1 defined on the method body at 5:5 - --> $DIR/issue-27942.rs:5:5 +note: ...does not necessarily outlive the anonymous lifetime defined on the method body at 5:15 + --> $DIR/issue-27942.rs:5:15 | LL | fn select(&self) -> BufferViewHandle; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-29821.rs b/src/test/ui/issues/issue-29821.rs new file mode 100644 index 0000000000..54be3afb59 --- /dev/null +++ b/src/test/ui/issues/issue-29821.rs @@ -0,0 +1,19 @@ +// build-pass + +pub trait Foo { + type FooAssoc; +} + +pub struct Bar { + id: F::FooAssoc +} + +pub struct Baz; + +impl Foo for Baz { + type FooAssoc = usize; +} + +static mut MY_FOO: Bar = Bar { id: 0 }; + +fn main() {} diff --git a/src/test/ui/issues/issue-34229.rs b/src/test/ui/issues/issue-34229.rs index 625fcb0a6f..13e627a492 100644 --- a/src/test/ui/issues/issue-34229.rs +++ b/src/test/ui/issues/issue-34229.rs @@ -1,9 +1,5 @@ #[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 d25189e783..7268e94c8d 100644 --- a/src/test/ui/issues/issue-34229.stderr +++ b/src/test/ui/issues/issue-34229.stderr @@ -8,46 +8,6 @@ LL | #[derive(PartialEq, PartialOrd)] struct Nope(Comparable); = note: required by `std::cmp::PartialOrd::partial_cmp` = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) -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 `PartialOrd` is not implemented for `Comparable` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -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 `PartialOrd` is not implemented for `Comparable` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -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 `PartialOrd` is not implemented for `Comparable` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -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 `PartialOrd` is not implemented for `Comparable` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error: aborting due to 5 previous errors +error: aborting due to previous error For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/issues/issue-3680.rs b/src/test/ui/issues/issue-3680.rs index 8912e7a18a..37c9000c04 100644 --- a/src/test/ui/issues/issue-3680.rs +++ b/src/test/ui/issues/issue-3680.rs @@ -3,7 +3,7 @@ fn main() { Err(_) => () //~^ ERROR mismatched types //~| expected enum `Option<_>` - //~| found enum `std::result::Result<_, _>` - //~| expected enum `Option`, found enum `std::result::Result` + //~| found enum `Result<_, _>` + //~| expected enum `Option`, found enum `Result` } } diff --git a/src/test/ui/issues/issue-3680.stderr b/src/test/ui/issues/issue-3680.stderr index 479942b8e2..e8fafa76b9 100644 --- a/src/test/ui/issues/issue-3680.stderr +++ b/src/test/ui/issues/issue-3680.stderr @@ -4,10 +4,10 @@ error[E0308]: mismatched types LL | match None { | ---- this expression has type `Option<_>` LL | Err(_) => () - | ^^^^^^ expected enum `Option`, found enum `std::result::Result` + | ^^^^^^ expected enum `Option`, found enum `Result` | = note: expected enum `Option<_>` - found enum `std::result::Result<_, _>` + found enum `Result<_, _>` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-40827.stderr b/src/test/ui/issues/issue-40827.stderr index 5ea795d139..95cacbc32a 100644 --- a/src/test/ui/issues/issue-40827.stderr +++ b/src/test/ui/issues/issue-40827.stderr @@ -1,27 +1,27 @@ -error[E0277]: `Rc` cannot be sent between threads safely +error[E0277]: `Rc` cannot be shared between threads safely --> $DIR/issue-40827.rs:14:5 | LL | fn f(_: T) {} | ---- required by this bound in `f` ... LL | f(Foo(Arc::new(Bar::B(None)))); - | ^ `Rc` cannot be sent between threads safely + | ^ `Rc` cannot be shared between threads safely | - = help: within `Bar`, the trait `Send` is not implemented for `Rc` + = help: within `Bar`, the trait `Sync` is not implemented for `Rc` = note: required because it appears within the type `Bar` = note: required because of the requirements on the impl of `Send` for `Arc` = note: required because it appears within the type `Foo` -error[E0277]: `Rc` cannot be shared between threads safely +error[E0277]: `Rc` cannot be sent between threads safely --> $DIR/issue-40827.rs:14:5 | LL | fn f(_: T) {} | ---- required by this bound in `f` ... LL | f(Foo(Arc::new(Bar::B(None)))); - | ^ `Rc` cannot be shared between threads safely + | ^ `Rc` cannot be sent between threads safely | - = help: within `Bar`, the trait `Sync` is not implemented for `Rc` + = help: within `Bar`, the trait `Send` is not implemented for `Rc` = note: required because it appears within the type `Bar` = note: required because of the requirements on the impl of `Send` for `Arc` = note: required because it appears within the type `Foo` diff --git a/src/test/ui/issues/issue-4736.stderr b/src/test/ui/issues/issue-4736.stderr index 257ec914a6..9be4eb1c7f 100644 --- a/src/test/ui/issues/issue-4736.stderr +++ b/src/test/ui/issues/issue-4736.stderr @@ -7,7 +7,7 @@ LL | struct NonCopyable(()); LL | let z = NonCopyable{ p: () }; | ----------- ^ field does not exist | | - | `NonCopyable` is a tuple struct, use the appropriate syntax: `NonCopyable(/* fields */)` + | help: `NonCopyable` is a tuple struct, use the appropriate syntax: `NonCopyable(/* fields */)` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-49040.stderr b/src/test/ui/issues/issue-49040.stderr index 4134d6aa54..56befe3a0a 100644 --- a/src/test/ui/issues/issue-49040.stderr +++ b/src/test/ui/issues/issue-49040.stderr @@ -7,10 +7,8 @@ LL | #![allow(unused_variables)]; error[E0601]: `main` function not found in crate `issue_49040` --> $DIR/issue-49040.rs:1:1 | -LL | / #![allow(unused_variables)]; -LL | | -LL | | fn foo() {} - | |__^ consider adding a `main` function to `$DIR/issue-49040.rs` +LL | #![allow(unused_variables)]; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ consider adding a `main` function to `$DIR/issue-49040.rs` error: aborting due to 2 previous errors diff --git a/src/test/ui/issues/issue-49934-errors.rs b/src/test/ui/issues/issue-49934-errors.rs index bf95f8fa7e..dd14bac5e3 100644 --- a/src/test/ui/issues/issue-49934-errors.rs +++ b/src/test/ui/issues/issue-49934-errors.rs @@ -1,11 +1,8 @@ -fn foo<#[derive(Debug)] T>() { -//~^ ERROR `derive` may only be applied to structs, enums and unions +fn foo<#[derive(Debug)] T>() { //~ ERROR expected non-macro attribute, found attribute macro match 0 { - #[derive(Debug)] - //~^ ERROR `derive` may only be applied to structs, enums and unions + #[derive(Debug)] //~ ERROR expected non-macro attribute, found attribute macro _ => (), } } -fn main() { -} +fn main() {} diff --git a/src/test/ui/issues/issue-49934-errors.stderr b/src/test/ui/issues/issue-49934-errors.stderr index 71cd2d3034..8c4c54170a 100644 --- a/src/test/ui/issues/issue-49934-errors.stderr +++ b/src/test/ui/issues/issue-49934-errors.stderr @@ -1,15 +1,14 @@ -error[E0774]: `derive` may only be applied to structs, enums and unions - --> $DIR/issue-49934-errors.rs:1:8 +error: expected non-macro attribute, found attribute macro `derive` + --> $DIR/issue-49934-errors.rs:1:10 | LL | fn foo<#[derive(Debug)] T>() { - | ^^^^^^^^^^^^^^^^ + | ^^^^^^ not a non-macro attribute -error[E0774]: `derive` may only be applied to structs, enums and unions - --> $DIR/issue-49934-errors.rs:4:9 +error: expected non-macro attribute, found attribute macro `derive` + --> $DIR/issue-49934-errors.rs:3:11 | LL | #[derive(Debug)] - | ^^^^^^^^^^^^^^^^ + | ^^^^^^ not a non-macro attribute error: aborting due to 2 previous errors -For more information about this error, try `rustc --explain E0774`. diff --git a/src/test/ui/issues/issue-49934.rs b/src/test/ui/issues/issue-49934.rs index 5b253750db..ec73e67063 100644 --- a/src/test/ui/issues/issue-49934.rs +++ b/src/test/ui/issues/issue-49934.rs @@ -1,7 +1,4 @@ -// check-pass - #![feature(stmt_expr_attributes)] -#![warn(unused_attributes)] //~ NOTE the lint level is defined here fn main() { // fold_stmt (Item) @@ -10,26 +7,24 @@ fn main() { struct Foo; // fold_stmt (Mac) - #[derive(Debug)] - //~^ WARN `#[derive]` does nothing on macro invocations - //~| NOTE this may become a hard error in a future release + #[derive(Debug)] //~ ERROR `derive` may only be applied to structs, enums and unions println!("Hello, world!"); // fold_stmt (Semi) - #[derive(Debug)] //~ WARN unused attribute + #[derive(Debug)] //~ ERROR `derive` may only be applied to structs, enums and unions "Hello, world!"; // fold_stmt (Local) - #[derive(Debug)] //~ WARN unused attribute + #[derive(Debug)] //~ ERROR `derive` may only be applied to structs, enums and unions let _ = "Hello, world!"; // visit_expr let _ = #[derive(Debug)] "Hello, world!"; - //~^ WARN unused attribute + //~^ ERROR `derive` may only be applied to structs, enums and unions let _ = [ // filter_map_expr - #[derive(Debug)] //~ WARN unused attribute - "Hello, world!" + #[derive(Debug)] //~ ERROR `derive` may only be applied to structs, enums and unions + "Hello, world!", ]; } diff --git a/src/test/ui/issues/issue-49934.stderr b/src/test/ui/issues/issue-49934.stderr index 8a5596521e..7746ad287a 100644 --- a/src/test/ui/issues/issue-49934.stderr +++ b/src/test/ui/issues/issue-49934.stderr @@ -1,40 +1,33 @@ -warning: `#[derive]` does nothing on macro invocations - --> $DIR/issue-49934.rs:13:5 +error[E0774]: `derive` may only be applied to structs, enums and unions + --> $DIR/issue-49934.rs:10:5 | LL | #[derive(Debug)] | ^^^^^^^^^^^^^^^^ - | - = note: this may become a hard error in a future release -warning: unused attribute - --> $DIR/issue-49934.rs:19:5 +error[E0774]: `derive` may only be applied to structs, enums and unions + --> $DIR/issue-49934.rs:14:5 | LL | #[derive(Debug)] | ^^^^^^^^^^^^^^^^ - | -note: the lint level is defined here - --> $DIR/issue-49934.rs:4:9 - | -LL | #![warn(unused_attributes)] - | ^^^^^^^^^^^^^^^^^ -warning: unused attribute - --> $DIR/issue-49934.rs:23:5 +error[E0774]: `derive` may only be applied to structs, enums and unions + --> $DIR/issue-49934.rs:18:5 | LL | #[derive(Debug)] | ^^^^^^^^^^^^^^^^ -warning: unused attribute - --> $DIR/issue-49934.rs:27:13 +error[E0774]: `derive` may only be applied to structs, enums and unions + --> $DIR/issue-49934.rs:22:13 | LL | let _ = #[derive(Debug)] "Hello, world!"; | ^^^^^^^^^^^^^^^^ -warning: unused attribute - --> $DIR/issue-49934.rs:32:9 +error[E0774]: `derive` may only be applied to structs, enums and unions + --> $DIR/issue-49934.rs:27:9 | LL | #[derive(Debug)] | ^^^^^^^^^^^^^^^^ -warning: 5 warnings emitted +error: aborting due to 5 previous errors +For more information about this error, try `rustc --explain E0774`. 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 e41c04ee89..9711e27d8a 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]: the method `as_deref` exists for enum `std::result::Result<{integer}, _>`, but its trait bounds were not satisfied +error[E0599]: the method `as_deref` exists for enum `Result<{integer}, _>`, but its trait bounds were not satisfied --> $DIR/result-as_deref.rs:2:27 | LL | let _result = &Ok(42).as_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 372d056fc1..ee7ea1e6a0 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,8 +1,8 @@ -error[E0599]: the method `as_deref_mut` exists for enum `std::result::Result<{integer}, _>`, but its trait bounds were not satisfied +error[E0599]: the method `as_deref_mut` exists for enum `Result<{integer}, _>`, but its trait bounds were not satisfied --> $DIR/result-as_deref_mut.rs:2:31 | LL | let _result = &mut Ok(42).as_deref_mut(); - | ^^^^^^^^^^^^ method cannot be called on `std::result::Result<{integer}, _>` due to unsatisfied trait bounds + | ^^^^^^^^^^^^ method cannot be called on `Result<{integer}, _>` due to unsatisfied trait bounds | = note: the following trait bounds were not satisfied: `{integer}: DerefMut` diff --git a/src/test/ui/issues/issue-50411.rs b/src/test/ui/issues/issue-50411.rs index 1bf1270781..cd728b1525 100644 --- a/src/test/ui/issues/issue-50411.rs +++ b/src/test/ui/issues/issue-50411.rs @@ -3,7 +3,7 @@ // elaborate-drops invoked on it) and then try to elaboate drops a // second time. Uncool. -// compile-flags:-Zmir-opt-level=3 +// compile-flags:-Zmir-opt-level=4 // build-pass fn main() { diff --git a/src/test/ui/issues/issue-50865-private-impl-trait/auxiliary/lib.rs b/src/test/ui/issues/issue-50865-private-impl-trait/auxiliary/lib.rs index fb4bf2b8b4..1e20a54606 100644 --- a/src/test/ui/issues/issue-50865-private-impl-trait/auxiliary/lib.rs +++ b/src/test/ui/issues/issue-50865-private-impl-trait/auxiliary/lib.rs @@ -1,5 +1,5 @@ // revisions: default miropt -//[miropt]compile-flags: -Z mir-opt-level=2 +//[miropt]compile-flags: -Z mir-opt-level=3 // ~^ This flag is for #77668, it used to be ICE. #![crate_type = "lib"] diff --git a/src/test/ui/issues/issue-51632-try-desugar-incompatible-types.stderr b/src/test/ui/issues/issue-51632-try-desugar-incompatible-types.stderr index 9ca983df30..554ac7e7c7 100644 --- a/src/test/ui/issues/issue-51632-try-desugar-incompatible-types.stderr +++ b/src/test/ui/issues/issue-51632-try-desugar-incompatible-types.stderr @@ -2,9 +2,9 @@ error[E0308]: try expression alternatives have incompatible types --> $DIR/issue-51632-try-desugar-incompatible-types.rs:8:5 | LL | missing_discourses()? - | ^^^^^^^^^^^^^^^^^^^^^ expected enum `std::result::Result`, found `isize` + | ^^^^^^^^^^^^^^^^^^^^^ expected enum `Result`, found `isize` | - = note: expected enum `std::result::Result` + = note: expected enum `Result` found type `isize` help: try removing this `?` | diff --git a/src/test/ui/issues/issue-54302-cases.stderr b/src/test/ui/issues/issue-54302-cases.stderr index 3ed2779164..baa75f28d3 100644 --- a/src/test/ui/issues/issue-54302-cases.stderr +++ b/src/test/ui/issues/issue-54302-cases.stderr @@ -1,13 +1,8 @@ error: implementation of `Foo` is not general enough --> $DIR/issue-54302-cases.rs:63:5 | -LL | / trait Foo<'x, T> { -LL | | fn foo(self) -> &'x T; -LL | | } - | |_- trait `Foo` defined here -... -LL | >::ref_foo(a) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough +LL | >::ref_foo(a) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough | = note: `Foo<'static, u32>` would have to be implemented for the type `&'0 u32`, for any lifetime `'0`... = note: ...but `Foo<'_, u32>` is actually implemented for the type `&'1 u32`, for some specific lifetime `'1` @@ -15,13 +10,8 @@ LL | >::ref_foo(a) error: implementation of `Foo` is not general enough --> $DIR/issue-54302-cases.rs:69:5 | -LL | / trait Foo<'x, T> { -LL | | fn foo(self) -> &'x T; -LL | | } - | |_- trait `Foo` defined here -... -LL | >::ref_foo(a) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough +LL | >::ref_foo(a) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough | = note: `Foo<'static, i32>` would have to be implemented for the type `&'0 i32`, for any lifetime `'0`... = note: ...but `Foo<'_, i32>` is actually implemented for the type `&'1 i32`, for some specific lifetime `'1` @@ -29,13 +19,8 @@ LL | >::ref_foo(a) error: implementation of `Foo` is not general enough --> $DIR/issue-54302-cases.rs:75:5 | -LL | / trait Foo<'x, T> { -LL | | fn foo(self) -> &'x T; -LL | | } - | |_- trait `Foo` defined here -... -LL | >::ref_foo(a) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough +LL | >::ref_foo(a) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough | = note: `Foo<'static, u64>` would have to be implemented for the type `&'0 u64`, for any lifetime `'0`... = note: ...but `Foo<'_, u64>` is actually implemented for the type `&'1 u64`, for some specific lifetime `'1` @@ -43,13 +28,8 @@ LL | >::ref_foo(a) error: implementation of `Foo` is not general enough --> $DIR/issue-54302-cases.rs:81:5 | -LL | / trait Foo<'x, T> { -LL | | fn foo(self) -> &'x T; -LL | | } - | |_- trait `Foo` defined here -... -LL | >::ref_foo(a) - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough +LL | >::ref_foo(a) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Foo` is not general enough | = note: `Foo<'static, i64>` would have to be implemented for the type `&'0 i64`, for any lifetime `'0`... = note: ...but `Foo<'_, i64>` is actually implemented for the type `&'1 i64`, for some specific lifetime `'1` diff --git a/src/test/ui/issues/issue-54302.stderr b/src/test/ui/issues/issue-54302.stderr index 1b3f57ba18..26c46571f9 100644 --- a/src/test/ui/issues/issue-54302.stderr +++ b/src/test/ui/issues/issue-54302.stderr @@ -1,9 +1,6 @@ error: implementation of `Deserialize` is not general enough --> $DIR/issue-54302.rs:13:5 | -LL | trait Deserialize<'de> {} - | ------------------------- trait `Deserialize` defined here -... LL | assert_deserialize_owned::<&'static str>(); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ implementation of `Deserialize` is not general enough | diff --git a/src/test/ui/issues/issue-55731.stderr b/src/test/ui/issues/issue-55731.stderr index f44c842187..de327cd3cc 100644 --- a/src/test/ui/issues/issue-55731.stderr +++ b/src/test/ui/issues/issue-55731.stderr @@ -1,13 +1,8 @@ error: implementation of `DistributedIteratorMulti` is not general enough --> $DIR/issue-55731.rs:48:5 | -LL | / trait DistributedIteratorMulti { -LL | | type Item; -LL | | } - | |_- trait `DistributedIteratorMulti` defined here -... -LL | multi(Map { - | ^^^^^ implementation of `DistributedIteratorMulti` is not general enough +LL | multi(Map { + | ^^^^^ implementation of `DistributedIteratorMulti` is not general enough | = note: `DistributedIteratorMulti<&'0 ()>` would have to be implemented for the type `Cloned<&()>`, for any lifetime `'0`... = note: ...but `DistributedIteratorMulti<&'1 ()>` is actually implemented for the type `Cloned<&'1 ()>`, for some specific lifetime `'1` diff --git a/src/test/ui/issues/issue-57843.nll.stderr b/src/test/ui/issues/issue-57843.nll.stderr index 70310780b4..70d16cc9a1 100644 --- a/src/test/ui/issues/issue-57843.nll.stderr +++ b/src/test/ui/issues/issue-57843.nll.stderr @@ -1,5 +1,5 @@ error: higher-ranked subtype error - --> $DIR/issue-57843.rs:23:9 + --> $DIR/issue-57843.rs:25:9 | LL | Foo(Box::new(|_| ())); | ^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/issues/issue-57843.rs b/src/test/ui/issues/issue-57843.rs index 4660825526..11629690ec 100644 --- a/src/test/ui/issues/issue-57843.rs +++ b/src/test/ui/issues/issue-57843.rs @@ -11,7 +11,9 @@ trait ClonableFn { } impl ClonableFn for F -where F: Fn(T) + Clone { +where + F: Fn(T) + Clone, +{ fn clone(&self) -> Box { Box::new(self.clone()) } @@ -20,5 +22,5 @@ where F: Fn(T) + Clone { struct Foo(Box ClonableFn<&'a bool>>); fn main() { - Foo(Box::new(|_| ())); //~ ERROR mismatched types + Foo(Box::new(|_| ())); //~ ERROR implementation of `FnOnce` is not general enough } diff --git a/src/test/ui/issues/issue-57843.stderr b/src/test/ui/issues/issue-57843.stderr index 7699e97da9..2ab49ec61c 100644 --- a/src/test/ui/issues/issue-57843.stderr +++ b/src/test/ui/issues/issue-57843.stderr @@ -1,17 +1,11 @@ -error[E0308]: mismatched types - --> $DIR/issue-57843.rs:23:9 +error: implementation of `FnOnce` is not general enough + --> $DIR/issue-57843.rs:25:9 | LL | Foo(Box::new(|_| ())); - | ^^^^^^^^^^^^^^^^ one type is more general than the other + | ^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough | - = note: expected type `FnOnce<(&'a bool,)>` - found type `FnOnce<(&bool,)>` -note: this closure does not fulfill the lifetime requirements - --> $DIR/issue-57843.rs:23:18 - | -LL | Foo(Box::new(|_| ())); - | ^^^^^^ + = note: closure with signature `fn(&'2 bool)` must implement `FnOnce<(&'1 bool,)>`, for any lifetime `'1`... + = note: ...but it actually implements `FnOnce<(&'2 bool,)>`, for some specific lifetime `'2` error: aborting due to previous error -For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/issues/issue-59488.rs b/src/test/ui/issues/issue-59488.rs index 384501e3e5..922b593935 100644 --- a/src/test/ui/issues/issue-59488.rs +++ b/src/test/ui/issues/issue-59488.rs @@ -30,5 +30,4 @@ fn main() { assert_eq!(Foo::Bar, i); //~^ ERROR binary operation `==` cannot be applied to type `fn(usize) -> Foo {Foo::Bar}` [E0369] //~| ERROR `fn(usize) -> Foo {Foo::Bar}` doesn't implement `Debug` [E0277] - //~| ERROR `fn(usize) -> Foo {Foo::Bar}` doesn't implement `Debug` [E0277] } diff --git a/src/test/ui/issues/issue-59488.stderr b/src/test/ui/issues/issue-59488.stderr index 3b10491a8a..2627724f87 100644 --- a/src/test/ui/issues/issue-59488.stderr +++ b/src/test/ui/issues/issue-59488.stderr @@ -84,24 +84,16 @@ error[E0277]: `fn(usize) -> Foo {Foo::Bar}` doesn't implement `Debug` | LL | assert_eq!(Foo::Bar, i); | ^^^^^^^^^^^^^^^^^^^^^^^^ `fn(usize) -> Foo {Foo::Bar}` cannot be formatted using `{:?}` because it doesn't implement `Debug` + | + ::: $SRC_DIR/core/src/panicking.rs:LL:COL | - = help: the trait `Debug` is not implemented for `fn(usize) -> Foo {Foo::Bar}` - = note: required because of the requirements on the impl of `Debug` for `&fn(usize) -> Foo {Foo::Bar}` - = note: required by `std::fmt::Debug::fmt` - = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: `fn(usize) -> Foo {Foo::Bar}` doesn't implement `Debug` - --> $DIR/issue-59488.rs:30:5 - | -LL | assert_eq!(Foo::Bar, i); - | ^^^^^^^^^^^^^^^^^^^^^^^^ `fn(usize) -> Foo {Foo::Bar}` cannot be formatted using `{:?}` because it doesn't implement `Debug` +LL | T: fmt::Debug + ?Sized, + | ---------- required by this bound in `core::panicking::assert_failed` | = help: the trait `Debug` is not implemented for `fn(usize) -> Foo {Foo::Bar}` - = note: required because of the requirements on the impl of `Debug` for `&fn(usize) -> Foo {Foo::Bar}` - = note: required by `std::fmt::Debug::fmt` = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) -error: aborting due to 10 previous errors +error: aborting due to 9 previous errors Some errors have detailed explanations: E0277, E0308, E0369. For more information about an error, try `rustc --explain E0277`. diff --git a/src/test/ui/issues/issue-60662.full_tait.stderr b/src/test/ui/issues/issue-60662.full_tait.stderr new file mode 100644 index 0000000000..a448f85b76 --- /dev/null +++ b/src/test/ui/issues/issue-60662.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-60662.rs:6:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/issues/issue-60662.stdout b/src/test/ui/issues/issue-60662.full_tait.stdout similarity index 68% rename from src/test/ui/issues/issue-60662.stdout rename to src/test/ui/issues/issue-60662.full_tait.stdout index cebe834824..9ee4434d55 100644 --- a/src/test/ui/issues/issue-60662.stdout +++ b/src/test/ui/issues/issue-60662.full_tait.stdout @@ -1,9 +1,11 @@ // check-pass // compile-flags: -Z unpretty=hir +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] #![feature(type_alias_impl_trait)] #[prelude_import] -use ::std::prelude::v1::*; +use ::std::prelude::rust_2015::*; #[macro_use] extern crate std; diff --git a/src/test/ui/issues/issue-60662.min_tait.stdout b/src/test/ui/issues/issue-60662.min_tait.stdout new file mode 100644 index 0000000000..d0db578f57 --- /dev/null +++ b/src/test/ui/issues/issue-60662.min_tait.stdout @@ -0,0 +1,15 @@ +// check-pass +// compile-flags: -Z unpretty=hir + +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#[prelude_import] +use ::std::prelude::rust_2015::*; +#[macro_use] +extern crate std; + +trait Animal { } + +fn main() { + pub type ServeFut = /*impl Trait*/; + } diff --git a/src/test/ui/issues/issue-60662.rs b/src/test/ui/issues/issue-60662.rs index 967c5f8ed7..1320d2bbe9 100644 --- a/src/test/ui/issues/issue-60662.rs +++ b/src/test/ui/issues/issue-60662.rs @@ -1,7 +1,10 @@ // check-pass // compile-flags: -Z unpretty=hir -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait Animal { } diff --git a/src/test/ui/issues/issue-6458-4.stderr b/src/test/ui/issues/issue-6458-4.stderr index 00ebff9007..0cf82d37d5 100644 --- a/src/test/ui/issues/issue-6458-4.stderr +++ b/src/test/ui/issues/issue-6458-4.stderr @@ -2,13 +2,13 @@ error[E0308]: mismatched types --> $DIR/issue-6458-4.rs:1:20 | LL | fn foo(b: bool) -> Result { - | --- ^^^^^^^^^^^^^^^^^^^ expected enum `std::result::Result`, found `()` + | --- ^^^^^^^^^^^^^^^^^^^ expected enum `Result`, found `()` | | | implicitly returns `()` as its body has no tail or `return` expression LL | Err("bar".to_string()); | - help: consider removing this semicolon | - = note: expected enum `std::result::Result` + = note: expected enum `Result` found unit type `()` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-70724-add_type_neq_err_label-unwrap.stderr b/src/test/ui/issues/issue-70724-add_type_neq_err_label-unwrap.stderr index f5a56d7553..20e4b10768 100644 --- a/src/test/ui/issues/issue-70724-add_type_neq_err_label-unwrap.stderr +++ b/src/test/ui/issues/issue-70724-add_type_neq_err_label-unwrap.stderr @@ -28,11 +28,14 @@ LL | fn a() -> i32 { ... LL | assert_eq!(a, 0); | ^^^^^^^^^^^^^^^^^ `fn() -> i32 {a}` cannot be formatted using `{:?}` because it doesn't implement `Debug` + | + ::: $SRC_DIR/core/src/panicking.rs:LL:COL + | +LL | T: fmt::Debug + ?Sized, + | ---------- required by this bound in `core::panicking::assert_failed` | = help: the trait `Debug` is not implemented for `fn() -> i32 {a}` = help: use parentheses to call the function: `a()` - = note: required because of the requirements on the impl of `Debug` for `&fn() -> i32 {a}` - = note: required by `std::fmt::Debug::fmt` = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to 3 previous errors diff --git a/src/test/ui/issues/issue-74086.stderr b/src/test/ui/issues/issue-74086.stderr index 4127f48a09..e602425059 100644 --- a/src/test/ui/issues/issue-74086.stderr +++ b/src/test/ui/issues/issue-74086.stderr @@ -2,10 +2,7 @@ error[E0121]: the type placeholder `_` is not allowed within types on item signa --> $DIR/issue-74086.rs:2:20 | LL | static BUG: fn(_) -> u8 = |_| 8; - | ^ - | | - | not allowed in type signatures - | help: use type parameters instead: `T` + | ^ not allowed in type signatures error: aborting due to previous error diff --git a/src/test/ui/issues/issue-75307.stderr b/src/test/ui/issues/issue-75307.stderr index 4a5d997e00..10c952006c 100644 --- a/src/test/ui/issues/issue-75307.stderr +++ b/src/test/ui/issues/issue-75307.stderr @@ -1,8 +1,8 @@ error: invalid reference to positional arguments 1 and 2 (there is 1 argument) - --> $DIR/issue-75307.rs:2:13 + --> $DIR/issue-75307.rs:2:17 | LL | format!(r"{}{}{}", named_arg=1); - | ^^^^^^^^^ + | ^^^^ | = note: positional arguments are zero-based diff --git a/src/test/ui/issues/issue-77002.rs b/src/test/ui/issues/issue-77002.rs index c7dd3cf810..0c37346eaf 100644 --- a/src/test/ui/issues/issue-77002.rs +++ b/src/test/ui/issues/issue-77002.rs @@ -1,4 +1,4 @@ -// compile-flags: -Zmir-opt-level=2 -Copt-level=0 +// compile-flags: -Zmir-opt-level=3 -Copt-level=0 // run-pass type M = [i64; 2]; diff --git a/src/test/ui/issues/issue-78622.stderr b/src/test/ui/issues/issue-78622.stderr index f13073da0a..f7d44f21d3 100644 --- a/src/test/ui/issues/issue-78622.stderr +++ b/src/test/ui/issues/issue-78622.stderr @@ -2,7 +2,7 @@ error[E0223]: ambiguous associated type --> $DIR/issue-78622.rs:5:5 | LL | S::A:: {} - | ^^^^^^^^^ help: use fully-qualified syntax: `::A` + | ^^^^ help: use fully-qualified syntax: `::A` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-79593.rs b/src/test/ui/issues/issue-79593.rs index fb54b36940..b94278bfdd 100644 --- a/src/test/ui/issues/issue-79593.rs +++ b/src/test/ui/issues/issue-79593.rs @@ -23,7 +23,7 @@ fn wrong() { foo::Enum::Variant { x: () }; //~^ ERROR missing field `y` in initializer of `Enum` foo::Enum::Variant { }; - //~^ ERROR missing fields `x`, `y` in initializer of `Enum` + //~^ ERROR missing fields `x` and `y` in initializer of `Enum` } fn main() {} diff --git a/src/test/ui/issues/issue-79593.stderr b/src/test/ui/issues/issue-79593.stderr index 33dbd85032..b8c7d4f23a 100644 --- a/src/test/ui/issues/issue-79593.stderr +++ b/src/test/ui/issues/issue-79593.stderr @@ -22,11 +22,11 @@ error[E0063]: missing field `y` in initializer of `Enum` LL | foo::Enum::Variant { x: () }; | ^^^^^^^^^^^^^^^^^^ missing `y` -error[E0063]: missing fields `x`, `y` in initializer of `Enum` +error[E0063]: missing fields `x` and `y` in initializer of `Enum` --> $DIR/issue-79593.rs:25:5 | LL | foo::Enum::Variant { }; - | ^^^^^^^^^^^^^^^^^^ missing `x`, `y` + | ^^^^^^^^^^^^^^^^^^ missing `x` and `y` error: aborting due to 5 previous errors diff --git a/src/test/ui/issues/issue-79744.rs b/src/test/ui/issues/issue-79744.rs new file mode 100644 index 0000000000..e9725a027d --- /dev/null +++ b/src/test/ui/issues/issue-79744.rs @@ -0,0 +1,13 @@ +fn main() { + let elem = 6i8; + let e2 = 230; + //~^ ERROR literal out of range for `i8` + //~| HELP consider using the type `u8` instead + + let mut vec = Vec::new(); + + vec.push(e2); + vec.push(elem); + + println!("{:?}", vec); +} diff --git a/src/test/ui/issues/issue-79744.stderr b/src/test/ui/issues/issue-79744.stderr new file mode 100644 index 0000000000..6f6dd44d23 --- /dev/null +++ b/src/test/ui/issues/issue-79744.stderr @@ -0,0 +1,12 @@ +error: literal out of range for `i8` + --> $DIR/issue-79744.rs:3:14 + | +LL | let e2 = 230; + | ^^^ + | + = note: `#[deny(overflowing_literals)]` on by default + = note: the literal `230` does not fit into the type `i8` whose range is `-128..=127` + = help: consider using the type `u8` instead + +error: aborting due to previous error + diff --git a/src/test/ui/issues/issue-80607.stderr b/src/test/ui/issues/issue-80607.stderr index 5375478942..22a660b416 100644 --- a/src/test/ui/issues/issue-80607.stderr +++ b/src/test/ui/issues/issue-80607.stderr @@ -7,7 +7,7 @@ LL | V1(i32), LL | Enum::V1 { x } | -------- ^ field does not exist | | - | `Enum::V1` is a tuple variant, use the appropriate syntax: `Enum::V1(/* fields */)` + | help: `Enum::V1` is a tuple variant, use the appropriate syntax: `Enum::V1(/* fields */)` error: aborting due to previous error diff --git a/src/test/ui/issues/issue-81584.fixed b/src/test/ui/issues/issue-81584.fixed new file mode 100644 index 0000000000..1cad59f106 --- /dev/null +++ b/src/test/ui/issues/issue-81584.fixed @@ -0,0 +1,8 @@ +// run-rustfix +fn main() { + let _ = vec![vec![0, 1], vec![2]] + .into_iter() + .map(|y| y.iter().map(|x| x + 1).collect::>()) + //~^ ERROR cannot return value referencing function parameter `y` + .collect::>(); +} diff --git a/src/test/ui/issues/issue-81584.rs b/src/test/ui/issues/issue-81584.rs new file mode 100644 index 0000000000..452288db08 --- /dev/null +++ b/src/test/ui/issues/issue-81584.rs @@ -0,0 +1,8 @@ +// run-rustfix +fn main() { + let _ = vec![vec![0, 1], vec![2]] + .into_iter() + .map(|y| y.iter().map(|x| x + 1)) + //~^ ERROR cannot return value referencing function parameter `y` + .collect::>(); +} diff --git a/src/test/ui/issues/issue-81584.stderr b/src/test/ui/issues/issue-81584.stderr new file mode 100644 index 0000000000..d57f1b778d --- /dev/null +++ b/src/test/ui/issues/issue-81584.stderr @@ -0,0 +1,14 @@ +error[E0515]: cannot return value referencing function parameter `y` + --> $DIR/issue-81584.rs:5:22 + | +LL | .map(|y| y.iter().map(|x| x + 1)) + | -^^^^^^^^^^^^^^^^^^^^^^ + | | + | returns a value referencing data owned by the current function + | `y` is borrowed here + | + = help: use `.collect()` to allocate the iterator + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0515`. diff --git a/src/test/ui/issues/issue-81885.rs b/src/test/ui/issues/issue-81885.rs new file mode 100644 index 0000000000..86c39d4a48 --- /dev/null +++ b/src/test/ui/issues/issue-81885.rs @@ -0,0 +1,10 @@ +const TEST4: fn() -> _ = 42; + //~^ ERROR the type placeholder `_` is not allowed within types on item + //signatures + +fn main() { + const TEST5: fn() -> _ = 42; + //~^ ERROR the type placeholder `_` is not allowed within types on item + //signatures + +} diff --git a/src/test/ui/issues/issue-81885.stderr b/src/test/ui/issues/issue-81885.stderr new file mode 100644 index 0000000000..955b428387 --- /dev/null +++ b/src/test/ui/issues/issue-81885.stderr @@ -0,0 +1,15 @@ +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/issue-81885.rs:1:22 + | +LL | const TEST4: fn() -> _ = 42; + | ^ not allowed in type signatures + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/issue-81885.rs:6:26 + | +LL | const TEST5: fn() -> _ = 42; + | ^ not allowed in type signatures + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0121`. diff --git a/src/test/ui/issues/issue-81918.rs b/src/test/ui/issues/issue-81918.rs new file mode 100644 index 0000000000..8938b8a6f2 --- /dev/null +++ b/src/test/ui/issues/issue-81918.rs @@ -0,0 +1,11 @@ +// check-pass +// dont-check-compiler-stdout +// compile-flags: -Z unpretty=mir-cfg + +// This checks that unpretty=mir-cfg does not panic. See #81918. + +const TAG: &'static str = "ABCD"; + +fn main() { + if TAG == "" {} +} diff --git a/src/test/ui/issues/issue-82833-slice-miscompile.rs b/src/test/ui/issues/issue-82833-slice-miscompile.rs new file mode 100644 index 0000000000..b14e5f6fb1 --- /dev/null +++ b/src/test/ui/issues/issue-82833-slice-miscompile.rs @@ -0,0 +1,17 @@ +// run-pass +// compile-flags: -Ccodegen-units=1 -Cinline-threshold=0 -Clink-dead-code -Copt-level=0 -Cdebuginfo=2 +// ignore-tidy-linelength + +// Make sure LLVM does not miscompile this. + +fn make_string(ch: char) -> String { + let mut bytes = [0u8; 4]; + ch.encode_utf8(&mut bytes).into() +} + +fn main() { + let ch = '😃'; + dbg!(ch); + let string = make_string(ch); + dbg!(string); +} diff --git a/src/test/ui/issues/issue-82859-slice-miscompile.rs b/src/test/ui/issues/issue-82859-slice-miscompile.rs new file mode 100644 index 0000000000..b64eb49907 --- /dev/null +++ b/src/test/ui/issues/issue-82859-slice-miscompile.rs @@ -0,0 +1,19 @@ +// run-pass +// compile-flags: -Copt-level=0 -Cdebuginfo=2 + +// Make sure LLVM does not miscompile this. + +fn indirect_get_slice() -> &'static [usize] { + &[] +} + +#[inline(always)] +fn get_slice() -> &'static [usize] { + let ret = indirect_get_slice(); + ret +} + +fn main() { + let output = get_slice().len(); + assert_eq!(output, 0); +} diff --git a/src/test/ui/issues/issue-82869.rs b/src/test/ui/issues/issue-82869.rs new file mode 100644 index 0000000000..a8e688cbe1 --- /dev/null +++ b/src/test/ui/issues/issue-82869.rs @@ -0,0 +1,23 @@ +// only-x86_64 +// Make sure rustc doesn't ICE on asm! for a foreign architecture. + +#![feature(asm)] +#![crate_type = "rlib"] + +pub unsafe fn aarch64(a: f64, b: f64) -> f64 { + let c; + asm!("add {:d}, {:d}, d0", out(vreg) c, in(vreg) a, in("d0") { + || {}; + b + }); + //~^^^^ invalid register class + //~^^^^^ invalid register class + //~^^^^^^ invalid register + c +} + +pub unsafe fn x86(a: f64, b: f64) -> f64 { + let c; + asm!("addsd {}, {}, xmm0", out(xmm_reg) c, in(xmm_reg) a, in("xmm0") b); + c +} diff --git a/src/test/ui/issues/issue-82869.stderr b/src/test/ui/issues/issue-82869.stderr new file mode 100644 index 0000000000..d05714ea6f --- /dev/null +++ b/src/test/ui/issues/issue-82869.stderr @@ -0,0 +1,24 @@ +error: invalid register class `vreg`: unknown register class + --> $DIR/issue-82869.rs:9:32 + | +LL | asm!("add {:d}, {:d}, d0", out(vreg) c, in(vreg) a, in("d0") { + | ^^^^^^^^^^^ + +error: invalid register class `vreg`: unknown register class + --> $DIR/issue-82869.rs:9:45 + | +LL | asm!("add {:d}, {:d}, d0", out(vreg) c, in(vreg) a, in("d0") { + | ^^^^^^^^^^ + +error: invalid register `d0`: unknown register + --> $DIR/issue-82869.rs:9:57 + | +LL | asm!("add {:d}, {:d}, d0", out(vreg) c, in(vreg) a, in("d0") { + | _________________________________________________________^ +LL | | || {}; +LL | | b +LL | | }); + | |_____^ + +error: aborting due to 3 previous errors + diff --git a/src/test/ui/layout/debug.rs b/src/test/ui/layout/debug.rs index 299151df66..317955f0e3 100644 --- a/src/test/ui/layout/debug.rs +++ b/src/test/ui/layout/debug.rs @@ -1,5 +1,5 @@ // normalize-stderr-test "pref: Align \{\n *pow2: [1-3],\n *\}" -> "pref: $$PREF_ALIGN" -#![feature(never_type, rustc_attrs, type_alias_impl_trait)] +#![feature(never_type, rustc_attrs, min_type_alias_impl_trait)] #![crate_type = "lib"] #[rustc_layout(debug)] diff --git a/src/test/ui/layout/hexagon-enum.rs b/src/test/ui/layout/hexagon-enum.rs new file mode 100644 index 0000000000..4c58537e30 --- /dev/null +++ b/src/test/ui/layout/hexagon-enum.rs @@ -0,0 +1,34 @@ +// compile-flags: --target hexagon-unknown-linux-musl +// needs-llvm-components: hexagon +// +// Verify that the hexagon targets implement the repr(C) for enums correctly. +// +// See #82100 +#![feature(never_type, rustc_attrs, no_core, lang_items)] +#![crate_type = "lib"] +#![no_core] + +#[lang="sized"] +trait Sized {} + +#[rustc_layout(debug)] +#[repr(C)] +enum A { Apple } //~ ERROR: layout_of + +#[rustc_layout(debug)] +#[repr(C)] +enum B { Banana = 255, } //~ ERROR: layout_of + +#[rustc_layout(debug)] +#[repr(C)] +enum C { Chaenomeles = 256, } //~ ERROR: layout_of + +#[rustc_layout(debug)] +#[repr(C)] +enum P { Peach = 0x1000_0000isize, } //~ ERROR: layout_of + +const TANGERINE: usize = 0x8100_0000; // hack to get negative numbers without negation operator! + +#[rustc_layout(debug)] +#[repr(C)] +enum T { Tangerine = TANGERINE as isize } //~ ERROR: layout_of diff --git a/src/test/ui/layout/hexagon-enum.stderr b/src/test/ui/layout/hexagon-enum.stderr new file mode 100644 index 0000000000..d4676a5afb --- /dev/null +++ b/src/test/ui/layout/hexagon-enum.stderr @@ -0,0 +1,442 @@ +error: layout_of(A) = Layout { + fields: Arbitrary { + offsets: [ + Size { + raw: 0, + }, + ], + memory_index: [ + 0, + ], + }, + variants: Multiple { + tag: Scalar { + value: Int( + I8, + false, + ), + valid_range: 0..=0, + }, + tag_encoding: Direct, + tag_field: 0, + variants: [ + Layout { + fields: Arbitrary { + offsets: [], + memory_index: [], + }, + variants: Single { + index: 0, + }, + abi: Aggregate { + sized: true, + }, + largest_niche: None, + align: AbiAndPrefAlign { + abi: Align { + pow2: 0, + }, + pref: Align { + pow2: 0, + }, + }, + size: Size { + raw: 1, + }, + }, + ], + }, + abi: Scalar( + Scalar { + value: Int( + I8, + false, + ), + valid_range: 0..=0, + }, + ), + largest_niche: Some( + Niche { + offset: Size { + raw: 0, + }, + scalar: Scalar { + value: Int( + I8, + false, + ), + valid_range: 0..=0, + }, + }, + ), + align: AbiAndPrefAlign { + abi: Align { + pow2: 0, + }, + pref: Align { + pow2: 0, + }, + }, + size: Size { + raw: 1, + }, +} + --> $DIR/hexagon-enum.rs:16:1 + | +LL | enum A { Apple } + | ^^^^^^^^^^^^^^^^ + +error: layout_of(B) = Layout { + fields: Arbitrary { + offsets: [ + Size { + raw: 0, + }, + ], + memory_index: [ + 0, + ], + }, + variants: Multiple { + tag: Scalar { + value: Int( + I8, + false, + ), + valid_range: 255..=255, + }, + tag_encoding: Direct, + tag_field: 0, + variants: [ + Layout { + fields: Arbitrary { + offsets: [], + memory_index: [], + }, + variants: Single { + index: 0, + }, + abi: Aggregate { + sized: true, + }, + largest_niche: None, + align: AbiAndPrefAlign { + abi: Align { + pow2: 0, + }, + pref: Align { + pow2: 0, + }, + }, + size: Size { + raw: 1, + }, + }, + ], + }, + abi: Scalar( + Scalar { + value: Int( + I8, + false, + ), + valid_range: 255..=255, + }, + ), + largest_niche: Some( + Niche { + offset: Size { + raw: 0, + }, + scalar: Scalar { + value: Int( + I8, + false, + ), + valid_range: 255..=255, + }, + }, + ), + align: AbiAndPrefAlign { + abi: Align { + pow2: 0, + }, + pref: Align { + pow2: 0, + }, + }, + size: Size { + raw: 1, + }, +} + --> $DIR/hexagon-enum.rs:20:1 + | +LL | enum B { Banana = 255, } + | ^^^^^^^^^^^^^^^^^^^^^^^^ + +error: layout_of(C) = Layout { + fields: Arbitrary { + offsets: [ + Size { + raw: 0, + }, + ], + memory_index: [ + 0, + ], + }, + variants: Multiple { + tag: Scalar { + value: Int( + I16, + false, + ), + valid_range: 256..=256, + }, + tag_encoding: Direct, + tag_field: 0, + variants: [ + Layout { + fields: Arbitrary { + offsets: [], + memory_index: [], + }, + variants: Single { + index: 0, + }, + abi: Aggregate { + sized: true, + }, + largest_niche: None, + align: AbiAndPrefAlign { + abi: Align { + pow2: 1, + }, + pref: Align { + pow2: 1, + }, + }, + size: Size { + raw: 2, + }, + }, + ], + }, + abi: Scalar( + Scalar { + value: Int( + I16, + false, + ), + valid_range: 256..=256, + }, + ), + largest_niche: Some( + Niche { + offset: Size { + raw: 0, + }, + scalar: Scalar { + value: Int( + I16, + false, + ), + valid_range: 256..=256, + }, + }, + ), + align: AbiAndPrefAlign { + abi: Align { + pow2: 1, + }, + pref: Align { + pow2: 1, + }, + }, + size: Size { + raw: 2, + }, +} + --> $DIR/hexagon-enum.rs:24:1 + | +LL | enum C { Chaenomeles = 256, } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: layout_of(P) = Layout { + fields: Arbitrary { + offsets: [ + Size { + raw: 0, + }, + ], + memory_index: [ + 0, + ], + }, + variants: Multiple { + tag: Scalar { + value: Int( + I32, + false, + ), + valid_range: 268435456..=268435456, + }, + tag_encoding: Direct, + tag_field: 0, + variants: [ + Layout { + fields: Arbitrary { + offsets: [], + memory_index: [], + }, + variants: Single { + index: 0, + }, + abi: Aggregate { + sized: true, + }, + largest_niche: None, + align: AbiAndPrefAlign { + abi: Align { + pow2: 2, + }, + pref: Align { + pow2: 2, + }, + }, + size: Size { + raw: 4, + }, + }, + ], + }, + abi: Scalar( + Scalar { + value: Int( + I32, + false, + ), + valid_range: 268435456..=268435456, + }, + ), + largest_niche: Some( + Niche { + offset: Size { + raw: 0, + }, + scalar: Scalar { + value: Int( + I32, + false, + ), + valid_range: 268435456..=268435456, + }, + }, + ), + align: AbiAndPrefAlign { + abi: Align { + pow2: 2, + }, + pref: Align { + pow2: 2, + }, + }, + size: Size { + raw: 4, + }, +} + --> $DIR/hexagon-enum.rs:28:1 + | +LL | enum P { Peach = 0x1000_0000isize, } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: layout_of(T) = Layout { + fields: Arbitrary { + offsets: [ + Size { + raw: 0, + }, + ], + memory_index: [ + 0, + ], + }, + variants: Multiple { + tag: Scalar { + value: Int( + I32, + true, + ), + valid_range: 2164260864..=2164260864, + }, + tag_encoding: Direct, + tag_field: 0, + variants: [ + Layout { + fields: Arbitrary { + offsets: [], + memory_index: [], + }, + variants: Single { + index: 0, + }, + abi: Aggregate { + sized: true, + }, + largest_niche: None, + align: AbiAndPrefAlign { + abi: Align { + pow2: 2, + }, + pref: Align { + pow2: 2, + }, + }, + size: Size { + raw: 4, + }, + }, + ], + }, + abi: Scalar( + Scalar { + value: Int( + I32, + true, + ), + valid_range: 2164260864..=2164260864, + }, + ), + largest_niche: Some( + Niche { + offset: Size { + raw: 0, + }, + scalar: Scalar { + value: Int( + I32, + true, + ), + valid_range: 2164260864..=2164260864, + }, + }, + ), + align: AbiAndPrefAlign { + abi: Align { + pow2: 2, + }, + pref: Align { + pow2: 2, + }, + }, + size: Size { + raw: 4, + }, +} + --> $DIR/hexagon-enum.rs:34:1 + | +LL | enum T { Tangerine = TANGERINE as isize } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 5 previous errors + diff --git a/src/test/ui/legacy-const-generics-bad.rs b/src/test/ui/legacy-const-generics-bad.rs new file mode 100644 index 0000000000..538eee337c --- /dev/null +++ b/src/test/ui/legacy-const-generics-bad.rs @@ -0,0 +1,16 @@ +// aux-build:legacy-const-generics.rs + +extern crate legacy_const_generics; + +fn foo() { + let a = 1; + legacy_const_generics::foo(0, a, 2); + //~^ ERROR attempt to use a non-constant value in a constant + + legacy_const_generics::foo(0, N, 2); + + legacy_const_generics::foo(0, N + 1, 2); + //~^ ERROR generic parameters may not be used in const operations +} + +fn main() {} diff --git a/src/test/ui/legacy-const-generics-bad.stderr b/src/test/ui/legacy-const-generics-bad.stderr new file mode 100644 index 0000000000..5a44b8e706 --- /dev/null +++ b/src/test/ui/legacy-const-generics-bad.stderr @@ -0,0 +1,20 @@ +error[E0435]: attempt to use a non-constant value in a constant + --> $DIR/legacy-const-generics-bad.rs:7:35 + | +LL | let a = 1; + | ----- help: consider using `const` instead of `let`: `const a` +LL | legacy_const_generics::foo(0, a, 2); + | ^ non-constant value + +error: generic parameters may not be used in const operations + --> $DIR/legacy-const-generics-bad.rs:12:35 + | +LL | legacy_const_generics::foo(0, N + 1, 2); + | ^ cannot perform const operation using `N` + | + = help: const parameters may only be used as standalone arguments, i.e. `N` + = help: use `#![feature(const_generics)]` and `#![feature(const_evaluatable_checked)]` to allow generic const expressions + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0435`. diff --git a/src/test/ui/legacy-const-generics.rs b/src/test/ui/legacy-const-generics.rs new file mode 100644 index 0000000000..9abc72d98e --- /dev/null +++ b/src/test/ui/legacy-const-generics.rs @@ -0,0 +1,18 @@ +// aux-build:legacy-const-generics.rs +// run-pass + +#![feature(rustc_attrs)] + +extern crate legacy_const_generics; + +#[rustc_legacy_const_generics(1)] +pub fn bar(x: usize, z: usize) -> [usize; 3] { + [x, Y, z] +} + +fn main() { + assert_eq!(legacy_const_generics::foo(0 + 0, 1 + 1, 2 + 2), [0, 2, 4]); + assert_eq!(legacy_const_generics::foo::<{1 + 1}>(0 + 0, 2 + 2), [0, 2, 4]); + // FIXME: Only works cross-crate + //assert_eq!(bar(0, 1, 2), [0, 1, 2]); +} diff --git a/src/test/ui/lifetimes/issue-79187.rs b/src/test/ui/lifetimes/issue-79187.rs index bf331d8a60..2ee69ee223 100644 --- a/src/test/ui/lifetimes/issue-79187.rs +++ b/src/test/ui/lifetimes/issue-79187.rs @@ -2,5 +2,5 @@ fn thing(x: impl FnOnce(&u32)) {} fn main() { let f = |_| (); - thing(f); //~ERROR mismatched types + thing(f); //~ERROR implementation of `FnOnce` is not general enough } diff --git a/src/test/ui/lifetimes/issue-79187.stderr b/src/test/ui/lifetimes/issue-79187.stderr index 63f501e08f..3c0439fb66 100644 --- a/src/test/ui/lifetimes/issue-79187.stderr +++ b/src/test/ui/lifetimes/issue-79187.stderr @@ -1,22 +1,11 @@ -error[E0308]: mismatched types +error: implementation of `FnOnce` is not general enough --> $DIR/issue-79187.rs:5:5 | LL | thing(f); - | ^^^^^ lifetime mismatch + | ^^^^^ implementation of `FnOnce` is not general enough | - = note: expected type `FnOnce<(&u32,)>` - found type `FnOnce<(&u32,)>` -note: this closure does not fulfill the lifetime requirements - --> $DIR/issue-79187.rs:4:13 - | -LL | let f = |_| (); - | ^^^^^^ -note: the lifetime requirement is introduced here - --> $DIR/issue-79187.rs:1:18 - | -LL | fn thing(x: impl FnOnce(&u32)) {} - | ^^^^^^^^^^^^ + = note: closure with signature `fn(&'2 u32)` must implement `FnOnce<(&'1 u32,)>`, for any lifetime `'1`... + = note: ...but it actually implements `FnOnce<(&'2 u32,)>`, for some specific lifetime `'2` error: aborting due to previous error -For more information about this error, try `rustc --explain E0308`. 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 c3d597bec2..ef1127c59a 100644 --- a/src/test/ui/lifetimes/lifetime-elision-return-type-trait.stderr +++ b/src/test/ui/lifetimes/lifetime-elision-return-type-trait.stderr @@ -1,8 +1,8 @@ -error[E0277]: the trait bound `std::result::Result<(), _>: Future` is not satisfied +error[E0277]: the trait bound `Result<(), _>: Future` is not satisfied --> $DIR/lifetime-elision-return-type-trait.rs:8:13 | LL | fn foo() -> impl Future> { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Future` is not implemented for `std::result::Result<(), _>` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Future` is not implemented for `Result<(), _>` error: aborting due to previous error diff --git a/src/test/ui/lifetimes/undeclared-lifetime-used-in-debug-macro-issue-70152.rs b/src/test/ui/lifetimes/undeclared-lifetime-used-in-debug-macro-issue-70152.rs new file mode 100644 index 0000000000..cc29f9de7f --- /dev/null +++ b/src/test/ui/lifetimes/undeclared-lifetime-used-in-debug-macro-issue-70152.rs @@ -0,0 +1,16 @@ +#[derive(Eq, PartialEq)] +struct Test { + a: &'b str, + //~^ ERROR use of undeclared lifetime name `'b` + //~| ERROR use of undeclared lifetime name `'b` +} + +trait T { + fn foo(&'static self) {} +} + +impl T for Test { + fn foo(&'b self) {} //~ ERROR use of undeclared lifetime name `'b` +} + +fn main() {} diff --git a/src/test/ui/lifetimes/undeclared-lifetime-used-in-debug-macro-issue-70152.stderr b/src/test/ui/lifetimes/undeclared-lifetime-used-in-debug-macro-issue-70152.stderr new file mode 100644 index 0000000000..30142e24cd --- /dev/null +++ b/src/test/ui/lifetimes/undeclared-lifetime-used-in-debug-macro-issue-70152.stderr @@ -0,0 +1,40 @@ +error[E0261]: use of undeclared lifetime name `'b` + --> $DIR/undeclared-lifetime-used-in-debug-macro-issue-70152.rs:13:13 + | +LL | fn foo(&'b self) {} + | ^^ undeclared lifetime + | + = help: if you want to experiment with in-band lifetime bindings, add `#![feature(in_band_lifetimes)]` to the crate attributes +help: consider introducing lifetime `'b` here + | +LL | impl<'b> T for Test { + | ^^^^ +help: consider introducing lifetime `'b` here + | +LL | fn foo<'b>(&'b self) {} + | ^^^^ + +error[E0261]: use of undeclared lifetime name `'b` + --> $DIR/undeclared-lifetime-used-in-debug-macro-issue-70152.rs:3:9 + | +LL | struct Test { + | - help: consider introducing lifetime `'b` here: `<'b>` +LL | a: &'b str, + | ^^ undeclared lifetime + | + = help: if you want to experiment with in-band lifetime bindings, add `#![feature(in_band_lifetimes)]` to the crate attributes + +error[E0261]: use of undeclared lifetime name `'b` + --> $DIR/undeclared-lifetime-used-in-debug-macro-issue-70152.rs:3:9 + | +LL | #[derive(Eq, PartialEq)] + | -- lifetime `'b` is missing in item created through this procedural macro +LL | struct Test { +LL | a: &'b str, + | ^^ undeclared lifetime + | + = help: if you want to experiment with in-band lifetime bindings, add `#![feature(in_band_lifetimes)]` to the crate attributes + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0261`. diff --git a/src/test/ui/huge-array-simple-32.rs b/src/test/ui/limits/huge-array-simple-32.rs similarity index 100% rename from src/test/ui/huge-array-simple-32.rs rename to src/test/ui/limits/huge-array-simple-32.rs diff --git a/src/test/ui/huge-array-simple-32.stderr b/src/test/ui/limits/huge-array-simple-32.stderr similarity index 100% rename from src/test/ui/huge-array-simple-32.stderr rename to src/test/ui/limits/huge-array-simple-32.stderr diff --git a/src/test/ui/huge-array-simple-64.rs b/src/test/ui/limits/huge-array-simple-64.rs similarity index 100% rename from src/test/ui/huge-array-simple-64.rs rename to src/test/ui/limits/huge-array-simple-64.rs diff --git a/src/test/ui/huge-array-simple-64.stderr b/src/test/ui/limits/huge-array-simple-64.stderr similarity index 100% rename from src/test/ui/huge-array-simple-64.stderr rename to src/test/ui/limits/huge-array-simple-64.stderr diff --git a/src/test/ui/huge-array.rs b/src/test/ui/limits/huge-array.rs similarity index 100% rename from src/test/ui/huge-array.rs rename to src/test/ui/limits/huge-array.rs diff --git a/src/test/ui/huge-array.stderr b/src/test/ui/limits/huge-array.stderr similarity index 100% rename from src/test/ui/huge-array.stderr rename to src/test/ui/limits/huge-array.stderr diff --git a/src/test/ui/huge-enum.rs b/src/test/ui/limits/huge-enum.rs similarity index 100% rename from src/test/ui/huge-enum.rs rename to src/test/ui/limits/huge-enum.rs diff --git a/src/test/ui/huge-enum.stderr b/src/test/ui/limits/huge-enum.stderr similarity index 100% rename from src/test/ui/huge-enum.stderr rename to src/test/ui/limits/huge-enum.stderr diff --git a/src/test/ui/huge-struct.rs b/src/test/ui/limits/huge-struct.rs similarity index 100% rename from src/test/ui/huge-struct.rs rename to src/test/ui/limits/huge-struct.rs diff --git a/src/test/ui/huge-struct.stderr b/src/test/ui/limits/huge-struct.stderr similarity index 100% rename from src/test/ui/huge-struct.stderr rename to src/test/ui/limits/huge-struct.stderr diff --git a/src/test/ui/issues/issue-15919-32.rs b/src/test/ui/limits/issue-15919-32.rs similarity index 100% rename from src/test/ui/issues/issue-15919-32.rs rename to src/test/ui/limits/issue-15919-32.rs diff --git a/src/test/ui/issues/issue-15919-32.stderr b/src/test/ui/limits/issue-15919-32.stderr similarity index 100% rename from src/test/ui/issues/issue-15919-32.stderr rename to src/test/ui/limits/issue-15919-32.stderr diff --git a/src/test/ui/issues/issue-15919-64.rs b/src/test/ui/limits/issue-15919-64.rs similarity index 100% rename from src/test/ui/issues/issue-15919-64.rs rename to src/test/ui/limits/issue-15919-64.rs diff --git a/src/test/ui/issues/issue-15919-64.stderr b/src/test/ui/limits/issue-15919-64.stderr similarity index 100% rename from src/test/ui/issues/issue-15919-64.stderr rename to src/test/ui/limits/issue-15919-64.stderr diff --git a/src/test/ui/issues/issue-17913.rs b/src/test/ui/limits/issue-17913.rs similarity index 100% rename from src/test/ui/issues/issue-17913.rs rename to src/test/ui/limits/issue-17913.rs diff --git a/src/test/ui/issues/issue-17913.stderr b/src/test/ui/limits/issue-17913.stderr similarity index 100% rename from src/test/ui/issues/issue-17913.stderr rename to src/test/ui/limits/issue-17913.stderr diff --git a/src/test/ui/consts/issue-55878.rs b/src/test/ui/limits/issue-55878.rs similarity index 100% rename from src/test/ui/consts/issue-55878.rs rename to src/test/ui/limits/issue-55878.rs diff --git a/src/test/ui/consts/issue-55878.stderr b/src/test/ui/limits/issue-55878.stderr similarity index 100% rename from src/test/ui/consts/issue-55878.stderr rename to src/test/ui/limits/issue-55878.stderr diff --git a/src/test/ui/consts/issue-56762.rs b/src/test/ui/limits/issue-56762.rs similarity index 100% rename from src/test/ui/consts/issue-56762.rs rename to src/test/ui/limits/issue-56762.rs diff --git a/src/test/ui/consts/issue-56762.stderr b/src/test/ui/limits/issue-56762.stderr similarity index 100% rename from src/test/ui/consts/issue-56762.stderr rename to src/test/ui/limits/issue-56762.stderr diff --git a/src/test/ui/lint/issue-69485-var-size-diffs-too-large.rs b/src/test/ui/limits/issue-69485-var-size-diffs-too-large.rs similarity index 100% rename from src/test/ui/lint/issue-69485-var-size-diffs-too-large.rs rename to src/test/ui/limits/issue-69485-var-size-diffs-too-large.rs diff --git a/src/test/ui/lint/issue-69485-var-size-diffs-too-large.stderr b/src/test/ui/limits/issue-69485-var-size-diffs-too-large.stderr similarity index 100% rename from src/test/ui/lint/issue-69485-var-size-diffs-too-large.stderr rename to src/test/ui/limits/issue-69485-var-size-diffs-too-large.stderr diff --git a/src/test/ui/limits/issue-75158-64.rs b/src/test/ui/limits/issue-75158-64.rs new file mode 100644 index 0000000000..06c209c078 --- /dev/null +++ b/src/test/ui/limits/issue-75158-64.rs @@ -0,0 +1,16 @@ +//~ ERROR + +// build-fail +// ignore-32bit + +struct S { + x: [T; !0], +} + +pub fn f() -> usize { + std::mem::size_of::>() +} + +fn main() { + let x = f(); +} diff --git a/src/test/ui/limits/issue-75158-64.stderr b/src/test/ui/limits/issue-75158-64.stderr new file mode 100644 index 0000000000..dc11d05615 --- /dev/null +++ b/src/test/ui/limits/issue-75158-64.stderr @@ -0,0 +1,4 @@ +error: values of the type `[u8; 18446744073709551615]` are too big for the current architecture + +error: aborting due to previous error + diff --git a/src/test/ui/lint/auxiliary/lint_stability_fields.rs b/src/test/ui/lint/auxiliary/lint_stability_fields.rs index 0efe7686ef..3cbb48c4a6 100644 --- a/src/test/ui/lint/auxiliary/lint_stability_fields.rs +++ b/src/test/ui/lint/auxiliary/lint_stability_fields.rs @@ -3,20 +3,35 @@ #[stable(feature = "rust1", since = "1.0.0")] pub struct Stable { - #[stable(feature = "rust1", since = "1.0.0")] - pub inherit: u8, // it's a lie (stable doesn't inherit) + pub inherit: u8, #[unstable(feature = "unstable_test_feature", issue = "none")] pub override1: u8, #[rustc_deprecated(since = "1.0.0", reason = "text")] #[unstable(feature = "unstable_test_feature", issue = "none")] pub override2: u8, + #[stable(feature = "rust2", since = "2.0.0")] + pub override3: u8, } #[stable(feature = "rust1", since = "1.0.0")] -pub struct Stable2(#[stable(feature = "rust1", since = "1.0.0")] pub u8, +pub struct Stable2(#[stable(feature = "rust2", since = "2.0.0")] pub u8, #[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); + #[rustc_deprecated(since = "1.0.0", reason = "text")] pub u8, + pub u8); + +#[stable(feature = "rust1", since = "1.0.0")] +pub enum Stable3 { + Inherit(u8), + InheritOverride(#[stable(feature = "rust2", since = "2.0.0")] u8), + #[stable(feature = "rust2", since = "2.0.0")] + Override1, + #[unstable(feature = "unstable_test_feature", issue = "none")] + Override2, + #[rustc_deprecated(since = "1.0.0", reason = "text")] + #[unstable(feature = "unstable_test_feature", issue = "none")] + Override3, +} #[unstable(feature = "unstable_test_feature", issue = "none")] pub struct Unstable { diff --git a/src/test/ui/lint/auxiliary/unaligned_references_external_crate.rs b/src/test/ui/lint/auxiliary/unaligned_references_external_crate.rs new file mode 100644 index 0000000000..fb486c6b59 --- /dev/null +++ b/src/test/ui/lint/auxiliary/unaligned_references_external_crate.rs @@ -0,0 +1,28 @@ +#[macro_export] +macro_rules! mac { + ( + $(#[$attrs:meta])* + pub struct $ident:ident { + $( + $(#[$pin:ident])? + $field_vis:vis $field:ident: $field_ty:ty + ),+ $(,)? + } + ) => { + $(#[$attrs])* + pub struct $ident { + $( + $field_vis $field: $field_ty + ),+ + } + + const _: () = { + #[deny(unaligned_references)] + fn __f(this: &$ident) { + $( + let _ = &this.$field; + )+ + } + }; + }; +} diff --git a/src/test/ui/lint/bare-trait-objects-path.rs b/src/test/ui/lint/bare-trait-objects-path.rs new file mode 100644 index 0000000000..4c961e998d --- /dev/null +++ b/src/test/ui/lint/bare-trait-objects-path.rs @@ -0,0 +1,18 @@ +#![feature(associated_type_defaults)] + +trait Assoc { + fn func() {} + const CONST: u8 = 0; + type Ty = u8; +} + +trait Dyn {} + +impl Assoc for dyn Dyn {} + +fn main() { + Dyn::func(); //~ WARN trait objects without an explicit `dyn` are deprecated + ::Dyn::func(); //~ WARN trait objects without an explicit `dyn` are deprecated + Dyn::CONST; //~ WARN trait objects without an explicit `dyn` are deprecated + let _: Dyn::Ty; //~ ERROR ambiguous associated type +} diff --git a/src/test/ui/lint/bare-trait-objects-path.stderr b/src/test/ui/lint/bare-trait-objects-path.stderr new file mode 100644 index 0000000000..0a2dc58582 --- /dev/null +++ b/src/test/ui/lint/bare-trait-objects-path.stderr @@ -0,0 +1,29 @@ +error[E0223]: ambiguous associated type + --> $DIR/bare-trait-objects-path.rs:17:12 + | +LL | let _: Dyn::Ty; + | ^^^^^^^ help: use fully-qualified syntax: `::Ty` + +warning: trait objects without an explicit `dyn` are deprecated + --> $DIR/bare-trait-objects-path.rs:14:5 + | +LL | Dyn::func(); + | ^^^ help: use `dyn`: `` + | + = note: `#[warn(bare_trait_objects)]` on by default + +warning: trait objects without an explicit `dyn` are deprecated + --> $DIR/bare-trait-objects-path.rs:15:5 + | +LL | ::Dyn::func(); + | ^^^^^ help: use `dyn`: `` + +warning: trait objects without an explicit `dyn` are deprecated + --> $DIR/bare-trait-objects-path.rs:16:5 + | +LL | Dyn::CONST; + | ^^^ help: use `dyn`: `` + +error: aborting due to previous error; 3 warnings emitted + +For more information about this error, try `rustc --explain E0223`. diff --git a/src/test/ui/lint/clashing-extern-fn.rs b/src/test/ui/lint/clashing-extern-fn.rs index 41f0baecf2..2ce4dd56ea 100644 --- a/src/test/ui/lint/clashing-extern-fn.rs +++ b/src/test/ui/lint/clashing-extern-fn.rs @@ -1,6 +1,7 @@ // check-pass // aux-build:external_extern_fn.rs #![crate_type = "lib"] +#![feature(no_niche)] #![warn(clashing_extern_declarations)] mod redeclared_different_signature { @@ -383,3 +384,36 @@ mod unknown_layout { } } } + +mod hidden_niche { + mod a { + extern "C" { + fn hidden_niche_transparent() -> usize; + fn hidden_niche_transparent_no_niche() -> usize; + fn hidden_niche_unsafe_cell() -> usize; + } + } + mod b { + use std::cell::UnsafeCell; + use std::num::NonZeroUsize; + + #[repr(transparent)] + struct Transparent { x: NonZeroUsize } + + #[repr(no_niche)] + #[repr(transparent)] + struct TransparentNoNiche { y: NonZeroUsize } + + extern "C" { + fn hidden_niche_transparent() -> Option; + + fn hidden_niche_transparent_no_niche() -> Option; + //~^ WARN redeclared with a different signature + //~| WARN block uses type `Option`, which is not FFI-safe + + fn hidden_niche_unsafe_cell() -> Option>; + //~^ WARN redeclared with a different signature + //~| WARN block uses type `Option>`, which is not FFI-safe + } + } +} diff --git a/src/test/ui/lint/clashing-extern-fn.stderr b/src/test/ui/lint/clashing-extern-fn.stderr index a48b0d008f..a856de322c 100644 --- a/src/test/ui/lint/clashing-extern-fn.stderr +++ b/src/test/ui/lint/clashing-extern-fn.stderr @@ -1,5 +1,5 @@ warning: `clash` redeclared with a different signature - --> $DIR/clashing-extern-fn.rs:14:13 + --> $DIR/clashing-extern-fn.rs:15:13 | LL | fn clash(x: u8); | ---------------- `clash` previously declared here @@ -8,7 +8,7 @@ LL | fn clash(x: u64); | ^^^^^^^^^^^^^^^^^ this signature doesn't match the previous declaration | note: the lint level is defined here - --> $DIR/clashing-extern-fn.rs:4:9 + --> $DIR/clashing-extern-fn.rs:5:9 | LL | #![warn(clashing_extern_declarations)] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -16,7 +16,7 @@ LL | #![warn(clashing_extern_declarations)] found `unsafe extern "C" fn(u64)` warning: `extern_link_name` redeclared with a different signature - --> $DIR/clashing-extern-fn.rs:52:9 + --> $DIR/clashing-extern-fn.rs:53:9 | LL | / #[link_name = "extern_link_name"] LL | | fn some_new_name(x: i16); @@ -29,7 +29,7 @@ LL | fn extern_link_name(x: u32); found `unsafe extern "C" fn(u32)` warning: `some_other_extern_link_name` redeclares `some_other_new_name` with a different signature - --> $DIR/clashing-extern-fn.rs:55:9 + --> $DIR/clashing-extern-fn.rs:56:9 | LL | fn some_other_new_name(x: i16); | ------------------------------- `some_other_new_name` previously declared here @@ -43,7 +43,7 @@ LL | | fn some_other_extern_link_name(x: u32); found `unsafe extern "C" fn(u32)` warning: `other_both_names_different` redeclares `link_name_same` with a different signature - --> $DIR/clashing-extern-fn.rs:59:9 + --> $DIR/clashing-extern-fn.rs:60:9 | LL | / #[link_name = "link_name_same"] LL | | fn both_names_different(x: i16); @@ -58,7 +58,7 @@ LL | | fn other_both_names_different(x: u32); found `unsafe extern "C" fn(u32)` warning: `different_mod` redeclared with a different signature - --> $DIR/clashing-extern-fn.rs:72:9 + --> $DIR/clashing-extern-fn.rs:73:9 | LL | fn different_mod(x: u8); | ------------------------ `different_mod` previously declared here @@ -70,7 +70,7 @@ LL | fn different_mod(x: u64); found `unsafe extern "C" fn(u64)` warning: `variadic_decl` redeclared with a different signature - --> $DIR/clashing-extern-fn.rs:82:9 + --> $DIR/clashing-extern-fn.rs:83:9 | LL | fn variadic_decl(x: u8, ...); | ----------------------------- `variadic_decl` previously declared here @@ -82,7 +82,7 @@ LL | fn variadic_decl(x: u8); found `unsafe extern "C" fn(u8)` warning: `weigh_banana` redeclared with a different signature - --> $DIR/clashing-extern-fn.rs:142:13 + --> $DIR/clashing-extern-fn.rs:143:13 | LL | fn weigh_banana(count: *const Banana) -> u64; | --------------------------------------------- `weigh_banana` previously declared here @@ -94,7 +94,7 @@ LL | fn weigh_banana(count: *const Banana) -> u64; found `unsafe extern "C" fn(*const three::Banana) -> u64` warning: `draw_point` redeclared with a different signature - --> $DIR/clashing-extern-fn.rs:171:13 + --> $DIR/clashing-extern-fn.rs:172:13 | LL | fn draw_point(p: Point); | ------------------------ `draw_point` previously declared here @@ -106,7 +106,7 @@ LL | fn draw_point(p: Point); found `unsafe extern "C" fn(sameish_members::b::Point)` warning: `origin` redeclared with a different signature - --> $DIR/clashing-extern-fn.rs:197:13 + --> $DIR/clashing-extern-fn.rs:198:13 | LL | fn origin() -> Point3; | ---------------------- `origin` previously declared here @@ -118,7 +118,7 @@ LL | fn origin() -> Point3; found `unsafe extern "C" fn() -> same_sized_members_clash::b::Point3` warning: `transparent_incorrect` redeclared with a different signature - --> $DIR/clashing-extern-fn.rs:220:13 + --> $DIR/clashing-extern-fn.rs:221:13 | LL | fn transparent_incorrect() -> T; | -------------------------------- `transparent_incorrect` previously declared here @@ -130,7 +130,7 @@ LL | fn transparent_incorrect() -> isize; found `unsafe extern "C" fn() -> isize` warning: `missing_return_type` redeclared with a different signature - --> $DIR/clashing-extern-fn.rs:238:13 + --> $DIR/clashing-extern-fn.rs:239:13 | LL | fn missing_return_type() -> usize; | ---------------------------------- `missing_return_type` previously declared here @@ -142,7 +142,7 @@ LL | fn missing_return_type(); found `unsafe extern "C" fn()` warning: `non_zero_usize` redeclared with a different signature - --> $DIR/clashing-extern-fn.rs:256:13 + --> $DIR/clashing-extern-fn.rs:257:13 | LL | fn non_zero_usize() -> core::num::NonZeroUsize; | ----------------------------------------------- `non_zero_usize` previously declared here @@ -154,7 +154,7 @@ LL | fn non_zero_usize() -> usize; found `unsafe extern "C" fn() -> usize` warning: `non_null_ptr` redeclared with a different signature - --> $DIR/clashing-extern-fn.rs:258:13 + --> $DIR/clashing-extern-fn.rs:259:13 | LL | fn non_null_ptr() -> core::ptr::NonNull; | ----------------------------------------------- `non_null_ptr` previously declared here @@ -166,7 +166,7 @@ LL | fn non_null_ptr() -> *const usize; found `unsafe extern "C" fn() -> *const usize` warning: `option_non_zero_usize_incorrect` redeclared with a different signature - --> $DIR/clashing-extern-fn.rs:356:13 + --> $DIR/clashing-extern-fn.rs:357:13 | LL | fn option_non_zero_usize_incorrect() -> usize; | ---------------------------------------------- `option_non_zero_usize_incorrect` previously declared here @@ -178,7 +178,7 @@ LL | fn option_non_zero_usize_incorrect() -> isize; found `unsafe extern "C" fn() -> isize` warning: `option_non_null_ptr_incorrect` redeclared with a different signature - --> $DIR/clashing-extern-fn.rs:358:13 + --> $DIR/clashing-extern-fn.rs:359:13 | LL | fn option_non_null_ptr_incorrect() -> *const usize; | --------------------------------------------------- `option_non_null_ptr_incorrect` previously declared here @@ -189,5 +189,48 @@ LL | fn option_non_null_ptr_incorrect() -> *const isize; = note: expected `unsafe extern "C" fn() -> *const usize` found `unsafe extern "C" fn() -> *const isize` -warning: 15 warnings emitted +warning: `hidden_niche_transparent_no_niche` redeclared with a different signature + --> $DIR/clashing-extern-fn.rs:410:13 + | +LL | fn hidden_niche_transparent_no_niche() -> usize; + | ------------------------------------------------ `hidden_niche_transparent_no_niche` previously declared here +... +LL | fn hidden_niche_transparent_no_niche() -> Option; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this signature doesn't match the previous declaration + | + = note: expected `unsafe extern "C" fn() -> usize` + found `unsafe extern "C" fn() -> Option` + +warning: `hidden_niche_unsafe_cell` redeclared with a different signature + --> $DIR/clashing-extern-fn.rs:414:13 + | +LL | fn hidden_niche_unsafe_cell() -> usize; + | --------------------------------------- `hidden_niche_unsafe_cell` previously declared here +... +LL | fn hidden_niche_unsafe_cell() -> Option>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ this signature doesn't match the previous declaration + | + = note: expected `unsafe extern "C" fn() -> usize` + found `unsafe extern "C" fn() -> Option>` + +warning: `extern` block uses type `Option`, which is not FFI-safe + --> $DIR/clashing-extern-fn.rs:410:55 + | +LL | fn hidden_niche_transparent_no_niche() -> Option; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = note: `#[warn(improper_ctypes)]` on by default + = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum + = note: enum has no representation hint + +warning: `extern` block uses type `Option>`, which is not FFI-safe + --> $DIR/clashing-extern-fn.rs:414:46 + | +LL | fn hidden_niche_unsafe_cell() -> Option>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum + = note: enum has no representation hint + +warning: 19 warnings emitted diff --git a/src/test/ui/lint/dead-code/write-only-field.rs b/src/test/ui/lint/dead-code/write-only-field.rs new file mode 100644 index 0000000000..7b3f1e9f5b --- /dev/null +++ b/src/test/ui/lint/dead-code/write-only-field.rs @@ -0,0 +1,69 @@ +#![deny(dead_code)] + +struct S { + f: i32, //~ ERROR: field is never read + sub: Sub, //~ ERROR: field is never read +} + +struct Sub { + f: i32, //~ ERROR: field is never read +} + +fn field_write(s: &mut S) { + s.f = 1; + s.sub.f = 2; +} + +fn main() { + let mut s = S { f: 0, sub: Sub { f: 0 } }; + field_write(&mut s); + + auto_deref(); + nested_boxes(); +} + +fn auto_deref() { + struct E { + x: bool, + y: bool, //~ ERROR: field is never read + } + + struct P<'a> { + e: &'a mut E + } + + impl P<'_> { + fn f(&mut self) { + self.e.x = true; + self.e.y = true; + } + } + + let mut e = E { x: false, y: false }; + let mut p = P { e: &mut e }; + p.f(); + assert!(e.x); +} + +fn nested_boxes() { + struct A { + b: Box, + } + + struct B { + c: Box, + } + + struct C { + u: u32, //~ ERROR: field is never read + v: u32, //~ ERROR: field is never read + } + + let mut a = A { + b: Box::new(B { + c: Box::new(C { u: 0, v: 0 }), + }), + }; + a.b.c.v = 10; + a.b.c = Box::new(C { u: 1, v: 2 }); +} diff --git a/src/test/ui/lint/dead-code/write-only-field.stderr b/src/test/ui/lint/dead-code/write-only-field.stderr new file mode 100644 index 0000000000..a191d22c8b --- /dev/null +++ b/src/test/ui/lint/dead-code/write-only-field.stderr @@ -0,0 +1,44 @@ +error: field is never read: `f` + --> $DIR/write-only-field.rs:4:5 + | +LL | f: i32, + | ^^^^^^ + | +note: the lint level is defined here + --> $DIR/write-only-field.rs:1:9 + | +LL | #![deny(dead_code)] + | ^^^^^^^^^ + +error: field is never read: `sub` + --> $DIR/write-only-field.rs:5:5 + | +LL | sub: Sub, + | ^^^^^^^^ + +error: field is never read: `f` + --> $DIR/write-only-field.rs:9:5 + | +LL | f: i32, + | ^^^^^^ + +error: field is never read: `y` + --> $DIR/write-only-field.rs:28:9 + | +LL | y: bool, + | ^^^^^^^ + +error: field is never read: `u` + --> $DIR/write-only-field.rs:58:9 + | +LL | u: u32, + | ^^^^^^ + +error: field is never read: `v` + --> $DIR/write-only-field.rs:59:9 + | +LL | v: u32, + | ^^^^^^ + +error: aborting due to 6 previous errors + diff --git a/src/test/ui/lint/inline-trait-and-foreign-items.full_tait.stderr b/src/test/ui/lint/inline-trait-and-foreign-items.full_tait.stderr new file mode 100644 index 0000000000..65b4631010 --- /dev/null +++ b/src/test/ui/lint/inline-trait-and-foreign-items.full_tait.stderr @@ -0,0 +1,81 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/inline-trait-and-foreign-items.rs:4:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: `#[inline]` is ignored on constants + --> $DIR/inline-trait-and-foreign-items.rs:10:5 + | +LL | #[inline] + | ^^^^^^^^^ + | +note: the lint level is defined here + --> $DIR/inline-trait-and-foreign-items.rs:7:9 + | +LL | #![warn(unused_attributes)] + | ^^^^^^^^^^^^^^^^^ + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: see issue #65833 for more information + +error[E0518]: attribute should be applied to function or closure + --> $DIR/inline-trait-and-foreign-items.rs:14:5 + | +LL | #[inline] + | ^^^^^^^^^ +LL | type T; + | ------- not a function or closure + +warning: `#[inline]` is ignored on constants + --> $DIR/inline-trait-and-foreign-items.rs:21:5 + | +LL | #[inline] + | ^^^^^^^^^ + | + = warning: this was previously accepted by the compiler but is being phased out; it will become a hard error in a future release! + = note: see issue #65833 for more information + +error[E0518]: attribute should be applied to function or closure + --> $DIR/inline-trait-and-foreign-items.rs:25:5 + | +LL | #[inline] + | ^^^^^^^^^ +LL | type T = Self; + | -------------- not a function or closure + +error[E0518]: attribute should be applied to function or closure + --> $DIR/inline-trait-and-foreign-items.rs:28:5 + | +LL | #[inline] + | ^^^^^^^^^ +LL | type U = impl Trait; + | -------------------- not a function or closure + +error[E0518]: attribute should be applied to function or closure + --> $DIR/inline-trait-and-foreign-items.rs:33:5 + | +LL | #[inline] + | ^^^^^^^^^ +LL | static X: u32; + | -------------- not a function or closure + +error[E0518]: attribute should be applied to function or closure + --> $DIR/inline-trait-and-foreign-items.rs:36:5 + | +LL | #[inline] + | ^^^^^^^^^ +LL | type T; + | ------- not a function or closure + +error: could not find defining uses + --> $DIR/inline-trait-and-foreign-items.rs:29:14 + | +LL | type U = impl Trait; + | ^^^^^^^^^^ + +error: aborting due to 6 previous errors; 3 warnings emitted + +For more information about this error, try `rustc --explain E0518`. diff --git a/src/test/ui/lint/inline-trait-and-foreign-items.stderr b/src/test/ui/lint/inline-trait-and-foreign-items.min_tait.stderr similarity index 85% rename from src/test/ui/lint/inline-trait-and-foreign-items.stderr rename to src/test/ui/lint/inline-trait-and-foreign-items.min_tait.stderr index 6ac884c12c..b9f123905a 100644 --- a/src/test/ui/lint/inline-trait-and-foreign-items.stderr +++ b/src/test/ui/lint/inline-trait-and-foreign-items.min_tait.stderr @@ -1,11 +1,11 @@ warning: `#[inline]` is ignored on constants - --> $DIR/inline-trait-and-foreign-items.rs:7:5 + --> $DIR/inline-trait-and-foreign-items.rs:10:5 | LL | #[inline] | ^^^^^^^^^ | note: the lint level is defined here - --> $DIR/inline-trait-and-foreign-items.rs:4:9 + --> $DIR/inline-trait-and-foreign-items.rs:7:9 | LL | #![warn(unused_attributes)] | ^^^^^^^^^^^^^^^^^ @@ -13,7 +13,7 @@ LL | #![warn(unused_attributes)] = note: see issue #65833 for more information error[E0518]: attribute should be applied to function or closure - --> $DIR/inline-trait-and-foreign-items.rs:11:5 + --> $DIR/inline-trait-and-foreign-items.rs:14:5 | LL | #[inline] | ^^^^^^^^^ @@ -21,7 +21,7 @@ LL | type T; | ------- not a function or closure warning: `#[inline]` is ignored on constants - --> $DIR/inline-trait-and-foreign-items.rs:18:5 + --> $DIR/inline-trait-and-foreign-items.rs:21:5 | LL | #[inline] | ^^^^^^^^^ @@ -30,7 +30,7 @@ LL | #[inline] = note: see issue #65833 for more information error[E0518]: attribute should be applied to function or closure - --> $DIR/inline-trait-and-foreign-items.rs:22:5 + --> $DIR/inline-trait-and-foreign-items.rs:25:5 | LL | #[inline] | ^^^^^^^^^ @@ -38,7 +38,7 @@ LL | type T = Self; | -------------- not a function or closure error[E0518]: attribute should be applied to function or closure - --> $DIR/inline-trait-and-foreign-items.rs:25:5 + --> $DIR/inline-trait-and-foreign-items.rs:28:5 | LL | #[inline] | ^^^^^^^^^ @@ -46,7 +46,7 @@ LL | type U = impl Trait; | -------------------- not a function or closure error[E0518]: attribute should be applied to function or closure - --> $DIR/inline-trait-and-foreign-items.rs:30:5 + --> $DIR/inline-trait-and-foreign-items.rs:33:5 | LL | #[inline] | ^^^^^^^^^ @@ -54,7 +54,7 @@ LL | static X: u32; | -------------- not a function or closure error[E0518]: attribute should be applied to function or closure - --> $DIR/inline-trait-and-foreign-items.rs:33:5 + --> $DIR/inline-trait-and-foreign-items.rs:36:5 | LL | #[inline] | ^^^^^^^^^ @@ -62,7 +62,7 @@ LL | type T; | ------- not a function or closure error: could not find defining uses - --> $DIR/inline-trait-and-foreign-items.rs:26:14 + --> $DIR/inline-trait-and-foreign-items.rs:29:14 | LL | type U = impl Trait; | ^^^^^^^^^^ diff --git a/src/test/ui/lint/inline-trait-and-foreign-items.rs b/src/test/ui/lint/inline-trait-and-foreign-items.rs index 6321b3c76e..3103cc9d31 100644 --- a/src/test/ui/lint/inline-trait-and-foreign-items.rs +++ b/src/test/ui/lint/inline-trait-and-foreign-items.rs @@ -1,5 +1,8 @@ #![feature(extern_types)] -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #![warn(unused_attributes)] diff --git a/src/test/ui/issues/issue-31924-non-snake-ffi.rs b/src/test/ui/lint/issue-31924-non-snake-ffi.rs similarity index 100% rename from src/test/ui/issues/issue-31924-non-snake-ffi.rs rename to src/test/ui/lint/issue-31924-non-snake-ffi.rs diff --git a/src/test/ui/lint/issue-47390-unused-variable-in-struct-pattern.stderr b/src/test/ui/lint/issue-47390-unused-variable-in-struct-pattern.stderr index 3efd87f6a5..2ef655efdb 100644 --- a/src/test/ui/lint/issue-47390-unused-variable-in-struct-pattern.stderr +++ b/src/test/ui/lint/issue-47390-unused-variable-in-struct-pattern.stderr @@ -12,16 +12,16 @@ LL | #![warn(unused)] // UI tests pass `-A unused` (#43896) = note: `#[warn(unused_variables)]` implied by `#[warn(unused)]` warning: unused variable: `mut_unused_var` - --> $DIR/issue-47390-unused-variable-in-struct-pattern.rs:33:9 + --> $DIR/issue-47390-unused-variable-in-struct-pattern.rs:33:13 | LL | let mut mut_unused_var = 1; - | ^^^^^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_mut_unused_var` + | ^^^^^^^^^^^^^^ help: if this is intentional, prefix it with an underscore: `_mut_unused_var` warning: unused variable: `var` - --> $DIR/issue-47390-unused-variable-in-struct-pattern.rs:37:10 + --> $DIR/issue-47390-unused-variable-in-struct-pattern.rs:37:14 | LL | let (mut var, unused_var) = (1, 2); - | ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_var` + | ^^^ help: if this is intentional, prefix it with an underscore: `_var` warning: unused variable: `unused_var` --> $DIR/issue-47390-unused-variable-in-struct-pattern.rs:37:19 @@ -36,10 +36,10 @@ LL | if let SoulHistory { corridors_of_light, | ^^^^^^^^^^^^^^^^^^ help: try ignoring the field: `corridors_of_light: _` warning: variable `hours_are_suns` is assigned to, but never used - --> $DIR/issue-47390-unused-variable-in-struct-pattern.rs:46:26 + --> $DIR/issue-47390-unused-variable-in-struct-pattern.rs:46:30 | LL | mut hours_are_suns, - | ^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^ | = note: consider using `_hours_are_suns` instead diff --git a/src/test/ui/lint/issue-81314-unused-span-ident.fixed b/src/test/ui/lint/issue-81314-unused-span-ident.fixed new file mode 100644 index 0000000000..aac918f2bc --- /dev/null +++ b/src/test/ui/lint/issue-81314-unused-span-ident.fixed @@ -0,0 +1,12 @@ +// run-rustfix +// Regression test for #81314: Unused variable lint should +// span only the identifier and not the rest of the pattern + +#![deny(unused)] + +fn main() { + let [_rest @ ..] = [1, 2, 3]; //~ ERROR unused variable +} + +pub fn foo([_rest @ ..]: &[i32]) { //~ ERROR unused variable +} diff --git a/src/test/ui/lint/issue-81314-unused-span-ident.rs b/src/test/ui/lint/issue-81314-unused-span-ident.rs new file mode 100644 index 0000000000..78296f4258 --- /dev/null +++ b/src/test/ui/lint/issue-81314-unused-span-ident.rs @@ -0,0 +1,12 @@ +// run-rustfix +// Regression test for #81314: Unused variable lint should +// span only the identifier and not the rest of the pattern + +#![deny(unused)] + +fn main() { + let [rest @ ..] = [1, 2, 3]; //~ ERROR unused variable +} + +pub fn foo([rest @ ..]: &[i32]) { //~ ERROR unused variable +} diff --git a/src/test/ui/lint/issue-81314-unused-span-ident.stderr b/src/test/ui/lint/issue-81314-unused-span-ident.stderr new file mode 100644 index 0000000000..519c71e941 --- /dev/null +++ b/src/test/ui/lint/issue-81314-unused-span-ident.stderr @@ -0,0 +1,21 @@ +error: unused variable: `rest` + --> $DIR/issue-81314-unused-span-ident.rs:8:10 + | +LL | let [rest @ ..] = [1, 2, 3]; + | ^^^^ help: if this is intentional, prefix it with an underscore: `_rest` + | +note: the lint level is defined here + --> $DIR/issue-81314-unused-span-ident.rs:5:9 + | +LL | #![deny(unused)] + | ^^^^^^ + = note: `#[deny(unused_variables)]` implied by `#[deny(unused)]` + +error: unused variable: `rest` + --> $DIR/issue-81314-unused-span-ident.rs:11:13 + | +LL | pub fn foo([rest @ ..]: &[i32]) { + | ^^^^ help: if this is intentional, prefix it with an underscore: `_rest` + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/lint/lint-ctypes-73249-2.full_tait.stderr b/src/test/ui/lint/lint-ctypes-73249-2.full_tait.stderr new file mode 100644 index 0000000000..619ca15839 --- /dev/null +++ b/src/test/ui/lint/lint-ctypes-73249-2.full_tait.stderr @@ -0,0 +1,24 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/lint-ctypes-73249-2.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: `extern` block uses type `impl Baz`, which is not FFI-safe + --> $DIR/lint-ctypes-73249-2.rs:29:25 + | +LL | pub fn lint_me() -> A<()>; + | ^^^^^ not FFI-safe + | +note: the lint level is defined here + --> $DIR/lint-ctypes-73249-2.rs:5:9 + | +LL | #![deny(improper_ctypes)] + | ^^^^^^^^^^^^^^^ + = note: opaque types have no C equivalent + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/lint/lint-ctypes-73249-2.stderr b/src/test/ui/lint/lint-ctypes-73249-2.min_tait.stderr similarity index 81% rename from src/test/ui/lint/lint-ctypes-73249-2.stderr rename to src/test/ui/lint/lint-ctypes-73249-2.min_tait.stderr index 36dbe3217d..479bd57447 100644 --- a/src/test/ui/lint/lint-ctypes-73249-2.stderr +++ b/src/test/ui/lint/lint-ctypes-73249-2.min_tait.stderr @@ -1,11 +1,11 @@ error: `extern` block uses type `impl Baz`, which is not FFI-safe - --> $DIR/lint-ctypes-73249-2.rs:26:25 + --> $DIR/lint-ctypes-73249-2.rs:29:25 | LL | pub fn lint_me() -> A<()>; | ^^^^^ not FFI-safe | note: the lint level is defined here - --> $DIR/lint-ctypes-73249-2.rs:2:9 + --> $DIR/lint-ctypes-73249-2.rs:5:9 | LL | #![deny(improper_ctypes)] | ^^^^^^^^^^^^^^^ diff --git a/src/test/ui/lint/lint-ctypes-73249-2.rs b/src/test/ui/lint/lint-ctypes-73249-2.rs index 86cc5e2c31..f3313f8921 100644 --- a/src/test/ui/lint/lint-ctypes-73249-2.rs +++ b/src/test/ui/lint/lint-ctypes-73249-2.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #![deny(improper_ctypes)] pub trait Baz { } diff --git a/src/test/ui/lint/lint-ctypes-73249-3.full_tait.stderr b/src/test/ui/lint/lint-ctypes-73249-3.full_tait.stderr new file mode 100644 index 0000000000..af0f26a9f4 --- /dev/null +++ b/src/test/ui/lint/lint-ctypes-73249-3.full_tait.stderr @@ -0,0 +1,24 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/lint-ctypes-73249-3.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: `extern` block uses type `impl Baz`, which is not FFI-safe + --> $DIR/lint-ctypes-73249-3.rs:21:25 + | +LL | pub fn lint_me() -> A; + | ^ not FFI-safe + | +note: the lint level is defined here + --> $DIR/lint-ctypes-73249-3.rs:5:9 + | +LL | #![deny(improper_ctypes)] + | ^^^^^^^^^^^^^^^ + = note: opaque types have no C equivalent + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/lint/lint-ctypes-73249-3.stderr b/src/test/ui/lint/lint-ctypes-73249-3.min_tait.stderr similarity index 81% rename from src/test/ui/lint/lint-ctypes-73249-3.stderr rename to src/test/ui/lint/lint-ctypes-73249-3.min_tait.stderr index 7d133287bd..880581ff05 100644 --- a/src/test/ui/lint/lint-ctypes-73249-3.stderr +++ b/src/test/ui/lint/lint-ctypes-73249-3.min_tait.stderr @@ -1,11 +1,11 @@ error: `extern` block uses type `impl Baz`, which is not FFI-safe - --> $DIR/lint-ctypes-73249-3.rs:18:25 + --> $DIR/lint-ctypes-73249-3.rs:21:25 | LL | pub fn lint_me() -> A; | ^ not FFI-safe | note: the lint level is defined here - --> $DIR/lint-ctypes-73249-3.rs:2:9 + --> $DIR/lint-ctypes-73249-3.rs:5:9 | LL | #![deny(improper_ctypes)] | ^^^^^^^^^^^^^^^ diff --git a/src/test/ui/lint/lint-ctypes-73249-3.rs b/src/test/ui/lint/lint-ctypes-73249-3.rs index 25c4e7c92a..966c7d5ce3 100644 --- a/src/test/ui/lint/lint-ctypes-73249-3.rs +++ b/src/test/ui/lint/lint-ctypes-73249-3.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #![deny(improper_ctypes)] pub trait Baz { } diff --git a/src/test/ui/lint/lint-ctypes-73249-5.full_tait.stderr b/src/test/ui/lint/lint-ctypes-73249-5.full_tait.stderr new file mode 100644 index 0000000000..b80084fce0 --- /dev/null +++ b/src/test/ui/lint/lint-ctypes-73249-5.full_tait.stderr @@ -0,0 +1,24 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/lint-ctypes-73249-5.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: `extern` block uses type `impl Baz`, which is not FFI-safe + --> $DIR/lint-ctypes-73249-5.rs:21:25 + | +LL | pub fn lint_me() -> A; + | ^ not FFI-safe + | +note: the lint level is defined here + --> $DIR/lint-ctypes-73249-5.rs:5:9 + | +LL | #![deny(improper_ctypes)] + | ^^^^^^^^^^^^^^^ + = note: opaque types have no C equivalent + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/lint/lint-ctypes-73249-5.stderr b/src/test/ui/lint/lint-ctypes-73249-5.min_tait.stderr similarity index 81% rename from src/test/ui/lint/lint-ctypes-73249-5.stderr rename to src/test/ui/lint/lint-ctypes-73249-5.min_tait.stderr index d2780cb60e..f42549d909 100644 --- a/src/test/ui/lint/lint-ctypes-73249-5.stderr +++ b/src/test/ui/lint/lint-ctypes-73249-5.min_tait.stderr @@ -1,11 +1,11 @@ error: `extern` block uses type `impl Baz`, which is not FFI-safe - --> $DIR/lint-ctypes-73249-5.rs:18:25 + --> $DIR/lint-ctypes-73249-5.rs:21:25 | LL | pub fn lint_me() -> A; | ^ not FFI-safe | note: the lint level is defined here - --> $DIR/lint-ctypes-73249-5.rs:2:9 + --> $DIR/lint-ctypes-73249-5.rs:5:9 | LL | #![deny(improper_ctypes)] | ^^^^^^^^^^^^^^^ diff --git a/src/test/ui/lint/lint-ctypes-73249-5.rs b/src/test/ui/lint/lint-ctypes-73249-5.rs index 61e46983ed..81979a9b6e 100644 --- a/src/test/ui/lint/lint-ctypes-73249-5.rs +++ b/src/test/ui/lint/lint-ctypes-73249-5.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #![deny(improper_ctypes)] pub trait Baz { } diff --git a/src/test/ui/lint/lint-ctypes-73251-1.full_tait.stderr b/src/test/ui/lint/lint-ctypes-73251-1.full_tait.stderr new file mode 100644 index 0000000000..5610230380 --- /dev/null +++ b/src/test/ui/lint/lint-ctypes-73251-1.full_tait.stderr @@ -0,0 +1,24 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/lint-ctypes-73251-1.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: `extern` block uses type `impl Baz`, which is not FFI-safe + --> $DIR/lint-ctypes-73251-1.rs:24:25 + | +LL | pub fn lint_me() -> ::Assoc; + | ^^^^^^^^^^^^^^^^^^^ not FFI-safe + | +note: the lint level is defined here + --> $DIR/lint-ctypes-73251-1.rs:5:9 + | +LL | #![deny(improper_ctypes)] + | ^^^^^^^^^^^^^^^ + = note: opaque types have no C equivalent + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/lint/lint-ctypes-73251-1.stderr b/src/test/ui/lint/lint-ctypes-73251-1.min_tait.stderr similarity index 82% rename from src/test/ui/lint/lint-ctypes-73251-1.stderr rename to src/test/ui/lint/lint-ctypes-73251-1.min_tait.stderr index 0b4237bb96..5b00fc4cce 100644 --- a/src/test/ui/lint/lint-ctypes-73251-1.stderr +++ b/src/test/ui/lint/lint-ctypes-73251-1.min_tait.stderr @@ -1,11 +1,11 @@ error: `extern` block uses type `impl Baz`, which is not FFI-safe - --> $DIR/lint-ctypes-73251-1.rs:21:25 + --> $DIR/lint-ctypes-73251-1.rs:24:25 | LL | pub fn lint_me() -> ::Assoc; | ^^^^^^^^^^^^^^^^^^^ not FFI-safe | note: the lint level is defined here - --> $DIR/lint-ctypes-73251-1.rs:2:9 + --> $DIR/lint-ctypes-73251-1.rs:5:9 | LL | #![deny(improper_ctypes)] | ^^^^^^^^^^^^^^^ diff --git a/src/test/ui/lint/lint-ctypes-73251-1.rs b/src/test/ui/lint/lint-ctypes-73251-1.rs index 2ce80982f5..3f15a2fb42 100644 --- a/src/test/ui/lint/lint-ctypes-73251-1.rs +++ b/src/test/ui/lint/lint-ctypes-73251-1.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #![deny(improper_ctypes)] pub trait Baz { } diff --git a/src/test/ui/lint/lint-ctypes-73251-2.full_tait.stderr b/src/test/ui/lint/lint-ctypes-73251-2.full_tait.stderr new file mode 100644 index 0000000000..19911264a3 --- /dev/null +++ b/src/test/ui/lint/lint-ctypes-73251-2.full_tait.stderr @@ -0,0 +1,24 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/lint-ctypes-73251-2.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: `extern` block uses type `impl TraitA`, which is not FFI-safe + --> $DIR/lint-ctypes-73251-2.rs:32:25 + | +LL | pub fn lint_me() -> ::Assoc; + | ^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | +note: the lint level is defined here + --> $DIR/lint-ctypes-73251-2.rs:5:9 + | +LL | #![deny(improper_ctypes)] + | ^^^^^^^^^^^^^^^ + = note: opaque types have no C equivalent + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/lint/lint-ctypes-73251-2.stderr b/src/test/ui/lint/lint-ctypes-73251-2.min_tait.stderr similarity index 83% rename from src/test/ui/lint/lint-ctypes-73251-2.stderr rename to src/test/ui/lint/lint-ctypes-73251-2.min_tait.stderr index 43f7629b04..4130ee7b4c 100644 --- a/src/test/ui/lint/lint-ctypes-73251-2.stderr +++ b/src/test/ui/lint/lint-ctypes-73251-2.min_tait.stderr @@ -1,11 +1,11 @@ error: `extern` block uses type `impl TraitA`, which is not FFI-safe - --> $DIR/lint-ctypes-73251-2.rs:29:25 + --> $DIR/lint-ctypes-73251-2.rs:32:25 | LL | pub fn lint_me() -> ::Assoc; | ^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe | note: the lint level is defined here - --> $DIR/lint-ctypes-73251-2.rs:2:9 + --> $DIR/lint-ctypes-73251-2.rs:5:9 | LL | #![deny(improper_ctypes)] | ^^^^^^^^^^^^^^^ diff --git a/src/test/ui/lint/lint-ctypes-73251-2.rs b/src/test/ui/lint/lint-ctypes-73251-2.rs index 3427c657b4..888671daca 100644 --- a/src/test/ui/lint/lint-ctypes-73251-2.rs +++ b/src/test/ui/lint/lint-ctypes-73251-2.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #![deny(improper_ctypes)] pub trait TraitA { diff --git a/src/test/ui/lint/lint-ctypes-73251.full_tait.stderr b/src/test/ui/lint/lint-ctypes-73251.full_tait.stderr new file mode 100644 index 0000000000..577cf6cf54 --- /dev/null +++ b/src/test/ui/lint/lint-ctypes-73251.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/lint-ctypes-73251.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/lint/lint-ctypes-73251.rs b/src/test/ui/lint/lint-ctypes-73251.rs index ebc2ca77b6..36e541612d 100644 --- a/src/test/ui/lint/lint-ctypes-73251.rs +++ b/src/test/ui/lint/lint-ctypes-73251.rs @@ -1,6 +1,9 @@ // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #![deny(improper_ctypes)] pub trait Foo { diff --git a/src/test/ui/lint/lint-ctypes-enum.stderr b/src/test/ui/lint/lint-ctypes-enum.stderr index 8917d309e6..f3991ab417 100644 --- a/src/test/ui/lint/lint-ctypes-enum.stderr +++ b/src/test/ui/lint/lint-ctypes-enum.stderr @@ -97,7 +97,7 @@ LL | fn repr_rust(x: Option>); = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum = note: enum has no representation hint -error: `extern` block uses type `std::result::Result<(), NonZeroI32>`, which is not FFI-safe +error: `extern` block uses type `Result<(), NonZeroI32>`, which is not FFI-safe --> $DIR/lint-ctypes-enum.rs:90:20 | LL | fn no_result(x: Result<(), num::NonZeroI32>); diff --git a/src/test/ui/lint/lint-ctypes.rs b/src/test/ui/lint/lint-ctypes.rs index fabbdcf689..a291471f56 100644 --- a/src/test/ui/lint/lint-ctypes.rs +++ b/src/test/ui/lint/lint-ctypes.rs @@ -5,6 +5,7 @@ extern crate libc; +use std::cell::UnsafeCell; use std::marker::PhantomData; trait Bar { } @@ -70,6 +71,11 @@ extern "C" { pub fn transparent_fn(p: TransparentBadFn); //~ ERROR: uses type `Box` pub fn raw_array(arr: [u8; 8]); //~ ERROR: uses type `[u8; 8]` + pub fn no_niche_a(a: Option>); + //~^ ERROR: uses type `Option>` + pub fn no_niche_b(b: Option>); + //~^ ERROR: uses type `Option>` + pub static static_u128_type: u128; //~ ERROR: uses type `u128` pub static static_u128_array_type: [u128; 16]; //~ ERROR: uses type `u128` diff --git a/src/test/ui/lint/lint-ctypes.stderr b/src/test/ui/lint/lint-ctypes.stderr index 6a968fca92..7f21e412c3 100644 --- a/src/test/ui/lint/lint-ctypes.stderr +++ b/src/test/ui/lint/lint-ctypes.stderr @@ -1,5 +1,5 @@ error: `extern` block uses type `Foo`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:47:28 + --> $DIR/lint-ctypes.rs:48:28 | LL | pub fn ptr_type1(size: *const Foo); | ^^^^^^^^^^ not FFI-safe @@ -12,13 +12,13 @@ LL | #![deny(improper_ctypes)] = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct = note: this struct has unspecified layout note: the type is defined here - --> $DIR/lint-ctypes.rs:25:1 + --> $DIR/lint-ctypes.rs:26:1 | LL | pub struct Foo; | ^^^^^^^^^^^^^^^ error: `extern` block uses type `Foo`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:48:28 + --> $DIR/lint-ctypes.rs:49:28 | LL | pub fn ptr_type2(size: *const Foo); | ^^^^^^^^^^ not FFI-safe @@ -26,13 +26,13 @@ LL | pub fn ptr_type2(size: *const Foo); = help: consider adding a `#[repr(C)]` or `#[repr(transparent)]` attribute to this struct = note: this struct has unspecified layout note: the type is defined here - --> $DIR/lint-ctypes.rs:25:1 + --> $DIR/lint-ctypes.rs:26:1 | LL | pub struct Foo; | ^^^^^^^^^^^^^^^ error: `extern` block uses type `[u32]`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:49:26 + --> $DIR/lint-ctypes.rs:50:26 | LL | pub fn slice_type(p: &[u32]); | ^^^^^^ not FFI-safe @@ -41,7 +41,7 @@ LL | pub fn slice_type(p: &[u32]); = note: slices have no C equivalent error: `extern` block uses type `str`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:50:24 + --> $DIR/lint-ctypes.rs:51:24 | LL | pub fn str_type(p: &str); | ^^^^ not FFI-safe @@ -50,7 +50,7 @@ LL | pub fn str_type(p: &str); = note: string slices have no C equivalent error: `extern` block uses type `Box`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:51:24 + --> $DIR/lint-ctypes.rs:52:24 | LL | pub fn box_type(p: Box); | ^^^^^^^^ not FFI-safe @@ -59,7 +59,7 @@ LL | pub fn box_type(p: Box); = note: this struct has unspecified layout error: `extern` block uses type `Option>`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:52:28 + --> $DIR/lint-ctypes.rs:53:28 | LL | pub fn opt_box_type(p: Option>); | ^^^^^^^^^^^^^^^^ not FFI-safe @@ -68,7 +68,7 @@ LL | pub fn opt_box_type(p: Option>); = note: enum has no representation hint error: `extern` block uses type `char`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:54:25 + --> $DIR/lint-ctypes.rs:55:25 | LL | pub fn char_type(p: char); | ^^^^ not FFI-safe @@ -77,7 +77,7 @@ LL | pub fn char_type(p: char); = note: the `char` type has no C equivalent error: `extern` block uses type `i128`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:55:25 + --> $DIR/lint-ctypes.rs:56:25 | LL | pub fn i128_type(p: i128); | ^^^^ not FFI-safe @@ -85,7 +85,7 @@ LL | pub fn i128_type(p: i128); = note: 128-bit integers don't currently have a known stable ABI error: `extern` block uses type `u128`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:56:25 + --> $DIR/lint-ctypes.rs:57:25 | LL | pub fn u128_type(p: u128); | ^^^^ not FFI-safe @@ -93,7 +93,7 @@ LL | pub fn u128_type(p: u128); = note: 128-bit integers don't currently have a known stable ABI error: `extern` block uses type `dyn Bar`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:57:26 + --> $DIR/lint-ctypes.rs:58:26 | LL | pub fn trait_type(p: &dyn Bar); | ^^^^^^^^ not FFI-safe @@ -101,7 +101,7 @@ LL | pub fn trait_type(p: &dyn Bar); = note: trait objects have no C equivalent error: `extern` block uses type `(i32, i32)`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:58:26 + --> $DIR/lint-ctypes.rs:59:26 | LL | pub fn tuple_type(p: (i32, i32)); | ^^^^^^^^^^ not FFI-safe @@ -110,7 +110,7 @@ LL | pub fn tuple_type(p: (i32, i32)); = note: tuples have unspecified layout error: `extern` block uses type `(i32, i32)`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:59:27 + --> $DIR/lint-ctypes.rs:60:27 | LL | pub fn tuple_type2(p: I32Pair); | ^^^^^^^ not FFI-safe @@ -119,7 +119,7 @@ LL | pub fn tuple_type2(p: I32Pair); = note: tuples have unspecified layout error: `extern` block uses type `ZeroSize`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:60:25 + --> $DIR/lint-ctypes.rs:61:25 | LL | pub fn zero_size(p: ZeroSize); | ^^^^^^^^ not FFI-safe @@ -127,26 +127,26 @@ LL | pub fn zero_size(p: ZeroSize); = help: consider adding a member to this struct = note: this struct has no fields note: the type is defined here - --> $DIR/lint-ctypes.rs:21:1 + --> $DIR/lint-ctypes.rs:22:1 | LL | pub struct ZeroSize; | ^^^^^^^^^^^^^^^^^^^^ error: `extern` block uses type `ZeroSizeWithPhantomData`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:61:33 + --> $DIR/lint-ctypes.rs:62:33 | LL | pub fn zero_size_phantom(p: ZeroSizeWithPhantomData); | ^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe | = note: composed only of `PhantomData` note: the type is defined here - --> $DIR/lint-ctypes.rs:44:1 + --> $DIR/lint-ctypes.rs:45:1 | LL | pub struct ZeroSizeWithPhantomData(::std::marker::PhantomData); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: `extern` block uses type `PhantomData`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:64:12 + --> $DIR/lint-ctypes.rs:65:12 | LL | -> ::std::marker::PhantomData; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe @@ -154,7 +154,7 @@ LL | -> ::std::marker::PhantomData; = note: composed only of `PhantomData` error: `extern` block uses type `fn()`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:65:23 + --> $DIR/lint-ctypes.rs:66:23 | LL | pub fn fn_type(p: RustFn); | ^^^^^^ not FFI-safe @@ -163,7 +163,7 @@ LL | pub fn fn_type(p: RustFn); = note: this function pointer has Rust-specific calling convention error: `extern` block uses type `fn()`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:66:24 + --> $DIR/lint-ctypes.rs:67:24 | LL | pub fn fn_type2(p: fn()); | ^^^^ not FFI-safe @@ -172,7 +172,7 @@ LL | pub fn fn_type2(p: fn()); = note: this function pointer has Rust-specific calling convention error: `extern` block uses type `Box`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:67:28 + --> $DIR/lint-ctypes.rs:68:28 | LL | pub fn fn_contained(p: RustBadRet); | ^^^^^^^^^^ not FFI-safe @@ -181,7 +181,7 @@ LL | pub fn fn_contained(p: RustBadRet); = note: this struct has unspecified layout error: `extern` block uses type `i128`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:68:32 + --> $DIR/lint-ctypes.rs:69:32 | LL | pub fn transparent_i128(p: TransparentI128); | ^^^^^^^^^^^^^^^ not FFI-safe @@ -189,7 +189,7 @@ LL | pub fn transparent_i128(p: TransparentI128); = note: 128-bit integers don't currently have a known stable ABI error: `extern` block uses type `str`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:69:31 + --> $DIR/lint-ctypes.rs:70:31 | LL | pub fn transparent_str(p: TransparentStr); | ^^^^^^^^^^^^^^ not FFI-safe @@ -198,7 +198,7 @@ LL | pub fn transparent_str(p: TransparentStr); = note: string slices have no C equivalent error: `extern` block uses type `Box`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:70:30 + --> $DIR/lint-ctypes.rs:71:30 | LL | pub fn transparent_fn(p: TransparentBadFn); | ^^^^^^^^^^^^^^^^ not FFI-safe @@ -207,7 +207,7 @@ LL | pub fn transparent_fn(p: TransparentBadFn); = note: this struct has unspecified layout error: `extern` block uses type `[u8; 8]`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:71:27 + --> $DIR/lint-ctypes.rs:72:27 | LL | pub fn raw_array(arr: [u8; 8]); | ^^^^^^^ not FFI-safe @@ -215,8 +215,26 @@ LL | pub fn raw_array(arr: [u8; 8]); = help: consider passing a pointer to the array = note: passing raw arrays by value is not FFI-safe +error: `extern` block uses type `Option>`, which is not FFI-safe + --> $DIR/lint-ctypes.rs:74:26 + | +LL | pub fn no_niche_a(a: Option>); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum + = note: enum has no representation hint + +error: `extern` block uses type `Option>`, which is not FFI-safe + --> $DIR/lint-ctypes.rs:76:26 + | +LL | pub fn no_niche_b(b: Option>); + | ^^^^^^^^^^^^^^^^^^^^^^^^ not FFI-safe + | + = help: consider adding a `#[repr(C)]`, `#[repr(transparent)]`, or integer `#[repr(...)]` attribute to this enum + = note: enum has no representation hint + error: `extern` block uses type `u128`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:73:34 + --> $DIR/lint-ctypes.rs:79:34 | LL | pub static static_u128_type: u128; | ^^^^ not FFI-safe @@ -224,12 +242,12 @@ LL | pub static static_u128_type: u128; = note: 128-bit integers don't currently have a known stable ABI error: `extern` block uses type `u128`, which is not FFI-safe - --> $DIR/lint-ctypes.rs:74:40 + --> $DIR/lint-ctypes.rs:80:40 | LL | pub static static_u128_array_type: [u128; 16]; | ^^^^^^^^^^ not FFI-safe | = note: 128-bit integers don't currently have a known stable ABI -error: aborting due to 24 previous errors +error: aborting due to 26 previous errors diff --git a/src/test/ui/lint-expr-stmt-attrs-for-early-lints.rs b/src/test/ui/lint/lint-expr-stmt-attrs-for-early-lints.rs similarity index 100% rename from src/test/ui/lint-expr-stmt-attrs-for-early-lints.rs rename to src/test/ui/lint/lint-expr-stmt-attrs-for-early-lints.rs diff --git a/src/test/ui/lint/lint-stability-fields-deprecated.rs b/src/test/ui/lint/lint-stability-fields-deprecated.rs index 14c6383806..2024cf15ab 100644 --- a/src/test/ui/lint/lint-stability-fields-deprecated.rs +++ b/src/test/ui/lint/lint-stability-fields-deprecated.rs @@ -17,33 +17,38 @@ mod cross_crate { override1: 2, override2: 3, //~^ ERROR use of deprecated field + override3: 4, }; let _ = x.inherit; let _ = x.override1; let _ = x.override2; //~^ ERROR use of deprecated field + let _ = x.override3; let Stable { inherit: _, override1: _, - override2: _ + override2: _, //~^ ERROR use of deprecated field + override3: _, } = x; // all fine let Stable { .. } = x; - let x = Stable2(1, 2, 3); + let x = Stable2(1, 2, 3, 4); let _ = x.0; let _ = x.1; let _ = x.2; //~^ ERROR use of deprecated field + let _ = x.3; let Stable2(_, _, + _, + //~^ ERROR use of deprecated field _) - //~^ ERROR use of deprecated field = x; // all fine let Stable2(..) = x; diff --git a/src/test/ui/lint/lint-stability-fields-deprecated.stderr b/src/test/ui/lint/lint-stability-fields-deprecated.stderr index ec78678602..151b3e59b9 100644 --- a/src/test/ui/lint/lint-stability-fields-deprecated.stderr +++ b/src/test/ui/lint/lint-stability-fields-deprecated.stderr @@ -1,5 +1,5 @@ error: use of deprecated struct `cross_crate::lint_stability_fields::Deprecated`: text - --> $DIR/lint-stability-fields-deprecated.rs:94:17 + --> $DIR/lint-stability-fields-deprecated.rs:99:17 | LL | let x = Deprecated { | ^^^^^^^^^^ @@ -11,67 +11,67 @@ LL | #![deny(deprecated)] | ^^^^^^^^^^ error: use of deprecated struct `cross_crate::lint_stability_fields::Deprecated`: text - --> $DIR/lint-stability-fields-deprecated.rs:111:13 + --> $DIR/lint-stability-fields-deprecated.rs:116:13 | LL | let Deprecated { | ^^^^^^^^^^ error: use of deprecated struct `cross_crate::lint_stability_fields::Deprecated`: text - --> $DIR/lint-stability-fields-deprecated.rs:121:13 + --> $DIR/lint-stability-fields-deprecated.rs:126:13 | LL | let Deprecated | ^^^^^^^^^^ error: use of deprecated struct `cross_crate::lint_stability_fields::Deprecated2`: text - --> $DIR/lint-stability-fields-deprecated.rs:126:17 + --> $DIR/lint-stability-fields-deprecated.rs:131:17 | LL | let x = Deprecated2(1, 2, 3); | ^^^^^^^^^^^ error: use of deprecated struct `cross_crate::lint_stability_fields::Deprecated2`: text - --> $DIR/lint-stability-fields-deprecated.rs:136:13 + --> $DIR/lint-stability-fields-deprecated.rs:141:13 | LL | let Deprecated2 | ^^^^^^^^^^^ error: use of deprecated struct `cross_crate::lint_stability_fields::Deprecated2`: text - --> $DIR/lint-stability-fields-deprecated.rs:145:13 + --> $DIR/lint-stability-fields-deprecated.rs:150:13 | LL | let Deprecated2 | ^^^^^^^^^^^ error: use of deprecated struct `this_crate::Deprecated`: text - --> $DIR/lint-stability-fields-deprecated.rs:281:17 + --> $DIR/lint-stability-fields-deprecated.rs:286:17 | LL | let x = Deprecated { | ^^^^^^^^^^ error: use of deprecated struct `this_crate::Deprecated`: text - --> $DIR/lint-stability-fields-deprecated.rs:298:13 + --> $DIR/lint-stability-fields-deprecated.rs:303:13 | LL | let Deprecated { | ^^^^^^^^^^ error: use of deprecated struct `this_crate::Deprecated`: text - --> $DIR/lint-stability-fields-deprecated.rs:308:13 + --> $DIR/lint-stability-fields-deprecated.rs:313:13 | LL | let Deprecated | ^^^^^^^^^^ error: use of deprecated tuple struct `this_crate::Deprecated2`: text - --> $DIR/lint-stability-fields-deprecated.rs:313:17 + --> $DIR/lint-stability-fields-deprecated.rs:318:17 | LL | let x = Deprecated2(1, 2, 3); | ^^^^^^^^^^^ error: use of deprecated tuple struct `this_crate::Deprecated2`: text - --> $DIR/lint-stability-fields-deprecated.rs:323:13 + --> $DIR/lint-stability-fields-deprecated.rs:328:13 | LL | let Deprecated2 | ^^^^^^^^^^^ error: use of deprecated tuple struct `this_crate::Deprecated2`: text - --> $DIR/lint-stability-fields-deprecated.rs:332:13 + --> $DIR/lint-stability-fields-deprecated.rs:337:13 | LL | let Deprecated2 | ^^^^^^^^^^^ @@ -83,295 +83,295 @@ LL | override2: 3, | ^^^^^^^^^^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Stable::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:24:17 + --> $DIR/lint-stability-fields-deprecated.rs:25:17 | LL | let _ = x.override2; | ^^^^^^^^^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Stable::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:30:13 + --> $DIR/lint-stability-fields-deprecated.rs:32:13 | -LL | override2: _ +LL | override2: _, | ^^^^^^^^^^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Stable2::2`: text - --> $DIR/lint-stability-fields-deprecated.rs:40:17 + --> $DIR/lint-stability-fields-deprecated.rs:43:17 | LL | let _ = x.2; | ^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Stable2::2`: text - --> $DIR/lint-stability-fields-deprecated.rs:45:20 + --> $DIR/lint-stability-fields-deprecated.rs:49:20 | -LL | _) +LL | _, | ^ error: use of deprecated field `cross_crate::lint_stability_fields::Unstable::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:55:13 + --> $DIR/lint-stability-fields-deprecated.rs:60:13 | LL | override2: 3, | ^^^^^^^^^^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Unstable::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:61:17 + --> $DIR/lint-stability-fields-deprecated.rs:66:17 | LL | let _ = x.override2; | ^^^^^^^^^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Unstable::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:67:13 + --> $DIR/lint-stability-fields-deprecated.rs:72:13 | LL | override2: _ | ^^^^^^^^^^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Unstable2::2`: text - --> $DIR/lint-stability-fields-deprecated.rs:80:17 + --> $DIR/lint-stability-fields-deprecated.rs:85:17 | LL | let _ = x.2; | ^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Unstable2::2`: text - --> $DIR/lint-stability-fields-deprecated.rs:86:14 + --> $DIR/lint-stability-fields-deprecated.rs:91:14 | LL | _) | ^ error: use of deprecated field `cross_crate::lint_stability_fields::Deprecated::inherit`: text - --> $DIR/lint-stability-fields-deprecated.rs:96:13 + --> $DIR/lint-stability-fields-deprecated.rs:101:13 | LL | inherit: 1, | ^^^^^^^^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Deprecated::override1`: text - --> $DIR/lint-stability-fields-deprecated.rs:98:13 + --> $DIR/lint-stability-fields-deprecated.rs:103:13 | LL | override1: 2, | ^^^^^^^^^^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Deprecated::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:100:13 + --> $DIR/lint-stability-fields-deprecated.rs:105:13 | LL | override2: 3, | ^^^^^^^^^^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Deprecated::inherit`: text - --> $DIR/lint-stability-fields-deprecated.rs:104:17 + --> $DIR/lint-stability-fields-deprecated.rs:109:17 | LL | let _ = x.inherit; | ^^^^^^^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Deprecated::override1`: text - --> $DIR/lint-stability-fields-deprecated.rs:106:17 + --> $DIR/lint-stability-fields-deprecated.rs:111:17 | LL | let _ = x.override1; | ^^^^^^^^^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Deprecated::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:108:17 + --> $DIR/lint-stability-fields-deprecated.rs:113:17 | LL | let _ = x.override2; | ^^^^^^^^^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Deprecated::inherit`: text - --> $DIR/lint-stability-fields-deprecated.rs:113:13 + --> $DIR/lint-stability-fields-deprecated.rs:118:13 | LL | inherit: _, | ^^^^^^^^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Deprecated::override1`: text - --> $DIR/lint-stability-fields-deprecated.rs:115:13 + --> $DIR/lint-stability-fields-deprecated.rs:120:13 | LL | override1: _, | ^^^^^^^^^^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Deprecated::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:117:13 + --> $DIR/lint-stability-fields-deprecated.rs:122:13 | LL | override2: _ | ^^^^^^^^^^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Deprecated2::0`: text - --> $DIR/lint-stability-fields-deprecated.rs:129:17 + --> $DIR/lint-stability-fields-deprecated.rs:134:17 | LL | let _ = x.0; | ^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Deprecated2::1`: text - --> $DIR/lint-stability-fields-deprecated.rs:131:17 + --> $DIR/lint-stability-fields-deprecated.rs:136:17 | LL | let _ = x.1; | ^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Deprecated2::2`: text - --> $DIR/lint-stability-fields-deprecated.rs:133:17 + --> $DIR/lint-stability-fields-deprecated.rs:138:17 | LL | let _ = x.2; | ^^^ error: use of deprecated field `cross_crate::lint_stability_fields::Deprecated2::0`: text - --> $DIR/lint-stability-fields-deprecated.rs:138:14 + --> $DIR/lint-stability-fields-deprecated.rs:143:14 | LL | (_, | ^ error: use of deprecated field `cross_crate::lint_stability_fields::Deprecated2::1`: text - --> $DIR/lint-stability-fields-deprecated.rs:140:14 + --> $DIR/lint-stability-fields-deprecated.rs:145:14 | LL | _, | ^ error: use of deprecated field `cross_crate::lint_stability_fields::Deprecated2::2`: text - --> $DIR/lint-stability-fields-deprecated.rs:142:14 + --> $DIR/lint-stability-fields-deprecated.rs:147:14 | LL | _) | ^ error: use of deprecated field `this_crate::Stable::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:205:13 + --> $DIR/lint-stability-fields-deprecated.rs:210:13 | LL | override2: 3, | ^^^^^^^^^^^^ error: use of deprecated field `this_crate::Stable::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:211:17 + --> $DIR/lint-stability-fields-deprecated.rs:216:17 | LL | let _ = x.override2; | ^^^^^^^^^^^ error: use of deprecated field `this_crate::Stable::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:217:13 + --> $DIR/lint-stability-fields-deprecated.rs:222:13 | LL | override2: _ | ^^^^^^^^^^^^ error: use of deprecated field `this_crate::Stable2::2`: text - --> $DIR/lint-stability-fields-deprecated.rs:227:17 + --> $DIR/lint-stability-fields-deprecated.rs:232:17 | LL | let _ = x.2; | ^^^ error: use of deprecated field `this_crate::Stable2::2`: text - --> $DIR/lint-stability-fields-deprecated.rs:232:20 + --> $DIR/lint-stability-fields-deprecated.rs:237:20 | LL | _) | ^ error: use of deprecated field `this_crate::Unstable::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:242:13 + --> $DIR/lint-stability-fields-deprecated.rs:247:13 | LL | override2: 3, | ^^^^^^^^^^^^ error: use of deprecated field `this_crate::Unstable::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:248:17 + --> $DIR/lint-stability-fields-deprecated.rs:253:17 | LL | let _ = x.override2; | ^^^^^^^^^^^ error: use of deprecated field `this_crate::Unstable::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:254:13 + --> $DIR/lint-stability-fields-deprecated.rs:259:13 | LL | override2: _ | ^^^^^^^^^^^^ error: use of deprecated field `this_crate::Unstable2::2`: text - --> $DIR/lint-stability-fields-deprecated.rs:267:17 + --> $DIR/lint-stability-fields-deprecated.rs:272:17 | LL | let _ = x.2; | ^^^ error: use of deprecated field `this_crate::Unstable2::2`: text - --> $DIR/lint-stability-fields-deprecated.rs:273:14 + --> $DIR/lint-stability-fields-deprecated.rs:278:14 | LL | _) | ^ error: use of deprecated field `this_crate::Deprecated::inherit`: text - --> $DIR/lint-stability-fields-deprecated.rs:283:13 + --> $DIR/lint-stability-fields-deprecated.rs:288:13 | LL | inherit: 1, | ^^^^^^^^^^ error: use of deprecated field `this_crate::Deprecated::override1`: text - --> $DIR/lint-stability-fields-deprecated.rs:285:13 + --> $DIR/lint-stability-fields-deprecated.rs:290:13 | LL | override1: 2, | ^^^^^^^^^^^^ error: use of deprecated field `this_crate::Deprecated::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:287:13 + --> $DIR/lint-stability-fields-deprecated.rs:292:13 | LL | override2: 3, | ^^^^^^^^^^^^ error: use of deprecated field `this_crate::Deprecated::inherit`: text - --> $DIR/lint-stability-fields-deprecated.rs:291:17 + --> $DIR/lint-stability-fields-deprecated.rs:296:17 | LL | let _ = x.inherit; | ^^^^^^^^^ error: use of deprecated field `this_crate::Deprecated::override1`: text - --> $DIR/lint-stability-fields-deprecated.rs:293:17 + --> $DIR/lint-stability-fields-deprecated.rs:298:17 | LL | let _ = x.override1; | ^^^^^^^^^^^ error: use of deprecated field `this_crate::Deprecated::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:295:17 + --> $DIR/lint-stability-fields-deprecated.rs:300:17 | LL | let _ = x.override2; | ^^^^^^^^^^^ error: use of deprecated field `this_crate::Deprecated::inherit`: text - --> $DIR/lint-stability-fields-deprecated.rs:300:13 + --> $DIR/lint-stability-fields-deprecated.rs:305:13 | LL | inherit: _, | ^^^^^^^^^^ error: use of deprecated field `this_crate::Deprecated::override1`: text - --> $DIR/lint-stability-fields-deprecated.rs:302:13 + --> $DIR/lint-stability-fields-deprecated.rs:307:13 | LL | override1: _, | ^^^^^^^^^^^^ error: use of deprecated field `this_crate::Deprecated::override2`: text - --> $DIR/lint-stability-fields-deprecated.rs:304:13 + --> $DIR/lint-stability-fields-deprecated.rs:309:13 | LL | override2: _ | ^^^^^^^^^^^^ error: use of deprecated field `this_crate::Deprecated2::0`: text - --> $DIR/lint-stability-fields-deprecated.rs:316:17 + --> $DIR/lint-stability-fields-deprecated.rs:321:17 | LL | let _ = x.0; | ^^^ error: use of deprecated field `this_crate::Deprecated2::1`: text - --> $DIR/lint-stability-fields-deprecated.rs:318:17 + --> $DIR/lint-stability-fields-deprecated.rs:323:17 | LL | let _ = x.1; | ^^^ error: use of deprecated field `this_crate::Deprecated2::2`: text - --> $DIR/lint-stability-fields-deprecated.rs:320:17 + --> $DIR/lint-stability-fields-deprecated.rs:325:17 | LL | let _ = x.2; | ^^^ error: use of deprecated field `this_crate::Deprecated2::0`: text - --> $DIR/lint-stability-fields-deprecated.rs:325:14 + --> $DIR/lint-stability-fields-deprecated.rs:330:14 | LL | (_, | ^ error: use of deprecated field `this_crate::Deprecated2::1`: text - --> $DIR/lint-stability-fields-deprecated.rs:327:14 + --> $DIR/lint-stability-fields-deprecated.rs:332:14 | LL | _, | ^ error: use of deprecated field `this_crate::Deprecated2::2`: text - --> $DIR/lint-stability-fields-deprecated.rs:329:14 + --> $DIR/lint-stability-fields-deprecated.rs:334:14 | LL | _) | ^ diff --git a/src/test/ui/lint/lint-stability-fields.rs b/src/test/ui/lint/lint-stability-fields.rs index c5de5748aa..4083648984 100644 --- a/src/test/ui/lint/lint-stability-fields.rs +++ b/src/test/ui/lint/lint-stability-fields.rs @@ -20,29 +20,34 @@ mod cross_crate { inherit: 1, override1: 2, //~ ERROR use of unstable override2: 3, //~ ERROR use of unstable + override3: 4, }; let _ = x.inherit; let _ = x.override1; //~ ERROR use of unstable let _ = x.override2; //~ ERROR use of unstable + let _ = x.override3; let Stable { inherit: _, override1: _, //~ ERROR use of unstable - override2: _ //~ ERROR use of unstable + override2: _, //~ ERROR use of unstable + override3: _ } = x; // all fine let Stable { .. } = x; - let x = Stable2(1, 2, 3); + let x = Stable2(1, 2, 3, 4); let _ = x.0; let _ = x.1; //~ ERROR use of unstable let _ = x.2; //~ ERROR use of unstable + let _ = x.3; let Stable2(_, _, //~ ERROR use of unstable - _) //~ ERROR use of unstable + _, //~ ERROR use of unstable + _) = x; // all fine let Stable2(..) = x; @@ -133,11 +138,13 @@ mod this_crate { #[rustc_deprecated(since = "1.0.0", reason = "text")] #[unstable(feature = "unstable_test_feature", issue = "none")] override2: u8, + #[stable(feature = "rust2", since = "2.0.0")] + override3: u8, } #[stable(feature = "rust1", since = "1.0.0")] struct Stable2(u8, - #[stable(feature = "rust1", since = "1.0.0")] u8, + #[stable(feature = "rust2", since = "2.0.0")] u8, #[unstable(feature = "unstable_test_feature", issue = "none")] #[rustc_deprecated(since = "1.0.0", reason = "text")] u8); @@ -178,16 +185,19 @@ mod this_crate { inherit: 1, override1: 2, override2: 3, + override3: 4, }; let _ = x.inherit; let _ = x.override1; let _ = x.override2; + let _ = x.override3; let Stable { inherit: _, override1: _, - override2: _ + override2: _, + override3: _ } = x; // all fine let Stable { .. } = x; diff --git a/src/test/ui/lint/lint-stability-fields.stderr b/src/test/ui/lint/lint-stability-fields.stderr index b6a08186b5..3d2e73c1e8 100644 --- a/src/test/ui/lint/lint-stability-fields.stderr +++ b/src/test/ui/lint/lint-stability-fields.stderr @@ -1,5 +1,5 @@ error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:51:17 + --> $DIR/lint-stability-fields.rs:56:17 | LL | let x = Unstable { | ^^^^^^^^ @@ -7,7 +7,7 @@ LL | let x = Unstable { = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:61:13 + --> $DIR/lint-stability-fields.rs:66:13 | LL | let Unstable { | ^^^^^^^^ @@ -15,7 +15,7 @@ LL | let Unstable { = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:67:13 + --> $DIR/lint-stability-fields.rs:72:13 | LL | let Unstable | ^^^^^^^^ @@ -23,7 +23,7 @@ LL | let Unstable = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:72:17 + --> $DIR/lint-stability-fields.rs:77:17 | LL | let x = reexport::Unstable2(1, 2, 3); | ^^^^^^^^^^^^^^^^^^^ @@ -31,7 +31,7 @@ LL | let x = reexport::Unstable2(1, 2, 3); = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:74:17 + --> $DIR/lint-stability-fields.rs:79:17 | LL | let x = Unstable2(1, 2, 3); | ^^^^^^^^^ @@ -39,7 +39,7 @@ LL | let x = Unstable2(1, 2, 3); = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:80:13 + --> $DIR/lint-stability-fields.rs:85:13 | LL | let Unstable2 | ^^^^^^^^^ @@ -47,7 +47,7 @@ LL | let Unstable2 = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:85:13 + --> $DIR/lint-stability-fields.rs:90:13 | LL | let Unstable2 | ^^^^^^^^^ @@ -55,7 +55,7 @@ LL | let Unstable2 = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:90:17 + --> $DIR/lint-stability-fields.rs:95:17 | LL | let x = Deprecated { | ^^^^^^^^^^ @@ -63,7 +63,7 @@ LL | let x = Deprecated { = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:100:13 + --> $DIR/lint-stability-fields.rs:105:13 | LL | let Deprecated { | ^^^^^^^^^^ @@ -71,7 +71,7 @@ LL | let Deprecated { = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:106:13 + --> $DIR/lint-stability-fields.rs:111:13 | LL | let Deprecated | ^^^^^^^^^^ @@ -79,7 +79,7 @@ LL | let Deprecated = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:110:17 + --> $DIR/lint-stability-fields.rs:115:17 | LL | let x = Deprecated2(1, 2, 3); | ^^^^^^^^^^^ @@ -87,7 +87,7 @@ LL | let x = Deprecated2(1, 2, 3); = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:116:13 + --> $DIR/lint-stability-fields.rs:121:13 | LL | let Deprecated2 | ^^^^^^^^^^^ @@ -95,7 +95,7 @@ LL | let Deprecated2 = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:121:13 + --> $DIR/lint-stability-fields.rs:126:13 | LL | let Deprecated2 | ^^^^^^^^^^^ @@ -119,7 +119,7 @@ LL | override2: 3, = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:26:17 + --> $DIR/lint-stability-fields.rs:27:17 | LL | let _ = x.override1; | ^^^^^^^^^^^ @@ -127,7 +127,7 @@ LL | let _ = x.override1; = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:27:17 + --> $DIR/lint-stability-fields.rs:28:17 | LL | let _ = x.override2; | ^^^^^^^^^^^ @@ -135,7 +135,7 @@ LL | let _ = x.override2; = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:31:13 + --> $DIR/lint-stability-fields.rs:33:13 | LL | override1: _, | ^^^^^^^^^^^^ @@ -143,15 +143,15 @@ LL | override1: _, = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:32:13 + --> $DIR/lint-stability-fields.rs:34:13 | -LL | override2: _ +LL | override2: _, | ^^^^^^^^^^^^ | = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:40:17 + --> $DIR/lint-stability-fields.rs:43:17 | LL | let _ = x.1; | ^^^ @@ -159,7 +159,7 @@ LL | let _ = x.1; = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:41:17 + --> $DIR/lint-stability-fields.rs:44:17 | LL | let _ = x.2; | ^^^ @@ -167,7 +167,7 @@ LL | let _ = x.2; = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:44:20 + --> $DIR/lint-stability-fields.rs:48:20 | LL | _, | ^ @@ -175,15 +175,15 @@ LL | _, = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:45:20 + --> $DIR/lint-stability-fields.rs:49:20 | -LL | _) +LL | _, | ^ | = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:52:13 + --> $DIR/lint-stability-fields.rs:57:13 | LL | inherit: 1, | ^^^^^^^^^^ @@ -191,7 +191,7 @@ LL | inherit: 1, = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:54:13 + --> $DIR/lint-stability-fields.rs:59:13 | LL | override2: 3, | ^^^^^^^^^^^^ @@ -199,7 +199,7 @@ LL | override2: 3, = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:57:17 + --> $DIR/lint-stability-fields.rs:62:17 | LL | let _ = x.inherit; | ^^^^^^^^^ @@ -207,7 +207,7 @@ LL | let _ = x.inherit; = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:59:17 + --> $DIR/lint-stability-fields.rs:64:17 | LL | let _ = x.override2; | ^^^^^^^^^^^ @@ -215,7 +215,7 @@ LL | let _ = x.override2; = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:62:13 + --> $DIR/lint-stability-fields.rs:67:13 | LL | inherit: _, | ^^^^^^^^^^ @@ -223,7 +223,7 @@ LL | inherit: _, = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:64:13 + --> $DIR/lint-stability-fields.rs:69:13 | LL | override2: _ | ^^^^^^^^^^^^ @@ -231,7 +231,7 @@ LL | override2: _ = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:76:17 + --> $DIR/lint-stability-fields.rs:81:17 | LL | let _ = x.0; | ^^^ @@ -239,7 +239,7 @@ LL | let _ = x.0; = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:78:17 + --> $DIR/lint-stability-fields.rs:83:17 | LL | let _ = x.2; | ^^^ @@ -247,7 +247,7 @@ LL | let _ = x.2; = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:81:14 + --> $DIR/lint-stability-fields.rs:86:14 | LL | (_, | ^ @@ -255,7 +255,7 @@ LL | (_, = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:83:14 + --> $DIR/lint-stability-fields.rs:88:14 | LL | _) | ^ @@ -263,7 +263,7 @@ LL | _) = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:91:13 + --> $DIR/lint-stability-fields.rs:96:13 | LL | inherit: 1, | ^^^^^^^^^^ @@ -271,7 +271,7 @@ LL | inherit: 1, = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:93:13 + --> $DIR/lint-stability-fields.rs:98:13 | LL | override2: 3, | ^^^^^^^^^^^^ @@ -279,7 +279,7 @@ LL | override2: 3, = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:96:17 + --> $DIR/lint-stability-fields.rs:101:17 | LL | let _ = x.inherit; | ^^^^^^^^^ @@ -287,7 +287,7 @@ LL | let _ = x.inherit; = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:98:17 + --> $DIR/lint-stability-fields.rs:103:17 | LL | let _ = x.override2; | ^^^^^^^^^^^ @@ -295,7 +295,7 @@ LL | let _ = x.override2; = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:101:13 + --> $DIR/lint-stability-fields.rs:106:13 | LL | inherit: _, | ^^^^^^^^^^ @@ -303,7 +303,7 @@ LL | inherit: _, = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:103:13 + --> $DIR/lint-stability-fields.rs:108:13 | LL | override2: _ | ^^^^^^^^^^^^ @@ -311,7 +311,7 @@ LL | override2: _ = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:112:17 + --> $DIR/lint-stability-fields.rs:117:17 | LL | let _ = x.0; | ^^^ @@ -319,7 +319,7 @@ LL | let _ = x.0; = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:114:17 + --> $DIR/lint-stability-fields.rs:119:17 | LL | let _ = x.2; | ^^^ @@ -327,7 +327,7 @@ LL | let _ = x.2; = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:117:14 + --> $DIR/lint-stability-fields.rs:122:14 | LL | (_, | ^ @@ -335,7 +335,7 @@ LL | (_, = help: add `#![feature(unstable_test_feature)]` to the crate attributes to enable error[E0658]: use of unstable library feature 'unstable_test_feature' - --> $DIR/lint-stability-fields.rs:119:14 + --> $DIR/lint-stability-fields.rs:124:14 | LL | _) | ^ diff --git a/src/test/ui/lint/lint-type-limits2.stderr b/src/test/ui/lint/lint-type-limits2.stderr index e8746ce980..3562cb440a 100644 --- a/src/test/ui/lint/lint-type-limits2.stderr +++ b/src/test/ui/lint/lint-type-limits2.stderr @@ -18,6 +18,7 @@ note: the lint level is defined here LL | #![warn(overflowing_literals)] | ^^^^^^^^^^^^^^^^^^^^ = note: the literal `128` does not fit into the type `i8` whose range is `-128..=127` + = help: consider using the type `u8` instead error: aborting due to previous error; 1 warning emitted diff --git a/src/test/ui/lint/lint-type-limits3.stderr b/src/test/ui/lint/lint-type-limits3.stderr index 0e8a645106..823d1a4c76 100644 --- a/src/test/ui/lint/lint-type-limits3.stderr +++ b/src/test/ui/lint/lint-type-limits3.stderr @@ -18,6 +18,7 @@ note: the lint level is defined here LL | #![warn(overflowing_literals)] | ^^^^^^^^^^^^^^^^^^^^ = note: the literal `200` does not fit into the type `i8` whose range is `-128..=127` + = help: consider using the type `u8` instead error: aborting due to previous error; 1 warning emitted diff --git a/src/test/ui/lint/lint-type-overflow.stderr b/src/test/ui/lint/lint-type-overflow.stderr index 7715c0d3a4..1bb1ec5477 100644 --- a/src/test/ui/lint/lint-type-overflow.stderr +++ b/src/test/ui/lint/lint-type-overflow.stderr @@ -26,6 +26,7 @@ LL | let x1: i8 = 128; | ^^^ | = note: the literal `128` does not fit into the type `i8` whose range is `-128..=127` + = help: consider using the type `u8` instead error: literal out of range for `i8` --> $DIR/lint-type-overflow.rs:18:19 @@ -34,6 +35,7 @@ LL | let x3: i8 = -129; | ^^^ | = note: the literal `129` does not fit into the type `i8` whose range is `-128..=127` + = help: consider using the type `i16` instead error: literal out of range for `i8` --> $DIR/lint-type-overflow.rs:19:19 @@ -42,6 +44,7 @@ LL | let x3: i8 = -(129); | ^^^^^ | = note: the literal `129` does not fit into the type `i8` whose range is `-128..=127` + = help: consider using the type `i16` instead error: literal out of range for `i8` --> $DIR/lint-type-overflow.rs:20:20 @@ -50,6 +53,7 @@ LL | let x3: i8 = -{129}; | ^^^ | = note: the literal `129` does not fit into the type `i8` whose range is `-128..=127` + = help: consider using the type `u8` instead error: literal out of range for `i8` --> $DIR/lint-type-overflow.rs:22:10 @@ -58,6 +62,7 @@ LL | test(1000); | ^^^^ | = note: the literal `1000` does not fit into the type `i8` whose range is `-128..=127` + = help: consider using the type `i16` instead error: literal out of range for `i8` --> $DIR/lint-type-overflow.rs:24:13 @@ -66,6 +71,7 @@ LL | let x = 128_i8; | ^^^^^^ | = note: the literal `128_i8` does not fit into the type `i8` whose range is `-128..=127` + = help: consider using the type `u8` instead error: literal out of range for `i8` --> $DIR/lint-type-overflow.rs:28:14 @@ -74,6 +80,7 @@ LL | let x = -129_i8; | ^^^^^^ | = note: the literal `129_i8` does not fit into the type `i8` whose range is `-128..=127` + = help: consider using the type `i16` instead error: literal out of range for `i32` --> $DIR/lint-type-overflow.rs:32:18 @@ -82,6 +89,7 @@ LL | let x: i32 = 2147483648; | ^^^^^^^^^^ | = note: the literal `2147483648` does not fit into the type `i32` whose range is `-2147483648..=2147483647` + = help: consider using the type `u32` instead error: literal out of range for `i32` --> $DIR/lint-type-overflow.rs:33:13 @@ -90,6 +98,7 @@ LL | let x = 2147483648_i32; | ^^^^^^^^^^^^^^ | = note: the literal `2147483648_i32` does not fit into the type `i32` whose range is `-2147483648..=2147483647` + = help: consider using the type `u32` instead error: literal out of range for `i32` --> $DIR/lint-type-overflow.rs:36:19 @@ -98,6 +107,7 @@ LL | let x: i32 = -2147483649; | ^^^^^^^^^^ | = note: the literal `2147483649` does not fit into the type `i32` whose range is `-2147483648..=2147483647` + = help: consider using the type `i64` instead error: literal out of range for `i32` --> $DIR/lint-type-overflow.rs:37:14 @@ -106,6 +116,7 @@ LL | let x = -2147483649_i32; | ^^^^^^^^^^^^^^ | = note: the literal `2147483649_i32` does not fit into the type `i32` whose range is `-2147483648..=2147483647` + = help: consider using the type `i64` instead error: literal out of range for `i32` --> $DIR/lint-type-overflow.rs:38:13 @@ -114,6 +125,7 @@ LL | let x = 2147483648; | ^^^^^^^^^^ | = note: the literal `2147483648` does not fit into the type `i32` whose range is `-2147483648..=2147483647` + = help: consider using the type `u32` instead error: literal out of range for `i64` --> $DIR/lint-type-overflow.rs:40:13 @@ -122,6 +134,7 @@ LL | let x = 9223372036854775808_i64; | ^^^^^^^^^^^^^^^^^^^^^^^ | = note: the literal `9223372036854775808_i64` does not fit into the type `i64` whose range is `-9223372036854775808..=9223372036854775807` + = help: consider using the type `u64` instead error: literal out of range for `i64` --> $DIR/lint-type-overflow.rs:42:13 @@ -130,6 +143,7 @@ LL | let x = 18446744073709551615_i64; | ^^^^^^^^^^^^^^^^^^^^^^^^ | = note: the literal `18446744073709551615_i64` does not fit into the type `i64` whose range is `-9223372036854775808..=9223372036854775807` + = help: consider using the type `u64` instead error: literal out of range for `i64` --> $DIR/lint-type-overflow.rs:43:19 @@ -138,6 +152,7 @@ LL | let x: i64 = -9223372036854775809; | ^^^^^^^^^^^^^^^^^^^ | = note: the literal `9223372036854775809` does not fit into the type `i64` whose range is `-9223372036854775808..=9223372036854775807` + = help: consider using the type `i128` instead error: literal out of range for `i64` --> $DIR/lint-type-overflow.rs:44:14 @@ -146,6 +161,7 @@ LL | let x = -9223372036854775809_i64; | ^^^^^^^^^^^^^^^^^^^^^^^ | = note: the literal `9223372036854775809_i64` does not fit into the type `i64` whose range is `-9223372036854775808..=9223372036854775807` + = help: consider using the type `i128` instead error: aborting due to 18 previous errors diff --git a/src/test/ui/lint/lint-type-overflow2.stderr b/src/test/ui/lint/lint-type-overflow2.stderr index 0f16229a29..3d40cdf96e 100644 --- a/src/test/ui/lint/lint-type-overflow2.stderr +++ b/src/test/ui/lint/lint-type-overflow2.stderr @@ -10,6 +10,7 @@ note: the lint level is defined here LL | #![deny(overflowing_literals)] | ^^^^^^^^^^^^^^^^^^^^ = note: the literal `128` does not fit into the type `i8` whose range is `-128..=127` + = help: consider using the type `u8` instead error: literal out of range for `f32` --> $DIR/lint-type-overflow2.rs:9:14 diff --git a/src/test/ui/lint/lint-unsafe-code.rs b/src/test/ui/lint/lint-unsafe-code.rs index 735f33f601..4ac02b51f6 100644 --- a/src/test/ui/lint/lint-unsafe-code.rs +++ b/src/test/ui/lint/lint-unsafe-code.rs @@ -12,14 +12,28 @@ mod allowed_unsafe { unsafe fn also_allowed() {} unsafe trait AllowedUnsafe { } unsafe impl AllowedUnsafe for super::Bar {} + #[no_mangle] fn allowed2() {} + #[export_name = "foo"] fn allowed3() {} } macro_rules! unsafe_in_macro { - () => { + () => {{ + #[no_mangle] fn foo() {} //~ ERROR: declaration of a `no_mangle` function + #[no_mangle] static FOO: u32 = 5; //~ ERROR: declaration of a `no_mangle` static + #[export_name = "bar"] fn bar() {} + //~^ ERROR: declaration of a function with `export_name` + #[export_name = "BAR"] static BAR: u32 = 5; + //~^ ERROR: declaration of a static with `export_name` unsafe {} //~ ERROR: usage of an `unsafe` block - } + }} } +#[no_mangle] fn foo() {} //~ ERROR: declaration of a `no_mangle` function +#[no_mangle] static FOO: u32 = 5; //~ ERROR: declaration of a `no_mangle` static + +#[export_name = "bar"] fn bar() {} //~ ERROR: declaration of a function with `export_name` +#[export_name = "BAR"] static BAR: u32 = 5; //~ ERROR: declaration of a static with `export_name` + unsafe fn baz() {} //~ ERROR: declaration of an `unsafe` function unsafe trait Foo {} //~ ERROR: declaration of an `unsafe` trait unsafe impl Foo for Bar {} //~ ERROR: implementation of an `unsafe` trait diff --git a/src/test/ui/lint/lint-unsafe-code.stderr b/src/test/ui/lint/lint-unsafe-code.stderr index 0b2b9fab39..a8ef047e51 100644 --- a/src/test/ui/lint/lint-unsafe-code.stderr +++ b/src/test/ui/lint/lint-unsafe-code.stderr @@ -1,89 +1,168 @@ -error: declaration of an `unsafe` function - --> $DIR/lint-unsafe-code.rs:23:1 +error: declaration of a `no_mangle` function + --> $DIR/lint-unsafe-code.rs:31:1 | -LL | unsafe fn baz() {} - | ^^^^^^^^^^^^^^^^^^ +LL | #[no_mangle] fn foo() {} + | ^^^^^^^^^^^^ | note: the lint level is defined here --> $DIR/lint-unsafe-code.rs:3:9 | LL | #![deny(unsafe_code)] | ^^^^^^^^^^^ + = note: the linker's behavior with multiple libraries exporting duplicate symbol names is undefined and Rust cannot provide guarantees when you manually override them + +error: declaration of a `no_mangle` static + --> $DIR/lint-unsafe-code.rs:32:1 + | +LL | #[no_mangle] static FOO: u32 = 5; + | ^^^^^^^^^^^^ + | + = note: the linker's behavior with multiple libraries exporting duplicate symbol names is undefined and Rust cannot provide guarantees when you manually override them + +error: declaration of a function with `export_name` + --> $DIR/lint-unsafe-code.rs:34:1 + | +LL | #[export_name = "bar"] fn bar() {} + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: the linker's behavior with multiple libraries exporting duplicate symbol names is undefined and Rust cannot provide guarantees when you manually override them + +error: declaration of a static with `export_name` + --> $DIR/lint-unsafe-code.rs:35:1 + | +LL | #[export_name = "BAR"] static BAR: u32 = 5; + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: the linker's behavior with multiple libraries exporting duplicate symbol names is undefined and Rust cannot provide guarantees when you manually override them + +error: declaration of an `unsafe` function + --> $DIR/lint-unsafe-code.rs:37:1 + | +LL | unsafe fn baz() {} + | ^^^^^^^^^^^^^^^^^^ error: declaration of an `unsafe` trait - --> $DIR/lint-unsafe-code.rs:24:1 + --> $DIR/lint-unsafe-code.rs:38:1 | LL | unsafe trait Foo {} | ^^^^^^^^^^^^^^^^^^^ error: implementation of an `unsafe` trait - --> $DIR/lint-unsafe-code.rs:25:1 + --> $DIR/lint-unsafe-code.rs:39:1 | LL | unsafe impl Foo for Bar {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^ error: declaration of an `unsafe` method - --> $DIR/lint-unsafe-code.rs:28:5 + --> $DIR/lint-unsafe-code.rs:42:5 | LL | unsafe fn baz(&self); | ^^^^^^^^^^^^^^^^^^^^^ error: implementation of an `unsafe` method - --> $DIR/lint-unsafe-code.rs:29:5 + --> $DIR/lint-unsafe-code.rs:43:5 | LL | unsafe fn provided(&self) {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: implementation of an `unsafe` method - --> $DIR/lint-unsafe-code.rs:30:5 + --> $DIR/lint-unsafe-code.rs:44:5 | LL | unsafe fn provided_override(&self) {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: implementation of an `unsafe` method - --> $DIR/lint-unsafe-code.rs:34:5 + --> $DIR/lint-unsafe-code.rs:48:5 | LL | unsafe fn baz(&self) {} | ^^^^^^^^^^^^^^^^^^^^^^^ error: implementation of an `unsafe` method - --> $DIR/lint-unsafe-code.rs:35:5 + --> $DIR/lint-unsafe-code.rs:49:5 | LL | unsafe fn provided_override(&self) {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: implementation of an `unsafe` method - --> $DIR/lint-unsafe-code.rs:54:5 + --> $DIR/lint-unsafe-code.rs:68:5 | LL | unsafe fn provided_override(&self) {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: implementation of an `unsafe` method - --> $DIR/lint-unsafe-code.rs:65:5 + --> $DIR/lint-unsafe-code.rs:79:5 | LL | unsafe fn provided(&self) {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: implementation of an `unsafe` method - --> $DIR/lint-unsafe-code.rs:71:5 + --> $DIR/lint-unsafe-code.rs:85:5 | LL | unsafe fn provided(&self) {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: implementation of an `unsafe` method - --> $DIR/lint-unsafe-code.rs:75:5 + --> $DIR/lint-unsafe-code.rs:89:5 | LL | unsafe fn baz(&self) {} | ^^^^^^^^^^^^^^^^^^^^^^^ error: usage of an `unsafe` block - --> $DIR/lint-unsafe-code.rs:86:5 + --> $DIR/lint-unsafe-code.rs:100:5 | LL | unsafe {} | ^^^^^^^^^ +error: declaration of a `no_mangle` function + --> $DIR/lint-unsafe-code.rs:21:9 + | +LL | #[no_mangle] fn foo() {} + | ^^^^^^^^^^^^ +... +LL | unsafe_in_macro!() + | ------------------ in this macro invocation + | + = note: the linker's behavior with multiple libraries exporting duplicate symbol names is undefined and Rust cannot provide guarantees when you manually override them + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error: declaration of a `no_mangle` static + --> $DIR/lint-unsafe-code.rs:22:9 + | +LL | #[no_mangle] static FOO: u32 = 5; + | ^^^^^^^^^^^^ +... +LL | unsafe_in_macro!() + | ------------------ in this macro invocation + | + = note: the linker's behavior with multiple libraries exporting duplicate symbol names is undefined and Rust cannot provide guarantees when you manually override them + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error: declaration of a function with `export_name` + --> $DIR/lint-unsafe-code.rs:23:9 + | +LL | #[export_name = "bar"] fn bar() {} + | ^^^^^^^^^^^^^^^^^^^^^^ +... +LL | unsafe_in_macro!() + | ------------------ in this macro invocation + | + = note: the linker's behavior with multiple libraries exporting duplicate symbol names is undefined and Rust cannot provide guarantees when you manually override them + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error: declaration of a static with `export_name` + --> $DIR/lint-unsafe-code.rs:25:9 + | +LL | #[export_name = "BAR"] static BAR: u32 = 5; + | ^^^^^^^^^^^^^^^^^^^^^^ +... +LL | unsafe_in_macro!() + | ------------------ in this macro invocation + | + = note: the linker's behavior with multiple libraries exporting duplicate symbol names is undefined and Rust cannot provide guarantees when you manually override them + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + error: usage of an `unsafe` block - --> $DIR/lint-unsafe-code.rs:19:9 + --> $DIR/lint-unsafe-code.rs:27:9 | LL | unsafe {} | ^^^^^^^^^ @@ -93,5 +172,5 @@ LL | unsafe_in_macro!() | = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) -error: aborting due to 14 previous errors +error: aborting due to 22 previous errors diff --git a/src/test/ui/lint/must_use-tuple.rs b/src/test/ui/lint/must_use-tuple.rs index f6b579a7f3..0f0aa20253 100644 --- a/src/test/ui/lint/must_use-tuple.rs +++ b/src/test/ui/lint/must_use-tuple.rs @@ -5,13 +5,13 @@ fn foo() -> (Result<(), ()>, ()) { } fn main() { - (Ok::<(), ()>(()),); //~ ERROR unused `std::result::Result` + (Ok::<(), ()>(()),); //~ ERROR unused `Result` (Ok::<(), ()>(()), 0, Ok::<(), ()>(()), 5); - //~^ ERROR unused `std::result::Result` - //~^^ ERROR unused `std::result::Result` + //~^ ERROR unused `Result` + //~^^ ERROR unused `Result` - foo(); //~ ERROR unused `std::result::Result` + foo(); //~ ERROR unused `Result` - ((Err::<(), ()>(()), ()), ()); //~ ERROR unused `std::result::Result` + ((Err::<(), ()>(()), ()), ()); //~ ERROR unused `Result` } diff --git a/src/test/ui/lint/must_use-tuple.stderr b/src/test/ui/lint/must_use-tuple.stderr index de3c6f46c6..0532d89e03 100644 --- a/src/test/ui/lint/must_use-tuple.stderr +++ b/src/test/ui/lint/must_use-tuple.stderr @@ -1,4 +1,4 @@ -error: unused `std::result::Result` in tuple element 0 that must be used +error: unused `Result` in tuple element 0 that must be used --> $DIR/must_use-tuple.rs:8:6 | LL | (Ok::<(), ()>(()),); @@ -11,7 +11,7 @@ LL | #![deny(unused_must_use)] | ^^^^^^^^^^^^^^^ = note: this `Result` may be an `Err` variant, which should be handled -error: unused `std::result::Result` in tuple element 0 that must be used +error: unused `Result` in tuple element 0 that must be used --> $DIR/must_use-tuple.rs:10:6 | LL | (Ok::<(), ()>(()), 0, Ok::<(), ()>(()), 5); @@ -19,7 +19,7 @@ LL | (Ok::<(), ()>(()), 0, Ok::<(), ()>(()), 5); | = note: this `Result` may be an `Err` variant, which should be handled -error: unused `std::result::Result` in tuple element 2 that must be used +error: unused `Result` in tuple element 2 that must be used --> $DIR/must_use-tuple.rs:10:27 | LL | (Ok::<(), ()>(()), 0, Ok::<(), ()>(()), 5); @@ -27,7 +27,7 @@ LL | (Ok::<(), ()>(()), 0, Ok::<(), ()>(()), 5); | = note: this `Result` may be an `Err` variant, which should be handled -error: unused `std::result::Result` in tuple element 0 that must be used +error: unused `Result` in tuple element 0 that must be used --> $DIR/must_use-tuple.rs:14:5 | LL | foo(); @@ -35,7 +35,7 @@ LL | foo(); | = note: this `Result` may be an `Err` variant, which should be handled -error: unused `std::result::Result` in tuple element 0 that must be used +error: unused `Result` in tuple element 0 that must be used --> $DIR/must_use-tuple.rs:16:6 | LL | ((Err::<(), ()>(()), ()), ()); diff --git a/src/test/ui/lint/noop-method-call.rs b/src/test/ui/lint/noop-method-call.rs new file mode 100644 index 0000000000..9870c81357 --- /dev/null +++ b/src/test/ui/lint/noop-method-call.rs @@ -0,0 +1,54 @@ +// check-pass + +#![allow(unused)] +#![warn(noop_method_call)] + +use std::borrow::Borrow; +use std::ops::Deref; + +struct PlainType(T); + +#[derive(Clone)] +struct CloneType(T); + +fn main() { + let non_clone_type_ref = &PlainType(1u32); + let non_clone_type_ref_clone: &PlainType = non_clone_type_ref.clone(); + //~^ WARNING call to `.clone()` on a reference in this situation does nothing + + let clone_type_ref = &CloneType(1u32); + let clone_type_ref_clone: CloneType = clone_type_ref.clone(); + + // Calling clone on a double reference doesn't warn since the method call itself + // peels the outer reference off + let clone_type_ref = &&CloneType(1u32); + let clone_type_ref_clone: &CloneType = clone_type_ref.clone(); + + let non_deref_type = &PlainType(1u32); + let non_deref_type_deref: &PlainType = non_deref_type.deref(); + //~^ WARNING call to `.deref()` on a reference in this situation does nothing + + // Dereferencing a &&T does not warn since it has collapsed the double reference + let non_deref_type = &&PlainType(1u32); + let non_deref_type_deref: &PlainType = non_deref_type.deref(); + + let non_borrow_type = &PlainType(1u32); + let non_borrow_type_borrow: &PlainType = non_borrow_type.borrow(); + //~^ WARNING call to `.borrow()` on a reference in this situation does nothing + + // Borrowing a &&T does not warn since it has collapsed the double reference + let non_borrow_type = &&PlainType(1u32); + let non_borrow_type_borrow: &PlainType = non_borrow_type.borrow(); + + let xs = ["a", "b", "c"]; + let _v: Vec<&str> = xs.iter().map(|x| x.clone()).collect(); // ok, but could use `*x` instead +} + +fn generic(non_clone_type: &PlainType) { + non_clone_type.clone(); +} + +fn non_generic(non_clone_type: &PlainType) { + non_clone_type.clone(); + //~^ WARNING call to `.clone()` on a reference in this situation does nothing +} diff --git a/src/test/ui/lint/noop-method-call.stderr b/src/test/ui/lint/noop-method-call.stderr new file mode 100644 index 0000000000..7f6f96bf1d --- /dev/null +++ b/src/test/ui/lint/noop-method-call.stderr @@ -0,0 +1,39 @@ +warning: call to `.clone()` on a reference in this situation does nothing + --> $DIR/noop-method-call.rs:16:71 + | +LL | let non_clone_type_ref_clone: &PlainType = non_clone_type_ref.clone(); + | ^^^^^^^^ unnecessary method call + | +note: the lint level is defined here + --> $DIR/noop-method-call.rs:4:9 + | +LL | #![warn(noop_method_call)] + | ^^^^^^^^^^^^^^^^ + = note: the type `&PlainType` which `clone` is being called on is the same as the type returned from `clone`, so the method call does not do anything and can be removed + +warning: call to `.deref()` on a reference in this situation does nothing + --> $DIR/noop-method-call.rs:28:63 + | +LL | let non_deref_type_deref: &PlainType = non_deref_type.deref(); + | ^^^^^^^^ unnecessary method call + | + = note: the type `&PlainType` which `deref` is being called on is the same as the type returned from `deref`, so the method call does not do anything and can be removed + +warning: call to `.borrow()` on a reference in this situation does nothing + --> $DIR/noop-method-call.rs:36:66 + | +LL | let non_borrow_type_borrow: &PlainType = non_borrow_type.borrow(); + | ^^^^^^^^^ unnecessary method call + | + = note: the type `&PlainType` which `borrow` is being called on is the same as the type returned from `borrow`, so the method call does not do anything and can be removed + +warning: call to `.clone()` on a reference in this situation does nothing + --> $DIR/noop-method-call.rs:52:19 + | +LL | non_clone_type.clone(); + | ^^^^^^^^ unnecessary method call + | + = note: the type `&PlainType` which `clone` is being called on is the same as the type returned from `clone`, so the method call does not do anything and can be removed + +warning: 4 warnings emitted + diff --git a/src/test/ui/lint/opaque-ty-ffi-unsafe.full_tait.stderr b/src/test/ui/lint/opaque-ty-ffi-unsafe.full_tait.stderr new file mode 100644 index 0000000000..5433d6e6ae --- /dev/null +++ b/src/test/ui/lint/opaque-ty-ffi-unsafe.full_tait.stderr @@ -0,0 +1,24 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/opaque-ty-ffi-unsafe.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: `extern` block uses type `impl Fn<()>`, which is not FFI-safe + --> $DIR/opaque-ty-ffi-unsafe.rs:14:17 + | +LL | pub fn a(_: A); + | ^ not FFI-safe + | +note: the lint level is defined here + --> $DIR/opaque-ty-ffi-unsafe.rs:5:9 + | +LL | #![deny(improper_ctypes)] + | ^^^^^^^^^^^^^^^ + = note: opaque types have no C equivalent + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/lint/opaque-ty-ffi-unsafe.stderr b/src/test/ui/lint/opaque-ty-ffi-unsafe.min_tait.stderr similarity index 80% rename from src/test/ui/lint/opaque-ty-ffi-unsafe.stderr rename to src/test/ui/lint/opaque-ty-ffi-unsafe.min_tait.stderr index 9d46f6d936..2f20912d2a 100644 --- a/src/test/ui/lint/opaque-ty-ffi-unsafe.stderr +++ b/src/test/ui/lint/opaque-ty-ffi-unsafe.min_tait.stderr @@ -1,11 +1,11 @@ error: `extern` block uses type `impl Fn<()>`, which is not FFI-safe - --> $DIR/opaque-ty-ffi-unsafe.rs:11:17 + --> $DIR/opaque-ty-ffi-unsafe.rs:14:17 | LL | pub fn a(_: A); | ^ not FFI-safe | note: the lint level is defined here - --> $DIR/opaque-ty-ffi-unsafe.rs:2:9 + --> $DIR/opaque-ty-ffi-unsafe.rs:5:9 | LL | #![deny(improper_ctypes)] | ^^^^^^^^^^^^^^^ diff --git a/src/test/ui/lint/opaque-ty-ffi-unsafe.rs b/src/test/ui/lint/opaque-ty-ffi-unsafe.rs index 4ceb0c3da0..0e9df91955 100644 --- a/src/test/ui/lint/opaque-ty-ffi-unsafe.rs +++ b/src/test/ui/lint/opaque-ty-ffi-unsafe.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #![deny(improper_ctypes)] type A = impl Fn(); diff --git a/src/test/ui/lint/recommend-literal.rs b/src/test/ui/lint/recommend-literal.rs new file mode 100644 index 0000000000..f60d3d10dc --- /dev/null +++ b/src/test/ui/lint/recommend-literal.rs @@ -0,0 +1,35 @@ +type Real = double; +//~^ ERROR cannot find type `double` in this scope +//~| HELP perhaps you intended to use this type + +fn main() { + let x: Real = 3.5; + let y: long = 74802374902374923; + //~^ ERROR cannot find type `long` in this scope + //~| HELP perhaps you intended to use this type +} + +fn z(a: boolean) { + //~^ ERROR cannot find type `boolean` in this scope + //~| HELP perhaps you intended to use this type +} + +fn a() -> byte { +//~^ ERROR cannot find type `byte` in this scope +//~| HELP perhaps you intended to use this type + 3 +} + +struct Data { //~ HELP you might be missing a type parameter + width: float, + //~^ ERROR cannot find type `float` in this scope + //~| HELP perhaps you intended to use this type + depth: Option, + //~^ ERROR cannot find type `int` in this scope + //~| HELP perhaps you intended to use this type +} + +trait Stuff {} +impl Stuff for short {} +//~^ ERROR cannot find type `short` in this scope +//~| HELP perhaps you intended to use this type diff --git a/src/test/ui/lint/recommend-literal.stderr b/src/test/ui/lint/recommend-literal.stderr new file mode 100644 index 0000000000..b01073b42b --- /dev/null +++ b/src/test/ui/lint/recommend-literal.stderr @@ -0,0 +1,72 @@ +error[E0412]: cannot find type `double` in this scope + --> $DIR/recommend-literal.rs:1:13 + | +LL | type Real = double; + | ^^^^^^ + | | + | not found in this scope + | help: perhaps you intended to use this type: `f64` + +error[E0412]: cannot find type `long` in this scope + --> $DIR/recommend-literal.rs:7:12 + | +LL | let y: long = 74802374902374923; + | ^^^^ + | | + | not found in this scope + | help: perhaps you intended to use this type: `i64` + +error[E0412]: cannot find type `boolean` in this scope + --> $DIR/recommend-literal.rs:12:9 + | +LL | fn z(a: boolean) { + | ^^^^^^^ + | | + | not found in this scope + | help: perhaps you intended to use this type: `bool` + +error[E0412]: cannot find type `byte` in this scope + --> $DIR/recommend-literal.rs:17:11 + | +LL | fn a() -> byte { + | ^^^^ + | | + | not found in this scope + | help: perhaps you intended to use this type: `u8` + +error[E0412]: cannot find type `float` in this scope + --> $DIR/recommend-literal.rs:24:12 + | +LL | width: float, + | ^^^^^ + | | + | not found in this scope + | help: perhaps you intended to use this type: `f32` + +error[E0412]: cannot find type `int` in this scope + --> $DIR/recommend-literal.rs:27:19 + | +LL | depth: Option, + | ^^^ not found in this scope + | +help: perhaps you intended to use this type + | +LL | depth: Option, + | ^^^ +help: you might be missing a type parameter + | +LL | struct Data { + | ^^^^^ + +error[E0412]: cannot find type `short` in this scope + --> $DIR/recommend-literal.rs:33:16 + | +LL | impl Stuff for short {} + | ^^^^^ + | | + | not found in this scope + | help: perhaps you intended to use this type: `i16` + +error: aborting due to 7 previous errors + +For more information about this error, try `rustc --explain E0412`. diff --git a/src/test/ui/lint/register-tool-lint.rs b/src/test/ui/lint/register-tool-lint.rs new file mode 100644 index 0000000000..0ba5a37b16 --- /dev/null +++ b/src/test/ui/lint/register-tool-lint.rs @@ -0,0 +1,11 @@ +#![crate_type = "lib"] +#![feature(register_tool)] +#![register_tool(xyz)] +#![warn(xyz::my_lint)] // this should not error +#![warn(abc::my_lint)] +//~^ ERROR unknown tool name `abc` found in scoped lint +//~| HELP add `#![register_tool(abc)]` +//~| ERROR unknown tool name `abc` +//~| HELP add `#![register_tool(abc)]` +//~| ERROR unknown tool name `abc` +//~| HELP add `#![register_tool(abc)]` diff --git a/src/test/ui/lint/register-tool-lint.stderr b/src/test/ui/lint/register-tool-lint.stderr new file mode 100644 index 0000000000..750c74cec1 --- /dev/null +++ b/src/test/ui/lint/register-tool-lint.stderr @@ -0,0 +1,27 @@ +error[E0710]: unknown tool name `abc` found in scoped lint: `abc::my_lint` + --> $DIR/register-tool-lint.rs:5:9 + | +LL | #![warn(abc::my_lint)] + | ^^^ + | + = help: add `#![register_tool(abc)]` to the crate root + +error[E0710]: unknown tool name `abc` found in scoped lint: `abc::my_lint` + --> $DIR/register-tool-lint.rs:5:9 + | +LL | #![warn(abc::my_lint)] + | ^^^ + | + = help: add `#![register_tool(abc)]` to the crate root + +error[E0710]: unknown tool name `abc` found in scoped lint: `abc::my_lint` + --> $DIR/register-tool-lint.rs:5:9 + | +LL | #![warn(abc::my_lint)] + | ^^^ + | + = help: add `#![register_tool(abc)]` to the crate root + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0710`. diff --git a/src/test/ui/lint/renamed-lints-still-apply.rs b/src/test/ui/lint/renamed-lints-still-apply.rs new file mode 100644 index 0000000000..01cd325367 --- /dev/null +++ b/src/test/ui/lint/renamed-lints-still-apply.rs @@ -0,0 +1,9 @@ +// compile-flags: --crate-type lib +#![deny(single_use_lifetime)] +//~^ WARNING renamed +//~| NOTE `#[warn(renamed_and_removed_lints)]` on by default +//~| NOTE defined here +fn _foo<'a>(_x: &'a u32) {} +//~^ ERROR only used once +//~| NOTE this lifetime +//~| NOTE is used only here diff --git a/src/test/ui/lint/renamed-lints-still-apply.stderr b/src/test/ui/lint/renamed-lints-still-apply.stderr new file mode 100644 index 0000000000..33e5a03266 --- /dev/null +++ b/src/test/ui/lint/renamed-lints-still-apply.stderr @@ -0,0 +1,28 @@ +warning: lint `single_use_lifetime` has been renamed to `single_use_lifetimes` + --> $DIR/renamed-lints-still-apply.rs:2:9 + | +LL | #![deny(single_use_lifetime)] + | ^^^^^^^^^^^^^^^^^^^ help: use the new name: `single_use_lifetimes` + | + = note: `#[warn(renamed_and_removed_lints)]` on by default + +error: lifetime parameter `'a` only used once + --> $DIR/renamed-lints-still-apply.rs:6:9 + | +LL | fn _foo<'a>(_x: &'a u32) {} + | ^^ -- ...is used only here + | | + | this lifetime... + | +note: the lint level is defined here + --> $DIR/renamed-lints-still-apply.rs:2:9 + | +LL | #![deny(single_use_lifetime)] + | ^^^^^^^^^^^^^^^^^^^ +help: elide the single-use lifetime + | +LL | fn _foo(_x: &u32) {} + | -- -- + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/lint/rustdoc-group.rs b/src/test/ui/lint/rustdoc-group.rs new file mode 100644 index 0000000000..130abe4253 --- /dev/null +++ b/src/test/ui/lint/rustdoc-group.rs @@ -0,0 +1,5 @@ +// check-pass +// compile-flags: --crate-type lib +#![deny(rustdoc)] +//~^ WARNING removed: use `rustdoc::all` +#![deny(rustdoc::all)] // has no effect when run with rustc directly diff --git a/src/test/ui/lint/rustdoc-group.stderr b/src/test/ui/lint/rustdoc-group.stderr new file mode 100644 index 0000000000..fddc863ae1 --- /dev/null +++ b/src/test/ui/lint/rustdoc-group.stderr @@ -0,0 +1,10 @@ +warning: lint `rustdoc` has been removed: use `rustdoc::all` instead + --> $DIR/rustdoc-group.rs:3:9 + | +LL | #![deny(rustdoc)] + | ^^^^^^^ + | + = note: `#[warn(renamed_and_removed_lints)]` on by default + +warning: 1 warning emitted + diff --git a/src/test/ui/lint/rustdoc-renamed.rs b/src/test/ui/lint/rustdoc-renamed.rs new file mode 100644 index 0000000000..ecd6155b76 --- /dev/null +++ b/src/test/ui/lint/rustdoc-renamed.rs @@ -0,0 +1,15 @@ +#![crate_type = "lib"] + +#![deny(unknown_lints)] +#![deny(renamed_and_removed_lints)] +//~^ NOTE lint level is defined + +// both allowed, since the compiler doesn't yet know what rustdoc lints are valid +#![deny(rustdoc::x)] +#![deny(rustdoc::intra_doc_link_resolution_failure)] + +#![deny(intra_doc_link_resolution_failure)] +//~^ ERROR removed: use `rustdoc::broken_intra_doc_links` +#![deny(non_autolinks)] +// FIXME: the old names for rustdoc lints should warn by default once `rustdoc::` makes it to the +// stable channel. diff --git a/src/test/ui/lint/rustdoc-renamed.stderr b/src/test/ui/lint/rustdoc-renamed.stderr new file mode 100644 index 0000000000..096e867aa1 --- /dev/null +++ b/src/test/ui/lint/rustdoc-renamed.stderr @@ -0,0 +1,14 @@ +error: lint `intra_doc_link_resolution_failure` has been removed: use `rustdoc::broken_intra_doc_links` instead + --> $DIR/rustdoc-renamed.rs:11:9 + | +LL | #![deny(intra_doc_link_resolution_failure)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | +note: the lint level is defined here + --> $DIR/rustdoc-renamed.rs:4:9 + | +LL | #![deny(renamed_and_removed_lints)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/lint/type-overflow.rs b/src/test/ui/lint/type-overflow.rs index e40321e56b..6234b794c1 100644 --- a/src/test/ui/lint/type-overflow.rs +++ b/src/test/ui/lint/type-overflow.rs @@ -7,16 +7,16 @@ fn main() { let ok = 0b1000_0001; // should be ok -> i32 let ok = 0b0111_1111i8; // should be ok -> 127i8 - let fail = 0b1000_0001i8; //~WARNING literal out of range for i8 + let fail = 0b1000_0001i8; //~WARNING literal out of range for `i8` - let fail = 0x8000_0000_0000_0000i64; //~WARNING literal out of range for i64 + let fail = 0x8000_0000_0000_0000i64; //~WARNING literal out of range for `i64` - let fail = 0x1_FFFF_FFFFu32; //~WARNING literal out of range for u32 + let fail = 0x1_FFFF_FFFFu32; //~WARNING literal out of range for `u32` let fail: i128 = 0x8000_0000_0000_0000_0000_0000_0000_0000; - //~^ WARNING literal out of range for i128 + //~^ WARNING literal out of range for `i128` - let fail = 0x8FFF_FFFF_FFFF_FFFE; //~WARNING literal out of range for i32 + let fail = 0x8FFF_FFFF_FFFF_FFFE; //~WARNING literal out of range for `i32` - let fail = -0b1111_1111i8; //~WARNING literal out of range for i8 + let fail = -0b1111_1111i8; //~WARNING literal out of range for `i8` } diff --git a/src/test/ui/lint/type-overflow.stderr b/src/test/ui/lint/type-overflow.stderr index 6ba8b43954..8a31fd4474 100644 --- a/src/test/ui/lint/type-overflow.stderr +++ b/src/test/ui/lint/type-overflow.stderr @@ -10,56 +10,58 @@ note: the lint level is defined here LL | #![warn(overflowing_literals)] | ^^^^^^^^^^^^^^^^^^^^ = note: the literal `255i8` does not fit into the type `i8` whose range is `-128..=127` + = help: consider using the type `u8` instead -warning: literal out of range for i8 +warning: literal out of range for `i8` --> $DIR/type-overflow.rs:10:16 | LL | let fail = 0b1000_0001i8; - | ^^^^^^^^^^^^^ help: consider using `u8` instead: `0b1000_0001u8` + | ^^^^^^^^^^^^^ help: consider using the type `u8` instead: `0b1000_0001u8` | = note: the literal `0b1000_0001i8` (decimal `129`) does not fit into the type `i8` and will become `-127i8` -warning: literal out of range for i64 +warning: literal out of range for `i64` --> $DIR/type-overflow.rs:12:16 | LL | let fail = 0x8000_0000_0000_0000i64; - | ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using `u64` instead: `0x8000_0000_0000_0000u64` + | ^^^^^^^^^^^^^^^^^^^^^^^^ help: consider using the type `u64` instead: `0x8000_0000_0000_0000u64` | = note: the literal `0x8000_0000_0000_0000i64` (decimal `9223372036854775808`) does not fit into the type `i64` and will become `-9223372036854775808i64` -warning: literal out of range for u32 +warning: literal out of range for `u32` --> $DIR/type-overflow.rs:14:16 | LL | let fail = 0x1_FFFF_FFFFu32; - | ^^^^^^^^^^^^^^^^ help: consider using `u64` instead: `0x1_FFFF_FFFFu64` + | ^^^^^^^^^^^^^^^^ help: consider using the type `u64` instead: `0x1_FFFF_FFFFu64` | = note: the literal `0x1_FFFF_FFFFu32` (decimal `8589934591`) does not fit into the type `u32` and will become `4294967295u32` -warning: literal out of range for i128 +warning: literal out of range for `i128` --> $DIR/type-overflow.rs:16:22 | LL | let fail: i128 = 0x8000_0000_0000_0000_0000_0000_0000_0000; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | = note: the literal `0x8000_0000_0000_0000_0000_0000_0000_0000` (decimal `170141183460469231731687303715884105728`) does not fit into the type `i128` and will become `-170141183460469231731687303715884105728i128` - = help: consider using `u128` instead + = help: consider using the type `u128` instead -warning: literal out of range for i32 +warning: literal out of range for `i32` --> $DIR/type-overflow.rs:19:16 | LL | let fail = 0x8FFF_FFFF_FFFF_FFFE; | ^^^^^^^^^^^^^^^^^^^^^ | = note: the literal `0x8FFF_FFFF_FFFF_FFFE` (decimal `10376293541461622782`) does not fit into the type `i32` and will become `-2i32` - = help: consider using `i128` instead + = help: consider using the type `i128` instead -warning: literal out of range for i8 +warning: literal out of range for `i8` --> $DIR/type-overflow.rs:21:17 | LL | let fail = -0b1111_1111i8; - | ^^^^^^^^^^^^^ help: consider using `i16` instead: `0b1111_1111i16` + | ^^^^^^^^^^^^^ help: consider using the type `i16` instead: `0b1111_1111i16` | - = note: the literal `0b1111_1111i8` (decimal `255`) does not fit into the type `i8` and will become `-1i8` + = note: the literal `0b1111_1111i8` (decimal `255`) does not fit into the type `i8` + = note: and the value `-0b1111_1111i8` will become `1i8` warning: 7 warnings emitted diff --git a/src/test/ui/lint/unaligned_references_external_macro.rs b/src/test/ui/lint/unaligned_references_external_macro.rs new file mode 100644 index 0000000000..6ac501fb0e --- /dev/null +++ b/src/test/ui/lint/unaligned_references_external_macro.rs @@ -0,0 +1,14 @@ +// aux-build:unaligned_references_external_crate.rs + +#![allow(safe_packed_borrows)] + +extern crate unaligned_references_external_crate; + +unaligned_references_external_crate::mac! { //~ERROR reference to packed field is unaligned + #[repr(packed)] + pub struct X { + pub field: u16 + } +} + +fn main() {} diff --git a/src/test/ui/lint/unaligned_references_external_macro.stderr b/src/test/ui/lint/unaligned_references_external_macro.stderr new file mode 100644 index 0000000000..140294b65c --- /dev/null +++ b/src/test/ui/lint/unaligned_references_external_macro.stderr @@ -0,0 +1,26 @@ +error: reference to packed field is unaligned + --> $DIR/unaligned_references_external_macro.rs:7:1 + | +LL | / unaligned_references_external_crate::mac! { +LL | | #[repr(packed)] +LL | | pub struct X { +LL | | pub field: u16 +LL | | } +LL | | } + | |_^ + | +note: the lint level is defined here + --> $DIR/unaligned_references_external_macro.rs:7:1 + | +LL | / unaligned_references_external_crate::mac! { +LL | | #[repr(packed)] +LL | | pub struct X { +LL | | pub field: u16 +LL | | } +LL | | } + | |_^ + = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error: aborting due to previous error + diff --git a/src/test/ui/lint/unused_variables-issue-82488.fixed b/src/test/ui/lint/unused_variables-issue-82488.fixed new file mode 100644 index 0000000000..3cb2c90d0d --- /dev/null +++ b/src/test/ui/lint/unused_variables-issue-82488.fixed @@ -0,0 +1,16 @@ +// run-rustfix +#![deny(unused_variables)] + +struct Point { + x: u32, + y: u32 +} + +fn process_point(Point { x, y: _renamed }: Point) { +//~^ ERROR unused variable: `renamed` + let _ = x; +} + +fn main() { + process_point(Point { x: 0, y: 0 }); +} diff --git a/src/test/ui/lint/unused_variables-issue-82488.rs b/src/test/ui/lint/unused_variables-issue-82488.rs new file mode 100644 index 0000000000..007b0799bb --- /dev/null +++ b/src/test/ui/lint/unused_variables-issue-82488.rs @@ -0,0 +1,16 @@ +// run-rustfix +#![deny(unused_variables)] + +struct Point { + x: u32, + y: u32 +} + +fn process_point(Point { x, y: renamed }: Point) { +//~^ ERROR unused variable: `renamed` + let _ = x; +} + +fn main() { + process_point(Point { x: 0, y: 0 }); +} diff --git a/src/test/ui/lint/unused_variables-issue-82488.stderr b/src/test/ui/lint/unused_variables-issue-82488.stderr new file mode 100644 index 0000000000..dce03a0f73 --- /dev/null +++ b/src/test/ui/lint/unused_variables-issue-82488.stderr @@ -0,0 +1,14 @@ +error: unused variable: `renamed` + --> $DIR/unused_variables-issue-82488.rs:9:32 + | +LL | fn process_point(Point { x, y: renamed }: Point) { + | ^^^^^^^ help: if this is intentional, prefix it with an underscore: `_renamed` + | +note: the lint level is defined here + --> $DIR/unused_variables-issue-82488.rs:2:9 + | +LL | #![deny(unused_variables)] + | ^^^^^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/liveness/liveness-consts.stderr b/src/test/ui/liveness/liveness-consts.stderr index fa8a590a81..b1beec97df 100644 --- a/src/test/ui/liveness/liveness-consts.stderr +++ b/src/test/ui/liveness/liveness-consts.stderr @@ -1,8 +1,8 @@ warning: variable `a` is assigned to, but never used - --> $DIR/liveness-consts.rs:7:9 + --> $DIR/liveness-consts.rs:7:13 | LL | let mut a = 0; - | ^^^^^ + | ^ | note: the lint level is defined here --> $DIR/liveness-consts.rs:2:9 diff --git a/src/test/ui/liveness/liveness-dead.stderr b/src/test/ui/liveness/liveness-dead.stderr index e9d20cf981..12680ab115 100644 --- a/src/test/ui/liveness/liveness-dead.stderr +++ b/src/test/ui/liveness/liveness-dead.stderr @@ -1,8 +1,8 @@ error: value assigned to `x` is never read - --> $DIR/liveness-dead.rs:9:9 + --> $DIR/liveness-dead.rs:9:13 | LL | let mut x: isize = 3; - | ^^^^^ + | ^ | note: the lint level is defined here --> $DIR/liveness-dead.rs:2:9 @@ -20,10 +20,10 @@ LL | x = 4; = help: maybe it is overwritten before being read? error: value passed to `x` is never read - --> $DIR/liveness-dead.rs:20:7 + --> $DIR/liveness-dead.rs:20:11 | LL | fn f4(mut x: i32) { - | ^^^^^ + | ^ | = help: maybe it is overwritten before being read? diff --git a/src/test/ui/liveness/liveness-unused.stderr b/src/test/ui/liveness/liveness-unused.stderr index 2c5550ac47..4a6122681a 100644 --- a/src/test/ui/liveness/liveness-unused.stderr +++ b/src/test/ui/liveness/liveness-unused.stderr @@ -44,10 +44,10 @@ LL | let x = 3; | ^ help: if this is intentional, prefix it with an underscore: `_x` error: variable `x` is assigned to, but never used - --> $DIR/liveness-unused.rs:30:9 + --> $DIR/liveness-unused.rs:30:13 | LL | let mut x = 3; - | ^^^^^ + | ^ | = note: consider using `_x` instead @@ -65,10 +65,10 @@ LL | #![deny(unused_assignments)] = help: maybe it is overwritten before being read? error: variable `z` is assigned to, but never used - --> $DIR/liveness-unused.rs:37:9 + --> $DIR/liveness-unused.rs:37:13 | LL | let mut z = 3; - | ^^^^^ + | ^ | = note: consider using `_z` instead diff --git a/src/test/ui/loops/issue-82916.rs b/src/test/ui/loops/issue-82916.rs new file mode 100644 index 0000000000..8633ea1e8c --- /dev/null +++ b/src/test/ui/loops/issue-82916.rs @@ -0,0 +1,10 @@ +struct S(i32); + +fn foo(x: Vec) { + for y in x { + + } + let z = x; //~ ERROR use of moved value: `x` +} + +fn main() {} diff --git a/src/test/ui/loops/issue-82916.stderr b/src/test/ui/loops/issue-82916.stderr new file mode 100644 index 0000000000..ad42cce71f --- /dev/null +++ b/src/test/ui/loops/issue-82916.stderr @@ -0,0 +1,23 @@ +error[E0382]: use of moved value: `x` + --> $DIR/issue-82916.rs:7:13 + | +LL | fn foo(x: Vec) { + | - move occurs because `x` has type `Vec`, which does not implement the `Copy` trait +LL | for y in x { + | - + | | + | `x` moved due to this implicit call to `.into_iter()` + | help: consider borrowing to avoid moving into the for loop: `&x` +... +LL | let z = x; + | ^ value used here after move + | +note: this function takes ownership of the receiver `self`, which moves `x` + --> $SRC_DIR/core/src/iter/traits/collect.rs:LL:COL + | +LL | fn into_iter(self) -> Self::IntoIter; + | ^^^^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0382`. diff --git a/src/test/ui/macros/assert-eq-macro-msg.rs b/src/test/ui/macros/assert-eq-macro-msg.rs new file mode 100644 index 0000000000..accbd2d1e7 --- /dev/null +++ b/src/test/ui/macros/assert-eq-macro-msg.rs @@ -0,0 +1,9 @@ +// run-fail +// error-pattern:panicked at 'assertion failed: `(left == right)` +// error-pattern: left: `2` +// error-pattern:right: `3`: 1 + 1 definitely should be 3' +// ignore-emscripten no processes + +fn main() { + assert_eq!(1 + 1, 3, "1 + 1 definitely should be 3"); +} diff --git a/src/test/ui/macros/assert-format-lazy.rs b/src/test/ui/macros/assert-format-lazy.rs new file mode 100644 index 0000000000..c7f05d763b --- /dev/null +++ b/src/test/ui/macros/assert-format-lazy.rs @@ -0,0 +1,12 @@ +// run-pass +// compile-flags: -C debug_assertions=yes + +#[allow(unreachable_code)] +fn main() { + assert!(true, "Failed: {:?}", panic!("assert! evaluated format expressions")); + debug_assert!(true, "Failed: {:?}", panic!("debug_assert! evaluated format expressions")); + assert_eq!(1, 1, "Failed: {:?}", panic!("assert_eq! evaluated format expressions")); + debug_assert_eq!(1, 1, "Failed: {:?}", panic!("debug_assert_eq! evaluated format expressions")); + assert_ne!(1, 2, "Failed: {:?}", panic!("assert_ne! evaluated format expressions")); + debug_assert_ne!(1, 2, "Failed: {:?}", panic!("debug_assert_ne! evaluated format expressions")); +} diff --git a/src/test/ui/macros/assert-matches-macro-msg.rs b/src/test/ui/macros/assert-matches-macro-msg.rs new file mode 100644 index 0000000000..43be9532f5 --- /dev/null +++ b/src/test/ui/macros/assert-matches-macro-msg.rs @@ -0,0 +1,11 @@ +// run-fail +// error-pattern:panicked at 'assertion failed: `(left matches right)` +// error-pattern: left: `2` +// error-pattern:right: `3`: 1 + 1 definitely should be 3' +// ignore-emscripten no processes + +#![feature(assert_matches)] + +fn main() { + assert_matches!(1 + 1, 3, "1 + 1 definitely should be 3"); +} diff --git a/src/test/ui/macros/assert-ne-macro-msg.rs b/src/test/ui/macros/assert-ne-macro-msg.rs new file mode 100644 index 0000000000..fc0472b99b --- /dev/null +++ b/src/test/ui/macros/assert-ne-macro-msg.rs @@ -0,0 +1,9 @@ +// run-fail +// error-pattern:panicked at 'assertion failed: `(left != right)` +// error-pattern: left: `2` +// error-pattern:right: `2`: 1 + 1 definitely should not be 2' +// ignore-emscripten no processes + +fn main() { + assert_ne!(1 + 1, 2, "1 + 1 definitely should not be 2"); +} diff --git a/src/test/ui/macros/builtin-std-paths-fail.stderr b/src/test/ui/macros/builtin-std-paths-fail.stderr index 9831e46ec3..4f1a76b0d6 100644 --- a/src/test/ui/macros/builtin-std-paths-fail.stderr +++ b/src/test/ui/macros/builtin-std-paths-fail.stderr @@ -1,3 +1,15 @@ +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 `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 `bench` in `core` --> $DIR/builtin-std-paths-fail.rs:7:9 | @@ -23,28 +35,28 @@ LL | #[core::test] | ^^^^ could not find `test` in `core` error[E0433]: failed to resolve: could not find `RustcDecodable` in `core` - --> $DIR/builtin-std-paths-fail.rs:2: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 + --> $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 `RustcDecodable` in `core` - --> $DIR/builtin-std-paths-fail.rs:4:11 +error[E0433]: failed to resolve: could not find `RustcDecodable` in `std` + --> $DIR/builtin-std-paths-fail.rs:14:10 | -LL | core::RustcDecodable, - | ^^^^^^^^^^^^^^ could not find `RustcDecodable` in `core` +LL | std::RustcDecodable, + | ^^^^^^^^^^^^^^ could not find `RustcDecodable` in `std` -error[E0433]: failed to resolve: could not find `RustcDecodable` in `core` - --> $DIR/builtin-std-paths-fail.rs:2:11 +error[E0433]: failed to resolve: could not find `RustcDecodable` in `std` + --> $DIR/builtin-std-paths-fail.rs:16:10 | -LL | core::RustcDecodable, - | ^^^^^^^^^^^^^^ could not find `RustcDecodable` in `core` +LL | std::RustcDecodable, + | ^^^^^^^^^^^^^^ could not find `RustcDecodable` in `std` error[E0433]: failed to resolve: could not find `bench` in `std` --> $DIR/builtin-std-paths-fail.rs:19:8 @@ -70,18 +82,6 @@ error[E0433]: failed to resolve: could not find `test` in `std` 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: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 | diff --git a/src/test/ui/macros/empty-trailing-stmt.stderr b/src/test/ui/macros/empty-trailing-stmt.stderr index e88b12712f..1db759a218 100644 --- a/src/test/ui/macros/empty-trailing-stmt.stderr +++ b/src/test/ui/macros/empty-trailing-stmt.stderr @@ -3,6 +3,11 @@ error[E0308]: mismatched types | LL | { true } | ^^^^ expected `()`, found `bool` + | +help: you might have meant to return this value + | +LL | { return true; } + | ^^^^^^ ^ error[E0308]: mismatched types --> $DIR/empty-trailing-stmt.rs:5:13 diff --git a/src/test/ui/html-literals.rs b/src/test/ui/macros/html-literals.rs similarity index 100% rename from src/test/ui/html-literals.rs rename to src/test/ui/macros/html-literals.rs diff --git a/src/test/ui/macros/macro-export-on-modularized-macros.rs b/src/test/ui/macros/macro-export-on-modularized-macros.rs new file mode 100644 index 0000000000..467c6ba7b7 --- /dev/null +++ b/src/test/ui/macros/macro-export-on-modularized-macros.rs @@ -0,0 +1,11 @@ +#![feature(decl_macro)] +#![feature(pub_macro_rules)] + +#[macro_export] +macro m1() {} //~ ERROR `#[macro_export]` cannot be used on `macro` items + +#[macro_export] +pub macro_rules! m2 { () => {} } +//~^ ERROR `#[macro_export]` cannot be used on `macro_rules` with `pub` + +fn main() {} diff --git a/src/test/ui/macros/macro-export-on-modularized-macros.stderr b/src/test/ui/macros/macro-export-on-modularized-macros.stderr new file mode 100644 index 0000000000..8bb031e12c --- /dev/null +++ b/src/test/ui/macros/macro-export-on-modularized-macros.stderr @@ -0,0 +1,14 @@ +error: `#[macro_export]` cannot be used on `macro` items + --> $DIR/macro-export-on-modularized-macros.rs:5:1 + | +LL | macro m1() {} + | ^^^^^^^^^^^^^ + +error: `#[macro_export]` cannot be used on `macro_rules` with `pub` + --> $DIR/macro-export-on-modularized-macros.rs:8:1 + | +LL | pub macro_rules! m2 { () => {} } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/macros/must-use-in-macro-55516.stderr b/src/test/ui/macros/must-use-in-macro-55516.stderr index a694c88708..b4072a1ad7 100644 --- a/src/test/ui/macros/must-use-in-macro-55516.stderr +++ b/src/test/ui/macros/must-use-in-macro-55516.stderr @@ -1,4 +1,4 @@ -warning: unused `std::result::Result` that must be used +warning: unused `Result` that must be used --> $DIR/must-use-in-macro-55516.rs:9:5 | LL | write!(&mut example, "{}", 42); diff --git a/src/test/ui/macros/pub-macro-rules-fail.rs b/src/test/ui/macros/pub-macro-rules-fail.rs new file mode 100644 index 0000000000..bdb4c73f18 --- /dev/null +++ b/src/test/ui/macros/pub-macro-rules-fail.rs @@ -0,0 +1,28 @@ +#![feature(pub_macro_rules)] + +#[macro_use] +mod m { + pub macro_rules! mac { () => {} } + + // `pub` `macro_rules` cannot be redefined in the same module. + pub macro_rules! mac { () => {} } //~ ERROR the name `mac` is defined multiple times + + pub(self) macro_rules! private_mac { () => {} } +} + +const _: () = { + pub macro_rules! block_mac { () => {} } +}; + +mod n { + // Scope of `pub` `macro_rules` is not extended by `#[macro_use]`. + mac!(); //~ ERROR cannot find macro `mac` in this scope + + // `pub` `macro_rules` doesn't put the macro into the root module, unlike `#[macro_export]`. + crate::mac!(); //~ ERROR failed to resolve: maybe a missing crate `mac` + crate::block_mac!(); //~ ERROR failed to resolve: maybe a missing crate `block_mac` + + crate::m::private_mac!(); //~ ERROR macro `private_mac` is private +} + +fn main() {} diff --git a/src/test/ui/macros/pub-macro-rules-fail.stderr b/src/test/ui/macros/pub-macro-rules-fail.stderr new file mode 100644 index 0000000000..588d79dd76 --- /dev/null +++ b/src/test/ui/macros/pub-macro-rules-fail.stderr @@ -0,0 +1,48 @@ +error[E0428]: the name `mac` is defined multiple times + --> $DIR/pub-macro-rules-fail.rs:8:5 + | +LL | pub macro_rules! mac { () => {} } + | -------------------- previous definition of the macro `mac` here +... +LL | pub macro_rules! mac { () => {} } + | ^^^^^^^^^^^^^^^^^^^^ `mac` redefined here + | + = note: `mac` must be defined only once in the macro namespace of this module + +error[E0433]: failed to resolve: maybe a missing crate `mac`? + --> $DIR/pub-macro-rules-fail.rs:22:12 + | +LL | crate::mac!(); + | ^^^ maybe a missing crate `mac`? + +error[E0433]: failed to resolve: maybe a missing crate `block_mac`? + --> $DIR/pub-macro-rules-fail.rs:23:12 + | +LL | crate::block_mac!(); + | ^^^^^^^^^ maybe a missing crate `block_mac`? + +error: cannot find macro `mac` in this scope + --> $DIR/pub-macro-rules-fail.rs:19:5 + | +LL | mac!(); + | ^^^ + | + = note: consider importing this macro: + m::mac + +error[E0603]: macro `private_mac` is private + --> $DIR/pub-macro-rules-fail.rs:25:15 + | +LL | crate::m::private_mac!(); + | ^^^^^^^^^^^ private macro + | +note: the macro `private_mac` is defined here + --> $DIR/pub-macro-rules-fail.rs:10:5 + | +LL | pub(self) macro_rules! private_mac { () => {} } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 5 previous errors + +Some errors have detailed explanations: E0428, E0433, E0603. +For more information about an error, try `rustc --explain E0428`. diff --git a/src/test/ui/macros/pub-macro-rules.rs b/src/test/ui/macros/pub-macro-rules.rs new file mode 100644 index 0000000000..cd4a845f7c --- /dev/null +++ b/src/test/ui/macros/pub-macro-rules.rs @@ -0,0 +1,20 @@ +// check-pass + +#![feature(pub_macro_rules)] + +mod m { + // `pub` `macro_rules` can be used earlier in item order than they are defined. + foo!(); + + pub macro_rules! foo { () => {} } + + // `pub(...)` works too. + pub(super) macro_rules! bar { () => {} } +} + +// `pub` `macro_rules` are available by module path. +m::foo!(); + +m::bar!(); + +fn main() {} diff --git a/src/test/ui/malformed/issue-69341-malformed-derive-inert.rs b/src/test/ui/malformed/issue-69341-malformed-derive-inert.rs index 1fd7cddc7c..fc4c3f4e64 100644 --- a/src/test/ui/malformed/issue-69341-malformed-derive-inert.rs +++ b/src/test/ui/malformed/issue-69341-malformed-derive-inert.rs @@ -1,9 +1,6 @@ fn main() {} struct CLI { - #[derive(parse())] - //~^ ERROR traits in `#[derive(...)]` don't accept arguments - //~| ERROR cannot find derive macro `parse` in this scope + #[derive(parse())] //~ ERROR expected non-macro attribute, found attribute macro 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 index db40ce0753..04f7ebe019 100644 --- a/src/test/ui/malformed/issue-69341-malformed-derive-inert.stderr +++ b/src/test/ui/malformed/issue-69341-malformed-derive-inert.stderr @@ -1,21 +1,8 @@ -error: traits in `#[derive(...)]` don't accept arguments - --> $DIR/issue-69341-malformed-derive-inert.rs:4:19 +error: expected non-macro attribute, found attribute macro `derive` + --> $DIR/issue-69341-malformed-derive-inert.rs:4:7 | LL | #[derive(parse())] - | ^^ help: remove the arguments + | ^^^^^^ not a non-macro attribute -error[E0774]: `derive` may only be applied to structs, enums and unions - --> $DIR/issue-69341-malformed-derive-inert.rs:7: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: aborting due to 3 previous errors +error: aborting due to previous error -For more information about this error, try `rustc --explain E0774`. diff --git a/src/test/ui/malformed/malformed-derive-entry.stderr b/src/test/ui/malformed/malformed-derive-entry.stderr index 63be8f9ca1..365cc099e9 100644 --- a/src/test/ui/malformed/malformed-derive-entry.stderr +++ b/src/test/ui/malformed/malformed-derive-entry.stderr @@ -14,7 +14,7 @@ error: malformed `derive` attribute input --> $DIR/malformed-derive-entry.rs:11:1 | LL | #[derive] - | ^^^^^^^^^ help: missing traits to be derived: `#[derive(Trait1, Trait2, ...)]` + | ^^^^^^^^^ help: must be of the form: `#[derive(Trait1, Trait2, ...)]` error[E0277]: the trait bound `Test1: Clone` is not satisfied --> $DIR/malformed-derive-entry.rs:1:10 diff --git a/src/test/ui/malformed/malformed-special-attrs.stderr b/src/test/ui/malformed/malformed-special-attrs.stderr index 6f535e03e6..1764c3969c 100644 --- a/src/test/ui/malformed/malformed-special-attrs.stderr +++ b/src/test/ui/malformed/malformed-special-attrs.stderr @@ -18,13 +18,13 @@ error: malformed `derive` attribute input --> $DIR/malformed-special-attrs.rs:7:1 | LL | #[derive] - | ^^^^^^^^^ help: missing traits to be derived: `#[derive(Trait1, Trait2, ...)]` + | ^^^^^^^^^ help: must be of the form: `#[derive(Trait1, Trait2, ...)]` error: malformed `derive` attribute input --> $DIR/malformed-special-attrs.rs:10:1 | LL | #[derive = ""] - | ^^^^^^^^^^^^^^ help: missing traits to be derived: `#[derive(Trait1, Trait2, ...)]` + | ^^^^^^^^^^^^^^ help: must be of the form: `#[derive(Trait1, Trait2, ...)]` error: aborting due to 4 previous errors diff --git a/src/test/ui/mir/auxiliary/issue_76375_aux.rs b/src/test/ui/mir/auxiliary/issue_76375_aux.rs index 72f32ecf7e..90f4df739f 100644 --- a/src/test/ui/mir/auxiliary/issue_76375_aux.rs +++ b/src/test/ui/mir/auxiliary/issue_76375_aux.rs @@ -1,5 +1,5 @@ // edition:2018 -// compile-flags: -Z mir-opt-level=2 +// compile-flags: -Z mir-opt-level=3 #[inline(always)] pub fn copy_prop(s: bool) -> String { diff --git a/src/test/ui/mir/issue-66851.rs b/src/test/ui/mir/issue-66851.rs index 72d62a30a3..878ad4e475 100644 --- a/src/test/ui/mir/issue-66851.rs +++ b/src/test/ui/mir/issue-66851.rs @@ -2,7 +2,7 @@ // did not check that the types matched up in the `Ok(r)` branch. // // run-pass -// compile-flags: -Zmir-opt-level=2 +// compile-flags: -Zmir-opt-level=3 #[derive(Debug, PartialEq, Eq)] enum SpecialsRes { Res(u64) } diff --git a/src/test/ui/mir/issue-67639-normalization-ice.rs b/src/test/ui/mir/issue-67639-normalization-ice.rs index 21851a7252..71150a80bc 100644 --- a/src/test/ui/mir/issue-67639-normalization-ice.rs +++ b/src/test/ui/mir/issue-67639-normalization-ice.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=3 +// compile-flags: -Z mir-opt-level=4 // build-pass // This used to ICE in const-prop due diff --git a/src/test/ui/mir/issue-67710-inline-projection.rs b/src/test/ui/mir/issue-67710-inline-projection.rs index 37d8f2eac9..1ff6b4d628 100644 --- a/src/test/ui/mir/issue-67710-inline-projection.rs +++ b/src/test/ui/mir/issue-67710-inline-projection.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=2 +// compile-flags: -Z mir-opt-level=3 // build-pass // This used to ICE due to the inling pass not examining projections diff --git a/src/test/ui/mir/issue-68841.rs b/src/test/ui/mir/issue-68841.rs index 14884a97fa..550bd452a8 100644 --- a/src/test/ui/mir/issue-68841.rs +++ b/src/test/ui/mir/issue-68841.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=2 +// compile-flags: -Z mir-opt-level=3 // edition:2018 // build-pass diff --git a/src/test/ui/mir/issue-71793-inline-args-storage.rs b/src/test/ui/mir/issue-71793-inline-args-storage.rs index 87b2806d4e..18f2e38d14 100644 --- a/src/test/ui/mir/issue-71793-inline-args-storage.rs +++ b/src/test/ui/mir/issue-71793-inline-args-storage.rs @@ -4,7 +4,7 @@ // // check-pass // edition:2018 -// compile-args: -Zmir-opt-level=2 +// compile-args: -Zmir-opt-level=3 #![crate_type = "lib"] diff --git a/src/test/ui/mir/issue-75053.full_tait.stderr b/src/test/ui/mir/issue-75053.full_tait.stderr new file mode 100644 index 0000000000..aff19094b7 --- /dev/null +++ b/src/test/ui/mir/issue-75053.full_tait.stderr @@ -0,0 +1,21 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-75053.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-75053.rs:52:15 + | +LL | let _pos: Phantom1> = Scope::new().my_index(); + | ^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/mir/issue-75053.in_bindings.stderr b/src/test/ui/mir/issue-75053.in_bindings.stderr new file mode 100644 index 0000000000..a43fabc8f5 --- /dev/null +++ b/src/test/ui/mir/issue-75053.in_bindings.stderr @@ -0,0 +1,24 @@ +warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-75053.rs:7:34 + | +LL | #![cfg_attr(in_bindings, feature(impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63065 for more information + +error[E0282]: type annotations needed + --> $DIR/issue-75053.rs:52:38 + | +LL | type O; + | ------- `>::O` defined here +... +LL | let _pos: Phantom1> = Scope::new().my_index(); + | ^^^^^^^^^^------------- + | | + | this method call resolves to `>::O` + | cannot infer type for type parameter `T` + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0282`. diff --git a/src/test/ui/mir/issue-75053.min_tait.stderr b/src/test/ui/mir/issue-75053.min_tait.stderr new file mode 100644 index 0000000000..7ce91e851a --- /dev/null +++ b/src/test/ui/mir/issue-75053.min_tait.stderr @@ -0,0 +1,12 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-75053.rs:52:15 + | +LL | let _pos: Phantom1> = Scope::new().my_index(); + | ^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` 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/mir/issue-75053.rs b/src/test/ui/mir/issue-75053.rs index 6e7211c2ee..89ae3ca300 100644 --- a/src/test/ui/mir/issue-75053.rs +++ b/src/test/ui/mir/issue-75053.rs @@ -1,7 +1,11 @@ -// compile-flags: -Z mir-opt-level=2 -// build-pass +// compile-flags: -Z mir-opt-level=3 -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait in_bindings +#![feature(min_type_alias_impl_trait, rustc_attrs)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete +#![cfg_attr(in_bindings, feature(impl_trait_in_bindings))] +//[in_bindings]~^ WARN incomplete use std::marker::PhantomData; @@ -43,6 +47,9 @@ impl>>, U> MyIndex> for Scope { } } +#[rustc_error] fn main() { let _pos: Phantom1> = Scope::new().my_index(); + //[min_tait,full_tait]~^ ERROR not permitted here + //[in_bindings]~^^ ERROR type annotations needed } diff --git a/src/test/ui/mir/issue-76248.rs b/src/test/ui/mir/issue-76248.rs index b01a972785..18473e79e8 100644 --- a/src/test/ui/mir/issue-76248.rs +++ b/src/test/ui/mir/issue-76248.rs @@ -3,7 +3,7 @@ // Regression test for #76248. // // build-pass -// compile-flags: -Zmir-opt-level=2 +// compile-flags: -Zmir-opt-level=3 const N: usize = 1; diff --git a/src/test/ui/mir/issue-76375.rs b/src/test/ui/mir/issue-76375.rs index a7772cb1fe..e635caca9f 100644 --- a/src/test/ui/mir/issue-76375.rs +++ b/src/test/ui/mir/issue-76375.rs @@ -2,7 +2,7 @@ // // edition:2018 // build-pass -// compile-flags: -Z mir-opt-level=2 +// compile-flags: -Z mir-opt-level=3 // aux-build:issue_76375_aux.rs #![crate_type = "lib"] diff --git a/src/test/ui/mir/issue-76740-copy-propagation.rs b/src/test/ui/mir/issue-76740-copy-propagation.rs index 90999a3e55..1d4ec11762 100644 --- a/src/test/ui/mir/issue-76740-copy-propagation.rs +++ b/src/test/ui/mir/issue-76740-copy-propagation.rs @@ -1,6 +1,6 @@ // Regression test for issue #76740. // run-pass -// compile-flags: -Zmir-opt-level=3 +// compile-flags: -Zmir-opt-level=4 #[derive(Copy, Clone)] pub struct V([usize; 4]); diff --git a/src/test/ui/mir/issue-77911.rs b/src/test/ui/mir/issue-77911.rs index fff303495e..acf4c20542 100644 --- a/src/test/ui/mir/issue-77911.rs +++ b/src/test/ui/mir/issue-77911.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=2 +// compile-flags: -Z mir-opt-level=3 // build-pass use std::fs::File; diff --git a/src/test/ui/mir/issue-78496.rs b/src/test/ui/mir/issue-78496.rs index 1b0687cfac..a0d1f5a780 100644 --- a/src/test/ui/mir/issue-78496.rs +++ b/src/test/ui/mir/issue-78496.rs @@ -1,5 +1,5 @@ // run-pass -// compile-flags: -Z mir-opt-level=2 -C opt-level=0 +// compile-flags: -Z mir-opt-level=3 -C opt-level=0 // example from #78496 pub enum E<'a> { diff --git a/src/test/ui/mir/issue-80742.stderr b/src/test/ui/mir/issue-80742.stderr index 8cbd0220e6..8400aab308 100644 --- a/src/test/ui/mir/issue-80742.stderr +++ b/src/test/ui/mir/issue-80742.stderr @@ -56,7 +56,7 @@ LL | struct Inline | - required by this bound in `Inline` ... LL | let dst = Inline::::new(0); - | ^^^^^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time + | ^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time | = help: the trait `Sized` is not implemented for `dyn Debug` help: consider relaxing the implicit `Sized` restriction diff --git a/src/test/ui/mir/issue66339.rs b/src/test/ui/mir/issue66339.rs index 98e178c055..2507af38cd 100644 --- a/src/test/ui/mir/issue66339.rs +++ b/src/test/ui/mir/issue66339.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=2 +// compile-flags: -Z mir-opt-level=3 // build-pass // This used to ICE in const-prop diff --git a/src/test/ui/mir/mir-inlining/array-clone-with-generic-size.rs b/src/test/ui/mir/mir-inlining/array-clone-with-generic-size.rs index eec0a4599c..e36e8bd746 100644 --- a/src/test/ui/mir/mir-inlining/array-clone-with-generic-size.rs +++ b/src/test/ui/mir/mir-inlining/array-clone-with-generic-size.rs @@ -2,7 +2,7 @@ // Regression test for issue #79269. // // build-pass -// compile-flags: -Zmir-opt-level=2 -Zvalidate-mir +// compile-flags: -Zmir-opt-level=3 -Zvalidate-mir #[derive(Clone)] struct Array([T; N]); diff --git a/src/test/ui/mir/mir-inlining/ice-issue-45493.rs b/src/test/ui/mir/mir-inlining/ice-issue-45493.rs index 1bd16dc43e..04a23212e7 100644 --- a/src/test/ui/mir/mir-inlining/ice-issue-45493.rs +++ b/src/test/ui/mir/mir-inlining/ice-issue-45493.rs @@ -1,5 +1,5 @@ // run-pass -// compile-flags:-Zmir-opt-level=2 +// compile-flags:-Zmir-opt-level=3 trait Array { type Item; diff --git a/src/test/ui/mir/mir-inlining/ice-issue-45885.rs b/src/test/ui/mir/mir-inlining/ice-issue-45885.rs index e930a4d1cc..09b1279ef3 100644 --- a/src/test/ui/mir/mir-inlining/ice-issue-45885.rs +++ b/src/test/ui/mir/mir-inlining/ice-issue-45885.rs @@ -1,5 +1,5 @@ // run-pass -// compile-flags:-Zmir-opt-level=2 +// compile-flags:-Zmir-opt-level=3 pub enum Enum { A, diff --git a/src/test/ui/mir/mir-inlining/ice-issue-68347.rs b/src/test/ui/mir/mir-inlining/ice-issue-68347.rs index 88b80bc333..7c13525094 100644 --- a/src/test/ui/mir/mir-inlining/ice-issue-68347.rs +++ b/src/test/ui/mir/mir-inlining/ice-issue-68347.rs @@ -1,5 +1,5 @@ // run-pass -// compile-flags:-Zmir-opt-level=2 +// compile-flags:-Zmir-opt-level=3 pub fn main() { let _x: fn() = handle_debug_column; } diff --git a/src/test/ui/mir/mir-inlining/ice-issue-77306-1.rs b/src/test/ui/mir/mir-inlining/ice-issue-77306-1.rs index 4d083bf232..ef05ff9ce0 100644 --- a/src/test/ui/mir/mir-inlining/ice-issue-77306-1.rs +++ b/src/test/ui/mir/mir-inlining/ice-issue-77306-1.rs @@ -1,5 +1,5 @@ // run-pass -// compile-flags:-Zmir-opt-level=2 +// compile-flags:-Zmir-opt-level=3 // Previously ICEd because we did not normalize during inlining, // see https://github.com/rust-lang/rust/pull/77306 for more discussion. diff --git a/src/test/ui/mir/mir-inlining/ice-issue-77306-2.rs b/src/test/ui/mir/mir-inlining/ice-issue-77306-2.rs index a346d45058..cb20840131 100644 --- a/src/test/ui/mir/mir-inlining/ice-issue-77306-2.rs +++ b/src/test/ui/mir/mir-inlining/ice-issue-77306-2.rs @@ -1,5 +1,5 @@ // run-pass -// compile-flags:-Zmir-opt-level=2 +// compile-flags:-Zmir-opt-level=3 struct Cursor {} struct TokenTree {} diff --git a/src/test/ui/mir/mir-inlining/ice-issue-77564.rs b/src/test/ui/mir/mir-inlining/ice-issue-77564.rs index 262402df2c..0d3fbfe5d1 100644 --- a/src/test/ui/mir/mir-inlining/ice-issue-77564.rs +++ b/src/test/ui/mir/mir-inlining/ice-issue-77564.rs @@ -1,5 +1,5 @@ // run-pass -// compile-flags:-Zmir-opt-level=2 +// compile-flags:-Zmir-opt-level=3 use std::mem::MaybeUninit; const N: usize = 2; diff --git a/src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.rs b/src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.rs deleted file mode 100644 index 2437155d98..0000000000 --- a/src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.rs +++ /dev/null @@ -1,21 +0,0 @@ -// Ensures -Zmir-opt-level=2 (specifically, inlining) is not allowed with -Zinstrument-coverage. -// Regression test for issue #80060. -// -// needs-profiler-support -// build-pass -// compile-flags: -Zmir-opt-level=2 -Zinstrument-coverage -#[inline(never)] -fn foo() {} - -pub fn baz() { - bar(); -} - -#[inline(always)] -fn bar() { - foo(); -} - -fn main() { - bar(); -} diff --git a/src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.stderr b/src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.stderr deleted file mode 100644 index eb50e5075c..0000000000 --- a/src/test/ui/mir/mir-inlining/inline-instrument-coverage-fail.stderr +++ /dev/null @@ -1,2 +0,0 @@ -warning: `-Z mir-opt-level=2` (or any level > 1) enables function inlining, which is incompatible with `-Z instrument-coverage`. Inlining will be disabled. - diff --git a/src/test/ui/mir/mir-inlining/no-trait-method-issue-40473.rs b/src/test/ui/mir/mir-inlining/no-trait-method-issue-40473.rs index 8f570dbd4a..8b3cb703dc 100644 --- a/src/test/ui/mir/mir-inlining/no-trait-method-issue-40473.rs +++ b/src/test/ui/mir/mir-inlining/no-trait-method-issue-40473.rs @@ -1,5 +1,5 @@ // run-pass -// compile-flags:-Zmir-opt-level=2 +// compile-flags:-Zmir-opt-level=3 pub trait Foo { fn bar(&self) -> usize { 2 } } diff --git a/src/test/ui/mir/mir-inlining/var-debuginfo-issue-67586.rs b/src/test/ui/mir/mir-inlining/var-debuginfo-issue-67586.rs index 23cc114880..e262068267 100644 --- a/src/test/ui/mir/mir-inlining/var-debuginfo-issue-67586.rs +++ b/src/test/ui/mir/mir-inlining/var-debuginfo-issue-67586.rs @@ -1,5 +1,5 @@ // run-pass -// compile-flags: -Z mir-opt-level=2 -C opt-level=0 -C debuginfo=2 +// compile-flags: -Z mir-opt-level=3 -C opt-level=0 -C debuginfo=2 #[inline(never)] pub fn foo(bar: usize) -> usize { diff --git a/src/test/ui/mir/mir_const_prop_tuple_field_reorder.rs b/src/test/ui/mir/mir_const_prop_tuple_field_reorder.rs index 629b50dec6..b66a85d07d 100644 --- a/src/test/ui/mir/mir_const_prop_tuple_field_reorder.rs +++ b/src/test/ui/mir/mir_const_prop_tuple_field_reorder.rs @@ -1,4 +1,4 @@ -// compile-flags: -Z mir-opt-level=2 +// compile-flags: -Z mir-opt-level=3 // build-pass #![crate_type="lib"] diff --git a/src/test/ui/mir/ssa-analysis-regression-50041.rs b/src/test/ui/mir/ssa-analysis-regression-50041.rs index c818f2976e..1892807253 100644 --- a/src/test/ui/mir/ssa-analysis-regression-50041.rs +++ b/src/test/ui/mir/ssa-analysis-regression-50041.rs @@ -1,5 +1,5 @@ // build-pass -// compile-flags: -Z mir-opt-level=3 +// compile-flags: -Z mir-opt-level=4 #![crate_type="lib"] #![feature(lang_items)] diff --git a/src/test/ui/mismatched_types/abridged.stderr b/src/test/ui/mismatched_types/abridged.stderr index b7564686cd..61994e5bfe 100644 --- a/src/test/ui/mismatched_types/abridged.stderr +++ b/src/test/ui/mismatched_types/abridged.stderr @@ -15,10 +15,10 @@ error[E0308]: mismatched types LL | fn a2() -> Foo { | --- expected `Foo` because of return type LL | Ok(Foo { bar: 1}) - | ^^^^^^^^^^^^^^^^^ expected struct `Foo`, found enum `std::result::Result` + | ^^^^^^^^^^^^^^^^^ expected struct `Foo`, found enum `Result` | = note: expected struct `Foo` - found enum `std::result::Result` + found enum `Result` error[E0308]: mismatched types --> $DIR/abridged.rs:24:5 @@ -38,14 +38,14 @@ error[E0308]: mismatched types --> $DIR/abridged.rs:28:5 | LL | fn c() -> Result { - | ---------------- expected `std::result::Result` because of return type + | ---------------- expected `Result` because of return type LL | Foo { bar: 1 } | ^^^^^^^^^^^^^^ | | - | expected enum `std::result::Result`, found struct `Foo` + | expected enum `Result`, found struct `Foo` | help: try using a variant of the expected enum: `Ok(Foo { bar: 1 })` | - = note: expected enum `std::result::Result` + = note: expected enum `Result` found struct `Foo` error[E0308]: mismatched types diff --git a/src/test/ui/mismatched_types/binops.rs b/src/test/ui/mismatched_types/binops.rs index 4be7420e33..f359451dfb 100644 --- a/src/test/ui/mismatched_types/binops.rs +++ b/src/test/ui/mismatched_types/binops.rs @@ -4,5 +4,5 @@ fn main() { 3 * (); //~ ERROR cannot multiply `{integer}` by `()` 4 / ""; //~ ERROR cannot divide `{integer}` by `&str` 5 < String::new(); //~ ERROR can't compare `{integer}` with `String` - 6 == Ok(1); //~ ERROR can't compare `{integer}` with `std::result::Result<{integer}, _>` + 6 == Ok(1); //~ ERROR can't compare `{integer}` with `Result<{integer}, _>` } diff --git a/src/test/ui/mismatched_types/binops.stderr b/src/test/ui/mismatched_types/binops.stderr index f2bfb12ee9..19e921dd04 100644 --- a/src/test/ui/mismatched_types/binops.stderr +++ b/src/test/ui/mismatched_types/binops.stderr @@ -38,13 +38,13 @@ LL | 5 < String::new(); | = help: the trait `PartialOrd` is not implemented for `{integer}` -error[E0277]: can't compare `{integer}` with `std::result::Result<{integer}, _>` +error[E0277]: can't compare `{integer}` with `Result<{integer}, _>` --> $DIR/binops.rs:7:7 | LL | 6 == Ok(1); - | ^^ no implementation for `{integer} == std::result::Result<{integer}, _>` + | ^^ no implementation for `{integer} == Result<{integer}, _>` | - = help: the trait `PartialEq>` is not implemented for `{integer}` + = help: the trait `PartialEq>` is not implemented for `{integer}` error: aborting due to 6 previous errors diff --git a/src/test/ui/mismatched_types/closure-arg-type-mismatch.rs b/src/test/ui/mismatched_types/closure-arg-type-mismatch.rs index e278049c8c..2d485d14a8 100644 --- a/src/test/ui/mismatched_types/closure-arg-type-mismatch.rs +++ b/src/test/ui/mismatched_types/closure-arg-type-mismatch.rs @@ -8,8 +8,8 @@ fn main() { fn baz(_: F) {} fn _test<'a>(f: fn(*mut &'a u32)) { baz(f); - //~^ ERROR mismatched types - //~| ERROR mismatched types + //~^ ERROR implementation of `FnOnce` is not general enough + //~| ERROR implementation of `FnOnce` is not general enough //~| ERROR mismatched types //~| ERROR mismatched types } diff --git a/src/test/ui/mismatched_types/closure-arg-type-mismatch.stderr b/src/test/ui/mismatched_types/closure-arg-type-mismatch.stderr index 02ba60f7f4..521de3742b 100644 --- a/src/test/ui/mismatched_types/closure-arg-type-mismatch.stderr +++ b/src/test/ui/mismatched_types/closure-arg-type-mismatch.stderr @@ -41,24 +41,14 @@ note: the lifetime requirement is introduced here LL | fn baz(_: F) {} | ^^^^^^^^^^^^^ -error[E0308]: mismatched types +error: implementation of `FnOnce` is not general enough --> $DIR/closure-arg-type-mismatch.rs:10:5 | LL | baz(f); - | ^^^ lifetime mismatch - | - = note: expected type `FnOnce<(*mut &u32,)>` - found type `FnOnce<(*mut &'a u32,)>` -note: the required lifetime does not necessarily outlive the lifetime `'a` as defined on the function body at 9:10 - --> $DIR/closure-arg-type-mismatch.rs:9:10 - | -LL | fn _test<'a>(f: fn(*mut &'a u32)) { - | ^^ -note: the lifetime requirement is introduced here - --> $DIR/closure-arg-type-mismatch.rs:8:11 + | ^^^ implementation of `FnOnce` is not general enough | -LL | fn baz(_: F) {} - | ^^^^^^^^^^^^^ + = note: `fn(*mut &'a u32)` must implement `FnOnce<(*mut &'0 u32,)>`, for any lifetime `'0`... + = note: ...but it actually implements `FnOnce<(*mut &'a u32,)>` error[E0308]: mismatched types --> $DIR/closure-arg-type-mismatch.rs:10:5 @@ -79,24 +69,14 @@ note: the lifetime requirement is introduced here LL | fn baz(_: F) {} | ^^^^^^^^^^^^^ -error[E0308]: mismatched types +error: implementation of `FnOnce` is not general enough --> $DIR/closure-arg-type-mismatch.rs:10:5 | LL | baz(f); - | ^^^ lifetime mismatch - | - = note: expected type `FnOnce<(*mut &u32,)>` - found type `FnOnce<(*mut &'a u32,)>` -note: the lifetime `'a` as defined on the function body at 9:10 doesn't meet the lifetime requirements - --> $DIR/closure-arg-type-mismatch.rs:9:10 - | -LL | fn _test<'a>(f: fn(*mut &'a u32)) { - | ^^ -note: the lifetime requirement is introduced here - --> $DIR/closure-arg-type-mismatch.rs:8:11 + | ^^^ implementation of `FnOnce` is not general enough | -LL | fn baz(_: F) {} - | ^^^^^^^^^^^^^ + = note: `fn(*mut &'a u32)` must implement `FnOnce<(*mut &'0 u32,)>`, for any lifetime `'0`... + = note: ...but it actually implements `FnOnce<(*mut &'a u32,)>` error: aborting due to 7 previous errors diff --git a/src/test/ui/mismatched_types/issue-75361-mismatched-impl.stderr b/src/test/ui/mismatched_types/issue-75361-mismatched-impl.stderr index 4b86a1fede..a64cb82305 100644 --- a/src/test/ui/mismatched_types/issue-75361-mismatched-impl.stderr +++ b/src/test/ui/mismatched_types/issue-75361-mismatched-impl.stderr @@ -13,7 +13,7 @@ help: the lifetime requirements from the `impl` do not correspond to the require --> $DIR/issue-75361-mismatched-impl.rs:12:55 | LL | fn adjacent_edges(&self) -> Box>; - | ^^^^^^^^^^^^^^ consider borrowing this type parameter in the trait + | ^^^^ consider borrowing this type parameter in the trait error: aborting due to previous error 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 92a88cbdb3..1030061b2d 100644 --- a/src/test/ui/mismatched_types/method-help-unsatisfied-bound.stderr +++ b/src/test/ui/mismatched_types/method-help-unsatisfied-bound.stderr @@ -1,11 +1,11 @@ -error[E0599]: the method `unwrap` exists for enum `std::result::Result<(), Foo>`, but its trait bounds were not satisfied +error[E0599]: the method `unwrap` exists for enum `Result<(), Foo>`, but its trait bounds were not satisfied --> $DIR/method-help-unsatisfied-bound.rs:5:7 | LL | struct Foo; | ----------- doesn't satisfy `Foo: Debug` ... LL | a.unwrap(); - | ^^^^^^ method cannot be called on `std::result::Result<(), Foo>` due to unsatisfied trait bounds + | ^^^^^^ method cannot be called on `Result<(), Foo>` due to unsatisfied trait bounds | = note: the following trait bounds were not satisfied: `Foo: Debug` diff --git a/src/test/ui/missing/missing-fields-in-struct-pattern.stderr b/src/test/ui/missing/missing-fields-in-struct-pattern.stderr index 6583524aad..a95b5bb94d 100644 --- a/src/test/ui/missing/missing-fields-in-struct-pattern.stderr +++ b/src/test/ui/missing/missing-fields-in-struct-pattern.stderr @@ -2,7 +2,12 @@ error[E0769]: tuple variant `S` written as struct variant --> $DIR/missing-fields-in-struct-pattern.rs:4:12 | LL | if let S { a, b, c, d } = S(1, 2, 3, 4) { - | ^^^^^^^^^^^^^^^^ help: use the tuple variant pattern syntax instead: `S(a, b, c, d)` + | ^^^^^^^^^^^^^^^^ + | +help: use the tuple variant pattern syntax instead + | +LL | if let S(a, b, c, d) = S(1, 2, 3, 4) { + | ^^^^^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/modules/path-no-file-name.rs b/src/test/ui/modules/path-no-file-name.rs new file mode 100644 index 0000000000..f62cd2a9eb --- /dev/null +++ b/src/test/ui/modules/path-no-file-name.rs @@ -0,0 +1,7 @@ +// normalize-stderr-test: "\.:.*\(" -> ".: $$ACCESS_DENIED_MSG (" +// normalize-stderr-test: "os error \d+" -> "os error $$ACCESS_DENIED_CODE" + +#[path = "."] +mod m; //~ ERROR couldn't read + +fn main() {} diff --git a/src/test/ui/modules/path-no-file-name.stderr b/src/test/ui/modules/path-no-file-name.stderr new file mode 100644 index 0000000000..32a213c68f --- /dev/null +++ b/src/test/ui/modules/path-no-file-name.stderr @@ -0,0 +1,8 @@ +error: couldn't read $DIR/.: $ACCESS_DENIED_MSG (os error $ACCESS_DENIED_CODE) + --> $DIR/path-no-file-name.rs:5:1 + | +LL | mod m; + | ^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/nll/issue-52742.stderr b/src/test/ui/nll/issue-52742.stderr index 7631ca61e5..23bb12f942 100644 --- a/src/test/ui/nll/issue-52742.stderr +++ b/src/test/ui/nll/issue-52742.stderr @@ -9,11 +9,11 @@ note: ...the reference is valid for the lifetime `'_` as defined on the impl at | LL | impl Foo<'_, '_> { | ^^ -note: ...but the borrowed content is only valid for the anonymous lifetime #2 defined on the method body at 13:5 - --> $DIR/issue-52742.rs:13:5 +note: ...but the borrowed content is only valid for the anonymous lifetime defined on the method body at 13:31 + --> $DIR/issue-52742.rs:13:31 | LL | fn take_bar(&mut self, b: Bar<'_>) { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/issues/issue-52992.rs b/src/test/ui/nll/issue-52992.rs similarity index 100% rename from src/test/ui/issues/issue-52992.rs rename to src/test/ui/nll/issue-52992.rs diff --git a/src/test/ui/nll/issue-54556-niconii.stderr b/src/test/ui/nll/issue-54556-niconii.stderr index b4791fd22b..1bfebd755b 100644 --- a/src/test/ui/nll/issue-54556-niconii.stderr +++ b/src/test/ui/nll/issue-54556-niconii.stderr @@ -11,7 +11,7 @@ LL | } | - | | | `counter` dropped here while still borrowed - | ... and the borrow might be used here, when that temporary is dropped and runs the destructor for type `std::result::Result, ()>` + | ... and the borrow might be used here, when that temporary is dropped and runs the destructor for type `Result, ()>` | help: consider adding semicolon after the expression so its temporaries are dropped sooner, before the local variables declared by the block are dropped | diff --git a/src/test/ui/nll/issue-55394.stderr b/src/test/ui/nll/issue-55394.stderr index e24ef176db..36721f923f 100644 --- a/src/test/ui/nll/issue-55394.stderr +++ b/src/test/ui/nll/issue-55394.stderr @@ -4,11 +4,11 @@ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'s` d LL | Foo { bar } | ^^^ | -note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 8:5... - --> $DIR/issue-55394.rs:8:5 +note: first, the lifetime cannot outlive the anonymous lifetime defined on the method body at 8:17... + --> $DIR/issue-55394.rs:8:17 | LL | fn new(bar: &mut Bar) -> Self { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^ note: ...so that reference does not outlive borrowed content --> $DIR/issue-55394.rs:9:15 | diff --git a/src/test/ui/nll/type-alias-free-regions.stderr b/src/test/ui/nll/type-alias-free-regions.stderr index 38e3e05d1c..6498ecfbe6 100644 --- a/src/test/ui/nll/type-alias-free-regions.stderr +++ b/src/test/ui/nll/type-alias-free-regions.stderr @@ -4,11 +4,11 @@ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'a` d LL | C { f: b } | ^ | -note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 16:5... - --> $DIR/type-alias-free-regions.rs:16:5 +note: first, the lifetime cannot outlive the anonymous lifetime defined on the method body at 16:24... + --> $DIR/type-alias-free-regions.rs:16:24 | LL | fn from_box(b: Box) -> Self { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^ note: ...so that the expression is assignable --> $DIR/type-alias-free-regions.rs:17:16 | @@ -35,11 +35,11 @@ error[E0495]: cannot infer an appropriate lifetime due to conflicting requiremen LL | C { f: Box::new(b.0) } | ^^^^^^^^^^^^^ | -note: first, the lifetime cannot outlive the anonymous lifetime #1 defined on the method body at 26:5... - --> $DIR/type-alias-free-regions.rs:26:5 +note: first, the lifetime cannot outlive the anonymous lifetime defined on the method body at 26:23... + --> $DIR/type-alias-free-regions.rs:26:23 | LL | fn from_tuple(b: (B,)) -> Self { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^ note: ...so that the expression is assignable --> $DIR/type-alias-free-regions.rs:27:25 | diff --git a/src/test/ui/non-fmt-panic.rs b/src/test/ui/non-fmt-panic.rs index 25c53316e1..c80a90b3ea 100644 --- a/src/test/ui/non-fmt-panic.rs +++ b/src/test/ui/non-fmt-panic.rs @@ -29,6 +29,17 @@ fn main() { fancy_panic::fancy_panic!(S); //~^ WARN panic message is not a string literal + macro_rules! a { + () => { 123 }; + } + + panic!(a!()); //~ WARN panic message is not a string literal + + panic!(format!("{}", 1)); //~ WARN panic message is not a string literal + + panic![123]; //~ WARN panic message is not a string literal + panic!{123}; //~ WARN panic message is not a string literal + // Check that the lint only triggers for std::panic and core::panic, // not any panic macro: macro_rules! panic { diff --git a/src/test/ui/non-fmt-panic.stderr b/src/test/ui/non-fmt-panic.stderr index 45187c518c..7a333b3e76 100644 --- a/src/test/ui/non-fmt-panic.stderr +++ b/src/test/ui/non-fmt-panic.stderr @@ -93,7 +93,7 @@ LL | panic!("{}", C); help: or use std::panic::panic_any instead | LL | std::panic::panic_any(C); - | ^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^ warning: panic message is not a string literal --> $DIR/non-fmt-panic.rs:20:12 @@ -109,7 +109,7 @@ LL | panic!("{}", S); help: or use std::panic::panic_any instead | LL | std::panic::panic_any(S); - | ^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^ warning: panic message is not a string literal --> $DIR/non-fmt-panic.rs:21:17 @@ -125,7 +125,7 @@ LL | std::panic!("{}", 123); help: or use std::panic::panic_any instead | LL | std::panic::panic_any(123); - | ^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^^^^^^ warning: panic message is not a string literal --> $DIR/non-fmt-panic.rs:22:18 @@ -183,5 +183,66 @@ LL | fancy_panic::fancy_panic!(S); | = note: this is no longer accepted in Rust 2021 -warning: 14 warnings emitted +warning: panic message is not a string literal + --> $DIR/non-fmt-panic.rs:36:12 + | +LL | panic!(a!()); + | ^^^^ + | + = note: this is no longer accepted in Rust 2021 +help: add a "{}" format string to Display the message + | +LL | panic!("{}", a!()); + | ^^^^^ +help: or use std::panic::panic_any instead + | +LL | std::panic::panic_any(a!()); + | ^^^^^^^^^^^^^^^^^^^^^ + +warning: panic message is not a string literal + --> $DIR/non-fmt-panic.rs:38:12 + | +LL | panic!(format!("{}", 1)); + | ^^^^^^^^^^^^^^^^ + | + = note: this is no longer accepted in Rust 2021 + = note: the panic!() macro supports formatting, so there's no need for the format!() macro here +help: remove the `format!(..)` macro call + | +LL | panic!("{}", 1); + | -- -- + +warning: panic message is not a string literal + --> $DIR/non-fmt-panic.rs:40:12 + | +LL | panic![123]; + | ^^^ + | + = note: this is no longer accepted in Rust 2021 +help: add a "{}" format string to Display the message + | +LL | panic!["{}", 123]; + | ^^^^^ +help: or use std::panic::panic_any instead + | +LL | std::panic::panic_any(123); + | ^^^^^^^^^^^^^^^^^^^^^^ ^ + +warning: panic message is not a string literal + --> $DIR/non-fmt-panic.rs:41:12 + | +LL | panic!{123}; + | ^^^ + | + = note: this is no longer accepted in Rust 2021 +help: add a "{}" format string to Display the message + | +LL | panic!{"{}", 123}; + | ^^^^^ +help: or use std::panic::panic_any instead + | +LL | std::panic::panic_any(123); + | ^^^^^^^^^^^^^^^^^^^^^^ ^ + +warning: 18 warnings emitted diff --git a/src/test/ui/numeric/numeric-fields.stderr b/src/test/ui/numeric/numeric-fields.stderr index 5202393f55..13b6cfae4e 100644 --- a/src/test/ui/numeric/numeric-fields.stderr +++ b/src/test/ui/numeric/numeric-fields.stderr @@ -7,7 +7,7 @@ LL | struct S(u8, u16); LL | let s = S{0b1: 10, 0: 11}; | - ^^^ field does not exist | | - | `S` is a tuple struct, use the appropriate syntax: `S(/* fields */)` + | help: `S` is a tuple struct, use the appropriate syntax: `S(/* fields */)` error[E0026]: struct `S` does not have a field named `0x1` --> $DIR/numeric-fields.rs:7:17 diff --git a/src/test/ui/or-patterns/already-bound-name.rs b/src/test/ui/or-patterns/already-bound-name.rs index 726e17b7ec..543d7c21c8 100644 --- a/src/test/ui/or-patterns/already-bound-name.rs +++ b/src/test/ui/or-patterns/already-bound-name.rs @@ -18,10 +18,10 @@ fn main() { let (A(a, _) | B(a), a) = (A(0, 1), 2); //~^ ERROR identifier `a` is bound more than once in the same pattern - let A(a, a) | B(a) = A(0, 1); + let (A(a, a) | B(a)) = A(0, 1); //~^ ERROR identifier `a` is bound more than once in the same pattern - let B(a) | A(a, a) = A(0, 1); + let (B(a) | A(a, a)) = A(0, 1); //~^ ERROR identifier `a` is bound more than once in the same pattern match A(0, 1) { @@ -29,17 +29,17 @@ fn main() { //~^ ERROR identifier `a` is bound more than once in the same pattern } - let B(A(a, _) | B(a)) | A(a, A(a, _) | B(a)) = B(B(1)); + let (B(A(a, _) | B(a)) | A(a, A(a, _) | B(a))) = B(B(1)); //~^ ERROR identifier `a` is bound more than once in the same pattern //~| ERROR identifier `a` is bound more than once in the same pattern //~| ERROR mismatched types - let B(_) | A(A(a, _) | B(a), A(a, _) | B(a)) = B(B(1)); + let (B(_) | A(A(a, _) | B(a), A(a, _) | B(a))) = B(B(1)); //~^ ERROR identifier `a` is bound more than once in the same pattern //~| ERROR identifier `a` is bound more than once in the same pattern //~| ERROR variable `a` is not bound in all patterns - let B(A(a, _) | B(a)) | A(A(a, _) | B(a), A(a, _) | B(a)) = B(B(1)); + let (B(A(a, _) | B(a)) | A(A(a, _) | B(a), A(a, _) | B(a))) = B(B(1)); //~^ 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/or-patterns/already-bound-name.stderr b/src/test/ui/or-patterns/already-bound-name.stderr index 97933ca122..483154a5e3 100644 --- a/src/test/ui/or-patterns/already-bound-name.stderr +++ b/src/test/ui/or-patterns/already-bound-name.stderr @@ -23,16 +23,16 @@ LL | let (A(a, _) | B(a), a) = (A(0, 1), 2); | ^ used in a pattern more than once error[E0416]: identifier `a` is bound more than once in the same pattern - --> $DIR/already-bound-name.rs:21:14 + --> $DIR/already-bound-name.rs:21:15 | -LL | let A(a, a) | B(a) = A(0, 1); - | ^ used in a pattern more than once +LL | let (A(a, a) | B(a)) = A(0, 1); + | ^ used in a pattern more than once error[E0416]: identifier `a` is bound more than once in the same pattern - --> $DIR/already-bound-name.rs:24:21 + --> $DIR/already-bound-name.rs:24:22 | -LL | let B(a) | A(a, a) = A(0, 1); - | ^ used in a pattern more than once +LL | let (B(a) | A(a, a)) = A(0, 1); + | ^ used in a pattern more than once error[E0416]: identifier `a` is bound more than once in the same pattern --> $DIR/already-bound-name.rs:28:21 @@ -41,55 +41,55 @@ LL | B(a) | A(a, a) => {} // Let's ensure `match` has no funny business. | ^ used in a pattern more than once error[E0416]: identifier `a` is bound more than once in the same pattern - --> $DIR/already-bound-name.rs:32:36 + --> $DIR/already-bound-name.rs:32:37 | -LL | let B(A(a, _) | B(a)) | A(a, A(a, _) | B(a)) = B(B(1)); - | ^ used in a pattern more than once +LL | let (B(A(a, _) | B(a)) | A(a, A(a, _) | B(a))) = B(B(1)); + | ^ used in a pattern more than once error[E0416]: identifier `a` is bound more than once in the same pattern - --> $DIR/already-bound-name.rs:32:46 + --> $DIR/already-bound-name.rs:32:47 | -LL | let B(A(a, _) | B(a)) | A(a, A(a, _) | B(a)) = B(B(1)); - | ^ used in a pattern more than once +LL | let (B(A(a, _) | B(a)) | A(a, A(a, _) | B(a))) = B(B(1)); + | ^ used in a pattern more than once error[E0416]: identifier `a` is bound more than once in the same pattern - --> $DIR/already-bound-name.rs:37:36 + --> $DIR/already-bound-name.rs:37:37 | -LL | let B(_) | A(A(a, _) | B(a), A(a, _) | B(a)) = B(B(1)); - | ^ used in a pattern more than once +LL | let (B(_) | A(A(a, _) | B(a), A(a, _) | B(a))) = B(B(1)); + | ^ used in a pattern more than once error[E0416]: identifier `a` is bound more than once in the same pattern - --> $DIR/already-bound-name.rs:37:46 + --> $DIR/already-bound-name.rs:37:47 | -LL | let B(_) | A(A(a, _) | B(a), A(a, _) | B(a)) = B(B(1)); - | ^ used in a pattern more than once +LL | let (B(_) | A(A(a, _) | B(a), A(a, _) | B(a))) = B(B(1)); + | ^ used in a pattern more than once error[E0408]: variable `a` is not bound in all patterns - --> $DIR/already-bound-name.rs:37:9 + --> $DIR/already-bound-name.rs:37:10 | -LL | let B(_) | A(A(a, _) | B(a), A(a, _) | B(a)) = B(B(1)); - | ^^^^ pattern doesn't bind `a` - variable not in all patterns +LL | let (B(_) | A(A(a, _) | B(a), A(a, _) | B(a))) = B(B(1)); + | ^^^^ pattern doesn't bind `a` - variable not in all patterns error[E0416]: identifier `a` is bound more than once in the same pattern - --> $DIR/already-bound-name.rs:42:49 + --> $DIR/already-bound-name.rs:42:50 | -LL | let B(A(a, _) | B(a)) | A(A(a, _) | B(a), A(a, _) | B(a)) = B(B(1)); - | ^ used in a pattern more than once +LL | let (B(A(a, _) | B(a)) | A(A(a, _) | B(a), A(a, _) | B(a))) = B(B(1)); + | ^ used in a pattern more than once error[E0416]: identifier `a` is bound more than once in the same pattern - --> $DIR/already-bound-name.rs:42:59 + --> $DIR/already-bound-name.rs:42:60 | -LL | let B(A(a, _) | B(a)) | A(A(a, _) | B(a), A(a, _) | B(a)) = B(B(1)); - | ^ used in a pattern more than once +LL | let (B(A(a, _) | B(a)) | A(A(a, _) | B(a), A(a, _) | B(a))) = B(B(1)); + | ^ used in a pattern more than once error[E0308]: mismatched types - --> $DIR/already-bound-name.rs:32:31 + --> $DIR/already-bound-name.rs:32:32 | -LL | let B(A(a, _) | B(a)) | A(a, A(a, _) | B(a)) = B(B(1)); - | - ^ ------- this expression has type `E>` - | | | - | | expected integer, found enum `E` - | first introduced with type `{integer}` here +LL | let (B(A(a, _) | B(a)) | A(a, A(a, _) | B(a))) = B(B(1)); + | - ^ ------- this expression has type `E>` + | | | + | | expected integer, found enum `E` + | first introduced with type `{integer}` here | = note: expected type `{integer}` found type `E<{integer}>` diff --git a/src/test/ui/or-patterns/consistent-bindings.rs b/src/test/ui/or-patterns/consistent-bindings.rs index 3ee57978bb..853ddcf241 100644 --- a/src/test/ui/or-patterns/consistent-bindings.rs +++ b/src/test/ui/or-patterns/consistent-bindings.rs @@ -8,9 +8,9 @@ fn main() { // One level: - let Ok(a) | Err(a) = Ok(0); - let Ok(ref a) | Err(ref a) = Ok(0); - let Ok(ref mut a) | Err(ref mut a) = Ok(0); + let (Ok(a) | Err(a)) = Ok(0); + let (Ok(ref a) | Err(ref a)) = Ok(0); + let (Ok(ref mut a) | Err(ref mut a)) = Ok(0); // Two levels: enum Tri { @@ -20,10 +20,10 @@ fn main() { } use Tri::*; - let Ok((V1(a) | V2(a) | V3(a), b)) | Err(Ok((a, b)) | Err((a, b))): Result<_, Result<_, _>> = + let (Ok((V1(a) | V2(a) | V3(a), b)) | Err(Ok((a, b)) | Err((a, b)))): Result<_, Result<_, _>> = Ok((V1(1), 1)); - let Ok((V1(a) | V2(a) | V3(a), ref b)) | Err(Ok((a, ref b)) | Err((a, ref b))): Result< + let (Ok((V1(a) | V2(a) | V3(a), ref b)) | Err(Ok((a, ref b)) | Err((a, ref b)))): Result< _, Result<_, _>, > = Ok((V1(1), 1)); diff --git a/src/test/ui/or-patterns/const-fn.rs b/src/test/ui/or-patterns/const-fn.rs index f4af2f0d2d..55c6f60915 100644 --- a/src/test/ui/or-patterns/const-fn.rs +++ b/src/test/ui/or-patterns/const-fn.rs @@ -3,28 +3,28 @@ const fn foo((Ok(a) | Err(a)): Result) { let x = Ok(3); - let Ok(y) | Err(y) = x; + let (Ok(y) | Err(y)) = x; } const X: () = { let x = Ok(3); - let Ok(y) | Err(y) = x; + let (Ok(y) | Err(y)) = x; }; static Y: () = { let x = Ok(3); - let Ok(y) | Err(y) = x; + let (Ok(y) | Err(y)) = x; }; static mut Z: () = { let x = Ok(3); - let Ok(y) | Err(y) = x; + let (Ok(y) | Err(y)) = x; }; fn main() { let _: [(); { let x = Ok(3); - let Ok(y) | Err(y) = x; + let (Ok(y) | Err(y)) = x; 2 }]; } diff --git a/src/test/ui/or-patterns/exhaustiveness-unreachable-pattern.rs b/src/test/ui/or-patterns/exhaustiveness-unreachable-pattern.rs index 184ffa85c4..bdb7a1ec92 100644 --- a/src/test/ui/or-patterns/exhaustiveness-unreachable-pattern.rs +++ b/src/test/ui/or-patterns/exhaustiveness-unreachable-pattern.rs @@ -48,6 +48,25 @@ fn main() { (1 | 1,) => {} //~ ERROR unreachable _ => {} } + match 0 { + (0 | 1) | 1 => {} //~ ERROR unreachable + _ => {} + } + match 0 { + // We get two errors because recursive or-pattern expansion means we don't notice the two + // errors span a whole pattern. This could be better but doesn't matter much + 0 | (0 | 0) => {} + //~^ ERROR unreachable + //~| ERROR unreachable + _ => {} + } + match None { + // There is only one error that correctly points to the whole subpattern + Some(0) | + Some( //~ ERROR unreachable + 0 | 0) => {} + _ => {} + } match [0; 2] { [0 | 0 //~ ERROR unreachable @@ -84,8 +103,8 @@ fn main() { } macro_rules! t_or_f { () => { - (true // FIXME: should be unreachable - | false) + (true //~ ERROR unreachable + | false) }; } match (true, None) { diff --git a/src/test/ui/or-patterns/exhaustiveness-unreachable-pattern.stderr b/src/test/ui/or-patterns/exhaustiveness-unreachable-pattern.stderr index 8b1003b551..51991fc603 100644 --- a/src/test/ui/or-patterns/exhaustiveness-unreachable-pattern.stderr +++ b/src/test/ui/or-patterns/exhaustiveness-unreachable-pattern.stderr @@ -77,58 +77,94 @@ LL | (1 | 1,) => {} | ^ error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:53:15 + --> $DIR/exhaustiveness-unreachable-pattern.rs:52:19 + | +LL | (0 | 1) | 1 => {} + | ^ + +error: unreachable pattern + --> $DIR/exhaustiveness-unreachable-pattern.rs:58:14 + | +LL | 0 | (0 | 0) => {} + | ^ + +error: unreachable pattern + --> $DIR/exhaustiveness-unreachable-pattern.rs:58:18 + | +LL | 0 | (0 | 0) => {} + | ^ + +error: unreachable pattern + --> $DIR/exhaustiveness-unreachable-pattern.rs:66:13 + | +LL | / Some( +LL | | 0 | 0) => {} + | |______________________^ + +error: unreachable pattern + --> $DIR/exhaustiveness-unreachable-pattern.rs:72:15 | LL | | 0 | ^ error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:55:15 + --> $DIR/exhaustiveness-unreachable-pattern.rs:74:15 | LL | | 0] => {} | ^ error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:63:10 + --> $DIR/exhaustiveness-unreachable-pattern.rs:82:10 | LL | [1 | ^ error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:75:10 + --> $DIR/exhaustiveness-unreachable-pattern.rs:94:10 | LL | [true | ^^^^ error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:82:36 + --> $DIR/exhaustiveness-unreachable-pattern.rs:101:36 | LL | (true | false, None | Some(true | ^^^^ error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:98:14 + --> $DIR/exhaustiveness-unreachable-pattern.rs:106:14 + | +LL | (true + | ^^^^ +... +LL | (true | false, None | Some(t_or_f!())) => {} + | --------- in this macro invocation + | + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error: unreachable pattern + --> $DIR/exhaustiveness-unreachable-pattern.rs:117:14 | LL | Some(0 | ^ error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:117:19 + --> $DIR/exhaustiveness-unreachable-pattern.rs:136:19 | LL | | false) => {} | ^^^^^ error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:125:15 + --> $DIR/exhaustiveness-unreachable-pattern.rs:144:15 | LL | | true) => {} | ^^^^ error: unreachable pattern - --> $DIR/exhaustiveness-unreachable-pattern.rs:131:15 + --> $DIR/exhaustiveness-unreachable-pattern.rs:150:15 | LL | | true, | ^^^^ -error: aborting due to 21 previous errors +error: aborting due to 26 previous errors diff --git a/src/test/ui/or-patterns/feature-gate-or_patterns-leading-let.rs b/src/test/ui/or-patterns/feature-gate-or_patterns-leading-let.rs index a4ea4e25d8..6c592550ec 100644 --- a/src/test/ui/or-patterns/feature-gate-or_patterns-leading-let.rs +++ b/src/test/ui/or-patterns/feature-gate-or_patterns-leading-let.rs @@ -5,4 +5,5 @@ fn main() {} #[cfg(FALSE)] fn gated_leading_vert_in_let() { let | A; //~ ERROR or-patterns syntax is experimental + //~^ ERROR top-level or-patterns are not allowed } diff --git a/src/test/ui/or-patterns/feature-gate-or_patterns-leading-let.stderr b/src/test/ui/or-patterns/feature-gate-or_patterns-leading-let.stderr index 499f60dd54..d556532cd6 100644 --- a/src/test/ui/or-patterns/feature-gate-or_patterns-leading-let.stderr +++ b/src/test/ui/or-patterns/feature-gate-or_patterns-leading-let.stderr @@ -1,3 +1,9 @@ +error: top-level or-patterns are not allowed in `let` bindings + --> $DIR/feature-gate-or_patterns-leading-let.rs:7:9 + | +LL | let | A; + | ^^^ help: remove the `|`: `A` + error[E0658]: or-patterns syntax is experimental --> $DIR/feature-gate-or_patterns-leading-let.rs:7:9 | @@ -7,6 +13,6 @@ LL | let | A; = note: see issue #54883 for more information = help: add `#![feature(or_patterns)]` to the crate attributes to enable -error: aborting due to previous error +error: aborting due to 2 previous errors For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/or-patterns/feature-gate-or_patterns.rs b/src/test/ui/or-patterns/feature-gate-or_patterns.rs index e638838147..8bb45e606b 100644 --- a/src/test/ui/or-patterns/feature-gate-or_patterns.rs +++ b/src/test/ui/or-patterns/feature-gate-or_patterns.rs @@ -26,7 +26,9 @@ fn or_patterns() { // Gated: let | A | B; //~ ERROR or-patterns syntax is experimental + //~^ ERROR top-level or-patterns are not allowed let A | B; //~ ERROR or-patterns syntax is experimental + //~^ ERROR top-level or-patterns are not allowed for | A | B in 0 {} //~ ERROR or-patterns syntax is experimental for A | B in 0 {} //~ ERROR or-patterns syntax is experimental fn fun((A | B): _) {} //~ ERROR or-patterns syntax is experimental diff --git a/src/test/ui/or-patterns/feature-gate-or_patterns.stderr b/src/test/ui/or-patterns/feature-gate-or_patterns.stderr index a9e43a4575..7988af5b94 100644 --- a/src/test/ui/or-patterns/feature-gate-or_patterns.stderr +++ b/src/test/ui/or-patterns/feature-gate-or_patterns.stderr @@ -1,3 +1,15 @@ +error: top-level or-patterns are not allowed in `let` bindings + --> $DIR/feature-gate-or_patterns.rs:28:9 + | +LL | let | A | B; + | ^^^^^^^ help: wrap the pattern in parentheses: `(A | B)` + +error: top-level or-patterns are not allowed in `let` bindings + --> $DIR/feature-gate-or_patterns.rs:30:9 + | +LL | let A | B; + | ^^^^^ help: wrap the pattern in parentheses: `(A | B)` + error[E0658]: or-patterns syntax is experimental --> $DIR/feature-gate-or_patterns.rs:5:14 | @@ -8,16 +20,16 @@ LL | Some(0 | 1 | 2) => {} = help: add `#![feature(or_patterns)]` to the crate attributes to enable error[E0658]: or-patterns syntax is experimental - --> $DIR/feature-gate-or_patterns.rs:28:11 + --> $DIR/feature-gate-or_patterns.rs:28:9 | LL | let | A | B; - | ^^^^^ + | ^^^^^^^ | = note: see issue #54883 for more information = help: add `#![feature(or_patterns)]` to the crate attributes to enable error[E0658]: or-patterns syntax is experimental - --> $DIR/feature-gate-or_patterns.rs:29:9 + --> $DIR/feature-gate-or_patterns.rs:30:9 | LL | let A | B; | ^^^^^ @@ -26,16 +38,16 @@ LL | let A | B; = help: add `#![feature(or_patterns)]` to the crate attributes to enable error[E0658]: or-patterns syntax is experimental - --> $DIR/feature-gate-or_patterns.rs:30:11 + --> $DIR/feature-gate-or_patterns.rs:32:9 | LL | for | A | B in 0 {} - | ^^^^^ + | ^^^^^^^ | = note: see issue #54883 for more information = help: add `#![feature(or_patterns)]` to the crate attributes to enable error[E0658]: or-patterns syntax is experimental - --> $DIR/feature-gate-or_patterns.rs:31:9 + --> $DIR/feature-gate-or_patterns.rs:33:9 | LL | for A | B in 0 {} | ^^^^^ @@ -44,7 +56,7 @@ LL | for A | B in 0 {} = help: add `#![feature(or_patterns)]` to the crate attributes to enable error[E0658]: or-patterns syntax is experimental - --> $DIR/feature-gate-or_patterns.rs:32:13 + --> $DIR/feature-gate-or_patterns.rs:34:13 | LL | fn fun((A | B): _) {} | ^^^^^ @@ -53,7 +65,7 @@ LL | fn fun((A | B): _) {} = help: add `#![feature(or_patterns)]` to the crate attributes to enable error[E0658]: or-patterns syntax is experimental - --> $DIR/feature-gate-or_patterns.rs:33:15 + --> $DIR/feature-gate-or_patterns.rs:35:15 | LL | let _ = |(A | B): u8| (); | ^^^^^ @@ -62,7 +74,7 @@ LL | let _ = |(A | B): u8| (); = help: add `#![feature(or_patterns)]` to the crate attributes to enable error[E0658]: or-patterns syntax is experimental - --> $DIR/feature-gate-or_patterns.rs:34:10 + --> $DIR/feature-gate-or_patterns.rs:36:10 | LL | let (A | B); | ^^^^^ @@ -71,7 +83,7 @@ LL | let (A | B); = help: add `#![feature(or_patterns)]` to the crate attributes to enable error[E0658]: or-patterns syntax is experimental - --> $DIR/feature-gate-or_patterns.rs:35:10 + --> $DIR/feature-gate-or_patterns.rs:37:10 | LL | let (A | B,); | ^^^^^ @@ -80,7 +92,7 @@ LL | let (A | B,); = help: add `#![feature(or_patterns)]` to the crate attributes to enable error[E0658]: or-patterns syntax is experimental - --> $DIR/feature-gate-or_patterns.rs:36:11 + --> $DIR/feature-gate-or_patterns.rs:38:11 | LL | let A(B | C); | ^^^^^ @@ -89,7 +101,7 @@ LL | let A(B | C); = help: add `#![feature(or_patterns)]` to the crate attributes to enable error[E0658]: or-patterns syntax is experimental - --> $DIR/feature-gate-or_patterns.rs:37:14 + --> $DIR/feature-gate-or_patterns.rs:39:14 | LL | let E::V(B | C); | ^^^^^ @@ -98,7 +110,7 @@ LL | let E::V(B | C); = help: add `#![feature(or_patterns)]` to the crate attributes to enable error[E0658]: or-patterns syntax is experimental - --> $DIR/feature-gate-or_patterns.rs:38:17 + --> $DIR/feature-gate-or_patterns.rs:40:17 | LL | let S { f1: B | C, f2 }; | ^^^^^ @@ -107,7 +119,7 @@ LL | let S { f1: B | C, f2 }; = help: add `#![feature(or_patterns)]` to the crate attributes to enable error[E0658]: or-patterns syntax is experimental - --> $DIR/feature-gate-or_patterns.rs:39:20 + --> $DIR/feature-gate-or_patterns.rs:41:20 | LL | let E::V { f1: B | C, f2 }; | ^^^^^ @@ -116,7 +128,7 @@ LL | let E::V { f1: B | C, f2 }; = help: add `#![feature(or_patterns)]` to the crate attributes to enable error[E0658]: or-patterns syntax is experimental - --> $DIR/feature-gate-or_patterns.rs:40:10 + --> $DIR/feature-gate-or_patterns.rs:42:10 | LL | let [A | B]; | ^^^^^ @@ -169,6 +181,6 @@ LL | accept_pat!([p | q]); = note: see issue #54883 for more information = help: add `#![feature(or_patterns)]` to the crate attributes to enable -error: aborting due to 19 previous errors +error: aborting due to 21 previous errors For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/or-patterns/fn-param-wrap-parens.fixed b/src/test/ui/or-patterns/fn-param-wrap-parens.fixed index 08730fe8b0..65e04325e1 100644 --- a/src/test/ui/or-patterns/fn-param-wrap-parens.fixed +++ b/src/test/ui/or-patterns/fn-param-wrap-parens.fixed @@ -11,4 +11,4 @@ enum E { A, B } use E::*; #[cfg(FALSE)] -fn fun1((A | B): E) {} //~ ERROR an or-pattern parameter must be wrapped in parenthesis +fn fun1((A | B): E) {} //~ ERROR top-level or-patterns are not allowed diff --git a/src/test/ui/or-patterns/fn-param-wrap-parens.rs b/src/test/ui/or-patterns/fn-param-wrap-parens.rs index ed667e0e66..aeb4a05ea8 100644 --- a/src/test/ui/or-patterns/fn-param-wrap-parens.rs +++ b/src/test/ui/or-patterns/fn-param-wrap-parens.rs @@ -11,4 +11,4 @@ enum E { A, B } use E::*; #[cfg(FALSE)] -fn fun1(A | B: E) {} //~ ERROR an or-pattern parameter must be wrapped in parenthesis +fn fun1(A | B: E) {} //~ ERROR top-level or-patterns are not allowed diff --git a/src/test/ui/or-patterns/fn-param-wrap-parens.stderr b/src/test/ui/or-patterns/fn-param-wrap-parens.stderr index 2c6e4d9838..96193c17ae 100644 --- a/src/test/ui/or-patterns/fn-param-wrap-parens.stderr +++ b/src/test/ui/or-patterns/fn-param-wrap-parens.stderr @@ -1,8 +1,8 @@ -error: an or-pattern parameter must be wrapped in parenthesis +error: top-level or-patterns are not allowed in function parameters --> $DIR/fn-param-wrap-parens.rs:14:9 | LL | fn fun1(A | B: E) {} - | ^^^^^ help: wrap the pattern in parenthesis: `(A | B)` + | ^^^^^ help: wrap the pattern in parentheses: `(A | B)` error: aborting due to previous error diff --git a/src/test/ui/or-patterns/inconsistent-modes.rs b/src/test/ui/or-patterns/inconsistent-modes.rs index fd5cb01ab4..2300e9f9f3 100644 --- a/src/test/ui/or-patterns/inconsistent-modes.rs +++ b/src/test/ui/or-patterns/inconsistent-modes.rs @@ -4,23 +4,23 @@ #![allow(non_camel_case_types)] fn main() { // One level: - let Ok(a) | Err(ref a): Result<&u8, u8> = Ok(&0); + let (Ok(a) | Err(ref a)): Result<&u8, u8> = Ok(&0); //~^ ERROR variable `a` is bound inconsistently - let Ok(ref mut a) | Err(a): Result = Ok(0); + let (Ok(ref mut a) | Err(a)): Result = Ok(0); //~^ ERROR variable `a` is bound inconsistently - let Ok(ref a) | Err(ref mut a): Result<&u8, &mut u8> = Ok(&0); + let (Ok(ref a) | Err(ref mut a)): Result<&u8, &mut u8> = Ok(&0); //~^ ERROR variable `a` is bound inconsistently //~| ERROR mismatched types - let Ok((ref a, b)) | Err((ref mut a, ref b)) = Ok((0, &0)); + let (Ok((ref a, b)) | Err((ref mut a, ref b))) = Ok((0, &0)); //~^ ERROR variable `a` is bound inconsistently //~| ERROR variable `b` is bound inconsistently //~| ERROR mismatched types // Two levels: - let Ok(Ok(a) | Err(a)) | Err(ref a) = Err(0); + let (Ok(Ok(a) | Err(a)) | Err(ref a)) = Err(0); //~^ ERROR variable `a` is bound inconsistently // Three levels: - let Ok([Ok((Ok(ref a) | Err(a),)) | Err(a)]) | Err(a) = Err(&1); + let (Ok([Ok((Ok(ref a) | Err(a),)) | Err(a)]) | Err(a)) = Err(&1); //~^ ERROR variable `a` is bound inconsistently } diff --git a/src/test/ui/or-patterns/inconsistent-modes.stderr b/src/test/ui/or-patterns/inconsistent-modes.stderr index c5dcef36e0..99791431ea 100644 --- a/src/test/ui/or-patterns/inconsistent-modes.stderr +++ b/src/test/ui/or-patterns/inconsistent-modes.stderr @@ -1,74 +1,74 @@ error[E0409]: variable `a` is bound inconsistently across alternatives separated by `|` - --> $DIR/inconsistent-modes.rs:7:25 + --> $DIR/inconsistent-modes.rs:7:26 | -LL | let Ok(a) | Err(ref a): Result<&u8, u8> = Ok(&0); - | - ^ bound in different ways - | | - | first binding +LL | let (Ok(a) | Err(ref a)): Result<&u8, u8> = Ok(&0); + | - ^ bound in different ways + | | + | first binding error[E0409]: variable `a` is bound inconsistently across alternatives separated by `|` - --> $DIR/inconsistent-modes.rs:9:29 + --> $DIR/inconsistent-modes.rs:9:30 | -LL | let Ok(ref mut a) | Err(a): Result = Ok(0); - | - ^ bound in different ways - | | - | first binding +LL | let (Ok(ref mut a) | Err(a)): Result = Ok(0); + | - ^ bound in different ways + | | + | first binding error[E0409]: variable `a` is bound inconsistently across alternatives separated by `|` - --> $DIR/inconsistent-modes.rs:11:33 + --> $DIR/inconsistent-modes.rs:11:34 | -LL | let Ok(ref a) | Err(ref mut a): Result<&u8, &mut u8> = Ok(&0); - | - first binding ^ bound in different ways +LL | let (Ok(ref a) | Err(ref mut a)): Result<&u8, &mut u8> = Ok(&0); + | - first binding ^ bound in different ways error[E0409]: variable `a` is bound inconsistently across alternatives separated by `|` - --> $DIR/inconsistent-modes.rs:14:39 + --> $DIR/inconsistent-modes.rs:14:40 | -LL | let Ok((ref a, b)) | Err((ref mut a, ref b)) = Ok((0, &0)); - | - first binding ^ bound in different ways +LL | let (Ok((ref a, b)) | Err((ref mut a, ref b))) = Ok((0, &0)); + | - first binding ^ bound in different ways error[E0409]: variable `b` is bound inconsistently across alternatives separated by `|` - --> $DIR/inconsistent-modes.rs:14:46 + --> $DIR/inconsistent-modes.rs:14:47 | -LL | let Ok((ref a, b)) | Err((ref mut a, ref b)) = Ok((0, &0)); - | - first binding ^ bound in different ways +LL | let (Ok((ref a, b)) | Err((ref mut a, ref b))) = Ok((0, &0)); + | - first binding ^ bound in different ways error[E0409]: variable `a` is bound inconsistently across alternatives separated by `|` - --> $DIR/inconsistent-modes.rs:20:38 + --> $DIR/inconsistent-modes.rs:20:39 | -LL | let Ok(Ok(a) | Err(a)) | Err(ref a) = Err(0); - | - ^ bound in different ways - | | - | first binding +LL | let (Ok(Ok(a) | Err(a)) | Err(ref a)) = Err(0); + | - ^ bound in different ways + | | + | first binding error[E0409]: variable `a` is bound inconsistently across alternatives separated by `|` - --> $DIR/inconsistent-modes.rs:24:33 + --> $DIR/inconsistent-modes.rs:24:34 | -LL | let Ok([Ok((Ok(ref a) | Err(a),)) | Err(a)]) | Err(a) = Err(&1); - | - ^ bound in different ways - | | - | first binding +LL | let (Ok([Ok((Ok(ref a) | Err(a),)) | Err(a)]) | Err(a)) = Err(&1); + | - ^ bound in different ways + | | + | first binding error[E0308]: mismatched types - --> $DIR/inconsistent-modes.rs:11:25 + --> $DIR/inconsistent-modes.rs:11:26 | -LL | let Ok(ref a) | Err(ref mut a): Result<&u8, &mut u8> = Ok(&0); - | ----- ^^^^^^^^^ -------------------- expected due to this - | | | - | | types differ in mutability - | first introduced with type `&&u8` here +LL | let (Ok(ref a) | Err(ref mut a)): Result<&u8, &mut u8> = Ok(&0); + | ----- ^^^^^^^^^ -------------------- expected due to this + | | | + | | types differ in mutability + | first introduced with type `&&u8` here | = note: expected type `&&u8` found type `&mut &mut u8` = note: a binding must have the same type in all alternatives error[E0308]: mismatched types - --> $DIR/inconsistent-modes.rs:14:31 + --> $DIR/inconsistent-modes.rs:14:32 | -LL | let Ok((ref a, b)) | Err((ref mut a, ref b)) = Ok((0, &0)); - | ----- ^^^^^^^^^ ----------- this expression has type `std::result::Result<({integer}, &{integer}), (_, _)>` - | | | - | | types differ in mutability - | first introduced with type `&{integer}` here +LL | let (Ok((ref a, b)) | Err((ref mut a, ref b))) = Ok((0, &0)); + | ----- ^^^^^^^^^ ----------- this expression has type `Result<({integer}, &{integer}), (_, _)>` + | | | + | | types differ in mutability + | first introduced with type `&{integer}` here | = note: expected type `&{integer}` found type `&mut _` diff --git a/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.rs b/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.rs index 59533cefea..8e83acc6dc 100644 --- a/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.rs +++ b/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.rs @@ -1,7 +1,7 @@ #![feature(or_patterns)] fn main() { - let 0 | (1 | 2) = 0; //~ ERROR refutable pattern in local binding + let (0 | (1 | 2)) = 0; //~ ERROR refutable pattern in local binding match 0 { //~^ ERROR non-exhaustive patterns 0 | (1 | 2) => {} diff --git a/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.stderr b/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.stderr index 2acf1f41c6..9ed942d9e0 100644 --- a/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.stderr +++ b/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier-non-exhaustive.stderr @@ -1,16 +1,16 @@ error[E0005]: refutable pattern in local binding: `i32::MIN..=-1_i32` and `3_i32..=i32::MAX` not covered - --> $DIR/issue-69875-should-have-been-expanded-earlier-non-exhaustive.rs:4:9 + --> $DIR/issue-69875-should-have-been-expanded-earlier-non-exhaustive.rs:4:10 | -LL | let 0 | (1 | 2) = 0; - | ^^^^^^^^^^^ patterns `i32::MIN..=-1_i32` and `3_i32..=i32::MAX` not covered +LL | let (0 | (1 | 2)) = 0; + | ^^^^^^^^^^^ patterns `i32::MIN..=-1_i32` and `3_i32..=i32::MAX` not covered | = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html = note: the matched value is of type `i32` help: you might want to use `if let` to ignore the variant that isn't matched | -LL | if let 0 | (1 | 2) = 0 { /* */ } - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | if let (0 | (1 | 2)) = 0 { /* */ } + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0004]: non-exhaustive patterns: `i32::MIN..=-1_i32` and `3_i32..=i32::MAX` not covered --> $DIR/issue-69875-should-have-been-expanded-earlier-non-exhaustive.rs:5:11 diff --git a/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier.rs b/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier.rs index 1de563dedb..2f080ebf78 100644 --- a/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier.rs +++ b/src/test/ui/or-patterns/issue-69875-should-have-been-expanded-earlier.rs @@ -3,7 +3,7 @@ #![feature(or_patterns)] fn main() { - let 0 | (1 | _) = 0; + let (0 | (1 | _)) = 0; if let 0 | (1 | 2) = 0 {} if let x @ 0 | x @ (1 | 2) = 0 {} } diff --git a/src/test/ui/or-patterns/let-pattern.rs b/src/test/ui/or-patterns/let-pattern.rs index 07e37412ce..7f22aa9d9f 100644 --- a/src/test/ui/or-patterns/let-pattern.rs +++ b/src/test/ui/or-patterns/let-pattern.rs @@ -3,7 +3,7 @@ // run-pass fn or_pat_let(x: Result) -> u32 { - let Ok(y) | Err(y) = x; + let (Ok(y) | Err(y)) = x; y } diff --git a/src/test/ui/or-patterns/mismatched-bindings-async-fn.rs b/src/test/ui/or-patterns/mismatched-bindings-async-fn.rs index 5c5c68f81d..cf98a47210 100644 --- a/src/test/ui/or-patterns/mismatched-bindings-async-fn.rs +++ b/src/test/ui/or-patterns/mismatched-bindings-async-fn.rs @@ -8,7 +8,7 @@ async fn a((x | s): String) {} //~| ERROR variable `s` is not bound in all patterns async fn b() { - let x | s = String::new(); + let (x | s) = String::new(); //~^ ERROR variable `x` is not bound in all patterns //~| ERROR variable `s` is not bound in all patterns } diff --git a/src/test/ui/or-patterns/mismatched-bindings-async-fn.stderr b/src/test/ui/or-patterns/mismatched-bindings-async-fn.stderr index 998577cf4b..d5c77ee39c 100644 --- a/src/test/ui/or-patterns/mismatched-bindings-async-fn.stderr +++ b/src/test/ui/or-patterns/mismatched-bindings-async-fn.stderr @@ -15,20 +15,20 @@ LL | async fn a((x | s): String) {} | variable not in all patterns error[E0408]: variable `s` is not bound in all patterns - --> $DIR/mismatched-bindings-async-fn.rs:11:9 + --> $DIR/mismatched-bindings-async-fn.rs:11:10 | -LL | let x | s = String::new(); - | ^ - variable not in all patterns - | | - | pattern doesn't bind `s` +LL | let (x | s) = String::new(); + | ^ - variable not in all patterns + | | + | pattern doesn't bind `s` error[E0408]: variable `x` is not bound in all patterns - --> $DIR/mismatched-bindings-async-fn.rs:11:13 + --> $DIR/mismatched-bindings-async-fn.rs:11:14 | -LL | let x | s = String::new(); - | - ^ pattern doesn't bind `x` - | | - | variable not in all patterns +LL | let (x | s) = String::new(); + | - ^ pattern doesn't bind `x` + | | + | variable not in all patterns error: aborting due to 4 previous errors diff --git a/src/test/ui/or-patterns/missing-bindings.rs b/src/test/ui/or-patterns/missing-bindings.rs index 67cf52fa8c..5dd1f16b65 100644 --- a/src/test/ui/or-patterns/missing-bindings.rs +++ b/src/test/ui/or-patterns/missing-bindings.rs @@ -17,7 +17,7 @@ fn check_handling_of_paths() { } use bar::foo::{alpha, charlie}; - let alpha | beta | charlie = alpha; //~ ERROR variable `beta` is not bound in all patterns + let (alpha | beta | charlie) = alpha; //~ ERROR variable `beta` is not bound in all patterns match Some(alpha) { Some(alpha | beta) => {} //~ ERROR variable `beta` is not bound in all patterns } @@ -31,19 +31,19 @@ fn check_misc_nesting() { // One level: const X: E = B(0); - let A(a, _) | _ = X; //~ ERROR variable `a` is not bound in all patterns - let _ | B(a) = X; //~ ERROR variable `a` is not bound in all patterns - let A(..) | B(a) = X; //~ ERROR variable `a` is not bound in all patterns - let A(a, _) | B(_) = X; //~ ERROR variable `a` is not bound in all patterns - let A(_, a) | B(_) = X; //~ ERROR variable `a` is not bound in all patterns - let A(a, b) | B(a) = X; //~ ERROR variable `b` is not bound in all patterns + let (A(a, _) | _) = X; //~ ERROR variable `a` is not bound in all patterns + let (_ | B(a)) = X; //~ ERROR variable `a` is not bound in all patterns + let (A(..) | B(a)) = X; //~ ERROR variable `a` is not bound in all patterns + let (A(a, _) | B(_)) = X; //~ ERROR variable `a` is not bound in all patterns + let (A(_, a) | B(_)) = X; //~ ERROR variable `a` is not bound in all patterns + let (A(a, b) | B(a)) = X; //~ ERROR variable `b` is not bound in all patterns // Two levels: const Y: E> = B(B(0)); - let A(A(..) | B(_), _) | B(a) = Y; //~ ERROR variable `a` is not bound in all patterns - let A(A(..) | B(a), _) | B(A(a, _) | B(a)) = Y; + let (A(A(..) | B(_), _) | B(a)) = Y; //~ ERROR variable `a` is not bound in all patterns + let (A(A(..) | B(a), _) | B(A(a, _) | B(a))) = Y; //~^ ERROR variable `a` is not bound in all patterns - let A(A(a, b) | B(c), d) | B(e) = Y; + let (A(A(a, b) | B(c), d) | B(e)) = Y; //~^ ERROR variable `a` is not bound in all patterns //~| ERROR variable `a` is not bound in all patterns //~| ERROR variable `b` is not bound in all patterns diff --git a/src/test/ui/or-patterns/missing-bindings.stderr b/src/test/ui/or-patterns/missing-bindings.stderr index 57270e4412..4702bc6bbf 100644 --- a/src/test/ui/or-patterns/missing-bindings.stderr +++ b/src/test/ui/or-patterns/missing-bindings.stderr @@ -1,11 +1,11 @@ error[E0408]: variable `beta` is not bound in all patterns - --> $DIR/missing-bindings.rs:20:9 + --> $DIR/missing-bindings.rs:20:10 | -LL | let alpha | beta | charlie = alpha; - | ^^^^^ ---- ^^^^^^^ pattern doesn't bind `beta` - | | | - | | variable not in all patterns - | pattern doesn't bind `beta` +LL | let (alpha | beta | charlie) = alpha; + | ^^^^^ ---- ^^^^^^^ pattern doesn't bind `beta` + | | | + | | variable not in all patterns + | pattern doesn't bind `beta` error[E0408]: variable `beta` is not bound in all patterns --> $DIR/missing-bindings.rs:22:14 @@ -16,132 +16,132 @@ LL | Some(alpha | beta) => {} | pattern doesn't bind `beta` error[E0408]: variable `a` is not bound in all patterns - --> $DIR/missing-bindings.rs:34:19 + --> $DIR/missing-bindings.rs:34:20 | -LL | let A(a, _) | _ = X; - | - ^ pattern doesn't bind `a` - | | - | variable not in all patterns +LL | let (A(a, _) | _) = X; + | - ^ pattern doesn't bind `a` + | | + | variable not in all patterns error[E0408]: variable `a` is not bound in all patterns - --> $DIR/missing-bindings.rs:35:9 + --> $DIR/missing-bindings.rs:35:10 | -LL | let _ | B(a) = X; - | ^ - variable not in all patterns - | | - | pattern doesn't bind `a` +LL | let (_ | B(a)) = X; + | ^ - variable not in all patterns + | | + | pattern doesn't bind `a` error[E0408]: variable `a` is not bound in all patterns - --> $DIR/missing-bindings.rs:36:9 + --> $DIR/missing-bindings.rs:36:10 | -LL | let A(..) | B(a) = X; - | ^^^^^ - variable not in all patterns - | | - | pattern doesn't bind `a` +LL | let (A(..) | B(a)) = X; + | ^^^^^ - variable not in all patterns + | | + | pattern doesn't bind `a` error[E0408]: variable `a` is not bound in all patterns - --> $DIR/missing-bindings.rs:37:19 + --> $DIR/missing-bindings.rs:37:20 | -LL | let A(a, _) | B(_) = X; - | - ^^^^ pattern doesn't bind `a` - | | - | variable not in all patterns +LL | let (A(a, _) | B(_)) = X; + | - ^^^^ pattern doesn't bind `a` + | | + | variable not in all patterns error[E0408]: variable `a` is not bound in all patterns - --> $DIR/missing-bindings.rs:38:19 + --> $DIR/missing-bindings.rs:38:20 | -LL | let A(_, a) | B(_) = X; - | - ^^^^ pattern doesn't bind `a` - | | - | variable not in all patterns +LL | let (A(_, a) | B(_)) = X; + | - ^^^^ pattern doesn't bind `a` + | | + | variable not in all patterns error[E0408]: variable `b` is not bound in all patterns - --> $DIR/missing-bindings.rs:39:19 + --> $DIR/missing-bindings.rs:39:20 | -LL | let A(a, b) | B(a) = X; - | - ^^^^ pattern doesn't bind `b` - | | - | variable not in all patterns +LL | let (A(a, b) | B(a)) = X; + | - ^^^^ pattern doesn't bind `b` + | | + | variable not in all patterns error[E0408]: variable `a` is not bound in all patterns - --> $DIR/missing-bindings.rs:43:9 + --> $DIR/missing-bindings.rs:43:10 | -LL | let A(A(..) | B(_), _) | B(a) = Y; - | ^^^^^^^^^^^^^^^^^^ - variable not in all patterns - | | - | pattern doesn't bind `a` +LL | let (A(A(..) | B(_), _) | B(a)) = Y; + | ^^^^^^^^^^^^^^^^^^ - variable not in all patterns + | | + | pattern doesn't bind `a` error[E0408]: variable `a` is not bound in all patterns - --> $DIR/missing-bindings.rs:44:11 + --> $DIR/missing-bindings.rs:44:12 | -LL | let A(A(..) | B(a), _) | B(A(a, _) | B(a)) = Y; - | ^^^^^ - variable not in all patterns - | | - | pattern doesn't bind `a` +LL | let (A(A(..) | B(a), _) | B(A(a, _) | B(a))) = Y; + | ^^^^^ - variable not in all patterns + | | + | pattern doesn't bind `a` error[E0408]: variable `a` is not bound in all patterns - --> $DIR/missing-bindings.rs:46:21 + --> $DIR/missing-bindings.rs:46:22 | -LL | let A(A(a, b) | B(c), d) | B(e) = Y; - | - ^^^^ pattern doesn't bind `a` - | | - | variable not in all patterns +LL | let (A(A(a, b) | B(c), d) | B(e)) = Y; + | - ^^^^ pattern doesn't bind `a` + | | + | variable not in all patterns error[E0408]: variable `b` is not bound in all patterns - --> $DIR/missing-bindings.rs:46:21 + --> $DIR/missing-bindings.rs:46:22 | -LL | let A(A(a, b) | B(c), d) | B(e) = Y; - | - ^^^^ pattern doesn't bind `b` - | | - | variable not in all patterns +LL | let (A(A(a, b) | B(c), d) | B(e)) = Y; + | - ^^^^ pattern doesn't bind `b` + | | + | variable not in all patterns error[E0408]: variable `c` is not bound in all patterns - --> $DIR/missing-bindings.rs:46:11 + --> $DIR/missing-bindings.rs:46:12 | -LL | let A(A(a, b) | B(c), d) | B(e) = Y; - | ^^^^^^^ - variable not in all patterns - | | - | pattern doesn't bind `c` +LL | let (A(A(a, b) | B(c), d) | B(e)) = Y; + | ^^^^^^^ - variable not in all patterns + | | + | pattern doesn't bind `c` error[E0408]: variable `a` is not bound in all patterns - --> $DIR/missing-bindings.rs:46:32 + --> $DIR/missing-bindings.rs:46:33 | -LL | let A(A(a, b) | B(c), d) | B(e) = Y; - | - ^^^^ pattern doesn't bind `a` - | | - | variable not in all patterns +LL | let (A(A(a, b) | B(c), d) | B(e)) = Y; + | - ^^^^ pattern doesn't bind `a` + | | + | variable not in all patterns error[E0408]: variable `b` is not bound in all patterns - --> $DIR/missing-bindings.rs:46:32 + --> $DIR/missing-bindings.rs:46:33 | -LL | let A(A(a, b) | B(c), d) | B(e) = Y; - | - ^^^^ pattern doesn't bind `b` - | | - | variable not in all patterns +LL | let (A(A(a, b) | B(c), d) | B(e)) = Y; + | - ^^^^ pattern doesn't bind `b` + | | + | variable not in all patterns error[E0408]: variable `c` is not bound in all patterns - --> $DIR/missing-bindings.rs:46:32 + --> $DIR/missing-bindings.rs:46:33 | -LL | let A(A(a, b) | B(c), d) | B(e) = Y; - | - ^^^^ pattern doesn't bind `c` - | | - | variable not in all patterns +LL | let (A(A(a, b) | B(c), d) | B(e)) = Y; + | - ^^^^ pattern doesn't bind `c` + | | + | variable not in all patterns error[E0408]: variable `d` is not bound in all patterns - --> $DIR/missing-bindings.rs:46:32 + --> $DIR/missing-bindings.rs:46:33 | -LL | let A(A(a, b) | B(c), d) | B(e) = Y; - | - ^^^^ pattern doesn't bind `d` - | | - | variable not in all patterns +LL | let (A(A(a, b) | B(c), d) | B(e)) = Y; + | - ^^^^ pattern doesn't bind `d` + | | + | variable not in all patterns error[E0408]: variable `e` is not bound in all patterns - --> $DIR/missing-bindings.rs:46:9 + --> $DIR/missing-bindings.rs:46:10 | -LL | let A(A(a, b) | B(c), d) | B(e) = Y; - | ^^^^^^^^^^^^^^^^^^^^ - variable not in all patterns - | | - | pattern doesn't bind `e` +LL | let (A(A(a, b) | B(c), d) | B(e)) = Y; + | ^^^^^^^^^^^^^^^^^^^^ - variable not in all patterns + | | + | pattern doesn't bind `e` error[E0408]: variable `a` is not bound in all patterns --> $DIR/missing-bindings.rs:62:29 diff --git a/src/test/ui/or-patterns/multiple-pattern-typo.rs b/src/test/ui/or-patterns/multiple-pattern-typo.rs index 702c957374..4d06101044 100644 --- a/src/test/ui/or-patterns/multiple-pattern-typo.rs +++ b/src/test/ui/or-patterns/multiple-pattern-typo.rs @@ -4,41 +4,41 @@ fn main() { let x = 3; match x { - 1 | 2 || 3 => (), //~ ERROR unexpected token `||` after pattern + 1 | 2 || 3 => (), //~ ERROR unexpected token `||` in pattern _ => (), } match x { - (1 | 2 || 3) => (), //~ ERROR unexpected token `||` after pattern + (1 | 2 || 3) => (), //~ ERROR unexpected token `||` in pattern _ => (), } match (x,) { - (1 | 2 || 3,) => (), //~ ERROR unexpected token `||` after pattern + (1 | 2 || 3,) => (), //~ ERROR unexpected token `||` in pattern _ => (), } struct TS(u8); match TS(x) { - TS(1 | 2 || 3) => (), //~ ERROR unexpected token `||` after pattern + TS(1 | 2 || 3) => (), //~ ERROR unexpected token `||` in pattern _ => (), } struct NS { f: u8 } match (NS { f: x }) { - NS { f: 1 | 2 || 3 } => (), //~ ERROR unexpected token `||` after pattern + NS { f: 1 | 2 || 3 } => (), //~ ERROR unexpected token `||` in pattern _ => (), } match [x] { - [1 | 2 || 3] => (), //~ ERROR unexpected token `||` after pattern + [1 | 2 || 3] => (), //~ ERROR unexpected token `||` in pattern _ => (), } match x { - || 1 | 2 | 3 => (), //~ ERROR unexpected token `||` after pattern + || 1 | 2 | 3 => (), //~ ERROR unexpected token `||` in pattern _ => (), } } diff --git a/src/test/ui/or-patterns/multiple-pattern-typo.stderr b/src/test/ui/or-patterns/multiple-pattern-typo.stderr index cb32068ec0..b0a82b3673 100644 --- a/src/test/ui/or-patterns/multiple-pattern-typo.stderr +++ b/src/test/ui/or-patterns/multiple-pattern-typo.stderr @@ -1,4 +1,4 @@ -error: unexpected token `||` after pattern +error: unexpected token `||` in pattern --> $DIR/multiple-pattern-typo.rs:7:15 | LL | 1 | 2 || 3 => (), @@ -6,7 +6,7 @@ LL | 1 | 2 || 3 => (), | | | while parsing this or-pattern starting here -error: unexpected token `||` after pattern +error: unexpected token `||` in pattern --> $DIR/multiple-pattern-typo.rs:12:16 | LL | (1 | 2 || 3) => (), @@ -14,7 +14,7 @@ LL | (1 | 2 || 3) => (), | | | while parsing this or-pattern starting here -error: unexpected token `||` after pattern +error: unexpected token `||` in pattern --> $DIR/multiple-pattern-typo.rs:17:16 | LL | (1 | 2 || 3,) => (), @@ -22,7 +22,7 @@ LL | (1 | 2 || 3,) => (), | | | while parsing this or-pattern starting here -error: unexpected token `||` after pattern +error: unexpected token `||` in pattern --> $DIR/multiple-pattern-typo.rs:24:18 | LL | TS(1 | 2 || 3) => (), @@ -30,7 +30,7 @@ LL | TS(1 | 2 || 3) => (), | | | while parsing this or-pattern starting here -error: unexpected token `||` after pattern +error: unexpected token `||` in pattern --> $DIR/multiple-pattern-typo.rs:31:23 | LL | NS { f: 1 | 2 || 3 } => (), @@ -38,7 +38,7 @@ LL | NS { f: 1 | 2 || 3 } => (), | | | while parsing this or-pattern starting here -error: unexpected token `||` after pattern +error: unexpected token `||` in pattern --> $DIR/multiple-pattern-typo.rs:36:16 | LL | [1 | 2 || 3] => (), @@ -46,7 +46,7 @@ LL | [1 | 2 || 3] => (), | | | while parsing this or-pattern starting here -error: unexpected token `||` after pattern +error: unexpected token `||` in pattern --> $DIR/multiple-pattern-typo.rs:41:9 | LL | || 1 | 2 | 3 => (), diff --git a/src/test/ui/or-patterns/nested-undelimited-precedence.rs b/src/test/ui/or-patterns/nested-undelimited-precedence.rs new file mode 100644 index 0000000000..208662b1c4 --- /dev/null +++ b/src/test/ui/or-patterns/nested-undelimited-precedence.rs @@ -0,0 +1,46 @@ +// This test tests the precedence of `|` (or-patterns) undelimited nested patterns. In particular, +// we want to reserve the syntactic space of a pattern followed by a type annotation for possible +// future type ascription, so we need to make sure that any time a pattern is followed by type +// annotation (for now), the pattern is not a top-level or-pattern. However, there are also a few +// types of patterns that allow undelimited subpatterns that could cause the same ambiguity. +// Currently, those should be impossible due to precedence rule. This test enforces that. + +#![feature(or_patterns)] + +enum E { + A, + B, +} + +fn foo() { + use E::*; + + // ok + let b @ (A | B): E = A; + + let b @ A | B: E = A; //~ERROR `b` is not bound in all patterns + //~^ ERROR top-level or-patterns are not allowed +} + +enum F { + A(usize), + B(usize), +} + +fn bar() { + use F::*; + + // ok + let (A(x) | B(x)): F = A(3); + + let &A(_) | B(_): F = A(3); //~ERROR mismatched types + //~^ ERROR top-level or-patterns are not allowed + let &&A(_) | B(_): F = A(3); //~ERROR mismatched types + //~^ ERROR top-level or-patterns are not allowed + let &mut A(_) | B(_): F = A(3); //~ERROR mismatched types + //~^ ERROR top-level or-patterns are not allowed + let &&mut A(_) | B(_): F = A(3); //~ERROR mismatched types + //~^ ERROR top-level or-patterns are not allowed +} + +fn main() {} diff --git a/src/test/ui/or-patterns/nested-undelimited-precedence.stderr b/src/test/ui/or-patterns/nested-undelimited-precedence.stderr new file mode 100644 index 0000000000..1d78d5193c --- /dev/null +++ b/src/test/ui/or-patterns/nested-undelimited-precedence.stderr @@ -0,0 +1,86 @@ +error: top-level or-patterns are not allowed in `let` bindings + --> $DIR/nested-undelimited-precedence.rs:21:9 + | +LL | let b @ A | B: E = A; + | ^^^^^^^^^ help: wrap the pattern in parentheses: `(b @ A | B)` + +error: top-level or-patterns are not allowed in `let` bindings + --> $DIR/nested-undelimited-precedence.rs:36:9 + | +LL | let &A(_) | B(_): F = A(3); + | ^^^^^^^^^^^^ help: wrap the pattern in parentheses: `(&A(_) | B(_))` + +error: top-level or-patterns are not allowed in `let` bindings + --> $DIR/nested-undelimited-precedence.rs:38:9 + | +LL | let &&A(_) | B(_): F = A(3); + | ^^^^^^^^^^^^^ help: wrap the pattern in parentheses: `(&&A(_) | B(_))` + +error: top-level or-patterns are not allowed in `let` bindings + --> $DIR/nested-undelimited-precedence.rs:40:9 + | +LL | let &mut A(_) | B(_): F = A(3); + | ^^^^^^^^^^^^^^^^ help: wrap the pattern in parentheses: `(&mut A(_) | B(_))` + +error: top-level or-patterns are not allowed in `let` bindings + --> $DIR/nested-undelimited-precedence.rs:42:9 + | +LL | let &&mut A(_) | B(_): F = A(3); + | ^^^^^^^^^^^^^^^^^ help: wrap the pattern in parentheses: `(&&mut A(_) | B(_))` + +error[E0408]: variable `b` is not bound in all patterns + --> $DIR/nested-undelimited-precedence.rs:21:17 + | +LL | let b @ A | B: E = A; + | - ^ pattern doesn't bind `b` + | | + | variable not in all patterns + +error[E0308]: mismatched types + --> $DIR/nested-undelimited-precedence.rs:36:9 + | +LL | let &A(_) | B(_): F = A(3); + | ^^^^^ - expected due to this + | | + | expected enum `F`, found reference + | + = note: expected enum `F` + found reference `&_` + +error[E0308]: mismatched types + --> $DIR/nested-undelimited-precedence.rs:38:9 + | +LL | let &&A(_) | B(_): F = A(3); + | ^^^^^^ - expected due to this + | | + | expected enum `F`, found reference + | + = note: expected enum `F` + found reference `&_` + +error[E0308]: mismatched types + --> $DIR/nested-undelimited-precedence.rs:40:9 + | +LL | let &mut A(_) | B(_): F = A(3); + | ^^^^^^^^^ - expected due to this + | | + | expected enum `F`, found `&mut _` + | + = note: expected enum `F` + found mutable reference `&mut _` + +error[E0308]: mismatched types + --> $DIR/nested-undelimited-precedence.rs:42:9 + | +LL | let &&mut A(_) | B(_): F = A(3); + | ^^^^^^^^^^ - expected due to this + | | + | expected enum `F`, found reference + | + = note: expected enum `F` + found reference `&_` + +error: aborting due to 10 previous errors + +Some errors have detailed explanations: E0308, E0408. +For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/or-patterns/or-patterns-binding-type-mismatch.rs b/src/test/ui/or-patterns/or-patterns-binding-type-mismatch.rs index 5ec7dc6962..11c8a7b69f 100644 --- a/src/test/ui/or-patterns/or-patterns-binding-type-mismatch.rs +++ b/src/test/ui/or-patterns/or-patterns-binding-type-mismatch.rs @@ -52,10 +52,10 @@ fn main() { = Some((0u8, Some((1u16, 2u32)))) {} - let Blah::A(_, x, y) | Blah::B(x, y) = Blah::A(1, 1, 2); + let (Blah::A(_, x, y) | Blah::B(x, y)) = Blah::A(1, 1, 2); //~^ ERROR mismatched types - let (x, y) | (y, x) = (0u8, 1u16); + let ((x, y) | (y, x)) = (0u8, 1u16); //~^ ERROR mismatched types //~| ERROR mismatched types diff --git a/src/test/ui/or-patterns/or-patterns-binding-type-mismatch.stderr b/src/test/ui/or-patterns/or-patterns-binding-type-mismatch.stderr index 00dba053a5..26e14b539d 100644 --- a/src/test/ui/or-patterns/or-patterns-binding-type-mismatch.stderr +++ b/src/test/ui/or-patterns/or-patterns-binding-type-mismatch.stderr @@ -187,35 +187,35 @@ LL | = Some((0u8, Some((1u16, 2u32)))) = note: a binding must have the same type in all alternatives error[E0308]: mismatched types - --> $DIR/or-patterns-binding-type-mismatch.rs:55:39 + --> $DIR/or-patterns-binding-type-mismatch.rs:55:40 | -LL | let Blah::A(_, x, y) | Blah::B(x, y) = Blah::A(1, 1, 2); - | - ^ ---------------- this expression has type `Blah` - | | | - | | expected `usize`, found `isize` - | first introduced with type `usize` here +LL | let (Blah::A(_, x, y) | Blah::B(x, y)) = Blah::A(1, 1, 2); + | - ^ ---------------- this expression has type `Blah` + | | | + | | expected `usize`, found `isize` + | first introduced with type `usize` here | = note: a binding must have the same type in all alternatives error[E0308]: mismatched types - --> $DIR/or-patterns-binding-type-mismatch.rs:58:19 + --> $DIR/or-patterns-binding-type-mismatch.rs:58:20 | -LL | let (x, y) | (y, x) = (0u8, 1u16); - | - ^ ----------- this expression has type `(u8, u16)` - | | | - | | expected `u16`, found `u8` - | first introduced with type `u16` here +LL | let ((x, y) | (y, x)) = (0u8, 1u16); + | - ^ ----------- this expression has type `(u8, u16)` + | | | + | | expected `u16`, found `u8` + | first introduced with type `u16` here | = note: a binding must have the same type in all alternatives error[E0308]: mismatched types - --> $DIR/or-patterns-binding-type-mismatch.rs:58:22 + --> $DIR/or-patterns-binding-type-mismatch.rs:58:23 | -LL | let (x, y) | (y, x) = (0u8, 1u16); - | - ^ ----------- this expression has type `(u8, u16)` - | | | - | | expected `u8`, found `u16` - | first introduced with type `u8` here +LL | let ((x, y) | (y, x)) = (0u8, 1u16); + | - ^ ----------- this expression has type `(u8, u16)` + | | | + | | expected `u8`, found `u16` + | first introduced with type `u8` here | = note: a binding must have the same type in all alternatives diff --git a/src/test/ui/or-patterns/or-patterns-default-binding-modes.rs b/src/test/ui/or-patterns/or-patterns-default-binding-modes.rs index 3b6047c7be..f98b038ae8 100644 --- a/src/test/ui/or-patterns/or-patterns-default-binding-modes.rs +++ b/src/test/ui/or-patterns/or-patterns-default-binding-modes.rs @@ -37,11 +37,11 @@ fn main() { if let &(Ok(x) | Err(x)) = res { drop::(x); } - let Ok(mut x) | &Err(mut x) = res; + let (Ok(mut x) | &Err(mut x)) = res; drop::(x); let &(Ok(x) | Err(x)) = res; drop::(x); - let Ok(x) | Err(x) = res; + let (Ok(x) | Err(x)) = res; drop::<&u8>(x); for Ok(mut x) | &Err(mut x) in std::iter::once(res) { drop::(x); @@ -119,9 +119,9 @@ fn main() { } let tri = &Tri::A(&Ok(0)); - let Tri::A(Ok(mut x) | Err(mut x)) + let (Tri::A(Ok(mut x) | Err(mut x)) | Tri::B(&Ok(mut x) | Err(mut x)) - | &Tri::C(Ok(mut x) | Err(mut x)) = tri; + | &Tri::C(Ok(mut x) | Err(mut x))) = tri; drop::(x); match tri { 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 efe90b3e3c..27a5374ff1 100644 --- a/src/test/ui/or-patterns/or-patterns-syntactic-fail.rs +++ b/src/test/ui/or-patterns/or-patterns-syntactic-fail.rs @@ -14,29 +14,19 @@ fn no_top_level_or_patterns() { // -------- 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. - fn fun1(A | B: E) {} //~ ERROR an or-pattern parameter must be wrapped in parenthesis + fn fun1(A | B: E) {} + //~^ ERROR top-level or-patterns are not allowed fn fun2(| A | B: E) {} - //~^ ERROR a leading `|` is not allowed in a parameter pattern - //~| ERROR an or-pattern parameter must be wrapped in parenthesis -} - -// We also do not allow a leading `|` when not in a top level position: - -fn no_leading_inner() { - struct TS(E); - struct NS { f: E } + //~^ ERROR top-level or-patterns are not allowed - let ( | A | B) = E::A; //~ ERROR a leading `|` is only allowed in a top-level pattern - let ( | A | B,) = (E::B,); //~ ERROR a leading `|` is only allowed in a top-level pattern - let [ | A | B ] = [E::A]; //~ ERROR a leading `|` is only allowed in a top-level pattern - let TS( | A | B ); //~ ERROR a leading `|` is only allowed in a top-level pattern - let NS { f: | A | B }; //~ ERROR a leading `|` is only allowed in a top-level pattern + // We don't allow top-level or-patterns before type annotation in let-statements because we + // want to reserve this syntactic space for possible future type ascription. + let A | B: E = A; + //~^ ERROR top-level or-patterns are not allowed - let ( || A | B) = E::A; //~ ERROR a leading `|` is only allowed in a top-level pattern - let [ || A | B ] = [E::A]; //~ ERROR a leading `|` is only allowed in a top-level pattern - let TS( || A | B ); //~ ERROR a leading `|` is only allowed in a top-level pattern - let NS { f: || A | B }; //~ ERROR a leading `|` is only allowed in a top-level pattern + let | A | B: E = A; + //~^ ERROR top-level or-patterns are not allowed - let recovery_witness: String = 0; //~ ERROR mismatched types + let (A | B): E = A; // ok -- wrapped in parens } 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 989aeb5200..929b2088f7 100644 --- a/src/test/ui/or-patterns/or-patterns-syntactic-fail.stderr +++ b/src/test/ui/or-patterns/or-patterns-syntactic-fail.stderr @@ -1,82 +1,26 @@ -error: an or-pattern parameter must be wrapped in parenthesis +error: top-level or-patterns are not allowed in function parameters --> $DIR/or-patterns-syntactic-fail.rs:17:13 | LL | fn fun1(A | B: E) {} - | ^^^^^ help: wrap the pattern in parenthesis: `(A | B)` + | ^^^^^ help: wrap the pattern in parentheses: `(A | B)` -error: a leading `|` is not allowed in a parameter pattern - --> $DIR/or-patterns-syntactic-fail.rs:19:13 +error: top-level or-patterns are not allowed in function parameters + --> $DIR/or-patterns-syntactic-fail.rs:20:13 | LL | fn fun2(| A | B: E) {} - | ^ help: remove the `|` + | ^^^^^^^ help: wrap the pattern in parentheses: `(A | B)` -error: an or-pattern parameter must be wrapped in parenthesis - --> $DIR/or-patterns-syntactic-fail.rs:19:15 +error: top-level or-patterns are not allowed in `let` bindings + --> $DIR/or-patterns-syntactic-fail.rs:25:9 | -LL | fn fun2(| A | B: E) {} - | ^^^^^ help: wrap the pattern in parenthesis: `(A | B)` - -error: a leading `|` is only allowed in a top-level pattern - --> $DIR/or-patterns-syntactic-fail.rs:30:11 - | -LL | let ( | A | B) = E::A; - | ^ help: remove the `|` - -error: a leading `|` is only allowed in a top-level pattern - --> $DIR/or-patterns-syntactic-fail.rs:31:11 - | -LL | let ( | A | B,) = (E::B,); - | ^ help: remove the `|` - -error: a leading `|` is only allowed in a top-level pattern - --> $DIR/or-patterns-syntactic-fail.rs:32:11 - | -LL | let [ | A | B ] = [E::A]; - | ^ help: remove the `|` - -error: a leading `|` is only allowed in a top-level pattern - --> $DIR/or-patterns-syntactic-fail.rs:33:13 - | -LL | let TS( | A | B ); - | ^ help: remove the `|` +LL | let A | B: E = A; + | ^^^^^ help: wrap the pattern in parentheses: `(A | B)` -error: a leading `|` is only allowed in a top-level pattern - --> $DIR/or-patterns-syntactic-fail.rs:34:17 - | -LL | let NS { f: | A | B }; - | ^ help: remove the `|` - -error: a leading `|` is only allowed in a top-level pattern - --> $DIR/or-patterns-syntactic-fail.rs:36:11 - | -LL | let ( || A | B) = E::A; - | ^^ help: remove the `||` +error: top-level or-patterns are not allowed in `let` bindings + --> $DIR/or-patterns-syntactic-fail.rs:28:9 | - = note: alternatives in or-patterns are separated with `|`, not `||` - -error: a leading `|` is only allowed in a top-level pattern - --> $DIR/or-patterns-syntactic-fail.rs:37:11 - | -LL | let [ || A | B ] = [E::A]; - | ^^ help: remove the `||` - | - = note: alternatives in or-patterns are separated with `|`, not `||` - -error: a leading `|` is only allowed in a top-level pattern - --> $DIR/or-patterns-syntactic-fail.rs:38:13 - | -LL | let TS( || A | B ); - | ^^ help: remove the `||` - | - = note: alternatives in or-patterns are separated with `|`, not `||` - -error: a leading `|` is only allowed in a top-level pattern - --> $DIR/or-patterns-syntactic-fail.rs:39:17 - | -LL | let NS { f: || A | B }; - | ^^ help: remove the `||` - | - = note: alternatives in or-patterns are separated with `|`, not `||` +LL | let | A | B: E = A; + | ^^^^^^^ help: wrap the pattern in parentheses: `(A | B)` error[E0369]: no implementation for `E | ()` --> $DIR/or-patterns-syntactic-fail.rs:13:22 @@ -88,17 +32,6 @@ LL | let _ = |A | B: E| (); | = note: an implementation of `std::ops::BitOr` might be missing for `E` -error[E0308]: mismatched types - --> $DIR/or-patterns-syntactic-fail.rs:41:36 - | -LL | let recovery_witness: String = 0; - | ------ ^ - | | | - | | expected struct `String`, found integer - | | help: try using a conversion method: `0.to_string()` - | expected due to this - -error: aborting due to 14 previous errors +error: aborting due to 5 previous errors -Some errors have detailed explanations: E0308, E0369. -For more information about an error, try `rustc --explain E0308`. +For more information about this error, try `rustc --explain E0369`. diff --git a/src/test/ui/or-patterns/or-patterns-syntactic-pass.rs b/src/test/ui/or-patterns/or-patterns-syntactic-pass.rs index 5fe72caf9c..3da238f7b9 100644 --- a/src/test/ui/or-patterns/or-patterns-syntactic-pass.rs +++ b/src/test/ui/or-patterns/or-patterns-syntactic-pass.rs @@ -23,11 +23,11 @@ accept_pat!([p | q]); #[cfg(FALSE)] fn or_patterns() { // Top level of `let`: - let | A | B; - let A | B; - let A | B: u8; - let A | B = 0; - let A | B: u8 = 0; + let (| A | B); + let (A | B); + let (A | B): u8; + let (A | B) = 0; + let (A | B): u8 = 0; // Top level of `for`: for | A | B in 0 {} @@ -69,10 +69,10 @@ fn or_patterns() { let [A | B, .. | ..]; // These bind as `(prefix p) | q` as opposed to `prefix (p | q)`: - let box 0 | 1; // Unstable; we *can* the precedence if we want. - let &0 | 1; - let &mut 0 | 1; - let x @ 0 | 1; - let ref x @ 0 | 1; - let ref mut x @ 0 | 1; + let (box 0 | 1); // Unstable; we *can* change the precedence if we want. + let (&0 | 1); + let (&mut 0 | 1); + let (x @ 0 | 1); + let (ref x @ 0 | 1); + let (ref mut x @ 0 | 1); } diff --git a/src/test/ui/or-patterns/remove-leading-vert.fixed b/src/test/ui/or-patterns/remove-leading-vert.fixed index 443ef39829..d23858d42d 100644 --- a/src/test/ui/or-patterns/remove-leading-vert.fixed +++ b/src/test/ui/or-patterns/remove-leading-vert.fixed @@ -9,17 +9,17 @@ fn main() {} #[cfg(FALSE)] fn leading() { - fn fun1( A: E) {} //~ ERROR a leading `|` is not allowed in a parameter pattern - fn fun2( A: E) {} //~ ERROR a leading `|` is not allowed in a parameter pattern - let ( A): E; //~ ERROR a leading `|` is only allowed in a top-level pattern - let ( A): (E); //~ ERROR a leading `|` is only allowed in a top-level pattern - let ( A,): (E,); //~ ERROR a leading `|` is only allowed in a top-level pattern - let [ A ]: [E; 1]; //~ ERROR a leading `|` is only allowed in a top-level pattern - let [ A ]: [E; 1]; //~ ERROR a leading `|` is only allowed in a top-level pattern - let TS( A ): TS; //~ ERROR a leading `|` is only allowed in a top-level pattern - let TS( A ): TS; //~ ERROR a leading `|` is only allowed in a top-level pattern - let NS { f: A }: NS; //~ ERROR a leading `|` is only allowed in a top-level pattern - let NS { f: A }: NS; //~ ERROR a leading `|` is only allowed in a top-level pattern + fn fun1( A: E) {} //~ ERROR top-level or-patterns are not allowed + fn fun2( A: E) {} //~ ERROR unexpected `||` before function parameter + let ( | A): E; + let ( | A): (E); //~ ERROR unexpected token `||` in pattern + let ( | A,): (E,); + let [ | A ]: [E; 1]; + let [ | A ]: [E; 1]; //~ ERROR unexpected token `||` in pattern + let TS( | A ): TS; + let TS( | A ): TS; //~ ERROR unexpected token `||` in pattern + let NS { f: | A }: NS; + let NS { f: | A }: NS; //~ ERROR unexpected token `||` in pattern } #[cfg(FALSE)] @@ -29,17 +29,20 @@ fn trailing() { let ( A | B ): E; //~ ERROR a trailing `|` is not allowed in an or-pattern let [ A | B ]: [E; 1]; //~ ERROR a trailing `|` is not allowed in an or-pattern let S { f: B }; //~ ERROR a trailing `|` is not allowed in an or-pattern - let ( A | B ): E; //~ ERROR unexpected token `||` after pattern + let ( A | B ): E; //~ ERROR unexpected token `||` in pattern //~^ ERROR a trailing `|` is not allowed in an or-pattern match A { A => {} //~ ERROR a trailing `|` is not allowed in an or-pattern A => {} //~ ERROR a trailing `|` is not allowed in an or-pattern - A | B => {} //~ ERROR unexpected token `||` after pattern + A | B => {} //~ ERROR unexpected token `||` in pattern //~^ ERROR a trailing `|` is not allowed in an or-pattern | A | B => {} //~^ ERROR a trailing `|` is not allowed in an or-pattern } + // These test trailing-vert in `let` bindings, but they also test that we don't emit a + // duplicate suggestion that would confuse rustfix. + let a : u8 = 0; //~ ERROR a trailing `|` is not allowed in an or-pattern let a = 0; //~ ERROR a trailing `|` is not allowed in an or-pattern let a ; //~ ERROR a trailing `|` is not allowed in an or-pattern diff --git a/src/test/ui/or-patterns/remove-leading-vert.rs b/src/test/ui/or-patterns/remove-leading-vert.rs index 3c427a6f7b..e753765b3e 100644 --- a/src/test/ui/or-patterns/remove-leading-vert.rs +++ b/src/test/ui/or-patterns/remove-leading-vert.rs @@ -9,17 +9,17 @@ fn main() {} #[cfg(FALSE)] fn leading() { - fn fun1( | A: E) {} //~ ERROR a leading `|` is not allowed in a parameter pattern - fn fun2( || A: E) {} //~ ERROR a leading `|` is not allowed in a parameter pattern - let ( | A): E; //~ ERROR a leading `|` is only allowed in a top-level pattern - let ( || A): (E); //~ ERROR a leading `|` is only allowed in a top-level pattern - let ( | A,): (E,); //~ ERROR a leading `|` is only allowed in a top-level pattern - let [ | A ]: [E; 1]; //~ ERROR a leading `|` is only allowed in a top-level pattern - let [ || A ]: [E; 1]; //~ ERROR a leading `|` is only allowed in a top-level pattern - let TS( | A ): TS; //~ ERROR a leading `|` is only allowed in a top-level pattern - let TS( || A ): TS; //~ ERROR a leading `|` is only allowed in a top-level pattern - let NS { f: | A }: NS; //~ ERROR a leading `|` is only allowed in a top-level pattern - let NS { f: || A }: NS; //~ ERROR a leading `|` is only allowed in a top-level pattern + fn fun1( | A: E) {} //~ ERROR top-level or-patterns are not allowed + fn fun2( || A: E) {} //~ ERROR unexpected `||` before function parameter + let ( | A): E; + let ( || A): (E); //~ ERROR unexpected token `||` in pattern + let ( | A,): (E,); + let [ | A ]: [E; 1]; + let [ || A ]: [E; 1]; //~ ERROR unexpected token `||` in pattern + let TS( | A ): TS; + let TS( || A ): TS; //~ ERROR unexpected token `||` in pattern + let NS { f: | A }: NS; + let NS { f: || A }: NS; //~ ERROR unexpected token `||` in pattern } #[cfg(FALSE)] @@ -29,17 +29,20 @@ fn trailing() { let ( A | B | ): E; //~ ERROR a trailing `|` is not allowed in an or-pattern let [ A | B | ]: [E; 1]; //~ ERROR a trailing `|` is not allowed in an or-pattern let S { f: B | }; //~ ERROR a trailing `|` is not allowed in an or-pattern - let ( A || B | ): E; //~ ERROR unexpected token `||` after pattern + let ( A || B | ): E; //~ ERROR unexpected token `||` in pattern //~^ ERROR a trailing `|` is not allowed in an or-pattern match A { A | => {} //~ ERROR a trailing `|` is not allowed in an or-pattern A || => {} //~ ERROR a trailing `|` is not allowed in an or-pattern - A || B | => {} //~ ERROR unexpected token `||` after pattern + A || B | => {} //~ ERROR unexpected token `||` in pattern //~^ ERROR a trailing `|` is not allowed in an or-pattern | A | B | => {} //~^ ERROR a trailing `|` is not allowed in an or-pattern } + // These test trailing-vert in `let` bindings, but they also test that we don't emit a + // duplicate suggestion that would confuse rustfix. + let a | : u8 = 0; //~ ERROR a trailing `|` is not allowed in an or-pattern let a | = 0; //~ ERROR a trailing `|` is not allowed in an or-pattern let a | ; //~ ERROR a trailing `|` is not allowed in an or-pattern diff --git a/src/test/ui/or-patterns/remove-leading-vert.stderr b/src/test/ui/or-patterns/remove-leading-vert.stderr index 53025230a6..0a2b143288 100644 --- a/src/test/ui/or-patterns/remove-leading-vert.stderr +++ b/src/test/ui/or-patterns/remove-leading-vert.stderr @@ -1,10 +1,10 @@ -error: a leading `|` is not allowed in a parameter pattern +error: top-level or-patterns are not allowed in function parameters --> $DIR/remove-leading-vert.rs:12:14 | LL | fn fun1( | A: E) {} - | ^ help: remove the `|` + | ^^^ help: remove the `|`: `A` -error: a leading `|` is not allowed in a parameter pattern +error: unexpected `||` before function parameter --> $DIR/remove-leading-vert.rs:13:14 | LL | fn fun2( || A: E) {} @@ -12,67 +12,29 @@ LL | fn fun2( || A: E) {} | = note: alternatives in or-patterns are separated with `|`, not `||` -error: a leading `|` is only allowed in a top-level pattern - --> $DIR/remove-leading-vert.rs:14:11 - | -LL | let ( | A): E; - | ^ help: remove the `|` - -error: a leading `|` is only allowed in a top-level pattern +error: unexpected token `||` in pattern --> $DIR/remove-leading-vert.rs:15:11 | LL | let ( || A): (E); - | ^^ help: remove the `||` - | - = note: alternatives in or-patterns are separated with `|`, not `||` - -error: a leading `|` is only allowed in a top-level pattern - --> $DIR/remove-leading-vert.rs:16:11 - | -LL | let ( | A,): (E,); - | ^ help: remove the `|` + | ^^ help: use a single `|` to separate multiple alternative patterns: `|` -error: a leading `|` is only allowed in a top-level pattern - --> $DIR/remove-leading-vert.rs:17:11 - | -LL | let [ | A ]: [E; 1]; - | ^ help: remove the `|` - -error: a leading `|` is only allowed in a top-level pattern +error: unexpected token `||` in pattern --> $DIR/remove-leading-vert.rs:18:11 | LL | let [ || A ]: [E; 1]; - | ^^ help: remove the `||` - | - = note: alternatives in or-patterns are separated with `|`, not `||` - -error: a leading `|` is only allowed in a top-level pattern - --> $DIR/remove-leading-vert.rs:19:13 - | -LL | let TS( | A ): TS; - | ^ help: remove the `|` + | ^^ help: use a single `|` to separate multiple alternative patterns: `|` -error: a leading `|` is only allowed in a top-level pattern +error: unexpected token `||` in pattern --> $DIR/remove-leading-vert.rs:20:13 | LL | let TS( || A ): TS; - | ^^ help: remove the `||` - | - = note: alternatives in or-patterns are separated with `|`, not `||` - -error: a leading `|` is only allowed in a top-level pattern - --> $DIR/remove-leading-vert.rs:21:17 - | -LL | let NS { f: | A }: NS; - | ^ help: remove the `|` + | ^^ help: use a single `|` to separate multiple alternative patterns: `|` -error: a leading `|` is only allowed in a top-level pattern +error: unexpected token `||` in pattern --> $DIR/remove-leading-vert.rs:22:17 | LL | let NS { f: || A }: NS; - | ^^ help: remove the `||` - | - = note: alternatives in or-patterns are separated with `|`, not `||` + | ^^ help: use a single `|` to separate multiple alternative patterns: `|` error: a trailing `|` is not allowed in an or-pattern --> $DIR/remove-leading-vert.rs:27:13 @@ -114,7 +76,7 @@ LL | let S { f: B | }; | | | while parsing this or-pattern starting here -error: unexpected token `||` after pattern +error: unexpected token `||` in pattern --> $DIR/remove-leading-vert.rs:32:13 | LL | let ( A || B | ): E; @@ -148,7 +110,7 @@ LL | A || => {} | = note: alternatives in or-patterns are separated with `|`, not `||` -error: unexpected token `||` after pattern +error: unexpected token `||` in pattern --> $DIR/remove-leading-vert.rs:37:11 | LL | A || B | => {} @@ -168,12 +130,12 @@ error: a trailing `|` is not allowed in an or-pattern --> $DIR/remove-leading-vert.rs:39:17 | LL | | A | B | => {} - | - ^ help: remove the `|` - | | - | while parsing this or-pattern starting here + | - ^ help: remove the `|` + | | + | while parsing this or-pattern starting here error: a trailing `|` is not allowed in an or-pattern - --> $DIR/remove-leading-vert.rs:43:11 + --> $DIR/remove-leading-vert.rs:46:11 | LL | let a | : u8 = 0; | - ^ help: remove the `|` @@ -181,7 +143,7 @@ LL | let a | : u8 = 0; | while parsing this or-pattern starting here error: a trailing `|` is not allowed in an or-pattern - --> $DIR/remove-leading-vert.rs:44:11 + --> $DIR/remove-leading-vert.rs:47:11 | LL | let a | = 0; | - ^ help: remove the `|` @@ -189,12 +151,12 @@ LL | let a | = 0; | while parsing this or-pattern starting here error: a trailing `|` is not allowed in an or-pattern - --> $DIR/remove-leading-vert.rs:45:11 + --> $DIR/remove-leading-vert.rs:48:11 | LL | let a | ; | - ^ help: remove the `|` | | | while parsing this or-pattern starting here -error: aborting due to 26 previous errors +error: aborting due to 21 previous errors diff --git a/src/test/ui/parser/circular_modules_main.rs b/src/test/ui/parser/circular_modules_main.rs index 1ae36a1f76..d4b47efe68 100644 --- a/src/test/ui/parser/circular_modules_main.rs +++ b/src/test/ui/parser/circular_modules_main.rs @@ -1,10 +1,12 @@ +// error-pattern: circular modules + #[path = "circular_modules_hello.rs"] -mod circular_modules_hello; //~ ERROR: circular modules +mod circular_modules_hello; pub fn hi_str() -> String { "Hi!".to_string() } fn main() { - circular_modules_hello::say_hello(); //~ ERROR cannot find function `say_hello` in module + circular_modules_hello::say_hello(); } diff --git a/src/test/ui/parser/circular_modules_main.stderr b/src/test/ui/parser/circular_modules_main.stderr index 5d4db8c31a..ee45f65a3b 100644 --- a/src/test/ui/parser/circular_modules_main.stderr +++ b/src/test/ui/parser/circular_modules_main.stderr @@ -1,18 +1,18 @@ -error: circular modules: $DIR/circular_modules_hello.rs -> $DIR/circular_modules_main.rs -> $DIR/circular_modules_hello.rs - --> $DIR/circular_modules_main.rs:2:1 +error: circular modules: $DIR/circular_modules_main.rs -> $DIR/circular_modules_hello.rs -> $DIR/circular_modules_main.rs + --> $DIR/circular_modules_hello.rs:4:1 | -LL | mod circular_modules_hello; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ +LL | mod circular_modules_main; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^ -error[E0425]: cannot find function `say_hello` in module `circular_modules_hello` - --> $DIR/circular_modules_main.rs:9:29 +error[E0425]: cannot find function `hi_str` in module `circular_modules_main` + --> $DIR/circular_modules_hello.rs:7:43 | -LL | circular_modules_hello::say_hello(); - | ^^^^^^^^^ not found in `circular_modules_hello` +LL | println!("{}", circular_modules_main::hi_str()); + | ^^^^^^ not found in `circular_modules_main` | help: consider importing this function | -LL | use circular_modules_hello::say_hello; +LL | use hi_str; | error: aborting due to 2 previous errors diff --git a/src/test/ui/dotdotdot-expr.rs b/src/test/ui/parser/dotdotdot-expr.rs similarity index 100% rename from src/test/ui/dotdotdot-expr.rs rename to src/test/ui/parser/dotdotdot-expr.rs diff --git a/src/test/ui/dotdotdot-expr.stderr b/src/test/ui/parser/dotdotdot-expr.stderr similarity index 100% rename from src/test/ui/dotdotdot-expr.stderr rename to src/test/ui/parser/dotdotdot-expr.stderr diff --git a/src/test/ui/parser/duplicate-visibility.rs b/src/test/ui/parser/duplicate-visibility.rs index 547329cfb1..97f19b3da4 100644 --- a/src/test/ui/parser/duplicate-visibility.rs +++ b/src/test/ui/parser/duplicate-visibility.rs @@ -1,7 +1,8 @@ +// ignore-tidy-linelength + fn main() {} extern "C" { pub pub fn foo(); - //~^ ERROR visibility `pub` is not followed by an item - //~| ERROR non-item in item list + //~^ ERROR expected one of `(`, `async`, `const`, `default`, `extern`, `fn`, `pub`, `unsafe`, or `use`, found keyword `pub` } diff --git a/src/test/ui/parser/duplicate-visibility.stderr b/src/test/ui/parser/duplicate-visibility.stderr index 8d8122292a..6ac27078ea 100644 --- a/src/test/ui/parser/duplicate-visibility.stderr +++ b/src/test/ui/parser/duplicate-visibility.stderr @@ -1,21 +1,16 @@ -error: visibility `pub` is not followed by an item - --> $DIR/duplicate-visibility.rs:4:5 - | -LL | pub pub fn foo(); - | ^^^ the visibility - | - = help: you likely meant to define an item, e.g., `pub fn foo() {}` - -error: non-item in item list - --> $DIR/duplicate-visibility.rs:4:9 +error: expected one of `(`, `async`, `const`, `default`, `extern`, `fn`, `pub`, `unsafe`, or `use`, found keyword `pub` + --> $DIR/duplicate-visibility.rs:6:9 | LL | extern "C" { - | - item list starts here + | - while parsing this item list starting here LL | pub pub fn foo(); - | ^^^ non-item starts here -... + | ^^^ + | | + | expected one of 9 possible tokens + | help: visibility `pub` must come before `pub pub`: `pub pub pub` +LL | LL | } - | - item list ends here + | - the item list ends here -error: aborting due to 2 previous errors +error: aborting due to previous error diff --git a/src/test/ui/parser/expr-as-stmt-2.stderr b/src/test/ui/parser/expr-as-stmt-2.stderr index ee07c36763..2a70127485 100644 --- a/src/test/ui/parser/expr-as-stmt-2.stderr +++ b/src/test/ui/parser/expr-as-stmt-2.stderr @@ -2,19 +2,29 @@ error[E0308]: mismatched types --> $DIR/expr-as-stmt-2.rs:3:26 | LL | if let Some(x) = a { true } else { false } - | ---------------------^^^^------------------ help: consider using a semicolon here + | ---------------------^^^^----------------- | | | | | expected `()`, found `bool` | expected this to be `()` + | +help: you might have meant to return this value + | +LL | if let Some(x) = a { return true; } else { false } + | ^^^^^^ ^ error[E0308]: mismatched types --> $DIR/expr-as-stmt-2.rs:3:40 | LL | if let Some(x) = a { true } else { false } - | -----------------------------------^^^^^--- help: consider using a semicolon here + | -----------------------------------^^^^^-- | | | | | expected `()`, found `bool` | expected this to be `()` + | +help: you might have meant to return this value + | +LL | if let Some(x) = a { true } else { return false; } + | ^^^^^^ ^ error[E0308]: mismatched types --> $DIR/expr-as-stmt-2.rs:6:5 diff --git a/src/test/ui/parser/expr-as-stmt.stderr b/src/test/ui/parser/expr-as-stmt.stderr index 324aed0ad7..09a6d7cbeb 100644 --- a/src/test/ui/parser/expr-as-stmt.stderr +++ b/src/test/ui/parser/expr-as-stmt.stderr @@ -40,24 +40,44 @@ error[E0308]: mismatched types | LL | {2} + {2} | ^ expected `()`, found integer + | +help: you might have meant to return this value + | +LL | {return 2;} + {2} + | ^^^^^^ ^ error[E0308]: mismatched types --> $DIR/expr-as-stmt.rs:12:6 | LL | {2} + 2 | ^ expected `()`, found integer + | +help: you might have meant to return this value + | +LL | {return 2;} + 2 + | ^^^^^^ ^ error[E0308]: mismatched types --> $DIR/expr-as-stmt.rs:18:7 | LL | { 42 } + foo; | ^^ expected `()`, found integer + | +help: you might have meant to return this value + | +LL | { return 42; } + foo; + | ^^^^^^ ^ error[E0308]: mismatched types --> $DIR/expr-as-stmt.rs:24:7 | LL | { 3 } * 3 | ^ expected `()`, found integer + | +help: you might have meant to return this value + | +LL | { return 3; } * 3 + | ^^^^^^ ^ error[E0614]: type `{integer}` cannot be dereferenced --> $DIR/expr-as-stmt.rs:24:11 diff --git a/src/test/ui/parser/fn-header-semantic-fail.stderr b/src/test/ui/parser/fn-header-semantic-fail.stderr index 4fde243b2f..2e513415e6 100644 --- a/src/test/ui/parser/fn-header-semantic-fail.stderr +++ b/src/test/ui/parser/fn-header-semantic-fail.stderr @@ -189,9 +189,10 @@ LL | async fn ft1(); LL | async fn ft1() {} | ^ | | - | the `Output` of this `async fn`'s found opaque type + | checked the `Output` of this `async fn`, found opaque type | expected `()`, found opaque type | + = note: while checking the return type of the `async fn` = note: expected fn pointer `fn()` found fn pointer `fn() -> impl Future` @@ -204,9 +205,10 @@ LL | const async unsafe extern "C" fn ft5(); LL | const async unsafe extern "C" fn ft5() {} | ^ | | - | the `Output` of this `async fn`'s found opaque type + | checked the `Output` of this `async fn`, found opaque type | expected `()`, found opaque type | + = note: while checking the return type of the `async fn` = note: expected fn pointer `unsafe extern "C" fn()` found fn pointer `unsafe extern "C" fn() -> impl Future` 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 index fa9c7ababc..1ccc9497d9 100644 --- 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 @@ -8,16 +8,16 @@ struct X; impl X { type Y; //~^ ERROR associated type in `impl` without body - //~| ERROR associated types are not yet supported in inherent impls + //~| ERROR inherent associated types are unstable type Z: Ord; //~^ ERROR associated type in `impl` without body //~| ERROR bounds on `type`s in `impl`s have no effect - //~| ERROR associated types are not yet supported in inherent impls + //~| ERROR inherent associated types are unstable type W: Ord where Self: Eq; //~^ ERROR associated type in `impl` without body //~| ERROR bounds on `type`s in `impl`s have no effect - //~| ERROR associated types are not yet supported in inherent impls + //~| ERROR inherent associated types are unstable type W where Self: Eq; //~^ ERROR associated type in `impl` without body - //~| ERROR associated types are not yet supported in inherent impls + //~| ERROR inherent associated types are unstable } 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 index 214467793b..818d73c898 100644 --- 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 @@ -51,30 +51,42 @@ LL | #![feature(generic_associated_types)] = note: `#[warn(incomplete_features)]` on by default = note: see issue #44265 for more information -error[E0202]: associated types are not yet supported in inherent impls (see #8995) +error[E0658]: inherent associated types are unstable --> $DIR/impl-item-type-no-body-semantic-fail.rs:9:5 | LL | type Y; | ^^^^^^^ + | + = note: see issue #8995 for more information + = help: add `#![feature(inherent_associated_types)]` to the crate attributes to enable -error[E0202]: associated types are not yet supported in inherent impls (see #8995) +error[E0658]: inherent associated types are unstable --> $DIR/impl-item-type-no-body-semantic-fail.rs:12:5 | LL | type Z: Ord; | ^^^^^^^^^^^^ + | + = note: see issue #8995 for more information + = help: add `#![feature(inherent_associated_types)]` to the crate attributes to enable -error[E0202]: associated types are not yet supported in inherent impls (see #8995) +error[E0658]: inherent associated types are unstable --> $DIR/impl-item-type-no-body-semantic-fail.rs:16:5 | LL | type W: Ord where Self: Eq; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #8995 for more information + = help: add `#![feature(inherent_associated_types)]` to the crate attributes to enable -error[E0202]: associated types are not yet supported in inherent impls (see #8995) +error[E0658]: inherent associated types are unstable --> $DIR/impl-item-type-no-body-semantic-fail.rs:20:5 | LL | type W where Self: Eq; | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #8995 for more information + = help: add `#![feature(inherent_associated_types)]` to the crate attributes to enable error: aborting due to 10 previous errors; 1 warning emitted -For more information about this error, try `rustc --explain E0202`. +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/issues/issue-20616-3.rs b/src/test/ui/parser/issue-20616-3.rs similarity index 100% rename from src/test/ui/issues/issue-20616-3.rs rename to src/test/ui/parser/issue-20616-3.rs diff --git a/src/test/ui/issues/issue-20616-3.stderr b/src/test/ui/parser/issue-20616-3.stderr similarity index 100% rename from src/test/ui/issues/issue-20616-3.stderr rename to src/test/ui/parser/issue-20616-3.stderr diff --git a/src/test/ui/issues/issue-44406.rs b/src/test/ui/parser/issue-44406.rs similarity index 100% rename from src/test/ui/issues/issue-44406.rs rename to src/test/ui/parser/issue-44406.rs diff --git a/src/test/ui/issues/issue-44406.stderr b/src/test/ui/parser/issue-44406.stderr similarity index 100% rename from src/test/ui/issues/issue-44406.stderr rename to src/test/ui/parser/issue-44406.stderr diff --git a/src/test/ui/parser/issue-52496.rs b/src/test/ui/parser/issue-52496.rs index 4e94536537..05461f8b8c 100644 --- a/src/test/ui/parser/issue-52496.rs +++ b/src/test/ui/parser/issue-52496.rs @@ -7,6 +7,6 @@ fn main() { let bar = 1.5f32; let _ = Foo { bar.into(), bat: -1, . }; //~^ ERROR expected one of - //~| ERROR missing fields `bar`, `baz` in initializer of `Foo` + //~| ERROR missing fields `bar` and `baz` in initializer of `Foo` //~| ERROR expected identifier, found `.` } diff --git a/src/test/ui/parser/issue-52496.stderr b/src/test/ui/parser/issue-52496.stderr index 10fcc46f34..9dbf26ef4b 100644 --- a/src/test/ui/parser/issue-52496.stderr +++ b/src/test/ui/parser/issue-52496.stderr @@ -26,11 +26,11 @@ error[E0063]: missing field `bat` in initializer of `Foo` LL | let _ = Foo { bar: .5, baz: 42 }; | ^^^ missing `bat` -error[E0063]: missing fields `bar`, `baz` in initializer of `Foo` +error[E0063]: missing fields `bar` and `baz` in initializer of `Foo` --> $DIR/issue-52496.rs:8:13 | LL | let _ = Foo { bar.into(), bat: -1, . }; - | ^^^ missing `bar`, `baz` + | ^^^ missing `bar` and `baz` error: aborting due to 5 previous errors diff --git a/src/test/ui/parser/issue-66473.stderr b/src/test/ui/parser/issue-66473.stderr index b370b125cfefda4f82cbb4866fec528b1465a2ef..8a16d7f955129811997464d47c4e10238db77340 100644 GIT binary patch literal 5260 zcmd^@%}&BV6h>LsXCV2EE~zrm7Hpy`V`9R}=t@Hh?JYFm44EInsC!?|ce0d(R1MID z3uU_KqLbd+@21H;IV7c!Aq<~zG3QWvAT>k^EhfZ6JeZfZ*L`yU*S)~;<@L>Jrj#K! z2)s`FM5@pWTlpzoon8;GIQn?6{kV#Apzk=evs-g}uXg2L#W&@*bBt*^3!#LOF(J*S zr0{5zMl84$E~H|1F%`25s+e6=)!H+vV#zj-;eT-^2lb#{s}-14&5`UXUfy!$;?=5e zH86fy-YMUT|9>L#!}1RKv+>q$N^n}ry67;1kcjT122x>of+&dcA8M1c^TVp#=VEiO pmGLVNsbBVHg+W|Pu)$DBy|iPAp yTwvZEZZLJ42Tbka1yd{ez|;(WFx4&qq?9Lz3x1vaUeIZ>fUq=>=9s)y_&NY2+&CBj diff --git a/src/test/ui/parser/issue-68629.stderr b/src/test/ui/parser/issue-68629.stderr index a7885ecec5647e4c3eece95ce5b4ea25c70273ca..19c9ef30f9049537fca85864287462c8f875eee4 100644 GIT binary patch delta 421 zcmd6hF$%&!5JkzB3SPnA*l90{Arzz>+)0cC((%L9Bxz1EEHyNK8#d zTDpOg_t+ifr@7J!g4U_V!4e~faYaEjvHTAlmv9j&Dl+Xjv;D|ewXbZ_hm?o<+@I>L EzSc~WFaQ7m delta 28 jcmZ3^w~%{-0^{UGjOjq^H2Ex(>SQ;TTbun@ZZZJ?mG}x~ diff --git a/src/test/ui/parser/issue-68730.stderr b/src/test/ui/parser/issue-68730.stderr index 9f8833e17fe25afc9f10b08683294ecd7e9efe32..8602abacabd325988d4f2b8a9116d85688365341 100644 GIT binary patch delta 283 zcmX@ceu{HKYQ2JjLJb#?uvN%N%_*=_D9$e}N={Ws%gjkFR>&TF%&nrpH%u@&r zanrR>NX<*mPf1NtC`qj-(NQSPORXqKO)dcn+C?r*ufV5?%XOt-9CnuK{DU@fV v<|!m9q-3V0r52^;l|T&0%u83uELJEjW=T!q;+o(%ak<*yaEa2!57(FgQy*hq delta 23 fcmX@bd5nER>g0=z%9FVmT_;~)a@j1(w3P_}Yo!P) diff --git a/src/test/ui/issues/issue-7222.rs b/src/test/ui/parser/issue-7222.rs similarity index 100% rename from src/test/ui/issues/issue-7222.rs rename to src/test/ui/parser/issue-7222.rs diff --git a/src/test/ui/parser/issue-76437-async.rs b/src/test/ui/parser/issue-76437-async.rs new file mode 100644 index 0000000000..84ee3dd211 --- /dev/null +++ b/src/test/ui/parser/issue-76437-async.rs @@ -0,0 +1,7 @@ +// edition:2018 + +mod t { + async pub fn t() {} + //~^ ERROR expected one of `extern`, `fn`, or `unsafe`, found keyword `pub` + //~| HELP visibility `pub` must come before `async` +} diff --git a/src/test/ui/parser/issue-76437-async.stderr b/src/test/ui/parser/issue-76437-async.stderr new file mode 100644 index 0000000000..2c9c2a8cfb --- /dev/null +++ b/src/test/ui/parser/issue-76437-async.stderr @@ -0,0 +1,11 @@ +error: expected one of `extern`, `fn`, or `unsafe`, found keyword `pub` + --> $DIR/issue-76437-async.rs:4:11 + | +LL | async pub fn t() {} + | ------^^^ + | | | + | | expected one of `extern`, `fn`, or `unsafe` + | help: visibility `pub` must come before `async`: `pub async` + +error: aborting due to previous error + diff --git a/src/test/ui/parser/issue-76437-const-async-unsafe.rs b/src/test/ui/parser/issue-76437-const-async-unsafe.rs new file mode 100644 index 0000000000..f1e06e4ad8 --- /dev/null +++ b/src/test/ui/parser/issue-76437-const-async-unsafe.rs @@ -0,0 +1,7 @@ +// edition:2018 + +mod t { + const async unsafe pub fn t() {} + //~^ ERROR expected one of `extern` or `fn`, found keyword `pub` + //~| HELP visibility `pub` must come before `const async unsafe` +} diff --git a/src/test/ui/parser/issue-76437-const-async-unsafe.stderr b/src/test/ui/parser/issue-76437-const-async-unsafe.stderr new file mode 100644 index 0000000000..2e91beda11 --- /dev/null +++ b/src/test/ui/parser/issue-76437-const-async-unsafe.stderr @@ -0,0 +1,11 @@ +error: expected one of `extern` or `fn`, found keyword `pub` + --> $DIR/issue-76437-const-async-unsafe.rs:4:24 + | +LL | const async unsafe pub fn t() {} + | -------------------^^^ + | | | + | | expected one of `extern` or `fn` + | help: visibility `pub` must come before `const async unsafe`: `pub const async unsafe` + +error: aborting due to previous error + diff --git a/src/test/ui/parser/issue-76437-const-async.rs b/src/test/ui/parser/issue-76437-const-async.rs new file mode 100644 index 0000000000..3c789fdcd0 --- /dev/null +++ b/src/test/ui/parser/issue-76437-const-async.rs @@ -0,0 +1,7 @@ +// edition:2018 + +mod t { + const async pub fn t() {} + //~^ ERROR expected one of `extern`, `fn`, or `unsafe`, found keyword `pub` + //~| HELP visibility `pub` must come before `const async` +} diff --git a/src/test/ui/parser/issue-76437-const-async.stderr b/src/test/ui/parser/issue-76437-const-async.stderr new file mode 100644 index 0000000000..21b96c14d7 --- /dev/null +++ b/src/test/ui/parser/issue-76437-const-async.stderr @@ -0,0 +1,11 @@ +error: expected one of `extern`, `fn`, or `unsafe`, found keyword `pub` + --> $DIR/issue-76437-const-async.rs:4:17 + | +LL | const async pub fn t() {} + | ------------^^^ + | | | + | | expected one of `extern`, `fn`, or `unsafe` + | help: visibility `pub` must come before `const async`: `pub const async` + +error: aborting due to previous error + diff --git a/src/test/ui/parser/issue-76437-const.rs b/src/test/ui/parser/issue-76437-const.rs new file mode 100644 index 0000000000..d3815a5234 --- /dev/null +++ b/src/test/ui/parser/issue-76437-const.rs @@ -0,0 +1,7 @@ +// edition:2018 + +mod t { + const pub fn t() {} + //~^ ERROR expected one of `async`, `extern`, `fn`, or `unsafe`, found keyword `pub` + //~| HELP visibility `pub` must come before `const` +} diff --git a/src/test/ui/parser/issue-76437-const.stderr b/src/test/ui/parser/issue-76437-const.stderr new file mode 100644 index 0000000000..cf80d9a903 --- /dev/null +++ b/src/test/ui/parser/issue-76437-const.stderr @@ -0,0 +1,11 @@ +error: expected one of `async`, `extern`, `fn`, or `unsafe`, found keyword `pub` + --> $DIR/issue-76437-const.rs:4:11 + | +LL | const pub fn t() {} + | ------^^^ + | | | + | | expected one of `async`, `extern`, `fn`, or `unsafe` + | help: visibility `pub` must come before `const`: `pub const` + +error: aborting due to previous error + diff --git a/src/test/ui/parser/issue-76437-pub-crate-unsafe.rs b/src/test/ui/parser/issue-76437-pub-crate-unsafe.rs new file mode 100644 index 0000000000..daa1d12079 --- /dev/null +++ b/src/test/ui/parser/issue-76437-pub-crate-unsafe.rs @@ -0,0 +1,7 @@ +// edition:2018 + +mod t { + unsafe pub(crate) fn t() {} + //~^ ERROR expected one of `extern` or `fn`, found keyword `pub` + //~| HELP visibility `pub(crate)` must come before `unsafe` +} diff --git a/src/test/ui/parser/issue-76437-pub-crate-unsafe.stderr b/src/test/ui/parser/issue-76437-pub-crate-unsafe.stderr new file mode 100644 index 0000000000..fa8f13721c --- /dev/null +++ b/src/test/ui/parser/issue-76437-pub-crate-unsafe.stderr @@ -0,0 +1,11 @@ +error: expected one of `extern` or `fn`, found keyword `pub` + --> $DIR/issue-76437-pub-crate-unsafe.rs:4:12 + | +LL | unsafe pub(crate) fn t() {} + | -------^^^------- + | | | + | | expected one of `extern` or `fn` + | help: visibility `pub(crate)` must come before `unsafe`: `pub(crate) unsafe` + +error: aborting due to previous error + diff --git a/src/test/ui/parser/issue-76437-unsafe.rs b/src/test/ui/parser/issue-76437-unsafe.rs new file mode 100644 index 0000000000..785a79a79a --- /dev/null +++ b/src/test/ui/parser/issue-76437-unsafe.rs @@ -0,0 +1,7 @@ +// edition:2018 + +mod t { + unsafe pub fn t() {} + //~^ ERROR expected one of `extern` or `fn`, found keyword `pub` + //~| HELP visibility `pub` must come before `unsafe` +} diff --git a/src/test/ui/parser/issue-76437-unsafe.stderr b/src/test/ui/parser/issue-76437-unsafe.stderr new file mode 100644 index 0000000000..c63292ef85 --- /dev/null +++ b/src/test/ui/parser/issue-76437-unsafe.stderr @@ -0,0 +1,11 @@ +error: expected one of `extern` or `fn`, found keyword `pub` + --> $DIR/issue-76437-unsafe.rs:4:12 + | +LL | unsafe pub fn t() {} + | -------^^^ + | | | + | | expected one of `extern` or `fn` + | help: visibility `pub` must come before `unsafe`: `pub unsafe` + +error: aborting due to previous error + diff --git a/src/test/ui/parser/issue-8537.stderr b/src/test/ui/parser/issue-8537.stderr index 3f63c08021..85e2b77d86 100644 --- a/src/test/ui/parser/issue-8537.stderr +++ b/src/test/ui/parser/issue-8537.stderr @@ -4,7 +4,7 @@ error[E0703]: invalid ABI: found `invalid-ab_isize` LL | "invalid-ab_isize" | ^^^^^^^^^^^^^^^^^^ invalid ABI | - = help: valid ABIs: Rust, C, cdecl, stdcall, fastcall, vectorcall, thiscall, aapcs, win64, sysv64, ptx-kernel, msp430-interrupt, x86-interrupt, amdgpu-kernel, efiapi, avr-interrupt, avr-non-blocking-interrupt, C-cmse-nonsecure-call, system, rust-intrinsic, rust-call, platform-intrinsic, unadjusted + = help: valid ABIs: Rust, C, C-unwind, cdecl, stdcall, stdcall-unwind, fastcall, vectorcall, thiscall, thiscall-unwind, aapcs, win64, sysv64, ptx-kernel, msp430-interrupt, x86-interrupt, amdgpu-kernel, efiapi, avr-interrupt, avr-non-blocking-interrupt, C-cmse-nonsecure-call, system, system-unwind, rust-intrinsic, rust-call, platform-intrinsic, unadjusted error: aborting due to previous error diff --git a/src/test/ui/parser/item-free-const-no-body-semantic-fail.rs b/src/test/ui/parser/item-free-const-no-body-semantic-fail.rs index 613b3c9856..15a15a207b 100644 --- a/src/test/ui/parser/item-free-const-no-body-semantic-fail.rs +++ b/src/test/ui/parser/item-free-const-no-body-semantic-fail.rs @@ -4,4 +4,3 @@ fn main() {} const A: u8; //~ ERROR free constant item without body const B; //~ ERROR free constant item without body -//~^ ERROR missing type for `const` item diff --git a/src/test/ui/parser/item-free-const-no-body-semantic-fail.stderr b/src/test/ui/parser/item-free-const-no-body-semantic-fail.stderr index 4e97229fa1..aa75e5cee0 100644 --- a/src/test/ui/parser/item-free-const-no-body-semantic-fail.stderr +++ b/src/test/ui/parser/item-free-const-no-body-semantic-fail.stderr @@ -14,11 +14,5 @@ LL | const B; | | | help: provide a definition for the constant: `= ;` -error: missing type for `const` item - --> $DIR/item-free-const-no-body-semantic-fail.rs:6:7 - | -LL | const B; - | ^ help: provide a type for the item: `B: [type error]` - -error: aborting due to 3 previous errors +error: aborting due to 2 previous errors diff --git a/src/test/ui/parser/item-free-static-no-body-semantic-fail.rs b/src/test/ui/parser/item-free-static-no-body-semantic-fail.rs index 780479e3d2..61d3eab24d 100644 --- a/src/test/ui/parser/item-free-static-no-body-semantic-fail.rs +++ b/src/test/ui/parser/item-free-static-no-body-semantic-fail.rs @@ -4,8 +4,6 @@ fn main() {} static A: u8; //~ ERROR free static item without body static B; //~ ERROR free static item without body -//~^ ERROR missing type for `static` item static mut C: u8; //~ ERROR free static item without body static mut D; //~ ERROR free static item without body -//~^ ERROR missing type for `static mut` item diff --git a/src/test/ui/parser/item-free-static-no-body-semantic-fail.stderr b/src/test/ui/parser/item-free-static-no-body-semantic-fail.stderr index 60b7bb34c6..7b40832367 100644 --- a/src/test/ui/parser/item-free-static-no-body-semantic-fail.stderr +++ b/src/test/ui/parser/item-free-static-no-body-semantic-fail.stderr @@ -15,7 +15,7 @@ LL | static B; | help: provide a definition for the static: `= ;` error: free static item without body - --> $DIR/item-free-static-no-body-semantic-fail.rs:9:1 + --> $DIR/item-free-static-no-body-semantic-fail.rs:8:1 | LL | static mut C: u8; | ^^^^^^^^^^^^^^^^- @@ -23,24 +23,12 @@ LL | static mut C: u8; | help: provide a definition for the static: `= ;` error: free static item without body - --> $DIR/item-free-static-no-body-semantic-fail.rs:10:1 + --> $DIR/item-free-static-no-body-semantic-fail.rs:9:1 | LL | static mut D; | ^^^^^^^^^^^^- | | | help: provide a definition for the static: `= ;` -error: missing type for `static` item - --> $DIR/item-free-static-no-body-semantic-fail.rs:6:8 - | -LL | static B; - | ^ help: provide a type for the item: `B: [type error]` - -error: missing type for `static mut` item - --> $DIR/item-free-static-no-body-semantic-fail.rs:10:12 - | -LL | static mut D; - | ^ help: provide a type for the item: `D: [type error]` - -error: aborting due to 6 previous errors +error: aborting due to 4 previous errors diff --git a/src/test/ui/parser/let-binop.stderr b/src/test/ui/parser/let-binop.stderr index 90295854a2..dd33e9157c 100644 --- a/src/test/ui/parser/let-binop.stderr +++ b/src/test/ui/parser/let-binop.stderr @@ -3,18 +3,24 @@ error: can't reassign to an uninitialized variable | LL | let a: i8 *= 1; | ^^ help: initialize the variable + | + = help: if you meant to overwrite, remove the `let` binding error: can't reassign to an uninitialized variable --> $DIR/let-binop.rs:6:11 | LL | let b += 1; | ^^ help: initialize the variable + | + = help: if you meant to overwrite, remove the `let` binding error: can't reassign to an uninitialized variable --> $DIR/let-binop.rs:8:11 | LL | let c *= 1; | ^^ help: initialize the variable + | + = help: if you meant to overwrite, remove the `let` binding error: aborting due to 3 previous errors diff --git a/src/test/ui/lex-bare-cr-nondoc-comment.rs b/src/test/ui/parser/lex-bare-cr-nondoc-comment.rs similarity index 100% rename from src/test/ui/lex-bare-cr-nondoc-comment.rs rename to src/test/ui/parser/lex-bare-cr-nondoc-comment.rs diff --git a/src/test/ui/lexer-crlf-line-endings-string-literal-doc-comment.rs b/src/test/ui/parser/lexer-crlf-line-endings-string-literal-doc-comment.rs similarity index 100% rename from src/test/ui/lexer-crlf-line-endings-string-literal-doc-comment.rs rename to src/test/ui/parser/lexer-crlf-line-endings-string-literal-doc-comment.rs diff --git a/src/test/ui/parser/lifetime-in-pattern.stderr b/src/test/ui/parser/lifetime-in-pattern.stderr index 71fd3cdf72..4ffee657ca 100644 --- a/src/test/ui/parser/lifetime-in-pattern.stderr +++ b/src/test/ui/parser/lifetime-in-pattern.stderr @@ -9,6 +9,20 @@ error: expected one of `:`, `@`, or `|`, found `)` | LL | fn test(&'a str) { | ^ expected one of `:`, `@`, or `|` + | + = note: anonymous parameters are removed in the 2018 edition (see RFC 1685) +help: if this is a `self` type, give it a parameter name + | +LL | fn test(self: &str) { + | ^^^^^^^^^^ +help: if this is a parameter name, give it a type + | +LL | fn test(str: &TypeName) { + | ^^^^^^^^^^^^^^ +help: if this is a type, explicitly ignore the parameter name + | +LL | fn test(_: &str) { + | ^^^^^^^ error: aborting due to 2 previous errors diff --git a/src/test/ui/parser/match-arm-without-braces.rs b/src/test/ui/parser/match-arm-without-braces.rs new file mode 100644 index 0000000000..55a8874276 --- /dev/null +++ b/src/test/ui/parser/match-arm-without-braces.rs @@ -0,0 +1,87 @@ +struct S; + +impl S { + fn get(_: K) -> Option { + Default::default() + } +} + +enum Val { + Foo, + Bar, +} + +impl Default for Val { + fn default() -> Self { + Val::Foo + } +} + +fn main() { + match S::get(1) { + Some(Val::Foo) => {} + _ => {} + } + match S::get(2) { + Some(Val::Foo) => 3; //~ ERROR `match` arm body without braces + _ => 4, + } + match S::get(5) { + Some(Val::Foo) => + 7; //~ ERROR `match` arm body without braces + 8; + _ => 9, + } + match S::get(10) { + Some(Val::Foo) => + 11; //~ ERROR `match` arm body without braces + 12; + _ => (), + } + match S::get(13) { + None => {} + Some(Val::Foo) => + 14; //~ ERROR `match` arm body without braces + 15; + } + match S::get(16) { + Some(Val::Foo) => 17 + _ => 18, //~ ERROR expected one of + } + match S::get(19) { + Some(Val::Foo) => + 20; //~ ERROR `match` arm body without braces + 21 + _ => 22, + } + match S::get(23) { + Some(Val::Foo) => + 24; //~ ERROR `match` arm body without braces + 25 + _ => (), + } + match S::get(26) { + None => {} + Some(Val::Foo) => + 27; //~ ERROR `match` arm body without braces + 28 + } + match S::get(29) { + Some(Val::Foo) => + 30; //~ ERROR expected one of + 31, + _ => 32, + } + match S::get(33) { + Some(Val::Foo) => + 34; //~ ERROR expected one of + 35, + _ => (), + } + match S::get(36) { + None => {} + Some(Val::Foo) => + 37; //~ ERROR expected one of + 38, + } +} diff --git a/src/test/ui/parser/match-arm-without-braces.stderr b/src/test/ui/parser/match-arm-without-braces.stderr new file mode 100644 index 0000000000..03ae351bf7 --- /dev/null +++ b/src/test/ui/parser/match-arm-without-braces.stderr @@ -0,0 +1,135 @@ +error: `match` arm body without braces + --> $DIR/match-arm-without-braces.rs:26:27 + | +LL | Some(Val::Foo) => 3; + | -- ^- help: use a comma to end a `match` arm expression: `,` + | | | + | | this statement is not surrounded by a body + | while parsing the `match` arm starting here + +error: `match` arm body without braces + --> $DIR/match-arm-without-braces.rs:31:11 + | +LL | Some(Val::Foo) => + | -- while parsing the `match` arm starting here +LL | / 7; +LL | | 8; + | |____________^ these statements are not surrounded by a body + | +help: surround the statements with a body + | +LL | { 7; +LL | 8; } + | + +error: `match` arm body without braces + --> $DIR/match-arm-without-braces.rs:37:11 + | +LL | Some(Val::Foo) => + | -- while parsing the `match` arm starting here +LL | / 11; +LL | | 12; + | |_____________^ these statements are not surrounded by a body + | +help: surround the statements with a body + | +LL | { 11; +LL | 12; } + | + +error: `match` arm body without braces + --> $DIR/match-arm-without-braces.rs:44:11 + | +LL | Some(Val::Foo) => + | -- while parsing the `match` arm starting here +LL | / 14; +LL | | 15; + | |_____________^ these statements are not surrounded by a body + | +help: surround the statements with a body + | +LL | { 14; +LL | 15; } + | + +error: expected one of `,`, `.`, `?`, `}`, or an operator, found reserved identifier `_` + --> $DIR/match-arm-without-braces.rs:49:9 + | +LL | Some(Val::Foo) => 17 + | -- - expected one of `,`, `.`, `?`, `}`, or an operator + | | + | while parsing the `match` arm starting here +LL | _ => 18, + | ^ unexpected token + +error: `match` arm body without braces + --> $DIR/match-arm-without-braces.rs:53:11 + | +LL | Some(Val::Foo) => + | -- while parsing the `match` arm starting here +LL | / 20; +LL | | 21 + | |____________^ these statements are not surrounded by a body + | +help: surround the statements with a body + | +LL | { 20; +LL | 21 } + | + +error: `match` arm body without braces + --> $DIR/match-arm-without-braces.rs:59:11 + | +LL | Some(Val::Foo) => + | -- while parsing the `match` arm starting here +LL | / 24; +LL | | 25 + | |____________^ these statements are not surrounded by a body + | +help: surround the statements with a body + | +LL | { 24; +LL | 25 } + | + +error: `match` arm body without braces + --> $DIR/match-arm-without-braces.rs:66:11 + | +LL | Some(Val::Foo) => + | -- while parsing the `match` arm starting here +LL | / 27; +LL | | 28 + | |____________^ these statements are not surrounded by a body + | +help: surround the statements with a body + | +LL | { 27; +LL | 28 } + | + +error: expected one of `,`, `.`, `?`, `}`, or an operator, found `;` + --> $DIR/match-arm-without-braces.rs:71:13 + | +LL | Some(Val::Foo) => + | -- while parsing the `match` arm starting here +LL | 30; + | ^ expected one of `,`, `.`, `?`, `}`, or an operator + +error: expected one of `,`, `.`, `?`, `}`, or an operator, found `;` + --> $DIR/match-arm-without-braces.rs:77:13 + | +LL | Some(Val::Foo) => + | -- while parsing the `match` arm starting here +LL | 34; + | ^ expected one of `,`, `.`, `?`, `}`, or an operator + +error: expected one of `,`, `.`, `?`, `}`, or an operator, found `;` + --> $DIR/match-arm-without-braces.rs:84:13 + | +LL | Some(Val::Foo) => + | -- while parsing the `match` arm starting here +LL | 37; + | ^ expected one of `,`, `.`, `?`, `}`, or an operator + +error: aborting due to 11 previous errors + diff --git a/src/test/ui/old-suffixes-are-really-forbidden.rs b/src/test/ui/parser/old-suffixes-are-really-forbidden.rs similarity index 100% rename from src/test/ui/old-suffixes-are-really-forbidden.rs rename to src/test/ui/parser/old-suffixes-are-really-forbidden.rs diff --git a/src/test/ui/old-suffixes-are-really-forbidden.stderr b/src/test/ui/parser/old-suffixes-are-really-forbidden.stderr similarity index 100% rename from src/test/ui/old-suffixes-are-really-forbidden.stderr rename to src/test/ui/parser/old-suffixes-are-really-forbidden.stderr diff --git a/src/test/ui/parser/parse-error-correct.stderr b/src/test/ui/parser/parse-error-correct.stderr index c54baf00b2..691df91268 100644 --- a/src/test/ui/parser/parse-error-correct.stderr +++ b/src/test/ui/parser/parse-error-correct.stderr @@ -14,7 +14,7 @@ error[E0618]: expected function, found `{integer}` --> $DIR/parse-error-correct.rs:7:13 | LL | let y = 42; - | - `{integer}` defined here + | - `y` has type `{integer}` LL | let x = y.; LL | let x = y.(); | ^--- diff --git a/src/test/ui/parser/recover-from-bad-variant.stderr b/src/test/ui/parser/recover-from-bad-variant.stderr index 89232a519d..9b9d2bc497 100644 --- a/src/test/ui/parser/recover-from-bad-variant.stderr +++ b/src/test/ui/parser/recover-from-bad-variant.stderr @@ -22,7 +22,12 @@ error[E0769]: tuple variant `Enum::Bar` written as struct variant --> $DIR/recover-from-bad-variant.rs:12:9 | LL | Enum::Bar { a, b } => {} - | ^^^^^^^^^^^^^^^^^^ help: use the tuple variant pattern syntax instead: `Enum::Bar(a, b)` + | ^^^^^^^^^^^^^^^^^^ + | +help: use the tuple variant pattern syntax instead + | +LL | Enum::Bar(a, b) => {} + | ^^^^^^ error: aborting due to 3 previous errors diff --git a/src/test/ui/parser/struct-field-numeric-shorthand.rs b/src/test/ui/parser/struct-field-numeric-shorthand.rs index 58c40b3d96..645abd9c71 100644 --- a/src/test/ui/parser/struct-field-numeric-shorthand.rs +++ b/src/test/ui/parser/struct-field-numeric-shorthand.rs @@ -5,5 +5,5 @@ fn main() { //~^ ERROR expected identifier, found `0` //~| ERROR expected identifier, found `1` //~| ERROR expected identifier, found `2` - //~| ERROR missing fields `0`, `1`, `2` in initializer of `Rgb` + //~| ERROR missing fields `0`, `1` and `2` in initializer of `Rgb` } diff --git a/src/test/ui/parser/struct-field-numeric-shorthand.stderr b/src/test/ui/parser/struct-field-numeric-shorthand.stderr index cfb1f82014..bfb8a931b6 100644 --- a/src/test/ui/parser/struct-field-numeric-shorthand.stderr +++ b/src/test/ui/parser/struct-field-numeric-shorthand.stderr @@ -22,11 +22,11 @@ LL | let _ = Rgb { 0, 1, 2 }; | | | while parsing this struct -error[E0063]: missing fields `0`, `1`, `2` in initializer of `Rgb` +error[E0063]: missing fields `0`, `1` and `2` in initializer of `Rgb` --> $DIR/struct-field-numeric-shorthand.rs:4:13 | LL | let _ = Rgb { 0, 1, 2 }; - | ^^^ missing `0`, `1`, `2` + | ^^^ missing `0`, `1` and `2` error: aborting due to 4 previous errors diff --git a/src/test/ui/struct-literal-variant-in-if.rs b/src/test/ui/parser/struct-literal-variant-in-if.rs similarity index 100% rename from src/test/ui/struct-literal-variant-in-if.rs rename to src/test/ui/parser/struct-literal-variant-in-if.rs diff --git a/src/test/ui/struct-literal-variant-in-if.stderr b/src/test/ui/parser/struct-literal-variant-in-if.stderr similarity index 96% rename from src/test/ui/struct-literal-variant-in-if.stderr rename to src/test/ui/parser/struct-literal-variant-in-if.stderr index a2252d4e4d..3ea5ca565c 100644 --- a/src/test/ui/struct-literal-variant-in-if.stderr +++ b/src/test/ui/parser/struct-literal-variant-in-if.stderr @@ -57,7 +57,7 @@ error[E0308]: mismatched types --> $DIR/struct-literal-variant-in-if.rs:10:20 | LL | if x == E::V { field } {} - | ---------------^^^^^--- help: consider using a semicolon here + | ---------------^^^^^-- | | | | | expected `()`, found `bool` | expected this to be `()` diff --git a/src/test/ui/parser/unclosed-delimiter-in-dep.stderr b/src/test/ui/parser/unclosed-delimiter-in-dep.stderr index d63a50034c..00861a5a3d 100644 --- a/src/test/ui/parser/unclosed-delimiter-in-dep.stderr +++ b/src/test/ui/parser/unclosed-delimiter-in-dep.stderr @@ -13,12 +13,12 @@ error[E0308]: mismatched types --> $DIR/unclosed-delimiter-in-dep.rs:4:20 | LL | let _: usize = unclosed_delim_mod::new(); - | ----- ^^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found enum `std::result::Result` + | ----- ^^^^^^^^^^^^^^^^^^^^^^^^^ expected `usize`, found enum `Result` | | | expected due to this | = note: expected type `usize` - found enum `std::result::Result` + found enum `Result` error: aborting due to 2 previous errors diff --git a/src/test/ui/parser/utf16-be-without-bom.rs b/src/test/ui/parser/utf16-be-without-bom.rs new file mode 100644 index 0000000000000000000000000000000000000000..22aa19717873a58a19379fb56c99177e018ecf06 GIT binary patch literal 125 zcmZX~!3x4a3`Nnb=PO=!6_nY}*JQ96km5^;DGK7hTi5RHg;Ogm!sD{_Oba&bTzbZFZAZlrE(0l(T82 zW@p;u!#wk2SSO*wC*7&|_o24PlQB{yqpkHu@|;cHVM`jz2_sQ3ensz9Pv4aa2HQ6nS0@&??6b3NHNJ=YT>q l47ehV@ypKpu2NP?+f9jS9QlTZY>2t0PpO>2w$7L&`2q8bkr4;41|h;qh2oriN8)wwQkm z?`)Cqj`T&1%OBKz)o1DiH@%z;0uM;7a!2>gCWr}hCnL~{8qH^obUW{$FEQ~Cs4^wk literal 0 HcmV?d00001 diff --git a/src/test/ui/parser/utf16-le-without-bom.stderr b/src/test/ui/parser/utf16-le-without-bom.stderr new file mode 100644 index 0000000000000000000000000000000000000000..4f4b91e39ed8779be5e03134b51ade7a8154ff05 GIT binary patch literal 3500 zcmds)O-sW-6h&v9UvUK&3XL|kmNK9#5rnQpcOprXmu6@>Q|7}~+WvQ^t(2~`11@BC zNq9--+{NKt(pqT_C#O;^B#bSzg{ooIlqAQSTXi=Hkf!%Ie|UPncDBw2X-nxs*hV>< zj@9f+8{X$VKZbQO8exr^Nd`7!1rz@2f?fK%72B}g2=Kli_49XVsGV~d<#b7?MN0-V zXDmu3Z6PFHUmnvTNS3Oi3YM0(<4;S=IhEEwkgjbp{EyAY4+79*V;_dF#|EEugXp8f53rrrTy)CILYx<6072%9 zGJ!Dv#TY>^P=Zlr5Ng6GLkQMkd@0=W>}VzUUiJUerhn)RO47FCxzgI!ZGN%93X-Zn-6 literal 0 HcmV?d00001 diff --git a/src/test/ui/partialeq_help.stderr b/src/test/ui/partialeq_help.stderr index 6decbef1af..e14e17c162 100644 --- a/src/test/ui/partialeq_help.stderr +++ b/src/test/ui/partialeq_help.stderr @@ -5,6 +5,10 @@ LL | a == b; | ^^ no implementation for `&T == T` | = help: the trait `PartialEq` is not implemented for `&T` +help: consider introducing a `where` bound, but there might be an alternative better way to express this requirement + | +LL | fn foo(a: &T, b: T) where &T: PartialEq { + | ^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error 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 index bfb7b47973..ff8183e876 100644 --- 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 @@ -33,7 +33,7 @@ error[E0382]: use of moved value --> $DIR/borrowck-move-and-move.rs:20:16 | LL | match Ok(U) { - | ----- move occurs because value has type `std::result::Result`, which does not implement the `Copy` trait + | ----- move occurs because value has type `Result`, which does not implement the `Copy` trait LL | a @ Ok(b) | a @ Err(b) => {} | -------^- | | | @@ -44,7 +44,7 @@ error[E0382]: use of moved value --> $DIR/borrowck-move-and-move.rs:20:29 | LL | match Ok(U) { - | ----- move occurs because value has type `std::result::Result`, which does not implement the `Copy` trait + | ----- move occurs because value has type `Result`, which does not implement the `Copy` trait LL | a @ Ok(b) | a @ Err(b) => {} | --------^- | | | 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 index 00136c2576..13032c3838 100644 --- 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 @@ -390,7 +390,7 @@ error[E0507]: cannot move out of `a` in pattern guard --> $DIR/borrowck-pat-ref-mut-and-ref.rs:111: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`, which does not implement the `Copy` trait + | ^ move occurs because `a` has type `&mut Result`, which does not implement the `Copy` trait | = note: variables bound in patterns cannot be moved from until after the end of the pattern guard @@ -398,7 +398,7 @@ error[E0507]: cannot move out of `a` in pattern guard --> $DIR/borrowck-pat-ref-mut-and-ref.rs:111: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`, which does not implement the `Copy` trait + | ^ move occurs because `a` has type `&mut Result`, which does not implement the `Copy` trait | = note: variables bound in patterns cannot be moved from until after the end of the pattern guard diff --git a/src/test/ui/pattern/issue-82290.rs b/src/test/ui/pattern/issue-82290.rs new file mode 100644 index 0000000000..67f0274fe7 --- /dev/null +++ b/src/test/ui/pattern/issue-82290.rs @@ -0,0 +1,7 @@ +#![feature(let_chains)] //~ WARN the feature `let_chains` is incomplete + +fn main() { + if true && let x = 1 { //~ ERROR `let` expressions are not supported here + let _ = x; + } +} diff --git a/src/test/ui/pattern/issue-82290.stderr b/src/test/ui/pattern/issue-82290.stderr new file mode 100644 index 0000000000..666b1e785b --- /dev/null +++ b/src/test/ui/pattern/issue-82290.stderr @@ -0,0 +1,19 @@ +error: `let` expressions are not supported here + --> $DIR/issue-82290.rs:4:16 + | +LL | if true && let x = 1 { + | ^^^^^^^^^ + | + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses + +warning: the feature `let_chains` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-82290.rs:1:12 + | +LL | #![feature(let_chains)] + | ^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #53667 for more information + +error: aborting due to previous error; 1 warning emitted + 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 index d57a8a0dbc..3a61d4293b 100644 --- a/src/test/ui/pattern/pat-struct-field-expr-has-type.stderr +++ b/src/test/ui/pattern/pat-struct-field-expr-has-type.stderr @@ -4,10 +4,10 @@ error[E0308]: mismatched types LL | match (S { f: 42 }) { | ------------- this expression has type `S` LL | S { f: Ok(_) } => {} - | ^^^^^ expected `u8`, found enum `std::result::Result` + | ^^^^^ expected `u8`, found enum `Result` | = note: expected type `u8` - found enum `std::result::Result<_, _>` + found enum `Result<_, _>` error: aborting due to previous error diff --git a/src/test/ui/pattern/pat-type-err-let-stmt.stderr b/src/test/ui/pattern/pat-type-err-let-stmt.stderr index 42258cfc1a..4b4fb08928 100644 --- a/src/test/ui/pattern/pat-type-err-let-stmt.stderr +++ b/src/test/ui/pattern/pat-type-err-let-stmt.stderr @@ -17,10 +17,10 @@ error[E0308]: mismatched types LL | let Ok(0): Option = 42u8; | ^^^^^ ---------- expected due to this | | - | expected enum `Option`, found enum `std::result::Result` + | expected enum `Option`, found enum `Result` | = note: expected enum `Option` - found enum `std::result::Result<_, _>` + found enum `Result<_, _>` error[E0308]: mismatched types --> $DIR/pat-type-err-let-stmt.rs:11:9 @@ -28,10 +28,10 @@ error[E0308]: mismatched types LL | let Ok(0): Option; | ^^^^^ ---------- expected due to this | | - | expected enum `Option`, found enum `std::result::Result` + | expected enum `Option`, found enum `Result` | = note: expected enum `Option` - found enum `std::result::Result<_, _>` + found enum `Result<_, _>` error[E0308]: mismatched types --> $DIR/pat-type-err-let-stmt.rs:15:9 @@ -39,10 +39,10 @@ error[E0308]: mismatched types LL | let Ok(0) = 42u8; | ^^^^^ ---- this expression has type `u8` | | - | expected `u8`, found enum `std::result::Result` + | expected `u8`, found enum `Result` | = note: expected type `u8` - found enum `std::result::Result<_, _>` + found enum `Result<_, _>` error: aborting due to 4 previous errors diff --git a/src/test/ui/pattern/usefulness/deny-irrefutable-let-patterns.rs b/src/test/ui/pattern/usefulness/deny-irrefutable-let-patterns.rs index 14040c8ada..7549eae701 100644 --- a/src/test/ui/pattern/usefulness/deny-irrefutable-let-patterns.rs +++ b/src/test/ui/pattern/usefulness/deny-irrefutable-let-patterns.rs @@ -1,9 +1,17 @@ +#![feature(if_let_guard)] +#![allow(incomplete_features)] + #![deny(irrefutable_let_patterns)] fn main() { - if let _ = 5 {} //~ ERROR irrefutable if-let pattern + if let _ = 5 {} //~ ERROR irrefutable `if let` pattern - while let _ = 5 { //~ ERROR irrefutable while-let pattern + while let _ = 5 { //~ ERROR irrefutable `while let` pattern break; } + + match 5 { + _ if let _ = 2 => {} //~ ERROR irrefutable `if let` guard pattern + _ => {} + } } diff --git a/src/test/ui/pattern/usefulness/deny-irrefutable-let-patterns.stderr b/src/test/ui/pattern/usefulness/deny-irrefutable-let-patterns.stderr index 308a6c7c58..d6926ee12e 100644 --- a/src/test/ui/pattern/usefulness/deny-irrefutable-let-patterns.stderr +++ b/src/test/ui/pattern/usefulness/deny-irrefutable-let-patterns.stderr @@ -1,22 +1,36 @@ -error: irrefutable if-let pattern - --> $DIR/deny-irrefutable-let-patterns.rs:4:5 +error: irrefutable `if let` pattern + --> $DIR/deny-irrefutable-let-patterns.rs:7:5 | LL | if let _ = 5 {} | ^^^^^^^^^^^^^^^ | note: the lint level is defined here - --> $DIR/deny-irrefutable-let-patterns.rs:1:9 + --> $DIR/deny-irrefutable-let-patterns.rs:4:9 | LL | #![deny(irrefutable_let_patterns)] | ^^^^^^^^^^^^^^^^^^^^^^^^ + = note: this pattern will always match, so the `if let` is useless + = help: consider replacing the `if let` with a `let` -error: irrefutable while-let pattern - --> $DIR/deny-irrefutable-let-patterns.rs:6:5 +error: irrefutable `while let` pattern + --> $DIR/deny-irrefutable-let-patterns.rs:9:5 | LL | / while let _ = 5 { LL | | break; LL | | } | |_____^ + | + = note: this pattern will always match, so the loop will never exit + = help: consider instead using a `loop { ... }` with a `let` inside it + +error: irrefutable `if let` guard pattern + --> $DIR/deny-irrefutable-let-patterns.rs:14:18 + | +LL | _ if let _ = 2 => {} + | ^ + | + = note: this pattern will always match, so the guard is useless + = help: consider removing the guard and adding a `let` inside the match arm -error: aborting due to 2 previous errors +error: aborting due to 3 previous errors diff --git a/src/test/ui/pattern/usefulness/issue-72377.rs b/src/test/ui/pattern/usefulness/issue-72377.rs new file mode 100644 index 0000000000..b0d8a53ed9 --- /dev/null +++ b/src/test/ui/pattern/usefulness/issue-72377.rs @@ -0,0 +1,17 @@ +#[derive(PartialEq, Eq)] +enum X { A, B, C, } + +fn main() { + let x = X::A; + let y = Some(X::A); + + match (x, y) { + //~^ ERROR non-exhaustive patterns: `(A, Some(A))`, `(A, Some(B))`, `(B, Some(B))` and 2 + //~| more not covered + (_, None) => false, + (v, Some(w)) if v == w => true, + (X::B, Some(X::C)) => false, + (X::B, Some(X::A)) => false, + (X::A, Some(X::C)) | (X::C, Some(X::A)) => false, + }; +} diff --git a/src/test/ui/pattern/usefulness/issue-72377.stderr b/src/test/ui/pattern/usefulness/issue-72377.stderr new file mode 100644 index 0000000000..b4a6833396 --- /dev/null +++ b/src/test/ui/pattern/usefulness/issue-72377.stderr @@ -0,0 +1,12 @@ +error[E0004]: non-exhaustive patterns: `(A, Some(A))`, `(A, Some(B))`, `(B, Some(B))` and 2 more not covered + --> $DIR/issue-72377.rs:8:11 + | +LL | match (x, y) { + | ^^^^^^ patterns `(A, Some(A))`, `(A, Some(B))`, `(B, Some(B))` and 2 more not covered + | + = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms + = note: the matched value is of type `(X, Option)` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0004`. diff --git a/src/test/ui/pattern/usefulness/issue-80501-or-pat-and-macro.rs b/src/test/ui/pattern/usefulness/issue-80501-or-pat-and-macro.rs new file mode 100644 index 0000000000..aac7d7d538 --- /dev/null +++ b/src/test/ui/pattern/usefulness/issue-80501-or-pat-and-macro.rs @@ -0,0 +1,27 @@ +// check-pass +#![deny(unreachable_patterns)] +pub enum TypeCtor { + Slice, + Array, +} + +pub struct ApplicationTy(TypeCtor); + +macro_rules! ty_app { + ($ctor:pat) => { + ApplicationTy($ctor) + }; +} + +fn _foo(ty: ApplicationTy) { + match ty { + ty_app!(TypeCtor::Array) | ty_app!(TypeCtor::Slice) => {} + } + + // same as above, with the macro expanded + match ty { + ApplicationTy(TypeCtor::Array) | ApplicationTy(TypeCtor::Slice) => {} + } +} + +fn main() {} 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 d1cab75210..928e906826 100644 --- a/src/test/ui/pattern/usefulness/non-exhaustive-match-nested.stderr +++ b/src/test/ui/pattern/usefulness/non-exhaustive-match-nested.stderr @@ -5,7 +5,7 @@ LL | match (l1, l2) { | ^^^^^^^^ pattern `(Some(&[]), Err(_))` not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms - = note: the matched value is of type `(Option<&[T]>, std::result::Result<&[T], ()>)` + = note: the matched value is of type `(Option<&[T]>, Result<&[T], ()>)` error[E0004]: non-exhaustive patterns: `A(C)` not covered --> $DIR/non-exhaustive-match-nested.rs:15:11 diff --git a/src/test/ui/polymorphization/promoted-function-3.rs b/src/test/ui/polymorphization/promoted-function-3.rs index 1c84df13e1..bbd991e36c 100644 --- a/src/test/ui/polymorphization/promoted-function-3.rs +++ b/src/test/ui/polymorphization/promoted-function-3.rs @@ -1,5 +1,5 @@ // run-pass -// compile-flags: -Zpolymorphize=on -Zmir-opt-level=3 +// compile-flags: -Zpolymorphize=on -Zmir-opt-level=4 fn caller() -> &'static usize { callee::() diff --git a/src/test/ui/privacy/associated-item-privacy-inherent.stderr b/src/test/ui/privacy/associated-item-privacy-inherent.stderr index 1e94e7c620..f8585014fd 100644 --- a/src/test/ui/privacy/associated-item-privacy-inherent.stderr +++ b/src/test/ui/privacy/associated-item-privacy-inherent.stderr @@ -222,7 +222,7 @@ error: type `priv_parent_substs::Priv` is private --> $DIR/associated-item-privacy-inherent.rs:101:9 | LL | Pub::CONST; - | ^^^^^^^^^^ private type + | ^^^ private type ... LL | priv_parent_substs::mac!(); | --------------------------- in this macro invocation diff --git a/src/test/ui/privacy/issue-46209-private-enum-variant-reexport.rs b/src/test/ui/privacy/issue-46209-private-enum-variant-reexport.rs index d54c993147..8f9dc4bc94 100644 --- a/src/test/ui/privacy/issue-46209-private-enum-variant-reexport.rs +++ b/src/test/ui/privacy/issue-46209-private-enum-variant-reexport.rs @@ -1,15 +1,16 @@ #![feature(crate_visibility_modifier)] +#[deny(unused_imports)] mod rank { pub use self::Professor::*; - //~^ ERROR enum is private and its variants cannot be re-exported + //~^ ERROR glob import doesn't reexport anything pub use self::Lieutenant::{JuniorGrade, Full}; - //~^ ERROR variant `JuniorGrade` is private and cannot be re-exported - //~| ERROR variant `Full` is private and cannot be re-exported + //~^ ERROR `JuniorGrade` is private, and cannot be re-exported + //~| ERROR `Full` is private, and cannot be re-exported pub use self::PettyOfficer::*; - //~^ ERROR enum is private and its variants cannot be re-exported + //~^ ERROR glob import doesn't reexport anything pub use self::Crewman::*; - //~^ ERROR enum is private and its variants cannot be re-exported + //~^ ERROR glob import doesn't reexport anything enum Professor { Adjunct, diff --git a/src/test/ui/privacy/issue-46209-private-enum-variant-reexport.stderr b/src/test/ui/privacy/issue-46209-private-enum-variant-reexport.stderr index b876bab6c5..d4d9b31ed8 100644 --- a/src/test/ui/privacy/issue-46209-private-enum-variant-reexport.stderr +++ b/src/test/ui/privacy/issue-46209-private-enum-variant-reexport.stderr @@ -1,44 +1,51 @@ -error: variant `JuniorGrade` is private and cannot be re-exported - --> $DIR/issue-46209-private-enum-variant-reexport.rs:6:32 +error[E0364]: `JuniorGrade` is private, and cannot be re-exported + --> $DIR/issue-46209-private-enum-variant-reexport.rs:7:32 + | +LL | pub use self::Lieutenant::{JuniorGrade, Full}; + | ^^^^^^^^^^^ + | +note: consider marking `JuniorGrade` as `pub` in the imported module + --> $DIR/issue-46209-private-enum-variant-reexport.rs:7:32 | LL | pub use self::Lieutenant::{JuniorGrade, Full}; | ^^^^^^^^^^^ -... -LL | enum Lieutenant { - | --------------- help: consider making the enum public: `pub enum Lieutenant` -error: variant `Full` is private and cannot be re-exported - --> $DIR/issue-46209-private-enum-variant-reexport.rs:6:45 +error[E0364]: `Full` is private, and cannot be re-exported + --> $DIR/issue-46209-private-enum-variant-reexport.rs:7:45 + | +LL | pub use self::Lieutenant::{JuniorGrade, Full}; + | ^^^^ + | +note: consider marking `Full` as `pub` in the imported module + --> $DIR/issue-46209-private-enum-variant-reexport.rs:7:45 | LL | pub use self::Lieutenant::{JuniorGrade, Full}; | ^^^^ -error: enum is private and its variants cannot be re-exported - --> $DIR/issue-46209-private-enum-variant-reexport.rs:4:13 +error: glob import doesn't reexport anything because no candidate is public enough + --> $DIR/issue-46209-private-enum-variant-reexport.rs:5:13 | LL | pub use self::Professor::*; | ^^^^^^^^^^^^^^^^^^ -... -LL | enum Professor { - | -------------- help: consider making the enum public: `pub enum Professor` + | +note: the lint level is defined here + --> $DIR/issue-46209-private-enum-variant-reexport.rs:3:8 + | +LL | #[deny(unused_imports)] + | ^^^^^^^^^^^^^^ -error: enum is private and its variants cannot be re-exported - --> $DIR/issue-46209-private-enum-variant-reexport.rs:9:13 +error: glob import doesn't reexport anything because no candidate is public enough + --> $DIR/issue-46209-private-enum-variant-reexport.rs:10:13 | LL | pub use self::PettyOfficer::*; | ^^^^^^^^^^^^^^^^^^^^^ -... -LL | pub(in rank) enum PettyOfficer { - | ------------------------------ help: consider making the enum public: `pub enum PettyOfficer` -error: enum is private and its variants cannot be re-exported - --> $DIR/issue-46209-private-enum-variant-reexport.rs:11:13 +error: glob import doesn't reexport anything because no candidate is public enough + --> $DIR/issue-46209-private-enum-variant-reexport.rs:12:13 | LL | pub use self::Crewman::*; | ^^^^^^^^^^^^^^^^ -... -LL | crate enum Crewman { - | ------------------ help: consider making the enum public: `pub enum Crewman` error: aborting due to 5 previous errors +For more information about this error, try `rustc --explain E0364`. diff --git a/src/test/ui/privacy/private-in-public-assoc-ty.full_tait.stderr b/src/test/ui/privacy/private-in-public-assoc-ty.full_tait.stderr new file mode 100644 index 0000000000..a74c7c93a2 --- /dev/null +++ b/src/test/ui/privacy/private-in-public-assoc-ty.full_tait.stderr @@ -0,0 +1,77 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/private-in-public-assoc-ty.rs:7:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0446]: private type `Priv` in public interface + --> $DIR/private-in-public-assoc-ty.rs:20:9 + | +LL | struct Priv; + | ------------ `Priv` declared as private +... +LL | type A = Priv; + | ^^^^^^^^^^^^^^ can't leak private type + +warning: private trait `PrivTr` in public interface (error E0445) + --> $DIR/private-in-public-assoc-ty.rs:27:9 + | +LL | type Alias1: PrivTr; + | ^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(private_in_public)]` 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 #34537 + +warning: private type `Priv` in public interface (error E0446) + --> $DIR/private-in-public-assoc-ty.rs:30:9 + | +LL | type Alias2: PubTrAux1 = 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 #34537 + +warning: private type `Priv` in public interface (error E0446) + --> $DIR/private-in-public-assoc-ty.rs:33:9 + | +LL | type Alias3: PubTrAux2 = 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 #34537 + +error[E0446]: private type `Priv` in public interface + --> $DIR/private-in-public-assoc-ty.rs:37:9 + | +LL | struct Priv; + | ------------ `Priv` declared as private +... +LL | type Alias4 = Priv; + | ^^^^^^^^^^^^^^^^^^^ can't leak private type + +error[E0446]: private type `Priv` in public interface + --> $DIR/private-in-public-assoc-ty.rs:44:9 + | +LL | struct Priv; + | ------------ `Priv` declared as private +... +LL | type Alias1 = Priv; + | ^^^^^^^^^^^^^^^^^^^ can't leak private type + +error[E0445]: private trait `PrivTr` in public interface + --> $DIR/private-in-public-assoc-ty.rs:47:9 + | +LL | trait PrivTr {} + | ------------ `PrivTr` declared as private +... +LL | type Exist = impl PrivTr; + | ^^^^^^^^^^^^^^^^^^^^^^^^^ can't leak private trait + +error: aborting due to 4 previous errors; 4 warnings emitted + +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-in-public-assoc-ty.stderr b/src/test/ui/privacy/private-in-public-assoc-ty.min_tait.stderr similarity index 93% rename from src/test/ui/privacy/private-in-public-assoc-ty.stderr rename to src/test/ui/privacy/private-in-public-assoc-ty.min_tait.stderr index ba62a228b0..36230ffd04 100644 --- a/src/test/ui/privacy/private-in-public-assoc-ty.stderr +++ b/src/test/ui/privacy/private-in-public-assoc-ty.min_tait.stderr @@ -1,5 +1,5 @@ error[E0446]: private type `Priv` in public interface - --> $DIR/private-in-public-assoc-ty.rs:17:9 + --> $DIR/private-in-public-assoc-ty.rs:20:9 | LL | struct Priv; | ------------ `Priv` declared as private @@ -8,7 +8,7 @@ LL | type A = Priv; | ^^^^^^^^^^^^^^ can't leak private type warning: private trait `PrivTr` in public interface (error E0445) - --> $DIR/private-in-public-assoc-ty.rs:24:9 + --> $DIR/private-in-public-assoc-ty.rs:27:9 | LL | type Alias1: PrivTr; | ^^^^^^^^^^^^^^^^^^^^ @@ -18,7 +18,7 @@ LL | type Alias1: PrivTr; = note: for more information, see issue #34537 warning: private type `Priv` in public interface (error E0446) - --> $DIR/private-in-public-assoc-ty.rs:27:9 + --> $DIR/private-in-public-assoc-ty.rs:30:9 | LL | type Alias2: PubTrAux1 = u8; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -27,7 +27,7 @@ LL | type Alias2: PubTrAux1 = u8; = note: for more information, see issue #34537 warning: private type `Priv` in public interface (error E0446) - --> $DIR/private-in-public-assoc-ty.rs:30:9 + --> $DIR/private-in-public-assoc-ty.rs:33:9 | LL | type Alias3: PubTrAux2 = u8; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -36,7 +36,7 @@ LL | type Alias3: PubTrAux2 = u8; = note: for more information, see issue #34537 error[E0446]: private type `Priv` in public interface - --> $DIR/private-in-public-assoc-ty.rs:34:9 + --> $DIR/private-in-public-assoc-ty.rs:37:9 | LL | struct Priv; | ------------ `Priv` declared as private @@ -45,7 +45,7 @@ LL | type Alias4 = Priv; | ^^^^^^^^^^^^^^^^^^^ can't leak private type error[E0446]: private type `Priv` in public interface - --> $DIR/private-in-public-assoc-ty.rs:41:9 + --> $DIR/private-in-public-assoc-ty.rs:44:9 | LL | struct Priv; | ------------ `Priv` declared as private @@ -54,7 +54,7 @@ LL | type Alias1 = Priv; | ^^^^^^^^^^^^^^^^^^^ can't leak private type error[E0445]: private trait `PrivTr` in public interface - --> $DIR/private-in-public-assoc-ty.rs:44:9 + --> $DIR/private-in-public-assoc-ty.rs:47:9 | LL | trait PrivTr {} | ------------ `PrivTr` declared as private 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 fba72c1317..f8fb565943 100644 --- a/src/test/ui/privacy/private-in-public-assoc-ty.rs +++ b/src/test/ui/privacy/private-in-public-assoc-ty.rs @@ -2,7 +2,10 @@ // This test also ensures that the checks are performed even inside private modules. #![feature(associated_type_defaults)] -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete mod m { struct Priv; diff --git a/src/test/ui/privacy/private-in-public-type-alias-impl-trait.full_tait.stderr b/src/test/ui/privacy/private-in-public-type-alias-impl-trait.full_tait.stderr new file mode 100644 index 0000000000..c419c7ee4d --- /dev/null +++ b/src/test/ui/privacy/private-in-public-type-alias-impl-trait.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/private-in-public-type-alias-impl-trait.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/privacy/private-in-public-type-alias-impl-trait.rs b/src/test/ui/privacy/private-in-public-type-alias-impl-trait.rs index 40bba720b0..8443631253 100644 --- a/src/test/ui/privacy/private-in-public-type-alias-impl-trait.rs +++ b/src/test/ui/privacy/private-in-public-type-alias-impl-trait.rs @@ -1,6 +1,9 @@ // build-pass (FIXME(62277): could be check-pass?) -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #![deny(private_in_public)] pub type Pub = impl Default; diff --git a/src/test/ui/privacy/private-inferred-type.stderr b/src/test/ui/privacy/private-inferred-type.stderr index 8c8163d390..11bcb9074d 100644 --- a/src/test/ui/privacy/private-inferred-type.stderr +++ b/src/test/ui/privacy/private-inferred-type.stderr @@ -56,7 +56,7 @@ error: type `Priv` is private --> $DIR/private-inferred-type.rs:104:5 | LL | m::Pub::INHERENT_ASSOC_CONST; - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ private type + | ^^^^^^ private type error: type `Priv` is private --> $DIR/private-inferred-type.rs:105:5 diff --git a/src/test/ui/privacy/private-variant-reexport.rs b/src/test/ui/privacy/private-variant-reexport.rs index 0722b815c1..ce1b0d321c 100644 --- a/src/test/ui/privacy/private-variant-reexport.rs +++ b/src/test/ui/privacy/private-variant-reexport.rs @@ -1,17 +1,18 @@ mod m1 { - pub use ::E::V; //~ ERROR variant `V` is private and cannot be re-exported + pub use ::E::V; //~ ERROR `V` is private, and cannot be re-exported } mod m2 { - pub use ::E::{V}; //~ ERROR variant `V` is private and cannot be re-exported + pub use ::E::{V}; //~ ERROR `V` is private, and cannot be re-exported } mod m3 { - pub use ::E::V::{self}; //~ ERROR variant `V` is private and cannot be re-exported + pub use ::E::V::{self}; //~ ERROR `V` is private, and cannot be re-exported } +#[deny(unused_imports)] mod m4 { - pub use ::E::*; //~ ERROR enum is private and its variants cannot be re-exported + pub use ::E::*; //~ ERROR glob import doesn't reexport anything } enum E { V } diff --git a/src/test/ui/privacy/private-variant-reexport.stderr b/src/test/ui/privacy/private-variant-reexport.stderr index 8e4c345286..7a4c3234db 100644 --- a/src/test/ui/privacy/private-variant-reexport.stderr +++ b/src/test/ui/privacy/private-variant-reexport.stderr @@ -1,29 +1,48 @@ -error: variant `V` is private and cannot be re-exported +error[E0364]: `V` is private, and cannot be re-exported + --> $DIR/private-variant-reexport.rs:2:13 + | +LL | pub use ::E::V; + | ^^^^^^ + | +note: consider marking `V` as `pub` in the imported module --> $DIR/private-variant-reexport.rs:2:13 | LL | pub use ::E::V; | ^^^^^^ -... -LL | enum E { V } - | ------ help: consider making the enum public: `pub enum E` -error: variant `V` is private and cannot be re-exported +error[E0364]: `V` is private, and cannot be re-exported + --> $DIR/private-variant-reexport.rs:6:19 + | +LL | pub use ::E::{V}; + | ^ + | +note: consider marking `V` as `pub` in the imported module --> $DIR/private-variant-reexport.rs:6:19 | LL | pub use ::E::{V}; | ^ -error: variant `V` is private and cannot be re-exported +error[E0365]: `V` is private, and cannot be re-exported --> $DIR/private-variant-reexport.rs:10:22 | LL | pub use ::E::V::{self}; - | ^^^^ + | ^^^^ re-export of private `V` + | + = note: consider declaring type or module `V` with `pub` -error: enum is private and its variants cannot be re-exported - --> $DIR/private-variant-reexport.rs:14:13 +error: glob import doesn't reexport anything because no candidate is public enough + --> $DIR/private-variant-reexport.rs:15:13 | LL | pub use ::E::*; | ^^^^^^ + | +note: the lint level is defined here + --> $DIR/private-variant-reexport.rs:13:8 + | +LL | #[deny(unused_imports)] + | ^^^^^^^^^^^^^^ error: aborting due to 4 previous errors +Some errors have detailed explanations: E0364, E0365. +For more information about an error, try `rustc --explain E0364`. diff --git a/src/test/ui/proc-macro/ambiguous-builtin-attrs.rs b/src/test/ui/proc-macro/ambiguous-builtin-attrs.rs index a6e9ed14ff..65d8bcd997 100644 --- a/src/test/ui/proc-macro/ambiguous-builtin-attrs.rs +++ b/src/test/ui/proc-macro/ambiguous-builtin-attrs.rs @@ -3,8 +3,8 @@ #![feature(decl_macro)] //~ ERROR `feature` is ambiguous extern crate builtin_attrs; -use builtin_attrs::{test, bench}; use builtin_attrs::*; +use builtin_attrs::{bench, test}; #[repr(C)] //~ ERROR `repr` is ambiguous struct S; diff --git a/src/test/ui/proc-macro/ambiguous-builtin-attrs.stderr b/src/test/ui/proc-macro/ambiguous-builtin-attrs.stderr index 31959248a6..1ad991db3b 100644 --- a/src/test/ui/proc-macro/ambiguous-builtin-attrs.stderr +++ b/src/test/ui/proc-macro/ambiguous-builtin-attrs.stderr @@ -12,7 +12,7 @@ LL | #[repr(C)] | = note: `repr` could refer to a built-in attribute note: `repr` could also refer to the attribute macro imported here - --> $DIR/ambiguous-builtin-attrs.rs:7:5 + --> $DIR/ambiguous-builtin-attrs.rs:6:5 | LL | use builtin_attrs::*; | ^^^^^^^^^^^^^^^^ @@ -26,7 +26,7 @@ LL | #[cfg_attr(all(), repr(C))] | = note: `repr` could refer to a built-in attribute note: `repr` could also refer to the attribute macro imported here - --> $DIR/ambiguous-builtin-attrs.rs:7:5 + --> $DIR/ambiguous-builtin-attrs.rs:6:5 | LL | use builtin_attrs::*; | ^^^^^^^^^^^^^^^^ @@ -40,7 +40,7 @@ LL | fn non_macro_expanded_location<#[repr(C)] T>() { | = note: `repr` could refer to a built-in attribute note: `repr` could also refer to the attribute macro imported here - --> $DIR/ambiguous-builtin-attrs.rs:7:5 + --> $DIR/ambiguous-builtin-attrs.rs:6:5 | LL | use builtin_attrs::*; | ^^^^^^^^^^^^^^^^ @@ -54,7 +54,7 @@ LL | #[repr(C)] | = note: `repr` could refer to a built-in attribute note: `repr` could also refer to the attribute macro imported here - --> $DIR/ambiguous-builtin-attrs.rs:7:5 + --> $DIR/ambiguous-builtin-attrs.rs:6:5 | LL | use builtin_attrs::*; | ^^^^^^^^^^^^^^^^ @@ -82,7 +82,7 @@ LL | #![feature(decl_macro)] | = note: `feature` could refer to a built-in attribute note: `feature` could also refer to the attribute macro imported here - --> $DIR/ambiguous-builtin-attrs.rs:7:5 + --> $DIR/ambiguous-builtin-attrs.rs:6:5 | LL | use builtin_attrs::*; | ^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/proc-macro/attr-complex-fn.rs b/src/test/ui/proc-macro/attr-complex-fn.rs new file mode 100644 index 0000000000..47734c94fe --- /dev/null +++ b/src/test/ui/proc-macro/attr-complex-fn.rs @@ -0,0 +1,26 @@ +// check-pass +// compile-flags: -Z span-debug --error-format human +// aux-build:test-macros.rs + +#![feature(stmt_expr_attributes)] +#![feature(custom_inner_attributes)] +#![feature(rustc_attrs)] + +#![no_std] // Don't load unnecessary hygiene information from std +extern crate std; + +#[macro_use] +extern crate test_macros; + +trait MyTrait {} +struct MyStruct; + +#[print_attr] +fn foo>>() {} + +impl MyTrait for MyStruct<{true}> { + #![print_attr] + #![rustc_dummy] +} + +fn main() {} diff --git a/src/test/ui/proc-macro/attr-complex-fn.stdout b/src/test/ui/proc-macro/attr-complex-fn.stdout new file mode 100644 index 0000000000..a395a9ac3e --- /dev/null +++ b/src/test/ui/proc-macro/attr-complex-fn.stdout @@ -0,0 +1,171 @@ +PRINT-ATTR INPUT (DISPLAY): fn foo < T : MyTrait < MyStruct < { true } >> > () { } +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Ident { + ident: "fn", + span: $DIR/attr-complex-fn.rs:19:1: 19:3 (#0), + }, + Ident { + ident: "foo", + span: $DIR/attr-complex-fn.rs:19:4: 19:7 (#0), + }, + Punct { + ch: '<', + spacing: Alone, + span: $DIR/attr-complex-fn.rs:19:7: 19:8 (#0), + }, + Ident { + ident: "T", + span: $DIR/attr-complex-fn.rs:19:8: 19:9 (#0), + }, + Punct { + ch: ':', + spacing: Alone, + span: $DIR/attr-complex-fn.rs:19:9: 19:10 (#0), + }, + Ident { + ident: "MyTrait", + span: $DIR/attr-complex-fn.rs:19:11: 19:18 (#0), + }, + Punct { + ch: '<', + spacing: Alone, + span: $DIR/attr-complex-fn.rs:19:18: 19:19 (#0), + }, + Ident { + ident: "MyStruct", + span: $DIR/attr-complex-fn.rs:19:19: 19:27 (#0), + }, + Punct { + ch: '<', + spacing: Alone, + span: $DIR/attr-complex-fn.rs:19:27: 19:28 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "true", + span: $DIR/attr-complex-fn.rs:19:30: 19:34 (#0), + }, + ], + span: $DIR/attr-complex-fn.rs:19:28: 19:36 (#0), + }, + Punct { + ch: '>', + spacing: Joint, + span: $DIR/attr-complex-fn.rs:19:36: 19:38 (#0), + }, + Punct { + ch: '>', + spacing: Joint, + span: $DIR/attr-complex-fn.rs:19:36: 19:38 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/attr-complex-fn.rs:19:38: 19:39 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [], + span: $DIR/attr-complex-fn.rs:19:39: 19:41 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [], + span: $DIR/attr-complex-fn.rs:19:42: 19:44 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): impl < T > MyTrait < T > for MyStruct < { true } > { # ! [rustc_dummy] } +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Ident { + ident: "impl", + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + Punct { + ch: '<', + spacing: Alone, + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + Ident { + ident: "T", + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + Ident { + ident: "MyTrait", + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + Punct { + ch: '<', + spacing: Alone, + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + Ident { + ident: "T", + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + Ident { + ident: "for", + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + Ident { + ident: "MyStruct", + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + Punct { + ch: '<', + spacing: Alone, + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "true", + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + ], + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Punct { + ch: '#', + spacing: Joint, + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + Punct { + ch: '!', + spacing: Alone, + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "rustc_dummy", + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + ], + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, + ], + span: $DIR/attr-complex-fn.rs:21:1: 24:2 (#0), + }, +] diff --git a/src/test/ui/proc-macro/attribute-after-derive-feature-gate.rs b/src/test/ui/proc-macro/attribute-after-derive-feature-gate.rs new file mode 100644 index 0000000000..f0fec67824 --- /dev/null +++ b/src/test/ui/proc-macro/attribute-after-derive-feature-gate.rs @@ -0,0 +1,37 @@ +// gate-test-macro_attributes_in_derive_output +// aux-build: test-macros.rs + +#![feature(proc_macro_hygiene)] +#![feature(stmt_expr_attributes)] + +#[macro_use] +extern crate test_macros; + +#[derive(Empty)] +#[empty_attr] //~ ERROR macro attributes in `#[derive]` output are unstable +struct S1 { + field: [u8; 10], +} + +#[derive(Empty)] +#[empty_helper] +#[empty_attr] //~ ERROR macro attributes in `#[derive]` output are unstable +struct S2 { + field: [u8; 10], +} + +#[derive(Empty)] +struct S3 { + field: [u8; #[identity_attr] 10], //~ ERROR macro attributes in `#[derive]` output are unstable +} + +#[derive(Empty)] +struct S4 { + field: [u8; { + #[derive(Empty)] // OK, not gated + struct Inner; + 10 + }] +} + +fn main() {} diff --git a/src/test/ui/proc-macro/attribute-after-derive-feature-gate.stderr b/src/test/ui/proc-macro/attribute-after-derive-feature-gate.stderr new file mode 100644 index 0000000000..74cace628b --- /dev/null +++ b/src/test/ui/proc-macro/attribute-after-derive-feature-gate.stderr @@ -0,0 +1,30 @@ +error[E0658]: macro attributes in `#[derive]` output are unstable + --> $DIR/attribute-after-derive-feature-gate.rs:11:3 + | +LL | #[empty_attr] + | ^^^^^^^^^^ + | + = note: see issue #81119 for more information + = help: add `#![feature(macro_attributes_in_derive_output)]` to the crate attributes to enable + +error[E0658]: macro attributes in `#[derive]` output are unstable + --> $DIR/attribute-after-derive-feature-gate.rs:18:3 + | +LL | #[empty_attr] + | ^^^^^^^^^^ + | + = note: see issue #81119 for more information + = help: add `#![feature(macro_attributes_in_derive_output)]` to the crate attributes to enable + +error[E0658]: macro attributes in `#[derive]` output are unstable + --> $DIR/attribute-after-derive-feature-gate.rs:25:19 + | +LL | field: [u8; #[identity_attr] 10], + | ^^^^^^^^^^^^^ + | + = note: see issue #81119 for more information + = help: add `#![feature(macro_attributes_in_derive_output)]` 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/proc-macro/attribute-after-derive.rs b/src/test/ui/proc-macro/attribute-after-derive.rs new file mode 100644 index 0000000000..ac3f28b6ef --- /dev/null +++ b/src/test/ui/proc-macro/attribute-after-derive.rs @@ -0,0 +1,30 @@ +// Macro attributes are allowed after `#[derive]` and +// `#[derive]` fully configures the item for following attributes. + +// check-pass +// compile-flags: -Z span-debug +// aux-build: test-macros.rs + +#![feature(macro_attributes_in_derive_output)] + +#![no_std] // Don't load unnecessary hygiene information from std +extern crate std; + +#[macro_use] +extern crate test_macros; + +#[print_attr] +#[derive(Print)] +struct AttributeDerive { + #[cfg(FALSE)] + field: u8, +} + +#[derive(Print)] +#[print_attr] +struct DeriveAttribute { + #[cfg(FALSE)] + field: u8, +} + +fn main() {} diff --git a/src/test/ui/proc-macro/attribute-after-derive.stdout b/src/test/ui/proc-macro/attribute-after-derive.stdout new file mode 100644 index 0000000000..11f4923532 --- /dev/null +++ b/src/test/ui/proc-macro/attribute-after-derive.stdout @@ -0,0 +1,148 @@ +PRINT-ATTR INPUT (DISPLAY): #[derive(Print)] struct AttributeDerive { #[cfg(FALSE)] field : u8, } +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Punct { + ch: '#', + spacing: Alone, + span: $DIR/attribute-after-derive.rs:17:1: 17:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "derive", + span: $DIR/attribute-after-derive.rs:17:3: 17:9 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "Print", + span: $DIR/attribute-after-derive.rs:17:10: 17:15 (#0), + }, + ], + span: $DIR/attribute-after-derive.rs:17:9: 17:16 (#0), + }, + ], + span: $DIR/attribute-after-derive.rs:17:2: 17:17 (#0), + }, + Ident { + ident: "struct", + span: $DIR/attribute-after-derive.rs:18:1: 18:7 (#0), + }, + Ident { + ident: "AttributeDerive", + span: $DIR/attribute-after-derive.rs:18:8: 18:23 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Punct { + ch: '#', + spacing: Alone, + span: $DIR/attribute-after-derive.rs:19:5: 19:6 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "cfg", + span: $DIR/attribute-after-derive.rs:19:7: 19:10 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "FALSE", + span: $DIR/attribute-after-derive.rs:19:11: 19:16 (#0), + }, + ], + span: $DIR/attribute-after-derive.rs:19:10: 19:17 (#0), + }, + ], + span: $DIR/attribute-after-derive.rs:19:6: 19:18 (#0), + }, + Ident { + ident: "field", + span: $DIR/attribute-after-derive.rs:20:5: 20:10 (#0), + }, + Punct { + ch: ':', + spacing: Alone, + span: $DIR/attribute-after-derive.rs:20:10: 20:11 (#0), + }, + Ident { + ident: "u8", + span: $DIR/attribute-after-derive.rs:20:12: 20:14 (#0), + }, + Punct { + ch: ',', + spacing: Alone, + span: $DIR/attribute-after-derive.rs:20:14: 20:15 (#0), + }, + ], + span: $DIR/attribute-after-derive.rs:18:24: 21:2 (#0), + }, +] +PRINT-DERIVE INPUT (DISPLAY): struct AttributeDerive { } +PRINT-DERIVE INPUT (DEBUG): TokenStream [ + Ident { + ident: "struct", + span: $DIR/attribute-after-derive.rs:18:1: 21:2 (#0), + }, + Ident { + ident: "AttributeDerive", + span: $DIR/attribute-after-derive.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [], + span: $DIR/attribute-after-derive.rs:18:1: 21:2 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): struct DeriveAttribute { } +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Ident { + ident: "struct", + span: $DIR/attribute-after-derive.rs:25:1: 28:2 (#0), + }, + Ident { + ident: "DeriveAttribute", + span: $DIR/attribute-after-derive.rs:25:1: 28:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [], + span: $DIR/attribute-after-derive.rs:25:1: 28:2 (#0), + }, +] +PRINT-DERIVE INPUT (DISPLAY): #[print_attr] struct DeriveAttribute { } +PRINT-DERIVE INPUT (DEBUG): TokenStream [ + Punct { + ch: '#', + spacing: Alone, + span: $DIR/attribute-after-derive.rs:25:1: 28:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "print_attr", + span: $DIR/attribute-after-derive.rs:25:1: 28:2 (#0), + }, + ], + span: $DIR/attribute-after-derive.rs:25:1: 28:2 (#0), + }, + Ident { + ident: "struct", + span: $DIR/attribute-after-derive.rs:25:1: 28:2 (#0), + }, + Ident { + ident: "DeriveAttribute", + span: $DIR/attribute-after-derive.rs:25:1: 28:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [], + span: $DIR/attribute-after-derive.rs:25:1: 28:2 (#0), + }, +] diff --git a/src/test/ui/proc-macro/attribute-order-restricted.rs b/src/test/ui/proc-macro/attribute-order-restricted.rs deleted file mode 100644 index a3d4d23450..0000000000 --- a/src/test/ui/proc-macro/attribute-order-restricted.rs +++ /dev/null @@ -1,14 +0,0 @@ -// aux-build:test-macros.rs - -#[macro_use] -extern crate test_macros; - -#[identity_attr] // OK -#[derive(Clone)] -struct Before; - -#[derive(Clone)] -#[identity_attr] //~ ERROR macro attributes must be placed before `#[derive]` -struct After; - -fn main() {} diff --git a/src/test/ui/proc-macro/attribute-order-restricted.stderr b/src/test/ui/proc-macro/attribute-order-restricted.stderr deleted file mode 100644 index 9ca8a443e4..0000000000 --- a/src/test/ui/proc-macro/attribute-order-restricted.stderr +++ /dev/null @@ -1,8 +0,0 @@ -error: macro attributes must be placed before `#[derive]` - --> $DIR/attribute-order-restricted.rs:11:1 - | -LL | #[identity_attr] - | ^^^^^^^^^^^^^^^^ - -error: aborting due to previous error - diff --git a/src/test/ui/proc-macro/auxiliary/test-macros.rs b/src/test/ui/proc-macro/auxiliary/test-macros.rs index 57a7ffa39e..1a50036164 100644 --- a/src/test/ui/proc-macro/auxiliary/test-macros.rs +++ b/src/test/ui/proc-macro/auxiliary/test-macros.rs @@ -7,7 +7,7 @@ #![crate_type = "proc-macro"] extern crate proc_macro; -use proc_macro::TokenStream; +use proc_macro::{TokenStream, TokenTree}; // Macro that return empty token stream. @@ -80,6 +80,10 @@ pub fn recollect_derive(input: TokenStream) -> TokenStream { // Macros that print their input in the original and re-collected forms (if they differ). fn print_helper(input: TokenStream, kind: &str) -> TokenStream { + print_helper_ext(input, kind, true) +} + +fn print_helper_ext(input: TokenStream, kind: &str, debug: bool) -> TokenStream { let input_display = format!("{}", input); let input_debug = format!("{:#?}", input); let recollected = input.into_iter().collect(); @@ -89,9 +93,11 @@ fn print_helper(input: TokenStream, kind: &str) -> TokenStream { if recollected_display != input_display { println!("PRINT-{} RE-COLLECTED (DISPLAY): {}", kind, recollected_display); } - println!("PRINT-{} INPUT (DEBUG): {}", kind, input_debug); - if recollected_debug != input_debug { - println!("PRINT-{} RE-COLLECTED (DEBUG): {}", kind, recollected_debug); + if debug { + println!("PRINT-{} INPUT (DEBUG): {}", kind, input_debug); + if recollected_debug != input_debug { + println!("PRINT-{} RE-COLLECTED (DEBUG): {}", kind, recollected_debug); + } } recollected } @@ -108,8 +114,12 @@ pub fn print_bang_consume(input: TokenStream) -> TokenStream { } #[proc_macro_attribute] -pub fn print_attr(_: TokenStream, input: TokenStream) -> TokenStream { - print_helper(input, "ATTR") +pub fn print_attr(args: TokenStream, input: TokenStream) -> TokenStream { + let debug = match &args.into_iter().collect::>()[..] { + [TokenTree::Ident(ident)] if ident.to_string() == "nodebug" => false, + _ => true, + }; + print_helper_ext(input, "ATTR", debug) } #[proc_macro_attribute] @@ -118,6 +128,20 @@ pub fn print_attr_args(args: TokenStream, input: TokenStream) -> TokenStream { input } +#[proc_macro_attribute] +pub fn print_target_and_args(args: TokenStream, input: TokenStream) -> TokenStream { + print_helper(args, "ATTR_ARGS"); + print_helper(input.clone(), "ATTR"); + input +} + +#[proc_macro_attribute] +pub fn print_target_and_args_consume(args: TokenStream, input: TokenStream) -> TokenStream { + print_helper(args, "ATTR_ARGS"); + print_helper(input.clone(), "ATTR"); + TokenStream::new() +} + #[proc_macro_derive(Print, attributes(print_helper))] pub fn print_derive(input: TokenStream) -> TokenStream { print_helper(input, "DERIVE"); diff --git a/src/test/ui/proc-macro/cfg-eval-fail.rs b/src/test/ui/proc-macro/cfg-eval-fail.rs new file mode 100644 index 0000000000..379491f312 --- /dev/null +++ b/src/test/ui/proc-macro/cfg-eval-fail.rs @@ -0,0 +1,9 @@ +#![feature(cfg_eval)] +#![feature(stmt_expr_attributes)] + +fn main() { + let _ = #[cfg_eval] #[cfg(FALSE)] 0; + //~^ ERROR removing an expression is not supported in this position + //~| ERROR removing an expression is not supported in this position + //~| ERROR removing an expression is not supported in this position +} diff --git a/src/test/ui/proc-macro/cfg-eval-fail.stderr b/src/test/ui/proc-macro/cfg-eval-fail.stderr new file mode 100644 index 0000000000..010ac006b0 --- /dev/null +++ b/src/test/ui/proc-macro/cfg-eval-fail.stderr @@ -0,0 +1,20 @@ +error: removing an expression is not supported in this position + --> $DIR/cfg-eval-fail.rs:5:25 + | +LL | let _ = #[cfg_eval] #[cfg(FALSE)] 0; + | ^^^^^^^^^^^^^ + +error: removing an expression is not supported in this position + --> $DIR/cfg-eval-fail.rs:5:25 + | +LL | let _ = #[cfg_eval] #[cfg(FALSE)] 0; + | ^^^^^^^^^^^^^ + +error: removing an expression is not supported in this position + --> $DIR/cfg-eval-fail.rs:5:25 + | +LL | let _ = #[cfg_eval] #[cfg(FALSE)] 0; + | ^^^^^^^^^^^^^ + +error: aborting due to 3 previous errors + diff --git a/src/test/ui/proc-macro/cfg-eval.rs b/src/test/ui/proc-macro/cfg-eval.rs new file mode 100644 index 0000000000..ea397df545 --- /dev/null +++ b/src/test/ui/proc-macro/cfg-eval.rs @@ -0,0 +1,32 @@ +// check-pass +// compile-flags: -Z span-debug +// aux-build:test-macros.rs + +#![feature(cfg_eval)] +#![feature(proc_macro_hygiene)] +#![feature(stmt_expr_attributes)] + +#![no_std] // Don't load unnecessary hygiene information from std +extern crate std; + +#[macro_use] +extern crate test_macros; + +#[cfg_eval] +#[print_attr] +struct S1 { + #[cfg(FALSE)] + field_false: u8, + #[cfg(all(/*true*/))] + #[cfg_attr(FALSE, unknown_attr)] + #[cfg_attr(all(/*true*/), allow())] + field_true: u8, +} + +#[cfg_eval] +#[cfg(FALSE)] +struct S2 {} + +fn main() { + let _ = #[cfg_eval] #[print_attr](#[cfg(FALSE)] 0, #[cfg(all(/*true*/))] 1); +} diff --git a/src/test/ui/proc-macro/cfg-eval.stdout b/src/test/ui/proc-macro/cfg-eval.stdout new file mode 100644 index 0000000000..b98e8961bf --- /dev/null +++ b/src/test/ui/proc-macro/cfg-eval.stdout @@ -0,0 +1,135 @@ +PRINT-ATTR INPUT (DISPLAY): struct S1 { #[cfg(all())] #[allow()] field_true : u8, } +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Ident { + ident: "struct", + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + Ident { + ident: "S1", + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Punct { + ch: '#', + spacing: Alone, + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "cfg", + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "all", + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [], + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + ], + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + ], + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + Punct { + ch: '#', + spacing: Alone, + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "allow", + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [], + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + ], + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + Ident { + ident: "field_true", + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + Punct { + ch: ':', + spacing: Alone, + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + Ident { + ident: "u8", + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + Punct { + ch: ',', + spacing: Alone, + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, + ], + span: $DIR/cfg-eval.rs:17:1: 24:2 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): (#[cfg(all())] 1,) +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Punct { + ch: '#', + spacing: Alone, + span: $DIR/cfg-eval.rs:31:38: 31:80 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "cfg", + span: $DIR/cfg-eval.rs:31:38: 31:80 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "all", + span: $DIR/cfg-eval.rs:31:38: 31:80 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [], + span: $DIR/cfg-eval.rs:31:38: 31:80 (#0), + }, + ], + span: $DIR/cfg-eval.rs:31:38: 31:80 (#0), + }, + ], + span: $DIR/cfg-eval.rs:31:38: 31:80 (#0), + }, + Literal { + kind: Integer, + symbol: "1", + suffix: None, + span: $DIR/cfg-eval.rs:31:38: 31:80 (#0), + }, + Punct { + ch: ',', + spacing: Alone, + span: $DIR/cfg-eval.rs:31:38: 31:80 (#0), + }, + ], + span: $DIR/cfg-eval.rs:31:38: 31:80 (#0), + }, +] diff --git a/src/test/ui/proc-macro/derive-helper-legacy-limits.rs b/src/test/ui/proc-macro/derive-helper-legacy-limits.rs new file mode 100644 index 0000000000..ca904900da --- /dev/null +++ b/src/test/ui/proc-macro/derive-helper-legacy-limits.rs @@ -0,0 +1,21 @@ +// Support for legacy derive helpers is limited and heuristic-based +// (that's exactly the reason why they are deprecated). + +// edition:2018 +// aux-build:test-macros.rs + +#[macro_use] +extern crate test_macros; + +use derive as my_derive; + +#[my_derive(Empty)] +#[empty_helper] // OK +struct S1; + +// Legacy helper detection doesn't see through `derive` renaming. +#[empty_helper] //~ ERROR cannot find attribute `empty_helper` in this scope +#[my_derive(Empty)] +struct S2; + +fn main() {} diff --git a/src/test/ui/proc-macro/derive-helper-legacy-limits.stderr b/src/test/ui/proc-macro/derive-helper-legacy-limits.stderr new file mode 100644 index 0000000000..186f38a00f --- /dev/null +++ b/src/test/ui/proc-macro/derive-helper-legacy-limits.stderr @@ -0,0 +1,8 @@ +error: cannot find attribute `empty_helper` in this scope + --> $DIR/derive-helper-legacy-limits.rs:17:3 + | +LL | #[empty_helper] + | ^^^^^^^^^^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/proc-macro/derive-helper-legacy-spurious.rs b/src/test/ui/proc-macro/derive-helper-legacy-spurious.rs new file mode 100644 index 0000000000..4a7e48eed4 --- /dev/null +++ b/src/test/ui/proc-macro/derive-helper-legacy-spurious.rs @@ -0,0 +1,12 @@ +// aux-build:test-macros.rs + +#![dummy] //~ ERROR cannot find attribute `dummy` in this scope + +#[macro_use] +extern crate test_macros; + +#[derive(Empty)] //~ ERROR cannot determine resolution for the attribute macro `derive` +#[empty_helper] //~ ERROR cannot find attribute `empty_helper` in this scope +struct Foo {} + +fn main() {} diff --git a/src/test/ui/proc-macro/derive-helper-legacy-spurious.stderr b/src/test/ui/proc-macro/derive-helper-legacy-spurious.stderr new file mode 100644 index 0000000000..fd1ed8a3d0 --- /dev/null +++ b/src/test/ui/proc-macro/derive-helper-legacy-spurious.stderr @@ -0,0 +1,22 @@ +error: cannot find attribute `dummy` in this scope + --> $DIR/derive-helper-legacy-spurious.rs:3:4 + | +LL | #![dummy] + | ^^^^^ + +error: cannot determine resolution for the attribute macro `derive` + --> $DIR/derive-helper-legacy-spurious.rs:8:3 + | +LL | #[derive(Empty)] + | ^^^^^^ + | + = note: import resolution is stuck, try simplifying macro imports + +error: cannot find attribute `empty_helper` in this scope + --> $DIR/derive-helper-legacy-spurious.rs:9:3 + | +LL | #[empty_helper] + | ^^^^^^^^^^^^ + +error: aborting due to 3 previous errors + diff --git a/src/test/ui/proc-macro/derive-helper-shadowing.rs b/src/test/ui/proc-macro/derive-helper-shadowing.rs index 6147e96a74..80d982d250 100644 --- a/src/test/ui/proc-macro/derive-helper-shadowing.rs +++ b/src/test/ui/proc-macro/derive-helper-shadowing.rs @@ -17,6 +17,8 @@ macro_rules! gen_helper_use { } #[empty_helper] //~ ERROR `empty_helper` is ambiguous + //~| WARN derive helper attribute is used before it is introduced + //~| WARN this was previously accepted #[derive(Empty)] struct S { #[empty_helper] // OK, no ambiguity, derive helpers have highest priority diff --git a/src/test/ui/proc-macro/derive-helper-shadowing.stderr b/src/test/ui/proc-macro/derive-helper-shadowing.stderr index f82f49aa77..a49df9f2d4 100644 --- a/src/test/ui/proc-macro/derive-helper-shadowing.stderr +++ b/src/test/ui/proc-macro/derive-helper-shadowing.stderr @@ -1,17 +1,17 @@ error: cannot use a derive helper attribute through an import - --> $DIR/derive-helper-shadowing.rs:40:15 + --> $DIR/derive-helper-shadowing.rs:42:15 | LL | #[renamed] | ^^^^^^^ | note: the derive helper attribute imported here - --> $DIR/derive-helper-shadowing.rs:39:17 + --> $DIR/derive-helper-shadowing.rs:41:17 | LL | use empty_helper as renamed; | ^^^^^^^^^^^^^^^^^^^^^^^ error: cannot find attribute `empty_helper` in this scope - --> $DIR/derive-helper-shadowing.rs:36:22 + --> $DIR/derive-helper-shadowing.rs:38:22 | LL | #[derive(GenHelperUse)] | ^^^^^^^^^^^^ @@ -30,13 +30,13 @@ LL | gen_helper_use!(); = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0659]: `empty_helper` is ambiguous (name vs any other name during import resolution) - --> $DIR/derive-helper-shadowing.rs:24:13 + --> $DIR/derive-helper-shadowing.rs:26:13 | LL | use empty_helper; | ^^^^^^^^^^^^ ambiguous name | note: `empty_helper` could refer to the derive helper attribute defined here - --> $DIR/derive-helper-shadowing.rs:20:10 + --> $DIR/derive-helper-shadowing.rs:22:10 | LL | #[derive(Empty)] | ^^^^^ @@ -54,7 +54,7 @@ LL | #[empty_helper] | ^^^^^^^^^^^^ ambiguous name | note: `empty_helper` could refer to the derive helper attribute defined here - --> $DIR/derive-helper-shadowing.rs:20:10 + --> $DIR/derive-helper-shadowing.rs:22:10 | LL | #[derive(Empty)] | ^^^^^ @@ -65,6 +65,19 @@ LL | use test_macros::empty_attr as empty_helper; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = help: use `crate::empty_helper` to refer to this attribute macro unambiguously -error: aborting due to 5 previous errors +warning: derive helper attribute is used before it is introduced + --> $DIR/derive-helper-shadowing.rs:19:3 + | +LL | #[empty_helper] + | ^^^^^^^^^^^^ +... +LL | #[derive(Empty)] + | ----- the attribute is introduced here + | + = note: `#[warn(legacy_derive_helpers)]` 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 #79202 + +error: aborting due to 5 previous errors; 1 warning emitted For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/proc-macro/derive-helper-vs-legacy.rs b/src/test/ui/proc-macro/derive-helper-vs-legacy.rs new file mode 100644 index 0000000000..98836bcb89 --- /dev/null +++ b/src/test/ui/proc-macro/derive-helper-vs-legacy.rs @@ -0,0 +1,12 @@ +// check-pass +// aux-build:test-macros.rs + +#[macro_use] +extern crate test_macros; + +#[derive(Empty)] +#[empty_helper] // OK, this is both derive helper and legacy derive helper +#[derive(Empty)] +struct S; + +fn main() {} diff --git a/src/test/ui/proc-macro/derive-multiple-with-packed.rs b/src/test/ui/proc-macro/derive-multiple-with-packed.rs new file mode 100644 index 0000000000..23578aa0e9 --- /dev/null +++ b/src/test/ui/proc-macro/derive-multiple-with-packed.rs @@ -0,0 +1,11 @@ +// check-pass + +#[derive(Clone, Copy)] +#[derive(Debug)] // OK, even if `Copy` is in the different `#[derive]` +#[derive(PartialEq)] // OK too +#[repr(packed)] +struct CacheRecordHeader { + field: u64, +} + +fn main() {} diff --git a/src/test/ui/proc-macro/expand-to-derive.rs b/src/test/ui/proc-macro/expand-to-derive.rs new file mode 100644 index 0000000000..ff2876e847 --- /dev/null +++ b/src/test/ui/proc-macro/expand-to-derive.rs @@ -0,0 +1,34 @@ +// check-pass +// compile-flags: -Z span-debug --error-format human +// aux-build:test-macros.rs + +#![feature(rustc_attrs)] + +#![no_std] // Don't load unnecessary hygiene information from std +extern crate std; + +#[macro_use] +extern crate test_macros; + +macro_rules! expand_to_derive { + ($item:item) => { + #[derive(Print)] + struct Foo { + #[cfg(FALSE)] removed: bool, + field: [bool; { + $item + 0 + }] + } + }; +} + +expand_to_derive! { + #[cfg_attr(not(FALSE), rustc_dummy)] + struct Inner { + #[cfg(FALSE)] removed_inner_field: bool, + other_inner_field: u8, + } +} + +fn main() {} diff --git a/src/test/ui/proc-macro/expand-to-derive.stdout b/src/test/ui/proc-macro/expand-to-derive.stdout new file mode 100644 index 0000000000..7eb6864334 --- /dev/null +++ b/src/test/ui/proc-macro/expand-to-derive.stdout @@ -0,0 +1,109 @@ +PRINT-DERIVE INPUT (DISPLAY): struct Foo +{ + field : + [bool ; { #[rustc_dummy] struct Inner { other_inner_field : u8, } 0 }], +} +PRINT-DERIVE INPUT (DEBUG): TokenStream [ + Ident { + ident: "struct", + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + Ident { + ident: "Foo", + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "field", + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + Punct { + ch: ':', + spacing: Alone, + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "bool", + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + Punct { + ch: ';', + spacing: Alone, + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Punct { + ch: '#', + spacing: Alone, + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "rustc_dummy", + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + ], + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + Ident { + ident: "struct", + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + Ident { + ident: "Inner", + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "other_inner_field", + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + Punct { + ch: ':', + spacing: Alone, + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + Ident { + ident: "u8", + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + Punct { + ch: ',', + spacing: Alone, + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + ], + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + Literal { + kind: Integer, + symbol: "0", + suffix: None, + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + ], + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + ], + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + Punct { + ch: ',', + spacing: Alone, + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, + ], + span: $DIR/expand-to-derive.rs:16:9: 22:10 (#4), + }, +] diff --git a/src/test/ui/proc-macro/group-compat-hack/auxiliary/group-compat-hack.rs b/src/test/ui/proc-macro/group-compat-hack/auxiliary/pin-project-internal-0.4.0.rs similarity index 68% rename from src/test/ui/proc-macro/group-compat-hack/auxiliary/group-compat-hack.rs rename to src/test/ui/proc-macro/group-compat-hack/auxiliary/pin-project-internal-0.4.0.rs index 5cd3b40a2e..baa4fd3a10 100644 --- a/src/test/ui/proc-macro/group-compat-hack/auxiliary/group-compat-hack.rs +++ b/src/test/ui/proc-macro/group-compat-hack/auxiliary/pin-project-internal-0.4.0.rs @@ -2,6 +2,10 @@ // no-prefer-dynamic #![crate_type = "proc-macro"] +#![crate_name = "group_compat_hack"] + +// This file has an unusual name in order to trigger the back-compat +// code in the compiler extern crate proc_macro; use proc_macro::TokenStream; diff --git a/src/test/ui/proc-macro/group-compat-hack/group-compat-hack.rs b/src/test/ui/proc-macro/group-compat-hack/group-compat-hack.rs index 652fabf34a..d9687490ca 100644 --- a/src/test/ui/proc-macro/group-compat-hack/group-compat-hack.rs +++ b/src/test/ui/proc-macro/group-compat-hack/group-compat-hack.rs @@ -1,5 +1,5 @@ // check-pass -// aux-build:group-compat-hack.rs +// aux-build:pin-project-internal-0.4.0.rs // compile-flags: -Z span-debug #![no_std] // Don't load unnecessary hygiene information from std @@ -24,7 +24,8 @@ mod no_version { } struct Foo; - impl_macros!(Foo); + impl_macros!(Foo); //~ WARN using an old version + //~| WARN this was previously arrays!(Foo); other!(Foo); } @@ -40,7 +41,8 @@ mod with_version { } struct Foo; - impl_macros!(Foo); + impl_macros!(Foo); //~ WARN using an old version + //~| WARN this was previously arrays!(Foo); other!(Foo); } @@ -49,14 +51,16 @@ mod actix_web_test { include!("actix-web/src/extract.rs"); struct Foo; - tuple_from_req!(Foo); + tuple_from_req!(Foo); //~ WARN using an old version + //~| WARN this was previously } mod actix_web_version_test { include!("actix-web-2.0.0/src/extract.rs"); struct Foo; - tuple_from_req!(Foo); + tuple_from_req!(Foo); //~ WARN using an old version + //~| WARN this was previously } mod actori_web_test { diff --git a/src/test/ui/proc-macro/group-compat-hack/group-compat-hack.stderr b/src/test/ui/proc-macro/group-compat-hack/group-compat-hack.stderr new file mode 100644 index 0000000000..e2b680f8d2 --- /dev/null +++ b/src/test/ui/proc-macro/group-compat-hack/group-compat-hack.stderr @@ -0,0 +1,136 @@ +warning: using an old version of `time-macros-impl` + --> $DIR/time-macros-impl/src/lib.rs:5:32 + | +LL | #[my_macro] struct One($name); + | ^^^^^ + | + ::: $DIR/group-compat-hack.rs:27:5 + | +LL | impl_macros!(Foo); + | ------------------ in this macro invocation + | + = note: `#[warn(proc_macro_back_compat)]` 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 #83125 + = note: the `time-macros-impl` crate will stop compiling in futures version of Rust. Please update to the latest version of the `time` crate to avoid breakage + = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +warning: using an old version of `time-macros-impl` + --> $DIR/time-macros-impl-0.1.0/src/lib.rs:5:32 + | +LL | #[my_macro] struct One($name); + | ^^^^^ + | + ::: $DIR/group-compat-hack.rs:44:5 + | +LL | impl_macros!(Foo); + | ------------------ in this macro invocation + | + = 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 #83125 + = note: the `time-macros-impl` crate will stop compiling in futures version of Rust. Please update to the latest version of the `time` crate to avoid breakage + = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +warning: using an old version of `actix-web` + --> $DIR/actix-web/src/extract.rs:5:34 + | +LL | #[my_macro] struct Three($T); + | ^^ + | + ::: $DIR/group-compat-hack.rs:54:5 + | +LL | tuple_from_req!(Foo); + | --------------------- in this macro invocation + | + = 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 #83125 + = note: the version of `actix-web` you are using might stop compiling in future versions of Rust; please update to the latest version of the `actix-web` crate to avoid breakage + = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +warning: using an old version of `actix-web` + --> $DIR/actix-web-2.0.0/src/extract.rs:5:34 + | +LL | #[my_macro] struct Three($T); + | ^^ + | + ::: $DIR/group-compat-hack.rs:62:5 + | +LL | tuple_from_req!(Foo); + | --------------------- in this macro invocation + | + = 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 #83125 + = note: the version of `actix-web` you are using might stop compiling in future versions of Rust; please update to the latest version of the `actix-web` crate to avoid breakage + = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +warning: 4 warnings emitted + +Future incompatibility report: Future breakage date: None, diagnostic: +warning: using an old version of `time-macros-impl` + --> $DIR/time-macros-impl/src/lib.rs:5:32 + | +LL | #[my_macro] struct One($name); + | ^^^^^ + | + ::: $DIR/group-compat-hack.rs:27:5 + | +LL | impl_macros!(Foo); + | ------------------ in this macro invocation + | + = note: `#[warn(proc_macro_back_compat)]` 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 #83125 + = note: the `time-macros-impl` crate will stop compiling in futures version of Rust. Please update to the latest version of the `time` crate to avoid breakage + = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +Future breakage date: None, diagnostic: +warning: using an old version of `time-macros-impl` + --> $DIR/time-macros-impl-0.1.0/src/lib.rs:5:32 + | +LL | #[my_macro] struct One($name); + | ^^^^^ + | + ::: $DIR/group-compat-hack.rs:44:5 + | +LL | impl_macros!(Foo); + | ------------------ in this macro invocation + | + = 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 #83125 + = note: the `time-macros-impl` crate will stop compiling in futures version of Rust. Please update to the latest version of the `time` crate to avoid breakage + = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +Future breakage date: None, diagnostic: +warning: using an old version of `actix-web` + --> $DIR/actix-web/src/extract.rs:5:34 + | +LL | #[my_macro] struct Three($T); + | ^^ + | + ::: $DIR/group-compat-hack.rs:54:5 + | +LL | tuple_from_req!(Foo); + | --------------------- in this macro invocation + | + = 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 #83125 + = note: the version of `actix-web` you are using might stop compiling in future versions of Rust; please update to the latest version of the `actix-web` crate to avoid breakage + = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +Future breakage date: None, diagnostic: +warning: using an old version of `actix-web` + --> $DIR/actix-web-2.0.0/src/extract.rs:5:34 + | +LL | #[my_macro] struct Three($T); + | ^^ + | + ::: $DIR/group-compat-hack.rs:62:5 + | +LL | tuple_from_req!(Foo); + | --------------------- in this macro invocation + | + = 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 #83125 + = note: the version of `actix-web` you are using might stop compiling in future versions of Rust; please update to the latest version of the `actix-web` crate to avoid breakage + = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + diff --git a/src/test/ui/proc-macro/group-compat-hack/group-compat-hack.stdout b/src/test/ui/proc-macro/group-compat-hack/group-compat-hack.stdout index c6b18ab674..3fe744e12f 100644 --- a/src/test/ui/proc-macro/group-compat-hack/group-compat-hack.stdout +++ b/src/test/ui/proc-macro/group-compat-hack/group-compat-hack.stdout @@ -1,10 +1,10 @@ Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/time-macros-impl/src/lib.rs:5:21: 5:27 (#6) }, Ident { ident: "One", span: $DIR/time-macros-impl/src/lib.rs:5:28: 5:31 (#6) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:27:18: 27:21 (#0) }], span: $DIR/time-macros-impl/src/lib.rs:5:31: 5:38 (#6) }, Punct { ch: ';', spacing: Alone, span: $DIR/time-macros-impl/src/lib.rs:5:38: 5:39 (#6) }] -Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/js-sys/src/lib.rs:5:21: 5:27 (#10) }, Ident { ident: "Two", span: $DIR/js-sys/src/lib.rs:5:28: 5:31 (#10) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:28:13: 28:16 (#0) }], span: $DIR/js-sys/src/lib.rs:5:31: 5:38 (#10) }, Punct { ch: ';', spacing: Alone, span: $DIR/js-sys/src/lib.rs:5:38: 5:39 (#10) }] -Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/group-compat-hack.rs:22:25: 22:31 (#14) }, Ident { ident: "Three", span: $DIR/group-compat-hack.rs:22:32: 22:37 (#14) }, Group { delimiter: Parenthesis, stream: TokenStream [Group { delimiter: None, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:29:12: 29:15 (#0) }], span: $DIR/group-compat-hack.rs:22:38: 22:43 (#14) }], span: $DIR/group-compat-hack.rs:22:37: 22:44 (#14) }, Punct { ch: ';', spacing: Alone, span: $DIR/group-compat-hack.rs:22:44: 22:45 (#14) }] -Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:21: 5:27 (#20) }, Ident { ident: "One", span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:28: 5:31 (#20) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:43:18: 43:21 (#0) }], span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:31: 5:38 (#20) }, Punct { ch: ';', spacing: Alone, span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:38: 5:39 (#20) }] -Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/js-sys-0.3.17/src/lib.rs:5:21: 5:27 (#24) }, Ident { ident: "Two", span: $DIR/js-sys-0.3.17/src/lib.rs:5:28: 5:31 (#24) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:44:13: 44:16 (#0) }], span: $DIR/js-sys-0.3.17/src/lib.rs:5:31: 5:38 (#24) }, Punct { ch: ';', spacing: Alone, span: $DIR/js-sys-0.3.17/src/lib.rs:5:38: 5:39 (#24) }] -Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/group-compat-hack.rs:38:25: 38:31 (#28) }, Ident { ident: "Three", span: $DIR/group-compat-hack.rs:38:32: 38:37 (#28) }, Group { delimiter: Parenthesis, stream: TokenStream [Group { delimiter: None, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:45:12: 45:15 (#0) }], span: $DIR/group-compat-hack.rs:38:38: 38:43 (#28) }], span: $DIR/group-compat-hack.rs:38:37: 38:44 (#28) }, Punct { ch: ';', spacing: Alone, span: $DIR/group-compat-hack.rs:38:44: 38:45 (#28) }] -Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/actix-web/src/extract.rs:5:21: 5:27 (#33) }, Ident { ident: "Three", span: $DIR/actix-web/src/extract.rs:5:28: 5:33 (#33) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:52:21: 52:24 (#0) }], span: $DIR/actix-web/src/extract.rs:5:33: 5:37 (#33) }, Punct { ch: ';', spacing: Alone, span: $DIR/actix-web/src/extract.rs:5:37: 5:38 (#33) }] -Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/actix-web-2.0.0/src/extract.rs:5:21: 5:27 (#38) }, Ident { ident: "Three", span: $DIR/actix-web-2.0.0/src/extract.rs:5:28: 5:33 (#38) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:59:21: 59:24 (#0) }], span: $DIR/actix-web-2.0.0/src/extract.rs:5:33: 5:37 (#38) }, Punct { ch: ';', spacing: Alone, span: $DIR/actix-web-2.0.0/src/extract.rs:5:37: 5:38 (#38) }] -Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/actori-web/src/extract.rs:5:21: 5:27 (#43) }, Ident { ident: "Four", span: $DIR/actori-web/src/extract.rs:5:28: 5:32 (#43) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:66:21: 66:24 (#0) }], span: $DIR/actori-web/src/extract.rs:5:32: 5:36 (#43) }, Punct { ch: ';', spacing: Alone, span: $DIR/actori-web/src/extract.rs:5:36: 5:37 (#43) }] -Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/actori-web-2.0.0/src/extract.rs:5:21: 5:27 (#48) }, Ident { ident: "Four", span: $DIR/actori-web-2.0.0/src/extract.rs:5:28: 5:32 (#48) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:73:21: 73:24 (#0) }], span: $DIR/actori-web-2.0.0/src/extract.rs:5:32: 5:36 (#48) }, Punct { ch: ';', spacing: Alone, span: $DIR/actori-web-2.0.0/src/extract.rs:5:36: 5:37 (#48) }] +Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/js-sys/src/lib.rs:5:21: 5:27 (#10) }, Ident { ident: "Two", span: $DIR/js-sys/src/lib.rs:5:28: 5:31 (#10) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:29:13: 29:16 (#0) }], span: $DIR/js-sys/src/lib.rs:5:31: 5:38 (#10) }, Punct { ch: ';', spacing: Alone, span: $DIR/js-sys/src/lib.rs:5:38: 5:39 (#10) }] +Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/group-compat-hack.rs:22:25: 22:31 (#14) }, Ident { ident: "Three", span: $DIR/group-compat-hack.rs:22:32: 22:37 (#14) }, Group { delimiter: Parenthesis, stream: TokenStream [Group { delimiter: None, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:30:12: 30:15 (#0) }], span: $DIR/group-compat-hack.rs:22:38: 22:43 (#14) }], span: $DIR/group-compat-hack.rs:22:37: 22:44 (#14) }, Punct { ch: ';', spacing: Alone, span: $DIR/group-compat-hack.rs:22:44: 22:45 (#14) }] +Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:21: 5:27 (#20) }, Ident { ident: "One", span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:28: 5:31 (#20) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:44:18: 44:21 (#0) }], span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:31: 5:38 (#20) }, Punct { ch: ';', spacing: Alone, span: $DIR/time-macros-impl-0.1.0/src/lib.rs:5:38: 5:39 (#20) }] +Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/js-sys-0.3.17/src/lib.rs:5:21: 5:27 (#24) }, Ident { ident: "Two", span: $DIR/js-sys-0.3.17/src/lib.rs:5:28: 5:31 (#24) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:46:13: 46:16 (#0) }], span: $DIR/js-sys-0.3.17/src/lib.rs:5:31: 5:38 (#24) }, Punct { ch: ';', spacing: Alone, span: $DIR/js-sys-0.3.17/src/lib.rs:5:38: 5:39 (#24) }] +Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/group-compat-hack.rs:39:25: 39:31 (#28) }, Ident { ident: "Three", span: $DIR/group-compat-hack.rs:39:32: 39:37 (#28) }, Group { delimiter: Parenthesis, stream: TokenStream [Group { delimiter: None, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:47:12: 47:15 (#0) }], span: $DIR/group-compat-hack.rs:39:38: 39:43 (#28) }], span: $DIR/group-compat-hack.rs:39:37: 39:44 (#28) }, Punct { ch: ';', spacing: Alone, span: $DIR/group-compat-hack.rs:39:44: 39:45 (#28) }] +Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/actix-web/src/extract.rs:5:21: 5:27 (#33) }, Ident { ident: "Three", span: $DIR/actix-web/src/extract.rs:5:28: 5:33 (#33) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:54:21: 54:24 (#0) }], span: $DIR/actix-web/src/extract.rs:5:33: 5:37 (#33) }, Punct { ch: ';', spacing: Alone, span: $DIR/actix-web/src/extract.rs:5:37: 5:38 (#33) }] +Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/actix-web-2.0.0/src/extract.rs:5:21: 5:27 (#38) }, Ident { ident: "Three", span: $DIR/actix-web-2.0.0/src/extract.rs:5:28: 5:33 (#38) }, Group { delimiter: Parenthesis, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:62:21: 62:24 (#0) }], span: $DIR/actix-web-2.0.0/src/extract.rs:5:33: 5:37 (#38) }, Punct { ch: ';', spacing: Alone, span: $DIR/actix-web-2.0.0/src/extract.rs:5:37: 5:38 (#38) }] +Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/actori-web/src/extract.rs:5:21: 5:27 (#43) }, Ident { ident: "Four", span: $DIR/actori-web/src/extract.rs:5:28: 5:32 (#43) }, Group { delimiter: Parenthesis, stream: TokenStream [Group { delimiter: None, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:70:21: 70:24 (#0) }], span: $DIR/actori-web/src/extract.rs:5:33: 5:35 (#43) }], span: $DIR/actori-web/src/extract.rs:5:32: 5:36 (#43) }, Punct { ch: ';', spacing: Alone, span: $DIR/actori-web/src/extract.rs:5:36: 5:37 (#43) }] +Called proc_macro_hack with TokenStream [Ident { ident: "struct", span: $DIR/actori-web-2.0.0/src/extract.rs:5:21: 5:27 (#48) }, Ident { ident: "Four", span: $DIR/actori-web-2.0.0/src/extract.rs:5:28: 5:32 (#48) }, Group { delimiter: Parenthesis, stream: TokenStream [Group { delimiter: None, stream: TokenStream [Ident { ident: "Foo", span: $DIR/group-compat-hack.rs:77:21: 77:24 (#0) }], span: $DIR/actori-web-2.0.0/src/extract.rs:5:33: 5:35 (#48) }], span: $DIR/actori-web-2.0.0/src/extract.rs:5:32: 5:36 (#48) }, Punct { ch: ';', spacing: Alone, span: $DIR/actori-web-2.0.0/src/extract.rs:5:36: 5:37 (#48) }] diff --git a/src/test/ui/proc-macro/helper-attr-blocked-by-import-ambig.rs b/src/test/ui/proc-macro/helper-attr-blocked-by-import-ambig.rs index 3a1c56efce..40c42d82f6 100644 --- a/src/test/ui/proc-macro/helper-attr-blocked-by-import-ambig.rs +++ b/src/test/ui/proc-macro/helper-attr-blocked-by-import-ambig.rs @@ -4,8 +4,10 @@ extern crate test_macros; use test_macros::empty_attr as empty_helper; -#[derive(Empty)] #[empty_helper] //~ ERROR `empty_helper` is ambiguous + //~| WARN derive helper attribute is used before it is introduced + //~| WARN this was previously accepted +#[derive(Empty)] struct S; fn main() {} diff --git a/src/test/ui/proc-macro/helper-attr-blocked-by-import-ambig.stderr b/src/test/ui/proc-macro/helper-attr-blocked-by-import-ambig.stderr index 012fb105b1..ceb6d78978 100644 --- a/src/test/ui/proc-macro/helper-attr-blocked-by-import-ambig.stderr +++ b/src/test/ui/proc-macro/helper-attr-blocked-by-import-ambig.stderr @@ -1,11 +1,11 @@ error[E0659]: `empty_helper` is ambiguous (derive helper attribute vs any other name) - --> $DIR/helper-attr-blocked-by-import-ambig.rs:8:3 + --> $DIR/helper-attr-blocked-by-import-ambig.rs:7:3 | LL | #[empty_helper] | ^^^^^^^^^^^^ ambiguous name | note: `empty_helper` could refer to the derive helper attribute defined here - --> $DIR/helper-attr-blocked-by-import-ambig.rs:7:10 + --> $DIR/helper-attr-blocked-by-import-ambig.rs:10:10 | LL | #[derive(Empty)] | ^^^^^ @@ -16,6 +16,19 @@ LL | use test_macros::empty_attr as empty_helper; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ = help: use `crate::empty_helper` to refer to this attribute macro unambiguously -error: aborting due to previous error +warning: derive helper attribute is used before it is introduced + --> $DIR/helper-attr-blocked-by-import-ambig.rs:7:3 + | +LL | #[empty_helper] + | ^^^^^^^^^^^^ +... +LL | #[derive(Empty)] + | ----- the attribute is introduced here + | + = note: `#[warn(legacy_derive_helpers)]` 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 #79202 + +error: aborting due to previous error; 1 warning emitted For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/proc-macro/inert-attribute-order.rs b/src/test/ui/proc-macro/inert-attribute-order.rs new file mode 100644 index 0000000000..f807967564 --- /dev/null +++ b/src/test/ui/proc-macro/inert-attribute-order.rs @@ -0,0 +1,23 @@ +// Order of inert attributes, both built-in and custom is preserved during expansion. + +// check-pass +// compile-flags: -Z span-debug +// aux-build:test-macros.rs + +#![no_std] // Don't load unnecessary hygiene information from std +extern crate std; + +#[macro_use] +extern crate test_macros; + +/// 1 +#[rustfmt::attr2] +#[doc = "3"] +#[print_attr(nodebug)] +#[doc = "4"] +#[rustfmt::attr5] +/// 6 +#[print_attr(nodebug)] +struct S; + +fn main() {} diff --git a/src/test/ui/proc-macro/inert-attribute-order.stdout b/src/test/ui/proc-macro/inert-attribute-order.stdout new file mode 100644 index 0000000000..cc21554595 --- /dev/null +++ b/src/test/ui/proc-macro/inert-attribute-order.stdout @@ -0,0 +1,7 @@ +PRINT-ATTR INPUT (DISPLAY): /// 1 +#[rustfmt :: attr2] #[doc = "3"] #[doc = "4"] #[rustfmt :: attr5] /// 6 +#[print_attr(nodebug)] struct S ; +PRINT-ATTR RE-COLLECTED (DISPLAY): #[doc = " 1"] #[rustfmt :: attr2] #[doc = "3"] #[doc = "4"] +#[rustfmt :: attr5] #[doc = " 6"] #[print_attr(nodebug)] struct S ; +PRINT-ATTR INPUT (DISPLAY): #[doc = " 1"] #[rustfmt :: attr2] #[doc = "3"] #[doc = "4"] +#[rustfmt :: attr5] #[doc = " 6"] struct S ; diff --git a/src/test/ui/proc-macro/inner-attr-non-inline-mod.rs b/src/test/ui/proc-macro/inner-attr-non-inline-mod.rs new file mode 100644 index 0000000000..30c2666df4 --- /dev/null +++ b/src/test/ui/proc-macro/inner-attr-non-inline-mod.rs @@ -0,0 +1,18 @@ +// compile-flags: -Z span-debug +// error-pattern:custom inner attributes are unstable +// error-pattern:inner macro attributes are unstable +// error-pattern:this was previously accepted +// aux-build:test-macros.rs + +#![no_std] // Don't load unnecessary hygiene information from std +extern crate std; + +#[macro_use] +extern crate test_macros; + +#[deny(unused_attributes)] +mod module_with_attrs; +//~^ ERROR non-inline modules in proc macro input are unstable +//~| ERROR custom inner attributes are unstable + +fn main() {} diff --git a/src/test/ui/proc-macro/inner-attr-non-inline-mod.stderr b/src/test/ui/proc-macro/inner-attr-non-inline-mod.stderr new file mode 100644 index 0000000000..4286896dfc --- /dev/null +++ b/src/test/ui/proc-macro/inner-attr-non-inline-mod.stderr @@ -0,0 +1,40 @@ +error[E0658]: inner macro attributes are unstable + --> $DIR/module_with_attrs.rs:4:4 + | +LL | #![print_attr] + | ^^^^^^^^^^ + | + = note: see issue #54726 for more information + = help: add `#![feature(custom_inner_attributes)]` to the crate attributes to enable + +error[E0658]: non-inline modules in proc macro input are unstable + --> $DIR/inner-attr-non-inline-mod.rs:14:1 + | +LL | mod module_with_attrs; + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #54727 for more information + = help: add `#![feature(proc_macro_hygiene)]` to the crate attributes to enable + +error[E0658]: custom inner attributes are unstable + --> $DIR/inner-attr-non-inline-mod.rs:14:1 + | +LL | mod module_with_attrs; + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #54726 for more information + = help: add `#![feature(custom_inner_attributes)]` to the crate attributes to enable + +error: custom inner attributes are unstable + --> $DIR/module_with_attrs.rs:3:4 + | +LL | #![rustfmt::skip] + | ^^^^^^^^^^^^^ + | + = note: `#[deny(soft_unstable)]` 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 #64266 + +error: aborting due to 4 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/proc-macro/inner-attr-non-inline-mod.stdout b/src/test/ui/proc-macro/inner-attr-non-inline-mod.stdout new file mode 100644 index 0000000000..dbef342ef2 --- /dev/null +++ b/src/test/ui/proc-macro/inner-attr-non-inline-mod.stdout @@ -0,0 +1,76 @@ +PRINT-ATTR INPUT (DISPLAY): #[deny(unused_attributes)] mod module_with_attrs { # ! [rustfmt :: skip] } +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Punct { + ch: '#', + spacing: Alone, + span: $DIR/inner-attr-non-inline-mod.rs:14:1: 14:23 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "deny", + span: $DIR/inner-attr-non-inline-mod.rs:14:1: 14:23 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "unused_attributes", + span: $DIR/inner-attr-non-inline-mod.rs:14:1: 14:23 (#0), + }, + ], + span: $DIR/inner-attr-non-inline-mod.rs:14:1: 14:23 (#0), + }, + ], + span: $DIR/inner-attr-non-inline-mod.rs:14:1: 14:23 (#0), + }, + Ident { + ident: "mod", + span: $DIR/inner-attr-non-inline-mod.rs:14:1: 14:23 (#0), + }, + Ident { + ident: "module_with_attrs", + span: $DIR/inner-attr-non-inline-mod.rs:14:1: 14:23 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Punct { + ch: '#', + spacing: Joint, + span: $DIR/inner-attr-non-inline-mod.rs:14:1: 14:23 (#0), + }, + Punct { + ch: '!', + spacing: Alone, + span: $DIR/inner-attr-non-inline-mod.rs:14:1: 14:23 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "rustfmt", + span: $DIR/inner-attr-non-inline-mod.rs:14:1: 14:23 (#0), + }, + Punct { + ch: ':', + spacing: Joint, + span: $DIR/inner-attr-non-inline-mod.rs:14:1: 14:23 (#0), + }, + Punct { + ch: ':', + spacing: Alone, + span: $DIR/inner-attr-non-inline-mod.rs:14:1: 14:23 (#0), + }, + Ident { + ident: "skip", + span: $DIR/inner-attr-non-inline-mod.rs:14:1: 14:23 (#0), + }, + ], + span: $DIR/inner-attr-non-inline-mod.rs:14:1: 14:23 (#0), + }, + ], + span: $DIR/inner-attr-non-inline-mod.rs:14:1: 14:23 (#0), + }, +] diff --git a/src/test/ui/proc-macro/inner-attrs.rs b/src/test/ui/proc-macro/inner-attrs.rs new file mode 100644 index 0000000000..6a353ca326 --- /dev/null +++ b/src/test/ui/proc-macro/inner-attrs.rs @@ -0,0 +1,47 @@ +// check-pass +// compile-flags: -Z span-debug --error-format human +// aux-build:test-macros.rs + +#![feature(custom_inner_attributes)] +#![feature(proc_macro_hygiene)] +#![feature(stmt_expr_attributes)] + +#![no_std] // Don't load unnecessary hygiene information from std +extern crate std; + +#[macro_use] +extern crate test_macros; + +#[print_target_and_args(first)] +#[print_target_and_args(second)] +fn foo() { + #![print_target_and_args(third)] + #![print_target_and_args(fourth)] +} + +struct MyStruct { + field: bool +} + +fn bar() { + (#![print_target_and_args(fifth)] 1, 2); + + [#![print_target_and_args(sixth)] 1 , 2]; + [#![print_target_and_args(seventh)] true ; 5]; + + + match 0 { + #![print_target_and_args(eighth)] + _ => {} + } + + MyStruct { #![print_target_and_args(ninth)] field: true }; +} + +extern { + fn weird_extern() { + #![print_target_and_args_consume(tenth)] + } +} + +fn main() {} diff --git a/src/test/ui/proc-macro/inner-attrs.stdout b/src/test/ui/proc-macro/inner-attrs.stdout new file mode 100644 index 0000000000..2fd8d8a242 --- /dev/null +++ b/src/test/ui/proc-macro/inner-attrs.stdout @@ -0,0 +1,520 @@ +PRINT-ATTR_ARGS INPUT (DISPLAY): first +PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [ + Ident { + ident: "first", + span: $DIR/inner-attrs.rs:15:25: 15:30 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): #[print_target_and_args(second)] fn foo() +{ # ! [print_target_and_args(third)] # ! [print_target_and_args(fourth)] } +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Punct { + ch: '#', + spacing: Alone, + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "print_target_and_args", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "second", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + ], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + ], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Ident { + ident: "fn", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Ident { + ident: "foo", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Punct { + ch: '#', + spacing: Joint, + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Punct { + ch: '!', + spacing: Alone, + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "print_target_and_args", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "third", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + ], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + ], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Punct { + ch: '#', + spacing: Joint, + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Punct { + ch: '!', + spacing: Alone, + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "print_target_and_args", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "fourth", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + ], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + ], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + ], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, +] +PRINT-ATTR_ARGS INPUT (DISPLAY): second +PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [ + Ident { + ident: "second", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): fn foo() +{ # ! [print_target_and_args(third)] # ! [print_target_and_args(fourth)] } +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Ident { + ident: "fn", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Ident { + ident: "foo", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Punct { + ch: '#', + spacing: Joint, + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Punct { + ch: '!', + spacing: Alone, + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "print_target_and_args", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "third", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + ], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + ], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Punct { + ch: '#', + spacing: Joint, + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Punct { + ch: '!', + spacing: Alone, + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "print_target_and_args", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "fourth", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + ], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + ], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + ], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, +] +PRINT-ATTR_ARGS INPUT (DISPLAY): third +PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [ + Ident { + ident: "third", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): fn foo() { # ! [print_target_and_args(fourth)] } +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Ident { + ident: "fn", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Ident { + ident: "foo", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Punct { + ch: '#', + spacing: Joint, + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Punct { + ch: '!', + spacing: Alone, + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "print_target_and_args", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "fourth", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + ], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + ], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + ], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, +] +PRINT-ATTR_ARGS INPUT (DISPLAY): fourth +PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [ + Ident { + ident: "fourth", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): fn foo() { } +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Ident { + ident: "fn", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Ident { + ident: "foo", + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [], + span: $DIR/inner-attrs.rs:17:1: 20:2 (#0), + }, +] +PRINT-ATTR_ARGS INPUT (DISPLAY): fifth +PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [ + Ident { + ident: "fifth", + span: $DIR/inner-attrs.rs:27:31: 27:36 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): (1, 2) ; +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Literal { + kind: Integer, + symbol: "1", + suffix: None, + span: $DIR/inner-attrs.rs:27:5: 27:45 (#0), + }, + Punct { + ch: ',', + spacing: Alone, + span: $DIR/inner-attrs.rs:27:5: 27:45 (#0), + }, + Literal { + kind: Integer, + symbol: "2", + suffix: None, + span: $DIR/inner-attrs.rs:27:5: 27:45 (#0), + }, + ], + span: $DIR/inner-attrs.rs:27:5: 27:45 (#0), + }, + Punct { + ch: ';', + spacing: Alone, + span: $DIR/inner-attrs.rs:27:5: 27:45 (#0), + }, +] +PRINT-ATTR_ARGS INPUT (DISPLAY): sixth +PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [ + Ident { + ident: "sixth", + span: $DIR/inner-attrs.rs:29:31: 29:36 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): [1, 2] ; +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Group { + delimiter: Bracket, + stream: TokenStream [ + Literal { + kind: Integer, + symbol: "1", + suffix: None, + span: $DIR/inner-attrs.rs:29:5: 29:46 (#0), + }, + Punct { + ch: ',', + spacing: Alone, + span: $DIR/inner-attrs.rs:29:5: 29:46 (#0), + }, + Literal { + kind: Integer, + symbol: "2", + suffix: None, + span: $DIR/inner-attrs.rs:29:5: 29:46 (#0), + }, + ], + span: $DIR/inner-attrs.rs:29:5: 29:46 (#0), + }, + Punct { + ch: ';', + spacing: Alone, + span: $DIR/inner-attrs.rs:29:5: 29:46 (#0), + }, +] +PRINT-ATTR_ARGS INPUT (DISPLAY): seventh +PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [ + Ident { + ident: "seventh", + span: $DIR/inner-attrs.rs:30:31: 30:38 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): [true ; 5] ; +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "true", + span: $DIR/inner-attrs.rs:30:5: 30:51 (#0), + }, + Punct { + ch: ';', + spacing: Alone, + span: $DIR/inner-attrs.rs:30:5: 30:51 (#0), + }, + Literal { + kind: Integer, + symbol: "5", + suffix: None, + span: $DIR/inner-attrs.rs:30:5: 30:51 (#0), + }, + ], + span: $DIR/inner-attrs.rs:30:5: 30:51 (#0), + }, + Punct { + ch: ';', + spacing: Alone, + span: $DIR/inner-attrs.rs:30:5: 30:51 (#0), + }, +] +PRINT-ATTR_ARGS INPUT (DISPLAY): eighth +PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [ + Ident { + ident: "eighth", + span: $DIR/inner-attrs.rs:34:34: 34:40 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): match 0 { _ => { } } +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Ident { + ident: "match", + span: $DIR/inner-attrs.rs:33:5: 36:6 (#0), + }, + Literal { + kind: Integer, + symbol: "0", + suffix: None, + span: $DIR/inner-attrs.rs:33:5: 36:6 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "_", + span: $DIR/inner-attrs.rs:33:5: 36:6 (#0), + }, + Punct { + ch: '=', + spacing: Joint, + span: $DIR/inner-attrs.rs:33:5: 36:6 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/inner-attrs.rs:33:5: 36:6 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [], + span: $DIR/inner-attrs.rs:33:5: 36:6 (#0), + }, + ], + span: $DIR/inner-attrs.rs:33:5: 36:6 (#0), + }, +] +PRINT-ATTR_ARGS INPUT (DISPLAY): ninth +PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [ + Ident { + ident: "ninth", + span: $DIR/inner-attrs.rs:38:41: 38:46 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): MyStruct { field : true, } ; +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Ident { + ident: "MyStruct", + span: $DIR/inner-attrs.rs:38:5: 38:63 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "field", + span: $DIR/inner-attrs.rs:38:5: 38:63 (#0), + }, + Punct { + ch: ':', + spacing: Alone, + span: $DIR/inner-attrs.rs:38:5: 38:63 (#0), + }, + Ident { + ident: "true", + span: $DIR/inner-attrs.rs:38:5: 38:63 (#0), + }, + Punct { + ch: ',', + spacing: Alone, + span: $DIR/inner-attrs.rs:38:5: 38:63 (#0), + }, + ], + span: $DIR/inner-attrs.rs:38:5: 38:63 (#0), + }, + Punct { + ch: ';', + spacing: Alone, + span: $DIR/inner-attrs.rs:38:5: 38:63 (#0), + }, +] +PRINT-ATTR_ARGS INPUT (DISPLAY): tenth +PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [ + Ident { + ident: "tenth", + span: $DIR/inner-attrs.rs:43:42: 43:47 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): fn weird_extern() { } +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Ident { + ident: "fn", + span: $DIR/inner-attrs.rs:42:5: 44:6 (#0), + }, + Ident { + ident: "weird_extern", + span: $DIR/inner-attrs.rs:42:5: 44:6 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [], + span: $DIR/inner-attrs.rs:42:5: 44:6 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [], + span: $DIR/inner-attrs.rs:42:5: 44:6 (#0), + }, +] diff --git a/src/test/ui/proc-macro/issue-37788.stderr b/src/test/ui/proc-macro/issue-37788.stderr index 0538701290..345520d485 100644 --- a/src/test/ui/proc-macro/issue-37788.stderr +++ b/src/test/ui/proc-macro/issue-37788.stderr @@ -5,7 +5,7 @@ LL | fn main() { | - expected `()` because of default return type LL | // Test that constructing the `visible_parent_map` (in `cstore_impl.rs`) does not ICE. LL | std::cell::Cell::new(0) - | ^^^^^^^^^^^^^^^^^^^^^^^- help: try adding a semicolon: `;` + | ^^^^^^^^^^^^^^^^^^^^^^^- help: consider using a semicolon here: `;` | | | expected `()`, found struct `Cell` | diff --git a/src/test/ui/proc-macro/issue-73933-procedural-masquerade.rs b/src/test/ui/proc-macro/issue-73933-procedural-masquerade.rs new file mode 100644 index 0000000000..abc3d2691a --- /dev/null +++ b/src/test/ui/proc-macro/issue-73933-procedural-masquerade.rs @@ -0,0 +1,13 @@ +// check-pass +// aux-build:test-macros.rs + +#[macro_use] +extern crate test_macros; + +#[derive(Print)] +enum ProceduralMasqueradeDummyType { //~ WARN using +//~| WARN this was previously + Input +} + +fn main() {} diff --git a/src/test/ui/proc-macro/issue-73933-procedural-masquerade.stderr b/src/test/ui/proc-macro/issue-73933-procedural-masquerade.stderr new file mode 100644 index 0000000000..0b930705e3 --- /dev/null +++ b/src/test/ui/proc-macro/issue-73933-procedural-masquerade.stderr @@ -0,0 +1,25 @@ +warning: using `procedural-masquerade` crate + --> $DIR/issue-73933-procedural-masquerade.rs:8:6 + | +LL | enum ProceduralMasqueradeDummyType { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(proc_macro_back_compat)]` 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 #83125 + = note: The `procedural-masquerade` crate has been unnecessary since Rust 1.30.0. Versions of this crate below 0.1.7 will eventually stop compiling. + +warning: 1 warning emitted + +Future incompatibility report: Future breakage date: None, diagnostic: +warning: using `procedural-masquerade` crate + --> $DIR/issue-73933-procedural-masquerade.rs:8:6 + | +LL | enum ProceduralMasqueradeDummyType { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(proc_macro_back_compat)]` 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 #83125 + = note: The `procedural-masquerade` crate has been unnecessary since Rust 1.30.0. Versions of this crate below 0.1.7 will eventually stop compiling. + diff --git a/src/test/ui/proc-macro/issue-73933-procedural-masquerade.stdout b/src/test/ui/proc-macro/issue-73933-procedural-masquerade.stdout new file mode 100644 index 0000000000..8edd68f8a3 --- /dev/null +++ b/src/test/ui/proc-macro/issue-73933-procedural-masquerade.stdout @@ -0,0 +1,22 @@ +PRINT-DERIVE INPUT (DISPLAY): enum ProceduralMasqueradeDummyType { Input, } +PRINT-DERIVE RE-COLLECTED (DISPLAY): enum ProceduralMasqueradeDummyType { Input } +PRINT-DERIVE INPUT (DEBUG): TokenStream [ + Ident { + ident: "enum", + span: #0 bytes(100..104), + }, + Ident { + ident: "ProceduralMasqueradeDummyType", + span: #0 bytes(105..134), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "Input", + span: #0 bytes(186..191), + }, + ], + span: #0 bytes(135..193), + }, +] diff --git a/src/test/ui/proc-macro/issue-75930-derive-cfg.rs b/src/test/ui/proc-macro/issue-75930-derive-cfg.rs index a051d23bac..ef56e8e02d 100644 --- a/src/test/ui/proc-macro/issue-75930-derive-cfg.rs +++ b/src/test/ui/proc-macro/issue-75930-derive-cfg.rs @@ -10,10 +10,14 @@ // (a pretty-printed struct may cause a line to start with '{' ) // FIXME: We currently lose spans here (see issue #43081) +#![no_std] // Don't load unnecessary hygiene information from std +extern crate std; + #[macro_use] extern crate test_macros; -#[print_helper(a)] +#[print_helper(a)] //~ WARN derive helper attribute is used before it is introduced + //~| WARN this was previously accepted #[cfg_attr(not(FALSE), allow(dead_code))] #[print_attr] #[derive(Print)] @@ -57,6 +61,10 @@ struct Foo<#[cfg(FALSE)] A, B> { u8 ); + fn plain_removed_fn() { + #![cfg_attr(not(FALSE), cfg(FALSE))] + } + 0 }], #[print_helper(d)] diff --git a/src/test/ui/proc-macro/issue-75930-derive-cfg.stderr b/src/test/ui/proc-macro/issue-75930-derive-cfg.stderr new file mode 100644 index 0000000000..25f3610800 --- /dev/null +++ b/src/test/ui/proc-macro/issue-75930-derive-cfg.stderr @@ -0,0 +1,15 @@ +warning: derive helper attribute is used before it is introduced + --> $DIR/issue-75930-derive-cfg.rs:19:3 + | +LL | #[print_helper(a)] + | ^^^^^^^^^^^^ +... +LL | #[derive(Print)] + | ----- the attribute is introduced here + | + = note: `#[warn(legacy_derive_helpers)]` 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 #79202 + +warning: 1 warning emitted + diff --git a/src/test/ui/proc-macro/issue-75930-derive-cfg.stdout b/src/test/ui/proc-macro/issue-75930-derive-cfg.stdout index 5f513684cf..7cbc0c669a 100644 --- a/src/test/ui/proc-macro/issue-75930-derive-cfg.stdout +++ b/src/test/ui/proc-macro/issue-75930-derive-cfg.stdout @@ -1,4 +1,4 @@ -PRINT-ATTR INPUT (DISPLAY): #[allow(dead_code)] #[derive(Print)] #[print_helper(b)] #[print_helper(a)] +PRINT-ATTR INPUT (DISPLAY): #[print_helper(a)] #[allow(dead_code)] #[derive(Print)] #[print_helper(b)] struct Foo < #[cfg(FALSE)] A, B > { #[cfg(FALSE)] first : String, #[cfg_attr(FALSE, deny(warnings))] second : @@ -19,165 +19,166 @@ struct Foo < #[cfg(FALSE)] A, B > #[cfg(FALSE)] String, u8) } struct TupleStruct(#[cfg(FALSE)] String, #[cfg(not(FALSE))] i32, - #[cfg(FALSE)] bool, u8) ; 0 + #[cfg(FALSE)] bool, u8) ; fn plain_removed_fn() + { # ! [cfg_attr(not(FALSE), cfg(FALSE))] } 0 }], #[print_helper(d)] fourth : B } PRINT-ATTR INPUT (DEBUG): TokenStream [ Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:17:1: 17:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:19:1: 19:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { - ident: "allow", - span: $DIR/issue-75930-derive-cfg.rs:17:24: 17:29 (#0), + ident: "print_helper", + span: $DIR/issue-75930-derive-cfg.rs:19:3: 19:15 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { - ident: "dead_code", - span: $DIR/issue-75930-derive-cfg.rs:17:30: 17:39 (#0), + ident: "a", + span: $DIR/issue-75930-derive-cfg.rs:19:16: 19:17 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:17:29: 17:40 (#0), + span: $DIR/issue-75930-derive-cfg.rs:19:15: 19:18 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:17:1: 17:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:19:2: 19:19 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:19:1: 19:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:21:1: 21:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { - ident: "derive", - span: $DIR/issue-75930-derive-cfg.rs:19:3: 19:9 (#0), + ident: "allow", + span: $DIR/issue-75930-derive-cfg.rs:21:24: 21:29 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { - ident: "Print", - span: $DIR/issue-75930-derive-cfg.rs:19:10: 19:15 (#0), + ident: "dead_code", + span: $DIR/issue-75930-derive-cfg.rs:21:30: 21:39 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:19:9: 19:16 (#0), + span: $DIR/issue-75930-derive-cfg.rs:21:29: 21:40 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:19:2: 19:17 (#0), + span: $DIR/issue-75930-derive-cfg.rs:21:1: 21:2 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:20:1: 20:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:23:1: 23:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { - ident: "print_helper", - span: $DIR/issue-75930-derive-cfg.rs:20:3: 20:15 (#0), + ident: "derive", + span: $DIR/issue-75930-derive-cfg.rs:23:3: 23:9 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { - ident: "b", - span: $DIR/issue-75930-derive-cfg.rs:20:16: 20:17 (#0), + ident: "Print", + span: $DIR/issue-75930-derive-cfg.rs:23:10: 23:15 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:20:15: 20:18 (#0), + span: $DIR/issue-75930-derive-cfg.rs:23:9: 23:16 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:20:2: 20:19 (#0), + span: $DIR/issue-75930-derive-cfg.rs:23:2: 23:17 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:16:1: 16:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:24:1: 24:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "print_helper", - span: $DIR/issue-75930-derive-cfg.rs:16:3: 16:15 (#0), + span: $DIR/issue-75930-derive-cfg.rs:24:3: 24:15 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { - ident: "a", - span: $DIR/issue-75930-derive-cfg.rs:16:16: 16:17 (#0), + ident: "b", + span: $DIR/issue-75930-derive-cfg.rs:24:16: 24:17 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:16:15: 16:18 (#0), + span: $DIR/issue-75930-derive-cfg.rs:24:15: 24:18 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:16:2: 16:19 (#0), + span: $DIR/issue-75930-derive-cfg.rs:24:2: 24:19 (#0), }, Ident { ident: "struct", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 21:7 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 25:7 (#0), }, Ident { ident: "Foo", - span: $DIR/issue-75930-derive-cfg.rs:21:8: 21:11 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:8: 25:11 (#0), }, Punct { ch: '<', spacing: Joint, - span: $DIR/issue-75930-derive-cfg.rs:21:11: 21:12 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:11: 25:12 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:12: 21:13 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:12: 25:13 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:21:14: 21:17 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:14: 25:17 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:21:18: 21:23 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:18: 25:23 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:17: 21:24 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:17: 25:24 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:13: 21:25 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:13: 25:25 (#0), }, Ident { ident: "A", - span: $DIR/issue-75930-derive-cfg.rs:21:26: 21:27 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:26: 25:27 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:27: 21:28 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:27: 25:28 (#0), }, Ident { ident: "B", - span: $DIR/issue-75930-derive-cfg.rs:21:29: 21:30 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:29: 25:30 (#0), }, Punct { ch: '>', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:30: 21:31 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:30: 25:31 (#0), }, Group { delimiter: Brace, @@ -185,128 +186,128 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [ Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:22:5: 22:6 (#0), + span: $DIR/issue-75930-derive-cfg.rs:26:5: 26:6 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:22:7: 22:10 (#0), + span: $DIR/issue-75930-derive-cfg.rs:26:7: 26:10 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:22:11: 22:16 (#0), + span: $DIR/issue-75930-derive-cfg.rs:26:11: 26:16 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:22:10: 22:17 (#0), + span: $DIR/issue-75930-derive-cfg.rs:26:10: 26:17 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:22:6: 22:18 (#0), + span: $DIR/issue-75930-derive-cfg.rs:26:6: 26:18 (#0), }, Ident { ident: "first", - span: $DIR/issue-75930-derive-cfg.rs:22:19: 22:24 (#0), + span: $DIR/issue-75930-derive-cfg.rs:26:19: 26:24 (#0), }, Punct { ch: ':', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:22:24: 22:25 (#0), + span: $DIR/issue-75930-derive-cfg.rs:26:24: 26:25 (#0), }, Ident { ident: "String", - span: $DIR/issue-75930-derive-cfg.rs:22:26: 22:32 (#0), + span: $DIR/issue-75930-derive-cfg.rs:26:26: 26:32 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:22:32: 22:33 (#0), + span: $DIR/issue-75930-derive-cfg.rs:26:32: 26:33 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:23:5: 23:6 (#0), + span: $DIR/issue-75930-derive-cfg.rs:27:5: 27:6 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg_attr", - span: $DIR/issue-75930-derive-cfg.rs:23:7: 23:15 (#0), + span: $DIR/issue-75930-derive-cfg.rs:27:7: 27:15 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:23:16: 23:21 (#0), + span: $DIR/issue-75930-derive-cfg.rs:27:16: 27:21 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:23:21: 23:22 (#0), + span: $DIR/issue-75930-derive-cfg.rs:27:21: 27:22 (#0), }, Ident { ident: "deny", - span: $DIR/issue-75930-derive-cfg.rs:23:23: 23:27 (#0), + span: $DIR/issue-75930-derive-cfg.rs:27:23: 27:27 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "warnings", - span: $DIR/issue-75930-derive-cfg.rs:23:28: 23:36 (#0), + span: $DIR/issue-75930-derive-cfg.rs:27:28: 27:36 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:23:27: 23:37 (#0), + span: $DIR/issue-75930-derive-cfg.rs:27:27: 27:37 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:23:15: 23:38 (#0), + span: $DIR/issue-75930-derive-cfg.rs:27:15: 27:38 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:23:6: 23:39 (#0), + span: $DIR/issue-75930-derive-cfg.rs:27:6: 27:39 (#0), }, Ident { ident: "second", - span: $DIR/issue-75930-derive-cfg.rs:23:40: 23:46 (#0), + span: $DIR/issue-75930-derive-cfg.rs:27:40: 27:46 (#0), }, Punct { ch: ':', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:23:46: 23:47 (#0), + span: $DIR/issue-75930-derive-cfg.rs:27:46: 27:47 (#0), }, Ident { ident: "bool", - span: $DIR/issue-75930-derive-cfg.rs:23:48: 23:52 (#0), + span: $DIR/issue-75930-derive-cfg.rs:27:48: 27:52 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:23:52: 23:53 (#0), + span: $DIR/issue-75930-derive-cfg.rs:27:52: 27:53 (#0), }, Ident { ident: "third", - span: $DIR/issue-75930-derive-cfg.rs:24:5: 24:10 (#0), + span: $DIR/issue-75930-derive-cfg.rs:28:5: 28:10 (#0), }, Punct { ch: ':', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:24:10: 24:11 (#0), + span: $DIR/issue-75930-derive-cfg.rs:28:10: 28:11 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "u8", - span: $DIR/issue-75930-derive-cfg.rs:24:13: 24:15 (#0), + span: $DIR/issue-75930-derive-cfg.rs:28:13: 28:15 (#0), }, Punct { ch: ';', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:24:15: 24:16 (#0), + span: $DIR/issue-75930-derive-cfg.rs:28:15: 28:16 (#0), }, Group { delimiter: Brace, @@ -314,145 +315,145 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [ Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:25:9: 25:10 (#0), + span: $DIR/issue-75930-derive-cfg.rs:29:9: 29:10 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:25:11: 25:14 (#0), + span: $DIR/issue-75930-derive-cfg.rs:29:11: 29:14 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:25:15: 25:20 (#0), + span: $DIR/issue-75930-derive-cfg.rs:29:15: 29:20 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:25:14: 25:21 (#0), + span: $DIR/issue-75930-derive-cfg.rs:29:14: 29:21 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:25:10: 25:22 (#0), + span: $DIR/issue-75930-derive-cfg.rs:29:10: 29:22 (#0), }, Ident { ident: "struct", - span: $DIR/issue-75930-derive-cfg.rs:25:23: 25:29 (#0), + span: $DIR/issue-75930-derive-cfg.rs:29:23: 29:29 (#0), }, Ident { ident: "Bar", - span: $DIR/issue-75930-derive-cfg.rs:25:30: 25:33 (#0), + span: $DIR/issue-75930-derive-cfg.rs:29:30: 29:33 (#0), }, Punct { ch: ';', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:25:33: 25:34 (#0), + span: $DIR/issue-75930-derive-cfg.rs:29:33: 29:34 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:26:9: 26:10 (#0), + span: $DIR/issue-75930-derive-cfg.rs:30:9: 30:10 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:26:11: 26:14 (#0), + span: $DIR/issue-75930-derive-cfg.rs:30:11: 30:14 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "not", - span: $DIR/issue-75930-derive-cfg.rs:26:15: 26:18 (#0), + span: $DIR/issue-75930-derive-cfg.rs:30:15: 30:18 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:26:19: 26:24 (#0), + span: $DIR/issue-75930-derive-cfg.rs:30:19: 30:24 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:26:18: 26:25 (#0), + span: $DIR/issue-75930-derive-cfg.rs:30:18: 30:25 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:26:14: 26:26 (#0), + span: $DIR/issue-75930-derive-cfg.rs:30:14: 30:26 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:26:10: 26:27 (#0), + span: $DIR/issue-75930-derive-cfg.rs:30:10: 30:27 (#0), }, Ident { ident: "struct", - span: $DIR/issue-75930-derive-cfg.rs:26:28: 26:34 (#0), + span: $DIR/issue-75930-derive-cfg.rs:30:28: 30:34 (#0), }, Ident { ident: "Inner", - span: $DIR/issue-75930-derive-cfg.rs:26:35: 26:40 (#0), + span: $DIR/issue-75930-derive-cfg.rs:30:35: 30:40 (#0), }, Punct { ch: ';', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:26:40: 26:41 (#0), + span: $DIR/issue-75930-derive-cfg.rs:30:40: 30:41 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:27:9: 27:10 (#0), + span: $DIR/issue-75930-derive-cfg.rs:31:9: 31:10 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:27:11: 27:14 (#0), + span: $DIR/issue-75930-derive-cfg.rs:31:11: 31:14 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:27:15: 27:20 (#0), + span: $DIR/issue-75930-derive-cfg.rs:31:15: 31:20 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:27:14: 27:21 (#0), + span: $DIR/issue-75930-derive-cfg.rs:31:14: 31:21 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:27:10: 27:22 (#0), + span: $DIR/issue-75930-derive-cfg.rs:31:10: 31:22 (#0), }, Ident { ident: "let", - span: $DIR/issue-75930-derive-cfg.rs:27:23: 27:26 (#0), + span: $DIR/issue-75930-derive-cfg.rs:31:23: 31:26 (#0), }, Ident { ident: "a", - span: $DIR/issue-75930-derive-cfg.rs:27:27: 27:28 (#0), + span: $DIR/issue-75930-derive-cfg.rs:31:27: 31:28 (#0), }, Punct { ch: '=', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:27:29: 27:30 (#0), + span: $DIR/issue-75930-derive-cfg.rs:31:29: 31:30 (#0), }, Literal { kind: Integer, symbol: "25", suffix: None, - span: $DIR/issue-75930-derive-cfg.rs:27:31: 27:33 (#0), + span: $DIR/issue-75930-derive-cfg.rs:31:31: 31:33 (#0), }, Punct { ch: ';', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:27:33: 27:34 (#0), + span: $DIR/issue-75930-derive-cfg.rs:31:33: 31:34 (#0), }, Ident { ident: "match", - span: $DIR/issue-75930-derive-cfg.rs:28:9: 28:14 (#0), + span: $DIR/issue-75930-derive-cfg.rs:32:9: 32:14 (#0), }, Ident { ident: "true", - span: $DIR/issue-75930-derive-cfg.rs:28:15: 28:19 (#0), + span: $DIR/issue-75930-derive-cfg.rs:32:15: 32:19 (#0), }, Group { delimiter: Brace, @@ -460,194 +461,194 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [ Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:29:13: 29:14 (#0), + span: $DIR/issue-75930-derive-cfg.rs:33:13: 33:14 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:29:15: 29:18 (#0), + span: $DIR/issue-75930-derive-cfg.rs:33:15: 33:18 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:29:19: 29:24 (#0), + span: $DIR/issue-75930-derive-cfg.rs:33:19: 33:24 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:29:18: 29:25 (#0), + span: $DIR/issue-75930-derive-cfg.rs:33:18: 33:25 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:29:14: 29:26 (#0), + span: $DIR/issue-75930-derive-cfg.rs:33:14: 33:26 (#0), }, Ident { ident: "true", - span: $DIR/issue-75930-derive-cfg.rs:29:27: 29:31 (#0), + span: $DIR/issue-75930-derive-cfg.rs:33:27: 33:31 (#0), }, Punct { ch: '=', spacing: Joint, - span: $DIR/issue-75930-derive-cfg.rs:29:32: 29:34 (#0), + span: $DIR/issue-75930-derive-cfg.rs:33:32: 33:34 (#0), }, Punct { ch: '>', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:29:32: 29:34 (#0), + span: $DIR/issue-75930-derive-cfg.rs:33:32: 33:34 (#0), }, Group { delimiter: Brace, stream: TokenStream [], - span: $DIR/issue-75930-derive-cfg.rs:29:35: 29:37 (#0), + span: $DIR/issue-75930-derive-cfg.rs:33:35: 33:37 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:29:37: 29:38 (#0), + span: $DIR/issue-75930-derive-cfg.rs:33:37: 33:38 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:30:13: 30:14 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:13: 34:14 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg_attr", - span: $DIR/issue-75930-derive-cfg.rs:30:15: 30:23 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:15: 34:23 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "not", - span: $DIR/issue-75930-derive-cfg.rs:30:24: 30:27 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:24: 34:27 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:30:28: 30:33 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:28: 34:33 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:30:27: 30:34 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:27: 34:34 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:30:34: 30:35 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:34: 34:35 (#0), }, Ident { ident: "allow", - span: $DIR/issue-75930-derive-cfg.rs:30:36: 30:41 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:36: 34:41 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "warnings", - span: $DIR/issue-75930-derive-cfg.rs:30:42: 30:50 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:42: 34:50 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:30:41: 30:51 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:41: 34:51 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:30:23: 30:52 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:23: 34:52 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:30:14: 30:53 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:14: 34:53 (#0), }, Ident { ident: "false", - span: $DIR/issue-75930-derive-cfg.rs:30:54: 30:59 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:54: 34:59 (#0), }, Punct { ch: '=', spacing: Joint, - span: $DIR/issue-75930-derive-cfg.rs:30:60: 30:62 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:60: 34:62 (#0), }, Punct { ch: '>', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:30:60: 30:62 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:60: 34:62 (#0), }, Group { delimiter: Brace, stream: TokenStream [], - span: $DIR/issue-75930-derive-cfg.rs:30:63: 30:65 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:63: 34:65 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:30:65: 30:66 (#0), + span: $DIR/issue-75930-derive-cfg.rs:34:65: 34:66 (#0), }, Ident { ident: "_", - span: $DIR/issue-75930-derive-cfg.rs:31:13: 31:14 (#0), + span: $DIR/issue-75930-derive-cfg.rs:35:13: 35:14 (#0), }, Punct { ch: '=', spacing: Joint, - span: $DIR/issue-75930-derive-cfg.rs:31:15: 31:17 (#0), + span: $DIR/issue-75930-derive-cfg.rs:35:15: 35:17 (#0), }, Punct { ch: '>', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:31:15: 31:17 (#0), + span: $DIR/issue-75930-derive-cfg.rs:35:15: 35:17 (#0), }, Group { delimiter: Brace, stream: TokenStream [], - span: $DIR/issue-75930-derive-cfg.rs:31:18: 31:20 (#0), + span: $DIR/issue-75930-derive-cfg.rs:35:18: 35:20 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:28:20: 32:10 (#0), + span: $DIR/issue-75930-derive-cfg.rs:32:20: 36:10 (#0), }, Punct { ch: ';', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:32:10: 32:11 (#0), + span: $DIR/issue-75930-derive-cfg.rs:36:10: 36:11 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:34:9: 34:10 (#0), + span: $DIR/issue-75930-derive-cfg.rs:38:9: 38:10 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "print_helper", - span: $DIR/issue-75930-derive-cfg.rs:34:11: 34:23 (#0), + span: $DIR/issue-75930-derive-cfg.rs:38:11: 38:23 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "should_be_removed", - span: $DIR/issue-75930-derive-cfg.rs:34:24: 34:41 (#0), + span: $DIR/issue-75930-derive-cfg.rs:38:24: 38:41 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:34:23: 34:42 (#0), + span: $DIR/issue-75930-derive-cfg.rs:38:23: 38:42 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:34:10: 34:43 (#0), + span: $DIR/issue-75930-derive-cfg.rs:38:10: 38:43 (#0), }, Ident { ident: "fn", - span: $DIR/issue-75930-derive-cfg.rs:35:9: 35:11 (#0), + span: $DIR/issue-75930-derive-cfg.rs:39:9: 39:11 (#0), }, Ident { ident: "removed_fn", - span: $DIR/issue-75930-derive-cfg.rs:35:12: 35:22 (#0), + span: $DIR/issue-75930-derive-cfg.rs:39:12: 39:22 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [], - span: $DIR/issue-75930-derive-cfg.rs:35:22: 35:24 (#0), + span: $DIR/issue-75930-derive-cfg.rs:39:22: 39:24 (#0), }, Group { delimiter: Brace, @@ -655,108 +656,108 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [ Punct { ch: '#', spacing: Joint, - span: $DIR/issue-75930-derive-cfg.rs:36:13: 36:14 (#0), + span: $DIR/issue-75930-derive-cfg.rs:40:13: 40:14 (#0), }, Punct { ch: '!', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:36:14: 36:15 (#0), + span: $DIR/issue-75930-derive-cfg.rs:40:14: 40:15 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:36:16: 36:19 (#0), + span: $DIR/issue-75930-derive-cfg.rs:40:16: 40:19 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:36:20: 36:25 (#0), + span: $DIR/issue-75930-derive-cfg.rs:40:20: 40:25 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:36:19: 36:26 (#0), + span: $DIR/issue-75930-derive-cfg.rs:40:19: 40:26 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:36:15: 36:27 (#0), + span: $DIR/issue-75930-derive-cfg.rs:40:15: 40:27 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:35:25: 37:10 (#0), + span: $DIR/issue-75930-derive-cfg.rs:39:25: 41:10 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:39:9: 39:10 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:9: 43:10 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "print_helper", - span: $DIR/issue-75930-derive-cfg.rs:39:11: 39:23 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:11: 43:23 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "c", - span: $DIR/issue-75930-derive-cfg.rs:39:24: 39:25 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:24: 43:25 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:39:23: 39:26 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:23: 43:26 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:39:10: 39:27 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:10: 43:27 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:39:28: 39:29 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:28: 43:29 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:39:30: 39:33 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:30: 43:33 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "not", - span: $DIR/issue-75930-derive-cfg.rs:39:34: 39:37 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:34: 43:37 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:39:38: 39:43 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:38: 43:43 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:39:37: 39:44 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:37: 43:44 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:39:33: 39:45 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:33: 43:45 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:39:29: 39:46 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:29: 43:46 (#0), }, Ident { ident: "fn", - span: $DIR/issue-75930-derive-cfg.rs:39:47: 39:49 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:47: 43:49 (#0), }, Ident { ident: "kept_fn", - span: $DIR/issue-75930-derive-cfg.rs:39:50: 39:57 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:50: 43:57 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [], - span: $DIR/issue-75930-derive-cfg.rs:39:57: 39:59 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:57: 43:59 (#0), }, Group { delimiter: Brace, @@ -764,82 +765,82 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [ Punct { ch: '#', spacing: Joint, - span: $DIR/issue-75930-derive-cfg.rs:40:13: 40:14 (#0), + span: $DIR/issue-75930-derive-cfg.rs:44:13: 44:14 (#0), }, Punct { ch: '!', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:40:14: 40:15 (#0), + span: $DIR/issue-75930-derive-cfg.rs:44:14: 44:15 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:40:16: 40:19 (#0), + span: $DIR/issue-75930-derive-cfg.rs:44:16: 44:19 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "not", - span: $DIR/issue-75930-derive-cfg.rs:40:20: 40:23 (#0), + span: $DIR/issue-75930-derive-cfg.rs:44:20: 44:23 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:40:24: 40:29 (#0), + span: $DIR/issue-75930-derive-cfg.rs:44:24: 44:29 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:40:23: 40:30 (#0), + span: $DIR/issue-75930-derive-cfg.rs:44:23: 44:30 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:40:19: 40:31 (#0), + span: $DIR/issue-75930-derive-cfg.rs:44:19: 44:31 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:40:15: 40:32 (#0), + span: $DIR/issue-75930-derive-cfg.rs:44:15: 44:32 (#0), }, Ident { ident: "let", - span: $DIR/issue-75930-derive-cfg.rs:41:13: 41:16 (#0), + span: $DIR/issue-75930-derive-cfg.rs:45:13: 45:16 (#0), }, Ident { ident: "my_val", - span: $DIR/issue-75930-derive-cfg.rs:41:17: 41:23 (#0), + span: $DIR/issue-75930-derive-cfg.rs:45:17: 45:23 (#0), }, Punct { ch: '=', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:41:24: 41:25 (#0), + span: $DIR/issue-75930-derive-cfg.rs:45:24: 45:25 (#0), }, Ident { ident: "true", - span: $DIR/issue-75930-derive-cfg.rs:41:26: 41:30 (#0), + span: $DIR/issue-75930-derive-cfg.rs:45:26: 45:30 (#0), }, Punct { ch: ';', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:41:30: 41:31 (#0), + span: $DIR/issue-75930-derive-cfg.rs:45:30: 45:31 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:39:60: 42:10 (#0), + span: $DIR/issue-75930-derive-cfg.rs:43:60: 46:10 (#0), }, Ident { ident: "enum", - span: $DIR/issue-75930-derive-cfg.rs:44:9: 44:13 (#0), + span: $DIR/issue-75930-derive-cfg.rs:48:9: 48:13 (#0), }, Ident { ident: "TupleEnum", - span: $DIR/issue-75930-derive-cfg.rs:44:14: 44:23 (#0), + span: $DIR/issue-75930-derive-cfg.rs:48:14: 48:23 (#0), }, Group { delimiter: Brace, stream: TokenStream [ Ident { ident: "Foo", - span: $DIR/issue-75930-derive-cfg.rs:45:13: 45:16 (#0), + span: $DIR/issue-75930-derive-cfg.rs:49:13: 49:16 (#0), }, Group { delimiter: Parenthesis, @@ -847,166 +848,166 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [ Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:46:17: 46:18 (#0), + span: $DIR/issue-75930-derive-cfg.rs:50:17: 50:18 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:46:19: 46:22 (#0), + span: $DIR/issue-75930-derive-cfg.rs:50:19: 50:22 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:46:23: 46:28 (#0), + span: $DIR/issue-75930-derive-cfg.rs:50:23: 50:28 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:46:22: 46:29 (#0), + span: $DIR/issue-75930-derive-cfg.rs:50:22: 50:29 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:46:18: 46:30 (#0), + span: $DIR/issue-75930-derive-cfg.rs:50:18: 50:30 (#0), }, Ident { ident: "u8", - span: $DIR/issue-75930-derive-cfg.rs:46:31: 46:33 (#0), + span: $DIR/issue-75930-derive-cfg.rs:50:31: 50:33 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:46:33: 46:34 (#0), + span: $DIR/issue-75930-derive-cfg.rs:50:33: 50:34 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:47:17: 47:18 (#0), + span: $DIR/issue-75930-derive-cfg.rs:51:17: 51:18 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:47:19: 47:22 (#0), + span: $DIR/issue-75930-derive-cfg.rs:51:19: 51:22 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:47:23: 47:28 (#0), + span: $DIR/issue-75930-derive-cfg.rs:51:23: 51:28 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:47:22: 47:29 (#0), + span: $DIR/issue-75930-derive-cfg.rs:51:22: 51:29 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:47:18: 47:30 (#0), + span: $DIR/issue-75930-derive-cfg.rs:51:18: 51:30 (#0), }, Ident { ident: "bool", - span: $DIR/issue-75930-derive-cfg.rs:47:31: 47:35 (#0), + span: $DIR/issue-75930-derive-cfg.rs:51:31: 51:35 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:47:35: 47:36 (#0), + span: $DIR/issue-75930-derive-cfg.rs:51:35: 51:36 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:48:17: 48:18 (#0), + span: $DIR/issue-75930-derive-cfg.rs:52:17: 52:18 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:48:19: 48:22 (#0), + span: $DIR/issue-75930-derive-cfg.rs:52:19: 52:22 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "not", - span: $DIR/issue-75930-derive-cfg.rs:48:23: 48:26 (#0), + span: $DIR/issue-75930-derive-cfg.rs:52:23: 52:26 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:48:27: 48:32 (#0), + span: $DIR/issue-75930-derive-cfg.rs:52:27: 52:32 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:48:26: 48:33 (#0), + span: $DIR/issue-75930-derive-cfg.rs:52:26: 52:33 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:48:22: 48:34 (#0), + span: $DIR/issue-75930-derive-cfg.rs:52:22: 52:34 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:48:18: 48:35 (#0), + span: $DIR/issue-75930-derive-cfg.rs:52:18: 52:35 (#0), }, Ident { ident: "i32", - span: $DIR/issue-75930-derive-cfg.rs:48:36: 48:39 (#0), + span: $DIR/issue-75930-derive-cfg.rs:52:36: 52:39 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:48:39: 48:40 (#0), + span: $DIR/issue-75930-derive-cfg.rs:52:39: 52:40 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:49:17: 49:18 (#0), + span: $DIR/issue-75930-derive-cfg.rs:53:17: 53:18 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:49:19: 49:22 (#0), + span: $DIR/issue-75930-derive-cfg.rs:53:19: 53:22 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:49:23: 49:28 (#0), + span: $DIR/issue-75930-derive-cfg.rs:53:23: 53:28 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:49:22: 49:29 (#0), + span: $DIR/issue-75930-derive-cfg.rs:53:22: 53:29 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:49:18: 49:30 (#0), + span: $DIR/issue-75930-derive-cfg.rs:53:18: 53:30 (#0), }, Ident { ident: "String", - span: $DIR/issue-75930-derive-cfg.rs:49:31: 49:37 (#0), + span: $DIR/issue-75930-derive-cfg.rs:53:31: 53:37 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:49:37: 49:38 (#0), + span: $DIR/issue-75930-derive-cfg.rs:53:37: 53:38 (#0), }, Ident { ident: "u8", - span: $DIR/issue-75930-derive-cfg.rs:49:39: 49:41 (#0), + span: $DIR/issue-75930-derive-cfg.rs:53:39: 53:41 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:45:16: 50:14 (#0), + span: $DIR/issue-75930-derive-cfg.rs:49:16: 54:14 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:44:24: 51:10 (#0), + span: $DIR/issue-75930-derive-cfg.rs:48:24: 55:10 (#0), }, Ident { ident: "struct", - span: $DIR/issue-75930-derive-cfg.rs:53:9: 53:15 (#0), + span: $DIR/issue-75930-derive-cfg.rs:57:9: 57:15 (#0), }, Ident { ident: "TupleStruct", - span: $DIR/issue-75930-derive-cfg.rs:53:16: 53:27 (#0), + span: $DIR/issue-75930-derive-cfg.rs:57:16: 57:27 (#0), }, Group { delimiter: Parenthesis, @@ -1014,187 +1015,265 @@ PRINT-ATTR INPUT (DEBUG): TokenStream [ Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:54:13: 54:14 (#0), + span: $DIR/issue-75930-derive-cfg.rs:58:13: 58:14 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:54:15: 54:18 (#0), + span: $DIR/issue-75930-derive-cfg.rs:58:15: 58:18 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:54:19: 54:24 (#0), + span: $DIR/issue-75930-derive-cfg.rs:58:19: 58:24 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:54:18: 54:25 (#0), + span: $DIR/issue-75930-derive-cfg.rs:58:18: 58:25 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:54:14: 54:26 (#0), + span: $DIR/issue-75930-derive-cfg.rs:58:14: 58:26 (#0), }, Ident { ident: "String", - span: $DIR/issue-75930-derive-cfg.rs:54:27: 54:33 (#0), + span: $DIR/issue-75930-derive-cfg.rs:58:27: 58:33 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:54:33: 54:34 (#0), + span: $DIR/issue-75930-derive-cfg.rs:58:33: 58:34 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:55:13: 55:14 (#0), + span: $DIR/issue-75930-derive-cfg.rs:59:13: 59:14 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:55:15: 55:18 (#0), + span: $DIR/issue-75930-derive-cfg.rs:59:15: 59:18 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "not", - span: $DIR/issue-75930-derive-cfg.rs:55:19: 55:22 (#0), + span: $DIR/issue-75930-derive-cfg.rs:59:19: 59:22 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:55:23: 55:28 (#0), + span: $DIR/issue-75930-derive-cfg.rs:59:23: 59:28 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:55:22: 55:29 (#0), + span: $DIR/issue-75930-derive-cfg.rs:59:22: 59:29 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:55:18: 55:30 (#0), + span: $DIR/issue-75930-derive-cfg.rs:59:18: 59:30 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:55:14: 55:31 (#0), + span: $DIR/issue-75930-derive-cfg.rs:59:14: 59:31 (#0), }, Ident { ident: "i32", - span: $DIR/issue-75930-derive-cfg.rs:55:32: 55:35 (#0), + span: $DIR/issue-75930-derive-cfg.rs:59:32: 59:35 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:55:35: 55:36 (#0), + span: $DIR/issue-75930-derive-cfg.rs:59:35: 59:36 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:56:13: 56:14 (#0), + span: $DIR/issue-75930-derive-cfg.rs:60:13: 60:14 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:56:15: 56:18 (#0), + span: $DIR/issue-75930-derive-cfg.rs:60:15: 60:18 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:56:19: 56:24 (#0), + span: $DIR/issue-75930-derive-cfg.rs:60:19: 60:24 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:56:18: 56:25 (#0), + span: $DIR/issue-75930-derive-cfg.rs:60:18: 60:25 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:56:14: 56:26 (#0), + span: $DIR/issue-75930-derive-cfg.rs:60:14: 60:26 (#0), }, Ident { ident: "bool", - span: $DIR/issue-75930-derive-cfg.rs:56:27: 56:31 (#0), + span: $DIR/issue-75930-derive-cfg.rs:60:27: 60:31 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:56:31: 56:32 (#0), + span: $DIR/issue-75930-derive-cfg.rs:60:31: 60:32 (#0), }, Ident { ident: "u8", - span: $DIR/issue-75930-derive-cfg.rs:57:13: 57:15 (#0), + span: $DIR/issue-75930-derive-cfg.rs:61:13: 61:15 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:53:27: 58:10 (#0), + span: $DIR/issue-75930-derive-cfg.rs:57:27: 62:10 (#0), }, Punct { ch: ';', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:58:10: 58:11 (#0), + span: $DIR/issue-75930-derive-cfg.rs:62:10: 62:11 (#0), + }, + Ident { + ident: "fn", + span: $DIR/issue-75930-derive-cfg.rs:64:9: 64:11 (#0), + }, + Ident { + ident: "plain_removed_fn", + span: $DIR/issue-75930-derive-cfg.rs:64:12: 64:28 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [], + span: $DIR/issue-75930-derive-cfg.rs:64:28: 64:30 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Punct { + ch: '#', + spacing: Joint, + span: $DIR/issue-75930-derive-cfg.rs:65:13: 65:14 (#0), + }, + Punct { + ch: '!', + spacing: Alone, + span: $DIR/issue-75930-derive-cfg.rs:65:14: 65:15 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "cfg_attr", + span: $DIR/issue-75930-derive-cfg.rs:65:16: 65:24 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "not", + span: $DIR/issue-75930-derive-cfg.rs:65:25: 65:28 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "FALSE", + span: $DIR/issue-75930-derive-cfg.rs:65:29: 65:34 (#0), + }, + ], + span: $DIR/issue-75930-derive-cfg.rs:65:28: 65:35 (#0), + }, + Punct { + ch: ',', + spacing: Alone, + span: $DIR/issue-75930-derive-cfg.rs:65:35: 65:36 (#0), + }, + Ident { + ident: "cfg", + span: $DIR/issue-75930-derive-cfg.rs:65:37: 65:40 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "FALSE", + span: $DIR/issue-75930-derive-cfg.rs:65:41: 65:46 (#0), + }, + ], + span: $DIR/issue-75930-derive-cfg.rs:65:40: 65:47 (#0), + }, + ], + span: $DIR/issue-75930-derive-cfg.rs:65:24: 65:48 (#0), + }, + ], + span: $DIR/issue-75930-derive-cfg.rs:65:15: 65:49 (#0), + }, + ], + span: $DIR/issue-75930-derive-cfg.rs:64:31: 66:10 (#0), }, Literal { kind: Integer, symbol: "0", suffix: None, - span: $DIR/issue-75930-derive-cfg.rs:60:9: 60:10 (#0), + span: $DIR/issue-75930-derive-cfg.rs:68:9: 68:10 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:24:17: 61:6 (#0), + span: $DIR/issue-75930-derive-cfg.rs:28:17: 69:6 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:24:12: 61:7 (#0), + span: $DIR/issue-75930-derive-cfg.rs:28:12: 69:7 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:61:7: 61:8 (#0), + span: $DIR/issue-75930-derive-cfg.rs:69:7: 69:8 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:62:5: 62:6 (#0), + span: $DIR/issue-75930-derive-cfg.rs:70:5: 70:6 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "print_helper", - span: $DIR/issue-75930-derive-cfg.rs:62:7: 62:19 (#0), + span: $DIR/issue-75930-derive-cfg.rs:70:7: 70:19 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "d", - span: $DIR/issue-75930-derive-cfg.rs:62:20: 62:21 (#0), + span: $DIR/issue-75930-derive-cfg.rs:70:20: 70:21 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:62:19: 62:22 (#0), + span: $DIR/issue-75930-derive-cfg.rs:70:19: 70:22 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:62:6: 62:23 (#0), + span: $DIR/issue-75930-derive-cfg.rs:70:6: 70:23 (#0), }, Ident { ident: "fourth", - span: $DIR/issue-75930-derive-cfg.rs:63:5: 63:11 (#0), + span: $DIR/issue-75930-derive-cfg.rs:71:5: 71:11 (#0), }, Punct { ch: ':', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:63:11: 63:12 (#0), + span: $DIR/issue-75930-derive-cfg.rs:71:11: 71:12 (#0), }, Ident { ident: "B", - span: $DIR/issue-75930-derive-cfg.rs:63:13: 63:14 (#0), + span: $DIR/issue-75930-derive-cfg.rs:71:13: 71:14 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:32: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:32: 72:2 (#0), }, ] -PRINT-DERIVE INPUT (DISPLAY): #[allow(dead_code)] #[print_helper(b)] #[print_helper(a)] struct Foo < B > +PRINT-DERIVE INPUT (DISPLAY): #[print_helper(a)] #[allow(dead_code)] #[print_helper(b)] struct Foo < B > { second : bool, third : [u8 ; @@ -1211,141 +1290,141 @@ PRINT-DERIVE INPUT (DEBUG): TokenStream [ Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { - ident: "allow", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + ident: "print_helper", + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { - ident: "dead_code", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + ident: "a", + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { - ident: "print_helper", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + ident: "allow", + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { - ident: "b", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + ident: "dead_code", + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "print_helper", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { - ident: "a", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + ident: "b", + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "struct", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "Foo", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: '<', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "B", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: '>', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Brace, stream: TokenStream [ Ident { ident: "second", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: ':', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "bool", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "third", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: ':', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "u8", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: ';', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Brace, @@ -1353,58 +1432,58 @@ PRINT-DERIVE INPUT (DEBUG): TokenStream [ Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "not", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "struct", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "Inner", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: ';', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "match", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "true", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Brace, @@ -1412,146 +1491,146 @@ PRINT-DERIVE INPUT (DEBUG): TokenStream [ Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "allow", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "warnings", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "false", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: '=', spacing: Joint, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: '>', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Brace, stream: TokenStream [], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "_", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: '=', spacing: Joint, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: '>', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Brace, stream: TokenStream [], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: ';', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "print_helper", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "c", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "not", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "fn", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "kept_fn", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Brace, @@ -1559,82 +1638,82 @@ PRINT-DERIVE INPUT (DEBUG): TokenStream [ Punct { ch: '#', spacing: Joint, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: '!', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "not", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "let", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "my_val", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: '=', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "true", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: ';', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "enum", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "TupleEnum", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Brace, stream: TokenStream [ Ident { ident: "Foo", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, @@ -1642,69 +1721,69 @@ PRINT-DERIVE INPUT (DEBUG): TokenStream [ Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "not", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "i32", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "u8", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "struct", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "TupleStruct", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, @@ -1712,120 +1791,120 @@ PRINT-DERIVE INPUT (DEBUG): TokenStream [ Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "cfg", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "not", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "FALSE", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "i32", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "u8", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: ';', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Literal { kind: Integer, symbol: "0", suffix: None, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: '#', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Bracket, stream: TokenStream [ Ident { ident: "print_helper", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Group { delimiter: Parenthesis, stream: TokenStream [ Ident { ident: "d", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "fourth", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: ':', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Ident { ident: "B", - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, Punct { ch: ',', spacing: Alone, - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ], - span: $DIR/issue-75930-derive-cfg.rs:21:1: 64:2 (#0), + span: $DIR/issue-75930-derive-cfg.rs:25:1: 72:2 (#0), }, ] diff --git a/src/test/ui/proc-macro/macro-rules-derive-cfg.rs b/src/test/ui/proc-macro/macro-rules-derive-cfg.rs new file mode 100644 index 0000000000..a221b9578a --- /dev/null +++ b/src/test/ui/proc-macro/macro-rules-derive-cfg.rs @@ -0,0 +1,31 @@ +// check-pass +// compile-flags: -Z span-debug --error-format human +// aux-build:test-macros.rs + +#![feature(rustc_attrs)] +#![feature(stmt_expr_attributes)] + +#![no_std] // Don't load unnecessary hygiene information from std +extern crate std; + +#[macro_use] +extern crate test_macros; + +macro_rules! produce_it { + ($expr:expr) => { + #[derive(Print)] + struct Foo { + val: [bool; { + let a = #[cfg_attr(not(FALSE), rustc_dummy(first))] $expr; + 0 + }] + } + } +} + +produce_it!(#[cfg_attr(not(FALSE), rustc_dummy(second))] { + #![cfg_attr(not(FALSE), allow(unused))] + 30 +}); + +fn main() {} diff --git a/src/test/ui/proc-macro/macro-rules-derive-cfg.stdout b/src/test/ui/proc-macro/macro-rules-derive-cfg.stdout new file mode 100644 index 0000000000..5db18590bd --- /dev/null +++ b/src/test/ui/proc-macro/macro-rules-derive-cfg.stdout @@ -0,0 +1,176 @@ +PRINT-DERIVE INPUT (DISPLAY): struct Foo +{ + val : + [bool ; + { + let a = #[rustc_dummy(first)] #[rustc_dummy(second)] + { # ! [allow(unused)] 30 } ; 0 + }], +} +PRINT-DERIVE INPUT (DEBUG): TokenStream [ + Ident { + ident: "struct", + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Ident { + ident: "Foo", + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "val", + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Punct { + ch: ':', + spacing: Alone, + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "bool", + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Punct { + ch: ';', + spacing: Alone, + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "let", + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Ident { + ident: "a", + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Punct { + ch: '=', + spacing: Alone, + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Punct { + ch: '#', + spacing: Alone, + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "rustc_dummy", + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "first", + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + ], + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + ], + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Punct { + ch: '#', + spacing: Alone, + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "rustc_dummy", + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "second", + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + ], + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + ], + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Punct { + ch: '#', + spacing: Joint, + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Punct { + ch: '!', + spacing: Alone, + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "allow", + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "unused", + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + ], + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + ], + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Literal { + kind: Integer, + symbol: "30", + suffix: None, + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + ], + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Punct { + ch: ';', + spacing: Alone, + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Literal { + kind: Integer, + symbol: "0", + suffix: None, + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + ], + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + ], + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + Punct { + ch: ',', + spacing: Alone, + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, + ], + span: $DIR/macro-rules-derive-cfg.rs:17:9: 22:10 (#4), + }, +] diff --git a/src/test/ui/proc-macro/meta-macro-hygiene.stdout b/src/test/ui/proc-macro/meta-macro-hygiene.stdout index a067b7b541..aa51fc8240 100644 --- a/src/test/ui/proc-macro/meta-macro-hygiene.stdout +++ b/src/test/ui/proc-macro/meta-macro-hygiene.stdout @@ -15,7 +15,7 @@ Respanned: TokenStream [Ident { ident: "$crate", span: $DIR/auxiliary/make-macro #![no_std /* 0#0 */] #[prelude_import /* 0#1 */] -use core /* 0#1 */::prelude /* 0#1 */::v1 /* 0#1 */::*; +use core /* 0#1 */::prelude /* 0#1 */::rust_2018 /* 0#1 */::*; #[macro_use /* 0#1 */] extern crate core /* 0#1 */; #[macro_use /* 0#1 */] diff --git a/src/test/ui/proc-macro/module_with_attrs.rs b/src/test/ui/proc-macro/module_with_attrs.rs new file mode 100644 index 0000000000..63e66a62ac --- /dev/null +++ b/src/test/ui/proc-macro/module_with_attrs.rs @@ -0,0 +1,4 @@ +// ignore-test + +#![rustfmt::skip] +#![print_attr] diff --git a/src/test/ui/proc-macro/nested-derive-cfg.rs b/src/test/ui/proc-macro/nested-derive-cfg.rs new file mode 100644 index 0000000000..53cfbb7c98 --- /dev/null +++ b/src/test/ui/proc-macro/nested-derive-cfg.rs @@ -0,0 +1,23 @@ +// compile-flags: -Z span-debug --error-format human +// aux-build:test-macros.rs +// check-pass + +#![no_std] // Don't load unnecessary hygiene information from std +extern crate std; + +#[macro_use] +extern crate test_macros; + +#[derive(Print)] +struct Foo { + #[cfg(FALSE)] removed: bool, + my_array: [bool; { + struct Inner { + #[cfg(FALSE)] removed_inner_field: u8, + non_removed_inner_field: usize + } + 0 + }] +} + +fn main() {} diff --git a/src/test/ui/proc-macro/nested-derive-cfg.stdout b/src/test/ui/proc-macro/nested-derive-cfg.stdout new file mode 100644 index 0000000000..cf4e5d94d8 --- /dev/null +++ b/src/test/ui/proc-macro/nested-derive-cfg.stdout @@ -0,0 +1,94 @@ +PRINT-DERIVE INPUT (DISPLAY): struct Foo +{ + my_array : + [bool ; { struct Inner { non_removed_inner_field : usize, } 0 }], +} +PRINT-DERIVE INPUT (DEBUG): TokenStream [ + Ident { + ident: "struct", + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + Ident { + ident: "Foo", + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "my_array", + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + Punct { + ch: ':', + spacing: Alone, + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "bool", + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + Punct { + ch: ';', + spacing: Alone, + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "struct", + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + Ident { + ident: "Inner", + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "non_removed_inner_field", + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + Punct { + ch: ':', + spacing: Alone, + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + Ident { + ident: "usize", + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + Punct { + ch: ',', + spacing: Alone, + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + ], + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + Literal { + kind: Integer, + symbol: "0", + suffix: None, + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + ], + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + ], + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + Punct { + ch: ',', + spacing: Alone, + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, + ], + span: $DIR/nested-derive-cfg.rs:12:1: 21:2 (#0), + }, +] diff --git a/src/test/ui/proc-macro/nonterminal-token-hygiene.stdout b/src/test/ui/proc-macro/nonterminal-token-hygiene.stdout index 1623d67772..ba3b3ee782 100644 --- a/src/test/ui/proc-macro/nonterminal-token-hygiene.stdout +++ b/src/test/ui/proc-macro/nonterminal-token-hygiene.stdout @@ -35,7 +35,7 @@ PRINT-BANG INPUT (DEBUG): TokenStream [ #![no_std /* 0#0 */] #[prelude_import /* 0#1 */] -use ::core /* 0#1 */::prelude /* 0#1 */::v1 /* 0#1 */::*; +use ::core /* 0#1 */::prelude /* 0#1 */::rust_2015 /* 0#1 */::*; #[macro_use /* 0#1 */] extern crate core /* 0#2 */; #[macro_use /* 0#1 */] diff --git a/src/test/ui/proc-macro/proc-macro-attributes.rs b/src/test/ui/proc-macro/proc-macro-attributes.rs index 6401522bdf..8d96381b9b 100644 --- a/src/test/ui/proc-macro/proc-macro-attributes.rs +++ b/src/test/ui/proc-macro/proc-macro-attributes.rs @@ -4,10 +4,18 @@ extern crate derive_b; #[B] //~ ERROR `B` is ambiguous + //~| WARN derive helper attribute is used before it is introduced + //~| WARN this was previously accepted #[C] //~ ERROR cannot find attribute `C` in this scope #[B(D)] //~ ERROR `B` is ambiguous + //~| WARN derive helper attribute is used before it is introduced + //~| WARN this was previously accepted #[B(E = "foo")] //~ ERROR `B` is ambiguous + //~| WARN derive helper attribute is used before it is introduced + //~| WARN this was previously accepted #[B(arbitrary tokens)] //~ ERROR `B` is ambiguous + //~| WARN derive helper attribute is used before it is introduced + //~| WARN this was previously accepted #[derive(B)] struct B; diff --git a/src/test/ui/proc-macro/proc-macro-attributes.stderr b/src/test/ui/proc-macro/proc-macro-attributes.stderr index 3ac93a7485..1ba04258df 100644 --- a/src/test/ui/proc-macro/proc-macro-attributes.stderr +++ b/src/test/ui/proc-macro/proc-macro-attributes.stderr @@ -1,5 +1,5 @@ error: cannot find attribute `C` in this scope - --> $DIR/proc-macro-attributes.rs:7:3 + --> $DIR/proc-macro-attributes.rs:9:3 | LL | #[C] | ^ help: a derive helper attribute with a similar name exists: `B` @@ -11,7 +11,7 @@ LL | #[B] | ^ ambiguous name | note: `B` could refer to the derive helper attribute defined here - --> $DIR/proc-macro-attributes.rs:11:10 + --> $DIR/proc-macro-attributes.rs:19:10 | LL | #[derive(B)] | ^ @@ -22,13 +22,13 @@ LL | #[macro_use] | ^^^^^^^^^^^^ error[E0659]: `B` is ambiguous (derive helper attribute vs any other name) - --> $DIR/proc-macro-attributes.rs:8:3 + --> $DIR/proc-macro-attributes.rs:10:3 | LL | #[B(D)] | ^ ambiguous name | note: `B` could refer to the derive helper attribute defined here - --> $DIR/proc-macro-attributes.rs:11:10 + --> $DIR/proc-macro-attributes.rs:19:10 | LL | #[derive(B)] | ^ @@ -39,13 +39,13 @@ LL | #[macro_use] | ^^^^^^^^^^^^ error[E0659]: `B` is ambiguous (derive helper attribute vs any other name) - --> $DIR/proc-macro-attributes.rs:9:3 + --> $DIR/proc-macro-attributes.rs:13:3 | LL | #[B(E = "foo")] | ^ ambiguous name | note: `B` could refer to the derive helper attribute defined here - --> $DIR/proc-macro-attributes.rs:11:10 + --> $DIR/proc-macro-attributes.rs:19:10 | LL | #[derive(B)] | ^ @@ -56,13 +56,13 @@ LL | #[macro_use] | ^^^^^^^^^^^^ error[E0659]: `B` is ambiguous (derive helper attribute vs any other name) - --> $DIR/proc-macro-attributes.rs:10:3 + --> $DIR/proc-macro-attributes.rs:16:3 | LL | #[B(arbitrary tokens)] | ^ ambiguous name | note: `B` could refer to the derive helper attribute defined here - --> $DIR/proc-macro-attributes.rs:11:10 + --> $DIR/proc-macro-attributes.rs:19:10 | LL | #[derive(B)] | ^ @@ -72,6 +72,55 @@ note: `B` could also refer to the derive macro imported here LL | #[macro_use] | ^^^^^^^^^^^^ -error: aborting due to 5 previous errors +warning: derive helper attribute is used before it is introduced + --> $DIR/proc-macro-attributes.rs:6:3 + | +LL | #[B] + | ^ +... +LL | #[derive(B)] + | - the attribute is introduced here + | + = note: `#[warn(legacy_derive_helpers)]` 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 #79202 + +warning: derive helper attribute is used before it is introduced + --> $DIR/proc-macro-attributes.rs:10:3 + | +LL | #[B(D)] + | ^ +... +LL | #[derive(B)] + | - the attribute is introduced here + | + = 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 #79202 + +warning: derive helper attribute is used before it is introduced + --> $DIR/proc-macro-attributes.rs:13:3 + | +LL | #[B(E = "foo")] + | ^ +... +LL | #[derive(B)] + | - the attribute is introduced here + | + = 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 #79202 + +warning: derive helper attribute is used before it is introduced + --> $DIR/proc-macro-attributes.rs:16:3 + | +LL | #[B(arbitrary tokens)] + | ^ +... +LL | #[derive(B)] + | - the attribute is introduced here + | + = 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 #79202 + +error: aborting due to 5 previous errors; 4 warnings emitted For more information about this error, try `rustc --explain E0659`. diff --git a/src/test/ui/proc-macro/reserved-macro-names.rs b/src/test/ui/proc-macro/reserved-macro-names.rs index 9f56eccb7a..c5e71a87df 100644 --- a/src/test/ui/proc-macro/reserved-macro-names.rs +++ b/src/test/ui/proc-macro/reserved-macro-names.rs @@ -17,9 +17,3 @@ pub fn cfg_attr(_: TokenStream, input: TokenStream) -> TokenStream { //~^ ERROR name `cfg_attr` is reserved in attribute namespace input } - -#[proc_macro_attribute] -pub fn derive(_: TokenStream, input: TokenStream) -> TokenStream { - //~^ ERROR name `derive` is reserved in attribute namespace - input -} diff --git a/src/test/ui/proc-macro/reserved-macro-names.stderr b/src/test/ui/proc-macro/reserved-macro-names.stderr index f871e43ce5..39bdd03be8 100644 --- a/src/test/ui/proc-macro/reserved-macro-names.stderr +++ b/src/test/ui/proc-macro/reserved-macro-names.stderr @@ -10,11 +10,5 @@ error: name `cfg_attr` is reserved in attribute namespace LL | pub fn cfg_attr(_: TokenStream, input: TokenStream) -> TokenStream { | ^^^^^^^^ -error: name `derive` is reserved in attribute namespace - --> $DIR/reserved-macro-names.rs:22:8 - | -LL | pub fn derive(_: TokenStream, input: TokenStream) -> TokenStream { - | ^^^^^^ - -error: aborting due to 3 previous errors +error: aborting due to 2 previous errors diff --git a/src/test/ui/proc-macro/weird-braces.rs b/src/test/ui/proc-macro/weird-braces.rs new file mode 100644 index 0000000000..b9a7e08f99 --- /dev/null +++ b/src/test/ui/proc-macro/weird-braces.rs @@ -0,0 +1,23 @@ +// aux-build:test-macros.rs +// check-pass +// compile-flags: -Z span-debug + +#![feature(custom_inner_attributes)] + +#![no_std] // Don't load unnecessary hygiene information from std +extern crate std; + +extern crate test_macros; +use test_macros::{print_target_and_args}; + +struct Foo; +trait Bar {} + +#[print_target_and_args(first_outer)] +#[print_target_and_args(second_outer)] +impl Bar<{1 > 0}> for Foo<{true}> { + #![print_target_and_args(first_inner)] + #![print_target_and_args(second_inner)] +} + +fn main() {} diff --git a/src/test/ui/proc-macro/weird-braces.stdout b/src/test/ui/proc-macro/weird-braces.stdout new file mode 100644 index 0000000000..25f0eaf0dd --- /dev/null +++ b/src/test/ui/proc-macro/weird-braces.stdout @@ -0,0 +1,524 @@ +PRINT-ATTR_ARGS INPUT (DISPLAY): first_outer +PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [ + Ident { + ident: "first_outer", + span: $DIR/weird-braces.rs:16:25: 16:36 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): #[print_target_and_args(second_outer)] impl Bar < { 1 > 0 } > for Foo < +{ true } > +{ + # ! [print_target_and_args(first_inner)] # ! + [print_target_and_args(second_inner)] +} +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Punct { + ch: '#', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "print_target_and_args", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "second_outer", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Ident { + ident: "impl", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Ident { + ident: "Bar", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '<', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Literal { + kind: Integer, + symbol: "1", + suffix: None, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Literal { + kind: Integer, + symbol: "0", + suffix: None, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Ident { + ident: "for", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Ident { + ident: "Foo", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '<', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "true", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Punct { + ch: '#', + spacing: Joint, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '!', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "print_target_and_args", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "first_inner", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '#', + spacing: Joint, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '!', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "print_target_and_args", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "second_inner", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, +] +PRINT-ATTR_ARGS INPUT (DISPLAY): second_outer +PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [ + Ident { + ident: "second_outer", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): impl Bar < { 1 > 0 } > for Foo < { true } > +{ + # ! [print_target_and_args(first_inner)] # ! + [print_target_and_args(second_inner)] +} +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Ident { + ident: "impl", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Ident { + ident: "Bar", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '<', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Literal { + kind: Integer, + symbol: "1", + suffix: None, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Literal { + kind: Integer, + symbol: "0", + suffix: None, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Ident { + ident: "for", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Ident { + ident: "Foo", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '<', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "true", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Punct { + ch: '#', + spacing: Joint, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '!', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "print_target_and_args", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "first_inner", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '#', + spacing: Joint, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '!', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "print_target_and_args", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "second_inner", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, +] +PRINT-ATTR_ARGS INPUT (DISPLAY): first_inner +PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [ + Ident { + ident: "first_inner", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): impl Bar < { 1 > 0 } > for Foo < { true } > +{ # ! [print_target_and_args(second_inner)] } +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Ident { + ident: "impl", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Ident { + ident: "Bar", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '<', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Literal { + kind: Integer, + symbol: "1", + suffix: None, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Literal { + kind: Integer, + symbol: "0", + suffix: None, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Ident { + ident: "for", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Ident { + ident: "Foo", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '<', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "true", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Punct { + ch: '#', + spacing: Joint, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '!', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Bracket, + stream: TokenStream [ + Ident { + ident: "print_target_and_args", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Parenthesis, + stream: TokenStream [ + Ident { + ident: "second_inner", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, +] +PRINT-ATTR_ARGS INPUT (DISPLAY): second_inner +PRINT-ATTR_ARGS INPUT (DEBUG): TokenStream [ + Ident { + ident: "second_inner", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, +] +PRINT-ATTR INPUT (DISPLAY): impl Bar < { 1 > 0 } > for Foo < { true } > { } +PRINT-ATTR INPUT (DEBUG): TokenStream [ + Ident { + ident: "impl", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Ident { + ident: "Bar", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '<', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Literal { + kind: Integer, + symbol: "1", + suffix: None, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Literal { + kind: Integer, + symbol: "0", + suffix: None, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Ident { + ident: "for", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Ident { + ident: "Foo", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '<', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [ + Ident { + ident: "true", + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + ], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Punct { + ch: '>', + spacing: Alone, + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, + Group { + delimiter: Brace, + stream: TokenStream [], + span: $DIR/weird-braces.rs:18:1: 21:2 (#0), + }, +] diff --git a/src/test/ui/pub/pub-reexport-priv-extern-crate.rs b/src/test/ui/pub/pub-reexport-priv-extern-crate.rs index e95d692402..dd5cd420fa 100644 --- a/src/test/ui/pub/pub-reexport-priv-extern-crate.rs +++ b/src/test/ui/pub/pub-reexport-priv-extern-crate.rs @@ -1,5 +1,3 @@ -#![allow(unused)] - extern crate core; pub use core as reexported_core; //~ ERROR `core` is private, and cannot be re-exported //~^ WARN this was previously accepted @@ -9,16 +7,14 @@ mod foo1 { } mod foo2 { - use foo1::core; //~ ERROR `core` is private, and cannot be re-exported - //~^ WARN this was previously accepted + use foo1::core; //~ ERROR crate import `core` is private pub mod bar { extern crate core; } } mod baz { - pub use foo2::bar::core; //~ ERROR `core` is private, and cannot be re-exported - //~^ WARN this was previously accepted + pub use foo2::bar::core; //~ ERROR crate import `core` is private } fn main() {} diff --git a/src/test/ui/pub/pub-reexport-priv-extern-crate.stderr b/src/test/ui/pub/pub-reexport-priv-extern-crate.stderr index 0b44c5a652..e4d73c6475 100644 --- a/src/test/ui/pub/pub-reexport-priv-extern-crate.stderr +++ b/src/test/ui/pub/pub-reexport-priv-extern-crate.stderr @@ -1,30 +1,37 @@ -error: extern crate `core` is private, and cannot be re-exported (error E0365), consider declaring with `pub` - --> $DIR/pub-reexport-priv-extern-crate.rs:4:9 +error[E0603]: crate import `core` is private + --> $DIR/pub-reexport-priv-extern-crate.rs:10:15 | -LL | pub use core as reexported_core; - | ^^^^^^^^^^^^^^^^^^^^^^^ +LL | use foo1::core; + | ^^^^ private crate import | - = note: `#[deny(pub_use_of_private_extern_crate)]` 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 #34537 +note: the crate import `core` is defined here + --> $DIR/pub-reexport-priv-extern-crate.rs:6:5 + | +LL | extern crate core; + | ^^^^^^^^^^^^^^^^^^ -error: extern crate `core` is private, and cannot be re-exported (error E0365), consider declaring with `pub` - --> $DIR/pub-reexport-priv-extern-crate.rs:12:9 +error[E0603]: crate import `core` is private + --> $DIR/pub-reexport-priv-extern-crate.rs:17:24 | -LL | use foo1::core; - | ^^^^^^^^^^ +LL | pub use foo2::bar::core; + | ^^^^ private crate import | - = 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 +note: the crate import `core` is defined here + --> $DIR/pub-reexport-priv-extern-crate.rs:12:9 + | +LL | extern crate core; + | ^^^^^^^^^^^^^^^^^^ error: extern crate `core` is private, and cannot be re-exported (error E0365), consider declaring with `pub` - --> $DIR/pub-reexport-priv-extern-crate.rs:20:13 + --> $DIR/pub-reexport-priv-extern-crate.rs:2:9 | -LL | pub use foo2::bar::core; - | ^^^^^^^^^^^^^^^ +LL | pub use core as reexported_core; + | ^^^^^^^^^^^^^^^^^^^^^^^ | + = note: `#[deny(pub_use_of_private_extern_crate)]` 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 #34537 error: aborting due to 3 previous errors +For more information about this error, try `rustc --explain E0603`. diff --git a/src/test/ui/range/range_traits-1.rs b/src/test/ui/range/range_traits-1.rs index 4f57c32e91..e28e47435c 100644 --- a/src/test/ui/range/range_traits-1.rs +++ b/src/test/ui/range/range_traits-1.rs @@ -4,45 +4,21 @@ use std::ops::*; struct AllTheRanges { a: Range, //~^ ERROR can't compare - //~| ERROR can't compare - //~| ERROR can't compare - //~| ERROR can't compare - //~| ERROR can't compare //~| ERROR Ord b: RangeTo, //~^ ERROR can't compare - //~| ERROR can't compare - //~| ERROR can't compare - //~| ERROR can't compare - //~| ERROR can't compare //~| ERROR Ord c: RangeFrom, //~^ 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, //~^ ERROR can't compare - //~| ERROR can't compare - //~| ERROR can't compare - //~| ERROR can't compare - //~| ERROR can't compare //~| ERROR Ord f: RangeToInclusive, //~^ 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 165fcd415c..e2c1eeb292 100644 --- a/src/test/ui/range/range_traits-1.stderr +++ b/src/test/ui/range/range_traits-1.stderr @@ -9,7 +9,7 @@ LL | a: Range, = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0277]: can't compare `std::ops::RangeTo` with `std::ops::RangeTo` - --> $DIR/range_traits-1.rs:12:5 + --> $DIR/range_traits-1.rs:8:5 | LL | b: RangeTo, | ^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeTo < std::ops::RangeTo` and `std::ops::RangeTo > std::ops::RangeTo` @@ -19,7 +19,7 @@ LL | b: RangeTo, = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0277]: can't compare `std::ops::RangeFrom` with `std::ops::RangeFrom` - --> $DIR/range_traits-1.rs:19:5 + --> $DIR/range_traits-1.rs:11:5 | LL | c: RangeFrom, | ^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeFrom < std::ops::RangeFrom` and `std::ops::RangeFrom > std::ops::RangeFrom` @@ -29,7 +29,7 @@ LL | c: RangeFrom, = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0277]: can't compare `std::ops::RangeFull` with `std::ops::RangeFull` - --> $DIR/range_traits-1.rs:26:5 + --> $DIR/range_traits-1.rs:14:5 | LL | d: RangeFull, | ^^^^^^^^^^^^ no implementation for `std::ops::RangeFull < std::ops::RangeFull` and `std::ops::RangeFull > std::ops::RangeFull` @@ -39,7 +39,7 @@ LL | d: RangeFull, = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0277]: can't compare `std::ops::RangeInclusive` with `std::ops::RangeInclusive` - --> $DIR/range_traits-1.rs:33:5 + --> $DIR/range_traits-1.rs:17:5 | LL | e: RangeInclusive, | ^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeInclusive < std::ops::RangeInclusive` and `std::ops::RangeInclusive > std::ops::RangeInclusive` @@ -49,247 +49,7 @@ LL | e: RangeInclusive, = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0277]: can't compare `std::ops::RangeToInclusive` with `std::ops::RangeToInclusive` - --> $DIR/range_traits-1.rs:40:5 - | -LL | f: RangeToInclusive, - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeToInclusive < std::ops::RangeToInclusive` and `std::ops::RangeToInclusive > std::ops::RangeToInclusive` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeToInclusive` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::Range` with `std::ops::Range` - --> $DIR/range_traits-1.rs:5:5 - | -LL | a: Range, - | ^^^^^^^^^^^^^^^ no implementation for `std::ops::Range < std::ops::Range` and `std::ops::Range > std::ops::Range` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::Range` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeTo` with `std::ops::RangeTo` - --> $DIR/range_traits-1.rs:12:5 - | -LL | b: RangeTo, - | ^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeTo < std::ops::RangeTo` and `std::ops::RangeTo > std::ops::RangeTo` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeTo` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeFrom` with `std::ops::RangeFrom` - --> $DIR/range_traits-1.rs:19:5 - | -LL | c: RangeFrom, - | ^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeFrom < std::ops::RangeFrom` and `std::ops::RangeFrom > std::ops::RangeFrom` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeFrom` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -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 `PartialOrd` is not implemented for `std::ops::RangeFull` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeInclusive` with `std::ops::RangeInclusive` - --> $DIR/range_traits-1.rs:33:5 - | -LL | e: RangeInclusive, - | ^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeInclusive < std::ops::RangeInclusive` and `std::ops::RangeInclusive > std::ops::RangeInclusive` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeInclusive` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeToInclusive` with `std::ops::RangeToInclusive` - --> $DIR/range_traits-1.rs:40:5 - | -LL | f: RangeToInclusive, - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeToInclusive < std::ops::RangeToInclusive` and `std::ops::RangeToInclusive > std::ops::RangeToInclusive` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeToInclusive` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::Range` with `std::ops::Range` - --> $DIR/range_traits-1.rs:5:5 - | -LL | a: Range, - | ^^^^^^^^^^^^^^^ no implementation for `std::ops::Range < std::ops::Range` and `std::ops::Range > std::ops::Range` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::Range` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeTo` with `std::ops::RangeTo` - --> $DIR/range_traits-1.rs:12:5 - | -LL | b: RangeTo, - | ^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeTo < std::ops::RangeTo` and `std::ops::RangeTo > std::ops::RangeTo` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeTo` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeFrom` with `std::ops::RangeFrom` - --> $DIR/range_traits-1.rs:19:5 - | -LL | c: RangeFrom, - | ^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeFrom < std::ops::RangeFrom` and `std::ops::RangeFrom > std::ops::RangeFrom` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeFrom` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -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 `PartialOrd` is not implemented for `std::ops::RangeFull` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeInclusive` with `std::ops::RangeInclusive` - --> $DIR/range_traits-1.rs:33:5 - | -LL | e: RangeInclusive, - | ^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeInclusive < std::ops::RangeInclusive` and `std::ops::RangeInclusive > std::ops::RangeInclusive` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeInclusive` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeToInclusive` with `std::ops::RangeToInclusive` - --> $DIR/range_traits-1.rs:40:5 - | -LL | f: RangeToInclusive, - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeToInclusive < std::ops::RangeToInclusive` and `std::ops::RangeToInclusive > std::ops::RangeToInclusive` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeToInclusive` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::Range` with `std::ops::Range` - --> $DIR/range_traits-1.rs:5:5 - | -LL | a: Range, - | ^^^^^^^^^^^^^^^ no implementation for `std::ops::Range < std::ops::Range` and `std::ops::Range > std::ops::Range` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::Range` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeTo` with `std::ops::RangeTo` - --> $DIR/range_traits-1.rs:12:5 - | -LL | b: RangeTo, - | ^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeTo < std::ops::RangeTo` and `std::ops::RangeTo > std::ops::RangeTo` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeTo` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeFrom` with `std::ops::RangeFrom` - --> $DIR/range_traits-1.rs:19:5 - | -LL | c: RangeFrom, - | ^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeFrom < std::ops::RangeFrom` and `std::ops::RangeFrom > std::ops::RangeFrom` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeFrom` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -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 `PartialOrd` is not implemented for `std::ops::RangeFull` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeInclusive` with `std::ops::RangeInclusive` - --> $DIR/range_traits-1.rs:33:5 - | -LL | e: RangeInclusive, - | ^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeInclusive < std::ops::RangeInclusive` and `std::ops::RangeInclusive > std::ops::RangeInclusive` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeInclusive` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeToInclusive` with `std::ops::RangeToInclusive` - --> $DIR/range_traits-1.rs:40:5 - | -LL | f: RangeToInclusive, - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeToInclusive < std::ops::RangeToInclusive` and `std::ops::RangeToInclusive > std::ops::RangeToInclusive` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeToInclusive` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::Range` with `std::ops::Range` - --> $DIR/range_traits-1.rs:5:5 - | -LL | a: Range, - | ^^^^^^^^^^^^^^^ no implementation for `std::ops::Range < std::ops::Range` and `std::ops::Range > std::ops::Range` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::Range` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeTo` with `std::ops::RangeTo` - --> $DIR/range_traits-1.rs:12:5 - | -LL | b: RangeTo, - | ^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeTo < std::ops::RangeTo` and `std::ops::RangeTo > std::ops::RangeTo` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeTo` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeFrom` with `std::ops::RangeFrom` - --> $DIR/range_traits-1.rs:19:5 - | -LL | c: RangeFrom, - | ^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeFrom < std::ops::RangeFrom` and `std::ops::RangeFrom > std::ops::RangeFrom` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeFrom` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -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 `PartialOrd` is not implemented for `std::ops::RangeFull` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeInclusive` with `std::ops::RangeInclusive` - --> $DIR/range_traits-1.rs:33:5 - | -LL | e: RangeInclusive, - | ^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeInclusive < std::ops::RangeInclusive` and `std::ops::RangeInclusive > std::ops::RangeInclusive` - | - = help: the trait `PartialOrd` is not implemented for `std::ops::RangeInclusive` - = note: required by `std::cmp::PartialOrd::partial_cmp` - = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error[E0277]: can't compare `std::ops::RangeToInclusive` with `std::ops::RangeToInclusive` - --> $DIR/range_traits-1.rs:40:5 + --> $DIR/range_traits-1.rs:20:5 | LL | f: RangeToInclusive, | ^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `std::ops::RangeToInclusive < std::ops::RangeToInclusive` and `std::ops::RangeToInclusive > std::ops::RangeToInclusive` @@ -308,7 +68,7 @@ LL | a: Range, = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0277]: the trait bound `std::ops::RangeTo: Ord` is not satisfied - --> $DIR/range_traits-1.rs:12:5 + --> $DIR/range_traits-1.rs:8:5 | LL | b: RangeTo, | ^^^^^^^^^^^^^^^^^ the trait `Ord` is not implemented for `std::ops::RangeTo` @@ -317,7 +77,7 @@ LL | b: RangeTo, = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0277]: the trait bound `std::ops::RangeFrom: Ord` is not satisfied - --> $DIR/range_traits-1.rs:19:5 + --> $DIR/range_traits-1.rs:11:5 | LL | c: RangeFrom, | ^^^^^^^^^^^^^^^^^^^ the trait `Ord` is not implemented for `std::ops::RangeFrom` @@ -326,7 +86,7 @@ LL | c: RangeFrom, = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0277]: the trait bound `std::ops::RangeFull: Ord` is not satisfied - --> $DIR/range_traits-1.rs:26:5 + --> $DIR/range_traits-1.rs:14:5 | LL | d: RangeFull, | ^^^^^^^^^^^^ the trait `Ord` is not implemented for `std::ops::RangeFull` @@ -335,7 +95,7 @@ LL | d: RangeFull, = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0277]: the trait bound `std::ops::RangeInclusive: Ord` is not satisfied - --> $DIR/range_traits-1.rs:33:5 + --> $DIR/range_traits-1.rs:17:5 | LL | e: RangeInclusive, | ^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Ord` is not implemented for `std::ops::RangeInclusive` @@ -344,7 +104,7 @@ LL | e: RangeInclusive, = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) error[E0277]: the trait bound `std::ops::RangeToInclusive: Ord` is not satisfied - --> $DIR/range_traits-1.rs:40:5 + --> $DIR/range_traits-1.rs:20:5 | LL | f: RangeToInclusive, | ^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Ord` is not implemented for `std::ops::RangeToInclusive` @@ -352,6 +112,6 @@ LL | f: RangeToInclusive, = note: required by `std::cmp::Ord::cmp` = note: this error originates in a derive macro (in Nightly builds, run with -Z macro-backtrace for more info) -error: aborting due to 36 previous errors +error: aborting due to 12 previous errors For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/range_inclusive_gate.rs b/src/test/ui/range_inclusive_gate.rs deleted file mode 100644 index e26e31b44a..0000000000 --- a/src/test/ui/range_inclusive_gate.rs +++ /dev/null @@ -1,14 +0,0 @@ -// run-pass - -#![allow(unused_comparisons)] -// Test that you only need the syntax gate if you don't mention the structs. -// (Obsoleted since both features are stabilized) - -fn main() { - let mut count = 0; - for i in 0_usize..=10 { - assert!(i >= 0 && i <= 10); - count += i; - } - assert_eq!(count, 55); -} 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 index 5bf381607c..d749ee00c2 100644 --- a/src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.stderr +++ b/src/test/ui/recursion/issue-38591-non-regular-dropck-recursion.stderr @@ -1,10 +1,10 @@ -error: reached the recursion limit while instantiating `drop_in_place::))` +error: reached the recursion limit while instantiating `std::ptr::drop_in_place::))` --> $SRC_DIR/core/src/ptr/mod.rs:LL:COL | LL | pub unsafe fn drop_in_place(to_drop: *mut T) { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | -note: `drop_in_place` defined here +note: `std::ptr::drop_in_place` defined here --> $SRC_DIR/core/src/ptr/mod.rs:LL:COL | LL | pub unsafe fn drop_in_place(to_drop: *mut T) { diff --git a/src/test/ui/recursion/recursive-types-are-not-uninhabited.stderr b/src/test/ui/recursion/recursive-types-are-not-uninhabited.stderr index c6f500ec8c..dfb69a3cc1 100644 --- a/src/test/ui/recursion/recursive-types-are-not-uninhabited.stderr +++ b/src/test/ui/recursion/recursive-types-are-not-uninhabited.stderr @@ -11,7 +11,7 @@ LL | Err(#[stable(feature = "rust1", since = "1.0.0")] E), | = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html - = note: the matched value is of type `std::result::Result` + = note: the matched value is of type `Result` help: you might want to use `if let` to ignore the variant that isn't matched | LL | if let Ok(x) = res { /* */ } diff --git a/src/test/ui/regions/issue-28848.stderr b/src/test/ui/regions/issue-28848.stderr index 726844a318..83313b3431 100644 --- a/src/test/ui/regions/issue-28848.stderr +++ b/src/test/ui/regions/issue-28848.stderr @@ -2,7 +2,7 @@ error[E0478]: lifetime bound not satisfied --> $DIR/issue-28848.rs:10:5 | LL | Foo::<'a, 'b>::xmute(u) - | ^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^ | note: lifetime parameter instantiated with the lifetime `'b` as defined on the function body at 9:16 --> $DIR/issue-28848.rs:9:16 diff --git a/src/test/ui/issues/issue-6157.rs b/src/test/ui/regions/issue-6157.rs similarity index 100% rename from src/test/ui/issues/issue-6157.rs rename to src/test/ui/regions/issue-6157.rs diff --git a/src/test/ui/regions-fn-subtyping-return-static-fail.nll.stderr b/src/test/ui/regions/regions-fn-subtyping-return-static-fail.nll.stderr similarity index 100% rename from src/test/ui/regions-fn-subtyping-return-static-fail.nll.stderr rename to src/test/ui/regions/regions-fn-subtyping-return-static-fail.nll.stderr diff --git a/src/test/ui/regions-fn-subtyping-return-static-fail.rs b/src/test/ui/regions/regions-fn-subtyping-return-static-fail.rs similarity index 100% rename from src/test/ui/regions-fn-subtyping-return-static-fail.rs rename to src/test/ui/regions/regions-fn-subtyping-return-static-fail.rs diff --git a/src/test/ui/regions-fn-subtyping-return-static-fail.stderr b/src/test/ui/regions/regions-fn-subtyping-return-static-fail.stderr similarity index 100% rename from src/test/ui/regions-fn-subtyping-return-static-fail.stderr rename to src/test/ui/regions/regions-fn-subtyping-return-static-fail.stderr diff --git a/src/test/ui/regions/regions-infer-paramd-indirect.stderr b/src/test/ui/regions/regions-infer-paramd-indirect.stderr index 620b25c9e0..95eb4d1f75 100644 --- a/src/test/ui/regions/regions-infer-paramd-indirect.stderr +++ b/src/test/ui/regions/regions-infer-paramd-indirect.stderr @@ -6,11 +6,11 @@ LL | self.f = b; | = note: expected struct `Box>` found struct `Box>` -note: the anonymous lifetime #2 defined on the method body at 21:5... - --> $DIR/regions-infer-paramd-indirect.rs:21:5 +note: the anonymous lifetime defined on the method body at 21:36... + --> $DIR/regions-infer-paramd-indirect.rs:21:36 | LL | fn set_f_bad(&mut self, b: Box) { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^ note: ...does not necessarily outlive the lifetime `'a` as defined on the impl at 16:6 --> $DIR/regions-infer-paramd-indirect.rs:16:6 | diff --git a/src/test/ui/issues/issue-2330.rs b/src/test/ui/resolve/issue-2330.rs similarity index 100% rename from src/test/ui/issues/issue-2330.rs rename to src/test/ui/resolve/issue-2330.rs diff --git a/src/test/ui/issues/issue-2330.stderr b/src/test/ui/resolve/issue-2330.stderr similarity index 100% rename from src/test/ui/issues/issue-2330.stderr rename to src/test/ui/resolve/issue-2330.stderr diff --git a/src/test/ui/resolve/issue-70736-async-fn-no-body-def-collector.stderr b/src/test/ui/resolve/issue-70736-async-fn-no-body-def-collector.stderr index 9b59e41501..4025b5030d 100644 --- a/src/test/ui/resolve/issue-70736-async-fn-no-body-def-collector.stderr +++ b/src/test/ui/resolve/issue-70736-async-fn-no-body-def-collector.stderr @@ -53,9 +53,10 @@ LL | async fn associated(); LL | async fn associated(); | ^ | | - | the `Output` of this `async fn`'s found opaque type + | checked the `Output` of this `async fn`, found opaque type | expected `()`, found opaque type | + = note: while checking the return type of the `async fn` = note: expected fn pointer `fn()` found fn pointer `fn() -> impl Future` diff --git a/src/test/ui/resolve/raw-ident-in-path.rs b/src/test/ui/resolve/raw-ident-in-path.rs index 1bcbef5943..7f1163bebd 100644 --- a/src/test/ui/resolve/raw-ident-in-path.rs +++ b/src/test/ui/resolve/raw-ident-in-path.rs @@ -1,5 +1,5 @@ // Regression test for issue #63882. -type A = crate::r#break; //~ ERROR cannot find type `r#break` in module `crate` +type A = crate::r#break; //~ ERROR cannot find type `r#break` in the crate root fn main() {} diff --git a/src/test/ui/resolve/raw-ident-in-path.stderr b/src/test/ui/resolve/raw-ident-in-path.stderr index f2efcbc8e8..771dacbbb2 100644 --- a/src/test/ui/resolve/raw-ident-in-path.stderr +++ b/src/test/ui/resolve/raw-ident-in-path.stderr @@ -1,8 +1,8 @@ -error[E0412]: cannot find type `r#break` in module `crate` +error[E0412]: cannot find type `r#break` in the crate root --> $DIR/raw-ident-in-path.rs:3:17 | LL | type A = crate::r#break; - | ^^^^^^^ not found in `crate` + | ^^^^^^^ not found in the crate root error: aborting due to previous error diff --git a/src/test/ui/return/issue-82612-return-mutable-reference.rs b/src/test/ui/return/issue-82612-return-mutable-reference.rs new file mode 100644 index 0000000000..db0d08ddb9 --- /dev/null +++ b/src/test/ui/return/issue-82612-return-mutable-reference.rs @@ -0,0 +1,24 @@ +// Regression test for #82612. + +use std::marker::PhantomData; + +pub trait SparseSetIndex { + fn sparse_set_index(&self) -> usize; +} +pub struct SparseArray { + values: Vec>, + marker: PhantomData, +} + +impl SparseArray { + pub fn get_or_insert_with(&mut self, index: I, func: impl FnOnce() -> V) -> &mut V { + let index = index.sparse_set_index(); + if index < self.values.len() { + let value = unsafe { self.values.get_unchecked_mut(index) }; + value.get_or_insert_with(func) //~ ERROR mismatched types + } + unsafe { self.values.get_unchecked_mut(index).as_mut().unwrap() } + } +} + +fn main() {} diff --git a/src/test/ui/return/issue-82612-return-mutable-reference.stderr b/src/test/ui/return/issue-82612-return-mutable-reference.stderr new file mode 100644 index 0000000000..a8045e043a --- /dev/null +++ b/src/test/ui/return/issue-82612-return-mutable-reference.stderr @@ -0,0 +1,28 @@ +error[E0308]: mismatched types + --> $DIR/issue-82612-return-mutable-reference.rs:18:13 + | +LL | / if index < self.values.len() { +LL | | let value = unsafe { self.values.get_unchecked_mut(index) }; +LL | | value.get_or_insert_with(func) + | | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `()`, found `&mut V` +LL | | } + | |_________- expected this to be `()` + | + = note: expected unit type `()` + found mutable reference `&mut V` +help: consider using a semicolon here + | +LL | value.get_or_insert_with(func); + | ^ +help: consider using a semicolon here + | +LL | }; + | ^ +help: you might have meant to return this value + | +LL | return value.get_or_insert_with(func); + | ^^^^^^ ^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/return/return-type.stderr b/src/test/ui/return/return-type.stderr index 535428f1c9..6ef921bef3 100644 --- a/src/test/ui/return/return-type.stderr +++ b/src/test/ui/return/return-type.stderr @@ -6,7 +6,7 @@ LL | foo(4 as usize) | = note: expected unit type `()` found struct `S` -help: try adding a semicolon +help: consider using a semicolon here | LL | foo(4 as usize); | ^ diff --git a/src/test/ui/return/tail-expr-as-potential-return.rs b/src/test/ui/return/tail-expr-as-potential-return.rs new file mode 100644 index 0000000000..83266abfa0 --- /dev/null +++ b/src/test/ui/return/tail-expr-as-potential-return.rs @@ -0,0 +1,10 @@ +fn main() { + let _ = foo(true); +} + +fn foo(x: bool) -> Result { + if x { + Err(42) //~ ERROR mismatched types + } + Ok(42.0) +} diff --git a/src/test/ui/return/tail-expr-as-potential-return.stderr b/src/test/ui/return/tail-expr-as-potential-return.stderr new file mode 100644 index 0000000000..f852796137 --- /dev/null +++ b/src/test/ui/return/tail-expr-as-potential-return.stderr @@ -0,0 +1,19 @@ +error[E0308]: mismatched types + --> $DIR/tail-expr-as-potential-return.rs:7:9 + | +LL | / if x { +LL | | Err(42) + | | ^^^^^^^ expected `()`, found enum `Result` +LL | | } + | |_____- expected this to be `()` + | + = note: expected unit type `()` + found enum `Result<_, {integer}>` +help: you might have meant to return this value + | +LL | return Err(42); + | ^^^^^^ ^ + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. 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 d015b72c5c..4580620186 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,4 +1,4 @@ -error[E0277]: `main` has invalid return type `std::result::Result` +error[E0277]: `main` has invalid return type `Result` --> $DIR/termination-trait-test-wrong-type.rs:6:1 | LL | / fn can_parse_zero_as_f32() -> Result { @@ -11,7 +11,7 @@ LL | | } LL | pub fn assert_test_result(result: T) { | ----------- required by this bound in `assert_test_result` | - = help: the trait `Termination` is not implemented for `std::result::Result` + = help: the trait `Termination` is not implemented for `Result` = note: this error originates in an attribute macro (in Nightly builds, run with -Z macro-backtrace for more info) error: aborting due to previous error 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 b2ed8a0d7d..e5754d355d 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 @@ -1,6 +1,6 @@ // run-pass // revisions: default mir-opt -//[mir-opt] compile-flags: -Zmir-opt-level=3 +//[mir-opt] compile-flags: -Zmir-opt-level=4 #[inline(never)] #[track_caller] diff --git a/src/test/ui/rfc-2091-track-caller/const-caller-location.rs b/src/test/ui/rfc-2091-track-caller/const-caller-location.rs index 89a42acafb..89b0b69f38 100644 --- a/src/test/ui/rfc-2091-track-caller/const-caller-location.rs +++ b/src/test/ui/rfc-2091-track-caller/const-caller-location.rs @@ -1,6 +1,6 @@ // run-pass // revisions: default mir-opt -//[mir-opt] compile-flags: -Zmir-opt-level=3 +//[mir-opt] compile-flags: -Zmir-opt-level=4 #![feature(const_caller_location, const_fn)] diff --git a/src/test/ui/rfc-2091-track-caller/intrinsic-wrapper.rs b/src/test/ui/rfc-2091-track-caller/intrinsic-wrapper.rs index d072fb76f1..87e52881c1 100644 --- a/src/test/ui/rfc-2091-track-caller/intrinsic-wrapper.rs +++ b/src/test/ui/rfc-2091-track-caller/intrinsic-wrapper.rs @@ -1,6 +1,6 @@ // run-pass // revisions: default mir-opt -//[mir-opt] compile-flags: -Zmir-opt-level=3 +//[mir-opt] compile-flags: -Zmir-opt-level=4 macro_rules! caller_location_from_macro { () => (core::panic::Location::caller()); diff --git a/src/test/ui/rfc-2091-track-caller/pass.rs b/src/test/ui/rfc-2091-track-caller/pass.rs index 4d548d4f0a..1b13ea3e93 100644 --- a/src/test/ui/rfc-2091-track-caller/pass.rs +++ b/src/test/ui/rfc-2091-track-caller/pass.rs @@ -1,6 +1,6 @@ // run-pass // revisions: default mir-opt -//[mir-opt] compile-flags: -Zmir-opt-level=3 +//[mir-opt] compile-flags: -Zmir-opt-level=4 #[track_caller] fn f() {} 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 index 0d7a5c4253..84b7c6701e 100644 --- a/src/test/ui/rfc-2091-track-caller/std-panic-locations.rs +++ b/src/test/ui/rfc-2091-track-caller/std-panic-locations.rs @@ -1,7 +1,7 @@ // run-pass // ignore-wasm32-bare compiled with panic=abort by default // revisions: default mir-opt -//[mir-opt] compile-flags: -Zmir-opt-level=3 +//[mir-opt] compile-flags: -Zmir-opt-level=4 #![feature(option_expect_none, option_unwrap_none)] #![allow(unconditional_panic)] 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 43135ebbf6..9d28eb9de0 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 // revisions: default mir-opt -//[mir-opt] compile-flags: -Zmir-opt-level=3 +//[mir-opt] compile-flags: -Zmir-opt-level=4 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 index 2122a4ca21..6588125781 100644 --- 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 @@ -1,6 +1,6 @@ // run-pass // revisions: default mir-opt -//[mir-opt] compile-flags: -Zmir-opt-level=3 +//[mir-opt] compile-flags: -Zmir-opt-level=4 fn pass_to_ptr_call(f: fn(T), x: T) { f(x); 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 index 922d2d7b70..8bb4dd288f 100644 --- a/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr.rs +++ b/src/test/ui/rfc-2091-track-caller/tracked-fn-ptr.rs @@ -1,6 +1,6 @@ // run-pass // revisions: default mir-opt -//[mir-opt] compile-flags: -Zmir-opt-level=3 +//[mir-opt] compile-flags: -Zmir-opt-level=4 fn ptr_call(f: fn()) { f(); diff --git a/src/test/ui/rfc-2126-extern-absolute-paths/non-existent-2.rs b/src/test/ui/rfc-2126-extern-absolute-paths/non-existent-2.rs index 61212f299b..def60feb5a 100644 --- a/src/test/ui/rfc-2126-extern-absolute-paths/non-existent-2.rs +++ b/src/test/ui/rfc-2126-extern-absolute-paths/non-existent-2.rs @@ -2,5 +2,5 @@ fn main() { let s = ::xcrate::S; - //~^ ERROR failed to resolve: could not find `xcrate` in crate root + //~^ ERROR failed to resolve: could not find `xcrate` in the list of imported crates } diff --git a/src/test/ui/rfc-2126-extern-absolute-paths/non-existent-2.stderr b/src/test/ui/rfc-2126-extern-absolute-paths/non-existent-2.stderr index 8b2a6933f3..7df4f06d1c 100644 --- a/src/test/ui/rfc-2126-extern-absolute-paths/non-existent-2.stderr +++ b/src/test/ui/rfc-2126-extern-absolute-paths/non-existent-2.stderr @@ -1,8 +1,8 @@ -error[E0433]: failed to resolve: could not find `xcrate` in crate root +error[E0433]: failed to resolve: could not find `xcrate` in the list of imported crates --> $DIR/non-existent-2.rs:4:15 | LL | let s = ::xcrate::S; - | ^^^^^^ could not find `xcrate` in crate root + | ^^^^^^ could not find `xcrate` in the list of imported crates error: aborting due to previous error diff --git a/src/test/ui/rfc-2294-if-let-guard/feature-gate.stderr b/src/test/ui/rfc-2294-if-let-guard/feature-gate.stderr index 113870c19f..00811fe304 100644 --- a/src/test/ui/rfc-2294-if-let-guard/feature-gate.stderr +++ b/src/test/ui/rfc-2294-if-let-guard/feature-gate.stderr @@ -15,6 +15,7 @@ LL | () if let 0 = 1 => {} | = note: see issue #51114 for more information = help: add `#![feature(if_let_guard)]` to the crate attributes to enable + = help: you can write `if matches!(, )` instead of `if let = ` error[E0658]: `if let` guards are experimental --> $DIR/feature-gate.rs:76:12 @@ -24,6 +25,7 @@ LL | () if let 0 = 1 => {} | = note: see issue #51114 for more information = help: add `#![feature(if_let_guard)]` to the crate attributes to enable + = help: you can write `if matches!(, )` instead of `if let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:10:16 @@ -33,6 +35,7 @@ LL | () if (let 0 = 1) => {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:14:18 @@ -42,6 +45,7 @@ LL | () if (((let 0 = 1))) => {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:18:23 @@ -51,6 +55,7 @@ LL | () if true && let 0 = 1 => {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:22:15 @@ -60,6 +65,7 @@ LL | () if let 0 = 1 && true => {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:26:16 @@ -69,6 +75,7 @@ LL | () if (let 0 = 1) && true => {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:30:24 @@ -78,6 +85,7 @@ LL | () if true && (let 0 = 1) => {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:34:16 @@ -87,6 +95,7 @@ LL | () if (let 0 = 1) && (let 0 = 1) => {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:34:31 @@ -96,6 +105,7 @@ LL | () if (let 0 = 1) && (let 0 = 1) => {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:40:15 @@ -105,6 +115,7 @@ LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:40:28 @@ -114,6 +125,7 @@ LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:40:42 @@ -123,6 +135,7 @@ LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:40:55 @@ -132,6 +145,7 @@ LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:40:68 @@ -141,6 +155,7 @@ LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:52:15 @@ -150,6 +165,7 @@ LL | () if let Range { start: _, end: _ } = (true..true) && false => {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:68:16 @@ -159,6 +175,7 @@ LL | use_expr!((let 0 = 1 && 0 == 0)); | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:71:16 @@ -168,6 +185,7 @@ LL | use_expr!((let 0 = 1)); | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error: `let` expressions are not supported here --> $DIR/feature-gate.rs:10:16 @@ -175,8 +193,7 @@ error: `let` expressions are not supported here LL | () if (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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:14:18 @@ -184,8 +201,7 @@ error: `let` expressions are not supported here LL | () if (((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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:18:23 @@ -193,8 +209,7 @@ error: `let` expressions are not supported here LL | () if true && 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:22:15 @@ -202,8 +217,7 @@ error: `let` expressions are not supported here LL | () if let 0 = 1 && true => {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:26:16 @@ -211,8 +225,7 @@ error: `let` expressions are not supported here LL | () if (let 0 = 1) && true => {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:30:24 @@ -220,8 +233,7 @@ error: `let` expressions are not supported here LL | () if true && (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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:34:16 @@ -229,8 +241,7 @@ error: `let` expressions are not supported here LL | () if (let 0 = 1) && (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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:34:31 @@ -238,8 +249,7 @@ error: `let` expressions are not supported here LL | () if (let 0 = 1) && (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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:40:15 @@ -247,8 +257,7 @@ error: `let` expressions are not supported here LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:40:28 @@ -256,8 +265,7 @@ error: `let` expressions are not supported here LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:40:42 @@ -265,8 +273,7 @@ error: `let` expressions are not supported here LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:40:55 @@ -274,8 +281,7 @@ error: `let` expressions are not supported here LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:40:68 @@ -283,8 +289,7 @@ error: `let` expressions are not supported here LL | () if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) => {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:52:15 @@ -292,8 +297,7 @@ error: `let` expressions are not supported here LL | () if let Range { start: _, end: _ } = (true..true) && false => {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:68:16 @@ -301,8 +305,7 @@ error: `let` expressions are not supported here 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:71:16 @@ -310,8 +313,7 @@ error: `let` expressions are not supported here 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: aborting due to 35 previous errors diff --git a/src/test/ui/rfc-2294-if-let-guard/typeck.stderr b/src/test/ui/rfc-2294-if-let-guard/typeck.stderr index 7ce93fe734..6407128d8d 100644 --- a/src/test/ui/rfc-2294-if-let-guard/typeck.stderr +++ b/src/test/ui/rfc-2294-if-let-guard/typeck.stderr @@ -2,10 +2,10 @@ error[E0308]: mismatched types --> $DIR/typeck.rs:10:22 | LL | Ok(x) if let Err(_) = x => {}, - | ^^^^^^ expected enum `Option`, found enum `std::result::Result` + | ^^^^^^ expected enum `Option`, found enum `Result` | = note: expected enum `Option` - found enum `std::result::Result<_, _>` + found enum `Result<_, _>` error[E0308]: mismatched types --> $DIR/typeck.rs:12:22 diff --git a/src/test/ui/rfc-2294-if-let-guard/warns.rs b/src/test/ui/rfc-2294-if-let-guard/warns.rs index 9691a12f45..d921367b91 100644 --- a/src/test/ui/rfc-2294-if-let-guard/warns.rs +++ b/src/test/ui/rfc-2294-if-let-guard/warns.rs @@ -5,7 +5,7 @@ fn irrefutable_let_guard() { match Some(()) { Some(x) if let () = x => {} - //~^ ERROR irrefutable if-let guard + //~^ ERROR irrefutable `if let` guard _ => {} } } diff --git a/src/test/ui/rfc-2294-if-let-guard/warns.stderr b/src/test/ui/rfc-2294-if-let-guard/warns.stderr index 45720f9fbc..c7627f1c3c 100644 --- a/src/test/ui/rfc-2294-if-let-guard/warns.stderr +++ b/src/test/ui/rfc-2294-if-let-guard/warns.stderr @@ -1,4 +1,4 @@ -error: irrefutable if-let guard +error: irrefutable `if let` guard pattern --> $DIR/warns.rs:7:24 | LL | Some(x) if let () = x => {} @@ -9,6 +9,8 @@ note: the lint level is defined here | LL | #[deny(irrefutable_let_patterns)] | ^^^^^^^^^^^^^^^^^^^^^^^^ + = note: this pattern will always match, so the guard is useless + = help: consider removing the guard and adding a `let` inside the match arm error: unreachable pattern --> $DIR/warns.rs:16:25 diff --git a/src/test/ui/rfc-2497-if-let-chains/ast-pretty-check.stdout b/src/test/ui/rfc-2497-if-let-chains/ast-pretty-check.stdout index c88f50c681..aeee43b01c 100644 --- a/src/test/ui/rfc-2497-if-let-chains/ast-pretty-check.stdout +++ b/src/test/ui/rfc-2497-if-let-chains/ast-pretty-check.stdout @@ -1,7 +1,7 @@ #![feature(prelude_import)] #![no_std] #[prelude_import] -use ::std::prelude::v1::*; +use ::std::prelude::rust_2015::*; #[macro_use] extern crate std; // build-pass (FIXME(62277): could be check-pass?) 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 861a4a80ad..1adce5e015 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 @@ -15,8 +15,7 @@ error: `let` expressions are not supported here LL | if &let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:35:9 @@ -24,8 +23,7 @@ error: `let` expressions are not supported here LL | if !let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:36:9 @@ -33,8 +31,7 @@ error: `let` expressions are not supported here LL | if *let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:38:9 @@ -42,8 +39,7 @@ error: `let` expressions are not supported here LL | if -let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:46:9 @@ -51,8 +47,7 @@ error: `let` expressions are not supported here LL | if (let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:50:16 @@ -60,8 +55,7 @@ error: `let` expressions are not supported here LL | if true || let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:51:17 @@ -69,8 +63,7 @@ error: `let` expressions are not supported here LL | if (true || let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:52:25 @@ -78,8 +71,7 @@ error: `let` expressions are not supported here LL | if true && (true || let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:53:25 @@ -87,8 +79,7 @@ error: `let` expressions are not supported here LL | if true || (true && let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:56:12 @@ -96,8 +87,7 @@ error: `let` expressions are not supported here LL | if x = let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:59:15 @@ -105,8 +95,7 @@ error: `let` expressions are not supported here LL | if true..(let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:61:11 @@ -114,8 +103,7 @@ error: `let` expressions are not supported here LL | if ..(let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:63:9 @@ -123,8 +111,7 @@ error: `let` expressions are not supported here LL | if (let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:67:8 @@ -132,8 +119,7 @@ error: `let` expressions are not supported here LL | if let Range { start: _, end: _ } = true..true && false {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:71:8 @@ -141,8 +127,7 @@ error: `let` expressions are not supported here LL | if let Range { start: _, end: _ } = true..true || false {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:78:8 @@ -150,8 +135,7 @@ error: `let` expressions are not supported here LL | if let Range { start: F, end } = F..|| true {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:86:8 @@ -159,8 +143,7 @@ error: `let` expressions are not supported here LL | if let Range { start: true, end } = t..&&false {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:92:19 @@ -168,8 +151,7 @@ error: `let` expressions are not supported here LL | if let true = let true = true {} | ^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:96:12 @@ -177,8 +159,7 @@ error: `let` expressions are not supported here LL | while &let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:99:12 @@ -186,8 +167,7 @@ error: `let` expressions are not supported here LL | while !let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:100:12 @@ -195,8 +175,7 @@ error: `let` expressions are not supported here LL | while *let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:102:12 @@ -204,8 +183,7 @@ error: `let` expressions are not supported here LL | while -let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:110:12 @@ -213,8 +191,7 @@ error: `let` expressions are not supported here LL | while (let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:114:19 @@ -222,8 +199,7 @@ error: `let` expressions are not supported here LL | while true || let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:115:20 @@ -231,8 +207,7 @@ error: `let` expressions are not supported here LL | while (true || let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:116:28 @@ -240,8 +215,7 @@ error: `let` expressions are not supported here LL | while true && (true || let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:117:28 @@ -249,8 +223,7 @@ error: `let` expressions are not supported here LL | while true || (true && let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:120:15 @@ -258,8 +231,7 @@ error: `let` expressions are not supported here LL | while x = let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:123:18 @@ -267,8 +239,7 @@ error: `let` expressions are not supported here LL | while true..(let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:125:14 @@ -276,8 +247,7 @@ error: `let` expressions are not supported here LL | while ..(let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:127:12 @@ -285,8 +255,7 @@ error: `let` expressions are not supported here LL | while (let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:131:11 @@ -294,8 +263,7 @@ error: `let` expressions are not supported here LL | while let Range { start: _, end: _ } = true..true && false {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:135:11 @@ -303,8 +271,7 @@ error: `let` expressions are not supported here LL | while let Range { start: _, end: _ } = true..true || false {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:142:11 @@ -312,8 +279,7 @@ error: `let` expressions are not supported here LL | while let Range { start: F, end } = F..|| true {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:150:11 @@ -321,8 +287,7 @@ error: `let` expressions are not supported here LL | while let Range { start: true, end } = t..&&false {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:156:22 @@ -330,8 +295,7 @@ error: `let` expressions are not supported here LL | while let true = let true = true {} | ^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:170:6 @@ -339,8 +303,7 @@ error: `let` expressions are not supported here LL | &let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:172:6 @@ -348,8 +311,7 @@ error: `let` expressions are not supported here LL | !let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:173:6 @@ -357,8 +319,7 @@ error: `let` expressions are not supported here LL | *let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:175:6 @@ -366,8 +327,7 @@ error: `let` expressions are not supported here LL | -let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:183:6 @@ -375,8 +335,7 @@ error: `let` expressions are not supported here LL | (let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:187:13 @@ -384,8 +343,7 @@ error: `let` expressions are not supported here LL | true || let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:188:14 @@ -393,8 +351,7 @@ error: `let` expressions are not supported here LL | (true || let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:189:22 @@ -402,8 +359,7 @@ error: `let` expressions are not supported here LL | true && (true || let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:192:9 @@ -411,8 +367,7 @@ error: `let` expressions are not supported here LL | x = let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:194:12 @@ -420,8 +375,7 @@ error: `let` expressions are not supported here LL | true..(let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:195:8 @@ -429,8 +383,7 @@ error: `let` expressions are not supported here LL | ..(let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:196:6 @@ -438,8 +391,7 @@ error: `let` expressions are not supported here LL | (let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:198:6 @@ -447,8 +399,7 @@ error: `let` expressions are not supported here LL | (let Range { start: _, end: _ } = true..true || false); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:202:6 @@ -456,8 +407,7 @@ error: `let` expressions are not supported here LL | (let true = let true = true); | ^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:202:17 @@ -465,8 +415,7 @@ error: `let` expressions are not supported here LL | (let true = let true = true); | ^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:207:6 @@ -474,8 +423,7 @@ error: `let` expressions are not supported here LL | &let 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:218:17 @@ -483,8 +431,7 @@ error: `let` expressions are not supported here LL | true && let 1 = 1 | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:222:17 @@ -492,8 +439,7 @@ error: `let` expressions are not supported here LL | true && let 1 = 1 | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:226:17 @@ -501,8 +447,7 @@ error: `let` expressions are not supported here LL | true && let 1 = 1 | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/disallowed-positions.rs:236:17 @@ -510,8 +455,7 @@ error: `let` expressions are not supported here LL | true && let 1 = 1 | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes --> $DIR/disallowed-positions.rs:20:12 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 f5cb1860d4..0b38b5f47e 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 @@ -13,11 +13,11 @@ fn _if() { if (let 0 = 1) {} //~^ ERROR `let` expressions in this position are experimental [E0658] - //~| ERROR `let` expressions are not supported here + //~| ERROR invalid parentheses around `let` expression in `if let` if (((let 0 = 1))) {} //~^ ERROR `let` expressions in this position are experimental [E0658] - //~| ERROR `let` expressions are not supported here + //~| ERROR invalid parentheses around `let` expression in `if let` if true && let 0 = 1 {} //~^ ERROR `let` expressions in this position are experimental [E0658] @@ -126,7 +126,7 @@ fn _macros() { //~| 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 invalid parentheses around `let` expression in `if let` //~| ERROR `let` expressions are not supported here #[cfg(FALSE)] (let 0 = 1); //~^ ERROR `let` expressions in this position are experimental [E0658] 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 178e862728..7364f62c92 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 @@ -15,6 +15,7 @@ LL | if (let 0 = 1) {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:18:11 @@ -24,6 +25,7 @@ LL | if (((let 0 = 1))) {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:22:16 @@ -33,6 +35,7 @@ LL | if true && let 0 = 1 {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:26:8 @@ -42,6 +45,7 @@ LL | if let 0 = 1 && true {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:30:9 @@ -51,6 +55,7 @@ LL | if (let 0 = 1) && true {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:34:17 @@ -60,6 +65,7 @@ LL | if true && (let 0 = 1) {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:38:9 @@ -69,6 +75,7 @@ LL | if (let 0 = 1) && (let 0 = 1) {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:38:24 @@ -78,6 +85,7 @@ LL | if (let 0 = 1) && (let 0 = 1) {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:44:8 @@ -87,6 +95,7 @@ LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:44:21 @@ -96,6 +105,7 @@ LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:44:35 @@ -105,6 +115,7 @@ LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:44:48 @@ -114,6 +125,7 @@ LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:44:61 @@ -123,6 +135,7 @@ LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:56:8 @@ -132,6 +145,7 @@ LL | if let Range { start: _, end: _ } = (true..true) && false {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:64:12 @@ -141,6 +155,7 @@ LL | while (let 0 = 1) {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:68:14 @@ -150,6 +165,7 @@ LL | while (((let 0 = 1))) {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:72:19 @@ -159,6 +175,7 @@ LL | while true && let 0 = 1 {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:76:11 @@ -168,6 +185,7 @@ LL | while let 0 = 1 && true {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:80:12 @@ -177,6 +195,7 @@ LL | while (let 0 = 1) && true {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:84:20 @@ -186,6 +205,7 @@ LL | while true && (let 0 = 1) {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:88:12 @@ -195,6 +215,7 @@ LL | while (let 0 = 1) && (let 0 = 1) {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:88:27 @@ -204,6 +225,7 @@ LL | while (let 0 = 1) && (let 0 = 1) {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:94:11 @@ -213,6 +235,7 @@ LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) { | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:94:24 @@ -222,6 +245,7 @@ LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) { | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:94:38 @@ -231,6 +255,7 @@ LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) { | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:94:51 @@ -240,6 +265,7 @@ LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) { | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:94:64 @@ -249,6 +275,7 @@ LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) { | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:106:11 @@ -258,6 +285,7 @@ LL | while let Range { start: _, end: _ } = (true..true) && false {} | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:131:20 @@ -267,6 +295,7 @@ LL | #[cfg(FALSE)] (let 0 = 1); | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:114:17 @@ -276,6 +305,7 @@ LL | noop_expr!((let 0 = 1)); | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:123:16 @@ -285,6 +315,7 @@ LL | use_expr!((let 0 = 1 && 0 == 0)); | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` error[E0658]: `let` expressions in this position are experimental --> $DIR/feature-gate.rs:127:16 @@ -294,24 +325,29 @@ LL | use_expr!((let 0 = 1)); | = note: see issue #53667 for more information = help: add `#![feature(let_chains)]` to the crate attributes to enable + = help: you can write `matches!(, )` instead of `let = ` -error: `let` expressions are not supported here - --> $DIR/feature-gate.rs:14:9 +error: invalid parentheses around `let` expression in `if let` + --> $DIR/feature-gate.rs:14:8 | LL | if (let 0 = 1) {} - | ^^^^^^^^^ + | ^ ^ + | +help: `if let` needs to be written without parentheses | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions +LL | if let 0 = 1 {} + | -- -- -error: `let` expressions are not supported here - --> $DIR/feature-gate.rs:18:11 +error: invalid parentheses around `let` expression in `if let` + --> $DIR/feature-gate.rs:18:8 | LL | if (((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 +help: `if let` needs to be written without parentheses + | +LL | if let 0 = 1 {} + | -- -- error: `let` expressions are not supported here --> $DIR/feature-gate.rs:22:16 @@ -319,8 +355,7 @@ error: `let` expressions are not supported here LL | if true && 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:26:8 @@ -328,8 +363,7 @@ error: `let` expressions are not supported here LL | if let 0 = 1 && true {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:30:9 @@ -337,8 +371,7 @@ error: `let` expressions are not supported here LL | if (let 0 = 1) && true {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:34:17 @@ -346,8 +379,7 @@ error: `let` expressions are not supported here LL | if true && (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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:38:9 @@ -355,8 +387,7 @@ error: `let` expressions are not supported here LL | if (let 0 = 1) && (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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:38:24 @@ -364,8 +395,7 @@ error: `let` expressions are not supported here LL | if (let 0 = 1) && (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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:44:8 @@ -373,8 +403,7 @@ error: `let` expressions are not supported here LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:44:21 @@ -382,8 +411,7 @@ error: `let` expressions are not supported here LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:44:35 @@ -391,8 +419,7 @@ error: `let` expressions are not supported here LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:44:48 @@ -400,8 +427,7 @@ error: `let` expressions are not supported here LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:44:61 @@ -409,8 +435,7 @@ error: `let` expressions are not supported here LL | if let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:56:8 @@ -418,8 +443,7 @@ error: `let` expressions are not supported here LL | if let Range { start: _, end: _ } = (true..true) && false {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:64:12 @@ -427,8 +451,7 @@ error: `let` expressions are not supported here LL | while (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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:68:14 @@ -436,8 +459,7 @@ error: `let` expressions are not supported here LL | while (((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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:72:19 @@ -445,8 +467,7 @@ error: `let` expressions are not supported here LL | while true && 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:76:11 @@ -454,8 +475,7 @@ error: `let` expressions are not supported here LL | while let 0 = 1 && true {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:80:12 @@ -463,8 +483,7 @@ error: `let` expressions are not supported here LL | while (let 0 = 1) && true {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:84:20 @@ -472,8 +491,7 @@ error: `let` expressions are not supported here LL | while true && (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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:88:12 @@ -481,8 +499,7 @@ error: `let` expressions are not supported here LL | while (let 0 = 1) && (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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:88:27 @@ -490,8 +507,7 @@ error: `let` expressions are not supported here LL | while (let 0 = 1) && (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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:94:11 @@ -499,8 +515,7 @@ error: `let` expressions are not supported here LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:94:24 @@ -508,8 +523,7 @@ error: `let` expressions are not supported here LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:94:38 @@ -517,8 +531,7 @@ error: `let` expressions are not supported here LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:94:51 @@ -526,8 +539,7 @@ error: `let` expressions are not supported here LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:94:64 @@ -535,8 +547,7 @@ error: `let` expressions are not supported here LL | while let 0 = 1 && let 1 = 2 && (let 2 = 3 && let 3 = 4 && let 4 = 5) {} | ^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:106:11 @@ -544,8 +555,7 @@ error: `let` expressions are not supported here LL | while let Range { start: _, end: _ } = (true..true) && false {} | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:123:16 @@ -553,8 +563,7 @@ error: `let` expressions are not supported here 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: `let` expressions are not supported here --> $DIR/feature-gate.rs:123:16 @@ -562,17 +571,18 @@ error: `let` expressions are not supported here 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses -error: `let` expressions are not supported here - --> $DIR/feature-gate.rs:127:16 +error: invalid parentheses around `let` expression in `if let` + --> $DIR/feature-gate.rs:127:15 | LL | use_expr!((let 0 = 1)); - | ^^^^^^^^^ + | ^ ^ + | +help: `if let` needs to be written without parentheses | - = note: only supported directly in conditions of `if`- and `while`-expressions - = note: as well as when nested within `&&` and parenthesis in those conditions +LL | use_expr!(let 0 = 1); + | -- -- error: `let` expressions are not supported here --> $DIR/feature-gate.rs:127:16 @@ -580,8 +590,7 @@ error: `let` expressions are not supported here 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 + = note: only supported directly without parentheses in conditions of `if`- and `while`-expressions, as well as in `let` chains within parentheses error: aborting due to 65 previous errors diff --git a/src/test/ui/rfc1623.rs b/src/test/ui/rfc1623.rs index aa6b1c0012..9ff4813d11 100644 --- a/src/test/ui/rfc1623.rs +++ b/src/test/ui/rfc1623.rs @@ -22,7 +22,7 @@ static SOME_STRUCT: &SomeStruct = &SomeStruct { foo: &Foo { bools: &[false, true] }, bar: &Bar { bools: &[true, true] }, f: &id, - //~^ ERROR mismatched types + //~^ ERROR implementation of `FnOnce` is not general enough }; // very simple test for a 'static static with default lifetime diff --git a/src/test/ui/rfc1623.stderr b/src/test/ui/rfc1623.stderr index 2835e47fa4..e95e68c8e6 100644 --- a/src/test/ui/rfc1623.stderr +++ b/src/test/ui/rfc1623.stderr @@ -1,12 +1,11 @@ -error[E0308]: mismatched types +error: implementation of `FnOnce` is not general enough --> $DIR/rfc1623.rs:24:8 | LL | f: &id, - | ^^^ one type is more general than the other + | ^^^ implementation of `FnOnce` is not general enough | - = note: expected type `FnOnce<(&'a Foo<'b>,)>` - found type `FnOnce<(&Foo<'_>,)>` + = note: `fn(&'2 Foo<'_>) -> &'2 Foo<'_> {id::<&'2 Foo<'_>>}` must implement `FnOnce<(&'1 Foo<'b>,)>`, for any lifetime `'1`... + = note: ...but it actually implements `FnOnce<(&'2 Foo<'_>,)>`, for some specific lifetime `'2` error: aborting due to previous error -For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/rmeta/emit-artifact-notifications.nll.stderr b/src/test/ui/rmeta/emit-artifact-notifications.nll.stderr new file mode 100644 index 0000000000..ed62f30028 --- /dev/null +++ b/src/test/ui/rmeta/emit-artifact-notifications.nll.stderr @@ -0,0 +1 @@ +{"artifact":"$TEST_BUILD_DIR/rmeta/emit-artifact-notifications.nll/libemit_artifact_notifications.rmeta","emit":"metadata"} diff --git a/src/test/ui/rmeta/emit-artifact-notifications.polonius.stderr b/src/test/ui/rmeta/emit-artifact-notifications.polonius.stderr new file mode 100644 index 0000000000..255c7b370f --- /dev/null +++ b/src/test/ui/rmeta/emit-artifact-notifications.polonius.stderr @@ -0,0 +1 @@ +{"artifact":"$TEST_BUILD_DIR/rmeta/emit-artifact-notifications.polonius/libemit_artifact_notifications.rmeta","emit":"metadata"} diff --git a/src/test/ui/emit-artifact-notifications.rs b/src/test/ui/rmeta/emit-artifact-notifications.rs similarity index 100% rename from src/test/ui/emit-artifact-notifications.rs rename to src/test/ui/rmeta/emit-artifact-notifications.rs diff --git a/src/test/ui/rmeta/emit-artifact-notifications.stderr b/src/test/ui/rmeta/emit-artifact-notifications.stderr new file mode 100644 index 0000000000..b2f0aa7575 --- /dev/null +++ b/src/test/ui/rmeta/emit-artifact-notifications.stderr @@ -0,0 +1 @@ +{"artifact":"$TEST_BUILD_DIR/rmeta/emit-artifact-notifications/libemit_artifact_notifications.rmeta","emit":"metadata"} diff --git a/src/test/ui/emit-metadata-obj.rs b/src/test/ui/rmeta/emit-metadata-obj.rs similarity index 100% rename from src/test/ui/emit-metadata-obj.rs rename to src/test/ui/rmeta/emit-metadata-obj.rs diff --git a/src/test/ui/rustdoc/README.md b/src/test/ui/rustdoc/README.md new file mode 100644 index 0000000000..1c98ab038a --- /dev/null +++ b/src/test/ui/rustdoc/README.md @@ -0,0 +1,3 @@ +This directory is for tests that have to do with rustdoc, but test the behavior +of rustc. For example, rustc should not warn that an attribute rustdoc uses is +unknown. diff --git a/src/test/ui/cfg-rustdoc.rs b/src/test/ui/rustdoc/cfg-rustdoc.rs similarity index 100% rename from src/test/ui/cfg-rustdoc.rs rename to src/test/ui/rustdoc/cfg-rustdoc.rs diff --git a/src/test/ui/cfg-rustdoc.stderr b/src/test/ui/rustdoc/cfg-rustdoc.stderr similarity index 100% rename from src/test/ui/cfg-rustdoc.stderr rename to src/test/ui/rustdoc/cfg-rustdoc.stderr diff --git a/src/test/ui/check-doc-alias-attr-location.rs b/src/test/ui/rustdoc/check-doc-alias-attr-location.rs similarity index 100% rename from src/test/ui/check-doc-alias-attr-location.rs rename to src/test/ui/rustdoc/check-doc-alias-attr-location.rs diff --git a/src/test/ui/check-doc-alias-attr-location.stderr b/src/test/ui/rustdoc/check-doc-alias-attr-location.stderr similarity index 100% rename from src/test/ui/check-doc-alias-attr-location.stderr rename to src/test/ui/rustdoc/check-doc-alias-attr-location.stderr diff --git a/src/test/ui/check-doc-alias-attr.rs b/src/test/ui/rustdoc/check-doc-alias-attr.rs similarity index 50% rename from src/test/ui/check-doc-alias-attr.rs rename to src/test/ui/rustdoc/check-doc-alias-attr.rs index 912e35f916..719b98604c 100644 --- a/src/test/ui/check-doc-alias-attr.rs +++ b/src/test/ui/rustdoc/check-doc-alias-attr.rs @@ -1,11 +1,11 @@ #![crate_type = "lib"] #[doc(alias = "foo")] // ok! +#[doc(alias("bar", "baz"))] // ok! pub struct Bar; #[doc(alias)] //~ ERROR #[doc(alias = 0)] //~ ERROR -#[doc(alias("bar"))] //~ ERROR #[doc(alias = "\"")] //~ ERROR #[doc(alias = "\n")] //~ ERROR #[doc(alias = " @@ -13,4 +13,16 @@ pub struct Bar; #[doc(alias = "\t")] //~ ERROR #[doc(alias = " hello")] //~ ERROR #[doc(alias = "hello ")] //~ ERROR +#[doc(alias = "")] //~ ERROR pub struct Foo; + +#[doc(alias(0))] //~ ERROR +#[doc(alias("\""))] //~ ERROR +#[doc(alias("\n"))] //~ ERROR +#[doc(alias(" +"))] //~^ ERROR +#[doc(alias("\t"))] //~ ERROR +#[doc(alias(" hello"))] //~ ERROR +#[doc(alias("hello "))] //~ ERROR +#[doc(alias(""))] //~ ERROR +pub struct Foo2; diff --git a/src/test/ui/rustdoc/check-doc-alias-attr.stderr b/src/test/ui/rustdoc/check-doc-alias-attr.stderr new file mode 100644 index 0000000000..f99d69dc10 --- /dev/null +++ b/src/test/ui/rustdoc/check-doc-alias-attr.stderr @@ -0,0 +1,108 @@ +error: doc alias attribute expects a string `#[doc(alias = "a")]` or a list of strings `#[doc(alias("a", "b"))]` + --> $DIR/check-doc-alias-attr.rs:7:7 + | +LL | #[doc(alias)] + | ^^^^^ + +error: doc alias attribute expects a string `#[doc(alias = "a")]` or a list of strings `#[doc(alias("a", "b"))]` + --> $DIR/check-doc-alias-attr.rs:8:7 + | +LL | #[doc(alias = 0)] + | ^^^^^^^^^ + +error: '\"' character isn't allowed in `#[doc(alias = "...")]` + --> $DIR/check-doc-alias-attr.rs:9:15 + | +LL | #[doc(alias = "\"")] + | ^^^^ + +error: '\n' character isn't allowed in `#[doc(alias = "...")]` + --> $DIR/check-doc-alias-attr.rs:10:15 + | +LL | #[doc(alias = "\n")] + | ^^^^ + +error: '\n' character isn't allowed in `#[doc(alias = "...")]` + --> $DIR/check-doc-alias-attr.rs:11:15 + | +LL | #[doc(alias = " + | _______________^ +LL | | ")] + | |_^ + +error: '\t' character isn't allowed in `#[doc(alias = "...")]` + --> $DIR/check-doc-alias-attr.rs:13:15 + | +LL | #[doc(alias = "\t")] + | ^^^^ + +error: `#[doc(alias = "...")]` cannot start or end with ' ' + --> $DIR/check-doc-alias-attr.rs:14:15 + | +LL | #[doc(alias = " hello")] + | ^^^^^^^^ + +error: `#[doc(alias = "...")]` cannot start or end with ' ' + --> $DIR/check-doc-alias-attr.rs:15:15 + | +LL | #[doc(alias = "hello ")] + | ^^^^^^^^ + +error: `#[doc(alias = "...")]` attribute cannot have empty value + --> $DIR/check-doc-alias-attr.rs:16:15 + | +LL | #[doc(alias = "")] + | ^^ + +error: `#[doc(alias("a"))]` expects string literals + --> $DIR/check-doc-alias-attr.rs:19:13 + | +LL | #[doc(alias(0))] + | ^ + +error: '\"' character isn't allowed in `#[doc(alias("..."))]` + --> $DIR/check-doc-alias-attr.rs:20:13 + | +LL | #[doc(alias("\""))] + | ^^^^ + +error: '\n' character isn't allowed in `#[doc(alias("..."))]` + --> $DIR/check-doc-alias-attr.rs:21:13 + | +LL | #[doc(alias("\n"))] + | ^^^^ + +error: '\n' character isn't allowed in `#[doc(alias("..."))]` + --> $DIR/check-doc-alias-attr.rs:22:13 + | +LL | #[doc(alias(" + | _____________^ +LL | | "))] + | |_^ + +error: '\t' character isn't allowed in `#[doc(alias("..."))]` + --> $DIR/check-doc-alias-attr.rs:24:13 + | +LL | #[doc(alias("\t"))] + | ^^^^ + +error: `#[doc(alias("..."))]` cannot start or end with ' ' + --> $DIR/check-doc-alias-attr.rs:25:13 + | +LL | #[doc(alias(" hello"))] + | ^^^^^^^^ + +error: `#[doc(alias("..."))]` cannot start or end with ' ' + --> $DIR/check-doc-alias-attr.rs:26:13 + | +LL | #[doc(alias("hello "))] + | ^^^^^^^^ + +error: `#[doc(alias("..."))]` attribute cannot have empty value + --> $DIR/check-doc-alias-attr.rs:27:13 + | +LL | #[doc(alias(""))] + | ^^ + +error: aborting due to 17 previous errors + diff --git a/src/test/ui/doc-alias-crate-level.rs b/src/test/ui/rustdoc/doc-alias-crate-level.rs similarity index 100% rename from src/test/ui/doc-alias-crate-level.rs rename to src/test/ui/rustdoc/doc-alias-crate-level.rs diff --git a/src/test/ui/doc-alias-crate-level.stderr b/src/test/ui/rustdoc/doc-alias-crate-level.stderr similarity index 84% rename from src/test/ui/doc-alias-crate-level.stderr rename to src/test/ui/rustdoc/doc-alias-crate-level.stderr index c0467514ae..bd32609ade 100644 --- a/src/test/ui/doc-alias-crate-level.stderr +++ b/src/test/ui/rustdoc/doc-alias-crate-level.stderr @@ -4,7 +4,7 @@ error: '\'' character isn't allowed in `#[doc(alias = "...")]` LL | #[doc(alias = "shouldn't work!")] | ^^^^^^^^^^^^^^^^^ -error: `#![doc(alias = "...")]` isn't allowed as a crate level attribute +error: `#![doc(alias = "...")]` isn't allowed as a crate-level attribute --> $DIR/doc-alias-crate-level.rs:5:8 | LL | #![doc(alias = "not working!")] diff --git a/src/test/ui/doc-alias-same-name.rs b/src/test/ui/rustdoc/doc-alias-same-name.rs similarity index 100% rename from src/test/ui/doc-alias-same-name.rs rename to src/test/ui/rustdoc/doc-alias-same-name.rs diff --git a/src/test/ui/doc-alias-same-name.stderr b/src/test/ui/rustdoc/doc-alias-same-name.stderr similarity index 100% rename from src/test/ui/doc-alias-same-name.stderr rename to src/test/ui/rustdoc/doc-alias-same-name.stderr diff --git a/src/test/ui/doc_keyword.rs b/src/test/ui/rustdoc/doc_keyword.rs similarity index 100% rename from src/test/ui/doc_keyword.rs rename to src/test/ui/rustdoc/doc_keyword.rs diff --git a/src/test/ui/doc_keyword.stderr b/src/test/ui/rustdoc/doc_keyword.stderr similarity index 87% rename from src/test/ui/doc_keyword.stderr rename to src/test/ui/rustdoc/doc_keyword.stderr index d72a876163..0679bb8c5a 100644 --- a/src/test/ui/doc_keyword.stderr +++ b/src/test/ui/rustdoc/doc_keyword.stderr @@ -10,7 +10,7 @@ error: `#[doc(keyword = "...")]` can only be used on modules LL | #[doc(keyword = "hall")] | ^^^^^^^^^^^^^^^^ -error: `#![doc(keyword = "...")]` isn't allowed as a crate level attribute +error: `#![doc(keyword = "...")]` isn't allowed as a crate-level attribute --> $DIR/doc_keyword.rs:4:8 | LL | #![doc(keyword = "hello")] diff --git a/src/test/ui/unterminated-doc-comment.rs b/src/test/ui/rustdoc/unterminated-doc-comment.rs similarity index 100% rename from src/test/ui/unterminated-doc-comment.rs rename to src/test/ui/rustdoc/unterminated-doc-comment.rs diff --git a/src/test/ui/unterminated-doc-comment.stderr b/src/test/ui/rustdoc/unterminated-doc-comment.stderr similarity index 100% rename from src/test/ui/unterminated-doc-comment.stderr rename to src/test/ui/rustdoc/unterminated-doc-comment.stderr diff --git a/src/test/ui/sanitize/hwaddress.rs b/src/test/ui/sanitize/hwaddress.rs new file mode 100644 index 0000000000..ad5d024545 --- /dev/null +++ b/src/test/ui/sanitize/hwaddress.rs @@ -0,0 +1,19 @@ +// needs-sanitizer-support +// needs-sanitizer-hwaddress +// +// compile-flags: -Z sanitizer=hwaddress -O -g +// +// run-fail +// error-pattern: HWAddressSanitizer: tag-mismatch + +#![feature(test)] + +use std::hint::black_box; + +fn main() { + let xs = vec![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/save-analysis/issue-68621.full_tait.stderr b/src/test/ui/save-analysis/issue-68621.full_tait.stderr new file mode 100644 index 0000000000..193aed2615 --- /dev/null +++ b/src/test/ui/save-analysis/issue-68621.full_tait.stderr @@ -0,0 +1,17 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-68621.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: could not find defining uses + --> $DIR/issue-68621.rs:17:19 + | +LL | type Future = impl Trait; + | ^^^^^^^^^^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/save-analysis/issue-68621.stderr b/src/test/ui/save-analysis/issue-68621.min_tait.stderr similarity index 82% rename from src/test/ui/save-analysis/issue-68621.stderr rename to src/test/ui/save-analysis/issue-68621.min_tait.stderr index 3af6d0a3e0..cccfb3de8f 100644 --- a/src/test/ui/save-analysis/issue-68621.stderr +++ b/src/test/ui/save-analysis/issue-68621.min_tait.stderr @@ -1,5 +1,5 @@ error: could not find defining uses - --> $DIR/issue-68621.rs:14:19 + --> $DIR/issue-68621.rs:17:19 | LL | type Future = impl Trait; | ^^^^^^^^^^ diff --git a/src/test/ui/save-analysis/issue-68621.rs b/src/test/ui/save-analysis/issue-68621.rs index 96af085c5b..1f4a9080cc 100644 --- a/src/test/ui/save-analysis/issue-68621.rs +++ b/src/test/ui/save-analysis/issue-68621.rs @@ -1,6 +1,9 @@ // compile-flags: -Zsave-analysis -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait Trait {} 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 f95f548fee..3576eed71a 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic.rs +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic.rs @@ -25,6 +25,8 @@ extern "platform-intrinsic" { fn simd_and(x: T, y: T) -> T; fn simd_or(x: T, y: T) -> T; fn simd_xor(x: T, y: T) -> T; + + fn simd_neg(x: T) -> T; } fn main() { @@ -60,6 +62,9 @@ fn main() { simd_xor(x, x); simd_xor(y, y); + simd_neg(x); + simd_neg(z); + simd_add(0, 0); //~^ ERROR expected SIMD input type, found non-SIMD `i32` @@ -80,6 +85,9 @@ fn main() { simd_xor(0, 0); //~^ ERROR expected SIMD input type, found non-SIMD `i32` + simd_neg(0); + //~^ ERROR expected SIMD input type, found non-SIMD `i32` + simd_shl(z, z); //~^ ERROR unsupported operation on `f32x4` with element `f32` 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 70cdc34684..99c5196334 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic.stderr +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-arithmetic.stderr @@ -1,87 +1,93 @@ error[E0511]: invalid monomorphization of `simd_add` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:64:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:69: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:66:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:71: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:68:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:73: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:70:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:75: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:72:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:77: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:74:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:79: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:76:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:81: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:78:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:83: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:80:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:85:9 | LL | simd_xor(0, 0); | ^^^^^^^^^^^^^^ +error[E0511]: invalid monomorphization of `simd_neg` intrinsic: expected SIMD input type, found non-SIMD `i32` + --> $DIR/simd-intrinsic-generic-arithmetic.rs:88:9 + | +LL | simd_neg(0); + | ^^^^^^^^^^^ + error[E0511]: invalid monomorphization of `simd_shl` intrinsic: unsupported operation on `f32x4` with element `f32` - --> $DIR/simd-intrinsic-generic-arithmetic.rs:84:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:92: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:86:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:94: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:88:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:96: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:90:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:98: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:92:9 + --> $DIR/simd-intrinsic-generic-arithmetic.rs:100:9 | LL | simd_xor(z, z); | ^^^^^^^^^^^^^^ -error: aborting due to 14 previous errors +error: aborting due to 15 previous errors For more information about this error, try `rustc --explain E0511`. 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 5929d05f4d..493cd7a477 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.rs +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.rs @@ -9,10 +9,6 @@ struct i32x2(i32, i32); #[repr(simd)] #[derive(Copy, Clone)] #[allow(non_camel_case_types)] -struct i32x3(i32, i32, i32); -#[repr(simd)] -#[derive(Copy, Clone)] -#[allow(non_camel_case_types)] struct i32x4(i32, i32, i32, i32); #[repr(simd)] #[derive(Copy, Clone)] @@ -27,10 +23,6 @@ struct f32x2(f32, f32); #[repr(simd)] #[derive(Copy, Clone)] #[allow(non_camel_case_types)] -struct f32x3(f32, f32, f32); -#[repr(simd)] -#[derive(Copy, Clone)] -#[allow(non_camel_case_types)] struct f32x4(f32, f32, f32, f32); #[repr(simd)] #[derive(Copy, Clone)] @@ -43,7 +35,6 @@ extern "platform-intrinsic" { fn simd_extract(x: T, idx: u32) -> E; fn simd_shuffle2(x: T, y: T, idx: [u32; 2]) -> U; - fn simd_shuffle3(x: T, y: T, idx: [u32; 3]) -> U; fn simd_shuffle4(x: T, y: T, idx: [u32; 4]) -> U; fn simd_shuffle8(x: T, y: T, idx: [u32; 8]) -> U; } @@ -61,8 +52,6 @@ fn main() { simd_shuffle2::(0, 0, [0; 2]); //~^ ERROR expected SIMD input type, found non-SIMD `i32` - simd_shuffle3::(0, 0, [0; 3]); - //~^ ERROR expected SIMD input type, found non-SIMD `i32` simd_shuffle4::(0, 0, [0; 4]); //~^ ERROR expected SIMD input type, found non-SIMD `i32` simd_shuffle8::(0, 0, [0; 8]); @@ -70,8 +59,6 @@ fn main() { simd_shuffle2::<_, f32x2>(x, x, [0; 2]); //~^ ERROR element type `i32` (element of input `i32x4`), found `f32x2` with element type `f32` - simd_shuffle3::<_, f32x3>(x, x, [0; 3]); -//~^ ERROR element type `i32` (element of input `i32x4`), found `f32x3` with element type `f32` simd_shuffle4::<_, f32x4>(x, x, [0; 4]); //~^ ERROR element type `i32` (element of input `i32x4`), found `f32x4` with element type `f32` simd_shuffle8::<_, f32x8>(x, x, [0; 8]); @@ -79,10 +66,8 @@ fn main() { simd_shuffle2::<_, i32x8>(x, x, [0; 2]); //~^ ERROR expected return type of length 2, found `i32x8` with length 8 - simd_shuffle3::<_, i32x4>(x, x, [0; 3]); - //~^ ERROR expected return type of length 3, found `i32x4` with length 4 - simd_shuffle4::<_, i32x3>(x, x, [0; 4]); - //~^ ERROR expected return type of length 4, found `i32x3` with length 3 + simd_shuffle4::<_, i32x8>(x, x, [0; 4]); + //~^ ERROR expected return type of length 4, found `i32x8` with length 8 simd_shuffle8::<_, i32x2>(x, x, [0; 8]); //~^ ERROR expected return type of length 8, found `i32x2` with length 2 } 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 78022c0c8b..703e64d1dd 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.stderr +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-generic-elements.stderr @@ -1,93 +1,75 @@ error[E0511]: invalid monomorphization of `simd_insert` intrinsic: expected SIMD input type, found non-SIMD `i32` - --> $DIR/simd-intrinsic-generic-elements.rs:55:9 + --> $DIR/simd-intrinsic-generic-elements.rs:46: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:57:9 + --> $DIR/simd-intrinsic-generic-elements.rs:48: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:59:9 + --> $DIR/simd-intrinsic-generic-elements.rs:50: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:62:9 + --> $DIR/simd-intrinsic-generic-elements.rs:53:9 | LL | simd_shuffle2::(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:64:9 - | -LL | simd_shuffle3::(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:66:9 + --> $DIR/simd-intrinsic-generic-elements.rs:55:9 | LL | simd_shuffle4::(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:68:9 + --> $DIR/simd-intrinsic-generic-elements.rs:57:9 | LL | simd_shuffle8::(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:71:9 + --> $DIR/simd-intrinsic-generic-elements.rs:60: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: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:75:9 + --> $DIR/simd-intrinsic-generic-elements.rs:62: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:77:9 + --> $DIR/simd-intrinsic-generic-elements.rs:64: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:80:9 + --> $DIR/simd-intrinsic-generic-elements.rs:67: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:82:9 +error[E0511]: invalid monomorphization of `simd_shuffle4` intrinsic: expected return type of length 4, found `i32x8` with length 8 + --> $DIR/simd-intrinsic-generic-elements.rs:69: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:84:9 - | -LL | simd_shuffle4::<_, i32x3>(x, x, [0; 4]); +LL | simd_shuffle4::<_, i32x8>(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:86:9 + --> $DIR/simd-intrinsic-generic-elements.rs:71:9 | LL | simd_shuffle8::<_, i32x2>(x, x, [0; 8]); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error: aborting due to 15 previous errors +error: aborting due to 12 previous errors For more information about this error, try `rustc --explain E0511`. 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 index 4c09ae25c5..4be6818305 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557-ice.rs +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557-ice.rs @@ -2,7 +2,7 @@ // passed the wrong Instance, causing issues with inlining. See #67557. // // run-pass -// compile-flags: -Zmir-opt-level=3 +// compile-flags: -Zmir-opt-level=4 #![feature(platform_intrinsics, repr_simd)] extern "platform-intrinsic" { diff --git a/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557.rs b/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557.rs index 7a0d955686..6755682981 100644 --- a/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557.rs +++ b/src/test/ui/simd-intrinsic/simd-intrinsic-inlining-issue67557.rs @@ -2,7 +2,7 @@ // the wrong Instance, causing issues with inlining. See #67557. // // run-pass -// compile-flags: -Zmir-opt-level=3 +// compile-flags: -Zmir-opt-level=4 #![feature(platform_intrinsics, repr_simd)] extern "platform-intrinsic" { diff --git a/src/test/ui/simd-type.rs b/src/test/ui/simd-type.rs deleted file mode 100644 index a320df8513..0000000000 --- a/src/test/ui/simd-type.rs +++ /dev/null @@ -1,20 +0,0 @@ -#![feature(repr_simd)] -#![allow(non_camel_case_types)] - -// ignore-tidy-linelength - -#[repr(simd)] -struct empty; //~ ERROR SIMD vector cannot be empty - -#[repr(simd)] -struct i64f64(i64, f64); //~ ERROR SIMD vector should be homogeneous - -struct Foo; - -#[repr(simd)] -struct FooV(Foo, Foo); //~ ERROR SIMD vector element type should be a primitive scalar (integer/float/pointer) type - -#[repr(simd)] -struct FooV2([Foo; 2]); //~ ERROR SIMD vector element type should be a primitive scalar (integer/float/pointer) type - -fn main() {} diff --git a/src/test/ui/issues/issue-17170.rs b/src/test/ui/simd/issue-17170.rs similarity index 100% rename from src/test/ui/issues/issue-17170.rs rename to src/test/ui/simd/issue-17170.rs diff --git a/src/test/ui/issues/issue-39720.rs b/src/test/ui/simd/issue-39720.rs similarity index 100% rename from src/test/ui/issues/issue-39720.rs rename to src/test/ui/simd/issue-39720.rs diff --git a/src/test/ui/simd/simd-intrinsic-generic-arithmetic.rs b/src/test/ui/simd/simd-intrinsic-generic-arithmetic.rs index 96c2c6c539..c507b8d31e 100644 --- a/src/test/ui/simd/simd-intrinsic-generic-arithmetic.rs +++ b/src/test/ui/simd/simd-intrinsic-generic-arithmetic.rs @@ -45,6 +45,8 @@ extern "platform-intrinsic" { fn simd_and(x: T, y: T) -> T; fn simd_or(x: T, y: T) -> T; fn simd_xor(x: T, y: T) -> T; + + fn simd_neg(x: T) -> T; } fn main() { @@ -125,5 +127,10 @@ fn main() { all_eq_!(simd_xor(y1, y2), U32::<4>([3, 1, 7, 1])); all_eq_!(simd_xor(y2, y1), U32::<4>([3, 1, 7, 1])); + all_eq!(simd_neg(x1), i32x4(-1, -2, -3, -4)); + all_eq!(simd_neg(x2), i32x4(-2, -3, -4, -5)); + all_eq!(simd_neg(z1), f32x4(-1.0, -2.0, -3.0, -4.0)); + all_eq!(simd_neg(z2), f32x4(-2.0, -3.0, -4.0, -5.0)); + } } diff --git a/src/test/ui/simd/simd-intrinsic-generic-elements.rs b/src/test/ui/simd/simd-intrinsic-generic-elements.rs index ea3d4b1894..a85ec7c582 100644 --- a/src/test/ui/simd/simd-intrinsic-generic-elements.rs +++ b/src/test/ui/simd/simd-intrinsic-generic-elements.rs @@ -10,10 +10,6 @@ struct i32x2(i32, i32); #[repr(simd)] #[derive(Copy, Clone, Debug, PartialEq)] #[allow(non_camel_case_types)] -struct i32x3(i32, i32, i32); -#[repr(simd)] -#[derive(Copy, Clone, Debug, PartialEq)] -#[allow(non_camel_case_types)] struct i32x4(i32, i32, i32, i32); #[repr(simd)] #[derive(Copy, Clone, Debug, PartialEq)] @@ -26,7 +22,6 @@ extern "platform-intrinsic" { fn simd_extract(x: T, idx: u32) -> E; fn simd_shuffle2(x: T, y: T, idx: [u32; 2]) -> U; - fn simd_shuffle3(x: T, y: T, idx: [u32; 3]) -> U; fn simd_shuffle4(x: T, y: T, idx: [u32; 4]) -> U; fn simd_shuffle8(x: T, y: T, idx: [u32; 8]) -> U; } @@ -45,17 +40,12 @@ macro_rules! all_eq { fn main() { let x2 = i32x2(20, 21); - let x3 = i32x3(30, 31, 32); let x4 = i32x4(40, 41, 42, 43); let x8 = i32x8(80, 81, 82, 83, 84, 85, 86, 87); unsafe { all_eq!(simd_insert(x2, 0, 100), i32x2(100, 21)); all_eq!(simd_insert(x2, 1, 100), i32x2(20, 100)); - all_eq!(simd_insert(x3, 0, 100), i32x3(100, 31, 32)); - all_eq!(simd_insert(x3, 1, 100), i32x3(30, 100, 32)); - all_eq!(simd_insert(x3, 2, 100), i32x3(30, 31, 100)); - all_eq!(simd_insert(x4, 0, 100), i32x4(100, 41, 42, 43)); all_eq!(simd_insert(x4, 1, 100), i32x4(40, 100, 42, 43)); all_eq!(simd_insert(x4, 2, 100), i32x4(40, 41, 100, 43)); @@ -73,10 +63,6 @@ fn main() { all_eq!(simd_extract(x2, 0), 20); all_eq!(simd_extract(x2, 1), 21); - all_eq!(simd_extract(x3, 0), 30); - all_eq!(simd_extract(x3, 1), 31); - all_eq!(simd_extract(x3, 2), 32); - all_eq!(simd_extract(x4, 0), 40); all_eq!(simd_extract(x4, 1), 41); all_eq!(simd_extract(x4, 2), 42); @@ -93,30 +79,20 @@ fn main() { } let y2 = i32x2(120, 121); - let y3 = i32x3(130, 131, 132); let y4 = i32x4(140, 141, 142, 143); let y8 = i32x8(180, 181, 182, 183, 184, 185, 186, 187); unsafe { all_eq!(simd_shuffle2(x2, y2, [3, 0]), i32x2(121, 20)); - all_eq!(simd_shuffle3(x2, y2, [3, 0, 1]), i32x3(121, 20, 21)); all_eq!(simd_shuffle4(x2, y2, [3, 0, 1, 2]), i32x4(121, 20, 21, 120)); all_eq!(simd_shuffle8(x2, y2, [3, 0, 1, 2, 1, 2, 3, 0]), i32x8(121, 20, 21, 120, 21, 120, 121, 20)); - all_eq!(simd_shuffle2(x3, y3, [4, 2]), i32x2(131, 32)); - all_eq!(simd_shuffle3(x3, y3, [4, 2, 3]), i32x3(131, 32, 130)); - all_eq!(simd_shuffle4(x3, y3, [4, 2, 3, 0]), i32x4(131, 32, 130, 30)); - all_eq!(simd_shuffle8(x3, y3, [4, 2, 3, 0, 1, 5, 5, 1]), - i32x8(131, 32, 130, 30, 31, 132, 132, 31)); - all_eq!(simd_shuffle2(x4, y4, [7, 2]), i32x2(143, 42)); - all_eq!(simd_shuffle3(x4, y4, [7, 2, 5]), i32x3(143, 42, 141)); all_eq!(simd_shuffle4(x4, y4, [7, 2, 5, 0]), i32x4(143, 42, 141, 40)); all_eq!(simd_shuffle8(x4, y4, [7, 2, 5, 0, 3, 6, 4, 1]), i32x8(143, 42, 141, 40, 43, 142, 140, 41)); all_eq!(simd_shuffle2(x8, y8, [11, 5]), i32x2(183, 85)); - all_eq!(simd_shuffle3(x8, y8, [11, 5, 15]), i32x3(183, 85, 187)); all_eq!(simd_shuffle4(x8, y8, [11, 5, 15, 0]), i32x4(183, 85, 187, 80)); all_eq!(simd_shuffle8(x8, y8, [11, 5, 15, 0, 3, 8, 12, 1]), i32x8(183, 85, 187, 80, 83, 180, 184, 81)); diff --git a/src/test/ui/simd/simd-size-align.rs b/src/test/ui/simd/simd-size-align.rs index 556013788c..0afa494722 100644 --- a/src/test/ui/simd/simd-size-align.rs +++ b/src/test/ui/simd/simd-size-align.rs @@ -10,87 +10,44 @@ use std::mem; /// `T` should satisfy `size_of T (mod min_align_of T) === 0` to be stored at `Vec` properly /// Please consult the issue #20460 fn check() { - assert_eq!(mem::size_of::() % mem::min_align_of::(), 0) + assert_eq!(mem::size_of::() % mem::min_align_of::(), 0); + assert_eq!(mem::size_of::() % mem::min_align_of::(), 0); + assert_eq!(mem::size_of::() % mem::min_align_of::(), 0); } -fn main() { - check::(); - check::(); - check::(); - check::(); - check::(); - check::(); - check::(); +#[repr(simd)] +struct U8([u8; N]); - check::(); - check::(); - check::(); - check::(); - check::(); - check::(); - check::(); +#[repr(simd)] +struct I16([i16; N]); - check::(); - check::(); - check::(); - check::(); - check::(); - check::(); - check::(); +#[repr(simd)] +struct F32([f32; N]); - check::(); - check::(); - check::(); - check::(); - check::(); - check::(); - check::(); +#[repr(simd)] +struct Usize([usize; N]); - check::(); - check::(); - check::(); - check::(); - check::(); - check::(); - check::(); -} +#[repr(simd)] +struct Isize([isize; N]); -#[repr(simd)] struct u8x2(u8, u8); -#[repr(simd)] struct u8x3(u8, u8, u8); -#[repr(simd)] struct u8x4(u8, u8, u8, u8); -#[repr(simd)] struct u8x5(u8, u8, u8, u8, u8); -#[repr(simd)] struct u8x6(u8, u8, u8, u8, u8, u8); -#[repr(simd)] struct u8x7(u8, u8, u8, u8, u8, u8, u8); -#[repr(simd)] struct u8x8(u8, u8, u8, u8, u8, u8, u8, u8); +fn main() { + check::>(); + check::>(); + check::>(); -#[repr(simd)] struct i16x2(i16, i16); -#[repr(simd)] struct i16x3(i16, i16, i16); -#[repr(simd)] struct i16x4(i16, i16, i16, i16); -#[repr(simd)] struct i16x5(i16, i16, i16, i16, i16); -#[repr(simd)] struct i16x6(i16, i16, i16, i16, i16, i16); -#[repr(simd)] struct i16x7(i16, i16, i16, i16, i16, i16, i16); -#[repr(simd)] struct i16x8(i16, i16, i16, i16, i16, i16, i16, i16); + check::>(); + check::>(); + check::>(); -#[repr(simd)] struct f32x2(f32, f32); -#[repr(simd)] struct f32x3(f32, f32, f32); -#[repr(simd)] struct f32x4(f32, f32, f32, f32); -#[repr(simd)] struct f32x5(f32, f32, f32, f32, f32); -#[repr(simd)] struct f32x6(f32, f32, f32, f32, f32, f32); -#[repr(simd)] struct f32x7(f32, f32, f32, f32, f32, f32, f32); -#[repr(simd)] struct f32x8(f32, f32, f32, f32, f32, f32, f32, f32); + check::>(); + check::>(); + check::>(); -#[repr(simd)] struct usizex2(usize, usize); -#[repr(simd)] struct usizex3(usize, usize, usize); -#[repr(simd)] struct usizex4(usize, usize, usize, usize); -#[repr(simd)] struct usizex5(usize, usize, usize, usize, usize); -#[repr(simd)] struct usizex6(usize, usize, usize, usize, usize, usize); -#[repr(simd)] struct usizex7(usize, usize, usize, usize, usize, usize, usize); -#[repr(simd)] struct usizex8(usize, usize, usize, usize, usize, usize, usize, usize); + check::>(); + check::>(); + check::>(); -#[repr(simd)] struct isizex2(isize, isize); -#[repr(simd)] struct isizex3(isize, isize, isize); -#[repr(simd)] struct isizex4(isize, isize, isize, isize); -#[repr(simd)] struct isizex5(isize, isize, isize, isize, isize); -#[repr(simd)] struct isizex6(isize, isize, isize, isize, isize, isize); -#[repr(simd)] struct isizex7(isize, isize, isize, isize, isize, isize, isize); -#[repr(simd)] struct isizex8(isize, isize, isize, isize, isize, isize, isize, isize); + check::>(); + check::>(); + check::>(); +} diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-empty.rs b/src/test/ui/simd/simd-type-generic-monomorphisation-empty.rs new file mode 100644 index 0000000000..0121404c74 --- /dev/null +++ b/src/test/ui/simd/simd-type-generic-monomorphisation-empty.rs @@ -0,0 +1,12 @@ +// build-fail + +#![feature(repr_simd, platform_intrinsics)] + +// error-pattern:monomorphising SIMD type `Simd<0_usize>` of zero length + +#[repr(simd)] +struct Simd([f32; N]); + +fn main() { + let _ = Simd::<0>([]); +} diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-empty.stderr b/src/test/ui/simd/simd-type-generic-monomorphisation-empty.stderr new file mode 100644 index 0000000000..00fde199b1 --- /dev/null +++ b/src/test/ui/simd/simd-type-generic-monomorphisation-empty.stderr @@ -0,0 +1,4 @@ +error: monomorphising SIMD type `Simd<0_usize>` of zero length + +error: aborting due to previous error + diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-oversized.rs b/src/test/ui/simd/simd-type-generic-monomorphisation-oversized.rs new file mode 100644 index 0000000000..bd0d457b35 --- /dev/null +++ b/src/test/ui/simd/simd-type-generic-monomorphisation-oversized.rs @@ -0,0 +1,12 @@ +// build-fail + +#![feature(repr_simd, platform_intrinsics)] + +// error-pattern:monomorphising SIMD type `Simd<65536_usize>` of length greater than 32768 + +#[repr(simd)] +struct Simd([f32; N]); + +fn main() { + let _ = Simd::<65536>([0.; 65536]); +} diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-oversized.stderr b/src/test/ui/simd/simd-type-generic-monomorphisation-oversized.stderr new file mode 100644 index 0000000000..f441835011 --- /dev/null +++ b/src/test/ui/simd/simd-type-generic-monomorphisation-oversized.stderr @@ -0,0 +1,4 @@ +error: monomorphising SIMD type `Simd<65536_usize>` of length greater than 32768 + +error: aborting due to previous error + diff --git a/src/test/ui/simd/simd-type-generic-monomorphisation-power-of-two.rs b/src/test/ui/simd/simd-type-generic-monomorphisation-power-of-two.rs new file mode 100644 index 0000000000..9b645d363e --- /dev/null +++ b/src/test/ui/simd/simd-type-generic-monomorphisation-power-of-two.rs @@ -0,0 +1,10 @@ +// run-pass + +#![feature(repr_simd, platform_intrinsics)] + +#[repr(simd)] +struct Simd([f32; N]); + +fn main() { + let _ = Simd::<3>([0.; 3]); +} diff --git a/src/test/ui/simd-type-generic-monomorphisation.rs b/src/test/ui/simd/simd-type-generic-monomorphisation.rs similarity index 100% rename from src/test/ui/simd-type-generic-monomorphisation.rs rename to src/test/ui/simd/simd-type-generic-monomorphisation.rs diff --git a/src/test/ui/simd-type-generic-monomorphisation.stderr b/src/test/ui/simd/simd-type-generic-monomorphisation.stderr similarity index 100% rename from src/test/ui/simd-type-generic-monomorphisation.stderr rename to src/test/ui/simd/simd-type-generic-monomorphisation.stderr diff --git a/src/test/ui/simd/simd-type.rs b/src/test/ui/simd/simd-type.rs index e7b9bfe32f..73d032a0c8 100644 --- a/src/test/ui/simd/simd-type.rs +++ b/src/test/ui/simd/simd-type.rs @@ -1,9 +1,33 @@ -// run-pass -#![allow(dead_code)] +#![feature(repr_simd)] +#![allow(non_camel_case_types)] -// pretty-expanded FIXME #23616 +// ignore-tidy-linelength -#![feature(repr_simd)] +#[repr(simd)] +struct empty; //~ ERROR SIMD vector cannot be empty + +#[repr(simd)] +struct empty2([f32; 0]); //~ ERROR SIMD vector cannot be empty + +#[repr(simd)] +struct pow2([f32; 7]); + +#[repr(simd)] +struct i64f64(i64, f64); //~ ERROR SIMD vector should be homogeneous + +struct Foo; + +#[repr(simd)] +struct FooV(Foo, Foo); //~ ERROR SIMD vector element type should be a primitive scalar (integer/float/pointer) type + +#[repr(simd)] +struct FooV2([Foo; 2]); //~ ERROR SIMD vector element type should be a primitive scalar (integer/float/pointer) type + +#[repr(simd)] +struct TooBig([f32; 65536]); //~ ERROR SIMD vector cannot have more than 32768 elements + +#[repr(simd)] +struct JustRight([u128; 32768]); #[repr(simd)] struct RGBA { @@ -13,4 +37,4 @@ struct RGBA { a: f32 } -pub fn main() {} +fn main() {} diff --git a/src/test/ui/simd-type.stderr b/src/test/ui/simd/simd-type.stderr similarity index 64% rename from src/test/ui/simd-type.stderr rename to src/test/ui/simd/simd-type.stderr index 23004c7859..823f10f5da 100644 --- a/src/test/ui/simd-type.stderr +++ b/src/test/ui/simd/simd-type.stderr @@ -4,25 +4,37 @@ error[E0075]: SIMD vector cannot be empty LL | struct empty; | ^^^^^^^^^^^^^ -error[E0076]: SIMD vector should be homogeneous +error[E0075]: SIMD vector cannot be empty --> $DIR/simd-type.rs:10:1 | +LL | struct empty2([f32; 0]); + | ^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0076]: SIMD vector should be homogeneous + --> $DIR/simd-type.rs:16:1 + | LL | struct i64f64(i64, f64); | ^^^^^^^^^^^^^^^^^^^^^^^^ SIMD elements must have the same type error[E0077]: SIMD vector element type should be a primitive scalar (integer/float/pointer) type - --> $DIR/simd-type.rs:15:1 + --> $DIR/simd-type.rs:21:1 | LL | struct FooV(Foo, Foo); | ^^^^^^^^^^^^^^^^^^^^^^ error[E0077]: SIMD vector element type should be a primitive scalar (integer/float/pointer) type - --> $DIR/simd-type.rs:18:1 + --> $DIR/simd-type.rs:24:1 | LL | struct FooV2([Foo; 2]); | ^^^^^^^^^^^^^^^^^^^^^^^ -error: aborting due to 4 previous errors +error[E0075]: SIMD vector cannot have more than 32768 elements + --> $DIR/simd-type.rs:27:1 + | +LL | struct TooBig([f32; 65536]); + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 6 previous errors Some errors have detailed explanations: E0075, E0076, E0077. For more information about an error, try `rustc --explain E0075`. diff --git a/src/test/ui/single-use-lifetime/one-use-in-fn-argument-in-band.stderr b/src/test/ui/single-use-lifetime/one-use-in-fn-argument-in-band.stderr index b251e8a438..723c4a7a1f 100644 --- a/src/test/ui/single-use-lifetime/one-use-in-fn-argument-in-band.stderr +++ b/src/test/ui/single-use-lifetime/one-use-in-fn-argument-in-band.stderr @@ -1,11 +1,11 @@ -error: lifetime parameter `'a` only used once - --> $DIR/one-use-in-fn-argument-in-band.rs:11:10 +error: lifetime parameter `'b` only used once + --> $DIR/one-use-in-fn-argument-in-band.rs:11:22 | LL | fn a(x: &'a u32, y: &'b u32) { - | ^^- - | | - | this lifetime is only used here - | help: elide the single-use lifetime + | ^^- + | | + | this lifetime is only used here + | help: elide the single-use lifetime | note: the lint level is defined here --> $DIR/one-use-in-fn-argument-in-band.rs:4:9 @@ -13,14 +13,14 @@ note: the lint level is defined here LL | #![deny(single_use_lifetimes)] | ^^^^^^^^^^^^^^^^^^^^ -error: lifetime parameter `'b` only used once - --> $DIR/one-use-in-fn-argument-in-band.rs:11:22 +error: lifetime parameter `'a` only used once + --> $DIR/one-use-in-fn-argument-in-band.rs:11:10 | LL | fn a(x: &'a u32, y: &'b u32) { - | ^^- - | | - | this lifetime is only used here - | help: elide the single-use lifetime + | ^^- + | | + | this lifetime is only used here + | help: elide the single-use lifetime error: aborting due to 2 previous errors diff --git a/src/test/ui/span/impl-wrong-item-for-trait.stderr b/src/test/ui/span/impl-wrong-item-for-trait.stderr index 9b0aad28b0..de200ca072 100644 --- a/src/test/ui/span/impl-wrong-item-for-trait.stderr +++ b/src/test/ui/span/impl-wrong-item-for-trait.stderr @@ -64,7 +64,7 @@ error[E0046]: not all trait items implemented, missing: `fmt` LL | impl Debug for FooTypeForMethod { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ missing `fmt` in implementation | - = help: implement the missing item: `fn fmt(&self, _: &mut Formatter<'_>) -> std::result::Result<(), std::fmt::Error> { todo!() }` + = help: implement the missing item: `fn fmt(&self, _: &mut Formatter<'_>) -> Result<(), std::fmt::Error> { todo!() }` error: aborting due to 8 previous errors 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..840c12e16e 100644 --- a/src/test/ui/span/issue-43927-non-ADT-derive.rs +++ b/src/test/ui/span/issue-43927-non-ADT-derive.rs @@ -1,10 +1,5 @@ -#![allow(dead_code)] - #![derive(Debug, PartialEq, Eq)] // should be an outer attribute! -//~^ ERROR `derive` may only be applied to structs, enums and unions -//~| 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 attribute macro `derive` 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 85beac535c..9ef81c5150 100644 --- a/src/test/ui/span/issue-43927-non-ADT-derive.stderr +++ b/src/test/ui/span/issue-43927-non-ADT-derive.stderr @@ -1,33 +1,10 @@ -error[E0774]: `derive` may only be applied to structs, enums and unions - --> $DIR/issue-43927-non-ADT-derive.rs:3:1 +error: cannot determine resolution for the attribute macro `derive` + --> $DIR/issue-43927-non-ADT-derive.rs:1:4 | LL | #![derive(Debug, PartialEq, Eq)] // should be an outer attribute! - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ help: try an outer attribute: `#[derive(Debug, PartialEq, Eq)]` - -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: 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 `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: aborting due to 4 previous errors +error: aborting due to previous error -For more information about this error, try `rustc --explain E0774`. diff --git a/src/test/ui/span/issue-81800.rs b/src/test/ui/span/issue-81800.rs new file mode 100644 index 0000000000..6ac66fdcb6 --- /dev/null +++ b/src/test/ui/span/issue-81800.rs @@ -0,0 +1,2 @@ +fn x˂- //~ ERROR: unknown start of token + //~^ ERROR: expected one of `#`, `>`, `const`, identifier, or lifetime, found `-` diff --git a/src/test/ui/span/issue-81800.stderr b/src/test/ui/span/issue-81800.stderr new file mode 100644 index 0000000000..d37f13a668 --- /dev/null +++ b/src/test/ui/span/issue-81800.stderr @@ -0,0 +1,19 @@ +error: unknown start of token: \u{2c2} + --> $DIR/issue-81800.rs:1:5 + | +LL | fn x˂- + | ^ + | +help: Unicode character '˂' (Modifier Letter Left Arrowhead) looks like '<' (Less-Than Sign), but it is not + | +LL | fn x<- + | ^ + +error: expected one of `#`, `>`, `const`, identifier, or lifetime, found `-` + --> $DIR/issue-81800.rs:1:6 + | +LL | fn x˂- + | ^ expected one of `#`, `>`, `const`, identifier, or lifetime + +error: aborting due to 2 previous errors + diff --git a/src/test/ui/span/macro-ty-params.rs b/src/test/ui/span/macro-ty-params.rs index 713b9eb542..0a93105b66 100644 --- a/src/test/ui/span/macro-ty-params.rs +++ b/src/test/ui/span/macro-ty-params.rs @@ -9,5 +9,5 @@ macro_rules! foo { () => () } fn main() { foo::!(); //~ ERROR generic arguments in macro path foo::<>!(); //~ ERROR generic arguments in macro path - m!(Default<>); //~ ERROR generic arguments in macro path + m!(Default<>); //~ ERROR unexpected generic arguments in path } diff --git a/src/test/ui/span/macro-ty-params.stderr b/src/test/ui/span/macro-ty-params.stderr index 21683b2fb8..138cd2598a 100644 --- a/src/test/ui/span/macro-ty-params.stderr +++ b/src/test/ui/span/macro-ty-params.stderr @@ -10,7 +10,7 @@ error: generic arguments in macro path LL | foo::<>!(); | ^^ -error: generic arguments in macro path +error: unexpected generic arguments in path --> $DIR/macro-ty-params.rs:12:15 | LL | m!(Default<>); diff --git a/src/test/ui/specialization/deafult-associated-type-bound-2.stderr b/src/test/ui/specialization/deafult-associated-type-bound-2.stderr index 2bc14dbe3b..0e8a774bce 100644 --- a/src/test/ui/specialization/deafult-associated-type-bound-2.stderr +++ b/src/test/ui/specialization/deafult-associated-type-bound-2.stderr @@ -18,6 +18,10 @@ LL | default type U = &'static B; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ no implementation for `&'static B == B` | = help: the trait `PartialEq` is not implemented for `&'static B` +help: consider introducing a `where` bound, but there might be an alternative better way to express this requirement + | +LL | impl X for T where &'static B: PartialEq { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to previous error; 1 warning emitted diff --git a/src/test/ui/specialization/specialization-default-projection.stderr b/src/test/ui/specialization/specialization-default-projection.stderr index 445bc1646f..7a2b75a1c1 100644 --- a/src/test/ui/specialization/specialization-default-projection.stderr +++ b/src/test/ui/specialization/specialization-default-projection.stderr @@ -29,7 +29,7 @@ LL | fn monomorphic() -> () { | -- expected `()` because of return type ... LL | generic::<()>() - | ^^^^^^^^^^^^^^^- help: try adding a semicolon: `;` + | ^^^^^^^^^^^^^^^- help: consider using a semicolon here: `;` | | | expected `()`, found associated type | diff --git a/src/test/ui/stability-attribute/generics-default-stability.stderr b/src/test/ui/stability-attribute/generics-default-stability.stderr index a5df70bb8b..45194413cc 100644 --- a/src/test/ui/stability-attribute/generics-default-stability.stderr +++ b/src/test/ui/stability-attribute/generics-default-stability.stderr @@ -100,7 +100,7 @@ warning: use of deprecated type alias `unstable_generic_param::Alias4`: test --> $DIR/generics-default-stability.rs:160:28 | LL | let _: Alias4 = Alias4::Some(1); - | ^^^^^^^^^^^^ + | ^^^^^^ warning: use of deprecated type alias `unstable_generic_param::Alias4`: test --> $DIR/generics-default-stability.rs:160:12 @@ -124,7 +124,7 @@ warning: use of deprecated type alias `unstable_generic_param::Alias4`: test --> $DIR/generics-default-stability.rs:166:28 | LL | let _: Alias4 = Alias4::Some(0); - | ^^^^^^^^^^^^ + | ^^^^^^ warning: use of deprecated type alias `unstable_generic_param::Alias4`: test --> $DIR/generics-default-stability.rs:166:12 @@ -136,7 +136,7 @@ warning: use of deprecated type alias `unstable_generic_param::Alias5`: test --> $DIR/generics-default-stability.rs:171:28 | LL | let _: Alias5 = Alias5::Some(1); - | ^^^^^^^^^^^^ + | ^^^^^^ warning: use of deprecated type alias `unstable_generic_param::Alias5`: test --> $DIR/generics-default-stability.rs:171:12 @@ -160,7 +160,7 @@ warning: use of deprecated type alias `unstable_generic_param::Alias5`: test --> $DIR/generics-default-stability.rs:178:28 | LL | let _: Alias5 = Alias5::Some(0); - | ^^^^^^^^^^^^ + | ^^^^^^ warning: use of deprecated type alias `unstable_generic_param::Alias5`: test --> $DIR/generics-default-stability.rs:178:12 diff --git a/src/test/ui/stability-attribute/stability-attribute-issue-43027.rs b/src/test/ui/stability-attribute/stability-attribute-issue-43027.rs index 0b243bb521..3f4fdfd018 100644 --- a/src/test/ui/stability-attribute/stability-attribute-issue-43027.rs +++ b/src/test/ui/stability-attribute/stability-attribute-issue-43027.rs @@ -1,10 +1,15 @@ +// check-pass #![feature(staged_api)] #![stable(feature = "test", since = "0")] #[stable(feature = "test", since = "0")] -pub struct Reverse(pub T); //~ ERROR field has missing stability attribute +pub struct A(pub T); + +#[stable(feature = "test", since = "0")] +pub struct B(#[stable(feature = "test", since = "0")] pub T); fn main() { // Make sure the field is used to fill the stability cache - Reverse(0).0; + A(0).0; + B(0).0; } diff --git a/src/test/ui/stability-attribute/stability-attribute-issue-43027.stderr b/src/test/ui/stability-attribute/stability-attribute-issue-43027.stderr deleted file mode 100644 index 280c72accc..0000000000 --- a/src/test/ui/stability-attribute/stability-attribute-issue-43027.stderr +++ /dev/null @@ -1,8 +0,0 @@ -error: field has missing stability attribute - --> $DIR/stability-attribute-issue-43027.rs:5:23 - | -LL | pub struct Reverse(pub T); - | ^^^^^ - -error: aborting due to previous error - diff --git a/src/test/ui/stability-attribute/stability-attribute-sanity-2.stderr b/src/test/ui/stability-attribute/stability-attribute-sanity-2.stderr index 3b82619189..bd7b88da15 100644 --- a/src/test/ui/stability-attribute/stability-attribute-sanity-2.stderr +++ b/src/test/ui/stability-attribute/stability-attribute-sanity-2.stderr @@ -20,5 +20,5 @@ LL | #[unstable(feature = "a", issue = "no")] error: aborting due to 3 previous errors -Some errors have detailed explanations: E0538, E0541. +Some errors have detailed explanations: E0538, E0541, E0545. For more information about an error, try `rustc --explain E0538`. diff --git a/src/test/ui/stability-attribute/stability-attribute-sanity.rs b/src/test/ui/stability-attribute/stability-attribute-sanity.rs index 0c40f8ae1c..9f8ecc2628 100644 --- a/src/test/ui/stability-attribute/stability-attribute-sanity.rs +++ b/src/test/ui/stability-attribute/stability-attribute-sanity.rs @@ -57,17 +57,16 @@ fn multiple2() { } #[stable(feature = "a", since = "b")] //~ ERROR multiple stability levels [E0544] fn multiple3() { } -#[stable(feature = "a", since = "b")] +#[stable(feature = "a", since = "b")] //~ ERROR invalid stability version found #[rustc_deprecated(since = "b", reason = "text")] #[rustc_deprecated(since = "b", reason = "text")] //~ ERROR multiple deprecated attributes #[rustc_const_unstable(feature = "c", issue = "none")] #[rustc_const_unstable(feature = "d", issue = "none")] //~ ERROR multiple stability levels pub const fn multiple4() { } -//~^ ERROR Invalid stability version found -#[stable(feature = "a", since = "1.0.0")] +#[stable(feature = "a", since = "1.0.0")] //~ ERROR invalid deprecation version found #[rustc_deprecated(since = "invalid", reason = "text")] -fn invalid_deprecation_version() {} //~ ERROR Invalid deprecation version found +fn invalid_deprecation_version() {} #[rustc_deprecated(since = "a", reason = "text")] fn deprecated_without_unstable_or_stable() { } diff --git a/src/test/ui/stability-attribute/stability-attribute-sanity.stderr b/src/test/ui/stability-attribute/stability-attribute-sanity.stderr index ee9a93359f..ddf65f3a7e 100644 --- a/src/test/ui/stability-attribute/stability-attribute-sanity.stderr +++ b/src/test/ui/stability-attribute/stability-attribute-sanity.stderr @@ -96,25 +96,31 @@ error[E0544]: multiple stability levels LL | #[rustc_const_unstable(feature = "d", issue = "none")] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -error: Invalid stability version found - --> $DIR/stability-attribute-sanity.rs:65:1 +error: invalid stability version found + --> $DIR/stability-attribute-sanity.rs:60:1 | +LL | #[stable(feature = "a", since = "b")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ invalid stability version +... LL | pub const fn multiple4() { } - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ---------------------------- the stability attribute annotates this item -error: Invalid deprecation version found - --> $DIR/stability-attribute-sanity.rs:70:1 +error: invalid deprecation version found + --> $DIR/stability-attribute-sanity.rs:67:1 | +LL | #[stable(feature = "a", since = "1.0.0")] + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ invalid deprecation version +LL | #[rustc_deprecated(since = "invalid", reason = "text")] LL | fn invalid_deprecation_version() {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ----------------------------------- the stability attribute annotates this item error[E0549]: rustc_deprecated attribute must be paired with either stable or unstable attribute - --> $DIR/stability-attribute-sanity.rs:72:1 + --> $DIR/stability-attribute-sanity.rs:71:1 | LL | #[rustc_deprecated(since = "a", reason = "text")] | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error: aborting due to 19 previous errors -Some errors have detailed explanations: E0539, E0541, E0546, E0550. +Some errors have detailed explanations: E0539, E0541, E0542, E0543, E0546, E0547, E0549, E0550. For more information about an error, try `rustc --explain E0539`. diff --git a/src/test/ui/static/static-reference-to-fn-2.stderr b/src/test/ui/static/static-reference-to-fn-2.stderr index 028e11a60c..ff15884bd4 100644 --- a/src/test/ui/static/static-reference-to-fn-2.stderr +++ b/src/test/ui/static/static-reference-to-fn-2.stderr @@ -40,6 +40,8 @@ LL | | statefn: &id(state1 as StateMachineFunc) | | ------------------------------ temporary value created here LL | | } | |_____^ returns a value referencing data owned by the current function + | + = help: use `.collect()` to allocate the iterator error: aborting due to 4 previous errors diff --git a/src/test/ui/issues/issue-15261.rs b/src/test/ui/statics/issue-15261.rs similarity index 100% rename from src/test/ui/issues/issue-15261.rs rename to src/test/ui/statics/issue-15261.rs diff --git a/src/test/ui/issues/issue-44373-2.rs b/src/test/ui/statics/issue-44373-2.rs similarity index 100% rename from src/test/ui/issues/issue-44373-2.rs rename to src/test/ui/statics/issue-44373-2.rs diff --git a/src/test/ui/issues/issue-44373.rs b/src/test/ui/statics/issue-44373.rs similarity index 100% rename from src/test/ui/issues/issue-44373.rs rename to src/test/ui/statics/issue-44373.rs diff --git a/src/test/ui/issues/issue-44373.stderr b/src/test/ui/statics/issue-44373.stderr similarity index 100% rename from src/test/ui/issues/issue-44373.stderr rename to src/test/ui/statics/issue-44373.stderr diff --git a/src/test/ui/type-sizes.rs b/src/test/ui/structs-enums/type-sizes.rs similarity index 100% rename from src/test/ui/type-sizes.rs rename to src/test/ui/structs-enums/type-sizes.rs diff --git a/src/test/ui/structs/issue-80853.rs b/src/test/ui/structs/issue-80853.rs new file mode 100644 index 0000000000..242d0af959 --- /dev/null +++ b/src/test/ui/structs/issue-80853.rs @@ -0,0 +1,7 @@ +struct S; + +fn repro_ref(thing: S) { + thing(); //~ ERROR expected function, found `S` +} + +fn main() {} diff --git a/src/test/ui/structs/issue-80853.stderr b/src/test/ui/structs/issue-80853.stderr new file mode 100644 index 0000000000..1c7d52b6d6 --- /dev/null +++ b/src/test/ui/structs/issue-80853.stderr @@ -0,0 +1,13 @@ +error[E0618]: expected function, found `S` + --> $DIR/issue-80853.rs:4:5 + | +LL | fn repro_ref(thing: S) { + | ----- `thing` has type `S` +LL | thing(); + | ^^^^^-- + | | + | call expression requires function + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0618`. diff --git a/src/test/ui/structs/struct-path-associated-type.stderr b/src/test/ui/structs/struct-path-associated-type.stderr index f8a2c7c6b6..0b1b6a5e3a 100644 --- a/src/test/ui/structs/struct-path-associated-type.stderr +++ b/src/test/ui/structs/struct-path-associated-type.stderr @@ -14,7 +14,7 @@ error[E0071]: expected struct, variant or union type, found associated type --> $DIR/struct-path-associated-type.rs:14:13 | LL | let z = T::A:: {}; - | ^^^^^^^^^^ not a struct + | ^^^^ not a struct error[E0071]: expected struct, variant or union type, found associated type --> $DIR/struct-path-associated-type.rs:18:9 @@ -38,7 +38,7 @@ error[E0223]: ambiguous associated type --> $DIR/struct-path-associated-type.rs:33:13 | LL | let z = S::A:: {}; - | ^^^^^^^^^^ help: use fully-qualified syntax: `::A` + | ^^^^ help: use fully-qualified syntax: `::A` error[E0223]: ambiguous associated type --> $DIR/struct-path-associated-type.rs:35:9 diff --git a/src/test/ui/structs/struct-tuple-field-names.rs b/src/test/ui/structs/struct-tuple-field-names.rs new file mode 100644 index 0000000000..7bd54af1db --- /dev/null +++ b/src/test/ui/structs/struct-tuple-field-names.rs @@ -0,0 +1,15 @@ +struct S(i32, f32); +enum E { + S(i32, f32), +} +fn main() { + let x = E::S(1, 2.2); + match x { + E::S { 0, 1 } => {} + //~^ ERROR tuple variant `E::S` written as struct variant [E0769] + } + let y = S(1, 2.2); + match y { + S { } => {} //~ ERROR: tuple variant `S` written as struct variant [E0769] + } +} diff --git a/src/test/ui/structs/struct-tuple-field-names.stderr b/src/test/ui/structs/struct-tuple-field-names.stderr new file mode 100644 index 0000000000..29e7214652 --- /dev/null +++ b/src/test/ui/structs/struct-tuple-field-names.stderr @@ -0,0 +1,25 @@ +error[E0769]: tuple variant `E::S` written as struct variant + --> $DIR/struct-tuple-field-names.rs:8:9 + | +LL | E::S { 0, 1 } => {} + | ^^^^^^^^^^^^^ + | +help: use the tuple variant pattern syntax instead + | +LL | E::S(_, _) => {} + | ^^^^^^ + +error[E0769]: tuple variant `S` written as struct variant + --> $DIR/struct-tuple-field-names.rs:13:9 + | +LL | S { } => {} + | ^^^^^ + | +help: use the tuple variant pattern syntax instead + | +LL | S(_, _) => {} + | ^^^^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0769`. diff --git a/src/test/ui/structs/struct-variant-privacy-xc.rs b/src/test/ui/structs/struct-variant-privacy-xc.rs index 10e9639096..763ab95273 100644 --- a/src/test/ui/structs/struct-variant-privacy-xc.rs +++ b/src/test/ui/structs/struct-variant-privacy-xc.rs @@ -1,7 +1,8 @@ // aux-build:struct_variant_privacy.rs extern crate struct_variant_privacy; -fn f(b: struct_variant_privacy::Bar) { //~ ERROR enum `Bar` is private +fn f(b: struct_variant_privacy::Bar) { + //~^ ERROR enum `Bar` is private match b { struct_variant_privacy::Bar::Baz { a: _a } => {} //~ ERROR enum `Bar` is private } diff --git a/src/test/ui/structs/struct-variant-privacy-xc.stderr b/src/test/ui/structs/struct-variant-privacy-xc.stderr index 4e022cef1b..1c1caaef8b 100644 --- a/src/test/ui/structs/struct-variant-privacy-xc.stderr +++ b/src/test/ui/structs/struct-variant-privacy-xc.stderr @@ -11,7 +11,7 @@ LL | enum Bar { | ^^^^^^^^ error[E0603]: enum `Bar` is private - --> $DIR/struct-variant-privacy-xc.rs:6:33 + --> $DIR/struct-variant-privacy-xc.rs:7:33 | LL | struct_variant_privacy::Bar::Baz { a: _a } => {} | ^^^ private enum diff --git a/src/test/ui/structs/struct-variant-privacy.rs b/src/test/ui/structs/struct-variant-privacy.rs index 8355879e7d..fcdf9a22ba 100644 --- a/src/test/ui/structs/struct-variant-privacy.rs +++ b/src/test/ui/structs/struct-variant-privacy.rs @@ -1,10 +1,11 @@ mod foo { enum Bar { - Baz { a: isize } + Baz { a: isize }, } } -fn f(b: foo::Bar) { //~ ERROR enum `Bar` is private +fn f(b: foo::Bar) { + //~^ ERROR enum `Bar` is private match b { foo::Bar::Baz { a: _a } => {} //~ ERROR enum `Bar` is private } diff --git a/src/test/ui/structs/struct-variant-privacy.stderr b/src/test/ui/structs/struct-variant-privacy.stderr index a6bc381ff6..eafd26c716 100644 --- a/src/test/ui/structs/struct-variant-privacy.stderr +++ b/src/test/ui/structs/struct-variant-privacy.stderr @@ -11,7 +11,7 @@ LL | enum Bar { | ^^^^^^^^ error[E0603]: enum `Bar` is private - --> $DIR/struct-variant-privacy.rs:9:14 + --> $DIR/struct-variant-privacy.rs:10:14 | LL | foo::Bar::Baz { a: _a } => {} | ^^^ private enum diff --git a/src/test/ui/suggestions/adt-param-with-implicit-sized-bound.stderr b/src/test/ui/suggestions/adt-param-with-implicit-sized-bound.stderr index 9450612332..9437fbe61c 100644 --- a/src/test/ui/suggestions/adt-param-with-implicit-sized-bound.stderr +++ b/src/test/ui/suggestions/adt-param-with-implicit-sized-bound.stderr @@ -13,7 +13,7 @@ help: you could relax the implicit `Sized` bound on `T` if it were used through --> $DIR/adt-param-with-implicit-sized-bound.rs:18:10 | LL | struct X(T); - | ^ - ...if indirection was used here: `Box` + | ^ - ...if indirection were used here: `Box` | | | this could be changed to `T: ?Sized`... @@ -68,7 +68,7 @@ help: you could relax the implicit `Sized` bound on `T` if it were used through LL | struct Struct3{ | ^ this could be changed to `T: ?Sized`... LL | _t: T, - | - ...if indirection was used here: `Box` + | - ...if indirection were used here: `Box` help: consider further restricting `Self` | LL | fn func3() -> Struct3 where Self: Sized; diff --git a/src/test/ui/suggestions/as-ref.stderr b/src/test/ui/suggestions/as-ref.stderr index 4b5a9be7e5..7e4d7fb393 100644 --- a/src/test/ui/suggestions/as-ref.stderr +++ b/src/test/ui/suggestions/as-ref.stderr @@ -47,12 +47,12 @@ error[E0308]: mismatched types --> $DIR/as-ref.rs:19:35 | LL | let y: Result<&usize, &usize> = x; - | ---------------------- ^ expected enum `std::result::Result`, found reference + | ---------------------- ^ expected enum `Result`, found reference | | | expected due to this | - = note: expected enum `std::result::Result<&usize, &usize>` - found reference `&std::result::Result` + = note: expected enum `Result<&usize, &usize>` + found reference `&Result` help: you can convert from `&Result` to `Result<&T, &E>` using `.as_ref()` | LL | let y: Result<&usize, &usize> = x.as_ref(); @@ -62,12 +62,12 @@ error[E0308]: mismatched types --> $DIR/as-ref.rs:23:34 | LL | let y: Result<&usize, usize> = x; - | --------------------- ^ expected enum `std::result::Result`, found reference + | --------------------- ^ expected enum `Result`, found reference | | | expected due to this | - = note: expected enum `std::result::Result<&usize, usize>` - found reference `&std::result::Result` + = note: expected enum `Result<&usize, usize>` + found reference `&Result` error: aborting due to 7 previous errors diff --git a/src/test/ui/suggestions/auxiliary/issue-81839.rs b/src/test/ui/suggestions/auxiliary/issue-81839.rs new file mode 100644 index 0000000000..5683c45adf --- /dev/null +++ b/src/test/ui/suggestions/auxiliary/issue-81839.rs @@ -0,0 +1,9 @@ +// edition:2018 + +pub struct Test {} + +impl Test { + pub async fn answer_str(&self, _s: &str) -> Test { + Test {} + } +} diff --git a/src/test/ui/suggestions/do-not-attempt-to-add-suggestions-with-no-changes.rs b/src/test/ui/suggestions/do-not-attempt-to-add-suggestions-with-no-changes.rs new file mode 100644 index 0000000000..a25be862a5 --- /dev/null +++ b/src/test/ui/suggestions/do-not-attempt-to-add-suggestions-with-no-changes.rs @@ -0,0 +1,5 @@ +use std::result; +impl result { //~ ERROR expected type, found module `result` + fn into_future() -> Err {} //~ ERROR expected type, found variant `Err` +} +fn main() {} diff --git a/src/test/ui/suggestions/do-not-attempt-to-add-suggestions-with-no-changes.stderr b/src/test/ui/suggestions/do-not-attempt-to-add-suggestions-with-no-changes.stderr new file mode 100644 index 0000000000..59ccb29e09 --- /dev/null +++ b/src/test/ui/suggestions/do-not-attempt-to-add-suggestions-with-no-changes.stderr @@ -0,0 +1,20 @@ +error[E0573]: expected type, found module `result` + --> $DIR/do-not-attempt-to-add-suggestions-with-no-changes.rs:2:6 + | +LL | impl result { + | ^^^^^^ help: an enum with a similar name exists: `Result` + | + ::: $SRC_DIR/core/src/result.rs:LL:COL + | +LL | pub enum Result { + | --------------------- similarly named enum `Result` defined here + +error[E0573]: expected type, found variant `Err` + --> $DIR/do-not-attempt-to-add-suggestions-with-no-changes.rs:3:25 + | +LL | fn into_future() -> Err {} + | ^^^ not a type + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0573`. diff --git a/src/test/ui/suggestions/issue-51055-missing-semicolon-between-call-and-tuple.stderr b/src/test/ui/suggestions/issue-51055-missing-semicolon-between-call-and-tuple.stderr index 6e4cee18c1..438075083d 100644 --- a/src/test/ui/suggestions/issue-51055-missing-semicolon-between-call-and-tuple.stderr +++ b/src/test/ui/suggestions/issue-51055-missing-semicolon-between-call-and-tuple.stderr @@ -5,7 +5,7 @@ LL | fn vindictive() -> bool { true } | ----------------------- `vindictive` defined here returns `bool` ... LL | vindictive() - | -^^^^^^^^^^^- help: try adding a semicolon: `;` + | -^^^^^^^^^^^- help: consider using a semicolon here: `;` | _____| | | LL | | (1, 2) diff --git a/src/test/ui/suggestions/issue-81839.rs b/src/test/ui/suggestions/issue-81839.rs new file mode 100644 index 0000000000..0b9b7aefe7 --- /dev/null +++ b/src/test/ui/suggestions/issue-81839.rs @@ -0,0 +1,17 @@ +// aux-build:issue-81839.rs +// edition:2018 + +extern crate issue_81839; + +async fn test(ans: &str, num: i32, cx: &issue_81839::Test) -> u32 { + match num { + 1 => { + cx.answer_str("hi"); + } + _ => cx.answer_str("hi"), //~ `match` arms have incompatible types + } + + 1 +} + +fn main() {} diff --git a/src/test/ui/suggestions/issue-81839.stderr b/src/test/ui/suggestions/issue-81839.stderr new file mode 100644 index 0000000000..f907658708 --- /dev/null +++ b/src/test/ui/suggestions/issue-81839.stderr @@ -0,0 +1,28 @@ +error[E0308]: `match` arms have incompatible types + --> $DIR/issue-81839.rs:11:14 + | +LL | / match num { +LL | | 1 => { +LL | | cx.answer_str("hi"); + | | -------------------- + | | | | + | | | help: consider removing this semicolon + | | this is found to be of type `()` +LL | | } +LL | | _ => cx.answer_str("hi"), + | | ^^^^^^^^^^^^^^^^^^^ expected `()`, found opaque type +LL | | } + | |_____- `match` arms have incompatible types + | + ::: $DIR/auxiliary/issue-81839.rs:6:49 + | +LL | pub async fn answer_str(&self, _s: &str) -> Test { + | ---- checked the `Output` of this `async fn`, found opaque type + | + = note: while checking the return type of the `async fn` + = note: expected type `()` + found opaque type `impl Future` + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/suggestions/issue-82361.fixed b/src/test/ui/suggestions/issue-82361.fixed new file mode 100644 index 0000000000..d72de982bf --- /dev/null +++ b/src/test/ui/suggestions/issue-82361.fixed @@ -0,0 +1,24 @@ +// run-rustfix + +fn main() { + let a: usize = 123; + let b: &usize = &a; + + if true { + a + } else { + *b //~ ERROR `if` and `else` have incompatible types [E0308] + }; + + if true { + 1 + } else { + 1 //~ ERROR `if` and `else` have incompatible types [E0308] + }; + + if true { + 1 + } else { + 1 //~ ERROR `if` and `else` have incompatible types [E0308] + }; +} diff --git a/src/test/ui/suggestions/issue-82361.rs b/src/test/ui/suggestions/issue-82361.rs new file mode 100644 index 0000000000..c068f6d22b --- /dev/null +++ b/src/test/ui/suggestions/issue-82361.rs @@ -0,0 +1,24 @@ +// run-rustfix + +fn main() { + let a: usize = 123; + let b: &usize = &a; + + if true { + a + } else { + b //~ ERROR `if` and `else` have incompatible types [E0308] + }; + + if true { + 1 + } else { + &1 //~ ERROR `if` and `else` have incompatible types [E0308] + }; + + if true { + 1 + } else { + &mut 1 //~ ERROR `if` and `else` have incompatible types [E0308] + }; +} diff --git a/src/test/ui/suggestions/issue-82361.stderr b/src/test/ui/suggestions/issue-82361.stderr new file mode 100644 index 0000000000..c19d59ccd4 --- /dev/null +++ b/src/test/ui/suggestions/issue-82361.stderr @@ -0,0 +1,48 @@ +error[E0308]: `if` and `else` have incompatible types + --> $DIR/issue-82361.rs:10:9 + | +LL | / if true { +LL | | a + | | - expected because of this +LL | | } else { +LL | | b + | | ^ + | | | + | | expected `usize`, found `&usize` + | | help: consider dereferencing the borrow: `*b` +LL | | }; + | |_____- `if` and `else` have incompatible types + +error[E0308]: `if` and `else` have incompatible types + --> $DIR/issue-82361.rs:16:9 + | +LL | / if true { +LL | | 1 + | | - expected because of this +LL | | } else { +LL | | &1 + | | -^ + | | | + | | expected integer, found `&{integer}` + | | help: consider removing the `&` +LL | | }; + | |_____- `if` and `else` have incompatible types + +error[E0308]: `if` and `else` have incompatible types + --> $DIR/issue-82361.rs:22:9 + | +LL | / if true { +LL | | 1 + | | - expected because of this +LL | | } else { +LL | | &mut 1 + | | -----^ + | | | + | | expected integer, found `&mut {integer}` + | | help: consider removing the `&mut` +LL | | }; + | |_____- `if` and `else` have incompatible types + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/suggestions/issue-82566-1.rs b/src/test/ui/suggestions/issue-82566-1.rs new file mode 100644 index 0000000000..95c31fbaa2 --- /dev/null +++ b/src/test/ui/suggestions/issue-82566-1.rs @@ -0,0 +1,21 @@ +struct T1; +struct T2; +struct T3; + +impl T1<1> { + const C: () = (); +} + +impl T2<1, 2> { + const C: () = (); +} + +impl T3<1, 2, 3> { + const C: () = (); +} + +fn main() { + T1<1>::C; //~ ERROR: comparison operators cannot be chained + T2<1, 2>::C; //~ ERROR: expected one of `.`, `;`, `?`, `}`, or an operator, found `,` + T3<1, 2, 3>::C; //~ ERROR: expected one of `.`, `;`, `?`, `}`, or an operator, found `,` +} diff --git a/src/test/ui/suggestions/issue-82566-1.stderr b/src/test/ui/suggestions/issue-82566-1.stderr new file mode 100644 index 0000000000..5a9099a894 --- /dev/null +++ b/src/test/ui/suggestions/issue-82566-1.stderr @@ -0,0 +1,35 @@ +error: comparison operators cannot be chained + --> $DIR/issue-82566-1.rs:18:7 + | +LL | T1<1>::C; + | ^ ^ + | +help: use `::<...>` instead of `<...>` to specify type or const arguments + | +LL | T1::<1>::C; + | ^^ + +error: expected one of `.`, `;`, `?`, `}`, or an operator, found `,` + --> $DIR/issue-82566-1.rs:19:9 + | +LL | T2<1, 2>::C; + | ^ expected one of `.`, `;`, `?`, `}`, or an operator + | +help: use `::<...>` instead of `<...>` to specify type or const arguments + | +LL | T2::<1, 2>::C; + | ^^ + +error: expected one of `.`, `;`, `?`, `}`, or an operator, found `,` + --> $DIR/issue-82566-1.rs:20:9 + | +LL | T3<1, 2, 3>::C; + | ^ expected one of `.`, `;`, `?`, `}`, or an operator + | +help: use `::<...>` instead of `<...>` to specify type or const arguments + | +LL | T3::<1, 2, 3>::C; + | ^^ + +error: aborting due to 3 previous errors + diff --git a/src/test/ui/suggestions/issue-82566-2.rs b/src/test/ui/suggestions/issue-82566-2.rs new file mode 100644 index 0000000000..80c8034bd0 --- /dev/null +++ b/src/test/ui/suggestions/issue-82566-2.rs @@ -0,0 +1,31 @@ +struct Foo1; +struct Foo2; +struct Foo3; + +impl Foo1 { + const SUM: usize = N1; +} + +impl Foo2 { + const SUM: usize = N1 + N2; +} + +impl Foo3 { + const SUM: usize = N1 + N2 + N3; +} + +fn foo1() -> [(); Foo1<10>::SUM] { //~ ERROR: comparison operators cannot be chained + todo!() +} + +fn foo2() -> [(); Foo2<10, 20>::SUM] { + //~^ ERROR: expected one of `.`, `?`, `]`, or an operator, found `,` + todo!() +} + +fn foo3() -> [(); Foo3<10, 20, 30>::SUM] { + //~^ ERROR: expected one of `.`, `?`, `]`, or an operator, found `,` + todo!() +} + +fn main() {} diff --git a/src/test/ui/suggestions/issue-82566-2.stderr b/src/test/ui/suggestions/issue-82566-2.stderr new file mode 100644 index 0000000000..ea391ee078 --- /dev/null +++ b/src/test/ui/suggestions/issue-82566-2.stderr @@ -0,0 +1,35 @@ +error: comparison operators cannot be chained + --> $DIR/issue-82566-2.rs:17:23 + | +LL | fn foo1() -> [(); Foo1<10>::SUM] { + | ^ ^ + | +help: use `::<...>` instead of `<...>` to specify type or const arguments + | +LL | fn foo1() -> [(); Foo1::<10>::SUM] { + | ^^ + +error: expected one of `.`, `?`, `]`, or an operator, found `,` + --> $DIR/issue-82566-2.rs:21:26 + | +LL | fn foo2() -> [(); Foo2<10, 20>::SUM] { + | ^ expected one of `.`, `?`, `]`, or an operator + | +help: use `::<...>` instead of `<...>` to specify type or const arguments + | +LL | fn foo2() -> [(); Foo2::<10, 20>::SUM] { + | ^^ + +error: expected one of `.`, `?`, `]`, or an operator, found `,` + --> $DIR/issue-82566-2.rs:26:26 + | +LL | fn foo3() -> [(); Foo3<10, 20, 30>::SUM] { + | ^ expected one of `.`, `?`, `]`, or an operator + | +help: use `::<...>` instead of `<...>` to specify type or const arguments + | +LL | fn foo3() -> [(); Foo3::<10, 20, 30>::SUM] { + | ^^ + +error: aborting due to 3 previous errors + diff --git a/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.nll.stderr b/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.nll.stderr new file mode 100644 index 0000000000..7e07a5775b --- /dev/null +++ b/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.nll.stderr @@ -0,0 +1,17 @@ +error[E0311]: the parameter type `T` may not live long enough + --> $DIR/missing-lifetimes-in-signature-2.rs:20:5 + | +LL | / foo.bar(move |_| { +LL | | +LL | | t.test(); +LL | | }); + | |______^ + | +note: the parameter type `T` must be valid for the anonymous lifetime defined on the function body at 19:24... + --> $DIR/missing-lifetimes-in-signature-2.rs:19:24 + | +LL | fn func(foo: &Foo, t: T) { + | ^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.rs b/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.rs new file mode 100644 index 0000000000..c6802ac6cc --- /dev/null +++ b/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.rs @@ -0,0 +1,26 @@ +// Regression test for #81650 + +struct Foo<'a> { + x: &'a mut &'a i32, +} + +impl<'a> Foo<'a> { + fn bar(&self, f: F) + where + F: FnOnce(&Foo<'a>) -> T, + F: 'a, + {} +} + +trait Test { + fn test(&self); +} + +fn func(foo: &Foo, t: T) { + foo.bar(move |_| { + //~^ ERROR the parameter type `T` may not live long enough + t.test(); + }); +} + +fn main() {} diff --git a/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.stderr b/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.stderr new file mode 100644 index 0000000000..4e7d529784 --- /dev/null +++ b/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature-2.stderr @@ -0,0 +1,21 @@ +error[E0311]: the parameter type `T` may not live long enough + --> $DIR/missing-lifetimes-in-signature-2.rs:20:9 + | +LL | fn func(foo: &Foo, t: T) { + | -- help: consider adding an explicit lifetime bound...: `T: 'a +` +LL | foo.bar(move |_| { + | ^^^ + | +note: the parameter type `T` must be valid for the anonymous lifetime defined on the function body at 19:24... + --> $DIR/missing-lifetimes-in-signature-2.rs:19:24 + | +LL | fn func(foo: &Foo, t: T) { + | ^^^ +note: ...so that the type `[closure@$DIR/missing-lifetimes-in-signature-2.rs:20:13: 23:6]` will meet its required lifetime bounds + --> $DIR/missing-lifetimes-in-signature-2.rs:20:9 + | +LL | foo.bar(move |_| { + | ^^^ + +error: aborting due to previous error + diff --git a/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature.nll.stderr b/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature.nll.stderr index 1bfcdab5d8..b509610b89 100644 --- a/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature.nll.stderr +++ b/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature.nll.stderr @@ -25,14 +25,11 @@ error[E0311]: the parameter type `G` may not live long enough LL | fn bar(g: G, dest: &mut T) -> impl FnOnce() + '_ | ^^^^^^^^^^^^^^^^^^ | -note: the parameter type `G` must be valid for the anonymous lifetime #1 defined on the function body at 25:1... - --> $DIR/missing-lifetimes-in-signature.rs:25:1 - | -LL | / fn bar(g: G, dest: &mut T) -> impl FnOnce() + '_ -LL | | -LL | | where -LL | | G: Get - | |_____________^ +note: the parameter type `G` must be valid for the anonymous lifetime defined on the function body at 25:26... + --> $DIR/missing-lifetimes-in-signature.rs:25:26 + | +LL | fn bar(g: G, dest: &mut T) -> impl FnOnce() + '_ + | ^^^^^^ error[E0311]: the parameter type `G` may not live long enough --> $DIR/missing-lifetimes-in-signature.rs:47:45 @@ -40,14 +37,11 @@ error[E0311]: the parameter type `G` may not live long enough LL | fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ | ^^^^^^^^^^^^^^^^^^ | -note: the parameter type `G` must be valid for the anonymous lifetime #1 defined on the function body at 47:1... - --> $DIR/missing-lifetimes-in-signature.rs:47:1 +note: the parameter type `G` must be valid for the anonymous lifetime defined on the function body at 47:34... + --> $DIR/missing-lifetimes-in-signature.rs:47:34 | -LL | / fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ -LL | | -LL | | where -LL | | G: Get - | |_____________^ +LL | fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + | ^^^^^^ error[E0311]: the parameter type `G` may not live long enough --> $DIR/missing-lifetimes-in-signature.rs:59:58 @@ -55,11 +49,11 @@ error[E0311]: the parameter type `G` may not live long enough LL | fn qux<'b, G: Get + 'b, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ { | ^^^^^^^^^^^^^^^^^^ | -note: the parameter type `G` must be valid for the anonymous lifetime #1 defined on the method body at 59:5... - --> $DIR/missing-lifetimes-in-signature.rs:59:5 +note: the parameter type `G` must be valid for the anonymous lifetime defined on the method body at 59:47... + --> $DIR/missing-lifetimes-in-signature.rs:59:47 | LL | fn qux<'b, G: Get + 'b, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^ error[E0311]: the parameter type `G` may not live long enough --> $DIR/missing-lifetimes-in-signature.rs:68:45 @@ -67,14 +61,11 @@ error[E0311]: the parameter type `G` may not live long enough LL | fn bat<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a | ^^^^^^^^^^^^^^^^^^^^^^^ | -note: the parameter type `G` must be valid for the anonymous lifetime #1 defined on the function body at 68:1... - --> $DIR/missing-lifetimes-in-signature.rs:68:1 +note: the parameter type `G` must be valid for the anonymous lifetime defined on the function body at 68:34... + --> $DIR/missing-lifetimes-in-signature.rs:68:34 | -LL | / fn bat<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a -LL | | -LL | | where -LL | | G: Get - | |_____________^ +LL | fn bat<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + 'a + | ^^^^^^ error[E0621]: explicit lifetime required in the type of `dest` --> $DIR/missing-lifetimes-in-signature.rs:73:5 diff --git a/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature.stderr b/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature.stderr index 69e95efa72..789fff7acc 100644 --- a/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature.stderr +++ b/src/test/ui/suggestions/lifetimes/missing-lifetimes-in-signature.stderr @@ -33,14 +33,11 @@ error[E0311]: the parameter type `G` may not live long enough LL | fn bar(g: G, dest: &mut T) -> impl FnOnce() + '_ | ^^^^^^^^^^^^^^^^^^ | -note: the parameter type `G` must be valid for the anonymous lifetime #1 defined on the function body at 25:1... - --> $DIR/missing-lifetimes-in-signature.rs:25:1 - | -LL | / fn bar(g: G, dest: &mut T) -> impl FnOnce() + '_ -LL | | -LL | | where -LL | | G: Get - | |_____________^ +note: the parameter type `G` must be valid for the anonymous lifetime defined on the function body at 25:26... + --> $DIR/missing-lifetimes-in-signature.rs:25:26 + | +LL | fn bar(g: G, dest: &mut T) -> impl FnOnce() + '_ + | ^^^^^^ note: ...so that the type `[closure@$DIR/missing-lifetimes-in-signature.rs:30:5: 32:6]` will meet its required lifetime bounds --> $DIR/missing-lifetimes-in-signature.rs:25:37 | @@ -57,14 +54,11 @@ error[E0311]: the parameter type `G` may not live long enough LL | fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ | ^^^^^^^^^^^^^^^^^^ | -note: the parameter type `G` must be valid for the anonymous lifetime #1 defined on the function body at 47:1... - --> $DIR/missing-lifetimes-in-signature.rs:47:1 +note: the parameter type `G` must be valid for the anonymous lifetime defined on the function body at 47:34... + --> $DIR/missing-lifetimes-in-signature.rs:47:34 | -LL | / fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ -LL | | -LL | | where -LL | | G: Get - | |_____________^ +LL | fn qux<'a, G: 'a, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ + | ^^^^^^ note: ...so that the type `[closure@$DIR/missing-lifetimes-in-signature.rs:52:5: 54:6]` will meet its required lifetime bounds --> $DIR/missing-lifetimes-in-signature.rs:47:45 | @@ -81,11 +75,11 @@ error[E0311]: the parameter type `G` may not live long enough LL | fn qux<'b, G: Get + 'b, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ { | ^^^^^^^^^^^^^^^^^^ | -note: the parameter type `G` must be valid for the anonymous lifetime #1 defined on the method body at 59:5... - --> $DIR/missing-lifetimes-in-signature.rs:59:5 +note: the parameter type `G` must be valid for the anonymous lifetime defined on the method body at 59:47... + --> $DIR/missing-lifetimes-in-signature.rs:59:47 | LL | fn qux<'b, G: Get + 'b, T>(g: G, dest: &mut T) -> impl FnOnce() + '_ { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^ note: ...so that the type `[closure@$DIR/missing-lifetimes-in-signature.rs:61:9: 63:10]` will meet its required lifetime bounds --> $DIR/missing-lifetimes-in-signature.rs:59:58 | diff --git a/src/test/ui/suggestions/match-needing-semi.fixed b/src/test/ui/suggestions/match-needing-semi.fixed deleted file mode 100644 index 03cbed1376..0000000000 --- a/src/test/ui/suggestions/match-needing-semi.fixed +++ /dev/null @@ -1,18 +0,0 @@ -// check-only -// run-rustfix - -fn main() { - match 3 { - 4 => 1, - 3 => { - 2 //~ ERROR mismatched types - } - _ => 2 - }; - match 3 { //~ ERROR mismatched types - 4 => 1, - 3 => 2, - _ => 2 - }; - let _ = (); -} diff --git a/src/test/ui/suggestions/match-needing-semi.rs b/src/test/ui/suggestions/match-needing-semi.rs index f34071ac75..833555d0e4 100644 --- a/src/test/ui/suggestions/match-needing-semi.rs +++ b/src/test/ui/suggestions/match-needing-semi.rs @@ -1,11 +1,10 @@ // check-only -// run-rustfix fn main() { match 3 { 4 => 1, 3 => { - 2 //~ ERROR mismatched types + foo() //~ ERROR mismatched types } _ => 2 } @@ -16,3 +15,7 @@ fn main() { } let _ = (); } + +fn foo() -> i32 { + 42 +} diff --git a/src/test/ui/suggestions/match-needing-semi.stderr b/src/test/ui/suggestions/match-needing-semi.stderr index 28abd08952..3739c9940f 100644 --- a/src/test/ui/suggestions/match-needing-semi.stderr +++ b/src/test/ui/suggestions/match-needing-semi.stderr @@ -1,20 +1,27 @@ error[E0308]: mismatched types - --> $DIR/match-needing-semi.rs:8:13 + --> $DIR/match-needing-semi.rs:7:13 | LL | / match 3 { LL | | 4 => 1, LL | | 3 => { -LL | | 2 - | | ^ expected `()`, found integer +LL | | foo() + | | ^^^^^ expected `()`, found `i32` LL | | } LL | | _ => 2 LL | | } - | | -- help: consider using a semicolon here - | |_____| - | expected this to be `()` + | |_____- expected this to be `()` + | +help: consider using a semicolon here + | +LL | foo(); + | ^ +help: consider using a semicolon here + | +LL | }; + | ^ error[E0308]: mismatched types - --> $DIR/match-needing-semi.rs:12:5 + --> $DIR/match-needing-semi.rs:11:5 | LL | / match 3 { LL | | 4 => 1, diff --git a/src/test/ui/suggestions/match-prev-arm-needing-semi.rs b/src/test/ui/suggestions/match-prev-arm-needing-semi.rs index b8ac030b0b..3b2cff3140 100644 --- a/src/test/ui/suggestions/match-prev-arm-needing-semi.rs +++ b/src/test/ui/suggestions/match-prev-arm-needing-semi.rs @@ -13,9 +13,9 @@ fn extra_semicolon() { }; } -async fn async_dummy() {} //~ NOTE the `Output` of this `async fn`'s found opaque type -async fn async_dummy2() {} //~ NOTE the `Output` of this `async fn`'s found opaque type -//~^ NOTE the `Output` of this `async fn`'s found opaque type +async fn async_dummy() {} //~ NOTE checked the `Output` of this `async fn`, found opaque type +async fn async_dummy2() {} //~ NOTE checked the `Output` of this `async fn`, found opaque type +//~| NOTE checked the `Output` of this `async fn`, found opaque type async fn async_extra_semicolon_same() { let _ = match true { //~ NOTE `match` arms have incompatible types @@ -26,6 +26,7 @@ async fn async_extra_semicolon_same() { false => async_dummy(), //~ ERROR `match` arms have incompatible types //~^ NOTE expected `()`, found opaque type //~| NOTE expected type `()` + //~| NOTE while checking the return type of the `async fn` //~| HELP consider `await`ing on the `Future` }; } @@ -39,6 +40,7 @@ async fn async_extra_semicolon_different() { false => async_dummy2(), //~ ERROR `match` arms have incompatible types //~^ NOTE expected `()`, found opaque type //~| NOTE expected type `()` + //~| NOTE while checking the return type of the `async fn` //~| HELP consider `await`ing on the `Future` }; } @@ -51,6 +53,7 @@ async fn async_different_futures() { //~^ NOTE expected opaque type, found a different opaque type //~| NOTE expected type `impl Future` //~| NOTE distinct uses of `impl Trait` result in different opaque types + //~| NOTE while checking the return type of the `async fn` }; } diff --git a/src/test/ui/suggestions/match-prev-arm-needing-semi.stderr b/src/test/ui/suggestions/match-prev-arm-needing-semi.stderr index e9803a78f9..e31ea9679b 100644 --- a/src/test/ui/suggestions/match-prev-arm-needing-semi.stderr +++ b/src/test/ui/suggestions/match-prev-arm-needing-semi.stderr @@ -2,7 +2,7 @@ error[E0308]: `match` arms have incompatible types --> $DIR/match-prev-arm-needing-semi.rs:26:18 | LL | async fn async_dummy() {} - | - the `Output` of this `async fn`'s found opaque type + | - checked the `Output` of this `async fn`, found opaque type ... LL | let _ = match true { | _____________- @@ -18,25 +18,23 @@ LL | | LL | | }; | |_____- `match` arms have incompatible types | + = note: while checking the return type of the `async fn` = note: expected type `()` found opaque type `impl Future` help: consider `await`ing on the `Future` | LL | false => async_dummy().await, | ^^^^^^ -help: consider removing this semicolon and boxing the expressions - | -LL | Box::new(async_dummy()) -LL | -LL | } -LL | false => Box::new(async_dummy()), +help: consider removing this semicolon | +LL | async_dummy() + | -- error[E0308]: `match` arms have incompatible types - --> $DIR/match-prev-arm-needing-semi.rs:39:18 + --> $DIR/match-prev-arm-needing-semi.rs:40:18 | LL | async fn async_dummy2() {} - | - the `Output` of this `async fn`'s found opaque type + | - checked the `Output` of this `async fn`, found opaque type ... LL | let _ = match true { | _____________- @@ -52,6 +50,7 @@ LL | | LL | | }; | |_____- `match` arms have incompatible types | + = note: while checking the return type of the `async fn` = note: expected type `()` found opaque type `impl Future` help: consider `await`ing on the `Future` @@ -67,10 +66,10 @@ LL | false => Box::new(async_dummy2()), | error[E0308]: `match` arms have incompatible types - --> $DIR/match-prev-arm-needing-semi.rs:50:18 + --> $DIR/match-prev-arm-needing-semi.rs:52:18 | LL | async fn async_dummy2() {} - | - the `Output` of this `async fn`'s found opaque type + | - checked the `Output` of this `async fn`, found opaque type ... LL | let _ = match true { | _____________- @@ -84,6 +83,7 @@ LL | | LL | | }; | |_____- `match` arms have incompatible types | + = note: while checking the return type of the `async fn` = note: expected type `impl Future` (opaque type at <$DIR/match-prev-arm-needing-semi.rs:16:24>) found opaque type `impl Future` (opaque type at <$DIR/match-prev-arm-needing-semi.rs:17:25>) = note: distinct uses of `impl Trait` result in different opaque types diff --git a/src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.rs b/src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.rs new file mode 100644 index 0000000000..0360ce6e6b --- /dev/null +++ b/src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.rs @@ -0,0 +1,30 @@ +pub trait Foo {} + +struct Bar; +struct Baz; + +impl Foo for Bar { } +impl Foo for Baz { } + +fn not_all_paths(a: &str) -> u32 { //~ ERROR mismatched types + match a { + "baz" => 0, + _ => 1, + }; +} + +fn right(b: &str) -> Box { + match b { + "baz" => Box::new(Baz), + _ => Box::new(Bar), + } +} + +fn wrong(c: &str) -> Box { //~ ERROR mismatched types + match c { + "baz" => Box::new(Baz), + _ => Box::new(Bar), //~ ERROR `match` arms have incompatible types + }; +} + +fn main() {} diff --git a/src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.stderr b/src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.stderr new file mode 100644 index 0000000000..7dce97468b --- /dev/null +++ b/src/test/ui/suggestions/match-with-different-arm-types-as-stmt-instead-of-expr.stderr @@ -0,0 +1,51 @@ +error[E0308]: mismatched types + --> $DIR/match-with-different-arm-types-as-stmt-instead-of-expr.rs:9:30 + | +LL | fn not_all_paths(a: &str) -> u32 { + | ------------- ^^^ expected `u32`, found `()` + | | + | implicitly returns `()` as its body has no tail or `return` expression +... +LL | }; + | - help: consider removing this semicolon + +error[E0308]: `match` arms have incompatible types + --> $DIR/match-with-different-arm-types-as-stmt-instead-of-expr.rs:26:14 + | +LL | / match c { +LL | | "baz" => Box::new(Baz), + | | ------------- this is found to be of type `Box` +LL | | _ => Box::new(Bar), + | | ^^^^^^^^^^^^^ expected struct `Baz`, found struct `Bar` +LL | | }; + | |_____- `match` arms have incompatible types + | + = note: expected type `Box` + found struct `Box` +note: you might have meant to return the `match` expression + --> $DIR/match-with-different-arm-types-as-stmt-instead-of-expr.rs:27:6 + | +LL | fn wrong(c: &str) -> Box { + | ------------ the `match` arms can conform to this return type +LL | / match c { +LL | | "baz" => Box::new(Baz), +LL | | _ => Box::new(Bar), +LL | | }; + | | -^ the `match` is a statement because of this semicolon, consider removing it + | |_____| + | this could be implicitly returned but it is a statement, not a tail expression + +error[E0308]: mismatched types + --> $DIR/match-with-different-arm-types-as-stmt-instead-of-expr.rs:23:22 + | +LL | fn wrong(c: &str) -> Box { + | ----- ^^^^^^^^^^^^ expected struct `Box`, found `()` + | | + | implicitly returns `()` as its body has no tail or `return` expression + | + = note: expected struct `Box<(dyn Foo + 'static)>` + found unit type `()` + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/suggestions/missing-trait-bounds-for-method-call.stderr b/src/test/ui/suggestions/missing-trait-bounds-for-method-call.stderr index c7376b0007..0a64a0d7d5 100644 --- a/src/test/ui/suggestions/missing-trait-bounds-for-method-call.stderr +++ b/src/test/ui/suggestions/missing-trait-bounds-for-method-call.stderr @@ -8,10 +8,10 @@ LL | self.foo(); | ^^^ method cannot be called on `&Foo` due to unsatisfied trait bounds | = note: the following trait bounds were not satisfied: - `T: Bar` - which is required by `Foo: Bar` `T: Default` which is required by `Foo: Bar` + `T: Bar` + which is required by `Foo: Bar` help: consider restricting the type parameters to satisfy the trait bounds | LL | struct Foo where T: Bar, T: Default { 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 3120b739c0..b8ef230b44 100644 --- a/src/test/ui/suggestions/mut-borrow-needed-by-trait.stderr +++ b/src/test/ui/suggestions/mut-borrow-needed-by-trait.stderr @@ -11,7 +11,7 @@ error[E0277]: the trait bound `&dyn std::io::Write: std::io::Write` is not satis --> $DIR/mut-borrow-needed-by-trait.rs:17:14 | LL | let fp = BufWriter::new(fp); - | ^^^^^^^^^^^^^^ the trait `std::io::Write` is not implemented for `&dyn std::io::Write` + | ^^^^^^^^^ the trait `std::io::Write` is not implemented for `&dyn std::io::Write` | ::: $SRC_DIR/std/src/io/buffered/bufwriter.rs:LL:COL | diff --git a/src/test/ui/suggestions/mut-ref-reassignment.stderr b/src/test/ui/suggestions/mut-ref-reassignment.stderr index e31c4dc66c..327bbee196 100644 --- a/src/test/ui/suggestions/mut-ref-reassignment.stderr +++ b/src/test/ui/suggestions/mut-ref-reassignment.stderr @@ -17,7 +17,7 @@ error[E0308]: mismatched types LL | opt = None | ^^^^ expected mutable reference, found enum `Option` | - = note: expected mutable reference `&mut std::result::Result` + = note: expected mutable reference `&mut Result` found enum `Option<_>` error[E0308]: mismatched types diff --git a/src/test/ui/suggestions/option-content-move.stderr b/src/test/ui/suggestions/option-content-move.stderr index 0f3dd346e8..c00a0f1700 100644 --- a/src/test/ui/suggestions/option-content-move.stderr +++ b/src/test/ui/suggestions/option-content-move.stderr @@ -13,7 +13,7 @@ error[E0507]: cannot move out of `selection.1` which is behind a shared referenc LL | if selection.1.unwrap().contains(selection.0) { | ^^^^^^^^^^^ | | - | move occurs because `selection.1` has type `std::result::Result`, which does not implement the `Copy` trait + | move occurs because `selection.1` has type `Result`, which does not implement the `Copy` trait | help: consider borrowing the `Result`'s content: `selection.1.as_ref()` error: aborting due to 2 previous errors diff --git a/src/test/ui/suggestions/suggest-box.stderr b/src/test/ui/suggestions/suggest-box.stderr index 57c83baf4f..8107fd8621 100644 --- a/src/test/ui/suggestions/suggest-box.stderr +++ b/src/test/ui/suggestions/suggest-box.stderr @@ -10,7 +10,7 @@ LL | | Ok(()) LL | | }; | |_____^ expected struct `Box`, found closure | - = note: expected struct `Box std::result::Result<(), ()>>` + = note: expected struct `Box Result<(), ()>>` found closure `[closure@$DIR/suggest-box.rs:4:47: 7:6]` = 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 help: store this in the heap by calling `Box::new` diff --git a/src/test/ui/suggestions/suggest-change-mut.rs b/src/test/ui/suggestions/suggest-change-mut.rs new file mode 100644 index 0000000000..a2bc6fd09b --- /dev/null +++ b/src/test/ui/suggestions/suggest-change-mut.rs @@ -0,0 +1,21 @@ +#![allow(warnings)] + +use std::io::{BufRead, BufReader, Read, Write}; + +fn issue_81421(mut stream: T) { //~ HELP consider introducing a `where` bound + let initial_message = format!("Hello world"); + let mut buffer: Vec = Vec::new(); + let bytes_written = stream.write_all(initial_message.as_bytes()); + let flush = stream.flush(); + + loop { + let mut stream_reader = BufReader::new(&stream); + //~^ ERROR the trait bound `&T: std::io::Read` is not satisfied [E0277] + //~| HELP consider removing the leading `&`-reference + //~| HELP consider changing this borrow's mutability + stream_reader.read_until(b'\n', &mut buffer).expect("Reading into buffer failed"); + //~^ ERROR the method `read_until` exists for struct `BufReader<&T>`, + } +} + +fn main() {} diff --git a/src/test/ui/suggestions/suggest-change-mut.stderr b/src/test/ui/suggestions/suggest-change-mut.stderr new file mode 100644 index 0000000000..9b8181647a --- /dev/null +++ b/src/test/ui/suggestions/suggest-change-mut.stderr @@ -0,0 +1,39 @@ +error[E0277]: the trait bound `&T: std::io::Read` is not satisfied + --> $DIR/suggest-change-mut.rs:12:48 + | +LL | let mut stream_reader = BufReader::new(&stream); + | ^^^^^^^ the trait `std::io::Read` is not implemented for `&T` + | + = note: required by `BufReader::::new` +help: consider removing the leading `&`-reference + | +LL | let mut stream_reader = BufReader::new(stream); + | -- +help: consider introducing a `where` bound, but there might be an alternative better way to express this requirement + | +LL | fn issue_81421(mut stream: T) where &T: std::io::Read { + | ^^^^^^^^^^^^^^^^^^^^^^^ +help: consider changing this borrow's mutability + | +LL | let mut stream_reader = BufReader::new(&mut stream); + | ^^^^ + +error[E0599]: the method `read_until` exists for struct `BufReader<&T>`, but its trait bounds were not satisfied + --> $DIR/suggest-change-mut.rs:16:23 + | +LL | stream_reader.read_until(b'\n', &mut buffer).expect("Reading into buffer failed"); + | ^^^^^^^^^^ method cannot be called on `BufReader<&T>` due to unsatisfied trait bounds + | + ::: $SRC_DIR/std/src/io/buffered/bufreader.rs:LL:COL + | +LL | pub struct BufReader { + | ----------------------- doesn't satisfy `BufReader<&T>: BufRead` + | + = note: the following trait bounds were not satisfied: + `&T: std::io::Read` + which is required by `BufReader<&T>: BufRead` + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0277, E0599. +For more information about an error, try `rustc --explain E0277`. diff --git a/src/test/ui/suggestions/suggest-mut-method-for-loop.rs b/src/test/ui/suggestions/suggest-mut-method-for-loop.rs new file mode 100644 index 0000000000..756768bce4 --- /dev/null +++ b/src/test/ui/suggestions/suggest-mut-method-for-loop.rs @@ -0,0 +1,17 @@ +use std::collections::HashMap; +struct X(usize); +struct Y { + v: u32 +} + +fn main() { + let mut buzz = HashMap::new(); + buzz.insert("a", Y { v: 0 }); + + for mut t in buzz.values() { + //~^ HELP + //~| SUGGESTION values_mut() + t.v += 1; + //~^ ERROR cannot assign + } +} diff --git a/src/test/ui/suggestions/suggest-mut-method-for-loop.stderr b/src/test/ui/suggestions/suggest-mut-method-for-loop.stderr new file mode 100644 index 0000000000..6ab0819744 --- /dev/null +++ b/src/test/ui/suggestions/suggest-mut-method-for-loop.stderr @@ -0,0 +1,15 @@ +error[E0594]: cannot assign to `t.v` which is behind a `&` reference + --> $DIR/suggest-mut-method-for-loop.rs:14:9 + | +LL | for mut t in buzz.values() { + | ------------- + | | | + | | help: use mutable method: `values_mut()` + | this iterator yields `&` references +... +LL | t.v += 1; + | ^^^^^^^^ `t` is a `&` reference, so the data it refers to cannot be written + +error: aborting due to previous error + +For more information about this error, try `rustc --explain E0594`. diff --git a/src/test/ui/suggestions/suggest-std-when-using-type.stderr b/src/test/ui/suggestions/suggest-std-when-using-type.stderr index 5199faa5c8..7f4c80f50e 100644 --- a/src/test/ui/suggestions/suggest-std-when-using-type.stderr +++ b/src/test/ui/suggestions/suggest-std-when-using-type.stderr @@ -2,12 +2,12 @@ error[E0223]: ambiguous associated type --> $DIR/suggest-std-when-using-type.rs:2:14 | LL | let pi = f32::consts::PI; - | ^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^ | help: you are looking for the module in `std`, not the primitive type | LL | let pi = std::f32::consts::PI; - | ^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^^^^^^^^^^ error[E0599]: no function or associated item named `from_utf8` found for type `str` in the current scope --> $DIR/suggest-std-when-using-type.rs:5:14 diff --git a/src/test/ui/symbol-names/basic.legacy.stderr b/src/test/ui/symbol-names/basic.legacy.stderr index dec57e06ea..7155d88be9 100644 --- a/src/test/ui/symbol-names/basic.legacy.stderr +++ b/src/test/ui/symbol-names/basic.legacy.stderr @@ -1,10 +1,10 @@ -error: symbol-name(_ZN5basic4main17h4272b3de5e868f5aE) +error: symbol-name(_ZN5basic4main17hfcf1daab33c43a6aE) --> $DIR/basic.rs:8:1 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling(basic::main::h4272b3de5e868f5a) +error: demangling(basic::main::hfcf1daab33c43a6a) --> $DIR/basic.rs:8:1 | LL | #[rustc_symbol_name] diff --git a/src/test/ui/symbol-names/basic.rs b/src/test/ui/symbol-names/basic.rs index ddc349d7f1..bd107c1020 100644 --- a/src/test/ui/symbol-names/basic.rs +++ b/src/test/ui/symbol-names/basic.rs @@ -9,8 +9,8 @@ //[legacy]~^ ERROR symbol-name(_ZN5basic4main //[legacy]~| ERROR demangling(basic::main //[legacy]~| ERROR demangling-alt(basic::main) - //[v0]~^^^^ ERROR symbol-name(_RNvCs4fqI2P2rA04_5basic4main) - //[v0]~| ERROR demangling(basic[317d481089b8c8fe]::main) + //[v0]~^^^^ ERROR symbol-name(_RNvCs21hi0yVfW1J_5basic4main) + //[v0]~| ERROR demangling(basic[17891616a171812d]::main) //[v0]~| ERROR demangling-alt(basic::main) #[rustc_def_path] //[legacy]~^ ERROR def-path(main) diff --git a/src/test/ui/symbol-names/basic.v0.stderr b/src/test/ui/symbol-names/basic.v0.stderr index 36dba0dfc9..519efc9d7b 100644 --- a/src/test/ui/symbol-names/basic.v0.stderr +++ b/src/test/ui/symbol-names/basic.v0.stderr @@ -1,10 +1,10 @@ -error: symbol-name(_RNvCs4fqI2P2rA04_5basic4main) +error: symbol-name(_RNvCs21hi0yVfW1J_5basic4main) --> $DIR/basic.rs:8:1 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling(basic[317d481089b8c8fe]::main) +error: demangling(basic[17891616a171812d]::main) --> $DIR/basic.rs:8:1 | LL | #[rustc_symbol_name] diff --git a/src/test/ui/symbol-names/const-generics-demangling.rs b/src/test/ui/symbol-names/const-generics-demangling.rs index 55ab17fcd5..bd7e1c0f33 100644 --- a/src/test/ui/symbol-names/const-generics-demangling.rs +++ b/src/test/ui/symbol-names/const-generics-demangling.rs @@ -5,32 +5,32 @@ pub struct Unsigned; #[rustc_symbol_name] -//~^ ERROR symbol-name(_RMCs4fqI2P2rA04_25const_generics_demanglingINtB0_8UnsignedKhb_E) -//~| ERROR demangling(>) +//~^ ERROR symbol-name(_RMCs21hi0yVfW1J_25const_generics_demanglingINtB0_8UnsignedKhb_E) +//~| ERROR demangling(>) //~| ERROR demangling-alt(>) impl Unsigned<11> {} pub struct Signed; #[rustc_symbol_name] -//~^ ERROR symbol-name(_RMs_Cs4fqI2P2rA04_25const_generics_demanglingINtB2_6SignedKsn98_E) -//~| ERROR demangling(>) +//~^ ERROR symbol-name(_RMs_Cs21hi0yVfW1J_25const_generics_demanglingINtB2_6SignedKsn98_E) +//~| ERROR demangling(>) //~| ERROR demangling-alt(>) impl Signed<-152> {} pub struct Bool; #[rustc_symbol_name] -//~^ ERROR symbol-name(_RMs0_Cs4fqI2P2rA04_25const_generics_demanglingINtB3_4BoolKb1_E) -//~| ERROR demangling(>) +//~^ ERROR symbol-name(_RMs0_Cs21hi0yVfW1J_25const_generics_demanglingINtB3_4BoolKb1_E) +//~| ERROR demangling(>) //~| ERROR demangling-alt(>) impl Bool {} pub struct Char; #[rustc_symbol_name] -//~^ ERROR symbol-name(_RMs1_Cs4fqI2P2rA04_25const_generics_demanglingINtB3_4CharKc2202_E) -//~| ERROR demangling(>) +//~^ ERROR symbol-name(_RMs1_Cs21hi0yVfW1J_25const_generics_demanglingINtB3_4CharKc2202_E) +//~| ERROR demangling(>) //~| ERROR demangling-alt(>) impl Char<'∂'> {} diff --git a/src/test/ui/symbol-names/const-generics-demangling.stderr b/src/test/ui/symbol-names/const-generics-demangling.stderr index a9574cacea..13995403f7 100644 --- a/src/test/ui/symbol-names/const-generics-demangling.stderr +++ b/src/test/ui/symbol-names/const-generics-demangling.stderr @@ -1,10 +1,10 @@ -error: symbol-name(_RMCs4fqI2P2rA04_25const_generics_demanglingINtB0_8UnsignedKhb_E) +error: symbol-name(_RMCs21hi0yVfW1J_25const_generics_demanglingINtB0_8UnsignedKhb_E) --> $DIR/const-generics-demangling.rs:7:1 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling(>) +error: demangling(>) --> $DIR/const-generics-demangling.rs:7:1 | LL | #[rustc_symbol_name] @@ -16,13 +16,13 @@ error: demangling-alt(>) LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: symbol-name(_RMs_Cs4fqI2P2rA04_25const_generics_demanglingINtB2_6SignedKsn98_E) +error: symbol-name(_RMs_Cs21hi0yVfW1J_25const_generics_demanglingINtB2_6SignedKsn98_E) --> $DIR/const-generics-demangling.rs:15:1 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling(>) +error: demangling(>) --> $DIR/const-generics-demangling.rs:15:1 | LL | #[rustc_symbol_name] @@ -34,13 +34,13 @@ error: demangling-alt(>) LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: symbol-name(_RMs0_Cs4fqI2P2rA04_25const_generics_demanglingINtB3_4BoolKb1_E) +error: symbol-name(_RMs0_Cs21hi0yVfW1J_25const_generics_demanglingINtB3_4BoolKb1_E) --> $DIR/const-generics-demangling.rs:23:1 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling(>) +error: demangling(>) --> $DIR/const-generics-demangling.rs:23:1 | LL | #[rustc_symbol_name] @@ -52,13 +52,13 @@ error: demangling-alt(>) LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: symbol-name(_RMs1_Cs4fqI2P2rA04_25const_generics_demanglingINtB3_4CharKc2202_E) +error: symbol-name(_RMs1_Cs21hi0yVfW1J_25const_generics_demanglingINtB3_4CharKc2202_E) --> $DIR/const-generics-demangling.rs:31:1 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling(>) +error: demangling(>) --> $DIR/const-generics-demangling.rs:31:1 | LL | #[rustc_symbol_name] diff --git a/src/test/ui/symbol-names/impl1.legacy.stderr b/src/test/ui/symbol-names/impl1.legacy.stderr index c866f9bd3b..bd32a39a65 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(_ZN5impl13foo3Foo3bar17ha318160f105e638cE) - --> $DIR/impl1.rs:16:9 +error: symbol-name(_ZN5impl13foo3Foo3bar17) + --> $DIR/impl1.rs:15:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling(impl1::foo::Foo::bar::ha318160f105e638c) - --> $DIR/impl1.rs:16:9 +error: demangling(impl1::foo::Foo::bar::) + --> $DIR/impl1.rs:15:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt(impl1::foo::Foo::bar) - --> $DIR/impl1.rs:16:9 + --> $DIR/impl1.rs:15:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: def-path(foo::Foo::bar) - --> $DIR/impl1.rs:23:9 + --> $DIR/impl1.rs:22:9 | LL | #[rustc_def_path] | ^^^^^^^^^^^^^^^^^ -error: symbol-name(_ZN5impl13bar33_$LT$impl$u20$impl1..foo..Foo$GT$3baz17h6c2dbab6e66f9fa3E) - --> $DIR/impl1.rs:34:9 +error: symbol-name(_ZN5impl13bar33_$LT$impl$u20$impl1..foo..Foo$GT$3baz17) + --> $DIR/impl1.rs:33:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling(impl1::bar::::baz::h6c2dbab6e66f9fa3) - --> $DIR/impl1.rs:34:9 +error: demangling(impl1::bar::::baz::) + --> $DIR/impl1.rs:33:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt(impl1::bar::::baz) - --> $DIR/impl1.rs:34:9 + --> $DIR/impl1.rs:33:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: def-path(bar::::baz) - --> $DIR/impl1.rs:41:9 + --> $DIR/impl1.rs:40: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$3$u5d$$u20$as$u20$impl1..main..$u7b$$u7b$closure$u7d$$u7d$..Bar$GT$6method17SYMBOL_HASHE) - --> $DIR/impl1.rs:64: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$6method17) + --> $DIR/impl1.rs:63:13 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -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 +error: demangling(<[&dyn impl1::Foo+Assoc = extern "C" fn(&u8, ::.)+impl1::AutoTrait; 3] as impl1::main::{{closure}}::Bar>::method::) + --> $DIR/impl1.rs:63:13 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ 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 + --> $DIR/impl1.rs:63:13 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: def-path(<[&dyn Foo extern "C" fn(&'r u8, ...)> + AutoTrait; 3] as main::{closure#1}::Bar>::method) - --> $DIR/impl1.rs:71:13 + --> $DIR/impl1.rs:70:13 | LL | #[rustc_def_path] | ^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/symbol-names/impl1.rs b/src/test/ui/symbol-names/impl1.rs index 24bdf6d669..771695330d 100644 --- a/src/test/ui/symbol-names/impl1.rs +++ b/src/test/ui/symbol-names/impl1.rs @@ -3,8 +3,7 @@ // revisions: legacy v0 //[legacy]compile-flags: -Z symbol-mangling-version=legacy //[v0]compile-flags: -Z symbol-mangling-version=v0 -//[legacy]normalize-stderr-32bit: "hee444285569b39c2" -> "SYMBOL_HASH" -//[legacy]normalize-stderr-64bit: "h310ea0259fc3d32d" -> "SYMBOL_HASH" +//[legacy]normalize-stderr-test: "h[\w]{16}E?\)" -> ")" #![feature(auto_traits, rustc_attrs)] #![allow(dead_code)] @@ -17,8 +16,8 @@ mod foo { //[legacy]~^ ERROR symbol-name(_ZN5impl13foo3Foo3bar //[legacy]~| ERROR demangling(impl1::foo::Foo::bar //[legacy]~| ERROR demangling-alt(impl1::foo::Foo::bar) - //[v0]~^^^^ ERROR symbol-name(_RNvMNtCs4fqI2P2rA04_5impl13fooNtB2_3Foo3bar) - //[v0]~| ERROR demangling(::bar) + //[v0]~^^^^ ERROR symbol-name(_RNvMNtCs21hi0yVfW1J_5impl13fooNtB2_3Foo3bar) + //[v0]~| ERROR demangling(::bar) //[v0]~| ERROR demangling-alt(::bar) #[rustc_def_path] //[legacy]~^ ERROR def-path(foo::Foo::bar) @@ -35,8 +34,8 @@ mod bar { //[legacy]~^ ERROR symbol-name(_ZN5impl13bar33_$LT$impl$u20$impl1..foo..Foo$GT$3baz //[legacy]~| ERROR demangling(impl1::bar::::baz //[legacy]~| ERROR demangling-alt(impl1::bar::::baz) - //[v0]~^^^^ ERROR symbol-name(_RNvMNtCs4fqI2P2rA04_5impl13barNtNtB4_3foo3Foo3baz) - //[v0]~| ERROR demangling(::baz) + //[v0]~^^^^ ERROR symbol-name(_RNvMNtCs21hi0yVfW1J_5impl13barNtNtB4_3foo3Foo3baz) + //[v0]~| ERROR demangling(::baz) //[v0]~| ERROR demangling-alt(::baz) #[rustc_def_path] //[legacy]~^ ERROR def-path(bar::::baz) @@ -65,8 +64,8 @@ fn main() { //[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 extern "C" fn(&'a u8, ...)> + impl1[317d481089b8c8fe]::AutoTrait; 3: usize] as impl1[317d481089b8c8fe]::main::{closure#1}::Bar>::method) + //[v0]~^^^^ ERROR symbol-name(_RNvXNCNvCs21hi0yVfW1J_5impl14mains_0ARDNtB6_3Foop5AssocFG_KCRL0_hvEuNtB6_9AutoTraitEL_j3_NtB2_3Bar6method) + //[v0]~| ERROR demangling(<[&dyn impl1[17891616a171812d]::Foo extern "C" fn(&'a u8, ...)> + impl1[17891616a171812d]::AutoTrait; 3: usize] as impl1[17891616a171812d]::main::{closure#1}::Bar>::method) //[v0]~| ERROR demangling-alt(<[&dyn impl1::Foo extern "C" fn(&'a u8, ...)> + impl1::AutoTrait; 3] as impl1::main::{closure#1}::Bar>::method) #[rustc_def_path] //[legacy]~^ ERROR def-path(<[&dyn Foo extern "C" fn(&'r u8, ...)> + AutoTrait; 3] as main::{closure#1}::Bar>::method) diff --git a/src/test/ui/symbol-names/impl1.v0.stderr b/src/test/ui/symbol-names/impl1.v0.stderr index db5eda0db5..3a6610935d 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:16:9 +error: symbol-name(_RNvMNtCs21hi0yVfW1J_5impl13fooNtB2_3Foo3bar) + --> $DIR/impl1.rs:15:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling(::bar) - --> $DIR/impl1.rs:16:9 +error: demangling(::bar) + --> $DIR/impl1.rs:15:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt(::bar) - --> $DIR/impl1.rs:16:9 + --> $DIR/impl1.rs:15:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: def-path(foo::Foo::bar) - --> $DIR/impl1.rs:23:9 + --> $DIR/impl1.rs:22:9 | LL | #[rustc_def_path] | ^^^^^^^^^^^^^^^^^ -error: symbol-name(_RNvMNtCs4fqI2P2rA04_5impl13barNtNtB4_3foo3Foo3baz) - --> $DIR/impl1.rs:34:9 +error: symbol-name(_RNvMNtCs21hi0yVfW1J_5impl13barNtNtB4_3foo3Foo3baz) + --> $DIR/impl1.rs:33:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling(::baz) - --> $DIR/impl1.rs:34:9 +error: demangling(::baz) + --> $DIR/impl1.rs:33:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt(::baz) - --> $DIR/impl1.rs:34:9 + --> $DIR/impl1.rs:33:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: def-path(bar::::baz) - --> $DIR/impl1.rs:41:9 + --> $DIR/impl1.rs:40:9 | LL | #[rustc_def_path] | ^^^^^^^^^^^^^^^^^ -error: symbol-name(_RNvXNCNvCs4fqI2P2rA04_5impl14mains_0ARDNtB6_3Foop5AssocFG_KCRL0_hvEuNtB6_9AutoTraitEL_j3_NtB2_3Bar6method) - --> $DIR/impl1.rs:64:13 +error: symbol-name(_RNvXNCNvCs21hi0yVfW1J_5impl14mains_0ARDNtB6_3Foop5AssocFG_KCRL0_hvEuNtB6_9AutoTraitEL_j3_NtB2_3Bar6method) + --> $DIR/impl1.rs:63:13 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling(<[&dyn impl1[317d481089b8c8fe]::Foo extern "C" fn(&'a u8, ...)> + impl1[317d481089b8c8fe]::AutoTrait; 3: usize] as impl1[317d481089b8c8fe]::main::{closure#1}::Bar>::method) - --> $DIR/impl1.rs:64:13 +error: demangling(<[&dyn impl1[17891616a171812d]::Foo extern "C" fn(&'a u8, ...)> + impl1[17891616a171812d]::AutoTrait; 3: usize] as impl1[17891616a171812d]::main::{closure#1}::Bar>::method) + --> $DIR/impl1.rs:63:13 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt(<[&dyn impl1::Foo extern "C" fn(&'a u8, ...)> + impl1::AutoTrait; 3] as impl1::main::{closure#1}::Bar>::method) - --> $DIR/impl1.rs:64:13 + --> $DIR/impl1.rs:63:13 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: def-path(<[&dyn Foo extern "C" fn(&'r u8, ...)> + AutoTrait; 3] as main::{closure#1}::Bar>::method) - --> $DIR/impl1.rs:71:13 + --> $DIR/impl1.rs:70:13 | 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 f569905279..9575875f5a 100644 --- a/src/test/ui/symbol-names/issue-60925.legacy.stderr +++ b/src/test/ui/symbol-names/issue-60925.legacy.stderr @@ -1,10 +1,10 @@ -error: symbol-name(_ZN11issue_609253foo37Foo$LT$issue_60925..llv$u6d$..Foo$GT$3foo17h79d9aaa05f4b26d6E) +error: symbol-name(_ZN11issue_609253foo37Foo$LT$issue_60925..llv$u6d$..Foo$GT$3foo17hb8ca3eb2682b1b51E) --> $DIR/issue-60925.rs:22:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling(issue_60925::foo::Foo::foo::h79d9aaa05f4b26d6) +error: demangling(issue_60925::foo::Foo::foo::hb8ca3eb2682b1b51) --> $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 55b7041935..47c9230c0e 100644 --- a/src/test/ui/symbol-names/issue-60925.rs +++ b/src/test/ui/symbol-names/issue-60925.rs @@ -23,8 +23,8 @@ mod foo { //[legacy]~^ ERROR symbol-name(_ZN11issue_609253foo37Foo$LT$issue_60925..llv$u6d$..Foo$GT$3foo //[legacy]~| ERROR demangling(issue_60925::foo::Foo::foo //[legacy]~| ERROR demangling-alt(issue_60925::foo::Foo::foo) - //[v0]~^^^^ ERROR symbol-name(_RNvMNtCs4fqI2P2rA04_11issue_609253fooINtB2_3FooNtNtB4_4llvm3FooE3foo) - //[v0]~| ERROR demangling(>::foo) + //[v0]~^^^^ ERROR symbol-name(_RNvMNtCs21hi0yVfW1J_11issue_609253fooINtB2_3FooNtNtB4_4llvm3FooE3foo) + //[v0]~| ERROR demangling(>::foo) //[v0]~| ERROR demangling-alt(>::foo) pub(crate) fn foo() { for _ in 0..0 { diff --git a/src/test/ui/symbol-names/issue-60925.v0.stderr b/src/test/ui/symbol-names/issue-60925.v0.stderr index 78594b88b4..aed60a58af 100644 --- a/src/test/ui/symbol-names/issue-60925.v0.stderr +++ b/src/test/ui/symbol-names/issue-60925.v0.stderr @@ -1,10 +1,10 @@ -error: symbol-name(_RNvMNtCs4fqI2P2rA04_11issue_609253fooINtB2_3FooNtNtB4_4llvm3FooE3foo) +error: symbol-name(_RNvMNtCs21hi0yVfW1J_11issue_609253fooINtB2_3FooNtNtB4_4llvm3FooE3foo) --> $DIR/issue-60925.rs:22:9 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling(>::foo) +error: demangling(>::foo) --> $DIR/issue-60925.rs:22:9 | LL | #[rustc_symbol_name] diff --git a/src/test/ui/symbol-names/issue-75326.legacy.stderr b/src/test/ui/symbol-names/issue-75326.legacy.stderr index 5f822f6660..2ad16bdb81 100644 --- a/src/test/ui/symbol-names/issue-75326.legacy.stderr +++ b/src/test/ui/symbol-names/issue-75326.legacy.stderr @@ -1,17 +1,17 @@ error: symbol-name(_ZN72_$LT$issue_75326..Foo$LT$I$C$E$GT$$u20$as$u20$issue_75326..Iterator2$GT$4next17SYMBOL_HASH) - --> $DIR/issue-75326.rs:43:5 + --> $DIR/issue-75326.rs:42:5 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling( as issue_75326::Iterator2>::next::SYMBOL_HASH) - --> $DIR/issue-75326.rs:43:5 + --> $DIR/issue-75326.rs:42:5 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt( as issue_75326::Iterator2>::next) - --> $DIR/issue-75326.rs:43:5 + --> $DIR/issue-75326.rs:42:5 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/symbol-names/issue-75326.rs b/src/test/ui/symbol-names/issue-75326.rs index ce315164ce..faf36715b1 100644 --- a/src/test/ui/symbol-names/issue-75326.rs +++ b/src/test/ui/symbol-names/issue-75326.rs @@ -3,8 +3,7 @@ // revisions: legacy v0 //[legacy]compile-flags: -Z symbol-mangling-version=legacy //[v0]compile-flags: -Z symbol-mangling-version=v0 -//[legacy]normalize-stderr-32bit: "h[\d\w]+" -> "SYMBOL_HASH" -//[legacy]normalize-stderr-64bit: "h[\d\w]+" -> "SYMBOL_HASH" +//[legacy]normalize-stderr-test: "h[\w{16}]+" -> "SYMBOL_HASH" #![feature(rustc_attrs)] @@ -44,8 +43,8 @@ where //[legacy]~^ ERROR symbol-name(_ZN72_$LT$issue_75326..Foo$LT$I$C$E$GT$$u20$as$u20$issue_75326..Iterator2$GT$4next //[legacy]~| ERROR demangling( as issue_75326::Iterator2>::next //[legacy]~| ERROR demangling-alt( as issue_75326::Iterator2>::next) - //[v0]~^^^^ ERROR symbol-name(_RNvXINICs4fqI2P2rA04_11issue_75326s_0pppEINtB5_3FooppENtB5_9Iterator24nextB5_) - //[v0]~| ERROR demangling( as issue_75326[317d481089b8c8fe]::Iterator2>::next) + //[v0]~^^^^ ERROR symbol-name(_RNvXINICs21hi0yVfW1J_11issue_75326s_0pppEINtB5_3FooppENtB5_9Iterator24nextB5_) + //[v0]~| ERROR demangling( as issue_75326[17891616a171812d]::Iterator2>::next) //[v0]~| ERROR demangling-alt( as issue_75326::Iterator2>::next) fn next(&mut self) -> Option { self.find(|_| true) diff --git a/src/test/ui/symbol-names/issue-75326.v0.stderr b/src/test/ui/symbol-names/issue-75326.v0.stderr index 59bdfa8ca3..1f57952acd 100644 --- a/src/test/ui/symbol-names/issue-75326.v0.stderr +++ b/src/test/ui/symbol-names/issue-75326.v0.stderr @@ -1,17 +1,17 @@ -error: symbol-name(_RNvXINICs4fqI2P2rA04_11issue_75326s_0pppEINtB5_3FooppENtB5_9Iterator24nextB5_) - --> $DIR/issue-75326.rs:43:5 +error: symbol-name(_RNvXINICs21hi0yVfW1J_11issue_75326s_0pppEINtB5_3FooppENtB5_9Iterator24nextB5_) + --> $DIR/issue-75326.rs:42:5 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ -error: demangling( as issue_75326[317d481089b8c8fe]::Iterator2>::next) - --> $DIR/issue-75326.rs:43:5 +error: demangling( as issue_75326[17891616a171812d]::Iterator2>::next) + --> $DIR/issue-75326.rs:42:5 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ error: demangling-alt( as issue_75326::Iterator2>::next) - --> $DIR/issue-75326.rs:43:5 + --> $DIR/issue-75326.rs:42:5 | LL | #[rustc_symbol_name] | ^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/test-attrs/test-filter-multiple.rs b/src/test/ui/test-attrs/test-filter-multiple.rs new file mode 100644 index 0000000000..04dd83b7fd --- /dev/null +++ b/src/test/ui/test-attrs/test-filter-multiple.rs @@ -0,0 +1,17 @@ +// run-pass +// compile-flags: --test +// run-flags: --test-threads=1 test1 test2 +// check-run-results +// normalize-stdout-test "finished in \d+\.\d+s" -> "finished in $$TIME" +// ignore-emscripten no threads support + +#[test] +fn test1() {} + +#[test] +fn test2() {} + +#[test] +fn test3() { + panic!("this should not run"); +} diff --git a/src/test/ui/test-attrs/test-filter-multiple.run.stdout b/src/test/ui/test-attrs/test-filter-multiple.run.stdout new file mode 100644 index 0000000000..1aa684ed50 --- /dev/null +++ b/src/test/ui/test-attrs/test-filter-multiple.run.stdout @@ -0,0 +1,7 @@ + +running 2 tests +test test1 ... ok +test test2 ... ok + +test result: ok. 2 passed; 0 failed; 0 ignored; 0 measured; 1 filtered out; finished in $TIME + diff --git a/src/test/ui/tool_lints.rs b/src/test/ui/tool_lints.rs index 9c8540eede..9e4aa7a939 100644 --- a/src/test/ui/tool_lints.rs +++ b/src/test/ui/tool_lints.rs @@ -1,5 +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` +//~^ ERROR unknown tool name `foo` found in scoped lint: `foo::bar` +//~| ERROR unknown tool name `foo` found in scoped lint: `foo::bar` +//~| ERROR unknown tool name `foo` 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 1bcd7fd735..e06f6ddc1c 100644 --- a/src/test/ui/tool_lints.stderr +++ b/src/test/ui/tool_lints.stderr @@ -1,20 +1,26 @@ -error[E0710]: an unknown tool name found in scoped lint: `foo::bar` +error[E0710]: unknown tool name `foo` found in scoped lint: `foo::bar` --> $DIR/tool_lints.rs:1:8 | LL | #[warn(foo::bar)] | ^^^ + | + = help: add `#![register_tool(foo)]` to the crate root -error[E0710]: an unknown tool name found in scoped lint: `foo::bar` +error[E0710]: unknown tool name `foo` found in scoped lint: `foo::bar` --> $DIR/tool_lints.rs:1:8 | LL | #[warn(foo::bar)] | ^^^ + | + = help: add `#![register_tool(foo)]` to the crate root -error[E0710]: an unknown tool name found in scoped lint: `foo::bar` +error[E0710]: unknown tool name `foo` found in scoped lint: `foo::bar` --> $DIR/tool_lints.rs:1:8 | LL | #[warn(foo::bar)] | ^^^ + | + = help: add `#![register_tool(foo)]` to the crate root error: aborting due to 3 previous errors diff --git a/src/test/ui/traits/trait-alias-ambiguous.rs b/src/test/ui/traits/alias/ambiguous.rs similarity index 100% rename from src/test/ui/traits/trait-alias-ambiguous.rs rename to src/test/ui/traits/alias/ambiguous.rs diff --git a/src/test/ui/traits/trait-alias-ambiguous.stderr b/src/test/ui/traits/alias/ambiguous.stderr similarity index 85% rename from src/test/ui/traits/trait-alias-ambiguous.stderr rename to src/test/ui/traits/alias/ambiguous.stderr index f692e92d86..649ce72604 100644 --- a/src/test/ui/traits/trait-alias-ambiguous.stderr +++ b/src/test/ui/traits/alias/ambiguous.stderr @@ -1,16 +1,16 @@ error[E0034]: multiple applicable items in scope - --> $DIR/trait-alias-ambiguous.rs:21:7 + --> $DIR/ambiguous.rs:21:7 | LL | t.foo(); | ^^^ multiple `foo` found | note: candidate #1 is defined in an impl of the trait `A` for the type `u8` - --> $DIR/trait-alias-ambiguous.rs:8:9 + --> $DIR/ambiguous.rs:8:9 | LL | fn foo(&self) {} | ^^^^^^^^^^^^^ note: candidate #2 is defined in an impl of the trait `B` for the type `u8` - --> $DIR/trait-alias-ambiguous.rs:11:9 + --> $DIR/ambiguous.rs:11:9 | LL | fn foo(&self) {} | ^^^^^^^^^^^^^ diff --git a/src/test/ui/traits/auxiliary/trait_alias.rs b/src/test/ui/traits/alias/auxiliary/greeter.rs similarity index 100% rename from src/test/ui/traits/auxiliary/trait_alias.rs rename to src/test/ui/traits/alias/auxiliary/greeter.rs diff --git a/src/test/ui/traits/trait-alias/auxiliary/trait_alias.rs b/src/test/ui/traits/alias/auxiliary/send_sync.rs similarity index 100% rename from src/test/ui/traits/trait-alias/auxiliary/trait_alias.rs rename to src/test/ui/traits/alias/auxiliary/send_sync.rs diff --git a/src/test/ui/traits/trait-alias/trait-alias.rs b/src/test/ui/traits/alias/basic.rs similarity index 100% rename from src/test/ui/traits/trait-alias/trait-alias.rs rename to src/test/ui/traits/alias/basic.rs diff --git a/src/test/ui/traits/trait-alias/trait-alias-bounds.rs b/src/test/ui/traits/alias/bounds.rs similarity index 100% rename from src/test/ui/traits/trait-alias/trait-alias-bounds.rs rename to src/test/ui/traits/alias/bounds.rs diff --git a/src/test/ui/traits/trait-alias/trait-alias-cross-crate.rs b/src/test/ui/traits/alias/cross-crate.rs similarity index 78% rename from src/test/ui/traits/trait-alias/trait-alias-cross-crate.rs rename to src/test/ui/traits/alias/cross-crate.rs index 14edfdd7a3..8919c64340 100644 --- a/src/test/ui/traits/trait-alias/trait-alias-cross-crate.rs +++ b/src/test/ui/traits/alias/cross-crate.rs @@ -1,11 +1,11 @@ -// aux-build:trait_alias.rs +// aux-build:send_sync.rs #![feature(trait_alias)] -extern crate trait_alias; +extern crate send_sync; use std::rc::Rc; -use trait_alias::SendSync; +use send_sync::SendSync; fn use_alias() {} diff --git a/src/test/ui/traits/trait-alias/trait-alias-cross-crate.stderr b/src/test/ui/traits/alias/cross-crate.stderr similarity index 90% rename from src/test/ui/traits/trait-alias/trait-alias-cross-crate.stderr rename to src/test/ui/traits/alias/cross-crate.stderr index 60a4a46a05..3b8fee8e8d 100644 --- a/src/test/ui/traits/trait-alias/trait-alias-cross-crate.stderr +++ b/src/test/ui/traits/alias/cross-crate.stderr @@ -1,5 +1,5 @@ error[E0277]: `Rc` cannot be sent between threads safely - --> $DIR/trait-alias-cross-crate.rs:14:17 + --> $DIR/cross-crate.rs:14:17 | LL | fn use_alias() {} | -------- required by this bound in `use_alias` @@ -10,7 +10,7 @@ LL | use_alias::>(); = help: the trait `Send` is not implemented for `Rc` error[E0277]: `Rc` cannot be shared between threads safely - --> $DIR/trait-alias-cross-crate.rs:14:17 + --> $DIR/cross-crate.rs:14:17 | LL | fn use_alias() {} | -------- required by this bound in `use_alias` diff --git a/src/test/ui/traits/trait-alias/trait-alias-impl.rs b/src/test/ui/traits/alias/impl.rs similarity index 100% rename from src/test/ui/traits/trait-alias/trait-alias-impl.rs rename to src/test/ui/traits/alias/impl.rs diff --git a/src/test/ui/traits/trait-alias/trait-alias-impl.stderr b/src/test/ui/traits/alias/impl.stderr similarity index 87% rename from src/test/ui/traits/trait-alias/trait-alias-impl.stderr rename to src/test/ui/traits/alias/impl.stderr index 301db4fb71..cedcd10213 100644 --- a/src/test/ui/traits/trait-alias/trait-alias-impl.stderr +++ b/src/test/ui/traits/alias/impl.stderr @@ -1,5 +1,5 @@ error[E0404]: expected trait, found trait alias `DefaultAlias` - --> $DIR/trait-alias-impl.rs:5:6 + --> $DIR/impl.rs:5:6 | LL | impl DefaultAlias for () {} | ^^^^^^^^^^^^ not a trait diff --git a/src/test/ui/traits/trait-alias-import-cross-crate.rs b/src/test/ui/traits/alias/import-cross-crate.rs similarity index 66% rename from src/test/ui/traits/trait-alias-import-cross-crate.rs rename to src/test/ui/traits/alias/import-cross-crate.rs index 975542ab49..868585cd09 100644 --- a/src/test/ui/traits/trait-alias-import-cross-crate.rs +++ b/src/test/ui/traits/alias/import-cross-crate.rs @@ -1,12 +1,12 @@ // run-pass -// aux-build:trait_alias.rs +// aux-build:greeter.rs #![feature(trait_alias)] -extern crate trait_alias; +extern crate greeter; // Import only the alias, not the real trait. -use trait_alias::{Greet, Hi}; +use greeter::{Greet, Hi}; fn main() { let hi = Hi; diff --git a/src/test/ui/traits/trait-alias-import.rs b/src/test/ui/traits/alias/import.rs similarity index 100% rename from src/test/ui/traits/trait-alias-import.rs rename to src/test/ui/traits/alias/import.rs diff --git a/src/test/ui/traits/trait-alias/issue-60021-assoc-method-resolve.rs b/src/test/ui/traits/alias/issue-60021-assoc-method-resolve.rs similarity index 100% rename from src/test/ui/traits/trait-alias/issue-60021-assoc-method-resolve.rs rename to src/test/ui/traits/alias/issue-60021-assoc-method-resolve.rs diff --git a/src/test/ui/traits/trait-alias/issue-72415-assoc-const-resolve.rs b/src/test/ui/traits/alias/issue-72415-assoc-const-resolve.rs similarity index 100% rename from src/test/ui/traits/trait-alias/issue-72415-assoc-const-resolve.rs rename to src/test/ui/traits/alias/issue-72415-assoc-const-resolve.rs diff --git a/src/test/ui/traits/trait-alias/issue-75983.rs b/src/test/ui/traits/alias/issue-75983.rs similarity index 100% rename from src/test/ui/traits/trait-alias/issue-75983.rs rename to src/test/ui/traits/alias/issue-75983.rs diff --git a/src/test/ui/traits/trait-alias/trait-alias-maybe-bound.rs b/src/test/ui/traits/alias/maybe-bound.rs similarity index 100% rename from src/test/ui/traits/trait-alias/trait-alias-maybe-bound.rs rename to src/test/ui/traits/alias/maybe-bound.rs diff --git a/src/test/ui/traits/trait-alias/trait-alias-no-duplicates.rs b/src/test/ui/traits/alias/no-duplicates.rs similarity index 100% rename from src/test/ui/traits/trait-alias/trait-alias-no-duplicates.rs rename to src/test/ui/traits/alias/no-duplicates.rs diff --git a/src/test/ui/traits/trait-alias/trait-alias-no-duplicates.stderr b/src/test/ui/traits/alias/no-duplicates.stderr similarity index 95% rename from src/test/ui/traits/trait-alias/trait-alias-no-duplicates.stderr rename to src/test/ui/traits/alias/no-duplicates.stderr index b297d54375..9f38dd40c3 100644 --- a/src/test/ui/traits/trait-alias/trait-alias-no-duplicates.stderr +++ b/src/test/ui/traits/alias/no-duplicates.stderr @@ -1,5 +1,5 @@ error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:16:22 + --> $DIR/no-duplicates.rs:16:22 | LL | trait _0 = Obj; | --- @@ -16,7 +16,7 @@ LL | type _T00 = dyn _0 + _0; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:19:22 + --> $DIR/no-duplicates.rs:19:22 | LL | trait _0 = Obj; | --- @@ -35,7 +35,7 @@ LL | type _T01 = dyn _1 + _0; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:22:22 + --> $DIR/no-duplicates.rs:22:22 | LL | trait _0 = Obj; | --- @@ -57,7 +57,7 @@ LL | type _T02 = dyn _1 + _1; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:25:23 + --> $DIR/no-duplicates.rs:25:23 | LL | trait _0 = Obj; | --- additional non-auto trait @@ -73,7 +73,7 @@ LL | type _T03 = dyn Obj + _1; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:28:22 + --> $DIR/no-duplicates.rs:28:22 | LL | trait _0 = Obj; | --- first non-auto trait @@ -89,7 +89,7 @@ LL | type _T04 = dyn _1 + Obj; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:37:17 + --> $DIR/no-duplicates.rs:37:17 | LL | trait _0 = Obj; | --- @@ -114,7 +114,7 @@ LL | type _T10 = dyn _2 + _3; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:40:22 + --> $DIR/no-duplicates.rs:40:22 | LL | trait _0 = Obj; | --- additional non-auto trait @@ -133,7 +133,7 @@ LL | type _T11 = dyn _3 + _2; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:43:23 + --> $DIR/no-duplicates.rs:43:23 | LL | trait _0 = Obj; | --- additional non-auto trait @@ -150,7 +150,7 @@ LL | type _T12 = dyn Obj + _2; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:46:17 + --> $DIR/no-duplicates.rs:46:17 | LL | trait _0 = Obj; | --- @@ -175,7 +175,7 @@ LL | type _T13 = dyn _2 + Obj; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:49:22 + --> $DIR/no-duplicates.rs:49:22 | LL | trait _0 = Obj; | --- first non-auto trait @@ -194,7 +194,7 @@ LL | type _T14 = dyn _1 + _3; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:52:22 + --> $DIR/no-duplicates.rs:52:22 | LL | trait _0 = Obj; | --- additional non-auto trait @@ -213,7 +213,7 @@ LL | type _T15 = dyn _3 + _1; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:55:22 + --> $DIR/no-duplicates.rs:55:22 | LL | trait _0 = Obj; | --- first non-auto trait @@ -234,7 +234,7 @@ LL | type _T16 = dyn _1 + _4; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:58:22 + --> $DIR/no-duplicates.rs:58:22 | LL | trait _0 = Obj; | --- additional non-auto trait @@ -255,7 +255,7 @@ LL | type _T17 = dyn _4 + _1; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:65:22 + --> $DIR/no-duplicates.rs:65:22 | LL | trait _5 = Obj + Send; | --- @@ -272,7 +272,7 @@ LL | type _T20 = dyn _5 + _5; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:68:23 + --> $DIR/no-duplicates.rs:68:23 | LL | trait _5 = Obj + Send; | --- additional non-auto trait @@ -286,7 +286,7 @@ LL | type _T21 = dyn Obj + _5; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:71:22 + --> $DIR/no-duplicates.rs:71:22 | LL | trait _5 = Obj + Send; | --- first non-auto trait @@ -300,7 +300,7 @@ LL | type _T22 = dyn _5 + Obj; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:74:36 + --> $DIR/no-duplicates.rs:74:36 | LL | trait _5 = Obj + Send; | --- first non-auto trait @@ -314,7 +314,7 @@ LL | type _T23 = dyn _5 + Send + Sync + Obj; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:81:17 + --> $DIR/no-duplicates.rs:81:17 | LL | trait _5 = Obj + Send; | --- @@ -337,7 +337,7 @@ LL | type _T30 = dyn _6; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:84:17 + --> $DIR/no-duplicates.rs:84:17 | LL | trait _5 = Obj + Send; | --- @@ -360,7 +360,7 @@ LL | type _T31 = dyn _6 + Send; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:87:24 + --> $DIR/no-duplicates.rs:87:24 | LL | trait _5 = Obj + Send; | --- @@ -383,7 +383,7 @@ LL | type _T32 = dyn Send + _6; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:95:22 + --> $DIR/no-duplicates.rs:95:22 | LL | trait _5 = Obj + Send; | --- first non-auto trait @@ -402,7 +402,7 @@ LL | type _T40 = dyn _8 + Obj; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:98:23 + --> $DIR/no-duplicates.rs:98:23 | LL | trait _5 = Obj + Send; | --- additional non-auto trait @@ -421,7 +421,7 @@ LL | type _T41 = dyn Obj + _8; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:101:22 + --> $DIR/no-duplicates.rs:101:22 | LL | trait _3 = Obj; | --- additional non-auto trait @@ -445,7 +445,7 @@ LL | type _T42 = dyn _8 + _4; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:104:22 + --> $DIR/no-duplicates.rs:104:22 | LL | trait _3 = Obj; | --- first non-auto trait @@ -469,7 +469,7 @@ LL | type _T43 = dyn _4 + _8; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:107:36 + --> $DIR/no-duplicates.rs:107:36 | LL | trait _3 = Obj; | --- first non-auto trait @@ -493,7 +493,7 @@ LL | type _T44 = dyn _4 + Send + Sync + _8; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:117:22 + --> $DIR/no-duplicates.rs:117:22 | LL | trait _9 = for<'a> ObjL<'a>; | ---------------- first non-auto trait @@ -508,7 +508,7 @@ LL | type _T50 = dyn _9 + _10; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-duplicates.rs:123:23 + --> $DIR/no-duplicates.rs:123:23 | LL | trait _11 = ObjT fn(&'a u8)>; | ------------------------ first non-auto trait diff --git a/src/test/ui/traits/trait-alias/trait-alias-no-extra-traits.rs b/src/test/ui/traits/alias/no-extra-traits.rs similarity index 100% rename from src/test/ui/traits/trait-alias/trait-alias-no-extra-traits.rs rename to src/test/ui/traits/alias/no-extra-traits.rs diff --git a/src/test/ui/traits/trait-alias/trait-alias-no-extra-traits.stderr b/src/test/ui/traits/alias/no-extra-traits.stderr similarity index 95% rename from src/test/ui/traits/trait-alias/trait-alias-no-extra-traits.stderr rename to src/test/ui/traits/alias/no-extra-traits.stderr index 1d7b3fa112..cdb5cd90b8 100644 --- a/src/test/ui/traits/trait-alias/trait-alias-no-extra-traits.stderr +++ b/src/test/ui/traits/alias/no-extra-traits.stderr @@ -1,5 +1,5 @@ error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:16:22 + --> $DIR/no-extra-traits.rs:16:22 | LL | trait _0 = ObjA; | ---- first non-auto trait @@ -13,7 +13,7 @@ LL | type _T00 = dyn _0 + ObjB; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:19:24 + --> $DIR/no-extra-traits.rs:19:24 | LL | trait _0 = ObjA; | ---- additional non-auto trait @@ -27,7 +27,7 @@ LL | type _T01 = dyn ObjB + _0; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:22:24 + --> $DIR/no-extra-traits.rs:22:24 | LL | trait _0 = ObjA; | ---- additional non-auto trait @@ -43,7 +43,7 @@ LL | type _T02 = dyn ObjB + _1; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:25:22 + --> $DIR/no-extra-traits.rs:25:22 | LL | trait _0 = ObjA; | ---- first non-auto trait @@ -59,7 +59,7 @@ LL | type _T03 = dyn _1 + ObjB; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:34:22 + --> $DIR/no-extra-traits.rs:34:22 | LL | trait _2 = ObjB; | ---- @@ -78,7 +78,7 @@ LL | type _T10 = dyn _2 + _3; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:37:22 + --> $DIR/no-extra-traits.rs:37:22 | LL | trait _2 = ObjB; | ---- @@ -97,7 +97,7 @@ LL | type _T11 = dyn _3 + _2; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:40:22 + --> $DIR/no-extra-traits.rs:40:22 | LL | trait _2 = ObjB; | ---- @@ -118,7 +118,7 @@ LL | type _T12 = dyn _2 + _4; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:43:22 + --> $DIR/no-extra-traits.rs:43:22 | LL | trait _2 = ObjB; | ---- @@ -139,7 +139,7 @@ LL | type _T13 = dyn _4 + _2; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:50:22 + --> $DIR/no-extra-traits.rs:50:22 | LL | trait _0 = ObjA; | ---- additional non-auto trait @@ -158,7 +158,7 @@ LL | type _T20 = dyn _5 + _1; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:53:22 + --> $DIR/no-extra-traits.rs:53:22 | LL | trait _0 = ObjA; | ---- first non-auto trait @@ -177,7 +177,7 @@ LL | type _T21 = dyn _1 + _5; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:56:22 + --> $DIR/no-extra-traits.rs:56:22 | LL | trait _5 = Sync + ObjB + Send; | ---- first non-auto trait @@ -191,7 +191,7 @@ LL | type _T22 = dyn _5 + ObjA; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:59:24 + --> $DIR/no-extra-traits.rs:59:24 | LL | trait _5 = Sync + ObjB + Send; | ---- additional non-auto trait @@ -205,7 +205,7 @@ LL | type _T23 = dyn ObjA + _5; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:62:29 + --> $DIR/no-extra-traits.rs:62:29 | LL | trait _0 = ObjA; | ---- additional non-auto trait @@ -224,7 +224,7 @@ LL | type _T24 = dyn Send + _5 + _1 + Sync; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:65:29 + --> $DIR/no-extra-traits.rs:65:29 | LL | trait _0 = ObjA; | ---- first non-auto trait @@ -243,7 +243,7 @@ LL | type _T25 = dyn _1 + Sync + _5 + Send; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:68:36 + --> $DIR/no-extra-traits.rs:68:36 | LL | trait _5 = Sync + ObjB + Send; | ---- first non-auto trait @@ -257,7 +257,7 @@ LL | type _T26 = dyn Sync + Send + _5 + ObjA; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:71:38 + --> $DIR/no-extra-traits.rs:71:38 | LL | trait _5 = Sync + ObjB + Send; | ---- additional non-auto trait @@ -271,7 +271,7 @@ LL | type _T27 = dyn Send + Sync + ObjA + _5; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:80:17 + --> $DIR/no-extra-traits.rs:80:17 | LL | trait _0 = ObjA; | ---- first non-auto trait @@ -296,7 +296,7 @@ LL | type _T30 = dyn _6; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:83:17 + --> $DIR/no-extra-traits.rs:83:17 | LL | trait _0 = ObjA; | ---- first non-auto trait @@ -321,7 +321,7 @@ LL | type _T31 = dyn _6 + Send; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:86:24 + --> $DIR/no-extra-traits.rs:86:24 | LL | trait _0 = ObjA; | ---- first non-auto trait @@ -346,7 +346,7 @@ LL | type _T32 = dyn Send + _6; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:89:17 + --> $DIR/no-extra-traits.rs:89:17 | LL | trait _0 = ObjA; | ---- first non-auto trait @@ -381,7 +381,7 @@ LL | type _T33 = dyn _8; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:92:17 + --> $DIR/no-extra-traits.rs:92:17 | LL | trait _0 = ObjA; | ---- first non-auto trait @@ -416,7 +416,7 @@ LL | type _T34 = dyn _8 + Send; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:95:24 + --> $DIR/no-extra-traits.rs:95:24 | LL | trait _0 = ObjA; | ---- first non-auto trait @@ -451,7 +451,7 @@ LL | type _T35 = dyn Send + _8; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:103:23 + --> $DIR/no-extra-traits.rs:103:23 | LL | trait _5 = Sync + ObjB + Send; | ---- first non-auto trait @@ -470,7 +470,7 @@ LL | type _T40 = dyn _10 + ObjA; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:106:24 + --> $DIR/no-extra-traits.rs:106:24 | LL | trait _5 = Sync + ObjB + Send; | ---- additional non-auto trait @@ -489,7 +489,7 @@ LL | type _T41 = dyn ObjA + _10; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:109:23 + --> $DIR/no-extra-traits.rs:109:23 | LL | trait _0 = ObjA; | ---- additional non-auto trait @@ -513,7 +513,7 @@ LL | type _T42 = dyn _10 + _1; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:112:37 + --> $DIR/no-extra-traits.rs:112:37 | LL | trait _5 = Sync + ObjB + Send; | ---- first non-auto trait @@ -532,7 +532,7 @@ LL | type _T43 = dyn Send + _10 + Sync + ObjA; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:115:24 + --> $DIR/no-extra-traits.rs:115:24 | LL | trait _5 = Sync + ObjB + Send; | ---- additional non-auto trait @@ -551,7 +551,7 @@ LL | type _T44 = dyn ObjA + _10 + Send + Sync; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/trait-alias-no-extra-traits.rs:118:37 + --> $DIR/no-extra-traits.rs:118:37 | LL | trait _0 = ObjA; | ---- additional non-auto trait diff --git a/src/test/ui/traits/trait-alias/trait-alias-object-fail.rs b/src/test/ui/traits/alias/object-fail.rs similarity index 100% rename from src/test/ui/traits/trait-alias/trait-alias-object-fail.rs rename to src/test/ui/traits/alias/object-fail.rs diff --git a/src/test/ui/traits/trait-alias/trait-alias-object-fail.stderr b/src/test/ui/traits/alias/object-fail.stderr similarity index 92% rename from src/test/ui/traits/trait-alias/trait-alias-object-fail.stderr rename to src/test/ui/traits/alias/object-fail.stderr index 1118a75e08..325bc6d280 100644 --- a/src/test/ui/traits/trait-alias/trait-alias-object-fail.stderr +++ b/src/test/ui/traits/alias/object-fail.stderr @@ -1,5 +1,5 @@ error[E0038]: the trait `Eq` cannot be made into an object - --> $DIR/trait-alias-object-fail.rs:7:13 + --> $DIR/object-fail.rs:7:13 | LL | let _: &dyn EqAlias = &123; | ^^^^^^^^^^^ `Eq` cannot be made into an object @@ -11,7 +11,7 @@ LL | pub trait Eq: PartialEq { | ^^^^^^^^^^^^^^^ the trait cannot be made into an object because it uses `Self` as a type parameter error[E0191]: the value of the associated type `Item` (from trait `Iterator`) must be specified - --> $DIR/trait-alias-object-fail.rs:9:17 + --> $DIR/object-fail.rs:9:17 | LL | let _: &dyn IteratorAlias = &vec![123].into_iter(); | ^^^^^^^^^^^^^ help: specify the associated type: `IteratorAlias` diff --git a/src/test/ui/traits/trait-alias/trait-alias-object-wf.rs b/src/test/ui/traits/alias/object-wf.rs similarity index 100% rename from src/test/ui/traits/trait-alias/trait-alias-object-wf.rs rename to src/test/ui/traits/alias/object-wf.rs diff --git a/src/test/ui/traits/trait-alias/trait-alias-object.rs b/src/test/ui/traits/alias/object.rs similarity index 100% rename from src/test/ui/traits/trait-alias/trait-alias-object.rs rename to src/test/ui/traits/alias/object.rs diff --git a/src/test/ui/traits/trait-alias/trait-alias-only-maybe-bound.rs b/src/test/ui/traits/alias/only-maybe-bound.rs similarity index 100% rename from src/test/ui/traits/trait-alias/trait-alias-only-maybe-bound.rs rename to src/test/ui/traits/alias/only-maybe-bound.rs diff --git a/src/test/ui/traits/trait-alias/trait-alias-only-maybe-bound.stderr b/src/test/ui/traits/alias/only-maybe-bound.stderr similarity index 77% rename from src/test/ui/traits/trait-alias/trait-alias-only-maybe-bound.stderr rename to src/test/ui/traits/alias/only-maybe-bound.stderr index 594115d980..99589edb53 100644 --- a/src/test/ui/traits/trait-alias/trait-alias-only-maybe-bound.stderr +++ b/src/test/ui/traits/alias/only-maybe-bound.stderr @@ -1,11 +1,11 @@ error[E0224]: at least one trait is required for an object type - --> $DIR/trait-alias-only-maybe-bound.rs:13:12 + --> $DIR/only-maybe-bound.rs:13:12 | LL | type _T0 = dyn _1; | ^^^^^^ error[E0224]: at least one trait is required for an object type - --> $DIR/trait-alias-only-maybe-bound.rs:19:12 + --> $DIR/only-maybe-bound.rs:19:12 | LL | type _T1 = dyn _2; | ^^^^^^ diff --git a/src/test/ui/traits/trait-alias/trait-alias-syntax-fail.rs b/src/test/ui/traits/alias/syntax-fail.rs similarity index 100% rename from src/test/ui/traits/trait-alias/trait-alias-syntax-fail.rs rename to src/test/ui/traits/alias/syntax-fail.rs diff --git a/src/test/ui/traits/trait-alias/trait-alias-syntax-fail.stderr b/src/test/ui/traits/alias/syntax-fail.stderr similarity index 74% rename from src/test/ui/traits/trait-alias/trait-alias-syntax-fail.stderr rename to src/test/ui/traits/alias/syntax-fail.stderr index 18c22133bc..748b92056d 100644 --- a/src/test/ui/traits/trait-alias/trait-alias-syntax-fail.stderr +++ b/src/test/ui/traits/alias/syntax-fail.stderr @@ -1,23 +1,23 @@ error: trait aliases cannot be `auto` - --> $DIR/trait-alias-syntax-fail.rs:4:1 + --> $DIR/syntax-fail.rs:4:1 | LL | auto trait A = Foo; | ^^^^^^^^^^^^^^^^^^^ trait aliases cannot be `auto` error: trait aliases cannot be `unsafe` - --> $DIR/trait-alias-syntax-fail.rs:5:1 + --> $DIR/syntax-fail.rs:5:1 | LL | unsafe trait B = Foo; | ^^^^^^^^^^^^^^^^^^^^^ trait aliases cannot be `unsafe` error: bounds are not allowed on trait aliases - --> $DIR/trait-alias-syntax-fail.rs:7:8 + --> $DIR/syntax-fail.rs:7:8 | LL | trait C: Ord = Eq; | ^^^^^ error: bounds are not allowed on trait aliases - --> $DIR/trait-alias-syntax-fail.rs:8:8 + --> $DIR/syntax-fail.rs:8:8 | LL | trait D: = Eq; | ^ diff --git a/src/test/ui/traits/trait-alias/trait-alias-syntax.rs b/src/test/ui/traits/alias/syntax.rs similarity index 100% rename from src/test/ui/traits/trait-alias/trait-alias-syntax.rs rename to src/test/ui/traits/alias/syntax.rs diff --git a/src/test/ui/traits/trait-alias/trait-alias-wf.rs b/src/test/ui/traits/alias/wf.rs similarity index 100% rename from src/test/ui/traits/trait-alias/trait-alias-wf.rs rename to src/test/ui/traits/alias/wf.rs diff --git a/src/test/ui/traits/trait-alias/trait-alias-wf.stderr b/src/test/ui/traits/alias/wf.stderr similarity index 92% rename from src/test/ui/traits/trait-alias/trait-alias-wf.stderr rename to src/test/ui/traits/alias/wf.stderr index e0df76381e..b07145f4d3 100644 --- a/src/test/ui/traits/trait-alias/trait-alias-wf.stderr +++ b/src/test/ui/traits/alias/wf.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `T: Foo` is not satisfied - --> $DIR/trait-alias-wf.rs:5:14 + --> $DIR/wf.rs:5:14 | LL | trait A {} | --- required by this bound in `A` diff --git a/src/test/ui/traits/anon-trait-static-method.rs b/src/test/ui/traits/anon-static-method.rs similarity index 100% rename from src/test/ui/traits/anon-trait-static-method.rs rename to src/test/ui/traits/anon-static-method.rs diff --git a/src/test/ui/traits/trait-as-struct-constructor.rs b/src/test/ui/traits/as-struct-constructor.rs similarity index 100% rename from src/test/ui/traits/trait-as-struct-constructor.rs rename to src/test/ui/traits/as-struct-constructor.rs diff --git a/src/test/ui/traits/trait-as-struct-constructor.stderr b/src/test/ui/traits/as-struct-constructor.stderr similarity index 86% rename from src/test/ui/traits/trait-as-struct-constructor.stderr rename to src/test/ui/traits/as-struct-constructor.stderr index e1d54fbf8a..d06e85f3a2 100644 --- a/src/test/ui/traits/trait-as-struct-constructor.stderr +++ b/src/test/ui/traits/as-struct-constructor.stderr @@ -1,5 +1,5 @@ error[E0574]: expected struct, variant or union type, found trait `TraitNotAStruct` - --> $DIR/trait-as-struct-constructor.rs:4:5 + --> $DIR/as-struct-constructor.rs:4:5 | LL | TraitNotAStruct{ value: 0 }; | ^^^^^^^^^^^^^^^ not a struct, variant or union type diff --git a/src/test/ui/traits/traits-assoc-type-in-supertrait-bad.rs b/src/test/ui/traits/assoc-type-in-superbad.rs similarity index 100% rename from src/test/ui/traits/traits-assoc-type-in-supertrait-bad.rs rename to src/test/ui/traits/assoc-type-in-superbad.rs diff --git a/src/test/ui/traits/traits-assoc-type-in-supertrait-bad.stderr b/src/test/ui/traits/assoc-type-in-superbad.stderr similarity index 83% rename from src/test/ui/traits/traits-assoc-type-in-supertrait-bad.stderr rename to src/test/ui/traits/assoc-type-in-superbad.stderr index 5ac7b08e52..cbdb6b96f4 100644 --- a/src/test/ui/traits/traits-assoc-type-in-supertrait-bad.stderr +++ b/src/test/ui/traits/assoc-type-in-superbad.stderr @@ -1,5 +1,5 @@ error[E0271]: type mismatch resolving ` as Iterator>::Item == u32` - --> $DIR/traits-assoc-type-in-supertrait-bad.rs:12:16 + --> $DIR/assoc-type-in-superbad.rs:12:16 | LL | type Key = u32; | ^^^ expected `i32`, found `u32` diff --git a/src/test/ui/traits/traits-assoc-type-in-supertrait.rs b/src/test/ui/traits/assoc-type-in-supertrait.rs similarity index 100% rename from src/test/ui/traits/traits-assoc-type-in-supertrait.rs rename to src/test/ui/traits/assoc-type-in-supertrait.rs diff --git a/src/test/ui/traits/assoc_type_bound_with_struct.rs b/src/test/ui/traits/associated_type_bound/assoc_type_bound_with_struct.rs similarity index 100% rename from src/test/ui/traits/assoc_type_bound_with_struct.rs rename to src/test/ui/traits/associated_type_bound/assoc_type_bound_with_struct.rs diff --git a/src/test/ui/traits/assoc_type_bound_with_struct.stderr b/src/test/ui/traits/associated_type_bound/assoc_type_bound_with_struct.stderr similarity index 100% rename from src/test/ui/traits/assoc_type_bound_with_struct.stderr rename to src/test/ui/traits/associated_type_bound/assoc_type_bound_with_struct.stderr diff --git a/src/test/ui/traits/check-trait-object-bounds-1.rs b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-1.rs similarity index 100% rename from src/test/ui/traits/check-trait-object-bounds-1.rs rename to src/test/ui/traits/associated_type_bound/check-trait-object-bounds-1.rs diff --git a/src/test/ui/traits/check-trait-object-bounds-1.stderr b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-1.stderr similarity index 100% rename from src/test/ui/traits/check-trait-object-bounds-1.stderr rename to src/test/ui/traits/associated_type_bound/check-trait-object-bounds-1.stderr diff --git a/src/test/ui/traits/check-trait-object-bounds-2-ok.rs b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-2-ok.rs similarity index 100% rename from src/test/ui/traits/check-trait-object-bounds-2-ok.rs rename to src/test/ui/traits/associated_type_bound/check-trait-object-bounds-2-ok.rs diff --git a/src/test/ui/traits/check-trait-object-bounds-2.rs b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-2.rs similarity index 100% rename from src/test/ui/traits/check-trait-object-bounds-2.rs rename to src/test/ui/traits/associated_type_bound/check-trait-object-bounds-2.rs diff --git a/src/test/ui/traits/check-trait-object-bounds-2.stderr b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-2.stderr similarity index 100% rename from src/test/ui/traits/check-trait-object-bounds-2.stderr rename to src/test/ui/traits/associated_type_bound/check-trait-object-bounds-2.stderr diff --git a/src/test/ui/traits/check-trait-object-bounds-3.rs b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-3.rs similarity index 100% rename from src/test/ui/traits/check-trait-object-bounds-3.rs rename to src/test/ui/traits/associated_type_bound/check-trait-object-bounds-3.rs diff --git a/src/test/ui/traits/check-trait-object-bounds-3.stderr b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-3.stderr similarity index 100% rename from src/test/ui/traits/check-trait-object-bounds-3.stderr rename to src/test/ui/traits/associated_type_bound/check-trait-object-bounds-3.stderr diff --git a/src/test/ui/traits/check-trait-object-bounds-4.rs b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-4.rs similarity index 100% rename from src/test/ui/traits/check-trait-object-bounds-4.rs rename to src/test/ui/traits/associated_type_bound/check-trait-object-bounds-4.rs diff --git a/src/test/ui/traits/check-trait-object-bounds-4.stderr b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-4.stderr similarity index 100% rename from src/test/ui/traits/check-trait-object-bounds-4.stderr rename to src/test/ui/traits/associated_type_bound/check-trait-object-bounds-4.stderr diff --git a/src/test/ui/traits/check-trait-object-bounds-5.rs b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-5.rs similarity index 100% rename from src/test/ui/traits/check-trait-object-bounds-5.rs rename to src/test/ui/traits/associated_type_bound/check-trait-object-bounds-5.rs diff --git a/src/test/ui/traits/check-trait-object-bounds-5.stderr b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-5.stderr similarity index 100% rename from src/test/ui/traits/check-trait-object-bounds-5.stderr rename to src/test/ui/traits/associated_type_bound/check-trait-object-bounds-5.stderr diff --git a/src/test/ui/traits/check-trait-object-bounds-6.rs b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-6.rs similarity index 100% rename from src/test/ui/traits/check-trait-object-bounds-6.rs rename to src/test/ui/traits/associated_type_bound/check-trait-object-bounds-6.rs diff --git a/src/test/ui/traits/check-trait-object-bounds-6.stderr b/src/test/ui/traits/associated_type_bound/check-trait-object-bounds-6.stderr similarity index 100% rename from src/test/ui/traits/check-trait-object-bounds-6.stderr rename to src/test/ui/traits/associated_type_bound/check-trait-object-bounds-6.stderr diff --git a/src/test/ui/traits/astconv-cycle-between-trait-and-type.rs b/src/test/ui/traits/astconv-cycle-between-and-type.rs similarity index 100% rename from src/test/ui/traits/astconv-cycle-between-trait-and-type.rs rename to src/test/ui/traits/astconv-cycle-between-and-type.rs diff --git a/src/test/ui/traits/auxiliary/crate_a1.rs b/src/test/ui/traits/bound/auxiliary/crate_a1.rs similarity index 100% rename from src/test/ui/traits/auxiliary/crate_a1.rs rename to src/test/ui/traits/bound/auxiliary/crate_a1.rs diff --git a/src/test/ui/traits/auxiliary/crate_a2.rs b/src/test/ui/traits/bound/auxiliary/crate_a2.rs similarity index 100% rename from src/test/ui/traits/auxiliary/crate_a2.rs rename to src/test/ui/traits/bound/auxiliary/crate_a2.rs diff --git a/src/test/ui/traits/auxiliary/trait_bounds_on_structs_and_enums_xc.rs b/src/test/ui/traits/bound/auxiliary/on_structs_and_enums_xc.rs similarity index 100% rename from src/test/ui/traits/auxiliary/trait_bounds_on_structs_and_enums_xc.rs rename to src/test/ui/traits/bound/auxiliary/on_structs_and_enums_xc.rs diff --git a/src/test/ui/traits/trait-bounds-basic.rs b/src/test/ui/traits/bound/basic.rs similarity index 100% rename from src/test/ui/traits/trait-bounds-basic.rs rename to src/test/ui/traits/bound/basic.rs diff --git a/src/test/ui/traits/trait-bounds.rs b/src/test/ui/traits/bound/generic_trait.rs similarity index 100% rename from src/test/ui/traits/trait-bounds.rs rename to src/test/ui/traits/bound/generic_trait.rs diff --git a/src/test/ui/traits/trait-bounds-impl-comparison-duplicates.rs b/src/test/ui/traits/bound/impl-comparison-duplicates.rs similarity index 100% rename from src/test/ui/traits/trait-bounds-impl-comparison-duplicates.rs rename to src/test/ui/traits/bound/impl-comparison-duplicates.rs diff --git a/src/test/ui/traits/trait-bounds-in-arc.rs b/src/test/ui/traits/bound/in-arc.rs similarity index 100% rename from src/test/ui/traits/trait-bounds-in-arc.rs rename to src/test/ui/traits/bound/in-arc.rs diff --git a/src/test/ui/traits/multiple-trait-bounds.rs b/src/test/ui/traits/bound/multiple.rs similarity index 100% rename from src/test/ui/traits/multiple-trait-bounds.rs rename to src/test/ui/traits/bound/multiple.rs diff --git a/src/test/ui/traits/trait-bounds-not-on-bare-trait.rs b/src/test/ui/traits/bound/not-on-bare-trait.rs similarity index 100% rename from src/test/ui/traits/trait-bounds-not-on-bare-trait.rs rename to src/test/ui/traits/bound/not-on-bare-trait.rs diff --git a/src/test/ui/traits/trait-bounds-not-on-bare-trait.stderr b/src/test/ui/traits/bound/not-on-bare-trait.stderr similarity index 89% rename from src/test/ui/traits/trait-bounds-not-on-bare-trait.stderr rename to src/test/ui/traits/bound/not-on-bare-trait.stderr index 48eedc0b0e..e7fc0fa5ec 100644 --- a/src/test/ui/traits/trait-bounds-not-on-bare-trait.stderr +++ b/src/test/ui/traits/bound/not-on-bare-trait.stderr @@ -1,5 +1,5 @@ warning: trait objects without an explicit `dyn` are deprecated - --> $DIR/trait-bounds-not-on-bare-trait.rs:7:12 + --> $DIR/not-on-bare-trait.rs:7:12 | LL | fn foo(_x: Foo + Send) { | ^^^^^^^^^^ help: use `dyn`: `dyn Foo + Send` @@ -7,7 +7,7 @@ LL | fn foo(_x: Foo + Send) { = note: `#[warn(bare_trait_objects)]` on by default error[E0277]: the size for values of type `(dyn Foo + Send + 'static)` cannot be known at compilation time - --> $DIR/trait-bounds-not-on-bare-trait.rs:7:8 + --> $DIR/not-on-bare-trait.rs:7:8 | LL | fn foo(_x: Foo + Send) { | ^^ doesn't have a size known at compile-time diff --git a/src/test/ui/traits/trait-bounds-not-on-struct.rs b/src/test/ui/traits/bound/not-on-struct.rs similarity index 100% rename from src/test/ui/traits/trait-bounds-not-on-struct.rs rename to src/test/ui/traits/bound/not-on-struct.rs diff --git a/src/test/ui/traits/trait-bounds-not-on-struct.stderr b/src/test/ui/traits/bound/not-on-struct.stderr similarity index 86% rename from src/test/ui/traits/trait-bounds-not-on-struct.stderr rename to src/test/ui/traits/bound/not-on-struct.stderr index 0f97e3bdf1..951e974ad2 100644 --- a/src/test/ui/traits/trait-bounds-not-on-struct.stderr +++ b/src/test/ui/traits/bound/not-on-struct.stderr @@ -1,23 +1,23 @@ error[E0226]: only a single explicit lifetime bound is permitted - --> $DIR/trait-bounds-not-on-struct.rs:25:25 + --> $DIR/not-on-struct.rs:25:25 | LL | fn e() -> 'static + A + 'static { | ^^^^^^^ error[E0226]: only a single explicit lifetime bound is permitted - --> $DIR/trait-bounds-not-on-struct.rs:29:53 + --> $DIR/not-on-struct.rs:29:53 | LL | fn f<'a,T,E>(iter: Iterator + 'a>) { | ^^ error[E0404]: expected trait, found struct `Foo` - --> $DIR/trait-bounds-not-on-struct.rs:8:16 + --> $DIR/not-on-struct.rs:8:16 | LL | fn foo(_x: Box) { } | ^^^ not a trait | help: `+` is used to constrain a "trait object" type with lifetimes or auto-traits; structs and enums can't be bound in that way - --> $DIR/trait-bounds-not-on-struct.rs:8:22 + --> $DIR/not-on-struct.rs:8:22 | LL | fn foo(_x: Box) { } | --- ^^^^ ...because of this bound @@ -25,19 +25,19 @@ LL | fn foo(_x: Box) { } | expected this type to be a trait... error[E0404]: expected trait, found struct `Vec` - --> $DIR/trait-bounds-not-on-struct.rs:10:29 + --> $DIR/not-on-struct.rs:10:29 | LL | type TypeAlias = Box>; | ^^^^^^ not a trait error[E0404]: expected trait, found struct `A` - --> $DIR/trait-bounds-not-on-struct.rs:13:11 + --> $DIR/not-on-struct.rs:13:11 | LL | fn a() -> A + 'static { | ^ not a trait | help: `+` is used to constrain a "trait object" type with lifetimes or auto-traits; structs and enums can't be bound in that way - --> $DIR/trait-bounds-not-on-struct.rs:13:15 + --> $DIR/not-on-struct.rs:13:15 | LL | fn a() -> A + 'static { | - ^^^^^^^ ...because of this bound @@ -49,13 +49,13 @@ LL | fn a() -> A { | -- error[E0404]: expected trait, found enum `Result` - --> $DIR/trait-bounds-not-on-struct.rs:16:34 + --> $DIR/not-on-struct.rs:16:34 | LL | fn b<'a,T,E>(iter: Iterator + 'a>) { | ^^^^^^^^^^^ not a trait | help: `+` is used to constrain a "trait object" type with lifetimes or auto-traits; structs and enums can't be bound in that way - --> $DIR/trait-bounds-not-on-struct.rs:16:48 + --> $DIR/not-on-struct.rs:16:48 | LL | fn b<'a,T,E>(iter: Iterator + 'a>) { | ----------- ^^ ...because of this bound @@ -67,13 +67,13 @@ LL | fn b<'a,T,E>(iter: Iterator>) { | -- error[E0404]: expected trait, found struct `A` - --> $DIR/trait-bounds-not-on-struct.rs:19:21 + --> $DIR/not-on-struct.rs:19:21 | LL | fn c() -> 'static + A { | ^ not a trait | help: `+` is used to constrain a "trait object" type with lifetimes or auto-traits; structs and enums can't be bound in that way - --> $DIR/trait-bounds-not-on-struct.rs:19:11 + --> $DIR/not-on-struct.rs:19:11 | LL | fn c() -> 'static + A { | ^^^^^^^ - expected this type to be a trait... @@ -85,13 +85,13 @@ LL | fn c() -> A { | -- error[E0404]: expected trait, found enum `Result` - --> $DIR/trait-bounds-not-on-struct.rs:22:39 + --> $DIR/not-on-struct.rs:22:39 | LL | fn d<'a,T,E>(iter: Iterator>) { | ^^^^^^^^^^^ not a trait | help: `+` is used to constrain a "trait object" type with lifetimes or auto-traits; structs and enums can't be bound in that way - --> $DIR/trait-bounds-not-on-struct.rs:22:34 + --> $DIR/not-on-struct.rs:22:34 | LL | fn d<'a,T,E>(iter: Iterator>) { | ^^ ----------- expected this type to be a trait... @@ -103,13 +103,13 @@ LL | fn d<'a,T,E>(iter: Iterator>) { | -- error[E0404]: expected trait, found struct `A` - --> $DIR/trait-bounds-not-on-struct.rs:25:21 + --> $DIR/not-on-struct.rs:25:21 | LL | fn e() -> 'static + A + 'static { | ^ not a trait | help: `+` is used to constrain a "trait object" type with lifetimes or auto-traits; structs and enums can't be bound in that way - --> $DIR/trait-bounds-not-on-struct.rs:25:11 + --> $DIR/not-on-struct.rs:25:11 | LL | fn e() -> 'static + A + 'static { | ^^^^^^^ - ^^^^^^^ ...because of these bounds @@ -121,13 +121,13 @@ LL | fn e() -> A { | --- error[E0404]: expected trait, found enum `Result` - --> $DIR/trait-bounds-not-on-struct.rs:29:39 + --> $DIR/not-on-struct.rs:29:39 | LL | fn f<'a,T,E>(iter: Iterator + 'a>) { | ^^^^^^^^^^^ not a trait | help: `+` is used to constrain a "trait object" type with lifetimes or auto-traits; structs and enums can't be bound in that way - --> $DIR/trait-bounds-not-on-struct.rs:29:34 + --> $DIR/not-on-struct.rs:29:34 | LL | fn f<'a,T,E>(iter: Iterator + 'a>) { | ^^ ----------- ^^ ...because of these bounds @@ -139,7 +139,7 @@ LL | fn f<'a,T,E>(iter: Iterator>) { | -- -- error[E0404]: expected trait, found struct `Traitor` - --> $DIR/trait-bounds-not-on-struct.rs:35:11 + --> $DIR/not-on-struct.rs:35:11 | LL | trait Trait {} | ----------- similarly named trait `Trait` defined here @@ -147,7 +147,7 @@ LL | fn g() -> Traitor + 'static { | ^^^^^^^ not a trait | help: `+` is used to constrain a "trait object" type with lifetimes or auto-traits; structs and enums can't be bound in that way - --> $DIR/trait-bounds-not-on-struct.rs:35:21 + --> $DIR/not-on-struct.rs:35:21 | LL | fn g() -> Traitor + 'static { | ------- ^^^^^^^ ...because of this bound diff --git a/src/test/ui/traits/trait-bounds-on-structs-and-enums-in-fns.rs b/src/test/ui/traits/bound/on-structs-and-enums-in-fns.rs similarity index 100% rename from src/test/ui/traits/trait-bounds-on-structs-and-enums-in-fns.rs rename to src/test/ui/traits/bound/on-structs-and-enums-in-fns.rs diff --git a/src/test/ui/traits/trait-bounds-on-structs-and-enums-in-fns.stderr b/src/test/ui/traits/bound/on-structs-and-enums-in-fns.stderr similarity index 83% rename from src/test/ui/traits/trait-bounds-on-structs-and-enums-in-fns.stderr rename to src/test/ui/traits/bound/on-structs-and-enums-in-fns.stderr index 6ca8ce0707..346b690d44 100644 --- a/src/test/ui/traits/trait-bounds-on-structs-and-enums-in-fns.stderr +++ b/src/test/ui/traits/bound/on-structs-and-enums-in-fns.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `u32: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums-in-fns.rs:13:15 + --> $DIR/on-structs-and-enums-in-fns.rs:13:15 | LL | struct Foo { | ----- required by this bound in `Foo` @@ -8,7 +8,7 @@ LL | fn explode(x: Foo) {} | ^^^^^^^^ the trait `Trait` is not implemented for `u32` error[E0277]: the trait bound `f32: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums-in-fns.rs:16:14 + --> $DIR/on-structs-and-enums-in-fns.rs:16:14 | LL | enum Bar { | ----- required by this bound in `Bar` diff --git a/src/test/ui/traits/trait-bounds-on-structs-and-enums-in-impls.rs b/src/test/ui/traits/bound/on-structs-and-enums-in-impls.rs similarity index 100% rename from src/test/ui/traits/trait-bounds-on-structs-and-enums-in-impls.rs rename to src/test/ui/traits/bound/on-structs-and-enums-in-impls.rs diff --git a/src/test/ui/traits/trait-bounds-on-structs-and-enums-in-impls.stderr b/src/test/ui/traits/bound/on-structs-and-enums-in-impls.stderr similarity index 85% rename from src/test/ui/traits/trait-bounds-on-structs-and-enums-in-impls.stderr rename to src/test/ui/traits/bound/on-structs-and-enums-in-impls.stderr index 87271e7f1e..47bab6c375 100644 --- a/src/test/ui/traits/trait-bounds-on-structs-and-enums-in-impls.stderr +++ b/src/test/ui/traits/bound/on-structs-and-enums-in-impls.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `u16: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums-in-impls.rs:20:6 + --> $DIR/on-structs-and-enums-in-impls.rs:20:6 | LL | struct Foo { | ----- required by this bound in `Foo` diff --git a/src/test/ui/traits/trait-bounds-on-structs-and-enums-locals.rs b/src/test/ui/traits/bound/on-structs-and-enums-locals.rs similarity index 100% rename from src/test/ui/traits/trait-bounds-on-structs-and-enums-locals.rs rename to src/test/ui/traits/bound/on-structs-and-enums-locals.rs diff --git a/src/test/ui/traits/trait-bounds-on-structs-and-enums-locals.stderr b/src/test/ui/traits/bound/on-structs-and-enums-locals.stderr similarity index 83% rename from src/test/ui/traits/trait-bounds-on-structs-and-enums-locals.stderr rename to src/test/ui/traits/bound/on-structs-and-enums-locals.stderr index df016a7727..967b7320ab 100644 --- a/src/test/ui/traits/trait-bounds-on-structs-and-enums-locals.stderr +++ b/src/test/ui/traits/bound/on-structs-and-enums-locals.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `usize: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums-locals.rs:15:14 + --> $DIR/on-structs-and-enums-locals.rs:15:14 | LL | struct Foo { | ----- required by this bound in `Foo` @@ -8,7 +8,7 @@ LL | let baz: Foo = loop { }; | ^^^^^^^^^^ the trait `Trait` is not implemented for `usize` error[E0277]: the trait bound `{integer}: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums-locals.rs:10:15 + --> $DIR/on-structs-and-enums-locals.rs:10:15 | LL | struct Foo { | ------------------- required by `Foo` diff --git a/src/test/ui/traits/trait-bounds-on-structs-and-enums-rpass.rs b/src/test/ui/traits/bound/on-structs-and-enums-rpass.rs similarity index 100% rename from src/test/ui/traits/trait-bounds-on-structs-and-enums-rpass.rs rename to src/test/ui/traits/bound/on-structs-and-enums-rpass.rs diff --git a/src/test/ui/traits/trait-bounds-on-structs-and-enums-static.rs b/src/test/ui/traits/bound/on-structs-and-enums-static.rs similarity index 100% rename from src/test/ui/traits/trait-bounds-on-structs-and-enums-static.rs rename to src/test/ui/traits/bound/on-structs-and-enums-static.rs diff --git a/src/test/ui/traits/trait-bounds-on-structs-and-enums-static.stderr b/src/test/ui/traits/bound/on-structs-and-enums-static.stderr similarity index 86% rename from src/test/ui/traits/trait-bounds-on-structs-and-enums-static.stderr rename to src/test/ui/traits/bound/on-structs-and-enums-static.stderr index 4b650e78ba..2cf8a623b3 100644 --- a/src/test/ui/traits/trait-bounds-on-structs-and-enums-static.stderr +++ b/src/test/ui/traits/bound/on-structs-and-enums-static.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `usize: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums-static.rs:9:11 + --> $DIR/on-structs-and-enums-static.rs:9:11 | LL | struct Foo { | ----- required by this bound in `Foo` diff --git a/src/test/ui/traits/bound/on-structs-and-enums-xc.rs b/src/test/ui/traits/bound/on-structs-and-enums-xc.rs new file mode 100644 index 0000000000..94316d2404 --- /dev/null +++ b/src/test/ui/traits/bound/on-structs-and-enums-xc.rs @@ -0,0 +1,14 @@ +// aux-build:on_structs_and_enums_xc.rs + +extern crate on_structs_and_enums_xc; + +use on_structs_and_enums_xc::{Bar, Foo, Trait}; + +fn explode(x: Foo) {} +//~^ ERROR E0277 + +fn kaboom(y: Bar) {} +//~^ ERROR E0277 + +fn main() { +} diff --git a/src/test/ui/traits/trait-bounds-on-structs-and-enums-xc.stderr b/src/test/ui/traits/bound/on-structs-and-enums-xc.stderr similarity index 72% rename from src/test/ui/traits/trait-bounds-on-structs-and-enums-xc.stderr rename to src/test/ui/traits/bound/on-structs-and-enums-xc.stderr index 3e8c727dda..0adb20d482 100644 --- a/src/test/ui/traits/trait-bounds-on-structs-and-enums-xc.stderr +++ b/src/test/ui/traits/bound/on-structs-and-enums-xc.stderr @@ -1,21 +1,21 @@ error[E0277]: the trait bound `usize: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums-xc.rs:7:15 + --> $DIR/on-structs-and-enums-xc.rs:7:15 | LL | fn explode(x: Foo) {} | ^^^^^^^^^^ the trait `Trait` is not implemented for `usize` | - ::: $DIR/auxiliary/trait_bounds_on_structs_and_enums_xc.rs:5:18 + ::: $DIR/auxiliary/on_structs_and_enums_xc.rs:5:18 | LL | pub struct Foo { | ----- required by this bound in `Foo` error[E0277]: the trait bound `f32: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums-xc.rs:10:14 + --> $DIR/on-structs-and-enums-xc.rs:10:14 | LL | fn kaboom(y: Bar) {} | ^^^^^^^^ the trait `Trait` is not implemented for `f32` | - ::: $DIR/auxiliary/trait_bounds_on_structs_and_enums_xc.rs:9:16 + ::: $DIR/auxiliary/on_structs_and_enums_xc.rs:9:16 | LL | pub enum Bar { | ----- required by this bound in `Bar` diff --git a/src/test/ui/traits/bound/on-structs-and-enums-xc1.rs b/src/test/ui/traits/bound/on-structs-and-enums-xc1.rs new file mode 100644 index 0000000000..8156868e04 --- /dev/null +++ b/src/test/ui/traits/bound/on-structs-and-enums-xc1.rs @@ -0,0 +1,15 @@ +// aux-build:on_structs_and_enums_xc.rs + +extern crate on_structs_and_enums_xc; + +use on_structs_and_enums_xc::{Bar, Foo, Trait}; + +fn main() { + let foo = Foo { + //~^ ERROR E0277 + x: 3 + }; + let bar: Bar = return; + //~^ ERROR E0277 + let _ = bar; +} diff --git a/src/test/ui/traits/trait-bounds-on-structs-and-enums-xc1.stderr b/src/test/ui/traits/bound/on-structs-and-enums-xc1.stderr similarity index 76% rename from src/test/ui/traits/trait-bounds-on-structs-and-enums-xc1.stderr rename to src/test/ui/traits/bound/on-structs-and-enums-xc1.stderr index 899e994199..08f0f20e74 100644 --- a/src/test/ui/traits/trait-bounds-on-structs-and-enums-xc1.stderr +++ b/src/test/ui/traits/bound/on-structs-and-enums-xc1.stderr @@ -1,16 +1,16 @@ error[E0277]: the trait bound `f64: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums-xc1.rs:12:14 + --> $DIR/on-structs-and-enums-xc1.rs:12:14 | LL | let bar: Bar = return; | ^^^^^^^^ the trait `Trait` is not implemented for `f64` | - ::: $DIR/auxiliary/trait_bounds_on_structs_and_enums_xc.rs:9:16 + ::: $DIR/auxiliary/on_structs_and_enums_xc.rs:9:16 | LL | pub enum Bar { | ----- required by this bound in `Bar` error[E0277]: the trait bound `{integer}: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums-xc1.rs:8:15 + --> $DIR/on-structs-and-enums-xc1.rs:8:15 | LL | let foo = Foo { | ^^^ the trait `Trait` is not implemented for `{integer}` diff --git a/src/test/ui/traits/trait-bounds-on-structs-and-enums.rs b/src/test/ui/traits/bound/on-structs-and-enums.rs similarity index 100% rename from src/test/ui/traits/trait-bounds-on-structs-and-enums.rs rename to src/test/ui/traits/bound/on-structs-and-enums.rs diff --git a/src/test/ui/traits/trait-bounds-on-structs-and-enums.stderr b/src/test/ui/traits/bound/on-structs-and-enums.stderr similarity index 85% rename from src/test/ui/traits/trait-bounds-on-structs-and-enums.stderr rename to src/test/ui/traits/bound/on-structs-and-enums.stderr index d7549835a0..0c69e7b6fe 100644 --- a/src/test/ui/traits/trait-bounds-on-structs-and-enums.stderr +++ b/src/test/ui/traits/bound/on-structs-and-enums.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `T: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums.rs:13:9 + --> $DIR/on-structs-and-enums.rs:13:9 | LL | struct Foo { | ----- required by this bound in `Foo` @@ -13,7 +13,7 @@ LL | impl Foo { | ^^^^^^^ error[E0277]: the trait bound `isize: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums.rs:19:8 + --> $DIR/on-structs-and-enums.rs:19:8 | LL | struct Foo { | ----- required by this bound in `Foo` @@ -22,7 +22,7 @@ LL | a: Foo, | ^^^^^^^^^^ the trait `Trait` is not implemented for `isize` error[E0277]: the trait bound `usize: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums.rs:23:10 + --> $DIR/on-structs-and-enums.rs:23:10 | LL | enum Bar { | ----- required by this bound in `Bar` @@ -31,7 +31,7 @@ LL | Quux(Bar), | ^^^^^^^^^^ the trait `Trait` is not implemented for `usize` error[E0277]: the trait bound `U: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums.rs:27:8 + --> $DIR/on-structs-and-enums.rs:27:8 | LL | struct Foo { | ----- required by this bound in `Foo` @@ -45,7 +45,7 @@ LL | struct Badness { | ^^^^^^^ error[E0277]: the trait bound `V: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums.rs:31:21 + --> $DIR/on-structs-and-enums.rs:31:21 | LL | enum Bar { | ----- required by this bound in `Bar` @@ -59,7 +59,7 @@ LL | enum MoreBadness { | ^^^^^^^ error[E0277]: the trait bound `i32: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums.rs:35:5 + --> $DIR/on-structs-and-enums.rs:35:5 | LL | struct Foo { | ----- required by this bound in `Foo` @@ -68,7 +68,7 @@ LL | Foo, | ^^^^^^^^ the trait `Trait` is not implemented for `i32` error[E0277]: the trait bound `u8: Trait` is not satisfied - --> $DIR/trait-bounds-on-structs-and-enums.rs:39:29 + --> $DIR/on-structs-and-enums.rs:39:29 | LL | enum Bar { | ----- required by this bound in `Bar` diff --git a/src/test/ui/traits/trait-bounds-recursion.rs b/src/test/ui/traits/bound/recursion.rs similarity index 100% rename from src/test/ui/traits/trait-bounds-recursion.rs rename to src/test/ui/traits/bound/recursion.rs diff --git a/src/test/ui/traits/trait-bounds-same-crate-name.rs b/src/test/ui/traits/bound/same-crate-name.rs similarity index 100% rename from src/test/ui/traits/trait-bounds-same-crate-name.rs rename to src/test/ui/traits/bound/same-crate-name.rs diff --git a/src/test/ui/traits/trait-bounds-same-crate-name.stderr b/src/test/ui/traits/bound/same-crate-name.stderr similarity index 92% rename from src/test/ui/traits/trait-bounds-same-crate-name.stderr rename to src/test/ui/traits/bound/same-crate-name.stderr index af5ba8808f..c48f2f0efc 100644 --- a/src/test/ui/traits/trait-bounds-same-crate-name.stderr +++ b/src/test/ui/traits/bound/same-crate-name.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Foo: main::a::Bar` is not satisfied - --> $DIR/trait-bounds-same-crate-name.rs:31:20 + --> $DIR/same-crate-name.rs:31:20 | LL | a::try_foo(foo); | ^^^ the trait `main::a::Bar` is not implemented for `Foo` @@ -17,7 +17,7 @@ LL | impl Bar for Foo {} = note: perhaps two different versions of crate `crate_a2` are being used? error[E0277]: the trait bound `DoesNotImplementTrait: main::a::Bar` is not satisfied - --> $DIR/trait-bounds-same-crate-name.rs:38:20 + --> $DIR/same-crate-name.rs:38:20 | LL | a::try_foo(implements_no_traits); | ^^^^^^^^^^^^^^^^^^^^ the trait `main::a::Bar` is not implemented for `DoesNotImplementTrait` @@ -28,7 +28,7 @@ LL | pub fn try_foo(x: impl Bar) {} | --- required by this bound in `try_foo` error[E0277]: the trait bound `ImplementsWrongTraitConditionally: main::a::Bar` is not satisfied - --> $DIR/trait-bounds-same-crate-name.rs:45:20 + --> $DIR/same-crate-name.rs:45:20 | LL | a::try_foo(other_variant_implements_mismatched_trait); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `main::a::Bar` is not implemented for `ImplementsWrongTraitConditionally` @@ -46,7 +46,7 @@ LL | impl Bar for ImplementsWrongTraitConditionally {} = note: perhaps two different versions of crate `crate_a2` are being used? error[E0277]: the trait bound `ImplementsTraitForUsize: main::a::Bar` is not satisfied - --> $DIR/trait-bounds-same-crate-name.rs:51:20 + --> $DIR/same-crate-name.rs:51:20 | LL | a::try_foo(other_variant_implements_correct_trait); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `main::a::Bar` is not implemented for `ImplementsTraitForUsize` diff --git a/src/test/ui/traits/trait-bounds-sugar.rs b/src/test/ui/traits/bound/sugar.rs similarity index 100% rename from src/test/ui/traits/trait-bounds-sugar.rs rename to src/test/ui/traits/bound/sugar.rs diff --git a/src/test/ui/traits/trait-bounds-sugar.stderr b/src/test/ui/traits/bound/sugar.stderr similarity index 90% rename from src/test/ui/traits/trait-bounds-sugar.stderr rename to src/test/ui/traits/bound/sugar.stderr index 6bd335fe47..feb0c73a09 100644 --- a/src/test/ui/traits/trait-bounds-sugar.stderr +++ b/src/test/ui/traits/bound/sugar.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/trait-bounds-sugar.rs:12:7 + --> $DIR/sugar.rs:12:7 | LL | a(x); | ^ expected trait `Foo + Send`, found trait `Foo + Sync` diff --git a/src/test/ui/traits/trait-cache-issue-18209.rs b/src/test/ui/traits/cache-issue-18209.rs similarity index 100% rename from src/test/ui/traits/trait-cache-issue-18209.rs rename to src/test/ui/traits/cache-issue-18209.rs diff --git a/src/test/ui/traits/trait-coercion-generic-bad.rs b/src/test/ui/traits/coercion-generic-bad.rs similarity index 100% rename from src/test/ui/traits/trait-coercion-generic-bad.rs rename to src/test/ui/traits/coercion-generic-bad.rs diff --git a/src/test/ui/traits/trait-coercion-generic-bad.stderr b/src/test/ui/traits/coercion-generic-bad.stderr similarity index 92% rename from src/test/ui/traits/trait-coercion-generic-bad.stderr rename to src/test/ui/traits/coercion-generic-bad.stderr index f2710dea09..f367d396da 100644 --- a/src/test/ui/traits/trait-coercion-generic-bad.stderr +++ b/src/test/ui/traits/coercion-generic-bad.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Struct: Trait` is not satisfied - --> $DIR/trait-coercion-generic-bad.rs:16:36 + --> $DIR/coercion-generic-bad.rs:16:36 | LL | let s: Box> = Box::new(Struct { person: "Fred" }); | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `Trait` is not implemented for `Struct` diff --git a/src/test/ui/traits/trait-coercion-generic-regions.rs b/src/test/ui/traits/coercion-generic-regions.rs similarity index 100% rename from src/test/ui/traits/trait-coercion-generic-regions.rs rename to src/test/ui/traits/coercion-generic-regions.rs diff --git a/src/test/ui/traits/trait-coercion-generic-regions.stderr b/src/test/ui/traits/coercion-generic-regions.stderr similarity index 91% rename from src/test/ui/traits/trait-coercion-generic-regions.stderr rename to src/test/ui/traits/coercion-generic-regions.stderr index d21b48e571..5cfb649012 100644 --- a/src/test/ui/traits/trait-coercion-generic-regions.stderr +++ b/src/test/ui/traits/coercion-generic-regions.stderr @@ -1,5 +1,5 @@ error[E0597]: `person` does not live long enough - --> $DIR/trait-coercion-generic-regions.rs:17:24 + --> $DIR/coercion-generic-regions.rs:17:24 | LL | let person: &str = &person; | ^^^^^^^ diff --git a/src/test/ui/traits/trait-coercion-generic.rs b/src/test/ui/traits/coercion-generic.rs similarity index 100% rename from src/test/ui/traits/trait-coercion-generic.rs rename to src/test/ui/traits/coercion-generic.rs diff --git a/src/test/ui/traits/trait-coercion.rs b/src/test/ui/traits/coercion.rs similarity index 100% rename from src/test/ui/traits/trait-coercion.rs rename to src/test/ui/traits/coercion.rs diff --git a/src/test/ui/traits/trait-composition-trivial.rs b/src/test/ui/traits/composition-trivial.rs similarity index 100% rename from src/test/ui/traits/trait-composition-trivial.rs rename to src/test/ui/traits/composition-trivial.rs diff --git a/src/test/ui/traits/traits-conditional-dispatch.rs b/src/test/ui/traits/conditional-dispatch.rs similarity index 100% rename from src/test/ui/traits/traits-conditional-dispatch.rs rename to src/test/ui/traits/conditional-dispatch.rs diff --git a/src/test/ui/traits/traits-conditional-model-fn.rs b/src/test/ui/traits/conditional-model-fn.rs similarity index 100% rename from src/test/ui/traits/traits-conditional-model-fn.rs rename to src/test/ui/traits/conditional-model-fn.rs diff --git a/src/test/ui/traits/trait-copy-guessing.rs b/src/test/ui/traits/copy-guessing.rs similarity index 100% rename from src/test/ui/traits/trait-copy-guessing.rs rename to src/test/ui/traits/copy-guessing.rs diff --git a/src/test/ui/traits/cycle-trait-type-trait.rs b/src/test/ui/traits/cycle-type-trait.rs similarity index 100% rename from src/test/ui/traits/cycle-trait-type-trait.rs rename to src/test/ui/traits/cycle-type-trait.rs diff --git a/src/test/ui/traits/auxiliary/trait_default_method_xc_aux.rs b/src/test/ui/traits/default-method/auxiliary/xc.rs similarity index 100% rename from src/test/ui/traits/auxiliary/trait_default_method_xc_aux.rs rename to src/test/ui/traits/default-method/auxiliary/xc.rs diff --git a/src/test/ui/traits/auxiliary/trait_default_method_xc_aux_2.rs b/src/test/ui/traits/default-method/auxiliary/xc_2.rs similarity index 73% rename from src/test/ui/traits/auxiliary/trait_default_method_xc_aux_2.rs rename to src/test/ui/traits/default-method/auxiliary/xc_2.rs index 15480132a2..9792338204 100644 --- a/src/test/ui/traits/auxiliary/trait_default_method_xc_aux_2.rs +++ b/src/test/ui/traits/default-method/auxiliary/xc_2.rs @@ -1,6 +1,6 @@ -// aux-build:trait_default_method_xc_aux.rs +// aux-build:xc.rs -extern crate trait_default_method_xc_aux as aux; +extern crate xc as aux; use aux::A; pub struct a_struct { pub x: isize } diff --git a/src/test/ui/traits/trait-default-method-bound-subst.rs b/src/test/ui/traits/default-method/bound-subst.rs similarity index 100% rename from src/test/ui/traits/trait-default-method-bound-subst.rs rename to src/test/ui/traits/default-method/bound-subst.rs diff --git a/src/test/ui/traits/trait-default-method-bound-subst2.rs b/src/test/ui/traits/default-method/bound-subst2.rs similarity index 100% rename from src/test/ui/traits/trait-default-method-bound-subst2.rs rename to src/test/ui/traits/default-method/bound-subst2.rs diff --git a/src/test/ui/traits/trait-default-method-bound-subst3.rs b/src/test/ui/traits/default-method/bound-subst3.rs similarity index 100% rename from src/test/ui/traits/trait-default-method-bound-subst3.rs rename to src/test/ui/traits/default-method/bound-subst3.rs diff --git a/src/test/ui/traits/trait-default-method-bound-subst4.rs b/src/test/ui/traits/default-method/bound-subst4.rs similarity index 100% rename from src/test/ui/traits/trait-default-method-bound-subst4.rs rename to src/test/ui/traits/default-method/bound-subst4.rs diff --git a/src/test/ui/traits/trait-default-method-bound.rs b/src/test/ui/traits/default-method/bound.rs similarity index 100% rename from src/test/ui/traits/trait-default-method-bound.rs rename to src/test/ui/traits/default-method/bound.rs diff --git a/src/test/ui/traits/traits-default-method-macro.rs b/src/test/ui/traits/default-method/macro.rs similarity index 100% rename from src/test/ui/traits/traits-default-method-macro.rs rename to src/test/ui/traits/default-method/macro.rs diff --git a/src/test/ui/traits/traits-default-method-mut.rs b/src/test/ui/traits/default-method/mut.rs similarity index 100% rename from src/test/ui/traits/traits-default-method-mut.rs rename to src/test/ui/traits/default-method/mut.rs diff --git a/src/test/ui/traits/traits-default-method-self.rs b/src/test/ui/traits/default-method/self.rs similarity index 100% rename from src/test/ui/traits/traits-default-method-self.rs rename to src/test/ui/traits/default-method/self.rs diff --git a/src/test/ui/traits/default-method-supertrait-vtable.rs b/src/test/ui/traits/default-method/supervtable.rs similarity index 100% rename from src/test/ui/traits/default-method-supertrait-vtable.rs rename to src/test/ui/traits/default-method/supervtable.rs diff --git a/src/test/ui/traits/traits-default-method-trivial.rs b/src/test/ui/traits/default-method/trivial.rs similarity index 100% rename from src/test/ui/traits/traits-default-method-trivial.rs rename to src/test/ui/traits/default-method/trivial.rs diff --git a/src/test/ui/traits/trait-default-method-xc-2.rs b/src/test/ui/traits/default-method/xc-2.rs similarity index 63% rename from src/test/ui/traits/trait-default-method-xc-2.rs rename to src/test/ui/traits/default-method/xc-2.rs index 5fa1a6cba7..1de61dcf89 100644 --- a/src/test/ui/traits/trait-default-method-xc-2.rs +++ b/src/test/ui/traits/default-method/xc-2.rs @@ -1,11 +1,11 @@ // run-pass -// aux-build:trait_default_method_xc_aux.rs -// aux-build:trait_default_method_xc_aux_2.rs +// aux-build:xc.rs +// aux-build:xc_2.rs -extern crate trait_default_method_xc_aux as aux; -extern crate trait_default_method_xc_aux_2 as aux2; +extern crate xc as aux; +extern crate xc_2 as aux2; use aux::A; use aux2::{a_struct, welp}; diff --git a/src/test/ui/traits/trait-default-method-xc.rs b/src/test/ui/traits/default-method/xc.rs similarity index 94% rename from src/test/ui/traits/trait-default-method-xc.rs rename to src/test/ui/traits/default-method/xc.rs index 3c20a64961..76a1573d6c 100644 --- a/src/test/ui/traits/trait-default-method-xc.rs +++ b/src/test/ui/traits/default-method/xc.rs @@ -2,10 +2,10 @@ #![allow(dead_code)] #![allow(non_camel_case_types)] -// aux-build:trait_default_method_xc_aux.rs +// aux-build:xc.rs -extern crate trait_default_method_xc_aux as aux; +extern crate xc as aux; use aux::{A, TestEquality, Something}; use aux::B; diff --git a/src/test/ui/traits/trait-duplicate-methods.rs b/src/test/ui/traits/duplicate-methods.rs similarity index 100% rename from src/test/ui/traits/trait-duplicate-methods.rs rename to src/test/ui/traits/duplicate-methods.rs diff --git a/src/test/ui/traits/trait-duplicate-methods.stderr b/src/test/ui/traits/duplicate-methods.stderr similarity index 91% rename from src/test/ui/traits/trait-duplicate-methods.stderr rename to src/test/ui/traits/duplicate-methods.stderr index 7cba4cb63e..6aa88d0dff 100644 --- a/src/test/ui/traits/trait-duplicate-methods.stderr +++ b/src/test/ui/traits/duplicate-methods.stderr @@ -1,5 +1,5 @@ error[E0428]: the name `orange` is defined multiple times - --> $DIR/trait-duplicate-methods.rs:3:5 + --> $DIR/duplicate-methods.rs:3:5 | LL | fn orange(&self); | ----------------- previous definition of the value `orange` here diff --git a/src/test/ui/traits/traits-elaborate-type-region.rs b/src/test/ui/traits/elaborate-type-region.rs similarity index 100% rename from src/test/ui/traits/traits-elaborate-type-region.rs rename to src/test/ui/traits/elaborate-type-region.rs diff --git a/src/test/ui/traits/trait-false-ambiguity-where-clause-builtin-bound.rs b/src/test/ui/traits/false-ambiguity-where-clause-builtin-bound.rs similarity index 100% rename from src/test/ui/traits/trait-false-ambiguity-where-clause-builtin-bound.rs rename to src/test/ui/traits/false-ambiguity-where-clause-builtin-bound.rs diff --git a/src/test/ui/traits/trait-generic.rs b/src/test/ui/traits/generic.rs similarity index 100% rename from src/test/ui/traits/trait-generic.rs rename to src/test/ui/traits/generic.rs diff --git a/src/test/ui/traits/trait-impl-1.rs b/src/test/ui/traits/impl-1.rs similarity index 100% rename from src/test/ui/traits/trait-impl-1.rs rename to src/test/ui/traits/impl-1.rs diff --git a/src/test/ui/traits/trait-impl-1.stderr b/src/test/ui/traits/impl-1.stderr similarity index 88% rename from src/test/ui/traits/trait-impl-1.stderr rename to src/test/ui/traits/impl-1.stderr index da0936e8ee..7694e3f5cf 100644 --- a/src/test/ui/traits/trait-impl-1.stderr +++ b/src/test/ui/traits/impl-1.stderr @@ -1,5 +1,5 @@ error[E0599]: no method named `foo` found for reference `&i32` in the current scope - --> $DIR/trait-impl-1.rs:15:7 + --> $DIR/impl-1.rs:15:7 | LL | x.foo(); | ^^^ method not found in `&i32` diff --git a/src/test/ui/traits/trait-impl-2.rs b/src/test/ui/traits/impl-2.rs similarity index 100% rename from src/test/ui/traits/trait-impl-2.rs rename to src/test/ui/traits/impl-2.rs diff --git a/src/test/ui/impl-bounds-checking.rs b/src/test/ui/traits/impl-bounds-checking.rs similarity index 100% rename from src/test/ui/impl-bounds-checking.rs rename to src/test/ui/traits/impl-bounds-checking.rs diff --git a/src/test/ui/impl-bounds-checking.stderr b/src/test/ui/traits/impl-bounds-checking.stderr similarity index 100% rename from src/test/ui/impl-bounds-checking.stderr rename to src/test/ui/traits/impl-bounds-checking.stderr diff --git a/src/test/ui/traits/trait-impl-can-not-have-untraitful-items.rs b/src/test/ui/traits/impl-can-not-have-untraitful-items.rs similarity index 100% rename from src/test/ui/traits/trait-impl-can-not-have-untraitful-items.rs rename to src/test/ui/traits/impl-can-not-have-untraitful-items.rs diff --git a/src/test/ui/traits/trait-impl-can-not-have-untraitful-items.stderr b/src/test/ui/traits/impl-can-not-have-untraitful-items.stderr similarity index 76% rename from src/test/ui/traits/trait-impl-can-not-have-untraitful-items.stderr rename to src/test/ui/traits/impl-can-not-have-untraitful-items.stderr index 0abed79d38..7f56f34ea1 100644 --- a/src/test/ui/traits/trait-impl-can-not-have-untraitful-items.stderr +++ b/src/test/ui/traits/impl-can-not-have-untraitful-items.stderr @@ -1,17 +1,17 @@ error[E0438]: const `BAR` is not a member of trait `A` - --> $DIR/trait-impl-can-not-have-untraitful-items.rs:4:5 + --> $DIR/impl-can-not-have-untraitful-items.rs:4:5 | LL | const BAR: () = (); | ^^^^^^^^^^^^^^^^^^^ not a member of trait `A` error[E0437]: type `Baz` is not a member of trait `A` - --> $DIR/trait-impl-can-not-have-untraitful-items.rs:5:5 + --> $DIR/impl-can-not-have-untraitful-items.rs:5:5 | LL | type Baz = (); | ^^^^^^^^^^^^^^ not a member of trait `A` error[E0407]: method `foo` is not a member of trait `A` - --> $DIR/trait-impl-can-not-have-untraitful-items.rs:6:5 + --> $DIR/impl-can-not-have-untraitful-items.rs:6:5 | LL | fn foo(&self) { } | ^^^^^^^^^^^^^^^^^ not a member of trait `A` diff --git a/src/test/ui/traits/trait-impl-different-num-params.rs b/src/test/ui/traits/impl-different-num-params.rs similarity index 100% rename from src/test/ui/traits/trait-impl-different-num-params.rs rename to src/test/ui/traits/impl-different-num-params.rs diff --git a/src/test/ui/traits/trait-impl-different-num-params.stderr b/src/test/ui/traits/impl-different-num-params.stderr similarity index 88% rename from src/test/ui/traits/trait-impl-different-num-params.stderr rename to src/test/ui/traits/impl-different-num-params.stderr index 5ab93614f2..910ba35106 100644 --- a/src/test/ui/traits/trait-impl-different-num-params.stderr +++ b/src/test/ui/traits/impl-different-num-params.stderr @@ -1,5 +1,5 @@ error[E0050]: method `bar` has 1 parameter but the declaration in trait `Foo::bar` has 2 - --> $DIR/trait-impl-different-num-params.rs:5:12 + --> $DIR/impl-different-num-params.rs:5:12 | LL | fn bar(&self, x: usize) -> Self; | --------------- trait requires 2 parameters diff --git a/src/test/ui/traits/trait-impl-for-module.rs b/src/test/ui/traits/impl-for-module.rs similarity index 100% rename from src/test/ui/traits/trait-impl-for-module.rs rename to src/test/ui/traits/impl-for-module.rs diff --git a/src/test/ui/traits/trait-impl-for-module.stderr b/src/test/ui/traits/impl-for-module.stderr similarity index 88% rename from src/test/ui/traits/trait-impl-for-module.stderr rename to src/test/ui/traits/impl-for-module.stderr index cd2713a5bd..6ec4083b51 100644 --- a/src/test/ui/traits/trait-impl-for-module.stderr +++ b/src/test/ui/traits/impl-for-module.stderr @@ -1,5 +1,5 @@ error[E0573]: expected type, found module `a` - --> $DIR/trait-impl-for-module.rs:7:12 + --> $DIR/impl-for-module.rs:7:12 | LL | trait A { | ------- similarly named trait `A` defined here diff --git a/src/test/ui/traits/trait-impl-method-mismatch.rs b/src/test/ui/traits/impl-method-mismatch.rs similarity index 100% rename from src/test/ui/traits/trait-impl-method-mismatch.rs rename to src/test/ui/traits/impl-method-mismatch.rs diff --git a/src/test/ui/traits/trait-impl-method-mismatch.stderr b/src/test/ui/traits/impl-method-mismatch.stderr similarity index 92% rename from src/test/ui/traits/trait-impl-method-mismatch.stderr rename to src/test/ui/traits/impl-method-mismatch.stderr index 52e4918624..c909446d9d 100644 --- a/src/test/ui/traits/trait-impl-method-mismatch.stderr +++ b/src/test/ui/traits/impl-method-mismatch.stderr @@ -1,5 +1,5 @@ error[E0053]: method `jumbo` has an incompatible type for trait - --> $DIR/trait-impl-method-mismatch.rs:7:5 + --> $DIR/impl-method-mismatch.rs:7:5 | LL | fn jumbo(&self, x: &usize) -> usize; | ------------------------------------ type in trait diff --git a/src/test/ui/traits/traits-impl-object-overlap-issue-23853.rs b/src/test/ui/traits/impl-object-overlap-issue-23853.rs similarity index 100% rename from src/test/ui/traits/traits-impl-object-overlap-issue-23853.rs rename to src/test/ui/traits/impl-object-overlap-issue-23853.rs diff --git a/src/test/ui/traits/trait-impl-of-supertrait-has-wrong-lifetime-parameters.rs b/src/test/ui/traits/impl-of-supertrait-has-wrong-lifetime-parameters.rs similarity index 100% rename from src/test/ui/traits/trait-impl-of-supertrait-has-wrong-lifetime-parameters.rs rename to src/test/ui/traits/impl-of-supertrait-has-wrong-lifetime-parameters.rs diff --git a/src/test/ui/traits/trait-impl-of-supertrait-has-wrong-lifetime-parameters.stderr b/src/test/ui/traits/impl-of-supertrait-has-wrong-lifetime-parameters.stderr similarity index 72% rename from src/test/ui/traits/trait-impl-of-supertrait-has-wrong-lifetime-parameters.stderr rename to src/test/ui/traits/impl-of-supertrait-has-wrong-lifetime-parameters.stderr index 46aa7db967..539a56f010 100644 --- a/src/test/ui/traits/trait-impl-of-supertrait-has-wrong-lifetime-parameters.stderr +++ b/src/test/ui/traits/impl-of-supertrait-has-wrong-lifetime-parameters.stderr @@ -1,21 +1,21 @@ error[E0495]: cannot infer an appropriate lifetime for lifetime parameter `'b` due to conflicting requirements - --> $DIR/trait-impl-of-supertrait-has-wrong-lifetime-parameters.rs:24:13 + --> $DIR/impl-of-supertrait-has-wrong-lifetime-parameters.rs:24:13 | LL | impl<'a,'b> T2<'a, 'b> for S<'a, 'b> { | ^^^^^^^^^^ | note: first, the lifetime cannot outlive the lifetime `'a` as defined on the impl at 24:6... - --> $DIR/trait-impl-of-supertrait-has-wrong-lifetime-parameters.rs:24:6 + --> $DIR/impl-of-supertrait-has-wrong-lifetime-parameters.rs:24:6 | LL | impl<'a,'b> T2<'a, 'b> for S<'a, 'b> { | ^^ note: ...but the lifetime must also be valid for the lifetime `'b` as defined on the impl at 24:9... - --> $DIR/trait-impl-of-supertrait-has-wrong-lifetime-parameters.rs:24:9 + --> $DIR/impl-of-supertrait-has-wrong-lifetime-parameters.rs:24:9 | LL | impl<'a,'b> T2<'a, 'b> for S<'a, 'b> { | ^^ note: ...so that the types are compatible - --> $DIR/trait-impl-of-supertrait-has-wrong-lifetime-parameters.rs:24:13 + --> $DIR/impl-of-supertrait-has-wrong-lifetime-parameters.rs:24:13 | LL | impl<'a,'b> T2<'a, 'b> for S<'a, 'b> { | ^^^^^^^^^^ diff --git a/src/test/ui/traits/trait-impl.rs b/src/test/ui/traits/impl.rs similarity index 93% rename from src/test/ui/traits/trait-impl.rs rename to src/test/ui/traits/impl.rs index 14796ce19c..f512d91ebe 100644 --- a/src/test/ui/traits/trait-impl.rs +++ b/src/test/ui/traits/impl.rs @@ -30,8 +30,8 @@ fn main() { let x: &dyn T = &42; x.foo(); - T::foo(x); - T::bar(); + ::foo(x); + ::bar(); unsafe { assert_eq!(COUNT, 12); } diff --git a/src/test/ui/traits/traits-inductive-overflow-lifetime.rs b/src/test/ui/traits/inductive-overflow/lifetime.rs similarity index 100% rename from src/test/ui/traits/traits-inductive-overflow-lifetime.rs rename to src/test/ui/traits/inductive-overflow/lifetime.rs diff --git a/src/test/ui/traits/traits-inductive-overflow-lifetime.stderr b/src/test/ui/traits/inductive-overflow/lifetime.stderr similarity index 89% rename from src/test/ui/traits/traits-inductive-overflow-lifetime.stderr rename to src/test/ui/traits/inductive-overflow/lifetime.stderr index b904826081..659f9e26e3 100644 --- a/src/test/ui/traits/traits-inductive-overflow-lifetime.stderr +++ b/src/test/ui/traits/inductive-overflow/lifetime.stderr @@ -1,5 +1,5 @@ error[E0275]: overflow evaluating the requirement `Box>>: NotAuto` - --> $DIR/traits-inductive-overflow-lifetime.rs:27:5 + --> $DIR/lifetime.rs:27:5 | LL | fn is_send() {} | ------- required by this bound in `is_send` diff --git a/src/test/ui/traits/traits-inductive-overflow-simultaneous.rs b/src/test/ui/traits/inductive-overflow/simultaneous.rs similarity index 100% rename from src/test/ui/traits/traits-inductive-overflow-simultaneous.rs rename to src/test/ui/traits/inductive-overflow/simultaneous.rs diff --git a/src/test/ui/traits/traits-inductive-overflow-simultaneous.stderr b/src/test/ui/traits/inductive-overflow/simultaneous.stderr similarity index 85% rename from src/test/ui/traits/traits-inductive-overflow-simultaneous.stderr rename to src/test/ui/traits/inductive-overflow/simultaneous.stderr index a0d2d13fbf..88e0631eeb 100644 --- a/src/test/ui/traits/traits-inductive-overflow-simultaneous.stderr +++ b/src/test/ui/traits/inductive-overflow/simultaneous.stderr @@ -1,5 +1,5 @@ -error[E0275]: overflow evaluating the requirement `{integer}: Tweedledum` - --> $DIR/traits-inductive-overflow-simultaneous.rs:18:5 +error[E0275]: overflow evaluating the requirement `{integer}: Tweedledee` + --> $DIR/simultaneous.rs:18:5 | LL | fn is_ee(t: T) { | ----- required by this bound in `is_ee` diff --git a/src/test/ui/traits/traits-inductive-overflow-supertrait-auto-trait.rs b/src/test/ui/traits/inductive-overflow/supertrait-auto-trait.rs similarity index 100% rename from src/test/ui/traits/traits-inductive-overflow-supertrait-auto-trait.rs rename to src/test/ui/traits/inductive-overflow/supertrait-auto-trait.rs diff --git a/src/test/ui/traits/traits-inductive-overflow-supertrait-auto-trait.stderr b/src/test/ui/traits/inductive-overflow/supertrait-auto-trait.stderr similarity index 85% rename from src/test/ui/traits/traits-inductive-overflow-supertrait-auto-trait.stderr rename to src/test/ui/traits/inductive-overflow/supertrait-auto-trait.stderr index 140ffa4b07..6a0f7398cf 100644 --- a/src/test/ui/traits/traits-inductive-overflow-supertrait-auto-trait.stderr +++ b/src/test/ui/traits/inductive-overflow/supertrait-auto-trait.stderr @@ -1,5 +1,5 @@ error[E0568]: auto traits cannot have super traits - --> $DIR/traits-inductive-overflow-supertrait-auto-trait.rs:8:19 + --> $DIR/supertrait-auto-trait.rs:8:19 | LL | auto trait Magic: Copy {} | ----- ^^^^ help: remove the super traits @@ -7,7 +7,7 @@ LL | auto trait Magic: Copy {} | auto trait cannot have super traits error[E0277]: the trait bound `NoClone: Copy` is not satisfied - --> $DIR/traits-inductive-overflow-supertrait-auto-trait.rs:16:23 + --> $DIR/supertrait-auto-trait.rs:16:23 | LL | fn copy(x: T) -> (T, T) { (x, x) } | ----- required by this bound in `copy` diff --git a/src/test/ui/traits/traits-inductive-overflow-supertrait.rs b/src/test/ui/traits/inductive-overflow/supertrait.rs similarity index 100% rename from src/test/ui/traits/traits-inductive-overflow-supertrait.rs rename to src/test/ui/traits/inductive-overflow/supertrait.rs diff --git a/src/test/ui/traits/traits-inductive-overflow-supertrait.stderr b/src/test/ui/traits/inductive-overflow/supertrait.stderr similarity index 88% rename from src/test/ui/traits/traits-inductive-overflow-supertrait.stderr rename to src/test/ui/traits/inductive-overflow/supertrait.stderr index a86648d9a1..dfb967601e 100644 --- a/src/test/ui/traits/traits-inductive-overflow-supertrait.stderr +++ b/src/test/ui/traits/inductive-overflow/supertrait.stderr @@ -1,5 +1,5 @@ error[E0275]: overflow evaluating the requirement `NoClone: Magic` - --> $DIR/traits-inductive-overflow-supertrait.rs:13:18 + --> $DIR/supertrait.rs:13:18 | LL | fn copy(x: T) -> (T, T) { (x, x) } | ----- required by this bound in `copy` diff --git a/src/test/ui/traits/traits-inductive-overflow-two-traits.rs b/src/test/ui/traits/inductive-overflow/two-traits.rs similarity index 100% rename from src/test/ui/traits/traits-inductive-overflow-two-traits.rs rename to src/test/ui/traits/inductive-overflow/two-traits.rs diff --git a/src/test/ui/traits/traits-inductive-overflow-two-traits.stderr b/src/test/ui/traits/inductive-overflow/two-traits.stderr similarity index 87% rename from src/test/ui/traits/traits-inductive-overflow-two-traits.stderr rename to src/test/ui/traits/inductive-overflow/two-traits.stderr index 996544ae51..d3f2931f25 100644 --- a/src/test/ui/traits/traits-inductive-overflow-two-traits.stderr +++ b/src/test/ui/traits/inductive-overflow/two-traits.stderr @@ -1,5 +1,5 @@ error[E0277]: `T` cannot be shared between threads safely - --> $DIR/traits-inductive-overflow-two-traits.rs:11:5 + --> $DIR/two-traits.rs:11:5 | LL | type X: Trait; | ----- required by this bound in `Magic::X` @@ -13,7 +13,7 @@ LL | impl Magic for T { | ^^^^^^ error[E0275]: overflow evaluating the requirement `*mut (): Magic` - --> $DIR/traits-inductive-overflow-two-traits.rs:20:5 + --> $DIR/two-traits.rs:20:5 | LL | fn wizard() { check::<::X>(); } | ----- required by this bound in `wizard` diff --git a/src/test/ui/traits/infer-from-object-trait-issue-26952.rs b/src/test/ui/traits/infer-from-object-issue-26952.rs similarity index 100% rename from src/test/ui/traits/infer-from-object-trait-issue-26952.rs rename to src/test/ui/traits/infer-from-object-issue-26952.rs diff --git a/src/test/ui/traits/inherent-trait-method-order.rs b/src/test/ui/traits/inherent-method-order.rs similarity index 100% rename from src/test/ui/traits/inherent-trait-method-order.rs rename to src/test/ui/traits/inherent-method-order.rs diff --git a/src/test/ui/traits/trait-inheritance-auto-xc-2.rs b/src/test/ui/traits/inheritance/auto-xc-2.rs similarity index 78% rename from src/test/ui/traits/trait-inheritance-auto-xc-2.rs rename to src/test/ui/traits/inheritance/auto-xc-2.rs index 62c3ce8030..f2130228d5 100644 --- a/src/test/ui/traits/trait-inheritance-auto-xc-2.rs +++ b/src/test/ui/traits/inheritance/auto-xc-2.rs @@ -1,8 +1,8 @@ // run-pass -// aux-build:trait_inheritance_auto_xc_2_aux.rs +// aux-build:auto_xc_2.rs -extern crate trait_inheritance_auto_xc_2_aux as aux; +extern crate auto_xc_2 as aux; // aux defines impls of Foo, Bar and Baz for A use aux::{Foo, Bar, Baz, A}; diff --git a/src/test/ui/traits/trait-inheritance-auto-xc.rs b/src/test/ui/traits/inheritance/auto-xc.rs similarity index 80% rename from src/test/ui/traits/trait-inheritance-auto-xc.rs rename to src/test/ui/traits/inheritance/auto-xc.rs index e8e651091a..3d5ae182af 100644 --- a/src/test/ui/traits/trait-inheritance-auto-xc.rs +++ b/src/test/ui/traits/inheritance/auto-xc.rs @@ -1,9 +1,9 @@ // run-pass #![allow(dead_code)] -// aux-build:trait_inheritance_auto_xc_aux.rs +// aux-build:auto_xc.rs -extern crate trait_inheritance_auto_xc_aux as aux; +extern crate auto_xc as aux; use aux::{Foo, Bar, Baz, Quux}; diff --git a/src/test/ui/traits/trait-inheritance-auto.rs b/src/test/ui/traits/inheritance/auto.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-auto.rs rename to src/test/ui/traits/inheritance/auto.rs diff --git a/src/test/ui/traits/auxiliary/trait_inheritance_auto_xc_aux.rs b/src/test/ui/traits/inheritance/auxiliary/auto_xc.rs similarity index 100% rename from src/test/ui/traits/auxiliary/trait_inheritance_auto_xc_aux.rs rename to src/test/ui/traits/inheritance/auxiliary/auto_xc.rs diff --git a/src/test/ui/traits/auxiliary/trait_inheritance_auto_xc_2_aux.rs b/src/test/ui/traits/inheritance/auxiliary/auto_xc_2.rs similarity index 100% rename from src/test/ui/traits/auxiliary/trait_inheritance_auto_xc_2_aux.rs rename to src/test/ui/traits/inheritance/auxiliary/auto_xc_2.rs diff --git a/src/test/ui/traits/auxiliary/trait_inheritance_overloading_xc.rs b/src/test/ui/traits/inheritance/auxiliary/overloading_xc.rs similarity index 100% rename from src/test/ui/traits/auxiliary/trait_inheritance_overloading_xc.rs rename to src/test/ui/traits/inheritance/auxiliary/overloading_xc.rs diff --git a/src/test/ui/traits/auxiliary/trait_xc_call_aux.rs b/src/test/ui/traits/inheritance/auxiliary/xc_call.rs similarity index 100% rename from src/test/ui/traits/auxiliary/trait_xc_call_aux.rs rename to src/test/ui/traits/inheritance/auxiliary/xc_call.rs diff --git a/src/test/ui/traits/trait-inheritance2.rs b/src/test/ui/traits/inheritance/basic.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance2.rs rename to src/test/ui/traits/inheritance/basic.rs diff --git a/src/test/ui/traits/trait-inheritance-call-bound-inherited.rs b/src/test/ui/traits/inheritance/call-bound-inherited.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-call-bound-inherited.rs rename to src/test/ui/traits/inheritance/call-bound-inherited.rs diff --git a/src/test/ui/traits/trait-inheritance-call-bound-inherited2.rs b/src/test/ui/traits/inheritance/call-bound-inherited2.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-call-bound-inherited2.rs rename to src/test/ui/traits/inheritance/call-bound-inherited2.rs diff --git a/src/test/ui/traits/trait-inheritance-cast-without-call-to-supertrait.rs b/src/test/ui/traits/inheritance/cast-without-call-to-supertrait.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-cast-without-call-to-supertrait.rs rename to src/test/ui/traits/inheritance/cast-without-call-to-supertrait.rs diff --git a/src/test/ui/traits/trait-inheritance-cast.rs b/src/test/ui/traits/inheritance/cast.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-cast.rs rename to src/test/ui/traits/inheritance/cast.rs diff --git a/src/test/ui/traits/trait-inheritance-cross-trait-call-xc.rs b/src/test/ui/traits/inheritance/cross-trait-call-xc.rs similarity index 74% rename from src/test/ui/traits/trait-inheritance-cross-trait-call-xc.rs rename to src/test/ui/traits/inheritance/cross-trait-call-xc.rs index dbefb22cb7..99fbb5c614 100644 --- a/src/test/ui/traits/trait-inheritance-cross-trait-call-xc.rs +++ b/src/test/ui/traits/inheritance/cross-trait-call-xc.rs @@ -1,8 +1,8 @@ // run-pass -// aux-build:trait_xc_call_aux.rs +// aux-build:xc_call.rs -extern crate trait_xc_call_aux as aux; +extern crate xc_call as aux; use aux::Foo; diff --git a/src/test/ui/traits/trait-inheritance-cross-trait-call.rs b/src/test/ui/traits/inheritance/cross-trait-call.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-cross-trait-call.rs rename to src/test/ui/traits/inheritance/cross-trait-call.rs diff --git a/src/test/ui/traits/trait-inheritance-diamond.rs b/src/test/ui/traits/inheritance/diamond.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-diamond.rs rename to src/test/ui/traits/inheritance/diamond.rs diff --git a/src/test/ui/traits/trait-inheritance-multiple-inheritors.rs b/src/test/ui/traits/inheritance/multiple-inheritors.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-multiple-inheritors.rs rename to src/test/ui/traits/inheritance/multiple-inheritors.rs diff --git a/src/test/ui/traits/trait-inheritance-multiple-params.rs b/src/test/ui/traits/inheritance/multiple-params.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-multiple-params.rs rename to src/test/ui/traits/inheritance/multiple-params.rs diff --git a/src/test/ui/traits/trait-inheritance-num.rs b/src/test/ui/traits/inheritance/num.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-num.rs rename to src/test/ui/traits/inheritance/num.rs diff --git a/src/test/ui/traits/trait-inheritance-num0.rs b/src/test/ui/traits/inheritance/num0.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-num0.rs rename to src/test/ui/traits/inheritance/num0.rs diff --git a/src/test/ui/traits/trait-inheritance-num1.rs b/src/test/ui/traits/inheritance/num1.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-num1.rs rename to src/test/ui/traits/inheritance/num1.rs diff --git a/src/test/ui/traits/trait-inheritance-num2.rs b/src/test/ui/traits/inheritance/num2.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-num2.rs rename to src/test/ui/traits/inheritance/num2.rs diff --git a/src/test/ui/traits/trait-inheritance-num3.rs b/src/test/ui/traits/inheritance/num3.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-num3.rs rename to src/test/ui/traits/inheritance/num3.rs diff --git a/src/test/ui/traits/trait-inheritance-num5.rs b/src/test/ui/traits/inheritance/num5.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-num5.rs rename to src/test/ui/traits/inheritance/num5.rs diff --git a/src/test/ui/traits/trait-inheritance-overloading-simple.rs b/src/test/ui/traits/inheritance/overloading-simple.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-overloading-simple.rs rename to src/test/ui/traits/inheritance/overloading-simple.rs diff --git a/src/test/ui/traits/trait-inheritance-overloading-xc-exe.rs b/src/test/ui/traits/inheritance/overloading-xc-exe.rs similarity index 68% rename from src/test/ui/traits/trait-inheritance-overloading-xc-exe.rs rename to src/test/ui/traits/inheritance/overloading-xc-exe.rs index 2a9acfdd04..08778061ba 100644 --- a/src/test/ui/traits/trait-inheritance-overloading-xc-exe.rs +++ b/src/test/ui/traits/inheritance/overloading-xc-exe.rs @@ -1,9 +1,9 @@ // run-pass -// aux-build:trait_inheritance_overloading_xc.rs +// aux-build:overloading_xc.rs -extern crate trait_inheritance_overloading_xc; -use trait_inheritance_overloading_xc::{MyNum, MyInt}; +extern crate overloading_xc; +use overloading_xc::{MyNum, MyInt}; fn f(x: T, y: T) -> (T, T, T) { return (x.clone() + y.clone(), x.clone() - y.clone(), x * y); diff --git a/src/test/ui/traits/trait-inheritance-overloading.rs b/src/test/ui/traits/inheritance/overloading.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-overloading.rs rename to src/test/ui/traits/inheritance/overloading.rs diff --git a/src/test/ui/traits/traits-repeated-supertrait-ambig.rs b/src/test/ui/traits/inheritance/repeated-supertrait-ambig.rs similarity index 92% rename from src/test/ui/traits/traits-repeated-supertrait-ambig.rs rename to src/test/ui/traits/inheritance/repeated-supertrait-ambig.rs index 6aaef8a305..727897d20c 100644 --- a/src/test/ui/traits/traits-repeated-supertrait-ambig.rs +++ b/src/test/ui/traits/inheritance/repeated-supertrait-ambig.rs @@ -31,7 +31,7 @@ fn with_trait(c: &C) -> bool { } fn with_ufcs1(c: &C) -> bool { - CompareToInts::same_as(c, 22) //~ ERROR `dyn CompareToInts: CompareTo` is not satisfied + ::same_as(c, 22) //~ ERROR `dyn CompareToInts: CompareTo` is not satisfi } fn with_ufcs2(c: &C) -> bool { diff --git a/src/test/ui/traits/traits-repeated-supertrait-ambig.stderr b/src/test/ui/traits/inheritance/repeated-supertrait-ambig.stderr similarity index 80% rename from src/test/ui/traits/traits-repeated-supertrait-ambig.stderr rename to src/test/ui/traits/inheritance/repeated-supertrait-ambig.stderr index 4107c49bd8..bb11f18e54 100644 --- a/src/test/ui/traits/traits-repeated-supertrait-ambig.stderr +++ b/src/test/ui/traits/inheritance/repeated-supertrait-ambig.stderr @@ -1,11 +1,11 @@ error[E0277]: the trait bound `dyn CompareToInts: CompareTo` is not satisfied - --> $DIR/traits-repeated-supertrait-ambig.rs:26:7 + --> $DIR/repeated-supertrait-ambig.rs:26:7 | LL | c.same_as(22) | ^^^^^^^ the trait `CompareTo` is not implemented for `dyn CompareToInts` error[E0277]: the trait bound `C: CompareTo` is not satisfied - --> $DIR/traits-repeated-supertrait-ambig.rs:30:7 + --> $DIR/repeated-supertrait-ambig.rs:30:7 | LL | c.same_as(22) | ^^^^^^^ the trait `CompareTo` is not implemented for `C` @@ -16,16 +16,16 @@ LL | fn with_trait>(c: &C) -> bool { | ^^^^^^^^^^^^^^^^ error[E0277]: the trait bound `dyn CompareToInts: CompareTo` is not satisfied - --> $DIR/traits-repeated-supertrait-ambig.rs:34:5 + --> $DIR/repeated-supertrait-ambig.rs:34:5 | LL | fn same_as(&self, t: T) -> bool; | -------------------------------- required by `CompareTo::same_as` ... -LL | CompareToInts::same_as(c, 22) - | ^^^^^^^^^^^^^^^^^^^^^^ the trait `CompareTo` is not implemented for `dyn CompareToInts` +LL | ::same_as(c, 22) + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `CompareTo` is not implemented for `dyn CompareToInts` error[E0277]: the trait bound `C: CompareTo` is not satisfied - --> $DIR/traits-repeated-supertrait-ambig.rs:38:5 + --> $DIR/repeated-supertrait-ambig.rs:38:5 | LL | fn same_as(&self, t: T) -> bool; | -------------------------------- required by `CompareTo::same_as` @@ -39,7 +39,7 @@ LL | fn with_ufcs2>(c: &C) -> bool { | ^^^^^^^^^^^^^^^^ error[E0277]: the trait bound `i64: CompareTo` is not satisfied - --> $DIR/traits-repeated-supertrait-ambig.rs:42:23 + --> $DIR/repeated-supertrait-ambig.rs:42:23 | LL | assert_eq!(22_i64.same_as(22), true); | ^^^^^^^ the trait `CompareTo` is not implemented for `i64` diff --git a/src/test/ui/traits/traits-repeated-supertrait.rs b/src/test/ui/traits/inheritance/repeated-supertrait.rs similarity index 93% rename from src/test/ui/traits/traits-repeated-supertrait.rs rename to src/test/ui/traits/inheritance/repeated-supertrait.rs index 339f9c37ee..cb2581ffa9 100644 --- a/src/test/ui/traits/traits-repeated-supertrait.rs +++ b/src/test/ui/traits/inheritance/repeated-supertrait.rs @@ -31,7 +31,7 @@ fn with_trait(c: &C) -> bool { } fn with_ufcs1(c: &C) -> bool { - CompareToInts::same_as(c, 22_i64) && CompareToInts::same_as(c, 22_u64) + ::same_as(c, 22_i64) && ::same_as(c, 22_u64) } fn with_ufcs2(c: &C) -> bool { diff --git a/src/test/ui/traits/trait-inheritance-self-in-supertype.rs b/src/test/ui/traits/inheritance/self-in-supertype.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-self-in-supertype.rs rename to src/test/ui/traits/inheritance/self-in-supertype.rs diff --git a/src/test/ui/traits/trait-inheritance-self.rs b/src/test/ui/traits/inheritance/self.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-self.rs rename to src/test/ui/traits/inheritance/self.rs diff --git a/src/test/ui/traits/trait-inheritance-simple.rs b/src/test/ui/traits/inheritance/simple.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-simple.rs rename to src/test/ui/traits/inheritance/simple.rs diff --git a/src/test/ui/traits/trait-inheritance-static.rs b/src/test/ui/traits/inheritance/static.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-static.rs rename to src/test/ui/traits/inheritance/static.rs diff --git a/src/test/ui/traits/trait-inheritance-static2.rs b/src/test/ui/traits/inheritance/static2.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-static2.rs rename to src/test/ui/traits/inheritance/static2.rs diff --git a/src/test/ui/traits/trait-inheritance-subst.rs b/src/test/ui/traits/inheritance/subst.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-subst.rs rename to src/test/ui/traits/inheritance/subst.rs diff --git a/src/test/ui/traits/trait-inheritance-subst2.rs b/src/test/ui/traits/inheritance/subst2.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-subst2.rs rename to src/test/ui/traits/inheritance/subst2.rs diff --git a/src/test/ui/traits/trait-inheritance-visibility.rs b/src/test/ui/traits/inheritance/visibility.rs similarity index 100% rename from src/test/ui/traits/trait-inheritance-visibility.rs rename to src/test/ui/traits/inheritance/visibility.rs diff --git a/src/test/ui/traits/traits-issue-22019.rs b/src/test/ui/traits/issue-22019.rs similarity index 100% rename from src/test/ui/traits/traits-issue-22019.rs rename to src/test/ui/traits/issue-22019.rs diff --git a/src/test/ui/traits/traits-issue-22110.rs b/src/test/ui/traits/issue-22110.rs similarity index 100% rename from src/test/ui/traits/traits-issue-22110.rs rename to src/test/ui/traits/issue-22110.rs diff --git a/src/test/ui/traits/traits-issue-22655.rs b/src/test/ui/traits/issue-22655.rs similarity index 100% rename from src/test/ui/traits/traits-issue-22655.rs rename to src/test/ui/traits/issue-22655.rs diff --git a/src/test/ui/traits/traits-issue-23003-overflow.rs b/src/test/ui/traits/issue-23003-overflow.rs similarity index 100% rename from src/test/ui/traits/traits-issue-23003-overflow.rs rename to src/test/ui/traits/issue-23003-overflow.rs diff --git a/src/test/ui/traits/traits-issue-23003.rs b/src/test/ui/traits/issue-23003.rs similarity index 100% rename from src/test/ui/traits/traits-issue-23003.rs rename to src/test/ui/traits/issue-23003.rs diff --git a/src/test/ui/traits/traits-issue-26339.rs b/src/test/ui/traits/issue-26339.rs similarity index 100% rename from src/test/ui/traits/traits-issue-26339.rs rename to src/test/ui/traits/issue-26339.rs diff --git a/src/test/ui/issues/issue-28576.rs b/src/test/ui/traits/issue-28576.rs similarity index 100% rename from src/test/ui/issues/issue-28576.rs rename to src/test/ui/traits/issue-28576.rs diff --git a/src/test/ui/issues/issue-28576.stderr b/src/test/ui/traits/issue-28576.stderr similarity index 100% rename from src/test/ui/issues/issue-28576.stderr rename to src/test/ui/traits/issue-28576.stderr diff --git a/src/test/ui/issues/issue-33140.rs b/src/test/ui/traits/issue-33140.rs similarity index 100% rename from src/test/ui/issues/issue-33140.rs rename to src/test/ui/traits/issue-33140.rs diff --git a/src/test/ui/issues/issue-33140.stderr b/src/test/ui/traits/issue-33140.stderr similarity index 100% rename from src/test/ui/issues/issue-33140.stderr rename to src/test/ui/traits/issue-33140.stderr diff --git a/src/test/ui/traits/traits-issue-71136.rs b/src/test/ui/traits/issue-71136.rs similarity index 100% rename from src/test/ui/traits/traits-issue-71136.rs rename to src/test/ui/traits/issue-71136.rs diff --git a/src/test/ui/traits/traits-issue-71136.stderr b/src/test/ui/traits/issue-71136.stderr similarity index 93% rename from src/test/ui/traits/traits-issue-71136.stderr rename to src/test/ui/traits/issue-71136.stderr index 23a8040f6f..ba47fdb152 100644 --- a/src/test/ui/traits/traits-issue-71136.stderr +++ b/src/test/ui/traits/issue-71136.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `Foo: Clone` is not satisfied - --> $DIR/traits-issue-71136.rs:5:5 + --> $DIR/issue-71136.rs:5:5 | LL | the_foos: Vec, | ^^^^^^^^^^^^^^^^^^ expected an implementor of trait `Clone` diff --git a/src/test/ui/traits/issue-9394-inherited-trait-calls.rs b/src/test/ui/traits/issue-9394-inherited-calls.rs similarity index 100% rename from src/test/ui/traits/issue-9394-inherited-trait-calls.rs rename to src/test/ui/traits/issue-9394-inherited-calls.rs diff --git a/src/test/ui/traits/trait-item-inside-macro.rs b/src/test/ui/traits/item-inside-macro.rs similarity index 100% rename from src/test/ui/traits/trait-item-inside-macro.rs rename to src/test/ui/traits/item-inside-macro.rs diff --git a/src/test/ui/traits/trait-item-privacy.rs b/src/test/ui/traits/item-privacy.rs similarity index 90% rename from src/test/ui/traits/trait-item-privacy.rs rename to src/test/ui/traits/item-privacy.rs index 1ea1d65df6..38d06b967b 100644 --- a/src/test/ui/traits/trait-item-privacy.rs +++ b/src/test/ui/traits/item-privacy.rs @@ -81,8 +81,8 @@ fn check_method() { //~^ 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 associated function `a` is private - C::b(&S); // OK + ::a(&S); //~ ERROR associated function `a` is private + ::b(&S); // OK C::c(&S); // OK } @@ -98,9 +98,9 @@ fn check_assoc_const() { 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 - //~^ ERROR the trait `assoc_const::C` cannot be made into an object - C::B; // ERROR the trait `assoc_const::C` cannot be made into an object + ::A; //~ ERROR associated constant `A` is private + //~^ ERROR the trait `assoc_const::C` cannot be made into an object + ::B; // ERROR the trait `assoc_const::C` cannot be made into an object C::C; // OK } diff --git a/src/test/ui/traits/trait-item-privacy.stderr b/src/test/ui/traits/item-privacy.stderr similarity index 82% rename from src/test/ui/traits/trait-item-privacy.stderr rename to src/test/ui/traits/item-privacy.stderr index 4d97d93437..68d527dc78 100644 --- a/src/test/ui/traits/trait-item-privacy.stderr +++ b/src/test/ui/traits/item-privacy.stderr @@ -1,5 +1,5 @@ error[E0599]: no method named `a` found for struct `S` in the current scope - --> $DIR/trait-item-privacy.rs:67:7 + --> $DIR/item-privacy.rs:67:7 | LL | struct S; | --------- method `a` not found for this @@ -9,13 +9,13 @@ LL | S.a(); | = help: items from traits can only be used if the trait is implemented and in scope note: `method::A` defines an item `a`, perhaps you need to implement it - --> $DIR/trait-item-privacy.rs:6:5 + --> $DIR/item-privacy.rs:6:5 | LL | trait A { | ^^^^^^^ error[E0599]: no method named `b` found for struct `S` in the current scope - --> $DIR/trait-item-privacy.rs:68:7 + --> $DIR/item-privacy.rs:68:7 | LL | struct S; | --------- method `b` not found for this @@ -30,13 +30,13 @@ LL | use method::B; | error[E0624]: associated function `a` is private - --> $DIR/trait-item-privacy.rs:72:7 + --> $DIR/item-privacy.rs:72:7 | LL | c.a(); | ^ private associated function error[E0599]: no function or associated item named `a` found for struct `S` in the current scope - --> $DIR/trait-item-privacy.rs:78:8 + --> $DIR/item-privacy.rs:78:8 | LL | struct S; | --------- function or associated item `a` not found for this @@ -46,13 +46,13 @@ LL | S::a(&S); | = help: items from traits can only be used if the trait is implemented and in scope note: `method::A` defines an item `a`, perhaps you need to implement it - --> $DIR/trait-item-privacy.rs:6:5 + --> $DIR/item-privacy.rs:6:5 | LL | trait A { | ^^^^^^^ error[E0599]: no function or associated item named `b` found for struct `S` in the current scope - --> $DIR/trait-item-privacy.rs:80:8 + --> $DIR/item-privacy.rs:80:8 | LL | struct S; | --------- function or associated item `b` not found for this @@ -67,13 +67,13 @@ LL | use method::B; | error[E0624]: associated function `a` is private - --> $DIR/trait-item-privacy.rs:84:8 + --> $DIR/item-privacy.rs:84:14 | -LL | C::a(&S); - | ^ private associated function +LL | ::a(&S); + | ^ private associated function error[E0599]: no associated item named `A` found for struct `S` in the current scope - --> $DIR/trait-item-privacy.rs:97:8 + --> $DIR/item-privacy.rs:97:8 | LL | struct S; | --------- associated item `A` not found for this @@ -83,13 +83,13 @@ LL | S::A; | = help: items from traits can only be used if the trait is implemented and in scope note: `assoc_const::A` defines an item `A`, perhaps you need to implement it - --> $DIR/trait-item-privacy.rs:24:5 + --> $DIR/item-privacy.rs:24:5 | LL | trait A { | ^^^^^^^ error[E0599]: no associated item named `B` found for struct `S` in the current scope - --> $DIR/trait-item-privacy.rs:98:8 + --> $DIR/item-privacy.rs:98:8 | LL | struct S; | --------- associated item `B` not found for this @@ -104,22 +104,22 @@ LL | use assoc_const::B; | error[E0624]: associated constant `A` is private - --> $DIR/trait-item-privacy.rs:101:8 + --> $DIR/item-privacy.rs:101:14 | -LL | C::A; - | ^ private associated constant +LL | ::A; + | ^ private associated constant error[E0038]: the trait `assoc_const::C` cannot be made into an object - --> $DIR/trait-item-privacy.rs:101:5 + --> $DIR/item-privacy.rs:101:6 | -LL | C::A; - | ^^^^ `assoc_const::C` cannot be made into an object +LL | ::A; + | ^^^^^ `assoc_const::C` cannot be made into an object | = help: consider moving `C` to another trait = help: consider moving `B` to another trait = help: consider moving `A` to another trait note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit - --> $DIR/trait-item-privacy.rs:25:15 + --> $DIR/item-privacy.rs:25:15 | LL | const A: u8 = 0; | ^ ...because it contains this associated `const` @@ -133,31 +133,31 @@ LL | const C: u8 = 0; | ^ ...because it contains this associated `const` error[E0223]: ambiguous associated type - --> $DIR/trait-item-privacy.rs:115:12 + --> $DIR/item-privacy.rs:115:12 | LL | let _: S::A; | ^^^^ help: use fully-qualified syntax: `::A` error[E0223]: ambiguous associated type - --> $DIR/trait-item-privacy.rs:116:12 + --> $DIR/item-privacy.rs:116:12 | LL | let _: S::B; | ^^^^ help: use fully-qualified syntax: `::B` error[E0223]: ambiguous associated type - --> $DIR/trait-item-privacy.rs:117:12 + --> $DIR/item-privacy.rs:117:12 | LL | let _: S::C; | ^^^^ help: use fully-qualified syntax: `::C` error: associated type `A` is private - --> $DIR/trait-item-privacy.rs:119:12 + --> $DIR/item-privacy.rs:119:12 | LL | let _: T::A; | ^^^^ private associated type error: associated type `A` is private - --> $DIR/trait-item-privacy.rs:128:9 + --> $DIR/item-privacy.rs:128:9 | LL | A = u8, | ^^^^^^ private associated type diff --git a/src/test/ui/traits/kindck-owned-trait-contains-1.rs b/src/test/ui/traits/kindck-owned-contains-1.rs similarity index 100% rename from src/test/ui/traits/kindck-owned-trait-contains-1.rs rename to src/test/ui/traits/kindck-owned-contains-1.rs diff --git a/src/test/ui/traits/trait-matching-lifetimes.rs b/src/test/ui/traits/matching-lifetimes.rs similarity index 100% rename from src/test/ui/traits/trait-matching-lifetimes.rs rename to src/test/ui/traits/matching-lifetimes.rs diff --git a/src/test/ui/traits/trait-matching-lifetimes.stderr b/src/test/ui/traits/matching-lifetimes.stderr similarity index 80% rename from src/test/ui/traits/trait-matching-lifetimes.stderr rename to src/test/ui/traits/matching-lifetimes.stderr index 17ebdb7c82..5c28d40160 100644 --- a/src/test/ui/traits/trait-matching-lifetimes.stderr +++ b/src/test/ui/traits/matching-lifetimes.stderr @@ -1,5 +1,5 @@ error[E0308]: method not compatible with trait - --> $DIR/trait-matching-lifetimes.rs:14:5 + --> $DIR/matching-lifetimes.rs:14:5 | LL | fn foo(x: Foo<'b,'a>) { | ^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -7,18 +7,18 @@ LL | fn foo(x: Foo<'b,'a>) { = note: expected fn pointer `fn(Foo<'a, 'b>)` found fn pointer `fn(Foo<'b, 'a>)` note: the lifetime `'b` as defined on the impl at 13:9... - --> $DIR/trait-matching-lifetimes.rs:13:9 + --> $DIR/matching-lifetimes.rs:13:9 | LL | impl<'a,'b> Tr for Foo<'a,'b> { | ^^ note: ...does not necessarily outlive the lifetime `'a` as defined on the impl at 13:6 - --> $DIR/trait-matching-lifetimes.rs:13:6 + --> $DIR/matching-lifetimes.rs:13:6 | LL | impl<'a,'b> Tr for Foo<'a,'b> { | ^^ error[E0308]: method not compatible with trait - --> $DIR/trait-matching-lifetimes.rs:14:5 + --> $DIR/matching-lifetimes.rs:14:5 | LL | fn foo(x: Foo<'b,'a>) { | ^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch @@ -26,12 +26,12 @@ LL | fn foo(x: Foo<'b,'a>) { = note: expected fn pointer `fn(Foo<'a, 'b>)` found fn pointer `fn(Foo<'b, 'a>)` note: the lifetime `'a` as defined on the impl at 13:6... - --> $DIR/trait-matching-lifetimes.rs:13:6 + --> $DIR/matching-lifetimes.rs:13:6 | LL | impl<'a,'b> Tr for Foo<'a,'b> { | ^^ note: ...does not necessarily outlive the lifetime `'b` as defined on the impl at 13:9 - --> $DIR/trait-matching-lifetimes.rs:13:9 + --> $DIR/matching-lifetimes.rs:13:9 | LL | impl<'a,'b> Tr for Foo<'a,'b> { | ^^ diff --git a/src/test/ui/traits/trait-method-private.rs b/src/test/ui/traits/method-private.rs similarity index 100% rename from src/test/ui/traits/trait-method-private.rs rename to src/test/ui/traits/method-private.rs diff --git a/src/test/ui/traits/trait-method-private.stderr b/src/test/ui/traits/method-private.stderr similarity index 91% rename from src/test/ui/traits/trait-method-private.stderr rename to src/test/ui/traits/method-private.stderr index c33673aea4..99f330b38a 100644 --- a/src/test/ui/traits/trait-method-private.stderr +++ b/src/test/ui/traits/method-private.stderr @@ -1,5 +1,5 @@ error[E0624]: associated function `method` is private - --> $DIR/trait-method-private.rs:19:9 + --> $DIR/method-private.rs:19:9 | LL | foo.method(); | ^^^^^^ private associated function diff --git a/src/test/ui/traits/traits-multidispatch-bad.rs b/src/test/ui/traits/multidispatch-bad.rs similarity index 100% rename from src/test/ui/traits/traits-multidispatch-bad.rs rename to src/test/ui/traits/multidispatch-bad.rs diff --git a/src/test/ui/traits/traits-multidispatch-bad.stderr b/src/test/ui/traits/multidispatch-bad.stderr similarity index 88% rename from src/test/ui/traits/traits-multidispatch-bad.stderr rename to src/test/ui/traits/multidispatch-bad.stderr index 671faf4517..8d4813c453 100644 --- a/src/test/ui/traits/traits-multidispatch-bad.stderr +++ b/src/test/ui/traits/multidispatch-bad.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/traits-multidispatch-bad.rs:19:17 + --> $DIR/multidispatch-bad.rs:19:17 | LL | test(22i32, 44i32); | ^^^^^ expected `u32`, found `i32` diff --git a/src/test/ui/traits/traits-multidispatch-convert-ambig-dest.rs b/src/test/ui/traits/multidispatch-convert-ambig-dest.rs similarity index 100% rename from src/test/ui/traits/traits-multidispatch-convert-ambig-dest.rs rename to src/test/ui/traits/multidispatch-convert-ambig-dest.rs diff --git a/src/test/ui/traits/traits-multidispatch-convert-ambig-dest.stderr b/src/test/ui/traits/multidispatch-convert-ambig-dest.stderr similarity index 83% rename from src/test/ui/traits/traits-multidispatch-convert-ambig-dest.stderr rename to src/test/ui/traits/multidispatch-convert-ambig-dest.stderr index 338c8cbf2e..62f5f5aaa8 100644 --- a/src/test/ui/traits/traits-multidispatch-convert-ambig-dest.stderr +++ b/src/test/ui/traits/multidispatch-convert-ambig-dest.stderr @@ -1,5 +1,5 @@ error[E0282]: type annotations needed - --> $DIR/traits-multidispatch-convert-ambig-dest.rs:26:5 + --> $DIR/multidispatch-convert-ambig-dest.rs:26:5 | LL | test(22, std::default::Default::default()); | ^^^^ cannot infer type for type parameter `U` declared on the function `test` diff --git a/src/test/ui/traits/traits-multidispatch-infer-convert-target.rs b/src/test/ui/traits/multidispatch-infer-convert-target.rs similarity index 100% rename from src/test/ui/traits/traits-multidispatch-infer-convert-target.rs rename to src/test/ui/traits/multidispatch-infer-convert-target.rs diff --git a/src/test/ui/traits/trait-object-auto-dedup-in-impl.rs b/src/test/ui/traits/object/auto-dedup-in-impl.rs similarity index 100% rename from src/test/ui/traits/trait-object-auto-dedup-in-impl.rs rename to src/test/ui/traits/object/auto-dedup-in-impl.rs diff --git a/src/test/ui/traits/trait-object-auto-dedup-in-impl.stderr b/src/test/ui/traits/object/auto-dedup-in-impl.stderr similarity index 87% rename from src/test/ui/traits/trait-object-auto-dedup-in-impl.stderr rename to src/test/ui/traits/object/auto-dedup-in-impl.stderr index d10e58629c..5f13c78134 100644 --- a/src/test/ui/traits/trait-object-auto-dedup-in-impl.stderr +++ b/src/test/ui/traits/object/auto-dedup-in-impl.stderr @@ -1,5 +1,5 @@ error[E0592]: duplicate definitions with name `test` - --> $DIR/trait-object-auto-dedup-in-impl.rs:14:5 + --> $DIR/auto-dedup-in-impl.rs:14:5 | LL | fn test(&self) { println!("one"); } | ^^^^^^^^^^^^^^ duplicate definitions for `test` diff --git a/src/test/ui/traits/trait-object-auto-dedup.rs b/src/test/ui/traits/object/auto-dedup.rs similarity index 100% rename from src/test/ui/traits/trait-object-auto-dedup.rs rename to src/test/ui/traits/object/auto-dedup.rs diff --git a/src/test/ui/traits/trait-object-bounds-cycle-1.rs b/src/test/ui/traits/object/bounds-cycle-1.rs similarity index 100% rename from src/test/ui/traits/trait-object-bounds-cycle-1.rs rename to src/test/ui/traits/object/bounds-cycle-1.rs diff --git a/src/test/ui/traits/trait-object-bounds-cycle-2.rs b/src/test/ui/traits/object/bounds-cycle-2.rs similarity index 100% rename from src/test/ui/traits/trait-object-bounds-cycle-2.rs rename to src/test/ui/traits/object/bounds-cycle-2.rs diff --git a/src/test/ui/traits/trait-object-bounds-cycle-3.rs b/src/test/ui/traits/object/bounds-cycle-3.rs similarity index 100% rename from src/test/ui/traits/trait-object-bounds-cycle-3.rs rename to src/test/ui/traits/object/bounds-cycle-3.rs diff --git a/src/test/ui/traits/trait-object-bounds-cycle-4.rs b/src/test/ui/traits/object/bounds-cycle-4.rs similarity index 100% rename from src/test/ui/traits/trait-object-bounds-cycle-4.rs rename to src/test/ui/traits/object/bounds-cycle-4.rs diff --git a/src/test/ui/traits/trait-object-exclusion.rs b/src/test/ui/traits/object/exclusion.rs similarity index 100% rename from src/test/ui/traits/trait-object-exclusion.rs rename to src/test/ui/traits/object/exclusion.rs diff --git a/src/test/ui/traits/trait-object-generics.rs b/src/test/ui/traits/object/generics.rs similarity index 100% rename from src/test/ui/traits/trait-object-generics.rs rename to src/test/ui/traits/object/generics.rs diff --git a/src/test/ui/issues/issue-33140-traitobject-crate.rs b/src/test/ui/traits/object/issue-33140-traitobject-crate.rs similarity index 100% rename from src/test/ui/issues/issue-33140-traitobject-crate.rs rename to src/test/ui/traits/object/issue-33140-traitobject-crate.rs diff --git a/src/test/ui/issues/issue-33140-traitobject-crate.stderr b/src/test/ui/traits/object/issue-33140-traitobject-crate.stderr similarity index 100% rename from src/test/ui/issues/issue-33140-traitobject-crate.stderr rename to src/test/ui/traits/object/issue-33140-traitobject-crate.stderr diff --git a/src/test/ui/traits/trait-object-lifetime-first.rs b/src/test/ui/traits/object/lifetime-first.rs similarity index 100% rename from src/test/ui/traits/trait-object-lifetime-first.rs rename to src/test/ui/traits/object/lifetime-first.rs diff --git a/src/test/ui/traits/trait-object-macro-matcher.rs b/src/test/ui/traits/object/macro-matcher.rs similarity index 100% rename from src/test/ui/traits/trait-object-macro-matcher.rs rename to src/test/ui/traits/object/macro-matcher.rs diff --git a/src/test/ui/traits/trait-object-macro-matcher.stderr b/src/test/ui/traits/object/macro-matcher.stderr similarity index 89% rename from src/test/ui/traits/trait-object-macro-matcher.stderr rename to src/test/ui/traits/object/macro-matcher.stderr index 335eeb8f15..6d1e236c04 100644 --- a/src/test/ui/traits/trait-object-macro-matcher.stderr +++ b/src/test/ui/traits/object/macro-matcher.stderr @@ -1,11 +1,11 @@ error[E0224]: at least one trait is required for an object type - --> $DIR/trait-object-macro-matcher.rs:11:8 + --> $DIR/macro-matcher.rs:11:8 | LL | m!(dyn 'static +); | ^^^^^^^^^^^^^ error[E0038]: the trait `Copy` cannot be made into an object - --> $DIR/trait-object-macro-matcher.rs:8:8 + --> $DIR/macro-matcher.rs:8:8 | LL | m!(dyn Copy + Send + 'static); | ^^^^^^^^^^^^^^^^^^^^^^^^^ `Copy` cannot be made into an object diff --git a/src/test/ui/traits/trait-object-safety.rs b/src/test/ui/traits/object/safety.rs similarity index 100% rename from src/test/ui/traits/trait-object-safety.rs rename to src/test/ui/traits/object/safety.rs diff --git a/src/test/ui/traits/trait-object-safety.stderr b/src/test/ui/traits/object/safety.stderr similarity index 92% rename from src/test/ui/traits/trait-object-safety.stderr rename to src/test/ui/traits/object/safety.stderr index 16f60962cc..6784689072 100644 --- a/src/test/ui/traits/trait-object-safety.stderr +++ b/src/test/ui/traits/object/safety.stderr @@ -1,11 +1,11 @@ error[E0038]: the trait `Tr` cannot be made into an object - --> $DIR/trait-object-safety.rs:15:22 + --> $DIR/safety.rs:15:22 | LL | let _: &dyn Tr = &St; | ^^^ `Tr` cannot be made into an object | note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit - --> $DIR/trait-object-safety.rs:4:8 + --> $DIR/safety.rs:4:8 | LL | trait Tr { | -- this trait cannot be made into an object... @@ -23,13 +23,13 @@ LL | fn foo() where Self: Sized; | ^^^^^^^^^^^^^^^^^ error[E0038]: the trait `Tr` cannot be made into an object - --> $DIR/trait-object-safety.rs:15:12 + --> $DIR/safety.rs:15:12 | LL | let _: &dyn Tr = &St; | ^^^^^^^ `Tr` cannot be made into an object | note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit - --> $DIR/trait-object-safety.rs:4:8 + --> $DIR/safety.rs:4:8 | LL | trait Tr { | -- this trait cannot be made into an object... diff --git a/src/test/ui/traits/trait-object-supertrait-lifetime-bound.rs b/src/test/ui/traits/object/supertrait-lifetime-bound.rs similarity index 100% rename from src/test/ui/traits/trait-object-supertrait-lifetime-bound.rs rename to src/test/ui/traits/object/supertrait-lifetime-bound.rs diff --git a/src/test/ui/traits/trait-object-vs-lifetime-2.rs b/src/test/ui/traits/object/vs-lifetime-2.rs similarity index 100% rename from src/test/ui/traits/trait-object-vs-lifetime-2.rs rename to src/test/ui/traits/object/vs-lifetime-2.rs diff --git a/src/test/ui/traits/trait-object-vs-lifetime-2.stderr b/src/test/ui/traits/object/vs-lifetime-2.stderr similarity index 84% rename from src/test/ui/traits/trait-object-vs-lifetime-2.stderr rename to src/test/ui/traits/object/vs-lifetime-2.stderr index 28b8e11f13..9b8e793dfd 100644 --- a/src/test/ui/traits/trait-object-vs-lifetime-2.stderr +++ b/src/test/ui/traits/object/vs-lifetime-2.stderr @@ -1,5 +1,5 @@ error[E0224]: at least one trait is required for an object type - --> $DIR/trait-object-vs-lifetime-2.rs:7:5 + --> $DIR/vs-lifetime-2.rs:7:5 | LL | dyn 'static +: 'static + Copy, | ^^^^^^^^^^^^^ diff --git a/src/test/ui/traits/trait-object-vs-lifetime.rs b/src/test/ui/traits/object/vs-lifetime.rs similarity index 100% rename from src/test/ui/traits/trait-object-vs-lifetime.rs rename to src/test/ui/traits/object/vs-lifetime.rs diff --git a/src/test/ui/traits/trait-object-vs-lifetime.stderr b/src/test/ui/traits/object/vs-lifetime.stderr similarity index 81% rename from src/test/ui/traits/trait-object-vs-lifetime.stderr rename to src/test/ui/traits/object/vs-lifetime.stderr index 620c816d6d..6673472e4a 100644 --- a/src/test/ui/traits/trait-object-vs-lifetime.stderr +++ b/src/test/ui/traits/object/vs-lifetime.stderr @@ -1,11 +1,11 @@ error[E0224]: at least one trait is required for an object type - --> $DIR/trait-object-vs-lifetime.rs:9:23 + --> $DIR/vs-lifetime.rs:9:23 | LL | let _: S<'static, dyn 'static +>; | ^^^^^^^^^^^^^ error[E0107]: this struct takes 1 lifetime argument but 2 lifetime arguments were supplied - --> $DIR/trait-object-vs-lifetime.rs:11:12 + --> $DIR/vs-lifetime.rs:11:12 | LL | let _: S<'static, 'static>; | ^ --------- help: remove this lifetime argument @@ -13,19 +13,19 @@ LL | let _: S<'static, 'static>; | expected 1 lifetime argument | note: struct defined here, with 1 lifetime parameter: `'a` - --> $DIR/trait-object-vs-lifetime.rs:4:8 + --> $DIR/vs-lifetime.rs:4:8 | LL | struct S<'a, T>(&'a u8, T); | ^ -- error[E0107]: this struct takes 1 type argument but 0 type arguments were supplied - --> $DIR/trait-object-vs-lifetime.rs:11:12 + --> $DIR/vs-lifetime.rs:11:12 | LL | let _: S<'static, 'static>; | ^ expected 1 type argument | note: struct defined here, with 1 type parameter: `T` - --> $DIR/trait-object-vs-lifetime.rs:4:8 + --> $DIR/vs-lifetime.rs:4:8 | LL | struct S<'a, T>(&'a u8, T); | ^ - @@ -35,13 +35,13 @@ LL | let _: S<'static, 'static, T>; | ^^^ error[E0224]: at least one trait is required for an object type - --> $DIR/trait-object-vs-lifetime.rs:14:14 + --> $DIR/vs-lifetime.rs:14:14 | LL | let _: S; | ^^^^^^^^^^^^^ error[E0747]: type provided when a lifetime was expected - --> $DIR/trait-object-vs-lifetime.rs:14:14 + --> $DIR/vs-lifetime.rs:14:14 | LL | let _: S; | ^^^^^^^^^^^^^ diff --git a/src/test/ui/traits/trait-object-with-lifetime-bound.rs b/src/test/ui/traits/object/with-lifetime-bound.rs similarity index 100% rename from src/test/ui/traits/trait-object-with-lifetime-bound.rs rename to src/test/ui/traits/object/with-lifetime-bound.rs diff --git a/src/test/ui/traits/trait-object-with-self-in-projection-output-bad.rs b/src/test/ui/traits/object/with-self-in-projection-output-bad.rs similarity index 100% rename from src/test/ui/traits/trait-object-with-self-in-projection-output-bad.rs rename to src/test/ui/traits/object/with-self-in-projection-output-bad.rs diff --git a/src/test/ui/traits/trait-object-with-self-in-projection-output-bad.stderr b/src/test/ui/traits/object/with-self-in-projection-output-bad.stderr similarity index 86% rename from src/test/ui/traits/trait-object-with-self-in-projection-output-bad.stderr rename to src/test/ui/traits/object/with-self-in-projection-output-bad.stderr index 79eb27e101..45978a8406 100644 --- a/src/test/ui/traits/trait-object-with-self-in-projection-output-bad.stderr +++ b/src/test/ui/traits/object/with-self-in-projection-output-bad.stderr @@ -1,5 +1,5 @@ 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 + --> $DIR/with-self-in-projection-output-bad.rs:45:21 | LL | type Output; | ------------ `Output` defined here @@ -8,7 +8,7 @@ LL | let _x: Box> = Box::new(2u32); | ^^^^^^^^^^^^^^^^^^ help: specify the associated type: `Helper` 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 + --> $DIR/with-self-in-projection-output-bad.rs:48:21 | LL | type Output; | ------------ `Output` defined here diff --git a/src/test/ui/traits/trait-object-with-self-in-projection-output-good.rs b/src/test/ui/traits/object/with-self-in-projection-output-good.rs similarity index 100% rename from src/test/ui/traits/trait-object-with-self-in-projection-output-good.rs rename to src/test/ui/traits/object/with-self-in-projection-output-good.rs diff --git a/src/test/ui/traits/trait-object-with-self-in-projection-output-repeated-supertrait.rs b/src/test/ui/traits/object/with-self-in-projection-output-repeated-supertrait.rs similarity index 100% rename from src/test/ui/traits/trait-object-with-self-in-projection-output-repeated-supertrait.rs rename to src/test/ui/traits/object/with-self-in-projection-output-repeated-supertrait.rs diff --git a/src/test/ui/traits/trait-param-without-lifetime-constraint.rs b/src/test/ui/traits/param-without-lifetime-constraint.rs similarity index 100% rename from src/test/ui/traits/trait-param-without-lifetime-constraint.rs rename to src/test/ui/traits/param-without-lifetime-constraint.rs diff --git a/src/test/ui/traits/trait-param-without-lifetime-constraint.stderr b/src/test/ui/traits/param-without-lifetime-constraint.stderr similarity index 85% rename from src/test/ui/traits/trait-param-without-lifetime-constraint.stderr rename to src/test/ui/traits/param-without-lifetime-constraint.stderr index 4942dbe480..763fb5186c 100644 --- a/src/test/ui/traits/trait-param-without-lifetime-constraint.stderr +++ b/src/test/ui/traits/param-without-lifetime-constraint.stderr @@ -1,5 +1,5 @@ error: `impl` item signature doesn't match `trait` item signature - --> $DIR/trait-param-without-lifetime-constraint.rs:14:5 + --> $DIR/param-without-lifetime-constraint.rs:14:5 | LL | fn get_relation(&self) -> To; | ----------------------------- expected `fn(&Article) -> &ProofReader` @@ -10,7 +10,7 @@ LL | fn get_relation(&self) -> &ProofReader { = note: expected `fn(&Article) -> &ProofReader` found `fn(&Article) -> &ProofReader` help: the lifetime requirements from the `impl` do not correspond to the requirements in the `trait` - --> $DIR/trait-param-without-lifetime-constraint.rs:10:31 + --> $DIR/param-without-lifetime-constraint.rs:10:31 | LL | fn get_relation(&self) -> To; | ^^ consider borrowing this type parameter in the trait diff --git a/src/test/ui/traits/parameterized-trait-with-bounds.rs b/src/test/ui/traits/parameterized-with-bounds.rs similarity index 100% rename from src/test/ui/traits/parameterized-trait-with-bounds.rs rename to src/test/ui/traits/parameterized-with-bounds.rs diff --git a/src/test/ui/traits/principal-less-trait-objects.rs b/src/test/ui/traits/principal-less-objects.rs similarity index 100% rename from src/test/ui/traits/principal-less-trait-objects.rs rename to src/test/ui/traits/principal-less-objects.rs diff --git a/src/test/ui/traits/trait-privacy.rs b/src/test/ui/traits/privacy.rs similarity index 100% rename from src/test/ui/traits/trait-privacy.rs rename to src/test/ui/traits/privacy.rs diff --git a/src/test/ui/traits/trait-region-pointer-simple.rs b/src/test/ui/traits/region-pointer-simple.rs similarity index 100% rename from src/test/ui/traits/trait-region-pointer-simple.rs rename to src/test/ui/traits/region-pointer-simple.rs diff --git a/src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.rs b/src/test/ui/traits/reservation-impl/coherence-conflict.rs similarity index 100% rename from src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.rs rename to src/test/ui/traits/reservation-impl/coherence-conflict.rs diff --git a/src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.stderr b/src/test/ui/traits/reservation-impl/coherence-conflict.stderr similarity index 88% rename from src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.stderr rename to src/test/ui/traits/reservation-impl/coherence-conflict.stderr index d76d3a91c8..1a227a85c0 100644 --- a/src/test/ui/traits/reservation-impls/reservation-impl-coherence-conflict.stderr +++ b/src/test/ui/traits/reservation-impl/coherence-conflict.stderr @@ -1,5 +1,5 @@ error[E0119]: conflicting implementations of trait `OtherTrait` for type `()`: - --> $DIR/reservation-impl-coherence-conflict.rs:11:1 + --> $DIR/coherence-conflict.rs:11:1 | LL | impl OtherTrait for () {} | ---------------------- first implementation here diff --git a/src/test/ui/traits/reservation-impls/reservation-impl-no-use.rs b/src/test/ui/traits/reservation-impl/no-use.rs similarity index 100% rename from src/test/ui/traits/reservation-impls/reservation-impl-no-use.rs rename to src/test/ui/traits/reservation-impl/no-use.rs diff --git a/src/test/ui/traits/reservation-impls/reservation-impl-no-use.stderr b/src/test/ui/traits/reservation-impl/no-use.stderr similarity index 91% rename from src/test/ui/traits/reservation-impls/reservation-impl-no-use.stderr rename to src/test/ui/traits/reservation-impl/no-use.stderr index 794faff884..fb4a443435 100644 --- a/src/test/ui/traits/reservation-impls/reservation-impl-no-use.stderr +++ b/src/test/ui/traits/reservation-impl/no-use.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `(): MyTrait` is not satisfied - --> $DIR/reservation-impl-no-use.rs:10:26 + --> $DIR/no-use.rs:10:26 | LL | trait MyTrait { fn foo(&self); } | -------------- required by `MyTrait::foo` diff --git a/src/test/ui/traits/reservation-impls/reservation-impl-non-lattice-ok.rs b/src/test/ui/traits/reservation-impl/non-lattice-ok.rs similarity index 100% rename from src/test/ui/traits/reservation-impls/reservation-impl-non-lattice-ok.rs rename to src/test/ui/traits/reservation-impl/non-lattice-ok.rs diff --git a/src/test/ui/traits/reservation-impls/reservation-impl-ok.rs b/src/test/ui/traits/reservation-impl/ok.rs similarity index 100% rename from src/test/ui/traits/reservation-impls/reservation-impl-ok.rs rename to src/test/ui/traits/reservation-impl/ok.rs diff --git a/src/test/ui/traits/trait-resolution-in-overloaded-op.rs b/src/test/ui/traits/resolution-in-overloaded-op.rs similarity index 100% rename from src/test/ui/traits/trait-resolution-in-overloaded-op.rs rename to src/test/ui/traits/resolution-in-overloaded-op.rs diff --git a/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr b/src/test/ui/traits/resolution-in-overloaded-op.stderr similarity index 88% rename from src/test/ui/traits/trait-resolution-in-overloaded-op.stderr rename to src/test/ui/traits/resolution-in-overloaded-op.stderr index ada76cd8b7..6a641ed214 100644 --- a/src/test/ui/traits/trait-resolution-in-overloaded-op.stderr +++ b/src/test/ui/traits/resolution-in-overloaded-op.stderr @@ -1,5 +1,5 @@ error[E0369]: cannot multiply `&T` by `f64` - --> $DIR/trait-resolution-in-overloaded-op.rs:8:7 + --> $DIR/resolution-in-overloaded-op.rs:8:7 | LL | a * b | - ^ - f64 diff --git a/src/test/ui/traits/trait-safety-fn-body.rs b/src/test/ui/traits/safety-fn-body.rs similarity index 100% rename from src/test/ui/traits/trait-safety-fn-body.rs rename to src/test/ui/traits/safety-fn-body.rs diff --git a/src/test/ui/traits/trait-safety-fn-body.stderr b/src/test/ui/traits/safety-fn-body.stderr similarity index 91% rename from src/test/ui/traits/trait-safety-fn-body.stderr rename to src/test/ui/traits/safety-fn-body.stderr index a27cd869da..4f784a020d 100644 --- a/src/test/ui/traits/trait-safety-fn-body.stderr +++ b/src/test/ui/traits/safety-fn-body.stderr @@ -1,5 +1,5 @@ error[E0133]: dereference of raw pointer is unsafe and requires unsafe function or block - --> $DIR/trait-safety-fn-body.rs:11:9 + --> $DIR/safety-fn-body.rs:11:9 | LL | *self += 1; | ^^^^^^^^^^ dereference of raw pointer diff --git a/src/test/ui/traits/trait-safety-inherent-impl.rs b/src/test/ui/traits/safety-inherent-impl.rs similarity index 100% rename from src/test/ui/traits/trait-safety-inherent-impl.rs rename to src/test/ui/traits/safety-inherent-impl.rs diff --git a/src/test/ui/traits/trait-safety-inherent-impl.stderr b/src/test/ui/traits/safety-inherent-impl.stderr similarity index 85% rename from src/test/ui/traits/trait-safety-inherent-impl.stderr rename to src/test/ui/traits/safety-inherent-impl.stderr index 0738d2973e..1c8f43feca 100644 --- a/src/test/ui/traits/trait-safety-inherent-impl.stderr +++ b/src/test/ui/traits/safety-inherent-impl.stderr @@ -1,5 +1,5 @@ error[E0197]: inherent impls cannot be unsafe - --> $DIR/trait-safety-inherent-impl.rs:5:13 + --> $DIR/safety-inherent-impl.rs:5:13 | LL | unsafe impl SomeStruct { | ------ ^^^^^^^^^^ inherent impl for this type diff --git a/src/test/ui/traits/trait-safety-ok-cc.rs b/src/test/ui/traits/safety-ok-cc.rs similarity index 100% rename from src/test/ui/traits/trait-safety-ok-cc.rs rename to src/test/ui/traits/safety-ok-cc.rs diff --git a/src/test/ui/traits/trait-safety-ok.rs b/src/test/ui/traits/safety-ok.rs similarity index 100% rename from src/test/ui/traits/trait-safety-ok.rs rename to src/test/ui/traits/safety-ok.rs diff --git a/src/test/ui/traits/trait-safety-trait-impl-cc.rs b/src/test/ui/traits/safety-trait-impl-cc.rs similarity index 100% rename from src/test/ui/traits/trait-safety-trait-impl-cc.rs rename to src/test/ui/traits/safety-trait-impl-cc.rs diff --git a/src/test/ui/traits/trait-safety-trait-impl-cc.stderr b/src/test/ui/traits/safety-trait-impl-cc.stderr similarity index 87% rename from src/test/ui/traits/trait-safety-trait-impl-cc.stderr rename to src/test/ui/traits/safety-trait-impl-cc.stderr index 2fcedc5cc5..5a0f8d3b8c 100644 --- a/src/test/ui/traits/trait-safety-trait-impl-cc.stderr +++ b/src/test/ui/traits/safety-trait-impl-cc.stderr @@ -1,5 +1,5 @@ error[E0200]: the trait `Foo` requires an `unsafe impl` declaration - --> $DIR/trait-safety-trait-impl-cc.rs:9:1 + --> $DIR/safety-trait-impl-cc.rs:9:1 | LL | / impl lib::Foo for Bar { LL | | fn foo(&self) -> isize { diff --git a/src/test/ui/traits/trait-safety-trait-impl.rs b/src/test/ui/traits/safety-trait-impl.rs similarity index 100% rename from src/test/ui/traits/trait-safety-trait-impl.rs rename to src/test/ui/traits/safety-trait-impl.rs diff --git a/src/test/ui/traits/trait-safety-trait-impl.stderr b/src/test/ui/traits/safety-trait-impl.stderr similarity index 84% rename from src/test/ui/traits/trait-safety-trait-impl.stderr rename to src/test/ui/traits/safety-trait-impl.stderr index 5b29fd12ab..fc0f6c6930 100644 --- a/src/test/ui/traits/trait-safety-trait-impl.stderr +++ b/src/test/ui/traits/safety-trait-impl.stderr @@ -1,11 +1,11 @@ error[E0200]: the trait `UnsafeTrait` requires an `unsafe impl` declaration - --> $DIR/trait-safety-trait-impl.rs:14:1 + --> $DIR/safety-trait-impl.rs:14:1 | LL | impl UnsafeTrait for u16 { } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0199]: implementing the trait `SafeTrait` is not unsafe - --> $DIR/trait-safety-trait-impl.rs:16:1 + --> $DIR/safety-trait-impl.rs:16:1 | LL | unsafe impl SafeTrait for u32 { } | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/traits/self-without-lifetime-constraint.stderr b/src/test/ui/traits/self-without-lifetime-constraint.stderr index 6c7abe753e..73b5aec022 100644 --- a/src/test/ui/traits/self-without-lifetime-constraint.stderr +++ b/src/test/ui/traits/self-without-lifetime-constraint.stderr @@ -2,13 +2,13 @@ error: `impl` item signature doesn't match `trait` item signature --> $DIR/self-without-lifetime-constraint.rs:45:5 | LL | fn column_result(value: ValueRef<'_>) -> FromSqlResult; - | -------------------------------------------------------------------- expected `fn(ValueRef<'_>) -> std::result::Result<(&str, &&str), FromSqlError>` + | -------------------------------------------------------------------- expected `fn(ValueRef<'_>) -> Result<(&str, &&str), FromSqlError>` ... LL | fn column_result(value: ValueRef<'_>) -> FromSqlResult<&str, &&str> { - | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found `fn(ValueRef<'_>) -> std::result::Result<(&str, &&str), FromSqlError>` + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ found `fn(ValueRef<'_>) -> Result<(&str, &&str), FromSqlError>` | - = note: expected `fn(ValueRef<'_>) -> std::result::Result<(&str, &&str), _>` - found `fn(ValueRef<'_>) -> std::result::Result<(&str, &&str), _>` + = note: expected `fn(ValueRef<'_>) -> Result<(&str, &&str), _>` + found `fn(ValueRef<'_>) -> Result<(&str, &&str), _>` help: the lifetime requirements from the `impl` do not correspond to the requirements in the `trait` --> $DIR/self-without-lifetime-constraint.rs:41:60 | diff --git a/src/test/ui/traits/trait-static-method-generic-inference.rs b/src/test/ui/traits/static-method-generic-inference.rs similarity index 100% rename from src/test/ui/traits/trait-static-method-generic-inference.rs rename to src/test/ui/traits/static-method-generic-inference.rs diff --git a/src/test/ui/traits/trait-static-method-generic-inference.stderr b/src/test/ui/traits/static-method-generic-inference.stderr similarity index 87% rename from src/test/ui/traits/trait-static-method-generic-inference.stderr rename to src/test/ui/traits/static-method-generic-inference.stderr index 6a7e8f59d8..2b9ce7321e 100644 --- a/src/test/ui/traits/trait-static-method-generic-inference.stderr +++ b/src/test/ui/traits/static-method-generic-inference.stderr @@ -1,5 +1,5 @@ error[E0283]: type annotations needed - --> $DIR/trait-static-method-generic-inference.rs:24:25 + --> $DIR/static-method-generic-inference.rs:24:25 | LL | fn new() -> T; | -------------- required by `HasNew::new` diff --git a/src/test/ui/traits/trait-static-method-overwriting.rs b/src/test/ui/traits/static-method-overwriting.rs similarity index 100% rename from src/test/ui/traits/trait-static-method-overwriting.rs rename to src/test/ui/traits/static-method-overwriting.rs diff --git a/src/test/ui/traits/traits-static-outlives-a-where-clause.rs b/src/test/ui/traits/static-outlives-a-where-clause.rs similarity index 100% rename from src/test/ui/traits/traits-static-outlives-a-where-clause.rs rename to src/test/ui/traits/static-outlives-a-where-clause.rs diff --git a/src/test/ui/traits/trait-suggest-deferences-issue-39029.fixed b/src/test/ui/traits/suggest-deferences/issue-39029.fixed similarity index 100% rename from src/test/ui/traits/trait-suggest-deferences-issue-39029.fixed rename to src/test/ui/traits/suggest-deferences/issue-39029.fixed diff --git a/src/test/ui/traits/trait-suggest-deferences-issue-39029.rs b/src/test/ui/traits/suggest-deferences/issue-39029.rs similarity index 100% rename from src/test/ui/traits/trait-suggest-deferences-issue-39029.rs rename to src/test/ui/traits/suggest-deferences/issue-39029.rs diff --git a/src/test/ui/traits/trait-suggest-deferences-issue-39029.stderr b/src/test/ui/traits/suggest-deferences/issue-39029.stderr similarity index 93% rename from src/test/ui/traits/trait-suggest-deferences-issue-39029.stderr rename to src/test/ui/traits/suggest-deferences/issue-39029.stderr index 4273b8e3f3..1005231d39 100644 --- a/src/test/ui/traits/trait-suggest-deferences-issue-39029.stderr +++ b/src/test/ui/traits/suggest-deferences/issue-39029.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `NoToSocketAddrs: ToSocketAddrs` is not satisfied - --> $DIR/trait-suggest-deferences-issue-39029.rs:16:37 + --> $DIR/issue-39029.rs:16:37 | LL | let _errors = TcpListener::bind(&bad); | ^^^^ diff --git a/src/test/ui/traits/trait-suggest-deferences-issue-62530.fixed b/src/test/ui/traits/suggest-deferences/issue-62530.fixed similarity index 100% rename from src/test/ui/traits/trait-suggest-deferences-issue-62530.fixed rename to src/test/ui/traits/suggest-deferences/issue-62530.fixed diff --git a/src/test/ui/traits/trait-suggest-deferences-issue-62530.rs b/src/test/ui/traits/suggest-deferences/issue-62530.rs similarity index 100% rename from src/test/ui/traits/trait-suggest-deferences-issue-62530.rs rename to src/test/ui/traits/suggest-deferences/issue-62530.rs diff --git a/src/test/ui/traits/trait-suggest-deferences-issue-62530.stderr b/src/test/ui/traits/suggest-deferences/issue-62530.stderr similarity index 91% rename from src/test/ui/traits/trait-suggest-deferences-issue-62530.stderr rename to src/test/ui/traits/suggest-deferences/issue-62530.stderr index eaec87d01d..4f1165b17c 100644 --- a/src/test/ui/traits/trait-suggest-deferences-issue-62530.stderr +++ b/src/test/ui/traits/suggest-deferences/issue-62530.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `&String: SomeTrait` is not satisfied - --> $DIR/trait-suggest-deferences-issue-62530.rs:13:26 + --> $DIR/issue-62530.rs:13:26 | LL | fn takes_type_parameter(_x: T) where T: SomeTrait {} | --------- required by this bound in `takes_type_parameter` diff --git a/src/test/ui/traits/trait-suggest-deferences-multiple-0.fixed b/src/test/ui/traits/suggest-deferences/multiple-0.fixed similarity index 100% rename from src/test/ui/traits/trait-suggest-deferences-multiple-0.fixed rename to src/test/ui/traits/suggest-deferences/multiple-0.fixed diff --git a/src/test/ui/traits/trait-suggest-deferences-multiple-0.rs b/src/test/ui/traits/suggest-deferences/multiple-0.rs similarity index 100% rename from src/test/ui/traits/trait-suggest-deferences-multiple-0.rs rename to src/test/ui/traits/suggest-deferences/multiple-0.rs diff --git a/src/test/ui/traits/trait-suggest-deferences-multiple-0.stderr b/src/test/ui/traits/suggest-deferences/multiple-0.stderr similarity index 89% rename from src/test/ui/traits/trait-suggest-deferences-multiple-0.stderr rename to src/test/ui/traits/suggest-deferences/multiple-0.stderr index add34a553b..f76c73cbb6 100644 --- a/src/test/ui/traits/trait-suggest-deferences-multiple-0.stderr +++ b/src/test/ui/traits/suggest-deferences/multiple-0.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `&Baz: Happy` is not satisfied - --> $DIR/trait-suggest-deferences-multiple-0.rs:34:9 + --> $DIR/multiple-0.rs:34:9 | LL | fn foo(_: T) where T: Happy {} | ----- required by this bound in `foo` diff --git a/src/test/ui/traits/trait-suggest-deferences-multiple-1.rs b/src/test/ui/traits/suggest-deferences/multiple-1.rs similarity index 100% rename from src/test/ui/traits/trait-suggest-deferences-multiple-1.rs rename to src/test/ui/traits/suggest-deferences/multiple-1.rs diff --git a/src/test/ui/traits/trait-suggest-deferences-multiple-1.stderr b/src/test/ui/traits/suggest-deferences/multiple-1.stderr similarity index 87% rename from src/test/ui/traits/trait-suggest-deferences-multiple-1.stderr rename to src/test/ui/traits/suggest-deferences/multiple-1.stderr index e90278fa16..f98cc54227 100644 --- a/src/test/ui/traits/trait-suggest-deferences-multiple-1.stderr +++ b/src/test/ui/traits/suggest-deferences/multiple-1.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `&mut Baz: Happy` is not satisfied - --> $DIR/trait-suggest-deferences-multiple-1.rs:52:9 + --> $DIR/multiple-1.rs:52:9 | LL | fn foo(_: T) where T: Happy {} | ----- required by this bound in `foo` diff --git a/src/test/ui/traits/trait-suggest-where-clause.rs b/src/test/ui/traits/suggest-where-clause.rs similarity index 100% rename from src/test/ui/traits/trait-suggest-where-clause.rs rename to src/test/ui/traits/suggest-where-clause.rs diff --git a/src/test/ui/traits/trait-suggest-where-clause.stderr b/src/test/ui/traits/suggest-where-clause.stderr similarity index 77% rename from src/test/ui/traits/trait-suggest-where-clause.stderr rename to src/test/ui/traits/suggest-where-clause.stderr index 0f6f8d75c5..86d589ffa9 100644 --- a/src/test/ui/traits/trait-suggest-where-clause.stderr +++ b/src/test/ui/traits/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:7:20 + --> $DIR/suggest-where-clause.rs:7:20 | LL | fn check() { | - this type parameter needs to be `Sized` @@ -13,7 +13,7 @@ LL | pub const fn size_of() -> usize { | - required by this bound in `std::mem::size_of` error[E0277]: the size for values of type `U` cannot be known at compilation time - --> $DIR/trait-suggest-where-clause.rs:10:5 + --> $DIR/suggest-where-clause.rs:10:5 | LL | fn check() { | - this type parameter needs to be `Sized` @@ -29,23 +29,31 @@ LL | pub const fn size_of() -> usize { = note: required because it appears within the type `Misc` error[E0277]: the trait bound `u64: From` is not satisfied - --> $DIR/trait-suggest-where-clause.rs:15:5 + --> $DIR/suggest-where-clause.rs:15:5 | LL | >::from; | ^^^^^^^^^^^^^^^^^^^^^^ the trait `From` is not implemented for `u64` | = note: required by `from` +help: consider introducing a `where` bound, but there might be an alternative better way to express this requirement + | +LL | fn check() where u64: From { + | ^^^^^^^^^^^^^^^^^^ error[E0277]: the trait bound `u64: From<::Item>` is not satisfied - --> $DIR/trait-suggest-where-clause.rs:18:5 + --> $DIR/suggest-where-clause.rs:18:5 | LL | ::Item>>::from; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `From<::Item>` is not implemented for `u64` | = note: required by `from` +help: consider introducing a `where` bound, but there might be an alternative better way to express this requirement + | +LL | fn check() where u64: From<::Item> { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0277]: the trait bound `Misc<_>: From` is not satisfied - --> $DIR/trait-suggest-where-clause.rs:23:5 + --> $DIR/suggest-where-clause.rs:23:5 | LL | as From>::from; | ^^^^^^^^^^^^^^^^^^^^^^^^^^ the trait `From` is not implemented for `Misc<_>` @@ -53,7 +61,7 @@ LL | as From>::from; = note: required by `from` error[E0277]: the size for values of type `[T]` cannot be known at compilation time - --> $DIR/trait-suggest-where-clause.rs:28:20 + --> $DIR/suggest-where-clause.rs:28:20 | LL | mem::size_of::<[T]>(); | ^^^ doesn't have a size known at compile-time @@ -66,7 +74,7 @@ LL | pub const fn size_of() -> usize { = help: the trait `Sized` is not implemented for `[T]` error[E0277]: the size for values of type `[&U]` cannot be known at compilation time - --> $DIR/trait-suggest-where-clause.rs:31:5 + --> $DIR/suggest-where-clause.rs:31:5 | LL | mem::size_of::<[&U]>(); | ^^^^^^^^^^^^^^^^^^^^ doesn't have a size known at compile-time diff --git a/src/test/ui/traits/supertrait-default-generics.rs b/src/test/ui/traits/superdefault-generics.rs similarity index 100% rename from src/test/ui/traits/supertrait-default-generics.rs rename to src/test/ui/traits/superdefault-generics.rs diff --git a/src/test/ui/traits/syntax-trait-polarity.rs b/src/test/ui/traits/syntax-polarity.rs similarity index 100% rename from src/test/ui/traits/syntax-trait-polarity.rs rename to src/test/ui/traits/syntax-polarity.rs diff --git a/src/test/ui/traits/trait-test-2.rs b/src/test/ui/traits/test-2.rs similarity index 100% rename from src/test/ui/traits/trait-test-2.rs rename to src/test/ui/traits/test-2.rs diff --git a/src/test/ui/traits/trait-test-2.stderr b/src/test/ui/traits/test-2.stderr similarity index 91% rename from src/test/ui/traits/trait-test-2.stderr rename to src/test/ui/traits/test-2.stderr index a38d3387c8..12b55c3a4f 100644 --- a/src/test/ui/traits/trait-test-2.stderr +++ b/src/test/ui/traits/test-2.stderr @@ -1,5 +1,5 @@ error[E0107]: this associated function takes 0 type arguments but 1 type argument was supplied - --> $DIR/trait-test-2.rs:9:8 + --> $DIR/test-2.rs:9:8 | LL | 10.dup::(); | ^^^------- help: remove these generics @@ -7,13 +7,13 @@ LL | 10.dup::(); | expected 0 type arguments | note: associated function defined here, with 0 type parameters - --> $DIR/trait-test-2.rs:4:16 + --> $DIR/test-2.rs:4:16 | LL | trait bar { fn dup(&self) -> Self; fn blah(&self); } | ^^^ error[E0107]: this associated function takes 1 type argument but 2 type arguments were supplied - --> $DIR/trait-test-2.rs:11:8 + --> $DIR/test-2.rs:11:8 | LL | 10.blah::(); | ^^^^ ----- help: remove this type argument @@ -21,13 +21,13 @@ LL | 10.blah::(); | expected 1 type argument | note: associated function defined here, with 1 type parameter: `X` - --> $DIR/trait-test-2.rs:4:39 + --> $DIR/test-2.rs:4:39 | LL | trait bar { fn dup(&self) -> Self; fn blah(&self); } | ^^^^ - error[E0038]: the trait `bar` cannot be made into an object - --> $DIR/trait-test-2.rs:13:16 + --> $DIR/test-2.rs:13:16 | LL | (box 10 as Box).dup(); | ^^^^^^^^^^^^ `bar` cannot be made into an object @@ -35,7 +35,7 @@ LL | (box 10 as Box).dup(); = help: consider moving `dup` to another trait = help: consider moving `blah` to another trait note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit - --> $DIR/trait-test-2.rs:4:30 + --> $DIR/test-2.rs:4:30 | LL | trait bar { fn dup(&self) -> Self; fn blah(&self); } | --- ^^^^ ^^^^ ...because method `blah` has generic type parameters @@ -44,7 +44,7 @@ LL | trait bar { fn dup(&self) -> Self; fn blah(&self); } | this trait cannot be made into an object... error[E0038]: the trait `bar` cannot be made into an object - --> $DIR/trait-test-2.rs:13:6 + --> $DIR/test-2.rs:13:6 | LL | (box 10 as Box).dup(); | ^^^^^^ `bar` cannot be made into an object @@ -52,7 +52,7 @@ LL | (box 10 as Box).dup(); = help: consider moving `dup` to another trait = help: consider moving `blah` to another trait note: for a trait to be "object safe" it needs to allow building a vtable to allow the call to be resolvable dynamically; for more information visit - --> $DIR/trait-test-2.rs:4:30 + --> $DIR/test-2.rs:4:30 | LL | trait bar { fn dup(&self) -> Self; fn blah(&self); } | --- ^^^^ ^^^^ ...because method `blah` has generic type parameters diff --git a/src/test/ui/traits/trait-test.rs b/src/test/ui/traits/test.rs similarity index 100% rename from src/test/ui/traits/trait-test.rs rename to src/test/ui/traits/test.rs diff --git a/src/test/ui/traits/trait-test.stderr b/src/test/ui/traits/test.stderr similarity index 89% rename from src/test/ui/traits/trait-test.stderr rename to src/test/ui/traits/test.stderr index f5e47e5152..668228abe0 100644 --- a/src/test/ui/traits/trait-test.stderr +++ b/src/test/ui/traits/test.stderr @@ -1,5 +1,5 @@ error[E0404]: expected trait, found builtin type `isize` - --> $DIR/trait-test.rs:4:6 + --> $DIR/test.rs:4:6 | LL | impl isize for usize { fn foo(&self) {} } | ^^^^^ not a trait diff --git a/src/test/ui/traits/trait-to-str.rs b/src/test/ui/traits/to-str.rs similarity index 100% rename from src/test/ui/traits/trait-to-str.rs rename to src/test/ui/traits/to-str.rs diff --git a/src/test/ui/traits/trait-bounds-on-structs-and-enums-xc.rs b/src/test/ui/traits/trait-bounds-on-structs-and-enums-xc.rs deleted file mode 100644 index 901a2c4391..0000000000 --- a/src/test/ui/traits/trait-bounds-on-structs-and-enums-xc.rs +++ /dev/null @@ -1,14 +0,0 @@ -// aux-build:trait_bounds_on_structs_and_enums_xc.rs - -extern crate trait_bounds_on_structs_and_enums_xc; - -use trait_bounds_on_structs_and_enums_xc::{Bar, Foo, Trait}; - -fn explode(x: Foo) {} -//~^ ERROR E0277 - -fn kaboom(y: Bar) {} -//~^ ERROR E0277 - -fn main() { -} diff --git a/src/test/ui/traits/trait-bounds-on-structs-and-enums-xc1.rs b/src/test/ui/traits/trait-bounds-on-structs-and-enums-xc1.rs deleted file mode 100644 index 2a4ba9677e..0000000000 --- a/src/test/ui/traits/trait-bounds-on-structs-and-enums-xc1.rs +++ /dev/null @@ -1,15 +0,0 @@ -// aux-build:trait_bounds_on_structs_and_enums_xc.rs - -extern crate trait_bounds_on_structs_and_enums_xc; - -use trait_bounds_on_structs_and_enums_xc::{Bar, Foo, Trait}; - -fn main() { - let foo = Foo { - //~^ ERROR E0277 - x: 3 - }; - let bar: Bar = return; - //~^ ERROR E0277 - let _ = bar; -} diff --git a/src/test/ui/traits/ufcs-trait-object.rs b/src/test/ui/traits/ufcs-object.rs similarity index 100% rename from src/test/ui/traits/ufcs-trait-object.rs rename to src/test/ui/traits/ufcs-object.rs diff --git a/src/test/ui/traits/use-trait-before-def.rs b/src/test/ui/traits/use-before-def.rs similarity index 100% rename from src/test/ui/traits/use-trait-before-def.rs rename to src/test/ui/traits/use-before-def.rs diff --git a/src/test/ui/traits/wf-trait-object-maybe-bound.rs b/src/test/ui/traits/wf-object/maybe-bound.rs similarity index 100% rename from src/test/ui/traits/wf-trait-object-maybe-bound.rs rename to src/test/ui/traits/wf-object/maybe-bound.rs diff --git a/src/test/ui/traits/wf-trait-object-maybe-bound.stderr b/src/test/ui/traits/wf-object/maybe-bound.stderr similarity index 74% rename from src/test/ui/traits/wf-trait-object-maybe-bound.stderr rename to src/test/ui/traits/wf-object/maybe-bound.stderr index 4a570efcb5..2fe3f0fc39 100644 --- a/src/test/ui/traits/wf-trait-object-maybe-bound.stderr +++ b/src/test/ui/traits/wf-object/maybe-bound.stderr @@ -1,29 +1,29 @@ error: `?Trait` is not permitted in trait object types - --> $DIR/wf-trait-object-maybe-bound.rs:5:15 + --> $DIR/maybe-bound.rs:5:15 | LL | type _0 = dyn ?Sized + Foo; | ^^^^^^ error: `?Trait` is not permitted in trait object types - --> $DIR/wf-trait-object-maybe-bound.rs:8:21 + --> $DIR/maybe-bound.rs:8:21 | LL | type _1 = dyn Foo + ?Sized; | ^^^^^^ error: `?Trait` is not permitted in trait object types - --> $DIR/wf-trait-object-maybe-bound.rs:11:21 + --> $DIR/maybe-bound.rs:11:21 | LL | type _2 = dyn Foo + ?Sized + ?Sized; | ^^^^^^ error: `?Trait` is not permitted in trait object types - --> $DIR/wf-trait-object-maybe-bound.rs:11:30 + --> $DIR/maybe-bound.rs:11:30 | LL | type _2 = dyn Foo + ?Sized + ?Sized; | ^^^^^^ error: `?Trait` is not permitted in trait object types - --> $DIR/wf-trait-object-maybe-bound.rs:15:15 + --> $DIR/maybe-bound.rs:15:15 | LL | type _3 = dyn ?Sized + Foo; | ^^^^^^ diff --git a/src/test/ui/traits/wf-trait-object-no-duplicates.rs b/src/test/ui/traits/wf-object/no-duplicates.rs similarity index 100% rename from src/test/ui/traits/wf-trait-object-no-duplicates.rs rename to src/test/ui/traits/wf-object/no-duplicates.rs diff --git a/src/test/ui/traits/wf-trait-object-no-duplicates.stderr b/src/test/ui/traits/wf-object/no-duplicates.stderr similarity index 92% rename from src/test/ui/traits/wf-trait-object-no-duplicates.stderr rename to src/test/ui/traits/wf-object/no-duplicates.stderr index ed5409d015..b9506894f8 100644 --- a/src/test/ui/traits/wf-trait-object-no-duplicates.stderr +++ b/src/test/ui/traits/wf-object/no-duplicates.stderr @@ -1,5 +1,5 @@ error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/wf-trait-object-no-duplicates.rs:8:21 + --> $DIR/no-duplicates.rs:8:21 | LL | type _0 = dyn Obj + Obj; | --- ^^^ additional non-auto trait @@ -10,7 +10,7 @@ LL | type _0 = dyn Obj + Obj; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/wf-trait-object-no-duplicates.rs:13:28 + --> $DIR/no-duplicates.rs:13:28 | LL | type _1 = dyn Send + Obj + Obj; | --- ^^^ additional non-auto trait @@ -21,7 +21,7 @@ LL | type _1 = dyn Send + Obj + Obj; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/wf-trait-object-no-duplicates.rs:16:28 + --> $DIR/no-duplicates.rs:16:28 | LL | type _2 = dyn Obj + Send + Obj; | --- ^^^ additional non-auto trait @@ -32,7 +32,7 @@ LL | type _2 = dyn Obj + Send + Obj; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/wf-trait-object-no-duplicates.rs:26:34 + --> $DIR/no-duplicates.rs:26:34 | LL | type _4 = dyn for<'a> ObjL<'a> + for<'b> ObjL<'b>; | ---------------- ^^^^^^^^^^^^^^^^ additional non-auto trait @@ -43,7 +43,7 @@ LL | type _4 = dyn for<'a> ObjL<'a> + for<'b> ObjL<'b>; = note: auto-traits like `Send` and `Sync` are traits that have special properties; for more information on them, visit error[E0225]: only auto traits can be used as additional traits in a trait object - --> $DIR/wf-trait-object-no-duplicates.rs:30:42 + --> $DIR/no-duplicates.rs:30:42 | LL | type _5 = dyn ObjT fn(&'a u8)> + ObjT fn(&'b u8)>; | ------------------------ ^^^^^^^^^^^^^^^^^^^^^^^^ additional non-auto trait diff --git a/src/test/ui/traits/wf-trait-object-only-maybe-bound.rs b/src/test/ui/traits/wf-object/only-maybe-bound.rs similarity index 100% rename from src/test/ui/traits/wf-trait-object-only-maybe-bound.rs rename to src/test/ui/traits/wf-object/only-maybe-bound.rs diff --git a/src/test/ui/traits/wf-trait-object-only-maybe-bound.stderr b/src/test/ui/traits/wf-object/only-maybe-bound.stderr similarity index 76% rename from src/test/ui/traits/wf-trait-object-only-maybe-bound.stderr rename to src/test/ui/traits/wf-object/only-maybe-bound.stderr index 4824108863..cbc41feec1 100644 --- a/src/test/ui/traits/wf-trait-object-only-maybe-bound.stderr +++ b/src/test/ui/traits/wf-object/only-maybe-bound.stderr @@ -1,11 +1,11 @@ error: `?Trait` is not permitted in trait object types - --> $DIR/wf-trait-object-only-maybe-bound.rs:3:15 + --> $DIR/only-maybe-bound.rs:3:15 | LL | type _0 = dyn ?Sized; | ^^^^^^ error[E0224]: at least one trait is required for an object type - --> $DIR/wf-trait-object-only-maybe-bound.rs:3:11 + --> $DIR/only-maybe-bound.rs:3:11 | LL | type _0 = dyn ?Sized; | ^^^^^^^^^^ diff --git a/src/test/ui/traits/wf-trait-object-reverse-order.rs b/src/test/ui/traits/wf-object/reverse-order.rs similarity index 100% rename from src/test/ui/traits/wf-trait-object-reverse-order.rs rename to src/test/ui/traits/wf-object/reverse-order.rs diff --git a/src/test/ui/traits/trait-where-clause-vs-impl.rs b/src/test/ui/traits/where-clause-vs-impl.rs similarity index 100% rename from src/test/ui/traits/trait-where-clause-vs-impl.rs rename to src/test/ui/traits/where-clause-vs-impl.rs diff --git a/src/test/ui/traits/trait-with-bounds-default.rs b/src/test/ui/traits/with-bounds-default.rs similarity index 100% rename from src/test/ui/traits/trait-with-bounds-default.rs rename to src/test/ui/traits/with-bounds-default.rs diff --git a/src/test/ui/traits/trait-with-dst.rs b/src/test/ui/traits/with-dst.rs similarity index 100% rename from src/test/ui/traits/trait-with-dst.rs rename to src/test/ui/traits/with-dst.rs diff --git a/src/test/ui/treat-err-as-bug/delay_span_bug.rs b/src/test/ui/treat-err-as-bug/delay_span_bug.rs new file mode 100644 index 0000000000..d4d44049c9 --- /dev/null +++ b/src/test/ui/treat-err-as-bug/delay_span_bug.rs @@ -0,0 +1,12 @@ +// compile-flags: -Ztreat-err-as-bug +// failure-status: 101 +// error-pattern: aborting due to `-Z treat-err-as-bug=1` +// error-pattern: [trigger_delay_span_bug] trigger a delay span bug +// normalize-stderr-test "note: .*\n\n" -> "" +// normalize-stderr-test "thread 'rustc' panicked.*\n" -> "" +// rustc-env:RUST_BACKTRACE=0 + +#![feature(rustc_attrs)] + +#[rustc_error(delay_span_bug_from_inside_query)] +fn main() {} diff --git a/src/test/ui/treat-err-as-bug/delay_span_bug.stderr b/src/test/ui/treat-err-as-bug/delay_span_bug.stderr new file mode 100644 index 0000000000..c23c2b81b9 --- /dev/null +++ b/src/test/ui/treat-err-as-bug/delay_span_bug.stderr @@ -0,0 +1,11 @@ +error: internal compiler error: delayed span bug triggered by #[rustc_error(delay_span_bug_from_inside_query)] + --> $DIR/delay_span_bug.rs:12:1 + | +LL | fn main() {} + | ^^^^^^^^^ + +error: internal compiler error: unexpected panic + +query stack during panic: +#0 [trigger_delay_span_bug] trigger a delay span bug +end of query stack diff --git a/src/test/ui/treat-err-as-bug/err.rs b/src/test/ui/treat-err-as-bug/err.rs new file mode 100644 index 0000000000..de3e9ed6cf --- /dev/null +++ b/src/test/ui/treat-err-as-bug/err.rs @@ -0,0 +1,12 @@ +// compile-flags: -Ztreat-err-as-bug +// failure-status: 101 +// error-pattern: aborting due to `-Z treat-err-as-bug=1` +// error-pattern: [eval_to_allocation_raw] const-evaluating + checking `C` +// normalize-stderr-test "note: .*\n\n" -> "" +// normalize-stderr-test "thread 'rustc' panicked.*\n" -> "" +// rustc-env:RUST_BACKTRACE=0 + +#![crate_type = "rlib"] + +pub static C: u32 = 0 - 1; +//~^ ERROR could not evaluate static initializer diff --git a/src/test/ui/treat-err-as-bug/err.stderr b/src/test/ui/treat-err-as-bug/err.stderr new file mode 100644 index 0000000000..8f67571c29 --- /dev/null +++ b/src/test/ui/treat-err-as-bug/err.stderr @@ -0,0 +1,12 @@ +error[E0080]: could not evaluate static initializer + --> $DIR/err.rs:11:21 + | +LL | pub static C: u32 = 0 - 1; + | ^^^^^ attempt to compute `0_u32 - 1_u32`, which would overflow + +error: internal compiler error: unexpected panic + +query stack during panic: +#0 [eval_to_allocation_raw] const-evaluating + checking `C` +#1 [eval_to_allocation_raw] const-evaluating + checking `C` +end of query stack diff --git a/src/test/ui/try-block/try-block-bad-type.rs b/src/test/ui/try-block/try-block-bad-type.rs index 496ba14581..ef6e690e1b 100644 --- a/src/test/ui/try-block/try-block-bad-type.rs +++ b/src/test/ui/try-block/try-block-bad-type.rs @@ -3,7 +3,7 @@ #![feature(try_blocks)] pub fn main() { - let res: Result = try { + let res: Result = try { Err("")?; //~ ERROR `?` couldn't convert the error 5 }; diff --git a/src/test/ui/try-block/try-block-bad-type.stderr b/src/test/ui/try-block/try-block-bad-type.stderr index cadf3a841c..75a42c0d6b 100644 --- a/src/test/ui/try-block/try-block-bad-type.stderr +++ b/src/test/ui/try-block/try-block-bad-type.stderr @@ -1,25 +1,21 @@ -error[E0277]: `?` couldn't convert the error to `i32` +error[E0277]: `?` couldn't convert the error to `TryFromSliceError` --> $DIR/try-block-bad-type.rs:7:16 | LL | Err("")?; - | ^ the trait `From<&str>` is not implemented for `i32` + | ^ the trait `From<&str>` is not implemented for `TryFromSliceError` | = note: the question mark operation (`?`) implicitly performs a conversion on the error value using the `From` trait = help: the following implementations were found: - > - > - > - > - and 2 others + > = note: required by `from` -error[E0271]: type mismatch resolving ` as Try>::Ok == &str` +error[E0271]: type mismatch resolving ` as Try>::Ok == &str` --> $DIR/try-block-bad-type.rs:12:9 | LL | "" | ^^ expected `i32`, found `&str` -error[E0271]: type mismatch resolving ` as Try>::Ok == ()` +error[E0271]: type mismatch resolving ` as Try>::Ok == ()` --> $DIR/try-block-bad-type.rs:15:39 | LL | let res: Result = try { }; diff --git a/src/test/ui/try-block.rs b/src/test/ui/try-block/try-block.rs similarity index 100% rename from src/test/ui/try-block.rs rename to src/test/ui/try-block/try-block.rs diff --git a/src/test/ui/one-tuple.rs b/src/test/ui/tuple/one-tuple.rs similarity index 100% rename from src/test/ui/one-tuple.rs rename to src/test/ui/tuple/one-tuple.rs diff --git a/src/test/ui/tup.rs b/src/test/ui/tuple/tup.rs similarity index 100% rename from src/test/ui/tup.rs rename to src/test/ui/tuple/tup.rs diff --git a/src/test/ui/type-alias-impl-trait/assoc-type-const.full_tait.stderr b/src/test/ui/type-alias-impl-trait/assoc-type-const.full_tait.stderr new file mode 100644 index 0000000000..7b43d1d86b --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/assoc-type-const.full_tait.stderr @@ -0,0 +1,19 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/assoc-type-const.rs:7:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/assoc-type-const.rs:9:12 + | +LL | #![feature(const_generics)] + | ^^^^^^^^^^^^^^ + | + = note: see issue #44580 for more information + +warning: 2 warnings emitted + diff --git a/src/test/ui/type-alias-impl-trait/assoc-type-const.stderr b/src/test/ui/type-alias-impl-trait/assoc-type-const.min_tait.stderr similarity index 91% rename from src/test/ui/type-alias-impl-trait/assoc-type-const.stderr rename to src/test/ui/type-alias-impl-trait/assoc-type-const.min_tait.stderr index e0c1b02386..d4b9132cc9 100644 --- a/src/test/ui/type-alias-impl-trait/assoc-type-const.stderr +++ b/src/test/ui/type-alias-impl-trait/assoc-type-const.min_tait.stderr @@ -1,5 +1,5 @@ warning: the feature `const_generics` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/assoc-type-const.rs:6:12 + --> $DIR/assoc-type-const.rs:9:12 | LL | #![feature(const_generics)] | ^^^^^^^^^^^^^^ diff --git a/src/test/ui/type-alias-impl-trait/assoc-type-const.rs b/src/test/ui/type-alias-impl-trait/assoc-type-const.rs index d53f562e99..be065c3b6b 100644 --- a/src/test/ui/type-alias-impl-trait/assoc-type-const.rs +++ b/src/test/ui/type-alias-impl-trait/assoc-type-const.rs @@ -2,7 +2,10 @@ // const generics in an associated opaque type // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #![feature(const_generics)] //~^ WARN the feature `const_generics` is incomplete diff --git a/src/test/ui/type-alias-impl-trait/assoc-type-lifetime-unconstrained.full_tait.stderr b/src/test/ui/type-alias-impl-trait/assoc-type-lifetime-unconstrained.full_tait.stderr new file mode 100644 index 0000000000..01263cde8b --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/assoc-type-lifetime-unconstrained.full_tait.stderr @@ -0,0 +1,18 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/assoc-type-lifetime-unconstrained.rs:6:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates + --> $DIR/assoc-type-lifetime-unconstrained.rs:20:6 + | +LL | impl<'a, I> UnwrapItemsExt for I { + | ^^ unconstrained lifetime parameter + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0207`. diff --git a/src/test/ui/type-alias-impl-trait/assoc-type-lifetime-unconstrained.stderr b/src/test/ui/type-alias-impl-trait/assoc-type-lifetime-unconstrained.min_tait.stderr similarity index 85% rename from src/test/ui/type-alias-impl-trait/assoc-type-lifetime-unconstrained.stderr rename to src/test/ui/type-alias-impl-trait/assoc-type-lifetime-unconstrained.min_tait.stderr index e594dc577b..afcdab5f47 100644 --- a/src/test/ui/type-alias-impl-trait/assoc-type-lifetime-unconstrained.stderr +++ b/src/test/ui/type-alias-impl-trait/assoc-type-lifetime-unconstrained.min_tait.stderr @@ -1,5 +1,5 @@ error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates - --> $DIR/assoc-type-lifetime-unconstrained.rs:17:6 + --> $DIR/assoc-type-lifetime-unconstrained.rs:20:6 | LL | impl<'a, I> UnwrapItemsExt for I { | ^^ unconstrained lifetime parameter diff --git a/src/test/ui/type-alias-impl-trait/assoc-type-lifetime-unconstrained.rs b/src/test/ui/type-alias-impl-trait/assoc-type-lifetime-unconstrained.rs index 3f34b00ec7..39cc75e688 100644 --- a/src/test/ui/type-alias-impl-trait/assoc-type-lifetime-unconstrained.rs +++ b/src/test/ui/type-alias-impl-trait/assoc-type-lifetime-unconstrained.rs @@ -1,7 +1,10 @@ // Tests that we don't allow unconstrained lifetime parameters in impls when // the lifetime is used in an associated opaque type. -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait UnwrapItemsExt { type Iter; diff --git a/src/test/ui/type-alias-impl-trait/assoc-type-lifetime.full_tait.stderr b/src/test/ui/type-alias-impl-trait/assoc-type-lifetime.full_tait.stderr new file mode 100644 index 0000000000..31afbf14e6 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/assoc-type-lifetime.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/assoc-type-lifetime.rs:7:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/assoc-type-lifetime.rs b/src/test/ui/type-alias-impl-trait/assoc-type-lifetime.rs index 39f785d8cc..ebbdbb67db 100644 --- a/src/test/ui/type-alias-impl-trait/assoc-type-lifetime.rs +++ b/src/test/ui/type-alias-impl-trait/assoc-type-lifetime.rs @@ -2,7 +2,10 @@ // lifetimes are used in an associated opaque type // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait UnwrapItemsExt<'a> { type Iter; diff --git a/src/test/ui/type-alias-impl-trait/associated-type-alias-impl-trait.full_tait.stderr b/src/test/ui/type-alias-impl-trait/associated-type-alias-impl-trait.full_tait.stderr new file mode 100644 index 0000000000..2c48d815e0 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/associated-type-alias-impl-trait.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/associated-type-alias-impl-trait.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/associated-type-alias-impl-trait.rs b/src/test/ui/type-alias-impl-trait/associated-type-alias-impl-trait.rs index 42f07d49ff..8d2b182679 100644 --- a/src/test/ui/type-alias-impl-trait/associated-type-alias-impl-trait.rs +++ b/src/test/ui/type-alias-impl-trait/associated-type-alias-impl-trait.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete // build-pass (FIXME(62277): could be check-pass?) trait Bar {} diff --git a/src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.rs b/src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.rs new file mode 100644 index 0000000000..967d4c3f0f --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.rs @@ -0,0 +1,33 @@ +// failure-status: 101 +// rustc-env:RUST_BACKTRACE=0 +// normalize-stderr-test "note: .*\n\n" -> "" +// normalize-stderr-test "thread 'rustc' panicked.*\n" -> "" + +// compile-flags: --crate-type=rlib + +// Regression test for https://github.com/rust-lang/rust/issues/78450 + +#![feature(min_type_alias_impl_trait)] +#![no_std] + +pub trait AssociatedImpl { + type ImplTrait; + + fn f() -> Self::ImplTrait; +} + +struct S(T); + +trait Associated { + type A; +} + +// ICE +impl<'a, T: Associated> AssociatedImpl for S { + type ImplTrait = impl core::fmt::Debug; + + fn f() -> Self::ImplTrait { + //~^ ERROR unexpected concrete region in borrowck: ReEarlyBound(0, 'a) + () + } +} diff --git a/src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.stderr b/src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.stderr new file mode 100644 index 0000000000..64ab7b70b1 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/associated-type-lifetime-ice.stderr @@ -0,0 +1,13 @@ +error: internal compiler error: unexpected concrete region in borrowck: ReEarlyBound(0, 'a) + --> $DIR/associated-type-lifetime-ice.rs:29:5 + | +LL | / fn f() -> Self::ImplTrait { +LL | | +LL | | () +LL | | } + | |_____^ + | + = error: internal compiler error: unexpected panic + +query stack during panic: +end of query stack diff --git a/src/test/ui/type-alias-impl-trait/auxiliary/cross_crate_ice.rs b/src/test/ui/type-alias-impl-trait/auxiliary/cross_crate_ice.rs index f61807cbdb..94e1fa73de 100644 --- a/src/test/ui/type-alias-impl-trait/auxiliary/cross_crate_ice.rs +++ b/src/test/ui/type-alias-impl-trait/auxiliary/cross_crate_ice.rs @@ -1,8 +1,10 @@ // Crate that exports an opaque `impl Trait` type. Used for testing cross-crate. -#![crate_type="rlib"] - -#![feature(type_alias_impl_trait)] +#![crate_type = "rlib"] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete pub type Foo = impl std::fmt::Debug; diff --git a/src/test/ui/type-alias-impl-trait/auxiliary/cross_crate_ice2.rs b/src/test/ui/type-alias-impl-trait/auxiliary/cross_crate_ice2.rs index 0082345626..65bc594dcf 100644 --- a/src/test/ui/type-alias-impl-trait/auxiliary/cross_crate_ice2.rs +++ b/src/test/ui/type-alias-impl-trait/auxiliary/cross_crate_ice2.rs @@ -1,8 +1,10 @@ // Crate that exports an opaque `impl Trait` type. Used for testing cross-crate. -#![crate_type="rlib"] - -#![feature(type_alias_impl_trait)] +#![crate_type = "rlib"] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete pub trait View { type Tmp: Iterator; diff --git a/src/test/ui/type-alias-impl-trait/bound_reduction.rs b/src/test/ui/type-alias-impl-trait/bound_reduction.rs index 18c840d8ed..b45105ea8f 100644 --- a/src/test/ui/type-alias-impl-trait/bound_reduction.rs +++ b/src/test/ui/type-alias-impl-trait/bound_reduction.rs @@ -1,8 +1,9 @@ // build-pass (FIXME(62277): could be check-pass?) #![allow(warnings)] - -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] fn main() { } diff --git a/src/test/ui/type-alias-impl-trait/bound_reduction2.full_tait.stderr b/src/test/ui/type-alias-impl-trait/bound_reduction2.full_tait.stderr new file mode 100644 index 0000000000..164564e851 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/bound_reduction2.full_tait.stderr @@ -0,0 +1,23 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/bound_reduction2.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: non-defining opaque type use in defining scope + --> $DIR/bound_reduction2.rs:18:46 + | +LL | fn foo_desugared(_: T) -> Foo { + | ^^^^^^^^^^^^^ + | +note: used non-generic type `::Assoc` for generic parameter + --> $DIR/bound_reduction2.rs:12:10 + | +LL | type Foo = impl Trait; + | ^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/bound_reduction2.stderr b/src/test/ui/type-alias-impl-trait/bound_reduction2.min_tait.stderr similarity index 83% rename from src/test/ui/type-alias-impl-trait/bound_reduction2.stderr rename to src/test/ui/type-alias-impl-trait/bound_reduction2.min_tait.stderr index c9d6a43b90..d3520a9bac 100644 --- a/src/test/ui/type-alias-impl-trait/bound_reduction2.stderr +++ b/src/test/ui/type-alias-impl-trait/bound_reduction2.min_tait.stderr @@ -1,11 +1,11 @@ error: non-defining opaque type use in defining scope - --> $DIR/bound_reduction2.rs:15:46 + --> $DIR/bound_reduction2.rs:18:46 | LL | fn foo_desugared(_: T) -> Foo { | ^^^^^^^^^^^^^ | note: used non-generic type `::Assoc` for generic parameter - --> $DIR/bound_reduction2.rs:9:10 + --> $DIR/bound_reduction2.rs:12:10 | LL | type Foo = impl Trait; | ^ diff --git a/src/test/ui/type-alias-impl-trait/bound_reduction2.rs b/src/test/ui/type-alias-impl-trait/bound_reduction2.rs index a15074c359..b94b21e424 100644 --- a/src/test/ui/type-alias-impl-trait/bound_reduction2.rs +++ b/src/test/ui/type-alias-impl-trait/bound_reduction2.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/bounds-are-checked-2.full_tait.stderr b/src/test/ui/type-alias-impl-trait/bounds-are-checked-2.full_tait.stderr new file mode 100644 index 0000000000..871ef22f3e --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/bounds-are-checked-2.full_tait.stderr @@ -0,0 +1,23 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/bounds-are-checked-2.rs:6:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0277]: the trait bound `T: Clone` is not satisfied + --> $DIR/bounds-are-checked-2.rs:9:13 + | +LL | type X = impl Clone; + | ^^^^^^^^^^ the trait `Clone` is not implemented for `T` + | +help: consider restricting type parameter `T` + | +LL | type X = impl Clone; + | ^^^^^^^ + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/type-alias-impl-trait/bounds-are-checked-2.stderr b/src/test/ui/type-alias-impl-trait/bounds-are-checked-2.min_tait.stderr similarity index 90% rename from src/test/ui/type-alias-impl-trait/bounds-are-checked-2.stderr rename to src/test/ui/type-alias-impl-trait/bounds-are-checked-2.min_tait.stderr index 26a2f4135c..20656e5e55 100644 --- a/src/test/ui/type-alias-impl-trait/bounds-are-checked-2.stderr +++ b/src/test/ui/type-alias-impl-trait/bounds-are-checked-2.min_tait.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `T: Clone` is not satisfied - --> $DIR/bounds-are-checked-2.rs:6:13 + --> $DIR/bounds-are-checked-2.rs:9:13 | LL | type X = impl Clone; | ^^^^^^^^^^ the trait `Clone` is not implemented for `T` diff --git a/src/test/ui/type-alias-impl-trait/bounds-are-checked-2.rs b/src/test/ui/type-alias-impl-trait/bounds-are-checked-2.rs index c0359159ae..fecc2543bc 100644 --- a/src/test/ui/type-alias-impl-trait/bounds-are-checked-2.rs +++ b/src/test/ui/type-alias-impl-trait/bounds-are-checked-2.rs @@ -1,7 +1,10 @@ // Make sure that we check that impl trait types implement the traits that they // claim to. -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete type X = impl Clone; //~^ ERROR the trait bound `T: Clone` is not satisfied diff --git a/src/test/ui/type-alias-impl-trait/bounds-are-checked.full_tait.stderr b/src/test/ui/type-alias-impl-trait/bounds-are-checked.full_tait.stderr new file mode 100644 index 0000000000..ca89421cd8 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/bounds-are-checked.full_tait.stderr @@ -0,0 +1,35 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/bounds-are-checked.rs:6:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: unnecessary lifetime parameter `'a` + --> $DIR/bounds-are-checked.rs:12:6 + | +LL | fn f<'a: 'static>(t: &'a str) -> X<'a> { + | ^^^^^^^^^^^ + | + = help: you can use the `'static` lifetime directly, in place of `'a` + +error[E0308]: mismatched types + --> $DIR/bounds-are-checked.rs:9:14 + | +LL | type X<'a> = impl Into<&'static str> + From<&'a str>; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch + | + = note: expected trait `From<&'a str>` + found trait `From<&'static str>` +note: the lifetime `'a` as defined on the item at 9:8... + --> $DIR/bounds-are-checked.rs:9:8 + | +LL | type X<'a> = impl Into<&'static str> + From<&'a str>; + | ^^ + = note: ...does not necessarily outlive the static lifetime + +error: aborting due to previous error; 2 warnings emitted + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/type-alias-impl-trait/bounds-are-checked.stderr b/src/test/ui/type-alias-impl-trait/bounds-are-checked.min_tait.stderr similarity index 81% rename from src/test/ui/type-alias-impl-trait/bounds-are-checked.stderr rename to src/test/ui/type-alias-impl-trait/bounds-are-checked.min_tait.stderr index d5fafe0588..9a451cb108 100644 --- a/src/test/ui/type-alias-impl-trait/bounds-are-checked.stderr +++ b/src/test/ui/type-alias-impl-trait/bounds-are-checked.min_tait.stderr @@ -1,5 +1,5 @@ warning: unnecessary lifetime parameter `'a` - --> $DIR/bounds-are-checked.rs:9:6 + --> $DIR/bounds-are-checked.rs:12:6 | LL | fn f<'a: 'static>(t: &'a str) -> X<'a> { | ^^^^^^^^^^^ @@ -7,15 +7,15 @@ LL | fn f<'a: 'static>(t: &'a str) -> X<'a> { = help: you can use the `'static` lifetime directly, in place of `'a` error[E0308]: mismatched types - --> $DIR/bounds-are-checked.rs:6:14 + --> $DIR/bounds-are-checked.rs:9:14 | LL | type X<'a> = impl Into<&'static str> + From<&'a str>; | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ lifetime mismatch | = note: expected trait `From<&'a str>` found trait `From<&'static str>` -note: the lifetime `'a` as defined on the item at 6:8... - --> $DIR/bounds-are-checked.rs:6:8 +note: the lifetime `'a` as defined on the item at 9:8... + --> $DIR/bounds-are-checked.rs:9:8 | LL | type X<'a> = impl Into<&'static str> + From<&'a str>; | ^^ diff --git a/src/test/ui/type-alias-impl-trait/bounds-are-checked.rs b/src/test/ui/type-alias-impl-trait/bounds-are-checked.rs index 759bf4f4f0..5e1faaa3b0 100644 --- a/src/test/ui/type-alias-impl-trait/bounds-are-checked.rs +++ b/src/test/ui/type-alias-impl-trait/bounds-are-checked.rs @@ -1,7 +1,10 @@ // Make sure that we check that impl trait types implement the traits that they // claim to. -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete type X<'a> = impl Into<&'static str> + From<&'a str>; //~^ ERROR mismatched types diff --git a/src/test/ui/type-alias-impl-trait/coherence.full_tait.stderr b/src/test/ui/type-alias-impl-trait/coherence.full_tait.stderr new file mode 100644 index 0000000000..68de0c961b --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/coherence.full_tait.stderr @@ -0,0 +1,18 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/coherence.rs:4:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or predicates + --> $DIR/coherence.rs:17:6 + | +LL | impl foreign_crate::ForeignTrait for AliasOfForeignType {} + | ^ unconstrained type parameter + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0207`. diff --git a/src/test/ui/type-alias-impl-trait/coherence.stderr b/src/test/ui/type-alias-impl-trait/coherence.min_tait.stderr similarity index 91% rename from src/test/ui/type-alias-impl-trait/coherence.stderr rename to src/test/ui/type-alias-impl-trait/coherence.min_tait.stderr index 6ede0fa14b..4da52369fd 100644 --- a/src/test/ui/type-alias-impl-trait/coherence.stderr +++ b/src/test/ui/type-alias-impl-trait/coherence.min_tait.stderr @@ -1,5 +1,5 @@ error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or predicates - --> $DIR/coherence.rs:14:6 + --> $DIR/coherence.rs:17:6 | LL | impl foreign_crate::ForeignTrait for AliasOfForeignType {} | ^ unconstrained type parameter diff --git a/src/test/ui/type-alias-impl-trait/coherence.rs b/src/test/ui/type-alias-impl-trait/coherence.rs index 1c0f83d6c1..51babb0e61 100644 --- a/src/test/ui/type-alias-impl-trait/coherence.rs +++ b/src/test/ui/type-alias-impl-trait/coherence.rs @@ -1,5 +1,8 @@ // aux-build:foreign-crate.rs -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete extern crate foreign_crate; diff --git a/src/test/ui/type-alias-impl-trait/declared_but_never_defined.full_tait.stderr b/src/test/ui/type-alias-impl-trait/declared_but_never_defined.full_tait.stderr new file mode 100644 index 0000000000..5fc79cf956 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/declared_but_never_defined.full_tait.stderr @@ -0,0 +1,17 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/declared_but_never_defined.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: could not find defining uses + --> $DIR/declared_but_never_defined.rs:9:12 + | +LL | type Bar = impl std::fmt::Debug; + | ^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/declared_but_never_defined.stderr b/src/test/ui/type-alias-impl-trait/declared_but_never_defined.min_tait.stderr similarity index 77% rename from src/test/ui/type-alias-impl-trait/declared_but_never_defined.stderr rename to src/test/ui/type-alias-impl-trait/declared_but_never_defined.min_tait.stderr index 21c2e8a9db..b731e41b14 100644 --- a/src/test/ui/type-alias-impl-trait/declared_but_never_defined.stderr +++ b/src/test/ui/type-alias-impl-trait/declared_but_never_defined.min_tait.stderr @@ -1,5 +1,5 @@ error: could not find defining uses - --> $DIR/declared_but_never_defined.rs:6:12 + --> $DIR/declared_but_never_defined.rs:9:12 | LL | type Bar = impl std::fmt::Debug; | ^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/type-alias-impl-trait/declared_but_never_defined.rs b/src/test/ui/type-alias-impl-trait/declared_but_never_defined.rs index c4bf56a919..ac92bea8c4 100644 --- a/src/test/ui/type-alias-impl-trait/declared_but_never_defined.rs +++ b/src/test/ui/type-alias-impl-trait/declared_but_never_defined.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/declared_but_not_defined_in_scope.full_tait.stderr b/src/test/ui/type-alias-impl-trait/declared_but_not_defined_in_scope.full_tait.stderr new file mode 100644 index 0000000000..eeccc598f5 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/declared_but_not_defined_in_scope.full_tait.stderr @@ -0,0 +1,32 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/declared_but_not_defined_in_scope.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: could not find defining uses + --> $DIR/declared_but_not_defined_in_scope.rs:10:20 + | +LL | pub type Boo = impl ::std::fmt::Debug; + | ^^^^^^^^^^^^^^^^^^^^^^ + +error[E0308]: mismatched types + --> $DIR/declared_but_not_defined_in_scope.rs:14:5 + | +LL | pub type Boo = impl ::std::fmt::Debug; + | ---------------------- the expected opaque type +... +LL | fn bomp() -> boo::Boo { + | -------- expected `impl Debug` because of return type +LL | "" + | ^^ expected opaque type, found `&str` + | + = note: expected opaque type `impl Debug` + found reference `&'static str` + +error: aborting due to 2 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/type-alias-impl-trait/declared_but_not_defined_in_scope.stderr b/src/test/ui/type-alias-impl-trait/declared_but_not_defined_in_scope.min_tait.stderr similarity index 86% rename from src/test/ui/type-alias-impl-trait/declared_but_not_defined_in_scope.stderr rename to src/test/ui/type-alias-impl-trait/declared_but_not_defined_in_scope.min_tait.stderr index 0b4c262bbb..20057c3aa5 100644 --- a/src/test/ui/type-alias-impl-trait/declared_but_not_defined_in_scope.stderr +++ b/src/test/ui/type-alias-impl-trait/declared_but_not_defined_in_scope.min_tait.stderr @@ -1,11 +1,11 @@ error: could not find defining uses - --> $DIR/declared_but_not_defined_in_scope.rs:7:20 + --> $DIR/declared_but_not_defined_in_scope.rs:10:20 | LL | pub type Boo = impl ::std::fmt::Debug; | ^^^^^^^^^^^^^^^^^^^^^^ error[E0308]: mismatched types - --> $DIR/declared_but_not_defined_in_scope.rs:11:5 + --> $DIR/declared_but_not_defined_in_scope.rs:14:5 | LL | pub type Boo = impl ::std::fmt::Debug; | ---------------------- the expected opaque type diff --git a/src/test/ui/type-alias-impl-trait/declared_but_not_defined_in_scope.rs b/src/test/ui/type-alias-impl-trait/declared_but_not_defined_in_scope.rs index 7ea517eb73..2bbae98db4 100644 --- a/src/test/ui/type-alias-impl-trait/declared_but_not_defined_in_scope.rs +++ b/src/test/ui/type-alias-impl-trait/declared_but_not_defined_in_scope.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/different_defining_uses.full_tait.stderr b/src/test/ui/type-alias-impl-trait/different_defining_uses.full_tait.stderr new file mode 100644 index 0000000000..60fa141884 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/different_defining_uses.full_tait.stderr @@ -0,0 +1,23 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/different_defining_uses.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: concrete type differs from previous defining opaque type use + --> $DIR/different_defining_uses.rs:15:1 + | +LL | fn bar() -> Foo { + | ^^^^^^^^^^^^^^^ expected `&'static str`, got `i32` + | +note: previous use here + --> $DIR/different_defining_uses.rs:11:1 + | +LL | fn foo() -> Foo { + | ^^^^^^^^^^^^^^^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/different_defining_uses.stderr b/src/test/ui/type-alias-impl-trait/different_defining_uses.min_tait.stderr similarity index 75% rename from src/test/ui/type-alias-impl-trait/different_defining_uses.stderr rename to src/test/ui/type-alias-impl-trait/different_defining_uses.min_tait.stderr index eaa716bc71..904ee58685 100644 --- a/src/test/ui/type-alias-impl-trait/different_defining_uses.stderr +++ b/src/test/ui/type-alias-impl-trait/different_defining_uses.min_tait.stderr @@ -1,11 +1,11 @@ error: concrete type differs from previous defining opaque type use - --> $DIR/different_defining_uses.rs:12:1 + --> $DIR/different_defining_uses.rs:15:1 | LL | fn bar() -> Foo { | ^^^^^^^^^^^^^^^ expected `&'static str`, got `i32` | note: previous use here - --> $DIR/different_defining_uses.rs:8:1 + --> $DIR/different_defining_uses.rs:11:1 | LL | fn foo() -> Foo { | ^^^^^^^^^^^^^^^ diff --git a/src/test/ui/type-alias-impl-trait/different_defining_uses.rs b/src/test/ui/type-alias-impl-trait/different_defining_uses.rs index 2d7780a126..542de6b62e 100644 --- a/src/test/ui/type-alias-impl-trait/different_defining_uses.rs +++ b/src/test/ui/type-alias-impl-trait/different_defining_uses.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type.full_tait.stderr b/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type.full_tait.stderr new file mode 100644 index 0000000000..5c5ae7eadc --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type.full_tait.stderr @@ -0,0 +1,35 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/different_defining_uses_never_type.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: concrete type differs from previous defining opaque type use + --> $DIR/different_defining_uses_never_type.rs:15:1 + | +LL | fn bar() -> Foo { + | ^^^^^^^^^^^^^^^ expected `&'static str`, got `()` + | +note: previous use here + --> $DIR/different_defining_uses_never_type.rs:11:1 + | +LL | fn foo() -> Foo { + | ^^^^^^^^^^^^^^^ + +error: concrete type differs from previous defining opaque type use + --> $DIR/different_defining_uses_never_type.rs:19:1 + | +LL | fn boo() -> Foo { + | ^^^^^^^^^^^^^^^ expected `&'static str`, got `()` + | +note: previous use here + --> $DIR/different_defining_uses_never_type.rs:11:1 + | +LL | fn foo() -> Foo { + | ^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type.stderr b/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type.min_tait.stderr similarity index 69% rename from src/test/ui/type-alias-impl-trait/different_defining_uses_never_type.stderr rename to src/test/ui/type-alias-impl-trait/different_defining_uses_never_type.min_tait.stderr index 9a587e4f06..9cf2c58368 100644 --- a/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type.stderr +++ b/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type.min_tait.stderr @@ -1,23 +1,23 @@ error: concrete type differs from previous defining opaque type use - --> $DIR/different_defining_uses_never_type.rs:12:1 + --> $DIR/different_defining_uses_never_type.rs:15:1 | LL | fn bar() -> Foo { | ^^^^^^^^^^^^^^^ expected `&'static str`, got `()` | note: previous use here - --> $DIR/different_defining_uses_never_type.rs:8:1 + --> $DIR/different_defining_uses_never_type.rs:11:1 | LL | fn foo() -> Foo { | ^^^^^^^^^^^^^^^ error: concrete type differs from previous defining opaque type use - --> $DIR/different_defining_uses_never_type.rs:16:1 + --> $DIR/different_defining_uses_never_type.rs:19:1 | LL | fn boo() -> Foo { | ^^^^^^^^^^^^^^^ expected `&'static str`, got `()` | note: previous use here - --> $DIR/different_defining_uses_never_type.rs:8:1 + --> $DIR/different_defining_uses_never_type.rs:11:1 | LL | fn foo() -> Foo { | ^^^^^^^^^^^^^^^ diff --git a/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type.rs b/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type.rs index 289b97b00a..72352a74a0 100644 --- a/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type.rs +++ b/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type2.full_tait.stderr b/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type2.full_tait.stderr new file mode 100644 index 0000000000..b69622b77b --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type2.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/different_defining_uses_never_type2.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type2.rs b/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type2.rs index 8549687ea7..ac9884b3e4 100644 --- a/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type2.rs +++ b/src/test/ui/type-alias-impl-trait/different_defining_uses_never_type2.rs @@ -1,6 +1,9 @@ // build-pass (FIXME(62277): could be check-pass?) -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/fallback.full_tait.stderr b/src/test/ui/type-alias-impl-trait/fallback.full_tait.stderr new file mode 100644 index 0000000000..9641d756cb --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/fallback.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/fallback.rs:7:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/fallback.rs b/src/test/ui/type-alias-impl-trait/fallback.rs index fe1ca2230d..84fec75655 100644 --- a/src/test/ui/type-alias-impl-trait/fallback.rs +++ b/src/test/ui/type-alias-impl-trait/fallback.rs @@ -2,7 +2,10 @@ // inference variable being completely unconstrained. // // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete type Foo = impl Copy; diff --git a/src/test/ui/type-alias-impl-trait/generic_different_defining_uses.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_different_defining_uses.full_tait.stderr new file mode 100644 index 0000000000..972e5d9428 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_different_defining_uses.full_tait.stderr @@ -0,0 +1,23 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_different_defining_uses.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: concrete type differs from previous defining opaque type use + --> $DIR/generic_different_defining_uses.rs:14:1 + | +LL | fn my_iter2(t: T) -> MyIter { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `std::iter::Once`, got `std::option::IntoIter` + | +note: previous use here + --> $DIR/generic_different_defining_uses.rs:10:1 + | +LL | fn my_iter(t: T) -> MyIter { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/generic_different_defining_uses.stderr b/src/test/ui/type-alias-impl-trait/generic_different_defining_uses.min_tait.stderr similarity index 78% rename from src/test/ui/type-alias-impl-trait/generic_different_defining_uses.stderr rename to src/test/ui/type-alias-impl-trait/generic_different_defining_uses.min_tait.stderr index f8a058170e..911683862c 100644 --- a/src/test/ui/type-alias-impl-trait/generic_different_defining_uses.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_different_defining_uses.min_tait.stderr @@ -1,11 +1,11 @@ error: concrete type differs from previous defining opaque type use - --> $DIR/generic_different_defining_uses.rs:11:1 + --> $DIR/generic_different_defining_uses.rs:14:1 | LL | fn my_iter2(t: T) -> MyIter { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `std::iter::Once`, got `std::option::IntoIter` | note: previous use here - --> $DIR/generic_different_defining_uses.rs:7:1 + --> $DIR/generic_different_defining_uses.rs:10:1 | LL | fn my_iter(t: T) -> MyIter { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/type-alias-impl-trait/generic_different_defining_uses.rs b/src/test/ui/type-alias-impl-trait/generic_different_defining_uses.rs index ac87c2d446..4eb603df58 100644 --- a/src/test/ui/type-alias-impl-trait/generic_different_defining_uses.rs +++ b/src/test/ui/type-alias-impl-trait/generic_different_defining_uses.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_lifetime_param.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_lifetime_param.full_tait.stderr new file mode 100644 index 0000000000..ecf0e39ed6 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_lifetime_param.full_tait.stderr @@ -0,0 +1,23 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_duplicate_lifetime_param.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: non-defining opaque type use in defining scope + --> $DIR/generic_duplicate_lifetime_param.rs:10:26 + | +LL | fn one<'a>(t: &'a ()) -> Two<'a, 'a> { + | ^^^^^^^^^^^ + | +note: lifetime used multiple times + --> $DIR/generic_duplicate_lifetime_param.rs:8:10 + | +LL | type Two<'a, 'b> = impl std::fmt::Debug; + | ^^ ^^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_lifetime_param.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_lifetime_param.min_tait.stderr similarity index 73% rename from src/test/ui/type-alias-impl-trait/generic_duplicate_lifetime_param.stderr rename to src/test/ui/type-alias-impl-trait/generic_duplicate_lifetime_param.min_tait.stderr index 08b26b8fc1..1aad312056 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_lifetime_param.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_lifetime_param.min_tait.stderr @@ -1,11 +1,11 @@ error: non-defining opaque type use in defining scope - --> $DIR/generic_duplicate_lifetime_param.rs:7:26 + --> $DIR/generic_duplicate_lifetime_param.rs:10:26 | LL | fn one<'a>(t: &'a ()) -> Two<'a, 'a> { | ^^^^^^^^^^^ | note: lifetime used multiple times - --> $DIR/generic_duplicate_lifetime_param.rs:5:10 + --> $DIR/generic_duplicate_lifetime_param.rs:8:10 | LL | type Two<'a, 'b> = impl std::fmt::Debug; | ^^ ^^ diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_lifetime_param.rs b/src/test/ui/type-alias-impl-trait/generic_duplicate_lifetime_param.rs index c18a711675..d838d49723 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_lifetime_param.rs +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_lifetime_param.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use.full_tait.stderr similarity index 76% rename from src/test/ui/type-alias-impl-trait/generic_duplicate_param_use.stderr rename to src/test/ui/type-alias-impl-trait/generic_duplicate_param_use.full_tait.stderr index b4757e2763..805cea7127 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use.full_tait.stderr @@ -1,35 +1,35 @@ error: non-defining opaque type use in defining scope - --> $DIR/generic_duplicate_param_use.rs:13:30 + --> $DIR/generic_duplicate_param_use.rs:16:30 | LL | fn one_ty(t: T) -> TwoTys { | ^^^^^^^^^^^^ | note: type used multiple times - --> $DIR/generic_duplicate_param_use.rs:9:13 + --> $DIR/generic_duplicate_param_use.rs:12:13 | LL | type TwoTys = impl Debug; | ^ ^ error: non-defining opaque type use in defining scope - --> $DIR/generic_duplicate_param_use.rs:18:36 + --> $DIR/generic_duplicate_param_use.rs:21:36 | LL | fn one_lifetime<'a>(t: &'a u32) -> TwoLifetimes<'a, 'a> { | ^^^^^^^^^^^^^^^^^^^^ | note: lifetime used multiple times - --> $DIR/generic_duplicate_param_use.rs:10:19 + --> $DIR/generic_duplicate_param_use.rs:13:19 | LL | type TwoLifetimes<'a, 'b> = impl Debug; | ^^ ^^ error: non-defining opaque type use in defining scope - --> $DIR/generic_duplicate_param_use.rs:23:50 + --> $DIR/generic_duplicate_param_use.rs:26:50 | LL | fn one_const(t: *mut [u8; N]) -> TwoConsts { | ^^^^^^^^^^^^^^^ | note: constant used multiple times - --> $DIR/generic_duplicate_param_use.rs:11:22 + --> $DIR/generic_duplicate_param_use.rs:14:22 | LL | type TwoConsts = impl Debug; | ^ ^ diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use.min_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use.min_tait.stderr new file mode 100644 index 0000000000..805cea7127 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use.min_tait.stderr @@ -0,0 +1,38 @@ +error: non-defining opaque type use in defining scope + --> $DIR/generic_duplicate_param_use.rs:16:30 + | +LL | fn one_ty(t: T) -> TwoTys { + | ^^^^^^^^^^^^ + | +note: type used multiple times + --> $DIR/generic_duplicate_param_use.rs:12:13 + | +LL | type TwoTys = impl Debug; + | ^ ^ + +error: non-defining opaque type use in defining scope + --> $DIR/generic_duplicate_param_use.rs:21:36 + | +LL | fn one_lifetime<'a>(t: &'a u32) -> TwoLifetimes<'a, 'a> { + | ^^^^^^^^^^^^^^^^^^^^ + | +note: lifetime used multiple times + --> $DIR/generic_duplicate_param_use.rs:13:19 + | +LL | type TwoLifetimes<'a, 'b> = impl Debug; + | ^^ ^^ + +error: non-defining opaque type use in defining scope + --> $DIR/generic_duplicate_param_use.rs:26:50 + | +LL | fn one_const(t: *mut [u8; N]) -> TwoConsts { + | ^^^^^^^^^^^^^^^ + | +note: constant used multiple times + --> $DIR/generic_duplicate_param_use.rs:14:22 + | +LL | type TwoConsts = impl Debug; + | ^ ^ + +error: aborting due to 3 previous errors + diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use.rs b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use.rs index 4503607a83..12ff5a2e71 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use.rs +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait, const_generics)] +#![feature(const_generics)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] #![allow(incomplete_features)] use std::fmt::Debug; diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use10.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use10.full_tait.stderr new file mode 100644 index 0000000000..ef7d4f1be4 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use10.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_duplicate_param_use10.rs:4:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use10.rs b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use10.rs index c17d595dbb..c7a7ded212 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use10.rs +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use10.rs @@ -1,5 +1,8 @@ // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::fmt::Debug; diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use2.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use2.full_tait.stderr new file mode 100644 index 0000000000..357d477c9f --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use2.full_tait.stderr @@ -0,0 +1,23 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_duplicate_param_use2.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: non-defining opaque type use in defining scope + --> $DIR/generic_duplicate_param_use2.rs:13:27 + | +LL | fn one(t: T) -> Two { + | ^^^^^^^^^ + | +note: type used multiple times + --> $DIR/generic_duplicate_param_use2.rs:11:10 + | +LL | type Two = impl Debug; + | ^ ^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use2.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use2.min_tait.stderr similarity index 73% rename from src/test/ui/type-alias-impl-trait/generic_duplicate_param_use2.stderr rename to src/test/ui/type-alias-impl-trait/generic_duplicate_param_use2.min_tait.stderr index d87e8c5783..805ab67816 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use2.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use2.min_tait.stderr @@ -1,11 +1,11 @@ error: non-defining opaque type use in defining scope - --> $DIR/generic_duplicate_param_use2.rs:10:27 + --> $DIR/generic_duplicate_param_use2.rs:13:27 | LL | fn one(t: T) -> Two { | ^^^^^^^^^ | note: type used multiple times - --> $DIR/generic_duplicate_param_use2.rs:8:10 + --> $DIR/generic_duplicate_param_use2.rs:11:10 | LL | type Two = impl Debug; | ^ ^ diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use2.rs b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use2.rs index a74731df69..ff51662282 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use2.rs +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use2.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::fmt::Debug; diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use3.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use3.full_tait.stderr new file mode 100644 index 0000000000..b2004c8416 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use3.full_tait.stderr @@ -0,0 +1,23 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_duplicate_param_use3.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: non-defining opaque type use in defining scope + --> $DIR/generic_duplicate_param_use3.rs:13:27 + | +LL | fn one(t: T) -> Two { + | ^^^^^^^^^ + | +note: type used multiple times + --> $DIR/generic_duplicate_param_use3.rs:11:10 + | +LL | type Two = impl Debug; + | ^ ^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use3.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use3.min_tait.stderr similarity index 73% rename from src/test/ui/type-alias-impl-trait/generic_duplicate_param_use3.stderr rename to src/test/ui/type-alias-impl-trait/generic_duplicate_param_use3.min_tait.stderr index 711de855f0..43af9eca63 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use3.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use3.min_tait.stderr @@ -1,11 +1,11 @@ error: non-defining opaque type use in defining scope - --> $DIR/generic_duplicate_param_use3.rs:10:27 + --> $DIR/generic_duplicate_param_use3.rs:13:27 | LL | fn one(t: T) -> Two { | ^^^^^^^^^ | note: type used multiple times - --> $DIR/generic_duplicate_param_use3.rs:8:10 + --> $DIR/generic_duplicate_param_use3.rs:11:10 | LL | type Two = impl Debug; | ^ ^ diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use3.rs b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use3.rs index 0597b8385d..f7d1cc1ad4 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use3.rs +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use3.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::fmt::Debug; diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use4.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use4.full_tait.stderr new file mode 100644 index 0000000000..f5db77a08d --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use4.full_tait.stderr @@ -0,0 +1,23 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_duplicate_param_use4.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: non-defining opaque type use in defining scope + --> $DIR/generic_duplicate_param_use4.rs:13:27 + | +LL | fn one(t: T) -> Two { + | ^^^^^^^^^ + | +note: type used multiple times + --> $DIR/generic_duplicate_param_use4.rs:11:10 + | +LL | type Two = impl Debug; + | ^ ^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use4.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use4.min_tait.stderr similarity index 73% rename from src/test/ui/type-alias-impl-trait/generic_duplicate_param_use4.stderr rename to src/test/ui/type-alias-impl-trait/generic_duplicate_param_use4.min_tait.stderr index fcf01f5164..f8e2b51046 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use4.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use4.min_tait.stderr @@ -1,11 +1,11 @@ error: non-defining opaque type use in defining scope - --> $DIR/generic_duplicate_param_use4.rs:10:27 + --> $DIR/generic_duplicate_param_use4.rs:13:27 | LL | fn one(t: T) -> Two { | ^^^^^^^^^ | note: type used multiple times - --> $DIR/generic_duplicate_param_use4.rs:8:10 + --> $DIR/generic_duplicate_param_use4.rs:11:10 | LL | type Two = impl Debug; | ^ ^ diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use4.rs b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use4.rs index 40388c3b6c..26583a6ce9 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use4.rs +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use4.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::fmt::Debug; diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use5.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use5.full_tait.stderr new file mode 100644 index 0000000000..8a0c411c77 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use5.full_tait.stderr @@ -0,0 +1,48 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_duplicate_param_use5.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: concrete type differs from previous defining opaque type use + --> $DIR/generic_duplicate_param_use5.rs:19:1 + | +LL | fn three(t: T, u: U) -> Two { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `(T, U)`, got `(U, T)` + | +note: previous use here + --> $DIR/generic_duplicate_param_use5.rs:15:1 + | +LL | fn two(t: T, u: U) -> Two { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0277]: `T` doesn't implement `Debug` + --> $DIR/generic_duplicate_param_use5.rs:11:18 + | +LL | type Two = impl Debug; + | ^^^^^^^^^^ `T` cannot be formatted using `{:?}` because it doesn't implement `Debug` + | + = note: required because of the requirements on the impl of `Debug` for `(T, U)` +help: consider restricting type parameter `T` + | +LL | type Two = impl Debug; + | ^^^^^^^ + +error[E0277]: `U` doesn't implement `Debug` + --> $DIR/generic_duplicate_param_use5.rs:11:18 + | +LL | type Two = impl Debug; + | ^^^^^^^^^^ `U` cannot be formatted using `{:?}` because it doesn't implement `Debug` + | + = note: required because of the requirements on the impl of `Debug` for `(T, U)` +help: consider restricting type parameter `U` + | +LL | type Two = impl Debug; + | ^^^^^^^ + +error: aborting due to 3 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use5.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use5.min_tait.stderr similarity index 86% rename from src/test/ui/type-alias-impl-trait/generic_duplicate_param_use5.stderr rename to src/test/ui/type-alias-impl-trait/generic_duplicate_param_use5.min_tait.stderr index b4aed4a632..35115ccb2d 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use5.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use5.min_tait.stderr @@ -1,17 +1,17 @@ error: concrete type differs from previous defining opaque type use - --> $DIR/generic_duplicate_param_use5.rs:16:1 + --> $DIR/generic_duplicate_param_use5.rs:19:1 | LL | fn three(t: T, u: U) -> Two { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `(T, U)`, got `(U, T)` | note: previous use here - --> $DIR/generic_duplicate_param_use5.rs:12:1 + --> $DIR/generic_duplicate_param_use5.rs:15:1 | LL | fn two(t: T, u: U) -> Two { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0277]: `T` doesn't implement `Debug` - --> $DIR/generic_duplicate_param_use5.rs:8:18 + --> $DIR/generic_duplicate_param_use5.rs:11:18 | LL | type Two = impl Debug; | ^^^^^^^^^^ `T` cannot be formatted using `{:?}` because it doesn't implement `Debug` @@ -23,7 +23,7 @@ LL | type Two = impl Debug; | ^^^^^^^ error[E0277]: `U` doesn't implement `Debug` - --> $DIR/generic_duplicate_param_use5.rs:8:18 + --> $DIR/generic_duplicate_param_use5.rs:11:18 | LL | type Two = impl Debug; | ^^^^^^^^^^ `U` cannot be formatted using `{:?}` because it doesn't implement `Debug` diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use5.rs b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use5.rs index dd2f202cf5..af473e8245 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use5.rs +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use5.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::fmt::Debug; diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use6.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use6.full_tait.stderr new file mode 100644 index 0000000000..8f72c333e8 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use6.full_tait.stderr @@ -0,0 +1,36 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_duplicate_param_use6.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: concrete type differs from previous defining opaque type use + --> $DIR/generic_duplicate_param_use6.rs:18:1 + | +LL | fn three(t: T, u: U) -> Two { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `(T, T)`, got `(U, T)` + | +note: previous use here + --> $DIR/generic_duplicate_param_use6.rs:14:1 + | +LL | fn two(t: T, u: U) -> Two { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0277]: `T` doesn't implement `Debug` + --> $DIR/generic_duplicate_param_use6.rs:11:18 + | +LL | type Two = impl Debug; + | ^^^^^^^^^^ `T` cannot be formatted using `{:?}` because it doesn't implement `Debug` + | + = note: required because of the requirements on the impl of `Debug` for `(T, T)` +help: consider restricting type parameter `T` + | +LL | type Two = impl Debug; + | ^^^^^^^ + +error: aborting due to 2 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use6.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use6.min_tait.stderr similarity index 86% rename from src/test/ui/type-alias-impl-trait/generic_duplicate_param_use6.stderr rename to src/test/ui/type-alias-impl-trait/generic_duplicate_param_use6.min_tait.stderr index 22e4d00667..922c9a7420 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use6.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use6.min_tait.stderr @@ -1,17 +1,17 @@ error: concrete type differs from previous defining opaque type use - --> $DIR/generic_duplicate_param_use6.rs:15:1 + --> $DIR/generic_duplicate_param_use6.rs:18:1 | LL | fn three(t: T, u: U) -> Two { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `(T, T)`, got `(U, T)` | note: previous use here - --> $DIR/generic_duplicate_param_use6.rs:11:1 + --> $DIR/generic_duplicate_param_use6.rs:14:1 | LL | fn two(t: T, u: U) -> Two { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0277]: `T` doesn't implement `Debug` - --> $DIR/generic_duplicate_param_use6.rs:8:18 + --> $DIR/generic_duplicate_param_use6.rs:11:18 | LL | type Two = impl Debug; | ^^^^^^^^^^ `T` cannot be formatted using `{:?}` because it doesn't implement `Debug` diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use6.rs b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use6.rs index d54d3cd62e..01afb2f449 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use6.rs +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use6.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::fmt::Debug; diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use7.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use7.full_tait.stderr new file mode 100644 index 0000000000..d80c8326ad --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use7.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_duplicate_param_use7.rs:4:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use7.rs b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use7.rs index feebf81eef..184e3a5f92 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use7.rs +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use7.rs @@ -1,5 +1,8 @@ // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::fmt::Debug; diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use8.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use8.full_tait.stderr new file mode 100644 index 0000000000..a93321d4d0 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use8.full_tait.stderr @@ -0,0 +1,36 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_duplicate_param_use8.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: concrete type differs from previous defining opaque type use + --> $DIR/generic_duplicate_param_use8.rs:17:1 + | +LL | fn three(_: T, u: U) -> Two { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `(T, u32)`, got `(U, u32)` + | +note: previous use here + --> $DIR/generic_duplicate_param_use8.rs:13:1 + | +LL | fn two(t: T, _: U) -> Two { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0277]: `T` doesn't implement `Debug` + --> $DIR/generic_duplicate_param_use8.rs:10:18 + | +LL | type Two = impl Debug; + | ^^^^^^^^^^ `T` cannot be formatted using `{:?}` because it doesn't implement `Debug` + | + = note: required because of the requirements on the impl of `Debug` for `(T, u32)` +help: consider restricting type parameter `T` + | +LL | type Two = impl Debug; + | ^^^^^^^ + +error: aborting due to 2 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use8.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use8.min_tait.stderr similarity index 85% rename from src/test/ui/type-alias-impl-trait/generic_duplicate_param_use8.stderr rename to src/test/ui/type-alias-impl-trait/generic_duplicate_param_use8.min_tait.stderr index 82da704c9e..25ac60799f 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use8.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use8.min_tait.stderr @@ -1,17 +1,17 @@ error: concrete type differs from previous defining opaque type use - --> $DIR/generic_duplicate_param_use8.rs:14:1 + --> $DIR/generic_duplicate_param_use8.rs:17:1 | LL | fn three(_: T, u: U) -> Two { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `(T, u32)`, got `(U, u32)` | note: previous use here - --> $DIR/generic_duplicate_param_use8.rs:10:1 + --> $DIR/generic_duplicate_param_use8.rs:13:1 | LL | fn two(t: T, _: U) -> Two { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0277]: `T` doesn't implement `Debug` - --> $DIR/generic_duplicate_param_use8.rs:7:18 + --> $DIR/generic_duplicate_param_use8.rs:10:18 | LL | type Two = impl Debug; | ^^^^^^^^^^ `T` cannot be formatted using `{:?}` because it doesn't implement `Debug` diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use8.rs b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use8.rs index 4a723b64cd..ecb8b2cedb 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use8.rs +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use8.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::fmt::Debug; diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use9.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use9.full_tait.stderr new file mode 100644 index 0000000000..098be7929d --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use9.full_tait.stderr @@ -0,0 +1,60 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_duplicate_param_use9.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: concrete type differs from previous defining opaque type use + --> $DIR/generic_duplicate_param_use9.rs:24:1 + | +LL | fn three(t: T, u: U) -> Two { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `(A, B, ::Bar)`, got `(A, B, i32)` + | +note: previous use here + --> $DIR/generic_duplicate_param_use9.rs:20:1 + | +LL | fn two(t: T, u: U) -> Two { + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error[E0277]: the trait bound `A: Foo` is not satisfied in `(A, B, ::Bar)` + --> $DIR/generic_duplicate_param_use9.rs:10:18 + | +LL | type Two = impl Debug; + | ^^^^^^^^^^ within `(A, B, ::Bar)`, the trait `Foo` is not implemented for `A` + | + = note: required because it appears within the type `(A, B, ::Bar)` +help: consider restricting type parameter `A` + | +LL | type Two = impl Debug; + | ^^^^^ + +error[E0277]: `A` doesn't implement `Debug` + --> $DIR/generic_duplicate_param_use9.rs:10:18 + | +LL | type Two = impl Debug; + | ^^^^^^^^^^ `A` cannot be formatted using `{:?}` because it doesn't implement `Debug` + | + = note: required because of the requirements on the impl of `Debug` for `(A, B, ::Bar)` +help: consider restricting type parameter `A` + | +LL | type Two = impl Debug; + | ^^^^^^^ + +error[E0277]: `B` doesn't implement `Debug` + --> $DIR/generic_duplicate_param_use9.rs:10:18 + | +LL | type Two = impl Debug; + | ^^^^^^^^^^ `B` cannot be formatted using `{:?}` because it doesn't implement `Debug` + | + = note: required because of the requirements on the impl of `Debug` for `(A, B, ::Bar)` +help: consider restricting type parameter `B` + | +LL | type Two = impl Debug; + | ^^^^^^^ + +error: aborting due to 4 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use9.stderr b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use9.min_tait.stderr similarity index 87% rename from src/test/ui/type-alias-impl-trait/generic_duplicate_param_use9.stderr rename to src/test/ui/type-alias-impl-trait/generic_duplicate_param_use9.min_tait.stderr index 63aa0f8a81..b59e10c1b0 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use9.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use9.min_tait.stderr @@ -1,17 +1,17 @@ error: concrete type differs from previous defining opaque type use - --> $DIR/generic_duplicate_param_use9.rs:21:1 + --> $DIR/generic_duplicate_param_use9.rs:24:1 | LL | fn three(t: T, u: U) -> Two { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ expected `(A, B, ::Bar)`, got `(A, B, i32)` | note: previous use here - --> $DIR/generic_duplicate_param_use9.rs:17:1 + --> $DIR/generic_duplicate_param_use9.rs:20:1 | LL | fn two(t: T, u: U) -> Two { | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ error[E0277]: the trait bound `A: Foo` is not satisfied in `(A, B, ::Bar)` - --> $DIR/generic_duplicate_param_use9.rs:7:18 + --> $DIR/generic_duplicate_param_use9.rs:10:18 | LL | type Two = impl Debug; | ^^^^^^^^^^ within `(A, B, ::Bar)`, the trait `Foo` is not implemented for `A` @@ -23,7 +23,7 @@ LL | type Two = impl Debug; | ^^^^^ error[E0277]: `A` doesn't implement `Debug` - --> $DIR/generic_duplicate_param_use9.rs:7:18 + --> $DIR/generic_duplicate_param_use9.rs:10:18 | LL | type Two = impl Debug; | ^^^^^^^^^^ `A` cannot be formatted using `{:?}` because it doesn't implement `Debug` @@ -35,7 +35,7 @@ LL | type Two = impl Debug; | ^^^^^^^ error[E0277]: `B` doesn't implement `Debug` - --> $DIR/generic_duplicate_param_use9.rs:7:18 + --> $DIR/generic_duplicate_param_use9.rs:10:18 | LL | type Two = impl Debug; | ^^^^^^^^^^ `B` cannot be formatted using `{:?}` because it doesn't implement `Debug` diff --git a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use9.rs b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use9.rs index 7470819331..5eced6cfa5 100644 --- a/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use9.rs +++ b/src/test/ui/type-alias-impl-trait/generic_duplicate_param_use9.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::fmt::Debug; diff --git a/src/test/ui/type-alias-impl-trait/generic_lifetime_param.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_lifetime_param.full_tait.stderr new file mode 100644 index 0000000000..39817757f1 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_lifetime_param.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_lifetime_param.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/generic_lifetime_param.rs b/src/test/ui/type-alias-impl-trait/generic_lifetime_param.rs index e109c38c98..dbe7cfd1c8 100644 --- a/src/test/ui/type-alias-impl-trait/generic_lifetime_param.rs +++ b/src/test/ui/type-alias-impl-trait/generic_lifetime_param.rs @@ -1,6 +1,9 @@ // build-pass (FIXME(62277): could be check-pass?) -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/generic_nondefining_use.stderr b/src/test/ui/type-alias-impl-trait/generic_nondefining_use.full_tait.stderr similarity index 80% rename from src/test/ui/type-alias-impl-trait/generic_nondefining_use.stderr rename to src/test/ui/type-alias-impl-trait/generic_nondefining_use.full_tait.stderr index 88f8dbe1a7..4d7eddfb2f 100644 --- a/src/test/ui/type-alias-impl-trait/generic_nondefining_use.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_nondefining_use.full_tait.stderr @@ -1,17 +1,17 @@ error: non-defining opaque type use in defining scope - --> $DIR/generic_nondefining_use.rs:14:21 + --> $DIR/generic_nondefining_use.rs:17:21 | LL | fn concrete_ty() -> OneTy { | ^^^^^^^^^^ | note: used non-generic type `u32` for generic parameter - --> $DIR/generic_nondefining_use.rs:8:12 + --> $DIR/generic_nondefining_use.rs:11:12 | LL | type OneTy = impl Debug; | ^ error: non-defining opaque type use in defining scope - --> $DIR/generic_nondefining_use.rs:19:27 + --> $DIR/generic_nondefining_use.rs:22:27 | LL | type OneLifetime<'a> = impl Debug; | -- cannot use static lifetime; use a bound lifetime instead or remove the lifetime parameter from the opaque type @@ -20,13 +20,13 @@ LL | fn concrete_lifetime() -> OneLifetime<'static> { | ^^^^^^^^^^^^^^^^^^^^ error: non-defining opaque type use in defining scope - --> $DIR/generic_nondefining_use.rs:24:24 + --> $DIR/generic_nondefining_use.rs:27:24 | LL | fn concrete_const() -> OneConst<{123}> { | ^^^^^^^^^^^^^^^ | note: used non-generic constant `{123}` for generic parameter - --> $DIR/generic_nondefining_use.rs:10:21 + --> $DIR/generic_nondefining_use.rs:13:21 | LL | type OneConst = impl Debug; | ^ diff --git a/src/test/ui/type-alias-impl-trait/generic_nondefining_use.min_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_nondefining_use.min_tait.stderr new file mode 100644 index 0000000000..4d7eddfb2f --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_nondefining_use.min_tait.stderr @@ -0,0 +1,35 @@ +error: non-defining opaque type use in defining scope + --> $DIR/generic_nondefining_use.rs:17:21 + | +LL | fn concrete_ty() -> OneTy { + | ^^^^^^^^^^ + | +note: used non-generic type `u32` for generic parameter + --> $DIR/generic_nondefining_use.rs:11:12 + | +LL | type OneTy = impl Debug; + | ^ + +error: non-defining opaque type use in defining scope + --> $DIR/generic_nondefining_use.rs:22:27 + | +LL | type OneLifetime<'a> = impl Debug; + | -- cannot use static lifetime; use a bound lifetime instead or remove the lifetime parameter from the opaque type +... +LL | fn concrete_lifetime() -> OneLifetime<'static> { + | ^^^^^^^^^^^^^^^^^^^^ + +error: non-defining opaque type use in defining scope + --> $DIR/generic_nondefining_use.rs:27:24 + | +LL | fn concrete_const() -> OneConst<{123}> { + | ^^^^^^^^^^^^^^^ + | +note: used non-generic constant `{123}` for generic parameter + --> $DIR/generic_nondefining_use.rs:13:21 + | +LL | type OneConst = impl Debug; + | ^ + +error: aborting due to 3 previous errors + diff --git a/src/test/ui/type-alias-impl-trait/generic_nondefining_use.rs b/src/test/ui/type-alias-impl-trait/generic_nondefining_use.rs index b1782120f8..c69884d8d6 100644 --- a/src/test/ui/type-alias-impl-trait/generic_nondefining_use.rs +++ b/src/test/ui/type-alias-impl-trait/generic_nondefining_use.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait, const_generics)] +#![feature(const_generics)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] #![allow(incomplete_features)] use std::fmt::Debug; diff --git a/src/test/ui/type-alias-impl-trait/generic_not_used.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_not_used.full_tait.stderr new file mode 100644 index 0000000000..819ef7b771 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_not_used.full_tait.stderr @@ -0,0 +1,27 @@ +error: at least one trait must be specified + --> $DIR/generic_not_used.rs:8:33 + | +LL | type WrongGeneric = impl 'static; + | ^^^^^^^^^^^^ + +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_not_used.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: type parameter `V` is part of concrete type but not used in parameter list for the `impl Trait` type alias + --> $DIR/generic_not_used.rs:11:73 + | +LL | fn wrong_generic(_: U, v: V) -> WrongGeneric { + | _________________________________________________________________________^ +LL | | +LL | | v +LL | | } + | |_^ + +error: aborting due to 2 previous errors; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/generic_not_used.stderr b/src/test/ui/type-alias-impl-trait/generic_not_used.min_tait.stderr similarity index 87% rename from src/test/ui/type-alias-impl-trait/generic_not_used.stderr rename to src/test/ui/type-alias-impl-trait/generic_not_used.min_tait.stderr index 8015ff7ede..fe7f5f6c71 100644 --- a/src/test/ui/type-alias-impl-trait/generic_not_used.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_not_used.min_tait.stderr @@ -1,11 +1,11 @@ error: at least one trait must be specified - --> $DIR/generic_not_used.rs:5:33 + --> $DIR/generic_not_used.rs:8:33 | LL | type WrongGeneric = impl 'static; | ^^^^^^^^^^^^ error: type parameter `V` is part of concrete type but not used in parameter list for the `impl Trait` type alias - --> $DIR/generic_not_used.rs:8:73 + --> $DIR/generic_not_used.rs:11:73 | LL | fn wrong_generic(_: U, v: V) -> WrongGeneric { | _________________________________________________________________________^ diff --git a/src/test/ui/type-alias-impl-trait/generic_not_used.rs b/src/test/ui/type-alias-impl-trait/generic_not_used.rs index ace52dc83a..68f50b2151 100644 --- a/src/test/ui/type-alias-impl-trait/generic_not_used.rs +++ b/src/test/ui/type-alias-impl-trait/generic_not_used.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.full_tait.nll.stderr b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.full_tait.nll.stderr new file mode 100644 index 0000000000..d0f3be336d --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.full_tait.nll.stderr @@ -0,0 +1,50 @@ +error: at least one trait must be specified + --> $DIR/generic_type_does_not_live_long_enough.rs:12:24 + | +LL | type WrongGeneric = impl 'static; + | ^^^^^^^^^^^^ + +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_type_does_not_live_long_enough.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0308]: mismatched types + --> $DIR/generic_type_does_not_live_long_enough.rs:9:18 + | +LL | let z: i32 = x; + | --- ^ expected `i32`, found opaque type + | | + | expected due to this +... +LL | type WrongGeneric = impl 'static; + | ------------ the found opaque type + | + = note: expected type `i32` + found opaque type `impl Sized` + +error[E0310]: the parameter type `T` may not live long enough + --> $DIR/generic_type_does_not_live_long_enough.rs:17:30 + | +LL | fn wrong_generic(t: T) -> WrongGeneric { + | ^^^^^^^^^^^^^^^ + | + = help: consider adding an explicit lifetime bound `T: 'static`... + +error[E0310]: the parameter type `T` may not live long enough + --> $DIR/generic_type_does_not_live_long_enough.rs:12:24 + | +LL | type WrongGeneric = impl 'static; + | ^^^^^^^^^^^^ + | + = help: consider adding an explicit lifetime bound `T: 'static`... + = note: ...so that the type `T` will meet its required lifetime bounds + +error: aborting due to 4 previous errors; 1 warning emitted + +Some errors have detailed explanations: E0308, E0310. +For more information about an error, try `rustc --explain E0308`. diff --git a/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.full_tait.stderr new file mode 100644 index 0000000000..6394a1f8e8 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.full_tait.stderr @@ -0,0 +1,51 @@ +error: at least one trait must be specified + --> $DIR/generic_type_does_not_live_long_enough.rs:12:24 + | +LL | type WrongGeneric = impl 'static; + | ^^^^^^^^^^^^ + +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_type_does_not_live_long_enough.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0308]: mismatched types + --> $DIR/generic_type_does_not_live_long_enough.rs:9:18 + | +LL | let z: i32 = x; + | --- ^ expected `i32`, found opaque type + | | + | expected due to this +... +LL | type WrongGeneric = impl 'static; + | ------------ the found opaque type + | + = note: expected type `i32` + found opaque type `impl Sized` + +error[E0310]: the parameter type `T` may not live long enough + --> $DIR/generic_type_does_not_live_long_enough.rs:12:24 + | +LL | type WrongGeneric = impl 'static; + | ^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds +... +LL | fn wrong_generic(t: T) -> WrongGeneric { + | - help: consider adding an explicit lifetime bound...: `T: 'static` + +error[E0310]: the parameter type `T` may not live long enough + --> $DIR/generic_type_does_not_live_long_enough.rs:12:24 + | +LL | type WrongGeneric = impl 'static; + | ^^^^^^^^^^^^ + | + = help: consider adding an explicit lifetime bound `T: 'static`... + = note: ...so that the type `T` will meet its required lifetime bounds + +error: aborting due to 4 previous errors; 1 warning emitted + +Some errors have detailed explanations: E0308, E0310. +For more information about an error, try `rustc --explain E0308`. 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.min_tait.nll.stderr similarity index 83% rename from src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.nll.stderr rename to src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.min_tait.nll.stderr index ffd6f34c4b..7496d96fa2 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.min_tait.nll.stderr @@ -1,11 +1,11 @@ error: at least one trait must be specified - --> $DIR/generic_type_does_not_live_long_enough.rs:9:24 + --> $DIR/generic_type_does_not_live_long_enough.rs:12:24 | LL | type WrongGeneric = impl 'static; | ^^^^^^^^^^^^ error[E0308]: mismatched types - --> $DIR/generic_type_does_not_live_long_enough.rs:6:18 + --> $DIR/generic_type_does_not_live_long_enough.rs:9:18 | LL | let z: i32 = x; | --- ^ expected `i32`, found opaque type @@ -19,7 +19,7 @@ LL | type WrongGeneric = impl 'static; found opaque type `impl Sized` error[E0310]: the parameter type `T` may not live long enough - --> $DIR/generic_type_does_not_live_long_enough.rs:14:30 + --> $DIR/generic_type_does_not_live_long_enough.rs:17:30 | LL | fn wrong_generic(t: T) -> WrongGeneric { | ^^^^^^^^^^^^^^^ @@ -27,7 +27,7 @@ LL | fn wrong_generic(t: T) -> WrongGeneric { = help: consider adding an explicit lifetime bound `T: 'static`... error[E0310]: the parameter type `T` may not live long enough - --> $DIR/generic_type_does_not_live_long_enough.rs:9:24 + --> $DIR/generic_type_does_not_live_long_enough.rs:12:24 | LL | type WrongGeneric = impl 'static; | ^^^^^^^^^^^^ 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.min_tait.stderr similarity index 84% rename from src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.stderr rename to src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.min_tait.stderr index 4924c447d7..49ead8b094 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.min_tait.stderr @@ -1,11 +1,11 @@ error: at least one trait must be specified - --> $DIR/generic_type_does_not_live_long_enough.rs:9:24 + --> $DIR/generic_type_does_not_live_long_enough.rs:12:24 | LL | type WrongGeneric = impl 'static; | ^^^^^^^^^^^^ error[E0308]: mismatched types - --> $DIR/generic_type_does_not_live_long_enough.rs:6:18 + --> $DIR/generic_type_does_not_live_long_enough.rs:9:18 | LL | let z: i32 = x; | --- ^ expected `i32`, found opaque type @@ -19,7 +19,7 @@ LL | type WrongGeneric = impl 'static; found opaque type `impl Sized` error[E0310]: the parameter type `T` may not live long enough - --> $DIR/generic_type_does_not_live_long_enough.rs:9:24 + --> $DIR/generic_type_does_not_live_long_enough.rs:12:24 | LL | type WrongGeneric = impl 'static; | ^^^^^^^^^^^^ ...so that the type `T` will meet its required lifetime bounds @@ -28,7 +28,7 @@ LL | fn wrong_generic(t: T) -> WrongGeneric { | - help: consider adding an explicit lifetime bound...: `T: 'static` error[E0310]: the parameter type `T` may not live long enough - --> $DIR/generic_type_does_not_live_long_enough.rs:9:24 + --> $DIR/generic_type_does_not_live_long_enough.rs:12:24 | LL | type WrongGeneric = impl 'static; | ^^^^^^^^^^^^ diff --git a/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.rs b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.rs index f6d4909603..3dda34ff66 100644 --- a/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.rs +++ b/src/test/ui/type-alias-impl-trait/generic_type_does_not_live_long_enough.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() { let y = 42; diff --git a/src/test/ui/type-alias-impl-trait/generic_underconstrained.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_underconstrained.full_tait.stderr new file mode 100644 index 0000000000..c4778a46fb --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_underconstrained.full_tait.stderr @@ -0,0 +1,32 @@ +error: at least one trait must be specified + --> $DIR/generic_underconstrained.rs:9:35 + | +LL | type Underconstrained = impl 'static; + | ^^^^^^^^^^^^ + +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_underconstrained.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0277]: the trait bound `T: Trait` is not satisfied + --> $DIR/generic_underconstrained.rs:13:31 + | +LL | type Underconstrained = impl 'static; + | ----- required by this bound in `Underconstrained` +... +LL | fn underconstrain(_: T) -> Underconstrained { + | ^^^^^^^^^^^^^^^^^^^ the trait `Trait` is not implemented for `T` + | +help: consider restricting type parameter `T` + | +LL | fn underconstrain(_: T) -> Underconstrained { + | ^^^^^^^ + +error: aborting due to 2 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/type-alias-impl-trait/generic_underconstrained.stderr b/src/test/ui/type-alias-impl-trait/generic_underconstrained.min_tait.stderr similarity index 89% rename from src/test/ui/type-alias-impl-trait/generic_underconstrained.stderr rename to src/test/ui/type-alias-impl-trait/generic_underconstrained.min_tait.stderr index cefc5d99b3..6c1d6debee 100644 --- a/src/test/ui/type-alias-impl-trait/generic_underconstrained.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_underconstrained.min_tait.stderr @@ -1,11 +1,11 @@ error: at least one trait must be specified - --> $DIR/generic_underconstrained.rs:6:35 + --> $DIR/generic_underconstrained.rs:9:35 | LL | type Underconstrained = impl 'static; | ^^^^^^^^^^^^ error[E0277]: the trait bound `T: Trait` is not satisfied - --> $DIR/generic_underconstrained.rs:10:31 + --> $DIR/generic_underconstrained.rs:13:31 | LL | type Underconstrained = impl 'static; | ----- required by this bound in `Underconstrained` diff --git a/src/test/ui/type-alias-impl-trait/generic_underconstrained.rs b/src/test/ui/type-alias-impl-trait/generic_underconstrained.rs index 766ee36c02..f4c4a1b72c 100644 --- a/src/test/ui/type-alias-impl-trait/generic_underconstrained.rs +++ b/src/test/ui/type-alias-impl-trait/generic_underconstrained.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/generic_underconstrained2.full_tait.stderr b/src/test/ui/type-alias-impl-trait/generic_underconstrained2.full_tait.stderr new file mode 100644 index 0000000000..ca263ba4f5 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/generic_underconstrained2.full_tait.stderr @@ -0,0 +1,52 @@ +error: at least one trait must be specified + --> $DIR/generic_underconstrained2.rs:8:45 + | +LL | type Underconstrained = impl 'static; + | ^^^^^^^^^^^^ + +error: at least one trait must be specified + --> $DIR/generic_underconstrained2.rs:17:46 + | +LL | type Underconstrained2 = impl 'static; + | ^^^^^^^^^^^^ + +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/generic_underconstrained2.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0277]: `U` doesn't implement `Debug` + --> $DIR/generic_underconstrained2.rs:12:33 + | +LL | type Underconstrained = impl 'static; + | --------------- required by this bound in `Underconstrained` +... +LL | fn underconstrained(_: U) -> Underconstrained { + | ^^^^^^^^^^^^^^^^^^^ `U` cannot be formatted using `{:?}` because it doesn't implement `Debug` + | +help: consider restricting type parameter `U` + | +LL | fn underconstrained(_: U) -> Underconstrained { + | ^^^^^^^ + +error[E0277]: `V` doesn't implement `Debug` + --> $DIR/generic_underconstrained2.rs:21:43 + | +LL | type Underconstrained2 = impl 'static; + | --------------- required by this bound in `Underconstrained2` +... +LL | fn underconstrained2(_: U, _: V) -> Underconstrained2 { + | ^^^^^^^^^^^^^^^^^^^^ `V` cannot be formatted using `{:?}` because it doesn't implement `Debug` + | +help: consider restricting type parameter `V` + | +LL | fn underconstrained2(_: U, _: V) -> Underconstrained2 { + | ^^^^^^^ + +error: aborting due to 4 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/type-alias-impl-trait/generic_underconstrained2.stderr b/src/test/ui/type-alias-impl-trait/generic_underconstrained2.min_tait.stderr similarity index 89% rename from src/test/ui/type-alias-impl-trait/generic_underconstrained2.stderr rename to src/test/ui/type-alias-impl-trait/generic_underconstrained2.min_tait.stderr index 669546aef8..6ce32f457e 100644 --- a/src/test/ui/type-alias-impl-trait/generic_underconstrained2.stderr +++ b/src/test/ui/type-alias-impl-trait/generic_underconstrained2.min_tait.stderr @@ -1,17 +1,17 @@ error: at least one trait must be specified - --> $DIR/generic_underconstrained2.rs:5:45 + --> $DIR/generic_underconstrained2.rs:8:45 | LL | type Underconstrained = impl 'static; | ^^^^^^^^^^^^ error: at least one trait must be specified - --> $DIR/generic_underconstrained2.rs:14:46 + --> $DIR/generic_underconstrained2.rs:17:46 | LL | type Underconstrained2 = impl 'static; | ^^^^^^^^^^^^ error[E0277]: `U` doesn't implement `Debug` - --> $DIR/generic_underconstrained2.rs:9:33 + --> $DIR/generic_underconstrained2.rs:12:33 | LL | type Underconstrained = impl 'static; | --------------- required by this bound in `Underconstrained` @@ -25,7 +25,7 @@ LL | fn underconstrained(_: U) -> Underconstrained { | ^^^^^^^ error[E0277]: `V` doesn't implement `Debug` - --> $DIR/generic_underconstrained2.rs:18:43 + --> $DIR/generic_underconstrained2.rs:21:43 | LL | type Underconstrained2 = impl 'static; | --------------- required by this bound in `Underconstrained2` diff --git a/src/test/ui/type-alias-impl-trait/generic_underconstrained2.rs b/src/test/ui/type-alias-impl-trait/generic_underconstrained2.rs index cd7c962e2d..b3fb0748d2 100644 --- a/src/test/ui/type-alias-impl-trait/generic_underconstrained2.rs +++ b/src/test/ui/type-alias-impl-trait/generic_underconstrained2.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/impl-with-unconstrained-param.full_tait.stderr b/src/test/ui/type-alias-impl-trait/impl-with-unconstrained-param.full_tait.stderr new file mode 100644 index 0000000000..bdd8813429 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/impl-with-unconstrained-param.full_tait.stderr @@ -0,0 +1,18 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/impl-with-unconstrained-param.rs:6:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or predicates + --> $DIR/impl-with-unconstrained-param.rs:14:6 + | +LL | impl X for () { + | ^ unconstrained type parameter + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0207`. diff --git a/src/test/ui/type-alias-impl-trait/impl-with-unconstrained-param.stderr b/src/test/ui/type-alias-impl-trait/impl-with-unconstrained-param.min_tait.stderr similarity index 85% rename from src/test/ui/type-alias-impl-trait/impl-with-unconstrained-param.stderr rename to src/test/ui/type-alias-impl-trait/impl-with-unconstrained-param.min_tait.stderr index 8cf8fb1d16..eb59766b91 100644 --- a/src/test/ui/type-alias-impl-trait/impl-with-unconstrained-param.stderr +++ b/src/test/ui/type-alias-impl-trait/impl-with-unconstrained-param.min_tait.stderr @@ -1,5 +1,5 @@ error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or predicates - --> $DIR/impl-with-unconstrained-param.rs:11:6 + --> $DIR/impl-with-unconstrained-param.rs:14:6 | LL | impl X for () { | ^ unconstrained type parameter diff --git a/src/test/ui/type-alias-impl-trait/impl-with-unconstrained-param.rs b/src/test/ui/type-alias-impl-trait/impl-with-unconstrained-param.rs index 851c2f66c4..1aefa2474f 100644 --- a/src/test/ui/type-alias-impl-trait/impl-with-unconstrained-param.rs +++ b/src/test/ui/type-alias-impl-trait/impl-with-unconstrained-param.rs @@ -1,7 +1,10 @@ // Ensure that we don't ICE if associated type impl trait is used in an impl // with an unconstrained type parameter. -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait X { type I; diff --git a/src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.full_tait.stderr b/src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.full_tait.stderr new file mode 100644 index 0000000000..30521b8bf7 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.full_tait.stderr @@ -0,0 +1,32 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/incoherent-assoc-imp-trait.rs:6:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0119]: conflicting implementations of trait `std::ops::FnOnce<()>` for type `&_`: + --> $DIR/incoherent-assoc-imp-trait.rs:13:1 + | +LL | impl FnOnce<()> for &F { + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: conflicting implementation in crate `core`: + - impl FnOnce for &F + where F: Fn, F: ?Sized; + +error[E0210]: type parameter `F` must be used as the type parameter for some local type (e.g., `MyStruct`) + --> $DIR/incoherent-assoc-imp-trait.rs:13:6 + | +LL | impl 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 it is 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; 1 warning emitted + +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/incoherent-assoc-imp-trait.stderr b/src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.min_tait.stderr similarity index 90% rename from src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.stderr rename to src/test/ui/type-alias-impl-trait/incoherent-assoc-imp-trait.min_tait.stderr index eafbd2ad07..a0427624ec 100644 --- 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.min_tait.stderr @@ -1,5 +1,5 @@ error[E0119]: conflicting implementations of trait `std::ops::FnOnce<()>` for type `&_`: - --> $DIR/incoherent-assoc-imp-trait.rs:10:1 + --> $DIR/incoherent-assoc-imp-trait.rs:13:1 | LL | impl FnOnce<()> for &F { | ^^^^^^^^^^^^^^^^^^^^^^^^^ @@ -9,7 +9,7 @@ LL | impl FnOnce<()> for &F { where F: Fn, F: ?Sized; error[E0210]: type parameter `F` must be used as the type parameter for some local type (e.g., `MyStruct`) - --> $DIR/incoherent-assoc-imp-trait.rs:10:6 + --> $DIR/incoherent-assoc-imp-trait.rs:13:6 | LL | impl FnOnce<()> for &F { | ^ type parameter `F` must be used as the type parameter for some local type 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 index c46c471592..b52b9c18f0 100644 --- 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 @@ -1,7 +1,10 @@ // Regression test for issue 67856 #![feature(unboxed_closures)] -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #![feature(fn_traits)] trait MyTrait {} diff --git a/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.full_tait.stderr new file mode 100644 index 0000000000..4effd87120 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.full_tait.stderr @@ -0,0 +1,23 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-52843-closure-constrain.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: concrete type differs from previous defining opaque type use + --> $DIR/issue-52843-closure-constrain.rs:13:16 + | +LL | let null = || -> Opaque { 0 }; + | ^^^^^^^^^^^^^^^^^^ expected `String`, got `i32` + | +note: previous use here + --> $DIR/issue-52843-closure-constrain.rs:12:5 + | +LL | fn _unused() -> Opaque { String::new() } + | ^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.min_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.min_tait.stderr new file mode 100644 index 0000000000..c2cb4829fb --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.min_tait.stderr @@ -0,0 +1,24 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-52843-closure-constrain.rs:13:22 + | +LL | let null = || -> Opaque { 0 }; + | ^^^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + +error: concrete type differs from previous defining opaque type use + --> $DIR/issue-52843-closure-constrain.rs:13:16 + | +LL | let null = || -> Opaque { 0 }; + | ^^^^^^^^^^^^^^^^^^ expected `String`, got `[type error]` + | +note: previous use here + --> $DIR/issue-52843-closure-constrain.rs:12:5 + | +LL | fn _unused() -> Opaque { String::new() } + | ^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.rs b/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.rs index 50eeff0b18..01f874155f 100644 --- a/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.rs +++ b/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.rs @@ -1,13 +1,16 @@ // Checks to ensure that we properly detect when a closure constrains an opaque type -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::fmt::Debug; fn main() { type Opaque = impl Debug; fn _unused() -> Opaque { String::new() } - let null = || -> Opaque { 0 }; + let null = || -> Opaque { 0 }; //[min_tait]~ ERROR: not permitted here //~^ ERROR: concrete type differs from previous defining opaque type use println!("{:?}", null()); } diff --git a/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.stderr b/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.stderr deleted file mode 100644 index d82050e263..0000000000 --- a/src/test/ui/type-alias-impl-trait/issue-52843-closure-constrain.stderr +++ /dev/null @@ -1,14 +0,0 @@ -error: concrete type differs from previous defining opaque type use - --> $DIR/issue-52843-closure-constrain.rs:10:16 - | -LL | let null = || -> Opaque { 0 }; - | ^^^^^^^^^^^^^^^^^^ expected `String`, got `i32` - | -note: previous use here - --> $DIR/issue-52843-closure-constrain.rs:9:5 - | -LL | fn _unused() -> Opaque { String::new() } - | ^^^^^^^^^^^^^^^^^^^^^^ - -error: aborting due to previous error - diff --git a/src/test/ui/type-alias-impl-trait/issue-52843.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-52843.full_tait.stderr new file mode 100644 index 0000000000..14f4f62d7a --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-52843.full_tait.stderr @@ -0,0 +1,23 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-52843.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0277]: the trait bound `T: Default` is not satisfied + --> $DIR/issue-52843.rs:6:15 + | +LL | type Foo = impl Default; + | ^^^^^^^^^^^^ the trait `Default` is not implemented for `T` + | +help: consider restricting type parameter `T` + | +LL | type Foo = impl Default; + | ^^^^^^^^^ + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0277`. diff --git a/src/test/ui/type-alias-impl-trait/issue-52843.stderr b/src/test/ui/type-alias-impl-trait/issue-52843.min_tait.stderr similarity index 92% rename from src/test/ui/type-alias-impl-trait/issue-52843.stderr rename to src/test/ui/type-alias-impl-trait/issue-52843.min_tait.stderr index 25db8dfabf..6dda27f515 100644 --- a/src/test/ui/type-alias-impl-trait/issue-52843.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-52843.min_tait.stderr @@ -1,5 +1,5 @@ error[E0277]: the trait bound `T: Default` is not satisfied - --> $DIR/issue-52843.rs:3:15 + --> $DIR/issue-52843.rs:6:15 | LL | type Foo = impl Default; | ^^^^^^^^^^^^ the trait `Default` is not implemented for `T` diff --git a/src/test/ui/type-alias-impl-trait/issue-52843.rs b/src/test/ui/type-alias-impl-trait/issue-52843.rs index b24959d720..14f9db6eae 100644 --- a/src/test/ui/type-alias-impl-trait/issue-52843.rs +++ b/src/test/ui/type-alias-impl-trait/issue-52843.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete type Foo = impl Default; //~^ ERROR: the trait bound `T: Default` is not satisfied diff --git a/src/test/ui/type-alias-impl-trait/issue-53096.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-53096.full_tait.stderr new file mode 100644 index 0000000000..1a03ce7966 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-53096.full_tait.stderr @@ -0,0 +1,25 @@ +warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-53096.rs:4:32 + | +LL | #![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63065 for more information + +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-53096.rs:4:56 + | +LL | #![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63063 for more information + +error: fatal error triggered by #[rustc_error] + --> $DIR/issue-53096.rs:14:1 + | +LL | fn main() {} + | ^^^^^^^^^ + +error: aborting due to previous error; 2 warnings emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-53096.min_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-53096.min_tait.stderr new file mode 100644 index 0000000000..c6c7a51618 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-53096.min_tait.stderr @@ -0,0 +1,12 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-53096.rs:10:19 + | +LL | const BAZR: Foo = bar(); + | ^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` 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/type-alias-impl-trait/issue-53096.rs b/src/test/ui/type-alias-impl-trait/issue-53096.rs index 6e1973bd18..fb621dc0bc 100644 --- a/src/test/ui/type-alias-impl-trait/issue-53096.rs +++ b/src/test/ui/type-alias-impl-trait/issue-53096.rs @@ -1,9 +1,14 @@ -// check-pass -#![feature(const_impl_trait, const_fn_fn_ptr_basics)] -#![feature(type_alias_impl_trait)] +#![feature(const_impl_trait, const_fn_fn_ptr_basics, rustc_attrs)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete +//[full_tait]~| WARN incomplete type Foo = impl Fn() -> usize; const fn bar() -> Foo { || 0usize } const BAZR: Foo = bar(); +//[min_tait]~^ ERROR not permitted here -fn main() {} +#[rustc_error] +fn main() {} //[full_tait]~ ERROR diff --git a/src/test/ui/type-alias-impl-trait/issue-53598.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-53598.full_tait.stderr new file mode 100644 index 0000000000..8c2d713c16 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-53598.full_tait.stderr @@ -0,0 +1,21 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-53598.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: type parameter `T` is part of concrete type but not used in parameter list for the `impl Trait` type alias + --> $DIR/issue-53598.rs:24:42 + | +LL | fn foo(_: T) -> Self::Item { + | __________________________________________^ +LL | | +LL | | S::(Default::default()) +LL | | } + | |_____^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-53598.stderr b/src/test/ui/type-alias-impl-trait/issue-53598.min_tait.stderr similarity index 91% rename from src/test/ui/type-alias-impl-trait/issue-53598.stderr rename to src/test/ui/type-alias-impl-trait/issue-53598.min_tait.stderr index 79e2682da3..cb5d6ec804 100644 --- a/src/test/ui/type-alias-impl-trait/issue-53598.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-53598.min_tait.stderr @@ -1,5 +1,5 @@ error: type parameter `T` is part of concrete type but not used in parameter list for the `impl Trait` type alias - --> $DIR/issue-53598.rs:21:42 + --> $DIR/issue-53598.rs:24:42 | LL | fn foo(_: T) -> Self::Item { | __________________________________________^ diff --git a/src/test/ui/type-alias-impl-trait/issue-53598.rs b/src/test/ui/type-alias-impl-trait/issue-53598.rs index add9662938..1388c587db 100644 --- a/src/test/ui/type-alias-impl-trait/issue-53598.rs +++ b/src/test/ui/type-alias-impl-trait/issue-53598.rs @@ -1,6 +1,9 @@ // ignore-tidy-linelength // ignore-compare-mode-chalk -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::fmt::Debug; diff --git a/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.full_tait.stderr new file mode 100644 index 0000000000..70d049ffa7 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.full_tait.stderr @@ -0,0 +1,25 @@ +warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-53678-generator-and-const-fn.rs:4:32 + | +LL | #![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63065 for more information + +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-53678-generator-and-const-fn.rs:4:56 + | +LL | #![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63063 for more information + +error: fatal error triggered by #[rustc_error] + --> $DIR/issue-53678-generator-and-const-fn.rs:23:1 + | +LL | fn main() {} + | ^^^^^^^^^ + +error: aborting due to previous error; 2 warnings emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.min_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.min_tait.stderr new file mode 100644 index 0000000000..a3dea45a6a --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.min_tait.stderr @@ -0,0 +1,12 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-53678-generator-and-const-fn.rs:20:36 + | +LL | const FOO: GenOnce = const_generator(10, 100); + | ^^^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` 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/type-alias-impl-trait/issue-53678-generator-and-const-fn.rs b/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.rs index 4582d5386f..bf607d29ce 100644 --- a/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.rs +++ b/src/test/ui/type-alias-impl-trait/issue-53678-generator-and-const-fn.rs @@ -1,6 +1,9 @@ -// check-pass - -#![feature(const_impl_trait, generators, generator_trait, type_alias_impl_trait)] +#![feature(const_impl_trait, generators, generator_trait, rustc_attrs)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(impl_trait_in_bindings, type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete +//[full_tait]~| WARN incomplete use std::ops::Generator; @@ -14,6 +17,7 @@ const fn const_generator(yielding: Y, returning: R) -> GenOnce { } } -const FOO: GenOnce = const_generator(10, 100); +const FOO: GenOnce = const_generator(10, 100); //[min_tait]~ ERROR not permitted here -fn main() {} +#[rustc_error] +fn main() {} //[full_tait]~ ERROR diff --git a/src/test/ui/type-alias-impl-trait/issue-55099-lifetime-inference.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-55099-lifetime-inference.full_tait.stderr new file mode 100644 index 0000000000..98778210bf --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-55099-lifetime-inference.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-55099-lifetime-inference.rs:8:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-55099-lifetime-inference.rs b/src/test/ui/type-alias-impl-trait/issue-55099-lifetime-inference.rs index 8e8508cdd6..2c24e9d744 100644 --- a/src/test/ui/type-alias-impl-trait/issue-55099-lifetime-inference.rs +++ b/src/test/ui/type-alias-impl-trait/issue-55099-lifetime-inference.rs @@ -3,7 +3,10 @@ // Tests that we don't incorrectly consider a lifetime to part // of the concrete type -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait Future { } diff --git a/src/test/ui/type-alias-impl-trait/issue-57188-associate-impl-capture.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-57188-associate-impl-capture.full_tait.stderr new file mode 100644 index 0000000000..d31c232fc2 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-57188-associate-impl-capture.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-57188-associate-impl-capture.rs:7:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-57188-associate-impl-capture.rs b/src/test/ui/type-alias-impl-trait/issue-57188-associate-impl-capture.rs index 3a7a5da075..645a4c5696 100644 --- a/src/test/ui/type-alias-impl-trait/issue-57188-associate-impl-capture.rs +++ b/src/test/ui/type-alias-impl-trait/issue-57188-associate-impl-capture.rs @@ -2,7 +2,10 @@ // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete struct Baz<'a> { source: &'a str, diff --git a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.full_tait.nll.stderr b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.full_tait.nll.stderr new file mode 100644 index 0000000000..481d66dd81 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.full_tait.nll.stderr @@ -0,0 +1,47 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-57611-trait-alias.rs:8:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: higher-ranked subtype error + --> $DIR/issue-57611-trait-alias.rs:28:9 + | +LL | |x| x + | ^^^^^ + +error: higher-ranked subtype error + --> $DIR/issue-57611-trait-alias.rs:28:9 + | +LL | |x| x + | ^^^^^ + +error[E0308]: mismatched types + --> $DIR/issue-57611-trait-alias.rs:20:16 + | +LL | type Bar = impl Baz; + | ^^^^^^^^^^^^^^^^^^^^ one type is more general than the other + | + = note: expected type `for<'r> Fn<(&'r X,)>` + found type `Fn<(&'static X,)>` +note: this closure does not fulfill the lifetime requirements + --> $DIR/issue-57611-trait-alias.rs:28:9 + | +LL | |x| x + | ^^^^^ + +error: implementation of `FnOnce` is not general enough + --> $DIR/issue-57611-trait-alias.rs:20:16 + | +LL | type Bar = impl Baz; + | ^^^^^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough + | + = note: closure with signature `fn(&'static X) -> &'static X` must implement `FnOnce<(&'0 X,)>`, for any lifetime `'0`... + = note: ...but it actually implements `FnOnce<(&'static X,)>` + +error: aborting due to 4 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.full_tait.stderr new file mode 100644 index 0000000000..d90f328708 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.full_tait.stderr @@ -0,0 +1,67 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-57611-trait-alias.rs:8:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: implementation of `FnOnce` is not general enough + --> $DIR/issue-57611-trait-alias.rs:20:16 + | +LL | type Bar = impl Baz; + | ^^^^^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough + | + = note: closure with signature `fn(&'2 X) -> &X` must implement `FnOnce<(&'1 X,)>`, for any lifetime `'1`... + = note: ...but it actually implements `FnOnce<(&'2 X,)>`, for some specific lifetime `'2` + +error[E0308]: mismatched types + --> $DIR/issue-57611-trait-alias.rs:20:16 + | +LL | type Bar = impl Baz; + | ^^^^^^^^^^^^^^^^^^^^ one type is more general than the other + | + = note: expected type `for<'r> Fn<(&'r X,)>` + found type `Fn<(&' X,)>` +note: this closure does not fulfill the lifetime requirements + --> $DIR/issue-57611-trait-alias.rs:28:9 + | +LL | |x| x + | ^^^^^ + +error: implementation of `FnOnce` is not general enough + --> $DIR/issue-57611-trait-alias.rs:20:16 + | +LL | type Bar = impl Baz; + | ^^^^^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough + | + = note: closure with signature `fn(&'2 X) -> &'2 X` must implement `FnOnce<(&'1 X,)>`, for any lifetime `'1`... + = note: ...but it actually implements `FnOnce<(&'2 X,)>`, for some specific lifetime `'2` + +error[E0308]: mismatched types + --> $DIR/issue-57611-trait-alias.rs:20:16 + | +LL | type Bar = impl Baz; + | ^^^^^^^^^^^^^^^^^^^^ one type is more general than the other + | + = note: expected type `for<'r> Fn<(&'r X,)>` + found type `Fn<(&' X,)>` +note: this closure does not fulfill the lifetime requirements + --> $DIR/issue-57611-trait-alias.rs:28:9 + | +LL | |x| x + | ^^^^^ + +error: implementation of `FnOnce` is not general enough + --> $DIR/issue-57611-trait-alias.rs:20:16 + | +LL | type Bar = impl Baz; + | ^^^^^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough + | + = note: closure with signature `fn(&'2 X) -> &'2 X` must implement `FnOnce<(&'1 X,)>`, for any lifetime `'1`... + = note: ...but it actually implements `FnOnce<(&'2 X,)>`, for some specific lifetime `'2` + +error: aborting due to 5 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.nll.stderr b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.min_tait.nll.stderr similarity index 54% rename from src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.nll.stderr rename to src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.min_tait.nll.stderr index be1dd1a852..0343a76956 100644 --- a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.nll.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.min_tait.nll.stderr @@ -1,17 +1,17 @@ error: higher-ranked subtype error - --> $DIR/issue-57611-trait-alias.rs:25:9 + --> $DIR/issue-57611-trait-alias.rs:28:9 | LL | |x| x | ^^^^^ error: higher-ranked subtype error - --> $DIR/issue-57611-trait-alias.rs:25:9 + --> $DIR/issue-57611-trait-alias.rs:28:9 | LL | |x| x | ^^^^^ error[E0308]: mismatched types - --> $DIR/issue-57611-trait-alias.rs:17:16 + --> $DIR/issue-57611-trait-alias.rs:20:16 | LL | type Bar = impl Baz; | ^^^^^^^^^^^^^^^^^^^^ one type is more general than the other @@ -19,24 +19,19 @@ LL | type Bar = impl Baz; = note: expected type `for<'r> Fn<(&'r X,)>` found type `Fn<(&'static X,)>` note: this closure does not fulfill the lifetime requirements - --> $DIR/issue-57611-trait-alias.rs:25:9 + --> $DIR/issue-57611-trait-alias.rs:28:9 | LL | |x| x | ^^^^^ -error[E0308]: mismatched types - --> $DIR/issue-57611-trait-alias.rs:17:16 +error: implementation of `FnOnce` is not general enough + --> $DIR/issue-57611-trait-alias.rs:20:16 | LL | type Bar = impl Baz; - | ^^^^^^^^^^^^^^^^^^^^ one type is more general than the other - | - = note: expected type `FnOnce<(&X,)>` - found type `FnOnce<(&'static X,)>` -note: this closure does not fulfill the lifetime requirements - --> $DIR/issue-57611-trait-alias.rs:25:9 + | ^^^^^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough | -LL | |x| x - | ^^^^^ + = note: closure with signature `fn(&'static X) -> &'static X` must implement `FnOnce<(&'0 X,)>`, for any lifetime `'0`... + = note: ...but it actually implements `FnOnce<(&'static X,)>` error: aborting due to 4 previous errors diff --git a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.min_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.min_tait.stderr new file mode 100644 index 0000000000..d019f40757 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.min_tait.stderr @@ -0,0 +1,58 @@ +error: implementation of `FnOnce` is not general enough + --> $DIR/issue-57611-trait-alias.rs:20:16 + | +LL | type Bar = impl Baz; + | ^^^^^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough + | + = note: closure with signature `fn(&'2 X) -> &X` must implement `FnOnce<(&'1 X,)>`, for any lifetime `'1`... + = note: ...but it actually implements `FnOnce<(&'2 X,)>`, for some specific lifetime `'2` + +error[E0308]: mismatched types + --> $DIR/issue-57611-trait-alias.rs:20:16 + | +LL | type Bar = impl Baz; + | ^^^^^^^^^^^^^^^^^^^^ one type is more general than the other + | + = note: expected type `for<'r> Fn<(&'r X,)>` + found type `Fn<(&' X,)>` +note: this closure does not fulfill the lifetime requirements + --> $DIR/issue-57611-trait-alias.rs:28:9 + | +LL | |x| x + | ^^^^^ + +error: implementation of `FnOnce` is not general enough + --> $DIR/issue-57611-trait-alias.rs:20:16 + | +LL | type Bar = impl Baz; + | ^^^^^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough + | + = note: closure with signature `fn(&'2 X) -> &'2 X` must implement `FnOnce<(&'1 X,)>`, for any lifetime `'1`... + = note: ...but it actually implements `FnOnce<(&'2 X,)>`, for some specific lifetime `'2` + +error[E0308]: mismatched types + --> $DIR/issue-57611-trait-alias.rs:20:16 + | +LL | type Bar = impl Baz; + | ^^^^^^^^^^^^^^^^^^^^ one type is more general than the other + | + = note: expected type `for<'r> Fn<(&'r X,)>` + found type `Fn<(&' X,)>` +note: this closure does not fulfill the lifetime requirements + --> $DIR/issue-57611-trait-alias.rs:28:9 + | +LL | |x| x + | ^^^^^ + +error: implementation of `FnOnce` is not general enough + --> $DIR/issue-57611-trait-alias.rs:20:16 + | +LL | type Bar = impl Baz; + | ^^^^^^^^^^^^^^^^^^^^ implementation of `FnOnce` is not general enough + | + = note: closure with signature `fn(&'2 X) -> &'2 X` must implement `FnOnce<(&'1 X,)>`, for any lifetime `'1`... + = note: ...but it actually implements `FnOnce<(&'2 X,)>`, for some specific lifetime `'2` + +error: aborting due to 5 previous errors + +For more information about this error, try `rustc --explain E0308`. 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 index 3372b81404..ccc727e0bf 100644 --- 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 @@ -3,7 +3,10 @@ // FIXME: This should compile, but it currently doesn't #![feature(trait_alias)] -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait Foo { type Bar: Baz; @@ -15,9 +18,9 @@ struct X; impl Foo for X { type Bar = impl Baz; - //~^ ERROR mismatched types - //~| ERROR mismatched types - //~| ERROR mismatched types + //~^ ERROR implementation of `FnOnce` is not general enough + //~| ERROR implementation of `FnOnce` is not general enough + //~| ERROR implementation of `FnOnce` is not general enough //~| ERROR mismatched types //~| ERROR mismatched types 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 deleted file mode 100644 index 9d9293e958..0000000000 --- a/src/test/ui/type-alias-impl-trait/issue-57611-trait-alias.stderr +++ /dev/null @@ -1,73 +0,0 @@ -error[E0308]: mismatched types - --> $DIR/issue-57611-trait-alias.rs:17:16 - | -LL | type Bar = impl Baz; - | ^^^^^^^^^^^^^^^^^^^^ one type is more general than the other - | - = note: expected type `FnOnce<(&X,)>` - found type `FnOnce<(&X,)>` -note: this closure does not fulfill the lifetime requirements - --> $DIR/issue-57611-trait-alias.rs:25:9 - | -LL | |x| x - | ^^^^^ - -error[E0308]: mismatched types - --> $DIR/issue-57611-trait-alias.rs:17:16 - | -LL | type Bar = impl Baz; - | ^^^^^^^^^^^^^^^^^^^^ one type is more general than the other - | - = note: expected type `for<'r> Fn<(&'r X,)>` - found type `Fn<(&' X,)>` -note: this closure does not fulfill the lifetime requirements - --> $DIR/issue-57611-trait-alias.rs:25:9 - | -LL | |x| x - | ^^^^^ - -error[E0308]: mismatched types - --> $DIR/issue-57611-trait-alias.rs:17:16 - | -LL | type Bar = impl Baz; - | ^^^^^^^^^^^^^^^^^^^^ one type is more general than the other - | - = note: expected type `FnOnce<(&X,)>` - found type `FnOnce<(&' X,)>` -note: this closure does not fulfill the lifetime requirements - --> $DIR/issue-57611-trait-alias.rs:25:9 - | -LL | |x| x - | ^^^^^ - -error[E0308]: mismatched types - --> $DIR/issue-57611-trait-alias.rs:17:16 - | -LL | type Bar = impl Baz; - | ^^^^^^^^^^^^^^^^^^^^ one type is more general than the other - | - = note: expected type `for<'r> Fn<(&'r X,)>` - found type `Fn<(&' X,)>` -note: this closure does not fulfill the lifetime requirements - --> $DIR/issue-57611-trait-alias.rs:25:9 - | -LL | |x| x - | ^^^^^ - -error[E0308]: mismatched types - --> $DIR/issue-57611-trait-alias.rs:17:16 - | -LL | type Bar = impl Baz; - | ^^^^^^^^^^^^^^^^^^^^ one type is more general than the other - | - = note: expected type `FnOnce<(&X,)>` - found type `FnOnce<(&' X,)>` -note: this closure does not fulfill the lifetime requirements - --> $DIR/issue-57611-trait-alias.rs:25:9 - | -LL | |x| x - | ^^^^^ - -error: aborting due to 5 previous errors - -For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/type-alias-impl-trait/issue-57700.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-57700.full_tait.stderr new file mode 100644 index 0000000000..f92a5997a9 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-57700.full_tait.stderr @@ -0,0 +1,21 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-57700.rs:6:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: type parameter `impl Deref` is part of concrete type but not used in parameter list for the `impl Trait` type alias + --> $DIR/issue-57700.rs:20:58 + | +LL | fn foo(self: impl Deref) -> Self::Bar { + | __________________________________________________________^ +LL | | +LL | | self +LL | | } + | |_____^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-57700.stderr b/src/test/ui/type-alias-impl-trait/issue-57700.min_tait.stderr similarity index 92% rename from src/test/ui/type-alias-impl-trait/issue-57700.stderr rename to src/test/ui/type-alias-impl-trait/issue-57700.min_tait.stderr index dc6be87ee9..1aaa42b99a 100644 --- a/src/test/ui/type-alias-impl-trait/issue-57700.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-57700.min_tait.stderr @@ -1,5 +1,5 @@ error: type parameter `impl Deref` is part of concrete type but not used in parameter list for the `impl Trait` type alias - --> $DIR/issue-57700.rs:17:58 + --> $DIR/issue-57700.rs:20:58 | LL | fn foo(self: impl Deref) -> Self::Bar { | __________________________________________________________^ diff --git a/src/test/ui/type-alias-impl-trait/issue-57700.rs b/src/test/ui/type-alias-impl-trait/issue-57700.rs index c785ea2ee5..c7a123ad24 100644 --- a/src/test/ui/type-alias-impl-trait/issue-57700.rs +++ b/src/test/ui/type-alias-impl-trait/issue-57700.rs @@ -1,7 +1,10 @@ // ignore-tidy-linelength // ignore-compare-mode-chalk #![feature(arbitrary_self_types)] -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::ops::Deref; diff --git a/src/test/ui/type-alias-impl-trait/issue-57807-associated-type.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-57807-associated-type.full_tait.stderr new file mode 100644 index 0000000000..b35361c89a --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-57807-associated-type.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-57807-associated-type.rs:7:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + 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 index fcab2c7db2..0a021149e7 100644 --- 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 @@ -2,7 +2,10 @@ // that we properly unify associated types within // a type alias impl trait // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait Bar { type A; diff --git a/src/test/ui/type-alias-impl-trait/issue-58887.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-58887.full_tait.stderr new file mode 100644 index 0000000000..f0fd5f2f05 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-58887.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-58887.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-58887.rs b/src/test/ui/type-alias-impl-trait/issue-58887.rs index 96ac786028..f0803a663d 100644 --- a/src/test/ui/type-alias-impl-trait/issue-58887.rs +++ b/src/test/ui/type-alias-impl-trait/issue-58887.rs @@ -1,6 +1,9 @@ // run-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait UnwrapItemsExt { type Iter; diff --git a/src/test/ui/type-alias-impl-trait/issue-58951.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-58951.full_tait.stderr new file mode 100644 index 0000000000..164b888171 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-58951.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-58951.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-58951.rs b/src/test/ui/type-alias-impl-trait/issue-58951.rs index 3416c6745b..3b1ea0d676 100644 --- a/src/test/ui/type-alias-impl-trait/issue-58951.rs +++ b/src/test/ui/type-alias-impl-trait/issue-58951.rs @@ -1,6 +1,9 @@ // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete type A = impl Iterator; diff --git a/src/test/ui/type-alias-impl-trait/issue-60371.rs b/src/test/ui/type-alias-impl-trait/issue-60371.rs index 14d21418ae..4ac7f9423f 100644 --- a/src/test/ui/type-alias-impl-trait/issue-60371.rs +++ b/src/test/ui/type-alias-impl-trait/issue-60371.rs @@ -12,6 +12,7 @@ impl Bug for &() { //~^^ ERROR could not find defining uses const FUN: fn() -> Self::Item = || (); + //~^ ERROR type alias impl trait is not permitted here } fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/issue-60371.stderr b/src/test/ui/type-alias-impl-trait/issue-60371.stderr index d8e514a2cf..255d381bf0 100644 --- a/src/test/ui/type-alias-impl-trait/issue-60371.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-60371.stderr @@ -5,7 +5,16 @@ LL | type Item = impl Bug; | ^^^^^^^^ | = note: see issue #63063 for more information - = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + = help: add `#![feature(min_type_alias_impl_trait)]` to the crate attributes to enable + +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-60371.rs:14:37 + | +LL | const FUN: fn() -> Self::Item = || (); + | ^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable error[E0277]: the trait bound `(): Bug` is not satisfied --> $DIR/issue-60371.rs:10:17 @@ -22,7 +31,7 @@ error: could not find defining uses LL | type Item = impl Bug; | ^^^^^^^^ -error: aborting due to 3 previous errors +error: aborting due to 4 previous errors Some errors have detailed explanations: E0277, E0658. For more information about an error, try `rustc --explain E0277`. diff --git a/src/test/ui/type-alias-impl-trait/issue-60407.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-60407.full_tait.stderr new file mode 100644 index 0000000000..5edf73c8ce --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-60407.full_tait.stderr @@ -0,0 +1,25 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-60407.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-60407.rs:3:55 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + +error: fatal error triggered by #[rustc_error] + --> $DIR/issue-60407.rs:12:1 + | +LL | fn main() { + | ^^^^^^^^^ + +error: aborting due to previous error; 2 warnings emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-60407.min_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-60407.min_tait.stderr new file mode 100644 index 0000000000..edb8141c1b --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-60407.min_tait.stderr @@ -0,0 +1,24 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-60407.rs:9:39 + | +LL | static mut TEST: Option = None; + | ^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable + +error: concrete type differs from previous defining opaque type use + --> $DIR/issue-60407.rs:16:1 + | +LL | fn foo() -> Debuggable { + | ^^^^^^^^^^^^^^^^^^^^^^ expected `[type error]`, got `u32` + | +note: previous use here + --> $DIR/issue-60407.rs:9:1 + | +LL | static mut TEST: Option = None; + | ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/type-alias-impl-trait/issue-60407.rs b/src/test/ui/type-alias-impl-trait/issue-60407.rs index 7d462f057c..afcbf313cc 100644 --- a/src/test/ui/type-alias-impl-trait/issue-60407.rs +++ b/src/test/ui/type-alias-impl-trait/issue-60407.rs @@ -1,15 +1,18 @@ -// check-pass - -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait, rustc_attrs)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] +//[full_tait]~^ WARN incomplete +//[full_tait]~| WARN incomplete type Debuggable = impl core::fmt::Debug; -static mut TEST: Option = None; +static mut TEST: Option = None; //[min_tait]~ ERROR not permitted here -fn main() { +#[rustc_error] +fn main() { //[full_tait]~ ERROR unsafe { TEST = Some(foo()) } } -fn foo() -> Debuggable { +fn foo() -> Debuggable { //[min_tait]~ ERROR concrete type differs 0u32 } diff --git a/src/test/ui/type-alias-impl-trait/issue-60564.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-60564.full_tait.stderr new file mode 100644 index 0000000000..72b6b0648f --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-60564.full_tait.stderr @@ -0,0 +1,23 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-60564.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: non-defining opaque type use in defining scope + --> $DIR/issue-60564.rs:22:34 + | +LL | fn iter_bits(self, n: u8) -> Self::BitsIter { + | ^^^^^^^^^^^^^^ + | +note: used non-generic type `u8` for generic parameter + --> $DIR/issue-60564.rs:11:25 + | +LL | type IterBitsIter = impl std::iter::Iterator; + | ^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-60564.stderr b/src/test/ui/type-alias-impl-trait/issue-60564.min_tait.stderr similarity index 85% rename from src/test/ui/type-alias-impl-trait/issue-60564.stderr rename to src/test/ui/type-alias-impl-trait/issue-60564.min_tait.stderr index 66fa862ef9..72668c8056 100644 --- a/src/test/ui/type-alias-impl-trait/issue-60564.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-60564.min_tait.stderr @@ -1,11 +1,11 @@ error: non-defining opaque type use in defining scope - --> $DIR/issue-60564.rs:19:34 + --> $DIR/issue-60564.rs:22:34 | LL | fn iter_bits(self, n: u8) -> Self::BitsIter { | ^^^^^^^^^^^^^^ | note: used non-generic type `u8` for generic parameter - --> $DIR/issue-60564.rs:8:25 + --> $DIR/issue-60564.rs:11:25 | LL | type IterBitsIter = impl std::iter::Iterator; | ^ diff --git a/src/test/ui/type-alias-impl-trait/issue-60564.rs b/src/test/ui/type-alias-impl-trait/issue-60564.rs index 78def0d113..10fbbd2ef2 100644 --- a/src/test/ui/type-alias-impl-trait/issue-60564.rs +++ b/src/test/ui/type-alias-impl-trait/issue-60564.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait IterBits { type BitsIter: Iterator; diff --git a/src/test/ui/type-alias-impl-trait/issue-62000-associate-impl-trait-lifetimes.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-62000-associate-impl-trait-lifetimes.full_tait.stderr new file mode 100644 index 0000000000..1fc38d2f54 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-62000-associate-impl-trait-lifetimes.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-62000-associate-impl-trait-lifetimes.rs:7:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-62000-associate-impl-trait-lifetimes.rs b/src/test/ui/type-alias-impl-trait/issue-62000-associate-impl-trait-lifetimes.rs index 36779a0ce8..4d9ca47b94 100644 --- a/src/test/ui/type-alias-impl-trait/issue-62000-associate-impl-trait-lifetimes.rs +++ b/src/test/ui/type-alias-impl-trait/issue-62000-associate-impl-trait-lifetimes.rs @@ -2,7 +2,10 @@ // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait MyTrait { type AssocType: Send; diff --git a/src/test/ui/type-alias-impl-trait/issue-63263-closure-return.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-63263-closure-return.full_tait.stderr new file mode 100644 index 0000000000..1c6759e345 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-63263-closure-return.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-63263-closure-return.rs:9:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-63263-closure-return.rs b/src/test/ui/type-alias-impl-trait/issue-63263-closure-return.rs index 7414611a74..3b8f6afcb0 100644 --- a/src/test/ui/type-alias-impl-trait/issue-63263-closure-return.rs +++ b/src/test/ui/type-alias-impl-trait/issue-63263-closure-return.rs @@ -4,7 +4,8 @@ // check-pass -#![feature(type_alias_impl_trait)] +#![feature(min_type_alias_impl_trait, type_alias_impl_trait)] +//~^ WARN incomplete pub type Closure = impl FnOnce(); diff --git a/src/test/ui/type-alias-impl-trait/issue-63263-closure-return.stderr b/src/test/ui/type-alias-impl-trait/issue-63263-closure-return.stderr new file mode 100644 index 0000000000..e1f4ecd3b9 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-63263-closure-return.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-63263-closure-return.rs:7:39 + | +LL | #![feature(min_type_alias_impl_trait, type_alias_impl_trait)] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-63279.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-63279.full_tait.stderr new file mode 100644 index 0000000000..f544f61df9 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-63279.full_tait.stderr @@ -0,0 +1,21 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-63279.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0271]: type mismatch resolving `<[closure@$DIR/issue-63279.rs:11:5: 11:28] as FnOnce<()>>::Output == ()` + --> $DIR/issue-63279.rs:8:16 + | +LL | type Closure = impl FnOnce(); + | ^^^^^^^^^^^^^ expected opaque type, found `()` + | + = note: expected opaque type `impl FnOnce<()>` + found unit type `()` + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0271`. diff --git a/src/test/ui/type-alias-impl-trait/issue-63279.min_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-63279.min_tait.stderr new file mode 100644 index 0000000000..bdf414d0ba --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-63279.min_tait.stderr @@ -0,0 +1,22 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-63279.rs:11:11 + | +LL | || -> Closure { || () } + | ^^^^^^^ + | + = note: see issue #63063 for more information + = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + +error[E0271]: type mismatch resolving `<[closure@$DIR/issue-63279.rs:11:5: 11:28] as FnOnce<()>>::Output == ()` + --> $DIR/issue-63279.rs:8:16 + | +LL | type Closure = impl FnOnce(); + | ^^^^^^^^^^^^^ expected opaque type, found `()` + | + = note: expected opaque type `impl FnOnce<()>` + found unit type `()` + +error: aborting due to 2 previous errors + +Some errors have detailed explanations: E0271, E0658. +For more information about an error, try `rustc --explain E0271`. diff --git a/src/test/ui/type-alias-impl-trait/issue-63279.rs b/src/test/ui/type-alias-impl-trait/issue-63279.rs index b97192a2ae..086715626b 100644 --- a/src/test/ui/type-alias-impl-trait/issue-63279.rs +++ b/src/test/ui/type-alias-impl-trait/issue-63279.rs @@ -1,11 +1,14 @@ // compile-flags: -Zsave-analysis -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete type Closure = impl FnOnce(); //~ ERROR: type mismatch resolving fn c() -> Closure { - || -> Closure { || () } + || -> Closure { || () } //[min_tait]~ ERROR: not permitted here } fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/issue-63279.stderr b/src/test/ui/type-alias-impl-trait/issue-63279.stderr deleted file mode 100644 index 8615b3f741..0000000000 --- a/src/test/ui/type-alias-impl-trait/issue-63279.stderr +++ /dev/null @@ -1,12 +0,0 @@ -error[E0271]: type mismatch resolving `<[closure@$DIR/issue-63279.rs:8:5: 8:28] as FnOnce<()>>::Output == ()` - --> $DIR/issue-63279.rs:5:16 - | -LL | type Closure = impl FnOnce(); - | ^^^^^^^^^^^^^ expected opaque type, found `()` - | - = note: expected opaque type `impl FnOnce<()>` - found unit type `()` - -error: aborting due to previous error - -For more information about this error, try `rustc --explain E0271`. diff --git a/src/test/ui/type-alias-impl-trait/issue-63677-type-alias-coherence.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-63677-type-alias-coherence.full_tait.stderr new file mode 100644 index 0000000000..fc8d814716 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-63677-type-alias-coherence.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-63677-type-alias-coherence.rs:7:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-63677-type-alias-coherence.rs b/src/test/ui/type-alias-impl-trait/issue-63677-type-alias-coherence.rs index 28f4a85c9f..62d11ad38d 100644 --- a/src/test/ui/type-alias-impl-trait/issue-63677-type-alias-coherence.rs +++ b/src/test/ui/type-alias-impl-trait/issue-63677-type-alias-coherence.rs @@ -2,7 +2,10 @@ // Regression test for issue #63677 - ensure that // coherence checking can properly handle 'impl trait' // in type aliases -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete pub trait Trait {} pub struct S1(T); diff --git a/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.full_tait.stderr new file mode 100644 index 0000000000..cf668fc6e0 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.full_tait.stderr @@ -0,0 +1,25 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-65679-inst-opaque-ty-from-val-twice.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-65679-inst-opaque-ty-from-val-twice.rs:5:55 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + +error: fatal error triggered by #[rustc_error] + --> $DIR/issue-65679-inst-opaque-ty-from-val-twice.rs:19:1 + | +LL | fn main() { + | ^^^^^^^^^ + +error: aborting due to previous error; 2 warnings emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.min_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.min_tait.stderr new file mode 100644 index 0000000000..5b6c4b5cda --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.min_tait.stderr @@ -0,0 +1,21 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-65679-inst-opaque-ty-from-val-twice.rs:20:13 + | +LL | take(|| {}); + | ^ + | + = note: see issue #63063 for more information + = help: add `#![feature(type_alias_impl_trait)]` to the crate attributes to enable + +error[E0658]: type alias impl trait is not permitted here + --> $DIR/issue-65679-inst-opaque-ty-from-val-twice.rs:22:13 + | +LL | take(|| {}); + | ^ + | + = note: see issue #63063 for more information + = help: add `#![feature(type_alias_impl_trait)]` 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/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.rs b/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.rs index 26d97cea98..b7f05bd83e 100644 --- a/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.rs +++ b/src/test/ui/type-alias-impl-trait/issue-65679-inst-opaque-ty-from-val-twice.rs @@ -1,7 +1,10 @@ // compile-flags: -Zsave-analysis -// check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait, rustc_attrs)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] +//[full_tait]~^ WARN incomplete +//[full_tait]~| WARN incomplete type T = impl Sized; // The concrete type referred by impl-trait-type-alias(`T`) is guaranteed @@ -12,7 +15,10 @@ type T = impl Sized; fn take(_: fn() -> T) {} -fn main() { +#[rustc_error] +fn main() { //[full_tait]~ ERROR fatal error triggered by #[rustc_error] take(|| {}); + //[min_tait]~^ ERROR not permitted here take(|| {}); + //[min_tait]~^ ERROR not permitted here } diff --git a/src/test/ui/type-alias-impl-trait/issue-65918.rs b/src/test/ui/type-alias-impl-trait/issue-65918.rs index af6d501092..ab05e4b1cb 100644 --- a/src/test/ui/type-alias-impl-trait/issue-65918.rs +++ b/src/test/ui/type-alias-impl-trait/issue-65918.rs @@ -2,7 +2,10 @@ // build-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::marker::PhantomData; diff --git a/src/test/ui/type-alias-impl-trait/issue-66580-closure-coherence.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-66580-closure-coherence.full_tait.stderr new file mode 100644 index 0000000000..2fc4657451 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-66580-closure-coherence.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-66580-closure-coherence.rs:7:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-66580-closure-coherence.rs b/src/test/ui/type-alias-impl-trait/issue-66580-closure-coherence.rs index 1d95cc7530..7b3ddc7886 100644 --- a/src/test/ui/type-alias-impl-trait/issue-66580-closure-coherence.rs +++ b/src/test/ui/type-alias-impl-trait/issue-66580-closure-coherence.rs @@ -2,7 +2,10 @@ // Ensures that we don't try to determine whether a closure // is foreign when it's the underlying type of an opaque type // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete type Closure = impl FnOnce(); diff --git a/src/test/ui/type-alias-impl-trait/issue-67844-nested-opaque.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-67844-nested-opaque.full_tait.stderr new file mode 100644 index 0000000000..81e27da094 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-67844-nested-opaque.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-67844-nested-opaque.rs:8:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-67844-nested-opaque.rs b/src/test/ui/type-alias-impl-trait/issue-67844-nested-opaque.rs index 7da0b04926..b9e29a01cd 100644 --- a/src/test/ui/type-alias-impl-trait/issue-67844-nested-opaque.rs +++ b/src/test/ui/type-alias-impl-trait/issue-67844-nested-opaque.rs @@ -3,7 +3,10 @@ // Ensures that we properly handle nested TAIT occurrences // with generic parameters -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait WithAssoc { type AssocType; } diff --git a/src/test/ui/type-alias-impl-trait/issue-68368-non-defining-use.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-68368-non-defining-use.full_tait.stderr new file mode 100644 index 0000000000..8b1ad19ac0 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-68368-non-defining-use.full_tait.stderr @@ -0,0 +1,23 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-68368-non-defining-use.rs:7:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: non-defining opaque type use in defining scope + --> $DIR/issue-68368-non-defining-use.rs:11:15 + | +LL | fn f<'a>() -> Alias<'a, ()> {} + | ^^^^^^^^^^^^^ + | +note: used non-generic type `()` for generic parameter + --> $DIR/issue-68368-non-defining-use.rs:10:16 + | +LL | type Alias<'a, U> = impl Trait; + | ^ + +error: aborting due to previous error; 1 warning emitted + 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.min_tait.stderr similarity index 75% rename from src/test/ui/type-alias-impl-trait/issue-68368-non-defining-use.stderr rename to src/test/ui/type-alias-impl-trait/issue-68368-non-defining-use.min_tait.stderr index c2fa54f50f..01ae457851 100644 --- 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.min_tait.stderr @@ -1,11 +1,11 @@ error: non-defining opaque type use in defining scope - --> $DIR/issue-68368-non-defining-use.rs:8:15 + --> $DIR/issue-68368-non-defining-use.rs:11:15 | LL | fn f<'a>() -> Alias<'a, ()> {} | ^^^^^^^^^^^^^ | note: used non-generic type `()` for generic parameter - --> $DIR/issue-68368-non-defining-use.rs:7:16 + --> $DIR/issue-68368-non-defining-use.rs:10:16 | LL | type Alias<'a, U> = impl Trait; | ^ 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 index 3b6decbe9c..9246507673 100644 --- 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 @@ -2,7 +2,10 @@ // Ensures that we don't ICE when emitting an error // for a non-defining use when lifetimes are involved -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait Trait {} type Alias<'a, U> = impl Trait; fn f<'a>() -> Alias<'a, ()> {} diff --git a/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-error.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-error.full_tait.stderr new file mode 100644 index 0000000000..7f120af240 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-error.full_tait.stderr @@ -0,0 +1,20 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-69136-inner-lifetime-resolve-error.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0261]: use of undeclared lifetime name `'a` + --> $DIR/issue-69136-inner-lifetime-resolve-error.rs:20:65 + | +LL | type Return = impl WithAssoc; + | - ^^ undeclared lifetime + | | + | help: consider introducing lifetime `'a` here: `'a,` + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0261`. diff --git a/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-error.stderr b/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-error.min_tait.stderr similarity index 87% rename from src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-error.stderr rename to src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-error.min_tait.stderr index fe45e39d93..e1fc94c347 100644 --- a/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-error.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-error.min_tait.stderr @@ -1,5 +1,5 @@ error[E0261]: use of undeclared lifetime name `'a` - --> $DIR/issue-69136-inner-lifetime-resolve-error.rs:17:65 + --> $DIR/issue-69136-inner-lifetime-resolve-error.rs:20:65 | LL | type Return = impl WithAssoc; | - ^^ undeclared lifetime diff --git a/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-error.rs b/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-error.rs index 6732902c09..61161d44e5 100644 --- a/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-error.rs +++ b/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-error.rs @@ -1,6 +1,9 @@ // Regression test for #69136 -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait SomeTrait {} diff --git a/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-ok.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-ok.full_tait.stderr new file mode 100644 index 0000000000..61e2e20dfd --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-ok.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-69136-inner-lifetime-resolve-ok.rs:7:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-ok.rs b/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-ok.rs index a6916eda8b..01df967a4a 100644 --- a/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-ok.rs +++ b/src/test/ui/type-alias-impl-trait/issue-69136-inner-lifetime-resolve-ok.rs @@ -2,7 +2,10 @@ // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait SomeTrait {} diff --git a/src/test/ui/type-alias-impl-trait/issue-70121.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-70121.full_tait.stderr new file mode 100644 index 0000000000..9fe2e2cf88 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-70121.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-70121.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-70121.rs b/src/test/ui/type-alias-impl-trait/issue-70121.rs index dff0d89d46..150eca4697 100644 --- a/src/test/ui/type-alias-impl-trait/issue-70121.rs +++ b/src/test/ui/type-alias-impl-trait/issue-70121.rs @@ -1,6 +1,9 @@ // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete pub type Successors<'a> = impl Iterator; diff --git a/src/test/ui/type-alias-impl-trait/issue-74244.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-74244.full_tait.stderr new file mode 100644 index 0000000000..e7729e47c3 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-74244.full_tait.stderr @@ -0,0 +1,18 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-74244.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or predicates + --> $DIR/issue-74244.rs:12:6 + | +LL | impl Allocator for DefaultAllocator { + | ^ unconstrained type parameter + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0207`. diff --git a/src/test/ui/type-alias-impl-trait/issue-74244.stderr b/src/test/ui/type-alias-impl-trait/issue-74244.min_tait.stderr similarity index 90% rename from src/test/ui/type-alias-impl-trait/issue-74244.stderr rename to src/test/ui/type-alias-impl-trait/issue-74244.min_tait.stderr index ff6bacd277..6ee8c58826 100644 --- a/src/test/ui/type-alias-impl-trait/issue-74244.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-74244.min_tait.stderr @@ -1,5 +1,5 @@ error[E0207]: the type parameter `T` is not constrained by the impl trait, self type, or predicates - --> $DIR/issue-74244.rs:9:6 + --> $DIR/issue-74244.rs:12:6 | LL | impl Allocator for DefaultAllocator { | ^ unconstrained type parameter diff --git a/src/test/ui/type-alias-impl-trait/issue-74244.rs b/src/test/ui/type-alias-impl-trait/issue-74244.rs index bb4104b3d2..890eb23ef9 100644 --- a/src/test/ui/type-alias-impl-trait/issue-74244.rs +++ b/src/test/ui/type-alias-impl-trait/issue-74244.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait Allocator { type Buffer; diff --git a/src/test/ui/type-alias-impl-trait/issue-74761.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-74761.full_tait.stderr new file mode 100644 index 0000000000..0880136d71 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-74761.full_tait.stderr @@ -0,0 +1,24 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-74761.rs:4:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates + --> $DIR/issue-74761.rs:11:6 + | +LL | impl<'a, 'b> A for () { + | ^^ unconstrained lifetime parameter + +error[E0207]: the lifetime parameter `'b` is not constrained by the impl trait, self type, or predicates + --> $DIR/issue-74761.rs:11:10 + | +LL | impl<'a, 'b> A for () { + | ^^ unconstrained lifetime parameter + +error: aborting due to 2 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0207`. diff --git a/src/test/ui/type-alias-impl-trait/issue-74761.stderr b/src/test/ui/type-alias-impl-trait/issue-74761.min_tait.stderr similarity index 88% rename from src/test/ui/type-alias-impl-trait/issue-74761.stderr rename to src/test/ui/type-alias-impl-trait/issue-74761.min_tait.stderr index 3f38fa4de0..20ebdd9cb5 100644 --- a/src/test/ui/type-alias-impl-trait/issue-74761.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-74761.min_tait.stderr @@ -1,11 +1,11 @@ error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates - --> $DIR/issue-74761.rs:8:6 + --> $DIR/issue-74761.rs:11:6 | LL | impl<'a, 'b> A for () { | ^^ unconstrained lifetime parameter error[E0207]: the lifetime parameter `'b` is not constrained by the impl trait, self type, or predicates - --> $DIR/issue-74761.rs:8:10 + --> $DIR/issue-74761.rs:11:10 | LL | impl<'a, 'b> A for () { | ^^ unconstrained lifetime parameter diff --git a/src/test/ui/type-alias-impl-trait/issue-74761.rs b/src/test/ui/type-alias-impl-trait/issue-74761.rs index 4345b5d886..66bb079b25 100644 --- a/src/test/ui/type-alias-impl-trait/issue-74761.rs +++ b/src/test/ui/type-alias-impl-trait/issue-74761.rs @@ -1,5 +1,8 @@ #![feature(member_constraints)] -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete pub trait A { type B; diff --git a/src/test/ui/type-alias-impl-trait/issue-76202-trait-impl-for-tait.full_tait.stderr b/src/test/ui/type-alias-impl-trait/issue-76202-trait-impl-for-tait.full_tait.stderr new file mode 100644 index 0000000000..8fb4a3b662 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/issue-76202-trait-impl-for-tait.full_tait.stderr @@ -0,0 +1,23 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/issue-76202-trait-impl-for-tait.rs:6:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: cannot implement trait on type alias impl trait + --> $DIR/issue-76202-trait-impl-for-tait.rs:19:1 + | +LL | impl Test for F { + | ^^^^^^^^^^^^^^^ + | +note: type alias impl trait defined here + --> $DIR/issue-76202-trait-impl-for-tait.rs:12:10 + | +LL | type F = impl Dummy; + | ^^^^^^^^^^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/issue-76202-trait-impl-for-tait.stderr b/src/test/ui/type-alias-impl-trait/issue-76202-trait-impl-for-tait.min_tait.stderr similarity index 70% rename from src/test/ui/type-alias-impl-trait/issue-76202-trait-impl-for-tait.stderr rename to src/test/ui/type-alias-impl-trait/issue-76202-trait-impl-for-tait.min_tait.stderr index 8689ee5366..3754553772 100644 --- a/src/test/ui/type-alias-impl-trait/issue-76202-trait-impl-for-tait.stderr +++ b/src/test/ui/type-alias-impl-trait/issue-76202-trait-impl-for-tait.min_tait.stderr @@ -1,11 +1,11 @@ error: cannot implement trait on type alias impl trait - --> $DIR/issue-76202-trait-impl-for-tait.rs:16:1 + --> $DIR/issue-76202-trait-impl-for-tait.rs:19:1 | LL | impl Test for F { | ^^^^^^^^^^^^^^^ | note: type alias impl trait defined here - --> $DIR/issue-76202-trait-impl-for-tait.rs:9:10 + --> $DIR/issue-76202-trait-impl-for-tait.rs:12:10 | LL | type F = impl Dummy; | ^^^^^^^^^^ diff --git a/src/test/ui/type-alias-impl-trait/issue-76202-trait-impl-for-tait.rs b/src/test/ui/type-alias-impl-trait/issue-76202-trait-impl-for-tait.rs index 9ce19536e7..276c770fe4 100644 --- a/src/test/ui/type-alias-impl-trait/issue-76202-trait-impl-for-tait.rs +++ b/src/test/ui/type-alias-impl-trait/issue-76202-trait-impl-for-tait.rs @@ -1,7 +1,10 @@ // Regression test for issue #76202 // Tests that we don't ICE when we have a trait impl on a TAIT. -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait Dummy {} impl Dummy for () {} diff --git a/src/test/ui/type-alias-impl-trait/nested_type_alias_impl_trait.full_tait.stderr b/src/test/ui/type-alias-impl-trait/nested_type_alias_impl_trait.full_tait.stderr new file mode 100644 index 0000000000..5e4307be17 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/nested_type_alias_impl_trait.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/nested_type_alias_impl_trait.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/nested_type_alias_impl_trait.rs b/src/test/ui/type-alias-impl-trait/nested_type_alias_impl_trait.rs index 82c9ecd2ac..f03563dfed 100644 --- a/src/test/ui/type-alias-impl-trait/nested_type_alias_impl_trait.rs +++ b/src/test/ui/type-alias-impl-trait/nested_type_alias_impl_trait.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete // build-pass (FIXME(62277): could be check-pass?) mod my_mod { use std::fmt::Debug; diff --git a/src/test/ui/type-alias-impl-trait/never_reveal_concrete_type.full_tait.stderr b/src/test/ui/type-alias-impl-trait/never_reveal_concrete_type.full_tait.stderr new file mode 100644 index 0000000000..45c95469e9 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/never_reveal_concrete_type.full_tait.stderr @@ -0,0 +1,33 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/never_reveal_concrete_type.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0308]: mismatched types + --> $DIR/never_reveal_concrete_type.rs:16:27 + | +LL | type NoReveal = impl std::fmt::Debug; + | -------------------- the found opaque type +... +LL | let _: &'static str = x; + | ------------ ^ expected `&str`, found opaque type + | | + | expected due to this + | + = note: expected reference `&'static str` + found opaque type `impl Debug` + +error[E0605]: non-primitive cast: `impl Debug` as `&'static str` + --> $DIR/never_reveal_concrete_type.rs:17:13 + | +LL | let _ = x as &'static str; + | ^^^^^^^^^^^^^^^^^ an `as` expression can only be used to convert between primitive types or to coerce to a specific trait object + +error: aborting due to 2 previous errors; 1 warning emitted + +Some errors have detailed explanations: E0308, E0605. +For more information about an error, try `rustc --explain E0308`. 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.min_tait.stderr similarity index 89% rename from src/test/ui/type-alias-impl-trait/never_reveal_concrete_type.stderr rename to src/test/ui/type-alias-impl-trait/never_reveal_concrete_type.min_tait.stderr index b438f84451..530f8876cf 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.min_tait.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/never_reveal_concrete_type.rs:13:27 + --> $DIR/never_reveal_concrete_type.rs:16:27 | LL | type NoReveal = impl std::fmt::Debug; | -------------------- the found opaque type @@ -13,7 +13,7 @@ LL | let _: &'static str = x; found opaque type `impl Debug` error[E0605]: non-primitive cast: `impl Debug` as `&'static str` - --> $DIR/never_reveal_concrete_type.rs:14:13 + --> $DIR/never_reveal_concrete_type.rs:17:13 | LL | let _ = x as &'static str; | ^^^^^^^^^^^^^^^^^ an `as` expression can only be used to convert between primitive types or to coerce to a specific trait object diff --git a/src/test/ui/type-alias-impl-trait/never_reveal_concrete_type.rs b/src/test/ui/type-alias-impl-trait/never_reveal_concrete_type.rs index 8787c023eb..c555b9cdde 100644 --- a/src/test/ui/type-alias-impl-trait/never_reveal_concrete_type.rs +++ b/src/test/ui/type-alias-impl-trait/never_reveal_concrete_type.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.full_tait.stderr b/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.full_tait.stderr new file mode 100644 index 0000000000..40949c84d2 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.full_tait.stderr @@ -0,0 +1,25 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/no_inferrable_concrete_type.rs:6:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/no_inferrable_concrete_type.rs:6:55 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + +error: could not find defining uses + --> $DIR/no_inferrable_concrete_type.rs:10:12 + | +LL | type Foo = impl Copy; + | ^^^^^^^^^ + +error: aborting due to previous error; 2 warnings emitted + diff --git a/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.min_tait.stderr b/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.min_tait.stderr new file mode 100644 index 0000000000..d69e4cccdf --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.min_tait.stderr @@ -0,0 +1,18 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/no_inferrable_concrete_type.rs:16:12 + | +LL | let _: Foo = std::mem::transmute(0u8); + | ^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` to the crate attributes to enable + +error: could not find defining uses + --> $DIR/no_inferrable_concrete_type.rs:10:12 + | +LL | type Foo = impl Copy; + | ^^^^^^^^^ + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0658`. diff --git a/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.rs b/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.rs index c9ca504f78..8ff588ef27 100644 --- a/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.rs +++ b/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.rs @@ -1,7 +1,11 @@ // Issue 52985: user code provides no use case that allows a type alias `impl Trait` // We now emit a 'could not find defining uses' error -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] +//[full_tait]~^ WARN incomplete +//[full_tait]~| WARN incomplete type Foo = impl Copy; //~ could not find defining uses @@ -9,5 +13,5 @@ type Foo = impl Copy; //~ could not find defining uses fn bar(x: Foo) -> Foo { x } fn main() { - let _: Foo = std::mem::transmute(0u8); + let _: Foo = std::mem::transmute(0u8); //[min_tait]~ ERROR not permitted here } diff --git a/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.stderr b/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.stderr deleted file mode 100644 index 61025e8469..0000000000 --- a/src/test/ui/type-alias-impl-trait/no_inferrable_concrete_type.stderr +++ /dev/null @@ -1,8 +0,0 @@ -error: could not find defining uses - --> $DIR/no_inferrable_concrete_type.rs:6:12 - | -LL | type Foo = impl Copy; - | ^^^^^^^^^ - -error: aborting due to previous error - diff --git a/src/test/ui/type-alias-impl-trait/no_revealing_outside_defining_module.full_tait.stderr b/src/test/ui/type-alias-impl-trait/no_revealing_outside_defining_module.full_tait.stderr new file mode 100644 index 0000000000..8699b21929 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/no_revealing_outside_defining_module.full_tait.stderr @@ -0,0 +1,40 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/no_revealing_outside_defining_module.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0308]: mismatched types + --> $DIR/no_revealing_outside_defining_module.rs:18:19 + | +LL | pub type Boo = impl ::std::fmt::Debug; + | ---------------------- the found opaque type +... +LL | let _: &str = bomp(); + | ---- ^^^^^^ expected `&str`, found opaque type + | | + | expected due to this + | + = note: expected reference `&str` + found opaque type `impl Debug` + +error[E0308]: mismatched types + --> $DIR/no_revealing_outside_defining_module.rs:22:5 + | +LL | pub type Boo = impl ::std::fmt::Debug; + | ---------------------- the expected opaque type +... +LL | fn bomp() -> boo::Boo { + | -------- expected `impl Debug` because of return type +LL | "" + | ^^ expected opaque type, found `&str` + | + = note: expected opaque type `impl Debug` + found reference `&'static str` + +error: aborting due to 2 previous errors; 1 warning emitted + +For more information about this error, try `rustc --explain E0308`. 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.min_tait.stderr similarity index 89% rename from src/test/ui/type-alias-impl-trait/no_revealing_outside_defining_module.stderr rename to src/test/ui/type-alias-impl-trait/no_revealing_outside_defining_module.min_tait.stderr index 67752acb8c..faaab43935 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.min_tait.stderr @@ -1,5 +1,5 @@ error[E0308]: mismatched types - --> $DIR/no_revealing_outside_defining_module.rs:15:19 + --> $DIR/no_revealing_outside_defining_module.rs:18:19 | LL | pub type Boo = impl ::std::fmt::Debug; | ---------------------- the found opaque type @@ -13,7 +13,7 @@ LL | let _: &str = bomp(); found opaque type `impl Debug` error[E0308]: mismatched types - --> $DIR/no_revealing_outside_defining_module.rs:19:5 + --> $DIR/no_revealing_outside_defining_module.rs:22:5 | LL | pub type Boo = impl ::std::fmt::Debug; | ---------------------- the expected opaque type diff --git a/src/test/ui/type-alias-impl-trait/no_revealing_outside_defining_module.rs b/src/test/ui/type-alias-impl-trait/no_revealing_outside_defining_module.rs index 61153b1e17..566c311b9b 100644 --- a/src/test/ui/type-alias-impl-trait/no_revealing_outside_defining_module.rs +++ b/src/test/ui/type-alias-impl-trait/no_revealing_outside_defining_module.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() {} diff --git a/src/test/ui/type-alias-impl-trait/not_a_defining_use.full_tait.stderr b/src/test/ui/type-alias-impl-trait/not_a_defining_use.full_tait.stderr new file mode 100644 index 0000000000..76e3500e8a --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/not_a_defining_use.full_tait.stderr @@ -0,0 +1,23 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/not_a_defining_use.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: non-defining opaque type use in defining scope + --> $DIR/not_a_defining_use.rs:12:27 + | +LL | fn two(t: T) -> Two { + | ^^^^^^^^^^^ + | +note: used non-generic type `u32` for generic parameter + --> $DIR/not_a_defining_use.rs:10:13 + | +LL | type Two = impl Debug; + | ^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/not_a_defining_use.stderr b/src/test/ui/type-alias-impl-trait/not_a_defining_use.min_tait.stderr similarity index 79% rename from src/test/ui/type-alias-impl-trait/not_a_defining_use.stderr rename to src/test/ui/type-alias-impl-trait/not_a_defining_use.min_tait.stderr index 2fa236b373..f5dbfecc74 100644 --- a/src/test/ui/type-alias-impl-trait/not_a_defining_use.stderr +++ b/src/test/ui/type-alias-impl-trait/not_a_defining_use.min_tait.stderr @@ -1,11 +1,11 @@ error: non-defining opaque type use in defining scope - --> $DIR/not_a_defining_use.rs:9:27 + --> $DIR/not_a_defining_use.rs:12:27 | LL | fn two(t: T) -> Two { | ^^^^^^^^^^^ | note: used non-generic type `u32` for generic parameter - --> $DIR/not_a_defining_use.rs:7:13 + --> $DIR/not_a_defining_use.rs:10:13 | LL | type Two = impl Debug; | ^ diff --git a/src/test/ui/type-alias-impl-trait/not_a_defining_use.rs b/src/test/ui/type-alias-impl-trait/not_a_defining_use.rs index f29b980dfd..e58f33fcff 100644 --- a/src/test/ui/type-alias-impl-trait/not_a_defining_use.rs +++ b/src/test/ui/type-alias-impl-trait/not_a_defining_use.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::fmt::Debug; diff --git a/src/test/ui/type-alias-impl-trait/not_well_formed.full_tait.stderr b/src/test/ui/type-alias-impl-trait/not_well_formed.full_tait.stderr new file mode 100644 index 0000000000..38f086ec45 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/not_well_formed.full_tait.stderr @@ -0,0 +1,18 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/not_well_formed.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0220]: associated type `Assoc` not found for `V` + --> $DIR/not_well_formed.rs:13:29 + | +LL | type Foo = impl Trait; + | ^^^^^ associated type `Assoc` not found + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0220`. 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.min_tait.stderr similarity index 88% rename from src/test/ui/type-alias-impl-trait/not_well_formed.stderr rename to src/test/ui/type-alias-impl-trait/not_well_formed.min_tait.stderr index c2b6f7eae9..3bac38cef7 100644 --- a/src/test/ui/type-alias-impl-trait/not_well_formed.stderr +++ b/src/test/ui/type-alias-impl-trait/not_well_formed.min_tait.stderr @@ -1,5 +1,5 @@ error[E0220]: associated type `Assoc` not found for `V` - --> $DIR/not_well_formed.rs:10:29 + --> $DIR/not_well_formed.rs:13:29 | LL | type Foo = impl Trait; | ^^^^^ associated type `Assoc` not found diff --git a/src/test/ui/type-alias-impl-trait/not_well_formed.rs b/src/test/ui/type-alias-impl-trait/not_well_formed.rs index 36ec9b34eb..6d511c5818 100644 --- a/src/test/ui/type-alias-impl-trait/not_well_formed.rs +++ b/src/test/ui/type-alias-impl-trait/not_well_formed.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() { } diff --git a/src/test/ui/type-alias-impl-trait/structural-match-no-leak.full_tait.stderr b/src/test/ui/type-alias-impl-trait/structural-match-no-leak.full_tait.stderr new file mode 100644 index 0000000000..b560c0c918 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/structural-match-no-leak.full_tait.stderr @@ -0,0 +1,25 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/structural-match-no-leak.rs:4:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/structural-match-no-leak.rs:4:55 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + +error: `impl Send` cannot be used in patterns + --> $DIR/structural-match-no-leak.rs:19:9 + | +LL | LEAK_FREE => (), + | ^^^^^^^^^ + +error: aborting due to previous error; 2 warnings emitted + diff --git a/src/test/ui/type-alias-impl-trait/structural-match-no-leak.min_tait.stderr b/src/test/ui/type-alias-impl-trait/structural-match-no-leak.min_tait.stderr new file mode 100644 index 0000000000..e962b23a58 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/structural-match-no-leak.min_tait.stderr @@ -0,0 +1,12 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/structural-match-no-leak.rs:15:24 + | +LL | const LEAK_FREE: Bar = leak_free(); + | ^^^^^^^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` 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/type-alias-impl-trait/structural-match-no-leak.rs b/src/test/ui/type-alias-impl-trait/structural-match-no-leak.rs index 58f0f5b2f6..d0bae30f99 100644 --- a/src/test/ui/type-alias-impl-trait/structural-match-no-leak.rs +++ b/src/test/ui/type-alias-impl-trait/structural-match-no-leak.rs @@ -1,4 +1,9 @@ -#![feature(const_impl_trait, type_alias_impl_trait)] +#![feature(const_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] +//[full_tait]~^ WARN incomplete +//[full_tait]~| WARN incomplete type Bar = impl Send; @@ -7,12 +12,12 @@ type Bar = impl Send; const fn leak_free() -> Bar { 7i32 } -const LEAK_FREE: Bar = leak_free(); +const LEAK_FREE: Bar = leak_free(); //[min_tait]~ ERROR not permitted here fn leak_free_test() { match todo!() { LEAK_FREE => (), - //~^ `impl Send` cannot be used in patterns + //[full_tait]~^ `impl Send` cannot be used in patterns _ => (), } } diff --git a/src/test/ui/type-alias-impl-trait/structural-match-no-leak.stderr b/src/test/ui/type-alias-impl-trait/structural-match-no-leak.stderr deleted file mode 100644 index 889c4fd4b0..0000000000 --- a/src/test/ui/type-alias-impl-trait/structural-match-no-leak.stderr +++ /dev/null @@ -1,8 +0,0 @@ -error: `impl Send` cannot be used in patterns - --> $DIR/structural-match-no-leak.rs:14:9 - | -LL | LEAK_FREE => (), - | ^^^^^^^^^ - -error: aborting due to previous error - diff --git a/src/test/ui/type-alias-impl-trait/structural-match.full_tait.stderr b/src/test/ui/type-alias-impl-trait/structural-match.full_tait.stderr new file mode 100644 index 0000000000..b94e06e6d0 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/structural-match.full_tait.stderr @@ -0,0 +1,25 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/structural-match.rs:4:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/structural-match.rs:4:55 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + +error: `impl Send` cannot be used in patterns + --> $DIR/structural-match.rs:20:9 + | +LL | VALUE => (), + | ^^^^^ + +error: aborting due to previous error; 2 warnings emitted + diff --git a/src/test/ui/type-alias-impl-trait/structural-match.min_tait.stderr b/src/test/ui/type-alias-impl-trait/structural-match.min_tait.stderr new file mode 100644 index 0000000000..36c49a954b --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/structural-match.min_tait.stderr @@ -0,0 +1,12 @@ +error[E0658]: type alias impl trait is not permitted here + --> $DIR/structural-match.rs:16:20 + | +LL | const VALUE: Foo = value(); + | ^^^^^^^ + | + = note: see issue #63065 for more information + = help: add `#![feature(impl_trait_in_bindings)]` 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/type-alias-impl-trait/structural-match.rs b/src/test/ui/type-alias-impl-trait/structural-match.rs index 74ffa60842..daf914cc49 100644 --- a/src/test/ui/type-alias-impl-trait/structural-match.rs +++ b/src/test/ui/type-alias-impl-trait/structural-match.rs @@ -1,4 +1,9 @@ -#![feature(const_impl_trait, type_alias_impl_trait)] +#![feature(const_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait, impl_trait_in_bindings))] +//[full_tait]~^ WARN incomplete +//[full_tait]~| WARN incomplete type Foo = impl Send; @@ -8,12 +13,12 @@ struct A; const fn value() -> Foo { A } -const VALUE: Foo = value(); +const VALUE: Foo = value(); //[min_tait]~ ERROR not permitted here fn test() { match todo!() { VALUE => (), - //~^ `impl Send` cannot be used in patterns + //[full_tait]~^ `impl Send` cannot be used in patterns _ => (), } } diff --git a/src/test/ui/type-alias-impl-trait/structural-match.stderr b/src/test/ui/type-alias-impl-trait/structural-match.stderr deleted file mode 100644 index 262fd07261..0000000000 --- a/src/test/ui/type-alias-impl-trait/structural-match.stderr +++ /dev/null @@ -1,8 +0,0 @@ -error: `impl Send` cannot be used in patterns - --> $DIR/structural-match.rs:15:9 - | -LL | VALUE => (), - | ^^^^^ - -error: aborting due to previous error - diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-const.full_tait.stderr b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-const.full_tait.stderr new file mode 100644 index 0000000000..894d61502a --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-const.full_tait.stderr @@ -0,0 +1,19 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/type-alias-impl-trait-const.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/type-alias-impl-trait-const.rs:11:12 + | +LL | #![feature(impl_trait_in_bindings)] + | ^^^^^^^^^^^^^^^^^^^^^^ + | + = note: see issue #63065 for more information + +warning: 2 warnings emitted + diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-const.stderr b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-const.min_tait.stderr similarity index 89% rename from src/test/ui/type-alias-impl-trait/type-alias-impl-trait-const.stderr rename to src/test/ui/type-alias-impl-trait/type-alias-impl-trait-const.min_tait.stderr index b0593d51a2..66e4c24216 100644 --- a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-const.stderr +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-const.min_tait.stderr @@ -1,5 +1,5 @@ warning: the feature `impl_trait_in_bindings` is incomplete and may not be safe to use and/or cause compiler crashes - --> $DIR/type-alias-impl-trait-const.rs:8:12 + --> $DIR/type-alias-impl-trait-const.rs:11:12 | LL | #![feature(impl_trait_in_bindings)] | ^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-const.rs b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-const.rs index 01769f7115..0b0551cd96 100644 --- a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-const.rs +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-const.rs @@ -1,6 +1,9 @@ // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete // Currently, the `type_alias_impl_trait` feature implicitly // depends on `impl_trait_in_bindings` in order to work properly. // Specifically, this line requires `impl_trait_in_bindings` to be enabled: diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-fns.full_tait.stderr b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-fns.full_tait.stderr new file mode 100644 index 0000000000..fb88c2043b --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-fns.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/type-alias-impl-trait-fns.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-fns.rs b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-fns.rs index a22b12cae6..a6b0022008 100644 --- a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-fns.rs +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-fns.rs @@ -1,6 +1,9 @@ // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete // Regression test for issue #61863 diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-sized.full_tait.stderr b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-sized.full_tait.stderr new file mode 100644 index 0000000000..cbecd0bb3d --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-sized.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/type-alias-impl-trait-sized.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-sized.rs b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-sized.rs index c54df66424..b062739921 100644 --- a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-sized.rs +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-sized.rs @@ -1,6 +1,9 @@ // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete type A = impl Sized; fn f1() -> A { 0 } diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-tuple.full_tait.stderr b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-tuple.full_tait.stderr new file mode 100644 index 0000000000..1a351867bf --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-tuple.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/type-alias-impl-trait-tuple.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-tuple.rs b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-tuple.rs index 86c9d48214..ad2c11d4f9 100644 --- a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-tuple.rs +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-tuple.rs @@ -1,6 +1,9 @@ // check-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete #![allow(dead_code)] pub trait MyTrait {} diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-unconstrained-lifetime.full_tait.stderr b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-unconstrained-lifetime.full_tait.stderr new file mode 100644 index 0000000000..b16d9c2c14 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-unconstrained-lifetime.full_tait.stderr @@ -0,0 +1,18 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/type-alias-impl-trait-unconstrained-lifetime.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates + --> $DIR/type-alias-impl-trait-unconstrained-lifetime.rs:13:6 + | +LL | impl<'a, I: Iterator> Trait for (i32, I) { + | ^^ unconstrained lifetime parameter + +error: aborting due to previous error; 1 warning emitted + +For more information about this error, try `rustc --explain E0207`. diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-unconstrained-lifetime.stderr b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-unconstrained-lifetime.min_tait.stderr similarity index 83% rename from src/test/ui/type-alias-impl-trait/type-alias-impl-trait-unconstrained-lifetime.stderr rename to src/test/ui/type-alias-impl-trait/type-alias-impl-trait-unconstrained-lifetime.min_tait.stderr index 8cdce2f8e8..7d4abb0faf 100644 --- a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-unconstrained-lifetime.stderr +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-unconstrained-lifetime.min_tait.stderr @@ -1,5 +1,5 @@ error[E0207]: the lifetime parameter `'a` is not constrained by the impl trait, self type, or predicates - --> $DIR/type-alias-impl-trait-unconstrained-lifetime.rs:10:6 + --> $DIR/type-alias-impl-trait-unconstrained-lifetime.rs:13:6 | LL | impl<'a, I: Iterator> Trait for (i32, I) { | ^^ unconstrained lifetime parameter diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-unconstrained-lifetime.rs b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-unconstrained-lifetime.rs index efbf4f1e35..97294e81dc 100644 --- a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-unconstrained-lifetime.rs +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-unconstrained-lifetime.rs @@ -1,6 +1,9 @@ // regression test for #74018 -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete trait Trait { type Associated; diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error.full_tait.stderr b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error.full_tait.stderr new file mode 100644 index 0000000000..e3fd076fc4 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error.full_tait.stderr @@ -0,0 +1,17 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/type-alias-impl-trait-with-cycle-error.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: could not find defining uses + --> $DIR/type-alias-impl-trait-with-cycle-error.rs:6:12 + | +LL | type Foo = impl Fn() -> Foo; + | ^^^^^^^^^^^^^^^^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error.stderr b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error.min_tait.stderr similarity index 71% rename from src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error.stderr rename to src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error.min_tait.stderr index 726f4ea6e0..556779574e 100644 --- a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error.stderr +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error.min_tait.stderr @@ -1,5 +1,5 @@ error: could not find defining uses - --> $DIR/type-alias-impl-trait-with-cycle-error.rs:3:12 + --> $DIR/type-alias-impl-trait-with-cycle-error.rs:6:12 | LL | type Foo = impl Fn() -> Foo; | ^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error.rs b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error.rs index c009952eab..dba0d2c2cd 100644 --- a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error.rs +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete type Foo = impl Fn() -> Foo; //~^ ERROR: could not find defining uses diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error2.full_tait.stderr b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error2.full_tait.stderr new file mode 100644 index 0000000000..eccf08b4a1 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error2.full_tait.stderr @@ -0,0 +1,17 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/type-alias-impl-trait-with-cycle-error2.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: could not find defining uses + --> $DIR/type-alias-impl-trait-with-cycle-error2.rs:10:12 + | +LL | type Foo = impl Bar; + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + +error: aborting due to previous error; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error2.stderr b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error2.min_tait.stderr similarity index 73% rename from src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error2.stderr rename to src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error2.min_tait.stderr index 3947cc4d27..44d279cad1 100644 --- a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error2.stderr +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error2.min_tait.stderr @@ -1,5 +1,5 @@ error: could not find defining uses - --> $DIR/type-alias-impl-trait-with-cycle-error2.rs:7:12 + --> $DIR/type-alias-impl-trait-with-cycle-error2.rs:10:12 | LL | type Foo = impl Bar; | ^^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error2.rs b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error2.rs index 32ecc36661..f204403712 100644 --- a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error2.rs +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-cycle-error2.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete pub trait Bar { type Item; diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-no-traits.full_tait.stderr b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-no-traits.full_tait.stderr new file mode 100644 index 0000000000..6ada4b2fdf --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-no-traits.full_tait.stderr @@ -0,0 +1,23 @@ +error: at least one trait must be specified + --> $DIR/type-alias-impl-trait-with-no-traits.rs:6:12 + | +LL | type Foo = impl 'static; + | ^^^^^^^^^^^^ + +error: at least one trait must be specified + --> $DIR/type-alias-impl-trait-with-no-traits.rs:13:13 + | +LL | fn bar() -> impl 'static { + | ^^^^^^^^^^^^ + +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/type-alias-impl-trait-with-no-traits.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: aborting due to 2 previous errors; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-no-traits.stderr b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-no-traits.min_tait.stderr similarity index 69% rename from src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-no-traits.stderr rename to src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-no-traits.min_tait.stderr index 3f7acd3383..5fd8aac550 100644 --- a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-no-traits.stderr +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-no-traits.min_tait.stderr @@ -1,11 +1,11 @@ error: at least one trait must be specified - --> $DIR/type-alias-impl-trait-with-no-traits.rs:3:12 + --> $DIR/type-alias-impl-trait-with-no-traits.rs:6:12 | LL | type Foo = impl 'static; | ^^^^^^^^^^^^ error: at least one trait must be specified - --> $DIR/type-alias-impl-trait-with-no-traits.rs:10:13 + --> $DIR/type-alias-impl-trait-with-no-traits.rs:13:13 | LL | fn bar() -> impl 'static { | ^^^^^^^^^^^^ diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-no-traits.rs b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-no-traits.rs index 8ca279eec9..7efc790058 100644 --- a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-no-traits.rs +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait-with-no-traits.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete type Foo = impl 'static; //~^ ERROR: at least one trait must be specified diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait.full_tait.stderr b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait.full_tait.stderr new file mode 100644 index 0000000000..8c0f7758da --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/type-alias-impl-trait.rs:8:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait.rs b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait.rs index 80192d19af..6176595534 100644 --- a/src/test/ui/type-alias-impl-trait/type-alias-impl-trait.rs +++ b/src/test/ui/type-alias-impl-trait/type-alias-impl-trait.rs @@ -3,7 +3,10 @@ #![allow(dead_code)] #![allow(unused_assignments)] #![allow(unused_variables)] -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() { assert_eq!(foo().to_string(), "foo"); diff --git a/src/test/ui/type-alias-impl-trait/type-alias-nested-impl-trait.full_tait.stderr b/src/test/ui/type-alias-impl-trait/type-alias-nested-impl-trait.full_tait.stderr new file mode 100644 index 0000000000..ed4fe41da3 --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/type-alias-nested-impl-trait.full_tait.stderr @@ -0,0 +1,11 @@ +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/type-alias-nested-impl-trait.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +warning: 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/type-alias-nested-impl-trait.rs b/src/test/ui/type-alias-impl-trait/type-alias-nested-impl-trait.rs index fd954801dc..3023bf0656 100644 --- a/src/test/ui/type-alias-impl-trait/type-alias-nested-impl-trait.rs +++ b/src/test/ui/type-alias-impl-trait/type-alias-nested-impl-trait.rs @@ -1,6 +1,9 @@ // run-pass -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete use std::iter::{once, Chain}; diff --git a/src/test/ui/type-alias-impl-trait/unused_generic_param.full_tait.stderr b/src/test/ui/type-alias-impl-trait/unused_generic_param.full_tait.stderr new file mode 100644 index 0000000000..b70f36b67a --- /dev/null +++ b/src/test/ui/type-alias-impl-trait/unused_generic_param.full_tait.stderr @@ -0,0 +1,23 @@ +error: at least one trait must be specified + --> $DIR/unused_generic_param.rs:9:28 + | +LL | type PartiallyDefined = impl 'static; + | ^^^^^^^^^^^^ + +error: at least one trait must be specified + --> $DIR/unused_generic_param.rs:16:29 + | +LL | type PartiallyDefined2 = impl 'static; + | ^^^^^^^^^^^^ + +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/unused_generic_param.rs:3:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error: aborting due to 2 previous errors; 1 warning emitted + diff --git a/src/test/ui/type-alias-impl-trait/unused_generic_param.stderr b/src/test/ui/type-alias-impl-trait/unused_generic_param.min_tait.stderr similarity index 80% rename from src/test/ui/type-alias-impl-trait/unused_generic_param.stderr rename to src/test/ui/type-alias-impl-trait/unused_generic_param.min_tait.stderr index 9c63701ed3..561025c88f 100644 --- a/src/test/ui/type-alias-impl-trait/unused_generic_param.stderr +++ b/src/test/ui/type-alias-impl-trait/unused_generic_param.min_tait.stderr @@ -1,11 +1,11 @@ error: at least one trait must be specified - --> $DIR/unused_generic_param.rs:6:28 + --> $DIR/unused_generic_param.rs:9:28 | LL | type PartiallyDefined = impl 'static; | ^^^^^^^^^^^^ error: at least one trait must be specified - --> $DIR/unused_generic_param.rs:13:29 + --> $DIR/unused_generic_param.rs:16:29 | LL | type PartiallyDefined2 = impl 'static; | ^^^^^^^^^^^^ diff --git a/src/test/ui/type-alias-impl-trait/unused_generic_param.rs b/src/test/ui/type-alias-impl-trait/unused_generic_param.rs index a9ab727b19..59c7646ade 100644 --- a/src/test/ui/type-alias-impl-trait/unused_generic_param.rs +++ b/src/test/ui/type-alias-impl-trait/unused_generic_param.rs @@ -1,4 +1,7 @@ -#![feature(type_alias_impl_trait)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete fn main() { } diff --git a/src/test/ui/type/type-check/issue-41314.stderr b/src/test/ui/type/type-check/issue-41314.stderr index bd4d2071c2..c3d41ae68c 100644 --- a/src/test/ui/type/type-check/issue-41314.stderr +++ b/src/test/ui/type/type-check/issue-41314.stderr @@ -2,7 +2,12 @@ error[E0769]: tuple variant `X::Y` written as struct variant --> $DIR/issue-41314.rs:7:9 | LL | X::Y { number } => {} - | ^^^^^^^^^^^^^^^ help: use the tuple variant pattern syntax instead: `X::Y(number)` + | ^^^^^^^^^^^^^^^ + | +help: use the tuple variant pattern syntax instead + | +LL | X::Y(number) => {} + | ^^^^^^^^ error: aborting due to previous error diff --git a/src/test/ui/typeck/auxiliary/issue-81943-lib.rs b/src/test/ui/typeck/auxiliary/issue-81943-lib.rs new file mode 100644 index 0000000000..521c54f899 --- /dev/null +++ b/src/test/ui/typeck/auxiliary/issue-81943-lib.rs @@ -0,0 +1,7 @@ +pub fn g(t: i32) -> i32 { t } +// This function imitates `dbg!` so that future changes +// to its macro definition won't make this test a dud. +#[macro_export] +macro_rules! d { + ($e:expr) => { match $e { x => { $crate::g(x) } } } +} diff --git a/src/test/ui/typeck/issue-79040.rs b/src/test/ui/typeck/issue-79040.rs new file mode 100644 index 0000000000..af2a9c1ba8 --- /dev/null +++ b/src/test/ui/typeck/issue-79040.rs @@ -0,0 +1,5 @@ +fn main() { + const FOO = "hello" + 1; //~ ERROR cannot add `{integer}` to `&str` + //~^ ERROR cannot add `{integer}` to `&str` + println!("{}", FOO); +} diff --git a/src/test/ui/typeck/issue-79040.stderr b/src/test/ui/typeck/issue-79040.stderr new file mode 100644 index 0000000000..32049e5d96 --- /dev/null +++ b/src/test/ui/typeck/issue-79040.stderr @@ -0,0 +1,19 @@ +error[E0369]: cannot add `{integer}` to `&str` + --> $DIR/issue-79040.rs:2:25 + | +LL | const FOO = "hello" + 1; + | ------- ^ - {integer} + | | + | &str + +error[E0369]: cannot add `{integer}` to `&str` + --> $DIR/issue-79040.rs:2:25 + | +LL | const FOO = "hello" + 1; + | ------- ^ - {integer} + | | + | &str + +error: aborting due to 2 previous errors + +For more information about this error, try `rustc --explain E0369`. diff --git a/src/test/ui/typeck/issue-81943.rs b/src/test/ui/typeck/issue-81943.rs new file mode 100644 index 0000000000..18f5970a35 --- /dev/null +++ b/src/test/ui/typeck/issue-81943.rs @@ -0,0 +1,13 @@ +// aux-build:issue-81943-lib.rs +extern crate issue_81943_lib as lib; + +fn f(f: F) { f(0); } +fn g(t: i32) -> i32 { t } +fn main() { + f(|x| lib::d!(x)); //~ERROR + f(|x| match x { tmp => { g(tmp) } }); //~ERROR + macro_rules! d { + ($e:expr) => { match $e { x => { g(x) } } } //~ERROR + } + f(|x| d!(x)); +} diff --git a/src/test/ui/typeck/issue-81943.stderr b/src/test/ui/typeck/issue-81943.stderr new file mode 100644 index 0000000000..a30facfeb6 --- /dev/null +++ b/src/test/ui/typeck/issue-81943.stderr @@ -0,0 +1,51 @@ +error[E0308]: mismatched types + --> $DIR/issue-81943.rs:7:9 + | +LL | f(|x| lib::d!(x)); + | ^^^^^^^^^^ expected `()`, found `i32` + | + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error[E0308]: mismatched types + --> $DIR/issue-81943.rs:8:28 + | +LL | f(|x| match x { tmp => { g(tmp) } }); + | -------------------^^^^^^---- + | | | + | | expected `()`, found `i32` + | expected this to be `()` + | +help: consider using a semicolon here + | +LL | f(|x| match x { tmp => { g(tmp); } }); + | ^ +help: consider using a semicolon here + | +LL | f(|x| match x { tmp => { g(tmp) } };); + | ^ + +error[E0308]: mismatched types + --> $DIR/issue-81943.rs:10:38 + | +LL | ($e:expr) => { match $e { x => { g(x) } } } + | ------------------^^^^---- + | | | + | | expected `()`, found `i32` + | expected this to be `()` +LL | } +LL | f(|x| d!(x)); + | ----- in this macro invocation + | + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) +help: consider using a semicolon here + | +LL | ($e:expr) => { match $e { x => { g(x); } } } + | ^ +help: consider using a semicolon here + | +LL | ($e:expr) => { match $e { x => { g(x) } }; } + | ^ + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/typeck/issue-82772.rs b/src/test/ui/typeck/issue-82772.rs new file mode 100644 index 0000000000..326273bfe9 --- /dev/null +++ b/src/test/ui/typeck/issue-82772.rs @@ -0,0 +1,13 @@ +// edition:2018 + +fn main() { + use a::ModPrivateStruct; + let Box { 0: _, .. }: Box<()>; //~ ERROR field `0` of + let Box { 1: _, .. }: Box<()>; //~ ERROR field `1` of + let ModPrivateStruct { 1: _, .. } = ModPrivateStruct::default(); //~ ERROR field `1` of +} + +mod a { + #[derive(Default)] + pub struct ModPrivateStruct(u8, u8); +} diff --git a/src/test/ui/typeck/issue-82772.stderr b/src/test/ui/typeck/issue-82772.stderr new file mode 100644 index 0000000000..321143cb96 --- /dev/null +++ b/src/test/ui/typeck/issue-82772.stderr @@ -0,0 +1,21 @@ +error[E0451]: field `0` of struct `Box` is private + --> $DIR/issue-82772.rs:5:15 + | +LL | let Box { 0: _, .. }: Box<()>; + | ^^^^ private field + +error[E0451]: field `1` of struct `Box` is private + --> $DIR/issue-82772.rs:6:15 + | +LL | let Box { 1: _, .. }: Box<()>; + | ^^^^ private field + +error[E0451]: field `1` of struct `ModPrivateStruct` is private + --> $DIR/issue-82772.rs:7:28 + | +LL | let ModPrivateStruct { 1: _, .. } = ModPrivateStruct::default(); + | ^^^^ private field + +error: aborting due to 3 previous errors + +For more information about this error, try `rustc --explain E0451`. diff --git a/src/test/ui/typeck/typeck_type_placeholder_item.full_tait.stderr b/src/test/ui/typeck/typeck_type_placeholder_item.full_tait.stderr new file mode 100644 index 0000000000..75e4cb3e2d --- /dev/null +++ b/src/test/ui/typeck/typeck_type_placeholder_item.full_tait.stderr @@ -0,0 +1,647 @@ +error: expected identifier, found reserved identifier `_` + --> $DIR/typeck_type_placeholder_item.rs:158:18 + | +LL | struct BadStruct<_>(_); + | ^ expected identifier, found reserved identifier + +error: expected identifier, found reserved identifier `_` + --> $DIR/typeck_type_placeholder_item.rs:161:16 + | +LL | trait BadTrait<_> {} + | ^ expected identifier, found reserved identifier + +error: expected identifier, found reserved identifier `_` + --> $DIR/typeck_type_placeholder_item.rs:171:19 + | +LL | struct BadStruct1<_, _>(_); + | ^ expected identifier, found reserved identifier + +error: expected identifier, found reserved identifier `_` + --> $DIR/typeck_type_placeholder_item.rs:171:22 + | +LL | struct BadStruct1<_, _>(_); + | ^ expected identifier, found reserved identifier + +error: expected identifier, found reserved identifier `_` + --> $DIR/typeck_type_placeholder_item.rs:176:19 + | +LL | struct BadStruct2<_, T>(_, T); + | ^ expected identifier, found reserved identifier + +error: associated constant in `impl` without body + --> $DIR/typeck_type_placeholder_item.rs:209:5 + | +LL | const C: _; + | ^^^^^^^^^^- + | | + | help: provide a definition for the constant: `= ;` + +error[E0403]: the name `_` is already used for a generic parameter in this item's generic parameters + --> $DIR/typeck_type_placeholder_item.rs:171:22 + | +LL | struct BadStruct1<_, _>(_); + | - ^ already used + | | + | first use of `_` + +warning: the feature `type_alias_impl_trait` is incomplete and may not be safe to use and/or cause compiler crashes + --> $DIR/typeck_type_placeholder_item.rs:5:32 + | +LL | #![cfg_attr(full_tait, feature(type_alias_impl_trait))] + | ^^^^^^^^^^^^^^^^^^^^^ + | + = note: `#[warn(incomplete_features)]` on by default + = note: see issue #63063 for more information + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:10: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:13:16 + | +LL | fn test2() -> (_, _) { (5, 5) } + | -^--^- + | || | + | || not allowed in type signatures + | |not allowed in type signatures + | help: replace with the correct return type: `(i32, i32)` + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:16:15 + | +LL | static TEST3: _ = "test"; + | ^ + | | + | not allowed in type signatures + | help: replace `_` with the correct type: `&str` + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:19: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:22:15 + | +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:25:13 + | +LL | fn test6(_: _) { } + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn test6(_: T) { } + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:28:18 + | +LL | fn test6_b(_: _, _: T) { } + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn test6_b(_: U, _: T) { } + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:31:30 + | +LL | fn test6_c(_: _, _: (T, K, L, A, B)) { } + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn test6_c(_: U, _: (T, K, L, A, B)) { } + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:34:13 + | +LL | fn test7(x: _) { let _x: usize = x; } + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn test7(x: T) { let _x: usize = x; } + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:37:22 + | +LL | fn test8(_f: fn() -> _) { } + | ^ + | | + | not allowed in type signatures + | help: use type parameters instead: `T` + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:37:22 + | +LL | fn test8(_f: fn() -> _) { } + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn test8(_f: fn() -> T) { } + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:51:26 + | +LL | fn test11(x: &usize) -> &_ { + | -^ + | || + | |not allowed in type signatures + | help: replace with the correct return type: `&'static &'static usize` + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:56:52 + | +LL | unsafe fn test12(x: *const usize) -> *const *const _ { + | --------------^ + | | | + | | not allowed in type signatures + | help: replace with the correct return type: `*const *const usize` + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:70:8 + | +LL | a: _, + | ^ not allowed in type signatures +LL | +LL | b: (_, _), + | ^ ^ not allowed in type signatures + | | + | not allowed in type signatures + | +help: use type parameters instead + | +LL | struct Test10 { +LL | a: T, +LL | +LL | b: (T, T), + | + +error: missing type for `static` item + --> $DIR/typeck_type_placeholder_item.rs:76:12 + | +LL | static A = 42; + | ^ help: provide a type for the item: `A: i32` + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:78:15 + | +LL | static B: _ = 42; + | ^ + | | + | 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:80:15 + | +LL | static C: Option<_> = Some(42); + | ^^^^^^^^^ not allowed in type signatures + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:83: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:86:23 + | +LL | fn fn_test2() -> (_, _) { (5, 5) } + | -^--^- + | || | + | || not allowed in type signatures + | |not allowed in type signatures + | help: replace with the correct return type: `(i32, i32)` + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:89:22 + | +LL | static FN_TEST3: _ = "test"; + | ^ + | | + | not allowed in type signatures + | help: replace `_` with the correct type: `&str` + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:92: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:95:22 + | +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:98:20 + | +LL | fn fn_test6(_: _) { } + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn fn_test6(_: T) { } + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:101:20 + | +LL | fn fn_test7(x: _) { let _x: usize = x; } + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn fn_test7(x: T) { let _x: usize = x; } + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:104:29 + | +LL | fn fn_test8(_f: fn() -> _) { } + | ^ + | | + | not allowed in type signatures + | help: use type parameters instead: `T` + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:104:29 + | +LL | fn fn_test8(_f: fn() -> _) { } + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn fn_test8(_f: fn() -> T) { } + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:127:12 + | +LL | a: _, + | ^ not allowed in type signatures +LL | +LL | b: (_, _), + | ^ ^ not allowed in type signatures + | | + | not allowed in type signatures + | +help: use type parameters instead + | +LL | struct FnTest10 { +LL | a: T, +LL | +LL | b: (T, T), + | + +error[E0282]: type annotations needed + --> $DIR/typeck_type_placeholder_item.rs:132:18 + | +LL | fn fn_test11(_: _) -> (_, _) { panic!() } + | ^ cannot infer type + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:132:28 + | +LL | fn fn_test11(_: _) -> (_, _) { panic!() } + | ^ ^ not allowed in type signatures + | | + | not allowed in type signatures + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:136:30 + | +LL | fn fn_test12(x: i32) -> (_, _) { (x, x) } + | -^--^- + | || | + | || not allowed in type signatures + | |not allowed in type signatures + | help: replace with the correct return type: `(i32, i32)` + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:139:33 + | +LL | fn fn_test13(x: _) -> (i32, _) { (x, x) } + | ------^- + | | | + | | not allowed in type signatures + | help: replace with the correct return type: `(i32, i32)` + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:158:21 + | +LL | struct BadStruct<_>(_); + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | struct BadStruct(T); + | ^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:163:15 + | +LL | impl BadTrait<_> for BadStruct<_> {} + | ^ ^ not allowed in type signatures + | | + | not allowed in type signatures + | +help: use type parameters instead + | +LL | impl BadTrait for BadStruct {} + | ^^^ ^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:166:34 + | +LL | fn impl_trait() -> impl BadTrait<_> { + | ^ not allowed in type signatures + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:171:25 + | +LL | struct BadStruct1<_, _>(_); + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | struct BadStruct1(T); + | ^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:176:25 + | +LL | struct BadStruct2<_, T>(_, T); + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | struct BadStruct2(U, T); + | ^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:180:14 + | +LL | type X = Box<_>; + | ^ not allowed in type signatures + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:186:21 + | +LL | type Y = impl Trait<_>; + | ^ not allowed in type signatures + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:220:31 + | +LL | fn value() -> Option<&'static _> { + | ----------------^- + | | | + | | not allowed in type signatures + | help: replace with the correct return type: `Option<&'static u8>` + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:225:10 + | +LL | const _: Option<_> = map(value); + | ^^^^^^^^^ + | | + | not allowed in type signatures + | help: replace `_` with the correct type: `Option` + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:144:31 + | +LL | fn method_test1(&self, x: _); + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn method_test1(&self, x: T); + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:146:31 + | +LL | fn method_test2(&self, x: _) -> _; + | ^ ^ not allowed in type signatures + | | + | not allowed in type signatures + | +help: use type parameters instead + | +LL | fn method_test2(&self, x: T) -> T; + | ^^^ ^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:148:31 + | +LL | fn method_test3(&self) -> _; + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn method_test3(&self) -> T; + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:150:26 + | +LL | fn assoc_fn_test1(x: _); + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn assoc_fn_test1(x: T); + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:152:26 + | +LL | fn assoc_fn_test2(x: _) -> _; + | ^ ^ not allowed in type signatures + | | + | not allowed in type signatures + | +help: use type parameters instead + | +LL | fn assoc_fn_test2(x: T) -> T; + | ^^^ ^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:154:28 + | +LL | fn assoc_fn_test3() -> _; + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn assoc_fn_test3() -> T; + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:194:14 + | +LL | type 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:196:14 + | +LL | const C: _; + | ^ not allowed in type signatures + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:198:14 + | +LL | const D: _ = 42; + | ^ + | | + | 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:201:26 + | +LL | type F: std::ops::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:44: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:47:27 + | +LL | fn test10(&self, _x : _) { } + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn test10(&self, _x : T) { } + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:62: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:65:37 + | +LL | fn clone_from(&mut self, other: _) { *self = Test9; } + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn clone_from(&mut self, other: T) { *self = Test9; } + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:111: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:114:34 + | +LL | fn fn_test10(&self, _x : _) { } + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn fn_test10(&self, _x : T) { } + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:119:28 + | +LL | fn clone(&self) -> _ { FnTest9 } + | ^ + | | + | not allowed in type signatures + | help: replace with the correct return type: `FnTest9` + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:122:41 + | +LL | fn clone_from(&mut self, other: _) { *self = FnTest9; } + | ^ not allowed in type signatures + | +help: use type parameters instead + | +LL | fn clone_from(&mut self, other: T) { *self = FnTest9; } + | ^^^ ^ + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:205:14 + | +LL | type 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:207:14 + | +LL | type 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:209:14 + | +LL | const C: _; + | ^ not allowed in type signatures + +error[E0121]: the type placeholder `_` is not allowed within types on item signatures + --> $DIR/typeck_type_placeholder_item.rs:212:14 + | +LL | const D: _ = 42; + | ^ + | | + | not allowed in type signatures + | help: replace `_` with the correct type: `i32` + +error: aborting due to 69 previous errors; 1 warning emitted + +Some errors have detailed explanations: E0121, E0282, E0403. +For more information about an error, try `rustc --explain E0121`. diff --git a/src/test/ui/typeck/typeck_type_placeholder_item.stderr b/src/test/ui/typeck/typeck_type_placeholder_item.min_tait.stderr similarity index 86% rename from src/test/ui/typeck/typeck_type_placeholder_item.stderr rename to src/test/ui/typeck/typeck_type_placeholder_item.min_tait.stderr index 1034402bfb..c6758c52a9 100644 --- a/src/test/ui/typeck/typeck_type_placeholder_item.stderr +++ b/src/test/ui/typeck/typeck_type_placeholder_item.min_tait.stderr @@ -1,35 +1,35 @@ error: expected identifier, found reserved identifier `_` - --> $DIR/typeck_type_placeholder_item.rs:154:18 + --> $DIR/typeck_type_placeholder_item.rs:158:18 | LL | struct BadStruct<_>(_); | ^ expected identifier, found reserved identifier error: expected identifier, found reserved identifier `_` - --> $DIR/typeck_type_placeholder_item.rs:157:16 + --> $DIR/typeck_type_placeholder_item.rs:161:16 | LL | trait BadTrait<_> {} | ^ expected identifier, found reserved identifier error: expected identifier, found reserved identifier `_` - --> $DIR/typeck_type_placeholder_item.rs:167:19 + --> $DIR/typeck_type_placeholder_item.rs:171:19 | LL | struct BadStruct1<_, _>(_); | ^ expected identifier, found reserved identifier error: expected identifier, found reserved identifier `_` - --> $DIR/typeck_type_placeholder_item.rs:167:22 + --> $DIR/typeck_type_placeholder_item.rs:171:22 | LL | struct BadStruct1<_, _>(_); | ^ expected identifier, found reserved identifier error: expected identifier, found reserved identifier `_` - --> $DIR/typeck_type_placeholder_item.rs:172:19 + --> $DIR/typeck_type_placeholder_item.rs:176:19 | LL | struct BadStruct2<_, T>(_, T); | ^ expected identifier, found reserved identifier error: associated constant in `impl` without body - --> $DIR/typeck_type_placeholder_item.rs:205:5 + --> $DIR/typeck_type_placeholder_item.rs:209:5 | LL | const C: _; | ^^^^^^^^^^- @@ -37,7 +37,7 @@ LL | const C: _; | help: provide a definition for the constant: `= ;` error[E0403]: the name `_` is already used for a generic parameter in this item's generic parameters - --> $DIR/typeck_type_placeholder_item.rs:167:22 + --> $DIR/typeck_type_placeholder_item.rs:171:22 | LL | struct BadStruct1<_, _>(_); | - ^ already used @@ -45,7 +45,7 @@ LL | struct BadStruct1<_, _>(_); | first use of `_` error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:6:14 + --> $DIR/typeck_type_placeholder_item.rs:10:14 | LL | fn test() -> _ { 5 } | ^ @@ -54,7 +54,7 @@ LL | fn test() -> _ { 5 } | 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:9:16 + --> $DIR/typeck_type_placeholder_item.rs:13:16 | LL | fn test2() -> (_, _) { (5, 5) } | -^--^- @@ -64,7 +64,7 @@ LL | fn test2() -> (_, _) { (5, 5) } | help: replace with the correct return type: `(i32, i32)` error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:12:15 + --> $DIR/typeck_type_placeholder_item.rs:16:15 | LL | static TEST3: _ = "test"; | ^ @@ -73,7 +73,7 @@ LL | static TEST3: _ = "test"; | help: replace `_` with the correct type: `&str` error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:15:15 + --> $DIR/typeck_type_placeholder_item.rs:19:15 | LL | static TEST4: _ = 145; | ^ @@ -82,13 +82,13 @@ LL | static TEST4: _ = 145; | 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:18:15 + --> $DIR/typeck_type_placeholder_item.rs:22:15 | 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 + --> $DIR/typeck_type_placeholder_item.rs:25:13 | LL | fn test6(_: _) { } | ^ not allowed in type signatures @@ -99,7 +99,7 @@ LL | fn test6(_: T) { } | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:24:18 + --> $DIR/typeck_type_placeholder_item.rs:28:18 | LL | fn test6_b(_: _, _: T) { } | ^ not allowed in type signatures @@ -110,7 +110,7 @@ LL | fn test6_b(_: U, _: T) { } | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:27:30 + --> $DIR/typeck_type_placeholder_item.rs:31:30 | LL | fn test6_c(_: _, _: (T, K, L, A, B)) { } | ^ not allowed in type signatures @@ -121,7 +121,7 @@ LL | fn test6_c(_: U, _: (T, K, L, A, B)) { } | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:30:13 + --> $DIR/typeck_type_placeholder_item.rs:34:13 | LL | fn test7(x: _) { let _x: usize = x; } | ^ not allowed in type signatures @@ -132,7 +132,7 @@ LL | fn test7(x: T) { let _x: usize = x; } | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:33:22 + --> $DIR/typeck_type_placeholder_item.rs:37:22 | LL | fn test8(_f: fn() -> _) { } | ^ @@ -141,7 +141,7 @@ LL | fn test8(_f: fn() -> _) { } | help: use type parameters instead: `T` error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:33:22 + --> $DIR/typeck_type_placeholder_item.rs:37:22 | LL | fn test8(_f: fn() -> _) { } | ^ not allowed in type signatures @@ -152,7 +152,7 @@ LL | fn test8(_f: fn() -> T) { } | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:47:26 + --> $DIR/typeck_type_placeholder_item.rs:51:26 | LL | fn test11(x: &usize) -> &_ { | -^ @@ -161,7 +161,7 @@ LL | fn test11(x: &usize) -> &_ { | help: replace with the correct return type: `&'static &'static usize` error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:52:52 + --> $DIR/typeck_type_placeholder_item.rs:56:52 | LL | unsafe fn test12(x: *const usize) -> *const *const _ { | --------------^ @@ -170,7 +170,7 @@ LL | unsafe fn test12(x: *const usize) -> *const *const _ { | help: replace with the correct return type: `*const *const usize` error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:66:8 + --> $DIR/typeck_type_placeholder_item.rs:70:8 | LL | a: _, | ^ not allowed in type signatures @@ -189,13 +189,13 @@ LL | b: (T, T), | error: missing type for `static` item - --> $DIR/typeck_type_placeholder_item.rs:72:12 + --> $DIR/typeck_type_placeholder_item.rs:76:12 | LL | static A = 42; | ^ help: provide a type for the item: `A: i32` error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:74:15 + --> $DIR/typeck_type_placeholder_item.rs:78:15 | LL | static B: _ = 42; | ^ @@ -204,13 +204,13 @@ LL | static B: _ = 42; | 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:76:15 + --> $DIR/typeck_type_placeholder_item.rs:80:15 | LL | static C: Option<_> = Some(42); | ^^^^^^^^^ not allowed in type signatures error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:79:21 + --> $DIR/typeck_type_placeholder_item.rs:83:21 | LL | fn fn_test() -> _ { 5 } | ^ @@ -219,7 +219,7 @@ LL | fn fn_test() -> _ { 5 } | 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:82:23 + --> $DIR/typeck_type_placeholder_item.rs:86:23 | LL | fn fn_test2() -> (_, _) { (5, 5) } | -^--^- @@ -229,7 +229,7 @@ LL | fn fn_test2() -> (_, _) { (5, 5) } | help: replace with the correct return type: `(i32, i32)` error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:85:22 + --> $DIR/typeck_type_placeholder_item.rs:89:22 | LL | static FN_TEST3: _ = "test"; | ^ @@ -238,7 +238,7 @@ LL | static FN_TEST3: _ = "test"; | help: replace `_` with the correct type: `&str` error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:88:22 + --> $DIR/typeck_type_placeholder_item.rs:92:22 | LL | static FN_TEST4: _ = 145; | ^ @@ -247,13 +247,13 @@ LL | static FN_TEST4: _ = 145; | 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:91:22 + --> $DIR/typeck_type_placeholder_item.rs:95:22 | 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:94:20 + --> $DIR/typeck_type_placeholder_item.rs:98:20 | LL | fn fn_test6(_: _) { } | ^ not allowed in type signatures @@ -264,7 +264,7 @@ LL | fn fn_test6(_: T) { } | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:97:20 + --> $DIR/typeck_type_placeholder_item.rs:101:20 | LL | fn fn_test7(x: _) { let _x: usize = x; } | ^ not allowed in type signatures @@ -275,7 +275,7 @@ LL | fn fn_test7(x: T) { let _x: usize = x; } | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:100:29 + --> $DIR/typeck_type_placeholder_item.rs:104:29 | LL | fn fn_test8(_f: fn() -> _) { } | ^ @@ -284,7 +284,7 @@ LL | fn fn_test8(_f: fn() -> _) { } | help: use type parameters instead: `T` error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:100:29 + --> $DIR/typeck_type_placeholder_item.rs:104:29 | LL | fn fn_test8(_f: fn() -> _) { } | ^ not allowed in type signatures @@ -295,7 +295,7 @@ LL | fn fn_test8(_f: fn() -> T) { } | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:123:12 + --> $DIR/typeck_type_placeholder_item.rs:127:12 | LL | a: _, | ^ not allowed in type signatures @@ -314,13 +314,13 @@ LL | b: (T, T), | error[E0282]: type annotations needed - --> $DIR/typeck_type_placeholder_item.rs:128:18 + --> $DIR/typeck_type_placeholder_item.rs:132:18 | LL | fn fn_test11(_: _) -> (_, _) { panic!() } | ^ cannot infer type error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:128:28 + --> $DIR/typeck_type_placeholder_item.rs:132:28 | LL | fn fn_test11(_: _) -> (_, _) { panic!() } | ^ ^ not allowed in type signatures @@ -328,7 +328,7 @@ LL | fn fn_test11(_: _) -> (_, _) { panic!() } | not allowed in type signatures error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:132:30 + --> $DIR/typeck_type_placeholder_item.rs:136:30 | LL | fn fn_test12(x: i32) -> (_, _) { (x, x) } | -^--^- @@ -338,7 +338,7 @@ LL | fn fn_test12(x: i32) -> (_, _) { (x, x) } | help: replace with the correct return type: `(i32, i32)` error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:135:33 + --> $DIR/typeck_type_placeholder_item.rs:139:33 | LL | fn fn_test13(x: _) -> (i32, _) { (x, x) } | ------^- @@ -347,7 +347,7 @@ LL | fn fn_test13(x: _) -> (i32, _) { (x, x) } | help: replace with the correct return type: `(i32, i32)` error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:154:21 + --> $DIR/typeck_type_placeholder_item.rs:158:21 | LL | struct BadStruct<_>(_); | ^ not allowed in type signatures @@ -358,7 +358,7 @@ LL | struct BadStruct(T); | ^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:159:15 + --> $DIR/typeck_type_placeholder_item.rs:163:15 | LL | impl BadTrait<_> for BadStruct<_> {} | ^ ^ not allowed in type signatures @@ -371,13 +371,13 @@ LL | impl BadTrait for BadStruct {} | ^^^ ^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:162:34 + --> $DIR/typeck_type_placeholder_item.rs:166:34 | LL | fn impl_trait() -> impl BadTrait<_> { | ^ not allowed in type signatures error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:167:25 + --> $DIR/typeck_type_placeholder_item.rs:171:25 | LL | struct BadStruct1<_, _>(_); | ^ not allowed in type signatures @@ -388,7 +388,7 @@ LL | struct BadStruct1(T); | ^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:172:25 + --> $DIR/typeck_type_placeholder_item.rs:176:25 | LL | struct BadStruct2<_, T>(_, T); | ^ not allowed in type signatures @@ -399,19 +399,19 @@ LL | struct BadStruct2(U, T); | ^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:176:14 + --> $DIR/typeck_type_placeholder_item.rs:180:14 | LL | type X = Box<_>; | ^ not allowed in type signatures error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:182:21 + --> $DIR/typeck_type_placeholder_item.rs:186:21 | LL | type Y = impl Trait<_>; | ^ not allowed in type signatures error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:216:31 + --> $DIR/typeck_type_placeholder_item.rs:220:31 | LL | fn value() -> Option<&'static _> { | ----------------^- @@ -420,7 +420,7 @@ LL | fn value() -> Option<&'static _> { | help: replace with the correct return type: `Option<&'static u8>` error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:221:10 + --> $DIR/typeck_type_placeholder_item.rs:225:10 | LL | const _: Option<_> = map(value); | ^^^^^^^^^ @@ -429,7 +429,7 @@ LL | const _: Option<_> = map(value); | help: replace `_` with the correct type: `Option` error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:140:31 + --> $DIR/typeck_type_placeholder_item.rs:144:31 | LL | fn method_test1(&self, x: _); | ^ not allowed in type signatures @@ -440,7 +440,7 @@ LL | fn method_test1(&self, x: T); | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:142:31 + --> $DIR/typeck_type_placeholder_item.rs:146:31 | LL | fn method_test2(&self, x: _) -> _; | ^ ^ not allowed in type signatures @@ -453,7 +453,7 @@ LL | fn method_test2(&self, x: T) -> T; | ^^^ ^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:144:31 + --> $DIR/typeck_type_placeholder_item.rs:148:31 | LL | fn method_test3(&self) -> _; | ^ not allowed in type signatures @@ -464,7 +464,7 @@ LL | fn method_test3(&self) -> T; | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:146:26 + --> $DIR/typeck_type_placeholder_item.rs:150:26 | LL | fn assoc_fn_test1(x: _); | ^ not allowed in type signatures @@ -475,7 +475,7 @@ LL | fn assoc_fn_test1(x: T); | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:148:26 + --> $DIR/typeck_type_placeholder_item.rs:152:26 | LL | fn assoc_fn_test2(x: _) -> _; | ^ ^ not allowed in type signatures @@ -488,7 +488,7 @@ LL | fn assoc_fn_test2(x: T) -> T; | ^^^ ^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:150:28 + --> $DIR/typeck_type_placeholder_item.rs:154:28 | LL | fn assoc_fn_test3() -> _; | ^ not allowed in type signatures @@ -499,19 +499,19 @@ LL | fn assoc_fn_test3() -> T; | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:190:14 + --> $DIR/typeck_type_placeholder_item.rs:194:14 | LL | type 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:192:14 + --> $DIR/typeck_type_placeholder_item.rs:196:14 | LL | const C: _; | ^ not allowed in type signatures error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:194:14 + --> $DIR/typeck_type_placeholder_item.rs:198:14 | LL | const D: _ = 42; | ^ @@ -520,13 +520,13 @@ LL | const D: _ = 42; | 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:197:26 + --> $DIR/typeck_type_placeholder_item.rs:201:26 | LL | type F: std::ops::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:40:24 + --> $DIR/typeck_type_placeholder_item.rs:44:24 | LL | fn test9(&self) -> _ { () } | ^ @@ -535,7 +535,7 @@ LL | fn test9(&self) -> _ { () } | 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:43:27 + --> $DIR/typeck_type_placeholder_item.rs:47:27 | LL | fn test10(&self, _x : _) { } | ^ not allowed in type signatures @@ -546,7 +546,7 @@ LL | fn test10(&self, _x : T) { } | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:58:24 + --> $DIR/typeck_type_placeholder_item.rs:62:24 | LL | fn clone(&self) -> _ { Test9 } | ^ @@ -555,7 +555,7 @@ LL | fn clone(&self) -> _ { Test9 } | 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:61:37 + --> $DIR/typeck_type_placeholder_item.rs:65:37 | LL | fn clone_from(&mut self, other: _) { *self = Test9; } | ^ not allowed in type signatures @@ -566,7 +566,7 @@ LL | fn clone_from(&mut self, other: T) { *self = Test9; } | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:107:31 + --> $DIR/typeck_type_placeholder_item.rs:111:31 | LL | fn fn_test9(&self) -> _ { () } | ^ @@ -575,7 +575,7 @@ LL | fn fn_test9(&self) -> _ { () } | 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:110:34 + --> $DIR/typeck_type_placeholder_item.rs:114:34 | LL | fn fn_test10(&self, _x : _) { } | ^ not allowed in type signatures @@ -586,7 +586,7 @@ LL | fn fn_test10(&self, _x : T) { } | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:115:28 + --> $DIR/typeck_type_placeholder_item.rs:119:28 | LL | fn clone(&self) -> _ { FnTest9 } | ^ @@ -595,7 +595,7 @@ LL | fn clone(&self) -> _ { FnTest9 } | help: replace with the correct return type: `FnTest9` error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:118:41 + --> $DIR/typeck_type_placeholder_item.rs:122:41 | LL | fn clone_from(&mut self, other: _) { *self = FnTest9; } | ^ not allowed in type signatures @@ -606,25 +606,25 @@ LL | fn clone_from(&mut self, other: T) { *self = FnTest9; } | ^^^ ^ error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:201:14 + --> $DIR/typeck_type_placeholder_item.rs:205:14 | LL | type 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:203:14 + --> $DIR/typeck_type_placeholder_item.rs:207:14 | LL | type 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:205:14 + --> $DIR/typeck_type_placeholder_item.rs:209:14 | LL | const C: _; | ^ not allowed in type signatures error[E0121]: the type placeholder `_` is not allowed within types on item signatures - --> $DIR/typeck_type_placeholder_item.rs:208:14 + --> $DIR/typeck_type_placeholder_item.rs:212:14 | LL | const D: _ = 42; | ^ diff --git a/src/test/ui/typeck/typeck_type_placeholder_item.rs b/src/test/ui/typeck/typeck_type_placeholder_item.rs index 2523362fdc..8a52556ed3 100644 --- a/src/test/ui/typeck/typeck_type_placeholder_item.rs +++ b/src/test/ui/typeck/typeck_type_placeholder_item.rs @@ -1,5 +1,9 @@ // Needed for `type Y = impl Trait<_>` and `type B = _;` -#![feature(type_alias_impl_trait, associated_type_defaults)] +#![feature(associated_type_defaults)] +// revisions: min_tait full_tait +#![feature(min_type_alias_impl_trait)] +#![cfg_attr(full_tait, feature(type_alias_impl_trait))] +//[full_tait]~^ WARN incomplete // This test checks that it is not possible to enable global type // inference by using the `_` type placeholder. 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 0121e18631..f868c8d483 100644 --- a/src/test/ui/typeck/typeck_type_placeholder_item_help.stderr +++ b/src/test/ui/typeck/typeck_type_placeholder_item_help.stderr @@ -29,10 +29,7 @@ error[E0121]: the type placeholder `_` is not allowed within types on item signa --> $DIR/typeck_type_placeholder_item_help.rs:13:22 | LL | const TEST4: fn() -> _ = 42; - | ^ - | | - | not allowed in type signatures - | help: use type parameters instead: `T` + | ^ not allowed in type signatures error[E0121]: the type placeholder `_` is not allowed within types on item signatures --> $DIR/typeck_type_placeholder_item_help.rs:17:18 diff --git a/src/test/ui/ufcs/ufcs-explicit-self-bad.stderr b/src/test/ui/ufcs/ufcs-explicit-self-bad.stderr index d7c4817357..133ecab229 100644 --- a/src/test/ui/ufcs/ufcs-explicit-self-bad.stderr +++ b/src/test/ui/ufcs/ufcs-explicit-self-bad.stderr @@ -33,11 +33,11 @@ LL | fn dummy2(self: &Bar) {} | = note: expected reference `&'a Bar` found reference `&Bar` -note: the anonymous lifetime #1 defined on the method body at 37:5... - --> $DIR/ufcs-explicit-self-bad.rs:37:5 +note: the anonymous lifetime defined on the method body at 37:21... + --> $DIR/ufcs-explicit-self-bad.rs:37:21 | LL | fn dummy2(self: &Bar) {} - | ^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^ note: ...does not necessarily outlive the lifetime `'a` as defined on the impl at 35:6 --> $DIR/ufcs-explicit-self-bad.rs:35:6 | @@ -57,11 +57,11 @@ note: the lifetime `'a` as defined on the impl at 35:6... | LL | impl<'a, T> SomeTrait for &'a Bar { | ^^ -note: ...does not necessarily outlive the anonymous lifetime #1 defined on the method body at 37:5 - --> $DIR/ufcs-explicit-self-bad.rs:37:5 +note: ...does not necessarily outlive the anonymous lifetime defined on the method body at 37:21 + --> $DIR/ufcs-explicit-self-bad.rs:37:21 | LL | fn dummy2(self: &Bar) {} - | ^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^ error[E0308]: mismatched `self` parameter type --> $DIR/ufcs-explicit-self-bad.rs:39:21 @@ -71,11 +71,11 @@ LL | fn dummy3(self: &&Bar) {} | = note: expected reference `&'a Bar` found reference `&Bar` -note: the anonymous lifetime #2 defined on the method body at 39:5... - --> $DIR/ufcs-explicit-self-bad.rs:39:5 +note: the anonymous lifetime defined on the method body at 39:22... + --> $DIR/ufcs-explicit-self-bad.rs:39:22 | LL | fn dummy3(self: &&Bar) {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^ note: ...does not necessarily outlive the lifetime `'a` as defined on the impl at 35:6 --> $DIR/ufcs-explicit-self-bad.rs:35:6 | @@ -95,11 +95,11 @@ note: the lifetime `'a` as defined on the impl at 35:6... | LL | impl<'a, T> SomeTrait for &'a Bar { | ^^ -note: ...does not necessarily outlive the anonymous lifetime #2 defined on the method body at 39:5 - --> $DIR/ufcs-explicit-self-bad.rs:39:5 +note: ...does not necessarily outlive the anonymous lifetime defined on the method body at 39:22 + --> $DIR/ufcs-explicit-self-bad.rs:39:22 | LL | fn dummy3(self: &&Bar) {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^ + | ^^^^^^^ error: aborting due to 7 previous errors diff --git a/src/test/ui/issues/issue-18661.rs b/src/test/ui/unboxed-closures/issue-18661.rs similarity index 100% rename from src/test/ui/issues/issue-18661.rs rename to src/test/ui/unboxed-closures/issue-18661.rs diff --git a/src/test/ui/unboxed-closures/issue-30906.nll.stderr b/src/test/ui/unboxed-closures/issue-30906.nll.stderr index 5a2cbab9a1..2db392e8b8 100644 --- a/src/test/ui/unboxed-closures/issue-30906.nll.stderr +++ b/src/test/ui/unboxed-closures/issue-30906.nll.stderr @@ -1,5 +1,5 @@ error: higher-ranked subtype error - --> $DIR/issue-30906.rs:15:5 + --> $DIR/issue-30906.rs:18:5 | LL | test(Compose(f, |_| {})); | ^^^^^^^^^^^^^^^^^^^^^^^^ diff --git a/src/test/ui/unboxed-closures/issue-30906.rs b/src/test/ui/unboxed-closures/issue-30906.rs index 03cce83277..e2d219e470 100644 --- a/src/test/ui/unboxed-closures/issue-30906.rs +++ b/src/test/ui/unboxed-closures/issue-30906.rs @@ -2,9 +2,12 @@ fn test FnOnce<(&'x str,)>>(_: F) {} -struct Compose(F,G); -impl FnOnce<(T,)> for Compose -where F: FnOnce<(T,)>, G: FnOnce<(F::Output,)> { +struct Compose(F, G); +impl FnOnce<(T,)> for Compose +where + F: FnOnce<(T,)>, + G: FnOnce<(F::Output,)>, +{ type Output = G::Output; extern "rust-call" fn call_once(self, (x,): (T,)) -> G::Output { (self.1)((self.0)(x)) @@ -12,7 +15,8 @@ where F: FnOnce<(T,)>, G: FnOnce<(F::Output,)> { } fn bad(f: fn(&'static str) -> T) { - test(Compose(f, |_| {})); //~ ERROR: mismatched types + test(Compose(f, |_| {})); + //~^ ERROR: implementation of `FnOnce` is not general enough } fn main() {} diff --git a/src/test/ui/unboxed-closures/issue-30906.stderr b/src/test/ui/unboxed-closures/issue-30906.stderr index ecf3a96b5a..35b1e454c0 100644 --- a/src/test/ui/unboxed-closures/issue-30906.stderr +++ b/src/test/ui/unboxed-closures/issue-30906.stderr @@ -1,17 +1,11 @@ -error[E0308]: mismatched types - --> $DIR/issue-30906.rs:15:5 +error: implementation of `FnOnce` is not general enough + --> $DIR/issue-30906.rs:18:5 | LL | test(Compose(f, |_| {})); - | ^^^^ lifetime mismatch + | ^^^^ implementation of `FnOnce` is not general enough | - = note: expected type `FnOnce<(&'x str,)>` - found type `FnOnce<(&str,)>` -note: the lifetime requirement is introduced here - --> $DIR/issue-30906.rs:3:12 - | -LL | fn test FnOnce<(&'x str,)>>(_: F) {} - | ^^^^^^^^^^^^^^^^^^^^^^^^^^ + = note: `fn(&'2 str) -> T` must implement `FnOnce<(&'1 str,)>`, for any lifetime `'1`... + = note: ...but it actually implements `FnOnce<(&'2 str,)>`, for some specific lifetime `'2` error: aborting due to previous error -For more information about this error, try `rustc --explain E0308`. diff --git a/src/test/ui/type-id-higher-rank.rs b/src/test/ui/unboxed-closures/type-id-higher-rank.rs similarity index 100% rename from src/test/ui/type-id-higher-rank.rs rename to src/test/ui/unboxed-closures/type-id-higher-rank.rs diff --git a/src/test/ui/underscore-imports/hygiene-2.rs b/src/test/ui/underscore-imports/hygiene-2.rs index bea61eae6b..510d91d0d4 100644 --- a/src/test/ui/underscore-imports/hygiene-2.rs +++ b/src/test/ui/underscore-imports/hygiene-2.rs @@ -29,5 +29,6 @@ m!(y); fn main() { use crate::y::*; + #[allow(noop_method_call)] (&()).deref(); } diff --git a/src/test/ui/uninhabited/uninhabited-matches-feature-gated.stderr b/src/test/ui/uninhabited/uninhabited-matches-feature-gated.stderr index 7b999f5077..4f2f9e070f 100644 --- a/src/test/ui/uninhabited/uninhabited-matches-feature-gated.stderr +++ b/src/test/ui/uninhabited/uninhabited-matches-feature-gated.stderr @@ -10,7 +10,7 @@ LL | Err(#[stable(feature = "rust1", since = "1.0.0")] E), | --- not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms - = note: the matched value is of type `std::result::Result` + = note: the matched value is of type `Result` error[E0004]: non-exhaustive patterns: type `&Void` is non-empty --> $DIR/uninhabited-matches-feature-gated.rs:15:19 @@ -64,7 +64,7 @@ LL | Err(#[stable(feature = "rust1", since = "1.0.0")] E), | --- not covered | = help: ensure that all possible cases are being handled, possibly by adding wildcards or more match arms - = note: the matched value is of type `std::result::Result` + = note: the matched value is of type `Result` error[E0005]: refutable pattern in local binding: `Err(_)` not covered --> $DIR/uninhabited-matches-feature-gated.rs:37:9 @@ -79,7 +79,7 @@ LL | Err(#[stable(feature = "rust1", since = "1.0.0")] E), | = note: `let` bindings require an "irrefutable pattern", like a `struct` or an `enum` with only one variant = note: for more information, visit https://doc.rust-lang.org/book/ch18-02-refutability.html - = note: the matched value is of type `std::result::Result` + = note: the matched value is of type `Result` help: you might want to use `if let` to ignore the variant that isn't matched | LL | if let Ok(x) = x { /* */ } diff --git a/src/test/ui/unknown-lint-tool-name.rs b/src/test/ui/unknown-lint-tool-name.rs index 182aec34b4..84ab7c1944 100644 --- a/src/test/ui/unknown-lint-tool-name.rs +++ b/src/test/ui/unknown-lint-tool-name.rs @@ -1,8 +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` +#![deny(foo::bar)] //~ ERROR unknown tool name `foo` found in scoped lint: `foo::bar` + //~| ERROR unknown tool name `foo` found in scoped lint: `foo::bar` + //~| ERROR unknown tool name `foo` 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` +#[allow(foo::bar)] //~ ERROR unknown tool name `foo` found in scoped lint: `foo::bar` + //~| ERROR unknown tool name `foo` found in scoped lint: `foo::bar` + //~| ERROR unknown tool name `foo` 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 414816d229..1d145515ab 100644 --- a/src/test/ui/unknown-lint-tool-name.stderr +++ b/src/test/ui/unknown-lint-tool-name.stderr @@ -1,38 +1,50 @@ -error[E0710]: an unknown tool name found in scoped lint: `foo::bar` +error[E0710]: unknown tool name `foo` found in scoped lint: `foo::bar` --> $DIR/unknown-lint-tool-name.rs:1:9 | LL | #![deny(foo::bar)] | ^^^ + | + = help: add `#![register_tool(foo)]` to the crate root -error[E0710]: an unknown tool name found in scoped lint: `foo::bar` +error[E0710]: unknown tool name `foo` found in scoped lint: `foo::bar` --> $DIR/unknown-lint-tool-name.rs:5:9 | LL | #[allow(foo::bar)] | ^^^ + | + = help: add `#![register_tool(foo)]` to the crate root -error[E0710]: an unknown tool name found in scoped lint: `foo::bar` +error[E0710]: unknown tool name `foo` found in scoped lint: `foo::bar` --> $DIR/unknown-lint-tool-name.rs:1:9 | LL | #![deny(foo::bar)] | ^^^ + | + = help: add `#![register_tool(foo)]` to the crate root -error[E0710]: an unknown tool name found in scoped lint: `foo::bar` +error[E0710]: unknown tool name `foo` found in scoped lint: `foo::bar` --> $DIR/unknown-lint-tool-name.rs:5:9 | LL | #[allow(foo::bar)] | ^^^ + | + = help: add `#![register_tool(foo)]` to the crate root -error[E0710]: an unknown tool name found in scoped lint: `foo::bar` +error[E0710]: unknown tool name `foo` found in scoped lint: `foo::bar` --> $DIR/unknown-lint-tool-name.rs:1:9 | LL | #![deny(foo::bar)] | ^^^ + | + = help: add `#![register_tool(foo)]` to the crate root -error[E0710]: an unknown tool name found in scoped lint: `foo::bar` +error[E0710]: unknown tool name `foo` found in scoped lint: `foo::bar` --> $DIR/unknown-lint-tool-name.rs:5:9 | LL | #[allow(foo::bar)] | ^^^ + | + = help: add `#![register_tool(foo)]` to the crate root error: aborting due to 6 previous errors diff --git a/src/test/ui/unsafe/rfc-2585-unsafe_op_in_unsafe_fn.rs b/src/test/ui/unsafe/rfc-2585-unsafe_op_in_unsafe_fn.rs index 9eec7e0e8f..c8400a6fc4 100644 --- a/src/test/ui/unsafe/rfc-2585-unsafe_op_in_unsafe_fn.rs +++ b/src/test/ui/unsafe/rfc-2585-unsafe_op_in_unsafe_fn.rs @@ -1,4 +1,3 @@ -#![feature(unsafe_block_in_unsafe_fn)] #![deny(unsafe_op_in_unsafe_fn)] #![deny(unused_unsafe)] diff --git a/src/test/ui/unsafe/rfc-2585-unsafe_op_in_unsafe_fn.stderr b/src/test/ui/unsafe/rfc-2585-unsafe_op_in_unsafe_fn.stderr index 278a036c9f..3157783acb 100644 --- a/src/test/ui/unsafe/rfc-2585-unsafe_op_in_unsafe_fn.stderr +++ b/src/test/ui/unsafe/rfc-2585-unsafe_op_in_unsafe_fn.stderr @@ -1,18 +1,18 @@ error: call to unsafe function is unsafe and requires unsafe block (error E0133) - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:10:5 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:9:5 | LL | unsf(); | ^^^^^^ call to unsafe function | note: the lint level is defined here - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:2:9 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:1:9 | LL | #![deny(unsafe_op_in_unsafe_fn)] | ^^^^^^^^^^^^^^^^^^^^^^ = note: consult the function's documentation for information on how to avoid undefined behavior error: dereference of raw pointer is unsafe and requires unsafe block (error E0133) - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:12:5 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:11:5 | LL | *PTR; | ^^^^ dereference of raw pointer @@ -20,7 +20,7 @@ LL | *PTR; = note: raw pointers may be NULL, dangling or unaligned; they can violate aliasing rules and cause data races: all of these are undefined behavior error: use of mutable static is unsafe and requires unsafe block (error E0133) - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:14:5 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:13:5 | LL | VOID = (); | ^^^^^^^^^ use of mutable static @@ -28,25 +28,25 @@ LL | VOID = (); = note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior error: unnecessary `unsafe` block - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:17:5 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:16:5 | LL | unsafe {} | ^^^^^^ unnecessary `unsafe` block | note: the lint level is defined here - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:3:9 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:2:9 | LL | #![deny(unused_unsafe)] | ^^^^^^^^^^^^^ error: call to unsafe function is unsafe and requires unsafe block (error E0133) - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:25:5 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:24:5 | LL | unsf(); | ^^^^^^ call to unsafe function | note: the lint level is defined here - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:23:8 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:22:8 | LL | #[deny(warnings)] | ^^^^^^^^ @@ -54,7 +54,7 @@ LL | #[deny(warnings)] = note: consult the function's documentation for information on how to avoid undefined behavior error: dereference of raw pointer is unsafe and requires unsafe block (error E0133) - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:27:5 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:26:5 | LL | *PTR; | ^^^^ dereference of raw pointer @@ -62,7 +62,7 @@ LL | *PTR; = note: raw pointers may be NULL, dangling or unaligned; they can violate aliasing rules and cause data races: all of these are undefined behavior error: use of mutable static is unsafe and requires unsafe block (error E0133) - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:29:5 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:28:5 | LL | VOID = (); | ^^^^^^^^^ use of mutable static @@ -70,13 +70,13 @@ LL | VOID = (); = note: mutable statics can be mutated by multiple threads: aliasing violations or data races will cause undefined behavior error: unnecessary `unsafe` block - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:31:5 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:30:5 | LL | unsafe {} | ^^^^^^ unnecessary `unsafe` block error: unnecessary `unsafe` block - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:45:14 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:44:14 | LL | unsafe { unsafe { unsf() } } | ------ ^^^^^^ unnecessary `unsafe` block @@ -84,7 +84,7 @@ LL | unsafe { unsafe { unsf() } } | because it's nested under this `unsafe` block error: unnecessary `unsafe` block - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:56:5 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:55:5 | LL | unsafe fn allow_level() { | ----------------------- because it's nested under this `unsafe` fn @@ -93,7 +93,7 @@ LL | unsafe { unsf() } | ^^^^^^ unnecessary `unsafe` block error: unnecessary `unsafe` block - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:68:9 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:67:9 | LL | unsafe fn nested_allow_level() { | ------------------------------ because it's nested under this `unsafe` fn @@ -102,7 +102,7 @@ LL | unsafe { unsf() } | ^^^^^^ unnecessary `unsafe` block error[E0133]: call to unsafe function is unsafe and requires unsafe block - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:74:5 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:73:5 | LL | unsf(); | ^^^^^^ call to unsafe function @@ -110,7 +110,7 @@ LL | unsf(); = note: consult the function's documentation for information on how to avoid undefined behavior error[E0133]: call to unsafe function is unsafe and requires unsafe function or block - --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:78:9 + --> $DIR/rfc-2585-unsafe_op_in_unsafe_fn.rs:77:9 | LL | unsf(); | ^^^^^^ call to unsafe function diff --git a/src/test/ui/unsized/unsized-enum.stderr b/src/test/ui/unsized/unsized-enum.stderr index 795c7beab0..3057d4789b 100644 --- a/src/test/ui/unsized/unsized-enum.stderr +++ b/src/test/ui/unsized/unsized-enum.stderr @@ -13,7 +13,7 @@ help: you could relax the implicit `Sized` bound on `U` if it were used through --> $DIR/unsized-enum.rs:4:10 | LL | enum Foo { FooSome(U), FooNone } - | ^ - ...if indirection was used here: `Box` + | ^ - ...if indirection were used here: `Box` | | | this could be changed to `U: ?Sized`... diff --git a/src/test/ui/unsized/unsized-inherent-impl-self-type.stderr b/src/test/ui/unsized/unsized-inherent-impl-self-type.stderr index 9efebe3aef..9d8a1c6773 100644 --- a/src/test/ui/unsized/unsized-inherent-impl-self-type.stderr +++ b/src/test/ui/unsized/unsized-inherent-impl-self-type.stderr @@ -13,7 +13,7 @@ help: you could relax the implicit `Sized` bound on `Y` if it were used through --> $DIR/unsized-inherent-impl-self-type.rs:5:11 | LL | struct S5(Y); - | ^ - ...if indirection was used here: `Box` + | ^ - ...if indirection were used here: `Box` | | | this could be changed to `Y: ?Sized`... diff --git a/src/test/ui/unsized/unsized-struct.stderr b/src/test/ui/unsized/unsized-struct.stderr index e013b8fc69..6661cf358b 100644 --- a/src/test/ui/unsized/unsized-struct.stderr +++ b/src/test/ui/unsized/unsized-struct.stderr @@ -13,7 +13,7 @@ help: you could relax the implicit `Sized` bound on `T` if it were used through --> $DIR/unsized-struct.rs:4:12 | LL | struct Foo { data: T } - | ^ - ...if indirection was used here: `Box` + | ^ - ...if indirection were used here: `Box` | | | this could be changed to `T: ?Sized`... diff --git a/src/test/ui/unsized/unsized-trait-impl-self-type.stderr b/src/test/ui/unsized/unsized-trait-impl-self-type.stderr index 516c750cb3..d1b590d813 100644 --- a/src/test/ui/unsized/unsized-trait-impl-self-type.stderr +++ b/src/test/ui/unsized/unsized-trait-impl-self-type.stderr @@ -13,7 +13,7 @@ help: you could relax the implicit `Sized` bound on `Y` if it were used through --> $DIR/unsized-trait-impl-self-type.rs:8:11 | LL | struct S5(Y); - | ^ - ...if indirection was used here: `Box` + | ^ - ...if indirection were used here: `Box` | | | this could be changed to `Y: ?Sized`... diff --git a/src/test/ui/unspecified-self-in-trait-ref.stderr b/src/test/ui/unspecified-self-in-trait-ref.stderr index 9310b3d7ed..c951817022 100644 --- a/src/test/ui/unspecified-self-in-trait-ref.stderr +++ b/src/test/ui/unspecified-self-in-trait-ref.stderr @@ -31,7 +31,7 @@ LL | | } | |_- type parameter `A` must be specified for this ... LL | let e = Bar::::lol(); - | ^^^^^^^^^^^^^^^^^ missing reference to `A` + | ^^^^^^^^^^^^ 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/unused-crate-deps/extern-loc-bad-loctype.rs b/src/test/ui/unused-crate-deps/extern-loc-bad-loctype.rs new file mode 100644 index 0000000000..3e1527e2c2 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-bad-loctype.rs @@ -0,0 +1,8 @@ +// --extern-location with bad location type + +// aux-crate:bar=bar.rs +// compile-flags:--extern-location bar=badloc:in-the-test-file + +#![warn(unused_crate_dependencies)] + +fn main() {} diff --git a/src/test/ui/unused-crate-deps/extern-loc-bad-loctype.stderr b/src/test/ui/unused-crate-deps/extern-loc-bad-loctype.stderr new file mode 100644 index 0000000000..12378f1255 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-bad-loctype.stderr @@ -0,0 +1,2 @@ +error: unknown location type `badloc`: use `raw` or `json` + diff --git a/src/test/ui/unused-crate-deps/extern-loc-defl-json.rs b/src/test/ui/unused-crate-deps/extern-loc-defl-json.rs new file mode 100644 index 0000000000..a023f535b8 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-defl-json.rs @@ -0,0 +1,10 @@ +// Default extern location from name and path if one isn't specified + +// check-pass +// aux-crate:bar=bar.rs +// compile-flags:--error-format json + +#![warn(unused_crate_dependencies)] +//~^ WARNING external crate `bar` unused in + +fn main() {} diff --git a/src/test/ui/unused-crate-deps/extern-loc-defl-json.stderr b/src/test/ui/unused-crate-deps/extern-loc-defl-json.stderr new file mode 100644 index 0000000000..cee3f6c149 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-defl-json.stderr @@ -0,0 +1,17 @@ +{"message":"external crate `bar` unused in `extern_loc_defl_json`: remove the dependency or add `use bar as _;`","code":{"code":"unused_crate_dependencies","explanation":null},"level":"warning","spans":[{"file_name":"$DIR/extern-loc-defl-json.rs","byte_start":146,"byte_end":146,"line_start":7,"line_end":7,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"#![warn(unused_crate_dependencies)]","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"the lint level is defined here","code":null,"level":"note","spans":[{"file_name":"$DIR/extern-loc-defl-json.rs","byte_start":154,"byte_end":179,"line_start":7,"line_end":7,"column_start":9,"column_end":34,"is_primary":true,"text":[{"text":"#![warn(unused_crate_dependencies)]","highlight_start":9,"highlight_end":34}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":null},{"message":"remove unnecessary dependency `bar`","code":null,"level":"help","spans":[],"children":[],"rendered":null},{"message":"json extern location","code":null,"level":"help","spans":[],"children":[],"rendered":null,"tool_metadata":{"name":"bar"}}],"rendered":"warning: external crate `bar` unused in `extern_loc_defl_json`: remove the dependency or add `use bar as _;` + --> $DIR/extern-loc-defl-json.rs:7:1 + | +LL | #![warn(unused_crate_dependencies)] + | ^ + | +note: the lint level is defined here + --> $DIR/extern-loc-defl-json.rs:7:9 + | +LL | #![warn(unused_crate_dependencies)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + = help: remove unnecessary dependency `bar` + +"} +{"message":"1 warning emitted","code":null,"level":"warning","spans":[],"children":[],"rendered":"warning: 1 warning emitted + +"} diff --git a/src/test/ui/unused-crate-deps/extern-loc-json-bad-json.rs b/src/test/ui/unused-crate-deps/extern-loc-json-bad-json.rs new file mode 100644 index 0000000000..6fdf710a12 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-json-bad-json.rs @@ -0,0 +1,8 @@ +// --extern-location with a raw reference + +// aux-crate:bar=bar.rs +// compile-flags:--extern-location bar=json:[{"malformed + +#![warn(unused_crate_dependencies)] + +fn main() {} diff --git a/src/test/ui/unused-crate-deps/extern-loc-json-bad-json.stderr b/src/test/ui/unused-crate-deps/extern-loc-json-bad-json.stderr new file mode 100644 index 0000000000..20d606372e --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-json-bad-json.stderr @@ -0,0 +1,2 @@ +error: `--extern-location`: malformed json location `[{"malformed` + diff --git a/src/test/ui/unused-crate-deps/extern-loc-json-json.rs b/src/test/ui/unused-crate-deps/extern-loc-json-json.rs new file mode 100644 index 0000000000..02a9869151 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-json-json.rs @@ -0,0 +1,10 @@ +// --extern-location with a raw reference + +// check-pass +// aux-crate:bar=bar.rs +// compile-flags:--extern-location bar=json:{"key":123,"value":{}} --error-format json + +#![warn(unused_crate_dependencies)] +//~^ WARNING external crate `bar` unused in + +fn main() {} diff --git a/src/test/ui/unused-crate-deps/extern-loc-json-json.stderr b/src/test/ui/unused-crate-deps/extern-loc-json-json.stderr new file mode 100644 index 0000000000..5fc8397e46 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-json-json.stderr @@ -0,0 +1,17 @@ +{"message":"external crate `bar` unused in `extern_loc_json_json`: remove the dependency or add `use bar as _;`","code":{"code":"unused_crate_dependencies","explanation":null},"level":"warning","spans":[{"file_name":"$DIR/extern-loc-json-json.rs","byte_start":169,"byte_end":169,"line_start":7,"line_end":7,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"#![warn(unused_crate_dependencies)]","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"the lint level is defined here","code":null,"level":"note","spans":[{"file_name":"$DIR/extern-loc-json-json.rs","byte_start":177,"byte_end":202,"line_start":7,"line_end":7,"column_start":9,"column_end":34,"is_primary":true,"text":[{"text":"#![warn(unused_crate_dependencies)]","highlight_start":9,"highlight_end":34}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":null},{"message":"remove unnecessary dependency `bar`","code":null,"level":"help","spans":[],"children":[],"rendered":null},{"message":"json extern location","code":null,"level":"help","spans":[],"children":[],"rendered":null,"tool_metadata":{"key":123,"value":{}}}],"rendered":"warning: external crate `bar` unused in `extern_loc_json_json`: remove the dependency or add `use bar as _;` + --> $DIR/extern-loc-json-json.rs:7:1 + | +LL | #![warn(unused_crate_dependencies)] + | ^ + | +note: the lint level is defined here + --> $DIR/extern-loc-json-json.rs:7:9 + | +LL | #![warn(unused_crate_dependencies)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + = help: remove unnecessary dependency `bar` + +"} +{"message":"1 warning emitted","code":null,"level":"warning","spans":[],"children":[],"rendered":"warning: 1 warning emitted + +"} diff --git a/src/test/ui/unused-crate-deps/extern-loc-json.rs b/src/test/ui/unused-crate-deps/extern-loc-json.rs new file mode 100644 index 0000000000..212610d532 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-json.rs @@ -0,0 +1,10 @@ +// --extern-location with a raw reference + +// check-pass +// aux-crate:bar=bar.rs +// compile-flags:--extern-location bar=json:{"key":123,"value":{}} + +#![warn(unused_crate_dependencies)] +//~^ WARNING external crate `bar` unused in + +fn main() {} diff --git a/src/test/ui/unused-crate-deps/extern-loc-json.stderr b/src/test/ui/unused-crate-deps/extern-loc-json.stderr new file mode 100644 index 0000000000..a6bbc0da1c --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-json.stderr @@ -0,0 +1,15 @@ +warning: external crate `bar` unused in `extern_loc_json`: remove the dependency or add `use bar as _;` + --> $DIR/extern-loc-json.rs:7:1 + | +LL | #![warn(unused_crate_dependencies)] + | ^ + | +note: the lint level is defined here + --> $DIR/extern-loc-json.rs:7:9 + | +LL | #![warn(unused_crate_dependencies)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + = help: remove unnecessary dependency `bar` + +warning: 1 warning emitted + diff --git a/src/test/ui/unused-crate-deps/extern-loc-missing-loc.rs b/src/test/ui/unused-crate-deps/extern-loc-missing-loc.rs new file mode 100644 index 0000000000..9339a004d3 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-missing-loc.rs @@ -0,0 +1,8 @@ +// --extern-location with a raw reference + +// aux-crate:bar=bar.rs +// compile-flags:--extern-location bar + +#![warn(unused_crate_dependencies)] + +fn main() {} diff --git a/src/test/ui/unused-crate-deps/extern-loc-missing-loc.stderr b/src/test/ui/unused-crate-deps/extern-loc-missing-loc.stderr new file mode 100644 index 0000000000..4584fbfb67 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-missing-loc.stderr @@ -0,0 +1,2 @@ +error: `--extern-location`: specify location for extern crate `bar` + diff --git a/src/test/ui/unused-crate-deps/extern-loc-missing-loctype.rs b/src/test/ui/unused-crate-deps/extern-loc-missing-loctype.rs new file mode 100644 index 0000000000..4768365a65 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-missing-loctype.rs @@ -0,0 +1,8 @@ +// --extern-location with no type + +// aux-crate:bar=bar.rs +// compile-flags:--extern-location bar=missing-loc-type + +#![warn(unused_crate_dependencies)] + +fn main() {} diff --git a/src/test/ui/unused-crate-deps/extern-loc-missing-loctype.stderr b/src/test/ui/unused-crate-deps/extern-loc-missing-loctype.stderr new file mode 100644 index 0000000000..d0c36ebeb1 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-missing-loctype.stderr @@ -0,0 +1,2 @@ +error: unknown location type `missing-loc-type`: use `raw` or `json` + diff --git a/src/test/ui/unused-crate-deps/extern-loc-raw-json.rs b/src/test/ui/unused-crate-deps/extern-loc-raw-json.rs new file mode 100644 index 0000000000..207615ccc8 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-raw-json.rs @@ -0,0 +1,10 @@ +// --extern-location with a raw reference + +// check-pass +// aux-crate:bar=bar.rs +// compile-flags:--extern-location bar=raw:in-the-test-file --error-format json + +#![warn(unused_crate_dependencies)] +//~^ WARNING external crate `bar` unused in + +fn main() {} diff --git a/src/test/ui/unused-crate-deps/extern-loc-raw-json.stderr b/src/test/ui/unused-crate-deps/extern-loc-raw-json.stderr new file mode 100644 index 0000000000..25f099927f --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-raw-json.stderr @@ -0,0 +1,17 @@ +{"message":"external crate `bar` unused in `extern_loc_raw_json`: remove the dependency or add `use bar as _;`","code":{"code":"unused_crate_dependencies","explanation":null},"level":"warning","spans":[{"file_name":"$DIR/extern-loc-raw-json.rs","byte_start":162,"byte_end":162,"line_start":7,"line_end":7,"column_start":1,"column_end":1,"is_primary":true,"text":[{"text":"#![warn(unused_crate_dependencies)]","highlight_start":1,"highlight_end":1}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[{"message":"the lint level is defined here","code":null,"level":"note","spans":[{"file_name":"$DIR/extern-loc-raw-json.rs","byte_start":170,"byte_end":195,"line_start":7,"line_end":7,"column_start":9,"column_end":34,"is_primary":true,"text":[{"text":"#![warn(unused_crate_dependencies)]","highlight_start":9,"highlight_end":34}],"label":null,"suggested_replacement":null,"suggestion_applicability":null,"expansion":null}],"children":[],"rendered":null},{"message":"remove unnecessary dependency `bar` at `in-the-test-file`","code":null,"level":"help","spans":[],"children":[],"rendered":null},{"message":"raw extern location","code":null,"level":"help","spans":[{"file_name":"$DIR/extern-loc-raw-json.rs","byte_start":0,"byte_end":0,"line_start":1,"line_end":1,"column_start":1,"column_end":1,"is_primary":true,"text":[],"label":null,"suggested_replacement":"in-the-test-file","suggestion_applicability":"Unspecified","expansion":null}],"children":[],"rendered":null},{"message":"json extern location","code":null,"level":"help","spans":[],"children":[],"rendered":null,"tool_metadata":"in-the-test-file"}],"rendered":"warning: external crate `bar` unused in `extern_loc_raw_json`: remove the dependency or add `use bar as _;` + --> $DIR/extern-loc-raw-json.rs:7:1 + | +LL | #![warn(unused_crate_dependencies)] + | ^ + | +note: the lint level is defined here + --> $DIR/extern-loc-raw-json.rs:7:9 + | +LL | #![warn(unused_crate_dependencies)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + = help: remove unnecessary dependency `bar` at `in-the-test-file` + +"} +{"message":"1 warning emitted","code":null,"level":"warning","spans":[],"children":[],"rendered":"warning: 1 warning emitted + +"} diff --git a/src/test/ui/unused-crate-deps/extern-loc-raw-missing-loc.rs b/src/test/ui/unused-crate-deps/extern-loc-raw-missing-loc.rs new file mode 100644 index 0000000000..65b6426839 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-raw-missing-loc.rs @@ -0,0 +1,8 @@ +// --extern-location with a raw reference + +// aux-crate:bar=bar.rs +// compile-flags:--extern-location bar=raw + +#![warn(unused_crate_dependencies)] + +fn main() {} diff --git a/src/test/ui/unused-crate-deps/extern-loc-raw-missing-loc.stderr b/src/test/ui/unused-crate-deps/extern-loc-raw-missing-loc.stderr new file mode 100644 index 0000000000..4b51266e4f --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-raw-missing-loc.stderr @@ -0,0 +1,2 @@ +error: `--extern-location`: missing `raw` location + diff --git a/src/test/ui/unused-crate-deps/extern-loc-raw.rs b/src/test/ui/unused-crate-deps/extern-loc-raw.rs new file mode 100644 index 0000000000..fc3fed1e10 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-raw.rs @@ -0,0 +1,10 @@ +// --extern-location with a raw reference + +// check-pass +// aux-crate:bar=bar.rs +// compile-flags:--extern-location bar=raw:in-the-test-file + +#![warn(unused_crate_dependencies)] +//~^ WARNING external crate `bar` unused in + +fn main() {} diff --git a/src/test/ui/unused-crate-deps/extern-loc-raw.stderr b/src/test/ui/unused-crate-deps/extern-loc-raw.stderr new file mode 100644 index 0000000000..2cdd005586 --- /dev/null +++ b/src/test/ui/unused-crate-deps/extern-loc-raw.stderr @@ -0,0 +1,15 @@ +warning: external crate `bar` unused in `extern_loc_raw`: remove the dependency or add `use bar as _;` + --> $DIR/extern-loc-raw.rs:7:1 + | +LL | #![warn(unused_crate_dependencies)] + | ^ + | +note: the lint level is defined here + --> $DIR/extern-loc-raw.rs:7:9 + | +LL | #![warn(unused_crate_dependencies)] + | ^^^^^^^^^^^^^^^^^^^^^^^^^ + = help: remove unnecessary dependency `bar` at `in-the-test-file` + +warning: 1 warning emitted + diff --git a/src/test/ui/unused-crate-deps/libfib.stderr b/src/test/ui/unused-crate-deps/libfib.stderr index 15833126bd..479f51bff4 100644 --- a/src/test/ui/unused-crate-deps/libfib.stderr +++ b/src/test/ui/unused-crate-deps/libfib.stderr @@ -5,6 +5,7 @@ LL | pub fn fib(n: u32) -> Vec { | ^ | = note: requested on the command line with `-W unused-crate-dependencies` + = help: remove unnecessary dependency `bar` warning: 1 warning emitted diff --git a/src/test/ui/unused-crate-deps/test.mk b/src/test/ui/unused-crate-deps/test.mk new file mode 100644 index 0000000000..0b98b4e44f --- /dev/null +++ b/src/test/ui/unused-crate-deps/test.mk @@ -0,0 +1,7 @@ +# Everyone uses make for building Rust + +foo: bar.rlib + $(RUSTC) --crate-type bin --extern bar=bar.rlib + +%.rlib: %.rs + $(RUSTC) --crate-type lib $< diff --git a/src/test/ui/unused-crate-deps/unused-aliases.stderr b/src/test/ui/unused-crate-deps/unused-aliases.stderr index c8c6c4507b..1142d156d0 100644 --- a/src/test/ui/unused-crate-deps/unused-aliases.stderr +++ b/src/test/ui/unused-crate-deps/unused-aliases.stderr @@ -9,6 +9,7 @@ note: the lint level is defined here | LL | #![warn(unused_crate_dependencies)] | ^^^^^^^^^^^^^^^^^^^^^^^^^ + = help: remove unnecessary dependency `barbar` warning: 1 warning emitted diff --git a/src/test/ui/unused-crate-deps/warn-attr.stderr b/src/test/ui/unused-crate-deps/warn-attr.stderr index 0d38315704..29667d9525 100644 --- a/src/test/ui/unused-crate-deps/warn-attr.stderr +++ b/src/test/ui/unused-crate-deps/warn-attr.stderr @@ -9,6 +9,7 @@ note: the lint level is defined here | LL | #![warn(unused_crate_dependencies)] | ^^^^^^^^^^^^^^^^^^^^^^^^^ + = help: remove unnecessary dependency `bar` warning: 1 warning emitted diff --git a/src/test/ui/unused-crate-deps/warn-cmdline-static.stderr b/src/test/ui/unused-crate-deps/warn-cmdline-static.stderr index 65956461d6..2c0c921512 100644 --- a/src/test/ui/unused-crate-deps/warn-cmdline-static.stderr +++ b/src/test/ui/unused-crate-deps/warn-cmdline-static.stderr @@ -5,6 +5,7 @@ LL | fn main() {} | ^ | = note: requested on the command line with `-W unused-crate-dependencies` + = help: remove unnecessary dependency `bar` warning: 1 warning emitted diff --git a/src/test/ui/unused-crate-deps/warn-cmdline.stderr b/src/test/ui/unused-crate-deps/warn-cmdline.stderr index ea675ba9a1..2cd49218f5 100644 --- a/src/test/ui/unused-crate-deps/warn-cmdline.stderr +++ b/src/test/ui/unused-crate-deps/warn-cmdline.stderr @@ -5,6 +5,7 @@ LL | fn main() {} | ^ | = note: requested on the command line with `-W unused-crate-dependencies` + = help: remove unnecessary dependency `bar` warning: 1 warning emitted diff --git a/src/test/ui/unused/unused-attr.stderr b/src/test/ui/unused/unused-attr.stderr index fd7412db22..707521b780 100644 --- a/src/test/ui/unused/unused-attr.stderr +++ b/src/test/ui/unused/unused-attr.stderr @@ -1,8 +1,8 @@ error: unused attribute - --> $DIR/unused-attr.rs:6:1 + --> $DIR/unused-attr.rs:4:1 | -LL | #[rustc_dummy] - | ^^^^^^^^^^^^^^ +LL | #![rustc_dummy] + | ^^^^^^^^^^^^^^^ | note: the lint level is defined here --> $DIR/unused-attr.rs:1:9 @@ -11,16 +11,16 @@ LL | #![deny(unused_attributes)] | ^^^^^^^^^^^^^^^^^ error: unused attribute - --> $DIR/unused-attr.rs:9:1 + --> $DIR/unused-attr.rs:6:1 | LL | #[rustc_dummy] | ^^^^^^^^^^^^^^ error: unused attribute - --> $DIR/unused-attr.rs:14:5 + --> $DIR/unused-attr.rs:9:1 | -LL | #[rustc_dummy] - | ^^^^^^^^^^^^^^ +LL | #[rustc_dummy] + | ^^^^^^^^^^^^^^ error: unused attribute --> $DIR/unused-attr.rs:12:1 @@ -29,10 +29,16 @@ LL | #[rustc_dummy] | ^^^^^^^^^^^^^^ error: unused attribute - --> $DIR/unused-attr.rs:22:9 + --> $DIR/unused-attr.rs:14:5 | -LL | #[rustc_dummy] - | ^^^^^^^^^^^^^^ +LL | #[rustc_dummy] + | ^^^^^^^^^^^^^^ + +error: unused attribute + --> $DIR/unused-attr.rs:18:1 + | +LL | #[rustc_dummy] + | ^^^^^^^^^^^^^^ error: unused attribute --> $DIR/unused-attr.rs:20:5 @@ -41,7 +47,13 @@ LL | #[rustc_dummy] | ^^^^^^^^^^^^^^ error: unused attribute - --> $DIR/unused-attr.rs:18:1 + --> $DIR/unused-attr.rs:22:9 + | +LL | #[rustc_dummy] + | ^^^^^^^^^^^^^^ + +error: unused attribute + --> $DIR/unused-attr.rs:27:1 | LL | #[rustc_dummy] | ^^^^^^^^^^^^^^ @@ -53,7 +65,7 @@ LL | #[rustc_dummy] | ^^^^^^^^^^^^^^ error: unused attribute - --> $DIR/unused-attr.rs:27:1 + --> $DIR/unused-attr.rs:35:1 | LL | #[rustc_dummy] | ^^^^^^^^^^^^^^ @@ -65,7 +77,7 @@ LL | #[rustc_dummy] | ^^^^^^^^^^^^^^ error: unused attribute - --> $DIR/unused-attr.rs:35:1 + --> $DIR/unused-attr.rs:41:1 | LL | #[rustc_dummy] | ^^^^^^^^^^^^^^ @@ -82,17 +94,5 @@ error: unused attribute LL | #[rustc_dummy] | ^^^^^^^^^^^^^^ -error: unused attribute - --> $DIR/unused-attr.rs:41:1 - | -LL | #[rustc_dummy] - | ^^^^^^^^^^^^^^ - -error: unused attribute - --> $DIR/unused-attr.rs:4:1 - | -LL | #![rustc_dummy] - | ^^^^^^^^^^^^^^^ - error: aborting due to 15 previous errors diff --git a/src/test/ui/unwind-abis/feature-gate-c-unwind-enabled.rs b/src/test/ui/unwind-abis/feature-gate-c-unwind-enabled.rs new file mode 100644 index 0000000000..6ff5dbda2d --- /dev/null +++ b/src/test/ui/unwind-abis/feature-gate-c-unwind-enabled.rs @@ -0,0 +1,12 @@ +// Test that the "C-unwind" ABI is feature-gated, and *can* be used when the +// `c_unwind` feature gate is enabled. + +// check-pass + +#![feature(c_unwind)] + +extern "C-unwind" fn f() {} + +fn main() { + f(); +} diff --git a/src/test/ui/unwind-abis/feature-gate-c-unwind.rs b/src/test/ui/unwind-abis/feature-gate-c-unwind.rs new file mode 100644 index 0000000000..f02a368d4e --- /dev/null +++ b/src/test/ui/unwind-abis/feature-gate-c-unwind.rs @@ -0,0 +1,9 @@ +// Test that the "C-unwind" ABI is feature-gated, and cannot be used when the +// `c_unwind` feature gate is not used. + +extern "C-unwind" fn f() {} +//~^ ERROR C-unwind ABI is experimental and subject to change [E0658] + +fn main() { + f(); +} diff --git a/src/test/ui/unwind-abis/feature-gate-c-unwind.stderr b/src/test/ui/unwind-abis/feature-gate-c-unwind.stderr new file mode 100644 index 0000000000..f4c785a235 --- /dev/null +++ b/src/test/ui/unwind-abis/feature-gate-c-unwind.stderr @@ -0,0 +1,12 @@ +error[E0658]: C-unwind ABI is experimental and subject to change + --> $DIR/feature-gate-c-unwind.rs:4:8 + | +LL | extern "C-unwind" fn f() {} + | ^^^^^^^^^^ + | + = note: see issue #74990 for more information + = help: add `#![feature(c_unwind)]` 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/unwind-abis/feature-gate-stdcall-unwind.rs b/src/test/ui/unwind-abis/feature-gate-stdcall-unwind.rs new file mode 100644 index 0000000000..7d4dc8c934 --- /dev/null +++ b/src/test/ui/unwind-abis/feature-gate-stdcall-unwind.rs @@ -0,0 +1,13 @@ +// ignore-arm stdcall isn't supported +// ignore-aarch64 stdcall isn't supported +// ignore-riscv64 stdcall isn't supported + +// Test that the "stdcall-unwind" ABI is feature-gated, and cannot be used when +// the `c_unwind` feature gate is not used. + +extern "stdcall-unwind" fn f() {} +//~^ ERROR stdcall-unwind ABI is experimental and subject to change [E0658] + +fn main() { + f(); +} diff --git a/src/test/ui/unwind-abis/feature-gate-stdcall-unwind.stderr b/src/test/ui/unwind-abis/feature-gate-stdcall-unwind.stderr new file mode 100644 index 0000000000..e3d569f464 --- /dev/null +++ b/src/test/ui/unwind-abis/feature-gate-stdcall-unwind.stderr @@ -0,0 +1,12 @@ +error[E0658]: stdcall-unwind ABI is experimental and subject to change + --> $DIR/feature-gate-stdcall-unwind.rs:8:8 + | +LL | extern "stdcall-unwind" fn f() {} + | ^^^^^^^^^^^^^^^^ + | + = note: see issue #74990 for more information + = help: add `#![feature(c_unwind)]` 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/unwind-abis/feature-gate-system-unwind.rs b/src/test/ui/unwind-abis/feature-gate-system-unwind.rs new file mode 100644 index 0000000000..26c2de4e81 --- /dev/null +++ b/src/test/ui/unwind-abis/feature-gate-system-unwind.rs @@ -0,0 +1,9 @@ +// Test that the "system-unwind" ABI is feature-gated, and cannot be used when +// the `c_unwind` feature gate is not used. + +extern "system-unwind" fn f() {} +//~^ ERROR system-unwind ABI is experimental and subject to change [E0658] + +fn main() { + f(); +} diff --git a/src/test/ui/unwind-abis/feature-gate-system-unwind.stderr b/src/test/ui/unwind-abis/feature-gate-system-unwind.stderr new file mode 100644 index 0000000000..8787733647 --- /dev/null +++ b/src/test/ui/unwind-abis/feature-gate-system-unwind.stderr @@ -0,0 +1,12 @@ +error[E0658]: system-unwind ABI is experimental and subject to change + --> $DIR/feature-gate-system-unwind.rs:4:8 + | +LL | extern "system-unwind" fn f() {} + | ^^^^^^^^^^^^^^^ + | + = note: see issue #74990 for more information + = help: add `#![feature(c_unwind)]` 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/unwind-abis/feature-gate-thiscall-unwind.rs b/src/test/ui/unwind-abis/feature-gate-thiscall-unwind.rs new file mode 100644 index 0000000000..2f4cefccc1 --- /dev/null +++ b/src/test/ui/unwind-abis/feature-gate-thiscall-unwind.rs @@ -0,0 +1,13 @@ +// ignore-arm thiscall isn't supported +// ignore-aarch64 thiscall isn't supported +// ignore-riscv64 thiscall isn't supported + +// Test that the "thiscall-unwind" ABI is feature-gated, and cannot be used when +// the `c_unwind` feature gate is not used. + +extern "thiscall-unwind" fn f() {} +//~^ ERROR thiscall-unwind ABI is experimental and subject to change [E0658] + +fn main() { + f(); +} diff --git a/src/test/ui/unwind-abis/feature-gate-thiscall-unwind.stderr b/src/test/ui/unwind-abis/feature-gate-thiscall-unwind.stderr new file mode 100644 index 0000000000..b103bb8d56 --- /dev/null +++ b/src/test/ui/unwind-abis/feature-gate-thiscall-unwind.stderr @@ -0,0 +1,12 @@ +error[E0658]: thiscall-unwind ABI is experimental and subject to change + --> $DIR/feature-gate-thiscall-unwind.rs:8:8 + | +LL | extern "thiscall-unwind" fn f() {} + | ^^^^^^^^^^^^^^^^^ + | + = note: see issue #74990 for more information + = help: add `#![feature(c_unwind)]` 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/variants/variant-namespacing.rs b/src/test/ui/variants/variant-namespacing.rs index ceb7d27451..975e471fe3 100644 --- a/src/test/ui/variants/variant-namespacing.rs +++ b/src/test/ui/variants/variant-namespacing.rs @@ -1,6 +1,6 @@ // aux-build:variant-namespacing.rs -enum E { +pub enum E { Struct { a: u8 }, Tuple(u8), Unit, diff --git a/src/test/ui/wf/wf-fn-where-clause.stderr b/src/test/ui/wf/wf-fn-where-clause.stderr index 988cb2fa54..22598e58bd 100644 --- a/src/test/ui/wf/wf-fn-where-clause.stderr +++ b/src/test/ui/wf/wf-fn-where-clause.stderr @@ -28,7 +28,7 @@ help: you could relax the implicit `Sized` bound on `T` if it were used through LL | struct Vec { | ^ this could be changed to `T: ?Sized`... LL | t: T, - | - ...if indirection was used here: `Box` + | - ...if indirection were used here: `Box` error[E0038]: the trait `Copy` cannot be made into an object --> $DIR/wf-fn-where-clause.rs:12:16 diff --git a/src/test/ui/wf/wf-static-method.stderr b/src/test/ui/wf/wf-static-method.stderr index 93d16514a5..0c98a80902 100644 --- a/src/test/ui/wf/wf-static-method.stderr +++ b/src/test/ui/wf/wf-static-method.stderr @@ -19,7 +19,7 @@ error[E0478]: lifetime bound not satisfied --> $DIR/wf-static-method.rs:26:18 | LL | let me = Self::make_me(); - | ^^^^^^^^^^^^^ + | ^^^^ | note: lifetime parameter instantiated with the lifetime `'b` as defined on the impl at 23:10 --> $DIR/wf-static-method.rs:23:10 diff --git a/src/test/ui/where-clauses/where-for-self-2.stderr b/src/test/ui/where-clauses/where-for-self-2.stderr index 30eb78b2da..6da46e20c0 100644 --- a/src/test/ui/where-clauses/where-for-self-2.stderr +++ b/src/test/ui/where-clauses/where-for-self-2.stderr @@ -1,16 +1,11 @@ error: implementation of `Bar` is not general enough --> $DIR/where-for-self-2.rs:23:5 | -LL | / trait Bar { -LL | | fn bar(&self); -LL | | } - | |_- trait `Bar` defined here -... -LL | foo(&X); - | ^^^ implementation of `Bar` is not general enough +LL | foo(&X); + | ^^^ implementation of `Bar` is not general enough | - = note: `Bar` would have to be implemented for the type `&'0 u32`, for any lifetime `'0`... - = note: ...but `Bar` is actually implemented for the type `&'1 u32`, for some specific lifetime `'1` + = note: `&'0 u32` must implement `Bar`, for any lifetime `'0`... + = note: ...but `Bar` is actually implemented for the type `&'static u32` error: aborting due to previous error diff --git a/src/test/ui/while-let.rs b/src/test/ui/while-let.rs index cfbf7565cb..b9a49b47c8 100644 --- a/src/test/ui/while-let.rs +++ b/src/test/ui/while-let.rs @@ -5,8 +5,8 @@ fn macros() { macro_rules! foo{ ($p:pat, $e:expr, $b:block) => {{ while let $p = $e $b - //~^ WARN irrefutable while-let - //~| WARN irrefutable while-let + //~^ WARN irrefutable `while let` + //~| WARN irrefutable `while let` }} } macro_rules! bar{ @@ -24,7 +24,7 @@ fn macros() { } pub fn main() { - while let _a = 1 { //~ WARN irrefutable while-let + while let _a = 1 { //~ WARN irrefutable `while let` println!("irrefutable pattern"); break; } diff --git a/src/test/ui/while-let.stderr b/src/test/ui/while-let.stderr index 867c95c0e0..04e77bf947 100644 --- a/src/test/ui/while-let.stderr +++ b/src/test/ui/while-let.stderr @@ -1,4 +1,4 @@ -warning: irrefutable while-let pattern +warning: irrefutable `while let` pattern --> $DIR/while-let.rs:7:13 | LL | while let $p = $e $b @@ -10,9 +10,11 @@ LL | | }); | |_______- in this macro invocation | = note: `#[warn(irrefutable_let_patterns)]` on by default + = note: this pattern will always match, so the loop will never exit + = help: consider instead using a `loop { ... }` with a `let` inside it = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) -warning: irrefutable while-let pattern +warning: irrefutable `while let` pattern --> $DIR/while-let.rs:7:13 | LL | while let $p = $e $b @@ -23,9 +25,11 @@ LL | | println!("irrefutable pattern"); LL | | }); | |_______- in this macro invocation | + = note: this pattern will always match, so the loop will never exit + = help: consider instead using a `loop { ... }` with a `let` inside it = note: this warning originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) -warning: irrefutable while-let pattern +warning: irrefutable `while let` pattern --> $DIR/while-let.rs:27:5 | LL | / while let _a = 1 { @@ -33,6 +37,9 @@ LL | | println!("irrefutable pattern"); LL | | break; LL | | } | |_____^ + | + = note: this pattern will always match, so the loop will never exit + = help: consider instead using a `loop { ... }` with a `let` inside it warning: 3 warnings emitted diff --git a/src/tools/build-manifest/src/main.rs b/src/tools/build-manifest/src/main.rs index 73a4cbd079..4e605caafe 100644 --- a/src/tools/build-manifest/src/main.rs +++ b/src/tools/build-manifest/src/main.rs @@ -139,7 +139,6 @@ static TARGETS: &[&str] = &[ "x86_64-linux-android", "x86_64-pc-windows-gnu", "x86_64-pc-windows-msvc", - "x86_64-rumprun-netbsd", "x86_64-sun-solaris", "x86_64-pc-solaris", "x86_64-unknown-freebsd", @@ -254,24 +253,26 @@ impl Builder { t!(self.checksums.store_cache()); } - /// If a tool does not pass its tests, don't ship it. + /// If a tool does not pass its tests on *any* of Linux and Windows, don't ship + /// it on *all* targets, because tools like Miri can "cross-run" programs for + /// different targets, for example, run a program for `x86_64-pc-windows-msvc` + /// on `x86_64-unknown-linux-gnu`. /// Right now, we do this only for Miri. fn check_toolstate(&mut self) { - let toolstates: Option> = - File::open(self.input.join("toolstates-linux.json")) + for file in &["toolstates-linux.json", "toolstates-windows.json"] { + let toolstates: Option> = File::open(self.input.join(file)) .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" - ); - HashMap::default() // Use empty map if anything went wrong. - }); - // Mark some tools as missing based on toolstate. - if toolstates.get("miri").map(|s| &*s as &str) != Some("test-pass") { - println!("Miri tests are not passing, removing component"); - self.versions.disable_version(&PkgType::Miri); + let toolstates = toolstates.unwrap_or_else(|| { + println!("WARNING: `{}` missing/malformed; assuming all tools failed", file); + HashMap::default() // Use empty map if anything went wrong. + }); + // Mark some tools as missing based on toolstate. + if toolstates.get("miri").map(|s| &*s as &str) != Some("test-pass") { + println!("Miri tests are not passing, removing component"); + self.versions.disable_version(&PkgType::Miri); + break; + } } } diff --git a/src/tools/compiletest/Cargo.toml b/src/tools/compiletest/Cargo.toml index 209254a5d5..f61d61e8f9 100644 --- a/src/tools/compiletest/Cargo.toml +++ b/src/tools/compiletest/Cargo.toml @@ -5,10 +5,12 @@ version = "0.0.0" edition = "2018" [dependencies] +colored = "2" diff = "0.1.10" +unified-diff = "0.2.1" getopts = "0.2" tracing = "0.1" -tracing-subscriber = { version = "0.2.13", default-features = false, features = ["fmt", "env-filter", "smallvec", "parking_lot", "ansi"] } +tracing-subscriber = { version = "0.2", default-features = false, features = ["fmt", "env-filter", "smallvec", "parking_lot", "ansi"] } regex = "1.0" serde = { version = "1.0", features = ["derive"] } serde_json = "1.0" diff --git a/src/tools/compiletest/src/common.rs b/src/tools/compiletest/src/common.rs index c8e7674323..99cbcf316a 100644 --- a/src/tools/compiletest/src/common.rs +++ b/src/tools/compiletest/src/common.rs @@ -240,8 +240,8 @@ pub struct Config { /// Run ignored tests pub run_ignored: bool, - /// Only run tests that match this filter - pub filter: Option, + /// Only run tests that match these filters + pub filters: Vec, /// Exactly match the filter, rather than a substring pub filter_exact: bool, @@ -344,6 +344,8 @@ pub struct Config { /// Path to a NodeJS executable. Used for JS doctests, emscripten and WASM tests pub nodejs: Option, + /// Path to a npm executable. Used for rustdoc GUI tests + pub npm: Option, } #[derive(Debug, Clone)] diff --git a/src/tools/compiletest/src/header.rs b/src/tools/compiletest/src/header.rs index 2eba91fd1f..ff0d845be9 100644 --- a/src/tools/compiletest/src/header.rs +++ b/src/tools/compiletest/src/header.rs @@ -48,6 +48,7 @@ impl EarlyProps { let has_lsan = util::LSAN_SUPPORTED_TARGETS.contains(&&*config.target); let has_msan = util::MSAN_SUPPORTED_TARGETS.contains(&&*config.target); let has_tsan = util::TSAN_SUPPORTED_TARGETS.contains(&&*config.target); + let has_hwasan = util::HWASAN_SUPPORTED_TARGETS.contains(&&*config.target); iter_header(testfile, None, rdr, &mut |ln| { // we should check if any only- exists and if it exists @@ -101,6 +102,10 @@ impl EarlyProps { props.ignore = true; } + if !has_hwasan && config.parse_name_directive(ln, "needs-sanitizer-hwaddress") { + props.ignore = true; + } + if config.target == "wasm32-unknown-unknown" && config.parse_check_run_results(ln) { props.ignore = true; } @@ -333,6 +338,8 @@ pub struct TestProps { pub assembly_output: Option, // If true, the test is expected to ICE pub should_ice: bool, + // If true, the stderr is expected to be different across bit-widths. + pub stderr_per_bitwidth: bool, } impl TestProps { @@ -372,6 +379,7 @@ impl TestProps { rustfix_only_machine_applicable: false, assembly_output: None, should_ice: false, + stderr_per_bitwidth: false, } } @@ -538,6 +546,10 @@ impl TestProps { if self.assembly_output.is_none() { self.assembly_output = config.parse_assembly_output(ln); } + + if !self.stderr_per_bitwidth { + self.stderr_per_bitwidth = config.parse_stderr_per_bitwidth(ln); + } }); } @@ -774,6 +786,10 @@ impl Config { self.parse_name_directive(line, "ignore-pass") } + fn parse_stderr_per_bitwidth(&self, line: &str) -> bool { + self.parse_name_directive(line, "stderr-per-bitwidth") + } + fn parse_assembly_output(&self, line: &str) -> Option { self.parse_name_value_directive(line, "assembly-output").map(|r| r.trim().to_string()) } diff --git a/src/tools/compiletest/src/main.rs b/src/tools/compiletest/src/main.rs index 688cf93003..1d4b5e1247 100644 --- a/src/tools/compiletest/src/main.rs +++ b/src/tools/compiletest/src/main.rs @@ -44,7 +44,7 @@ fn main() { } if !config.has_tidy && config.mode == Mode::Rustdoc { - eprintln!("warning: `tidy` is not installed; generated diffs will be harder to read"); + eprintln!("warning: `tidy` is not installed; diffs will not be generated"); } log_config(&config); @@ -126,6 +126,7 @@ pub fn parse_config(args: Vec) -> Config { .reqopt("", "llvm-components", "list of LLVM components built in", "LIST") .optopt("", "llvm-bin-dir", "Path to LLVM's `bin` directory", "PATH") .optopt("", "nodejs", "the name of nodejs", "PATH") + .optopt("", "npm", "the name of npm", "PATH") .optopt("", "remote-test-client", "path to the remote test client", "PATH") .optopt( "", @@ -194,11 +195,17 @@ pub fn parse_config(args: Vec) -> Config { let src_base = opt_path(matches, "src-base"); let run_ignored = matches.opt_present("ignored"); - let has_tidy = Command::new("tidy") - .arg("--version") - .stdout(Stdio::null()) - .status() - .map_or(false, |status| status.success()); + let mode = matches.opt_str("mode").unwrap().parse().expect("invalid mode"); + let has_tidy = if mode == Mode::Rustdoc { + Command::new("tidy") + .arg("--version") + .stdout(Stdio::null()) + .status() + .map_or(false, |status| status.success()) + } else { + // Avoid spawning an external command when we know tidy won't be used. + false + }; Config { bless: matches.opt_present("bless"), compile_lib_path: make_absolute(opt_path(matches, "compile-lib-path")), @@ -217,11 +224,11 @@ pub fn parse_config(args: Vec) -> 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, suite: matches.opt_str("suite").unwrap(), debugger: None, run_ignored, - filter: matches.free.first().cloned(), + filters: matches.free.clone(), filter_exact: matches.opt_present("exact"), force_pass_mode: matches.opt_str("pass").map(|mode| { mode.parse::() @@ -264,6 +271,7 @@ pub fn parse_config(args: Vec) -> Config { linker: matches.opt_str("linker"), llvm_components: matches.opt_str("llvm-components").unwrap(), nodejs: matches.opt_str("nodejs"), + npm: matches.opt_str("npm"), } } @@ -280,7 +288,7 @@ 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))); + logv(c, format!("filters: {:?}", config.filters)); logv(c, format!("filter_exact: {}", config.filter_exact)); logv( c, @@ -465,7 +473,7 @@ fn configure_lldb(config: &Config) -> Option { pub fn test_opts(config: &Config) -> test::TestOpts { test::TestOpts { exclude_should_panic: false, - filter: config.filter.clone(), + filters: config.filters.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 }, diff --git a/src/tools/compiletest/src/runtest.rs b/src/tools/compiletest/src/runtest.rs index 52aed57fc7..7aa3d4ab09 100644 --- a/src/tools/compiletest/src/runtest.rs +++ b/src/tools/compiletest/src/runtest.rs @@ -13,6 +13,7 @@ use crate::header::TestProps; use crate::json; use crate::util::get_pointer_width; use crate::util::{logv, PathBufExt}; +use crate::ColorConfig; use regex::{Captures, Regex}; use rustfix::{apply_suggestions, get_suggestions_from_json, Filter}; @@ -1585,7 +1586,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 not passed"); let mut rustdoc = Command::new(rustdoc_path); rustdoc @@ -1957,8 +1958,9 @@ impl<'test> TestCx<'test> { } MirOpt => { rustc.args(&[ + "-Copt-level=1", "-Zdump-mir=all", - "-Zmir-opt-level=3", + "-Zmir-opt-level=4", "-Zvalidate-mir", "-Zdump-mir-exclude-pass-number", ]); @@ -2067,6 +2069,8 @@ impl<'test> TestCx<'test> { f = f.with_extra_extension("js"); } else if self.config.target.contains("wasm32") { f = f.with_extra_extension("wasm"); + } else if self.config.target.contains("spirv") { + f = f.with_extra_extension("spv"); } else if !env::consts::EXE_SUFFIX.is_empty() { f = f.with_extra_extension(env::consts::EXE_SUFFIX); } @@ -2363,6 +2367,9 @@ impl<'test> TestCx<'test> { } fn compare_to_default_rustdoc(&mut self, out_dir: &Path) { + if !self.config.has_tidy { + return; + } println!("info: generating a diff against nightly rustdoc"); let suffix = @@ -2424,10 +2431,8 @@ impl<'test> TestCx<'test> { } } }; - if self.config.has_tidy { - tidy_dir(out_dir); - tidy_dir(&compare_dir); - } + tidy_dir(out_dir); + tidy_dir(&compare_dir); let pager = { let output = Command::new("git").args(&["config", "--get", "core.pager"]).output().ok(); @@ -2439,12 +2444,43 @@ impl<'test> TestCx<'test> { } }) }; - let mut diff = Command::new("diff"); - // diff recursively, showing context, and excluding .css files - diff.args(&["-u", "-r", "-x", "*.css"]).args(&[&compare_dir, out_dir]); - let output = if let Some(pager) = pager { - let diff_pid = diff.stdout(Stdio::piped()).spawn().expect("failed to run `diff`"); + let diff_filename = format!("build/tmp/rustdoc-compare-{}.diff", std::process::id()); + + { + let mut diff_output = File::create(&diff_filename).unwrap(); + for entry in walkdir::WalkDir::new(out_dir) { + let entry = entry.expect("failed to read file"); + let extension = entry.path().extension().and_then(|p| p.to_str()); + if entry.file_type().is_file() + && (extension == Some("html".into()) || extension == Some("js".into())) + { + let expected_path = + compare_dir.join(entry.path().strip_prefix(&out_dir).unwrap()); + let expected = + if let Ok(s) = std::fs::read(&expected_path) { s } else { continue }; + let actual_path = entry.path(); + let actual = std::fs::read(&actual_path).unwrap(); + diff_output + .write_all(&unified_diff::diff( + &expected, + &expected_path.to_string_lossy(), + &actual, + &actual_path.to_string_lossy(), + 3, + )) + .unwrap(); + } + } + } + + match self.config.color { + ColorConfig::AlwaysColor => colored::control::set_override(true), + ColorConfig::NeverColor => colored::control::set_override(false), + _ => {} + } + + if let Some(pager) = pager { let pager = pager.trim(); if self.config.verbose { eprintln!("using pager {}", pager); @@ -2452,24 +2488,48 @@ impl<'test> TestCx<'test> { let output = Command::new(pager) // disable paging; we want this to be non-interactive .env("PAGER", "") - .stdin(diff_pid.stdout.unwrap()) + .stdin(File::open(&diff_filename).unwrap()) // Capture output and print it explicitly so it will in turn be // captured by libtest. .output() .unwrap(); assert!(output.status.success()); - output + println!("{}", String::from_utf8_lossy(&output.stdout)); + eprintln!("{}", String::from_utf8_lossy(&output.stderr)); } else { - eprintln!("warning: no pager configured, falling back to `diff --color`"); + use colored::Colorize; + eprintln!("warning: no pager configured, falling back to unified diff"); eprintln!( "help: try configuring a git pager (e.g. `delta`) with `git config --global core.pager delta`" ); - let output = diff.arg("--color").output().unwrap(); - assert!(output.status.success() || output.status.code() == Some(1)); - output + let mut out = io::stdout(); + let mut diff = BufReader::new(File::open(&diff_filename).unwrap()); + let mut line = Vec::new(); + loop { + line.truncate(0); + match diff.read_until(b'\n', &mut line) { + Ok(0) => break, + Ok(_) => {} + Err(e) => eprintln!("ERROR: {:?}", e), + } + match String::from_utf8(line.clone()) { + Ok(line) => { + if line.starts_with("+") { + write!(&mut out, "{}", line.green()).unwrap(); + } else if line.starts_with("-") { + write!(&mut out, "{}", line.red()).unwrap(); + } else if line.starts_with("@") { + write!(&mut out, "{}", line.blue()).unwrap(); + } else { + out.write_all(line.as_bytes()).unwrap(); + } + } + Err(_) => { + write!(&mut out, "{}", String::from_utf8_lossy(&line).reversed()).unwrap(); + } + } + } }; - println!("{}", String::from_utf8_lossy(&output.stdout)); - eprintln!("{}", String::from_utf8_lossy(&output.stderr)); } fn run_rustdoc_json_test(&self) { @@ -3124,7 +3184,12 @@ impl<'test> TestCx<'test> { errors += self.compare_output("stdout", &normalized_stdout, &expected_stdout); } if !self.props.dont_check_compiler_stderr { - errors += self.compare_output("stderr", &normalized_stderr, &expected_stderr); + let kind = if self.props.stderr_per_bitwidth { + format!("{}bit.stderr", get_pointer_width(&self.config.target)) + } else { + String::from("stderr") + }; + errors += self.compare_output(&kind, &normalized_stderr, &expected_stderr); } } TestOutput::Run => { @@ -3697,6 +3762,13 @@ impl<'test> TestCx<'test> { let mut files = vec![output_file]; if self.config.bless { + // Delete non-revision .stderr/.stdout file if revisions are used. + // Without this, we'd just generate the new files and leave the old files around. + if self.revision.is_some() { + let old = + expected_output_path(self.testpaths, None, &self.config.compare_mode, kind); + self.delete_file(&old); + } files.push(expected_output_path( self.testpaths, self.revision, diff --git a/src/tools/compiletest/src/util.rs b/src/tools/compiletest/src/util.rs index 292850bd9e..b302953708 100644 --- a/src/tools/compiletest/src/util.rs +++ b/src/tools/compiletest/src/util.rs @@ -110,6 +110,9 @@ pub const TSAN_SUPPORTED_TARGETS: &[&str] = &[ "x86_64-unknown-linux-gnu", ]; +pub const HWASAN_SUPPORTED_TARGETS: &[&str] = + &["aarch64-linux-android", "aarch64-unknown-linux-gnu"]; + const BIG_ENDIAN: &[&str] = &[ "aarch64_be", "armebv7r", diff --git a/src/tools/expand-yaml-anchors/src/main.rs b/src/tools/expand-yaml-anchors/src/main.rs index f8cf18a930..8992d165d5 100644 --- a/src/tools/expand-yaml-anchors/src/main.rs +++ b/src/tools/expand-yaml-anchors/src/main.rs @@ -76,7 +76,11 @@ impl App { self.path(&path), self.path(&dest_path) ), - Mode::Check => format!("{} is not up to date", self.path(&dest_path)), + Mode::Check => format!( + "{} is not up to date; please run \ + `x.py run src/tools/expand-yaml-anchors`.", + self.path(&dest_path) + ), })?; } } diff --git a/src/tools/jsondocck/src/cache.rs b/src/tools/jsondocck/src/cache.rs index b742f0eb3e..8a6a911321 100644 --- a/src/tools/jsondocck/src/cache.rs +++ b/src/tools/jsondocck/src/cache.rs @@ -9,6 +9,7 @@ pub struct Cache { root: PathBuf, files: HashMap, values: HashMap, + pub variables: HashMap, last_path: Option, } @@ -19,6 +20,7 @@ impl Cache { root: Path::new(doc_dir).to_owned(), files: HashMap::new(), values: HashMap::new(), + variables: HashMap::new(), last_path: None, } } diff --git a/src/tools/jsondocck/src/main.rs b/src/tools/jsondocck/src/main.rs index 6ec292aba6..bcb3f6922e 100644 --- a/src/tools/jsondocck/src/main.rs +++ b/src/tools/jsondocck/src/main.rs @@ -2,6 +2,7 @@ use jsonpath_lib::select; use lazy_static::lazy_static; use regex::{Regex, RegexBuilder}; use serde_json::Value; +use std::borrow::Cow; use std::{env, fmt, fs}; mod cache; @@ -48,13 +49,16 @@ pub struct Command { pub enum CommandKind { Has, Count, + Is, + Set, } impl CommandKind { fn validate(&self, args: &[String], command_num: usize, lineno: usize) -> bool { let count = match self { CommandKind::Has => (1..=3).contains(&args.len()), - CommandKind::Count => 3 == args.len(), + CommandKind::Count | CommandKind::Is => 3 == args.len(), + CommandKind::Set => 4 == args.len(), }; if !count { @@ -83,6 +87,8 @@ impl fmt::Display for CommandKind { let text = match self { CommandKind::Has => "has", CommandKind::Count => "count", + CommandKind::Is => "is", + CommandKind::Set => "set", }; write!(f, "{}", text) } @@ -127,6 +133,8 @@ fn get_commands(template: &str) -> Result, ()> { let cmd = match cmd { "has" => CommandKind::Has, "count" => CommandKind::Count, + "is" => CommandKind::Is, + "set" => CommandKind::Set, _ => { print_err(&format!("Unrecognized command name `@{}`", cmd), lineno); errors = true; @@ -180,6 +188,7 @@ fn get_commands(template: &str) -> Result, ()> { /// Performs the actual work of ensuring a command passes. Generally assumes the command /// is syntactically valid. fn check_command(command: Command, cache: &mut Cache) -> Result<(), CkError> { + // FIXME: Be more granular about why, (e.g. syntax error, count not equal) let result = match command.kind { CommandKind::Has => { match command.args.len() { @@ -188,22 +197,28 @@ fn check_command(command: Command, cache: &mut Cache) -> Result<(), CkError> { // @has = check path exists 2 => { let val = cache.get_value(&command.args[0])?; - - match select(&val, &command.args[1]) { - Ok(results) => !results.is_empty(), - Err(_) => false, - } + let results = select(&val, &command.args[1]).unwrap(); + !results.is_empty() } // @has = check *any* item matched by path equals value 3 => { let val = cache.get_value(&command.args[0])?; - match select(&val, &command.args[1]) { - Ok(results) => { - let pat: Value = serde_json::from_str(&command.args[2]).unwrap(); - - !results.is_empty() && results.into_iter().any(|val| *val == pat) - } - Err(_) => false, + let results = select(&val, &command.args[1]).unwrap(); + let pat = string_to_value(&command.args[2], cache); + let has = results.contains(&pat.as_ref()); + // Give better error for when @has check fails + if !command.negated && !has { + return Err(CkError::FailedCheck( + format!( + "{} matched to {:?} but didn't have {:?}", + &command.args[1], + results, + pat.as_ref() + ), + command, + )); + } else { + has } } _ => unreachable!(), @@ -215,9 +230,43 @@ fn check_command(command: Command, cache: &mut Cache) -> Result<(), CkError> { let expected: usize = command.args[2].parse().unwrap(); let val = cache.get_value(&command.args[0])?; - match select(&val, &command.args[1]) { - Ok(results) => results.len() == expected, - Err(_) => false, + let results = select(&val, &command.args[1]).unwrap(); + results.len() == expected + } + CommandKind::Is => { + // @has = check *exactly one* item matched by path, and it equals value + assert_eq!(command.args.len(), 3); + let val = cache.get_value(&command.args[0])?; + let results = select(&val, &command.args[1]).unwrap(); + let pat = string_to_value(&command.args[2], cache); + results.len() == 1 && results[0] == pat.as_ref() + } + CommandKind::Set => { + // @set = + assert_eq!(command.args.len(), 4); + assert_eq!(command.args[1], "=", "Expected an `=`"); + let val = cache.get_value(&command.args[2])?; + let results = select(&val, &command.args[3]).unwrap(); + assert_eq!( + results.len(), + 1, + "Didn't get 1 result for `{}`: got {:?}", + command.args[3], + results + ); + match results.len() { + 0 => false, + 1 => { + let r = cache.variables.insert(command.args[0].clone(), results[0].clone()); + assert!(r.is_none(), "Name collision: {} is duplicated", command.args[0]); + true + } + _ => { + panic!( + "Got multiple results in `@set` for `{}`: {:?}", + &command.args[3], results + ); + } } } }; @@ -247,3 +296,11 @@ fn check_command(command: Command, cache: &mut Cache) -> Result<(), CkError> { Ok(()) } } + +fn string_to_value<'a>(s: &str, cache: &'a Cache) -> Cow<'a, Value> { + if s.starts_with("$") { + Cow::Borrowed(&cache.variables[&s[1..]]) + } else { + Cow::Owned(serde_json::from_str(s).unwrap()) + } +} diff --git a/src/tools/linkchecker/main.rs b/src/tools/linkchecker/main.rs index 1ab3aead96..f6875e0036 100644 --- a/src/tools/linkchecker/main.rs +++ b/src/tools/linkchecker/main.rs @@ -14,7 +14,7 @@ //! A few exceptions are allowed as there's known bugs in rustdoc, but this //! should catch the majority of "broken link" cases. -#![feature(str_split_once)] +#![cfg_attr(bootstrap, feature(str_split_once))] use std::collections::hash_map::Entry; use std::collections::{HashMap, HashSet}; @@ -33,11 +33,6 @@ use crate::Redirect::*; // are cases where that does not work // [(generated_documentation_page, &[broken_links])] const LINKCHECK_EXCEPTIONS: &[(&str, &[&str])] = &[ - // These are methods on slice, and `Self` does not work on primitive impls - // in intra-doc links (primitive impls are weird) - // https://github.com/rust-lang/rust/issues/62834 is necessary to be - // able to link to slices - ("std/io/struct.IoSlice.html", &["#method.as_mut_ptr", "#method.sort_by_key"]), // These try to link to std::collections, but are defined in alloc // https://github.com/rust-lang/rust/issues/74481 ("std/collections/btree_map/struct.BTreeMap.html", &["#insert-and-complex-keys"]), diff --git a/src/tools/publish_toolstate.py b/src/tools/publish_toolstate.py index 0d4a755551..f97914b1e9 100755 --- a/src/tools/publish_toolstate.py +++ b/src/tools/publish_toolstate.py @@ -17,8 +17,14 @@ import collections import textwrap try: import urllib2 + from urllib2 import HTTPError except ImportError: import urllib.request as urllib2 + from urllib.error import HTTPError +try: + import typing +except ImportError: + pass # List of people to ping when the status of a tool or a book changed. # These should be collaborators of the rust-lang/rust repository (with at least @@ -63,20 +69,23 @@ REPOS = { } def load_json_from_response(resp): + # type: (typing.Any) -> typing.Any content = resp.read() if isinstance(content, bytes): - content = content.decode('utf-8') + content_str = content.decode('utf-8') else: print("Refusing to decode " + str(type(content)) + " to str") - return json.loads(content) + return json.loads(content_str) def validate_maintainers(repo, github_token): + # type: (str, str) -> None '''Ensure all maintainers are assignable on a GitHub repo''' next_link_re = re.compile(r'<([^>]+)>; rel="next"') # Load the list of assignable people in the GitHub repo - assignable = [] - url = 'https://api.github.com/repos/%s/collaborators?per_page=100' % repo + assignable = [] # type: typing.List[str] + url = 'https://api.github.com/repos/' \ + + '%s/collaborators?per_page=100' % repo # type: typing.Optional[str] while url is not None: response = urllib2.urlopen(urllib2.Request(url, headers={ 'Authorization': 'token ' + github_token, @@ -116,9 +125,10 @@ def validate_maintainers(repo, github_token): def read_current_status(current_commit, path): + # type: (str, str) -> typing.Mapping[str, typing.Any] '''Reads build status of `current_commit` from content of `history/*.tsv` ''' - with open(path, 'rU') as f: + with open(path, 'r') as f: for line in f: (commit, status) = line.split('\t', 1) if commit == current_commit: @@ -127,10 +137,12 @@ def read_current_status(current_commit, path): def gh_url(): + # type: () -> str return os.environ['TOOLSTATE_ISSUES_API_URL'] def maybe_delink(message): + # type: (str) -> str if os.environ.get('TOOLSTATE_SKIP_MENTIONS') is not None: return message.replace("@", "") return message @@ -143,8 +155,10 @@ def issue( relevant_pr_number, relevant_pr_user, labels, + github_token, ): - # Open an issue about the toolstate failure. + # type: (str, str, typing.Iterable[str], str, str, typing.List[str], str) -> None + '''Open an issue about the toolstate failure.''' if status == 'test-fail': status_description = 'has failing tests' else: @@ -168,7 +182,7 @@ def issue( print("Creating issue:\n{}".format(request)) response = urllib2.urlopen(urllib2.Request( gh_url(), - request, + request.encode(), { 'Authorization': 'token ' + github_token, 'Content-Type': 'application/json', @@ -183,8 +197,10 @@ def update_latest( relevant_pr_url, relevant_pr_user, pr_reviewer, - current_datetime + current_datetime, + github_token, ): + # type: (str, str, str, str, str, str, str) -> str '''Updates `_data/latest.json` to match build result of the given commit. ''' with open('_data/latest.json', 'r+') as f: @@ -243,13 +259,14 @@ def update_latest( if create_issue_for_status is not None: try: issue( - tool, create_issue_for_status, MAINTAINERS.get(tool, ''), - relevant_pr_number, relevant_pr_user, LABELS.get(tool, ''), + tool, create_issue_for_status, MAINTAINERS.get(tool, ()), + relevant_pr_number, relevant_pr_user, LABELS.get(tool, []), + github_token, ) - except urllib2.HTTPError as e: + except HTTPError as e: # network errors will simply end up not creating an issue, but that's better # than failing the entire build job - print("HTTPError when creating issue for status regression: {0}\n{1}" + print("HTTPError when creating issue for status regression: {0}\n{1!r}" .format(e, e.read())) except IOError as e: print("I/O error when creating issue for status regression: {0}".format(e)) @@ -318,7 +335,8 @@ try: relevant_pr_url, relevant_pr_user, pr_reviewer, - cur_datetime + cur_datetime, + github_token, ) if not message: print('') @@ -337,13 +355,13 @@ try: issue_url = gh_url() + '/{}/comments'.format(number) response = urllib2.urlopen(urllib2.Request( issue_url, - json.dumps({'body': maybe_delink(message)}), + json.dumps({'body': maybe_delink(message)}).encode(), { 'Authorization': 'token ' + github_token, 'Content-Type': 'application/json', } )) response.read() -except urllib2.HTTPError as e: - print("HTTPError: %s\n%s" % (e, e.read())) +except HTTPError as e: + print("HTTPError: %s\n%r" % (e, e.read())) raise diff --git a/src/tools/rustc-workspace-hack/Cargo.toml b/src/tools/rustc-workspace-hack/Cargo.toml index 1cde0e25ce..8da7db2dfd 100644 --- a/src/tools/rustc-workspace-hack/Cargo.toml +++ b/src/tools/rustc-workspace-hack/Cargo.toml @@ -71,8 +71,8 @@ proc-macro2 = { version = "1", features = ["default"] } quote = { version = "1", features = ["default"] } serde = { version = "1.0.82", features = ['derive'] } serde_json = { version = "1.0.31", features = ["raw_value", "unbounded_depth"] } -smallvec-0_6 = { package = "smallvec", version = "0.6", features = ['union', 'may_dangle'] } -smallvec = { version = "1.0", features = ['union', 'may_dangle'] } +smallvec-0_6 = { package = "smallvec", version = "0.6.14", features = ['union', 'may_dangle'] } +smallvec = { version = "1.6.1", features = ['union', 'may_dangle'] } syn = { version = "1", features = ['fold', 'full', 'extra-traits', 'visit', 'visit-mut'] } url = { version = "2.0", features = ['serde'] } diff --git a/src/tools/rustdoc-gui/tester.js b/src/tools/rustdoc-gui/tester.js new file mode 100644 index 0000000000..a67e245547 --- /dev/null +++ b/src/tools/rustdoc-gui/tester.js @@ -0,0 +1,89 @@ +// This package needs to be install: +// +// ``` +// npm install browser-ui-test +// ``` +const path = require('path'); +const {Options, runTest} = require('browser-ui-test'); + +function showHelp() { + console.log("rustdoc-js options:"); + console.log(" --doc-folder [PATH] : location of the generated doc folder"); + console.log(" --help : show this message then quit"); + console.log(" --test-file [PATH] : location of the JS test file"); +} + +function parseOptions(args) { + var opts = { + "doc_folder": "", + "test_file": "", + }; + var correspondances = { + "--doc-folder": "doc_folder", + "--test-file": "test_file", + }; + + for (var i = 0; i < args.length; ++i) { + if (args[i] === "--doc-folder" + || args[i] === "--test-file") { + i += 1; + if (i >= args.length) { + console.log("Missing argument after `" + args[i - 1] + "` option."); + return null; + } + opts[correspondances[args[i - 1]]] = args[i]; + } else if (args[i] === "--help") { + showHelp(); + process.exit(0); + } else { + console.log("Unknown option `" + args[i] + "`."); + console.log("Use `--help` to see the list of options"); + return null; + } + } + if (opts["test_file"].length < 1) { + console.log("Missing `--test-file` option."); + } else if (opts["doc_folder"].length < 1) { + console.log("Missing `--doc-folder` option."); + } else { + return opts; + } + return null; +} + +function checkFile(test_file, opts, loaded, index) { + const test_name = path.basename(test_file, ".js"); + + process.stdout.write('Checking "' + test_name + '" ... '); + return runChecks(test_file, loaded, index); +} + +function main(argv) { + var opts = parseOptions(argv.slice(2)); + if (opts === null) { + process.exit(1); + } + + const options = new Options(); + try { + // This is more convenient that setting fields one by one. + options.parseArguments([ + '--no-screenshot', + "--variable", "DOC_PATH", opts["doc_folder"], + ]); + } catch (error) { + console.error(`invalid argument: ${error}`); + process.exit(1); + } + + runTest(opts["test_file"], options).then(out => { + const [output, nb_failures] = out; + console.log(output); + process.exit(nb_failures); + }).catch(err => { + console.error(err); + process.exit(1); + }); +} + +main(process.argv); diff --git a/src/tools/tidy/Cargo.toml b/src/tools/tidy/Cargo.toml index ccdb4524d5..777d7be8fd 100644 --- a/src/tools/tidy/Cargo.toml +++ b/src/tools/tidy/Cargo.toml @@ -3,9 +3,14 @@ name = "tidy" version = "0.1.0" authors = ["Alex Crichton "] edition = "2018" +autobins = false [dependencies] cargo_metadata = "0.11" regex = "1" lazy_static = "1" walkdir = "2" + +[[bin]] +name = "rust-tidy" +path = "src/main.rs" diff --git a/src/tools/tidy/src/deps.rs b/src/tools/tidy/src/deps.rs index f127086724..96a0203863 100644 --- a/src/tools/tidy/src/deps.rs +++ b/src/tools/tidy/src/deps.rs @@ -85,6 +85,7 @@ const PERMITTED_DEPENDENCIES: &[&str] = &[ "crossbeam-epoch", "crossbeam-queue", "crossbeam-utils", + "cstr", "datafrog", "difference", "digest", @@ -122,6 +123,7 @@ const PERMITTED_DEPENDENCIES: &[&str] = &[ "measureme", "memchr", "memmap", + "memmap2", "memoffset", "miniz_oxide", "num_cpus", @@ -131,6 +133,8 @@ const PERMITTED_DEPENDENCIES: &[&str] = &[ "parking_lot", "parking_lot_core", "pathdiff", + "perf-event-open-sys", + "pin-project-lite", "pkg-config", "polonius-engine", "ppv-lite86", diff --git a/src/tools/tidy/src/lib.rs b/src/tools/tidy/src/lib.rs index 27972c4992..11d36751f6 100644 --- a/src/tools/tidy/src/lib.rs +++ b/src/tools/tidy/src/lib.rs @@ -3,7 +3,7 @@ //! This library contains the tidy lints and exposes it //! to be used by tools. -#![feature(str_split_once)] +#![cfg_attr(bootstrap, feature(str_split_once))] use std::fs::File; use std::io::Read; diff --git a/src/tools/tidy/src/style.rs b/src/tools/tidy/src/style.rs index 6697fbd1be..75c4334302 100644 --- a/src/tools/tidy/src/style.rs +++ b/src/tools/tidy/src/style.rs @@ -18,6 +18,8 @@ use std::path::Path; +/// Error code markdown is restricted to 80 columns because they can be +/// displayed on the console with --example. const ERROR_CODE_COLS: usize = 80; const COLS: usize = 100; @@ -55,9 +57,9 @@ enum LIUState { /// Lines of this form are allowed to be overlength, because Markdown /// offers no way to split a line in the middle of a URL, and the lengths /// of URLs to external references are beyond our control. -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 { +fn line_is_url(is_error_code: bool, columns: usize, line: &str) -> bool { + // more basic check for markdown, to avoid complexity in implementing two state machines + if is_error_code { return line.starts_with('[') && line.contains("]:") && line.contains("http"); } @@ -93,8 +95,13 @@ fn line_is_url(columns: usize, line: &str) -> bool { /// Returns `true` if `line` is allowed to be longer than the normal limit. /// Currently there is only one exception, for long URLs, but more /// may be added in the future. -fn long_line_is_ok(max_columns: usize, line: &str) -> bool { - if line_is_url(max_columns, line) { +fn long_line_is_ok(extension: &str, is_error_code: bool, max_columns: usize, line: &str) -> bool { + if extension != "md" || is_error_code { + if line_is_url(is_error_code, max_columns, line) { + return true; + } + } else if extension == "md" { + // non-error code markdown is allowed to be any length return true; } @@ -158,8 +165,36 @@ pub fn is_in(full_path: &Path, parent_folder_to_find: &str, folder_to_find: &str } } +fn skip_markdown_path(path: &Path) -> bool { + // These aren't ready for tidy. + const SKIP_MD: &[&str] = &[ + "src/doc/edition-guide", + "src/doc/embedded-book", + "src/doc/nomicon", + "src/doc/reference", + "src/doc/rust-by-example", + "src/doc/rustc-dev-guide", + ]; + SKIP_MD.iter().any(|p| path.ends_with(p)) +} + +fn is_unexplained_ignore(extension: &str, line: &str) -> bool { + if !line.ends_with("```ignore") && !line.ends_with("```rust,ignore") { + return false; + } + if extension == "md" && line.trim().starts_with("//") { + // Markdown examples may include doc comments with ignore inside a + // code block. + return false; + } + true +} + pub fn check(path: &Path, bad: &mut bool) { - super::walk(path, &mut super::filter_dirs, &mut |entry, contents| { + fn skip(path: &Path) -> bool { + super::filter_dirs(path) || skip_markdown_path(path) + } + super::walk(path, &mut skip, &mut |entry, contents| { let file = entry.path(); let filename = file.file_name().unwrap().to_string_lossy(); let extensions = [".rs", ".py", ".js", ".sh", ".c", ".cpp", ".h", ".md", ".css"]; @@ -176,13 +211,6 @@ pub fn check(path: &Path, bad: &mut bool) { 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; - } if is_style_file && !is_in(file, "src", "librustdoc") { // We only check CSS files in rustdoc. return; @@ -192,11 +220,10 @@ pub fn check(path: &Path, bad: &mut bool) { tidy_error!(bad, "{}: empty file", file.display()); } - let max_columns = if filename == "error_codes.rs" || filename.ends_with(".md") { - ERROR_CODE_COLS - } else { - COLS - }; + let extension = file.extension().unwrap().to_string_lossy(); + let is_error_code = extension == "md" && is_in(file, "src", "error_codes"); + + let max_columns = if is_error_code { ERROR_CODE_COLS } else { COLS }; let can_contain = contents.contains("// ignore-tidy-") || contents.contains("# ignore-tidy-") @@ -227,7 +254,7 @@ pub fn check(path: &Path, bad: &mut bool) { }; if !under_rustfmt && line.chars().count() > max_columns - && !long_line_is_ok(max_columns, line) + && !long_line_is_ok(&extension, is_error_code, max_columns, line) { suppressible_tidy_err!( err, @@ -262,7 +289,7 @@ pub fn check(path: &Path, bad: &mut bool) { suppressible_tidy_err!(err, skip_undocumented_unsafe, "undocumented unsafe"); } } - if line.contains("// SAFETY:") || line.contains("// Safety:") { + if line.contains("// SAFETY:") { last_safety_comment = true; } else if line.trim().starts_with("//") || line.trim().is_empty() { // keep previous value @@ -280,7 +307,7 @@ pub fn check(path: &Path, bad: &mut bool) { "copyright notices attributed to the Rust Project Developers are deprecated" ); } - if line.ends_with("```ignore") || line.ends_with("```rust,ignore") { + if is_unexplained_ignore(&extension, line) { err(UNEXPLAINED_IGNORE_DOCTEST_INFO); } if filename.ends_with(".cpp") && line.contains("llvm_unreachable") { diff --git a/src/tools/tidy/src/ui_tests.rs b/src/tools/tidy/src/ui_tests.rs index 74ed236675..3374a8c9b7 100644 --- a/src/tools/tidy/src/ui_tests.rs +++ b/src/tools/tidy/src/ui_tests.rs @@ -7,8 +7,8 @@ use std::path::Path; const ENTRY_LIMIT: usize = 1000; // FIXME: The following limits should be reduced eventually. -const ROOT_ENTRY_LIMIT: usize = 1459; -const ISSUES_ENTRY_LIMIT: usize = 2615; +const ROOT_ENTRY_LIMIT: usize = 1408; +const ISSUES_ENTRY_LIMIT: usize = 2565; fn check_entries(path: &Path, bad: &mut bool) { let dirs = walkdir::WalkDir::new(&path.join("test/ui")) diff --git a/src/version b/src/version index ba0a719118..a63cb35e6f 100644 --- a/src/version +++ b/src/version @@ -1 +1 @@ -1.51.0 +1.52.0 diff --git a/vendor/adler/.cargo-checksum.json b/vendor/adler/.cargo-checksum.json index d06d0a52de..3ccbf01891 100644 --- a/vendor/adler/.cargo-checksum.json +++ b/vendor/adler/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"042ed3158af7000c88a6617d775f11456bd30f6c7c8b5b586978faa1e11b1e24","Cargo.toml":"107d13689eecfa82a8b5ae35bf835b9d2775337226630e4bdb35f22d0dd52e18","LICENSE-0BSD":"861399f8c21c042b110517e76dc6b63a2b334276c8cf17412fc3c8908ca8dc17","LICENSE-APACHE":"8ada45cd9f843acf64e4722ae262c622a2b3b3007c7310ef36ac1061a30f6adb","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"fa83fd5ee10b61827de382e496bf66296a526e3d2c3b2aa5ad672aa15e8d2d7f","RELEASE_PROCESS.md":"a86cd10fc70f167f8d00e9e4ce0c6b4ebdfa1865058390dffd1e0ad4d3e68d9d","benches/bench.rs":"c07ce370e3680c602e415f8d1ec4e543ea2163ab22a09b6b82d93e8a30adca82","src/algo.rs":"b664b131f724a809591394a10b9023f40ab5963e32a83fa3163c2668e59c8b66","src/lib.rs":"67f3ca5b6333e22745b178b70f472514162cea2890344724f0f66995fcf19806"},"package":"ee2a4ec343196209d6594e19543ae87a39f96d5534d7174822a3ad825dd6ed7e"} \ No newline at end of file +{"files":{"CHANGELOG.md":"737088e45fdf27fe2cfedce163332d8ce08c58fd86ca287de2de34c0fbaf63e7","Cargo.toml":"f410869f0f1a5697f65a8a77be03da7aeecc0be26e7cf3a1feb1acaa4f518770","LICENSE-0BSD":"861399f8c21c042b110517e76dc6b63a2b334276c8cf17412fc3c8908ca8dc17","LICENSE-APACHE":"8ada45cd9f843acf64e4722ae262c622a2b3b3007c7310ef36ac1061a30f6adb","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"308c50cdb42b9573743068158339570b45ca3f895015ca3b87ba983edb0a21e6","RELEASE_PROCESS.md":"a86cd10fc70f167f8d00e9e4ce0c6b4ebdfa1865058390dffd1e0ad4d3e68d9d","benches/bench.rs":"c07ce370e3680c602e415f8d1ec4e543ea2163ab22a09b6b82d93e8a30adca82","src/algo.rs":"b664b131f724a809591394a10b9023f40ab5963e32a83fa3163c2668e59c8b66","src/lib.rs":"b55ba9c629b30360d08168b2ca0c96275432856a539737a105a6d6ae6bf7e88f"},"package":"f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe"} \ No newline at end of file diff --git a/vendor/adler/CHANGELOG.md b/vendor/adler/CHANGELOG.md index f055938442..87994376e5 100644 --- a/vendor/adler/CHANGELOG.md +++ b/vendor/adler/CHANGELOG.md @@ -4,6 +4,35 @@ No changes. +## [1.0.2 - 2021-02-26](https://github.com/jonas-schievink/adler/releases/tag/v1.0.2) + +- Fix doctest on big-endian systems ([#9]). + +[#9]: https://github.com/jonas-schievink/adler/pull/9 + +## [1.0.1 - 2020-11-08](https://github.com/jonas-schievink/adler/releases/tag/v1.0.1) + +### Fixes + +- Fix documentation on docs.rs. + +## [1.0.0 - 2020-11-08](https://github.com/jonas-schievink/adler/releases/tag/v1.0.0) + +### Fixes + +- Fix `cargo test --no-default-features` ([#5]). + +### Improvements + +- Extended and clarified documentation. +- Added more rustdoc examples. +- Extended CI to test the crate with `--no-default-features`. + +### Breaking Changes + +- `adler32_reader` now takes its generic argument by value instead of as a `&mut`. +- Renamed `adler32_reader` to `adler32`. + ## [0.2.3 - 2020-07-11](https://github.com/jonas-schievink/adler/releases/tag/v0.2.3) - Process 4 Bytes at a time, improving performance by up to 50% ([#2]). @@ -31,3 +60,4 @@ Initial release. [#2]: https://github.com/jonas-schievink/adler/pull/2 +[#5]: https://github.com/jonas-schievink/adler/pull/5 diff --git a/vendor/adler/Cargo.toml b/vendor/adler/Cargo.toml index dd2366c821..1dacd2c70f 100644 --- a/vendor/adler/Cargo.toml +++ b/vendor/adler/Cargo.toml @@ -12,17 +12,17 @@ [package] name = "adler" -version = "0.2.3" +version = "1.0.2" authors = ["Jonas Schievink "] description = "A simple clean-room implementation of the Adler-32 checksum" documentation = "https://docs.rs/adler/" readme = "README.md" -keywords = ["checksum", "integrity", "hash", "adler32"] +keywords = ["checksum", "integrity", "hash", "adler32", "zlib"] categories = ["algorithms"] license = "0BSD OR MIT OR Apache-2.0" repository = "https://github.com/jonas-schievink/adler.git" [package.metadata.docs.rs] -rustdoc-args = ["--cfg docsrs"] +rustdoc-args = ["--cfg=docsrs"] [package.metadata.release] no-dev-version = true @@ -62,8 +62,3 @@ version = "0.3.2" default = ["std"] rustc-dep-of-std = ["core", "compiler_builtins"] std = [] -[badges.maintenance] -status = "actively-developed" - -[badges.travis-ci] -repository = "jonas-schievink/adler" diff --git a/vendor/adler/README.md b/vendor/adler/README.md index 0254db71b4..ba140d52a3 100644 --- a/vendor/adler/README.md +++ b/vendor/adler/README.md @@ -5,7 +5,7 @@ ![CI](https://github.com/jonas-schievink/adler/workflows/CI/badge.svg) This crate provides a simple implementation of the Adler-32 checksum, used in -zlib, rsync, and other software. +the zlib compression format. Please refer to the [changelog](CHANGELOG.md) to see what changed in the last releases. @@ -14,6 +14,7 @@ releases. - Permissively licensed (0BSD) clean-room implementation. - Zero dependencies. +- Zero `unsafe`. - Decent performance (3-4 GB/s). - Supports `#![no_std]` (with `default-features = false`). @@ -23,7 +24,7 @@ Add an entry to your `Cargo.toml`: ```toml [dependencies] -adler = "0.2.3" +adler = "1.0.2" ``` Check the [API Documentation](https://docs.rs/adler/) for how to use the diff --git a/vendor/adler/src/lib.rs b/vendor/adler/src/lib.rs index ac29ea23fb..c7aa3805ec 100644 --- a/vendor/adler/src/lib.rs +++ b/vendor/adler/src/lib.rs @@ -4,10 +4,11 @@ //! //! - Permissively licensed (0BSD) clean-room implementation. //! - Zero dependencies. +//! - Zero `unsafe`. //! - Decent performance (3-4 GB/s). //! - `#![no_std]` support (with `default-features = false`). -#![doc(html_root_url = "https://docs.rs/adler/0.2.3")] +#![doc(html_root_url = "https://docs.rs/adler/1.0.2")] // Deny a few warnings in doctests, since rustdoc `allow`s many warnings by default #![doc(test(attr(deny(unused_imports, unused_must_use))))] #![cfg_attr(docsrs, feature(doc_cfg))] @@ -33,8 +34,51 @@ use std::io::{self, BufRead}; /// /// This type also implements `Hasher`, which makes it easy to calculate Adler-32 checksums of any /// type that implements or derives `Hash`. This also allows using Adler-32 in a `HashMap`, although -/// that is not recommended (while every checksum is a hash, they are not necessarily good at being -/// one). +/// that is not recommended (while every checksum is a hash function, they are not necessarily a +/// good one). +/// +/// # Examples +/// +/// Basic, piecewise checksum calculation: +/// +/// ``` +/// use adler::Adler32; +/// +/// let mut adler = Adler32::new(); +/// +/// adler.write_slice(&[0, 1, 2]); +/// adler.write_slice(&[3, 4, 5]); +/// +/// assert_eq!(adler.checksum(), 0x00290010); +/// ``` +/// +/// Using `Hash` to process structures: +/// +/// ``` +/// use std::hash::Hash; +/// use adler::Adler32; +/// +/// #[derive(Hash)] +/// struct Data { +/// byte: u8, +/// word: u16, +/// big: u64, +/// } +/// +/// let mut adler = Adler32::new(); +/// +/// let data = Data { byte: 0x1F, word: 0xABCD, big: !0 }; +/// data.hash(&mut adler); +/// +/// // hash value depends on architecture endianness +/// if cfg!(target_endian = "little") { +/// assert_eq!(adler.checksum(), 0x33410990); +/// } +/// if cfg!(target_endian = "big") { +/// assert_eq!(adler.checksum(), 0x331F0990); +/// } +/// +/// ``` /// /// [`new`]: #method.new /// [`from_checksum`]: #method.from_checksum @@ -119,6 +163,10 @@ impl Hasher for Adler32 { } /// Calculates the Adler-32 checksum of a byte slice. +/// +/// This is a convenience function around the [`Adler32`] type. +/// +/// [`Adler32`]: struct.Adler32.html pub fn adler32_slice(data: &[u8]) -> u32 { let mut h = Adler32::new(); h.write_slice(data); @@ -127,12 +175,35 @@ pub fn adler32_slice(data: &[u8]) -> u32 { /// Calculates the Adler-32 checksum of a `BufRead`'s contents. /// -/// The passed `BufRead` implementor will be read until it reaches EOF. +/// The passed `BufRead` implementor will be read until it reaches EOF (or until it reports an +/// error). +/// +/// If you only have a `Read` implementor, you can wrap it in `std::io::BufReader` before calling +/// this function. +/// +/// # Errors +/// +/// Any error returned by the reader are bubbled up by this function. +/// +/// # Examples +/// +/// ```no_run +/// # fn run() -> Result<(), Box> { +/// use adler::adler32; +/// +/// use std::fs::File; +/// use std::io::BufReader; +/// +/// let file = File::open("input.txt")?; +/// let mut file = BufReader::new(file); /// -/// If you only have a `Read` implementor, wrap it in `std::io::BufReader`. +/// adler32(&mut file)?; +/// # Ok(()) } +/// # fn main() { run().unwrap() } +/// ``` #[cfg(feature = "std")] #[cfg_attr(docsrs, doc(cfg(feature = "std")))] -pub fn adler32_reader(reader: &mut R) -> io::Result { +pub fn adler32(mut reader: R) -> io::Result { let mut h = Adler32::new(); loop { let len = { @@ -151,7 +222,6 @@ pub fn adler32_reader(reader: &mut R) -> io::Result { #[cfg(test)] mod tests { use super::*; - use std::io::BufReader; #[test] fn zeroes() { @@ -198,12 +268,14 @@ mod tests { assert_eq!(adler.checksum(), 0x8e88ef11); // from above } + #[cfg(feature = "std")] #[test] fn bufread() { + use std::io::BufReader; fn test(data: &[u8], checksum: u32) { // `BufReader` uses an 8 KB buffer, so this will test buffer refilling. let mut buf = BufReader::new(data); - let real_sum = adler32_reader(&mut buf).unwrap(); + let real_sum = adler32(&mut buf).unwrap(); assert_eq!(checksum, real_sum); } diff --git a/vendor/byteorder/.cargo-checksum.json b/vendor/byteorder/.cargo-checksum.json index a9af446f33..434cc1a16f 100644 --- a/vendor/byteorder/.cargo-checksum.json +++ b/vendor/byteorder/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"3a745d94ee9dce0d9dc638c02078cd5001d3d9d12d58b4f220c0101e32cfc16a","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"d2f1cac03d8498dc737aa99b2875395f36299d8b0334d860b35440e7a8dd8f55","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"248904d726eb6fc033eae4487f8509cdcf1333f9114d951267e98eb68397791d","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","benches/bench.rs":"a80bf3cd446c9b6c0cca3865c4de047bdf4644b74cdf696822f8ff87adfa1fca","rustfmt.toml":"1ca600239a27401c4a43f363cf3f38183a212affc1f31bff3ae93234bbaec228","src/io.rs":"006031413986e1f7af0763516af79cf3ef1861f59af8439403e1282eb8f05bfa","src/lib.rs":"d4ccf1e65e40fc388d7bb9702af5618121559f0348742e6465ee1e2681a30e24"},"package":"ae44d1a3d5a19df61dd0c8beb138458ac2a53a7ac09eba97d55592540004306b"} \ No newline at end of file +{"files":{"CHANGELOG.md":"3a745d94ee9dce0d9dc638c02078cd5001d3d9d12d58b4f220c0101e32cfc16a","COPYING":"01c266bced4a434da0051174d6bee16a4c82cf634e2679b6155d40d75012390f","Cargo.toml":"8585455e5a0e638cf5d489a21e286e93680f835cb8a13595918b5eb7c8c7f212","LICENSE-MIT":"0f96a83840e146e43c0ec96a22ec1f392e0680e6c1226e6f3ba87e0740af850f","README.md":"9d57556868344534de2489317e3c6bb611348ecd44438dcb982bd8d2a55a5a1b","UNLICENSE":"7e12e5df4bae12cb21581ba157ced20e1986a0508dd10d0e8a4ab9a4cf94e85c","benches/bench.rs":"a80bf3cd446c9b6c0cca3865c4de047bdf4644b74cdf696822f8ff87adfa1fca","rustfmt.toml":"1ca600239a27401c4a43f363cf3f38183a212affc1f31bff3ae93234bbaec228","src/io.rs":"9612530634d0e7ce9887a23836b58c0d972c1f45b05d9ada8355961567075627","src/lib.rs":"813ce6a8beafee3fd4e63325d783108aa02e8c57e412bc97580191d84082fbc9"},"package":"14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610"} \ No newline at end of file diff --git a/vendor/byteorder/Cargo.toml b/vendor/byteorder/Cargo.toml index ff60b60bf2..c71f90ba9c 100644 --- a/vendor/byteorder/Cargo.toml +++ b/vendor/byteorder/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "byteorder" -version = "1.4.2" +version = "1.4.3" authors = ["Andrew Gallant "] exclude = ["/ci/*"] description = "Library for reading/writing numbers in big-endian and little-endian." diff --git a/vendor/byteorder/README.md b/vendor/byteorder/README.md index 8b2ecc4265..d8461c58f7 100644 --- a/vendor/byteorder/README.md +++ b/vendor/byteorder/README.md @@ -4,9 +4,9 @@ This crate provides convenience methods for encoding and decoding numbers in either big-endian or little-endian order. [![Build status](https://github.com/BurntSushi/byteorder/workflows/ci/badge.svg)](https://github.com/BurntSushi/byteorder/actions) -[![](http://meritbadge.herokuapp.com/byteorder)](https://crates.io/crates/byteorder) +[![](https://meritbadge.herokuapp.com/byteorder)](https://crates.io/crates/byteorder) -Dual-licensed under MIT or the [UNLICENSE](http://unlicense.org). +Dual-licensed under MIT or the [UNLICENSE](https://unlicense.org/). ### Documentation diff --git a/vendor/byteorder/src/io.rs b/vendor/byteorder/src/io.rs index ac41ff73e8..dfad2ca39e 100644 --- a/vendor/byteorder/src/io.rs +++ b/vendor/byteorder/src/io.rs @@ -1582,7 +1582,8 @@ impl WriteBytesExt for W {} /// representation. /// /// This function is wildly unsafe because it permits arbitrary modification of -/// the binary representation of any `Copy` type. Use with care. +/// the binary representation of any `Copy` type. Use with care. It's intended +/// to be called only where `T` is a numeric type. unsafe fn slice_to_u8_mut(slice: &mut [T]) -> &mut [u8] { use std::mem::size_of; diff --git a/vendor/byteorder/src/lib.rs b/vendor/byteorder/src/lib.rs index d56574deb2..cc37cca6ae 100644 --- a/vendor/byteorder/src/lib.rs +++ b/vendor/byteorder/src/lib.rs @@ -1557,9 +1557,7 @@ pub trait ByteOrder: /// LittleEndian::write_f32_into(&numbers_given, &mut bytes); /// /// let mut numbers_got = [0.0; 4]; - /// unsafe { - /// LittleEndian::read_f32_into(&bytes, &mut numbers_got); - /// } + /// LittleEndian::read_f32_into(&bytes, &mut numbers_got); /// assert_eq!(numbers_given, numbers_got); /// ``` fn write_f32_into(src: &[f32], dst: &mut [u8]) { @@ -1588,9 +1586,7 @@ pub trait ByteOrder: /// LittleEndian::write_f64_into(&numbers_given, &mut bytes); /// /// let mut numbers_got = [0.0; 4]; - /// unsafe { - /// LittleEndian::read_f64_into(&bytes, &mut numbers_got); - /// } + /// LittleEndian::read_f64_into(&bytes, &mut numbers_got); /// assert_eq!(numbers_given, numbers_got); /// ``` fn write_f64_into(src: &[f64], dst: &mut [u8]) { @@ -1696,7 +1692,7 @@ pub trait ByteOrder: #[inline] fn from_slice_i16(src: &mut [i16]) { let src = unsafe { - slice::from_raw_parts_mut(src.as_ptr() as *mut u16, src.len()) + slice::from_raw_parts_mut(src.as_mut_ptr() as *mut u16, src.len()) }; Self::from_slice_u16(src); } @@ -1721,7 +1717,7 @@ pub trait ByteOrder: #[inline] fn from_slice_i32(src: &mut [i32]) { let src = unsafe { - slice::from_raw_parts_mut(src.as_ptr() as *mut u32, src.len()) + slice::from_raw_parts_mut(src.as_mut_ptr() as *mut u32, src.len()) }; Self::from_slice_u32(src); } @@ -1746,7 +1742,7 @@ pub trait ByteOrder: #[inline] fn from_slice_i64(src: &mut [i64]) { let src = unsafe { - slice::from_raw_parts_mut(src.as_ptr() as *mut u64, src.len()) + slice::from_raw_parts_mut(src.as_mut_ptr() as *mut u64, src.len()) }; Self::from_slice_u64(src); } @@ -1771,7 +1767,7 @@ pub trait ByteOrder: #[inline] fn from_slice_i128(src: &mut [i128]) { let src = unsafe { - slice::from_raw_parts_mut(src.as_ptr() as *mut u128, src.len()) + slice::from_raw_parts_mut(src.as_mut_ptr() as *mut u128, src.len()) }; Self::from_slice_u128(src); } @@ -1899,7 +1895,13 @@ pub type NativeEndian = LittleEndian; #[cfg(target_endian = "big")] pub type NativeEndian = BigEndian; -macro_rules! write_num_bytes { +/// Copies $size bytes from a number $n to a &mut [u8] $dst. $ty represents the +/// numeric type of $n and $which must be either to_be or to_le, depending on +/// which endianness one wants to use when writing to $dst. +/// +/// This macro is only safe to call when $ty is a numeric type and $size == +/// size_of::<$ty>() and where $dst is a &mut [u8]. +macro_rules! unsafe_write_num_bytes { ($ty:ty, $size:expr, $n:expr, $dst:expr, $which:ident) => {{ assert!($size <= $dst.len()); unsafe { @@ -1910,7 +1912,13 @@ macro_rules! write_num_bytes { }}; } -macro_rules! read_slice { +/// Copies a &[u8] $src into a &mut [] $dst for the endianness given +/// by $which (must be either to_be or to_le). +/// +/// This macro is only safe to call when $src and $dst are &[u8] and &mut [u8], +/// respectively. The macro will panic if $src.len() != $size * $dst.len(), +/// where $size represents the size of the integers encoded in $src. +macro_rules! unsafe_read_slice { ($src:expr, $dst:expr, $size:expr, $which:ident) => {{ assert_eq!($src.len(), $size * $dst.len()); @@ -1927,10 +1935,16 @@ macro_rules! read_slice { }}; } -macro_rules! write_slice_native { - ($src:expr, $dst:expr, $ty:ty, $size:expr) => {{ - assert!($size == ::core::mem::size_of::<$ty>()); - assert_eq!($size * $src.len(), $dst.len()); +/// Copies a &[$ty] $src into a &mut [u8] $dst, where $ty must be a numeric +/// type. This panics if size_of::<$ty>() * $src.len() != $dst.len(). +/// +/// This macro is only safe to call when $src is a slice of numeric types and +/// $dst is a &mut [u8] and where $ty represents the type of the integers in +/// $src. +macro_rules! unsafe_write_slice_native { + ($src:expr, $dst:expr, $ty:ty) => {{ + let size = core::mem::size_of::<$ty>(); + assert_eq!(size * $src.len(), $dst.len()); unsafe { copy_nonoverlapping( @@ -2006,22 +2020,22 @@ impl ByteOrder for BigEndian { #[inline] fn write_u16(buf: &mut [u8], n: u16) { - write_num_bytes!(u16, 2, n, buf, to_be); + unsafe_write_num_bytes!(u16, 2, n, buf, to_be); } #[inline] fn write_u32(buf: &mut [u8], n: u32) { - write_num_bytes!(u32, 4, n, buf, to_be); + unsafe_write_num_bytes!(u32, 4, n, buf, to_be); } #[inline] fn write_u64(buf: &mut [u8], n: u64) { - write_num_bytes!(u64, 8, n, buf, to_be); + unsafe_write_num_bytes!(u64, 8, n, buf, to_be); } #[inline] fn write_u128(buf: &mut [u8], n: u128) { - write_num_bytes!(u128, 16, n, buf, to_be); + unsafe_write_num_bytes!(u128, 16, n, buf, to_be); } #[inline] @@ -2054,28 +2068,28 @@ impl ByteOrder for BigEndian { #[inline] fn read_u16_into(src: &[u8], dst: &mut [u16]) { - read_slice!(src, dst, 2, to_be); + unsafe_read_slice!(src, dst, 2, to_be); } #[inline] fn read_u32_into(src: &[u8], dst: &mut [u32]) { - read_slice!(src, dst, 4, to_be); + unsafe_read_slice!(src, dst, 4, to_be); } #[inline] fn read_u64_into(src: &[u8], dst: &mut [u64]) { - read_slice!(src, dst, 8, to_be); + unsafe_read_slice!(src, dst, 8, to_be); } #[inline] fn read_u128_into(src: &[u8], dst: &mut [u128]) { - read_slice!(src, dst, 16, to_be); + unsafe_read_slice!(src, dst, 16, to_be); } #[inline] fn write_u16_into(src: &[u16], dst: &mut [u8]) { if cfg!(target_endian = "big") { - write_slice_native!(src, dst, u16, 2); + unsafe_write_slice_native!(src, dst, u16); } else { write_slice!(src, dst, u16, 2, Self::write_u16); } @@ -2084,7 +2098,7 @@ impl ByteOrder for BigEndian { #[inline] fn write_u32_into(src: &[u32], dst: &mut [u8]) { if cfg!(target_endian = "big") { - write_slice_native!(src, dst, u32, 4); + unsafe_write_slice_native!(src, dst, u32); } else { write_slice!(src, dst, u32, 4, Self::write_u32); } @@ -2093,7 +2107,7 @@ impl ByteOrder for BigEndian { #[inline] fn write_u64_into(src: &[u64], dst: &mut [u8]) { if cfg!(target_endian = "big") { - write_slice_native!(src, dst, u64, 8); + unsafe_write_slice_native!(src, dst, u64); } else { write_slice!(src, dst, u64, 8, Self::write_u64); } @@ -2102,7 +2116,7 @@ impl ByteOrder for BigEndian { #[inline] fn write_u128_into(src: &[u128], dst: &mut [u8]) { if cfg!(target_endian = "big") { - write_slice_native!(src, dst, u128, 16); + unsafe_write_slice_native!(src, dst, u128); } else { write_slice!(src, dst, u128, 16, Self::write_u128); } @@ -2214,22 +2228,22 @@ impl ByteOrder for LittleEndian { #[inline] fn write_u16(buf: &mut [u8], n: u16) { - write_num_bytes!(u16, 2, n, buf, to_le); + unsafe_write_num_bytes!(u16, 2, n, buf, to_le); } #[inline] fn write_u32(buf: &mut [u8], n: u32) { - write_num_bytes!(u32, 4, n, buf, to_le); + unsafe_write_num_bytes!(u32, 4, n, buf, to_le); } #[inline] fn write_u64(buf: &mut [u8], n: u64) { - write_num_bytes!(u64, 8, n, buf, to_le); + unsafe_write_num_bytes!(u64, 8, n, buf, to_le); } #[inline] fn write_u128(buf: &mut [u8], n: u128) { - write_num_bytes!(u128, 16, n, buf, to_le); + unsafe_write_num_bytes!(u128, 16, n, buf, to_le); } #[inline] @@ -2254,28 +2268,28 @@ impl ByteOrder for LittleEndian { #[inline] fn read_u16_into(src: &[u8], dst: &mut [u16]) { - read_slice!(src, dst, 2, to_le); + unsafe_read_slice!(src, dst, 2, to_le); } #[inline] fn read_u32_into(src: &[u8], dst: &mut [u32]) { - read_slice!(src, dst, 4, to_le); + unsafe_read_slice!(src, dst, 4, to_le); } #[inline] fn read_u64_into(src: &[u8], dst: &mut [u64]) { - read_slice!(src, dst, 8, to_le); + unsafe_read_slice!(src, dst, 8, to_le); } #[inline] fn read_u128_into(src: &[u8], dst: &mut [u128]) { - read_slice!(src, dst, 16, to_le); + unsafe_read_slice!(src, dst, 16, to_le); } #[inline] fn write_u16_into(src: &[u16], dst: &mut [u8]) { if cfg!(target_endian = "little") { - write_slice_native!(src, dst, u16, 2); + unsafe_write_slice_native!(src, dst, u16); } else { write_slice!(src, dst, u16, 2, Self::write_u16); } @@ -2284,7 +2298,7 @@ impl ByteOrder for LittleEndian { #[inline] fn write_u32_into(src: &[u32], dst: &mut [u8]) { if cfg!(target_endian = "little") { - write_slice_native!(src, dst, u32, 4); + unsafe_write_slice_native!(src, dst, u32); } else { write_slice!(src, dst, u32, 4, Self::write_u32); } @@ -2293,7 +2307,7 @@ impl ByteOrder for LittleEndian { #[inline] fn write_u64_into(src: &[u64], dst: &mut [u8]) { if cfg!(target_endian = "little") { - write_slice_native!(src, dst, u64, 8); + unsafe_write_slice_native!(src, dst, u64); } else { write_slice!(src, dst, u64, 8, Self::write_u64); } @@ -2302,7 +2316,7 @@ impl ByteOrder for LittleEndian { #[inline] fn write_u128_into(src: &[u128], dst: &mut [u8]) { if cfg!(target_endian = "little") { - write_slice_native!(src, dst, u128, 16); + unsafe_write_slice_native!(src, dst, u128); } else { write_slice!(src, dst, u128, 16, Self::write_u128); } diff --git a/vendor/cc/.cargo-checksum.json b/vendor/cc/.cargo-checksum.json index 45e9e7c4ef..1709033b0d 100644 --- a/vendor/cc/.cargo-checksum.json +++ b/vendor/cc/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.lock":"e7f53256b803536940678cee654d7e2318882aa7cd163acbe8be0caa72087b65","Cargo.toml":"ecb8c7e0fccad7f2d42412b5a227bf51f8e53b9fd526e036fc1b8f41c5024a68","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"3055cc70608f92dab0dcd10338264357ef891f01d02219fa64457b4aa016936b","src/bin/gcc-shim.rs":"b77907875029494b6288841c3aed2e4939ed40708c7f597fca5c9e2570490ca6","src/com.rs":"bcdaf1c28b71e6ef889c6b08d1ce9d7c0761344a677f523bc4c3cd297957f804","src/lib.rs":"e1a05e4a092b903dbbc45612ee924c038585d5f680233792afc551000eb6aac5","src/registry.rs":"3cc1b5a50879fa751572878ae1d0afbfc960c11665258492754b2c8bccb0ff5d","src/setup_config.rs":"7014103587d3382eac599cb76f016e2609b8140970861b2237982d1db24af265","src/winapi.rs":"ea8b7edbb9ff87957254f465c2334e714c5d6b3b19a8d757c48ea7ca0881c50c","src/windows_registry.rs":"52afe8554f577c87841c48ddee3ba7ffe70a00129e1d6eeb2ec0efb3d2b9aa11","tests/cc_env.rs":"e02b3b0824ad039b47e4462c5ef6dbe6c824c28e7953af94a0f28f7b5158042e","tests/cflags.rs":"57f06eb5ce1557e5b4a032d0c4673e18fbe6f8d26c1deb153126e368b96b41b3","tests/cxxflags.rs":"c2c6c6d8a0d7146616fa1caed26876ee7bc9fcfffd525eb4743593cade5f3371","tests/support/mod.rs":"16274867f23871e9b07614eda4c7344da13d1751fed63d4f633857e40be86394","tests/test.rs":"65c073e0e2cf4aa0433066102788e9f57442719e6f32f5ad5248aa7132bb4597"},"package":"4c0496836a84f8d0495758516b8621a622beb77c0fed418570e50764093ced48"} \ No newline at end of file +{"files":{"Cargo.lock":"45b8780aa6c52bb154732a5b8a11c5723dd8328e7f0d01493a2bcd07fdba96c9","Cargo.toml":"3b622b3ea56086289d3b4ddc13a7d11c94c3ff0c729b37aa18a2ddca70201929","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"9916275542d23bfa0815b1f48d4546e514739fadc79775500de6a81cf17aac09","src/bin/gcc-shim.rs":"b77907875029494b6288841c3aed2e4939ed40708c7f597fca5c9e2570490ca6","src/com.rs":"bcdaf1c28b71e6ef889c6b08d1ce9d7c0761344a677f523bc4c3cd297957f804","src/lib.rs":"43bfa26d2bc699d56e063f5608aadb0cc20c297612e1f02cc408e0221923ac88","src/registry.rs":"3cc1b5a50879fa751572878ae1d0afbfc960c11665258492754b2c8bccb0ff5d","src/setup_config.rs":"7014103587d3382eac599cb76f016e2609b8140970861b2237982d1db24af265","src/winapi.rs":"ea8b7edbb9ff87957254f465c2334e714c5d6b3b19a8d757c48ea7ca0881c50c","src/windows_registry.rs":"52afe8554f577c87841c48ddee3ba7ffe70a00129e1d6eeb2ec0efb3d2b9aa11","tests/cc_env.rs":"e02b3b0824ad039b47e4462c5ef6dbe6c824c28e7953af94a0f28f7b5158042e","tests/cflags.rs":"57f06eb5ce1557e5b4a032d0c4673e18fbe6f8d26c1deb153126e368b96b41b3","tests/cxxflags.rs":"c2c6c6d8a0d7146616fa1caed26876ee7bc9fcfffd525eb4743593cade5f3371","tests/support/mod.rs":"16274867f23871e9b07614eda4c7344da13d1751fed63d4f633857e40be86394","tests/test.rs":"65c073e0e2cf4aa0433066102788e9f57442719e6f32f5ad5248aa7132bb4597"},"package":"e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd"} \ No newline at end of file diff --git a/vendor/cc/Cargo.lock b/vendor/cc/Cargo.lock index 19dae76325..c217f33c8a 100644 --- a/vendor/cc/Cargo.lock +++ b/vendor/cc/Cargo.lock @@ -2,7 +2,7 @@ # It is not intended for manual editing. [[package]] name = "cc" -version = "1.0.66" +version = "1.0.67" dependencies = [ "jobserver", "tempfile", diff --git a/vendor/cc/Cargo.toml b/vendor/cc/Cargo.toml index 4590bc2d15..be1db1fc36 100644 --- a/vendor/cc/Cargo.toml +++ b/vendor/cc/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "cc" -version = "1.0.66" +version = "1.0.67" authors = ["Alex Crichton "] exclude = ["/.github", "/.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" diff --git a/vendor/cc/README.md b/vendor/cc/README.md index af80281ad3..f88455e81a 100644 --- a/vendor/cc/README.md +++ b/vendor/cc/README.md @@ -101,7 +101,7 @@ functions with hard requirements on some variables supplied by [cargo's build-script driver][cargo] that it has the `TARGET`, `OUT_DIR`, `OPT_LEVEL`, and `HOST` variables. -[cargo]: http://doc.crates.io/build-script.html#inputs-to-the-build-script +[cargo]: https://doc.rust-lang.org/cargo/reference/build-scripts.html#inputs-to-the-build-script ## Optional features @@ -128,7 +128,7 @@ is being run. This crate does not ship a C compiler with it. The compiler required varies per platform, but there are three broad categories: * Unix platforms require `cc` to be the C compiler. This can be found by - installing cc/clang on Linux distributions and Xcode on OSX, for example. + installing cc/clang on Linux distributions and Xcode on macOS, for example. * Windows platforms targeting MSVC (e.g. your target triple ends in `-msvc`) require `cl.exe` to be available and in `PATH`. This is typically found in standard Visual Studio installations and the `PATH` can be set up by running @@ -138,12 +138,12 @@ required varies per platform, but there are three broad categories: [MinGW-w64](http://mingw-w64.org) distribution, which is using the [Win-builds](http://win-builds.org) installation system. You may also acquire it via - [MSYS2](http://msys2.github.io), as explained [here][msys2-help]. Make sure + [MSYS2](https://www.msys2.org/), as explained [here][msys2-help]. Make sure to install the appropriate architecture corresponding to your installation of rustc. GCC from older [MinGW](http://www.mingw.org) project is compatible only with 32-bit rust compiler. -[msys2-help]: http://github.com/rust-lang/rust#building-on-windows +[msys2-help]: https://github.com/rust-lang/rust#building-on-windows ## C++ support @@ -161,7 +161,7 @@ fn main() { For C++ libraries, the `CXX` and `CXXFLAGS` environment variables are used instead of `CC` and `CFLAGS`. -The C++ standard library may be linked to the crate target. By default it's `libc++` for OS X, FreeBSD, and OpenBSD, `libc++_shared` for Android, nothing for MSVC, and `libstdc++` for anything else. It can be changed in one of two ways: +The C++ standard library may be linked to the crate target. By default it's `libc++` for macOS, FreeBSD, and OpenBSD, `libc++_shared` for Android, nothing for MSVC, and `libstdc++` for anything else. It can be changed in one of two ways: 1. by using the `cpp_link_stdlib` method on `Build`: ```rust,no-run @@ -209,9 +209,9 @@ fn main() { 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) + https://www.apache.org/licenses/LICENSE-2.0) * MIT license ([LICENSE-MIT](LICENSE-MIT) or - http://opensource.org/licenses/MIT) + https://opensource.org/licenses/MIT) at your option. diff --git a/vendor/cc/src/lib.rs b/vendor/cc/src/lib.rs index 9814ea7dd1..5051b2960a 100644 --- a/vendor/cc/src/lib.rs +++ b/vendor/cc/src/lib.rs @@ -1414,7 +1414,7 @@ impl Build { cmd.push_opt_unless_duplicate("-DANDROID".into()); } - if !target.contains("-ios") { + if !target.contains("apple-ios") { cmd.push_cc_arg("-ffunction-sections".into()); cmd.push_cc_arg("-fdata-sections".into()); } @@ -1468,6 +1468,20 @@ impl Build { cmd.args .push(format!("--target={}-apple-{}-macabi", arch, ios).into()); } + } else if target.contains("ios-sim") { + if let Some(arch) = + map_darwin_target_from_rust_to_compiler_architecture(target) + { + let deployment_target = env::var("IPHONEOS_DEPLOYMENT_TARGET") + .unwrap_or_else(|_| "7.0".into()); + cmd.args.push( + format!( + "--target={}-apple-ios{}-simulator", + arch, deployment_target + ) + .into(), + ); + } } else { cmd.args.push(format!("--target={}", target).into()); } @@ -1600,7 +1614,7 @@ impl Build { cmd.args.push("-march=i686".into()); } - // Looks like `musl-gcc` makes is hard for `-m32` to make its way + // Looks like `musl-gcc` makes it hard for `-m32` to make its way // all the way to the linker, so we need to actually instruct the // linker that we're generating 32-bit executables as well. This'll // typically only be used for build scripts which transitively use @@ -1677,14 +1691,17 @@ impl Build { let mut parts = target.split('-'); if let Some(arch) = parts.next() { let arch = &arch[5..]; - cmd.args.push(("-march=rv".to_owned() + arch).into()); if target.contains("linux") && arch.starts_with("64") { + cmd.args.push(("-march=rv64gc").into()); cmd.args.push("-mabi=lp64d".into()); } else if target.contains("linux") && arch.starts_with("32") { + cmd.args.push(("-march=rv32gc").into()); cmd.args.push("-mabi=ilp32d".into()); } else if arch.starts_with("64") { + cmd.args.push(("-march=rv".to_owned() + arch).into()); cmd.args.push("-mabi=lp64".into()); } else { + cmd.args.push(("-march=rv".to_owned() + arch).into()); cmd.args.push("-mabi=ilp32".into()); } cmd.args.push("-mcmodel=medany".into()); @@ -1693,9 +1710,7 @@ impl Build { } } - if target.contains("-ios") { - // FIXME: potential bug. iOS is always compiled with Clang, but Gcc compiler may be - // detected instead. + if target.contains("apple-ios") { self.ios_flags(cmd)?; } @@ -2044,6 +2059,8 @@ impl Build { } else { format!("{}.exe", gnu) } + } else if target.contains("apple-ios") { + clang.to_string() } else if target.contains("android") { autodetect_android_compiler(&target, &host, gnu, clang) } else if target.contains("cloudabi") { @@ -2420,6 +2437,9 @@ impl Build { "riscv-none-embed", ]), "riscv64gc-unknown-linux-gnu" => Some("riscv64-linux-gnu"), + "riscv32gc-unknown-linux-gnu" => Some("riscv32-linux-gnu"), + "riscv64gc-unknown-linux-musl" => Some("riscv64-linux-musl"), + "riscv32gc-unknown-linux-musl" => Some("riscv32-linux-musl"), "s390x-unknown-linux-gnu" => Some("s390x-linux-gnu"), "sparc-unknown-linux-gnu" => Some("sparc-linux-gnu"), "sparc64-unknown-linux-gnu" => Some("sparc64-linux-gnu"), @@ -2643,11 +2663,7 @@ impl Tool { let family = if let Some(fname) = path.file_name().and_then(|p| p.to_str()) { if fname.contains("clang-cl") { ToolFamily::Msvc { clang_cl: true } - } else if fname.contains("cl") - && !fname.contains("cloudabi") - && !fname.contains("uclibc") - && !fname.contains("clang") - { + } else if fname.ends_with("cl") || fname == "cl.exe" { ToolFamily::Msvc { clang_cl: false } } else if fname.contains("clang") { match clang_driver { diff --git a/vendor/chalk-derive/.cargo-checksum.json b/vendor/chalk-derive-0.55.0/.cargo-checksum.json similarity index 100% rename from vendor/chalk-derive/.cargo-checksum.json rename to vendor/chalk-derive-0.55.0/.cargo-checksum.json diff --git a/vendor/chalk-derive/Cargo.toml b/vendor/chalk-derive-0.55.0/Cargo.toml similarity index 100% rename from vendor/chalk-derive/Cargo.toml rename to vendor/chalk-derive-0.55.0/Cargo.toml diff --git a/vendor/chalk-derive/README.md b/vendor/chalk-derive-0.55.0/README.md similarity index 100% rename from vendor/chalk-derive/README.md rename to vendor/chalk-derive-0.55.0/README.md diff --git a/vendor/chalk-derive/src/lib.rs b/vendor/chalk-derive-0.55.0/src/lib.rs similarity index 100% rename from vendor/chalk-derive/src/lib.rs rename to vendor/chalk-derive-0.55.0/src/lib.rs diff --git a/vendor/chalk-ir/.cargo-checksum.json b/vendor/chalk-ir-0.55.0/.cargo-checksum.json similarity index 100% rename from vendor/chalk-ir/.cargo-checksum.json rename to vendor/chalk-ir-0.55.0/.cargo-checksum.json diff --git a/vendor/chalk-ir/Cargo.toml b/vendor/chalk-ir-0.55.0/Cargo.toml similarity index 100% rename from vendor/chalk-ir/Cargo.toml rename to vendor/chalk-ir-0.55.0/Cargo.toml diff --git a/vendor/chalk-ir/README.md b/vendor/chalk-ir-0.55.0/README.md similarity index 100% rename from vendor/chalk-ir/README.md rename to vendor/chalk-ir-0.55.0/README.md diff --git a/vendor/chalk-ir/src/cast.rs b/vendor/chalk-ir-0.55.0/src/cast.rs similarity index 100% rename from vendor/chalk-ir/src/cast.rs rename to vendor/chalk-ir-0.55.0/src/cast.rs diff --git a/vendor/chalk-ir/src/could_match.rs b/vendor/chalk-ir-0.55.0/src/could_match.rs similarity index 100% rename from vendor/chalk-ir/src/could_match.rs rename to vendor/chalk-ir-0.55.0/src/could_match.rs diff --git a/vendor/chalk-ir/src/debug.rs b/vendor/chalk-ir-0.55.0/src/debug.rs similarity index 100% rename from vendor/chalk-ir/src/debug.rs rename to vendor/chalk-ir-0.55.0/src/debug.rs diff --git a/vendor/chalk-ir/src/fold.rs b/vendor/chalk-ir-0.55.0/src/fold.rs similarity index 100% rename from vendor/chalk-ir/src/fold.rs rename to vendor/chalk-ir-0.55.0/src/fold.rs diff --git a/vendor/chalk-ir/src/fold/binder_impls.rs b/vendor/chalk-ir-0.55.0/src/fold/binder_impls.rs similarity index 100% rename from vendor/chalk-ir/src/fold/binder_impls.rs rename to vendor/chalk-ir-0.55.0/src/fold/binder_impls.rs diff --git a/vendor/chalk-ir/src/fold/boring_impls.rs b/vendor/chalk-ir-0.55.0/src/fold/boring_impls.rs similarity index 100% rename from vendor/chalk-ir/src/fold/boring_impls.rs rename to vendor/chalk-ir-0.55.0/src/fold/boring_impls.rs diff --git a/vendor/chalk-ir/src/fold/in_place.rs b/vendor/chalk-ir-0.55.0/src/fold/in_place.rs similarity index 100% rename from vendor/chalk-ir/src/fold/in_place.rs rename to vendor/chalk-ir-0.55.0/src/fold/in_place.rs diff --git a/vendor/chalk-ir/src/fold/shift.rs b/vendor/chalk-ir-0.55.0/src/fold/shift.rs similarity index 100% rename from vendor/chalk-ir/src/fold/shift.rs rename to vendor/chalk-ir-0.55.0/src/fold/shift.rs diff --git a/vendor/chalk-ir/src/fold/subst.rs b/vendor/chalk-ir-0.55.0/src/fold/subst.rs similarity index 100% rename from vendor/chalk-ir/src/fold/subst.rs rename to vendor/chalk-ir-0.55.0/src/fold/subst.rs diff --git a/vendor/chalk-ir/src/interner.rs b/vendor/chalk-ir-0.55.0/src/interner.rs similarity index 100% rename from vendor/chalk-ir/src/interner.rs rename to vendor/chalk-ir-0.55.0/src/interner.rs diff --git a/vendor/chalk-ir/src/lib.rs b/vendor/chalk-ir-0.55.0/src/lib.rs similarity index 100% rename from vendor/chalk-ir/src/lib.rs rename to vendor/chalk-ir-0.55.0/src/lib.rs diff --git a/vendor/chalk-ir/src/visit.rs b/vendor/chalk-ir-0.55.0/src/visit.rs similarity index 100% rename from vendor/chalk-ir/src/visit.rs rename to vendor/chalk-ir-0.55.0/src/visit.rs diff --git a/vendor/chalk-ir/src/visit/binder_impls.rs b/vendor/chalk-ir-0.55.0/src/visit/binder_impls.rs similarity index 100% rename from vendor/chalk-ir/src/visit/binder_impls.rs rename to vendor/chalk-ir-0.55.0/src/visit/binder_impls.rs diff --git a/vendor/chalk-ir/src/visit/boring_impls.rs b/vendor/chalk-ir-0.55.0/src/visit/boring_impls.rs similarity index 100% rename from vendor/chalk-ir/src/visit/boring_impls.rs rename to vendor/chalk-ir-0.55.0/src/visit/boring_impls.rs diff --git a/vendor/chalk-ir/src/visit/visitors.rs b/vendor/chalk-ir-0.55.0/src/visit/visitors.rs similarity index 100% rename from vendor/chalk-ir/src/visit/visitors.rs rename to vendor/chalk-ir-0.55.0/src/visit/visitors.rs diff --git a/vendor/chalk-ir/src/zip.rs b/vendor/chalk-ir-0.55.0/src/zip.rs similarity index 100% rename from vendor/chalk-ir/src/zip.rs rename to vendor/chalk-ir-0.55.0/src/zip.rs diff --git a/vendor/chalk-solve/.cargo-checksum.json b/vendor/chalk-solve-0.55.0/.cargo-checksum.json similarity index 100% rename from vendor/chalk-solve/.cargo-checksum.json rename to vendor/chalk-solve-0.55.0/.cargo-checksum.json diff --git a/vendor/chalk-solve/Cargo.toml b/vendor/chalk-solve-0.55.0/Cargo.toml similarity index 100% rename from vendor/chalk-solve/Cargo.toml rename to vendor/chalk-solve-0.55.0/Cargo.toml diff --git a/vendor/chalk-solve/README.md b/vendor/chalk-solve-0.55.0/README.md similarity index 100% rename from vendor/chalk-solve/README.md rename to vendor/chalk-solve-0.55.0/README.md diff --git a/vendor/chalk-solve/src/clauses.rs b/vendor/chalk-solve-0.55.0/src/clauses.rs similarity index 100% rename from vendor/chalk-solve/src/clauses.rs rename to vendor/chalk-solve-0.55.0/src/clauses.rs diff --git a/vendor/chalk-solve/src/clauses/builder.rs b/vendor/chalk-solve-0.55.0/src/clauses/builder.rs similarity index 100% rename from vendor/chalk-solve/src/clauses/builder.rs rename to vendor/chalk-solve-0.55.0/src/clauses/builder.rs diff --git a/vendor/chalk-solve/src/clauses/builtin_traits.rs b/vendor/chalk-solve-0.55.0/src/clauses/builtin_traits.rs similarity index 100% rename from vendor/chalk-solve/src/clauses/builtin_traits.rs rename to vendor/chalk-solve-0.55.0/src/clauses/builtin_traits.rs diff --git a/vendor/chalk-solve/src/clauses/builtin_traits/clone.rs b/vendor/chalk-solve-0.55.0/src/clauses/builtin_traits/clone.rs similarity index 100% rename from vendor/chalk-solve/src/clauses/builtin_traits/clone.rs rename to vendor/chalk-solve-0.55.0/src/clauses/builtin_traits/clone.rs diff --git a/vendor/chalk-solve/src/clauses/builtin_traits/copy.rs b/vendor/chalk-solve-0.55.0/src/clauses/builtin_traits/copy.rs similarity index 100% rename from vendor/chalk-solve/src/clauses/builtin_traits/copy.rs rename to vendor/chalk-solve-0.55.0/src/clauses/builtin_traits/copy.rs diff --git a/vendor/chalk-solve/src/clauses/builtin_traits/discriminant_kind.rs b/vendor/chalk-solve-0.55.0/src/clauses/builtin_traits/discriminant_kind.rs similarity index 100% rename from vendor/chalk-solve/src/clauses/builtin_traits/discriminant_kind.rs rename to vendor/chalk-solve-0.55.0/src/clauses/builtin_traits/discriminant_kind.rs diff --git a/vendor/chalk-solve/src/clauses/builtin_traits/fn_family.rs b/vendor/chalk-solve-0.55.0/src/clauses/builtin_traits/fn_family.rs similarity index 100% rename from vendor/chalk-solve/src/clauses/builtin_traits/fn_family.rs rename to vendor/chalk-solve-0.55.0/src/clauses/builtin_traits/fn_family.rs diff --git a/vendor/chalk-solve/src/clauses/builtin_traits/sized.rs b/vendor/chalk-solve-0.55.0/src/clauses/builtin_traits/sized.rs similarity index 100% rename from vendor/chalk-solve/src/clauses/builtin_traits/sized.rs rename to vendor/chalk-solve-0.55.0/src/clauses/builtin_traits/sized.rs diff --git a/vendor/chalk-solve/src/clauses/builtin_traits/unsize.rs b/vendor/chalk-solve-0.55.0/src/clauses/builtin_traits/unsize.rs similarity index 100% rename from vendor/chalk-solve/src/clauses/builtin_traits/unsize.rs rename to vendor/chalk-solve-0.55.0/src/clauses/builtin_traits/unsize.rs diff --git a/vendor/chalk-solve/src/clauses/dyn_ty.rs b/vendor/chalk-solve-0.55.0/src/clauses/dyn_ty.rs similarity index 100% rename from vendor/chalk-solve/src/clauses/dyn_ty.rs rename to vendor/chalk-solve-0.55.0/src/clauses/dyn_ty.rs diff --git a/vendor/chalk-solve/src/clauses/env_elaborator.rs b/vendor/chalk-solve-0.55.0/src/clauses/env_elaborator.rs similarity index 100% rename from vendor/chalk-solve/src/clauses/env_elaborator.rs rename to vendor/chalk-solve-0.55.0/src/clauses/env_elaborator.rs diff --git a/vendor/chalk-solve/src/clauses/generalize.rs b/vendor/chalk-solve-0.55.0/src/clauses/generalize.rs similarity index 100% rename from vendor/chalk-solve/src/clauses/generalize.rs rename to vendor/chalk-solve-0.55.0/src/clauses/generalize.rs diff --git a/vendor/chalk-solve/src/clauses/program_clauses.rs b/vendor/chalk-solve-0.55.0/src/clauses/program_clauses.rs similarity index 100% rename from vendor/chalk-solve/src/clauses/program_clauses.rs rename to vendor/chalk-solve-0.55.0/src/clauses/program_clauses.rs diff --git a/vendor/chalk-solve/src/coherence.rs b/vendor/chalk-solve-0.55.0/src/coherence.rs similarity index 100% rename from vendor/chalk-solve/src/coherence.rs rename to vendor/chalk-solve-0.55.0/src/coherence.rs diff --git a/vendor/chalk-solve/src/coherence/orphan.rs b/vendor/chalk-solve-0.55.0/src/coherence/orphan.rs similarity index 100% rename from vendor/chalk-solve/src/coherence/orphan.rs rename to vendor/chalk-solve-0.55.0/src/coherence/orphan.rs diff --git a/vendor/chalk-solve/src/coherence/solve.rs b/vendor/chalk-solve-0.55.0/src/coherence/solve.rs similarity index 100% rename from vendor/chalk-solve/src/coherence/solve.rs rename to vendor/chalk-solve-0.55.0/src/coherence/solve.rs diff --git a/vendor/chalk-solve/src/coinductive_goal.rs b/vendor/chalk-solve-0.55.0/src/coinductive_goal.rs similarity index 100% rename from vendor/chalk-solve/src/coinductive_goal.rs rename to vendor/chalk-solve-0.55.0/src/coinductive_goal.rs diff --git a/vendor/chalk-solve/src/display.rs b/vendor/chalk-solve-0.55.0/src/display.rs similarity index 100% rename from vendor/chalk-solve/src/display.rs rename to vendor/chalk-solve-0.55.0/src/display.rs diff --git a/vendor/chalk-solve/src/display/bounds.rs b/vendor/chalk-solve-0.55.0/src/display/bounds.rs similarity index 100% rename from vendor/chalk-solve/src/display/bounds.rs rename to vendor/chalk-solve-0.55.0/src/display/bounds.rs diff --git a/vendor/chalk-solve/src/display/identifiers.rs b/vendor/chalk-solve-0.55.0/src/display/identifiers.rs similarity index 100% rename from vendor/chalk-solve/src/display/identifiers.rs rename to vendor/chalk-solve-0.55.0/src/display/identifiers.rs diff --git a/vendor/chalk-solve/src/display/items.rs b/vendor/chalk-solve-0.55.0/src/display/items.rs similarity index 100% rename from vendor/chalk-solve/src/display/items.rs rename to vendor/chalk-solve-0.55.0/src/display/items.rs diff --git a/vendor/chalk-solve/src/display/render_trait.rs b/vendor/chalk-solve-0.55.0/src/display/render_trait.rs similarity index 100% rename from vendor/chalk-solve/src/display/render_trait.rs rename to vendor/chalk-solve-0.55.0/src/display/render_trait.rs diff --git a/vendor/chalk-solve/src/display/state.rs b/vendor/chalk-solve-0.55.0/src/display/state.rs similarity index 100% rename from vendor/chalk-solve/src/display/state.rs rename to vendor/chalk-solve-0.55.0/src/display/state.rs diff --git a/vendor/chalk-solve/src/display/stub.rs b/vendor/chalk-solve-0.55.0/src/display/stub.rs similarity index 100% rename from vendor/chalk-solve/src/display/stub.rs rename to vendor/chalk-solve-0.55.0/src/display/stub.rs diff --git a/vendor/chalk-solve/src/display/ty.rs b/vendor/chalk-solve-0.55.0/src/display/ty.rs similarity index 100% rename from vendor/chalk-solve/src/display/ty.rs rename to vendor/chalk-solve-0.55.0/src/display/ty.rs diff --git a/vendor/chalk-solve/src/display/utils.rs b/vendor/chalk-solve-0.55.0/src/display/utils.rs similarity index 100% rename from vendor/chalk-solve/src/display/utils.rs rename to vendor/chalk-solve-0.55.0/src/display/utils.rs diff --git a/vendor/chalk-solve/src/ext.rs b/vendor/chalk-solve-0.55.0/src/ext.rs similarity index 100% rename from vendor/chalk-solve/src/ext.rs rename to vendor/chalk-solve-0.55.0/src/ext.rs diff --git a/vendor/chalk-solve/src/goal_builder.rs b/vendor/chalk-solve-0.55.0/src/goal_builder.rs similarity index 100% rename from vendor/chalk-solve/src/goal_builder.rs rename to vendor/chalk-solve-0.55.0/src/goal_builder.rs diff --git a/vendor/chalk-solve/src/infer.rs b/vendor/chalk-solve-0.55.0/src/infer.rs similarity index 100% rename from vendor/chalk-solve/src/infer.rs rename to vendor/chalk-solve-0.55.0/src/infer.rs diff --git a/vendor/chalk-solve/src/infer/canonicalize.rs b/vendor/chalk-solve-0.55.0/src/infer/canonicalize.rs similarity index 100% rename from vendor/chalk-solve/src/infer/canonicalize.rs rename to vendor/chalk-solve-0.55.0/src/infer/canonicalize.rs diff --git a/vendor/chalk-solve/src/infer/instantiate.rs b/vendor/chalk-solve-0.55.0/src/infer/instantiate.rs similarity index 100% rename from vendor/chalk-solve/src/infer/instantiate.rs rename to vendor/chalk-solve-0.55.0/src/infer/instantiate.rs diff --git a/vendor/chalk-solve/src/infer/invert.rs b/vendor/chalk-solve-0.55.0/src/infer/invert.rs similarity index 100% rename from vendor/chalk-solve/src/infer/invert.rs rename to vendor/chalk-solve-0.55.0/src/infer/invert.rs diff --git a/vendor/chalk-solve/src/infer/test.rs b/vendor/chalk-solve-0.55.0/src/infer/test.rs similarity index 100% rename from vendor/chalk-solve/src/infer/test.rs rename to vendor/chalk-solve-0.55.0/src/infer/test.rs diff --git a/vendor/chalk-solve/src/infer/ucanonicalize.rs b/vendor/chalk-solve-0.55.0/src/infer/ucanonicalize.rs similarity index 100% rename from vendor/chalk-solve/src/infer/ucanonicalize.rs rename to vendor/chalk-solve-0.55.0/src/infer/ucanonicalize.rs diff --git a/vendor/chalk-solve/src/infer/unify.rs b/vendor/chalk-solve-0.55.0/src/infer/unify.rs similarity index 100% rename from vendor/chalk-solve/src/infer/unify.rs rename to vendor/chalk-solve-0.55.0/src/infer/unify.rs diff --git a/vendor/chalk-solve/src/infer/var.rs b/vendor/chalk-solve-0.55.0/src/infer/var.rs similarity index 100% rename from vendor/chalk-solve/src/infer/var.rs rename to vendor/chalk-solve-0.55.0/src/infer/var.rs diff --git a/vendor/chalk-solve/src/lib.rs b/vendor/chalk-solve-0.55.0/src/lib.rs similarity index 100% rename from vendor/chalk-solve/src/lib.rs rename to vendor/chalk-solve-0.55.0/src/lib.rs diff --git a/vendor/chalk-solve/src/logging.rs b/vendor/chalk-solve-0.55.0/src/logging.rs similarity index 100% rename from vendor/chalk-solve/src/logging.rs rename to vendor/chalk-solve-0.55.0/src/logging.rs diff --git a/vendor/chalk-solve/src/logging_db.rs b/vendor/chalk-solve-0.55.0/src/logging_db.rs similarity index 100% rename from vendor/chalk-solve/src/logging_db.rs rename to vendor/chalk-solve-0.55.0/src/logging_db.rs diff --git a/vendor/chalk-solve/src/logging_db/id_collector.rs b/vendor/chalk-solve-0.55.0/src/logging_db/id_collector.rs similarity index 100% rename from vendor/chalk-solve/src/logging_db/id_collector.rs rename to vendor/chalk-solve-0.55.0/src/logging_db/id_collector.rs diff --git a/vendor/chalk-solve/src/rust_ir.rs b/vendor/chalk-solve-0.55.0/src/rust_ir.rs similarity index 100% rename from vendor/chalk-solve/src/rust_ir.rs rename to vendor/chalk-solve-0.55.0/src/rust_ir.rs diff --git a/vendor/chalk-solve/src/solve.rs b/vendor/chalk-solve-0.55.0/src/solve.rs similarity index 100% rename from vendor/chalk-solve/src/solve.rs rename to vendor/chalk-solve-0.55.0/src/solve.rs diff --git a/vendor/chalk-solve/src/solve/test/bench.rs b/vendor/chalk-solve-0.55.0/src/solve/test/bench.rs similarity index 100% rename from vendor/chalk-solve/src/solve/test/bench.rs rename to vendor/chalk-solve-0.55.0/src/solve/test/bench.rs diff --git a/vendor/chalk-solve/src/solve/truncate.rs b/vendor/chalk-solve-0.55.0/src/solve/truncate.rs similarity index 100% rename from vendor/chalk-solve/src/solve/truncate.rs rename to vendor/chalk-solve-0.55.0/src/solve/truncate.rs diff --git a/vendor/chalk-solve/src/split.rs b/vendor/chalk-solve-0.55.0/src/split.rs similarity index 100% rename from vendor/chalk-solve/src/split.rs rename to vendor/chalk-solve-0.55.0/src/split.rs diff --git a/vendor/chalk-solve/src/wf.rs b/vendor/chalk-solve-0.55.0/src/wf.rs similarity index 100% rename from vendor/chalk-solve/src/wf.rs rename to vendor/chalk-solve-0.55.0/src/wf.rs diff --git a/vendor/cmake/.cargo-checksum.json b/vendor/cmake/.cargo-checksum.json index d837482f68..e0e1595623 100644 --- a/vendor/cmake/.cargo-checksum.json +++ b/vendor/cmake/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"4182af7fa91eef3d48d5458708e038b85a24ebed85408cd9ef0f86e1e05d2cc5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"a4ad0b734acb4d50db72782207587552c5e33c52500318c202776cd32dbdea4a","src/lib.rs":"3268897f8bc77f8caf3e0eb293c4e522021600cd07ba40b6abf94c679baa8529"},"package":"eb6210b637171dfba4cda12e579ac6dc73f5165ad56133e5d72ef3131f320855"} \ No newline at end of file +{"files":{"Cargo.toml":"0ce2c3999bc31b6e8fc5356e19c32f950e6176638aa2834c5b0d00c6c58397a0","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"378f5840b258e2779c39418f3f2d7b2ba96f1c7917dd6be0713f88305dbda397","README.md":"a4ad0b734acb4d50db72782207587552c5e33c52500318c202776cd32dbdea4a","src/lib.rs":"45127eb441cee715f4337cfac78c9ce8ec8feb167d2814ff11a6708a9533bde7"},"package":"0e56268c17a6248366d66d4a47a3381369d068cce8409bb1716ed77ea32163bb"} \ No newline at end of file diff --git a/vendor/cmake/Cargo.toml b/vendor/cmake/Cargo.toml index 54f410396b..cc5c48291e 100644 --- a/vendor/cmake/Cargo.toml +++ b/vendor/cmake/Cargo.toml @@ -12,7 +12,7 @@ [package] name = "cmake" -version = "0.1.45" +version = "0.1.44" authors = ["Alex Crichton "] description = "A build dependency for running `cmake` to build a native library\n" homepage = "https://github.com/alexcrichton/cmake-rs" diff --git a/vendor/cmake/src/lib.rs b/vendor/cmake/src/lib.rs index 5d9bc61650..ae8770f890 100644 --- a/vendor/cmake/src/lib.rs +++ b/vendor/cmake/src/lib.rs @@ -100,77 +100,6 @@ pub fn build>(path: P) -> PathBuf { } impl Config { - /// Return explicitly set profile or infer `CMAKE_BUILD_TYPE` from Rust's compilation profile. - /// - /// * if `opt-level=0` then `CMAKE_BUILD_TYPE=Debug`, - /// * if `opt-level={1,2,3}` and: - /// * `debug=false` then `CMAKE_BUILD_TYPE=Release` - /// * otherwise `CMAKE_BUILD_TYPE=RelWithDebInfo` - /// * if `opt-level={s,z}` then `CMAKE_BUILD_TYPE=MinSizeRel` - pub fn get_profile(&self) -> &str { - if let Some(profile) = self.profile.as_ref() { - profile - } else { - // Determine Rust's profile, optimization level, and debug info: - #[derive(PartialEq)] - enum RustProfile { - Debug, - Release, - } - #[derive(PartialEq, Debug)] - enum OptLevel { - Debug, - Release, - Size, - } - - let rust_profile = match &getenv_unwrap("PROFILE")[..] { - "debug" => RustProfile::Debug, - "release" | "bench" => RustProfile::Release, - unknown => { - eprintln!( - "Warning: unknown Rust profile={}; defaulting to a release build.", - unknown - ); - RustProfile::Release - } - }; - - let opt_level = match &getenv_unwrap("OPT_LEVEL")[..] { - "0" => OptLevel::Debug, - "1" | "2" | "3" => OptLevel::Release, - "s" | "z" => OptLevel::Size, - unknown => { - let default_opt_level = match rust_profile { - RustProfile::Debug => OptLevel::Debug, - RustProfile::Release => OptLevel::Release, - }; - eprintln!( - "Warning: unknown opt-level={}; defaulting to a {:?} build.", - unknown, default_opt_level - ); - default_opt_level - } - }; - - let debug_info: bool = match &getenv_unwrap("DEBUG")[..] { - "false" => false, - "true" => true, - unknown => { - eprintln!("Warning: unknown debug={}; defaulting to `true`.", unknown); - true - } - }; - - match (opt_level, debug_info) { - (OptLevel::Debug, _) => "Debug", - (OptLevel::Release, false) => "Release", - (OptLevel::Release, true) => "RelWithDebInfo", - (OptLevel::Size, _) => "MinSizeRel", - } - } - } - /// Creates a new blank set of configuration to build the project specified /// at the path `path`. pub fn new>(path: P) -> Config { @@ -566,7 +495,69 @@ impl Config { if let Some(ref generator) = self.generator { cmd.arg("-G").arg(generator); } - let profile = self.get_profile(); + let profile = self.profile.clone().unwrap_or_else(|| { + // Automatically set the `CMAKE_BUILD_TYPE` if the user did not + // specify one. + + // Determine Rust's profile, optimization level, and debug info: + #[derive(PartialEq)] + enum RustProfile { + Debug, + Release, + } + #[derive(PartialEq, Debug)] + enum OptLevel { + Debug, + Release, + Size, + } + + let rust_profile = match &getenv_unwrap("PROFILE")[..] { + "debug" => RustProfile::Debug, + "release" | "bench" => RustProfile::Release, + unknown => { + eprintln!( + "Warning: unknown Rust profile={}; defaulting to a release build.", + unknown + ); + RustProfile::Release + } + }; + + let opt_level = match &getenv_unwrap("OPT_LEVEL")[..] { + "0" => OptLevel::Debug, + "1" | "2" | "3" => OptLevel::Release, + "s" | "z" => OptLevel::Size, + unknown => { + let default_opt_level = match rust_profile { + RustProfile::Debug => OptLevel::Debug, + RustProfile::Release => OptLevel::Release, + }; + eprintln!( + "Warning: unknown opt-level={}; defaulting to a {:?} build.", + unknown, default_opt_level + ); + default_opt_level + } + }; + + let debug_info: bool = match &getenv_unwrap("DEBUG")[..] { + "false" => false, + "true" => true, + unknown => { + eprintln!("Warning: unknown debug={}; defaulting to `true`.", unknown); + true + } + }; + + match (opt_level, debug_info) { + (OptLevel::Debug, _) => "Debug", + (OptLevel::Release, false) => "Release", + (OptLevel::Release, true) => "RelWithDebInfo", + (OptLevel::Size, _) => "MinSizeRel", + } + .to_string() + }); for &(ref k, ref v) in &self.defines { let mut os = OsString::from("-D"); os.push(k); diff --git a/vendor/colored/.cargo-checksum.json b/vendor/colored/.cargo-checksum.json new file mode 100644 index 0000000000..a2730e5b2d --- /dev/null +++ b/vendor/colored/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"CHANGELOG.md":"08d00cec58e4444b8d58267705aa4b8b8be6cb404dbac396a343ea71857fae96","Cargo.lock":"0a241b71934585d26ec03d6c265b1dbb69971bbfcd4b319a23e28d6cd3581007","Cargo.toml":"fa84955c09e271f41dd86b55a3738f9d3b1fb419dad4fd1b3242e5d3dac75cc1","Dockerfile":"e57d9b655c28d967c6b1b46a1db2e434ea9a4dc55fe1635add74b00265bb3153","LICENSE":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","README.md":"0807a71aaca98bb5ff5911df7f13305d6a59434b72130c3c54b37b508abc322a","examples/control.rs":"10d95f75d0556c6355d9980007119a11922aff0ebe1809c146e12367bca54955","examples/dynamic_colors.rs":"3bfb4353a665d898be947159e6715d05b911ddab9cfbf650d122c20894935371","examples/most_simple.rs":"9110a7cf8e176dc60653e2a4e4358afdbd72c7ac2dad5cb1fe8fd4b7739211da","examples/nested_colors.rs":"37345018ed494e26ae06c9641039286d967154c795ccaa3ec8dd6b6148f58765","src/color.rs":"4809203b30403689f7befdc4c0371ad732a3d78718ccb0eeb20905034c5feeab","src/control.rs":"8105be4165fa073e65d2851004ecdc5d1b8c69b29f38274ef11b7c83e64cfefe","src/formatters.rs":"77dcc511626c9df54851d9ac2352e80ece7e6e9309f299357ef0e3737c33402d","src/lib.rs":"56a9d56f58464a292316d926265bb1b47c398f5dd82fb02b22a650ef45839dac","src/style.rs":"90ad40942e0f5efe32615c628782e9fa4fa0f98101bad073dda3f687cff2389d","tests/ansi_term_compat.rs":"5658c3d0de456c23ffdca07c92d6a931a7ab3c6ac563417fccb54808cb2d6166"},"package":"b3616f750b84d8f0de8a58bda93e08e2a81ad3f523089b05f1dffecab48c6cbd"} \ No newline at end of file diff --git a/vendor/colored/CHANGELOG.md b/vendor/colored/CHANGELOG.md new file mode 100755 index 0000000000..f74427e8f7 --- /dev/null +++ b/vendor/colored/CHANGELOG.md @@ -0,0 +1,88 @@ + +# 2.0.0 (July 14, 2020) +- Add support for true colours. +- Alter `Color` interface to return `Cow<'static, str>` + +# 1.9.3 (February 24, 2020) +- Fix compilation regression for 1.34.0. Thanks @jlevon for reporting. + +# 1.9.2 (January 11, 2020) +- Exposed `ColoredString` data through methods for purposes of interrogating the applied colours. +- Increased documentation. + +# 1.9.1 (December 31, 2019) + +- Remove deprecated `try!` macro in codebase +- Reduce allocations in `ColoredString` impl (PR#65) +- Added `"purple"` as match in `impl FromStr for Color` (PR#71) + +# 1.9.0 (November 11, 2019) + +- **[POSSIBLE_BREAKING CHANGE]:** Replace `winconsole` with `winapi`: + - Changes `set_virtual_terminal` function signature. +- Update dependencies +- Add Dockerfile +- Respect tty discovery for CLICOLOR + +# 1.8.0 (April 30, 2019) + +- FEAT: support Windows 10 colors + +# 1.7.0 (January, 2019) +- TECH: update lazy\_static +- FEAT: introduce respect for the `NO_COLOR` environment variable + +# 1.6.1 (July 9, 2018) +- TECH: update lazy\_static +- CHORE: fix typos in README and documentation + +# 1.6.0 (October 31, 2017) +- FEAT: introduced bright colors. `"hello".bright_blue().on_bright_red();` +- FEAT: introduced strikethrough styling. `"hello".strikethrough();` + +# 1.5.3 (September 28, 2017) + +- FEAT: derive Copy and Clone for `Color` +- FEAT: derive Clone for `ColoredString` + +# 1.5.2 (July 6, 2017) + +- FIX: method `Colorize::reversed` has been added. `Colorize::reverse` was a typo, that we will keep + for compatibility + +# 1.5.1 (May 9, 2017) + +- Update lazy\_static to 0.2. + +# 1.5.0 (May 1, 2017) + +- FEAT: support for `"hello".color("blue")` (dynamic colors) + +# 1.3.2 (Nov 26, 2016) + +- FIX: usage of nested ColoredString again, no more style broken mid-line + +# 1.3.1 (Oct 14, 2016) + +- FIX: usage of ColoredString in a nested way broke the styling mid-line + +# 1.3.0 (Jul 31, 2016) + +- Provide various options for disabling the coloring in an API-compatible way + +# 1.2.0 (Mar 30, 2016) + +- Support the different formatting options, like padding and alignment + +# 1.1.0 (Mar 15, 2016) + +- Respect the CLICOLOR/CLICOLOR\_FORCE behavior. See [this specs](http://bixense.com/clicolors/) + +# 1.0.1 (Mar 14, 2016) + +- Add a CHANGLOG +- Fix crate dependencies: move `ansi_term` in dev\_dependencies + +# 1.0.0 (Mar 13, 2016) + +- Initial release diff --git a/vendor/colored/Cargo.lock b/vendor/colored/Cargo.lock new file mode 100644 index 0000000000..f80ec9f3a8 --- /dev/null +++ b/vendor/colored/Cargo.lock @@ -0,0 +1,83 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +[[package]] +name = "ansi_term" +version = "0.12.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "atty" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "hermit-abi 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "colored" +version = "2.0.0" +dependencies = [ + "ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)", + "atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "rspec 1.0.0-beta.3 (registry+https://github.com/rust-lang/crates.io-index)", + "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", +] + +[[package]] +name = "hermit-abi" +version = "0.1.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "libc 0.2.72 (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.72" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "rspec" +version = "1.0.0-beta.3" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[[package]] +name = "winapi" +version = "0.3.9" +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-x86_64-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" + +[metadata] +"checksum ansi_term 0.12.1 (registry+https://github.com/rust-lang/crates.io-index)" = "d52a9bb7ec0cf484c551830a7ce27bd20d67eac647e1befb56b0be4ee39a55d2" +"checksum atty 0.2.14 (registry+https://github.com/rust-lang/crates.io-index)" = "d9b39be18770d11421cdb1b9947a45dd3f37e93092cbf377614828a319d5fee8" +"checksum hermit-abi 0.1.15 (registry+https://github.com/rust-lang/crates.io-index)" = "3deed196b6e7f9e44a2ae8d94225d80302d81208b1bb673fd21fe634645c85a9" +"checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +"checksum libc 0.2.72 (registry+https://github.com/rust-lang/crates.io-index)" = "a9f8082297d534141b30c8d39e9b1773713ab50fdbe4ff30f750d063b3bfd701" +"checksum rspec 1.0.0-beta.3 (registry+https://github.com/rust-lang/crates.io-index)" = "292964ba6cf097dd3a1fc94c286c8eabf74a0afe709d059d2370e4f1fc766ae2" +"checksum winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)" = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +"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/colored/Cargo.toml b/vendor/colored/Cargo.toml new file mode 100644 index 0000000000..3a6b59be6b --- /dev/null +++ b/vendor/colored/Cargo.toml @@ -0,0 +1,39 @@ +# 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 = "colored" +version = "2.0.0" +authors = ["Thomas Wickham "] +description = "The most simple way to add colors in your terminal" +homepage = "https://github.com/mackwic/colored" +readme = "README.md" +keywords = ["color", "string", "term", "ansi_term", "term-painter"] +license = "MPL-2.0" +repository = "https://github.com/mackwic/colored" +[dependencies.atty] +version = "0.2" + +[dependencies.lazy_static] +version = "1" +[dev-dependencies.ansi_term] +version = "0.12" + +[dev-dependencies.rspec] +version = "=1.0.0-beta.3" + +[features] +no-color = [] +[target."cfg(windows)".dependencies.winapi] +version = "0.3" +features = ["consoleapi", "processenv", "winbase"] +default-features = false diff --git a/vendor/colored/Dockerfile b/vendor/colored/Dockerfile new file mode 100755 index 0000000000..1bc5ba71b7 --- /dev/null +++ b/vendor/colored/Dockerfile @@ -0,0 +1,9 @@ +FROM rust:latest + +ENV SRC_DIR /src +RUN mkdir $SRC_DIR +WORKDIR $SRC_DIR +VOLUME $SRC_DIR + +CMD ["/bin/bash"] + diff --git a/vendor/colored/LICENSE b/vendor/colored/LICENSE new file mode 100755 index 0000000000..14e2f777f6 --- /dev/null +++ b/vendor/colored/LICENSE @@ -0,0 +1,373 @@ +Mozilla Public License Version 2.0 +================================== + +1. Definitions +-------------- + +1.1. "Contributor" + means each individual or legal entity that creates, contributes to + the creation of, or owns Covered Software. + +1.2. "Contributor Version" + means the combination of the Contributions of others (if any) used + by a Contributor and that particular Contributor's Contribution. + +1.3. "Contribution" + means Covered Software of a particular Contributor. + +1.4. "Covered Software" + means Source Code Form to which the initial Contributor has attached + the notice in Exhibit A, the Executable Form of such Source Code + Form, and Modifications of such Source Code Form, in each case + including portions thereof. + +1.5. "Incompatible With Secondary Licenses" + means + + (a) that the initial Contributor has attached the notice described + in Exhibit B to the Covered Software; or + + (b) that the Covered Software was made available under the terms of + version 1.1 or earlier of the License, but not also under the + terms of a Secondary License. + +1.6. "Executable Form" + means any form of the work other than Source Code Form. + +1.7. "Larger Work" + means a work that combines Covered Software with other material, in + a separate file or files, that is not Covered Software. + +1.8. "License" + means this document. + +1.9. "Licensable" + means having the right to grant, to the maximum extent possible, + whether at the time of the initial grant or subsequently, any and + all of the rights conveyed by this License. + +1.10. "Modifications" + means any of the following: + + (a) any file in Source Code Form that results from an addition to, + deletion from, or modification of the contents of Covered + Software; or + + (b) any new file in Source Code Form that contains any Covered + Software. + +1.11. "Patent Claims" of a Contributor + means any patent claim(s), including without limitation, method, + process, and apparatus claims, in any patent Licensable by such + Contributor that would be infringed, but for the grant of the + License, by the making, using, selling, offering for sale, having + made, import, or transfer of either its Contributions or its + Contributor Version. + +1.12. "Secondary License" + means either the GNU General Public License, Version 2.0, the GNU + Lesser General Public License, Version 2.1, the GNU Affero General + Public License, Version 3.0, or any later versions of those + licenses. + +1.13. "Source Code Form" + means the form of the work preferred for making modifications. + +1.14. "You" (or "Your") + means an individual or a legal entity exercising rights under this + License. For legal entities, "You" includes any entity that + controls, is controlled by, or is under common control with You. For + purposes of this definition, "control" means (a) the power, direct + or indirect, to cause the direction or management of such entity, + whether by contract or otherwise, or (b) ownership of more than + fifty percent (50%) of the outstanding shares or beneficial + ownership of such entity. + +2. License Grants and Conditions +-------------------------------- + +2.1. Grants + +Each Contributor hereby grants You a world-wide, royalty-free, +non-exclusive license: + +(a) under intellectual property rights (other than patent or trademark) + Licensable by such Contributor to use, reproduce, make available, + modify, display, perform, distribute, and otherwise exploit its + Contributions, either on an unmodified basis, with Modifications, or + as part of a Larger Work; and + +(b) under Patent Claims of such Contributor to make, use, sell, offer + for sale, have made, import, and otherwise transfer either its + Contributions or its Contributor Version. + +2.2. Effective Date + +The licenses granted in Section 2.1 with respect to any Contribution +become effective for each Contribution on the date the Contributor first +distributes such Contribution. + +2.3. Limitations on Grant Scope + +The licenses granted in this Section 2 are the only rights granted under +this License. No additional rights or licenses will be implied from the +distribution or licensing of Covered Software under this License. +Notwithstanding Section 2.1(b) above, no patent license is granted by a +Contributor: + +(a) for any code that a Contributor has removed from Covered Software; + or + +(b) for infringements caused by: (i) Your and any other third party's + modifications of Covered Software, or (ii) the combination of its + Contributions with other software (except as part of its Contributor + Version); or + +(c) under Patent Claims infringed by Covered Software in the absence of + its Contributions. + +This License does not grant any rights in the trademarks, service marks, +or logos of any Contributor (except as may be necessary to comply with +the notice requirements in Section 3.4). + +2.4. Subsequent Licenses + +No Contributor makes additional grants as a result of Your choice to +distribute the Covered Software under a subsequent version of this +License (see Section 10.2) or under the terms of a Secondary License (if +permitted under the terms of Section 3.3). + +2.5. Representation + +Each Contributor represents that the Contributor believes its +Contributions are its original creation(s) or it has sufficient rights +to grant the rights to its Contributions conveyed by this License. + +2.6. Fair Use + +This License is not intended to limit any rights You have under +applicable copyright doctrines of fair use, fair dealing, or other +equivalents. + +2.7. Conditions + +Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted +in Section 2.1. + +3. Responsibilities +------------------- + +3.1. Distribution of Source Form + +All distribution of Covered Software in Source Code Form, including any +Modifications that You create or to which You contribute, must be under +the terms of this License. You must inform recipients that the Source +Code Form of the Covered Software is governed by the terms of this +License, and how they can obtain a copy of this License. You may not +attempt to alter or restrict the recipients' rights in the Source Code +Form. + +3.2. Distribution of Executable Form + +If You distribute Covered Software in Executable Form then: + +(a) such Covered Software must also be made available in Source Code + Form, as described in Section 3.1, and You must inform recipients of + the Executable Form how they can obtain a copy of such Source Code + Form by reasonable means in a timely manner, at a charge no more + than the cost of distribution to the recipient; and + +(b) You may distribute such Executable Form under the terms of this + License, or sublicense it under different terms, provided that the + license for the Executable Form does not attempt to limit or alter + the recipients' rights in the Source Code Form under this License. + +3.3. Distribution of a Larger Work + +You may create and distribute a Larger Work under terms of Your choice, +provided that You also comply with the requirements of this License for +the Covered Software. If the Larger Work is a combination of Covered +Software with a work governed by one or more Secondary Licenses, and the +Covered Software is not Incompatible With Secondary Licenses, this +License permits You to additionally distribute such Covered Software +under the terms of such Secondary License(s), so that the recipient of +the Larger Work may, at their option, further distribute the Covered +Software under the terms of either this License or such Secondary +License(s). + +3.4. Notices + +You may not remove or alter the substance of any license notices +(including copyright notices, patent notices, disclaimers of warranty, +or limitations of liability) contained within the Source Code Form of +the Covered Software, except that You may alter any license notices to +the extent required to remedy known factual inaccuracies. + +3.5. Application of Additional Terms + +You may choose to offer, and to charge a fee for, warranty, support, +indemnity or liability obligations to one or more recipients of Covered +Software. However, You may do so only on Your own behalf, and not on +behalf of any Contributor. You must make it absolutely clear that any +such warranty, support, indemnity, or liability obligation is offered by +You alone, and You hereby agree to indemnify every Contributor for any +liability incurred by such Contributor as a result of warranty, support, +indemnity or liability terms You offer. You may include additional +disclaimers of warranty and limitations of liability specific to any +jurisdiction. + +4. Inability to Comply Due to Statute or Regulation +--------------------------------------------------- + +If it is impossible for You to comply with any of the terms of this +License with respect to some or all of the Covered Software due to +statute, judicial order, or regulation then You must: (a) comply with +the terms of this License to the maximum extent possible; and (b) +describe the limitations and the code they affect. Such description must +be placed in a text file included with all distributions of the Covered +Software under this License. Except to the extent prohibited by statute +or regulation, such description must be sufficiently detailed for a +recipient of ordinary skill to be able to understand it. + +5. Termination +-------------- + +5.1. The rights granted under this License will terminate automatically +if You fail to comply with any of its terms. However, if You become +compliant, then the rights granted under this License from a particular +Contributor are reinstated (a) provisionally, unless and until such +Contributor explicitly and finally terminates Your grants, and (b) on an +ongoing basis, if such Contributor fails to notify You of the +non-compliance by some reasonable means prior to 60 days after You have +come back into compliance. Moreover, Your grants from a particular +Contributor are reinstated on an ongoing basis if such Contributor +notifies You of the non-compliance by some reasonable means, this is the +first time You have received notice of non-compliance with this License +from such Contributor, and You become compliant prior to 30 days after +Your receipt of the notice. + +5.2. If You initiate litigation against any entity by asserting a patent +infringement claim (excluding declaratory judgment actions, +counter-claims, and cross-claims) alleging that a Contributor Version +directly or indirectly infringes any patent, then the rights granted to +You by any and all Contributors for the Covered Software under Section +2.1 of this License shall terminate. + +5.3. In the event of termination under Sections 5.1 or 5.2 above, all +end user license agreements (excluding distributors and resellers) which +have been validly granted by You or Your distributors under this License +prior to termination shall survive termination. + +************************************************************************ +* * +* 6. Disclaimer of Warranty * +* ------------------------- * +* * +* Covered Software is provided under this License on an "as is" * +* basis, without warranty of any kind, either expressed, implied, or * +* statutory, including, without limitation, warranties that the * +* Covered Software is free of defects, merchantable, fit for a * +* particular purpose or non-infringing. The entire risk as to the * +* quality and performance of the Covered Software is with You. * +* Should any Covered Software prove defective in any respect, You * +* (not any Contributor) assume the cost of any necessary servicing, * +* repair, or correction. This disclaimer of warranty constitutes an * +* essential part of this License. No use of any Covered Software is * +* authorized under this License except under this disclaimer. * +* * +************************************************************************ + +************************************************************************ +* * +* 7. Limitation of Liability * +* -------------------------- * +* * +* Under no circumstances and under no legal theory, whether tort * +* (including negligence), contract, or otherwise, shall any * +* Contributor, or anyone who distributes Covered Software as * +* permitted above, be liable to You for any direct, indirect, * +* special, incidental, or consequential damages of any character * +* including, without limitation, damages for lost profits, loss of * +* goodwill, work stoppage, computer failure or malfunction, or any * +* and all other commercial damages or losses, even if such party * +* shall have been informed of the possibility of such damages. This * +* limitation of liability shall not apply to liability for death or * +* personal injury resulting from such party's negligence to the * +* extent applicable law prohibits such limitation. Some * +* jurisdictions do not allow the exclusion or limitation of * +* incidental or consequential damages, so this exclusion and * +* limitation may not apply to You. * +* * +************************************************************************ + +8. Litigation +------------- + +Any litigation relating to this License may be brought only in the +courts of a jurisdiction where the defendant maintains its principal +place of business and such litigation shall be governed by laws of that +jurisdiction, without reference to its conflict-of-law provisions. +Nothing in this Section shall prevent a party's ability to bring +cross-claims or counter-claims. + +9. Miscellaneous +---------------- + +This License represents the complete agreement concerning the subject +matter hereof. If any provision of this License is held to be +unenforceable, such provision shall be reformed only to the extent +necessary to make it enforceable. Any law or regulation which provides +that the language of a contract shall be construed against the drafter +shall not be used to construe this License against a Contributor. + +10. Versions of the License +--------------------------- + +10.1. New Versions + +Mozilla Foundation is the license steward. Except as provided in Section +10.3, no one other than the license steward has the right to modify or +publish new versions of this License. Each version will be given a +distinguishing version number. + +10.2. Effect of New Versions + +You may distribute the Covered Software under the terms of the version +of the License under which You originally received the Covered Software, +or under the terms of any subsequent version published by the license +steward. + +10.3. Modified Versions + +If you create software not governed by this License, and you want to +create a new license for such software, you may create and use a +modified version of this License if you rename the license and remove +any references to the name of the license steward (except to note that +such modified license differs from this License). + +10.4. Distributing Source Code Form that is Incompatible With Secondary +Licenses + +If You choose to distribute Source Code Form that is Incompatible With +Secondary Licenses under the terms of this version of the License, the +notice described in Exhibit B of this License must be attached. + +Exhibit A - Source Code Form License Notice +------------------------------------------- + + This Source Code Form is subject to the terms of the Mozilla Public + License, v. 2.0. If a copy of the MPL was not distributed with this + file, You can obtain one at http://mozilla.org/MPL/2.0/. + +If it is not possible or desirable to put the notice in a particular +file, then You may include the notice in a location (such as a LICENSE +file in a relevant directory) where a recipient would be likely to look +for such a notice. + +You may add additional accurate notices of copyright ownership. + +Exhibit B - "Incompatible With Secondary Licenses" Notice +--------------------------------------------------------- + + This Source Code Form is "Incompatible With Secondary Licenses", as + defined by the Mozilla Public License, v. 2.0. diff --git a/vendor/colored/README.md b/vendor/colored/README.md new file mode 100755 index 0000000000..5d508e7939 --- /dev/null +++ b/vendor/colored/README.md @@ -0,0 +1,184 @@ +# Colored + +[![Build +Status](https://travis-ci.org/mackwic/colored.svg?branch=master)](https://travis-ci.org/mackwic/colored) [![Crates.io](https://img.shields.io/crates/v/colored.svg?maxAge=2592000)](https://crates.io/crates/colored) [![Crates.io](https://img.shields.io/crates/l/colored.svg?maxAge=2592000)](https://github.com/mackwic/colored/blob/master/LICENSE) + +Coloring terminal so simple, you already know how to do it! + +```rust + "this is blue".blue(); + "this is red".red(); + "this is red on blue".red().on_blue(); + "this is also red on blue".on_blue().red(); + "you can use truecolor values too!".truecolor(0, 255, 136); + "background truecolor also works :)".on_truecolor(135, 28, 167); + "bright colors are welcome as well".on_bright_blue().bright_red(); + "you can also make bold comments".bold(); + println!("{} {} {}", "or use".cyan(), "any".italic().yellow(), "string type".cyan()); + "or change advice. This is red".yellow().blue().red(); + "or clear things up. This is default color and style".red().bold().clear(); + "purple and magenta are the same".purple().magenta(); + "and so are normal and clear".normal().clear(); + "you can specify color by string".color("blue").on_color("red"); + String::from("this also works!").green().bold(); + format!("{:30}", "format works as expected. This will be padded".blue()); + format!("{:.3}", "and this will be green but truncated to 3 chars".green()); +``` + +## How to use + +Add this in your `Cargo.toml`: + +```toml +[dependencies] +colored = "2" +``` + +and add this to your `lib.rs` or `main.rs`: + +```rust + extern crate colored; // not needed in Rust 2018 + + use colored::*; + + // test the example with `cargo run --example most_simple` + fn main() { + // TADAA! + println!("{} {} !", "it".green(), "works".blue().bold()); + } +``` + +## Features + +- Safe rust, easy to use, minimal dependencies, complete test suite +- Respect the `CLICOLOR`/`CLICOLOR_FORCE` behavior (see [the specs](http://bixense.com/clicolors/)) +- Respect the `NO_COLOR` behavior (see [the specs](https://no-color.org/)) +- Works on Linux, MacOS, and Windows (Powershell) + +#### Colors: + +- black +- red +- green +- yellow +- blue +- magenta (or purple) +- cyan +- white + +Bright colors: prepend the color by `bright_`. So easy. +Background colors: prepend the color by `on_`. Simple as that. +Bright Background colors: prepend the color by `on_bright_`. Not hard at all. + +#### Truecolors + +Colored has support for truecolors where you can specify any arbitrary rgb value. + +This feature will only work correctly in terminals which support true colors (i.e. most modern terminals). + +You can check if your terminal supports true color by checking the value of the environment variable `$COLORTERM` on your terminal. A value of `truecolor` or `24bit` indicates that it will work. + +#### Styles: + +- bold +- underline +- italic +- dimmed +- reversed +- blink +- hidden +- strikethrough + +You can clear color _and_ style anytime by using `normal()` or `clear()` + +#### Advanced Control: + +##### Dynamic color from str + +As `Color` implements `FromStr`, `From<&str>`, and `From`, you can easily cast a string into a color like that: + +```rust +// the easy way +"blue string yo".color("blue"); + +// this will default to white +"white string".color("zorglub"); + +// the safer way via a Result +let color_res : Result = "zorglub".parse(); +"red string".color(color_res.unwrap_or(Color::Red)); +``` + + +##### Colorization control + +If you want to disable any coloring at compile time, you can simply do so by +using the `no-color` feature. + +For example, you can do this in your `Cargo.toml` to disable color in tests: + +```toml +[features] +# this effectively enable the feature `no-color` of colored when testing with +# `cargo test --feature dumb_terminal` +dumb_terminal = ["colored/no-color"] +``` + +You can use have even finer control by using the +`colored::control::set_override` method. + +## Build with Docker + +### Install Docker + +Use the install instructions located [here](https://docs.docker.com/v17.12/install/) + +### Build the Docker image + +```docker build -t colored_image .``` + +### Build the library + +```docker run --rm -it -v "$PWD":/src -u `id -u`:`id -g` colored_image /bin/bash -c "cargo build"``` + +### Test the library + +```docker run --rm -it -v "$PWD":/src -u `id -u`:`id -g` colored_image /bin/bash -c "cargo test"``` + + +## Todo + +- **More tests ?**: We always welcome more tests! Please contribute! + +## Credits + +This library wouldn't have been the same without the marvelous ruby gem [colored](https://github.com/defunkt/colored). + +Thanks for the [ansi\_term crate](https://github.com/ogham/rust-ansi-term) for +providing a reference implementation, which greatly helped making this crate +output correct strings. + +## License + +[Mozilla Public License 2.0](https://www.mozilla.org/en-US/MPL/2.0/). See the +[LICENSE](https://github.com/mackwic/colored/blob/master/LICENSE) file at the +root of the repository. + +In non legal terms it means that: +- if you fix a bug, you MUST give me the code of the fix (it's only fair) +- if you change/extend the API, you MUST give me the code you changed in the + files under MPL2. +- you CAN'T sue me for anything about this code +- apart from that, you can do almost whatever you want. See the LICENSE file + for details. + +## Contributors + +- Thomas Wickham: [@mackwic](https://github.com/mackwic) +- Corey "See More" Richardson: [@cmr](https://github.com/cmr) +- Iban Eguia: [@Razican](https://github.com/Razican) +- Alexis "Horgix" Chotard: [@horgix](https://github.com/horgix) +- Keith Yeung: [@KiChjang](https://github.com/KiChjang) +- Kyle Galloway: [@kylegalloway](https://github.com/kylegalloway) +- Luke Hsiao: [@lukehsiao](https://github.com/lukehsiao) +- kurtlawrence: [@kurtlawrence](https://github.com/kurtlawrence) diff --git a/vendor/colored/examples/control.rs b/vendor/colored/examples/control.rs new file mode 100755 index 0000000000..b50b42691e --- /dev/null +++ b/vendor/colored/examples/control.rs @@ -0,0 +1,53 @@ +extern crate colored; +use colored::*; + +#[cfg(not(windows))] +fn main() { + both() +} + +#[cfg(windows)] +fn main() { + both(); + + // additional control setting using windows set_virtual_terminal + colored::control::set_virtual_terminal(true); + println!("{}", "stdout: Virtual Terminal is in use".bright_green()); + colored::control::set_virtual_terminal(false); + println!( + "{}", + "stderr: Virtual Terminal is NOT in use, escape chars should be visible".bright_red() + ); + colored::control::set_virtual_terminal(true); + println!( + "{}", + "stdout: Virtual Terminal is in use AGAIN and should be green!".bright_green() + ); + colored::control::set_virtual_terminal(true); + + // again with stderr + eprintln!("{}", "stderr: Virtual Terminal is in use".bright_green()); + colored::control::set_virtual_terminal(false); + eprintln!( + "{}", + "stderr: Virtual Terminal is NOT in use, escape chars should be visible".bright_red() + ); + colored::control::set_virtual_terminal(true); + eprintln!( + "{}", + "stderr: Virtual Terminal is in use AGAIN and should be green!".bright_green() + ); +} + +fn both() { + // this will be yellow if your environment allow it + println!("{}", "some warning".yellow()); + // now , this will be always yellow + colored::control::set_override(true); + println!("{}", "some warning".yellow()); + // now, this will be never yellow + colored::control::set_override(false); + println!("{}", "some warning".yellow()); + // let the environment decide again + colored::control::unset_override(); +} diff --git a/vendor/colored/examples/dynamic_colors.rs b/vendor/colored/examples/dynamic_colors.rs new file mode 100755 index 0000000000..d9861f425c --- /dev/null +++ b/vendor/colored/examples/dynamic_colors.rs @@ -0,0 +1,14 @@ +extern crate colored; +use colored::*; + +fn main() { + // the easy way + "blue string yo".color("blue"); + + // this will default to white + "white string".color("zorglub"); + + // the safer way via a Result + let color_res = "zorglub".parse(); // <- this returns a Result + "red string".color(color_res.unwrap_or(Color::Red)); +} diff --git a/vendor/colored/examples/most_simple.rs b/vendor/colored/examples/most_simple.rs new file mode 100755 index 0000000000..b94a2b36a3 --- /dev/null +++ b/vendor/colored/examples/most_simple.rs @@ -0,0 +1,24 @@ +extern crate colored; + +use colored::*; + +fn main() { + // TADAA ! + println!( + "{} {} {}!", + "it".green(), + "works".blue().bold(), + "great".bold().yellow() + ); + + println!("{}", String::from("this also works!").green().bold()); + + let mut s = String::new(); + s.push_str(&"why not ".red().to_string()); + s.push_str(&"push things ".blue().to_string()); + s.push_str(&"a little further ?".green().to_string()); + println!("{}", s); + + let s = format!("{} {} {}", "this".red(), "is".blue(), "easier".green()); + println!("{}", s); +} diff --git a/vendor/colored/examples/nested_colors.rs b/vendor/colored/examples/nested_colors.rs new file mode 100755 index 0000000000..de11249161 --- /dev/null +++ b/vendor/colored/examples/nested_colors.rs @@ -0,0 +1,16 @@ +extern crate colored; + +use colored::*; + +/* + * This example use colored strings in a nested way (at line 14). It shows that colored is able to + * keep the correct color on the “!lalalala” part. + */ + +fn main() { + let world = "world".bold(); + let hello_world = format!("Hello, {}!", world); + println!("{}", hello_world); + let hello_world = format!("Hello, {}!lalalala", world).red(); + println!("{}", hello_world); +} diff --git a/vendor/colored/src/color.rs b/vendor/colored/src/color.rs new file mode 100755 index 0000000000..6e544e8fd5 --- /dev/null +++ b/vendor/colored/src/color.rs @@ -0,0 +1,215 @@ +use std::{borrow::Cow, str::FromStr}; + +/// The 8 standard colors. +#[derive(Clone, Copy, Debug, PartialEq, Eq)] +#[allow(missing_docs)] +pub enum Color { + Black, + Red, + Green, + Yellow, + Blue, + Magenta, + Cyan, + White, + BrightBlack, + BrightRed, + BrightGreen, + BrightYellow, + BrightBlue, + BrightMagenta, + BrightCyan, + BrightWhite, + TrueColor { r: u8, g: u8, b: u8 }, +} + +#[allow(missing_docs)] +impl Color { + pub fn to_fg_str(&self) -> Cow<'static, str> { + match *self { + Color::Black => "30".into(), + Color::Red => "31".into(), + Color::Green => "32".into(), + Color::Yellow => "33".into(), + Color::Blue => "34".into(), + Color::Magenta => "35".into(), + Color::Cyan => "36".into(), + Color::White => "37".into(), + Color::BrightBlack => "90".into(), + Color::BrightRed => "91".into(), + Color::BrightGreen => "92".into(), + Color::BrightYellow => "93".into(), + Color::BrightBlue => "94".into(), + Color::BrightMagenta => "95".into(), + Color::BrightCyan => "96".into(), + Color::BrightWhite => "97".into(), + Color::TrueColor { r, g, b } => format!("38;2;{};{};{}", r, g, b).into(), + } + } + + pub fn to_bg_str(&self) -> Cow<'static, str> { + match *self { + Color::Black => "40".into(), + Color::Red => "41".into(), + Color::Green => "42".into(), + Color::Yellow => "43".into(), + Color::Blue => "44".into(), + Color::Magenta => "45".into(), + Color::Cyan => "46".into(), + Color::White => "47".into(), + Color::BrightBlack => "100".into(), + Color::BrightRed => "101".into(), + Color::BrightGreen => "102".into(), + Color::BrightYellow => "103".into(), + Color::BrightBlue => "104".into(), + Color::BrightMagenta => "105".into(), + Color::BrightCyan => "106".into(), + Color::BrightWhite => "107".into(), + Color::TrueColor { r, g, b } => format!("48;2;{};{};{}", r, g, b).into(), + } + } +} + +impl<'a> From<&'a str> for Color { + fn from(src: &str) -> Self { + src.parse().unwrap_or(Color::White) + } +} + +impl From for Color { + fn from(src: String) -> Self { + src.parse().unwrap_or(Color::White) + } +} + +impl FromStr for Color { + type Err = (); + + fn from_str(src: &str) -> Result { + let src = src.to_lowercase(); + + match src.as_ref() { + "black" => Ok(Color::Black), + "red" => Ok(Color::Red), + "green" => Ok(Color::Green), + "yellow" => Ok(Color::Yellow), + "blue" => Ok(Color::Blue), + "magenta" => Ok(Color::Magenta), + "purple" => Ok(Color::Magenta), + "cyan" => Ok(Color::Cyan), + "white" => Ok(Color::White), + "bright black" => Ok(Color::BrightBlack), + "bright red" => Ok(Color::BrightRed), + "bright green" => Ok(Color::BrightGreen), + "bright yellow" => Ok(Color::BrightYellow), + "bright blue" => Ok(Color::BrightBlue), + "bright magenta" => Ok(Color::BrightMagenta), + "bright cyan" => Ok(Color::BrightCyan), + "bright white" => Ok(Color::BrightWhite), + _ => Err(()), + } + } +} + +#[cfg(test)] +mod tests { + pub use super::*; + + mod from_str { + pub use super::*; + + macro_rules! make_test { + ( $( $name:ident: $src:expr => $dst:expr),* ) => { + + $( + #[test] + fn $name() { + let color : Color = $src.into(); + assert_eq!($dst, color) + } + )* + } + } + + make_test!( + black: "black" => Color::Black, + red: "red" => Color::Red, + green: "green" => Color::Green, + yellow: "yellow" => Color::Yellow, + blue: "blue" => Color::Blue, + magenta: "magenta" => Color::Magenta, + purple: "purple" => Color::Magenta, + cyan: "cyan" => Color::Cyan, + white: "white" => Color::White, + brightblack: "bright black" => Color::BrightBlack, + brightred: "bright red" => Color::BrightRed, + brightgreen: "bright green" => Color::BrightGreen, + brightyellow: "bright yellow" => Color::BrightYellow, + brightblue: "bright blue" => Color::BrightBlue, + brightmagenta: "bright magenta" => Color::BrightMagenta, + brightcyan: "bright cyan" => Color::BrightCyan, + brightwhite: "bright white" => Color::BrightWhite, + + invalid: "invalid" => Color::White, + capitalized: "BLUE" => Color::Blue, + mixed_case: "bLuE" => Color::Blue + ); + } + + mod from_string { + pub use super::*; + + macro_rules! make_test { + ( $( $name:ident: $src:expr => $dst:expr),* ) => { + + $( + #[test] + fn $name() { + let src = String::from($src); + let color : Color = src.into(); + assert_eq!($dst, color) + } + )* + } + } + + make_test!( + black: "black" => Color::Black, + red: "red" => Color::Red, + green: "green" => Color::Green, + yellow: "yellow" => Color::Yellow, + blue: "blue" => Color::Blue, + magenta: "magenta" => Color::Magenta, + cyan: "cyan" => Color::Cyan, + white: "white" => Color::White, + brightblack: "bright black" => Color::BrightBlack, + brightred: "bright red" => Color::BrightRed, + brightgreen: "bright green" => Color::BrightGreen, + brightyellow: "bright yellow" => Color::BrightYellow, + brightblue: "bright blue" => Color::BrightBlue, + brightmagenta: "bright magenta" => Color::BrightMagenta, + brightcyan: "bright cyan" => Color::BrightCyan, + brightwhite: "bright white" => Color::BrightWhite, + + invalid: "invalid" => Color::White, + capitalized: "BLUE" => Color::Blue, + mixed_case: "bLuE" => Color::Blue + ); + } + + mod fromstr { + pub use super::*; + + #[test] + fn parse() { + let color: Result = "blue".parse(); + assert_eq!(Ok(Color::Blue), color) + } + + #[test] + fn error() { + let color: Result = "bloublou".parse(); + assert_eq!(Err(()), color) + } + } +} diff --git a/vendor/colored/src/control.rs b/vendor/colored/src/control.rs new file mode 100755 index 0000000000..7ad6e621e4 --- /dev/null +++ b/vendor/colored/src/control.rs @@ -0,0 +1,411 @@ +//! A couple of functions to enable and disable coloring. + +use std::default::Default; +use std::env; +use std::sync::atomic::{AtomicBool, Ordering}; + +/// Sets a flag to the console to use a virtual terminal environment. +/// +/// This is primarily used for Windows 10 environments which will not correctly colorize +/// the outputs based on ANSI escape codes. +/// +/// The returned `Result` is _always_ `Ok(())`, the return type was kept to ensure backwards +/// compatibility. +/// +/// # Notes +/// > Only available to `Windows` build targets. +/// +/// # Example +/// ```rust +/// use colored::*; +/// control::set_virtual_terminal(false).unwrap(); +/// println!("{}", "bright cyan".bright_cyan()); // will print 'bright cyan' on windows 10 +/// +/// control::set_virtual_terminal(true).unwrap(); +/// println!("{}", "bright cyan".bright_cyan()); // will print correctly +/// ``` +#[cfg(windows)] +pub fn set_virtual_terminal(use_virtual: bool) -> Result<(), ()> { + use winapi::{ + shared::minwindef::DWORD, + um::{ + consoleapi::{GetConsoleMode, SetConsoleMode}, + processenv::GetStdHandle, + winbase::STD_OUTPUT_HANDLE, + wincon::ENABLE_VIRTUAL_TERMINAL_PROCESSING, + }, + }; + + unsafe { + let handle = GetStdHandle(STD_OUTPUT_HANDLE); + let mut original_mode: DWORD = 0; + GetConsoleMode(handle, &mut original_mode); + + let enabled = original_mode & ENABLE_VIRTUAL_TERMINAL_PROCESSING + == ENABLE_VIRTUAL_TERMINAL_PROCESSING; + + match (use_virtual, enabled) { + // not enabled, should be enabled + (true, false) => { + SetConsoleMode(handle, ENABLE_VIRTUAL_TERMINAL_PROCESSING | original_mode) + } + // already enabled, should be disabled + (false, true) => { + SetConsoleMode(handle, ENABLE_VIRTUAL_TERMINAL_PROCESSING ^ original_mode) + } + _ => 0, + }; + } + + Ok(()) +} + +/// A flag to to if coloring should occur. +pub struct ShouldColorize { + clicolor: bool, + clicolor_force: Option, + // XXX we can't use Option because we can't use &mut references to ShouldColorize + has_manual_override: AtomicBool, + manual_override: AtomicBool, +} + +/// Use this to force colored to ignore the environment and always/never colorize +/// See example/control.rs +pub fn set_override(override_colorize: bool) { + SHOULD_COLORIZE.set_override(override_colorize) +} + +/// Remove the manual override and let the environment decide if it's ok to colorize +/// See example/control.rs +pub fn unset_override() { + SHOULD_COLORIZE.unset_override() +} + +lazy_static! { +/// The persistent [`ShouldColorize`]. + pub static ref SHOULD_COLORIZE: ShouldColorize = ShouldColorize::from_env(); +} + +impl Default for ShouldColorize { + fn default() -> ShouldColorize { + ShouldColorize { + clicolor: true, + clicolor_force: None, + has_manual_override: AtomicBool::new(false), + manual_override: AtomicBool::new(false), + } + } +} + +impl ShouldColorize { + /// Reads environment variables and checks if output is a tty to determine + /// whether colorization should be used or not. + /// `CLICOLOR_FORCE` takes highest priority, followed by `NO_COLOR`, + /// followed by `CLICOLOR` combined with tty check. + pub fn from_env() -> Self { + ShouldColorize { + clicolor: ShouldColorize::normalize_env(env::var("CLICOLOR")).unwrap_or_else(|| true) + && atty::is(atty::Stream::Stdout), + clicolor_force: ShouldColorize::resolve_clicolor_force( + env::var("NO_COLOR"), + env::var("CLICOLOR_FORCE"), + ), + ..ShouldColorize::default() + } + } + + /// Returns if the current coloring is expected. + pub fn should_colorize(&self) -> bool { + if self.has_manual_override.load(Ordering::Relaxed) { + return self.manual_override.load(Ordering::Relaxed); + } + + if let Some(forced_value) = self.clicolor_force { + return forced_value; + } + + self.clicolor + } + + /// Use this to force colored to ignore the environment and always/never colorize + pub fn set_override(&self, override_colorize: bool) { + self.has_manual_override.store(true, Ordering::Relaxed); + self.manual_override + .store(override_colorize, Ordering::Relaxed); + } + + /// Remove the manual override and let the environment decide if it's ok to colorize + pub fn unset_override(&self) { + self.has_manual_override.store(false, Ordering::Relaxed); + } + + /* private */ + + fn normalize_env(env_res: Result) -> Option { + match env_res { + Ok(string) => Some(string != "0"), + Err(_) => None, + } + } + + fn resolve_clicolor_force( + no_color: Result, + clicolor_force: Result, + ) -> Option { + if ShouldColorize::normalize_env(clicolor_force) == Some(true) { + Some(true) + } else if ShouldColorize::normalize_env(no_color).is_some() { + Some(false) + } else { + None + } + } +} + +#[cfg(test)] +mod specs { + use super::*; + use rspec; + use rspec::context::*; + use std::env; + + #[test] + fn clicolor_behavior() { + use std::io; + + let stdout = &mut io::stdout(); + let mut formatter = rspec::formatter::Simple::new(stdout); + let mut runner = describe("ShouldColorize", |ctx| { + ctx.describe("::normalize_env", |ctx| { + ctx.it("should return None if error", || { + assert_eq!( + None, + ShouldColorize::normalize_env(Err(env::VarError::NotPresent)) + ); + assert_eq!( + None, + ShouldColorize::normalize_env(Err(env::VarError::NotUnicode("".into()))) + ) + }); + + ctx.it("should return Some(true) if != 0", || { + Some(true) == ShouldColorize::normalize_env(Ok(String::from("1"))) + }); + + ctx.it("should return Some(false) if == 0", || { + Some(false) == ShouldColorize::normalize_env(Ok(String::from("0"))) + }); + }); + + ctx.describe("::resolve_clicolor_force", |ctx| { + ctx.it( + "should return None if NO_COLOR is not set and CLICOLOR_FORCE is not set or set to 0", + || { + assert_eq!( + None, + ShouldColorize::resolve_clicolor_force( + Err(env::VarError::NotPresent), + Err(env::VarError::NotPresent) + ) + ); + assert_eq!( + None, + ShouldColorize::resolve_clicolor_force( + Err(env::VarError::NotPresent), + Ok(String::from("0")), + ) + ); + }, + ); + + ctx.it( + "should return Some(false) if NO_COLOR is set and CLICOLOR_FORCE is not enabled", + || { + assert_eq!( + Some(false), + ShouldColorize::resolve_clicolor_force( + Ok(String::from("0")), + Err(env::VarError::NotPresent) + ) + ); + assert_eq!( + Some(false), + ShouldColorize::resolve_clicolor_force( + Ok(String::from("1")), + Err(env::VarError::NotPresent) + ) + ); + assert_eq!( + Some(false), + ShouldColorize::resolve_clicolor_force( + Ok(String::from("1")), + Ok(String::from("0")), + ) + ); + }, + ); + + ctx.it( + "should prioritize CLICOLOR_FORCE over NO_COLOR if CLICOLOR_FORCE is set to non-zero value", + || { + assert_eq!( + Some(true), + ShouldColorize::resolve_clicolor_force( + Ok(String::from("1")), + Ok(String::from("1")), + ) + ); + assert_eq!( + Some(false), + ShouldColorize::resolve_clicolor_force( + Ok(String::from("1")), + Ok(String::from("0")), + ) + ); + assert_eq!( + Some(true), + ShouldColorize::resolve_clicolor_force( + Err(env::VarError::NotPresent), + Ok(String::from("1")), + ) + ); + }, + ); + }); + + ctx.describe("constructors", |ctx| { + ctx.it("should have a default constructor", || { + ShouldColorize::default(); + }); + + ctx.it("should have an environment constructor", || { + ShouldColorize::from_env(); + }); + }); + + ctx.describe("when only changing clicolors", |ctx| { + ctx.it("clicolor == false means no colors", || { + let colorize_control = ShouldColorize { + clicolor: false, + ..ShouldColorize::default() + }; + false == colorize_control.should_colorize() + }); + + ctx.it("clicolor == true means colors !", || { + let colorize_control = ShouldColorize { + clicolor: true, + ..ShouldColorize::default() + }; + true == colorize_control.should_colorize() + }); + + ctx.it("unset clicolors implies true", || { + true == ShouldColorize::default().should_colorize() + }); + }); + + ctx.describe("when using clicolor_force", |ctx| { + ctx.it( + "clicolor_force should force to true no matter clicolor", + || { + let colorize_control = ShouldColorize { + clicolor: false, + clicolor_force: Some(true), + ..ShouldColorize::default() + }; + + true == colorize_control.should_colorize() + }, + ); + + ctx.it( + "clicolor_force should force to false no matter clicolor", + || { + let colorize_control = ShouldColorize { + clicolor: true, + clicolor_force: Some(false), + ..ShouldColorize::default() + }; + + false == colorize_control.should_colorize() + }, + ); + }); + + ctx.describe("using a manual override", |ctx| { + ctx.it("shoud colorize if manual_override is true, but clicolor is false and clicolor_force also false", || { + let colorize_control = ShouldColorize { + clicolor: false, + clicolor_force: None, + has_manual_override: AtomicBool::new(true), + manual_override: AtomicBool::new(true), + .. ShouldColorize::default() + }; + + true == colorize_control.should_colorize() + }); + + ctx.it("should not colorize if manual_override is false, but clicolor is true or clicolor_force is true", || { + let colorize_control = ShouldColorize { + clicolor: true, + clicolor_force: Some(true), + has_manual_override: AtomicBool::new(true), + manual_override: AtomicBool::new(false), + .. ShouldColorize::default() + }; + + false == colorize_control.should_colorize() + }) + }); + + ctx.describe("::set_override", |ctx| { + ctx.it("should exists", || { + let colorize_control = ShouldColorize::default(); + colorize_control.set_override(true); + }); + + ctx.it("set the manual_override property", || { + let colorize_control = ShouldColorize::default(); + colorize_control.set_override(true); + { + assert_eq!( + true, + colorize_control.has_manual_override.load(Ordering::Relaxed) + ); + let val = colorize_control.manual_override.load(Ordering::Relaxed); + assert_eq!(true, val); + } + colorize_control.set_override(false); + { + assert_eq!( + true, + colorize_control.has_manual_override.load(Ordering::Relaxed) + ); + let val = colorize_control.manual_override.load(Ordering::Relaxed); + assert_eq!(false, val); + } + }); + }); + + ctx.describe("::unset_override", |ctx| { + ctx.it("should exists", || { + let colorize_control = ShouldColorize::default(); + colorize_control.unset_override(); + }); + + ctx.it("unset the manual_override property", || { + let colorize_control = ShouldColorize::default(); + colorize_control.set_override(true); + colorize_control.unset_override(); + assert_eq!( + false, + colorize_control.has_manual_override.load(Ordering::Relaxed) + ); + }); + }); + }); + runner.add_event_handler(&mut formatter); + runner.run().unwrap(); + } +} diff --git a/vendor/colored/src/formatters.rs b/vendor/colored/src/formatters.rs new file mode 100755 index 0000000000..56d5db0d80 --- /dev/null +++ b/vendor/colored/src/formatters.rs @@ -0,0 +1,15 @@ + +use color::Color; +use style::Style; + +pub trait ColoringFormatter { + fn format(out: String, fg: Color, bg: Color, style: Style) -> String; +} + +pub struct NoColor; + +impl ColoringFormatter for NoColor { + fn format(out: String, _fg: Color, _bg: Color, _style: Style) -> String { + out + } +} diff --git a/vendor/colored/src/lib.rs b/vendor/colored/src/lib.rs new file mode 100755 index 0000000000..4475320fc2 --- /dev/null +++ b/vendor/colored/src/lib.rs @@ -0,0 +1,841 @@ +//!Coloring terminal so simple, you already know how to do it ! +//! +//! use colored::Colorize; +//! +//! "this is blue".blue(); +//! "this is red".red(); +//! "this is red on blue".red().on_blue(); +//! "this is also red on blue".on_blue().red(); +//! "you can use truecolor values too!".truecolor(0, 255, 136); +//! "background truecolor also works :)".on_truecolor(135, 28, 167); +//! "you can also make bold comments".bold(); +//! println!("{} {} {}", "or use".cyan(), "any".italic().yellow(), "string type".cyan()); +//! "or change advice. This is red".yellow().blue().red(); +//! "or clear things up. This is default color and style".red().bold().clear(); +//! "purple and magenta are the same".purple().magenta(); +//! "bright colors are also allowed".bright_blue().on_bright_white(); +//! "you can specify color by string".color("blue").on_color("red"); +//! "and so are normal and clear".normal().clear(); +//! String::from("this also works!").green().bold(); +//! format!("{:30}", "format works as expected. This will be padded".blue()); +//! format!("{:.3}", "and this will be green but truncated to 3 chars".green()); +//! +//! +//! See [the `Colorize` trait](./trait.Colorize.html) for all the methods. +//! +#![warn(missing_docs)] + +extern crate atty; +#[macro_use] +extern crate lazy_static; +#[cfg(windows)] +extern crate winapi; + +#[cfg(test)] +extern crate rspec; + +mod color; +pub mod control; +mod style; + +pub use color::*; + +use std::{borrow::Cow, fmt, ops::Deref}; + +pub use style::{Style, Styles}; + +/// A string that may have color and/or style applied to it. +#[derive(Clone, Debug, PartialEq, Eq)] +pub struct ColoredString { + input: String, + fgcolor: Option, + bgcolor: Option, + style: style::Style, +} + +/// The trait that enables something to be given color. +/// +/// You can use `colored` effectively simply by importing this trait +/// and then using its methods on `String` and `&str`. +#[allow(missing_docs)] +pub trait Colorize { + // Font Colors + fn black(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::Black) + } + fn red(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::Red) + } + fn green(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::Green) + } + fn yellow(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::Yellow) + } + fn blue(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::Blue) + } + fn magenta(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::Magenta) + } + fn purple(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::Magenta) + } + fn cyan(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::Cyan) + } + fn white(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::White) + } + fn bright_black(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::BrightBlack) + } + fn bright_red(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::BrightRed) + } + fn bright_green(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::BrightGreen) + } + fn bright_yellow(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::BrightYellow) + } + fn bright_blue(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::BrightBlue) + } + fn bright_magenta(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::BrightMagenta) + } + fn bright_purple(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::BrightMagenta) + } + fn bright_cyan(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::BrightCyan) + } + fn bright_white(self) -> ColoredString + where + Self: Sized, + { + self.color(Color::BrightWhite) + } + fn truecolor(self, r: u8, g: u8, b: u8) -> ColoredString + where + Self: Sized, + { + self.color(Color::TrueColor { r, g, b }) + } + fn color>(self, color: S) -> ColoredString; + // Background Colors + fn on_black(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::Black) + } + fn on_red(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::Red) + } + fn on_green(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::Green) + } + fn on_yellow(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::Yellow) + } + fn on_blue(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::Blue) + } + fn on_magenta(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::Magenta) + } + fn on_purple(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::Magenta) + } + fn on_cyan(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::Cyan) + } + fn on_white(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::White) + } + fn on_bright_black(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::BrightBlack) + } + fn on_bright_red(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::BrightRed) + } + fn on_bright_green(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::BrightGreen) + } + fn on_bright_yellow(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::BrightYellow) + } + fn on_bright_blue(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::BrightBlue) + } + fn on_bright_magenta(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::BrightMagenta) + } + fn on_bright_purple(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::BrightMagenta) + } + fn on_bright_cyan(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::BrightCyan) + } + fn on_bright_white(self) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::BrightWhite) + } + fn on_truecolor(self, r: u8, g: u8, b: u8) -> ColoredString + where + Self: Sized, + { + self.on_color(Color::TrueColor { r, g, b }) + } + fn on_color>(self, color: S) -> ColoredString; + // Styles + fn clear(self) -> ColoredString; + fn normal(self) -> ColoredString; + fn bold(self) -> ColoredString; + fn dimmed(self) -> ColoredString; + fn italic(self) -> ColoredString; + fn underline(self) -> ColoredString; + fn blink(self) -> ColoredString; + /// Historical name of `Colorize::reversed`. May be removed in a future version. Please use + /// `Colorize::reversed` instead + fn reverse(self) -> ColoredString; + /// This should be preferred to `Colorize::reverse`. + fn reversed(self) -> ColoredString; + fn hidden(self) -> ColoredString; + fn strikethrough(self) -> ColoredString; +} + +impl ColoredString { + /// Get the current background color applied. + /// + /// ```rust + /// # use colored::*; + /// let cstr = "".blue(); + /// assert_eq!(cstr.fgcolor(), Some(Color::Blue)); + /// let cstr = cstr.clear(); + /// assert_eq!(cstr.fgcolor(), None); + /// ``` + pub fn fgcolor(&self) -> Option { + self.fgcolor.as_ref().copied() + } + + /// Get the current background color applied. + /// + /// ```rust + /// # use colored::*; + /// let cstr = "".on_blue(); + /// assert_eq!(cstr.bgcolor(), Some(Color::Blue)); + /// let cstr = cstr.clear(); + /// assert_eq!(cstr.bgcolor(), None); + /// ``` + pub fn bgcolor(&self) -> Option { + self.bgcolor.as_ref().copied() + } + + /// Get the current [`Style`] which can be check if it contains a [`Styles`]. + /// + /// ```rust + /// # use colored::*; + /// let colored = "".bold().italic(); + /// assert_eq!(colored.style().contains(Styles::Bold), true); + /// assert_eq!(colored.style().contains(Styles::Italic), true); + /// assert_eq!(colored.style().contains(Styles::Dimmed), false); + /// ``` + pub fn style(&self) -> style::Style { + self.style + } + + /// Checks if the colored string has no color or styling. + /// + /// ```rust + /// # use colored::*; + /// let cstr = "".red(); + /// assert_eq!(cstr.is_plain(), false); + /// let cstr = cstr.clear(); + /// assert_eq!(cstr.is_plain(), true); + /// ``` + pub fn is_plain(&self) -> bool { + self.bgcolor.is_none() && self.fgcolor.is_none() && self.style == style::CLEAR + } + + #[cfg(not(feature = "no-color"))] + fn has_colors(&self) -> bool { + control::SHOULD_COLORIZE.should_colorize() + } + + #[cfg(feature = "no-color")] + fn has_colors(&self) -> bool { + false + } + + fn compute_style(&self) -> String { + if !self.has_colors() || self.is_plain() { + return String::new(); + } + + let mut res = String::from("\x1B["); + let mut has_wrote = if self.style != style::CLEAR { + res.push_str(&self.style.to_str()); + true + } else { + false + }; + + if let Some(ref bgcolor) = self.bgcolor { + if has_wrote { + res.push(';'); + } + + res.push_str(&bgcolor.to_bg_str()); + has_wrote = true; + } + + if let Some(ref fgcolor) = self.fgcolor { + if has_wrote { + res.push(';'); + } + + res.push_str(&fgcolor.to_fg_str()); + } + + res.push('m'); + res + } + + fn escape_inner_reset_sequences(&self) -> Cow { + if !self.has_colors() || self.is_plain() { + return self.input.as_str().into(); + } + + // TODO: BoyScoutRule + let reset = "\x1B[0m"; + let style = self.compute_style(); + let matches: Vec = self + .input + .match_indices(reset) + .map(|(idx, _)| idx) + .collect(); + if matches.is_empty() { + return self.input.as_str().into(); + } + + let mut input = self.input.clone(); + input.reserve(matches.len() * style.len()); + + for (idx_in_matches, offset) in matches.into_iter().enumerate() { + // shift the offset to the end of the reset sequence and take in account + // the number of matches we have escaped (which shift the index to insert) + let mut offset = offset + reset.len() + idx_in_matches * style.len(); + + for cchar in style.chars() { + input.insert(offset, cchar); + offset += 1; + } + } + + input.into() + } +} + +impl Default for ColoredString { + fn default() -> Self { + ColoredString { + input: String::default(), + fgcolor: None, + bgcolor: None, + style: style::CLEAR, + } + } +} + +impl Deref for ColoredString { + type Target = str; + fn deref(&self) -> &str { + &self.input + } +} + +impl<'a> From<&'a str> for ColoredString { + fn from(s: &'a str) -> Self { + ColoredString { + input: String::from(s), + ..ColoredString::default() + } + } +} + +impl Colorize for ColoredString { + fn color>(mut self, color: S) -> ColoredString { + self.fgcolor = Some(color.into()); + self + } + fn on_color>(mut self, color: S) -> ColoredString { + self.bgcolor = Some(color.into()); + self + } + + fn clear(self) -> ColoredString { + ColoredString { + input: self.input, + ..ColoredString::default() + } + } + fn normal(self) -> ColoredString { + self.clear() + } + fn bold(mut self) -> ColoredString { + self.style.add(style::Styles::Bold); + self + } + fn dimmed(mut self) -> ColoredString { + self.style.add(style::Styles::Dimmed); + self + } + fn italic(mut self) -> ColoredString { + self.style.add(style::Styles::Italic); + self + } + fn underline(mut self) -> ColoredString { + self.style.add(style::Styles::Underline); + self + } + fn blink(mut self) -> ColoredString { + self.style.add(style::Styles::Blink); + self + } + fn reverse(self) -> ColoredString { + self.reversed() + } + fn reversed(mut self) -> ColoredString { + self.style.add(style::Styles::Reversed); + self + } + fn hidden(mut self) -> ColoredString { + self.style.add(style::Styles::Hidden); + self + } + fn strikethrough(mut self) -> ColoredString { + self.style.add(style::Styles::Strikethrough); + self + } +} + +impl<'a> Colorize for &'a str { + fn color>(self, color: S) -> ColoredString { + ColoredString { + fgcolor: Some(color.into()), + input: String::from(self), + ..ColoredString::default() + } + } + + fn on_color>(self, color: S) -> ColoredString { + ColoredString { + bgcolor: Some(color.into()), + input: String::from(self), + ..ColoredString::default() + } + } + + fn clear(self) -> ColoredString { + ColoredString { + input: String::from(self), + style: style::CLEAR, + ..ColoredString::default() + } + } + fn normal(self) -> ColoredString { + self.clear() + } + fn bold(self) -> ColoredString { + ColoredString::from(self).bold() + } + fn dimmed(self) -> ColoredString { + ColoredString::from(self).dimmed() + } + fn italic(self) -> ColoredString { + ColoredString::from(self).italic() + } + fn underline(self) -> ColoredString { + ColoredString::from(self).underline() + } + fn blink(self) -> ColoredString { + ColoredString::from(self).blink() + } + fn reverse(self) -> ColoredString { + self.reversed() + } + fn reversed(self) -> ColoredString { + ColoredString::from(self).reversed() + } + fn hidden(self) -> ColoredString { + ColoredString::from(self).hidden() + } + fn strikethrough(self) -> ColoredString { + ColoredString::from(self).strikethrough() + } +} + +impl fmt::Display for ColoredString { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + if !self.has_colors() || self.is_plain() { + return ::fmt(&self.input, f); + } + + // XXX: see tests. Useful when nesting colored strings + let escaped_input = self.escape_inner_reset_sequences(); + + f.write_str(&self.compute_style())?; + escaped_input.fmt(f)?; + f.write_str("\x1B[0m")?; + Ok(()) + } +} + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn formatting() { + // respect the formatting. Escape sequence add some padding so >= 40 + assert!(format!("{:40}", "".blue()).len() >= 40); + // both should be truncated to 1 char before coloring + assert_eq!( + format!("{:1.1}", "toto".blue()).len(), + format!("{:1.1}", "1".blue()).len() + ) + } + + #[test] + fn it_works() { + let toto = "toto"; + println!("{}", toto.red()); + println!("{}", String::from(toto).red()); + println!("{}", toto.blue()); + + println!("blue style ****"); + println!("{}", toto.bold()); + println!("{}", "yeah ! Red bold !".red().bold()); + println!("{}", "yeah ! Yellow bold !".bold().yellow()); + println!("{}", toto.bold().blue()); + println!("{}", toto.blue().bold()); + println!("{}", toto.blue().bold().underline()); + println!("{}", toto.blue().italic()); + println!("******"); + println!("test clearing"); + println!("{}", "red cleared".red().clear()); + println!("{}", "bold cyan cleared".bold().cyan().clear()); + println!("******"); + println!("Bg tests"); + println!("{}", toto.green().on_blue()); + println!("{}", toto.on_magenta().yellow()); + println!("{}", toto.purple().on_yellow()); + println!("{}", toto.magenta().on_white()); + println!("{}", toto.cyan().on_green()); + println!("{}", toto.black().on_white()); + println!("******"); + println!("{}", toto.green()); + println!("{}", toto.yellow()); + println!("{}", toto.purple()); + println!("{}", toto.magenta()); + println!("{}", toto.cyan()); + println!("{}", toto.white()); + println!("{}", toto.white().red().blue().green()); + println!("{}", toto.truecolor(255, 0, 0)); + println!("{}", toto.truecolor(255, 255, 0)); + println!("{}", toto.on_truecolor(0, 80, 80)); + // uncomment to see term output + // assert!(false) + } + + #[test] + fn compute_style_empty_string() { + assert_eq!("", "".clear().compute_style()); + } + + #[cfg_attr(feature = "no-color", ignore)] + #[test] + fn compute_style_simple_fg_blue() { + let blue = "\x1B[34m"; + + assert_eq!(blue, "".blue().compute_style()); + } + + #[cfg_attr(feature = "no-color", ignore)] + #[test] + fn compute_style_simple_bg_blue() { + let on_blue = "\x1B[44m"; + + assert_eq!(on_blue, "".on_blue().compute_style()); + } + + #[cfg_attr(feature = "no-color", ignore)] + #[test] + fn compute_style_blue_on_blue() { + let blue_on_blue = "\x1B[44;34m"; + + assert_eq!(blue_on_blue, "".blue().on_blue().compute_style()); + } + + #[cfg_attr(feature = "no-color", ignore)] + #[test] + fn compute_style_simple_fg_bright_blue() { + let blue = "\x1B[94m"; + + assert_eq!(blue, "".bright_blue().compute_style()); + } + + #[cfg_attr(feature = "no-color", ignore)] + #[test] + fn compute_style_simple_bg_bright_blue() { + let on_blue = "\x1B[104m"; + + assert_eq!(on_blue, "".on_bright_blue().compute_style()); + } + + #[cfg_attr(feature = "no-color", ignore)] + #[test] + fn compute_style_bright_blue_on_bright_blue() { + let blue_on_blue = "\x1B[104;94m"; + + assert_eq!( + blue_on_blue, + "".bright_blue().on_bright_blue().compute_style() + ); + } + + #[cfg_attr(feature = "no-color", ignore)] + #[test] + fn compute_style_simple_bold() { + let bold = "\x1B[1m"; + + assert_eq!(bold, "".bold().compute_style()); + } + + #[cfg_attr(feature = "no-color", ignore)] + #[test] + fn compute_style_blue_bold() { + let blue_bold = "\x1B[1;34m"; + + assert_eq!(blue_bold, "".blue().bold().compute_style()); + } + + #[cfg_attr(feature = "no-color", ignore)] + #[test] + fn compute_style_blue_bold_on_blue() { + let blue_bold_on_blue = "\x1B[1;44;34m"; + + assert_eq!( + blue_bold_on_blue, + "".blue().bold().on_blue().compute_style() + ); + } + + #[test] + fn escape_reset_sequence_spec_should_do_nothing_on_empty_strings() { + let style = ColoredString::default(); + let expected = String::new(); + + let output = style.escape_inner_reset_sequences(); + + assert_eq!(expected, output); + } + + #[test] + fn escape_reset_sequence_spec_should_do_nothing_on_string_with_no_reset() { + let style = ColoredString { + input: String::from("hello world !"), + ..ColoredString::default() + }; + + let expected = String::from("hello world !"); + let output = style.escape_inner_reset_sequences(); + + assert_eq!(expected, output); + } + + #[cfg_attr(feature = "no-color", ignore)] + #[test] + fn escape_reset_sequence_spec_should_replace_inner_reset_sequence_with_current_style() { + let input = format!("start {} end", String::from("hello world !").red()); + let style = input.blue(); + + let output = style.escape_inner_reset_sequences(); + let blue = "\x1B[34m"; + let red = "\x1B[31m"; + let reset = "\x1B[0m"; + let expected = format!("start {}hello world !{}{} end", red, reset, blue); + assert_eq!(expected, output); + } + + #[cfg_attr(feature = "no-color", ignore)] + #[test] + fn escape_reset_sequence_spec_should_replace_multiple_inner_reset_sequences_with_current_style() + { + let italic_str = String::from("yo").italic(); + let input = format!( + "start 1:{} 2:{} 3:{} end", + italic_str, italic_str, italic_str + ); + let style = input.blue(); + + let output = style.escape_inner_reset_sequences(); + let blue = "\x1B[34m"; + let italic = "\x1B[3m"; + let reset = "\x1B[0m"; + let expected = format!( + "start 1:{}yo{}{} 2:{}yo{}{} 3:{}yo{}{} end", + italic, reset, blue, italic, reset, blue, italic, reset, blue + ); + + println!("first: {}\nsecond: {}", expected, output); + + assert_eq!(expected, output); + } + + #[test] + fn color_fn() { + assert_eq!("blue".blue(), "blue".color("blue")) + } + + #[test] + fn on_color_fn() { + assert_eq!("blue".on_blue(), "blue".on_color("blue")) + } + + #[test] + fn bright_color_fn() { + assert_eq!("blue".bright_blue(), "blue".color("bright blue")) + } + + #[test] + fn on_bright_color_fn() { + assert_eq!("blue".on_bright_blue(), "blue".on_color("bright blue")) + } + + #[test] + fn exposing_tests() { + let cstring = "".red(); + assert_eq!(cstring.fgcolor(), Some(Color::Red)); + assert_eq!(cstring.bgcolor(), None); + + let cstring = cstring.clear(); + assert_eq!(cstring.fgcolor(), None); + assert_eq!(cstring.bgcolor(), None); + + let cstring = cstring.blue().on_bright_yellow(); + assert_eq!(cstring.fgcolor(), Some(Color::Blue)); + assert_eq!(cstring.bgcolor(), Some(Color::BrightYellow)); + + let cstring = cstring.bold().italic(); + assert_eq!(cstring.fgcolor(), Some(Color::Blue)); + assert_eq!(cstring.bgcolor(), Some(Color::BrightYellow)); + assert_eq!(cstring.style().contains(Styles::Bold), true); + assert_eq!(cstring.style().contains(Styles::Italic), true); + assert_eq!(cstring.style().contains(Styles::Dimmed), false); + } +} diff --git a/vendor/colored/src/style.rs b/vendor/colored/src/style.rs new file mode 100755 index 0000000000..bf97acc99a --- /dev/null +++ b/vendor/colored/src/style.rs @@ -0,0 +1,293 @@ +const CLEARV: u8 = 0b0000_0000; +const BOLD: u8 = 0b0000_0001; +const UNDERLINE: u8 = 0b0000_0010; +const REVERSED: u8 = 0b0000_0100; +const ITALIC: u8 = 0b0000_1000; +const BLINK: u8 = 0b0001_0000; +const HIDDEN: u8 = 0b0010_0000; +const DIMMED: u8 = 0b0100_0000; +const STRIKETHROUGH: u8 = 0b1000_0000; + +static STYLES: [(u8, Styles); 8] = [ + (BOLD, Styles::Bold), + (DIMMED, Styles::Dimmed), + (UNDERLINE, Styles::Underline), + (REVERSED, Styles::Reversed), + (ITALIC, Styles::Italic), + (BLINK, Styles::Blink), + (HIDDEN, Styles::Hidden), + (STRIKETHROUGH, Styles::Strikethrough), +]; + +pub static CLEAR: Style = Style(CLEARV); + +/// A combinatorial style such as bold, italics, dimmed, etc. +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +pub struct Style(u8); + +#[derive(Clone, Copy, PartialEq, Eq, Debug)] +#[allow(missing_docs)] +pub enum Styles { + Clear, + Bold, + Dimmed, + Underline, + Reversed, + Italic, + Blink, + Hidden, + Strikethrough, +} + +impl Styles { + fn to_str<'a>(self) -> &'a str { + match self { + Styles::Clear => "", // unreachable, but we don't want to panic + Styles::Bold => "1", + Styles::Dimmed => "2", + Styles::Italic => "3", + Styles::Underline => "4", + Styles::Blink => "5", + Styles::Reversed => "7", + Styles::Hidden => "8", + Styles::Strikethrough => "9", + } + } + + fn to_u8(self) -> u8 { + match self { + Styles::Clear => CLEARV, + Styles::Bold => BOLD, + Styles::Dimmed => DIMMED, + Styles::Italic => ITALIC, + Styles::Underline => UNDERLINE, + Styles::Blink => BLINK, + Styles::Reversed => REVERSED, + Styles::Hidden => HIDDEN, + Styles::Strikethrough => STRIKETHROUGH, + } + } + + fn from_u8(u: u8) -> Option> { + if u == CLEARV { + return None; + } + + let res: Vec = STYLES + .iter() + .filter(|&&(ref mask, _)| (0 != (u & mask))) + .map(|&(_, value)| value) + .collect(); + if res.is_empty() { + None + } else { + Some(res) + } + } +} + +impl Style { + /// Check if the current style has one of [`Styles`](Styles) switched on. + /// + /// ```rust + /// # use colored::*; + /// let colored = "".bold().italic(); + /// assert_eq!(colored.style().contains(Styles::Bold), true); + /// assert_eq!(colored.style().contains(Styles::Italic), true); + /// assert_eq!(colored.style().contains(Styles::Dimmed), false); + /// ``` + pub fn contains(self, style: Styles) -> bool { + let s = style.to_u8(); + self.0 & s == s + } + + pub(crate) fn to_str(self) -> String { + let styles = Styles::from_u8(self.0).unwrap_or_default(); + styles + .iter() + .map(|s| s.to_str()) + .collect::>() + .join(";") + } + + pub(crate) fn add(&mut self, two: Styles) { + self.0 |= two.to_u8(); + } +} + +#[cfg(test)] +mod tests { + use super::*; + + mod u8_to_styles_invalid_is_none { + use super::super::Styles; + use super::super::CLEARV; + + #[test] + fn empty_is_none() { + assert_eq!(None, Styles::from_u8(CLEARV)) + } + } + + mod u8_to_styles_isomorphism { + use super::super::Styles; + use super::super::{ + BLINK, BOLD, DIMMED, HIDDEN, ITALIC, REVERSED, STRIKETHROUGH, UNDERLINE, + }; + + macro_rules! value_isomorph { + ($name:ident, $value:expr) => { + #[test] + fn $name() { + let u = Styles::from_u8($value); + assert!( + u.is_some(), + "{}: Styles::from_u8 -> None", + stringify!($value) + ); + let u = u.unwrap(); + assert!( + u.len() == 1, + "{}: Styles::from_u8 found {} styles (expected 1)", + stringify!($value), + u.len() + ); + assert!( + u[0].to_u8() == $value, + "{}: to_u8() doesn't match its const value", + stringify!($value) + ); + } + }; + } + + value_isomorph!(bold, BOLD); + value_isomorph!(underline, UNDERLINE); + value_isomorph!(reversed, REVERSED); + value_isomorph!(italic, ITALIC); + value_isomorph!(blink, BLINK); + value_isomorph!(hidden, HIDDEN); + value_isomorph!(dimmed, DIMMED); + value_isomorph!(strikethrough, STRIKETHROUGH); + } + + mod styles_combine_complex { + use super::super::Styles::*; + use super::super::{Style, Styles}; + + fn style_from_multiples(styles: &[Styles]) -> Style { + let mut res = Style(styles[0].to_u8()); + for s in &styles[1..] { + res = Style(res.0 | s.to_u8()); + } + res + } + + macro_rules! test_aggreg { + ($styles:expr, $expect:expr) => {{ + let v = style_from_multiples($styles); + let r = Styles::from_u8(v.0).expect("should find styles"); + assert_eq!(&$expect as &[Styles], &r[..]) + }}; + } + + #[test] + fn aggreg1() { + let styles: &[Styles] = &[Bold, Bold, Bold]; + test_aggreg!(styles, [Bold]) + } + + #[test] + fn aggreg2() { + let styles: &[Styles] = &[Italic, Italic, Bold, Bold]; + test_aggreg!(styles, [Bold, Italic]) + } + + #[test] + fn aggreg3() { + let styles: &[Styles] = &[Bold, Italic, Bold]; + test_aggreg!(styles, [Bold, Italic]) + } + + macro_rules! test_combine { + ($styles:expr) => {{ + let v = style_from_multiples($styles); + let r = Styles::from_u8(v.0).expect("should find styles"); + assert_eq!($styles, &r[..]) + }}; + } + + #[test] + fn two1() { + let s: &[Styles] = &[Bold, Underline]; + test_combine!(s) + } + + #[test] + fn two2() { + let s: &[Styles] = &[Underline, Italic]; + test_combine!(s) + } + + #[test] + fn two3() { + let s: &[Styles] = &[Bold, Italic]; + test_combine!(s) + } + + #[test] + fn three1() { + let s: &[Styles] = &[Bold, Underline, Italic]; + test_combine!(s) + } + + #[test] + fn three2() { + let s: &[Styles] = &[Dimmed, Underline, Italic]; + test_combine!(s) + } + + #[test] + fn four() { + let s: &[Styles] = &[Dimmed, Underline, Italic, Hidden]; + test_combine!(s) + } + + #[test] + fn five() { + let s: &[Styles] = &[Dimmed, Underline, Italic, Blink, Hidden]; + test_combine!(s) + } + + #[test] + fn six() { + let s: &[Styles] = &[Bold, Dimmed, Underline, Italic, Blink, Hidden]; + test_combine!(s) + } + + #[test] + fn all() { + let s: &[Styles] = &[ + Bold, + Dimmed, + Underline, + Reversed, + Italic, + Blink, + Hidden, + Strikethrough, + ]; + test_combine!(s) + } + } + + #[test] + fn test_style_contains() { + let mut style = Style(Styles::Bold.to_u8()); + style.add(Styles::Italic); + + assert_eq!(style.contains(Styles::Bold), true); + assert_eq!(style.contains(Styles::Italic), true); + assert_eq!(style.contains(Styles::Dimmed), false); + } +} diff --git a/vendor/colored/tests/ansi_term_compat.rs b/vendor/colored/tests/ansi_term_compat.rs new file mode 100755 index 0000000000..6683ee0c8a --- /dev/null +++ b/vendor/colored/tests/ansi_term_compat.rs @@ -0,0 +1,146 @@ +#![cfg(not(feature = "no-color"))] +#![allow(unused_imports)] + +extern crate ansi_term; +extern crate colored; + +use ansi_term::*; +use colored::*; + +macro_rules! test_simple_color { + ($string:expr, $colored_name:ident, $ansi_term_name:ident) => { + #[test] + fn $colored_name() { + let s = format!("{} {}", $string, stringify!($colored_name)); + assert_eq!( + s.$colored_name().to_string(), + Colour::$ansi_term_name.paint(s).to_string() + ) + } + }; +} + +mod compat_colors { + use super::ansi_term::*; + use super::colored::*; + + test_simple_color!("test string", black, Black); + test_simple_color!("test string", red, Red); + test_simple_color!("test string", green, Green); + test_simple_color!("test string", yellow, Yellow); + test_simple_color!("test string", blue, Blue); + test_simple_color!("test string", magenta, Purple); + test_simple_color!("test string", cyan, Cyan); + test_simple_color!("test string", white, White); +} + +macro_rules! test_simple_style { + ($string:expr, $style:ident) => { + #[test] + fn $style() { + let s = format!("{} {}", $string, stringify!($style)); + assert_eq!( + s.$style().to_string(), + ansi_term::Style::new().$style().paint(s).to_string() + ) + } + }; +} + +mod compat_styles { + use super::ansi_term; + use super::ansi_term::*; + use super::colored; + use super::colored::*; + + test_simple_style!("test string", bold); + test_simple_style!("test string", dimmed); + test_simple_style!("test string", italic); + test_simple_style!("test string", underline); + test_simple_style!("test string", blink); + test_simple_style!("test string", reverse); + test_simple_style!("test string", hidden); +} + +macro_rules! test_simple_bgcolor { + ($string:expr, $colored_name:ident, $ansi_term_name:ident) => { + #[test] + fn $colored_name() { + let s = format!("{} {}", $string, stringify!($colored_name)); + assert_eq!( + s.$colored_name().to_string(), + ansi_term::Style::default() + .on(ansi_term::Colour::$ansi_term_name) + .paint(s) + .to_string() + ) + } + }; +} + +mod compat_bgcolors { + use super::ansi_term; + use super::ansi_term::*; + use super::colored; + use super::colored::*; + + test_simple_bgcolor!("test string", on_black, Black); + test_simple_bgcolor!("test string", on_red, Red); + test_simple_bgcolor!("test string", on_green, Green); + test_simple_bgcolor!("test string", on_yellow, Yellow); + test_simple_bgcolor!("test string", on_blue, Blue); + test_simple_bgcolor!("test string", on_magenta, Purple); + test_simple_bgcolor!("test string", on_cyan, Cyan); + test_simple_bgcolor!("test string", on_white, White); +} + +mod compat_complex { + use super::ansi_term; + use super::ansi_term::*; + use super::colored; + use super::colored::*; + + #[test] + fn complex1() { + let s = "test string"; + let ansi = Colour::Red.on(Colour::Black).bold().italic().paint(s); + assert_eq!( + ansi.to_string(), + s.red().bold().italic().on_black().to_string() + ); + } + + #[test] + fn complex2() { + let s = "test string"; + let ansi = Colour::Green.on(Colour::Yellow).underline().paint(s); + assert_eq!( + ansi.to_string(), + s.green().on_yellow().underline().to_string() + ); + } +} + +mod compat_overrides { + use super::ansi_term; + use super::ansi_term::*; + use super::colored; + use super::colored::*; + + #[test] + fn overrides1() { + let s = "test string"; + let ansi = Colour::Red.on(Colour::Black).on(Colour::Blue).paint(s); + assert_eq!(ansi.to_string(), s.red().on_blue().to_string()); + } + + #[test] + fn overrides2() { + let s = "test string"; + let ansi = Colour::Green.on(Colour::Yellow).paint(s); + assert_eq!( + ansi.to_string(), + s.green().on_yellow().green().on_yellow().to_string() + ); + } +} diff --git a/vendor/const_fn/.cargo-checksum.json b/vendor/const_fn/.cargo-checksum.json deleted file mode 100644 index 18914223c2..0000000000 --- a/vendor/const_fn/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{"CHANGELOG.md":"3d4c8910c720a6467a5576a3ed910d852e3595b0a55a5e412514eefc481ec8d9","Cargo.toml":"9163a47eff7b4bd7d6ed96159d3b8b8452eb39aeb0b8e694309a99e47ddc99a7","LICENSE-APACHE":"0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"e2c098d1b809f792484ca7e4ff21a1992ae83693683ba39d4a0e34ba1be2760f","build.rs":"0095fffab24644ea5b04a6132b0ccb53762435cc637092e6d4c471c4cc66f60b","src/ast.rs":"4d4a1ddb8deefa31c3e798ffe9cb32752f9b5418c61a8e45be32ca0d5f9b63f3","src/error.rs":"9bc6f12801616dc1750346bf4228d1b172bee88777e9c8cb841dd9348fecbcf3","src/iter.rs":"4eccd018075a4f4839adef2e2cf05198780b9b60d6fbfa8188522c2ad8e82cb5","src/lib.rs":"3ad19d38445a06934b60abe94611c77145c0dbcdc28630abb9a5c27c6b6f998f","src/to_tokens.rs":"5e831889f220c5abaf0403e56b485fbbbb1c4516023e82934f69a230d76694bf","src/utils.rs":"b73f44e9260d32d71aa2712b242f8c451317f62ee1523595fca19878ac07dcd4"},"package":"28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6"} \ No newline at end of file diff --git a/vendor/const_fn/CHANGELOG.md b/vendor/const_fn/CHANGELOG.md deleted file mode 100644 index b46403ac22..0000000000 --- a/vendor/const_fn/CHANGELOG.md +++ /dev/null @@ -1,149 +0,0 @@ -# Changelog - -All notable changes to this project will be documented in this file. - -This project adheres to [Semantic Versioning](https://semver.org). - - - -## [Unreleased] - -## [0.4.5] - 2021-01-05 - -- Exclude unneeded files from crates.io. - -## [0.4.4] - 2020-11-02 - -- [Accept `const_fn` attribute with no arguments and functions without `const` keyword.](https://github.com/taiki-e/const_fn/pull/34) - This allows `const_fn` to be used as an optional dependency. - - ```rust - #[cfg_attr(feature = "...", const_fn::const_fn)] - pub fn func() { - /* ... */ - } - ``` - -## [0.4.3] - 2020-11-02 - -- [`const_fn` no longer fails to compile if unable to determine rustc version. Instead, it now displays a warning.](https://github.com/taiki-e/const_fn/pull/31) - -- [`const_fn` no longer relies on debug print format.](https://github.com/taiki-e/const_fn/pull/30) - -## [0.4.2] - 2020-08-31 - -- [Improve error messages when failed to parse version information.](https://github.com/taiki-e/const_fn/pull/26) - -- [Fix compile failure with cargo installed by yum.](https://github.com/taiki-e/const_fn/pull/26) - -## [0.4.1] - 2020-08-25 - -- [Fix compile failure with non-cargo build systems.](https://github.com/taiki-e/const_fn/pull/23) - -## [0.4.0] - 2020-08-25 - -- [Add support for version-based code generation.](https://github.com/taiki-e/const_fn/pull/17) The following conditions are available: - - ```rust - use const_fn::const_fn; - - // function is `const` on specified version and later compiler (including beta and nightly) - #[const_fn("1.36")] - pub const fn version() { - /* ... */ - } - - // function is `const` on nightly compiler (including dev build) - #[const_fn(nightly)] - pub const fn nightly() { - /* ... */ - } - - // function is `const` if `cfg(...)` is true - #[const_fn(cfg(...))] - pub const fn cfg() { - /* ... */ - } - - // function is `const` if `cfg(feature = "...")` is true - #[const_fn(feature = "...")] - pub const fn feature() { - /* ... */ - } - ``` - -- Improve compile time by removing proc-macro related dependencies ([#18](https://github.com/taiki-e/const_fn/pull/18), [#20](https://github.com/taiki-e/const_fn/pull/20)). - -## [0.3.1] - 2019-12-09 - -- Updated `syn-mid` to 0.5. - -## [0.3.0] - 2019-10-20 - -- `#[const_fn]` attribute may only be used on const functions. - -## [0.2.1] - 2019-08-15 - -- Updated `proc-macro2`, `syn`, and `quote` to 1.0. - -- Updated `syn-mid` to 0.4. - -## [0.2.0] - 2019-06-16 - -- Transition to Rust 2018. With this change, the minimum required version will go up to Rust 1.31. - -## [0.1.7] - 2019-02-18 - -- Update syn-mid version to 0.3 - -## [0.1.6] - 2019-02-15 - -- Reduce compilation time - -## [0.1.5] - 2019-02-15 - -- Revert 0.1.4 - -## [0.1.4] - 2019-02-15 - -**Note: This release has been yanked.** - -- Reduce compilation time - -## [0.1.3] - 2019-01-06 - -- Fix dependencies - -## [0.1.2] - 2018-12-27 - -- Improve error messages - -## [0.1.1] - 2018-12-27 - -- Improve an error message - -## [0.1.0] - 2018-12-25 - -Initial release - -[Unreleased]: https://github.com/taiki-e/const_fn/compare/v0.4.5...HEAD -[0.4.5]: https://github.com/taiki-e/const_fn/compare/v0.4.4...v0.4.5 -[0.4.4]: https://github.com/taiki-e/const_fn/compare/v0.4.3...v0.4.4 -[0.4.3]: https://github.com/taiki-e/const_fn/compare/v0.4.2...v0.4.3 -[0.4.2]: https://github.com/taiki-e/const_fn/compare/v0.4.1...v0.4.2 -[0.4.1]: https://github.com/taiki-e/const_fn/compare/v0.4.0...v0.4.1 -[0.4.0]: https://github.com/taiki-e/const_fn/compare/v0.3.1...v0.4.0 -[0.3.1]: https://github.com/taiki-e/const_fn/compare/v0.3.0...v0.3.1 -[0.3.0]: https://github.com/taiki-e/const_fn/compare/v0.2.1...v0.3.0 -[0.2.1]: https://github.com/taiki-e/const_fn/compare/v0.2.0...v0.2.1 -[0.2.0]: https://github.com/taiki-e/const_fn/compare/v0.1.7...v0.2.0 -[0.1.7]: https://github.com/taiki-e/const_fn/compare/v0.1.6...v0.1.7 -[0.1.6]: https://github.com/taiki-e/const_fn/compare/v0.1.5...v0.1.6 -[0.1.5]: https://github.com/taiki-e/const_fn/compare/v0.1.4...v0.1.5 -[0.1.4]: https://github.com/taiki-e/const_fn/compare/v0.1.3...v0.1.4 -[0.1.3]: https://github.com/taiki-e/const_fn/compare/v0.1.2...v0.1.3 -[0.1.2]: https://github.com/taiki-e/const_fn/compare/v0.1.1...v0.1.2 -[0.1.1]: https://github.com/taiki-e/const_fn/compare/v0.1.0...v0.1.1 -[0.1.0]: https://github.com/taiki-e/const_fn/releases/tag/v0.1.0 diff --git a/vendor/const_fn/LICENSE-APACHE b/vendor/const_fn/LICENSE-APACHE deleted file mode 100644 index f433b1a53f..0000000000 --- a/vendor/const_fn/LICENSE-APACHE +++ /dev/null @@ -1,177 +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 diff --git a/vendor/const_fn/README.md b/vendor/const_fn/README.md deleted file mode 100644 index 18feabed6a..0000000000 --- a/vendor/const_fn/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# \#\[const_fn\] - -[![crates.io](https://img.shields.io/crates/v/const_fn.svg?style=flat-square&logo=rust)](https://crates.io/crates/const_fn) -[![docs.rs](https://img.shields.io/badge/docs.rs-const__fn-blue?style=flat-square)](https://docs.rs/const_fn) -[![license](https://img.shields.io/badge/license-Apache--2.0_OR_MIT-blue.svg?style=flat-square)](#license) -[![rustc](https://img.shields.io/badge/rustc-1.31+-blue.svg?style=flat-square)](https://www.rust-lang.org) -[![build status](https://img.shields.io/github/workflow/status/taiki-e/const_fn/CI/master?style=flat-square)](https://github.com/taiki-e/const_fn/actions?query=workflow%3ACI+branch%3Amaster) - -An attribute for easy generation of const functions with conditional -compilations. - -## Usage - -Add this to your `Cargo.toml`: - -```toml -[dependencies] -const_fn = "0.4" -``` - -*Compiler support: requires rustc 1.31+* - -## Examples - -```rust -use const_fn::const_fn; - -// function is `const` on specified version and later compiler (including beta and nightly) -#[const_fn("1.36")] -pub const fn version() { - /* ... */ -} - -// function is `const` on nightly compiler (including dev build) -#[const_fn(nightly)] -pub const fn nightly() { - /* ... */ -} - -// function is `const` if `cfg(...)` is true -#[const_fn(cfg(...))] -pub const fn cfg() { - /* ... */ -} - -// function is `const` if `cfg(feature = "...")` is true -#[const_fn(feature = "...")] -pub const fn feature() { - /* ... */ -} -``` - -## Alternatives - -This crate is proc-macro, but is very lightweight, and has no dependencies. - -You can manually define declarative macros with similar functionality (see -[`if_rust_version`](https://github.com/ogoffart/if_rust_version#examples)), -or [you can define the same function twice with different cfg](https://github.com/crossbeam-rs/crossbeam/blob/0b6ea5f69fde8768c1cfac0d3601e0b4325d7997/crossbeam-epoch/src/atomic.rs#L340-L372). -(Note: the former approach requires more macros to be defined depending on the -number of version requirements, the latter approach requires more functions to -be maintained manually) - -## License - -Licensed under either of [Apache License, Version 2.0](LICENSE-APACHE) or -[MIT license](LICENSE-MIT) at your option. - -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. diff --git a/vendor/const_fn/build.rs b/vendor/const_fn/build.rs deleted file mode 100644 index 5aa341f3b9..0000000000 --- a/vendor/const_fn/build.rs +++ /dev/null @@ -1,102 +0,0 @@ -#![forbid(unsafe_code)] -#![warn(rust_2018_idioms, single_use_lifetimes)] - -use std::{ - env, fs, - path::{Path, PathBuf}, - process::Command, - str, -}; - -// The rustc-cfg strings below are *not* public API. Please let us know by -// opening a GitHub issue if your build environment requires some way to enable -// these cfgs other than by executing our build script. -fn main() { - let rustc: PathBuf = env::var_os("RUSTC").unwrap_or_else(|| "rustc".into()).into(); - let version = match Version::from_rustc(&rustc) { - Ok(version) => version.print(), - Err(e) => { - println!( - "cargo:warning={}: unable to determine rustc version: {}", - env!("CARGO_PKG_NAME"), - e - ); - return; - } - }; - - let out_dir: PathBuf = env::var_os("OUT_DIR").expect("OUT_DIR not set").into(); - let out_file = &out_dir.join("version"); - fs::write(out_file, version) - .unwrap_or_else(|e| panic!("failed to write {}: {}", out_file.display(), e)); - - // Mark as build script has been run successfully. - println!("cargo:rustc-cfg=const_fn_has_build_script"); -} - -struct Version { - minor: u32, - nightly: bool, -} - -impl Version { - // Based on https://github.com/cuviper/autocfg/blob/1.0.1/src/version.rs#L25-L59 - // - // TODO: use autocfg if https://github.com/cuviper/autocfg/issues/28 merged - // or https://github.com/taiki-e/const_fn/issues/27 rejected. - fn from_rustc(rustc: &Path) -> Result { - let output = - Command::new(rustc).args(&["--version", "--verbose"]).output().map_err(|e| { - format!("could not execute `{} --version --verbose`: {}", rustc.display(), e) - })?; - if !output.status.success() { - return Err(format!( - "process didn't exit successfully: `{} --version --verbose`", - rustc.display() - )); - } - let output = str::from_utf8(&output.stdout).map_err(|e| { - format!("failed to parse output of `{} --version --verbose`: {}", rustc.display(), e) - })?; - - // Find the release line in the verbose version output. - let release = output - .lines() - .find(|line| line.starts_with("release: ")) - .map(|line| &line["release: ".len()..]) - .ok_or_else(|| { - format!( - "could not find rustc release from output of `{} --version --verbose`: {}", - rustc.display(), - output - ) - })?; - - // Split the version and channel info. - let mut version_channel = release.split('-'); - let version = version_channel.next().unwrap(); - let channel = version_channel.next(); - - let minor = (|| { - // Split the version into semver components. - let mut digits = version.splitn(3, '.'); - let major = digits.next()?; - if major != "1" { - return None; - } - let minor = digits.next()?.parse().ok()?; - let _patch = digits.next()?; - Some(minor) - })() - .ok_or_else(|| { - format!("unexpected output from `{} --version --verbose`: {}", rustc.display(), output) - })?; - - let nightly = channel.map_or(false, |c| c == "dev" || c == "nightly"); - Ok(Self { minor, nightly }) - } - - fn print(&self) -> String { - format!("Version {{ minor: {}, nightly: {} }}\n", self.minor, self.nightly) - } -} diff --git a/vendor/const_fn/src/ast.rs b/vendor/const_fn/src/ast.rs deleted file mode 100644 index 3622a2f14c..0000000000 --- a/vendor/const_fn/src/ast.rs +++ /dev/null @@ -1,141 +0,0 @@ -use proc_macro::{Delimiter, Ident, Literal, Span, TokenStream, TokenTree}; - -use crate::{ - iter::TokenIter, - to_tokens::ToTokens, - utils::{parse_as_empty, tt_span}, - Result, -}; - -pub(crate) struct Func { - pub(crate) attrs: Vec, - pub(crate) sig: Vec, - pub(crate) body: TokenTree, - pub(crate) print_const: bool, -} - -pub(crate) fn parse_input(input: TokenStream) -> Result { - let mut input = TokenIter::new(input); - - let attrs = parse_attrs(&mut input)?; - let sig = parse_signature(&mut input); - let body = input.next(); - parse_as_empty(input)?; - - if body.is_none() - || !sig - .iter() - .any(|tt| if let TokenTree::Ident(i) = tt { i.to_string() == "fn" } else { false }) - { - return Err(error!( - Span::call_site(), - "#[const_fn] attribute may only be used on functions" - )); - } - - Ok(Func { attrs, sig, body: body.unwrap(), print_const: true }) -} - -impl ToTokens for Func { - fn to_tokens(&self, tokens: &mut TokenStream) { - self.attrs.iter().for_each(|attr| attr.to_tokens(tokens)); - if self.print_const { - self.sig.iter().for_each(|attr| attr.to_tokens(tokens)); - } else { - self.sig - .iter() - .filter( - |tt| if let TokenTree::Ident(i) = tt { i.to_string() != "const" } else { true }, - ) - .for_each(|tt| tt.to_tokens(tokens)); - } - self.body.to_tokens(tokens); - } -} - -fn parse_signature(input: &mut TokenIter) -> Vec { - let mut sig = Vec::new(); - let mut has_const = false; - loop { - match input.peek() { - Some(TokenTree::Group(group)) if group.delimiter() == Delimiter::Brace => break, - None => break, - Some(TokenTree::Ident(i)) if !has_const => { - match &*i.to_string() { - "const" => has_const = true, - "async" | "unsafe" | "extern" | "fn" => { - sig.push(TokenTree::Ident(Ident::new("const", i.span()))); - has_const = true; - } - _ => {} - } - sig.push(input.next().unwrap()); - } - Some(_) => sig.push(input.next().unwrap()), - } - } - sig -} - -fn parse_attrs(input: &mut TokenIter) -> Result> { - let mut attrs = Vec::new(); - loop { - let pound_token = match input.peek() { - Some(TokenTree::Punct(p)) if p.as_char() == '#' => input.next().unwrap(), - _ => break, - }; - let group = match input.peek() { - Some(TokenTree::Group(g)) if g.delimiter() == Delimiter::Bracket => { - input.next().unwrap() - } - tt => return Err(error!(tt_span(tt), "expected `[`")), - }; - attrs.push(Attribute { pound_token, group }); - } - Ok(attrs) -} - -pub(crate) struct Attribute { - // `#` - pub(crate) pound_token: TokenTree, - // `[...]` - pub(crate) group: TokenTree, -} - -impl ToTokens for Attribute { - fn to_tokens(&self, tokens: &mut TokenStream) { - self.pound_token.to_tokens(tokens); - self.group.to_tokens(tokens); - } -} - -pub(crate) struct LitStr { - pub(crate) token: Literal, - value: String, -} - -impl LitStr { - pub(crate) fn new(token: Literal) -> Result { - let value = token.to_string(); - // unlike `syn::LitStr`, only accepts `"..."` - if value.starts_with('"') && value.ends_with('"') { - Ok(Self { token, value }) - } else { - Err(error!(token.span(), "expected string literal")) - } - } - - pub(crate) fn value(&self) -> &str { - &self.value[1..self.value.len() - 1] - } - - pub(crate) fn span(&self) -> Span { - self.token.span() - } -} - -impl ToTokens for LitStr { - fn to_tokens(&self, tokens: &mut TokenStream) { - self.token.to_tokens(tokens); - } -} diff --git a/vendor/const_fn/src/error.rs b/vendor/const_fn/src/error.rs deleted file mode 100644 index b572d5a778..0000000000 --- a/vendor/const_fn/src/error.rs +++ /dev/null @@ -1,37 +0,0 @@ -use proc_macro::{Delimiter, Group, Ident, Literal, Punct, Spacing, Span, TokenStream, TokenTree}; -use std::iter::FromIterator; - -pub(crate) struct Error { - span: Span, - msg: String, -} - -impl Error { - pub(crate) fn new(span: Span, msg: impl Into) -> Self { - Self { span, msg: msg.into() } - } - - // https://github.com/dtolnay/syn/blob/1.0.39/src/error.rs#L218-L237 - pub(crate) fn to_compile_error(&self) -> TokenStream { - // compile_error!($msg) - TokenStream::from_iter(vec![ - TokenTree::Ident(Ident::new("compile_error", self.span)), - TokenTree::Punct({ - let mut punct = Punct::new('!', Spacing::Alone); - punct.set_span(self.span); - punct - }), - TokenTree::Group({ - let mut group = Group::new(Delimiter::Brace, { - TokenStream::from_iter(vec![TokenTree::Literal({ - let mut string = Literal::string(&self.msg); - string.set_span(self.span); - string - })]) - }); - group.set_span(self.span); - group - }), - ]) - } -} diff --git a/vendor/const_fn/src/iter.rs b/vendor/const_fn/src/iter.rs deleted file mode 100644 index f998dce4d6..0000000000 --- a/vendor/const_fn/src/iter.rs +++ /dev/null @@ -1,39 +0,0 @@ -// Based on https://github.com/dtolnay/proc-macro-hack/blob/0.5.18/src/iter.rs - -use proc_macro::{token_stream, Delimiter, TokenStream, TokenTree}; - -pub(crate) struct TokenIter { - stack: Vec, - peeked: Option, -} - -impl TokenIter { - pub(crate) fn new(tokens: TokenStream) -> Self { - Self { stack: vec![tokens.into_iter()], peeked: None } - } - - pub(crate) fn peek(&mut self) -> Option<&TokenTree> { - self.peeked = self.next(); - self.peeked.as_ref() - } -} - -impl Iterator for TokenIter { - type Item = TokenTree; - - fn next(&mut self) -> Option { - if let Some(tt) = self.peeked.take() { - return Some(tt); - } - loop { - let top = self.stack.last_mut()?; - match top.next() { - None => drop(self.stack.pop()), - Some(TokenTree::Group(ref group)) if group.delimiter() == Delimiter::None => { - self.stack.push(group.stream().into_iter()); - } - Some(tt) => return Some(tt), - } - } - } -} diff --git a/vendor/const_fn/src/lib.rs b/vendor/const_fn/src/lib.rs deleted file mode 100644 index cd8e3e8c96..0000000000 --- a/vendor/const_fn/src/lib.rs +++ /dev/null @@ -1,233 +0,0 @@ -//! An attribute for easy generation of const functions with conditional -//! compilations. -//! -//! # Examples -//! -//! ```rust -//! use const_fn::const_fn; -//! -//! // function is `const` on specified version and later compiler (including beta and nightly) -//! #[const_fn("1.36")] -//! pub const fn version() { -//! /* ... */ -//! } -//! -//! // function is `const` on nightly compiler (including dev build) -//! #[const_fn(nightly)] -//! pub const fn nightly() { -//! /* ... */ -//! } -//! -//! // function is `const` if `cfg(...)` is true -//! # #[cfg(any())] -//! #[const_fn(cfg(...))] -//! # pub fn _cfg() { unimplemented!() } -//! pub const fn cfg() { -//! /* ... */ -//! } -//! -//! // function is `const` if `cfg(feature = "...")` is true -//! #[const_fn(feature = "...")] -//! pub const fn feature() { -//! /* ... */ -//! } -//! ``` -//! -//! # Alternatives -//! -//! This crate is proc-macro, but is very lightweight, and has no dependencies. -//! -//! You can manually define declarative macros with similar functionality (see [`if_rust_version`](https://github.com/ogoffart/if_rust_version#examples)), or [you can define the same function twice with different cfg](https://github.com/crossbeam-rs/crossbeam/blob/0b6ea5f69fde8768c1cfac0d3601e0b4325d7997/crossbeam-epoch/src/atomic.rs#L340-L372). -//! (Note: the former approach requires more macros to be defined depending on the number of version requirements, the latter approach requires more functions to be maintained manually) - -#![doc(test( - no_crate_inject, - attr( - deny(warnings, rust_2018_idioms, single_use_lifetimes), - allow(dead_code, unused_variables) - ) -))] -#![forbid(unsafe_code)] -#![warn(future_incompatible, rust_2018_idioms, single_use_lifetimes, unreachable_pub)] -#![warn(clippy::all, clippy::default_trait_access)] - -// older compilers require explicit `extern crate`. -#[allow(unused_extern_crates)] -extern crate proc_macro; - -#[macro_use] -mod utils; - -mod ast; -mod error; -mod iter; -mod to_tokens; - -use proc_macro::{Delimiter, TokenStream, TokenTree}; -use std::str::FromStr; - -use crate::{ - ast::{Func, LitStr}, - error::Error, - to_tokens::ToTokens, - utils::{cfg_attrs, parse_as_empty, tt_span}, -}; - -type Result = std::result::Result; - -/// An attribute for easy generation of const functions with conditional compilations. -/// -/// See crate level documentation for details. -#[proc_macro_attribute] -pub fn const_fn(args: TokenStream, input: TokenStream) -> TokenStream { - let arg = match parse_arg(args) { - Ok(arg) => arg, - Err(e) => return e.to_compile_error(), - }; - let func = match ast::parse_input(input) { - Ok(func) => func, - Err(e) => return e.to_compile_error(), - }; - - expand(arg, func) -} - -fn expand(arg: Arg, mut func: Func) -> TokenStream { - match arg { - Arg::Cfg(cfg) => { - let (mut tokens, cfg_not) = cfg_attrs(cfg); - tokens.extend(func.to_token_stream()); - tokens.extend(cfg_not); - func.print_const = false; - tokens.extend(func.to_token_stream()); - tokens - } - Arg::Feature(feat) => { - let (mut tokens, cfg_not) = cfg_attrs(feat); - tokens.extend(func.to_token_stream()); - tokens.extend(cfg_not); - func.print_const = false; - tokens.extend(func.to_token_stream()); - tokens - } - Arg::Version(req) => { - if req.major > 1 || req.minor > VERSION.minor { - func.print_const = false; - } - func.to_token_stream() - } - Arg::Nightly => { - func.print_const = VERSION.nightly; - func.to_token_stream() - } - Arg::Always => func.to_token_stream(), - } -} - -enum Arg { - // `const_fn("...")` - Version(VersionReq), - // `const_fn(nightly)` - Nightly, - // `const_fn(cfg(...))` - Cfg(TokenStream), - // `const_fn(feature = "...")` - Feature(TokenStream), - // `const_fn` - Always, -} - -fn parse_arg(tokens: TokenStream) -> Result { - let mut iter = tokens.into_iter(); - - let next = iter.next(); - let next_span = tt_span(next.as_ref()); - match next { - None => return Ok(Arg::Always), - Some(TokenTree::Ident(i)) => match &*i.to_string() { - "nightly" => { - parse_as_empty(iter)?; - return Ok(Arg::Nightly); - } - "cfg" => { - return match iter.next().as_ref() { - Some(TokenTree::Group(g)) if g.delimiter() == Delimiter::Parenthesis => { - parse_as_empty(iter)?; - Ok(Arg::Cfg(g.stream())) - } - tt => Err(error!(tt_span(tt), "expected `(`")), - }; - } - "feature" => { - let next = iter.next(); - return match next.as_ref() { - Some(TokenTree::Punct(p)) if p.as_char() == '=' => match iter.next() { - Some(TokenTree::Literal(l)) => { - let l = LitStr::new(l)?; - parse_as_empty(iter)?; - Ok(Arg::Feature( - vec![TokenTree::Ident(i), next.unwrap(), l.token.into()] - .into_iter() - .collect(), - )) - } - tt => Err(error!(tt_span(tt.as_ref()), "expected string literal")), - }, - tt => Err(error!(tt_span(tt), "expected `=`")), - }; - } - _ => {} - }, - Some(TokenTree::Literal(l)) => { - if let Ok(l) = LitStr::new(l) { - parse_as_empty(iter)?; - return match l.value().parse::() { - Ok(req) => Ok(Arg::Version(req)), - Err(e) => Err(error!(l.span(), "{}", e)), - }; - } - } - Some(_) => {} - } - - Err(error!(next_span, "expected one of: `nightly`, `cfg`, `feature`, string literal")) -} - -struct VersionReq { - major: u32, - minor: u32, -} - -impl FromStr for VersionReq { - type Err = String; - - fn from_str(s: &str) -> Result { - let mut pieces = s.split('.'); - let major = pieces - .next() - .ok_or("need to specify the major version")? - .parse::() - .map_err(|e| e.to_string())?; - let minor = pieces - .next() - .ok_or("need to specify the minor version")? - .parse::() - .map_err(|e| e.to_string())?; - if let Some(s) = pieces.next() { - Err(format!("unexpected input: .{}", s)) - } else { - Ok(Self { major, minor }) - } - } -} - -struct Version { - minor: u32, - nightly: bool, -} - -#[cfg(const_fn_has_build_script)] -const VERSION: Version = include!(concat!(env!("OUT_DIR"), "/version")); -// If build script has not run or unable to determine version, it is considered as Rust 1.0. -#[cfg(not(const_fn_has_build_script))] -const VERSION: Version = Version { minor: 0, nightly: false }; diff --git a/vendor/const_fn/src/to_tokens.rs b/vendor/const_fn/src/to_tokens.rs deleted file mode 100644 index 771c7f69c5..0000000000 --- a/vendor/const_fn/src/to_tokens.rs +++ /dev/null @@ -1,36 +0,0 @@ -use proc_macro::{Ident, Literal, TokenStream, TokenTree}; -use std::iter; - -pub(crate) trait ToTokens { - fn to_tokens(&self, tokens: &mut TokenStream); - - fn to_token_stream(&self) -> TokenStream { - let mut tokens = TokenStream::new(); - self.to_tokens(&mut tokens); - tokens - } -} - -impl ToTokens for Ident { - fn to_tokens(&self, tokens: &mut TokenStream) { - tokens.extend(iter::once(TokenTree::Ident(self.clone()))); - } -} - -impl ToTokens for Literal { - fn to_tokens(&self, tokens: &mut TokenStream) { - tokens.extend(iter::once(TokenTree::Literal(self.clone()))); - } -} - -impl ToTokens for TokenTree { - fn to_tokens(&self, tokens: &mut TokenStream) { - tokens.extend(iter::once(self.clone())); - } -} - -impl ToTokens for TokenStream { - fn to_tokens(&self, tokens: &mut TokenStream) { - tokens.extend(self.clone()); - } -} diff --git a/vendor/const_fn/src/utils.rs b/vendor/const_fn/src/utils.rs deleted file mode 100644 index e557ea57e0..0000000000 --- a/vendor/const_fn/src/utils.rs +++ /dev/null @@ -1,46 +0,0 @@ -use proc_macro::{Delimiter, Group, Ident, Punct, Spacing, Span, TokenStream, TokenTree}; -use std::iter::FromIterator; - -use crate::Result; - -macro_rules! error { - ($span:expr, $msg:expr) => {{ - crate::error::Error::new($span, $msg) - }}; - ($span:expr, $($tt:tt)*) => { - error!($span, format!($($tt)*)) - }; -} - -pub(crate) fn tt_span(tt: Option<&TokenTree>) -> Span { - tt.map_or_else(Span::call_site, TokenTree::span) -} - -pub(crate) fn parse_as_empty(mut tokens: impl Iterator) -> Result<()> { - match tokens.next() { - Some(tt) => Err(error!(tt.span(), "unexpected token: {}", tt)), - None => Ok(()), - } -} - -// (`#[cfg()]`, `#[cfg(not())]`) -pub(crate) fn cfg_attrs(tokens: TokenStream) -> (TokenStream, TokenStream) { - let f = |tokens| { - let tokens = TokenStream::from_iter(vec![ - TokenTree::Ident(Ident::new("cfg", Span::call_site())), - TokenTree::Group(Group::new(Delimiter::Parenthesis, tokens)), - ]); - TokenStream::from_iter(vec![ - TokenTree::Punct(Punct::new('#', Spacing::Alone)), - TokenTree::Group(Group::new(Delimiter::Bracket, tokens)), - ]) - }; - - let cfg_not = TokenTree::Group(Group::new(Delimiter::Parenthesis, tokens.clone())); - let cfg_not = TokenStream::from_iter(vec![ - TokenTree::Ident(Ident::new("not", Span::call_site())), - cfg_not, - ]); - - (f(tokens), f(cfg_not)) -} diff --git a/vendor/crossbeam-epoch/.cargo-checksum.json b/vendor/crossbeam-epoch/.cargo-checksum.json index ebdb01fb53..978750df8d 100644 --- a/vendor/crossbeam-epoch/.cargo-checksum.json +++ b/vendor/crossbeam-epoch/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"be05797b229bfb486c7b0432093aedc6be1129543979aad352f3e2c8b6ecb0e1","Cargo.lock":"701958899c3aeb45c5a8e46c7478f8899b85649c7f66ce63d0e6a5c3209f1ec1","Cargo.toml":"91e77f6969e25d10b83e69dc1274321329045712c7e7d389be20bc250b4409c1","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"5734ed989dfca1f625b40281ee9f4530f91b2411ec01cb748223e7eb87e201ab","README.md":"dbab340cd33d900cf38d5bdee509e09ef7ec3c490c7b47931e840cefec1f1d53","benches/defer.rs":"c330b704d96b2ad1aed29f72c37a99da534adef8cb06a3976d5f93bf567abb20","benches/flush.rs":"0389ac6c473632f0e93c962f223404cc360257f6699b4ec90b9b3be16bb6d74f","benches/pin.rs":"80f9e65ba04a2ddec7a330172d0b0fbc698e20c221b3d8cdc70cc42e3b9099d1","examples/sanitize.rs":"30001550746a54d6a377f8913fa41c72bf85140d7e8777e07c38491a4e31664b","examples/treiber_stack.rs":"ce4a5f8da67f8497ab0321aaa1aed032ae343c0d36500f2e55a24e76230dedcb","src/atomic.rs":"b92192024336203b865496c8c398ce53ec15bd401eb98c85fa3634bcbd126f86","src/collector.rs":"c310be652b837f73048663c08e872bc14f64b4ae9030c34fe737e6fe0e2d768b","src/default.rs":"b2c9a86b392dc3d687b01abee61b479a6043c5c654a22b79e880f4226dcf65ae","src/deferred.rs":"1df28c99dad1e22ecad7515e829b78ba54bdbbce07ad0b7b122db22b7b215a1e","src/epoch.rs":"76dd63356d5bc52e741883d39abb636e4ccb04d20499fb2a0ce797bb81aa4e91","src/guard.rs":"55c56ca1b2fbc067ae21108f0f7de4be91e5b41df2492055b635ed436782dd52","src/internal.rs":"c6f0a79fb8bccbcc58c5db1135a9bc8a6fc69affaf346c5afb69aa725b46e2b7","src/lib.rs":"a4655d14fce9c4c028d9dd0c5d8ea56064eec1dbc0aef400a236d4ace3f49c7c","src/sync/list.rs":"b16e6dc7c2f94c8682926ea8627352f49ab2b464245b241cfc77b72fa1878dd3","src/sync/mod.rs":"2da979ca3a2293f7626a2e6a9ab2fad758d92e3d2bed6cc712ef59eeeea87eab","src/sync/queue.rs":"225d4878142c245226262346c18434436ffc35f14f15a600a3006758449cccb0"},"package":"a1aaa739f95311c2c7887a76863f500026092fb1dce0161dab577e559ef3569d"} \ No newline at end of file +{"files":{"CHANGELOG.md":"3ae06fc468a9975b0ed3da7cd1f93a51edea60a18bc7fe467cf3a07563c90485","Cargo.lock":"e00b7ed9777b1e2d7f09fcac026a3be2bc6d656f1525bc04aa6bd2c0397d918a","Cargo.toml":"6774e7951c84503066df48b29371d62f77fe528e26f3d189c9d10dd8f1de088d","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"5734ed989dfca1f625b40281ee9f4530f91b2411ec01cb748223e7eb87e201ab","README.md":"51a445c566bc8226b09e74e3b02a333771f301fcc503f4e5cca90b852da8e904","benches/defer.rs":"c330b704d96b2ad1aed29f72c37a99da534adef8cb06a3976d5f93bf567abb20","benches/flush.rs":"0389ac6c473632f0e93c962f223404cc360257f6699b4ec90b9b3be16bb6d74f","benches/pin.rs":"80f9e65ba04a2ddec7a330172d0b0fbc698e20c221b3d8cdc70cc42e3b9099d1","examples/sanitize.rs":"a39d1635fa61e643e59192d7a63becc97ff81f03c1f4e03d38cedefb1525026a","src/atomic.rs":"9e563bf42df63421478cc9e49ff4b7137fd4fd34a2053692b9dcd40c7958550b","src/collector.rs":"7d636f3f96fafd033298d1c2ab126205438a46deb84895d8e28bea9eef67798a","src/default.rs":"e1449bd6e61d7c19e9cbdf183f81c67c3487775fcc55572947874ca535d3d54f","src/deferred.rs":"1ee67bd3200d3891076aac8cfc9767abdddc194602f2084d11455484096005ea","src/epoch.rs":"d31e66d8fe62299928e25867336d96391b26a4fe890a1cae0885dfcf36d6835b","src/guard.rs":"55c56ca1b2fbc067ae21108f0f7de4be91e5b41df2492055b635ed436782dd52","src/internal.rs":"f3f8131819b2a4ec4d1a6d392c734688324f3ae708bac6745e88f2930657eba1","src/lib.rs":"b3ca8101d9dffd3da057794fd1a56495cc225adc1f5fff477c5d4706ce0aae3f","src/sync/list.rs":"10aa4c59845ab9ff1d8bcb6f594b70bbe23c320fa7a2b125fdf85df88b9d61e2","src/sync/mod.rs":"cbc6334460d73761c3dea7f99ed2ccbf267d5da3bc76c812e94f85c9f4565c6a","src/sync/queue.rs":"262e0d8f343e97df9e2a738461e4255e339710e81c479e484f9efe517ae47135","tests/loom.rs":"db772f4478966de6ec98774ca4093171dc942da635822a0d2d3257d31188cb9b"},"package":"2584f639eb95fea8c798496315b297cf81b9b58b6d30ab066a75455333cf4b12"} \ No newline at end of file diff --git a/vendor/crossbeam-epoch/CHANGELOG.md b/vendor/crossbeam-epoch/CHANGELOG.md index 0e154a6e23..0f30b7092b 100644 --- a/vendor/crossbeam-epoch/CHANGELOG.md +++ b/vendor/crossbeam-epoch/CHANGELOG.md @@ -1,3 +1,14 @@ +# Version 0.9.3 + +- Make `loom` dependency optional. (#666) + +# Version 0.9.2 + +- Add `Atomic::compare_exchange` and `Atomic::compare_exchange_weak`. (#628) +- Deprecate `Atomic::compare_and_set` and `Atomic::compare_and_set_weak`. Use `Atomic::compare_exchange` or `Atomic::compare_exchange_weak` instead. (#628) +- Make `const_fn` dependency optional. (#611) +- Add unstable support for `loom`. (#487) + # Version 0.9.1 - Bump `memoffset` dependency to version 0.6. (#592) diff --git a/vendor/crossbeam-epoch/Cargo.lock b/vendor/crossbeam-epoch/Cargo.lock index baebea0d02..fd37e90378 100644 --- a/vendor/crossbeam-epoch/Cargo.lock +++ b/vendor/crossbeam-epoch/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "autocfg" version = "1.0.1" @@ -7,10 +9,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] -name = "cfg-if" -version = "0.1.10" +name = "cc" +version = "1.0.67" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +checksum = "e3c69b077ad434294d3ce9f1f6143a2a4b89a8a2d54ef813d85003a4fd1137fd" [[package]] name = "cfg-if" @@ -20,18 +22,19 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "const_fn" -version = "0.4.3" +version = "0.4.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c478836e029dcef17fb47c89023448c64f781a046e0300e257ad8225ae59afab" +checksum = "28b9d6de7f49e22cf97ad17fc4036ece69300032f45f78f30b4a4482cdc3f4a6" [[package]] name = "crossbeam-epoch" -version = "0.9.1" +version = "0.9.3" dependencies = [ - "cfg-if 1.0.0", + "cfg-if", "const_fn", "crossbeam-utils", "lazy_static", + "loom", "memoffset", "rand", "scopeguard", @@ -39,22 +42,36 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.1" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d" +checksum = "e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49" dependencies = [ "autocfg", - "cfg-if 1.0.0", + "cfg-if", "lazy_static", + "loom", +] + +[[package]] +name = "generator" +version = "0.6.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a9fed24fd1e18827652b4d55652899a1e9da8e54d91624dc3437a5bc3a9f9a9c" +dependencies = [ + "cc", + "libc", + "log", + "rustversion", + "winapi", ] [[package]] name = "getrandom" -version = "0.1.15" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fc587bc0ec293155d5bfa6b9891ec18a1e330c234f896ea47fbada4cadbe47e6" +checksum = "c9495705279e7140bf035dde1f6e750c162df8b625267cd52cc44e0b156732c8" dependencies = [ - "cfg-if 0.1.10", + "cfg-if", "libc", "wasi", ] @@ -67,9 +84,29 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] name = "libc" -version = "0.2.80" +version = "0.2.86" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b7282d924be3275cec7f6756ff4121987bc6481325397dde6ba3e7802b1a8b1c" + +[[package]] +name = "log" +version = "0.4.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "51b9bbe6c47d51fc3e1a9b945965946b4c44142ab8792c50835a980d362c2710" +dependencies = [ + "cfg-if", +] + +[[package]] +name = "loom" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614" +checksum = "d44c73b4636e497b4917eb21c33539efa3816741a2d3ff26c6316f1b529481a4" +dependencies = [ + "cfg-if", + "generator", + "scoped-tls", +] [[package]] name = "memoffset" @@ -88,11 +125,10 @@ checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] name = "rand" -version = "0.7.3" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" +checksum = "0ef9e7e66b4468674bfcb0c81af8b7fa0bb154fa9f28eb840da5c447baeb8d7e" dependencies = [ - "getrandom", "libc", "rand_chacha", "rand_core", @@ -101,9 +137,9 @@ dependencies = [ [[package]] name = "rand_chacha" -version = "0.2.2" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" +checksum = "e12735cf05c9e10bf21534da50a147b924d555dc7a547c42e6bb2d5b6017ae0d" dependencies = [ "ppv-lite86", "rand_core", @@ -111,22 +147,34 @@ dependencies = [ [[package]] name = "rand_core" -version = "0.5.1" +version = "0.6.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" +checksum = "34cf66eb183df1c5876e2dcf6b13d57340741e8dc255b48e40a26de954d06ae7" dependencies = [ "getrandom", ] [[package]] name = "rand_hc" -version = "0.2.0" +version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" +checksum = "3190ef7066a446f2e7f42e239d161e905420ccab01eb967c9eb27d21b2322a73" dependencies = [ "rand_core", ] +[[package]] +name = "rustversion" +version = "1.0.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cb5d2a036dc6d2d8fd16fde3498b04306e29bd193bf306a57427019b823d5acd" + +[[package]] +name = "scoped-tls" +version = "1.0.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea6a9290e3c9cf0f18145ef7ffa62d68ee0bf5fcd651017e586dc7fd5da448c2" + [[package]] name = "scopeguard" version = "1.1.0" @@ -135,6 +183,28 @@ checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" +version = "0.10.2+wasi-snapshot-preview1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6" + +[[package]] +name = "winapi" +version = "0.3.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419" +dependencies = [ + "winapi-i686-pc-windows-gnu", + "winapi-x86_64-pc-windows-gnu", +] + +[[package]] +name = "winapi-i686-pc-windows-gnu" +version = "0.4.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" + +[[package]] +name = "winapi-x86_64-pc-windows-gnu" +version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" +checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" diff --git a/vendor/crossbeam-epoch/Cargo.toml b/vendor/crossbeam-epoch/Cargo.toml index e14da07e3b..2d7eb00bb6 100644 --- a/vendor/crossbeam-epoch/Cargo.toml +++ b/vendor/crossbeam-epoch/Cargo.toml @@ -13,12 +13,11 @@ [package] edition = "2018" name = "crossbeam-epoch" -version = "0.9.1" +version = "0.9.3" authors = ["The Crossbeam Project Developers"] description = "Epoch-based garbage collection" homepage = "https://github.com/crossbeam-rs/crossbeam/tree/master/crossbeam-epoch" documentation = "https://docs.rs/crossbeam-epoch" -readme = "README.md" keywords = ["lock-free", "rcu", "atomic", "garbage"] categories = ["concurrency", "memory-management", "no-std"] license = "MIT OR Apache-2.0" @@ -27,10 +26,11 @@ repository = "https://github.com/crossbeam-rs/crossbeam" version = "1" [dependencies.const_fn] -version = "0.4" +version = "0.4.4" +optional = true [dependencies.crossbeam-utils] -version = "0.8" +version = "0.8.3" default-features = false [dependencies.lazy_static] @@ -44,11 +44,15 @@ version = "0.6" version = "1.1.0" default-features = false [dev-dependencies.rand] -version = "0.7.3" +version = "0.8" [features] alloc = [] default = ["std"] -nightly = ["crossbeam-utils/nightly"] -sanitize = [] +loom = ["loom-crate", "crossbeam-utils/loom"] +nightly = ["crossbeam-utils/nightly", "const_fn"] std = ["alloc", "crossbeam-utils/std", "lazy_static"] +[target."cfg(crossbeam_loom)".dependencies.loom-crate] +version = "0.4" +optional = true +package = "loom" diff --git a/vendor/crossbeam-epoch/README.md b/vendor/crossbeam-epoch/README.md index 7e3d3a9ed8..c8ebd87a79 100644 --- a/vendor/crossbeam-epoch/README.md +++ b/vendor/crossbeam-epoch/README.md @@ -2,7 +2,7 @@ [![Build Status](https://github.com/crossbeam-rs/crossbeam/workflows/CI/badge.svg)]( https://github.com/crossbeam-rs/crossbeam/actions) -[![License](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue.svg)]( +[![License](https://img.shields.io/badge/license-MIT_OR_Apache--2.0-blue.svg)]( https://github.com/crossbeam-rs/crossbeam/tree/master/crossbeam-epoch#license) [![Cargo](https://img.shields.io/crates/v/crossbeam-epoch.svg)]( https://crates.io/crates/crossbeam-epoch) @@ -20,7 +20,7 @@ immediately. Epoch-based GC is an efficient mechanism for deferring destruction shared objects until no pointers to them can exist. Everything in this crate except the global GC can be used in `no_std` environments, provided that -features `alloc` and `nightly` are enabled. +`alloc` feature is enabled. ## Usage diff --git a/vendor/crossbeam-epoch/examples/sanitize.rs b/vendor/crossbeam-epoch/examples/sanitize.rs index 5110f8af4a..4109c34a8c 100644 --- a/vendor/crossbeam-epoch/examples/sanitize.rs +++ b/vendor/crossbeam-epoch/examples/sanitize.rs @@ -14,7 +14,7 @@ fn worker(a: Arc>, handle: LocalHandle) -> usize { if rng.gen() { thread::sleep(Duration::from_millis(1)); } - let timeout = Duration::from_millis(rng.gen_range(0, 10)); + let timeout = Duration::from_millis(rng.gen_range(0..10)); let now = Instant::now(); while now.elapsed() < timeout { diff --git a/vendor/crossbeam-epoch/examples/treiber_stack.rs b/vendor/crossbeam-epoch/examples/treiber_stack.rs deleted file mode 100644 index a2c3c16ff1..0000000000 --- a/vendor/crossbeam-epoch/examples/treiber_stack.rs +++ /dev/null @@ -1,107 +0,0 @@ -use std::mem::ManuallyDrop; -use std::ptr; -use std::sync::atomic::Ordering::{Acquire, Relaxed, Release}; - -use crossbeam_epoch::{self as epoch, Atomic, Owned}; -use crossbeam_utils::thread::scope; - -/// Treiber's lock-free stack. -/// -/// Usable with any number of producers and consumers. -#[derive(Debug)] -pub struct TreiberStack { - head: Atomic>, -} - -#[derive(Debug)] -struct Node { - data: ManuallyDrop, - next: Atomic>, -} - -impl TreiberStack { - /// Creates a new, empty stack. - pub fn new() -> TreiberStack { - TreiberStack { - head: Atomic::null(), - } - } - - /// Pushes a value on top of the stack. - pub fn push(&self, t: T) { - let mut n = Owned::new(Node { - data: ManuallyDrop::new(t), - next: Atomic::null(), - }); - - let guard = epoch::pin(); - - loop { - let head = self.head.load(Relaxed, &guard); - n.next.store(head, Relaxed); - - match self.head.compare_and_set(head, n, Release, &guard) { - Ok(_) => break, - Err(e) => n = e.new, - } - } - } - - /// Attempts to pop the top element from the stack. - /// - /// Returns `None` if the stack is empty. - pub fn pop(&self) -> Option { - let guard = epoch::pin(); - loop { - let head = self.head.load(Acquire, &guard); - - match unsafe { head.as_ref() } { - Some(h) => { - let next = h.next.load(Relaxed, &guard); - - if self - .head - .compare_and_set(head, next, Relaxed, &guard) - .is_ok() - { - unsafe { - guard.defer_destroy(head); - return Some(ManuallyDrop::into_inner(ptr::read(&(*h).data))); - } - } - } - None => return None, - } - } - } - - /// Returns `true` if the stack is empty. - pub fn is_empty(&self) -> bool { - let guard = epoch::pin(); - self.head.load(Acquire, &guard).is_null() - } -} - -impl Drop for TreiberStack { - fn drop(&mut self) { - while self.pop().is_some() {} - } -} - -fn main() { - let stack = TreiberStack::new(); - - scope(|scope| { - for _ in 0..10 { - scope.spawn(|_| { - for i in 0..10_000 { - stack.push(i); - assert!(stack.pop().is_some()); - } - }); - } - }) - .unwrap(); - - assert!(stack.pop().is_none()); -} diff --git a/vendor/crossbeam-epoch/src/atomic.rs b/vendor/crossbeam-epoch/src/atomic.rs index 517718745a..e4ca23f147 100644 --- a/vendor/crossbeam-epoch/src/atomic.rs +++ b/vendor/crossbeam-epoch/src/atomic.rs @@ -5,12 +5,12 @@ use core::marker::PhantomData; use core::mem::{self, MaybeUninit}; use core::ops::{Deref, DerefMut}; use core::slice; -use core::sync::atomic::{AtomicUsize, Ordering}; +use core::sync::atomic::Ordering; use crate::alloc::alloc; use crate::alloc::boxed::Box; use crate::guard::Guard; -use const_fn::const_fn; +use crate::primitive::sync::atomic::AtomicUsize; use crossbeam_utils::atomic::AtomicConsume; /// Given ordering for the success case in a compare-exchange operation, returns the strongest @@ -26,7 +26,12 @@ fn strongest_failure_ordering(ord: Ordering) -> Ordering { } /// The error returned on failed compare-and-set operation. -pub struct CompareAndSetError<'g, T: ?Sized + Pointable, P: Pointer> { +// TODO: remove in the next major version. +#[deprecated(note = "Use `CompareExchangeError` instead")] +pub type CompareAndSetError<'g, T, P> = CompareExchangeError<'g, T, P>; + +/// The error returned on failed compare-and-swap operation. +pub struct CompareExchangeError<'g, T: ?Sized + Pointable, P: Pointer> { /// The value in the atomic pointer at the time of the failed operation. pub current: Shared<'g, T>, @@ -34,9 +39,9 @@ pub struct CompareAndSetError<'g, T: ?Sized + Pointable, P: Pointer> { pub new: P, } -impl<'g, T: 'g, P: Pointer + fmt::Debug> fmt::Debug for CompareAndSetError<'g, T, P> { +impl + fmt::Debug> fmt::Debug for CompareExchangeError<'_, T, P> { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("CompareAndSetError") + f.debug_struct("CompareExchangeError") .field("current", &self.current) .field("new", &self.new) .finish() @@ -54,6 +59,11 @@ impl<'g, T: 'g, P: Pointer + fmt::Debug> fmt::Debug for CompareAndSetError<'g /// ordering is chosen. /// 2. A pair of `Ordering`s. The first one is for the success case, while the second one is /// for the failure case. +// TODO: remove in the next major version. +#[deprecated( + note = "`compare_and_set` and `compare_and_set_weak` that use this trait are deprecated, \ + use `compare_exchange` or `compare_exchange_weak instead`" +)] pub trait CompareAndSetOrdering { /// The ordering of the operation when it succeeds. fn success(&self) -> Ordering; @@ -65,6 +75,7 @@ pub trait CompareAndSetOrdering { fn failure(&self) -> Ordering; } +#[allow(deprecated)] impl CompareAndSetOrdering for Ordering { #[inline] fn success(&self) -> Ordering { @@ -77,6 +88,7 @@ impl CompareAndSetOrdering for Ordering { } } +#[allow(deprecated)] impl CompareAndSetOrdering for (Ordering, Ordering) { #[inline] fn success(&self) -> Ordering { @@ -327,8 +339,8 @@ impl Atomic { /// let a = Atomic::::null(); /// ``` /// - #[const_fn(feature = "nightly")] - pub const fn null() -> Atomic { + #[cfg_attr(all(feature = "nightly", not(crossbeam_loom)), const_fn::const_fn)] + pub fn null() -> Atomic { Self { data: AtomicUsize::new(0), _marker: PhantomData, @@ -426,8 +438,14 @@ impl Atomic { /// pointer that was written is returned. On failure the actual current value and `new` are /// returned. /// - /// This method takes a [`CompareAndSetOrdering`] argument which describes the memory - /// ordering of this operation. + /// This method takes two `Ordering` arguments to describe the memory + /// ordering of this operation. `success` describes the required ordering for the + /// read-modify-write operation that takes place if the comparison with `current` succeeds. + /// `failure` describes the required ordering for the load operation that takes place when + /// the comparison fails. Using `Acquire` as success ordering makes the store part + /// of this operation `Relaxed`, and using `Release` makes the successful load + /// `Relaxed`. The failure ordering can only be `SeqCst`, `Acquire` or `Relaxed` + /// and must be equivalent to or weaker than the success ordering. /// /// # Examples /// @@ -439,32 +457,162 @@ impl Atomic { /// /// let guard = &epoch::pin(); /// let curr = a.load(SeqCst, guard); - /// let res1 = a.compare_and_set(curr, Shared::null(), SeqCst, guard); - /// let res2 = a.compare_and_set(curr, Owned::new(5678), SeqCst, guard); + /// let res1 = a.compare_exchange(curr, Shared::null(), SeqCst, SeqCst, guard); + /// let res2 = a.compare_exchange(curr, Owned::new(5678), SeqCst, SeqCst, guard); /// ``` - pub fn compare_and_set<'g, O, P>( + pub fn compare_exchange<'g, P>( &self, current: Shared<'_, T>, new: P, - ord: O, + success: Ordering, + failure: Ordering, _: &'g Guard, - ) -> Result, CompareAndSetError<'g, T, P>> + ) -> Result, CompareExchangeError<'g, T, P>> + where + P: Pointer, + { + let new = new.into_usize(); + self.data + .compare_exchange(current.into_usize(), new, success, failure) + .map(|_| unsafe { Shared::from_usize(new) }) + .map_err(|current| unsafe { + CompareExchangeError { + current: Shared::from_usize(current), + new: P::from_usize(new), + } + }) + } + + /// Stores the pointer `new` (either `Shared` or `Owned`) into the atomic pointer if the current + /// value is the same as `current`. The tag is also taken into account, so two pointers to the + /// same object, but with different tags, will not be considered equal. + /// + /// Unlike [`compare_exchange`], this method is allowed to spuriously fail even when comparison + /// succeeds, which can result in more efficient code on some platforms. The return value is a + /// result indicating whether the new pointer was written. On success the pointer that was + /// written is returned. On failure the actual current value and `new` are returned. + /// + /// This method takes two `Ordering` arguments to describe the memory + /// ordering of this operation. `success` describes the required ordering for the + /// read-modify-write operation that takes place if the comparison with `current` succeeds. + /// `failure` describes the required ordering for the load operation that takes place when + /// the comparison fails. Using `Acquire` as success ordering makes the store part + /// of this operation `Relaxed`, and using `Release` makes the successful load + /// `Relaxed`. The failure ordering can only be `SeqCst`, `Acquire` or `Relaxed` + /// and must be equivalent to or weaker than the success ordering. + /// + /// [`compare_exchange`]: Atomic::compare_exchange + /// + /// # Examples + /// + /// ``` + /// use crossbeam_epoch::{self as epoch, Atomic, Owned, Shared}; + /// use std::sync::atomic::Ordering::SeqCst; + /// + /// let a = Atomic::new(1234); + /// let guard = &epoch::pin(); + /// + /// let mut new = Owned::new(5678); + /// let mut ptr = a.load(SeqCst, guard); + /// loop { + /// match a.compare_exchange_weak(ptr, new, SeqCst, SeqCst, guard) { + /// Ok(p) => { + /// ptr = p; + /// break; + /// } + /// Err(err) => { + /// ptr = err.current; + /// new = err.new; + /// } + /// } + /// } + /// + /// let mut curr = a.load(SeqCst, guard); + /// loop { + /// match a.compare_exchange_weak(curr, Shared::null(), SeqCst, SeqCst, guard) { + /// Ok(_) => break, + /// Err(err) => curr = err.current, + /// } + /// } + /// ``` + pub fn compare_exchange_weak<'g, P>( + &self, + current: Shared<'_, T>, + new: P, + success: Ordering, + failure: Ordering, + _: &'g Guard, + ) -> Result, CompareExchangeError<'g, T, P>> where - O: CompareAndSetOrdering, P: Pointer, { let new = new.into_usize(); self.data - .compare_exchange(current.into_usize(), new, ord.success(), ord.failure()) + .compare_exchange_weak(current.into_usize(), new, success, failure) .map(|_| unsafe { Shared::from_usize(new) }) .map_err(|current| unsafe { - CompareAndSetError { + CompareExchangeError { current: Shared::from_usize(current), new: P::from_usize(new), } }) } + /// Stores the pointer `new` (either `Shared` or `Owned`) into the atomic pointer if the current + /// value is the same as `current`. The tag is also taken into account, so two pointers to the + /// same object, but with different tags, will not be considered equal. + /// + /// The return value is a result indicating whether the new pointer was written. On success the + /// pointer that was written is returned. On failure the actual current value and `new` are + /// returned. + /// + /// This method takes a [`CompareAndSetOrdering`] argument which describes the memory + /// ordering of this operation. + /// + /// # Migrating to `compare_exchange` + /// + /// `compare_and_set` is equivalent to `compare_exchange` with the following mapping for + /// memory orderings: + /// + /// Original | Success | Failure + /// -------- | ------- | ------- + /// Relaxed | Relaxed | Relaxed + /// Acquire | Acquire | Acquire + /// Release | Release | Relaxed + /// AcqRel | AcqRel | Acquire + /// SeqCst | SeqCst | SeqCst + /// + /// # Examples + /// + /// ``` + /// # #![allow(deprecated)] + /// use crossbeam_epoch::{self as epoch, Atomic, Owned, Shared}; + /// use std::sync::atomic::Ordering::SeqCst; + /// + /// let a = Atomic::new(1234); + /// + /// let guard = &epoch::pin(); + /// let curr = a.load(SeqCst, guard); + /// let res1 = a.compare_and_set(curr, Shared::null(), SeqCst, guard); + /// let res2 = a.compare_and_set(curr, Owned::new(5678), SeqCst, guard); + /// ``` + // TODO: remove in the next major version. + #[allow(deprecated)] + #[deprecated(note = "Use `compare_exchange` instead")] + pub fn compare_and_set<'g, O, P>( + &self, + current: Shared<'_, T>, + new: P, + ord: O, + guard: &'g Guard, + ) -> Result, CompareAndSetError<'g, T, P>> + where + O: CompareAndSetOrdering, + P: Pointer, + { + self.compare_exchange(current, new, ord.success(), ord.failure(), guard) + } + /// Stores the pointer `new` (either `Shared` or `Owned`) into the atomic pointer if the current /// value is the same as `current`. The tag is also taken into account, so two pointers to the /// same object, but with different tags, will not be considered equal. @@ -479,9 +627,23 @@ impl Atomic { /// /// [`compare_and_set`]: Atomic::compare_and_set /// + /// # Migrating to `compare_exchange_weak` + /// + /// `compare_and_set_weak` is equivalent to `compare_exchange_weak` with the following mapping for + /// memory orderings: + /// + /// Original | Success | Failure + /// -------- | ------- | ------- + /// Relaxed | Relaxed | Relaxed + /// Acquire | Acquire | Acquire + /// Release | Release | Relaxed + /// AcqRel | AcqRel | Acquire + /// SeqCst | SeqCst | SeqCst + /// /// # Examples /// /// ``` + /// # #![allow(deprecated)] /// use crossbeam_epoch::{self as epoch, Atomic, Owned, Shared}; /// use std::sync::atomic::Ordering::SeqCst; /// @@ -511,27 +673,21 @@ impl Atomic { /// } /// } /// ``` + // TODO: remove in the next major version. + #[allow(deprecated)] + #[deprecated(note = "Use `compare_exchange_weak` instead")] pub fn compare_and_set_weak<'g, O, P>( &self, current: Shared<'_, T>, new: P, ord: O, - _: &'g Guard, + guard: &'g Guard, ) -> Result, CompareAndSetError<'g, T, P>> where O: CompareAndSetOrdering, P: Pointer, { - let new = new.into_usize(); - self.data - .compare_exchange_weak(current.into_usize(), new, ord.success(), ord.failure()) - .map(|_| unsafe { Shared::from_usize(new) }) - .map_err(|current| unsafe { - CompareAndSetError { - current: Shared::from_usize(current), - new: P::from_usize(new), - } - }) + self.compare_exchange_weak(current, new, ord.success(), ord.failure(), guard) } /// Bitwise "and" with the current tag. @@ -638,7 +794,17 @@ impl Atomic { /// } /// ``` pub unsafe fn into_owned(self) -> Owned { - Owned::from_usize(self.data.into_inner()) + #[cfg(crossbeam_loom)] + { + // FIXME: loom does not yet support into_inner, so we use unsync_load for now, + // which should have the same synchronization properties: + // https://github.com/tokio-rs/loom/issues/117 + Owned::from_usize(self.data.unsync_load()) + } + #[cfg(not(crossbeam_loom))] + { + Owned::from_usize(self.data.into_inner()) + } } } @@ -1358,7 +1524,7 @@ impl Default for Shared<'_, T> { } } -#[cfg(test)] +#[cfg(all(test, not(crossbeam_loom)))] mod tests { use super::Shared; @@ -1371,4 +1537,11 @@ mod tests { fn valid_tag_i64() { Shared::::null().with_tag(7); } + + #[cfg(feature = "nightly")] + #[test] + fn const_atomic_null() { + use super::Atomic; + const _: Atomic = Atomic::::null(); + } } diff --git a/vendor/crossbeam-epoch/src/collector.rs b/vendor/crossbeam-epoch/src/collector.rs index 8224e1184d..7cfb8192a7 100644 --- a/vendor/crossbeam-epoch/src/collector.rs +++ b/vendor/crossbeam-epoch/src/collector.rs @@ -14,9 +14,9 @@ /// ``` use core::fmt; -use crate::alloc::sync::Arc; use crate::guard::Guard; use crate::internal::{Global, Local}; +use crate::primitive::sync::Arc; /// An epoch-based garbage collector. pub struct Collector { @@ -109,7 +109,7 @@ impl fmt::Debug for LocalHandle { } } -#[cfg(test)] +#[cfg(all(test, not(crossbeam_loom)))] mod tests { use std::mem; use std::sync::atomic::{AtomicUsize, Ordering}; @@ -151,9 +151,9 @@ mod tests { let a = Owned::new(7).into_shared(guard); guard.defer_destroy(a); - assert!(!(*(*guard.local).bag.get()).is_empty()); + assert!(!(*guard.local).bag.with(|b| (*b).is_empty())); - while !(*(*guard.local).bag.get()).is_empty() { + while !(*guard.local).bag.with(|b| (*b).is_empty()) { guard.flush(); } } @@ -172,7 +172,7 @@ mod tests { let a = Owned::new(7).into_shared(guard); guard.defer_destroy(a); } - assert!(!(*(*guard.local).bag.get()).is_empty()); + assert!(!(*guard.local).bag.with(|b| (*b).is_empty())); } } @@ -199,6 +199,7 @@ mod tests { .unwrap(); } + #[cfg(not(crossbeam_sanitize))] // TODO: assertions failed due to `cfg(crossbeam_sanitize)` reduce `internal::MAX_OBJECTS` #[test] fn incremental() { const COUNT: usize = 100_000; diff --git a/vendor/crossbeam-epoch/src/default.rs b/vendor/crossbeam-epoch/src/default.rs index 1deac2114e..b7797ce960 100644 --- a/vendor/crossbeam-epoch/src/default.rs +++ b/vendor/crossbeam-epoch/src/default.rs @@ -6,7 +6,7 @@ use crate::collector::{Collector, LocalHandle}; use crate::guard::Guard; -use lazy_static::lazy_static; +use crate::primitive::{lazy_static, thread_local}; lazy_static! { /// The global data for the default garbage collector. @@ -45,7 +45,7 @@ where .unwrap_or_else(|_| f(&COLLECTOR.register())) } -#[cfg(test)] +#[cfg(all(test, not(crossbeam_loom)))] mod tests { use crossbeam_utils::thread; diff --git a/vendor/crossbeam-epoch/src/deferred.rs b/vendor/crossbeam-epoch/src/deferred.rs index 9f4869b3ba..d953c46180 100644 --- a/vendor/crossbeam-epoch/src/deferred.rs +++ b/vendor/crossbeam-epoch/src/deferred.rs @@ -16,7 +16,7 @@ type Data = [usize; DATA_WORDS]; /// A `FnOnce()` that is stored inline if small, or otherwise boxed on the heap. /// /// This is a handy way of keeping an unsized `FnOnce()` within a sized structure. -pub struct Deferred { +pub(crate) struct Deferred { call: unsafe fn(*mut u8), data: Data, _marker: PhantomData<*mut ()>, // !Send + !Sync @@ -30,7 +30,7 @@ impl fmt::Debug for Deferred { impl Deferred { /// Constructs a new `Deferred` from a `FnOnce()`. - pub fn new(f: F) -> Self { + pub(crate) fn new(f: F) -> Self { let size = mem::size_of::(); let align = mem::align_of::(); @@ -73,13 +73,13 @@ impl Deferred { /// Calls the function. #[inline] - pub fn call(mut self) { + pub(crate) fn call(mut self) { let call = self.call; unsafe { call(&mut self.data as *mut Data as *mut u8) }; } } -#[cfg(test)] +#[cfg(all(test, not(crossbeam_loom)))] mod tests { use super::Deferred; use std::cell::Cell; diff --git a/vendor/crossbeam-epoch/src/epoch.rs b/vendor/crossbeam-epoch/src/epoch.rs index e7759d9355..663508bd7b 100644 --- a/vendor/crossbeam-epoch/src/epoch.rs +++ b/vendor/crossbeam-epoch/src/epoch.rs @@ -7,14 +7,15 @@ //! If an object became garbage in some epoch, then we can be sure that after two advancements no //! participant will hold a reference to it. That is the crux of safe memory reclamation. -use core::sync::atomic::{AtomicUsize, Ordering}; +use crate::primitive::sync::atomic::AtomicUsize; +use core::sync::atomic::Ordering; /// An epoch that can be marked as pinned or unpinned. /// /// Internally, the epoch is represented as an integer that wraps around at some unspecified point /// and a flag that represents whether it is pinned or unpinned. #[derive(Copy, Clone, Default, Debug, Eq, PartialEq)] -pub struct Epoch { +pub(crate) struct Epoch { /// The least significant bit is set if pinned. The rest of the bits hold the epoch. data: usize, } @@ -22,7 +23,7 @@ pub struct Epoch { impl Epoch { /// Returns the starting epoch in unpinned state. #[inline] - pub fn starting() -> Self { + pub(crate) fn starting() -> Self { Self::default() } @@ -30,7 +31,7 @@ impl Epoch { /// /// Internally, epochs are represented as numbers in the range `(isize::MIN / 2) .. (isize::MAX /// / 2)`, so the returned distance will be in the same interval. - pub fn wrapping_sub(self, rhs: Self) -> isize { + pub(crate) fn wrapping_sub(self, rhs: Self) -> isize { // The result is the same with `(self.data & !1).wrapping_sub(rhs.data & !1) as isize >> 1`, // because the possible difference of LSB in `(self.data & !1).wrapping_sub(rhs.data & !1)` // will be ignored in the shift operation. @@ -39,13 +40,13 @@ impl Epoch { /// Returns `true` if the epoch is marked as pinned. #[inline] - pub fn is_pinned(self) -> bool { + pub(crate) fn is_pinned(self) -> bool { (self.data & 1) == 1 } /// Returns the same epoch, but marked as pinned. #[inline] - pub fn pinned(self) -> Epoch { + pub(crate) fn pinned(self) -> Epoch { Epoch { data: self.data | 1, } @@ -53,7 +54,7 @@ impl Epoch { /// Returns the same epoch, but marked as unpinned. #[inline] - pub fn unpinned(self) -> Epoch { + pub(crate) fn unpinned(self) -> Epoch { Epoch { data: self.data & !1, } @@ -63,7 +64,7 @@ impl Epoch { /// /// The returned epoch will be marked as pinned only if the previous one was as well. #[inline] - pub fn successor(self) -> Epoch { + pub(crate) fn successor(self) -> Epoch { Epoch { data: self.data.wrapping_add(2), } @@ -72,7 +73,7 @@ impl Epoch { /// An atomic value that holds an `Epoch`. #[derive(Default, Debug)] -pub struct AtomicEpoch { +pub(crate) struct AtomicEpoch { /// Since `Epoch` is just a wrapper around `usize`, an `AtomicEpoch` is similarly represented /// using an `AtomicUsize`. data: AtomicUsize, @@ -81,14 +82,14 @@ pub struct AtomicEpoch { impl AtomicEpoch { /// Creates a new atomic epoch. #[inline] - pub fn new(epoch: Epoch) -> Self { + pub(crate) fn new(epoch: Epoch) -> Self { let data = AtomicUsize::new(epoch.data); AtomicEpoch { data } } /// Loads a value from the atomic epoch. #[inline] - pub fn load(&self, ord: Ordering) -> Epoch { + pub(crate) fn load(&self, ord: Ordering) -> Epoch { Epoch { data: self.data.load(ord), } @@ -96,19 +97,37 @@ impl AtomicEpoch { /// Stores a value into the atomic epoch. #[inline] - pub fn store(&self, epoch: Epoch, ord: Ordering) { + pub(crate) fn store(&self, epoch: Epoch, ord: Ordering) { self.data.store(epoch.data, ord); } /// Stores a value into the atomic epoch if the current value is the same as `current`. /// - /// The return value is always the previous value. If it is equal to `current`, then the value - /// is updated. + /// The return value is a result indicating whether the new value was written and containing + /// the previous value. On success this value is guaranteed to be equal to `current`. /// - /// The `Ordering` argument describes the memory ordering of this operation. + /// This method takes two `Ordering` arguments to describe the memory + /// ordering of this operation. `success` describes the required ordering for the + /// read-modify-write operation that takes place if the comparison with `current` succeeds. + /// `failure` describes the required ordering for the load operation that takes place when + /// the comparison fails. Using `Acquire` as success ordering makes the store part + /// of this operation `Relaxed`, and using `Release` makes the successful load + /// `Relaxed`. The failure ordering can only be `SeqCst`, `Acquire` or `Relaxed` + /// and must be equivalent to or weaker than the success ordering. #[inline] - pub fn compare_and_swap(&self, current: Epoch, new: Epoch, ord: Ordering) -> Epoch { - let data = self.data.compare_and_swap(current.data, new.data, ord); - Epoch { data } + pub(crate) fn compare_exchange( + &self, + current: Epoch, + new: Epoch, + success: Ordering, + failure: Ordering, + ) -> Result { + match self + .data + .compare_exchange(current.data, new.data, success, failure) + { + Ok(data) => Ok(Epoch { data }), + Err(data) => Err(Epoch { data }), + } } } diff --git a/vendor/crossbeam-epoch/src/internal.rs b/vendor/crossbeam-epoch/src/internal.rs index bf2dfb8870..966bceb2ea 100644 --- a/vendor/crossbeam-epoch/src/internal.rs +++ b/vendor/crossbeam-epoch/src/internal.rs @@ -35,10 +35,11 @@ //! Ideally each instance of concurrent data structure may have its own queue that gets fully //! destroyed as soon as the data structure gets dropped. -use core::cell::{Cell, UnsafeCell}; +use crate::primitive::cell::UnsafeCell; +use crate::primitive::sync::atomic; +use core::cell::Cell; use core::mem::{self, ManuallyDrop}; use core::num::Wrapping; -use core::sync::atomic; use core::sync::atomic::Ordering; use core::{fmt, ptr}; @@ -54,13 +55,13 @@ use crate::sync::list::{Entry, IsElement, IterError, List}; use crate::sync::queue::Queue; /// Maximum number of objects a bag can contain. -#[cfg(not(feature = "sanitize"))] +#[cfg(not(crossbeam_sanitize))] const MAX_OBJECTS: usize = 62; -#[cfg(feature = "sanitize")] +#[cfg(crossbeam_sanitize)] const MAX_OBJECTS: usize = 4; /// A bag of deferred functions. -pub struct Bag { +pub(crate) struct Bag { /// Stashed objects. deferreds: [Deferred; MAX_OBJECTS], len: usize, @@ -71,12 +72,12 @@ unsafe impl Send for Bag {} impl Bag { /// Returns a new, empty bag. - pub fn new() -> Self { + pub(crate) fn new() -> Self { Self::default() } /// Returns `true` if the bag is empty. - pub fn is_empty(&self) -> bool { + pub(crate) fn is_empty(&self) -> bool { self.len == 0 } @@ -88,7 +89,7 @@ impl Bag { /// # Safety /// /// It should be safe for another thread to execute the given function. - pub unsafe fn try_push(&mut self, deferred: Deferred) -> Result<(), Deferred> { + pub(crate) unsafe fn try_push(&mut self, deferred: Deferred) -> Result<(), Deferred> { if self.len < MAX_OBJECTS { self.deferreds[self.len] = deferred; self.len += 1; @@ -108,7 +109,7 @@ impl Default for Bag { #[rustfmt::skip] fn default() -> Self { // TODO: [no_op; MAX_OBJECTS] syntax blocked by https://github.com/rust-lang/rust/issues/49147 - #[cfg(not(feature = "sanitize"))] + #[cfg(not(crossbeam_sanitize))] return Bag { len: 0, deferreds: [ @@ -176,7 +177,7 @@ impl Default for Bag { Deferred::new(no_op_func), ], }; - #[cfg(feature = "sanitize")] + #[cfg(crossbeam_sanitize)] return Bag { len: 0, deferreds: [ @@ -231,7 +232,7 @@ impl SealedBag { } /// The global data for a garbage collector. -pub struct Global { +pub(crate) struct Global { /// The intrusive linked list of `Local`s. locals: List, @@ -248,7 +249,7 @@ impl Global { /// Creates a new global data for garbage collection. #[inline] - pub fn new() -> Self { + pub(crate) fn new() -> Self { Self { locals: List::new(), queue: Queue::new(), @@ -257,7 +258,7 @@ impl Global { } /// Pushes the bag into the global queue and replaces the bag with a new empty bag. - pub fn push_bag(&self, bag: &mut Bag, guard: &Guard) { + pub(crate) fn push_bag(&self, bag: &mut Bag, guard: &Guard) { let bag = mem::replace(bag, Bag::new()); atomic::fence(Ordering::SeqCst); @@ -274,10 +275,10 @@ impl Global { /// path. In other words, we want the compiler to optimize branching for the case when /// `collect()` is not called. #[cold] - pub fn collect(&self, guard: &Guard) { + pub(crate) fn collect(&self, guard: &Guard) { let global_epoch = self.try_advance(guard); - let steps = if cfg!(feature = "sanitize") { + let steps = if cfg!(crossbeam_sanitize) { usize::max_value() } else { Self::COLLECT_STEPS @@ -303,7 +304,7 @@ impl Global { /// /// `try_advance()` is annotated `#[cold]` because it is rarely called. #[cold] - pub fn try_advance(&self, guard: &Guard) -> Epoch { + pub(crate) fn try_advance(&self, guard: &Guard) -> Epoch { let global_epoch = self.epoch.load(Ordering::Relaxed); atomic::fence(Ordering::SeqCst); @@ -345,7 +346,7 @@ impl Global { } /// Participant for garbage collection. -pub struct Local { +pub(crate) struct Local { /// A node in the intrusive linked list of `Local`s. entry: Entry, @@ -374,9 +375,13 @@ pub struct Local { // Make sure `Local` is less than or equal to 2048 bytes. // https://github.com/crossbeam-rs/crossbeam/issues/551 +#[cfg(not(crossbeam_sanitize))] // `crossbeam_sanitize` reduces the size of `Local` #[test] fn local_size() { - assert!(core::mem::size_of::() <= 2048, "An allocation of `Local` should be <= 2048 bytes."); + assert!( + core::mem::size_of::() <= 2048, + "An allocation of `Local` should be <= 2048 bytes." + ); } impl Local { @@ -385,7 +390,7 @@ impl Local { const PINNINGS_BETWEEN_COLLECT: usize = 128; /// Registers a new `Local` in the provided `Global`. - pub fn register(collector: &Collector) -> LocalHandle { + pub(crate) fn register(collector: &Collector) -> LocalHandle { unsafe { // Since we dereference no pointers in this block, it is safe to use `unprotected`. @@ -408,19 +413,19 @@ impl Local { /// Returns a reference to the `Global` in which this `Local` resides. #[inline] - pub fn global(&self) -> &Global { + pub(crate) fn global(&self) -> &Global { &self.collector().global } /// Returns a reference to the `Collector` in which this `Local` resides. #[inline] - pub fn collector(&self) -> &Collector { - unsafe { &**self.collector.get() } + pub(crate) fn collector(&self) -> &Collector { + self.collector.with(|c| unsafe { &**c }) } /// Returns `true` if the current participant is pinned. #[inline] - pub fn is_pinned(&self) -> bool { + pub(crate) fn is_pinned(&self) -> bool { self.guard_count.get() > 0 } @@ -429,8 +434,8 @@ impl Local { /// # Safety /// /// It should be safe for another thread to execute the given function. - pub unsafe fn defer(&self, mut deferred: Deferred, guard: &Guard) { - let bag = &mut *self.bag.get(); + pub(crate) unsafe fn defer(&self, mut deferred: Deferred, guard: &Guard) { + let bag = self.bag.with_mut(|b| &mut *b); while let Err(d) = bag.try_push(deferred) { self.global().push_bag(bag, guard); @@ -438,8 +443,8 @@ impl Local { } } - pub fn flush(&self, guard: &Guard) { - let bag = unsafe { &mut *self.bag.get() }; + pub(crate) fn flush(&self, guard: &Guard) { + let bag = self.bag.with_mut(|b| unsafe { &mut *b }); if !bag.is_empty() { self.global().push_bag(bag, guard); @@ -450,7 +455,7 @@ impl Local { /// Pins the `Local`. #[inline] - pub fn pin(&self) -> Guard { + pub(crate) fn pin(&self) -> Guard { let guard = Guard { local: self }; let guard_count = self.guard_count.get(); @@ -468,7 +473,7 @@ impl Local { // a `SeqCst` fence. // // 1. `atomic::fence(SeqCst)`, which compiles into a `mfence` instruction. - // 2. `_.compare_and_swap(_, _, SeqCst)`, which compiles into a `lock cmpxchg` + // 2. `_.compare_exchange(_, _, SeqCst, SeqCst)`, which compiles into a `lock cmpxchg` // instruction. // // Both instructions have the effect of a full barrier, but benchmarks have shown @@ -478,10 +483,13 @@ impl Local { // works fine. Using inline assembly would be a viable (and correct) alternative, // but alas, that is not possible on stable Rust. let current = Epoch::starting(); - let previous = self - .epoch - .compare_and_swap(current, new_epoch, Ordering::SeqCst); - debug_assert_eq!(current, previous, "participant was expected to be unpinned"); + let res = self.epoch.compare_exchange( + current, + new_epoch, + Ordering::SeqCst, + Ordering::SeqCst, + ); + debug_assert!(res.is_ok(), "participant was expected to be unpinned"); // We add a compiler fence to make it less likely for LLVM to do something wrong // here. Formally, this is not enough to get rid of data races; practically, // it should go a long way. @@ -507,7 +515,7 @@ impl Local { /// Unpins the `Local`. #[inline] - pub fn unpin(&self) { + pub(crate) fn unpin(&self) { let guard_count = self.guard_count.get(); self.guard_count.set(guard_count - 1); @@ -522,7 +530,7 @@ impl Local { /// Unpins and then pins the `Local`. #[inline] - pub fn repin(&self) { + pub(crate) fn repin(&self) { let guard_count = self.guard_count.get(); // Update the local epoch only if there's only one guard. @@ -545,7 +553,7 @@ impl Local { /// Increments the handle count. #[inline] - pub fn acquire_handle(&self) { + pub(crate) fn acquire_handle(&self) { let handle_count = self.handle_count.get(); debug_assert!(handle_count >= 1); self.handle_count.set(handle_count + 1); @@ -553,7 +561,7 @@ impl Local { /// Decrements the handle count. #[inline] - pub fn release_handle(&self) { + pub(crate) fn release_handle(&self) { let guard_count = self.guard_count.get(); let handle_count = self.handle_count.get(); debug_assert!(handle_count >= 1); @@ -577,7 +585,8 @@ impl Local { // Pin and move the local bag into the global queue. It's important that `push_bag` // doesn't defer destruction on any new garbage. let guard = &self.pin(); - self.global().push_bag(&mut *self.bag.get(), guard); + self.global() + .push_bag(self.bag.with_mut(|b| &mut *b), guard); } // Revert the handle count back to zero. self.handle_count.set(0); @@ -586,7 +595,7 @@ impl Local { // Take the reference to the `Global` out of this `Local`. Since we're not protected // by a guard at this time, it's crucial that the reference is read before marking the // `Local` as deleted. - let collector: Collector = ptr::read(&*(*self.collector.get())); + let collector: Collector = ptr::read(self.collector.with(|c| &*(*c))); // Mark this node in the linked list as deleted. self.entry.delete(unprotected()); @@ -617,7 +626,7 @@ impl IsElement for Local { } } -#[cfg(test)] +#[cfg(all(test, not(crossbeam_loom)))] mod tests { use std::sync::atomic::{AtomicUsize, Ordering}; diff --git a/vendor/crossbeam-epoch/src/lib.rs b/vendor/crossbeam-epoch/src/lib.rs index f64d16cd86..99da911ba9 100644 --- a/vendor/crossbeam-epoch/src/lib.rs +++ b/vendor/crossbeam-epoch/src/lib.rs @@ -55,15 +55,105 @@ allow(dead_code, unused_assignments, unused_variables) ) ))] -#![warn(missing_docs, missing_debug_implementations, rust_2018_idioms)] +#![warn( + missing_docs, + missing_debug_implementations, + rust_2018_idioms, + unreachable_pub +)] #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(feature = "nightly", feature(cfg_target_has_atomic))] #![cfg_attr(feature = "nightly", feature(const_fn))] -// matches! requires Rust 1.42 -#![allow(clippy::match_like_matches_macro)] + +#[cfg(crossbeam_loom)] +extern crate loom_crate as loom; use cfg_if::cfg_if; +#[cfg(crossbeam_loom)] +#[allow(unused_imports, dead_code)] +mod primitive { + pub(crate) mod cell { + pub(crate) use loom::cell::UnsafeCell; + } + pub(crate) mod sync { + pub(crate) mod atomic { + use core::sync::atomic::Ordering; + pub(crate) use loom::sync::atomic::AtomicUsize; + pub(crate) fn fence(ord: Ordering) { + if let Ordering::Acquire = ord { + } else { + // FIXME: loom only supports acquire fences at the moment. + // https://github.com/tokio-rs/loom/issues/117 + // let's at least not panic... + // this may generate some false positives (`SeqCst` is stronger than `Acquire` + // for example), and some false negatives (`Relaxed` is weaker than `Acquire`), + // but it's the best we can do for the time being. + } + loom::sync::atomic::fence(Ordering::Acquire) + } + + // FIXME: loom does not support compiler_fence at the moment. + // https://github.com/tokio-rs/loom/issues/117 + // we use fence as a stand-in for compiler_fence for the time being. + // this may miss some races since fence is stronger than compiler_fence, + // but it's the best we can do for the time being. + pub(crate) use self::fence as compiler_fence; + } + pub(crate) use loom::sync::Arc; + } + pub(crate) use loom::lazy_static; + pub(crate) use loom::thread_local; +} +#[cfg(not(crossbeam_loom))] +#[allow(unused_imports, dead_code)] +mod primitive { + #[cfg(any(feature = "alloc", feature = "std"))] + pub(crate) mod cell { + #[derive(Debug)] + #[repr(transparent)] + pub(crate) struct UnsafeCell(::core::cell::UnsafeCell); + + // loom's UnsafeCell has a slightly different API than the standard library UnsafeCell. + // Since we want the rest of the code to be agnostic to whether it's running under loom or + // not, we write this small wrapper that provides the loom-supported API for the standard + // library UnsafeCell. This is also what the loom documentation recommends: + // https://github.com/tokio-rs/loom#handling-loom-api-differences + impl UnsafeCell { + #[inline] + pub(crate) fn new(data: T) -> UnsafeCell { + UnsafeCell(::core::cell::UnsafeCell::new(data)) + } + + #[inline] + pub(crate) fn with(&self, f: impl FnOnce(*const T) -> R) -> R { + f(self.0.get()) + } + + #[inline] + pub(crate) fn with_mut(&self, f: impl FnOnce(*mut T) -> R) -> R { + f(self.0.get()) + } + } + } + #[cfg(any(feature = "alloc", feature = "std"))] + pub(crate) mod sync { + pub(crate) mod atomic { + pub(crate) use core::sync::atomic::compiler_fence; + pub(crate) use core::sync::atomic::fence; + pub(crate) use core::sync::atomic::AtomicUsize; + } + #[cfg_attr(feature = "nightly", cfg(target_has_atomic = "ptr"))] + pub(crate) use alloc::sync::Arc; + } + + #[cfg(feature = "std")] + pub(crate) use std::thread_local; + + #[cfg(feature = "std")] + pub(crate) use lazy_static::lazy_static; +} + #[cfg_attr(feature = "nightly", cfg(target_has_atomic = "ptr"))] cfg_if! { if #[cfg(feature = "alloc")] { @@ -77,9 +167,15 @@ cfg_if! { mod internal; mod sync; - pub use self::atomic::{Pointable, Atomic, CompareAndSetError, CompareAndSetOrdering, Owned, Pointer, Shared}; + pub use self::atomic::{ + Pointable, Atomic, CompareExchangeError, + Owned, Pointer, Shared, + }; pub use self::collector::{Collector, LocalHandle}; pub use self::guard::{unprotected, Guard}; + + #[allow(deprecated)] + pub use self::atomic::{CompareAndSetError, CompareAndSetOrdering}; } } diff --git a/vendor/crossbeam-epoch/src/sync/list.rs b/vendor/crossbeam-epoch/src/sync/list.rs index 656e2a8499..52ffd6fca4 100644 --- a/vendor/crossbeam-epoch/src/sync/list.rs +++ b/vendor/crossbeam-epoch/src/sync/list.rs @@ -13,7 +13,7 @@ use crate::{unprotected, Atomic, Guard, Shared}; /// An Entry is accessed from multiple threads, so it would be beneficial to put it in a different /// cache-line than thread-local data in terms of performance. #[derive(Debug)] -pub struct Entry { +pub(crate) struct Entry { /// The next entry in the linked list. /// If the tag is 1, this entry is marked as deleted. next: Atomic, @@ -64,7 +64,7 @@ pub struct Entry { /// } /// ``` /// -pub trait IsElement { +pub(crate) trait IsElement { /// Returns a reference to this element's `Entry`. fn entry_of(_: &T) -> &Entry; @@ -93,7 +93,7 @@ pub trait IsElement { /// A lock-free, intrusive linked list of type `T`. #[derive(Debug)] -pub struct List = T> { +pub(crate) struct List = T> { /// The head of the linked list. head: Atomic, @@ -102,7 +102,7 @@ pub struct List = T> { } /// An iterator used for retrieving values from the list. -pub struct Iter<'g, T, C: IsElement> { +pub(crate) struct Iter<'g, T, C: IsElement> { /// The guard that protects the iteration. guard: &'g Guard, @@ -122,7 +122,7 @@ pub struct Iter<'g, T, C: IsElement> { /// An error that occurs during iteration over the list. #[derive(PartialEq, Debug)] -pub enum IterError { +pub(crate) enum IterError { /// A concurrent thread modified the state of the list at the same place that this iterator /// was inspecting. Subsequent iteration will restart from the beginning of the list. Stalled, @@ -145,14 +145,14 @@ impl Entry { /// The entry should be a member of a linked list, and it should not have been deleted. /// It should be safe to call `C::finalize` on the entry after the `guard` is dropped, where `C` /// is the associated helper for the linked list. - pub unsafe fn delete(&self, guard: &Guard) { + pub(crate) unsafe fn delete(&self, guard: &Guard) { self.next.fetch_or(1, Release, guard); } } impl> List { /// Returns a new, empty linked list. - pub fn new() -> Self { + pub(crate) fn new() -> Self { Self { head: Atomic::null(), _marker: PhantomData, @@ -169,7 +169,7 @@ impl> List { /// - `container` is immovable, e.g. inside an `Owned` /// - the same `Entry` is not inserted more than once /// - the inserted object will be removed before the list is dropped - pub unsafe fn insert<'g>(&'g self, container: Shared<'g, T>, guard: &'g Guard) { + pub(crate) unsafe fn insert<'g>(&'g self, container: Shared<'g, T>, guard: &'g Guard) { // Insert right after head, i.e. at the beginning of the list. let to = &self.head; // Get the intrusively stored Entry of the new element to insert. @@ -183,7 +183,7 @@ impl> List { // Set the Entry of the to-be-inserted element to point to the previous successor of // `to`. entry.next.store(next, Relaxed); - match to.compare_and_set_weak(next, entry_ptr, Release, guard) { + match to.compare_exchange_weak(next, entry_ptr, Release, Relaxed, guard) { Ok(_) => break, // We lost the race or weak CAS failed spuriously. Update the successor and try // again. @@ -204,7 +204,7 @@ impl> List { /// 2. If an object is deleted during iteration, it may or may not be returned. /// 3. The iteration may be aborted when it lost in a race condition. In this case, the winning /// thread will continue to iterate over the same list. - pub fn iter<'g>(&'g self, guard: &'g Guard) -> Iter<'g, T, C> { + pub(crate) fn iter<'g>(&'g self, guard: &'g Guard) -> Iter<'g, T, C> { Iter { guard, pred: &self.head, @@ -250,7 +250,7 @@ impl<'g, T: 'g, C: IsElement> Iterator for Iter<'g, T, C> { // Try to unlink `curr` from the list, and get the new value of `self.pred`. let succ = match self .pred - .compare_and_set(self.curr, succ, Acquire, self.guard) + .compare_exchange(self.curr, succ, Acquire, Acquire, self.guard) { Ok(_) => { // We succeeded in unlinking `curr`, so we have to schedule @@ -295,7 +295,7 @@ impl<'g, T: 'g, C: IsElement> Iterator for Iter<'g, T, C> { } } -#[cfg(test)] +#[cfg(all(test, not(crossbeam_loom)))] mod tests { use super::*; use crate::{Collector, Owned}; diff --git a/vendor/crossbeam-epoch/src/sync/mod.rs b/vendor/crossbeam-epoch/src/sync/mod.rs index f8eb259600..5c06e7643c 100644 --- a/vendor/crossbeam-epoch/src/sync/mod.rs +++ b/vendor/crossbeam-epoch/src/sync/mod.rs @@ -1,4 +1,4 @@ //! Synchronization primitives. -pub mod list; -pub mod queue; +pub(crate) mod list; +pub(crate) mod queue; diff --git a/vendor/crossbeam-epoch/src/sync/queue.rs b/vendor/crossbeam-epoch/src/sync/queue.rs index 71ea1bcc0d..67c228de36 100644 --- a/vendor/crossbeam-epoch/src/sync/queue.rs +++ b/vendor/crossbeam-epoch/src/sync/queue.rs @@ -19,7 +19,7 @@ use crate::{unprotected, Atomic, Guard, Owned, Shared}; // the `tail` pointer may lag behind the actual tail. Non-sentinel nodes are either all `Data` or // all `Blocked` (requests for data from blocked threads). #[derive(Debug)] -pub struct Queue { +pub(crate) struct Queue { head: CachePadded>>, tail: CachePadded>>, } @@ -42,7 +42,7 @@ unsafe impl Send for Queue {} impl Queue { /// Create a new, empty queue. - pub fn new() -> Queue { + pub(crate) fn new() -> Queue { let q = Queue { head: CachePadded::new(Atomic::null()), tail: CachePadded::new(Atomic::null()), @@ -74,24 +74,28 @@ impl Queue { let next = o.next.load(Acquire, guard); if unsafe { next.as_ref().is_some() } { // if not, try to "help" by moving the tail pointer forward - let _ = self.tail.compare_and_set(onto, next, Release, guard); + let _ = self + .tail + .compare_exchange(onto, next, Release, Relaxed, guard); false } else { // looks like the actual tail; attempt to link in `n` let result = o .next - .compare_and_set(Shared::null(), new, Release, guard) + .compare_exchange(Shared::null(), new, Release, Relaxed, guard) .is_ok(); if result { // try to move the tail pointer forward - let _ = self.tail.compare_and_set(onto, new, Release, guard); + let _ = self + .tail + .compare_exchange(onto, new, Release, Relaxed, guard); } result } } /// Adds `t` to the back of the queue, possibly waking up threads blocked on `pop`. - pub fn push(&self, t: T, guard: &Guard) { + pub(crate) fn push(&self, t: T, guard: &Guard) { let new = Owned::new(Node { data: MaybeUninit::new(t), next: Atomic::null(), @@ -118,12 +122,14 @@ impl Queue { match unsafe { next.as_ref() } { Some(n) => unsafe { self.head - .compare_and_set(head, next, Release, guard) + .compare_exchange(head, next, Release, Relaxed, guard) .map(|_| { let tail = self.tail.load(Relaxed, guard); // Advance the tail so that we don't retire a pointer to a reachable node. if head == tail { - let _ = self.tail.compare_and_set(tail, next, Release, guard); + let _ = self + .tail + .compare_exchange(tail, next, Release, Relaxed, guard); } guard.defer_destroy(head); // TODO: Replace with MaybeUninit::read when api is stable @@ -149,12 +155,14 @@ impl Queue { match unsafe { next.as_ref() } { Some(n) if condition(unsafe { &*n.data.as_ptr() }) => unsafe { self.head - .compare_and_set(head, next, Release, guard) + .compare_exchange(head, next, Release, Relaxed, guard) .map(|_| { let tail = self.tail.load(Relaxed, guard); // Advance the tail so that we don't retire a pointer to a reachable node. if head == tail { - let _ = self.tail.compare_and_set(tail, next, Release, guard); + let _ = self + .tail + .compare_exchange(tail, next, Release, Relaxed, guard); } guard.defer_destroy(head); Some(n.data.as_ptr().read()) @@ -168,7 +176,7 @@ impl Queue { /// Attempts to dequeue from the front. /// /// Returns `None` if the queue is observed to be empty. - pub fn try_pop(&self, guard: &Guard) -> Option { + pub(crate) fn try_pop(&self, guard: &Guard) -> Option { loop { if let Ok(head) = self.pop_internal(guard) { return head; @@ -180,7 +188,7 @@ impl Queue { /// /// Returns `None` if the queue is observed to be empty, or the head does not satisfy the given /// condition. - pub fn try_pop_if(&self, condition: F, guard: &Guard) -> Option + pub(crate) fn try_pop_if(&self, condition: F, guard: &Guard) -> Option where T: Sync, F: Fn(&T) -> bool, @@ -207,7 +215,7 @@ impl Drop for Queue { } } -#[cfg(test)] +#[cfg(all(test, not(crossbeam_loom)))] mod test { use super::*; use crate::pin; @@ -218,30 +226,30 @@ mod test { } impl Queue { - pub fn new() -> Queue { + pub(crate) fn new() -> Queue { Queue { queue: super::Queue::new(), } } - pub fn push(&self, t: T) { + pub(crate) fn push(&self, t: T) { let guard = &pin(); self.queue.push(t, guard); } - pub fn is_empty(&self) -> bool { + pub(crate) fn is_empty(&self) -> bool { let guard = &pin(); let head = self.queue.head.load(Acquire, guard); let h = unsafe { head.deref() }; h.next.load(Acquire, guard).is_null() } - pub fn try_pop(&self) -> Option { + pub(crate) fn try_pop(&self) -> Option { let guard = &pin(); self.queue.try_pop(guard) } - pub fn pop(&self) -> T { + pub(crate) fn pop(&self) -> T { loop { match self.try_pop() { None => continue, diff --git a/vendor/crossbeam-epoch/tests/loom.rs b/vendor/crossbeam-epoch/tests/loom.rs new file mode 100644 index 0000000000..4e56acdbca --- /dev/null +++ b/vendor/crossbeam-epoch/tests/loom.rs @@ -0,0 +1,157 @@ +#![cfg(crossbeam_loom)] + +use crossbeam_epoch as epoch; +use loom_crate as loom; + +use epoch::*; +use epoch::{Atomic, Owned}; +use loom::sync::atomic::Ordering::{self, Acquire, Relaxed, Release}; +use loom::sync::Arc; +use loom::thread::spawn; +use std::mem::ManuallyDrop; +use std::ptr; + +#[test] +fn it_works() { + loom::model(|| { + let collector = Collector::new(); + let item: Atomic = Atomic::from(Owned::new(String::from("boom"))); + let item2 = item.clone(); + let collector2 = collector.clone(); + let guard = collector.register().pin(); + + let jh = loom::thread::spawn(move || { + let guard = collector2.register().pin(); + guard.defer(move || { + // this isn't really safe, since other threads may still have pointers to the + // value, but in this limited test scenario it's okay, since we know the test won't + // access item after all the pins are released. + let mut item = unsafe { item2.into_owned() }; + // mutate it as a second measure to make sure the assert_eq below would fail + item.retain(|c| c == 'o'); + drop(item); + }); + }); + + let item = item.load(Ordering::SeqCst, &guard); + // we pinned strictly before the call to defer_destroy, + // so item cannot have been dropped yet + assert_eq!(*unsafe { item.deref() }, "boom"); + drop(guard); + + jh.join().unwrap(); + + drop(collector); + }) +} + +#[test] +fn treiber_stack() { + /// Treiber's lock-free stack. + /// + /// Usable with any number of producers and consumers. + #[derive(Debug)] + pub struct TreiberStack { + head: Atomic>, + } + + #[derive(Debug)] + struct Node { + data: ManuallyDrop, + next: Atomic>, + } + + impl TreiberStack { + /// Creates a new, empty stack. + pub fn new() -> TreiberStack { + TreiberStack { + head: Atomic::null(), + } + } + + /// Pushes a value on top of the stack. + pub fn push(&self, t: T) { + let mut n = Owned::new(Node { + data: ManuallyDrop::new(t), + next: Atomic::null(), + }); + + let guard = epoch::pin(); + + loop { + let head = self.head.load(Relaxed, &guard); + n.next.store(head, Relaxed); + + match self + .head + .compare_exchange(head, n, Release, Relaxed, &guard) + { + Ok(_) => break, + Err(e) => n = e.new, + } + } + } + + /// Attempts to pop the top element from the stack. + /// + /// Returns `None` if the stack is empty. + pub fn pop(&self) -> Option { + let guard = epoch::pin(); + loop { + let head = self.head.load(Acquire, &guard); + + match unsafe { head.as_ref() } { + Some(h) => { + let next = h.next.load(Relaxed, &guard); + + if self + .head + .compare_exchange(head, next, Relaxed, Relaxed, &guard) + .is_ok() + { + unsafe { + guard.defer_destroy(head); + return Some(ManuallyDrop::into_inner(ptr::read(&(*h).data))); + } + } + } + None => return None, + } + } + } + + /// Returns `true` if the stack is empty. + pub fn is_empty(&self) -> bool { + let guard = epoch::pin(); + self.head.load(Acquire, &guard).is_null() + } + } + + impl Drop for TreiberStack { + fn drop(&mut self) { + while self.pop().is_some() {} + } + } + + loom::model(|| { + let stack1 = Arc::new(TreiberStack::new()); + let stack2 = Arc::clone(&stack1); + + // use 5 since it's greater than the 4 used for the sanitize feature + let jh = spawn(move || { + for i in 0..5 { + stack2.push(i); + assert!(stack2.pop().is_some()); + } + }); + + for i in 0..5 { + stack1.push(i); + assert!(stack1.pop().is_some()); + } + + jh.join().unwrap(); + assert!(stack1.pop().is_none()); + assert!(stack1.is_empty()); + }); +} diff --git a/vendor/crossbeam-queue-0.1.2/.cargo-checksum.json b/vendor/crossbeam-queue-0.1.2/.cargo-checksum.json deleted file mode 100644 index 00825d308b..0000000000 --- a/vendor/crossbeam-queue-0.1.2/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{"CHANGELOG.md":"b725a3d6c6503de9db1edc44ee1c947455afe6f9785a68cbaeb803007ac497b7","Cargo.toml":"ac712a130ff21901162c8300c482e90a8286a5f5e50759cf9c15cd2db66918cc","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","LICENSE-THIRD-PARTY":"abb1905b1c2b7db73902e6c328d332d82f3797d7fab61e6fc1c2fc366b132014","README.md":"34a8eb8f4d66515ed50d3775788fd61ef7cfb1e7b0aac3bdb7f7a543827bca1e","src/array_queue.rs":"0006d01beb428d7ef0e836f0fac74a550c3b86719315af4ae5b67d7f3f84322e","src/err.rs":"ac5d5b8a30d9d140347b077c5d9d44fca205cfc413a5d0cd4547d7623d7aca3e","src/lib.rs":"759be18e31442614133ab28bedef37ce1a7f536d955e9cb198a56941cfaf2dbf","src/seg_queue.rs":"3ea1ac7038252b8aeb9b5fb3d3432f83cb26327f876061885ab8144e272ba0cf","tests/array_queue.rs":"e4b3f294f1a62db916035d2ea5db3142c45d98aef2bed5da9074fb7e0f1d82d7","tests/seg_queue.rs":"9d2c4da321a457219c212c6333c8753bcf2516b30cc862c6a527e8f1225733e0"},"package":"7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b"} \ No newline at end of file diff --git a/vendor/crossbeam-queue-0.1.2/CHANGELOG.md b/vendor/crossbeam-queue-0.1.2/CHANGELOG.md deleted file mode 100644 index ef17f7f089..0000000000 --- a/vendor/crossbeam-queue-0.1.2/CHANGELOG.md +++ /dev/null @@ -1,11 +0,0 @@ -# Version 0.1.2 - -- Update `crossbeam-utils` to `0.6.5`. - -# Version 0.1.1 - -- Update `crossbeam-utils` to `0.6.4`. - -# Version 0.1.0 - -- Initial version with `ArrayQueue` and `SegQueue`. diff --git a/vendor/crossbeam-queue-0.1.2/src/lib.rs b/vendor/crossbeam-queue-0.1.2/src/lib.rs deleted file mode 100644 index 17131d9e98..0000000000 --- a/vendor/crossbeam-queue-0.1.2/src/lib.rs +++ /dev/null @@ -1,22 +0,0 @@ -//! Concurrent queues. -//! -//! This crate provides concurrent queues that can be shared among threads: -//! -//! * [`ArrayQueue`], a bounded MPMC queue that allocates a fixed-capacity buffer on construction. -//! * [`SegQueue`], an unbounded MPMC queue that allocates small buffers, segments, on demand. -//! -//! [`ArrayQueue`]: struct.ArrayQueue.html -//! [`SegQueue`]: struct.SegQueue.html - -#![warn(missing_docs)] -#![warn(missing_debug_implementations)] - -extern crate crossbeam_utils; - -mod array_queue; -mod err; -mod seg_queue; - -pub use self::array_queue::ArrayQueue; -pub use self::seg_queue::SegQueue; -pub use self::err::{PopError, PushError}; diff --git a/vendor/crossbeam-queue/.cargo-checksum.json b/vendor/crossbeam-queue/.cargo-checksum.json new file mode 100644 index 0000000000..b0d2114fcc --- /dev/null +++ b/vendor/crossbeam-queue/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"CHANGELOG.md":"fd132a0c0418817ad83e67f46762a13e8c210ce6e94293abfa902361d99b953d","Cargo.toml":"49f1e746f6258de6e2b2127cd974a54735b08d565068b4079378a68eb73a5946","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"5734ed989dfca1f625b40281ee9f4530f91b2411ec01cb748223e7eb87e201ab","LICENSE-THIRD-PARTY":"abb1905b1c2b7db73902e6c328d332d82f3797d7fab61e6fc1c2fc366b132014","README.md":"b487d2d9d9cf9726fbf3b5cf736ddc363f8d1e1410a0a4020dda27c4df72c627","src/array_queue.rs":"02d3deea53652d6fadba3bb4236324262776242176f487688dcf624b379ad500","src/err.rs":"cde063a29dc8887d4c3bd0994f7aab08879841d94c61ecf104a8a85f2c436302","src/lib.rs":"a1331aa4f2d67b4e634667f225c63d55b234802bd1ff72a485d2d56a08eab521","src/seg_queue.rs":"732b5b032313329e39d9c08cf6e63d2926950d645467983fc62e7cabb3cbe330","tests/array_queue.rs":"3faa35bbe2acb3dabdfab5e81860a19e0237c57513420bbb9afe0cb89ac25909","tests/seg_queue.rs":"885ea52ce2c5d1fa9b4265250957d51ffa3f0781d57b01d28cb871371e32ac92"},"package":"774ba60a54c213d409d5353bda12d49cd68d14e45036a285234c8d6f91f92570"} \ No newline at end of file diff --git a/vendor/crossbeam-queue/CHANGELOG.md b/vendor/crossbeam-queue/CHANGELOG.md new file mode 100644 index 0000000000..e44d1f9a40 --- /dev/null +++ b/vendor/crossbeam-queue/CHANGELOG.md @@ -0,0 +1,28 @@ +# Version 0.2.3 + +- Fix bug in release (yanking 0.2.2) + +# Version 0.2.2 + +- Fix unsoundness issues by adopting `MaybeUninit`. (#458) + +# Version 0.2.1 + +- Add `no_std` support. + +# Version 0.2.0 + +- Bump the minimum required version to 1.28. +- Bump `crossbeam-utils` to `0.7`. + +# Version 0.1.2 + +- Update `crossbeam-utils` to `0.6.5`. + +# Version 0.1.1 + +- Update `crossbeam-utils` to `0.6.4`. + +# Version 0.1.0 + +- Initial version with `ArrayQueue` and `SegQueue`. diff --git a/vendor/crossbeam-queue-0.1.2/Cargo.toml b/vendor/crossbeam-queue/Cargo.toml similarity index 76% rename from vendor/crossbeam-queue-0.1.2/Cargo.toml rename to vendor/crossbeam-queue/Cargo.toml index cfbb057a1e..c03e35b1dc 100644 --- a/vendor/crossbeam-queue-0.1.2/Cargo.toml +++ b/vendor/crossbeam-queue/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 = "crossbeam-queue" -version = "0.1.2" +version = "0.2.3" authors = ["The Crossbeam Project Developers"] description = "Concurrent queues" homepage = "https://github.com/crossbeam-rs/crossbeam/tree/master/crossbeam-utils" @@ -20,9 +20,21 @@ documentation = "https://docs.rs/crossbeam-queue" readme = "README.md" keywords = ["queue", "mpmc", "lock-free", "producer", "consumer"] categories = ["concurrency", "data-structures"] -license = "MIT/Apache-2.0" +license = "MIT/Apache-2.0 AND BSD-2-Clause" repository = "https://github.com/crossbeam-rs/crossbeam" +[dependencies.cfg-if] +version = "0.1.2" + [dependencies.crossbeam-utils] -version = "0.6.5" +version = "0.7" +default-features = false + +[dependencies.maybe-uninit] +version = "2.0.0" [dev-dependencies.rand] version = "0.6" + +[features] +alloc = ["crossbeam-utils/alloc"] +default = ["std"] +std = ["crossbeam-utils/std"] diff --git a/vendor/crossbeam-queue-0.1.2/LICENSE-APACHE b/vendor/crossbeam-queue/LICENSE-APACHE similarity index 100% rename from vendor/crossbeam-queue-0.1.2/LICENSE-APACHE rename to vendor/crossbeam-queue/LICENSE-APACHE diff --git a/vendor/crossbeam-utils-0.6.6/LICENSE-MIT b/vendor/crossbeam-queue/LICENSE-MIT similarity index 100% rename from vendor/crossbeam-utils-0.6.6/LICENSE-MIT rename to vendor/crossbeam-queue/LICENSE-MIT diff --git a/vendor/crossbeam-queue-0.1.2/LICENSE-THIRD-PARTY b/vendor/crossbeam-queue/LICENSE-THIRD-PARTY similarity index 100% rename from vendor/crossbeam-queue-0.1.2/LICENSE-THIRD-PARTY rename to vendor/crossbeam-queue/LICENSE-THIRD-PARTY diff --git a/vendor/crossbeam-queue-0.1.2/README.md b/vendor/crossbeam-queue/README.md similarity index 88% rename from vendor/crossbeam-queue-0.1.2/README.md rename to vendor/crossbeam-queue/README.md index d2e20df6f6..646f9cfaad 100644 --- a/vendor/crossbeam-queue-0.1.2/README.md +++ b/vendor/crossbeam-queue/README.md @@ -8,8 +8,9 @@ https://github.com/crossbeam-rs/crossbeam-queue/tree/master/src) https://crates.io/crates/crossbeam-queue) [![Documentation](https://docs.rs/crossbeam-queue/badge.svg)]( https://docs.rs/crossbeam-queue) -[![Rust 1.26+](https://img.shields.io/badge/rust-1.26+-lightgray.svg)]( +[![Rust 1.28+](https://img.shields.io/badge/rust-1.28+-lightgray.svg)]( https://www.rust-lang.org) +[![chat](https://img.shields.io/discord/569610676205781012.svg?logo=discord)](https://discord.gg/BBYwKq) This crate provides concurrent queues that can be shared among threads: @@ -25,7 +26,7 @@ Add this to your `Cargo.toml`: ```toml [dependencies] -crossbeam-queue = "0.1" +crossbeam-queue = "0.2" ``` Next, add this to your crate: @@ -36,7 +37,7 @@ extern crate crossbeam_queue; ## Compatibility -The minimum supported Rust version is 1.26. +The minimum supported Rust version is 1.28. Any change to this is considered a breaking change. ## License diff --git a/vendor/crossbeam-queue-0.1.2/src/array_queue.rs b/vendor/crossbeam-queue/src/array_queue.rs similarity index 90% rename from vendor/crossbeam-queue-0.1.2/src/array_queue.rs rename to vendor/crossbeam-queue/src/array_queue.rs index 7ce939c890..45b055abde 100644 --- a/vendor/crossbeam-queue-0.1.2/src/array_queue.rs +++ b/vendor/crossbeam-queue/src/array_queue.rs @@ -8,33 +8,36 @@ //! - Simplified BSD License and Apache License, Version 2.0 //! - http://www.1024cores.net/home/code-license -use std::cell::UnsafeCell; -use std::fmt; -use std::marker::PhantomData; -use std::mem; -use std::ptr; -use std::sync::atomic::{self, AtomicUsize, Ordering}; +use alloc::vec::Vec; +use core::cell::UnsafeCell; +use core::fmt; +use core::marker::PhantomData; +use core::mem; +use core::ptr; +use core::sync::atomic::{self, AtomicUsize, Ordering}; use crossbeam_utils::{Backoff, CachePadded}; +use maybe_uninit::MaybeUninit; + use err::{PopError, PushError}; /// A slot in a queue. struct Slot { /// The current stamp. /// - /// If the stamp equals the tail, this node will be next written to. If it equals the head, + /// If the stamp equals the tail, this node will be next written to. If it equals head + 1, /// this node will be next read from. stamp: AtomicUsize, /// The value in this slot. - value: UnsafeCell, + value: UnsafeCell>, } /// A bounded multi-producer multi-consumer queue. /// /// This queue allocates a fixed-capacity buffer on construction, which is used to store pushed -/// elements. The queue cannot hold more elements that the buffer allows. Attempting to push an +/// elements. The queue cannot hold more elements than the buffer allows. Attempting to push an /// element into a full queue will fail. Having a buffer allocated upfront makes this queue a bit /// faster than [`SegQueue`]. /// @@ -177,13 +180,17 @@ impl ArrayQueue { }; // Try moving the tail. - match self - .tail - .compare_exchange_weak(tail, new_tail, Ordering::SeqCst, Ordering::Relaxed) - { + match self.tail.compare_exchange_weak( + tail, + new_tail, + Ordering::SeqCst, + Ordering::Relaxed, + ) { Ok(_) => { // Write the value into the slot and update the stamp. - unsafe { slot.value.get().write(value); } + unsafe { + slot.value.get().write(MaybeUninit::new(value)); + } slot.stamp.store(tail + 1, Ordering::Release); return Ok(()); } @@ -253,14 +260,17 @@ impl ArrayQueue { }; // Try moving the head. - match self - .head - .compare_exchange_weak(head, new, Ordering::SeqCst, Ordering::Relaxed) - { + match self.head.compare_exchange_weak( + head, + new, + Ordering::SeqCst, + Ordering::Relaxed, + ) { Ok(_) => { // Read the value from the slot and update the stamp. - let msg = unsafe { slot.value.get().read() }; - slot.stamp.store(head.wrapping_add(self.one_lap), Ordering::Release); + let msg = unsafe { slot.value.get().read().assume_init() }; + slot.stamp + .store(head.wrapping_add(self.one_lap), Ordering::Release); return Ok(msg); } Err(h) => { @@ -407,7 +417,12 @@ impl Drop for ArrayQueue { }; unsafe { - self.buffer.add(index).drop_in_place(); + let p = { + let slot = &mut *self.buffer.add(index); + let value = &mut *slot.value.get(); + value.as_mut_ptr() + }; + p.drop_in_place(); } } diff --git a/vendor/crossbeam-queue-0.1.2/src/err.rs b/vendor/crossbeam-queue/src/err.rs similarity index 86% rename from vendor/crossbeam-queue-0.1.2/src/err.rs rename to vendor/crossbeam-queue/src/err.rs index fcc84bb28b..42880e89ec 100644 --- a/vendor/crossbeam-queue-0.1.2/src/err.rs +++ b/vendor/crossbeam-queue/src/err.rs @@ -1,5 +1,4 @@ -use std::error; -use std::fmt; +use core::fmt; /// Error which occurs when popping from an empty queue. #[derive(Clone, Copy, Eq, PartialEq)] @@ -17,7 +16,8 @@ impl fmt::Display for PopError { } } -impl error::Error for PopError { +#[cfg(features = "std")] +impl std::error::Error for PopError { fn description(&self) -> &str { "popping from an empty queue" } @@ -39,7 +39,8 @@ impl fmt::Display for PushError { } } -impl error::Error for PushError { +#[cfg(features = "std")] +impl std::error::Error for PushError { fn description(&self) -> &str { "pushing into a full queue" } diff --git a/vendor/crossbeam-queue/src/lib.rs b/vendor/crossbeam-queue/src/lib.rs new file mode 100644 index 0000000000..fd99392070 --- /dev/null +++ b/vendor/crossbeam-queue/src/lib.rs @@ -0,0 +1,42 @@ +//! Concurrent queues. +//! +//! This crate provides concurrent queues that can be shared among threads: +//! +//! * [`ArrayQueue`], a bounded MPMC queue that allocates a fixed-capacity buffer on construction. +//! * [`SegQueue`], an unbounded MPMC queue that allocates small buffers, segments, on demand. +//! +//! [`ArrayQueue`]: struct.ArrayQueue.html +//! [`SegQueue`]: struct.SegQueue.html + +#![warn(missing_docs)] +#![warn(missing_debug_implementations)] +#![cfg_attr(not(feature = "std"), no_std)] + +#[macro_use] +extern crate cfg_if; +#[cfg(feature = "std")] +extern crate core; + +extern crate maybe_uninit; + +cfg_if! { + if #[cfg(feature = "alloc")] { + extern crate alloc; + } else if #[cfg(feature = "std")] { + extern crate std as alloc; + } +} + +extern crate crossbeam_utils; + +cfg_if! { + if #[cfg(any(feature = "alloc", feature = "std"))] { + mod array_queue; + mod err; + mod seg_queue; + + pub use self::array_queue::ArrayQueue; + pub use self::err::{PopError, PushError}; + pub use self::seg_queue::SegQueue; + } +} diff --git a/vendor/crossbeam-queue-0.1.2/src/seg_queue.rs b/vendor/crossbeam-queue/src/seg_queue.rs similarity index 90% rename from vendor/crossbeam-queue-0.1.2/src/seg_queue.rs rename to vendor/crossbeam-queue/src/seg_queue.rs index d9783edafb..b52da4f5c0 100644 --- a/vendor/crossbeam-queue-0.1.2/src/seg_queue.rs +++ b/vendor/crossbeam-queue/src/seg_queue.rs @@ -1,12 +1,14 @@ -use std::cell::UnsafeCell; -use std::fmt; -use std::marker::PhantomData; -use std::mem::{self, ManuallyDrop}; -use std::ptr; -use std::sync::atomic::{self, AtomicPtr, AtomicUsize, Ordering}; +use alloc::boxed::Box; +use core::cell::UnsafeCell; +use core::fmt; +use core::marker::PhantomData; +use core::ptr; +use core::sync::atomic::{self, AtomicPtr, AtomicUsize, Ordering}; use crossbeam_utils::{Backoff, CachePadded}; +use maybe_uninit::MaybeUninit; + use err::PopError; // Bits indicating the state of a slot: @@ -29,7 +31,7 @@ const HAS_NEXT: usize = 1; /// A slot in a block. struct Slot { /// The value. - value: UnsafeCell>, + value: UnsafeCell>, /// The state of the slot. state: AtomicUsize, @@ -59,7 +61,13 @@ struct Block { impl Block { /// Creates an empty block that starts at `start_index`. fn new() -> Block { - unsafe { mem::zeroed() } + // SAFETY: This is safe because: + // [1] `Block::next` (AtomicPtr) may be safely zero initialized. + // [2] `Block::slots` (Array) may be safely zero initialized because of [3, 4]. + // [3] `Slot::value` (UnsafeCell) may be safely zero initialized because it + // holds a MaybeUninit. + // [4] `Slot::state` (AtomicUsize) may be safely zero initialized. + unsafe { MaybeUninit::zeroed().assume_init() } } /// Waits until the next pointer is set. @@ -205,7 +213,12 @@ impl SegQueue { 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 { + if self + .tail + .block + .compare_and_swap(block, new, Ordering::Release) + == block + { self.head.block.store(new, Ordering::Release); block = new; } else { @@ -219,14 +232,12 @@ impl SegQueue { 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, - ) - { + 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 { @@ -240,11 +251,11 @@ impl SegQueue { // Write the value into the slot. let slot = (*block).slots.get_unchecked(offset); - slot.value.get().write(ManuallyDrop::new(value)); + slot.value.get().write(MaybeUninit::new(value)); slot.state.fetch_or(WRITE, Ordering::Release); return; - } + }, Err(t) => { tail = t; block = self.tail.block.load(Ordering::Acquire); @@ -313,14 +324,12 @@ impl SegQueue { } // Try moving the head index forward. - match self.head.index - .compare_exchange_weak( - head, - new_head, - Ordering::SeqCst, - Ordering::Acquire, - ) - { + 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 { @@ -337,8 +346,7 @@ impl SegQueue { // Read the value. let slot = (*block).slots.get_unchecked(offset); slot.wait_write(); - let m = slot.value.get().read(); - let value = ManuallyDrop::into_inner(m); + let value = slot.value.get().read().assume_init(); // 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. @@ -349,7 +357,7 @@ impl SegQueue { } return Ok(value); - } + }, Err(h) => { head = h; block = self.head.block.load(Ordering::Acquire); @@ -449,7 +457,8 @@ impl Drop for SegQueue { if offset < BLOCK_CAP { // Drop the value in the slot. let slot = (*block).slots.get_unchecked(offset); - ManuallyDrop::drop(&mut *(*slot).value.get()); + let p = &mut *slot.value.get(); + p.as_mut_ptr().drop_in_place(); } else { // Deallocate the block and move to the next one. let next = (*block).next.load(Ordering::Relaxed); diff --git a/vendor/crossbeam-queue-0.1.2/tests/array_queue.rs b/vendor/crossbeam-queue/tests/array_queue.rs similarity index 97% rename from vendor/crossbeam-queue-0.1.2/tests/array_queue.rs rename to vendor/crossbeam-queue/tests/array_queue.rs index 6f09d3c1b0..a4f64f3432 100644 --- a/vendor/crossbeam-queue-0.1.2/tests/array_queue.rs +++ b/vendor/crossbeam-queue/tests/array_queue.rs @@ -113,7 +113,8 @@ fn len() { assert!(len <= CAP); } }); - }).unwrap(); + }) + .unwrap(); assert_eq!(q.len(), 0); } @@ -141,7 +142,8 @@ fn spsc() { while q.push(i).is_err() {} } }); - }).unwrap(); + }) + .unwrap(); } #[test] @@ -172,7 +174,8 @@ fn mpmc() { } }); } - }).unwrap(); + }) + .unwrap(); for c in v { assert_eq!(c.load(Ordering::SeqCst), THREADS); @@ -217,7 +220,8 @@ fn drops() { } } }); - }).unwrap(); + }) + .unwrap(); for _ in 0..additional { q.push(DropCounter).unwrap(); @@ -245,5 +249,6 @@ fn linearizable() { } }); } - }).unwrap(); + }) + .unwrap(); } diff --git a/vendor/crossbeam-queue-0.1.2/tests/seg_queue.rs b/vendor/crossbeam-queue/tests/seg_queue.rs similarity index 97% rename from vendor/crossbeam-queue-0.1.2/tests/seg_queue.rs rename to vendor/crossbeam-queue/tests/seg_queue.rs index 871f542c34..ec32e1f642 100644 --- a/vendor/crossbeam-queue-0.1.2/tests/seg_queue.rs +++ b/vendor/crossbeam-queue/tests/seg_queue.rs @@ -79,7 +79,8 @@ fn spsc() { q.push(i); } }); - }).unwrap(); + }) + .unwrap(); } #[test] @@ -110,7 +111,8 @@ fn mpmc() { } }); } - }).unwrap(); + }) + .unwrap(); for c in v { assert_eq!(c.load(Ordering::SeqCst), THREADS); @@ -151,7 +153,8 @@ fn drops() { q.push(DropCounter); } }); - }).unwrap(); + }) + .unwrap(); for _ in 0..additional { q.push(DropCounter); diff --git a/vendor/crossbeam-utils-0.6.6/.cargo-checksum.json b/vendor/crossbeam-utils-0.6.6/.cargo-checksum.json deleted file mode 100644 index b100cb8e15..0000000000 --- a/vendor/crossbeam-utils-0.6.6/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{"CHANGELOG.md":"cb975f0361e0cccfe00da4f32d4c87308b20e40f6444d2ef474640fbb15567de","Cargo.toml":"8ad804e9e161a564e57e2cea30349d9658fd3d32bd0b065868073cdcc70a78cb","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"5734ed989dfca1f625b40281ee9f4530f91b2411ec01cb748223e7eb87e201ab","README.md":"0b293d1b9b129a58f504ff4bc061161ddfaf7c8594e0ca2b526458d4e9acb194","benches/atomic_cell.rs":"fa38d34ddc593bf0999fd65d95ee349c53a11290fbe7bf24870a7e24754ae2ac","src/atomic/atomic_cell.rs":"9f18d8cf7d91750f7646bc2ef7bf5b7444b2c9acdc2e8b6dffd8f0ff696e113b","src/atomic/consume.rs":"bfdc7e2d8370a5a3bb1699b6214347c359d66fcc92a2d1345a513676ac91d821","src/atomic/mod.rs":"404eacae422012f3628cb44262df73a5891fe02a17ab345b832e3062982b5a20","src/backoff.rs":"bc9d2afdd070e0746bc48ff2159bf47b0cfaa68ea09f47eaed18ccc32fc87d67","src/cache_padded.rs":"864f210089eddfd130830f5c700115c2f8b974b71659d7e8ef7bd5e09d7e1f96","src/lib.rs":"3138911610fa97a412c62e4aa5a6cd50524a04f6746c08a5cda8fd1c1d954555","src/sync/mod.rs":"4c8ad6ec4601f212791b0b531b46ee5decec2f1d14746aa7f2c18e36c609cd8e","src/sync/parker.rs":"55324bbea5b7c6838a0f8467a5b8a5dbd5526c8e1c7fd4f6d64dad1ab19f9be9","src/sync/sharded_lock.rs":"7a401ba621233732c26cf49324748269359d7bc5dc27e0ec26c9493e9a5ec97d","src/sync/wait_group.rs":"21708bbd46daa98e9f788765a9a4ef3b087a8d1e97a6e9406b4a960c95e44ca0","src/thread.rs":"ee89256b619c7ed55e04519bb3b9f29e72e6ce1e61e8ba9782a984f5e9fc1bad","tests/atomic_cell.rs":"4423b41f6f23ff2519f4a1f9970436b7fb49968be5bc14dbdbd5ab2d5b1048df","tests/cache_padded.rs":"02235757a554279dae5053d46314a765059ec036c63a05336353994c2aa344d1","tests/parker.rs":"3e5c4e170cebdd9f815f2b31a2b6a01da753fc03e2b1d8e9b899d009f62c6b83","tests/sharded_lock.rs":"3b42218397f1260bed4e0a229f55da83439c0ec9effbbefc86251c9d208979bb","tests/thread.rs":"42baefda11ccd87d9fe1a93bb7d6186b17a86afcf3b9d8f739bc0deefa11ae0f","tests/wait_group.rs":"e3d5168581fb511b760f4249ca487b919cffc60ac2b4610a78db99899772dd5b"},"package":"04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6"} \ No newline at end of file diff --git a/vendor/crossbeam-utils-0.6.6/CHANGELOG.md b/vendor/crossbeam-utils-0.6.6/CHANGELOG.md deleted file mode 100644 index 6e2102387c..0000000000 --- a/vendor/crossbeam-utils-0.6.6/CHANGELOG.md +++ /dev/null @@ -1,97 +0,0 @@ -# Version 0.6.6 - -- Add `UnwindSafe` and `RefUnwindSafe` impls for `AtomicCell`. -- Add `AtomicCell::as_ptr()`. -- Add `AtomicCell::take()`. -- Fix a bug in `AtomicCell::compare_exchange()` and `AtomicCell::compare_and_swap()`. -- Various documentation improvements. - -# Version 0.6.5 - -- Rename `Backoff::is_complete()` to `Backoff::is_completed()`. - -# Version 0.6.4 - -- Add `WaitGroup`, `ShardedLock`, and `Backoff`. -- Add `fetch_*` methods for `AtomicCell` and `AtomicCell`. -- Expand documentation. - -# Version 0.6.3 - -- Add `AtomicCell`. -- Improve documentation. - -# Version 0.6.2 - -- Add `Parker`. -- Improve documentation. - -# Version 0.6.1 - -- Fix a soundness bug in `Scope::spawn()`. -- Remove the `T: 'scope` bound on `ScopedJoinHandle`. - -# Version 0.6.0 - -- Move `AtomicConsume` to `atomic` module. -- `scope()` returns a `Result` of thread joins. -- Remove `spawn_unchecked`. -- Fix a soundness bug due to incorrect lifetimes. -- Improve documentation. -- Support nested scoped spawns. -- Implement `Copy`, `Hash`, `PartialEq`, and `Eq` for `CachePadded`. -- Add `CachePadded::into_inner()`. - -# Version 0.5.0 - -- Reorganize sub-modules and rename functions. - -# Version 0.4.1 - -- Fix a documentation link. - -# Version 0.4.0 - -- `CachePadded` supports types bigger than 64 bytes. -- Fix a bug in scoped threads where unitialized memory was being dropped. -- Minimum required Rust version is now 1.25. - -# Version 0.3.2 - -- Mark `load_consume` with `#[inline]`. - -# Version 0.3.1 - -- `load_consume` on ARM and AArch64. - -# Version 0.3.0 - -- Add `join` for scoped thread API. -- Add `load_consume` for atomic load-consume memory ordering. -- Remove `AtomicOption`. - -# Version 0.2.2 - -- Support Rust 1.12.1. -- Call `T::clone` when cloning a `CachePadded`. - -# Version 0.2.1 - -- Add `use_std` feature. - -# Version 0.2.0 - -- Add `nightly` feature. -- Use `repr(align(64))` on `CachePadded` with the `nightly` feature. -- Implement `Drop` for `CachePadded`. -- Implement `Clone` for `CachePadded`. -- Implement `From` for `CachePadded`. -- Implement better `Debug` for `CachePadded`. -- Write more tests. -- Add this changelog. -- Change cache line length to 64 bytes. -- Remove `ZerosValid`. - -# Version 0.1.0 - -- Old implementation of `CachePadded` from `crossbeam` version 0.3.0 diff --git a/vendor/crossbeam-utils-0.6.6/Cargo.toml b/vendor/crossbeam-utils-0.6.6/Cargo.toml deleted file mode 100644 index 1dbd675ace..0000000000 --- a/vendor/crossbeam-utils-0.6.6/Cargo.toml +++ /dev/null @@ -1,38 +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 = "crossbeam-utils" -version = "0.6.6" -authors = ["The Crossbeam Project Developers"] -description = "Utilities for concurrent programming" -homepage = "https://github.com/crossbeam-rs/crossbeam/tree/master/crossbeam-utils" -documentation = "https://docs.rs/crossbeam-utils" -readme = "README.md" -keywords = ["scoped", "thread", "atomic", "cache"] -categories = ["algorithms", "concurrency", "data-structures", "no-std"] -license = "MIT/Apache-2.0" -repository = "https://github.com/crossbeam-rs/crossbeam" -[dependencies.cfg-if] -version = "0.1.2" - -[dependencies.lazy_static] -version = "1.1.0" -optional = true -[dev-dependencies.rand] -version = "0.6" - -[features] -alloc = [] -default = ["std"] -nightly = [] -std = ["lazy_static"] diff --git a/vendor/crossbeam-utils-0.6.6/README.md b/vendor/crossbeam-utils-0.6.6/README.md deleted file mode 100644 index b4a0f6b20f..0000000000 --- a/vendor/crossbeam-utils-0.6.6/README.md +++ /dev/null @@ -1,73 +0,0 @@ -# Crossbeam Utils - -[![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-utils/tree/master/src) -[![Cargo](https://img.shields.io/crates/v/crossbeam-utils.svg)]( -https://crates.io/crates/crossbeam-utils) -[![Documentation](https://docs.rs/crossbeam-utils/badge.svg)]( -https://docs.rs/crossbeam-utils) -[![Rust 1.26+](https://img.shields.io/badge/rust-1.26+-lightgray.svg)]( -https://www.rust-lang.org) -[![chat](https://img.shields.io/discord/569610676205781012.svg?logo=discord)](https://discord.gg/BBYwKq) - -This crate provides miscellaneous tools for concurrent programming: - -#### Atomics - -* [`AtomicCell`], a thread-safe mutable memory location.(no_std) -* [`AtomicConsume`], for reading from primitive atomic types with "consume" ordering.(no_std) - -#### Thread synchronization - -* [`Parker`], a thread parking primitive. -* [`ShardedLock`], a sharded reader-writer lock with fast concurrent reads. -* [`WaitGroup`], for synchronizing the beginning or end of some computation. - -#### Utilities - -* [`Backoff`], for exponential backoff in spin loops.(no_std) -* [`CachePadded`], for padding and aligning a value to the length of a cache line.(no_std) -* [`scope`], for spawning threads that borrow local variables from the stack. - -*Features marked with (no_std) can be used in `no_std` environments.*
    - -[`AtomicCell`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/atomic/struct.AtomicCell.html -[`AtomicConsume`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/atomic/trait.AtomicConsume.html -[`Parker`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/sync/struct.Parker.html -[`ShardedLock`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/sync/struct.ShardedLock.html -[`WaitGroup`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/sync/struct.WaitGroup.html -[`Backoff`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/struct.Backoff.html -[`CachePadded`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/struct.CachePadded.html -[`scope`]: https://docs.rs/crossbeam-utils/*/crossbeam_utils/thread/fn.scope.html - -## Usage - -Add this to your `Cargo.toml`: - -```toml -[dependencies] -crossbeam-utils = "0.6" -``` - -Next, add this to your crate: - -```rust -extern crate crossbeam_utils; -``` - -## 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. diff --git a/vendor/crossbeam-utils-0.6.6/benches/atomic_cell.rs b/vendor/crossbeam-utils-0.6.6/benches/atomic_cell.rs deleted file mode 100644 index 8587dba1d9..0000000000 --- a/vendor/crossbeam-utils-0.6.6/benches/atomic_cell.rs +++ /dev/null @@ -1,157 +0,0 @@ -#![feature(test)] - -extern crate crossbeam_utils; -extern crate test; - -use std::sync::Barrier; - -use crossbeam_utils::atomic::AtomicCell; -use crossbeam_utils::thread; - -#[bench] -fn load_u8(b: &mut test::Bencher) { - let a = AtomicCell::new(0u8); - let mut sum = 0; - b.iter(|| sum += a.load()); - test::black_box(sum); -} - -#[bench] -fn store_u8(b: &mut test::Bencher) { - let a = AtomicCell::new(0u8); - b.iter(|| a.store(1)); -} - -#[bench] -fn fetch_add_u8(b: &mut test::Bencher) { - let a = AtomicCell::new(0u8); - b.iter(|| a.fetch_add(1)); -} - -#[bench] -fn compare_and_swap_u8(b: &mut test::Bencher) { - let a = AtomicCell::new(0u8); - let mut i = 0; - b.iter(|| { - a.compare_and_swap(i, i.wrapping_add(1)); - i = i.wrapping_add(1); - }); -} - -#[bench] -fn concurrent_load_u8(b: &mut test::Bencher) { - const THREADS: usize = 2; - const STEPS: usize = 1_000_000; - - let start = Barrier::new(THREADS + 1); - let end = Barrier::new(THREADS + 1); - let exit = AtomicCell::new(false); - - let a = AtomicCell::new(0u8); - - thread::scope(|scope| { - for _ in 0..THREADS { - scope.spawn(|_| loop { - start.wait(); - - let mut sum = 0; - for _ in 0..STEPS { - sum += a.load(); - } - test::black_box(sum); - - end.wait(); - if exit.load() { - break; - } - }); - } - - start.wait(); - end.wait(); - - b.iter(|| { - start.wait(); - end.wait(); - }); - - start.wait(); - exit.store(true); - end.wait(); - }) - .unwrap(); -} - -#[bench] -fn load_usize(b: &mut test::Bencher) { - let a = AtomicCell::new(0usize); - let mut sum = 0; - b.iter(|| sum += a.load()); - test::black_box(sum); -} - -#[bench] -fn store_usize(b: &mut test::Bencher) { - let a = AtomicCell::new(0usize); - b.iter(|| a.store(1)); -} - -#[bench] -fn fetch_add_usize(b: &mut test::Bencher) { - let a = AtomicCell::new(0usize); - b.iter(|| a.fetch_add(1)); -} - -#[bench] -fn compare_and_swap_usize(b: &mut test::Bencher) { - let a = AtomicCell::new(0usize); - let mut i = 0; - b.iter(|| { - a.compare_and_swap(i, i.wrapping_add(1)); - i = i.wrapping_add(1); - }); -} - -#[bench] -fn concurrent_load_usize(b: &mut test::Bencher) { - const THREADS: usize = 2; - const STEPS: usize = 1_000_000; - - let start = Barrier::new(THREADS + 1); - let end = Barrier::new(THREADS + 1); - let exit = AtomicCell::new(false); - - let a = AtomicCell::new(0usize); - - thread::scope(|scope| { - for _ in 0..THREADS { - scope.spawn(|_| loop { - start.wait(); - - let mut sum = 0; - for _ in 0..STEPS { - sum += a.load(); - } - test::black_box(sum); - - end.wait(); - if exit.load() { - break; - } - }); - } - - start.wait(); - end.wait(); - - b.iter(|| { - start.wait(); - end.wait(); - }); - - start.wait(); - exit.store(true); - end.wait(); - }) - .unwrap(); -} diff --git a/vendor/crossbeam-utils-0.6.6/src/atomic/atomic_cell.rs b/vendor/crossbeam-utils-0.6.6/src/atomic/atomic_cell.rs deleted file mode 100644 index f3118ecacf..0000000000 --- a/vendor/crossbeam-utils-0.6.6/src/atomic/atomic_cell.rs +++ /dev/null @@ -1,968 +0,0 @@ -use core::cell::UnsafeCell; -use core::fmt; -use core::mem; -use core::ptr; -use core::sync::atomic::{self, AtomicBool, AtomicUsize, Ordering}; - -#[cfg(feature = "std")] -use std::panic::{RefUnwindSafe, UnwindSafe}; - -use Backoff; - -/// A thread-safe mutable memory location. -/// -/// This type is equivalent to [`Cell`], except it can also be shared among multiple threads. -/// -/// Operations on `AtomicCell`s use atomic instructions whenever possible, and synchronize using -/// global locks otherwise. You can call [`AtomicCell::::is_lock_free()`] to check whether -/// atomic instructions or locks will be used. -/// -/// Atomic loads use the [`Acquire`] ordering and atomic stores use the [`Release`] ordering. -/// -/// [`Cell`]: https://doc.rust-lang.org/std/cell/struct.Cell.html -/// [`AtomicCell::::is_lock_free()`]: struct.AtomicCell.html#method.is_lock_free -/// [`Acquire`]: https://doc.rust-lang.org/std/sync/atomic/enum.Ordering.html#variant.Acquire -/// [`Release`]: https://doc.rust-lang.org/std/sync/atomic/enum.Ordering.html#variant.Release -// TODO(@jeehoonkang): when the minimum supported Rust version is bumped to 1.28+, apply the -// attribute `#[repr(transparent)]`. -pub struct AtomicCell { - /// The inner value. - /// - /// If this value can be transmuted into a primitive atomic type, it will be treated as such. - /// Otherwise, all potentially concurrent operations on this data will be protected by a global - /// lock. - value: UnsafeCell, -} - -unsafe impl Send for AtomicCell {} -unsafe impl Sync for AtomicCell {} - -#[cfg(feature = "std")] -impl UnwindSafe for AtomicCell {} -#[cfg(feature = "std")] -impl RefUnwindSafe for AtomicCell {} - -impl AtomicCell { - /// Creates a new atomic cell initialized with `val`. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - /// let a = AtomicCell::new(7); - /// ``` - pub fn new(val: T) -> AtomicCell { - AtomicCell { - value: UnsafeCell::new(val), - } - } - - /// Unwraps the atomic cell and returns its inner value. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - /// let mut a = AtomicCell::new(7); - /// let v = a.into_inner(); - /// - /// assert_eq!(v, 7); - /// ``` - pub fn into_inner(self) -> T { - self.value.into_inner() - } - - /// Returns `true` if operations on values of this type are lock-free. - /// - /// If the compiler or the platform doesn't support the necessary atomic instructions, - /// `AtomicCell` will use global locks for every potentially concurrent atomic operation. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - /// // This type is internally represented as `AtomicUsize` so we can just use atomic - /// // operations provided by it. - /// assert_eq!(AtomicCell::::is_lock_free(), true); - /// - /// // A wrapper struct around `isize`. - /// struct Foo { - /// bar: isize, - /// } - /// // `AtomicCell` will be internally represented as `AtomicIsize`. - /// assert_eq!(AtomicCell::::is_lock_free(), true); - /// - /// // Operations on zero-sized types are always lock-free. - /// assert_eq!(AtomicCell::<()>::is_lock_free(), true); - /// - /// // Very large types cannot be represented as any of the standard atomic types, so atomic - /// // operations on them will have to use global locks for synchronization. - /// assert_eq!(AtomicCell::<[u8; 1000]>::is_lock_free(), false); - /// ``` - pub fn is_lock_free() -> bool { - atomic_is_lock_free::() - } - - /// Stores `val` into the atomic cell. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - /// let a = AtomicCell::new(7); - /// - /// assert_eq!(a.load(), 7); - /// a.store(8); - /// assert_eq!(a.load(), 8); - /// ``` - pub fn store(&self, val: T) { - if mem::needs_drop::() { - drop(self.swap(val)); - } else { - unsafe { - atomic_store(self.value.get(), val); - } - } - } - - /// Stores `val` into the atomic cell and returns the previous value. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - /// let a = AtomicCell::new(7); - /// - /// assert_eq!(a.load(), 7); - /// assert_eq!(a.swap(8), 7); - /// assert_eq!(a.load(), 8); - /// ``` - pub fn swap(&self, val: T) -> T { - unsafe { atomic_swap(self.value.get(), val) } - } -} - -impl AtomicCell { - /// Returns a raw pointer to the underlying data in this atomic cell. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - /// let mut a = AtomicCell::new(5); - /// - /// let ptr = a.as_ptr(); - /// ``` - #[inline] - pub fn as_ptr(&self) -> *mut T { - self.value.get() - } - - /// Returns a mutable reference to the inner value. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - /// let mut a = AtomicCell::new(7); - /// *a.get_mut() += 1; - /// - /// assert_eq!(a.load(), 8); - /// ``` - #[doc(hidden)] - #[deprecated(note = "this method is unsound and will be removed in the next release")] - pub fn get_mut(&mut self) -> &mut T { - unsafe { &mut *self.value.get() } - } -} - -impl AtomicCell { - /// Takes the value of the atomic cell, leaving `Default::default()` in its place. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - /// let a = AtomicCell::new(5); - /// let five = a.take(); - /// - /// assert_eq!(five, 5); - /// assert_eq!(a.into_inner(), 0); - /// ``` - pub fn take(&self) -> T { - self.swap(Default::default()) - } -} - -impl AtomicCell { - /// Loads a value. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - /// let a = AtomicCell::new(7); - /// - /// assert_eq!(a.load(), 7); - /// ``` - pub fn load(&self) -> T { - unsafe { atomic_load(self.value.get()) } - } -} - -impl AtomicCell { - /// If the current value equals `current`, stores `new` into the atomic cell. - /// - /// The return value is always the previous value. If it is equal to `current`, then the value - /// was updated. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - /// let a = AtomicCell::new(1); - /// - /// assert_eq!(a.compare_and_swap(2, 3), 1); - /// assert_eq!(a.load(), 1); - /// - /// assert_eq!(a.compare_and_swap(1, 2), 1); - /// assert_eq!(a.load(), 2); - /// ``` - pub fn compare_and_swap(&self, current: T, new: T) -> T { - match self.compare_exchange(current, new) { - Ok(v) => v, - Err(v) => v, - } - } - - /// If the current value equals `current`, stores `new` into the atomic cell. - /// - /// The return value is a result indicating whether the new value was written and containing - /// the previous value. On success this value is guaranteed to be equal to `current`. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - /// let a = AtomicCell::new(1); - /// - /// assert_eq!(a.compare_exchange(2, 3), Err(1)); - /// assert_eq!(a.load(), 1); - /// - /// assert_eq!(a.compare_exchange(1, 2), Ok(1)); - /// assert_eq!(a.load(), 2); - /// ``` - pub fn compare_exchange(&self, current: T, new: T) -> Result { - unsafe { atomic_compare_exchange_weak(self.value.get(), current, new) } - } -} - -macro_rules! impl_arithmetic { - ($t:ty, $example:tt) => { - impl AtomicCell<$t> { - /// Increments the current value by `val` and returns the previous value. - /// - /// The addition wraps on overflow. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - #[doc = $example] - /// - /// assert_eq!(a.fetch_add(3), 7); - /// assert_eq!(a.load(), 10); - /// ``` - #[inline] - pub fn fetch_add(&self, val: $t) -> $t { - if can_transmute::<$t, atomic::AtomicUsize>() { - let a = unsafe { &*(self.value.get() as *const atomic::AtomicUsize) }; - a.fetch_add(val as usize, Ordering::AcqRel) as $t - } else { - let _guard = lock(self.value.get() as usize).write(); - let value = unsafe { &mut *(self.value.get()) }; - let old = *value; - *value = value.wrapping_add(val); - old - } - } - - /// Decrements the current value by `val` and returns the previous value. - /// - /// The subtraction wraps on overflow. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - #[doc = $example] - /// - /// assert_eq!(a.fetch_sub(3), 7); - /// assert_eq!(a.load(), 4); - /// ``` - #[inline] - pub fn fetch_sub(&self, val: $t) -> $t { - if can_transmute::<$t, atomic::AtomicUsize>() { - let a = unsafe { &*(self.value.get() as *const atomic::AtomicUsize) }; - a.fetch_sub(val as usize, Ordering::AcqRel) as $t - } else { - let _guard = lock(self.value.get() as usize).write(); - let value = unsafe { &mut *(self.value.get()) }; - let old = *value; - *value = value.wrapping_sub(val); - old - } - } - - /// Applies bitwise "and" to the current value and returns the previous value. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - #[doc = $example] - /// - /// assert_eq!(a.fetch_and(3), 7); - /// assert_eq!(a.load(), 3); - /// ``` - #[inline] - pub fn fetch_and(&self, val: $t) -> $t { - if can_transmute::<$t, atomic::AtomicUsize>() { - let a = unsafe { &*(self.value.get() as *const atomic::AtomicUsize) }; - a.fetch_and(val as usize, Ordering::AcqRel) as $t - } else { - let _guard = lock(self.value.get() as usize).write(); - let value = unsafe { &mut *(self.value.get()) }; - let old = *value; - *value &= val; - old - } - } - - /// Applies bitwise "or" to the current value and returns the previous value. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - #[doc = $example] - /// - /// assert_eq!(a.fetch_or(16), 7); - /// assert_eq!(a.load(), 23); - /// ``` - #[inline] - pub fn fetch_or(&self, val: $t) -> $t { - if can_transmute::<$t, atomic::AtomicUsize>() { - let a = unsafe { &*(self.value.get() as *const atomic::AtomicUsize) }; - a.fetch_or(val as usize, Ordering::AcqRel) as $t - } else { - let _guard = lock(self.value.get() as usize).write(); - let value = unsafe { &mut *(self.value.get()) }; - let old = *value; - *value |= val; - old - } - } - - /// Applies bitwise "xor" to the current value and returns the previous value. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - #[doc = $example] - /// - /// assert_eq!(a.fetch_xor(2), 7); - /// assert_eq!(a.load(), 5); - /// ``` - #[inline] - pub fn fetch_xor(&self, val: $t) -> $t { - if can_transmute::<$t, atomic::AtomicUsize>() { - let a = unsafe { &*(self.value.get() as *const atomic::AtomicUsize) }; - a.fetch_xor(val as usize, Ordering::AcqRel) as $t - } else { - let _guard = lock(self.value.get() as usize).write(); - let value = unsafe { &mut *(self.value.get()) }; - let old = *value; - *value ^= val; - old - } - } - } - }; - ($t:ty, $atomic:ty, $example:tt) => { - impl AtomicCell<$t> { - /// Increments the current value by `val` and returns the previous value. - /// - /// The addition wraps on overflow. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - #[doc = $example] - /// - /// assert_eq!(a.fetch_add(3), 7); - /// assert_eq!(a.load(), 10); - /// ``` - #[inline] - pub fn fetch_add(&self, val: $t) -> $t { - let a = unsafe { &*(self.value.get() as *const $atomic) }; - a.fetch_add(val, Ordering::AcqRel) - } - - /// Decrements the current value by `val` and returns the previous value. - /// - /// The subtraction wraps on overflow. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - #[doc = $example] - /// - /// assert_eq!(a.fetch_sub(3), 7); - /// assert_eq!(a.load(), 4); - /// ``` - #[inline] - pub fn fetch_sub(&self, val: $t) -> $t { - let a = unsafe { &*(self.value.get() as *const $atomic) }; - a.fetch_sub(val, Ordering::AcqRel) - } - - /// Applies bitwise "and" to the current value and returns the previous value. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - #[doc = $example] - /// - /// assert_eq!(a.fetch_and(3), 7); - /// assert_eq!(a.load(), 3); - /// ``` - #[inline] - pub fn fetch_and(&self, val: $t) -> $t { - let a = unsafe { &*(self.value.get() as *const $atomic) }; - a.fetch_and(val, Ordering::AcqRel) - } - - /// Applies bitwise "or" to the current value and returns the previous value. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - #[doc = $example] - /// - /// assert_eq!(a.fetch_or(16), 7); - /// assert_eq!(a.load(), 23); - /// ``` - #[inline] - pub fn fetch_or(&self, val: $t) -> $t { - let a = unsafe { &*(self.value.get() as *const $atomic) }; - a.fetch_or(val, Ordering::AcqRel) - } - - /// Applies bitwise "xor" to the current value and returns the previous value. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - #[doc = $example] - /// - /// assert_eq!(a.fetch_xor(2), 7); - /// assert_eq!(a.load(), 5); - /// ``` - #[inline] - pub fn fetch_xor(&self, val: $t) -> $t { - let a = unsafe { &*(self.value.get() as *const $atomic) }; - a.fetch_xor(val, Ordering::AcqRel) - } - } - }; - ($t:ty, $size:tt, $atomic:ty, $example:tt) => { - #[cfg(target_has_atomic = $size)] - impl_arithmetic!($t, $atomic, $example); - }; -} - -cfg_if! { - if #[cfg(feature = "nightly")] { - impl_arithmetic!(u8, "8", atomic::AtomicU8, "let a = AtomicCell::new(7u8);"); - impl_arithmetic!(i8, "8", atomic::AtomicI8, "let a = AtomicCell::new(7i8);"); - impl_arithmetic!(u16, "16", atomic::AtomicU16, "let a = AtomicCell::new(7u16);"); - impl_arithmetic!(i16, "16", atomic::AtomicI16, "let a = AtomicCell::new(7i16);"); - impl_arithmetic!(u32, "32", atomic::AtomicU32, "let a = AtomicCell::new(7u32);"); - impl_arithmetic!(i32, "32", atomic::AtomicI32, "let a = AtomicCell::new(7i32);"); - impl_arithmetic!(u64, "64", atomic::AtomicU64, "let a = AtomicCell::new(7u64);"); - impl_arithmetic!(i64, "64", atomic::AtomicI64, "let a = AtomicCell::new(7i64);"); - impl_arithmetic!(u128, "let a = AtomicCell::new(7u128);"); - impl_arithmetic!(i128, "let a = AtomicCell::new(7i128);"); - } else { - impl_arithmetic!(u8, "let a = AtomicCell::new(7u8);"); - impl_arithmetic!(i8, "let a = AtomicCell::new(7i8);"); - impl_arithmetic!(u16, "let a = AtomicCell::new(7u16);"); - impl_arithmetic!(i16, "let a = AtomicCell::new(7i16);"); - impl_arithmetic!(u32, "let a = AtomicCell::new(7u32);"); - impl_arithmetic!(i32, "let a = AtomicCell::new(7i32);"); - impl_arithmetic!(u64, "let a = AtomicCell::new(7u64);"); - impl_arithmetic!(i64, "let a = AtomicCell::new(7i64);"); - impl_arithmetic!(u128, "let a = AtomicCell::new(7u128);"); - impl_arithmetic!(i128, "let a = AtomicCell::new(7i128);"); - } -} - -impl_arithmetic!( - usize, - atomic::AtomicUsize, - "let a = AtomicCell::new(7usize);" -); -impl_arithmetic!( - isize, - atomic::AtomicIsize, - "let a = AtomicCell::new(7isize);" -); - -impl AtomicCell { - /// Applies logical "and" to the current value and returns the previous value. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - /// let a = AtomicCell::new(true); - /// - /// assert_eq!(a.fetch_and(true), true); - /// assert_eq!(a.load(), true); - /// - /// assert_eq!(a.fetch_and(false), true); - /// assert_eq!(a.load(), false); - /// ``` - #[inline] - pub fn fetch_and(&self, val: bool) -> bool { - let a = unsafe { &*(self.value.get() as *const AtomicBool) }; - a.fetch_and(val, Ordering::AcqRel) - } - - /// Applies logical "or" to the current value and returns the previous value. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - /// let a = AtomicCell::new(false); - /// - /// assert_eq!(a.fetch_or(false), false); - /// assert_eq!(a.load(), false); - /// - /// assert_eq!(a.fetch_or(true), false); - /// assert_eq!(a.load(), true); - /// ``` - #[inline] - pub fn fetch_or(&self, val: bool) -> bool { - let a = unsafe { &*(self.value.get() as *const AtomicBool) }; - a.fetch_or(val, Ordering::AcqRel) - } - - /// Applies logical "xor" to the current value and returns the previous value. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::atomic::AtomicCell; - /// - /// let a = AtomicCell::new(true); - /// - /// assert_eq!(a.fetch_xor(false), true); - /// assert_eq!(a.load(), true); - /// - /// assert_eq!(a.fetch_xor(true), true); - /// assert_eq!(a.load(), false); - /// ``` - #[inline] - pub fn fetch_xor(&self, val: bool) -> bool { - let a = unsafe { &*(self.value.get() as *const AtomicBool) }; - a.fetch_xor(val, Ordering::AcqRel) - } -} - -impl Default for AtomicCell { - fn default() -> AtomicCell { - AtomicCell::new(T::default()) - } -} - -impl fmt::Debug for AtomicCell { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("AtomicCell") - .field("value", &self.load()) - .finish() - } -} - -/// Returns `true` if values of type `A` can be transmuted into values of type `B`. -fn can_transmute() -> bool { - // Sizes must be equal, but alignment of `A` must be greater or equal than that of `B`. - mem::size_of::
    () == mem::size_of::() && mem::align_of::() >= mem::align_of::() -} - -/// A simple stamped lock. -struct Lock { - /// The current state of the lock. - /// - /// All bits except the least significant one hold the current stamp. When locked, the state - /// equals 1 and doesn't contain a valid stamp. - state: AtomicUsize, -} - -impl Lock { - /// If not locked, returns the current stamp. - /// - /// This method should be called before optimistic reads. - #[inline] - fn optimistic_read(&self) -> Option { - let state = self.state.load(Ordering::Acquire); - if state == 1 { - None - } else { - Some(state) - } - } - - /// Returns `true` if the current stamp is equal to `stamp`. - /// - /// This method should be called after optimistic reads to check whether they are valid. The - /// argument `stamp` should correspond to the one returned by method `optimistic_read`. - #[inline] - fn validate_read(&self, stamp: usize) -> bool { - atomic::fence(Ordering::Acquire); - self.state.load(Ordering::Relaxed) == stamp - } - - /// Grabs the lock for writing. - #[inline] - fn write(&'static self) -> WriteGuard { - let backoff = Backoff::new(); - loop { - let previous = self.state.swap(1, Ordering::Acquire); - - if previous != 1 { - atomic::fence(Ordering::Release); - - return WriteGuard { - lock: self, - state: previous, - }; - } - - backoff.snooze(); - } - } -} - -/// A RAII guard that releases the lock and increments the stamp when dropped. -struct WriteGuard { - /// The parent lock. - lock: &'static Lock, - - /// The stamp before locking. - state: usize, -} - -impl WriteGuard { - /// Releases the lock without incrementing the stamp. - #[inline] - fn abort(self) { - self.lock.state.store(self.state, Ordering::Release); - } -} - -impl Drop for WriteGuard { - #[inline] - fn drop(&mut self) { - // Release the lock and increment the stamp. - self.lock - .state - .store(self.state.wrapping_add(2), Ordering::Release); - } -} - -/// Returns a reference to the global lock associated with the `AtomicCell` at address `addr`. -/// -/// This function is used to protect atomic data which doesn't fit into any of the primitive atomic -/// types in `std::sync::atomic`. Operations on such atomics must therefore use a global lock. -/// -/// However, there is not only one global lock but an array of many locks, and one of them is -/// picked based on the given address. Having many locks reduces contention and improves -/// scalability. -#[inline] -#[must_use] -fn lock(addr: usize) -> &'static Lock { - // The number of locks is a prime number because we want to make sure `addr % LEN` gets - // dispersed across all locks. - // - // Note that addresses are always aligned to some power of 2, depending on type `T` in - // `AtomicCell`. If `LEN` was an even number, then `addr % LEN` would be an even number, - // too, which means only half of the locks would get utilized! - // - // It is also possible for addresses to accidentally get aligned to a number that is not a - // power of 2. Consider this example: - // - // ``` - // #[repr(C)] - // struct Foo { - // a: AtomicCell, - // b: u8, - // c: u8, - // } - // ``` - // - // Now, if we have a slice of type `&[Foo]`, it is possible that field `a` in all items gets - // stored at addresses that are multiples of 3. It'd be too bad if `LEN` was divisible by 3. - // In order to protect from such cases, we simply choose a large prime number for `LEN`. - const LEN: usize = 97; - - const L: Lock = Lock { - state: AtomicUsize::new(0), - }; - static LOCKS: [Lock; LEN] = [ - L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, - L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, - L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, - L, L, L, L, L, L, L, - ]; - - // If the modulus is a constant number, the compiler will use crazy math to transform this into - // a sequence of cheap arithmetic operations rather than using the slow modulo instruction. - &LOCKS[addr % LEN] -} - -/// An atomic `()`. -/// -/// All operations are noops. -struct AtomicUnit; - -impl AtomicUnit { - #[inline] - fn load(&self, _order: Ordering) {} - - #[inline] - fn store(&self, _val: (), _order: Ordering) {} - - #[inline] - fn swap(&self, _val: (), _order: Ordering) {} - - #[inline] - fn compare_exchange_weak( - &self, - _current: (), - _new: (), - _success: Ordering, - _failure: Ordering, - ) -> Result<(), ()> { - Ok(()) - } -} - -macro_rules! atomic { - // If values of type `$t` can be transmuted into values of the primitive atomic type `$atomic`, - // declares variable `$a` of type `$atomic` and executes `$atomic_op`, breaking out of the loop. - (@check, $t:ty, $atomic:ty, $a:ident, $atomic_op:expr) => { - if can_transmute::<$t, $atomic>() { - let $a: &$atomic; - break $atomic_op; - } - }; - - // If values of type `$t` can be transmuted into values of a primitive atomic type, declares - // variable `$a` of that type and executes `$atomic_op`. Otherwise, just executes - // `$fallback_op`. - ($t:ty, $a:ident, $atomic_op:expr, $fallback_op:expr) => { - loop { - atomic!(@check, $t, AtomicUnit, $a, $atomic_op); - atomic!(@check, $t, atomic::AtomicUsize, $a, $atomic_op); - - #[cfg(feature = "nightly")] - { - #[cfg(target_has_atomic = "8")] - atomic!(@check, $t, atomic::AtomicU8, $a, $atomic_op); - #[cfg(target_has_atomic = "16")] - atomic!(@check, $t, atomic::AtomicU16, $a, $atomic_op); - #[cfg(target_has_atomic = "32")] - atomic!(@check, $t, atomic::AtomicU32, $a, $atomic_op); - #[cfg(target_has_atomic = "64")] - atomic!(@check, $t, atomic::AtomicU64, $a, $atomic_op); - } - - break $fallback_op; - } - }; -} - -/// Returns `true` if operations on `AtomicCell` are lock-free. -fn atomic_is_lock_free() -> bool { - atomic! { T, _a, true, false } -} - -/// Atomically reads data from `src`. -/// -/// This operation uses the `Acquire` ordering. If possible, an atomic instructions is used, and a -/// global lock otherwise. -unsafe fn atomic_load(src: *mut T) -> T -where - T: Copy, -{ - atomic! { - T, a, - { - a = &*(src as *const _ as *const _); - mem::transmute_copy(&a.load(Ordering::Acquire)) - }, - { - let lock = lock(src as usize); - - // Try doing an optimistic read first. - if let Some(stamp) = lock.optimistic_read() { - // We need a volatile read here because other threads might concurrently modify the - // value. In theory, data races are *always* UB, even if we use volatile reads and - // discard the data when a data race is detected. The proper solution would be to - // do atomic reads and atomic writes, but we can't atomically read and write all - // kinds of data since `AtomicU8` is not available on stable Rust yet. - let val = ptr::read_volatile(src); - - if lock.validate_read(stamp) { - return val; - } - } - - // Grab a regular write lock so that writers don't starve this load. - let guard = lock.write(); - let val = ptr::read(src); - // The value hasn't been changed. Drop the guard without incrementing the stamp. - guard.abort(); - val - } - } -} - -/// Atomically writes `val` to `dst`. -/// -/// This operation uses the `Release` ordering. If possible, an atomic instructions is used, and a -/// global lock otherwise. -unsafe fn atomic_store(dst: *mut T, val: T) { - atomic! { - T, a, - { - a = &*(dst as *const _ as *const _); - a.store(mem::transmute_copy(&val), Ordering::Release); - mem::forget(val); - }, - { - let _guard = lock(dst as usize).write(); - ptr::write(dst, val); - } - } -} - -/// Atomically swaps data at `dst` with `val`. -/// -/// This operation uses the `AcqRel` ordering. If possible, an atomic instructions is used, and a -/// global lock otherwise. -unsafe fn atomic_swap(dst: *mut T, val: T) -> T { - atomic! { - T, a, - { - a = &*(dst as *const _ as *const _); - let res = mem::transmute_copy(&a.swap(mem::transmute_copy(&val), Ordering::AcqRel)); - mem::forget(val); - res - }, - { - let _guard = lock(dst as usize).write(); - ptr::replace(dst, val) - } - } -} - -/// Atomically compares data at `dst` to `current` and, if equal byte-for-byte, exchanges data at -/// `dst` with `new`. -/// -/// Returns the old value on success, or the current value at `dst` on failure. -/// -/// This operation uses the `AcqRel` ordering. If possible, an atomic instructions is used, and a -/// global lock otherwise. -unsafe fn atomic_compare_exchange_weak(dst: *mut T, mut current: T, new: T) -> Result -where - T: Copy + Eq, -{ - atomic! { - T, a, - { - a = &*(dst as *const _ as *const _); - let mut current_raw = mem::transmute_copy(¤t); - let new_raw = mem::transmute_copy(&new); - - loop { - match a.compare_exchange_weak( - current_raw, - new_raw, - Ordering::AcqRel, - Ordering::Acquire, - ) { - Ok(_) => break Ok(current), - Err(previous_raw) => { - let previous = mem::transmute_copy(&previous_raw); - - if !T::eq(&previous, ¤t) { - break Err(previous); - } - - // The compare-exchange operation has failed and didn't store `new`. The - // failure is either spurious, or `previous` was semantically equal to - // `current` but not byte-equal. Let's retry with `previous` as the new - // `current`. - current = previous; - current_raw = previous_raw; - } - } - } - }, - { - let guard = lock(dst as usize).write(); - - if T::eq(&*dst, ¤t) { - Ok(ptr::replace(dst, new)) - } else { - let val = ptr::read(dst); - // The value hasn't been changed. Drop the guard without incrementing the stamp. - guard.abort(); - Err(val) - } - } - } -} diff --git a/vendor/crossbeam-utils-0.6.6/src/atomic/consume.rs b/vendor/crossbeam-utils-0.6.6/src/atomic/consume.rs deleted file mode 100644 index 9be5464fb3..0000000000 --- a/vendor/crossbeam-utils-0.6.6/src/atomic/consume.rs +++ /dev/null @@ -1,82 +0,0 @@ -#[cfg(any(target_arch = "arm", target_arch = "aarch64"))] -use core::sync::atomic::compiler_fence; -use core::sync::atomic::Ordering; - -/// Trait which allows reading from primitive atomic types with "consume" ordering. -pub trait AtomicConsume { - /// Type returned by `load_consume`. - type Val; - - /// Loads a value from the atomic using a "consume" memory ordering. - /// - /// This is similar to the "acquire" ordering, except that an ordering is - /// only guaranteed with operations that "depend on" the result of the load. - /// However consume loads are usually much faster than acquire loads on - /// architectures with a weak memory model since they don't require memory - /// fence instructions. - /// - /// The exact definition of "depend on" is a bit vague, but it works as you - /// would expect in practice since a lot of software, especially the Linux - /// kernel, rely on this behavior. - /// - /// This is currently only implemented on ARM and AArch64, where a fence - /// can be avoided. On other architectures this will fall back to a simple - /// `load(Ordering::Acquire)`. - fn load_consume(&self) -> Self::Val; -} - -#[cfg(any(target_arch = "arm", target_arch = "aarch64"))] -macro_rules! impl_consume { - () => { - #[inline] - fn load_consume(&self) -> Self::Val { - let result = self.load(Ordering::Relaxed); - compiler_fence(Ordering::Acquire); - result - } - }; -} - -#[cfg(not(any(target_arch = "arm", target_arch = "aarch64")))] -macro_rules! impl_consume { - () => { - #[inline] - fn load_consume(&self) -> Self::Val { - self.load(Ordering::Acquire) - } - }; -} - -macro_rules! impl_atomic { - ($atomic:ident, $val:ty) => { - impl AtomicConsume for ::core::sync::atomic::$atomic { - type Val = $val; - impl_consume!(); - } - }; -} - -impl_atomic!(AtomicBool, bool); -impl_atomic!(AtomicUsize, usize); -impl_atomic!(AtomicIsize, isize); -#[cfg(all(feature = "nightly", target_has_atomic = "8"))] -impl_atomic!(AtomicU8, u8); -#[cfg(all(feature = "nightly", target_has_atomic = "8"))] -impl_atomic!(AtomicI8, i8); -#[cfg(all(feature = "nightly", target_has_atomic = "16"))] -impl_atomic!(AtomicU16, u16); -#[cfg(all(feature = "nightly", target_has_atomic = "16"))] -impl_atomic!(AtomicI16, i16); -#[cfg(all(feature = "nightly", target_has_atomic = "32"))] -impl_atomic!(AtomicU32, u32); -#[cfg(all(feature = "nightly", target_has_atomic = "32"))] -impl_atomic!(AtomicI32, i32); -#[cfg(all(feature = "nightly", target_has_atomic = "64"))] -impl_atomic!(AtomicU64, u64); -#[cfg(all(feature = "nightly", target_has_atomic = "64"))] -impl_atomic!(AtomicI64, i64); - -impl AtomicConsume for ::core::sync::atomic::AtomicPtr { - type Val = *mut T; - impl_consume!(); -} diff --git a/vendor/crossbeam-utils-0.6.6/src/atomic/mod.rs b/vendor/crossbeam-utils-0.6.6/src/atomic/mod.rs deleted file mode 100644 index 4205993950..0000000000 --- a/vendor/crossbeam-utils-0.6.6/src/atomic/mod.rs +++ /dev/null @@ -1,7 +0,0 @@ -//! Atomic types. - -mod atomic_cell; -mod consume; - -pub use self::atomic_cell::AtomicCell; -pub use self::consume::AtomicConsume; diff --git a/vendor/crossbeam-utils-0.6.6/src/backoff.rs b/vendor/crossbeam-utils-0.6.6/src/backoff.rs deleted file mode 100644 index 446755bbc7..0000000000 --- a/vendor/crossbeam-utils-0.6.6/src/backoff.rs +++ /dev/null @@ -1,292 +0,0 @@ -use core::cell::Cell; -use core::fmt; -use core::sync::atomic; - -const SPIN_LIMIT: u32 = 6; -const YIELD_LIMIT: u32 = 10; - -/// Performs exponential backoff in spin loops. -/// -/// Backing off in spin loops reduces contention and improves overall performance. -/// -/// This primitive can execute *YIELD* and *PAUSE* instructions, yield the current thread to the OS -/// scheduler, and tell when is a good time to block the thread using a different synchronization -/// mechanism. Each step of the back off procedure takes roughly twice as long as the previous -/// step. -/// -/// # Examples -/// -/// Backing off in a lock-free loop: -/// -/// ``` -/// use crossbeam_utils::Backoff; -/// use std::sync::atomic::AtomicUsize; -/// use std::sync::atomic::Ordering::SeqCst; -/// -/// fn fetch_mul(a: &AtomicUsize, b: usize) -> usize { -/// let backoff = Backoff::new(); -/// loop { -/// let val = a.load(SeqCst); -/// if a.compare_and_swap(val, val.wrapping_mul(b), SeqCst) == val { -/// return val; -/// } -/// backoff.spin(); -/// } -/// } -/// ``` -/// -/// Waiting for an [`AtomicBool`] to become `true`: -/// -/// ``` -/// use crossbeam_utils::Backoff; -/// use std::sync::atomic::AtomicBool; -/// use std::sync::atomic::Ordering::SeqCst; -/// -/// fn spin_wait(ready: &AtomicBool) { -/// let backoff = Backoff::new(); -/// while !ready.load(SeqCst) { -/// backoff.snooze(); -/// } -/// } -/// ``` -/// -/// Waiting for an [`AtomicBool`] to become `true` and parking the thread after a long wait. -/// Note that whoever sets the atomic variable to `true` must notify the parked thread by calling -/// [`unpark()`]: -/// -/// ``` -/// use crossbeam_utils::Backoff; -/// use std::sync::atomic::AtomicBool; -/// use std::sync::atomic::Ordering::SeqCst; -/// use std::thread; -/// -/// fn blocking_wait(ready: &AtomicBool) { -/// let backoff = Backoff::new(); -/// while !ready.load(SeqCst) { -/// if backoff.is_completed() { -/// thread::park(); -/// } else { -/// backoff.snooze(); -/// } -/// } -/// } -/// ``` -/// -/// [`is_completed`]: struct.Backoff.html#method.is_completed -/// [`std::thread::park()`]: https://doc.rust-lang.org/std/thread/fn.park.html -/// [`Condvar`]: https://doc.rust-lang.org/std/sync/struct.Condvar.html -/// [`AtomicBool`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicBool.html -/// [`unpark()`]: https://doc.rust-lang.org/std/thread/struct.Thread.html#method.unpark -pub struct Backoff { - step: Cell, -} - -impl Backoff { - /// Creates a new `Backoff`. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::Backoff; - /// - /// let backoff = Backoff::new(); - /// ``` - #[inline] - pub fn new() -> Self { - Backoff { step: Cell::new(0) } - } - - /// Resets the `Backoff`. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::Backoff; - /// - /// let backoff = Backoff::new(); - /// backoff.reset(); - /// ``` - #[inline] - pub fn reset(&self) { - self.step.set(0); - } - - /// Backs off in a lock-free loop. - /// - /// This method should be used when we need to retry an operation because another thread made - /// progress. - /// - /// The processor may yield using the *YIELD* or *PAUSE* instruction. - /// - /// # Examples - /// - /// Backing off in a lock-free loop: - /// - /// ``` - /// use crossbeam_utils::Backoff; - /// use std::sync::atomic::AtomicUsize; - /// use std::sync::atomic::Ordering::SeqCst; - /// - /// fn fetch_mul(a: &AtomicUsize, b: usize) -> usize { - /// let backoff = Backoff::new(); - /// loop { - /// let val = a.load(SeqCst); - /// if a.compare_and_swap(val, val.wrapping_mul(b), SeqCst) == val { - /// return val; - /// } - /// backoff.spin(); - /// } - /// } - /// - /// let a = AtomicUsize::new(7); - /// assert_eq!(fetch_mul(&a, 8), 7); - /// assert_eq!(a.load(SeqCst), 56); - /// ``` - #[inline] - pub fn spin(&self) { - for _ in 0..1 << self.step.get().min(SPIN_LIMIT) { - atomic::spin_loop_hint(); - } - - if self.step.get() <= SPIN_LIMIT { - self.step.set(self.step.get() + 1); - } - } - - /// Backs off in a blocking loop. - /// - /// This method should be used when we need to wait for another thread to make progress. - /// - /// The processor may yield using the *YIELD* or *PAUSE* instruction and the current thread - /// may yield by giving up a timeslice to the OS scheduler. - /// - /// In `#[no_std]` environments, this method is equivalent to [`spin`]. - /// - /// If possible, use [`is_completed`] to check when it is advised to stop using backoff and - /// block the current thread using a different synchronization mechanism instead. - /// - /// [`spin`]: struct.Backoff.html#method.spin - /// [`is_completed`]: struct.Backoff.html#method.is_completed - /// - /// # Examples - /// - /// Waiting for an [`AtomicBool`] to become `true`: - /// - /// ``` - /// use crossbeam_utils::Backoff; - /// use std::sync::Arc; - /// use std::sync::atomic::AtomicBool; - /// use std::sync::atomic::Ordering::SeqCst; - /// use std::thread; - /// use std::time::Duration; - /// - /// fn spin_wait(ready: &AtomicBool) { - /// let backoff = Backoff::new(); - /// while !ready.load(SeqCst) { - /// backoff.snooze(); - /// } - /// } - /// - /// let ready = Arc::new(AtomicBool::new(false)); - /// let ready2 = ready.clone(); - /// - /// thread::spawn(move || { - /// thread::sleep(Duration::from_millis(100)); - /// ready2.store(true, SeqCst); - /// }); - /// - /// assert_eq!(ready.load(SeqCst), false); - /// spin_wait(&ready); - /// assert_eq!(ready.load(SeqCst), true); - /// ``` - /// - /// [`AtomicBool`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicBool.html - #[inline] - pub fn snooze(&self) { - if self.step.get() <= SPIN_LIMIT { - for _ in 0..1 << self.step.get() { - atomic::spin_loop_hint(); - } - } else { - #[cfg(not(feature = "std"))] - for _ in 0..1 << self.step.get() { - atomic::spin_loop_hint(); - } - - #[cfg(feature = "std")] - ::std::thread::yield_now(); - } - - if self.step.get() <= YIELD_LIMIT { - self.step.set(self.step.get() + 1); - } - } - - /// Returns `true` if exponential backoff has completed and blocking the thread is advised. - /// - /// # Examples - /// - /// Waiting for an [`AtomicBool`] to become `true` and parking the thread after a long wait: - /// - /// ``` - /// use crossbeam_utils::Backoff; - /// use std::sync::Arc; - /// use std::sync::atomic::AtomicBool; - /// use std::sync::atomic::Ordering::SeqCst; - /// use std::thread; - /// use std::time::Duration; - /// - /// fn blocking_wait(ready: &AtomicBool) { - /// let backoff = Backoff::new(); - /// while !ready.load(SeqCst) { - /// if backoff.is_completed() { - /// thread::park(); - /// } else { - /// backoff.snooze(); - /// } - /// } - /// } - /// - /// let ready = Arc::new(AtomicBool::new(false)); - /// let ready2 = ready.clone(); - /// let waiter = thread::current(); - /// - /// thread::spawn(move || { - /// thread::sleep(Duration::from_millis(100)); - /// ready2.store(true, SeqCst); - /// waiter.unpark(); - /// }); - /// - /// assert_eq!(ready.load(SeqCst), false); - /// blocking_wait(&ready); - /// assert_eq!(ready.load(SeqCst), true); - /// ``` - /// - /// [`AtomicBool`]: https://doc.rust-lang.org/std/sync/atomic/struct.AtomicBool.html - #[inline] - pub fn is_completed(&self) -> bool { - self.step.get() > YIELD_LIMIT - } - - #[inline] - #[doc(hidden)] - #[deprecated(note = "use `is_completed` instead")] - pub fn is_complete(&self) -> bool { - self.is_completed() - } -} - -impl fmt::Debug for Backoff { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("Backoff") - .field("step", &self.step) - .field("is_completed", &self.is_completed()) - .finish() - } -} - -impl Default for Backoff { - fn default() -> Backoff { - Backoff::new() - } -} diff --git a/vendor/crossbeam-utils-0.6.6/src/cache_padded.rs b/vendor/crossbeam-utils-0.6.6/src/cache_padded.rs deleted file mode 100644 index bb864a4191..0000000000 --- a/vendor/crossbeam-utils-0.6.6/src/cache_padded.rs +++ /dev/null @@ -1,131 +0,0 @@ -use core::fmt; -use core::ops::{Deref, DerefMut}; - -/// Pads and aligns a value to the length of a cache line. -/// -/// In concurrent programming, sometimes it is desirable to make sure commonly accessed pieces of -/// data are not placed into the same cache line. Updating an atomic value invalides the whole -/// cache line it belongs to, which makes the next access to the same cache line slower for other -/// CPU cores. Use `CachePadded` to ensure updating one piece of data doesn't invalidate other -/// cached data. -/// -/// # Size and alignment -/// -/// Cache lines are assumed to be N bytes long, depending on the architecture: -/// -/// * On x86-64, N = 128. -/// * On all others, N = 64. -/// -/// Note that N is just a reasonable guess and is not guaranteed to match the actual cache line -/// length of the machine the program is running on. On modern Intel architectures, spatial -/// prefetcher is pulling pairs of 64-byte cache lines at a time, so we pessimistically assume that -/// cache lines are 128 bytes long. -/// -/// The size of `CachePadded` is the smallest multiple of N bytes large enough to accommodate -/// a value of type `T`. -/// -/// The alignment of `CachePadded` is the maximum of N bytes and the alignment of `T`. -/// -/// # Examples -/// -/// Alignment and padding: -/// -/// ``` -/// use crossbeam_utils::CachePadded; -/// -/// let array = [CachePadded::new(1i8), CachePadded::new(2i8)]; -/// let addr1 = &*array[0] as *const i8 as usize; -/// let addr2 = &*array[1] as *const i8 as usize; -/// -/// assert!(addr2 - addr1 >= 64); -/// assert_eq!(addr1 % 64, 0); -/// assert_eq!(addr2 % 64, 0); -/// ``` -/// -/// When building a concurrent queue with a head and a tail index, it is wise to place them in -/// different cache lines so that concurrent threads pushing and popping elements don't invalidate -/// each other's cache lines: -/// -/// ``` -/// use crossbeam_utils::CachePadded; -/// use std::sync::atomic::AtomicUsize; -/// -/// struct Queue { -/// head: CachePadded, -/// tail: CachePadded, -/// buffer: *mut T, -/// } -/// ``` -#[derive(Clone, Copy, Default, Hash, PartialEq, Eq)] -// Starting from Intel's Sandy Bridge, spatial prefetcher is now pulling pairs of 64-byte cache -// lines at a time, so we have to align to 128 bytes rather than 64. -// -// Sources: -// - https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf -// - https://github.com/facebook/folly/blob/1b5288e6eea6df074758f877c849b6e73bbb9fbb/folly/lang/Align.h#L107 -#[cfg_attr(target_arch = "x86_64", repr(align(128)))] -#[cfg_attr(not(target_arch = "x86_64"), repr(align(64)))] -pub struct CachePadded { - value: T, -} - -unsafe impl Send for CachePadded {} -unsafe impl Sync for CachePadded {} - -impl CachePadded { - /// Pads and aligns a value to the length of a cache line. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::CachePadded; - /// - /// let padded_value = CachePadded::new(1); - /// ``` - pub fn new(t: T) -> CachePadded { - CachePadded:: { value: t } - } - - /// Returns the inner value. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::CachePadded; - /// - /// let padded_value = CachePadded::new(7); - /// let value = padded_value.into_inner(); - /// assert_eq!(value, 7); - /// ``` - pub fn into_inner(self) -> T { - self.value - } -} - -impl Deref for CachePadded { - type Target = T; - - fn deref(&self) -> &T { - &self.value - } -} - -impl DerefMut for CachePadded { - fn deref_mut(&mut self) -> &mut T { - &mut self.value - } -} - -impl fmt::Debug for CachePadded { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("CachePadded") - .field("value", &self.value) - .finish() - } -} - -impl From for CachePadded { - fn from(t: T) -> Self { - CachePadded::new(t) - } -} diff --git a/vendor/crossbeam-utils-0.6.6/src/lib.rs b/vendor/crossbeam-utils-0.6.6/src/lib.rs deleted file mode 100644 index 4df2ac8a45..0000000000 --- a/vendor/crossbeam-utils-0.6.6/src/lib.rs +++ /dev/null @@ -1,67 +0,0 @@ -//! Miscellaneous tools for concurrent programming. -//! -//! ## Atomics -//! -//! * [`AtomicCell`], a thread-safe mutable memory location. -//! * [`AtomicConsume`], for reading from primitive atomic types with "consume" ordering. -//! -//! ## Thread synchronization -//! -//! * [`Parker`], a thread parking primitive. -//! * [`ShardedLock`], a sharded reader-writer lock with fast concurrent reads. -//! * [`WaitGroup`], for synchronizing the beginning or end of some computation. -//! -//! ## Utilities -//! -//! * [`Backoff`], for exponential backoff in spin loops. -//! * [`CachePadded`], for padding and aligning a value to the length of a cache line. -//! * [`scope`], for spawning threads that borrow local variables from the stack. -//! -//! [`AtomicCell`]: atomic/struct.AtomicCell.html -//! [`AtomicConsume`]: atomic/trait.AtomicConsume.html -//! [`Parker`]: sync/struct.Parker.html -//! [`ShardedLock`]: sync/struct.ShardedLock.html -//! [`WaitGroup`]: sync/struct.WaitGroup.html -//! [`Backoff`]: struct.Backoff.html -//! [`CachePadded`]: struct.CachePadded.html -//! [`scope`]: thread/fn.scope.html - -#![warn(missing_docs)] -#![warn(missing_debug_implementations)] -#![cfg_attr(not(feature = "std"), no_std)] -#![cfg_attr(feature = "nightly", feature(cfg_target_has_atomic))] - -#[macro_use] -extern crate cfg_if; -#[cfg(feature = "std")] -extern crate core; - -cfg_if! { - if #[cfg(feature = "alloc")] { - extern crate alloc; - } else if #[cfg(feature = "std")] { - extern crate std as alloc; - } -} - -#[cfg_attr( - feature = "nightly", - cfg(all(target_has_atomic = "cas", target_has_atomic = "ptr")) -)] -pub mod atomic; - -mod cache_padded; -pub use cache_padded::CachePadded; - -mod backoff; -pub use backoff::Backoff; - -cfg_if! { - if #[cfg(feature = "std")] { - #[macro_use] - extern crate lazy_static; - - pub mod sync; - pub mod thread; - } -} diff --git a/vendor/crossbeam-utils-0.6.6/src/sync/mod.rs b/vendor/crossbeam-utils-0.6.6/src/sync/mod.rs deleted file mode 100644 index 31c8ffec4d..0000000000 --- a/vendor/crossbeam-utils-0.6.6/src/sync/mod.rs +++ /dev/null @@ -1,17 +0,0 @@ -//! Thread synchronization primitives. -//! -//! * [`Parker`], a thread parking primitive. -//! * [`ShardedLock`], a sharded reader-writer lock with fast concurrent reads. -//! * [`WaitGroup`], for synchronizing the beginning or end of some computation. -//! -//! [`Parker`]: struct.Parker.html -//! [`ShardedLock`]: struct.ShardedLock.html -//! [`WaitGroup`]: struct.WaitGroup.html - -mod parker; -mod sharded_lock; -mod wait_group; - -pub use self::sharded_lock::{ShardedLock, ShardedLockReadGuard, ShardedLockWriteGuard}; -pub use self::parker::{Parker, Unparker}; -pub use self::wait_group::WaitGroup; diff --git a/vendor/crossbeam-utils-0.6.6/src/sync/parker.rs b/vendor/crossbeam-utils-0.6.6/src/sync/parker.rs deleted file mode 100644 index 506db8e393..0000000000 --- a/vendor/crossbeam-utils-0.6.6/src/sync/parker.rs +++ /dev/null @@ -1,311 +0,0 @@ -use std::fmt; -use std::marker::PhantomData; -use std::sync::{Arc, Condvar, Mutex}; -use std::sync::atomic::AtomicUsize; -use std::sync::atomic::Ordering::SeqCst; -use std::time::Duration; - -/// A thread parking primitive. -/// -/// Conceptually, each `Parker` has an associated token which is initially not present: -/// -/// * The [`park`] method blocks the current thread unless or until the token is available, at -/// which point it automatically consumes the token. It may also return *spuriously*, without -/// consuming the token. -/// -/// * The [`park_timeout`] method works the same as [`park`], but blocks for a specified maximum -/// time. -/// -/// * The [`unpark`] method atomically makes the token available if it wasn't already. Because the -/// token is initially absent, [`unpark`] followed by [`park`] will result in the second call -/// returning immediately. -/// -/// In other words, each `Parker` acts a bit like a spinlock that can be locked and unlocked using -/// [`park`] and [`unpark`]. -/// -/// # Examples -/// -/// ``` -/// use std::thread; -/// use std::time::Duration; -/// use crossbeam_utils::sync::Parker; -/// -/// let mut p = Parker::new(); -/// let u = p.unparker().clone(); -/// -/// // Make the token available. -/// u.unpark(); -/// // Wakes up immediately and consumes the token. -/// p.park(); -/// -/// thread::spawn(move || { -/// thread::sleep(Duration::from_millis(500)); -/// u.unpark(); -/// }); -/// -/// // Wakes up when `u.unpark()` provides the token, but may also wake up -/// // spuriously before that without consuming the token. -/// p.park(); -/// ``` -/// -/// [`park`]: struct.Parker.html#method.park -/// [`park_timeout`]: struct.Parker.html#method.park_timeout -/// [`unpark`]: struct.Unparker.html#method.unpark -pub struct Parker { - unparker: Unparker, - _marker: PhantomData<*const ()>, -} - -unsafe impl Send for Parker {} - -impl Parker { - /// Creates a new `Parker`. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::sync::Parker; - /// - /// let p = Parker::new(); - /// ``` - /// - pub fn new() -> Parker { - Parker { - unparker: Unparker { - inner: Arc::new(Inner { - state: AtomicUsize::new(EMPTY), - lock: Mutex::new(()), - cvar: Condvar::new(), - }), - }, - _marker: PhantomData, - } - } - - /// Blocks the current thread until the token is made available. - /// - /// A call to `park` may wake up spuriously without consuming the token, and callers should be - /// prepared for this possibility. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::sync::Parker; - /// - /// let mut p = Parker::new(); - /// let u = p.unparker().clone(); - /// - /// // Make the token available. - /// u.unpark(); - /// - /// // Wakes up immediately and consumes the token. - /// p.park(); - /// ``` - pub fn park(&self) { - self.unparker.inner.park(None); - } - - /// Blocks the current thread until the token is made available, but only for a limited time. - /// - /// A call to `park_timeout` may wake up spuriously without consuming the token, and callers - /// should be prepared for this possibility. - /// - /// # Examples - /// - /// ``` - /// use std::time::Duration; - /// use crossbeam_utils::sync::Parker; - /// - /// let mut p = Parker::new(); - /// - /// // Waits for the token to become available, but will not wait longer than 500 ms. - /// p.park_timeout(Duration::from_millis(500)); - /// ``` - pub fn park_timeout(&self, timeout: Duration) { - self.unparker.inner.park(Some(timeout)); - } - - /// Returns a reference to an associated [`Unparker`]. - /// - /// The returned [`Unparker`] doesn't have to be used by reference - it can also be cloned. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::sync::Parker; - /// - /// let mut p = Parker::new(); - /// let u = p.unparker().clone(); - /// - /// // Make the token available. - /// u.unpark(); - /// // Wakes up immediately and consumes the token. - /// p.park(); - /// ``` - /// - /// [`park`]: struct.Parker.html#method.park - /// [`park_timeout`]: struct.Parker.html#method.park_timeout - /// - /// [`Unparker`]: struct.Unparker.html - pub fn unparker(&self) -> &Unparker { - &self.unparker - } -} - -impl fmt::Debug for Parker { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.pad("Parker { .. }") - } -} - -/// Unparks a thread parked by the associated [`Parker`]. -/// -/// [`Parker`]: struct.Parker.html -pub struct Unparker { - inner: Arc, -} - -unsafe impl Send for Unparker {} -unsafe impl Sync for Unparker {} - -impl Unparker { - /// Atomically makes the token available if it is not already. - /// - /// This method will wake up the thread blocked on [`park`] or [`park_timeout`], if there is - /// any. - /// - /// # Examples - /// - /// ``` - /// use std::thread; - /// use std::time::Duration; - /// use crossbeam_utils::sync::Parker; - /// - /// let mut p = Parker::new(); - /// let u = p.unparker().clone(); - /// - /// thread::spawn(move || { - /// thread::sleep(Duration::from_millis(500)); - /// u.unpark(); - /// }); - /// - /// // Wakes up when `u.unpark()` provides the token, but may also wake up - /// // spuriously before that without consuming the token. - /// p.park(); - /// ``` - /// - /// [`park`]: struct.Parker.html#method.park - /// [`park_timeout`]: struct.Parker.html#method.park_timeout - pub fn unpark(&self) { - self.inner.unpark() - } -} - -impl fmt::Debug for Unparker { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.pad("Unparker { .. }") - } -} - -impl Clone for Unparker { - fn clone(&self) -> Unparker { - Unparker { - inner: self.inner.clone(), - } - } -} - -const EMPTY: usize = 0; -const PARKED: usize = 1; -const NOTIFIED: usize = 2; - -struct Inner { - state: AtomicUsize, - lock: Mutex<()>, - cvar: Condvar, -} - -impl Inner { - fn park(&self, timeout: Option) { - // If we were previously notified then we consume this notification and return quickly. - if self.state.compare_exchange(NOTIFIED, EMPTY, SeqCst, SeqCst).is_ok() { - return; - } - - // If the timeout is zero, then there is no need to actually block. - if let Some(ref dur) = timeout { - if *dur == Duration::from_millis(0) { - return; - } - } - - // Otherwise we need to coordinate going to sleep. - let mut m = self.lock.lock().unwrap(); - - match self.state.compare_exchange(EMPTY, PARKED, SeqCst, SeqCst) { - Ok(_) => {} - // Consume this notification to avoid spurious wakeups in the next park. - Err(NOTIFIED) => { - // We must read `state` here, even though we know it will be `NOTIFIED`. This is - // because `unpark` may have been called again since we read `NOTIFIED` in the - // `compare_exchange` above. We must perform an acquire operation that synchronizes - // with that `unpark` to observe any writes it made before the call to `unpark`. To - // do that we must read from the write it made to `state`. - let old = self.state.swap(EMPTY, SeqCst); - assert_eq!(old, NOTIFIED, "park state changed unexpectedly"); - return; - } - Err(n) => panic!("inconsistent park_timeout state: {}", n), - } - - match timeout { - None => { - loop { - // Block the current thread on the conditional variable. - m = self.cvar.wait(m).unwrap(); - - match self.state.compare_exchange(NOTIFIED, EMPTY, SeqCst, SeqCst) { - Ok(_) => return, // got a notification - Err(_) => {} // spurious wakeup, go back to sleep - } - } - } - Some(timeout) => { - // Wait with a timeout, and if we spuriously wake up or otherwise wake up from a - // notification we just want to unconditionally set `state` back to `EMPTY`, either - // consuming a notification or un-flagging ourselves as parked. - let (_m, _result) = self.cvar.wait_timeout(m, timeout).unwrap(); - - match self.state.swap(EMPTY, SeqCst) { - NOTIFIED => {} // got a notification - PARKED => {} // no notification - n => panic!("inconsistent park_timeout state: {}", n), - } - } - } - } - - pub fn unpark(&self) { - // To ensure the unparked thread will observe any writes we made before this call, we must - // perform a release operation that `park` can synchronize with. To do that we must write - // `NOTIFIED` even if `state` is already `NOTIFIED`. That is why this must be a swap rather - // than a compare-and-swap that returns if it reads `NOTIFIED` on failure. - match self.state.swap(NOTIFIED, SeqCst) { - EMPTY => return, // no one was waiting - NOTIFIED => return, // already unparked - PARKED => {} // gotta go wake someone up - _ => panic!("inconsistent state in unpark"), - } - - // There is a period between when the parked thread sets `state` to `PARKED` (or last - // checked `state` in the case of a spurious wakeup) and when it actually waits on `cvar`. - // If we were to notify during this period it would be ignored and then when the parked - // thread went to sleep it would never wake up. Fortunately, it has `lock` locked at this - // stage so we can acquire `lock` to wait until it is ready to receive the notification. - // - // Releasing `lock` before the call to `notify_one` means that when the parked thread wakes - // it doesn't get woken only to have to wait for us to release `lock`. - drop(self.lock.lock().unwrap()); - self.cvar.notify_one(); - } -} diff --git a/vendor/crossbeam-utils-0.6.6/src/sync/sharded_lock.rs b/vendor/crossbeam-utils-0.6.6/src/sync/sharded_lock.rs deleted file mode 100644 index 0fbb29175f..0000000000 --- a/vendor/crossbeam-utils-0.6.6/src/sync/sharded_lock.rs +++ /dev/null @@ -1,600 +0,0 @@ -use std::cell::UnsafeCell; -use std::collections::HashMap; -use std::fmt; -use std::marker::PhantomData; -use std::mem; -use std::ops::{Deref, DerefMut}; -use std::panic::{RefUnwindSafe, UnwindSafe}; -use std::sync::{Mutex, RwLock, RwLockReadGuard, RwLockWriteGuard}; -use std::sync::{LockResult, PoisonError, TryLockError, TryLockResult}; -use std::thread::{self, ThreadId}; - -use CachePadded; - -/// The number of shards per sharded lock. Must be a power of two. -const NUM_SHARDS: usize = 8; - -/// A shard containing a single reader-writer lock. -struct Shard { - /// The inner reader-writer lock. - lock: RwLock<()>, - - /// The write-guard keeping this shard locked. - /// - /// Write operations will lock each shard and store the guard here. These guards get dropped at - /// the same time the big guard is dropped. - write_guard: UnsafeCell>>, -} - -/// A sharded reader-writer lock. -/// -/// This lock is equivalent to [`RwLock`], except read operations are faster and write operations -/// are slower. -/// -/// A `ShardedLock` is internally made of a list of *shards*, each being a [`RwLock`] occupying a -/// single cache line. Read operations will pick one of the shards depending on the current thread -/// and lock it. Write operations need to lock all shards in succession. -/// -/// By splitting the lock into shards, concurrent read operations will in most cases choose -/// different shards and thus update different cache lines, which is good for scalability. However, -/// write operations need to do more work and are therefore slower than usual. -/// -/// The priority policy of the lock is dependent on the underlying operating system's -/// implementation, and this type does not guarantee that any particular policy will be used. -/// -/// # Poisoning -/// -/// A `ShardedLock`, like [`RwLock`], will become poisoned on a panic. Note that it may only be -/// poisoned if a panic occurs while a write operation is in progress. If a panic occurs in any -/// read operation, the lock will not be poisoned. -/// -/// # Examples -/// -/// ``` -/// use crossbeam_utils::sync::ShardedLock; -/// -/// let lock = ShardedLock::new(5); -/// -/// // Any number of read locks can be held at once. -/// { -/// let r1 = lock.read().unwrap(); -/// let r2 = lock.read().unwrap(); -/// assert_eq!(*r1, 5); -/// assert_eq!(*r2, 5); -/// } // Read locks are dropped at this point. -/// -/// // However, only one write lock may be held. -/// { -/// let mut w = lock.write().unwrap(); -/// *w += 1; -/// assert_eq!(*w, 6); -/// } // Write lock is dropped here. -/// ``` -/// -/// [`RwLock`]: https://doc.rust-lang.org/std/sync/struct.RwLock.html -pub struct ShardedLock { - /// A list of locks protecting the internal data. - shards: Box<[CachePadded]>, - - /// The internal data. - value: UnsafeCell, -} - -unsafe impl Send for ShardedLock {} -unsafe impl Sync for ShardedLock {} - -impl UnwindSafe for ShardedLock {} -impl RefUnwindSafe for ShardedLock {} - -impl ShardedLock { - /// Creates a new sharded reader-writer lock. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::sync::ShardedLock; - /// - /// let lock = ShardedLock::new(5); - /// ``` - pub fn new(value: T) -> ShardedLock { - ShardedLock { - shards: (0..NUM_SHARDS) - .map(|_| CachePadded::new(Shard { - lock: RwLock::new(()), - write_guard: UnsafeCell::new(None), - })) - .collect::>() - .into_boxed_slice(), - value: UnsafeCell::new(value), - } - } - - /// Consumes this lock, returning the underlying data. - /// - /// This method will return an error if the lock is poisoned. A lock gets poisoned when a write - /// operation panics. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::sync::ShardedLock; - /// - /// let lock = ShardedLock::new(String::new()); - /// { - /// let mut s = lock.write().unwrap(); - /// *s = "modified".to_owned(); - /// } - /// assert_eq!(lock.into_inner().unwrap(), "modified"); - /// ``` - pub fn into_inner(self) -> LockResult { - let is_poisoned = self.is_poisoned(); - let inner = self.value.into_inner(); - - if is_poisoned { - Err(PoisonError::new(inner)) - } else { - Ok(inner) - } - } -} - -impl ShardedLock { - /// Returns `true` if the lock is poisoned. - /// - /// If another thread can still access the lock, it may become poisoned at any time. A `false` - /// result should not be trusted without additional synchronization. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::sync::ShardedLock; - /// use std::sync::Arc; - /// use std::thread; - /// - /// let lock = Arc::new(ShardedLock::new(0)); - /// let c_lock = lock.clone(); - /// - /// let _ = thread::spawn(move || { - /// let _lock = c_lock.write().unwrap(); - /// panic!(); // the lock gets poisoned - /// }).join(); - /// assert_eq!(lock.is_poisoned(), true); - /// ``` - pub fn is_poisoned(&self) -> bool { - self.shards[0].lock.is_poisoned() - } - - /// Returns a mutable reference to the underlying data. - /// - /// Since this call borrows the lock mutably, no actual locking needs to take place. - /// - /// This method will return an error if the lock is poisoned. A lock gets poisoned when a write - /// operation panics. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::sync::ShardedLock; - /// - /// let mut lock = ShardedLock::new(0); - /// *lock.get_mut().unwrap() = 10; - /// assert_eq!(*lock.read().unwrap(), 10); - /// ``` - pub fn get_mut(&mut self) -> LockResult<&mut T> { - let is_poisoned = self.is_poisoned(); - let inner = unsafe { &mut *self.value.get() }; - - if is_poisoned { - Err(PoisonError::new(inner)) - } else { - Ok(inner) - } - } - - /// Attempts to acquire this lock with shared read access. - /// - /// If the access could not be granted at this time, an error is returned. Otherwise, a guard - /// is returned which will release the shared access when it is dropped. This method does not - /// provide any guarantees with respect to the ordering of whether contentious readers or - /// writers will acquire the lock first. - /// - /// This method will return an error if the lock is poisoned. A lock gets poisoned when a write - /// operation panics. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::sync::ShardedLock; - /// - /// let lock = ShardedLock::new(1); - /// - /// match lock.try_read() { - /// Ok(n) => assert_eq!(*n, 1), - /// Err(_) => unreachable!(), - /// }; - /// ``` - pub fn try_read(&self) -> TryLockResult> { - // Take the current thread index and map it to a shard index. Thread indices will tend to - // distribute shards among threads equally, thus reducing contention due to read-locking. - let current_index = current_index().unwrap_or(0); - let shard_index = current_index & (self.shards.len() - 1); - - match self.shards[shard_index].lock.try_read() { - Ok(guard) => Ok(ShardedLockReadGuard { - lock: self, - _guard: guard, - _marker: PhantomData, - }), - Err(TryLockError::Poisoned(err)) => { - let guard = ShardedLockReadGuard { - lock: self, - _guard: err.into_inner(), - _marker: PhantomData, - }; - Err(TryLockError::Poisoned(PoisonError::new(guard))) - }, - Err(TryLockError::WouldBlock) => Err(TryLockError::WouldBlock), - } - } - - /// Locks 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. This method - /// does not provide any guarantees with respect to the ordering of whether contentious readers - /// or writers will acquire the lock first. - /// - /// Returns a guard which will release the shared access when dropped. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::sync::ShardedLock; - /// use std::sync::Arc; - /// use std::thread; - /// - /// let lock = Arc::new(ShardedLock::new(1)); - /// let c_lock = lock.clone(); - /// - /// let n = lock.read().unwrap(); - /// assert_eq!(*n, 1); - /// - /// thread::spawn(move || { - /// let r = c_lock.read(); - /// assert!(r.is_ok()); - /// }).join().unwrap(); - /// ``` - pub fn read(&self) -> LockResult> { - // Take the current thread index and map it to a shard index. Thread indices will tend to - // distribute shards among threads equally, thus reducing contention due to read-locking. - let current_index = current_index().unwrap_or(0); - let shard_index = current_index & (self.shards.len() - 1); - - match self.shards[shard_index].lock.read() { - Ok(guard) => Ok(ShardedLockReadGuard { - lock: self, - _guard: guard, - _marker: PhantomData, - }), - Err(err) => Err(PoisonError::new(ShardedLockReadGuard { - lock: self, - _guard: err.into_inner(), - _marker: PhantomData, - })), - } - } - - /// Attempts to acquire this lock with exclusive write access. - /// - /// If the access could not be granted at this time, an error is returned. Otherwise, a guard - /// is returned which will release the exclusive access when it is dropped. This method does - /// not provide any guarantees with respect to the ordering of whether contentious readers or - /// writers will acquire the lock first. - /// - /// This method will return an error if the lock is poisoned. A lock gets poisoned when a write - /// operation panics. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::sync::ShardedLock; - /// - /// let lock = ShardedLock::new(1); - /// - /// let n = lock.read().unwrap(); - /// assert_eq!(*n, 1); - /// - /// assert!(lock.try_write().is_err()); - /// ``` - pub fn try_write(&self) -> TryLockResult> { - let mut poisoned = false; - let mut blocked = None; - - // Write-lock each shard in succession. - for (i, shard) in self.shards.iter().enumerate() { - let guard = match shard.lock.try_write() { - Ok(guard) => guard, - Err(TryLockError::Poisoned(err)) => { - poisoned = true; - err.into_inner() - }, - Err(TryLockError::WouldBlock) => { - blocked = Some(i); - break; - } - }; - - // Store the guard into the shard. - unsafe { - let guard: RwLockWriteGuard<'static, ()> = mem::transmute(guard); - let dest: *mut _ = shard.write_guard.get(); - *dest = Some(guard); - } - } - - if let Some(i) = blocked { - // Unlock the shards in reverse order of locking. - for shard in self.shards[0..i].iter().rev() { - unsafe { - let dest: *mut _ = shard.write_guard.get(); - let guard = mem::replace(&mut *dest, None); - drop(guard); - } - } - Err(TryLockError::WouldBlock) - } else if poisoned { - let guard = ShardedLockWriteGuard { - lock: self, - _marker: PhantomData, - }; - Err(TryLockError::Poisoned(PoisonError::new(guard))) - } else { - Ok(ShardedLockWriteGuard { - lock: self, - _marker: PhantomData, - }) - } - } - - /// Locks with exclusive write 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. This method - /// does not provide any guarantees with respect to the ordering of whether contentious readers - /// or writers will acquire the lock first. - /// - /// Returns a guard which will release the exclusive access when dropped. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::sync::ShardedLock; - /// - /// let lock = ShardedLock::new(1); - /// - /// let mut n = lock.write().unwrap(); - /// *n = 2; - /// - /// assert!(lock.try_read().is_err()); - /// ``` - pub fn write(&self) -> LockResult> { - let mut poisoned = false; - - // Write-lock each shard in succession. - for shard in self.shards.iter() { - let guard = match shard.lock.write() { - Ok(guard) => guard, - Err(err) => { - poisoned = true; - err.into_inner() - } - }; - - // Store the guard into the shard. - unsafe { - let guard: RwLockWriteGuard<'_, ()> = guard; - let guard: RwLockWriteGuard<'static, ()> = mem::transmute(guard); - let dest: *mut _ = shard.write_guard.get(); - *dest = Some(guard); - } - } - - if poisoned { - Err(PoisonError::new(ShardedLockWriteGuard { - lock: self, - _marker: PhantomData, - })) - } else { - Ok(ShardedLockWriteGuard { - lock: self, - _marker: PhantomData, - }) - } - } -} - -impl fmt::Debug for ShardedLock { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - match self.try_read() { - Ok(guard) => f.debug_struct("ShardedLock").field("data", &&*guard).finish(), - Err(TryLockError::Poisoned(err)) => { - f.debug_struct("ShardedLock").field("data", &&**err.get_ref()).finish() - }, - Err(TryLockError::WouldBlock) => { - struct LockedPlaceholder; - impl fmt::Debug for LockedPlaceholder { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.write_str("") - } - } - f.debug_struct("ShardedLock").field("data", &LockedPlaceholder).finish() - } - } - } -} - -impl Default for ShardedLock { - fn default() -> ShardedLock { - ShardedLock::new(Default::default()) - } -} - -impl From for ShardedLock { - fn from(t: T) -> Self { - ShardedLock::new(t) - } -} - -/// A guard used to release the shared read access of a [`ShardedLock`] when dropped. -/// -/// [`ShardedLock`]: struct.ShardedLock.html -pub struct ShardedLockReadGuard<'a, T: ?Sized + 'a> { - lock: &'a ShardedLock, - _guard: RwLockReadGuard<'a, ()>, - _marker: PhantomData>, -} - -unsafe impl<'a, T: ?Sized + Sync> Sync for ShardedLockReadGuard<'a, T> {} - -impl<'a, T: ?Sized> Deref for ShardedLockReadGuard<'a, T> { - type Target = T; - - fn deref(&self) -> &T { - unsafe { &*self.lock.value.get() } - } -} - -impl<'a, T: fmt::Debug> fmt::Debug for ShardedLockReadGuard<'a, T> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ShardedLockReadGuard") - .field("lock", &self.lock) - .finish() - } -} - -impl<'a, T: ?Sized + fmt::Display> fmt::Display for ShardedLockReadGuard<'a, T> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - (**self).fmt(f) - } -} - -/// A guard used to release the exclusive write access of a [`ShardedLock`] when dropped. -/// -/// [`ShardedLock`]: struct.ShardedLock.html -pub struct ShardedLockWriteGuard<'a, T: ?Sized + 'a> { - lock: &'a ShardedLock, - _marker: PhantomData>, -} - -unsafe impl<'a, T: ?Sized + Sync> Sync for ShardedLockWriteGuard<'a, T> {} - -impl<'a, T: ?Sized> Drop for ShardedLockWriteGuard<'a, T> { - fn drop(&mut self) { - // Unlock the shards in reverse order of locking. - for shard in self.lock.shards.iter().rev() { - unsafe { - let dest: *mut _ = shard.write_guard.get(); - let guard = mem::replace(&mut *dest, None); - drop(guard); - } - } - } -} - -impl<'a, T: fmt::Debug> fmt::Debug for ShardedLockWriteGuard<'a, T> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ShardedLockWriteGuard") - .field("lock", &self.lock) - .finish() - } -} - -impl<'a, T: ?Sized + fmt::Display> fmt::Display for ShardedLockWriteGuard<'a, T> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - (**self).fmt(f) - } -} - -impl<'a, T: ?Sized> Deref for ShardedLockWriteGuard<'a, T> { - type Target = T; - - fn deref(&self) -> &T { - unsafe { &*self.lock.value.get() } - } -} - -impl<'a, T: ?Sized> DerefMut for ShardedLockWriteGuard<'a, T> { - fn deref_mut(&mut self) -> &mut T { - unsafe { &mut *self.lock.value.get() } - } -} - -/// Returns a `usize` that identifies the current thread. -/// -/// Each thread is associated with an 'index'. While there are no particular guarantees, indices -/// usually tend to be consecutive numbers between 0 and the number of running threads. -/// -/// Since this function accesses TLS, `None` might be returned if the current thread's TLS is -/// tearing down. -#[inline] -fn current_index() -> Option { - REGISTRATION.try_with(|reg| reg.index).ok() -} - -/// The global registry keeping track of registered threads and indices. -struct ThreadIndices { - /// Mapping from `ThreadId` to thread index. - mapping: HashMap, - - /// A list of free indices. - free_list: Vec, - - /// The next index to allocate if the free list is empty. - next_index: usize, -} - -lazy_static! { - static ref THREAD_INDICES: Mutex = Mutex::new(ThreadIndices { - mapping: HashMap::new(), - free_list: Vec::new(), - next_index: 0, - }); -} - -/// A registration of a thread with an index. -/// -/// When dropped, unregisters the thread and frees the reserved index. -struct Registration { - index: usize, - thread_id: ThreadId, -} - -impl Drop for Registration { - fn drop(&mut self) { - let mut indices = THREAD_INDICES.lock().unwrap(); - indices.mapping.remove(&self.thread_id); - indices.free_list.push(self.index); - } -} - -thread_local! { - static REGISTRATION: Registration = { - let thread_id = thread::current().id(); - let mut indices = THREAD_INDICES.lock().unwrap(); - - let index = match indices.free_list.pop() { - Some(i) => i, - None => { - let i = indices.next_index; - indices.next_index += 1; - i - } - }; - indices.mapping.insert(thread_id, index); - - Registration { - index, - thread_id, - } - }; -} diff --git a/vendor/crossbeam-utils-0.6.6/src/sync/wait_group.rs b/vendor/crossbeam-utils-0.6.6/src/sync/wait_group.rs deleted file mode 100644 index 16ddc3091c..0000000000 --- a/vendor/crossbeam-utils-0.6.6/src/sync/wait_group.rs +++ /dev/null @@ -1,139 +0,0 @@ -use std::fmt; -use std::sync::{Arc, Condvar, Mutex}; - -/// Enables threads to synchronize the beginning or end of some computation. -/// -/// # Wait groups vs barriers -/// -/// `WaitGroup` is very similar to [`Barrier`], but there are a few differences: -/// -/// * `Barrier` needs to know the number of threads at construction, while `WaitGroup` is cloned to -/// register more threads. -/// -/// * A `Barrier` can be reused even after all threads have synchronized, while a `WaitGroup` -/// synchronizes threads only once. -/// -/// * All threads wait for others to reach the `Barrier`. With `WaitGroup`, each thread can choose -/// to either wait for other threads or to continue without blocking. -/// -/// # Examples -/// -/// ``` -/// use crossbeam_utils::sync::WaitGroup; -/// use std::thread; -/// -/// // Create a new wait group. -/// let wg = WaitGroup::new(); -/// -/// for _ in 0..4 { -/// // Create another reference to the wait group. -/// let wg = wg.clone(); -/// -/// thread::spawn(move || { -/// // Do some work. -/// -/// // Drop the reference to the wait group. -/// drop(wg); -/// }); -/// } -/// -/// // Block until all threads have finished their work. -/// wg.wait(); -/// ``` -/// -/// [`Barrier`]: https://doc.rust-lang.org/std/sync/struct.Barrier.html -pub struct WaitGroup { - inner: Arc, -} - -/// Inner state of a `WaitGroup`. -struct Inner { - cvar: Condvar, - count: Mutex, -} - -impl WaitGroup { - /// Creates a new wait group and returns the single reference to it. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::sync::WaitGroup; - /// - /// let wg = WaitGroup::new(); - /// ``` - pub fn new() -> WaitGroup { - WaitGroup { - inner: Arc::new(Inner { - cvar: Condvar::new(), - count: Mutex::new(1), - }), - } - } - - /// Drops this reference and waits until all other references are dropped. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::sync::WaitGroup; - /// use std::thread; - /// - /// let wg = WaitGroup::new(); - /// - /// thread::spawn({ - /// let wg = wg.clone(); - /// move || { - /// // Block until both threads have reached `wait()`. - /// wg.wait(); - /// } - /// }); - /// - /// // Block until both threads have reached `wait()`. - /// wg.wait(); - /// ``` - pub fn wait(self) { - if *self.inner.count.lock().unwrap() == 1 { - return; - } - - let inner = self.inner.clone(); - drop(self); - - let mut count = inner.count.lock().unwrap(); - while *count > 0 { - count = inner.cvar.wait(count).unwrap(); - } - } -} - -impl Drop for WaitGroup { - fn drop(&mut self) { - let mut count = self.inner.count.lock().unwrap(); - *count -= 1; - - if *count == 0 { - self.inner.cvar.notify_all(); - } - } -} - -impl Clone for WaitGroup { - fn clone(&self) -> WaitGroup { - let mut count = self.inner.count.lock().unwrap(); - *count += 1; - - WaitGroup { - inner: self.inner.clone(), - } - } -} - -impl fmt::Debug for WaitGroup { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let count: &usize = &*self.inner.count.lock().unwrap(); - f.debug_struct("WaitGroup") - .field("count", count) - .finish() - } -} diff --git a/vendor/crossbeam-utils-0.6.6/src/thread.rs b/vendor/crossbeam-utils-0.6.6/src/thread.rs deleted file mode 100644 index 2613fb7855..0000000000 --- a/vendor/crossbeam-utils-0.6.6/src/thread.rs +++ /dev/null @@ -1,529 +0,0 @@ -//! Threads that can borrow variables from the stack. -//! -//! Create a scope when spawned threads need to access variables on the stack: -//! -//! ``` -//! use crossbeam_utils::thread; -//! -//! let people = vec![ -//! "Alice".to_string(), -//! "Bob".to_string(), -//! "Carol".to_string(), -//! ]; -//! -//! thread::scope(|s| { -//! for person in &people { -//! s.spawn(move |_| { -//! println!("Hello, {}!", person); -//! }); -//! } -//! }).unwrap(); -//! ``` -//! -//! # Why scoped threads? -//! -//! Suppose we wanted to re-write the previous example using plain threads: -//! -//! ```ignore -//! use std::thread; -//! -//! let people = vec![ -//! "Alice".to_string(), -//! "Bob".to_string(), -//! "Carol".to_string(), -//! ]; -//! -//! let mut threads = Vec::new(); -//! -//! for person in &people { -//! threads.push(thread::spawn(move |_| { -//! println!("Hello, {}!", person); -//! })); -//! } -//! -//! for thread in threads { -//! thread.join().unwrap(); -//! } -//! ``` -//! -//! This doesn't work because the borrow checker complains about `people` not living long enough: -//! -//! ```text -//! error[E0597]: `people` does not live long enough -//! --> src/main.rs:12:20 -//! | -//! 12 | for person in &people { -//! | ^^^^^^ borrowed value does not live long enough -//! ... -//! 21 | } -//! | - borrowed value only lives until here -//! | -//! = note: borrowed value must be valid for the static lifetime... -//! ``` -//! -//! The problem here is that spawned threads are not allowed to borrow variables on stack because -//! the compiler cannot prove they will be joined before `people` is destroyed. -//! -//! Scoped threads are a mechanism to guarantee to the compiler that spawned threads will be joined -//! before the scope ends. -//! -//! # How scoped threads work -//! -//! If a variable is borrowed by a thread, the thread must complete before the variable is -//! destroyed. Threads spawned using [`std::thread::spawn`] can only borrow variables with the -//! `'static` lifetime because the borrow checker cannot be sure when the thread will complete. -//! -//! A scope creates a clear boundary between variables outside the scope and threads inside the -//! scope. Whenever a scope spawns a thread, it promises to join the thread before the scope ends. -//! This way we guarantee to the borrow checker that scoped threads only live within the scope and -//! can safely access variables outside it. -//! -//! # Nesting scoped threads -//! -//! Sometimes scoped threads need to spawn more threads within the same scope. This is a little -//! tricky because argument `s` lives *inside* the invocation of `thread::scope()` and as such -//! cannot be borrowed by scoped threads: -//! -//! ```ignore -//! use crossbeam_utils::thread; -//! -//! thread::scope(|s| { -//! s.spawn(|_| { -//! // Not going to compile because we're trying to borrow `s`, -//! // which lives *inside* the scope! :( -//! s.spawn(|_| println!("nested thread")); -//! }); -//! }); -//! ``` -//! -//! Fortunately, there is a solution. Every scoped thread is passed a reference to its scope as an -//! argument, which can be used for spawning nested threads: -//! -//! ``` -//! use crossbeam_utils::thread; -//! -//! thread::scope(|s| { -//! // Note the `|s|` here. -//! s.spawn(|s| { -//! // Yay, this works because we're using a fresh argument `s`! :) -//! s.spawn(|_| println!("nested thread")); -//! }); -//! }); -//! ``` -//! -//! [`std::thread::spawn`]: https://doc.rust-lang.org/std/thread/fn.spawn.html - -use std::fmt; -use std::io; -use std::marker::PhantomData; -use std::mem; -use std::panic; -use std::sync::{Arc, Mutex}; -use std::thread; - -use sync::WaitGroup; - -type SharedVec = Arc>>; -type SharedOption = Arc>>; - -/// Creates a new scope for spawning threads. -/// -/// All child threads that haven't been manually joined will be automatically joined just before -/// this function invocation ends. If all joined threads have successfully completed, `Ok` is -/// returned with the return value of `f`. If any of the joined threads has panicked, an `Err` is -/// returned containing errors from panicked threads. -/// -/// # Examples -/// -/// ``` -/// use crossbeam_utils::thread; -/// -/// let var = vec![1, 2, 3]; -/// -/// thread::scope(|s| { -/// s.spawn(|_| { -/// println!("A child thread borrowing `var`: {:?}", var); -/// }); -/// }).unwrap(); -/// ``` -pub fn scope<'env, F, R>(f: F) -> thread::Result -where - F: FnOnce(&Scope<'env>) -> R, -{ - let wg = WaitGroup::new(); - let scope = Scope::<'env> { - handles: SharedVec::default(), - wait_group: wg.clone(), - _marker: PhantomData, - }; - - // Execute the scoped function, but catch any panics. - let result = panic::catch_unwind(panic::AssertUnwindSafe(|| f(&scope))); - - // Wait until all nested scopes are dropped. - drop(scope.wait_group); - wg.wait(); - - // Join all remaining spawned threads. - let panics: Vec<_> = { - let mut handles = scope.handles.lock().unwrap(); - - // Filter handles that haven't been joined, join them, and collect errors. - let panics = handles - .drain(..) - .filter_map(|handle| handle.lock().unwrap().take()) - .filter_map(|handle| handle.join().err()) - .collect(); - - panics - }; - - // If `f` has panicked, resume unwinding. - // If any of the child threads have panicked, return the panic errors. - // Otherwise, everything is OK and return the result of `f`. - match result { - Err(err) => panic::resume_unwind(err), - Ok(res) => { - if panics.is_empty() { - Ok(res) - } else { - Err(Box::new(panics)) - } - } - } -} - -/// A scope for spawning threads. -pub struct Scope<'env> { - /// The list of the thread join handles. - handles: SharedVec>>, - - /// Used to wait until all subscopes all dropped. - wait_group: WaitGroup, - - /// Borrows data with invariant lifetime `'env`. - _marker: PhantomData<&'env mut &'env ()>, -} - -unsafe impl<'env> Sync for Scope<'env> {} - -impl<'env> Scope<'env> { - /// Spawns a scoped thread. - /// - /// This method is similar to the [`spawn`] function in Rust's standard library. The difference - /// is that this thread is scoped, meaning it's guaranteed to terminate before the scope exits, - /// allowing it to reference variables outside the scope. - /// - /// The scoped thread is passed a reference to this scope as an argument, which can be used for - /// spawning nested threads. - /// - /// The returned handle can be used to manually join the thread before the scope exits. - /// - /// [`spawn`]: https://doc.rust-lang.org/std/thread/fn.spawn.html - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::thread; - /// - /// thread::scope(|s| { - /// let handle = s.spawn(|_| { - /// println!("A child thread is running"); - /// 42 - /// }); - /// - /// // Join the thread and retrieve its result. - /// let res = handle.join().unwrap(); - /// assert_eq!(res, 42); - /// }).unwrap(); - /// ``` - pub fn spawn<'scope, F, T>(&'scope self, f: F) -> ScopedJoinHandle<'scope, T> - where - F: FnOnce(&Scope<'env>) -> T, - F: Send + 'env, - T: Send + 'env, - { - self.builder().spawn(f).unwrap() - } - - /// Creates a builder that can configure a thread before spawning. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::thread; - /// use std::thread::current; - /// - /// thread::scope(|s| { - /// s.builder() - /// .spawn(|_| println!("A child thread is running")) - /// .unwrap(); - /// }).unwrap(); - /// ``` - pub fn builder<'scope>(&'scope self) -> ScopedThreadBuilder<'scope, 'env> { - ScopedThreadBuilder { - scope: self, - builder: thread::Builder::new(), - } - } -} - -impl<'env> fmt::Debug for Scope<'env> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.pad("Scope { .. }") - } -} - -/// Configures the properties of a new thread. -/// -/// The two configurable properties are: -/// -/// - [`name`]: Specifies an [associated name for the thread][naming-threads]. -/// - [`stack_size`]: Specifies the [desired stack size for the thread][stack-size]. -/// -/// The [`spawn`] method will take ownership of the builder and return an [`io::Result`] of the -/// thread handle with the given configuration. -/// -/// The [`Scope::spawn`] method uses a builder with default configuration and unwraps its return -/// value. You may want to use this builder when you want to recover from a failure to launch a -/// thread. -/// -/// # Examples -/// -/// ``` -/// use crossbeam_utils::thread; -/// -/// thread::scope(|s| { -/// s.builder() -/// .spawn(|_| println!("Running a child thread")) -/// .unwrap(); -/// }).unwrap(); -/// ``` -/// -/// [`name`]: struct.ScopedThreadBuilder.html#method.name -/// [`stack_size`]: struct.ScopedThreadBuilder.html#method.stack_size -/// [`spawn`]: struct.ScopedThreadBuilder.html#method.spawn -/// [`Scope::spawn`]: struct.Scope.html#method.spawn -/// [`io::Result`]: https://doc.rust-lang.org/std/io/type.Result.html -/// [naming-threads]: https://doc.rust-lang.org/std/thread/index.html#naming-threads -/// [stack-size]: https://doc.rust-lang.org/std/thread/index.html#stack-size -#[derive(Debug)] -pub struct ScopedThreadBuilder<'scope, 'env: 'scope> { - scope: &'scope Scope<'env>, - builder: thread::Builder, -} - -impl<'scope, 'env> ScopedThreadBuilder<'scope, 'env> { - /// Sets the name for the new thread. - /// - /// The name must not contain null bytes. For more information about named threads, see - /// [here][naming-threads]. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::thread; - /// use std::thread::current; - /// - /// thread::scope(|s| { - /// s.builder() - /// .name("my thread".to_string()) - /// .spawn(|_| assert_eq!(current().name(), Some("my thread"))) - /// .unwrap(); - /// }).unwrap(); - /// ``` - /// - /// [naming-threads]: https://doc.rust-lang.org/std/thread/index.html#naming-threads - pub fn name(mut self, name: String) -> ScopedThreadBuilder<'scope, 'env> { - self.builder = self.builder.name(name); - self - } - - /// Sets the size of the stack for the new thread. - /// - /// The stack size is measured in bytes. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::thread; - /// - /// thread::scope(|s| { - /// s.builder() - /// .stack_size(32 * 1024) - /// .spawn(|_| println!("Running a child thread")) - /// .unwrap(); - /// }).unwrap(); - /// ``` - pub fn stack_size(mut self, size: usize) -> ScopedThreadBuilder<'scope, 'env> { - self.builder = self.builder.stack_size(size); - self - } - - /// Spawns a scoped thread with this configuration. - /// - /// The scoped thread is passed a reference to this scope as an argument, which can be used for - /// spawning nested threads. - /// - /// The returned handle can be used to manually join the thread before the scope exits. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::thread; - /// - /// thread::scope(|s| { - /// let handle = s.builder() - /// .spawn(|_| { - /// println!("A child thread is running"); - /// 42 - /// }) - /// .unwrap(); - /// - /// // Join the thread and retrieve its result. - /// let res = handle.join().unwrap(); - /// assert_eq!(res, 42); - /// }).unwrap(); - /// ``` - pub fn spawn(self, f: F) -> io::Result> - where - F: FnOnce(&Scope<'env>) -> T, - F: Send + 'env, - T: Send + 'env, - { - // The result of `f` will be stored here. - let result = SharedOption::default(); - - // Spawn the thread and grab its join handle and thread handle. - let (handle, thread) = { - let result = Arc::clone(&result); - - // A clone of the scope that will be moved into the new thread. - let scope = Scope::<'env> { - handles: Arc::clone(&self.scope.handles), - wait_group: self.scope.wait_group.clone(), - _marker: PhantomData, - }; - - // Spawn the thread. - let handle = { - let closure = move || { - // Make sure the scope is inside the closure with the proper `'env` lifetime. - let scope: Scope<'env> = scope; - - // Run the closure. - let res = f(&scope); - - // Store the result if the closure didn't panic. - *result.lock().unwrap() = Some(res); - }; - - // Change the type of `closure` from `FnOnce() -> T` to `FnMut() -> T`. - let mut closure = Some(closure); - let closure = move || closure.take().unwrap()(); - - // Allocate `clsoure` on the heap and erase the `'env` bound. - let closure: Box = Box::new(closure); - let closure: Box = unsafe { mem::transmute(closure) }; - - // Finally, spawn the closure. - let mut closure = closure; - self.builder.spawn(move || closure())? - }; - - let thread = handle.thread().clone(); - let handle = Arc::new(Mutex::new(Some(handle))); - (handle, thread) - }; - - // Add the handle to the shared list of join handles. - self.scope.handles.lock().unwrap().push(Arc::clone(&handle)); - - Ok(ScopedJoinHandle { - handle, - result, - thread, - _marker: PhantomData, - }) - } -} - -unsafe impl<'scope, T> Send for ScopedJoinHandle<'scope, T> {} -unsafe impl<'scope, T> Sync for ScopedJoinHandle<'scope, T> {} - -/// A handle that can be used to join its scoped thread. -pub struct ScopedJoinHandle<'scope, T> { - /// A join handle to the spawned thread. - handle: SharedOption>, - - /// Holds the result of the inner closure. - result: SharedOption, - - /// A handle to the the spawned thread. - thread: thread::Thread, - - /// Borrows the parent scope with lifetime `'scope`. - _marker: PhantomData<&'scope ()>, -} - -impl<'scope, T> ScopedJoinHandle<'scope, T> { - /// Waits for the thread to finish and returns its result. - /// - /// If the child thread panics, an error is returned. - /// - /// # Panics - /// - /// This function may panic on some platforms if a thread attempts to join itself or otherwise - /// may create a deadlock with joining threads. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::thread; - /// - /// thread::scope(|s| { - /// let handle1 = s.spawn(|_| println!("I'm a happy thread :)")); - /// let handle2 = s.spawn(|_| panic!("I'm a sad thread :(")); - /// - /// // Join the first thread and verify that it succeeded. - /// let res = handle1.join(); - /// assert!(res.is_ok()); - /// - /// // Join the second thread and verify that it panicked. - /// let res = handle2.join(); - /// assert!(res.is_err()); - /// }).unwrap(); - /// ``` - pub fn join(self) -> thread::Result { - // Take out the handle. The handle will surely be available because the root scope waits - // for nested scopes before joining remaining threads. - let handle = self.handle.lock().unwrap().take().unwrap(); - - // Join the thread and then take the result out of its inner closure. - handle - .join() - .map(|()| self.result.lock().unwrap().take().unwrap()) - } - - /// Returns a handle to the underlying thread. - /// - /// # Examples - /// - /// ``` - /// use crossbeam_utils::thread; - /// - /// thread::scope(|s| { - /// let handle = s.spawn(|_| println!("A child thread is running")); - /// println!("The child thread ID: {:?}", handle.thread().id()); - /// }).unwrap(); - /// ``` - pub fn thread(&self) -> &thread::Thread { - &self.thread - } -} - -impl<'scope, T> fmt::Debug for ScopedJoinHandle<'scope, T> { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.pad("ScopedJoinHandle { .. }") - } -} diff --git a/vendor/crossbeam-utils-0.6.6/tests/atomic_cell.rs b/vendor/crossbeam-utils-0.6.6/tests/atomic_cell.rs deleted file mode 100644 index 9406192333..0000000000 --- a/vendor/crossbeam-utils-0.6.6/tests/atomic_cell.rs +++ /dev/null @@ -1,225 +0,0 @@ -extern crate crossbeam_utils; - -use std::sync::atomic::AtomicUsize; -use std::sync::atomic::Ordering::SeqCst; - -use crossbeam_utils::atomic::AtomicCell; - -#[test] -fn is_lock_free() { - struct UsizeWrap(usize); - struct U8Wrap(bool); - - assert_eq!(AtomicCell::::is_lock_free(), true); - assert_eq!(AtomicCell::::is_lock_free(), true); - assert_eq!(AtomicCell::::is_lock_free(), true); - - assert_eq!(AtomicCell::::is_lock_free(), cfg!(feature = "nightly")); - assert_eq!( - AtomicCell::::is_lock_free(), - cfg!(feature = "nightly") - ); - assert_eq!( - AtomicCell::::is_lock_free(), - cfg!(feature = "nightly") - ); -} - -#[test] -fn drops_unit() { - static CNT: AtomicUsize = AtomicUsize::new(0); - CNT.store(0, SeqCst); - - #[derive(Debug, PartialEq, Eq)] - struct Foo(); - - impl Foo { - fn new() -> Foo { - CNT.fetch_add(1, SeqCst); - Foo() - } - } - - impl Drop for Foo { - fn drop(&mut self) { - CNT.fetch_sub(1, SeqCst); - } - } - - impl Default for Foo { - fn default() -> Foo { - Foo::new() - } - } - - let a = AtomicCell::new(Foo::new()); - - assert_eq!(a.swap(Foo::new()), Foo::new()); - assert_eq!(CNT.load(SeqCst), 1); - - a.store(Foo::new()); - assert_eq!(CNT.load(SeqCst), 1); - - assert_eq!(a.swap(Foo::default()), Foo::new()); - assert_eq!(CNT.load(SeqCst), 1); - - drop(a); - assert_eq!(CNT.load(SeqCst), 0); -} - -#[test] -fn drops_u8() { - static CNT: AtomicUsize = AtomicUsize::new(0); - CNT.store(0, SeqCst); - - #[derive(Debug, PartialEq, Eq)] - struct Foo(u8); - - impl Foo { - fn new(val: u8) -> Foo { - CNT.fetch_add(1, SeqCst); - Foo(val) - } - } - - impl Drop for Foo { - fn drop(&mut self) { - CNT.fetch_sub(1, SeqCst); - } - } - - impl Default for Foo { - fn default() -> Foo { - Foo::new(0) - } - } - - let a = AtomicCell::new(Foo::new(5)); - - assert_eq!(a.swap(Foo::new(6)), Foo::new(5)); - assert_eq!(a.swap(Foo::new(1)), Foo::new(6)); - assert_eq!(CNT.load(SeqCst), 1); - - a.store(Foo::new(2)); - assert_eq!(CNT.load(SeqCst), 1); - - assert_eq!(a.swap(Foo::default()), Foo::new(2)); - assert_eq!(CNT.load(SeqCst), 1); - - assert_eq!(a.swap(Foo::default()), Foo::new(0)); - assert_eq!(CNT.load(SeqCst), 1); - - drop(a); - assert_eq!(CNT.load(SeqCst), 0); -} - -#[test] -fn drops_usize() { - static CNT: AtomicUsize = AtomicUsize::new(0); - CNT.store(0, SeqCst); - - #[derive(Debug, PartialEq, Eq)] - struct Foo(usize); - - impl Foo { - fn new(val: usize) -> Foo { - CNT.fetch_add(1, SeqCst); - Foo(val) - } - } - - impl Drop for Foo { - fn drop(&mut self) { - CNT.fetch_sub(1, SeqCst); - } - } - - impl Default for Foo { - fn default() -> Foo { - Foo::new(0) - } - } - - let a = AtomicCell::new(Foo::new(5)); - - assert_eq!(a.swap(Foo::new(6)), Foo::new(5)); - assert_eq!(a.swap(Foo::new(1)), Foo::new(6)); - assert_eq!(CNT.load(SeqCst), 1); - - a.store(Foo::new(2)); - assert_eq!(CNT.load(SeqCst), 1); - - assert_eq!(a.swap(Foo::default()), Foo::new(2)); - assert_eq!(CNT.load(SeqCst), 1); - - assert_eq!(a.swap(Foo::default()), Foo::new(0)); - assert_eq!(CNT.load(SeqCst), 1); - - drop(a); - assert_eq!(CNT.load(SeqCst), 0); -} - -#[test] -fn modular_u8() { - #[derive(Clone, Copy, Eq, Debug, Default)] - struct Foo(u8); - - impl PartialEq for Foo { - fn eq(&self, other: &Foo) -> bool { - self.0 % 5 == other.0 % 5 - } - } - - let a = AtomicCell::new(Foo(1)); - - assert_eq!(a.load(), Foo(1)); - assert_eq!(a.swap(Foo(2)), Foo(11)); - assert_eq!(a.load(), Foo(52)); - - a.store(Foo(0)); - assert_eq!(a.compare_exchange(Foo(0), Foo(5)), Ok(Foo(100))); - assert_eq!(a.load().0, 5); - assert_eq!(a.compare_exchange(Foo(10), Foo(15)), Ok(Foo(100))); - assert_eq!(a.load().0, 15); -} - -#[test] -fn modular_usize() { - #[derive(Clone, Copy, Eq, Debug, Default)] - struct Foo(usize); - - impl PartialEq for Foo { - fn eq(&self, other: &Foo) -> bool { - self.0 % 5 == other.0 % 5 - } - } - - let a = AtomicCell::new(Foo(1)); - - assert_eq!(a.load(), Foo(1)); - assert_eq!(a.swap(Foo(2)), Foo(11)); - assert_eq!(a.load(), Foo(52)); - - a.store(Foo(0)); - assert_eq!(a.compare_exchange(Foo(0), Foo(5)), Ok(Foo(100))); - assert_eq!(a.load().0, 5); - assert_eq!(a.compare_exchange(Foo(10), Foo(15)), Ok(Foo(100))); - assert_eq!(a.load().0, 15); -} - -#[test] -fn garbage_padding() { - #[derive(Copy, Clone, Eq, PartialEq)] - struct Object { - a: i64, - b: i32, - } - - let cell = AtomicCell::new(Object { a: 0, b: 0 }); - let _garbage = [0xfe, 0xfe, 0xfe, 0xfe, 0xfe]; // Needed - let next = Object { a: 0, b: 0 }; - - let prev = cell.load(); - assert!(cell.compare_exchange(prev, next).is_ok()); - println!(); -} diff --git a/vendor/crossbeam-utils-0.6.6/tests/cache_padded.rs b/vendor/crossbeam-utils-0.6.6/tests/cache_padded.rs deleted file mode 100644 index 8ad7d40a4e..0000000000 --- a/vendor/crossbeam-utils-0.6.6/tests/cache_padded.rs +++ /dev/null @@ -1,112 +0,0 @@ -extern crate crossbeam_utils; - -use std::cell::Cell; -use std::mem; - -use crossbeam_utils::CachePadded; - -#[test] -fn default() { - let x: CachePadded = Default::default(); - assert_eq!(*x, 0); -} - -#[test] -fn store_u64() { - let x: CachePadded = CachePadded::new(17); - assert_eq!(*x, 17); -} - -#[test] -fn store_pair() { - let x: CachePadded<(u64, u64)> = CachePadded::new((17, 37)); - assert_eq!(x.0, 17); - assert_eq!(x.1, 37); -} - -#[test] -fn distance() { - let arr = [CachePadded::new(17u8), CachePadded::new(37u8)]; - let a = &*arr[0] as *const u8; - let b = &*arr[1] as *const u8; - assert!(unsafe { a.offset(64) } <= b); -} - -#[test] -fn different_sizes() { - CachePadded::new(17u8); - CachePadded::new(17u16); - CachePadded::new(17u32); - CachePadded::new([17u64; 0]); - CachePadded::new([17u64; 1]); - CachePadded::new([17u64; 2]); - CachePadded::new([17u64; 3]); - CachePadded::new([17u64; 4]); - CachePadded::new([17u64; 5]); - CachePadded::new([17u64; 6]); - CachePadded::new([17u64; 7]); - CachePadded::new([17u64; 8]); -} - -#[test] -fn large() { - let a = [17u64; 9]; - let b = CachePadded::new(a); - assert!(mem::size_of_val(&a) <= mem::size_of_val(&b)); -} - -#[test] -fn debug() { - assert_eq!( - format!("{:?}", CachePadded::new(17u64)), - "CachePadded { value: 17 }" - ); -} - -#[test] -fn drops() { - let count = Cell::new(0); - - struct Foo<'a>(&'a Cell); - - impl<'a> Drop for Foo<'a> { - fn drop(&mut self) { - self.0.set(self.0.get() + 1); - } - } - - let a = CachePadded::new(Foo(&count)); - let b = CachePadded::new(Foo(&count)); - - assert_eq!(count.get(), 0); - drop(a); - assert_eq!(count.get(), 1); - drop(b); - assert_eq!(count.get(), 2); -} - -#[test] -fn clone() { - let a = CachePadded::new(17); - let b = a.clone(); - assert_eq!(*a, *b); -} - -#[test] -fn runs_custom_clone() { - let count = Cell::new(0); - - struct Foo<'a>(&'a Cell); - - impl<'a> Clone for Foo<'a> { - fn clone(&self) -> Foo<'a> { - self.0.set(self.0.get() + 1); - Foo::<'a>(self.0) - } - } - - let a = CachePadded::new(Foo(&count)); - let _ = a.clone(); - - assert_eq!(count.get(), 1); -} diff --git a/vendor/crossbeam-utils-0.6.6/tests/parker.rs b/vendor/crossbeam-utils-0.6.6/tests/parker.rs deleted file mode 100644 index 3f4514626a..0000000000 --- a/vendor/crossbeam-utils-0.6.6/tests/parker.rs +++ /dev/null @@ -1,43 +0,0 @@ -extern crate crossbeam_utils; - -use std::thread::sleep; -use std::time::Duration; -use std::u32; - -use crossbeam_utils::sync::Parker; -use crossbeam_utils::thread; - -#[test] -fn park_timeout_unpark_before() { - let p = Parker::new(); - for _ in 0..10 { - p.unparker().unpark(); - p.park_timeout(Duration::from_millis(u32::MAX as u64)); - } -} - -#[test] -fn park_timeout_unpark_not_called() { - let p = Parker::new(); - for _ in 0..10 { - p.park_timeout(Duration::from_millis(10)); - } -} - -#[test] -fn park_timeout_unpark_called_other_thread() { - for _ in 0..10 { - let p = Parker::new(); - let u = p.unparker().clone(); - - thread::scope(|scope| { - scope.spawn(move |_| { - sleep(Duration::from_millis(50)); - u.unpark(); - }); - - p.park_timeout(Duration::from_millis(u32::MAX as u64)); - }) - .unwrap(); - } -} diff --git a/vendor/crossbeam-utils-0.6.6/tests/sharded_lock.rs b/vendor/crossbeam-utils-0.6.6/tests/sharded_lock.rs deleted file mode 100644 index c98de79998..0000000000 --- a/vendor/crossbeam-utils-0.6.6/tests/sharded_lock.rs +++ /dev/null @@ -1,255 +0,0 @@ -extern crate crossbeam_utils; -extern crate rand; - -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::sync::mpsc::channel; -use std::sync::{Arc, TryLockError}; -use std::thread; - -use crossbeam_utils::sync::ShardedLock; -use rand::Rng; - -#[derive(Eq, PartialEq, Debug)] -struct NonCopy(i32); - -#[test] -fn smoke() { - let l = ShardedLock::new(()); - drop(l.read().unwrap()); - drop(l.write().unwrap()); - drop((l.read().unwrap(), l.read().unwrap())); - drop(l.write().unwrap()); -} - -#[test] -fn frob() { - const N: u32 = 10; - const M: usize = 1000; - - let r = Arc::new(ShardedLock::new(())); - - let (tx, rx) = channel::<()>(); - for _ in 0..N { - let tx = tx.clone(); - let r = r.clone(); - thread::spawn(move || { - let mut rng = rand::thread_rng(); - for _ in 0..M { - if rng.gen_bool(1.0 / (N as f64)) { - drop(r.write().unwrap()); - } else { - drop(r.read().unwrap()); - } - } - drop(tx); - }); - } - drop(tx); - let _ = rx.recv(); -} - -#[test] -fn arc_poison_wr() { - let arc = Arc::new(ShardedLock::new(1)); - let arc2 = arc.clone(); - let _: Result<(), _> = thread::spawn(move || { - let _lock = arc2.write().unwrap(); - panic!(); - }) - .join(); - assert!(arc.read().is_err()); -} - -#[test] -fn arc_poison_ww() { - let arc = Arc::new(ShardedLock::new(1)); - assert!(!arc.is_poisoned()); - let arc2 = arc.clone(); - let _: Result<(), _> = thread::spawn(move || { - let _lock = arc2.write().unwrap(); - panic!(); - }) - .join(); - assert!(arc.write().is_err()); - assert!(arc.is_poisoned()); -} - -#[test] -fn arc_no_poison_rr() { - let arc = Arc::new(ShardedLock::new(1)); - let arc2 = arc.clone(); - let _: Result<(), _> = thread::spawn(move || { - let _lock = arc2.read().unwrap(); - panic!(); - }) - .join(); - let lock = arc.read().unwrap(); - assert_eq!(*lock, 1); -} -#[test] -fn arc_no_poison_sl() { - let arc = Arc::new(ShardedLock::new(1)); - let arc2 = arc.clone(); - let _: Result<(), _> = thread::spawn(move || { - let _lock = arc2.read().unwrap(); - panic!() - }) - .join(); - let lock = arc.write().unwrap(); - assert_eq!(*lock, 1); -} - -#[test] -fn arc() { - let arc = Arc::new(ShardedLock::new(0)); - let arc2 = arc.clone(); - let (tx, rx) = channel(); - - thread::spawn(move || { - let mut lock = arc2.write().unwrap(); - for _ in 0..10 { - let tmp = *lock; - *lock = -1; - thread::yield_now(); - *lock = tmp + 1; - } - tx.send(()).unwrap(); - }); - - // Readers try to catch the writer in the act - let mut children = Vec::new(); - for _ in 0..5 { - let arc3 = arc.clone(); - children.push(thread::spawn(move || { - let lock = arc3.read().unwrap(); - assert!(*lock >= 0); - })); - } - - // Wait for children to pass their asserts - for r in children { - assert!(r.join().is_ok()); - } - - // Wait for writer to finish - rx.recv().unwrap(); - let lock = arc.read().unwrap(); - assert_eq!(*lock, 10); -} - -#[test] -fn arc_access_in_unwind() { - let arc = Arc::new(ShardedLock::new(1)); - let arc2 = arc.clone(); - let _ = thread::spawn(move || -> () { - struct Unwinder { - i: Arc>, - } - impl Drop for Unwinder { - fn drop(&mut self) { - let mut lock = self.i.write().unwrap(); - *lock += 1; - } - } - let _u = Unwinder { i: arc2 }; - panic!(); - }) - .join(); - let lock = arc.read().unwrap(); - assert_eq!(*lock, 2); -} - -#[test] -fn unsized_type() { - let sl: &ShardedLock<[i32]> = &ShardedLock::new([1, 2, 3]); - { - let b = &mut *sl.write().unwrap(); - b[0] = 4; - b[2] = 5; - } - let comp: &[i32] = &[4, 2, 5]; - assert_eq!(&*sl.read().unwrap(), comp); -} - -#[test] -fn try_write() { - let lock = ShardedLock::new(0isize); - let read_guard = lock.read().unwrap(); - - let write_result = lock.try_write(); - match write_result { - Err(TryLockError::WouldBlock) => (), - Ok(_) => assert!( - false, - "try_write should not succeed while read_guard is in scope" - ), - Err(_) => assert!(false, "unexpected error"), - } - - drop(read_guard); -} - -#[test] -fn test_into_inner() { - let m = ShardedLock::new(NonCopy(10)); - assert_eq!(m.into_inner().unwrap(), NonCopy(10)); -} - -#[test] -fn test_into_inner_drop() { - struct Foo(Arc); - impl Drop for Foo { - fn drop(&mut self) { - self.0.fetch_add(1, Ordering::SeqCst); - } - } - let num_drops = Arc::new(AtomicUsize::new(0)); - let m = ShardedLock::new(Foo(num_drops.clone())); - assert_eq!(num_drops.load(Ordering::SeqCst), 0); - { - let _inner = m.into_inner().unwrap(); - assert_eq!(num_drops.load(Ordering::SeqCst), 0); - } - assert_eq!(num_drops.load(Ordering::SeqCst), 1); -} - -#[test] -fn test_into_inner_poison() { - let m = Arc::new(ShardedLock::new(NonCopy(10))); - let m2 = m.clone(); - let _ = thread::spawn(move || { - let _lock = m2.write().unwrap(); - panic!("test panic in inner thread to poison ShardedLock"); - }) - .join(); - - assert!(m.is_poisoned()); - match Arc::try_unwrap(m).unwrap().into_inner() { - Err(e) => assert_eq!(e.into_inner(), NonCopy(10)), - Ok(x) => panic!("into_inner of poisoned ShardedLock is Ok: {:?}", x), - } -} - -#[test] -fn test_get_mut() { - let mut m = ShardedLock::new(NonCopy(10)); - *m.get_mut().unwrap() = NonCopy(20); - assert_eq!(m.into_inner().unwrap(), NonCopy(20)); -} - -#[test] -fn test_get_mut_poison() { - let m = Arc::new(ShardedLock::new(NonCopy(10))); - let m2 = m.clone(); - let _ = thread::spawn(move || { - let _lock = m2.write().unwrap(); - panic!("test panic in inner thread to poison ShardedLock"); - }) - .join(); - - assert!(m.is_poisoned()); - match Arc::try_unwrap(m).unwrap().get_mut() { - Err(e) => assert_eq!(*e.into_inner(), NonCopy(10)), - Ok(x) => panic!("get_mut of poisoned ShardedLock is Ok: {:?}", x), - } -} diff --git a/vendor/crossbeam-utils-0.6.6/tests/thread.rs b/vendor/crossbeam-utils-0.6.6/tests/thread.rs deleted file mode 100644 index b691745e0b..0000000000 --- a/vendor/crossbeam-utils-0.6.6/tests/thread.rs +++ /dev/null @@ -1,181 +0,0 @@ -extern crate crossbeam_utils; - -use std::any::Any; -use std::sync::atomic::{AtomicUsize, Ordering}; -use std::thread::sleep; -use std::time::Duration; - -use crossbeam_utils::thread; - -const THREADS: usize = 10; -const SMALL_STACK_SIZE: usize = 20; - -#[test] -fn join() { - let counter = AtomicUsize::new(0); - thread::scope(|scope| { - let handle = scope.spawn(|_| { - counter.store(1, Ordering::Relaxed); - }); - assert!(handle.join().is_ok()); - - let panic_handle = scope.spawn(|_| { - panic!("\"My honey is running out!\", said Pooh."); - }); - assert!(panic_handle.join().is_err()); - }) - .unwrap(); - - // There should be sufficient synchronization. - assert_eq!(1, counter.load(Ordering::Relaxed)); -} - -#[test] -fn counter() { - let counter = AtomicUsize::new(0); - thread::scope(|scope| { - for _ in 0..THREADS { - scope.spawn(|_| { - counter.fetch_add(1, Ordering::Relaxed); - }); - } - }) - .unwrap(); - - assert_eq!(THREADS, counter.load(Ordering::Relaxed)); -} - -#[test] -fn counter_builder() { - let counter = AtomicUsize::new(0); - thread::scope(|scope| { - for i in 0..THREADS { - scope - .builder() - .name(format!("child-{}", i)) - .stack_size(SMALL_STACK_SIZE) - .spawn(|_| { - counter.fetch_add(1, Ordering::Relaxed); - }) - .unwrap(); - } - }) - .unwrap(); - - assert_eq!(THREADS, counter.load(Ordering::Relaxed)); -} - -#[test] -fn counter_panic() { - let counter = AtomicUsize::new(0); - let result = thread::scope(|scope| { - scope.spawn(|_| { - panic!("\"My honey is running out!\", said Pooh."); - }); - sleep(Duration::from_millis(100)); - - for _ in 0..THREADS { - scope.spawn(|_| { - counter.fetch_add(1, Ordering::Relaxed); - }); - } - }); - - assert_eq!(THREADS, counter.load(Ordering::Relaxed)); - assert!(result.is_err()); -} - -#[test] -fn panic_twice() { - let result = thread::scope(|scope| { - scope.spawn(|_| { - sleep(Duration::from_millis(500)); - panic!("thread #1"); - }); - scope.spawn(|_| { - panic!("thread #2"); - }); - }); - - let err = result.unwrap_err(); - let vec = err - .downcast_ref::>>() - .unwrap(); - assert_eq!(2, vec.len()); - - let first = vec[0].downcast_ref::<&str>().unwrap(); - let second = vec[1].downcast_ref::<&str>().unwrap(); - assert_eq!("thread #1", *first); - assert_eq!("thread #2", *second) -} - -#[test] -fn panic_many() { - let result = thread::scope(|scope| { - scope.spawn(|_| panic!("deliberate panic #1")); - scope.spawn(|_| panic!("deliberate panic #2")); - scope.spawn(|_| panic!("deliberate panic #3")); - }); - - let err = result.unwrap_err(); - let vec = err - .downcast_ref::>>() - .unwrap(); - assert_eq!(3, vec.len()); - - for panic in vec.iter() { - let panic = panic.downcast_ref::<&str>().unwrap(); - assert!( - *panic == "deliberate panic #1" - || *panic == "deliberate panic #2" - || *panic == "deliberate panic #3" - ); - } -} - -#[test] -fn nesting() { - let var = "foo".to_string(); - - struct Wrapper<'a> { - var: &'a String, - } - - impl<'a> Wrapper<'a> { - fn recurse(&'a self, scope: &thread::Scope<'a>, depth: usize) { - assert_eq!(self.var, "foo"); - - if depth > 0 { - scope.spawn(move |scope| { - self.recurse(scope, depth - 1); - }); - } - } - } - - let wrapper = Wrapper { var: &var }; - - thread::scope(|scope| { - scope.spawn(|scope| { - scope.spawn(|scope| { - wrapper.recurse(scope, 5); - }); - }); - }) - .unwrap(); -} - -#[test] -fn join_nested() { - thread::scope(|scope| { - scope.spawn(|scope| { - let handle = scope.spawn(|_| 7); - - sleep(Duration::from_millis(200)); - handle.join().unwrap(); - }); - - sleep(Duration::from_millis(100)); - }) - .unwrap(); -} diff --git a/vendor/crossbeam-utils-0.6.6/tests/wait_group.rs b/vendor/crossbeam-utils-0.6.6/tests/wait_group.rs deleted file mode 100644 index 1aa91997af..0000000000 --- a/vendor/crossbeam-utils-0.6.6/tests/wait_group.rs +++ /dev/null @@ -1,66 +0,0 @@ -extern crate crossbeam_utils; - -use std::sync::mpsc; -use std::thread; -use std::time::Duration; - -use crossbeam_utils::sync::WaitGroup; - -const THREADS: usize = 10; - -#[test] -fn wait() { - let wg = WaitGroup::new(); - let (tx, rx) = mpsc::channel(); - - for _ in 0..THREADS { - let wg = wg.clone(); - let tx = tx.clone(); - - thread::spawn(move || { - wg.wait(); - tx.send(()).unwrap(); - }); - } - - thread::sleep(Duration::from_millis(100)); - - // At this point, all spawned threads should be blocked, so we shouldn't get anything from the - // channel. - assert!(rx.try_recv().is_err()); - - wg.wait(); - - // Now, the wait group is cleared and we should receive messages. - for _ in 0..THREADS { - rx.recv().unwrap(); - } -} - -#[test] -fn wait_and_drop() { - let wg = WaitGroup::new(); - let (tx, rx) = mpsc::channel(); - - for _ in 0..THREADS { - let wg = wg.clone(); - let tx = tx.clone(); - - thread::spawn(move || { - thread::sleep(Duration::from_millis(100)); - tx.send(()).unwrap(); - drop(wg); - }); - } - - // At this point, all spawned threads should be sleeping, so we shouldn't get anything from the - // channel. - assert!(rx.try_recv().is_err()); - - wg.wait(); - - // Now, the wait group is cleared and we should receive messages. - for _ in 0..THREADS { - rx.try_recv().unwrap(); - } -} diff --git a/vendor/crossbeam-utils/.cargo-checksum.json b/vendor/crossbeam-utils/.cargo-checksum.json index 9a264617ee..d022333ef9 100644 --- a/vendor/crossbeam-utils/.cargo-checksum.json +++ b/vendor/crossbeam-utils/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"36557d1a612004b5108ed46be3716bb2e06368d5bb0cd9e7ea4b6bcc4d81c07a","Cargo.toml":"648a34c3609f0cb729929fd5c6d1288475232a4daeb79363e629ecadcc5d3a4f","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"5734ed989dfca1f625b40281ee9f4530f91b2411ec01cb748223e7eb87e201ab","README.md":"5bbcf23ea854d44870790a316dbcdb8d7b0c2e0f17a521e8d4fbffdd9dd5b464","benches/atomic_cell.rs":"de327015cf811fb74b7a624719f678ba0677025dc703d56cbd2094a3c92da23b","build.rs":"f927f9796b0cbae832f458e82833b24c7ced9f27f4f1e76de9d11ad30d21c88a","src/atomic/atomic_cell.rs":"4b86367084da93176c335650524220ef7b3df4df09b6535d0b55a03446dee7e0","src/atomic/consume.rs":"1ee5de160b6e3755c02940c24fa90f85f3ef2f7afb971e9e9c6f481609bbc7b7","src/atomic/mod.rs":"c84d068944388c1385d6fec9211b6be26c777a21fc04e7231d1f3b564de62708","src/atomic/seq_lock.rs":"ee50097cd582cfe6e28ebc54935fc6488f52e2fed19d4b26bafd5eab5c229291","src/atomic/seq_lock_wide.rs":"f03ee779c2ebebcfb0df8baac49be7d38e920876260c8da9dff0fc894068c35d","src/backoff.rs":"98d1daee75bbd6243bc0784c92c56086e57658baff93a2a1f0729426901c03ee","src/cache_padded.rs":"5671f3a02f6e407f1dc562d4fb17e4659f18d1e5206b8566b38d2e447e5f6fa4","src/lib.rs":"61c6bc2b43d87550c4547693f3eacfe126581560a8884b32b23f01a7e2c6d833","src/sync/mod.rs":"e5f4087c4e63b0e6e0b291f3946a224aa9d2a4a0c299c23014b822d6346f6986","src/sync/parker.rs":"6137fccce8c03045440cbc3166721e4e4b5f73013165c9c260cff904cfcab6f3","src/sync/sharded_lock.rs":"14be659744918d0b27db24c56b41c618b0f0484b6761da46561023d96c4c120f","src/sync/wait_group.rs":"932e11753764b238f764892978a6b70fb288111faf7fae7766e603bed4e5b444","src/thread.rs":"6c44bf4c4515a769b8ccd0c9d9b80f5b46bd4768ec323a909773301d375033fb","tests/atomic_cell.rs":"5efe71777d7687ee01e387d5ca20436c3e8171e1e879a63074d1f79ccc88ff5e","tests/cache_padded.rs":"6ba6ad1b3060bfb2f7bf0a1d006f949d91c49e506564b0d28e4f06129b94665d","tests/parker.rs":"a1f63cf99b3524bfc91d0797133d0b75165445ecbaa92f78bd8101fa7cc828ec","tests/sharded_lock.rs":"c7d9f7185900b3ff84d00f5252793d5d28c47374678b8e6f758a67fa32c71fca","tests/thread.rs":"9a7d7d3028c552fd834c68598b04a1cc252a816bc20ab62cec060d6cd09cab10","tests/wait_group.rs":"ad8f0cdfed31f9594a2e0737234d418f8b924d784a4db8d7e469deab8c95f5f8"},"package":"02d96d1e189ef58269ebe5b97953da3274d83a93af647c2ddd6f9dab28cedb8d"} \ No newline at end of file +{"files":{"CHANGELOG.md":"0eda77e259133b1ce0d9ed4089bc422ab942d5a9ef1413326d30a87bd0b06f0d","Cargo.toml":"200cdcf1e3579090f07c5e40ea81c92c38f49ea1e7de8e59d1aa77be534ae0d7","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"5734ed989dfca1f625b40281ee9f4530f91b2411ec01cb748223e7eb87e201ab","README.md":"345ae455556e8d9add2a255bacd051779103ab70edb81672b5e340b1e287e7f4","benches/atomic_cell.rs":"c927eb3cd1e5ecc4b91adbc3bde98af15ffab4086190792ba64d5cde0e24df3d","build.rs":"f927f9796b0cbae832f458e82833b24c7ced9f27f4f1e76de9d11ad30d21c88a","src/atomic/atomic_cell.rs":"a558620164f111454e431a2ddba054b2506a19c5775dd276be9d4530bf6c25e1","src/atomic/consume.rs":"e0db40dd4ce173eb0297e632518b669fecea70baa3810a976125f18f9d119ecf","src/atomic/mod.rs":"8448d19b3d4472be151c5bd8e0560101d90665f867c1d27907ee118c6151bb62","src/atomic/seq_lock.rs":"27182e6b87a9db73c5f6831759f8625f9fcdec3c2828204c444aef04f427735a","src/atomic/seq_lock_wide.rs":"9888dd03116bb89ca36d4ab8d5a0b5032107a2983a7eb8024454263b09080088","src/backoff.rs":"7cc7754e15f69b52e92a70d4f49d1bc274693455a0933a2d7eb0605806566af3","src/cache_padded.rs":"6a512698115ad0d5a5b163dbd7a83247e1f1c146c4a30f3fc74b952e3b767b59","src/lib.rs":"e55bfb4bf865342a35c657ea72d4f2123555b77d005ac770ef0db40489181af4","src/sync/mod.rs":"59986f559a8f170a4b3247ab2eea2460b09809d87c8110ed88e4e7103d3519dc","src/sync/parker.rs":"ba8f75bff31b8be9275808e8f393e71cc682dfc1109ceccb12f69a3700cff5be","src/sync/sharded_lock.rs":"14be659744918d0b27db24c56b41c618b0f0484b6761da46561023d96c4c120f","src/sync/wait_group.rs":"32e946a7581c55f8aa9904527b92b177c538fa0cf7cbcfa1d1f25990582cb6ea","src/thread.rs":"0eb5ec1d3c1b40600d88eb70539d14276e32307f5bed2b679f50f6a20777a01e","tests/atomic_cell.rs":"5efe71777d7687ee01e387d5ca20436c3e8171e1e879a63074d1f79ccc88ff5e","tests/cache_padded.rs":"1ac7095656f8010b68a16135841090209a6aeffdd988937d19d2dfd799e5e9c4","tests/parker.rs":"6def4721287d9d70b1cfd63ebb34e1c83fbb3376edbad2bc8aac6ef69dd99d20","tests/sharded_lock.rs":"56950ab68f9efb0d16ff28b30f5959d00c094880016685c375b4e1742dc4eb09","tests/thread.rs":"9a7d7d3028c552fd834c68598b04a1cc252a816bc20ab62cec060d6cd09cab10","tests/wait_group.rs":"ad8f0cdfed31f9594a2e0737234d418f8b924d784a4db8d7e469deab8c95f5f8"},"package":"e7e9d99fa91428effe99c5c6d4634cdeba32b8cf784fc428a2a687f61a952c49"} \ No newline at end of file diff --git a/vendor/crossbeam-utils/CHANGELOG.md b/vendor/crossbeam-utils/CHANGELOG.md index a17c6e6f15..c4a92bffbd 100644 --- a/vendor/crossbeam-utils/CHANGELOG.md +++ b/vendor/crossbeam-utils/CHANGELOG.md @@ -1,3 +1,14 @@ +# Version 0.8.3 + +- Make `loom` dependency optional. (#666) + +# Version 0.8.2 + +- Deprecate `AtomicCell::compare_and_swap`. Use `AtomicCell::compare_exchange` instead. (#619) +- Add `Parker::park_deadline`. (#563) +- Improve implementation of `CachePadded`. (#636) +- Add unstable support for `loom`. (#487) + # Version 0.8.1 - Make `AtomicCell::is_lock_free` always const fn. (#600) @@ -8,7 +19,7 @@ # Version 0.8.0 - Bump the minimum supported Rust version to 1.36. -- Remove deprecated `AtomicCell::get_mut()` and `Backoff::is_complete()` methods +- Remove deprecated `AtomicCell::get_mut()` and `Backoff::is_complete()` methods. - Remove `alloc` feature. - Make `CachePadded::new()` const function. - Make `AtomicCell::is_lock_free()` const function at 1.46+. diff --git a/vendor/crossbeam-utils/Cargo.toml b/vendor/crossbeam-utils/Cargo.toml index edb08f9998..a7d694c893 100644 --- a/vendor/crossbeam-utils/Cargo.toml +++ b/vendor/crossbeam-utils/Cargo.toml @@ -13,12 +13,11 @@ [package] edition = "2018" name = "crossbeam-utils" -version = "0.8.1" +version = "0.8.3" authors = ["The Crossbeam Project Developers"] description = "Utilities for concurrent programming" homepage = "https://github.com/crossbeam-rs/crossbeam/tree/master/crossbeam-utils" documentation = "https://docs.rs/crossbeam-utils" -readme = "README.md" keywords = ["scoped", "thread", "atomic", "cache"] categories = ["algorithms", "concurrency", "data-structures", "no-std"] license = "MIT OR Apache-2.0" @@ -30,7 +29,7 @@ version = "1" version = "1.4.0" optional = true [dev-dependencies.rand] -version = "0.7.3" +version = "0.8" [build-dependencies.autocfg] version = "1.0.0" @@ -38,3 +37,6 @@ version = "1.0.0" default = ["std"] nightly = [] std = ["lazy_static"] +[target."cfg(crossbeam_loom)".dependencies.loom] +version = "0.4" +optional = true diff --git a/vendor/crossbeam-utils/README.md b/vendor/crossbeam-utils/README.md index 7e95829874..fd0943bc87 100644 --- a/vendor/crossbeam-utils/README.md +++ b/vendor/crossbeam-utils/README.md @@ -2,7 +2,7 @@ [![Build Status](https://github.com/crossbeam-rs/crossbeam/workflows/CI/badge.svg)]( https://github.com/crossbeam-rs/crossbeam/actions) -[![License](https://img.shields.io/badge/license-MIT%20OR%20Apache--2.0-blue.svg)]( +[![License](https://img.shields.io/badge/license-MIT_OR_Apache--2.0-blue.svg)]( https://github.com/crossbeam-rs/crossbeam/tree/master/crossbeam-utils#license) [![Cargo](https://img.shields.io/crates/v/crossbeam-utils.svg)]( https://crates.io/crates/crossbeam-utils) diff --git a/vendor/crossbeam-utils/benches/atomic_cell.rs b/vendor/crossbeam-utils/benches/atomic_cell.rs index 938a8fe380..844f7c02b6 100644 --- a/vendor/crossbeam-utils/benches/atomic_cell.rs +++ b/vendor/crossbeam-utils/benches/atomic_cell.rs @@ -28,11 +28,11 @@ fn fetch_add_u8(b: &mut test::Bencher) { } #[bench] -fn compare_and_swap_u8(b: &mut test::Bencher) { +fn compare_exchange_u8(b: &mut test::Bencher) { let a = AtomicCell::new(0u8); let mut i = 0; b.iter(|| { - a.compare_and_swap(i, i.wrapping_add(1)); + let _ = a.compare_exchange(i, i.wrapping_add(1)); i = i.wrapping_add(1); }); } @@ -102,11 +102,11 @@ fn fetch_add_usize(b: &mut test::Bencher) { } #[bench] -fn compare_and_swap_usize(b: &mut test::Bencher) { +fn compare_exchange_usize(b: &mut test::Bencher) { let a = AtomicCell::new(0usize); let mut i = 0; b.iter(|| { - a.compare_and_swap(i, i.wrapping_add(1)); + let _ = a.compare_exchange(i, i.wrapping_add(1)); i = i.wrapping_add(1); }); } diff --git a/vendor/crossbeam-utils/src/atomic/atomic_cell.rs b/vendor/crossbeam-utils/src/atomic/atomic_cell.rs index e8f6804cfd..ad094b2774 100644 --- a/vendor/crossbeam-utils/src/atomic/atomic_cell.rs +++ b/vendor/crossbeam-utils/src/atomic/atomic_cell.rs @@ -2,15 +2,19 @@ #![allow(clippy::unit_arg)] #![allow(clippy::let_unit_value)] +use crate::primitive::sync::atomic::{self, AtomicBool}; use core::cell::UnsafeCell; use core::fmt; use core::mem; +use core::sync::atomic::Ordering; + +#[cfg(not(crossbeam_loom))] use core::ptr; -use core::sync::atomic::{self, AtomicBool, Ordering}; #[cfg(feature = "std")] use std::panic::{RefUnwindSafe, UnwindSafe}; +#[cfg(not(crossbeam_loom))] use super::seq_lock::SeqLock; /// A thread-safe mutable memory location. @@ -213,6 +217,7 @@ impl AtomicCell { /// # Examples /// /// ``` + /// # #![allow(deprecated)] /// use crossbeam_utils::atomic::AtomicCell; /// /// let a = AtomicCell::new(1); @@ -223,6 +228,8 @@ impl AtomicCell { /// assert_eq!(a.compare_and_swap(1, 2), 1); /// assert_eq!(a.load(), 2); /// ``` + // TODO: remove in the next major version. + #[deprecated(note = "Use `compare_exchange` instead")] pub fn compare_and_swap(&self, current: T, new: T) -> T { match self.compare_exchange(current, new) { Ok(v) => v, @@ -492,23 +499,23 @@ macro_rules! impl_arithmetic { #[cfg(has_atomic_u8)] impl_arithmetic!(u8, atomic::AtomicU8, "let a = AtomicCell::new(7u8);"); -#[cfg(has_atomic_u8)] +#[cfg(all(has_atomic_u8, not(crossbeam_loom)))] impl_arithmetic!(i8, atomic::AtomicI8, "let a = AtomicCell::new(7i8);"); #[cfg(has_atomic_u16)] impl_arithmetic!(u16, atomic::AtomicU16, "let a = AtomicCell::new(7u16);"); -#[cfg(has_atomic_u16)] +#[cfg(all(has_atomic_u16, not(crossbeam_loom)))] impl_arithmetic!(i16, atomic::AtomicI16, "let a = AtomicCell::new(7i16);"); #[cfg(has_atomic_u32)] impl_arithmetic!(u32, atomic::AtomicU32, "let a = AtomicCell::new(7u32);"); -#[cfg(has_atomic_u32)] +#[cfg(all(has_atomic_u32, not(crossbeam_loom)))] impl_arithmetic!(i32, atomic::AtomicI32, "let a = AtomicCell::new(7i32);"); #[cfg(has_atomic_u64)] impl_arithmetic!(u64, atomic::AtomicU64, "let a = AtomicCell::new(7u64);"); -#[cfg(has_atomic_u64)] +#[cfg(all(has_atomic_u64, not(crossbeam_loom)))] impl_arithmetic!(i64, atomic::AtomicI64, "let a = AtomicCell::new(7i64);"); -#[cfg(has_atomic_u128)] +#[cfg(all(has_atomic_u128, not(crossbeam_loom)))] impl_arithmetic!(u128, atomic::AtomicU128, "let a = AtomicCell::new(7u128);"); -#[cfg(has_atomic_u128)] +#[cfg(all(has_atomic_u128, not(crossbeam_loom)))] impl_arithmetic!(i128, atomic::AtomicI128, "let a = AtomicCell::new(7i128);"); impl_arithmetic!( @@ -516,6 +523,7 @@ impl_arithmetic!( atomic::AtomicUsize, "let a = AtomicCell::new(7usize);" ); +#[cfg(not(crossbeam_loom))] impl_arithmetic!( isize, atomic::AtomicIsize, @@ -624,6 +632,7 @@ const fn can_transmute() -> bool { /// scalability. #[inline] #[must_use] +#[cfg(not(crossbeam_loom))] fn lock(addr: usize) -> &'static SeqLock { // The number of locks is a prime number because we want to make sure `addr % LEN` gets // dispersed across all locks. @@ -769,6 +778,7 @@ impl AtomicUnit { #[inline] fn swap(&self, _val: (), _order: Ordering) {} + #[allow(clippy::unnecessary_wraps)] // This is intentional. #[inline] fn compare_exchange_weak( &self, @@ -810,6 +820,9 @@ macro_rules! atomic { #[cfg(has_atomic_u128)] atomic!(@check, $t, atomic::AtomicU128, $a, $atomic_op); + #[cfg(crossbeam_loom)] + unimplemented!("loom does not support non-atomic atomic ops"); + #[cfg(not(crossbeam_loom))] break $fallback_op; } }; diff --git a/vendor/crossbeam-utils/src/atomic/consume.rs b/vendor/crossbeam-utils/src/atomic/consume.rs index 584fc34c1a..0fbd93e9fe 100644 --- a/vendor/crossbeam-utils/src/atomic/consume.rs +++ b/vendor/crossbeam-utils/src/atomic/consume.rs @@ -1,5 +1,5 @@ #[cfg(any(target_arch = "arm", target_arch = "aarch64"))] -use core::sync::atomic::compiler_fence; +use crate::primitive::sync::atomic::compiler_fence; use core::sync::atomic::Ordering; /// Trait which allows reading from primitive atomic types with "consume" ordering. @@ -53,11 +53,17 @@ macro_rules! impl_atomic { type Val = $val; impl_consume!(); } + #[cfg(crossbeam_loom)] + impl AtomicConsume for ::loom::sync::atomic::$atomic { + type Val = $val; + impl_consume!(); + } }; } impl_atomic!(AtomicBool, bool); impl_atomic!(AtomicUsize, usize); +#[cfg(not(crossbeam_loom))] impl_atomic!(AtomicIsize, isize); #[cfg(has_atomic_u8)] impl_atomic!(AtomicU8, u8); @@ -80,3 +86,9 @@ impl AtomicConsume for ::core::sync::atomic::AtomicPtr { type Val = *mut T; impl_consume!(); } + +#[cfg(crossbeam_loom)] +impl AtomicConsume for ::loom::sync::atomic::AtomicPtr { + type Val = *mut T; + impl_consume!(); +} diff --git a/vendor/crossbeam-utils/src/atomic/mod.rs b/vendor/crossbeam-utils/src/atomic/mod.rs index 7309c166d2..874eaf216a 100644 --- a/vendor/crossbeam-utils/src/atomic/mod.rs +++ b/vendor/crossbeam-utils/src/atomic/mod.rs @@ -1,7 +1,12 @@ //! Atomic types. +//! +//! * [`AtomicCell`], a thread-safe mutable memory location. +//! * [`AtomicConsume`], for reading from primitive atomic types with "consume" ordering. +#[cfg(not(crossbeam_loom))] use cfg_if::cfg_if; +#[cfg(not(crossbeam_loom))] cfg_if! { // Use "wide" sequence lock if the pointer width <= 32 for preventing its counter against wrap // around. diff --git a/vendor/crossbeam-utils/src/atomic/seq_lock.rs b/vendor/crossbeam-utils/src/atomic/seq_lock.rs index a423bc0320..ff8defd26d 100644 --- a/vendor/crossbeam-utils/src/atomic/seq_lock.rs +++ b/vendor/crossbeam-utils/src/atomic/seq_lock.rs @@ -4,7 +4,7 @@ use core::sync::atomic::{self, AtomicUsize, Ordering}; use crate::Backoff; /// A simple stamped lock. -pub struct SeqLock { +pub(crate) struct SeqLock { /// The current state of the lock. /// /// All bits except the least significant one hold the current stamp. When locked, the state @@ -13,7 +13,7 @@ pub struct SeqLock { } impl SeqLock { - pub const fn new() -> Self { + pub(crate) const fn new() -> Self { Self { state: AtomicUsize::new(0), } @@ -23,7 +23,7 @@ impl SeqLock { /// /// This method should be called before optimistic reads. #[inline] - pub fn optimistic_read(&self) -> Option { + pub(crate) fn optimistic_read(&self) -> Option { let state = self.state.load(Ordering::Acquire); if state == 1 { None @@ -37,14 +37,14 @@ impl SeqLock { /// This method should be called after optimistic reads to check whether they are valid. The /// argument `stamp` should correspond to the one returned by method `optimistic_read`. #[inline] - pub fn validate_read(&self, stamp: usize) -> bool { + pub(crate) fn validate_read(&self, stamp: usize) -> bool { atomic::fence(Ordering::Acquire); self.state.load(Ordering::Relaxed) == stamp } /// Grabs the lock for writing. #[inline] - pub fn write(&'static self) -> SeqLockWriteGuard { + pub(crate) fn write(&'static self) -> SeqLockWriteGuard { let backoff = Backoff::new(); loop { let previous = self.state.swap(1, Ordering::Acquire); @@ -64,7 +64,7 @@ impl SeqLock { } /// An RAII guard that releases the lock and increments the stamp when dropped. -pub struct SeqLockWriteGuard { +pub(crate) struct SeqLockWriteGuard { /// The parent lock. lock: &'static SeqLock, @@ -75,7 +75,7 @@ pub struct SeqLockWriteGuard { impl SeqLockWriteGuard { /// Releases the lock without incrementing the stamp. #[inline] - pub fn abort(self) { + pub(crate) fn abort(self) { self.lock.state.store(self.state, Ordering::Release); // We specifically don't want to call drop(), since that's diff --git a/vendor/crossbeam-utils/src/atomic/seq_lock_wide.rs b/vendor/crossbeam-utils/src/atomic/seq_lock_wide.rs index 871a93d28b..ef5d94a454 100644 --- a/vendor/crossbeam-utils/src/atomic/seq_lock_wide.rs +++ b/vendor/crossbeam-utils/src/atomic/seq_lock_wide.rs @@ -7,7 +7,7 @@ use crate::Backoff; /// /// The state is represented as two `AtomicUsize`: `state_hi` for high bits and `state_lo` for low /// bits. -pub struct SeqLock { +pub(crate) struct SeqLock { /// The high bits of the current state of the lock. state_hi: AtomicUsize, @@ -19,7 +19,7 @@ pub struct SeqLock { } impl SeqLock { - pub const fn new() -> Self { + pub(crate) const fn new() -> Self { Self { state_hi: AtomicUsize::new(0), state_lo: AtomicUsize::new(0), @@ -30,7 +30,7 @@ impl SeqLock { /// /// This method should be called before optimistic reads. #[inline] - pub fn optimistic_read(&self) -> Option<(usize, usize)> { + pub(crate) fn optimistic_read(&self) -> Option<(usize, usize)> { // The acquire loads from `state_hi` and `state_lo` synchronize with the release stores in // `SeqLockWriteGuard::drop`. // @@ -51,7 +51,7 @@ impl SeqLock { /// This method should be called after optimistic reads to check whether they are valid. The /// argument `stamp` should correspond to the one returned by method `optimistic_read`. #[inline] - pub fn validate_read(&self, stamp: (usize, usize)) -> bool { + pub(crate) fn validate_read(&self, stamp: (usize, usize)) -> bool { // Thanks to the fence, if we're noticing any modification to the data at the critical // section of `(a, b)`, then the critical section's write of 1 to state_lo should be // visible. @@ -76,7 +76,7 @@ impl SeqLock { /// Grabs the lock for writing. #[inline] - pub fn write(&'static self) -> SeqLockWriteGuard { + pub(crate) fn write(&'static self) -> SeqLockWriteGuard { let backoff = Backoff::new(); loop { let previous = self.state_lo.swap(1, Ordering::Acquire); @@ -98,7 +98,7 @@ impl SeqLock { } /// An RAII guard that releases the lock and increments the stamp when dropped. -pub struct SeqLockWriteGuard { +pub(crate) struct SeqLockWriteGuard { /// The parent lock. lock: &'static SeqLock, @@ -109,7 +109,7 @@ pub struct SeqLockWriteGuard { impl SeqLockWriteGuard { /// Releases the lock without incrementing the stamp. #[inline] - pub fn abort(self) { + pub(crate) fn abort(self) { self.lock.state_lo.store(self.state_lo, Ordering::Release); mem::forget(self); } diff --git a/vendor/crossbeam-utils/src/backoff.rs b/vendor/crossbeam-utils/src/backoff.rs index 2391dd1cea..1012f06b23 100644 --- a/vendor/crossbeam-utils/src/backoff.rs +++ b/vendor/crossbeam-utils/src/backoff.rs @@ -1,6 +1,6 @@ +use crate::primitive::sync::atomic; use core::cell::Cell; use core::fmt; -use core::sync::atomic; const SPIN_LIMIT: u32 = 6; const YIELD_LIMIT: u32 = 10; @@ -27,7 +27,7 @@ const YIELD_LIMIT: u32 = 10; /// let backoff = Backoff::new(); /// loop { /// let val = a.load(SeqCst); -/// if a.compare_and_swap(val, val.wrapping_mul(b), SeqCst) == val { +/// if a.compare_exchange(val, val.wrapping_mul(b), SeqCst, SeqCst).is_ok() { /// return val; /// } /// backoff.spin(); @@ -131,7 +131,7 @@ impl Backoff { /// let backoff = Backoff::new(); /// loop { /// let val = a.load(SeqCst); - /// if a.compare_and_swap(val, val.wrapping_mul(b), SeqCst) == val { + /// if a.compare_exchange(val, val.wrapping_mul(b), SeqCst, SeqCst).is_ok() { /// return val; /// } /// backoff.spin(); @@ -145,6 +145,9 @@ impl Backoff { #[inline] pub fn spin(&self) { for _ in 0..1 << self.step.get().min(SPIN_LIMIT) { + // TODO(taiki-e): once we bump the minimum required Rust version to 1.49+, + // use [`core::hint::spin_loop`] instead. + #[allow(deprecated)] atomic::spin_loop_hint(); } @@ -205,11 +208,17 @@ impl Backoff { pub fn snooze(&self) { if self.step.get() <= SPIN_LIMIT { for _ in 0..1 << self.step.get() { + // TODO(taiki-e): once we bump the minimum required Rust version to 1.49+, + // use [`core::hint::spin_loop`] instead. + #[allow(deprecated)] atomic::spin_loop_hint(); } } else { #[cfg(not(feature = "std"))] for _ in 0..1 << self.step.get() { + // TODO(taiki-e): once we bump the minimum required Rust version to 1.49+, + // use [`core::hint::spin_loop`] instead. + #[allow(deprecated)] atomic::spin_loop_hint(); } diff --git a/vendor/crossbeam-utils/src/cache_padded.rs b/vendor/crossbeam-utils/src/cache_padded.rs index 62c686b7e3..822e831d16 100644 --- a/vendor/crossbeam-utils/src/cache_padded.rs +++ b/vendor/crossbeam-utils/src/cache_padded.rs @@ -13,7 +13,9 @@ use core::ops::{Deref, DerefMut}; /// /// Cache lines are assumed to be N bytes long, depending on the architecture: /// -/// * On x86-64 and aarch64, N = 128. +/// * On x86-64, aarch64, and powerpc64, N = 128. +/// * On arm, mips, mips64, and riscv64, N = 32. +/// * On s390x, N = 256. /// * On all others, N = 64. /// /// Note that N is just a reasonable guess and is not guaranteed to match the actual cache line @@ -64,13 +66,63 @@ use core::ops::{Deref, DerefMut}; // - https://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf // - https://github.com/facebook/folly/blob/1b5288e6eea6df074758f877c849b6e73bbb9fbb/folly/lang/Align.h#L107 // -// ARM's big.LITTLE architecture has asymmetric cores and "big" cores have 128 byte cache line size +// ARM's big.LITTLE architecture has asymmetric cores and "big" cores have 128-byte cache line size. +// // Sources: // - https://www.mono-project.com/news/2016/09/12/arm64-icache/ // -#[cfg_attr(any(target_arch = "x86_64", target_arch = "aarch64"), repr(align(128)))] +// powerpc64 has 128-byte cache line size. +// +// Sources: +// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_ppc64x.go#L9 +#[cfg_attr( + any( + target_arch = "x86_64", + target_arch = "aarch64", + target_arch = "powerpc64", + ), + repr(align(128)) +)] +// arm, mips, mips64, and riscv64 have 32-byte cache line size. +// +// Sources: +// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_arm.go#L7 +// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mips.go#L7 +// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mipsle.go#L7 +// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_mips64x.go#L9 +// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_riscv64.go#L7 +#[cfg_attr( + any( + target_arch = "arm", + target_arch = "mips", + target_arch = "mips64", + target_arch = "riscv64", + ), + repr(align(32)) +)] +// s390x has 256-byte cache line size. +// +// Sources: +// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_s390x.go#L7 +#[cfg_attr(target_arch = "s390x", repr(align(256)))] +// x86 and wasm have 64-byte cache line size. +// +// Sources: +// - https://github.com/golang/go/blob/dda2991c2ea0c5914714469c4defc2562a907230/src/internal/cpu/cpu_x86.go#L9 +// - https://github.com/golang/go/blob/3dd58676054223962cd915bb0934d1f9f489d4d2/src/internal/cpu/cpu_wasm.go#L7 +// +// All others are assumed to have 64-byte cache line size. #[cfg_attr( - not(any(target_arch = "x86_64", target_arch = "aarch64")), + not(any( + target_arch = "x86_64", + target_arch = "aarch64", + target_arch = "powerpc64", + target_arch = "arm", + target_arch = "mips", + target_arch = "mips64", + target_arch = "riscv64", + target_arch = "s390x", + )), repr(align(64)) )] pub struct CachePadded { diff --git a/vendor/crossbeam-utils/src/lib.rs b/vendor/crossbeam-utils/src/lib.rs index f2bd460b9d..880d37ec6f 100644 --- a/vendor/crossbeam-utils/src/lib.rs +++ b/vendor/crossbeam-utils/src/lib.rs @@ -31,11 +31,68 @@ allow(dead_code, unused_assignments, unused_variables) ) ))] -#![warn(missing_docs, missing_debug_implementations, rust_2018_idioms)] +#![warn( + missing_docs, + missing_debug_implementations, + rust_2018_idioms, + unreachable_pub +)] #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(feature = "nightly", feature(cfg_target_has_atomic))] -// matches! requires Rust 1.42 -#![allow(clippy::match_like_matches_macro)] + +#[cfg(crossbeam_loom)] +#[allow(unused_imports)] +mod primitive { + pub(crate) mod sync { + pub(crate) mod atomic { + pub(crate) use loom::sync::atomic::spin_loop_hint; + pub(crate) use loom::sync::atomic::{ + AtomicBool, AtomicU16, AtomicU32, AtomicU64, AtomicU8, AtomicUsize, + }; + + // FIXME: loom does not support compiler_fence at the moment. + // https://github.com/tokio-rs/loom/issues/117 + // we use fence as a stand-in for compiler_fence for the time being. + // this may miss some races since fence is stronger than compiler_fence, + // but it's the best we can do for the time being. + pub(crate) use loom::sync::atomic::fence as compiler_fence; + } + pub(crate) use loom::sync::{Arc, Condvar, Mutex}; + } +} +#[cfg(not(crossbeam_loom))] +#[allow(unused_imports)] +mod primitive { + pub(crate) mod sync { + pub(crate) mod atomic { + pub(crate) use core::sync::atomic::compiler_fence; + // TODO(taiki-e): once we bump the minimum required Rust version to 1.49+, + // use [`core::hint::spin_loop`] instead. + #[allow(deprecated)] + pub(crate) use core::sync::atomic::spin_loop_hint; + pub(crate) use core::sync::atomic::{AtomicBool, AtomicIsize, AtomicUsize}; + #[cfg(has_atomic_u16)] + pub(crate) use core::sync::atomic::{AtomicI16, AtomicU16}; + #[cfg(has_atomic_u32)] + pub(crate) use core::sync::atomic::{AtomicI32, AtomicU32}; + #[cfg(has_atomic_u64)] + pub(crate) use core::sync::atomic::{AtomicI64, AtomicU64}; + #[cfg(has_atomic_u8)] + pub(crate) use core::sync::atomic::{AtomicI8, AtomicU8}; + } + + #[cfg(feature = "std")] + pub(crate) use std::sync::{Arc, Condvar, Mutex}; + } +} + +cfg_if! { + if #[cfg(feature = "alloc")] { + extern crate alloc; + } else if #[cfg(feature = "std")] { + extern crate std as alloc; + } +} #[cfg_attr(feature = "nightly", cfg(target_has_atomic = "ptr"))] pub mod atomic; @@ -51,6 +108,8 @@ use cfg_if::cfg_if; cfg_if! { if #[cfg(feature = "std")] { pub mod sync; + + #[cfg(not(crossbeam_loom))] pub mod thread; } } diff --git a/vendor/crossbeam-utils/src/sync/mod.rs b/vendor/crossbeam-utils/src/sync/mod.rs index fd400d70e7..eeb740c2cd 100644 --- a/vendor/crossbeam-utils/src/sync/mod.rs +++ b/vendor/crossbeam-utils/src/sync/mod.rs @@ -5,9 +5,11 @@ //! * [`WaitGroup`], for synchronizing the beginning or end of some computation. mod parker; +#[cfg(not(crossbeam_loom))] mod sharded_lock; mod wait_group; pub use self::parker::{Parker, Unparker}; +#[cfg(not(crossbeam_loom))] pub use self::sharded_lock::{ShardedLock, ShardedLockReadGuard, ShardedLockWriteGuard}; pub use self::wait_group::WaitGroup; diff --git a/vendor/crossbeam-utils/src/sync/parker.rs b/vendor/crossbeam-utils/src/sync/parker.rs index fc13d2e967..aefa515273 100644 --- a/vendor/crossbeam-utils/src/sync/parker.rs +++ b/vendor/crossbeam-utils/src/sync/parker.rs @@ -1,20 +1,19 @@ +use crate::primitive::sync::atomic::AtomicUsize; +use crate::primitive::sync::{Arc, Condvar, Mutex}; +use core::sync::atomic::Ordering::SeqCst; use std::fmt; use std::marker::PhantomData; -use std::sync::atomic::AtomicUsize; -use std::sync::atomic::Ordering::SeqCst; -use std::sync::{Arc, Condvar, Mutex}; -use std::time::Duration; +use std::time::{Duration, Instant}; /// A thread parking primitive. /// /// Conceptually, each `Parker` has an associated token which is initially not present: /// /// * The [`park`] method blocks the current thread unless or until the token is available, at -/// which point it automatically consumes the token. It may also return *spuriously*, without -/// consuming the token. +/// which point it automatically consumes the token. /// -/// * The [`park_timeout`] method works the same as [`park`], but blocks for a specified maximum -/// time. +/// * The [`park_timeout`] and [`park_deadline`] methods work the same as [`park`], but block for +/// a specified maximum time. /// /// * The [`unpark`] method atomically makes the token available if it wasn't already. Because the /// token is initially absent, [`unpark`] followed by [`park`] will result in the second call @@ -43,13 +42,13 @@ use std::time::Duration; /// u.unpark(); /// }); /// -/// // Wakes up when `u.unpark()` provides the token, but may also wake up -/// // spuriously before that without consuming the token. +/// // Wakes up when `u.unpark()` provides the token. /// p.park(); /// ``` /// /// [`park`]: Parker::park /// [`park_timeout`]: Parker::park_timeout +/// [`park_deadline`]: Parker::park_deadline /// [`unpark`]: Unparker::unpark pub struct Parker { unparker: Unparker, @@ -90,9 +89,6 @@ impl Parker { /// Blocks the current thread until the token is made available. /// - /// A call to `park` may wake up spuriously without consuming the token, and callers should be - /// prepared for this possibility. - /// /// # Examples /// /// ``` @@ -113,9 +109,6 @@ impl Parker { /// Blocks the current thread until the token is made available, but only for a limited time. /// - /// A call to `park_timeout` may wake up spuriously without consuming the token, and callers - /// should be prepared for this possibility. - /// /// # Examples /// /// ``` @@ -128,7 +121,25 @@ impl Parker { /// p.park_timeout(Duration::from_millis(500)); /// ``` pub fn park_timeout(&self, timeout: Duration) { - self.unparker.inner.park(Some(timeout)); + self.park_deadline(Instant::now() + timeout) + } + + /// Blocks the current thread until the token is made available, or until a certain deadline. + /// + /// # Examples + /// + /// ``` + /// use std::time::{Duration, Instant}; + /// use crossbeam_utils::sync::Parker; + /// + /// let p = Parker::new(); + /// let deadline = Instant::now() + Duration::from_millis(500); + /// + /// // Waits for the token to become available, but will not wait longer than 500 ms. + /// p.park_deadline(deadline); + /// ``` + pub fn park_deadline(&self, deadline: Instant) { + self.unparker.inner.park(Some(deadline)) } /// Returns a reference to an associated [`Unparker`]. @@ -227,8 +238,7 @@ impl Unparker { /// u.unpark(); /// }); /// - /// // Wakes up when `u.unpark()` provides the token, but may also wake up - /// // spuriously before that without consuming the token. + /// // Wakes up when `u.unpark()` provides the token. /// p.park(); /// ``` /// @@ -302,7 +312,7 @@ struct Inner { } impl Inner { - fn park(&self, timeout: Option) { + fn park(&self, deadline: Option) { // If we were previously notified then we consume this notification and return quickly. if self .state @@ -313,8 +323,8 @@ impl Inner { } // If the timeout is zero, then there is no need to actually block. - if let Some(ref dur) = timeout { - if *dur == Duration::from_millis(0) { + if let Some(deadline) = deadline { + if deadline <= Instant::now() { return; } } @@ -338,40 +348,42 @@ impl Inner { Err(n) => panic!("inconsistent park_timeout state: {}", n), } - match timeout { - None => { - loop { - // Block the current thread on the conditional variable. - m = self.cvar.wait(m).unwrap(); - - if self - .state - .compare_exchange(NOTIFIED, EMPTY, SeqCst, SeqCst) - .is_ok() - { - // got a notification - return; + loop { + // Block the current thread on the conditional variable. + m = match deadline { + None => self.cvar.wait(m).unwrap(), + Some(deadline) => { + let now = Instant::now(); + if now < deadline { + // We could check for a timeout here, in the return value of wait_timeout, + // but in the case that a timeout and an unpark arrive simultaneously, we + // prefer to report the former. + self.cvar.wait_timeout(m, deadline - now).unwrap().0 + } else { + // We've timed out; swap out the state back to empty on our way out + match self.state.swap(EMPTY, SeqCst) { + NOTIFIED | PARKED => return, + n => panic!("inconsistent park_timeout state: {}", n), + }; } - - // spurious wakeup, go back to sleep } - } - Some(timeout) => { - // Wait with a timeout, and if we spuriously wake up or otherwise wake up from a - // notification we just want to unconditionally set `state` back to `EMPTY`, either - // consuming a notification or un-flagging ourselves as parked. - let (_m, _result) = self.cvar.wait_timeout(m, timeout).unwrap(); + }; - match self.state.swap(EMPTY, SeqCst) { - NOTIFIED => {} // got a notification - PARKED => {} // no notification - n => panic!("inconsistent park_timeout state: {}", n), - } + if self + .state + .compare_exchange(NOTIFIED, EMPTY, SeqCst, SeqCst) + .is_ok() + { + // got a notification + return; } + + // Spurious wakeup, go back to sleep. Alternatively, if we timed out, it will be caught + // in the branch above, when we discover the deadline is in the past } } - pub fn unpark(&self) { + pub(crate) fn unpark(&self) { // To ensure the unparked thread will observe any writes we made before this call, we must // perform a release operation that `park` can synchronize with. To do that we must write // `NOTIFIED` even if `state` is already `NOTIFIED`. That is why this must be a swap rather diff --git a/vendor/crossbeam-utils/src/sync/wait_group.rs b/vendor/crossbeam-utils/src/sync/wait_group.rs index cd7af12a36..4206ee42b7 100644 --- a/vendor/crossbeam-utils/src/sync/wait_group.rs +++ b/vendor/crossbeam-utils/src/sync/wait_group.rs @@ -1,8 +1,8 @@ // Necessary for using `Mutex` for conditional variables #![allow(clippy::mutex_atomic)] +use crate::primitive::sync::{Arc, Condvar, Mutex}; use std::fmt; -use std::sync::{Arc, Condvar, Mutex}; /// Enables threads to synchronize the beginning or end of some computation. /// diff --git a/vendor/crossbeam-utils/src/thread.rs b/vendor/crossbeam-utils/src/thread.rs index ab91be72d1..c57d076fbe 100644 --- a/vendor/crossbeam-utils/src/thread.rs +++ b/vendor/crossbeam-utils/src/thread.rs @@ -110,8 +110,6 @@ //! }); //! }).unwrap(); //! ``` -//! -//! [`std::thread::spawn`]: std::thread::spawn use std::fmt; use std::io; @@ -572,7 +570,6 @@ cfg_if! { } } - #[cfg(windows)] impl IntoRawHandle for ScopedJoinHandle<'_, T> { fn into_raw_handle(self) -> RawHandle { self.as_raw_handle() diff --git a/vendor/crossbeam-utils/tests/cache_padded.rs b/vendor/crossbeam-utils/tests/cache_padded.rs index be90cbe91d..c9e768771a 100644 --- a/vendor/crossbeam-utils/tests/cache_padded.rs +++ b/vendor/crossbeam-utils/tests/cache_padded.rs @@ -27,7 +27,9 @@ fn distance() { let arr = [CachePadded::new(17u8), CachePadded::new(37u8)]; let a = &*arr[0] as *const u8; let b = &*arr[1] as *const u8; - assert!(unsafe { a.offset(64) } <= b); + let align = mem::align_of::>(); + assert!(align >= 32); + assert_eq!(unsafe { a.add(align) }, b); } #[test] diff --git a/vendor/crossbeam-utils/tests/parker.rs b/vendor/crossbeam-utils/tests/parker.rs index f657eb1cf0..2bf9c37d49 100644 --- a/vendor/crossbeam-utils/tests/parker.rs +++ b/vendor/crossbeam-utils/tests/parker.rs @@ -18,7 +18,7 @@ fn park_timeout_unpark_before() { fn park_timeout_unpark_not_called() { let p = Parker::new(); for _ in 0..10 { - p.park_timeout(Duration::from_millis(10)); + p.park_timeout(Duration::from_millis(10)) } } @@ -34,7 +34,7 @@ fn park_timeout_unpark_called_other_thread() { u.unpark(); }); - p.park_timeout(Duration::from_millis(u32::MAX as u64)); + p.park_timeout(Duration::from_millis(u32::MAX as u64)) }) .unwrap(); } diff --git a/vendor/crossbeam-utils/tests/sharded_lock.rs b/vendor/crossbeam-utils/tests/sharded_lock.rs index 73bd489d3c..c36215440c 100644 --- a/vendor/crossbeam-utils/tests/sharded_lock.rs +++ b/vendor/crossbeam-utils/tests/sharded_lock.rs @@ -176,11 +176,8 @@ fn try_write() { let write_result = lock.try_write(); match write_result { Err(TryLockError::WouldBlock) => (), - Ok(_) => assert!( - false, - "try_write should not succeed while read_guard is in scope" - ), - Err(_) => assert!(false, "unexpected error"), + Ok(_) => panic!("try_write should not succeed while read_guard is in scope"), + Err(_) => panic!("unexpected error"), } drop(read_guard); diff --git a/vendor/cstr/.cargo-checksum.json b/vendor/cstr/.cargo-checksum.json new file mode 100644 index 0000000000..db45bf78d0 --- /dev/null +++ b/vendor/cstr/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"Cargo.toml":"a9eadcc48a51c9399980e7d0860b668a1277940899a5da781fcbfbc0a9db2660","LICENSE":"5a9bf0e7661617253ca7c12313f51a96aa62dec0bcd15a59c533c88b8093d124","README.md":"555193ce26ab91766d36d9d824ebae66cf18259e8dc37633d98cfa0cec7ce869","src/lib.rs":"2e8f10e1a260a1121cd87190dc67d5ff204258dd1740d64d891524d52424af05","src/parse.rs":"8eb3a7975a2ca73ca16fd3552d3874d04fea0c59a0c45f88194df486b5b2443f","tests/clippy_lints.rs":"4398124cd5bc3a7f295f6203d543fc7d99abfd945eb7418ccfa60535586d7e37","tests/compile_fail/empty.rs":"52dc3c0d4d6ee0bd6d89a34d1caf38d159830401f24ba30f5655f9de92697903","tests/compile_fail/empty.stderr":"c839ce87d482a1e65a668e5267067dd1bd310f60256a795fa8f080888a5c249b","tests/compile_fail/interior-nul.rs":"ecc09440020287377ca18e4b8308d1d516620a87612a5381bafc01fe48734d34","tests/compile_fail/interior-nul.stderr":"8bd003a7dfff248411403bdf666f8a0631307f468d589cf01e475b062db4b101","tests/compile_fail/non-str.rs":"e08be18a524a4482fb7f34cbc6e8448a878b41cf2c26dea99268aaabab6c3f3f","tests/compile_fail/non-str.stderr":"8dff245264d9c69dc151f742542a72400d7422f2a0f2b133a9f4d4fc96a4016a","tests/compile_fail/trash-after.rs":"7dff7a301c9087984c5acda183e34492f3d0f2ebec14b8dc0d2b11aab972a111","tests/compile_fail/trash-after.stderr":"487b5d6b687c52b80f9d9cba691a8654067a88f7d03d2d952d7e97d610ab70f3","tests/compile_test.rs":"13e3e0d22ec0dffa4d0be0c4db6381a03feff50cc25aa65c4950cc7e865d122d","tests/pass/byte_str_lit.rs":"9085e1f1e67dae193d33ff59c253cac23c9e23e9d8c7f92f0aba99097ade132e","tests/pass/const.rs":"777aeb93c3030349529a41ac62b3577b36badc4bada4ec46e45b5055d3676dbd","tests/pass/ident.rs":"5116ee71578d479d899345e039e5955b5dee442234dc504e1a9bfb9260cf8f15","tests/pass/macro.rs":"9596c936ed4d963fb40459ecd98b60610d3d90e41918f350ff45b6129b1aa0b7","tests/pass/str_lit.rs":"955fb887ebc01538bafe10fa810381eb53aebaafb8b36053e8712c081862fe7a"},"package":"c11a39d776a3b35896711da8a04dc1835169dcd36f710878187637314e47941b"} \ No newline at end of file diff --git a/vendor/const_fn/Cargo.toml b/vendor/cstr/Cargo.toml similarity index 54% rename from vendor/const_fn/Cargo.toml rename to vendor/cstr/Cargo.toml index 6017735bc2..7469832576 100644 --- a/vendor/const_fn/Cargo.toml +++ b/vendor/cstr/Cargo.toml @@ -12,19 +12,24 @@ [package] edition = "2018" -name = "const_fn" -version = "0.4.5" -authors = ["Taiki Endo "] -exclude = ["/.github", "/scripts"] -description = "An attribute for easy generation of const functions with conditional compilations.\n" -documentation = "https://docs.rs/const_fn" +name = "cstr" +version = "0.2.8" +authors = ["Xidorn Quan "] +description = "Macro for building static CStr reference" readme = "README.md" -keywords = ["macros", "attribute", "const", "static"] -categories = ["rust-patterns", "no-std"] -license = "Apache-2.0 OR MIT" -repository = "https://github.com/taiki-e/const_fn" -[package.metadata.docs.rs] -targets = ["x86_64-unknown-linux-gnu"] +keywords = ["macro", "cstr"] +license = "MIT" +repository = "https://github.com/upsuper/cstr" [lib] proc-macro = true +[dependencies.proc-macro2] +version = "1" + +[dependencies.quote] +version = "1" +[dev-dependencies.trybuild] +version = "1.0.30" +[badges.travis-ci] +branch = "master" +repository = "upsuper/cstr" diff --git a/vendor/cstr/LICENSE b/vendor/cstr/LICENSE new file mode 100644 index 0000000000..82ec98b7cc --- /dev/null +++ b/vendor/cstr/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2018-2020 Xidorn Quan + +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/cstr/README.md b/vendor/cstr/README.md new file mode 100644 index 0000000000..e8950e7d11 --- /dev/null +++ b/vendor/cstr/README.md @@ -0,0 +1,30 @@ +# cstr + +[![CI](https://github.com/upsuper/cstr/workflows/CI/badge.svg)](https://github.com/upsuper/cstr/actions) +[![Crates.io](https://img.shields.io/crates/v/cstr.svg)](https://crates.io/crates/cstr) +[![Docs](https://docs.rs/cstr/badge.svg)](https://docs.rs/cstr) + + + +A macro for getting `&'static CStr` from literal or identifier. + +This macro checks whether the given literal is valid for `CStr` +at compile time, and returns a static reference of `CStr`. + +This macro can be used to to initialize constants on Rust 1.46 and above. + +## Example + +```rust +use cstr::cstr; +use std::ffi::CStr; + +let test = cstr!(b"hello\xff"); +assert_eq!(test, CStr::from_bytes_with_nul(b"hello\xff\0").unwrap()); +let test = cstr!("hello"); +assert_eq!(test, CStr::from_bytes_with_nul(b"hello\0").unwrap()); +let test = cstr!(hello); +assert_eq!(test, CStr::from_bytes_with_nul(b"hello\0").unwrap()); +``` + + diff --git a/vendor/cstr/src/lib.rs b/vendor/cstr/src/lib.rs new file mode 100644 index 0000000000..d78eaa1b21 --- /dev/null +++ b/vendor/cstr/src/lib.rs @@ -0,0 +1,65 @@ +//! A macro for getting `&'static CStr` from literal or identifier. +//! +//! This macro checks whether the given literal is valid for `CStr` +//! at compile time, and returns a static reference of `CStr`. +//! +//! This macro can be used to to initialize constants on Rust 1.46 and above. +//! +//! ## Example +//! +//! ``` +//! use cstr::cstr; +//! use std::ffi::CStr; +//! +//! let test = cstr!(b"hello\xff"); +//! assert_eq!(test, CStr::from_bytes_with_nul(b"hello\xff\0").unwrap()); +//! let test = cstr!("hello"); +//! assert_eq!(test, CStr::from_bytes_with_nul(b"hello\0").unwrap()); +//! let test = cstr!(hello); +//! assert_eq!(test, CStr::from_bytes_with_nul(b"hello\0").unwrap()); +//! ``` + +// While this isn't necessary when using Cargo >= 1.42, omitting it actually requires path-less +// `--extern proc_macro` to be passed to `rustc` when building this crate. Some tools may not do +// this correctly. So it's added as a precaution. +extern crate proc_macro; + +use crate::parse::parse_input; +use proc_macro::TokenStream as RawTokenStream; +use proc_macro2::{Literal, Span, TokenStream}; +use quote::{quote, quote_spanned}; +use std::ffi::CString; + +mod parse; + +struct Error(Span, &'static str); + +#[proc_macro] +pub fn cstr(input: RawTokenStream) -> RawTokenStream { + let tokens = match build_byte_str(input.into()) { + // We can't use `&*ptr` to convert the raw pointer to reference, because as of Rust 1.46, + // dereferencing raw pointer in constants is unstable. + // This is being tracked in https://github.com/rust-lang/rust/issues/51911 + // So we explicitly disable the clippy lint for this expression. + Ok(s) => quote!(unsafe { + #[allow(clippy::transmute_ptr_to_ref)] + ::std::mem::transmute::<_, &::std::ffi::CStr>( + #s as *const [u8] as *const ::std::ffi::CStr + ) + }), + Err(Error(span, msg)) => quote_spanned!(span => compile_error!(#msg)), + }; + tokens.into() +} + +fn build_byte_str(input: TokenStream) -> Result { + let (bytes, span) = parse_input(input)?; + match CString::new(bytes) { + Ok(s) => { + let mut lit = Literal::byte_string(s.as_bytes_with_nul()); + lit.set_span(span); + Ok(lit) + } + Err(_) => Err(Error(span, "nul byte found in the literal")), + } +} diff --git a/vendor/cstr/src/parse.rs b/vendor/cstr/src/parse.rs new file mode 100644 index 0000000000..19e8a548ea --- /dev/null +++ b/vendor/cstr/src/parse.rs @@ -0,0 +1,225 @@ +use crate::Error; +use proc_macro2::{Delimiter, Ident, Literal, Span, TokenStream, TokenTree}; +use std::char; + +macro_rules! unexpected_content { + () => { + "expected one of: byte string literal, string literal, identifier" + }; +} + +pub(crate) fn parse_input(mut input: TokenStream) -> Result<(Vec, Span), Error> { + loop { + let mut tokens = input.into_iter(); + let token = match tokens.next() { + Some(token) => token, + None => { + return Err(Error( + Span::call_site(), + concat!("unexpected end of input, ", unexpected_content!()), + )) + } + }; + let span = token.span(); + let result = match token { + // Unwrap any empty group which may be created from macro expansion. + TokenTree::Group(group) if group.delimiter() == Delimiter::None => Err(group), + TokenTree::Literal(literal) => match parse_literal(literal) { + Ok(result) => Ok(result), + Err(msg) => return Err(Error(span, msg)), + }, + TokenTree::Ident(ident) => Ok(parse_ident(ident)), + _ => return Err(Error(span, unexpected_content!())), + }; + if let Some(token) = tokens.next() { + return Err(Error(token.span(), "unexpected token")); + } + match result { + Ok(result) => return Ok((result, span)), + Err(group) => input = group.stream(), + } + } +} + +fn parse_literal(literal: Literal) -> Result, &'static str> { + let s = literal.to_string(); + let s = s.as_bytes(); + match s[0] { + b'"' => Ok(parse_cooked_content(&s)), + b'r' => Ok(parse_raw_content(&s[1..])), + b'b' => match s[1] { + b'"' => Ok(parse_cooked_content(&s[1..])), + b'r' => Ok(parse_raw_content(&s[2..])), + _ => Err(unexpected_content!()), + }, + _ => Err(unexpected_content!()), + } +} + +fn all_pounds(bytes: &[u8]) -> bool { + bytes.iter().all(|b| *b == b'#') +} + +/// Parses raw string / bytes content after `r` prefix. +fn parse_raw_content(s: &[u8]) -> Vec { + let q_start = s.iter().position(|b| *b == b'"').unwrap(); + let q_end = s.iter().rposition(|b| *b == b'"').unwrap(); + assert!(all_pounds(&s[0..q_start])); + assert!(all_pounds(&s[q_end + 1..q_end + q_start + 1])); + Vec::from(&s[q_start + 1..q_end]) +} + +/// Parses the cooked string / bytes content within quotes. +fn parse_cooked_content(mut s: &[u8]) -> Vec { + s = &s[1..s.iter().rposition(|b| *b == b'"').unwrap()]; + let mut result = Vec::new(); + while !s.is_empty() { + match s[0] { + b'\\' => {} + b'\r' => { + assert_eq!(s[1], b'\n'); + result.push(b'\n'); + s = &s[2..]; + continue; + } + b => { + result.push(b); + s = &s[1..]; + continue; + } + } + let b = s[1]; + s = &s[2..]; + match b { + b'x' => { + let (b, rest) = backslash_x(&s); + result.push(b); + s = rest; + } + b'u' => { + let (c, rest) = backslash_u(&s); + result.extend_from_slice(c.encode_utf8(&mut [0; 4]).as_bytes()); + s = rest; + } + b'n' => result.push(b'\n'), + b'r' => result.push(b'\r'), + b't' => result.push(b'\t'), + b'\\' => result.push(b'\\'), + b'0' => result.push(b'\0'), + b'\'' => result.push(b'\''), + b'"' => result.push(b'"'), + b'\r' | b'\n' => { + let next = s.iter().position(|b| { + let ch = char::from_u32(u32::from(*b)).unwrap(); + !ch.is_whitespace() + }); + match next { + Some(pos) => s = &s[pos..], + None => s = b"", + } + } + b => panic!("unexpected byte {:?} after \\", b), + } + } + result +} + +fn backslash_x(s: &[u8]) -> (u8, &[u8]) { + let ch = hex_to_u8(s[0]) * 0x10 + hex_to_u8(s[1]); + (ch, &s[2..]) +} + +fn hex_to_u8(b: u8) -> u8 { + match b { + b'0'..=b'9' => b - b'0', + b'a'..=b'f' => b - b'a' + 10, + b'A'..=b'F' => b - b'A' + 10, + _ => unreachable!("unexpected non-hex character {:?} after \\x", b), + } +} + +fn backslash_u(s: &[u8]) -> (char, &[u8]) { + assert_eq!(s[0], b'{'); + let end = s[1..].iter().position(|b| *b == b'}').unwrap(); + let mut ch = 0; + for b in &s[1..=end] { + ch *= 0x10; + ch += u32::from(hex_to_u8(*b)); + } + (char::from_u32(ch).unwrap(), &s[end + 2..]) +} + +fn parse_ident(ident: Ident) -> Vec { + ident.to_string().into_bytes() +} + +#[cfg(test)] +mod tests { + use super::*; + use std::str::FromStr; + + // Tests below were modified from + // https://github.com/dtolnay/syn/blob/cd5fdc0f530f822446fccaf831669cd0cf4a0fc9/tests/test_lit.rs + + fn lit(s: &str) -> Vec { + match TokenStream::from_str(s) + .unwrap() + .into_iter() + .next() + .unwrap() + { + TokenTree::Literal(lit) => parse_literal(lit).unwrap(), + _ => panic!(), + } + } + + #[test] + fn strings() { + #[track_caller] + fn test_string(s: &str, value: &[u8]) { + assert_eq!(lit(s), value); + } + + test_string("\"a\"", b"a"); + test_string("\"\\n\"", b"\n"); + test_string("\"\\r\"", b"\r"); + test_string("\"\\t\"", b"\t"); + test_string("\"🐕\"", b"\xf0\x9f\x90\x95"); // NOTE: This is an emoji + test_string("\"\\\"\"", b"\""); + test_string("\"'\"", b"'"); + test_string("\"\"", b""); + test_string("\"\\u{1F415}\"", b"\xf0\x9f\x90\x95"); + test_string( + "\"contains\nnewlines\\\nescaped newlines\"", + b"contains\nnewlinesescaped newlines", + ); + test_string("r\"raw\nstring\\\nhere\"", b"raw\nstring\\\nhere"); + test_string("\"...\"q", b"..."); + test_string("r\"...\"q", b"..."); + test_string("r##\"...\"##q", b"..."); + } + + #[test] + fn byte_strings() { + #[track_caller] + fn test_byte_string(s: &str, value: &[u8]) { + assert_eq!(lit(s), value); + } + + test_byte_string("b\"a\"", b"a"); + test_byte_string("b\"\\n\"", b"\n"); + test_byte_string("b\"\\r\"", b"\r"); + test_byte_string("b\"\\t\"", b"\t"); + test_byte_string("b\"\\\"\"", b"\""); + test_byte_string("b\"'\"", b"'"); + test_byte_string("b\"\"", b""); + test_byte_string( + "b\"contains\nnewlines\\\nescaped newlines\"", + b"contains\nnewlinesescaped newlines", + ); + test_byte_string("br\"raw\nstring\\\nhere\"", b"raw\nstring\\\nhere"); + test_byte_string("b\"...\"q", b"..."); + test_byte_string("br\"...\"q", b"..."); + test_byte_string("br##\"...\"##q", b"..."); + } +} diff --git a/vendor/cstr/tests/clippy_lints.rs b/vendor/cstr/tests/clippy_lints.rs new file mode 100644 index 0000000000..47d7f27e2b --- /dev/null +++ b/vendor/cstr/tests/clippy_lints.rs @@ -0,0 +1,10 @@ +use cstr::cstr; +use std::ffi::CStr; + +#[test] +#[deny(clippy::transmute_ptr_to_ref)] +fn deny_transmute_ptr_to_ref() { + let s: &'static CStr = cstr!("foo\u{4e00}bar"); + let expected = b"foo\xe4\xb8\x80bar\0"; + assert_eq!(s, CStr::from_bytes_with_nul(expected).unwrap()); +} diff --git a/vendor/cstr/tests/compile_fail/empty.rs b/vendor/cstr/tests/compile_fail/empty.rs new file mode 100644 index 0000000000..0ac967273e --- /dev/null +++ b/vendor/cstr/tests/compile_fail/empty.rs @@ -0,0 +1,5 @@ +use cstr::cstr; + +fn main() { + let _foo = cstr!(); +} diff --git a/vendor/cstr/tests/compile_fail/empty.stderr b/vendor/cstr/tests/compile_fail/empty.stderr new file mode 100644 index 0000000000..738692f22c --- /dev/null +++ b/vendor/cstr/tests/compile_fail/empty.stderr @@ -0,0 +1,7 @@ +error: unexpected end of input, expected one of: byte string literal, string literal, identifier + --> $DIR/empty.rs:4:16 + | +4 | let _foo = cstr!(); + | ^^^^^^^ + | + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/vendor/cstr/tests/compile_fail/interior-nul.rs b/vendor/cstr/tests/compile_fail/interior-nul.rs new file mode 100644 index 0000000000..a6876aeb1d --- /dev/null +++ b/vendor/cstr/tests/compile_fail/interior-nul.rs @@ -0,0 +1,5 @@ +use cstr::cstr; + +fn main() { + let _foo = cstr!("foo\0bar"); +} diff --git a/vendor/cstr/tests/compile_fail/interior-nul.stderr b/vendor/cstr/tests/compile_fail/interior-nul.stderr new file mode 100644 index 0000000000..0c6ced1a45 --- /dev/null +++ b/vendor/cstr/tests/compile_fail/interior-nul.stderr @@ -0,0 +1,5 @@ +error: nul byte found in the literal + --> $DIR/interior-nul.rs:4:22 + | +4 | let _foo = cstr!("foo\0bar"); + | ^^^^^^^^^^ diff --git a/vendor/cstr/tests/compile_fail/non-str.rs b/vendor/cstr/tests/compile_fail/non-str.rs new file mode 100644 index 0000000000..172b145590 --- /dev/null +++ b/vendor/cstr/tests/compile_fail/non-str.rs @@ -0,0 +1,7 @@ +use cstr::cstr; + +fn main() { + let _foo = cstr!(1); + let _foo = cstr!(("a")); + let _foo = cstr!(&1); +} diff --git a/vendor/cstr/tests/compile_fail/non-str.stderr b/vendor/cstr/tests/compile_fail/non-str.stderr new file mode 100644 index 0000000000..bbbf7e7169 --- /dev/null +++ b/vendor/cstr/tests/compile_fail/non-str.stderr @@ -0,0 +1,17 @@ +error: expected one of: byte string literal, string literal, identifier + --> $DIR/non-str.rs:4:22 + | +4 | let _foo = cstr!(1); + | ^ + +error: expected one of: byte string literal, string literal, identifier + --> $DIR/non-str.rs:5:22 + | +5 | let _foo = cstr!(("a")); + | ^^^^^ + +error: expected one of: byte string literal, string literal, identifier + --> $DIR/non-str.rs:6:22 + | +6 | let _foo = cstr!(&1); + | ^ diff --git a/vendor/cstr/tests/compile_fail/trash-after.rs b/vendor/cstr/tests/compile_fail/trash-after.rs new file mode 100644 index 0000000000..5e4f7c3f08 --- /dev/null +++ b/vendor/cstr/tests/compile_fail/trash-after.rs @@ -0,0 +1,5 @@ +use cstr::cstr; + +fn main() { + let _foo = cstr!("foo" + "bar"); +} diff --git a/vendor/cstr/tests/compile_fail/trash-after.stderr b/vendor/cstr/tests/compile_fail/trash-after.stderr new file mode 100644 index 0000000000..d6bb1530af --- /dev/null +++ b/vendor/cstr/tests/compile_fail/trash-after.stderr @@ -0,0 +1,5 @@ +error: unexpected token + --> $DIR/trash-after.rs:4:28 + | +4 | let _foo = cstr!("foo" + "bar"); + | ^ diff --git a/vendor/cstr/tests/compile_test.rs b/vendor/cstr/tests/compile_test.rs new file mode 100644 index 0000000000..b3b9d9f6ce --- /dev/null +++ b/vendor/cstr/tests/compile_test.rs @@ -0,0 +1,6 @@ +#[test] +fn compile_test() { + let t = trybuild::TestCases::new(); + t.pass("tests/pass/*.rs"); + t.compile_fail("tests/compile_fail/*.rs"); +} diff --git a/vendor/cstr/tests/pass/byte_str_lit.rs b/vendor/cstr/tests/pass/byte_str_lit.rs new file mode 100644 index 0000000000..fd87f176c2 --- /dev/null +++ b/vendor/cstr/tests/pass/byte_str_lit.rs @@ -0,0 +1,7 @@ +use cstr::cstr; +use std::ffi::CStr; + +fn main() { + let foo: &'static CStr = cstr!(b"foo\xffbar"); + assert_eq!(foo, CStr::from_bytes_with_nul(b"foo\xffbar\0").unwrap()); +} diff --git a/vendor/cstr/tests/pass/const.rs b/vendor/cstr/tests/pass/const.rs new file mode 100644 index 0000000000..ae8647b954 --- /dev/null +++ b/vendor/cstr/tests/pass/const.rs @@ -0,0 +1,10 @@ +use cstr::cstr; +use std::ffi::CStr; + +const FOO: &CStr = cstr!(b"foo\xffbar"); +static BAR: &CStr = cstr!("bar"); + +fn main() { + assert_eq!(FOO, CStr::from_bytes_with_nul(b"foo\xffbar\0").unwrap()); + assert_eq!(BAR, CStr::from_bytes_with_nul(b"bar\0").unwrap()); +} diff --git a/vendor/cstr/tests/pass/ident.rs b/vendor/cstr/tests/pass/ident.rs new file mode 100644 index 0000000000..55e41c8621 --- /dev/null +++ b/vendor/cstr/tests/pass/ident.rs @@ -0,0 +1,9 @@ +use cstr::cstr; +use std::ffi::CStr; + +fn main() { + let foo: &'static CStr = cstr!(foobar); + assert_eq!(foo, CStr::from_bytes_with_nul(b"foobar\0").unwrap()); + let foo: &'static CStr = cstr!(r#foobar); + assert_eq!(foo, CStr::from_bytes_with_nul(b"r#foobar\0").unwrap()); +} diff --git a/vendor/cstr/tests/pass/macro.rs b/vendor/cstr/tests/pass/macro.rs new file mode 100644 index 0000000000..e89deac648 --- /dev/null +++ b/vendor/cstr/tests/pass/macro.rs @@ -0,0 +1,21 @@ +use cstr::cstr; +use std::ffi::CStr; + +macro_rules! cstr_expr { + ($s:expr) => { + cstr!($s) + }; +} + +macro_rules! cstr_literal { + ($s:literal) => { + cstr!($s) + }; +} + +fn main() { + let foo: &'static CStr = cstr_expr!("foo"); + assert_eq!(foo, CStr::from_bytes_with_nul(b"foo\0").unwrap()); + let bar: &'static CStr = cstr_literal!("bar"); + assert_eq!(bar, CStr::from_bytes_with_nul(b"bar\0").unwrap()); +} diff --git a/vendor/cstr/tests/pass/str_lit.rs b/vendor/cstr/tests/pass/str_lit.rs new file mode 100644 index 0000000000..d925859a9a --- /dev/null +++ b/vendor/cstr/tests/pass/str_lit.rs @@ -0,0 +1,8 @@ +use cstr::cstr; +use std::ffi::CStr; + +fn main() { + let foo: &'static CStr = cstr!("foo\u{4e00}bar"); + let expected = b"foo\xe4\xb8\x80bar\0"; + assert_eq!(foo, CStr::from_bytes_with_nul(expected).unwrap()); +} diff --git a/vendor/form_urlencoded/.cargo-checksum.json b/vendor/form_urlencoded/.cargo-checksum.json index 64a48d6ee3..33e19d1402 100644 --- a/vendor/form_urlencoded/.cargo-checksum.json +++ b/vendor/form_urlencoded/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"046aa6b4fb96aa67f8db4e0e1f8238f75f94b8f93ed2298177e4b7eb11e30f21","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e","src/lib.rs":"b8773556f5fcbdcce84bd7bc9ec57de80b95328d3b97b1a00f1102e8a152e6ca","src/query_encoding.rs":"88d31936327461af1382393117fc07bbdf064c6930aaff3cd8b38d2343e41b51"},"package":"ece68d15c92e84fa4f19d3780f1294e5ca82a78a6d515f1efaabcc144688be00"} \ No newline at end of file +{"files":{"Cargo.toml":"aadc4e4ba33e86861d8d1d8b848ac11a27b6f87340d082b47f762387464c61ed","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e","src/lib.rs":"5d30edec687843447c97e4ea87583983eb9fc06135ae718c8ecc0fa8cebef2df"},"package":"5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191"} \ No newline at end of file diff --git a/vendor/form_urlencoded/Cargo.toml b/vendor/form_urlencoded/Cargo.toml index cbbcc112c7..4c9fae2597 100644 --- a/vendor/form_urlencoded/Cargo.toml +++ b/vendor/form_urlencoded/Cargo.toml @@ -11,8 +11,9 @@ # will likely look very different (and much more reasonable) [package] +edition = "2018" name = "form_urlencoded" -version = "1.0.0" +version = "1.0.1" authors = ["The rust-url developers"] description = "Parser and serializer for the application/x-www-form-urlencoded syntax, as used by HTML forms." license = "MIT/Apache-2.0" diff --git a/vendor/form_urlencoded/src/lib.rs b/vendor/form_urlencoded/src/lib.rs index e1cf571a67..765ee168a1 100644 --- a/vendor/form_urlencoded/src/lib.rs +++ b/vendor/form_urlencoded/src/lib.rs @@ -13,19 +13,13 @@ //! Converts between a string (such as an URL’s query string) //! and a sequence of (name, value) pairs. -extern crate percent_encoding; #[macro_use] extern crate matches; use percent_encoding::{percent_decode, percent_encode_byte}; -use query_encoding::decode_utf8_lossy; use std::borrow::{Borrow, Cow}; use std::str; -mod query_encoding; - -pub use query_encoding::EncodingOverride; - /// Convert a byte string in the `application/x-www-form-urlencoded` syntax /// into a iterator of (name, value) pairs. /// @@ -34,7 +28,7 @@ pub use query_encoding::EncodingOverride; /// The names and values are percent-decoded. For instance, `%23first=%25try%25` will be /// converted to `[("#first", "%try%")]`. #[inline] -pub fn parse(input: &[u8]) -> Parse { +pub fn parse(input: &[u8]) -> Parse<'_> { Parse { input } } /// The return type of `parse()`. @@ -65,7 +59,7 @@ impl<'a> Iterator for Parse<'a> { } } -fn decode(input: &[u8]) -> Cow { +fn decode(input: &[u8]) -> Cow<'_, str> { let replaced = replace_plus(input); decode_utf8_lossy(match percent_decode(&replaced).into() { Cow::Owned(vec) => Cow::Owned(vec), @@ -74,7 +68,7 @@ fn decode(input: &[u8]) -> Cow { } /// Replace b'+' with b' ' -fn replace_plus(input: &[u8]) -> Cow<[u8]> { +fn replace_plus(input: &[u8]) -> Cow<'_, [u8]> { match input.iter().position(|&b| b == b'+') { None => Cow::Borrowed(input), Some(first_position) => { @@ -116,7 +110,7 @@ impl<'a> Iterator for ParseIntoOwned<'a> { /// https://url.spec.whatwg.org/#concept-urlencoded-byte-serializer). /// /// Return an iterator of `&str` slices. -pub fn byte_serialize(input: &[u8]) -> ByteSerialize { +pub fn byte_serialize(input: &[u8]) -> ByteSerialize<'_> { ByteSerialize { bytes: input } } @@ -150,6 +144,10 @@ impl<'a> Iterator for ByteSerialize<'a> { None => (self.bytes, &[][..]), }; self.bytes = remaining; + // This unsafe is appropriate because we have already checked these + // bytes in byte_serialized_unchanged, which checks for a subset + // of UTF-8. So we know these bytes are valid UTF-8, and doing + // another UTF-8 check would be wasteful. Some(unsafe { str::from_utf8_unchecked(unchanged_slice) }) } else { None @@ -214,7 +212,14 @@ impl<'a, T: Target> Serializer<'a, T> { /// If that suffix is non-empty, /// its content is assumed to already be in `application/x-www-form-urlencoded` syntax. pub fn for_suffix(mut target: T, start_position: usize) -> Self { - &target.as_mut_string()[start_position..]; // Panic if out of bounds + if target.as_mut_string().len() < start_position { + panic!( + "invalid length {} for target of length {}", + start_position, + target.as_mut_string().len() + ); + } + Serializer { target: Some(target), start_position, @@ -250,6 +255,19 @@ impl<'a, T: Target> Serializer<'a, T> { self } + /// Serialize and append a name of parameter without any value. + /// + /// Panics if called after `.finish()`. + pub fn append_key_only(&mut self, name: &str) -> &mut Self { + append_key_only( + string(&mut self.target), + self.start_position, + self.encoding, + name, + ); + self + } + /// Serialize and append a number of name/value pairs. /// /// This simply calls `append_pair` repeatedly. @@ -280,6 +298,29 @@ impl<'a, T: Target> Serializer<'a, T> { self } + /// Serialize and append a number of names without values. + /// + /// This simply calls `append_key_only` repeatedly. + /// This can be more convenient, so the user doesn’t need to introduce a block + /// to limit the scope of `Serializer`’s borrow of its string. + /// + /// Panics if called after `.finish()`. + pub fn extend_keys_only(&mut self, iter: I) -> &mut Self + where + I: IntoIterator, + I::Item: Borrow, + K: AsRef, + { + { + let string = string(&mut self.target); + for key in iter { + let k = key.borrow().as_ref(); + append_key_only(string, self.start_position, self.encoding, k); + } + } + self + } + /// If this serializer was constructed with a string, take and return that string. /// /// ```rust @@ -316,7 +357,7 @@ fn string(target: &mut Option) -> &mut String { fn append_pair( string: &mut String, start_position: usize, - encoding: EncodingOverride, + encoding: EncodingOverride<'_>, name: &str, value: &str, ) { @@ -326,6 +367,54 @@ fn append_pair( append_encoded(value, string, encoding); } -fn append_encoded(s: &str, string: &mut String, encoding: EncodingOverride) { - string.extend(byte_serialize(&query_encoding::encode(encoding, s.into()))) +fn append_key_only( + string: &mut String, + start_position: usize, + encoding: EncodingOverride, + name: &str, +) { + append_separator_if_needed(string, start_position); + append_encoded(name, string, encoding); } + +fn append_encoded(s: &str, string: &mut String, encoding: EncodingOverride<'_>) { + string.extend(byte_serialize(&encode(encoding, s))) +} + +pub(crate) fn encode<'a>(encoding_override: EncodingOverride<'_>, input: &'a str) -> Cow<'a, [u8]> { + if let Some(o) = encoding_override { + return o(input); + } + input.as_bytes().into() +} + +pub(crate) fn decode_utf8_lossy(input: Cow<'_, [u8]>) -> Cow<'_, str> { + // Note: This function is duplicated in `percent_encoding/lib.rs`. + match input { + Cow::Borrowed(bytes) => String::from_utf8_lossy(bytes), + Cow::Owned(bytes) => { + match String::from_utf8_lossy(&bytes) { + Cow::Borrowed(utf8) => { + // If from_utf8_lossy returns a Cow::Borrowed, then we can + // be sure our original bytes were valid UTF-8. This is because + // if the bytes were invalid UTF-8 from_utf8_lossy would have + // to allocate a new owned string to back the Cow so it could + // replace invalid bytes with a placeholder. + + // First we do a debug_assert to confirm our description above. + let raw_utf8: *const [u8]; + raw_utf8 = utf8.as_bytes(); + debug_assert!(raw_utf8 == &*bytes as *const [u8]); + + // Given we know the original input bytes are valid UTF-8, + // and we have ownership of those bytes, we re-use them and + // return a Cow::Owned here. + Cow::Owned(unsafe { String::from_utf8_unchecked(bytes) }) + } + Cow::Owned(s) => Cow::Owned(s), + } + } + } +} + +pub type EncodingOverride<'a> = Option<&'a dyn Fn(&str) -> Cow<'_, [u8]>>; diff --git a/vendor/form_urlencoded/src/query_encoding.rs b/vendor/form_urlencoded/src/query_encoding.rs deleted file mode 100644 index 76aed15a7b..0000000000 --- a/vendor/form_urlencoded/src/query_encoding.rs +++ /dev/null @@ -1,35 +0,0 @@ -// Copyright 2019 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::borrow::Cow; - -pub type EncodingOverride<'a> = Option<&'a dyn Fn(&str) -> Cow<[u8]>>; - -pub(crate) fn encode<'a>(encoding_override: EncodingOverride, input: &'a str) -> Cow<'a, [u8]> { - if let Some(o) = encoding_override { - return o(input); - } - input.as_bytes().into() -} - -pub(crate) fn decode_utf8_lossy(input: Cow<[u8]>) -> Cow { - match input { - Cow::Borrowed(bytes) => String::from_utf8_lossy(bytes), - Cow::Owned(bytes) => { - let raw_utf8: *const [u8]; - match String::from_utf8_lossy(&bytes) { - Cow::Borrowed(utf8) => raw_utf8 = utf8.as_bytes(), - Cow::Owned(s) => return s.into(), - } - // from_utf8_lossy returned a borrow of `bytes` unchanged. - debug_assert!(raw_utf8 == &*bytes as *const [u8]); - // Reuse the existing `Vec` allocation. - unsafe { String::from_utf8_unchecked(bytes) }.into() - } - } -} diff --git a/vendor/generic-array-0.12.3/.cargo-checksum.json b/vendor/generic-array-0.12.3/.cargo-checksum.json deleted file mode 100644 index 66e17ddfc4..0000000000 --- a/vendor/generic-array-0.12.3/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{"CHANGELOG.md":"aa938a1a7581e59cbb554b44cc2dcf628cc1af9ddee6dccd53f557ed8d62775e","Cargo.toml":"6f83fe34b8c252299c537c8f5cdb22bffb583c5676d5353ad73bef7f4d6958fc","LICENSE":"c09aae9d3c77b531f56351a9947bc7446511d6b025b3255312d3e3442a9a7583","README.md":"aad2a8508f8ae6b009d04d388bffb751875d4cfdcc6f3398212c65cc3c390d03","rustfmt.toml":"13d771354ddee15d5aa5a168fd6965c3c0ee7aa7ce75cdd5e3b82852cdac5123","src/arr.rs":"5fee5550800b890383c1dd80e00a0a568475a8599e7678e143740c941e98099d","src/functional.rs":"2437c360c645d8a9816a3b13531f23b005d1aed3ef7b1d9bcc9b2859b1d56826","src/hex.rs":"438288cf41fad3fd40ce60eb893cd038e9a88e450bab0189fe4dba8ce833a686","src/impl_serde.rs":"2cab2f808ba000c214a3ded9f43b4d5363114fe57c2c7abf545345b8b749f0db","src/impls.rs":"0472fc62d69e3e78b3f31e340cfc038bf12c3d7c4bdcd5fee064e7113d2f171d","src/iter.rs":"156f798c82bc0d5e2c9a0a7777acc156bfdda793b64295ad7495cc5daa5ecb97","src/lib.rs":"d2f4b74c7ac8f9a9d7a782089b95315ec6b1f1571d79a2b16bd76bcff2004bd4","src/sequence.rs":"63813c9e305b6642ac29f0ba3dd70d7db86e27fc58b31e7508c68ea52c060e82","tests/arr.rs":"22d332fcb5e0314980ddc952af0265125cf53bb9cb8b546a9dcaec2e29bfc3b0","tests/generics.rs":"491c9351fd973ff2b7bc72e78d3069cf3ed3fcd2f9180558ab027099605fa147","tests/hex.rs":"fd428c2558da2f1e2cf229af2e40e5b35a2094b3306312ac41943d25a85b7de1","tests/import_name.rs":"c9439c7d7531ce79419b0d413d729ea4321887c091bd9be8b18e6c2413021ed0","tests/iter.rs":"edf27c43ed13bf8cba2cd01de2fd7b6451c1226c8ad8331880996248e7f14d12","tests/mod.rs":"fca2966183ccd1d1681f91a845773911ab61f618bd412470612fac240ecfe0db"},"package":"c68f0274ae0e023facc3c97b2e00f076be70e254bc851d972503b328db79b2ec"} \ No newline at end of file diff --git a/vendor/generic-array-0.12.3/src/arr.rs b/vendor/generic-array-0.12.3/src/arr.rs deleted file mode 100644 index a07d129ad3..0000000000 --- a/vendor/generic-array-0.12.3/src/arr.rs +++ /dev/null @@ -1,57 +0,0 @@ -//! Implementation for `arr!` macro. - -use super::ArrayLength; -use core::ops::Add; -use typenum::U1; - -/// Helper trait for `arr!` macro -pub trait AddLength>: ArrayLength { - /// Resulting length - type Output: ArrayLength; -} - -impl AddLength for N1 -where - N1: ArrayLength + Add, - N2: ArrayLength, - >::Output: ArrayLength, -{ - type Output = >::Output; -} - -/// Helper type for `arr!` macro -pub type Inc = >::Output; - -#[doc(hidden)] -#[macro_export] -macro_rules! arr_impl { - ($T:ty; $N:ty, [$($x:expr),*], []) => ({ - unsafe { $crate::transmute::<_, $crate::GenericArray<$T, $N>>([$($x),*]) } - }); - ($T:ty; $N:ty, [], [$x1:expr]) => ( - arr_impl!($T; $crate::arr::Inc<$T, $N>, [$x1 as $T], []) - ); - ($T:ty; $N:ty, [], [$x1:expr, $($x:expr),+]) => ( - arr_impl!($T; $crate::arr::Inc<$T, $N>, [$x1 as $T], [$($x),+]) - ); - ($T:ty; $N:ty, [$($y:expr),+], [$x1:expr]) => ( - arr_impl!($T; $crate::arr::Inc<$T, $N>, [$($y),+, $x1 as $T], []) - ); - ($T:ty; $N:ty, [$($y:expr),+], [$x1:expr, $($x:expr),+]) => ( - arr_impl!($T; $crate::arr::Inc<$T, $N>, [$($y),+, $x1 as $T], [$($x),+]) - ); -} - -/// Macro allowing for easy generation of Generic Arrays. -/// Example: `let test = arr![u32; 1, 2, 3];` -#[macro_export] -macro_rules! arr { - ($T:ty; $(,)*) => ({ - unsafe { $crate::transmute::<[$T; 0], $crate::GenericArray<$T, $crate::typenum::U0>>([]) } - }); - ($T:ty; $($x:expr),* $(,)*) => ( - arr_impl!($T; $crate::typenum::U0, [], [$($x),*]) - ); - ($($x:expr,)+) => (arr![$($x),*]); - () => ("""Macro requires a type, e.g. `let array = arr![u32; 1, 2, 3];`") -} diff --git a/vendor/generic-array-0.12.4/.cargo-checksum.json b/vendor/generic-array-0.12.4/.cargo-checksum.json new file mode 100644 index 0000000000..cfe4f79f6d --- /dev/null +++ b/vendor/generic-array-0.12.4/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"CHANGELOG.md":"ae7c1d7fcd6dceb6472568994016862441606c444d0670d4e9dffab20c5eeea3","Cargo.toml":"122428b66e56c3287df569deba1e7de4b7c316cee39e1f9e1c3e7d80c793e427","LICENSE":"ad4fcfaf8d5b12b97409c137a03d4a4e4b21024c65c54f976cc3b609c1bd5b0f","README.md":"9a1a45416eac57050036b13df6ec84d21d555e820726af3c782896bd9d37d94b","rustfmt.toml":"2a298b4ce1fe6e16b8f281a0035567b8eb15042ed3062729fd28224f29c2f75a","src/arr.rs":"d866a89232279e5602cfe80b7f4e0db2b8b1153532ca72f61d65ba4d792fa603","src/functional.rs":"a0b12be07c1cc85549a80ddf1cfa1c7d5cbc09c3710bb635a5f95c35537005dc","src/hex.rs":"45e780bf385f99eec5058cfae87f97042679b1e8cbc130c009d4c074052016aa","src/impl_serde.rs":"5556e952fd351ab0af27bb562b1b6382e96a20afe51a04300264842e1fb33747","src/impls.rs":"d3046213d058b43b7b7360a2fa9ab6794e44970f1bc1847649c42c8f1c4f2d75","src/iter.rs":"b8b130ddd52461c435b873b9435f771d6535ae835055a73d79c0f3105f6b367e","src/lib.rs":"99a3fe3bc49cbfb9f00554d4860b24abe02e8075404fdb88343f2ee389f09110","src/sequence.rs":"bdf4d8920205bb85dee95897940373991b232e7b0614ae52c03c5f4bc4e8dccc","tests/arr.rs":"97258231dfeefc52ec785c2019611cc1a339c3a13f744a26727a591f7e46a7a8","tests/generics.rs":"8da33daacab14d0fd685e0ca6292a2d19be23fa6c6e128921b554a7e1d6181a1","tests/hex.rs":"143d783defedd6609995862f8aac46b8c843272a8f877f83d2f7242de8814c02","tests/import_name.rs":"1235729ecbde47fc9a38b3bf35c750a53ed55e3cf967c9d2b24fd759dc9e9e0c","tests/iter.rs":"3e5e6a1354709e8bfa76e52969c61f3d21cb960027bb91745049c0dcdfa52bfd","tests/mod.rs":"75694855127075e14ddef490fffee3dea5a052bcdda2912878bd9995f3f2956d"},"package":"ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd"} \ No newline at end of file diff --git a/vendor/generic-array-0.12.3/CHANGELOG.md b/vendor/generic-array-0.12.4/CHANGELOG.md similarity index 97% rename from vendor/generic-array-0.12.3/CHANGELOG.md rename to vendor/generic-array-0.12.4/CHANGELOG.md index f8ee86b8e6..d5e50e7b17 100644 --- a/vendor/generic-array-0.12.3/CHANGELOG.md +++ b/vendor/generic-array-0.12.4/CHANGELOG.md @@ -1,48 +1,51 @@ -* **`0.12.0`** - * Allow trailing commas in `arr!` macro. - * **BREAKING**: Serialize `GenericArray` using `serde` tuples, instead of variable-length sequences. This may not be compatible with old serialized data. - -* **`0.11.0`** - * **BREAKING** Redesign `GenericSequence` with an emphasis on use in generic type parameters. - * Add `MappedGenericSequence` and `FunctionalSequence` - * Implements optimized `map`, `zip` and `fold` for `GenericArray`, `&GenericArray` and `&mut GenericArray` - * **BREAKING** Remove `map_ref`, `zip_ref` and `map_slice` - * `map_slice` is now equivalent to `GenericArray::from_iter(slice.iter().map(...))` -* **`0.10.0`** - * Add `GenericSequence`, `Lengthen`, `Shorten`, `Split` and `Concat` traits. - * Redefine `transmute` to avert errors. -* **`0.9.0`** - * Rewrite construction methods to be well-defined in panic situations, correctly dropping elements. - * `NoDrop` crate replaced by `ManuallyDrop` as it became stable in Rust core. - * Add optimized `map`/`map_ref` and `zip`/`zip_ref` methods to `GenericArray` -* **`0.8.0`** - * Implement `AsRef`, `AsMut`, `Borrow`, `BorrowMut`, `Hash` for `GenericArray` - * Update `serde` to `1.0` - * Update `typenum` - * Make macro `arr!` non-cloning - * Implement `From<[T; N]>` up to `N=32` - * Fix #45 -* **`0.7.0`** - * Upgrade `serde` to `0.9` - * Make `serde` with `no_std` - * Implement `PartialOrd`/`Ord` for `GenericArray` -* **`0.6.0`** - * Fixed #30 - * Implement `Default` for `GenericArray` - * Implement `LowerHex` and `UpperHex` for `GenericArray` - * Use `precision` formatting field in hex representation - * Add `as_slice`, `as_mut_slice` - * Remove `GenericArray::new` in favor of `Default` trait - * Add `from_slice` and `from_mut_slice` - * `no_std` and `core` for crate. -* **`0.5.0`** - * Update `serde` - * remove `no_std` feature, fixed #19 -* **`0.4.0`** - * Re-export `typenum` -* **`0.3.0`** - * Implement `IntoIter` for `GenericArray` - * Add `map` method - * Add optional `serde` (de)serialization support feature. -* **`< 0.3.0`** - * Initial implementation in late 2015 +* **`0.12.4`** + * Fix unsoundness in the `arr!` macro. + +* **`0.12.0`** + * Allow trailing commas in `arr!` macro. + * **BREAKING**: Serialize `GenericArray` using `serde` tuples, instead of variable-length sequences. This may not be compatible with old serialized data. + +* **`0.11.0`** + * **BREAKING** Redesign `GenericSequence` with an emphasis on use in generic type parameters. + * Add `MappedGenericSequence` and `FunctionalSequence` + * Implements optimized `map`, `zip` and `fold` for `GenericArray`, `&GenericArray` and `&mut GenericArray` + * **BREAKING** Remove `map_ref`, `zip_ref` and `map_slice` + * `map_slice` is now equivalent to `GenericArray::from_iter(slice.iter().map(...))` +* **`0.10.0`** + * Add `GenericSequence`, `Lengthen`, `Shorten`, `Split` and `Concat` traits. + * Redefine `transmute` to avert errors. +* **`0.9.0`** + * Rewrite construction methods to be well-defined in panic situations, correctly dropping elements. + * `NoDrop` crate replaced by `ManuallyDrop` as it became stable in Rust core. + * Add optimized `map`/`map_ref` and `zip`/`zip_ref` methods to `GenericArray` +* **`0.8.0`** + * Implement `AsRef`, `AsMut`, `Borrow`, `BorrowMut`, `Hash` for `GenericArray` + * Update `serde` to `1.0` + * Update `typenum` + * Make macro `arr!` non-cloning + * Implement `From<[T; N]>` up to `N=32` + * Fix #45 +* **`0.7.0`** + * Upgrade `serde` to `0.9` + * Make `serde` with `no_std` + * Implement `PartialOrd`/`Ord` for `GenericArray` +* **`0.6.0`** + * Fixed #30 + * Implement `Default` for `GenericArray` + * Implement `LowerHex` and `UpperHex` for `GenericArray` + * Use `precision` formatting field in hex representation + * Add `as_slice`, `as_mut_slice` + * Remove `GenericArray::new` in favor of `Default` trait + * Add `from_slice` and `from_mut_slice` + * `no_std` and `core` for crate. +* **`0.5.0`** + * Update `serde` + * remove `no_std` feature, fixed #19 +* **`0.4.0`** + * Re-export `typenum` +* **`0.3.0`** + * Implement `IntoIter` for `GenericArray` + * Add `map` method + * Add optional `serde` (de)serialization support feature. +* **`< 0.3.0`** + * Initial implementation in late 2015 diff --git a/vendor/generic-array-0.12.3/Cargo.toml b/vendor/generic-array-0.12.4/Cargo.toml similarity index 98% rename from vendor/generic-array-0.12.3/Cargo.toml rename to vendor/generic-array-0.12.4/Cargo.toml index 14b070c0b6..f4f4f46164 100644 --- a/vendor/generic-array-0.12.3/Cargo.toml +++ b/vendor/generic-array-0.12.4/Cargo.toml @@ -12,7 +12,7 @@ [package] name = "generic-array" -version = "0.12.3" +version = "0.12.4" authors = ["Bartłomiej Kamiński ", "Aaron Trent "] description = "Generic types implementing functionality of arrays" documentation = "http://fizyk20.github.io/generic-array/generic_array/" diff --git a/vendor/generic-array-0.12.3/LICENSE b/vendor/generic-array-0.12.4/LICENSE similarity index 97% rename from vendor/generic-array-0.12.3/LICENSE rename to vendor/generic-array-0.12.4/LICENSE index 6d318946df..5968bccccf 100644 --- a/vendor/generic-array-0.12.3/LICENSE +++ b/vendor/generic-array-0.12.4/LICENSE @@ -1,21 +1,21 @@ -The MIT License (MIT) - -Copyright (c) 2015 Bartłomiej Kamiński - -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 +The MIT License (MIT) + +Copyright (c) 2015 Bartłomiej Kamiński + +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. \ No newline at end of file diff --git a/vendor/generic-array-0.12.3/README.md b/vendor/generic-array-0.12.4/README.md similarity index 97% rename from vendor/generic-array-0.12.3/README.md rename to vendor/generic-array-0.12.4/README.md index 64dd84faaf..0864ed6273 100644 --- a/vendor/generic-array-0.12.3/README.md +++ b/vendor/generic-array-0.12.4/README.md @@ -1,34 +1,34 @@ -[![Crates.io](https://img.shields.io/crates/v/generic-array.svg)](https://crates.io/crates/generic-array) -[![Build Status](https://travis-ci.org/fizyk20/generic-array.svg?branch=master)](https://travis-ci.org/fizyk20/generic-array) -# generic-array - -This crate implements generic array types for Rust. - -[Documentation](http://fizyk20.github.io/generic-array/generic_array/) - -## Usage - -The Rust arrays `[T; N]` are problematic in that they can't be used generically with respect to `N`, so for example this won't work: - -```rust -struct Foo { - data: [i32; N] -} -``` - -**generic-array** defines a new trait `ArrayLength` and a struct `GenericArray>`, which let the above be implemented as: - -```rust -struct Foo> { - data: GenericArray -} -``` - -To actually define a type implementing `ArrayLength`, you can use unsigned integer types defined in [typenum](https://github.com/paholg/typenum) crate - for example, `GenericArray` would work almost like `[T; 5]` :) - -In version 0.1.1 an `arr!` macro was introduced, allowing for creation of arrays as shown below: - -```rust -let array = arr![u32; 1, 2, 3]; -assert_eq!(array[2], 3); -``` +[![Crates.io](https://img.shields.io/crates/v/generic-array.svg)](https://crates.io/crates/generic-array) +[![Build Status](https://travis-ci.org/fizyk20/generic-array.svg?branch=master)](https://travis-ci.org/fizyk20/generic-array) +# generic-array + +This crate implements generic array types for Rust. + +[Documentation](http://fizyk20.github.io/generic-array/generic_array/) + +## Usage + +The Rust arrays `[T; N]` are problematic in that they can't be used generically with respect to `N`, so for example this won't work: + +```rust +struct Foo { + data: [i32; N] +} +``` + +**generic-array** defines a new trait `ArrayLength` and a struct `GenericArray>`, which let the above be implemented as: + +```rust +struct Foo> { + data: GenericArray +} +``` + +To actually define a type implementing `ArrayLength`, you can use unsigned integer types defined in [typenum](https://github.com/paholg/typenum) crate - for example, `GenericArray` would work almost like `[T; 5]` :) + +In version 0.1.1 an `arr!` macro was introduced, allowing for creation of arrays as shown below: + +```rust +let array = arr![u32; 1, 2, 3]; +assert_eq!(array[2], 3); +``` diff --git a/vendor/generic-array-0.12.3/rustfmt.toml b/vendor/generic-array-0.12.4/rustfmt.toml similarity index 96% rename from vendor/generic-array-0.12.3/rustfmt.toml rename to vendor/generic-array-0.12.4/rustfmt.toml index a46e4b2bdb..3dc0db27b3 100644 --- a/vendor/generic-array-0.12.3/rustfmt.toml +++ b/vendor/generic-array-0.12.4/rustfmt.toml @@ -1,3 +1,3 @@ -reorder_imports = true -reorder_imported_names = true -use_try_shorthand = true +reorder_imports = true +reorder_imported_names = true +use_try_shorthand = true diff --git a/vendor/generic-array-0.12.4/src/arr.rs b/vendor/generic-array-0.12.4/src/arr.rs new file mode 100644 index 0000000000..ebe6875008 --- /dev/null +++ b/vendor/generic-array-0.12.4/src/arr.rs @@ -0,0 +1,126 @@ +//! Implementation for `arr!` macro. + +use super::ArrayLength; +use core::ops::Add; +use typenum::U1; + +/// Helper trait for `arr!` macro +pub trait AddLength>: ArrayLength { + /// Resulting length + type Output: ArrayLength; +} + +impl AddLength for N1 +where + N1: ArrayLength + Add, + N2: ArrayLength, + >::Output: ArrayLength, +{ + type Output = >::Output; +} + +/// Helper type for `arr!` macro +pub type Inc = >::Output; + +#[doc(hidden)] +#[macro_export] +macro_rules! arr_impl { + (@replace_expr $e:expr)=>{ + 1 + }; + ($T:ty; $N:ty, [$($x:expr),*], []) => ({ + const __ARR_LENGTH:usize=0 $(+ $crate::arr_impl!(@replace_expr $x) )*; + fn __do_transmute<'a, T, N: $crate::ArrayLength>(arr: [T; __ARR_LENGTH]) -> $crate::GenericArray { + unsafe { $crate::transmute(arr) } + } + + let _:[();<$N as $crate::typenum::Unsigned>::USIZE]=[();__ARR_LENGTH]; + + __do_transmute::<$T,$N>([$($x),*]) + }); + ($T:ty; $N:ty, [], [$x1:expr]) => ( + $crate::arr_impl!($T; $crate::arr::Inc<$T, $N>, [$x1], []) + ); + ($T:ty; $N:ty, [], [$x1:expr, $($x:expr),+]) => ( + $crate::arr_impl!($T; $crate::arr::Inc<$T, $N>, [$x1], [$($x),+]) + ); + ($T:ty; $N:ty, [$($y:expr),+], [$x1:expr]) => ( + $crate::arr_impl!($T; $crate::arr::Inc<$T, $N>, [$($y),+, $x1], []) + ); + ($T:ty; $N:ty, [$($y:expr),+], [$x1:expr, $($x:expr),+]) => ( + $crate::arr_impl!($T; $crate::arr::Inc<$T, $N>, [$($y),+, $x1], [$($x),+]) + ); +} + +/// Macro allowing for easy generation of Generic Arrays. +/// Example: `let test = arr![u32; 1, 2, 3];` +#[macro_export] +macro_rules! arr { + ($T:ty; $(,)*) => ({ + unsafe { $crate::transmute::<[$T; 0], $crate::GenericArray<$T, $crate::typenum::U0>>([]) } + }); + ($T:ty; $($x:expr),* $(,)*) => ( + arr_impl!($T; $crate::typenum::U0, [], [$($x),*]) + ); + ($($x:expr,)+) => (arr![$($x),*]); + () => ("""Macro requires a type, e.g. `let array = arr![u32; 1, 2, 3];`") +} + + +mod doctests_only{ + /// + /// # With ellision + /// + /// Testing that lifetimes aren't transmuted when they're ellided. + /// + /// ```compile_fail + /// #[macro_use] extern crate generic_array; + /// fn main() { + /// fn unsound_lifetime_extension<'a, A>(a: &'a A) -> &'static A { + /// arr![&A; a][0] + /// } + /// } + /// ``` + /// + /// ```rust + /// #[macro_use] extern crate generic_array; + /// fn main() { + /// fn unsound_lifetime_extension<'a, A>(a: &'a A) -> &'a A { + /// arr![&A; a][0] + /// } + /// } + /// ``` + /// + /// # Without ellision + /// + /// Testing that lifetimes aren't transmuted when they're specified explicitly. + /// + /// ```compile_fail + /// #[macro_use] extern crate generic_array; + /// fn main() { + /// fn unsound_lifetime_extension<'a, A>(a: &'a A) -> &'static A { + /// arr![&'a A; a][0] + /// } + /// } + /// ``` + /// + /// ```compile_fail + /// #[macro_use] extern crate generic_array; + /// fn main() { + /// fn unsound_lifetime_extension<'a, A>(a: &'a A) -> &'static A { + /// arr![&'static A; a][0] + /// } + /// } + /// ``` + /// + /// ```rust + /// #[macro_use] extern crate generic_array; + /// fn main() { + /// fn unsound_lifetime_extension<'a, A>(a: &'a A) -> &'a A { + /// arr![&'a A; a][0] + /// } + /// } + /// ``` + #[allow(dead_code)] + pub enum DocTests{} +} diff --git a/vendor/generic-array-0.12.3/src/functional.rs b/vendor/generic-array-0.12.4/src/functional.rs similarity index 97% rename from vendor/generic-array-0.12.3/src/functional.rs rename to vendor/generic-array-0.12.4/src/functional.rs index d161a83cac..50f4a71b8a 100644 --- a/vendor/generic-array-0.12.3/src/functional.rs +++ b/vendor/generic-array-0.12.4/src/functional.rs @@ -1,94 +1,94 @@ -//! Functional programming with generic sequences -//! -//! Please see `tests/generics.rs` for examples of how to best use these in your generic functions. - -use super::ArrayLength; -use core::iter::FromIterator; -use sequence::*; - -/// Defines the relationship between one generic sequence and another, -/// for operations such as `map` and `zip`. -pub unsafe trait MappedGenericSequence: GenericSequence -where - Self::Length: ArrayLength, -{ - /// Mapped sequence type - type Mapped: GenericSequence; -} - -unsafe impl<'a, T, U, S: MappedGenericSequence> MappedGenericSequence for &'a S -where - &'a S: GenericSequence, - S: GenericSequence>::Length>, - >::Length: ArrayLength, -{ - type Mapped = >::Mapped; -} - -unsafe impl<'a, T, U, S: MappedGenericSequence> MappedGenericSequence for &'a mut S -where - &'a mut S: GenericSequence, - S: GenericSequence>::Length>, - >::Length: ArrayLength, -{ - type Mapped = >::Mapped; -} - -/// Accessor type for a mapped generic sequence -pub type MappedSequence = - <>::Mapped as GenericSequence>::Sequence; - -/// Defines functional programming methods for generic sequences -pub unsafe trait FunctionalSequence: GenericSequence { - /// Maps a `GenericSequence` to another `GenericSequence`. - /// - /// If the mapping function panics, any already initialized elements in the new sequence - /// will be dropped, AND any unused elements in the source sequence will also be dropped. - fn map(self, f: F) -> MappedSequence - where - Self: MappedGenericSequence, - Self::Length: ArrayLength, - F: FnMut(Self::Item) -> U, - { - FromIterator::from_iter(self.into_iter().map(f)) - } - - /// Combines two `GenericSequence` instances and iterates through both of them, - /// initializing a new `GenericSequence` with the result of the zipped mapping function. - /// - /// If the mapping function panics, any already initialized elements in the new sequence - /// will be dropped, AND any unused elements in the source sequences will also be dropped. - #[inline] - fn zip(self, rhs: Rhs, f: F) -> MappedSequence - where - Self: MappedGenericSequence, - Rhs: MappedGenericSequence>, - Self::Length: ArrayLength + ArrayLength, - Rhs: GenericSequence, - F: FnMut(Self::Item, Rhs::Item) -> U, - { - rhs.inverted_zip2(self, f) - } - - /// Folds (or reduces) a sequence of data into a single value. - /// - /// If the fold function panics, any unused elements will be dropped. - fn fold(self, init: U, f: F) -> U - where - F: FnMut(U, Self::Item) -> U, - { - self.into_iter().fold(init, f) - } -} - -unsafe impl<'a, T, S: GenericSequence> FunctionalSequence for &'a S -where - &'a S: GenericSequence, -{ -} - -unsafe impl<'a, T, S: GenericSequence> FunctionalSequence for &'a mut S -where - &'a mut S: GenericSequence, -{ -} +//! Functional programming with generic sequences +//! +//! Please see `tests/generics.rs` for examples of how to best use these in your generic functions. + +use super::ArrayLength; +use core::iter::FromIterator; +use sequence::*; + +/// Defines the relationship between one generic sequence and another, +/// for operations such as `map` and `zip`. +pub unsafe trait MappedGenericSequence: GenericSequence +where + Self::Length: ArrayLength, +{ + /// Mapped sequence type + type Mapped: GenericSequence; +} + +unsafe impl<'a, T, U, S: MappedGenericSequence> MappedGenericSequence for &'a S +where + &'a S: GenericSequence, + S: GenericSequence>::Length>, + >::Length: ArrayLength, +{ + type Mapped = >::Mapped; +} + +unsafe impl<'a, T, U, S: MappedGenericSequence> MappedGenericSequence for &'a mut S +where + &'a mut S: GenericSequence, + S: GenericSequence>::Length>, + >::Length: ArrayLength, +{ + type Mapped = >::Mapped; +} + +/// Accessor type for a mapped generic sequence +pub type MappedSequence = + <>::Mapped as GenericSequence>::Sequence; + +/// Defines functional programming methods for generic sequences +pub unsafe trait FunctionalSequence: GenericSequence { + /// Maps a `GenericSequence` to another `GenericSequence`. + /// + /// If the mapping function panics, any already initialized elements in the new sequence + /// will be dropped, AND any unused elements in the source sequence will also be dropped. + fn map(self, f: F) -> MappedSequence + where + Self: MappedGenericSequence, + Self::Length: ArrayLength, + F: FnMut(Self::Item) -> U, + { + FromIterator::from_iter(self.into_iter().map(f)) + } + + /// Combines two `GenericSequence` instances and iterates through both of them, + /// initializing a new `GenericSequence` with the result of the zipped mapping function. + /// + /// If the mapping function panics, any already initialized elements in the new sequence + /// will be dropped, AND any unused elements in the source sequences will also be dropped. + #[inline] + fn zip(self, rhs: Rhs, f: F) -> MappedSequence + where + Self: MappedGenericSequence, + Rhs: MappedGenericSequence>, + Self::Length: ArrayLength + ArrayLength, + Rhs: GenericSequence, + F: FnMut(Self::Item, Rhs::Item) -> U, + { + rhs.inverted_zip2(self, f) + } + + /// Folds (or reduces) a sequence of data into a single value. + /// + /// If the fold function panics, any unused elements will be dropped. + fn fold(self, init: U, f: F) -> U + where + F: FnMut(U, Self::Item) -> U, + { + self.into_iter().fold(init, f) + } +} + +unsafe impl<'a, T, S: GenericSequence> FunctionalSequence for &'a S +where + &'a S: GenericSequence, +{ +} + +unsafe impl<'a, T, S: GenericSequence> FunctionalSequence for &'a mut S +where + &'a mut S: GenericSequence, +{ +} diff --git a/vendor/generic-array-0.12.3/src/hex.rs b/vendor/generic-array-0.12.4/src/hex.rs similarity index 97% rename from vendor/generic-array-0.12.3/src/hex.rs rename to vendor/generic-array-0.12.4/src/hex.rs index 09a6608e37..3ef92b1b99 100644 --- a/vendor/generic-array-0.12.3/src/hex.rs +++ b/vendor/generic-array-0.12.4/src/hex.rs @@ -1,102 +1,102 @@ -//! Generic array are commonly used as a return value for hash digests, so -//! it's a good idea to allow to hexlify them easily. This module implements -//! `std::fmt::LowerHex` and `std::fmt::UpperHex` traits. -//! -//! Example: -//! -//! ```rust -//! # #[macro_use] -//! # extern crate generic_array; -//! # extern crate typenum; -//! # fn main() { -//! let array = arr![u8; 10, 20, 30]; -//! assert_eq!(format!("{:x}", array), "0a141e"); -//! # } -//! ``` -//! - -use {ArrayLength, GenericArray}; -use core::cmp::min; -use core::fmt; -use core::ops::Add; -use core::str; -use typenum::*; - -static LOWER_CHARS: &'static [u8] = b"0123456789abcdef"; -static UPPER_CHARS: &'static [u8] = b"0123456789ABCDEF"; - -impl> fmt::LowerHex for GenericArray -where - T: Add, - >::Output: ArrayLength, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let max_digits = f.precision().unwrap_or_else(|| self.len() * 2); - let max_hex = (max_digits >> 1) + (max_digits & 1); - - if T::to_usize() < 1024 { - // For small arrays use a stack allocated - // buffer of 2x number of bytes - let mut res = GenericArray::>::default(); - - for (i, c) in self.iter().take(max_hex).enumerate() { - res[i * 2] = LOWER_CHARS[(c >> 4) as usize]; - res[i * 2 + 1] = LOWER_CHARS[(c & 0xF) as usize]; - } - f.write_str(unsafe { str::from_utf8_unchecked(&res[..max_digits]) })?; - } else { - // For large array use chunks of up to 1024 bytes (2048 hex chars) - let mut buf = [0u8; 2048]; - let mut digits_left = max_digits; - - for chunk in self[..max_hex].chunks(1024) { - for (i, c) in chunk.iter().enumerate() { - buf[i * 2] = LOWER_CHARS[(c >> 4) as usize]; - buf[i * 2 + 1] = LOWER_CHARS[(c & 0xF) as usize]; - } - let n = min(chunk.len() * 2, digits_left); - f.write_str(unsafe { str::from_utf8_unchecked(&buf[..n]) })?; - digits_left -= n; - } - } - Ok(()) - } -} - -impl> fmt::UpperHex for GenericArray -where - T: Add, - >::Output: ArrayLength, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let max_digits = f.precision().unwrap_or_else(|| self.len() * 2); - let max_hex = (max_digits >> 1) + (max_digits & 1); - - if T::to_usize() < 1024 { - // For small arrays use a stack allocated - // buffer of 2x number of bytes - let mut res = GenericArray::>::default(); - - for (i, c) in self.iter().take(max_hex).enumerate() { - res[i * 2] = UPPER_CHARS[(c >> 4) as usize]; - res[i * 2 + 1] = UPPER_CHARS[(c & 0xF) as usize]; - } - f.write_str(unsafe { str::from_utf8_unchecked(&res[..max_digits]) })?; - } else { - // For large array use chunks of up to 1024 bytes (2048 hex chars) - let mut buf = [0u8; 2048]; - let mut digits_left = max_digits; - - for chunk in self[..max_hex].chunks(1024) { - for (i, c) in chunk.iter().enumerate() { - buf[i * 2] = UPPER_CHARS[(c >> 4) as usize]; - buf[i * 2 + 1] = UPPER_CHARS[(c & 0xF) as usize]; - } - let n = min(chunk.len() * 2, digits_left); - f.write_str(unsafe { str::from_utf8_unchecked(&buf[..n]) })?; - digits_left -= n; - } - } - Ok(()) - } -} +//! Generic array are commonly used as a return value for hash digests, so +//! it's a good idea to allow to hexlify them easily. This module implements +//! `std::fmt::LowerHex` and `std::fmt::UpperHex` traits. +//! +//! Example: +//! +//! ```rust +//! # #[macro_use] +//! # extern crate generic_array; +//! # extern crate typenum; +//! # fn main() { +//! let array = arr![u8; 10, 20, 30]; +//! assert_eq!(format!("{:x}", array), "0a141e"); +//! # } +//! ``` +//! + +use {ArrayLength, GenericArray}; +use core::cmp::min; +use core::fmt; +use core::ops::Add; +use core::str; +use typenum::*; + +static LOWER_CHARS: &'static [u8] = b"0123456789abcdef"; +static UPPER_CHARS: &'static [u8] = b"0123456789ABCDEF"; + +impl> fmt::LowerHex for GenericArray +where + T: Add, + >::Output: ArrayLength, +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let max_digits = f.precision().unwrap_or_else(|| self.len() * 2); + let max_hex = (max_digits >> 1) + (max_digits & 1); + + if T::to_usize() < 1024 { + // For small arrays use a stack allocated + // buffer of 2x number of bytes + let mut res = GenericArray::>::default(); + + for (i, c) in self.iter().take(max_hex).enumerate() { + res[i * 2] = LOWER_CHARS[(c >> 4) as usize]; + res[i * 2 + 1] = LOWER_CHARS[(c & 0xF) as usize]; + } + f.write_str(unsafe { str::from_utf8_unchecked(&res[..max_digits]) })?; + } else { + // For large array use chunks of up to 1024 bytes (2048 hex chars) + let mut buf = [0u8; 2048]; + let mut digits_left = max_digits; + + for chunk in self[..max_hex].chunks(1024) { + for (i, c) in chunk.iter().enumerate() { + buf[i * 2] = LOWER_CHARS[(c >> 4) as usize]; + buf[i * 2 + 1] = LOWER_CHARS[(c & 0xF) as usize]; + } + let n = min(chunk.len() * 2, digits_left); + f.write_str(unsafe { str::from_utf8_unchecked(&buf[..n]) })?; + digits_left -= n; + } + } + Ok(()) + } +} + +impl> fmt::UpperHex for GenericArray +where + T: Add, + >::Output: ArrayLength, +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + let max_digits = f.precision().unwrap_or_else(|| self.len() * 2); + let max_hex = (max_digits >> 1) + (max_digits & 1); + + if T::to_usize() < 1024 { + // For small arrays use a stack allocated + // buffer of 2x number of bytes + let mut res = GenericArray::>::default(); + + for (i, c) in self.iter().take(max_hex).enumerate() { + res[i * 2] = UPPER_CHARS[(c >> 4) as usize]; + res[i * 2 + 1] = UPPER_CHARS[(c & 0xF) as usize]; + } + f.write_str(unsafe { str::from_utf8_unchecked(&res[..max_digits]) })?; + } else { + // For large array use chunks of up to 1024 bytes (2048 hex chars) + let mut buf = [0u8; 2048]; + let mut digits_left = max_digits; + + for chunk in self[..max_hex].chunks(1024) { + for (i, c) in chunk.iter().enumerate() { + buf[i * 2] = UPPER_CHARS[(c >> 4) as usize]; + buf[i * 2 + 1] = UPPER_CHARS[(c & 0xF) as usize]; + } + let n = min(chunk.len() * 2, digits_left); + f.write_str(unsafe { str::from_utf8_unchecked(&buf[..n]) })?; + digits_left -= n; + } + } + Ok(()) + } +} diff --git a/vendor/generic-array-0.12.3/src/impl_serde.rs b/vendor/generic-array-0.12.4/src/impl_serde.rs similarity index 96% rename from vendor/generic-array-0.12.3/src/impl_serde.rs rename to vendor/generic-array-0.12.4/src/impl_serde.rs index 7bf20ba013..da1df2fc09 100644 --- a/vendor/generic-array-0.12.3/src/impl_serde.rs +++ b/vendor/generic-array-0.12.4/src/impl_serde.rs @@ -1,108 +1,108 @@ -//! Serde serialization/deserialization implementation - -use core::fmt; -use core::marker::PhantomData; -use serde::de::{self, SeqAccess, Visitor}; -use serde::{ser::SerializeTuple, Deserialize, Deserializer, Serialize, Serializer}; -use {ArrayLength, GenericArray}; - -impl Serialize for GenericArray -where - T: Serialize, - N: ArrayLength, -{ - #[inline] - fn serialize(&self, serializer: S) -> Result - where - S: Serializer, - { - let mut tup = serializer.serialize_tuple(N::to_usize())?; - for el in self { - tup.serialize_element(el)?; - } - - tup.end() - } -} - -struct GAVisitor { - _t: PhantomData, - _n: PhantomData, -} - -impl<'de, T, N> Visitor<'de> for GAVisitor -where - T: Deserialize<'de> + Default, - N: ArrayLength, -{ - type Value = GenericArray; - - fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { - formatter.write_str("struct GenericArray") - } - - fn visit_seq(self, mut seq: A) -> Result, A::Error> - where - A: SeqAccess<'de>, - { - let mut result = GenericArray::default(); - for i in 0..N::to_usize() { - result[i] = seq - .next_element()? - .ok_or_else(|| de::Error::invalid_length(i, &self))?; - } - Ok(result) - } -} - -impl<'de, T, N> Deserialize<'de> for GenericArray -where - T: Deserialize<'de> + Default, - N: ArrayLength, -{ - fn deserialize(deserializer: D) -> Result, D::Error> - where - D: Deserializer<'de>, - { - let visitor = GAVisitor { - _t: PhantomData, - _n: PhantomData, - }; - deserializer.deserialize_tuple(N::to_usize(), visitor) - } -} - -#[cfg(test)] -mod tests { - use super::*; - use bincode; - use typenum; - - #[test] - fn test_serialize() { - let array = GenericArray::::default(); - let serialized = bincode::serialize(&array); - assert!(serialized.is_ok()); - } - - #[test] - fn test_deserialize() { - let mut array = GenericArray::::default(); - array[0] = 1; - array[1] = 2; - let serialized = bincode::serialize(&array).unwrap(); - let deserialized = bincode::deserialize::>(&array); - assert!(deserialized.is_ok()); - let array = deserialized.unwrap(); - assert_eq!(array[0], 1); - assert_eq!(array[1], 2); - } - - #[test] - fn test_serialized_size() { - let array = GenericArray::::default(); - let size = bincode::serialized_size(&array).unwrap(); - assert_eq!(size, 1); - } - -} +//! Serde serialization/deserialization implementation + +use core::fmt; +use core::marker::PhantomData; +use serde::de::{self, SeqAccess, Visitor}; +use serde::{ser::SerializeTuple, Deserialize, Deserializer, Serialize, Serializer}; +use {ArrayLength, GenericArray}; + +impl Serialize for GenericArray +where + T: Serialize, + N: ArrayLength, +{ + #[inline] + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + let mut tup = serializer.serialize_tuple(N::to_usize())?; + for el in self { + tup.serialize_element(el)?; + } + + tup.end() + } +} + +struct GAVisitor { + _t: PhantomData, + _n: PhantomData, +} + +impl<'de, T, N> Visitor<'de> for GAVisitor +where + T: Deserialize<'de> + Default, + N: ArrayLength, +{ + type Value = GenericArray; + + fn expecting(&self, formatter: &mut fmt::Formatter) -> fmt::Result { + formatter.write_str("struct GenericArray") + } + + fn visit_seq(self, mut seq: A) -> Result, A::Error> + where + A: SeqAccess<'de>, + { + let mut result = GenericArray::default(); + for i in 0..N::to_usize() { + result[i] = seq + .next_element()? + .ok_or_else(|| de::Error::invalid_length(i, &self))?; + } + Ok(result) + } +} + +impl<'de, T, N> Deserialize<'de> for GenericArray +where + T: Deserialize<'de> + Default, + N: ArrayLength, +{ + fn deserialize(deserializer: D) -> Result, D::Error> + where + D: Deserializer<'de>, + { + let visitor = GAVisitor { + _t: PhantomData, + _n: PhantomData, + }; + deserializer.deserialize_tuple(N::to_usize(), visitor) + } +} + +#[cfg(test)] +mod tests { + use super::*; + use bincode; + use typenum; + + #[test] + fn test_serialize() { + let array = GenericArray::::default(); + let serialized = bincode::serialize(&array); + assert!(serialized.is_ok()); + } + + #[test] + fn test_deserialize() { + let mut array = GenericArray::::default(); + array[0] = 1; + array[1] = 2; + let serialized = bincode::serialize(&array).unwrap(); + let deserialized = bincode::deserialize::>(&array); + assert!(deserialized.is_ok()); + let array = deserialized.unwrap(); + assert_eq!(array[0], 1); + assert_eq!(array[1], 2); + } + + #[test] + fn test_serialized_size() { + let array = GenericArray::::default(); + let size = bincode::serialized_size(&array).unwrap(); + assert_eq!(size, 1); + } + +} diff --git a/vendor/generic-array-0.12.3/src/impls.rs b/vendor/generic-array-0.12.4/src/impls.rs similarity index 95% rename from vendor/generic-array-0.12.3/src/impls.rs rename to vendor/generic-array-0.12.4/src/impls.rs index 52896dfba3..ea5a3c4c90 100644 --- a/vendor/generic-array-0.12.3/src/impls.rs +++ b/vendor/generic-array-0.12.4/src/impls.rs @@ -1,182 +1,182 @@ -use super::{ArrayLength, GenericArray}; -use core::borrow::{Borrow, BorrowMut}; -use core::cmp::Ordering; -use core::fmt::{self, Debug}; -use core::hash::{Hash, Hasher}; -use functional::*; -use sequence::*; - -impl Default for GenericArray -where - N: ArrayLength, -{ - #[inline] - fn default() -> Self { - Self::generate(|_| T::default()) - } -} - -impl Clone for GenericArray -where - N: ArrayLength, -{ - fn clone(&self) -> GenericArray { - self.map(Clone::clone) - } -} - -impl Copy for GenericArray -where - N: ArrayLength, - N::ArrayType: Copy, -{ -} - -impl PartialEq for GenericArray -where - N: ArrayLength, -{ - fn eq(&self, other: &Self) -> bool { - **self == **other - } -} -impl Eq for GenericArray -where - N: ArrayLength, -{ -} - -impl PartialOrd for GenericArray -where - N: ArrayLength, -{ - fn partial_cmp(&self, other: &GenericArray) -> Option { - PartialOrd::partial_cmp(self.as_slice(), other.as_slice()) - } -} - -impl Ord for GenericArray -where - N: ArrayLength, -{ - fn cmp(&self, other: &GenericArray) -> Ordering { - Ord::cmp(self.as_slice(), other.as_slice()) - } -} - -impl Debug for GenericArray -where - N: ArrayLength, -{ - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - self[..].fmt(fmt) - } -} - -impl Borrow<[T]> for GenericArray -where - N: ArrayLength, -{ - #[inline(always)] - fn borrow(&self) -> &[T] { - &self[..] - } -} - -impl BorrowMut<[T]> for GenericArray -where - N: ArrayLength, -{ - #[inline(always)] - fn borrow_mut(&mut self) -> &mut [T] { - &mut self[..] - } -} - -impl AsRef<[T]> for GenericArray -where - N: ArrayLength, -{ - #[inline(always)] - fn as_ref(&self) -> &[T] { - &self[..] - } -} - -impl AsMut<[T]> for GenericArray -where - N: ArrayLength, -{ - #[inline(always)] - fn as_mut(&mut self) -> &mut [T] { - &mut self[..] - } -} - -impl Hash for GenericArray -where - N: ArrayLength, -{ - fn hash(&self, state: &mut H) - where - H: Hasher, - { - Hash::hash(&self[..], state) - } -} - -macro_rules! impl_from { - ($($n: expr => $ty: ty),*) => { - $( - impl From<[T; $n]> for GenericArray { - #[inline(always)] - fn from(arr: [T; $n]) -> Self { - unsafe { $crate::transmute(arr) } - } - } - - impl Into<[T; $n]> for GenericArray { - #[inline(always)] - fn into(self) -> [T; $n] { - unsafe { $crate::transmute(self) } - } - } - )* - - } -} - -impl_from! { - 1 => ::typenum::U1, - 2 => ::typenum::U2, - 3 => ::typenum::U3, - 4 => ::typenum::U4, - 5 => ::typenum::U5, - 6 => ::typenum::U6, - 7 => ::typenum::U7, - 8 => ::typenum::U8, - 9 => ::typenum::U9, - 10 => ::typenum::U10, - 11 => ::typenum::U11, - 12 => ::typenum::U12, - 13 => ::typenum::U13, - 14 => ::typenum::U14, - 15 => ::typenum::U15, - 16 => ::typenum::U16, - 17 => ::typenum::U17, - 18 => ::typenum::U18, - 19 => ::typenum::U19, - 20 => ::typenum::U20, - 21 => ::typenum::U21, - 22 => ::typenum::U22, - 23 => ::typenum::U23, - 24 => ::typenum::U24, - 25 => ::typenum::U25, - 26 => ::typenum::U26, - 27 => ::typenum::U27, - 28 => ::typenum::U28, - 29 => ::typenum::U29, - 30 => ::typenum::U30, - 31 => ::typenum::U31, - 32 => ::typenum::U32 -} +use super::{ArrayLength, GenericArray}; +use core::borrow::{Borrow, BorrowMut}; +use core::cmp::Ordering; +use core::fmt::{self, Debug}; +use core::hash::{Hash, Hasher}; +use functional::*; +use sequence::*; + +impl Default for GenericArray +where + N: ArrayLength, +{ + #[inline] + fn default() -> Self { + Self::generate(|_| T::default()) + } +} + +impl Clone for GenericArray +where + N: ArrayLength, +{ + fn clone(&self) -> GenericArray { + self.map(Clone::clone) + } +} + +impl Copy for GenericArray +where + N: ArrayLength, + N::ArrayType: Copy, +{ +} + +impl PartialEq for GenericArray +where + N: ArrayLength, +{ + fn eq(&self, other: &Self) -> bool { + **self == **other + } +} +impl Eq for GenericArray +where + N: ArrayLength, +{ +} + +impl PartialOrd for GenericArray +where + N: ArrayLength, +{ + fn partial_cmp(&self, other: &GenericArray) -> Option { + PartialOrd::partial_cmp(self.as_slice(), other.as_slice()) + } +} + +impl Ord for GenericArray +where + N: ArrayLength, +{ + fn cmp(&self, other: &GenericArray) -> Ordering { + Ord::cmp(self.as_slice(), other.as_slice()) + } +} + +impl Debug for GenericArray +where + N: ArrayLength, +{ + fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + self[..].fmt(fmt) + } +} + +impl Borrow<[T]> for GenericArray +where + N: ArrayLength, +{ + #[inline(always)] + fn borrow(&self) -> &[T] { + &self[..] + } +} + +impl BorrowMut<[T]> for GenericArray +where + N: ArrayLength, +{ + #[inline(always)] + fn borrow_mut(&mut self) -> &mut [T] { + &mut self[..] + } +} + +impl AsRef<[T]> for GenericArray +where + N: ArrayLength, +{ + #[inline(always)] + fn as_ref(&self) -> &[T] { + &self[..] + } +} + +impl AsMut<[T]> for GenericArray +where + N: ArrayLength, +{ + #[inline(always)] + fn as_mut(&mut self) -> &mut [T] { + &mut self[..] + } +} + +impl Hash for GenericArray +where + N: ArrayLength, +{ + fn hash(&self, state: &mut H) + where + H: Hasher, + { + Hash::hash(&self[..], state) + } +} + +macro_rules! impl_from { + ($($n: expr => $ty: ty),*) => { + $( + impl From<[T; $n]> for GenericArray { + #[inline(always)] + fn from(arr: [T; $n]) -> Self { + unsafe { $crate::transmute(arr) } + } + } + + impl Into<[T; $n]> for GenericArray { + #[inline(always)] + fn into(self) -> [T; $n] { + unsafe { $crate::transmute(self) } + } + } + )* + + } +} + +impl_from! { + 1 => ::typenum::U1, + 2 => ::typenum::U2, + 3 => ::typenum::U3, + 4 => ::typenum::U4, + 5 => ::typenum::U5, + 6 => ::typenum::U6, + 7 => ::typenum::U7, + 8 => ::typenum::U8, + 9 => ::typenum::U9, + 10 => ::typenum::U10, + 11 => ::typenum::U11, + 12 => ::typenum::U12, + 13 => ::typenum::U13, + 14 => ::typenum::U14, + 15 => ::typenum::U15, + 16 => ::typenum::U16, + 17 => ::typenum::U17, + 18 => ::typenum::U18, + 19 => ::typenum::U19, + 20 => ::typenum::U20, + 21 => ::typenum::U21, + 22 => ::typenum::U22, + 23 => ::typenum::U23, + 24 => ::typenum::U24, + 25 => ::typenum::U25, + 26 => ::typenum::U26, + 27 => ::typenum::U27, + 28 => ::typenum::U28, + 29 => ::typenum::U29, + 30 => ::typenum::U30, + 31 => ::typenum::U31, + 32 => ::typenum::U32 +} diff --git a/vendor/generic-array-0.12.3/src/iter.rs b/vendor/generic-array-0.12.4/src/iter.rs similarity index 95% rename from vendor/generic-array-0.12.3/src/iter.rs rename to vendor/generic-array-0.12.4/src/iter.rs index 46f3e768d7..a2d67fc679 100644 --- a/vendor/generic-array-0.12.3/src/iter.rs +++ b/vendor/generic-array-0.12.4/src/iter.rs @@ -1,190 +1,190 @@ -//! `GenericArray` iterator implementation. - -use super::{ArrayLength, GenericArray}; -use core::{cmp, ptr, fmt, mem}; -use core::mem::ManuallyDrop; - -/// An iterator that moves out of a `GenericArray` -pub struct GenericArrayIter> { - // Invariants: index <= index_back <= N - // Only values in array[index..index_back] are alive at any given time. - // Values from array[..index] and array[index_back..] are already moved/dropped. - array: ManuallyDrop>, - index: usize, - index_back: usize, -} - -#[cfg(test)] -mod test { - use super::*; - - fn send(_iter: I) {} - - #[test] - fn test_send_iter() { - send(GenericArray::from([1, 2, 3, 4]).into_iter()); - } -} - -impl GenericArrayIter -where - N: ArrayLength, -{ - /// Returns the remaining items of this iterator as a slice - #[inline] - pub fn as_slice(&self) -> &[T] { - &self.array.as_slice()[self.index..self.index_back] - } - - /// Returns the remaining items of this iterator as a mutable slice - #[inline] - pub fn as_mut_slice(&mut self) -> &mut [T] { - &mut self.array.as_mut_slice()[self.index..self.index_back] - } -} - -impl IntoIterator for GenericArray -where - N: ArrayLength, -{ - type Item = T; - type IntoIter = GenericArrayIter; - - fn into_iter(self) -> Self::IntoIter { - GenericArrayIter { - array: ManuallyDrop::new(self), - index: 0, - index_back: N::to_usize(), - } - } -} - -// Based on work in rust-lang/rust#49000 -impl fmt::Debug for GenericArrayIter -where - N: ArrayLength, -{ - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_tuple("GenericArrayIter") - .field(&self.as_slice()) - .finish() - } -} - -impl Drop for GenericArrayIter -where - N: ArrayLength, -{ - #[inline] - fn drop(&mut self) { - // Drop values that are still alive. - for p in self.as_mut_slice() { - unsafe { - ptr::drop_in_place(p); - } - } - } -} - -// Based on work in rust-lang/rust#49000 -impl Clone for GenericArrayIter -where - N: ArrayLength, -{ - fn clone(&self) -> Self { - // This places all cloned elements at the start of the new array iterator, - // not at their original indices. - unsafe { - let mut iter = GenericArrayIter { - array: ManuallyDrop::new(mem::uninitialized()), - index: 0, - index_back: 0, - }; - - for (dst, src) in iter.array.iter_mut().zip(self.as_slice()) { - ptr::write(dst, src.clone()); - - iter.index_back += 1; - } - - iter - } - } -} - -impl Iterator for GenericArrayIter -where - N: ArrayLength, -{ - type Item = T; - - #[inline] - fn next(&mut self) -> Option { - if self.index < self.index_back { - let p = unsafe { Some(ptr::read(self.array.get_unchecked(self.index))) }; - - self.index += 1; - - p - } else { - None - } - } - - #[inline] - fn size_hint(&self) -> (usize, Option) { - let len = self.len(); - (len, Some(len)) - } - - #[inline] - fn count(self) -> usize { - self.len() - } - - fn nth(&mut self, n: usize) -> Option { - // First consume values prior to the nth. - let ndrop = cmp::min(n, self.len()); - - for p in &mut self.array[self.index..self.index + ndrop] { - self.index += 1; - - unsafe { - ptr::drop_in_place(p); - } - } - - self.next() - } - - fn last(mut self) -> Option { - // Note, everything else will correctly drop first as `self` leaves scope. - self.next_back() - } -} - -impl DoubleEndedIterator for GenericArrayIter -where - N: ArrayLength, -{ - fn next_back(&mut self) -> Option { - if self.index < self.index_back { - self.index_back -= 1; - - unsafe { Some(ptr::read(self.array.get_unchecked(self.index_back))) } - } else { - None - } - } -} - -impl ExactSizeIterator for GenericArrayIter -where - N: ArrayLength, -{ - fn len(&self) -> usize { - self.index_back - self.index - } -} - +//! `GenericArray` iterator implementation. + +use super::{ArrayLength, GenericArray}; +use core::{cmp, ptr, fmt, mem}; +use core::mem::ManuallyDrop; + +/// An iterator that moves out of a `GenericArray` +pub struct GenericArrayIter> { + // Invariants: index <= index_back <= N + // Only values in array[index..index_back] are alive at any given time. + // Values from array[..index] and array[index_back..] are already moved/dropped. + array: ManuallyDrop>, + index: usize, + index_back: usize, +} + +#[cfg(test)] +mod test { + use super::*; + + fn send(_iter: I) {} + + #[test] + fn test_send_iter() { + send(GenericArray::from([1, 2, 3, 4]).into_iter()); + } +} + +impl GenericArrayIter +where + N: ArrayLength, +{ + /// Returns the remaining items of this iterator as a slice + #[inline] + pub fn as_slice(&self) -> &[T] { + &self.array.as_slice()[self.index..self.index_back] + } + + /// Returns the remaining items of this iterator as a mutable slice + #[inline] + pub fn as_mut_slice(&mut self) -> &mut [T] { + &mut self.array.as_mut_slice()[self.index..self.index_back] + } +} + +impl IntoIterator for GenericArray +where + N: ArrayLength, +{ + type Item = T; + type IntoIter = GenericArrayIter; + + fn into_iter(self) -> Self::IntoIter { + GenericArrayIter { + array: ManuallyDrop::new(self), + index: 0, + index_back: N::to_usize(), + } + } +} + +// Based on work in rust-lang/rust#49000 +impl fmt::Debug for GenericArrayIter +where + N: ArrayLength, +{ + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + f.debug_tuple("GenericArrayIter") + .field(&self.as_slice()) + .finish() + } +} + +impl Drop for GenericArrayIter +where + N: ArrayLength, +{ + #[inline] + fn drop(&mut self) { + // Drop values that are still alive. + for p in self.as_mut_slice() { + unsafe { + ptr::drop_in_place(p); + } + } + } +} + +// Based on work in rust-lang/rust#49000 +impl Clone for GenericArrayIter +where + N: ArrayLength, +{ + fn clone(&self) -> Self { + // This places all cloned elements at the start of the new array iterator, + // not at their original indices. + unsafe { + let mut iter = GenericArrayIter { + array: ManuallyDrop::new(mem::uninitialized()), + index: 0, + index_back: 0, + }; + + for (dst, src) in iter.array.iter_mut().zip(self.as_slice()) { + ptr::write(dst, src.clone()); + + iter.index_back += 1; + } + + iter + } + } +} + +impl Iterator for GenericArrayIter +where + N: ArrayLength, +{ + type Item = T; + + #[inline] + fn next(&mut self) -> Option { + if self.index < self.index_back { + let p = unsafe { Some(ptr::read(self.array.get_unchecked(self.index))) }; + + self.index += 1; + + p + } else { + None + } + } + + #[inline] + fn size_hint(&self) -> (usize, Option) { + let len = self.len(); + (len, Some(len)) + } + + #[inline] + fn count(self) -> usize { + self.len() + } + + fn nth(&mut self, n: usize) -> Option { + // First consume values prior to the nth. + let ndrop = cmp::min(n, self.len()); + + for p in &mut self.array[self.index..self.index + ndrop] { + self.index += 1; + + unsafe { + ptr::drop_in_place(p); + } + } + + self.next() + } + + fn last(mut self) -> Option { + // Note, everything else will correctly drop first as `self` leaves scope. + self.next_back() + } +} + +impl DoubleEndedIterator for GenericArrayIter +where + N: ArrayLength, +{ + fn next_back(&mut self) -> Option { + if self.index < self.index_back { + self.index_back -= 1; + + unsafe { Some(ptr::read(self.array.get_unchecked(self.index_back))) } + } else { + None + } + } +} + +impl ExactSizeIterator for GenericArrayIter +where + N: ArrayLength, +{ + fn len(&self) -> usize { + self.index_back - self.index + } +} + // TODO: Implement `FusedIterator` and `TrustedLen` when stabilized \ No newline at end of file diff --git a/vendor/generic-array-0.12.3/src/lib.rs b/vendor/generic-array-0.12.4/src/lib.rs similarity index 96% rename from vendor/generic-array-0.12.3/src/lib.rs rename to vendor/generic-array-0.12.4/src/lib.rs index 5b95805375..e98e8fd58b 100644 --- a/vendor/generic-array-0.12.3/src/lib.rs +++ b/vendor/generic-array-0.12.4/src/lib.rs @@ -1,632 +1,632 @@ -//! This crate implements a structure that can be used as a generic array type.use -//! Core Rust array types `[T; N]` can't be used generically with -//! respect to `N`, so for example this: -//! -//! ```{should_fail} -//! struct Foo { -//! data: [T; N] -//! } -//! ``` -//! -//! won't work. -//! -//! **generic-array** exports a `GenericArray` type, which lets -//! the above be implemented as: -//! -//! ``` -//! # use generic_array::{ArrayLength, GenericArray}; -//! struct Foo> { -//! data: GenericArray -//! } -//! ``` -//! -//! The `ArrayLength` trait is implemented by default for -//! [unsigned integer types](../typenum/uint/index.html) from -//! [typenum](../typenum/index.html). -//! -//! For ease of use, an `arr!` macro is provided - example below: -//! -//! ``` -//! # #[macro_use] -//! # extern crate generic_array; -//! # extern crate typenum; -//! # fn main() { -//! let array = arr![u32; 1, 2, 3]; -//! assert_eq!(array[2], 3); -//! # } -//! ``` - -#![deny(missing_docs)] -#![no_std] - -#[cfg(feature = "serde")] -extern crate serde; - -#[cfg(test)] -extern crate bincode; - -pub extern crate typenum; - -mod hex; -mod impls; - -#[cfg(feature = "serde")] -pub mod impl_serde; - -use core::iter::FromIterator; -use core::marker::PhantomData; -use core::mem::ManuallyDrop; -use core::ops::{Deref, DerefMut}; -use core::{mem, ptr, slice}; -use typenum::bit::{B0, B1}; -use typenum::uint::{UInt, UTerm, Unsigned}; - -#[cfg_attr(test, macro_use)] -pub mod arr; -pub mod functional; -pub mod iter; -pub mod sequence; - -use functional::*; -pub use iter::GenericArrayIter; -use sequence::*; - -/// Trait making `GenericArray` work, marking types to be used as length of an array -pub unsafe trait ArrayLength: Unsigned { - /// Associated type representing the array type for the number - type ArrayType; -} - -unsafe impl ArrayLength for UTerm { - #[doc(hidden)] - type ArrayType = (); -} - -/// Internal type used to generate a struct of appropriate size -#[allow(dead_code)] -#[repr(C)] -#[doc(hidden)] -pub struct GenericArrayImplEven { - parent1: U, - parent2: U, - _marker: PhantomData, -} - -impl Clone for GenericArrayImplEven { - fn clone(&self) -> GenericArrayImplEven { - GenericArrayImplEven { - parent1: self.parent1.clone(), - parent2: self.parent2.clone(), - _marker: PhantomData, - } - } -} - -impl Copy for GenericArrayImplEven {} - -/// Internal type used to generate a struct of appropriate size -#[allow(dead_code)] -#[repr(C)] -#[doc(hidden)] -pub struct GenericArrayImplOdd { - parent1: U, - parent2: U, - data: T, -} - -impl Clone for GenericArrayImplOdd { - fn clone(&self) -> GenericArrayImplOdd { - GenericArrayImplOdd { - parent1: self.parent1.clone(), - parent2: self.parent2.clone(), - data: self.data.clone(), - } - } -} - -impl Copy for GenericArrayImplOdd {} - -unsafe impl> ArrayLength for UInt { - #[doc(hidden)] - type ArrayType = GenericArrayImplEven; -} - -unsafe impl> ArrayLength for UInt { - #[doc(hidden)] - type ArrayType = GenericArrayImplOdd; -} - -/// Struct representing a generic array - `GenericArray` works like [T; N] -#[allow(dead_code)] -pub struct GenericArray> { - data: U::ArrayType, -} - -unsafe impl> Send for GenericArray {} -unsafe impl> Sync for GenericArray {} - -impl Deref for GenericArray -where - N: ArrayLength, -{ - type Target = [T]; - - #[inline(always)] - fn deref(&self) -> &[T] { - unsafe { slice::from_raw_parts(self as *const Self as *const T, N::to_usize()) } - } -} - -impl DerefMut for GenericArray -where - N: ArrayLength, -{ - #[inline(always)] - fn deref_mut(&mut self) -> &mut [T] { - unsafe { slice::from_raw_parts_mut(self as *mut Self as *mut T, N::to_usize()) } - } -} - -/// Creates an array one element at a time using a mutable iterator -/// you can write to with `ptr::write`. -/// -/// Incremenent the position while iterating to mark off created elements, -/// which will be dropped if `into_inner` is not called. -#[doc(hidden)] -pub struct ArrayBuilder> { - array: ManuallyDrop>, - position: usize, -} - -impl> ArrayBuilder { - #[doc(hidden)] - #[inline] - pub unsafe fn new() -> ArrayBuilder { - ArrayBuilder { - array: ManuallyDrop::new(mem::uninitialized()), - position: 0, - } - } - - /// Creates a mutable iterator for writing to the array using `ptr::write`. - /// - /// Increment the position value given as a mutable reference as you iterate - /// to mark how many elements have been created. - #[doc(hidden)] - #[inline] - pub unsafe fn iter_position(&mut self) -> (slice::IterMut, &mut usize) { - (self.array.iter_mut(), &mut self.position) - } - - /// When done writing (assuming all elements have been written to), - /// get the inner array. - #[doc(hidden)] - #[inline] - pub unsafe fn into_inner(self) -> GenericArray { - let array = ptr::read(&self.array); - - mem::forget(self); - - ManuallyDrop::into_inner(array) - } -} - -impl> Drop for ArrayBuilder { - fn drop(&mut self) { - for value in &mut self.array[..self.position] { - unsafe { - ptr::drop_in_place(value); - } - } - } -} - -/// Consumes an array. -/// -/// Increment the position while iterating and any leftover elements -/// will be dropped if position does not go to N -#[doc(hidden)] -pub struct ArrayConsumer> { - array: ManuallyDrop>, - position: usize, -} - -impl> ArrayConsumer { - #[doc(hidden)] - #[inline] - pub unsafe fn new(array: GenericArray) -> ArrayConsumer { - ArrayConsumer { - array: ManuallyDrop::new(array), - position: 0, - } - } - - /// Creates an iterator and mutable reference to the internal position - /// to keep track of consumed elements. - /// - /// Increment the position as you iterate to mark off consumed elements - #[doc(hidden)] - #[inline] - pub unsafe fn iter_position(&mut self) -> (slice::Iter, &mut usize) { - (self.array.iter(), &mut self.position) - } -} - -impl> Drop for ArrayConsumer { - fn drop(&mut self) { - for value in &mut self.array[self.position..N::to_usize()] { - unsafe { - ptr::drop_in_place(value); - } - } - } -} - -impl<'a, T: 'a, N> IntoIterator for &'a GenericArray -where - N: ArrayLength, -{ - type IntoIter = slice::Iter<'a, T>; - type Item = &'a T; - - fn into_iter(self: &'a GenericArray) -> Self::IntoIter { - self.as_slice().iter() - } -} - -impl<'a, T: 'a, N> IntoIterator for &'a mut GenericArray -where - N: ArrayLength, -{ - type IntoIter = slice::IterMut<'a, T>; - type Item = &'a mut T; - - fn into_iter(self: &'a mut GenericArray) -> Self::IntoIter { - self.as_mut_slice().iter_mut() - } -} - -impl FromIterator for GenericArray -where - N: ArrayLength, -{ - fn from_iter(iter: I) -> GenericArray - where - I: IntoIterator, - { - unsafe { - let mut destination = ArrayBuilder::new(); - - { - let (destination_iter, position) = destination.iter_position(); - - for (src, dst) in iter.into_iter().zip(destination_iter) { - ptr::write(dst, src); - - *position += 1; - } - } - - if destination.position < N::to_usize() { - from_iter_length_fail(destination.position, N::to_usize()); - } - - destination.into_inner() - } - } -} - -#[inline(never)] -#[cold] -fn from_iter_length_fail(length: usize, expected: usize) -> ! { - panic!( - "GenericArray::from_iter received {} elements but expected {}", - length, expected - ); -} - -unsafe impl GenericSequence for GenericArray -where - N: ArrayLength, - Self: IntoIterator, -{ - type Length = N; - type Sequence = Self; - - fn generate(mut f: F) -> GenericArray - where - F: FnMut(usize) -> T, - { - unsafe { - let mut destination = ArrayBuilder::new(); - - { - let (destination_iter, position) = destination.iter_position(); - - for (i, dst) in destination_iter.enumerate() { - ptr::write(dst, f(i)); - - *position += 1; - } - } - - destination.into_inner() - } - } - - #[doc(hidden)] - fn inverted_zip( - self, - lhs: GenericArray, - mut f: F, - ) -> MappedSequence, B, U> - where - GenericArray: - GenericSequence + MappedGenericSequence, - Self: MappedGenericSequence, - Self::Length: ArrayLength + ArrayLength, - F: FnMut(B, Self::Item) -> U, - { - unsafe { - let mut left = ArrayConsumer::new(lhs); - let mut right = ArrayConsumer::new(self); - - let (left_array_iter, left_position) = left.iter_position(); - let (right_array_iter, right_position) = right.iter_position(); - - FromIterator::from_iter(left_array_iter.zip(right_array_iter).map(|(l, r)| { - let left_value = ptr::read(l); - let right_value = ptr::read(r); - - *left_position += 1; - *right_position += 1; - - f(left_value, right_value) - })) - } - } - - #[doc(hidden)] - fn inverted_zip2(self, lhs: Lhs, mut f: F) -> MappedSequence - where - Lhs: GenericSequence + MappedGenericSequence, - Self: MappedGenericSequence, - Self::Length: ArrayLength + ArrayLength, - F: FnMut(Lhs::Item, Self::Item) -> U, - { - unsafe { - let mut right = ArrayConsumer::new(self); - - let (right_array_iter, right_position) = right.iter_position(); - - FromIterator::from_iter( - lhs.into_iter() - .zip(right_array_iter) - .map(|(left_value, r)| { - let right_value = ptr::read(r); - - *right_position += 1; - - f(left_value, right_value) - }), - ) - } - } -} - -unsafe impl MappedGenericSequence for GenericArray -where - N: ArrayLength + ArrayLength, - GenericArray: GenericSequence, -{ - type Mapped = GenericArray; -} - -unsafe impl FunctionalSequence for GenericArray -where - N: ArrayLength, - Self: GenericSequence, -{ - fn map(self, mut f: F) -> MappedSequence - where - Self::Length: ArrayLength, - Self: MappedGenericSequence, - F: FnMut(T) -> U, - { - unsafe { - let mut source = ArrayConsumer::new(self); - - let (array_iter, position) = source.iter_position(); - - FromIterator::from_iter(array_iter.map(|src| { - let value = ptr::read(src); - - *position += 1; - - f(value) - })) - } - } - - #[inline] - fn zip(self, rhs: Rhs, f: F) -> MappedSequence - where - Self: MappedGenericSequence, - Rhs: MappedGenericSequence>, - Self::Length: ArrayLength + ArrayLength, - Rhs: GenericSequence, - F: FnMut(T, Rhs::Item) -> U, - { - rhs.inverted_zip(self, f) - } - - fn fold(self, init: U, mut f: F) -> U - where - F: FnMut(U, T) -> U, - { - unsafe { - let mut source = ArrayConsumer::new(self); - - let (array_iter, position) = source.iter_position(); - - array_iter.fold(init, |acc, src| { - let value = ptr::read(src); - - *position += 1; - - f(acc, value) - }) - } - } -} - -impl GenericArray -where - N: ArrayLength, -{ - /// Extracts a slice containing the entire array. - #[inline] - pub fn as_slice(&self) -> &[T] { - self.deref() - } - - /// Extracts a mutable slice containing the entire array. - #[inline] - pub fn as_mut_slice(&mut self) -> &mut [T] { - self.deref_mut() - } - - /// Converts slice to a generic array reference with inferred length; - /// - /// Length of the slice must be equal to the length of the array. - #[inline] - pub fn from_slice(slice: &[T]) -> &GenericArray { - slice.into() - } - - /// Converts mutable slice to a mutable generic array reference - /// - /// Length of the slice must be equal to the length of the array. - #[inline] - pub fn from_mut_slice(slice: &mut [T]) -> &mut GenericArray { - slice.into() - } -} - -impl<'a, T, N: ArrayLength> From<&'a [T]> for &'a GenericArray { - /// Converts slice to a generic array reference with inferred length; - /// - /// Length of the slice must be equal to the length of the array. - #[inline] - fn from(slice: &[T]) -> &GenericArray { - assert_eq!(slice.len(), N::to_usize()); - - unsafe { &*(slice.as_ptr() as *const GenericArray) } - } -} - -impl<'a, T, N: ArrayLength> From<&'a mut [T]> for &'a mut GenericArray { - /// Converts mutable slice to a mutable generic array reference - /// - /// Length of the slice must be equal to the length of the array. - #[inline] - fn from(slice: &mut [T]) -> &mut GenericArray { - assert_eq!(slice.len(), N::to_usize()); - - unsafe { &mut *(slice.as_mut_ptr() as *mut GenericArray) } - } -} - -impl GenericArray -where - N: ArrayLength, -{ - /// Construct a `GenericArray` from a slice by cloning its content - /// - /// Length of the slice must be equal to the length of the array - #[inline] - pub fn clone_from_slice(list: &[T]) -> GenericArray { - Self::from_exact_iter(list.iter().cloned()) - .expect("Slice must be the same length as the array") - } -} - -impl GenericArray -where - N: ArrayLength, -{ - /// Creates a new `GenericArray` instance from an iterator with a known exact size. - /// - /// Returns `None` if the size is not equal to the number of elements in the `GenericArray`. - pub fn from_exact_iter(iter: I) -> Option - where - I: IntoIterator, - ::IntoIter: ExactSizeIterator, - { - let iter = iter.into_iter(); - - if iter.len() == N::to_usize() { - unsafe { - let mut destination = ArrayBuilder::new(); - - { - let (destination_iter, position) = destination.iter_position(); - - for (dst, src) in destination_iter.zip(iter.into_iter()) { - ptr::write(dst, src); - - *position += 1; - } - } - - Some(destination.into_inner()) - } - } else { - None - } - } -} - -/// A reimplementation of the `transmute` function, avoiding problems -/// when the compiler can't prove equal sizes. -#[inline] -#[doc(hidden)] -pub unsafe fn transmute(a: A) -> B { - let b = ::core::ptr::read(&a as *const A as *const B); - ::core::mem::forget(a); - b -} - -#[cfg(test)] -mod test { - // Compile with: - // cargo rustc --lib --profile test --release -- - // -C target-cpu=native -C opt-level=3 --emit asm - // and view the assembly to make sure test_assembly generates - // SIMD instructions instead of a niave loop. - - #[inline(never)] - pub fn black_box(val: T) -> T { - use core::{mem, ptr}; - - let ret = unsafe { ptr::read_volatile(&val) }; - mem::forget(val); - ret - } - - #[test] - fn test_assembly() { - use functional::*; - - let a = black_box(arr![i32; 1, 3, 5, 7]); - let b = black_box(arr![i32; 2, 4, 6, 8]); - - let c = (&a).zip(b, |l, r| l + r); - - let d = a.fold(0, |a, x| a + x); - - assert_eq!(c, arr![i32; 3, 7, 11, 15]); - - assert_eq!(d, 16); - } -} +//! This crate implements a structure that can be used as a generic array type.use +//! Core Rust array types `[T; N]` can't be used generically with +//! respect to `N`, so for example this: +//! +//! ```{should_fail} +//! struct Foo { +//! data: [T; N] +//! } +//! ``` +//! +//! won't work. +//! +//! **generic-array** exports a `GenericArray` type, which lets +//! the above be implemented as: +//! +//! ``` +//! # use generic_array::{ArrayLength, GenericArray}; +//! struct Foo> { +//! data: GenericArray +//! } +//! ``` +//! +//! The `ArrayLength` trait is implemented by default for +//! [unsigned integer types](../typenum/uint/index.html) from +//! [typenum](../typenum/index.html). +//! +//! For ease of use, an `arr!` macro is provided - example below: +//! +//! ``` +//! # #[macro_use] +//! # extern crate generic_array; +//! # extern crate typenum; +//! # fn main() { +//! let array = arr![u32; 1, 2, 3]; +//! assert_eq!(array[2], 3); +//! # } +//! ``` + +#![deny(missing_docs)] +#![no_std] + +#[cfg(feature = "serde")] +extern crate serde; + +#[cfg(test)] +extern crate bincode; + +pub extern crate typenum; + +mod hex; +mod impls; + +#[cfg(feature = "serde")] +pub mod impl_serde; + +use core::iter::FromIterator; +use core::marker::PhantomData; +use core::mem::ManuallyDrop; +use core::ops::{Deref, DerefMut}; +use core::{mem, ptr, slice}; +use typenum::bit::{B0, B1}; +use typenum::uint::{UInt, UTerm, Unsigned}; + +#[cfg_attr(test, macro_use)] +pub mod arr; +pub mod functional; +pub mod iter; +pub mod sequence; + +use functional::*; +pub use iter::GenericArrayIter; +use sequence::*; + +/// Trait making `GenericArray` work, marking types to be used as length of an array +pub unsafe trait ArrayLength: Unsigned { + /// Associated type representing the array type for the number + type ArrayType; +} + +unsafe impl ArrayLength for UTerm { + #[doc(hidden)] + type ArrayType = (); +} + +/// Internal type used to generate a struct of appropriate size +#[allow(dead_code)] +#[repr(C)] +#[doc(hidden)] +pub struct GenericArrayImplEven { + parent1: U, + parent2: U, + _marker: PhantomData, +} + +impl Clone for GenericArrayImplEven { + fn clone(&self) -> GenericArrayImplEven { + GenericArrayImplEven { + parent1: self.parent1.clone(), + parent2: self.parent2.clone(), + _marker: PhantomData, + } + } +} + +impl Copy for GenericArrayImplEven {} + +/// Internal type used to generate a struct of appropriate size +#[allow(dead_code)] +#[repr(C)] +#[doc(hidden)] +pub struct GenericArrayImplOdd { + parent1: U, + parent2: U, + data: T, +} + +impl Clone for GenericArrayImplOdd { + fn clone(&self) -> GenericArrayImplOdd { + GenericArrayImplOdd { + parent1: self.parent1.clone(), + parent2: self.parent2.clone(), + data: self.data.clone(), + } + } +} + +impl Copy for GenericArrayImplOdd {} + +unsafe impl> ArrayLength for UInt { + #[doc(hidden)] + type ArrayType = GenericArrayImplEven; +} + +unsafe impl> ArrayLength for UInt { + #[doc(hidden)] + type ArrayType = GenericArrayImplOdd; +} + +/// Struct representing a generic array - `GenericArray` works like [T; N] +#[allow(dead_code)] +pub struct GenericArray> { + data: U::ArrayType, +} + +unsafe impl> Send for GenericArray {} +unsafe impl> Sync for GenericArray {} + +impl Deref for GenericArray +where + N: ArrayLength, +{ + type Target = [T]; + + #[inline(always)] + fn deref(&self) -> &[T] { + unsafe { slice::from_raw_parts(self as *const Self as *const T, N::to_usize()) } + } +} + +impl DerefMut for GenericArray +where + N: ArrayLength, +{ + #[inline(always)] + fn deref_mut(&mut self) -> &mut [T] { + unsafe { slice::from_raw_parts_mut(self as *mut Self as *mut T, N::to_usize()) } + } +} + +/// Creates an array one element at a time using a mutable iterator +/// you can write to with `ptr::write`. +/// +/// Incremenent the position while iterating to mark off created elements, +/// which will be dropped if `into_inner` is not called. +#[doc(hidden)] +pub struct ArrayBuilder> { + array: ManuallyDrop>, + position: usize, +} + +impl> ArrayBuilder { + #[doc(hidden)] + #[inline] + pub unsafe fn new() -> ArrayBuilder { + ArrayBuilder { + array: ManuallyDrop::new(mem::uninitialized()), + position: 0, + } + } + + /// Creates a mutable iterator for writing to the array using `ptr::write`. + /// + /// Increment the position value given as a mutable reference as you iterate + /// to mark how many elements have been created. + #[doc(hidden)] + #[inline] + pub unsafe fn iter_position(&mut self) -> (slice::IterMut, &mut usize) { + (self.array.iter_mut(), &mut self.position) + } + + /// When done writing (assuming all elements have been written to), + /// get the inner array. + #[doc(hidden)] + #[inline] + pub unsafe fn into_inner(self) -> GenericArray { + let array = ptr::read(&self.array); + + mem::forget(self); + + ManuallyDrop::into_inner(array) + } +} + +impl> Drop for ArrayBuilder { + fn drop(&mut self) { + for value in &mut self.array[..self.position] { + unsafe { + ptr::drop_in_place(value); + } + } + } +} + +/// Consumes an array. +/// +/// Increment the position while iterating and any leftover elements +/// will be dropped if position does not go to N +#[doc(hidden)] +pub struct ArrayConsumer> { + array: ManuallyDrop>, + position: usize, +} + +impl> ArrayConsumer { + #[doc(hidden)] + #[inline] + pub unsafe fn new(array: GenericArray) -> ArrayConsumer { + ArrayConsumer { + array: ManuallyDrop::new(array), + position: 0, + } + } + + /// Creates an iterator and mutable reference to the internal position + /// to keep track of consumed elements. + /// + /// Increment the position as you iterate to mark off consumed elements + #[doc(hidden)] + #[inline] + pub unsafe fn iter_position(&mut self) -> (slice::Iter, &mut usize) { + (self.array.iter(), &mut self.position) + } +} + +impl> Drop for ArrayConsumer { + fn drop(&mut self) { + for value in &mut self.array[self.position..N::to_usize()] { + unsafe { + ptr::drop_in_place(value); + } + } + } +} + +impl<'a, T: 'a, N> IntoIterator for &'a GenericArray +where + N: ArrayLength, +{ + type IntoIter = slice::Iter<'a, T>; + type Item = &'a T; + + fn into_iter(self: &'a GenericArray) -> Self::IntoIter { + self.as_slice().iter() + } +} + +impl<'a, T: 'a, N> IntoIterator for &'a mut GenericArray +where + N: ArrayLength, +{ + type IntoIter = slice::IterMut<'a, T>; + type Item = &'a mut T; + + fn into_iter(self: &'a mut GenericArray) -> Self::IntoIter { + self.as_mut_slice().iter_mut() + } +} + +impl FromIterator for GenericArray +where + N: ArrayLength, +{ + fn from_iter(iter: I) -> GenericArray + where + I: IntoIterator, + { + unsafe { + let mut destination = ArrayBuilder::new(); + + { + let (destination_iter, position) = destination.iter_position(); + + for (src, dst) in iter.into_iter().zip(destination_iter) { + ptr::write(dst, src); + + *position += 1; + } + } + + if destination.position < N::to_usize() { + from_iter_length_fail(destination.position, N::to_usize()); + } + + destination.into_inner() + } + } +} + +#[inline(never)] +#[cold] +fn from_iter_length_fail(length: usize, expected: usize) -> ! { + panic!( + "GenericArray::from_iter received {} elements but expected {}", + length, expected + ); +} + +unsafe impl GenericSequence for GenericArray +where + N: ArrayLength, + Self: IntoIterator, +{ + type Length = N; + type Sequence = Self; + + fn generate(mut f: F) -> GenericArray + where + F: FnMut(usize) -> T, + { + unsafe { + let mut destination = ArrayBuilder::new(); + + { + let (destination_iter, position) = destination.iter_position(); + + for (i, dst) in destination_iter.enumerate() { + ptr::write(dst, f(i)); + + *position += 1; + } + } + + destination.into_inner() + } + } + + #[doc(hidden)] + fn inverted_zip( + self, + lhs: GenericArray, + mut f: F, + ) -> MappedSequence, B, U> + where + GenericArray: + GenericSequence + MappedGenericSequence, + Self: MappedGenericSequence, + Self::Length: ArrayLength + ArrayLength, + F: FnMut(B, Self::Item) -> U, + { + unsafe { + let mut left = ArrayConsumer::new(lhs); + let mut right = ArrayConsumer::new(self); + + let (left_array_iter, left_position) = left.iter_position(); + let (right_array_iter, right_position) = right.iter_position(); + + FromIterator::from_iter(left_array_iter.zip(right_array_iter).map(|(l, r)| { + let left_value = ptr::read(l); + let right_value = ptr::read(r); + + *left_position += 1; + *right_position += 1; + + f(left_value, right_value) + })) + } + } + + #[doc(hidden)] + fn inverted_zip2(self, lhs: Lhs, mut f: F) -> MappedSequence + where + Lhs: GenericSequence + MappedGenericSequence, + Self: MappedGenericSequence, + Self::Length: ArrayLength + ArrayLength, + F: FnMut(Lhs::Item, Self::Item) -> U, + { + unsafe { + let mut right = ArrayConsumer::new(self); + + let (right_array_iter, right_position) = right.iter_position(); + + FromIterator::from_iter( + lhs.into_iter() + .zip(right_array_iter) + .map(|(left_value, r)| { + let right_value = ptr::read(r); + + *right_position += 1; + + f(left_value, right_value) + }), + ) + } + } +} + +unsafe impl MappedGenericSequence for GenericArray +where + N: ArrayLength + ArrayLength, + GenericArray: GenericSequence, +{ + type Mapped = GenericArray; +} + +unsafe impl FunctionalSequence for GenericArray +where + N: ArrayLength, + Self: GenericSequence, +{ + fn map(self, mut f: F) -> MappedSequence + where + Self::Length: ArrayLength, + Self: MappedGenericSequence, + F: FnMut(T) -> U, + { + unsafe { + let mut source = ArrayConsumer::new(self); + + let (array_iter, position) = source.iter_position(); + + FromIterator::from_iter(array_iter.map(|src| { + let value = ptr::read(src); + + *position += 1; + + f(value) + })) + } + } + + #[inline] + fn zip(self, rhs: Rhs, f: F) -> MappedSequence + where + Self: MappedGenericSequence, + Rhs: MappedGenericSequence>, + Self::Length: ArrayLength + ArrayLength, + Rhs: GenericSequence, + F: FnMut(T, Rhs::Item) -> U, + { + rhs.inverted_zip(self, f) + } + + fn fold(self, init: U, mut f: F) -> U + where + F: FnMut(U, T) -> U, + { + unsafe { + let mut source = ArrayConsumer::new(self); + + let (array_iter, position) = source.iter_position(); + + array_iter.fold(init, |acc, src| { + let value = ptr::read(src); + + *position += 1; + + f(acc, value) + }) + } + } +} + +impl GenericArray +where + N: ArrayLength, +{ + /// Extracts a slice containing the entire array. + #[inline] + pub fn as_slice(&self) -> &[T] { + self.deref() + } + + /// Extracts a mutable slice containing the entire array. + #[inline] + pub fn as_mut_slice(&mut self) -> &mut [T] { + self.deref_mut() + } + + /// Converts slice to a generic array reference with inferred length; + /// + /// Length of the slice must be equal to the length of the array. + #[inline] + pub fn from_slice(slice: &[T]) -> &GenericArray { + slice.into() + } + + /// Converts mutable slice to a mutable generic array reference + /// + /// Length of the slice must be equal to the length of the array. + #[inline] + pub fn from_mut_slice(slice: &mut [T]) -> &mut GenericArray { + slice.into() + } +} + +impl<'a, T, N: ArrayLength> From<&'a [T]> for &'a GenericArray { + /// Converts slice to a generic array reference with inferred length; + /// + /// Length of the slice must be equal to the length of the array. + #[inline] + fn from(slice: &[T]) -> &GenericArray { + assert_eq!(slice.len(), N::to_usize()); + + unsafe { &*(slice.as_ptr() as *const GenericArray) } + } +} + +impl<'a, T, N: ArrayLength> From<&'a mut [T]> for &'a mut GenericArray { + /// Converts mutable slice to a mutable generic array reference + /// + /// Length of the slice must be equal to the length of the array. + #[inline] + fn from(slice: &mut [T]) -> &mut GenericArray { + assert_eq!(slice.len(), N::to_usize()); + + unsafe { &mut *(slice.as_mut_ptr() as *mut GenericArray) } + } +} + +impl GenericArray +where + N: ArrayLength, +{ + /// Construct a `GenericArray` from a slice by cloning its content + /// + /// Length of the slice must be equal to the length of the array + #[inline] + pub fn clone_from_slice(list: &[T]) -> GenericArray { + Self::from_exact_iter(list.iter().cloned()) + .expect("Slice must be the same length as the array") + } +} + +impl GenericArray +where + N: ArrayLength, +{ + /// Creates a new `GenericArray` instance from an iterator with a known exact size. + /// + /// Returns `None` if the size is not equal to the number of elements in the `GenericArray`. + pub fn from_exact_iter(iter: I) -> Option + where + I: IntoIterator, + ::IntoIter: ExactSizeIterator, + { + let iter = iter.into_iter(); + + if iter.len() == N::to_usize() { + unsafe { + let mut destination = ArrayBuilder::new(); + + { + let (destination_iter, position) = destination.iter_position(); + + for (dst, src) in destination_iter.zip(iter.into_iter()) { + ptr::write(dst, src); + + *position += 1; + } + } + + Some(destination.into_inner()) + } + } else { + None + } + } +} + +/// A reimplementation of the `transmute` function, avoiding problems +/// when the compiler can't prove equal sizes. +#[inline] +#[doc(hidden)] +pub unsafe fn transmute(a: A) -> B { + let b = ::core::ptr::read(&a as *const A as *const B); + ::core::mem::forget(a); + b +} + +#[cfg(test)] +mod test { + // Compile with: + // cargo rustc --lib --profile test --release -- + // -C target-cpu=native -C opt-level=3 --emit asm + // and view the assembly to make sure test_assembly generates + // SIMD instructions instead of a niave loop. + + #[inline(never)] + pub fn black_box(val: T) -> T { + use core::{mem, ptr}; + + let ret = unsafe { ptr::read_volatile(&val) }; + mem::forget(val); + ret + } + + #[test] + fn test_assembly() { + use functional::*; + + let a = black_box(arr![i32; 1, 3, 5, 7]); + let b = black_box(arr![i32; 2, 4, 6, 8]); + + let c = (&a).zip(b, |l, r| l + r); + + let d = a.fold(0, |a, x| a + x); + + assert_eq!(c, arr![i32; 3, 7, 11, 15]); + + assert_eq!(d, 16); + } +} diff --git a/vendor/generic-array-0.12.3/src/sequence.rs b/vendor/generic-array-0.12.4/src/sequence.rs similarity index 96% rename from vendor/generic-array-0.12.3/src/sequence.rs rename to vendor/generic-array-0.12.4/src/sequence.rs index cec6601ba3..7b928abdae 100644 --- a/vendor/generic-array-0.12.3/src/sequence.rs +++ b/vendor/generic-array-0.12.4/src/sequence.rs @@ -1,320 +1,320 @@ -//! Useful traits for manipulating sequences of data stored in `GenericArray`s - -use super::*; -use core::{mem, ptr}; -use core::ops::{Add, Sub}; -use typenum::operator_aliases::*; - -/// Defines some sequence with an associated length and iteration capabilities. -/// -/// This is useful for passing N-length generic arrays as generics. -pub unsafe trait GenericSequence: Sized + IntoIterator { - /// `GenericArray` associated length - type Length: ArrayLength; - - /// Concrete sequence type used in conjuction with reference implementations of `GenericSequence` - type Sequence: GenericSequence + FromIterator; - - /// Initializes a new sequence instance using the given function. - /// - /// If the generator function panics while initializing the sequence, - /// any already initialized elements will be dropped. - fn generate(f: F) -> Self::Sequence - where - F: FnMut(usize) -> T; - - #[doc(hidden)] - fn inverted_zip( - self, - lhs: GenericArray, - mut f: F, - ) -> MappedSequence, B, U> - where - GenericArray: GenericSequence - + MappedGenericSequence, - Self: MappedGenericSequence, - Self::Length: ArrayLength + ArrayLength, - F: FnMut(B, Self::Item) -> U, - { - unsafe { - let mut left = ArrayConsumer::new(lhs); - - let (left_array_iter, left_position) = left.iter_position(); - - FromIterator::from_iter( - left_array_iter - .zip(self.into_iter()) - .map(|(l, right_value)| { - let left_value = ptr::read(l); - - *left_position += 1; - - f(left_value, right_value) - }) - ) - } - } - - #[doc(hidden)] - fn inverted_zip2(self, lhs: Lhs, mut f: F) -> MappedSequence - where - Lhs: GenericSequence + MappedGenericSequence, - Self: MappedGenericSequence, - Self::Length: ArrayLength + ArrayLength, - F: FnMut(Lhs::Item, Self::Item) -> U, - { - FromIterator::from_iter(lhs.into_iter().zip(self.into_iter()).map(|(l, r)| f(l, r))) - } -} - -/// Accessor for `GenericSequence` item type, which is really `IntoIterator::Item` -/// -/// For deeply nested generic mapped sequence types, like shown in `tests/generics.rs`, -/// this can be useful for keeping things organized. -pub type SequenceItem = ::Item; - -unsafe impl<'a, T: 'a, S: GenericSequence> GenericSequence for &'a S -where - &'a S: IntoIterator, -{ - type Length = S::Length; - type Sequence = S::Sequence; - - #[inline] - fn generate(f: F) -> Self::Sequence - where - F: FnMut(usize) -> T, - { - S::generate(f) - } -} - -unsafe impl<'a, T: 'a, S: GenericSequence> GenericSequence for &'a mut S -where - &'a mut S: IntoIterator, -{ - type Length = S::Length; - type Sequence = S::Sequence; - - #[inline] - fn generate(f: F) -> Self::Sequence - where - F: FnMut(usize) -> T, - { - S::generate(f) - } -} - -/// Defines any `GenericSequence` which can be lengthened or extended by appending -/// or prepending an element to it. -/// -/// Any lengthened sequence can be shortened back to the original using `pop_front` or `pop_back` -pub unsafe trait Lengthen: Sized + GenericSequence { - /// `GenericSequence` that has one more element than `Self` - type Longer: Shorten; - - /// Returns a new array with the given element appended to the end of it. - /// - /// Example: - /// - /// ```ignore - /// let a = arr![i32; 1, 2, 3]; - /// - /// let b = a.append(4); - /// - /// assert_eq!(b, arr![i32; 1, 2, 3, 4]); - /// ``` - fn append(self, last: T) -> Self::Longer; - - /// Returns a new array with the given element prepended to the front of it. - /// - /// Example: - /// - /// ```ignore - /// let a = arr![i32; 1, 2, 3]; - /// - /// let b = a.prepend(4); - /// - /// assert_eq!(b, arr![i32; 4, 1, 2, 3]); - /// ``` - fn prepend(self, first: T) -> Self::Longer; -} - -/// Defines a `GenericSequence` which can be shortened by removing the first or last element from it. -/// -/// Additionally, any shortened sequence can be lengthened by -/// appending or prepending an element to it. -pub unsafe trait Shorten: Sized + GenericSequence { - /// `GenericSequence` that has one less element than `Self` - type Shorter: Lengthen; - - /// Returns a new array without the last element, and the last element. - /// - /// Example: - /// - /// ```ignore - /// let a = arr![i32; 1, 2, 3, 4]; - /// - /// let (init, last) = a.pop_back(); - /// - /// assert_eq!(init, arr![i32; 1, 2, 3]); - /// assert_eq!(last, 4); - /// ``` - fn pop_back(self) -> (Self::Shorter, T); - - /// Returns a new array without the first element, and the first element. - /// Example: - /// - /// ```ignore - /// let a = arr![i32; 1, 2, 3, 4]; - /// - /// let (head, tail) = a.pop_front(); - /// - /// assert_eq!(head, 1); - /// assert_eq!(tail, arr![i32; 2, 3, 4]); - /// ``` - fn pop_front(self) -> (T, Self::Shorter); -} - -unsafe impl> Lengthen for GenericArray -where - N: Add, - Add1: ArrayLength, - Add1: Sub, - Sub1>: ArrayLength, -{ - type Longer = GenericArray>; - - fn append(self, last: T) -> Self::Longer { - let mut longer: Self::Longer = unsafe { mem::uninitialized() }; - - unsafe { - ptr::write(longer.as_mut_ptr() as *mut _, self); - ptr::write(&mut longer[N::to_usize()], last); - } - - longer - } - - fn prepend(self, first: T) -> Self::Longer { - let mut longer: Self::Longer = unsafe { mem::uninitialized() }; - - let longer_ptr = longer.as_mut_ptr(); - - unsafe { - ptr::write(longer_ptr as *mut _, first); - ptr::write(longer_ptr.offset(1) as *mut _, self); - } - - longer - } -} - -unsafe impl> Shorten for GenericArray -where - N: Sub, - Sub1: ArrayLength, - Sub1: Add, - Add1>: ArrayLength, -{ - type Shorter = GenericArray>; - - fn pop_back(self) -> (Self::Shorter, T) { - let init_ptr = self.as_ptr(); - let last_ptr = unsafe { init_ptr.offset(Sub1::::to_usize() as isize) }; - - let init = unsafe { ptr::read(init_ptr as _) }; - let last = unsafe { ptr::read(last_ptr as _) }; - - mem::forget(self); - - (init, last) - } - - fn pop_front(self) -> (T, Self::Shorter) { - let head_ptr = self.as_ptr(); - let tail_ptr = unsafe { head_ptr.offset(1) }; - - let head = unsafe { ptr::read(head_ptr as _) }; - let tail = unsafe { ptr::read(tail_ptr as _) }; - - mem::forget(self); - - (head, tail) - } -} - -/// Defines a `GenericSequence` that can be split into two parts at a given pivot index. -pub unsafe trait Split: GenericSequence -where - K: ArrayLength, -{ - /// First part of the resulting split array - type First: GenericSequence; - /// Second part of the resulting split array - type Second: GenericSequence; - - /// Splits an array at the given index, returning the separate parts of the array. - fn split(self) -> (Self::First, Self::Second); -} - -unsafe impl Split for GenericArray -where - N: ArrayLength, - K: ArrayLength, - N: Sub, - Diff: ArrayLength, -{ - type First = GenericArray; - type Second = GenericArray>; - - fn split(self) -> (Self::First, Self::Second) { - let head_ptr = self.as_ptr(); - let tail_ptr = unsafe { head_ptr.offset(K::to_usize() as isize) }; - - let head = unsafe { ptr::read(head_ptr as _) }; - let tail = unsafe { ptr::read(tail_ptr as _) }; - - mem::forget(self); - - (head, tail) - } -} - -/// Defines `GenericSequence`s which can be joined together, forming a larger array. -pub unsafe trait Concat: GenericSequence -where - M: ArrayLength, -{ - /// Sequence to be concatenated with `self` - type Rest: GenericSequence; - - /// Resulting sequence formed by the concatenation. - type Output: GenericSequence; - - /// Concatenate, or join, two sequences. - fn concat(self, rest: Self::Rest) -> Self::Output; -} - -unsafe impl Concat for GenericArray -where - N: ArrayLength + Add, - M: ArrayLength, - Sum: ArrayLength, -{ - type Rest = GenericArray; - type Output = GenericArray>; - - fn concat(self, rest: Self::Rest) -> Self::Output { - let mut output: Self::Output = unsafe { mem::uninitialized() }; - - let output_ptr = output.as_mut_ptr(); - - unsafe { - ptr::write(output_ptr as *mut _, self); - ptr::write(output_ptr.offset(N::to_usize() as isize) as *mut _, rest); - } - - output - } -} +//! Useful traits for manipulating sequences of data stored in `GenericArray`s + +use super::*; +use core::{mem, ptr}; +use core::ops::{Add, Sub}; +use typenum::operator_aliases::*; + +/// Defines some sequence with an associated length and iteration capabilities. +/// +/// This is useful for passing N-length generic arrays as generics. +pub unsafe trait GenericSequence: Sized + IntoIterator { + /// `GenericArray` associated length + type Length: ArrayLength; + + /// Concrete sequence type used in conjuction with reference implementations of `GenericSequence` + type Sequence: GenericSequence + FromIterator; + + /// Initializes a new sequence instance using the given function. + /// + /// If the generator function panics while initializing the sequence, + /// any already initialized elements will be dropped. + fn generate(f: F) -> Self::Sequence + where + F: FnMut(usize) -> T; + + #[doc(hidden)] + fn inverted_zip( + self, + lhs: GenericArray, + mut f: F, + ) -> MappedSequence, B, U> + where + GenericArray: GenericSequence + + MappedGenericSequence, + Self: MappedGenericSequence, + Self::Length: ArrayLength + ArrayLength, + F: FnMut(B, Self::Item) -> U, + { + unsafe { + let mut left = ArrayConsumer::new(lhs); + + let (left_array_iter, left_position) = left.iter_position(); + + FromIterator::from_iter( + left_array_iter + .zip(self.into_iter()) + .map(|(l, right_value)| { + let left_value = ptr::read(l); + + *left_position += 1; + + f(left_value, right_value) + }) + ) + } + } + + #[doc(hidden)] + fn inverted_zip2(self, lhs: Lhs, mut f: F) -> MappedSequence + where + Lhs: GenericSequence + MappedGenericSequence, + Self: MappedGenericSequence, + Self::Length: ArrayLength + ArrayLength, + F: FnMut(Lhs::Item, Self::Item) -> U, + { + FromIterator::from_iter(lhs.into_iter().zip(self.into_iter()).map(|(l, r)| f(l, r))) + } +} + +/// Accessor for `GenericSequence` item type, which is really `IntoIterator::Item` +/// +/// For deeply nested generic mapped sequence types, like shown in `tests/generics.rs`, +/// this can be useful for keeping things organized. +pub type SequenceItem = ::Item; + +unsafe impl<'a, T: 'a, S: GenericSequence> GenericSequence for &'a S +where + &'a S: IntoIterator, +{ + type Length = S::Length; + type Sequence = S::Sequence; + + #[inline] + fn generate(f: F) -> Self::Sequence + where + F: FnMut(usize) -> T, + { + S::generate(f) + } +} + +unsafe impl<'a, T: 'a, S: GenericSequence> GenericSequence for &'a mut S +where + &'a mut S: IntoIterator, +{ + type Length = S::Length; + type Sequence = S::Sequence; + + #[inline] + fn generate(f: F) -> Self::Sequence + where + F: FnMut(usize) -> T, + { + S::generate(f) + } +} + +/// Defines any `GenericSequence` which can be lengthened or extended by appending +/// or prepending an element to it. +/// +/// Any lengthened sequence can be shortened back to the original using `pop_front` or `pop_back` +pub unsafe trait Lengthen: Sized + GenericSequence { + /// `GenericSequence` that has one more element than `Self` + type Longer: Shorten; + + /// Returns a new array with the given element appended to the end of it. + /// + /// Example: + /// + /// ```ignore + /// let a = arr![i32; 1, 2, 3]; + /// + /// let b = a.append(4); + /// + /// assert_eq!(b, arr![i32; 1, 2, 3, 4]); + /// ``` + fn append(self, last: T) -> Self::Longer; + + /// Returns a new array with the given element prepended to the front of it. + /// + /// Example: + /// + /// ```ignore + /// let a = arr![i32; 1, 2, 3]; + /// + /// let b = a.prepend(4); + /// + /// assert_eq!(b, arr![i32; 4, 1, 2, 3]); + /// ``` + fn prepend(self, first: T) -> Self::Longer; +} + +/// Defines a `GenericSequence` which can be shortened by removing the first or last element from it. +/// +/// Additionally, any shortened sequence can be lengthened by +/// appending or prepending an element to it. +pub unsafe trait Shorten: Sized + GenericSequence { + /// `GenericSequence` that has one less element than `Self` + type Shorter: Lengthen; + + /// Returns a new array without the last element, and the last element. + /// + /// Example: + /// + /// ```ignore + /// let a = arr![i32; 1, 2, 3, 4]; + /// + /// let (init, last) = a.pop_back(); + /// + /// assert_eq!(init, arr![i32; 1, 2, 3]); + /// assert_eq!(last, 4); + /// ``` + fn pop_back(self) -> (Self::Shorter, T); + + /// Returns a new array without the first element, and the first element. + /// Example: + /// + /// ```ignore + /// let a = arr![i32; 1, 2, 3, 4]; + /// + /// let (head, tail) = a.pop_front(); + /// + /// assert_eq!(head, 1); + /// assert_eq!(tail, arr![i32; 2, 3, 4]); + /// ``` + fn pop_front(self) -> (T, Self::Shorter); +} + +unsafe impl> Lengthen for GenericArray +where + N: Add, + Add1: ArrayLength, + Add1: Sub, + Sub1>: ArrayLength, +{ + type Longer = GenericArray>; + + fn append(self, last: T) -> Self::Longer { + let mut longer: Self::Longer = unsafe { mem::uninitialized() }; + + unsafe { + ptr::write(longer.as_mut_ptr() as *mut _, self); + ptr::write(&mut longer[N::to_usize()], last); + } + + longer + } + + fn prepend(self, first: T) -> Self::Longer { + let mut longer: Self::Longer = unsafe { mem::uninitialized() }; + + let longer_ptr = longer.as_mut_ptr(); + + unsafe { + ptr::write(longer_ptr as *mut _, first); + ptr::write(longer_ptr.offset(1) as *mut _, self); + } + + longer + } +} + +unsafe impl> Shorten for GenericArray +where + N: Sub, + Sub1: ArrayLength, + Sub1: Add, + Add1>: ArrayLength, +{ + type Shorter = GenericArray>; + + fn pop_back(self) -> (Self::Shorter, T) { + let init_ptr = self.as_ptr(); + let last_ptr = unsafe { init_ptr.offset(Sub1::::to_usize() as isize) }; + + let init = unsafe { ptr::read(init_ptr as _) }; + let last = unsafe { ptr::read(last_ptr as _) }; + + mem::forget(self); + + (init, last) + } + + fn pop_front(self) -> (T, Self::Shorter) { + let head_ptr = self.as_ptr(); + let tail_ptr = unsafe { head_ptr.offset(1) }; + + let head = unsafe { ptr::read(head_ptr as _) }; + let tail = unsafe { ptr::read(tail_ptr as _) }; + + mem::forget(self); + + (head, tail) + } +} + +/// Defines a `GenericSequence` that can be split into two parts at a given pivot index. +pub unsafe trait Split: GenericSequence +where + K: ArrayLength, +{ + /// First part of the resulting split array + type First: GenericSequence; + /// Second part of the resulting split array + type Second: GenericSequence; + + /// Splits an array at the given index, returning the separate parts of the array. + fn split(self) -> (Self::First, Self::Second); +} + +unsafe impl Split for GenericArray +where + N: ArrayLength, + K: ArrayLength, + N: Sub, + Diff: ArrayLength, +{ + type First = GenericArray; + type Second = GenericArray>; + + fn split(self) -> (Self::First, Self::Second) { + let head_ptr = self.as_ptr(); + let tail_ptr = unsafe { head_ptr.offset(K::to_usize() as isize) }; + + let head = unsafe { ptr::read(head_ptr as _) }; + let tail = unsafe { ptr::read(tail_ptr as _) }; + + mem::forget(self); + + (head, tail) + } +} + +/// Defines `GenericSequence`s which can be joined together, forming a larger array. +pub unsafe trait Concat: GenericSequence +where + M: ArrayLength, +{ + /// Sequence to be concatenated with `self` + type Rest: GenericSequence; + + /// Resulting sequence formed by the concatenation. + type Output: GenericSequence; + + /// Concatenate, or join, two sequences. + fn concat(self, rest: Self::Rest) -> Self::Output; +} + +unsafe impl Concat for GenericArray +where + N: ArrayLength + Add, + M: ArrayLength, + Sum: ArrayLength, +{ + type Rest = GenericArray; + type Output = GenericArray>; + + fn concat(self, rest: Self::Rest) -> Self::Output { + let mut output: Self::Output = unsafe { mem::uninitialized() }; + + let output_ptr = output.as_mut_ptr(); + + unsafe { + ptr::write(output_ptr as *mut _, self); + ptr::write(output_ptr.offset(N::to_usize() as isize) as *mut _, rest); + } + + output + } +} diff --git a/vendor/generic-array-0.12.3/tests/arr.rs b/vendor/generic-array-0.12.4/tests/arr.rs similarity index 95% rename from vendor/generic-array-0.12.3/tests/arr.rs rename to vendor/generic-array-0.12.4/tests/arr.rs index 461805a501..c37b5d50f7 100644 --- a/vendor/generic-array-0.12.3/tests/arr.rs +++ b/vendor/generic-array-0.12.4/tests/arr.rs @@ -1,27 +1,27 @@ -#[macro_use] -extern crate generic_array; -extern crate typenum; - -#[test] -fn empty_without_trailing_comma() { - let ar = arr![u8; ]; - assert_eq!(format!("{:x}", ar), ""); -} - -#[test] -fn empty_with_trailing_comma() { - let ar = arr![u8; , ]; - assert_eq!(format!("{:x}", ar), ""); -} - -#[test] -fn without_trailing_comma() { - let ar = arr![u8; 10, 20, 30]; - assert_eq!(format!("{:x}", ar), "0a141e"); -} - -#[test] -fn with_trailing_comma() { - let ar = arr![u8; 10, 20, 30, ]; - assert_eq!(format!("{:x}", ar), "0a141e"); -} +#[macro_use] +extern crate generic_array; +extern crate typenum; + +#[test] +fn empty_without_trailing_comma() { + let ar = arr![u8; ]; + assert_eq!(format!("{:x}", ar), ""); +} + +#[test] +fn empty_with_trailing_comma() { + let ar = arr![u8; , ]; + assert_eq!(format!("{:x}", ar), ""); +} + +#[test] +fn without_trailing_comma() { + let ar = arr![u8; 10, 20, 30]; + assert_eq!(format!("{:x}", ar), "0a141e"); +} + +#[test] +fn with_trailing_comma() { + let ar = arr![u8; 10, 20, 30, ]; + assert_eq!(format!("{:x}", ar), "0a141e"); +} diff --git a/vendor/generic-array-0.12.3/tests/generics.rs b/vendor/generic-array-0.12.4/tests/generics.rs similarity index 97% rename from vendor/generic-array-0.12.3/tests/generics.rs rename to vendor/generic-array-0.12.4/tests/generics.rs index 952867b386..d48fe08c06 100644 --- a/vendor/generic-array-0.12.3/tests/generics.rs +++ b/vendor/generic-array-0.12.4/tests/generics.rs @@ -1,98 +1,98 @@ -#![recursion_limit = "128"] - -#[macro_use] -extern crate generic_array; - -use generic_array::typenum::consts::U4; - -use std::fmt::Debug; -use std::ops::Add; - -use generic_array::{GenericArray, ArrayLength}; -use generic_array::sequence::*; -use generic_array::functional::*; - -/// Example function using generics to pass N-length sequences and map them -pub fn generic_map(s: S) -where - S: FunctionalSequence, // `.map` - S::Item: Add, // `x + 1` - S: MappedGenericSequence, // `i32` -> `i32` - MappedSequence: Debug, // println! -{ - let a = s.map(|x| x + 1); - - println!("{:?}", a); -} - -/// Complex example function using generics to pass N-length sequences, zip them, and then map that result. -/// -/// If used with `GenericArray` specifically this isn't necessary -pub fn generic_sequence_zip_sum(a: A, b: B) -> i32 -where - A: FunctionalSequence, // `.zip` - B: FunctionalSequence, // `.zip` - A: MappedGenericSequence, // `i32` -> `i32` - B: MappedGenericSequence>, // `i32` -> `i32`, prove A and B can map to the same output - A::Item: Add, // `l + r` - MappedSequence: MappedGenericSequence + FunctionalSequence, // `.map` - SequenceItem>: Add, // `x + 1` - MappedSequence, i32, i32>: Debug, // `println!` - MappedSequence, i32, i32>: FunctionalSequence, // `.fold` - SequenceItem, i32, i32>>: Add // `x + a`, note the order -{ - let c = a.zip(b, |l, r| l + r).map(|x| x + 1); - - println!("{:?}", c); - - c.fold(0, |a, x| x + a) -} - -/// Super-simple fixed-length i32 `GenericArray`s -pub fn generic_array_plain_zip_sum(a: GenericArray, b: GenericArray) -> i32 { - a.zip(b, |l, r| l + r).map(|x| x + 1).fold(0, |a, x| x + a) -} - -pub fn generic_array_variable_length_zip_sum(a: GenericArray, b: GenericArray) -> i32 -where - N: ArrayLength, -{ - a.zip(b, |l, r| l + r).map(|x| x + 1).fold(0, |a, x| x + a) -} - -pub fn generic_array_same_type_variable_length_zip_sum(a: GenericArray, b: GenericArray) -> i32 -where - N: ArrayLength + ArrayLength<>::Output>, - T: Add, -{ - a.zip(b, |l, r| l + r).map(|x| x + 1).fold(0, |a, x| x + a) -} - -/// Complex example using fully generic `GenericArray`s with the same length. -/// -/// It's mostly just the repeated `Add` traits, which would be present in other systems anyway. -pub fn generic_array_zip_sum + ArrayLength>(a: GenericArray, b: GenericArray) -> i32 -where - A: Add, - N: ArrayLength<>::Output> + - ArrayLength<<>::Output as Add>::Output>, - >::Output: Add, - <>::Output as Add>::Output: Add, -{ - a.zip(b, |l, r| l + r).map(|x| x + 1).fold(0, |a, x| x + a) -} - -#[test] -fn test_generics() { - generic_map(arr![i32; 1, 2, 3, 4]); - - assert_eq!(generic_sequence_zip_sum(arr![i32; 1, 2, 3, 4], arr![i32; 2, 3, 4, 5]), 28); - - assert_eq!(generic_array_plain_zip_sum(arr![i32; 1, 2, 3, 4], arr![i32; 2, 3, 4, 5]), 28); - - assert_eq!(generic_array_variable_length_zip_sum(arr![i32; 1, 2, 3, 4], arr![i32; 2, 3, 4, 5]), 28); - - assert_eq!(generic_array_same_type_variable_length_zip_sum(arr![i32; 1, 2, 3, 4], arr![i32; 2, 3, 4, 5]), 28); - - assert_eq!(generic_array_zip_sum(arr![i32; 1, 2, 3, 4], arr![i32; 2, 3, 4, 5]), 28); +#![recursion_limit = "128"] + +#[macro_use] +extern crate generic_array; + +use generic_array::typenum::consts::U4; + +use std::fmt::Debug; +use std::ops::Add; + +use generic_array::{GenericArray, ArrayLength}; +use generic_array::sequence::*; +use generic_array::functional::*; + +/// Example function using generics to pass N-length sequences and map them +pub fn generic_map(s: S) +where + S: FunctionalSequence, // `.map` + S::Item: Add, // `x + 1` + S: MappedGenericSequence, // `i32` -> `i32` + MappedSequence: Debug, // println! +{ + let a = s.map(|x| x + 1); + + println!("{:?}", a); +} + +/// Complex example function using generics to pass N-length sequences, zip them, and then map that result. +/// +/// If used with `GenericArray` specifically this isn't necessary +pub fn generic_sequence_zip_sum(a: A, b: B) -> i32 +where + A: FunctionalSequence, // `.zip` + B: FunctionalSequence, // `.zip` + A: MappedGenericSequence, // `i32` -> `i32` + B: MappedGenericSequence>, // `i32` -> `i32`, prove A and B can map to the same output + A::Item: Add, // `l + r` + MappedSequence: MappedGenericSequence + FunctionalSequence, // `.map` + SequenceItem>: Add, // `x + 1` + MappedSequence, i32, i32>: Debug, // `println!` + MappedSequence, i32, i32>: FunctionalSequence, // `.fold` + SequenceItem, i32, i32>>: Add // `x + a`, note the order +{ + let c = a.zip(b, |l, r| l + r).map(|x| x + 1); + + println!("{:?}", c); + + c.fold(0, |a, x| x + a) +} + +/// Super-simple fixed-length i32 `GenericArray`s +pub fn generic_array_plain_zip_sum(a: GenericArray, b: GenericArray) -> i32 { + a.zip(b, |l, r| l + r).map(|x| x + 1).fold(0, |a, x| x + a) +} + +pub fn generic_array_variable_length_zip_sum(a: GenericArray, b: GenericArray) -> i32 +where + N: ArrayLength, +{ + a.zip(b, |l, r| l + r).map(|x| x + 1).fold(0, |a, x| x + a) +} + +pub fn generic_array_same_type_variable_length_zip_sum(a: GenericArray, b: GenericArray) -> i32 +where + N: ArrayLength + ArrayLength<>::Output>, + T: Add, +{ + a.zip(b, |l, r| l + r).map(|x| x + 1).fold(0, |a, x| x + a) +} + +/// Complex example using fully generic `GenericArray`s with the same length. +/// +/// It's mostly just the repeated `Add` traits, which would be present in other systems anyway. +pub fn generic_array_zip_sum + ArrayLength>(a: GenericArray, b: GenericArray) -> i32 +where + A: Add, + N: ArrayLength<>::Output> + + ArrayLength<<>::Output as Add>::Output>, + >::Output: Add, + <>::Output as Add>::Output: Add, +{ + a.zip(b, |l, r| l + r).map(|x| x + 1).fold(0, |a, x| x + a) +} + +#[test] +fn test_generics() { + generic_map(arr![i32; 1, 2, 3, 4]); + + assert_eq!(generic_sequence_zip_sum(arr![i32; 1, 2, 3, 4], arr![i32; 2, 3, 4, 5]), 28); + + assert_eq!(generic_array_plain_zip_sum(arr![i32; 1, 2, 3, 4], arr![i32; 2, 3, 4, 5]), 28); + + assert_eq!(generic_array_variable_length_zip_sum(arr![i32; 1, 2, 3, 4], arr![i32; 2, 3, 4, 5]), 28); + + assert_eq!(generic_array_same_type_variable_length_zip_sum(arr![i32; 1, 2, 3, 4], arr![i32; 2, 3, 4, 5]), 28); + + assert_eq!(generic_array_zip_sum(arr![i32; 1, 2, 3, 4], arr![i32; 2, 3, 4, 5]), 28); } \ No newline at end of file diff --git a/vendor/generic-array-0.12.3/tests/hex.rs b/vendor/generic-array-0.12.4/tests/hex.rs similarity index 96% rename from vendor/generic-array-0.12.3/tests/hex.rs rename to vendor/generic-array-0.12.4/tests/hex.rs index 0c63391a64..0882e9bb3b 100644 --- a/vendor/generic-array-0.12.3/tests/hex.rs +++ b/vendor/generic-array-0.12.4/tests/hex.rs @@ -1,61 +1,61 @@ -#[macro_use] -extern crate generic_array; -extern crate typenum; - -use generic_array::GenericArray; -use std::str::from_utf8; -use typenum::U2048; - -#[test] -fn short_lower_hex() { - let ar = arr![u8; 10, 20, 30]; - assert_eq!(format!("{:x}", ar), "0a141e"); -} - -#[test] -fn short_upper_hex() { - let ar = arr![u8; 30, 20, 10]; - assert_eq!(format!("{:X}", ar), "1E140A"); -} - -#[test] -fn long_lower_hex() { - let ar = GenericArray::::default(); - assert_eq!(format!("{:x}", ar), from_utf8(&[b'0'; 4096]).unwrap()); -} - -#[test] -fn long_lower_hex_truncated() { - let ar = GenericArray::::default(); - assert_eq!(format!("{:.3001x}", ar), from_utf8(&[b'0'; 3001]).unwrap()); -} - -#[test] -fn long_upper_hex() { - let ar = GenericArray::::default(); - assert_eq!(format!("{:X}", ar), from_utf8(&[b'0'; 4096]).unwrap()); -} - -#[test] -fn long_upper_hex_truncated() { - let ar = GenericArray::::default(); - assert_eq!(format!("{:.2777X}", ar), from_utf8(&[b'0'; 2777]).unwrap()); -} - -#[test] -fn truncated_lower_hex() { - let ar = arr![u8; 10, 20, 30, 40, 50]; - assert_eq!(format!("{:.2x}", ar), "0a"); - assert_eq!(format!("{:.3x}", ar), "0a1"); - assert_eq!(format!("{:.4x}", ar), "0a14"); -} - -#[test] -fn truncated_upper_hex() { - let ar = arr![u8; 30, 20, 10, 17, 0]; - assert_eq!(format!("{:.4X}", ar), "1E14"); - assert_eq!(format!("{:.5X}", ar), "1E140"); - assert_eq!(format!("{:.6X}", ar), "1E140A"); - assert_eq!(format!("{:.7X}", ar), "1E140A1"); - assert_eq!(format!("{:.8X}", ar), "1E140A11"); -} +#[macro_use] +extern crate generic_array; +extern crate typenum; + +use generic_array::GenericArray; +use std::str::from_utf8; +use typenum::U2048; + +#[test] +fn short_lower_hex() { + let ar = arr![u8; 10, 20, 30]; + assert_eq!(format!("{:x}", ar), "0a141e"); +} + +#[test] +fn short_upper_hex() { + let ar = arr![u8; 30, 20, 10]; + assert_eq!(format!("{:X}", ar), "1E140A"); +} + +#[test] +fn long_lower_hex() { + let ar = GenericArray::::default(); + assert_eq!(format!("{:x}", ar), from_utf8(&[b'0'; 4096]).unwrap()); +} + +#[test] +fn long_lower_hex_truncated() { + let ar = GenericArray::::default(); + assert_eq!(format!("{:.3001x}", ar), from_utf8(&[b'0'; 3001]).unwrap()); +} + +#[test] +fn long_upper_hex() { + let ar = GenericArray::::default(); + assert_eq!(format!("{:X}", ar), from_utf8(&[b'0'; 4096]).unwrap()); +} + +#[test] +fn long_upper_hex_truncated() { + let ar = GenericArray::::default(); + assert_eq!(format!("{:.2777X}", ar), from_utf8(&[b'0'; 2777]).unwrap()); +} + +#[test] +fn truncated_lower_hex() { + let ar = arr![u8; 10, 20, 30, 40, 50]; + assert_eq!(format!("{:.2x}", ar), "0a"); + assert_eq!(format!("{:.3x}", ar), "0a1"); + assert_eq!(format!("{:.4x}", ar), "0a14"); +} + +#[test] +fn truncated_upper_hex() { + let ar = arr![u8; 30, 20, 10, 17, 0]; + assert_eq!(format!("{:.4X}", ar), "1E14"); + assert_eq!(format!("{:.5X}", ar), "1E140"); + assert_eq!(format!("{:.6X}", ar), "1E140A"); + assert_eq!(format!("{:.7X}", ar), "1E140A1"); + assert_eq!(format!("{:.8X}", ar), "1E140A11"); +} diff --git a/vendor/generic-array-0.12.3/tests/import_name.rs b/vendor/generic-array-0.12.4/tests/import_name.rs similarity index 96% rename from vendor/generic-array-0.12.3/tests/import_name.rs rename to vendor/generic-array-0.12.4/tests/import_name.rs index f59f1b6c56..27653c9a85 100644 --- a/vendor/generic-array-0.12.3/tests/import_name.rs +++ b/vendor/generic-array-0.12.4/tests/import_name.rs @@ -1,10 +1,10 @@ -#[macro_use] -extern crate generic_array as gen_arr; - -use gen_arr::typenum; - -#[test] -fn test_different_crate_name() { - let _: gen_arr::GenericArray = arr![u32; 0, 1, 2, 3]; - let _: gen_arr::GenericArray = arr![u32;]; -} +#[macro_use] +extern crate generic_array as gen_arr; + +use gen_arr::typenum; + +#[test] +fn test_different_crate_name() { + let _: gen_arr::GenericArray = arr![u32; 0, 1, 2, 3]; + let _: gen_arr::GenericArray = arr![u32;]; +} diff --git a/vendor/generic-array-0.12.3/tests/iter.rs b/vendor/generic-array-0.12.4/tests/iter.rs similarity index 96% rename from vendor/generic-array-0.12.3/tests/iter.rs rename to vendor/generic-array-0.12.4/tests/iter.rs index 19d198cb58..47860d728b 100644 --- a/vendor/generic-array-0.12.3/tests/iter.rs +++ b/vendor/generic-array-0.12.4/tests/iter.rs @@ -1,164 +1,164 @@ -#[macro_use] -extern crate generic_array; - -use std::cell::Cell; -use std::ops::Drop; - -use generic_array::GenericArray; -use generic_array::typenum::consts::U5; - -#[test] -fn test_into_iter_as_slice() { - let array = arr![char; 'a', 'b', 'c']; - let mut into_iter = array.into_iter(); - assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']); - let _ = into_iter.next().unwrap(); - assert_eq!(into_iter.as_slice(), &['b', 'c']); - let _ = into_iter.next().unwrap(); - let _ = into_iter.next().unwrap(); - assert_eq!(into_iter.as_slice(), &[]); -} - -#[test] -fn test_into_iter_as_mut_slice() { - let array = arr![char; 'a', 'b', 'c']; - let mut into_iter = array.into_iter(); - assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']); - into_iter.as_mut_slice()[0] = 'x'; - into_iter.as_mut_slice()[1] = 'y'; - assert_eq!(into_iter.next().unwrap(), 'x'); - assert_eq!(into_iter.as_slice(), &['y', 'c']); -} - -#[test] -fn test_into_iter_debug() { - let array = arr![char; 'a', 'b', 'c']; - let into_iter = array.into_iter(); - let debug = format!("{:?}", into_iter); - assert_eq!(debug, "GenericArrayIter(['a', 'b', 'c'])"); -} - -#[test] -fn test_into_iter_clone() { - fn iter_equal>(it: I, slice: &[i32]) { - let v: Vec = it.collect(); - assert_eq!(&v[..], slice); - } - let mut it = arr![i32; 1, 2, 3].into_iter(); - iter_equal(it.clone(), &[1, 2, 3]); - assert_eq!(it.next(), Some(1)); - let mut it = it.rev(); - iter_equal(it.clone(), &[3, 2]); - assert_eq!(it.next(), Some(3)); - iter_equal(it.clone(), &[2]); - assert_eq!(it.next(), Some(2)); - iter_equal(it.clone(), &[]); - assert_eq!(it.next(), None); -} - -#[test] -fn test_into_iter_nth() { - let v = arr![i32; 0, 1, 2, 3, 4]; - for i in 0..v.len() { - assert_eq!(v.clone().into_iter().nth(i).unwrap(), v[i]); - } - assert_eq!(v.clone().into_iter().nth(v.len()), None); - - let mut iter = v.into_iter(); - assert_eq!(iter.nth(2).unwrap(), v[2]); - assert_eq!(iter.nth(1).unwrap(), v[4]); -} - -#[test] -fn test_into_iter_last() { - let v = arr![i32; 0, 1, 2, 3, 4]; - assert_eq!(v.into_iter().last().unwrap(), 4); - assert_eq!(arr![i32; 0].into_iter().last().unwrap(), 0); -} - -#[test] -fn test_into_iter_count() { - let v = arr![i32; 0, 1, 2, 3, 4]; - assert_eq!(v.clone().into_iter().count(), 5); - - let mut iter2 = v.into_iter(); - iter2.next(); - iter2.next(); - assert_eq!(iter2.count(), 3); -} - -#[test] -fn test_into_iter_flat_map() { - assert!((0..5).flat_map(|i| arr![i32; 2 * i, 2 * i + 1]).eq(0..10)); -} - -#[test] -fn test_into_iter_drops() { - struct R<'a> { - i: &'a Cell, - } - - impl<'a> Drop for R<'a> { - fn drop(&mut self) { - self.i.set(self.i.get() + 1); - } - } - - fn r(i: &Cell) -> R { - R { - i: i - } - } - - fn v(i: &Cell) -> GenericArray { - arr![R; r(i), r(i), r(i), r(i), r(i)] - } - - let i = Cell::new(0); - { - v(&i).into_iter(); - } - assert_eq!(i.get(), 5); - - let i = Cell::new(0); - { - let mut iter = v(&i).into_iter(); - let _x = iter.next(); - assert_eq!(i.get(), 0); - assert_eq!(iter.count(), 4); - assert_eq!(i.get(), 4); - } - assert_eq!(i.get(), 5); - - let i = Cell::new(0); - { - let mut iter = v(&i).into_iter(); - let _x = iter.nth(2); - assert_eq!(i.get(), 2); - let _y = iter.last(); - assert_eq!(i.get(), 3); - } - assert_eq!(i.get(), 5); - - let i = Cell::new(0); - for (index, _x) in v(&i).into_iter().enumerate() { - assert_eq!(i.get(), index); - } - assert_eq!(i.get(), 5); - - let i = Cell::new(0); - for (index, _x) in v(&i).into_iter().rev().enumerate() { - assert_eq!(i.get(), index); - } - assert_eq!(i.get(), 5); -} - -/* -//TODO: Cover this -#[allow(dead_code)] -fn assert_covariance() { - fn into_iter<'new>(i: GenericArrayIter<&'static str, U10>) -> GenericArrayIter<&'new str, U10> { - i - } -} +#[macro_use] +extern crate generic_array; + +use std::cell::Cell; +use std::ops::Drop; + +use generic_array::GenericArray; +use generic_array::typenum::consts::U5; + +#[test] +fn test_into_iter_as_slice() { + let array = arr![char; 'a', 'b', 'c']; + let mut into_iter = array.into_iter(); + assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']); + let _ = into_iter.next().unwrap(); + assert_eq!(into_iter.as_slice(), &['b', 'c']); + let _ = into_iter.next().unwrap(); + let _ = into_iter.next().unwrap(); + assert_eq!(into_iter.as_slice(), &[]); +} + +#[test] +fn test_into_iter_as_mut_slice() { + let array = arr![char; 'a', 'b', 'c']; + let mut into_iter = array.into_iter(); + assert_eq!(into_iter.as_slice(), &['a', 'b', 'c']); + into_iter.as_mut_slice()[0] = 'x'; + into_iter.as_mut_slice()[1] = 'y'; + assert_eq!(into_iter.next().unwrap(), 'x'); + assert_eq!(into_iter.as_slice(), &['y', 'c']); +} + +#[test] +fn test_into_iter_debug() { + let array = arr![char; 'a', 'b', 'c']; + let into_iter = array.into_iter(); + let debug = format!("{:?}", into_iter); + assert_eq!(debug, "GenericArrayIter(['a', 'b', 'c'])"); +} + +#[test] +fn test_into_iter_clone() { + fn iter_equal>(it: I, slice: &[i32]) { + let v: Vec = it.collect(); + assert_eq!(&v[..], slice); + } + let mut it = arr![i32; 1, 2, 3].into_iter(); + iter_equal(it.clone(), &[1, 2, 3]); + assert_eq!(it.next(), Some(1)); + let mut it = it.rev(); + iter_equal(it.clone(), &[3, 2]); + assert_eq!(it.next(), Some(3)); + iter_equal(it.clone(), &[2]); + assert_eq!(it.next(), Some(2)); + iter_equal(it.clone(), &[]); + assert_eq!(it.next(), None); +} + +#[test] +fn test_into_iter_nth() { + let v = arr![i32; 0, 1, 2, 3, 4]; + for i in 0..v.len() { + assert_eq!(v.clone().into_iter().nth(i).unwrap(), v[i]); + } + assert_eq!(v.clone().into_iter().nth(v.len()), None); + + let mut iter = v.into_iter(); + assert_eq!(iter.nth(2).unwrap(), v[2]); + assert_eq!(iter.nth(1).unwrap(), v[4]); +} + +#[test] +fn test_into_iter_last() { + let v = arr![i32; 0, 1, 2, 3, 4]; + assert_eq!(v.into_iter().last().unwrap(), 4); + assert_eq!(arr![i32; 0].into_iter().last().unwrap(), 0); +} + +#[test] +fn test_into_iter_count() { + let v = arr![i32; 0, 1, 2, 3, 4]; + assert_eq!(v.clone().into_iter().count(), 5); + + let mut iter2 = v.into_iter(); + iter2.next(); + iter2.next(); + assert_eq!(iter2.count(), 3); +} + +#[test] +fn test_into_iter_flat_map() { + assert!((0..5).flat_map(|i| arr![i32; 2 * i, 2 * i + 1]).eq(0..10)); +} + +#[test] +fn test_into_iter_drops() { + struct R<'a> { + i: &'a Cell, + } + + impl<'a> Drop for R<'a> { + fn drop(&mut self) { + self.i.set(self.i.get() + 1); + } + } + + fn r(i: &Cell) -> R { + R { + i: i + } + } + + fn v(i: &Cell) -> GenericArray { + arr![R; r(i), r(i), r(i), r(i), r(i)] + } + + let i = Cell::new(0); + { + v(&i).into_iter(); + } + assert_eq!(i.get(), 5); + + let i = Cell::new(0); + { + let mut iter = v(&i).into_iter(); + let _x = iter.next(); + assert_eq!(i.get(), 0); + assert_eq!(iter.count(), 4); + assert_eq!(i.get(), 4); + } + assert_eq!(i.get(), 5); + + let i = Cell::new(0); + { + let mut iter = v(&i).into_iter(); + let _x = iter.nth(2); + assert_eq!(i.get(), 2); + let _y = iter.last(); + assert_eq!(i.get(), 3); + } + assert_eq!(i.get(), 5); + + let i = Cell::new(0); + for (index, _x) in v(&i).into_iter().enumerate() { + assert_eq!(i.get(), index); + } + assert_eq!(i.get(), 5); + + let i = Cell::new(0); + for (index, _x) in v(&i).into_iter().rev().enumerate() { + assert_eq!(i.get(), index); + } + assert_eq!(i.get(), 5); +} + +/* +//TODO: Cover this +#[allow(dead_code)] +fn assert_covariance() { + fn into_iter<'new>(i: GenericArrayIter<&'static str, U10>) -> GenericArrayIter<&'new str, U10> { + i + } +} */ \ No newline at end of file diff --git a/vendor/generic-array-0.12.3/tests/mod.rs b/vendor/generic-array-0.12.4/tests/mod.rs similarity index 95% rename from vendor/generic-array-0.12.3/tests/mod.rs rename to vendor/generic-array-0.12.4/tests/mod.rs index c103f417ab..6c6d9eb492 100644 --- a/vendor/generic-array-0.12.3/tests/mod.rs +++ b/vendor/generic-array-0.12.4/tests/mod.rs @@ -1,287 +1,287 @@ -#![recursion_limit = "128"] -#![no_std] -#[macro_use] -extern crate generic_array; -use core::cell::Cell; -use core::ops::{Add, Drop}; -use generic_array::GenericArray; -use generic_array::functional::*; -use generic_array::sequence::*; -use generic_array::typenum::{U1, U3, U4, U97}; - -#[test] -fn test() { - let mut list97 = [0; 97]; - for i in 0..97 { - list97[i] = i as i32; - } - let l: GenericArray = GenericArray::clone_from_slice(&list97); - assert_eq!(l[0], 0); - assert_eq!(l[1], 1); - assert_eq!(l[32], 32); - assert_eq!(l[56], 56); -} - -#[test] -fn test_drop() { - #[derive(Clone)] - struct TestDrop<'a>(&'a Cell); - - impl<'a> Drop for TestDrop<'a> { - fn drop(&mut self) { - self.0.set(self.0.get() + 1); - } - } - - let drop_counter = Cell::new(0); - { - let _: GenericArray = arr![TestDrop; TestDrop(&drop_counter), - TestDrop(&drop_counter), - TestDrop(&drop_counter)]; - } - assert_eq!(drop_counter.get(), 3); -} - -#[test] -fn test_arr() { - let test: GenericArray = arr![u32; 1, 2, 3]; - assert_eq!(test[1], 2); -} - -#[test] -fn test_copy() { - let test = arr![u32; 1, 2, 3]; - let test2 = test; - // if GenericArray is not copy, this should fail as a use of a moved value - assert_eq!(test[1], 2); - assert_eq!(test2[0], 1); -} - -#[derive(Debug, PartialEq, Eq)] -struct NoClone(T); - -#[test] -fn test_from_slice() { - let arr = [1, 2, 3, 4]; - let gen_arr = GenericArray::<_, U3>::from_slice(&arr[..3]); - assert_eq!(&arr[..3], gen_arr.as_slice()); - let arr = [NoClone(1u32), NoClone(2), NoClone(3), NoClone(4)]; - let gen_arr = GenericArray::<_, U3>::from_slice(&arr[..3]); - assert_eq!(&arr[..3], gen_arr.as_slice()); -} - -#[test] -fn test_from_mut_slice() { - let mut arr = [1, 2, 3, 4]; - { - let gen_arr = GenericArray::<_, U3>::from_mut_slice(&mut arr[..3]); - gen_arr[2] = 10; - } - assert_eq!(arr, [1, 2, 10, 4]); - let mut arr = [NoClone(1u32), NoClone(2), NoClone(3), NoClone(4)]; - { - let gen_arr = GenericArray::<_, U3>::from_mut_slice(&mut arr[..3]); - gen_arr[2] = NoClone(10); - } - assert_eq!(arr, [NoClone(1), NoClone(2), NoClone(10), NoClone(4)]); -} - -#[test] -fn test_default() { - let arr = GenericArray::::default(); - assert_eq!(arr[0], 0); -} - -#[test] -fn test_from() { - let data = [(1, 2, 3), (4, 5, 6), (7, 8, 9)]; - let garray: GenericArray<(usize, usize, usize), U3> = data.into(); - assert_eq!(&data, garray.as_slice()); -} - -#[test] -fn test_unit_macro() { - let arr = arr![f32; 3.14]; - assert_eq!(arr[0], 3.14); -} - -#[test] -fn test_empty_macro() { - let _arr = arr![f32;]; -} - -#[test] -fn test_cmp() { - arr![u8; 0x00].cmp(&arr![u8; 0x00]); -} - -/// This test should cause a helpful compile error if uncommented. -// #[test] -// fn test_empty_macro2(){ -// let arr = arr![]; -// } -#[cfg(feature = "serde")] -mod impl_serde { - extern crate serde_json; - - use generic_array::GenericArray; - use generic_array::typenum::U6; - - #[test] - fn test_serde_implementation() { - let array: GenericArray = arr![f64; 0.0, 5.0, 3.0, 7.07192, 76.0, -9.0]; - let string = serde_json::to_string(&array).unwrap(); - assert_eq!(string, "[0.0,5.0,3.0,7.07192,76.0,-9.0]"); - - let test_array: GenericArray = serde_json::from_str(&string).unwrap(); - assert_eq!(test_array, array); - } -} - -#[test] -fn test_map() { - let b: GenericArray = GenericArray::generate(|i| i as i32 * 4).map(|x| x - 3); - - assert_eq!(b, arr![i32; -3, 1, 5, 9]); -} - -#[test] -fn test_zip() { - let a: GenericArray<_, U4> = GenericArray::generate(|i| i + 1); - let b: GenericArray<_, U4> = GenericArray::generate(|i| i as i32 * 4); - - // Uses reference and non-reference arguments - let c = (&a).zip(b, |r, l| *r as i32 + l); - - assert_eq!(c, arr![i32; 1, 6, 11, 16]); -} - -#[test] -#[should_panic] -fn test_from_iter_short() { - use core::iter::repeat; - - let a: GenericArray<_, U4> = repeat(11).take(3).collect(); - - assert_eq!(a, arr![i32; 11, 11, 11, 0]); -} - -#[test] -fn test_from_iter() { - use core::iter::{once, repeat}; - - let a: GenericArray<_, U4> = repeat(11).take(3).chain(once(0)).collect(); - - assert_eq!(a, arr![i32; 11, 11, 11, 0]); -} - -#[test] -fn test_sizes() { - #![allow(dead_code)] - use core::mem::{size_of, size_of_val}; - - #[derive(Debug, Copy, Clone)] - #[repr(C)] - #[repr(packed)] - struct Test { - t: u16, - s: u32, - r: u16, - f: u16, - o: u32, - } - - assert_eq!(size_of::(), 14); - - assert_eq!(size_of_val(&arr![u8; 1, 2, 3]), size_of::() * 3); - assert_eq!(size_of_val(&arr![u32; 1]), size_of::() * 1); - assert_eq!(size_of_val(&arr![u64; 1, 2, 3, 4]), size_of::() * 4); - - assert_eq!(size_of::>(), size_of::() * 97); -} - -#[test] -fn test_append() { - let a = arr![i32; 1, 2, 3]; - - let b = a.append(4); - - assert_eq!(b, arr![i32; 1, 2, 3, 4]); -} - -#[test] -fn test_prepend() { - let a = arr![i32; 1, 2, 3]; - - let b = a.prepend(4); - - assert_eq!(b, arr![i32; 4, 1, 2, 3]); -} - -#[test] -fn test_pop() { - let a = arr![i32; 1, 2, 3, 4]; - - let (init, last) = a.pop_back(); - - assert_eq!(init, arr![i32; 1, 2, 3]); - assert_eq!(last, 4); - - let (head, tail) = a.pop_front(); - - assert_eq!(head, 1); - assert_eq!(tail, arr![i32; 2, 3, 4]); -} - -#[test] -fn test_split() { - let a = arr![i32; 1, 2, 3, 4]; - - let (b, c) = a.split(); - - assert_eq!(b, arr![i32; 1]); - assert_eq!(c, arr![i32; 2, 3, 4]); - - let (e, f) = a.split(); - - assert_eq!(e, arr![i32; 1, 2]); - assert_eq!(f, arr![i32; 3, 4]); -} - -#[test] -fn test_concat() { - let a = arr![i32; 1, 2]; - let b = arr![i32; 3, 4]; - - let c = a.concat(b); - - assert_eq!(c, arr![i32; 1, 2, 3, 4]); - - let (d, e) = c.split(); - - assert_eq!(d, arr![i32; 1]); - assert_eq!(e, arr![i32; 2, 3, 4]); -} - -#[test] -fn test_fold() { - let a = arr![i32; 1, 2, 3, 4]; - - assert_eq!(10, a.fold(0, |a, x| a + x)); -} - -fn sum_generic(s: S) -> i32 -where - S: FunctionalSequence, - S::Item: Add, // `+` - i32: Add, // reflexive -{ - s.fold(0, |a, x| a + x) -} - -#[test] -fn test_sum() { - let a = sum_generic(arr![i32; 1, 2, 3, 4]); - - assert_eq!(a, 10); -} +#![recursion_limit = "128"] +#![no_std] +#[macro_use] +extern crate generic_array; +use core::cell::Cell; +use core::ops::{Add, Drop}; +use generic_array::GenericArray; +use generic_array::functional::*; +use generic_array::sequence::*; +use generic_array::typenum::{U1, U3, U4, U97}; + +#[test] +fn test() { + let mut list97 = [0; 97]; + for i in 0..97 { + list97[i] = i as i32; + } + let l: GenericArray = GenericArray::clone_from_slice(&list97); + assert_eq!(l[0], 0); + assert_eq!(l[1], 1); + assert_eq!(l[32], 32); + assert_eq!(l[56], 56); +} + +#[test] +fn test_drop() { + #[derive(Clone)] + struct TestDrop<'a>(&'a Cell); + + impl<'a> Drop for TestDrop<'a> { + fn drop(&mut self) { + self.0.set(self.0.get() + 1); + } + } + + let drop_counter = Cell::new(0); + { + let _: GenericArray = arr![TestDrop; TestDrop(&drop_counter), + TestDrop(&drop_counter), + TestDrop(&drop_counter)]; + } + assert_eq!(drop_counter.get(), 3); +} + +#[test] +fn test_arr() { + let test: GenericArray = arr![u32; 1, 2, 3]; + assert_eq!(test[1], 2); +} + +#[test] +fn test_copy() { + let test = arr![u32; 1, 2, 3]; + let test2 = test; + // if GenericArray is not copy, this should fail as a use of a moved value + assert_eq!(test[1], 2); + assert_eq!(test2[0], 1); +} + +#[derive(Debug, PartialEq, Eq)] +struct NoClone(T); + +#[test] +fn test_from_slice() { + let arr = [1, 2, 3, 4]; + let gen_arr = GenericArray::<_, U3>::from_slice(&arr[..3]); + assert_eq!(&arr[..3], gen_arr.as_slice()); + let arr = [NoClone(1u32), NoClone(2), NoClone(3), NoClone(4)]; + let gen_arr = GenericArray::<_, U3>::from_slice(&arr[..3]); + assert_eq!(&arr[..3], gen_arr.as_slice()); +} + +#[test] +fn test_from_mut_slice() { + let mut arr = [1, 2, 3, 4]; + { + let gen_arr = GenericArray::<_, U3>::from_mut_slice(&mut arr[..3]); + gen_arr[2] = 10; + } + assert_eq!(arr, [1, 2, 10, 4]); + let mut arr = [NoClone(1u32), NoClone(2), NoClone(3), NoClone(4)]; + { + let gen_arr = GenericArray::<_, U3>::from_mut_slice(&mut arr[..3]); + gen_arr[2] = NoClone(10); + } + assert_eq!(arr, [NoClone(1), NoClone(2), NoClone(10), NoClone(4)]); +} + +#[test] +fn test_default() { + let arr = GenericArray::::default(); + assert_eq!(arr[0], 0); +} + +#[test] +fn test_from() { + let data = [(1, 2, 3), (4, 5, 6), (7, 8, 9)]; + let garray: GenericArray<(usize, usize, usize), U3> = data.into(); + assert_eq!(&data, garray.as_slice()); +} + +#[test] +fn test_unit_macro() { + let arr = arr![f32; 3.14]; + assert_eq!(arr[0], 3.14); +} + +#[test] +fn test_empty_macro() { + let _arr = arr![f32;]; +} + +#[test] +fn test_cmp() { + arr![u8; 0x00].cmp(&arr![u8; 0x00]); +} + +/// This test should cause a helpful compile error if uncommented. +// #[test] +// fn test_empty_macro2(){ +// let arr = arr![]; +// } +#[cfg(feature = "serde")] +mod impl_serde { + extern crate serde_json; + + use generic_array::GenericArray; + use generic_array::typenum::U6; + + #[test] + fn test_serde_implementation() { + let array: GenericArray = arr![f64; 0.0, 5.0, 3.0, 7.07192, 76.0, -9.0]; + let string = serde_json::to_string(&array).unwrap(); + assert_eq!(string, "[0.0,5.0,3.0,7.07192,76.0,-9.0]"); + + let test_array: GenericArray = serde_json::from_str(&string).unwrap(); + assert_eq!(test_array, array); + } +} + +#[test] +fn test_map() { + let b: GenericArray = GenericArray::generate(|i| i as i32 * 4).map(|x| x - 3); + + assert_eq!(b, arr![i32; -3, 1, 5, 9]); +} + +#[test] +fn test_zip() { + let a: GenericArray<_, U4> = GenericArray::generate(|i| i + 1); + let b: GenericArray<_, U4> = GenericArray::generate(|i| i as i32 * 4); + + // Uses reference and non-reference arguments + let c = (&a).zip(b, |r, l| *r as i32 + l); + + assert_eq!(c, arr![i32; 1, 6, 11, 16]); +} + +#[test] +#[should_panic] +fn test_from_iter_short() { + use core::iter::repeat; + + let a: GenericArray<_, U4> = repeat(11).take(3).collect(); + + assert_eq!(a, arr![i32; 11, 11, 11, 0]); +} + +#[test] +fn test_from_iter() { + use core::iter::{once, repeat}; + + let a: GenericArray<_, U4> = repeat(11).take(3).chain(once(0)).collect(); + + assert_eq!(a, arr![i32; 11, 11, 11, 0]); +} + +#[test] +fn test_sizes() { + #![allow(dead_code)] + use core::mem::{size_of, size_of_val}; + + #[derive(Debug, Copy, Clone)] + #[repr(C)] + #[repr(packed)] + struct Test { + t: u16, + s: u32, + r: u16, + f: u16, + o: u32, + } + + assert_eq!(size_of::(), 14); + + assert_eq!(size_of_val(&arr![u8; 1, 2, 3]), size_of::() * 3); + assert_eq!(size_of_val(&arr![u32; 1]), size_of::() * 1); + assert_eq!(size_of_val(&arr![u64; 1, 2, 3, 4]), size_of::() * 4); + + assert_eq!(size_of::>(), size_of::() * 97); +} + +#[test] +fn test_append() { + let a = arr![i32; 1, 2, 3]; + + let b = a.append(4); + + assert_eq!(b, arr![i32; 1, 2, 3, 4]); +} + +#[test] +fn test_prepend() { + let a = arr![i32; 1, 2, 3]; + + let b = a.prepend(4); + + assert_eq!(b, arr![i32; 4, 1, 2, 3]); +} + +#[test] +fn test_pop() { + let a = arr![i32; 1, 2, 3, 4]; + + let (init, last) = a.pop_back(); + + assert_eq!(init, arr![i32; 1, 2, 3]); + assert_eq!(last, 4); + + let (head, tail) = a.pop_front(); + + assert_eq!(head, 1); + assert_eq!(tail, arr![i32; 2, 3, 4]); +} + +#[test] +fn test_split() { + let a = arr![i32; 1, 2, 3, 4]; + + let (b, c) = a.split(); + + assert_eq!(b, arr![i32; 1]); + assert_eq!(c, arr![i32; 2, 3, 4]); + + let (e, f) = a.split(); + + assert_eq!(e, arr![i32; 1, 2]); + assert_eq!(f, arr![i32; 3, 4]); +} + +#[test] +fn test_concat() { + let a = arr![i32; 1, 2]; + let b = arr![i32; 3, 4]; + + let c = a.concat(b); + + assert_eq!(c, arr![i32; 1, 2, 3, 4]); + + let (d, e) = c.split(); + + assert_eq!(d, arr![i32; 1]); + assert_eq!(e, arr![i32; 2, 3, 4]); +} + +#[test] +fn test_fold() { + let a = arr![i32; 1, 2, 3, 4]; + + assert_eq!(10, a.fold(0, |a, x| a + x)); +} + +fn sum_generic(s: S) -> i32 +where + S: FunctionalSequence, + S::Item: Add, // `+` + i32: Add, // reflexive +{ + s.fold(0, |a, x| a + x) +} + +#[test] +fn test_sum() { + let a = sum_generic(arr![i32; 1, 2, 3, 4]); + + assert_eq!(a, 10); +} diff --git a/vendor/hashbrown-0.9.1/.cargo-checksum.json b/vendor/hashbrown-0.9.1/.cargo-checksum.json new file mode 100644 index 0000000000..53328fd47f --- /dev/null +++ b/vendor/hashbrown-0.9.1/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"CHANGELOG.md":"5a7c89b011b8a47ae3c3097d0badc86dadeac1084ce459cc9888f3f6519d7e47","Cargo.toml":"ba475021bd4563dde7d812713dbb79fc9fc7f522ad58bd0deaeed9ebadff69ef","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"ff8f68cb076caf8cefe7a6430d4ac086ce6af2ca8ce2c4e5a2004d4552ef52a2","README.md":"29d265575e99c6e4b8960fa0a17571580c8973b91b1b2ce63b9b83f8e1bdc58a","benches/bench.rs":"a3f8426559ebf68d93e37edee0bf83c28f18572b394b22e47dbff33e25cac403","clippy.toml":"7535949f908c6d9aea4f9a9f3a7625552c93fc29e963d059d40f4def9d77ea7b","src/external_trait_impls/mod.rs":"d69528827794524cfd9acbeacc1ac4f6131e3c7574311e6d919f818f65fbff07","src/external_trait_impls/rayon/helpers.rs":"d4fbca4db924925548f8dab8eb94cf4a3955a53c5e1ff15f59c460546c394034","src/external_trait_impls/rayon/map.rs":"eee0d42bd8cd347d49cfb1332f15297ca63b864c3690299a3ccd6d52c22c67de","src/external_trait_impls/rayon/mod.rs":"156de9c1ad0123334ea3b7e5a17444faf1b8bf971aa88a1f23e2f2d1c3021141","src/external_trait_impls/rayon/raw.rs":"d1b2415a4c3c42279f99a23bcf45c80ddb9a641c7f7974d42ed4d55f57bf6854","src/external_trait_impls/rayon/set.rs":"59afc7b1cdc985a85952d456e34eada4ca2fedf90d2a14dccf98a69f8f496137","src/external_trait_impls/serde.rs":"9306fb6e0e339398dc23ba9e7400a9a28d713df248e8b260e3d4dc44f799e101","src/lib.rs":"a455a0387b0133114247380659c2825713a4b91ef38a45f737007b47a2c30ee4","src/macros.rs":"0b1e9a55e8f5232b82f7e56f352a98904b35ddfca015377cf71daa31939baabf","src/map.rs":"56dc55edfd3c818d8c69464ec9edce9e3fe40e5975c02a2965e0a15878a08295","src/raw/bitmask.rs":"05e72c64957af7383001ca43a827cc5b3a8a39d00fac332ecea2fd7d2704099c","src/raw/generic.rs":"28da6bb3a722dcaa26cb5aba9e028111f32212dc9ce0c323e8f39ff5f367385e","src/raw/mod.rs":"ad887f865799502e852a3c100a49cc785ee97cb755b8394b31f87ed24fffa836","src/raw/sse2.rs":"ff332a9104558fe6a86b85ab975b6f43d4a042c634d5dc6cf70cf1d71d97ad7d","src/rustc_entry.rs":"64e47870015a9f152340017b79e2262e5c70d0f42b4fc2dfa48dd25ca70465f7","src/scopeguard.rs":"337cde60c9e1109cd19d4fa53529014cef1e3d5900dffde82f647881df1505f7","src/set.rs":"4ec68cf40a41bbc50da754047893640c62c55f612e03c43e3e3e837a23defc6d","tests/hasher.rs":"9a8fdf67e4415618e16729969c386eefe71408cded5d46cf7b67d969276a3452","tests/rayon.rs":"2286707a87b139f41902c82488c355b9fb402a3e734f392f3a73e87b9b932795","tests/serde.rs":"eed27382c0e43f67e402cd9eed20dea23ef5582e1a26a183e708ca9217a559e0","tests/set.rs":"374bd312c01a01cf8953bbbc9494f431b260c2657d7c79cc250e977b869a76ad"},"package":"d7afe4a420e3fe79967a00898cc1f4db7c8a49a9333a29f8a4bd76a253d5cd04"} \ No newline at end of file diff --git a/vendor/hashbrown-0.9.1/CHANGELOG.md b/vendor/hashbrown-0.9.1/CHANGELOG.md new file mode 100644 index 0000000000..b6eb671f95 --- /dev/null +++ b/vendor/hashbrown-0.9.1/CHANGELOG.md @@ -0,0 +1,294 @@ +# Change Log + +All notable changes to this project will be documented in this file. + +The format is based on [Keep a Changelog](http://keepachangelog.com/) +and this project adheres to [Semantic Versioning](http://semver.org/). + +## [Unreleased] + +## [v0.9.1] - 2020-09-28 + +## Added +- Added safe methods to `RawTable` (#202): + - `get`: `find` and `as_ref` + - `get_mut`: `find` and `as_mut` + - `insert_entry`: `insert` and `as_mut` + - `remove_entry`: `find` and `remove` + - `erase_entry`: `find` and `erase` + +## Changed +- Removed `from_key_hashed_nocheck`'s `Q: Hash`. (#200) +- Made `RawTable::drain` safe. (#201) + +## [v0.9.0] - 2020-09-03 + +### Fixed +- `drain_filter` now removes and yields items that do match the predicate, + rather than items that don't. This is a **breaking change** to match the + behavior of the `drain_filter` methods in `std`. (#187) + +### Added +- Added `replace_entry_with` to `OccupiedEntry`, and `and_replace_entry_with` to `Entry`. (#190) +- Implemented `FusedIterator` and `size_hint` for `DrainFilter`. (#188) + +### Changed +- The minimum Rust version has been bumped to 1.36 (due to `crossbeam` dependency). (#193) +- Updated `ahash` dependency to 0.4. (#198) +- `HashMap::with_hasher` and `HashSet::with_hasher` are now `const fn`. (#195) +- Removed `T: Hash + Eq` and `S: BuildHasher` bounds on `HashSet::new`, + `with_capacity`, `with_hasher`, and `with_capacity_and_hasher`. (#185) + +## [v0.8.2] - 2020-08-08 + +### Changed +- Avoid closures to improve compile times. (#183) +- Do not iterate to drop if empty. (#182) + +## [v0.8.1] - 2020-07-16 + +### Added +- Added `erase` and `remove` to `RawTable`. (#171) +- Added `try_with_capacity` to `RawTable`. (#174) +- Added methods that allow re-using a `RawIter` for `RawDrain`, + `RawIntoIter`, and `RawParIter`. (#175) +- Added `reflect_remove` and `reflect_insert` to `RawIter`. (#175) +- Added a `drain_filter` function to `HashSet`. (#179) + +### Changed +- Deprecated `RawTable::erase_no_drop` in favor of `erase` and `remove`. (#176) +- `insert_no_grow` is now exposed under the `"raw"` feature. (#180) + +## [v0.8.0] - 2020-06-18 + +### Fixed +- Marked `RawTable::par_iter` as `unsafe`. (#157) + +### Changed +- Reduced the size of `HashMap`. (#159) +- No longer create tables with a capacity of 1 element. (#162) +- Removed `K: Eq + Hash` bounds on `retain`. (#163) +- Pulled in `HashMap` changes from rust-lang/rust (#164): + - `extend_one` support on nightly. + - `CollectionAllocErr` renamed to `TryReserveError`. + - Added `HashSet::get_or_insert_owned`. + - `Default` for `HashSet` no longer requires `T: Eq + Hash` and `S: BuildHasher`. + +## [v0.7.2] - 2020-04-27 + +### Added +- Added `or_insert_with_key` to `Entry`. (#152) + +### Fixed +- Partially reverted `Clone` optimization which was unsound. (#154) + +### Changed +- Disabled use of `const-random` by default, which prevented reproducible builds. (#155) +- Optimized `repeat` function. (#150) +- Use `NonNull` for buckets, which improves codegen for iterators. (#148) + +## [v0.7.1] - 2020-03-16 + +### Added +- Added `HashMap::get_key_value_mut`. (#145) + +### Changed +- Optimized `Clone` implementation. (#146) + +## [v0.7.0] - 2020-01-31 + +### Added +- Added a `drain_filter` function to `HashMap`. (#135) + +### Changed +- Updated `ahash` dependency to 0.3. (#141) +- Optimized set union and intersection. (#130) +- `raw_entry` can now be used without requiring `S: BuildHasher`. (#123) +- `RawTable::bucket_index` can now be used under the `raw` feature. (#128) + +## [v0.6.3] - 2019-10-31 + +### Added +- Added an `ahash-compile-time-rng` feature (enabled by default) which allows disabling the + `compile-time-rng` feature in `ahash` to work around a Cargo bug. (#125) + +## [v0.6.2] - 2019-10-23 + +### Added +- Added an `inline-more` feature (enabled by default) which allows choosing a tradeoff between + runtime performance and compilation time. (#119) + +## [v0.6.1] - 2019-10-04 + +### Added +- Added `Entry::insert` and `RawEntryMut::insert`. (#118) + +### Changed +- `Group::static_empty` was changed from a `const` to a `static` (#116). + +## [v0.6.0] - 2019-08-13 + +### Fixed +- Fixed AHash accidentally depending on `std`. (#110) + +### Changed +- The minimum Rust version has been bumped to 1.32 (due to `rand` dependency). + +## ~~[v0.5.1] - 2019-08-04~~ + +This release was _yanked_ due to a breaking change for users of `no-default-features`. + +### Added +- The experimental and unsafe `RawTable` API is available under the "raw" feature. (#108) +- Added entry-like methods for `HashSet`. (#98) + +### Changed +- Changed the default hasher from FxHash to AHash. (#97) +- `hashbrown` is now fully `no_std` on recent Rust versions (1.36+). (#96) + +### Fixed +- We now avoid growing the table during insertions when it wasn't necessary. (#106) +- `RawOccupiedEntryMut` now properly implements `Send` and `Sync`. (#100) +- Relaxed `lazy_static` version. (#92) + +## [v0.5.0] - 2019-06-12 + +### Fixed +- Resize with a more conservative amount of space after deletions. (#86) + +### Changed +- Exposed the Layout of the failed allocation in CollectionAllocErr::AllocErr. (#89) + +## [v0.4.0] - 2019-05-30 + +### Fixed +- Fixed `Send` trait bounds on `IterMut` not matching the libstd one. (#82) + +## [v0.3.1] - 2019-05-30 + +### Fixed +- Fixed incorrect use of slice in unsafe code. (#80) + +## [v0.3.0] - 2019-04-23 + +### Changed +- Changed shrink_to to not panic if min_capacity < capacity. (#67) + +### Fixed +- Worked around emscripten bug emscripten-core/emscripten-fastcomp#258. (#66) + +## [v0.2.2] - 2019-04-16 + +### Fixed +- Inlined non-nightly lowest_set_bit_nonzero. (#64) +- Fixed build on latest nightly. (#65) + +## [v0.2.1] - 2019-04-14 + +### Changed +- Use for_each in map Extend and FromIterator. (#58) +- Improved worst-case performance of HashSet.is_subset. (#61) + +### Fixed +- Removed incorrect debug_assert. (#60) + +## [v0.2.0] - 2019-03-31 + +### Changed +- The code has been updated to Rust 2018 edition. This means that the minimum + Rust version has been bumped to 1.31 (2018 edition). + +### Added +- Added `insert_with_hasher` to the raw_entry API to allow `K: !(Hash + Eq)`. (#54) +- Added support for using hashbrown as the hash table implementation in libstd. (#46) + +### Fixed +- Fixed cargo build with minimal-versions. (#45) +- Fixed `#[may_dangle]` attributes to match the libstd `HashMap`. (#46) +- ZST keys and values are now handled properly. (#46) + +## [v0.1.8] - 2019-01-14 + +### Added +- Rayon parallel iterator support (#37) +- `raw_entry` support (#31) +- `#[may_dangle]` on nightly (#31) +- `try_reserve` support (#31) + +### Fixed +- Fixed variance on `IterMut`. (#31) + +## [v0.1.7] - 2018-12-05 + +### Fixed +- Fixed non-SSE version of convert_special_to_empty_and_full_to_deleted. (#32) +- Fixed overflow in rehash_in_place. (#33) + +## [v0.1.6] - 2018-11-17 + +### Fixed +- Fixed compile error on nightly. (#29) + +## [v0.1.5] - 2018-11-08 + +### Fixed +- Fixed subtraction overflow in generic::Group::match_byte. (#28) + +## [v0.1.4] - 2018-11-04 + +### Fixed +- Fixed a bug in the `erase_no_drop` implementation. (#26) + +## [v0.1.3] - 2018-11-01 + +### Added +- Serde support. (#14) + +### Fixed +- Make the compiler inline functions more aggressively. (#20) + +## [v0.1.2] - 2018-10-31 + +### Fixed +- `clear` segfaults when called on an empty table. (#13) + +## [v0.1.1] - 2018-10-30 + +### Fixed +- `erase_no_drop` optimization not triggering in the SSE2 implementation. (#3) +- Missing `Send` and `Sync` for hash map and iterator types. (#7) +- Bug when inserting into a table smaller than the group width. (#5) + +## v0.1.0 - 2018-10-29 + +- Initial release + +[Unreleased]: https://github.com/rust-lang/hashbrown/compare/v0.9.1...HEAD +[v0.9.1]: https://github.com/rust-lang/hashbrown/compare/v0.9.0...v0.9.1 +[v0.9.0]: https://github.com/rust-lang/hashbrown/compare/v0.8.2...v0.9.0 +[v0.8.2]: https://github.com/rust-lang/hashbrown/compare/v0.8.1...v0.8.2 +[v0.8.1]: https://github.com/rust-lang/hashbrown/compare/v0.8.0...v0.8.1 +[v0.8.0]: https://github.com/rust-lang/hashbrown/compare/v0.7.2...v0.8.0 +[v0.7.2]: https://github.com/rust-lang/hashbrown/compare/v0.7.1...v0.7.2 +[v0.7.1]: https://github.com/rust-lang/hashbrown/compare/v0.7.0...v0.7.1 +[v0.7.0]: https://github.com/rust-lang/hashbrown/compare/v0.6.3...v0.7.0 +[v0.6.3]: https://github.com/rust-lang/hashbrown/compare/v0.6.2...v0.6.3 +[v0.6.2]: https://github.com/rust-lang/hashbrown/compare/v0.6.1...v0.6.2 +[v0.6.1]: https://github.com/rust-lang/hashbrown/compare/v0.6.0...v0.6.1 +[v0.6.0]: https://github.com/rust-lang/hashbrown/compare/v0.5.1...v0.6.0 +[v0.5.1]: https://github.com/rust-lang/hashbrown/compare/v0.5.0...v0.5.1 +[v0.5.0]: https://github.com/rust-lang/hashbrown/compare/v0.4.0...v0.5.0 +[v0.4.0]: https://github.com/rust-lang/hashbrown/compare/v0.3.1...v0.4.0 +[v0.3.1]: https://github.com/rust-lang/hashbrown/compare/v0.3.0...v0.3.1 +[v0.3.0]: https://github.com/rust-lang/hashbrown/compare/v0.2.2...v0.3.0 +[v0.2.2]: https://github.com/rust-lang/hashbrown/compare/v0.2.1...v0.2.2 +[v0.2.1]: https://github.com/rust-lang/hashbrown/compare/v0.2.0...v0.2.1 +[v0.2.0]: https://github.com/rust-lang/hashbrown/compare/v0.1.8...v0.2.0 +[v0.1.8]: https://github.com/rust-lang/hashbrown/compare/v0.1.7...v0.1.8 +[v0.1.7]: https://github.com/rust-lang/hashbrown/compare/v0.1.6...v0.1.7 +[v0.1.6]: https://github.com/rust-lang/hashbrown/compare/v0.1.5...v0.1.6 +[v0.1.5]: https://github.com/rust-lang/hashbrown/compare/v0.1.4...v0.1.5 +[v0.1.4]: https://github.com/rust-lang/hashbrown/compare/v0.1.3...v0.1.4 +[v0.1.3]: https://github.com/rust-lang/hashbrown/compare/v0.1.2...v0.1.3 +[v0.1.2]: https://github.com/rust-lang/hashbrown/compare/v0.1.1...v0.1.2 +[v0.1.1]: https://github.com/rust-lang/hashbrown/compare/v0.1.0...v0.1.1 diff --git a/vendor/hashbrown-0.9.1/Cargo.toml b/vendor/hashbrown-0.9.1/Cargo.toml new file mode 100644 index 0000000000..7be0341b33 --- /dev/null +++ b/vendor/hashbrown-0.9.1/Cargo.toml @@ -0,0 +1,80 @@ +# 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 = "hashbrown" +version = "0.9.1" +authors = ["Amanieu d'Antras "] +exclude = [".travis.yml", "bors.toml", "/ci/*"] +description = "A Rust port of Google's SwissTable hash map" +readme = "README.md" +keywords = ["hash", "no_std", "hashmap", "swisstable"] +categories = ["data-structures", "no-std"] +license = "Apache-2.0/MIT" +repository = "https://github.com/rust-lang/hashbrown" +[package.metadata.docs.rs] +features = ["nightly", "rayon", "serde", "raw"] +[dependencies.ahash] +version = "0.4.4" +optional = true +default-features = false + +[dependencies.alloc] +version = "1.0.0" +optional = true +package = "rustc-std-workspace-alloc" + +[dependencies.compiler_builtins] +version = "0.1.2" +optional = true + +[dependencies.core] +version = "1.0.0" +optional = true +package = "rustc-std-workspace-core" + +[dependencies.rayon] +version = "1.0" +optional = true + +[dependencies.serde] +version = "1.0.25" +optional = true +default-features = false +[dev-dependencies.doc-comment] +version = "0.3.1" + +[dev-dependencies.lazy_static] +version = "1.2" + +[dev-dependencies.rand] +version = "0.7.3" +features = ["small_rng"] + +[dev-dependencies.rayon] +version = "1.0" + +[dev-dependencies.rustc-hash] +version = "=1.0" + +[dev-dependencies.serde_test] +version = "1.0" + +[features] +ahash-compile-time-rng = ["ahash/compile-time-rng"] +default = ["ahash", "inline-more"] +inline-more = [] +nightly = [] +raw = [] +rustc-dep-of-std = ["nightly", "core", "compiler_builtins", "alloc", "rustc-internal-api"] +rustc-internal-api = [] diff --git a/vendor/crossbeam-utils-0.6.6/LICENSE-APACHE b/vendor/hashbrown-0.9.1/LICENSE-APACHE similarity index 100% rename from vendor/crossbeam-utils-0.6.6/LICENSE-APACHE rename to vendor/hashbrown-0.9.1/LICENSE-APACHE diff --git a/vendor/wasi-0.9.0+wasi-snapshot-preview1/LICENSE-MIT b/vendor/hashbrown-0.9.1/LICENSE-MIT similarity index 96% rename from vendor/wasi-0.9.0+wasi-snapshot-preview1/LICENSE-MIT rename to vendor/hashbrown-0.9.1/LICENSE-MIT index 31aa79387f..5afc2a7b0a 100644 --- a/vendor/wasi-0.9.0+wasi-snapshot-preview1/LICENSE-MIT +++ b/vendor/hashbrown-0.9.1/LICENSE-MIT @@ -1,3 +1,5 @@ +Copyright (c) 2016 Amanieu d'Antras + 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/hashbrown-0.9.1/README.md b/vendor/hashbrown-0.9.1/README.md new file mode 100644 index 0000000000..2e431710fc --- /dev/null +++ b/vendor/hashbrown-0.9.1/README.md @@ -0,0 +1,126 @@ +hashbrown +========= + +[![Build Status](https://travis-ci.com/rust-lang/hashbrown.svg?branch=master)](https://travis-ci.com/rust-lang/hashbrown) +[![Crates.io](https://img.shields.io/crates/v/hashbrown.svg)](https://crates.io/crates/hashbrown) +[![Documentation](https://docs.rs/hashbrown/badge.svg)](https://docs.rs/hashbrown) +[![Rust](https://img.shields.io/badge/rust-1.36.0%2B-blue.svg?maxAge=3600)](https://github.com/rust-lang/hashbrown) + +This crate is a Rust port of Google's high-performance [SwissTable] hash +map, adapted to make it a drop-in replacement for Rust's standard `HashMap` +and `HashSet` types. + +The original C++ version of SwissTable can be found [here], and this +[CppCon talk] gives an overview of how the algorithm works. + +Since Rust 1.36, this is now the `HashMap` implementation for the Rust standard +library. However you may still want to use this crate instead since it works +in environments without `std`, such as embedded systems and kernels. + +[SwissTable]: https://abseil.io/blog/20180927-swisstables +[here]: https://github.com/abseil/abseil-cpp/blob/master/absl/container/internal/raw_hash_set.h +[CppCon talk]: https://www.youtube.com/watch?v=ncHmEUmJZf4 + +## [Change log](CHANGELOG.md) + +## Features + +- Drop-in replacement for the standard library `HashMap` and `HashSet` types. +- Uses `AHash` as the default hasher, which is much faster than SipHash. +- Around 2x faster than the previous standard library `HashMap`. +- Lower memory usage: only 1 byte of overhead per entry instead of 8. +- Compatible with `#[no_std]` (but requires a global allocator with the `alloc` crate). +- Empty hash maps do not allocate any memory. +- SIMD lookups to scan multiple hash entries in parallel. + +## Performance + +Compared to the previous implementation of `std::collections::HashMap` (Rust 1.35). + +With the hashbrown default AHash hasher (not HashDoS-resistant): + +```text + name oldstdhash ns/iter hashbrown ns/iter diff ns/iter diff % speedup + insert_ahash_highbits 20,846 7,397 -13,449 -64.52% x 2.82 + insert_ahash_random 20,515 7,796 -12,719 -62.00% x 2.63 + insert_ahash_serial 21,668 7,264 -14,404 -66.48% x 2.98 + insert_erase_ahash_highbits 29,570 17,498 -12,072 -40.83% x 1.69 + insert_erase_ahash_random 39,569 17,474 -22,095 -55.84% x 2.26 + insert_erase_ahash_serial 32,073 17,332 -14,741 -45.96% x 1.85 + iter_ahash_highbits 1,572 2,087 515 32.76% x 0.75 + iter_ahash_random 1,609 2,074 465 28.90% x 0.78 + iter_ahash_serial 2,293 2,120 -173 -7.54% x 1.08 + lookup_ahash_highbits 3,460 4,403 943 27.25% x 0.79 + lookup_ahash_random 6,377 3,911 -2,466 -38.67% x 1.63 + lookup_ahash_serial 3,629 3,586 -43 -1.18% x 1.01 + lookup_fail_ahash_highbits 5,286 3,411 -1,875 -35.47% x 1.55 + lookup_fail_ahash_random 12,365 4,171 -8,194 -66.27% x 2.96 + lookup_fail_ahash_serial 4,902 3,240 -1,662 -33.90% x 1.51 +``` + +With the libstd default SipHash hasher (HashDoS-resistant): + +```text + name oldstdhash ns/iter hashbrown ns/iter diff ns/iter diff % speedup + insert_std_highbits 32,598 20,199 -12,399 -38.04% x 1.61 + insert_std_random 29,824 20,760 -9,064 -30.39% x 1.44 + insert_std_serial 33,151 17,256 -15,895 -47.95% x 1.92 + insert_erase_std_highbits 74,731 48,735 -25,996 -34.79% x 1.53 + insert_erase_std_random 73,828 47,649 -26,179 -35.46% x 1.55 + insert_erase_std_serial 73,864 40,147 -33,717 -45.65% x 1.84 + iter_std_highbits 1,518 2,264 746 49.14% x 0.67 + iter_std_random 1,502 2,414 912 60.72% x 0.62 + iter_std_serial 6,361 2,118 -4,243 -66.70% x 3.00 + lookup_std_highbits 21,705 16,962 -4,743 -21.85% x 1.28 + lookup_std_random 21,654 17,158 -4,496 -20.76% x 1.26 + lookup_std_serial 18,726 14,509 -4,217 -22.52% x 1.29 + lookup_fail_std_highbits 25,852 17,323 -8,529 -32.99% x 1.49 + lookup_fail_std_random 25,913 17,760 -8,153 -31.46% x 1.46 + lookup_fail_std_serial 22,648 14,839 -7,809 -34.48% x 1.53 +``` + +## Usage + +Add this to your `Cargo.toml`: + +```toml +[dependencies] +hashbrown = "0.9" +``` + +Then: + +```rust +use hashbrown::HashMap; + +let mut map = HashMap::new(); +map.insert(1, "one"); +``` + +This crate has the following Cargo features: + +- `nightly`: Enables nightly-only features: `#[may_dangle]`. +- `serde`: Enables serde serialization support. +- `rayon`: Enables rayon parallel iterator support. +- `raw`: Enables access to the experimental and unsafe `RawTable` API. +- `inline-more`: Adds inline hints to most functions, improving run-time performance at the cost + of compilation time. (enabled by default) +- `ahash`: Compiles with ahash as default hasher. (enabled by default) +- `ahash-compile-time-rng`: Activates the `compile-time-rng` feature of ahash, to increase the + DOS-resistance, but can result in issues for `no_std` builds. More details in + [issue#124](https://github.com/rust-lang/hashbrown/issues/124). (enabled by default) + +## 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. diff --git a/vendor/hashbrown-0.9.1/benches/bench.rs b/vendor/hashbrown-0.9.1/benches/bench.rs new file mode 100644 index 0000000000..771e7169a5 --- /dev/null +++ b/vendor/hashbrown-0.9.1/benches/bench.rs @@ -0,0 +1,260 @@ +// This benchmark suite contains some benchmarks along a set of dimensions: +// Hasher: std default (SipHash) and crate default (AHash). +// Int key distribution: low bit heavy, top bit heavy, and random. +// Task: basic functionality: insert, insert_erase, lookup, lookup_fail, iter +#![feature(test)] + +extern crate test; + +use test::{black_box, Bencher}; + +use hashbrown::hash_map::DefaultHashBuilder; +use hashbrown::HashMap; +use std::collections::hash_map::RandomState; + +const SIZE: usize = 1000; + +// The default hashmap when using this crate directly. +type AHashMap = HashMap; +// This uses the hashmap from this crate with the default hasher of the stdlib. +type StdHashMap = HashMap; + +// A random key iterator. +#[derive(Clone, Copy)] +struct RandomKeys { + state: usize, +} + +impl RandomKeys { + fn new() -> Self { + RandomKeys { state: 0 } + } +} + +impl Iterator for RandomKeys { + type Item = usize; + fn next(&mut self) -> Option { + // Add 1 then multiply by some 32 bit prime. + self.state = self.state.wrapping_add(1).wrapping_mul(3787392781); + Some(self.state) + } +} + +macro_rules! bench_suite { + ($bench_macro:ident, $bench_ahash_serial:ident, $bench_std_serial:ident, + $bench_ahash_highbits:ident, $bench_std_highbits:ident, + $bench_ahash_random:ident, $bench_std_random:ident) => { + $bench_macro!($bench_ahash_serial, AHashMap, 0..); + $bench_macro!($bench_std_serial, StdHashMap, 0..); + $bench_macro!( + $bench_ahash_highbits, + AHashMap, + (0..).map(usize::swap_bytes) + ); + $bench_macro!( + $bench_std_highbits, + StdHashMap, + (0..).map(usize::swap_bytes) + ); + $bench_macro!($bench_ahash_random, AHashMap, RandomKeys::new()); + $bench_macro!($bench_std_random, StdHashMap, RandomKeys::new()); + }; +} + +macro_rules! bench_insert { + ($name:ident, $maptype:ident, $keydist:expr) => { + #[bench] + fn $name(b: &mut Bencher) { + let mut m = $maptype::with_capacity_and_hasher(SIZE, Default::default()); + b.iter(|| { + m.clear(); + for i in ($keydist).take(SIZE) { + m.insert(i, i); + } + black_box(&mut m); + }) + } + }; +} + +bench_suite!( + bench_insert, + insert_ahash_serial, + insert_std_serial, + insert_ahash_highbits, + insert_std_highbits, + insert_ahash_random, + insert_std_random +); + +macro_rules! bench_insert_erase { + ($name:ident, $maptype:ident, $keydist:expr) => { + #[bench] + fn $name(b: &mut Bencher) { + let mut base = $maptype::default(); + for i in ($keydist).take(SIZE) { + base.insert(i, i); + } + let skip = $keydist.skip(SIZE); + b.iter(|| { + let mut m = base.clone(); + let mut add_iter = skip.clone(); + let mut remove_iter = $keydist; + // While keeping the size constant, + // replace the first keydist with the second. + for (add, remove) in (&mut add_iter).zip(&mut remove_iter).take(SIZE) { + m.insert(add, add); + black_box(m.remove(&remove)); + } + black_box(m); + }) + } + }; +} + +bench_suite!( + bench_insert_erase, + insert_erase_ahash_serial, + insert_erase_std_serial, + insert_erase_ahash_highbits, + insert_erase_std_highbits, + insert_erase_ahash_random, + insert_erase_std_random +); + +macro_rules! bench_lookup { + ($name:ident, $maptype:ident, $keydist:expr) => { + #[bench] + fn $name(b: &mut Bencher) { + let mut m = $maptype::default(); + for i in $keydist.take(SIZE) { + m.insert(i, i); + } + + b.iter(|| { + for i in $keydist.take(SIZE) { + black_box(m.get(&i)); + } + }) + } + }; +} + +bench_suite!( + bench_lookup, + lookup_ahash_serial, + lookup_std_serial, + lookup_ahash_highbits, + lookup_std_highbits, + lookup_ahash_random, + lookup_std_random +); + +macro_rules! bench_lookup_fail { + ($name:ident, $maptype:ident, $keydist:expr) => { + #[bench] + fn $name(b: &mut Bencher) { + let mut m = $maptype::default(); + let mut iter = $keydist; + for i in (&mut iter).take(SIZE) { + m.insert(i, i); + } + + b.iter(|| { + for i in (&mut iter).take(SIZE) { + black_box(m.get(&i)); + } + }) + } + }; +} + +bench_suite!( + bench_lookup_fail, + lookup_fail_ahash_serial, + lookup_fail_std_serial, + lookup_fail_ahash_highbits, + lookup_fail_std_highbits, + lookup_fail_ahash_random, + lookup_fail_std_random +); + +macro_rules! bench_iter { + ($name:ident, $maptype:ident, $keydist:expr) => { + #[bench] + fn $name(b: &mut Bencher) { + let mut m = $maptype::default(); + for i in ($keydist).take(SIZE) { + m.insert(i, i); + } + + b.iter(|| { + for i in &m { + black_box(i); + } + }) + } + }; +} + +bench_suite!( + bench_iter, + iter_ahash_serial, + iter_std_serial, + iter_ahash_highbits, + iter_std_highbits, + iter_ahash_random, + iter_std_random +); + +#[bench] +fn clone_small(b: &mut Bencher) { + let mut m = HashMap::new(); + for i in 0..10 { + m.insert(i, i); + } + + b.iter(|| { + black_box(m.clone()); + }) +} + +#[bench] +fn clone_from_small(b: &mut Bencher) { + let mut m = HashMap::new(); + let mut m2 = HashMap::new(); + for i in 0..10 { + m.insert(i, i); + } + + b.iter(|| { + m2.clone_from(&m); + black_box(&mut m2); + }) +} + +#[bench] +fn clone_large(b: &mut Bencher) { + let mut m = HashMap::new(); + for i in 0..1000 { + m.insert(i, i); + } + + b.iter(|| { + black_box(m.clone()); + }) +} + +#[bench] +fn clone_from_large(b: &mut Bencher) { + let mut m = HashMap::new(); + let mut m2 = HashMap::new(); + for i in 0..1000 { + m.insert(i, i); + } + + b.iter(|| { + m2.clone_from(&m); + black_box(&mut m2); + }) +} diff --git a/vendor/hashbrown-0.9.1/clippy.toml b/vendor/hashbrown-0.9.1/clippy.toml new file mode 100644 index 0000000000..d98bf2c09b --- /dev/null +++ b/vendor/hashbrown-0.9.1/clippy.toml @@ -0,0 +1 @@ +doc-valid-idents = [ "CppCon", "SwissTable", "SipHash", "HashDoS" ] diff --git a/vendor/hashbrown-0.9.1/src/external_trait_impls/mod.rs b/vendor/hashbrown-0.9.1/src/external_trait_impls/mod.rs new file mode 100644 index 0000000000..ef497836cb --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/external_trait_impls/mod.rs @@ -0,0 +1,4 @@ +#[cfg(feature = "rayon")] +pub(crate) mod rayon; +#[cfg(feature = "serde")] +mod serde; diff --git a/vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/helpers.rs b/vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/helpers.rs new file mode 100644 index 0000000000..9382007ea2 --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/helpers.rs @@ -0,0 +1,26 @@ +use alloc::collections::LinkedList; +use alloc::vec::Vec; + +use rayon::iter::{IntoParallelIterator, ParallelIterator}; + +/// Helper for collecting parallel iterators to an intermediary +pub(super) fn collect(iter: I) -> (LinkedList>, usize) { + let list = iter + .into_par_iter() + .fold(Vec::new, |mut vec, elem| { + vec.push(elem); + vec + }) + .map(|vec| { + let mut list = LinkedList::new(); + list.push_back(vec); + list + }) + .reduce(LinkedList::new, |mut list1, mut list2| { + list1.append(&mut list2); + list1 + }); + + let len = list.iter().map(Vec::len).sum(); + (list, len) +} diff --git a/vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/map.rs b/vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/map.rs new file mode 100644 index 0000000000..334f8bb58b --- /dev/null +++ b/vendor/hashbrown-0.9.1/src/external_trait_impls/rayon/map.rs @@ -0,0 +1,666 @@ +//! Rayon extensions for `HashMap`. + +use crate::hash_map::HashMap; +use core::fmt; +use core::hash::{BuildHasher, Hash}; +use rayon::iter::plumbing::UnindexedConsumer; +use rayon::iter::{FromParallelIterator, IntoParallelIterator, ParallelExtend, ParallelIterator}; + +/// Parallel iterator over shared references to entries in a map. +/// +/// This iterator is created by the [`par_iter`] method on [`HashMap`] +/// (provided by the [`IntoParallelRefIterator`] trait). +/// See its documentation for more. +/// +/// [`par_iter`]: /hashbrown/struct.HashMap.html#method.par_iter +/// [`HashMap`]: /hashbrown/struct.HashMap.html +/// [`IntoParallelRefIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelRefIterator.html +pub struct ParIter<'a, K, V, S> { + map: &'a HashMap, +} + +impl<'a, K: Sync, V: Sync, S: Sync> ParallelIterator for ParIter<'a, K, V, S> { + type Item = (&'a K, &'a V); + + #[cfg_attr(feature = "inline-more", inline)] + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + unsafe { self.map.table.par_iter() } + .map(|x| unsafe { + let r = x.as_ref(); + (&r.0, &r.1) + }) + .drive_unindexed(consumer) + } +} + +impl Clone for ParIter<'_, K, V, S> { + #[cfg_attr(feature = "inline-more", inline)] + fn clone(&self) -> Self { + ParIter { map: self.map } + } +} + +impl fmt::Debug for ParIter<'_, K, V, S> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.map.iter().fmt(f) + } +} + +/// Parallel iterator over shared references to keys in a map. +/// +/// This iterator is created by the [`par_keys`] method on [`HashMap`]. +/// See its documentation for more. +/// +/// [`par_keys`]: /hashbrown/struct.HashMap.html#method.par_keys +/// [`HashMap`]: /hashbrown/struct.HashMap.html +pub struct ParKeys<'a, K, V, S> { + map: &'a HashMap, +} + +impl<'a, K: Sync, V: Sync, S: Sync> ParallelIterator for ParKeys<'a, K, V, S> { + type Item = &'a K; + + #[cfg_attr(feature = "inline-more", inline)] + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + unsafe { self.map.table.par_iter() } + .map(|x| unsafe { &x.as_ref().0 }) + .drive_unindexed(consumer) + } +} + +impl Clone for ParKeys<'_, K, V, S> { + #[cfg_attr(feature = "inline-more", inline)] + fn clone(&self) -> Self { + ParKeys { map: self.map } + } +} + +impl fmt::Debug for ParKeys<'_, K, V, S> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.map.keys().fmt(f) + } +} + +/// Parallel iterator over shared references to values in a map. +/// +/// This iterator is created by the [`par_values`] method on [`HashMap`]. +/// See its documentation for more. +/// +/// [`par_values`]: /hashbrown/struct.HashMap.html#method.par_values +/// [`HashMap`]: /hashbrown/struct.HashMap.html +pub struct ParValues<'a, K, V, S> { + map: &'a HashMap, +} + +impl<'a, K: Sync, V: Sync, S: Sync> ParallelIterator for ParValues<'a, K, V, S> { + type Item = &'a V; + + #[cfg_attr(feature = "inline-more", inline)] + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + unsafe { self.map.table.par_iter() } + .map(|x| unsafe { &x.as_ref().1 }) + .drive_unindexed(consumer) + } +} + +impl Clone for ParValues<'_, K, V, S> { + #[cfg_attr(feature = "inline-more", inline)] + fn clone(&self) -> Self { + ParValues { map: self.map } + } +} + +impl fmt::Debug for ParValues<'_, K, V, S> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.map.values().fmt(f) + } +} + +/// Parallel iterator over mutable references to entries in a map. +/// +/// This iterator is created by the [`par_iter_mut`] method on [`HashMap`] +/// (provided by the [`IntoParallelRefMutIterator`] trait). +/// See its documentation for more. +/// +/// [`par_iter_mut`]: /hashbrown/struct.HashMap.html#method.par_iter_mut +/// [`HashMap`]: /hashbrown/struct.HashMap.html +/// [`IntoParallelRefMutIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelRefMutIterator.html +pub struct ParIterMut<'a, K, V, S> { + map: &'a mut HashMap, +} + +impl<'a, K: Send + Sync, V: Send, S: Send> ParallelIterator for ParIterMut<'a, K, V, S> { + type Item = (&'a K, &'a mut V); + + #[cfg_attr(feature = "inline-more", inline)] + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + unsafe { self.map.table.par_iter() } + .map(|x| unsafe { + let r = x.as_mut(); + (&r.0, &mut r.1) + }) + .drive_unindexed(consumer) + } +} + +impl fmt::Debug + for ParIterMut<'_, K, V, S> +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.map.iter().fmt(f) + } +} + +/// Parallel iterator over mutable references to values in a map. +/// +/// This iterator is created by the [`par_values_mut`] method on [`HashMap`]. +/// See its documentation for more. +/// +/// [`par_values_mut`]: /hashbrown/struct.HashMap.html#method.par_values_mut +/// [`HashMap`]: /hashbrown/struct.HashMap.html +pub struct ParValuesMut<'a, K, V, S> { + map: &'a mut HashMap, +} + +impl<'a, K: Send, V: Send, S: Send> ParallelIterator for ParValuesMut<'a, K, V, S> { + type Item = &'a mut V; + + #[cfg_attr(feature = "inline-more", inline)] + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + unsafe { self.map.table.par_iter() } + .map(|x| unsafe { &mut x.as_mut().1 }) + .drive_unindexed(consumer) + } +} + +impl fmt::Debug for ParValuesMut<'_, K, V, S> { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.map.values().fmt(f) + } +} + +/// Parallel iterator over entries of a consumed map. +/// +/// This iterator is created by the [`into_par_iter`] method on [`HashMap`] +/// (provided by the [`IntoParallelIterator`] trait). +/// See its documentation for more. +/// +/// [`into_par_iter`]: /hashbrown/struct.HashMap.html#method.into_par_iter +/// [`HashMap`]: /hashbrown/struct.HashMap.html +/// [`IntoParallelIterator`]: https://docs.rs/rayon/1.0/rayon/iter/trait.IntoParallelIterator.html +pub struct IntoParIter { + map: HashMap, +} + +impl ParallelIterator for IntoParIter { + type Item = (K, V); + + #[cfg_attr(feature = "inline-more", inline)] + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + self.map.table.into_par_iter().drive_unindexed(consumer) + } +} + +impl fmt::Debug for IntoParIter { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.map.iter().fmt(f) + } +} + +/// Parallel draining iterator over entries of a map. +/// +/// This iterator is created by the [`par_drain`] method on [`HashMap`]. +/// See its documentation for more. +/// +/// [`par_drain`]: /hashbrown/struct.HashMap.html#method.par_drain +/// [`HashMap`]: /hashbrown/struct.HashMap.html +pub struct ParDrain<'a, K, V, S> { + map: &'a mut HashMap, +} + +impl ParallelIterator for ParDrain<'_, K, V, S> { + type Item = (K, V); + + #[cfg_attr(feature = "inline-more", inline)] + fn drive_unindexed(self, consumer: C) -> C::Result + where + C: UnindexedConsumer, + { + self.map.table.par_drain().drive_unindexed(consumer) + } +} + +impl fmt::Debug + for ParDrain<'_, K, V, S> +{ + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + self.map.iter().fmt(f) + } +} + +impl HashMap { + /// Visits (potentially in parallel) immutably borrowed keys in an arbitrary order. + #[cfg_attr(feature = "inline-more", inline)] + pub fn par_keys(&self) -> ParKeys<'_, K, V, S> { + ParKeys { map: self } + } + + /// Visits (potentially in parallel) immutably borrowed values in an arbitrary order. + #[cfg_attr(feature = "inline-more", inline)] + pub fn par_values(&self) -> ParValues<'_, K, V, S> { + ParValues { map: self } + } +} + +impl HashMap { + /// Visits (potentially in parallel) mutably borrowed values in an arbitrary order. + #[cfg_attr(feature = "inline-more", inline)] + pub fn par_values_mut(&mut self) -> ParValuesMut<'_, K, V, S> { + ParValuesMut { map: self } + } + + /// Consumes (potentially in parallel) all values in an arbitrary order, + /// while preserving the map's allocated memory for reuse. + #[cfg_attr(feature = "inline-more", inline)] + pub fn par_drain(&mut self) -> ParDrain<'_, K, V, S> { + ParDrain { map: self } + } +} + +impl HashMap +where + K: Eq + Hash + Sync, + V: PartialEq + Sync, + S: BuildHasher + Sync, +{ + /// Returns `true` if the map is equal to another, + /// i.e. both maps contain the same keys mapped to the same values. + /// + /// This method runs in a potentially parallel fashion. + pub fn par_eq(&self, other: &Self) -> bool { + self.len() == other.len() + && self + .into_par_iter() + .all(|(key, value)| other.get(key).map_or(false, |v| *value == *v)) + } +} + +impl IntoParallelIterator for HashMap { + type Item = (K, V); + type Iter = IntoParIter; + + #[cfg_attr(feature = "inline-more", inline)] + fn into_par_iter(self) -> Self::Iter { + IntoParIter { map: self } + } +} + +impl<'a, K: Sync, V: Sync, S: Sync> IntoParallelIterator for &'a HashMap { + type Item = (&'a K, &'a V); + type Iter = ParIter<'a, K, V, S>; + + #[cfg_attr(feature = "inline-more", inline)] + fn into_par_iter(self) -> Self::Iter { + ParIter { map: self } + } +} + +impl<'a, K: Send + Sync, V: Send, S: Send> IntoParallelIterator for &'a mut HashMap { + type Item = (&'a K, &'a mut V); + type Iter = ParIterMut<'a, K, V, S>; + + #[cfg_attr(feature = "inline-more", inline)] + fn into_par_iter(self) -> Self::Iter { + ParIterMut { map: self } + } +} + +/// Collect (key, value) pairs from a parallel iterator into a +/// hashmap. If multiple pairs correspond to the same key, then the +/// ones produced earlier in the parallel iterator will be +/// overwritten, just as with a sequential iterator. +impl FromParallelIterator<(K, V)> for HashMap +where + K: Eq + Hash + Send, + V: Send, + S: BuildHasher + Default, +{ + fn from_par_iter

    "#; - let expected_result = "
    content
    "; assert_eq!(minify(source), expected_result); diff --git a/vendor/minifier/src/js/mod.rs b/vendor/minifier/src/js/mod.rs index e121b5b5ec..4e025a5750 100644 --- a/vendor/minifier/src/js/mod.rs +++ b/vendor/minifier/src/js/mod.rs @@ -21,34 +21,17 @@ // SOFTWARE. mod token; -mod js; +mod tools; mod utils; -pub use self::js::{ - aggregate_strings, - aggregate_strings_with_separation, - aggregate_strings_into_array, - aggregate_strings_into_array_filter, +pub use self::token::{tokenize, Condition, Keyword, Operation, ReservedChar, Token, Tokens}; +pub use self::tools::{ + aggregate_strings, aggregate_strings_into_array, aggregate_strings_into_array_filter, aggregate_strings_into_array_with_separation, - aggregate_strings_into_array_with_separation_filter, - minify, + aggregate_strings_into_array_with_separation_filter, aggregate_strings_with_separation, minify, simple_minify, }; -pub use self::token::{ - tokenize, - Condition, - Keyword, - Operation, - ReservedChar, - Token, - Tokens, -}; pub use self::utils::{ - clean_token, - clean_tokens, - clean_token_except, - clean_tokens_except, - get_variable_name_and_value_positions, - replace_token_with, - replace_tokens_with, + clean_token, clean_token_except, clean_tokens, clean_tokens_except, + get_variable_name_and_value_positions, replace_token_with, replace_tokens_with, }; diff --git a/vendor/minifier/src/js/token.rs b/vendor/minifier/src/js/token.rs index c944fb159f..1de2e1a108 100644 --- a/vendor/minifier/src/js/token.rs +++ b/vendor/minifier/src/js/token.rs @@ -20,14 +20,10 @@ // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. +use std::convert::TryFrom; use std::fmt; use std::str::{CharIndices, FromStr}; -pub trait MyTryFrom: Sized { - type Error; - fn try_from(value: T) -> Result; -} - #[derive(Debug, PartialEq, Eq, PartialOrd, Ord, Hash, Clone, Copy)] pub enum ReservedChar { Comma, @@ -58,87 +54,92 @@ pub enum ReservedChar { SuperiorThan, Pipe, Ampersand, + BackTick, } impl ReservedChar { pub fn is_white_character(&self) -> bool { - *self == ReservedChar::Space || - *self == ReservedChar::Tab || - *self == ReservedChar::Backline + *self == ReservedChar::Space + || *self == ReservedChar::Tab + || *self == ReservedChar::Backline } } impl fmt::Display for ReservedChar { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", - match *self { - ReservedChar::Comma => ',', - ReservedChar::OpenParenthese => '(', - ReservedChar::CloseParenthese => ')', - ReservedChar::OpenCurlyBrace => '{', - ReservedChar::CloseCurlyBrace => '}', - ReservedChar::OpenBracket => '[', - ReservedChar::CloseBracket => ']', - ReservedChar::Colon => ':', - ReservedChar::SemiColon => ';', - ReservedChar::Dot => '.', - ReservedChar::Quote => '\'', - ReservedChar::DoubleQuote => '"', - ReservedChar::ExclamationMark => '!', - ReservedChar::QuestionMark => '?', - ReservedChar::Slash => '/', - ReservedChar::Modulo => '%', - ReservedChar::Star => '*', - ReservedChar::Minus => '-', - ReservedChar::Plus => '+', - ReservedChar::EqualSign => '=', - ReservedChar::Backslash => '\\', - ReservedChar::Space => ' ', - ReservedChar::Tab => '\t', - ReservedChar::Backline => '\n', - ReservedChar::LessThan => '<', - ReservedChar::SuperiorThan => '>', - ReservedChar::Pipe => '|', - ReservedChar::Ampersand => '&', - }) + write!( + f, + "{}", + match *self { + ReservedChar::Comma => ',', + ReservedChar::OpenParenthese => '(', + ReservedChar::CloseParenthese => ')', + ReservedChar::OpenCurlyBrace => '{', + ReservedChar::CloseCurlyBrace => '}', + ReservedChar::OpenBracket => '[', + ReservedChar::CloseBracket => ']', + ReservedChar::Colon => ':', + ReservedChar::SemiColon => ';', + ReservedChar::Dot => '.', + ReservedChar::Quote => '\'', + ReservedChar::DoubleQuote => '"', + ReservedChar::ExclamationMark => '!', + ReservedChar::QuestionMark => '?', + ReservedChar::Slash => '/', + ReservedChar::Modulo => '%', + ReservedChar::Star => '*', + ReservedChar::Minus => '-', + ReservedChar::Plus => '+', + ReservedChar::EqualSign => '=', + ReservedChar::Backslash => '\\', + ReservedChar::Space => ' ', + ReservedChar::Tab => '\t', + ReservedChar::Backline => '\n', + ReservedChar::LessThan => '<', + ReservedChar::SuperiorThan => '>', + ReservedChar::Pipe => '|', + ReservedChar::Ampersand => '&', + ReservedChar::BackTick => '`', + } + ) } } -impl MyTryFrom for ReservedChar { +impl TryFrom for ReservedChar { type Error = &'static str; fn try_from(value: char) -> Result { match value { - ',' => Ok(ReservedChar::Comma), - '(' => Ok(ReservedChar::OpenParenthese), - ')' => Ok(ReservedChar::CloseParenthese), - '{' => Ok(ReservedChar::OpenCurlyBrace), - '}' => Ok(ReservedChar::CloseCurlyBrace), - '[' => Ok(ReservedChar::OpenBracket), - ']' => Ok(ReservedChar::CloseBracket), - ':' => Ok(ReservedChar::Colon), - ';' => Ok(ReservedChar::SemiColon), - '.' => Ok(ReservedChar::Dot), + ',' => Ok(ReservedChar::Comma), + '(' => Ok(ReservedChar::OpenParenthese), + ')' => Ok(ReservedChar::CloseParenthese), + '{' => Ok(ReservedChar::OpenCurlyBrace), + '}' => Ok(ReservedChar::CloseCurlyBrace), + '[' => Ok(ReservedChar::OpenBracket), + ']' => Ok(ReservedChar::CloseBracket), + ':' => Ok(ReservedChar::Colon), + ';' => Ok(ReservedChar::SemiColon), + '.' => Ok(ReservedChar::Dot), '\'' => Ok(ReservedChar::Quote), - '"' => Ok(ReservedChar::DoubleQuote), - '!' => Ok(ReservedChar::ExclamationMark), - '?' => Ok(ReservedChar::QuestionMark), - '/' => Ok(ReservedChar::Slash), - '%' => Ok(ReservedChar::Modulo), - '*' => Ok(ReservedChar::Star), - '-' => Ok(ReservedChar::Minus), - '+' => Ok(ReservedChar::Plus), - '=' => Ok(ReservedChar::EqualSign), + '"' => Ok(ReservedChar::DoubleQuote), + '!' => Ok(ReservedChar::ExclamationMark), + '?' => Ok(ReservedChar::QuestionMark), + '/' => Ok(ReservedChar::Slash), + '%' => Ok(ReservedChar::Modulo), + '*' => Ok(ReservedChar::Star), + '-' => Ok(ReservedChar::Minus), + '+' => Ok(ReservedChar::Plus), + '=' => Ok(ReservedChar::EqualSign), '\\' => Ok(ReservedChar::Backslash), - ' ' => Ok(ReservedChar::Space), + ' ' => Ok(ReservedChar::Space), '\t' => Ok(ReservedChar::Tab), - '\n' | - '\r' => Ok(ReservedChar::Backline), - '<' => Ok(ReservedChar::LessThan), - '>' => Ok(ReservedChar::SuperiorThan), - '|' => Ok(ReservedChar::Pipe), - '&' => Ok(ReservedChar::Ampersand), - _ => Err("Unknown reserved char"), + '\n' | '\r' => Ok(ReservedChar::Backline), + '<' => Ok(ReservedChar::LessThan), + '>' => Ok(ReservedChar::SuperiorThan), + '|' => Ok(ReservedChar::Pipe), + '&' => Ok(ReservedChar::Ampersand), + '`' => Ok(ReservedChar::BackTick), + _ => Err("Unknown reserved char"), } } } @@ -180,53 +181,53 @@ pub enum Keyword { impl Keyword { fn requires_before(&self) -> bool { - match *self { - Keyword::In | Keyword::InstanceOf => true, - _ => false, - } + matches!(*self, Keyword::In | Keyword::InstanceOf) } } impl fmt::Display for Keyword { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", - match *self { - Keyword::Break => "break", - Keyword::Case => "case", - Keyword::Catch => "catch", - Keyword::Const => "const", - Keyword::Continue => "continue", - Keyword::Default => "default", - Keyword::Do => "do", - Keyword::Else => "else", - Keyword::False => "false", - Keyword::Finally => "finally", - Keyword::Function => "function", - Keyword::For => "for", - Keyword::If => "if", - Keyword::In => "in", - Keyword::InstanceOf => "instanceof", - Keyword::Let => "let", - Keyword::New => "new", - Keyword::Null => "null", - Keyword::Private => "private", - Keyword::Protected => "protected", - Keyword::Public => "public", - Keyword::Return => "return", - Keyword::Switch => "switch", - Keyword::This => "this", - Keyword::Throw => "throw", - Keyword::True => "true", - Keyword::Try => "try", - Keyword::Typeof => "typeof", - Keyword::Static => "static", - Keyword::Var => "var", - Keyword::While => "while", - }) + write!( + f, + "{}", + match *self { + Keyword::Break => "break", + Keyword::Case => "case", + Keyword::Catch => "catch", + Keyword::Const => "const", + Keyword::Continue => "continue", + Keyword::Default => "default", + Keyword::Do => "do", + Keyword::Else => "else", + Keyword::False => "false", + Keyword::Finally => "finally", + Keyword::Function => "function", + Keyword::For => "for", + Keyword::If => "if", + Keyword::In => "in", + Keyword::InstanceOf => "instanceof", + Keyword::Let => "let", + Keyword::New => "new", + Keyword::Null => "null", + Keyword::Private => "private", + Keyword::Protected => "protected", + Keyword::Public => "public", + Keyword::Return => "return", + Keyword::Switch => "switch", + Keyword::This => "this", + Keyword::Throw => "throw", + Keyword::True => "true", + Keyword::Try => "try", + Keyword::Typeof => "typeof", + Keyword::Static => "static", + Keyword::Var => "var", + Keyword::While => "while", + } + ) } } -impl<'a> MyTryFrom<&'a str> for Keyword { +impl<'a> TryFrom<&'a str> for Keyword { type Error = &'static str; fn try_from(value: &str) -> Result { @@ -283,23 +284,26 @@ pub enum Condition { impl fmt::Display for Condition { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", - match *self { - Condition::And => "&&", - Condition::Or => "||", - Condition::DifferentThan => "!=", - Condition::SuperDifferentThan => "!==", - Condition::EqualTo => "==", - Condition::SuperEqualTo => "===", - Condition::SuperiorThan => ">", - Condition::SuperiorOrEqualTo => ">=", - Condition::InferiorThan => "<", - Condition::InferiorOrEqualTo => "<=", - }) + write!( + f, + "{}", + match *self { + Condition::And => "&&", + Condition::Or => "||", + Condition::DifferentThan => "!=", + Condition::SuperDifferentThan => "!==", + Condition::EqualTo => "==", + Condition::SuperEqualTo => "===", + Condition::SuperiorThan => ">", + Condition::SuperiorOrEqualTo => ">=", + Condition::InferiorThan => "<", + Condition::InferiorOrEqualTo => "<=", + } + ) } } -impl MyTryFrom for Condition { +impl TryFrom for Condition { type Error = &'static str; fn try_from(value: ReservedChar) -> Result { @@ -326,26 +330,43 @@ pub enum Operation { Equal, } +impl Operation { + pub fn is_assign(&self) -> bool { + matches!( + *self, + Operation::AdditionEqual + | Operation::SubtractEqual + | Operation::MultiplyEqual + | Operation::DivideEqual + | Operation::ModuloEqual + | Operation::Equal + ) + } +} + impl fmt::Display for Operation { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - write!(f, "{}", - match *self { - Operation::Addition => "+", - Operation::AdditionEqual => "+=", - Operation::Subtract => "-", - Operation::SubtractEqual => "-=", - Operation::Multiply => "*", - Operation::MultiplyEqual => "*=", - Operation::Divide => "/", - Operation::DivideEqual => "/=", - Operation::Modulo => "%", - Operation::ModuloEqual => "%=", - Operation::Equal => "=", - }) + write!( + f, + "{}", + match *self { + Operation::Addition => "+", + Operation::AdditionEqual => "+=", + Operation::Subtract => "-", + Operation::SubtractEqual => "-=", + Operation::Multiply => "*", + Operation::MultiplyEqual => "*=", + Operation::Divide => "/", + Operation::DivideEqual => "/=", + Operation::Modulo => "%", + Operation::ModuloEqual => "%=", + Operation::Equal => "=", + } + ) } } -impl MyTryFrom for Operation { +impl TryFrom for Operation { type Error = &'static str; fn try_from(value: ReservedChar) -> Result { @@ -387,11 +408,13 @@ impl<'a> fmt::Display for Token<'a> { match *self { Token::Keyword(x) => write!(f, "{}", x), Token::Char(x) => write!(f, "{}", x), - Token::String(x) | - Token::Comment(x) | - Token::Other(x) => write!(f, "{}", x), + Token::String(x) | Token::Comment(x) | Token::Other(x) => write!(f, "{}", x), Token::License(x) => write!(f, "/*!{}*/", x), - Token::Regex { regex, is_global, is_interactive } => { + Token::Regex { + regex, + is_global, + is_interactive, + } => { let x = write!(f, "/{}/", regex); if is_global { write!(f, "g")?; @@ -413,24 +436,15 @@ impl<'a> fmt::Display for Token<'a> { impl<'a> Token<'a> { pub fn is_comment(&self) -> bool { - match *self { - Token::Comment(_) => true, - _ => false, - } + matches!(*self, Token::Comment(_)) } pub fn is_license(&self) -> bool { - match *self { - Token::License(_) => true, - _ => false, - } + matches!(*self, Token::License(_)) } pub fn is_reserved_char(&self) -> bool { - match *self { - Token::Char(_) => true, - _ => false, - } + matches!(*self, Token::Char(_)) } pub fn get_char(&self) -> Option { @@ -455,10 +469,7 @@ impl<'a> Token<'a> { } pub fn is_operation(&self) -> bool { - match *self { - Token::Operation(_) => true, - _ => false, - } + matches!(*self, Token::Operation(_)) } pub fn eq_condition(&self, cond: Condition) -> bool { @@ -469,17 +480,11 @@ impl<'a> Token<'a> { } pub fn is_condition(&self) -> bool { - match *self { - Token::Condition(_) => true, - _ => false, - } + matches!(*self, Token::Condition(_)) } pub fn is_other(&self) -> bool { - match *self { - Token::Other(_) => true, - _ => false, - } + matches!(*self, Token::Other(_)) } pub fn get_other(&self) -> Option<&str> { @@ -497,10 +502,7 @@ impl<'a> Token<'a> { } pub fn is_keyword(&self) -> bool { - match *self { - Token::Keyword(_) => true, - _ => false, - } + matches!(*self, Token::Keyword(_)) } pub fn get_keyword(&self) -> Option { @@ -511,10 +513,7 @@ impl<'a> Token<'a> { } pub fn is_string(&self) -> bool { - match *self { - Token::String(_) => true, - _ => false, - } + matches!(*self, Token::String(_)) } pub fn get_string(&self) -> Option<&str> { @@ -525,47 +524,32 @@ impl<'a> Token<'a> { } pub fn is_regex(&self) -> bool { - match *self { - Token::Regex { .. } => true, - _ => false, - } + matches!(*self, Token::Regex { .. }) } pub fn is_created_var_decl(&self) -> bool { - match *self { - Token::CreatedVarDecl(_) => true, - _ => false, - } + matches!(*self, Token::CreatedVarDecl(_)) } pub fn is_created_var(&self) -> bool { - match *self { - Token::CreatedVar(_) => true, - _ => false, - } + matches!(*self, Token::CreatedVar(_)) } pub fn is_number(&self) -> bool { - match *self { - Token::Number(_) => true, - _ => false, - } + matches!(*self, Token::Number(_)) } pub fn is_floating_number(&self) -> bool { - match *self { - Token::FloatingNumber(_) => true, - _ => false, - } + matches!(*self, Token::FloatingNumber(_)) } fn get_required(&self) -> Option { match *self { - Token::Keyword(_) | - Token::Other(_) | - Token::CreatedVarDecl(_) | - Token::Number(_) | - Token::FloatingNumber(_) => Some(' '), + Token::Keyword(_) + | Token::Other(_) + | Token::CreatedVarDecl(_) + | Token::Number(_) + | Token::FloatingNumber(_) => Some(' '), _ => None, } } @@ -578,10 +562,13 @@ impl<'a> Token<'a> { } } -fn get_line_comment<'a>(source: &'a str, iterator: &mut MyPeekable<'_>, - start_pos: &mut usize) -> Option> { +fn get_line_comment<'a>( + source: &'a str, + iterator: &mut MyPeekable<'_>, + start_pos: &mut usize, +) -> Option> { *start_pos += 1; - while let Some((pos, c)) = iterator.next() { + for (pos, c) in iterator { if let Ok(c) = ReservedChar::try_from(c) { if c == ReservedChar::Backline { let ret = Some(Token::Comment(&source[*start_pos..pos])); @@ -593,34 +580,34 @@ fn get_line_comment<'a>(source: &'a str, iterator: &mut MyPeekable<'_>, None } -fn get_regex<'a>(source: &'a str, iterator: &mut MyPeekable<'_>, - start_pos: &mut usize, v: &[Token]) -> Option> { +fn get_regex<'a>( + source: &'a str, + iterator: &mut MyPeekable<'_>, + start_pos: &mut usize, + v: &[Token], +) -> Option> { let mut back = v.len(); while back > 0 { back -= 1; if v[back].is_white_character() || v[back].is_comment() || v[back].is_license() { - continue + continue; } match &v[back] { - Token::Char(ReservedChar::SemiColon) | - Token::Char(ReservedChar::Colon) | - Token::Char(ReservedChar::Comma) | - Token::Char(ReservedChar::OpenBracket) | - Token::Char(ReservedChar::CloseBracket) | - Token::Char(ReservedChar::OpenParenthese) | - Token::Char(ReservedChar::CloseParenthese) => break, - x if x.is_operation() || x.is_number() || x.is_floating_number() || - x.is_condition() || x.is_other() => break, + Token::Char(ReservedChar::SemiColon) + | Token::Char(ReservedChar::Colon) + | Token::Char(ReservedChar::Comma) + | Token::Char(ReservedChar::OpenBracket) + | Token::Char(ReservedChar::OpenParenthese) + | Token::Operation(Operation::Equal) => break, _ => return None, } } iterator.start_save(); - *start_pos += 1; while let Some((pos, c)) = iterator.next() { if c == '\\' { // we skip next character iterator.next(); - continue + continue; } if let Ok(c) = ReservedChar::try_from(c) { if c == ReservedChar::Slash { @@ -637,14 +624,14 @@ fn get_regex<'a>(source: &'a str, iterator: &mut MyPeekable<'_>, add += 1; } let ret = Some(Token::Regex { - regex: &source[*start_pos..pos], - is_interactive: is_interactive, - is_global: is_global, - }); + regex: &source[*start_pos + 1..pos], + is_interactive, + is_global, + }); *start_pos = pos + add; iterator.drop_save(); return ret; - } else if c.is_white_character() { + } else if c == ReservedChar::Backline { break; } } @@ -653,8 +640,11 @@ fn get_regex<'a>(source: &'a str, iterator: &mut MyPeekable<'_>, None } -fn get_comment<'a>(source: &'a str, iterator: &mut MyPeekable<'_>, - start_pos: &mut usize) -> Option> { +fn get_comment<'a>( + source: &'a str, + iterator: &mut MyPeekable<'_>, + start_pos: &mut usize, +) -> Option> { let mut prev = ReservedChar::Quote; *start_pos += 1; let builder = if let Some((_, c)) = iterator.next() { @@ -671,7 +661,7 @@ fn get_comment<'a>(source: &'a str, iterator: &mut MyPeekable<'_>, Token::Comment }; - while let Some((pos, c)) = iterator.next() { + for (pos, c) in iterator { if let Ok(c) = ReservedChar::try_from(c) { if c == ReservedChar::Slash && prev == ReservedChar::Star { let ret = Some(builder(&source[*start_pos..pos - 1])); @@ -686,13 +676,17 @@ fn get_comment<'a>(source: &'a str, iterator: &mut MyPeekable<'_>, None } -fn get_string<'a>(source: &'a str, iterator: &mut MyPeekable<'_>, start_pos: &mut usize, - start: ReservedChar) -> Option> { +fn get_string<'a>( + source: &'a str, + iterator: &mut MyPeekable<'_>, + start_pos: &mut usize, + start: ReservedChar, +) -> Option> { while let Some((pos, c)) = iterator.next() { if c == '\\' { // we skip next character iterator.next(); - continue + continue; } if let Ok(c) = ReservedChar::try_from(c) { if c == start { @@ -705,10 +699,62 @@ fn get_string<'a>(source: &'a str, iterator: &mut MyPeekable<'_>, start_pos: &mu None } +fn get_backtick_string<'a>( + source: &'a str, + iterator: &mut MyPeekable<'_>, + start_pos: &mut usize, +) -> Option> { + while let Some((pos, c)) = iterator.next() { + if c == '\\' { + // we skip next character + iterator.next(); + continue; + } + if c == '$' && iterator.peek().map(|(_, c)| c == '{').unwrap_or(false) { + let mut count = 0; + + loop { + if let Some((mut pos, c)) = iterator.next() { + if c == '\\' { + // we skip next character + iterator.next(); + continue; + } else if c == '"' || c == '\'' { + // We don't care about the result + get_string( + source, + iterator, + &mut pos, + ReservedChar::try_from(c) + .expect("ReservedChar::try_from unexpectedly failed..."), + ); + } else if c == '`' { + get_backtick_string(source, iterator, &mut pos); + } else if c == '{' { + count += 1; + } else if c == '}' { + count -= 1; + if count == 0 { + break; + } + } + } else { + return None; + } + } + } else if c == '`' { + let ret = Some(Token::String(&source[*start_pos..pos + 1])); + *start_pos = pos; + return ret; + } + } + None +} + fn first_useful<'a>(v: &'a [Token<'a>]) -> Option<&'a Token<'a>> { for x in v.iter().rev() { if x.is_white_character() { - continue + continue; } return Some(x); } @@ -873,7 +919,7 @@ impl<'a> Iterator for MyPeekable<'a> { } } -pub fn tokenize<'a>(source: &'a str) -> Tokens<'a> { +pub fn tokenize(source: &str) -> Tokens<'_> { let mut v = Vec::with_capacity(1000); let mut start = 0; let mut iterator = MyPeekable::new(source.char_indices()); @@ -883,7 +929,7 @@ pub fn tokenize<'a>(source: &'a str) -> Tokens<'a> { Some(x) => x, None => { fill_other(source, &mut v, start, source.len()); - break + break; } }; if let Ok(c) = ReservedChar::try_from(c) { @@ -897,7 +943,7 @@ pub fn tokenize<'a>(source: &'a str) -> Tokens<'a> { } } if cont { - continue + continue; } } fill_other(source, &mut v, start, pos); @@ -906,6 +952,10 @@ pub fn tokenize<'a>(source: &'a str) -> Tokens<'a> { if let Some(s) = get_string(source, &mut iterator, &mut pos, c) { v.push(s); }, + c == ReservedChar::BackTick => + if let Some(s) = get_backtick_string(source, &mut iterator, &mut pos) { + v.push(s); + }, c == ReservedChar::Slash && v.last().unwrap_or(&Token::Other("")).eq_operation(Operation::Divide) => { v.pop(); @@ -965,18 +1015,20 @@ impl<'a> fmt::Display for Tokens<'a> { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { let tokens = &self.0; for i in 0..tokens.len() { - if i > 0 && - tokens[i].requires_before() && - !tokens[i - 1].is_keyword() && - !tokens[i - 1].is_other() && - !tokens[i - 1].is_reserved_char() && - !tokens[i - 1].is_string() { + if i > 0 + && tokens[i].requires_before() + && !tokens[i - 1].is_keyword() + && !tokens[i - 1].is_other() + && !tokens[i - 1].is_reserved_char() + && !tokens[i - 1].is_string() + { write!(f, " ")?; } write!(f, "{}", tokens[i])?; if let Some(c) = match tokens[i] { - Token::Keyword(_) | - Token::Other(_) if i + 1 < tokens.len() => tokens[i + 1].get_required(), + Token::Keyword(_) | Token::Other(_) if i + 1 < tokens.len() => { + tokens[i + 1].get_required() + } _ => None, } { write!(f, "{}", c)?; @@ -988,7 +1040,9 @@ impl<'a> fmt::Display for Tokens<'a> { impl<'a> Tokens<'a> { pub fn apply(self, func: F) -> Tokens<'a> - where F: Fn(Tokens<'a>) -> Tokens<'a> { + where + F: Fn(Tokens<'a>) -> Tokens<'a>, + { func(self) } } @@ -1003,9 +1057,7 @@ impl<'a> IntoIterator for Tokens<'a> { fn into_iter(mut self) -> Self::IntoIter { self.0.reverse(); - IntoIterTokens { - inner: self, - } + IntoIterTokens { inner: self } } } @@ -1051,24 +1103,28 @@ fn check_regex() { assert_eq!(::js::minify(source), expected_result); let v = tokenize(source).apply(::js::clean_tokens); - assert_eq!(v.0[3], - Token::Regex { - regex: "\"\\.x", - is_global: true, - is_interactive: false, - }); + assert_eq!( + v.0[3], + Token::Regex { + regex: "\"\\.x", + is_global: true, + is_interactive: false, + } + ); let source = r#"var x = /"\.x/gigigigig;var x = "hello";"#; let expected_result = r#"var x=/"\.x/gi;var x="hello""#; assert_eq!(::js::minify(source), expected_result); let v = tokenize(source).apply(::js::clean_tokens); - assert_eq!(v.0[3], - Token::Regex { - regex: "\"\\.x", - is_global: true, - is_interactive: true, - }); + assert_eq!( + v.0[3], + Token::Regex { + regex: "\"\\.x", + is_global: true, + is_interactive: true, + } + ); } #[test] @@ -1078,24 +1134,43 @@ fn more_regex() { assert_eq!(::js::minify(source), expected_result); let v = tokenize(source).apply(::js::clean_tokens); - assert_eq!(v.0[3], - Token::Regex { - regex: "\"\\.x\\/a", - is_global: false, - is_interactive: true, - }); + assert_eq!( + v.0[3], + Token::Regex { + regex: "\"\\.x\\/a", + is_global: false, + is_interactive: true, + } + ); let source = r#"var x = /\\/i;"#; let expected_result = r#"var x=/\\/i"#; assert_eq!(::js::minify(source), expected_result); let v = tokenize(source).apply(::js::clean_tokens); - assert_eq!(v.0[3], - Token::Regex { - regex: "\\\\", - is_global: false, - is_interactive: true, - }); + assert_eq!( + v.0[3], + Token::Regex { + regex: "\\\\", + is_global: false, + is_interactive: true, + } + ); +} + +#[test] +fn even_more_regex() { + let source = r#"var x = /a-z /;"#; + + let v = tokenize(source).apply(::js::clean_tokens); + assert_eq!( + v.0[3], + Token::Regex { + regex: "a-z ", + is_global: false, + is_interactive: false, + } + ); } #[test] @@ -1103,20 +1178,40 @@ fn not_regex_test() { let source = "( x ) / 2; x / y;x /= y"; let v = tokenize(source).apply(::js::clean_tokens); - assert_eq!(&v.0, - &[Token::Char(ReservedChar::OpenParenthese), - Token::Other("x"), - Token::Char(ReservedChar::CloseParenthese), - Token::Operation(Operation::Divide), - Token::Number(2), - Token::Char(ReservedChar::SemiColon), - Token::Other("x"), - Token::Operation(Operation::Divide), - Token::Other("y"), - Token::Char(ReservedChar::SemiColon), - Token::Other("x"), - Token::Operation(Operation::DivideEqual), - Token::Other("y")]); + assert_eq!( + &v.0, + &[ + Token::Char(ReservedChar::OpenParenthese), + Token::Other("x"), + Token::Char(ReservedChar::CloseParenthese), + Token::Operation(Operation::Divide), + Token::Number(2), + Token::Char(ReservedChar::SemiColon), + Token::Other("x"), + Token::Operation(Operation::Divide), + Token::Other("y"), + Token::Char(ReservedChar::SemiColon), + Token::Other("x"), + Token::Operation(Operation::DivideEqual), + Token::Other("y") + ] + ); + + let source = "let x = /x\ny/;"; + + let v = tokenize(source).apply(::js::clean_tokens); + assert_eq!( + &v.0, + &[ + Token::Keyword(Keyword::Let), + Token::Other("x"), + Token::Operation(Operation::Equal), + Token::Operation(Operation::Divide), + Token::Other("x"), + Token::Other("y"), + Token::Operation(Operation::Divide) + ] + ); } #[test] @@ -1124,13 +1219,17 @@ fn test_tokens_parsing() { let source = "true = == 2.3 === 32"; let v = tokenize(source).apply(::js::clean_tokens); - assert_eq!(&v.0, - &[Token::Keyword(Keyword::True), - Token::Operation(Operation::Equal), - Token::Condition(Condition::EqualTo), - Token::FloatingNumber("2.3"), - Token::Condition(Condition::SuperEqualTo), - Token::Number(32)]); + assert_eq!( + &v.0, + &[ + Token::Keyword(Keyword::True), + Token::Operation(Operation::Equal), + Token::Condition(Condition::EqualTo), + Token::FloatingNumber("2.3"), + Token::Condition(Condition::SuperEqualTo), + Token::Number(32) + ] + ); } #[test] @@ -1138,11 +1237,15 @@ fn test_string_parsing() { let source = "var x = 'hello people!'"; let v = tokenize(source).apply(::js::clean_tokens); - assert_eq!(&v.0, - &[Token::Keyword(Keyword::Var), - Token::Other("x"), - Token::Operation(Operation::Equal), - Token::String("\'hello people!\'")]); + assert_eq!( + &v.0, + &[ + Token::Keyword(Keyword::Var), + Token::Other("x"), + Token::Operation(Operation::Equal), + Token::String("\'hello people!\'") + ] + ); } #[test] @@ -1150,29 +1253,33 @@ fn test_number_parsing() { let source = "var x = .12; let y = 4.; var z = 12; .3 4. 'a' let u = 12.2"; let v = tokenize(source).apply(::js::clean_tokens); - assert_eq!(&v.0, - &[Token::Keyword(Keyword::Var), - Token::Other("x"), - Token::Operation(Operation::Equal), - Token::FloatingNumber(".12"), - Token::Char(ReservedChar::SemiColon), - Token::Keyword(Keyword::Let), - Token::Other("y"), - Token::Operation(Operation::Equal), - Token::FloatingNumber("4."), - Token::Char(ReservedChar::SemiColon), - Token::Keyword(Keyword::Var), - Token::Other("z"), - Token::Operation(Operation::Equal), - Token::Number(12), - Token::Char(ReservedChar::SemiColon), - Token::FloatingNumber(".3"), - Token::FloatingNumber("4."), - Token::String("'a'"), - Token::Keyword(Keyword::Let), - Token::Other("u"), - Token::Operation(Operation::Equal), - Token::FloatingNumber("12.2")]); + assert_eq!( + &v.0, + &[ + Token::Keyword(Keyword::Var), + Token::Other("x"), + Token::Operation(Operation::Equal), + Token::FloatingNumber(".12"), + Token::Char(ReservedChar::SemiColon), + Token::Keyword(Keyword::Let), + Token::Other("y"), + Token::Operation(Operation::Equal), + Token::FloatingNumber("4."), + Token::Char(ReservedChar::SemiColon), + Token::Keyword(Keyword::Var), + Token::Other("z"), + Token::Operation(Operation::Equal), + Token::Number(12), + Token::Char(ReservedChar::SemiColon), + Token::FloatingNumber(".3"), + Token::FloatingNumber("4."), + Token::String("'a'"), + Token::Keyword(Keyword::Let), + Token::Other("u"), + Token::Operation(Operation::Equal), + Token::FloatingNumber("12.2") + ] + ); } #[test] @@ -1180,13 +1287,17 @@ fn test_number_parsing2() { let source = "var x = 12.a;"; let v = tokenize(source).apply(::js::clean_tokens); - assert_eq!(&v.0, - &[Token::Keyword(Keyword::Var), - Token::Other("x"), - Token::Operation(Operation::Equal), - Token::Number(12), - Token::Char(ReservedChar::Dot), - Token::Other("a")]); + assert_eq!( + &v.0, + &[ + Token::Keyword(Keyword::Var), + Token::Other("x"), + Token::Operation(Operation::Equal), + Token::Number(12), + Token::Char(ReservedChar::Dot), + Token::Other("a") + ] + ); } #[test] @@ -1194,8 +1305,27 @@ fn tokens_spaces() { let source = "t in e"; let v = tokenize(source).apply(::js::clean_tokens); - assert_eq!(&v.0, - &[Token::Other("t"), - Token::Keyword(Keyword::In), - Token::Other("e")]); + assert_eq!( + &v.0, + &[ + Token::Other("t"), + Token::Keyword(Keyword::In), + Token::Other("e") + ] + ); +} + +#[test] +fn division_by_id() { + let source = "100/abc"; + + let v = tokenize(source).apply(::js::clean_tokens); + assert_eq!( + &v.0, + &[ + Token::Number(100), + Token::Operation(Operation::Divide), + Token::Other("abc") + ] + ); } diff --git a/vendor/minifier/src/js/js.rs b/vendor/minifier/src/js/tools.rs similarity index 82% rename from vendor/minifier/src/js/js.rs rename to vendor/minifier/src/js/tools.rs index f8dd2a2c91..6cb43fb06f 100644 --- a/vendor/minifier/src/js/js.rs +++ b/vendor/minifier/src/js/tools.rs @@ -21,11 +21,7 @@ // SOFTWARE. use js::token::{self, Keyword, ReservedChar, Token, Tokens}; -use js::utils::{ - get_array, - get_variable_name_and_value_positions, - VariableNameGenerator, -}; +use js::utils::{get_array, get_variable_name_and_value_positions, VariableNameGenerator}; use std::collections::{HashMap, HashSet}; @@ -207,7 +203,9 @@ fn build_ast<'a>(v: &[token::Token<'a>]) -> Result, String> { /// ``` #[inline] pub fn minify(source: &str) -> String { - token::tokenize(source).apply(::js::clean_tokens).to_string() + token::tokenize(source) + .apply(::js::clean_tokens) + .to_string() } // TODO: No scope handling or anything. Might be nice as a second step to add it... @@ -220,7 +218,9 @@ fn get_variables_name<'a>( while pos < tokens.len() { if tokens[pos].is_keyword() || tokens[pos].is_other() { - if let Some((var_pos, Some(value_pos))) = get_variable_name_and_value_positions(tokens, pos) { + if let Some((var_pos, Some(value_pos))) = + get_variable_name_and_value_positions(tokens, pos) + { pos = value_pos; if let Some(var_name) = tokens[var_pos].get_other() { if !var_name.starts_with("r_") { @@ -276,7 +276,9 @@ fn aggregate_strings_inner<'a, 'b: 'a>( // Computation here is simple, we declare new variables when creating this so // the total of characters must be shorter than: // `var r_aa=...;` -> 10 + `r_aa` -> 14 - if (x.len() + 2 /* quotes */) * len > next_name.len() + str_token.len() + 6 /* var _=_;*/ + x.len() * next_name.len() { + if (x.len() + 2/* quotes */) * len + > next_name.len() + str_token.len() + 6 /* var _=_;*/ + x.len() * next_name.len() + { validated.insert(token, next_name.clone()); var_gen.next(); next_name = var_gen.to_string(); @@ -297,7 +299,7 @@ fn aggregate_strings_inner<'a, 'b: 'a>( let mut $x = $x.into_iter().collect::>(); $x.sort_unstable_by(|a, b| a.1.cmp(&b.1)); $x - }} + }}; } /*#[cfg(not(test))] macro_rules! inner_loop { @@ -317,7 +319,10 @@ fn aggregate_strings_inner<'a, 'b: 'a>( } else { new_vars.push(Token::Char(ReservedChar::Comma)); } - new_vars.push(Token::CreatedVarDecl(format!("{}={}", var_name, tokens[positions[0]]))); + new_vars.push(Token::CreatedVarDecl(format!( + "{}={}", + var_name, tokens[positions[0]] + ))); for pos in positions { tokens.0[pos] = Token::CreatedVar(var_name.clone()); } @@ -358,7 +363,7 @@ fn aggregate_strings_inner<'a, 'b: 'a>( /// } /// ``` #[inline] -pub fn aggregate_strings<'a>(tokens: Tokens<'a>) -> Tokens<'a> { +pub fn aggregate_strings(tokens: Tokens<'_>) -> Tokens<'_> { aggregate_strings_inner(tokens, None) } @@ -416,10 +421,11 @@ fn aggregate_strings_into_array_inner<'a, 'b: 'a, T: Fn(&Tokens<'a>, usize) -> b // key: the token string // value: (position in the array, positions in the tokens list, need creation) let mut strs: HashMap<&str, (usize, Vec, bool)> = HashMap::with_capacity(1000); - let (current_array_values, need_recreate, mut end_bracket) = match get_array(&tokens, array_name) { - Some((s, p)) => (s, false, p), - None => (Vec::new(), true, 0), - }; + let (current_array_values, need_recreate, mut end_bracket) = + match get_array(&tokens, array_name) { + Some((s, p)) => (s, false, p), + None => (Vec::new(), true, 0), + }; let mut validated: HashSet<&str> = HashSet::new(); let mut array_pos = 0; @@ -444,11 +450,17 @@ fn aggregate_strings_into_array_inner<'a, 'b: 'a, T: Fn(&Tokens<'a>, usize) -> b continue; } let s = &str_token[1..str_token.len() - 1]; - let x = strs.entry(s).or_insert_with(|| (0, Vec::with_capacity(1), true)); + let x = strs + .entry(s) + .or_insert_with(|| (0, Vec::with_capacity(1), true)); x.1.push(pos); if x.1.len() > 1 && !validated.contains(s) { let len = s.len(); - if len * x.1.len() > (array_name.len() + array_pos_str.len() + 2) * x.1.len() + array_pos_str.len() + 2 { + if len * x.1.len() + > (array_name.len() + array_pos_str.len() + 2) * x.1.len() + + array_pos_str.len() + + 2 + { validated.insert(&str_token[1..str_token.len() - 1]); x.0 = array_pos; array_pos += 1; @@ -498,13 +510,11 @@ fn aggregate_strings_into_array_inner<'a, 'b: 'a, T: Fn(&Tokens<'a>, usize) -> b to_replace.push((*token, array_index.clone())); } if !create_array_entry { - continue + continue; } to_insert.push((end_bracket, Token::CreatedVar(format!("\"{}\"", *s)))); - if !iter.peek().is_some() { - if current_array_values.is_empty() { - continue; - } + if iter.peek().is_none() && current_array_values.is_empty() { + continue; } to_insert.push((end_bracket, Token::Char(ReservedChar::Comma))); } @@ -568,7 +578,9 @@ pub fn aggregate_strings_into_array_with_separation_filter<'a, 'b: 'a, T>( separation_token: Token<'b>, filter: T, ) -> Tokens<'a> - where T: Fn(&Tokens<'a>, usize) -> bool { +where + T: Fn(&Tokens<'a>, usize) -> bool, +{ aggregate_strings_into_array_inner(tokens, array_name, Some(separation_token), filter) } @@ -595,10 +607,7 @@ pub fn aggregate_strings_into_array_with_separation_filter<'a, 'b: 'a, T>( /// } /// ``` #[inline] -pub fn aggregate_strings_into_array<'a>( - tokens: Tokens<'a>, - array_name: &str, -) -> Tokens<'a> { +pub fn aggregate_strings_into_array<'a>(tokens: Tokens<'a>, array_name: &str) -> Tokens<'a> { aggregate_strings_into_array_inner(tokens, array_name, None, |_, _| true) } @@ -609,8 +618,10 @@ pub fn aggregate_strings_into_array_filter<'a, T>( tokens: Tokens<'a>, array_name: &str, filter: T, -) -> Tokens<'a> - where T: Fn(&Tokens<'a>, usize) -> bool { +) -> Tokens<'a> +where + T: Fn(&Tokens<'a>, usize) -> bool, +{ aggregate_strings_into_array_inner(tokens, array_name, None, filter) } @@ -632,7 +643,7 @@ pub fn aggregate_strings_into_array_filter<'a, T>( /// } /// ``` #[inline] -pub fn simple_minify<'a>(source: &'a str) -> Tokens<'a> { +pub fn simple_minify(source: &str) -> Tokens<'_> { token::tokenize(source) } @@ -643,9 +654,10 @@ fn aggregate_strings_in_array() { let expected_result = "var R=[\"a nice string\",\"cake!\"];var x=[R[0],R[0],\ \"another nice string\",R[1],R[1],R[0],R[1],R[1],R[1]]"; - let result = simple_minify(source).apply(::js::clean_tokens) - .apply(|c| aggregate_strings_into_array(c, "R")) - .to_string(); + let result = simple_minify(source) + .apply(::js::clean_tokens) + .apply(|c| aggregate_strings_into_array(c, "R")) + .to_string(); assert_eq!(result, expected_result); let source = r#"var x = ["a nice string", "a nice string", "another nice string", "cake!", @@ -653,9 +665,16 @@ fn aggregate_strings_in_array() { let expected_result = "var R=[\"a nice string\",\"cake!\"];\nvar x=[R[0],R[0],\ \"another nice string\",R[1],R[1],R[0],R[1],R[1],R[1]]"; - let result = simple_minify(source).apply(::js::clean_tokens) - .apply(|c| aggregate_strings_into_array_with_separation(c, "R", Token::Char(ReservedChar::Backline))) - .to_string(); + let result = simple_minify(source) + .apply(::js::clean_tokens) + .apply(|c| { + aggregate_strings_into_array_with_separation( + c, + "R", + Token::Char(ReservedChar::Backline), + ) + }) + .to_string(); assert_eq!(result, expected_result); let source = r#"var x = ["a nice string", "a nice string", "another nice string", "another nice string", "another nice string", "another nice string","cake!","cake!", "a nice string", "cake!", "cake!", "cake!"];"#; @@ -663,9 +682,16 @@ fn aggregate_strings_in_array() { var x=[R[0],R[0],R[1],R[1],R[1],R[1],R[2],R[2],R[0],R[2],\ R[2],R[2]]"; - let result = simple_minify(source).apply(::js::clean_tokens) - .apply(|c| aggregate_strings_into_array_with_separation(c, "R", Token::Char(ReservedChar::Backline))) - .to_string(); + let result = simple_minify(source) + .apply(::js::clean_tokens) + .apply(|c| { + aggregate_strings_into_array_with_separation( + c, + "R", + Token::Char(ReservedChar::Backline), + ) + }) + .to_string(); assert_eq!(result, expected_result); } @@ -674,27 +700,41 @@ fn aggregate_strings_in_array_filter() { let source = r#"var searchIndex = {};searchIndex['duplicate_paths'] = {'aaaaaaaa': 'bbbbbbbb', 'bbbbbbbb': 'aaaaaaaa', 'duplicate_paths': 'aaaaaaaa'};"#; let expected_result = "var R=[\"bbbbbbbb\",\"aaaaaaaa\"];\nvar searchIndex={};searchIndex['duplicate_paths']={R[1]:R[0],R[0]:R[1],'duplicate_paths':R[1]}"; - let result = simple_minify(source).apply(::js::clean_tokens) - .apply(|c| aggregate_strings_into_array_with_separation_filter(c, "R", Token::Char(ReservedChar::Backline), |tokens, pos| { - pos < 2 || - !tokens[pos - 1].eq_char(ReservedChar::OpenBracket) || - tokens[pos - 2].get_other() != Some("searchIndex") - } - )) - .to_string(); + let result = simple_minify(source) + .apply(::js::clean_tokens) + .apply(|c| { + aggregate_strings_into_array_with_separation_filter( + c, + "R", + Token::Char(ReservedChar::Backline), + |tokens, pos| { + pos < 2 + || !tokens[pos - 1].eq_char(ReservedChar::OpenBracket) + || tokens[pos - 2].get_other() != Some("searchIndex") + }, + ) + }) + .to_string(); assert_eq!(result, expected_result); let source = r#"var searchIndex = {};searchIndex['duplicate_paths'] = {'aaaaaaaa': 'bbbbbbbb', 'bbbbbbbb': 'aaaaaaaa', 'duplicate_paths': 'aaaaaaaa', 'x': 'duplicate_paths'};"#; let expected_result = "var R=[\"bbbbbbbb\",\"aaaaaaaa\",\"duplicate_paths\"];\nvar searchIndex={};searchIndex['duplicate_paths']={R[1]:R[0],R[0]:R[1],R[2]:R[1],'x':R[2]}"; - let result = simple_minify(source).apply(::js::clean_tokens) - .apply(|c| aggregate_strings_into_array_with_separation_filter(c, "R", Token::Char(ReservedChar::Backline), |tokens, pos| { - pos < 2 || - !tokens[pos - 1].eq_char(ReservedChar::OpenBracket) || - tokens[pos - 2].get_other() != Some("searchIndex") - } - )) - .to_string(); + let result = simple_minify(source) + .apply(::js::clean_tokens) + .apply(|c| { + aggregate_strings_into_array_with_separation_filter( + c, + "R", + Token::Char(ReservedChar::Backline), + |tokens, pos| { + pos < 2 + || !tokens[pos - 1].eq_char(ReservedChar::OpenBracket) + || tokens[pos - 2].get_other() != Some("searchIndex") + }, + ) + }) + .to_string(); assert_eq!(result, expected_result); } @@ -705,9 +745,10 @@ fn aggregate_strings_in_array_existing() { let expected_result = "var R=[\"a nice string\",\"cake!\"];var x=[R[0],R[0],\ \"another nice string\",R[1],R[1],R[0],R[1],R[1],R[1]]"; - let result = simple_minify(source).apply(::js::clean_tokens) - .apply(|c| aggregate_strings_into_array(c, "R")) - .to_string(); + let result = simple_minify(source) + .apply(::js::clean_tokens) + .apply(|c| aggregate_strings_into_array(c, "R")) + .to_string(); assert_eq!(result, expected_result); let source = r#"var R=["a nice string"];var x = ["a nice string", "a nice string", "another nice string", "cake!", @@ -715,9 +756,10 @@ fn aggregate_strings_in_array_existing() { let expected_result = "var R=[\"a nice string\",\"cake!\"];var x=[R[0],R[0],\ \"another nice string\",R[1],R[1],R[0],R[1],R[1],R[1]]"; - let result = simple_minify(source).apply(::js::clean_tokens) - .apply(|c| aggregate_strings_into_array(c, "R")) - .to_string(); + let result = simple_minify(source) + .apply(::js::clean_tokens) + .apply(|c| aggregate_strings_into_array(c, "R")) + .to_string(); assert_eq!(result, expected_result); let source = r#"var y = 12;var R=["a nice string"];var x = ["a nice string", "a nice string", "another nice string", "cake!", @@ -725,9 +767,10 @@ fn aggregate_strings_in_array_existing() { let expected_result = "var y=12;var R=[\"a nice string\",\"cake!\"];var x=[R[0],R[0],\ \"another nice string\",R[1],R[1],R[0],R[1],R[1],R[1]]"; - let result = simple_minify(source).apply(::js::clean_tokens) - .apply(|c| aggregate_strings_into_array(c, "R")) - .to_string(); + let result = simple_minify(source) + .apply(::js::clean_tokens) + .apply(|c| aggregate_strings_into_array(c, "R")) + .to_string(); assert_eq!(result, expected_result); let source = r#"var R=["osef1", "o2", "damn"]; @@ -736,9 +779,10 @@ fn aggregate_strings_in_array_existing() { let expected_result = "var R=[\"osef1\",\"o2\",\"damn\",\"a nice string\",\"cake!\"];\ var x=[R[3],R[3],\"another nice string\",R[4],R[4],R[3],R[4],R[4],R[4]]"; - let result = simple_minify(source).apply(::js::clean_tokens) - .apply(|c| aggregate_strings_into_array(c, "R")) - .to_string(); + let result = simple_minify(source) + .apply(::js::clean_tokens) + .apply(|c| aggregate_strings_into_array(c, "R")) + .to_string(); assert_eq!(result, expected_result); } @@ -749,9 +793,10 @@ fn string_duplicates() { let expected_result = "var r_aa=\"a nice string\",r_ba=\"cake!\";var x=[r_aa,r_aa,\ \"another nice string\",r_ba,r_ba,r_aa,r_ba,r_ba,r_ba]"; - let result = simple_minify(source).apply(aggregate_strings) - .apply(::js::clean_tokens) - .to_string(); + let result = simple_minify(source) + .apply(aggregate_strings) + .apply(::js::clean_tokens) + .to_string(); assert_eq!(result, expected_result); } @@ -763,9 +808,10 @@ fn already_existing_var() { let expected_result = "var r_ba=\"cake!\";var r_aa=\"a nice string\";var x=[r_aa,r_aa,\ \"another nice string\",r_ba,r_ba,r_aa,r_ba,r_ba,r_ba]"; - let result = simple_minify(source).apply(aggregate_strings) - .apply(::js::clean_tokens) - .to_string(); + let result = simple_minify(source) + .apply(aggregate_strings) + .apply(::js::clean_tokens) + .to_string(); assert_eq!(result, expected_result); } @@ -777,9 +823,10 @@ fn string_duplicates_variables_already_exist() { var r_aa=1;var x=[r_ba,r_ba,\ \"another nice string\",r_ca,r_ca,r_ba,r_ca,r_ca,r_ca]"; - let result = simple_minify(source).apply(aggregate_strings) - .apply(::js::clean_tokens) - .to_string(); + let result = simple_minify(source) + .apply(aggregate_strings) + .apply(::js::clean_tokens) + .to_string(); assert_eq!(result, expected_result); } @@ -791,10 +838,10 @@ fn string_duplicates_with_separator() { "cake!", "a nice string", "cake!", "cake!", "cake!"];"#; let expected_result = "var r_aa=\"a nice string\",r_ba=\"cake!\";\nvar x=[r_aa,r_aa,\ \"another nice string\",r_ba,r_ba,r_aa,r_ba,r_ba,r_ba]"; - let result = simple_minify(source).apply(::js::clean_tokens) - .apply(|f| { - aggregate_strings_with_separation(f, Token::Char(ReservedChar::Backline)) - }).to_string(); + let result = simple_minify(source) + .apply(::js::clean_tokens) + .apply(|f| aggregate_strings_with_separation(f, Token::Char(ReservedChar::Backline))) + .to_string(); assert_eq!(result, expected_result); } @@ -809,11 +856,9 @@ var z = "ok!";"#; var y="salut"; var z="ok!""#; - let result = simple_minify(source).apply(|f| { - ::js::clean_tokens_except(f, |c| { - c.get_char() != Some(ReservedChar::Backline) - }) - }).to_string(); + let result = simple_minify(source) + .apply(|f| ::js::clean_tokens_except(f, |c| c.get_char() != Some(ReservedChar::Backline))) + .to_string(); assert_eq!(result, expected); } @@ -824,12 +869,14 @@ fn clean_except2() { let source = "let x = [ 1, 2, \t3];"; let expected = "let x = [ 1, 2, 3];"; - let result = simple_minify(source).apply(|f| { - ::js::clean_tokens_except(f, |c| { - c.get_char() != Some(ReservedChar::Space) && - c.get_char() != Some(ReservedChar::SemiColon) - }) - }).to_string(); + let result = simple_minify(source) + .apply(|f| { + ::js::clean_tokens_except(f, |c| { + c.get_char() != Some(ReservedChar::Space) + && c.get_char() != Some(ReservedChar::SemiColon) + }) + }) + .to_string(); assert_eq!(result, expected); } @@ -840,12 +887,14 @@ fn clean_except3() { let source = "let x = [ 1, 2, \t3];"; let expected = "let x=[1,2,\t3];"; - let result = simple_minify(source).apply(|f| { - ::js::clean_tokens_except(f, |c| { - c.get_char() != Some(ReservedChar::Tab) && - c.get_char() != Some(ReservedChar::SemiColon) - }) - }).to_string(); + let result = simple_minify(source) + .apply(|f| { + ::js::clean_tokens_except(f, |c| { + c.get_char() != Some(ReservedChar::Tab) + && c.get_char() != Some(ReservedChar::SemiColon) + }) + }) + .to_string(); assert_eq!(result, expected); } @@ -854,18 +903,22 @@ fn name_generator() { let s = ::std::iter::repeat('a').take(36).collect::(); // We need to generate enough long strings to reach the point that the name generator // generates names with 3 characters. - let s = ::std::iter::repeat(s).take(20000) - .enumerate() - .map(|(pos, s)| format!("{}{}", s, pos)) - .collect::>(); - let source = format!("var x = [{}];", - s.iter() - .map(|s| format!("\"{0}\",\"{0}\"", s)) - .collect::>() - .join(",")); - let result = simple_minify(&source).apply(::js::clean_tokens) - .apply(aggregate_strings) - .to_string(); + let s = ::std::iter::repeat(s) + .take(20000) + .enumerate() + .map(|(pos, s)| format!("{}{}", s, pos)) + .collect::>(); + let source = format!( + "var x = [{}];", + s.iter() + .map(|s| format!("\"{0}\",\"{0}\"", s)) + .collect::>() + .join(",") + ); + let result = simple_minify(&source) + .apply(::js::clean_tokens) + .apply(aggregate_strings) + .to_string(); assert!(result.find(",r_aaa=").is_some()); assert!(result.find(",r_ab=").unwrap() < result.find(",r_ba=").unwrap()); } @@ -1034,6 +1087,33 @@ fn test_remove_extra_whitespace_before_operator() { assert_eq!(minify(source), expected_result); } +#[test] +fn check_regex_syntax() { + let source = "console.log(/MSIE|Trident|Edge/.test(window.navigator.userAgent));"; + let expected = "console.log(/MSIE|Trident|Edge/.test(window.navigator.userAgent))"; + assert_eq!(minify(source), expected); +} + +#[test] +fn minify_minified() { + let source = "function (i, n, a) { i[n].type.replace(/ *;(.|\\s)*/,\"\")===t&&a.push(i[n].MathJax.elementJax);return a}"; + let expected = "function(i,n,a){i[n].type.replace(/ *;(.|\\s)*/,\"\")===t&&a.push(i[n].MathJax.elementJax);return a}"; + assert_eq!(minify(source), expected); +} + +#[test] +fn check_string() { + let source = r###" + const a = 123; + const b = "123"; + const c = `the number is ${a} <-- note the spaces here`; + const d = ` ${a} ${b} `; + "###; + let expected = "const a=123;const b=\"123\";const c=`the number is ${a} <-- note the spaces \ + here`;const d=` ${a} ${b} `"; + assert_eq!(minify(source), expected); +} + // TODO: requires AST to fix this issue! /*#[test] fn no_semi_colon() { diff --git a/vendor/minifier/src/js/utils.rs b/vendor/minifier/src/js/utils.rs index 4f36626d0e..25f6ea6ac2 100644 --- a/vendor/minifier/src/js/utils.rs +++ b/vendor/minifier/src/js/utils.rs @@ -50,22 +50,17 @@ impl<'a> VariableNameGenerator<'a> { self.incr_letters(); } + #[allow(clippy::inherent_to_string)] pub(crate) fn to_string(&self) -> String { if let Some(ref lower) = self.lower { - format!("{}{}{}", - match self.prepend { - Some(ref p) => p, - None => "", - }, - self.letter, - lower.to_string()) + format!( + "{}{}{}", + self.prepend.unwrap_or(""), + self.letter, + lower.to_string() + ) } else { - format!("{}{}", - match self.prepend { - Some(ref p) => p, - None => "", - }, - self.letter) + format!("{}{}", self.prepend.unwrap_or(""), self.letter) } } @@ -75,10 +70,11 @@ impl<'a> VariableNameGenerator<'a> { Some(ref s) => s.len(), None => 0, } + 1; - first + match self.lower { - Some(ref s) => s.len(), - None => 0, - } + first + + match self.lower { + Some(ref s) => s.len(), + None => 0, + } } pub(crate) fn incr_letters(&mut self) { @@ -208,8 +204,7 @@ pub fn get_variable_name_and_value_positions<'a>( } let mut tmp = pos; match tokens[pos] { - Token::Keyword(Keyword::Let) | - Token::Keyword(Keyword::Var) => { + Token::Keyword(Keyword::Let) | Token::Keyword(Keyword::Var) => { tmp += 1; } Token::Other(_) if pos > 0 => { @@ -217,9 +212,10 @@ pub fn get_variable_name_and_value_positions<'a>( while pos > 0 { if tokens[pos].is_comment() || tokens[pos].is_white_character() { pos -= 1; - } else if tokens[pos] == Token::Char(ReservedChar::Comma) || - tokens[pos] == Token::Keyword(Keyword::Let) || - tokens[pos] == Token::Keyword(Keyword::Var) { + } else if tokens[pos] == Token::Char(ReservedChar::Comma) + || tokens[pos] == Token::Keyword(Keyword::Let) + || tokens[pos] == Token::Keyword(Keyword::Var) + { break; } else { return None; @@ -231,29 +227,33 @@ pub fn get_variable_name_and_value_positions<'a>( while tmp < tokens.len() { if tokens[tmp].is_other() { let mut tmp2 = tmp + 1; - 'big: while tmp2 < tokens.len() { + while tmp2 < tokens.len() { if tokens[tmp2] == Token::Operation(Operation::Equal) { tmp2 += 1; while tmp2 < tokens.len() { let token = &tokens[tmp2]; - if token.is_string() || token.is_other() || token.is_regex() || - token.is_number() || token.is_floating_number() { + if token.is_string() + || token.is_other() + || token.is_regex() + || token.is_number() + || token.is_floating_number() + { return Some((tmp, Some(tmp2))); - } else if !tokens[tmp2].is_comment() && - !tokens[tmp2].is_white_character() { + } else if !tokens[tmp2].is_comment() && !tokens[tmp2].is_white_character() { break; } tmp2 += 1; } break; - } else if match tokens[tmp2].get_char() { - Some(ReservedChar::Comma) | Some(ReservedChar::SemiColon) => true, - _ => false, - } { + } else if matches!( + tokens[tmp2].get_char(), + Some(ReservedChar::Comma) | Some(ReservedChar::SemiColon) + ) { return Some((tmp, None)); - } else if !tokens[tmp2].is_comment() && - !(tokens[tmp2].is_white_character() && - tokens[tmp2].get_char() != Some(ReservedChar::Backline)) { + } else if !(tokens[tmp2].is_comment() + || tokens[tmp2].is_white_character() + && tokens[tmp2].get_char() != Some(ReservedChar::Backline)) + { break; } tmp2 += 1; @@ -268,9 +268,9 @@ pub fn get_variable_name_and_value_positions<'a>( #[inline] fn get_next<'a>(it: &mut IntoIter>) -> Option> { - while let Some(t) = it.next() { + for t in it { if t.is_comment() || t.is_white_character() { - continue + continue; } return Some(t); } @@ -296,7 +296,7 @@ fn get_next<'a>(it: &mut IntoIter>) -> Option> { /// } /// ``` #[inline] -pub fn clean_tokens<'a>(tokens: Tokens<'a>) -> Tokens<'a> { +pub fn clean_tokens(tokens: Tokens<'_>) -> Tokens<'_> { let mut v = Vec::with_capacity(tokens.len() / 3 * 2); let mut it = tokens.0.into_iter(); @@ -307,10 +307,10 @@ pub fn clean_tokens<'a>(tokens: Tokens<'a>) -> Tokens<'a> { } let token = token.unwrap(); if token.is_white_character() { - continue + continue; } else if token.get_char() == Some(ReservedChar::SemiColon) { if v.is_empty() { - continue + continue; } if let Some(next) = get_next(&mut it) { if next != Token::Char(ReservedChar::CloseCurlyBrace) { @@ -318,7 +318,7 @@ pub fn clean_tokens<'a>(tokens: Tokens<'a>) -> Tokens<'a> { } v.push(next); } - continue + continue; } v.push(token); } @@ -331,9 +331,9 @@ pub fn clean_tokens<'a>(tokens: Tokens<'a>) -> Tokens<'a> { pub fn clean_token(token: &Token<'_>, next_token: &Option<&Token<'_>>) -> bool { !token.is_comment() && { if let Some(x) = token.get_char() { - !x.is_white_character() && - (x != ReservedChar::SemiColon || - *next_token != Some(&Token::Char(ReservedChar::CloseCurlyBrace))) + !x.is_white_character() + && (x != ReservedChar::SemiColon + || *next_token != Some(&Token::Char(ReservedChar::CloseCurlyBrace))) } else { true } @@ -345,9 +345,9 @@ fn get_next_except<'a, F: Fn(&Token<'a>) -> bool>( it: &mut IntoIter>, f: &F, ) -> Option> { - while let Some(t) = it.next() { + for t in it { if (t.is_comment() || t.is_white_character()) && f(&t) { - continue + continue; } return Some(t); } @@ -379,10 +379,7 @@ fn get_next_except<'a, F: Fn(&Token<'a>) -> bool>( /// } /// ``` #[inline] -pub fn clean_tokens_except<'a, F: Fn(&Token<'a>) -> bool>( - tokens: Tokens<'a>, - f: F, -) -> Tokens<'a> { +pub fn clean_tokens_except<'a, F: Fn(&Token<'a>) -> bool>(tokens: Tokens<'a>, f: F) -> Tokens<'a> { let mut v = Vec::with_capacity(tokens.len() / 3 * 2); let mut it = tokens.0.into_iter(); @@ -394,14 +391,14 @@ pub fn clean_tokens_except<'a, F: Fn(&Token<'a>) -> bool>( let token = token.unwrap(); if token.is_white_character() { if f(&token) { - continue + continue; } } else if token.get_char() == Some(ReservedChar::SemiColon) { if v.is_empty() { if !f(&token) { v.push(token); } - continue + continue; } if let Some(next) = get_next_except(&mut it, &f) { if next != Token::Char(ReservedChar::CloseCurlyBrace) || !f(&token) { @@ -411,7 +408,7 @@ pub fn clean_tokens_except<'a, F: Fn(&Token<'a>) -> bool>( } else if !f(&token) { v.push(token); } - continue + continue; } v.push(token); } @@ -490,8 +487,7 @@ pub(crate) fn get_array<'a>( } } else { match tokens[pos] { - Token::Keyword(Keyword::Let) | - Token::Keyword(Keyword::Var) => { + Token::Keyword(Keyword::Let) | Token::Keyword(Keyword::Var) => { looking_for_var = true; } _ => {} @@ -589,16 +585,16 @@ var n = null; let expected_result = "var x=['a','b',N,'d',{'x':N,'e':N,'z':'w'}];var n=N;"; let res: Tokens = ::js::simple_minify(source) - .into_iter() - .filter(|(x, next)| ::js::clean_token(x, next)) - .map(|(t, _)| { - if t == Token::Keyword(Keyword::Null) { - Token::Other("N") - } else { - t - } - }) - .collect::>() - .into(); + .into_iter() + .filter(|(x, next)| ::js::clean_token(x, next)) + .map(|(t, _)| { + if t == Token::Keyword(Keyword::Null) { + Token::Other("N") + } else { + t + } + }) + .collect::>() + .into(); assert_eq!(res.to_string(), expected_result); } diff --git a/vendor/minifier/src/json/json_minifier.rs b/vendor/minifier/src/json/json_minifier.rs index 796f2a2082..351ba55cca 100644 --- a/vendor/minifier/src/json/json_minifier.rs +++ b/vendor/minifier/src/json/json_minifier.rs @@ -20,11 +20,7 @@ impl JsonMinifier { } #[inline] -pub fn keep_element( - minifier: &mut JsonMinifier, - item1: &char, - item2: Option<&char>, -) -> bool { +pub fn keep_element(minifier: &mut JsonMinifier, item1: &char, item2: Option<&char>) -> bool { let remove_element = item1.is_ascii_control() || is_whitespace_outside_string(minifier, item1, item2); !remove_element diff --git a/vendor/minifier/src/json/mod.rs b/vendor/minifier/src/json/mod.rs index 5747e62ec2..64b1dee88c 100644 --- a/vendor/minifier/src/json/mod.rs +++ b/vendor/minifier/src/json/mod.rs @@ -1,4 +1,8 @@ -use json::{json_minifier::{JsonMinifier, keep_element}, read::json_read::JsonRead, string::JsonMultiFilter}; +use json::{ + json_minifier::{keep_element, JsonMinifier}, + read::json_read::JsonRead, + string::JsonMultiFilter, +}; use std::io::Read; mod read { @@ -11,11 +15,7 @@ mod read { mod json_minifier; mod string; -type JsonMethod = fn( - &mut JsonMinifier, - &char, - Option<&char>, -) -> bool; +type JsonMethod = fn(&mut JsonMinifier, &char, Option<&char>) -> bool; /// Minifies a given String by JSON minification rules /// @@ -40,7 +40,6 @@ pub fn minify(json: &str) -> String { JsonMultiFilter::new(json.chars(), keep_element).collect() } - /// Minifies a given Read by JSON minification rules /// /// # Example @@ -91,7 +90,8 @@ fn removal_of_whitespace_outside_of_tags() { "test2": "", "test3": " " } - "#.into(); + "# + .into(); let expected: String = "{\"test\":\"\\\" test2\",\"test2\":\"\",\"test3\":\" \"}".into(); let actual = minify(input); assert_eq!(actual, expected); diff --git a/vendor/minifier/src/json/read/byte_to_char.rs b/vendor/minifier/src/json/read/byte_to_char.rs index 180b7fd0f6..88c3a73b8e 100644 --- a/vendor/minifier/src/json/read/byte_to_char.rs +++ b/vendor/minifier/src/json/read/byte_to_char.rs @@ -1,5 +1,9 @@ use json::read::internal_reader::InternalReader; -use std::{error, fmt, io::{Error, Read}, str::from_utf8}; +use std::{ + error, fmt, + io::{Error, Read}, + str::from_utf8, +}; pub struct ByteToChar { iter: InternalReader, @@ -18,17 +22,15 @@ impl ByteToChar { None => Ok(None), Some(item) => match item { Ok(item) => Ok(Some(item)), - Err(err) => Err(CharsError::Other(err)) - } + Err(err) => Err(CharsError::Other(err)), + }, } } } impl fmt::Debug for ByteToChar { 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() } } @@ -42,7 +44,7 @@ impl Iterator for ByteToChar { Ok(item) => match item { Some(item) => item, None => return None, - } + }, }; let width = utf8_char_width(first_byte); @@ -61,7 +63,7 @@ impl Iterator for ByteToChar { Ok(item) => match item { Some(item) => item, None => return Some(Err(CharsError::NotUtf8)), - } + }, }; buf[start] = byte; start += 1; @@ -111,12 +113,6 @@ pub enum CharsError { } impl error::Error for CharsError { - fn description(&self) -> &str { - match *self { - CharsError::NotUtf8 => "invalid utf8 encoding", - CharsError::Other(ref e) => Error::description(e), - } - } fn cause(&self) -> Option<&dyn error::Error> { match *self { CharsError::NotUtf8 => None, diff --git a/vendor/minifier/src/json/read/internal_buffer.rs b/vendor/minifier/src/json/read/internal_buffer.rs index 40d02aa6ec..23dd51f14b 100644 --- a/vendor/minifier/src/json/read/internal_buffer.rs +++ b/vendor/minifier/src/json/read/internal_buffer.rs @@ -33,7 +33,7 @@ impl Buffer { } let item = self.buffer.get(self.read_pos); self.read_pos += 1; - item.and_then(|test|Some(*test)) + item.copied() } pub fn cont(&self) -> bool { diff --git a/vendor/minifier/src/json/read/internal_reader.rs b/vendor/minifier/src/json/read/internal_reader.rs index 5841e955cb..658b134395 100644 --- a/vendor/minifier/src/json/read/internal_reader.rs +++ b/vendor/minifier/src/json/read/internal_reader.rs @@ -1,5 +1,8 @@ -use std::{fmt, io::{Error, Read}}; use super::internal_buffer::Buffer; +use std::{ + fmt, + io::{Error, Read}, +}; pub struct InternalReader { read: R, diff --git a/vendor/minifier/src/json/read/json_read.rs b/vendor/minifier/src/json/read/json_read.rs index 55abc2bdca..7e41a1e448 100644 --- a/vendor/minifier/src/json/read/json_read.rs +++ b/vendor/minifier/src/json/read/json_read.rs @@ -1,5 +1,12 @@ -use json::{json_minifier::JsonMinifier, read::byte_to_char::{ByteToChar, CharsError}}; -use std::{fmt, io::{Error, ErrorKind, Read}, vec::IntoIter}; +use json::{ + json_minifier::JsonMinifier, + read::byte_to_char::{ByteToChar, CharsError}, +}; +use std::{ + fmt, + io::{Error, ErrorKind, Read}, + vec::IntoIter, +}; pub struct JsonRead { minifier: JsonMinifier, @@ -30,8 +37,8 @@ impl JsonRead { None => Ok(None), Some(item) => match item { Ok(item) => Ok(Some(item)), - Err(err) => Err(err) - } + Err(err) => Err(err), + }, } } @@ -52,20 +59,16 @@ impl JsonRead { impl fmt::Debug for JsonRead { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_struct("Filter") - .field("iter", &self.iter) - .field("initialized", &self.initialized) - .finish() + .field("iter", &self.iter) + .field("initialized", &self.initialized) + .finish() } } impl Read for JsonRead - where - R: Read, - P: FnMut( - &mut JsonMinifier, - &char, - Option<&char>, - ) -> bool, +where + R: Read, + P: FnMut(&mut JsonMinifier, &char, Option<&char>) -> bool, { fn read(&mut self, buf: &mut [u8]) -> Result { let mut buf_pos: usize = 0; @@ -82,11 +85,7 @@ impl Read for JsonRead while let Some(item) = self.item1.take() { self.item1 = self.get_next()?; - if (self.predicate)( - &mut self.minifier, - &item, - self.item1.as_ref(), - ) { + if (self.predicate)(&mut self.minifier, &item, self.item1.as_ref()) { self.item_iter = Some(item.to_string().into_bytes().into_iter()); self.add_char_to_buffer(buf, &mut buf_pos); } diff --git a/vendor/minifier/src/json/string.rs b/vendor/minifier/src/json/string.rs index ff1463e717..eed3a098a6 100644 --- a/vendor/minifier/src/json/string.rs +++ b/vendor/minifier/src/json/string.rs @@ -25,21 +25,17 @@ impl JsonMultiFilter { impl fmt::Debug for JsonMultiFilter { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { f.debug_struct("Filter") - .field("minifier", &self.minifier) - .field("iter", &self.iter) - .field("initialized", &self.initialized) - .finish() + .field("minifier", &self.minifier) + .field("iter", &self.iter) + .field("initialized", &self.initialized) + .finish() } } impl Iterator for JsonMultiFilter - where - I: Iterator, - P: FnMut( - &mut JsonMinifier, - &I::Item, - Option<&I::Item>, - ) -> bool, +where + I: Iterator, + P: FnMut(&mut JsonMinifier, &I::Item, Option<&I::Item>) -> bool, { type Item = I::Item; @@ -52,11 +48,7 @@ impl Iterator for JsonMultiFilter while let Some(item) = self.item1.take() { self.item1 = self.iter.next(); - if (self.predicate)( - &mut self.minifier, - &item, - self.item1.as_ref(), - ) { + if (self.predicate)(&mut self.minifier, &item, self.item1.as_ref()) { return Some(item); } } diff --git a/vendor/minifier/src/main.rs b/vendor/minifier/src/main.rs index 6be83b6e8e..a46ca1c71a 100644 --- a/vendor/minifier/src/main.rs +++ b/vendor/minifier/src/main.rs @@ -31,11 +31,13 @@ use std::path::{Path, PathBuf}; use minifier::{css, js, json}; fn print_help() { - println!(r##"For now, this minifier supports the following type of files: + println!( + r##"For now, this minifier supports the following type of files: * .css * .js - * .json"##); + * .json"## + ); } pub fn get_all_data(file_path: &str) -> io::Result { @@ -47,29 +49,43 @@ pub fn get_all_data(file_path: &str) -> io::Result { } fn call_minifier(file_path: &str, func: F) - where F: Fn(&str) -> String { +where + F: Fn(&str) -> String, +{ match get_all_data(file_path) { Ok(content) => { let mut out = PathBuf::from(file_path); - let original_extension = out.extension() - .unwrap_or(OsStr::new("")) - .to_str() - .unwrap_or("") - .to_owned(); + let original_extension = out + .extension() + .unwrap_or_else(|| OsStr::new("")) + .to_str() + .unwrap_or("") + .to_owned(); out.set_extension(format!("min.{}", original_extension)); - if let Ok(mut file) = OpenOptions::new().truncate(true) - .write(true) - .create(true) - .open(out.clone()) { + if let Ok(mut file) = OpenOptions::new() + .truncate(true) + .write(true) + .create(true) + .open(out.clone()) + { if let Err(e) = write!(file, "{}", func(&content)) { - writeln!(&mut io::stderr(), - "Impossible to write into {:?}: {}", out, e).unwrap(); + writeln!( + &mut io::stderr(), + "Impossible to write into {:?}: {}", + out, + e + ) + .unwrap(); } else { println!("{:?}: done -> generated into {:?}", file_path, out); } } else { - writeln!(&mut io::stderr(), - "Impossible to create new file: {:?}", out).unwrap(); + writeln!( + &mut io::stderr(), + "Impossible to create new file: {:?}", + out + ) + .unwrap(); } } Err(e) => writeln!(&mut io::stderr(), "\"{}\": {}", file_path, e).unwrap(), @@ -82,20 +98,25 @@ fn main() { if args.is_empty() { println!("Missing files to work on...\nExample: ./minifier file.js\n"); print_help(); - return + return; } for arg in &args { let p = Path::new(arg); if !p.is_file() { writeln!(&mut io::stderr(), "\"{}\" isn't a file", arg).unwrap(); - continue + continue; } - match p.extension().unwrap_or(OsStr::new("")).to_str().unwrap_or("") { - "css" => call_minifier(arg, |s| css::minify(s).expect("css minification failed")), + match p + .extension() + .unwrap_or_else(|| OsStr::new("")) + .to_str() + .unwrap_or("") + { + "css" => call_minifier(arg, |s| css::minify(s).expect("css minification failed")), "js" => call_minifier(arg, js::minify), - "json" => call_minifier(arg, json::minify), - // "html" | "htm" => call_minifier(arg, html::minify), + "json" => call_minifier(arg, json::minify), + // "html" | "htm" => call_minifier(arg, html::minify), x => println!("\"{}\": this format isn't supported", x), } } diff --git a/vendor/minifier/tests/js_minify.rs b/vendor/minifier/tests/js_minify.rs index 82ad0dab42..1ba727a10a 100644 --- a/vendor/minifier/tests/js_minify.rs +++ b/vendor/minifier/tests/js_minify.rs @@ -26,9 +26,11 @@ fn compare_strs(minified: &str, str2: &str) { match (it1.next(), it2.next()) { (Some((pos, c1)), Some((_, c2))) => { if c1 != c2 { - println!("{}\n==== differs from: ====\n{}", - &minified[get_ranges(pos, minified)], - &str2[get_ranges(pos, str2)]); + println!( + "{}\n==== differs from: ====\n{}", + &minified[get_ranges(pos, minified)], + &str2[get_ranges(pos, str2)] + ); panic!("Chars differ"); } } diff --git a/vendor/miniz_oxide/.cargo-checksum.json b/vendor/miniz_oxide/.cargo-checksum.json index 99e4036d69..be3f4437e6 100644 --- a/vendor/miniz_oxide/.cargo-checksum.json +++ b/vendor/miniz_oxide/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"3f120d38e87608d6cefbe0ba08225f8205a1419d512afb840233d56c86725ced","LICENSE":"e190940e8ad3cdd4fca962a6508ed6865d589d314b1cb055f86000e124b88d8d","LICENSE-APACHE.md":"0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594","LICENSE-MIT.md":"e190940e8ad3cdd4fca962a6508ed6865d589d314b1cb055f86000e124b88d8d","LICENSE-ZLIB.md":"c89bcc058da12a0fb24402b8ea4542a21515dd1da2e8c67bba4ed9bd269f1c96","Readme.md":"fca5f9500a8caf5a334dc53925fa3dda063a8a4de88fe107251998300b432c0d","build.rs":"028882f1da195677e4729e5a07d3593a333297bb8c0f92789fadb3669cb3ed62","src/deflate/buffer.rs":"2953214307677f33f901f8e52256b6e7a296f4234238179613168ddad106645c","src/deflate/core.rs":"db40c9a95f5a9ad72c17eef934e163d90768b2a0f8fa53cf37d71e550cdf84f9","src/deflate/mod.rs":"d17cd7a576be570cf948d2fbf0ce535be35cc4ef94cbfbfaefc17c6641bd412a","src/deflate/stream.rs":"49120444fb12b58191c2bb0dda598cd3614cbc329eb3720a50ce8f5017c04838","src/inflate/core.rs":"a4d8c3cf20ec3b89b12f7ac1df37b521d29e910f854cb1ccb2b8c7bb23244b25","src/inflate/mod.rs":"9252ddf7edf6b8205ff5820dcc22eaeb244130e135f5bbb416c9701ca6118e23","src/inflate/output_buffer.rs":"3948c26897a8d30a356fc8e9ce1df7513c21d186838220ad63a69b6b1d985eab","src/inflate/stream.rs":"c77a867022f9d79749d610e64762aa9203accb975d498ece0f34974cd07cd5e2","src/lib.rs":"08b54d4c675f3c2901d493ce85895952b639781faa40bf0b620da6dff0a1fb91","src/shared.rs":"889b9d9d3b4bc0693f94c850806e9cf68ed9079e0ada2b2f51bfffe388e02c6a"},"package":"0f2d26ec3309788e423cfbf68ad1800f061638098d76a83681af979dc4eda19d"} \ No newline at end of file +{"files":{"Cargo.toml":"ce39c1ad4f1b3dfca82915366f8095fbe5f6025867c7829df16758bbb826a9cd","LICENSE":"e190940e8ad3cdd4fca962a6508ed6865d589d314b1cb055f86000e124b88d8d","LICENSE-APACHE.md":"0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594","LICENSE-MIT.md":"e190940e8ad3cdd4fca962a6508ed6865d589d314b1cb055f86000e124b88d8d","LICENSE-ZLIB.md":"c89bcc058da12a0fb24402b8ea4542a21515dd1da2e8c67bba4ed9bd269f1c96","Readme.md":"fca5f9500a8caf5a334dc53925fa3dda063a8a4de88fe107251998300b432c0d","build.rs":"028882f1da195677e4729e5a07d3593a333297bb8c0f92789fadb3669cb3ed62","src/deflate/buffer.rs":"2953214307677f33f901f8e52256b6e7a296f4234238179613168ddad106645c","src/deflate/core.rs":"68139f9839717877fee1f17bb5a6bef2c3e79e19268c7369bbbbb0c15647cd79","src/deflate/mod.rs":"d17cd7a576be570cf948d2fbf0ce535be35cc4ef94cbfbfaefc17c6641bd412a","src/deflate/stream.rs":"49120444fb12b58191c2bb0dda598cd3614cbc329eb3720a50ce8f5017c04838","src/inflate/core.rs":"2dce0b86e821a0587fab466220815bb90b3d5336a97580a7b890c53947bd0d53","src/inflate/mod.rs":"9252ddf7edf6b8205ff5820dcc22eaeb244130e135f5bbb416c9701ca6118e23","src/inflate/output_buffer.rs":"0081b3fde84d8d0045e281fb143793eca8e9043733314e5cf6f37f51ac97021c","src/inflate/stream.rs":"7c91db58a7076e95117d533c151881f1339536525121f58c4b59d17a634e17ba","src/lib.rs":"08b54d4c675f3c2901d493ce85895952b639781faa40bf0b620da6dff0a1fb91","src/shared.rs":"889b9d9d3b4bc0693f94c850806e9cf68ed9079e0ada2b2f51bfffe388e02c6a"},"package":"a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b"} \ No newline at end of file diff --git a/vendor/miniz_oxide/Cargo.toml b/vendor/miniz_oxide/Cargo.toml index 451db16962..ce6ac31b5d 100644 --- a/vendor/miniz_oxide/Cargo.toml +++ b/vendor/miniz_oxide/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "miniz_oxide" -version = "0.4.3" +version = "0.4.4" authors = ["Frommi ", "oyvindln "] build = "build.rs" exclude = ["benches/*", "tests/*"] @@ -29,7 +29,7 @@ repository = "https://github.com/Frommi/miniz_oxide/tree/master/miniz_oxide" [lib] name = "miniz_oxide" [dependencies.adler] -version = "0.2.3" +version = "1.0" default-features = false [dependencies.alloc] diff --git a/vendor/miniz_oxide/src/deflate/core.rs b/vendor/miniz_oxide/src/deflate/core.rs index d25ea52287..c02bcc9586 100644 --- a/vendor/miniz_oxide/src/deflate/core.rs +++ b/vendor/miniz_oxide/src/deflate/core.rs @@ -385,7 +385,7 @@ fn write_u16_le(val: u16, slice: &mut [u8], pos: usize) { // Read the two bytes starting at pos and interpret them as an u16. #[inline] -fn read_u16_le(slice: &[u8], pos: usize) -> u16 { +const fn read_u16_le(slice: &[u8], pos: usize) -> u16 { // The compiler is smart enough to optimize this into an unaligned load. slice[pos] as u16 | ((slice[pos + 1] as u16) << 8) } @@ -675,7 +675,7 @@ impl<'a> OutputBufferOxide<'a> { } } - fn save(&self) -> SavedOutputBufferOxide { + const fn save(&self) -> SavedOutputBufferOxide { SavedOutputBufferOxide { pos: self.inner_pos, bit_buffer: self.bit_buffer, @@ -1184,7 +1184,7 @@ struct DictOxide { pub size: usize, } -fn probes_from_flags(flags: u32) -> [u32; 2] { +const fn probes_from_flags(flags: u32) -> [u32; 2] { [ 1 + ((flags & 0xFFF) + 2) / 3, 1 + (((flags & 0xFFF) >> 2) + 2) / 3, @@ -1446,7 +1446,7 @@ struct LZOxide { } impl LZOxide { - fn new() -> Self { + const fn new() -> Self { LZOxide { codes: [0; LZ_CODE_BUF_SIZE], code_position: 1, diff --git a/vendor/miniz_oxide/src/inflate/core.rs b/vendor/miniz_oxide/src/inflate/core.rs index 56df026a45..b18dbddd9f 100644 --- a/vendor/miniz_oxide/src/inflate/core.rs +++ b/vendor/miniz_oxide/src/inflate/core.rs @@ -26,7 +26,7 @@ struct HuffmanTable { } impl HuffmanTable { - fn new() -> HuffmanTable { + const fn new() -> HuffmanTable { HuffmanTable { code_size: [0; MAX_HUFF_SYMBOLS_0], look_up: [0; FAST_LOOKUP_SIZE as usize], diff --git a/vendor/miniz_oxide/src/inflate/output_buffer.rs b/vendor/miniz_oxide/src/inflate/output_buffer.rs index 0e9487f97e..89e6213786 100644 --- a/vendor/miniz_oxide/src/inflate/output_buffer.rs +++ b/vendor/miniz_oxide/src/inflate/output_buffer.rs @@ -15,7 +15,7 @@ impl<'a> OutputBuffer<'a> { } #[inline] - pub fn position(&self) -> usize { + pub const fn position(&self) -> usize { self.position } @@ -49,7 +49,7 @@ impl<'a> OutputBuffer<'a> { } #[inline] - pub fn get_ref(&self) -> &[u8] { + pub const fn get_ref(&self) -> &[u8] { self.slice } diff --git a/vendor/miniz_oxide/src/inflate/stream.rs b/vendor/miniz_oxide/src/inflate/stream.rs index 148d132549..4e0c2aca67 100644 --- a/vendor/miniz_oxide/src/inflate/stream.rs +++ b/vendor/miniz_oxide/src/inflate/stream.rs @@ -126,7 +126,7 @@ impl InflateState { } /// Return the status of the last call to `inflate` with this `InflateState`. - pub fn last_status(&self) -> TINFLStatus { + pub const fn last_status(&self) -> TINFLStatus { self.last_status } diff --git a/vendor/once_cell/.cargo-checksum.json b/vendor/once_cell/.cargo-checksum.json index a5ba306b30..936194d14f 100644 --- a/vendor/once_cell/.cargo-checksum.json +++ b/vendor/once_cell/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"822a0cbdf9bd857ef63fb775bbb887f685a84719fd866b5349786212b324a053","Cargo.lock":"4181aa848515ee1483b556fdd78b6d59fc025f671d46b18859880ddfa6248412","Cargo.toml":"fc4ae79cd01ea51cbe7a29a78f53b689b389f89feec10cf9383930fd05768ffd","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"d7203c0e18700de8e1408c3f4bb96075df271fea9ab678f6ad2e09855aefa7ed","bors.toml":"ebd69f714a49dceb8fd10ebadfea6e2767be4732fdef49eddf6239151b4bc78c","examples/bench.rs":"1597a52529f75d6c5ad0b86759a775b1d723dfa810e2016317283b13594219da","examples/bench_acquire.rs":"9f4912ca262194cb55e893c33739c85c2f4868d07905b9dd3238552b6ce8a6e4","examples/bench_vs_lazy_static.rs":"d527294a2e73b53ac5faed8b316dfd1ae2a06adb31384134af21f10ce76333a5","examples/lazy_static.rs":"90541b093ed1d1cbb73f4097ff02cf80657e28264d281d6a31d96a708fdfea90","examples/reentrant_init_deadlocks.rs":"ff84929de27a848e5b155549caa96db5db5f030afca975f8ba3f3da640083001","examples/regex.rs":"4a2e0fb093c7f5bbe0fff8689fc0c670c5334344a1bfda376f5faa98a05d459f","examples/test_synchronization.rs":"88abd5c16275bb2f2d77eaecf369d97681404a77b8edd0021f24bfd377c46be3","src/imp_pl.rs":"3b38a5ab0e2b9321b860bd45ccda45d804a5d7cd967b0b1b0c24f93b69eaebb9","src/imp_std.rs":"48121b9079e7289f0749f6e6612553ad587f246f72cd69ad2f1b7c6762bdffa6","src/lib.rs":"2abf26aa938010d546c93cffa9bb31ec1ed9e7522a420e1e144933abc636e081","src/race.rs":"e9110c6673e7ccaee86803e023dd149b74843e372288ef6804e927495a09d597","tests/it.rs":"e701bafda21026c9ea0c3668f9d74debae288b1a576ab3c70c356056efb3f8f9"},"package":"13bd41f508810a131401606d54ac32a467c97172d74ba7662562ebba5ad07fa0"} \ No newline at end of file +{"files":{"CHANGELOG.md":"007575511b35e14e9ebea4bf696ba331cd08d1cd2412ed43e74174ef4760133a","Cargo.lock":"383c174522aea65ff384ad388eff015380ef09581ef0785e9f0dcf8a9c0cc198","Cargo.toml":"20952c4f41d83412eccc2b3866e42e11e33331789bbc3939f4d7ef427e1f6781","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"7e93eec9a4c6c38db0eb3851c1e868c55e64ff2bacc86380d601a2ee08a11589","bors.toml":"ebd69f714a49dceb8fd10ebadfea6e2767be4732fdef49eddf6239151b4bc78c","examples/bench.rs":"1597a52529f75d6c5ad0b86759a775b1d723dfa810e2016317283b13594219da","examples/bench_acquire.rs":"9f4912ca262194cb55e893c33739c85c2f4868d07905b9dd3238552b6ce8a6e4","examples/bench_vs_lazy_static.rs":"d527294a2e73b53ac5faed8b316dfd1ae2a06adb31384134af21f10ce76333a5","examples/lazy_static.rs":"90541b093ed1d1cbb73f4097ff02cf80657e28264d281d6a31d96a708fdfea90","examples/reentrant_init_deadlocks.rs":"ff84929de27a848e5b155549caa96db5db5f030afca975f8ba3f3da640083001","examples/regex.rs":"4a2e0fb093c7f5bbe0fff8689fc0c670c5334344a1bfda376f5faa98a05d459f","examples/test_synchronization.rs":"88abd5c16275bb2f2d77eaecf369d97681404a77b8edd0021f24bfd377c46be3","src/imp_pl.rs":"cac67286119fcfa2b69ffb9ada51d5cb57c89e95a533d95d5d40b0ae4d38a6c2","src/imp_std.rs":"7a9b58444f71ca3025655f060dabc0f33a775d3b27916e9c22fe4182b286265d","src/lib.rs":"708696d9b70d2dd1ea57c6990c806bd53f13f5d1a5727254ca7620caabd77df5","src/race.rs":"b90a00d833919de2e1b03dee7b1b5c2fbfe246357c50b03643097860a95636e5","tests/it.rs":"ed9ff44665f29fa138055800d7199405740bce912f9c568c11aa2ff2249c17f8"},"package":"af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3"} \ No newline at end of file diff --git a/vendor/once_cell/CHANGELOG.md b/vendor/once_cell/CHANGELOG.md index 88a4944a8f..53fdf6472e 100644 --- a/vendor/once_cell/CHANGELOG.md +++ b/vendor/once_cell/CHANGELOG.md @@ -1,5 +1,27 @@ # Changelog +## 1.7.2 + +- Improve code size when using parking_lot feature. + +## 1.7.1 + +- Fix `race::OnceBox` to also impl `Default` even if `T` doesn't impl `Default`. + +## 1.7.0 + +- Hide the `race` module behind (default) `race` feature. + Turns out that adding `race` by default was a breaking change on some platforms without atomics. + In this release, we make the module opt-out. + Technically, this is a breaking change for those who use `race` with `no_default_features`. + Given that the `race` module itself only several days old, the breakage is deemed acceptable. + +## 1.6.0 + +- Add `Lazy::into_value` +- Stabilize `once_cell::race` module for "first one wins" no_std-compatible initialization flavor. +- Migrate from deprecated `compare_and_swap` to `compare_exchange`. + ## 1.5.2 - `OnceBox` API uses `Box`. diff --git a/vendor/once_cell/Cargo.lock b/vendor/once_cell/Cargo.lock index 0fa2d59d88..c84a2ec728 100644 --- a/vendor/once_cell/Cargo.lock +++ b/vendor/once_cell/Cargo.lock @@ -20,7 +20,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "cfg-if" -version = "0.1.10" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -28,27 +28,19 @@ name = "cfg-if" version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -[[package]] -name = "cloudabi" -version = "0.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - [[package]] name = "crossbeam-utils" version = "0.7.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "instant" -version = "0.1.8" +version = "0.1.9" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -61,12 +53,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "libc" -version = "0.2.80" +version = "0.2.87" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "lock_api" -version = "0.4.1" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", @@ -79,42 +71,44 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "once_cell" -version = "1.5.2" +version = "1.7.2" dependencies = [ "crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)", "regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot" -version = "0.11.0" +version = "0.11.1" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ - "instant 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "lock_api 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)", - "parking_lot_core 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)", + "instant 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "lock_api 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "parking_lot_core 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "parking_lot_core" -version = "0.8.0" +version = "0.8.3" 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)", - "cloudabi 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "instant 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.80 (registry+https://github.com/rust-lang/crates.io-index)", - "redox_syscall 0.1.57 (registry+https://github.com/rust-lang/crates.io-index)", - "smallvec 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "instant 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)", + "libc 0.2.87 (registry+https://github.com/rust-lang/crates.io-index)", + "redox_syscall 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)", + "smallvec 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)", "winapi 0.3.9 (registry+https://github.com/rust-lang/crates.io-index)", ] [[package]] name = "redox_syscall" -version = "0.1.57" +version = "0.2.5" source = "registry+https://github.com/rust-lang/crates.io-index" +dependencies = [ + "bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)", +] [[package]] name = "regex" @@ -143,7 +137,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] name = "smallvec" -version = "1.4.2" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -187,22 +181,21 @@ source = "registry+https://github.com/rust-lang/crates.io-index" "checksum aho-corasick 0.7.4 (registry+https://github.com/rust-lang/crates.io-index)" = "36b7aa1ccb7d7ea3f437cf025a2ab1c47cc6c1bc9fc84918ff449def12f5e282" "checksum autocfg 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" "checksum bitflags 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cf1de2fe8c75bc145a2f577add951f8134889b4795d47466a54a5c846d691693" -"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" +"checksum cfg-if 0.1.5 (registry+https://github.com/rust-lang/crates.io-index)" = "0c4e7bb64a8ebb0d856483e1e682ea3422f883c5f5615a90d51a2c82fe87fdd3" "checksum cfg-if 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -"checksum cloudabi 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "4344512281c643ae7638bbabc3af17a11307803ec8f0fcad9fae512a8bf36467" "checksum crossbeam-utils 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" -"checksum instant 0.1.8 (registry+https://github.com/rust-lang/crates.io-index)" = "cb1fc4429a33e1f80d41dc9fea4d108a88bec1de8053878898ae448a0b52f613" +"checksum instant 0.1.9 (registry+https://github.com/rust-lang/crates.io-index)" = "61124eeebbd69b8190558df225adf7e4caafce0d743919e5d6b19652314ec5ec" "checksum lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -"checksum libc 0.2.80 (registry+https://github.com/rust-lang/crates.io-index)" = "4d58d1b70b004888f764dfbf6a26a3b0342a1632d33968e4a179d8011c760614" -"checksum lock_api 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "28247cc5a5be2f05fbcd76dd0cf2c7d3b5400cb978a28042abcd4fa0b3f8261c" +"checksum libc 0.2.87 (registry+https://github.com/rust-lang/crates.io-index)" = "265d751d31d6780a3f956bb5b8022feba2d94eeee5a84ba64f4212eedca42213" +"checksum lock_api 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "dd96ffd135b2fd7b973ac026d28085defbe8983df057ced3eb4f2130b0831312" "checksum memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" -"checksum parking_lot 0.11.0 (registry+https://github.com/rust-lang/crates.io-index)" = "a4893845fa2ca272e647da5d0e46660a314ead9c2fdd9a883aabc32e481a8733" -"checksum parking_lot_core 0.8.0 (registry+https://github.com/rust-lang/crates.io-index)" = "c361aa727dd08437f2f1447be8b59a33b0edd15e0fcee698f935613d9efbca9b" -"checksum redox_syscall 0.1.57 (registry+https://github.com/rust-lang/crates.io-index)" = "41cc0f7e4d5d4544e8861606a285bb08d3e70712ccc7d2b84d7c0ccfaf4b05ce" +"checksum parking_lot 0.11.1 (registry+https://github.com/rust-lang/crates.io-index)" = "6d7744ac029df22dca6284efe4e898991d28e3085c706c972bcd7da4a27a15eb" +"checksum parking_lot_core 0.8.3 (registry+https://github.com/rust-lang/crates.io-index)" = "fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018" +"checksum redox_syscall 0.2.5 (registry+https://github.com/rust-lang/crates.io-index)" = "94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9" "checksum regex 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "6b23da8dfd98a84bd7e08700190a5d9f7d2d38abd4369dd1dae651bc40bfd2cc" "checksum regex-syntax 0.6.9 (registry+https://github.com/rust-lang/crates.io-index)" = "bfaca88e749e19dffb60f77b55e5d87a872fac7e9e48598f7cf93b2d8c047b0a" "checksum scopeguard 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -"checksum smallvec 1.4.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fbee7696b84bbf3d89a1c2eccff0850e3047ed46bfcd2e92c29a2d074d57e252" +"checksum smallvec 1.6.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e" "checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" "checksum ucd-util 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "8f3bf5cdf1df6b578c0947a94d4740bbb2b2afd1b898e33df1ff07b555a335e4" "checksum utf8-ranges 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)" = "fd70f467df6810094968e2fce0ee1bd0e87157aceb026a8c083bcf5e25b9efe4" diff --git a/vendor/once_cell/Cargo.toml b/vendor/once_cell/Cargo.toml index 3ca8c9abd8..0d3797b50d 100644 --- a/vendor/once_cell/Cargo.toml +++ b/vendor/once_cell/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "once_cell" -version = "1.5.2" +version = "1.7.2" authors = ["Aleksey Kladov "] exclude = ["*.png", "*.svg", "/Cargo.lock.min", "/.travis.yml", "/run-miri-tests.sh", "rustfmt.toml"] description = "Single assignment cells and lazy values." @@ -67,7 +67,8 @@ version = "1.0.0" version = "1.2.0" [features] -alloc = [] +alloc = ["race"] default = ["std"] +race = [] std = ["alloc"] unstable = [] diff --git a/vendor/once_cell/README.md b/vendor/once_cell/README.md index e55c7d4636..b5c9896429 100644 --- a/vendor/once_cell/README.md +++ b/vendor/once_cell/README.md @@ -1,4 +1,4 @@ -

    once_cell

    +

    once_cell

    [![Build Status](https://travis-ci.org/matklad/once_cell.svg?branch=master)](https://travis-ci.org/matklad/once_cell) diff --git a/vendor/once_cell/src/imp_pl.rs b/vendor/once_cell/src/imp_pl.rs index ed426b1c8d..6c9b0fe84c 100644 --- a/vendor/once_cell/src/imp_pl.rs +++ b/vendor/once_cell/src/imp_pl.rs @@ -7,6 +7,8 @@ use std::{ use parking_lot::Mutex; +use crate::take_unchecked; + pub(crate) struct OnceCell { mutex: Mutex<()>, is_initialized: AtomicBool, @@ -46,8 +48,10 @@ impl OnceCell { where F: FnOnce() -> Result, { - let _guard = self.mutex.lock(); - if !self.is_initialized() { + let mut f = Some(f); + let mut res: Result<(), E> = Ok(()); + let slot: *mut Option = self.value.get(); + initialize_inner(&self.mutex, &self.is_initialized, &mut || { // We are calling user-supplied function and need to be careful. // - if it returns Err, we unlock mutex and return without touching anything // - if it panics, we unlock mutex and propagate panic without touching anything @@ -56,15 +60,22 @@ impl OnceCell { // but that is more complicated // - finally, if it returns Ok, we store the value and store the flag with // `Release`, which synchronizes with `Acquire`s. - let value = f()?; - // Safe b/c we have a unique access and no panic may happen - // until the cell is marked as initialized. - let slot: &mut Option = unsafe { &mut *self.value.get() }; - debug_assert!(slot.is_none()); - *slot = Some(value); - self.is_initialized.store(true, Ordering::Release); - } - Ok(()) + let f = unsafe { take_unchecked(&mut f) }; + match f() { + Ok(value) => unsafe { + // Safe b/c we have a unique access and no panic may happen + // until the cell is marked as initialized. + debug_assert!((*slot).is_none()); + *slot = Some(value); + true + }, + Err(err) => { + res = Err(err); + false + } + } + }); + res } /// Get the reference to the underlying value, without checking if the cell @@ -102,6 +113,18 @@ impl OnceCell { } } +// Note: this is intentionally monomorphic +#[inline(never)] +fn initialize_inner(mutex: &Mutex<()>, is_initialized: &AtomicBool, init: &mut dyn FnMut() -> bool) { + let _guard = mutex.lock(); + + if !is_initialized.load(Ordering::Acquire) { + if init() { + is_initialized.store(true, Ordering::Release); + } + } +} + #[test] fn test_size() { use std::mem::size_of; diff --git a/vendor/once_cell/src/imp_std.rs b/vendor/once_cell/src/imp_std.rs index d7ccc85688..d7dda96728 100644 --- a/vendor/once_cell/src/imp_std.rs +++ b/vendor/once_cell/src/imp_std.rs @@ -12,6 +12,8 @@ use std::{ thread::{self, Thread}, }; +use crate::take_unchecked; + #[derive(Debug)] pub(crate) struct OnceCell { // This `state` word is actually an encoded version of just a pointer to a @@ -89,7 +91,7 @@ impl OnceCell { let mut res: Result<(), E> = Ok(()); let slot: *mut Option = self.value.get(); initialize_inner(&self.state_and_queue, &mut || { - let f = f.take().unwrap(); + let f = unsafe { take_unchecked(&mut f) }; match f() { Ok(value) => { unsafe { *slot = Some(value) }; @@ -144,6 +146,7 @@ impl OnceCell { // Corresponds to `std::sync::Once::call_inner` // Note: this is intentionally monomorphic +#[inline(never)] fn initialize_inner(my_state_and_queue: &AtomicUsize, init: &mut dyn FnMut() -> bool) -> bool { let mut state_and_queue = my_state_and_queue.load(Ordering::Acquire); @@ -151,12 +154,13 @@ fn initialize_inner(my_state_and_queue: &AtomicUsize, init: &mut dyn FnMut() -> match state_and_queue { COMPLETE => return true, INCOMPLETE => { - let old = my_state_and_queue.compare_and_swap( + let exchange = my_state_and_queue.compare_exchange( state_and_queue, RUNNING, Ordering::Acquire, + Ordering::Acquire, ); - if old != state_and_queue { + if let Err(old) = exchange { state_and_queue = old; continue; } @@ -193,8 +197,13 @@ fn wait(state_and_queue: &AtomicUsize, mut current_state: usize) { }; let me = &node as *const Waiter as usize; - let old = state_and_queue.compare_and_swap(current_state, me | RUNNING, Ordering::Release); - if old != current_state { + let exchange = state_and_queue.compare_exchange( + current_state, + me | RUNNING, + Ordering::Release, + Ordering::Relaxed, + ); + if let Err(old) = exchange { current_state = old; continue; } @@ -253,6 +262,7 @@ mod tests { } #[test] + #[cfg(not(miri))] fn stampede_once() { static O: OnceCell<()> = OnceCell::new(); static mut RUN: bool = false; diff --git a/vendor/once_cell/src/lib.rs b/vendor/once_cell/src/lib.rs index 79df2b6b1e..a455cb46a7 100644 --- a/vendor/once_cell/src/lib.rs +++ b/vendor/once_cell/src/lib.rs @@ -233,10 +233,11 @@ //! and [`lazy_cell`](https://github.com/indiv0/lazycell/) crates and [`std::sync::Once`]. In some sense, //! `once_cell` just streamlines and unifies those APIs. //! -//! To implement a sync flavor of `OnceCell`, this crates uses either a custom re-implementation of -//! `std::sync::Once` or `parking_lot::Mutex`. This is controlled by the `parking_lot` feature, which -//! is enabled by default. Performance is the same for both cases, but the `parking_lot` based `OnceCell` -//! is smaller by up to 16 bytes. +//! To implement a sync flavor of `OnceCell`, this crates uses either a custom +//! re-implementation of `std::sync::Once` or `parking_lot::Mutex`. This is +//! controlled by the `parking_lot` feature (disabled by default). Performance +//! is the same for both cases, but the `parking_lot` based `OnceCell` is +//! smaller by up to 16 bytes. //! //! This crate uses `unsafe`. //! @@ -277,7 +278,6 @@ #![cfg_attr(not(feature = "std"), no_std)] -#[cfg(feature = "unstable")] #[cfg(feature = "alloc")] extern crate alloc; @@ -599,6 +599,17 @@ pub mod unsync { pub const fn new(init: F) -> Lazy { Lazy { cell: OnceCell::new(), init: Cell::new(Some(init)) } } + + /// Consumes this `Lazy` returning the stored value. + /// + /// Returns `Ok(value)` if `Lazy` is initialized and `Err(f)` otherwise. + pub fn into_value(this: Lazy) -> Result { + let cell = this.cell; + let init = this.init; + cell.into_inner().ok_or_else(|| { + init.take().unwrap_or_else(|| panic!("Lazy instance has previously been poisoned")) + }) + } } impl T> Lazy { @@ -980,6 +991,17 @@ pub mod sync { pub const fn new(f: F) -> Lazy { Lazy { cell: OnceCell::new(), init: Cell::new(Some(f)) } } + + /// Consumes this `Lazy` returning the stored value. + /// + /// Returns `Ok(value)` if `Lazy` is initialized and `Err(f)` otherwise. + pub fn into_value(this: Lazy) -> Result { + let cell = this.cell; + let init = this.init; + cell.into_inner().ok_or_else(|| { + init.take().unwrap_or_else(|| panic!("Lazy instance has previously been poisoned")) + }) + } } impl T> Lazy { @@ -1043,5 +1065,16 @@ pub mod sync { fn _dummy() {} } -#[cfg(feature = "unstable")] +#[cfg(feature = "race")] pub mod race; + +#[cfg(feature = "std")] +unsafe fn take_unchecked(val: &mut Option) -> T { + match val.take() { + Some(it) => it, + None => { + debug_assert!(false); + std::hint::unreachable_unchecked() + } + } +} diff --git a/vendor/once_cell/src/race.rs b/vendor/once_cell/src/race.rs index 6693da6cb2..e0dc8fcfe1 100644 --- a/vendor/once_cell/src/race.rs +++ b/vendor/once_cell/src/race.rs @@ -19,11 +19,13 @@ pub struct OnceNonZeroUsize { impl OnceNonZeroUsize { /// Creates a new empty cell. + #[inline] pub const fn new() -> OnceNonZeroUsize { OnceNonZeroUsize { inner: AtomicUsize::new(0) } } /// Gets the underlying value. + #[inline] pub fn get(&self) -> Option { let val = self.inner.load(Ordering::Acquire); NonZeroUsize::new(val) @@ -33,12 +35,13 @@ impl OnceNonZeroUsize { /// /// Returns `Ok(())` if the cell was empty and `Err(())` if it was /// full. + #[inline] pub fn set(&self, value: NonZeroUsize) -> Result<(), ()> { - let val = self.inner.compare_and_swap(0, value.get(), Ordering::AcqRel); - if val == 0 { - Ok(()) - } else { - Err(()) + let exchange = + self.inner.compare_exchange(0, value.get(), Ordering::AcqRel, Ordering::Acquire); + match exchange { + Ok(_) => Ok(()), + Err(_) => Err(()), } } @@ -75,9 +78,10 @@ impl OnceNonZeroUsize { Some(it) => it, None => { let mut val = f()?.get(); - let old_val = self.inner.compare_and_swap(0, val, Ordering::AcqRel); - if old_val != 0 { - val = old_val; + let exchange = + self.inner.compare_exchange(0, val, Ordering::AcqRel, Ordering::Acquire); + if let Err(old) = exchange { + val = old; } unsafe { NonZeroUsize::new_unchecked(val) } } @@ -94,11 +98,13 @@ pub struct OnceBool { impl OnceBool { /// Creates a new empty cell. + #[inline] pub const fn new() -> OnceBool { OnceBool { inner: OnceNonZeroUsize::new() } } /// Gets the underlying value. + #[inline] pub fn get(&self) -> Option { self.inner.get().map(OnceBool::from_usize) } @@ -107,6 +113,7 @@ impl OnceBool { /// /// Returns `Ok(())` if the cell was empty and `Err(())` if it was /// full. + #[inline] pub fn set(&self, value: bool) -> Result<(), ()> { self.inner.set(OnceBool::to_usize(value)) } @@ -138,9 +145,11 @@ impl OnceBool { self.inner.get_or_try_init(|| f().map(OnceBool::to_usize)).map(OnceBool::from_usize) } + #[inline] fn from_usize(value: NonZeroUsize) -> bool { value.get() == 1 } + #[inline] fn to_usize(value: bool) -> NonZeroUsize { unsafe { NonZeroUsize::new_unchecked(if value { 1 } else { 2 }) } } @@ -148,22 +157,30 @@ impl OnceBool { #[cfg(feature = "alloc")] pub use self::once_box::OnceBox; + #[cfg(feature = "alloc")] mod once_box { - use alloc::boxed::Box; use core::{ marker::PhantomData, ptr, sync::atomic::{AtomicPtr, Ordering}, }; + use alloc::boxed::Box; + /// A thread-safe cell which can be written to only once. - #[derive(Default, Debug)] + #[derive(Debug)] pub struct OnceBox { inner: AtomicPtr, ghost: PhantomData>>, } + impl Default for OnceBox { + fn default() -> Self { + Self::new() + } + } + impl Drop for OnceBox { fn drop(&mut self) { let ptr = *self.inner.get_mut(); @@ -194,8 +211,13 @@ mod once_box { /// full. pub fn set(&self, value: Box) -> Result<(), Box> { let ptr = Box::into_raw(value); - let old_ptr = self.inner.compare_and_swap(ptr::null_mut(), ptr, Ordering::AcqRel); - if !old_ptr.is_null() { + let exchange = self.inner.compare_exchange( + ptr::null_mut(), + ptr, + Ordering::AcqRel, + Ordering::Acquire, + ); + if let Err(_) = exchange { let value = unsafe { Box::from_raw(ptr) }; return Err(value); } @@ -235,16 +257,23 @@ mod once_box { if ptr.is_null() { let val = f()?; ptr = Box::into_raw(val); - let old_ptr = self.inner.compare_and_swap(ptr::null_mut(), ptr, Ordering::AcqRel); - if !old_ptr.is_null() { + let exchange = self.inner.compare_exchange( + ptr::null_mut(), + ptr, + Ordering::AcqRel, + Ordering::Acquire, + ); + if let Err(old) = exchange { drop(unsafe { Box::from_raw(ptr) }); - ptr = old_ptr; + ptr = old; } }; Ok(unsafe { &*ptr }) } } + unsafe impl Sync for OnceBox {} + /// ```compile_fail /// struct S(*mut ()); /// unsafe impl Sync for S {} @@ -252,5 +281,5 @@ mod once_box { /// fn share(_: &T) {} /// share(&once_cell::race::OnceBox::::new()); /// ``` - unsafe impl Sync for OnceBox {} + fn _dummy() {} } diff --git a/vendor/once_cell/tests/it.rs b/vendor/once_cell/tests/it.rs index 2a3a9858f3..81faaffe46 100644 --- a/vendor/once_cell/tests/it.rs +++ b/vendor/once_cell/tests/it.rs @@ -155,6 +155,15 @@ mod unsync { assert_eq!(CALLED.load(SeqCst), 1); } + #[test] + fn lazy_into_value() { + let l: Lazy = Lazy::new(|| panic!()); + assert!(matches!(Lazy::into_value(l), Err(_))); + let l = Lazy::new(|| -> i32 { 92 }); + Lazy::force(&l); + assert!(matches!(Lazy::into_value(l), Ok(92))); + } + #[test] #[cfg(feature = "std")] fn lazy_poisoning() { @@ -467,6 +476,15 @@ mod sync { assert_eq!(xs(), &vec![1, 2, 3]); } + #[test] + fn lazy_into_value() { + let l: Lazy = Lazy::new(|| panic!()); + assert!(matches!(Lazy::into_value(l), Err(_))); + let l = Lazy::new(|| -> i32 { 92 }); + Lazy::force(&l); + assert!(matches!(Lazy::into_value(l), Ok(92))); + } + #[test] fn lazy_poisoning() { let x: Lazy = Lazy::new(|| panic!("kaboom")); @@ -571,7 +589,7 @@ mod sync { } } -#[cfg(feature = "unstable")] +#[cfg(feature = "race")] mod race { use std::{ num::NonZeroUsize, @@ -707,7 +725,7 @@ mod race { } } -#[cfg(all(feature = "unstable", feature = "alloc"))] +#[cfg(all(feature = "race", feature = "alloc"))] mod race_once_box { use std::sync::{ atomic::{AtomicUsize, Ordering::SeqCst}, @@ -841,4 +859,12 @@ mod race_once_box { }); assert_eq!(res, "hello"); } + + #[test] + fn once_box_default() { + struct Foo; + + let cell: OnceBox = Default::default(); + assert!(cell.get().is_none()); + } } diff --git a/vendor/parking_lot_core/.cargo-checksum.json b/vendor/parking_lot_core/.cargo-checksum.json index 85ed91a1aa..0398359d59 100644 --- a/vendor/parking_lot_core/.cargo-checksum.json +++ b/vendor/parking_lot_core/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"47ce78ae2c5d40969f0ce1f370fd54c99f24e3d1962c446aba19d832b63cf4b8","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","src/lib.rs":"7baf09034aafc28f7dbb1550cdde89221e4eb5dfda51b55aeb652ee8710c715d","src/parking_lot.rs":"58125667bd78399e8753b6bd8acef84f180f369f0bc174c573887176bab9f9d3","src/spinwait.rs":"d568d8a81f9144ec4c4a139dc934d7d04ee1656a4a221eb548742fe7aba09ab1","src/thread_parker/generic.rs":"574aecb3c325012b683eca4135441ec73f44c33cc9955aa05db24d7e4c991cd7","src/thread_parker/linux.rs":"4a2c76b3dc09301ceb73d904460f49d91bc1a2492cc123ee26ca22ece3faae79","src/thread_parker/mod.rs":"9c675b7690bbde62e88d946fad218623d423edccff4e01e8e52b116d815c695c","src/thread_parker/redox.rs":"91ca107c4edffa57e87294cadec3b6010b584fb272c044e2557c925dbcb90f6a","src/thread_parker/sgx.rs":"898ced116fb7b0ac077b5977b5bcac610f1d55beffb613ec73e083b1ef09cc28","src/thread_parker/unix.rs":"02a17ad1241e8547cc7ee096318757b01d328354b639d0f799fca66ff2f07439","src/thread_parker/wasm.rs":"903b7eec240cdbe8a23467f6b41d042d93b35755bd1763be02f9cc55756c4aec","src/thread_parker/wasm_atomic.rs":"cf761157803256b18205e747bc99e30b18d5410c27121fa9595e12cb51bb6bef","src/thread_parker/windows/keyed_event.rs":"fc1cf4e592d814c4c949217d91317ec2afb6048430abebb3cea2e8487b369734","src/thread_parker/windows/mod.rs":"c99a3871e69800452a56928a9e870530b7f48a563a4d3efe6184103147899f0c","src/thread_parker/windows/waitaddress.rs":"8e037df2a5692905e2bc2d4ea955295ab92bcc7e26eea0bb7a4eaac9ce657321","src/util.rs":"285e6133150645525f2ca1ece41f6d35bad4e7c5e08b42b20c99d2a97e04a974","src/word_lock.rs":"2c030aedb340ae8ca564365206452c298fe29986d005d6a40e808c9760f91c95"},"package":"9ccb628cad4f84851442432c60ad8e1f607e29752d0bf072cbd0baf28aa34272"} \ No newline at end of file +{"files":{"Cargo.toml":"ccd1260851c747071cbc3750ac0d4a29f0c1d0896ef8fa756f3583c4e5089243","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","src/lib.rs":"7baf09034aafc28f7dbb1550cdde89221e4eb5dfda51b55aeb652ee8710c715d","src/parking_lot.rs":"58125667bd78399e8753b6bd8acef84f180f369f0bc174c573887176bab9f9d3","src/spinwait.rs":"d568d8a81f9144ec4c4a139dc934d7d04ee1656a4a221eb548742fe7aba09ab1","src/thread_parker/generic.rs":"574aecb3c325012b683eca4135441ec73f44c33cc9955aa05db24d7e4c991cd7","src/thread_parker/linux.rs":"4a2c76b3dc09301ceb73d904460f49d91bc1a2492cc123ee26ca22ece3faae79","src/thread_parker/mod.rs":"9c675b7690bbde62e88d946fad218623d423edccff4e01e8e52b116d815c695c","src/thread_parker/redox.rs":"91ca107c4edffa57e87294cadec3b6010b584fb272c044e2557c925dbcb90f6a","src/thread_parker/sgx.rs":"898ced116fb7b0ac077b5977b5bcac610f1d55beffb613ec73e083b1ef09cc28","src/thread_parker/unix.rs":"02a17ad1241e8547cc7ee096318757b01d328354b639d0f799fca66ff2f07439","src/thread_parker/wasm.rs":"903b7eec240cdbe8a23467f6b41d042d93b35755bd1763be02f9cc55756c4aec","src/thread_parker/wasm_atomic.rs":"cf761157803256b18205e747bc99e30b18d5410c27121fa9595e12cb51bb6bef","src/thread_parker/windows/keyed_event.rs":"fc1cf4e592d814c4c949217d91317ec2afb6048430abebb3cea2e8487b369734","src/thread_parker/windows/mod.rs":"c99a3871e69800452a56928a9e870530b7f48a563a4d3efe6184103147899f0c","src/thread_parker/windows/waitaddress.rs":"8e037df2a5692905e2bc2d4ea955295ab92bcc7e26eea0bb7a4eaac9ce657321","src/util.rs":"285e6133150645525f2ca1ece41f6d35bad4e7c5e08b42b20c99d2a97e04a974","src/word_lock.rs":"2c030aedb340ae8ca564365206452c298fe29986d005d6a40e808c9760f91c95"},"package":"fa7a782938e745763fe6907fc6ba86946d72f49fe7e21de074e08128a99fb018"} \ No newline at end of file diff --git a/vendor/parking_lot_core/Cargo.toml b/vendor/parking_lot_core/Cargo.toml index c24c1ded8b..a9184c21a5 100644 --- a/vendor/parking_lot_core/Cargo.toml +++ b/vendor/parking_lot_core/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "parking_lot_core" -version = "0.8.2" +version = "0.8.3" authors = ["Amanieu d'Antras "] description = "An advanced API for creating custom synchronization primitives." keywords = ["mutex", "condvar", "rwlock", "once", "thread"] @@ -35,7 +35,7 @@ version = "0.5.1" optional = true [dependencies.smallvec] -version = "1.0" +version = "1.6.1" [dependencies.thread-id] version = "3.3.0" @@ -45,7 +45,7 @@ optional = true deadlock_detection = ["petgraph", "thread-id", "backtrace"] nightly = [] [target."cfg(target_os = \"redox\")".dependencies.redox_syscall] -version = "0.1.56" +version = "0.2.4" [target."cfg(unix)".dependencies.libc] version = "0.2.71" [target."cfg(windows)".dependencies.winapi] diff --git a/vendor/perf-event-open-sys/.cargo-checksum.json b/vendor/perf-event-open-sys/.cargo-checksum.json new file mode 100644 index 0000000000..94c12b528d --- /dev/null +++ b/vendor/perf-event-open-sys/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"Cargo.toml":"43d4960bd26abbc5e6682924a3a35cd5b96ddde703f8578e1b304dcbfcc77a7a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"383389744bfd0cd720224f8a01fb6dd28be093ba4965363dcd0d6ae8da3d087b","regenerate.sh":"75c81d43681cd44c961da0399605a8cfe1b05b6d3a8659e11e9984f9f7c88618","src/bindings.rs":"ee0d5d224dfeae4feefbbfbf2ce46b7617ba109fa1b7f88ab886a99131d41bab","src/lib.rs":"42c2107446f81663e4c59a11148ebc8df5241b62a58f0712133382667bc35176","wrapper.h":"22abab03fcdb32f39c72756da8c45dd4d4b6cbf3de24d8922dbc3a460bccf27a"},"package":"ce9bedf5da2c234fdf2391ede2b90fabf585355f33100689bc364a3ea558561a"} \ No newline at end of file diff --git a/vendor/perf-event-open-sys/Cargo.toml b/vendor/perf-event-open-sys/Cargo.toml new file mode 100644 index 0000000000..1fd0b9dd4c --- /dev/null +++ b/vendor/perf-event-open-sys/Cargo.toml @@ -0,0 +1,23 @@ +# 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 = "perf-event-open-sys" +version = "1.0.1" +authors = ["Jim Blandy "] +description = "Unsafe, direct bindings for Linux's perf_event_open system call, with associated\ntypes and constants.\n" +readme = "README.md" +license = "MIT OR Apache-2.0" +repository = "https://github.com/jimblandy/perf-event-open-sys.git" +[dependencies.libc] +version = "0.2" diff --git a/vendor/wasi-0.9.0+wasi-snapshot-preview1/LICENSE-APACHE b/vendor/perf-event-open-sys/LICENSE-APACHE similarity index 100% rename from vendor/wasi-0.9.0+wasi-snapshot-preview1/LICENSE-APACHE rename to vendor/perf-event-open-sys/LICENSE-APACHE diff --git a/vendor/const_fn/LICENSE-MIT b/vendor/perf-event-open-sys/LICENSE-MIT similarity index 100% rename from vendor/const_fn/LICENSE-MIT rename to vendor/perf-event-open-sys/LICENSE-MIT diff --git a/vendor/perf-event-open-sys/README.md b/vendor/perf-event-open-sys/README.md new file mode 100644 index 0000000000..faf43d4ffa --- /dev/null +++ b/vendor/perf-event-open-sys/README.md @@ -0,0 +1,47 @@ +## Direct, unsafe Rust bindings for Linux's `perf_event_open` system call + +This crate exports `unsafe` Rust wrappers for Linux system calls for accessing +performance monitoring counters and tracing facilities. This includes: + +- the processor's own performance monitoring registers +- kernel counters for things like context switches and page faults +- kernel tracepoints, kprobe, and uprobes +- processor tracing facilities like Intel's Branch Trace Store (BTS) +- hardware breakpoints + +This crate provides: + +- a Rust wrapper the Linux `perf_event_open` system call +- Rust wrappers for the ioctls you can apply to a file descriptor returned by `perf_event_open` +- bindings for `perf_event_open`'s associated header files, automatically generated by `bindgen` + +All functions are direct, `unsafe` wrappers for the underlying calls. They +operate on raw pointers and raw file descriptors. + +For a type-safe API for basic functionality, see the [perf-event] crate. + +[perf-event]: https://crates.io/crates/perf-event + +### Updating the System Call Bindings + +The `bindings` module defines Rust equivalents for the types and constants used +by the Linux `perf_event_open` system call and its related ioctls. These are +generated automatically from the kernel's C header files, using [bindgen]. Both +the interface and the underlying functionality are quite complex, and new +features are added at a steady pace. To update the generated bindings: + +- Run the `regenerate.sh` script, found in the same directory as this + `README.md` file. This runs bindgen and splices its output in the `bindings` + module's source code, preserving the documentation. + +- Fix the comments in `src/lib.rs` explaining exactly which version of the + kernel headers you generated the bindings from. + +- Update the crate's major version. Newer versions of the kernel headers may + add fields to structs, which is a breaking change. (As explained in the + module documentation, properly written user crates should not be affected, + but it seems unnecessary to risk `cargo update` breaking builds. When users + need new functionality from the bindings, they can update the major version + number of this crate they request.) + +[bindgen]: https://crates.io/crates/bindgen diff --git a/vendor/perf-event-open-sys/regenerate.sh b/vendor/perf-event-open-sys/regenerate.sh new file mode 100755 index 0000000000..81cfea6808 --- /dev/null +++ b/vendor/perf-event-open-sys/regenerate.sh @@ -0,0 +1,12 @@ +#!/usr/bin/env bash + +set -eu + +cd $(dirname $0) + +( + sed -e '/automatically generated by rust-bindgen/,$d' src/bindings.rs + bindgen --with-derive-default wrapper.h +) > new-bindings.rs~ + +mv new-bindings.rs~ src/bindings.rs diff --git a/vendor/perf-event-open-sys/src/bindings.rs b/vendor/perf-event-open-sys/src/bindings.rs new file mode 100644 index 0000000000..0cdd407425 --- /dev/null +++ b/vendor/perf-event-open-sys/src/bindings.rs @@ -0,0 +1,2897 @@ +//! Types and constants used with `perf_event_open`. +//! +//! This module contains types and constants for use with the +//! [`perf_event_open`][man] system call. These are automatically generated from +//! the header files `` and `` by the +//! Rust [`bindgen`][bindgen] tool. +//! +//! It's not always obvious how `bindgen` will choose to reflect a given C +//! construct into Rust. The best approach I've found is simply to search +//! [the source code][src] for the C identifier name and see what `bindgen` did +//! with it. +//! +//! [man]: http://man7.org/linux/man-pages/man2/perf_event_open.2.html +//! [bindgen]: https://github.com/rust-lang/rust-bindgen +//! [src]: ../../src/perf_event_open_sys/bindings.rs.html + +#![allow(dead_code)] +#![allow(non_upper_case_globals)] +#![allow(non_camel_case_types)] +#![allow(non_snake_case)] + +/* automatically generated by rust-bindgen 0.54.1 */ + +#[repr(C)] +#[derive(Copy, Clone, Debug, Default, Eq, Hash, Ord, PartialEq, PartialOrd)] +pub struct __BindgenBitfieldUnit { + storage: Storage, + align: [Align; 0], +} +impl __BindgenBitfieldUnit { + #[inline] + pub const fn new(storage: Storage) -> Self { + Self { storage, align: [] } + } +} +impl __BindgenBitfieldUnit +where + Storage: AsRef<[u8]> + AsMut<[u8]>, +{ + #[inline] + pub fn get_bit(&self, index: usize) -> bool { + debug_assert!(index / 8 < self.storage.as_ref().len()); + let byte_index = index / 8; + let byte = self.storage.as_ref()[byte_index]; + let bit_index = if cfg!(target_endian = "big") { + 7 - (index % 8) + } else { + index % 8 + }; + let mask = 1 << bit_index; + byte & mask == mask + } + #[inline] + pub fn set_bit(&mut self, index: usize, val: bool) { + debug_assert!(index / 8 < self.storage.as_ref().len()); + let byte_index = index / 8; + let byte = &mut self.storage.as_mut()[byte_index]; + let bit_index = if cfg!(target_endian = "big") { + 7 - (index % 8) + } else { + index % 8 + }; + let mask = 1 << bit_index; + if val { + *byte |= mask; + } else { + *byte &= !mask; + } + } + #[inline] + pub fn get(&self, bit_offset: usize, bit_width: u8) -> u64 { + debug_assert!(bit_width <= 64); + debug_assert!(bit_offset / 8 < self.storage.as_ref().len()); + debug_assert!((bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len()); + let mut val = 0; + for i in 0..(bit_width as usize) { + if self.get_bit(i + bit_offset) { + let index = if cfg!(target_endian = "big") { + bit_width as usize - 1 - i + } else { + i + }; + val |= 1 << index; + } + } + val + } + #[inline] + pub fn set(&mut self, bit_offset: usize, bit_width: u8, val: u64) { + debug_assert!(bit_width <= 64); + debug_assert!(bit_offset / 8 < self.storage.as_ref().len()); + debug_assert!((bit_offset + (bit_width as usize)) / 8 <= self.storage.as_ref().len()); + for i in 0..(bit_width as usize) { + let mask = 1 << i; + let val_bit_is_set = val & mask == mask; + let index = if cfg!(target_endian = "big") { + bit_width as usize - 1 - i + } else { + i + }; + self.set_bit(index + bit_offset, val_bit_is_set); + } + } +} +#[repr(C)] +#[derive(Default)] +pub struct __IncompleteArrayField(::std::marker::PhantomData, [T; 0]); +impl __IncompleteArrayField { + #[inline] + pub const fn new() -> Self { + __IncompleteArrayField(::std::marker::PhantomData, []) + } + #[inline] + pub fn as_ptr(&self) -> *const T { + self as *const _ as *const T + } + #[inline] + pub fn as_mut_ptr(&mut self) -> *mut T { + self as *mut _ as *mut T + } + #[inline] + pub unsafe fn as_slice(&self, len: usize) -> &[T] { + ::std::slice::from_raw_parts(self.as_ptr(), len) + } + #[inline] + pub unsafe fn as_mut_slice(&mut self, len: usize) -> &mut [T] { + ::std::slice::from_raw_parts_mut(self.as_mut_ptr(), len) + } +} +impl ::std::fmt::Debug for __IncompleteArrayField { + fn fmt(&self, fmt: &mut ::std::fmt::Formatter<'_>) -> ::std::fmt::Result { + fmt.write_str("__IncompleteArrayField") + } +} +pub const __BITS_PER_LONG: u32 = 64; +pub const __FD_SETSIZE: u32 = 1024; +pub const _IOC_NRBITS: u32 = 8; +pub const _IOC_TYPEBITS: u32 = 8; +pub const _IOC_SIZEBITS: u32 = 14; +pub const _IOC_DIRBITS: u32 = 2; +pub const _IOC_NRMASK: u32 = 255; +pub const _IOC_TYPEMASK: u32 = 255; +pub const _IOC_SIZEMASK: u32 = 16383; +pub const _IOC_DIRMASK: u32 = 3; +pub const _IOC_NRSHIFT: u32 = 0; +pub const _IOC_TYPESHIFT: u32 = 8; +pub const _IOC_SIZESHIFT: u32 = 16; +pub const _IOC_DIRSHIFT: u32 = 30; +pub const _IOC_NONE: u32 = 0; +pub const _IOC_WRITE: u32 = 1; +pub const _IOC_READ: u32 = 2; +pub const IOC_IN: u32 = 1073741824; +pub const IOC_OUT: u32 = 2147483648; +pub const IOC_INOUT: u32 = 3221225472; +pub const IOCSIZE_MASK: u32 = 1073676288; +pub const IOCSIZE_SHIFT: u32 = 16; +pub const __LITTLE_ENDIAN: u32 = 1234; +pub const PERF_ATTR_SIZE_VER0: u32 = 64; +pub const PERF_ATTR_SIZE_VER1: u32 = 72; +pub const PERF_ATTR_SIZE_VER2: u32 = 80; +pub const PERF_ATTR_SIZE_VER3: u32 = 96; +pub const PERF_ATTR_SIZE_VER4: u32 = 104; +pub const PERF_ATTR_SIZE_VER5: u32 = 112; +pub const PERF_ATTR_SIZE_VER6: u32 = 120; +pub const PERF_RECORD_MISC_CPUMODE_MASK: u32 = 7; +pub const PERF_RECORD_MISC_CPUMODE_UNKNOWN: u32 = 0; +pub const PERF_RECORD_MISC_KERNEL: u32 = 1; +pub const PERF_RECORD_MISC_USER: u32 = 2; +pub const PERF_RECORD_MISC_HYPERVISOR: u32 = 3; +pub const PERF_RECORD_MISC_GUEST_KERNEL: u32 = 4; +pub const PERF_RECORD_MISC_GUEST_USER: u32 = 5; +pub const PERF_RECORD_MISC_PROC_MAP_PARSE_TIMEOUT: u32 = 4096; +pub const PERF_RECORD_MISC_MMAP_DATA: u32 = 8192; +pub const PERF_RECORD_MISC_COMM_EXEC: u32 = 8192; +pub const PERF_RECORD_MISC_FORK_EXEC: u32 = 8192; +pub const PERF_RECORD_MISC_SWITCH_OUT: u32 = 8192; +pub const PERF_RECORD_MISC_EXACT_IP: u32 = 16384; +pub const PERF_RECORD_MISC_SWITCH_OUT_PREEMPT: u32 = 16384; +pub const PERF_RECORD_MISC_EXT_RESERVED: u32 = 32768; +pub const PERF_RECORD_KSYMBOL_FLAGS_UNREGISTER: u32 = 1; +pub const PERF_MAX_STACK_DEPTH: u32 = 127; +pub const PERF_MAX_CONTEXTS_PER_STACK: u32 = 8; +pub const PERF_AUX_FLAG_TRUNCATED: u32 = 1; +pub const PERF_AUX_FLAG_OVERWRITE: u32 = 2; +pub const PERF_AUX_FLAG_PARTIAL: u32 = 4; +pub const PERF_AUX_FLAG_COLLISION: u32 = 8; +pub const PERF_FLAG_FD_NO_GROUP: u32 = 1; +pub const PERF_FLAG_FD_OUTPUT: u32 = 2; +pub const PERF_FLAG_PID_CGROUP: u32 = 4; +pub const PERF_FLAG_FD_CLOEXEC: u32 = 8; +pub const PERF_MEM_OP_NA: u32 = 1; +pub const PERF_MEM_OP_LOAD: u32 = 2; +pub const PERF_MEM_OP_STORE: u32 = 4; +pub const PERF_MEM_OP_PFETCH: u32 = 8; +pub const PERF_MEM_OP_EXEC: u32 = 16; +pub const PERF_MEM_OP_SHIFT: u32 = 0; +pub const PERF_MEM_LVL_NA: u32 = 1; +pub const PERF_MEM_LVL_HIT: u32 = 2; +pub const PERF_MEM_LVL_MISS: u32 = 4; +pub const PERF_MEM_LVL_L1: u32 = 8; +pub const PERF_MEM_LVL_LFB: u32 = 16; +pub const PERF_MEM_LVL_L2: u32 = 32; +pub const PERF_MEM_LVL_L3: u32 = 64; +pub const PERF_MEM_LVL_LOC_RAM: u32 = 128; +pub const PERF_MEM_LVL_REM_RAM1: u32 = 256; +pub const PERF_MEM_LVL_REM_RAM2: u32 = 512; +pub const PERF_MEM_LVL_REM_CCE1: u32 = 1024; +pub const PERF_MEM_LVL_REM_CCE2: u32 = 2048; +pub const PERF_MEM_LVL_IO: u32 = 4096; +pub const PERF_MEM_LVL_UNC: u32 = 8192; +pub const PERF_MEM_LVL_SHIFT: u32 = 5; +pub const PERF_MEM_REMOTE_REMOTE: u32 = 1; +pub const PERF_MEM_REMOTE_SHIFT: u32 = 37; +pub const PERF_MEM_LVLNUM_L1: u32 = 1; +pub const PERF_MEM_LVLNUM_L2: u32 = 2; +pub const PERF_MEM_LVLNUM_L3: u32 = 3; +pub const PERF_MEM_LVLNUM_L4: u32 = 4; +pub const PERF_MEM_LVLNUM_ANY_CACHE: u32 = 11; +pub const PERF_MEM_LVLNUM_LFB: u32 = 12; +pub const PERF_MEM_LVLNUM_RAM: u32 = 13; +pub const PERF_MEM_LVLNUM_PMEM: u32 = 14; +pub const PERF_MEM_LVLNUM_NA: u32 = 15; +pub const PERF_MEM_LVLNUM_SHIFT: u32 = 33; +pub const PERF_MEM_SNOOP_NA: u32 = 1; +pub const PERF_MEM_SNOOP_NONE: u32 = 2; +pub const PERF_MEM_SNOOP_HIT: u32 = 4; +pub const PERF_MEM_SNOOP_MISS: u32 = 8; +pub const PERF_MEM_SNOOP_HITM: u32 = 16; +pub const PERF_MEM_SNOOP_SHIFT: u32 = 19; +pub const PERF_MEM_SNOOPX_FWD: u32 = 1; +pub const PERF_MEM_SNOOPX_SHIFT: u32 = 37; +pub const PERF_MEM_LOCK_NA: u32 = 1; +pub const PERF_MEM_LOCK_LOCKED: u32 = 2; +pub const PERF_MEM_LOCK_SHIFT: u32 = 24; +pub const PERF_MEM_TLB_NA: u32 = 1; +pub const PERF_MEM_TLB_HIT: u32 = 2; +pub const PERF_MEM_TLB_MISS: u32 = 4; +pub const PERF_MEM_TLB_L1: u32 = 8; +pub const PERF_MEM_TLB_L2: u32 = 16; +pub const PERF_MEM_TLB_WK: u32 = 32; +pub const PERF_MEM_TLB_OS: u32 = 64; +pub const PERF_MEM_TLB_SHIFT: u32 = 26; +pub const __X32_SYSCALL_BIT: u32 = 1073741824; +pub const _ASM_X86_UNISTD_64_H: u32 = 1; +pub const __NR_read: u32 = 0; +pub const __NR_write: u32 = 1; +pub const __NR_open: u32 = 2; +pub const __NR_close: u32 = 3; +pub const __NR_stat: u32 = 4; +pub const __NR_fstat: u32 = 5; +pub const __NR_lstat: u32 = 6; +pub const __NR_poll: u32 = 7; +pub const __NR_lseek: u32 = 8; +pub const __NR_mmap: u32 = 9; +pub const __NR_mprotect: u32 = 10; +pub const __NR_munmap: u32 = 11; +pub const __NR_brk: u32 = 12; +pub const __NR_rt_sigaction: u32 = 13; +pub const __NR_rt_sigprocmask: u32 = 14; +pub const __NR_rt_sigreturn: u32 = 15; +pub const __NR_ioctl: u32 = 16; +pub const __NR_pread64: u32 = 17; +pub const __NR_pwrite64: u32 = 18; +pub const __NR_readv: u32 = 19; +pub const __NR_writev: u32 = 20; +pub const __NR_access: u32 = 21; +pub const __NR_pipe: u32 = 22; +pub const __NR_select: u32 = 23; +pub const __NR_sched_yield: u32 = 24; +pub const __NR_mremap: u32 = 25; +pub const __NR_msync: u32 = 26; +pub const __NR_mincore: u32 = 27; +pub const __NR_madvise: u32 = 28; +pub const __NR_shmget: u32 = 29; +pub const __NR_shmat: u32 = 30; +pub const __NR_shmctl: u32 = 31; +pub const __NR_dup: u32 = 32; +pub const __NR_dup2: u32 = 33; +pub const __NR_pause: u32 = 34; +pub const __NR_nanosleep: u32 = 35; +pub const __NR_getitimer: u32 = 36; +pub const __NR_alarm: u32 = 37; +pub const __NR_setitimer: u32 = 38; +pub const __NR_getpid: u32 = 39; +pub const __NR_sendfile: u32 = 40; +pub const __NR_socket: u32 = 41; +pub const __NR_connect: u32 = 42; +pub const __NR_accept: u32 = 43; +pub const __NR_sendto: u32 = 44; +pub const __NR_recvfrom: u32 = 45; +pub const __NR_sendmsg: u32 = 46; +pub const __NR_recvmsg: u32 = 47; +pub const __NR_shutdown: u32 = 48; +pub const __NR_bind: u32 = 49; +pub const __NR_listen: u32 = 50; +pub const __NR_getsockname: u32 = 51; +pub const __NR_getpeername: u32 = 52; +pub const __NR_socketpair: u32 = 53; +pub const __NR_setsockopt: u32 = 54; +pub const __NR_getsockopt: u32 = 55; +pub const __NR_clone: u32 = 56; +pub const __NR_fork: u32 = 57; +pub const __NR_vfork: u32 = 58; +pub const __NR_execve: u32 = 59; +pub const __NR_exit: u32 = 60; +pub const __NR_wait4: u32 = 61; +pub const __NR_kill: u32 = 62; +pub const __NR_uname: u32 = 63; +pub const __NR_semget: u32 = 64; +pub const __NR_semop: u32 = 65; +pub const __NR_semctl: u32 = 66; +pub const __NR_shmdt: u32 = 67; +pub const __NR_msgget: u32 = 68; +pub const __NR_msgsnd: u32 = 69; +pub const __NR_msgrcv: u32 = 70; +pub const __NR_msgctl: u32 = 71; +pub const __NR_fcntl: u32 = 72; +pub const __NR_flock: u32 = 73; +pub const __NR_fsync: u32 = 74; +pub const __NR_fdatasync: u32 = 75; +pub const __NR_truncate: u32 = 76; +pub const __NR_ftruncate: u32 = 77; +pub const __NR_getdents: u32 = 78; +pub const __NR_getcwd: u32 = 79; +pub const __NR_chdir: u32 = 80; +pub const __NR_fchdir: u32 = 81; +pub const __NR_rename: u32 = 82; +pub const __NR_mkdir: u32 = 83; +pub const __NR_rmdir: u32 = 84; +pub const __NR_creat: u32 = 85; +pub const __NR_link: u32 = 86; +pub const __NR_unlink: u32 = 87; +pub const __NR_symlink: u32 = 88; +pub const __NR_readlink: u32 = 89; +pub const __NR_chmod: u32 = 90; +pub const __NR_fchmod: u32 = 91; +pub const __NR_chown: u32 = 92; +pub const __NR_fchown: u32 = 93; +pub const __NR_lchown: u32 = 94; +pub const __NR_umask: u32 = 95; +pub const __NR_gettimeofday: u32 = 96; +pub const __NR_getrlimit: u32 = 97; +pub const __NR_getrusage: u32 = 98; +pub const __NR_sysinfo: u32 = 99; +pub const __NR_times: u32 = 100; +pub const __NR_ptrace: u32 = 101; +pub const __NR_getuid: u32 = 102; +pub const __NR_syslog: u32 = 103; +pub const __NR_getgid: u32 = 104; +pub const __NR_setuid: u32 = 105; +pub const __NR_setgid: u32 = 106; +pub const __NR_geteuid: u32 = 107; +pub const __NR_getegid: u32 = 108; +pub const __NR_setpgid: u32 = 109; +pub const __NR_getppid: u32 = 110; +pub const __NR_getpgrp: u32 = 111; +pub const __NR_setsid: u32 = 112; +pub const __NR_setreuid: u32 = 113; +pub const __NR_setregid: u32 = 114; +pub const __NR_getgroups: u32 = 115; +pub const __NR_setgroups: u32 = 116; +pub const __NR_setresuid: u32 = 117; +pub const __NR_getresuid: u32 = 118; +pub const __NR_setresgid: u32 = 119; +pub const __NR_getresgid: u32 = 120; +pub const __NR_getpgid: u32 = 121; +pub const __NR_setfsuid: u32 = 122; +pub const __NR_setfsgid: u32 = 123; +pub const __NR_getsid: u32 = 124; +pub const __NR_capget: u32 = 125; +pub const __NR_capset: u32 = 126; +pub const __NR_rt_sigpending: u32 = 127; +pub const __NR_rt_sigtimedwait: u32 = 128; +pub const __NR_rt_sigqueueinfo: u32 = 129; +pub const __NR_rt_sigsuspend: u32 = 130; +pub const __NR_sigaltstack: u32 = 131; +pub const __NR_utime: u32 = 132; +pub const __NR_mknod: u32 = 133; +pub const __NR_uselib: u32 = 134; +pub const __NR_personality: u32 = 135; +pub const __NR_ustat: u32 = 136; +pub const __NR_statfs: u32 = 137; +pub const __NR_fstatfs: u32 = 138; +pub const __NR_sysfs: u32 = 139; +pub const __NR_getpriority: u32 = 140; +pub const __NR_setpriority: u32 = 141; +pub const __NR_sched_setparam: u32 = 142; +pub const __NR_sched_getparam: u32 = 143; +pub const __NR_sched_setscheduler: u32 = 144; +pub const __NR_sched_getscheduler: u32 = 145; +pub const __NR_sched_get_priority_max: u32 = 146; +pub const __NR_sched_get_priority_min: u32 = 147; +pub const __NR_sched_rr_get_interval: u32 = 148; +pub const __NR_mlock: u32 = 149; +pub const __NR_munlock: u32 = 150; +pub const __NR_mlockall: u32 = 151; +pub const __NR_munlockall: u32 = 152; +pub const __NR_vhangup: u32 = 153; +pub const __NR_modify_ldt: u32 = 154; +pub const __NR_pivot_root: u32 = 155; +pub const __NR__sysctl: u32 = 156; +pub const __NR_prctl: u32 = 157; +pub const __NR_arch_prctl: u32 = 158; +pub const __NR_adjtimex: u32 = 159; +pub const __NR_setrlimit: u32 = 160; +pub const __NR_chroot: u32 = 161; +pub const __NR_sync: u32 = 162; +pub const __NR_acct: u32 = 163; +pub const __NR_settimeofday: u32 = 164; +pub const __NR_mount: u32 = 165; +pub const __NR_umount2: u32 = 166; +pub const __NR_swapon: u32 = 167; +pub const __NR_swapoff: u32 = 168; +pub const __NR_reboot: u32 = 169; +pub const __NR_sethostname: u32 = 170; +pub const __NR_setdomainname: u32 = 171; +pub const __NR_iopl: u32 = 172; +pub const __NR_ioperm: u32 = 173; +pub const __NR_create_module: u32 = 174; +pub const __NR_init_module: u32 = 175; +pub const __NR_delete_module: u32 = 176; +pub const __NR_get_kernel_syms: u32 = 177; +pub const __NR_query_module: u32 = 178; +pub const __NR_quotactl: u32 = 179; +pub const __NR_nfsservctl: u32 = 180; +pub const __NR_getpmsg: u32 = 181; +pub const __NR_putpmsg: u32 = 182; +pub const __NR_afs_syscall: u32 = 183; +pub const __NR_tuxcall: u32 = 184; +pub const __NR_security: u32 = 185; +pub const __NR_gettid: u32 = 186; +pub const __NR_readahead: u32 = 187; +pub const __NR_setxattr: u32 = 188; +pub const __NR_lsetxattr: u32 = 189; +pub const __NR_fsetxattr: u32 = 190; +pub const __NR_getxattr: u32 = 191; +pub const __NR_lgetxattr: u32 = 192; +pub const __NR_fgetxattr: u32 = 193; +pub const __NR_listxattr: u32 = 194; +pub const __NR_llistxattr: u32 = 195; +pub const __NR_flistxattr: u32 = 196; +pub const __NR_removexattr: u32 = 197; +pub const __NR_lremovexattr: u32 = 198; +pub const __NR_fremovexattr: u32 = 199; +pub const __NR_tkill: u32 = 200; +pub const __NR_time: u32 = 201; +pub const __NR_futex: u32 = 202; +pub const __NR_sched_setaffinity: u32 = 203; +pub const __NR_sched_getaffinity: u32 = 204; +pub const __NR_set_thread_area: u32 = 205; +pub const __NR_io_setup: u32 = 206; +pub const __NR_io_destroy: u32 = 207; +pub const __NR_io_getevents: u32 = 208; +pub const __NR_io_submit: u32 = 209; +pub const __NR_io_cancel: u32 = 210; +pub const __NR_get_thread_area: u32 = 211; +pub const __NR_lookup_dcookie: u32 = 212; +pub const __NR_epoll_create: u32 = 213; +pub const __NR_epoll_ctl_old: u32 = 214; +pub const __NR_epoll_wait_old: u32 = 215; +pub const __NR_remap_file_pages: u32 = 216; +pub const __NR_getdents64: u32 = 217; +pub const __NR_set_tid_address: u32 = 218; +pub const __NR_restart_syscall: u32 = 219; +pub const __NR_semtimedop: u32 = 220; +pub const __NR_fadvise64: u32 = 221; +pub const __NR_timer_create: u32 = 222; +pub const __NR_timer_settime: u32 = 223; +pub const __NR_timer_gettime: u32 = 224; +pub const __NR_timer_getoverrun: u32 = 225; +pub const __NR_timer_delete: u32 = 226; +pub const __NR_clock_settime: u32 = 227; +pub const __NR_clock_gettime: u32 = 228; +pub const __NR_clock_getres: u32 = 229; +pub const __NR_clock_nanosleep: u32 = 230; +pub const __NR_exit_group: u32 = 231; +pub const __NR_epoll_wait: u32 = 232; +pub const __NR_epoll_ctl: u32 = 233; +pub const __NR_tgkill: u32 = 234; +pub const __NR_utimes: u32 = 235; +pub const __NR_vserver: u32 = 236; +pub const __NR_mbind: u32 = 237; +pub const __NR_set_mempolicy: u32 = 238; +pub const __NR_get_mempolicy: u32 = 239; +pub const __NR_mq_open: u32 = 240; +pub const __NR_mq_unlink: u32 = 241; +pub const __NR_mq_timedsend: u32 = 242; +pub const __NR_mq_timedreceive: u32 = 243; +pub const __NR_mq_notify: u32 = 244; +pub const __NR_mq_getsetattr: u32 = 245; +pub const __NR_kexec_load: u32 = 246; +pub const __NR_waitid: u32 = 247; +pub const __NR_add_key: u32 = 248; +pub const __NR_request_key: u32 = 249; +pub const __NR_keyctl: u32 = 250; +pub const __NR_ioprio_set: u32 = 251; +pub const __NR_ioprio_get: u32 = 252; +pub const __NR_inotify_init: u32 = 253; +pub const __NR_inotify_add_watch: u32 = 254; +pub const __NR_inotify_rm_watch: u32 = 255; +pub const __NR_migrate_pages: u32 = 256; +pub const __NR_openat: u32 = 257; +pub const __NR_mkdirat: u32 = 258; +pub const __NR_mknodat: u32 = 259; +pub const __NR_fchownat: u32 = 260; +pub const __NR_futimesat: u32 = 261; +pub const __NR_newfstatat: u32 = 262; +pub const __NR_unlinkat: u32 = 263; +pub const __NR_renameat: u32 = 264; +pub const __NR_linkat: u32 = 265; +pub const __NR_symlinkat: u32 = 266; +pub const __NR_readlinkat: u32 = 267; +pub const __NR_fchmodat: u32 = 268; +pub const __NR_faccessat: u32 = 269; +pub const __NR_pselect6: u32 = 270; +pub const __NR_ppoll: u32 = 271; +pub const __NR_unshare: u32 = 272; +pub const __NR_set_robust_list: u32 = 273; +pub const __NR_get_robust_list: u32 = 274; +pub const __NR_splice: u32 = 275; +pub const __NR_tee: u32 = 276; +pub const __NR_sync_file_range: u32 = 277; +pub const __NR_vmsplice: u32 = 278; +pub const __NR_move_pages: u32 = 279; +pub const __NR_utimensat: u32 = 280; +pub const __NR_epoll_pwait: u32 = 281; +pub const __NR_signalfd: u32 = 282; +pub const __NR_timerfd_create: u32 = 283; +pub const __NR_eventfd: u32 = 284; +pub const __NR_fallocate: u32 = 285; +pub const __NR_timerfd_settime: u32 = 286; +pub const __NR_timerfd_gettime: u32 = 287; +pub const __NR_accept4: u32 = 288; +pub const __NR_signalfd4: u32 = 289; +pub const __NR_eventfd2: u32 = 290; +pub const __NR_epoll_create1: u32 = 291; +pub const __NR_dup3: u32 = 292; +pub const __NR_pipe2: u32 = 293; +pub const __NR_inotify_init1: u32 = 294; +pub const __NR_preadv: u32 = 295; +pub const __NR_pwritev: u32 = 296; +pub const __NR_rt_tgsigqueueinfo: u32 = 297; +pub const __NR_perf_event_open: u32 = 298; +pub const __NR_recvmmsg: u32 = 299; +pub const __NR_fanotify_init: u32 = 300; +pub const __NR_fanotify_mark: u32 = 301; +pub const __NR_prlimit64: u32 = 302; +pub const __NR_name_to_handle_at: u32 = 303; +pub const __NR_open_by_handle_at: u32 = 304; +pub const __NR_clock_adjtime: u32 = 305; +pub const __NR_syncfs: u32 = 306; +pub const __NR_sendmmsg: u32 = 307; +pub const __NR_setns: u32 = 308; +pub const __NR_getcpu: u32 = 309; +pub const __NR_process_vm_readv: u32 = 310; +pub const __NR_process_vm_writev: u32 = 311; +pub const __NR_kcmp: u32 = 312; +pub const __NR_finit_module: u32 = 313; +pub const __NR_sched_setattr: u32 = 314; +pub const __NR_sched_getattr: u32 = 315; +pub const __NR_renameat2: u32 = 316; +pub const __NR_seccomp: u32 = 317; +pub const __NR_getrandom: u32 = 318; +pub const __NR_memfd_create: u32 = 319; +pub const __NR_kexec_file_load: u32 = 320; +pub const __NR_bpf: u32 = 321; +pub const __NR_execveat: u32 = 322; +pub const __NR_userfaultfd: u32 = 323; +pub const __NR_membarrier: u32 = 324; +pub const __NR_mlock2: u32 = 325; +pub const __NR_copy_file_range: u32 = 326; +pub const __NR_preadv2: u32 = 327; +pub const __NR_pwritev2: u32 = 328; +pub const __NR_pkey_mprotect: u32 = 329; +pub const __NR_pkey_alloc: u32 = 330; +pub const __NR_pkey_free: u32 = 331; +pub const __NR_statx: u32 = 332; +pub const __NR_io_pgetevents: u32 = 333; +pub const __NR_rseq: u32 = 334; +pub const __NR_pidfd_send_signal: u32 = 424; +pub const __NR_io_uring_setup: u32 = 425; +pub const __NR_io_uring_enter: u32 = 426; +pub const __NR_io_uring_register: u32 = 427; +pub const __NR_open_tree: u32 = 428; +pub const __NR_move_mount: u32 = 429; +pub const __NR_fsopen: u32 = 430; +pub const __NR_fsconfig: u32 = 431; +pub const __NR_fsmount: u32 = 432; +pub const __NR_fspick: u32 = 433; +pub const __NR_pidfd_open: u32 = 434; +pub const __NR_clone3: u32 = 435; +pub const __NR_openat2: u32 = 437; +pub const __NR_pidfd_getfd: u32 = 438; +pub type __s8 = ::std::os::raw::c_schar; +pub type __u8 = ::std::os::raw::c_uchar; +pub type __s16 = ::std::os::raw::c_short; +pub type __u16 = ::std::os::raw::c_ushort; +pub type __s32 = ::std::os::raw::c_int; +pub type __u32 = ::std::os::raw::c_uint; +pub type __s64 = ::std::os::raw::c_longlong; +pub type __u64 = ::std::os::raw::c_ulonglong; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct __kernel_fd_set { + pub fds_bits: [::std::os::raw::c_ulong; 16usize], +} +#[test] +fn bindgen_test_layout___kernel_fd_set() { + assert_eq!( + ::std::mem::size_of::<__kernel_fd_set>(), + 128usize, + concat!("Size of: ", stringify!(__kernel_fd_set)) + ); + assert_eq!( + ::std::mem::align_of::<__kernel_fd_set>(), + 8usize, + concat!("Alignment of ", stringify!(__kernel_fd_set)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::<__kernel_fd_set>())).fds_bits as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(__kernel_fd_set), + "::", + stringify!(fds_bits) + ) + ); +} +pub type __kernel_sighandler_t = + ::std::option::Option; +pub type __kernel_key_t = ::std::os::raw::c_int; +pub type __kernel_mqd_t = ::std::os::raw::c_int; +pub type __kernel_old_uid_t = ::std::os::raw::c_ushort; +pub type __kernel_old_gid_t = ::std::os::raw::c_ushort; +pub type __kernel_old_dev_t = ::std::os::raw::c_ulong; +pub type __kernel_long_t = ::std::os::raw::c_long; +pub type __kernel_ulong_t = ::std::os::raw::c_ulong; +pub type __kernel_ino_t = __kernel_ulong_t; +pub type __kernel_mode_t = ::std::os::raw::c_uint; +pub type __kernel_pid_t = ::std::os::raw::c_int; +pub type __kernel_ipc_pid_t = ::std::os::raw::c_int; +pub type __kernel_uid_t = ::std::os::raw::c_uint; +pub type __kernel_gid_t = ::std::os::raw::c_uint; +pub type __kernel_suseconds_t = __kernel_long_t; +pub type __kernel_daddr_t = ::std::os::raw::c_int; +pub type __kernel_uid32_t = ::std::os::raw::c_uint; +pub type __kernel_gid32_t = ::std::os::raw::c_uint; +pub type __kernel_size_t = __kernel_ulong_t; +pub type __kernel_ssize_t = __kernel_long_t; +pub type __kernel_ptrdiff_t = __kernel_long_t; +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct __kernel_fsid_t { + pub val: [::std::os::raw::c_int; 2usize], +} +#[test] +fn bindgen_test_layout___kernel_fsid_t() { + assert_eq!( + ::std::mem::size_of::<__kernel_fsid_t>(), + 8usize, + concat!("Size of: ", stringify!(__kernel_fsid_t)) + ); + assert_eq!( + ::std::mem::align_of::<__kernel_fsid_t>(), + 4usize, + concat!("Alignment of ", stringify!(__kernel_fsid_t)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::<__kernel_fsid_t>())).val as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(__kernel_fsid_t), + "::", + stringify!(val) + ) + ); +} +pub type __kernel_off_t = __kernel_long_t; +pub type __kernel_loff_t = ::std::os::raw::c_longlong; +pub type __kernel_old_time_t = __kernel_long_t; +pub type __kernel_time_t = __kernel_long_t; +pub type __kernel_time64_t = ::std::os::raw::c_longlong; +pub type __kernel_clock_t = __kernel_long_t; +pub type __kernel_timer_t = ::std::os::raw::c_int; +pub type __kernel_clockid_t = ::std::os::raw::c_int; +pub type __kernel_caddr_t = *mut ::std::os::raw::c_char; +pub type __kernel_uid16_t = ::std::os::raw::c_ushort; +pub type __kernel_gid16_t = ::std::os::raw::c_ushort; +pub type __le16 = __u16; +pub type __be16 = __u16; +pub type __le32 = __u32; +pub type __be32 = __u32; +pub type __le64 = __u64; +pub type __be64 = __u64; +pub type __sum16 = __u16; +pub type __wsum = __u32; +pub type __poll_t = ::std::os::raw::c_uint; +pub const perf_type_id_PERF_TYPE_HARDWARE: perf_type_id = 0; +pub const perf_type_id_PERF_TYPE_SOFTWARE: perf_type_id = 1; +pub const perf_type_id_PERF_TYPE_TRACEPOINT: perf_type_id = 2; +pub const perf_type_id_PERF_TYPE_HW_CACHE: perf_type_id = 3; +pub const perf_type_id_PERF_TYPE_RAW: perf_type_id = 4; +pub const perf_type_id_PERF_TYPE_BREAKPOINT: perf_type_id = 5; +pub const perf_type_id_PERF_TYPE_MAX: perf_type_id = 6; +pub type perf_type_id = u32; +pub const perf_hw_id_PERF_COUNT_HW_CPU_CYCLES: perf_hw_id = 0; +pub const perf_hw_id_PERF_COUNT_HW_INSTRUCTIONS: perf_hw_id = 1; +pub const perf_hw_id_PERF_COUNT_HW_CACHE_REFERENCES: perf_hw_id = 2; +pub const perf_hw_id_PERF_COUNT_HW_CACHE_MISSES: perf_hw_id = 3; +pub const perf_hw_id_PERF_COUNT_HW_BRANCH_INSTRUCTIONS: perf_hw_id = 4; +pub const perf_hw_id_PERF_COUNT_HW_BRANCH_MISSES: perf_hw_id = 5; +pub const perf_hw_id_PERF_COUNT_HW_BUS_CYCLES: perf_hw_id = 6; +pub const perf_hw_id_PERF_COUNT_HW_STALLED_CYCLES_FRONTEND: perf_hw_id = 7; +pub const perf_hw_id_PERF_COUNT_HW_STALLED_CYCLES_BACKEND: perf_hw_id = 8; +pub const perf_hw_id_PERF_COUNT_HW_REF_CPU_CYCLES: perf_hw_id = 9; +pub const perf_hw_id_PERF_COUNT_HW_MAX: perf_hw_id = 10; +pub type perf_hw_id = u32; +pub const perf_hw_cache_id_PERF_COUNT_HW_CACHE_L1D: perf_hw_cache_id = 0; +pub const perf_hw_cache_id_PERF_COUNT_HW_CACHE_L1I: perf_hw_cache_id = 1; +pub const perf_hw_cache_id_PERF_COUNT_HW_CACHE_LL: perf_hw_cache_id = 2; +pub const perf_hw_cache_id_PERF_COUNT_HW_CACHE_DTLB: perf_hw_cache_id = 3; +pub const perf_hw_cache_id_PERF_COUNT_HW_CACHE_ITLB: perf_hw_cache_id = 4; +pub const perf_hw_cache_id_PERF_COUNT_HW_CACHE_BPU: perf_hw_cache_id = 5; +pub const perf_hw_cache_id_PERF_COUNT_HW_CACHE_NODE: perf_hw_cache_id = 6; +pub const perf_hw_cache_id_PERF_COUNT_HW_CACHE_MAX: perf_hw_cache_id = 7; +pub type perf_hw_cache_id = u32; +pub const perf_hw_cache_op_id_PERF_COUNT_HW_CACHE_OP_READ: perf_hw_cache_op_id = 0; +pub const perf_hw_cache_op_id_PERF_COUNT_HW_CACHE_OP_WRITE: perf_hw_cache_op_id = 1; +pub const perf_hw_cache_op_id_PERF_COUNT_HW_CACHE_OP_PREFETCH: perf_hw_cache_op_id = 2; +pub const perf_hw_cache_op_id_PERF_COUNT_HW_CACHE_OP_MAX: perf_hw_cache_op_id = 3; +pub type perf_hw_cache_op_id = u32; +pub const perf_hw_cache_op_result_id_PERF_COUNT_HW_CACHE_RESULT_ACCESS: perf_hw_cache_op_result_id = + 0; +pub const perf_hw_cache_op_result_id_PERF_COUNT_HW_CACHE_RESULT_MISS: perf_hw_cache_op_result_id = + 1; +pub const perf_hw_cache_op_result_id_PERF_COUNT_HW_CACHE_RESULT_MAX: perf_hw_cache_op_result_id = 2; +pub type perf_hw_cache_op_result_id = u32; +pub const perf_sw_ids_PERF_COUNT_SW_CPU_CLOCK: perf_sw_ids = 0; +pub const perf_sw_ids_PERF_COUNT_SW_TASK_CLOCK: perf_sw_ids = 1; +pub const perf_sw_ids_PERF_COUNT_SW_PAGE_FAULTS: perf_sw_ids = 2; +pub const perf_sw_ids_PERF_COUNT_SW_CONTEXT_SWITCHES: perf_sw_ids = 3; +pub const perf_sw_ids_PERF_COUNT_SW_CPU_MIGRATIONS: perf_sw_ids = 4; +pub const perf_sw_ids_PERF_COUNT_SW_PAGE_FAULTS_MIN: perf_sw_ids = 5; +pub const perf_sw_ids_PERF_COUNT_SW_PAGE_FAULTS_MAJ: perf_sw_ids = 6; +pub const perf_sw_ids_PERF_COUNT_SW_ALIGNMENT_FAULTS: perf_sw_ids = 7; +pub const perf_sw_ids_PERF_COUNT_SW_EMULATION_FAULTS: perf_sw_ids = 8; +pub const perf_sw_ids_PERF_COUNT_SW_DUMMY: perf_sw_ids = 9; +pub const perf_sw_ids_PERF_COUNT_SW_BPF_OUTPUT: perf_sw_ids = 10; +pub const perf_sw_ids_PERF_COUNT_SW_MAX: perf_sw_ids = 11; +pub type perf_sw_ids = u32; +pub const perf_event_sample_format_PERF_SAMPLE_IP: perf_event_sample_format = 1; +pub const perf_event_sample_format_PERF_SAMPLE_TID: perf_event_sample_format = 2; +pub const perf_event_sample_format_PERF_SAMPLE_TIME: perf_event_sample_format = 4; +pub const perf_event_sample_format_PERF_SAMPLE_ADDR: perf_event_sample_format = 8; +pub const perf_event_sample_format_PERF_SAMPLE_READ: perf_event_sample_format = 16; +pub const perf_event_sample_format_PERF_SAMPLE_CALLCHAIN: perf_event_sample_format = 32; +pub const perf_event_sample_format_PERF_SAMPLE_ID: perf_event_sample_format = 64; +pub const perf_event_sample_format_PERF_SAMPLE_CPU: perf_event_sample_format = 128; +pub const perf_event_sample_format_PERF_SAMPLE_PERIOD: perf_event_sample_format = 256; +pub const perf_event_sample_format_PERF_SAMPLE_STREAM_ID: perf_event_sample_format = 512; +pub const perf_event_sample_format_PERF_SAMPLE_RAW: perf_event_sample_format = 1024; +pub const perf_event_sample_format_PERF_SAMPLE_BRANCH_STACK: perf_event_sample_format = 2048; +pub const perf_event_sample_format_PERF_SAMPLE_REGS_USER: perf_event_sample_format = 4096; +pub const perf_event_sample_format_PERF_SAMPLE_STACK_USER: perf_event_sample_format = 8192; +pub const perf_event_sample_format_PERF_SAMPLE_WEIGHT: perf_event_sample_format = 16384; +pub const perf_event_sample_format_PERF_SAMPLE_DATA_SRC: perf_event_sample_format = 32768; +pub const perf_event_sample_format_PERF_SAMPLE_IDENTIFIER: perf_event_sample_format = 65536; +pub const perf_event_sample_format_PERF_SAMPLE_TRANSACTION: perf_event_sample_format = 131072; +pub const perf_event_sample_format_PERF_SAMPLE_REGS_INTR: perf_event_sample_format = 262144; +pub const perf_event_sample_format_PERF_SAMPLE_PHYS_ADDR: perf_event_sample_format = 524288; +pub const perf_event_sample_format_PERF_SAMPLE_AUX: perf_event_sample_format = 1048576; +pub const perf_event_sample_format_PERF_SAMPLE_MAX: perf_event_sample_format = 2097152; +pub const perf_event_sample_format___PERF_SAMPLE_CALLCHAIN_EARLY: perf_event_sample_format = + 9223372036854775808; +pub type perf_event_sample_format = u64; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_USER_SHIFT: + perf_branch_sample_type_shift = 0; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_KERNEL_SHIFT: + perf_branch_sample_type_shift = 1; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_HV_SHIFT: perf_branch_sample_type_shift = + 2; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_ANY_SHIFT: + perf_branch_sample_type_shift = 3; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_ANY_CALL_SHIFT: + perf_branch_sample_type_shift = 4; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_ANY_RETURN_SHIFT: + perf_branch_sample_type_shift = 5; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_IND_CALL_SHIFT: + perf_branch_sample_type_shift = 6; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_ABORT_TX_SHIFT: + perf_branch_sample_type_shift = 7; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_IN_TX_SHIFT: + perf_branch_sample_type_shift = 8; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_NO_TX_SHIFT: + perf_branch_sample_type_shift = 9; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_COND_SHIFT: + perf_branch_sample_type_shift = 10; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_CALL_STACK_SHIFT: + perf_branch_sample_type_shift = 11; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_IND_JUMP_SHIFT: + perf_branch_sample_type_shift = 12; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_CALL_SHIFT: + perf_branch_sample_type_shift = 13; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_NO_FLAGS_SHIFT: + perf_branch_sample_type_shift = 14; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_NO_CYCLES_SHIFT: + perf_branch_sample_type_shift = 15; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_TYPE_SAVE_SHIFT: + perf_branch_sample_type_shift = 16; +pub const perf_branch_sample_type_shift_PERF_SAMPLE_BRANCH_MAX_SHIFT: + perf_branch_sample_type_shift = 17; +pub type perf_branch_sample_type_shift = u32; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_USER: perf_branch_sample_type = 1; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_KERNEL: perf_branch_sample_type = 2; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_HV: perf_branch_sample_type = 4; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_ANY: perf_branch_sample_type = 8; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_ANY_CALL: perf_branch_sample_type = 16; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_ANY_RETURN: perf_branch_sample_type = 32; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_IND_CALL: perf_branch_sample_type = 64; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_ABORT_TX: perf_branch_sample_type = 128; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_IN_TX: perf_branch_sample_type = 256; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_NO_TX: perf_branch_sample_type = 512; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_COND: perf_branch_sample_type = 1024; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_CALL_STACK: perf_branch_sample_type = 2048; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_IND_JUMP: perf_branch_sample_type = 4096; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_CALL: perf_branch_sample_type = 8192; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_NO_FLAGS: perf_branch_sample_type = 16384; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_NO_CYCLES: perf_branch_sample_type = 32768; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_TYPE_SAVE: perf_branch_sample_type = 65536; +pub const perf_branch_sample_type_PERF_SAMPLE_BRANCH_MAX: perf_branch_sample_type = 131072; +pub type perf_branch_sample_type = u32; +pub const PERF_BR_UNKNOWN: _bindgen_ty_1 = 0; +pub const PERF_BR_COND: _bindgen_ty_1 = 1; +pub const PERF_BR_UNCOND: _bindgen_ty_1 = 2; +pub const PERF_BR_IND: _bindgen_ty_1 = 3; +pub const PERF_BR_CALL: _bindgen_ty_1 = 4; +pub const PERF_BR_IND_CALL: _bindgen_ty_1 = 5; +pub const PERF_BR_RET: _bindgen_ty_1 = 6; +pub const PERF_BR_SYSCALL: _bindgen_ty_1 = 7; +pub const PERF_BR_SYSRET: _bindgen_ty_1 = 8; +pub const PERF_BR_COND_CALL: _bindgen_ty_1 = 9; +pub const PERF_BR_COND_RET: _bindgen_ty_1 = 10; +pub const PERF_BR_MAX: _bindgen_ty_1 = 11; +pub type _bindgen_ty_1 = u32; +pub const perf_sample_regs_abi_PERF_SAMPLE_REGS_ABI_NONE: perf_sample_regs_abi = 0; +pub const perf_sample_regs_abi_PERF_SAMPLE_REGS_ABI_32: perf_sample_regs_abi = 1; +pub const perf_sample_regs_abi_PERF_SAMPLE_REGS_ABI_64: perf_sample_regs_abi = 2; +pub type perf_sample_regs_abi = u32; +pub const PERF_TXN_ELISION: _bindgen_ty_2 = 1; +pub const PERF_TXN_TRANSACTION: _bindgen_ty_2 = 2; +pub const PERF_TXN_SYNC: _bindgen_ty_2 = 4; +pub const PERF_TXN_ASYNC: _bindgen_ty_2 = 8; +pub const PERF_TXN_RETRY: _bindgen_ty_2 = 16; +pub const PERF_TXN_CONFLICT: _bindgen_ty_2 = 32; +pub const PERF_TXN_CAPACITY_WRITE: _bindgen_ty_2 = 64; +pub const PERF_TXN_CAPACITY_READ: _bindgen_ty_2 = 128; +pub const PERF_TXN_MAX: _bindgen_ty_2 = 256; +pub const PERF_TXN_ABORT_MASK: _bindgen_ty_2 = 18446744069414584320; +pub const PERF_TXN_ABORT_SHIFT: _bindgen_ty_2 = 32; +pub type _bindgen_ty_2 = u64; +pub const perf_event_read_format_PERF_FORMAT_TOTAL_TIME_ENABLED: perf_event_read_format = 1; +pub const perf_event_read_format_PERF_FORMAT_TOTAL_TIME_RUNNING: perf_event_read_format = 2; +pub const perf_event_read_format_PERF_FORMAT_ID: perf_event_read_format = 4; +pub const perf_event_read_format_PERF_FORMAT_GROUP: perf_event_read_format = 8; +pub const perf_event_read_format_PERF_FORMAT_MAX: perf_event_read_format = 16; +pub type perf_event_read_format = u32; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct perf_event_attr { + pub type_: __u32, + pub size: __u32, + pub config: __u64, + pub __bindgen_anon_1: perf_event_attr__bindgen_ty_1, + pub sample_type: __u64, + pub read_format: __u64, + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize], u32>, + pub __bindgen_anon_2: perf_event_attr__bindgen_ty_2, + pub bp_type: __u32, + pub __bindgen_anon_3: perf_event_attr__bindgen_ty_3, + pub __bindgen_anon_4: perf_event_attr__bindgen_ty_4, + pub branch_sample_type: __u64, + pub sample_regs_user: __u64, + pub sample_stack_user: __u32, + pub clockid: __s32, + pub sample_regs_intr: __u64, + pub aux_watermark: __u32, + pub sample_max_stack: __u16, + pub __reserved_2: __u16, + pub aux_sample_size: __u32, + pub __reserved_3: __u32, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union perf_event_attr__bindgen_ty_1 { + pub sample_period: __u64, + pub sample_freq: __u64, + _bindgen_union_align: u64, +} +#[test] +fn bindgen_test_layout_perf_event_attr__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(perf_event_attr__bindgen_ty_1)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(perf_event_attr__bindgen_ty_1)) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).sample_period as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr__bindgen_ty_1), + "::", + stringify!(sample_period) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).sample_freq as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr__bindgen_ty_1), + "::", + stringify!(sample_freq) + ) + ); +} +impl Default for perf_event_attr__bindgen_ty_1 { + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union perf_event_attr__bindgen_ty_2 { + pub wakeup_events: __u32, + pub wakeup_watermark: __u32, + _bindgen_union_align: u32, +} +#[test] +fn bindgen_test_layout_perf_event_attr__bindgen_ty_2() { + assert_eq!( + ::std::mem::size_of::(), + 4usize, + concat!("Size of: ", stringify!(perf_event_attr__bindgen_ty_2)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(perf_event_attr__bindgen_ty_2)) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).wakeup_events as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr__bindgen_ty_2), + "::", + stringify!(wakeup_events) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).wakeup_watermark as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr__bindgen_ty_2), + "::", + stringify!(wakeup_watermark) + ) + ); +} +impl Default for perf_event_attr__bindgen_ty_2 { + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union perf_event_attr__bindgen_ty_3 { + pub bp_addr: __u64, + pub kprobe_func: __u64, + pub uprobe_path: __u64, + pub config1: __u64, + _bindgen_union_align: u64, +} +#[test] +fn bindgen_test_layout_perf_event_attr__bindgen_ty_3() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(perf_event_attr__bindgen_ty_3)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(perf_event_attr__bindgen_ty_3)) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).bp_addr as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr__bindgen_ty_3), + "::", + stringify!(bp_addr) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).kprobe_func as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr__bindgen_ty_3), + "::", + stringify!(kprobe_func) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).uprobe_path as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr__bindgen_ty_3), + "::", + stringify!(uprobe_path) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).config1 as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr__bindgen_ty_3), + "::", + stringify!(config1) + ) + ); +} +impl Default for perf_event_attr__bindgen_ty_3 { + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union perf_event_attr__bindgen_ty_4 { + pub bp_len: __u64, + pub kprobe_addr: __u64, + pub probe_offset: __u64, + pub config2: __u64, + _bindgen_union_align: u64, +} +#[test] +fn bindgen_test_layout_perf_event_attr__bindgen_ty_4() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(perf_event_attr__bindgen_ty_4)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(perf_event_attr__bindgen_ty_4)) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).bp_len as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr__bindgen_ty_4), + "::", + stringify!(bp_len) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).kprobe_addr as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr__bindgen_ty_4), + "::", + stringify!(kprobe_addr) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).probe_offset as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr__bindgen_ty_4), + "::", + stringify!(probe_offset) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).config2 as *const _ as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr__bindgen_ty_4), + "::", + stringify!(config2) + ) + ); +} +impl Default for perf_event_attr__bindgen_ty_4 { + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } +} +#[test] +fn bindgen_test_layout_perf_event_attr() { + assert_eq!( + ::std::mem::size_of::(), + 120usize, + concat!("Size of: ", stringify!(perf_event_attr)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(perf_event_attr)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(type_) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).size as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(size) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).config as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(config) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).sample_type as *const _ as usize }, + 24usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(sample_type) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).read_format as *const _ as usize }, + 32usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(read_format) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).bp_type as *const _ as usize }, + 52usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(bp_type) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).branch_sample_type as *const _ as usize + }, + 72usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(branch_sample_type) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).sample_regs_user as *const _ as usize + }, + 80usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(sample_regs_user) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).sample_stack_user as *const _ as usize + }, + 88usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(sample_stack_user) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).clockid as *const _ as usize }, + 92usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(clockid) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).sample_regs_intr as *const _ as usize + }, + 96usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(sample_regs_intr) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).aux_watermark as *const _ as usize }, + 104usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(aux_watermark) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).sample_max_stack as *const _ as usize + }, + 108usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(sample_max_stack) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).__reserved_2 as *const _ as usize }, + 110usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(__reserved_2) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).aux_sample_size as *const _ as usize }, + 112usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(aux_sample_size) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).__reserved_3 as *const _ as usize }, + 116usize, + concat!( + "Offset of field: ", + stringify!(perf_event_attr), + "::", + stringify!(__reserved_3) + ) + ); +} +impl Default for perf_event_attr { + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } +} +impl perf_event_attr { + #[inline] + pub fn disabled(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u64) } + } + #[inline] + pub fn set_disabled(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn inherit(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u64) } + } + #[inline] + pub fn set_inherit(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn pinned(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u64) } + } + #[inline] + pub fn set_pinned(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn exclusive(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u64) } + } + #[inline] + pub fn set_exclusive(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn exclude_user(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u64) } + } + #[inline] + pub fn set_exclude_user(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(4usize, 1u8, val as u64) + } + } + #[inline] + pub fn exclude_kernel(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(5usize, 1u8) as u64) } + } + #[inline] + pub fn set_exclude_kernel(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(5usize, 1u8, val as u64) + } + } + #[inline] + pub fn exclude_hv(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(6usize, 1u8) as u64) } + } + #[inline] + pub fn set_exclude_hv(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(6usize, 1u8, val as u64) + } + } + #[inline] + pub fn exclude_idle(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(7usize, 1u8) as u64) } + } + #[inline] + pub fn set_exclude_idle(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(7usize, 1u8, val as u64) + } + } + #[inline] + pub fn mmap(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(8usize, 1u8) as u64) } + } + #[inline] + pub fn set_mmap(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(8usize, 1u8, val as u64) + } + } + #[inline] + pub fn comm(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(9usize, 1u8) as u64) } + } + #[inline] + pub fn set_comm(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(9usize, 1u8, val as u64) + } + } + #[inline] + pub fn freq(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(10usize, 1u8) as u64) } + } + #[inline] + pub fn set_freq(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(10usize, 1u8, val as u64) + } + } + #[inline] + pub fn inherit_stat(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(11usize, 1u8) as u64) } + } + #[inline] + pub fn set_inherit_stat(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(11usize, 1u8, val as u64) + } + } + #[inline] + pub fn enable_on_exec(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(12usize, 1u8) as u64) } + } + #[inline] + pub fn set_enable_on_exec(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(12usize, 1u8, val as u64) + } + } + #[inline] + pub fn task(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(13usize, 1u8) as u64) } + } + #[inline] + pub fn set_task(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(13usize, 1u8, val as u64) + } + } + #[inline] + pub fn watermark(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(14usize, 1u8) as u64) } + } + #[inline] + pub fn set_watermark(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(14usize, 1u8, val as u64) + } + } + #[inline] + pub fn precise_ip(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(15usize, 2u8) as u64) } + } + #[inline] + pub fn set_precise_ip(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(15usize, 2u8, val as u64) + } + } + #[inline] + pub fn mmap_data(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(17usize, 1u8) as u64) } + } + #[inline] + pub fn set_mmap_data(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(17usize, 1u8, val as u64) + } + } + #[inline] + pub fn sample_id_all(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(18usize, 1u8) as u64) } + } + #[inline] + pub fn set_sample_id_all(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(18usize, 1u8, val as u64) + } + } + #[inline] + pub fn exclude_host(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(19usize, 1u8) as u64) } + } + #[inline] + pub fn set_exclude_host(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(19usize, 1u8, val as u64) + } + } + #[inline] + pub fn exclude_guest(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(20usize, 1u8) as u64) } + } + #[inline] + pub fn set_exclude_guest(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(20usize, 1u8, val as u64) + } + } + #[inline] + pub fn exclude_callchain_kernel(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(21usize, 1u8) as u64) } + } + #[inline] + pub fn set_exclude_callchain_kernel(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(21usize, 1u8, val as u64) + } + } + #[inline] + pub fn exclude_callchain_user(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(22usize, 1u8) as u64) } + } + #[inline] + pub fn set_exclude_callchain_user(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(22usize, 1u8, val as u64) + } + } + #[inline] + pub fn mmap2(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(23usize, 1u8) as u64) } + } + #[inline] + pub fn set_mmap2(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(23usize, 1u8, val as u64) + } + } + #[inline] + pub fn comm_exec(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(24usize, 1u8) as u64) } + } + #[inline] + pub fn set_comm_exec(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(24usize, 1u8, val as u64) + } + } + #[inline] + pub fn use_clockid(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(25usize, 1u8) as u64) } + } + #[inline] + pub fn set_use_clockid(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(25usize, 1u8, val as u64) + } + } + #[inline] + pub fn context_switch(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(26usize, 1u8) as u64) } + } + #[inline] + pub fn set_context_switch(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(26usize, 1u8, val as u64) + } + } + #[inline] + pub fn write_backward(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(27usize, 1u8) as u64) } + } + #[inline] + pub fn set_write_backward(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(27usize, 1u8, val as u64) + } + } + #[inline] + pub fn namespaces(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(28usize, 1u8) as u64) } + } + #[inline] + pub fn set_namespaces(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(28usize, 1u8, val as u64) + } + } + #[inline] + pub fn ksymbol(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(29usize, 1u8) as u64) } + } + #[inline] + pub fn set_ksymbol(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(29usize, 1u8, val as u64) + } + } + #[inline] + pub fn bpf_event(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(30usize, 1u8) as u64) } + } + #[inline] + pub fn set_bpf_event(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(30usize, 1u8, val as u64) + } + } + #[inline] + pub fn aux_output(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(31usize, 1u8) as u64) } + } + #[inline] + pub fn set_aux_output(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(31usize, 1u8, val as u64) + } + } + #[inline] + pub fn __reserved_1(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(32usize, 32u8) as u64) } + } + #[inline] + pub fn set___reserved_1(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(32usize, 32u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + disabled: __u64, + inherit: __u64, + pinned: __u64, + exclusive: __u64, + exclude_user: __u64, + exclude_kernel: __u64, + exclude_hv: __u64, + exclude_idle: __u64, + mmap: __u64, + comm: __u64, + freq: __u64, + inherit_stat: __u64, + enable_on_exec: __u64, + task: __u64, + watermark: __u64, + precise_ip: __u64, + mmap_data: __u64, + sample_id_all: __u64, + exclude_host: __u64, + exclude_guest: __u64, + exclude_callchain_kernel: __u64, + exclude_callchain_user: __u64, + mmap2: __u64, + comm_exec: __u64, + use_clockid: __u64, + context_switch: __u64, + write_backward: __u64, + namespaces: __u64, + ksymbol: __u64, + bpf_event: __u64, + aux_output: __u64, + __reserved_1: __u64, + ) -> __BindgenBitfieldUnit<[u8; 8usize], u32> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize], u32> = + Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let disabled: u64 = unsafe { ::std::mem::transmute(disabled) }; + disabled as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let inherit: u64 = unsafe { ::std::mem::transmute(inherit) }; + inherit as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let pinned: u64 = unsafe { ::std::mem::transmute(pinned) }; + pinned as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let exclusive: u64 = unsafe { ::std::mem::transmute(exclusive) }; + exclusive as u64 + }); + __bindgen_bitfield_unit.set(4usize, 1u8, { + let exclude_user: u64 = unsafe { ::std::mem::transmute(exclude_user) }; + exclude_user as u64 + }); + __bindgen_bitfield_unit.set(5usize, 1u8, { + let exclude_kernel: u64 = unsafe { ::std::mem::transmute(exclude_kernel) }; + exclude_kernel as u64 + }); + __bindgen_bitfield_unit.set(6usize, 1u8, { + let exclude_hv: u64 = unsafe { ::std::mem::transmute(exclude_hv) }; + exclude_hv as u64 + }); + __bindgen_bitfield_unit.set(7usize, 1u8, { + let exclude_idle: u64 = unsafe { ::std::mem::transmute(exclude_idle) }; + exclude_idle as u64 + }); + __bindgen_bitfield_unit.set(8usize, 1u8, { + let mmap: u64 = unsafe { ::std::mem::transmute(mmap) }; + mmap as u64 + }); + __bindgen_bitfield_unit.set(9usize, 1u8, { + let comm: u64 = unsafe { ::std::mem::transmute(comm) }; + comm as u64 + }); + __bindgen_bitfield_unit.set(10usize, 1u8, { + let freq: u64 = unsafe { ::std::mem::transmute(freq) }; + freq as u64 + }); + __bindgen_bitfield_unit.set(11usize, 1u8, { + let inherit_stat: u64 = unsafe { ::std::mem::transmute(inherit_stat) }; + inherit_stat as u64 + }); + __bindgen_bitfield_unit.set(12usize, 1u8, { + let enable_on_exec: u64 = unsafe { ::std::mem::transmute(enable_on_exec) }; + enable_on_exec as u64 + }); + __bindgen_bitfield_unit.set(13usize, 1u8, { + let task: u64 = unsafe { ::std::mem::transmute(task) }; + task as u64 + }); + __bindgen_bitfield_unit.set(14usize, 1u8, { + let watermark: u64 = unsafe { ::std::mem::transmute(watermark) }; + watermark as u64 + }); + __bindgen_bitfield_unit.set(15usize, 2u8, { + let precise_ip: u64 = unsafe { ::std::mem::transmute(precise_ip) }; + precise_ip as u64 + }); + __bindgen_bitfield_unit.set(17usize, 1u8, { + let mmap_data: u64 = unsafe { ::std::mem::transmute(mmap_data) }; + mmap_data as u64 + }); + __bindgen_bitfield_unit.set(18usize, 1u8, { + let sample_id_all: u64 = unsafe { ::std::mem::transmute(sample_id_all) }; + sample_id_all as u64 + }); + __bindgen_bitfield_unit.set(19usize, 1u8, { + let exclude_host: u64 = unsafe { ::std::mem::transmute(exclude_host) }; + exclude_host as u64 + }); + __bindgen_bitfield_unit.set(20usize, 1u8, { + let exclude_guest: u64 = unsafe { ::std::mem::transmute(exclude_guest) }; + exclude_guest as u64 + }); + __bindgen_bitfield_unit.set(21usize, 1u8, { + let exclude_callchain_kernel: u64 = + unsafe { ::std::mem::transmute(exclude_callchain_kernel) }; + exclude_callchain_kernel as u64 + }); + __bindgen_bitfield_unit.set(22usize, 1u8, { + let exclude_callchain_user: u64 = + unsafe { ::std::mem::transmute(exclude_callchain_user) }; + exclude_callchain_user as u64 + }); + __bindgen_bitfield_unit.set(23usize, 1u8, { + let mmap2: u64 = unsafe { ::std::mem::transmute(mmap2) }; + mmap2 as u64 + }); + __bindgen_bitfield_unit.set(24usize, 1u8, { + let comm_exec: u64 = unsafe { ::std::mem::transmute(comm_exec) }; + comm_exec as u64 + }); + __bindgen_bitfield_unit.set(25usize, 1u8, { + let use_clockid: u64 = unsafe { ::std::mem::transmute(use_clockid) }; + use_clockid as u64 + }); + __bindgen_bitfield_unit.set(26usize, 1u8, { + let context_switch: u64 = unsafe { ::std::mem::transmute(context_switch) }; + context_switch as u64 + }); + __bindgen_bitfield_unit.set(27usize, 1u8, { + let write_backward: u64 = unsafe { ::std::mem::transmute(write_backward) }; + write_backward as u64 + }); + __bindgen_bitfield_unit.set(28usize, 1u8, { + let namespaces: u64 = unsafe { ::std::mem::transmute(namespaces) }; + namespaces as u64 + }); + __bindgen_bitfield_unit.set(29usize, 1u8, { + let ksymbol: u64 = unsafe { ::std::mem::transmute(ksymbol) }; + ksymbol as u64 + }); + __bindgen_bitfield_unit.set(30usize, 1u8, { + let bpf_event: u64 = unsafe { ::std::mem::transmute(bpf_event) }; + bpf_event as u64 + }); + __bindgen_bitfield_unit.set(31usize, 1u8, { + let aux_output: u64 = unsafe { ::std::mem::transmute(aux_output) }; + aux_output as u64 + }); + __bindgen_bitfield_unit.set(32usize, 32u8, { + let __reserved_1: u64 = unsafe { ::std::mem::transmute(__reserved_1) }; + __reserved_1 as u64 + }); + __bindgen_bitfield_unit + } +} +#[repr(C)] +#[derive(Debug, Default)] +pub struct perf_event_query_bpf { + pub ids_len: __u32, + pub prog_cnt: __u32, + pub ids: __IncompleteArrayField<__u32>, +} +#[test] +fn bindgen_test_layout_perf_event_query_bpf() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(perf_event_query_bpf)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(perf_event_query_bpf)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).ids_len as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_query_bpf), + "::", + stringify!(ids_len) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).prog_cnt as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(perf_event_query_bpf), + "::", + stringify!(prog_cnt) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).ids as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(perf_event_query_bpf), + "::", + stringify!(ids) + ) + ); +} +pub const perf_event_ioc_flags_PERF_IOC_FLAG_GROUP: perf_event_ioc_flags = 1; +pub type perf_event_ioc_flags = u32; +#[repr(C)] +#[derive(Copy, Clone)] +pub struct perf_event_mmap_page { + pub version: __u32, + pub compat_version: __u32, + pub lock: __u32, + pub index: __u32, + pub offset: __s64, + pub time_enabled: __u64, + pub time_running: __u64, + pub __bindgen_anon_1: perf_event_mmap_page__bindgen_ty_1, + pub pmc_width: __u16, + pub time_shift: __u16, + pub time_mult: __u32, + pub time_offset: __u64, + pub time_zero: __u64, + pub size: __u32, + pub __reserved: [__u8; 948usize], + pub data_head: __u64, + pub data_tail: __u64, + pub data_offset: __u64, + pub data_size: __u64, + pub aux_head: __u64, + pub aux_tail: __u64, + pub aux_offset: __u64, + pub aux_size: __u64, +} +#[repr(C)] +#[derive(Copy, Clone)] +pub union perf_event_mmap_page__bindgen_ty_1 { + pub capabilities: __u64, + pub __bindgen_anon_1: perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1, + _bindgen_union_align: u64, +} +#[repr(C)] +#[repr(align(8))] +#[derive(Debug, Default, Copy, Clone)] +pub struct perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1 { + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize], u64>, +} +#[test] +fn bindgen_test_layout_perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!( + "Size of: ", + stringify!(perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1) + ) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!( + "Alignment of ", + stringify!(perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1) + ) + ); +} +impl perf_event_mmap_page__bindgen_ty_1__bindgen_ty_1 { + #[inline] + pub fn cap_bit0(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u64) } + } + #[inline] + pub fn set_cap_bit0(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn cap_bit0_is_deprecated(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u64) } + } + #[inline] + pub fn set_cap_bit0_is_deprecated(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn cap_user_rdpmc(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u64) } + } + #[inline] + pub fn set_cap_user_rdpmc(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn cap_user_time(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u64) } + } + #[inline] + pub fn set_cap_user_time(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn cap_user_time_zero(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(4usize, 1u8) as u64) } + } + #[inline] + pub fn set_cap_user_time_zero(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(4usize, 1u8, val as u64) + } + } + #[inline] + pub fn cap_____res(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(5usize, 59u8) as u64) } + } + #[inline] + pub fn set_cap_____res(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(5usize, 59u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + cap_bit0: __u64, + cap_bit0_is_deprecated: __u64, + cap_user_rdpmc: __u64, + cap_user_time: __u64, + cap_user_time_zero: __u64, + cap_____res: __u64, + ) -> __BindgenBitfieldUnit<[u8; 8usize], u64> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize], u64> = + Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let cap_bit0: u64 = unsafe { ::std::mem::transmute(cap_bit0) }; + cap_bit0 as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let cap_bit0_is_deprecated: u64 = + unsafe { ::std::mem::transmute(cap_bit0_is_deprecated) }; + cap_bit0_is_deprecated as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let cap_user_rdpmc: u64 = unsafe { ::std::mem::transmute(cap_user_rdpmc) }; + cap_user_rdpmc as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let cap_user_time: u64 = unsafe { ::std::mem::transmute(cap_user_time) }; + cap_user_time as u64 + }); + __bindgen_bitfield_unit.set(4usize, 1u8, { + let cap_user_time_zero: u64 = unsafe { ::std::mem::transmute(cap_user_time_zero) }; + cap_user_time_zero as u64 + }); + __bindgen_bitfield_unit.set(5usize, 59u8, { + let cap_____res: u64 = unsafe { ::std::mem::transmute(cap_____res) }; + cap_____res as u64 + }); + __bindgen_bitfield_unit + } +} +#[test] +fn bindgen_test_layout_perf_event_mmap_page__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(perf_event_mmap_page__bindgen_ty_1)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!( + "Alignment of ", + stringify!(perf_event_mmap_page__bindgen_ty_1) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).capabilities as *const _ + as usize + }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page__bindgen_ty_1), + "::", + stringify!(capabilities) + ) + ); +} +impl Default for perf_event_mmap_page__bindgen_ty_1 { + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } +} +#[test] +fn bindgen_test_layout_perf_event_mmap_page() { + assert_eq!( + ::std::mem::size_of::(), + 1088usize, + concat!("Size of: ", stringify!(perf_event_mmap_page)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(perf_event_mmap_page)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).version as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(version) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).compat_version as *const _ as usize + }, + 4usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(compat_version) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).lock as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(lock) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).index as *const _ as usize }, + 12usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(index) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).offset as *const _ as usize }, + 16usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(offset) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).time_enabled as *const _ as usize + }, + 24usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(time_enabled) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).time_running as *const _ as usize + }, + 32usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(time_running) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).pmc_width as *const _ as usize }, + 48usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(pmc_width) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).time_shift as *const _ as usize }, + 50usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(time_shift) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).time_mult as *const _ as usize }, + 52usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(time_mult) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).time_offset as *const _ as usize + }, + 56usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(time_offset) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).time_zero as *const _ as usize }, + 64usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(time_zero) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).size as *const _ as usize }, + 72usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(size) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).__reserved as *const _ as usize }, + 76usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(__reserved) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).data_head as *const _ as usize }, + 1024usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(data_head) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).data_tail as *const _ as usize }, + 1032usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(data_tail) + ) + ); + assert_eq!( + unsafe { + &(*(::std::ptr::null::())).data_offset as *const _ as usize + }, + 1040usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(data_offset) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).data_size as *const _ as usize }, + 1048usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(data_size) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).aux_head as *const _ as usize }, + 1056usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(aux_head) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).aux_tail as *const _ as usize }, + 1064usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(aux_tail) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).aux_offset as *const _ as usize }, + 1072usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(aux_offset) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).aux_size as *const _ as usize }, + 1080usize, + concat!( + "Offset of field: ", + stringify!(perf_event_mmap_page), + "::", + stringify!(aux_size) + ) + ); +} +impl Default for perf_event_mmap_page { + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } +} +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct perf_event_header { + pub type_: __u32, + pub misc: __u16, + pub size: __u16, +} +#[test] +fn bindgen_test_layout_perf_event_header() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(perf_event_header)) + ); + assert_eq!( + ::std::mem::align_of::(), + 4usize, + concat!("Alignment of ", stringify!(perf_event_header)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).type_ as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_event_header), + "::", + stringify!(type_) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).misc as *const _ as usize }, + 4usize, + concat!( + "Offset of field: ", + stringify!(perf_event_header), + "::", + stringify!(misc) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).size as *const _ as usize }, + 6usize, + concat!( + "Offset of field: ", + stringify!(perf_event_header), + "::", + stringify!(size) + ) + ); +} +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct perf_ns_link_info { + pub dev: __u64, + pub ino: __u64, +} +#[test] +fn bindgen_test_layout_perf_ns_link_info() { + assert_eq!( + ::std::mem::size_of::(), + 16usize, + concat!("Size of: ", stringify!(perf_ns_link_info)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(perf_ns_link_info)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).dev as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_ns_link_info), + "::", + stringify!(dev) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).ino as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(perf_ns_link_info), + "::", + stringify!(ino) + ) + ); +} +pub const NET_NS_INDEX: _bindgen_ty_3 = 0; +pub const UTS_NS_INDEX: _bindgen_ty_3 = 1; +pub const IPC_NS_INDEX: _bindgen_ty_3 = 2; +pub const PID_NS_INDEX: _bindgen_ty_3 = 3; +pub const USER_NS_INDEX: _bindgen_ty_3 = 4; +pub const MNT_NS_INDEX: _bindgen_ty_3 = 5; +pub const CGROUP_NS_INDEX: _bindgen_ty_3 = 6; +pub const NR_NAMESPACES: _bindgen_ty_3 = 7; +pub type _bindgen_ty_3 = u32; +pub const perf_event_type_PERF_RECORD_MMAP: perf_event_type = 1; +pub const perf_event_type_PERF_RECORD_LOST: perf_event_type = 2; +pub const perf_event_type_PERF_RECORD_COMM: perf_event_type = 3; +pub const perf_event_type_PERF_RECORD_EXIT: perf_event_type = 4; +pub const perf_event_type_PERF_RECORD_THROTTLE: perf_event_type = 5; +pub const perf_event_type_PERF_RECORD_UNTHROTTLE: perf_event_type = 6; +pub const perf_event_type_PERF_RECORD_FORK: perf_event_type = 7; +pub const perf_event_type_PERF_RECORD_READ: perf_event_type = 8; +pub const perf_event_type_PERF_RECORD_SAMPLE: perf_event_type = 9; +pub const perf_event_type_PERF_RECORD_MMAP2: perf_event_type = 10; +pub const perf_event_type_PERF_RECORD_AUX: perf_event_type = 11; +pub const perf_event_type_PERF_RECORD_ITRACE_START: perf_event_type = 12; +pub const perf_event_type_PERF_RECORD_LOST_SAMPLES: perf_event_type = 13; +pub const perf_event_type_PERF_RECORD_SWITCH: perf_event_type = 14; +pub const perf_event_type_PERF_RECORD_SWITCH_CPU_WIDE: perf_event_type = 15; +pub const perf_event_type_PERF_RECORD_NAMESPACES: perf_event_type = 16; +pub const perf_event_type_PERF_RECORD_KSYMBOL: perf_event_type = 17; +pub const perf_event_type_PERF_RECORD_BPF_EVENT: perf_event_type = 18; +pub const perf_event_type_PERF_RECORD_MAX: perf_event_type = 19; +pub type perf_event_type = u32; +pub const perf_record_ksymbol_type_PERF_RECORD_KSYMBOL_TYPE_UNKNOWN: perf_record_ksymbol_type = 0; +pub const perf_record_ksymbol_type_PERF_RECORD_KSYMBOL_TYPE_BPF: perf_record_ksymbol_type = 1; +pub const perf_record_ksymbol_type_PERF_RECORD_KSYMBOL_TYPE_MAX: perf_record_ksymbol_type = 2; +pub type perf_record_ksymbol_type = u32; +pub const perf_bpf_event_type_PERF_BPF_EVENT_UNKNOWN: perf_bpf_event_type = 0; +pub const perf_bpf_event_type_PERF_BPF_EVENT_PROG_LOAD: perf_bpf_event_type = 1; +pub const perf_bpf_event_type_PERF_BPF_EVENT_PROG_UNLOAD: perf_bpf_event_type = 2; +pub const perf_bpf_event_type_PERF_BPF_EVENT_MAX: perf_bpf_event_type = 3; +pub type perf_bpf_event_type = u32; +pub const perf_callchain_context_PERF_CONTEXT_HV: perf_callchain_context = 18446744073709551584; +pub const perf_callchain_context_PERF_CONTEXT_KERNEL: perf_callchain_context = 18446744073709551488; +pub const perf_callchain_context_PERF_CONTEXT_USER: perf_callchain_context = 18446744073709551104; +pub const perf_callchain_context_PERF_CONTEXT_GUEST: perf_callchain_context = 18446744073709549568; +pub const perf_callchain_context_PERF_CONTEXT_GUEST_KERNEL: perf_callchain_context = + 18446744073709549440; +pub const perf_callchain_context_PERF_CONTEXT_GUEST_USER: perf_callchain_context = + 18446744073709549056; +pub const perf_callchain_context_PERF_CONTEXT_MAX: perf_callchain_context = 18446744073709547521; +pub type perf_callchain_context = u64; +#[repr(C)] +#[derive(Copy, Clone)] +pub union perf_mem_data_src { + pub val: __u64, + pub __bindgen_anon_1: perf_mem_data_src__bindgen_ty_1, + _bindgen_union_align: u64, +} +#[repr(C)] +#[repr(align(8))] +#[derive(Debug, Default, Copy, Clone)] +pub struct perf_mem_data_src__bindgen_ty_1 { + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize], u32>, +} +#[test] +fn bindgen_test_layout_perf_mem_data_src__bindgen_ty_1() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(perf_mem_data_src__bindgen_ty_1)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(perf_mem_data_src__bindgen_ty_1)) + ); +} +impl perf_mem_data_src__bindgen_ty_1 { + #[inline] + pub fn mem_op(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(0usize, 5u8) as u64) } + } + #[inline] + pub fn set_mem_op(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(0usize, 5u8, val as u64) + } + } + #[inline] + pub fn mem_lvl(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(5usize, 14u8) as u64) } + } + #[inline] + pub fn set_mem_lvl(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(5usize, 14u8, val as u64) + } + } + #[inline] + pub fn mem_snoop(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(19usize, 5u8) as u64) } + } + #[inline] + pub fn set_mem_snoop(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(19usize, 5u8, val as u64) + } + } + #[inline] + pub fn mem_lock(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(24usize, 2u8) as u64) } + } + #[inline] + pub fn set_mem_lock(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(24usize, 2u8, val as u64) + } + } + #[inline] + pub fn mem_dtlb(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(26usize, 7u8) as u64) } + } + #[inline] + pub fn set_mem_dtlb(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(26usize, 7u8, val as u64) + } + } + #[inline] + pub fn mem_lvl_num(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(33usize, 4u8) as u64) } + } + #[inline] + pub fn set_mem_lvl_num(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(33usize, 4u8, val as u64) + } + } + #[inline] + pub fn mem_remote(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(37usize, 1u8) as u64) } + } + #[inline] + pub fn set_mem_remote(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(37usize, 1u8, val as u64) + } + } + #[inline] + pub fn mem_snoopx(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(38usize, 2u8) as u64) } + } + #[inline] + pub fn set_mem_snoopx(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(38usize, 2u8, val as u64) + } + } + #[inline] + pub fn mem_rsvd(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(40usize, 24u8) as u64) } + } + #[inline] + pub fn set_mem_rsvd(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(40usize, 24u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + mem_op: __u64, + mem_lvl: __u64, + mem_snoop: __u64, + mem_lock: __u64, + mem_dtlb: __u64, + mem_lvl_num: __u64, + mem_remote: __u64, + mem_snoopx: __u64, + mem_rsvd: __u64, + ) -> __BindgenBitfieldUnit<[u8; 8usize], u32> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize], u32> = + Default::default(); + __bindgen_bitfield_unit.set(0usize, 5u8, { + let mem_op: u64 = unsafe { ::std::mem::transmute(mem_op) }; + mem_op as u64 + }); + __bindgen_bitfield_unit.set(5usize, 14u8, { + let mem_lvl: u64 = unsafe { ::std::mem::transmute(mem_lvl) }; + mem_lvl as u64 + }); + __bindgen_bitfield_unit.set(19usize, 5u8, { + let mem_snoop: u64 = unsafe { ::std::mem::transmute(mem_snoop) }; + mem_snoop as u64 + }); + __bindgen_bitfield_unit.set(24usize, 2u8, { + let mem_lock: u64 = unsafe { ::std::mem::transmute(mem_lock) }; + mem_lock as u64 + }); + __bindgen_bitfield_unit.set(26usize, 7u8, { + let mem_dtlb: u64 = unsafe { ::std::mem::transmute(mem_dtlb) }; + mem_dtlb as u64 + }); + __bindgen_bitfield_unit.set(33usize, 4u8, { + let mem_lvl_num: u64 = unsafe { ::std::mem::transmute(mem_lvl_num) }; + mem_lvl_num as u64 + }); + __bindgen_bitfield_unit.set(37usize, 1u8, { + let mem_remote: u64 = unsafe { ::std::mem::transmute(mem_remote) }; + mem_remote as u64 + }); + __bindgen_bitfield_unit.set(38usize, 2u8, { + let mem_snoopx: u64 = unsafe { ::std::mem::transmute(mem_snoopx) }; + mem_snoopx as u64 + }); + __bindgen_bitfield_unit.set(40usize, 24u8, { + let mem_rsvd: u64 = unsafe { ::std::mem::transmute(mem_rsvd) }; + mem_rsvd as u64 + }); + __bindgen_bitfield_unit + } +} +#[test] +fn bindgen_test_layout_perf_mem_data_src() { + assert_eq!( + ::std::mem::size_of::(), + 8usize, + concat!("Size of: ", stringify!(perf_mem_data_src)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(perf_mem_data_src)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).val as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_mem_data_src), + "::", + stringify!(val) + ) + ); +} +impl Default for perf_mem_data_src { + fn default() -> Self { + unsafe { ::std::mem::zeroed() } + } +} +#[repr(C)] +#[derive(Debug, Default, Copy, Clone)] +pub struct perf_branch_entry { + pub from: __u64, + pub to: __u64, + pub _bitfield_1: __BindgenBitfieldUnit<[u8; 8usize], u64>, +} +#[test] +fn bindgen_test_layout_perf_branch_entry() { + assert_eq!( + ::std::mem::size_of::(), + 24usize, + concat!("Size of: ", stringify!(perf_branch_entry)) + ); + assert_eq!( + ::std::mem::align_of::(), + 8usize, + concat!("Alignment of ", stringify!(perf_branch_entry)) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).from as *const _ as usize }, + 0usize, + concat!( + "Offset of field: ", + stringify!(perf_branch_entry), + "::", + stringify!(from) + ) + ); + assert_eq!( + unsafe { &(*(::std::ptr::null::())).to as *const _ as usize }, + 8usize, + concat!( + "Offset of field: ", + stringify!(perf_branch_entry), + "::", + stringify!(to) + ) + ); +} +impl perf_branch_entry { + #[inline] + pub fn mispred(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(0usize, 1u8) as u64) } + } + #[inline] + pub fn set_mispred(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(0usize, 1u8, val as u64) + } + } + #[inline] + pub fn predicted(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(1usize, 1u8) as u64) } + } + #[inline] + pub fn set_predicted(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(1usize, 1u8, val as u64) + } + } + #[inline] + pub fn in_tx(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(2usize, 1u8) as u64) } + } + #[inline] + pub fn set_in_tx(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(2usize, 1u8, val as u64) + } + } + #[inline] + pub fn abort(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(3usize, 1u8) as u64) } + } + #[inline] + pub fn set_abort(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(3usize, 1u8, val as u64) + } + } + #[inline] + pub fn cycles(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(4usize, 16u8) as u64) } + } + #[inline] + pub fn set_cycles(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(4usize, 16u8, val as u64) + } + } + #[inline] + pub fn type_(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(20usize, 4u8) as u64) } + } + #[inline] + pub fn set_type(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(20usize, 4u8, val as u64) + } + } + #[inline] + pub fn reserved(&self) -> __u64 { + unsafe { ::std::mem::transmute(self._bitfield_1.get(24usize, 40u8) as u64) } + } + #[inline] + pub fn set_reserved(&mut self, val: __u64) { + unsafe { + let val: u64 = ::std::mem::transmute(val); + self._bitfield_1.set(24usize, 40u8, val as u64) + } + } + #[inline] + pub fn new_bitfield_1( + mispred: __u64, + predicted: __u64, + in_tx: __u64, + abort: __u64, + cycles: __u64, + type_: __u64, + reserved: __u64, + ) -> __BindgenBitfieldUnit<[u8; 8usize], u64> { + let mut __bindgen_bitfield_unit: __BindgenBitfieldUnit<[u8; 8usize], u64> = + Default::default(); + __bindgen_bitfield_unit.set(0usize, 1u8, { + let mispred: u64 = unsafe { ::std::mem::transmute(mispred) }; + mispred as u64 + }); + __bindgen_bitfield_unit.set(1usize, 1u8, { + let predicted: u64 = unsafe { ::std::mem::transmute(predicted) }; + predicted as u64 + }); + __bindgen_bitfield_unit.set(2usize, 1u8, { + let in_tx: u64 = unsafe { ::std::mem::transmute(in_tx) }; + in_tx as u64 + }); + __bindgen_bitfield_unit.set(3usize, 1u8, { + let abort: u64 = unsafe { ::std::mem::transmute(abort) }; + abort as u64 + }); + __bindgen_bitfield_unit.set(4usize, 16u8, { + let cycles: u64 = unsafe { ::std::mem::transmute(cycles) }; + cycles as u64 + }); + __bindgen_bitfield_unit.set(20usize, 4u8, { + let type_: u64 = unsafe { ::std::mem::transmute(type_) }; + type_ as u64 + }); + __bindgen_bitfield_unit.set(24usize, 40u8, { + let reserved: u64 = unsafe { ::std::mem::transmute(reserved) }; + reserved as u64 + }); + __bindgen_bitfield_unit + } +} +pub const HW_BREAKPOINT_LEN_1: _bindgen_ty_4 = 1; +pub const HW_BREAKPOINT_LEN_2: _bindgen_ty_4 = 2; +pub const HW_BREAKPOINT_LEN_3: _bindgen_ty_4 = 3; +pub const HW_BREAKPOINT_LEN_4: _bindgen_ty_4 = 4; +pub const HW_BREAKPOINT_LEN_5: _bindgen_ty_4 = 5; +pub const HW_BREAKPOINT_LEN_6: _bindgen_ty_4 = 6; +pub const HW_BREAKPOINT_LEN_7: _bindgen_ty_4 = 7; +pub const HW_BREAKPOINT_LEN_8: _bindgen_ty_4 = 8; +pub type _bindgen_ty_4 = u32; +pub const HW_BREAKPOINT_EMPTY: _bindgen_ty_5 = 0; +pub const HW_BREAKPOINT_R: _bindgen_ty_5 = 1; +pub const HW_BREAKPOINT_W: _bindgen_ty_5 = 2; +pub const HW_BREAKPOINT_RW: _bindgen_ty_5 = 3; +pub const HW_BREAKPOINT_X: _bindgen_ty_5 = 4; +pub const HW_BREAKPOINT_INVALID: _bindgen_ty_5 = 7; +pub type _bindgen_ty_5 = u32; +pub const bp_type_idx_TYPE_INST: bp_type_idx = 0; +pub const bp_type_idx_TYPE_DATA: bp_type_idx = 1; +pub const bp_type_idx_TYPE_MAX: bp_type_idx = 2; +pub type bp_type_idx = u32; +pub const perf_event_ioctls_ENABLE: perf_event_ioctls = 9216; +pub const perf_event_ioctls_DISABLE: perf_event_ioctls = 9217; +pub const perf_event_ioctls_REFRESH: perf_event_ioctls = 9218; +pub const perf_event_ioctls_RESET: perf_event_ioctls = 9219; +pub const perf_event_ioctls_PERIOD: perf_event_ioctls = 1074275332; +pub const perf_event_ioctls_SET_OUTPUT: perf_event_ioctls = 9221; +pub const perf_event_ioctls_SET_FILTER: perf_event_ioctls = 1074275334; +pub const perf_event_ioctls_ID: perf_event_ioctls = 2148017159; +pub const perf_event_ioctls_SET_BPF: perf_event_ioctls = 1074013192; +pub const perf_event_ioctls_PAUSE_OUTPUT: perf_event_ioctls = 1074013193; +pub const perf_event_ioctls_QUERY_BPF: perf_event_ioctls = 3221758986; +pub const perf_event_ioctls_MODIFY_ATTRIBUTES: perf_event_ioctls = 1074275339; +pub type perf_event_ioctls = u32; diff --git a/vendor/perf-event-open-sys/src/lib.rs b/vendor/perf-event-open-sys/src/lib.rs new file mode 100644 index 0000000000..3144280457 --- /dev/null +++ b/vendor/perf-event-open-sys/src/lib.rs @@ -0,0 +1,260 @@ +//! Direct, unsafe bindings for Linux [`perf_event_open`][man] and friends. +//! +//! Linux's `perf_event_open` system call provides access to the processor's +//! performance measurement counters (things like instructions retired, cache +//! misses, and so on), kernel counters (context switches, page faults), and +//! many other sources of performance information. +//! +//! You can't get the `perf_event_open` function from the `libc` crate, as you +//! would any other system call. The Linux standard C library does not provide a +//! binding for this function or its associated types and constants. +//! +//! Rust analogs to the C types and constants from `` and +//! ``, generated with `bindgen`, are available in the +//! [`bindings`] module. +//! +//! There are several ioctls for use with `perf_event_open` file descriptors; +//! see the [`ioctls`] module for those. +//! +//! For a safe and convenient interface to this functionality, see the +//! [`perf_event`] crate. +//! +//! ## Using the raw API +//! +//! As the kernel interface evolves, the struct and union types from the +//! [`bindings`] module may acquire new fields. To ensure that your code will +//! continue to compile against newer versions of this crate, you should +//! construct values of these types by calling their `Default` implementations, +//! which return zero-filled values, and then assigning to the fields you care +//! about. For example: +//! +//! ``` +//! use perf_event_open_sys as sys; +//! +//! // Construct a zero-filled `perf_event_attr`. +//! let mut attrs = sys::bindings::perf_event_attr::default(); +//! +//! // Populate the fields we need. +//! attrs.size = std::mem::size_of::() as u32; +//! attrs.type_ = sys::bindings::perf_type_id_PERF_TYPE_HARDWARE; +//! attrs.config = sys::bindings::perf_hw_id_PERF_COUNT_HW_INSTRUCTIONS as u64; +//! attrs.set_disabled(1); +//! attrs.set_exclude_kernel(1); +//! attrs.set_exclude_hv(1); +//! +//! // Make the system call. +//! let result = unsafe { +//! sys::perf_event_open(&mut attrs, 0, -1, -1, 0) +//! }; +//! +//! if result < 0 { +//! // ... handle error +//! } +//! +//! // ... use `result` as a raw file descriptor +//! ``` +//! +//! It is not necessary to adjust `size` to what the running kernel expects: +//! older kernels can accept newer `perf_event_attr` structs, and vice versa. As +//! long as the `size` field was properly initialized, an error result of +//! `E2BIG` indicates that the `attrs` structure has requested behavior the +//! kernel is too old to support. +//! +//! When `E2BIG` is returned, the kernel writes the size it expected back to the +//! `size` field of the `attrs` struct. Again, if you want to retry the call, it +//! is not necessary to adjust the size you pass to match what the kernel passed +//! back. The size from the kernel just indicates which version of the API the +//! kernel supports; see the documentation for the `PERF_EVENT_ATTR_SIZE_VER...` +//! constants for details. +//! +//! ## Kernel versions +//! +//! The bindings in this crate are generated from the Linux kernel headers +//! packaged by Fedora as `kernel-headers-5.6.11-100.fc30.x86_64`, which +//! corresponds to `PERF_EVENT_ATTR_SIZE_VER6`. +//! +//! As explained above, bugs aside, it is not necessary to use the version of +//! these structures that matches the kernel you want to run under, so it should +//! always be acceptable to use the latest version of this crate, even if you +//! want to support older kernels. +//! +//! This crate's `README.md` file includes instructions on regenerating the +//! bindings from newer kernel headers. However, this can be a breaking change +//! for users that have not followed the advice above, so regeneration should +//! cause a major version increment. +//! +//! If you need features that are available only in a more recent version of the +//! types than this crate provides, please file an issue. +//! +//! ## Linux API Backward/Forward Compatibility Strategy +//! +//! (This is more detail than necessary if you just want to use the crate. I +//! want to write this down somewhere so that I have something to refer to when +//! I forget the details.) +//! +//! It is an important principle of Linux kernel development that new versions +//! of the kernel should not break userspace. If upgrading your kernel breaks a +//! user program, then that's a bug in the kernel. (This refers to the run-time +//! interface. I don't know what the stability rules are for the kernel headers: +//! can new headers cause old code to fail to compile? Anyway, run time is our +//! concern here.) +//! +//! But when you have an open-ended, complex system call like `perf_event_open`, +//! it's really important for the interface to be able to evolve. Certainly, old +//! programs must run properly on new kernels, but ideally, it should work the +//! other way, too: a program built against a newer version of the kernel +//! headers should run on an older kernel, as long as it only requests features +//! the old kernel actually supports. That is, simply compiling against newer +//! headers should not be disqualifying - only using those new headers to +//! request features the running kernel can't provide should cause an error. +//! +//! Consider the specific case of passing a struct like `perf_event_attr` to a +//! system call like `perf_event_open`. In general, there are two versions of +//! the struct in play: the version the user program was compiled against, and +//! the version the running kernel was compiled against. How can we let old +//! programs call `perf_event_open` on new kernels, and vice versa? +//! +//! Linux has a neat strategy for making this work. There are four rules: +//! +//! - Every system call that passes a struct to the kernel includes some +//! indication of how large userspace thinks that struct is. For +//! `perf_event_open`, it's the `size` field of the `perf_event_attr` +//! struct. For `ioctl`s that pass a struct, it's a bitfield of the +//! `request` value. +//! +//! - Fields are never deleted from structs. At most, newer kernel headers may +//! rename them to '__reserved_foo' or something like that, but once a field +//! has been placed, its layout in the struct never changes. +//! +//! - New fields are added to the end of structs. +//! +//! - New fields' semantics are chosen such that filling them with zeros +//! preserves the old behavior. That is, turning an old struct into a new +//! struct by extending it with zero bytes should always give you a new +//! struct with the same meaning the old struct had. +//! +//! Then, the kernel's strategy for receiving structs from userspace (explained +//! by the kernel comments for `copy_struct_from_user` in +//! `include/linux/uaccess.h`) is as follows: +//! +//! - If the kernel's struct is larger than the one passed from userspace, +//! then that means the kernel is newer than the userspace program. The +//! kernel copies the userspace data into the initial bytes of its own +//! struct, and zeros the remaining bytes. Since zeroed fields have no +//! effect, the resulting struct properly reflects the user's intent. +//! +//! - If the kernel's struct is smaller than the one passed from userspace, +//! then that means that a userspace program compiled against newer kernel +//! headers is running on an older kernel. The kernel checks that the excess +//! bytes in the userspace struct are all zero; if they are not, the system +//! call returns `E2BIG`, indicating that userspace has requested a feature +//! the kernel doesn't support. If they are all zero, then the kernel +//! initializes its own struct with the bytes from the start of the +//! userspace struct, and drops the rest. Since the dropped bytes were all +//! zero, they did not affect the requested behavior, and the resulting +//! struct reflects the user's intent. +//! +//! - In either case, the kernel verifies that any `__reserved_foo` fields in +//! its own version of the struct are zero. +//! +//! This covers both the old-on-new and new-on-old cases, and returns an error +//! only when the call requests functionality the kernel doesn't support. +//! +//! You can find one example of using `perf_event_open` in the [`perf_event`] +//! crate, which provides a safe interface to a subset of `perf_event_open`'s +//! functionality. +//! +//! [`bindings`]: bindings/index.html +//! [`ioctls`]: ioctls/index.html +//! [man]: http://man7.org/linux/man-pages/man2/perf_event_open.2.html +//! [`perf_event`]: https://crates.io/crates/perf_event + +pub mod bindings; + +use libc::pid_t; +use std::os::raw::{c_int, c_ulong}; + +/// The `perf_event_open` system call. +/// +/// See the [`perf_event_open(2) man page`][man] for details. +/// +/// On error, this returns a negated raw OS error value. The C `errno` value is +/// not changed. +/// +/// Note: The `attrs` argument needs to be a `*mut` because if the `size` field +/// is too small or too large, the kernel writes the size it was expecing back +/// into that field. It might do other things as well. +/// +/// [man]: http://man7.org/linux/man-pages/man2/perf_event_open.2.html +pub unsafe fn perf_event_open( + attrs: *mut bindings::perf_event_attr, + pid: pid_t, + cpu: c_int, + group_fd: c_int, + flags: c_ulong, +) -> c_int { + libc::syscall( + bindings::__NR_perf_event_open as libc::c_long, + attrs as *const bindings::perf_event_attr, + pid, + cpu, + group_fd, + flags, + ) as c_int +} + +#[allow(dead_code, non_snake_case)] +pub mod ioctls { + //! Ioctls for use with `perf_event_open` file descriptors. + //! + //! See the [`perf_event_open(2)`][man] man page for details. + //! + //! On error, these return `-1` and set the C `errno` value. + //! + //! [man]: http://man7.org/linux/man-pages/man2/perf_event_open.2.html + use crate::bindings::{self, perf_event_attr, perf_event_query_bpf}; + use std::os::raw::{c_char, c_int, c_uint, c_ulong}; + + macro_rules! define_ioctls { + ( $( $args:tt )* ) => { + $( + define_ioctl!($args); + )* + } + } + + macro_rules! define_ioctl { + ({ $name:ident, $ioctl:ident, $arg_type:ty }) => { + pub unsafe fn $name(fd: c_int, arg: $arg_type) -> c_int { + untyped_ioctl(fd, bindings::$ioctl, arg) + } + }; + } + + define_ioctls! { + { ENABLE, perf_event_ioctls_ENABLE, c_uint } + { DISABLE, perf_event_ioctls_DISABLE, c_uint } + { REFRESH, perf_event_ioctls_REFRESH, c_int } + { RESET, perf_event_ioctls_RESET, c_uint } + { PERIOD, perf_event_ioctls_PERIOD, u64 } + { SET_OUTPUT, perf_event_ioctls_SET_OUTPUT, c_int } + { SET_FILTER, perf_event_ioctls_SET_FILTER, *mut c_char } + { ID, perf_event_ioctls_ID, *mut u64 } + { SET_BPF, perf_event_ioctls_SET_BPF, u32 } + { PAUSE_OUTPUT, perf_event_ioctls_PAUSE_OUTPUT, u32 } + { QUERY_BPF, perf_event_ioctls_QUERY_BPF, *mut perf_event_query_bpf } + { MODIFY_ATTRIBUTES, perf_event_ioctls_MODIFY_ATTRIBUTES, *mut perf_event_attr } + } + + unsafe fn untyped_ioctl( + fd: c_int, + ioctl: bindings::perf_event_ioctls, + arg: A, + ) -> c_int { + #[cfg(target_env = "musl")] + return libc::ioctl(fd, ioctl as c_int, arg); + + #[cfg(not(target_env = "musl"))] + libc::ioctl(fd, ioctl as c_ulong, arg) + } +} diff --git a/vendor/perf-event-open-sys/wrapper.h b/vendor/perf-event-open-sys/wrapper.h new file mode 100644 index 0000000000..1838eea997 --- /dev/null +++ b/vendor/perf-event-open-sys/wrapper.h @@ -0,0 +1,23 @@ +// This file is consumed by bindgen, called from our build.rs file. + +#include +#include + +// for __NR_perf_event_open +#include + +// bindgen won't capture preprocessor macro definitions, so we have to do this. +enum perf_event_ioctls { + ENABLE = PERF_EVENT_IOC_ENABLE, + DISABLE = PERF_EVENT_IOC_DISABLE, + REFRESH = PERF_EVENT_IOC_REFRESH, + RESET = PERF_EVENT_IOC_RESET, + PERIOD = PERF_EVENT_IOC_PERIOD, + SET_OUTPUT = PERF_EVENT_IOC_SET_OUTPUT, + SET_FILTER = PERF_EVENT_IOC_SET_FILTER, + ID = PERF_EVENT_IOC_ID, + SET_BPF = PERF_EVENT_IOC_SET_BPF, + PAUSE_OUTPUT = PERF_EVENT_IOC_PAUSE_OUTPUT, + QUERY_BPF = PERF_EVENT_IOC_QUERY_BPF, + MODIFY_ATTRIBUTES = PERF_EVENT_IOC_MODIFY_ATTRIBUTES, +}; diff --git a/vendor/pin-project-lite/.cargo-checksum.json b/vendor/pin-project-lite/.cargo-checksum.json index 8f4d1c34d1..1d25094fb4 100644 --- a/vendor/pin-project-lite/.cargo-checksum.json +++ b/vendor/pin-project-lite/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"41b211ebf7c96d79b1cceda78d3ae924d07d8bb9fdfcb5197dee49d2cd436477","Cargo.toml":"15d66cecd0e8e9ccbd84fb74c3b43ace78cd530e50f4d789ba2d2a88c4127ffb","LICENSE-APACHE":"0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"3a264d888ee576c8d7a639e3ab5ededfa52e5d992a053b3e9af4e66e0a05ba34","src/lib.rs":"0cd92587eae525a5103e6f2408514bcac44ae0f3adab7ffa526b606779a74b8a","tests/auxiliary/mod.rs":"10d721e608f6c667da4eaff7ddcc0efce175c7c92bbf3b4c7755c00a57e29d73","tests/compiletest.rs":"a34957c7d476fce70141291aa739b5fda8c788fa23e8ade163ecf53cdcd1bedd","tests/drop_order.rs":"266d2ba4d4b09271c5ad907c302f0105c48d371ed2b0df52d91f79ef0f034abe","tests/include/basic.rs":"9e399b682bc74c899d26924c2cab52a911f7392e29300defb6521e561fafafe4","tests/lint.rs":"c730a6b2fed1cb9dcd729f97410f48909aae3d2609a8bb41c5fad0e8e9d216f0","tests/proper_unpin.rs":"4089d17e67c0974b9791986625c7871e7fee723432706fbe78459ddbb6f67a59","tests/test.rs":"b2ce9c87350753a0f60c7492b04582e5f20773ec1f5639ee8827ae8ef2677330","tests/ui/conflict-drop.rs":"55e6809b5f59dd81e32c2c89b742c0c76db6b099a1d2621e5b882c0d20f92837","tests/ui/conflict-drop.stderr":"b29a458533f0312b2b04e9a0dfea17fce2ba423ef764ec3e2996a315c00a4cf8","tests/ui/conflict-unpin.rs":"51b3b6720fa581b63167d6ac941a1ea1bf739b09954931b2bc2f7abe2d934f26","tests/ui/conflict-unpin.stderr":"ab8e9acab4ffcdff1d0065e9504d64a0220267ab9f18b2840c97da8c0bbbf984","tests/ui/invalid-bounds.rs":"f86f23d377df015182f2f5dae6464a4f98c37f2198e0646f721fedc4017cb82c","tests/ui/invalid-bounds.stderr":"e93d9bc35080dacb837f2e626947b7ec57fea36c0246d839c295a93c33bf7e5b","tests/ui/invalid.rs":"7304bd4a5bac1419382742432cfa8af83535d7be8cfad52c661410e0e9e8207a","tests/ui/invalid.stderr":"a9da7ba0d2dc729137c1736d355c52de1d34fdf10eb4fa35be07b2644d6dfad3","tests/ui/overlapping_lifetime_names.rs":"a64c42cc56fa4751d73a1db80a7deb568427dc96f30c1a29665067d8c0ecb2c9","tests/ui/overlapping_lifetime_names.stderr":"ebfd5c08e7c472f49d49d67de9308e647a6a6b1e289308bf2d60d79d72521457","tests/ui/overlapping_unpin_struct.rs":"5fde23ef628d2dbd27377ffa472fc19b1c6873122f38c3fb1f84fda8602f55f3","tests/ui/overlapping_unpin_struct.stderr":"e83e99bacdf6564727c77dafe5eaf000b4de6e784e6032b9b0ecca831ecc528c","tests/ui/packed.rs":"12b14e183c809b267f0feff0b6c8bf8d664315e6959d236bd7a0887fc226b9bf","tests/ui/packed.stderr":"f4c443844179d45d7e56a20aae9246fccd38adf0eb9bff1540d3ab0c354c2b6e","tests/ui/unpin_sneaky.rs":"12e97a387ce1af6ee6a567687674aab70e96962a48f2433c39976d0b3e2c3341","tests/ui/unpin_sneaky.stderr":"7b2bc76faca39f77968c798674f2321111a74a5754512149320ea4cdd3e278d5","tests/ui/unsupported.rs":"14defa90e736f314bbbc219973929b77bdd22e5f7e4c4c88403db764f4d167d6","tests/ui/unsupported.stderr":"562db085e5e01dedaa3cb11c592f61f33c5a6388a31e6f1ed9554874cfa2c673"},"package":"439697af366c49a6d0a010c56a0d97685bc140ce0d377b13a2ea2aa42d64a827"} \ No newline at end of file +{"files":{"CHANGELOG.md":"22171a2d3eb9a2463cb7241d2082a280eb61031921c3a5a831b7303ed3c9c7ed","Cargo.toml":"e48869c4019894d0458f0f70968c4da16c4af37ba98e1d3aaeece154e4063c1f","LICENSE-APACHE":"0d542e0c8804e39aa7f37eb00da5a762149dc682d7829451287e11b938e94594","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"94f60b0c293aaf34041640c7f407da96bc3824a9e1efe20bd12c23aee6c196f7","src/lib.rs":"675bded8e4b1eeff1594cf003bf2f470b80f68daaaa1cf398d844c23e4dfc3c4","tests/auxiliary/mod.rs":"7e263e987e09b77e384f734384a00a71c5b70230bb1b5376446ef003a8da9372","tests/compiletest.rs":"eb16ecdecd1c9d01534b749579ee6c03f9b829d5938dcb85ef9c2916176b5d1e","tests/drop_order.rs":"817c5a7aef9c149e7d09c8a26aeb3b9e333d79a60391c5badbc3e325cbabbd12","tests/expand/README.md":"060f1800da3356e601ba3995525cfa497b219930fe1dd9a2c5696d9a809b4268","tests/expand/default/enum.expanded.rs":"c3c209d45c02d22873e464a57d7342ec775b002e6f0056481909c8d56038e9be","tests/expand/default/enum.rs":"493d5752c4baa87ed4c48bd41b8e5e263fd5e3f43c4f9195818ef6d26951f63e","tests/expand/default/struct.expanded.rs":"c158632984eaf6ab8ae60b76ff2bf32b20ba10a3cbc4237c9a6ea28c614cdb01","tests/expand/default/struct.rs":"5a6e57d9b6d00cfd4e1e69f37ce0c9d5165a21230d0363f0791665b1015870ce","tests/expand/multifields/enum.expanded.rs":"194b02f37b170f297fa39375cca71c378acf66b1729e2799434c48a5c7e34ace","tests/expand/multifields/enum.rs":"9c79270a7d6d1d42cf8194b579d79e7d44a3fd003243742f0a568ecf0a4f3be3","tests/expand/multifields/struct.expanded.rs":"0c98b4d085237f123c5455d558e495b2754ca84048f63df6416ef271610ee1c0","tests/expand/multifields/struct.rs":"17f0447d522d48f14d516808bd66baacebdf3ac38188df72f649702a893cda68","tests/expand/naming/enum-all.expanded.rs":"c3c209d45c02d22873e464a57d7342ec775b002e6f0056481909c8d56038e9be","tests/expand/naming/enum-all.rs":"493d5752c4baa87ed4c48bd41b8e5e263fd5e3f43c4f9195818ef6d26951f63e","tests/expand/naming/enum-mut.expanded.rs":"ce1a12428d3906c8d98516b3afdcbbbda64776e2f0c039e90f3de8f734ab1878","tests/expand/naming/enum-mut.rs":"c1ff4ade049ebbceb2acb99dbc1af5db14de3ba9710ea1ff1b64348766a9e080","tests/expand/naming/enum-none.expanded.rs":"cf8ea074b8079af453a2f98e2217704e96174433e4ac0e07577f9242ad3d5de2","tests/expand/naming/enum-none.rs":"ff22be4ecf4168e2bc68ab249a0ed809a37e3b8e840ef8977d24209ef28ac839","tests/expand/naming/enum-ref.expanded.rs":"277e9642e49f4dc312ea09b4d9f8012994662f565529865102be0fe1657c2b13","tests/expand/naming/enum-ref.rs":"394cbd5d872449e9226cd0834ce7117c395a582567584218dabbef4eb2c1fbac","tests/expand/naming/struct-all.expanded.rs":"722a17838aa9734f58a23ee15ff478788af5998a1ffc97c28aa040bc50612118","tests/expand/naming/struct-all.rs":"c13c0aacee85b8fca58f85d2d75d2e3907b3e7642f8710ed8c8e54d6015881cc","tests/expand/naming/struct-mut.expanded.rs":"f08b34f7d49ad45ae0a1ae8b64995d63e7e4eed2910a912f6c622a0b8e410b89","tests/expand/naming/struct-mut.rs":"9a7752a6d30e0b7033f3577a72676676900a642cdaf59f942179d1f2a8ba2bb0","tests/expand/naming/struct-none.expanded.rs":"c158632984eaf6ab8ae60b76ff2bf32b20ba10a3cbc4237c9a6ea28c614cdb01","tests/expand/naming/struct-none.rs":"5a6e57d9b6d00cfd4e1e69f37ce0c9d5165a21230d0363f0791665b1015870ce","tests/expand/naming/struct-ref.expanded.rs":"dabc3fda847ab2f4e4ca0ec6f6dc4da43f8de087117dcafb3c15780cebc7af45","tests/expand/naming/struct-ref.rs":"33c4fd344b65650dee44087ada31d4b5acd9d122123360fb7d41718c46699574","tests/expand/pub/enum.expanded.rs":"56c81c0535f8fb9b83662fc3753f7c07b96eb12392669bb1ae23ffc82b7c4a2c","tests/expand/pub/enum.rs":"5b60dd354a489b0326f5c4f1026b89d1471ddbb45906bc3046a65425c4e5e160","tests/expand/pub/struct.expanded.rs":"525c52bf7185493046618ee0dc1b18bdc0c0a56383f5c7b11c98738211d024a7","tests/expand/pub/struct.rs":"15b7940ce0ad1d5d133dde1870319f2f96a000bfcf29508b8cce1a62876cbd80","tests/expandtest.rs":"a091cc8b0684358e327992a2acc7b7e4738d725b0e643a5ee3e8f5f1d7415608","tests/include/basic.rs":"9e399b682bc74c899d26924c2cab52a911f7392e29300defb6521e561fafafe4","tests/lint.rs":"13ccf3b5e464d6506915c2c57555a3f293bd7405fde5aac008af913df327ffa4","tests/proper_unpin.rs":"57a9e8c9029ba7920ec23670b66758916e067c9cecf4d3f8b0035bec25cdb570","tests/test.rs":"ef4efe0ce333e6a0d4c8574d139e522e408d2a48db07e0015e3e9bc8734f79d2","tests/ui/pin_project/conflict-drop.rs":"55e6809b5f59dd81e32c2c89b742c0c76db6b099a1d2621e5b882c0d20f92837","tests/ui/pin_project/conflict-drop.stderr":"b29a458533f0312b2b04e9a0dfea17fce2ba423ef764ec3e2996a315c00a4cf8","tests/ui/pin_project/conflict-unpin.rs":"51b3b6720fa581b63167d6ac941a1ea1bf739b09954931b2bc2f7abe2d934f26","tests/ui/pin_project/conflict-unpin.stderr":"ab8e9acab4ffcdff1d0065e9504d64a0220267ab9f18b2840c97da8c0bbbf984","tests/ui/pin_project/invalid-bounds.rs":"f86f23d377df015182f2f5dae6464a4f98c37f2198e0646f721fedc4017cb82c","tests/ui/pin_project/invalid-bounds.stderr":"e93d9bc35080dacb837f2e626947b7ec57fea36c0246d839c295a93c33bf7e5b","tests/ui/pin_project/invalid.rs":"7304bd4a5bac1419382742432cfa8af83535d7be8cfad52c661410e0e9e8207a","tests/ui/pin_project/invalid.stderr":"a9da7ba0d2dc729137c1736d355c52de1d34fdf10eb4fa35be07b2644d6dfad3","tests/ui/pin_project/overlapping_lifetime_names.rs":"a64c42cc56fa4751d73a1db80a7deb568427dc96f30c1a29665067d8c0ecb2c9","tests/ui/pin_project/overlapping_lifetime_names.stderr":"ebfd5c08e7c472f49d49d67de9308e647a6a6b1e289308bf2d60d79d72521457","tests/ui/pin_project/overlapping_unpin_struct.rs":"5fde23ef628d2dbd27377ffa472fc19b1c6873122f38c3fb1f84fda8602f55f3","tests/ui/pin_project/overlapping_unpin_struct.stderr":"e83e99bacdf6564727c77dafe5eaf000b4de6e784e6032b9b0ecca831ecc528c","tests/ui/pin_project/packed.rs":"1f1a34aafbff9a59b94cdf3a53df03e9fc661d9e27e0f9962bad7f9bdad03b14","tests/ui/pin_project/packed.stderr":"4acb1514ca0a2c3b9448b28a71ab81d1dce37ba42f1af8b3220f926f0ca556e4","tests/ui/pin_project/unpin_sneaky.rs":"12e97a387ce1af6ee6a567687674aab70e96962a48f2433c39976d0b3e2c3341","tests/ui/pin_project/unpin_sneaky.stderr":"7b2bc76faca39f77968c798674f2321111a74a5754512149320ea4cdd3e278d5","tests/ui/pin_project/unsupported.rs":"14defa90e736f314bbbc219973929b77bdd22e5f7e4c4c88403db764f4d167d6","tests/ui/pin_project/unsupported.stderr":"562db085e5e01dedaa3cb11c592f61f33c5a6388a31e6f1ed9554874cfa2c673"},"package":"dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905"} \ No newline at end of file diff --git a/vendor/pin-project-lite/CHANGELOG.md b/vendor/pin-project-lite/CHANGELOG.md index e9d12768d2..666dd6b91f 100644 --- a/vendor/pin-project-lite/CHANGELOG.md +++ b/vendor/pin-project-lite/CHANGELOG.md @@ -10,24 +10,42 @@ Note: In this file, do not use the hard wrap in the middle of a sentence for com ## [Unreleased] +## [0.2.6] - 2021-03-04 + +- [Support item attributes in any order.](https://github.com/taiki-e/pin-project-lite/pull/57) + +## [0.2.5] - 2021-03-02 + +- [Prepare for removal of `safe_packed_borrows` lint.](https://github.com/taiki-e/pin-project-lite/pull/55) See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + ## [0.2.4] - 2021-01-11 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - [Add `project_replace`.](https://github.com/taiki-e/pin-project-lite/pull/43) ## [0.2.3] - 2021-01-09 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - [Suppress `clippy::unknown_clippy_lints` lint in generated code.](https://github.com/taiki-e/pin-project-lite/pull/47) ## [0.2.2] - 2021-01-09 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - [Suppress `clippy::ref_option_ref` lint in generated code.](https://github.com/taiki-e/pin-project-lite/pull/45) ## [0.2.1] - 2021-01-05 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - Exclude unneeded files from crates.io. ## [0.2.0] - 2020-11-13 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - [`pin_project!` macro now supports enums.](https://github.com/taiki-e/pin-project-lite/pull/28) To use `pin_project!` on enums, you need to name the projection type returned from the method. @@ -77,22 +95,34 @@ Note: In this file, do not use the hard wrap in the middle of a sentence for com } ``` +## [0.1.12] - 2021-03-02 + +- [Prepare for removal of `safe_packed_borrows` lint.](https://github.com/taiki-e/pin-project-lite/pull/55) See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + ## [0.1.11] - 2020-10-20 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - Suppress `clippy::redundant_pub_crate` lint in generated code. - Documentation improvements. ## [0.1.10] - 2020-10-01 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - Suppress `drop_bounds` lint, which will be added to rustc in the future. See [taiki-e/pin-project#272](https://github.com/taiki-e/pin-project/issues/272) for more details. ## [0.1.9] - 2020-09-29 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - [Fix trailing comma support in generics.](https://github.com/taiki-e/pin-project-lite/pull/32) ## [0.1.8] - 2020-09-26 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - [Fix compatibility of generated code with `forbid(future_incompatible)`.](https://github.com/taiki-e/pin-project-lite/pull/30) Note: This does not guarantee compatibility with `forbid(future_incompatible)` in the future. @@ -100,6 +130,8 @@ Note: In this file, do not use the hard wrap in the middle of a sentence for com ## [0.1.7] - 2020-06-04 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - [Support `?Sized` bounds in where clauses.](https://github.com/taiki-e/pin-project-lite/pull/22) - [Fix lifetime inference error when an associated type is used in fields.](https://github.com/taiki-e/pin-project-lite/pull/20) @@ -110,40 +142,57 @@ Note: In this file, do not use the hard wrap in the middle of a sentence for com ## [0.1.6] - 2020-05-31 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - [Support lifetime bounds in where clauses.](https://github.com/taiki-e/pin-project-lite/pull/18) - Documentation improvements. ## [0.1.5] - 2020-05-07 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - [Support overwriting the name of `core` crate.](https://github.com/taiki-e/pin-project-lite/pull/14) ## [0.1.4] - 2020-01-20 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - [Support ?Sized bounds in generic parameters.](https://github.com/taiki-e/pin-project-lite/pull/9) ## [0.1.3] - 2020-01-20 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - [Support lifetime bounds in generic parameters.](https://github.com/taiki-e/pin-project-lite/pull/7) ## [0.1.2] - 2020-01-05 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - [Support recognizing default generic parameters.](https://github.com/taiki-e/pin-project-lite/pull/6) ## [0.1.1] - 2019-11-15 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + - [`pin_project!` macro now determines the visibility of the projection type/method is based on the original type.](https://github.com/taiki-e/pin-project-lite/pull/5) ## [0.1.0] - 2019-10-22 +**Note: This release has been yanked.** See [#55](https://github.com/taiki-e/pin-project-lite/pull/55) for details. + Initial release -[Unreleased]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.4...HEAD +[Unreleased]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.6...HEAD +[0.2.6]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.5...v0.2.6 +[0.2.5]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.4...v0.2.5 [0.2.4]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.3...v0.2.4 [0.2.3]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.2...v0.2.3 [0.2.2]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.1...v0.2.2 [0.2.1]: https://github.com/taiki-e/pin-project-lite/compare/v0.2.0...v0.2.1 [0.2.0]: https://github.com/taiki-e/pin-project-lite/compare/v0.1.11...v0.2.0 +[0.1.12]: https://github.com/taiki-e/pin-project-lite/compare/v0.1.11...v0.1.12 [0.1.11]: https://github.com/taiki-e/pin-project-lite/compare/v0.1.10...v0.1.11 [0.1.10]: https://github.com/taiki-e/pin-project-lite/compare/v0.1.9...v0.1.10 [0.1.9]: https://github.com/taiki-e/pin-project-lite/compare/v0.1.8...v0.1.9 diff --git a/vendor/pin-project-lite/Cargo.toml b/vendor/pin-project-lite/Cargo.toml index 92774c9ac8..b24f836741 100644 --- a/vendor/pin-project-lite/Cargo.toml +++ b/vendor/pin-project-lite/Cargo.toml @@ -13,18 +13,20 @@ [package] edition = "2018" name = "pin-project-lite" -version = "0.2.4" +version = "0.2.6" authors = ["Taiki Endo "] -exclude = ["/.github", "/scripts"] +exclude = ["/.*", "/scripts"] description = "A lightweight version of pin-project written with declarative macros.\n" documentation = "https://docs.rs/pin-project-lite" -readme = "README.md" keywords = ["pin", "macros"] categories = ["no-std", "rust-patterns"] license = "Apache-2.0 OR MIT" repository = "https://github.com/taiki-e/pin-project-lite" [package.metadata.docs.rs] targets = ["x86_64-unknown-linux-gnu"] +[dev-dependencies.macrotest] +version = "1.0.8" + [dev-dependencies.rustversion] version = "1" diff --git a/vendor/pin-project-lite/README.md b/vendor/pin-project-lite/README.md index 2f93ad087f..fbdc9d1887 100644 --- a/vendor/pin-project-lite/README.md +++ b/vendor/pin-project-lite/README.md @@ -1,10 +1,10 @@ # pin-project-lite -[![crates.io](https://img.shields.io/crates/v/pin-project-lite.svg?style=flat-square&logo=rust)](https://crates.io/crates/pin-project-lite) +[![crates.io](https://img.shields.io/crates/v/pin-project-lite?style=flat-square&logo=rust)](https://crates.io/crates/pin-project-lite) [![docs.rs](https://img.shields.io/badge/docs.rs-pin--project--lite-blue?style=flat-square)](https://docs.rs/pin-project-lite) -[![license](https://img.shields.io/badge/license-Apache--2.0_OR_MIT-blue.svg?style=flat-square)](#license) -[![rustc](https://img.shields.io/badge/rustc-1.37+-blue.svg?style=flat-square)](https://www.rust-lang.org) -[![build status](https://img.shields.io/github/workflow/status/taiki-e/pin-project-lite/CI/master?style=flat-square)](https://github.com/taiki-e/pin-project-lite/actions?query=workflow%3ACI+branch%3Amaster) +[![license](https://img.shields.io/badge/license-Apache--2.0_OR_MIT-blue?style=flat-square)](#license) +[![rustc](https://img.shields.io/badge/rustc-1.37+-blue?style=flat-square&logo=rust)](https://www.rust-lang.org) +[![build status](https://img.shields.io/github/workflow/status/taiki-e/pin-project-lite/CI/main?style=flat-square&logo=github)](https://github.com/taiki-e/pin-project-lite/actions) A lightweight version of [pin-project] written with declarative macros. diff --git a/vendor/pin-project-lite/src/lib.rs b/vendor/pin-project-lite/src/lib.rs index ff1e3bf48c..86163919f6 100644 --- a/vendor/pin-project-lite/src/lib.rs +++ b/vendor/pin-project-lite/src/lib.rs @@ -5,9 +5,10 @@ //! [`pin_project!`] macro creates a projection type covering all the fields of struct. //! //! ```rust -//! use pin_project_lite::pin_project; //! use std::pin::Pin; //! +//! use pin_project_lite::pin_project; +//! //! pin_project! { //! struct Struct { //! #[pin] @@ -29,9 +30,10 @@ //! returned from the method. //! //! ```rust -//! use pin_project_lite::pin_project; //! use std::pin::Pin; //! +//! use pin_project_lite::pin_project; +//! //! pin_project! { //! #[project = EnumProj] //! enum Enum { @@ -165,23 +167,6 @@ /// # } /// ``` /// -/// The `#[project]` (and `#[project_ref]`) attribute must precede the other -/// attributes except for `#[doc]`. For example, the following code will not be compiled: -/// -/// ```rust,compile_fail -/// # use pin_project_lite::pin_project; -/// # use std::pin::Pin; -/// pin_project! { -/// /// documents (`#[doc]`) can be placed before `#[project]`. -/// #[derive(Clone)] // <--- ERROR -/// #[project = EnumProj] -/// #[derive(Debug)] // <--- Ok -/// enum Enum { -/// Variant { #[pin] field: T }, -/// } -/// } -/// ``` -/// /// Also, note that the projection types returned by `project` and `project_ref` have /// an additional lifetime at the beginning of generics. /// @@ -205,9 +190,10 @@ /// # Examples /// /// ```rust -/// use pin_project_lite::pin_project; /// use std::pin::Pin; /// +/// use pin_project_lite::pin_project; +/// /// pin_project! { /// struct Struct { /// #[pin] @@ -229,9 +215,10 @@ /// returned from the method. /// /// ```rust -/// use pin_project_lite::pin_project; /// use std::pin::Pin; /// +/// use pin_project_lite::pin_project; +/// /// pin_project! { /// #[project = EnumProj] /// enum Enum { @@ -260,9 +247,10 @@ /// consuming the [`Pin`]. /// /// ```rust -/// use pin_project_lite::pin_project; /// use std::pin::Pin; /// +/// use pin_project_lite::pin_project; +/// /// pin_project! { /// struct Struct { /// #[pin] @@ -285,9 +273,10 @@ /// attribute for a [`PhantomPinned`] field. /// /// ```rust -/// use pin_project_lite::pin_project; /// use std::marker::PhantomPinned; /// +/// use pin_project_lite::pin_project; +/// /// pin_project! { /// struct Struct { /// field: T, @@ -305,94 +294,9 @@ /// [pin-project]: https://github.com/taiki-e/pin-project #[macro_export] macro_rules! pin_project { - // Parses options - ( - $(#[doc $($doc:tt)*])* - #[project = $proj_mut_ident:ident] - #[project_ref = $proj_ref_ident:ident] - #[project_replace = $proj_replace_ident:ident] - $($tt:tt)* - ) => { - $crate::__pin_project_internal! { - [$proj_mut_ident][$proj_ref_ident][$proj_replace_ident] - $(#[doc $($doc)*])* - $($tt)* - } - }; - ( - $(#[doc $($doc:tt)*])* - #[project = $proj_mut_ident:ident] - #[project_ref = $proj_ref_ident:ident] - $($tt:tt)* - ) => { - $crate::__pin_project_internal! { - [$proj_mut_ident][$proj_ref_ident][] - $(#[doc $($doc)*])* - $($tt)* - } - }; - ( - $(#[doc $($doc:tt)*])* - #[project = $proj_mut_ident:ident] - #[project_replace = $proj_replace_ident:ident] - $($tt:tt)* - ) => { - $crate::__pin_project_internal! { - [$proj_mut_ident][][$proj_replace_ident] - $(#[doc $($doc)*])* - $($tt)* - } - }; - ( - $(#[doc $($doc:tt)*])* - #[project_ref = $proj_ref_ident:ident] - #[project_replace = $proj_replace_ident:ident] - $($tt:tt)* - ) => { - $crate::__pin_project_internal! { - [][$proj_ref_ident][$proj_replace_ident] - $(#[doc $($doc)*])* - $($tt)* - } - }; - ( - $(#[doc $($doc:tt)*])* - #[project = $proj_mut_ident:ident] - $($tt:tt)* - ) => { - $crate::__pin_project_internal! { - [$proj_mut_ident][][] - $(#[doc $($doc)*])* - $($tt)* - } - }; - ( - $(#[doc $($doc:tt)*])* - #[project_ref = $proj_ref_ident:ident] - $($tt:tt)* - ) => { + ($($tt:tt)*) => { $crate::__pin_project_internal! { - [][$proj_ref_ident][] - $(#[doc $($doc)*])* - $($tt)* - } - }; - ( - $(#[doc $($doc:tt)*])* - #[project_replace = $proj_replace_ident:ident] - $($tt:tt)* - ) => { - $crate::__pin_project_internal! { - [][][$proj_replace_ident] - $(#[doc $($doc)*])* - $($tt)* - } - }; - ( - $($tt:tt)* - ) => { - $crate::__pin_project_internal! { - [][][] + [][][][] $($tt)* } }; @@ -584,10 +488,8 @@ macro_rules! __pin_project_internal { // Ensure that it's impossible to use pin projections on a #[repr(packed)] struct. // - // Taking a reference to a packed field is unsafe, amd appplying - // #[forbid(safe_packed_borrows)] makes sure that doing this without - // an 'unsafe' block (which we deliberately do not generate) - // is a hard error. + // Taking a reference to a packed field is UB, and applying + // `#[forbid(unaligned_references)]` makes sure that doing this is a hard error. // // If the struct ends up having #[repr(packed)] applied somehow, // this will generate an (unfriendly) error message. Under all reasonable @@ -595,7 +497,16 @@ macro_rules! __pin_project_internal { // a much nicer error above. // // See https://github.com/taiki-e/pin-project/pull/34 for more details. - #[forbid(safe_packed_borrows)] + // + // Note: + // - Lint-based tricks aren't perfect, but they're much better than nothing: + // https://github.com/taiki-e/pin-project-lite/issues/26 + // + // - Enable both unaligned_references and safe_packed_borrows lints + // because unaligned_references lint does not exist in older compilers: + // https://github.com/taiki-e/pin-project-lite/pull/55 + // https://github.com/rust-lang/rust/pull/82525 + #[forbid(unaligned_references, safe_packed_borrows)] fn __assert_not_repr_packed <$($impl_generics)*> (this: &$ident <$($ty_generics)*>) $(where $($where_clause)*)? @@ -1401,13 +1312,86 @@ macro_rules! __pin_project_internal { // ============================================================================================= // Parses input and determines visibility + + ( + [] + [$($proj_ref_ident:ident)?] + [$($proj_replace_ident:ident)?] + [$($attrs:tt)*] + + #[project = $proj_mut_ident:ident] + $($tt:tt)* + ) => { + $crate::__pin_project_internal! { + [$proj_mut_ident] + [$($proj_ref_ident)?] + [$($proj_replace_ident)?] + [$($attrs)*] + $($tt)* + } + }; + + { + [$($proj_mut_ident:ident)?] + [] + [$($proj_replace_ident:ident)?] + [$($attrs:tt)*] + + #[project_ref = $proj_ref_ident:ident] + $($tt:tt)* + } => { + $crate::__pin_project_internal! { + [$($proj_mut_ident)?] + [$proj_ref_ident] + [$($proj_replace_ident)?] + [$($attrs)*] + $($tt)* + } + }; + + { + [$($proj_mut_ident:ident)?] + [$($proj_ref_ident:ident)?] + [] + [$($attrs:tt)*] + + #[project_replace = $proj_replace_ident:ident] + $($tt:tt)* + } => { + $crate::__pin_project_internal! { + [$($proj_mut_ident)?] + [$($proj_ref_ident)?] + [$proj_replace_ident] + [$($attrs)*] + $($tt)* + } + }; + + { + [$($proj_mut_ident:ident)?] + [$($proj_ref_ident:ident)?] + [$($proj_replace_ident:ident)?] + [$($attrs:tt)*] + + #[$($attr:tt)*] + $($tt:tt)* + } => { + $crate::__pin_project_internal! { + [$($proj_mut_ident)?] + [$($proj_ref_ident)?] + [$($proj_replace_ident)?] + [$($attrs)* #[$($attr)*]] + $($tt)* + } + }; + // struct ( [$($proj_mut_ident:ident)?] [$($proj_ref_ident:ident)?] [$($proj_replace_ident:ident)?] + [$($attrs:tt)*] - $(#[$attrs:meta])* pub struct $ident:ident $(< $( $lifetime:lifetime $(: $lifetime_bound:lifetime)? ),* $(,)? $( $generics:ident @@ -1436,7 +1420,7 @@ macro_rules! __pin_project_internal { [$($proj_ref_ident)?] [$($proj_replace_ident)?] [pub(crate)] - [$(#[$attrs])* pub struct $ident] + [$($attrs)* pub struct $ident] [$(< $( $lifetime $(: $lifetime_bound)? ,)* $( $generics @@ -1472,8 +1456,8 @@ macro_rules! __pin_project_internal { [$($proj_mut_ident:ident)?] [$($proj_ref_ident:ident)?] [$($proj_replace_ident:ident)?] + [$($attrs:tt)*] - $(#[$attrs:meta])* $vis:vis struct $ident:ident $(< $( $lifetime:lifetime $(: $lifetime_bound:lifetime)? ),* $(,)? $( $generics:ident @@ -1502,7 +1486,7 @@ macro_rules! __pin_project_internal { [$($proj_ref_ident)?] [$($proj_replace_ident)?] [$vis] - [$(#[$attrs])* $vis struct $ident] + [$($attrs)* $vis struct $ident] [$(< $( $lifetime $(: $lifetime_bound)? ,)* $( $generics @@ -1539,8 +1523,8 @@ macro_rules! __pin_project_internal { [$($proj_mut_ident:ident)?] [$($proj_ref_ident:ident)?] [$($proj_replace_ident:ident)?] + [$($attrs:tt)*] - $(#[$attrs:meta])* pub enum $ident:ident $(< $( $lifetime:lifetime $(: $lifetime_bound:lifetime)? ),* $(,)? $( $generics:ident @@ -1574,7 +1558,7 @@ macro_rules! __pin_project_internal { [$($proj_ref_ident)?] [$($proj_replace_ident)?] [pub(crate)] - [$(#[$attrs])* pub enum $ident] + [$($attrs)* pub enum $ident] [$(< $( $lifetime $(: $lifetime_bound)? ,)* $( $generics @@ -1615,8 +1599,8 @@ macro_rules! __pin_project_internal { [$($proj_mut_ident:ident)?] [$($proj_ref_ident:ident)?] [$($proj_replace_ident:ident)?] + [$($attrs:tt)*] - $(#[$attrs:meta])* $vis:vis enum $ident:ident $(< $( $lifetime:lifetime $(: $lifetime_bound:lifetime)? ),* $(,)? $( $generics:ident @@ -1650,7 +1634,7 @@ macro_rules! __pin_project_internal { [$($proj_ref_ident)?] [$($proj_replace_ident)?] [$vis] - [$(#[$attrs])* $vis enum $ident] + [$($attrs)* $vis enum $ident] [$(< $( $lifetime $(: $lifetime_bound)? ,)* $( $generics diff --git a/vendor/pin-project-lite/tests/auxiliary/mod.rs b/vendor/pin-project-lite/tests/auxiliary/mod.rs index e39037cd1b..1457099160 100644 --- a/vendor/pin-project-lite/tests/auxiliary/mod.rs +++ b/vendor/pin-project-lite/tests/auxiliary/mod.rs @@ -1,6 +1,4 @@ #![allow(dead_code, unused_macros)] -#![allow(box_pointers, unreachable_pub)] -#![allow(clippy::restriction)] macro_rules! assert_unpin { ($ty:ty) => { diff --git a/vendor/pin-project-lite/tests/compiletest.rs b/vendor/pin-project-lite/tests/compiletest.rs index 5a91b20a35..77e913bc44 100644 --- a/vendor/pin-project-lite/tests/compiletest.rs +++ b/vendor/pin-project-lite/tests/compiletest.rs @@ -11,5 +11,5 @@ fn ui() { } let t = trybuild::TestCases::new(); - t.compile_fail("tests/ui/*.rs"); + t.compile_fail("tests/ui/*/*.rs"); } diff --git a/vendor/pin-project-lite/tests/drop_order.rs b/vendor/pin-project-lite/tests/drop_order.rs index d84c324edb..07120ccdb7 100644 --- a/vendor/pin-project-lite/tests/drop_order.rs +++ b/vendor/pin-project-lite/tests/drop_order.rs @@ -2,9 +2,10 @@ // Refs: https://doc.rust-lang.org/reference/destructors.html -use pin_project_lite::pin_project; use std::{cell::Cell, panic, pin::Pin, thread}; +use pin_project_lite::pin_project; + struct D<'a>(&'a Cell, usize); impl Drop for D<'_> { diff --git a/vendor/pin-project-lite/tests/expand/README.md b/vendor/pin-project-lite/tests/expand/README.md new file mode 100644 index 0000000000..1f7dcfbb2e --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/README.md @@ -0,0 +1,17 @@ +# Expansion tests + +Similar to ui tests, but instead of checking the compiler output, this checks +the code generated by macros. + +See [examples](https://github.com/taiki-e/pin-project/tree/HEAD/examples) for +descriptions of what the generated code does, and why it needs to be generated. + +To run this test, run the following command: + +```sh +cargo +nightly test --test expandtest +``` + +Locally, this test updates the files in the `expand` directory if there are +changes to the generated code. If there are any changes to the files in the +`expand` directory after running the test, please commit them. diff --git a/vendor/pin-project-lite/tests/expand/default/enum.expanded.rs b/vendor/pin-project-lite/tests/expand/default/enum.expanded.rs new file mode 100644 index 0000000000..df005aded0 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/default/enum.expanded.rs @@ -0,0 +1,127 @@ +use pin_project_lite::pin_project; +enum Enum { + Struct { pinned: T, unpinned: U }, + Unit, +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::ref_option_ref)] +#[allow(clippy::type_repetition_in_bounds)] +enum EnumProj<'__pin, T, U> +where + Enum: '__pin, +{ + Struct { + pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>, + unpinned: &'__pin mut (U), + }, + Unit, +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::ref_option_ref)] +#[allow(clippy::type_repetition_in_bounds)] +enum EnumProjRef<'__pin, T, U> +where + Enum: '__pin, +{ + Struct { + pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>, + unpinned: &'__pin (U), + }, + Unit, +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::type_repetition_in_bounds)] +enum EnumProjReplace { + Struct { + pinned: ::pin_project_lite::__private::PhantomData, + unpinned: U, + }, + Unit, +} +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::used_underscore_binding)] +const _: () = { + impl Enum { + fn project<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin mut Self>, + ) -> EnumProj<'__pin, T, U> { + unsafe { + match self.get_unchecked_mut() { + Self::Struct { pinned, unpinned } => EnumProj::Struct { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + }, + Self::Unit => EnumProj::Unit, + } + } + } + fn project_ref<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin Self>, + ) -> EnumProjRef<'__pin, T, U> { + unsafe { + match self.get_ref() { + Self::Struct { pinned, unpinned } => EnumProjRef::Struct { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + }, + Self::Unit => EnumProjRef::Unit, + } + } + } + fn project_replace( + self: ::pin_project_lite::__private::Pin<&mut Self>, + replacement: Self, + ) -> EnumProjReplace { + unsafe { + let __self_ptr: *mut Self = self.get_unchecked_mut(); + let __guard = ::pin_project_lite::__private::UnsafeOverwriteGuard { + target: __self_ptr, + value: ::pin_project_lite::__private::ManuallyDrop::new(replacement), + }; + match &mut *__self_ptr { + Self::Struct { pinned, unpinned } => { + let result = EnumProjReplace::Struct { + pinned: ::pin_project_lite::__private::PhantomData, + unpinned: ::pin_project_lite::__private::ptr::read(unpinned), + }; + { + ( + ::pin_project_lite::__private::UnsafeDropInPlaceGuard(pinned), + (), + ); + } + result + } + Self::Unit => EnumProjReplace::Unit, + } + } + } + } + #[allow(non_snake_case)] + struct __Origin<'__pin, T, U> { + __dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>, + Struct: (T, ::pin_project_lite::__private::AlwaysUnpin), + Unit: (), + } + impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum where + __Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin + { + } + trait MustNotImplDrop {} + #[allow(clippy::drop_bounds, drop_bounds)] + impl MustNotImplDrop for T {} + impl MustNotImplDrop for Enum {} +}; +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/default/enum.rs b/vendor/pin-project-lite/tests/expand/default/enum.rs new file mode 100644 index 0000000000..90d6860a81 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/default/enum.rs @@ -0,0 +1,17 @@ +use pin_project_lite::pin_project; + +pin_project! { + #[project = EnumProj] + #[project_ref = EnumProjRef] + #[project_replace = EnumProjReplace] + enum Enum { + Struct { + #[pin] + pinned: T, + unpinned: U, + }, + Unit, + } +} + +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/default/struct.expanded.rs b/vendor/pin-project-lite/tests/expand/default/struct.expanded.rs new file mode 100644 index 0000000000..8ab318cfb8 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/default/struct.expanded.rs @@ -0,0 +1,84 @@ +use pin_project_lite::pin_project; +struct Struct { + pinned: T, + unpinned: U, +} +#[allow(explicit_outlives_requirements)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::used_underscore_binding)] +const _: () = { + #[allow(dead_code)] + #[allow(single_use_lifetimes)] + #[allow(clippy::unknown_clippy_lints)] + #[allow(clippy::mut_mut)] + #[allow(clippy::redundant_pub_crate)] + #[allow(clippy::ref_option_ref)] + #[allow(clippy::type_repetition_in_bounds)] + struct Projection<'__pin, T, U> + where + Struct: '__pin, + { + pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>, + unpinned: &'__pin mut (U), + } + #[allow(dead_code)] + #[allow(single_use_lifetimes)] + #[allow(clippy::unknown_clippy_lints)] + #[allow(clippy::mut_mut)] + #[allow(clippy::redundant_pub_crate)] + #[allow(clippy::ref_option_ref)] + #[allow(clippy::type_repetition_in_bounds)] + struct ProjectionRef<'__pin, T, U> + where + Struct: '__pin, + { + pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>, + unpinned: &'__pin (U), + } + impl Struct { + fn project<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin mut Self>, + ) -> Projection<'__pin, T, U> { + unsafe { + let Self { pinned, unpinned } = self.get_unchecked_mut(); + Projection { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + } + } + } + fn project_ref<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin Self>, + ) -> ProjectionRef<'__pin, T, U> { + unsafe { + let Self { pinned, unpinned } = self.get_ref(); + ProjectionRef { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + } + } + } + } + #[allow(non_snake_case)] + struct __Origin<'__pin, T, U> { + __dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>, + pinned: T, + unpinned: ::pin_project_lite::__private::AlwaysUnpin, + } + impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct where + __Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin + { + } + trait MustNotImplDrop {} + #[allow(clippy::drop_bounds, drop_bounds)] + impl MustNotImplDrop for T {} + impl MustNotImplDrop for Struct {} + #[forbid(unaligned_references, safe_packed_borrows)] + fn __assert_not_repr_packed(this: &Struct) { + let _ = &this.pinned; + let _ = &this.unpinned; + } +}; +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/default/struct.rs b/vendor/pin-project-lite/tests/expand/default/struct.rs new file mode 100644 index 0000000000..e5447c70a6 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/default/struct.rs @@ -0,0 +1,11 @@ +use pin_project_lite::pin_project; + +pin_project! { + struct Struct { + #[pin] + pinned: T, + unpinned: U, + } +} + +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/multifields/enum.expanded.rs b/vendor/pin-project-lite/tests/expand/multifields/enum.expanded.rs new file mode 100644 index 0000000000..a0b17cbea5 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/multifields/enum.expanded.rs @@ -0,0 +1,88 @@ +use pin_project_lite::pin_project; +enum Enum { + Struct { + pinned1: T, + pinned2: T, + unpinned1: U, + unpinned2: U, + }, + Unit, +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::type_repetition_in_bounds)] +enum EnumProjReplace { + Struct { + pinned1: ::pin_project_lite::__private::PhantomData, + pinned2: ::pin_project_lite::__private::PhantomData, + unpinned1: U, + unpinned2: U, + }, + Unit, +} +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::used_underscore_binding)] +const _: () = { + impl Enum { + fn project_replace( + self: ::pin_project_lite::__private::Pin<&mut Self>, + replacement: Self, + ) -> EnumProjReplace { + unsafe { + let __self_ptr: *mut Self = self.get_unchecked_mut(); + let __guard = ::pin_project_lite::__private::UnsafeOverwriteGuard { + target: __self_ptr, + value: ::pin_project_lite::__private::ManuallyDrop::new(replacement), + }; + match &mut *__self_ptr { + Self::Struct { + pinned1, + pinned2, + unpinned1, + unpinned2, + } => { + let result = EnumProjReplace::Struct { + pinned1: ::pin_project_lite::__private::PhantomData, + pinned2: ::pin_project_lite::__private::PhantomData, + unpinned1: ::pin_project_lite::__private::ptr::read(unpinned1), + unpinned2: ::pin_project_lite::__private::ptr::read(unpinned2), + }; + { + ( + ::pin_project_lite::__private::UnsafeDropInPlaceGuard(pinned1), + ::pin_project_lite::__private::UnsafeDropInPlaceGuard(pinned2), + (), + (), + ); + } + result + } + Self::Unit => EnumProjReplace::Unit, + } + } + } + } + #[allow(non_snake_case)] + struct __Origin<'__pin, T, U> { + __dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>, + Struct: ( + T, + T, + ::pin_project_lite::__private::AlwaysUnpin, + ::pin_project_lite::__private::AlwaysUnpin, + ), + Unit: (), + } + impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum where + __Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin + { + } + trait MustNotImplDrop {} + #[allow(clippy::drop_bounds, drop_bounds)] + impl MustNotImplDrop for T {} + impl MustNotImplDrop for Enum {} +}; +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/multifields/enum.rs b/vendor/pin-project-lite/tests/expand/multifields/enum.rs new file mode 100644 index 0000000000..c713362ad6 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/multifields/enum.rs @@ -0,0 +1,18 @@ +use pin_project_lite::pin_project; + +pin_project! { +#[project_replace = EnumProjReplace] +enum Enum { + Struct { + #[pin] + pinned1: T, + #[pin] + pinned2: T, + unpinned1: U, + unpinned2: U, + }, + Unit, +} +} + +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/multifields/struct.expanded.rs b/vendor/pin-project-lite/tests/expand/multifields/struct.expanded.rs new file mode 100644 index 0000000000..638bf563e0 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/multifields/struct.expanded.rs @@ -0,0 +1,152 @@ +use pin_project_lite::pin_project; +struct Struct { + pinned1: T, + pinned2: T, + unpinned1: U, + unpinned2: U, +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::type_repetition_in_bounds)] +struct StructProjReplace { + pinned1: ::pin_project_lite::__private::PhantomData, + pinned2: ::pin_project_lite::__private::PhantomData, + unpinned1: U, + unpinned2: U, +} +#[allow(explicit_outlives_requirements)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::used_underscore_binding)] +const _: () = { + #[allow(dead_code)] + #[allow(single_use_lifetimes)] + #[allow(clippy::unknown_clippy_lints)] + #[allow(clippy::mut_mut)] + #[allow(clippy::redundant_pub_crate)] + #[allow(clippy::ref_option_ref)] + #[allow(clippy::type_repetition_in_bounds)] + struct Projection<'__pin, T, U> + where + Struct: '__pin, + { + pinned1: ::pin_project_lite::__private::Pin<&'__pin mut (T)>, + pinned2: ::pin_project_lite::__private::Pin<&'__pin mut (T)>, + unpinned1: &'__pin mut (U), + unpinned2: &'__pin mut (U), + } + #[allow(dead_code)] + #[allow(single_use_lifetimes)] + #[allow(clippy::unknown_clippy_lints)] + #[allow(clippy::mut_mut)] + #[allow(clippy::redundant_pub_crate)] + #[allow(clippy::ref_option_ref)] + #[allow(clippy::type_repetition_in_bounds)] + struct ProjectionRef<'__pin, T, U> + where + Struct: '__pin, + { + pinned1: ::pin_project_lite::__private::Pin<&'__pin (T)>, + pinned2: ::pin_project_lite::__private::Pin<&'__pin (T)>, + unpinned1: &'__pin (U), + unpinned2: &'__pin (U), + } + impl Struct { + fn project<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin mut Self>, + ) -> Projection<'__pin, T, U> { + unsafe { + let Self { + pinned1, + pinned2, + unpinned1, + unpinned2, + } = self.get_unchecked_mut(); + Projection { + pinned1: ::pin_project_lite::__private::Pin::new_unchecked(pinned1), + pinned2: ::pin_project_lite::__private::Pin::new_unchecked(pinned2), + unpinned1: unpinned1, + unpinned2: unpinned2, + } + } + } + fn project_ref<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin Self>, + ) -> ProjectionRef<'__pin, T, U> { + unsafe { + let Self { + pinned1, + pinned2, + unpinned1, + unpinned2, + } = self.get_ref(); + ProjectionRef { + pinned1: ::pin_project_lite::__private::Pin::new_unchecked(pinned1), + pinned2: ::pin_project_lite::__private::Pin::new_unchecked(pinned2), + unpinned1: unpinned1, + unpinned2: unpinned2, + } + } + } + fn project_replace( + self: ::pin_project_lite::__private::Pin<&mut Self>, + replacement: Self, + ) -> StructProjReplace { + unsafe { + let __self_ptr: *mut Self = self.get_unchecked_mut(); + let __guard = ::pin_project_lite::__private::UnsafeOverwriteGuard { + target: __self_ptr, + value: ::pin_project_lite::__private::ManuallyDrop::new(replacement), + }; + let Self { + pinned1, + pinned2, + unpinned1, + unpinned2, + } = &mut *__self_ptr; + let result = StructProjReplace { + pinned1: ::pin_project_lite::__private::PhantomData, + pinned2: ::pin_project_lite::__private::PhantomData, + unpinned1: ::pin_project_lite::__private::ptr::read(unpinned1), + unpinned2: ::pin_project_lite::__private::ptr::read(unpinned2), + }; + { + ( + ::pin_project_lite::__private::UnsafeDropInPlaceGuard(pinned1), + ::pin_project_lite::__private::UnsafeDropInPlaceGuard(pinned2), + (), + (), + ); + } + result + } + } + } + #[allow(non_snake_case)] + struct __Origin<'__pin, T, U> { + __dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>, + pinned1: T, + pinned2: T, + unpinned1: ::pin_project_lite::__private::AlwaysUnpin, + unpinned2: ::pin_project_lite::__private::AlwaysUnpin, + } + impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct where + __Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin + { + } + trait MustNotImplDrop {} + #[allow(clippy::drop_bounds, drop_bounds)] + impl MustNotImplDrop for T {} + impl MustNotImplDrop for Struct {} + #[forbid(unaligned_references, safe_packed_borrows)] + fn __assert_not_repr_packed(this: &Struct) { + let _ = &this.pinned1; + let _ = &this.pinned2; + let _ = &this.unpinned1; + let _ = &this.unpinned2; + } +}; +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/multifields/struct.rs b/vendor/pin-project-lite/tests/expand/multifields/struct.rs new file mode 100644 index 0000000000..a1d45d168e --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/multifields/struct.rs @@ -0,0 +1,15 @@ +use pin_project_lite::pin_project; + +pin_project! { +#[project_replace = StructProjReplace] +struct Struct { + #[pin] + pinned1: T, + #[pin] + pinned2: T, + unpinned1: U, + unpinned2: U, +} +} + +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/enum-all.expanded.rs b/vendor/pin-project-lite/tests/expand/naming/enum-all.expanded.rs new file mode 100644 index 0000000000..df005aded0 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/enum-all.expanded.rs @@ -0,0 +1,127 @@ +use pin_project_lite::pin_project; +enum Enum { + Struct { pinned: T, unpinned: U }, + Unit, +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::ref_option_ref)] +#[allow(clippy::type_repetition_in_bounds)] +enum EnumProj<'__pin, T, U> +where + Enum: '__pin, +{ + Struct { + pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>, + unpinned: &'__pin mut (U), + }, + Unit, +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::ref_option_ref)] +#[allow(clippy::type_repetition_in_bounds)] +enum EnumProjRef<'__pin, T, U> +where + Enum: '__pin, +{ + Struct { + pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>, + unpinned: &'__pin (U), + }, + Unit, +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::type_repetition_in_bounds)] +enum EnumProjReplace { + Struct { + pinned: ::pin_project_lite::__private::PhantomData, + unpinned: U, + }, + Unit, +} +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::used_underscore_binding)] +const _: () = { + impl Enum { + fn project<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin mut Self>, + ) -> EnumProj<'__pin, T, U> { + unsafe { + match self.get_unchecked_mut() { + Self::Struct { pinned, unpinned } => EnumProj::Struct { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + }, + Self::Unit => EnumProj::Unit, + } + } + } + fn project_ref<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin Self>, + ) -> EnumProjRef<'__pin, T, U> { + unsafe { + match self.get_ref() { + Self::Struct { pinned, unpinned } => EnumProjRef::Struct { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + }, + Self::Unit => EnumProjRef::Unit, + } + } + } + fn project_replace( + self: ::pin_project_lite::__private::Pin<&mut Self>, + replacement: Self, + ) -> EnumProjReplace { + unsafe { + let __self_ptr: *mut Self = self.get_unchecked_mut(); + let __guard = ::pin_project_lite::__private::UnsafeOverwriteGuard { + target: __self_ptr, + value: ::pin_project_lite::__private::ManuallyDrop::new(replacement), + }; + match &mut *__self_ptr { + Self::Struct { pinned, unpinned } => { + let result = EnumProjReplace::Struct { + pinned: ::pin_project_lite::__private::PhantomData, + unpinned: ::pin_project_lite::__private::ptr::read(unpinned), + }; + { + ( + ::pin_project_lite::__private::UnsafeDropInPlaceGuard(pinned), + (), + ); + } + result + } + Self::Unit => EnumProjReplace::Unit, + } + } + } + } + #[allow(non_snake_case)] + struct __Origin<'__pin, T, U> { + __dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>, + Struct: (T, ::pin_project_lite::__private::AlwaysUnpin), + Unit: (), + } + impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum where + __Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin + { + } + trait MustNotImplDrop {} + #[allow(clippy::drop_bounds, drop_bounds)] + impl MustNotImplDrop for T {} + impl MustNotImplDrop for Enum {} +}; +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/enum-all.rs b/vendor/pin-project-lite/tests/expand/naming/enum-all.rs new file mode 100644 index 0000000000..90d6860a81 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/enum-all.rs @@ -0,0 +1,17 @@ +use pin_project_lite::pin_project; + +pin_project! { + #[project = EnumProj] + #[project_ref = EnumProjRef] + #[project_replace = EnumProjReplace] + enum Enum { + Struct { + #[pin] + pinned: T, + unpinned: U, + }, + Unit, + } +} + +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/enum-mut.expanded.rs b/vendor/pin-project-lite/tests/expand/naming/enum-mut.expanded.rs new file mode 100644 index 0000000000..7c4d6afbf9 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/enum-mut.expanded.rs @@ -0,0 +1,57 @@ +use pin_project_lite::pin_project; +enum Enum { + Struct { pinned: T, unpinned: U }, + Unit, +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::ref_option_ref)] +#[allow(clippy::type_repetition_in_bounds)] +enum EnumProj<'__pin, T, U> +where + Enum: '__pin, +{ + Struct { + pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>, + unpinned: &'__pin mut (U), + }, + Unit, +} +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::used_underscore_binding)] +const _: () = { + impl Enum { + fn project<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin mut Self>, + ) -> EnumProj<'__pin, T, U> { + unsafe { + match self.get_unchecked_mut() { + Self::Struct { pinned, unpinned } => EnumProj::Struct { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + }, + Self::Unit => EnumProj::Unit, + } + } + } + } + #[allow(non_snake_case)] + struct __Origin<'__pin, T, U> { + __dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>, + Struct: (T, ::pin_project_lite::__private::AlwaysUnpin), + Unit: (), + } + impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum where + __Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin + { + } + trait MustNotImplDrop {} + #[allow(clippy::drop_bounds, drop_bounds)] + impl MustNotImplDrop for T {} + impl MustNotImplDrop for Enum {} +}; +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/enum-mut.rs b/vendor/pin-project-lite/tests/expand/naming/enum-mut.rs new file mode 100644 index 0000000000..69beecd1d9 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/enum-mut.rs @@ -0,0 +1,15 @@ +use pin_project_lite::pin_project; + +pin_project! { + #[project = EnumProj] + enum Enum { + Struct { + #[pin] + pinned: T, + unpinned: U, + }, + Unit, + } +} + +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/enum-none.expanded.rs b/vendor/pin-project-lite/tests/expand/naming/enum-none.expanded.rs new file mode 100644 index 0000000000..28ce97da7b --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/enum-none.expanded.rs @@ -0,0 +1,26 @@ +use pin_project_lite::pin_project; +enum Enum { + Struct { pinned: T, unpinned: U }, + Unit, +} +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::used_underscore_binding)] +const _: () = { + impl Enum {} + #[allow(non_snake_case)] + struct __Origin<'__pin, T, U> { + __dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>, + Struct: (T, ::pin_project_lite::__private::AlwaysUnpin), + Unit: (), + } + impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum where + __Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin + { + } + trait MustNotImplDrop {} + #[allow(clippy::drop_bounds, drop_bounds)] + impl MustNotImplDrop for T {} + impl MustNotImplDrop for Enum {} +}; +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/enum-none.rs b/vendor/pin-project-lite/tests/expand/naming/enum-none.rs new file mode 100644 index 0000000000..b2e3f9d76a --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/enum-none.rs @@ -0,0 +1,14 @@ +use pin_project_lite::pin_project; + +pin_project! { + enum Enum { + Struct { + #[pin] + pinned: T, + unpinned: U, + }, + Unit, + } +} + +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/enum-ref.expanded.rs b/vendor/pin-project-lite/tests/expand/naming/enum-ref.expanded.rs new file mode 100644 index 0000000000..a1a013bda4 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/enum-ref.expanded.rs @@ -0,0 +1,57 @@ +use pin_project_lite::pin_project; +enum Enum { + Struct { pinned: T, unpinned: U }, + Unit, +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::ref_option_ref)] +#[allow(clippy::type_repetition_in_bounds)] +enum EnumProjRef<'__pin, T, U> +where + Enum: '__pin, +{ + Struct { + pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>, + unpinned: &'__pin (U), + }, + Unit, +} +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::used_underscore_binding)] +const _: () = { + impl Enum { + fn project_ref<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin Self>, + ) -> EnumProjRef<'__pin, T, U> { + unsafe { + match self.get_ref() { + Self::Struct { pinned, unpinned } => EnumProjRef::Struct { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + }, + Self::Unit => EnumProjRef::Unit, + } + } + } + } + #[allow(non_snake_case)] + struct __Origin<'__pin, T, U> { + __dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>, + Struct: (T, ::pin_project_lite::__private::AlwaysUnpin), + Unit: (), + } + impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum where + __Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin + { + } + trait MustNotImplDrop {} + #[allow(clippy::drop_bounds, drop_bounds)] + impl MustNotImplDrop for T {} + impl MustNotImplDrop for Enum {} +}; +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/enum-ref.rs b/vendor/pin-project-lite/tests/expand/naming/enum-ref.rs new file mode 100644 index 0000000000..480d592d68 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/enum-ref.rs @@ -0,0 +1,15 @@ +use pin_project_lite::pin_project; + +pin_project! { + #[project_ref = EnumProjRef] + enum Enum { + Struct { + #[pin] + pinned: T, + unpinned: U, + }, + Unit, + } +} + +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/struct-all.expanded.rs b/vendor/pin-project-lite/tests/expand/naming/struct-all.expanded.rs new file mode 100644 index 0000000000..5d2f135322 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/struct-all.expanded.rs @@ -0,0 +1,117 @@ +use pin_project_lite::pin_project; +struct Struct { + pinned: T, + unpinned: U, +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::ref_option_ref)] +#[allow(clippy::type_repetition_in_bounds)] +struct StructProj<'__pin, T, U> +where + Struct: '__pin, +{ + pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>, + unpinned: &'__pin mut (U), +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::ref_option_ref)] +#[allow(clippy::type_repetition_in_bounds)] +struct StructProjRef<'__pin, T, U> +where + Struct: '__pin, +{ + pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>, + unpinned: &'__pin (U), +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::type_repetition_in_bounds)] +struct StructProjReplace { + pinned: ::pin_project_lite::__private::PhantomData, + unpinned: U, +} +#[allow(explicit_outlives_requirements)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::used_underscore_binding)] +const _: () = { + impl Struct { + fn project<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin mut Self>, + ) -> StructProj<'__pin, T, U> { + unsafe { + let Self { pinned, unpinned } = self.get_unchecked_mut(); + StructProj { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + } + } + } + fn project_ref<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin Self>, + ) -> StructProjRef<'__pin, T, U> { + unsafe { + let Self { pinned, unpinned } = self.get_ref(); + StructProjRef { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + } + } + } + fn project_replace( + self: ::pin_project_lite::__private::Pin<&mut Self>, + replacement: Self, + ) -> StructProjReplace { + unsafe { + let __self_ptr: *mut Self = self.get_unchecked_mut(); + let __guard = ::pin_project_lite::__private::UnsafeOverwriteGuard { + target: __self_ptr, + value: ::pin_project_lite::__private::ManuallyDrop::new(replacement), + }; + let Self { pinned, unpinned } = &mut *__self_ptr; + let result = StructProjReplace { + pinned: ::pin_project_lite::__private::PhantomData, + unpinned: ::pin_project_lite::__private::ptr::read(unpinned), + }; + { + ( + ::pin_project_lite::__private::UnsafeDropInPlaceGuard(pinned), + (), + ); + } + result + } + } + } + #[allow(non_snake_case)] + struct __Origin<'__pin, T, U> { + __dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>, + pinned: T, + unpinned: ::pin_project_lite::__private::AlwaysUnpin, + } + impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct where + __Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin + { + } + trait MustNotImplDrop {} + #[allow(clippy::drop_bounds, drop_bounds)] + impl MustNotImplDrop for T {} + impl MustNotImplDrop for Struct {} + #[forbid(unaligned_references, safe_packed_borrows)] + fn __assert_not_repr_packed(this: &Struct) { + let _ = &this.pinned; + let _ = &this.unpinned; + } +}; +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/struct-all.rs b/vendor/pin-project-lite/tests/expand/naming/struct-all.rs new file mode 100644 index 0000000000..cb087530fe --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/struct-all.rs @@ -0,0 +1,14 @@ +use pin_project_lite::pin_project; + +pin_project! { + #[project = StructProj] + #[project_ref = StructProjRef] + #[project_replace = StructProjReplace] + struct Struct { + #[pin] + pinned: T, + unpinned: U, + } +} + +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/struct-mut.expanded.rs b/vendor/pin-project-lite/tests/expand/naming/struct-mut.expanded.rs new file mode 100644 index 0000000000..aaa41cd080 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/struct-mut.expanded.rs @@ -0,0 +1,84 @@ +use pin_project_lite::pin_project; +struct Struct { + pinned: T, + unpinned: U, +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::ref_option_ref)] +#[allow(clippy::type_repetition_in_bounds)] +struct StructProj<'__pin, T, U> +where + Struct: '__pin, +{ + pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>, + unpinned: &'__pin mut (U), +} +#[allow(explicit_outlives_requirements)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::used_underscore_binding)] +const _: () = { + #[allow(dead_code)] + #[allow(single_use_lifetimes)] + #[allow(clippy::unknown_clippy_lints)] + #[allow(clippy::mut_mut)] + #[allow(clippy::redundant_pub_crate)] + #[allow(clippy::ref_option_ref)] + #[allow(clippy::type_repetition_in_bounds)] + struct ProjectionRef<'__pin, T, U> + where + Struct: '__pin, + { + pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>, + unpinned: &'__pin (U), + } + impl Struct { + fn project<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin mut Self>, + ) -> StructProj<'__pin, T, U> { + unsafe { + let Self { pinned, unpinned } = self.get_unchecked_mut(); + StructProj { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + } + } + } + fn project_ref<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin Self>, + ) -> ProjectionRef<'__pin, T, U> { + unsafe { + let Self { pinned, unpinned } = self.get_ref(); + ProjectionRef { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + } + } + } + } + #[allow(non_snake_case)] + struct __Origin<'__pin, T, U> { + __dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>, + pinned: T, + unpinned: ::pin_project_lite::__private::AlwaysUnpin, + } + impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct where + __Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin + { + } + trait MustNotImplDrop {} + #[allow(clippy::drop_bounds, drop_bounds)] + impl MustNotImplDrop for T {} + impl MustNotImplDrop for Struct {} + #[forbid(unaligned_references, safe_packed_borrows)] + fn __assert_not_repr_packed(this: &Struct) { + let _ = &this.pinned; + let _ = &this.unpinned; + } +}; +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/struct-mut.rs b/vendor/pin-project-lite/tests/expand/naming/struct-mut.rs new file mode 100644 index 0000000000..59db44530a --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/struct-mut.rs @@ -0,0 +1,12 @@ +use pin_project_lite::pin_project; + +pin_project! { + #[project = StructProj] + struct Struct { + #[pin] + pinned: T, + unpinned: U, + } +} + +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/struct-none.expanded.rs b/vendor/pin-project-lite/tests/expand/naming/struct-none.expanded.rs new file mode 100644 index 0000000000..8ab318cfb8 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/struct-none.expanded.rs @@ -0,0 +1,84 @@ +use pin_project_lite::pin_project; +struct Struct { + pinned: T, + unpinned: U, +} +#[allow(explicit_outlives_requirements)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::used_underscore_binding)] +const _: () = { + #[allow(dead_code)] + #[allow(single_use_lifetimes)] + #[allow(clippy::unknown_clippy_lints)] + #[allow(clippy::mut_mut)] + #[allow(clippy::redundant_pub_crate)] + #[allow(clippy::ref_option_ref)] + #[allow(clippy::type_repetition_in_bounds)] + struct Projection<'__pin, T, U> + where + Struct: '__pin, + { + pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>, + unpinned: &'__pin mut (U), + } + #[allow(dead_code)] + #[allow(single_use_lifetimes)] + #[allow(clippy::unknown_clippy_lints)] + #[allow(clippy::mut_mut)] + #[allow(clippy::redundant_pub_crate)] + #[allow(clippy::ref_option_ref)] + #[allow(clippy::type_repetition_in_bounds)] + struct ProjectionRef<'__pin, T, U> + where + Struct: '__pin, + { + pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>, + unpinned: &'__pin (U), + } + impl Struct { + fn project<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin mut Self>, + ) -> Projection<'__pin, T, U> { + unsafe { + let Self { pinned, unpinned } = self.get_unchecked_mut(); + Projection { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + } + } + } + fn project_ref<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin Self>, + ) -> ProjectionRef<'__pin, T, U> { + unsafe { + let Self { pinned, unpinned } = self.get_ref(); + ProjectionRef { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + } + } + } + } + #[allow(non_snake_case)] + struct __Origin<'__pin, T, U> { + __dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>, + pinned: T, + unpinned: ::pin_project_lite::__private::AlwaysUnpin, + } + impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct where + __Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin + { + } + trait MustNotImplDrop {} + #[allow(clippy::drop_bounds, drop_bounds)] + impl MustNotImplDrop for T {} + impl MustNotImplDrop for Struct {} + #[forbid(unaligned_references, safe_packed_borrows)] + fn __assert_not_repr_packed(this: &Struct) { + let _ = &this.pinned; + let _ = &this.unpinned; + } +}; +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/struct-none.rs b/vendor/pin-project-lite/tests/expand/naming/struct-none.rs new file mode 100644 index 0000000000..e5447c70a6 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/struct-none.rs @@ -0,0 +1,11 @@ +use pin_project_lite::pin_project; + +pin_project! { + struct Struct { + #[pin] + pinned: T, + unpinned: U, + } +} + +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/struct-ref.expanded.rs b/vendor/pin-project-lite/tests/expand/naming/struct-ref.expanded.rs new file mode 100644 index 0000000000..3d97ab8fae --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/struct-ref.expanded.rs @@ -0,0 +1,84 @@ +use pin_project_lite::pin_project; +struct Struct { + pinned: T, + unpinned: U, +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::ref_option_ref)] +#[allow(clippy::type_repetition_in_bounds)] +struct StructProjRef<'__pin, T, U> +where + Struct: '__pin, +{ + pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>, + unpinned: &'__pin (U), +} +#[allow(explicit_outlives_requirements)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::used_underscore_binding)] +const _: () = { + #[allow(dead_code)] + #[allow(single_use_lifetimes)] + #[allow(clippy::unknown_clippy_lints)] + #[allow(clippy::mut_mut)] + #[allow(clippy::redundant_pub_crate)] + #[allow(clippy::ref_option_ref)] + #[allow(clippy::type_repetition_in_bounds)] + struct Projection<'__pin, T, U> + where + Struct: '__pin, + { + pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>, + unpinned: &'__pin mut (U), + } + impl Struct { + fn project<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin mut Self>, + ) -> Projection<'__pin, T, U> { + unsafe { + let Self { pinned, unpinned } = self.get_unchecked_mut(); + Projection { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + } + } + } + fn project_ref<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin Self>, + ) -> StructProjRef<'__pin, T, U> { + unsafe { + let Self { pinned, unpinned } = self.get_ref(); + StructProjRef { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + } + } + } + } + #[allow(non_snake_case)] + struct __Origin<'__pin, T, U> { + __dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>, + pinned: T, + unpinned: ::pin_project_lite::__private::AlwaysUnpin, + } + impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct where + __Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin + { + } + trait MustNotImplDrop {} + #[allow(clippy::drop_bounds, drop_bounds)] + impl MustNotImplDrop for T {} + impl MustNotImplDrop for Struct {} + #[forbid(unaligned_references, safe_packed_borrows)] + fn __assert_not_repr_packed(this: &Struct) { + let _ = &this.pinned; + let _ = &this.unpinned; + } +}; +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/naming/struct-ref.rs b/vendor/pin-project-lite/tests/expand/naming/struct-ref.rs new file mode 100644 index 0000000000..6821af8274 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/naming/struct-ref.rs @@ -0,0 +1,12 @@ +use pin_project_lite::pin_project; + +pin_project! { + #[project_ref = StructProjRef] + struct Struct { + #[pin] + pinned: T, + unpinned: U, + } +} + +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/pub/enum.expanded.rs b/vendor/pin-project-lite/tests/expand/pub/enum.expanded.rs new file mode 100644 index 0000000000..6f190cba08 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/pub/enum.expanded.rs @@ -0,0 +1,87 @@ +use pin_project_lite::pin_project; +pub enum Enum { + Struct { pinned: T, unpinned: U }, + Unit, +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::ref_option_ref)] +#[allow(clippy::type_repetition_in_bounds)] +pub(crate) enum EnumProj<'__pin, T, U> +where + Enum: '__pin, +{ + Struct { + pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>, + unpinned: &'__pin mut (U), + }, + Unit, +} +#[allow(dead_code)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::mut_mut)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::ref_option_ref)] +#[allow(clippy::type_repetition_in_bounds)] +pub(crate) enum EnumProjRef<'__pin, T, U> +where + Enum: '__pin, +{ + Struct { + pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>, + unpinned: &'__pin (U), + }, + Unit, +} +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::used_underscore_binding)] +const _: () = { + impl Enum { + pub(crate) fn project<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin mut Self>, + ) -> EnumProj<'__pin, T, U> { + unsafe { + match self.get_unchecked_mut() { + Self::Struct { pinned, unpinned } => EnumProj::Struct { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + }, + Self::Unit => EnumProj::Unit, + } + } + } + pub(crate) fn project_ref<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin Self>, + ) -> EnumProjRef<'__pin, T, U> { + unsafe { + match self.get_ref() { + Self::Struct { pinned, unpinned } => EnumProjRef::Struct { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + }, + Self::Unit => EnumProjRef::Unit, + } + } + } + } + #[allow(non_snake_case)] + pub struct __Origin<'__pin, T, U> { + __dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>, + Struct: (T, ::pin_project_lite::__private::AlwaysUnpin), + Unit: (), + } + impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Enum where + __Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin + { + } + trait MustNotImplDrop {} + #[allow(clippy::drop_bounds, drop_bounds)] + impl MustNotImplDrop for T {} + impl MustNotImplDrop for Enum {} +}; +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/pub/enum.rs b/vendor/pin-project-lite/tests/expand/pub/enum.rs new file mode 100644 index 0000000000..d3968afdf2 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/pub/enum.rs @@ -0,0 +1,16 @@ +use pin_project_lite::pin_project; + +pin_project! { + #[project = EnumProj] + #[project_ref = EnumProjRef] + pub enum Enum { + Struct { + #[pin] + pinned: T, + unpinned: U, + }, + Unit, + } +} + +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/pub/struct.expanded.rs b/vendor/pin-project-lite/tests/expand/pub/struct.expanded.rs new file mode 100644 index 0000000000..7b5826d149 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/pub/struct.expanded.rs @@ -0,0 +1,84 @@ +use pin_project_lite::pin_project; +pub struct Struct { + pub pinned: T, + pub unpinned: U, +} +#[allow(explicit_outlives_requirements)] +#[allow(single_use_lifetimes)] +#[allow(clippy::unknown_clippy_lints)] +#[allow(clippy::redundant_pub_crate)] +#[allow(clippy::used_underscore_binding)] +const _: () = { + #[allow(dead_code)] + #[allow(single_use_lifetimes)] + #[allow(clippy::unknown_clippy_lints)] + #[allow(clippy::mut_mut)] + #[allow(clippy::redundant_pub_crate)] + #[allow(clippy::ref_option_ref)] + #[allow(clippy::type_repetition_in_bounds)] + pub(crate) struct Projection<'__pin, T, U> + where + Struct: '__pin, + { + pub pinned: ::pin_project_lite::__private::Pin<&'__pin mut (T)>, + pub unpinned: &'__pin mut (U), + } + #[allow(dead_code)] + #[allow(single_use_lifetimes)] + #[allow(clippy::unknown_clippy_lints)] + #[allow(clippy::mut_mut)] + #[allow(clippy::redundant_pub_crate)] + #[allow(clippy::ref_option_ref)] + #[allow(clippy::type_repetition_in_bounds)] + pub(crate) struct ProjectionRef<'__pin, T, U> + where + Struct: '__pin, + { + pub pinned: ::pin_project_lite::__private::Pin<&'__pin (T)>, + pub unpinned: &'__pin (U), + } + impl Struct { + pub(crate) fn project<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin mut Self>, + ) -> Projection<'__pin, T, U> { + unsafe { + let Self { pinned, unpinned } = self.get_unchecked_mut(); + Projection { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + } + } + } + pub(crate) fn project_ref<'__pin>( + self: ::pin_project_lite::__private::Pin<&'__pin Self>, + ) -> ProjectionRef<'__pin, T, U> { + unsafe { + let Self { pinned, unpinned } = self.get_ref(); + ProjectionRef { + pinned: ::pin_project_lite::__private::Pin::new_unchecked(pinned), + unpinned: unpinned, + } + } + } + } + #[allow(non_snake_case)] + pub struct __Origin<'__pin, T, U> { + __dummy_lifetime: ::pin_project_lite::__private::PhantomData<&'__pin ()>, + pinned: T, + unpinned: ::pin_project_lite::__private::AlwaysUnpin, + } + impl<'__pin, T, U> ::pin_project_lite::__private::Unpin for Struct where + __Origin<'__pin, T, U>: ::pin_project_lite::__private::Unpin + { + } + trait MustNotImplDrop {} + #[allow(clippy::drop_bounds, drop_bounds)] + impl MustNotImplDrop for T {} + impl MustNotImplDrop for Struct {} + #[forbid(unaligned_references, safe_packed_borrows)] + fn __assert_not_repr_packed(this: &Struct) { + let _ = &this.pinned; + let _ = &this.unpinned; + } +}; +fn main() {} diff --git a/vendor/pin-project-lite/tests/expand/pub/struct.rs b/vendor/pin-project-lite/tests/expand/pub/struct.rs new file mode 100644 index 0000000000..6659096909 --- /dev/null +++ b/vendor/pin-project-lite/tests/expand/pub/struct.rs @@ -0,0 +1,11 @@ +use pin_project_lite::pin_project; + +pin_project! { + pub struct Struct { + #[pin] + pub pinned: T, + pub unpinned: U, + } +} + +fn main() {} diff --git a/vendor/pin-project-lite/tests/expandtest.rs b/vendor/pin-project-lite/tests/expandtest.rs new file mode 100644 index 0000000000..adf8dde40e --- /dev/null +++ b/vendor/pin-project-lite/tests/expandtest.rs @@ -0,0 +1,41 @@ +#![cfg(not(miri))] +#![warn(rust_2018_idioms, single_use_lifetimes)] + +use std::{ + env, + process::{Command, ExitStatus, Stdio}, +}; + +#[rustversion::attr(not(nightly), ignore)] +#[test] +fn expandtest() { + let is_ci = env::var_os("CI").is_some(); + let cargo = &*env::var("CARGO").unwrap_or_else(|_| "cargo".into()); + if !has_command(&[cargo, "expand"]) || !has_command(&[cargo, "fmt"]) { + if is_ci { + panic!("expandtest requires rustfmt and cargo-expand") + } + return; + } + + let path = "tests/expand/*/*.rs"; + if is_ci { + macrotest::expand_without_refresh(path); + } else { + env::set_var("MACROTEST", "overwrite"); + macrotest::expand(path); + } +} + +fn has_command(command: &[&str]) -> bool { + Command::new(command[0]) + .args(&command[1..]) + .arg("--version") + .stdin(Stdio::null()) + .stdout(Stdio::null()) + .stderr(Stdio::null()) + .status() + .as_ref() + .map(ExitStatus::success) + .unwrap_or(false) +} diff --git a/vendor/pin-project-lite/tests/lint.rs b/vendor/pin-project-lite/tests/lint.rs index 46ec1dfc77..381bb18cc8 100644 --- a/vendor/pin-project-lite/tests/lint.rs +++ b/vendor/pin-project-lite/tests/lint.rs @@ -7,10 +7,12 @@ #![warn( box_pointers, deprecated_in_future, + disjoint_capture_drop_reorder, elided_lifetimes_in_paths, explicit_outlives_requirements, macro_use_extern_crate, meta_variable_misuse, + missing_abi, missing_copy_implementations, missing_crate_level_docs, missing_debug_implementations, @@ -28,7 +30,7 @@ unused_results, variant_size_differences )] -// absolute_paths_not_starting_with_crate, anonymous_parameters, keyword_idents, pointer_structural_match: forbidden as a part of future_incompatible +// absolute_paths_not_starting_with_crate, anonymous_parameters, keyword_idents, pointer_structural_match, semicolon_in_expressions_from_macros: forbidden as a part of future_incompatible // missing_doc_code_examples, private_doc_tests, invalid_html_tags: warned as a part of rustdoc // unsafe_block_in_unsafe_fn: unstable // unsafe_code: forbidden @@ -37,6 +39,7 @@ #![warn(clippy::all, clippy::pedantic, clippy::nursery)] #![warn(clippy::restriction)] #![allow(clippy::blanket_clippy_restriction_lints)] // this is a test, so enable all restriction lints intentionally. +#![allow(clippy::exhaustive_structs, clippy::exhaustive_enums)] // TODO // Check interoperability with rustc and clippy lints. diff --git a/vendor/pin-project-lite/tests/proper_unpin.rs b/vendor/pin-project-lite/tests/proper_unpin.rs index b1c72c14f3..668e975ba9 100644 --- a/vendor/pin-project-lite/tests/proper_unpin.rs +++ b/vendor/pin-project-lite/tests/proper_unpin.rs @@ -5,9 +5,10 @@ mod auxiliary; pub mod default { - use pin_project_lite::pin_project; use std::marker::PhantomPinned; + use pin_project_lite::pin_project; + struct Inner { f: T, } diff --git a/vendor/pin-project-lite/tests/test.rs b/vendor/pin-project-lite/tests/test.rs index f4c29ee5ef..d792bab46c 100644 --- a/vendor/pin-project-lite/tests/test.rs +++ b/vendor/pin-project-lite/tests/test.rs @@ -8,6 +8,7 @@ use core::{ marker::{PhantomData, PhantomPinned}, pin::Pin, }; + use pin_project_lite::pin_project; #[test] @@ -586,6 +587,21 @@ fn trailing_comma() { #[test] fn attrs() { + pin_project! { + /// dox1 + #[derive(Clone)] + #[project = StructProj] + #[project_ref = StructProjRef] + /// dox2 + #[derive(Debug)] + /// dox3 + struct Struct { + // TODO + // /// dox4 + f: () + } + } + pin_project! { #[project = Enum1Proj] #[project_ref = Enum1ProjRef] @@ -599,6 +615,7 @@ fn attrs() { pin_project! { /// dox1 + #[derive(Clone)] #[project = Enum2Proj] #[project_ref = Enum2ProjRef] /// dox2 diff --git a/vendor/pin-project-lite/tests/ui/packed.rs b/vendor/pin-project-lite/tests/ui/packed.rs deleted file mode 100644 index 0bccc1f216..0000000000 --- a/vendor/pin-project-lite/tests/ui/packed.rs +++ /dev/null @@ -1,19 +0,0 @@ -use pin_project_lite::pin_project; - -pin_project! { //~ ERROR borrow of packed field is unsafe and requires unsafe function or block - #[repr(packed, C)] - struct A { - #[pin] - field: u16, - } -} - -pin_project! { //~ ERROR borrow of packed field is unsafe and requires unsafe function or block - #[repr(packed(2))] - struct C { - #[pin] - field: u32, - } -} - -fn main() {} diff --git a/vendor/pin-project-lite/tests/ui/packed.stderr b/vendor/pin-project-lite/tests/ui/packed.stderr deleted file mode 100644 index a976163512..0000000000 --- a/vendor/pin-project-lite/tests/ui/packed.stderr +++ /dev/null @@ -1,55 +0,0 @@ -error: borrow of packed field is unsafe and requires unsafe function or block (error E0133) - --> $DIR/packed.rs:3:1 - | -3 | / pin_project! { //~ ERROR borrow of packed field is unsafe and requires unsafe function or block -4 | | #[repr(packed, C)] -5 | | struct A { -6 | | #[pin] -7 | | field: u16, -8 | | } -9 | | } - | |_^ - | -note: the lint level is defined here - --> $DIR/packed.rs:3:1 - | -3 | / pin_project! { //~ ERROR borrow of packed field is unsafe and requires unsafe function or block -4 | | #[repr(packed, C)] -5 | | struct A { -6 | | #[pin] -7 | | field: u16, -8 | | } -9 | | } - | |_^ - = 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 #46043 - = note: fields of packed structs might be misaligned: dereferencing a misaligned pointer or even just creating a misaligned reference is undefined behavior - = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) - -error: borrow of packed field is unsafe and requires unsafe function or block (error E0133) - --> $DIR/packed.rs:11:1 - | -11 | / pin_project! { //~ ERROR borrow of packed field is unsafe and requires unsafe function or block -12 | | #[repr(packed(2))] -13 | | struct C { -14 | | #[pin] -15 | | field: u32, -16 | | } -17 | | } - | |_^ - | -note: the lint level is defined here - --> $DIR/packed.rs:11:1 - | -11 | / pin_project! { //~ ERROR borrow of packed field is unsafe and requires unsafe function or block -12 | | #[repr(packed(2))] -13 | | struct C { -14 | | #[pin] -15 | | field: u32, -16 | | } -17 | | } - | |_^ - = 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 #46043 - = note: fields of packed structs might be misaligned: dereferencing a misaligned pointer or even just creating a misaligned reference is undefined behavior - = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/vendor/pin-project-lite/tests/ui/conflict-drop.rs b/vendor/pin-project-lite/tests/ui/pin_project/conflict-drop.rs similarity index 100% rename from vendor/pin-project-lite/tests/ui/conflict-drop.rs rename to vendor/pin-project-lite/tests/ui/pin_project/conflict-drop.rs diff --git a/vendor/pin-project-lite/tests/ui/conflict-drop.stderr b/vendor/pin-project-lite/tests/ui/pin_project/conflict-drop.stderr similarity index 100% rename from vendor/pin-project-lite/tests/ui/conflict-drop.stderr rename to vendor/pin-project-lite/tests/ui/pin_project/conflict-drop.stderr diff --git a/vendor/pin-project-lite/tests/ui/conflict-unpin.rs b/vendor/pin-project-lite/tests/ui/pin_project/conflict-unpin.rs similarity index 100% rename from vendor/pin-project-lite/tests/ui/conflict-unpin.rs rename to vendor/pin-project-lite/tests/ui/pin_project/conflict-unpin.rs diff --git a/vendor/pin-project-lite/tests/ui/conflict-unpin.stderr b/vendor/pin-project-lite/tests/ui/pin_project/conflict-unpin.stderr similarity index 100% rename from vendor/pin-project-lite/tests/ui/conflict-unpin.stderr rename to vendor/pin-project-lite/tests/ui/pin_project/conflict-unpin.stderr diff --git a/vendor/pin-project-lite/tests/ui/invalid-bounds.rs b/vendor/pin-project-lite/tests/ui/pin_project/invalid-bounds.rs similarity index 100% rename from vendor/pin-project-lite/tests/ui/invalid-bounds.rs rename to vendor/pin-project-lite/tests/ui/pin_project/invalid-bounds.rs diff --git a/vendor/pin-project-lite/tests/ui/invalid-bounds.stderr b/vendor/pin-project-lite/tests/ui/pin_project/invalid-bounds.stderr similarity index 100% rename from vendor/pin-project-lite/tests/ui/invalid-bounds.stderr rename to vendor/pin-project-lite/tests/ui/pin_project/invalid-bounds.stderr diff --git a/vendor/pin-project-lite/tests/ui/invalid.rs b/vendor/pin-project-lite/tests/ui/pin_project/invalid.rs similarity index 100% rename from vendor/pin-project-lite/tests/ui/invalid.rs rename to vendor/pin-project-lite/tests/ui/pin_project/invalid.rs diff --git a/vendor/pin-project-lite/tests/ui/invalid.stderr b/vendor/pin-project-lite/tests/ui/pin_project/invalid.stderr similarity index 100% rename from vendor/pin-project-lite/tests/ui/invalid.stderr rename to vendor/pin-project-lite/tests/ui/pin_project/invalid.stderr diff --git a/vendor/pin-project-lite/tests/ui/overlapping_lifetime_names.rs b/vendor/pin-project-lite/tests/ui/pin_project/overlapping_lifetime_names.rs similarity index 100% rename from vendor/pin-project-lite/tests/ui/overlapping_lifetime_names.rs rename to vendor/pin-project-lite/tests/ui/pin_project/overlapping_lifetime_names.rs diff --git a/vendor/pin-project-lite/tests/ui/overlapping_lifetime_names.stderr b/vendor/pin-project-lite/tests/ui/pin_project/overlapping_lifetime_names.stderr similarity index 100% rename from vendor/pin-project-lite/tests/ui/overlapping_lifetime_names.stderr rename to vendor/pin-project-lite/tests/ui/pin_project/overlapping_lifetime_names.stderr diff --git a/vendor/pin-project-lite/tests/ui/overlapping_unpin_struct.rs b/vendor/pin-project-lite/tests/ui/pin_project/overlapping_unpin_struct.rs similarity index 100% rename from vendor/pin-project-lite/tests/ui/overlapping_unpin_struct.rs rename to vendor/pin-project-lite/tests/ui/pin_project/overlapping_unpin_struct.rs diff --git a/vendor/pin-project-lite/tests/ui/overlapping_unpin_struct.stderr b/vendor/pin-project-lite/tests/ui/pin_project/overlapping_unpin_struct.stderr similarity index 100% rename from vendor/pin-project-lite/tests/ui/overlapping_unpin_struct.stderr rename to vendor/pin-project-lite/tests/ui/pin_project/overlapping_unpin_struct.stderr diff --git a/vendor/pin-project-lite/tests/ui/pin_project/packed.rs b/vendor/pin-project-lite/tests/ui/pin_project/packed.rs new file mode 100644 index 0000000000..507a0385fb --- /dev/null +++ b/vendor/pin-project-lite/tests/ui/pin_project/packed.rs @@ -0,0 +1,19 @@ +use pin_project_lite::pin_project; + +pin_project! { //~ ERROR reference to packed field is unaligned + #[repr(packed, C)] + struct Packed { + #[pin] + field: u16, + } +} + +pin_project! { //~ ERROR reference to packed field is unaligned + #[repr(packed(2))] + struct PackedN { + #[pin] + field: u32, + } +} + +fn main() {} diff --git a/vendor/pin-project-lite/tests/ui/pin_project/packed.stderr b/vendor/pin-project-lite/tests/ui/pin_project/packed.stderr new file mode 100644 index 0000000000..14ffc86d42 --- /dev/null +++ b/vendor/pin-project-lite/tests/ui/pin_project/packed.stderr @@ -0,0 +1,107 @@ +error: reference to packed field is unaligned + --> $DIR/packed.rs:3:1 + | +3 | / pin_project! { //~ ERROR reference to packed field is unaligned +4 | | #[repr(packed, C)] +5 | | struct Packed { +6 | | #[pin] +7 | | field: u16, +8 | | } +9 | | } + | |_^ + | +note: the lint level is defined here + --> $DIR/packed.rs:3:1 + | +3 | / pin_project! { //~ ERROR reference to packed field is unaligned +4 | | #[repr(packed, C)] +5 | | struct Packed { +6 | | #[pin] +7 | | field: u16, +8 | | } +9 | | } + | |_^ + = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error: reference to packed field is unaligned + --> $DIR/packed.rs:11:1 + | +11 | / pin_project! { //~ ERROR reference to packed field is unaligned +12 | | #[repr(packed(2))] +13 | | struct PackedN { +14 | | #[pin] +15 | | field: u32, +16 | | } +17 | | } + | |_^ + | +note: the lint level is defined here + --> $DIR/packed.rs:11:1 + | +11 | / pin_project! { //~ ERROR reference to packed field is unaligned +12 | | #[repr(packed(2))] +13 | | struct PackedN { +14 | | #[pin] +15 | | field: u32, +16 | | } +17 | | } + | |_^ + = note: fields of packed structs are not properly aligned, and creating a misaligned reference is undefined behavior (even if that reference is never dereferenced) + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error: borrow of packed field is unsafe and requires unsafe function or block (error E0133) + --> $DIR/packed.rs:3:1 + | +3 | / pin_project! { //~ ERROR reference to packed field is unaligned +4 | | #[repr(packed, C)] +5 | | struct Packed { +6 | | #[pin] +7 | | field: u16, +8 | | } +9 | | } + | |_^ + | +note: the lint level is defined here + --> $DIR/packed.rs:3:1 + | +3 | / pin_project! { //~ ERROR reference to packed field is unaligned +4 | | #[repr(packed, C)] +5 | | struct Packed { +6 | | #[pin] +7 | | field: u16, +8 | | } +9 | | } + | |_^ + = 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 #46043 + = note: fields of packed structs might be misaligned: dereferencing a misaligned pointer or even just creating a misaligned reference is undefined behavior + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) + +error: borrow of packed field is unsafe and requires unsafe function or block (error E0133) + --> $DIR/packed.rs:11:1 + | +11 | / pin_project! { //~ ERROR reference to packed field is unaligned +12 | | #[repr(packed(2))] +13 | | struct PackedN { +14 | | #[pin] +15 | | field: u32, +16 | | } +17 | | } + | |_^ + | +note: the lint level is defined here + --> $DIR/packed.rs:11:1 + | +11 | / pin_project! { //~ ERROR reference to packed field is unaligned +12 | | #[repr(packed(2))] +13 | | struct PackedN { +14 | | #[pin] +15 | | field: u32, +16 | | } +17 | | } + | |_^ + = 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 #46043 + = note: fields of packed structs might be misaligned: dereferencing a misaligned pointer or even just creating a misaligned reference is undefined behavior + = note: this error originates in a macro (in Nightly builds, run with -Z macro-backtrace for more info) diff --git a/vendor/pin-project-lite/tests/ui/unpin_sneaky.rs b/vendor/pin-project-lite/tests/ui/pin_project/unpin_sneaky.rs similarity index 100% rename from vendor/pin-project-lite/tests/ui/unpin_sneaky.rs rename to vendor/pin-project-lite/tests/ui/pin_project/unpin_sneaky.rs diff --git a/vendor/pin-project-lite/tests/ui/unpin_sneaky.stderr b/vendor/pin-project-lite/tests/ui/pin_project/unpin_sneaky.stderr similarity index 100% rename from vendor/pin-project-lite/tests/ui/unpin_sneaky.stderr rename to vendor/pin-project-lite/tests/ui/pin_project/unpin_sneaky.stderr diff --git a/vendor/pin-project-lite/tests/ui/unsupported.rs b/vendor/pin-project-lite/tests/ui/pin_project/unsupported.rs similarity index 100% rename from vendor/pin-project-lite/tests/ui/unsupported.rs rename to vendor/pin-project-lite/tests/ui/pin_project/unsupported.rs diff --git a/vendor/pin-project-lite/tests/ui/unsupported.stderr b/vendor/pin-project-lite/tests/ui/pin_project/unsupported.stderr similarity index 100% rename from vendor/pin-project-lite/tests/ui/unsupported.stderr rename to vendor/pin-project-lite/tests/ui/pin_project/unsupported.stderr diff --git a/vendor/quote/.cargo-checksum.json b/vendor/quote/.cargo-checksum.json index b4a95dbd3a..768055df4e 100644 --- a/vendor/quote/.cargo-checksum.json +++ b/vendor/quote/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"63a099cf11c03b8c25c019a137babf22622eaf847f938a2fe95efbd3bba542c5","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"9209682116de84bb9cc7be6ccf44478b46b909c7857f9e186d90bcff522af864","src/ext.rs":"a9fed3a1a4c9d3f2de717ba808af99291b995db2cbf8067f4b6927c39cc62bc6","src/format.rs":"a9c3e3a333c6dacf6e330d02b4c726862e273df1c2c6be6da199049cd1e521db","src/ident_fragment.rs":"e66a63f6e9020f2639a71f120d627bc6cfd60081a6caf8a1d735b59ee2413d29","src/lib.rs":"f0fbd8d2e3d2ea51935c73c65a9c36bb1c06e6f9025fde36e044fe9eb368667a","src/runtime.rs":"f2d1fa6084764d98f98b96344cf675886a79b46a845c592e604f96bbde9aca07","src/spanned.rs":"adc0ed742ad17327c375879472d435cea168c208c303f53eb93cb2c0f10f3650","src/to_tokens.rs":"e589c1643479a9003d4dd1d9fa63714042b106f1b16d8ea3903cfe2f73a020f5","tests/compiletest.rs":"0a52a44786aea1c299c695bf948b2ed2081e4cc344e5c2cadceab4eb03d0010d","tests/test.rs":"6eb200350fa78405d4fd920ecf71d226e258c61aa88f850750efa99e065f06d6","tests/ui/does-not-have-iter-interpolated-dup.rs":"ad13eea21d4cdd2ab6c082f633392e1ff20fb0d1af5f2177041e0bf7f30da695","tests/ui/does-not-have-iter-interpolated.rs":"83a5b3f240651adcbe4b6e51076d76d653ad439b37442cf4054f1fd3c073f3b7","tests/ui/does-not-have-iter-separated.rs":"fe413c48331d5e3a7ae5fef6a5892a90c72f610d54595879eb49d0a94154ba3f","tests/ui/does-not-have-iter.rs":"09dc9499d861b63cebb0848b855b78e2dc9497bfde37ba6339f3625ae009a62f","tests/ui/not-quotable.rs":"5759d0884943417609f28faadc70254a3e2fd3d9bd6ff7297a3fb70a77fafd8a","tests/ui/not-repeatable.rs":"a4b115c04e4e41049a05f5b69450503fbffeba031218b4189cb931839f7f9a9c","tests/ui/wrong-type-span.rs":"5f310cb7fde3ef51bad01e7f286d244e3b6e67396cd2ea7eab77275c9d902699"},"package":"991431c3519a3f36861882da93630ce66b52918dcf1b8e2fd66b397fc96f28df"} \ No newline at end of file +{"files":{"Cargo.toml":"d1e6bb8b4ac54b84f367a4e1b46e7dca3b1a744017d8f7fa2f4c11a8730e657a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"9209682116de84bb9cc7be6ccf44478b46b909c7857f9e186d90bcff522af864","src/ext.rs":"a9fed3a1a4c9d3f2de717ba808af99291b995db2cbf8067f4b6927c39cc62bc6","src/format.rs":"a9c3e3a333c6dacf6e330d02b4c726862e273df1c2c6be6da199049cd1e521db","src/ident_fragment.rs":"e66a63f6e9020f2639a71f120d627bc6cfd60081a6caf8a1d735b59ee2413d29","src/lib.rs":"2500b1955d139e5b467df046cda4f2837fb1edace838aa190020752ab79314c4","src/runtime.rs":"f2d1fa6084764d98f98b96344cf675886a79b46a845c592e604f96bbde9aca07","src/spanned.rs":"adc0ed742ad17327c375879472d435cea168c208c303f53eb93cb2c0f10f3650","src/to_tokens.rs":"e589c1643479a9003d4dd1d9fa63714042b106f1b16d8ea3903cfe2f73a020f5","tests/compiletest.rs":"0a52a44786aea1c299c695bf948b2ed2081e4cc344e5c2cadceab4eb03d0010d","tests/test.rs":"6eb200350fa78405d4fd920ecf71d226e258c61aa88f850750efa99e065f06d6","tests/ui/does-not-have-iter-interpolated-dup.rs":"ad13eea21d4cdd2ab6c082f633392e1ff20fb0d1af5f2177041e0bf7f30da695","tests/ui/does-not-have-iter-interpolated.rs":"83a5b3f240651adcbe4b6e51076d76d653ad439b37442cf4054f1fd3c073f3b7","tests/ui/does-not-have-iter-separated.rs":"fe413c48331d5e3a7ae5fef6a5892a90c72f610d54595879eb49d0a94154ba3f","tests/ui/does-not-have-iter.rs":"09dc9499d861b63cebb0848b855b78e2dc9497bfde37ba6339f3625ae009a62f","tests/ui/not-quotable.rs":"5759d0884943417609f28faadc70254a3e2fd3d9bd6ff7297a3fb70a77fafd8a","tests/ui/not-repeatable.rs":"a4b115c04e4e41049a05f5b69450503fbffeba031218b4189cb931839f7f9a9c","tests/ui/wrong-type-span.rs":"5f310cb7fde3ef51bad01e7f286d244e3b6e67396cd2ea7eab77275c9d902699"},"package":"c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"} \ No newline at end of file diff --git a/vendor/quote/Cargo.toml b/vendor/quote/Cargo.toml index 8311673438..411f943ab4 100644 --- a/vendor/quote/Cargo.toml +++ b/vendor/quote/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "quote" -version = "1.0.8" +version = "1.0.9" authors = ["David Tolnay "] include = ["Cargo.toml", "src/**/*.rs", "tests/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"] description = "Quasi-quoting macro quote!(...)" diff --git a/vendor/quote/src/lib.rs b/vendor/quote/src/lib.rs index fb09b5dcbf..356e43a052 100644 --- a/vendor/quote/src/lib.rs +++ b/vendor/quote/src/lib.rs @@ -80,9 +80,14 @@ //! }; //! ``` -#![forbid(unsafe_code)] // Quote types in rustdoc of other crates get linked to here. -#![doc(html_root_url = "https://docs.rs/quote/1.0.8")] +#![doc(html_root_url = "https://docs.rs/quote/1.0.9")] +#![allow( + clippy::doc_markdown, + clippy::missing_errors_doc, + clippy::missing_panics_doc, + clippy::module_name_repetitions +)] #[cfg(all( not(all(target_arch = "wasm32", target_os = "unknown")), diff --git a/vendor/rand/.cargo-checksum.json b/vendor/rand-0.7.3/.cargo-checksum.json similarity index 100% rename from vendor/rand/.cargo-checksum.json rename to vendor/rand-0.7.3/.cargo-checksum.json diff --git a/vendor/rand/CHANGELOG.md b/vendor/rand-0.7.3/CHANGELOG.md similarity index 100% rename from vendor/rand/CHANGELOG.md rename to vendor/rand-0.7.3/CHANGELOG.md diff --git a/vendor/rand/COPYRIGHT b/vendor/rand-0.7.3/COPYRIGHT similarity index 100% rename from vendor/rand/COPYRIGHT rename to vendor/rand-0.7.3/COPYRIGHT diff --git a/vendor/rand/Cargo.lock b/vendor/rand-0.7.3/Cargo.lock similarity index 100% rename from vendor/rand/Cargo.lock rename to vendor/rand-0.7.3/Cargo.lock diff --git a/vendor/rand/Cargo.toml b/vendor/rand-0.7.3/Cargo.toml similarity index 100% rename from vendor/rand/Cargo.toml rename to vendor/rand-0.7.3/Cargo.toml diff --git a/vendor/rand/LICENSE-APACHE b/vendor/rand-0.7.3/LICENSE-APACHE similarity index 100% rename from vendor/rand/LICENSE-APACHE rename to vendor/rand-0.7.3/LICENSE-APACHE diff --git a/vendor/rand/LICENSE-MIT b/vendor/rand-0.7.3/LICENSE-MIT similarity index 100% rename from vendor/rand/LICENSE-MIT rename to vendor/rand-0.7.3/LICENSE-MIT diff --git a/vendor/rand/README.md b/vendor/rand-0.7.3/README.md similarity index 100% rename from vendor/rand/README.md rename to vendor/rand-0.7.3/README.md diff --git a/vendor/rand/SECURITY.md b/vendor/rand-0.7.3/SECURITY.md similarity index 100% rename from vendor/rand/SECURITY.md rename to vendor/rand-0.7.3/SECURITY.md diff --git a/vendor/rand/benches/generators.rs b/vendor/rand-0.7.3/benches/generators.rs similarity index 100% rename from vendor/rand/benches/generators.rs rename to vendor/rand-0.7.3/benches/generators.rs diff --git a/vendor/rand/benches/misc.rs b/vendor/rand-0.7.3/benches/misc.rs similarity index 100% rename from vendor/rand/benches/misc.rs rename to vendor/rand-0.7.3/benches/misc.rs diff --git a/vendor/rand/benches/seq.rs b/vendor/rand-0.7.3/benches/seq.rs similarity index 100% rename from vendor/rand/benches/seq.rs rename to vendor/rand-0.7.3/benches/seq.rs diff --git a/vendor/rand/benches/weighted.rs b/vendor/rand-0.7.3/benches/weighted.rs similarity index 100% rename from vendor/rand/benches/weighted.rs rename to vendor/rand-0.7.3/benches/weighted.rs diff --git a/vendor/rand/examples/monte-carlo.rs b/vendor/rand-0.7.3/examples/monte-carlo.rs similarity index 100% rename from vendor/rand/examples/monte-carlo.rs rename to vendor/rand-0.7.3/examples/monte-carlo.rs diff --git a/vendor/rand/examples/monty-hall.rs b/vendor/rand-0.7.3/examples/monty-hall.rs similarity index 100% rename from vendor/rand/examples/monty-hall.rs rename to vendor/rand-0.7.3/examples/monty-hall.rs diff --git a/vendor/rand/rustfmt.toml b/vendor/rand-0.7.3/rustfmt.toml similarity index 100% rename from vendor/rand/rustfmt.toml rename to vendor/rand-0.7.3/rustfmt.toml diff --git a/vendor/rand/src/distributions/bernoulli.rs b/vendor/rand-0.7.3/src/distributions/bernoulli.rs similarity index 100% rename from vendor/rand/src/distributions/bernoulli.rs rename to vendor/rand-0.7.3/src/distributions/bernoulli.rs diff --git a/vendor/rand/src/distributions/binomial.rs b/vendor/rand-0.7.3/src/distributions/binomial.rs similarity index 100% rename from vendor/rand/src/distributions/binomial.rs rename to vendor/rand-0.7.3/src/distributions/binomial.rs diff --git a/vendor/rand/src/distributions/cauchy.rs b/vendor/rand-0.7.3/src/distributions/cauchy.rs similarity index 100% rename from vendor/rand/src/distributions/cauchy.rs rename to vendor/rand-0.7.3/src/distributions/cauchy.rs diff --git a/vendor/rand/src/distributions/dirichlet.rs b/vendor/rand-0.7.3/src/distributions/dirichlet.rs similarity index 100% rename from vendor/rand/src/distributions/dirichlet.rs rename to vendor/rand-0.7.3/src/distributions/dirichlet.rs diff --git a/vendor/rand/src/distributions/exponential.rs b/vendor/rand-0.7.3/src/distributions/exponential.rs similarity index 100% rename from vendor/rand/src/distributions/exponential.rs rename to vendor/rand-0.7.3/src/distributions/exponential.rs diff --git a/vendor/rand/src/distributions/float.rs b/vendor/rand-0.7.3/src/distributions/float.rs similarity index 100% rename from vendor/rand/src/distributions/float.rs rename to vendor/rand-0.7.3/src/distributions/float.rs diff --git a/vendor/rand/src/distributions/gamma.rs b/vendor/rand-0.7.3/src/distributions/gamma.rs similarity index 100% rename from vendor/rand/src/distributions/gamma.rs rename to vendor/rand-0.7.3/src/distributions/gamma.rs diff --git a/vendor/rand/src/distributions/integer.rs b/vendor/rand-0.7.3/src/distributions/integer.rs similarity index 100% rename from vendor/rand/src/distributions/integer.rs rename to vendor/rand-0.7.3/src/distributions/integer.rs diff --git a/vendor/rand/src/distributions/mod.rs b/vendor/rand-0.7.3/src/distributions/mod.rs similarity index 100% rename from vendor/rand/src/distributions/mod.rs rename to vendor/rand-0.7.3/src/distributions/mod.rs diff --git a/vendor/rand/src/distributions/normal.rs b/vendor/rand-0.7.3/src/distributions/normal.rs similarity index 100% rename from vendor/rand/src/distributions/normal.rs rename to vendor/rand-0.7.3/src/distributions/normal.rs diff --git a/vendor/rand/src/distributions/other.rs b/vendor/rand-0.7.3/src/distributions/other.rs similarity index 100% rename from vendor/rand/src/distributions/other.rs rename to vendor/rand-0.7.3/src/distributions/other.rs diff --git a/vendor/rand/src/distributions/pareto.rs b/vendor/rand-0.7.3/src/distributions/pareto.rs similarity index 100% rename from vendor/rand/src/distributions/pareto.rs rename to vendor/rand-0.7.3/src/distributions/pareto.rs diff --git a/vendor/rand/src/distributions/poisson.rs b/vendor/rand-0.7.3/src/distributions/poisson.rs similarity index 100% rename from vendor/rand/src/distributions/poisson.rs rename to vendor/rand-0.7.3/src/distributions/poisson.rs diff --git a/vendor/rand/src/distributions/triangular.rs b/vendor/rand-0.7.3/src/distributions/triangular.rs similarity index 100% rename from vendor/rand/src/distributions/triangular.rs rename to vendor/rand-0.7.3/src/distributions/triangular.rs diff --git a/vendor/rand/src/distributions/uniform.rs b/vendor/rand-0.7.3/src/distributions/uniform.rs similarity index 100% rename from vendor/rand/src/distributions/uniform.rs rename to vendor/rand-0.7.3/src/distributions/uniform.rs diff --git a/vendor/rand/src/distributions/unit_circle.rs b/vendor/rand-0.7.3/src/distributions/unit_circle.rs similarity index 100% rename from vendor/rand/src/distributions/unit_circle.rs rename to vendor/rand-0.7.3/src/distributions/unit_circle.rs diff --git a/vendor/rand/src/distributions/unit_sphere.rs b/vendor/rand-0.7.3/src/distributions/unit_sphere.rs similarity index 100% rename from vendor/rand/src/distributions/unit_sphere.rs rename to vendor/rand-0.7.3/src/distributions/unit_sphere.rs diff --git a/vendor/rand/src/distributions/utils.rs b/vendor/rand-0.7.3/src/distributions/utils.rs similarity index 100% rename from vendor/rand/src/distributions/utils.rs rename to vendor/rand-0.7.3/src/distributions/utils.rs diff --git a/vendor/rand/src/distributions/weibull.rs b/vendor/rand-0.7.3/src/distributions/weibull.rs similarity index 100% rename from vendor/rand/src/distributions/weibull.rs rename to vendor/rand-0.7.3/src/distributions/weibull.rs diff --git a/vendor/rand/src/distributions/weighted/alias_method.rs b/vendor/rand-0.7.3/src/distributions/weighted/alias_method.rs similarity index 100% rename from vendor/rand/src/distributions/weighted/alias_method.rs rename to vendor/rand-0.7.3/src/distributions/weighted/alias_method.rs diff --git a/vendor/rand/src/distributions/weighted/mod.rs b/vendor/rand-0.7.3/src/distributions/weighted/mod.rs similarity index 100% rename from vendor/rand/src/distributions/weighted/mod.rs rename to vendor/rand-0.7.3/src/distributions/weighted/mod.rs diff --git a/vendor/rand/src/distributions/ziggurat_tables.rs b/vendor/rand-0.7.3/src/distributions/ziggurat_tables.rs similarity index 100% rename from vendor/rand/src/distributions/ziggurat_tables.rs rename to vendor/rand-0.7.3/src/distributions/ziggurat_tables.rs diff --git a/vendor/rand/src/lib.rs b/vendor/rand-0.7.3/src/lib.rs similarity index 100% rename from vendor/rand/src/lib.rs rename to vendor/rand-0.7.3/src/lib.rs diff --git a/vendor/rand/src/prelude.rs b/vendor/rand-0.7.3/src/prelude.rs similarity index 100% rename from vendor/rand/src/prelude.rs rename to vendor/rand-0.7.3/src/prelude.rs diff --git a/vendor/rand/src/rngs/adapter/mod.rs b/vendor/rand-0.7.3/src/rngs/adapter/mod.rs similarity index 100% rename from vendor/rand/src/rngs/adapter/mod.rs rename to vendor/rand-0.7.3/src/rngs/adapter/mod.rs diff --git a/vendor/rand/src/rngs/adapter/read.rs b/vendor/rand-0.7.3/src/rngs/adapter/read.rs similarity index 100% rename from vendor/rand/src/rngs/adapter/read.rs rename to vendor/rand-0.7.3/src/rngs/adapter/read.rs diff --git a/vendor/rand/src/rngs/adapter/reseeding.rs b/vendor/rand-0.7.3/src/rngs/adapter/reseeding.rs similarity index 100% rename from vendor/rand/src/rngs/adapter/reseeding.rs rename to vendor/rand-0.7.3/src/rngs/adapter/reseeding.rs diff --git a/vendor/rand/src/rngs/entropy.rs b/vendor/rand-0.7.3/src/rngs/entropy.rs similarity index 100% rename from vendor/rand/src/rngs/entropy.rs rename to vendor/rand-0.7.3/src/rngs/entropy.rs diff --git a/vendor/rand/src/rngs/mock.rs b/vendor/rand-0.7.3/src/rngs/mock.rs similarity index 100% rename from vendor/rand/src/rngs/mock.rs rename to vendor/rand-0.7.3/src/rngs/mock.rs diff --git a/vendor/rand/src/rngs/mod.rs b/vendor/rand-0.7.3/src/rngs/mod.rs similarity index 100% rename from vendor/rand/src/rngs/mod.rs rename to vendor/rand-0.7.3/src/rngs/mod.rs diff --git a/vendor/rand/src/rngs/small.rs b/vendor/rand-0.7.3/src/rngs/small.rs similarity index 100% rename from vendor/rand/src/rngs/small.rs rename to vendor/rand-0.7.3/src/rngs/small.rs diff --git a/vendor/rand/src/rngs/std.rs b/vendor/rand-0.7.3/src/rngs/std.rs similarity index 100% rename from vendor/rand/src/rngs/std.rs rename to vendor/rand-0.7.3/src/rngs/std.rs diff --git a/vendor/rand/src/rngs/thread.rs b/vendor/rand-0.7.3/src/rngs/thread.rs similarity index 100% rename from vendor/rand/src/rngs/thread.rs rename to vendor/rand-0.7.3/src/rngs/thread.rs diff --git a/vendor/rand/src/seq/index.rs b/vendor/rand-0.7.3/src/seq/index.rs similarity index 100% rename from vendor/rand/src/seq/index.rs rename to vendor/rand-0.7.3/src/seq/index.rs diff --git a/vendor/rand/src/seq/mod.rs b/vendor/rand-0.7.3/src/seq/mod.rs similarity index 100% rename from vendor/rand/src/seq/mod.rs rename to vendor/rand-0.7.3/src/seq/mod.rs diff --git a/vendor/rand_chacha/.cargo-checksum.json b/vendor/rand_chacha-0.2.2/.cargo-checksum.json similarity index 100% rename from vendor/rand_chacha/.cargo-checksum.json rename to vendor/rand_chacha-0.2.2/.cargo-checksum.json diff --git a/vendor/rand_chacha/CHANGELOG.md b/vendor/rand_chacha-0.2.2/CHANGELOG.md similarity index 100% rename from vendor/rand_chacha/CHANGELOG.md rename to vendor/rand_chacha-0.2.2/CHANGELOG.md diff --git a/vendor/rand_chacha/COPYRIGHT b/vendor/rand_chacha-0.2.2/COPYRIGHT similarity index 100% rename from vendor/rand_chacha/COPYRIGHT rename to vendor/rand_chacha-0.2.2/COPYRIGHT diff --git a/vendor/rand_chacha/Cargo.toml b/vendor/rand_chacha-0.2.2/Cargo.toml similarity index 100% rename from vendor/rand_chacha/Cargo.toml rename to vendor/rand_chacha-0.2.2/Cargo.toml diff --git a/vendor/rand_chacha/LICENSE-APACHE b/vendor/rand_chacha-0.2.2/LICENSE-APACHE similarity index 100% rename from vendor/rand_chacha/LICENSE-APACHE rename to vendor/rand_chacha-0.2.2/LICENSE-APACHE diff --git a/vendor/rand_chacha/LICENSE-MIT b/vendor/rand_chacha-0.2.2/LICENSE-MIT similarity index 100% rename from vendor/rand_chacha/LICENSE-MIT rename to vendor/rand_chacha-0.2.2/LICENSE-MIT diff --git a/vendor/rand_chacha/README.md b/vendor/rand_chacha-0.2.2/README.md similarity index 100% rename from vendor/rand_chacha/README.md rename to vendor/rand_chacha-0.2.2/README.md diff --git a/vendor/rand_chacha/src/chacha.rs b/vendor/rand_chacha-0.2.2/src/chacha.rs similarity index 100% rename from vendor/rand_chacha/src/chacha.rs rename to vendor/rand_chacha-0.2.2/src/chacha.rs diff --git a/vendor/rand_chacha/src/guts.rs b/vendor/rand_chacha-0.2.2/src/guts.rs similarity index 100% rename from vendor/rand_chacha/src/guts.rs rename to vendor/rand_chacha-0.2.2/src/guts.rs diff --git a/vendor/rand_chacha/src/lib.rs b/vendor/rand_chacha-0.2.2/src/lib.rs similarity index 100% rename from vendor/rand_chacha/src/lib.rs rename to vendor/rand_chacha-0.2.2/src/lib.rs diff --git a/vendor/rand_core/.cargo-checksum.json b/vendor/rand_core-0.5.1/.cargo-checksum.json similarity index 100% rename from vendor/rand_core/.cargo-checksum.json rename to vendor/rand_core-0.5.1/.cargo-checksum.json diff --git a/vendor/rand_core/CHANGELOG.md b/vendor/rand_core-0.5.1/CHANGELOG.md similarity index 100% rename from vendor/rand_core/CHANGELOG.md rename to vendor/rand_core-0.5.1/CHANGELOG.md diff --git a/vendor/rand_core/COPYRIGHT b/vendor/rand_core-0.5.1/COPYRIGHT similarity index 100% rename from vendor/rand_core/COPYRIGHT rename to vendor/rand_core-0.5.1/COPYRIGHT diff --git a/vendor/rand_core/Cargo.toml b/vendor/rand_core-0.5.1/Cargo.toml similarity index 100% rename from vendor/rand_core/Cargo.toml rename to vendor/rand_core-0.5.1/Cargo.toml diff --git a/vendor/rand_core/LICENSE-APACHE b/vendor/rand_core-0.5.1/LICENSE-APACHE similarity index 100% rename from vendor/rand_core/LICENSE-APACHE rename to vendor/rand_core-0.5.1/LICENSE-APACHE diff --git a/vendor/rand_core/LICENSE-MIT b/vendor/rand_core-0.5.1/LICENSE-MIT similarity index 100% rename from vendor/rand_core/LICENSE-MIT rename to vendor/rand_core-0.5.1/LICENSE-MIT diff --git a/vendor/rand_core/README.md b/vendor/rand_core-0.5.1/README.md similarity index 100% rename from vendor/rand_core/README.md rename to vendor/rand_core-0.5.1/README.md diff --git a/vendor/rand_core/src/block.rs b/vendor/rand_core-0.5.1/src/block.rs similarity index 100% rename from vendor/rand_core/src/block.rs rename to vendor/rand_core-0.5.1/src/block.rs diff --git a/vendor/rand_core/src/error.rs b/vendor/rand_core-0.5.1/src/error.rs similarity index 100% rename from vendor/rand_core/src/error.rs rename to vendor/rand_core-0.5.1/src/error.rs diff --git a/vendor/rand_core/src/impls.rs b/vendor/rand_core-0.5.1/src/impls.rs similarity index 100% rename from vendor/rand_core/src/impls.rs rename to vendor/rand_core-0.5.1/src/impls.rs diff --git a/vendor/rand_core/src/le.rs b/vendor/rand_core-0.5.1/src/le.rs similarity index 100% rename from vendor/rand_core/src/le.rs rename to vendor/rand_core-0.5.1/src/le.rs diff --git a/vendor/rand_core/src/lib.rs b/vendor/rand_core-0.5.1/src/lib.rs similarity index 100% rename from vendor/rand_core/src/lib.rs rename to vendor/rand_core-0.5.1/src/lib.rs diff --git a/vendor/rand_core/src/os.rs b/vendor/rand_core-0.5.1/src/os.rs similarity index 100% rename from vendor/rand_core/src/os.rs rename to vendor/rand_core-0.5.1/src/os.rs diff --git a/vendor/rand_hc/.cargo-checksum.json b/vendor/rand_hc-0.2.0/.cargo-checksum.json similarity index 100% rename from vendor/rand_hc/.cargo-checksum.json rename to vendor/rand_hc-0.2.0/.cargo-checksum.json diff --git a/vendor/rand_hc/CHANGELOG.md b/vendor/rand_hc-0.2.0/CHANGELOG.md similarity index 100% rename from vendor/rand_hc/CHANGELOG.md rename to vendor/rand_hc-0.2.0/CHANGELOG.md diff --git a/vendor/rand_hc/COPYRIGHT b/vendor/rand_hc-0.2.0/COPYRIGHT similarity index 100% rename from vendor/rand_hc/COPYRIGHT rename to vendor/rand_hc-0.2.0/COPYRIGHT diff --git a/vendor/rand_hc/Cargo.toml b/vendor/rand_hc-0.2.0/Cargo.toml similarity index 100% rename from vendor/rand_hc/Cargo.toml rename to vendor/rand_hc-0.2.0/Cargo.toml diff --git a/vendor/rand_hc/LICENSE-APACHE b/vendor/rand_hc-0.2.0/LICENSE-APACHE similarity index 100% rename from vendor/rand_hc/LICENSE-APACHE rename to vendor/rand_hc-0.2.0/LICENSE-APACHE diff --git a/vendor/rand_hc/LICENSE-MIT b/vendor/rand_hc-0.2.0/LICENSE-MIT similarity index 100% rename from vendor/rand_hc/LICENSE-MIT rename to vendor/rand_hc-0.2.0/LICENSE-MIT diff --git a/vendor/rand_hc/README.md b/vendor/rand_hc-0.2.0/README.md similarity index 100% rename from vendor/rand_hc/README.md rename to vendor/rand_hc-0.2.0/README.md diff --git a/vendor/rand_hc/src/hc128.rs b/vendor/rand_hc-0.2.0/src/hc128.rs similarity index 100% rename from vendor/rand_hc/src/hc128.rs rename to vendor/rand_hc-0.2.0/src/hc128.rs diff --git a/vendor/rand_hc/src/lib.rs b/vendor/rand_hc-0.2.0/src/lib.rs similarity index 100% rename from vendor/rand_hc/src/lib.rs rename to vendor/rand_hc-0.2.0/src/lib.rs diff --git a/vendor/redox_syscall/.cargo-checksum.json b/vendor/redox_syscall/.cargo-checksum.json index 2f72cb0e86..afd55c0f2b 100644 --- a/vendor/redox_syscall/.cargo-checksum.json +++ b/vendor/redox_syscall/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"ce167ec0468c095863f4b43482d34933e510787db8191f6c12b8ec12435da5f0","LICENSE":"efcfee7981ff72431fffb06925cad00a23dce079ed4354f61030ad5abdb78829","README.md":"9161f18ba7f69b4ca51e844aee8ffb8237513a468c5c3b1f3a5f989044f895ac","src/arch/aarch64.rs":"7dade48302d4fc691cae48499cf91d7676ef8c82efe2270f17aee0fe2611f3ec","src/arch/arm.rs":"abc547bd2be32ff15f35032452e645668ec5050d2540e2dca073fc5670ca1a75","src/arch/nonredox.rs":"9eac0fa2cf9eae07f0cafa2dd63c4a820791897a3de9ad1a933ab4f53458dbd8","src/arch/x86.rs":"3a517a8f0a70ae1b513d7a44e7399ce47a2ca7aca72a8200662b9800b41455d6","src/arch/x86_64.rs":"ae2cec2079a36d3d3676c2431a55f19365d58545ed72748588679982a6619ab2","src/call.rs":"04c8d1c9a875f3c2d3108cbe93c0339541bffcdf76dfe995ea3e8b4724ab1fa8","src/data.rs":"bd4545d4c2fcc59ff26ae52ad7f773a697d5ccf639a2ffc253cece6b31e94d51","src/error.rs":"ef20f3817f997a1aeb7114628407f19cb8bc13c555d4e093918f38a5d098f798","src/flag.rs":"fbb6992383e68100339d854f15a1e7c6586474fac34d3b816778926f0809a015","src/io/dma.rs":"fbc46e924d5913f5a3fb723751d7a9dd1b079ccf058500fde4957aaf9fa7dd1c","src/io/io.rs":"1bcb36d1867e9bab6a8186cd6928efe70ae2655e9f9d0dd3def20bc0fb6a82f6","src/io/mmio.rs":"c71a956f57554b126080b14378f235f9e98c994648ba524231ceae841326251f","src/io/mod.rs":"4df12af3e82e6b5fe22112c9f51552112ee4811b7d1131d2a43d608d8d1cac09","src/io/pio.rs":"39f4176a2995c7acfb32204b065af0ec14d7ff0d45dc51eff2679f3195c36ee2","src/lib.rs":"8fbacb97f56059fbd32067d6c065f95189d2eb11bc9913f98609430ec94bf9fa","src/number.rs":"fe7b47b06566aa1f8a75f50b685801259df03a1a5c85b91817b4552583cd7862","src/scheme/generate.sh":"dde4e30f4e0223fb1a24ed486a6c36e624c854dbf890862cb6866f4fa3c7a6eb","src/scheme/mod.rs":"d472ed1bb8c118c4fa56741c53fd44db6034baf99382a0675bbc663ecbe85759","src/scheme/scheme.rs":"52df87b891676bea373f4c3632b79f66842cb601a63cdb9f038cce0511a6a330","src/scheme/scheme_block.rs":"c504c78775ff163c1e4463bbf52d7c6be60b316f072e5f84073ecb1c567e3911","src/scheme/scheme_block_mut.rs":"a70997a5672b24ac97e2d8c9e5dbd8c217291de4a873da7083c3a1ad6ac4ab63","src/scheme/scheme_mut.rs":"25b01b0576b3645c1cdb5b00c00111d82e52b8699a577acdf2367834e7d93804","src/scheme/seek.rs":"94e044de47b0f00eb0c2aea3fb21001ac2b9aa1e4b20d73fd54163fe92fa63f7","src/tests.rs":"ea460f580116575890031a48fbfa101db75b191ef6b2aebfeab11dbb866091c3"},"package":"05ec8ca9416c5ea37062b502703cd7fcb207736bc294f6e0cf367ac6fc234570"} \ No newline at end of file +{"files":{"Cargo.toml":"fa6c6b799f96f2dc4a8bb00dfcdbe55b1a50e012b4f4cc8218ff190f3433d974","LICENSE":"efcfee7981ff72431fffb06925cad00a23dce079ed4354f61030ad5abdb78829","README.md":"9161f18ba7f69b4ca51e844aee8ffb8237513a468c5c3b1f3a5f989044f895ac","src/arch/aarch64.rs":"7dade48302d4fc691cae48499cf91d7676ef8c82efe2270f17aee0fe2611f3ec","src/arch/arm.rs":"abc547bd2be32ff15f35032452e645668ec5050d2540e2dca073fc5670ca1a75","src/arch/nonredox.rs":"9eac0fa2cf9eae07f0cafa2dd63c4a820791897a3de9ad1a933ab4f53458dbd8","src/arch/x86.rs":"3a517a8f0a70ae1b513d7a44e7399ce47a2ca7aca72a8200662b9800b41455d6","src/arch/x86_64.rs":"ae2cec2079a36d3d3676c2431a55f19365d58545ed72748588679982a6619ab2","src/call.rs":"0d3e32e33ecdf75963e5d244f9e86e94047d155c5de5fa3c0085faf18ed97b33","src/data.rs":"bd4545d4c2fcc59ff26ae52ad7f773a697d5ccf639a2ffc253cece6b31e94d51","src/error.rs":"ef20f3817f997a1aeb7114628407f19cb8bc13c555d4e093918f38a5d098f798","src/flag.rs":"fbb6992383e68100339d854f15a1e7c6586474fac34d3b816778926f0809a015","src/io/dma.rs":"fbc46e924d5913f5a3fb723751d7a9dd1b079ccf058500fde4957aaf9fa7dd1c","src/io/io.rs":"1bcb36d1867e9bab6a8186cd6928efe70ae2655e9f9d0dd3def20bc0fb6a82f6","src/io/mmio.rs":"c71a956f57554b126080b14378f235f9e98c994648ba524231ceae841326251f","src/io/mod.rs":"4df12af3e82e6b5fe22112c9f51552112ee4811b7d1131d2a43d608d8d1cac09","src/io/pio.rs":"39f4176a2995c7acfb32204b065af0ec14d7ff0d45dc51eff2679f3195c36ee2","src/lib.rs":"8fbacb97f56059fbd32067d6c065f95189d2eb11bc9913f98609430ec94bf9fa","src/number.rs":"fe7b47b06566aa1f8a75f50b685801259df03a1a5c85b91817b4552583cd7862","src/scheme/generate.sh":"dde4e30f4e0223fb1a24ed486a6c36e624c854dbf890862cb6866f4fa3c7a6eb","src/scheme/mod.rs":"cb622405deb0aef4ab04499ea1adfd338c9c5dd9c31a1fe9989786dbf69b49d8","src/scheme/scheme.rs":"30263996f0b4930edd76dace5f5750e48229066bc888bc13365846688d0a870b","src/scheme/scheme_block.rs":"b7a761e4349eb87d106c8af14894e8c4272769b9eb235cd500b075ac1f823683","src/scheme/scheme_block_mut.rs":"4a4fc03bce14757b64006b9bc3fa2779e95382b2d99579870146ee0c3be3f46c","src/scheme/scheme_mut.rs":"e6f0671b77f1bf5263e497c69dec553352249b75d52af62ac19477ba5127f803","src/scheme/seek.rs":"94e044de47b0f00eb0c2aea3fb21001ac2b9aa1e4b20d73fd54163fe92fa63f7","src/tests.rs":"ea460f580116575890031a48fbfa101db75b191ef6b2aebfeab11dbb866091c3"},"package":"94341e4e44e24f6b591b59e47a8a027df12e008d73fd5672dbea9cc22f4507d9"} \ No newline at end of file diff --git a/vendor/redox_syscall/Cargo.toml b/vendor/redox_syscall/Cargo.toml index 8f82a59847..43317fd9a0 100644 --- a/vendor/redox_syscall/Cargo.toml +++ b/vendor/redox_syscall/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "redox_syscall" -version = "0.2.4" +version = "0.2.5" authors = ["Jeremy Soller "] description = "A Rust library to access raw Redox system calls" documentation = "https://docs.rs/redox_syscall" diff --git a/vendor/redox_syscall/src/call.rs b/vendor/redox_syscall/src/call.rs index cde2833728..f6eb89c8c0 100644 --- a/vendor/redox_syscall/src/call.rs +++ b/vendor/redox_syscall/src/call.rs @@ -26,7 +26,7 @@ extern "C" fn restorer() -> ! { /// * `EIO` - an I/O error occurred /// * `ENOENT` - `path` does not exit /// * `ENOTDIR` - `path` is not a directory -pub fn chdir>(path: T) -> Result { +pub fn chdir>(path: T) -> Result { unsafe { syscall2(SYS_CHDIR, path.as_ref().as_ptr() as usize, path.as_ref().len()) } } @@ -34,7 +34,7 @@ pub fn chdir>(path: T) -> Result { since = "0.1.55", note = "use fchmod instead" )] -pub fn chmod>(path: T, mode: usize) -> Result { +pub fn chmod>(path: T, mode: usize) -> Result { unsafe { syscall3(SYS_CHMOD, path.as_ref().as_ptr() as usize, path.as_ref().len(), mode) } } @@ -115,7 +115,7 @@ pub fn fpath(fd: usize, buf: &mut [u8]) -> Result { } /// Rename a file -pub fn frename>(fd: usize, path: T) -> Result { +pub fn frename>(fd: usize, path: T) -> Result { unsafe { syscall3(SYS_FRENAME, fd, path.as_ref().as_ptr() as usize, path.as_ref().len()) } } @@ -242,7 +242,7 @@ pub fn nanosleep(req: &TimeSpec, rem: &mut TimeSpec) -> Result { } /// Open a file -pub fn open>(path: T, flags: usize) -> Result { +pub fn open>(path: T, flags: usize) -> Result { unsafe { syscall3(SYS_OPEN, path.as_ref().as_ptr() as usize, path.as_ref().len(), flags) } } @@ -326,7 +326,7 @@ pub fn read(fd: usize, buf: &mut [u8]) -> Result { } /// Remove a directory -pub fn rmdir>(path: T) -> Result { +pub fn rmdir>(path: T) -> Result { unsafe { syscall2(SYS_RMDIR, path.as_ref().as_ptr() as usize, path.as_ref().len()) } } @@ -376,7 +376,7 @@ pub fn umask(mask: usize) -> Result { } /// Remove a file -pub fn unlink>(path: T) -> Result { +pub fn unlink>(path: T) -> Result { unsafe { syscall2(SYS_UNLINK, path.as_ref().as_ptr() as usize, path.as_ref().len()) } } diff --git a/vendor/redox_syscall/src/scheme/mod.rs b/vendor/redox_syscall/src/scheme/mod.rs index be548bdd31..f65d1e2c06 100644 --- a/vendor/redox_syscall/src/scheme/mod.rs +++ b/vendor/redox_syscall/src/scheme/mod.rs @@ -1,9 +1,16 @@ +use core::{slice, str}; + pub use self::scheme::Scheme; pub use self::scheme_mut::SchemeMut; pub use self::scheme_block::SchemeBlock; pub use self::scheme_block_mut::SchemeBlockMut; pub use self::seek::*; +unsafe fn str_from_raw_parts(ptr: *const u8, len: usize) -> Option<&'static str> { + let slice = slice::from_raw_parts(ptr, len); + str::from_utf8(slice).ok() +} + mod scheme; mod scheme_mut; mod scheme_block; diff --git a/vendor/redox_syscall/src/scheme/scheme.rs b/vendor/redox_syscall/src/scheme/scheme.rs index 6a1a451d76..249d28c6e2 100644 --- a/vendor/redox_syscall/src/scheme/scheme.rs +++ b/vendor/redox_syscall/src/scheme/scheme.rs @@ -4,14 +4,31 @@ use crate::data::*; use crate::error::*; use crate::flag::*; use crate::number::*; +use crate::scheme::str_from_raw_parts; pub trait Scheme { fn handle(&self, packet: &mut Packet) { let res = match packet.a { - SYS_OPEN => self.open(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d, packet.uid, packet.gid), - SYS_CHMOD => self.chmod(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d as u16, packet.uid, packet.gid), - SYS_RMDIR => self.rmdir(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid), - SYS_UNLINK => self.unlink(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid), + SYS_OPEN => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.open(path, packet.d, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, + SYS_CHMOD => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.chmod(path, packet.d as u16, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, + SYS_RMDIR => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.rmdir(path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, + SYS_UNLINK => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.unlink(path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), @@ -34,7 +51,11 @@ pub trait Scheme { SYS_FUNMAP_OLD => self.funmap_old(packet.b), SYS_FUNMAP => self.funmap(packet.b, packet.c), 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_FRENAME => if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { + self.frename(packet.b, path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, SYS_FSTAT => if packet.d >= mem::size_of::() { self.fstat(packet.b, unsafe { &mut *(packet.c as *mut Stat) }) } else { @@ -62,22 +83,22 @@ pub trait Scheme { /* Scheme operations */ #[allow(unused_variables)] - fn open(&self, path: &[u8], flags: usize, uid: u32, gid: u32) -> Result { + fn open(&self, path: &str, flags: usize, uid: u32, gid: u32) -> Result { Err(Error::new(ENOENT)) } #[allow(unused_variables)] - fn chmod(&self, path: &[u8], mode: u16, uid: u32, gid: u32) -> Result { + fn chmod(&self, path: &str, mode: u16, uid: u32, gid: u32) -> Result { Err(Error::new(ENOENT)) } #[allow(unused_variables)] - fn rmdir(&self, path: &[u8], uid: u32, gid: u32) -> Result { + fn rmdir(&self, path: &str, uid: u32, gid: u32) -> Result { Err(Error::new(ENOENT)) } #[allow(unused_variables)] - fn unlink(&self, path: &[u8], uid: u32, gid: u32) -> Result { + fn unlink(&self, path: &str, uid: u32, gid: u32) -> Result { Err(Error::new(ENOENT)) } @@ -154,7 +175,7 @@ pub trait Scheme { } #[allow(unused_variables)] - fn frename(&self, id: usize, path: &[u8], uid: u32, gid: u32) -> Result { + fn frename(&self, id: usize, path: &str, uid: u32, gid: u32) -> Result { 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 2ff867cc0a..e22535e0fd 100644 --- a/vendor/redox_syscall/src/scheme/scheme_block.rs +++ b/vendor/redox_syscall/src/scheme/scheme_block.rs @@ -4,14 +4,31 @@ use crate::data::*; use crate::error::*; use crate::flag::*; use crate::number::*; +use crate::scheme::str_from_raw_parts; pub trait SchemeBlock { fn handle(&self, packet: &Packet) -> Option { let res = match packet.a { - SYS_OPEN => self.open(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d, packet.uid, packet.gid), - SYS_CHMOD => self.chmod(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d as u16, packet.uid, packet.gid), - SYS_RMDIR => self.rmdir(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid), - SYS_UNLINK => self.unlink(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid), + SYS_OPEN => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.open(path, packet.d, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, + SYS_CHMOD => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.chmod(path, packet.d as u16, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, + SYS_RMDIR => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.rmdir(path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, + SYS_UNLINK => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.unlink(path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), @@ -34,7 +51,11 @@ pub trait SchemeBlock { SYS_FUNMAP_OLD => self.funmap_old(packet.b), SYS_FUNMAP => self.funmap(packet.b, packet.c), 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_FRENAME => if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { + self.frename(packet.b, path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, SYS_FSTAT => if packet.d >= mem::size_of::() { self.fstat(packet.b, unsafe { &mut *(packet.c as *mut Stat) }) } else { @@ -62,22 +83,22 @@ pub trait SchemeBlock { /* Scheme operations */ #[allow(unused_variables)] - fn open(&self, path: &[u8], flags: usize, uid: u32, gid: u32) -> Result> { + fn open(&self, path: &str, flags: usize, uid: u32, gid: u32) -> Result> { Err(Error::new(ENOENT)) } #[allow(unused_variables)] - fn chmod(&self, path: &[u8], mode: u16, uid: u32, gid: u32) -> Result> { + fn chmod(&self, path: &str, mode: u16, uid: u32, gid: u32) -> Result> { Err(Error::new(ENOENT)) } #[allow(unused_variables)] - fn rmdir(&self, path: &[u8], uid: u32, gid: u32) -> Result> { + fn rmdir(&self, path: &str, uid: u32, gid: u32) -> Result> { Err(Error::new(ENOENT)) } #[allow(unused_variables)] - fn unlink(&self, path: &[u8], uid: u32, gid: u32) -> Result> { + fn unlink(&self, path: &str, uid: u32, gid: u32) -> Result> { Err(Error::new(ENOENT)) } @@ -154,7 +175,7 @@ pub trait SchemeBlock { } #[allow(unused_variables)] - fn frename(&self, id: usize, path: &[u8], uid: u32, gid: u32) -> Result> { + fn frename(&self, id: usize, path: &str, uid: u32, gid: u32) -> Result> { 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 66f34d5025..c1e54351a3 100644 --- a/vendor/redox_syscall/src/scheme/scheme_block_mut.rs +++ b/vendor/redox_syscall/src/scheme/scheme_block_mut.rs @@ -4,14 +4,31 @@ use crate::data::*; use crate::error::*; use crate::flag::*; use crate::number::*; +use crate::scheme::str_from_raw_parts; pub trait SchemeBlockMut { fn handle(&mut self, packet: &Packet) -> Option { let res = match packet.a { - SYS_OPEN => self.open(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d, packet.uid, packet.gid), - SYS_CHMOD => self.chmod(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d as u16, packet.uid, packet.gid), - SYS_RMDIR => self.rmdir(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid), - SYS_UNLINK => self.unlink(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid), + SYS_OPEN => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.open(path, packet.d, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, + SYS_CHMOD => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.chmod(path, packet.d as u16, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, + SYS_RMDIR => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.rmdir(path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, + SYS_UNLINK => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.unlink(path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), @@ -34,7 +51,11 @@ pub trait SchemeBlockMut { SYS_FUNMAP_OLD => self.funmap_old(packet.b), SYS_FUNMAP => self.funmap(packet.b, packet.c), 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_FRENAME => if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { + self.frename(packet.b, path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, SYS_FSTAT => if packet.d >= mem::size_of::() { self.fstat(packet.b, unsafe { &mut *(packet.c as *mut Stat) }) } else { @@ -62,22 +83,22 @@ pub trait SchemeBlockMut { /* Scheme operations */ #[allow(unused_variables)] - fn open(&mut self, path: &[u8], flags: usize, uid: u32, gid: u32) -> Result> { + fn open(&mut self, path: &str, flags: usize, uid: u32, gid: u32) -> Result> { Err(Error::new(ENOENT)) } #[allow(unused_variables)] - fn chmod(&mut self, path: &[u8], mode: u16, uid: u32, gid: u32) -> Result> { + fn chmod(&mut self, path: &str, mode: u16, uid: u32, gid: u32) -> Result> { Err(Error::new(ENOENT)) } #[allow(unused_variables)] - fn rmdir(&mut self, path: &[u8], uid: u32, gid: u32) -> Result> { + fn rmdir(&mut self, path: &str, uid: u32, gid: u32) -> Result> { Err(Error::new(ENOENT)) } #[allow(unused_variables)] - fn unlink(&mut self, path: &[u8], uid: u32, gid: u32) -> Result> { + fn unlink(&mut self, path: &str, uid: u32, gid: u32) -> Result> { Err(Error::new(ENOENT)) } @@ -154,7 +175,7 @@ pub trait SchemeBlockMut { } #[allow(unused_variables)] - fn frename(&mut self, id: usize, path: &[u8], uid: u32, gid: u32) -> Result> { + fn frename(&mut self, id: usize, path: &str, uid: u32, gid: u32) -> Result> { 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 ff27444221..deb1483664 100644 --- a/vendor/redox_syscall/src/scheme/scheme_mut.rs +++ b/vendor/redox_syscall/src/scheme/scheme_mut.rs @@ -4,14 +4,31 @@ use crate::data::*; use crate::error::*; use crate::flag::*; use crate::number::*; +use crate::scheme::str_from_raw_parts; pub trait SchemeMut { fn handle(&mut self, packet: &mut Packet) { let res = match packet.a { - SYS_OPEN => self.open(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d, packet.uid, packet.gid), - SYS_CHMOD => self.chmod(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.d as u16, packet.uid, packet.gid), - SYS_RMDIR => self.rmdir(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid), - SYS_UNLINK => self.unlink(unsafe { slice::from_raw_parts(packet.b as *const u8, packet.c) }, packet.uid, packet.gid), + SYS_OPEN => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.open(path, packet.d, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, + SYS_CHMOD => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.chmod(path, packet.d as u16, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, + SYS_RMDIR => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.rmdir(path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, + SYS_UNLINK => if let Some(path) = unsafe { str_from_raw_parts(packet.b as *const u8, packet.c) } { + self.unlink(path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, SYS_DUP => self.dup(packet.b, unsafe { slice::from_raw_parts(packet.c as *const u8, packet.d) }), SYS_READ => self.read(packet.b, unsafe { slice::from_raw_parts_mut(packet.c as *mut u8, packet.d) }), @@ -34,7 +51,11 @@ pub trait SchemeMut { SYS_FUNMAP_OLD => self.funmap_old(packet.b), SYS_FUNMAP => self.funmap(packet.b, packet.c), 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_FRENAME => if let Some(path) = unsafe { str_from_raw_parts(packet.c as *const u8, packet.d) } { + self.frename(packet.b, path, packet.uid, packet.gid) + } else { + Err(Error::new(EINVAL)) + }, SYS_FSTAT => if packet.d >= mem::size_of::() { self.fstat(packet.b, unsafe { &mut *(packet.c as *mut Stat) }) } else { @@ -62,22 +83,22 @@ pub trait SchemeMut { /* Scheme operations */ #[allow(unused_variables)] - fn open(&mut self, path: &[u8], flags: usize, uid: u32, gid: u32) -> Result { + fn open(&mut self, path: &str, flags: usize, uid: u32, gid: u32) -> Result { Err(Error::new(ENOENT)) } #[allow(unused_variables)] - fn chmod(&mut self, path: &[u8], mode: u16, uid: u32, gid: u32) -> Result { + fn chmod(&mut self, path: &str, mode: u16, uid: u32, gid: u32) -> Result { Err(Error::new(ENOENT)) } #[allow(unused_variables)] - fn rmdir(&mut self, path: &[u8], uid: u32, gid: u32) -> Result { + fn rmdir(&mut self, path: &str, uid: u32, gid: u32) -> Result { Err(Error::new(ENOENT)) } #[allow(unused_variables)] - fn unlink(&mut self, path: &[u8], uid: u32, gid: u32) -> Result { + fn unlink(&mut self, path: &str, uid: u32, gid: u32) -> Result { Err(Error::new(ENOENT)) } @@ -154,7 +175,7 @@ pub trait SchemeMut { } #[allow(unused_variables)] - fn frename(&mut self, id: usize, path: &[u8], uid: u32, gid: u32) -> Result { + fn frename(&mut self, id: usize, path: &str, uid: u32, gid: u32) -> Result { Err(Error::new(EBADF)) } diff --git a/vendor/rustc-rayon-core/.cargo-checksum.json b/vendor/rustc-rayon-core/.cargo-checksum.json index 7012d28eac..621ab49ca4 100644 --- a/vendor/rustc-rayon-core/.cargo-checksum.json +++ b/vendor/rustc-rayon-core/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"a887bcbc6b4ba691ca81730de60272b48a4729aebceb681ca356b4f36efd38cf","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720","README.md":"565bf4acf3bbd741faa834b8eecb2e14651a4006eeb5da4bc9043795896e0a41","build.rs":"fa31cb198b772600d100a7c403ddedccef637d2e6b2da431fa7f02ca41307fc6","src/compile_fail/mod.rs":"4d70256295bd64691a8c1994b323559cda1888e85f0b45ca55711541c257dcb6","src/compile_fail/quicksort_race1.rs":"35f498cda38f4eb6e00117f78ed68e0fe5a3fa61c25303d9c08a19bda345bc6c","src/compile_fail/quicksort_race2.rs":"cbb40030c7867cae34bb373b6ec5d97c2ac6de39bc917f47879b30eb423924bc","src/compile_fail/quicksort_race3.rs":"8403643e64c969306b1a9b1243378e6ccdd313b57e1878dbd31393618082fd35","src/compile_fail/rc_return.rs":"b6f1f821ef30086e2990db1ac58a92adaf31e57c23c587c7746d6303865c5c0f","src/compile_fail/rc_upvar.rs":"92a799b313fb88a0eb83fc1aaaea4b61604222b45e20f1c22ff5b092a03f8620","src/compile_fail/scope_join_bad.rs":"892959949f77cadfc07458473e7a290301182027ca64428df5a8ce887be0892b","src/internal/mod.rs":"26fb298bbb0d785bae5da8ca181b02f267376e766cea0757a191136fc432103e","src/internal/task.rs":"b66e780e91c40684cae346a44d7785791810340a4e2aef01865922fe17032e9d","src/internal/worker.rs":"bf1e8715c820e32ddd27c98c92b1a1e434a33b5e6fb8cccba2a48ca4039f9a2d","src/job.rs":"20c5529f7f368c2e768d5879511658bf0b2df9bab275144fc8e74c06c71801e0","src/join/mod.rs":"3499c25784561565e4596c624f44ba7b2b49bb24aeb6a723e830d8abd8c7029a","src/join/test.rs":"62b16177c43b3df08e0ef772961b118c645e39eac4e32aabdf2e718dcfa3e159","src/latch.rs":"8f889776c7907a9ca8b392995b25ca131f4824b78514634f1fed3d46899ec186","src/lib.rs":"62cb4fdbc674844e0c05e27ca6cd62d4fb8d98f7569b42a92c6de7a60ce15f0d","src/log.rs":"dbc6719e1c8a3a8ae6c62b9ef9ad7f6ae8fa7ac3b029ba6bf1204e3f9ed8fecc","src/private.rs":"70d6d1b4bb9535da5922d1e911df55ee150e23cba9eb675ddaa32b871ad57e73","src/registry.rs":"b2987ff1e2ea7798504b3a3c75eef62a048465c57842db326381cf8fadbefa68","src/scope/internal.rs":"06eb5b34399789b3279cf9bded49038cc0619e4a9190809254f01e22dcd3857d","src/scope/mod.rs":"0e70a4cc9c40940ff8e63036ac80cb7ed012a06a5d6d283ef65b9d53f54044ae","src/scope/test.rs":"15517412fade4f82c91a56176d2a8a3f33336efc2fb916951f89a2301f63cd50","src/sleep/README.md":"1adec3679bdd836c911c9a2f9194793ac57deb83d9a95b93caec63e897fbcfec","src/sleep/mod.rs":"a3ab95f2263e9abd2b19f7c553c46550043882347f78da06b62131ef3d6e5055","src/spawn/mod.rs":"e4b84bdfe0c59c980c3b623a538edbb9a81b51904422fafd89552e04c88c3ff4","src/spawn/test.rs":"3241d37e9a367d696612be48a362f8f8717d65019fb478b70d6ed4f3735838c7","src/test.rs":"0b82f3eb62103bd00ddec8bed72f73bfb621a68a26724c0e41f170550471a8d7","src/thread_pool/internal.rs":"603c4bf5a791450973a0e957b0ec4647cff05280144939ca41ba808e2b32cd48","src/thread_pool/mod.rs":"b9cd13709a9f4aab2c613cee222a0a0d535e2de55732c776c321b1c9dc910294","src/thread_pool/test.rs":"3e4e75379117cb9fa936594c55698d1b63cf49a9d74e166b529e3bfced905d1f","src/tlv.rs":"fe9997bb586218901355ffde92d377bd0372336de6fe84f26adf1f6bdd2bf920","src/unwind.rs":"7baa4511467d008b14856ea8de7ced92b9251c9df4854f69c81f7efc3cf0cd6c","src/util.rs":"7b58c4aeb37b5e8a38f1028a673f06e712f6e9976a6fe938c05e06ead1c22469","src/worker_local.rs":"0eeb023e3d9d7c3d9fa96cc479722e5714e029f1de17e809187cb60132aa8d44","tests/double_init_fail.rs":"ca6d02537985196e6c4d2a851b8eb3011b7ae2c5b6c10d6af49b18834914c26b","tests/init_zero_threads.rs":"f3488078776b5866249fc198d6e44853ef55a739ddf552bbc655b7ca7d990862","tests/scope_join.rs":"53de4c5cdacf54d45c9955fbb36b7a95b2f2adbaae16ed4c194342cda29ed43d","tests/scoped_threadpool.rs":"5f8c638c07a0c07f9e1789c8c0b970c4c52ebf06b15ab4f225efa661311ac5af","tests/simple_panic.rs":"2e3a9ad0160c2bd49782240258f3a7d8483b7811c524739f0e390c28ea40bc30","tests/stack_overflow_crash.rs":"7ec87fd5774bd83a74504698b7aed29280a1e6e2f51ee223e04d2860b8798888"},"package":"ea2427831f0053ea3ea73559c8eabd893133a51b251d142bacee53c62a288cb3"} \ No newline at end of file +{"files":{"Cargo.toml":"97e425354783396d1c23d435259167b9c39bbe46c388af599319a1daaa4d8974","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720","README.md":"dc40af8a309cff698fd3d0f4fc10811ac357c575eff3379ecc3587183b954a6d","build.rs":"fa31cb198b772600d100a7c403ddedccef637d2e6b2da431fa7f02ca41307fc6","src/compile_fail/mod.rs":"4d70256295bd64691a8c1994b323559cda1888e85f0b45ca55711541c257dcb6","src/compile_fail/quicksort_race1.rs":"35f498cda38f4eb6e00117f78ed68e0fe5a3fa61c25303d9c08a19bda345bc6c","src/compile_fail/quicksort_race2.rs":"cbb40030c7867cae34bb373b6ec5d97c2ac6de39bc917f47879b30eb423924bc","src/compile_fail/quicksort_race3.rs":"8403643e64c969306b1a9b1243378e6ccdd313b57e1878dbd31393618082fd35","src/compile_fail/rc_return.rs":"b6f1f821ef30086e2990db1ac58a92adaf31e57c23c587c7746d6303865c5c0f","src/compile_fail/rc_upvar.rs":"92a799b313fb88a0eb83fc1aaaea4b61604222b45e20f1c22ff5b092a03f8620","src/compile_fail/scope_join_bad.rs":"892959949f77cadfc07458473e7a290301182027ca64428df5a8ce887be0892b","src/job.rs":"9ca7c5fcfd05e12b607d08542d1ca1eff26a8cdd820d0fa9e8f5393928d27853","src/join/mod.rs":"b54e581f72b320ce544e885c968f8c96f6d873c47da9eab9e64f04915f67b7c8","src/join/test.rs":"9fbb741f97e38f7b69e63d81183e96dadb585bf5694335fed13af3090b1d3f76","src/latch.rs":"f607e89f2dcacec534e05d36d1ad686153eae0c4fab3eb9a0df342caeb502cf7","src/lib.rs":"2a6d83f55774d9e7e1d5e954d315ca150ef891dc315b64e150105d4f5a1cf4b2","src/log.rs":"d628635e157e36f5f6107015d660948392af30a76795674ab8a781f297c3b1c6","src/private.rs":"702ff02a2d0846d6d97b4164c7b4c2fbab2157ba5ba9c31fea5f1775ff3c9597","src/registry.rs":"c22776eee88e4567a85c1989660dad45fc9ef7ddbfeff5c914cd9482f4e4eae5","src/scope/mod.rs":"7973f5e8dd39084e83e2291b0da03dab4d859e014e1a4c770684e2cbab024390","src/scope/test.rs":"2980222cfabc132483333e4c8bae10ce2e8cc3770079cdc0ec79486ba05499ca","src/sleep/README.md":"1adec3679bdd836c911c9a2f9194793ac57deb83d9a95b93caec63e897fbcfec","src/sleep/mod.rs":"2dde585a6204a4fc4a21e3d7fca5d254f3b97dac49d1d505676e6b9b14b0990a","src/spawn/mod.rs":"89a5a96161d59a266f9292de43aa115a073e0ac8d770bcd72b97f772c46908c0","src/spawn/test.rs":"463e39211a1b3829954ed0e486145c510d4dcf6718c2daf9a2594ae05c3eb98f","src/test.rs":"edf421670c2b3b440971fdfa20139c11e7506a4cca14c4e36ccb76d073027521","src/thread_pool/mod.rs":"9f4cf183b84116de5a09b3da33617ad91bae8562e9bbd3d626adf7313504a0ad","src/thread_pool/test.rs":"b78a868a378b7d1b173219079cb64a882d8a2ad61457da0e6a4593ae1767aff1","src/tlv.rs":"fe9997bb586218901355ffde92d377bd0372336de6fe84f26adf1f6bdd2bf920","src/unwind.rs":"7baa4511467d008b14856ea8de7ced92b9251c9df4854f69c81f7efc3cf0cd6c","src/util.rs":"7b58c4aeb37b5e8a38f1028a673f06e712f6e9976a6fe938c05e06ead1c22469","src/worker_local.rs":"02d158f129b4c4b34dc502c7e00b3016fe98c26239341d003b88ce09ac5105ef","tests/double_init_fail.rs":"b6e0092f6f6a72af154ef582a844321cdd281413f3031d95ac3292373437e570","tests/init_zero_threads.rs":"57f66d1662f7782848d45942faa613a608188eb400943e4efa4c3ec3375e1dac","tests/scope_join.rs":"56f570c4b6a01704aacf93e7f17f89fe0f40f46ed6f9ede517abfe9adaf91f83","tests/scoped_threadpool.rs":"0f6475f440a57b6f91ecdd720228395f4feaa6165b136558f65267e185fd7127","tests/simple_panic.rs":"916d40d36c1a0fad3e1dfb31550f0672641feab4b03d480f039143dbe2f2445f","tests/stack_overflow_crash.rs":"e8865d33d51a58f5c6639f457d91f82f2a4379cf5129094eaa521e95bad72d51"},"package":"e94187d9ea3e8c38fafdbc38acb94eafa7ce155867f6ccb13830466a0d0db8c6"} \ No newline at end of file diff --git a/vendor/rustc-rayon-core/Cargo.toml b/vendor/rustc-rayon-core/Cargo.toml index 365ebf856d..bdfc2f8a4d 100644 --- a/vendor/rustc-rayon-core/Cargo.toml +++ b/vendor/rustc-rayon-core/Cargo.toml @@ -11,8 +11,9 @@ # will likely look very different (and much more reasonable) [package] +edition = "2018" name = "rustc-rayon-core" -version = "0.3.0" +version = "0.3.1" authors = ["Niko Matsakis ", "Josh Stone "] build = "build.rs" description = "Core APIs for Rayon - fork for rustc" @@ -48,13 +49,13 @@ path = "tests/simple_panic.rs" name = "scoped_threadpool" path = "tests/scoped_threadpool.rs" [dependencies.crossbeam-deque] -version = "0.7" +version = "0.7.2" [dependencies.crossbeam-queue] -version = "0.1.2" +version = "0.2" [dependencies.crossbeam-utils] -version = "0.6.5" +version = "0.7" [dependencies.lazy_static] version = "1" @@ -62,10 +63,10 @@ version = "1" [dependencies.num_cpus] version = "1.2" [dev-dependencies.rand] -version = "0.6" +version = "0.7" [dev-dependencies.rand_xorshift] -version = "0.1" +version = "0.2" [dev-dependencies.scoped-tls] version = "1.0" diff --git a/vendor/rustc-rayon-core/README.md b/vendor/rustc-rayon-core/README.md index 29bf4bde40..30415f18fd 100644 --- a/vendor/rustc-rayon-core/README.md +++ b/vendor/rustc-rayon-core/README.md @@ -10,4 +10,4 @@ Please see [Rayon Docs] for details about using Rayon. [Rayon Docs]: https://docs.rs/rayon/ -Rayon-core currently requires `rustc 1.28.0` or greater. +Rayon-core currently requires `rustc 1.31.0` or greater. diff --git a/vendor/rustc-rayon-core/src/internal/mod.rs b/vendor/rustc-rayon-core/src/internal/mod.rs deleted file mode 100644 index f9f2b8fc81..0000000000 --- a/vendor/rustc-rayon-core/src/internal/mod.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! The internal directory contains internal APIs not meant to be -//! exposed to "end-users" of Rayon, but rather which are useful for -//! constructing abstractions. -//! -//! These APIs are still unstable. - -pub mod task; -pub mod worker; diff --git a/vendor/rustc-rayon-core/src/internal/task.rs b/vendor/rustc-rayon-core/src/internal/task.rs deleted file mode 100644 index 5c49964e29..0000000000 --- a/vendor/rustc-rayon-core/src/internal/task.rs +++ /dev/null @@ -1,83 +0,0 @@ -//! Internal, unsafe APIs for creating scoped tasks. Intended for -//! building abstractions atop the rayon-core thread pool, rather than -//! direct use by end users. These APIs are mostly analogous to the -//! (safe) `scope`/`spawn` APIs, but with some unsafe requirements -//! that permit greater efficiency. - -use std::any::Any; -use std::sync::Arc; - -/// Represents a task that can be scheduled onto the Rayon -/// thread-pool. Once a task is scheduler, it will execute exactly -/// once (eventually). -pub trait Task: Send + Sync { - /// Invoked by the thread-pool when the task is ready to execute. - fn execute(this: Arc); -} - -/// Represents a handle onto some Rayon scope. This could be either a -/// local scope created by the `scope()` function or the global scope -/// for a thread-pool. To get a scope-handle, you can invoke -/// `ToScopeHandle::to_scope_handle()` on either a `scope` value or a -/// `ThreadPool`. -/// -/// The existence of `ScopeHandler` offers a guarantee: -/// -/// - The Rust lifetime `'scope` will not end until the scope-handle -/// is dropped, or until you invoke `panicked()` or `ok()`. -/// -/// This trait is intended to be used as follows: -/// -/// - You have a parallel task of type `T` to perform where `T: 's`, -/// meaning that any references that `T` contains outlive the lifetime -/// `'s`. -/// - You obtain a scope handle `h` of type `H` where `H: -/// ScopeHandle<'s>`; typically this would be by invoking -/// `to_scope_handle()` on a Rayon scope (of type `Scope<'s>`) or a -/// thread-pool (in which case `'s == 'static`). -/// - You invoke `h.spawn()` to start your job(s). This may be done -/// many times. -/// - Note that `h.spawn()` is an unsafe method. You must ensure -/// that your parallel jobs have completed before moving to -/// the next step. -/// - Eventually, when all invocations are complete, you invoke -/// either `panicked()` or `ok()`. -pub unsafe trait ScopeHandle<'scope>: 'scope { - /// Enqueues a task for execution within the thread-pool. The task - /// will eventually be invoked, and once it is, the `Arc` will be - /// dropped. - /// - /// **Unsafe:** The caller must guarantee that the scope handle - /// (`self`) will not be dropped (nor will `ok()` or `panicked()` - /// be called) until the task executes. Otherwise, the lifetime - /// `'scope` may end while the task is still pending. - unsafe fn spawn_task(&self, task: Arc); - - /// Indicates that some sub-task of this scope panicked with the - /// given `err`. This panic will be propagated back to the user as - /// appropriate, depending on how this scope handle was derived. - /// - /// This takes ownership of the scope handle, meaning that once - /// you invoke `panicked`, the scope is permitted to terminate - /// (and, in particular, the Rust lifetime `'scope` may end). - fn panicked(self, err: Box); - - /// Indicates that the sub-tasks of this scope that you have - /// spawned concluded successfully. - /// - /// This takes ownership of the scope handle, meaning that once - /// you invoke `panicked`, the scope is permitted to terminate - /// (and, in particular, the Rust lifetime `'scope` may end). - fn ok(self); -} - -/// Converts a Rayon structure (typically a `Scope` or `ThreadPool`) -/// into a "scope handle". See the `ScopeHandle` trait for more -/// details. -pub trait ToScopeHandle<'scope> { - /// Scope handle type that gets produced. - type ScopeHandle: ScopeHandle<'scope>; - - /// Convert the receiver into a scope handle. - fn to_scope_handle(&self) -> Self::ScopeHandle; -} diff --git a/vendor/rustc-rayon-core/src/internal/worker.rs b/vendor/rustc-rayon-core/src/internal/worker.rs deleted file mode 100644 index fdf31ac8d9..0000000000 --- a/vendor/rustc-rayon-core/src/internal/worker.rs +++ /dev/null @@ -1,67 +0,0 @@ -//! Internal, unsafe APIs for manipulating or querying the current -//! worker thread. Intended for building abstractions atop the -//! rayon-core thread pool, rather than direct use by end users. - -use latch::LatchProbe; -use registry; -use std::fmt; - -/// Represents the active worker thread. -pub struct WorkerThread<'w> { - thread: &'w registry::WorkerThread, -} - -impl<'w> WorkerThread<'w> { - /// Causes the worker thread to wait until `f()` returns true. - /// While the thread is waiting, it will attempt to steal work - /// from other threads, and may go to sleep if there is no work to - /// steal. - /// - /// **Dead-lock warning: This is a low-level interface and cannot - /// be used to wait on arbitrary conditions.** In particular, if - /// the Rayon thread goes to sleep, it will only be awoken when - /// new rayon events occur (e.g., `spawn()` or `join()` is - /// invoked, or one of the methods on a `ScopeHandle`). Therefore, - /// you must ensure that, once the condition `f()` becomes true, - /// some "rayon event" will also occur to ensure that waiting - /// threads are awoken. - pub unsafe fn wait_until_true(&self, f: F) - where - F: Fn() -> bool, - { - struct DummyLatch<'a, F: 'a> { - f: &'a F, - } - - impl<'a, F: Fn() -> bool> LatchProbe for DummyLatch<'a, F> { - fn probe(&self) -> bool { - (self.f)() - } - } - - self.thread.wait_until(&DummyLatch { f: &f }); - } -} - -impl<'w> fmt::Debug for WorkerThread<'w> { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - fmt.debug_struct("WorkerThread") - .field("pool", &self.thread.registry().id()) - .field("index", &self.thread.index()) - .finish() - } -} - -/// If the current thread is a Rayon worker thread, then the callback -/// is invoked with a reference to the worker-thread the result of -/// that callback is returned with `Some`. Otherwise, if we are not on -/// a Rayon worker thread, `None` is immediately returned. -pub fn if_in_worker_thread(if_true: F) -> Option -where - F: FnOnce(&WorkerThread) -> R, -{ - unsafe { - let thread = registry::WorkerThread::current().as_ref()?; - Some(if_true(&WorkerThread { thread })) - } -} diff --git a/vendor/rustc-rayon-core/src/job.rs b/vendor/rustc-rayon-core/src/job.rs index 2eea398c4c..60a6cc950e 100644 --- a/vendor/rustc-rayon-core/src/job.rs +++ b/vendor/rustc-rayon-core/src/job.rs @@ -1,10 +1,10 @@ +use crate::latch::Latch; +use crate::tlv; +use crate::unwind; use crossbeam_queue::SegQueue; -use latch::Latch; use std::any::Any; use std::cell::UnsafeCell; use std::mem; -use tlv; -use unwind; pub(super) enum JobResult { None, diff --git a/vendor/rustc-rayon-core/src/join/mod.rs b/vendor/rustc-rayon-core/src/join/mod.rs index 7f8a5a2fcc..15fc1cde26 100644 --- a/vendor/rustc-rayon-core/src/join/mod.rs +++ b/vendor/rustc-rayon-core/src/join/mod.rs @@ -1,12 +1,12 @@ -use job::StackJob; -use latch::{LatchProbe, SpinLatch}; -use log::Event::*; -use registry::{self, WorkerThread}; +use crate::job::StackJob; +use crate::latch::{LatchProbe, SpinLatch}; +use crate::log::Event::*; +use crate::registry::{self, WorkerThread}; +use crate::tlv; +use crate::unwind; use std::any::Any; -use tlv; -use unwind; -use FnContext; +use crate::FnContext; #[cfg(test)] mod test; @@ -169,7 +169,6 @@ where tlv::set(tlv); let result_b = job_b.run_inline(injected); - return (result_a, result_b); } else { log!(PoppedJob { diff --git a/vendor/rustc-rayon-core/src/join/test.rs b/vendor/rustc-rayon-core/src/join/test.rs index fbf4690db9..7b5c7a2bbf 100644 --- a/vendor/rustc-rayon-core/src/join/test.rs +++ b/vendor/rustc-rayon-core/src/join/test.rs @@ -1,11 +1,11 @@ //! Tests for the join code. -use join::*; +use crate::join::*; +use crate::unwind; +use crate::ThreadPoolBuilder; use rand::distributions::Standard; use rand::{Rng, SeedableRng}; use rand_xorshift::XorShiftRng; -use unwind; -use ThreadPoolBuilder; fn quick_sort(v: &mut [T]) { if v.len() <= 1 { @@ -38,7 +38,7 @@ fn seeded_rng() -> XorShiftRng { #[test] fn sort() { - let mut rng = seeded_rng(); + let rng = seeded_rng(); let mut data: Vec = rng.sample_iter(&Standard).take(6 * 1024).collect(); let mut sorted_data = data.clone(); sorted_data.sort(); @@ -48,7 +48,7 @@ fn sort() { #[test] fn sort_in_pool() { - let mut rng = seeded_rng(); + let rng = seeded_rng(); let mut data: Vec = rng.sample_iter(&Standard).take(12 * 1024).collect(); let pool = ThreadPoolBuilder::new().build().unwrap(); diff --git a/vendor/rustc-rayon-core/src/latch.rs b/vendor/rustc-rayon-core/src/latch.rs index db97224f06..667747e90c 100644 --- a/vendor/rustc-rayon-core/src/latch.rs +++ b/vendor/rustc-rayon-core/src/latch.rs @@ -2,7 +2,7 @@ use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::{Condvar, Mutex}; use std::usize; -use sleep::Sleep; +use crate::sleep::Sleep; /// We define various kinds of latches, which are all a primitive signaling /// mechanism. A latch starts as false. Eventually someone calls `set()` and diff --git a/vendor/rustc-rayon-core/src/lib.rs b/vendor/rustc-rayon-core/src/lib.rs index 986ca8b936..186f1a08d6 100644 --- a/vendor/rustc-rayon-core/src/lib.rs +++ b/vendor/rustc-rayon-core/src/lib.rs @@ -19,7 +19,7 @@ //! conflicting requirements will need to be resolved before the build will //! succeed. -#![doc(html_root_url = "https://docs.rs/rayon-core/1.6")] +#![doc(html_root_url = "https://docs.rs/rayon-core/1.7")] use std::any::Any; use std::env; @@ -29,19 +29,6 @@ use std::io; use std::marker::PhantomData; use std::str::FromStr; -extern crate crossbeam_deque; -extern crate crossbeam_queue; -extern crate crossbeam_utils; -#[cfg(any(debug_assertions, rayon_unstable))] -#[macro_use] -extern crate lazy_static; -extern crate num_cpus; - -#[cfg(test)] -extern crate rand; -#[cfg(test)] -extern crate rand_xorshift; - #[macro_use] mod log; #[macro_use] @@ -64,20 +51,18 @@ mod test; pub mod tlv; -#[cfg(rayon_unstable)] -pub mod internal; -pub use join::{join, join_context}; -pub use registry::ThreadBuilder; -pub use registry::{mark_blocked, mark_unblocked, Registry}; -pub use scope::{scope, Scope}; -pub use scope::{scope_fifo, ScopeFifo}; -pub use spawn::{spawn, spawn_fifo}; -pub use thread_pool::current_thread_has_pending_tasks; -pub use thread_pool::current_thread_index; -pub use thread_pool::ThreadPool; +pub use self::join::{join, join_context}; +pub use self::registry::ThreadBuilder; +pub use self::registry::{mark_blocked, mark_unblocked, Registry}; +pub use self::scope::{scope, Scope}; +pub use self::scope::{scope_fifo, ScopeFifo}; +pub use self::spawn::{spawn, spawn_fifo}; +pub use self::thread_pool::current_thread_has_pending_tasks; +pub use self::thread_pool::current_thread_index; +pub use self::thread_pool::ThreadPool; pub use worker_local::WorkerLocal; -use registry::{CustomSpawn, DefaultSpawn, ThreadSpawn}; +use self::registry::{CustomSpawn, DefaultSpawn, ThreadSpawn}; /// Returns the number of threads in the current registry. If this /// code is executing within a Rayon thread-pool, then this will be @@ -98,7 +83,7 @@ use registry::{CustomSpawn, DefaultSpawn, ThreadSpawn}; /// /// [snt]: struct.ThreadPoolBuilder.html#method.num_threads pub fn current_num_threads() -> usize { - ::registry::Registry::current_num_threads() + crate::registry::Registry::current_num_threads() } /// Error when initializing a thread pool. @@ -280,11 +265,9 @@ impl ThreadPoolBuilder { /// A scoped pool may be useful in combination with scoped thread-local variables. /// /// ``` - /// #[macro_use] - /// extern crate scoped_tls; /// # use rayon_core as rayon; /// - /// scoped_thread_local!(static POOL_DATA: Vec); + /// scoped_tls::scoped_thread_local!(static POOL_DATA: Vec); /// /// fn main() -> Result<(), rayon::ThreadPoolBuildError> { /// let pool_data = vec![1, 2, 3]; @@ -742,7 +725,7 @@ impl Error for ThreadPoolBuildError { } impl fmt::Display for ThreadPoolBuildError { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self.kind { ErrorKind::IOError(ref e) => e.fmt(f), _ => self.description().fmt(f), @@ -758,7 +741,7 @@ pub fn initialize(config: Configuration) -> Result<(), Box> { } impl fmt::Debug for ThreadPoolBuilder { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let ThreadPoolBuilder { ref num_threads, ref get_thread_name, @@ -777,7 +760,7 @@ impl fmt::Debug for ThreadPoolBuilder { // output. struct ClosurePlaceholder; impl fmt::Debug for ClosurePlaceholder { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str("") } } @@ -815,7 +798,7 @@ impl Default for Configuration { #[allow(deprecated)] impl fmt::Debug for Configuration { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { self.builder.fmt(f) } } diff --git a/vendor/rustc-rayon-core/src/log.rs b/vendor/rustc-rayon-core/src/log.rs index 053d37dad1..687370d0b5 100644 --- a/vendor/rustc-rayon-core/src/log.rs +++ b/vendor/rustc-rayon-core/src/log.rs @@ -90,7 +90,7 @@ pub(super) enum Event { } #[cfg(debug_assertions)] -lazy_static! { +lazy_static::lazy_static! { pub(super) static ref LOG_ENV: bool = env::var("RAYON_LOG").is_ok() || env::var("RAYON_RS_LOG").is_ok(); } diff --git a/vendor/rustc-rayon-core/src/private.rs b/vendor/rustc-rayon-core/src/private.rs index 5d084ff146..a99dd11fb2 100644 --- a/vendor/rustc-rayon-core/src/private.rs +++ b/vendor/rustc-rayon-core/src/private.rs @@ -13,14 +13,14 @@ macro_rules! private_decl { /// This trait is private; this method exists to make it /// impossible to implement outside the crate. #[doc(hidden)] - fn __rayon_private__(&self) -> ::private::PrivateMarker; + fn __rayon_private__(&self) -> crate::private::PrivateMarker; } } macro_rules! private_impl { () => { - fn __rayon_private__(&self) -> ::private::PrivateMarker { - ::private::PrivateMarker + fn __rayon_private__(&self) -> crate::private::PrivateMarker { + crate::private::PrivateMarker } } } diff --git a/vendor/rustc-rayon-core/src/registry.rs b/vendor/rustc-rayon-core/src/registry.rs index 4e7f1a7b1f..b63a79ff19 100644 --- a/vendor/rustc-rayon-core/src/registry.rs +++ b/vendor/rustc-rayon-core/src/registry.rs @@ -1,13 +1,15 @@ +use crate::job::{JobFifo, JobRef, StackJob}; +use crate::latch::{CountLatch, Latch, LatchProbe, LockLatch, SpinLatch, TickleLatch}; +use crate::log::Event::*; +use crate::sleep::Sleep; +use crate::unwind; +use crate::util::leak; +use crate::{ + AcquireThreadHandler, DeadlockHandler, ErrorKind, ExitHandler, PanicHandler, + ReleaseThreadHandler, StartHandler, ThreadPoolBuildError, ThreadPoolBuilder, +}; use crossbeam_deque::{Steal, Stealer, Worker}; use crossbeam_queue::SegQueue; -#[cfg(rayon_unstable)] -use internal::task::Task; -#[cfg(rayon_unstable)] -use job::Job; -use job::{JobFifo, JobRef, StackJob}; -use latch::{CountLatch, Latch, LatchProbe, LockLatch, SpinLatch, TickleLatch}; -use log::Event::*; -use sleep::Sleep; use std::any::Any; use std::cell::Cell; use std::collections::hash_map::DefaultHasher; @@ -22,12 +24,6 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::{Arc, Once}; use std::thread; use std::usize; -use unwind; -use util::leak; -use { - AcquireThreadHandler, DeadlockHandler, ErrorKind, ExitHandler, PanicHandler, - ReleaseThreadHandler, StartHandler, ThreadPoolBuildError, ThreadPoolBuilder, -}; /// Thread builder used for customization via /// [`ThreadPoolBuilder::spawn_handler`](struct.ThreadPoolBuilder.html#method.spawn_handler). @@ -63,7 +59,7 @@ impl ThreadBuilder { } impl fmt::Debug for ThreadBuilder { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.debug_struct("ThreadBuilder") .field("pool", &self.registry.id()) .field("index", &self.index) @@ -82,7 +78,7 @@ pub trait ThreadSpawn { /// Spawn a thread with the `ThreadBuilder` parameters, and then /// call `ThreadBuilder::run()`. - fn spawn(&mut self, ThreadBuilder) -> io::Result<()>; + fn spawn(&mut self, thread: ThreadBuilder) -> io::Result<()>; } /// Spawns a thread in the "normal" way with `std::thread::Builder`. @@ -276,11 +272,6 @@ impl Registry { Ok(registry.clone()) } - #[cfg(rayon_unstable)] - pub(super) fn global() -> Arc { - global_registry().clone() - } - pub fn current() -> Arc { unsafe { let worker_thread = WorkerThread::current(); @@ -399,53 +390,6 @@ impl Registry { } } - /// Unsafe: the caller must guarantee that `task` will stay valid - /// until it executes. - #[cfg(rayon_unstable)] - pub(super) unsafe fn submit_task(&self, task: Arc) - where - T: Task, - { - let task_job = TaskJob::new(task); - let task_job_ref = TaskJob::into_job_ref(task_job); - return self.inject_or_push(task_job_ref); - - /// A little newtype wrapper for `T`, just because I did not - /// want to implement `Job` for all `T: Task`. - struct TaskJob { - _data: T, - } - - impl TaskJob { - fn new(arc: Arc) -> Arc { - // `TaskJob` has the same layout as `T`, so we can safely - // tranmsute this `T` into a `TaskJob`. This lets us write our - // impls of `Job` for `TaskJob`, making them more restricted. - // Since `Job` is a private trait, this is not strictly necessary, - // I don't think, but makes me feel better. - unsafe { mem::transmute(arc) } - } - - fn into_task(this: Arc>) -> Arc { - // Same logic as `new()` - unsafe { mem::transmute(this) } - } - - unsafe fn into_job_ref(this: Arc) -> JobRef { - let this: *const Self = mem::transmute(this); - JobRef::new(this) - } - } - - impl Job for TaskJob { - unsafe fn execute(this: *const Self) { - let this: Arc = mem::transmute(this); - let task: Arc = TaskJob::into_task(this); - Task::execute(task); - } - } - } - /// Push a job into the "external jobs" queue; it will be taken by /// whatever worker has nothing to do. Use this is you know that /// you are not on a worker of this registry. diff --git a/vendor/rustc-rayon-core/src/scope/internal.rs b/vendor/rustc-rayon-core/src/scope/internal.rs deleted file mode 100644 index 30e07920af..0000000000 --- a/vendor/rustc-rayon-core/src/scope/internal.rs +++ /dev/null @@ -1,61 +0,0 @@ -#![cfg(rayon_unstable)] - -use super::{Scope, ScopeBase}; -use internal::task::{ScopeHandle, Task, ToScopeHandle}; -use std::any::Any; -use std::mem; -use std::sync::Arc; - -impl<'scope> ToScopeHandle<'scope> for Scope<'scope> { - type ScopeHandle = LocalScopeHandle<'scope>; - - fn to_scope_handle(&self) -> Self::ScopeHandle { - unsafe { LocalScopeHandle::new(self) } - } -} - -#[derive(Debug)] -pub struct LocalScopeHandle<'scope> { - scope: *const ScopeBase<'scope>, -} - -impl<'scope> LocalScopeHandle<'scope> { - /// Caller guarantees that `*scope` will remain valid - /// until the scope completes. Since we acquire a ref, - /// that means it will remain valid until we release it. - unsafe fn new(scope: &Scope<'scope>) -> Self { - scope.base.increment(); - LocalScopeHandle { scope: &scope.base } - } -} - -impl<'scope> Drop for LocalScopeHandle<'scope> { - fn drop(&mut self) { - unsafe { - if !self.scope.is_null() { - (*self.scope).job_completed_ok(); - } - } - } -} - -/// We assert that the `Self` type remains valid until a -/// method is called, and that `'scope` will not end until -/// that point. -unsafe impl<'scope> ScopeHandle<'scope> for LocalScopeHandle<'scope> { - unsafe fn spawn_task(&self, task: Arc) { - let scope = &*self.scope; - scope.registry.submit_task(task); - } - - fn ok(self) { - mem::drop(self); - } - - fn panicked(self, err: Box) { - unsafe { - (*self.scope).job_panicked(err); - mem::forget(self); // no need to run dtor now - } - } -} diff --git a/vendor/rustc-rayon-core/src/scope/mod.rs b/vendor/rustc-rayon-core/src/scope/mod.rs index 780243220f..70b70989af 100644 --- a/vendor/rustc-rayon-core/src/scope/mod.rs +++ b/vendor/rustc-rayon-core/src/scope/mod.rs @@ -4,10 +4,12 @@ //! [`scope()`]: fn.scope.html //! [`join()`]: ../join/join.fn.html -use job::{HeapJob, JobFifo}; -use latch::{CountLatch, Latch}; -use log::Event::*; -use registry::{in_worker, Registry, WorkerThread}; +use crate::job::{HeapJob, JobFifo}; +use crate::latch::{CountLatch, Latch}; +use crate::log::Event::*; +use crate::registry::{in_worker, Registry, WorkerThread}; +use crate::tlv; +use crate::unwind; use std::any::Any; use std::fmt; use std::marker::PhantomData; @@ -15,10 +17,7 @@ use std::mem; use std::ptr; use std::sync::atomic::{AtomicPtr, Ordering}; use std::sync::Arc; -use tlv; -use unwind; -mod internal; #[cfg(test)] mod test; @@ -644,7 +643,7 @@ impl<'scope> fmt::Debug for Scope<'scope> { } impl<'scope> fmt::Debug for ScopeFifo<'scope> { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { fmt.debug_struct("ScopeFifo") .field("num_fifos", &self.fifos.len()) .field("pool_id", &self.base.registry.id()) diff --git a/vendor/rustc-rayon-core/src/scope/test.rs b/vendor/rustc-rayon-core/src/scope/test.rs index 37f5e29a01..3d855ecda7 100644 --- a/vendor/rustc-rayon-core/src/scope/test.rs +++ b/vendor/rustc-rayon-core/src/scope/test.rs @@ -1,3 +1,6 @@ +use crate::unwind; +use crate::ThreadPoolBuilder; +use crate::{scope, scope_fifo, Scope}; use rand::{Rng, SeedableRng}; use rand_xorshift::XorShiftRng; use std::cmp; @@ -5,9 +8,6 @@ use std::iter::once; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::Mutex; use std::vec; -use unwind; -use ThreadPoolBuilder; -use {scope, scope_fifo, Scope}; #[test] fn scope_empty() { diff --git a/vendor/rustc-rayon-core/src/sleep/mod.rs b/vendor/rustc-rayon-core/src/sleep/mod.rs index f953ff3205..f9c6f035be 100644 --- a/vendor/rustc-rayon-core/src/sleep/mod.rs +++ b/vendor/rustc-rayon-core/src/sleep/mod.rs @@ -1,13 +1,13 @@ //! Code that decides when workers should go to sleep. See README.md //! for an overview. -use log::Event::*; -use registry::Registry; +use crate::log::Event::*; +use crate::registry::Registry; +use crate::DeadlockHandler; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::{Condvar, Mutex}; use std::thread; use std::usize; -use DeadlockHandler; struct SleepData { /// The number of threads in the thread pool. diff --git a/vendor/rustc-rayon-core/src/spawn/mod.rs b/vendor/rustc-rayon-core/src/spawn/mod.rs index 66e0e1f3dd..a945827d03 100644 --- a/vendor/rustc-rayon-core/src/spawn/mod.rs +++ b/vendor/rustc-rayon-core/src/spawn/mod.rs @@ -1,8 +1,8 @@ -use job::*; -use registry::Registry; +use crate::job::*; +use crate::registry::Registry; +use crate::unwind; use std::mem; use std::sync::Arc; -use unwind; /// Fires off a task into the Rayon threadpool in the "static" or /// "global" scope. Just like a standard thread, this task is not diff --git a/vendor/rustc-rayon-core/src/spawn/test.rs b/vendor/rustc-rayon-core/src/spawn/test.rs index 9b9daab172..9c59754f74 100644 --- a/vendor/rustc-rayon-core/src/spawn/test.rs +++ b/vendor/rustc-rayon-core/src/spawn/test.rs @@ -1,10 +1,10 @@ -use scope; +use crate::scope; use std::any::Any; use std::sync::mpsc::channel; use std::sync::Mutex; use super::{spawn, spawn_fifo}; -use ThreadPoolBuilder; +use crate::ThreadPoolBuilder; #[test] fn spawn_then_join_in_worker() { diff --git a/vendor/rustc-rayon-core/src/test.rs b/vendor/rustc-rayon-core/src/test.rs index 2ba27e0e80..015d3ec96c 100644 --- a/vendor/rustc-rayon-core/src/test.rs +++ b/vendor/rustc-rayon-core/src/test.rs @@ -1,10 +1,10 @@ #![cfg(test)] +#[allow(deprecated)] +use crate::Configuration; +use crate::{ThreadPoolBuildError, ThreadPoolBuilder}; use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::{Arc, Barrier}; -#[allow(deprecated)] -use Configuration; -use {ThreadPoolBuildError, ThreadPoolBuilder}; #[test] fn worker_thread_index() { diff --git a/vendor/rustc-rayon-core/src/thread_pool/internal.rs b/vendor/rustc-rayon-core/src/thread_pool/internal.rs deleted file mode 100644 index 29e439026e..0000000000 --- a/vendor/rustc-rayon-core/src/thread_pool/internal.rs +++ /dev/null @@ -1,65 +0,0 @@ -#![cfg(rayon_unstable)] - -use super::ThreadPool; -use internal::task::{ScopeHandle, Task, ToScopeHandle}; -use registry::Registry; -use std::any::Any; -use std::fmt; -use std::sync::Arc; - -impl ToScopeHandle<'static> for ThreadPool { - type ScopeHandle = ThreadPoolScopeHandle; - - fn to_scope_handle(&self) -> Self::ScopeHandle { - unsafe { ThreadPoolScopeHandle::new(self.registry.clone()) } - } -} - -pub struct ThreadPoolScopeHandle { - registry: Arc, -} - -impl fmt::Debug for ThreadPoolScopeHandle { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { - fmt.debug_struct("ThreadPoolScopeHandle") - .field("pool", &self.registry.id()) - .finish() - } -} - -impl ThreadPoolScopeHandle { - /// Caller asserts that the registry has not yet terminated. - unsafe fn new(registry: Arc) -> Self { - registry.increment_terminate_count(); - ThreadPoolScopeHandle { registry } - } -} - -impl Drop for ThreadPoolScopeHandle { - fn drop(&mut self) { - self.registry.terminate(); - } -} - -/// We assert that: -/// -/// (a) the scope valid remains valid until a completion method -/// is called. In this case, "remains valid" means that the -/// registry is not terminated. This is true because we -/// acquire a "termination count" in `StaticFutureScope::new()` -/// which is not released until `future_panicked()` or -/// `future_completed()` is invoked. -/// (b) the lifetime `'static` will not end until a completion -/// method is called. This is true because `'static` doesn't -/// end until the end of the program. -unsafe impl ScopeHandle<'static> for ThreadPoolScopeHandle { - unsafe fn spawn_task(&self, task: Arc) { - self.registry.submit_task(task); - } - - fn ok(self) {} - - fn panicked(self, err: Box) { - self.registry.handle_panic(err); - } -} diff --git a/vendor/rustc-rayon-core/src/thread_pool/mod.rs b/vendor/rustc-rayon-core/src/thread_pool/mod.rs index fc1a90f645..42ab287787 100644 --- a/vendor/rustc-rayon-core/src/thread_pool/mod.rs +++ b/vendor/rustc-rayon-core/src/thread_pool/mod.rs @@ -3,19 +3,18 @@ //! //! [`ThreadPool`]: struct.ThreadPool.html -use join; -use registry::{Registry, ThreadSpawn, WorkerThread}; -use spawn; +use crate::join; +use crate::registry::{Registry, ThreadSpawn, WorkerThread}; +use crate::spawn; +#[allow(deprecated)] +use crate::Configuration; +use crate::{scope, Scope}; +use crate::{scope_fifo, ScopeFifo}; +use crate::{ThreadPoolBuildError, ThreadPoolBuilder}; use std::error::Error; use std::fmt; use std::sync::Arc; -#[allow(deprecated)] -use Configuration; -use {scope, Scope}; -use {scope_fifo, ScopeFifo}; -use {ThreadPoolBuildError, ThreadPoolBuilder}; -mod internal; mod test; /// Represents a user created [thread-pool]. @@ -71,27 +70,6 @@ impl ThreadPool { Ok(ThreadPool { registry }) } - /// Returns a handle to the global thread pool. This is the pool - /// that Rayon will use by default when you perform a `join()` or - /// `scope()` operation, if no other thread-pool is installed. If - /// no global thread-pool has yet been started when this function - /// is called, then the global thread-pool will be created (with - /// the default configuration). If you wish to configure the - /// global thread-pool differently, then you can use [the - /// `rayon::initialize()` function][f] to do so. - /// - /// [f]: fn.initialize.html - #[cfg(rayon_unstable)] - pub fn global() -> &'static Arc { - lazy_static! { - static ref DEFAULT_THREAD_POOL: Arc = Arc::new(ThreadPool { - registry: Registry::global() - }); - } - - &DEFAULT_THREAD_POOL - } - /// Executes `op` within the threadpool. Any attempts to use /// `join`, `scope`, or parallel iterators will then operate /// within that threadpool. @@ -289,7 +267,7 @@ impl Drop for ThreadPool { } impl fmt::Debug for ThreadPool { - fn fmt(&self, fmt: &mut fmt::Formatter) -> fmt::Result { + fn fmt(&self, fmt: &mut fmt::Formatter<'_>) -> fmt::Result { fmt.debug_struct("ThreadPool") .field("num_threads", &self.current_num_threads()) .field("id", &self.registry.id()) diff --git a/vendor/rustc-rayon-core/src/thread_pool/test.rs b/vendor/rustc-rayon-core/src/thread_pool/test.rs index c1ddca9828..dc077d21dc 100644 --- a/vendor/rustc-rayon-core/src/thread_pool/test.rs +++ b/vendor/rustc-rayon-core/src/thread_pool/test.rs @@ -4,12 +4,12 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use std::sync::mpsc::channel; use std::sync::{Arc, Mutex}; -use join; -use thread_pool::ThreadPool; -use unwind; +use crate::join; +use crate::thread_pool::ThreadPool; + #[allow(deprecated)] -use Configuration; -use ThreadPoolBuilder; +use crate::Configuration; +use crate::ThreadPoolBuilder; #[test] #[should_panic(expected = "Hello, world!")] @@ -134,7 +134,7 @@ fn panic_thread_name() { format!("panic_thread_name#{}", i) }); - let pool = unwind::halt_unwinding(|| builder.build()); + let pool = crate::unwind::halt_unwinding(|| builder.build()); assert!(pool.is_err(), "thread-name panic should propagate!"); // Assuming they're created in order, threads 0 through 4 should have diff --git a/vendor/rustc-rayon-core/src/worker_local.rs b/vendor/rustc-rayon-core/src/worker_local.rs index 4b92bd939b..f75335fb91 100644 --- a/vendor/rustc-rayon-core/src/worker_local.rs +++ b/vendor/rustc-rayon-core/src/worker_local.rs @@ -1,4 +1,4 @@ -use registry::{Registry, WorkerThread}; +use crate::registry::{Registry, WorkerThread}; use std::fmt; use std::ops::Deref; use std::sync::Arc; @@ -15,8 +15,10 @@ pub struct WorkerLocal { registry: Arc, } -unsafe impl Send for WorkerLocal {} -unsafe impl Sync for WorkerLocal {} +/// We prevent concurrent access to the underlying value in the +/// Deref impl, thus any values safe to send across threads can +/// be used with WorkerLocal. +unsafe impl Sync for WorkerLocal {} impl WorkerLocal { /// Creates a new worker local where the `initial` closure computes the @@ -60,7 +62,9 @@ impl WorkerLocal> { impl fmt::Debug for WorkerLocal { fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - fmt::Debug::fmt(&self.locals, f) + f.debug_struct("WorkerLocal") + .field("registry", &self.registry.id()) + .finish() } } diff --git a/vendor/rustc-rayon-core/tests/double_init_fail.rs b/vendor/rustc-rayon-core/tests/double_init_fail.rs index 2b9818465e..49b6523659 100644 --- a/vendor/rustc-rayon-core/tests/double_init_fail.rs +++ b/vendor/rustc-rayon-core/tests/double_init_fail.rs @@ -1,5 +1,3 @@ -extern crate rayon_core; - use rayon_core::ThreadPoolBuilder; use std::error::Error; diff --git a/vendor/rustc-rayon-core/tests/init_zero_threads.rs b/vendor/rustc-rayon-core/tests/init_zero_threads.rs index eb4137e9a7..ebd73c585d 100644 --- a/vendor/rustc-rayon-core/tests/init_zero_threads.rs +++ b/vendor/rustc-rayon-core/tests/init_zero_threads.rs @@ -1,5 +1,3 @@ -extern crate rayon_core; - use rayon_core::ThreadPoolBuilder; #[test] diff --git a/vendor/rustc-rayon-core/tests/scope_join.rs b/vendor/rustc-rayon-core/tests/scope_join.rs index 30985eb74f..9d88133bc5 100644 --- a/vendor/rustc-rayon-core/tests/scope_join.rs +++ b/vendor/rustc-rayon-core/tests/scope_join.rs @@ -1,5 +1,3 @@ -extern crate rayon_core; - /// Test that one can emulate join with `scope`: fn pseudo_join(f: F, g: G) where diff --git a/vendor/rustc-rayon-core/tests/scoped_threadpool.rs b/vendor/rustc-rayon-core/tests/scoped_threadpool.rs index f1abdea2e0..db3d0b8743 100644 --- a/vendor/rustc-rayon-core/tests/scoped_threadpool.rs +++ b/vendor/rustc-rayon-core/tests/scoped_threadpool.rs @@ -1,16 +1,10 @@ -extern crate crossbeam_utils; -extern crate rayon_core; - -#[macro_use] -extern crate scoped_tls; - use crossbeam_utils::thread; use rayon_core::ThreadPoolBuilder; #[derive(PartialEq, Eq, Debug)] struct Local(i32); -scoped_thread_local!(static LOCAL: Local); +scoped_tls::scoped_thread_local!(static LOCAL: Local); #[test] fn missing_scoped_tls() { diff --git a/vendor/rustc-rayon-core/tests/simple_panic.rs b/vendor/rustc-rayon-core/tests/simple_panic.rs index 3a5a7890a7..2564482a47 100644 --- a/vendor/rustc-rayon-core/tests/simple_panic.rs +++ b/vendor/rustc-rayon-core/tests/simple_panic.rs @@ -1,5 +1,3 @@ -extern crate rayon_core; - use rayon_core::join; #[test] diff --git a/vendor/rustc-rayon-core/tests/stack_overflow_crash.rs b/vendor/rustc-rayon-core/tests/stack_overflow_crash.rs index 954823bdd4..61288982c2 100644 --- a/vendor/rustc-rayon-core/tests/stack_overflow_crash.rs +++ b/vendor/rustc-rayon-core/tests/stack_overflow_crash.rs @@ -1,7 +1,3 @@ -#[cfg(unix)] -extern crate libc; -extern crate rayon_core; - use rayon_core::ThreadPoolBuilder; use std::env; diff --git a/vendor/rustc-rayon/.cargo-checksum.json b/vendor/rustc-rayon/.cargo-checksum.json index df77d0618e..d8801e7911 100644 --- a/vendor/rustc-rayon/.cargo-checksum.json +++ b/vendor/rustc-rayon/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.lock":"83e67039d6cd63ca72af4b1b5628deab10f39bdc15e270a84fba1b64af06d890","Cargo.toml":"0ceafdecf444fd72330615f11b0ede5a8a407c97cc40c5a84f0b3ccb6b1bb9d0","FAQ.md":"23e5c1ac0158e9e33dae4d3f48bb6b63037ee16e55c476da4cbeedcabe0be0fc","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720","README.md":"e70e19b9564b62d7822034e06db77c33b14a05408f1310d16b1e92baa1238f32","RELEASES.md":"b1905ddd133208e4511ec0d3da9f8a292f250a42b33cf94fd3d40858c93b0df1","examples/README.md":"537e6fe9cf696fd4ada9c08bf31055ed6e366ed65668a523e7c5fde77f97c8d3","examples/cpu_monitor.rs":"309eeca61748ff24fc164f791bae03fb7b56cb0e3f9778e3030ba3e574365ae8","src/collections/binary_heap.rs":"b32cff53e94700ae3a8d53bc86e0188a2fefcd190e7fea2b2c5e4de7f57583ab","src/collections/btree_map.rs":"8b8ad1b53eee147dc664edc3da240345d1c8ebd6fa50804126a55f6e90b10967","src/collections/btree_set.rs":"476bae2eaaf4a5d51b6805406905504ad4c4318b3e14f9be90729c57ca3eb56f","src/collections/hash_map.rs":"a7095c4721cbdbf87579f49988044e1725607f444b0eb73087f510a5140fea57","src/collections/hash_set.rs":"a0b9cc007d5e0a28dd7bb01892ec64e17af018ae3a9a16508c875b9c6d67b756","src/collections/linked_list.rs":"ea9f927475985e719ff912063d94998ed449803e24a008cbeff93aef0b68350a","src/collections/mod.rs":"037660cbdd5907808f7df59fa69993582bf978ecaf125a83a1205452bb505a53","src/collections/vec_deque.rs":"130673791079f7efdddd029f4a80c38a7afa319cd9c355f495b3416379cbd4df","src/compile_fail/cannot_collect_filtermap_data.rs":"6a141076c14f95e31bed3433d531bc05d806eed9e0018d1b21420d7ab2fc7eb9","src/compile_fail/cannot_zip_filtered_data.rs":"a28cfb3d00b8d277bfa77a10ca132f972e8f100080ef602fdd3c6fd36ad2a156","src/compile_fail/cell_par_iter.rs":"4f076862d9c66ed42a642a5be97116ca5982608ab76816a8f8305182bf463e9e","src/compile_fail/mod.rs":"2c346e4b52941fe0ac2667eeb753c0c21a1f998a544bb9d9167f200caba0a7bb","src/compile_fail/must_use.rs":"e6f518c3b0fa0d847b48ab19d794f93fbecf988b645240f3f6ae9c8ac2c71769","src/compile_fail/no_send_par_iter.rs":"ef72499a2df310d9ed85de8128af2040b04d3716814b511a175ac7ff5469b41a","src/compile_fail/rc_par_iter.rs":"0faf3d26a665c3e2acc2f2f1d66ee234e561d24442efa4980a5e946e1cb2eba3","src/delegate.rs":"fa05c22227346baf147da03195e96dc0f705aaf7b2295f02f9f996c22295701e","src/iter/chain.rs":"b24122d618daaa5cf8cfe4b80360551847c72208d72201eca56f2f63f54eb636","src/iter/chunks.rs":"f702a85789ceda328b4e3e47a8813749dd16cbe5d120b47d364aa408a923584a","src/iter/cloned.rs":"687f7122cbc5f6102633aa552779f916ec6c3bfe808957c1d1ca35f46111e0d2","src/iter/collect/consumer.rs":"1d5c48254a72a28dec77906a458af55abc6c127fbed6d489ae39fc59724d1668","src/iter/collect/mod.rs":"e7f937e75401d97c1df0590896c5bf07d3061c88259db82a536f7b1d9fe72859","src/iter/collect/test.rs":"b8102dba8c69c9987f3f120dc7920aeaea644a064787d6324ef207c679befc69","src/iter/copied.rs":"1dcdea05fddd574aa76cc317cc2f054be966e4be63c9a6d19c3cc8f29b266267","src/iter/empty.rs":"e7deacea328c363a781fe8d5ddafca3f0a78b5b8e650984df6cffaefc07775a2","src/iter/enumerate.rs":"4f1d9a89c17860b58f9fd0df7352f59b46ce6f1edd908e77f6c822e49530d6d0","src/iter/extend.rs":"f7fda47c62c3420ae53b8b03fbcf71a77e828f75afe9d6e04b3c0d1ed2abcc8f","src/iter/filter.rs":"5d39762bc412492c35a8ca2b4926ee3a7df6332f873c868a456b6bfdc92c0b73","src/iter/filter_map.rs":"c6c35351707cc9ca336eb9ad66a074a2a8b7c9907c02ad7a500e49844bee637a","src/iter/find.rs":"4213e878b81c54ab20a8b902cb1821ef7f185a454e781b66b41ed9f08bb5ff24","src/iter/find_first_last/mod.rs":"463895f0f76c57d8b7ebc068e98897f984040f4efbecea0f232b9ddc574290aa","src/iter/find_first_last/test.rs":"2052eb8b87c5a0a0d49a76c83d9d74f81be18aad52ceb1b06d7e209f4fefba94","src/iter/flat_map.rs":"fd9c1c0bdba9e88864ca6be942bbac3a79b7d19adcdef8a63ed9e9bebff271af","src/iter/flatten.rs":"4e5a31ee517f22db76015d99e6d357f43362acbe5747ef629f117e935c517304","src/iter/fold.rs":"0bc191ed2bc1f327ab52baa6eadf638a677c8c6754dfc79e5a817ea1b0dcc117","src/iter/for_each.rs":"73117a6c01e9e5568d858e0802e17a103c6f02ad4367a9a94da96f513abd7799","src/iter/from_par_iter.rs":"7bbd8c61915b25286a0daa388567135f8ba0e5cdc96ca69ce455249e9f607ba8","src/iter/inspect.rs":"4c420cca600a7eb5872b16ed93326300d3381deede58410468e15b841dbaad78","src/iter/interleave.rs":"6e42d7491b71a41d17401cea39419270ddb922abb8eeda32bda3aef62c58db0b","src/iter/interleave_shortest.rs":"0019b3b65d4a62d257a063650997121278ca309a0efdb522655e196f7e45751e","src/iter/intersperse.rs":"b3a8d0fa1919f8c27b96d1601df47e1a1f2bca4ce365d78c6101ddc9e898823e","src/iter/len.rs":"4dd3e5b5737fa59644d877503e6438821cf44afb3473ee37052147647a2c03e1","src/iter/map.rs":"d74a4107d37ec0dde2a7a4cb90e0ab2c1df70bfc8ff21030532ea497cdf201a4","src/iter/map_with.rs":"0a4867d3fbb00b5af2a8faa7c5b91609806dd53e8ac3a584f8f1c49352f3859b","src/iter/mod.rs":"3635a78369bfbf817b8ba29b109f683f05aedf29691749af4d10d646ddf5e179","src/iter/noop.rs":"5be6332ddfbb8fdbae1ffdb00983950a8b37a295bcb58e9a265b33806ee504e6","src/iter/once.rs":"c0a76f2038d59486b7ec5f75fd8640bf97ded4c92ebb7dc4cced2dd227093442","src/iter/panic_fuse.rs":"7c60bd6491ac53fc71263b5229c8a0ab222b16097d233813c7091c79873f2997","src/iter/par_bridge.rs":"f907afcdb72660aa0806536d8221a1e5dc7954f927d3421daf799b133ad12e64","src/iter/plumbing/README.md":"d9ae3d57a37af5645b1c79029dd808933279d6853b30163cd0d71ead2a9a5002","src/iter/plumbing/mod.rs":"7b03f7ba386a70a93973379138635921b3e7d46407dfa64b5e01a4c9af75f58a","src/iter/product.rs":"da69f4781c2275c4a176432994c3fd80ea1f296afe47b329de61b1d733d990df","src/iter/reduce.rs":"d749c6f3248e5e6a3f2472c115ddd2735b4340f487c5151ccb130a94dcce0208","src/iter/repeat.rs":"d1c66dd13b9bb686543a073f14ace57b898775a8cf4474c482b7059b4a9e1089","src/iter/rev.rs":"118ecc3d6b3ae7df96debe093527998fa5c41c7565abbb4f797eb04c95f7569c","src/iter/skip.rs":"1f43274c39a76e45d0d0c0ad2de1276c170240592456e66d352776ca35275879","src/iter/splitter.rs":"449d3dad7f861c3fc88b356854a82798cc2182da3fdeeedbaad1e5e1709bec60","src/iter/sum.rs":"cf11d996507ceba39524a102559b84289e776f8fe5772114e00ae2112b38c47c","src/iter/take.rs":"ab604be49da2657e0dfae734b667c76a92401b7756fb0c4fa3173a69bedfaec7","src/iter/test.rs":"96ca454cde221716f91238da920e6c057c68fd8d4835ab1dbb3f94f68a25676a","src/iter/try_fold.rs":"999b148ee2fb10a072ce83c1448878f90916f38ac41103b9aa5fe0b51bfe75d1","src/iter/try_reduce.rs":"b38d551bab12ef45457a2549a86faf1f405250babd91e68c5afde52dc8be09a4","src/iter/try_reduce_with.rs":"131f307ab8a901af7aae754ceadad98da1babf1d39abfa4d53f829e908a4ea28","src/iter/unzip.rs":"b966de35178dc22a88cbdbd57fcfc7f0d83912172ddcaed6ce742f812ff21f90","src/iter/update.rs":"e7a9707cb240844b103d6cb05645d6df402f2303a59a77aa3f2a679571a50016","src/iter/while_some.rs":"d29ad5b5fd51339b3d73f0472ddbf426ec49d793b389b483a584ee22cfbf0fe4","src/iter/zip.rs":"b65a2c3382ec980a1cfdd67ea21c825b213cb356059683261d5e1a2a4bda1061","src/iter/zip_eq.rs":"3fb837d6efe845fe942d11225029042a16c47f682a06ef95dcab2918569d60e1","src/lib.rs":"9f93d3e75f9405bda67c4db4a35d904d78d1a32ae221d0825b3abc7e8fdc2461","src/math.rs":"181859dc38d787143016ce2952b6e45c5ec085d942a591bd5eaf6fe8905711a9","src/option.rs":"1ff2c2b1a269cbdb8172552645e346d37d912b2eb4039ad55c46a57aa40b4787","src/par_either.rs":"929cea67b4e1430ca08aebb66af2c15415962f0a4c333552d0004b5571ea5195","src/prelude.rs":"ae9af3e527c4b14bab52a71cb4161771a0ca8e0f6bd2e801fa838df105d5eaab","src/private.rs":"70d6d1b4bb9535da5922d1e911df55ee150e23cba9eb675ddaa32b871ad57e73","src/range.rs":"e947400331be9fd1dabd1c6a0f9abe2217e707c51d3a29c2f49548c171a877da","src/range_inclusive.rs":"aa8cff510b12f9c8b2002386b5b20adb5cd54da1e864a5a878f32b37967ce233","src/result.rs":"f13528a8ec5ce44dff1058f7b2d051cd730bcf10484b5df92d41a900ea7d5664","src/slice/mergesort.rs":"4b82bdcce4a8ec85ab241a56f665838d7abca3a0bb989156e60187dd73e81ac0","src/slice/mod.rs":"015649ad731b32f111b9eff7943c46672f0d1c5bbec0a2627dd455a056dbd10e","src/slice/quicksort.rs":"2fc90da02680a2360e4a993e97159bde587f0606c0b3ffed55d0d9916b21c776","src/slice/test.rs":"ea0b6b7e996c21914576868a69f6d3a027b8323b9f40dbdff0aaadc420006124","src/split_producer.rs":"e3a8c795adec9af95949479f94105dee9ec817e94bc68b0df3a33ca4bc3ad5d1","src/str.rs":"ff857b61ca241431af313ca732f1be302a7cc2b5a1c1ff75ea277a83ab2e32b8","src/vec.rs":"35f3fbd5b4ba0311614e82b17202408569a98036f11a4161003a86170b880f22","tests/clones.rs":"92642701c45e4cfa374d63ff19e45b60fd4b67a679d0ae3ae7f195c2dc549e8c","tests/debug.rs":"51288021084dc80b5d33ceee4d84d159160b6bd510a8566227492a0e177bc91c","tests/intersperse.rs":"ba6ce49d57665ec5ccce24f93faa204f4d48e241389dffc30dcba64c6d7f6752","tests/issue671-unzip.rs":"48e845f2ace7386d7511823a02686cdf0ba814c8fcdda6d111aeccc1b4bcef96","tests/issue671.rs":"8ecf4d18ff113e6086daa67373384624132067ee3a0f66997f734ccedc505bd3","tests/iter_panic.rs":"8a8bc9d447438b9fe5547dd09c31022300fb2dc7ca12873d4382b0259a35cb99","tests/named-threads.rs":"7fdad4c3d88fbdcf511d6affa4da19911442f3930202c774123bc9c8e230c0c7","tests/octillion.rs":"814aa4855414eb91df93cb2085af415e14a2e70f89b12c729bd2866d4627203e","tests/producer_split_at.rs":"202f8ffcb91a09ecb7f8a776d1f3d4cba607c0344f8cf31134ccee5d33fbe756","tests/sort-panic-safe.rs":"189bad50952cb017977b8ccaad5c8908ea06cbfa942745acf36cfc381d64e415","tests/str.rs":"de12ca5c5edc16c3b97aa095a7ef7aaebcc5716d34b56317d87d6801033b330d"},"package":"f32767f90d938f1b7199a174ef249ae1924f6e5bbdb9d112fea141e016f25b3a"} \ No newline at end of file +{"files":{"Cargo.lock":"cb526a98b9807be83fdd1532e3a8e22a31ca7bc6b43fe178e61f8d2822f01aae","Cargo.toml":"be3ac34fa74f69d749c88b0d3bb584a757b66f27417a47ec145f713145574b62","FAQ.md":"23e5c1ac0158e9e33dae4d3f48bb6b63037ee16e55c476da4cbeedcabe0be0fc","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"0621878e61f0d0fda054bcbe02df75192c28bde1ecc8289cbd86aeba2dd72720","README.md":"e70e19b9564b62d7822034e06db77c33b14a05408f1310d16b1e92baa1238f32","RELEASES.md":"1afea4e8179240a841a8a1742c16b5ae3b0560d20809ab1985dcf0384626a32d","examples/README.md":"537e6fe9cf696fd4ada9c08bf31055ed6e366ed65668a523e7c5fde77f97c8d3","examples/cpu_monitor.rs":"cc21a2635059ab2d86622d86508ce360c105417522b7bd1f8e0b3ac845ed484a","src/collections/binary_heap.rs":"55f2d9de4b53ce1e9e353362dc344f432e4ee0400dff6d5ea85a06a41eaa6b3e","src/collections/btree_map.rs":"d3094ed5c54620f81a86133f52e74164bae9f0137745eb66e6d31db2e942bcab","src/collections/btree_set.rs":"7de12e388d36cb2f8672bc3b68aed5b44d047c9f5fe262a7260584634299480f","src/collections/hash_map.rs":"f196ff806a334093d8f4d2d72f6e257517209996f5a6a2031b183d5130720bb4","src/collections/hash_set.rs":"2c0a8a91523a076d9153e6b7c19d2aabecc4706253b25fd6b20a0bd389253e60","src/collections/linked_list.rs":"bef7f32da49b55db76cfefa0afa4789a6979e08a69427e49bab2874967163fef","src/collections/mod.rs":"037660cbdd5907808f7df59fa69993582bf978ecaf125a83a1205452bb505a53","src/collections/vec_deque.rs":"51b3f019c05fcaff9916e258312146c540635cb38941291748f01926d4955a72","src/compile_fail/cannot_collect_filtermap_data.rs":"6a141076c14f95e31bed3433d531bc05d806eed9e0018d1b21420d7ab2fc7eb9","src/compile_fail/cannot_zip_filtered_data.rs":"a28cfb3d00b8d277bfa77a10ca132f972e8f100080ef602fdd3c6fd36ad2a156","src/compile_fail/cell_par_iter.rs":"4f076862d9c66ed42a642a5be97116ca5982608ab76816a8f8305182bf463e9e","src/compile_fail/mod.rs":"2c346e4b52941fe0ac2667eeb753c0c21a1f998a544bb9d9167f200caba0a7bb","src/compile_fail/must_use.rs":"e6f518c3b0fa0d847b48ab19d794f93fbecf988b645240f3f6ae9c8ac2c71769","src/compile_fail/no_send_par_iter.rs":"ef72499a2df310d9ed85de8128af2040b04d3716814b511a175ac7ff5469b41a","src/compile_fail/rc_par_iter.rs":"0faf3d26a665c3e2acc2f2f1d66ee234e561d24442efa4980a5e946e1cb2eba3","src/delegate.rs":"fa05c22227346baf147da03195e96dc0f705aaf7b2295f02f9f996c22295701e","src/iter/chain.rs":"b24122d618daaa5cf8cfe4b80360551847c72208d72201eca56f2f63f54eb636","src/iter/chunks.rs":"88e506c9b7317b33cd4074faa5866f18c5f9d7f7fdcd41968df5c0a9cdb8c923","src/iter/cloned.rs":"687f7122cbc5f6102633aa552779f916ec6c3bfe808957c1d1ca35f46111e0d2","src/iter/collect/consumer.rs":"d0a0e84c2def135943a47d30ed5fe58386d50d388d9715ae770e615c50e86f64","src/iter/collect/mod.rs":"ac99334254431c57e93d04f66a87b0a1effc9a0020a94eb110c02e9d7faf7439","src/iter/collect/test.rs":"a6cfc3406e959e7dbff2697e671937d22416608373671d316aa6fb4e3c304697","src/iter/copied.rs":"1dcdea05fddd574aa76cc317cc2f054be966e4be63c9a6d19c3cc8f29b266267","src/iter/empty.rs":"3cb2d05721aab1a4d9e9c5813473e1646116c1ea570e26d9ac81e083688a0b7d","src/iter/enumerate.rs":"4f1d9a89c17860b58f9fd0df7352f59b46ce6f1edd908e77f6c822e49530d6d0","src/iter/extend.rs":"91946ff5960d5c1df1ab0bd8a70f436dde661a7107a796ada48aa15f671290f5","src/iter/filter.rs":"7c8f574d3509925bf0c75a814e2c6220575958306129343bd69ac41992382368","src/iter/filter_map.rs":"8013e02d76335c6595de6fddf47c4cd4fc96e8f7d4e18914f2e247a48ea99df0","src/iter/find.rs":"73b11b97eae7234099a05b5f59c937fe488e6a8574b9c9e4e852a7fa86341117","src/iter/find_first_last/mod.rs":"fa7d7692d81ecdbecb178606ad3b1b00c80e5e4159c57d34929b012b0bea0c82","src/iter/find_first_last/test.rs":"2052eb8b87c5a0a0d49a76c83d9d74f81be18aad52ceb1b06d7e209f4fefba94","src/iter/flat_map.rs":"51fcd4fba552c0332bac6052ebf8bbeb50f9b912a1db0bb78228434393d4a8ee","src/iter/flatten.rs":"4e5a31ee517f22db76015d99e6d357f43362acbe5747ef629f117e935c517304","src/iter/fold.rs":"874259b408d7f8cdc376d34276d37c1837950c035ff780de8281d1edf65ded9f","src/iter/for_each.rs":"7af0e21ed8479eec65831d1409f61a88d45a31764f2385ec759eda1a46d388b2","src/iter/from_par_iter.rs":"7bbd8c61915b25286a0daa388567135f8ba0e5cdc96ca69ce455249e9f607ba8","src/iter/inspect.rs":"13a76c383c5f7a52191afb6fc41d2272b3f790bbc8946c72b94724fe3cb03150","src/iter/interleave.rs":"6e42d7491b71a41d17401cea39419270ddb922abb8eeda32bda3aef62c58db0b","src/iter/interleave_shortest.rs":"0019b3b65d4a62d257a063650997121278ca309a0efdb522655e196f7e45751e","src/iter/intersperse.rs":"b3a8d0fa1919f8c27b96d1601df47e1a1f2bca4ce365d78c6101ddc9e898823e","src/iter/len.rs":"4dd3e5b5737fa59644d877503e6438821cf44afb3473ee37052147647a2c03e1","src/iter/map.rs":"d956c8e9c620919e022df7be0f5ee4c9e9215b0c752e4f5d564255c19b5ffbfd","src/iter/map_with.rs":"efa53a207e7b56567c189b079c45c38f356506991b877d8c9fe1945f504c2f81","src/iter/mod.rs":"ddc2c4c886179108816a49c40999238ad29cf7077322657b3cbc0d6ac36dff86","src/iter/multizip.rs":"10ec107f6673c9bc6d1d611e11b716c37e8601ab2f4257a460c4bc4962771347","src/iter/noop.rs":"5be6332ddfbb8fdbae1ffdb00983950a8b37a295bcb58e9a265b33806ee504e6","src/iter/once.rs":"fcebffc374dcdd206d13311dcc2e7d7a04da5687658b2f3ec3409f03ed12774b","src/iter/panic_fuse.rs":"e3bd3a2bb4ade5efc1cb356af8cb1be048ef40f79d9293c703fa888fc3f9edda","src/iter/par_bridge.rs":"3399ea35463aeca040eba3cf69f1b156b2a35d1dc30f88d484ec7e9e12acfa01","src/iter/plumbing/README.md":"d9ae3d57a37af5645b1c79029dd808933279d6853b30163cd0d71ead2a9a5002","src/iter/plumbing/mod.rs":"51b06b1e7ad05ce9f70e64cf89450910309eebece211c4bacad35dfbdecbf809","src/iter/product.rs":"da69f4781c2275c4a176432994c3fd80ea1f296afe47b329de61b1d733d990df","src/iter/reduce.rs":"2f5d6e07d7c0de2360505fa5d9198c31fd43ba7e58a6ec40f79edec19319e502","src/iter/repeat.rs":"d1c66dd13b9bb686543a073f14ace57b898775a8cf4474c482b7059b4a9e1089","src/iter/rev.rs":"118ecc3d6b3ae7df96debe093527998fa5c41c7565abbb4f797eb04c95f7569c","src/iter/skip.rs":"1f43274c39a76e45d0d0c0ad2de1276c170240592456e66d352776ca35275879","src/iter/splitter.rs":"0024db04b4430c2a1e8c921cec86af641f612f877f3675b15df0da9122de5f00","src/iter/sum.rs":"cf11d996507ceba39524a102559b84289e776f8fe5772114e00ae2112b38c47c","src/iter/take.rs":"ab604be49da2657e0dfae734b667c76a92401b7756fb0c4fa3173a69bedfaec7","src/iter/test.rs":"42a69bad0608d37aec4c7ac400190b00a32216dcd31e63443ffa45eb91c5df83","src/iter/try_fold.rs":"585d5a69480e1510f3d006c3bff810c98dd009ab44fa9a15a76beeea4fd8c3f2","src/iter/try_reduce.rs":"747f46db1f2d7178b40735828d877b06802296f0d69662d176062920e9a64067","src/iter/try_reduce_with.rs":"1958debdc53fab22b0d0eb603f22647fd96af44a4308549a56dd71256edd1525","src/iter/unzip.rs":"c5f822d9404f924a4c0ddf6c0303c2884b1e503bb01ff3641e60ff0ab65c6ade","src/iter/update.rs":"329070c4ae5aea81fb46e16307cf58c180b53deedbb5bcea6d20556d24319f51","src/iter/while_some.rs":"d29ad5b5fd51339b3d73f0472ddbf426ec49d793b389b483a584ee22cfbf0fe4","src/iter/zip.rs":"b65a2c3382ec980a1cfdd67ea21c825b213cb356059683261d5e1a2a4bda1061","src/iter/zip_eq.rs":"3fb837d6efe845fe942d11225029042a16c47f682a06ef95dcab2918569d60e1","src/lib.rs":"c3b8644ea1a899a744d09c94c523b805afe46106827f9cfc5339f6c8eb73d7c2","src/math.rs":"181859dc38d787143016ce2952b6e45c5ec085d942a591bd5eaf6fe8905711a9","src/option.rs":"00979a9bb8f42629f2b956a6cfbd286fc8a41ffbbec85f1b5d0f0da5615dac9c","src/par_either.rs":"afa4b04ba6ea1d37aed2d68eca44d7ba0d1d09ea985c9091540dd8d3c51974f1","src/prelude.rs":"95b936c390cbfbbdeeca25adf81ea0db49f38ba46bbb82b9a1ebc42eed673abb","src/private.rs":"702ff02a2d0846d6d97b4164c7b4c2fbab2157ba5ba9c31fea5f1775ff3c9597","src/range.rs":"1e3ecf36f9d7c183f83952c76a9e7f9be40fe9b4a28a5b8a5083221c07f68cf3","src/range_inclusive.rs":"deccd7e2595f725ac7078a034cd774014b731653b376404b67622a7c3ad99eed","src/result.rs":"0656f0000efcea10e571df90247925dfd00a0c2194043fcbc009711fb2f7af02","src/slice/mergesort.rs":"36862f9ae70e35b905212a3c9374b5409fe32855aa067128537ad06578bb582f","src/slice/mod.rs":"f29dbad1ae0e939ef036a47d2fa40c6884da61315b94efa4f8adc82f44296bd3","src/slice/quicksort.rs":"874359bd23b90ebe78b2c5f9d5887c9fb063e765c905efb97c88669a6aadd88d","src/slice/test.rs":"ea0b6b7e996c21914576868a69f6d3a027b8323b9f40dbdff0aaadc420006124","src/split_producer.rs":"2b143e16bc6540792f861e215a86cfea7f4ee500d4faca2476d4165619eac90d","src/str.rs":"084d1e5b14f9b366519441065af7a4361ac0a96e5bfd5140c8e881c947448afc","src/vec.rs":"8f6529ec4842dec8b115f0563e5faf81f47530565685ce773416751724b86678","tests/clones.rs":"940f538b7f5d2b35ed0ebb49c26297004bf07f479f5893ae4b5f0837dfb083a6","tests/debug.rs":"855f19544a4456d3cf5105f9b278835699b50ca95227546548abdabbaf91a2b4","tests/intersperse.rs":"bda4fb2179086e32c77c8293b9bb85d55509c282441837ba1849c2d3aa3186a7","tests/issue671-unzip.rs":"d5eb38d8a6d8f66fdf1c40293abbf58f3ac42b5acfc5dca62b02c7ace5bfc1a4","tests/issue671.rs":"52914cac517074deaedcb81bd76b867f0b99cc7b65c3e01cfe12dc9fe38c0266","tests/iter_panic.rs":"376faac33739e3479b5eb744bb2c810c27f8fdda5eeb9ad96d8b93619bf11d1c","tests/named-threads.rs":"48dd0fa0de13b4554dfc1fc0adaee093e19df8b1fc601f5b9b4f15b1fc705249","tests/octillion.rs":"c136ae4612e0d964fc9cb0bcc058a04d0a59c35ba53e0304cdf1d7a0678502fc","tests/producer_split_at.rs":"11429a9846a88f0ea99369dafff08f5483409fd9fd973e038c59ccf68aa3b25f","tests/sort-panic-safe.rs":"62391908ced36ea8f9fb69ade25bae6c07d6edc7e1cc492b0ade7b85e1b1e920","tests/str.rs":"ef7d7d4a187ab37d23f528adb3b6dcf819e82fadd8fc9ad807afb4e7771a41d9"},"package":"ed7d6a39f8bfd4421ce720918234d1e672b83824c91345b47c93746839cf1629"} \ No newline at end of file diff --git a/vendor/rustc-rayon/Cargo.lock b/vendor/rustc-rayon/Cargo.lock index d4d70ebf97..0788cb05c8 100644 --- a/vendor/rustc-rayon/Cargo.lock +++ b/vendor/rustc-rayon/Cargo.lock @@ -2,446 +2,360 @@ # It is not intended for manual editing. [[package]] name = "aho-corasick" -version = "0.7.6" +version = "0.7.15" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7404febffaa47dac81aa44dba71523c9d069b1bdc50a77db41195149e17f68e5" dependencies = [ - "memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)", -] - -[[package]] -name = "arrayvec" -version = "0.4.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)", + "memchr", ] [[package]] name = "autocfg" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "bitflags" -version = "1.2.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" [[package]] name = "cfg-if" version = "0.1.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" [[package]] -name = "cloudabi" -version = "0.0.3" +name = "cfg-if" +version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)", -] +checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" [[package]] name = "crossbeam-deque" -version = "0.7.1" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9f02af974daeee82218205558e51ec8768b48cf524bd01d550abe5573a608285" dependencies = [ - "crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-epoch", + "crossbeam-utils 0.7.2", + "maybe-uninit", ] [[package]] name = "crossbeam-epoch" -version = "0.7.2" +version = "0.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "058ed274caafc1f60c4997b5fc07bf7dc7cca454af7c6e81edffe5f33f70dace" dependencies = [ - "arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)", - "scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "cfg-if 0.1.10", + "crossbeam-utils 0.7.2", + "lazy_static", + "maybe-uninit", + "memoffset", + "scopeguard", ] [[package]] name = "crossbeam-queue" version = "0.1.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" dependencies = [ - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-utils 0.6.6", ] [[package]] name = "crossbeam-utils" version = "0.6.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" +dependencies = [ + "cfg-if 0.1.10", + "lazy_static", +] + +[[package]] +name = "crossbeam-utils" +version = "0.7.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3c7c73a2d1e9fc0886a08b93e98eb643461230d5f1925e4036204d5f2e261a8" dependencies = [ - "cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", + "cfg-if 0.1.10", + "lazy_static", ] [[package]] name = "doc-comment" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "docopt" version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7f525a586d310c87df72ebcd98009e57f1cc030c8c268305287a476beb653969" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", - "strsim 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)", + "lazy_static", + "regex", + "serde", + "strsim", ] [[package]] name = "either" -version = "1.5.3" -source = "registry+https://github.com/rust-lang/crates.io-index" - -[[package]] -name = "fuchsia-cprng" -version = "0.1.1" +version = "1.6.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457" [[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 = "memchr" -version = "2.2.1" +name = "getrandom" +version = "0.1.16" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fc3cb4d91f53b50155bdcfd23f6a4c39ae1969c2ae85982b135750cccaf5fce" +dependencies = [ + "cfg-if 1.0.0", + "libc", + "wasi", +] [[package]] -name = "memoffset" -version = "0.5.1" +name = "hermit-abi" +version = "0.1.18" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c" dependencies = [ - "rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)", + "libc", ] [[package]] -name = "nodrop" -version = "0.1.13" +name = "lazy_static" +version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" [[package]] -name = "num_cpus" -version = "1.10.1" +name = "libc" +version = "0.2.88" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", -] +checksum = "03b07a082330a35e43f63177cc01689da34fbffa0105e1246cf0311472cac73a" [[package]] -name = "proc-macro2" -version = "1.0.5" +name = "maybe-uninit" +version = "2.0.0" 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)", -] +checksum = "60302e4db3a61da70c0cb7991976248362f30319e88850c487b9b95bbf059e00" [[package]] -name = "quote" -version = "1.0.2" +name = "memchr" +version = "2.3.4" source = "registry+https://github.com/rust-lang/crates.io-index" -dependencies = [ - "proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)", -] +checksum = "0ee1c47aaa256ecabcaea351eae4a9b01ef39ed810004e298d2511ed284b1525" [[package]] -name = "rand" -version = "0.6.5" +name = "memoffset" +version = "0.5.6" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "043175f069eda7b85febe4a74abbaeff828d9f8b448515d3151a14a3542811aa" dependencies = [ - "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "autocfg", ] [[package]] -name = "rand_chacha" -version = "0.1.1" +name = "num_cpus" +version = "1.13.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "05499f3756671c15885fee9034446956fff3f243d6077b91e5767df161f766b3" dependencies = [ - "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "hermit-abi", + "libc", ] [[package]] -name = "rand_core" -version = "0.3.1" +name = "once_cell" +version = "1.7.2" 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)", -] +checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3" [[package]] -name = "rand_core" -version = "0.4.2" +name = "ppv-lite86" +version = "0.2.10" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857" [[package]] -name = "rand_hc" -version = "0.1.0" +name = "proc-macro2" +version = "1.0.24" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e0704ee1a7e00d7bb417d0770ea303c1bccbabf0ef1667dae92b5967f5f8a71" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "unicode-xid", ] [[package]] -name = "rand_isaac" -version = "0.1.1" +name = "quote" +version = "1.0.9" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "proc-macro2", ] [[package]] -name = "rand_jitter" -version = "0.1.4" +name = "rand" +version = "0.7.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6a6b1679d49b24bbfe0c803429aa1874472f50d9b363131f0e89fc356b544d03" dependencies = [ - "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", - "winapi 0.3.8 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "rand_os" -version = "0.1.3" +name = "rand_chacha" +version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f4c8ed856279c9737206bf725bf36935d8666ead7aa69b52be55af369d193402" dependencies = [ - "cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)", - "fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "libc 0.2.62 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (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)", + "ppv-lite86", + "rand_core", ] [[package]] -name = "rand_pcg" -version = "0.1.2" +name = "rand_core" +version = "0.5.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "90bde5296fc891b0cef12a6d03ddccc162ce7b2aff54160af9338f8d40df6d19" dependencies = [ - "autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_core 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)", + "getrandom", ] [[package]] -name = "rand_xorshift" -version = "0.1.1" +name = "rand_hc" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ca3129af7b92a17112d59ad498c6f81eaf463253766b90396d39ea7a39d6613c" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core", ] [[package]] -name = "rdrand" -version = "0.4.0" +name = "rand_xorshift" +version = "0.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "77d416b86801d23dde1aa643023b775c3a462efc0ed96443add11546cdf1dca8" dependencies = [ - "rand_core 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", + "rand_core", ] [[package]] name = "regex" -version = "1.3.1" +version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d9251239e129e16308e70d853559389de218ac275b515068abc96829d05b948a" 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.12 (registry+https://github.com/rust-lang/crates.io-index)", - "thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)", + "aho-corasick", + "memchr", + "regex-syntax", + "thread_local", ] [[package]] name = "regex-syntax" -version = "0.6.12" +version = "0.6.22" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b5eb417147ba9860a96cfe72a0b93bf88fee1744b5636ec99ab20c1aa9376581" [[package]] name = "rustc-rayon" -version = "0.3.0" +version = "0.3.1" dependencies = [ - "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "doc-comment 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)", - "docopt 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)", - "either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)", - "rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)", - "rustc-rayon-core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)", - "serde 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", - "serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", + "crossbeam-deque", + "doc-comment", + "docopt", + "either", + "lazy_static", + "rand", + "rand_xorshift", + "rustc-rayon-core", + "serde", ] [[package]] name = "rustc-rayon-core" version = "0.3.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ea2427831f0053ea3ea73559c8eabd893133a51b251d142bacee53c62a288cb3" dependencies = [ - "crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)", - "crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)", - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", - "num_cpus 1.10.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)", + "crossbeam-deque", + "crossbeam-queue", + "crossbeam-utils 0.6.6", + "lazy_static", + "num_cpus", ] [[package]] name = "scopeguard" -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" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" [[package]] name = "serde" -version = "1.0.101" +version = "1.0.124" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd761ff957cb2a45fbb9ab3da6512de9de55872866160b23c25f1a841e99d29f" dependencies = [ - "serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)", + "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.101" +version = "1.0.124" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1800f7693e94e186f5e25a28291ae1570da908aff7d97a095dec1e56ff99069b" dependencies = [ - "proc-macro2 1.0.5 (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)", + "proc-macro2", + "quote", + "syn", ] [[package]] name = "strsim" -version = "0.9.2" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6446ced80d6c486436db5c078dde11a9f73d42b57fb273121e160b84f63d894c" [[package]] name = "syn" -version = "1.0.5" +version = "1.0.63" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8fd9bc7ccc2688b3344c2f48b9b546648b25ce0b20fc717ee7fa7981a8ca9717" dependencies = [ - "proc-macro2 1.0.5 (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)", + "proc-macro2", + "quote", + "unicode-xid", ] [[package]] name = "thread_local" -version = "0.3.6" +version = "1.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd" dependencies = [ - "lazy_static 1.4.0 (registry+https://github.com/rust-lang/crates.io-index)", + "once_cell", ] [[package]] name = "unicode-xid" -version = "0.2.0" +version = "0.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f7fe0bb3479651439c9112f72b6c505038574c9fbb575ed1bf3b797fa39dd564" [[package]] -name = "winapi" -version = "0.3.8" +name = "wasi" +version = "0.9.0+wasi-snapshot-preview1" 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-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 arrayvec 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)" = "b8d73f9beda665eaa98ab9e4f7442bd4e7de6652587de55b2525e52e29c1b0ba" -"checksum autocfg 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b671c8fb71b457dd4ae18c4ba1e59aa81793daacc361d82fcd410cef0d491875" -"checksum bitflags 1.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "8a606a02debe2813760609f57a64a2ffd27d9fdf5b2f133eaca0b248dd92cdd2" -"checksum cfg-if 0.1.10 (registry+https://github.com/rust-lang/crates.io-index)" = "4785bdd1c96b2a846b2bd7cc02e86b6b3dbf14e7e53446c4f54c92a361040822" -"checksum cloudabi 0.0.3 (registry+https://github.com/rust-lang/crates.io-index)" = "ddfc5b9aa5d4507acaf872de71051dfd0e309860e88966e1051e462a077aac4f" -"checksum crossbeam-deque 0.7.1 (registry+https://github.com/rust-lang/crates.io-index)" = "b18cd2e169ad86297e6bc0ad9aa679aee9daa4f19e8163860faf7c164e4f5a71" -"checksum crossbeam-epoch 0.7.2 (registry+https://github.com/rust-lang/crates.io-index)" = "fedcd6772e37f3da2a9af9bf12ebe046c0dfe657992377b4df982a2b54cd37a9" -"checksum crossbeam-queue 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7c979cd6cfe72335896575c6b5688da489e420d36a27a0b9eb0c73db574b4a4b" -"checksum crossbeam-utils 0.6.6 (registry+https://github.com/rust-lang/crates.io-index)" = "04973fa96e96579258a5091af6003abde64af786b860f18622b82e026cca60e6" -"checksum doc-comment 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "923dea538cea0aa3025e8685b20d6ee21ef99c4f77e954a30febbaac5ec73a97" -"checksum docopt 1.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7f525a586d310c87df72ebcd98009e57f1cc030c8c268305287a476beb653969" -"checksum either 1.5.3 (registry+https://github.com/rust-lang/crates.io-index)" = "bb1f6b1ce1c140482ea30ddd3335fc0024ac7ee112895426e0a629a6c20adfe3" -"checksum fuchsia-cprng 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "a06f77d526c1a601b7c4cdd98f54b5eaabffc14d5f2f0296febdc7f357c6d3ba" -"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 memchr 2.2.1 (registry+https://github.com/rust-lang/crates.io-index)" = "88579771288728879b57485cc7d6b07d648c9f0141eb955f8ab7f9d45394468e" -"checksum memoffset 0.5.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ce6075db033bbbb7ee5a0bbd3a3186bbae616f57fb001c485c7ff77955f8177f" -"checksum nodrop 0.1.13 (registry+https://github.com/rust-lang/crates.io-index)" = "2f9667ddcc6cc8a43afc9b7917599d7216aa09c463919ea32c59ed6cac8bc945" -"checksum num_cpus 1.10.1 (registry+https://github.com/rust-lang/crates.io-index)" = "bcef43580c035376c0705c42792c294b66974abbfd2789b511784023f71f3273" -"checksum proc-macro2 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "90cf5f418035b98e655e9cdb225047638296b862b42411c4e45bb88d700f7fc0" -"checksum quote 1.0.2 (registry+https://github.com/rust-lang/crates.io-index)" = "053a8c8bcc71fcce321828dc897a98ab9760bef03a4fc36693c231e5b3216cfe" -"checksum rand 0.6.5 (registry+https://github.com/rust-lang/crates.io-index)" = "6d71dacdc3c88c1fde3885a3be3fbab9f35724e6ce99467f7d9c5026132184ca" -"checksum rand_chacha 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "556d3a1ca6600bfcbab7c7c91ccb085ac7fbbcd70e008a98742e7847f4f7bcef" -"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 rand_hc 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "7b40677c7be09ae76218dc623efbf7b18e34bced3f38883af07bb75630a21bc4" -"checksum rand_isaac 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "ded997c9d5f13925be2a6fd7e66bf1872597f759fd9dd93513dd7e92e5a5ee08" -"checksum rand_jitter 0.1.4 (registry+https://github.com/rust-lang/crates.io-index)" = "1166d5c91dc97b88d1decc3285bb0a99ed84b05cfd0bc2341bdf2d43fc41e39b" -"checksum rand_os 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "7b75f676a1e053fc562eafbb47838d67c84801e38fc1ba459e8f180deabd5071" -"checksum rand_pcg 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "abf9b09b01790cfe0364f52bf32995ea3c39f4d2dd011eac241d2914146d0b44" -"checksum rand_xorshift 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)" = "cbf7e9e623549b0e21f6e97cf8ecf247c1a8fd2e8a992ae265314300b2455d5c" -"checksum rdrand 0.4.0 (registry+https://github.com/rust-lang/crates.io-index)" = "678054eb77286b51581ba43620cc911abf02758c91f93f479767aed0f90458b2" -"checksum regex 1.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "dc220bd33bdce8f093101afe22a037b8eb0e5af33592e6a9caafff0d4cb81cbd" -"checksum regex-syntax 0.6.12 (registry+https://github.com/rust-lang/crates.io-index)" = "11a7e20d1cce64ef2fed88b66d347f88bd9babb82845b2b858f3edbf59a4f716" -"checksum rustc-rayon-core 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "ea2427831f0053ea3ea73559c8eabd893133a51b251d142bacee53c62a288cb3" -"checksum rustc_version 0.2.3 (registry+https://github.com/rust-lang/crates.io-index)" = "138e3e0acb6c9fb258b19b67cb8abd63c00679d2851805ea151465464fe9030a" -"checksum scopeguard 1.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "b42e15e59b18a828bbf5c58ea01debb36b9b096346de35d941dcb89009f24a0d" -"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.101 (registry+https://github.com/rust-lang/crates.io-index)" = "9796c9b7ba2ffe7a9ce53c2287dfc48080f4b2b362fcc245a259b3a7201119dd" -"checksum serde_derive 1.0.101 (registry+https://github.com/rust-lang/crates.io-index)" = "4b133a43a1ecd55d4086bd5b4dc6c1751c68b1bfbeba7a5040442022c7e7c02e" -"checksum strsim 0.9.2 (registry+https://github.com/rust-lang/crates.io-index)" = "032c03039aae92b350aad2e3779c352e104d919cb192ba2fabbd7b831ce4f0f6" -"checksum syn 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)" = "66850e97125af79138385e9b88339cbcd037e3f28ceab8c5ad98e64f0f1f80bf" -"checksum thread_local 0.3.6 (registry+https://github.com/rust-lang/crates.io-index)" = "c6b53e329000edc2b34dbe8545fd20e55a333362d0a321909685a19bd28c3f1b" -"checksum unicode-xid 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "826e7639553986605ec5979c7dd957c7895e93eabed50ab2ffa7f6128a75097c" -"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" +checksum = "cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519" diff --git a/vendor/rustc-rayon/Cargo.toml b/vendor/rustc-rayon/Cargo.toml index 814c2018c9..2f08a387cd 100644 --- a/vendor/rustc-rayon/Cargo.toml +++ b/vendor/rustc-rayon/Cargo.toml @@ -11,8 +11,9 @@ # will likely look very different (and much more reasonable) [package] +edition = "2018" name = "rustc-rayon" -version = "0.3.0" +version = "0.3.1" authors = ["Niko Matsakis ", "Josh Stone "] exclude = ["/ci/*", "/scripts/*", "/.travis.yml", "/appveyor.yml", "/bors.toml"] description = "Simple work-stealing parallelism for Rust - fork for rustc" @@ -23,14 +24,15 @@ categories = ["concurrency"] license = "Apache-2.0/MIT" repository = "https://github.com/rust-lang/rustc-rayon" [dependencies.crossbeam-deque] -version = "0.7" +version = "0.7.2" [dependencies.either] version = "1.0" default-features = false -[dependencies.rustc-rayon-core] +[dependencies.rayon-core] version = "0.3" +package = "rustc-rayon-core" [dev-dependencies.doc-comment] version = "0.3" @@ -41,13 +43,11 @@ version = "1" version = "1" [dev-dependencies.rand] -version = "0.6" +version = "0.7" [dev-dependencies.rand_xorshift] -version = "0.1" +version = "0.2" [dev-dependencies.serde] -version = "1" - -[dev-dependencies.serde_derive] -version = "1" +version = "1.0.85" +features = ["derive"] diff --git a/vendor/rustc-rayon/RELEASES.md b/vendor/rustc-rayon/RELEASES.md index 8e97d498f4..f752be93b3 100644 --- a/vendor/rustc-rayon/RELEASES.md +++ b/vendor/rustc-rayon/RELEASES.md @@ -1,3 +1,58 @@ +# Release rayon 1.3.0 / rayon-core 1.7.0 (2019-12-21) + +- Tuples up to length 12 now implement `IntoParallelIterator`, creating a + `MultiZip` iterator that produces items as similarly-shaped tuples. +- The `--cfg=rayon_unstable` supporting code for `rayon-futures` is removed. +- The minimum supported `rustc` is now 1.31. + +## Contributors + +Thanks to all of the contributors for this release! + +- @cuviper +- @c410-f3r +- @silwol + + +# Release rayon-futures 0.1.1 (2019-12-21) + +- `Send` bounds have been added for the `Item` and `Error` associated types on + all generic `F: Future` interfaces. While technically a breaking change, this + is a soundness fix, so we are not increasing the semantic version for this. +- This crate is now deprecated, and the `--cfg=rayon_unstable` supporting code + will be removed in `rayon-core 1.7.0`. This only supported the now-obsolete + `Future` from `futures 0.1`, while support for `std::future::Future` is + expected to come directly in `rayon-core` -- although that is not ready yet. + +## Contributors + +Thanks to all of the contributors for this release! + +- @cuviper +- @kornelski +- @jClaireCodesStuff +- @jwass +- @seanchen1991 + + +# Release rayon 1.2.1 / rayon-core 1.6.1 (2019-11-20) + +- Update crossbeam dependencies. +- Add top-level doc links for the iterator traits. +- Document that the iterator traits are not object safe. + +## Contributors + +Thanks to all of the contributors for this release! + +- @cuviper +- @dnaka91 +- @matklad +- @nikomatsakis +- @Qqwy +- @vorner + + # Release rayon 1.2.0 / rayon-core 1.6.0 (2019-08-30) - The new `ParallelIterator::copied()` converts an iterator of references into diff --git a/vendor/rustc-rayon/examples/cpu_monitor.rs b/vendor/rustc-rayon/examples/cpu_monitor.rs index 5e049e692c..bbe13164a8 100644 --- a/vendor/rustc-rayon/examples/cpu_monitor.rs +++ b/vendor/rustc-rayon/examples/cpu_monitor.rs @@ -1,9 +1,3 @@ -extern crate docopt; -extern crate rayon; -#[macro_use] -extern crate serde_derive; -extern crate serde; - use docopt::Docopt; use std::io; use std::process; @@ -28,7 +22,7 @@ Options: -d N, --depth N Control how hard the dummy task works [default: 27] "; -#[derive(Deserialize)] +#[derive(serde::Deserialize)] pub struct Args { arg_scenario: String, flag_depth: usize, diff --git a/vendor/rustc-rayon/src/collections/binary_heap.rs b/vendor/rustc-rayon/src/collections/binary_heap.rs index b878ce5cac..c8f1014c19 100644 --- a/vendor/rustc-rayon/src/collections/binary_heap.rs +++ b/vendor/rustc-rayon/src/collections/binary_heap.rs @@ -4,10 +4,10 @@ use std::collections::BinaryHeap; -use iter::plumbing::*; -use iter::*; +use crate::iter::plumbing::*; +use crate::iter::*; -use vec; +use crate::vec; /// Parallel iterator over a binary heap #[derive(Debug, Clone)] @@ -33,7 +33,7 @@ delegate_indexed_iterator! { /// Parallel iterator over an immutable reference to a binary heap #[derive(Debug)] -pub struct Iter<'a, T: Ord + Sync + 'a> { +pub struct Iter<'a, T: Ord + Sync> { inner: vec::IntoIter<&'a T>, } diff --git a/vendor/rustc-rayon/src/collections/btree_map.rs b/vendor/rustc-rayon/src/collections/btree_map.rs index 1523db7456..12436dca1c 100644 --- a/vendor/rustc-rayon/src/collections/btree_map.rs +++ b/vendor/rustc-rayon/src/collections/btree_map.rs @@ -4,10 +4,10 @@ use std::collections::BTreeMap; -use iter::plumbing::*; -use iter::*; +use crate::iter::plumbing::*; +use crate::iter::*; -use vec; +use crate::vec; /// Parallel iterator over a B-Tree map #[derive(Debug)] // std doesn't Clone @@ -27,7 +27,7 @@ delegate_iterator! { /// Parallel iterator over an immutable reference to a B-Tree map #[derive(Debug)] -pub struct Iter<'a, K: Ord + Sync + 'a, V: Sync + 'a> { +pub struct Iter<'a, K: Ord + Sync, V: Sync> { inner: vec::IntoIter<(&'a K, &'a V)>, } @@ -51,7 +51,7 @@ delegate_iterator! { /// Parallel iterator over a mutable reference to a B-Tree map #[derive(Debug)] -pub struct IterMut<'a, K: Ord + Sync + 'a, V: Send + 'a> { +pub struct IterMut<'a, K: Ord + Sync, V: Send> { inner: vec::IntoIter<(&'a K, &'a mut V)>, } diff --git a/vendor/rustc-rayon/src/collections/btree_set.rs b/vendor/rustc-rayon/src/collections/btree_set.rs index e27f2ec58c..061d37c7ea 100644 --- a/vendor/rustc-rayon/src/collections/btree_set.rs +++ b/vendor/rustc-rayon/src/collections/btree_set.rs @@ -4,10 +4,10 @@ use std::collections::BTreeSet; -use iter::plumbing::*; -use iter::*; +use crate::iter::plumbing::*; +use crate::iter::*; -use vec; +use crate::vec; /// Parallel iterator over a B-Tree set #[derive(Debug)] // std doesn't Clone @@ -27,7 +27,7 @@ delegate_iterator! { /// Parallel iterator over an immutable reference to a B-Tree set #[derive(Debug)] -pub struct Iter<'a, T: Ord + Sync + 'a> { +pub struct Iter<'a, T: Ord + Sync> { inner: vec::IntoIter<&'a T>, } diff --git a/vendor/rustc-rayon/src/collections/hash_map.rs b/vendor/rustc-rayon/src/collections/hash_map.rs index 69149075ba..e9adbc12e8 100644 --- a/vendor/rustc-rayon/src/collections/hash_map.rs +++ b/vendor/rustc-rayon/src/collections/hash_map.rs @@ -5,10 +5,10 @@ use std::collections::HashMap; use std::hash::{BuildHasher, Hash}; -use iter::plumbing::*; -use iter::*; +use crate::iter::plumbing::*; +use crate::iter::*; -use vec; +use crate::vec; /// Parallel iterator over a hash map #[derive(Debug)] // std doesn't Clone @@ -28,7 +28,7 @@ delegate_iterator! { /// Parallel iterator over an immutable reference to a hash map #[derive(Debug)] -pub struct Iter<'a, K: Hash + Eq + Sync + 'a, V: Sync + 'a> { +pub struct Iter<'a, K: Hash + Eq + Sync, V: Sync> { inner: vec::IntoIter<(&'a K, &'a V)>, } @@ -52,7 +52,7 @@ delegate_iterator! { /// Parallel iterator over a mutable reference to a hash map #[derive(Debug)] -pub struct IterMut<'a, K: Hash + Eq + Sync + 'a, V: Send + 'a> { +pub struct IterMut<'a, K: Hash + Eq + Sync, V: Send> { inner: vec::IntoIter<(&'a K, &'a mut V)>, } diff --git a/vendor/rustc-rayon/src/collections/hash_set.rs b/vendor/rustc-rayon/src/collections/hash_set.rs index dbf9e5b4f3..bf43f89a37 100644 --- a/vendor/rustc-rayon/src/collections/hash_set.rs +++ b/vendor/rustc-rayon/src/collections/hash_set.rs @@ -5,10 +5,10 @@ use std::collections::HashSet; use std::hash::{BuildHasher, Hash}; -use iter::plumbing::*; -use iter::*; +use crate::iter::plumbing::*; +use crate::iter::*; -use vec; +use crate::vec; /// Parallel iterator over a hash set #[derive(Debug)] // std doesn't Clone @@ -28,7 +28,7 @@ delegate_iterator! { /// Parallel iterator over an immutable reference to a hash set #[derive(Debug)] -pub struct Iter<'a, T: Hash + Eq + Sync + 'a> { +pub struct Iter<'a, T: Hash + Eq + Sync> { inner: vec::IntoIter<&'a T>, } diff --git a/vendor/rustc-rayon/src/collections/linked_list.rs b/vendor/rustc-rayon/src/collections/linked_list.rs index 976e9c8ebf..bddd2b0fce 100644 --- a/vendor/rustc-rayon/src/collections/linked_list.rs +++ b/vendor/rustc-rayon/src/collections/linked_list.rs @@ -4,10 +4,10 @@ use std::collections::LinkedList; -use iter::plumbing::*; -use iter::*; +use crate::iter::plumbing::*; +use crate::iter::*; -use vec; +use crate::vec; /// Parallel iterator over a linked list #[derive(Debug, Clone)] @@ -27,7 +27,7 @@ delegate_iterator! { /// Parallel iterator over an immutable reference to a linked list #[derive(Debug)] -pub struct Iter<'a, T: Sync + 'a> { +pub struct Iter<'a, T: Sync> { inner: vec::IntoIter<&'a T>, } @@ -51,7 +51,7 @@ delegate_iterator! { /// Parallel iterator over a mutable reference to a linked list #[derive(Debug)] -pub struct IterMut<'a, T: Send + 'a> { +pub struct IterMut<'a, T: Send> { inner: vec::IntoIter<&'a mut T>, } diff --git a/vendor/rustc-rayon/src/collections/vec_deque.rs b/vendor/rustc-rayon/src/collections/vec_deque.rs index 8973338618..54494c471a 100644 --- a/vendor/rustc-rayon/src/collections/vec_deque.rs +++ b/vendor/rustc-rayon/src/collections/vec_deque.rs @@ -4,11 +4,11 @@ use std::collections::VecDeque; -use iter::plumbing::*; -use iter::*; +use crate::iter::plumbing::*; +use crate::iter::*; -use slice; -use vec; +use crate::slice; +use crate::vec; /// Parallel iterator over a double-ended queue #[derive(Debug, Clone)] @@ -28,7 +28,7 @@ delegate_indexed_iterator! { /// Parallel iterator over an immutable reference to a double-ended queue #[derive(Debug)] -pub struct Iter<'a, T: Sync + 'a> { +pub struct Iter<'a, T: Sync> { inner: Chain, slice::Iter<'a, T>>, } @@ -59,7 +59,7 @@ delegate_indexed_iterator! { /// Parallel iterator over a mutable reference to a double-ended queue #[derive(Debug)] -pub struct IterMut<'a, T: Send + 'a> { +pub struct IterMut<'a, T: Send> { inner: Chain, slice::IterMut<'a, T>>, } diff --git a/vendor/rustc-rayon/src/iter/chunks.rs b/vendor/rustc-rayon/src/iter/chunks.rs index 330a49dcbb..1ae5c7e5df 100644 --- a/vendor/rustc-rayon/src/iter/chunks.rs +++ b/vendor/rustc-rayon/src/iter/chunks.rs @@ -2,7 +2,7 @@ use std::cmp::min; use super::plumbing::*; use super::*; -use math::div_round_up; +use crate::math::div_round_up; /// `Chunks` is an iterator that groups elements of an underlying iterator. /// diff --git a/vendor/rustc-rayon/src/iter/collect/consumer.rs b/vendor/rustc-rayon/src/iter/collect/consumer.rs index eafa721160..7b8746a9bc 100644 --- a/vendor/rustc-rayon/src/iter/collect/consumer.rs +++ b/vendor/rustc-rayon/src/iter/collect/consumer.rs @@ -4,7 +4,7 @@ use std::ptr; use std::slice; use std::sync::atomic::{AtomicUsize, Ordering}; -pub(super) struct CollectConsumer<'c, T: Send + 'c> { +pub(super) struct CollectConsumer<'c, T: Send> { /// Tracks how many items we successfully wrote. Used to guarantee /// safety in the face of panics or buggy parallel iterators. /// @@ -19,7 +19,7 @@ pub(super) struct CollectConsumer<'c, T: Send + 'c> { target: &'c mut [T], } -pub(super) struct CollectFolder<'c, T: Send + 'c> { +pub(super) struct CollectFolder<'c, T: Send> { global_writes: &'c AtomicUsize, local_writes: usize, diff --git a/vendor/rustc-rayon/src/iter/collect/mod.rs b/vendor/rustc-rayon/src/iter/collect/mod.rs index 21328108b5..17a12e1470 100644 --- a/vendor/rustc-rayon/src/iter/collect/mod.rs +++ b/vendor/rustc-rayon/src/iter/collect/mod.rs @@ -67,7 +67,7 @@ where } /// Manage the collection vector. -struct Collect<'c, T: Send + 'c> { +struct Collect<'c, T: Send> { writes: AtomicUsize, vec: &'c mut Vec, len: usize, diff --git a/vendor/rustc-rayon/src/iter/collect/test.rs b/vendor/rustc-rayon/src/iter/collect/test.rs index eec3d67e61..922e1167b2 100644 --- a/vendor/rustc-rayon/src/iter/collect/test.rs +++ b/vendor/rustc-rayon/src/iter/collect/test.rs @@ -6,7 +6,7 @@ // result in panics. use super::Collect; -use iter::plumbing::*; +use crate::iter::plumbing::*; use rayon_core::join; /// Promises to produce 2 items, but then produces 3. Does not do any diff --git a/vendor/rustc-rayon/src/iter/empty.rs b/vendor/rustc-rayon/src/iter/empty.rs index 2f68df46ca..85a2e5fd93 100644 --- a/vendor/rustc-rayon/src/iter/empty.rs +++ b/vendor/rustc-rayon/src/iter/empty.rs @@ -1,7 +1,6 @@ -use iter::plumbing::*; -use iter::*; +use crate::iter::plumbing::*; +use crate::iter::*; -use std; use std::fmt; use std::marker::PhantomData; diff --git a/vendor/rustc-rayon/src/iter/extend.rs b/vendor/rustc-rayon/src/iter/extend.rs index 10f0e9a951..b107c6b792 100644 --- a/vendor/rustc-rayon/src/iter/extend.rs +++ b/vendor/rustc-rayon/src/iter/extend.rs @@ -285,12 +285,7 @@ impl<'a> ParallelExtend<&'a char> for String { } fn string_reserve>(string: &mut String, list: &LinkedList>) { - let len = list - .iter() - .flat_map(|vec| vec) - .map(T::as_ref) - .map(str::len) - .sum(); + let len = list.iter().flatten().map(T::as_ref).map(str::len).sum(); string.reserve(len); } diff --git a/vendor/rustc-rayon/src/iter/filter.rs b/vendor/rustc-rayon/src/iter/filter.rs index 48dda5e512..aad6cae7b6 100644 --- a/vendor/rustc-rayon/src/iter/filter.rs +++ b/vendor/rustc-rayon/src/iter/filter.rs @@ -50,7 +50,7 @@ where /// //////////////////////////////////////////////////////////////////////// /// Consumer implementation -struct FilterConsumer<'p, C, P: 'p> { +struct FilterConsumer<'p, C, P> { base: C, filter_op: &'p P, } @@ -105,7 +105,7 @@ where } } -struct FilterFolder<'p, C, P: 'p> { +struct FilterFolder<'p, C, P> { base: C, filter_op: &'p P, } diff --git a/vendor/rustc-rayon/src/iter/filter_map.rs b/vendor/rustc-rayon/src/iter/filter_map.rs index 885998dce0..dd71c3ebbe 100644 --- a/vendor/rustc-rayon/src/iter/filter_map.rs +++ b/vendor/rustc-rayon/src/iter/filter_map.rs @@ -50,7 +50,7 @@ where /// //////////////////////////////////////////////////////////////////////// /// Consumer implementation -struct FilterMapConsumer<'p, C, P: 'p> { +struct FilterMapConsumer<'p, C, P> { base: C, filter_op: &'p P, } @@ -106,7 +106,7 @@ where } } -struct FilterMapFolder<'p, C, P: 'p> { +struct FilterMapFolder<'p, C, P> { base: C, filter_op: &'p P, } diff --git a/vendor/rustc-rayon/src/iter/find.rs b/vendor/rustc-rayon/src/iter/find.rs index 6358d52801..971db2b3c9 100644 --- a/vendor/rustc-rayon/src/iter/find.rs +++ b/vendor/rustc-rayon/src/iter/find.rs @@ -12,7 +12,7 @@ where pi.drive_unindexed(consumer) } -struct FindConsumer<'p, P: 'p> { +struct FindConsumer<'p, P> { find_op: &'p P, found: &'p AtomicBool, } @@ -63,7 +63,7 @@ where } } -struct FindFolder<'p, T, P: 'p> { +struct FindFolder<'p, T, P> { find_op: &'p P, found: &'p AtomicBool, item: Option, diff --git a/vendor/rustc-rayon/src/iter/find_first_last/mod.rs b/vendor/rustc-rayon/src/iter/find_first_last/mod.rs index b89aeec3fb..e5da8f0dd8 100644 --- a/vendor/rustc-rayon/src/iter/find_first_last/mod.rs +++ b/vendor/rustc-rayon/src/iter/find_first_last/mod.rs @@ -58,7 +58,7 @@ where pi.drive_unindexed(consumer) } -struct FindConsumer<'p, P: 'p> { +struct FindConsumer<'p, P> { find_op: &'p P, lower_bound: Cell, upper_bound: usize, @@ -163,7 +163,7 @@ where } } -struct FindFolder<'p, T, P: 'p> { +struct FindFolder<'p, T, P> { find_op: &'p P, boundary: usize, match_position: MatchPosition, diff --git a/vendor/rustc-rayon/src/iter/flat_map.rs b/vendor/rustc-rayon/src/iter/flat_map.rs index 076c23ad54..5043dd17f5 100644 --- a/vendor/rustc-rayon/src/iter/flat_map.rs +++ b/vendor/rustc-rayon/src/iter/flat_map.rs @@ -51,7 +51,7 @@ where /// //////////////////////////////////////////////////////////////////////// /// Consumer implementation -struct FlatMapConsumer<'f, C, F: 'f> { +struct FlatMapConsumer<'f, C, F> { base: C, map_op: &'f F, } @@ -109,7 +109,7 @@ where } } -struct FlatMapFolder<'f, C, F: 'f, R> { +struct FlatMapFolder<'f, C, F, R> { base: C, map_op: &'f F, previous: Option, diff --git a/vendor/rustc-rayon/src/iter/fold.rs b/vendor/rustc-rayon/src/iter/fold.rs index 0de0aa3f0b..345afbd501 100644 --- a/vendor/rustc-rayon/src/iter/fold.rs +++ b/vendor/rustc-rayon/src/iter/fold.rs @@ -60,7 +60,7 @@ where } } -struct FoldConsumer<'c, C, ID: 'c, F: 'c> { +struct FoldConsumer<'c, C, ID, F> { base: C, fold_op: &'c F, identity: &'c ID, @@ -121,7 +121,7 @@ where } } -struct FoldFolder<'r, C, ID, F: 'r> { +struct FoldFolder<'r, C, ID, F> { base: C, fold_op: &'r F, item: ID, @@ -237,7 +237,7 @@ where } } -struct FoldWithConsumer<'c, C, U, F: 'c> { +struct FoldWithConsumer<'c, C, U, F> { base: C, item: U, fold_op: &'c F, diff --git a/vendor/rustc-rayon/src/iter/for_each.rs b/vendor/rustc-rayon/src/iter/for_each.rs index 5307939ba1..3b77bebe1b 100644 --- a/vendor/rustc-rayon/src/iter/for_each.rs +++ b/vendor/rustc-rayon/src/iter/for_each.rs @@ -12,7 +12,7 @@ where pi.drive_unindexed(consumer) } -struct ForEachConsumer<'f, F: 'f> { +struct ForEachConsumer<'f, F> { op: &'f F, } diff --git a/vendor/rustc-rayon/src/iter/inspect.rs b/vendor/rustc-rayon/src/iter/inspect.rs index 145032d013..2de2d12ab0 100644 --- a/vendor/rustc-rayon/src/iter/inspect.rs +++ b/vendor/rustc-rayon/src/iter/inspect.rs @@ -108,7 +108,7 @@ where /// //////////////////////////////////////////////////////////////////////// -struct InspectProducer<'f, P, F: 'f> { +struct InspectProducer<'f, P, F> { base: P, inspect_op: &'f F, } @@ -162,7 +162,7 @@ where /// //////////////////////////////////////////////////////////////////////// /// Consumer implementation -struct InspectConsumer<'f, C, F: 'f> { +struct InspectConsumer<'f, C, F> { base: C, inspect_op: &'f F, } @@ -217,7 +217,7 @@ where } } -struct InspectFolder<'f, C, F: 'f> { +struct InspectFolder<'f, C, F> { base: C, inspect_op: &'f F, } diff --git a/vendor/rustc-rayon/src/iter/map.rs b/vendor/rustc-rayon/src/iter/map.rs index 218539835a..9b959aa939 100644 --- a/vendor/rustc-rayon/src/iter/map.rs +++ b/vendor/rustc-rayon/src/iter/map.rs @@ -110,7 +110,7 @@ where /// //////////////////////////////////////////////////////////////////////// -struct MapProducer<'f, P, F: 'f> { +struct MapProducer<'f, P, F> { base: P, map_op: &'f F, } @@ -164,7 +164,7 @@ where /// //////////////////////////////////////////////////////////////////////// /// Consumer implementation -struct MapConsumer<'f, C, F: 'f> { +struct MapConsumer<'f, C, F> { base: C, map_op: &'f F, } @@ -221,7 +221,7 @@ where } } -struct MapFolder<'f, C, F: 'f> { +struct MapFolder<'f, C, F> { base: C, map_op: &'f F, } diff --git a/vendor/rustc-rayon/src/iter/map_with.rs b/vendor/rustc-rayon/src/iter/map_with.rs index 22733b315b..ea16f81efc 100644 --- a/vendor/rustc-rayon/src/iter/map_with.rs +++ b/vendor/rustc-rayon/src/iter/map_with.rs @@ -119,7 +119,7 @@ where /// //////////////////////////////////////////////////////////////////////// -struct MapWithProducer<'f, P, U, F: 'f> { +struct MapWithProducer<'f, P, U, F> { base: P, item: U, map_op: &'f F, @@ -179,7 +179,7 @@ where } } -struct MapWithIter<'f, I, U, F: 'f> { +struct MapWithIter<'f, I, U, F> { base: I, item: U, map_op: &'f F, @@ -226,7 +226,7 @@ where /// //////////////////////////////////////////////////////////////////////// /// Consumer implementation -struct MapWithConsumer<'f, C, U, F: 'f> { +struct MapWithConsumer<'f, C, U, F> { base: C, item: U, map_op: &'f F, @@ -287,7 +287,7 @@ where } } -struct MapWithFolder<'f, C, U, F: 'f> { +struct MapWithFolder<'f, C, U, F> { base: C, item: U, map_op: &'f F, @@ -448,7 +448,7 @@ where /// //////////////////////////////////////////////////////////////////////// -struct MapInitProducer<'f, P, INIT: 'f, F: 'f> { +struct MapInitProducer<'f, P, INIT, F> { base: P, init: &'f INIT, map_op: &'f F, @@ -511,7 +511,7 @@ where /// //////////////////////////////////////////////////////////////////////// /// Consumer implementation -struct MapInitConsumer<'f, C, INIT: 'f, F: 'f> { +struct MapInitConsumer<'f, C, INIT, F> { base: C, init: &'f INIT, map_op: &'f F, diff --git a/vendor/rustc-rayon/src/iter/mod.rs b/vendor/rustc-rayon/src/iter/mod.rs index e10aaaf452..e073709579 100644 --- a/vendor/rustc-rayon/src/iter/mod.rs +++ b/vendor/rustc-rayon/src/iter/mod.rs @@ -72,6 +72,12 @@ //! to mirror the unstable `std::ops::Try` with implementations for `Option` and //! `Result`, where `Some`/`Ok` values will let those iterators continue, but //! `None`/`Err` values will exit early. +//! +//! A note about object safety: It is currently _not_ possible to wrap +//! a `ParallelIterator` (or any trait that depends on it) using a +//! `Box` or other kind of dynamic allocation, +//! because `ParallelIterator` is **not object-safe**. +//! (This keeps the implementation simpler and allows extra optimizations.) use self::plumbing::*; use self::private::Try; @@ -135,6 +141,8 @@ mod zip; pub use self::zip::Zip; mod zip_eq; pub use self::zip_eq::ZipEq; +mod multizip; +pub use self::multizip::MultiZip; mod interleave; pub use self::interleave::Interleave; mod interleave_shortest; @@ -395,9 +403,6 @@ pub trait ParallelIterator: Sized + Send { /// # Examples /// /// ``` - /// extern crate rand; - /// extern crate rayon; - /// /// use rand::Rng; /// use rayon::prelude::*; /// @@ -506,9 +511,6 @@ pub trait ParallelIterator: Sized + Send { /// # Examples /// /// ``` - /// extern crate rand; - /// extern crate rayon; - /// /// use rand::Rng; /// use rayon::prelude::*; /// @@ -628,9 +630,6 @@ pub trait ParallelIterator: Sized + Send { /// # Examples /// /// ``` - /// extern crate rand; - /// extern crate rayon; - /// /// use rand::Rng; /// use rayon::prelude::*; /// diff --git a/vendor/rustc-rayon/src/iter/multizip.rs b/vendor/rustc-rayon/src/iter/multizip.rs new file mode 100644 index 0000000000..8e36d08a29 --- /dev/null +++ b/vendor/rustc-rayon/src/iter/multizip.rs @@ -0,0 +1,338 @@ +use super::plumbing::*; +use super::*; + +/// `MultiZip` is an iterator that zips up a tuple of parallel iterators to +/// produce tuples of their items. +/// +/// It is created by calling `into_par_iter()` on a tuple of types that +/// implement `IntoParallelIterator`, or `par_iter()`/`par_iter_mut()` with +/// types that are iterable by reference. +/// +/// The implementation currently support tuples up to length 12. +/// +/// # Examples +/// +/// ``` +/// use rayon::prelude::*; +/// +/// // This will iterate `r` by mutable reference, like `par_iter_mut()`, while +/// // ranges are all iterated by value like `into_par_iter()`. +/// // Note that the zipped iterator is only as long as the shortest input. +/// let mut r = vec![0; 3]; +/// (&mut r, 1..10, 10..100, 100..1000).into_par_iter() +/// .for_each(|(r, x, y, z)| *r = x * y + z); +/// +/// assert_eq!(&r, &[1 * 10 + 100, 2 * 11 + 101, 3 * 12 + 102]); +/// ``` +/// +/// For a group that should all be iterated by reference, you can use a tuple reference. +/// +/// ``` +/// use rayon::prelude::*; +/// +/// let xs: Vec<_> = (1..10).collect(); +/// let ys: Vec<_> = (10..100).collect(); +/// let zs: Vec<_> = (100..1000).collect(); +/// +/// // Reference each input separately with `IntoParallelIterator`: +/// let r1: Vec<_> = (&xs, &ys, &zs).into_par_iter() +/// .map(|(x, y, z)| x * y + z) +/// .collect(); +/// +/// // Reference them all together with `IntoParallelRefIterator`: +/// let r2: Vec<_> = (xs, ys, zs).par_iter() +/// .map(|(x, y, z)| x * y + z) +/// .collect(); +/// +/// assert_eq!(r1, r2); +/// ``` +/// +/// Mutable references to a tuple will work similarly. +/// +/// ``` +/// use rayon::prelude::*; +/// +/// let mut xs: Vec<_> = (1..4).collect(); +/// let mut ys: Vec<_> = (-4..-1).collect(); +/// let mut zs = vec![0; 3]; +/// +/// // Mutably reference each input separately with `IntoParallelIterator`: +/// (&mut xs, &mut ys, &mut zs).into_par_iter().for_each(|(x, y, z)| { +/// *z += *x + *y; +/// std::mem::swap(x, y); +/// }); +/// +/// assert_eq!(xs, (vec![-4, -3, -2])); +/// assert_eq!(ys, (vec![1, 2, 3])); +/// assert_eq!(zs, (vec![-3, -1, 1])); +/// +/// // Mutably reference them all together with `IntoParallelRefMutIterator`: +/// let mut tuple = (xs, ys, zs); +/// tuple.par_iter_mut().for_each(|(x, y, z)| { +/// *z += *x + *y; +/// std::mem::swap(x, y); +/// }); +/// +/// assert_eq!(tuple, (vec![1, 2, 3], vec![-4, -3, -2], vec![-6, -2, 2])); +/// ``` +#[derive(Debug, Clone)] +pub struct MultiZip { + tuple: T, +} + +// These macros greedily consume 4 or 2 items first to achieve log2 nesting depth. +// For example, 5 => 4,1 => (2,2),1. +// +// The tuples go up to 12, so we might want to greedily consume 8 too, but +// the depth works out the same if we let that expand on the right: +// 9 => 4,5 => (2,2),(4,1) => (2,2),((2,2),1) +// 12 => 4,8 => (2,2),(4,4) => (2,2),((2,2),(2,2)) +// +// But if we ever increase to 13, we would want to split 8,5 rather than 4,9. + +macro_rules! reduce { + ($a:expr, $b:expr, $c:expr, $d:expr, $( $x:expr ),+ => $fn:path) => { + reduce!(reduce!($a, $b, $c, $d => $fn), + reduce!($( $x ),+ => $fn) + => $fn) + }; + ($a:expr, $b:expr, $( $x:expr ),+ => $fn:path) => { + reduce!(reduce!($a, $b => $fn), + reduce!($( $x ),+ => $fn) + => $fn) + }; + ($a:expr, $b:expr => $fn:path) => { $fn($a, $b) }; + ($a:expr => $fn:path) => { $a }; +} + +macro_rules! nest { + ($A:tt, $B:tt, $C:tt, $D:tt, $( $X:tt ),+) => { + (nest!($A, $B, $C, $D), nest!($( $X ),+)) + }; + ($A:tt, $B:tt, $( $X:tt ),+) => { + (($A, $B), nest!($( $X ),+)) + }; + ($A:tt, $B:tt) => { ($A, $B) }; + ($A:tt) => { $A }; +} + +macro_rules! flatten { + ($( $T:ident ),+) => {{ + #[allow(non_snake_case)] + fn flatten<$( $T ),+>(nest!($( $T ),+) : nest!($( $T ),+)) -> ($( $T, )+) { + ($( $T, )+) + } + flatten + }}; +} + +macro_rules! multizip_impls { + ($( + $Tuple:ident { + $(($idx:tt) -> $T:ident)+ + } + )+) => { + $( + impl<$( $T, )+> IntoParallelIterator for ($( $T, )+) + where + $( + $T: IntoParallelIterator, + $T::Iter: IndexedParallelIterator, + )+ + { + type Item = ($( $T::Item, )+); + type Iter = MultiZip<($( $T::Iter, )+)>; + + fn into_par_iter(self) -> Self::Iter { + MultiZip { + tuple: ( $( self.$idx.into_par_iter(), )+ ), + } + } + } + + impl<'a, $( $T, )+> IntoParallelIterator for &'a ($( $T, )+) + where + $( + $T: IntoParallelRefIterator<'a>, + $T::Iter: IndexedParallelIterator, + )+ + { + type Item = ($( $T::Item, )+); + type Iter = MultiZip<($( $T::Iter, )+)>; + + fn into_par_iter(self) -> Self::Iter { + MultiZip { + tuple: ( $( self.$idx.par_iter(), )+ ), + } + } + } + + impl<'a, $( $T, )+> IntoParallelIterator for &'a mut ($( $T, )+) + where + $( + $T: IntoParallelRefMutIterator<'a>, + $T::Iter: IndexedParallelIterator, + )+ + { + type Item = ($( $T::Item, )+); + type Iter = MultiZip<($( $T::Iter, )+)>; + + fn into_par_iter(self) -> Self::Iter { + MultiZip { + tuple: ( $( self.$idx.par_iter_mut(), )+ ), + } + } + } + + impl<$( $T, )+> ParallelIterator for MultiZip<($( $T, )+)> + where + $( $T: IndexedParallelIterator, )+ + { + type Item = ($( $T::Item, )+); + + fn drive_unindexed(self, consumer: CONSUMER) -> CONSUMER::Result + where + CONSUMER: UnindexedConsumer, + { + self.drive(consumer) + } + + fn opt_len(&self) -> Option { + Some(self.len()) + } + } + + impl<$( $T, )+> IndexedParallelIterator for MultiZip<($( $T, )+)> + where + $( $T: IndexedParallelIterator, )+ + { + fn drive(self, consumer: CONSUMER) -> CONSUMER::Result + where + CONSUMER: Consumer, + { + reduce!($( self.tuple.$idx ),+ => IndexedParallelIterator::zip) + .map(flatten!($( $T ),+)) + .drive(consumer) + } + + fn len(&self) -> usize { + reduce!($( self.tuple.$idx.len() ),+ => Ord::min) + } + + fn with_producer(self, callback: CB) -> CB::Output + where + CB: ProducerCallback, + { + reduce!($( self.tuple.$idx ),+ => IndexedParallelIterator::zip) + .map(flatten!($( $T ),+)) + .with_producer(callback) + } + } + )+ + } +} + +multizip_impls! { + Tuple1 { + (0) -> A + } + Tuple2 { + (0) -> A + (1) -> B + } + Tuple3 { + (0) -> A + (1) -> B + (2) -> C + } + Tuple4 { + (0) -> A + (1) -> B + (2) -> C + (3) -> D + } + Tuple5 { + (0) -> A + (1) -> B + (2) -> C + (3) -> D + (4) -> E + } + Tuple6 { + (0) -> A + (1) -> B + (2) -> C + (3) -> D + (4) -> E + (5) -> F + } + Tuple7 { + (0) -> A + (1) -> B + (2) -> C + (3) -> D + (4) -> E + (5) -> F + (6) -> G + } + Tuple8 { + (0) -> A + (1) -> B + (2) -> C + (3) -> D + (4) -> E + (5) -> F + (6) -> G + (7) -> H + } + Tuple9 { + (0) -> A + (1) -> B + (2) -> C + (3) -> D + (4) -> E + (5) -> F + (6) -> G + (7) -> H + (8) -> I + } + Tuple10 { + (0) -> A + (1) -> B + (2) -> C + (3) -> D + (4) -> E + (5) -> F + (6) -> G + (7) -> H + (8) -> I + (9) -> J + } + Tuple11 { + (0) -> A + (1) -> B + (2) -> C + (3) -> D + (4) -> E + (5) -> F + (6) -> G + (7) -> H + (8) -> I + (9) -> J + (10) -> K + } + Tuple12 { + (0) -> A + (1) -> B + (2) -> C + (3) -> D + (4) -> E + (5) -> F + (6) -> G + (7) -> H + (8) -> I + (9) -> J + (10) -> K + (11) -> L + } +} diff --git a/vendor/rustc-rayon/src/iter/once.rs b/vendor/rustc-rayon/src/iter/once.rs index 3819c20e8e..5140b6b9f8 100644 --- a/vendor/rustc-rayon/src/iter/once.rs +++ b/vendor/rustc-rayon/src/iter/once.rs @@ -1,5 +1,5 @@ -use iter::plumbing::*; -use iter::*; +use crate::iter::plumbing::*; +use crate::iter::*; /// Creates a parallel iterator that produces an element exactly once. /// diff --git a/vendor/rustc-rayon/src/iter/panic_fuse.rs b/vendor/rustc-rayon/src/iter/panic_fuse.rs index b0d1ac0eb2..a4239a5eb2 100644 --- a/vendor/rustc-rayon/src/iter/panic_fuse.rs +++ b/vendor/rustc-rayon/src/iter/panic_fuse.rs @@ -306,7 +306,7 @@ where where I: IntoIterator, { - fn cool<'a, T>(fuse: &'a Fuse) -> impl Fn(&T) -> bool + 'a { + fn cool<'a, T>(fuse: &'a Fuse<'_>) -> impl Fn(&T) -> bool + 'a { move |_| !fuse.panicked() } diff --git a/vendor/rustc-rayon/src/iter/par_bridge.rs b/vendor/rustc-rayon/src/iter/par_bridge.rs index c8197ea65a..07d26de08c 100644 --- a/vendor/rustc-rayon/src/iter/par_bridge.rs +++ b/vendor/rustc-rayon/src/iter/par_bridge.rs @@ -4,9 +4,9 @@ use std::sync::atomic::{AtomicBool, AtomicUsize, Ordering}; use std::sync::{Mutex, TryLockError}; use std::thread::yield_now; -use current_num_threads; -use iter::plumbing::{bridge_unindexed, Folder, UnindexedConsumer, UnindexedProducer}; -use iter::ParallelIterator; +use crate::current_num_threads; +use crate::iter::plumbing::{bridge_unindexed, Folder, UnindexedConsumer, UnindexedProducer}; +use crate::iter::ParallelIterator; /// Conversion trait to convert an `Iterator` to a `ParallelIterator`. /// @@ -96,7 +96,7 @@ where } } -struct IterParallelProducer<'a, Iter: Iterator + 'a> { +struct IterParallelProducer<'a, Iter: Iterator> { split_count: &'a AtomicUsize, done: &'a AtomicBool, iter: &'a Mutex<(Iter, Worker)>, diff --git a/vendor/rustc-rayon/src/iter/plumbing/mod.rs b/vendor/rustc-rayon/src/iter/plumbing/mod.rs index d6cc5a169b..0f84d84ae1 100644 --- a/vendor/rustc-rayon/src/iter/plumbing/mod.rs +++ b/vendor/rustc-rayon/src/iter/plumbing/mod.rs @@ -1,10 +1,10 @@ //! Traits and functions used to implement parallel iteration. These are //! low-level details -- users of parallel iterators should not need to -//! interact with them directly. See [the `plumbing` README][r] for a high-level overview. +//! interact with them directly. See [the `plumbing` README][r] for a general overview. //! //! [r]: https://github.com/rayon-rs/rayon/blob/master/src/iter/plumbing/README.md -use join_context; +use crate::join_context; use super::IndexedParallelIterator; @@ -264,7 +264,7 @@ impl Splitter { #[inline] fn new() -> Splitter { Splitter { - splits: ::current_num_threads(), + splits: crate::current_num_threads(), } } @@ -275,7 +275,7 @@ impl Splitter { if stolen { // This job was stolen! Reset the number of desired splits to the // thread count, if that's more than we had remaining anyway. - self.splits = cmp::max(::current_num_threads(), self.splits / 2); + self.splits = cmp::max(crate::current_num_threads(), self.splits / 2); true } else if splits > 0 { // We have splits remaining, make it so. diff --git a/vendor/rustc-rayon/src/iter/reduce.rs b/vendor/rustc-rayon/src/iter/reduce.rs index 8ba4f1a4e1..321b5dd864 100644 --- a/vendor/rustc-rayon/src/iter/reduce.rs +++ b/vendor/rustc-rayon/src/iter/reduce.rs @@ -15,7 +15,7 @@ where pi.drive_unindexed(consumer) } -struct ReduceConsumer<'r, R: 'r, ID: 'r> { +struct ReduceConsumer<'r, R, ID> { identity: &'r ID, reduce_op: &'r R, } @@ -78,7 +78,7 @@ where } } -struct ReduceFolder<'r, R: 'r, T> { +struct ReduceFolder<'r, R, T> { reduce_op: &'r R, item: T, } diff --git a/vendor/rustc-rayon/src/iter/splitter.rs b/vendor/rustc-rayon/src/iter/splitter.rs index 45b0081c1f..40935ac2b0 100644 --- a/vendor/rustc-rayon/src/iter/splitter.rs +++ b/vendor/rustc-rayon/src/iter/splitter.rs @@ -146,7 +146,7 @@ where } } -struct SplitProducer<'a, D, S: 'a> { +struct SplitProducer<'a, D, S> { data: D, splitter: &'a S, } diff --git a/vendor/rustc-rayon/src/iter/test.rs b/vendor/rustc-rayon/src/iter/test.rs index b632383f3a..5587749ba0 100644 --- a/vendor/rustc-rayon/src/iter/test.rs +++ b/vendor/rustc-rayon/src/iter/test.rs @@ -1,7 +1,7 @@ use std::sync::atomic::{AtomicUsize, Ordering}; use super::*; -use prelude::*; +use crate::prelude::*; use rayon_core::*; use rand::distributions::Standard; @@ -399,6 +399,7 @@ fn check_cmp_to_seq() { #[test] fn check_cmp_rng_to_seq() { let mut rng = seeded_rng(); + let rng = &mut rng; let a: Vec = rng.sample_iter(&Standard).take(1024).collect(); let b: Vec = rng.sample_iter(&Standard).take(1024).collect(); for i in 0..a.len() { @@ -552,6 +553,7 @@ fn check_partial_cmp_to_seq() { #[test] fn check_partial_cmp_rng_to_seq() { let mut rng = seeded_rng(); + let rng = &mut rng; let a: Vec = rng.sample_iter(&Standard).take(1024).collect(); let b: Vec = rng.sample_iter(&Standard).take(1024).collect(); for i in 0..a.len() { @@ -1522,7 +1524,7 @@ fn par_iter_unindexed_flat_map() { #[test] fn min_max() { - let mut rng = seeded_rng(); + let rng = seeded_rng(); let a: Vec = rng.sample_iter(&Standard).take(1024).collect(); for i in 0..=a.len() { let slice = &a[..i]; @@ -1533,7 +1535,7 @@ fn min_max() { #[test] fn min_max_by() { - let mut rng = seeded_rng(); + let rng = seeded_rng(); // Make sure there are duplicate keys, for testing sort stability let r: Vec = rng.sample_iter(&Standard).take(512).collect(); let a: Vec<(i32, u16)> = r.iter().chain(&r).cloned().zip(0..).collect(); @@ -1552,7 +1554,7 @@ fn min_max_by() { #[test] fn min_max_by_key() { - let mut rng = seeded_rng(); + let rng = seeded_rng(); // Make sure there are duplicate keys, for testing sort stability let r: Vec = rng.sample_iter(&Standard).take(512).collect(); let a: Vec<(i32, u16)> = r.iter().chain(&r).cloned().zip(0..).collect(); @@ -1851,7 +1853,7 @@ fn check_partition_map() { #[test] fn check_either() { - type I = ::vec::IntoIter; + type I = crate::vec::IntoIter; type E = Either; let v: Vec = (0..1024).collect(); diff --git a/vendor/rustc-rayon/src/iter/try_fold.rs b/vendor/rustc-rayon/src/iter/try_fold.rs index 51f9881794..c1a57a4e62 100644 --- a/vendor/rustc-rayon/src/iter/try_fold.rs +++ b/vendor/rustc-rayon/src/iter/try_fold.rs @@ -65,7 +65,7 @@ where } } -struct TryFoldConsumer<'c, U, C, ID: 'c, F: 'c> { +struct TryFoldConsumer<'c, U, C, ID, F> { base: C, identity: &'c ID, fold_op: &'c F, @@ -127,7 +127,7 @@ where } } -struct TryFoldFolder<'r, C, U: Try, F: 'r> { +struct TryFoldFolder<'r, C, U: Try, F> { base: C, fold_op: &'r F, result: Result, @@ -227,7 +227,7 @@ where } } -struct TryFoldWithConsumer<'c, C, U: Try, F: 'c> { +struct TryFoldWithConsumer<'c, C, U: Try, F> { base: C, item: U::Ok, fold_op: &'c F, diff --git a/vendor/rustc-rayon/src/iter/try_reduce.rs b/vendor/rustc-rayon/src/iter/try_reduce.rs index 6c9f24181e..76b38505d1 100644 --- a/vendor/rustc-rayon/src/iter/try_reduce.rs +++ b/vendor/rustc-rayon/src/iter/try_reduce.rs @@ -20,7 +20,7 @@ where pi.drive_unindexed(consumer) } -struct TryReduceConsumer<'r, R: 'r, ID: 'r> { +struct TryReduceConsumer<'r, R, ID> { identity: &'r ID, reduce_op: &'r R, full: &'r AtomicBool, @@ -89,7 +89,7 @@ where } } -struct TryReduceFolder<'r, R: 'r, T: Try> { +struct TryReduceFolder<'r, R, T: Try> { reduce_op: &'r R, result: Result, full: &'r AtomicBool, diff --git a/vendor/rustc-rayon/src/iter/try_reduce_with.rs b/vendor/rustc-rayon/src/iter/try_reduce_with.rs index 137dd5886d..6be3100f09 100644 --- a/vendor/rustc-rayon/src/iter/try_reduce_with.rs +++ b/vendor/rustc-rayon/src/iter/try_reduce_with.rs @@ -18,7 +18,7 @@ where pi.drive_unindexed(consumer) } -struct TryReduceWithConsumer<'r, R: 'r> { +struct TryReduceWithConsumer<'r, R> { reduce_op: &'r R, full: &'r AtomicBool, } @@ -88,7 +88,7 @@ where } } -struct TryReduceWithFolder<'r, R: 'r, T: Try> { +struct TryReduceWithFolder<'r, R, T: Try> { reduce_op: &'r R, opt_result: Option>, full: &'r AtomicBool, diff --git a/vendor/rustc-rayon/src/iter/unzip.rs b/vendor/rustc-rayon/src/iter/unzip.rs index b5a669970a..3c5ff68429 100644 --- a/vendor/rustc-rayon/src/iter/unzip.rs +++ b/vendor/rustc-rayon/src/iter/unzip.rs @@ -191,7 +191,7 @@ where } /// A fake iterator to intercept the `Consumer` for type `A`. -struct UnzipA<'b, I, OP, FromB: 'b> { +struct UnzipA<'b, I, OP, FromB> { base: I, op: OP, b: &'b mut FromB, @@ -283,7 +283,7 @@ where } /// `Consumer` that unzips into two other `Consumer`s -struct UnzipConsumer<'a, OP: 'a, CA, CB> { +struct UnzipConsumer<'a, OP, CA, CB> { op: &'a OP, left: CA, right: CB, @@ -358,7 +358,7 @@ where } /// `Folder` that unzips into two other `Folder`s -struct UnzipFolder<'a, OP: 'a, FA, FB> { +struct UnzipFolder<'a, OP, FA, FB> { op: &'a OP, left: FA, right: FB, diff --git a/vendor/rustc-rayon/src/iter/update.rs b/vendor/rustc-rayon/src/iter/update.rs index e822f48787..3e8eabe0d1 100644 --- a/vendor/rustc-rayon/src/iter/update.rs +++ b/vendor/rustc-rayon/src/iter/update.rs @@ -107,7 +107,7 @@ where /// //////////////////////////////////////////////////////////////////////// -struct UpdateProducer<'f, P, F: 'f> { +struct UpdateProducer<'f, P, F> { base: P, update_op: &'f F, } @@ -163,7 +163,7 @@ where /// //////////////////////////////////////////////////////////////////////// /// Consumer implementation -struct UpdateConsumer<'f, C, F: 'f> { +struct UpdateConsumer<'f, C, F> { base: C, update_op: &'f F, } @@ -218,7 +218,7 @@ where } } -struct UpdateFolder<'f, C, F: 'f> { +struct UpdateFolder<'f, C, F> { base: C, update_op: &'f F, } diff --git a/vendor/rustc-rayon/src/lib.rs b/vendor/rustc-rayon/src/lib.rs index 2dd148f188..3cbdacd12e 100644 --- a/vendor/rustc-rayon/src/lib.rs +++ b/vendor/rustc-rayon/src/lib.rs @@ -1,4 +1,4 @@ -#![doc(html_root_url = "https://docs.rs/rayon/1.2")] +#![doc(html_root_url = "https://docs.rs/rayon/1.3")] #![deny(missing_debug_implementations)] #![deny(missing_docs)] #![deny(unreachable_pub)] @@ -18,6 +18,9 @@ //! typically the most efficient. //! - [Parallel iterators][iter module] make it easy to convert a sequential iterator to //! execute in parallel. +//! - The [`ParallelIterator`] trait defines general methods for all parallel iterators. +//! - The [`IndexedParallelIterator`] trait adds methods for iterators that support random +//! access. //! - The [`par_sort`] method sorts `&mut [T]` slices (or vectors) in parallel. //! - [`par_extend`] can be used to efficiently grow collections with items produced //! by a parallel iterator. @@ -36,8 +39,7 @@ //! //! # Basic usage and the Rayon prelude //! -//! First, you will need to add `rayon` to your `Cargo.toml` and put -//! `extern crate rayon` in your main file (`lib.rs`, `main.rs`). +//! First, you will need to add `rayon` to your `Cargo.toml`. //! //! Next, to use parallel iterators or the other high-level methods, //! you need to import several traits. Those traits are bundled into @@ -55,6 +57,8 @@ //! [`filter`]: iter/trait.ParallelIterator.html#method.filter //! [`fold`]: iter/trait.ParallelIterator.html#method.fold //! [more]: iter/trait.ParallelIterator.html#provided-methods +//! [`ParallelIterator`]: iter/trait.ParallelIterator.html +//! [`IndexedParallelIterator`]: iter/trait.IndexedParallelIterator.html //! //! # Crate Layout //! @@ -78,20 +82,8 @@ //! //! [faq]: https://github.com/rayon-rs/rayon/blob/master/FAQ.md -extern crate crossbeam_deque; -extern crate either; -extern crate rustc_rayon_core as rayon_core; - -#[cfg(test)] -extern crate rand; -#[cfg(test)] -extern crate rand_xorshift; -#[cfg(test)] -#[macro_use] -extern crate doc_comment; - #[cfg(test)] -doctest!("../README.md"); +doc_comment::doctest!("../README.md"); #[macro_use] mod delegate; diff --git a/vendor/rustc-rayon/src/option.rs b/vendor/rustc-rayon/src/option.rs index 925107f829..0f56896f05 100644 --- a/vendor/rustc-rayon/src/option.rs +++ b/vendor/rustc-rayon/src/option.rs @@ -5,9 +5,8 @@ //! //! [std::option]: https://doc.rust-lang.org/stable/std/option/ -use iter::plumbing::*; -use iter::*; -use std; +use crate::iter::plumbing::*; +use crate::iter::*; use std::sync::atomic::{AtomicBool, Ordering}; /// A parallel iterator over the value in [`Some`] variant of an [`Option`]. @@ -85,7 +84,7 @@ impl IndexedParallelIterator for IntoIter { /// [`Some`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.Some /// [`par_iter`]: ../iter/trait.IntoParallelRefIterator.html#tymethod.par_iter #[derive(Debug)] -pub struct Iter<'a, T: Sync + 'a> { +pub struct Iter<'a, T: Sync> { inner: IntoIter<&'a T>, } @@ -123,7 +122,7 @@ delegate_indexed_iterator! { /// [`Some`]: https://doc.rust-lang.org/std/option/enum.Option.html#variant.Some /// [`par_iter_mut`]: ../iter/trait.IntoParallelRefMutIterator.html#tymethod.par_iter_mut #[derive(Debug)] -pub struct IterMut<'a, T: Send + 'a> { +pub struct IterMut<'a, T: Send> { inner: IntoIter<&'a mut T>, } diff --git a/vendor/rustc-rayon/src/par_either.rs b/vendor/rustc-rayon/src/par_either.rs index d72e5140b5..a19ce53998 100644 --- a/vendor/rustc-rayon/src/par_either.rs +++ b/vendor/rustc-rayon/src/par_either.rs @@ -1,6 +1,6 @@ -use iter::plumbing::*; -use iter::Either::{Left, Right}; -use iter::*; +use crate::iter::plumbing::*; +use crate::iter::Either::{Left, Right}; +use crate::iter::*; /// `Either` is a parallel iterator if both `L` and `R` are parallel iterators. impl ParallelIterator for Either diff --git a/vendor/rustc-rayon/src/prelude.rs b/vendor/rustc-rayon/src/prelude.rs index 7c32aab746..3485475145 100644 --- a/vendor/rustc-rayon/src/prelude.rs +++ b/vendor/rustc-rayon/src/prelude.rs @@ -2,14 +2,14 @@ //! The intention is that one can include `use rayon::prelude::*` and //! have easy access to the various traits and methods you will need. -pub use iter::FromParallelIterator; -pub use iter::IndexedParallelIterator; -pub use iter::IntoParallelIterator; -pub use iter::IntoParallelRefIterator; -pub use iter::IntoParallelRefMutIterator; -pub use iter::ParallelBridge; -pub use iter::ParallelExtend; -pub use iter::ParallelIterator; -pub use slice::ParallelSlice; -pub use slice::ParallelSliceMut; -pub use str::ParallelString; +pub use crate::iter::FromParallelIterator; +pub use crate::iter::IndexedParallelIterator; +pub use crate::iter::IntoParallelIterator; +pub use crate::iter::IntoParallelRefIterator; +pub use crate::iter::IntoParallelRefMutIterator; +pub use crate::iter::ParallelBridge; +pub use crate::iter::ParallelExtend; +pub use crate::iter::ParallelIterator; +pub use crate::slice::ParallelSlice; +pub use crate::slice::ParallelSliceMut; +pub use crate::str::ParallelString; diff --git a/vendor/rustc-rayon/src/private.rs b/vendor/rustc-rayon/src/private.rs index 5d084ff146..a99dd11fb2 100644 --- a/vendor/rustc-rayon/src/private.rs +++ b/vendor/rustc-rayon/src/private.rs @@ -13,14 +13,14 @@ macro_rules! private_decl { /// This trait is private; this method exists to make it /// impossible to implement outside the crate. #[doc(hidden)] - fn __rayon_private__(&self) -> ::private::PrivateMarker; + fn __rayon_private__(&self) -> crate::private::PrivateMarker; } } macro_rules! private_impl { () => { - fn __rayon_private__(&self) -> ::private::PrivateMarker { - ::private::PrivateMarker + fn __rayon_private__(&self) -> crate::private::PrivateMarker { + crate::private::PrivateMarker } } } diff --git a/vendor/rustc-rayon/src/range.rs b/vendor/rustc-rayon/src/range.rs index 1a0f2c5d38..f3b0c5181c 100644 --- a/vendor/rustc-rayon/src/range.rs +++ b/vendor/rustc-rayon/src/range.rs @@ -16,8 +16,8 @@ //! //! [std::range]: https://doc.rust-lang.org/core/ops/struct.Range.html -use iter::plumbing::*; -use iter::*; +use crate::iter::plumbing::*; +use crate::iter::*; use std::ops::Range; use std::usize; @@ -286,8 +286,8 @@ fn test_u128_opt_len() { #[test] #[cfg(target_pointer_width = "64")] fn test_usize_i64_overflow() { + use crate::ThreadPoolBuilder; use std::i64; - use ThreadPoolBuilder; let iter = (-2..i64::MAX).into_par_iter(); assert_eq!(iter.opt_len(), Some(i64::MAX as usize + 2)); diff --git a/vendor/rustc-rayon/src/range_inclusive.rs b/vendor/rustc-rayon/src/range_inclusive.rs index fadbf71e3b..c1757701a5 100644 --- a/vendor/rustc-rayon/src/range_inclusive.rs +++ b/vendor/rustc-rayon/src/range_inclusive.rs @@ -16,8 +16,8 @@ //! //! [std::range]: https://doc.rust-lang.org/core/ops/struct.RangeInclusive.html -use iter::plumbing::*; -use iter::*; +use crate::iter::plumbing::*; +use crate::iter::*; use std::ops::RangeInclusive; /// Parallel iterator over an inclusive range, implemented for all integer types. @@ -191,8 +191,8 @@ fn test_u128_opt_len() { #[test] #[cfg(target_pointer_width = "64")] fn test_usize_i64_overflow() { + use crate::ThreadPoolBuilder; use std::i64; - use ThreadPoolBuilder; let iter = (-2..=i64::MAX).into_par_iter(); assert_eq!(iter.opt_len(), Some(i64::MAX as usize + 3)); diff --git a/vendor/rustc-rayon/src/result.rs b/vendor/rustc-rayon/src/result.rs index e0a63dbc7f..43685ca43a 100644 --- a/vendor/rustc-rayon/src/result.rs +++ b/vendor/rustc-rayon/src/result.rs @@ -5,11 +5,11 @@ //! //! [std::result]: https://doc.rust-lang.org/stable/std/result/ -use iter::plumbing::*; -use iter::*; +use crate::iter::plumbing::*; +use crate::iter::*; use std::sync::Mutex; -use option; +use crate::option; /// Parallel iterator over a result #[derive(Debug, Clone)] @@ -35,7 +35,7 @@ delegate_indexed_iterator! { /// Parallel iterator over an immutable reference to a result #[derive(Debug)] -pub struct Iter<'a, T: Sync + 'a> { +pub struct Iter<'a, T: Sync> { inner: option::IntoIter<&'a T>, } @@ -65,7 +65,7 @@ delegate_indexed_iterator! { /// Parallel iterator over a mutable reference to a result #[derive(Debug)] -pub struct IterMut<'a, T: Send + 'a> { +pub struct IterMut<'a, T: Send> { inner: option::IntoIter<&'a mut T>, } diff --git a/vendor/rustc-rayon/src/slice/mergesort.rs b/vendor/rustc-rayon/src/slice/mergesort.rs index 45029c443a..a007cae80b 100644 --- a/vendor/rustc-rayon/src/slice/mergesort.rs +++ b/vendor/rustc-rayon/src/slice/mergesort.rs @@ -4,9 +4,8 @@ //! The only difference from the original is that the sequential `mergesort` returns //! `MergesortResult` and leaves descending arrays intact. -use iter::*; -use rayon_core; -use slice::ParallelSliceMut; +use crate::iter::*; +use crate::slice::ParallelSliceMut; use std::mem; use std::mem::size_of; use std::ptr; diff --git a/vendor/rustc-rayon/src/slice/mod.rs b/vendor/rustc-rayon/src/slice/mod.rs index 72f50f713a..4ceb4248ee 100644 --- a/vendor/rustc-rayon/src/slice/mod.rs +++ b/vendor/rustc-rayon/src/slice/mod.rs @@ -12,9 +12,9 @@ mod test; use self::mergesort::par_mergesort; use self::quicksort::par_quicksort; -use iter::plumbing::*; -use iter::*; -use split_producer::*; +use crate::iter::plumbing::*; +use crate::iter::*; +use crate::split_producer::*; use std::cmp; use std::cmp::Ordering; use std::fmt::{self, Debug}; @@ -443,7 +443,7 @@ impl<'data, T: Send + 'data> IntoParallelIterator for &'data mut Vec { /// Parallel iterator over immutable items in a slice #[derive(Debug)] -pub struct Iter<'data, T: 'data + Sync> { +pub struct Iter<'data, T: Sync> { slice: &'data [T], } @@ -488,7 +488,7 @@ impl<'data, T: Sync + 'data> IndexedParallelIterator for Iter<'data, T> { } } -struct IterProducer<'data, T: 'data + Sync> { +struct IterProducer<'data, T: Sync> { slice: &'data [T], } @@ -508,7 +508,7 @@ impl<'data, T: 'data + Sync> Producer for IterProducer<'data, T> { /// Parallel iterator over immutable non-overlapping chunks of a slice #[derive(Debug)] -pub struct Chunks<'data, T: 'data + Sync> { +pub struct Chunks<'data, T: Sync> { chunk_size: usize, slice: &'data [T], } @@ -557,7 +557,7 @@ impl<'data, T: Sync + 'data> IndexedParallelIterator for Chunks<'data, T> { } } -struct ChunksProducer<'data, T: 'data + Sync> { +struct ChunksProducer<'data, T: Sync> { chunk_size: usize, slice: &'data [T], } @@ -588,7 +588,7 @@ impl<'data, T: 'data + Sync> Producer for ChunksProducer<'data, T> { /// Parallel iterator over immutable overlapping windows of a slice #[derive(Debug)] -pub struct Windows<'data, T: 'data + Sync> { +pub struct Windows<'data, T: Sync> { window_size: usize, slice: &'data [T], } @@ -638,7 +638,7 @@ impl<'data, T: Sync + 'data> IndexedParallelIterator for Windows<'data, T> { } } -struct WindowsProducer<'data, T: 'data + Sync> { +struct WindowsProducer<'data, T: Sync> { window_size: usize, slice: &'data [T], } @@ -670,7 +670,7 @@ impl<'data, T: 'data + Sync> Producer for WindowsProducer<'data, T> { /// Parallel iterator over mutable items in a slice #[derive(Debug)] -pub struct IterMut<'data, T: 'data + Send> { +pub struct IterMut<'data, T: Send> { slice: &'data mut [T], } @@ -709,7 +709,7 @@ impl<'data, T: Send + 'data> IndexedParallelIterator for IterMut<'data, T> { } } -struct IterMutProducer<'data, T: 'data + Send> { +struct IterMutProducer<'data, T: Send> { slice: &'data mut [T], } @@ -732,7 +732,7 @@ impl<'data, T: 'data + Send> Producer for IterMutProducer<'data, T> { /// Parallel iterator over mutable non-overlapping chunks of a slice #[derive(Debug)] -pub struct ChunksMut<'data, T: 'data + Send> { +pub struct ChunksMut<'data, T: Send> { chunk_size: usize, slice: &'data mut [T], } @@ -775,7 +775,7 @@ impl<'data, T: Send + 'data> IndexedParallelIterator for ChunksMut<'data, T> { } } -struct ChunksMutProducer<'data, T: 'data + Send> { +struct ChunksMutProducer<'data, T: Send> { chunk_size: usize, slice: &'data mut [T], } @@ -805,7 +805,7 @@ impl<'data, T: 'data + Send> Producer for ChunksMutProducer<'data, T> { } /// Parallel iterator over slices separated by a predicate -pub struct Split<'data, T: 'data, P> { +pub struct Split<'data, T, P> { slice: &'data [T], separator: P, } @@ -881,7 +881,7 @@ where } /// Parallel iterator over mutable slices separated by a predicate -pub struct SplitMut<'data, T: 'data, P> { +pub struct SplitMut<'data, T, P> { slice: &'data mut [T], separator: P, } diff --git a/vendor/rustc-rayon/src/slice/quicksort.rs b/vendor/rustc-rayon/src/slice/quicksort.rs index 4fd7813160..b985073514 100644 --- a/vendor/rustc-rayon/src/slice/quicksort.rs +++ b/vendor/rustc-rayon/src/slice/quicksort.rs @@ -4,7 +4,6 @@ //! The only difference from the original is that calls to `recurse` are executed in parallel using //! `rayon_core::join`. -use rayon_core; use std::cmp; use std::mem; use std::ptr; @@ -256,14 +255,14 @@ where let mut block_l = BLOCK; let mut start_l = ptr::null_mut(); let mut end_l = ptr::null_mut(); - let mut offsets_l: [u8; BLOCK] = unsafe { mem::uninitialized() }; + let mut offsets_l = [0u8; BLOCK]; // The current block on the right side (from `r.offset(-block_r)` to `r`). let mut r = unsafe { l.add(v.len()) }; let mut block_r = BLOCK; let mut start_r = ptr::null_mut(); let mut end_r = ptr::null_mut(); - let mut offsets_r: [u8; BLOCK] = unsafe { mem::uninitialized() }; + let mut offsets_r = [0u8; BLOCK]; // Returns the number of elements between pointers `l` (inclusive) and `r` (exclusive). fn width(l: *mut T, r: *mut T) -> usize { @@ -767,7 +766,7 @@ mod tests { #[test] fn test_heapsort() { - let mut rng = thread_rng(); + let rng = thread_rng(); for len in (0..25).chain(500..501) { for &modulus in &[5, 10, 100] { diff --git a/vendor/rustc-rayon/src/split_producer.rs b/vendor/rustc-rayon/src/split_producer.rs index 99c2a89c54..568657af8b 100644 --- a/vendor/rustc-rayon/src/split_producer.rs +++ b/vendor/rustc-rayon/src/split_producer.rs @@ -2,10 +2,10 @@ //! //! This module is private, so these items are effectively `pub(super)` -use iter::plumbing::{Folder, UnindexedProducer}; +use crate::iter::plumbing::{Folder, UnindexedProducer}; /// Common producer for splitting on a predicate. -pub(super) struct SplitProducer<'p, P: 'p, V> { +pub(super) struct SplitProducer<'p, P, V> { data: V, separator: &'p P, diff --git a/vendor/rustc-rayon/src/str.rs b/vendor/rustc-rayon/src/str.rs index 3b4573cf0b..2fdaaa731c 100644 --- a/vendor/rustc-rayon/src/str.rs +++ b/vendor/rustc-rayon/src/str.rs @@ -13,9 +13,9 @@ //! //! [std::str]: https://doc.rust-lang.org/stable/std/str/ -use iter::plumbing::*; -use iter::*; -use split_producer::*; +use crate::iter::plumbing::*; +use crate::iter::*; +use crate::split_producer::*; /// Test if a byte is the start of a UTF-8 character. /// (extracted from `str::is_char_boundary`) @@ -274,7 +274,7 @@ impl ParallelString for str { /// would be nicer to have its basic existence and implementors public while /// keeping all of the methods private. mod private { - use iter::plumbing::Folder; + use crate::iter::plumbing::Folder; /// Pattern-matching trait for `ParallelString`, somewhat like a mix of /// `std::str::pattern::{Pattern, Searcher}`. @@ -646,7 +646,7 @@ pub struct SplitTerminator<'ch, P: Pattern> { terminator: P, } -struct SplitTerminatorProducer<'ch, 'sep, P: Pattern + 'sep> { +struct SplitTerminatorProducer<'ch, 'sep, P: Pattern> { splitter: SplitProducer<'sep, P, &'ch str>, skip_last: bool, } @@ -766,7 +766,7 @@ pub struct Matches<'ch, P: Pattern> { pattern: P, } -struct MatchesProducer<'ch, 'pat, P: Pattern + 'pat> { +struct MatchesProducer<'ch, 'pat, P: Pattern> { chars: &'ch str, pattern: &'pat P, } @@ -822,7 +822,7 @@ pub struct MatchIndices<'ch, P: Pattern> { pattern: P, } -struct MatchIndicesProducer<'ch, 'pat, P: Pattern + 'pat> { +struct MatchIndicesProducer<'ch, 'pat, P: Pattern> { index: usize, chars: &'ch str, pattern: &'pat P, diff --git a/vendor/rustc-rayon/src/vec.rs b/vendor/rustc-rayon/src/vec.rs index 767bf8ca04..bfbf9395a0 100644 --- a/vendor/rustc-rayon/src/vec.rs +++ b/vendor/rustc-rayon/src/vec.rs @@ -5,9 +5,8 @@ //! //! [std::vec]: https://doc.rust-lang.org/stable/std/vec/ -use iter::plumbing::*; -use iter::*; -use std; +use crate::iter::plumbing::*; +use crate::iter::*; /// Parallel iterator that moves out of a vector. #[derive(Debug, Clone)] @@ -73,7 +72,7 @@ impl IndexedParallelIterator for IntoIter { /// //////////////////////////////////////////////////////////////////////// -struct VecProducer<'data, T: 'data + Send> { +struct VecProducer<'data, T: Send> { slice: &'data mut [T], } @@ -108,7 +107,7 @@ impl<'data, T: 'data + Send> Drop for VecProducer<'data, T> { /// //////////////////////////////////////////////////////////////////////// // like std::vec::Drain, without updating a source Vec -struct SliceDrain<'data, T: 'data> { +struct SliceDrain<'data, T> { iter: std::slice::IterMut<'data, T>, } diff --git a/vendor/rustc-rayon/tests/clones.rs b/vendor/rustc-rayon/tests/clones.rs index 1a242b6983..bcfd812ee7 100644 --- a/vendor/rustc-rayon/tests/clones.rs +++ b/vendor/rustc-rayon/tests/clones.rs @@ -1,5 +1,3 @@ -extern crate rayon; - use rayon::prelude::*; fn check(iter: I) @@ -164,3 +162,20 @@ fn clone_repeat() { fn clone_splitter() { check(rayon::iter::split(0..1000, |x| (x, None))); } + +#[test] +fn clone_multizip() { + let v: &Vec<_> = &(0..1000).collect(); + check((v,).into_par_iter()); + check((v, v).into_par_iter()); + check((v, v, v).into_par_iter()); + check((v, v, v, v).into_par_iter()); + check((v, v, v, v, v).into_par_iter()); + check((v, v, v, v, v, v).into_par_iter()); + check((v, v, v, v, v, v, v).into_par_iter()); + check((v, v, v, v, v, v, v, v).into_par_iter()); + check((v, v, v, v, v, v, v, v, v).into_par_iter()); + check((v, v, v, v, v, v, v, v, v, v).into_par_iter()); + check((v, v, v, v, v, v, v, v, v, v, v).into_par_iter()); + check((v, v, v, v, v, v, v, v, v, v, v, v).into_par_iter()); +} diff --git a/vendor/rustc-rayon/tests/debug.rs b/vendor/rustc-rayon/tests/debug.rs index 4a019a8d1e..0fa68720ee 100644 --- a/vendor/rustc-rayon/tests/debug.rs +++ b/vendor/rustc-rayon/tests/debug.rs @@ -1,5 +1,3 @@ -extern crate rayon; - use rayon::prelude::*; use std::fmt::Debug; @@ -175,3 +173,20 @@ fn debug_repeat() { fn debug_splitter() { check(rayon::iter::split(0..10, |x| (x, None))); } + +#[test] +fn debug_multizip() { + let v: &Vec<_> = &(0..10).collect(); + check((v,).into_par_iter()); + check((v, v).into_par_iter()); + check((v, v, v).into_par_iter()); + check((v, v, v, v).into_par_iter()); + check((v, v, v, v, v).into_par_iter()); + check((v, v, v, v, v, v).into_par_iter()); + check((v, v, v, v, v, v, v).into_par_iter()); + check((v, v, v, v, v, v, v, v).into_par_iter()); + check((v, v, v, v, v, v, v, v, v).into_par_iter()); + check((v, v, v, v, v, v, v, v, v, v).into_par_iter()); + check((v, v, v, v, v, v, v, v, v, v, v).into_par_iter()); + check((v, v, v, v, v, v, v, v, v, v, v, v).into_par_iter()); +} diff --git a/vendor/rustc-rayon/tests/intersperse.rs b/vendor/rustc-rayon/tests/intersperse.rs index d81cbb1165..aaa5b6530d 100644 --- a/vendor/rustc-rayon/tests/intersperse.rs +++ b/vendor/rustc-rayon/tests/intersperse.rs @@ -1,5 +1,3 @@ -extern crate rayon; - use rayon::prelude::*; #[test] diff --git a/vendor/rustc-rayon/tests/issue671-unzip.rs b/vendor/rustc-rayon/tests/issue671-unzip.rs index 83353d7ea6..c9af7e6e3a 100644 --- a/vendor/rustc-rayon/tests/issue671-unzip.rs +++ b/vendor/rustc-rayon/tests/issue671-unzip.rs @@ -1,7 +1,5 @@ #![type_length_limit = "10000"] -extern crate rayon; - use rayon::prelude::*; #[test] diff --git a/vendor/rustc-rayon/tests/issue671.rs b/vendor/rustc-rayon/tests/issue671.rs index a2000d88f8..9d0953fe6a 100644 --- a/vendor/rustc-rayon/tests/issue671.rs +++ b/vendor/rustc-rayon/tests/issue671.rs @@ -1,7 +1,5 @@ #![type_length_limit = "500000"] -extern crate rayon; - use rayon::prelude::*; #[test] diff --git a/vendor/rustc-rayon/tests/iter_panic.rs b/vendor/rustc-rayon/tests/iter_panic.rs index f40071287a..4885a28bea 100644 --- a/vendor/rustc-rayon/tests/iter_panic.rs +++ b/vendor/rustc-rayon/tests/iter_panic.rs @@ -1,5 +1,3 @@ -extern crate rayon; - use rayon::prelude::*; use rayon::ThreadPoolBuilder; use std::ops::Range; diff --git a/vendor/rustc-rayon/tests/named-threads.rs b/vendor/rustc-rayon/tests/named-threads.rs index 408b135364..fd1b0be2d8 100644 --- a/vendor/rustc-rayon/tests/named-threads.rs +++ b/vendor/rustc-rayon/tests/named-threads.rs @@ -1,5 +1,3 @@ -extern crate rayon; - use std::collections::HashSet; use rayon::prelude::*; diff --git a/vendor/rustc-rayon/tests/octillion.rs b/vendor/rustc-rayon/tests/octillion.rs index 8bccb10be7..9257c689b3 100644 --- a/vendor/rustc-rayon/tests/octillion.rs +++ b/vendor/rustc-rayon/tests/octillion.rs @@ -1,5 +1,3 @@ -extern crate rayon; - use rayon::prelude::*; const OCTILLION: u128 = 1_000_000_000_000_000_000_000_000_000; diff --git a/vendor/rustc-rayon/tests/producer_split_at.rs b/vendor/rustc-rayon/tests/producer_split_at.rs index 9ce2c7038b..f1fe20d012 100644 --- a/vendor/rustc-rayon/tests/producer_split_at.rs +++ b/vendor/rustc-rayon/tests/producer_split_at.rs @@ -1,5 +1,3 @@ -extern crate rayon; - use rayon::iter::plumbing::*; use rayon::prelude::*; diff --git a/vendor/rustc-rayon/tests/sort-panic-safe.rs b/vendor/rustc-rayon/tests/sort-panic-safe.rs index c216c46e94..7c5050587a 100644 --- a/vendor/rustc-rayon/tests/sort-panic-safe.rs +++ b/vendor/rustc-rayon/tests/sort-panic-safe.rs @@ -1,8 +1,3 @@ -#[macro_use] -extern crate lazy_static; -extern crate rand; -extern crate rayon; - use rand::distributions::Uniform; use rand::{thread_rng, Rng}; use rayon::prelude::*; @@ -15,7 +10,7 @@ use std::thread; static VERSIONS: AtomicUsize = AtomicUsize::new(0); -lazy_static! { +lazy_static::lazy_static! { static ref DROP_COUNTS: Vec = (0..20_000).map(|_| AtomicUsize::new(0)).collect(); } diff --git a/vendor/rustc-rayon/tests/str.rs b/vendor/rustc-rayon/tests/str.rs index 4354d89038..0e1e35eec4 100644 --- a/vendor/rustc-rayon/tests/str.rs +++ b/vendor/rustc-rayon/tests/str.rs @@ -1,7 +1,3 @@ -extern crate rand; -extern crate rand_xorshift; -extern crate rayon; - use rand::distributions::Standard; use rand::{Rng, SeedableRng}; use rand_xorshift::XorShiftRng; @@ -15,7 +11,7 @@ fn seeded_rng() -> XorShiftRng { #[test] pub fn execute_strings() { - let mut rng = seeded_rng(); + let rng = seeded_rng(); let s: String = rng.sample_iter::(&Standard).take(1024).collect(); let par_chars: String = s.par_chars().collect(); diff --git a/vendor/serde/.cargo-checksum.json b/vendor/serde/.cargo-checksum.json index 139b72ee95..596487e5f2 100644 --- a/vendor/serde/.cargo-checksum.json +++ b/vendor/serde/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"6c9c8ff479865fac1f930e0d937d496089a862b18b3b48b2294f73527ee03633","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"5cf9d2158d70048a2916360ad59d9079f6233c6f68781a7a792e70f8b772d8ce","build.rs":"acb97ae670fac691f1137cd72305971de597e10306ec977334fca5468b90d482","crates-io.md":"25ed421fe25d0f6f74c4b78674144bef2843a5f78bf552d0a8ec633be69d282b","src/de/ignored_any.rs":"c69d6071191c2075372218442e9e73991335c6b4be18736a7a789f04bb305525","src/de/impls.rs":"7e510f972d5f64837946fdbbd20a655c5f86f1bec6f11473c7226773de703c9d","src/de/mod.rs":"4db241ed202d418c85fdcee34b70a807269514f8678a3997d52ced96aef85b95","src/de/seed.rs":"e8cf0233afe0af5b8fb9e4c94f301c92729c5ba417280af9e2201b732e374a72","src/de/utf8.rs":"f17524ee0af98ec3abcfd7d0b812fbd1033263bd8e2ce2f57c1e1999ce153558","src/de/value.rs":"82d530d0bc50cba75a095c819b4269d58229a7384043f7f6e674891cc6dae7bb","src/integer128.rs":"12f6ce6a513c1c293398db38cf1d3ea7c0c5a6717152621bcba61f49abc7b5b1","src/lib.rs":"ea5d73407f121e76ef88c0429ac0a4ccb6404759d7617feafe9f83c9f3e7f36e","src/macros.rs":"3d695a51f0a07f9f719dcb5620012c21a1b084c06a6283349cabf574ceba8123","src/private/de.rs":"8bbb2af37030ddd41d20cc09642680c3c1daf97dca1845e911f33e06323c64c0","src/private/doc.rs":"e9801a43c3088fccd5f1fac76416698f948e65b647024aa9da17d673e1e8c217","src/private/mod.rs":"67cf4471f6bfd390f0e591a96603b3c434ba2912d8392e3520ec7578b9b42ab3","src/private/ser.rs":"3a90dfb5c17e81bf1d959fed60a9477713498e9d0934463627c98709132f066e","src/private/size_hint.rs":"605521227e9ba3100fbb9d5ea7fd5853385097c35015ce6908bd5f1ea20d59ad","src/ser/fmt.rs":"7827ed07fd8897e6324f75625ba0c926a4c4e7ec2914cd067391ce54d942ac7b","src/ser/impls.rs":"496b7ba45529e569ffdf5d755c6df99c1321fddc89b9f64f5cc58e24052caefc","src/ser/impossible.rs":"db17913522c1c27389c5a085113911353b9813c1b116518681362e7c8b692c3a","src/ser/mod.rs":"2ad1f3a41a23d8413affe4f6ab261c7c888ba924c7aada030332d178d7872c98","src/std_error.rs":"3aac687856c035517fae44ed2906dd4a1e3184bae4bf613adcdeb73f74126c57"},"package":"92d5161132722baa40d802cc70b15262b98258453e85e5d1d365c757c73869ae"} \ No newline at end of file +{"files":{"Cargo.toml":"562becc67ae56016694f3c4d59ff84ce5e23a87b33158f6112bc545ca21c15ec","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"5cf9d2158d70048a2916360ad59d9079f6233c6f68781a7a792e70f8b772d8ce","build.rs":"9aa78b1b3432f342b7ae6f34796955ca62eb1604dde7fea2f565ec87ae454828","crates-io.md":"25ed421fe25d0f6f74c4b78674144bef2843a5f78bf552d0a8ec633be69d282b","src/de/ignored_any.rs":"c69d6071191c2075372218442e9e73991335c6b4be18736a7a789f04bb305525","src/de/impls.rs":"8505b47b4fa97e426bedf97082005ee2d5700bfac0da41da9127c9826004c163","src/de/mod.rs":"4db241ed202d418c85fdcee34b70a807269514f8678a3997d52ced96aef85b95","src/de/seed.rs":"e8cf0233afe0af5b8fb9e4c94f301c92729c5ba417280af9e2201b732e374a72","src/de/utf8.rs":"f17524ee0af98ec3abcfd7d0b812fbd1033263bd8e2ce2f57c1e1999ce153558","src/de/value.rs":"82d530d0bc50cba75a095c819b4269d58229a7384043f7f6e674891cc6dae7bb","src/integer128.rs":"12f6ce6a513c1c293398db38cf1d3ea7c0c5a6717152621bcba61f49abc7b5b1","src/lib.rs":"22a3c25a098a00dad86de5f081367bafb743780f6459af3eaaa302305fe0796c","src/macros.rs":"3d695a51f0a07f9f719dcb5620012c21a1b084c06a6283349cabf574ceba8123","src/private/de.rs":"dd2b988650281e4aa2c89835428417e7aebfa1815cc2bebdbe16678809dd2388","src/private/doc.rs":"e9801a43c3088fccd5f1fac76416698f948e65b647024aa9da17d673e1e8c217","src/private/mod.rs":"67cf4471f6bfd390f0e591a96603b3c434ba2912d8392e3520ec7578b9b42ab3","src/private/ser.rs":"3a90dfb5c17e81bf1d959fed60a9477713498e9d0934463627c98709132f066e","src/private/size_hint.rs":"605521227e9ba3100fbb9d5ea7fd5853385097c35015ce6908bd5f1ea20d59ad","src/ser/fmt.rs":"7827ed07fd8897e6324f75625ba0c926a4c4e7ec2914cd067391ce54d942ac7b","src/ser/impls.rs":"496b7ba45529e569ffdf5d755c6df99c1321fddc89b9f64f5cc58e24052caefc","src/ser/impossible.rs":"db17913522c1c27389c5a085113911353b9813c1b116518681362e7c8b692c3a","src/ser/mod.rs":"2ad1f3a41a23d8413affe4f6ab261c7c888ba924c7aada030332d178d7872c98","src/std_error.rs":"3aac687856c035517fae44ed2906dd4a1e3184bae4bf613adcdeb73f74126c57"},"package":"bd761ff957cb2a45fbb9ab3da6512de9de55872866160b23c25f1a841e99d29f"} \ No newline at end of file diff --git a/vendor/serde/Cargo.toml b/vendor/serde/Cargo.toml index 4244bbec19..aff22c32a1 100644 --- a/vendor/serde/Cargo.toml +++ b/vendor/serde/Cargo.toml @@ -12,7 +12,7 @@ [package] name = "serde" -version = "1.0.123" +version = "1.0.124" authors = ["Erick Tryzelaar ", "David Tolnay "] build = "build.rs" include = ["build.rs", "src/**/*.rs", "crates-io.md", "README.md", "LICENSE-APACHE", "LICENSE-MIT"] @@ -30,7 +30,7 @@ targets = ["x86_64-unknown-linux-gnu"] [package.metadata.playground] features = ["derive", "rc"] [dependencies.serde_derive] -version = "=1.0.123" +version = "=1.0.124" optional = true [dev-dependencies.serde_derive] version = "1.0" diff --git a/vendor/serde/build.rs b/vendor/serde/build.rs index ca991a5d21..afda291133 100644 --- a/vendor/serde/build.rs +++ b/vendor/serde/build.rs @@ -76,12 +76,14 @@ fn main() { println!("cargo:rustc-cfg=serde_derive"); } - // TryFrom, Atomic types, and non-zero signed integers stabilized in Rust 1.34: + // TryFrom, Atomic types, non-zero signed integers, and SystemTime::checked_add + // stabilized in Rust 1.34: // https://blog.rust-lang.org/2019/04/11/Rust-1.34.0.html#tryfrom-and-tryinto // https://blog.rust-lang.org/2019/04/11/Rust-1.34.0.html#library-stabilizations if minor >= 34 { println!("cargo:rustc-cfg=core_try_from"); println!("cargo:rustc-cfg=num_nonzero_signed"); + println!("cargo:rustc-cfg=systemtime_checked_add"); // Whitelist of archs that support std::sync::atomic module. Ideally we // would use #[cfg(target_has_atomic = "...")] but it is not stable yet. diff --git a/vendor/serde/src/de/impls.rs b/vendor/serde/src/de/impls.rs index 409f6cbc06..59d90d2cc7 100644 --- a/vendor/serde/src/de/impls.rs +++ b/vendor/serde/src/de/impls.rs @@ -2046,6 +2046,17 @@ impl<'de> Deserialize<'de> for SystemTime { } } + fn check_overflow(secs: u64, nanos: u32) -> Result<(), E> + where + E: Error, + { + static NANOS_PER_SEC: u32 = 1_000_000_000; + match secs.checked_add((nanos / NANOS_PER_SEC) as u64) { + Some(_) => Ok(()), + None => Err(E::custom("overflow deserializing SystemTime epoch offset")), + } + } + struct DurationVisitor; impl<'de> Visitor<'de> for DurationVisitor { @@ -2071,6 +2082,7 @@ impl<'de> Deserialize<'de> for SystemTime { return Err(Error::invalid_length(1, &self)); } }; + try!(check_overflow(secs, nanos)); Ok(Duration::new(secs, nanos)) } @@ -2108,13 +2120,20 @@ impl<'de> Deserialize<'de> for SystemTime { Some(nanos) => nanos, None => return Err(::missing_field("nanos_since_epoch")), }; + try!(check_overflow(secs, nanos)); Ok(Duration::new(secs, nanos)) } } const FIELDS: &'static [&'static str] = &["secs_since_epoch", "nanos_since_epoch"]; let duration = try!(deserializer.deserialize_struct("SystemTime", FIELDS, DurationVisitor)); - Ok(UNIX_EPOCH + duration) + #[cfg(systemtime_checked_add)] + let ret = UNIX_EPOCH + .checked_add(duration) + .ok_or_else(|| D::Error::custom("overflow deserializing SystemTime")); + #[cfg(not(systemtime_checked_add))] + let ret = Ok(UNIX_EPOCH + duration); + ret } } diff --git a/vendor/serde/src/lib.rs b/vendor/serde/src/lib.rs index 7de2ff6dff..2f6d0442c1 100644 --- a/vendor/serde/src/lib.rs +++ b/vendor/serde/src/lib.rs @@ -44,7 +44,7 @@ //! - [BSON], the data storage and network transfer format used by MongoDB. //! - [Avro], a binary format used within Apache Hadoop, with support for schema //! definition. -//! - [JSON5], A superset of JSON including some productions from ES5. +//! - [JSON5], a superset of JSON including some productions from ES5. //! - [Postcard], a no\_std and embedded-systems friendly compact binary format. //! - [URL] query strings, in the x-www-form-urlencoded format. //! - [Envy], a way to deserialize environment variables into Rust structs. @@ -84,7 +84,7 @@ //////////////////////////////////////////////////////////////////////////////// // Serde types in rustdoc of other crates get linked to here. -#![doc(html_root_url = "https://docs.rs/serde/1.0.123")] +#![doc(html_root_url = "https://docs.rs/serde/1.0.124")] // Support using Serde without the standard library! #![cfg_attr(not(feature = "std"), no_std)] // Unstable functionality only if the user asks for it. For tracking and @@ -120,6 +120,7 @@ zero_prefixed_literal, // correctly used enum_glob_use, + let_underscore_drop, map_err_ignore, result_unit_err, wildcard_imports, diff --git a/vendor/serde/src/private/de.rs b/vendor/serde/src/private/de.rs index 0c2f3b8234..91998163e9 100644 --- a/vendor/serde/src/private/de.rs +++ b/vendor/serde/src/private/de.rs @@ -1287,8 +1287,9 @@ mod content { // } // // We want {"topic":"Info"} to deserialize even though - // ordinarily unit structs do not deserialize from empty map. + // ordinarily unit structs do not deserialize from empty map/seq. Content::Map(ref v) if v.is_empty() => visitor.visit_unit(), + Content::Seq(ref v) if v.is_empty() => visitor.visit_unit(), _ => self.deserialize_any(visitor), } } @@ -1741,6 +1742,25 @@ mod content { _ => Err(self.invalid_type(&visitor)), } } + + fn deserialize_float(self, visitor: V) -> Result + where + V: Visitor<'de>, + { + match *self.content { + Content::F32(v) => visitor.visit_f32(v), + Content::F64(v) => visitor.visit_f64(v), + Content::U8(v) => visitor.visit_u8(v), + Content::U16(v) => visitor.visit_u16(v), + Content::U32(v) => visitor.visit_u32(v), + Content::U64(v) => visitor.visit_u64(v), + Content::I8(v) => visitor.visit_i8(v), + Content::I16(v) => visitor.visit_i16(v), + Content::I32(v) => visitor.visit_i32(v), + Content::I64(v) => visitor.visit_i64(v), + _ => Err(self.invalid_type(&visitor)), + } + } } fn visit_content_seq_ref<'a, 'de, V, E>( @@ -1888,25 +1908,14 @@ mod content { where V: Visitor<'de>, { - match *self.content { - Content::F32(v) => visitor.visit_f32(v), - Content::F64(v) => visitor.visit_f64(v), - Content::U64(v) => visitor.visit_u64(v), - Content::I64(v) => visitor.visit_i64(v), - _ => Err(self.invalid_type(&visitor)), - } + self.deserialize_float(visitor) } fn deserialize_f64(self, visitor: V) -> Result where V: Visitor<'de>, { - match *self.content { - Content::F64(v) => visitor.visit_f64(v), - Content::U64(v) => visitor.visit_u64(v), - Content::I64(v) => visitor.visit_i64(v), - _ => Err(self.invalid_type(&visitor)), - } + self.deserialize_float(visitor) } fn deserialize_char(self, visitor: V) -> Result diff --git a/vendor/serde_derive/.cargo-checksum.json b/vendor/serde_derive/.cargo-checksum.json index 50a9dd2720..16025bc910 100644 --- a/vendor/serde_derive/.cargo-checksum.json +++ b/vendor/serde_derive/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"d850fa5f086f13767a259c1278fcfd83f6c8f72f72e7ddd0faa5f8a4012c9664","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"5cf9d2158d70048a2916360ad59d9079f6233c6f68781a7a792e70f8b772d8ce","build.rs":"17fac4a28904e90c1e46b517839bd17fd54dbc69cfbff7451f695ecf7bab34ef","crates-io.md":"25ed421fe25d0f6f74c4b78674144bef2843a5f78bf552d0a8ec633be69d282b","src/bound.rs":"8f9a0b9aecfd23fe126f1ed4a314724b083bc91a6a3011fc063547e6aeb4b8f6","src/de.rs":"5bdb39a6b248ded2dd1fdc511c19ce5d9a86c521441b9f88de7784f9de171e2a","src/dummy.rs":"7bc4267039808046fe0a7fbeb462b301ac30ea1152fcbde8a3b934dc143fe468","src/fragment.rs":"5548ba65a53d90a296f60c1328a7a7fb040db467f59c2f5210b2fb320457145d","src/internals/ast.rs":"f1a1b13cf6b68e2bf27c5cdcdbde6883f86cde1ba8c0595dffdbf2e11c4ec8b1","src/internals/attr.rs":"effb9215435f1ed04b9b5c33c5c415328f68289a2fee272a462d5968b4a7d6e6","src/internals/case.rs":"9492f0c5142d7b7e8cd39c86d13a855e5ce4489425adb2b96aed89e1b7851ac0","src/internals/check.rs":"9a01a0db1fc3086891e998f544836e7498ebfc7cc5e1956199d0526e6a8d9a3c","src/internals/ctxt.rs":"6fa544ae52914498a62a395818ebdc1b36ac2fb5903c60afb741a864ad559f1c","src/internals/mod.rs":"f32138ff19d57eb00f88ba11f6b015efab2102657804f71ebbf386a3698dad91","src/internals/receiver.rs":"ad30c3e4583ef07f74c7905f22a6580af25ebd431fdf1e04878b9a770ca4ede6","src/internals/respan.rs":"899753859c58ce5f532a3ec4584796a52f13ed5a0533191e48c953ba5c1b52ff","src/internals/symbol.rs":"3c9ce461773b7df3bb64d82aa5a0d93052c3bb0e60209db6c0b5c10ee9cfc9cf","src/lib.rs":"47ce1286422e7d192a50879911c83b93a09b3eaa6e691cbd1799e26b705eea9a","src/pretend.rs":"2779c481bf9a20febac9317d82c415ffa086210c96e8fe9e2f32cec05e69b240","src/ser.rs":"4435e768af41f50ff0523a594b671036bff7c753344f6d09c87ae1838090bf56","src/try.rs":"b171b0088c23ebf4bfa07ba457881b41ac5e547d55dd16f737ea988d34badf61"},"package":"9391c295d64fc0abb2c556bad848f33cb8296276b1ad2677d1ae1ace4f258f31"} \ No newline at end of file +{"files":{"Cargo.toml":"31893c554bbfd53812cc88d3ead8d3cfec5dbbd992deab4f6a8135d430d9c64a","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"5cf9d2158d70048a2916360ad59d9079f6233c6f68781a7a792e70f8b772d8ce","build.rs":"17fac4a28904e90c1e46b517839bd17fd54dbc69cfbff7451f695ecf7bab34ef","crates-io.md":"25ed421fe25d0f6f74c4b78674144bef2843a5f78bf552d0a8ec633be69d282b","src/bound.rs":"8f9a0b9aecfd23fe126f1ed4a314724b083bc91a6a3011fc063547e6aeb4b8f6","src/de.rs":"5bdb39a6b248ded2dd1fdc511c19ce5d9a86c521441b9f88de7784f9de171e2a","src/dummy.rs":"7bc4267039808046fe0a7fbeb462b301ac30ea1152fcbde8a3b934dc143fe468","src/fragment.rs":"5548ba65a53d90a296f60c1328a7a7fb040db467f59c2f5210b2fb320457145d","src/internals/ast.rs":"f1a1b13cf6b68e2bf27c5cdcdbde6883f86cde1ba8c0595dffdbf2e11c4ec8b1","src/internals/attr.rs":"effb9215435f1ed04b9b5c33c5c415328f68289a2fee272a462d5968b4a7d6e6","src/internals/case.rs":"9492f0c5142d7b7e8cd39c86d13a855e5ce4489425adb2b96aed89e1b7851ac0","src/internals/check.rs":"9a01a0db1fc3086891e998f544836e7498ebfc7cc5e1956199d0526e6a8d9a3c","src/internals/ctxt.rs":"6fa544ae52914498a62a395818ebdc1b36ac2fb5903c60afb741a864ad559f1c","src/internals/mod.rs":"f32138ff19d57eb00f88ba11f6b015efab2102657804f71ebbf386a3698dad91","src/internals/receiver.rs":"ad30c3e4583ef07f74c7905f22a6580af25ebd431fdf1e04878b9a770ca4ede6","src/internals/respan.rs":"899753859c58ce5f532a3ec4584796a52f13ed5a0533191e48c953ba5c1b52ff","src/internals/symbol.rs":"3c9ce461773b7df3bb64d82aa5a0d93052c3bb0e60209db6c0b5c10ee9cfc9cf","src/lib.rs":"eccc4ea644404ac1f627016ce0552524ba2162091aaffd328417d8af22d1dcd3","src/pretend.rs":"2779c481bf9a20febac9317d82c415ffa086210c96e8fe9e2f32cec05e69b240","src/ser.rs":"4435e768af41f50ff0523a594b671036bff7c753344f6d09c87ae1838090bf56","src/try.rs":"b171b0088c23ebf4bfa07ba457881b41ac5e547d55dd16f737ea988d34badf61"},"package":"1800f7693e94e186f5e25a28291ae1570da908aff7d97a095dec1e56ff99069b"} \ No newline at end of file diff --git a/vendor/serde_derive/Cargo.toml b/vendor/serde_derive/Cargo.toml index 389d48ca55..6cc10fe8cf 100644 --- a/vendor/serde_derive/Cargo.toml +++ b/vendor/serde_derive/Cargo.toml @@ -12,7 +12,7 @@ [package] name = "serde_derive" -version = "1.0.123" +version = "1.0.124" authors = ["Erick Tryzelaar ", "David Tolnay "] include = ["build.rs", "src/**/*.rs", "crates-io.md", "README.md", "LICENSE-APACHE", "LICENSE-MIT"] description = "Macros 1.1 implementation of #[derive(Serialize, Deserialize)]" diff --git a/vendor/serde_derive/src/lib.rs b/vendor/serde_derive/src/lib.rs index f4a93ae1ac..995a75942a 100644 --- a/vendor/serde_derive/src/lib.rs +++ b/vendor/serde_derive/src/lib.rs @@ -13,13 +13,15 @@ //! //! [https://serde.rs/derive.html]: https://serde.rs/derive.html -#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.123")] +#![doc(html_root_url = "https://docs.rs/serde_derive/1.0.124")] #![allow(unknown_lints, bare_trait_objects)] #![deny(clippy::all, clippy::pedantic)] // Ignored clippy lints #![allow( clippy::cognitive_complexity, clippy::enum_variant_names, + // clippy bug: https://github.com/rust-lang/rust-clippy/issues/6797 + clippy::manual_map, clippy::match_like_matches_macro, clippy::needless_pass_by_value, clippy::too_many_arguments, @@ -38,6 +40,7 @@ clippy::filter_map, clippy::indexing_slicing, clippy::items_after_statements, + clippy::let_underscore_drop, clippy::map_err_ignore, clippy::match_same_arms, clippy::module_name_repetitions, diff --git a/vendor/serde_json/.cargo-checksum.json b/vendor/serde_json/.cargo-checksum.json index 1d27d1bb0c..cf4f72a8cb 100644 --- a/vendor/serde_json/.cargo-checksum.json +++ b/vendor/serde_json/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"87ff9b047f0d0b7cc15561555ada9070402b691a4cbab834bf0b73bc307834e7","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"77e79209b7538caa7210ab8339cae6add51381b6495d01f096d0eefa69d559d5","build.rs":"daedcb68b22aa393d96aa2276e8b84e86c2353a2a3594040e66ed2ff08b2b0d4","src/de.rs":"ce54eef7261e2e8754a3c63bdd206ce982d83bcac8ef91c27b4c4adc501f8fc6","src/error.rs":"33bc78ddf5d792923f36398bfb095dea649b4e082742ad5a86c55580ed132895","src/features_check/error.rs":"d7359f864afbfe105a38abea9f563dc423036ebc4c956a5695a4beef144dc7ec","src/features_check/mod.rs":"2209f8d5c46b50c8a3b8dc22338dcaf0135d192e8b05d2f456cbe6a73104e958","src/io/core.rs":"ebe5bd5d74892fdfb630073a7961beaab18dfa155d6c551d18c2bb0e52947f99","src/io/mod.rs":"fd1ed5080495cab21117f6f7d3c2c9e3687cad0c69a0cd087b08a145a9e672da","src/iter.rs":"d9a6297dcf8cfa8add82d0250bde50ab1b8998c351800d26ec5e6e5b654cc560","src/lexical/algorithm.rs":"e35fb1d0c99cc706b0e3bd6d9fb4db25ecd5743fdba62aa45980637d12420704","src/lexical/bhcomp.rs":"56a36b0c06b962b0c620739fd5201e6ab529ef872582f297ed5ce845db8f1721","src/lexical/bignum.rs":"5fbab729044cbd9b0b63d8e2443a31f958828abfbe03a365a454856dfcf64750","src/lexical/cached.rs":"0e127398691f8042c19cde209e7f4b0161f0f3150342430145929f711e6fdac8","src/lexical/cached_float80.rs":"0f8f74a22cb7d871322a9893bffd0255ca10bf9dffd13afb2462dd3d7f51805f","src/lexical/digit.rs":"a265b9072194a62a67dfc4df3c86d4213097cf3f82280d025e0012a5a262fd9d","src/lexical/errors.rs":"6bc993febceb7dd96ac1c8c5c53b5f5a30297016c0f813ed8ff8d7938d01534d","src/lexical/exponent.rs":"387e945b97dc7ba48a7091c50d228a0dde3a1c4145703d4ab9c31191a91693b0","src/lexical/float.rs":"f3e6bd9abd88d50d82803fa550f8307112c25cccc0259218a382b7c8a1e899f5","src/lexical/large_powers.rs":"34537f5c701afce1ec2a1fd3c14950381b2e27c9ad74f002c91f3708e8da9ca5","src/lexical/large_powers32.rs":"d533037c6141e6671102aee490c9cdeaba81e667ddca781b2b99db2c455e4a1a","src/lexical/large_powers64.rs":"745dd7c0cbe499eec027ef586248881011d9df20c7efab7929c1807b59886ba1","src/lexical/math.rs":"78beaf6d38105b92b8252731d2b0bb8643e974a5b024ec29d649441d1b064863","src/lexical/mod.rs":"4b4c5228779c0f135a4cb018700e3bcd495da48b74421a86f6b8b304acdef924","src/lexical/num.rs":"cfc84a6769586aefec9949284e0e4c22e4480172ba7ccef6b9adeb76fc9cc825","src/lexical/parse.rs":"c2bfac4c70a19938ced61e991f4ec606764887cf12bac1a0978b5b5318a56aac","src/lexical/rounding.rs":"309e9d2cfd9f5253ae767e8cca292aee274bb57898beaf1b6b247674c064d321","src/lexical/shift.rs":"d932e88d13fab783ede722295cb958bf974b4606ea925445cad81d32fdcee900","src/lexical/small_powers.rs":"4608dd218b8002435db7e1ec79d2d0fef5f47ae257b93353326d52ecc80cccda","src/lib.rs":"5f43dc5f878ecb236d557cc9a0092872302c7efc54a26a98e1a26adedcfb905f","src/macros.rs":"c9f23156faec8d5216d72b6a97eebd768efb3f75870a6e2beed824308587b998","src/map.rs":"68364902639d1549f98212839abad54e385bf0764d263b796bebf31c8d8f6f2a","src/number.rs":"722536634c94e165722a40615c941de6998b644343e23432c851bef3785f4109","src/raw.rs":"8a0d29cd885510461fddff0a8d52de117c98e89f77d7cc5167ff062d2f46e6ab","src/read.rs":"842de0abf4a2b01bdd0cf87e259738e0d579d0223a13b6185c170d92ceb475d4","src/ser.rs":"a0e5a9f443cb07be1c2ec9045673c14ee126af2eeff35ab8631ceb64c01074eb","src/value/de.rs":"b0bbc3bdd9dc9c034912a3dce49ad37cb77d5f90a34adffd89d7352f90fb3b1e","src/value/from.rs":"a7e2a4363c539f9d64c44d26fc705bc8e1003cad1876f3a64c7eb1d537df2b2c","src/value/index.rs":"3486361b3b94ebb9cb04cde5da7bc52e37c1cbb8b6258872441d77b42db526b3","src/value/mod.rs":"5fb7a62a4409348c757cb24245420c7f5707aed933a10e19f154986b2808720c","src/value/partial_eq.rs":"4caacbab433a29f51bfbb3ad5c93f6b08da254e8ed174e491b3ebc509747d72a","src/value/ser.rs":"def8b03dd30c61a524cd9ccab6d6d2d5d4d7b615666206efc9600e2b30272854"},"package":"4fceb2595057b6891a4ee808f70054bd2d12f0e97f1cbb78689b59f676df325a"} \ No newline at end of file +{"files":{"Cargo.toml":"7d5d562defcebe7429787948b7f05e6214b6938f7f496e940ea5a5af484504ff","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"77e79209b7538caa7210ab8339cae6add51381b6495d01f096d0eefa69d559d5","build.rs":"daedcb68b22aa393d96aa2276e8b84e86c2353a2a3594040e66ed2ff08b2b0d4","src/de.rs":"1b0fcdae0209479c256f7476aad15fdf687bf1ccf391b3f16feb8be9d1c0f330","src/error.rs":"33bc78ddf5d792923f36398bfb095dea649b4e082742ad5a86c55580ed132895","src/features_check/error.rs":"d7359f864afbfe105a38abea9f563dc423036ebc4c956a5695a4beef144dc7ec","src/features_check/mod.rs":"2209f8d5c46b50c8a3b8dc22338dcaf0135d192e8b05d2f456cbe6a73104e958","src/io/core.rs":"ebe5bd5d74892fdfb630073a7961beaab18dfa155d6c551d18c2bb0e52947f99","src/io/mod.rs":"fd1ed5080495cab21117f6f7d3c2c9e3687cad0c69a0cd087b08a145a9e672da","src/iter.rs":"d9a6297dcf8cfa8add82d0250bde50ab1b8998c351800d26ec5e6e5b654cc560","src/lexical/algorithm.rs":"e35fb1d0c99cc706b0e3bd6d9fb4db25ecd5743fdba62aa45980637d12420704","src/lexical/bhcomp.rs":"56a36b0c06b962b0c620739fd5201e6ab529ef872582f297ed5ce845db8f1721","src/lexical/bignum.rs":"5fbab729044cbd9b0b63d8e2443a31f958828abfbe03a365a454856dfcf64750","src/lexical/cached.rs":"0e127398691f8042c19cde209e7f4b0161f0f3150342430145929f711e6fdac8","src/lexical/cached_float80.rs":"0f8f74a22cb7d871322a9893bffd0255ca10bf9dffd13afb2462dd3d7f51805f","src/lexical/digit.rs":"a265b9072194a62a67dfc4df3c86d4213097cf3f82280d025e0012a5a262fd9d","src/lexical/errors.rs":"6bc993febceb7dd96ac1c8c5c53b5f5a30297016c0f813ed8ff8d7938d01534d","src/lexical/exponent.rs":"387e945b97dc7ba48a7091c50d228a0dde3a1c4145703d4ab9c31191a91693b0","src/lexical/float.rs":"f3e6bd9abd88d50d82803fa550f8307112c25cccc0259218a382b7c8a1e899f5","src/lexical/large_powers.rs":"34537f5c701afce1ec2a1fd3c14950381b2e27c9ad74f002c91f3708e8da9ca5","src/lexical/large_powers32.rs":"d533037c6141e6671102aee490c9cdeaba81e667ddca781b2b99db2c455e4a1a","src/lexical/large_powers64.rs":"745dd7c0cbe499eec027ef586248881011d9df20c7efab7929c1807b59886ba1","src/lexical/math.rs":"78beaf6d38105b92b8252731d2b0bb8643e974a5b024ec29d649441d1b064863","src/lexical/mod.rs":"4b4c5228779c0f135a4cb018700e3bcd495da48b74421a86f6b8b304acdef924","src/lexical/num.rs":"cfc84a6769586aefec9949284e0e4c22e4480172ba7ccef6b9adeb76fc9cc825","src/lexical/parse.rs":"c2bfac4c70a19938ced61e991f4ec606764887cf12bac1a0978b5b5318a56aac","src/lexical/rounding.rs":"309e9d2cfd9f5253ae767e8cca292aee274bb57898beaf1b6b247674c064d321","src/lexical/shift.rs":"d932e88d13fab783ede722295cb958bf974b4606ea925445cad81d32fdcee900","src/lexical/small_powers.rs":"4608dd218b8002435db7e1ec79d2d0fef5f47ae257b93353326d52ecc80cccda","src/lib.rs":"31c37532fbecdf9b28765a5f6996782125590e38bf46e1d6698b9b989e600d71","src/macros.rs":"c9f23156faec8d5216d72b6a97eebd768efb3f75870a6e2beed824308587b998","src/map.rs":"42cac515bca2dc46451f62199ed2a9f8382bf7cfe80c96b4657eab124ba1445f","src/number.rs":"722536634c94e165722a40615c941de6998b644343e23432c851bef3785f4109","src/raw.rs":"8a0d29cd885510461fddff0a8d52de117c98e89f77d7cc5167ff062d2f46e6ab","src/read.rs":"27eb725e426f80a50fd8501f5f56a36f7e860e23c877d8e1c6b2fa189003400b","src/ser.rs":"a0e5a9f443cb07be1c2ec9045673c14ee126af2eeff35ab8631ceb64c01074eb","src/value/de.rs":"b0bbc3bdd9dc9c034912a3dce49ad37cb77d5f90a34adffd89d7352f90fb3b1e","src/value/from.rs":"a7e2a4363c539f9d64c44d26fc705bc8e1003cad1876f3a64c7eb1d537df2b2c","src/value/index.rs":"3486361b3b94ebb9cb04cde5da7bc52e37c1cbb8b6258872441d77b42db526b3","src/value/mod.rs":"0426afb874144d2e63650eacdc9cb7a2ddd30aee6d619bdecf6a553bcf3c13a8","src/value/partial_eq.rs":"4caacbab433a29f51bfbb3ad5c93f6b08da254e8ed174e491b3ebc509747d72a","src/value/ser.rs":"def8b03dd30c61a524cd9ccab6d6d2d5d4d7b615666206efc9600e2b30272854"},"package":"799e97dc9fdae36a5c8b8f2cae9ce2ee9fdce2058c57a93e6099d919fd982f79"} \ No newline at end of file diff --git a/vendor/serde_json/Cargo.toml b/vendor/serde_json/Cargo.toml index 3dc0caf90d..fe399a8ac9 100644 --- a/vendor/serde_json/Cargo.toml +++ b/vendor/serde_json/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "serde_json" -version = "1.0.61" +version = "1.0.64" authors = ["Erick Tryzelaar ", "David Tolnay "] include = ["build.rs", "src/**/*.rs", "README.md", "LICENSE-APACHE", "LICENSE-MIT"] description = "A JSON serialization file format" diff --git a/vendor/serde_json/src/de.rs b/vendor/serde_json/src/de.rs index 4f406bd7c8..15c8236b6f 100644 --- a/vendor/serde_json/src/de.rs +++ b/vendor/serde_json/src/de.rs @@ -41,7 +41,7 @@ where /// Typically it is more convenient to use one of these methods instead: /// /// - Deserializer::from_str - /// - Deserializer::from_bytes + /// - Deserializer::from_slice /// - Deserializer::from_reader pub fn new(read: R) -> Self { Deserializer { @@ -2250,7 +2250,7 @@ where /// Typically it is more convenient to use one of these methods instead: /// /// - Deserializer::from_str(...).into_iter() - /// - Deserializer::from_bytes(...).into_iter() + /// - Deserializer::from_slice(...).into_iter() /// - Deserializer::from_reader(...).into_iter() pub fn new(read: R) -> Self { let offset = read.byte_offset(); @@ -2432,7 +2432,7 @@ where /// location: String, /// } /// -/// fn read_user_from_file>(path: P) -> Result> { +/// fn read_user_from_file>(path: P) -> Result> { /// // Open the file in read-only mode with buffer. /// let file = File::open(path)?; /// let reader = BufReader::new(file); diff --git a/vendor/serde_json/src/lib.rs b/vendor/serde_json/src/lib.rs index fba86e06c0..1d750834aa 100644 --- a/vendor/serde_json/src/lib.rs +++ b/vendor/serde_json/src/lib.rs @@ -300,7 +300,7 @@ //! [macro]: https://docs.serde.rs/serde_json/macro.json.html //! [`serde-json-core`]: https://japaric.github.io/serde-json-core/serde_json_core/ -#![doc(html_root_url = "https://docs.rs/serde_json/1.0.61")] +#![doc(html_root_url = "https://docs.rs/serde_json/1.0.64")] #![deny(clippy::all, clippy::pedantic)] // Ignored clippy lints #![allow( diff --git a/vendor/serde_json/src/map.rs b/vendor/serde_json/src/map.rs index f09d840590..b5644461a2 100644 --- a/vendor/serde_json/src/map.rs +++ b/vendor/serde_json/src/map.rs @@ -542,6 +542,40 @@ impl<'a> Entry<'a> { Entry::Occupied(entry) => entry.into_mut(), } } + + /// Provides in-place mutable access to an occupied entry before any + /// potential inserts into the map. + /// + /// # Examples + /// + /// ``` + /// # use serde_json::json; + /// # + /// let mut map = serde_json::Map::new(); + /// map.entry("serde") + /// .and_modify(|e| *e = json!("rust")) + /// .or_insert(json!("cpp")); + /// + /// assert_eq!(map["serde"], "cpp"); + /// + /// map.entry("serde") + /// .and_modify(|e| *e = json!("rust")) + /// .or_insert(json!("cpp")); + /// + /// assert_eq!(map["serde"], "rust"); + /// ``` + pub fn and_modify(self, f: F) -> Self + where + F: FnOnce(&mut Value), + { + match self { + Entry::Occupied(mut entry) => { + f(entry.get_mut()); + Entry::Occupied(entry) + } + Entry::Vacant(entry) => Entry::Vacant(entry), + } + } } impl<'a> VacantEntry<'a> { diff --git a/vendor/serde_json/src/read.rs b/vendor/serde_json/src/read.rs index 522c0e0114..d247c30542 100644 --- a/vendor/serde_json/src/read.rs +++ b/vendor/serde_json/src/read.rs @@ -377,7 +377,10 @@ where V: Visitor<'de>, { let raw = self.raw_buffer.take().unwrap(); - let raw = String::from_utf8(raw).unwrap(); + let raw = match String::from_utf8(raw) { + Ok(raw) => raw, + Err(_) => return error(self, ErrorCode::InvalidUnicodeCodePoint), + }; visitor.visit_map(OwnedRawDeserializer { raw_value: Some(raw), }) @@ -587,7 +590,10 @@ impl<'a> Read<'a> for SliceRead<'a> { V: Visitor<'a>, { let raw = &self.slice[self.raw_buffering_start_index..self.index]; - let raw = str::from_utf8(raw).unwrap(); + let raw = match str::from_utf8(raw) { + Ok(raw) => raw, + Err(_) => return error(self, ErrorCode::InvalidUnicodeCodePoint), + }; visitor.visit_map(BorrowedRawDeserializer { raw_value: Some(raw), }) diff --git a/vendor/serde_json/src/value/mod.rs b/vendor/serde_json/src/value/mod.rs index 07f4cc27e1..88d2ef6eec 100644 --- a/vendor/serde_json/src/value/mod.rs +++ b/vendor/serde_json/src/value/mod.rs @@ -106,7 +106,7 @@ pub use crate::raw::{to_raw_value, RawValue}; /// Represents any valid JSON value. /// -/// See the `serde_json::value` module documentation for usage examples. +/// See the [`serde_json::value` module documentation](self) for usage examples. #[derive(Clone, Eq, PartialEq)] pub enum Value { /// Represents a JSON null value. @@ -191,27 +191,6 @@ impl Debug for Value { } } -struct WriterFormatter<'a, 'b: 'a> { - inner: &'a mut fmt::Formatter<'b>, -} - -impl<'a, 'b> io::Write for WriterFormatter<'a, 'b> { - fn write(&mut self, buf: &[u8]) -> io::Result { - fn io_error(_: E) -> io::Error { - // Error value does not matter because fmt::Display impl below just - // maps it to fmt::Error - io::Error::new(io::ErrorKind::Other, "fmt error") - } - let s = tri!(str::from_utf8(buf).map_err(io_error)); - tri!(self.inner.write_str(s).map_err(io_error)); - Ok(buf.len()) - } - - fn flush(&mut self) -> io::Result<()> { - Ok(()) - } -} - impl fmt::Display for Value { /// Display a JSON value as a string. /// @@ -238,6 +217,30 @@ impl fmt::Display for Value { /// "{\n \"city\": \"London\",\n \"street\": \"10 Downing Street\"\n}"); /// ``` fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + struct WriterFormatter<'a, 'b: 'a> { + inner: &'a mut fmt::Formatter<'b>, + } + + impl<'a, 'b> io::Write for WriterFormatter<'a, 'b> { + fn write(&mut self, buf: &[u8]) -> io::Result { + // Safety: the serializer below only emits valid utf8 when using + // the default formatter. + let s = unsafe { str::from_utf8_unchecked(buf) }; + tri!(self.inner.write_str(s).map_err(io_error)); + Ok(buf.len()) + } + + fn flush(&mut self) -> io::Result<()> { + Ok(()) + } + } + + fn io_error(_: fmt::Error) -> io::Error { + // Error value does not matter because Display impl just maps it + // back to fmt::Error. + io::Error::new(io::ErrorKind::Other, "fmt error") + } + let alternate = f.alternate(); let mut wr = WriterFormatter { inner: f }; if alternate { diff --git a/vendor/shlex/.cargo-checksum.json b/vendor/shlex/.cargo-checksum.json index 2e41812429..adc7cf482e 100644 --- a/vendor/shlex/.cargo-checksum.json +++ b/vendor/shlex/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"9e05d860f5fba962d28a1a133a455f31cc6cd08c45565e6d682adf0e19f899ba","src/lib.rs":"9bf5a63ce0b189fbbc1e4505e684027db50d4a267e92a5af4e38b4569abd0f54"},"package":"7fdf1b9db47230893d76faad238fd6097fd6d6a9245cd7a4d90dbd639536bbd2"} \ No newline at end of file +{"files":{"Cargo.toml":"edca385717f4ebff8f4f9580f308e7c4ebe12d8766f0ae231fa73bfae854d4d4","LICENSE-APACHE":"553fffcd9b1cb158bc3e9edc35da85ca5c3b3d7d2e61c883ebcfa8a65814b583","LICENSE-MIT":"4455bf75a91154108304cb283e0fea9948c14f13e20d60887cf2552449dea3b1","README.md":"7cfea9ea02a6dac58dd7da5be42fe2be689d0e766e1288c16fc9d2741f6ead85","src/lib.rs":"ae9747e0e2f5dbdd1443590a7344c18a3f1cd0618b44377798e0bc2f43d52f98"},"package":"42a568c8f2cd051a4d283bd6eb0343ac214c1b0f1ac19f93e1175b2dee38c73d"} \ No newline at end of file diff --git a/vendor/shlex/Cargo.toml b/vendor/shlex/Cargo.toml index 0928ee2851..4ac947e488 100644 --- a/vendor/shlex/Cargo.toml +++ b/vendor/shlex/Cargo.toml @@ -1,9 +1,19 @@ +# 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 = "shlex" -version = "0.1.1" -authors = ["comex "] -license = "MIT/Apache-2.0" +version = "1.0.0" +authors = ["comex ", "Fenhl "] +description = "Split a string into shell words, like Python's shlex.\n" +license = "MIT OR Apache-2.0" repository = "https://github.com/comex/rust-shlex" -description = """ -Split a string into shell words, like Python's shlex. -""" diff --git a/vendor/shlex/LICENSE-APACHE b/vendor/shlex/LICENSE-APACHE new file mode 100644 index 0000000000..37465048a6 --- /dev/null +++ b/vendor/shlex/LICENSE-APACHE @@ -0,0 +1,13 @@ +Copyright 2015 Nicholas Allegra (comex). + +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/shlex/LICENSE-MIT b/vendor/shlex/LICENSE-MIT new file mode 100644 index 0000000000..5ec1fe1cd7 --- /dev/null +++ b/vendor/shlex/LICENSE-MIT @@ -0,0 +1,21 @@ +The MIT License (MIT) + +Copyright (c) 2015 Nicholas Allegra (comex). + +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/shlex/README.md b/vendor/shlex/README.md new file mode 100644 index 0000000000..dad0ae1ae7 --- /dev/null +++ b/vendor/shlex/README.md @@ -0,0 +1,25 @@ + +Same idea as (but implementation not directly based on) the Python shlex +module. However, this implementation does not support any of the Python +module's customization because it makes parsing slower and is fairly useless. +You only get the default settings of shlex.split, which mimic the POSIX shell: +http://pubs.opengroup.org/onlinepubs/9699919799/utilities/V3_chap02.html + +This implementation also deviates from the Python version in not treating \r +specially, which I believe is more compliant. + +The algorithms in this crate are oblivious to UTF-8 high bytes, so they iterate +over the bytes directly as a micro-optimization. + +# LICENSE +The source code in this repository 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. + +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. diff --git a/vendor/shlex/src/lib.rs b/vendor/shlex/src/lib.rs index 6ff8c9740e..6e0639589b 100644 --- a/vendor/shlex/src/lib.rs +++ b/vendor/shlex/src/lib.rs @@ -96,17 +96,6 @@ impl<'a> Shlex<'a> { loop { if let Some(ch2) = self.next_char() { match ch2 as char { - '\\' => { - if let Some(ch3) = self.next_char() { - match ch3 as char { - // for single quotes, only these can be escaped - '\'' | '\\' => { result.push(ch3); }, - _ => { result.push('\\' as u8); result.push(ch3); } - } - } else { - return Err(()); - } - }, '\'' => { return Ok(()); }, _ => { result.push(ch2); }, } @@ -181,6 +170,15 @@ pub fn quote(in_str: &str) -> Cow { } } +/// Convenience function that consumes an iterable of words and turns it into a single string, +/// quoting words when necessary. Consecutive words will be separated by a single space. +pub fn join<'a, I: IntoIterator>(words: I) -> String { + words.into_iter() + .map(quote) + .collect::>() + .join(" ") +} + #[cfg(test)] static SPLIT_TEST_ITEMS: &'static [(&'static str, Option<&'static [&'static str]>)] = &[ ("foo$baz", Some(&["foo$baz"])), @@ -191,7 +189,7 @@ static SPLIT_TEST_ITEMS: &'static [(&'static str, Option<&'static [&'static str] ("foo\\\nbar", Some(&["foobar"])), ("\"foo\\\nbar\"", Some(&["foobar"])), ("'baz\\$b'", Some(&["baz\\$b"])), - ("'baz\\\''", Some(&["baz\'"])), + ("'baz\\\''", None), ("\\", None), ("\"\\", None), ("'\\", None), @@ -201,6 +199,8 @@ static SPLIT_TEST_ITEMS: &'static [(&'static str, Option<&'static [&'static str] ("foo #bar", Some(&["foo"])), ("foo#bar", Some(&["foo#bar"])), ("foo\"#bar", None), + ("'\\n'", Some(&["\\n"])), + ("'\\\\n'", Some(&["\\\\n"])), ]; #[test] @@ -227,3 +227,11 @@ fn test_quote() { assert_eq!(quote("\""), "\"\\\"\""); assert_eq!(quote(""), "\"\""); } + +#[test] +fn test_join() { + assert_eq!(join(vec![]), ""); + assert_eq!(join(vec![""]), "\"\""); + assert_eq!(join(vec!["a", "b"]), "a b"); + assert_eq!(join(vec!["foo bar", "baz"]), "\"foo bar\" baz"); +} diff --git a/vendor/snap/.cargo-checksum.json b/vendor/snap/.cargo-checksum.json index ac228fc235..37c963269e 100644 --- a/vendor/snap/.cargo-checksum.json +++ b/vendor/snap/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"COPYING":"7ca1297d23644e30bd489193a82a33f324e5fe33f25df4195649b91b883df967","Cargo.lock":"3c9f949b07c311204734ecba573b32e03821593dac9eec193f69b2204639d10a","Cargo.toml":"1728234f0e2d3cc184e54016115612e70efa9272de59c4af0a9c4d614d69bbc7","README.md":"5be873fd869130fb1d6f55d3c66854b234b08558b3f06903482717df086bc63c","build.rs":"afae7dd3c45a9a46bcce096e9e0aa9e36ade171e8fd00309969478025b82cac1","data/COPYING":"c355b53211bfbbefc0ec641ee43a2fa1ec926966f1276698b4b9125d73c70b18","data/Mark.Twain-Tom.Sawyer.txt":"bd8df876d2a05017bb302f506883a37817d256f16f2205a932399276e08a81af","data/Mark.Twain-Tom.Sawyer.txt.rawsnappy":"7f1f5878f128aec6140fb135f7ed7e2c29575c7eb5c44431ffc65b22f7a19738","data/alice29.txt":"7467306ee0feed4971260f3c87421154a05be571d944e9cb021a5713700c38f0","data/asyoulik.txt":"eaa3526fe53859f34ecdf255712f9ecf0b2c903451d4755b2edaa2e2599cb0fc","data/baddata1.snappy":"ca84adbcd5b4b784c3405fcdd4fa88f88a6614f2d5e5d4a527838785f1806623","data/baddata2.snappy":"06f0ca34f0de885d6a849e1c8df95391d4494bf430d3784ea2167113d6ca8947","data/baddata3.snappy":"2f60f8c9b5f3b9b0e3b4ff9aef983946552cdd1fdecdfad122292882894163bd","data/fireworks.jpeg":"93b986ce7d7e361f0d3840f9d531b5f40fb6ca8c14d6d74364150e255f126512","data/geo.protodata":"7c2875cd6d06c954240ba644618d1e1f2a167e4541731f019de5b4c1f8080f24","data/html":"5912445a6d50df1079f022d7e01fa615f5d128d53bad88acbf4f49e62a7ea759","data/html_x_4":"ce3b0ceece9a0c0f66a352fd65b87a8e06357b136e99a2a85fcb3b0689ff6671","data/kppkn.gtb":"1df7e44e4ec9bad952e7716fbdba0a2208665091866ded43407d03ed9ce23c24","data/lcet10.txt":"5314ba1dbb03f471df88bec6cd120a938ef60d0fd3511c5c1dce61bf7463245f","data/paper-100k.pdf":"60f73a051b7ca35bfec44734b2eed7736cb5c0b7f728beb7b97ade6c5e44849b","data/plrabn12.txt":"07e2e0b461af78c7c647cb53dab39de560198e16f799b4516eccf0fbd69f764c","data/urls.10K":"0319ce7fe1f51b14eace3de879fe7da15418d1525d3176c2b26c5985943a3cad","examples/compress-escaped.rs":"cef1933dbc5d9b496587c4c1a596f26e326e73799ab9a0ede1c3d76b00676090","examples/compress.rs":"34bad60450e768ed4ac27edf8622abc4d918b17e57b8c286030203e2b3590c24","examples/decompress.rs":"87aa11875ec98f253c8b48ce3a202ac3412063ce2f64387074194151c11fff5e","rustfmt.toml":"1ca600239a27401c4a43f363cf3f38183a212affc1f31bff3ae93234bbaec228","src/bytes.rs":"2eb9783acdf949ef96a9031d2bd43ead65db50a41a60ad98dc117cd61655c7c4","src/compress.rs":"e6f3160be400c2a4869d71210a2558ba8b438b835b632a12b7ff487660db093f","src/crc32.rs":"9f3858bef802640c595705c496f462d0343c4adcff9bdf333a43306fb67db7ae","src/crc32_table.rs":"e999470ca10bb7914887747be838d05d0f5059ae99a8b8c57b0be7de3931e72a","src/decompress.rs":"05c4d0c0922b1ad084cf32f224722f2fe9d63128d6a4da0c44333742d681b80f","src/error.rs":"683e609ae19f0acacfccb5ce7bcd8bd107a0b6639cdd2308a7768a632a993f4e","src/frame.rs":"4f69a9526a5dd0367631fc7a764bea877f7f0b4c33ee30d4ece62913c42ea48d","src/lib.rs":"4534bc8b5bf0f83dc1852629362d2d392397f1b1fc4f8bdb8f638bfd3cc89b22","src/raw.rs":"a7048da3a4b76b75e4b3d071ee9959dbf12c5b3a36dabb2f7878513507c80cb9","src/read.rs":"66ceb455e451d14964eff77743e8003d58de16ec90c9ba37e03fda51da7b94c9","src/tag.rs":"9ac94977c5ab3ea687b9441ea3c615f64a23eac11a4bade19cfa3be5968cb718","src/varint.rs":"6d63fca6323c91f193628a41b6e75f5b3443777467e6a5665907bbbba549e6c7","src/write.rs":"086edd9fb1442b6bc8bf8c6a80023eccc4ca627de57ccc62279691c9ff7f0786"},"package":"da73c8f77aebc0e40c300b93f0a5f1bece7a248a36eee287d4e095f35c7b7d6e"} \ No newline at end of file +{"files":{"COPYING":"7ca1297d23644e30bd489193a82a33f324e5fe33f25df4195649b91b883df967","Cargo.lock":"7e56b3ff59a53f6ac95d9bf47692779b5644a9f779f4e1601843ecb502e0e1ce","Cargo.toml":"f62ed430751f229df87cfe647cdf1a0f65133ae5b71e2dd445bb685cabcef886","README.md":"7519de7d11a582319372ec90bc12c41ed1bc4348a3d8ed10a07fc940c9810549","build.rs":"afae7dd3c45a9a46bcce096e9e0aa9e36ade171e8fd00309969478025b82cac1","examples/compress-escaped.rs":"cef1933dbc5d9b496587c4c1a596f26e326e73799ab9a0ede1c3d76b00676090","examples/compress.rs":"34bad60450e768ed4ac27edf8622abc4d918b17e57b8c286030203e2b3590c24","examples/decompress.rs":"87aa11875ec98f253c8b48ce3a202ac3412063ce2f64387074194151c11fff5e","rustfmt.toml":"1ca600239a27401c4a43f363cf3f38183a212affc1f31bff3ae93234bbaec228","src/bytes.rs":"2eb9783acdf949ef96a9031d2bd43ead65db50a41a60ad98dc117cd61655c7c4","src/compress.rs":"e6f3160be400c2a4869d71210a2558ba8b438b835b632a12b7ff487660db093f","src/crc32.rs":"9f3858bef802640c595705c496f462d0343c4adcff9bdf333a43306fb67db7ae","src/crc32_table.rs":"e999470ca10bb7914887747be838d05d0f5059ae99a8b8c57b0be7de3931e72a","src/decompress.rs":"05c4d0c0922b1ad084cf32f224722f2fe9d63128d6a4da0c44333742d681b80f","src/error.rs":"ba50d0652e50198d6ab42d23788f726d083ba69d8b2459a10a00cc83755dbbd0","src/frame.rs":"4f69a9526a5dd0367631fc7a764bea877f7f0b4c33ee30d4ece62913c42ea48d","src/lib.rs":"1f4dc31068bc60a327ecd632993eaa40feb0b2198affdb1a00a7a9538b23b527","src/raw.rs":"a7048da3a4b76b75e4b3d071ee9959dbf12c5b3a36dabb2f7878513507c80cb9","src/read.rs":"7c3cea9716d83d66cde90c57a1a3ba8f49787a189a84bfbf008944004ce485db","src/tag.rs":"9ac94977c5ab3ea687b9441ea3c615f64a23eac11a4bade19cfa3be5968cb718","src/varint.rs":"6d63fca6323c91f193628a41b6e75f5b3443777467e6a5665907bbbba549e6c7","src/write.rs":"086edd9fb1442b6bc8bf8c6a80023eccc4ca627de57ccc62279691c9ff7f0786"},"package":"dc725476a1398f0480d56cd0ad381f6f32acf2642704456f8f59a35df464b59a"} \ No newline at end of file diff --git a/vendor/snap/Cargo.lock b/vendor/snap/Cargo.lock index 6eb826d6e9..d7f7d7920c 100644 --- a/vendor/snap/Cargo.lock +++ b/vendor/snap/Cargo.lock @@ -2,13 +2,13 @@ # It is not intended for manual editing. [[package]] name = "doc-comment" -version = "0.3.1" +version = "0.3.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "923dea538cea0aa3025e8685b20d6ee21ef99c4f77e954a30febbaac5ec73a97" +checksum = "fea41bba32d969b513997752735605054bc0dfa92b4c56bf1189f2e174be7a10" [[package]] name = "snap" -version = "1.0.1" +version = "1.0.4" dependencies = [ "doc-comment", ] diff --git a/vendor/snap/Cargo.toml b/vendor/snap/Cargo.toml index 4cdc45a344..61c1b9115c 100644 --- a/vendor/snap/Cargo.toml +++ b/vendor/snap/Cargo.toml @@ -13,8 +13,9 @@ [package] edition = "2018" name = "snap" -version = "1.0.1" +version = "1.0.4" authors = ["Andrew Gallant "] +exclude = ["data/*"] description = "A pure Rust implementation of the Snappy compression algorithm. Includes\nstreaming compression and decompression.\n" homepage = "https://github.com/BurntSushi/rust-snappy" documentation = "https://docs.rs/snap" diff --git a/vendor/snap/README.md b/vendor/snap/README.md index af06b2055b..c87a400baa 100644 --- a/vendor/snap/README.md +++ b/vendor/snap/README.md @@ -1,7 +1,7 @@ snap ==== A pure Rust implementation of the -[Snappy compression algorithm](http://google.github.io/snappy/). +[Snappy compression algorithm](https://google.github.io/snappy/). Includes streaming compression and decompression using the Snappy frame format. This implementation is ported from both the [reference C++ implementation](https://github.com/google/snappy) @@ -9,7 +9,7 @@ and the [Go implementation](https://github.com/golang/snappy). [![Build status](https://github.com/BurntSushi/rust-snappy/workflows/ci/badge.svg)](https://github.com/BurntSushi/rust-snappy/actions) -[![](http://meritbadge.herokuapp.com/snap)](https://crates.io/crates/snap) +[![](https://meritbadge.herokuapp.com/snap)](https://crates.io/crates/snap) Licensed under the BSD 3-Clause. diff --git a/vendor/snap/data/COPYING b/vendor/snap/data/COPYING deleted file mode 100644 index ae69a7b309..0000000000 --- a/vendor/snap/data/COPYING +++ /dev/null @@ -1,23 +0,0 @@ -Some of the benchmark data in in this directory is licensed thusly: - - - fireworks.jpeg is Copyright 2013 Steinar H. Gunderson, and - is licensed under the Creative Commons Attribution 3.0 license - (CC-BY-3.0). See https://creativecommons.org/licenses/by/3.0/ - for more information. - - - kppkn.gtb is taken from the Gaviota chess tablebase set, and - is licensed under the MIT License. See - https://sites.google.com/site/gaviotachessengine/Home/endgame-tablebases-1 - for more information. - - - paper-100k.pdf is an excerpt (bytes 92160 to 194560) from the paper - “Combinatorial Modeling of Chromatin Features Quantitatively Predicts DNA - Replication Timing in _Drosophila_” by Federico Comoglio and Renato Paro, - which is licensed under the CC-BY license. See - http://www.ploscompbiol.org/static/license for more ifnormation. - - - alice29.txt, asyoulik.txt, plrabn12.txt and lcet10.txt are from Project - Gutenberg. The first three have expired copyrights and are in the public - domain; the latter does not have expired copyright, but is still in the - public domain according to the license information - (http://www.gutenberg.org/ebooks/53). diff --git a/vendor/snap/data/Mark.Twain-Tom.Sawyer.txt b/vendor/snap/data/Mark.Twain-Tom.Sawyer.txt deleted file mode 100644 index 86a18750bf..0000000000 --- a/vendor/snap/data/Mark.Twain-Tom.Sawyer.txt +++ /dev/null @@ -1,396 +0,0 @@ -Produced by David Widger. The previous edition was updated by Jose -Menendez. - - - - - - THE ADVENTURES OF TOM SAWYER - BY - MARK TWAIN - (Samuel Langhorne Clemens) - - - - - P R E F A C E - -MOST of the adventures recorded in this book really occurred; one or -two were experiences of my own, the rest those of boys who were -schoolmates of mine. Huck Finn is drawn from life; Tom Sawyer also, but -not from an individual--he is a combination of the characteristics of -three boys whom I knew, and therefore belongs to the composite order of -architecture. - -The odd superstitions touched upon were all prevalent among children -and slaves in the West at the period of this story--that is to say, -thirty or forty years ago. - -Although my book is intended mainly for the entertainment of boys and -girls, I hope it will not be shunned by men and women on that account, -for part of my plan has been to try to pleasantly remind adults of what -they once were themselves, and of how they felt and thought and talked, -and what queer enterprises they sometimes engaged in. - - THE AUTHOR. - -HARTFORD, 1876. - - - - T O M S A W Y E R - - - -CHAPTER I - -"TOM!" - -No answer. - -"TOM!" - -No answer. - -"What's gone with that boy, I wonder? You TOM!" - -No answer. - -The old lady pulled her spectacles down and looked over them about the -room; then she put them up and looked out under them. She seldom or -never looked THROUGH them for so small a thing as a boy; they were her -state pair, the pride of her heart, and were built for "style," not -service--she could have seen through a pair of stove-lids just as well. -She looked perplexed for a moment, and then said, not fiercely, but -still loud enough for the furniture to hear: - -"Well, I lay if I get hold of you I'll--" - -She did not finish, for by this time she was bending down and punching -under the bed with the broom, and so she needed breath to punctuate the -punches with. She resurrected nothing but the cat. - -"I never did see the beat of that boy!" - -She went to the open door and stood in it and looked out among the -tomato vines and "jimpson" weeds that constituted the garden. No Tom. -So she lifted up her voice at an angle calculated for distance and -shouted: - -"Y-o-u-u TOM!" - -There was a slight noise behind her and she turned just in time to -seize a small boy by the slack of his roundabout and arrest his flight. - -"There! I might 'a' thought of that closet. What you been doing in -there?" - -"Nothing." - -"Nothing! Look at your hands. And look at your mouth. What IS that -truck?" - -"I don't know, aunt." - -"Well, I know. It's jam--that's what it is. Forty times I've said if -you didn't let that jam alone I'd skin you. Hand me that switch." - -The switch hovered in the air--the peril was desperate-- - -"My! Look behind you, aunt!" - -The old lady whirled round, and snatched her skirts out of danger. The -lad fled on the instant, scrambled up the high board-fence, and -disappeared over it. - -His aunt Polly stood surprised a moment, and then broke into a gentle -laugh. - -"Hang the boy, can't I never learn anything? Ain't he played me tricks -enough like that for me to be looking out for him by this time? But old -fools is the biggest fools there is. Can't learn an old dog new tricks, -as the saying is. But my goodness, he never plays them alike, two days, -and how is a body to know what's coming? He 'pears to know just how -long he can torment me before I get my dander up, and he knows if he -can make out to put me off for a minute or make me laugh, it's all down -again and I can't hit him a lick. I ain't doing my duty by that boy, -and that's the Lord's truth, goodness knows. Spare the rod and spile -the child, as the Good Book says. I'm a laying up sin and suffering for -us both, I know. He's full of the Old Scratch, but laws-a-me! he's my -own dead sister's boy, poor thing, and I ain't got the heart to lash -him, somehow. Every time I let him off, my conscience does hurt me so, -and every time I hit him my old heart most breaks. Well-a-well, man -that is born of woman is of few days and full of trouble, as the -Scripture says, and I reckon it's so. He'll play hookey this evening, * -and [* Southwestern for "afternoon"] I'll just be obleeged to make him -work, to-morrow, to punish him. It's mighty hard to make him work -Saturdays, when all the boys is having holiday, but he hates work more -than he hates anything else, and I've GOT to do some of my duty by him, -or I'll be the ruination of the child." - -Tom did play hookey, and he had a very good time. He got back home -barely in season to help Jim, the small colored boy, saw next-day's -wood and split the kindlings before supper--at least he was there in -time to tell his adventures to Jim while Jim did three-fourths of the -work. Tom's younger brother (or rather half-brother) Sid was already -through with his part of the work (picking up chips), for he was a -quiet boy, and had no adventurous, troublesome ways. - -While Tom was eating his supper, and stealing sugar as opportunity -offered, Aunt Polly asked him questions that were full of guile, and -very deep--for she wanted to trap him into damaging revealments. Like -many other simple-hearted souls, it was her pet vanity to believe she -was endowed with a talent for dark and mysterious diplomacy, and she -loved to contemplate her most transparent devices as marvels of low -cunning. Said she: - -"Tom, it was middling warm in school, warn't it?" - -"Yes'm." - -"Powerful warm, warn't it?" - -"Yes'm." - -"Didn't you want to go in a-swimming, Tom?" - -A bit of a scare shot through Tom--a touch of uncomfortable suspicion. -He searched Aunt Polly's face, but it told him nothing. So he said: - -"No'm--well, not very much." - -The old lady reached out her hand and felt Tom's shirt, and said: - -"But you ain't too warm now, though." And it flattered her to reflect -that she had discovered that the shirt was dry without anybody knowing -that that was what she had in her mind. But in spite of her, Tom knew -where the wind lay, now. So he forestalled what might be the next move: - -"Some of us pumped on our heads--mine's damp yet. See?" - -Aunt Polly was vexed to think she had overlooked that bit of -circumstantial evidence, and missed a trick. Then she had a new -inspiration: - -"Tom, you didn't have to undo your shirt collar where I sewed it, to -pump on your head, did you? Unbutton your jacket!" - -The trouble vanished out of Tom's face. He opened his jacket. His -shirt collar was securely sewed. - -"Bother! Well, go 'long with you. I'd made sure you'd played hookey -and been a-swimming. But I forgive ye, Tom. I reckon you're a kind of a -singed cat, as the saying is--better'n you look. THIS time." - -She was half sorry her sagacity had miscarried, and half glad that Tom -had stumbled into obedient conduct for once. - -But Sidney said: - -"Well, now, if I didn't think you sewed his collar with white thread, -but it's black." - -"Why, I did sew it with white! Tom!" - -But Tom did not wait for the rest. As he went out at the door he said: - -"Siddy, I'll lick you for that." - -In a safe place Tom examined two large needles which were thrust into -the lapels of his jacket, and had thread bound about them--one needle -carried white thread and the other black. He said: - -"She'd never noticed if it hadn't been for Sid. Confound it! sometimes -she sews it with white, and sometimes she sews it with black. I wish to -geeminy she'd stick to one or t'other--I can't keep the run of 'em. But -I bet you I'll lam Sid for that. I'll learn him!" - -He was not the Model Boy of the village. He knew the model boy very -well though--and loathed him. - -Within two minutes, or even less, he had forgotten all his troubles. -Not because his troubles were one whit less heavy and bitter to him -than a man's are to a man, but because a new and powerful interest bore -them down and drove them out of his mind for the time--just as men's -misfortunes are forgotten in the excitement of new enterprises. This -new interest was a valued novelty in whistling, which he had just -acquired from a negro, and he was suffering to practise it undisturbed. -It consisted in a peculiar bird-like turn, a sort of liquid warble, -produced by touching the tongue to the roof of the mouth at short -intervals in the midst of the music--the reader probably remembers how -to do it, if he has ever been a boy. Diligence and attention soon gave -him the knack of it, and he strode down the street with his mouth full -of harmony and his soul full of gratitude. He felt much as an -astronomer feels who has discovered a new planet--no doubt, as far as -strong, deep, unalloyed pleasure is concerned, the advantage was with -the boy, not the astronomer. - -The summer evenings were long. It was not dark, yet. Presently Tom -checked his whistle. A stranger was before him--a boy a shade larger -than himself. A new-comer of any age or either sex was an impressive -curiosity in the poor little shabby village of St. Petersburg. This boy -was well dressed, too--well dressed on a week-day. This was simply -astounding. His cap was a dainty thing, his close-buttoned blue cloth -roundabout was new and natty, and so were his pantaloons. He had shoes -on--and it was only Friday. He even wore a necktie, a bright bit of -ribbon. He had a citified air about him that ate into Tom's vitals. The -more Tom stared at the splendid marvel, the higher he turned up his -nose at his finery and the shabbier and shabbier his own outfit seemed -to him to grow. Neither boy spoke. If one moved, the other moved--but -only sidewise, in a circle; they kept face to face and eye to eye all -the time. Finally Tom said: - -"I can lick you!" - -"I'd like to see you try it." - -"Well, I can do it." - -"No you can't, either." - -"Yes I can." - -"No you can't." - -"I can." - -"You can't." - -"Can!" - -"Can't!" - -An uncomfortable pause. Then Tom said: - -"What's your name?" - -"'Tisn't any of your business, maybe." - -"Well I 'low I'll MAKE it my business." - -"Well why don't you?" - -"If you say much, I will." - -"Much--much--MUCH. There now." - -"Oh, you think you're mighty smart, DON'T you? I could lick you with -one hand tied behind me, if I wanted to." - -"Well why don't you DO it? You SAY you can do it." - -"Well I WILL, if you fool with me." - -"Oh yes--I've seen whole families in the same fix." - -"Smarty! You think you're SOME, now, DON'T you? Oh, what a hat!" - -"You can lump that hat if you don't like it. I dare you to knock it -off--and anybody that'll take a dare will suck eggs." - -"You're a liar!" - -"You're another." - -"You're a fighting liar and dasn't take it up." - -"Aw--take a walk!" - -"Say--if you give me much more of your sass I'll take and bounce a -rock off'n your head." - -"Oh, of COURSE you will." - -"Well I WILL." - -"Well why don't you DO it then? What do you keep SAYING you will for? -Why don't you DO it? It's because you're afraid." - -"I AIN'T afraid." - -"You are." - -"I ain't." - -"You are." - -Another pause, and more eying and sidling around each other. Presently -they were shoulder to shoulder. Tom said: - -"Get away from here!" - -"Go away yourself!" - -"I won't." - -"I won't either." - -So they stood, each with a foot placed at an angle as a brace, and -both shoving with might and main, and glowering at each other with -hate. But neither could get an advantage. After struggling till both -were hot and flushed, each relaxed his strain with watchful caution, -and Tom said: - -"You're a coward and a pup. I'll tell my big brother on you, and he -can thrash you with his little finger, and I'll make him do it, too." - -"What do I care for your big brother? I've got a brother that's bigger -than he is--and what's more, he can throw him over that fence, too." -[Both brothers were imaginary.] - -"That's a lie." - -"YOUR saying so don't make it so." - -Tom drew a line in the dust with his big toe, and said: - -"I dare you to step over that, and I'll lick you till you can't stand -up. Anybody that'll take a dare will steal sheep." - -The new boy stepped over promptly, and said: - -"Now you said you'd do it, now let's see you do it." - -"Don't you crowd me now; you better look out." - -"Well, you SAID you'd do it--why don't you do it?" - -"By jingo! for two cents I WILL do it." - -The new boy took two broad coppers out of his pocket and held them out -with derision. Tom struck them to the ground. In an instant both boys -were rolling and tumbling in the dirt, gripped together like cats; and -for the space of a minute they tugged and tore at each other's hair and -clothes, punched and scratched each other's nose, and covered -themselves with dust and glory. Presently the confusion took form, and -through the fog of battle Tom appeared, seated astride the new boy, and -pounding him with his fists. "Holler 'nuff!" said he. - -The boy only struggled to free himself. He was crying--mainly from rage. - -"Holler 'nuff!"--and the pounding went on. - -At last the stranger got out a smothered "'Nuff!" and Tom let him up -and said: - -"Now that'll learn you. Better look out who you're fooling with next -time." - -The new boy went off brushing the dust from his clothes, sobbing, -snuffling, and occasionally looking back and shaking his head and -threatening what he would do to Tom the "next time he caught him out." -To which Tom responded with jeers, and started off in high feather, and -as soon as his back was turned the new boy snatched up a stone, threw -it and hit him between the shoulders and then turned tail and ran like -an antelope. Tom chased the traitor home, and thus found out where he -lived. He then held a position at the gate for some time, daring the -enemy to come outside, but the enemy only made faces at him through the -window and declined. At last the enemy's mother appeared, and called -Tom a bad, vicious, vulgar child, and ordered him away. So he went -away; but he said he "'lowed" to "lay" for that boy. - -He got home pretty late that night, and when he climbed cautiously in -at the window, he uncovered an ambuscade, in the person of his aunt; -and when she saw the state his clothes were in her resolution to turn -his Saturday holiday into captivity at hard labor became adamantine in -its firmness. diff --git a/vendor/snap/data/Mark.Twain-Tom.Sawyer.txt.rawsnappy b/vendor/snap/data/Mark.Twain-Tom.Sawyer.txt.rawsnappy deleted file mode 100644 index 9c56d985888e48a9967e187523f0e3326330aeca..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9871 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

    3ZRBxkF?%H#_f~x|{{V*%h1A?S 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 AYXATM diff --git a/vendor/snap/data/geo.protodata b/vendor/snap/data/geo.protodata deleted file mode 100644 index c4e3e0d8aeb1732a6e773f3382e8a3d0f9c668e8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 118588 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�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 IhT`V`0gKK@!2kdN diff --git a/vendor/snap/data/html b/vendor/snap/data/html deleted file mode 100644 index ef768ccde9..0000000000 --- a/vendor/snap/data/html +++ /dev/null @@ -1 +0,0 @@ - content: @ 1099872000000000: 'HTTP/1.1 200 OK\r\nX-Google-Crawl-Date: Mon, 08 Nov 2004 17:22:09 GMT\r\nContent-Type: text/html\r\nConnection: close\r\nX-Powered-By: PHP/4.3.8\r\nServer: Apache/1.3.31 (Unix) mod_gzip/1.3.19.1a PHP/4.3.8\r\nDate: Mon, 08 Nov 2004 17:19:07 GMT\r\n\r\n \r\n\r\n\r\n\r\n\r\n\nMicro Achat : Ordinateurs, PDA - Toute l\'informatique avec 01Informatique, L\'Ordinateur Individuel, Micro Hebdo, D\351cision Informatique et 01R\351seaux\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n

    Derni\350re mise \340 jour de cette page : lundi 8 novembre 2004  |  16:45
    \r\n \r\n\r\n\r\n\r\n\t\r\n\r\n\t\t\r\n\r\n\t\r\n\r\n\t\r\n\t\t\r\n\r\n\r\n\t\t\r\n\r\n\t\t\r\n\t\r\n\t\r\n\t\t\t

    \r\n\r\n\r\n\r\n


    \r\n\r\n\r\n\r\n
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \"\"
    Imagerie 
    \"\"\n\t\t\t\t\t\t\t\tLG L1720B\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    332.89 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Ordinateurs 
    \"\"\n\t\t\t\t\t\t\t\tAcer Veriton 7600G\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    705 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Ordinateurs 
    \"\"\n\t\t\t\t\t\t\t\tShuttle SN95G5\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    375 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Composants 
    \"\"\n\t\t\t\t\t\t\t\tAsus A7N8X-E Deluxe\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    91.99 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Composants 
    \"\"\n\t\t\t\t\t\t\t\tThermalright SP-94\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    49 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \"\"
    1 \">\"PC Look
    2 \">\"Atelier Informatique
    3 \">\"Zanax Multim\351dia
    4 \">\"MISTEROOPS
    5 \">\"168 Golden Avenue
    6 \">\"microchoix
    7 \">\"e-Soph
    8 \">\"PC Price Club
    9 \">\"PC 77
    10 \">\"Web In Informatique
    \n\t\t\t\t
    \n\t\t\t\t
    \r\n \r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t
    \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
    \r\n\r\n\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n

    \r\n\t\t\t

    \r\n\t\t\t

    \r\n\t\t\t
    \r\n\t\t\t
    \r\n\r\n\r\n \r\n \r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    CD et DVD bient\364t insensibles aux rayures
    OpenOffice gagne son service
    La messagerie en cinq minutes selon Ipswitch
    > toutes les news


    \r\n\t\t
    \r\n \r\n\r\n\r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    Recevez chaque jour l\'actualit\351 des produits et des promos
    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t


    \r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t
    \r\n\r\n\r\n\r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t \r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    Entreprise
    \r\n\t\t\t\tQuand le billet papier s\'envole vers la d\351mat\351rialisation


    Trucs et astuces
    \r\n\t\t\t\tD\351pannez Windows XP


    Conso
    \r\n\t\t\t\tVos photos sur papier imprimante ou labo ?


    Produits & Tests
    \r\n\t\t\t\t5 programmes d\222encodage vid\351o gratuits


    \r\n\t\t
    \r\n\r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n
    \r\n
    \r\n\t\t\r\n\t\t

    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\r\n\t\r\n\r\n\r\n\r\n\t\t\t\r\n\r\n\r\n\r\n\t\t\t\t\r\n
    \r\n
    \r\nPortable
    \r\nUn nouvel ultra portable r\351alis\351 par Nec
    \r\n\r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \t\r\nLe Versa S940 a un format r\351duit, mais ses performances sont \340 la hauteur.
    \r\n\340 partir de 1663 \200\r\n
    \r\n
    \r\nPortable
    \r\nAsus pr\351sente trois petits nouveaux dans la gamme A3N
    \r\n\r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \t\r\nCes trois portables Centrino int\350grent, entre autres, une webcam et un contr\364leur Wi-Fi.
    \r\n\340 partir de 1346 \200\r\n
    \r\n
    \r\n\t\r\n\t\r\n\t\r\n \t\r\n\t\r\n\t\r\n \t\r\n\t\r\n\t
    \r\n\t\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    BON PLAN
    \r\n
    \r\n
    \r\nLes derni\350res technologies INTEL dans un nouveau design pour ce shuttle haut de gamme, pour un prix abordable.
    \r\n

    \r\n
    \r\n\340 partir de
    \r\n
    415 \200
    \r\n
    \r\n
    \r\n
    publicit\351
    \r\n
    \r\n\t\r\n\r\n
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    \r\n\t\t\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\tDesktops
    \r\n\t\t\t\tPortables
    \r\n\t\t\t\tMini-PC
    \r\n\t\t\t\tPda / Tablets-PC
    \r\n\t\t\t\tApple
    \r\n\t\t\t\tGPS
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t


    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n \r\n\r\n\r\n \r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n

    \r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\t\t\r\n\t\r\n\t\r\n\t\t\t\t\r\n\t\r\n\t\r\n\t\t\t\t\r\n\t\r\n\t\r\n\t\t\t\t\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\tPortable Toshiba consacre deux gammes de machines au multim\351dia
    \r\n\tEquipement haut de gamme et Windows Media Center sont au menu de ces portables \340 vocation multim\351dia.

    \r\n\tOrdinateur Arriv\351e d\'un Power Mac G5 d\'entr\351e de gamme
    \r\n\tLa firme \340 la pomme propose une station de travail \351volutive et relativement abordable.

    \r\n\tPC Alienware propose deux machines au look \351trange
    \r\n\tAurora et Area 51 sont deux gammes d\'ordinateurs enti\350rement configurables.

    \r\n\tPortable Trois nouveaux iBook G4 chez Apple
    \r\n\tChez Apple, les portables gagnent en vitesse et communiquent sans fil en standard.

    \r\n\t\t\t\t> toutes les news\r\n\t\t\t
    \r\n
    \r\n
    \r\n
    \r\n\r\n\r\n\r\n\r\n

    \r\n\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \tAsus A3N15-C Pro
    \r\n Voici un portable autonome et puissant gr\342ce \340 la technologie Intel Centrino.
    \r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\t1170 \200
    \r\n
    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \tSoltek EQ3702A Miroir
    \r\n Ce mini PC est une solution int\351ressante pour les utilisateurs poss\351dant d\351j\340 un \351cran.
    \r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\t559 \200
    \r\n
    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \tIBM ThinkPad R51
    \r\n Voici un portable complet et pourtant relativement l\351ger.
    \r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\t1299 \200
    \r\n
    \r\n\t\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t> toutes les promos\r\n\t\t
    \r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n

    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\r\n

    \r\n
    \r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t
    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t
    \r\n\t\t\t\r\n\t\t\t\t\r\n\r\n\r\n\r\n \r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t
    \r\n\t\r\n\r\n
    \r\n\r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \t\r\n
    \r\n
    \r\nLes graveurs de DVD
    \r\nQuel graveur choisir ? Quel type de format ? Quelle vitesse ? Double couche ou simple couche ? Voici tout ce qu\'il faut savoir pour faire le bon choix.
    \r\n\t\t\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t
    \r\n
    \r\n\r\n\r\n\t\r\n\t\t\r\n\r\n\r\n \t\r\n
    \r\n\t\t
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t
    \r\n\t\t\t\t

    \r\n\t\t\t\tChoisir une r\351gion
    \r\n\r\n
    Un d\351partement
    \r\n\r\n
    \r\n
    Un arrondissement
    \r\n\r\n
    \r\n
    \r\n\t\t\t\tRecherche directe
    \r\n\t\t\t\trechercher une ville
    et/ou une boutique
    \r\n\t\t\t\t

    \r\n\t\t\t\t \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
    Recherche avanc\351e
    \r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t
    Bureautique
    \r\n\t\t\t\tTraducteur, organiseur...

    \r\n\t\t\t\t

    Multim\351dia
    \r\n\t\t\t\tPhoto, audio, vid\351o...

    \r\n\t\t\t\t

    Utilitaires
    \r\n\t\t\t\tAntivirus, pilotes, gravure...

    \r\n\t\t\t\t

    Personnaliser son PC
    \r\n\t\t\t\tEcrans de veille, th\350mes...

    \r\n\t\t\t\t

    D\351veloppement
    \r\n\t\t\t\tCr\351ation de logiciels, BDD...

    \r\n\t\t\t\t

    Jeux
    \r\n\t\t\t\tAction, simulation...

    \r\n\t\t\t\t

    Internet
    \r\n\t\t\t\tUtilitaires, email, FTP...

    \r\n\t\t\t\t

    Loisirs
    \r\n\t\t\t\tHumour, culture...

    \r\n\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\t\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t\t\r\n\t\t\t
    \r\n\t\t\t
    \r\n\r\n\t\t

    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\nMicro Achat : Ordinateurs, PDA - Toute l\'informatique avec 01Informatique, L\'Ordinateur Individuel, Micro Hebdo, D\351cision Informatique et 01R\351seaux\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n

    Derni\350re mise \340 jour de cette page : lundi 8 novembre 2004  |  16:45
    \r\n \r\n\r\n\r\n\r\n\t\r\n\r\n\t\t\r\n\r\n\t\r\n\r\n\t\r\n\t\t\r\n\r\n\r\n\t\t\r\n\r\n\t\t\r\n\t\r\n\t\r\n\t\t\t

    \r\n\r\n\r\n\r\n


    \r\n\r\n\r\n\r\n
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \"\"
    Imagerie 
    \"\"\n\t\t\t\t\t\t\t\tLG L1720B\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    332.89 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Ordinateurs 
    \"\"\n\t\t\t\t\t\t\t\tAcer Veriton 7600G\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    705 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Ordinateurs 
    \"\"\n\t\t\t\t\t\t\t\tShuttle SN95G5\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    375 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Composants 
    \"\"\n\t\t\t\t\t\t\t\tAsus A7N8X-E Deluxe\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    91.99 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Composants 
    \"\"\n\t\t\t\t\t\t\t\tThermalright SP-94\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    49 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \"\"
    1 \">\"PC Look
    2 \">\"Atelier Informatique
    3 \">\"Zanax Multim\351dia
    4 \">\"MISTEROOPS
    5 \">\"168 Golden Avenue
    6 \">\"microchoix
    7 \">\"e-Soph
    8 \">\"PC Price Club
    9 \">\"PC 77
    10 \">\"Web In Informatique
    \n\t\t\t\t
    \n\t\t\t\t
    \r\n \r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t
    \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
    \r\n\r\n\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n

    \r\n\t\t\t

    \r\n\t\t\t

    \r\n\t\t\t
    \r\n\t\t\t
    \r\n\r\n\r\n \r\n \r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    CD et DVD bient\364t insensibles aux rayures
    OpenOffice gagne son service
    La messagerie en cinq minutes selon Ipswitch
    > toutes les news


    \r\n\t\t
    \r\n \r\n\r\n\r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    Recevez chaque jour l\'actualit\351 des produits et des promos
    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t


    \r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t
    \r\n\r\n\r\n\r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t \r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    Entreprise
    \r\n\t\t\t\tQuand le billet papier s\'envole vers la d\351mat\351rialisation


    Trucs et astuces
    \r\n\t\t\t\tD\351pannez Windows XP


    Conso
    \r\n\t\t\t\tVos photos sur papier imprimante ou labo ?


    Produits & Tests
    \r\n\t\t\t\t5 programmes d\222encodage vid\351o gratuits


    \r\n\t\t
    \r\n\r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n
    \r\n
    \r\n\t\t\r\n\t\t

    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\r\n\t\r\n\r\n\r\n\r\n\t\t\t\r\n\r\n\r\n\r\n\t\t\t\t\r\n
    \r\n
    \r\nPortable
    \r\nUn nouvel ultra portable r\351alis\351 par Nec
    \r\n\r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \t\r\nLe Versa S940 a un format r\351duit, mais ses performances sont \340 la hauteur.
    \r\n\340 partir de 1663 \200\r\n
    \r\n
    \r\nPortable
    \r\nAsus pr\351sente trois petits nouveaux dans la gamme A3N
    \r\n\r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \t\r\nCes trois portables Centrino int\350grent, entre autres, une webcam et un contr\364leur Wi-Fi.
    \r\n\340 partir de 1346 \200\r\n
    \r\n
    \r\n\t\r\n\t\r\n\t\r\n \t\r\n\t\r\n\t\r\n \t\r\n\t\r\n\t
    \r\n\t\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    BON PLAN
    \r\n
    \r\n
    \r\nLes derni\350res technologies INTEL dans un nouveau design pour ce shuttle haut de gamme, pour un prix abordable.
    \r\n

    \r\n
    \r\n\340 partir de
    \r\n
    415 \200
    \r\n
    \r\n
    \r\n
    publicit\351
    \r\n
    \r\n\t\r\n\r\n
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    \r\n\t\t\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\tDesktops
    \r\n\t\t\t\tPortables
    \r\n\t\t\t\tMini-PC
    \r\n\t\t\t\tPda / Tablets-PC
    \r\n\t\t\t\tApple
    \r\n\t\t\t\tGPS
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t


    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n \r\n\r\n\r\n \r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n

    \r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\t\t\r\n\t\r\n\t\r\n\t\t\t\t\r\n\t\r\n\t\r\n\t\t\t\t\r\n\t\r\n\t\r\n\t\t\t\t\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\tPortable Toshiba consacre deux gammes de machines au multim\351dia
    \r\n\tEquipement haut de gamme et Windows Media Center sont au menu de ces portables \340 vocation multim\351dia.

    \r\n\tOrdinateur Arriv\351e d\'un Power Mac G5 d\'entr\351e de gamme
    \r\n\tLa firme \340 la pomme propose une station de travail \351volutive et relativement abordable.

    \r\n\tPC Alienware propose deux machines au look \351trange
    \r\n\tAurora et Area 51 sont deux gammes d\'ordinateurs enti\350rement configurables.

    \r\n\tPortable Trois nouveaux iBook G4 chez Apple
    \r\n\tChez Apple, les portables gagnent en vitesse et communiquent sans fil en standard.

    \r\n\t\t\t\t> toutes les news\r\n\t\t\t
    \r\n
    \r\n
    \r\n
    \r\n\r\n\r\n\r\n\r\n

    \r\n\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \tAsus A3N15-C Pro
    \r\n Voici un portable autonome et puissant gr\342ce \340 la technologie Intel Centrino.
    \r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\t1170 \200
    \r\n
    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \tSoltek EQ3702A Miroir
    \r\n Ce mini PC est une solution int\351ressante pour les utilisateurs poss\351dant d\351j\340 un \351cran.
    \r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\t559 \200
    \r\n
    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \tIBM ThinkPad R51
    \r\n Voici un portable complet et pourtant relativement l\351ger.
    \r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\t1299 \200
    \r\n
    \r\n\t\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t> toutes les promos\r\n\t\t
    \r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n

    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\r\n

    \r\n
    \r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t
    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t
    \r\n\t\t\t\r\n\t\t\t\t\r\n\r\n\r\n\r\n \r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t
    \r\n\t\r\n\r\n
    \r\n\r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \t\r\n
    \r\n
    \r\nLes graveurs de DVD
    \r\nQuel graveur choisir ? Quel type de format ? Quelle vitesse ? Double couche ou simple couche ? Voici tout ce qu\'il faut savoir pour faire le bon choix.
    \r\n\t\t\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t
    \r\n
    \r\n\r\n\r\n\t\r\n\t\t\r\n\r\n\r\n \t\r\n
    \r\n\t\t
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t
    \r\n\t\t\t\t

    \r\n\t\t\t\tChoisir une r\351gion
    \r\n\r\n
    Un d\351partement
    \r\n\r\n
    \r\n
    Un arrondissement
    \r\n\r\n
    \r\n
    \r\n\t\t\t\tRecherche directe
    \r\n\t\t\t\trechercher une ville
    et/ou une boutique
    \r\n\t\t\t\t

    \r\n\t\t\t\t \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
    Recherche avanc\351e
    \r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t
    Bureautique
    \r\n\t\t\t\tTraducteur, organiseur...

    \r\n\t\t\t\t

    Multim\351dia
    \r\n\t\t\t\tPhoto, audio, vid\351o...

    \r\n\t\t\t\t

    Utilitaires
    \r\n\t\t\t\tAntivirus, pilotes, gravure...

    \r\n\t\t\t\t

    Personnaliser son PC
    \r\n\t\t\t\tEcrans de veille, th\350mes...

    \r\n\t\t\t\t

    D\351veloppement
    \r\n\t\t\t\tCr\351ation de logiciels, BDD...

    \r\n\t\t\t\t

    Jeux
    \r\n\t\t\t\tAction, simulation...

    \r\n\t\t\t\t

    Internet
    \r\n\t\t\t\tUtilitaires, email, FTP...

    \r\n\t\t\t\t

    Loisirs
    \r\n\t\t\t\tHumour, culture...

    \r\n\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\t\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t\t\r\n\t\t\t
    \r\n\t\t\t
    \r\n\r\n\t\t

    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\nMicro Achat : Ordinateurs, PDA - Toute l\'informatique avec 01Informatique, L\'Ordinateur Individuel, Micro Hebdo, D\351cision Informatique et 01R\351seaux\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n

    Derni\350re mise \340 jour de cette page : lundi 8 novembre 2004  |  16:45
    \r\n \r\n\r\n\r\n\r\n\t\r\n\r\n\t\t\r\n\r\n\t\r\n\r\n\t\r\n\t\t\r\n\r\n\r\n\t\t\r\n\r\n\t\t\r\n\t\r\n\t\r\n\t\t\t

    \r\n\r\n\r\n\r\n


    \r\n\r\n\r\n\r\n
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \"\"
    Imagerie 
    \"\"\n\t\t\t\t\t\t\t\tLG L1720B\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    332.89 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Ordinateurs 
    \"\"\n\t\t\t\t\t\t\t\tAcer Veriton 7600G\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    705 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Ordinateurs 
    \"\"\n\t\t\t\t\t\t\t\tShuttle SN95G5\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    375 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Composants 
    \"\"\n\t\t\t\t\t\t\t\tAsus A7N8X-E Deluxe\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    91.99 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Composants 
    \"\"\n\t\t\t\t\t\t\t\tThermalright SP-94\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    49 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \"\"
    1 \">\"PC Look
    2 \">\"Atelier Informatique
    3 \">\"Zanax Multim\351dia
    4 \">\"MISTEROOPS
    5 \">\"168 Golden Avenue
    6 \">\"microchoix
    7 \">\"e-Soph
    8 \">\"PC Price Club
    9 \">\"PC 77
    10 \">\"Web In Informatique
    \n\t\t\t\t
    \n\t\t\t\t
    \r\n \r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t
    \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
    \r\n\r\n\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n

    \r\n\t\t\t

    \r\n\t\t\t

    \r\n\t\t\t
    \r\n\t\t\t
    \r\n\r\n\r\n \r\n \r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    CD et DVD bient\364t insensibles aux rayures
    OpenOffice gagne son service
    La messagerie en cinq minutes selon Ipswitch
    > toutes les news


    \r\n\t\t
    \r\n \r\n\r\n\r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    Recevez chaque jour l\'actualit\351 des produits et des promos
    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t


    \r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t
    \r\n\r\n\r\n\r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t \r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    Entreprise
    \r\n\t\t\t\tQuand le billet papier s\'envole vers la d\351mat\351rialisation


    Trucs et astuces
    \r\n\t\t\t\tD\351pannez Windows XP


    Conso
    \r\n\t\t\t\tVos photos sur papier imprimante ou labo ?


    Produits & Tests
    \r\n\t\t\t\t5 programmes d\222encodage vid\351o gratuits


    \r\n\t\t
    \r\n\r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n
    \r\n
    \r\n\t\t\r\n\t\t

    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\r\n\t\r\n\r\n\r\n\r\n\t\t\t\r\n\r\n\r\n\r\n\t\t\t\t\r\n
    \r\n
    \r\nPortable
    \r\nUn nouvel ultra portable r\351alis\351 par Nec
    \r\n\r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \t\r\nLe Versa S940 a un format r\351duit, mais ses performances sont \340 la hauteur.
    \r\n\340 partir de 1663 \200\r\n
    \r\n
    \r\nPortable
    \r\nAsus pr\351sente trois petits nouveaux dans la gamme A3N
    \r\n\r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \t\r\nCes trois portables Centrino int\350grent, entre autres, une webcam et un contr\364leur Wi-Fi.
    \r\n\340 partir de 1346 \200\r\n
    \r\n
    \r\n\t\r\n\t\r\n\t\r\n \t\r\n\t\r\n\t\r\n \t\r\n\t\r\n\t
    \r\n\t\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    BON PLAN
    \r\n
    \r\n
    \r\nLes derni\350res technologies INTEL dans un nouveau design pour ce shuttle haut de gamme, pour un prix abordable.
    \r\n

    \r\n
    \r\n\340 partir de
    \r\n
    415 \200
    \r\n
    \r\n
    \r\n
    publicit\351
    \r\n
    \r\n\t\r\n\r\n
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    \r\n\t\t\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\tDesktops
    \r\n\t\t\t\tPortables
    \r\n\t\t\t\tMini-PC
    \r\n\t\t\t\tPda / Tablets-PC
    \r\n\t\t\t\tApple
    \r\n\t\t\t\tGPS
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t


    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n \r\n\r\n\r\n \r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n

    \r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\t\t\r\n\t\r\n\t\r\n\t\t\t\t\r\n\t\r\n\t\r\n\t\t\t\t\r\n\t\r\n\t\r\n\t\t\t\t\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\tPortable Toshiba consacre deux gammes de machines au multim\351dia
    \r\n\tEquipement haut de gamme et Windows Media Center sont au menu de ces portables \340 vocation multim\351dia.

    \r\n\tOrdinateur Arriv\351e d\'un Power Mac G5 d\'entr\351e de gamme
    \r\n\tLa firme \340 la pomme propose une station de travail \351volutive et relativement abordable.

    \r\n\tPC Alienware propose deux machines au look \351trange
    \r\n\tAurora et Area 51 sont deux gammes d\'ordinateurs enti\350rement configurables.

    \r\n\tPortable Trois nouveaux iBook G4 chez Apple
    \r\n\tChez Apple, les portables gagnent en vitesse et communiquent sans fil en standard.

    \r\n\t\t\t\t> toutes les news\r\n\t\t\t
    \r\n
    \r\n
    \r\n
    \r\n\r\n\r\n\r\n\r\n

    \r\n\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \tAsus A3N15-C Pro
    \r\n Voici un portable autonome et puissant gr\342ce \340 la technologie Intel Centrino.
    \r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\t1170 \200
    \r\n
    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \tSoltek EQ3702A Miroir
    \r\n Ce mini PC est une solution int\351ressante pour les utilisateurs poss\351dant d\351j\340 un \351cran.
    \r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\t559 \200
    \r\n
    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \tIBM ThinkPad R51
    \r\n Voici un portable complet et pourtant relativement l\351ger.
    \r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\t1299 \200
    \r\n
    \r\n\t\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t> toutes les promos\r\n\t\t
    \r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n

    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\r\n

    \r\n
    \r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t
    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t
    \r\n\t\t\t\r\n\t\t\t\t\r\n\r\n\r\n\r\n \r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t
    \r\n\t\r\n\r\n
    \r\n\r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \t\r\n
    \r\n
    \r\nLes graveurs de DVD
    \r\nQuel graveur choisir ? Quel type de format ? Quelle vitesse ? Double couche ou simple couche ? Voici tout ce qu\'il faut savoir pour faire le bon choix.
    \r\n\t\t\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t
    \r\n
    \r\n\r\n\r\n\t\r\n\t\t\r\n\r\n\r\n \t\r\n
    \r\n\t\t
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t
    \r\n\t\t\t\t

    \r\n\t\t\t\tChoisir une r\351gion
    \r\n\r\n
    Un d\351partement
    \r\n\r\n
    \r\n
    Un arrondissement
    \r\n\r\n
    \r\n
    \r\n\t\t\t\tRecherche directe
    \r\n\t\t\t\trechercher une ville
    et/ou une boutique
    \r\n\t\t\t\t

    \r\n\t\t\t\t \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
    Recherche avanc\351e
    \r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t
    Bureautique
    \r\n\t\t\t\tTraducteur, organiseur...

    \r\n\t\t\t\t

    Multim\351dia
    \r\n\t\t\t\tPhoto, audio, vid\351o...

    \r\n\t\t\t\t

    Utilitaires
    \r\n\t\t\t\tAntivirus, pilotes, gravure...

    \r\n\t\t\t\t

    Personnaliser son PC
    \r\n\t\t\t\tEcrans de veille, th\350mes...

    \r\n\t\t\t\t

    D\351veloppement
    \r\n\t\t\t\tCr\351ation de logiciels, BDD...

    \r\n\t\t\t\t

    Jeux
    \r\n\t\t\t\tAction, simulation...

    \r\n\t\t\t\t

    Internet
    \r\n\t\t\t\tUtilitaires, email, FTP...

    \r\n\t\t\t\t

    Loisirs
    \r\n\t\t\t\tHumour, culture...

    \r\n\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\t\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t\t\r\n\t\t\t
    \r\n\t\t\t
    \r\n\r\n\t\t

    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\nMicro Achat : Ordinateurs, PDA - Toute l\'informatique avec 01Informatique, L\'Ordinateur Individuel, Micro Hebdo, D\351cision Informatique et 01R\351seaux\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n

    Derni\350re mise \340 jour de cette page : lundi 8 novembre 2004  |  16:45
    \r\n \r\n\r\n\r\n\r\n\t\r\n\r\n\t\t\r\n\r\n\t\r\n\r\n\t\r\n\t\t\r\n\r\n\r\n\t\t\r\n\r\n\t\t\r\n\t\r\n\t\r\n\t\t\t

    \r\n\r\n\r\n\r\n


    \r\n\r\n\r\n\r\n
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \"\"
    Imagerie 
    \"\"\n\t\t\t\t\t\t\t\tLG L1720B\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    332.89 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Ordinateurs 
    \"\"\n\t\t\t\t\t\t\t\tAcer Veriton 7600G\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    705 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Ordinateurs 
    \"\"\n\t\t\t\t\t\t\t\tShuttle SN95G5\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    375 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Composants 
    \"\"\n\t\t\t\t\t\t\t\tAsus A7N8X-E Deluxe\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    91.99 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Composants 
    \"\"\n\t\t\t\t\t\t\t\tThermalright SP-94\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    49 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \"\"
    1 \">\"PC Look
    2 \">\"Atelier Informatique
    3 \">\"Zanax Multim\351dia
    4 \">\"MISTEROOPS
    5 \">\"168 Golden Avenue
    6 \">\"microchoix
    7 \">\"e-Soph
    8 \">\"PC Price Club
    9 \">\"PC 77
    10 \">\"Web In Informatique
    \n\t\t\t\t
    \n\t\t\t\t
    \r\n \r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t
    \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
    \r\n\r\n\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n

    \r\n\t\t\t

    \r\n\t\t\t

    \r\n\t\t\t
    \r\n\t\t\t
    \r\n\r\n\r\n \r\n \r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    CD et DVD bient\364t insensibles aux rayures
    OpenOffice gagne son service
    La messagerie en cinq minutes selon Ipswitch
    > toutes les news


    \r\n\t\t
    \r\n \r\n\r\n\r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    Recevez chaque jour l\'actualit\351 des produits et des promos
    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t


    \r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t
    \r\n\r\n\r\n\r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t \r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    Entreprise
    \r\n\t\t\t\tQuand le billet papier s\'envole vers la d\351mat\351rialisation


    Trucs et astuces
    \r\n\t\t\t\tD\351pannez Windows XP


    Conso
    \r\n\t\t\t\tVos photos sur papier imprimante ou labo ?


    Produits & Tests
    \r\n\t\t\t\t5 programmes d\222encodage vid\351o gratuits


    \r\n\t\t
    \r\n\r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n
    \r\n
    \r\n\t\t\r\n\t\t

    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\r\n\t\r\n\r\n\r\n\r\n\t\t\t\r\n\r\n\r\n\r\n\t\t\t\t\r\n
    \r\n
    \r\nPortable
    \r\nUn nouvel ultra portable r\351alis\351 par Nec
    \r\n\r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \t\r\nLe Versa S940 a un format r\351duit, mais ses performances sont \340 la hauteur.
    \r\n\340 partir de 1663 \200\r\n
    \r\n
    \r\nPortable
    \r\nAsus pr\351sente trois petits nouveaux dans la gamme A3N
    \r\n\r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \t\r\nCes trois portables Centrino int\350grent, entre autres, une webcam et un contr\364leur Wi-Fi.
    \r\n\340 partir de 1346 \200\r\n
    \r\n
    \r\n\t\r\n\t\r\n\t\r\n \t\r\n\t\r\n\t\r\n \t\r\n\t\r\n\t
    \r\n\t\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    BON PLAN
    \r\n
    \r\n
    \r\nLes derni\350res technologies INTEL dans un nouveau design pour ce shuttle haut de gamme, pour un prix abordable.
    \r\n

    \r\n
    \r\n\340 partir de
    \r\n
    415 \200
    \r\n
    \r\n
    \r\n
    publicit\351
    \r\n
    \r\n\t\r\n\r\n
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    \r\n\t\t\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\tDesktops
    \r\n\t\t\t\tPortables
    \r\n\t\t\t\tMini-PC
    \r\n\t\t\t\tPda / Tablets-PC
    \r\n\t\t\t\tApple
    \r\n\t\t\t\tGPS
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t


    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n \r\n\r\n\r\n \r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n

    \r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\t\t\r\n\t\r\n\t\r\n\t\t\t\t\r\n\t\r\n\t\r\n\t\t\t\t\r\n\t\r\n\t\r\n\t\t\t\t\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\tPortable Toshiba consacre deux gammes de machines au multim\351dia
    \r\n\tEquipement haut de gamme et Windows Media Center sont au menu de ces portables \340 vocation multim\351dia.

    \r\n\tOrdinateur Arriv\351e d\'un Power Mac G5 d\'entr\351e de gamme
    \r\n\tLa firme \340 la pomme propose une station de travail \351volutive et relativement abordable.

    \r\n\tPC Alienware propose deux machines au look \351trange
    \r\n\tAurora et Area 51 sont deux gammes d\'ordinateurs enti\350rement configurables.

    \r\n\tPortable Trois nouveaux iBook G4 chez Apple
    \r\n\tChez Apple, les portables gagnent en vitesse et communiquent sans fil en standard.

    \r\n\t\t\t\t> toutes les news\r\n\t\t\t
    \r\n
    \r\n
    \r\n
    \r\n\r\n\r\n\r\n\r\n

    \r\n\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \tAsus A3N15-C Pro
    \r\n Voici un portable autonome et puissant gr\342ce \340 la technologie Intel Centrino.
    \r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\t1170 \200
    \r\n
    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \tSoltek EQ3702A Miroir
    \r\n Ce mini PC est une solution int\351ressante pour les utilisateurs poss\351dant d\351j\340 un \351cran.
    \r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\t559 \200
    \r\n
    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \tIBM ThinkPad R51
    \r\n Voici un portable complet et pourtant relativement l\351ger.
    \r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\t1299 \200
    \r\n
    \r\n\t\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t> toutes les promos\r\n\t\t
    \r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n

    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\r\n

    \r\n
    \r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t
    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t
    \r\n\t\t\t\r\n\t\t\t\t\r\n\r\n\r\n\r\n \r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t
    \r\n\t\r\n\r\n
    \r\n\r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \t\r\n
    \r\n
    \r\nLes graveurs de DVD
    \r\nQuel graveur choisir ? Quel type de format ? Quelle vitesse ? Double couche ou simple couche ? Voici tout ce qu\'il faut savoir pour faire le bon choix.
    \r\n\t\t\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t
    \r\n
    \r\n\r\n\r\n\t\r\n\t\t\r\n\r\n\r\n \t\r\n
    \r\n\t\t
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t
    \r\n\t\t\t\t

    \r\n\t\t\t\tChoisir une r\351gion
    \r\n\r\n
    Un d\351partement
    \r\n\r\n
    \r\n
    Un arrondissement
    \r\n\r\n
    \r\n
    \r\n\t\t\t\tRecherche directe
    \r\n\t\t\t\trechercher une ville
    et/ou une boutique
    \r\n\t\t\t\t

    \r\n\t\t\t\t \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
    Recherche avanc\351e
    \r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t
    Bureautique
    \r\n\t\t\t\tTraducteur, organiseur...

    \r\n\t\t\t\t

    Multim\351dia
    \r\n\t\t\t\tPhoto, audio, vid\351o...

    \r\n\t\t\t\t

    Utilitaires
    \r\n\t\t\t\tAntivirus, pilotes, gravure...

    \r\n\t\t\t\t

    Personnaliser son PC
    \r\n\t\t\t\tEcrans de veille, th\350mes...

    \r\n\t\t\t\t

    D\351veloppement
    \r\n\t\t\t\tCr\351ation de logiciels, BDD...

    \r\n\t\t\t\t

    Jeux
    \r\n\t\t\t\tAction, simulation...

    \r\n\t\t\t\t

    Internet
    \r\n\t\t\t\tUtilitaires, email, FTP...

    \r\n\t\t\t\t

    Loisirs
    \r\n\t\t\t\tHumour, culture...

    \r\n\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\t\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t\t\r\n\t\t\t
    \r\n\t\t\t
    \r\n\r\n\t\t

    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\nMicro Achat : Ordinateurs, PDA - Toute l\'informatique avec 01Informatique, L\'Ordinateur Individuel, Micro Hebdo, D\351cision Informatique et 01R\351seaux\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n

    Derni\350re mise \340 jour de cette page : lundi 8 novembre 2004  |  16:45
    \r\n \r\n\r\n\r\n\r\n\t\r\n\r\n\t\t\r\n\r\n\t\r\n\r\n\t\r\n\t\t\r\n\r\n\r\n\t\t\r\n\r\n\t\t\r\n\t\r\n\t\r\n\t\t\t

    \r\n\r\n\r\n\r\n


    \r\n\r\n\r\n\r\n
    \n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t\t\n\t\t\t\t\t\t
    \"\"
    Imagerie 
    \"\"\n\t\t\t\t\t\t\t\tLG L1720B\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    332.89 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Ordinateurs 
    \"\"\n\t\t\t\t\t\t\t\tAcer Veriton 7600G\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    705 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Ordinateurs 
    \"\"\n\t\t\t\t\t\t\t\tShuttle SN95G5\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    375 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Composants 
    \"\"\n\t\t\t\t\t\t\t\tAsus A7N8X-E Deluxe\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    91.99 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    Composants 
    \"\"\n\t\t\t\t\t\t\t\tThermalright SP-94\n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t\t\t\340 partir de\n\t\t\t\t\t\t\t\t\t
    49 €
    \n\t\t\t\t\t\t\t\t
    \n\t\t\t\t\t\t\t
    \n\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t\t\n\t\t\t\t
    \"\"
    1 \">\"PC Look
    2 \">\"Atelier Informatique
    3 \">\"Zanax Multim\351dia
    4 \">\"MISTEROOPS
    5 \">\"168 Golden Avenue
    6 \">\"microchoix
    7 \">\"e-Soph
    8 \">\"PC Price Club
    9 \">\"PC 77
    10 \">\"Web In Informatique
    \n\t\t\t\t
    \n\t\t\t\t
    \r\n \r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t
    \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
    \r\n\r\n\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n

    \r\n\t\t\t

    \r\n\t\t\t

    \r\n\t\t\t
    \r\n\t\t\t
    \r\n\r\n\r\n \r\n \r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    CD et DVD bient\364t insensibles aux rayures
    OpenOffice gagne son service
    La messagerie en cinq minutes selon Ipswitch
    > toutes les news


    \r\n\t\t
    \r\n \r\n\r\n\r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    Recevez chaque jour l\'actualit\351 des produits et des promos
    \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t


    \r\n\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t
    \r\n\r\n\r\n\r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t \r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    Entreprise
    \r\n\t\t\t\tQuand le billet papier s\'envole vers la d\351mat\351rialisation


    Trucs et astuces
    \r\n\t\t\t\tD\351pannez Windows XP


    Conso
    \r\n\t\t\t\tVos photos sur papier imprimante ou labo ?


    Produits & Tests
    \r\n\t\t\t\t5 programmes d\222encodage vid\351o gratuits


    \r\n\t\t
    \r\n\r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n
    \r\n
    \r\n\t\t\r\n\t\t

    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\r\n\t\r\n\r\n\r\n\r\n\t\t\t\r\n\r\n\r\n\r\n\t\t\t\t\r\n
    \r\n
    \r\nPortable
    \r\nUn nouvel ultra portable r\351alis\351 par Nec
    \r\n\r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \t\r\nLe Versa S940 a un format r\351duit, mais ses performances sont \340 la hauteur.
    \r\n\340 partir de 1663 \200\r\n
    \r\n
    \r\nPortable
    \r\nAsus pr\351sente trois petits nouveaux dans la gamme A3N
    \r\n\r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \t\r\nCes trois portables Centrino int\350grent, entre autres, une webcam et un contr\364leur Wi-Fi.
    \r\n\340 partir de 1346 \200\r\n
    \r\n
    \r\n\t\r\n\t\r\n\t\r\n \t\r\n\t\r\n\t\r\n \t\r\n\t\r\n\t
    \r\n\t\r\n\r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    BON PLAN
    \r\n
    \r\n
    \r\nLes derni\350res technologies INTEL dans un nouveau design pour ce shuttle haut de gamme, pour un prix abordable.
    \r\n

    \r\n
    \r\n\340 partir de
    \r\n
    415 \200
    \r\n
    \r\n
    \r\n
    publicit\351
    \r\n
    \r\n\t\r\n\r\n
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t

    \r\n\t\t\t\t\t\t\t\t\t\t\t\t
    \r\n\t\t\t\tDesktops
    \r\n\t\t\t\tPortables
    \r\n\t\t\t\tMini-PC
    \r\n\t\t\t\tPda / Tablets-PC
    \r\n\t\t\t\tApple
    \r\n\t\t\t\tGPS
    \r\n\t\t\t\t
    \r\n\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t


    \r\n\t\t\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n \r\n\r\n\r\n \r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n

    \r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\t\t\r\n\t\r\n\t\r\n\t\t\t\t\r\n\t\r\n\t\r\n\t\t\t\t\r\n\t\r\n\t\r\n\t\t\t\t\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\tPortable Toshiba consacre deux gammes de machines au multim\351dia
    \r\n\tEquipement haut de gamme et Windows Media Center sont au menu de ces portables \340 vocation multim\351dia.

    \r\n\tOrdinateur Arriv\351e d\'un Power Mac G5 d\'entr\351e de gamme
    \r\n\tLa firme \340 la pomme propose une station de travail \351volutive et relativement abordable.

    \r\n\tPC Alienware propose deux machines au look \351trange
    \r\n\tAurora et Area 51 sont deux gammes d\'ordinateurs enti\350rement configurables.

    \r\n\tPortable Trois nouveaux iBook G4 chez Apple
    \r\n\tChez Apple, les portables gagnent en vitesse et communiquent sans fil en standard.

    \r\n\t\t\t\t> toutes les news\r\n\t\t\t
    \r\n
    \r\n
    \r\n
    \r\n\r\n\r\n\r\n\r\n

    \r\n\r\n\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \tAsus A3N15-C Pro
    \r\n Voici un portable autonome et puissant gr\342ce \340 la technologie Intel Centrino.
    \r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\t1170 \200
    \r\n
    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \tSoltek EQ3702A Miroir
    \r\n Ce mini PC est une solution int\351ressante pour les utilisateurs poss\351dant d\351j\340 un \351cran.
    \r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\t559 \200
    \r\n
    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \tIBM ThinkPad R51
    \r\n Voici un portable complet et pourtant relativement l\351ger.
    \r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t\r\n\t
    \r\n\t1299 \200
    \r\n
    \r\n\t\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n\t\t\t\t> toutes les promos\r\n\t\t
    \r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n

    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\r\n

    \r\n
    \r\n\t\t\r\n\t\t\r\n\t\t\t\r\n\t\t\r\n\t\t\r\n\t\t
    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t
    \r\n\t\t\t\r\n\t\t\t\t\r\n\r\n\r\n\r\n \r\n\r\n\r\n \r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t
    \r\n\t\r\n\r\n
    \r\n\r\n\t\t\t\t\t \t \t\t\t\t\t\t\t\t\t\t\t\t\t\r\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t \t \t\r\n
    \r\n
    \r\nLes graveurs de DVD
    \r\nQuel graveur choisir ? Quel type de format ? Quelle vitesse ? Double couche ou simple couche ? Voici tout ce qu\'il faut savoir pour faire le bon choix.
    \r\n\t\t\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t
    \r\n
    \r\n\r\n\r\n\t\r\n\t\t\r\n\r\n\r\n \t\r\n
    \r\n\t\t
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t
    \r\n\t\t\t\t

    \r\n\t\t\t\tChoisir une r\351gion
    \r\n\r\n
    Un d\351partement
    \r\n\r\n
    \r\n
    Un arrondissement
    \r\n\r\n
    \r\n
    \r\n\t\t\t\tRecherche directe
    \r\n\t\t\t\trechercher une ville
    et/ou une boutique
    \r\n\t\t\t\t

    \r\n\t\t\t\t \r\n\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t\t\t\r\n\t\t\t\t\t\r\n\t\t\t\t
    Recherche avanc\351e
    \r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n\r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n\t\r\n\t\t\r\n\t\r\n
    \r\n\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t\t\r\n\t\t\t\t\r\n\t\t\t\r\n\t\t
    Bureautique
    \r\n\t\t\t\tTraducteur, organiseur...

    \r\n\t\t\t\t

    Multim\351dia
    \r\n\t\t\t\tPhoto, audio, vid\351o...

    \r\n\t\t\t\t

    Utilitaires
    \r\n\t\t\t\tAntivirus, pilotes, gravure...

    \r\n\t\t\t\t

    Personnaliser son PC
    \r\n\t\t\t\tEcrans de veille, th\350mes...

    \r\n\t\t\t\t

    D\351veloppement
    \r\n\t\t\t\tCr\351ation de logiciels, BDD...

    \r\n\t\t\t\t

    Jeux
    \r\n\t\t\t\tAction, simulation...

    \r\n\t\t\t\t

    Internet
    \r\n\t\t\t\tUtilitaires, email, FTP...

    \r\n\t\t\t\t

    Loisirs
    \r\n\t\t\t\tHumour, culture...

    \r\n\t\t\t\t
    \r\n\t\t
    \r\n
    \r\n
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\r\n\t\t
    \r\n\t\t
    \r\n\t\t\r\n\t\t\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\r\n\t\t\t\t\r\n\t\t\t
    \r\n\t\t\t
    \r\n\r\n\t\t

    \r\n\t\t\t\r\n\r\n\r\n\r\n\r\n\r\n
    \r\n
    \r\n
    \r\n\r\n\r\n\r\n3 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 diff --git a/vendor/snap/data/lcet10.txt b/vendor/snap/data/lcet10.txt deleted file mode 100644 index 25dda6b3f1..0000000000 --- a/vendor/snap/data/lcet10.txt +++ /dev/null @@ -1,7519 +0,0 @@ - - -The Project Gutenberg Etext of LOC WORKSHOP ON ELECTRONIC TEXTS - - - - - WORKSHOP ON ELECTRONIC TEXTS - - PROCEEDINGS - - - - Edited by James Daly - - - - - - - - 9-10 June 1992 - - - Library of Congress - Washington, D.C. - - - - Supported by a Grant from the David and Lucile Packard Foundation - - - *** *** *** ****** *** *** *** - - - TABLE OF CONTENTS - - -Acknowledgements - -Introduction - -Proceedings - Welcome - Prosser Gifford and Carl Fleischhauer - - Session I. Content in a New Form: Who Will Use It and What Will They Do? - James Daly (Moderator) - Avra Michelson, Overview - Susan H. Veccia, User Evaluation - Joanne Freeman, Beyond the Scholar - Discussion - - Session II. Show and Tell - Jacqueline Hess (Moderator) - Elli Mylonas, Perseus Project - Discussion - Eric M. Calaluca, Patrologia Latina Database - Carl Fleischhauer and Ricky Erway, American Memory - Discussion - Dorothy Twohig, The Papers of George Washington - Discussion - Maria L. Lebron, The Online Journal of Current Clinical Trials - Discussion - Lynne K. Personius, Cornell mathematics books - Discussion - - Session III. Distribution, Networks, and Networking: - Options for Dissemination - Robert G. Zich (Moderator) - Clifford A. Lynch - Discussion - Howard Besser - Discussion - Ronald L. Larsen - Edwin B. Brownrigg - Discussion - - Session IV. Image Capture, Text Capture, Overview of Text and - Image Storage Formats - William L. Hooton (Moderator) - A) Principal Methods for Image Capture of Text: - direct scanning, use of microform - Anne R. Kenney - Pamela Q.J. Andre - Judith A. Zidar - Donald J. Waters - Discussion - B) Special Problems: bound volumes, conservation, - reproducing printed halftones - George Thoma - Carl Fleischhauer - Discussion - C) Image Standards and Implications for Preservation - Jean Baronas - Patricia Battin - Discussion - D) Text Conversion: OCR vs. rekeying, standards of accuracy - and use of imperfect texts, service bureaus - Michael Lesk - Ricky Erway - Judith A. Zidar - Discussion - - Session V. Approaches to Preparing Electronic Texts - Susan Hockey (Moderator) - Stuart Weibel - Discussion - C.M. Sperberg-McQueen - Discussion - Eric M. Calaluca - Discussion - - Session VI. Copyright Issues - Marybeth Peters - - Session VII. Conclusion - Prosser Gifford (Moderator) - General discussion - -Appendix I: Program - -Appendix II: Abstracts - -Appendix III: Directory of Participants - - - *** *** *** ****** *** *** *** - - - Acknowledgements - -I would like to thank Carl Fleischhauer and Prosser Gifford for the -opportunity to learn about areas of human activity unknown to me a scant -ten months ago, and the David and Lucile Packard Foundation for -supporting that opportunity. The help given by others is acknowledged on -a separate page. - - 19 October 1992 - - - *** *** *** ****** *** *** *** - - - INTRODUCTION - -The Workshop on Electronic Texts (1) drew together representatives of -various projects and interest groups to compare ideas, beliefs, -experiences, and, in particular, methods of placing and presenting -historical textual materials in computerized form. Most attendees gained -much in insight and outlook from the event. But the assembly did not -form a new nation, or, to put it another way, the diversity of projects -and interests was too great to draw the representatives into a cohesive, -action-oriented body.(2) - -Everyone attending the Workshop shared an interest in preserving and -providing access to historical texts. But within this broad field the -attendees represented a variety of formal, informal, figurative, and -literal groups, with many individuals belonging to more than one. These -groups may be defined roughly according to the following topics or -activities: - -* Imaging -* Searchable coded texts -* National and international computer networks -* CD-ROM production and dissemination -* Methods and technology for converting older paper materials into -electronic form -* Study of the use of digital materials by scholars and others - -This summary is arranged thematically and does not follow the actual -sequence of presentations. - -NOTES: - (1) In this document, the phrase electronic text is used to mean - any computerized reproduction or version of a document, book, - article, or manuscript (including images), and not merely a machine- - readable or machine-searchable text. - - (2) The Workshop was held at the Library of Congress on 9-10 June - 1992, with funding from the David and Lucile Packard Foundation. - The document that follows represents a summary of the presentations - made at the Workshop and was compiled by James DALY. This - introduction was written by DALY and Carl FLEISCHHAUER. - - -PRESERVATION AND IMAGING - -Preservation, as that term is used by archivists,(3) was most explicitly -discussed in the context of imaging. Anne KENNEY and Lynne PERSONIUS -explained how the concept of a faithful copy and the user-friendliness of -the traditional book have guided their project at Cornell University.(4) -Although interested in computerized dissemination, participants in the -Cornell project are creating digital image sets of older books in the -public domain as a source for a fresh paper facsimile or, in a future -phase, microfilm. The books returned to the library shelves are -high-quality and useful replacements on acid-free paper that should last -a long time. To date, the Cornell project has placed little or no -emphasis on creating searchable texts; one would not be surprised to find -that the project participants view such texts as new editions, and thus -not as faithful reproductions. - -In her talk on preservation, Patricia BATTIN struck an ecumenical and -flexible note as she endorsed the creation and dissemination of a variety -of types of digital copies. Do not be too narrow in defining what counts -as a preservation element, BATTIN counseled; for the present, at least, -digital copies made with preservation in mind cannot be as narrowly -standardized as, say, microfilm copies with the same objective. Setting -standards precipitously can inhibit creativity, but delay can result in -chaos, she advised. - -In part, BATTIN's position reflected the unsettled nature of image-format -standards, and attendees could hear echoes of this unsettledness in the -comments of various speakers. For example, Jean BARONAS reviewed the -status of several formal standards moving through committees of experts; -and Clifford LYNCH encouraged the use of a new guideline for transmitting -document images on Internet. Testimony from participants in the National -Agricultural Library's (NAL) Text Digitization Program and LC's American -Memory project highlighted some of the challenges to the actual creation -or interchange of images, including difficulties in converting -preservation microfilm to digital form. Donald WATERS reported on the -progress of a master plan for a project at Yale University to convert -books on microfilm to digital image sets, Project Open Book (POB). - -The Workshop offered rather less of an imaging practicum than planned, -but "how-to" hints emerge at various points, for example, throughout -KENNEY's presentation and in the discussion of arcana such as -thresholding and dithering offered by George THOMA and FLEISCHHAUER. - -NOTES: - (3) Although there is a sense in which any reproductions of - historical materials preserve the human record, specialists in the - field have developed particular guidelines for the creation of - acceptable preservation copies. - - (4) Titles and affiliations of presenters are given at the - beginning of their respective talks and in the Directory of - Participants (Appendix III). - - -THE MACHINE-READABLE TEXT: MARKUP AND USE - -The sections of the Workshop that dealt with machine-readable text tended -to be more concerned with access and use than with preservation, at least -in the narrow technical sense. Michael SPERBERG-McQUEEN made a forceful -presentation on the Text Encoding Initiative's (TEI) implementation of -the Standard Generalized Markup Language (SGML). His ideas were echoed -by Susan HOCKEY, Elli MYLONAS, and Stuart WEIBEL. While the -presentations made by the TEI advocates contained no practicum, their -discussion focused on the value of the finished product, what the -European Community calls reusability, but what may also be termed -durability. They argued that marking up--that is, coding--a text in a -well-conceived way will permit it to be moved from one computer -environment to another, as well as to be used by various users. Two -kinds of markup were distinguished: 1) procedural markup, which -describes the features of a text (e.g., dots on a page), and 2) -descriptive markup, which describes the structure or elements of a -document (e.g., chapters, paragraphs, and front matter). - -The TEI proponents emphasized the importance of texts to scholarship. -They explained how heavily coded (and thus analyzed and annotated) texts -can underlie research, play a role in scholarly communication, and -facilitate classroom teaching. SPERBERG-McQUEEN reminded listeners that -a written or printed item (e.g., a particular edition of a book) is -merely a representation of the abstraction we call a text. To concern -ourselves with faithfully reproducing a printed instance of the text, -SPERBERG-McQUEEN argued, is to concern ourselves with the representation -of a representation ("images as simulacra for the text"). The TEI proponents' -interest in images tends to focus on corollary materials for use in teaching, -for example, photographs of the Acropolis to accompany a Greek text. - -By the end of the Workshop, SPERBERG-McQUEEN confessed to having been -converted to a limited extent to the view that electronic images -constitute a promising alternative to microfilming; indeed, an -alternative probably superior to microfilming. But he was not convinced -that electronic images constitute a serious attempt to represent text in -electronic form. HOCKEY and MYLONAS also conceded that their experience -at the Pierce Symposium the previous week at Georgetown University and -the present conference at the Library of Congress had compelled them to -reevaluate their perspective on the usefulness of text as images. -Attendees could see that the text and image advocates were in -constructive tension, so to say. - -Three nonTEI presentations described approaches to preparing -machine-readable text that are less rigorous and thus less expensive. In -the case of the Papers of George Washington, Dorothy TWOHIG explained -that the digital version will provide a not-quite-perfect rendering of -the transcribed text--some 135,000 documents, available for research -during the decades while the perfect or print version is completed. -Members of the American Memory team and the staff of NAL's Text -Digitization Program (see below) also outlined a middle ground concerning -searchable texts. In the case of American Memory, contractors produce -texts with about 99-percent accuracy that serve as "browse" or -"reference" versions of written or printed originals. End users who need -faithful copies or perfect renditions must refer to accompanying sets of -digital facsimile images or consult copies of the originals in a nearby -library or archive. American Memory staff argued that the high cost of -producing 100-percent accurate copies would prevent LC from offering -access to large parts of its collections. - - -THE MACHINE-READABLE TEXT: METHODS OF CONVERSION - -Although the Workshop did not include a systematic examination of the -methods for converting texts from paper (or from facsimile images) into -machine-readable form, nevertheless, various speakers touched upon this -matter. For example, WEIBEL reported that OCLC has experimented with a -merging of multiple optical character recognition systems that will -reduce errors from an unacceptable rate of 5 characters out of every -l,000 to an unacceptable rate of 2 characters out of every l,000. - -Pamela ANDRE presented an overview of NAL's Text Digitization Program and -Judith ZIDAR discussed the technical details. ZIDAR explained how NAL -purchased hardware and software capable of performing optical character -recognition (OCR) and text conversion and used its own staff to convert -texts. The process, ZIDAR said, required extensive editing and project -staff found themselves considering alternatives, including rekeying -and/or creating abstracts or summaries of texts. NAL reckoned costs at -$7 per page. By way of contrast, Ricky ERWAY explained that American -Memory had decided from the start to contract out conversion to external -service bureaus. The criteria used to select these contractors were cost -and quality of results, as opposed to methods of conversion. ERWAY noted -that historical documents or books often do not lend themselves to OCR. -Bound materials represent a special problem. In her experience, quality -control--inspecting incoming materials, counting errors in samples--posed -the most time-consuming aspect of contracting out conversion. ERWAY -reckoned American Memory's costs at $4 per page, but cautioned that fewer -cost-elements had been included than in NAL's figure. - - -OPTIONS FOR DISSEMINATION - -The topic of dissemination proper emerged at various points during the -Workshop. At the session devoted to national and international computer -networks, LYNCH, Howard BESSER, Ronald LARSEN, and Edwin BROWNRIGG -highlighted the virtues of Internet today and of the network that will -evolve from Internet. Listeners could discern in these narratives a -vision of an information democracy in which millions of citizens freely -find and use what they need. LYNCH noted that a lack of standards -inhibits disseminating multimedia on the network, a topic also discussed -by BESSER. LARSEN addressed the issues of network scalability and -modularity and commented upon the difficulty of anticipating the effects -of growth in orders of magnitude. BROWNRIGG talked about the ability of -packet radio to provide certain links in a network without the need for -wiring. However, the presenters also called attention to the -shortcomings and incongruities of present-day computer networks. For -example: 1) Network use is growing dramatically, but much network -traffic consists of personal communication (E-mail). 2) Large bodies of -information are available, but a user's ability to search across their -entirety is limited. 3) There are significant resources for science and -technology, but few network sources provide content in the humanities. -4) Machine-readable texts are commonplace, but the capability of the -system to deal with images (let alone other media formats) lags behind. -A glimpse of a multimedia future for networks, however, was provided by -Maria LEBRON in her overview of the Online Journal of Current Clinical -Trials (OJCCT), and the process of scholarly publishing on-line. - -The contrasting form of the CD-ROM disk was never systematically -analyzed, but attendees could glean an impression from several of the -show-and-tell presentations. The Perseus and American Memory examples -demonstrated recently published disks, while the descriptions of the -IBYCUS version of the Papers of George Washington and Chadwyck-Healey's -Patrologia Latina Database (PLD) told of disks to come. According to -Eric CALALUCA, PLD's principal focus has been on converting Jacques-Paul -Migne's definitive collection of Latin texts to machine-readable form. -Although everyone could share the network advocates' enthusiasm for an -on-line future, the possibility of rolling up one's sleeves for a session -with a CD-ROM containing both textual materials and a powerful retrieval -engine made the disk seem an appealing vessel indeed. The overall -discussion suggested that the transition from CD-ROM to on-line networked -access may prove far slower and more difficult than has been anticipated. - - -WHO ARE THE USERS AND WHAT DO THEY DO? - -Although concerned with the technicalities of production, the Workshop -never lost sight of the purposes and uses of electronic versions of -textual materials. As noted above, those interested in imaging discussed -the problematical matter of digital preservation, while the TEI proponents -described how machine-readable texts can be used in research. This latter -topic received thorough treatment in the paper read by Avra MICHELSON. -She placed the phenomenon of electronic texts within the context of -broader trends in information technology and scholarly communication. - -Among other things, MICHELSON described on-line conferences that -represent a vigorous and important intellectual forum for certain -disciplines. Internet now carries more than 700 conferences, with about -80 percent of these devoted to topics in the social sciences and the -humanities. Other scholars use on-line networks for "distance learning." -Meanwhile, there has been a tremendous growth in end-user computing; -professors today are less likely than their predecessors to ask the -campus computer center to process their data. Electronic texts are one -key to these sophisticated applications, MICHELSON reported, and more and -more scholars in the humanities now work in an on-line environment. -Toward the end of the Workshop, Michael LESK presented a corollary to -MICHELSON's talk, reporting the results of an experiment that compared -the work of one group of chemistry students using traditional printed -texts and two groups using electronic sources. The experiment -demonstrated that in the event one does not know what to read, one needs -the electronic systems; the electronic systems hold no advantage at the -moment if one knows what to read, but neither do they impose a penalty. - -DALY provided an anecdotal account of the revolutionizing impact of the -new technology on his previous methods of research in the field of classics. -His account, by extrapolation, served to illustrate in part the arguments -made by MICHELSON concerning the positive effects of the sudden and radical -transformation being wrought in the ways scholars work. - -Susan VECCIA and Joanne FREEMAN delineated the use of electronic -materials outside the university. The most interesting aspect of their -use, FREEMAN said, could be seen as a paradox: teachers in elementary -and secondary schools requested access to primary source materials but, -at the same time, found that "primariness" itself made these materials -difficult for their students to use. - - -OTHER TOPICS - -Marybeth PETERS reviewed copyright law in the United States and offered -advice during a lively discussion of this subject. But uncertainty -remains concerning the price of copyright in a digital medium, because a -solution remains to be worked out concerning management and synthesis of -copyrighted and out-of-copyright pieces of a database. - -As moderator of the final session of the Workshop, Prosser GIFFORD directed -discussion to future courses of action and the potential role of LC in -advancing them. Among the recommendations that emerged were the following: - - * Workshop participants should 1) begin to think about working - with image material, but structure and digitize it in such a - way that at a later stage it can be interpreted into text, and - 2) find a common way to build text and images together so that - they can be used jointly at some stage in the future, with - appropriate network support, because that is how users will want - to access these materials. The Library might encourage attempts - to bring together people who are working on texts and images. - - * A network version of American Memory should be developed or - consideration should be given to making the data in it - available to people interested in doing network multimedia. - Given the current dearth of digital data that is appealing and - unencumbered by extremely complex rights problems, developing a - network version of American Memory could do much to help make - network multimedia a reality. - - * Concerning the thorny issue of electronic deposit, LC should - initiate a catalytic process in terms of distributed - responsibility, that is, bring together the distributed - organizations and set up a study group to look at all the - issues related to electronic deposit and see where we as a - nation should move. For example, LC might attempt to persuade - one major library in each state to deal with its state - equivalent publisher, which might produce a cooperative project - that would be equitably distributed around the country, and one - in which LC would be dealing with a minimal number of publishers - and minimal copyright problems. LC must also deal with the - concept of on-line publishing, determining, among other things, - how serials such as OJCCT might be deposited for copyright. - - * Since a number of projects are planning to carry out - preservation by creating digital images that will end up in - on-line or near-line storage at some institution, LC might play - a helpful role, at least in the near term, by accelerating how - to catalog that information into the Research Library Information - Network (RLIN) and then into OCLC, so that it would be accessible. - This would reduce the possibility of multiple institutions digitizing - the same work. - - -CONCLUSION - -The Workshop was valuable because it brought together partisans from -various groups and provided an occasion to compare goals and methods. -The more committed partisans frequently communicate with others in their -groups, but less often across group boundaries. The Workshop was also -valuable to attendees--including those involved with American Memory--who -came less committed to particular approaches or concepts. These -attendees learned a great deal, and plan to select and employ elements of -imaging, text-coding, and networked distribution that suit their -respective projects and purposes. - -Still, reality rears its ugly head: no breakthrough has been achieved. -On the imaging side, one confronts a proliferation of competing -data-interchange standards and a lack of consensus on the role of digital -facsimiles in preservation. In the realm of machine-readable texts, one -encounters a reasonably mature standard but methodological difficulties -and high costs. These latter problems, of course, represent a special -impediment to the desire, as it is sometimes expressed in the popular -press, "to put the [contents of the] Library of Congress on line." In -the words of one participant, there was "no solution to the economic -problems--the projects that are out there are surviving, but it is going -to be a lot of work to transform the information industry, and so far the -investment to do that is not forthcoming" (LESK, per litteras). - - - *** *** *** ****** *** *** *** - - - PROCEEDINGS - - -WELCOME - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -GIFFORD * Origin of Workshop in current Librarian's desire to make LC's -collections more widely available * Desiderata arising from the prospect -of greater interconnectedness * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -After welcoming participants on behalf of the Library of Congress, -American Memory (AM), and the National Demonstration Lab, Prosser -GIFFORD, director for scholarly programs, Library of Congress, located -the origin of the Workshop on Electronic Texts in a conversation he had -had considerably more than a year ago with Carl FLEISCHHAUER concerning -some of the issues faced by AM. On the assumption that numerous other -people were asking the same questions, the decision was made to bring -together as many of these people as possible to ask the same questions -together. In a deeper sense, GIFFORD said, the origin of the Workshop -lay in the desire of the current Librarian of Congress, James H. -Billington, to make the collections of the Library, especially those -offering unique or unusual testimony on aspects of the American -experience, available to a much wider circle of users than those few -people who can come to Washington to use them. This meant that the -emphasis of AM, from the outset, has been on archival collections of the -basic material, and on making these collections themselves available, -rather than selected or heavily edited products. - -From AM's emphasis followed the questions with which the Workshop began: -who will use these materials, and in what form will they wish to use -them. But an even larger issue deserving mention, in GIFFORD's view, was -the phenomenal growth in Internet connectivity. He expressed the hope -that the prospect of greater interconnectedness than ever before would -lead to: 1) much more cooperative and mutually supportive endeavors; 2) -development of systems of shared and distributed responsibilities to -avoid duplication and to ensure accuracy and preservation of unique -materials; and 3) agreement on the necessary standards and development of -the appropriate directories and indices to make navigation -straightforward among the varied resources that are, and increasingly -will be, available. In this connection, GIFFORD requested that -participants reflect from the outset upon the sorts of outcomes they -thought the Workshop might have. Did those present constitute a group -with sufficient common interests to propose a next step or next steps, -and if so, what might those be? They would return to these questions the -following afternoon. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -FLEISCHHAUER * Core of Workshop concerns preparation and production of -materials * Special challenge in conversion of textual materials * -Quality versus quantity * Do the several groups represented share common -interests? * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Carl FLEISCHHAUER, coordinator, American Memory, Library of Congress, -emphasized that he would attempt to represent the people who perform some -of the work of converting or preparing materials and that the core of -the Workshop had to do with preparation and production. FLEISCHHAUER -then drew a distinction between the long term, when many things would be -available and connected in the ways that GIFFORD described, and the short -term, in which AM not only has wrestled with the issue of what is the -best course to pursue but also has faced a variety of technical -challenges. - -FLEISCHHAUER remarked AM's endeavors to deal with a wide range of library -formats, such as motion picture collections, sound-recording collections, -and pictorial collections of various sorts, especially collections of -photographs. In the course of these efforts, AM kept coming back to -textual materials--manuscripts or rare printed matter, bound materials, -etc. Text posed the greatest conversion challenge of all. Thus, the -genesis of the Workshop, which reflects the problems faced by AM. These -problems include physical problems. For example, those in the library -and archive business deal with collections made up of fragile and rare -manuscript items, bound materials, especially the notoriously brittle -bound materials of the late nineteenth century. These are precious -cultural artifacts, however, as well as interesting sources of -information, and LC desires to retain and conserve them. AM needs to -handle things without damaging them. Guillotining a book to run it -through a sheet feeder must be avoided at all costs. - -Beyond physical problems, issues pertaining to quality arose. For -example, the desire to provide users with a searchable text is affected -by the question of acceptable level of accuracy. One hundred percent -accuracy is tremendously expensive. On the other hand, the output of -optical character recognition (OCR) can be tremendously inaccurate. -Although AM has attempted to find a middle ground, uncertainty persists -as to whether or not it has discovered the right solution. - -Questions of quality arose concerning images as well. FLEISCHHAUER -contrasted the extremely high level of quality of the digital images in -the Cornell Xerox Project with AM's efforts to provide a browse-quality -or access-quality image, as opposed to an archival or preservation image. -FLEISCHHAUER therefore welcomed the opportunity to compare notes. - -FLEISCHHAUER observed in passing that conversations he had had about -networks have begun to signal that for various forms of media a -determination may be made that there is a browse-quality item, or a -distribution-and-access-quality item that may coexist in some systems -with a higher quality archival item that would be inconvenient to send -through the network because of its size. FLEISCHHAUER referred, of -course, to images more than to searchable text. - -As AM considered those questions, several conceptual issues arose: ought -AM occasionally to reproduce materials entirely through an image set, at -other times, entirely through a text set, and in some cases, a mix? -There probably would be times when the historical authenticity of an -artifact would require that its image be used. An image might be -desirable as a recourse for users if one could not provide 100-percent -accurate text. Again, AM wondered, as a practical matter, if a -distinction could be drawn between rare printed matter that might exist -in multiple collections--that is, in ten or fifteen libraries. In such -cases, the need for perfect reproduction would be less than for unique -items. Implicit in his remarks, FLEISCHHAUER conceded, was the admission -that AM has been tilting strongly towards quantity and drawing back a -little from perfect quality. That is, it seemed to AM that society would -be better served if more things were distributed by LC--even if they were -not quite perfect--than if fewer things, perfectly represented, were -distributed. This was stated as a proposition to be tested, with -responses to be gathered from users. - -In thinking about issues related to reproduction of materials and seeing -other people engaged in parallel activities, AM deemed it useful to -convene a conference. Hence, the Workshop. FLEISCHHAUER thereupon -surveyed the several groups represented: 1) the world of images (image -users and image makers); 2) the world of text and scholarship and, within -this group, those concerned with language--FLEISCHHAUER confessed to finding -delightful irony in the fact that some of the most advanced thinkers on -computerized texts are those dealing with ancient Greek and Roman materials; -3) the network world; and 4) the general world of library science, which -includes people interested in preservation and cataloging. - -FLEISCHHAUER concluded his remarks with special thanks to the David and -Lucile Packard Foundation for its support of the meeting, the American -Memory group, the Office for Scholarly Programs, the National -Demonstration Lab, and the Office of Special Events. He expressed the -hope that David Woodley Packard might be able to attend, noting that -Packard's work and the work of the foundation had sponsored a number of -projects in the text area. - - ****** - -SESSION I. CONTENT IN A NEW FORM: WHO WILL USE IT AND WHAT WILL THEY DO? - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DALY * Acknowledgements * A new Latin authors disk * Effects of the new -technology on previous methods of research * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Serving as moderator, James DALY acknowledged the generosity of all the -presenters for giving of their time, counsel, and patience in planning -the Workshop, as well as of members of the American Memory project and -other Library of Congress staff, and the David and Lucile Packard -Foundation and its executive director, Colburn S. Wilbur. - -DALY then recounted his visit in March to the Center for Electronic Texts -in the Humanities (CETH) and the Department of Classics at Rutgers -University, where an old friend, Lowell Edmunds, introduced him to the -department's IBYCUS scholarly personal computer, and, in particular, the -new Latin CD-ROM, containing, among other things, almost all classical -Latin literary texts through A.D. 200. Packard Humanities Institute -(PHI), Los Altos, California, released this disk late in 1991, with a -nominal triennial licensing fee. - -Playing with the disk for an hour or so at Rutgers brought home to DALY -at once the revolutionizing impact of the new technology on his previous -methods of research. Had this disk been available two or three years -earlier, DALY contended, when he was engaged in preparing a commentary on -Book 10 of Virgil's Aeneid for Cambridge University Press, he would not -have required a forty-eight-square-foot table on which to spread the -numerous, most frequently consulted items, including some ten or twelve -concordances to key Latin authors, an almost equal number of lexica to -authors who lacked concordances, and where either lexica or concordances -were lacking, numerous editions of authors antedating and postdating Virgil. - -Nor, when checking each of the average six to seven words contained in -the Virgilian hexameter for its usage elsewhere in Virgil's works or -other Latin authors, would DALY have had to maintain the laborious -mechanical process of flipping through these concordances, lexica, and -editions each time. Nor would he have had to frequent as often the -Milton S. Eisenhower Library at the Johns Hopkins University to consult -the Thesaurus Linguae Latinae. Instead of devoting countless hours, or -the bulk of his research time, to gathering data concerning Virgil's use -of words, DALY--now freed by PHI's Latin authors disk from the -tyrannical, yet in some ways paradoxically happy scholarly drudgery-- -would have been able to devote that same bulk of time to analyzing and -interpreting Virgilian verbal usage. - -Citing Theodore Brunner, Gregory Crane, Elli MYLONAS, and Avra MICHELSON, -DALY argued that this reversal in his style of work, made possible by the -new technology, would perhaps have resulted in better, more productive -research. Indeed, even in the course of his browsing the Latin authors -disk at Rutgers, its powerful search, retrieval, and highlighting -capabilities suggested to him several new avenues of research into -Virgil's use of sound effects. This anecdotal account, DALY maintained, -may serve to illustrate in part the sudden and radical transformation -being wrought in the ways scholars work. - - ****** - -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -MICHELSON * Elements related to scholarship and technology * Electronic -texts within the context of broader trends within information technology -and scholarly communication * Evaluation of the prospects for the use of -electronic texts * Relationship of electronic texts to processes of -scholarly communication in humanities research * New exchange formats -created by scholars * Projects initiated to increase scholarly access to -converted text * Trend toward making electronic resources available -through research and education networks * Changes taking place in -scholarly communication among humanities scholars * Network-mediated -scholarship transforming traditional scholarly practices * Key -information technology trends affecting the conduct of scholarly -communication over the next decade * The trend toward end-user computing -* The trend toward greater connectivity * Effects of these trends * Key -transformations taking place * Summary of principal arguments * -++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Avra MICHELSON, Archival Research and Evaluation Staff, National Archives -and Records Administration (NARA), argued that establishing who will use -electronic texts and what they will use them for involves a consideration -of both information technology and scholarship trends. This -consideration includes several elements related to scholarship and -technology: 1) the key trends in information technology that are most -relevant to scholarship; 2) the key trends in the use of currently -available technology by scholars in the nonscientific community; and 3) -the relationship between these two very distinct but interrelated trends. -The investment in understanding this relationship being made by -information providers, technologists, and public policy developers, as -well as by scholars themselves, seems to be pervasive and growing, -MICHELSON contended. She drew on collaborative work with Jeff Rothenberg -on the scholarly use of technology. - -MICHELSON sought to place the phenomenon of electronic texts within the -context of broader trends within information technology and scholarly -communication. She argued that electronic texts are of most use to -researchers to the extent that the researchers' working context (i.e., -their relevant bibliographic sources, collegial feedback, analytic tools, -notes, drafts, etc.), along with their field's primary and secondary -sources, also is accessible in electronic form and can be integrated in -ways that are unique to the on-line environment. - -Evaluation of the prospects for the use of electronic texts includes two -elements: 1) an examination of the ways in which researchers currently -are using electronic texts along with other electronic resources, and 2) -an analysis of key information technology trends that are affecting the -long-term conduct of scholarly communication. MICHELSON limited her -discussion of the use of electronic texts to the practices of humanists -and noted that the scientific community was outside the panel's overview. - -MICHELSON examined the nature of the current relationship of electronic -texts in particular, and electronic resources in general, to what she -maintained were, essentially, five processes of scholarly communication -in humanities research. Researchers 1) identify sources, 2) communicate -with their colleagues, 3) interpret and analyze data, 4) disseminate -their research findings, and 5) prepare curricula to instruct the next -generation of scholars and students. This examination would produce a -clearer understanding of the synergy among these five processes that -fuels the tendency of the use of electronic resources for one process to -stimulate its use for other processes of scholarly communication. - -For the first process of scholarly communication, the identification of -sources, MICHELSON remarked the opportunity scholars now enjoy to -supplement traditional word-of-mouth searches for sources among their -colleagues with new forms of electronic searching. So, for example, -instead of having to visit the library, researchers are able to explore -descriptions of holdings in their offices. Furthermore, if their own -institutions' holdings prove insufficient, scholars can access more than -200 major American library catalogues over Internet, including the -universities of California, Michigan, Pennsylvania, and Wisconsin. -Direct access to the bibliographic databases offers intellectual -empowerment to scholars by presenting a comprehensive means of browsing -through libraries from their homes and offices at their convenience. - -The second process of communication involves communication among -scholars. Beyond the most common methods of communication, scholars are -using E-mail and a variety of new electronic communications formats -derived from it for further academic interchange. E-mail exchanges are -growing at an astonishing rate, reportedly 15 percent a month. They -currently constitute approximately half the traffic on research and -education networks. Moreover, the global spread of E-mail has been so -rapid that it is now possible for American scholars to use it to -communicate with colleagues in close to 140 other countries. - -Other new exchange formats created by scholars and operating on Internet -include more than 700 conferences, with about 80 percent of these devoted -to topics in the social sciences and humanities. The rate of growth of -these scholarly electronic conferences also is astonishing. From l990 to -l991, 200 new conferences were identified on Internet. From October 1991 -to June 1992, an additional 150 conferences in the social sciences and -humanities were added to this directory of listings. Scholars have -established conferences in virtually every field, within every different -discipline. For example, there are currently close to 600 active social -science and humanities conferences on topics such as art and -architecture, ethnomusicology, folklore, Japanese culture, medical -education, and gifted and talented education. The appeal to scholars of -communicating through these conferences is that, unlike any other medium, -electronic conferences today provide a forum for global communication -with peers at the front end of the research process. - -Interpretation and analysis of sources constitutes the third process of -scholarly communication that MICHELSON discussed in terms of texts and -textual resources. The methods used to analyze sources fall somewhere on -a continuum from quantitative analysis to qualitative analysis. -Typically, evidence is culled and evaluated using methods drawn from both -ends of this continuum. At one end, quantitative analysis involves the -use of mathematical processes such as a count of frequencies and -distributions of occurrences or, on a higher level, regression analysis. -At the other end of the continuum, qualitative analysis typically -involves nonmathematical processes oriented toward language -interpretation or the building of theory. Aspects of this work involve -the processing--either manual or computational--of large and sometimes -massive amounts of textual sources, although the use of nontextual -sources as evidence, such as photographs, sound recordings, film footage, -and artifacts, is significant as well. - -Scholars have discovered that many of the methods of interpretation and -analysis that are related to both quantitative and qualitative methods -are processes that can be performed by computers. For example, computers -can count. They can count brush strokes used in a Rembrandt painting or -perform regression analysis for understanding cause and effect. By means -of advanced technologies, computers can recognize patterns, analyze text, -and model concepts. Furthermore, computers can complete these processes -faster with more sources and with greater precision than scholars who -must rely on manual interpretation of data. But if scholars are to use -computers for these processes, source materials must be in a form -amenable to computer-assisted analysis. For this reason many scholars, -once they have identified the sources that are key to their research, are -converting them to machine-readable form. Thus, a representative example -of the numerous textual conversion projects organized by scholars around -the world in recent years to support computational text analysis is the -TLG, the Thesaurus Linguae Graecae. This project is devoted to -converting the extant ancient texts of classical Greece. (Editor's note: -according to the TLG Newsletter of May l992, TLG was in use in thirty-two -different countries. This figure updates MICHELSON's previous count by one.) - -The scholars performing these conversions have been asked to recognize -that the electronic sources they are converting for one use possess value -for other research purposes as well. As a result, during the past few -years, humanities scholars have initiated a number of projects to -increase scholarly access to converted text. So, for example, the Text -Encoding Initiative (TEI), about which more is said later in the program, -was established as an effort by scholars to determine standard elements -and methods for encoding machine-readable text for electronic exchange. -In a second effort to facilitate the sharing of converted text, scholars -have created a new institution, the Center for Electronic Texts in the -Humanities (CETH). The center estimates that there are 8,000 series of -source texts in the humanities that have been converted to -machine-readable form worldwide. CETH is undertaking an international -search for converted text in the humanities, compiling it into an -electronic library, and preparing bibliographic descriptions of the -sources for the Research Libraries Information Network's (RLIN) -machine-readable data file. The library profession has begun to initiate -large conversion projects as well, such as American Memory. - -While scholars have been making converted text available to one another, -typically on disk or on CD-ROM, the clear trend is toward making these -resources available through research and education networks. Thus, the -American and French Research on the Treasury of the French Language -(ARTFL) and the Dante Project are already available on Internet. -MICHELSON summarized this section on interpretation and analysis by -noting that: 1) increasing numbers of humanities scholars in the library -community are recognizing the importance to the advancement of -scholarship of retrospective conversion of source materials in the arts -and humanities; and 2) there is a growing realization that making the -sources available on research and education networks maximizes their -usefulness for the analysis performed by humanities scholars. - -The fourth process of scholarly communication is dissemination of -research findings, that is, publication. Scholars are using existing -research and education networks to engineer a new type of publication: -scholarly-controlled journals that are electronically produced and -disseminated. Although such journals are still emerging as a -communication format, their number has grown, from approximately twelve -to thirty-six during the past year (July 1991 to June 1992). Most of -these electronic scholarly journals are devoted to topics in the -humanities. As with network conferences, scholarly enthusiasm for these -electronic journals stems from the medium's unique ability to advance -scholarship in a way that no other medium can do by supporting global -feedback and interchange, practically in real time, early in the research -process. Beyond scholarly journals, MICHELSON remarked the delivery of -commercial full-text products, such as articles in professional journals, -newsletters, magazines, wire services, and reference sources. These are -being delivered via on-line local library catalogues, especially through -CD-ROMs. Furthermore, according to MICHELSON, there is general optimism -that the copyright and fees issues impeding the delivery of full text on -existing research and education networks soon will be resolved. - -The final process of scholarly communication is curriculum development -and instruction, and this involves the use of computer information -technologies in two areas. The first is the development of -computer-oriented instructional tools, which includes simulations, -multimedia applications, and computer tools that are used to assist in -the analysis of sources in the classroom, etc. The Perseus Project, a -database that provides a multimedia curriculum on classical Greek -civilization, is a good example of the way in which entire curricula are -being recast using information technologies. It is anticipated that the -current difficulty in exchanging electronically computer-based -instructional software, which in turn makes it difficult for one scholar -to build upon the work of others, will be resolved before too long. -Stand-alone curricular applications that involve electronic text will be -sharable through networks, reinforcing their significance as intellectual -products as well as instructional tools. - -The second aspect of electronic learning involves the use of research and -education networks for distance education programs. Such programs -interactively link teachers with students in geographically scattered -locations and rely on the availability of electronic instructional -resources. Distance education programs are gaining wide appeal among -state departments of education because of their demonstrated capacity to -bring advanced specialized course work and an array of experts to many -classrooms. A recent report found that at least 32 states operated at -least one statewide network for education in 1991, with networks under -development in many of the remaining states. - -MICHELSON summarized this section by noting two striking changes taking -place in scholarly communication among humanities scholars. First is the -extent to which electronic text in particular, and electronic resources -in general, are being infused into each of the five processes described -above. As mentioned earlier, there is a certain synergy at work here. -The use of electronic resources for one process tends to stimulate its -use for other processes, because the chief course of movement is toward a -comprehensive on-line working context for humanities scholars that -includes on-line availability of key bibliographies, scholarly feedback, -sources, analytical tools, and publications. MICHELSON noted further -that the movement toward a comprehensive on-line working context for -humanities scholars is not new. In fact, it has been underway for more -than forty years in the humanities, since Father Roberto Busa began -developing an electronic concordance of the works of Saint Thomas Aquinas -in 1949. What we are witnessing today, MICHELSON contended, is not the -beginning of this on-line transition but, for at least some humanities -scholars, the turning point in the transition from a print to an -electronic working context. Coinciding with the on-line transition, the -second striking change is the extent to which research and education -networks are becoming the new medium of scholarly communication. The -existing Internet and the pending National Education and Research Network -(NREN) represent the new meeting ground where scholars are going for -bibliographic information, scholarly dialogue and feedback, the most -current publications in their field, and high-level educational -offerings. Traditional scholarly practices are undergoing tremendous -transformations as a result of the emergence and growing prominence of -what is called network-mediated scholarship. - -MICHELSON next turned to the second element of the framework she proposed -at the outset of her talk for evaluating the prospects for electronic -text, namely the key information technology trends affecting the conduct -of scholarly communication over the next decade: 1) end-user computing -and 2) connectivity. - -End-user computing means that the person touching the keyboard, or -performing computations, is the same as the person who initiates or -consumes the computation. The emergence of personal computers, along -with a host of other forces, such as ubiquitous computing, advances in -interface design, and the on-line transition, is prompting the consumers -of computation to do their own computing, and is thus rendering obsolete -the traditional distinction between end users and ultimate users. - -The trend toward end-user computing is significant to consideration of -the prospects for electronic texts because it means that researchers are -becoming more adept at doing their own computations and, thus, more -competent in the use of electronic media. By avoiding programmer -intermediaries, computation is becoming central to the researcher's -thought process. This direct involvement in computing is changing the -researcher's perspective on the nature of research itself, that is, the -kinds of questions that can be posed, the analytical methodologies that -can be used, the types and amount of sources that are appropriate for -analyses, and the form in which findings are presented. The trend toward -end-user computing means that, increasingly, electronic media and -computation are being infused into all processes of humanities -scholarship, inspiring remarkable transformations in scholarly -communication. - -The trend toward greater connectivity suggests that researchers are using -computation increasingly in network environments. Connectivity is -important to scholarship because it erases the distance that separates -students from teachers and scholars from their colleagues, while allowing -users to access remote databases, share information in many different -media, connect to their working context wherever they are, and -collaborate in all phases of research. - -The combination of the trend toward end-user computing and the trend -toward connectivity suggests that the scholarly use of electronic -resources, already evident among some researchers, will soon become an -established feature of scholarship. The effects of these trends, along -with ongoing changes in scholarly practices, point to a future in which -humanities researchers will use computation and electronic communication -to help them formulate ideas, access sources, perform research, -collaborate with colleagues, seek peer review, publish and disseminate -results, and engage in many other professional and educational activities. - -In summary, MICHELSON emphasized four points: 1) A portion of humanities -scholars already consider electronic texts the preferred format for -analysis and dissemination. 2) Scholars are using these electronic -texts, in conjunction with other electronic resources, in all the -processes of scholarly communication. 3) The humanities scholars' -working context is in the process of changing from print technology to -electronic technology, in many ways mirroring transformations that have -occurred or are occurring within the scientific community. 4) These -changes are occurring in conjunction with the development of a new -communication medium: research and education networks that are -characterized by their capacity to advance scholarship in a wholly unique -way. - -MICHELSON also reiterated her three principal arguments: l) Electronic -texts are best understood in terms of the relationship to other -electronic resources and the growing prominence of network-mediated -scholarship. 2) The prospects for electronic texts lie in their capacity -to be integrated into the on-line network of electronic resources that -comprise the new working context for scholars. 3) Retrospective conversion -of portions of the scholarly record should be a key strategy as information -providers respond to changes in scholarly communication practices. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -VECCIA * AM's evaluation project and public users of electronic resources -* AM and its design * Site selection and evaluating the Macintosh -implementation of AM * Characteristics of the six public libraries -selected * Characteristics of AM's users in these libraries * Principal -ways AM is being used * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Susan VECCIA, team leader, and Joanne FREEMAN, associate coordinator, -American Memory, Library of Congress, gave a joint presentation. First, -by way of introduction, VECCIA explained her and FREEMAN's roles in -American Memory (AM). Serving principally as an observer, VECCIA has -assisted with the evaluation project of AM, placing AM collections in a -variety of different sites around the country and helping to organize and -implement that project. FREEMAN has been an associate coordinator of AM -and has been involved principally with the interpretative materials, -preparing some of the electronic exhibits and printed historical -information that accompanies AM and that is requested by users. VECCIA -and FREEMAN shared anecdotal observations concerning AM with public users -of electronic resources. Notwithstanding a fairly structured evaluation -in progress, both VECCIA and FREEMAN chose not to report on specifics in -terms of numbers, etc., because they felt it was too early in the -evaluation project to do so. - -AM is an electronic archive of primary source materials from the Library -of Congress, selected collections representing a variety of formats-- -photographs, graphic arts, recorded sound, motion pictures, broadsides, -and soon, pamphlets and books. In terms of the design of this system, -the interpretative exhibits have been kept separate from the primary -resources, with good reason. Accompanying this collection are printed -documentation and user guides, as well as guides that FREEMAN prepared for -teachers so that they may begin using the content of the system at once. - -VECCIA described the evaluation project before talking about the public -users of AM, limiting her remarks to public libraries, because FREEMAN -would talk more specifically about schools from kindergarten to twelfth -grade (K-12). Having started in spring 1991, the evaluation currently -involves testing of the Macintosh implementation of AM. Since the -primary goal of this evaluation is to determine the most appropriate -audience or audiences for AM, very different sites were selected. This -makes evaluation difficult because of the varying degrees of technology -literacy among the sites. AM is situated in forty-four locations, of -which six are public libraries and sixteen are schools. Represented -among the schools are elementary, junior high, and high schools. -District offices also are involved in the evaluation, which will -conclude in summer 1993. - -VECCIA focused the remainder of her talk on the six public libraries, one -of which doubles as a state library. They represent a range of -geographic areas and a range of demographic characteristics. For -example, three are located in urban settings, two in rural settings, and -one in a suburban setting. A range of technical expertise is to be found -among these facilities as well. For example, one is an "Apple library of -the future," while two others are rural one-room libraries--in one, AM -sits at the front desk next to a tractor manual. - -All public libraries have been extremely enthusiastic, supportive, and -appreciative of the work that AM has been doing. VECCIA characterized -various users: Most users in public libraries describe themselves as -general readers; of the students who use AM in the public libraries, -those in fourth grade and above seem most interested. Public libraries -in rural sites tend to attract retired people, who have been highly -receptive to AM. Users tend to fall into two additional categories: -people interested in the content and historical connotations of these -primary resources, and those fascinated by the technology. The format -receiving the most comments has been motion pictures. The adult users in -public libraries are more comfortable with IBM computers, whereas young -people seem comfortable with either IBM or Macintosh, although most of -them seem to come from a Macintosh background. This same tendency is -found in the schools. - -What kinds of things do users do with AM? In a public library there are -two main goals or ways that AM is being used: as an individual learning -tool, and as a leisure activity. Adult learning was one area that VECCIA -would highlight as a possible application for a tool such as AM. She -described a patron of a rural public library who comes in every day on -his lunch hour and literally reads AM, methodically going through the -collection image by image. At the end of his hour he makes an electronic -bookmark, puts it in his pocket, and returns to work. The next day he -comes in and resumes where he left off. Interestingly, this man had -never been in the library before he used AM. In another small, rural -library, the coordinator reports that AM is a popular activity for some -of the older, retired people in the community, who ordinarily would not -use "those things,"--computers. Another example of adult learning in -public libraries is book groups, one of which, in particular, is using AM -as part of its reading on industrialization, integration, and urbanization -in the early 1900s. - -One library reports that a family is using AM to help educate their -children. In another instance, individuals from a local museum came in -to use AM to prepare an exhibit on toys of the past. These two examples -emphasize the mission of the public library as a cultural institution, -reaching out to people who do not have the same resources available to -those who live in a metropolitan area or have access to a major library. -One rural library reports that junior high school students in large -numbers came in one afternoon to use AM for entertainment. A number of -public libraries reported great interest among postcard collectors in the -Detroit collection, which was essentially a collection of images used on -postcards around the turn of the century. Train buffs are similarly -interested because that was a time of great interest in railroading. -People, it was found, relate to things that they know of firsthand. For -example, in both rural public libraries where AM was made available, -observers reported that the older people with personal remembrances of -the turn of the century were gravitating to the Detroit collection. -These examples served to underscore MICHELSON's observation re the -integration of electronic tools and ideas--that people learn best when -the material relates to something they know. - -VECCIA made the final point that in many cases AM serves as a -public-relations tool for the public libraries that are testing it. In -one case, AM is being used as a vehicle to secure additional funding for -the library. In another case, AM has served as an inspiration to the -staff of a major local public library in the South to think about ways to -make its own collection of photographs more accessible to the public. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -FREEMAN * AM and archival electronic resources in a school environment * -Questions concerning context * Questions concerning the electronic format -itself * Computer anxiety * Access and availability of the system * -Hardware * Strengths gained through the use of archival resources in -schools * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Reiterating an observation made by VECCIA, that AM is an archival -resource made up of primary materials with very little interpretation, -FREEMAN stated that the project has attempted to bridge the gap between -these bare primary materials and a school environment, and in that cause -has created guided introductions to AM collections. Loud demand from the -educational community, chiefly from teachers working with the upper -grades of elementary school through high school, greeted the announcement -that AM would be tested around the country. - -FREEMAN reported not only on what was learned about AM in a school -environment, but also on several universal questions that were raised -concerning archival electronic resources in schools. She discussed -several strengths of this type of material in a school environment as -opposed to a highly structured resource that offers a limited number of -paths to follow. - -FREEMAN first raised several questions about using AM in a school -environment. There is often some difficulty in developing a sense of -what the system contains. Many students sit down at a computer resource -and assume that, because AM comes from the Library of Congress, all of -American history is now at their fingertips. As a result of that sort of -mistaken judgment, some students are known to conclude that AM contains -nothing of use to them when they look for one or two things and do not -find them. It is difficult to discover that middle ground where one has -a sense of what the system contains. Some students grope toward the idea -of an archive, a new idea to them, since they have not previously -experienced what it means to have access to a vast body of somewhat -random information. - -Other questions raised by FREEMAN concerned the electronic format itself. -For instance, in a school environment it is often difficult both for -teachers and students to gain a sense of what it is they are viewing. -They understand that it is a visual image, but they do not necessarily -know that it is a postcard from the turn of the century, a panoramic -photograph, or even machine-readable text of an eighteenth-century -broadside, a twentieth-century printed book, or a nineteenth-century -diary. That distinction is often difficult for people in a school -environment to grasp. Because of that, it occasionally becomes difficult -to draw conclusions from what one is viewing. - -FREEMAN also noted the obvious fear of the computer, which constitutes a -difficulty in using an electronic resource. Though students in general -did not suffer from this anxiety, several older students feared that they -were computer-illiterate, an assumption that became self-fulfilling when -they searched for something but failed to find it. FREEMAN said she -believed that some teachers also fear computer resources, because they -believe they lack complete control. FREEMAN related the example of -teachers shooing away students because it was not their time to use the -system. This was a case in which the situation had to be extremely -structured so that the teachers would not feel that they had lost their -grasp on what the system contained. - -A final question raised by FREEMAN concerned access and availability of -the system. She noted the occasional existence of a gap in communication -between school librarians and teachers. Often AM sits in a school -library and the librarian is the person responsible for monitoring the -system. Teachers do not always take into their world new library -resources about which the librarian is excited. Indeed, at the sites -where AM had been used most effectively within a library, the librarian -was required to go to specific teachers and instruct them in its use. As -a result, several AM sites will have in-service sessions over a summer, -in the hope that perhaps, with a more individualized link, teachers will -be more likely to use the resource. - -A related issue in the school context concerned the number of -workstations available at any one location. Centralization of equipment -at the district level, with teachers invited to download things and walk -away with them, proved unsuccessful because the hours these offices were -open were also school hours. - -Another issue was hardware. As VECCIA observed, a range of sites exists, -some technologically advanced and others essentially acquiring their -first computer for the primary purpose of using it in conjunction with -AM's testing. Users at technologically sophisticated sites want even -more sophisticated hardware, so that they can perform even more -sophisticated tasks with the materials in AM. But once they acquire a -newer piece of hardware, they must learn how to use that also; at an -unsophisticated site it takes an extremely long time simply to become -accustomed to the computer, not to mention the program offered with the -computer. All of these small issues raise one large question, namely, -are systems like AM truly rewarding in a school environment, or do they -simply act as innovative toys that do little more than spark interest? - -FREEMAN contended that the evaluation project has revealed several strengths -that were gained through the use of archival resources in schools, including: - - * Psychic rewards from using AM as a vast, rich database, with - teachers assigning various projects to students--oral presentations, - written reports, a documentary, a turn-of-the-century newspaper-- - projects that start with the materials in AM but are completed using - other resources; AM thus is used as a research tool in conjunction - with other electronic resources, as well as with books and items in - the library where the system is set up. - - * Students are acquiring computer literacy in a humanities context. - - * This sort of system is overcoming the isolation between disciplines - that often exists in schools. For example, many English teachers are - requiring their students to write papers on historical topics - represented in AM. Numerous teachers have reported that their - students are learning critical thinking skills using the system. - - * On a broader level, AM is introducing primary materials, not only - to students but also to teachers, in an environment where often - simply none exist--an exciting thing for the students because it - helps them learn to conduct research, to interpret, and to draw - their own conclusions. In learning to conduct research and what it - means, students are motivated to seek knowledge. That relates to - another positive outcome--a high level of personal involvement of - students with the materials in this system and greater motivation to - conduct their own research and draw their own conclusions. - - * Perhaps the most ironic strength of these kinds of archival - electronic resources is that many of the teachers AM interviewed - were desperate, it is no exaggeration to say, not only for primary - materials but for unstructured primary materials. These would, they - thought, foster personally motivated research, exploration, and - excitement in their students. Indeed, these materials have done - just that. Ironically, however, this lack of structure produces - some of the confusion to which the newness of these kinds of - resources may also contribute. The key to effective use of archival - products in a school environment is a clear, effective introduction - to the system and to what it contains. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * Nothing known, quantitatively, about the number of -humanities scholars who must see the original versus those who would -settle for an edited transcript, or about the ways in which humanities -scholars are using information technology * Firm conclusions concerning -the manner and extent of the use of supporting materials in print -provided by AM to await completion of evaluative study * A listener's -reflections on additional applications of electronic texts * Role of -electronic resources in teaching elementary research skills to students * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -During the discussion that followed the presentations by MICHELSON, -VECCIA, and FREEMAN, additional points emerged. - -LESK asked if MICHELSON could give any quantitative estimate of the -number of humanities scholars who must see or want to see the original, -or the best possible version of the material, versus those who typically -would settle for an edited transcript. While unable to provide a figure, -she offered her impressions as an archivist who has done some reference -work and has discussed this issue with other archivists who perform -reference, that those who use archives and those who use primary sources -for what would be considered very high-level scholarly research, as -opposed to, say, undergraduate papers, were few in number, especially -given the public interest in using primary sources to conduct -genealogical or avocational research and the kind of professional -research done by people in private industry or the federal government. -More important in MICHELSON's view was that, quantitatively, nothing is -known about the ways in which, for example, humanities scholars are using -information technology. No studies exist to offer guidance in creating -strategies. The most recent study was conducted in 1985 by the American -Council of Learned Societies (ACLS), and what it showed was that 50 -percent of humanities scholars at that time were using computers. That -constitutes the extent of our knowledge. - -Concerning AM's strategy for orienting people toward the scope of -electronic resources, FREEMAN could offer no hard conclusions at this -point, because she and her colleagues were still waiting to see, -particularly in the schools, what has been made of their efforts. Within -the system, however, AM has provided what are called electronic exhibits- --such as introductions to time periods and materials--and these are -intended to offer a student user a sense of what a broadside is and what -it might tell her or him. But FREEMAN conceded that the project staff -would have to talk with students next year, after teachers have had a -summer to use the materials, and attempt to discover what the students -were learning from the materials. In addition, FREEMAN described -supporting materials in print provided by AM at the request of local -teachers during a meeting held at LC. These included time lines, -bibliographies, and other materials that could be reproduced on a -photocopier in a classroom. Teachers could walk away with and use these, -and in this way gain a better understanding of the contents. But again, -reaching firm conclusions concerning the manner and extent of their use -would have to wait until next year. - -As to the changes she saw occurring at the National Archives and Records -Administration (NARA) as a result of the increasing emphasis on -technology in scholarly research, MICHELSON stated that NARA at this -point was absorbing the report by her and Jeff Rothenberg addressing -strategies for the archival profession in general, although not for the -National Archives specifically. NARA is just beginning to establish its -role and what it can do. In terms of changes and initiatives that NARA -can take, no clear response could be given at this time. - -GREENFIELD remarked two trends mentioned in the session. Reflecting on -DALY's opening comments on how he could have used a Latin collection of -text in an electronic form, he said that at first he thought most scholars -would be unwilling to do that. But as he thought of that in terms of the -original meaning of research--that is, having already mastered these texts, -researching them for critical and comparative purposes--for the first time, -the electronic format made a lot of sense. GREENFIELD could envision -growing numbers of scholars learning the new technologies for that very -aspect of their scholarship and for convenience's sake. - -Listening to VECCIA and FREEMAN, GREENFIELD thought of an additional -application of electronic texts. He realized that AM could be used as a -guide to lead someone to original sources. Students cannot be expected -to have mastered these sources, things they have never known about -before. Thus, AM is leading them, in theory, to a vast body of -information and giving them a superficial overview of it, enabling them -to select parts of it. GREENFIELD asked if any evidence exists that this -resource will indeed teach the new user, the K-12 students, how to do -research. Scholars already know how to do research and are applying -these new tools. But he wondered why students would go beyond picking -out things that were most exciting to them. - -FREEMAN conceded the correctness of GREENFIELD's observation as applied -to a school environment. The risk is that a student would sit down at a -system, play with it, find some things of interest, and then walk away. -But in the relatively controlled situation of a school library, much will -depend on the instructions a teacher or a librarian gives a student. She -viewed the situation not as one of fine-tuning research skills but of -involving students at a personal level in understanding and researching -things. Given the guidance one can receive at school, it then becomes -possible to teach elementary research skills to students, which in fact -one particular librarian said she was teaching her fifth graders. -FREEMAN concluded that introducing the idea of following one's own path -of inquiry, which is essentially what research entails, involves more -than teaching specific skills. To these comments VECCIA added the -observation that the individual teacher and the use of a creative -resource, rather than AM itself, seemed to make the key difference. -Some schools and some teachers are making excellent use of the nature -of critical thinking and teaching skills, she said. - -Concurring with these remarks, DALY closed the session with the thought that -the more that producers produced for teachers and for scholars to use with -their students, the more successful their electronic products would prove. - - ****** - -SESSION II. SHOW AND TELL - -Jacqueline HESS, director, National Demonstration Laboratory, served as -moderator of the "show-and-tell" session. She noted that a -question-and-answer period would follow each presentation. - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -MYLONAS * Overview and content of Perseus * Perseus' primary materials -exist in a system-independent, archival form * A concession * Textual -aspects of Perseus * Tools to use with the Greek text * Prepared indices -and full-text searches in Perseus * English-Greek word search leads to -close study of words and concepts * Navigating Perseus by tracing down -indices * Using the iconography to perform research * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Elli MYLONAS, managing editor, Perseus Project, Harvard University, first -gave an overview of Perseus, a large, collaborative effort based at -Harvard University but with contributors and collaborators located at -numerous universities and colleges in the United States (e.g., Bowdoin, -Maryland, Pomona, Chicago, Virginia). Funded primarily by the -Annenberg/CPB Project, with additional funding from Apple, Harvard, and -the Packard Humanities Institute, among others, Perseus is a multimedia, -hypertextual database for teaching and research on classical Greek -civilization, which was released in February 1992 in version 1.0 and -distributed by Yale University Press. - -Consisting entirely of primary materials, Perseus includes ancient Greek -texts and translations of those texts; catalog entries--that is, museum -catalog entries, not library catalog entries--on vases, sites, coins, -sculpture, and archaeological objects; maps; and a dictionary, among -other sources. The number of objects and the objects for which catalog -entries exist are accompanied by thousands of color images, which -constitute a major feature of the database. Perseus contains -approximately 30 megabytes of text, an amount that will double in -subsequent versions. In addition to these primary materials, the Perseus -Project has been building tools for using them, making access and -navigation easier, the goal being to build part of the electronic -environment discussed earlier in the morning in which students or -scholars can work with their sources. - -The demonstration of Perseus will show only a fraction of the real work -that has gone into it, because the project had to face the dilemma of -what to enter when putting something into machine-readable form: should -one aim for very high quality or make concessions in order to get the -material in? Since Perseus decided to opt for very high quality, all of -its primary materials exist in a system-independent--insofar as it is -possible to be system-independent--archival form. Deciding what that -archival form would be and attaining it required much work and thought. -For example, all the texts are marked up in SGML, which will be made -compatible with the guidelines of the Text Encoding Initiative (TEI) when -they are issued. - -Drawings are postscript files, not meeting international standards, but -at least designed to go across platforms. Images, or rather the real -archival forms, consist of the best available slides, which are being -digitized. Much of the catalog material exists in database form--a form -that the average user could use, manipulate, and display on a personal -computer, but only at great cost. Thus, this is where the concession -comes in: All of this rich, well-marked-up information is stripped of -much of its content; the images are converted into bit-maps and the text -into small formatted chunks. All this information can then be imported -into HyperCard and run on a mid-range Macintosh, which is what Perseus -users have. This fact has made it possible for Perseus to attain wide -use fairly rapidly. Without those archival forms the HyperCard version -being demonstrated could not be made easily, and the project could not -have the potential to move to other forms and machines and software as -they appear, none of which information is in Perseus on the CD. - -Of the numerous multimedia aspects of Perseus, MYLONAS focused on the -textual. Part of what makes Perseus such a pleasure to use, MYLONAS -said, is this effort at seamless integration and the ability to move -around both visual and textual material. Perseus also made the decision -not to attempt to interpret its material any more than one interprets by -selecting. But, MYLONAS emphasized, Perseus is not courseware: No -syllabus exists. There is no effort to define how one teaches a topic -using Perseus, although the project may eventually collect papers by -people who have used it to teach. Rather, Perseus aims to provide -primary material in a kind of electronic library, an electronic sandbox, -so to say, in which students and scholars who are working on this -material can explore by themselves. With that, MYLONAS demonstrated -Perseus, beginning with the Perseus gateway, the first thing one sees -upon opening Perseus--an effort in part to solve the contextualizing -problem--which tells the user what the system contains. - -MYLONAS demonstrated only a very small portion, beginning with primary -texts and running off the CD-ROM. Having selected Aeschylus' Prometheus -Bound, which was viewable in Greek and English pretty much in the same -segments together, MYLONAS demonstrated tools to use with the Greek text, -something not possible with a book: looking up the dictionary entry form -of an unfamiliar word in Greek after subjecting it to Perseus' -morphological analysis for all the texts. After finding out about a -word, a user may then decide to see if it is used anywhere else in Greek. -Because vast amounts of indexing support all of the primary material, one -can find out where else all forms of a particular Greek word appear-- -often not a trivial matter because Greek is highly inflected. Further, -since the story of Prometheus has to do with the origins of sacrifice, a -user may wish to study and explore sacrifice in Greek literature; by -typing sacrifice into a small window, a user goes to the English-Greek -word list--something one cannot do without the computer (Perseus has -indexed the definitions of its dictionary)--the string sacrifice appears -in the definitions of these sixty-five words. One may then find out -where any of those words is used in the work(s) of a particular author. -The English definitions are not lemmatized. - -All of the indices driving this kind of usage were originally devised for -speed, MYLONAS observed; in other words, all that kind of information-- -all forms of all words, where they exist, the dictionary form they belong -to--were collected into databases, which will expedite searching. Then -it was discovered that one can do things searching in these databases -that could not be done searching in the full texts. Thus, although there -are full-text searches in Perseus, much of the work is done behind the -scenes, using prepared indices. Re the indexing that is done behind the -scenes, MYLONAS pointed out that without the SGML forms of the text, it -could not be done effectively. Much of this indexing is based on the -structures that are made explicit by the SGML tagging. - -It was found that one of the things many of Perseus' non-Greek-reading -users do is start from the dictionary and then move into the close study -of words and concepts via this kind of English-Greek word search, by which -means they might select a concept. This exercise has been assigned to -students in core courses at Harvard--to study a concept by looking for the -English word in the dictionary, finding the Greek words, and then finding -the words in the Greek but, of course, reading across in the English. -That tells them a great deal about what a translation means as well. - -Should one also wish to see images that have to do with sacrifice, that -person would go to the object key word search, which allows one to -perform a similar kind of index retrieval on the database of -archaeological objects. Without words, pictures are useless; Perseus has -not reached the point where it can do much with images that are not -cataloged. Thus, although it is possible in Perseus with text and images -to navigate by knowing where one wants to end up--for example, a -red-figure vase from the Boston Museum of Fine Arts--one can perform this -kind of navigation very easily by tracing down indices. MYLONAS -illustrated several generic scenes of sacrifice on vases. The features -demonstrated derived from Perseus 1.0; version 2.0 will implement even -better means of retrieval. - -MYLONAS closed by looking at one of the pictures and noting again that -one can do a great deal of research using the iconography as well as the -texts. For instance, students in a core course at Harvard this year were -highly interested in Greek concepts of foreigners and representations of -non-Greeks. So they performed a great deal of research, both with texts -(e.g., Herodotus) and with iconography on vases and coins, on how the -Greeks portrayed non-Greeks. At the same time, art historians who study -iconography were also interested, and were able to use this material. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * Indexing and searchability of all English words in Perseus * -Several features of Perseus 1.0 * Several levels of customization -possible * Perseus used for general education * Perseus' effects on -education * Contextual information in Perseus * Main challenge and -emphasis of Perseus * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Several points emerged in the discussion that followed MYLONAS's presentation. - -Although MYLONAS had not demonstrated Perseus' ability to cross-search -documents, she confirmed that all English words in Perseus are indexed -and can be searched. So, for example, sacrifice could have been searched -in all texts, the historical essay, and all the catalogue entries with -their descriptions--in short, in all of Perseus. - -Boolean logic is not in Perseus 1.0 but will be added to the next -version, although an effort is being made not to restrict Perseus to a -database in which one just performs searching, Boolean or otherwise. It -is possible to move laterally through the documents by selecting a word -one is interested in and selecting an area of information one is -interested in and trying to look that word up in that area. - -Since Perseus was developed in HyperCard, several levels of customization -are possible. Simple authoring tools exist that allow one to create -annotated paths through the information, which are useful for note-taking -and for guided tours for teaching purposes and for expository writing. -With a little more ingenuity it is possible to begin to add or substitute -material in Perseus. - -Perseus has not been used so much for classics education as for general -education, where it seemed to have an impact on the students in the core -course at Harvard (a general required course that students must take in -certain areas). Students were able to use primary material much more. - -The Perseus Project has an evaluation team at the University of Maryland -that has been documenting Perseus' effects on education. Perseus is very -popular, and anecdotal evidence indicates that it is having an effect at -places other than Harvard, for example, test sites at Ball State -University, Drury College, and numerous small places where opportunities -to use vast amounts of primary data may not exist. One documented effect -is that archaeological, anthropological, and philological research is -being done by the same person instead of by three different people. - -The contextual information in Perseus includes an overview essay, a -fairly linear historical essay on the fifth century B.C. that provides -links into the primary material (e.g., Herodotus, Thucydides, and -Plutarch), via small gray underscoring (on the screen) of linked -passages. These are handmade links into other material. - -To different extents, most of the production work was done at Harvard, -where the people and the equipment are located. Much of the -collaborative activity involved data collection and structuring, because -the main challenge and the emphasis of Perseus is the gathering of -primary material, that is, building a useful environment for studying -classical Greece, collecting data, and making it useful. -Systems-building is definitely not the main concern. Thus, much of the -work has involved writing essays, collecting information, rewriting it, -and tagging it. That can be done off site. The creative link for the -overview essay as well as for both systems and data was collaborative, -and was forged via E-mail and paper mail with professors at Pomona and -Bowdoin. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -CALALUCA * PLD's principal focus and contribution to scholarship * -Various questions preparatory to beginning the project * Basis for -project * Basic rule in converting PLD * Concerning the images in PLD * -Running PLD under a variety of retrieval softwares * Encoding the -database a hard-fought issue * Various features demonstrated * Importance -of user documentation * Limitations of the CD-ROM version * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Eric CALALUCA, vice president, Chadwyck-Healey, Inc., demonstrated a -software interpretation of the Patrologia Latina Database (PLD). PLD's -principal focus from the beginning of the project about three-and-a-half -years ago was on converting Migne's Latin series, and in the end, -CALALUCA suggested, conversion of the text will be the major contribution -to scholarship. CALALUCA stressed that, as possibly the only private -publishing organization at the Workshop, Chadwyck-Healey had sought no -federal funds or national foundation support before embarking upon the -project, but instead had relied upon a great deal of homework and -marketing to accomplish the task of conversion. - -Ever since the possibilities of computer-searching have emerged, scholars -in the field of late ancient and early medieval studies (philosophers, -theologians, classicists, and those studying the history of natural law -and the history of the legal development of Western civilization) have -been longing for a fully searchable version of Western literature, for -example, all the texts of Augustine and Bernard of Clairvaux and -Boethius, not to mention all the secondary and tertiary authors. - -Various questions arose, CALALUCA said. Should one convert Migne? -Should the database be encoded? Is it necessary to do that? How should -it be delivered? What about CD-ROM? Since this is a transitional -medium, why even bother to create software to run on a CD-ROM? Since -everybody knows people will be networking information, why go to the -trouble--which is far greater with CD-ROM than with the production of -magnetic data? Finally, how does one make the data available? Can many -of the hurdles to using electronic information that some publishers have -imposed upon databases be eliminated? - -The PLD project was based on the principle that computer-searching of -texts is most effective when it is done with a large database. Because -PLD represented a collection that serves so many disciplines across so -many periods, it was irresistible. - -The basic rule in converting PLD was to do no harm, to avoid the sins of -intrusion in such a database: no introduction of newer editions, no -on-the-spot changes, no eradicating of all possible falsehoods from an -edition. Thus, PLD is not the final act in electronic publishing for -this discipline, but simply the beginning. The conversion of PLD has -evoked numerous unanticipated questions: How will information be used? -What about networking? Can the rights of a database be protected? -Should one protect the rights of a database? How can it be made -available? - -Those converting PLD also tried to avoid the sins of omission, that is, -excluding portions of the collections or whole sections. What about the -images? PLD is full of images, some are extremely pious -nineteenth-century representations of the Fathers, while others contain -highly interesting elements. The goal was to cover all the text of Migne -(including notes, in Greek and in Hebrew, the latter of which, in -particular, causes problems in creating a search structure), all the -indices, and even the images, which are being scanned in separately -searchable files. - -Several North American institutions that have placed acquisition requests -for the PLD database have requested it in magnetic form without software, -which means they are already running it without software, without -anything demonstrated at the Workshop. - -What cannot practically be done is go back and reconvert and re-encode -data, a time-consuming and extremely costly enterprise. CALALUCA sees -PLD as a database that can, and should, be run under a variety of -retrieval softwares. This will permit the widest possible searches. -Consequently, the need to produce a CD-ROM of PLD, as well as to develop -software that could handle some 1.3 gigabyte of heavily encoded text, -developed out of conversations with collection development and reference -librarians who wanted software both compassionate enough for the -pedestrian but also capable of incorporating the most detailed -lexicographical studies that a user desires to conduct. In the end, the -encoding and conversion of the data will prove the most enduring -testament to the value of the project. - -The encoding of the database was also a hard-fought issue: Did the -database need to be encoded? Were there normative structures for encoding -humanist texts? Should it be SGML? What about the TEI--will it last, -will it prove useful? CALALUCA expressed some minor doubts as to whether -a data bank can be fully TEI-conformant. Every effort can be made, but -in the end to be TEI-conformant means to accept the need to make some -firm encoding decisions that can, indeed, be disputed. The TEI points -the publisher in a proper direction but does not presume to make all the -decisions for him or her. Essentially, the goal of encoding was to -eliminate, as much as possible, the hindrances to information-networking, -so that if an institution acquires a database, everybody associated with -the institution can have access to it. - -CALALUCA demonstrated a portion of Volume 160, because it had the most -anomalies in it. The software was created by Electronic Book -Technologies of Providence, RI, and is called Dynatext. The software -works only with SGML-coded data. - -Viewing a table of contents on the screen, the audience saw how Dynatext -treats each element as a book and attempts to simplify movement through a -volume. Familiarity with the Patrologia in print (i.e., the text, its -source, and the editions) will make the machine-readable versions highly -useful. (Software with a Windows application was sought for PLD, -CALALUCA said, because this was the main trend for scholarly use.) - -CALALUCA also demonstrated how a user can perform a variety of searches -and quickly move to any part of a volume; the look-up screen provides -some basic, simple word-searching. - -CALALUCA argued that one of the major difficulties is not the software. -Rather, in creating a product that will be used by scholars representing -a broad spectrum of computer sophistication, user documentation proves -to be the most important service one can provide. - -CALALUCA next illustrated a truncated search under mysterium within ten -words of virtus and how one would be able to find its contents throughout -the entire database. He said that the exciting thing about PLD is that -many of the applications in the retrieval software being written for it -will exceed the capabilities of the software employed now for the CD-ROM -version. The CD-ROM faces genuine limitations, in terms of speed and -comprehensiveness, in the creation of a retrieval software to run it. -CALALUCA said he hoped that individual scholars will download the data, -if they wish, to their personal computers, and have ready access to -important texts on a constant basis, which they will be able to use in -their research and from which they might even be able to publish. - -(CALALUCA explained that the blue numbers represented Migne's column numbers, -which are the standard scholarly references. Pulling up a note, he stated -that these texts were heavily edited and the image files would appear simply -as a note as well, so that one could quickly access an image.) - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -FLEISCHHAUER/ERWAY * Several problems with which AM is still wrestling * -Various search and retrieval capabilities * Illustration of automatic -stemming and a truncated search * AM's attempt to find ways to connect -cataloging to the texts * AM's gravitation towards SGML * Striking a -balance between quantity and quality * How AM furnishes users recourse to -images * Conducting a search in a full-text environment * Macintosh and -IBM prototypes of AM * Multimedia aspects of AM * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -A demonstration of American Memory by its coordinator, Carl FLEISCHHAUER, -and Ricky ERWAY, associate coordinator, Library of Congress, concluded -the morning session. Beginning with a collection of broadsides from the -Continental Congress and the Constitutional Convention, the only text -collection in a presentable form at the time of the Workshop, FLEISCHHAUER -highlighted several of the problems with which AM is still wrestling. -(In its final form, the disk will contain two collections, not only the -broadsides but also the full text with illustrations of a set of -approximately 300 African-American pamphlets from the period 1870 to 1910.) - -As FREEMAN had explained earlier, AM has attempted to use a small amount -of interpretation to introduce collections. In the present case, the -contractor, a company named Quick Source, in Silver Spring, MD., used -software called Toolbook and put together a modestly interactive -introduction to the collection. Like the two preceding speakers, -FLEISCHHAUER argued that the real asset was the underlying collection. - -FLEISCHHAUER proceeded to describe various search and retrieval -capabilities while ERWAY worked the computer. In this particular package -the "go to" pull-down allowed the user in effect to jump out of Toolbook, -where the interactive program was located, and enter the third-party -software used by AM for this text collection, which is called Personal -Librarian. This was the Windows version of Personal Librarian, a -software application put together by a company in Rockville, Md. - -Since the broadsides came from the Revolutionary War period, a search was -conducted using the words British or war, with the default operator reset -as or. FLEISCHHAUER demonstrated both automatic stemming (which finds -other forms of the same root) and a truncated search. One of Personal -Librarian's strongest features, the relevance ranking, was represented by -a chart that indicated how often words being sought appeared in -documents, with the one receiving the most "hits" obtaining the highest -score. The "hit list" that is supplied takes the relevance ranking into -account, making the first hit, in effect, the one the software has -selected as the most relevant example. - -While in the text of one of the broadside documents, FLEISCHHAUER -remarked AM's attempt to find ways to connect cataloging to the texts, -which it does in different ways in different manifestations. In the case -shown, the cataloging was pasted on: AM took MARC records that were -written as on-line records right into one of the Library's mainframe -retrieval programs, pulled them out, and handed them off to the contractor, -who massaged them somewhat to display them in the manner shown. One of -AM's questions is, Does the cataloguing normally performed in the mainframe -work in this context, or had AM ought to think through adjustments? - -FLEISCHHAUER made the additional point that, as far as the text goes, AM -has gravitated towards SGML (he pointed to the boldface in the upper part -of the screen). Although extremely limited in its ability to translate -or interpret SGML, Personal Librarian will furnish both bold and italics -on screen; a fairly easy thing to do, but it is one of the ways in which -SGML is useful. - -Striking a balance between quantity and quality has been a major concern -of AM, with accuracy being one of the places where project staff have -felt that less than 100-percent accuracy was not unacceptable. -FLEISCHHAUER cited the example of the standard of the rekeying industry, -namely 99.95 percent; as one service bureau informed him, to go from -99.95 to 100 percent would double the cost. - -FLEISCHHAUER next demonstrated how AM furnishes users recourse to images, -and at the same time recalled LESK's pointed question concerning the -number of people who would look at those images and the number who would -work only with the text. If the implication of LESK's question was -sound, FLEISCHHAUER said, it raised the stakes for text accuracy and -reduced the value of the strategy for images. - -Contending that preservation is always a bugaboo, FLEISCHHAUER -demonstrated several images derived from a scan of a preservation -microfilm that AM had made. He awarded a grade of C at best, perhaps a -C minus or a C plus, for how well it worked out. Indeed, the matter of -learning if other people had better ideas about scanning in general, and, -in particular, scanning from microfilm, was one of the factors that drove -AM to attempt to think through the agenda for the Workshop. Skew, for -example, was one of the issues that AM in its ignorance had not reckoned -would prove so difficult. - -Further, the handling of images of the sort shown, in a desktop computer -environment, involved a considerable amount of zooming and scrolling. -Ultimately, AM staff feel that perhaps the paper copy that is printed out -might be the most useful one, but they remain uncertain as to how much -on-screen reading users will do. - -Returning to the text, FLEISCHHAUER asked viewers to imagine a person who -might be conducting a search in a full-text environment. With this -scenario, he proceeded to illustrate other features of Personal Librarian -that he considered helpful; for example, it provides the ability to -notice words as one reads. Clicking the "include" button on the bottom -of the search window pops the words that have been highlighted into the -search. Thus, a user can refine the search as he or she reads, -re-executing the search and continuing to find things in the quest for -materials. This software not only contains relevance ranking, Boolean -operators, and truncation, it also permits one to perform word algebra, -so to say, where one puts two or three words in parentheses and links -them with one Boolean operator and then a couple of words in another set -of parentheses and asks for things within so many words of others. - -Until they became acquainted recently with some of the work being done in -classics, the AM staff had not realized that a large number of the -projects that involve electronic texts were being done by people with a -profound interest in language and linguistics. Their search strategies -and thinking are oriented to those fields, as is shown in particular by -the Perseus example. As amateur historians, the AM staff were thinking -more of searching for concepts and ideas than for particular words. -Obviously, FLEISCHHAUER conceded, searching for concepts and ideas and -searching for words may be two rather closely related things. - -While displaying several images, FLEISCHHAUER observed that the Macintosh -prototype built by AM contains a greater diversity of formats. Echoing a -previous speaker, he said that it was easier to stitch things together in -the Macintosh, though it tended to be a little more anemic in search and -retrieval. AM, therefore, increasingly has been investigating -sophisticated retrieval engines in the IBM format. - -FLEISCHHAUER demonstrated several additional examples of the prototype -interfaces: One was AM's metaphor for the network future, in which a -kind of reading-room graphic suggests how one would be able to go around -to different materials. AM contains a large number of photographs in -analog video form worked up from a videodisc, which enable users to make -copies to print or incorporate in digital documents. A frame-grabber is -built into the system, making it possible to bring an image into a window -and digitize or print it out. - -FLEISCHHAUER next demonstrated sound recording, which included texts. -Recycled from a previous project, the collection included sixty 78-rpm -phonograph records of political speeches that were made during and -immediately after World War I. These constituted approximately three -hours of audio, as AM has digitized it, which occupy 150 megabytes on a -CD. Thus, they are considerably compressed. From the catalogue card, -FLEISCHHAUER proceeded to a transcript of a speech with the audio -available and with highlighted text following it as it played. -A photograph has been added and a transcription made. - -Considerable value has been added beyond what the Library of Congress -normally would do in cataloguing a sound recording, which raises several -questions for AM concerning where to draw lines about how much value it can -afford to add and at what point, perhaps, this becomes more than AM could -reasonably do or reasonably wish to do. FLEISCHHAUER also demonstrated -a motion picture. As FREEMAN had reported earlier, the motion picture -materials have proved the most popular, not surprisingly. This says more -about the medium, he thought, than about AM's presentation of it. - -Because AM's goal was to bring together things that could be used by -historians or by people who were curious about history, -turn-of-the-century footage seemed to represent the most appropriate -collections from the Library of Congress in motion pictures. These were -the very first films made by Thomas Edison's company and some others at -that time. The particular example illustrated was a Biograph film, -brought in with a frame-grabber into a window. A single videodisc -contains about fifty titles and pieces of film from that period, all of -New York City. Taken together, AM believes, they provide an interesting -documentary resource. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * Using the frame-grabber in AM * Volume of material processed -and to be processed * Purpose of AM within LC * Cataloguing and the -nature of AM's material * SGML coding and the question of quality versus -quantity * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -During the question-and-answer period that followed FLEISCHHAUER's -presentation, several clarifications were made. - -AM is bringing in motion pictures from a videodisc. The frame-grabber -devices create a window on a computer screen, which permits users to -digitize a single frame of the movie or one of the photographs. It -produces a crude, rough-and-ready image that high school students can -incorporate into papers, and that has worked very nicely in this way. - -Commenting on FLEISCHHAUER's assertion that AM was looking more at -searching ideas than words, MYLONAS argued that without words an idea -does not exist. FLEISCHHAUER conceded that he ought to have articulated -his point more clearly. MYLONAS stated that they were in fact both -talking about the same thing. By searching for words and by forcing -people to focus on the word, the Perseus Project felt that they would get -them to the idea. The way one reviews results is tailored more to one -kind of user than another. - -Concerning the total volume of material that has been processed in this -way, AM at this point has in retrievable form seven or eight collections, -all of them photographic. In the Macintosh environment, for example, -there probably are 35,000-40,000 photographs. The sound recordings -number sixty items. The broadsides number about 300 items. There are -500 political cartoons in the form of drawings. The motion pictures, as -individual items, number sixty to seventy. - -AM also has a manuscript collection, the life history portion of one of -the federal project series, which will contain 2,900 individual -documents, all first-person narratives. AM has in process about 350 -African-American pamphlets, or about 12,000 printed pages for the period -1870-1910. Also in the works are some 4,000 panoramic photographs. AM -has recycled a fair amount of the work done by LC's Prints and -Photographs Division during the Library's optical disk pilot project in -the 1980s. For example, a special division of LC has tooled up and -thought through all the ramifications of electronic presentation of -photographs. Indeed, they are wheeling them out in great barrel loads. -The purpose of AM within the Library, it is hoped, is to catalyze several -of the other special collection divisions which have no particular -experience with, in some cases, mixed feelings about, an activity such as -AM. Moreover, in many cases the divisions may be characterized as not -only lacking experience in "electronifying" things but also in automated -cataloguing. MARC cataloguing as practiced in the United States is -heavily weighted toward the description of monograph and serial -materials, but is much thinner when one enters the world of manuscripts -and things that are held in the Library's music collection and other -units. In response to a comment by LESK, that AM's material is very -heavily photographic, and is so primarily because individual records have -been made for each photograph, FLEISCHHAUER observed that an item-level -catalog record exists, for example, for each photograph in the Detroit -Publishing collection of 25,000 pictures. In the case of the Federal -Writers Project, for which nearly 3,000 documents exist, representing -information from twenty-six different states, AM with the assistance of -Karen STUART of the Manuscript Division will attempt to find some way not -only to have a collection-level record but perhaps a MARC record for each -state, which will then serve as an umbrella for the 100-200 documents -that come under it. But that drama remains to be enacted. The AM staff -is conservative and clings to cataloguing, though of course visitors tout -artificial intelligence and neural networks in a manner that suggests that -perhaps one need not have cataloguing or that much of it could be put aside. - -The matter of SGML coding, FLEISCHHAUER conceded, returned the discussion -to the earlier treated question of quality versus quantity in the Library -of Congress. Of course, text conversion can be done with 100-percent -accuracy, but it means that when one's holdings are as vast as LC's only -a tiny amount will be exposed, whereas permitting lower levels of -accuracy can lead to exposing or sharing larger amounts, but with the -quality correspondingly impaired. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -TWOHIG * A contrary experience concerning electronic options * Volume of -material in the Washington papers and a suggestion of David Packard * -Implications of Packard's suggestion * Transcribing the documents for the -CD-ROM * Accuracy of transcriptions * The CD-ROM edition of the Founding -Fathers documents * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Finding encouragement in a comment of MICHELSON's from the morning -session--that numerous people in the humanities were choosing electronic -options to do their work--Dorothy TWOHIG, editor, The Papers of George -Washington, opened her illustrated talk by noting that her experience -with literary scholars and numerous people in editing was contrary to -MICHELSON's. TWOHIG emphasized literary scholars' complete ignorance of -the technological options available to them or their reluctance or, in -some cases, their downright hostility toward these options. - -After providing an overview of the five Founding Fathers projects -(Jefferson at Princeton, Franklin at Yale, John Adams at the -Massachusetts Historical Society, and Madison down the hall from her at -the University of Virginia), TWOHIG observed that the Washington papers, -like all of the projects, include both sides of the Washington -correspondence and deal with some 135,000 documents to be published with -extensive annotation in eighty to eighty-five volumes, a project that -will not be completed until well into the next century. Thus, it was -with considerable enthusiasm several years ago that the Washington Papers -Project (WPP) greeted David Packard's suggestion that the papers of the -Founding Fathers could be published easily and inexpensively, and to the -great benefit of American scholarship, via CD-ROM. - -In pragmatic terms, funding from the Packard Foundation would expedite -the transcription of thousands of documents waiting to be put on disk in -the WPP offices. Further, since the costs of collecting, editing, and -converting the Founding Fathers documents into letterpress editions were -running into the millions of dollars, and the considerable staffs -involved in all of these projects were devoting their careers to -producing the work, the Packard Foundation's suggestion had a -revolutionary aspect: Transcriptions of the entire corpus of the -Founding Fathers papers would be available on CD-ROM to public and -college libraries, even high schools, at a fraction of the cost-- -$100-$150 for the annual license fee--to produce a limited university -press run of 1,000 of each volume of the published papers at $45-$150 per -printed volume. Given the current budget crunch in educational systems -and the corresponding constraints on librarians in smaller institutions -who wish to add these volumes to their collections, producing the -documents on CD-ROM would likely open a greatly expanded audience for the -papers. TWOHIG stressed, however, that development of the Founding -Fathers CD-ROM is still in its infancy. Serious software problems remain -to be resolved before the material can be put into readable form. - -Funding from the Packard Foundation resulted in a major push to -transcribe the 75,000 or so documents of the Washington papers remaining -to be transcribed onto computer disks. Slides illustrated several of the -problems encountered, for example, the present inability of CD-ROM to -indicate the cross-outs (deleted material) in eighteenth century -documents. TWOHIG next described documents from various periods in the -eighteenth century that have been transcribed in chronological order and -delivered to the Packard offices in California, where they are converted -to the CD-ROM, a process that is expected to consume five years to -complete (that is, reckoning from David Packard's suggestion made several -years ago, until about July 1994). TWOHIG found an encouraging -indication of the project's benefits in the ongoing use made by scholars -of the search functions of the CD-ROM, particularly in reducing the time -spent in manually turning the pages of the Washington papers. - -TWOHIG next furnished details concerning the accuracy of transcriptions. -For instance, the insertion of thousands of documents on the CD-ROM -currently does not permit each document to be verified against the -original manuscript several times as in the case of documents that appear -in the published edition. However, the transcriptions receive a cursory -check for obvious typos, the misspellings of proper names, and other -errors from the WPP CD-ROM editor. Eventually, all documents that appear -in the electronic version will be checked by project editors. Although -this process has met with opposition from some of the editors on the -grounds that imperfect work may leave their offices, the advantages in -making this material available as a research tool outweigh fears about the -misspelling of proper names and other relatively minor editorial matters. - -Completion of all five Founding Fathers projects (i.e., retrievability -and searchability of all of the documents by proper names, alternate -spellings, or varieties of subjects) will provide one of the richest -sources of this size for the history of the United States in the latter -part of the eighteenth century. Further, publication on CD-ROM will -allow editors to include even minutiae, such as laundry lists, not -included in the printed volumes. - -It seems possible that the extensive annotation provided in the printed -volumes eventually will be added to the CD-ROM edition, pending -negotiations with the publishers of the papers. At the moment, the -Founding Fathers CD-ROM is accessible only on the IBYCUS, a computer -developed out of the Thesaurus Linguae Graecae project and designed for -the use of classical scholars. There are perhaps 400 IBYCUS computers in -the country, most of which are in university classics departments. -Ultimately, it is anticipated that the CD-ROM edition of the Founding -Fathers documents will run on any IBM-compatible or Macintosh computer -with a CD-ROM drive. Numerous changes in the software will also occur -before the project is completed. (Editor's note: an IBYCUS was -unavailable to demonstrate the CD-ROM.) - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * Several additional features of WPP clarified * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Discussion following TWOHIG's presentation served to clarify several -additional features, including (1) that the project's primary -intellectual product consists in the electronic transcription of the -material; (2) that the text transmitted to the CD-ROM people is not -marked up; (3) that cataloging and subject-indexing of the material -remain to be worked out (though at this point material can be retrieved -by name); and (4) that because all the searching is done in the hardware, -the IBYCUS is designed to read a CD-ROM which contains only sequential -text files. Technically, it then becomes very easy to read the material -off and put it on another device. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -LEBRON * Overview of the history of the joint project between AAAS and -OCLC * Several practices the on-line environment shares with traditional -publishing on hard copy * Several technical and behavioral barriers to -electronic publishing * How AAAS and OCLC arrived at the subject of -clinical trials * Advantages of the electronic format and other features -of OJCCT * An illustrated tour of the journal * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Maria LEBRON, managing editor, The Online Journal of Current Clinical -Trials (OJCCT), presented an illustrated overview of the history of the -joint project between the American Association for the Advancement of -Science (AAAS) and the Online Computer Library Center, Inc. (OCLC). The -joint venture between AAAS and OCLC owes its beginning to a -reorganization launched by the new chief executive officer at OCLC about -three years ago and combines the strengths of these two disparate -organizations. In short, OJCCT represents the process of scholarly -publishing on line. - -LEBRON next discussed several practices the on-line environment shares -with traditional publishing on hard copy--for example, peer review of -manuscripts--that are highly important in the academic world. LEBRON -noted in particular the implications of citation counts for tenure -committees and grants committees. In the traditional hard-copy -environment, citation counts are readily demonstrable, whereas the -on-line environment represents an ethereal medium to most academics. - -LEBRON remarked several technical and behavioral barriers to electronic -publishing, for instance, the problems in transmission created by special -characters or by complex graphics and halftones. In addition, she noted -economic limitations such as the storage costs of maintaining back issues -and market or audience education. - -Manuscripts cannot be uploaded to OJCCT, LEBRON explained, because it is -not a bulletin board or E-mail, forms of electronic transmission of -information that have created an ambience clouding people's understanding -of what the journal is attempting to do. OJCCT, which publishes -peer-reviewed medical articles dealing with the subject of clinical -trials, includes text, tabular material, and graphics, although at this -time it can transmit only line illustrations. - -Next, LEBRON described how AAAS and OCLC arrived at the subject of -clinical trials: It is 1) a highly statistical discipline that 2) does -not require halftones but can satisfy the needs of its audience with line -illustrations and graphic material, and 3) there is a need for the speedy -dissemination of high-quality research results. Clinical trials are -research activities that involve the administration of a test treatment -to some experimental unit in order to test its usefulness before it is -made available to the general population. LEBRON proceeded to give -additional information on OJCCT concerning its editor-in-chief, editorial -board, editorial content, and the types of articles it publishes -(including peer-reviewed research reports and reviews), as well as -features shared by other traditional hard-copy journals. - -Among the advantages of the electronic format are faster dissemination of -information, including raw data, and the absence of space constraints -because pages do not exist. (This latter fact creates an interesting -situation when it comes to citations.) Nor are there any issues. AAAS's -capacity to download materials directly from the journal to a -subscriber's printer, hard drive, or floppy disk helps ensure highly -accurate transcription. Other features of OJCCT include on-screen alerts -that allow linkage of subsequently published documents to the original -documents; on-line searching by subject, author, title, etc.; indexing of -every single word that appears in an article; viewing access to an -article by component (abstract, full text, or graphs); numbered -paragraphs to replace page counts; publication in Science every thirty -days of indexing of all articles published in the journal; -typeset-quality screens; and Hypertext links that enable subscribers to -bring up Medline abstracts directly without leaving the journal. - -After detailing the two primary ways to gain access to the journal, -through the OCLC network and Compuserv if one desires graphics or through -the Internet if just an ASCII file is desired, LEBRON illustrated the -speedy editorial process and the coding of the document using SGML tags -after it has been accepted for publication. She also gave an illustrated -tour of the journal, its search-and-retrieval capabilities in particular, -but also including problems associated with scanning in illustrations, -and the importance of on-screen alerts to the medical profession re -retractions or corrections, or more frequently, editorials, letters to -the editors, or follow-up reports. She closed by inviting the audience -to join AAAS on 1 July, when OJCCT was scheduled to go on-line. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * Additional features of OJCCT * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -In the lengthy discussion that followed LEBRON's presentation, these -points emerged: - - * The SGML text can be tailored as users wish. - - * All these articles have a fairly simple document definition. - - * Document-type definitions (DTDs) were developed and given to OJCCT - for coding. - - * No articles will be removed from the journal. (Because there are - no back issues, there are no lost issues either. Once a subscriber - logs onto the journal he or she has access not only to the currently - published materials, but retrospectively to everything that has been - published in it. Thus the table of contents grows bigger. The date - of publication serves to distinguish between currently published - materials and older materials.) - - * The pricing system for the journal resembles that for most medical - journals: for 1992, $95 for a year, plus telecommunications charges - (there are no connect time charges); for 1993, $110 for the - entire year for single users, though the journal can be put on a - local area network (LAN). However, only one person can access the - journal at a time. Site licenses may come in the future. - - * AAAS is working closely with colleagues at OCLC to display - mathematical equations on screen. - - * Without compromising any steps in the editorial process, the - technology has reduced the time lag between when a manuscript is - originally submitted and the time it is accepted; the review process - does not differ greatly from the standard six-to-eight weeks - employed by many of the hard-copy journals. The process still - depends on people. - - * As far as a preservation copy is concerned, articles will be - maintained on the computer permanently and subscribers, as part of - their subscription, will receive a microfiche-quality archival copy - of everything published during that year; in addition, reprints can - be purchased in much the same way as in a hard-copy environment. - Hard copies are prepared but are not the primary medium for the - dissemination of the information. - - * Because OJCCT is not yet on line, it is difficult to know how many - people would simply browse through the journal on the screen as - opposed to downloading the whole thing and printing it out; a mix of - both types of users likely will result. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -PERSONIUS * Developments in technology over the past decade * The CLASS -Project * Advantages for technology and for the CLASS Project * -Developing a network application an underlying assumption of the project -* Details of the scanning process * Print-on-demand copies of books * -Future plans include development of a browsing tool * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Lynne PERSONIUS, assistant director, Cornell Information Technologies for -Scholarly Information Services, Cornell University, first commented on -the tremendous impact that developments in technology over the past ten -years--networking, in particular--have had on the way information is -handled, and how, in her own case, these developments have counterbalanced -Cornell's relative geographical isolation. Other significant technologies -include scanners, which are much more sophisticated than they were ten years -ago; mass storage and the dramatic savings that result from it in terms of -both space and money relative to twenty or thirty years ago; new and -improved printing technologies, which have greatly affected the distribution -of information; and, of course, digital technologies, whose applicability to -library preservation remains at issue. - -Given that context, PERSONIUS described the College Library Access and -Storage System (CLASS) Project, a library preservation project, -primarily, and what has been accomplished. Directly funded by the -Commission on Preservation and Access and by the Xerox Corporation, which -has provided a significant amount of hardware, the CLASS Project has been -working with a development team at Xerox to develop a software -application tailored to library preservation requirements. Within -Cornell, participants in the project have been working jointly with both -library and information technologies. The focus of the project has been -on reformatting and saving books that are in brittle condition. -PERSONIUS showed Workshop participants a brittle book, and described how -such books were the result of developments in papermaking around the -beginning of the Industrial Revolution. The papermaking process was -changed so that a significant amount of acid was introduced into the -actual paper itself, which deteriorates as it sits on library shelves. - -One of the advantages for technology and for the CLASS Project is that -the information in brittle books is mostly out of copyright and thus -offers an opportunity to work with material that requires library -preservation, and to create and work on an infrastructure to save the -material. Acknowledging the familiarity of those working in preservation -with this information, PERSONIUS noted that several things are being -done: the primary preservation technology used today is photocopying of -brittle material. Saving the intellectual content of the material is the -main goal. With microfilm copy, the intellectual content is preserved on -the assumption that in the future the image can be reformatted in any -other way that then exists. - -An underlying assumption of the CLASS Project from the beginning was -that it would develop a network application. Project staff scan books -at a workstation located in the library, near the brittle material. -An image-server filing system is located at a distance from that -workstation, and a printer is located in another building. All of the -materials digitized and stored on the image-filing system are cataloged -in the on-line catalogue. In fact, a record for each of these electronic -books is stored in the RLIN database so that a record exists of what is -in the digital library throughout standard catalogue procedures. In the -future, researchers working from their own workstations in their offices, -or their networks, will have access--wherever they might be--through a -request server being built into the new digital library. A second -assumption is that the preferred means of finding the material will be by -looking through a catalogue. PERSONIUS described the scanning process, -which uses a prototype scanner being developed by Xerox and which scans a -very high resolution image at great speed. Another significant feature, -because this is a preservation application, is the placing of the pages -that fall apart one for one on the platen. Ordinarily, a scanner could -be used with some sort of a document feeder, but because of this -application that is not feasible. Further, because CLASS is a -preservation application, after the paper replacement is made there, a -very careful quality control check is performed. An original book is -compared to the printed copy and verification is made, before proceeding, -that all of the image, all of the information, has been captured. Then, -a new library book is produced: The printed images are rebound by a -commercial binder and a new book is returned to the shelf. -Significantly, the books returned to the library shelves are beautiful -and useful replacements on acid-free paper that should last a long time, -in effect, the equivalent of preservation photocopies. Thus, the project -has a library of digital books. In essence, CLASS is scanning and -storing books as 600 dot-per-inch bit-mapped images, compressed using -Group 4 CCITT (i.e., the French acronym for International Consultative -Committee for Telegraph and Telephone) compression. They are stored as -TIFF files on an optical filing system that is composed of a database -used for searching and locating the books and an optical jukebox that -stores 64 twelve-inch platters. A very-high-resolution printed copy of -these books at 600 dots per inch is created, using a Xerox DocuTech -printer to make the paper replacements on acid-free paper. - -PERSONIUS maintained that the CLASS Project presents an opportunity to -introduce people to books as digital images by using a paper medium. -Books are returned to the shelves while people are also given the ability -to print on demand--to make their own copies of books. (PERSONIUS -distributed copies of an engineering journal published by engineering -students at Cornell around 1900 as an example of what a print-on-demand -copy of material might be like. This very cheap copy would be available -to people to use for their own research purposes and would bridge the gap -between an electronic work and the paper that readers like to have.) -PERSONIUS then attempted to illustrate a very early prototype of -networked access to this digital library. Xerox Corporation has -developed a prototype of a view station that can send images across the -network to be viewed. - -The particular library brought down for demonstration contained two -mathematics books. CLASS is developing and will spend the next year -developing an application that allows people at workstations to browse -the books. Thus, CLASS is developing a browsing tool, on the assumption -that users do not want to read an entire book from a workstation, but -would prefer to be able to look through and decide if they would like to -have a printed copy of it. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * Re retrieval software * "Digital file copyright" * Scanning -rate during production * Autosegmentation * Criteria employed in -selecting books for scanning * Compression and decompression of images * -OCR not precluded * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -During the question-and-answer period that followed her presentation, -PERSONIUS made these additional points: - - * Re retrieval software, Cornell is developing a Unix-based server - as well as clients for the server that support multiple platforms - (Macintosh, IBM and Sun workstations), in the hope that people from - any of those platforms will retrieve books; a further operating - assumption is that standard interfaces will be used as much as - possible, where standards can be put in place, because CLASS - considers this retrieval software a library application and would - like to be able to look at material not only at Cornell but at other - institutions. - - * The phrase "digital file copyright by Cornell University" was - added at the advice of Cornell's legal staff with the caveat that it - probably would not hold up in court. Cornell does not want people - to copy its books and sell them but would like to keep them - available for use in a library environment for library purposes. - - * In production the scanner can scan about 300 pages per hour, - capturing 600 dots per inch. - - * The Xerox software has filters to scan halftone material and avoid - the moire patterns that occur when halftone material is scanned. - Xerox has been working on hardware and software that would enable - the scanner itself to recognize this situation and deal with it - appropriately--a kind of autosegmentation that would enable the - scanner to handle halftone material as well as text on a single page. - - * The books subjected to the elaborate process described above were - selected because CLASS is a preservation project, with the first 500 - books selected coming from Cornell's mathematics collection, because - they were still being heavily used and because, although they were - in need of preservation, the mathematics library and the mathematics - faculty were uncomfortable having them microfilmed. (They wanted a - printed copy.) Thus, these books became a logical choice for this - project. Other books were chosen by the project's selection committees - for experiments with the technology, as well as to meet a demand or need. - - * Images will be decompressed before they are sent over the line; at - this time they are compressed and sent to the image filing system - and then sent to the printer as compressed images; they are returned - to the workstation as compressed 600-dpi images and the workstation - decompresses and scales them for display--an inefficient way to - access the material though it works quite well for printing and - other purposes. - - * CLASS is also decompressing on Macintosh and IBM, a slow process - right now. Eventually, compression and decompression will take - place on an image conversion server. Trade-offs will be made, based - on future performance testing, concerning where the file is - compressed and what resolution image is sent. - - * OCR has not been precluded; images are being stored that have been - scanned at a high resolution, which presumably would suit them well - to an OCR process. Because the material being scanned is about 100 - years old and was printed with less-than-ideal technologies, very - early and preliminary tests have not produced good results. But the - project is capturing an image that is of sufficient resolution to be - subjected to OCR in the future. Moreover, the system architecture - and the system plan have a logical place to store an OCR image if it - has been captured. But that is not being done now. - - ****** - -SESSION III. DISTRIBUTION, NETWORKS, AND NETWORKING: OPTIONS FOR -DISSEMINATION - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -ZICH * Issues pertaining to CD-ROMs * Options for publishing in CD-ROM * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Robert ZICH, special assistant to the associate librarian for special -projects, Library of Congress, and moderator of this session, first noted -the blessed but somewhat awkward circumstance of having four very -distinguished people representing networks and networking or at least -leaning in that direction, while lacking anyone to speak from the -strongest possible background in CD-ROMs. ZICH expressed the hope that -members of the audience would join the discussion. He stressed the -subtitle of this particular session, "Options for Dissemination," and, -concerning CD-ROMs, the importance of determining when it would be wise -to consider dissemination in CD-ROM versus networks. A shopping list of -issues pertaining to CD-ROMs included: the grounds for selecting -commercial publishers, and in-house publication where possible versus -nonprofit or government publication. A similar list for networks -included: determining when one should consider dissemination through a -network, identifying the mechanisms or entities that exist to place items -on networks, identifying the pool of existing networks, determining how a -producer would choose between networks, and identifying the elements of -a business arrangement in a network. - -Options for publishing in CD-ROM: an outside publisher versus -self-publication. If an outside publisher is used, it can be nonprofit, -such as the Government Printing Office (GPO) or the National Technical -Information Service (NTIS), in the case of government. The pros and cons -associated with employing an outside publisher are obvious. Among the -pros, there is no trouble getting accepted. One pays the bill and, in -effect, goes one's way. Among the cons, when one pays an outside -publisher to perform the work, that publisher will perform the work it is -obliged to do, but perhaps without the production expertise and skill in -marketing and dissemination that some would seek. There is the body of -commercial publishers that do possess that kind of expertise in -distribution and marketing but that obviously are selective. In -self-publication, one exercises full control, but then one must handle -matters such as distribution and marketing. Such are some of the options -for publishing in the case of CD-ROM. - -In the case of technical and design issues, which are also important, -there are many matters which many at the Workshop already knew a good -deal about: retrieval system requirements and costs, what to do about -images, the various capabilities and platforms, the trade-offs between -cost and performance, concerns about local-area networkability, -interoperability, etc. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -LYNCH * Creating networked information is different from using networks -as an access or dissemination vehicle * Networked multimedia on a large -scale does not yet work * Typical CD-ROM publication model a two-edged -sword * Publishing information on a CD-ROM in the present world of -immature standards * Contrast between CD-ROM and network pricing * -Examples demonstrated earlier in the day as a set of insular information -gems * Paramount need to link databases * Layering to become increasingly -necessary * Project NEEDS and the issues of information reuse and active -versus passive use * X-Windows as a way of differentiating between -network access and networked information * Barriers to the distribution -of networked multimedia information * Need for good, real-time delivery -protocols * The question of presentation integrity in client-server -computing in the academic world * Recommendations for producing multimedia -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Clifford LYNCH, director, Library Automation, University of California, -opened his talk with the general observation that networked information -constituted a difficult and elusive topic because it is something just -starting to develop and not yet fully understood. LYNCH contended that -creating genuinely networked information was different from using -networks as an access or dissemination vehicle and was more sophisticated -and more subtle. He invited the members of the audience to extrapolate, -from what they heard about the preceding demonstration projects, to what -sort of a world of electronics information--scholarly, archival, -cultural, etc.--they wished to end up with ten or fifteen years from now. -LYNCH suggested that to extrapolate directly from these projects would -produce unpleasant results. - -Putting the issue of CD-ROM in perspective before getting into -generalities on networked information, LYNCH observed that those engaged -in multimedia today who wish to ship a product, so to say, probably do -not have much choice except to use CD-ROM: networked multimedia on a -large scale basically does not yet work because the technology does not -exist. For example, anybody who has tried moving images around over the -Internet knows that this is an exciting touch-and-go process, a -fascinating and fertile area for experimentation, research, and -development, but not something that one can become deeply enthusiastic -about committing to production systems at this time. - -This situation will change, LYNCH said. He differentiated CD-ROM from -the practices that have been followed up to now in distributing data on -CD-ROM. For LYNCH the problem with CD-ROM is not its portability or its -slowness but the two-edged sword of having the retrieval application and -the user interface inextricably bound up with the data, which is the -typical CD-ROM publication model. It is not a case of publishing data -but of distributing a typically stand-alone, typically closed system, -all--software, user interface, and data--on a little disk. Hence, all -the between-disk navigational issues as well as the impossibility in most -cases of integrating data on one disk with that on another. Most CD-ROM -retrieval software does not network very gracefully at present. However, -in the present world of immature standards and lack of understanding of -what network information is or what the ground rules are for creating or -using it, publishing information on a CD-ROM does add value in a very -real sense. - -LYNCH drew a contrast between CD-ROM and network pricing and in doing so -highlighted something bizarre in information pricing. A large -institution such as the University of California has vendors who will -offer to sell information on CD-ROM for a price per year in four digits, -but for the same data (e.g., an abstracting and indexing database) on -magnetic tape, regardless of how many people may use it concurrently, -will quote a price in six digits. - -What is packaged with the CD-ROM in one sense adds value--a complete -access system, not just raw, unrefined information--although it is not -generally perceived that way. This is because the access software, -although it adds value, is viewed by some people, particularly in the -university environment where there is a very heavy commitment to -networking, as being developed in the wrong direction. - -Given that context, LYNCH described the examples demonstrated as a set of -insular information gems--Perseus, for example, offers nicely linked -information, but would be very difficult to integrate with other -databases, that is, to link together seamlessly with other source files -from other sources. It resembles an island, and in this respect is -similar to numerous stand-alone projects that are based on videodiscs, -that is, on the single-workstation concept. - -As scholarship evolves in a network environment, the paramount need will -be to link databases. We must link personal databases to public -databases, to group databases, in fairly seamless ways--which is -extremely difficult in the environments under discussion with copies of -databases proliferating all over the place. - -The notion of layering also struck LYNCH as lurking in several of the -projects demonstrated. Several databases in a sense constitute -information archives without a significant amount of navigation built in. -Educators, critics, and others will want a layered structure--one that -defines or links paths through the layers to allow users to reach -specific points. In LYNCH's view, layering will become increasingly -necessary, and not just within a single resource but across resources -(e.g., tracing mythology and cultural themes across several classics -databases as well as a database of Renaissance culture). This ability to -organize resources, to build things out of multiple other things on the -network or select pieces of it, represented for LYNCH one of the key -aspects of network information. - -Contending that information reuse constituted another significant issue, -LYNCH commended to the audience's attention Project NEEDS (i.e., National -Engineering Education Delivery System). This project's objective is to -produce a database of engineering courseware as well as the components -that can be used to develop new courseware. In a number of the existing -applications, LYNCH said, the issue of reuse (how much one can take apart -and reuse in other applications) was not being well considered. He also -raised the issue of active versus passive use, one aspect of which is -how much information will be manipulated locally by users. Most people, -he argued, may do a little browsing and then will wish to print. LYNCH -was uncertain how these resources would be used by the vast majority of -users in the network environment. - -LYNCH next said a few words about X-Windows as a way of differentiating -between network access and networked information. A number of the -applications demonstrated at the Workshop could be rewritten to use X -across the network, so that one could run them from any X-capable device- --a workstation, an X terminal--and transact with a database across the -network. Although this opens up access a little, assuming one has enough -network to handle it, it does not provide an interface to develop a -program that conveniently integrates information from multiple databases. -X is a viewing technology that has limits. In a real sense, it is just a -graphical version of remote log-in across the network. X-type applications -represent only one step in the progression towards real access. - -LYNCH next discussed barriers to the distribution of networked multimedia -information. The heart of the problem is a lack of standards to provide -the ability for computers to talk to each other, retrieve information, -and shuffle it around fairly casually. At the moment, little progress is -being made on standards for networked information; for example, present -standards do not cover images, digital voice, and digital video. A -useful tool kit of exchange formats for basic texts is only now being -assembled. The synchronization of content streams (i.e., synchronizing a -voice track to a video track, establishing temporal relations between -different components in a multimedia object) constitutes another issue -for networked multimedia that is just beginning to receive attention. - -Underlying network protocols also need some work; good, real-time -delivery protocols on the Internet do not yet exist. In LYNCH's view, -highly important in this context is the notion of networked digital -object IDs, the ability of one object on the network to point to another -object (or component thereof) on the network. Serious bandwidth issues -also exist. LYNCH was uncertain if billion-bit-per-second networks would -prove sufficient if numerous people ran video in parallel. - -LYNCH concluded by offering an issue for database creators to consider, -as well as several comments about what might constitute good trial -multimedia experiments. In a networked information world the database -builder or service builder (publisher) does not exercise the same -extensive control over the integrity of the presentation; strange -programs "munge" with one's data before the user sees it. Serious -thought must be given to what guarantees integrity of presentation. Part -of that is related to where one draws the boundaries around a networked -information service. This question of presentation integrity in -client-server computing has not been stressed enough in the academic -world, LYNCH argued, though commercial service providers deal with it -regularly. - -Concerning multimedia, LYNCH observed that good multimedia at the moment -is hideously expensive to produce. He recommended producing multimedia -with either very high sale value, or multimedia with a very long life -span, or multimedia that will have a very broad usage base and whose -costs therefore can be amortized among large numbers of users. In this -connection, historical and humanistically oriented material may be a good -place to start, because it tends to have a longer life span than much of -the scientific material, as well as a wider user base. LYNCH noted, for -example, that American Memory fits many of the criteria outlined. He -remarked the extensive discussion about bringing the Internet or the -National Research and Education Network (NREN) into the K-12 environment -as a way of helping the American educational system. - -LYNCH closed by noting that the kinds of applications demonstrated struck -him as excellent justifications of broad-scale networking for K-12, but -that at this time no "killer" application exists to mobilize the K-12 -community to obtain connectivity. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * Dearth of genuinely interesting applications on the network -a slow-changing situation * The issue of the integrity of presentation in -a networked environment * Several reasons why CD-ROM software does not -network * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -During the discussion period that followed LYNCH's presentation, several -additional points were made. - -LYNCH reiterated even more strongly his contention that, historically, -once one goes outside high-end science and the group of those who need -access to supercomputers, there is a great dearth of genuinely -interesting applications on the network. He saw this situation changing -slowly, with some of the scientific databases and scholarly discussion -groups and electronic journals coming on as well as with the availability -of Wide Area Information Servers (WAIS) and some of the databases that -are being mounted there. However, many of those things do not seem to -have piqued great popular interest. For instance, most high school -students of LYNCH's acquaintance would not qualify as devotees of serious -molecular biology. - -Concerning the issue of the integrity of presentation, LYNCH believed -that a couple of information providers have laid down the law at least on -certain things. For example, his recollection was that the National -Library of Medicine feels strongly that one needs to employ the -identifier field if he or she is to mount a database commercially. The -problem with a real networked environment is that one does not know who -is reformatting and reprocessing one's data when one enters a client -server mode. It becomes anybody's guess, for example, if the network -uses a Z39.50 server, or what clients are doing with one's data. A data -provider can say that his contract will only permit clients to have -access to his data after he vets them and their presentation and makes -certain it suits him. But LYNCH held out little expectation that the -network marketplace would evolve in that way, because it required too -much prior negotiation. - -CD-ROM software does not network for a variety of reasons, LYNCH said. -He speculated that CD-ROM publishers are not eager to have their products -really hook into wide area networks, because they fear it will make their -data suppliers nervous. Moreover, until relatively recently, one had to -be rather adroit to run a full TCP/IP stack plus applications on a -PC-size machine, whereas nowadays it is becoming easier as PCs grow -bigger and faster. LYNCH also speculated that software providers had not -heard from their customers until the last year or so, or had not heard -from enough of their customers. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -BESSER * Implications of disseminating images on the network; planning -the distribution of multimedia documents poses two critical -implementation problems * Layered approach represents the way to deal -with users' capabilities * Problems in platform design; file size and its -implications for networking * Transmission of megabyte size images -impractical * Compression and decompression at the user's end * Promising -trends for compression * A disadvantage of using X-Windows * A project at -the Smithsonian that mounts images on several networks * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Howard BESSER, School of Library and Information Science, University of -Pittsburgh, spoke primarily about multimedia, focusing on images and the -broad implications of disseminating them on the network. He argued that -planning the distribution of multimedia documents posed two critical -implementation problems, which he framed in the form of two questions: -1) What platform will one use and what hardware and software will users -have for viewing of the material? and 2) How can one deliver a -sufficiently robust set of information in an accessible format in a -reasonable amount of time? Depending on whether network or CD-ROM is the -medium used, this question raises different issues of storage, -compression, and transmission. - -Concerning the design of platforms (e.g., sound, gray scale, simple -color, etc.) and the various capabilities users may have, BESSER -maintained that a layered approach was the way to deal with users' -capabilities. A result would be that users with less powerful -workstations would simply have less functionality. He urged members of -the audience to advocate standards and accompanying software that handle -layered functionality across a wide variety of platforms. - -BESSER also addressed problems in platform design, namely, deciding how -large a machine to design for situations when the largest number of users -have the lowest level of the machine, and one desires higher -functionality. BESSER then proceeded to the question of file size and -its implications for networking. He discussed still images in the main. -For example, a digital color image that fills the screen of a standard -mega-pel workstation (Sun or Next) will require one megabyte of storage -for an eight-bit image or three megabytes of storage for a true color or -twenty-four-bit image. Lossless compression algorithms (that is, -computational procedures in which no data is lost in the process of -compressing [and decompressing] an image--the exact bit-representation is -maintained) might bring storage down to a third of a megabyte per image, -but not much further than that. The question of size makes it difficult -to fit an appropriately sized set of these images on a single disk or to -transmit them quickly enough on a network. - -With these full screen mega-pel images that constitute a third of a -megabyte, one gets 1,000-3,000 full-screen images on a one-gigabyte disk; -a standard CD-ROM represents approximately 60 percent of that. Storing -images the size of a PC screen (just 8 bit color) increases storage -capacity to 4,000-12,000 images per gigabyte; 60 percent of that gives -one the size of a CD-ROM, which in turn creates a major problem. One -cannot have full-screen, full-color images with lossless compression; one -must compress them or use a lower resolution. For megabyte-size images, -anything slower than a T-1 speed is impractical. For example, on a -fifty-six-kilobaud line, it takes three minutes to transfer a -one-megabyte file, if it is not compressed; and this speed assumes ideal -circumstances (no other user contending for network bandwidth). Thus, -questions of disk access, remote display, and current telephone -connection speed make transmission of megabyte-size images impractical. - -BESSER then discussed ways to deal with these large images, for example, -compression and decompression at the user's end. In this connection, the -issues of how much one is willing to lose in the compression process and -what image quality one needs in the first place are unknown. But what is -known is that compression entails some loss of data. BESSER urged that -more studies be conducted on image quality in different situations, for -example, what kind of images are needed for what kind of disciplines, and -what kind of image quality is needed for a browsing tool, an intermediate -viewing tool, and archiving. - -BESSER remarked two promising trends for compression: from a technical -perspective, algorithms that use what is called subjective redundancy -employ principles from visual psycho-physics to identify and remove -information from the image that the human eye cannot perceive; from an -interchange and interoperability perspective, the JPEG (i.e., Joint -Photographic Experts Group, an ISO standard) compression algorithms also -offer promise. These issues of compression and decompression, BESSER -argued, resembled those raised earlier concerning the design of different -platforms. Gauging the capabilities of potential users constitutes a -primary goal. BESSER advocated layering or separating the images from -the applications that retrieve and display them, to avoid tying them to -particular software. - -BESSER detailed several lessons learned from his work at Berkeley with -Imagequery, especially the advantages and disadvantages of using -X-Windows. In the latter category, for example, retrieval is tied -directly to one's data, an intolerable situation in the long run on a -networked system. Finally, BESSER described a project of Jim Wallace at -the Smithsonian Institution, who is mounting images in a extremely -rudimentary way on the Compuserv and Genie networks and is preparing to -mount them on America On Line. Although the average user takes over -thirty minutes to download these images (assuming a fairly fast modem), -nevertheless, images have been downloaded 25,000 times. - -BESSER concluded his talk with several comments on the business -arrangement between the Smithsonian and Compuserv. He contended that not -enough is known concerning the value of images. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * Creating digitized photographic collections nearly -impossible except with large organizations like museums * Need for study -to determine quality of images users will tolerate * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -During the brief exchange between LESK and BESSER that followed, several -clarifications emerged. - -LESK argued that the photographers were far ahead of BESSER: It is -almost impossible to create such digitized photographic collections -except with large organizations like museums, because all the -photographic agencies have been going crazy about this and will not sign -licensing agreements on any sort of reasonable terms. LESK had heard -that National Geographic, for example, had tried to buy the right to use -some image in some kind of educational production for $100 per image, but -the photographers will not touch it. They want accounting and payment -for each use, which cannot be accomplished within the system. BESSER -responded that a consortium of photographers, headed by a former National -Geographic photographer, had started assembling its own collection of -electronic reproductions of images, with the money going back to the -cooperative. - -LESK contended that BESSER was unnecessarily pessimistic about multimedia -images, because people are accustomed to low-quality images, particularly -from video. BESSER urged the launching of a study to determine what -users would tolerate, what they would feel comfortable with, and what -absolutely is the highest quality they would ever need. Conceding that -he had adopted a dire tone in order to arouse people about the issue, -BESSER closed on a sanguine note by saying that he would not be in this -business if he did not think that things could be accomplished. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -LARSEN * Issues of scalability and modularity * Geometric growth of the -Internet and the role played by layering * Basic functions sustaining -this growth * A library's roles and functions in a network environment * -Effects of implementation of the Z39.50 protocol for information -retrieval on the library system * The trade-off between volumes of data -and its potential usage * A snapshot of current trends * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Ronald LARSEN, associate director for information technology, University -of Maryland at College Park, first addressed the issues of scalability -and modularity. He noted the difficulty of anticipating the effects of -orders-of-magnitude growth, reflecting on the twenty years of experience -with the Arpanet and Internet. Recalling the day's demonstrations of -CD-ROM and optical disk material, he went on to ask if the field has yet -learned how to scale new systems to enable delivery and dissemination -across large-scale networks. - -LARSEN focused on the geometric growth of the Internet from its inception -circa 1969 to the present, and the adjustments required to respond to -that rapid growth. To illustrate the issue of scalability, LARSEN -considered computer networks as including three generic components: -computers, network communication nodes, and communication media. Each -component scales (e.g., computers range from PCs to supercomputers; -network nodes scale from interface cards in a PC through sophisticated -routers and gateways; and communication media range from 2,400-baud -dial-up facilities through 4.5-Mbps backbone links, and eventually to -multigigabit-per-second communication lines), and architecturally, the -components are organized to scale hierarchically from local area networks -to international-scale networks. Such growth is made possible by -building layers of communication protocols, as BESSER pointed out. -By layering both physically and logically, a sense of scalability is -maintained from local area networks in offices, across campuses, through -bridges, routers, campus backbones, fiber-optic links, etc., up into -regional networks and ultimately into national and international -networks. - -LARSEN then illustrated the geometric growth over a two-year period-- -through September 1991--of the number of networks that comprise the -Internet. This growth has been sustained largely by the availability of -three basic functions: electronic mail, file transfer (ftp), and remote -log-on (telnet). LARSEN also reviewed the growth in the kind of traffic -that occurs on the network. Network traffic reflects the joint contributions -of a larger population of users and increasing use per user. Today one sees -serious applications involving moving images across the network--a rarity -ten years ago. LARSEN recalled and concurred with BESSER's main point -that the interesting problems occur at the application level. - -LARSEN then illustrated a model of a library's roles and functions in a -network environment. He noted, in particular, the placement of on-line -catalogues onto the network and patrons obtaining access to the library -increasingly through local networks, campus networks, and the Internet. -LARSEN supported LYNCH's earlier suggestion that we need to address -fundamental questions of networked information in order to build -environments that scale in the information sense as well as in the -physical sense. - -LARSEN supported the role of the library system as the access point into -the nation's electronic collections. Implementation of the Z39.50 -protocol for information retrieval would make such access practical and -feasible. For example, this would enable patrons in Maryland to search -California libraries, or other libraries around the world that are -conformant with Z39.50 in a manner that is familiar to University of -Maryland patrons. This client-server model also supports moving beyond -secondary content into primary content. (The notion of how one links -from secondary content to primary content, LARSEN said, represents a -fundamental problem that requires rigorous thought.) After noting -numerous network experiments in accessing full-text materials, including -projects supporting the ordering of materials across the network, LARSEN -revisited the issue of transmitting high-density, high-resolution color -images across the network and the large amounts of bandwidth they -require. He went on to address the bandwidth and synchronization -problems inherent in sending full-motion video across the network. - -LARSEN illustrated the trade-off between volumes of data in bytes or -orders of magnitude and the potential usage of that data. He discussed -transmission rates (particularly, the time it takes to move various forms -of information), and what one could do with a network supporting -multigigabit-per-second transmission. At the moment, the network -environment includes a composite of data-transmission requirements, -volumes and forms, going from steady to bursty (high-volume) and from -very slow to very fast. This aggregate must be considered in the design, -construction, and operation of multigigabyte networks. - -LARSEN's objective is to use the networks and library systems now being -constructed to increase access to resources wherever they exist, and -thus, to evolve toward an on-line electronic virtual library. - -LARSEN concluded by offering a snapshot of current trends: continuing -geometric growth in network capacity and number of users; slower -development of applications; and glacial development and adoption of -standards. The challenge is to design and develop each new application -system with network access and scalability in mind. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -BROWNRIGG * Access to the Internet cannot be taken for granted * Packet -radio and the development of MELVYL in 1980-81 in the Division of Library -Automation at the University of California * Design criteria for packet -radio * A demonstration project in San Diego and future plans * Spread -spectrum * Frequencies at which the radios will run and plans to -reimplement the WAIS server software in the public domain * Need for an -infrastructure of radios that do not move around * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Edwin BROWNRIGG, executive director, Memex Research Institute, first -polled the audience in order to seek out regular users of the Internet as -well as those planning to use it some time in the future. With nearly -everybody in the room falling into one category or the other, BROWNRIGG -made a point re access, namely that numerous individuals, especially those -who use the Internet every day, take for granted their access to it, the -speeds with which they are connected, and how well it all works. -However, as BROWNRIGG discovered between 1987 and 1989 in Australia, -if one wants access to the Internet but cannot afford it or has some -physical boundary that prevents her or him from gaining access, it can -be extremely frustrating. He suggested that because of economics and -physical barriers we were beginning to create a world of haves and have-nots -in the process of scholarly communication, even in the United States. - -BROWNRIGG detailed the development of MELVYL in academic year 1980-81 in -the Division of Library Automation at the University of California, in -order to underscore the issue of access to the system, which at the -outset was extremely limited. In short, the project needed to build a -network, which at that time entailed use of satellite technology, that is, -putting earth stations on campus and also acquiring some terrestrial links -from the State of California's microwave system. The installation of -satellite links, however, did not solve the problem (which actually -formed part of a larger problem involving politics and financial resources). -For while the project team could get a signal onto a campus, it had no means -of distributing the signal throughout the campus. The solution involved -adopting a recent development in wireless communication called packet radio, -which combined the basic notion of packet-switching with radio. The project -used this technology to get the signal from a point on campus where it -came down, an earth station for example, into the libraries, because it -found that wiring the libraries, especially the older marble buildings, -would cost $2,000-$5,000 per terminal. - -BROWNRIGG noted that, ten years ago, the project had neither the public -policy nor the technology that would have allowed it to use packet radio -in any meaningful way. Since then much had changed. He proceeded to -detail research and development of the technology, how it is being -deployed in California, and what direction he thought it would take. -The design criteria are to produce a high-speed, one-time, low-cost, -high-quality, secure, license-free device (packet radio) that one can -plug in and play today, forget about it, and have access to the Internet. -By high speed, BROWNRIGG meant 1 megabyte and 1.5 megabytes. Those units -have been built, he continued, and are in the process of being -type-certified by an independent underwriting laboratory so that they can -be type-licensed by the Federal Communications Commission. As is the -case with citizens band, one will be able to purchase a unit and not have -to worry about applying for a license. - -The basic idea, BROWNRIGG elaborated, is to take high-speed radio data -transmission and create a backbone network that at certain strategic -points in the network will "gateway" into a medium-speed packet radio -(i.e., one that runs at 38.4 kilobytes), so that perhaps by 1994-1995 -people, like those in the audience for the price of a VCR could purchase -a medium-speed radio for the office or home, have full network connectivity -to the Internet, and partake of all its services, with no need for an FCC -license and no regular bill from the local common carrier. BROWNRIGG -presented several details of a demonstration project currently taking -place in San Diego and described plans, pending funding, to install a -full-bore network in the San Francisco area. This network will have 600 -nodes running at backbone speeds, and 100 of these nodes will be libraries, -which in turn will be the gateway ports to the 38.4 kilobyte radios that -will give coverage for the neighborhoods surrounding the libraries. - -BROWNRIGG next explained Part 15.247, a new rule within Title 47 of the -Code of Federal Regulations enacted by the FCC in 1985. This rule -challenged the industry, which has only now risen to the occasion, to -build a radio that would run at no more than one watt of output power and -use a fairly exotic method of modulating the radio wave called spread -spectrum. Spread spectrum in fact permits the building of networks so -that numerous data communications can occur simultaneously, without -interfering with each other, within the same wide radio channel. - -BROWNRIGG explained that the frequencies at which the radios would run -are very short wave signals. They are well above standard microwave and -radar. With a radio wave that small, one watt becomes a tremendous punch -per bit and thus makes transmission at reasonable speed possible. In -order to minimize the potential for congestion, the project is -undertaking to reimplement software which has been available in the -networking business and is taken for granted now, for example, TCP/IP, -routing algorithms, bridges, and gateways. In addition, the project -plans to take the WAIS server software in the public domain and -reimplement it so that one can have a WAIS server on a Mac instead of a -Unix machine. The Memex Research Institute believes that libraries, in -particular, will want to use the WAIS servers with packet radio. This -project, which has a team of about twelve people, will run through 1993 -and will include the 100 libraries already mentioned as well as other -professionals such as those in the medical profession, engineering, and -law. Thus, the need is to create an infrastructure of radios that do not -move around, which, BROWNRIGG hopes, will solve a problem not only for -libraries but for individuals who, by and large today, do not have access -to the Internet from their homes and offices. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * Project operating frequencies * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -During a brief discussion period, which also concluded the day's -proceedings, BROWNRIGG stated that the project was operating in four -frequencies. The slow speed is operating at 435 megahertz, and it would -later go up to 920 megahertz. With the high-speed frequency, the -one-megabyte radios will run at 2.4 gigabits, and 1.5 will run at 5.7. -At 5.7, rain can be a factor, but it would have to be tropical rain, -unlike what falls in most parts of the United States. - - ****** - -SESSION IV. IMAGE CAPTURE, TEXT CAPTURE, OVERVIEW OF TEXT AND - IMAGE STORAGE FORMATS - -William HOOTON, vice president of operations, I-NET, moderated this session. - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -KENNEY * Factors influencing development of CXP * Advantages of using -digital technology versus photocopy and microfilm * A primary goal of -CXP; publishing challenges * Characteristics of copies printed * Quality -of samples achieved in image capture * Several factors to be considered -in choosing scanning * Emphasis of CXP on timely and cost-effective -production of black-and-white printed facsimiles * Results of producing -microfilm from digital files * Advantages of creating microfilm * Details -concerning production * Costs * Role of digital technology in library -preservation * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Anne KENNEY, associate director, Department of Preservation and -Conservation, Cornell University, opened her talk by observing that the -Cornell Xerox Project (CXP) has been guided by the assumption that the -ability to produce printed facsimiles or to replace paper with paper -would be important, at least for the present generation of users and -equipment. She described three factors that influenced development of -the project: 1) Because the project has emphasized the preservation of -deteriorating brittle books, the quality of what was produced had to be -sufficiently high to return a paper replacement to the shelf. CXP was -only interested in using: 2) a system that was cost-effective, which -meant that it had to be cost-competitive with the processes currently -available, principally photocopy and microfilm, and 3) new or currently -available product hardware and software. - -KENNEY described the advantages that using digital technology offers over -both photocopy and microfilm: 1) The potential exists to create a higher -quality reproduction of a deteriorating original than conventional -light-lens technology. 2) Because a digital image is an encoded -representation, it can be reproduced again and again with no resulting -loss of quality, as opposed to the situation with light-lens processes, -in which there is discernible difference between a second and a -subsequent generation of an image. 3) A digital image can be manipulated -in a number of ways to improve image capture; for example, Xerox has -developed a windowing application that enables one to capture a page -containing both text and illustrations in a manner that optimizes the -reproduction of both. (With light-lens technology, one must choose which -to optimize, text or the illustration; in preservation microfilming, the -current practice is to shoot an illustrated page twice, once to highlight -the text and the second time to provide the best capture for the -illustration.) 4) A digital image can also be edited, density levels -adjusted to remove underlining and stains, and to increase legibility for -faint documents. 5) On-screen inspection can take place at the time of -initial setup and adjustments made prior to scanning, factors that -substantially reduce the number of retakes required in quality control. - -A primary goal of CXP has been to evaluate the paper output printed on -the Xerox DocuTech, a high-speed printer that produces 600-dpi pages from -scanned images at a rate of 135 pages a minute. KENNEY recounted several -publishing challenges to represent faithful and legible reproductions of -the originals that the 600-dpi copy for the most part successfully -captured. For example, many of the deteriorating volumes in the project -were heavily illustrated with fine line drawings or halftones or came in -languages such as Japanese, in which the buildup of characters comprised -of varying strokes is difficult to reproduce at lower resolutions; a -surprising number of them came with annotations and mathematical -formulas, which it was critical to be able to duplicate exactly. - -KENNEY noted that 1) the copies are being printed on paper that meets the -ANSI standards for performance, 2) the DocuTech printer meets the machine -and toner requirements for proper adhesion of print to page, as described -by the National Archives, and thus 3) paper product is considered to be -the archival equivalent of preservation photocopy. - -KENNEY then discussed several samples of the quality achieved in the -project that had been distributed in a handout, for example, a copy of a -print-on-demand version of the 1911 Reed lecture on the steam turbine, -which contains halftones, line drawings, and illustrations embedded in -text; the first four loose pages in the volume compared the capture -capabilities of scanning to photocopy for a standard test target, the -IEEE standard 167A 1987 test chart. In all instances scanning proved -superior to photocopy, though only slightly more so in one. - -Conceding the simplistic nature of her review of the quality of scanning -to photocopy, KENNEY described it as one representation of the kinds of -settings that could be used with scanning capabilities on the equipment -CXP uses. KENNEY also pointed out that CXP investigated the quality -achieved with binary scanning only, and noted the great promise in gray -scale and color scanning, whose advantages and disadvantages need to be -examined. She argued further that scanning resolutions and file formats -can represent a complex trade-off between the time it takes to capture -material, file size, fidelity to the original, and on-screen display; and -printing and equipment availability. All these factors must be taken -into consideration. - -CXP placed primary emphasis on the production in a timely and -cost-effective manner of printed facsimiles that consisted largely of -black-and-white text. With binary scanning, large files may be -compressed efficiently and in a lossless manner (i.e., no data is lost in -the process of compressing [and decompressing] an image--the exact -bit-representation is maintained) using Group 4 CCITT (i.e., the French -acronym for International Consultative Committee for Telegraph and -Telephone) compression. CXP was getting compression ratios of about -forty to one. Gray-scale compression, which primarily uses JPEG, is much -less economical and can represent a lossy compression (i.e., not -lossless), so that as one compresses and decompresses, the illustration -is subtly changed. While binary files produce a high-quality printed -version, it appears 1) that other combinations of spatial resolution with -gray and/or color hold great promise as well, and 2) that gray scale can -represent a tremendous advantage for on-screen viewing. The quality -associated with binary and gray scale also depends on the equipment used. -For instance, binary scanning produces a much better copy on a binary -printer. - -Among CXP's findings concerning the production of microfilm from digital -files, KENNEY reported that the digital files for the same Reed lecture -were used to produce sample film using an electron beam recorder. The -resulting film was faithful to the image capture of the digital files, -and while CXP felt that the text and image pages represented in the Reed -lecture were superior to that of the light-lens film, the resolution -readings for the 600 dpi were not as high as standard microfilming. -KENNEY argued that the standards defined for light-lens technology are -not totally transferable to a digital environment. Moreover, they are -based on definition of quality for a preservation copy. Although making -this case will prove to be a long, uphill struggle, CXP plans to continue -to investigate the issue over the course of the next year. - -KENNEY concluded this portion of her talk with a discussion of the -advantages of creating film: it can serve as a primary backup and as a -preservation master to the digital file; it could then become the print -or production master and service copies could be paper, film, optical -disks, magnetic media, or on-screen display. - -Finally, KENNEY presented details re production: - - * Development and testing of a moderately-high resolution production - scanning workstation represented a third goal of CXP; to date, 1,000 - volumes have been scanned, or about 300,000 images. - - * The resulting digital files are stored and used to produce - hard-copy replacements for the originals and additional prints on - demand; although the initial costs are high, scanning technology - offers an affordable means for reformatting brittle material. - - * A technician in production mode can scan 300 pages per hour when - performing single-sheet scanning, which is a necessity when working - with truly brittle paper; this figure is expected to increase - significantly with subsequent iterations of the software from Xerox; - a three-month time-and-cost study of scanning found that the average - 300-page book would take about an hour and forty minutes to scan - (this figure included the time for setup, which involves keying in - primary bibliographic data, going into quality control mode to - define page size, establishing front-to-back registration, and - scanning sample pages to identify a default range of settings for - the entire book--functions not dissimilar to those performed by - filmers or those preparing a book for photocopy). - - * The final step in the scanning process involved rescans, which - happily were few and far between, representing well under 1 percent - of the total pages scanned. - -In addition to technician time, CXP costed out equipment, amortized over -four years, the cost of storing and refreshing the digital files every -four years, and the cost of printing and binding, book-cloth binding, a -paper reproduction. The total amounted to a little under $65 per single -300-page volume, with 30 percent overhead included--a figure competitive -with the prices currently charged by photocopy vendors. - -Of course, with scanning, in addition to the paper facsimile, one is left -with a digital file from which subsequent copies of the book can be -produced for a fraction of the cost of photocopy, with readers afforded -choices in the form of these copies. - -KENNEY concluded that digital technology offers an electronic means for a -library preservation effort to pay for itself. If a brittle-book program -included the means of disseminating reprints of books that are in demand -by libraries and researchers alike, the initial investment in capture -could be recovered and used to preserve additional but less popular -books. She disclosed that an economic model for a self-sustaining -program could be developed for CXP's report to the Commission on -Preservation and Access (CPA). - -KENNEY stressed that the focus of CXP has been on obtaining high quality -in a production environment. The use of digital technology is viewed as -an affordable alternative to other reformatting options. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -ANDRE * Overview and history of NATDP * Various agricultural CD-ROM -products created inhouse and by service bureaus * Pilot project on -Internet transmission * Additional products in progress * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Pamela ANDRE, associate director for automation, National Agricultural -Text Digitizing Program (NATDP), National Agricultural Library (NAL), -presented an overview of NATDP, which has been underway at NAL the last -four years, before Judith ZIDAR discussed the technical details. ANDRE -defined agricultural information as a broad range of material going from -basic and applied research in the hard sciences to the one-page pamphlets -that are distributed by the cooperative state extension services on such -things as how to grow blueberries. - -NATDP began in late 1986 with a meeting of representatives from the -land-grant library community to deal with the issue of electronic -information. NAL and forty-five of these libraries banded together to -establish this project--to evaluate the technology for converting what -were then source documents in paper form into electronic form, to provide -access to that digital information, and then to distribute it. -Distributing that material to the community--the university community as -well as the extension service community, potentially down to the county -level--constituted the group's chief concern. - -Since January 1988 (when the microcomputer-based scanning system was -installed at NAL), NATDP has done a variety of things, concerning which -ZIDAR would provide further details. For example, the first technology -considered in the project's discussion phase was digital videodisc, which -indicates how long ago it was conceived. - -Over the four years of this project, four separate CD-ROM products on -four different agricultural topics were created, two at a -scanning-and-OCR station installed at NAL, and two by service bureaus. -Thus, NATDP has gained comparative information in terms of those relative -costs. Each of these products contained the full ASCII text as well as -page images of the material, or between 4,000 and 6,000 pages of material -on these disks. Topics included aquaculture, food, agriculture and -science (i.e., international agriculture and research), acid rain, and -Agent Orange, which was the final product distributed (approximately -eighteen months before the Workshop). - -The third phase of NATDP focused on delivery mechanisms other than -CD-ROM. At the suggestion of Clifford LYNCH, who was a technical -consultant to the project at this point, NATDP became involved with the -Internet and initiated a project with the help of North Carolina State -University, in which fourteen of the land-grant university libraries are -transmitting digital images over the Internet in response to interlibrary -loan requests--a topic for another meeting. At this point, the pilot -project had been completed for about a year and the final report would be -available shortly after the Workshop. In the meantime, the project's -success had led to its extension. (ANDRE noted that one of the first -things done under the program title was to select a retrieval package to -use with subsequent products; Windows Personal Librarian was the package -of choice after a lengthy evaluation.) - -Three additional products had been planned and were in progress: - - 1) An arrangement with the American Society of Agronomy--a - professional society that has published the Agronomy Journal since - about 1908--to scan and create bit-mapped images of its journal. - ASA granted permission first to put and then to distribute this - material in electronic form, to hold it at NAL, and to use these - electronic images as a mechanism to deliver documents or print out - material for patrons, among other uses. Effectively, NAL has the - right to use this material in support of its program. - (Significantly, this arrangement offers a potential cooperative - model for working with other professional societies in agriculture - to try to do the same thing--put the journals of particular interest - to agriculture research into electronic form.) - - 2) An extension of the earlier product on aquaculture. - - 3) The George Washington Carver Papers--a joint project with - Tuskegee University to scan and convert from microfilm some 3,500 - images of Carver's papers, letters, and drawings. - -It was anticipated that all of these products would appear no more than -six months after the Workshop. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -ZIDAR * (A separate arena for scanning) * Steps in creating a database * -Image capture, with and without performing OCR * Keying in tracking data -* Scanning, with electronic and manual tracking * Adjustments during -scanning process * Scanning resolutions * Compression * De-skewing and -filtering * Image capture from microform: the papers and letters of -George Washington Carver * Equipment used for a scanning system * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Judith ZIDAR, coordinator, National Agricultural Text Digitizing Program -(NATDP), National Agricultural Library (NAL), illustrated the technical -details of NATDP, including her primary responsibility, scanning and -creating databases on a topic and putting them on CD-ROM. - -(ZIDAR remarked a separate arena from the CD-ROM projects, although the -processing of the material is nearly identical, in which NATDP is also -scanning material and loading it on a Next microcomputer, which in turn -is linked to NAL's integrated library system. Thus, searches in NAL's -bibliographic database will enable people to pull up actual page images -and text for any documents that have been entered.) - -In accordance with the session's topic, ZIDAR focused her illustrated -talk on image capture, offering a primer on the three main steps in the -process: 1) assemble the printed publications; 2) design the database -(database design occurs in the process of preparing the material for -scanning; this step entails reviewing and organizing the material, -defining the contents--what will constitute a record, what kinds of -fields will be captured in terms of author, title, etc.); 3) perform a -certain amount of markup on the paper publications. NAL performs this -task record by record, preparing work sheets or some other sort of -tracking material and designing descriptors and other enhancements to be -added to the data that will not be captured from the printed publication. -Part of this process also involves determining NATDP's file and directory -structure: NATDP attempts to avoid putting more than approximately 100 -images in a directory, because placing more than that on a CD-ROM would -reduce the access speed. - -This up-front process takes approximately two weeks for a -6,000-7,000-page database. The next step is to capture the page images. -How long this process takes is determined by the decision whether or not -to perform OCR. Not performing OCR speeds the process, whereas text -capture requires greater care because of the quality of the image: it -has to be straighter and allowance must be made for text on a page, not -just for the capture of photographs. - -NATDP keys in tracking data, that is, a standard bibliographic record -including the title of the book and the title of the chapter, which will -later either become the access information or will be attached to the -front of a full-text record so that it is searchable. - -Images are scanned from a bound or unbound publication, chiefly from -bound publications in the case of NATDP, however, because often they are -the only copies and the publications are returned to the shelves. NATDP -usually scans one record at a time, because its database tracking system -tracks the document in that way and does not require further logical -separating of the images. After performing optical character -recognition, NATDP moves the images off the hard disk and maintains a -volume sheet. Though the system tracks electronically, all the -processing steps are also tracked manually with a log sheet. - -ZIDAR next illustrated the kinds of adjustments that one can make when -scanning from paper and microfilm, for example, redoing images that need -special handling, setting for dithering or gray scale, and adjusting for -brightness or for the whole book at one time. - -NATDP is scanning at 300 dots per inch, a standard scanning resolution. -Though adequate for capturing text that is all of a standard size, 300 -dpi is unsuitable for any kind of photographic material or for very small -text. Many scanners allow for different image formats, TIFF, of course, -being a de facto standard. But if one intends to exchange images with -other people, the ability to scan other image formats, even if they are -less common, becomes highly desirable. - -CCITT Group 4 is the standard compression for normal black-and-white -images, JPEG for gray scale or color. ZIDAR recommended 1) using the -standard compressions, particularly if one attempts to make material -available and to allow users to download images and reuse them from -CD-ROMs; and 2) maintaining the ability to output an uncompressed image, -because in image exchange uncompressed images are more likely to be able -to cross platforms. - -ZIDAR emphasized the importance of de-skewing and filtering as -requirements on NATDP's upgraded system. For instance, scanning bound -books, particularly books published by the federal government whose pages -are skewed, and trying to scan them straight if OCR is to be performed, -is extremely time-consuming. The same holds for filtering of -poor-quality or older materials. - -ZIDAR described image capture from microform, using as an example three -reels from a sixty-seven-reel set of the papers and letters of George -Washington Carver that had been produced by Tuskegee University. These -resulted in approximately 3,500 images, which NATDP had had scanned by -its service contractor, Science Applications International Corporation -(SAIC). NATDP also created bibliographic records for access. (NATDP did -not have such specialized equipment as a microfilm scanner. - -Unfortunately, the process of scanning from microfilm was not an -unqualified success, ZIDAR reported: because microfilm frame sizes vary, -occasionally some frames were missed, which without spending much time -and money could not be recaptured. - -OCR could not be performed from the scanned images of the frames. The -bleeding in the text simply output text, when OCR was run, that could not -even be edited. NATDP tested for negative versus positive images, -landscape versus portrait orientation, and single- versus dual-page -microfilm, none of which seemed to affect the quality of the image; but -also on none of them could OCR be performed. - -In selecting the microfilm they would use, therefore, NATDP had other -factors in mind. ZIDAR noted two factors that influenced the quality of -the images: 1) the inherent quality of the original and 2) the amount of -size reduction on the pages. - -The Carver papers were selected because they are informative and visually -interesting, treat a single subject, and are valuable in their own right. -The images were scanned and divided into logical records by SAIC, then -delivered, and loaded onto NATDP's system, where bibliographic -information taken directly from the images was added. Scanning was -completed in summer 1991 and by the end of summer 1992 the disk was -scheduled to be published. - -Problems encountered during processing included the following: Because -the microfilm scanning had to be done in a batch, adjustment for -individual page variations was not possible. The frame size varied on -account of the nature of the material, and therefore some of the frames -were missed while others were just partial frames. The only way to go -back and capture this material was to print out the page with the -microfilm reader from the missing frame and then scan it in from the -page, which was extremely time-consuming. The quality of the images -scanned from the printout of the microfilm compared unfavorably with that -of the original images captured directly from the microfilm. The -inability to perform OCR also was a major disappointment. At the time, -computer output microfilm was unavailable to test. - -The equipment used for a scanning system was the last topic addressed by -ZIDAR. The type of equipment that one would purchase for a scanning -system included: a microcomputer, at least a 386, but preferably a 486; -a large hard disk, 380 megabyte at minimum; a multi-tasking operating -system that allows one to run some things in batch in the background -while scanning or doing text editing, for example, Unix or OS/2 and, -theoretically, Windows; a high-speed scanner and scanning software that -allows one to make the various adjustments mentioned earlier; a -high-resolution monitor (150 dpi ); OCR software and hardware to perform -text recognition; an optical disk subsystem on which to archive all the -images as the processing is done; file management and tracking software. - -ZIDAR opined that the software one purchases was more important than the -hardware and might also cost more than the hardware, but it was likely to -prove critical to the success or failure of one's system. In addition to -a stand-alone scanning workstation for image capture, then, text capture -requires one or two editing stations networked to this scanning station -to perform editing. Editing the text takes two or three times as long as -capturing the images. - -Finally, ZIDAR stressed the importance of buying an open system that allows -for more than one vendor, complies with standards, and can be upgraded. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -WATERS *Yale University Library's master plan to convert microfilm to -digital imagery (POB) * The place of electronic tools in the library of -the future * The uses of images and an image library * Primary input from -preservation microfilm * Features distinguishing POB from CXP and key -hypotheses guiding POB * Use of vendor selection process to facilitate -organizational work * Criteria for selecting vendor * Finalists and -results of process for Yale * Key factor distinguishing vendors * -Components, design principles, and some estimated costs of POB * Role of -preservation materials in developing imaging market * Factors affecting -quality and cost * Factors affecting the usability of complex documents -in image form * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Donald WATERS, head of the Systems Office, Yale University Library, -reported on the progress of a master plan for a project at Yale to -convert microfilm to digital imagery, Project Open Book (POB). Stating -that POB was in an advanced stage of planning, WATERS detailed, in -particular, the process of selecting a vendor partner and several key -issues under discussion as Yale prepares to move into the project itself. -He commented first on the vision that serves as the context of POB and -then described its purpose and scope. - -WATERS sees the library of the future not necessarily as an electronic -library but as a place that generates, preserves, and improves for its -clients ready access to both intellectual and physical recorded -knowledge. Electronic tools must find a place in the library in the -context of this vision. Several roles for electronic tools include -serving as: indirect sources of electronic knowledge or as "finding" -aids (the on-line catalogues, the article-level indices, registers for -documents and archives); direct sources of recorded knowledge; full-text -images; and various kinds of compound sources of recorded knowledge (the -so-called compound documents of Hypertext, mixed text and image, -mixed-text image format, and multimedia). - -POB is looking particularly at images and an image library, the uses to -which images will be put (e.g., storage, printing, browsing, and then use -as input for other processes), OCR as a subsequent process to image -capture, or creating an image library, and also possibly generating -microfilm. - -While input will come from a variety of sources, POB is considering -especially input from preservation microfilm. A possible outcome is that -the film and paper which provide the input for the image library -eventually may go off into remote storage, and that the image library may -be the primary access tool. - -The purpose and scope of POB focus on imaging. Though related to CXP, -POB has two features which distinguish it: 1) scale--conversion of -10,000 volumes into digital image form; and 2) source--conversion from -microfilm. Given these features, several key working hypotheses guide -POB, including: 1) Since POB is using microfilm, it is not concerned with -the image library as a preservation medium. 2) Digital imagery can improve -access to recorded knowledge through printing and network distribution at -a modest incremental cost of microfilm. 3) Capturing and storing documents -in a digital image form is necessary to further improvements in access. -(POB distinguishes between the imaging, digitizing process and OCR, -which at this stage it does not plan to perform.) - -Currently in its first or organizational phase, POB found that it could -use a vendor selection process to facilitate a good deal of the -organizational work (e.g., creating a project team and advisory board, -confirming the validity of the plan, establishing the cost of the project -and a budget, selecting the materials to convert, and then raising the -necessary funds). - -POB developed numerous selection criteria, including: a firm committed -to image-document management, the ability to serve as systems integrator -in a large-scale project over several years, interest in developing the -requisite software as a standard rather than a custom product, and a -willingness to invest substantial resources in the project itself. - -Two vendors, DEC and Xerox, were selected as finalists in October 1991, -and with the support of the Commission on Preservation and Access, each -was commissioned to generate a detailed requirements analysis for the -project and then to submit a formal proposal for the completion of the -project, which included a budget and costs. The terms were that POB would -pay the loser. The results for Yale of involving a vendor included: -broad involvement of Yale staff across the board at a relatively low -cost, which may have long-term significance in carrying out the project -(twenty-five to thirty university people are engaged in POB); better -understanding of the factors that affect corporate response to markets -for imaging products; a competitive proposal; and a more sophisticated -view of the imaging markets. - -The most important factor that distinguished the vendors under -consideration was their identification with the customer. The size and -internal complexity of the company also was an important factor. POB was -looking at large companies that had substantial resources. In the end, -the process generated for Yale two competitive proposals, with Xerox's -the clear winner. WATERS then described the components of the proposal, -the design principles, and some of the costs estimated for the process. - -Components are essentially four: a conversion subsystem, a -network-accessible storage subsystem for 10,000 books (and POB expects -200 to 600 dpi storage), browsing stations distributed on the campus -network, and network access to the image printers. - -Among the design principles, POB wanted conversion at the highest -possible resolution. Assuming TIFF files, TIFF files with Group 4 -compression, TCP/IP, and ethernet network on campus, POB wanted a -client-server approach with image documents distributed to the -workstations and made accessible through native workstation interfaces -such as Windows. POB also insisted on a phased approach to -implementation: 1) a stand-alone, single-user, low-cost entry into the -business with a workstation focused on conversion and allowing POB to -explore user access; 2) movement into a higher-volume conversion with -network-accessible storage and multiple access stations; and 3) a -high-volume conversion, full-capacity storage, and multiple browsing -stations distributed throughout the campus. - -The costs proposed for start-up assumed the existence of the Yale network -and its two DocuTech image printers. Other start-up costs are estimated -at $1 million over the three phases. At the end of the project, the annual -operating costs estimated primarily for the software and hardware proposed -come to about $60,000, but these exclude costs for labor needed in the -conversion process, network and printer usage, and facilities management. - -Finally, the selection process produced for Yale a more sophisticated -view of the imaging markets: the management of complex documents in -image form is not a preservation problem, not a library problem, but a -general problem in a broad, general industry. Preservation materials are -useful for developing that market because of the qualities of the -material. For example, much of it is out of copyright. The resolution -of key issues such as the quality of scanning and image browsing also -will affect development of that market. - -The technology is readily available but changing rapidly. In this -context of rapid change, several factors affect quality and cost, to -which POB intends to pay particular attention, for example, the various -levels of resolution that can be achieved. POB believes it can bring -resolution up to 600 dpi, but an interpolation process from 400 to 600 is -more likely. The variation quality in microfilm will prove to be a -highly important factor. POB may reexamine the standards used to film in -the first place by looking at this process as a follow-on to microfilming. - -Other important factors include: the techniques available to the -operator for handling material, the ways of integrating quality control -into the digitizing work flow, and a work flow that includes indexing and -storage. POB's requirement was to be able to deal with quality control -at the point of scanning. Thus, thanks to Xerox, POB anticipates having -a mechanism which will allow it not only to scan in batch form, but to -review the material as it goes through the scanner and control quality -from the outset. - -The standards for measuring quality and costs depend greatly on the uses -of the material, including subsequent OCR, storage, printing, and -browsing. But especially at issue for POB is the facility for browsing. -This facility, WATERS said, is perhaps the weakest aspect of imaging -technology and the most in need of development. - -A variety of factors affect the usability of complex documents in image -form, among them: 1) the ability of the system to handle the full range -of document types, not just monographs but serials, multi-part -monographs, and manuscripts; 2) the location of the database of record -for bibliographic information about the image document, which POB wants -to enter once and in the most useful place, the on-line catalog; 3) a -document identifier for referencing the bibliographic information in one -place and the images in another; 4) the technique for making the basic -internal structure of the document accessible to the reader; and finally, -5) the physical presentation on the CRT of those documents. POB is ready -to complete this phase now. One last decision involves deciding which -material to scan. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * TIFF files constitute de facto standard * NARA's experience -with image conversion software and text conversion * RFC 1314 * -Considerable flux concerning available hardware and software solutions * -NAL through-put rate during scanning * Window management questions * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -In the question-and-answer period that followed WATERS's presentation, -the following points emerged: - - * ZIDAR's statement about using TIFF files as a standard meant de - facto standard. This is what most people use and typically exchange - with other groups, across platforms, or even occasionally across - display software. - - * HOLMES commented on the unsuccessful experience of NARA in - attempting to run image-conversion software or to exchange between - applications: What are supposedly TIFF files go into other software - that is supposed to be able to accept TIFF but cannot recognize the - format and cannot deal with it, and thus renders the exchange - useless. Re text conversion, he noted the different recognition - rates obtained by substituting the make and model of scanners in - NARA's recent test of an "intelligent" character-recognition product - for a new company. In the selection of hardware and software, - HOLMES argued, software no longer constitutes the overriding factor - it did until about a year ago; rather it is perhaps important to - look at both now. - - * Danny Cohen and Alan Katz of the University of Southern California - Information Sciences Institute began circulating as an Internet RFC - (RFC 1314) about a month ago a standard for a TIFF interchange - format for Internet distribution of monochrome bit-mapped images, - which LYNCH said he believed would be used as a de facto standard. - - * FLEISCHHAUER's impression from hearing these reports and thinking - about AM's experience was that there is considerable flux concerning - available hardware and software solutions. HOOTON agreed and - commented at the same time on ZIDAR's statement that the equipment - employed affects the results produced. One cannot draw a complete - conclusion by saying it is difficult or impossible to perform OCR - from scanning microfilm, for example, with that device, that set of - parameters, and system requirements, because numerous other people - are accomplishing just that, using other components, perhaps. - HOOTON opined that both the hardware and the software were highly - important. Most of the problems discussed today have been solved in - numerous different ways by other people. Though it is good to be - cognizant of various experiences, this is not to say that it will - always be thus. - - * At NAL, the through-put rate of the scanning process for paper, - page by page, performing OCR, ranges from 300 to 600 pages per day; - not performing OCR is considerably faster, although how much faster - is not known. This is for scanning from bound books, which is much - slower. - - * WATERS commented on window management questions: DEC proposed an - X-Windows solution which was problematical for two reasons. One was - POB's requirement to be able to manipulate images on the workstation - and bring them down to the workstation itself and the other was - network usage. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -THOMA * Illustration of deficiencies in scanning and storage process * -Image quality in this process * Different costs entailed by better image -quality * Techniques for overcoming various de-ficiencies: fixed -thresholding, dynamic thresholding, dithering, image merge * Page edge -effects * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -George THOMA, chief, Communications Engineering Branch, National Library -of Medicine (NLM), illustrated several of the deficiencies discussed by -the previous speakers. He introduced the topic of special problems by -noting the advantages of electronic imaging. For example, it is regenerable -because it is a coded file, and real-time quality control is possible with -electronic capture, whereas in photographic capture it is not. - -One of the difficulties discussed in the scanning and storage process was -image quality which, without belaboring the obvious, means different -things for maps, medical X-rays, or broadcast television. In the case of -documents, THOMA said, image quality boils down to legibility of the -textual parts, and fidelity in the case of gray or color photo print-type -material. Legibility boils down to scan density, the standard in most -cases being 300 dpi. Increasing the resolution with scanners that -perform 600 or 1200 dpi, however, comes at a cost. - -Better image quality entails at least four different kinds of costs: 1) -equipment costs, because the CCD (i.e., charge-couple device) with -greater number of elements costs more; 2) time costs that translate to -the actual capture costs, because manual labor is involved (the time is -also dependent on the fact that more data has to be moved around in the -machine in the scanning or network devices that perform the scanning as -well as the storage); 3) media costs, because at high resolutions larger -files have to be stored; and 4) transmission costs, because there is just -more data to be transmitted. - -But while resolution takes care of the issue of legibility in image -quality, other deficiencies have to do with contrast and elements on the -page scanned or the image that needed to be removed or clarified. Thus, -THOMA proceeded to illustrate various deficiencies, how they are -manifested, and several techniques to overcome them. - -Fixed thresholding was the first technique described, suitable for -black-and-white text, when the contrast does not vary over the page. One -can have many different threshold levels in scanning devices. Thus, -THOMA offered an example of extremely poor contrast, which resulted from -the fact that the stock was a heavy red. This is the sort of image that -when microfilmed fails to provide any legibility whatsoever. Fixed -thresholding is the way to change the black-to-red contrast to the -desired black-to-white contrast. - -Other examples included material that had been browned or yellowed by -age. This was also a case of contrast deficiency, and correction was -done by fixed thresholding. A final example boils down to the same -thing, slight variability, but it is not significant. Fixed thresholding -solves this problem as well. The microfilm equivalent is certainly legible, -but it comes with dark areas. Though THOMA did not have a slide of the -microfilm in this case, he did show the reproduced electronic image. - -When one has variable contrast over a page or the lighting over the page -area varies, especially in the case where a bound volume has light -shining on it, the image must be processed by a dynamic thresholding -scheme. One scheme, dynamic averaging, allows the threshold level not to -be fixed but to be recomputed for every pixel from the neighboring -characteristics. The neighbors of a pixel determine where the threshold -should be set for that pixel. - -THOMA showed an example of a page that had been made deficient by a -variety of techniques, including a burn mark, coffee stains, and a yellow -marker. Application of a fixed-thresholding scheme, THOMA argued, might -take care of several deficiencies on the page but not all of them. -Performing the calculation for a dynamic threshold setting, however, -removes most of the deficiencies so that at least the text is legible. - -Another problem is representing a gray level with black-and-white pixels -by a process known as dithering or electronic screening. But dithering -does not provide good image quality for pure black-and-white textual -material. THOMA illustrated this point with examples. Although its -suitability for photoprint is the reason for electronic screening or -dithering, it cannot be used for every compound image. In the document -that was distributed by CXP, THOMA noticed that the dithered image of the -IEEE test chart evinced some deterioration in the text. He presented an -extreme example of deterioration in the text in which compounded -documents had to be set right by other techniques. The technique -illustrated by the present example was an image merge in which the page -is scanned twice and the settings go from fixed threshold to the -dithering matrix; the resulting images are merged to give the best -results with each technique. - -THOMA illustrated how dithering is also used in nonphotographic or -nonprint materials with an example of a grayish page from a medical text, -which was reproduced to show all of the gray that appeared in the -original. Dithering provided a reproduction of all the gray in the -original of another example from the same text. - -THOMA finally illustrated the problem of bordering, or page-edge, -effects. Books and bound volumes that are placed on a photocopy machine -or a scanner produce page-edge effects that are undesirable for two -reasons: 1) the aesthetics of the image; after all, if the image is to -be preserved, one does not necessarily want to keep all of its -deficiencies; 2) compression (with the bordering problem THOMA -illustrated, the compression ratio deteriorated tremendously). One way -to eliminate this more serious problem is to have the operator at the -point of scanning window the part of the image that is desirable and -automatically turn all of the pixels out of that picture to white. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -FLEISCHHAUER * AM's experience with scanning bound materials * Dithering -* -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Carl FLEISCHHAUER, coordinator, American Memory, Library of Congress, -reported AM's experience with scanning bound materials, which he likened -to the problems involved in using photocopying machines. Very few -devices in the industry offer book-edge scanning, let alone book cradles. -The problem may be unsolvable, FLEISCHHAUER said, because a large enough -market does not exist for a preservation-quality scanner. AM is using a -Kurzweil scanner, which is a book-edge scanner now sold by Xerox. - -Devoting the remainder of his brief presentation to dithering, -FLEISCHHAUER related AM's experience with a contractor who was using -unsophisticated equipment and software to reduce moire patterns from -printed halftones. AM took the same image and used the dithering -algorithm that forms part of the same Kurzweil Xerox scanner; it -disguised moire patterns much more effectively. - -FLEISCHHAUER also observed that dithering produces a binary file which is -useful for numerous purposes, for example, printing it on a laser printer -without having to "re-halftone" it. But it tends to defeat efficient -compression, because the very thing that dithers to reduce moire patterns -also tends to work against compression schemes. AM thought the -difference in image quality was worth it. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * Relative use as a criterion for POB's selection of books to -be converted into digital form * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -During the discussion period, WATERS noted that one of the criteria for -selecting books among the 10,000 to be converted into digital image form -would be how much relative use they would receive--a subject still -requiring evaluation. The challenge will be to understand whether -coherent bodies of material will increase usage or whether POB should -seek material that is being used, scan that, and make it more accessible. -POB might decide to digitize materials that are already heavily used, in -order to make them more accessible and decrease wear on them. Another -approach would be to provide a large body of intellectually coherent -material that may be used more in digital form than it is currently used -in microfilm. POB would seek material that was out of copyright. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -BARONAS * Origin and scope of AIIM * Types of documents produced in -AIIM's standards program * Domain of AIIM's standardization work * AIIM's -structure * TC 171 and MS23 * Electronic image management standards * -Categories of EIM standardization where AIIM standards are being -developed * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Jean BARONAS, senior manager, Department of Standards and Technology, -Association for Information and Image Management (AIIM), described the -not-for-profit association and the national and international programs -for standardization in which AIIM is active. - -Accredited for twenty-five years as the nation's standards development -organization for document image management, AIIM began life in a library -community developing microfilm standards. Today the association -maintains both its library and business-image management standardization -activities--and has moved into electronic image-management -standardization (EIM). - -BARONAS defined the program's scope. AIIM deals with: 1) the -terminology of standards and of the technology it uses; 2) methods of -measurement for the systems, as well as quality; 3) methodologies for -users to evaluate and measure quality; 4) the features of apparatus used -to manage and edit images; and 5) the procedures used to manage images. - -BARONAS noted that three types of documents are produced in the AIIM -standards program: the first two, accredited by the American National -Standards Institute (ANSI), are standards and standard recommended -practices. Recommended practices differ from standards in that they -contain more tutorial information. A technical report is not an ANSI -standard. Because AIIM's policies and procedures for developing -standards are approved by ANSI, its standards are labeled ANSI/AIIM, -followed by the number and title of the standard. - -BARONAS then illustrated the domain of AIIM's standardization work. For -example, AIIM is the administrator of the U.S. Technical Advisory Group -(TAG) to the International Standards Organization's (ISO) technical -committee, TC l7l Micrographics and Optical Memories for Document and -Image Recording, Storage, and Use. AIIM officially works through ANSI in -the international standardization process. - -BARONAS described AIIM's structure, including its board of directors, its -standards board of twelve individuals active in the image-management -industry, its strategic planning and legal admissibility task forces, and -its National Standards Council, which is comprised of the members of a -number of organizations who vote on every AIIM standard before it is -published. BARONAS pointed out that AIIM's liaisons deal with numerous -other standards developers, including the optical disk community, office -and publishing systems, image-codes-and-character set committees, and the -National Information Standards Organization (NISO). - -BARONAS illustrated the procedures of TC l7l, which covers all aspects of -image management. When AIIM's national program has conceptualized a new -project, it is usually submitted to the international level, so that the -member countries of TC l7l can simultaneously work on the development of -the standard or the technical report. BARONAS also illustrated a classic -microfilm standard, MS23, which deals with numerous imaging concepts that -apply to electronic imaging. Originally developed in the l970s, revised -in the l980s, and revised again in l991, this standard is scheduled for -another revision. MS23 is an active standard whereby users may propose -new density ranges and new methods of evaluating film images in the -standard's revision. - -BARONAS detailed several electronic image-management standards, for -instance, ANSI/AIIM MS44, a quality-control guideline for scanning 8.5" -by 11" black-and-white office documents. This standard is used with the -IEEE fax image--a continuous tone photographic image with gray scales, -text, and several continuous tone pictures--and AIIM test target number -2, a representative document used in office document management. - -BARONAS next outlined the four categories of EIM standardization in which -AIIM standards are being developed: transfer and retrieval, evaluation, -optical disc and document scanning applications, and design and -conversion of documents. She detailed several of the main projects of -each: 1) in the category of image transfer and retrieval, a bi-level -image transfer format, ANSI/AIIM MS53, which is a proposed standard that -describes a file header for image transfer between unlike systems when -the images are compressed using G3 and G4 compression; 2) the category of -image evaluation, which includes the AIIM-proposed TR26 tutorial on image -resolution (this technical report will treat the differences and -similarities between classical or photographic and electronic imaging); -3) design and conversion, which includes a proposed technical report -called "Forms Design Optimization for EIM" (this report considers how -general-purpose business forms can be best designed so that scanning is -optimized; reprographic characteristics such as type, rules, background, -tint, and color will likewise be treated in the technical report); 4) -disk and document scanning applications includes a project a) on planning -platters and disk management, b) on generating an application profile for -EIM when images are stored and distributed on CD-ROM, and c) on -evaluating SCSI2, and how a common command set can be generated for SCSI2 -so that document scanners are more easily integrated. (ANSI/AIIM MS53 -will also apply to compressed images.) - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -BATTIN * The implications of standards for preservation * A major -obstacle to successful cooperation * A hindrance to access in the digital -environment * Standards a double-edged sword for those concerned with the -preservation of the human record * Near-term prognosis for reliable -archival standards * Preservation concerns for electronic media * Need -for reconceptualizing our preservation principles * Standards in the real -world and the politics of reproduction * Need to redefine the concept of -archival and to begin to think in terms of life cycles * Cooperation and -the La Guardia Eight * Concerns generated by discussions on the problems -of preserving text and image * General principles to be adopted in a -world without standards * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Patricia BATTIN, president, the Commission on Preservation and Access -(CPA), addressed the implications of standards for preservation. She -listed several areas where the library profession and the analog world of -the printed book had made enormous contributions over the past hundred -years--for example, in bibliographic formats, binding standards, and, most -important, in determining what constitutes longevity or archival quality. - -Although standards have lightened the preservation burden through the -development of national and international collaborative programs, -nevertheless, a pervasive mistrust of other people's standards remains a -major obstacle to successful cooperation, BATTIN said. - -The zeal to achieve perfection, regardless of the cost, has hindered -rather than facilitated access in some instances, and in the digital -environment, where no real standards exist, has brought an ironically -just reward. - -BATTIN argued that standards are a double-edged sword for those concerned -with the preservation of the human record, that is, the provision of -access to recorded knowledge in a multitude of media as far into the -future as possible. Standards are essential to facilitate -interconnectivity and access, but, BATTIN said, as LYNCH pointed out -yesterday, if set too soon they can hinder creativity, expansion of -capability, and the broadening of access. The characteristics of -standards for digital imagery differ radically from those for analog -imagery. And the nature of digital technology implies continuing -volatility and change. To reiterate, precipitous standard-setting can -inhibit creativity, but delayed standard-setting results in chaos. - -Since in BATTIN'S opinion the near-term prognosis for reliable archival -standards, as defined by librarians in the analog world, is poor, two -alternatives remain: standing pat with the old technology, or -reconceptualizing. - -Preservation concerns for electronic media fall into two general domains. -One is the continuing assurance of access to knowledge originally -generated, stored, disseminated, and used in electronic form. This -domain contains several subdivisions, including 1) the closed, -proprietary systems discussed the previous day, bundled information such -as electronic journals and government agency records, and electronically -produced or captured raw data; and 2) the application of digital -technologies to the reformatting of materials originally published on a -deteriorating analog medium such as acid paper or videotape. - -The preservation of electronic media requires a reconceptualizing of our -preservation principles during a volatile, standardless transition which -may last far longer than any of us envision today. BATTIN urged the -necessity of shifting focus from assessing, measuring, and setting -standards for the permanence of the medium to the concept of managing -continuing access to information stored on a variety of media and -requiring a variety of ever-changing hardware and software for access--a -fundamental shift for the library profession. - -BATTIN offered a primer on how to move forward with reasonable confidence -in a world without standards. Her comments fell roughly into two sections: -1) standards in the real world and 2) the politics of reproduction. - -In regard to real-world standards, BATTIN argued the need to redefine the -concept of archive and to begin to think in terms of life cycles. In -the past, the naive assumption that paper would last forever produced a -cavalier attitude toward life cycles. The transient nature of the -electronic media has compelled people to recognize and accept upfront the -concept of life cycles in place of permanency. - -Digital standards have to be developed and set in a cooperative context -to ensure efficient exchange of information. Moreover, during this -transition period, greater flexibility concerning how concepts such as -backup copies and archival copies in the CXP are defined is necessary, -or the opportunity to move forward will be lost. - -In terms of cooperation, particularly in the university setting, BATTIN -also argued the need to avoid going off in a hundred different -directions. The CPA has catalyzed a small group of universities called -the La Guardia Eight--because La Guardia Airport is where meetings take -place--Harvard, Yale, Cornell, Princeton, Penn State, Tennessee, -Stanford, and USC, to develop a digital preservation consortium to look -at all these issues and develop de facto standards as we move along, -instead of waiting for something that is officially blessed. Continuing -to apply analog values and definitions of standards to the digital -environment, BATTIN said, will effectively lead to forfeiture of the -benefits of digital technology to research and scholarship. - -Under the second rubric, the politics of reproduction, BATTIN reiterated -an oft-made argument concerning the electronic library, namely, that it -is more difficult to transform than to create, and nowhere is that belief -expressed more dramatically than in the conversion of brittle books to -new media. Preserving information published in electronic media involves -making sure the information remains accessible and that digital -information is not lost through reproduction. In the analog world of -photocopies and microfilm, the issue of fidelity to the original becomes -paramount, as do issues of "Whose fidelity?" and "Whose original?" - -BATTIN elaborated these arguments with a few examples from a recent study -conducted by the CPA on the problems of preserving text and image. -Discussions with scholars, librarians, and curators in a variety of -disciplines dependent on text and image generated a variety of concerns, -for example: 1) Copy what is, not what the technology is capable of. -This is very important for the history of ideas. Scholars wish to know -what the author saw and worked from. And make available at the -workstation the opportunity to erase all the defects and enhance the -presentation. 2) The fidelity of reproduction--what is good enough, what -can we afford, and the difference it makes--issues of subjective versus -objective resolution. 3) The differences between primary and secondary -users. Restricting the definition of primary user to the one in whose -discipline the material has been published runs one headlong into the -reality that these printed books have had a host of other users from a -host of other disciplines, who not only were looking for very different -things, but who also shared values very different from those of the -primary user. 4) The relationship of the standard of reproduction to new -capabilities of scholarship--the browsing standard versus an archival -standard. How good must the archival standard be? Can a distinction be -drawn between potential users in setting standards for reproduction? -Archival storage, use copies, browsing copies--ought an attempt to set -standards even be made? 5) Finally, costs. How much are we prepared to -pay to capture absolute fidelity? What are the trade-offs between vastly -enhanced access, degrees of fidelity, and costs? - -These standards, BATTIN concluded, serve to complicate further the -reproduction process, and add to the long list of technical standards -that are necessary to ensure widespread access. Ways to articulate and -analyze the costs that are attached to the different levels of standards -must be found. - -Given the chaos concerning standards, which promises to linger for the -foreseeable future, BATTIN urged adoption of the following general -principles: - - * Strive to understand the changing information requirements of - scholarly disciplines as more and more technology is integrated into - the process of research and scholarly communication in order to meet - future scholarly needs, not to build for the past. Capture - deteriorating information at the highest affordable resolution, even - though the dissemination and display technologies will lag. - - * Develop cooperative mechanisms to foster agreement on protocols - for document structure and other interchange mechanisms necessary - for widespread dissemination and use before official standards are - set. - - * Accept that, in a transition period, de facto standards will have - to be developed. - - * Capture information in a way that keeps all options open and - provides for total convertibility: OCR, scanning of microfilm, - producing microfilm from scanned documents, etc. - - * Work closely with the generators of information and the builders - of networks and databases to ensure that continuing accessibility is - a primary concern from the beginning. - - * Piggyback on standards under development for the broad market, and - avoid library-specific standards; work with the vendors, in order to - take advantage of that which is being standardized for the rest of - the world. - - * Concentrate efforts on managing permanence in the digital world, - rather than perfecting the longevity of a particular medium. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * Additional comments on TIFF * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -During the brief discussion period that followed BATTIN's presentation, -BARONAS explained that TIFF was not developed in collaboration with or -under the auspices of AIIM. TIFF is a company product, not a standard, -is owned by two corporations, and is always changing. BARONAS also -observed that ANSI/AIIM MS53, a bi-level image file transfer format that -allows unlike systems to exchange images, is compatible with TIFF as well -as with DEC's architecture and IBM's MODCA/IOCA. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -HOOTON * Several questions to be considered in discussing text conversion -* -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -HOOTON introduced the final topic, text conversion, by noting that it is -becoming an increasingly important part of the imaging business. Many -people now realize that it enhances their system to be able to have more -and more character data as part of their imaging system. Re the issue of -OCR versus rekeying, HOOTON posed several questions: How does one get -text into computer-readable form? Does one use automated processes? -Does one attempt to eliminate the use of operators where possible? -Standards for accuracy, he said, are extremely important: it makes a -major difference in cost and time whether one sets as a standard 98.5 -percent acceptance or 99.5 percent. He mentioned outsourcing as a -possibility for converting text. Finally, what one does with the image -to prepare it for the recognition process is also important, he said, -because such preparation changes how recognition is viewed, as well as -facilitates recognition itself. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -LESK * Roles of participants in CORE * Data flow * The scanning process * -The image interface * Results of experiments involving the use of -electronic resources and traditional paper copies * Testing the issue of -serendipity * Conclusions * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Michael LESK, executive director, Computer Science Research, Bell -Communications Research, Inc. (Bellcore), discussed the Chemical Online -Retrieval Experiment (CORE), a cooperative project involving Cornell -University, OCLC, Bellcore, and the American Chemical Society (ACS). - -LESK spoke on 1) how the scanning was performed, including the unusual -feature of page segmentation, and 2) the use made of the text and the -image in experiments. - -Working with the chemistry journals (because ACS has been saving its -typesetting tapes since the mid-1970s and thus has a significant back-run -of the most important chemistry journals in the United States), CORE is -attempting to create an automated chemical library. Approximately a -quarter of the pages by square inch are made up of images of -quasi-pictorial material; dealing with the graphic components of the -pages is extremely important. LESK described the roles of participants -in CORE: 1) ACS provides copyright permission, journals on paper, -journals on microfilm, and some of the definitions of the files; 2) at -Bellcore, LESK chiefly performs the data preparation, while Dennis Egan -performs experiments on the users of chemical abstracts, and supplies the -indexing and numerous magnetic tapes; 3) Cornell provides the site of the -experiment; 4) OCLC develops retrieval software and other user interfaces. -Various manufacturers and publishers have furnished other help. - -Concerning data flow, Bellcore receives microfilm and paper from ACS; the -microfilm is scanned by outside vendors, while the paper is scanned -inhouse on an Improvision scanner, twenty pages per minute at 300 dpi, -which provides sufficient quality for all practical uses. LESK would -prefer to have more gray level, because one of the ACS journals prints on -some colored pages, which creates a problem. - -Bellcore performs all this scanning, creates a page-image file, and also -selects from the pages the graphics, to mix with the text file (which is -discussed later in the Workshop). The user is always searching the ASCII -file, but she or he may see a display based on the ASCII or a display -based on the images. - -LESK illustrated how the program performs page analysis, and the image -interface. (The user types several words, is presented with a list-- -usually of the titles of articles contained in an issue--that derives -from the ASCII, clicks on an icon and receives an image that mirrors an -ACS page.) LESK also illustrated an alternative interface, based on text -on the ASCII, the so-called SuperBook interface from Bellcore. - -LESK next presented the results of an experiment conducted by Dennis Egan -and involving thirty-six students at Cornell, one third of them -undergraduate chemistry majors, one third senior undergraduate chemistry -majors, and one third graduate chemistry students. A third of them -received the paper journals, the traditional paper copies and chemical -abstracts on paper. A third received image displays of the pictures of -the pages, and a third received the text display with pop-up graphics. - -The students were given several questions made up by some chemistry -professors. The questions fell into five classes, ranging from very easy -to very difficult, and included questions designed to simulate browsing -as well as a traditional information retrieval-type task. - -LESK furnished the following results. In the straightforward question -search--the question being, what is the phosphorus oxygen bond distance -and hydroxy phosphate?--the students were told that they could take -fifteen minutes and, then, if they wished, give up. The students with -paper took more than fifteen minutes on average, and yet most of them -gave up. The students with either electronic format, text or image, -received good scores in reasonable time, hardly ever had to give up, and -usually found the right answer. - -In the browsing study, the students were given a list of eight topics, -told to imagine that an issue of the Journal of the American Chemical -Society had just appeared on their desks, and were also told to flip -through it and to find topics mentioned in the issue. The average scores -were about the same. (The students were told to answer yes or no about -whether or not particular topics appeared.) The errors, however, were -quite different. The students with paper rarely said that something -appeared when it had not. But they often failed to find something -actually mentioned in the issue. The computer people found numerous -things, but they also frequently said that a topic was mentioned when it -was not. (The reason, of course, was that they were performing word -searches. They were finding that words were mentioned and they were -concluding that they had accomplished their task.) - -This question also contained a trick to test the issue of serendipity. -The students were given another list of eight topics and instructed, -without taking a second look at the journal, to recall how many of this -new list of eight topics were in this particular issue. This was an -attempt to see if they performed better at remembering what they were not -looking for. They all performed about the same, paper or electronics, -about 62 percent accurate. In short, LESK said, people were not very -good when it came to serendipity, but they were no worse at it with -computers than they were with paper. - -(LESK gave a parenthetical illustration of the learning curve of students -who used SuperBook.) - -The students using the electronic systems started off worse than the ones -using print, but by the third of the three sessions in the series had -caught up to print. As one might expect, electronics provide a much -better means of finding what one wants to read; reading speeds, once the -object of the search has been found, are about the same. - -Almost none of the students could perform the hard task--the analogous -transformation. (It would require the expertise of organic chemists to -complete.) But an interesting result was that the students using the text -search performed terribly, while those using the image system did best. -That the text search system is driven by text offers the explanation. -Everything is focused on the text; to see the pictures, one must press -on an icon. Many students found the right article containing the answer -to the question, but they did not click on the icon to bring up the right -figure and see it. They did not know that they had found the right place, -and thus got it wrong. - -The short answer demonstrated by this experiment was that in the event -one does not know what to read, one needs the electronic systems; the -electronic systems hold no advantage at the moment if one knows what to -read, but neither do they impose a penalty. - -LESK concluded by commenting that, on one hand, the image system was easy -to use. On the other hand, the text display system, which represented -twenty man-years of work in programming and polishing, was not winning, -because the text was not being read, just searched. The much easier -system is highly competitive as well as remarkably effective for the -actual chemists. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -ERWAY * Most challenging aspect of working on AM * Assumptions guiding -AM's approach * Testing different types of service bureaus * AM's -requirement for 99.95 percent accuracy * Requirements for text-coding * -Additional factors influencing AM's approach to coding * Results of AM's -experience with rekeying * Other problems in dealing with service bureaus -* Quality control the most time-consuming aspect of contracting out -conversion * Long-term outlook uncertain * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -To Ricky ERWAY, associate coordinator, American Memory, Library of -Congress, the constant variety of conversion projects taking place -simultaneously represented perhaps the most challenging aspect of working -on AM. Thus, the challenge was not to find a solution for text -conversion but a tool kit of solutions to apply to LC's varied -collections that need to be converted. ERWAY limited her remarks to the -process of converting text to machine-readable form, and the variety of -LC's text collections, for example, bound volumes, microfilm, and -handwritten manuscripts. - -Two assumptions have guided AM's approach, ERWAY said: 1) A desire not -to perform the conversion inhouse. Because of the variety of formats and -types of texts, to capitalize the equipment and have the talents and -skills to operate them at LC would be extremely expensive. Further, the -natural inclination to upgrade to newer and better equipment each year -made it reasonable for AM to focus on what it did best and seek external -conversion services. Using service bureaus also allowed AM to have -several types of operations take place at the same time. 2) AM was not a -technology project, but an effort to improve access to library -collections. Hence, whether text was converted using OCR or rekeying -mattered little to AM. What mattered were cost and accuracy of results. - -AM considered different types of service bureaus and selected three to -perform several small tests in order to acquire a sense of the field. -The sample collections with which they worked included handwritten -correspondence, typewritten manuscripts from the 1940s, and -eighteenth-century printed broadsides on microfilm. On none of these -samples was OCR performed; they were all rekeyed. AM had several special -requirements for the three service bureaus it had engaged. For instance, -any errors in the original text were to be retained. Working from bound -volumes or anything that could not be sheet-fed also constituted a factor -eliminating companies that would have performed OCR. - -AM requires 99.95 percent accuracy, which, though it sounds high, often -means one or two errors per page. The initial batch of test samples -contained several handwritten materials for which AM did not require -text-coding. The results, ERWAY reported, were in all cases fairly -comparable: for the most part, all three service bureaus achieved 99.95 -percent accuracy. AM was satisfied with the work but surprised at the cost. - -As AM began converting whole collections, it retained the requirement for -99.95 percent accuracy and added requirements for text-coding. AM needed -to begin performing work more than three years ago before LC requirements -for SGML applications had been established. Since AM's goal was simply -to retain any of the intellectual content represented by the formatting -of the document (which would be lost if one performed a straight ASCII -conversion), AM used "SGML-like" codes. These codes resembled SGML tags -but were used without the benefit of document-type definitions. AM found -that many service bureaus were not yet SGML-proficient. - -Additional factors influencing the approach AM took with respect to -coding included: 1) the inability of any known microcomputer-based -user-retrieval software to take advantage of SGML coding; and 2) the -multiple inconsistencies in format of the older documents, which -confirmed AM in its desire not to attempt to force the different formats -to conform to a single document-type definition (DTD) and thus create the -need for a separate DTD for each document. - -The five text collections that AM has converted or is in the process of -converting include a collection of eighteenth-century broadsides, a -collection of pamphlets, two typescript document collections, and a -collection of 150 books. - -ERWAY next reviewed the results of AM's experience with rekeying, noting -again that because the bulk of AM's materials are historical, the quality -of the text often does not lend itself to OCR. While non-English -speakers are less likely to guess or elaborate or correct typos in the -original text, they are also less able to infer what we would; they also -are nearly incapable of converting handwritten text. Another -disadvantage of working with overseas keyers is that they are much less -likely to telephone with questions, especially on the coding, with the -result that they develop their own rules as they encounter new -situations. - -Government contracting procedures and time frames posed a major challenge -to performing the conversion. Many service bureaus are not accustomed to -retaining the image, even if they perform OCR. Thus, questions of image -format and storage media were somewhat novel to many of them. ERWAY also -remarked other problems in dealing with service bureaus, for example, -their inability to perform text conversion from the kind of microfilm -that LC uses for preservation purposes. - -But quality control, in ERWAY's experience, was the most time-consuming -aspect of contracting out conversion. AM has been attempting to perform -a 10-percent quality review, looking at either every tenth document or -every tenth page to make certain that the service bureaus are maintaining -99.95 percent accuracy. But even if they are complying with the -requirement for accuracy, finding errors produces a desire to correct -them and, in turn, to clean up the whole collection, which defeats the -purpose to some extent. Even a double entry requires a -character-by-character comparison to the original to meet the accuracy -requirement. LC is not accustomed to publish imperfect texts, which -makes attempting to deal with the industry standard an emotionally -fraught issue for AM. As was mentioned in the previous day's discussion, -going from 99.95 to 99.99 percent accuracy usually doubles costs and -means a third keying or another complete run-through of the text. - -Although AM has learned much from its experiences with various collections -and various service bureaus, ERWAY concluded pessimistically that no -breakthrough has been achieved. Incremental improvements have occurred -in some of the OCR technology, some of the processes, and some of the -standards acceptances, which, though they may lead to somewhat lower costs, -do not offer much encouragement to many people who are anxiously awaiting -the day that the entire contents of LC are available on-line. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -ZIDAR * Several answers to why one attempts to perform full-text -conversion * Per page cost of performing OCR * Typical problems -encountered during editing * Editing poor copy OCR vs. rekeying * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Judith ZIDAR, coordinator, National Agricultural Text Digitizing Program -(NATDP), National Agricultural Library (NAL), offered several answers to -the question of why one attempts to perform full-text conversion: 1) -Text in an image can be read by a human but not by a computer, so of -course it is not searchable and there is not much one can do with it. 2) -Some material simply requires word-level access. For instance, the legal -profession insists on full-text access to its material; with taxonomic or -geographic material, which entails numerous names, one virtually requires -word-level access. 3) Full text permits rapid browsing and searching, -something that cannot be achieved in an image with today's technology. -4) Text stored as ASCII and delivered in ASCII is standardized and highly -portable. 5) People just want full-text searching, even those who do not -know how to do it. NAL, for the most part, is performing OCR at an -actual cost per average-size page of approximately $7. NAL scans the -page to create the electronic image and passes it through the OCR device. - -ZIDAR next rehearsed several typical problems encountered during editing. -Praising the celerity of her student workers, ZIDAR observed that editing -requires approximately five to ten minutes per page, assuming that there -are no large tables to audit. Confusion among the three characters I, 1, -and l, constitutes perhaps the most common problem encountered. Zeroes -and O's also are frequently confused. Double M's create a particular -problem, even on clean pages. They are so wide in most fonts that they -touch, and the system simply cannot tell where one letter ends and the -other begins. Complex page formats occasionally fail to columnate -properly, which entails rescanning as though one were working with a -single column, entering the ASCII, and decolumnating for better -searching. With proportionally spaced text, OCR can have difficulty -discerning what is a space and what are merely spaces between letters, as -opposed to spaces between words, and therefore will merge text or break -up words where it should not. - -ZIDAR said that it can often take longer to edit a poor-copy OCR than to -key it from scratch. NAL has also experimented with partial editing of -text, whereby project workers go into and clean up the format, removing -stray characters but not running a spell-check. NAL corrects typos in -the title and authors' names, which provides a foothold for searching and -browsing. Even extremely poor-quality OCR (e.g., 60-percent accuracy) -can still be searched, because numerous words are correct, while the -important words are probably repeated often enough that they are likely -to be found correct somewhere. Librarians, however, cannot tolerate this -situation, though end users seem more willing to use this text for -searching, provided that NAL indicates that it is unedited. ZIDAR -concluded that rekeying of text may be the best route to take, in spite -of numerous problems with quality control and cost. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * Modifying an image before performing OCR * NAL's costs per -page *AM's costs per page and experience with Federal Prison Industries * -Elements comprising NATDP's costs per page * OCR and structured markup * -Distinction between the structure of a document and its representation -when put on the screen or printed * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -HOOTON prefaced the lengthy discussion that followed with several -comments about modifying an image before one reaches the point of -performing OCR. For example, in regard to an application containing a -significant amount of redundant data, such as form-type data, numerous -companies today are working on various kinds of form renewal, prior to -going through a recognition process, by using dropout colors. Thus, -acquiring access to form design or using electronic means are worth -considering. HOOTON also noted that conversion usually makes or breaks -one's imaging system. It is extremely important, extremely costly in -terms of either capital investment or service, and determines the quality -of the remainder of one's system, because it determines the character of -the raw material used by the system. - -Concerning the four projects undertaken by NAL, two inside and two -performed by outside contractors, ZIDAR revealed that an in-house service -bureau executed the first at a cost between $8 and $10 per page for -everything, including building of the database. The project undertaken -by the Consultative Group on International Agricultural Research (CGIAR) -cost approximately $10 per page for the conversion, plus some expenses -for the software and building of the database. The Acid Rain Project--a -two-disk set produced by the University of Vermont, consisting of -Canadian publications on acid rain--cost $6.70 per page for everything, -including keying of the text, which was double keyed, scanning of the -images, and building of the database. The in-house project offered -considerable ease of convenience and greater control of the process. On -the other hand, the service bureaus know their job and perform it -expeditiously, because they have more people. - -As a useful comparison, ERWAY revealed AM's costs as follows: $0.75 -cents to $0.85 cents per thousand characters, with an average page -containing 2,700 characters. Requirements for coding and imaging -increase the costs. Thus, conversion of the text, including the coding, -costs approximately $3 per page. (This figure does not include the -imaging and database-building included in the NAL costs.) AM also -enjoyed a happy experience with Federal Prison Industries, which -precluded the necessity of going through the request-for-proposal process -to award a contract, because it is another government agency. The -prisoners performed AM's rekeying just as well as other service bureaus -and proved handy as well. AM shipped them the books, which they would -photocopy on a book-edge scanner. They would perform the markup on -photocopies, return the books as soon as they were done with them, -perform the keying, and return the material to AM on WORM disks. - -ZIDAR detailed the elements that constitute the previously noted cost of -approximately $7 per page. Most significant is the editing, correction -of errors, and spell-checkings, which though they may sound easy to -perform require, in fact, a great deal of time. Reformatting text also -takes a while, but a significant amount of NAL's expenses are for equipment, -which was extremely expensive when purchased because it was one of the few -systems on the market. The costs of equipment are being amortized over -five years but are still quite high, nearly $2,000 per month. - -HOCKEY raised a general question concerning OCR and the amount of editing -required (substantial in her experience) to generate the kind of -structured markup necessary for manipulating the text on the computer or -loading it into any retrieval system. She wondered if the speakers could -extend the previous question about the cost-benefit of adding or exerting -structured markup. ERWAY noted that several OCR systems retain italics, -bolding, and other spatial formatting. While the material may not be in -the format desired, these systems possess the ability to remove the -original materials quickly from the hands of the people performing the -conversion, as well as to retain that information so that users can work -with it. HOCKEY rejoined that the current thinking on markup is that one -should not say that something is italic or bold so much as why it is that -way. To be sure, one needs to know that something was italicized, but -how can one get from one to the other? One can map from the structure to -the typographic representation. - -FLEISCHHAUER suggested that, given the 100 million items the Library -holds, it may not be possible for LC to do more than report that a thing -was in italics as opposed to why it was italics, although that may be -desirable in some contexts. Promising to talk a bit during the afternoon -session about several experiments OCLC performed on automatic recognition -of document elements, and which they hoped to extend, WEIBEL said that in -fact one can recognize the major elements of a document with a fairly -high degree of reliability, at least as good as OCR. STEVENS drew a -useful distinction between standard, generalized markup (i.e., defining -for a document-type definition the structure of the document), and what -he termed a style sheet, which had to do with italics, bolding, and other -forms of emphasis. Thus, two different components are at work, one being -the structure of the document itself (its logic), and the other being its -representation when it is put on the screen or printed. - - ****** - -SESSION V. APPROACHES TO PREPARING ELECTRONIC TEXTS - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -HOCKEY * Text in ASCII and the representation of electronic text versus -an image * The need to look at ways of using markup to assist retrieval * -The need for an encoding format that will be reusable and multifunctional -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Susan HOCKEY, director, Center for Electronic Texts in the Humanities -(CETH), Rutgers and Princeton Universities, announced that one talk -(WEIBEL's) was moved into this session from the morning and that David -Packard was unable to attend. The session would attempt to focus more on -what one can do with a text in ASCII and the representation of electronic -text rather than just an image, what one can do with a computer that -cannot be done with a book or an image. It would be argued that one can -do much more than just read a text, and from that starting point one can -use markup and methods of preparing the text to take full advantage of -the capability of the computer. That would lead to a discussion of what -the European Community calls REUSABILITY, what may better be termed -DURABILITY, that is, how to prepare or make a text that will last a long -time and that can be used for as many applications as possible, which -would lead to issues of improving intellectual access. - -HOCKEY urged the need to look at ways of using markup to facilitate retrieval, -not just for referencing or to help locate an item that is retrieved, but also to put markup tags in -a text to help retrieve the thing sought either with linguistic tagging or -interpretation. HOCKEY also argued that little advancement had occurred in -the software tools currently available for retrieving and searching text. -She pressed the desideratum of going beyond Boolean searches and performing -more sophisticated searching, which the insertion of more markup in the text -would facilitate. Thinking about electronic texts as opposed to images means -considering material that will never appear in print form, or print will not -be its primary form, that is, material which only appears in electronic form. -HOCKEY alluded to the history and the need for markup and tagging and -electronic text, which was developed through the use of computers in the -humanities; as MICHELSON had observed, Father Busa had started in 1949 -to prepare the first-ever text on the computer. - -HOCKEY remarked several large projects, particularly in Europe, for the -compilation of dictionaries, language studies, and language analysis, in -which people have built up archives of text and have begun to recognize -the need for an encoding format that will be reusable and multifunctional, -that can be used not just to print the text, which may be assumed to be a -byproduct of what one wants to do, but to structure it inside the computer -so that it can be searched, built into a Hypertext system, etc. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -WEIBEL * OCLC's approach to preparing electronic text: retroconversion, -keying of texts, more automated ways of developing data * Project ADAPT -and the CORE Project * Intelligent character recognition does not exist * -Advantages of SGML * Data should be free of procedural markup; -descriptive markup strongly advocated * OCLC's interface illustrated * -Storage requirements and costs for putting a lot of information on line * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Stuart WEIBEL, senior research scientist, Online Computer Library Center, -Inc. (OCLC), described OCLC's approach to preparing electronic text. He -argued that the electronic world into which we are moving must -accommodate not only the future but the past as well, and to some degree -even the present. Thus, starting out at one end with retroconversion and -keying of texts, one would like to move toward much more automated ways -of developing data. - -For example, Project ADAPT had to do with automatically converting -document images into a structured document database with OCR text as -indexing and also a little bit of automatic formatting and tagging of -that text. The CORE project hosted by Cornell University, Bellcore, -OCLC, the American Chemical Society, and Chemical Abstracts, constitutes -WEIBEL's principal concern at the moment. This project is an example of -converting text for which one already has a machine-readable version into -a format more suitable for electronic delivery and database searching. -(Since Michael LESK had previously described CORE, WEIBEL would say -little concerning it.) Borrowing a chemical phrase, de novo synthesis, -WEIBEL cited the Online Journal of Current Clinical Trials as an example -of de novo electronic publishing, that is, a form in which the primary -form of the information is electronic. - -Project ADAPT, then, which OCLC completed a couple of years ago and in -fact is about to resume, is a model in which one takes page images either -in paper or microfilm and converts them automatically to a searchable -electronic database, either on-line or local. The operating assumption -is that accepting some blemishes in the data, especially for -retroconversion of materials, will make it possible to accomplish more. -Not enough money is available to support perfect conversion. - -WEIBEL related several steps taken to perform image preprocessing -(processing on the image before performing optical character -recognition), as well as image postprocessing. He denied the existence -of intelligent character recognition and asserted that what is wanted is -page recognition, which is a long way off. OCLC has experimented with -merging of multiple optical character recognition systems that will -reduce errors from an unacceptable rate of 5 characters out of every -l,000 to an unacceptable rate of 2 characters out of every l,000, but it -is not good enough. It will never be perfect. - -Concerning the CORE Project, WEIBEL observed that Bellcore is taking the -topography files, extracting the page images, and converting those -topography files to SGML markup. LESK hands that data off to OCLC, which -builds that data into a Newton database, the same system that underlies -the on-line system in virtually all of the reference products at OCLC. -The long-term goal is to make the systems interoperable so that not just -Bellcore's system and OCLC's system can access this data, but other -systems can as well, and the key to that is the Z39.50 common command -language and the full-text extension. Z39.50 is fine for MARC records, -but is not enough to do it for full text (that is, make full texts -interoperable). - -WEIBEL next outlined the critical role of SGML for a variety of purposes, -for example, as noted by HOCKEY, in the world of extremely large -databases, using highly structured data to perform field searches. -WEIBEL argued that by building the structure of the data in (i.e., the -structure of the data originally on a printed page), it becomes easy to -look at a journal article even if one cannot read the characters and know -where the title or author is, or what the sections of that document would be. -OCLC wants to make that structure explicit in the database, because it will -be important for retrieval purposes. - -The second big advantage of SGML is that it gives one the ability to -build structure into the database that can be used for display purposes -without contaminating the data with instructions about how to format -things. The distinction lies between procedural markup, which tells one -where to put dots on the page, and descriptive markup, which describes -the elements of a document. - -WEIBEL believes that there should be no procedural markup in the data at -all, that the data should be completely unsullied by information about -italics or boldness. That should be left up to the display device, -whether that display device is a page printer or a screen display device. -By keeping one's database free of that kind of contamination, one can -make decisions down the road, for example, reorganize the data in ways -that are not cramped by built-in notions of what should be italic and -what should be bold. WEIBEL strongly advocated descriptive markup. As -an example, he illustrated the index structure in the CORE data. With -subsequent illustrated examples of markup, WEIBEL acknowledged the common -complaint that SGML is hard to read in its native form, although markup -decreases considerably once one gets into the body. Without the markup, -however, one would not have the structure in the data. One can pass -markup through a LaTeX processor and convert it relatively easily to a -printed version of the document. - -WEIBEL next illustrated an extremely cluttered screen dump of OCLC's -system, in order to show as much as possible the inherent capability on -the screen. (He noted parenthetically that he had become a supporter of -X-Windows as a result of the progress of the CORE Project.) WEIBEL also -illustrated the two major parts of the interface: l) a control box that -allows one to generate lists of items, which resembles a small table of -contents based on key words one wishes to search, and 2) a document -viewer, which is a separate process in and of itself. He demonstrated -how to follow links through the electronic database simply by selecting -the appropriate button and bringing them up. He also noted problems that -remain to be accommodated in the interface (e.g., as pointed out by LESK, -what happens when users do not click on the icon for the figure). - -Given the constraints of time, WEIBEL omitted a large number of ancillary -items in order to say a few words concerning storage requirements and -what will be required to put a lot of things on line. Since it is -extremely expensive to reconvert all of this data, especially if it is -just in paper form (and even if it is in electronic form in typesetting -tapes), he advocated building journals electronically from the start. In -that case, if one only has text graphics and indexing (which is all that -one needs with de novo electronic publishing, because there is no need to -go back and look at bit-maps of pages), one can get 10,000 journals of -full text, or almost 6 million pages per year. These pages can be put in -approximately 135 gigabytes of storage, which is not all that much, -WEIBEL said. For twenty years, something less than three terabytes would -be required. WEIBEL calculated the costs of storing this information as -follows: If a gigabyte costs approximately $1,000, then a terabyte costs -approximately $1 million to buy in terms of hardware. One also needs a -building to put it in and a staff like OCLC to handle that information. -So, to support a terabyte, multiply by five, which gives $5 million per -year for a supported terabyte of data. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * Tapes saved by ACS are the typography files originally -supporting publication of the journal * Cost of building tagged text into -the database * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -During the question-and-answer period that followed WEIBEL's -presentation, these clarifications emerged. The tapes saved by the -American Chemical Society are the typography files that originally -supported the publication of the journal. Although they are not tagged -in SGML, they are tagged in very fine detail. Every single sentence is -marked, all the registry numbers, all the publications issues, dates, and -volumes. No cost figures on tagging material on a per-megabyte basis -were available. Because ACS's typesetting system runs from tagged text, -there is no extra cost per article. It was unknown what it costs ACS to -keyboard the tagged text rather than just keyboard the text in the -cheapest process. In other words, since one intends to publish things -and will need to build tagged text into a typography system in any case, -if one does that in such a way that it can drive not only typography but -an electronic system (which is what ACS intends to do--move to SGML -publishing), the marginal cost is zero. The marginal cost represents the -cost of building tagged text into the database, which is small. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -SPERBERG-McQUEEN * Distinction between texts and computers * Implications -of recognizing that all representation is encoding * Dealing with -complicated representations of text entails the need for a grammar of -documents * Variety of forms of formal grammars * Text as a bit-mapped -image does not represent a serious attempt to represent text in -electronic form * SGML, the TEI, document-type declarations, and the -reusability and longevity of data * TEI conformance explicitly allows -extension or modification of the TEI tag set * Administrative background -of the TEI * Several design goals for the TEI tag set * An absolutely -fixed requirement of the TEI Guidelines * Challenges the TEI has -attempted to face * Good texts not beyond economic feasibility * The -issue of reproducibility or processability * The issue of mages as -simulacra for the text redux * One's model of text determines what one's -software can do with a text and has economic consequences * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Prior to speaking about SGML and markup, Michael SPERBERG-McQUEEN, editor, -Text Encoding Initiative (TEI), University of Illinois-Chicago, first drew -a distinction between texts and computers: Texts are abstract cultural -and linguistic objects while computers are complicated physical devices, -he said. Abstract objects cannot be placed inside physical devices; with -computers one can only represent text and act upon those representations. - -The recognition that all representation is encoding, SPERBERG-McQUEEN -argued, leads to the recognition of two things: 1) The topic description -for this session is slightly misleading, because there can be no discussion -of pros and cons of text-coding unless what one means is pros and cons of -working with text with computers. 2) No text can be represented in a -computer without some sort of encoding; images are one way of encoding text, -ASCII is another, SGML yet another. There is no encoding without some -information loss, that is, there is no perfect reproduction of a text that -allows one to do away with the original. Thus, the question becomes, -What is the most useful representation of text for a serious work? -This depends on what kind of serious work one is talking about. - -The projects demonstrated the previous day all involved highly complex -information and fairly complex manipulation of the textual material. -In order to use that complicated information, one has to calculate it -slowly or manually and store the result. It needs to be stored, therefore, -as part of one's representation of the text. Thus, one needs to store the -structure in the text. To deal with complicated representations of text, -one needs somehow to control the complexity of the representation of a text; -that means one needs a way of finding out whether a document and an -electronic representation of a document is legal or not; and that -means one needs a grammar of documents. - -SPERBERG-McQUEEN discussed the variety of forms of formal grammars, -implicit and explicit, as applied to text, and their capabilities. He -argued that these grammars correspond to different models of text that -different developers have. For example, one implicit model of the text -is that there is no internal structure, but just one thing after another, -a few characters and then perhaps a start-title command, and then a few -more characters and an end-title command. SPERBERG-McQUEEN also -distinguished several kinds of text that have a sort of hierarchical -structure that is not very well defined, which, typically, corresponds -to grammars that are not very well defined, as well as hierarchies that -are very well defined (e.g., the Thesaurus Linguae Graecae) and extremely -complicated things such as SGML, which handle strictly hierarchical data -very nicely. - -SPERBERG-McQUEEN conceded that one other model not illustrated on his two -displays was the model of text as a bit-mapped image, an image of a page, -and confessed to having been converted to a limited extent by the -Workshop to the view that electronic images constitute a promising, -probably superior alternative to microfilming. But he was not convinced -that electronic images represent a serious attempt to represent text in -electronic form. Many of their problems stem from the fact that they are -not direct attempts to represent the text but attempts to represent the -page, thus making them representations of representations. - -In this situation of increasingly complicated textual information and the -need to control that complexity in a useful way (which begs the question -of the need for good textual grammars), one has the introduction of SGML. -With SGML, one can develop specific document-type declarations -for specific text types or, as with the TEI, attempts to generate -general document-type declarations that can handle all sorts of text. -The TEI is an attempt to develop formats for text representation that -will ensure the kind of reusability and longevity of data discussed earlier. -It offers a way to stay alive in the state of permanent technological -revolution. - -It has been a continuing challenge in the TEI to create document grammars -that do some work in controlling the complexity of the textual object but -also allowing one to represent the real text that one will find. -Fundamental to the notion of the TEI is that TEI conformance allows one -the ability to extend or modify the TEI tag set so that it fits the text -that one is attempting to represent. - -SPERBERG-McQUEEN next outlined the administrative background of the TEI. -The TEI is an international project to develop and disseminate guidelines -for the encoding and interchange of machine-readable text. It is -sponsored by the Association for Computers in the Humanities, the -Association for Computational Linguistics, and the Association for -Literary and Linguistic Computing. Representatives of numerous other -professional societies sit on its advisory board. The TEI has a number -of affiliated projects that have provided assistance by testing drafts of -the guidelines. - -Among the design goals for the TEI tag set, the scheme first of all must -meet the needs of research, because the TEI came out of the research -community, which did not feel adequately served by existing tag sets. -The tag set must be extensive as well as compatible with existing and -emerging standards. In 1990, version 1.0 of the Guidelines was released -(SPERBERG-McQUEEN illustrated their contents). - -SPERBERG-McQUEEN noted that one problem besetting electronic text has -been the lack of adequate internal or external documentation for many -existing electronic texts. The TEI guidelines as currently formulated -contain few fixed requirements, but one of them is this: There must -always be a document header, an in-file SGML tag that provides -1) a bibliographic description of the electronic object one is talking -about (that is, who included it, when, what for, and under which title); -and 2) the copy text from which it was derived, if any. If there was -no copy text or if the copy text is unknown, then one states as much. -Version 2.0 of the Guidelines was scheduled to be completed in fall 1992 -and a revised third version is to be presented to the TEI advisory board -for its endorsement this coming winter. The TEI itself exists to provide -a markup language, not a marked-up text. - -Among the challenges the TEI has attempted to face is the need for a -markup language that will work for existing projects, that is, handle the -level of markup that people are using now to tag only chapter, section, -and paragraph divisions and not much else. At the same time, such a -language also will be able to scale up gracefully to handle the highly -detailed markup which many people foresee as the future destination of -much electronic text, and which is not the future destination but the -present home of numerous electronic texts in specialized areas. - -SPERBERG-McQUEEN dismissed the lowest-common-denominator approach as -unable to support the kind of applications that draw people who have -never been in the public library regularly before, and make them come -back. He advocated more interesting text and more intelligent text. -Asserting that it is not beyond economic feasibility to have good texts, -SPERBERG-McQUEEN noted that the TEI Guidelines listing 200-odd tags -contains tags that one is expected to enter every time the relevant -textual feature occurs. It contains all the tags that people need now, -and it is not expected that everyone will tag things in the same way. - -The question of how people will tag the text is in large part a function -of their reaction to what SPERBERG-McQUEEN termed the issue of -reproducibility. What one needs to be able to reproduce are the things -one wants to work with. Perhaps a more useful concept than that of -reproducibility or recoverability is that of processability, that is, -what can one get from an electronic text without reading it again -in the original. He illustrated this contention with a page from -Jan Comenius's bilingual Introduction to Latin. - -SPERBERG-McQUEEN returned at length to the issue of images as simulacra -for the text, in order to reiterate his belief that in the long run more -than images of pages of particular editions of the text are needed, -because just as second-generation photocopies and second-generation -microfilm degenerate, so second-generation representations tend to -degenerate, and one tends to overstress some relatively trivial aspects -of the text such as its layout on the page, which is not always -significant, despite what the text critics might say, and slight other -pieces of information such as the very important lexical ties between the -English and Latin versions of Comenius's bilingual text, for example. -Moreover, in many crucial respects it is easy to fool oneself concerning -what a scanned image of the text will accomplish. For example, in order -to study the transmission of texts, information concerning the text -carrier is necessary, which scanned images simply do not always handle. -Further, even the high-quality materials being produced at Cornell use -much of the information that one would need if studying those books as -physical objects. It is a choice that has been made. It is an arguably -justifiable choice, but one does not know what color those pen strokes in -the margin are or whether there was a stain on the page, because it has -been filtered out. One does not know whether there were rips in the page -because they do not show up, and on a couple of the marginal marks one -loses half of the mark because the pen is very light and the scanner -failed to pick it up, and so what is clearly a checkmark in the margin of -the original becomes a little scoop in the margin of the facsimile. -Standard problems for facsimile editions, not new to electronics, but -also true of light-lens photography, and are remarked here because it is -important that we not fool ourselves that even if we produce a very nice -image of this page with good contrast, we are not replacing the -manuscript any more than microfilm has replaced the manuscript. - -The TEI comes from the research community, where its first allegiance -lies, but it is not just an academic exercise. It has relevance far -beyond those who spend all of their time studying text, because one's -model of text determines what one's software can do with a text. Good -models lead to good software. Bad models lead to bad software. That has -economic consequences, and it is these economic consequences that have -led the European Community to help support the TEI, and that will lead, -SPERBERG-McQUEEN hoped, some software vendors to realize that if they -provide software with a better model of the text they can make a killing. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * Implications of different DTDs and tag sets * ODA versus SGML * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -During the discussion that followed, several additional points were made. -Neither AAP (i.e., Association of American Publishers) nor CALS (i.e., -Computer-aided Acquisition and Logistics Support) has a document-type -definition for ancient Greek drama, although the TEI will be able to -handle that. Given this state of affairs and assuming that the -technical-journal producers and the commercial vendors decide to use the -other two types, then an institution like the Library of Congress, which -might receive all of their publications, would have to be able to handle -three different types of document definitions and tag sets and be able to -distinguish among them. - -Office Document Architecture (ODA) has some advantages that flow from its -tight focus on office documents and clear directions for implementation. -Much of the ODA standard is easier to read and clearer at first reading -than the SGML standard, which is extremely general. What that means is -that if one wants to use graphics in TIFF and ODA, one is stuck, because -ODA defines graphics formats while TIFF does not, whereas SGML says the -world is not waiting for this work group to create another graphics format. -What is needed is an ability to use whatever graphics format one wants. - -The TEI provides a socket that allows one to connect the SGML document to -the graphics. The notation that the graphics are in is clearly a choice -that one needs to make based on her or his environment, and that is one -advantage. SGML is less megalomaniacal in attempting to define formats -for all kinds of information, though more megalomaniacal in attempting to -cover all sorts of documents. The other advantage is that the model of -text represented by SGML is simply an order of magnitude richer and more -flexible than the model of text offered by ODA. Both offer hierarchical -structures, but SGML recognizes that the hierarchical model of the text -that one is looking at may not have been in the minds of the designers, -whereas ODA does not. - -ODA is not really aiming for the kind of document that the TEI wants to -encompass. The TEI can handle the kind of material ODA has, as well as a -significantly broader range of material. ODA seems to be very much -focused on office documents, which is what it started out being called-- -office document architecture. - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -CALALUCA * Text-encoding from a publisher's perspective * -Responsibilities of a publisher * Reproduction of Migne's Latin series -whole and complete with SGML tags based on perceived need and expected -use * Particular decisions arising from the general decision to produce -and publish PLD * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -The final speaker in this session, Eric CALALUCA, vice president, -Chadwyck-Healey, Inc., spoke from the perspective of a publisher re -text-encoding, rather than as one qualified to discuss methods of -encoding data, and observed that the presenters sitting in the room, -whether they had chosen to or not, were acting as publishers: making -choices, gathering data, gathering information, and making assessments. -CALALUCA offered the hard-won conviction that in publishing very large -text files (such as PLD), one cannot avoid making personal judgments of -appropriateness and structure. - -In CALALUCA's view, encoding decisions stem from prior judgments. Two -notions have become axioms for him in the consideration of future sources -for electronic publication: 1) electronic text publishing is as personal -as any other kind of publishing, and questions of if and how to encode -the data are simply a consequence of that prior decision; 2) all -personal decisions are open to criticism, which is unavoidable. - -CALALUCA rehearsed his role as a publisher or, better, as an intermediary -between what is viewed as a sound idea and the people who would make use -of it. Finding the specialist to advise in this process is the core of -that function. The publisher must monitor and hug the fine line between -giving users what they want and suggesting what they might need. One -responsibility of a publisher is to represent the desires of scholars and -research librarians as opposed to bullheadedly forcing them into areas -they would not choose to enter. - -CALALUCA likened the questions being raised today about data structure -and standards to the decisions faced by the Abbe Migne himself during -production of the Patrologia series in the mid-nineteenth century. -Chadwyck-Healey's decision to reproduce Migne's Latin series whole and -complete with SGML tags was also based upon a perceived need and an -expected use. In the same way that Migne's work came to be far more than -a simple handbook for clerics, PLD is already far more than a database -for theologians. It is a bedrock source for the study of Western -civilization, CALALUCA asserted. - -In regard to the decision to produce and publish PLD, the editorial board -offered direct judgments on the question of appropriateness of these -texts for conversion, their encoding and their distribution, and -concluded that the best possible project was one that avoided overt -intrusions or exclusions in so important a resource. Thus, the general -decision to transmit the original collection as clearly as possible with -the widest possible avenues for use led to other decisions: 1) To encode -the data or not, SGML or not, TEI or not. Again, the expected user -community asserted the need for normative tagging structures of important -humanities texts, and the TEI seemed the most appropriate structure for -that purpose. Research librarians, who are trained to view the larger -impact of electronic text sources on 80 or 90 or 100 doctoral -disciplines, loudly approved the decision to include tagging. They see -what is coming better than the specialist who is completely focused on -one edition of Ambrose's De Anima, and they also understand that the -potential uses exceed present expectations. 2) What will be tagged and -what will not. Once again, the board realized that one must tag the -obvious. But in no way should one attempt to identify through encoding -schemes every single discrete area of a text that might someday be -searched. That was another decision. Searching by a column number, an -author, a word, a volume, permitting combination searches, and tagging -notations seemed logical choices as core elements. 3) How does one make -the data available? Tieing it to a CD-ROM edition creates limitations, -but a magnetic tape file that is very large, is accompanied by the -encoding specifications, and that allows one to make local modifications -also allows one to incorporate any changes one may desire within the -bounds of private research, though exporting tag files from a CD-ROM -could serve just as well. Since no one on the board could possibly -anticipate each and every way in which a scholar might choose to mine -this data bank, it was decided to satisfy the basics and make some -provisions for what might come. 4) Not to encode the database would rob -it of the interchangeability and portability these important texts should -accommodate. For CALALUCA, the extensive options presented by full-text -searching require care in text selection and strongly support encoding of -data to facilitate the widest possible search strategies. Better -software can always be created, but summoning the resources, the people, -and the energy to reconvert the text is another matter. - -PLD is being encoded, captured, and distributed, because to -Chadwyck-Healey and the board it offers the widest possible array of -future research applications that can be seen today. CALALUCA concluded -by urging the encoding of all important text sources in whatever way -seems most appropriate and durable at the time, without blanching at the -thought that one's work may require emendation in the future. (Thus, -Chadwyck-Healey produced a very large humanities text database before the -final release of the TEI Guidelines.) - - ****** - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -DISCUSSION * Creating texts with markup advocated * Trends in encoding * -The TEI and the issue of interchangeability of standards * A -misconception concerning the TEI * Implications for an institution like -LC in the event that a multiplicity of DTDs develops * Producing images -as a first step towards possible conversion to full text through -character recognition * The AAP tag sets as a common starting point and -the need for caution * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -HOCKEY prefaced the discussion that followed with several comments in -favor of creating texts with markup and on trends in encoding. In the -future, when many more texts are available for on-line searching, real -problems in finding what is wanted will develop, if one is faced with -millions of words of data. It therefore becomes important to consider -putting markup in texts to help searchers home in on the actual things -they wish to retrieve. Various approaches to refining retrieval methods -toward this end include building on a computer version of a dictionary -and letting the computer look up words in it to obtain more information -about the semantic structure or semantic field of a word, its grammatical -structure, and syntactic structure. - -HOCKEY commented on the present keen interest in the encoding world -in creating: 1) machine-readable versions of dictionaries that can be -initially tagged in SGML, which gives a structure to the dictionary entry; -these entries can then be converted into a more rigid or otherwise -different database structure inside the computer, which can be treated as -a dynamic tool for searching mechanisms; 2) large bodies of text to study -the language. In order to incorporate more sophisticated mechanisms, -more about how words behave needs to be known, which can be learned in -part from information in dictionaries. However, the last ten years have -seen much interest in studying the structure of printed dictionaries -converted into computer-readable form. The information one derives about -many words from those is only partial, one or two definitions of the -common or the usual meaning of a word, and then numerous definitions of -unusual usages. If the computer is using a dictionary to help retrieve -words in a text, it needs much more information about the common usages, -because those are the ones that occur over and over again. Hence the -current interest in developing large bodies of text in computer-readable -form in order to study the language. Several projects are engaged in -compiling, for example, 100 million words. HOCKEY described one with -which she was associated briefly at Oxford University involving -compilation of 100 million words of British English: about 10 percent of -that will contain detailed linguistic tagging encoded in SGML; it will -have word class taggings, with words identified as nouns, verbs, -adjectives, or other parts of speech. This tagging can then be used by -programs which will begin to learn a bit more about the structure of the -language, and then, can go to tag more text. - -HOCKEY said that the more that is tagged accurately, the more one can -refine the tagging process and thus the bigger body of text one can build -up with linguistic tagging incorporated into it. Hence, the more tagging -or annotation there is in the text, the more one may begin to learn about -language and the more it will help accomplish more intelligent OCR. She -recommended the development of software tools that will help one begin to -understand more about a text, which can then be applied to scanning -images of that text in that format and to using more intelligence to help -one interpret or understand the text. - -HOCKEY posited the need to think about common methods of text-encoding -for a long time to come, because building these large bodies of text is -extremely expensive and will only be done once. - -In the more general discussion on approaches to encoding that followed, -these points were made: - -BESSER identified the underlying problem with standards that all have to -struggle with in adopting a standard, namely, the tension between a very -highly defined standard that is very interchangeable but does not work -for everyone because something is lacking, and a standard that is less -defined, more open, more adaptable, but less interchangeable. Contending -that the way in which people use SGML is not sufficiently defined, BESSER -wondered 1) if people resist the TEI because they think it is too defined -in certain things they do not fit into, and 2) how progress with -interchangeability can be made without frightening people away. - -SPERBERG-McQUEEN replied that the published drafts of the TEI had met -with surprisingly little objection on the grounds that they do not allow -one to handle X or Y or Z. Particular concerns of the affiliated -projects have led, in practice, to discussions of how extensions are to -be made; the primary concern of any project has to be how it can be -represented locally, thus making interchange secondary. The TEI has -received much criticism based on the notion that everything in it is -required or even recommended, which, as it happens, is a misconception -from the beginning, because none of it is required and very little is -actually actively recommended for all cases, except that one document -one's source. - -SPERBERG-McQUEEN agreed with BESSER about this trade-off: all the -projects in a set of twenty TEI-conformant projects will not necessarily -tag the material in the same way. One result of the TEI will be that the -easiest problems will be solved--those dealing with the external form of -the information; but the problem that is hardest in interchange is that -one is not encoding what another wants, and vice versa. Thus, after -the adoption of a common notation, the differences in the underlying -conceptions of what is interesting about texts become more visible. -The success of a standard like the TEI will lie in the ability of -the recipient of interchanged texts to use some of what it contains -and to add the information that was not encoded that one wants, in a -layered way, so that texts can be gradually enriched and one does not -have to put in everything all at once. Hence, having a well-behaved -markup scheme is important. - -STEVENS followed up on the paradoxical analogy that BESSER alluded to in -the example of the MARC records, namely, the formats that are the same -except that they are different. STEVENS drew a parallel between -document-type definitions and MARC records for books and serials and maps, -where one has a tagging structure and there is a text-interchange. -STEVENS opined that the producers of the information will set the terms -for the standard (i.e., develop document-type definitions for the users -of their products), creating a situation that will be problematical for -an institution like the Library of Congress, which will have to deal with -the DTDs in the event that a multiplicity of them develops. Thus, -numerous people are seeking a standard but cannot find the tag set that -will be acceptable to them and their clients. SPERBERG-McQUEEN agreed -with this view, and said that the situation was in a way worse: attempting -to unify arbitrary DTDs resembled attempting to unify a MARC record with a -bibliographic record done according to the Prussian instructions. -According to STEVENS, this situation occurred very early in the process. - -WATERS recalled from early discussions on Project Open Book the concern -of many people that merely by producing images, POB was not really -enhancing intellectual access to the material. Nevertheless, not wishing -to overemphasize the opposition between imaging and full text, WATERS -stated that POB views getting the images as a first step toward possibly -converting to full text through character recognition, if the technology -is appropriate. WATERS also emphasized that encoding is involved even -with a set of images. - -SPERBERG-McQUEEN agreed with WATERS that one can create an SGML document -consisting wholly of images. At first sight, organizing graphic images -with an SGML document may not seem to offer great advantages, but the -advantages of the scheme WATERS described would be precisely that -ability to move into something that is more of a multimedia document: -a combination of transcribed text and page images. WEIBEL concurred in -this judgment, offering evidence from Project ADAPT, where a page is -divided into text elements and graphic elements, and in fact the text -elements are organized by columns and lines. These lines may be used as -the basis for distributing documents in a network environment. As one -develops software intelligent enough to recognize what those elements -are, it makes sense to apply SGML to an image initially, that may, in -fact, ultimately become more and more text, either through OCR or edited -OCR or even just through keying. For WATERS, the labor of composing the -document and saying this set of documents or this set of images belongs -to this document constitutes a significant investment. - -WEIBEL also made the point that the AAP tag sets, while not excessively -prescriptive, offer a common starting point; they do not define the -structure of the documents, though. They have some recommendations about -DTDs one could use as examples, but they do just suggest tag sets. For -example, the CORE project attempts to use the AAP markup as much as -possible, but there are clearly areas where structure must be added. -That in no way contradicts the use of AAP tag sets. - -SPERBERG-McQUEEN noted that the TEI prepared a long working paper early -on about the AAP tag set and what it lacked that the TEI thought it -needed, and a fairly long critique of the naming conventions, which has -led to a very different style of naming in the TEI. He stressed the -importance of the opposition between prescriptive markup, the kind that a -publisher or anybody can do when producing documents de novo, and -descriptive markup, in which one has to take what the text carrier -provides. In these particular tag sets it is easy to overemphasize this -opposition, because the AAP tag set is extremely flexible. Even if one -just used the DTDs, they allow almost anything to appear almost anywhere. - - ****** - -SESSION VI. COPYRIGHT ISSUES - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -PETERS * Several cautions concerning copyright in an electronic -environment * Review of copyright law in the United States * The notion -of the public good and the desirability of incentives to promote it * -What copyright protects * Works not protected by copyright * The rights -of copyright holders * Publishers' concerns in today's electronic -environment * Compulsory licenses * The price of copyright in a digital -medium and the need for cooperation * Additional clarifications * Rough -justice oftentimes the outcome in numerous copyright matters * Copyright -in an electronic society * Copyright law always only sets up the -boundaries; anything can be changed by contract * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -Marybeth PETERS, policy planning adviser to the Register of Copyrights, -Library of Congress, made several general comments and then opened the -floor to discussion of subjects of interest to the audience. - -Having attended several sessions in an effort to gain a sense of what -people did and where copyright would affect their lives, PETERS expressed -the following cautions: - - * If one takes and converts materials and puts them in new forms, - then, from a copyright point of view, one is creating something and - will receive some rights. - - * However, if what one is converting already exists, a question - immediately arises about the status of the materials in question. - - * Putting something in the public domain in the United States offers - some freedom from anxiety, but distributing it throughout the world - on a network is another matter, even if one has put it in the public - domain in the United States. Re foreign laws, very frequently a - work can be in the public domain in the United States but protected - in other countries. Thus, one must consider all of the places a - work may reach, lest one unwittingly become liable to being faced - with a suit for copyright infringement, or at least a letter - demanding discussion of what one is doing. - -PETERS reviewed copyright law in the United States. The U.S. -Constitution effectively states that Congress has the power to enact -copyright laws for two purposes: 1) to encourage the creation and -dissemination of intellectual works for the good of society as a whole; -and, significantly, 2) to give creators and those who package and -disseminate materials the economic rewards that are due them. - -Congress strives to strike a balance, which at times can become an -emotional issue. The United States has never accepted the notion of the -natural right of an author so much as it has accepted the notion of the -public good and the desirability of incentives to promote it. This state -of affairs, however, has created strains on the international level and -is the reason for several of the differences in the laws that we have. -Today the United States protects almost every kind of work that can be -called an expression of an author. The standard for gaining copyright -protection is simply originality. This is a low standard and means that -a work is not copied from something else, as well as shows a certain -minimal amount of authorship. One can also acquire copyright protection -for making a new version of preexisting material, provided it manifests -some spark of creativity. - -However, copyright does not protect ideas, methods, systems--only the way -that one expresses those things. Nor does copyright protect anything -that is mechanical, anything that does not involve choice, or criteria -concerning whether or not one should do a thing. For example, the -results of a process called declicking, in which one mechanically removes -impure sounds from old recordings, are not copyrightable. On the other -hand, the choice to record a song digitally and to increase the sound of -violins or to bring up the tympani constitutes the results of conversion -that are copyrightable. Moreover, if a work is protected by copyright in -the United States, one generally needs the permission of the copyright -owner to convert it. Normally, who will own the new--that is, converted- --material is a matter of contract. In the absence of a contract, the -person who creates the new material is the author and owner. But people -do not generally think about the copyright implications until after the -fact. PETERS stressed the need when dealing with copyrighted works to -think about copyright in advance. One's bargaining power is much greater -up front than it is down the road. - -PETERS next discussed works not protected by copyright, for example, any -work done by a federal employee as part of his or her official duties is -in the public domain in the United States. The issue is not wholly free -of doubt concerning whether or not the work is in the public domain -outside the United States. Other materials in the public domain include: -any works published more than seventy-five years ago, and any work -published in the United States more than twenty-eight years ago, whose -copyright was not renewed. In talking about the new technology and -putting material in a digital form to send all over the world, PETERS -cautioned, one must keep in mind that while the rights may not be an -issue in the United States, they may be in different parts of the world, -where most countries previously employed a copyright term of the life of -the author plus fifty years. - -PETERS next reviewed the economics of copyright holding. Simply, -economic rights are the rights to control the reproduction of a work in -any form. They belong to the author, or in the case of a work made for -hire, the employer. The second right, which is critical to conversion, -is the right to change a work. The right to make new versions is perhaps -one of the most significant rights of authors, particularly in an -electronic world. The third right is the right to publish the work and -the right to disseminate it, something that everyone who deals in an -electronic medium needs to know. The basic rule is if a copy is sold, -all rights of distribution are extinguished with the sale of that copy. -The key is that it must be sold. A number of companies overcome this -obstacle by leasing or renting their product. These companies argue that -if the material is rented or leased and not sold, they control the uses -of a work. The fourth right, and one very important in a digital world, -is a right of public performance, which means the right to show the work -sequentially. For example, copyright owners control the showing of a -CD-ROM product in a public place such as a public library. The reverse -side of public performance is something called the right of public -display. Moral rights also exist, which at the federal level apply only -to very limited visual works of art, but in theory may apply under -contract and other principles. Moral rights may include the right of an -author to have his or her name on a work, the right of attribution, and -the right to object to distortion or mutilation--the right of integrity. - -The way copyright law is worded gives much latitude to activities such as -preservation; to use of material for scholarly and research purposes when -the user does not make multiple copies; and to the generation of -facsimile copies of unpublished works by libraries for themselves and -other libraries. But the law does not allow anyone to become the -distributor of the product for the entire world. In today's electronic -environment, publishers are extremely concerned that the entire world is -networked and can obtain the information desired from a single copy in a -single library. Hence, if there is to be only one sale, which publishers -may choose to live with, they will obtain their money in other ways, for -example, from access and use. Hence, the development of site licenses -and other kinds of agreements to cover what publishers believe they -should be compensated for. Any solution that the United States takes -today has to consider the international arena. - -Noting that the United States is a member of the Berne Convention and -subscribes to its provisions, PETERS described the permissions process. -She also defined compulsory licenses. A compulsory license, of which the -United States has had a few, builds into the law the right to use a work -subject to certain terms and conditions. In the international arena, -however, the ability to use compulsory licenses is extremely limited. -Thus, clearinghouses and other collectives comprise one option that has -succeeded in providing for use of a work. Often overlooked when one -begins to use copyrighted material and put products together is how -expensive the permissions process and managing it is. According to -PETERS, the price of copyright in a digital medium, whatever solution is -worked out, will include managing and assembling the database. She -strongly recommended that publishers and librarians or people with -various backgrounds cooperate to work out administratively feasible -systems, in order to produce better results. - -In the lengthy question-and-answer period that followed PETERS's -presentation, the following points emerged: - - * The Copyright Office maintains that anything mechanical and - totally exhaustive probably is not protected. In the event that - what an individual did in developing potentially copyrightable - material is not understood, the Copyright Office will ask about the - creative choices the applicant chose to make or not to make. As a - practical matter, if one believes she or he has made enough of those - choices, that person has a right to assert a copyright and someone - else must assert that the work is not copyrightable. The more - mechanical, the more automatic, a thing is, the less likely it is to - be copyrightable. - - * Nearly all photographs are deemed to be copyrightable, but no one - worries about them much, because everyone is free to take the same - image. Thus, a photographic copyright represents what is called a - "thin" copyright. The photograph itself must be duplicated, in - order for copyright to be violated. - - * The Copyright Office takes the position that X-rays are not - copyrightable because they are mechanical. It can be argued - whether or not image enhancement in scanning can be protected. One - must exercise care with material created with public funds and - generally in the public domain. An article written by a federal - employee, if written as part of official duties, is not - copyrightable. However, control over a scientific article written - by a National Institutes of Health grantee (i.e., someone who - receives money from the U.S. government), depends on NIH policy. If - the government agency has no policy (and that policy can be - contained in its regulations, the contract, or the grant), the - author retains copyright. If a provision of the contract, grant, or - regulation states that there will be no copyright, then it does not - exist. When a work is created, copyright automatically comes into - existence unless something exists that says it does not. - - * An enhanced electronic copy of a print copy of an older reference - work in the public domain that does not contain copyrightable new - material is a purely mechanical rendition of the original work, and - is not copyrightable. - - * Usually, when a work enters the public domain, nothing can remove - it. For example, Congress recently passed into law the concept of - automatic renewal, which means that copyright on any work published - between l964 and l978 does not have to be renewed in order to - receive a seventy-five-year term. But any work not renewed before - 1964 is in the public domain. - - * Concerning whether or not the United States keeps track of when - authors die, nothing was ever done, nor is anything being done at - the moment by the Copyright Office. - - * Software that drives a mechanical process is itself copyrightable. - If one changes platforms, the software itself has a copyright. The - World Intellectual Property Organization will hold a symposium 28 - March through 2 April l993, at Harvard University, on digital - technology, and will study this entire issue. If one purchases a - computer software package, such as MacPaint, and creates something - new, one receives protection only for that which has been added. - -PETERS added that often in copyright matters, rough justice is the -outcome, for example, in collective licensing, ASCAP (i.e., American -Society of Composers, Authors, and Publishers), and BMI (i.e., Broadcast -Music, Inc.), where it may seem that the big guys receive more than their -due. Of course, people ought not to copy a creative product without -paying for it; there should be some compensation. But the truth of the -world, and it is not a great truth, is that the big guy gets played on -the radio more frequently than the little guy, who has to do much more -until he becomes a big guy. That is true of every author, every -composer, everyone, and, unfortunately, is part of life. - -Copyright always originates with the author, except in cases of works -made for hire. (Most software falls into this category.) When an author -sends his article to a journal, he has not relinquished copyright, though -he retains the right to relinquish it. The author receives absolutely -everything. The less prominent the author, the more leverage the -publisher will have in contract negotiations. In order to transfer the -rights, the author must sign an agreement giving them away. - -In an electronic society, it is important to be able to license a writer -and work out deals. With regard to use of a work, it usually is much -easier when a publisher holds the rights. In an electronic era, a real -problem arises when one is digitizing and making information available. -PETERS referred again to electronic licensing clearinghouses. Copyright -ought to remain with the author, but as one moves forward globally in the -electronic arena, a middleman who can handle the various rights becomes -increasingly necessary. - -The notion of copyright law is that it resides with the individual, but -in an on-line environment, where a work can be adapted and tinkered with -by many individuals, there is concern. If changes are authorized and -there is no agreement to the contrary, the person who changes a work owns -the changes. To put it another way, the person who acquires permission -to change a work technically will become the author and the owner, unless -some agreement to the contrary has been made. It is typical for the -original publisher to try to control all of the versions and all of the -uses. Copyright law always only sets up the boundaries. Anything can be -changed by contract. - - ****** - -SESSION VII. CONCLUSION - -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ -GENERAL DISCUSSION * Two questions for discussion * Different emphases in -the Workshop * Bringing the text and image partisans together * -Desiderata in planning the long-term development of something * Questions -surrounding the issue of electronic deposit * Discussion of electronic -deposit as an allusion to the issue of standards * Need for a directory -of preservation projects in digital form and for access to their -digitized files * CETH's catalogue of machine-readable texts in the -humanities * What constitutes a publication in the electronic world? * -Need for LC to deal with the concept of on-line publishing * LC's Network -Development Office exploring the limits of MARC as a standard in terms -of handling electronic information * Magnitude of the problem and the -need for distributed responsibility in order to maintain and store -electronic information * Workshop participants to be viewed as a starting -point * Development of a network version of AM urged * A step toward AM's -construction of some sort of apparatus for network access * A delicate -and agonizing policy question for LC * Re the issue of electronic -deposit, LC urged to initiate a catalytic process in terms of distributed -responsibility * Suggestions for cooperative ventures * Commercial -publishers' fears * Strategic questions for getting the image and text -people to think through long-term cooperation * Clarification of the -driving force behind both the Perseus and the Cornell Xerox projects * -+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ - -In his role as moderator of the concluding session, GIFFORD raised two -questions he believed would benefit from discussion: 1) Are there enough -commonalities among those of us that have been here for two days so that -we can see courses of action that should be taken in the future? And, if -so, what are they and who might take them? 2) Partly derivative from -that, but obviously very dangerous to LC as host, do you see a role for -the Library of Congress in all this? Of course, the Library of Congress -holds a rather special status in a number of these matters, because it is -not perceived as a player with an economic stake in them, but are there -roles that LC can play that can help advance us toward where we are heading? - -Describing himself as an uninformed observer of the technicalities of the -last two days, GIFFORD detected three different emphases in the Workshop: -1) people who are very deeply committed to text; 2) people who are almost -passionate about images; and 3) a few people who are very committed to -what happens to the networks. In other words, the new networking -dimension, the accessibility of the processability, the portability of -all this across the networks. How do we pull those three together? - -Adding a question that reflected HOCKEY's comment that this was the -fourth workshop she had attended in the previous thirty days, FLEISCHHAUER -wondered to what extent this meeting had reinvented the wheel, or if it -had contributed anything in the way of bringing together a different group -of people from those who normally appear on the workshop circuit. - -HOCKEY confessed to being struck at this meeting and the one the -Electronic Pierce Consortium organized the previous week that this was a -coming together of people working on texts and not images. Attempting to -bring the two together is something we ought to be thinking about for the -future: How one can think about working with image material to begin -with, but structuring it and digitizing it in such a way that at a later -stage it can be interpreted into text, and find a common way of building -text and images together so that they can be used jointly in the future, -with the network support to begin there because that is how people will -want to access it. - -In planning the long-term development of something, which is what is -being done in electronic text, HOCKEY stressed the importance not only -of discussing the technical aspects of how one does it but particularly -of thinking about what the people who use the stuff will want to do. -But conversely, there are numerous things that people start to do with -electronic text or material that nobody ever thought of in the beginning. - -LESK, in response to the question concerning the role of the Library of -Congress, remarked the often suggested desideratum of having electronic -deposit: Since everything is now computer-typeset, an entire decade of -material that was machine-readable exists, but the publishers frequently -did not save it; has LC taken any action to have its copyright deposit -operation start collecting these machine-readable versions? In the -absence of PETERS, GIFFORD replied that the question was being -actively considered but that that was only one dimension of the problem. -Another dimension is the whole question of the integrity of the original -electronic document. It becomes highly important in science to prove -authorship. How will that be done? - -ERWAY explained that, under the old policy, to make a claim for a -copyright for works that were published in electronic form, including -software, one had to submit a paper copy of the first and last twenty -pages of code--something that represented the work but did not include -the entire work itself and had little value to anyone. As a temporary -measure, LC has claimed the right to demand electronic versions of -electronic publications. This measure entails a proactive role for the -Library to say that it wants a particular electronic version. Publishers -then have perhaps a year to submit it. But the real problem for LC is -what to do with all this material in all these different formats. Will -the Library mount it? How will it give people access to it? How does LC -keep track of the appropriate computers, software, and media? The situation -is so hard to control, ERWAY said, that it makes sense for each publishing -house to maintain its own archive. But LC cannot enforce that either. - -GIFFORD acknowledged LESK's suggestion that establishing a priority -offered the solution, albeit a fairly complicated one. But who maintains -that register?, he asked. GRABER noted that LC does attempt to collect a -Macintosh version and the IBM-compatible version of software. It does -not collect other versions. But while true for software, BYRUM observed, -this reply does not speak to materials, that is, all the materials that -were published that were on somebody's microcomputer or driver tapes -at a publishing office across the country. LC does well to acquire -specific machine-readable products selectively that were intended to be -machine-readable. Materials that were in machine-readable form at one time, -BYRUM said, would be beyond LC's capability at the moment, insofar as -attempting to acquire, organize, and preserve them are concerned--and -preservation would be the most important consideration. In this -connection, GIFFORD reiterated the need to work out some sense of -distributive responsibility for a number of these issues, which -inevitably will require significant cooperation and discussion. -Nobody can do it all. - -LESK suggested that some publishers may look with favor on LC beginning -to serve as a depository of tapes in an electronic manuscript standard. -Publishers may view this as a service that they did not have to perform -and they might send in tapes. However, SPERBERG-McQUEEN countered, -although publishers have had equivalent services available to them for a -long time, the electronic text archive has never turned away or been -flooded with tapes and is forever sending feedback to the depositor. -Some publishers do send in tapes. - -ANDRE viewed this discussion as an allusion to the issue of standards. -She recommended that the AAP standard and the TEI, which has already been -somewhat harmonized internationally and which also shares several -compatibilities with the AAP, be harmonized to ensure sufficient -compatibility in the software. She drew the line at saying LC ought to -be the locus or forum for such harmonization. - -Taking the group in a slightly different direction, but one where at -least in the near term LC might play a helpful role, LYNCH remarked the -plans of a number of projects to carry out preservation by creating -digital images that will end up in on-line or near-line storage at some -institution. Presumably, LC will link this material somehow to its -on-line catalog in most cases. Thus, it is in a digital form. LYNCH had -the impression that many of these institutions would be willing to make -those files accessible to other people outside the institution, provided -that there is no copyright problem. This desideratum will require -propagating the knowledge that those digitized files exist, so that they -can end up in other on-line catalogs. Although uncertain about the -mechanism for achieving this result, LYNCH said that it warranted -scrutiny because it seemed to be connected to some of the basic issues of -cataloging and distribution of records. It would be foolish, given the -amount of work that all of us have to do and our meager resources, to -discover multiple institutions digitizing the same work. Re microforms, -LYNCH said, we are in pretty good shape. - -BATTIN called this a big problem and noted that the Cornell people (who -had already departed) were working on it. At issue from the beginning -was to learn how to catalog that information into RLIN and then into -OCLC, so that it would be accessible. That issue remains to be resolved. -LYNCH rejoined that putting it into OCLC or RLIN was helpful insofar as -somebody who is thinking of performing preservation activity on that work -could learn about it. It is not necessarily helpful for institutions to -make that available. BATTIN opined that the idea was that it not only be -for preservation purposes but for the convenience of people looking for -this material. She endorsed LYNCH's dictum that duplication of this -effort was to be avoided by every means. - -HOCKEY informed the Workshop about one major current activity of CETH, -namely a catalogue of machine-readable texts in the humanities. Held on -RLIN at present, the catalogue has been concentrated on ASCII as opposed -to digitized images of text. She is exploring ways to improve the -catalogue and make it more widely available, and welcomed suggestions -about these concerns. CETH owns the records, which are not just -restricted to RLIN, and can distribute them however it wishes. - -Taking up LESK's earlier question, BATTIN inquired whether LC, since it -is accepting electronic files and designing a mechanism for dealing with -that rather than putting books on shelves, would become responsible for -the National Copyright Depository of Electronic Materials. Of course -that could not be accomplished overnight, but it would be something LC -could plan for. GIFFORD acknowledged that much thought was being devoted -to that set of problems and returned the discussion to the issue raised -by LYNCH--whether or not putting the kind of records that both BATTIN and -HOCKEY have been talking about in RLIN is not a satisfactory solution. -It seemed to him that RLIN answered LYNCH's original point concerning -some kind of directory for these kinds of materials. In a situation -where somebody is attempting to decide whether or not to scan this or -film that or to learn whether or not someone has already done so, LYNCH -suggested, RLIN is helpful, but it is not helpful in the case of a local, -on-line catalogue. Further, one would like to have her or his system be -aware that that exists in digital form, so that one can present it to a -patron, even though one did not digitize it, if it is out of copyright. -The only way to make those linkages would be to perform a tremendous -amount of real-time look-up, which would be awkward at best, or -periodically to yank the whole file from RLIN and match it against one's -own stuff, which is a nuisance. - -But where, ERWAY inquired, does one stop including things that are -available with Internet, for instance, in one's local catalogue? -It almost seems that that is LC's means to acquire access to them. -That represents LC's new form of library loan. Perhaps LC's new on-line -catalogue is an amalgamation of all these catalogues on line. LYNCH -conceded that perhaps that was true in the very long term, but was not -applicable to scanning in the short term. In his view, the totals cited -by Yale, 10,000 books over perhaps a four-year period, and 1,000-1,500 -books from Cornell, were not big numbers, while searching all over -creation for relatively rare occurrences will prove to be less efficient. -As GIFFORD wondered if this would not be a separable file on RLIN and -could be requested from them, BATTIN interjected that it was easily -accessible to an institution. SEVERTSON pointed out that that file, cum -enhancements, was available with reference information on CD-ROM, which -makes it a little more available. - -In HOCKEY's view, the real question facing the Workshop is what to put in -this catalogue, because that raises the question of what constitutes a -publication in the electronic world. (WEIBEL interjected that Eric Joule -in OCLC's Office of Research is also wrestling with this particular -problem, while GIFFORD thought it sounded fairly generic.) HOCKEY -contended that a majority of texts in the humanities are in the hands -of either a small number of large research institutions or individuals -and are not generally available for anyone else to access at all. -She wondered if these texts ought to be catalogued. - -After argument proceeded back and forth for several minutes over why -cataloguing might be a necessary service, LEBRON suggested that this -issue involved the responsibility of a publisher. The fact that someone -has created something electronically and keeps it under his or her -control does not constitute publication. Publication implies -dissemination. While it would be important for a scholar to let other -people know that this creation exists, in many respects this is no -different from an unpublished manuscript. That is what is being accessed -in there, except that now one is not looking at it in the hard-copy but -in the electronic environment. - -LEBRON expressed puzzlement at the variety of ways electronic publishing -has been viewed. Much of what has been discussed throughout these two -days has concerned CD-ROM publishing, whereas in the on-line environment -that she confronts, the constraints and challenges are very different. -Sooner or later LC will have to deal with the concept of on-line -publishing. Taking up the comment ERWAY made earlier about storing -copies, LEBRON gave her own journal as an example. How would she deposit -OJCCT for copyright?, she asked, because the journal will exist in the -mainframe at OCLC and people will be able to access it. Here the -situation is different, ownership versus access, and is something that -arises with publication in the on-line environment, faster than is -sometimes realized. Lacking clear answers to all of these questions -herself, LEBRON did not anticipate that LC would be able to take a role -in helping to define some of them for quite a while. - -GREENFIELD observed that LC's Network Development Office is attempting, -among other things, to explore the limits of MARC as a standard in terms -of handling electronic information. GREENFIELD also noted that Rebecca -GUENTHER from that office gave a paper to the American Society for -Information Science (ASIS) summarizing several of the discussion papers -that were coming out of the Network Development Office. GREENFIELD said -he understood that that office had a list-server soliciting just the kind -of feedback received today concerning the difficulties of identifying and -cataloguing electronic information. GREENFIELD hoped that everybody -would be aware of that and somehow contribute to that conversation. - -Noting two of LC's roles, first, to act as a repository of record for -material that is copyrighted in this country, and second, to make -materials it holds available in some limited form to a clientele that -goes beyond Congress, BESSER suggested that it was incumbent on LC to -extend those responsibilities to all the things being published in -electronic form. This would mean eventually accepting electronic -formats. LC could require that at some point they be in a certain -limited set of formats, and then develop mechanisms for allowing people -to access those in the same way that other things are accessed. This -does not imply that they are on the network and available to everyone. -LC does that with most of its bibliographic records, BESSER said, which -end up migrating to the utility (e.g., OCLC) or somewhere else. But just -as most of LC's books are available in some form through interlibrary -loan or some other mechanism, so in the same way electronic formats ought -to be available to others in some format, though with some copyright -considerations. BESSER was not suggesting that these mechanisms be -established tomorrow, only that they seemed to fall within LC's purview, -and that there should be long-range plans to establish them. - -Acknowledging that those from LC in the room agreed with BESSER -concerning the need to confront difficult questions, GIFFORD underscored -the magnitude of the problem of what to keep and what to select. GIFFORD -noted that LC currently receives some 31,000 items per day, not counting -electronic materials, and argued for much more distributed responsibility -in order to maintain and store electronic information. - -BESSER responded that the assembled group could be viewed as a starting -point, whose initial operating premise could be helping to move in this -direction and defining how LC could do so, for example, in areas of -standardization or distribution of responsibility. - -FLEISCHHAUER added that AM was fully engaged, wrestling with some of the -questions that pertain to the conversion of older historical materials, -which would be one thing that the Library of Congress might do. Several -points mentioned by BESSER and several others on this question have a -much greater impact on those who are concerned with cataloguing and the -networking of bibliographic information, as well as preservation itself. - -Speaking directly to AM, which he considered was a largely uncopyrighted -database, LYNCH urged development of a network version of AM, or -consideration of making the data in it available to people interested in -doing network multimedia. On account of the current great shortage of -digital data that is both appealing and unencumbered by complex rights -problems, this course of action could have a significant effect on making -network multimedia a reality. - -In this connection, FLEISCHHAUER reported on a fragmentary prototype in -LC's Office of Information Technology Services that attempts to associate -digital images of photographs with cataloguing information in ways that -work within a local area network--a step, so to say, toward AM's -construction of some sort of apparatus for access. Further, AM has -attempted to use standard data forms in order to help make that -distinction between the access tools and the underlying data, and thus -believes that the database is networkable. - -A delicate and agonizing policy question for LC, however, which comes -back to resources and unfortunately has an impact on this, is to find -some appropriate, honorable, and legal cost-recovery possibilities. A -certain skittishness concerning cost-recovery has made people unsure -exactly what to do. AM would be highly receptive to discussing further -LYNCH's offer to test or demonstrate its database in a network -environment, FLEISCHHAUER said. - -Returning the discussion to what she viewed as the vital issue of -electronic deposit, BATTIN recommended that LC initiate a catalytic -process in terms of distributed responsibility, that is, bring together -the distributed organizations and set up a study group to look at all -these issues and see where we as a nation should move. The broader -issues of how we deal with the management of electronic information will -not disappear, but only grow worse. - -LESK took up this theme and suggested that LC attempt to persuade one -major library in each state to deal with its state equivalent publisher, -which might produce a cooperative project that would be equitably -distributed around the country, and one in which LC would be dealing with -a minimal number of publishers and minimal copyright problems. - -GRABER remarked the recent development in the scientific community of a -willingness to use SGML and either deposit or interchange on a fairly -standardized format. He wondered if a similar movement was taking place -in the humanities. Although the National Library of Medicine found only -a few publishers to cooperate in a like venture two or three years ago, a -new effort might generate a much larger number willing to cooperate. - -KIMBALL recounted his unit's (Machine-Readable Collections Reading Room) -troubles with the commercial publishers of electronic media in acquiring -materials for LC's collections, in particular the publishers' fear that -they would not be able to cover their costs and would lose control of -their products, that LC would give them away or sell them and make -profits from them. He doubted that the publishing industry was prepared -to move into this area at the moment, given its resistance to allowing LC -to use its machine-readable materials as the Library would like. - -The copyright law now addresses compact disk as a medium, and LC can -request one copy of that, or two copies if it is the only version, and -can request copies of software, but that fails to address magazines or -books or anything like that which is in machine-readable form. - -GIFFORD acknowledged the thorny nature of this issue, which he illustrated -with the example of the cumbersome process involved in putting a copy of a -scientific database on a LAN in LC's science reading room. He also -acknowledged that LC needs help and could enlist the energies and talents -of Workshop participants in thinking through a number of these problems. - -GIFFORD returned the discussion to getting the image and text people to -think through together where they want to go in the long term. MYLONAS -conceded that her experience at the Pierce Symposium the previous week at -Georgetown University and this week at LC had forced her to reevaluate -her perspective on the usefulness of text as images. MYLONAS framed the -issues in a series of questions: How do we acquire machine-readable -text? Do we take pictures of it and perform OCR on it later? Is it -important to obtain very high-quality images and text, etc.? -FLEISCHHAUER agreed with MYLONAS's framing of strategic questions, adding -that a large institution such as LC probably has to do all of those -things at different times. Thus, the trick is to exercise judgment. The -Workshop had added to his and AM's considerations in making those -judgments. Concerning future meetings or discussions, MYLONAS suggested -that screening priorities would be helpful. - -WEIBEL opined that the diversity reflected in this group was a sign both -of the health and of the immaturity of the field, and more time would -have to pass before we convince one another concerning standards. - -An exchange between MYLONAS and BATTIN clarified the point that the -driving force behind both the Perseus and the Cornell Xerox projects was -the preservation of knowledge for the future, not simply for particular -research use. In the case of Perseus, MYLONAS said, the assumption was -that the texts would not be entered again into electronically readable -form. SPERBERG-McQUEEN added that a scanned image would not serve as an -archival copy for purposes of preservation in the case of, say, the Bill -of Rights, in the sense that the scanned images are effectively the -archival copies for the Cornell mathematics books. - - - *** *** *** ****** *** *** *** - - - Appendix I: PROGRAM - - - - WORKSHOP - ON - ELECTRONIC - TEXTS - - - - 9-10 June 1992 - - Library of Congress - Washington, D.C. - - - - Supported by a Grant from the David and Lucile Packard Foundation - - -Tuesday, 9 June 1992 - -NATIONAL DEMONSTRATION LAB, ATRIUM, LIBRARY MADISON - -8:30 AM Coffee and Danish, registration - -9:00 AM Welcome - - Prosser Gifford, Director for Scholarly Programs, and Carl - Fleischhauer, Coordinator, American Memory, Library of - Congress - -9:l5 AM Session I. Content in a New Form: Who Will Use It and What - Will They Do? - - Broad description of the range of electronic information. - Characterization of who uses it and how it is or may be used. - In addition to a look at scholarly uses, this session will - include a presentation on use by students (K-12 and college) - and the general public. - - Moderator: James Daly - Avra Michelson, Archival Research and Evaluation Staff, - National Archives and Records Administration (Overview) - Susan H. Veccia, Team Leader, American Memory, User Evaluation, - and - Joanne Freeman, Associate Coordinator, American Memory, Library - of Congress (Beyond the scholar) - -10:30- -11:00 AM Break - -11:00 AM Session II. Show and Tell. - - Each presentation to consist of a fifteen-minute - statement/show; group discussion will follow lunch. - - Moderator: Jacqueline Hess, Director, National Demonstration - Lab - - 1. A classics project, stressing texts and text retrieval - more than multimedia: Perseus Project, Harvard - University - Elli Mylonas, Managing Editor - - 2. Other humanities projects employing the emerging norms of - the Text Encoding Initiative (TEI): Chadwyck-Healey's - The English Poetry Full Text Database and/or Patrologia - Latina Database - Eric M. Calaluca, Vice President, Chadwyck-Healey, Inc. - - 3. American Memory - Carl Fleischhauer, Coordinator, and - Ricky Erway, Associate Coordinator, Library of Congress - - 4. Founding Fathers example from Packard Humanities - Institute: The Papers of George Washington, University - of Virginia - Dorothy Twohig, Managing Editor, and/or - David Woodley Packard - - 5. An electronic medical journal offering graphics and - full-text searchability: The Online Journal of Current - Clinical Trials, American Association for the Advancement - of Science - Maria L. Lebron, Managing Editor - - 6. A project that offers facsimile images of pages but omits - searchable text: Cornell math books - Lynne K. Personius, Assistant Director, Cornell - Information Technologies for Scholarly Information - Sources, Cornell University - -12:30 PM Lunch (Dining Room A, Library Madison 620. Exhibits - available.) - -1:30 PM Session II. Show and Tell (Cont'd.). - -3:00- -3:30 PM Break - -3:30- -5:30 PM Session III. Distribution, Networks, and Networking: Options - for Dissemination. - - Published disks: University presses and public-sector - publishers, private-sector publishers - Computer networks - - Moderator: Robert G. Zich, Special Assistant to the Associate - Librarian for Special Projects, Library of Congress - Clifford A. Lynch, Director, Library Automation, University of - California - Howard Besser, School of Library and Information Science, - University of Pittsburgh - Ronald L. Larsen, Associate Director of Libraries for - Information Technology, University of Maryland at College - Park - Edwin B. Brownrigg, Executive Director, Memex Research - Institute - -6:30 PM Reception (Montpelier Room, Library Madison 619.) - - ****** - -Wednesday, 10 June 1992 - -DINING ROOM A, LIBRARY MADISON 620 - -8:30 AM Coffee and Danish - -9:00 AM Session IV. Image Capture, Text Capture, Overview of Text and - Image Storage Formats. - - Moderator: William L. Hooton, Vice President of Operations, - I-NET - - A) Principal Methods for Image Capture of Text: - Direct scanning - Use of microform - - Anne R. Kenney, Assistant Director, Department of Preservation - and Conservation, Cornell University - Pamela Q.J. Andre, Associate Director, Automation, and - Judith A. Zidar, Coordinator, National Agricultural Text - Digitizing Program (NATDP), National Agricultural Library - (NAL) - Donald J. Waters, Head, Systems Office, Yale University Library - - B) Special Problems: - Bound volumes - Conservation - Reproducing printed halftones - - Carl Fleischhauer, Coordinator, American Memory, Library of - Congress - George Thoma, Chief, Communications Engineering Branch, - National Library of Medicine (NLM) - -10:30- -11:00 AM Break - -11:00 AM Session IV. Image Capture, Text Capture, Overview of Text and - Image Storage Formats (Cont'd.). - - C) Image Standards and Implications for Preservation - - Jean Baronas, Senior Manager, Department of Standards and - Technology, Association for Information and Image Management - (AIIM) - Patricia Battin, President, The Commission on Preservation and - Access (CPA) - - D) Text Conversion: - OCR vs. rekeying - Standards of accuracy and use of imperfect texts - Service bureaus - - Stuart Weibel, Senior Research Specialist, Online Computer - Library Center, Inc. (OCLC) - Michael Lesk, Executive Director, Computer Science Research, - Bellcore - Ricky Erway, Associate Coordinator, American Memory, Library of - Congress - Pamela Q.J. Andre, Associate Director, Automation, and - Judith A. Zidar, Coordinator, National Agricultural Text - Digitizing Program (NATDP), National Agricultural Library - (NAL) - -12:30- -1:30 PM Lunch - -1:30 PM Session V. Approaches to Preparing Electronic Texts. - - Discussion of approaches to structuring text for the computer; - pros and cons of text coding, description of methods in - practice, and comparison of text-coding methods. - - Moderator: Susan Hockey, Director, Center for Electronic Texts - in the Humanities (CETH), Rutgers and Princeton Universities - David Woodley Packard - C.M. Sperberg-McQueen, Editor, Text Encoding Initiative (TEI), - University of Illinois-Chicago - Eric M. Calaluca, Vice President, Chadwyck-Healey, Inc. - -3:30- -4:00 PM Break - -4:00 PM Session VI. Copyright Issues. - - Marybeth Peters, Policy Planning Adviser to the Register of - Copyrights, Library of Congress - -5:00 PM Session VII. Conclusion. - - General discussion. - What topics were omitted or given short shrift that anyone - would like to talk about now? - Is there a "group" here? What should the group do next, if - anything? What should the Library of Congress do next, if - anything? - Moderator: Prosser Gifford, Director for Scholarly Programs, - Library of Congress - -6:00 PM Adjourn - - - *** *** *** ****** *** *** *** - - - Appendix II: ABSTRACTS - - -SESSION I - -Avra MICHELSON Forecasting the Use of Electronic Texts by - Social Sciences and Humanities Scholars - -This presentation explores the ways in which electronic texts are likely -to be used by the non-scientific scholarly community. Many of the -remarks are drawn from a report the speaker coauthored with Jeff -Rothenberg, a computer scientist at The RAND Corporation. - -The speaker assesses 1) current scholarly use of information technology -and 2) the key trends in information technology most relevant to the -research process, in order to predict how social sciences and humanities -scholars are apt to use electronic texts. In introducing the topic, -current use of electronic texts is explored broadly within the context of -scholarly communication. From the perspective of scholarly -communication, the work of humanities and social sciences scholars -involves five processes: 1) identification of sources, 2) communication -with colleagues, 3) interpretation and analysis of data, 4) dissemination -of research findings, and 5) curriculum development and instruction. The -extent to which computation currently permeates aspects of scholarly -communication represents a viable indicator of the prospects for -electronic texts. - -The discussion of current practice is balanced by an analysis of key -trends in the scholarly use of information technology. These include the -trends toward end-user computing and connectivity, which provide a -framework for forecasting the use of electronic texts through this -millennium. The presentation concludes with a summary of the ways in -which the nonscientific scholarly community can be expected to use -electronic texts, and the implications of that use for information -providers. - -Susan VECCIA and Joanne FREEMAN Electronic Archives for the Public: - Use of American Memory in Public and - School Libraries - -This joint discussion focuses on nonscholarly applications of electronic -library materials, specifically addressing use of the Library of Congress -American Memory (AM) program in a small number of public and school -libraries throughout the United States. AM consists of selected Library -of Congress primary archival materials, stored on optical media -(CD-ROM/videodisc), and presented with little or no editing. Many -collections are accompanied by electronic introductions and user's guides -offering background information and historical context. Collections -represent a variety of formats including photographs, graphic arts, -motion pictures, recorded sound, music, broadsides and manuscripts, -books, and pamphlets. - -In 1991, the Library of Congress began a nationwide evaluation of AM in -different types of institutions. Test sites include public libraries, -elementary and secondary school libraries, college and university -libraries, state libraries, and special libraries. Susan VECCIA and -Joanne FREEMAN will discuss their observations on the use of AM by the -nonscholarly community, using evidence gleaned from this ongoing -evaluation effort. - -VECCIA will comment on the overall goals of the evaluation project, and -the types of public and school libraries included in this study. Her -comments on nonscholarly use of AM will focus on the public library as a -cultural and community institution, often bridging the gap between formal -and informal education. FREEMAN will discuss the use of AM in school -libraries. Use by students and teachers has revealed some broad -questions about the use of electronic resources, as well as definite -benefits gained by the "nonscholar." Topics will include the problem of -grasping content and context in an electronic environment, the stumbling -blocks created by "new" technologies, and the unique skills and interests -awakened through use of electronic resources. - -SESSION II - -Elli MYLONAS The Perseus Project: Interactive Sources and - Studies in Classical Greece - -The Perseus Project (5) has just released Perseus 1.0, the first publicly -available version of its hypertextual database of multimedia materials on -classical Greece. Perseus is designed to be used by a wide audience, -comprised of readers at the student and scholar levels. As such, it must -be able to locate information using different strategies, and it must -contain enough detail to serve the different needs of its users. In -addition, it must be delivered so that it is affordable to its target -audience. [These problems and the solutions we chose are described in -Mylonas, "An Interface to Classical Greek Civilization," JASIS 43:2, -March 1992.] - -In order to achieve its objective, the project staff decided to make a -conscious separation between selecting and converting textual, database, -and image data on the one hand, and putting it into a delivery system on -the other. That way, it is possible to create the electronic data -without thinking about the restrictions of the delivery system. We have -made a great effort to choose system-independent formats for our data, -and to put as much thought and work as possible into structuring it so -that the translation from paper to electronic form will enhance the value -of the data. [A discussion of these solutions as of two years ago is in -Elli Mylonas, Gregory Crane, Kenneth Morrell, and D. Neel Smith, "The -Perseus Project: Data in the Electronic Age," in Accessing Antiquity: -The Computerization of Classical Databases, J. Solomon and T. Worthen -(eds.), University of Arizona Press, in press.] - -Much of the work on Perseus is focused on collecting and converting the -data on which the project is based. At the same time, it is necessary to -provide means of access to the information, in order to make it usable, -and them to investigate how it is used. As we learn more about what -students and scholars from different backgrounds do with Perseus, we can -adjust our data collection, and also modify the system to accommodate -them. In creating a delivery system for general use, we have tried to -avoid favoring any one type of use by allowing multiple forms of access -to and navigation through the system. - -The way text is handled exemplifies some of these principles. All text -in Perseus is tagged using SGML, following the guidelines of the Text -Encoding Initiative (TEI). This markup is used to index the text, and -process it so that it can be imported into HyperCard. No SGML markup -remains in the text that reaches the user, because currently it would be -too expensive to create a system that acts on SGML in real time. -However, the regularity provided by SGML is essential for verifying the -content of the texts, and greatly speeds all the processing performed on -them. The fact that the texts exist in SGML ensures that they will be -relatively easy to port to different hardware and software, and so will -outlast the current delivery platform. Finally, the SGML markup -incorporates existing canonical reference systems (chapter, verse, line, -etc.); indexing and navigation are based on these features. This ensures -that the same canonical reference will always resolve to the same point -within a text, and that all versions of our texts, regardless of delivery -platform (even paper printouts) will function the same way. - -In order to provide tools for users, the text is processed by a -morphological analyzer, and the results are stored in a database. -Together with the index, the Greek-English Lexicon, and the index of all -the English words in the definitions of the lexicon, the morphological -analyses comprise a set of linguistic tools that allow users of all -levels to work with the textual information, and to accomplish different -tasks. For example, students who read no Greek may explore a concept as -it appears in Greek texts by using the English-Greek index, and then -looking up works in the texts and translations, or scholars may do -detailed morphological studies of word use by using the morphological -analyses of the texts. Because these tools were not designed for any one -use, the same tools and the same data can be used by both students and -scholars. - -NOTES: - (5) Perseus is based at Harvard University, with collaborators at - several other universities. The project has been funded primarily - by the Annenberg/CPB Project, as well as by Harvard University, - Apple Computer, and others. It is published by Yale University - Press. Perseus runs on Macintosh computers, under the HyperCard - program. - -Eric CALALUCA - -Chadwyck-Healey embarked last year on two distinct yet related full-text -humanities database projects. - -The English Poetry Full-Text Database and the Patrologia Latina Database -represent new approaches to linguistic research resources. The size and -complexity of the projects present problems for electronic publishers, -but surmountable ones if they remain abreast of the latest possibilities -in data capture and retrieval software techniques. - -The issues which required address prior to the commencement of the -projects were legion: - - 1. Editorial selection (or exclusion) of materials in each - database - - 2. Deciding whether or not to incorporate a normative encoding - structure into the databases? - A. If one is selected, should it be SGML? - B. If SGML, then the TEI? - - 3. Deliver as CD-ROM, magnetic tape, or both? - - 4. Can one produce retrieval software advanced enough for the - postdoctoral linguist, yet accessible enough for unattended - general use? Should one try? - - 5. Re fair and liberal networking policies, what are the risks to - an electronic publisher? - - 6. How does the emergence of national and international education - networks affect the use and viability of research projects - requiring high investment? Do the new European Community - directives concerning database protection necessitate two - distinct publishing projects, one for North America and one for - overseas? - -From new notions of "scholarly fair use" to the future of optical media, -virtually every issue related to electronic publishing was aired. The -result is two projects which have been constructed to provide the quality -research resources with the fewest encumbrances to use by teachers and -private scholars. - -Dorothy TWOHIG - -In spring 1988 the editors of the papers of George Washington, John -Adams, Thomas Jefferson, James Madison, and Benjamin Franklin were -approached by classics scholar David Packard on behalf of the Packard -Humanities Foundation with a proposal to produce a CD-ROM edition of the -complete papers of each of the Founding Fathers. This electronic edition -will supplement the published volumes, making the documents widely -available to students and researchers at reasonable cost. We estimate -that our CD-ROM edition of Washington's Papers will be substantially -completed within the next two years and ready for publication. Within -the next ten years or so, similar CD-ROM editions of the Franklin, Adams, -Jefferson, and Madison papers also will be available. At the Library of -Congress's session on technology, I would like to discuss not only the -experience of the Washington Papers in producing the CD-ROM edition, but -the impact technology has had on these major editorial projects. -Already, we are editing our volumes with an eye to the material that will -be readily available in the CD-ROM edition. The completed electronic -edition will provide immense possibilities for the searching of documents -for information in a way never possible before. The kind of technical -innovations that are currently available and on the drawing board will -soon revolutionize historical research and the production of historical -documents. Unfortunately, much of this new technology is not being used -in the planning stages of historical projects, simply because many -historians are aware only in the vaguest way of its existence. At least -two major new historical editing projects are considering microfilm -editions, simply because they are not aware of the possibilities of -electronic alternatives and the advantages of the new technology in terms -of flexibility and research potential compared to microfilm. In fact, -too many of us in history and literature are still at the stage of -struggling with our PCs. There are many historical editorial projects in -progress presently, and an equal number of literary projects. While the -two fields have somewhat different approaches to textual editing, there -are ways in which electronic technology can be of service to both. - -Since few of the editors involved in the Founding Fathers CD-ROM editions -are technical experts in any sense, I hope to point out in my discussion -of our experience how many of these electronic innovations can be used -successfully by scholars who are novices in the world of new technology. -One of the major concerns of the sponsors of the multitude of new -scholarly editions is the limited audience reached by the published -volumes. Most of these editions are being published in small quantities -and the publishers' price for them puts them out of the reach not only of -individual scholars but of most public libraries and all but the largest -educational institutions. However, little attention is being given to -ways in which technology can bypass conventional publication to make -historical and literary documents more widely available. - -What attracted us most to the CD-ROM edition of The Papers of George -Washington was the fact that David Packard's aim was to make a complete -edition of all of the 135,000 documents we have collected available in an -inexpensive format that would be placed in public libraries, small -colleges, and even high schools. This would provide an audience far -beyond our present 1,000-copy, $45 published edition. Since the CD-ROM -edition will carry none of the explanatory annotation that appears in the -published volumes, we also feel that the use of the CD-ROM will lead many -researchers to seek out the published volumes. - -In addition to ignorance of new technical advances, I have found that too -many editors--and historians and literary scholars--are resistant and -even hostile to suggestions that electronic technology may enhance their -work. I intend to discuss some of the arguments traditionalists are -advancing to resist technology, ranging from distrust of the speed with -which it changes (we are already wondering what is out there that is -better than CD-ROM) to suspicion of the technical language used to -describe electronic developments. - -Maria LEBRON - -The Online Journal of Current Clinical Trials, a joint venture of the -American Association for the Advancement of Science (AAAS) and the Online -Computer Library Center, Inc. (OCLC), is the first peer-reviewed journal -to provide full text, tabular material, and line illustrations on line. -This presentation will discuss the genesis and start-up period of the -journal. Topics of discussion will include historical overview, -day-to-day management of the editorial peer review, and manuscript -tagging and publication. A demonstration of the journal and its features -will accompany the presentation. - -Lynne PERSONIUS - -Cornell University Library, Cornell Information Technologies, and Xerox -Corporation, with the support of the Commission on Preservation and -Access, and Sun Microsystems, Inc., have been collaborating in a project -to test a prototype system for recording brittle books as digital images -and producing, on demand, high-quality archival paper replacements. The -project goes beyond that, however, to investigate some of the issues -surrounding scanning, storing, retrieving, and providing access to -digital images in a network environment. - -The Joint Study in Digital Preservation began in January 1990. Xerox -provided the College Library Access and Storage System (CLASS) software, -a prototype 600-dots-per-inch (dpi) scanner, and the hardware necessary -to support network printing on the DocuTech printer housed in Cornell's -Computing and Communications Center (CCC). - -The Cornell staff using the hardware and software became an integral part -of the development and testing process for enhancements to the CLASS -software system. The collaborative nature of this relationship is -resulting in a system that is specifically tailored to the preservation -application. - -A digital library of 1,000 volumes (or approximately 300,000 images) has -been created and is stored on an optical jukebox that resides in CCC. -The library includes a collection of select mathematics monographs that -provides mathematics faculty with an opportunity to use the electronic -library. The remaining volumes were chosen for the library to test the -various capabilities of the scanning system. - -One project objective is to provide users of the Cornell library and the -library staff with the ability to request facsimiles of digitized images -or to retrieve the actual electronic image for browsing. A prototype -viewing workstation has been created by Xerox, with input into the design -by a committee of Cornell librarians and computer professionals. This -will allow us to experiment with patron access to the images that make up -the digital library. The viewing station provides search, retrieval, and -(ultimately) printing functions with enhancements to facilitate -navigation through multiple documents. - -Cornell currently is working to extend access to the digital library to -readers using workstations from their offices. This year is devoted to -the development of a network resident image conversion and delivery -server, and client software that will support readers who use Apple -Macintosh computers, IBM windows platforms, and Sun workstations. -Equipment for this development was provided by Sun Microsystems with -support from the Commission on Preservation and Access. - -During the show-and-tell session of the Workshop on Electronic Texts, a -prototype view station will be demonstrated. In addition, a display of -original library books that have been digitized will be available for -review with associated printed copies for comparison. The fifteen-minute -overview of the project will include a slide presentation that -constitutes a "tour" of the preservation digitizing process. - -The final network-connected version of the viewing station will provide -library users with another mechanism for accessing the digital library, -and will also provide the capability of viewing images directly. This -will not require special software, although a powerful computer with good -graphics will be needed. - -The Joint Study in Digital Preservation has generated a great deal of -interest in the library community. Unfortunately, or perhaps -fortunately, this project serves to raise a vast number of other issues -surrounding the use of digital technology for the preservation and use of -deteriorating library materials, which subsequent projects will need to -examine. Much work remains. - -SESSION III - -Howard BESSER Networking Multimedia Databases - -What do we have to consider in building and distributing databases of -visual materials in a multi-user environment? This presentation examines -a variety of concerns that need to be addressed before a multimedia -database can be set up in a networked environment. - -In the past it has not been feasible to implement databases of visual -materials in shared-user environments because of technological barriers. -Each of the two basic models for multi-user multimedia databases has -posed its own problem. The analog multimedia storage model (represented -by Project Athena's parallel analog and digital networks) has required an -incredibly complex (and expensive) infrastructure. The economies of -scale that make multi-user setups cheaper per user served do not operate -in an environment that requires a computer workstation, videodisc player, -and two display devices for each user. - -The digital multimedia storage model has required vast amounts of storage -space (as much as one gigabyte per thirty still images). In the past the -cost of such a large amount of storage space made this model a -prohibitive choice as well. But plunging storage costs are finally -making this second alternative viable. - -If storage no longer poses such an impediment, what do we need to -consider in building digitally stored multi-user databases of visual -materials? This presentation will examine the networking and -telecommunication constraints that must be overcome before such databases -can become commonplace and useful to a large number of people. - -The key problem is the vast size of multimedia documents, and how this -affects not only storage but telecommunications transmission time. -Anything slower than T-1 speed is impractical for files of 1 megabyte or -larger (which is likely to be small for a multimedia document). For -instance, even on a 56 Kb line it would take three minutes to transfer a -1-megabyte file. And these figures assume ideal circumstances, and do -not take into consideration other users contending for network bandwidth, -disk access time, or the time needed for remote display. Current common -telephone transmission rates would be completely impractical; few users -would be willing to wait the hour necessary to transmit a single image at -2400 baud. - -This necessitates compression, which itself raises a number of other -issues. In order to decrease file sizes significantly, we must employ -lossy compression algorithms. But how much quality can we afford to -lose? To date there has been only one significant study done of -image-quality needs for a particular user group, and this study did not -look at loss resulting from compression. Only after identifying -image-quality needs can we begin to address storage and network bandwidth -needs. - -Experience with X-Windows-based applications (such as Imagequery, the -University of California at Berkeley image database) demonstrates the -utility of a client-server topology, but also points to the limitation of -current software for a distributed environment. For example, -applications like Imagequery can incorporate compression, but current X -implementations do not permit decompression at the end user's -workstation. Such decompression at the host computer alleviates storage -capacity problems while doing nothing to address problems of -telecommunications bandwidth. - -We need to examine the effects on network through-put of moving -multimedia documents around on a network. We need to examine various -topologies that will help us avoid bottlenecks around servers and -gateways. Experience with applications such as these raise still broader -questions. How closely is the multimedia document tied to the software -for viewing it? Can it be accessed and viewed from other applications? -Experience with the MARC format (and more recently with the Z39.50 -protocols) shows how useful it can be to store documents in a form in -which they can be accessed by a variety of application software. - -Finally, from an intellectual-access standpoint, we need to address the -issue of providing access to these multimedia documents in -interdisciplinary environments. We need to examine terminology and -indexing strategies that will allow us to provide access to this material -in a cross-disciplinary way. - -Ronald LARSEN Directions in High-Performance Networking for - Libraries - -The pace at which computing technology has advanced over the past forty -years shows no sign of abating. Roughly speaking, each five-year period -has yielded an order-of-magnitude improvement in price and performance of -computing equipment. No fundamental hurdles are likely to prevent this -pace from continuing for at least the next decade. It is only in the -past five years, though, that computing has become ubiquitous in -libraries, affecting all staff and patrons, directly or indirectly. - -During these same five years, communications rates on the Internet, the -principal academic computing network, have grown from 56 kbps to 1.5 -Mbps, and the NSFNet backbone is now running 45 Mbps. Over the next five -years, communication rates on the backbone are expected to exceed 1 Gbps. -Growth in both the population of network users and the volume of network -traffic has continued to grow geometrically, at rates approaching 15 -percent per month. This flood of capacity and use, likened by some to -"drinking from a firehose," creates immense opportunities and challenges -for libraries. Libraries must anticipate the future implications of this -technology, participate in its development, and deploy it to ensure -access to the world's information resources. - -The infrastructure for the information age is being put in place. -Libraries face strategic decisions about their role in the development, -deployment, and use of this infrastructure. The emerging infrastructure -is much more than computers and communication lines. It is more than the -ability to compute at a remote site, send electronic mail to a peer -across the country, or move a file from one library to another. The next -five years will witness substantial development of the information -infrastructure of the network. - -In order to provide appropriate leadership, library professionals must -have a fundamental understanding of and appreciation for computer -networking, from local area networks to the National Research and -Education Network (NREN). This presentation addresses these -fundamentals, and how they relate to libraries today and in the near -future. - -Edwin BROWNRIGG Electronic Library Visions and Realities - -The electronic library has been a vision desired by many--and rejected by -some--since Vannevar Bush coined the term memex to describe an automated, -intelligent, personal information system. Variations on this vision have -included Ted Nelson's Xanadau, Alan Kay's Dynabook, and Lancaster's -"paperless library," with the most recent incarnation being the -"Knowledge Navigator" described by John Scully of Apple. But the reality -of library service has been less visionary and the leap to the electronic -library has eluded universities, publishers, and information technology -files. - -The Memex Research Institute (MemRI), an independent, nonprofit research -and development organization, has created an Electronic Library Program -of shared research and development in order to make the collective vision -more concrete. The program is working toward the creation of large, -indexed publicly available electronic image collections of published -documents in academic, special, and public libraries. This strategic -plan is the result of the first stage of the program, which has been an -investigation of the information technologies available to support such -an effort, the economic parameters of electronic service compared to -traditional library operations, and the business and political factors -affecting the shift from print distribution to electronic networked -access. - -The strategic plan envisions a combination of publicly searchable access -databases, image (and text) document collections stored on network "file -servers," local and remote network access, and an intellectual property -management-control system. This combination of technology and -information content is defined in this plan as an E-library or E-library -collection. Some participating sponsors are already developing projects -based on MemRI's recommended directions. - -The E-library strategy projected in this plan is a visionary one that can -enable major changes and improvements in academic, public, and special -library service. This vision is, though, one that can be realized with -today's technology. At the same time, it will challenge the political -and social structure within which libraries operate: in academic -libraries, the traditional emphasis on local collections, extending to -accreditation issues; in public libraries, the potential of electronic -branch and central libraries fully available to the public; and for -special libraries, new opportunities for shared collections and networks. - -The environment in which this strategic plan has been developed is, at -the moment, dominated by a sense of library limits. The continued -expansion and rapid growth of local academic library collections is now -clearly at an end. Corporate libraries, and even law libraries, are -faced with operating within a difficult economic climate, as well as with -very active competition from commercial information sources. For -example, public libraries may be seen as a desirable but not critical -municipal service in a time when the budgets of safety and health -agencies are being cut back. - -Further, libraries in general have a very high labor-to-cost ratio in -their budgets, and labor costs are still increasing, notwithstanding -automation investments. It is difficult for libraries to obtain capital, -startup, or seed funding for innovative activities, and those -technology-intensive initiatives that offer the potential of decreased -labor costs can provoke the opposition of library staff. - -However, libraries have achieved some considerable successes in the past -two decades by improving both their service and their credibility within -their organizations--and these positive changes have been accomplished -mostly with judicious use of information technologies. The advances in -computing and information technology have been well-chronicled: the -continuing precipitous drop in computing costs, the growth of the -Internet and private networks, and the explosive increase in publicly -available information databases. - -For example, OCLC has become one of the largest computer network -organizations in the world by creating a cooperative cataloging network -of more than 6,000 libraries worldwide. On-line public access catalogs -now serve millions of users on more than 50,000 dedicated terminals in -the United States alone. The University of California MELVYL on-line -catalog system has now expanded into an index database reference service -and supports more than six million searches a year. And, libraries have -become the largest group of customers of CD-ROM publishing technology; -more than 30,000 optical media publications such as those offered by -InfoTrac and Silver Platter are subscribed to by U.S. libraries. - -This march of technology continues and in the next decade will result in -further innovations that are extremely difficult to predict. What is -clear is that libraries can now go beyond automation of their order files -and catalogs to automation of their collections themselves--and it is -possible to circumvent the fiscal limitations that appear to obtain -today. - -This Electronic Library Strategic Plan recommends a paradigm shift in -library service, and demonstrates the steps necessary to provide improved -library services with limited capacities and operating investments. - -SESSION IV-A - -Anne KENNEY - -The Cornell/Xerox Joint Study in Digital Preservation resulted in the -recording of 1,000 brittle books as 600-dpi digital images and the -production, on demand, of high-quality and archivally sound paper -replacements. The project, which was supported by the Commission on -Preservation and Access, also investigated some of the issues surrounding -scanning, storing, retrieving, and providing access to digital images in -a network environment. - -Anne Kenney will focus on some of the issues surrounding direct scanning -as identified in the Cornell Xerox Project. Among those to be discussed -are: image versus text capture; indexing and access; image-capture -capabilities; a comparison to photocopy and microfilm; production and -cost analysis; storage formats, protocols, and standards; and the use of -this scanning technology for preservation purposes. - -The 600-dpi digital images produced in the Cornell Xerox Project proved -highly acceptable for creating paper replacements of deteriorating -originals. The 1,000 scanned volumes provided an array of image-capture -challenges that are common to nineteenth-century printing techniques and -embrittled material, and that defy the use of text-conversion processes. -These challenges include diminished contrast between text and background, -fragile and deteriorated pages, uneven printing, elaborate type faces, -faint and bold text adjacency, handwritten text and annotations, nonRoman -languages, and a proliferation of illustrated material embedded in text. -The latter category included high-frequency and low-frequency halftones, -continuous tone photographs, intricate mathematical drawings, maps, -etchings, reverse-polarity drawings, and engravings. - -The Xerox prototype scanning system provided a number of important -features for capturing this diverse material. Technicians used multiple -threshold settings, filters, line art and halftone definitions, -autosegmentation, windowing, and software-editing programs to optimize -image capture. At the same time, this project focused on production. -The goal was to make scanning as affordable and acceptable as -photocopying and microfilming for preservation reformatting. A -time-and-cost study conducted during the last three months of this -project confirmed the economic viability of digital scanning, and these -findings will be discussed here. - -From the outset, the Cornell Xerox Project was predicated on the use of -nonproprietary standards and the use of common protocols when standards -did not exist. Digital files were created as TIFF images which were -compressed prior to storage using Group 4 CCITT compression. The Xerox -software is MS DOS based and utilizes off-the shelf programs such as -Microsoft Windows and Wang Image Wizard. The digital library is designed -to be hardware-independent and to provide interchangeability with other -institutions through network connections. Access to the digital files -themselves is two-tiered: Bibliographic records for the computer files -are created in RLIN and Cornell's local system and access into the actual -digital images comprising a book is provided through a document control -structure and a networked image file-server, both of which will be -described. - -The presentation will conclude with a discussion of some of the issues -surrounding the use of this technology as a preservation tool (storage, -refreshing, backup). - -Pamela ANDRE and Judith ZIDAR - -The National Agricultural Library (NAL) has had extensive experience with -raster scanning of printed materials. Since 1987, the Library has -participated in the National Agricultural Text Digitizing Project (NATDP) -a cooperative effort between NAL and forty-five land grant university -libraries. An overview of the project will be presented, giving its -history and NAL's strategy for the future. - -An in-depth discussion of NATDP will follow, including a description of -the scanning process, from the gathering of the printed materials to the -archiving of the electronic pages. The type of equipment required for a -stand-alone scanning workstation and the importance of file management -software will be discussed. Issues concerning the images themselves will -be addressed briefly, such as image format; black and white versus color; -gray scale versus dithering; and resolution. - -Also described will be a study currently in progress by NAL to evaluate -the usefulness of converting microfilm to electronic images in order to -improve access. With the cooperation of Tuskegee University, NAL has -selected three reels of microfilm from a collection of sixty-seven reels -containing the papers, letters, and drawings of George Washington Carver. -The three reels were converted into 3,500 electronic images using a -specialized microfilm scanner. The selection, filming, and indexing of -this material will be discussed. - -Donald WATERS - -Project Open Book, the Yale University Library's effort to convert 10, -000 books from microfilm to digital imagery, is currently in an advanced -state of planning and organization. The Yale Library has selected a -major vendor to serve as a partner in the project and as systems -integrator. In its proposal, the successful vendor helped isolate areas -of risk and uncertainty as well as key issues to be addressed during the -life of the project. The Yale Library is now poised to decide what -material it will convert to digital image form and to seek funding, -initially for the first phase and then for the entire project. - -The proposal that Yale accepted for the implementation of Project Open -Book will provide at the end of three phases a conversion subsystem, -browsing stations distributed on the campus network within the Yale -Library, a subsystem for storing 10,000 books at 200 and 600 dots per -inch, and network access to the image printers. Pricing for the system -implementation assumes the existence of Yale's campus ethernet network -and its high-speed image printers, and includes other requisite hardware -and software, as well as system integration services. Proposed operating -costs include hardware and software maintenance, but do not include -estimates for the facilities management of the storage devices and image -servers. - -Yale selected its vendor partner in a formal process, partly funded by -the Commission for Preservation and Access. Following a request for -proposal, the Yale Library selected two vendors as finalists to work with -Yale staff to generate a detailed analysis of requirements for Project -Open Book. Each vendor used the results of the requirements analysis to -generate and submit a formal proposal for the entire project. This -competitive process not only enabled the Yale Library to select its -primary vendor partner but also revealed much about the state of the -imaging industry, about the varying, corporate commitments to the markets -for imaging technology, and about the varying organizational dynamics -through which major companies are responding to and seeking to develop -these markets. - -Project Open Book is focused specifically on the conversion of images -from microfilm to digital form. The technology for scanning microfilm is -readily available but is changing rapidly. In its project requirements, -the Yale Library emphasized features of the technology that affect the -technical quality of digital image production and the costs of creating -and storing the image library: What levels of digital resolution can be -achieved by scanning microfilm? How does variation in the quality of -microfilm, particularly in film produced to preservation standards, -affect the quality of the digital images? What technologies can an -operator effectively and economically apply when scanning film to -separate two-up images and to control for and correct image -imperfections? How can quality control best be integrated into -digitizing work flow that includes document indexing and storage? - -The actual and expected uses of digital images--storage, browsing, -printing, and OCR--help determine the standards for measuring their -quality. Browsing is especially important, but the facilities available -for readers to browse image documents is perhaps the weakest aspect of -imaging technology and most in need of development. As it defined its -requirements, the Yale Library concentrated on some fundamental aspects -of usability for image documents: Does the system have sufficient -flexibility to handle the full range of document types, including -monographs, multi-part and multivolume sets, and serials, as well as -manuscript collections? What conventions are necessary to identify a -document uniquely for storage and retrieval? Where is the database of -record for storing bibliographic information about the image document? -How are basic internal structures of documents, such as pagination, made -accessible to the reader? How are the image documents physically -presented on the screen to the reader? - -The Yale Library designed Project Open Book on the assumption that -microfilm is more than adequate as a medium for preserving the content of -deteriorated library materials. As planning in the project has advanced, -it is increasingly clear that the challenge of digital image technology -and the key to the success of efforts like Project Open Book is to -provide a means of both preserving and improving access to those -deteriorated materials. - -SESSION IV-B - -George THOMA - -In the use of electronic imaging for document preservation, there are -several issues to consider, such as: ensuring adequate image quality, -maintaining substantial conversion rates (through-put), providing unique -identification for automated access and retrieval, and accommodating -bound volumes and fragile material. - -To maintain high image quality, image processing functions are required -to correct the deficiencies in the scanned image. Some commercially -available systems include these functions, while some do not. The -scanned raw image must be processed to correct contrast deficiencies-- -both poor overall contrast resulting from light print and/or dark -background, and variable contrast resulting from stains and -bleed-through. Furthermore, the scan density must be adequate to allow -legibility of print and sufficient fidelity in the pseudo-halftoned gray -material. Borders or page-edge effects must be removed for both -compactibility and aesthetics. Page skew must be corrected for aesthetic -reasons and to enable accurate character recognition if desired. -Compound images consisting of both two-toned text and gray-scale -illustrations must be processed appropriately to retain the quality of -each. - -SESSION IV-C - -Jean BARONAS - -Standards publications being developed by scientists, engineers, and -business managers in Association for Information and Image Management -(AIIM) standards committees can be applied to electronic image management -(EIM) processes including: document (image) transfer, retrieval and -evaluation; optical disk and document scanning; and document design and -conversion. When combined with EIM system planning and operations, -standards can assist in generating image databases that are -interchangeable among a variety of systems. The applications of -different approaches for image-tagging, indexing, compression, and -transfer often cause uncertainty concerning EIM system compatibility, -calibration, performance, and upward compatibility, until standard -implementation parameters are established. The AIIM standards that are -being developed for these applications can be used to decrease the -uncertainty, successfully integrate imaging processes, and promote "open -systems." AIIM is an accredited American National Standards Institute -(ANSI) standards developer with more than twenty committees comprised of -300 volunteers representing users, vendors, and manufacturers. The -standards publications that are developed in these committees have -national acceptance and provide the basis for international harmonization -in the development of new International Organization for Standardization -(ISO) standards. - -This presentation describes the development of AIIM's EIM standards and a -new effort at AIIM, a database on standards projects in a wide framework -of imaging industries including capture, recording, processing, -duplication, distribution, display, evaluation, and preservation. The -AIIM Imagery Database will cover imaging standards being developed by -many organizations in many different countries. It will contain -standards publications' dates, origins, related national and -international projects, status, key words, and abstracts. The ANSI Image -Technology Standards Board requested that such a database be established, -as did the ISO/International Electrotechnical Commission Joint Task Force -on Imagery. AIIM will take on the leadership role for the database and -coordinate its development with several standards developers. - -Patricia BATTIN - - Characteristics of standards for digital imagery: - - * Nature of digital technology implies continuing volatility. - - * Precipitous standard-setting not possible and probably not - desirable. - - * Standards are a complex issue involving the medium, the - hardware, the software, and the technical capacity for - reproductive fidelity and clarity. - - * The prognosis for reliable archival standards (as defined by - librarians) in the foreseeable future is poor. - - Significant potential and attractiveness of digital technology as a - preservation medium and access mechanism. - - Productive use of digital imagery for preservation requires a - reconceptualizing of preservation principles in a volatile, - standardless world. - - Concept of managing continuing access in the digital environment - rather than focusing on the permanence of the medium and long-term - archival standards developed for the analog world. - - Transition period: How long and what to do? - - * Redefine "archival." - - * Remove the burden of "archival copy" from paper artifacts. - - * Use digital technology for storage, develop management - strategies for refreshing medium, hardware and software. - - * Create acid-free paper copies for transition period backup - until we develop reliable procedures for ensuring continuing - access to digital files. - -SESSION IV-D - -Stuart WEIBEL The Role of SGML Markup in the CORE Project (6) - -The emergence of high-speed telecommunications networks as a basic -feature of the scholarly workplace is driving the demand for electronic -document delivery. Three distinct categories of electronic -publishing/republishing are necessary to support access demands in this -emerging environment: - - 1.) Conversion of paper or microfilm archives to electronic format - 2.) Conversion of electronic files to formats tailored to - electronic retrieval and display - 3.) Primary electronic publishing (materials for which the - electronic version is the primary format) - -OCLC has experimental or product development activities in each of these -areas. Among the challenges that lie ahead is the integration of these -three types of information stores in coherent distributed systems. - -The CORE (Chemistry Online Retrieval Experiment) Project is a model for -the conversion of large text and graphics collections for which -electronic typesetting files are available (category 2). The American -Chemical Society has made available computer typography files dating from -1980 for its twenty journals. This collection of some 250 journal-years -is being converted to an electronic format that will be accessible -through several end-user applications. - -The use of Standard Generalized Markup Language (SGML) offers the means -to capture the structural richness of the original articles in a way that -will support a variety of retrieval, navigation, and display options -necessary to navigate effectively in very large text databases. - -An SGML document consists of text that is marked up with descriptive tags -that specify the function of a given element within the document. As a -formal language construct, an SGML document can be parsed against a -document-type definition (DTD) that unambiguously defines what elements -are allowed and where in the document they can (or must) occur. This -formalized map of article structure allows the user interface design to -be uncoupled from the underlying database system, an important step -toward interoperability. Demonstration of this separability is a part of -the CORE project, wherein user interface designs born of very different -philosophies will access the same database. - -NOTES: - (6) The CORE project is a collaboration among Cornell University's - Mann Library, Bell Communications Research (Bellcore), the American - Chemical Society (ACS), the Chemical Abstracts Service (CAS), and - OCLC. - -Michael LESK The CORE Electronic Chemistry Library - -A major on-line file of chemical journal literature complete with -graphics is being developed to test the usability of fully electronic -access to documents, as a joint project of Cornell University, the -American Chemical Society, the Chemical Abstracts Service, OCLC, and -Bellcore (with additional support from Sun Microsystems, Springer-Verlag, -DigitaI Equipment Corporation, Sony Corporation of America, and Apple -Computers). Our file contains the American Chemical Society's on-line -journals, supplemented with the graphics from the paper publication. The -indexing of the articles from Chemical Abstracts Documents is available -in both image and text format, and several different interfaces can be -used. Our goals are (1) to assess the effectiveness and acceptability of -electronic access to primary journals as compared with paper, and (2) to -identify the most desirable functions of the user interface to an -electronic system of journals, including in particular a comparison of -page-image display with ASCII display interfaces. Early experiments with -chemistry students on a variety of tasks suggest that searching tasks are -completed much faster with any electronic system than with paper, but -that for reading all versions of the articles are roughly equivalent. - -Pamela ANDRE and Judith ZIDAR - -Text conversion is far more expensive and time-consuming than image -capture alone. NAL's experience with optical character recognition (OCR) -will be related and compared with the experience of having text rekeyed. -What factors affect OCR accuracy? How accurate does full text have to be -in order to be useful? How do different users react to imperfect text? -These are questions that will be explored. For many, a service bureau -may be a better solution than performing the work inhouse; this will also -be discussed. - -SESSION VI - -Marybeth PETERS - -Copyright law protects creative works. Protection granted by the law to -authors and disseminators of works includes the right to do or authorize -the following: reproduce the work, prepare derivative works, distribute -the work to the public, and publicly perform or display the work. In -addition, copyright owners of sound recordings and computer programs have -the right to control rental of their works. These rights are not -unlimited; there are a number of exceptions and limitations. - -An electronic environment places strains on the copyright system. -Copyright owners want to control uses of their work and be paid for any -use; the public wants quick and easy access at little or no cost. The -marketplace is working in this area. Contracts, guidelines on electronic -use, and collective licensing are in use and being refined. - -Issues concerning the ability to change works without detection are more -difficult to deal with. Questions concerning the integrity of the work -and the status of the changed version under the copyright law are to be -addressed. These are public policy issues which require informed -dialogue. - - - *** *** *** ****** *** *** *** - - - Appendix III: DIRECTORY OF PARTICIPANTS - - -PRESENTERS: - - Pamela Q.J. Andre - Associate Director, Automation - National Agricultural Library - 10301 Baltimore Boulevard - Beltsville, MD 20705-2351 - Phone: (301) 504-6813 - Fax: (301) 504-7473 - E-mail: INTERNET: PANDRE@ASRR.ARSUSDA.GOV - - Jean Baronas, Senior Manager - Department of Standards and Technology - Association for Information and Image Management (AIIM) - 1100 Wayne Avenue, Suite 1100 - Silver Spring, MD 20910 - Phone: (301) 587-8202 - Fax: (301) 587-2711 - - Patricia Battin, President - The Commission on Preservation and Access - 1400 16th Street, N.W. - Suite 740 - Washington, DC 20036-2217 - Phone: (202) 939-3400 - Fax: (202) 939-3407 - E-mail: CPA@GWUVM.BITNET - - Howard Besser - Centre Canadien d'Architecture - (Canadian Center for Architecture) - 1920, rue Baile - Montreal, Quebec H3H 2S6 - CANADA - Phone: (514) 939-7001 - Fax: (514) 939-7020 - E-mail: howard@lis.pitt.edu - - Edwin B. Brownrigg, Executive Director - Memex Research Institute - 422 Bonita Avenue - Roseville, CA 95678 - Phone: (916) 784-2298 - Fax: (916) 786-7559 - E-mail: BITNET: MEMEX@CALSTATE.2 - - Eric M. Calaluca, Vice President - Chadwyck-Healey, Inc. - 1101 King Street - Alexandria, VA 223l4 - Phone: (800) 752-05l5 - Fax: (703) 683-7589 - - James Daly - 4015 Deepwood Road - Baltimore, MD 21218-1404 - Phone: (410) 235-0763 - - Ricky Erway, Associate Coordinator - American Memory - Library of Congress - Phone: (202) 707-6233 - Fax: (202) 707-3764 - - Carl Fleischhauer, Coordinator - American Memory - Library of Congress - Phone: (202) 707-6233 - Fax: (202) 707-3764 - - Joanne Freeman - 2000 Jefferson Park Avenue, No. 7 - Charlottesville, VA 22903 - - Prosser Gifford - Director for Scholarly Programs - Library of Congress - Phone: (202) 707-1517 - Fax: (202) 707-9898 - E-mail: pgif@seq1.loc.gov - - Jacqueline Hess, Director - National Demonstration Laboratory - for Interactive Information Technologies - Library of Congress - Phone: (202) 707-4157 - Fax: (202) 707-2829 - - Susan Hockey, Director - Center for Electronic Texts in the Humanities (CETH) - Alexander Library - Rutgers University - 169 College Avenue - New Brunswick, NJ 08903 - Phone: (908) 932-1384 - Fax: (908) 932-1386 - E-mail: hockey@zodiac.rutgers.edu - - William L. Hooton, Vice President - Business & Technical Development - Imaging & Information Systems Group - I-NET - 6430 Rockledge Drive, Suite 400 - Bethesda, MD 208l7 - Phone: (301) 564-6750 - Fax: (513) 564-6867 - - Anne R. Kenney, Associate Director - Department of Preservation and Conservation - 701 Olin Library - Cornell University - Ithaca, NY 14853 - Phone: (607) 255-6875 - Fax: (607) 255-9346 - E-mail: LYDY@CORNELLA.BITNET - - Ronald L. Larsen - Associate Director for Information Technology - University of Maryland at College Park - Room B0224, McKeldin Library - College Park, MD 20742-7011 - Phone: (301) 405-9194 - Fax: (301) 314-9865 - E-mail: rlarsen@libr.umd.edu - - Maria L. Lebron, Managing Editor - The Online Journal of Current Clinical Trials - l333 H Street, N.W. - Washington, DC 20005 - Phone: (202) 326-6735 - Fax: (202) 842-2868 - E-mail: PUBSAAAS@GWUVM.BITNET - - Michael Lesk, Executive Director - Computer Science Research - Bell Communications Research, Inc. - Rm 2A-385 - 445 South Street - Morristown, NJ 07960-l9l0 - Phone: (201) 829-4070 - Fax: (201) 829-5981 - E-mail: lesk@bellcore.com (Internet) or bellcore!lesk (uucp) - - Clifford A. Lynch - Director, Library Automation - University of California, - Office of the President - 300 Lakeside Drive, 8th Floor - Oakland, CA 94612-3350 - Phone: (510) 987-0522 - Fax: (510) 839-3573 - E-mail: calur@uccmvsa - - Avra Michelson - National Archives and Records Administration - NSZ Rm. 14N - 7th & Pennsylvania, N.W. - Washington, D.C. 20408 - Phone: (202) 501-5544 - Fax: (202) 501-5533 - E-mail: tmi@cu.nih.gov - - Elli Mylonas, Managing Editor - Perseus Project - Department of the Classics - Harvard University - 319 Boylston Hall - Cambridge, MA 02138 - Phone: (617) 495-9025, (617) 495-0456 (direct) - Fax: (617) 496-8886 - E-mail: Elli@IKAROS.Harvard.EDU or elli@wjh12.harvard.edu - - David Woodley Packard - Packard Humanities Institute - 300 Second Street, Suite 201 - Los Altos, CA 94002 - Phone: (415) 948-0150 (PHI) - Fax: (415) 948-5793 - - Lynne K. Personius, Assistant Director - Cornell Information Technologies for - Scholarly Information Sources - 502 Olin Library - Cornell University - Ithaca, NY 14853 - Phone: (607) 255-3393 - Fax: (607) 255-9346 - E-mail: JRN@CORNELLC.BITNET - - Marybeth Peters - Policy Planning Adviser to the - Register of Copyrights - Library of Congress - Office LM 403 - Phone: (202) 707-8350 - Fax: (202) 707-8366 - - C. Michael Sperberg-McQueen - Editor, Text Encoding Initiative - Computer Center (M/C 135) - University of Illinois at Chicago - Box 6998 - Chicago, IL 60680 - Phone: (312) 413-0317 - Fax: (312) 996-6834 - E-mail: u35395@uicvm..cc.uic.edu or u35395@uicvm.bitnet - - George R. Thoma, Chief - Communications Engineering Branch - National Library of Medicine - 8600 Rockville Pike - Bethesda, MD 20894 - Phone: (301) 496-4496 - Fax: (301) 402-0341 - E-mail: thoma@lhc.nlm.nih.gov - - Dorothy Twohig, Editor - The Papers of George Washington - 504 Alderman Library - University of Virginia - Charlottesville, VA 22903-2498 - Phone: (804) 924-0523 - Fax: (804) 924-4337 - - Susan H. Veccia, Team leader - American Memory, User Evaluation - Library of Congress - American Memory Evaluation Project - Phone: (202) 707-9104 - Fax: (202) 707-3764 - E-mail: svec@seq1.loc.gov - - Donald J. Waters, Head - Systems Office - Yale University Library - New Haven, CT 06520 - Phone: (203) 432-4889 - Fax: (203) 432-7231 - E-mail: DWATERS@YALEVM.BITNET or DWATERS@YALEVM.YCC.YALE.EDU - - Stuart Weibel, Senior Research Scientist - OCLC - 6565 Frantz Road - Dublin, OH 43017 - Phone: (614) 764-608l - Fax: (614) 764-2344 - E-mail: INTERNET: Stu@rsch.oclc.org - - Robert G. Zich - Special Assistant to the Associate Librarian - for Special Projects - Library of Congress - Phone: (202) 707-6233 - Fax: (202) 707-3764 - E-mail: rzic@seq1.loc.gov - - Judith A. Zidar, Coordinator - National Agricultural Text Digitizing Program - Information Systems Division - National Agricultural Library - 10301 Baltimore Boulevard - Beltsville, MD 20705-2351 - Phone: (301) 504-6813 or 504-5853 - Fax: (301) 504-7473 - E-mail: INTERNET: JZIDAR@ASRR.ARSUSDA.GOV - - -OBSERVERS: - - Helen Aguera, Program Officer - Division of Research - Room 318 - National Endowment for the Humanities - 1100 Pennsylvania Avenue, N.W. - Washington, D.C. 20506 - Phone: (202) 786-0358 - Fax: (202) 786-0243 - - M. Ellyn Blanton, Deputy Director - National Demonstration Laboratory - for Interactive Information Technologies - Library of Congress - Phone: (202) 707-4157 - Fax: (202) 707-2829 - - Charles M. Dollar - National Archives and Records Administration - NSZ Rm. 14N - 7th & Pennsylvania, N.W. - Washington, DC 20408 - Phone: (202) 501-5532 - Fax: (202) 501-5512 - - Jeffrey Field, Deputy to the Director - Division of Preservation and Access - Room 802 - National Endowment for the Humanities - 1100 Pennsylvania Avenue, N.W. - Washington, DC 20506 - Phone: (202) 786-0570 - Fax: (202) 786-0243 - - Lorrin Garson - American Chemical Society - Research and Development Department - 1155 16th Street, N.W. - Washington, D.C. 20036 - Phone: (202) 872-4541 - Fax: E-mail: INTERNET: LRG96@ACS.ORG - - William M. Holmes, Jr. - National Archives and Records Administration - NSZ Rm. 14N - 7th & Pennsylvania, N.W. - Washington, DC 20408 - Phone: (202) 501-5540 - Fax: (202) 501-5512 - E-mail: WHOLMES@AMERICAN.EDU - - Sperling Martin - Information Resource Management - 20030 Doolittle Street - Gaithersburg, MD 20879 - Phone: (301) 924-1803 - - Michael Neuman, Director - The Center for Text and Technology - Academic Computing Center - 238 Reiss Science Building - Georgetown University - Washington, DC 20057 - Phone: (202) 687-6096 - Fax: (202) 687-6003 - E-mail: neuman@guvax.bitnet, neuman@guvax.georgetown.edu - - Barbara Paulson, Program Officer - Division of Preservation and Access - Room 802 - National Endowment for the Humanities - 1100 Pennsylvania Avenue, N.W. - Washington, DC 20506 - Phone: (202) 786-0577 - Fax: (202) 786-0243 - - Allen H. Renear - Senior Academic Planning Analyst - Brown University Computing and Information Services - 115 Waterman Street - Campus Box 1885 - Providence, R.I. 02912 - Phone: (401) 863-7312 - Fax: (401) 863-7329 - E-mail: BITNET: Allen@BROWNVM or - INTERNET: Allen@brownvm.brown.edu - - Susan M. Severtson, President - Chadwyck-Healey, Inc. - 1101 King Street - Alexandria, VA 223l4 - Phone: (800) 752-05l5 - Fax: (703) 683-7589 - - Frank Withrow - U.S. Department of Education - 555 New Jersey Avenue, N.W. - Washington, DC 20208-5644 - Phone: (202) 219-2200 - Fax: (202) 219-2106 - - -(LC STAFF) - - Linda L. Arret - Machine-Readable Collections Reading Room LJ 132 - (202) 707-1490 - - John D. Byrum, Jr. - Descriptive Cataloging Division LM 540 - (202) 707-5194 - - Mary Jane Cavallo - Science and Technology Division LA 5210 - (202) 707-1219 - - Susan Thea David - Congressional Research Service LM 226 - (202) 707-7169 - - Robert Dierker - Senior Adviser for Multimedia Activities LM 608 - (202) 707-6151 - - William W. Ellis - Associate Librarian for Science and Technology LM 611 - (202) 707-6928 - - Ronald Gephart - Manuscript Division LM 102 - (202) 707-5097 - - James Graber - Information Technology Services LM G51 - (202) 707-9628 - - Rich Greenfield - American Memory LM 603 - (202) 707-6233 - - Rebecca Guenther - Network Development LM 639 - (202) 707-5092 - - Kenneth E. Harris - Preservation LM G21 - (202) 707-5213 - - Staley Hitchcock - Manuscript Division LM 102 - (202) 707-5383 - - Bohdan Kantor - Office of Special Projects LM 612 - (202) 707-0180 - - John W. Kimball, Jr - Machine-Readable Collections Reading Room LJ 132 - (202) 707-6560 - - Basil Manns - Information Technology Services LM G51 - (202) 707-8345 - - Sally Hart McCallum - Network Development LM 639 - (202) 707-6237 - - Dana J. Pratt - Publishing Office LM 602 - (202) 707-6027 - - Jane Riefenhauser - American Memory LM 603 - (202) 707-6233 - - William Z. Schenck - Collections Development LM 650 - (202) 707-7706 - - Chandru J. Shahani - Preservation Research and Testing Office (R&T) LM G38 - (202) 707-5607 - - William J. Sittig - Collections Development LM 650 - (202) 707-7050 - - Paul Smith - Manuscript Division LM 102 - (202) 707-5097 - - James L. Stevens - Information Technology Services LM G51 - (202) 707-9688 - - Karen Stuart - Manuscript Division LM 130 - (202) 707-5389 - - Tamara Swora - Preservation Microfilming Office LM G05 - (202) 707-6293 - - Sarah Thomas - Collections Cataloging LM 642 - (202) 707-5333 - - - END - ************************************************************* - -Note: This file has been edited for use on computer networks. This -editing required the removal of diacritics, underlining, and fonts such -as italics and bold. - -kde 11/92 - -[A few of the italics (when used for emphasis) were replaced by CAPS mh] - -*End of The Project Gutenberg Etext of LOC WORKSHOP ON ELECTRONIC ETEXTS - diff --git a/vendor/snap/data/paper-100k.pdf b/vendor/snap/data/paper-100k.pdf deleted file mode 100644 index b3325e4a2b..0000000000 --- a/vendor/snap/data/paper-100k.pdf +++ /dev/null @@ -1,598 +0,0 @@ - - - C=10 M=100 Y=50 K=0 - CMYK - PROCESS - 10.000002 - 100.000000 - 50.000000 - 0.000000 - - - C=0 M=95 Y=20 K=0 - CMYK - PROCESS - 0.000000 - 94.999999 - 19.999999 - 0.000000 - - - C=25 M=25 Y=40 K=0 - CMYK - PROCESS - 25.000000 - 25.000000 - 39.999998 - 0.000000 - - - C=40 M=45 Y=50 K=5 - CMYK - PROCESS - 39.999998 - 44.999999 - 50.000000 - 5.000001 - - - C=50 M=50 Y=60 K=25 - CMYK - PROCESS - 50.000000 - 50.000000 - 60.000002 - 25.000000 - - - C=55 M=60 Y=65 K=40 - CMYK - PROCESS - 55.000001 - 60.000002 - 64.999998 - 39.999998 - - - C=25 M=40 Y=65 K=0 - CMYK - PROCESS - 25.000000 - 39.999998 - 64.999998 - 0.000000 - - - C=30 M=50 Y=75 K=10 - CMYK - PROCESS - 30.000001 - 50.000000 - 75.000000 - 10.000002 - - - C=35 M=60 Y=80 K=25 - CMYK - PROCESS - 35.000002 - 60.000002 - 80.000001 - 25.000000 - - - C=40 M=65 Y=90 K=35 - CMYK - PROCESS - 39.999998 - 64.999998 - 90.000004 - 35.000002 - - - C=40 M=70 Y=100 K=50 - CMYK - PROCESS - 39.999998 - 69.999999 - 100.000000 - 50.000000 - - - C=50 M=70 Y=80 K=70 - CMYK - PROCESS - 50.000000 - 69.999999 - 80.000001 - 69.999999 - - - - - - Grays - 1 - - - - C=0 M=0 Y=0 K=100 - CMYK - PROCESS - 0.000000 - 0.000000 - 0.000000 - 100.000000 - - - C=0 M=0 Y=0 K=90 - CMYK - PROCESS - 0.000000 - 0.000000 - 0.000000 - 89.999402 - - - C=0 M=0 Y=0 K=80 - CMYK - PROCESS - 0.000000 - 0.000000 - 0.000000 - 79.998797 - - - C=0 M=0 Y=0 K=70 - CMYK - PROCESS - 0.000000 - 0.000000 - 0.000000 - 69.999701 - - - C=0 M=0 Y=0 K=60 - CMYK - PROCESS - 0.000000 - 0.000000 - 0.000000 - 59.999102 - - - C=0 M=0 Y=0 K=50 - CMYK - PROCESS - 0.000000 - 0.000000 - 0.000000 - 50.000000 - - - C=0 M=0 Y=0 K=40 - CMYK - PROCESS - 0.000000 - 0.000000 - 0.000000 - 39.999402 - - - C=0 M=0 Y=0 K=30 - CMYK - PROCESS - 0.000000 - 0.000000 - 0.000000 - 29.998803 - - - C=0 M=0 Y=0 K=20 - CMYK - PROCESS - 0.000000 - 0.000000 - 0.000000 - 19.999701 - - - C=0 M=0 Y=0 K=10 - CMYK - PROCESS - 0.000000 - 0.000000 - 0.000000 - 9.999102 - - - C=0 M=0 Y=0 K=5 - CMYK - PROCESS - 0.000000 - 0.000000 - 0.000000 - 4.998803 - - - - - - Brights - 1 - - - - C=0 M=100 Y=100 K=0 - CMYK - PROCESS - 0.000000 - 100.000000 - 100.000000 - 0.000000 - - - C=0 M=75 Y=100 K=0 - CMYK - PROCESS - 0.000000 - 75.000000 - 100.000000 - 0.000000 - - - C=0 M=10 Y=95 K=0 - CMYK - PROCESS - 0.000000 - 10.000002 - 94.999999 - 0.000000 - - - C=85 M=10 Y=100 K=0 - CMYK - PROCESS - 84.999996 - 10.000002 - 100.000000 - 0.000000 - - - C=100 M=90 Y=0 K=0 - CMYK - PROCESS - 100.000000 - 90.000004 - 0.000000 - 0.000000 - - - C=60 M=90 Y=0 K=0 - CMYK - PROCESS - 60.000002 - 90.000004 - 0.003099 - 0.003099 - - - - - - - - - Adobe PDF library 9.00 - - - - - - - - - - - - - - - - - - - - - - - - - -endstream endobj 145 0 obj<> endobj 1 0 obj<> endobj 2 0 obj<>/Font<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 3 0 obj<>stream -hޔ[MsÜF’½ëWðnmU(s™e{¥ÝñØkjw²`7ÈƨhhҜÝ_±‡ù½›ïe€&›rl(BÑÄG¡ª2óåˏúæ_o’‹ûáÍ·ß|óƒ»H.>Þ½)V¥sæ"–þ§ËWq’\X¯âØ¥÷obÞïïåÇÇ5þ{|ó)ú¥^×íxyºl•D]ÿE~gÅ*vMû¥Þè_YôþÇAÚ¨jqÕÙèÝ·?ób¾*¢]ýPïøW¹rÑØñ‰UÝ×mž©?ôõ04]‹»±\¹}ºüüñßÞ\¯Ê²¼¸NVIîd=ßɼöuÕÊp6wòñîN~¹re¢ßŽU;6c565î–2éc³®v¸„uì» gƒ¿ŠèSšü3Í>_áïD04í½¬îçQwñ#*Îåã¿Èׇ}µ“ÁL%´ÇýmÝË_9f€¹˜ÜÊ0Ü“²^YצYÓN¾9nëpsìe)ë¾9Œ²òŠÃ&ò„|÷€O›"–Ý~lÆíüýms¿•=2yT­×ǾZ?­ø'Ñ=ÊV÷Wø;“ù¨`L)·T0¦XåA4&ÅåÝq'×»êIGJd½×©Å·ÍC7bb©1QßíêðtÓrJ1EãÊ\ES·Ã±çR!â"º«dîwǝ -?‰ÖÝþ°«G³ÞqÏ p§Û¢õÝ_ß⧑«}}؉øü+.ÅDûöAèþ¹˜É¤$&þ¼ -*÷vÐoˆ¼:UçTæ¿išÍ‘ksØô÷?ây'ÒÛVƒ^4Ñm]Oß½ëŽA½©Ä$x‹I;#ŠúŠ¹4Õ.|ö®ëý®oîýŽQˆwÇv­KÊ,ăñ2kd‡6ÕX‹³,–‰4#.C͛¿ ²]ó¥Þ=é‹F6­õw¡â–QD1ü{~Û´Õ(µ}ÒËE´œK_ßw•*hZ@CtûEAËgÛ/Ê)rjöòìJÿ´Ñ‡vS×è\a¼ #ŸxhêGý­Fšæؓõ¶ïöøØü}l¶cYŒh)ùª¨â(»·ÇTþæNšÒÉþ¨ñÈSb”²áû[,ʔ¥W%üÊ£MswW÷/S2²¨ÌXËGåO¨¥ªáï5Œ´Ìåþr>ë®ýû,ž„Ø ¼Îb`'%ÉóÍÅE,Bþ>ö|$•G0§,1%ñž@ÜèÏT/¿2Ž;ë‡,žBQC)e¸‡™]…MÎR™Ø¶±~˜Rmê[Qž¾ -P c§ ƒ] î©QÉkO‡NFšáJ_¶Øù•É‡·Íz{θ‡C½nîš5”ÚÉ<Âòe’ƒÚH²˜¥‚Q`Su/JCSI£cÛüvôf“F·M·ëî¡asÖ£ßpΪ?™äŸÆ²óy»·Ý€˜'°#‘ó¡°ø;¥nåi*s¨ð#–}ðêÞõO¸‚ß×ëmÕ6າˆY‚Â^õzÉ .R`cß­aôXg|_Ž½~¬á"ÒÜhjñ@÷þͼ ú,Îø=qr‚Ðf²Î®½Â¥Œš40ÆP“Ûu}€ž`‘Ë@4Ë ë;ÂzRìϗ¶{í»¯u,"ÞM¡ØOµ&Sԛ&´©÷"a™*W`èÕ"IˆF$—,Ñb¥OÚè¦És=<¦Ò#jáâå¬ú{ˆ~ñ›rå-"ß"· .êYF}V$¹[ù'=ùžªJ’}ÛJéZÄgŽÂ6`v©õÆ&v—‹¬Àeøœ¬z|$Üã¥lUr«»«iڃþ]ªÀ³øŽ=Xê3M7ª˜‰-ÉuÕ®• ÛîQ/ç1y°Ü8âöî8ˆÑ@š®ôv…—’å´pËÎÓ:c²‘Ș‰…€ei$ˆŸeTW=]C -Çè]•¼E³Á;ÍÈ»p×~Í -åU{¯»Q*0÷5á.õxr"ÎCŽ¾ë»¡;l›]uùñï³$ÍJĘ‘C…8Þ÷22´?¡Õá×@Hr… ü4AïØÉð$[ˆ­Z«ë3‰£X+!M²·Í?86À[T°¢>yúٜh׏ÝÒ°q ¢Pç$áð -ŒY¸p%«öb¥#XŠ5¡|–b¥^Q*B;óN™ºËJ:”à§3RÕÿüã…ò»¬Èå*ðě9"‰a½­÷x¼pNA -è -S²b' –Uäp‹~t܅å6ûC׏äs$Œt€Wh¿eÞ¢»+hªq², GFÙIHÆø[W5‡SØa<DèŽìßXÝî¦ÝSq-¾Í˜Ô1æ¨+£"G[»†‘!&f,Ý­pág‘ âä|ùž‰ùç­v0EÂQ͝`ҎIYZå)Ž+S ÄÔåðˆwMïï¹@Å]ÁàÚçG\¡Ñµc¬v[ŸøCÝ?0˜!ÿ¨Öâÿ8äÖC1Rµ<*—ªåùŸ`yqY¦ˆ!K5¦_¨Ñq7ß|èM ¾õQS›:¦Y0âªްYuÈIaf>]"B”ç] <-W½{0psõïÛ涹¼f^HãGØè¾Ñ¸ÍÆÁ†dV`)0¥ÉÐÒØYohjVÆBÕ訅ôù¤aRpvã)øP¬¾ßO¢ûÓí%‰Ãâ̹ Wˆ-%Œ~©×— >ì-œ@¨Üe‚\›:¹‘Ô¬¸ ‡+pÌXÈËðI”ûRt/€·¸'* ӝO€.©áXIMh=N`B—šû©epxcš_ ±¾~¿»dâ¦~–§žÐR„‡'%¤ÚWº( &­£o×·+,NyL'³$RxÜa9™KBˆYXW2¿ÆòÓ¨ò³/0Ã,sJý1yX>(f$ÆWò(»J -쇋®ŒÃD~äŸ1R­ÎáîûîQg#¨p©øpœ2 :}R·ŠHX0 ‹â= ³#Î1pëë:º­]³cö®ÕQ3&ŸsdÊëÙÖ̤j¸¾×íoF?¦ÛË8âV&Ñþ–Ó’™âñSnޝ#ÅÂ:tÂb0£2.£»±¡×žz••D-º‹;„¸+,ø=߃`®p©ð!jΰL “D]asÉ ›ÀäáF½cÊÌT óÊ\0ø¦>I/LPaªf¡¿ rF“´ HKìؙe(ÕÎçO/ìe£ì;ex~ÎZôYï þPŽÉò3c³»d|¾¸Võ4ádOЇÒ)óñZ~Fë$¸Ö•K$tI¦‰@[µAuÆ0\¼d‚ ™FdõÕZ¸sËj†?K~ºoXŽå&=xÕï ìØ6U8¬~.PTZ;@°WaNCnuÿ›ðùè¡ùPä(Ψ-ñ&âfM’¿Ȳñ!<™ó±×4¬lÿ×ÈÄømC ãåÑ5cÂ^A®Ö—Y‹1xU_§–2Ðg¦t´i¦´Mc¡¾%='0Ä>ÿâ·¢ÖړuWHh*ZC‘w3ÿ¨‚ÌH£¶ÛVwAûðкÛa Hœ¯‰Êð“*^¶I˜Ø½SÄ®¡lÖ«p*>Q„!:MÖ¥¥€Ml±µ’™¡Õ²"rÙ9ù1LAéëDà‹m]X؆¡IÓ)ÑW”'Szó»¾S4CBå…lĉ‡™&6¼q“j¦È‚Ÿ©:î ·ŠS³”H+z·ý ãG?_KtɌb~£Ùî> 4=t£Uÿ¦® *¡8g2a¨¼Šj£DÖÒ&§üý_ß©Büô¬å{õ -™ Åg­B$E»Ä³Mõt|G -þǨ>#!›8ÂJM:>ž„3ðw•Îy².ê#®­Á’˜3—Ÿ:0QãIó.Žµ8k±"t›NÈZ}õGÍøØ%@i"çÜ·µL¥ž€·5)³½w?/Æ>Ñ+ú$´.&Ž¡NØô3ꔈ{[ª“-R 韹¡n>Êuš e›ã‰P 4~ð€z¥£åZÝË](œiæîð~ð|¢Máë 6A8°*¡Ÿî‰®;Ù:±üMãõê‡ùh‚!÷¥GÍ°þÁÖ#;ÌB­Î¡±jPëDía•¦h±¶S~‚¯È—wjyÇ¡Q£|¨ÃãáE‰½êQ÷©ú'ࢳ»ªX -Î|J1c@«Ø"ëA¾'cÝeI3Ȋ°Z²G£#s>]žME÷Ìnó,ÓÑR\ÉFuNT':òƒnÉöjœD“JÁXI…¹gc÷ëq«¸Ðm¼†7óÌ°¬Ž‚5“zڎDyò®Öý¬ú¶F ÇAN;·etS?L°£óم1g«B†üÔþBÐ@¨Ï3V̶žºžuÙD»|±“Ão‚nh®ÓAìJF*§ƒgyÆhL¤“V¨²â±VÎBb¬eh£¿¯‚Ìה†|é0*n7AHRiDª£ÆH‹‚§Ä*ÎH,puÉ¢—)?Ëe —÷°;šÐÉÍ55§îåÎܬÓ_눉8Û3¯¼SíYéMو tþ¾mî4„BXIâގA…õ•<.}ûú"!‡.ðüõÌd>?3Aq«Ýæ̋xîHÁ㗊žt} lh*Qô„®ðLPô3ÉC{ËA+Í¥Þ[Ù²Ìü½“Äþêz'ñw’—/ýéÙKiž„·ŠsoÉEúú›×óý$ö¤¡(ž -{giÉÿ´â0sä -úäIÌÑŸŽ›¬â8õ48²'eö—ŪLL"ã\FxË _¬BOù!¬óÑ'o¯=µ`$žjð† Ï̵õ4ËÝ©Â#,$Y¡·†×»ÛØãÛµì½ÈR²…Gíª,|{`²Œ§öWlЌš•/†¬Âpïí¿«a՚É%ã/·÷Š—è[Ó$¦G’¢RŸ"/ŸAØiôŒ£;F«ÓË6䔒+um`P­þ,ÎåÑk닀À••¿¥‘ŠŒ^T½tÄÇfTˆ‚'Íã)É{.\¯Ur!|©ÖOÚÄ -ÛùÙS¹ªÔËvíÿ* - ¡ó«…Ő!Xwµrñ»»Fá,ÄûäýXѕvvºhë™0z +õ'wJ)s² üüî]hµízoá‰/1#œ—AËû-—ø+Æ/ÇÎ6ñ=ân–ò„f©Ý˜`7‰µötÄò刏/­-óÉî(þÀ†¨¿ežÍ>Ίe£h"ÙAOàä'Þê¡ñ¶yôám(‡K@ ®6®~J2U#œ -Òã<‹â†²ÖãrñJqÃä¢óé[ä $ÊÓê‚o0-ó¸xf>f¥A´Q'n¼C*Ë9»Ṳ́ÇOÚ–œè VJ|×vœœØ‚ðª?2*“×( XŠ¦dø\îÓ0)IPÐù«sföèOˆœ§ñ.Í7Î'‡£N£ -„àÅâ8ÉltG֚Èü®,̜¡Œ¬Kñ‰dîÆG´ÆdOšH^e1g³µ›pÆ5ö%Ƌ$æ$¯Aé¤/9hoZK¿Ä`_Z%SæBõPVçß[þZ¦ì´P7‘ô/¬¥±ŽwV•S6p½O®´‡Quîl6à ה ˜­F±akï׊¬–'d§yvÕèyi¸ù*m4,ŝ>éÑ ÜG]ž“Õ 9D7ÿ"˜¶*™éœ¨ºWíAØh8ªD\©›1¥qšuÄ51Ëc¯ƒ÷u«YÔéñyÜתkÒæ̌Ïݱ+ezuœˆÝ¡80T,•ŠÉÀôäÜJµ®™*y‚+š¢Â”L^5•³F斵¿îzãV1àܛgª¼ì¡eþu×­µL[yzÝü#䷐¦cƒñŒA¬m“´×GôüDÛþL-d>ô©šâ{[sGžíɕ,£ê5yþ¥i5,çiKàèäÖç ôv7eÈä™W -ïĺ‰ái´”[v¡Ÿªx~ÊÖe@UpžéRDOÿï¢ÂUhâåV•F;€uCǾ4Ö&Èä!ˆÖ¼æ3Ð,§3xeÁ(ÏCHϵÍìŬ,Ì{Ë¢j ¯ðAsùJè6ǯBäõ OÆÌÏ€+œ}ø ɯp9)êÈeš;Á)¨g…ùäe»ÓrŸb­Z«Ã‘7N}Ç£4)[V~¥ñ暋ãóVû@õ‡›¿©P?œe·ýÏ_~‡ -—%Šø_ßþ ëæ¼-wQ[ž ól‡¯²EÏ6bÙ¤çåjc{޷뫾ÖÀs”ÈÉøLÆ2=éÂÿZ%ˑH0èÛi4>v:ò26¿ -#œDiæyé -m—È8#ˆuïK˜€àhÑæK#ziT”\Ýûá =e̽òݲ±ž%œ>â¸'o?þ¬¹Þ¨'–{H4Ày±'›ªõ•LŸ=ÇÌëއx‹ŒŸ¯…ŸÇ‹»jí1|}óc£ª‘^i‹¾ïÝÉÕùtB×}¥[Ñ~¾„VÀ;-9¼l¯ÔNï§[pô#[rÂٖøùä덫s¨n!à†¹OŒEtôp·`ÓÜôÖí|v+bþE‚R»šyoXT€`Ûãz§Uw(#äE¸ ¥žRõm÷à3Oý•+´©-ÖÍBoU`úÇÆ{ÌmóŠäÎUÐî”jë›0ÎvU0ù{òÜÕØÓ4AÔ#x/kqC8øÉ&‹(Ž£/^Ôs²äÓY×g2›ê"@grÞ½É6Ò™™â6˜ÚðÕÑL9À9·.o³KùœMPºWtôu)="kúÔRfH©ûkßÊÓoØQ‹Î¤Ä¼B[ÎHi}?Üqí‹sSŠg“°©èxËOhï¢ý” ­S )·C¥Ìa)žÔºYð:ìk=Æ±YóÅї".òS²èar/{˜DÒ¦Lç¢t:µ h¢MlÈæÏÚ²KL¾ŒbxD®ºÑÌAÆ/­'–V˜å¥#”_lÇ×wŨŽ{ù-“å™P3´¯°ŒaæÄÚç„ô09úpŒ,Ɯ,†ÿsՏ¾;Ð+šW!ÀEëÏ _Ehí¾çÔ­•D6•vÃ$Ñtxéd›ôŒ¢ß&ÜwÑc£my82Ñ+pÔÕFO)ŠW%_6‘AˆgYý<ÈUÈ*:p|+ó<öá¬ðºîµ„Æt}8…,!e„óÉü4@áË„R\s!{ô>ú%!–e -éÌþ¶·É0ÒZw?ŒO~cÇ=L"RÈ'mSQhkŸ£Y¯ð9 -¨ëŸtË žÿ>·ç}½¯T-ŒwÆS0k Í»ªG ®‚Ý÷µÿKâËV6Uøg½’l×ûšç"ñªcéOGžQ¢ëe÷âtd=ÎÙyyÜ<…*‘J-V›Þ©Òoq€ z[áå…X@4¯Va`ñ) ‚º? Ù-aoN`,‡ÝiîšÙÀ´*¦Í…æ¿ü™v6j›øi–dçØÅS…4DÎõš¸ :QßæÜð°ƒ>ü·Z‹¼l­êúQ]güÎõYêà"ÁïÍb}$ˆ âP#í™è‰òqŠc²¥ÍiGY^;ò;®äaEv0ÌÐqಙ±Þ•“¢º¢ -Œ…¡øª^ÌJ÷d49[ŸºaArë]½÷ îŒvFMTQÒ¨8ÃvǾ¹=2IžÇ>V´l“¹;öãVy Èg½;®›¦Ó]áâŒ(—f„¤¬7#6vûæ7Ãã[M Å?oª} 2´ -€£ŒCf© `Ü ôsthC“ÿ‰BV.ÿ]àXA™+YýýDZ’mGÓ'̇ ˜ó£Li7ŒõӂF©¾¥ðÿœè[Š½ÿ¨Ð¤§­ E¦¼¸.e‘ÂQuù?ÿ姛°ØwÝþp9–bË¿¥÷„I±)ÿp6»ôøø¸:ìºA(?cï𳫮Ǚ -ÇtZzy]:œþ­jZËM±—iœX§e§ÿ«Û÷µúï=arÝ?`KhŇaÀ &ˤk¢¯%óûuÇÆ&e/þO€¦±.µ -endstream endobj 4 0 obj<> endobj 5 0 obj<>/ProcSet[/PDF/Text]/ExtGState<>>> endobj 6 0 obj<>stream -hÞÌ[ےäÆq}çWì‹#0Ž™.uá‡%)YT¥][K>`z03»M=Ãa8üþ^ç9Y…KO/I…eKÁ.¦ª²2Ož¼Ô¯þí]öæaøäÓ÷Ÿüê7îMöæýý'å¦r®x“ÊáҖ›ÔöÏ‹I3óæýþ“”ôrñ~‹ÿ=ò!ùíp¬®2¿©’ôê¦0~S$õUš øC^•?ø«Oöu•Yù廦Ço©üÖÝã*ߔI½Ý^eÕÆ&Í0´W™Ì"¹Ý5úœI¶òn±É“n_ã¦KÆö°‘»…‘ë·».½ÜoxÅÈ8õî*ËäßÝ5~±xåñ*Ëå£Õ'»v1ˤ›«ÌÉ﮾}ÿ;Y×M¶É¼Á|.ë;ö ^˓»Vfhäý±}šr©“»g,-O°2—æae¶²r5Ȝø¬ÇVF.“9z½h¾™ìøµLæ"Z™ÿI…éÒLÆ古Éã˱ƒÜ‹y]Cû#„“͛ŚÊÜ蚚ZÌ·H,=¶ -¿Ì=‘-·.Ï!þnçmrÛj|T&ÞõíUžb·!|ÑáËSU26ýS2É®ÖMxÁ•Ìñ¶Ÿu¨¦ÁVeÆÅÝÕéøˢšÞÿ3V‚ù@Ínwøº“A®nŒLÇR ú‡›õëÔÇñ܃îÝɈ.¶œG‘´ÇQÅÒv Ãh‹‘Éy -•ßl{¡Júf‡Uù¤[Ì¢HºÃðI‰Jã‹Ï­l‡3òÆQÕj×^Q7ó¢¶âÂçó*•Ïížfá“Ã(~^zä ÞƚWNž>4?Œxˆ{ÜLzÛan2Âp›Xé3^)ñ©BÀšñbå©jaØVUϹIïÌ,‡¡6œý¯~S(žT"¹#\„ˈ'N.r—åÀ“Ég¢X7NF…b¢ÙX`ßR¥Ä´ ѼÃØ··'™”LÎë†è-ŎT^ýÍ™ñu>€½1ïÚÃÃly–OFÝaûK*í à!KîpEÝÙq¸’›¡UÅÜcÈðaÁA[ƹ©>ŠªÎoÒ,{ãd~EšzÂOõ;$æڎØ!5z‚Д‡þí»;H[6y§Áyg¢n:(âBôµ¥frû˄š ¡S3]%³ÄS™èCƒ©8Ž;7͜sÔUÞlªªZÃÊeT ø~Àë¸VX\|þû·ºQåÒ¶Ðñ|9Yu$¯«ò/ðÚ÷úÚI Q&]->7k³ÂB–.k¤3Mn~Ôå7óºÚq£c•ÉûGhå €.€‚]Ó~Óäjuk»ø·ºƒ·–W·õ 3ž'ªÂ6- S -0F(=8G;ŒqKkÕola»“§º7Èۗø†x‰¤~“|Ù( ¨e˜ Ööövнév'Uƒ‘Ô ÊøN J¼ïá;%õþ­fÖC=ÂÓYò.Â_³•äÌm…Ë?1¤‡çY ?f“¯šñQ—ÛÝ JÝLrßõ—¬ç®ë€O»AÅö͕`hÚö¡°zïÚXE›o¯õȲpˆŠ"ªðN™²÷ÇF©ãžK ˁ3oj’<öy8ªo¯ûAA£D­ d6–üvÉy船L{§`ÕaÈÒÉ$=`.Ä;JEA§‡NöšTøˆß^UñHß mÇÝ Öâ“ëK¶{_ouêí -S*›™¹¹Í¡C+·9 öuôÐ7£ZË -s1@µ4)Ljƒ{ØÑ?5*õâÑè<ð góœ²z Běªè‘¾ö“€Ø1eø è‹ÅjE<µZÀ“\&¡…¦Ål )49ªkÁv5Om §r;”ávíuáÇ]§÷BX6y$§ ½k‡­FÈtÙä¢Ö=ù‹pÿa« Ñ ¿ãþŽqi´ìiƒ„ÓÄ°T9p}eW÷hTÊ×Þ‘S0^Åþ­ò8{¦˜XG¾D|áÉsÍ÷AOÇ0ƒ}Àd~žeQø /8‹ix‚§]ˆÐe›K°§?dZ n~8FF¨Ë¥‚áôñs#³´¥cØ·nß©„F,ûp#QȓZh¶e= ÿXËöæiäéÖ ÛÓÇ+1© vóÙ§_jìYå…v<Û Áœ¨½)¿UKЈ+’ð< êú›öá ° Z3,?Ëè•v§AtÄX~‚ÈôEwš~ÐðØHT)æ&zñÎÝûlEë^ÂÑP¨ºÉ9×”Ý(¯ìëö ¡NVEßn¨²”QGP‹¬À7êË /.þû›«Ò˜êIÕ$AçÒɇl˜g‘M"ïá$”!¹)ŽÂÇ,Âáæ¾ÛöT%ÛÜñÂþ>‰ë½ ±¤‚=¯Œ lW.á_æõæþB†XÀy߃A9¥ÇDqGl9õÇn€[°þgÃ%Ô6yíæÝQj»Ú"ÍÂÞ@²@êƒòH ~N·ÜÞ)56OI€¿?1š'©„Ðltœ÷"Þk}BwChh½}œ÷QxÅá.z@Œ™{È\e,à+¹Òbe²úŽ Ó£Pâ†ð˜± ¸A˜a^2½vêú„(ÚÇ[|aš™Œ -[Q†ÇvGç!ß&¿æJƒáÛrËÌGsHy!üÉ­RmØ/· < +±Pª¯?ûL½uÆ$¥¦'<ܾ©ÁTf.`­¦rÛBH‡&Fâh»R–3ڀÀNpz¯Òùs³ \õ:’ºdØ`‘j·{ù18æ c1;¶×ÄYL™1Üڧ&f³ŽÝ3y“åbFmx Ù'—#Šû3áÏÑ½É ü Yìš'*#ySåq9¢¼¿t Gç(zhïäþݵtܑ¸¨qLû#FßÊÀ”¢Ód·Ê,”£p™&§5°ÈB¦QX·€rb‹^c‹,כ‰ -²pë¿Â­4ÜÂòõNîdᎩ*nýËÙK¹Ïâ[6]Å1HI|¨÷à€¢.\‘dŸª’EÕ!æ¿;%´Ú ó©û—A›ªtÅڔçÀÉÞo¯•y™äSuiÖ³"NîÄÌ2Ro­µî‰¾üØ>Óß#Ó-Ϭ±‚?ž¿'Àð͕ä7^–dÏÀ}8=<ÀJÈñWû‡·¤Ô½°Žé A Üp)a|áa°5Ö! œÊ2>hÈhe“†*ƒk$W{3•–EMY2ƒ<{J¹•²´ Ž’fÉï»±¾Ý½@P• 9ayóHf*ÛEКMC ÁzH¤u&j~D¾mõ‘lòMòÇí â*“C7Æk\ȃô~x‰uªA¨nÃ:*~R³·>ÕLóEÙöÂ,èõJˆ¬e—hGl1³³$*•™œi”o’cW,Ý=¶ý„*E¥œvasBœc>GY|Å72²Aœ£¬»öNŸô* ¡¶]ß7"·F“¼•zaù°r -³`Œ©¡’† ZhÇB\é&À_@»W†,ð䫵GÛòyZFãú׫›ÌÂ -¶e %ˆÔ™¹ûÍȕ :ê_qÇ&ŸÁ¿Ò §«ª\«Õûú»†ô¯Ýý ½“S˜HÚµ6>¨ã,è%·]NR ÒÎY YKbÌØÇfÊw[:^Ìø—ã®I¡é[úùŠL[`~¤)CY2æ=+Ø$T¿çÌð¦K^>œ1윕fVàh÷á3× > -`ÿÐîe’ŽÂ'…ý§kežZ¥DÈ.)ìS-È+¬Pš*×Ú±,¿þâbsfÜ&­¼û[›…ÀŒŒ0Qäb˜GDžê3fµ"ñ±»Tzþ?.-gð÷E¨,ÿÛq¢6à:ñ¹Ò¼¸Dø¢`=<¢6l™XœÜ¶-cýö+\6C,` ­6Ý},°ÐR/CÇõž–ä¡õ‹ð6„¦EÐг¸žCV>mðN1`-dnC LOêô?Û-“?]CÎøY.í"n"5,à ‘)…8‡)–e7[ %7ö -´°%™s5lQœòrYx³–èZ,–"¾p¹ › ?¦¯9~œ9ƒË!`€Ýç¨R9r@ø:ÇìüšŽMö½®æ4~@K`^!ÌAòl)±ôÊOmw¸³L¼8³h®œ@/ªokÆē›öš÷*ÖÜBÝ6àÚúW ’¹é8ag*Ƙ°³Y̸9ëÖìA,gêŒaa÷Nóч—Kê´ y -cÐ1ŠˆÙ›Gù6¤¾ýôf )J²ý»€'Ú^çÑNï»a‡ÒÔ@©õ=-› -[w®ÌÞ‹I `3¢&"ÚBSݨ±SñšÈiHÅܗh#ScÞɦږŶšƒ> ¦Ðm›ah†Îq%‚«ÂqUHnÈoÆî†K5%‰»ø&èb'l1´}`‹)Í4ÙàÅʘÐá H´Ý®{½Þ-?ZÄ>†Ó(ï³¼i,‹¯Ù ®Æ±Å%fH1ë̾)d4lcˆœKgËÂËY€xaÁëOt›uê¥K{™W­ú­Ƅmˆû¢}êuB¹OIé”/j®ñŒg/ò$ÄYú«2ÔΗêSh‘úP1eæŠÞî‹Ãv'¨©ÀœFMâ،¾µÚœ ò¿˜z` r~™plT¯²=÷¢€çù1ëýG°43ö"–ê€etÉËÀPøAþ׍V`–wK³ÞÿeÞV—} -€½æºW!Xá³)CÎKÛfœÓ0`•Ô#¨R‰Ž»¢ñ&4RB‡.lø¡ì±71ï jæ‹*xބ¶²“òxüíÕW{6Ý®|µ'\DŽâ¦{ÖUþ•1$Ÿ÷ÝÐÛ]½«|¤p“ÇÛh»®GLÄ3‘-kÓn…¦uPäíño©ìŠT)ցðk91Š¦Ðpî…)ˆ² ¯tóÂ,Vr[*6.Àck*ä?šÙQøÓ`ûúY\X­­^yµÔЏh\´èú£ºÃØØ´šì&–#þpÐÀ¥XVš†zßè=*¤ÊàÅ¡~ /؜ÖC"](¸þÉ¿ÉF¾Z,á°_ +9ŒZg÷¢VÃÒØ4}g\5(ÿ¿¤oP;€Äú6IùŒ›)¼zDôHYr³_ƒ›) -é;¨ÏQ¦ÓÉZ63ëôîÙE ®Ö†°)krA²…Clóýü"¹œ–S" -Ùl­,ðµòfۄ2à„oi5qõkUtŽáS²ل[2FÒüðØÞ¶cìßuϚ|È3¾ÖŸ - #S7©cÁÚHG°[ »šþiáÇ.ãØMï2ùùÔ>uë8Lt¼È}T€cӏS¹:kyh¡Íå”y•áQÀàNÝî”îa¯֒À€lb©`æ«Ö¾z­dè \Õýä/vZÎ1²þÎC|ÊsÇlÑâ+©'!þu"Ù,Žïë—XeN÷2`8²P-’YwÒRêU/hÚᴿՂ˜çË,ÑæTÜÚ¶ýöԎ¡A¼ä>Fé‰S‹e(´áxÄ £ñéE6ªo×­s‡ö}_!ôNû½@Á5þFã@їÕb§ôwÝ)y'xsvä“ã~óD¾d³ÌÍaùB¯W¹"ÃV-f”Iÿ՛záUyÁ¸”áҟerYŠ<Á˜jŠÉC²á–0Ÿ8;íØG–Yk,1)ÝžºÝS¸u K…Tò`Sµ! iþzA¬ËW)™Y!!¢åߐgÙ`I“&³.ªÚlv§…‡C -SM™tè|,ç1=€î¥jù+õÖ!¹$—°¡Ú-sYH‹P‹) -=€ò‘\™ª²Yfy6}†ÔmZUùl_™föRþ,ä‹çc\,Jp#´ÝYãÛÀ1™˒ˆƒ†Ç!Ü/X2;?Å1çÎxR‚äPŒfw]—×V)‡Wy3öZ.&ã1ôVßTڎˆTãä˜È‚—<¬BnûòsY¸Q(â´(åÞѱs‡F©dÍ\n&«zPgÙ¦i²ŠI-üʲËS󢧲IF|ätn>¸`óL´Ûô\2ŽÆ¯s­j ìlºìÒuÌ¢„F*Ç8;p¼áٽࢠí^.›ü"ÀÖ('ƙŽÇÚèœÕ¾¥A]YÐ5‡i„T `‘“×^ -çÙ¤}Š•öu”µ,v\bß¡㑜 Êøœr_æ# -jÆa“÷YÄâ‚åK5y¯ž?2_ÒÃúâBŽíL>»0Ìȝ÷Ùв2”TÚ´,äöûS­]*ûZûžðÀúï7ÉWï”M2MJÿy9Åâyû‚.ñî¸ýž©$†ƒ»®Ü3°ÁǼ™²°4ëAÀ3í2‡ÆxÊKhŒùx6tª3|ûæöå#‰!XPq-c¥Å_ïÌ[ -Rì)?¶ÛGTà ØÄçØÍ;¥1Q[Õ=;mts9CºŠ<ÓxÇi_ˆ>ô9xqy$ìò¢ ä ¯4r¨wìfcƒé[ßqó=Pm•ï"c’Oì«G±íªôÅÌ܈—ç’×™ ãÛ+Jç–X´ÞÍdZºÐŽ¤© m¿G·¹F¼å¢•P£êØhN^O;jòé,ln—Ïf‚wÍìÌtðËcÇ#–Q…*çF<÷-¤쵊…ýkÎAro”äå‚0{ªlõ¹ØÀ2'FB'`,ú¯[ -Mb 7,¤ÿû!t™M½—Á®*L¸iWý^jôÚat¦ßQ8ZêÌÍDG-;FtÔæZø˜•’?•‹ޕZ퍆 Ïâ×ÇÂÄÝT>.‰pV1̔É*—a«Ò¶2Ÿ:0½à¤:¨lh³*%ÔºA[ïæ¢r`Ùýа5I{©ž Tmdžø9 -mQFëæ¬ëLusWÄî íªšbë4²î%> cŒeS¶Dí 8iHc˜–C"‰]:ˆm˜ùL1‘ÕãeìøðÁhC3ˆvø, Î:Õ/ÞXd¤Iÿ¦-¹6µåÇ|±³15kÜG}1«c>ñ­¥—iwšG÷S&óZ{›mr× Çvlôn¡¾‰ç\Cq˜GyWYö, ¦* ÖV« -Ã?Š˜Šì'ÄÄ#>È£h>ۼ纽åÚgö†ë¹¢Ð9˜©èÉ£œýñùR{yˆjÖð,–Ä_ ë•gÉ#4¼¡'7¶ÿ³$v뱜ÿ©èG>×­š2¦rJkÙ!¤Y,Ë3Óü!ј—ÿˆÎÄU?¹tVQ×%»Œ½Tyåbê7gÎþ¬è¨Ï‚,m 'ÕÔ”’.¨ºàL> £Ã'Ãã¡8ŠTrïBS6*Ÿ±wÚóˆmèv6Þ/’2x¡dRfëµYì€V¡k-Œ–JÏ}ÙîC\´Ð°eg>;Àdìy‘Ü0U¨ >³a™!ÅfT 9+K—û M -VÏB…¼ џâN½7—y ÖÞxúU³csɆG$˜•ÏåJìÍ/3÷ÚÅ"ˆ˜> -Dãv˅‚<4јΛ|؀`íܾÀyæl\[æ> kû¶¼kGàšSiø%MB!‰MB¬™kŸñ Ë_´·Å_ȕ²þrž ]Õdª>͙0— ê^þ÷Ƌ*_M˜ÿñ„nãgÃëx” îè«é r‘ÇCH»µÉ4‡¨þ´Šp¹ÅïŠiLèÛ͊ê͍Ø[é[(¨¯¿üû˜ý쬆Êüê§ì:{ÑÖ5“ü§Ð†NåùùysÜuÃöŠ4Y^EÚ¦ëÑ'ãxˆ¹¸º©\…³¤¿«'MƒQGó438ŀ­ŸünwÚ³cAX–â÷ð€©°%_ Nṯ¯eóûM–¦…É´Mé×ï?ùW)Ý» -endstream endobj 7 0 obj<> endobj 8 0 obj<>/XObject<>/ProcSet[/PDF/Text/ImageC]/ExtGState<>>> endobj 9 0 obj<>stream -hޜZÉrãF½ë+t™pF„QPð­7íðÒ¶¾´ú’ 7Ð(ZŽ‰ùŒùÞɗYÅÅ-M8&Ñ µdåòòeB_üóV]oÆ«×wW_|•_«ë»õ•OË<7×ýO3gܵ*ò´4>¿¾Û^e$M7ÕCµœš¾gs£UZ&‹z:Ôu‡Ÿ6uÉ×ßãr©Iî“ÙÇ»oé`eäd¥R–ö½{{• ³»_ñRËËÔ¹L…Wÿ¯²°.ÍH¾ð. ïTXfË҅W_^.£Ã\^VÞåŸïø!¹Ä:-’Ûýn×ÖÛº›ªá 7*R›|ÕlöC_&õÉ­}}?»á‹Í]¸4æz®Rå}!›-ûnÝ Û¦ÛÌæÚ*RIß-i¹6Ž–W›ªéð#Oódz¨&<z–Ñ"é÷, ­‡j[úá¿¡ÝP¯Ö>oTËåžÌÑÔ#Ës÷w:¾Q-é¿ë'1EžTÓt™ñ¡®Œ–4J¢Žõoûšå3ÊCÖ5ž -zšj1q‘tûí‚Wñ§)뺚H5c_Ý6Û¦­†öéæ$Ðz?ÐV´Úæ9­©Ÿênä+XW’F°u¢Ž³2Üö«ºÅ•,žð¾ û4ݲ݇¥¹ ÂÊҟx5¿­›/ª±^ÎÞÔ.A“5Lêe¹ÉuÒ֏u _͋T‘®û-=“D:ùಏ<‡6î‡ø´Ý·SóX M5…=óäëfµb×'¡óäûjøÔ?žNÿ—"Í-9‹N–tN5ÁØ6ÝƉ¶åWA'«§?⧧Ÿ"”ÍJz&¼ûá͏oßɀ¡¹æãé¬U³bu‘ØìÐÜØlºfÝ,«nj¡DºF™4ÛÝÐ?ÖòóÒ¥0b¢S±Ö-ø,ŠÉ%èöêÅ(ÎíóQœ–eùÄp¡âªBÿ)†­³ªn…—síRE÷¸ ÉU5qdä3gA1>ô‡î~–F¼º«>±1 ¦T2õ›~{#Ábá#‡INÖ O"wãNMGJ¿ ×*6ÞùäÍë÷çáIrΝFô1R:m%dÆ¾Õ¢Å³Éè|þ?GÌ®eÐpړ m³y`ƒ:$EŽ!ËáMt.æ\ÀeÃ0‹ãÄ‚ú(‹8s@„HÄ ·?¼ÂPFÖê]‹«…Y†dœšnpz¾6p×q¿ÙÔã$°çèVÒ6Ay²çtèeœ\´žÎ”9óL#²à·¥ß„T“è „êvÕ05U %Ä÷ÛsàÎ3h¦éÖý° ²cž î6Øà[üÚ7'†.S&Ëj V7<Ô˜ÆXÇa{ÓÚâ,Š %ZB°Ðåss. ðŠ¬,)^rŸZc9Û~HîH)9ùÙÐï7ØNpÐ،]µOcŸ³Š-óXW `F°|»˜Í=é½éª˜  Ã+ÊZi%ñЌ´¢2º ãtZ3›Ã.ë`sÚD—0àC5,ú¡‘%Eó— -¨Ø³ÁKhæÓ>Ä -á-bìJjcSœÄÉ*XœjA—G®Ý#lÈS½ø ݛÜòèƒt8Ò#8B„ጢó òaærzOæ#XS¢ó¯k -Žg²².,{˜e¬Ü’4ȏ3 /oV4‘$‘i!Ua’O¾«Æ™¢Ä -Ÿ¦T¢¡Å™ÂÕa9˜£‘„,9ìÅñT€@@ŠlÞ=DTnɲ™¢‡;z -! ¥€¸"%ߝ1ô€ŸÍ8א²år°¢-m®6SHÌØl‰8ÑîJpÒxP‚-=ŒF?:HO±Þ>ý1S`"@œÌÁQxªÂ=±3"êô–’ D@%V$ʲYhzØô,]-ã*`cÍÑh!ÚØ@Çã8Š’غ©q”¡Õ4#¿Ô:‡’B–Æ Ž±„[$j/>EN7⛶št¼XàRžÈnð¹Ä÷ÉWŒaª¶\bH'Ð&ëuÉT ´‡ <à/¦)x‹›¹•D1 *僆y9b›ۑëʾdCámðW-î–‘ºü¦Ç+lkޓLÃ<3î3!ÌáJëç\ÁåyW0Z`PËsH0É¢’XÍý–I½d÷.hæsÕcÅ$mV ¬bxΑ×ÌÚ²å1:oιÒZ$~Åñ$ÝĘüU»Ý ŽÑ“àPrD&S¼%ò«f^´8²Üú hm!;=U`óMÝsxÔ"É44ÐKšàa!2܄ô0±B)ª›Nð‚IŒ‡Ó7,—Jvý(‘‰{+á8ª8G;ã)÷í^¡ 6ô Ib=8=Ì »–¿Œ)´%$€9fåuÈ - Ç;ܢᐠ<™Ÿõ4ÍX=R,‘ æä4B^2ˆòÁ:l©“P¯Ê(ï²ò3˜t"®'×TÌÎñŠE_Õ;#tZñ| u­$`Õ2`Pä žjv+böeDƒwwW¿]YhÇjNPTm§%UÜ\‚ÛkàÊÜõr{õÅ7[uý¶¿úIŠ÷À¯i¯"“¥á1ïsJo^R[,Z-Wu*Ånt»|¨A‰–RcX$W²ˆ$…À‘5ZuL疣Ÿ Ó?ËP#5ª˜—+U«A)8‡Y2P’^r`ø”Y‘6q9Â1±ë\*rÉsà¼lR°ñ©ò¼`[.™Ïb)qŸ¼ºŸqUÇá^D<Ž.T‘Ø[*/§¡âĉèDI¤ -rѵü(ƒ6²âB¦ô\E†ŠúÎ2acôy¢1胰ûX)5¡¶™Ô[wýÏ7²ž2v»¯ãÁtRMbiË âŒUÔ#ù©eÚ¨$ÌÞ£dÂh3XòX×yѝ3i–±¬[_–ad›Â—ìváÑ0(“—Äg)®¼+àw‰Â²Ï}Ԓ—[¸k. -bd˜|ΰ± -¤¤*ÇÓ…¶Ó‡$Mg(Ï£O!¢Ña27¨âfþX6fæü*Ÿ_€ -âåâlc^Œ60P•]Þäñd“ .OÂÔ(¿•ª4—ž·ªUÃà` -Ãl»ml ‰ÈåTu›¶alS0õPGþmOT +rsÉwì¡FÒb`¥ŒD^ÑOܸ)l(ï䈊ћöRÂlòi!8ýîÒ$·SäÕhù‰pÈ^Ìox^#™ýîöVv†WIA]cï8Ey},˜%T -ÃÂìö!ÏÛX {”»äÈCó{LL -x?WëgiÂæ{Ÿ,úiâîwDÖúsœh, -g=4èáI)ý=,AiSûAv—tò’V Hº8‘éøé' -Æ.”{Ÿ¼fgÉ@—Þ Þçè3î%×1t͕_É}vˆ•´ÀÐqØÏ2Ø>ÿþöl‹¯BM>Âd(§Öû.~Å)‹øE%Ó¢Ø8ê;­†æxËTaWbrRÇڜlûÍ ÁŽ´”™¿Øeʪ¿îÈvEiòk¸qŒw°F!mæH´ŽôÚË|aË¢Œùâ~õì[ÉPœ%T¨ÖE¤6̝ÙñFùåDë(äÄ¿‚Öj!sªž48م‘ÓM Ö±<ÙøX裸ËHW࢕ëՆÂ5ŦœXÑÊãvä†ý ^âv %œ— -ã†OEЀ¸ßDÚ÷0yl³Ýoe¹“ø ú=¼) -ÆósVCuè„u˜³3WÕø ²¸p(wxJ4l_Eâ@£’‡[Xž›'4íÔTÄ\8&+‰Ô“ &! xd|0Œ0Â}G‰D}Ž@…:Fh¨Ï¾þd:Þ}Š\©è>áS¥FYlWDำp„|ò“Ö<ʝ·æ1„¸b&ø¹`«DŸThcˆoŠ -iŒ×m*‡ùHTÔ%#„2¼|ÐÊ;!óñs{)º¹).Xl¤3™„ZËÅ%ò~F¨†pÇâ¼ú€ÊÏ@Ÿï×Ö¤›U*& ¤úÃ~ò^´$ -E™Nn2îGÑù ÀÌiü¯s°+ŕ—¢½Ž½ Ùßq7šžtï|,ðÆXãóØEìÛ¾Ÿd¹âæ[Ëê崴‡èé)6ëF[€ÕB¼]ÛO©¼Sò)WޔϹ”Ðt<G\É|s$™Üëëeß­æÜ°V|ÍٟVHÓŒ¹ïø¸B.ßY,€ÿñëâçèo‰+MÚd”ûJFñD¿P¡ƒ‡¾Öš¤ô>|!¹GwÉæy$|¶ Þóè¬&ÃfäÞåtþ²™[÷ÌéL&Þβ„]Õq©Ö­BqM€V^Â=KÄõþgÌW#§‘64Íδ9ÉC€ä^ª÷©Žõø^¤ñ&“&Á?.‘Ê‘ò"Rë䞹À;f þÇ QJÅÿ|ƒcڄ˜.Tò¾®†‘gæJ€©1•k.<ëõºYrA!âÇP”ɏ(Ck™h% Ä/M§ÏÔØö,þþ\®ÜH=§¤~fÈe/ˆ𔣍ñ‹·xóßós˜nF‚K&ðê‚à&‹†"bꇋö!ÚRÄ6ÞӟþÂàÄ+â_øÓõDLøý%:HÅ$]é,V}ó%)SQ53㯜_üÚjÓÝrѤ<è:MÉ ‘(¾”¥-m¯zžÎç­~â̈́ ¯¤¿‰ÅVpD -™ÓßÒŸò½S£øó9†þÈw"·óxàM‡"žøþ»oå3Q‘¼é·»PÝs¢×@æ× aßÖÁ4ä_øF‡û‡”°n\Š#ÑÒÍLû„¤Œd`gó2/‘]¿­º}øÓ(@“&R‰ïy aÇ éÛý]GžF“¿*òËÌö›qä¦f‰†’’eê´¾V¢âØ0ÿ¯¹ à -endstream endobj 10 0 obj<> endobj 11 0 obj<>stream -hÞTP»nÃ0 ÜõStmt4¼äxèµ›]‘hW@M ´<øï+)N‚ <€GîH¹o-Ùò‹î0À`É0ÎnapÁÑ”«ÃÖeԓò £¸[ç€SKƒƒºò;çÀ+ìNåÛkñò“ ²¥v}ùsŽD·xÿ‡R€š BîߕÿP‚̺Ù¯¡Ê}¹Y;ƒ³WYшPWØ\É<ÏnŠË ‹ëfQTÇFÄݍMªtÌ=^˜c¸|qŽÌ-áý)Þùä•Jü 0fdi` -endstream endobj 12 0 obj<>stream -hÞbd`ad`ddò ðò ðÑvL) 0q6q5µ‰ŠþæËùÝ÷«ægëyþ+‚Ýßy…@ÜHꀀ‘Ÿ™‘‘IH‹ïû¢ï³¾ÿmXñ»Ärj.+ˆr@tEñâ¼¼ââ¼¼ÅÅ+V,^¼BŽ ÀªÅ'c -endstream endobj 13 0 obj<> endobj 14 0 obj<>stream -hÞìÛO«+ÇÁ'àûÄlf˜Í+È:AÙ½Œ ÖÖÆzg6Yi“¥ !ۃ÷?€£p Z_o´t6ƒ áޅ!Èp `4' ƒÁp¦¸‹vWÿÓ¿sԭ硸Ü#u—ZUÝ­î_U?>p6»ÝîEƒétª}ÆêîîîÅ æo-—Ëõz½ßïµ'À¥…K¯–˳ív«‰FéÄ<¿"Ü]Jõ.'ÏóÉdÒ~=¦•Fé¼y~n0×뵆¸„p¡Õy=–繆Ÿ³çù‘>À%ÌçóÎ+±,Ë4Àø\(϶ۭæ8£ý~ßç2l:j+€ñ¹\žïFà¼V«•™7«)ϟN§ó.7’ëõZ œK¸Bë™ç/—KÍ02My~x½ÏêÛív6›5ÝH. - p›Í标%ó<×hcrbž„[ŦH:ja€³X,µW\MWbY–i4€19=Ïl-¦…N—çyíµÖd2Ùï÷fV܂³äù<àr²,«½ÖZ­Váݦ)úÛíVÓŒÆEóüÉd¢…NהØïv»ðîz½®}w¹\j:€Ñ8Kžn$k+Y,ZàDM×ZÓé´X Ïó¦‡%Ã[`Βç/—ËÚJÖëµ8QÓµV–e-À žç7Õ'ŒpŠÉdR{¹µßïã2ÛíÖ%À¸5¥ñËårÛj½^¯V«p‡Øôp÷f³Ñ¼' -]µ×Zóù¼²dӅY¸rӌ#ДçŸh¹\j[€ÓÍçóÚË­õz]Y²ež†fKäù¡N pºý~ßtŕçù) 08çÍó'“I:U €ã:å¾i2–e`è.1?±Xì÷{m p¢étZ{¹µÙlj—_¯×µË‡z4&ÀÐ]"Ï7 àtÛí¶é‰È¦Uò<ïÖ®jÓ¤ƒv¹¿kn$Ã2³Ù¬=Òoz€yž7]_ív»–›fõ¡N 0\My~ÿ©õáÆ0,Üôd÷t:ÕȇZ¯×gv2Ô©a†ëô<¿°ÛíÜ9œKçSGujX€á:WžßRÕb±ÐÎýµÌ”8Q¨Yó Ôóüý~_[Õt:ÕÎý­V« åùËåRó Ôóü éÎQ;ô7™L.”燚ó<×ÂC$ϸ*ëõúÅ%…ú52À1Ïßívò|€-‹Ú ªét:?DX¾¶žÙl¦‘†èŒy~Ó½g¸ÔÎ}ì÷û¦ ›Íæ ªZæZ„·45Ààœ+Ïϲ¬é†qµZig€>š®©&“ɵ5MÑ_.—š`pNÌó·Ûíz½žÏç/š™ÐÓyø–с<ϵ6À°4åùç2ŸÏ52@Ûíö¼$ò@OËå²ö‚j:]çb±¨­s6›ip€a¹hž*×Â}äy>™LÎ~MµÙlÌ»‡ËåùËåRóô´^¯›.«öûý)57 ¸Z–Käùáž1Ë2m Ðßl6«½² -¯ŸXójµjºfËó\Ë ÅyóüpWnOœBpkò<Ÿ7Øl6'V¾Ûíš*ßn·`(Öëõü«Õêî­,Ë­¢ö §‡‡Wîó,ûòåKí×ìÍë׿úégŸ|ª)àš½÷λ¿úé‡ïðæõk­WÎ5cuÿÕ«WÚ€ýâ‹_ýÇ´(ŸgÙÃÃ6«õáûx f¬Þ{çÝpÖ4¹¿¿y~(ï½ó®9¢pµ¾|ù²x &¹Zcd>ϲй¿ûècãª4ùÝG—#ý"PúÛ×_k¸6ÅAúÛ_ÿæ¯_|¡AÆ$Ž®†ÎýòåK @ª˜ñ›©>\¡?þþñ ýðýÞ¼~­MF#thù ì) €‘ùêÕ«ß}ôq,ŸgÙ¡å³O>­Íó¥úp!᠋Çì¡3±Ã!_9Hÿò§? ~¯Ä›×¯Ë'äCWOGWîòðð aÆáó,kIãÏU>|ÿƒCSG Éï>ú8\á>tõßþú7•#4¼êü>»¿}ýu¹_]=ô`zúÕ¹£ñ4y~Œ•L…ӝ˜çÿåOn:B¿ÏëÄ\ÔEóüPù—/_jägqézïwÃZùӟ4&<Sòü/_¾,òá¯hÒ+qâ 9ì •Î5Ì -0&§ÄG_½zõÛ_ÿFOì”<ÿÃ÷?(¯k$e€õ¸€ëwJ|ôy–½yýZÂ;:Ï¿¿¿/Öúðý¼Wè”rèÐb­°{„ŽÖ˜ãsâtPàéç‡…Ã*Ÿ}ò©6¼N§œÿò§?›–0nò|œ£óüßÿà«W¯4àÕ:å„üÞ;ï†Õµ!ÀˆÉóapŽÎóß¼~­õ®ÙÑ'äû·4 À¸ÉóapŽÎó¹rNÈ´ÁàÈóÇÊ €â#yþX9!ÐB|ƒ#Ï+'dZˆ`päùcå„ @ ñ Ž<¬œh!>‚Á‘珕2-ÄG08òü±rB …øGž?VNÈ´ÁàÈóÇÊ €â#yþX9!ÐB|ƒ#Ï+'dZˆ`päùcå„ @ ñ Ž<¬œ®ÄÝÝ݋·¶Ûíõl•øèP¡ûŠ~ ª5xòü±rBnÙ~¿ß6Ëó¼iÅÍfs÷Öz½•t~Ðn·+–ϲ,ü¿vyþÑBOµôcKõé—Ê–,Viê&y>ÏNž?Vò|à–ŽVm`»Ùl¦ÓieÉÕjÕô»Ýn>ŸW–¯¤ƒòü£Å½Vm®Þ¿_ -áõårYY>ì é(€<Ÿg'Ï+y>pËÒD·=Ï_¯×åì7˜L&şËå2­·ÛÅf³YX>Ž„?+ѱ<ÿhíã2i®~P¿<¾ óÃë1ÃËÇ?C=•H_žÏ³“珕<¸eEžß3wÝív1òÝï÷ŋå¤w½^——o)ñd2)Gôqšwe@ž´¢éBoöYøÐ~ ‹EñVVŠFãàN¨­¼°<Ÿg'Ï+y>pˊÜu³ÙôY8Næ¯ÌÇÎó¼˜ì]Éuc>Ÿ%yZ¬*Ž <Êóëõ:´I¹‰Ú»fµZõ©öÐ~‰ùüb±hªª<”#ÏçÙÉóÇJžܬ<Ïûççûý¾iòv°Z­Ò¨¿˜^ ù ›Í&”kóüíÏúja3ŠµÂw<±•ž1>*Òõ>ß½xD¢g~~h¿ÄyûéÈB܅ÊQmž\„O,Öê3¨‘<¬äùÀ͊¹kŸ…³,k™ÌŸF¸»Ý®x¥iÒxñî|>¯”óü<ÏÊŴÿBøX MƒãGo…eÊk§¤úƒÈóûËÑ/E{Îf³–,ïE•!ì9ÅB¹Gjóùòþ­¬>¨ò`4‘珕<¸Yëõºižvj±X”cóT%nÏÿërà˜ç‡UŠ ç©ðzebzܲÖd29: -¾þ:Ñgû¡ýҙÿ§OU”óü8·¿Ot®„Ö‘K'yþXÉó€›U$±“ÉdþÖb±¯4åÞEÌnª­˜Mgqǘ·©Â˜ÙÆ|>®RTUž¿Ùlâ¬ûJ°Óã"Ìß"ÆÚá£c:Ý4½¼Óõçù±æ? M××Ú/±ò¬!-F…Êq•¢+=Ç\Ò)÷cø7~ñ°zèô8Ðg؂'Ï+y>Àà„ÛÀí/¥ÚpǺMq·ê wµáF8¦ñþ:܇6ÝY× -ŸnœÃ-pyªa¹´„-íMV «Ç<$V¶Í앝¡i2êYv¶güŽa»ûY9l9ñ@†¢itøihš;§ß§*óºÓé÷é¼îøJí4ìp:Š?aåSSLƒðÒŠ¿¤ÇMí¾þäùc%ÏœKäù-3Øû$ÛMÉl6+f/—ŸyoÏáËSéÊâDè¦í,ϻ묭¼m§¤ã6Ö Ô)y~LMÓ¸eît1\~bŠ?ãÏPíÔciÐ9ÏóÊ*-gÝ4Žî“÷©¹Épóüø8C¹×í—ؼMóÂë•YG÷Hgžß§fx”珗<`p.‘ç7MW.¢Î2ôߤÅbQ¹GÞívéb•H$|Pšü‡ÛÕÊ„›åtƒÓq‡Ú‡BýY–•+ ÿ·áµ#1ݽMcÍóÓOO;:ìw%éw—çÃ-H“ÕÎyݕU:#ô´Â[Îó[¾ì)¿AG4re•ÎæM+”çóìäùc%Ïœ³çùiî] ·›f£Ei˜ßãËQj´f wiòþìü¬°LSD¿ßïÓ1‚–»é[p;yþ釡PF)ýQ‹lí¯Iü=ç„xÂiú9+~ËÊ?7}R÷b­øÀc¿Œ7|‘£Oz#ÈóË× GôKûNÚ¶õHyšAçHØæ³ÿ.3Jòü±’ç ÎÙóüøPy ½ã fg>ÿX—Ž¶Ü`¦cåÁ‚bôùjñ~6*?þè|ûÚùü•§ څûñmIü¸PIøjóŸ…ÿWª-žQ,°Z­6›MŸO õ„Ãò±òPIh™þO´lÛAÝV ûIQIøOø³eú'êE˔¿`gåíûjî9±Ëb¢ê/wel“ðŸâ•ÙlVy<¤ÒéÀÐ¥á|ùÅp^JW©âÓì=ª|c%MQsí6ĪZ~²[¶¤Ó óü4œ?¢_j³÷BœcPþˆ£{¤i–BŸ-2yþXÉóçìy~e¢ûr¹\¯×•h¹gL³Ùö,zþKíy~Ëçîv»JUå(5­*|¯Î¦¨ m:ïºÒÅ}ýjµzQ'~ñðŸJÄÕ[¾þ~¿O·¶²z{ú*oª¡ÈˆúäùE/4mÃl6«]«Ož6¯©é -Óé´ç¨Gô¢KÜÚ¦é÷é~噫˜šVÆ銇¹Ây»rŠo…˯Ç3mz>ŒQäç™J=éZå -ËçÕځÅXíqÏ 7Ϗc¸•ñ‘Cû%^¥ ?¢|ISî‘Ú¹q­J…í(ÆjýÜÐIž?Vò|€Á9ož¿ÙlÒ4>Ïó–Yôi6{ô=f–;Ô¶RŸ‰Óéýƒ¾Kšç·'Ò¡©Ó¡“J^é‡í¬h5¨ÕVf˜§Ãy~ûÆ·lCgžß¹y ÓDò| "œNk³ÖxLO2ñÔWy+®R9éÅçÅ*§ô¦zÊç™ðVåW ¾[9۔ϫáƒ*_*~V: ÑӕçùÅóqéëñ‹§ƒ#‡öËci(§|E‘+ÑÞ#ñÝ´GâZá­Ê—*ÿúŸòÀ7Bž?Vò|€Á9ož_‰mãóÝqrZçÓâu1i¸«Í²¬6$i‘ƼEdn®ÍÒíé¹bq·~\óV¶¿3rO?«iª|Yÿ0¿%Òo™Tߙuz†ùµÛЙç´y-ƒM;ª<n\ñ#8›ÍÂÉöî­ðŸxŽmT§ˆp/֊¯Ôžâ©#Ô\|PüñMãÜbáðÑÅqøˆ¸mq 3¬Õ”ÇeÂGT¶íE×t-®<Ï/~’B[ÅoÄÙJ\¿<þòÇ«ø òÞRÙ¸pñ)a±¸måK¬´Gâ®UÔ¾~±Vù‚-½6€”<¬äùƒsÆÀàœ1ÏOoùã i|=ʚojsì–l¿e“:ç?—ãÓ¦Ûít{úßü¦Ðÿ‘öôs+Ï5Ôå†Íó<Í«ËADÚei|”~J¦)¤QI¡ÓĻҕVJ§>¦ÛYžL؞çW>=‹I¿`Ӟг›:²tÿé\Šp)†\ço…ÿô|¾,œLÂùªX+œâ:,Ba±bù°bÓð_1nß –×jú -çù•Ï -ßèˆÇÜ*ž1> -_omiÞÐq±GÚ¯Žè—(´dø òÞRÛ¶¡Úbœ·ügŸ)ÿö•?+8âÉGn™<¬äùƒsÆ<¿2ñ¯2¼’ú†?[ªª Ø$|P¸«mº“­ “›L§ÓôÖûzòü4I¨ÌµK疧-YހJ§„Õk›1ÒKGj*i!¥_ތʷ¨M?ÒÌ¿¥¡ZöðÚ¾«l^vÈ]ª<ŸJžvâ£'Ó4– ‡’珕2Ààœ+ÏÏó¼=×MgA·Ï -Ûn·iÜÅ7Mœ ]ûŒyËtýr¬}=y~g÷•g­7U7 ÿC¡a›fà÷œÜž.7£Rye(J·6~ÐAy~¨?ÇªÚ–4_QžœÅß¾þúó,+ʗ/_>ïÆÈó{ -={-|©+ÜBy>ç"Ï+y>Ààœ+ÏOço6›òýÓã²ív»\.{û“ɤi–~±…‹Å¢g°_¾óPžŸnXKž:¨O_¨´[8ÿé³ÿ¤#M›úú®AÓÖÞPéŠñ ‘°ña¯hùÖOÖMò|àó,‹qÊï>úøy7FžßÓõ'œò|ngoç8ò|€Á9Wž?›Í:gYW–™N¸bÜívëõº3Û¯<Pk»ÝfY֙íÇ)èéHDX·çf‡%z*¡²ÍóÓ »ÿ~“¦×Sý7£§øeÛ*Ïó>ƒ8¡§*#POÙMò|@ž?Dò|n‡<¬äùƒs–O.¤­7#´aå­PgZCøÄÊqZ*}«v¸!ýOÜMò|@ž?DNn‡½}¬äùƒS´ö£ìJ&\NÔkµÏ…NÓÑ°@S¤^oÉÌÓ:lj:Cûñm¤¼\.+ ¯V«ö +>.#Øï÷iø_ Òûx‚íÙÞPµV´mOÐMM‡aùQ`ÜäùC$áävØÛÇJž08'æùiÛ'¸®¬þ¬,pD¤ß”™é·Ì¥?"Ò?.Ì|ª<ÿ &jj™Îþ -Ö¹=#ýétZyt¢³¡ÚÒ‹'è¦,ËäùpãäùC$áävØÛÇJž08§äùéÔît†|­4¹ UU–Ùï÷ý·- H˦N§Ó>õL&“tKRi:}܆µ{²<ÿñí,ýö& --Óþ]Z"ý"!ï¹íãaKGú4TgÍÅwì|ºäBÝÔ4N$χÛ!Ï" '·ÃÞ>Vò|€ÁY¯×wGÙï÷›Í¦òbmH› -‹UVlJÑw»Ýjµjš^ϲ¬2[»IøˆårٔZ/‹Ðý'҇%ÃG78´aMÂê•Vêì¾´ýÓJZ¶*ÔÚ¡ÜÚ¡¹Âw ߥO˄eBýqõÉdj‹›tèf”{*lCØ ÂÎptC›jû@ew -Úûg隸‹†¯9/9ôa`¸äùC$áävØÛÇJžÀåìv»íϚ¢Ýž¶%'¦îçÝ0n“<ˆ$œÜ{ûXÉó€èþþþó,‹¥çbåòå˗Mkýíë¯›Ö -o5­Õ´J(a3ݼs•rVöÞ;þÐ ×SþúÅåø誶í òáûÄoñ—?ýy(›ýððàÔÄ¡äùc%Ï¢žAAe±ri™¬^žÓ^)-qSÓ*E°|èæ)Ê͖¦c³åxi:0[Žeå¢=Ø¿üö׿)9´®rÍ¥<.Y¤Ê—/_¾|®aåûûû¦Ušf\?:µåÍë×M«„·šÖjZ¥²m®ð€±’ç+Š<_ž¯(Š¢t^n÷º®å²üÀQ¥ô¼æt…ŒÕEóüÏ>ùTž¯(ò|EQEž/Ï8ÝEóü–Û1y¾¢ÈóEQyþAM«Èó€1¬<ÿáááÐÍSy~ÿãEž¯(Š¢Èó®Ö°òü#6OQäùýy¾¢(Š"ϸZò|E‘çËóEQy>Àõ{óúu¸iŠ¥çbåòÙ'Ÿ6­ÞjZë˗/+ o6›»»»ívÛ´Êq›7”"=PäùŠ¢(Š<ÿQžpõÖëõ‹Ÿm6 Â-{óúõß¾þúôê©­ÿáá¡i•ûûûÚUÂëgÙ$¥ùêիϳLQŠ2ô1kåŒå½wޕçwn›k €‹úß~øß&“¢ü×bqhÐÑBgÔ2딉dÀÉóàúÉóàúýßÿú?ÿó¿ÿ¢ü¯ÿüÏß}ôñAåÍë×Ú.m>Ÿ¿øÙÝݝ€+$Ï€ë'Ï€ë'ÏžÑ~ÿãrù݋ÿ¯(áÿáÍ)y>ð\v»&“ob˜_”ðŠHRò|àYl6yæe6{£} Bž<½õú_µI~,«Õ½V€2y>ðIJìûö0¿(›M®­ ’çOi¹ü®O˜ÊdòMžÿ¤Å  ÏžLÿ0¿(óù· €´Ûí¶Ûí~¿/¿(Ïž@žÿ4›½9(Ì/ÊÝÝ?µ5k·Û¥oÕ&öåÓÐ^ž\ÚÑa~Q¶ÛkCèo¿ÿ15¡ìv?hJˬV÷óù·E ÿ¿»ûgKɲtàhEö¾ÝnÓ·jûöwåùÀEív?L§?:Ì%¬žç?iIh±ßÿ¸^ÿk¹ü®r¸ÍçßJõ Yöý‰'¢Í&׌Jž Ån÷ÃdòÍ)ZQ‹hLH¯,û>íGYx׈Øf“Ÿ~"ò¸Gçƒ°Ýþû,a~Q²ì{M -=3üJY.¿»ñv;ñ)¡ò,};!‘ç?¯Í&_,þ1ŸÊrùÝ~ÿ£6Ôzý¯žùØlöf·û!PK†Å4,7(üÐÜÝýóÐ ßásÄé¨O }aŸ ?yþ3Z.¿«Ü×O&߸µ‡ŠƒÂü<ÿ)¬þíÌ*ãÂp;V«û³¤Ðóù·7ۆ皜÷ˆ.'Üçn6›»_ -/îv; ”<ÿ¹dÙ÷Mw÷Óéß·Ûk"x¬öj ˱X8ˆ:W •kanǹÂü¢l6ù ¶áy'ç;\BžçY–Íf³­&“Éb±X¯×Z yþ³è„|sö¸qýÃüÚ@¬OzFíÌ-Øï掝Î#n6{£µ·íöߗH¡ÃÁuSϑ]hr~Q6›ÜŽ -pŠív[žrŸeYí¤µh·Û…ef³Y\Ë,}`äùO)Ïêœ-l$<öŽû<À²Ùäõ¬V÷ڜ»\ÝòtÌÈtNÎï[l_=ô‘à‹Å¢¸Ͳì Ãòq@3×o~šÊc‰òüv‹Å?N‰MÂÍþvûo͈ƒ¥˜Ü:ërù]çñåàb¬²ìûCg݇0¬µÛýðØc,àFŽövè“ƯV÷î.§¸ ],G¬»Z­ŠÕÛ§ôŒ<¿EŸD±OY,þ‘ç?iOF¬s"ëdòM‘4öÔçјP§#‹ñ {uØ·ûŒ‡©˜á—u>,3Ÿ;úf¼»ûg{#ô^ìì g!€£m·Ûâ&t³Ù±ú~¿w Ü&y~“õú_g óã-–}¯U«öèìÐ0¿Vé<²n!–äÖtÎ  ì÷?¶WöJÂo܈۰3‡ïêèX.¿³Ó!æùGO°w Ü&y~­ÎɍǕùüÛ#RMžWžÿtw÷ÏÐwE1.Sk:ý{˞t£…;«Ð;ڟÑèÆ -ÇZŸz:™ õŒxbyg~åû×Ö~~ Å/;Àbž¿^¯XÝü|àfÉóSáƼ}^_œ!Ù9‹ò\•yƝa6{SéÄðʈs°#l6yûnJs-ÿè<¬SŒFç¼úp¸õ¬ªój¬cagœœ_è<ÅyPà8ÅMèl6;bÝpëzâô~€’çWäùO3ñBY.¿+–¯Í{oyV䘬×ÿj -…âÀcWä~b[õ9$ÃèF༹qg¬ÞÝï_3žwr~¡sœåˆ:X,Å}høOžçýW̲¬Xq2™hFàÖÈóËòü§>á|X¦²b–}ßgJÿègEŽIçÔVMTØï¼tÌjè<¦FKrk:‡®}%ü6õ›³OÎ/„–ï©·j·ÛÅ[ÑÉd²\.7›MK°–ϲl:ÆµÂŸš¸5òü²åò»>a~íìúýþÇöYÊ'Æ2<™žÃ:fcڧž+ãêœp»ZÝßòî}CÍçßÆ$3ìÃáEûçh¥£³÷γÙÈNe—˜œ_è¼BȲïíƇZ¯×/êÌ©œáGËåR—sÐóƒOIžu†¡L&ß´çð›MÞ9Á²i’?×`»ýwÏG-ŒÈÚwøõú_ç;Y}Û~lÞڎšeßÿöÍ/Ďì<ðzôCD*a‡! Å&Æ,¤À;ì—ÆYðîãZ{`½YÖS/Æ »‚Ç ˜fÈ,fm‡‚dÿqÏNU´ØRÆÊÄӉÙ†3šY:Es©ò¢XL¼Ñg§ÜËáγKiÆ|XzÞîKqÏHÖašë´Dg¤Ï èÁ"åÃF ì@ЧÒä|Žt =Ö ‚ -oÓÃá^¨Wƒü²ÒëÂKý ‚ ˆá0‚.ý_‘•-`YSúðÕqœ¬-zÞùü ˜ª¸²|IwREÜ=ÙF¢h¾TÎs隺¥H%aéYª=»dÒ—&õ£ÛûZ4øëûQÁKHË;£¬:9ŸoJ¢Ç:ADKA^ö ‚ ¢‡¸®ÛG<÷Þð wguunÍ4M~›Q%ÿ°, þäû~͵*g/ôÜç+ŠÜÜþVš.‡çé_èfQ—ùЛ$E9¸=ƒV­¿³òÅÝ4$ gåÊ| -EiK=~XåaÔêpX=Éù iü¥”ÀAQ'ð"¬"7~ãÉßþÜK¯fôg/ÿ!‚ :Cžïa²{á©øžoÛ6ûÆ4M×u‡ïD€KC=Oî¹Ï—¾•3-Eóܗºøҥ¤âÖá8;Š.Ô4×KO8o5Ð õgƒC±ølêÏҔï(¸ 5Ï£5;>wà°íQ{›±žä|†t£ô) l‚ ˆrñ}õ1ƒÁÞÍK/ñù8ýëO?ÿM8à›G¯Ì?øÙWß~'õ€?µQל>}ú̙3O=õ™«¶C]I]IèƓO>Ùê®ìÀÿžç±{IýçATâŽãĄý°ƒb@¡Ï>_jڙ,j®Ä¼Ab)¤‚K4]dAÕ§O)' < ·(ŽÉ¬}ï ÛÛÛë999¡¡Øj¨+©+ êÊ⠇Ã.ù|×uSî ø#ëé_?|+ã8*ç÷ÙçK5»a\)%; g¸j€Ã÷£^5¾Hs,ù±ººGÍöGH‹9ÎNu—vÝ[ŽŽ©,¥äGj¡K‹ ‡w¥Û7Úؒu&ç7ÕwA]%Š"ö®-bš&ÓõüE;‰a1ó_Äç_Ü=f®þüÖ~¼<ž">ÿڝGÆææÑýK{÷6'í؂½¹¹ÉtÓññ1 ÈVC]Ù666¨+©+›¢c>ŸIï,Ý ÿ„°;õ<¯ñªŠ[U¶"öÖ竸Ü»4á–ÞýkFjc(“! gx»•ÓóêU#3â‡i®«Ÿì8;´ì4H#9Þx$®;\¤!°Šb|5ï­ ‚è*âÛhL×Ã[¶išü7–eÁÉðU¿Ä ‰ŠŠ¾Ÿ>·†q¥‘버Ì6zÈv«`ž´L‘¯kséÇJG*x—Ê¥‡3U6¡´QáöaªÔà íLbyƒÉùŠÓ¶º¸ AD@:KÍÊÀç™l¥¼ƒã>Ÿ |æç/íÝC|þædvq÷XL×'‚ ˆ¶Ð1ŸÏ2LÓ\̀ÿ³±šMՕŒ%ç+¦è÷Óçã&°R¯%5l®{‹ê‚©Jº²º5í!¸¿ª4Vf -®¾ÛÕªž7–ŽÌe‡eÍm{¤®ô¡g)ŒU:èti@¡O¢f“óÒgJëÖ"‚ ˆÚàÆ^c“õ<ùëâqŠ~‰ï°¸Ïçß»ú(cäæÑ}Äç_Ü=ޜÌÄt}êk‚ ¢-tÌçóç{*­!ü?cFêuñÿpzèó¥£R‘¢â“)¯²i2ÇC9ìðý¨žúÀHƒ¾nWwKZm¡}jRʽHGfî8£J¤@ fÕ6þ{‹t£V=.ÌU·O­DOÎW¬F· AÔ7© öø_µù|Qàߞ>€ß >ÿ܍èdþÿxíÎ õ5AÑ:æóyz€¶>‰8††aÖ{èóñ ùÒù¤2Ç4×)K¶þ®¯awúWT@†q¥žëG«¬xMv -T}#Åv8¼«É}2-A!ÝÀ_ëi|­¶Ð:$ç3¤‘bx¦ÓÈ'‚HïûÈ_uðù€wuŸùùËãG#ç·&ˆÒ?™?? ÃÕÂTZ½¬ä|†ã8YŸí›Ï—ŒrzáÝÞîuÈÏ츈f‡mj¨ €ÔÈB+ü3®­j€¾éàE ¢’?_|] -ÙJs2»¸{̾?{ý€úš ‚h óùšcÛ¶tw@VbCß|¾&úBV¨'²Ðƒ}YþEÌ Œö6c#þéïФÙÚ%î‰í -Q9jsËÐp›<âßÀjìº·à—¾Á¼¨ÓÍV‡tå¯9‘[šâ®s³ã§þð(¾Ѷ;‚ ˆTLÓdï¡A,ûYþ -œã³I¤>ÿòxÊüü…Ñ!üxóè>âó/íÝۜÌø“=‚ ˆv@>¿‘¦F°,+õã½òùRwQ§ý“æZÖ ïR‚©T™Â µPVV¶Zš‹Ô¼©M%xZ¬þ“oÒ*nA%¶“•zHߏ¤)뢅ú8Îô;ÜHë<¿tgVý= 'u)øþ!­RY9‚ ˆ.Á-:àºnVZŒ(ŠÇaŸ2M³ÜšdùüÅãœüµ£ÛÓðýÉü!âóÏoMÄ®Ý9¡¾&‚ Zùüz€fxVƒ”T]ß+Ÿ+ôš#£h.u;ôú_O;ÃáûQmUÒMè)¢g*¯´V:oyð¼q#a&•W¬¥Oè8X—ªrØöHÿ Mxì‰ÝEýµ’nºÑ³1ñ0DýÉù üYÓÈ&‚ ý±,Kå¥uñ蟇Ðu]ñíð}¿”j¨øüçnDˆÒO¸<Öú¿”ƒƒƒõõõíííùœžS톺’º’ЍýýýÖueß|~žç9Ž³òø`0DQTõuyfB*|"'¹±?>Þ£qwT¿<÷ýHê©ô—Tš#Í®¿ëñ*i›¢‡Ã¬6žÝݔٓ†3©Íö¼qEW‡õPejÄZ²¸„ƒ}ËÚ(EãWt¨¹»›Úk€W¬ÎmkꍩgKRŠ>ADà•9öҚõNšÜ–oÜeU#‡Ï¿¸{Œøü›G÷oOœßš¬íÌêÜë9>>¦Ùj¨+©+ êÊâôÇçAKà†Q©!‡`øµÇñ}?öOÎâqƒçy<íÁ4ÍX”¡ŸEsÏÛöøFÏ 4ib#ÕÆU¤Îv7FΠ…g‡™:¨¶#WÐMåÄJÓtõL)×VúIãbz®HR^ÃܗÅä&¦ÜFÕ°>”•ß"ù̐.õ š^mCum¬0>¯)EŸ " x…÷YöÒªâóá6™¨V„>s2C|þ¥½{miü›7o2Ý4›ÍÚRgE¢( l[†™çya"Ÿ‚¡5DÁÇ>”QQæg‡»2uA`99G§ÔЏÀöö6ôãÆƆJW€„̶m>ÎáG|ï’Ê(Uo‡Ó¤?,ՕúL®>ø|˜#†aœBKª˜æ0;àÒ0UōIŸ/ž2Ó4aš‹¿/îóƒ`S4ð£†Y妹®a¯t׀æ ÆÌá#mkÛ£¦’f¥©’pXÖFývEÚé -4i8LçÙ]]–{n JÒlózrŒa­Æ[¯ y†»€›]öE×½¥[w‡w¥’5¯¶éîY輡@Ú׎O‚ ˆ¶†!“T¸ŒÍGŸ2ˆøüó[“µíññqÇ pEŽã – e¥kÆR7¡üÔ¡ÈÇ\EÑE÷¼+³XÊ7f,öˆçyÒr`̈©¢—êJXMÓDFi–âS¥¶mgÝ£ÊÇYª‹z´…ÖÍÊ>ø|X½¹Ì‡o\×eòÀ`01…^ -©ÿÉ >?ëƒ}~–™¬MF)È»Úú -iv±VJ?¦l/ÆRy¶¦¹îº·êläd˜)u”6x’æEëÓN7Tx{ÂðÓª1a"Hg1XÆa…YʙÃx€6g|~L=ªÎÆGL}² ¡&ÒpFSA϶LpÍc‹ …­7ºÅG‚ ú’wÍ^Þ?øÁJ}þÉÉÉ|þË3Î^?@”¾´>bQYÀ pµTQ,õQE6ƒd9*>Ÿ— -(šR¯õà²EáÖ+V”ŠÏ·,KZ”ëºY>¿þ¶Â#Vbä(iÔsŒÒX­Ô?žÌp¦Ñ®yQ}ðù|‡Ir -ÐíêJQñùYw‘Ïç#Y¦ZüýºñthÛé¬ôó9ü¬¦®!yruuO¥ª ¦qJSôµÚ”¡ú®´†Ãáݶ,GM­H¾5¥ß«8Ùz“µiØÝ1ô—äŠÓG‡<¤ùÚî¹#‚è61—Êúúúk¯½†²··çlll°d˵#ÄçÿôŸßQ/*øœ§ÁÉT”bQ¯¿þº(óÇ¥+üõÙgŸ=}ú4’bÍ ÉÓO?½š—õÆo<ùä“<+8™<ÏʁÓ>ô¡qKÎä†ä•W^ɺÜp8äAÏóÄ?qS -ßdÝ \‘ÛN¸õ`Ž¢ë•,*õd^_b]+ -†Sì|îókn«¯}ík*I¹/¼ð?-k”ž9s&«Vb~òÇ>ö±X­’Mº¿¿+j0$cÌã7˜,**J½¨ÍÍMiQìœsçÎuÛçû¾Ï&r”ábgÖÓZù|n÷ù¸è{≷©UìL©åËJ)¯¨Vp¡’u-knœÅ} -ڕo¿¸„Š„3w>Òýÿü™ŸÖ_«Ôq¥(úšõùҜØWÿþûü ˜J§UjØ®ÎUô³Ï¼Ù „‡öYYقÃ4׋—CWTúõ¯íÒ½ÐڍŸ ¢aò¤Pŏ(æçç;ßA -a)Ž›››óù£÷—ÉlŽøüW¶"õ¢Ráْ± p**«¨3gÎdYúXQpEžkSÜ¬­­!µúÊW¾’šü,ú|äa óÇΡ\ª(•ü|^žŸ=ȃeYHQ| q'5?¿ž¶‚Í -ßøÆ7ð¢ž}öYƒH¥Ï=÷R+Q0Æj•lÒÔämÅ¡i½ª¨¨ñx¬R”J~þ+¯¼ÒmŸÏÆrßJ*Y;¹J§~ŸÓ\_4íóß~† ´/=ûtðù ó“ªôK¯UÎkRâá8;ÏÿùbÆUÑ®À§>þñ«_ë‰'ފ]¨)ç#MÑOæi×P«Ø¸‚ ‚Û×Fj•:Úq|æOÞhÜç[ÖÞãܚÖY«d~ûÅ*îs)7º‹‹îq` -ü…w ágŸy7¿o]þÝß{kY¥Ïùš×vߏ¤kQƒOœØ¸:ÿ7?TYŽšõùxl1ù4ojm_çìõƒ,Ÿï]ݧžªÑsª¸ž<ëtnHðBø D|>^žüœz!ø¥çy,hUMî5è9K­Y'óä®> ìB¸óç]œÚq0á÷<àèû>Rf ‹[‰µU¥xÓI۟§7§ÖF5ŒmÖP0ÚkP¦„ -¥?auƒ|¾¢ï6ëó¿ðÅ˸êI:ä¦ìJÍ¥º/©ôË­•çkHËÇ,ÏüÉ0®Tì -ôÝgŸy76`ªÜ;T˜ å/;J¡Î©éýêíŸö‚ßóx–ܝâ}ÕÑyŸÏVïä¨F&~¹Q9i³çðù_þò—áµ”wŽ²>ÂÏažËmÛ£“““ØGøñàAú8põÔóÕkŏßú­©ÞŸþiØH­ MRÏçw¥ -(¦ô˪Õ÷‡{ð×4ùIûúÌ3ëçßÊj«o}k7G -ñK/Ý®´—íùRô«®W0*Ô«W[­²z0Šæxmÿê¯nÕ_+4”T>ýëÿ\s­¤ãêoÿöê|ðtðýBs0¦Š &Ÿ~úzk»tjÃí7þĉ+XT¥›qê¯?ð'TêÓ¼Áµ}¡¢¸ٛA‘ -¼b§šØÜäöù—ÇSÄç_»sBUŽãàJVEŸoÛ6;MÔ¤‹e|>³¢¿å‰âYP3£\Ÿ¿ÒïSKø³|~ª æ†+}<íŸWÏìùV<|”ÂTâñˆ|íÏ£lb؋DzÎ¢R:ïóy Jú°`ë<,57{ŸŸoÖø~”CHփÎuË"¦ŠMÌÒ/ˆT=5x@k8ÎÜlÍßçwñ(’J2¹6+IÎýzÀ}ô‚ní‰WضGMU .N “Ñ|Ó-ë0ÍuÏ—µöªokb³‰/#•"Í͆Y¯áÓÀ—£:¥7©†í)]ÞµõA=dYŸíÎÉ¥½{'󇷧Ÿ¿¶sDm[ܦ4ÞRŸÏÒ°³ö(šR®nD1Ë ŊYÊð{>jážPºÏ}²Ñö§ŠwþKè) ž‚~ä#_^T|>7áC™*£Ôó<¶×¾&ÛD±ýùlââڄ; ø`†Fãµ¢¸Un&³ùÍ£û é¼Ïç#“ ¬sxŒ‡ªÔˆÏ¼¸a’««{Íõіžr§N¥×R·aˆ›‚Æô¼ñpxwñXb@Ŋ›j?¤-’ùŒ|)ú5 h ʽì5𮆍)­•¶v—³»øü…É˖ˆrG.á¬K5(}i¤ÁÇ"¬“zúgm+†#]Þ5\E ‚ úÉR>s2cºþÂè~ô®îgùü³×ô¿÷ù|>wwwÇažMg †Yj…ŸSPwsCbYÖJ1¾O^KŔÞÔbæ3×G©J9kG@¬+³®ëºß7Œ¿œ™ïQ4Ç ‰¢ÃG*rœÅ©îXYÙÒY–j›¢‡Nšš×R4 /Jc[0´ŸâtÎÒæ0ÅRBÐàpˆûk®± ¹—Màf¥ж—µMƒ×vãŽty×y0AôŠ¥|þµ;'ÜØÏF‡HŠþdöè_ “ùÛG÷Ù÷º±½½½¾¾þÔSOinòERefYJ4$80lŸ/5¥ISÄÿšª‚ `%dù|֕ÀÉÉIò¯®û}ÍM¾x¬¬|ï¦|#'µ>ëÅ$ü÷7ÝûR÷S}~Ö~ të»T79PlVW*îþP_ñ¤Ø¶ƒÀã)܅&kË/-î@‰M@ žŒèÚجYY.wÙsçüÖ¤H9}ðù !´„G‘9[.Mù|ék#ïÚ¸Þ±¬ ÍG—¢Ò‡sr¸©áð.®=³Ì´*îð3fʾ4aµŠ*¬sԆ£aŠ>Lê–îwÀËõÛ3if»¶©Å­C*Ò .›ŠGºnk¾(áku#ïYmc‹ JÑ'‚hKùüÉlÎuýædviïâó¯ÝyäpÎ݈à{ï꾆Jssóõ×_o‘ÌÏrõû|&íc¶Gݔ&MÏg†ord„BW2s˜š Ü"™ÏŽ0Ĝd>?æí91ϟêóù†‹ÜVM,vcc#µ+ë÷ùl &CHêeÚó |hÏÚLiƒdueœ½~@ùùËÞi,ö„/ïUW¦Ÿ¿ÐOžKmd+Þ «PúùÒò¡‹ë¯0œ­®îåˆ#äÛ>ЊœgÞ2øíԟ¢¯aˆA}„ã³Æ÷#}*£sK¶XØÕ7Uñ®®¶=Ò¿ u“熖Zð§¥èAp|߇Rx?µ,+öZ ¿´mÛó¼Š^®—òù‹÷k“›G÷ŸÏ¼ -ÿñòxªS“?âðððµ×^#ŸÏá†D´µ"0a(rkšfêXB€îºnÒØÇ|óYÕHíÊíííÝÝÝÔ¿¶Îçö:¿Tw+ú|èYöhv±»c¿Lõùb¿ÃØpg0,µ^‰Å²®ÜÛÛË:§,ŸŸUN†Pq)ŽÅ8T¢0€“Iø0ìùÜas규#€Õ -²º²tbæ"EuÌçóўu u˜°\ìØdó·æz6èó¥B²æŒDÜFjžÎ'RDéC§@³Ã­‡ëÞZYÙR—]¼døl¹7åû‘mª“ùp§Q¤ãnV<"V³õ•Zèúã %6fBUjwKŸ\„âšYÅH†KK—ÓV,MZm¸“þw¡DLºs¤EÑg‚ ˆŠ€÷PÑðH3¢KÑ^Öç¯í1mrîF´t}ò`'œßš°/Œõì$GQCR»‰»Ç‚A©ÏgDQÄM+•:˜Û/â_<3¦µ“n0&îÔX¾ïóñPʊ'¥|ÏH,;ˆï…šºà0· ÉÖKýýåñ”?w -^¢o>_ôù Y]ÍO‡k—C“:"nŠ  à°¬²Ä8”V*‰¢¹çña£U…+E«ýö&ç+N™zê/­,S­ <µeÍT_á̲zAºšµEÛâq(¸ÍÞV&7øÿ$m ôATAEÉl|àS%æs.ëó7'3nN&³9×õ©œÀM‹wUÓMâA¨‡TšÅ4ÍT£ÅÅc2%8 .Å}>ày^RuÏ † %§Î è£ÜÁ¬ ›æ‹­ù†ñ—xrþ¢2ŸŸ´÷IßåóÓÚ¡„TY-ŽÛÜ>Ÿoëƒ&P¥üŠ±}(Å}/TŒÏÙІôpL…­N°$F‡ì)Ï£‚W!ŸßÍú|ߏ4q€Ò\¸Ö)_é•~ƕÚÔSÍággÙ½15ZóÒÑ$E¿íÉù \ç֓¢/µ»5ç9÷ -ÆêJ?uÓ²HWi¨O[ZO«”x­6 T7pîFÄäÉÚÎÑÍ£ûˆÏ‡‚l¹´wº¾ -DÙ¥¢:y&¶˜·¼XÆçÃP¬ÔçÇٲ†}«©Èç/ޟŸL×_¨ù|‘ xDYè‹]jDQÄï]܄¢>JÅr·¿"lgJêvBÉü|ñ4¾ðo?)´Á|~#4îó=oÜø«÷px·KRE¤¥}TµçT$ g0œl{$Íiì’‘êÇF/®%ëÉl/ŽÔ¯šæzu#J–ƤŠ'„¥Ì©R4µô*­‹#k"Ò5 +”‚ôŸJÑ'¢‡0o–TRà|®ô“Tqrøü‹»ÇLžœ½~?">Ÿ°¶sÄ~<¿5¡®¯.7bŠ> žçÓ§ê>Ÿ›U×u“c)‡]a™Øbi±a¿ì(í0Õù|Ñá‹n?ÙÅ|„ð|û,]ÏC?ȨPôù¢ô}*ü^b÷¨>JáŽø®Üí«RlÇA û A dÿêyôOo/ΟZ\,´DÏo„Æ}~Íñ×Õò¨q¯ÒöœØJ•¾m4tãP%ߏ [cz¶ÁMÕ!MÑ7ÍõfX‹ÂaRÅZ ”îqhé.¡–²Ô² ψe—Aé^Œ–¦^㱞æÒõ°u<<ÑÆ;"‚(Ϧö?>„Rר¤xç]“ÞÉõ -YîÔÓþù5 Qú⍕©8J¡pöŠ­´E|>û ´ 2 àº4ȳ·dÓñýbO?dþfèû˺VšNœY¹©¹‹ñù ™C³¬J[@úú_ƒ‚¨š*”¾i®·ÂÓÁÔóÆЖR ]i'žUÞ®p˜t5¨(I®‹‹Ð–ÚÝVãûÞ)±õPe`À9®{KºXµÚØhpwÍ®W t¤)úé#¢WðW×ÜoÊ%¾Ãæðù'ó‡ÜÏߞ>¸´wñù×îœLfsþã愸UÁ»’õfR| ®(á›äþnH<ÏK;P‚hQbéôE|>ÿ¬ã81¥?r½\J «íTçóB"tê& Tñ.›Xiðq©Aö©û| â†Ɗ…mÛ΢±‘–:Èaâðñ–§Èí{ùÊe&[ZOë'¼;`p&ÿÊ.þÄ»Ð'wðtÕ硆zêàóƒ`Ú`~/ž[unsm”«ô]÷ÙE}€¾hÊw)9_eA¨(ÂhÛ£NÚݶÏ&ènÅUfYVð7 gЃ*¿í›ÂOo|ƒ@PŠ>A§í>¸vçäüÖäâî1|óè>âó×vŽàœ³×؏ì#DEˆ’w+CüeVnsì489&ދøü˜§…Y} |ß•Þ7*õù<‡<µÁSÅ»èâLӄXßá^]Zlbæ<¿(ä±`Dª_ÊpBÉ™RÄsŠS ڇ54¯yj ­Ïˆ+Cê(bå/¼}àôÃÇ>ÿÝ"—#Ÿß[Ÿ¿½®V—~&¡•&6×>&÷ú“–ß7¤[Ñ$êRr>_¤Þµ\».Í¿íLT±ÀxF[²Lã«G*ÝRøÓÜuoUwi<¼Ïú–6©4ç¡ÒV%‚Њ0 UW¾ï—˜«œÏçÇ@|þÙëpÂÅÝcöãù­ €Já³IŸ% }¾iš©þ¤ˆÏ_¤yZ˲báƒÞR©Ï‡^àIæÛg‰wX‹#M8_Êç/;^1XR²ò±ká° Rê+â9¡@¾a!õ¢©¶>#­¬Æ‰þÁÞ`ÇÊÊõ"—ëªÏ_)@ õÔÄçK³|+J?ƒ·`üºËBwœee h«–&7ö©….]v/9Ÿ!ì†q¥ÄIÚqAkœ¥‚¡¶=‚©!ͩ•JõꞪ †ªv·wCADx6æ²öFÔA¥¤q–âó/Œ¥?™ÍoOœ½~à]Ýߜh´ëàà`}}}{{{>ïږíÁ``Û¶˜® ýëº.>ÞàS«(žç!% ‡CvZî'0¼á㢨1 nDºêpW¦ÎYF‘“Ù/S–$¹Âð.Nþ ~ã8Ž(«aøÁoTƒX¬zWÂÉ0¤ÅÑWd£ ýðk!àu^ªý³&T[Œ^Á0¹:±*eVòÀ ²=ÇöW>ÿöKEêÜUŸ¯y=5ñù ™Ôª"O^jíªÛÐ ¾‰MmW˜®‡›…F†šŽV'ˆöèY|<—î|ðÄãVg•K#_¶=*åBž7®çBDñù…oæ*å¨Tw×ÞPŅÃpÖHV@=àwG>Ÿ ˆ^!戦ʱTƒ7´ee͕âó/§ˆÏ¿vçDÏ^ØØØXÌññ1ÉVC]I]It¯+ù^¶ÔÝ"¿ä pÿ½÷žÏ?|ËûŸEêL>¿-TäóñHøRúà6²í¯ÿD‘¦û~TÖµ¤á°Vï戢¹TÞoL•«Ð*¤A0•n¦(xtc¾ñ ž¼õ_´Æ 2zޘ¦'A½BLdeɇ®ë²ÔP–2mÛ¶˜Ì ߗ’œ¿(Éçߞ>@|þÚΑž]póæM¦›f3úOµÝPWv†íímèǍ êJêJÑ®gn^¸¶jþfÈ|þïœú_ó%·¼!Wì@Ï_–(š×):ðð%¼m$¦ø¨.1g´:9Ÿ Ž´1 ¦RKwT±/‰(ô¸4j–ûèÌCGš*_Åþ¯F6Ôܪ©÷؍=AKE‘mÛ§–Ç4Í ˜²)ÅçÞÕý,ŸÒ¶ŽIvêJêJ¢{]麮eY™Éù‹ÅÎËÎ{Éù‹ÿj¾T°ÂäóÛBE>!³[%&õe½‹Çpx—–¢uàIªe)ân'çs¤æZ;wá*ÁÒt-e9Ûu©»ñ¹Ïúr/‡GߪØß×°hÄþu«ŽA´ß÷Å×RÃ0à½53M1eùü £C$Eÿöôõ5AQ.ƒÏÿÊç¿â|³`iäóÛBu>_*¸Êrì•j:‚h(šã±*økÚw>9Ÿ!M3.’i,]…|?¢ñ¬-ƒÁ¾4(¬rÀdÇMñ)©aûà«P¹Á |6uéíæycÛÁßPȏ " CÏóǁWTÃ0bÙøðKx]õ}¿ŠK—åó/§ˆÏ‡¿R/AåbÿÇè=Ÿÿó_ ¾[°4òù2 àF kÄ_Vçóµ$õù~„ Ú½N´Ïã#¼à<êIr>cuu¿Ù|û†pÛ ¬„4’5'™,½¬Æïvf5Þ8%®Ò¸[÷Â%A„”åóoO >ÿÂ萚š ‚(Ãøerþïœúá÷ý( -•Ö1Ÿ·³ú˜VßS÷±»¨ÔçK5WÁsiö2¥ÅÀ4׫ÛêbÛ#<Ö·Æô¼ñ²«´Ìn›ÞÎ]iYêf‡ã씵ÑLs\÷V遰¢ÐAQeù|À»ºŸåóáOÔÔAD¢(bIڞç…a(þéÔ©ŸŸ:µøð'ÞýwŸ¿÷ôóGýãéú/ÿïý§,AÇ|~7¨ßç/döluu¯Háø‹?½ûÝ@šBŸ{œKSa ÎÐ66¦a\Y*Î(Íù‡eŠÆp‹pœß·HqmkEm‚ B¤DŸatˆ¤èߞ> Ö&‚ –b0†qJÀu]þ×uúò^ŽÄgÍêöÿð¿½Ey®E>_Cñù¸ì*’ýÓr½Ahü•Z› ‚PÇ÷ýSi0¥‹˜ÌçÇÿøVž2ù| iÄçGѼ - XÖFßR‹‰Þ"õƦ¹¾¬7îar>_”ð`E3 hÛ#¼ÏÓèm#A0uœ˜V0T˜Æ§¸ .ۙo‡v+r !ˆµ¬ezÞ ùŠ%mqÝ[åê÷~&ç3¤f‰ÀïáãÒ\eZ…ˆî! „Á˜Ï½nH7ÎІ;‚ ¢: -úüÉlî]ÝÿêÛï\Ü=†Ï^?Ȳ+pµ6A¡H©2ÿ /á™rîFô«GYOœÕäyâÏא¦|~Lñ—ôe3úà¥^j†Ã»ÔãD—f•Ã_Õ}Wo“ó9R!ŸLöýHªi":Œ4’‡mr”,W„¥ö'‚ ª£ Ï¿<žŠº~mçIÑ¿=}À>5™Íù÷ 2ŸÏÇãñññ1 ƒ¶ÓÛ®Œ¢h8AЙ; -Ãpmmmk ûnÙuݕÇÀ7ð‘Š* ; VßÃ÷ýê®E³2 tnRæhå?ðgʗ֐'NŽ+’Ïא¦|þB¦Îgg©Òl{„¿ø/[ A´iV¹úȗzé'ç3¤ .äƒ`꺷¤1ÄR¬&AhŽÊΔe£Ò• 8‡Ÿ ‚¨Ž‚>ÿöô¨ë¯Ý9AìÊ¥½{ì#bJƒloo¯?æää¤íýÈåÆp8Ì}²hHÇQ¹®iš5H•^ueŽ~ ü7\HªÌ謓ù²@«Ô ÿH¾Å„ñ£ýJ8}úô/~ñ‹ÔàfùUØ톡2ìՉ¢Z@Û"–e‰ 㔠(Ú*«ÂâÌÎA* Åg%ôlòöÿèÏ^@ž2üøëËyÔ(ù|mW¹F|¾ôm]]ú~„eW:¯"‰ÞbYÅsÂ¥©þ=‰ˆ­®îáišëp,¥ñsì• ˆ«‡Ê¤€'µb*2&µÀä<—ÇÓÉlŽ–ó[8ÿÒÞ=1¥¿A677™nê@^wé>ß0 i9Aˆž­AŸß¥®TÇ÷ý¤o/Ýç*ùÿ¢z-âó766>ùÉOB!®ë&ÿE\Ȳ,ø†ý& CøQ1è Ül–ɱm›×Aä”2©!3ŸÏà -©ÐèÊ"³’ ï$_Z{[Åç¿~9ÌqQòùÕ1Ì õ¦|þâQÌz÷‡*^Å$PÑééÿ–µ!-Dê±ûã¢óéúÒó“ ¢EÁTÅÀÃiÒ¢Td>M(‚ ¢Šûü £CæOàøñìõıÀ 7î‹)ý Þûáááöööîînú±tŸø¾—㺮&>¿K]©3Û±äüE5>?U­‹ÄÔkŸ]ÉRôSãìB±‘É2öU‚R X`Âó<î¡Y˜ZäF=Y‚øÙ$±HA²aù„ÂSKˆ)}‡èÁÁÌʽ½½¥Ú߶mÇq`xÃ7I™ÿOþ¶ŠÌ‡ãÆFžÕ€|~uœ*FS>_ªáõÎÁ­¾ëÞ YYÙ¢BtÛåi…ál8¼ëûÌ2JÎçHã#9Ó\§-BD·Qñ𖵁OE™/-‡ ‚ ŠSÜçÇòí×vŽÇróèþâý)ýÔ¥P…ÏO͉ÉÉ}~ogn2/½ -Ÿ/Í~‡¡R–Ï L–Ã*–z*#‡‡HØ-gèy2æ¥68 CÑTÏËNd±±hNgÖ±Øä|ô?¯"óÿûÚF¾ -Ï¯Ž–ú|xWysG¬¾JN`òŠ‰Þƒ\:‰ß÷#¥M8` Êú¸¢Ì‡ÕŒëAD ÷ù±|ûkwNÍriïÞBHé?¿5¡.(…r}>ó†a …A žL>¿NÂ0dmîy^ìOåú|Þ¹xö;Óàüäâ>Ÿ._Í®EQÁ‹ò¨„eYxilG@ªW´Á<ëAʼn\|ÝÖÞé¬ R¥îç^zUÅçÿõ•wòՁ|~u¬‰>WýèQ÷fLHÆ>nYø§VW÷ôê*‚¨jØ+=«¼‡ÉùŒ(šã–ÊÌ'™Obm‘ÎetÔ<ª Èíýa|àô¯«È|8®Žþ%_È緅:}¾J‚}LŽÁ[?û¬ç¥'So=¡DM;\þûŠŠ4ô…ãì´ÎäÍçsšM¥ó½ï}ïàà€¢¬+ŠÓd>AQ'¥øüó[fQÖvŽàdz×Ór2(:ÿÍ íG+r}~EìÇq² -aÂͲ,nÀ’R%îè8†aÀ™mqŒ‚÷N¹>Nzu1¸€\Ú󼤤…3³F,œ i¸T’í Àe~†©ù½1x| -ó"r!ß÷EÕɀ–WÙéÐì¨f½‰$çøŸQôù{?#Ÿßqêôù/·•#åÕóÆRi0Þ¥Þ$úƒb‚ëRLÏÞ¶gŽ¥ Ûñ˜cë¸zõêÑÑM%¢*azÑÌÃ7*!’ùAD͔âó/íÝcåìõG‘ýµ#Ä´0Ï? )×çÃ÷,íÙ0ŒÔ‚ àÉÉY>Ÿ ÏTLÓ¤\ý|ð†M5´¥û|îÕ³²Ö™†eZ;µ´(Š² -¢ãx -zR°û¾Ï. -’Ž"$Þ$ÂkˆìIQAÑóËÅZUq"óÐIìBÉðY,z¢ÿ¨fõL­ÿÓÏ“=5V°Q -*±E˜20_HæAÚRŠÏ¿ytŸ»øqs2CdËÅÝc8¾Š!¢ ¥û|®×Rõ&OfÃ0՗Âï™q…¯pòð=àž¤mYu\X¨…5~ò¯¥û|îÕSÓàaxˆÁ…ÔÒøhßÃil$À7¢|Nfl¨Ä‚J¬4(J1¤èó˲¸*åˆ ’o"óé)–ÀûڍÚø%\Ž§¾ã{„8à›ä>Æç^zUÅçÿý›Û¹«A>¿-ÔìóäûÛÅAä`8¼KÉù%²ºº'Ý+亷vCÄûpœ•†d>A¡-¥ø|à܍è«o¿s~kߟÌ"²… |ÑùOfM¿ÒÞòo:‹‹+Z?q·‡YwÀå†ã8«2¸.C|>ONfG/Þ­LȧúRn,“ZRÌÖ.˜ ­ÔîƸÎÔP¥=XÓemàÝ}$ ܨ#>ñžk…“—ã%@·.Ò|>H©+ ÷Ò©Á¹àIìlcHê˜Ìîz¹Ï­àHcjƒ‹ñ,Öh©sñùð'îç=Ïã¿gÝJ íÆ?’ükãðý>l£GÖþ‚â3ð¼øÒÚÁ^ŽG̏7îX(È緃ú}þãáq^íËòƒÁ>õ#ÑOT4%ç«cÛ£TÁíLŽ‘ JÙ.D2Ÿ ‚hŠ²|> jy¦÷³v&ÿñæÑÿgßÜ£âªÎþŸ?»Þµº^úÇûG»Ö»Þù½ï]ËÚMâ-ȍÜu !$$“û ¹z‰bÔÞMÆK¶VÆKÒX'*jm©£F£fLˆ¤Da A,r ad~ϜÍl7ç²çÀœ3ÃÀ÷³ž•3‡3ûìËs2Ÿýœ+©ì‚3%‘ÃcÒ&jý†!Ê ëH|~$fSõޘË7æ }©æTx!q²ê*#Ԑt y—ðÎ7[°¢´ŽÜçÓ@k¼:‡Ybš*ìWýÙâêt¾¹#ÉNÜZÓ+ô‰•F˜iêAùüÄӠŧ«Ðwf$ÞƜ×ëåÝÅvÄ«–_‚d‹-åð]!êñ© =ޅ.Ïd¿äæRrì˾6,àóӅ”øüØ$±Á꣨ŒfB¡+%¯Ø³NII3“Ô±nwm   Oˆ‹¢„ÏEXnR…>_äxÓ%‰r9ÙÝÅ®hìdåúÝᾔ]’N2Ÿâ¨qý°>Ÿ×Nkªè¹ …B‘x>?ɦՌŒtòùrÈ{›+t³lôù4Ðý6Õëãû24UØ+Ÿïr¹Ø„±ßGà³H2ÏÍ4õðôùfM²¾õ;q»bxŸà`»ò«>–9gQäæò豄j5áóӅúüØTIÈê‡B=D0š))iZ,­;·»–þ‹8Á`v¤)ùü‹]½åRVÛ>®½µµµá£§ÓÌç6¶L\nø|¾Êxð_¹ÏçžÍãñˆ‡¹\.z‘NÂ~5ô¥|/€I­2¬F¶q(«ªªêêêÂá°þÝô’ùˬ™ÂâÃAÝw&pa.÷ù‘X= ½x·¯¼JÜðllÂðêë@  ˜WP‹C©×ì4‹Ì®e¸Õ盵“š!ÖØkZeÑç»Ýnýæˆ(ÃéZƒƒÝ@IæªÔw>ë ÉUS¿Ȟ·³SrsÙ±ÿr"m†ÏORîócf(V¿¤¤ #€DéÓ²¢ðz/Ð1ô_Zh°÷‡ðû[ ó¤#ù|ÂwºÅL¹Ð[ÃáÚ«‰OßaõùVJsÍÖø|Âív3 Ë_ ƒ|〽bæK Kmé#œpû4’U*úwÓ«>_èlقëó­¬h³ƒõ>Ÿ›qìhbhž0<ý ;RÄårº}q(‡ Ù³upyNŸ¨—]A³a1,Ú`ޟÔ3bX٘3;'GÜ)àçO•Û—¯J±ÙlzÐ|з_äÁ¯Ð»»¼Uâó7nUi3|~º0L|~lÚ Âê»\UŠÆ‰Þ|{|¾æ’’&ú—Öú|<žzÈ|i‡s>¿¬¶]b]:®¤üÚªªªš+6¥“Ï¿0¼‡|>/³ú?×ëõ²W¸”Ô?Ó[lGÀPìÛhõÙP==\~:ù|j­•›dŸÏ7Mö -M öŠ_h±ÙG+ŠBçä…úá,^K]]cuu5 å|þ˜AÂ/p°—®ˆo -6 æ‹k° Ù3+îñx$OF؎8”q;“²Ÿcf(óL¹ñÉm¥èˆò”ïX"m†ÏO†•ÏMž»\Uq Œ%0ÜÈ̬†Ì^8çóÏ|Ý-/Ãáò;;;£®ébeäLIµÓ‡|¾¢(ܲW˜’ÍÌÌäÇH|>?I  wEÃD®5ÃýCi](µnøGÜÑK•ÏÄü3¯`çÏ_ˆŠ8îGƒAŸÏG«qû|›@Êdú|>9E».og Ùçeâ>ŸA+Ëï÷S¯jܾ¸r&ËW¥¾WhˆÛíV^vO(è’ÜV¦¯oU^žH›áóӅaèóô_bõÝîZŒ0ÜP”pFƧùÒç|~[OX"^JÏ)è|qÈç¬À>###¢ÊXv€ÏçãÄõù"Š¢ˆõâÅV žO•Ïçͬ )Á,«ø‡ƒJ&tQáêKLJàó%×(ŸŸüê,~ðD3‡‡‰Ï …Btul¼¬oX$ÃÇ7DgëYôTáÙc_ TDNxi|~º0l}>ÃÐêgfV+Jc C‚Á.È|púº]¢’ îðz½Ù*ÌMZœóùDé9Eâ^ºÃ}˜ÏváœÏ÷ûý\rû*ÖÕúR¶Héo @îܬÙðÞֈtý¶û|>j4 xuºfˆõgãÛìY ^篟º|î%âë,ú|~uVßØÒ¬…È`|>ßÕûpÈ>Ÿš!¿3ÚҙÎÁg”!*ÔU’Jɱï¬}‘Z¿-ë >˜S°8ÿÿþÇ5äøàĉ$4’¾õ»ÝµÙÙçé_`˜C7k‰Ì÷xêÑE†5*cHÎãDdZ÷§fµ¢±S¢_Î|ݍùlÎù|EQ؋‡Ðfffj–›~I²#YU¿!ðùC#îVˆs>?SÐ4¸\ÂkŠêõgãY|¦ÃÊg‰o™ý­¬??Â/Šæ­dŸ—.™«xúÉ×ón¡Ïû0Ÿoq£gxú|±ÜZË'ÿ;î°ä†Rx ½rï5‘ÎP"̀ÏOÒÂç ½ðxê!óÀ!¬ø|+ßÇáó5ýé„Y­ië‘è—òúÌg»pÎçn·›‰GC¹jè ¹54±ôbâžvÔÂÂl¯ÄQŸÏŽµA¯ŽõgãžÙåriäDu㒭6ñˆDž¢²î±ycX{ Ÿ.¡³‰Çè¯(î݇®…¯}«¹1ñ†v—-éâß?og©ä†2v~säõÌ[ŸŸ.ÀçÀ ôJß뽀n€ÄÏw¨?ª”–èßi<~nŽú|^KÌ…B⻆¾TttZ:{d†~àŸb¨CA\¸˜Õ „f8œðùïª7ކgëÞ½^/~Š~æ›D†ù<îSVT]z0äMbM½]¢B­åeù’þ1ƒAó¨K$±“¸N©ÏëgŸÏÇUÿð|"FÜà0“ùDёJÉ eåüÒÈ'Þ[ŸŸ.ÀçÀ!*+ÿ]RÒÄ"êA‡€-Àç;ԟyž²Úv‰¹ØՋ)m Žú|EQ$Ò̗jv4˜éPÞ±fäÎù|BtÚfÕ隳Ñaâ_éñx<ú¶ñ½Ãw­3(ŸÏ>—/‰‡7›½Öe¾×ëMp!둋qjö0ÜA£&‰{(¾óÝÿœºp)ýð½ü·äV²»¼u磕ý½!Á{ -|~ºPýÙgœ81ähooG@ҀÏw¨?íòùÝá¾ÃçÛ~qê_Ǜ.ѯ'›»$†Çëõf«X‘äfó×%¢wÈt³·hqéÕhFF†Çã1¬-VàþÓívëßåÃa¨‹-Ì£0œNü-3møµ™R^ÛfffîJD„m‹@ HwIæ§úPþ„½(?Ov#ÙøûÞþ»äØt§XûÄѱóó%·t÷I¤1ðù€íÀç;ԟvùü†Ž+\­Ð¯»zs/ ]¨Œš|[àeØÃÓÐJ…B|2ÈÏJú].WjL36§.õ-ïça¾w¦ß}àL(XÏo…ž‘ÜJJŽ}É~(«M¨î>°ø|‡úÓ.ŸßÖ接¦­‡^9x¶UâaºÃ}t̙¯»égß閆Ž+I»öp8ÜÒÒÒÙىe•îÐP677ž¡ …BlÙú|¾9”ï¾û.»ÀAՃ´[•¢?×ÃþÚ'ŽZ‘ù'›»i3|>`;ðùõ§]>?"üŠÆ¨É)¯ï¨æüŸoc¿ÒÁI»öººº*•îîn¬¬´f¥×ëåë å-·ÜboRÃdUúý~š´4²ìé þ¤‰žï|÷?ùmBîóÅhë 'Òføütáþ}÷,ÎrTöú’|¾Cýi£:ã¿ôœB¿Ö´õHô øì׃g[“ví555L7¡D?Ý…C©(JFFÆÈ«`¯®®~óÍ7‘œGÆPjV%Ÿ´ìÑþ˜‰!cçç[ôù¼>?ñÛGÊ}>uõ ݎyG™!ù/Ðh `qþÿýkÈñÁ‰X¡4àóêO}þ™¯»¹ié÷QHT 30 Wø+»z“sííííuuuXVéÎèÊ@ 0òJôi(,X@×åõz1±ÓšÖÖVZ•MMMü~»!‚Á ø«ž…ûaw„¢#•»ËOY)ÎgO„%Bj}>õ -ç1րχÏ€t>ß¡þ´Ñç‹¿¦­‡^)=§H$L[O˜Žá¿žlîÂ<À -,¤}V³‘‘¡( -Æw$!ç³Û¼½äØìŽp×s/[)Î緛DH¡Ïû>?.ðùFÀç;ԟ6úüˆ ðËë;è×ãM—$B† ü²Úvöëáóm˜çXAQÊ`Á`pÄ\Q(¢+¢1¸# ±Ÿ†Øï÷KdõUÙ³ù ¢ìØ3}~âL¡Ï÷z½ìs].u–€ÑçÓÏù|ƒŠ .  iÀç;ԟöúüŠÆN&Xžm¥_/võJ„LYm;s²¹‹¿ÒîÃT€ƒ¦8Ÿß‚ Y¸ï‘þ;ȇ§J߯”Ü>v—‡ÄûH‚¤Ðç»\.&óñdŠDŸÿÏ‡€á |¾Cýi¯Ï¯iëá¾¥­'L¯øN·Hœ @‡ñ_éÏ1Õ`d )΃c¤ì.?Åîw=sڊÌçÏy%H -}>ûP¿ß? -§G(òx<™™™Ôô¿‘¸'Àç@ŸïPÚëó»Ã}\³4t\¡WÊë;$Z† üƒg[Ù¯t0¦:ŒB¡¦8ßãñHd>Ão ÷Énwªã;Ålã8ARîóGáHü~?Ÿø|Iˆþ¹Äþ•°Äöl;|¾C>Ÿ(«m5˙¯»%Z¦¢±“Ž¡Ù¯϶bªÀÀív‹ÅùŠ¢èý­ˆßïg÷‚]‡ë ´Kno~úÕÅ®ÞãM—ìz¤+…>ŸÕQ57B¡ïpÇS©âõzãþa‚>ÿÅ^ ¿B ,>8ñCk}‹@ #/ðí04D]o ðùùüîp_CÇ^3I?H´ ø5m=üLõQ-F¶Ýæ÷ûEA‡€Ä¡‰T#nÑïÈ# ú|>ZSôoJ.Ÿ -ÛH¼›xFFFÿ_žð¸Ç$w’c-Á`»í)(U>Ÿ’ž7âaRÊÃIÐç‹Ž@ ò=èÐGß"ÄȋÑö} -`ðùõg4Bé9E"g.võòcè_LõAáõz³U‚Áàæ¯>k†Äãñð?ñûýCn¿¢(™™™­7Êצ€fñҘ²á°âÇ̦¡äÃÊl\hÂð?¬šs‚P(DÍàÏa‰óŠ•Ç]f¸Ýn‰»Î ú[æv܊n.K9¾¤WÔpŸO=¯¨È‹óé–ÔŸžr]•Ý#¹eøÊöM¿ú|‚åÀá°|’Ÿ ƒÝÀ…ÏG àóŸH#àóêÏ$øüãM—$ræds;Œ‰}0(˜Ù³8ŸÍæ¯.Wü;u(2qC€‰GŸÏǬ5,33“ @ ®Ô9ÌW‹ãȅ¤•mv°&ÍZ©ëÍyÊkŒ­Ü&hÊÎ.qÈ1ô®ÖïPôA No6|Ôó†çaõÞt™løè_·Û’[^ à[ôƒ¼[ú'ۅ€½gá¾É-cìü˕•—ímjj}>ßÖdÛ£•RFÀÃ&üBW=Ø¿…ÏG àóŸ£–dúü‹]½9sø|[’¯½µµµººº®®.§û8Úî󉸥þ>ŸÏ.ŸÏÄ£ø -+ëµXó?’†Ò:LjV®>?nQ7¯ÁN<™ÐPVUU%2”š¢tjLI ·Û-‡gffêM¸uŸ¯Ÿ´‘Aî86` ßpéÑ[ú]9öxBÒ¬f(5;€²þ<áq ì.o•Ü2¾ó]꼑ãóك!ò‡ìʷÄA%+ 6úüŽýяfŒ¿zÆøçŒÿIÎøŸª‘™3þš™ã¯9~ìÌñã¢1nü¬h\§Æõ³ÆÝ0{܍³ÇޤƄÙc'RÌ;iÎØÉs®¥Èšsmöœk§ÌÆÔ¹×PL›{ÍtŠyј¡FN42gª1k~4fÏϜ£ÆÜhü”bÞÍ?‹›Õ¸E 7Å-?¡¸U±ÈÍ…Ñø1‹E±Èb1[£‘¯‹%ѸÚ, -îqËÀ¸™Ç æˆ%óÆ܁1g`̳Ǽ‘30f1Ý ò£ñ“hLSƔ‘=0²„˜¬‹Ic¢úc1‹›DÞM?e±hB,T#W (&RdÞªÆsO>æÐ2ÏɺvF,¦ŒiÙј‹)Ñ›‹,Š)ј‹I±˜¨ÆŠ©ã(nŠÅ±¸AëYLw],ÆGc¼ã(¦‹kcqM,2cñS5~‹ÇâêéÑBñ#5®šq ö+{ëêœh†añ!Õ°l™ÑœÃÒε±ä3VHAãfõg!<]KJ7Ì{c,nÏQ,MMRÓOVY±”•=·?k©‰ëÛÜ՟¾bLŸÇ4©Œe³Ù&9MŸÖÌ2Û­²ÌfœÓX*җQš²š…ÔD4Ø\do:Òd¤¸IÉƼd˜$©IŸÌ”>G¦©Üþ4õm¦¢pÇâ–XÜL1©?æÇb^\37s(&÷ÇìX̊ÅÌXäPdQ\+É]†é‹g0yÓç1ÃT¦Ïf† í:]BëÏi&iM’Ùâæ·«&fÂçÀp#™>Ÿðn‘ø™îp_2¯½ºººJ¥³³3ÝÇÑ ŸoX~,ÂJI÷KÌêÍëÖÏ9’†Ò"\jÑ Ÿ·zVStH2Ip(Ŗ¸ÝnÃfñêô“\¾”E¡‰*®ÍaüäfS7 Š HÐÊòÔ_©ÙÕ%íé ýPj¶ZL‹ó‰2¾ÿCÙþoÑ%óªÛۜBŸ?¨$ø|}þ5[æM{sÏÌ¿ì™ó×Ýó+vßZ±sáßv.~kgAåŽÂ··{Ž¯9V¼þïÆw¼[ßÝæ}·hû{E»ßÛzÛû[ï<±åî6ßóÁæû>Üüó7ýêäÆß|´ñÀGúxÃ#Ÿl8øÉúÇO­{âÔÚ'ƒkŸútí3Ÿ®=tz͑ӫŸ;½ú…3«ÊªV=»ê•³+_=»òõ³ž?æùKõŠŠs+Þ:·¢òÜòwÎ-?þ÷Â÷j -OÔ,ûðü²Î/ûøü²Sç—~úùÒӟ/­ú¢àìÕµKÎÕ.©©]r¾vÉuKjëòëBùõ¡ü†úÅê7Ö/þ²>¯©>ïŸõyÍ ÑøWC^Ë?Q|ýEÊŠ…mþ[Ž ¹r/5F£«1·[Ë_F£çËÜ+ÑXÐÛÔa5¾Q£/·j"b_Þi¼5ráÖ>Š,èkXÐW¯FhA_݂¾Z5¾XÐ÷ù‚¾ó¹}5¹}Ïí;§Fuî7Ÿå~sVªÜoNÇâÓÜo‚¹ßœÊ ’þ87üQ,N.  Æ‰…½ï/ì}Owö_ØûŽÇõ¾½¨·R·õþmQo…]Ôû—E½o.ºòfޕ?ç]y#ïÊëj¼–w¥<ïÊ«Ñèy9¯çh,y=/åõ”åõ¼˜×óBÞåçcñÜâËGÔøãâˇ_>¤Æ³‹/?³øòÓj<•ٟ¹4ÝOæwÿ!¿û 5~Ÿßý»üîǗDã±%]Æâ·KºYÒõ𒮇–t=¸¤Ë·ä‹K.=Ðüû‚öýÊþ‚ÖK[,ý—oéW¾e;eÿô-kò-k|pم—ýã¡Âú‡ -CÖ>\øÅÃË?xùù‡—·|ph™}ríK¥kËJ×¾PºîùÒuò¯;â_ÿGÿúCO­ö© Ï<½áé§7øŸÞPúô†?<½á‰g6üþ™?»ñ±g7<´é·‡6=rhÓÇ6?xx³ïðæ‡7?ðÇÍ¿ùãæ_ÙüË#[~qdËϏl¹ï¹­ûžÛzϟŠJþTt×óE{Ÿ/ºãù¢ÛŸ/ºí…m{^ضëÅm;_ܶýEoq™×[æ-*+ÞZV¼ù¥âM/o|©xC xÝÑâµG·¯>º}ÕÑí+îXñòŽå/ï(|eçÒWv¼²sÉ«;¿º3ï՝‹^ݙ[¾kAù.÷k»nym÷ͯïžÿúï™óúžY¯ï™ùƞœ7öLÿóžiÞ3åÍÛXPb™þ果¿DÓˬ¿F3̼Šh’¹¹b—»b¥š‹f›¼·¢‘_¹cI厥•;–Un_þööoo_ùvñªcÅ«¯}‡RPñ5 m>¾mËñmEïnÛönQñ{Ñt´ã½¢ïíyoëž÷·ÞþþÖ;NlÙ{bË]'6³ìt/%¨6ßÿá&ÊQ¿8MS¿þhãmØÿÑJV¾7W3[ˆe¶Ëlߦµ¯(­©9­õ‹(›µ«ÙŒ¥².5ƒQîb)«O’…bYÈZ"êã‰È,iÒÑÉÜð‡æé¨?#©éh°éµþŒMJ¯y‰'%5/]æyéO&y鐐—žÎ—šòYjú6;ýv`ve§ýÆ JÙ¿ôk£%¤©eõj¦ª‹fªå_¨iŠâ8§Æg¿]qö·+ª]qZà£žSz>yÔóÑAŠ•>¶òƒÇVžxlÕ{GãÝÇW½£ÆÛ¿[Uù»UoýnuÅï£ñ—'V¿ùĚ??±æu5^ûÃÚWÕxùɵ”¸OFWYéºþÜUÍ]ÑôõԀôõ”š¾¢ì™o3X4‰Úô¨Ä:ԟÄöÿ±?ýú¥²þ<ö³#[îWSÙ½ÑT¶•RÙݱlv§šÐn{¾ˆ²Ùn]BÛf”ÓÖGÓÚv1­y^îÏl˄̖¯f6Š…±ävëkÑüvókÑä6/–ßf«ùbÒC«àó`¸‘dŸ_^ß!Q45m=ɼö††¦›zz’ú¹N`¯Ïg¢^_Ü+Â}2·úCöKŠ¢PK4…ÊLõX¬ÏIC9¨כv{}>\C1Ρ©"œH2©««£q¬®®ÂPŠ2V>sè]3!oq)ñÃ4åîq}>ƒ?ے‘‘‘àL`Ý®ïsj¿fÔh‰%³>_3”VŠóy*»§¯¿$¹YL(èº'wS¤5ho›S^Ÿo‹¹qx"yŒÅbö€Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï€QK’}~M[Dє×w$ùò;;;G†¶×çsÙ ÍNá?ØX/J ËPÑHþÑ0”ûÇÌZÛëóÅQ6; MÍÁ &“!%ŸÀq-‰µâ¿mq)y×Å]4½ã®2+ð½ yƒC¡3ÿVR„-„Ãaq(­ç³Rϸ³*‹Ž(’›Å÷Øüùÿ‹ô(ö¶9…>TŸŸŸŸŸŸŸŸŸŸ`È$Ùçw‡û$ŠÆwº#24ìõù¼’VâEy ?7`z©(Šßï§ÓruIÇ»ÝnI#飙÷£?IÐsŽ`¨Yé÷;ìõùt¯½7; MÍ´1ühMY^ÃÏ£²²eS©"Ÿ|[Áâ6?^óŠÅ¥·ëâú|³쪡ã 7&Ĩ1ìl©*ê¶RœÏ·Hˆïýàkɝbwy«ë¿>ŒTØÏ…>?ú4D `ø½Îg©ÐÙø ¥…ÊÓ>|>|>|>|>|>|>|>|>|>|>`dC_ékc‰ -}?¥/’èN’}>qø|›DÔ\ìêÅ  {}~DÐõ†g…¿™Ï§uÇT°!n·[#]éWf†322,jÞÑ ÷·Ô‡úwm÷ù¢®7<‰(üÍ>šŸD ·™NäX¹"Þf3­mxùŒ!,%®"5{^ úüÁ®Ûß!ôïR;™É§nIá½ÏJq>ï1c~0vþç’ÛļÞYû"ç|¶·sú|6“iÖi&îC$îRZoá¿ðùðùðùðùðùðùðùðùðùðù€4…Õ1z½^ú2hXvȋKõtÃê3’ïóO6wIDÍñ¦K”!`»ÏçºÒ°ZR|×ÐçÓÚäK/33³$† ìxW®1aòãÂ=›ÏÈbÙîóy»áÇiÞ5<Ÿ-4èl&Ð|†Ä}ÃÊñ©• r´²”èöÁ‹ç5·‹>Ÿoʈ~°«FßÃâ}ÎÆþÐív§ö~g¥8_<Æã).<ð‰ä6qUvO ø¦HkÐö¦ŽBŸÏ&‰f^‰3œ¦"Ÿ~loÃçÃçÃçÃçÃçÃçÃçÃçÃçÃçF ¼ìÐLžV—‰E¡ëÙ$ßç·õ„%¢¦ôœ’üNèS”ÞÊÊá}æ"…ûZ•ñ`µ÷rŸ/Vàë?N¬Þ7ôù\0ê%0­;¾rù¤:º$»Ã} W†P;ã^ /Æ6Î|8¨KãÎ>LŸX¯AS½ox66ÜúàˆP¶mø¬ÇJŽÒOª¡!_J@€.™–~Ù¢Ïç.öê`W~ÐE+ˆÆp§;ÉX)Ώ¡y"¹G”kÉø†ÈQG¾J$ÍçÓ Òœ·/i¤Jƒ•­[+î‚ñáàS‘ïÜÙ8£àóáóáóáóáóáóáóáóáóáó£ -½ÐȱºL¢ôQ œ|ŸO<Û*Ñ5m=ádö@8T22ZnjþAí ›¸J±‚×:Ÿ(í5‹KTý†>_s* |¯ý 3Evé)=»z}§[$Snøµ“Z+¿^Âmø®($­#÷ùi¯o —Òú³Në—cvZ³cװ֗’¡Øä]G7)Ã=:@|jLô¨ƒZ5†—/®VºÁÉ÷’ƒ•â|ºSkÿw܄ïÿðjúµ¦­G²F -´çו}üNܕ2’æóùÿO¸0l·kpõ÷6ú-<öÿ.Ã'Dìmø|ø|ø|ø|ø|ø|ø|ø|ø|ø|Àˆ‡1Šf^£VDáOßI¹3aEq¶#N_’ãó/võ>ßVVÛÎ\}Ec§Dלùº;™=.2ŸÅ¿M†É ŸÏš¦XóºÜçZzEQ˜Ûd~X¿¢í]¡¥ç”´ù,žm•_ŽÜ7:áóyi®¦n\ÿºÄç›e: › q/y¸ù|ºïè éy×YA£Fµjä—χ&îXۈ_Eó¢•â|êÆy;ïgóÿd}sy}‡Ôçeq¥ äû|þTª|>k‰8p|kF“½nãüÏ‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡ÏŒxå÷!z¹AÇð\.—¾Ÿ]E‰~r|þáómÌÀT4vÒ¯òò˲Úö¤]~8L#™ÏÂðB¸ ¢Q^,÷ùš:|Ž¦nßÐç‹V“þC_·¯?›˜±éÏý~ÿRnJ|¾ÙRr»Ýâ=H³:¬û|½Ôª1k6û+³A7|¬ÀÆ[‰x]’mqG#:W}Á&ÿñ¦Kò§i¶>þñðù4 -4‹hEðµC¯” »hbÔ¶0iÈØô¦ ‡>>>>ß:ðùðùðùðùðùðùÀ ï¼ü붙—qáJÓ!¹‘.$ÇçózËÒs -{E¢k|§[Ø1¬ŒÿàÙÖîpŸC û&J/™¯è C^Ùkñ`ÏèÔ}ÄHòú|EQØߊÅÌt~:fP–ÒÒÎçK&|\6(Efv°ÞçëÕ}ÄHòžMLÚ\ì{<C·oh5%;¼…ܱ'¸Ekq)‰î]ì1£š™XºC62‘U3¨ `;¢·w»ÝúVIŠó©7®ÊžÍ'ÿÉæ.ÉÒ¸û•O~xJܶ—¤ùüá¿d6Ùø:Òï71ó¯y¨Ä–†Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡ÏŒlÄâI³c¸zÊ0‘Ÿ„Ïç‹{žÑ@r|¾XßÖ¦WÊjÛ%҆Žöds—­ -‡Ã---_]}ùüK‹õëÂ^ŸÏ— ׉úW }~D•“ôŠXÉ,ZJzËÆGcØPvvû=¶1”.!>%U>Ÿ [_Lé_‰˜ÒÓyÌÔ.½.ÎøجÊ}B›ïˆBÞúyøÓ †O¦èu¨†¼jRèó©I|\Ì ú}Ãâ|·Û]xà^r/_­÷=úWþsCÇÛ¯eú|q&‹;núQfÓÒÆø|ø|ø|ø|ø|ø|ø|ø|ø|ø|À(Á°$R/q 5$òEr$‘ŸßîãæÌ×Ýô -ý+‘6¬ðòðù6+†sÈÔÕÕUUU}öþûJA’‘1ÌM~›ËÕenòùúj|}ž™Ïçús½§¥SÙ¥ôÙPÝÝ݆oºtðlë07ù¾Ó-4óåO£¤ÊçGtÕø†ûò¦#}>¥eQÿjž“š4iÒÐ|>oÏ²Üã'ç¡õ¥Ä¯7AŸ?äU“BŸ/Ú`~Õ\ÿʋóéÈüÂåâÖ­|î|ºV󗽤ÐçƒAútÉl… ËífÛFl¶Ó»6îÃÂçÃçÃçÃçÃçÃçÃçÃçÃçÃçF¼"TRx,\ìŒÂ2<=Éñùœoë K¤ÍÁ³­tÌÉæ.þŠMª©©aج®;pÈçG -|½ÞXðù"@ÀãñpÑ缇ñC)'…>_#ð5zŸaý£™Ûç{¯<¥¿ôÒK¥*o¼ñFe ®²+upÿÉíº¸Ù$WkŽ·¾” {Ï.Ÿ?ØU“*ŸÏ»]Ó|¶È‹ó#÷vÅ'¹ôQt¤~ÿ‰²ŸËë;]_ÉÿA+ӆ­'˜EE±wvÁçÃçÃçÃçÃçÃçÃçÃçÃçÃçFV¾ý‰ßǃÁ älðù‘$ú|.çy]eé9E¢nÚz»zù¯ WloR{{{]]]ccãGç|¾Ïçã«IüY¿âD¿Ä\«Ù´ý阑4”q‘[kç|>ßN¥i þ¬o›x¶P(Ä&ƒYY¯f6²¡ljj’ŸÖn¼yµ¿•U ñ¢Ö—_âƒ`‰øüDV ß±±|:.4¸¼Ïé¾·"ޅ ˼ù ôã`EÍYÉMaÿß.hžó²´ðùìÈðh!|>|>|>|>|>|>|>|>|>|>`4`åÛ×)q¿ÃçG’èóõr¾¢±S¢nN6wÑ1϶²_7]Âü—àœÏkòÅZ}ýªM³|’Jéä̺ 7¨†ï:çó#BM¾¦V_2¬\z›9v³ÏÂl᧢.’oæòV‰byPK‰þŠõ†æÒñù‰¬šäßΨø&ø[âë†ðm ñA­3åù¥ïWJn -÷má?w‡ûœ¸¨4ªÏ‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï‡Ï¤V¾ýq#ÿ†È-%|~ÒÌ*—󍝑†_eµítLy}Géæ9ó_‚s>?ÓGÜ^z½^ÃU)š(·Û-iÿÍ©À ÆZãÒ5}ë„Ï矋}Í õgã•üfíá—#),·xE¢aÎÈÈ0[ ➯Og­,%z‹F¿'âó‡¼jøí,™Ž—·Vó„ß+1Cœ6ü¹-Šæ²«%w„ÝåMOžúJ¼;8Á0÷ù4ÃùûÜèä4vÔ ùŽ¡½-™·~¿ŸÞÕÏy}þU3®»eÞø­ó®ß:÷†­so*š3±hΤms²¶ÍÎöΞâ=Ý;k†wVŽw֬♳‹gÎݞ3_[väܺ#gÁŽœ…;)fä횱x׌%»¦잾t÷ôe»§bÏ4Ϟ©«ÔX½gêÚÛ¦¬»mÊúÛ¦l¸}ÊÆÛ§lº={óÙ[îÈÞzGÖ6Š;³¼wfߙµýά{³vîÍÚµ7k÷Þ¬=wM¦¸í®É·ß5ùŽ»&Ýy÷¤½wOºëîIwGc"EÉÝïQc_ÉÄ{K&ÞW2ñþ’ ?cqτŸ«ñ‹{nú¥¿Ú_«ñ›hÜøŽßÆþXˆ…/ˆ¼/ō{c±O{nŒF‰wRÜ¥Æ^5îŒÅjÜ®Æmjì»ÕØ‹7EcÇM>ŠíjÇÂ+ĶX©±U-Ñ8°yBlRc£b±^uj¬Æ~Š5j¬¦˜UB¬TËj,W£Pe±XÚP¨±$ùj,ž¼X,ŠÆoÔøuÞ¤_åMúeÞdŠ_äMþùâÉ?‹Åý‹³îËϺ7?kŸ÷äg•,ɺ[·^ô;´Ì7.ŸF±aù´õ+¢±nÅ´µ+¦¯Y1}µ'«ÔX©†gåô+g,_9£Pe«f,폜‚U9KVåä¯ÊY¬FÞªœE«r®îÜÕ9 (Öäܺ&ǽ&ç–53o¦X;s¾óԘ»v֜u³f¯›5K™ëf嬧˜M1cýìéfOÛ0{ªS6ÌÎÞ0;kã“7Ι¤Æčs&lœ{Óƹ7nœ{æþ¸>ó®Û4oüæyã6ϫƵ[æ]³%úïX5Æm¦—ëb&Eso,Š¦Š ”p¶EÎd5çDÃ۟y¦ª1Í;‹¥ –…rŠgÎ,žÉrќh:Šf¤y±¤DqóŽhjrDzӂ9¹j‚¢XD±«?SåïšÎ’ËWjʚN)‹by⚶rÏԕBúZË`ýIì¶hS#[HeÙEwd© Í{gˆ9Í0­‰™MLn,³í˜ÙÄ´&æ4–Íx*ÛK\ÑLeœ…,'¢½‘<iÒËEšt´Ý(y¦#ž‘Ô¤t`ËÀŒ¤IJ&%!/퐗&šæ¥•ó’&5jSSüì´x@vÒ$¨_Å”>Gݟߟ¦î¥)1SQÜ¥Æނ¬;Õ¸£ ëvŠ¥Ù·-ÍÞ‹ÝjìZš½séŠK§lW£xÙo,¶©QT8•bkáÔ-jl.œº‰bùT–¸ús×rž» ÒË`!ƒ±$¶l@›Á’˜>-ZmœÊx6»eí·ÙL“ÐxN›©Ëi<­M‹¥5}f›Ël<¹EóÛ&ãüF‘™?> ô}Sþ][<@þ½8èÝÂ($™>_/ç}§[$§;Üwæën§ 2GŽú| ÓT>ú|þbFF½ÎÍ3ý@¿r_dh¤Å5+VDë{Þ ŸÏ弙 7<›¸Ç*¶™~æoy<I;­_µÏ.–ÞéZ*cÐÏ|[ÊìCy“èo³Ï ï¢D|þW ¿ áC‡†8¨£ø^ ý ö¿!b¡{Kï[o˜»¦Ir;øÍ¡jÍÓ[NdŸwïC‚Ù/Cn‰~àÄhÖÑ@Ó1öÎ"¶¦ 7vÅ]3ýÚ·Ñç#ˆ‡|:”åз1òbø_ O¸K1ô–ô ×L³hðx¿¦­‡ ö -7ü†AÇ·õ„Å_1ÿÍpÔ狳hª‘#&>_\bÉñQ£®RÍ$˜s>?"d`C±lx6c7,ؖçGãóÙÇq (ÁìÙ¾ -âbø@">È«†?7¡Ùksîíé_qìâ¶_Óíü¡­«²{ŠŽ(’ÛÁËÇÿÅ÷é¾àÐu%Ùçk6ȬcoŸ?,ÛÝØÚ7ÜFtö°»ûÀç#ðù€Ï¤5\~ŸåßCåUdâwöQ.“éó»Ã}LÈпì±ü^åõ¡€³¢±óß G}>Á©Þ‚šù|6» E®ËåJš‘0±¦ß[‰8ïó¹ú3ÌÀfÍ -q Í$¥t¹Ì Òç3|>Ÿ¦žãv»%Ë$®Ï§)Mg ‡a³ôùC[5lyÎç…Bԍb'ˆ7V³®ÓtÚÅ®ÞÃÁOŸ=üè÷~ðä^PrìËP¨>Þt©¡ãŠs•dŸ¸Afe ‰æ§oðúÚbàë°hÚ'ó>Uàóø|@ÀçÒ±T˜Õnñ·ÄÊ@IÕ½X,jïÃãéH2}>ÑÖ>ÙÜÅ«+»Ã}‡sðl+SÑØÉ~=|¾ ó?íP¥²²²$†ÏçKZ ñ†º1Éõض@­õûý|2¸&ßÞOÔø瑱jxwÒD«Y›ãªiãÝóŠì{rï™PÐ%¹Ü´19W‘|ŸÏaIÉDö'Íöœa°ÿ-¸Ýî$·Ð Ÿÿ¾{é ‚EÙ /8´~Ñ·1òbø™ [ÄgÃÙ÷Pú®§)hԗ_*ŠDçâüHÒ}¾^~o»z:® >Êf,ãI6.Á(ÝÔô¥ï)i†ã[Lg(rxŒë¿B…Ú%7‚9+{’s£Ð糇;4~H|~òÿ«à„ϐ|Øsßfè·ÖòÃF!)÷ùǛ.I4ÎÉ殈ZÕ±«ƒ€få¦Üâ‚ÔÂwv|)Uš@`L<Œ18SR¹7û;ߕ=¨Ur¬e̘Ëɹú|ö ‰¾ÁiØÅjÒ|>'0Tôf–^0d¾¦gRåó/võJLÎáóm# q¹\))èÖÀi&¤° ¡PHó|œÓYzÔå™ì;ÿ²ä.°p_‡Ë՜œkI¡ÏOm±âóYý›äÂçÀH" -ù|>úv™­âõzÍjÛDŸŸ™™©y´|4“rŸOøN·HdNw¸Ï¡Ïmmm­®®®«« ‡Ã˜ iÍèJæGX‰> eUUV¥xq~ò‹ºEè–*—ù.—‹MÑ`0èñxèNÝ?c[ƒÊÿ¡h—ÜÆοì]ûa2×Ô¨òùÌÒûý~ñE}ðɖü Dø|Ð—túJßXC¡zCd8øüòú‰Ì©iëqès««««T:;;1ҚQ;”g„•ècUZ‡eïÔ>köÿÙ7ûà6ª{ïëOÊ 3âþhfîTÓçÎô™¹£ççÂ-5}á5¡KH€„„n)ÜR¨!ô¦´æ¥o’JHÀ"“@J‚ LE0o /Â/ØØoLŒ¯C­Œˊ…õü¼':9ìJÇ+k­]IßÏ|ÇcÉ«Ý՞õ9»Ÿýp8웍gŸ}–-L£ {Ge6\:é”iIÿO¡¢«O¯Ì×ñ‚ϏÇãÔ² R‚Á Sÿõt]$>saXohÚ½ -ø|@Ä >¿óHZ"sZŽÏÓv™9Ìd29PÍÔmSêºNÿÂj 鬁jǞžüWÎ -µ;µ¾‹³3Dû]ŒÅ‹³¦æglÃYúw2’þå†1ÿÉ}¹ÝÊ#Wþù#Yqð)^ `JŸOôí{n8× ´ Út±'ðù€ˆ|~:+«ÏlêNÌߦS©´am€¦DSÑu]UÕH$"YÀï÷˝s0eËsSMŸbÏ t}ÒçË-¹S6?ëôE“¡³ïͽ®Ì·vÑçÓ1¡ÃeÇäÓbt0¹{/Ÿx<Λ2p{O—Š¢ð?Ñ/ŽçG£Qö4cÝ|> âŸO4÷ê¥321…–€Ê ºåbJßN%9w³´kay,ö™Ï÷^ã¾QIçÒ)ÓÑÕgæFb•ùâ.ú|>+ŠÂ\=;¢·WUÕï÷MӜÝ:µ”üimÔq™ÏˆXç›Ì·ÏÿäËáø‘5œKJâx:l¤ÓœO)]_O·ýӏ„ôé=žO(S’3é3ҟÏ'F>Mö:6“FŒhcý R¾ìûÌÈ¡/û†Œ|>Þ7<þ1åÆ?ÿøpj&_¤>þWªw4Õ{„r´7q´W?ڛ<Ú36ÑóåDÏøDOj¢çhú£‰ôGéôG“鏎¥»§&»³“Ý_MvOgºs™®šJöð|um5v ê$“ÅÒ=“´½LHst¶¤º§g͸4_Ζ1IJ£Ï–„4GldT–¯(ÿbù¨p¾°—ÃҌHó?ö2,Íç³eÈF͖Ïǂ{%ÀÜ {ÛFGqü¾¸ºðˆÏo>*Q:ûOàÌ€ -`*W ÉR>pHà+ù€°¡Éï5<.éùoÚ®ûOÌíôWì»»èó™½b«ÏÏíó7^G"ëc:¨¹­šÝ©CMçfDß®à’ÖG eú|ñã‚< Þ?O=Ž-‚ Hí·K€¹aG#”„ƒ“Ö«úxºëóG&¦$V§¥?‰3æ›x<ÎÝ;s¹V‘+ÛCQ¾¼X†m¶{v·Kzþ³–O„ξ7÷v¨b_ßEŸo ÁŽ›Uq³§-Õ·ƒ§AÌÀqÏ¡3DòÀhVàó>AÏTðùót<Ýõù„Ú1*;éì4N~˜?"‘Ȭ2ß$ü øECN£L_2ÓҟlJ±¿Ê»ýo~gê·Ûö?ÛÙ921U™#àºÏ/HØè‡MK²÷C!gs°‰Šâs„J~ß9gø|ÏGAàóU„Éç7”uw}ÏÊûü‘‰©æ^Â\MëÁq‰ØéKfpòÀ<‡Mös“ù&)؛ôAMÓ¸À?Ö÷ÅaIŸÓö‘…k>g¿ÓèP™ƒà¢ÏgV21µëãAIŸ¿~ÃÃMÿü€ýÎëùç}>kõëjší‰©xžµ‚SCv0dS**ùeùqö‚Ïÿ÷+Îùރ×Ô@δæ¯39ËFþCÈ÷çjÊÙùü€òЉ4äseãÕ?4ò£!–ùÉÆйWQÎÛ¸ê|–¦U4­º°iÕEMW-Ü4“E›®ºxÓJŠòðL.yxåâGV^úÈÊ¥F.Û¼âòÍ+–ÍäÊ囯\±ùʕ[®¼jËòУ˯~tù5.ûÙcË~þز뚗]ß¼ìÍWÜÐ|ōÍWü*ry8rù-_¶æñËnÛºô×ۖ®Û¶ôömKŸXrÇKî~òÒ?<¹øÏ-‹ïyê’û¶_¢nWØ®<´CiÚñÓGž¹øÑg.Žì\´mç–gnßµpçs=½pOô‚Öèßs~ÛÞóc{Ïko=÷­ÖŸ¼S[êß6Oÿì5v ê+ÏÙ+dO>»ó‰Zò\>»fòö³Bv²œ{"Ïäót>;òÙ~î[¦åé{n¨üü,}>;VŠ¢ˆoÒU BûFW8¼±ÔÒ%vAØ,¢2—Oš¦ÑOŒXž’&K:èóÿÏ/6¼ôk/çœòò×nó#!?¶ä'/ϹFÎrþ+ÇsÁ+·]øÊZ–‹(mk¶­]4“[)·ÝúÓ¶[#—´­YüêšK,yuÍÒ¬¹ìk.ÿǚ+bk–ÅnY»åÊØ-+b7¯ŒÝ|Õk7¯zíæ«_[};Õÿ¹oõµ¯Ïäº×Ã׿¾¡ò«ßøÕ¯Þ¸iõ7ÝüæMkÞ¼éÖ7o¼í­×½õËÛßþåoß¹¡ñîz熻ÿyÃÿù‹{öÿ×½ïþ×}ï^¯¾{ýƒï]¿ñýëþàç›?¸ö±øµxíþ쩎ÿ|ºóšg»®ÙÝ}ÍóÝW¿ðQ襞U¯ö®Ú×{Õ¯|§Å{ý+>üäÊîO—|`فeƒÚ埼ì‹Áˇ–ŽZ2ùù¥_ /Î _RSß1_ÿó5v ê$Ÿ2rh&Ó,Ÿ-žÉ ‘ƒB´|Œò©‘OŒô³\:“>#éғÏG—~EéÒe¤ÓH‡Ä|0“,ËûFÞËç]!ûüsÉLÞ9‘©·¼eäM!oi7òº}Kgòš‘Ø×ó#¯iòŠ‘—¼4“c/]6“¿yÑÈ Bþ–O«‘ç…ì½,CÙcd·¨‘çŒìò¬‘3™¤<#äi#;.ŸÉv!Oi1ò¤'Œl3²UÌ“‰i>‘ôcF5²EÈf#y˜eÙñl2Ò´l‚²QÈCFþjäA!¹ßˆ:“£<ŒÜgä/È\òZø"ø|€SÐ-!ÝB엏‹>dbJ¬Õ¤wZú“½CËì?<Á~oîÕÑvP>4h²Q sªŠ¢Ì*ói=º®›>HC ÈlµÔoóùVƒ½’Þþw{?nkû½øÀ·2¸èó骆m—öA|“·Î¬‡zΰ§´Î -\8™¦XJɁχχχÏGàóáóáóáóáóÕ Ä~™¸èó µc”›¶¡½äº¾`è¯}É ™ÌdËÜz6›M¥R8 ª4e-5åáÇє•$‰PÿOÃe1EÌ«Äå2ßô,ÀԔÔcóÞ»óHº¹S“ôöϼ¬5}p€ËÿŠ -}>këózǤô­‡º|èJ)°g:áp¸±8âã†9ŸŸŸŸÀçÃçÃçÃçÃçGÓ4º e7¤ûöq×ç·gƦ©;‘ûzž5-ýÉtvZ4Ben}`` Ë Nç@5ƒ¦DS‚y‚VŸ "‘ˆ¼)©Ç>1Ùê_ŸHºzÊkí‡øï}ÉLž¬»>¿º®«ªª( - Óô‹ƒ•ù­ÓW -tÍààqžó…|>|>|>|>ŸŸŸŸŸ¨%âñ8ľ}ÜõùÖzû¦î„Dò¤³ÓͽºSE›}}}L7¡¸ÚASÖ ===hJï`§2¿ Ì·6å®c¬ën~/þn׋’~þ/Ïõ· ¥ØïjÇh%¿¯7}þ¼ŸŸŸŸŸÀçÃçÃç#ðùï ûlF¹ã3Ö«w}>ÁÎþÃ9¡b¿`ú’™öá£bI9Œ á4¨vД5C"‘ ¦Æ¡p›2Ÿ³Ó”jÇ(ëºÛ_^ÛôÏ$ýü‡ï÷:øܶ$êÐçG"‘ÆR Cäàq†Ï‡Ï‡Ï‡ÏGàóáóáóáóáó  r±_çVßuŸ¢h³WÏ}½bߚփãƒãÇøˑ‰)œÞà8eÊ|b¿}ם;$|ã¾Ïµ¾Qñn%¿uú|W€Ï‡Ï‡Ï‡ÏGàóáóáóáóáóÀ&ž#ÅfՋë>¿óHš«›d&›ÎNKT«É7•ôp -]×mÊü`0hs|^Uã¾Ñ…kR’N~ÏîvêØùK*ùÝ=âói7f-›¯êKø|ø|ø|ø|>>>>>ìFM¦>ß]Ÿ/ -üÁñcôNKRb{F&¦xI?Óû¬P÷N{8¶ÿ]׃Á M™O Û\í»½¬Ó^rçxã¾QI¯uõóbþփã>b®û|j2¿ßoçøӒÕ{fÂçÃçÃçÃç#ðùðùðùðùðù0+Lã¼M†Ïw×ç灟Ìdé¥Xœi ýU,陘Âé "4ä‰3Ñlsöe> ¦š¦•°C;ý¿¹ûÁ³–ž¾hRÒ½?ÔúÁ´ñŒ`püuõ.ÎϹíómN‹€ÏÏÁçÃçÃçÃç#ðùðùðùðùðù€ÚE¢ñ@8ŽÇãu~ˆ¼àóÓÙéÁñcLæ#SáÓҟ¤eԎãžíÃGqž#‰Pgnïì¸w ÅGr™_ÚÐy ’kñN[çó^r縤{_ÿ䐻GÏEŸO '^ŸÐ¥K£§JèB¨¡h?<Îðùðùðùðù|>|>|>|>|>0 ñíãŸo¥©;!q>´@ÛPŠý>8~ ‘HÄ*äƒÁ ñKŸ-8bڔù4àÒRt`}!¹î ŸoóI§LK:vÊ© ¾*]Í:‰‹>ŸÏŒP+{¬O*0/>>>>Ï‡Ï‡Ï‡Ï‡Ï4þð¦Ïo=(«áìKfh™Áñc#ShA@CݸÕäÓ;6K©iÜ´érƒÁ ®ë¦ÓØ*DFb¹_ð[«}¾O_4)éØoÚ®û|ô]&]<’.ú|¶Q:˜Þ®}ŸOgêóáóáóáóKn>>>>>Š_ÞôùGÒíÓ6”BÃ@îë -Z4ùVñnEÓ4^>7™Oã/_@Q”ÛاÄnÿ_>ßzŸ¯ûÚ-IIÇ~Öò ŸvÉ+³Â›fµ3™ÂYè)&EUUv}åHe¾é8ÃçÃçÃçÃç#ðùðùðùðùðù€º‚nBÃá°µ(¿$¼éóÓÙi‰öiêN á ÷u í—OÓ >·/óiåk _ -¹û匐ϷþÔG%½:å¤S¦ƒßz'—Ñ=r0+¼iö`%zð£¦g»§–nÎåÇ>>>>Ï‡Ï‡Ï‡Ï‡ÏÔš¦Aã;ˆ7}>ÑÜ«KÌO2“-‰D¢§§g`` ›Ízê»4e=7eWWš²$TU¥ž¼¤ÒnÞóہF«Ì§wāØú5åÏ·Åù[ÏZ>!éÒWnóùr‘ëB¹‘˜‹GÒEŸOXtŽƒ ++vX4'fPØñù´!É)í Ïÿ÷+Îùރ×Ô@δæ¯39ËFþCÈ÷çjÊÙùü€òЉ4äseãÕ?4ò£!–ùÉÆйWQÎÛ¸ê|–¦U4­º°iÕEMW-Ü4“E›®ºxÓJŠòðL.yxåâGV^úÈÊ¥F.Û¼âòÍ+–ÍäÊ囯\±ùʕ[®¼jËòУ˯~tù5.ûÙcË~þز뚗]ß¼ìÍWÜÐ|ōÍWü*ry8rù-_¶æñËnÛºô×ۖ®Û¶ôömKŸXrÇKî~òÒ?<¹øÏ-‹ïyê’û¶_¢nWØ®<´CiÚñÓGž¹øÑg.Žì\´mç–gnßµpçs=½pOô‚Öèßs~ÛÞóc{Ïko=÷­ÖŸ¼S[êß6O]G¨úÊóFö -ٓÏî|¢–<—Ï®™¼ý¬,çžÈ3ù<ÏŽ|¶Ÿû–)Oia9o&OyBȶãy“gk>çɧù|s3ò¨-ùl¶ä‘|6²IH“‘…ò‘¿žÈyÀ’û…¨F6äsŸ%¹àDÖ¹WÈ=Fþ|<í<ÊçBþ`ä÷–Ü=“×Yî2r§;X.<žF!¿3ò[!·ù%ëX.šÉùõEûXn³d­[¬rËL^s³‘Õù„‘Ò²yE|> |¬ߑãé5Ÿß>,+æì<’.===]©T -gBUƒ¦DS›Äb±‚ċ -…¬+áےeXSþô§O>ÿ͵­ I—~ú¢Iÿɺþx nëósùý‚Ó 8X¢/ñùš¦ÑgŽÐKëã$}>‚ ¨÷ÏS¿c‹ R{Áý`n˜|¾¢(åáH±Y O¯ùüÁñcù³ëÀ˜›dæ0“Éà?«ªASÖ Ԏ===hÊX,f՘å@k ‡Ã¾R å ®G”ùÅÆ֔ <äó­?uA»¤?oÜ7êóåBgGro‡\?æ.ú|:°t0y•‚üÒ¥¤éŽÀö͑KºîbßÂ:­ƒþD_ŸÞ× Ø´ëFáó>AÏTÖúü2©üM±7§×|>¡vŒó?ô'G6‘J¥  k4emÍfë¹)u]F£¼>™~:¥ôK-˧M[]+ƒv/ ‹í!kÊo|Åç[ú¢$>ɝã>_.ºZɍÄÜ=þîúü\)W8´d…÷?¸T0QŠ¢ÐvM¥ðùŸ ‚Àçªøüy:žôù»ŒIÐàø1ü;jMÓTUeõώP´rfDí ãñxÁµE";2_$´tÓÊ Ý’Îü» ™ÀiZn·ûwîú|qփ×|>o÷P¨Òs(ØUŠé>AàóAø|@A7• ŽRÌZÔ ^öùGÒÔ6”¿ zÑu=KÊæm -sÉú©‡g¥þöQE²QîuíÎÈèÓÖ5î+:يþäóåÂ竹^ÕõqÑ竪*¶;R*VŠ@gd›µ1Сp¼>¨^¼ì󓙬Äç7÷êh>@õR° ŸëÜ2Ÿ5ÏÁäª 5JËØÙ½‘‰©]Æz¥û» »%=ùÊ c'2ý‡è‡ô{ûðQw[ÄEŸÏŠó©É¢Ñ¨NÂbgfå…Ž‰u»ðùê¯ùüd&ÛԝP;Fû’zÙÜ«KDP:;T)&ß®(Šªª¦:ä9‰D$5ÿÅ q¶ä{ׁ±|þç’nüêköÞ|ÛÓü¥»-â¢Ïg¥¹ÂÛµïó˜-27Ø%Šõ|>€ºÅk>¿}ø¨X~ß6”’ˆ Î#iþÁd&KAƒª…H$Bo(rª${n&Ÿ=Jp\Õª£’Þ›'Ñôo-oìöȬ+×}¾³Tì0«Ïƒž¢%A¥ ­[ÿŸ nñšÏïKf¸çIf²âKkZŽ›>Ūú ~Ðuzò¹™|¿ß?ªvdbʎÌß²7–|æßøËý‡'Ü=’.ú|æÕ]ÑæÞ$ÓÉYlR|>‹ÅÂápƒ¢(š¦9¾¯ùütvÚT~/qAjÇ(ûTK’½³ëÀÎ@@ƒB(òûý¾9ACŒãeùŒý‡'ìøü—žòÝö?ñ—Ôÿ»{<]ôù‘HÄ;±ëÈe~>PÓPHãÑ< Ð`Î4Ðý{Á¿Òõ+Õ³Bï;kõ½æós9O?%:hdb*÷uw”Ìdq‚j›h4ª(Šo®X,æünˆäzÕ\F—÷ÛdbJ4<âKkZú“ìS¦ª~; t¤Óiœ“U šMYÛP‡¯ªªX³77Eqv†× 2zn§Ÿùü‘¿/´Sœÿôs¯· ¥ØïjǨŽ³‹>¿Ø¤¼bØ1ðö·kgmlI:…\9¦=„ÏÔl––”èx„b -=‰ð‹7Õr‹‹Å¸ÕwêžÚƒ>ŸhêN0ÉÓ6”_L:;³TõÛ¡¯¯™CW;hʚ¡§§§š’n½©kUË֌ñxÜô0wÎPo§¢;Ò’4¾”lxq~‹ïÝ®íøü×^ý˜—ñ·÷BÃÁçϺ¤G.àóµG±À© Y LŠ)tEQŠÉ|†®ëÜí8R­áMŸßzpœIž¦î„ø²`ú’Z&™ÉšÞ™•±±±¡¡!œÕš²fH$ԔÃÃÃÕûâñ8/¤Ÿ›Ò§;÷p8\~5>ƒ† ›*€6:G]lçGWÿoÿÉwN[wß«‡ìøü—^î῏LLy¡í\ôù‘H¤±œÒ;6}>?2ðù0Oˆ£°È|M¬%Rì¾Øï÷Óû@@òÙh4ê`µ†7}~_2Ã=O2“_Zà ;MUýPaâñ8ëÆKõùº®G"‘P($~¼Lh(¡uÚÙº¦i¦Y4ДðµßçZ|ÓÖù|ë)û>ŸUæ¯ß½÷sñ¹­pÑçW:+ò𫎆âˆç†ê yŸ¨=h,¶^85#”O1…ÎއÒÏêº>—úÉ"xÓ秳Ó\ûtI‹/­á.¨m(å5;¨"‘ˆx'Nê¬³¨èæ]UUV#í ´B›&?g<#w›~·ÿÙRZ®Å¹î &ómúügZ»G&¦ÔŽQÖÉ{¤ëÄç‹_³$èÜpdb`ùÀçjêŸÅÙy¡PÈ#½.ÈÍæógõ5ïó‰]Ƙö™˜¢—-ýI‰Jf²9KU?N3@ňD"¢ù¤{ðY—ïٝ‚¶[ÒÔ­p8,~< ÆãñÒ¾y[ƒXœOùæw[¹¡{mkBÒi¿Öþ…±N|~.?°$EÑ4Í#ûŸ¨ah ¦ñ&ÀkSèlV;êóƒãǸ–o>*QCûO°Åø;ôYœf€Ê`’ùòΙnÒYWï ~¿? -•¤[­»1—:ÀCÑ\‹O]ù}.óóy±qßh±›þt$®y®=ãói7è2€ÏÚô»ªªº&‹ø9À£äG<ó|>€ -SL¡³RIºy—|–‹£h4ZþžxÙ狌LLI|~s¯Îcڟ^¦³Ó8ÍÀTâN]t±%u]…BΚü`0H[,Õôjšfz Ùm»ú–oøO¾Ëäó¿}F\Òc¯Ü0VÊ‚ÊáºÏ§vä¿àSÕiwÍ6çHy@%Ï€*BÓ´˜£¸2™‘ß›‡ÃaºæõoôíèMúS±{vÚÛ@ À>^R)f1ªÅçjǨDñJ~¨¼ UæS¯ÎºwG €†9¢¸ƒs/Ànñ…ξÜRœ¿~ášÏ%Ýõé‹&ÝxK;,•ß:ïvΐP(äàFÙD€9>Íqø|¨"Lò¤|bn” J ¿·–ßÓ;Á`ÐYý^E>¿õà¸Dµ ¥ðߨ0¼šZRâN£ ïºË„¶ -…ʶt]W…Fœ2 ³ãÛ~a•ù>ß曶ë’îúœ ¿òfkºëóÅs‰ÚE|ÈB;&Îì¨:ýî8ðùPEԆϧoA÷æüæ½ &ÍbZxîå”EŽ§÷}~_2#DMÝ üw*L4õ듳 և¼®ÓаÃêóO]Ð*é«oÚ®—÷ aqÑçG"¶]EQŠM¤sŒ=ñ§ŸuþŸ¨a¨·wk -9À_„®Öhè^ž¾ÝÈso/ñùÖæU‘Ï'ԎQ‰&™˜Â?À#°ør†§`0‡zzë8±Øg…Šóן¾è=IG½pMÊíQWò\óù¬ü>ÈßÃùx¸C+o”Bg£G¦ÀçjêÛi à#õº°ú¨yølt¿ßO×?tgªiÿ+ýN×Hô>+oóøŒuºxw>—÷ùôÓÙÕåóۆRMD-im‰D¢§§g`` ›ÍâߧªAS¢)½F<ƒsÓøÔ«ªj<ˆ¦% úü•I:êoŸq̳ßÈEŸÏŽËöˆ.fÜ:] ðK#9Þ˜\Ÿ¨=èÊÁÚë:ÛÛx ºÚá&D^É@åæßËJß]ãÍG…Fuùü‘‰)‰&jêN”´¶žžž.ƒT*åýïДhÊj!Ú´£Zž&ú`uUâÅbŸ56¾Xp¯èó÷HER/×|¾ý ƒlÔvpÈæWDv@}>ÌÅzc”è VÑ4]ðƒA›×<ü’Éû5óJuù|¢©;!Qú#SöW588ÈÌa&“Á?QUƒ¦¬¨{zzª·)y§jßä;åHiøSU•:óJ–óÅZ_eþ7¿ó˜¤‹^¹aÌËòµ}>{lӁ@€ÖL;Àæ•Ð‰ËÃfÐOï8%ø|@íÁæb[qvj6€wàþ$Úüݖ²„B!º*òùmC)‰,¢¿–´¶T*\ )kƒl6[½MIÃJ±›ñb„ÃaG©¦i4–‰“*vûÿƒÿ÷gÑ矵üo’.úôE“ñ¸w[ÐEŸÏÎ;b˜owê‘ Ûn àç!{Çtþ°K…J>'’Ÿ¨=ødsu^{€†+”9|Šnc]Üsºe…B´\ªÏZ¨É ¼#;Pu>dbJ"‹šºøwT]יhµ u¹q'Ôv4-ø!^on*Χ¬Ü𾤋>ó’ÉÁñcžmD}>‹ý~¿ÜÛðrzûÕ rØ3 UPâ¬ßú<ˆ]¨Ä½ñ<>P{Pÿ/>—gPŸŒ#€Z¥Ÿ_ùÛvN±2Œ`0(¹e®sŸO4u'$¾¨/‰"m@E¡›?–º[Ÿõ¹­-ÒRp£Ô™W¾8ÿ¤S8}Q”"éœç<‘ªb¸èó5Mã§G±æSU•-#–Ó—‰u6»* Ÿ¦%Ù‹GJôáó5 õÆâÈ -…œêí<7ó%UŽñw÷¹˜ð)výV‡>?™É6u'ԎQæêۆRSÔzpÿ€òá–^®ßi1kA]1‚Á`ù÷æÑh´à¨A7þòêng‰<ôKKқ-î¢ÏÏ Ã1+ÈTU5–‡þ$§Šós…|>›`½$`»ç‘Kø|@ C×Ô-Ãä æáwÁ¡PÈæGøm{0¬ü³ûe.Òé%íÝ¡Óþ‹ïË¿¬³‡ÎË>¿}ø(³@ͽ:½™˜’˜"µc”0™ÉRð(S/]l±’d¾ýJŽ8R°jmêÉç÷Æ?¥ÍD@×'ýþ¹Ï_ÛªÙ÷ùÔ¥{³ÑÝõù֖-Hù“;DXi¸N:‘ -H°%áó8Ýu–t«+ë¤ò - ‹ím,ãû¦ºK­CŸßy$ÍEóóͽºD±2~ú)¾›˜´j±a"Ú—ùjX¶]Vï`©vQDr-¾™:±­;nmá2ÿÔ›ìË|ÊÈĔ7ÛÝuŸÏW,Å7=¸q¼¹Ãá°õIS÷t‚±º}]×ù¥-‚Ï€€Ý~òHMÓ -.ÆnK¹¡_\™Ì(WètÃ.Ù½:ôùéì4AGÒôÎþÃYÔzpŸhéO2´ëÀ½Lf²³ú"kU?HˆÇãâ0á÷û‹•CۗùÔµÚyj¬išjàÊ#æ¢dôÜ Áã2Ÿ2co7œõ°èóWnxß¾ÏgÏ[½‰w|~%¡Ë :ñL¢¾àîà“2Ï€Ú@×uEQ¼_0ɍäi}>‰À´ŸõéóyA>¯ílîÕ%ʨ/™±Võ@1¨Cæ½.Šüyë¬XȚ MÐÚh[ö?RQÞçZ|ñ?.PÎ….¸M×'é½è“/‹2Ÿb_æ{¼7vÑç³R|:j ºå¤›b¹É…B.Ö@Úñù9¡:ÎdÚëÓçLL‰®>'~I (wþ¬ªßD6›M¥Rø¯©vДhÊ2‰F£¦é]ÅÆ>‘ùš¦ªEñJcˆäZ|ú–oN[Ǽ½ª¾§ë“÷Š2ÿ» O—äóÓÙiϞ~.úüªˆ½|> &¡kºx`RéR¤Ø$A€Z….‡"‘H8nhll¤ë"M>ß7vç>k%]ȱ%Å˹úôùDSw‚é ¶¡חÌd%ÊHíMg§Eço]áÀÀ@—A:êýêM‰¦,Q­óð4vÈ‹¨Å#­‡w¼V™ïÖÄ13‰x®ÅGQÎqu‰tݱîSqþÂ5ûìËüæ^Ý˧Ÿ‹>ŸÍ.ôûýè쟨=ÄÙÙv.'@… ìÎ]þp»Z’KžºõùmC)f„šºì^~_0GÒ¢ógUý"}}}Ì¢®»ÚASÖ ===®4%ï ‹Ý8S_Í°ÎJ$)¶!êÕYÿoš2æ…gÍ'HÄs;ý¹_äº3¸·ohØ¡õ šd>em«fßç·õòéç¢Ï§!žm—NEwý 4x¹¥àóµG8.8¯GÀ#pw éöY²$¿´ãJ¿n}~_2Ã¥P2“¥wÄò{kZŽç„ª~öRdlll```hh'dµƒ¦¬‰5åððpå7M¬¦iÅþd-™›ƒÌ'Lë¡ÞCŸ‘Ñs»¹_ü ü'ߍ½ßÿ ¦%• #&™ê‚Möe>edbÊ˧Ÿ‹>Ÿ 3‡tV;ç 6gÄtršˆF£Þ)…ÏÔÅæÊojvãI7§Š¢4pÁB¿ðBww÷P¼qƒ¡P¨`9œ©(4dPŸ>ŸàRhÿá z)–ß[£vŒæ„ª~öJ¾̧Åh葯¯Šº\/ FèUs->}Ë7§­ãÞ>ý$Öúºµ8ÿÛgeáš}×né—ôÃk[ M¯ŠævÑç+Ë,FÁ€9@\æ³Çü ÜC”èÃçjq ‹¾pdPÛHª(M>Ÿ¹׍ -{ú î³dIú -¦oçÈ>T—Ï'Ǐq™Oì?P“ð>™Pœ€ÚF×uQwÓpÃï|M~F¼uÚ º~›õöœ¾c$¡¯ÀÊõÙtÕù|ÉLV⑚{uZ¦óHš~oêNÐÂøOÌ -u¶öý*uÈ´|Í|wU}‹ú`p«®OF6·Kd>åÇ×i’~ø–û&«å»»èóãñx¬œšcÈÎsÓåGÁ#À®¿T /N6lҊ}mŸ¨U¨{gw…ÑhG5õbá=¿7ïUéMnþ@·j÷ù9¡ü¾`àð%Çih°)ó©ç¬%™Ÿ›Þd–ÞïPӒZß ÿ令>óµ[’’Nxõº¯ªå»»èó݂]™Dze|¾¦iÖ§f6? ŸÕÝr™/ޖôù¹¯ósù_«Ð—eeawÓ+V¬X´h‘d%Ùlvtt4•JÉ·E Ðb´p%Wõü'£•Ôy$íÊ^aUXVå‘UE£Ñ‚unWE#‚8ÕKN(ª½Ã·Rè—\F§_äÅù>ߋ’xmkÂ4ÆzùXµµµÕ›Ï/øe ¾‡ôùtÙÆÿÑèZm0´¿ò2}þ³;wÒ§ayçíw橇Á±E©½ÔÉE2 2¨ªZÐÛóù9CÚ°?)ŠRÛÇZÿf¥«««££C²’.ƒt:]l™T*Ŗ¬äª^éøDb“žüè°+{…UaUX•VÅ$¤ÕO\Ÿ¯dZsÍö;Ö½0›Ì_ÿ|@Ò/¹s\Óæå ҟ쬊þjU[·n­7ŸÏ®ìÔçƒAñ´/>§’®Áø ûS]ÊôùâÇy@½žz[AÚK\$*ݲCÓ=©ÄççòÓ́ï‘ìԚvuu HVÒÓÓÃt‡¤Êqtt”-SùUýåƒ/$BÉ­½Âª°*¬ÊÅU½õÖ[gžy¦ØÑIV¥ë:Œv'v% ;{Õ××7ëôÔªb/uÎ*óC¡/½í¨¤û½ôÆ´g¿ uUÍÍÍõæóÙ/>ӄa=üjʑ)ôïÆ+óí;|ø|ÏGAàóÕ/A7½/÷ùÅ>åeâñxC›¡»ï†â:ÍÍÍkÖ¬‘¬$‘H I–Éf³ƒƒƒ´˜D›ÌÓªv“¥}½]Ù+¬ -«ÂªÜZ՞={N9åîfý~¿ÉCŠ«ÒuÕہVF­«¢-.X°@RÀìñÃNˋïëúd`Á½r™ nU”îk·$%Ýïêu_Ü«±±±9ìÕ|¯jïÞ½®û|:QEaC³„‚W5s@Ó4¶BU°â¦#@ÿŸ}³’¢¼÷ýþ­JÝηêƪS™:§NYǜh+˜_`xµ£øƋ´ ¢Øˆb≎c£¶r_0Û®q±MÜ@<‡ã\B¼$\“,îÞÅ°Í!ìÉ:=›v˜0÷7ýì>ôÎKOÏìÌÎtÏ÷S¿¢všž~yúy~Ïô§͎§lýžÿmVö ’ðù|>@ àó~§q|>?£J6µ ۚ÷uÈþφ\„RÛၼߊÅbÝÝÝ.žø\J\J'ªª:Íg(ÊzuË w•^E1ï¦h¡óM¨\é:­hq¾®ÚÔô‘Kî]Ó{î¹>ÊŠÏ°%QRW¬”ÏO”賟š¦qÃωvÄûv¥vÊx”½Á -úü '|ù¢_ F|yÆå—L¿ü²é—_>íò¯M›ø©¯š2aҔ áð„©á˦O¾lÆäË®™té¬I—^7éÒ믾töÕâ W‹7^%Þt•(]%~ó*ñæ«.¹ùÊKn‰9vÜÊãŠKn·ÇÅUˆÌöoµ€ Û7íã¼ÉŽ탟}uæDèt®µÏ‹Înæ¤Ké4§Ä´ðetîS™F˜l·ÆÕS&P³\9eÂS3MDñõ©©¹¾:m"µÅÄé—O°›±h\ê9Doq‰·¸Ø[|Å[üëôË7¼ùZ•ÒšÿÇTV\^øW/1Ý-¾Rz\ì9¼ôÉ¢}»èqh -ÇDgL;——™±Ÿ_ã1u8¾žßÈWŒŽ+1…"“²âêÑ1itLæÎDxtL9”è2éÎÓx8²bnÌpÄÌáÈäÒk1Ë×:â:v6æ1{8D6Ñ°¸‘ÇH&¿id’F¦!7çLI·äLOÎjôÄtq=Ÿ+³çPgÜz…c¶uœàœ-iœ‘¶â ˜™GæG{Š¯Ï™%3¥}­³fIê]|Šdó#u{63ÒøºøÊKàóUB–evoH÷¡Îåî>Ÿ×›ùèLáóó2”:ëâ”6ˆåýVGGG»{ý*¨p)q)9|:àÀ.ź®;=¼;…6•%ó Õç×û#é]R:fúíµÝEe¾ª~LñßvɽsÖ|ðA—Fe }>u-ï]±²>?wÔä…Ö©ÔîêÊç_zÿìðß -FÌØñè7ùȂ_¬^¦¯ZýŽòøÛ+ŸÞ|¿Úºâ•Ÿ,×Z–ýT[º­ùÞ÷__òÁ¦{>|uñîWýöå»?Þx÷7È^ZØùï ®¿ëÐú»¿¸àȋó½0ÿ¸:ÿ„:¿WÿWu^ßóó>{~žõÅÜøssûŸ›û·g‡c w&ì8Y¹ ÍÒ¾h¿t~aþ‘t¯_@GHÇIG»oƒüûòï^¾ûÿ¼²èׯ,Š¾ºhçk‹µéž_¾¾äç?^òn󒷛ïݬ-}ëeo´,ûñ›Ë^ýÉò oÝ·þ­û¨5žÝ¼â›ïjËkö5Ñco¯|tëƒÔ\Ê6åþwW-×W-yï¡Eï=´ðç«yÜÅâ«dâaŠù£cžsߎ;sâ;n‰ÛFÇ­#1§â‘[râf;¾IñËLH£bÍM#q#Åö57äÄ쑸>^7:®Ýþè[ÿ³J™mÊxuþ)Œ_‹©Ùñ(ibº{ìÈČÑ1st\S(¶?:Ë×:âº|q}&ØE?ײ»ë6vðŽ4ªƒ±Ž7Ò oÎêœï?2‡ú­£;;6ëí¬ó;‡ÃÜ_d‚ç8ZðóÕ F†›sÊﭾێEöØd±ø½‡î±cÉHÜ«¯¢Xª¯Z64œ—¿»ê>;VŒÄýÛV=°mÕʑxp›BAÃÕH<ôŽ²:>lÇ#ï<¸fk&µã[[W~ëí•ß¶SÅ¿Ùñ·W>nÇo¯Œü,Of"“dÖmyà»#ñÔæ¾·ùþ§íøþæû)ýЎg6¯xæ§+~ôÓÏÚñ\ëŠç[W¨v¼ÐºâÅ·V¬ÏÄ}ÿþÖ}/½uß;6¾ußË?YþŠ¯¾¹üµ7—ozsÅë-Ëší œOٯŎ7[–ýäeo½A)qi«¶t³[´¥?k¾÷m;¶6ß»-™ä©ÿxÉ{?Î$Ò_¼¾ä};Ú^_²}Å=;6ÝCi–fÿØ´ø?_[LY÷¿^[L³ eàÿýê¢]v6¦øÍ+‹>²c=ËP¢Þ»ñîÿ›‰LÞþÃÙØ Ó¼³oÃÂý¶¿”I韼´°ãß3ÓÐÿ³g"Š?Ùó¥}óÅ4+õÐÄôÂü£/d¦š›øôôßê|š&(bö •™žì‰©²óQI‘pÄÀpd&Ê¿9‚²ßžL)¬áȜÂgö¹PüõùyÿmŸ`¯}¦ì”ÿl·µCÝ&Ô8ÔDŸÚÍEM×a·$5é7,¤F¦§–ßc_>KÒµ£ëHה.ñ;Í÷nÉ̒K©Ÿ¼þæ2êH/ÙS$õCêŸÔ©WS·§A£†Æ—ôÜ]ðù€*¡iZÞ{CŸÏ+Ðüå±é°##TdƒÁðùDs§å¢•N žÉýJOO3‡ÉdƒÈ×àR†îînºŽå]Ê,-éž'ùÄá…B–>ë‰@gUHZéátkS&ÞËÿkÜøÍïŠÊüpxK:£ O-^û.‰÷†e+ûRքú|>Sw¢¿³ŠÆêɅÞ CRKw慝;’þà?i¨ñ½o>>>>>>>>>>àwxaýk_îâóùí$Ý]6rÓÆçï>~ÒE+ííÌû­D" p)ƒA*•*ûR:ý<ÍîzÐKA2ßT¡i"ë‰@½Ëü˜‘qøLæSlsW1Œ^AXï.óiË:•YûD´õ7ï¹$^å™ÄßOù¨ûÕÐçó¿a*m–fù¢/P ЯI’Â6´¾®ë.o¸” -ÿé5Æ7àóáóáóáóáóáóáóáóáóáóÀYÛÆ5N^Ÿoš&¿£¤;h´[0|þ‰Á3.Z©¹Ó Øp»î.Ei -EÑ»Ì/´©,™_Ԕ֘C7ùÖ¦óoº4£÷GcY§Ä~²hq~4z„òmÏÀéôþˆKÖõcϯö#!UUiûÔó³–S÷¦³·×h˜Ð þ"ý¡¤â -ø|ø|ø|ø|ø|ø|ø|ø|ø|ø|@0pÖ}I’¤Úð{d^uæ40%½ßH|íó·êÿþþÚz0Î>n<sÑJC©³#Êù”Ó\䤮ëìe./ˆ¢X¨29«¼¿ÞßóÚ#s™¯-È´|$òѨu’–(¶•ùŠòaW<É]}QŸOá£þSCŸÏºeI5ê%Áæú܉žýpªÞ~]f,û…χχχχχχχχχÏ˲²t½{Õe:…èhª½G_û|âIúØvxÀÅ)íÿlˆ}k(u¶gàt<™Â q ìª(J“gdY.$ó ÃðÌOZéí"—ùʬ¹™‡·8W”çþ´¨ÌŖôȃTú|°_/Õ{˃•7侓ŸŸŸŸŸŸŸŸŸŸŸ¨9š¦ñW¹ A7°†aÔÉӑ°7Ð]=°× \ŠNËÆ×>Ÿä· ¼j4o°uø·Ô}}¨Ø A 4+Š¢w™ï®U)óä\×/yŌôV™|kÓyáYæ”óšÖÎW|ò‘Ö¢2_ÖF/­LÉÓ»Ïßy,á£~RCŸÏvM¿^ -=EûજËáóáóáóáóáóáóáóáóáóáóáóu‚®ëtӚ%pè¾UQ”ú1ù¦iºhüB%£•µú¾öù;%˜2R÷õ¥íÂ{­ÄÖI;ªúyÅ> Àhš&‚÷4ë¥Þ>Rò¬Æ3ÖJ²Kb2ßxú‚Ðÿ|ÌiæuýSGû´•ùì+îMsƒ½<åjèó öþH–o¯ ü÷ ÚKĆÕ?ÐE¼Q‘XðùðùðùðùðùðùðùðùðùðùàG Ã(I19Ëõ+øHÂ×>ÿÄà™,k´íP¿‹Yê8Më4wZYû€ ÂiM²kíÙI·6iK' -ç¯ãZ^[X™=Ãøð/2ŸóSÚ,Éçûë5¨qðù–eE Ô»(Šš¦E])ãYRÙ¿:œT¤’>>>>>>>>>>|݉;o«%Ibeo¹*‰Ö¤åªªÒ:ՐN¾öùÄÆ1§œßÛ;èb–vKÐ:»ŸÌªØ˲JzJÅ@É|›ï|©å%I·¬Sü?pªþB!Ë;øW(mz—ù͝–¿šk|¾sãïÕé…,Ëðùðùðùðùðùðùðùðùðùðùðù€šcFØFÓ4_¡5ÙWj"pø µ$IÞ«ì,ËâV¿RúÝï>籄SÎǓ©¢rÉYÕÏ*öƒ{(òn))µR‚ X#(ʇN-‰|äü_Mk÷"ó%Iç_éŠ'K*ÎgP}Dà}>ƒ½#±aÄ~D¼A_{#ÀçÃçÃçÃçÃçÃçÃçÃçÃçÃç¿Aö~o8öÛɱÀŠóEQ,㻼â´"O"üîór¾+ž¤%͝–‹_Š'SiG‰éûŸö%>3N —T*ÕׇKðKÉ^VòòTÓ4ç PEQK÷¾ Þœ¼ ¬×õOG7Q{Q“O!Š-¬žß0z鏶Ã%ùüߙ'ü5*ÇÁçóòƒ1â½z¡X' ÿ!ø|ø|ø|ø|ø|ø|ø|ø|ø|ø|(Ãçó -ùñ÷ùt;Ïv]Þý8ÿzE”ß}>±ñ@Œ¹£¶ÃiGÅ~ÞØÛ;Hëp+µÁøK{{ûÐБ¯éîîn·Á¥ ê¥Ôu)zú×} <§y! -Õä­ñ!S/¬ÅÃèÍZîEæÓw™Ì—åì#ê1þÐþ‰¿Få8øüzCQ” ->ð|>|>|>|>|>|>|>|>|>|> ᯊ3¸œ÷øÎ8ÝÀVä¥õ²žíºì÷Ö+xäðù\à«ûúècÏÀi¿ÔÜiÑ:û?:gø÷w ®Ûïtuu1 ŒKéw:::r/¥3c»ˆV˲$Iò.óiâ ¯4Z {—ùì)€ª~̖\þYI2Ÿ=-õרl@Ÿ_àóáóáóáóáóáóáóáóáóáó HI˜îèº>ÎύAy»¶, >ßɉÁ3Ü õ œ¦%îE¤ñdj(u–üõ¡¿`@ùþþþîîîcǎ¡)üN,£KyüøqöÑ4MQ³$|Þ/RbÌZÓA\ -’)+R>ÿ©að(ó)týÓtæu°^AXϖ\9÷—^4þ÷ÚºYþøÈ_—ÒÀçðùðùðùðùðùðùðùðùðùðù€¤R>¿&› yI’Êøº¦i|ŸOl;ÔÏkÃ.ºioï ­Óz0Î>Òw1 ¨C(Å ‚àE—$óiMÃ0 -픿í<£ûäcÛ=Ê|Mkg_žpËc×µ}ztÃÞøœµn öÍöoÕÐçSߦž©SÓ¦iR …B¾~µ>>>>>>>>>>ЀНoØ79t“ö†$I.õ™Õ†°Zâ}¨a\pUäv>>?‹®xÒE71í¿·w}l=ǀ ÞPÅ£„/IæS¢+”9³¶C™¶®(i¥wI™H˜E×µ¬S’¤—*óey_¨Ìº1Ýڔ>U”ô’Mq—»cû_ýÛëjèóé7‰Ëë'NèwNM^-¬ uåó/šñÕK˜¸bö˯/¿næÒY×/™%Ý3sÎâ™w.š¹àîwËÓïY8mÙ]ÓV,˜ºrÁTeþ”Õó¦<2/üè¼ð·çNþ·¹“¿sòwN~òŽÉkîŽÉOÝ>ù{·O¢xúöIß¿-?¸mÒ3qõ3,n½úGŽx¶ÒAÛ¤}Ñ~鞺}ÛöAÒÑ>6wò·æ…×Ì Ó)Љ¬š?…ΈÎëþSï»kêò»¦-]8mÉÂé‹åé‹äéòÝÓïº{ÆüE3æ-šA­qû¢™·.δÌÍ÷̤&ºqÉ57,¹æú%×\{ï¬kî5séµ3–^;uÙµSf±œÅu“½Å¤œ¸:'®Ê×_™W8ã¾ë¿‘/¾î!¾–‰ÙYñÕûfoúek•{™Ërc…טPJL,%./öÅÊ_+™‹þuo‘·_}#«ûåtÎ|}xT'Ïn£†µÑbª#¦9bº#f,=3³ƒ†ö¬k–fÆ8Ŭ‘¸Ö׍%O;®™=7äč#qÓ=,2ɄÅ7G‚2Ì͋gÞ2sFe¡[eâ6;n‰;ì¸s$æÚ1/3xP6›÷ŒvÜeÇÂáȤ;Yž~·‹±ØŽ{2A&–dbÚ½vP¶\zWfv X~.2¹ô¾SWØA©õ;VÚñ …uyP~h^&VÛñ°ØYz=Ñð Ôým{ÞyÌÊçß±ƒæ 6 ±ˆØó›’جô];ì¹éÜôÄf¨ ÏPÃÓS5¦¤²'²¼Aè3#GûÃá>‹Ü6<ç²³ûž#èÜY#¬³Û„µOd¤Å¨õ¾c·ç·íùñё)òaûº(ŽYr…=KÒå¦>°xáð,I}‰O‘l~¤ŽM]ýºÌ´8‹Æ×·M†ÏT ~^ö½á8CwâN¿¤iZQ9o†³pTQ”ŠI }>¡îës1Nñdj(u¶õ`|ãXW<‰@ýëç)õʐ”™Þô‚KÚ4M3Kæ»Ôðמ„™Þ.f;Ş"Ø0zeöe~$ò_(~i•µé¼ôVöû¿þá¬Kjìê«ÐÔTjèóY7öRfÀ~ øå×N^êÊç#ˆÕª4ØѶ¼ðño}@ýá;ŸŸ¹%Ï*@ ‡Ã‘ÑÐj´×äó5+RœŸ®Ïo;<à"ööbÔPŸð¤Ä¼º‹át¾¯äNIÛqy .ˆµÎd>Åïݺ®*ëK•ùô_(œ¿Îxú‚ÌŽŽfJÂ/ -»½ý4g퀇óú¥†>Ÿí”Àãñõ”mšfԆþ(o ðù|>@ àó~‡n ™ýör/\?¨ªêQF9‘$©R2?\Ÿßw“N͝VN€ A‰Ñ‹W/Iæ»lGÓ´,™_Á[y²dþv1,x´Î{÷„õÑ葑†íuþ×°Ìß%¥3¡ÓsÖº=*½(œôP`^¿Àç×ôÓ®ÐȅÏG àóŸhL4M£ûb­¦ö=‰…BM~ÅXÕçê¾>ïO¦0¨C,ËRm\¼ºw™ïîç)ÿ;W–뼸Ü!óµ¥™o×õOóµá)IÒ½Ë|Ãèåß ‡·œ«Ø_:1³»÷B쩁 ¤×´Å\òêç>¶Ü‚뺠†>Ÿý ðòƒ„½ÜTŸ¶Ñuÿ.¢?r­þ}þSk×Ѫ“¯¼Šá¥_¹¸Ú»CT$èJñ«FW°qN|ÛÖwª4¢ÑÕ§cœ}íuEקuœ_Aú"0¥Ö[ò'(À_Ð=#+ݬ‡ƒ¡ÛUö|A’¤°ºsgïT©d4À>¿í°[éÞÞA üˆ®ëe¾»Ÿ§¬ë\YQ”º>í|2Ÿ"ù(kEӌ‹bKy2?ÑÅ;Ø=yËÌÌîh§´ë̳ô/<ã’T—l¢ýú»kÕÐçÓÔïe"¦_¬óÓÜÈÑM- ØÐ0gW„}Ìú 4FŸ?ÐQ9}Q /Vð¨ÿ~Ð@N9ÿÛ={Š®Oë ÌØw`J€FÀ4Mfŋ¢(J­nÛëŠûü®xÒE=5wZ/øŽ¬Šú²e~z´Ï¯í‹ZÅ) ósëó£Ñ#‚°¾l™OXÝ¿¥]諾Ìv—>4Ü2’”ž¾ô¤KR½rî`?)J }>ïØî]‘ÿtaº;x°B 竈ªªæ6 |>¨P¸ÁwÀç7˜R ðp5]¡PCOåöù„º¯ÏÅ>œ)Œ|DeþpŠPUI’œò°I˜…d¾¦µ>=š| -Ql±¬Syv·K6ù*_LSÄÊ͖KFýâ…gê¼!‹RCŸOЯ¶kµ€;â2?À¿[˜ÏϽ(Yï#Àçƒj… Ð||~#€)‚®ëMeQïe™U&Ø>¿íð€‹}ú¯?õvtttww§Rûþ&‹áRþR:_ªªˆÌ÷ '¢Ee¾e’åÞe>­\pw{äa™¿gT3¾ülÌ%®i‹ ‚ïGem}¾ógL(¢Ù9:u~nû\œŸ†Ï5 - 3øøüFS*ç­®(ŠtKȗÐáAà«Ñ ²iš ÞnÁöù]ñ¤‹€Ú`ü¥Ý&‘H`ùšŽŽ\Ê:GÓ4–“Ýe{¡KIßò(ó³¼_HZéí¢‹Ì7͸(¶x—ùYUýyv·?â¬Ìgüñ÷.étÎÚIòý¨¬­ÏO{{…~º8QÀ烅 Ð||~#€) ¿Á0 ¾œÝŠ¢è\Y×ufõ³–7&Áöù„º¯ÏÅAíݟ1NÉd=Á×ôôô0sˆKYo˜¦IIÆù ÕݔvwwÓuìèèp^Jï2?¨ï[iZ{!!o½‚°Þ£É§5iýòŽÁýu§‹Âɬ¶Ï{)뜚û|v ì§K.¡P(À•ù ø|PC p:ƒï€Ïo0¥@€áR:뎏/·,˹Ü0ŒÀVr–ÛtAòùñdªgà4ûÛÝAí>ƒ‰D—²®ˆF£y=¼{ªI¥RÎKI©[Å—ù†Ñ[HæGÛ~-œ¿Î£ÌÅË:å}¿C©³”?)(£¦‹=ìÊüïÞÞÁB—Ò/¶æ>ä¢4;óW éïÀ›||>¨!P¸ÁwÀç7˜R ÀH’ÄnÀÅùi»Ÿ-§ûÁ¬¯pmšf#7]ð|~ÏÀiæ—vKÐÇ®xÒÅA5wZ>TMÓòJxZX’r§|žUØ߀2?ñ™GòÊü¬¢}÷å¥îw÷ñ“,On;ÔbðŒK"åÑz0î󦮟߰À烅 Ð||~#€) 9=k9¿7Ï­Ã7M“ý—ÚØ?҂çó¹ƒR÷õ±%îe¥¬ôt(u¶gà4ûP6ykòiaîCUw4MóhòA(uã¾#ù(Þ¢ëŸ:Ú§™¯ª—±Sž9Y•¾Ÿ¿íP¿¯Û>¿æ(Š’õkÄ0 Z’õÀΩÚÊ/ÎgŒ@>ø(\€Îà;àóL©` -ù|˲ØrºCÌýV( -’Ç.àù|giÏÀiZân¢ööÒ:ÄØ#€¡ÔY (ʆgcfÚ)ÔñTއ…d~ÖkY Jþ’$ÑÁäý_¿ã]æ ÂúhôÈè–9¥ªG"Ñ.»Øÿِ3‘º?åAßòuÃÂçûø|Pí~…‹Î€Îà àóL©`¸AÊG.²ºÐS€†"x>?="ç)vKÐÇ®xÒE@5wZ´ÿH+c@P6š¦ ‚ ŠbV=­G,Ë¢ïŽQæÓBú¯àe¶‘ö*óE±Å4ãÎïÒGZÈþW–w¸ì¥õ`œ¥DJ§î)Ô~ -ŸïàóAµû.::ƒ/€Ïo0¥@€áR:× 15$Bî·àóÓõù¼ ã[â^\O¦š;-ö7} -€šF¹‡/ -åv˲r7Â(ðÕdYR©êÇe¾,ïȪÀ7Œ^AXï\¡Ð^(%:ß`rÅ)ëÙ¨ß{ |¾/€ÏÕîWP¸è è ¾>¿À” -Æ0ŒB嚒$±ÿÒuݹܲ,ܶ§êóÕ¤ñd*í0üycoïàÎc ö·º¯ -'”TUU-¯ÞÞ#”EiòŒ‹Ìw®&ËrÞÕꎄ™>-º–,ïð(óUõ㜖UÕ/þó“Y¶ß O˜”)…º?å±ûøI¿wuø|¿ÐñÉ'¿Ý³§ìèïï¯öB>ø(\€Îà;àóL©lB¡¿ ‡Ã\=q½C+8Ŏ,ËÁóØeHŸO8]}z´áύփñƒgøGZ -48ÌáK’ä¬uW«sK«ëº3…ŽÊ‹ÌWÅm}HK·6eâ÷nì]ækZ»ûwåI·[›ÎKïÉÿæÂPê,øm‡ö6äEæSPõ{·‡Ï•òÁ@átߟß`J€`ã¼ wÚi˲¸¢?E‰D"¢(ò5«ZtZÿÕço;ÔÏ]=[â^b:”:»ñ@ŒýMßŀ¥JJ†”!)é”.*¾Sþ -•G -C–Ì÷Mbé­Â°ÏßY0 —-ó-ë”(¶8Wxò–™î»s -üƒgx.uʟðù R@>ø(\€Îà;àóL©x4MãêÞi§UU-¤†DQlðF ªÏw*©¡ÔYZÒvxÀEFÑú»ŸÌú -ð ©Tª¯¯/‘H )ʆ¿²äRošf÷¨ëº³ø¿(´2}%廬 ó)i.'™/ë£Ñ#Î/Fo(ôÚ¹Î_§¯úò¹ÝÍߘ͝KƒOüÊúÁ³g=çS‚ À¨„Ï•òÁ@átߟß`J€FÀ²,UU%IRŹœ>æÚ¡p8Lë7x‹ÕçǓ)§«§%]ñ¤‹ŒÚv¨?÷+À/tww·Û á•InY¾ ´RD4­ì¾hƒ.ozöjFÞ­™¦éw™o¾ð…è+«-ëTîZÞe¾aôæ\Ó-|ñK«Œ§/6ù´ß˜Qè¸xœpÃ) -—´ù@ó¹Ò}J°•ðù R8åÃ¥_¹xîíw ê?èJñ«¶lɽèƍŒÓçO¾ò*ŒŽº1ú|4 /‚Æ |>42¦i*Š¶‘e¹Pg£TŸŸvT™î>~’>¥Ü -MÕ}}ίl;ԏ¾á#ººº˜9D‰¾˲¢Ñ¨Ç§–”C¡Kªª’çc„òpÑò¾àrN뙟´ÒÛEf׍§/Î_×Ôô£P赬µÆ"ó IÒÙ -ÒDÙÚtް̧ý&ݺKƒ+7[MMé%›â.i³eÛ ¶2ý›»ŽŽߍJø|P)œ>áǀ2jp²D1ÂQ†ÏG 9>%À>¿+žT÷õm<‹'SlɶCý.nŠÖßÛ;È?òoú§¿¿¿»»ûرchŠh4ªªª,Ë¢(òÊöz80˲ò¾'UÊQE7Nç -…ü(ó­Mç‰_ZÅÍüè““ÌOgžžÄŸ¼ãVuÁÕÃ&Ÿbì.óÓö£ÏžÓŸûüÙ/\ðw—„IñÉÎnZŸVλX,F£òøñãþ>ðù "ÀçC_ŸŸ@rê™ûü\ö6äâ¦Ú8køO žA÷õiš4Š?%úU‚öNG(B©&? -E£Ñ^³™O!M”¹™W”ù*c—ùöGΙ| -úè MK75¥¯œ;è’0<ß_ÓnUàóA¥€Ï‡2¾>>ä Ô3 åóãɔ‹žÚx –¶ëÁøîã'Ñ7@ýcšfQ+.IR­¯l“O(ŠbϧG9ö'o™Éͼ(¶ðU*#ó‰]Ò𾶠-飺÷c¤Ù ©)½r³å’0'Üpªv=«ZÀçƒJñÛ={^TÕ‰5«vʖ`œÔ;[·¢72Ô‚=l'_y•S㤎=ZôÊÒ:HÈHÎ@h(ŸO4wº*ÔäáԏAh8+Š¢ëz­”¸iš²,—gò[–ÏØfŽ]_õe§™·¬Sìÿ+&󉘑ÙÝ.)ó‡g ##ó¿pÁß]RedW­¼I>€2ȪwEƒPÿ8_@xQUÑ  @ÝÂýs¥²8*¥=Äçïít‘T;%0Ä@m1 CUUMÓ<®/IR(¢ñKcY×uÓ4k{üÌ䗝é,‚Y–Ï9ª§· -ÆÓç¯ãrž›ùJÊür‘åŒÏŸýpÂ%UÎY;@ëOÀçPÐGøøü ‚„  nÏ¯R{6ˆÏ?1xÆER5wZb`œ1MSÓ4EQh :S“ê·Û+:‹¬S( Q Ãh„+nY§B¡×¸œ×´v¶¼d¾e¥!ãó×´Å\RåEá$­¼ËŸ@@à;àóƒ -2€º>¿JíÙ >ŸØxÀÍSœ)Œ2Pm,Ë¢¡GƒN—Ju_œ‹išŠ¢¸œHQ軾{x1Âá-\Î+ʇ™EI«d>Aס©)ýŠݞ{FvõÑ:¡ Þ#ÂçPÐGøøü ‚„  n1M3ZY–¥ž‘HDÓ4þ¿¬––;Ë_i¹eYÜž èówK¸¨ª½½ƒe ÚH’䮸iÊuu~º®¥ Ÿ™|JA–„¹œ‡·d>'-ù¦ï—!ó5­×öW -šššÒ³vK’ô¿´Ž¢ðÒÀçPÐGøøü ‚„ ÀwhšÆ‘{É=ý/³ú´¦a Þn èó{N»¨ªÖƒqŒ&Pmr58%%EQ(ÕRÒu]–å±ä3h#ŸY¨ª$í/Š-MM?¢-ë”w™ -½æ”ù¼ž_U?®à±ÉrÆç¯is{‰é‹ž¡uêþqS9ÀçPÐGøøü ‚„ À_X–ÅäýëEÑú\é£>¿Ñ|>¡îës±UC©³SÀ;ÑhT×õˆûÃDŽa’$ɲÌÞòÅiVJã³lãñ±ÏÕÌÿ¨ÏÉÈütZžûS/2Xþ·É©px ÿ¯Hä£ -XÊ0ZÂßvIkÚbMMiQ ìX†Ï T ððùA €¿PU•Ý€kšæñ+¦i²¯D"‘FnºÆôùm‡\„Õþφ0¦üE,ëèèèîîN¥RUÝå ¦îeY¦!“+·iI–Η²«$IM‚Íýù…óR† -…øwé0ÖoßøáKeÈ|VÞÏBÖ;‹öÇΙhtóóoº¤ÇÙ'ššÒ^nýÇmTVø|ÊúߟTø ®›J*¶geŸbP ½Ñ˜>¿+žtVÛõcLù‹ŽŽŽv›D"Q½½8]Ÿ ~oLÊ¢¬ßéÒÇmÐKM>¿”mmmÎÇ%”¨ö.•ñî3c”ùâ—VO_îTÇr»Ÿ¤Œwbð ûO¦\r#Å/:×O$…d¾³Ì»Y[Ë mŠ% Qi¼Ð1ÐñÐKJ;õ9‚$I^Ú§ h³´ýR§¯¯oɒ%Y‚Ö¹iâ—VUFæSü^)û@6ˆeù|u_ŸKb|èñ¿<þîpæl=wßx*•*4*ëyPÀçP*ÐGøøü ‚„ À_(ŠÂnÀ#‘ˆÇ¯˜¦É¾ -5ôLÇ}¾ eT,³Æ»â}SYUÓ¹¨žpjšÍãïþši¨çö˜ôñ»?Þ⢭Ú°íœ<Óz0N#…1 ÃãQњQW¼ËO^s>öM9*ï zqݯ ÇÎàQÂ{iy§ s1Ï>uò%Aç¨ë:°MՄ¶O°Œ#¤ šõ‚€êë{ÌùN̐'Ý^1™¿§ü‡¼8Ÿ‚½¸ä\’‘]}Ñ>ãw?¼1Ÿ@@à;àóƒ -2¡ë:÷r^ŸeYÜ°ø³¸Ï/¯bً,­ì¦¼\_Z'÷‹n¸ƒ›¨/\ð.æJÝ×Ç6Õz0ΖÐ×]ŽÊ‹ Î{Tå‰e/ºÛ㦼•ÇÿÎàeSÎÁ -…ø“øüE€e>š¦it²üu¤êA]Žv4–Æt>h ­•÷P .HZéíbÆ·ïýÞSÌИ^’Ì·‡Ã‘ŠË|¢¹ÓbÉmãX֒¼ñݖ£NáO¦‚7^àó(è#||~PABà;¸­*jè†ÝYÚu¹.¸øüq¶Á7UvIöç>ÿ?¸‰š¾t -yâW†‹¼:1x&íðù ž³~u}nª‚Á²¬¼þÙù‰÷÷>ñtø ʨ´Gºjcß|sŠpþº¢>_×?ÍݤñáÑïüS¥d~Úñ¤’ç·pɇo:|¸÷ïY‚|>e}€ï€Ï*HÈüˆa%Õ£Bæ§>ߣþõ5]ñ¤³üžÂÅ_1ÍO¦¯°€‰F£”ÁdY.úd§þ5~ HZé­Â°u§?#­Ô©†ÿeYQ™‰|”³|›•ùÎRüÝÇOҒ¡ÔY÷âüWßèu>ܤõƒ:¬àó(è#||~PABàS,ˊD"E+TC¡÷¢ñ`ÓP>ŸP÷õ9Ëï7ˆ¹(¬žÓ´Ns§Å>n;ԏjE >AIU’$MÓ ñ‹°K:'Þ;UË:e½é„];¡¨Ì—$½àf+'óӎâ|ʇÌÌï>~Ò%®i‹uV#dBø|ÊúߟTø˲4MË_ápXQ˜|'æóÛ8ËïwK¸X,Z™Öi„ªTP‡ÔVàó´@)Â0 \OÕω÷]’e„õQÿ ¥hq¾(¶Ðú·|HK \ No newline at end of file diff --git a/vendor/snap/data/plrabn12.txt b/vendor/snap/data/plrabn12.txt deleted file mode 100644 index 34088b82cd..0000000000 --- a/vendor/snap/data/plrabn12.txt +++ /dev/null @@ -1,10699 +0,0 @@ - -This is the February 1992 Project Gutenberg release of: - -Paradise Lost by John Milton - -The oldest etext known to Project Gutenberg (ca. 1964-1965) -(If you know of any older ones, please let us know.) - - -Introduction (one page) - -This etext was originally created in 1964-1965 according to Dr. -Joseph Raben of Queens College, NY, to whom it is attributed by -Project Gutenberg. We had heard of this etext for years but it -was not until 1991 that we actually managed to track it down to -a specific location, and then it took months to convince people -to let us have a copy, then more months for them actually to do -the copying and get it to us. Then another month to convert to -something we could massage with our favorite 486 in DOS. After -that is was only a matter of days to get it into this shape you -will see below. The original was, of course, in CAPS only, and -so were all the other etexts of the 60's and early 70's. Don't -let anyone fool you into thinking any etext with both upper and -lower case is an original; all those original Project Gutenberg -etexts were also in upper case and were translated or rewritten -many times to get them into their current condition. They have -been worked on by many people throughout the world. - -In the course of our searches for Professor Raben and his etext -we were never able to determine where copies were or which of a -variety of editions he may have used as a source. We did get a -little information here and there, but even after we received a -copy of the etext we were unwilling to release it without first -determining that it was in fact Public Domain and finding Raben -to verify this and get his permission. Interested enough, in a -totally unrelated action to our searches for him, the professor -subscribed to the Project Gutenberg listserver and we happened, -by accident, to notice his name. (We don't really look at every -subscription request as the computers usually handle them.) The -etext was then properly identified, copyright analyzed, and the -current edition prepared. - -To give you an estimation of the difference in the original and -what we have today: the original was probably entered on cards -commonly known at the time as "IBM cards" (Do Not Fold, Spindle -or Mutilate) and probably took in excess of 100,000 of them. A -single card could hold 80 characters (hence 80 characters is an -accepted standard for so many computer margins), and the entire -original edition we received in all caps was over 800,000 chars -in length, including line enumeration, symbols for caps and the -punctuation marks, etc., since they were not available keyboard -characters at the time (probably the keyboards operated at baud -rates of around 113, meaning the typists had to type slowly for -the keyboard to keep up). - -This is the second version of Paradise Lost released by Project -Gutenberg. The first was released as our October, 1991 etext. - - - - - -Paradise Lost - - - - -Book I - - -Of Man's first disobedience, and the fruit -Of that forbidden tree whose mortal taste -Brought death into the World, and all our woe, -With loss of Eden, till one greater Man -Restore us, and regain the blissful seat, -Sing, Heavenly Muse, that, on the secret top -Of Oreb, or of Sinai, didst inspire -That shepherd who first taught the chosen seed -In the beginning how the heavens and earth -Rose out of Chaos: or, if Sion hill -Delight thee more, and Siloa's brook that flowed -Fast by the oracle of God, I thence -Invoke thy aid to my adventurous song, -That with no middle flight intends to soar -Above th' Aonian mount, while it pursues -Things unattempted yet in prose or rhyme. -And chiefly thou, O Spirit, that dost prefer -Before all temples th' upright heart and pure, -Instruct me, for thou know'st; thou from the first -Wast present, and, with mighty wings outspread, -Dove-like sat'st brooding on the vast Abyss, -And mad'st it pregnant: what in me is dark -Illumine, what is low raise and support; -That, to the height of this great argument, -I may assert Eternal Providence, -And justify the ways of God to men. - Say first--for Heaven hides nothing from thy view, -Nor the deep tract of Hell--say first what cause -Moved our grand parents, in that happy state, -Favoured of Heaven so highly, to fall off -From their Creator, and transgress his will -For one restraint, lords of the World besides. -Who first seduced them to that foul revolt? - Th' infernal Serpent; he it was whose guile, -Stirred up with envy and revenge, deceived -The mother of mankind, what time his pride -Had cast him out from Heaven, with all his host -Of rebel Angels, by whose aid, aspiring -To set himself in glory above his peers, -He trusted to have equalled the Most High, -If he opposed, and with ambitious aim -Against the throne and monarchy of God, -Raised impious war in Heaven and battle proud, -With vain attempt. Him the Almighty Power -Hurled headlong flaming from th' ethereal sky, -With hideous ruin and combustion, down -To bottomless perdition, there to dwell -In adamantine chains and penal fire, -Who durst defy th' Omnipotent to arms. - Nine times the space that measures day and night -To mortal men, he, with his horrid crew, -Lay vanquished, rolling in the fiery gulf, -Confounded, though immortal. But his doom -Reserved him to more wrath; for now the thought -Both of lost happiness and lasting pain -Torments him: round he throws his baleful eyes, -That witnessed huge affliction and dismay, -Mixed with obdurate pride and steadfast hate. -At once, as far as Angels ken, he views -The dismal situation waste and wild. -A dungeon horrible, on all sides round, -As one great furnace flamed; yet from those flames -No light; but rather darkness visible -Served only to discover sights of woe, -Regions of sorrow, doleful shades, where peace -And rest can never dwell, hope never comes -That comes to all, but torture without end -Still urges, and a fiery deluge, fed -With ever-burning sulphur unconsumed. -Such place Eternal Justice has prepared -For those rebellious; here their prison ordained -In utter darkness, and their portion set, -As far removed from God and light of Heaven -As from the centre thrice to th' utmost pole. -Oh how unlike the place from whence they fell! -There the companions of his fall, o'erwhelmed -With floods and whirlwinds of tempestuous fire, -He soon discerns; and, weltering by his side, -One next himself in power, and next in crime, -Long after known in Palestine, and named -Beelzebub. To whom th' Arch-Enemy, -And thence in Heaven called Satan, with bold words -Breaking the horrid silence, thus began:-- - "If thou beest he--but O how fallen! how changed -From him who, in the happy realms of light -Clothed with transcendent brightness, didst outshine -Myriads, though bright!--if he whom mutual league, -United thoughts and counsels, equal hope -And hazard in the glorious enterprise -Joined with me once, now misery hath joined -In equal ruin; into what pit thou seest -From what height fallen: so much the stronger proved -He with his thunder; and till then who knew -The force of those dire arms? Yet not for those, -Nor what the potent Victor in his rage -Can else inflict, do I repent, or change, -Though changed in outward lustre, that fixed mind, -And high disdain from sense of injured merit, -That with the Mightiest raised me to contend, -And to the fierce contentions brought along -Innumerable force of Spirits armed, -That durst dislike his reign, and, me preferring, -His utmost power with adverse power opposed -In dubious battle on the plains of Heaven, -And shook his throne. What though the field be lost? -All is not lost--the unconquerable will, -And study of revenge, immortal hate, -And courage never to submit or yield: -And what is else not to be overcome? -That glory never shall his wrath or might -Extort from me. To bow and sue for grace -With suppliant knee, and deify his power -Who, from the terror of this arm, so late -Doubted his empire--that were low indeed; -That were an ignominy and shame beneath -This downfall; since, by fate, the strength of Gods, -And this empyreal sybstance, cannot fail; -Since, through experience of this great event, -In arms not worse, in foresight much advanced, -We may with more successful hope resolve -To wage by force or guile eternal war, -Irreconcilable to our grand Foe, -Who now triumphs, and in th' excess of joy -Sole reigning holds the tyranny of Heaven." - So spake th' apostate Angel, though in pain, -Vaunting aloud, but racked with deep despair; -And him thus answered soon his bold compeer:-- - "O Prince, O Chief of many throned Powers -That led th' embattled Seraphim to war -Under thy conduct, and, in dreadful deeds -Fearless, endangered Heaven's perpetual King, -And put to proof his high supremacy, -Whether upheld by strength, or chance, or fate, -Too well I see and rue the dire event -That, with sad overthrow and foul defeat, -Hath lost us Heaven, and all this mighty host -In horrible destruction laid thus low, -As far as Gods and heavenly Essences -Can perish: for the mind and spirit remains -Invincible, and vigour soon returns, -Though all our glory extinct, and happy state -Here swallowed up in endless misery. -But what if he our Conqueror (whom I now -Of force believe almighty, since no less -Than such could have o'erpowered such force as ours) -Have left us this our spirit and strength entire, -Strongly to suffer and support our pains, -That we may so suffice his vengeful ire, -Or do him mightier service as his thralls -By right of war, whate'er his business be, -Here in the heart of Hell to work in fire, -Or do his errands in the gloomy Deep? -What can it the avail though yet we feel -Strength undiminished, or eternal being -To undergo eternal punishment?" - Whereto with speedy words th' Arch-Fiend replied:-- -"Fallen Cherub, to be weak is miserable, -Doing or suffering: but of this be sure-- -To do aught good never will be our task, -But ever to do ill our sole delight, -As being the contrary to his high will -Whom we resist. If then his providence -Out of our evil seek to bring forth good, -Our labour must be to pervert that end, -And out of good still to find means of evil; -Which ofttimes may succeed so as perhaps -Shall grieve him, if I fail not, and disturb -His inmost counsels from their destined aim. -But see! the angry Victor hath recalled -His ministers of vengeance and pursuit -Back to the gates of Heaven: the sulphurous hail, -Shot after us in storm, o'erblown hath laid -The fiery surge that from the precipice -Of Heaven received us falling; and the thunder, -Winged with red lightning and impetuous rage, -Perhaps hath spent his shafts, and ceases now -To bellow through the vast and boundless Deep. -Let us not slip th' occasion, whether scorn -Or satiate fury yield it from our Foe. -Seest thou yon dreary plain, forlorn and wild, -The seat of desolation, void of light, -Save what the glimmering of these livid flames -Casts pale and dreadful? Thither let us tend -From off the tossing of these fiery waves; -There rest, if any rest can harbour there; -And, re-assembling our afflicted powers, -Consult how we may henceforth most offend -Our enemy, our own loss how repair, -How overcome this dire calamity, -What reinforcement we may gain from hope, -If not, what resolution from despair." - Thus Satan, talking to his nearest mate, -With head uplift above the wave, and eyes -That sparkling blazed; his other parts besides -Prone on the flood, extended long and large, -Lay floating many a rood, in bulk as huge -As whom the fables name of monstrous size, -Titanian or Earth-born, that warred on Jove, -Briareos or Typhon, whom the den -By ancient Tarsus held, or that sea-beast -Leviathan, which God of all his works -Created hugest that swim th' ocean-stream. -Him, haply slumbering on the Norway foam, -The pilot of some small night-foundered skiff, -Deeming some island, oft, as seamen tell, -With fixed anchor in his scaly rind, -Moors by his side under the lee, while night -Invests the sea, and wished morn delays. -So stretched out huge in length the Arch-fiend lay, -Chained on the burning lake; nor ever thence -Had risen, or heaved his head, but that the will -And high permission of all-ruling Heaven -Left him at large to his own dark designs, -That with reiterated crimes he might -Heap on himself damnation, while he sought -Evil to others, and enraged might see -How all his malice served but to bring forth -Infinite goodness, grace, and mercy, shewn -On Man by him seduced, but on himself -Treble confusion, wrath, and vengeance poured. - Forthwith upright he rears from off the pool -His mighty stature; on each hand the flames -Driven backward slope their pointing spires, and,rolled -In billows, leave i' th' midst a horrid vale. -Then with expanded wings he steers his flight -Aloft, incumbent on the dusky air, -That felt unusual weight; till on dry land -He lights--if it were land that ever burned -With solid, as the lake with liquid fire, -And such appeared in hue as when the force -Of subterranean wind transprots a hill -Torn from Pelorus, or the shattered side -Of thundering Etna, whose combustible -And fuelled entrails, thence conceiving fire, -Sublimed with mineral fury, aid the winds, -And leave a singed bottom all involved -With stench and smoke. Such resting found the sole -Of unblest feet. Him followed his next mate; -Both glorying to have scaped the Stygian flood -As gods, and by their own recovered strength, -Not by the sufferance of supernal Power. - "Is this the region, this the soil, the clime," -Said then the lost Archangel, "this the seat -That we must change for Heaven?--this mournful gloom -For that celestial light? Be it so, since he -Who now is sovereign can dispose and bid -What shall be right: farthest from him is best -Whom reason hath equalled, force hath made supreme -Above his equals. Farewell, happy fields, -Where joy for ever dwells! Hail, horrors! hail, -Infernal world! and thou, profoundest Hell, -Receive thy new possessor--one who brings -A mind not to be changed by place or time. -The mind is its own place, and in itself -Can make a Heaven of Hell, a Hell of Heaven. -What matter where, if I be still the same, -And what I should be, all but less than he -Whom thunder hath made greater? Here at least -We shall be free; th' Almighty hath not built -Here for his envy, will not drive us hence: -Here we may reigh secure; and, in my choice, -To reign is worth ambition, though in Hell: -Better to reign in Hell than serve in Heaven. -But wherefore let we then our faithful friends, -Th' associates and co-partners of our loss, -Lie thus astonished on th' oblivious pool, -And call them not to share with us their part -In this unhappy mansion, or once more -With rallied arms to try what may be yet -Regained in Heaven, or what more lost in Hell?" - So Satan spake; and him Beelzebub -Thus answered:--"Leader of those armies bright -Which, but th' Omnipotent, none could have foiled! -If once they hear that voice, their liveliest pledge -Of hope in fears and dangers--heard so oft -In worst extremes, and on the perilous edge -Of battle, when it raged, in all assaults -Their surest signal--they will soon resume -New courage and revive, though now they lie -Grovelling and prostrate on yon lake of fire, -As we erewhile, astounded and amazed; -No wonder, fallen such a pernicious height!" - He scare had ceased when the superior Fiend -Was moving toward the shore; his ponderous shield, -Ethereal temper, massy, large, and round, -Behind him cast. The broad circumference -Hung on his shoulders like the moon, whose orb -Through optic glass the Tuscan artist views -At evening, from the top of Fesole, -Or in Valdarno, to descry new lands, -Rivers, or mountains, in her spotty globe. -His spear--to equal which the tallest pine -Hewn on Norwegian hills, to be the mast -Of some great ammiral, were but a wand-- -He walked with, to support uneasy steps -Over the burning marl, not like those steps -On Heaven's azure; and the torrid clime -Smote on him sore besides, vaulted with fire. -Nathless he so endured, till on the beach -Of that inflamed sea he stood, and called -His legions--Angel Forms, who lay entranced -Thick as autumnal leaves that strow the brooks -In Vallombrosa, where th' Etrurian shades -High over-arched embower; or scattered sedge -Afloat, when with fierce winds Orion armed -Hath vexed the Red-Sea coast, whose waves o'erthrew -Busiris and his Memphian chivalry, -While with perfidious hatred they pursued -The sojourners of Goshen, who beheld -From the safe shore their floating carcases -And broken chariot-wheels. So thick bestrown, -Abject and lost, lay these, covering the flood, -Under amazement of their hideous change. -He called so loud that all the hollow deep -Of Hell resounded:--"Princes, Potentates, -Warriors, the Flower of Heaven--once yours; now lost, -If such astonishment as this can seize -Eternal Spirits! Or have ye chosen this place -After the toil of battle to repose -Your wearied virtue, for the ease you find -To slumber here, as in the vales of Heaven? -Or in this abject posture have ye sworn -To adore the Conqueror, who now beholds -Cherub and Seraph rolling in the flood -With scattered arms and ensigns, till anon -His swift pursuers from Heaven-gates discern -Th' advantage, and, descending, tread us down -Thus drooping, or with linked thunderbolts -Transfix us to the bottom of this gulf? -Awake, arise, or be for ever fallen!" - They heard, and were abashed, and up they sprung -Upon the wing, as when men wont to watch -On duty, sleeping found by whom they dread, -Rouse and bestir themselves ere well awake. -Nor did they not perceive the evil plight -In which they were, or the fierce pains not feel; -Yet to their General's voice they soon obeyed -Innumerable. As when the potent rod -Of Amram's son, in Egypt's evil day, -Waved round the coast, up-called a pitchy cloud -Of locusts, warping on the eastern wind, -That o'er the realm of impious Pharaoh hung -Like Night, and darkened all the land of Nile; -So numberless were those bad Angels seen -Hovering on wing under the cope of Hell, -'Twixt upper, nether, and surrounding fires; -Till, as a signal given, th' uplifted spear -Of their great Sultan waving to direct -Their course, in even balance down they light -On the firm brimstone, and fill all the plain: -A multitude like which the populous North -Poured never from her frozen loins to pass -Rhene or the Danaw, when her barbarous sons -Came like a deluge on the South, and spread -Beneath Gibraltar to the Libyan sands. -Forthwith, form every squadron and each band, -The heads and leaders thither haste where stood -Their great Commander--godlike Shapes, and Forms -Excelling human; princely Dignities; -And Powers that erst in Heaven sat on thrones, -Though on their names in Heavenly records now -Be no memorial, blotted out and rased -By their rebellion from the Books of Life. -Nor had they yet among the sons of Eve -Got them new names, till, wandering o'er the earth, -Through God's high sufferance for the trial of man, -By falsities and lies the greatest part -Of mankind they corrupted to forsake -God their Creator, and th' invisible -Glory of him that made them to transform -Oft to the image of a brute, adorned -With gay religions full of pomp and gold, -And devils to adore for deities: -Then were they known to men by various names, -And various idols through the heathen world. - Say, Muse, their names then known, who first, who last, -Roused from the slumber on that fiery couch, -At their great Emperor's call, as next in worth -Came singly where he stood on the bare strand, -While the promiscuous crowd stood yet aloof? - The chief were those who, from the pit of Hell -Roaming to seek their prey on Earth, durst fix -Their seats, long after, next the seat of God, -Their altars by his altar, gods adored -Among the nations round, and durst abide -Jehovah thundering out of Sion, throned -Between the Cherubim; yea, often placed -Within his sanctuary itself their shrines, -Abominations; and with cursed things -His holy rites and solemn feasts profaned, -And with their darkness durst affront his light. -First, Moloch, horrid king, besmeared with blood -Of human sacrifice, and parents' tears; -Though, for the noise of drums and timbrels loud, -Their children's cries unheard that passed through fire -To his grim idol. Him the Ammonite -Worshiped in Rabba and her watery plain, -In Argob and in Basan, to the stream -Of utmost Arnon. Nor content with such -Audacious neighbourhood, the wisest heart -Of Solomon he led by fraoud to build -His temple right against the temple of God -On that opprobrious hill, and made his grove -The pleasant valley of Hinnom, Tophet thence -And black Gehenna called, the type of Hell. -Next Chemos, th' obscene dread of Moab's sons, -From Aroar to Nebo and the wild -Of southmost Abarim; in Hesebon -And Horonaim, Seon's real, beyond -The flowery dale of Sibma clad with vines, -And Eleale to th' Asphaltic Pool: -Peor his other name, when he enticed -Israel in Sittim, on their march from Nile, -To do him wanton rites, which cost them woe. -Yet thence his lustful orgies he enlarged -Even to that hill of scandal, by the grove -Of Moloch homicide, lust hard by hate, -Till good Josiah drove them thence to Hell. -With these came they who, from the bordering flood -Of old Euphrates to the brook that parts -Egypt from Syrian ground, had general names -Of Baalim and Ashtaroth--those male, -These feminine. For Spirits, when they please, -Can either sex assume, or both; so soft -And uncompounded is their essence pure, -Not tried or manacled with joint or limb, -Nor founded on the brittle strength of bones, -Like cumbrous flesh; but, in what shape they choose, -Dilated or condensed, bright or obscure, -Can execute their airy purposes, -And works of love or enmity fulfil. -For those the race of Israel oft forsook -Their Living Strength, and unfrequented left -His righteous altar, bowing lowly down -To bestial gods; for which their heads as low -Bowed down in battle, sunk before the spear -Of despicable foes. With these in troop -Came Astoreth, whom the Phoenicians called -Astarte, queen of heaven, with crescent horns; -To whose bright image nigntly by the moon -Sidonian virgins paid their vows and songs; -In Sion also not unsung, where stood -Her temple on th' offensive mountain, built -By that uxorious king whose heart, though large, -Beguiled by fair idolatresses, fell -To idols foul. Thammuz came next behind, -Whose annual wound in Lebanon allured -The Syrian damsels to lament his fate -In amorous ditties all a summer's day, -While smooth Adonis from his native rock -Ran purple to the sea, supposed with blood -Of Thammuz yearly wounded: the love-tale -Infected Sion's daughters with like heat, -Whose wanton passions in the sacred proch -Ezekiel saw, when, by the vision led, -His eye surveyed the dark idolatries -Of alienated Judah. Next came one -Who mourned in earnest, when the captive ark -Maimed his brute image, head and hands lopt off, -In his own temple, on the grunsel-edge, -Where he fell flat and shamed his worshippers: -Dagon his name, sea-monster,upward man -And downward fish; yet had his temple high -Reared in Azotus, dreaded through the coast -Of Palestine, in Gath and Ascalon, -And Accaron and Gaza's frontier bounds. -Him followed Rimmon, whose delightful seat -Was fair Damascus, on the fertile banks -Of Abbana and Pharphar, lucid streams. -He also against the house of God was bold: -A leper once he lost, and gained a king-- -Ahaz, his sottish conqueror, whom he drew -God's altar to disparage and displace -For one of Syrian mode, whereon to burn -His odious offerings, and adore the gods -Whom he had vanquished. After these appeared -A crew who, under names of old renown-- -Osiris, Isis, Orus, and their train-- -With monstrous shapes and sorceries abused -Fanatic Egypt and her priests to seek -Their wandering gods disguised in brutish forms -Rather than human. Nor did Israel scape -Th' infection, when their borrowed gold composed -The calf in Oreb; and the rebel king -Doubled that sin in Bethel and in Dan, -Likening his Maker to the grazed ox-- -Jehovah, who, in one night, when he passed -From Egypt marching, equalled with one stroke -Both her first-born and all her bleating gods. -Belial came last; than whom a Spirit more lewd -Fell not from Heaven, or more gross to love -Vice for itself. To him no temple stood -Or altar smoked; yet who more oft than he -In temples and at altars, when the priest -Turns atheist, as did Eli's sons, who filled -With lust and violence the house of God? -In courts and palaces he also reigns, -And in luxurious cities, where the noise -Of riot ascends above their loftiest towers, -And injury and outrage; and, when night -Darkens the streets, then wander forth the sons -Of Belial, flown with insolence and wine. -Witness the streets of Sodom, and that night -In Gibeah, when the hospitable door -Exposed a matron, to avoid worse rape. - These were the prime in order and in might: -The rest were long to tell; though far renowned -Th' Ionian gods--of Javan's issue held -Gods, yet confessed later than Heaven and Earth, -Their boasted parents;--Titan, Heaven's first-born, -With his enormous brood, and birthright seized -By younger Saturn: he from mightier Jove, -His own and Rhea's son, like measure found; -So Jove usurping reigned. These, first in Crete -And Ida known, thence on the snowy top -Of cold Olympus ruled the middle air, -Their highest heaven; or on the Delphian cliff, -Or in Dodona, and through all the bounds -Of Doric land; or who with Saturn old -Fled over Adria to th' Hesperian fields, -And o'er the Celtic roamed the utmost Isles. - All these and more came flocking; but with looks -Downcast and damp; yet such wherein appeared -Obscure some glimpse of joy to have found their Chief -Not in despair, to have found themselves not lost -In loss itself; which on his countenance cast -Like doubtful hue. But he, his wonted pride -Soon recollecting, with high words, that bore -Semblance of worth, not substance, gently raised -Their fainting courage, and dispelled their fears. -Then straight commands that, at the warlike sound -Of trumpets loud and clarions, be upreared -His mighty standard. That proud honour claimed -Azazel as his right, a Cherub tall: -Who forthwith from the glittering staff unfurled -Th' imperial ensign; which, full high advanced, -Shone like a meteor streaming to the wind, -With gems and golden lustre rich emblazed, -Seraphic arms and trophies; all the while -Sonorous metal blowing martial sounds: -At which the universal host up-sent -A shout that tore Hell's concave, and beyond -Frighted the reign of Chaos and old Night. -All in a moment through the gloom were seen -Ten thousand banners rise into the air, -With orient colours waving: with them rose -A forest huge of spears; and thronging helms -Appeared, and serried shields in thick array -Of depth immeasurable. Anon they move -In perfect phalanx to the Dorian mood -Of flutes and soft recorders--such as raised -To height of noblest temper heroes old -Arming to battle, and instead of rage -Deliberate valour breathed, firm, and unmoved -With dread of death to flight or foul retreat; -Nor wanting power to mitigate and swage -With solemn touches troubled thoughts, and chase -Anguish and doubt and fear and sorrow and pain -From mortal or immortal minds. Thus they, -Breathing united force with fixed thought, -Moved on in silence to soft pipes that charmed -Their painful steps o'er the burnt soil. And now -Advanced in view they stand--a horrid front -Of dreadful length and dazzling arms, in guise -Of warriors old, with ordered spear and shield, -Awaiting what command their mighty Chief -Had to impose. He through the armed files -Darts his experienced eye, and soon traverse -The whole battalion views--their order due, -Their visages and stature as of gods; -Their number last he sums. And now his heart -Distends with pride, and, hardening in his strength, -Glories: for never, since created Man, -Met such embodied force as, named with these, -Could merit more than that small infantry -Warred on by cranes--though all the giant brood -Of Phlegra with th' heroic race were joined -That fought at Thebes and Ilium, on each side -Mixed with auxiliar gods; and what resounds -In fable or romance of Uther's son, -Begirt with British and Armoric knights; -And all who since, baptized or infidel, -Jousted in Aspramont, or Montalban, -Damasco, or Marocco, or Trebisond, -Or whom Biserta sent from Afric shore -When Charlemain with all his peerage fell -By Fontarabbia. Thus far these beyond -Compare of mortal prowess, yet observed -Their dread Commander. He, above the rest -In shape and gesture proudly eminent, -Stood like a tower. His form had yet not lost -All her original brightness, nor appeared -Less than Archangel ruined, and th' excess -Of glory obscured: as when the sun new-risen -Looks through the horizontal misty air -Shorn of his beams, or, from behind the moon, -In dim eclipse, disastrous twilight sheds -On half the nations, and with fear of change -Perplexes monarchs. Darkened so, yet shone -Above them all th' Archangel: but his face -Deep scars of thunder had intrenched, and care -Sat on his faded cheek, but under brows -Of dauntless courage, and considerate pride -Waiting revenge. Cruel his eye, but cast -Signs of remorse and passion, to behold -The fellows of his crime, the followers rather -(Far other once beheld in bliss), condemned -For ever now to have their lot in pain-- -Millions of Spirits for his fault amerced -Of Heaven, and from eteranl splendours flung -For his revolt--yet faithful how they stood, -Their glory withered; as, when heaven's fire -Hath scathed the forest oaks or mountain pines, -With singed top their stately growth, though bare, -Stands on the blasted heath. He now prepared -To speak; whereat their doubled ranks they bend -From wing to wing, and half enclose him round -With all his peers: attention held them mute. -Thrice he assayed, and thrice, in spite of scorn, -Tears, such as Angels weep, burst forth: at last -Words interwove with sighs found out their way:-- - "O myriads of immortal Spirits! O Powers -Matchless, but with th' Almighth!--and that strife -Was not inglorious, though th' event was dire, -As this place testifies, and this dire change, -Hateful to utter. But what power of mind, -Forseeing or presaging, from the depth -Of knowledge past or present, could have feared -How such united force of gods, how such -As stood like these, could ever know repulse? -For who can yet believe, though after loss, -That all these puissant legions, whose exile -Hath emptied Heaven, shall fail to re-ascend, -Self-raised, and repossess their native seat? -For me, be witness all the host of Heaven, -If counsels different, or danger shunned -By me, have lost our hopes. But he who reigns -Monarch in Heaven till then as one secure -Sat on his throne, upheld by old repute, -Consent or custom, and his regal state -Put forth at full, but still his strength concealed-- -Which tempted our attempt, and wrought our fall. -Henceforth his might we know, and know our own, -So as not either to provoke, or dread -New war provoked: our better part remains -To work in close design, by fraud or guile, -What force effected not; that he no less -At length from us may find, who overcomes -By force hath overcome but half his foe. -Space may produce new Worlds; whereof so rife -There went a fame in Heaven that he ere long -Intended to create, and therein plant -A generation whom his choice regard -Should favour equal to the Sons of Heaven. -Thither, if but to pry, shall be perhaps -Our first eruption--thither, or elsewhere; -For this infernal pit shall never hold -Celestial Spirits in bondage, nor th' Abyss -Long under darkness cover. But these thoughts -Full counsel must mature. Peace is despaired; -For who can think submission? War, then, war -Open or understood, must be resolved." - He spake; and, to confirm his words, outflew -Millions of flaming swords, drawn from the thighs -Of mighty Cherubim; the sudden blaze -Far round illumined Hell. Highly they raged -Against the Highest, and fierce with grasped arms -Clashed on their sounding shields the din of war, -Hurling defiance toward the vault of Heaven. - There stood a hill not far, whose grisly top -Belched fire and rolling smoke; the rest entire -Shone with a glossy scurf--undoubted sign -That in his womb was hid metallic ore, -The work of sulphur. Thither, winged with speed, -A numerous brigade hastened: as when bands -Of pioneers, with spade and pickaxe armed, -Forerun the royal camp, to trench a field, -Or cast a rampart. Mammon led them on-- -Mammon, the least erected Spirit that fell -From Heaven; for even in Heaven his looks and thoughts -Were always downward bent, admiring more -The riches of heaven's pavement, trodden gold, -Than aught divine or holy else enjoyed -In vision beatific. By him first -Men also, and by his suggestion taught, -Ransacked the centre, and with impious hands -Rifled the bowels of their mother Earth -For treasures better hid. Soon had his crew -Opened into the hill a spacious wound, -And digged out ribs of gold. Let none admire -That riches grow in Hell; that soil may best -Deserve the precious bane. And here let those -Who boast in mortal things, and wondering tell -Of Babel, and the works of Memphian kings, -Learn how their greatest monuments of fame -And strength, and art, are easily outdone -By Spirits reprobate, and in an hour -What in an age they, with incessant toil -And hands innumerable, scarce perform. -Nigh on the plain, in many cells prepared, -That underneath had veins of liquid fire -Sluiced from the lake, a second multitude -With wondrous art founded the massy ore, -Severing each kind, and scummed the bullion-dross. -A third as soon had formed within the ground -A various mould, and from the boiling cells -By strange conveyance filled each hollow nook; -As in an organ, from one blast of wind, -To many a row of pipes the sound-board breathes. -Anon out of the earth a fabric huge -Rose like an exhalation, with the sound -Of dulcet symphonies and voices sweet-- -Built like a temple, where pilasters round -Were set, and Doric pillars overlaid -With golden architrave; nor did there want -Cornice or frieze, with bossy sculptures graven; -The roof was fretted gold. Not Babylon -Nor great Alcairo such magnificence -Equalled in all their glories, to enshrine -Belus or Serapis their gods, or seat -Their kings, when Egypt with Assyria strove -In wealth and luxury. Th' ascending pile -Stood fixed her stately height, and straight the doors, -Opening their brazen folds, discover, wide -Within, her ample spaces o'er the smooth -And level pavement: from the arched roof, -Pendent by subtle magic, many a row -Of starry lamps and blazing cressets, fed -With naptha and asphaltus, yielded light -As from a sky. The hasty multitude -Admiring entered; and the work some praise, -And some the architect. His hand was known -In Heaven by many a towered structure high, -Where sceptred Angels held their residence, -And sat as Princes, whom the supreme King -Exalted to such power, and gave to rule, -Each in his Hierarchy, the Orders bright. -Nor was his name unheard or unadored -In ancient Greece; and in Ausonian land -Men called him Mulciber; and how he fell -From Heaven they fabled, thrown by angry Jove -Sheer o'er the crystal battlements: from morn -To noon he fell, from noon to dewy eve, -A summer's day, and with the setting sun -Dropt from the zenith, like a falling star, -On Lemnos, th' Aegaean isle. Thus they relate, -Erring; for he with this rebellious rout -Fell long before; nor aught aviled him now -To have built in Heaven high towers; nor did he scape -By all his engines, but was headlong sent, -With his industrious crew, to build in Hell. - Meanwhile the winged Heralds, by command -Of sovereign power, with awful ceremony -And trumpet's sound, throughout the host proclaim -A solemn council forthwith to be held -At Pandemonium, the high capital -Of Satan and his peers. Their summons called -From every band and squared regiment -By place or choice the worthiest: they anon -With hundreds and with thousands trooping came -Attended. All access was thronged; the gates -And porches wide, but chief the spacious hall -(Though like a covered field, where champions bold -Wont ride in armed, and at the Soldan's chair -Defied the best of Paynim chivalry -To mortal combat, or career with lance), -Thick swarmed, both on the ground and in the air, -Brushed with the hiss of rustling wings. As bees -In spring-time, when the Sun with Taurus rides. -Pour forth their populous youth about the hive -In clusters; they among fresh dews and flowers -Fly to and fro, or on the smoothed plank, -The suburb of their straw-built citadel, -New rubbed with balm, expatiate, and confer -Their state-affairs: so thick the airy crowd -Swarmed and were straitened; till, the signal given, -Behold a wonder! They but now who seemed -In bigness to surpass Earth's giant sons, -Now less than smallest dwarfs, in narrow room -Throng numberless--like that pygmean race -Beyond the Indian mount; or faery elves, -Whose midnight revels, by a forest-side -Or fountain, some belated peasant sees, -Or dreams he sees, while overhead the Moon -Sits arbitress, and nearer to the Earth -Wheels her pale course: they, on their mirth and dance -Intent, with jocund music charm his ear; -At once with joy and fear his heart rebounds. -Thus incorporeal Spirits to smallest forms -Reduced their shapes immense, and were at large, -Though without number still, amidst the hall -Of that infernal court. But far within, -And in their own dimensions like themselves, -The great Seraphic Lords and Cherubim -In close recess and secret conclave sat, -A thousand demi-gods on golden seats, -Frequent and full. After short silence then, -And summons read, the great consult began. - - - -Book II - - -High on a throne of royal state, which far -Outshone the wealth or Ormus and of Ind, -Or where the gorgeous East with richest hand -Showers on her kings barbaric pearl and gold, -Satan exalted sat, by merit raised -To that bad eminence; and, from despair -Thus high uplifted beyond hope, aspires -Beyond thus high, insatiate to pursue -Vain war with Heaven; and, by success untaught, -His proud imaginations thus displayed:-- - "Powers and Dominions, Deities of Heaven!-- -For, since no deep within her gulf can hold -Immortal vigour, though oppressed and fallen, -I give not Heaven for lost: from this descent -Celestial Virtues rising will appear -More glorious and more dread than from no fall, -And trust themselves to fear no second fate!-- -Me though just right, and the fixed laws of Heaven, -Did first create your leader--next, free choice -With what besides in council or in fight -Hath been achieved of merit--yet this loss, -Thus far at least recovered, hath much more -Established in a safe, unenvied throne, -Yielded with full consent. The happier state -In Heaven, which follows dignity, might draw -Envy from each inferior; but who here -Will envy whom the highest place exposes -Foremost to stand against the Thunderer's aim -Your bulwark, and condemns to greatest share -Of endless pain? Where there is, then, no good -For which to strive, no strife can grow up there -From faction: for none sure will claim in Hell -Precedence; none whose portion is so small -Of present pain that with ambitious mind -Will covet more! With this advantage, then, -To union, and firm faith, and firm accord, -More than can be in Heaven, we now return -To claim our just inheritance of old, -Surer to prosper than prosperity -Could have assured us; and by what best way, -Whether of open war or covert guile, -We now debate. Who can advise may speak." - He ceased; and next him Moloch, sceptred king, -Stood up--the strongest and the fiercest Spirit -That fought in Heaven, now fiercer by despair. -His trust was with th' Eternal to be deemed -Equal in strength, and rather than be less -Cared not to be at all; with that care lost -Went all his fear: of God, or Hell, or worse, -He recked not, and these words thereafter spake:-- - "My sentence is for open war. Of wiles, -More unexpert, I boast not: them let those -Contrive who need, or when they need; not now. -For, while they sit contriving, shall the rest-- -Millions that stand in arms, and longing wait -The signal to ascend--sit lingering here, -Heaven's fugitives, and for their dwelling-place -Accept this dark opprobrious den of shame, -The prison of his ryranny who reigns -By our delay? No! let us rather choose, -Armed with Hell-flames and fury, all at once -O'er Heaven's high towers to force resistless way, -Turning our tortures into horrid arms -Against the Torturer; when, to meet the noise -Of his almighty engine, he shall hear -Infernal thunder, and, for lightning, see -Black fire and horror shot with equal rage -Among his Angels, and his throne itself -Mixed with Tartarean sulphur and strange fire, -His own invented torments. But perhaps -The way seems difficult, and steep to scale -With upright wing against a higher foe! -Let such bethink them, if the sleepy drench -Of that forgetful lake benumb not still, -That in our porper motion we ascend -Up to our native seat; descent and fall -To us is adverse. Who but felt of late, -When the fierce foe hung on our broken rear -Insulting, and pursued us through the Deep, -With what compulsion and laborious flight -We sunk thus low? Th' ascent is easy, then; -Th' event is feared! Should we again provoke -Our stronger, some worse way his wrath may find -To our destruction, if there be in Hell -Fear to be worse destroyed! What can be worse -Than to dwell here, driven out from bliss, condemned -In this abhorred deep to utter woe! -Where pain of unextinguishable fire -Must exercise us without hope of end -The vassals of his anger, when the scourge -Inexorably, and the torturing hour, -Calls us to penance? More destroyed than thus, -We should be quite abolished, and expire. -What fear we then? what doubt we to incense -His utmost ire? which, to the height enraged, -Will either quite consume us, and reduce -To nothing this essential--happier far -Than miserable to have eternal being!-- -Or, if our substance be indeed divine, -And cannot cease to be, we are at worst -On this side nothing; and by proof we feel -Our power sufficient to disturb his Heaven, -And with perpetual inroads to alarm, -Though inaccessible, his fatal throne: -Which, if not victory, is yet revenge." - He ended frowning, and his look denounced -Desperate revenge, and battle dangerous -To less than gods. On th' other side up rose -Belial, in act more graceful and humane. -A fairer person lost not Heaven; he seemed -For dignity composed, and high exploit. -But all was false and hollow; though his tongue -Dropped manna, and could make the worse appear -The better reason, to perplex and dash -Maturest counsels: for his thoughts were low-- - To vice industrious, but to nobler deeds -Timorous and slothful. Yet he pleased the ear, -And with persuasive accent thus began:-- - "I should be much for open war, O Peers, -As not behind in hate, if what was urged -Main reason to persuade immediate war -Did not dissuade me most, and seem to cast -Ominous conjecture on the whole success; -When he who most excels in fact of arms, -In what he counsels and in what excels -Mistrustful, grounds his courage on despair -And utter dissolution, as the scope -Of all his aim, after some dire revenge. -First, what revenge? The towers of Heaven are filled -With armed watch, that render all access -Impregnable: oft on the bodering Deep -Encamp their legions, or with obscure wing -Scout far and wide into the realm of Night, -Scorning surprise. Or, could we break our way -By force, and at our heels all Hell should rise -With blackest insurrection to confound -Heaven's purest light, yet our great Enemy, -All incorruptible, would on his throne -Sit unpolluted, and th' ethereal mould, -Incapable of stain, would soon expel -Her mischief, and purge off the baser fire, -Victorious. Thus repulsed, our final hope -Is flat despair: we must exasperate -Th' Almighty Victor to spend all his rage; -And that must end us; that must be our cure-- -To be no more. Sad cure! for who would lose, -Though full of pain, this intellectual being, -Those thoughts that wander through eternity, -To perish rather, swallowed up and lost -In the wide womb of uncreated Night, -Devoid of sense and motion? And who knows, -Let this be good, whether our angry Foe -Can give it, or will ever? How he can -Is doubtful; that he never will is sure. -Will he, so wise, let loose at once his ire, -Belike through impotence or unaware, -To give his enemies their wish, and end -Them in his anger whom his anger saves -To punish endless? 'Wherefore cease we, then?' -Say they who counsel war; 'we are decreed, -Reserved, and destined to eternal woe; -Whatever doing, what can we suffer more, -What can we suffer worse?' Is this, then, worst-- -Thus sitting, thus consulting, thus in arms? -What when we fled amain, pursued and struck -With Heaven's afflicting thunder, and besought -The Deep to shelter us? This Hell then seemed -A refuge from those wounds. Or when we lay -Chained on the burning lake? That sure was worse. -What if the breath that kindled those grim fires, -Awaked, should blow them into sevenfold rage, -And plunge us in the flames; or from above -Should intermitted vengeance arm again -His red right hand to plague us? What if all -Her stores were opened, and this firmament -Of Hell should spout her cataracts of fire, -Impendent horrors, threatening hideous fall -One day upon our heads; while we perhaps, -Designing or exhorting glorious war, -Caught in a fiery tempest, shall be hurled, -Each on his rock transfixed, the sport and prey -Or racking whirlwinds, or for ever sunk -Under yon boiling ocean, wrapt in chains, -There to converse with everlasting groans, -Unrespited, unpitied, unreprieved, -Ages of hopeless end? This would be worse. -War, therefore, open or concealed, alike -My voice dissuades; for what can force or guile -With him, or who deceive his mind, whose eye -Views all things at one view? He from Heaven's height -All these our motions vain sees and derides, -Not more almighty to resist our might -Than wise to frustrate all our plots and wiles. -Shall we, then, live thus vile--the race of Heaven -Thus trampled, thus expelled, to suffer here -Chains and these torments? Better these than worse, -By my advice; since fate inevitable -Subdues us, and omnipotent decree, -The Victor's will. To suffer, as to do, -Our strength is equal; nor the law unjust -That so ordains. This was at first resolved, -If we were wise, against so great a foe -Contending, and so doubtful what might fall. -I laugh when those who at the spear are bold -And venturous, if that fail them, shrink, and fear -What yet they know must follow--to endure -Exile, or igominy, or bonds, or pain, -The sentence of their Conqueror. This is now -Our doom; which if we can sustain and bear, -Our Supreme Foe in time may much remit -His anger, and perhaps, thus far removed, -Not mind us not offending, satisfied -With what is punished; whence these raging fires -Will slacken, if his breath stir not their flames. -Our purer essence then will overcome -Their noxious vapour; or, inured, not feel; -Or, changed at length, and to the place conformed -In temper and in nature, will receive -Familiar the fierce heat; and, void of pain, -This horror will grow mild, this darkness light; -Besides what hope the never-ending flight -Of future days may bring, what chance, what change -Worth waiting--since our present lot appears -For happy though but ill, for ill not worst, -If we procure not to ourselves more woe." - Thus Belial, with words clothed in reason's garb, -Counselled ignoble ease and peaceful sloth, -Not peace; and after him thus Mammon spake:-- - "Either to disenthrone the King of Heaven -We war, if war be best, or to regain -Our own right lost. Him to unthrone we then -May hope, when everlasting Fate shall yield -To fickle Chance, and Chaos judge the strife. -The former, vain to hope, argues as vain -The latter; for what place can be for us -Within Heaven's bound, unless Heaven's Lord supreme -We overpower? Suppose he should relent -And publish grace to all, on promise made -Of new subjection; with what eyes could we -Stand in his presence humble, and receive -Strict laws imposed, to celebrate his throne -With warbled hyms, and to his Godhead sing -Forced hallelujahs, while he lordly sits -Our envied sovereign, and his altar breathes -Ambrosial odours and ambrosial flowers, -Our servile offerings? This must be our task -In Heaven, this our delight. How wearisome -Eternity so spent in worship paid -To whom we hate! Let us not then pursue, -By force impossible, by leave obtained -Unacceptable, though in Heaven, our state -Of splendid vassalage; but rather seek -Our own good from ourselves, and from our own -Live to ourselves, though in this vast recess, -Free and to none accountable, preferring -Hard liberty before the easy yoke -Of servile pomp. Our greatness will appear -Then most conspicuous when great things of small, -Useful of hurtful, prosperous of adverse, -We can create, and in what place soe'er -Thrive under evil, and work ease out of pain -Through labour and endurance. This deep world -Of darkness do we dread? How oft amidst -Thick clouds and dark doth Heaven's all-ruling Sire -Choose to reside, his glory unobscured, -And with the majesty of darkness round -Covers his throne, from whence deep thunders roar. -Mustering their rage, and Heaven resembles Hell! -As he our darkness, cannot we his light -Imitate when we please? This desert soil -Wants not her hidden lustre, gems and gold; -Nor want we skill or art from whence to raise -Magnificence; and what can Heaven show more? -Our torments also may, in length of time, -Become our elements, these piercing fires -As soft as now severe, our temper changed -Into their temper; which must needs remove -The sensible of pain. All things invite -To peaceful counsels, and the settled state -Of order, how in safety best we may -Compose our present evils, with regard -Of what we are and where, dismissing quite -All thoughts of war. Ye have what I advise." - He scarce had finished, when such murmur filled -Th' assembly as when hollow rocks retain -The sound of blustering winds, which all night long -Had roused the sea, now with hoarse cadence lull -Seafaring men o'erwatched, whose bark by chance -Or pinnace, anchors in a craggy bay -After the tempest. Such applause was heard -As Mammon ended, and his sentence pleased, -Advising peace: for such another field -They dreaded worse than Hell; so much the fear -Of thunder and the sword of Michael -Wrought still within them; and no less desire -To found this nether empire, which might rise, -By policy and long process of time, -In emulation opposite to Heaven. -Which when Beelzebub perceived--than whom, -Satan except, none higher sat--with grave -Aspect he rose, and in his rising seemed -A pillar of state. Deep on his front engraven -Deliberation sat, and public care; -And princely counsel in his face yet shone, -Majestic, though in ruin. Sage he stood -With Atlantean shoulders, fit to bear -The weight of mightiest monarchies; his look -Drew audience and attention still as night -Or summer's noontide air, while thus he spake:-- - "Thrones and Imperial Powers, Offspring of Heaven, -Ethereal Virtues! or these titles now -Must we renounce, and, changing style, be called -Princes of Hell? for so the popular vote -Inclines--here to continue, and build up here -A growing empire; doubtless! while we dream, -And know not that the King of Heaven hath doomed -This place our dungeon, not our safe retreat -Beyond his potent arm, to live exempt -From Heaven's high jurisdiction, in new league -Banded against his throne, but to remain -In strictest bondage, though thus far removed, -Under th' inevitable curb, reserved -His captive multitude. For he, to be sure, -In height or depth, still first and last will reign -Sole king, and of his kingdom lose no part -By our revolt, but over Hell extend -His empire, and with iron sceptre rule -Us here, as with his golden those in Heaven. -What sit we then projecting peace and war? -War hath determined us and foiled with loss -Irreparable; terms of peace yet none -Vouchsafed or sought; for what peace will be given -To us enslaved, but custody severe, -And stripes and arbitrary punishment -Inflicted? and what peace can we return, -But, to our power, hostility and hate, -Untamed reluctance, and revenge, though slow, -Yet ever plotting how the Conqueror least -May reap his conquest, and may least rejoice -In doing what we most in suffering feel? -Nor will occasion want, nor shall we need -With dangerous expedition to invade -Heaven, whose high walls fear no assault or siege, -Or ambush from the Deep. What if we find -Some easier enterprise? There is a place -(If ancient and prophetic fame in Heaven -Err not)--another World, the happy seat -Of some new race, called Man, about this time -To be created like to us, though less -In power and excellence, but favoured more -Of him who rules above; so was his will -Pronounced among the Gods, and by an oath -That shook Heaven's whole circumference confirmed. -Thither let us bend all our thoughts, to learn -What creatures there inhabit, of what mould -Or substance, how endued, and what their power -And where their weakness: how attempted best, -By force of subtlety. Though Heaven be shut, -And Heaven's high Arbitrator sit secure -In his own strength, this place may lie exposed, -The utmost border of his kingdom, left -To their defence who hold it: here, perhaps, -Some advantageous act may be achieved -By sudden onset--either with Hell-fire -To waste his whole creation, or possess -All as our own, and drive, as we were driven, -The puny habitants; or, if not drive, -Seduce them to our party, that their God -May prove their foe, and with repenting hand -Abolish his own works. This would surpass -Common revenge, and interrupt his joy -In our confusion, and our joy upraise -In his disturbance; when his darling sons, -Hurled headlong to partake with us, shall curse -Their frail original, and faded bliss-- -Faded so soon! Advise if this be worth -Attempting, or to sit in darkness here -Hatching vain empires." Thus beelzebub -Pleaded his devilish counsel--first devised -By Satan, and in part proposed: for whence, -But from the author of all ill, could spring -So deep a malice, to confound the race -Of mankind in one root, and Earth with Hell -To mingle and involve, done all to spite -The great Creator? But their spite still serves -His glory to augment. The bold design -Pleased highly those infernal States, and joy -Sparkled in all their eyes: with full assent -They vote: whereat his speech he thus renews:-- -"Well have ye judged, well ended long debate, -Synod of Gods, and, like to what ye are, -Great things resolved, which from the lowest deep -Will once more lift us up, in spite of fate, -Nearer our ancient seat--perhaps in view -Of those bright confines, whence, with neighbouring arms, -And opportune excursion, we may chance -Re-enter Heaven; or else in some mild zone -Dwell, not unvisited of Heaven's fair light, -Secure, and at the brightening orient beam -Purge off this gloom: the soft delicious air, -To heal the scar of these corrosive fires, -Shall breathe her balm. But, first, whom shall we send -In search of this new World? whom shall we find -Sufficient? who shall tempt with wandering feet -The dark, unbottomed, infinite Abyss, -And through the palpable obscure find out -His uncouth way, or spread his airy flight, -Upborne with indefatigable wings -Over the vast abrupt, ere he arrive -The happy Isle? What strength, what art, can then -Suffice, or what evasion bear him safe, -Through the strict senteries and stations thick -Of Angels watching round? Here he had need -All circumspection: and we now no less -Choice in our suffrage; for on whom we send -The weight of all, and our last hope, relies." - This said, he sat; and expectation held -His look suspense, awaiting who appeared -To second, or oppose, or undertake -The perilous attempt. But all sat mute, -Pondering the danger with deep thoughts; and each -In other's countenance read his own dismay, -Astonished. None among the choice and prime -Of those Heaven-warring champions could be found -So hardy as to proffer or accept, -Alone, the dreadful voyage; till, at last, -Satan, whom now transcendent glory raised -Above his fellows, with monarchal pride -Conscious of highest worth, unmoved thus spake:-- - "O Progeny of Heaven! Empyreal Thrones! -With reason hath deep silence and demur -Seized us, though undismayed. Long is the way -And hard, that out of Hell leads up to light. -Our prison strong, this huge convex of fire, -Outrageous to devour, immures us round -Ninefold; and gates of burning adamant, -Barred over us, prohibit all egress. -These passed, if any pass, the void profound -Of unessential Night receives him next, -Wide-gaping, and with utter loss of being -Threatens him, plunged in that abortive gulf. -If thence he scape, into whatever world, -Or unknown region, what remains him less -Than unknown dangers, and as hard escape? -But I should ill become this throne, O Peers, -And this imperial sovereignty, adorned -With splendour, armed with power, if aught proposed -And judged of public moment in the shape -Of difficulty or danger, could deter -Me from attempting. Wherefore do I assume -These royalties, and not refuse to reign, -Refusing to accept as great a share -Of hazard as of honour, due alike -To him who reigns, and so much to him due -Of hazard more as he above the rest -High honoured sits? Go, therefore, mighty Powers, -Terror of Heaven, though fallen; intend at home, -While here shall be our home, what best may ease -The present misery, and render Hell -More tolerable; if there be cure or charm -To respite, or deceive, or slack the pain -Of this ill mansion: intermit no watch -Against a wakeful foe, while I abroad -Through all the coasts of dark destruction seek -Deliverance for us all. This enterprise -None shall partake with me." Thus saying, rose -The Monarch, and prevented all reply; -Prudent lest, from his resolution raised, -Others among the chief might offer now, -Certain to be refused, what erst they feared, -And, so refused, might in opinion stand -His rivals, winning cheap the high repute -Which he through hazard huge must earn. But they -Dreaded not more th' adventure than his voice -Forbidding; and at once with him they rose. -Their rising all at once was as the sound -Of thunder heard remote. Towards him they bend -With awful reverence prone, and as a God -Extol him equal to the Highest in Heaven. -Nor failed they to express how much they praised -That for the general safety he despised -His own: for neither do the Spirits damned -Lose all their virtue; lest bad men should boast -Their specious deeds on earth, which glory excites, -Or close ambition varnished o'er with zeal. - Thus they their doubtful consultations dark -Ended, rejoicing in their matchless Chief: -As, when from mountain-tops the dusky clouds -Ascending, while the north wind sleeps, o'erspread -Heaven's cheerful face, the louring element -Scowls o'er the darkened landscape snow or shower, -If chance the radiant sun, with farewell sweet, -Extend his evening beam, the fields revive, -The birds their notes renew, and bleating herds -Attest their joy, that hill and valley rings. -O shame to men! Devil with devil damned -Firm concord holds; men only disagree -Of creatures rational, though under hope -Of heavenly grace, and, God proclaiming peace, -Yet live in hatred, enmity, and strife -Among themselves, and levy cruel wars -Wasting the earth, each other to destroy: -As if (which might induce us to accord) -Man had not hellish foes enow besides, -That day and night for his destruction wait! - The Stygian council thus dissolved; and forth -In order came the grand infernal Peers: -Midst came their mighty Paramount, and seemed -Alone th' antagonist of Heaven, nor less -Than Hell's dread Emperor, with pomp supreme, -And god-like imitated state: him round -A globe of fiery Seraphim enclosed -With bright emblazonry, and horrent arms. -Then of their session ended they bid cry -With trumpet's regal sound the great result: -Toward the four winds four speedy Cherubim -Put to their mouths the sounding alchemy, -By herald's voice explained; the hollow Abyss -Heard far adn wide, and all the host of Hell -With deafening shout returned them loud acclaim. -Thence more at ease their minds, and somewhat raised -By false presumptuous hope, the ranged Powers -Disband; and, wandering, each his several way -Pursues, as inclination or sad choice -Leads him perplexed, where he may likeliest find -Truce to his restless thoughts, and entertain -The irksome hours, till his great Chief return. -Part on the plain, or in the air sublime, -Upon the wing or in swift race contend, -As at th' Olympian games or Pythian fields; -Part curb their fiery steeds, or shun the goal -With rapid wheels, or fronted brigades form: -As when, to warn proud cities, war appears -Waged in the troubled sky, and armies rush -To battle in the clouds; before each van -Prick forth the airy knights, and couch their spears, -Till thickest legions close; with feats of arms -From either end of heaven the welkin burns. -Others, with vast Typhoean rage, more fell, -Rend up both rocks and hills, and ride the air -In whirlwind; Hell scarce holds the wild uproar:-- -As when Alcides, from Oechalia crowned -With conquest, felt th' envenomed robe, and tore -Through pain up by the roots Thessalian pines, -And Lichas from the top of Oeta threw -Into th' Euboic sea. Others, more mild, -Retreated in a silent valley, sing -With notes angelical to many a harp -Their own heroic deeds, and hapless fall -By doom of battle, and complain that Fate -Free Virtue should enthrall to Force or Chance. -Their song was partial; but the harmony -(What could it less when Spirits immortal sing?) -Suspended Hell, and took with ravishment -The thronging audience. In discourse more sweet -(For Eloquence the Soul, Song charms the Sense) -Others apart sat on a hill retired, -In thoughts more elevate, and reasoned high -Of Providence, Foreknowledge, Will, and Fate-- -Fixed fate, free will, foreknowledge absolute, -And found no end, in wandering mazes lost. -Of good and evil much they argued then, -Of happiness and final misery, -Passion and apathy, and glory and shame: -Vain wisdom all, and false philosophy!-- -Yet, with a pleasing sorcery, could charm -Pain for a while or anguish, and excite -Fallacious hope, or arm th' obdured breast -With stubborn patience as with triple steel. -Another part, in squadrons and gross bands, -On bold adventure to discover wide -That dismal world, if any clime perhaps -Might yield them easier habitation, bend -Four ways their flying march, along the banks -Of four infernal rivers, that disgorge -Into the burning lake their baleful streams-- -Abhorred Styx, the flood of deadly hate; -Sad Acheron of sorrow, black and deep; -Cocytus, named of lamentation loud -Heard on the rueful stream; fierce Phlegeton, -Whose waves of torrent fire inflame with rage. -Far off from these, a slow and silent stream, -Lethe, the river of oblivion, rolls -Her watery labyrinth, whereof who drinks -Forthwith his former state and being forgets-- -Forgets both joy and grief, pleasure and pain. -Beyond this flood a frozen continent -Lies dark and wild, beat with perpetual storms -Of whirlwind and dire hail, which on firm land -Thaws not, but gathers heap, and ruin seems -Of ancient pile; all else deep snow and ice, -A gulf profound as that Serbonian bog -Betwixt Damiata and Mount Casius old, -Where armies whole have sunk: the parching air -Burns frore, and cold performs th' effect of fire. -Thither, by harpy-footed Furies haled, -At certain revolutions all the damned -Are brought; and feel by turns the bitter change -Of fierce extremes, extremes by change more fierce, -From beds of raging fire to starve in ice -Their soft ethereal warmth, and there to pine -Immovable, infixed, and frozen round -Periods of time,--thence hurried back to fire. -They ferry over this Lethean sound -Both to and fro, their sorrow to augment, -And wish and struggle, as they pass, to reach -The tempting stream, with one small drop to lose -In sweet forgetfulness all pain and woe, -All in one moment, and so near the brink; -But Fate withstands, and, to oppose th' attempt, -Medusa with Gorgonian terror guards -The ford, and of itself the water flies -All taste of living wight, as once it fled -The lip of Tantalus. Thus roving on -In confused march forlorn, th' adventurous bands, -With shuddering horror pale, and eyes aghast, -Viewed first their lamentable lot, and found -No rest. Through many a dark and dreary vale -They passed, and many a region dolorous, -O'er many a frozen, many a fiery alp, -Rocks, caves, lakes, fens, bogs, dens, and shades of death-- -A universe of death, which God by curse -Created evil, for evil only good; -Where all life dies, death lives, and Nature breeds, -Perverse, all monstrous, all prodigious things, -Obominable, inutterable, and worse -Than fables yet have feigned or fear conceived, -Gorgons, and Hydras, and Chimeras dire. - Meanwhile the Adversary of God and Man, -Satan, with thoughts inflamed of highest design, -Puts on swift wings, and toward the gates of Hell -Explores his solitary flight: sometimes -He scours the right hand coast, sometimes the left; -Now shaves with level wing the deep, then soars -Up to the fiery concave towering high. -As when far off at sea a fleet descried -Hangs in the clouds, by equinoctial winds -Close sailing from Bengala, or the isles -Of Ternate and Tidore, whence merchants bring -Their spicy drugs; they on the trading flood, -Through the wide Ethiopian to the Cape, -Ply stemming nightly toward the pole: so seemed -Far off the flying Fiend. At last appear -Hell-bounds, high reaching to the horrid roof, -And thrice threefold the gates; three folds were brass, -Three iron, three of adamantine rock, -Impenetrable, impaled with circling fire, -Yet unconsumed. Before the gates there sat -On either side a formidable Shape. -The one seemed woman to the waist, and fair, -But ended foul in many a scaly fold, -Voluminous and vast--a serpent armed -With mortal sting. About her middle round -A cry of Hell-hounds never-ceasing barked -With wide Cerberean mouths full loud, and rung -A hideous peal; yet, when they list, would creep, -If aught disturbed their noise, into her womb, -And kennel there; yet there still barked and howled -Within unseen. Far less abhorred than these -Vexed Scylla, bathing in the sea that parts -Calabria from the hoarse Trinacrian shore; -Nor uglier follow the night-hag, when, called -In secret, riding through the air she comes, -Lured with the smell of infant blood, to dance -With Lapland witches, while the labouring moon -Eclipses at their charms. The other Shape-- -If shape it might be called that shape had none -Distinguishable in member, joint, or limb; -Or substance might be called that shadow seemed, -For each seemed either--black it stood as Night, -Fierce as ten Furies, terrible as Hell, -And shook a dreadful dart: what seemed his head -The likeness of a kingly crown had on. -Satan was now at hand, and from his seat -The monster moving onward came as fast -With horrid strides; Hell trembled as he strode. -Th' undaunted Fiend what this might be admired-- -Admired, not feared (God and his Son except, -Created thing naught valued he nor shunned), -And with disdainful look thus first began:-- - "Whence and what art thou, execrable Shape, -That dar'st, though grim and terrible, advance -Thy miscreated front athwart my way -To yonder gates? Through them I mean to pass, -That be assured, without leave asked of thee. -Retire; or taste thy folly, and learn by proof, -Hell-born, not to contend with Spirits of Heaven." - To whom the Goblin, full of wrath, replied:-- -"Art thou that traitor Angel? art thou he, -Who first broke peace in Heaven and faith, till then -Unbroken, and in proud rebellious arms -Drew after him the third part of Heaven's sons, -Conjured against the Highest--for which both thou -And they, outcast from God, are here condemned -To waste eternal days in woe and pain? -And reckon'st thou thyself with Spirits of Heaven -Hell-doomed, and breath'st defiance here and scorn, -Where I reign king, and, to enrage thee more, -Thy king and lord? Back to thy punishment, -False fugitive; and to thy speed add wings, -Lest with a whip of scorpions I pursue -Thy lingering, or with one stroke of this dart -Strange horror seize thee, and pangs unfelt before." - So spake the grisly Terror, and in shape, -So speaking and so threatening, grew tenfold, -More dreadful and deform. On th' other side, -Incensed with indignation, Satan stood -Unterrified, and like a comet burned, -That fires the length of Ophiuchus huge -In th' arctic sky, and from his horrid hair -Shakes pestilence and war. Each at the head -Levelled his deadly aim; their fatal hands -No second stroke intend; and such a frown -Each cast at th' other as when two black clouds, -With heaven's artillery fraught, came rattling on -Over the Caspian,--then stand front to front -Hovering a space, till winds the signal blow -To join their dark encounter in mid-air. -So frowned the mighty combatants that Hell -Grew darker at their frown; so matched they stood; -For never but once more was wither like -To meet so great a foe. And now great deeds -Had been achieved, whereof all Hell had rung, -Had not the snaky Sorceress, that sat -Fast by Hell-gate and kept the fatal key, -Risen, and with hideous outcry rushed between. - "O father, what intends thy hand," she cried, -"Against thy only son? What fury, O son, -Possesses thee to bend that mortal dart -Against thy father's head? And know'st for whom? -For him who sits above, and laughs the while -At thee, ordained his drudge to execute -Whate'er his wrath, which he calls justice, bids-- -His wrath, which one day will destroy ye both!" - She spake, and at her words the hellish Pest -Forbore: then these to her Satan returned:-- - "So strange thy outcry, and thy words so strange -Thou interposest, that my sudden hand, -Prevented, spares to tell thee yet by deeds -What it intends, till first I know of thee -What thing thou art, thus double-formed, and why, -In this infernal vale first met, thou call'st -Me father, and that phantasm call'st my son. -I know thee not, nor ever saw till now -Sight more detestable than him and thee." - T' whom thus the Portress of Hell-gate replied:-- -"Hast thou forgot me, then; and do I seem -Now in thine eye so foul?--once deemed so fair -In Heaven, when at th' assembly, and in sight -Of all the Seraphim with thee combined -In bold conspiracy against Heaven's King, -All on a sudden miserable pain -Surprised thee, dim thine eyes and dizzy swum -In darkness, while thy head flames thick and fast -Threw forth, till on the left side opening wide, -Likest to thee in shape and countenance bright, -Then shining heavenly fair, a goddess armed, -Out of thy head I sprung. Amazement seized -All th' host of Heaven; back they recoiled afraid -At first, and called me Sin, and for a sign -Portentous held me; but, familiar grown, -I pleased, and with attractive graces won -The most averse--thee chiefly, who, full oft -Thyself in me thy perfect image viewing, -Becam'st enamoured; and such joy thou took'st -With me in secret that my womb conceived -A growing burden. Meanwhile war arose, -And fields were fought in Heaven: wherein remained -(For what could else?) to our Almighty Foe -Clear victory; to our part loss and rout -Through all the Empyrean. Down they fell, -Driven headlong from the pitch of Heaven, down -Into this Deep; and in the general fall -I also: at which time this powerful key -Into my hands was given, with charge to keep -These gates for ever shut, which none can pass -Without my opening. Pensive here I sat -Alone; but long I sat not, till my womb, -Pregnant by thee, and now excessive grown, -Prodigious motion felt and rueful throes. -At last this odious offspring whom thou seest, -Thine own begotten, breaking violent way, -Tore through my entrails, that, with fear and pain -Distorted, all my nether shape thus grew -Transformed: but he my inbred enemy -Forth issued, brandishing his fatal dart, -Made to destroy. I fled, and cried out Death! -Hell trembled at the hideous name, and sighed -From all her caves, and back resounded Death! -I fled; but he pursued (though more, it seems, -Inflamed with lust than rage), and, swifter far, -Me overtook, his mother, all dismayed, -And, in embraces forcible and foul -Engendering with me, of that rape begot -These yelling monsters, that with ceaseless cry -Surround me, as thou saw'st--hourly conceived -And hourly born, with sorrow infinite -To me; for, when they list, into the womb -That bred them they return, and howl, and gnaw -My bowels, their repast; then, bursting forth -Afresh, with conscious terrors vex me round, -That rest or intermission none I find. -Before mine eyes in opposition sits -Grim Death, my son and foe, who set them on, -And me, his parent, would full soon devour -For want of other prey, but that he knows -His end with mine involved, and knows that I -Should prove a bitter morsel, and his bane, -Whenever that shall be: so Fate pronounced. -But thou, O father, I forewarn thee, shun -His deadly arrow; neither vainly hope -To be invulnerable in those bright arms, -Through tempered heavenly; for that mortal dint, -Save he who reigns above, none can resist." - She finished; and the subtle Fiend his lore -Soon learned, now milder, and thus answered smooth:-- - "Dear daughter--since thou claim'st me for thy sire, -And my fair son here show'st me, the dear pledge -Of dalliance had with thee in Heaven, and joys -Then sweet, now sad to mention, through dire change -Befallen us unforeseen, unthought-of--know, -I come no enemy, but to set free -From out this dark and dismal house of pain -Both him and thee, and all the heavenly host -Of Spirits that, in our just pretences armed, -Fell with us from on high. From them I go -This uncouth errand sole, and one for all -Myself expose, with lonely steps to tread -Th' unfounded Deep, and through the void immense -To search, with wandering quest, a place foretold -Should be--and, by concurring signs, ere now -Created vast and round--a place of bliss -In the purlieus of Heaven; and therein placed -A race of upstart creatures, to supply -Perhaps our vacant room, though more removed, -Lest Heaven, surcharged with potent multitude, -Might hap to move new broils. Be this, or aught -Than this more secret, now designed, I haste -To know; and, this once known, shall soon return, -And bring ye to the place where thou and Death -Shall dwell at ease, and up and down unseen -Wing silently the buxom air, embalmed -With odours. There ye shall be fed and filled -Immeasurably; all things shall be your prey." - He ceased; for both seemed highly pleased, and Death -Grinned horrible a ghastly smile, to hear -His famine should be filled, and blessed his maw -Destined to that good hour. No less rejoiced -His mother bad, and thus bespake her sire:-- - "The key of this infernal Pit, by due -And by command of Heaven's all-powerful King, -I keep, by him forbidden to unlock -These adamantine gates; against all force -Death ready stands to interpose his dart, -Fearless to be o'ermatched by living might. -But what owe I to his commands above, -Who hates me, and hath hither thrust me down -Into this gloom of Tartarus profound, -To sit in hateful office here confined, -Inhabitant of Heaven and heavenly born-- -Here in perpetual agony and pain, -With terrors and with clamours compassed round -Of mine own brood, that on my bowels feed? -Thou art my father, thou my author, thou -My being gav'st me; whom should I obey -But thee? whom follow? Thou wilt bring me soon -To that new world of light and bliss, among -The gods who live at ease, where I shall reign -At thy right hand voluptuous, as beseems -Thy daughter and thy darling, without end." - Thus saying, from her side the fatal key, -Sad instrument of all our woe, she took; -And, towards the gate rolling her bestial train, -Forthwith the huge portcullis high up-drew, -Which, but herself, not all the Stygian Powers -Could once have moved; then in the key-hole turns -Th' intricate wards, and every bolt and bar -Of massy iron or solid rock with ease -Unfastens. On a sudden open fly, -With impetuous recoil and jarring sound, -Th' infernal doors, and on their hinges grate -Harsh thunder, that the lowest bottom shook -Of Erebus. She opened; but to shut -Excelled her power: the gates wide open stood, -That with extended wings a bannered host, -Under spread ensigns marching, mibht pass through -With horse and chariots ranked in loose array; -So wide they stood, and like a furnace-mouth -Cast forth redounding smoke and ruddy flame. -Before their eyes in sudden view appear -The secrets of the hoary Deep--a dark -Illimitable ocean, without bound, -Without dimension; where length, breadth, and height, -And time, and place, are lost; where eldest Night -And Chaos, ancestors of Nature, hold -Eternal anarchy, amidst the noise -Of endless wars, and by confusion stand. -For Hot, Cold, Moist, and Dry, four champions fierce, -Strive here for mastery, and to battle bring -Their embryon atoms: they around the flag -Of each his faction, in their several clans, -Light-armed or heavy, sharp, smooth, swift, or slow, -Swarm populous, unnumbered as the sands -Of Barca or Cyrene's torrid soil, -Levied to side with warring winds, and poise -Their lighter wings. To whom these most adhere -He rules a moment: Chaos umpire sits, -And by decision more embroils the fray -By which he reigns: next him, high arbiter, -Chance governs all. Into this wild Abyss, -The womb of Nature, and perhaps her grave, -Of neither sea, nor shore, nor air, nor fire, -But all these in their pregnant causes mixed -Confusedly, and which thus must ever fight, -Unless th' Almighty Maker them ordain -His dark materials to create more worlds-- -Into this wild Abyss the wary Fiend -Stood on the brink of Hell and looked a while, -Pondering his voyage; for no narrow frith -He had to cross. Nor was his ear less pealed -With noises loud and ruinous (to compare -Great things with small) than when Bellona storms -With all her battering engines, bent to rase -Some capital city; or less than if this frame -Of Heaven were falling, and these elements -In mutiny had from her axle torn -The steadfast Earth. At last his sail-broad vans -He spread for flight, and, in the surging smoke -Uplifted, spurns the ground; thence many a league, -As in a cloudy chair, ascending rides -Audacious; but, that seat soon failing, meets -A vast vacuity. All unawares, -Fluttering his pennons vain, plumb-down he drops -Ten thousand fathom deep, and to this hour -Down had been falling, had not, by ill chance, -The strong rebuff of some tumultuous cloud, -Instinct with fire and nitre, hurried him -As many miles aloft. That fury stayed-- -Quenched in a boggy Syrtis, neither sea, -Nor good dry land--nigh foundered, on he fares, -Treading the crude consistence, half on foot, -Half flying; behoves him now both oar and sail. -As when a gryphon through the wilderness -With winged course, o'er hill or moory dale, -Pursues the Arimaspian, who by stealth -Had from his wakeful custody purloined -The guarded gold; so eagerly the Fiend -O'er bog or steep, through strait, rough, dense, or rare, -With head, hands, wings, or feet, pursues his way, -And swims, or sinks, or wades, or creeps, or flies. -At length a universal hubbub wild -Of stunning sounds, and voices all confused, -Borne through the hollow dark, assaults his ear -With loudest vehemence. Thither he plies -Undaunted, to meet there whatever Power -Or Spirit of the nethermost Abyss -Might in that noise reside, of whom to ask -Which way the nearest coast of darkness lies -Bordering on light; when straight behold the throne -Of Chaos, and his dark pavilion spread -Wide on the wasteful Deep! With him enthroned -Sat sable-vested Night, eldest of things, -The consort of his reign; and by them stood -Orcus and Ades, and the dreaded name -Of Demogorgon; Rumour next, and Chance, -And Tumult, and Confusion, all embroiled, -And Discord with a thousand various mouths. - T' whom Satan, turning boldly, thus:--"Ye Powers -And Spirtis of this nethermost Abyss, -Chaos and ancient Night, I come no spy -With purpose to explore or to disturb -The secrets of your realm; but, by constraint -Wandering this darksome desert, as my way -Lies through your spacious empire up to light, -Alone and without guide, half lost, I seek, -What readiest path leads where your gloomy bounds -Confine with Heaven; or, if some other place, -From your dominion won, th' Ethereal King -Possesses lately, thither to arrive -I travel this profound. Direct my course: -Directed, no mean recompense it brings -To your behoof, if I that region lost, -All usurpation thence expelled, reduce -To her original darkness and your sway -(Which is my present journey), and once more -Erect the standard there of ancient Night. -Yours be th' advantage all, mine the revenge!" - Thus Satan; and him thus the Anarch old, -With faltering speech and visage incomposed, -Answered: "I know thee, stranger, who thou art-- *** -That mighty leading Angel, who of late -Made head against Heaven's King, though overthrown. -I saw and heard; for such a numerous host -Fled not in silence through the frighted Deep, -With ruin upon ruin, rout on rout, -Confusion worse confounded; and Heaven-gates -Poured out by millions her victorious bands, -Pursuing. I upon my frontiers here -Keep residence; if all I can will serve -That little which is left so to defend, -Encroached on still through our intestine broils -Weakening the sceptre of old Night: first, Hell, -Your dungeon, stretching far and wide beneath; -Now lately Heaven and Earth, another world -Hung o'er my realm, linked in a golden chain -To that side Heaven from whence your legions fell! -If that way be your walk, you have not far; -So much the nearer danger. Go, and speed; -Havoc, and spoil, and ruin, are my gain." - He ceased; and Satan stayed not to reply, -But, glad that now his sea should find a shore, -With fresh alacrity and force renewed -Springs upward, like a pyramid of fire, -Into the wild expanse, and through the shock -Of fighting elements, on all sides round -Environed, wins his way; harder beset -And more endangered than when Argo passed -Through Bosporus betwixt the justling rocks, -Or when Ulysses on the larboard shunned -Charybdis, and by th' other whirlpool steered. -So he with difficulty and labour hard -Moved on, with difficulty and labour he; -But, he once passed, soon after, when Man fell, -Strange alteration! Sin and Death amain, -Following his track (such was the will of Heaven) -Paved after him a broad and beaten way -Over the dark Abyss, whose boiling gulf -Tamely endured a bridge of wondrous length, -From Hell continued, reaching th' utmost orb -Of this frail World; by which the Spirits perverse -With easy intercourse pass to and fro -To tempt or punish mortals, except whom -God and good Angels guard by special grace. - But now at last the sacred influence -Of light appears, and from the walls of Heaven -Shoots far into the bosom of dim Night -A glimmering dawn. Here Nature first begins -Her farthest verge, and Chaos to retire, -As from her outmost works, a broken foe, -With tumult less and with less hostile din; -That Satan with less toil, and now with ease, -Wafts on the calmer wave by dubious light, -And, like a weather-beaten vessel, holds -Gladly the port, though shrouds and tackle torn; -Or in the emptier waste, resembling air, -Weighs his spread wings, at leisure to behold -Far off th' empyreal Heaven, extended wide -In circuit, undetermined square or round, -With opal towers and battlements adorned -Of living sapphire, once his native seat; -And, fast by, hanging in a golden chain, -This pendent World, in bigness as a star -Of smallest magnitude close by the moon. -Thither, full fraught with mischievous revenge, -Accursed, and in a cursed hour, he hies. - - - -Book III - - -Hail, holy Light, offspring of Heaven firstborn, -Or of the Eternal coeternal beam -May I express thee unblam'd? since God is light, -And never but in unapproached light -Dwelt from eternity, dwelt then in thee -Bright effluence of bright essence increate. -Or hear"st thou rather pure ethereal stream, -Whose fountain who shall tell? before the sun, -Before the Heavens thou wert, and at the voice -Of God, as with a mantle, didst invest *** -The rising world of waters dark and deep, -Won from the void and formless infinite. -Thee I re-visit now with bolder wing, -Escap'd the Stygian pool, though long detain'd -In that obscure sojourn, while in my flight -Through utter and through middle darkness borne, -With other notes than to the Orphean lyre -I sung of Chaos and eternal Night; -Taught by the heavenly Muse to venture down -The dark descent, and up to re-ascend, -Though hard and rare: Thee I revisit safe, -And feel thy sovran vital lamp; but thou -Revisit'st not these eyes, that roll in vain -To find thy piercing ray, and find no dawn; -So thick a drop serene hath quench'd their orbs, -Or dim suffusion veil'd. Yet not the more -Cease I to wander, where the Muses haunt, -Clear spring, or shady grove, or sunny hill, -Smit with the love of sacred song; but chief -Thee, Sion, and the flowery brooks beneath, -That wash thy hallow'd feet, and warbling flow, -Nightly I visit: nor sometimes forget -So were I equall'd with them in renown, -Thy sovran command, that Man should find grace; -Blind Thamyris, and blind Maeonides, -And Tiresias, and Phineus, prophets old: -Then feed on thoughts, that voluntary move -Harmonious numbers; as the wakeful bird -Sings darkling, and in shadiest covert hid -Tunes her nocturnal note. Thus with the year -Seasons return; but not to me returns -Day, or the sweet approach of even or morn, -Or sight of vernal bloom, or summer's rose, -Or flocks, or herds, or human face divine; -But cloud instead, and ever-during dark -Surrounds me, from the cheerful ways of men -Cut off, and for the book of knowledge fair -Presented with a universal blank -Of nature's works to me expung'd and ras'd, -And wisdom at one entrance quite shut out. -So much the rather thou, celestial Light, -Shine inward, and the mind through all her powers -Irradiate; there plant eyes, all mist from thence -Purge and disperse, that I may see and tell -Of things invisible to mortal sight. -Now had the Almighty Father from above, -From the pure empyrean where he sits -High thron'd above all highth, bent down his eye -His own works and their works at once to view: -About him all the Sanctities of Heaven -Stood thick as stars, and from his sight receiv'd -Beatitude past utterance; on his right -The radiant image of his glory sat, -His only son; on earth he first beheld -Our two first parents, yet the only two -Of mankind in the happy garden plac'd -Reaping immortal fruits of joy and love, -Uninterrupted joy, unrivall'd love, -In blissful solitude; he then survey'd -Hell and the gulf between, and Satan there -Coasting the wall of Heaven on this side Night -In the dun air sublime, and ready now -To stoop with wearied wings, and willing feet, -On the bare outside of this world, that seem'd -Firm land imbosom'd, without firmament, -Uncertain which, in ocean or in air. -Him God beholding from his prospect high, -Wherein past, present, future, he beholds, -Thus to his only Son foreseeing spake. -Only begotten Son, seest thou what rage -Transports our Adversary? whom no bounds -Prescrib'd no bars of Hell, nor all the chains -Heap'd on him there, nor yet the main abyss -Wide interrupt, can hold; so bent he seems -On desperate revenge, that shall redound -Upon his own rebellious head. And now, -Through all restraint broke loose, he wings his way -Not far off Heaven, in the precincts of light, -Directly towards the new created world, -And man there plac'd, with purpose to assay -If him by force he can destroy, or, worse, -By some false guile pervert; and shall pervert; -For man will hearken to his glozing lies, -And easily transgress the sole command, -Sole pledge of his obedience: So will fall -He and his faithless progeny: Whose fault? -Whose but his own? ingrate, he had of me -All he could have; I made him just and right, -Sufficient to have stood, though free to fall. -Such I created all the ethereal Powers -And Spirits, both them who stood, and them who fail'd; -Freely they stood who stood, and fell who fell. -Not free, what proof could they have given sincere -Of true allegiance, constant faith or love, -Where only what they needs must do appear'd, -Not what they would? what praise could they receive? -What pleasure I from such obedience paid, -When will and reason (reason also is choice) -Useless and vain, of freedom both despoil'd, -Made passive both, had serv'd necessity, -Not me? they therefore, as to right belong$ 'd, -So were created, nor can justly accuse -Their Maker, or their making, or their fate, -As if predestination over-rul'd -Their will dispos'd by absolute decree -Or high foreknowledge they themselves decreed -Their own revolt, not I; if I foreknew, -Foreknowledge had no influence on their fault, -Which had no less proved certain unforeknown. -So without least impulse or shadow of fate, -Or aught by me immutably foreseen, -They trespass, authors to themselves in all -Both what they judge, and what they choose; for so -I form'd them free: and free they must remain, -Till they enthrall themselves; I else must change -Their nature, and revoke the high decree -Unchangeable, eternal, which ordain'd -$THeir freedom: they themselves ordain'd their fall. -The first sort by their own suggestion fell, -Self-tempted, self-deprav'd: Man falls, deceiv'd -By the other first: Man therefore shall find grace, -The other none: In mercy and justice both, -Through Heaven and Earth, so shall my glory excel; -But Mercy, first and last, shall brightest shine. -Thus while God spake, ambrosial fragrance fill'd -All Heaven, and in the blessed Spirits elect -Sense of new joy ineffable diffus'd. -Beyond compare the Son of God was seen -Most glorious; in him all his Father shone -Substantially express'd; and in his face -Divine compassion visibly appear'd, -Love without end, and without measure grace, -Which uttering, thus he to his Father spake. -O Father, gracious was that word which clos'd -Thy sovran command, that Man should find grace; -, that Man should find grace; -For which both Heaven and earth shall high extol -Thy praises, with the innumerable sound -Of hymns and sacred songs, wherewith thy throne -Encompass'd shall resound thee ever blest. -For should Man finally be lost, should Man, -Thy creature late so lov'd, thy youngest son, -Fall circumvented thus by fraud, though join'd -With his own folly? that be from thee far, -That far be from thee, Father, who art judge -Of all things made, and judgest only right. -Or shall the Adversary thus obtain -His end, and frustrate thine? shall he fulfill -His malice, and thy goodness bring to nought, -Or proud return, though to his heavier doom, -Yet with revenge accomplish'd, and to Hell -Draw after him the whole race of mankind, -By him corrupted? or wilt thou thyself -Abolish thy creation, and unmake -For him, what for thy glory thou hast made? -So should thy goodness and thy greatness both -Be question'd and blasphem'd without defence. -To whom the great Creator thus replied. -O son, in whom my soul hath chief delight, -Son of my bosom, Son who art alone. -My word, my wisdom, and effectual might, -All hast thou spoken as my thoughts are, all -As my eternal purpose hath decreed; -Man shall not quite be lost, but sav'd who will; -Yet not of will in him, but grace in me -Freely vouchsaf'd; once more I will renew -His lapsed powers, though forfeit; and enthrall'd -By sin to foul exorbitant desires; -Upheld by me, yet once more he shall stand -On even ground against his mortal foe; -By me upheld, that he may know how frail -His fallen condition is, and to me owe -All his deliverance, and to none but me. -Some I have chosen of peculiar grace, -Elect above the rest; so is my will: -The rest shall hear me call, and oft be warn'd -Their sinful state, and to appease betimes -The incensed Deity, while offer'd grace -Invites; for I will clear their senses dark, -What may suffice, and soften stony hearts -To pray, repent, and bring obedience due. -To prayer, repentance, and obedience due, -Though but endeavour'd with sincere intent, -Mine ear shall not be slow, mine eye not shut. -And I will place within them as a guide, -My umpire Conscience; whom if they will hear, -Light after light, well us'd, they shall attain, -And to the end, persisting, safe arrive. -This my long sufferance, and my day of grace, -They who neglect and scorn, shall never taste; -But hard be harden'd, blind be blinded more, -That they may stumble on, and deeper fall; -And none but such from mercy I exclude. -But yet all is not done; Man disobeying, -Disloyal, breaks his fealty, and sins -Against the high supremacy of Heaven, -Affecting God-head, and, so losing all, -To expiate his treason hath nought left, -But to destruction sacred and devote, -He, with his whole posterity, must die, -Die he or justice must; unless for him -Some other able, and as willing, pay -The rigid satisfaction, death for death. -Say, heavenly Powers, where shall we find such love? -Which of you will be mortal, to redeem -Man's mortal crime, and just the unjust to save? -Dwells in all Heaven charity so dear? -And silence was in Heaven: $ on Man's behalf -He ask'd, but all the heavenly quire stood mute, -Patron or intercessour none appear'd, -Much less that durst upon his own head draw -The deadly forfeiture, and ransom set. -And now without redemption all mankind -Must have been lost, adjudg'd to Death and Hell -By doom severe, had not the Son of God, -In whom the fulness dwells of love divine, -His dearest mediation thus renew'd. -Father, thy word is past, Man shall find grace; -And shall grace not find means, that finds her way, -The speediest of thy winged messengers, -To visit all thy creatures, and to all -Comes unprevented, unimplor'd, unsought? -Happy for Man, so coming; he her aid -Can never seek, once dead in sins, and lost; -Atonement for himself, or offering meet, -Indebted and undone, hath none to bring; -Behold me then: me for him, life for life -I offer: on me let thine anger fall; -Account me Man; I for his sake will leave - Thy bosom, and this glory next to thee - Freely put off, and for him lastly die - Well pleased; on me let Death wreak all his rage. - Under his gloomy power I shall not long - Lie vanquished. Thou hast given me to possess - Life in myself for ever; by thee I live; - Though now to Death I yield, and am his due, - All that of me can die, yet, that debt paid, - $ thou wilt not leave me in the loathsome grave - His prey, nor suffer my unspotted soul - For ever with corruption there to dwell; - But I shall rise victorious, and subdue - My vanquisher, spoiled of his vaunted spoil. - Death his death's wound shall then receive, and stoop - Inglorious, of his mortal sting disarmed; - I through the ample air in triumph high - Shall lead Hell captive maugre Hell, and show -The powers of darkness bound. Thou, at the sight - Pleased, out of Heaven shalt look down and smile, - While, by thee raised, I ruin all my foes; - Death last, and with his carcase glut the grave; - Then, with the multitude of my redeemed, - Shall enter Heaven, long absent, and return, - Father, to see thy face, wherein no cloud - Of anger shall remain, but peace assured - And reconcilement: wrath shall be no more - Thenceforth, but in thy presence joy entire. - His words here ended; but his meek aspect - Silent yet spake, and breathed immortal love - To mortal men, above which only shone - Filial obedience: as a sacrifice - Glad to be offered, he attends the will - Of his great Father. Admiration seized - All Heaven, what this might mean, and whither tend, - Wondering; but soon th' Almighty thus replied. - O thou in Heaven and Earth the only peace - Found out for mankind under wrath, O thou - My sole complacence! Well thou know'st how dear - To me are all my works; nor Man the least, - Though last created, that for him I spare - Thee from my bosom and right hand, to save, - By losing thee a while, the whole race lost. - - 00021053 - Thou, therefore, whom thou only canst redeem, - Their nature also to thy nature join; - And be thyself Man among men on Earth, - Made flesh, when time shall be, of virgin seed, - By wondrous birth; be thou in Adam's room -The head of all mankind, though Adam's son. -As in him perish all men, so in thee, -As from a second root, shall be restored -As many as are restored, without thee none. -His crime makes guilty all his sons; thy merit, -Imputed, shall absolve them who renounce -Their own both righteous and unrighteous deeds, -And live in thee transplanted, and from thee -Receive new life. So Man, as is most just, -Shall satisfy for Man, be judged and die, -And dying rise, and rising with him raise -His brethren, ransomed with his own dear life. -So heavenly love shall outdo hellish hate, -Giving to death, and dying to redeem, -So dearly to redeem what hellish hate -So easily destroyed, and still destroys -In those who, when they may, accept not grace. -Nor shalt thou, by descending to assume -Man's nature, lessen or degrade thine own. -Because thou hast, though throned in highest bliss -Equal to God, and equally enjoying -God-like fruition, quitted all, to save -A world from utter loss, and hast been found -By merit more than birthright Son of God, -Found worthiest to be so by being good, -Far more than great or high; because in thee -Love hath abounded more than glory abounds; -Therefore thy humiliation shall exalt -With thee thy manhood also to this throne: -Here shalt thou sit incarnate, here shalt reign -Both God and Man, Son both of God and Man, -Anointed universal King; all power -I give thee; reign for ever, and assume -Thy merits; under thee, as head supreme, -Thrones, Princedoms, Powers, Dominions, I reduce: -All knees to thee shall bow, of them that bide -In Heaven, or Earth, or under Earth in Hell. -When thou, attended gloriously from Heaven, -Shalt in the sky appear, and from thee send -The summoning Arch-Angels to proclaim -Thy dread tribunal; forthwith from all winds, -The living, and forthwith the cited dead -Of all past ages, to the general doom -Shall hasten; such a peal shall rouse their sleep. -Then, all thy saints assembled, thou shalt judge -Bad Men and Angels; they, arraigned, shall sink -Beneath thy sentence; Hell, her numbers full, -Thenceforth shall be for ever shut. Mean while -The world shall burn, and from her ashes spring -New Heaven and Earth, wherein the just shall dwell, -And, after all their tribulations long, -See golden days, fruitful of golden deeds, -With joy and peace triumphing, and fair truth. -Then thou thy regal scepter shalt lay by, -For regal scepter then no more shall need, -God shall be all in all. But, all ye Gods, -Adore him, who to compass all this dies; -Adore the Son, and honour him as me. -No sooner had the Almighty ceased, but all -The multitude of Angels, with a shout -Loud as from numbers without number, sweet -As from blest voices, uttering joy, Heaven rung -With jubilee, and loud Hosannas filled -The eternal regions: Lowly reverent -Towards either throne they bow, and to the ground -With solemn adoration down they cast -Their crowns inwove with amarant and gold; -Immortal amarant, a flower which once -In Paradise, fast by the tree of life, -Began to bloom; but soon for man's offence -To Heaven removed, where first it grew, there grows, -And flowers aloft shading the fount of life, -And where the river of bliss through midst of Heaven -Rolls o'er Elysian flowers her amber stream; -With these that never fade the Spirits elect -Bind their resplendent locks inwreathed with beams; -Now in loose garlands thick thrown off, the bright -Pavement, that like a sea of jasper shone, -Impurpled with celestial roses smiled. -Then, crowned again, their golden harps they took, -Harps ever tuned, that glittering by their side -Like quivers hung, and with preamble sweet -Of charming symphony they introduce -Their sacred song, and waken raptures high; -No voice exempt, no voice but well could join -Melodious part, such concord is in Heaven. -Thee, Father, first they sung Omnipotent, -Immutable, Immortal, Infinite, -Eternal King; the Author of all being, -Fonntain of light, thyself invisible -Amidst the glorious brightness where thou sit'st -Throned inaccessible, but when thou shadest -The full blaze of thy beams, and, through a cloud -Drawn round about thee like a radiant shrine, -Dark with excessive bright thy skirts appear, -Yet dazzle Heaven, that brightest Seraphim -Approach not, but with both wings veil their eyes. -Thee next they sang of all creation first, -Begotten Son, Divine Similitude, -In whose conspicuous countenance, without cloud -Made visible, the Almighty Father shines, -Whom else no creature can behold; on thee -Impressed the effulgence of his glory abides, -Transfused on thee his ample Spirit rests. -He Heaven of Heavens and all the Powers therein -By thee created; and by thee threw down -The aspiring Dominations: Thou that day -Thy Father's dreadful thunder didst not spare, -Nor stop thy flaming chariot-wheels, that shook -Heaven's everlasting frame, while o'er the necks -Thou drovest of warring Angels disarrayed. -Back from pursuit thy Powers with loud acclaim -Thee only extolled, Son of thy Father's might, -To execute fierce vengeance on his foes, -Not so on Man: Him through their malice fallen, -Father of mercy and grace, thou didst not doom -So strictly, but much more to pity incline: -No sooner did thy dear and only Son -Perceive thee purposed not to doom frail Man -So strictly, but much more to pity inclined, -He to appease thy wrath, and end the strife -Of mercy and justice in thy face discerned, -Regardless of the bliss wherein he sat -Second to thee, offered himself to die -For Man's offence. O unexampled love, -Love no where to be found less than Divine! -Hail, Son of God, Saviour of Men! Thy name -Shall be the copious matter of my song -Henceforth, and never shall my heart thy praise -Forget, nor from thy Father's praise disjoin. -Thus they in Heaven, above the starry sphere, -Their happy hours in joy and hymning spent. -Mean while upon the firm opacous globe -Of this round world, whose first convex divides -The luminous inferiour orbs, enclosed -From Chaos, and the inroad of Darkness old, -Satan alighted walks: A globe far off -It seemed, now seems a boundless continent -Dark, waste, and wild, under the frown of Night -Starless exposed, and ever-threatening storms -Of Chaos blustering round, inclement sky; -Save on that side which from the wall of Heaven, -Though distant far, some small reflection gains -Of glimmering air less vexed with tempest loud: -Here walked the Fiend at large in spacious field. -As when a vultur on Imaus bred, -Whose snowy ridge the roving Tartar bounds, -Dislodging from a region scarce of prey -To gorge the flesh of lambs or yeanling kids, -On hills where flocks are fed, flies toward the springs -Of Ganges or Hydaspes, Indian streams; -But in his way lights on the barren plains -Of Sericana, where Chineses drive -With sails and wind their cany waggons light: -So, on this windy sea of land, the Fiend -Walked up and down alone, bent on his prey; -Alone, for other creature in this place, -Living or lifeless, to be found was none; -None yet, but store hereafter from the earth -Up hither like aereal vapours flew -Of all things transitory and vain, when sin -With vanity had filled the works of men: -Both all things vain, and all who in vain things -Built their fond hopes of glory or lasting fame, -Or happiness in this or the other life; -All who have their reward on earth, the fruits -Of painful superstition and blind zeal, -Nought seeking but the praise of men, here find -Fit retribution, empty as their deeds; -All the unaccomplished works of Nature's hand, -Abortive, monstrous, or unkindly mixed, -Dissolved on earth, fleet hither, and in vain, -Till final dissolution, wander here; -Not in the neighbouring moon as some have dreamed; -Those argent fields more likely habitants, -Translated Saints, or middle Spirits hold -Betwixt the angelical and human kind. -Hither of ill-joined sons and daughters born -First from the ancient world those giants came -With many a vain exploit, though then renowned: -The builders next of Babel on the plain -Of Sennaar, and still with vain design, -New Babels, had they wherewithal, would build: -Others came single; he, who, to be deemed -A God, leaped fondly into Aetna flames, -Empedocles; and he, who, to enjoy -Plato's Elysium, leaped into the sea, -Cleombrotus; and many more too long, -Embryos, and idiots, eremites, and friars -White, black, and gray, with all their trumpery. -Here pilgrims roam, that strayed so far to seek -In Golgotha him dead, who lives in Heaven; -And they, who to be sure of Paradise, -Dying, put on the weeds of Dominick, -Or in Franciscan think to pass disguised; -They pass the planets seven, and pass the fixed, -And that crystalling sphere whose balance weighs -The trepidation talked, and that first moved; -And now Saint Peter at Heaven's wicket seems -To wait them with his keys, and now at foot -Of Heaven's ascent they lift their feet, when lo -A violent cross wind from either coast -Blows them transverse, ten thousand leagues awry -Into the devious air: Then might ye see -Cowls, hoods, and habits, with their wearers, tost -And fluttered into rags; then reliques, beads, -Indulgences, dispenses, pardons, bulls, -The sport of winds: All these, upwhirled aloft, -Fly o'er the backside of the world far off -Into a Limbo large and broad, since called -The Paradise of Fools, to few unknown -Long after; now unpeopled, and untrod. -All this dark globe the Fiend found as he passed, -And long he wandered, till at last a gleam -Of dawning light turned thither-ward in haste -His travelled steps: far distant he descries -Ascending by degrees magnificent -Up to the wall of Heaven a structure high; -At top whereof, but far more rich, appeared -The work as of a kingly palace-gate, -With frontispiece of diamond and gold -Embellished; thick with sparkling orient gems -The portal shone, inimitable on earth -By model, or by shading pencil, drawn. -These stairs were such as whereon Jacob saw -Angels ascending and descending, bands -Of guardians bright, when he from Esau fled -To Padan-Aram, in the field of Luz -Dreaming by night under the open sky -And waking cried, This is the gate of Heaven. -Each stair mysteriously was meant, nor stood -There always, but drawn up to Heaven sometimes -Viewless; and underneath a bright sea flowed -Of jasper, or of liquid pearl, whereon -Who after came from earth, failing arrived -Wafted by Angels, or flew o'er the lake -Rapt in a chariot drawn by fiery steeds. -The stairs were then let down, whether to dare -The Fiend by easy ascent, or aggravate -His sad exclusion from the doors of bliss: -Direct against which opened from beneath, -Just o'er the blissful seat of Paradise, -A passage down to the Earth, a passage wide, -Wider by far than that of after-times -Over mount Sion, and, though that were large, -Over the Promised Land to God so dear; -By which, to visit oft those happy tribes, -On high behests his angels to and fro -Passed frequent, and his eye with choice regard -From Paneas, the fount of Jordan's flood, -To Beersaba, where the Holy Land -Borders on Egypt and the Arabian shore; -So wide the opening seemed, where bounds were set -To darkness, such as bound the ocean wave. -Satan from hence, now on the lower stair, -That scaled by steps of gold to Heaven-gate, -Looks down with wonder at the sudden view -Of all this world at once. As when a scout, -Through dark?;nd desart ways with?oeril gone -All?might,?;t?kast by break of cheerful dawn -Obtains the brow of some high-climbing hill, -Which to his eye discovers unaware -The goodly prospect of some foreign land -First seen, or some renowned metropolis -With glistering spires and pinnacles adorned, -Which now the rising sun gilds with his beams: -Such wonder seised, though after Heaven seen, -The Spirit malign, but much more envy seised, -At sight of all this world beheld so fair. -Round he surveys (and well might, where he stood -So high above the circling canopy -Of night's extended shade,) from eastern point -Of Libra to the fleecy star that bears -Andromeda far off Atlantick seas -Beyond the horizon; then from pole to pole -He views in breadth, and without longer pause -Down right into the world's first region throws -His flight precipitant, and winds with ease -Through the pure marble air his oblique way -Amongst innumerable stars, that shone -Stars distant, but nigh hand seemed other worlds; -Or other worlds they seemed, or happy isles, -Like those Hesperian gardens famed of old, -Fortunate fields, and groves, and flowery vales, -Thrice happy isles; but who dwelt happy there -He staid not to inquire: Above them all -The golden sun, in splendour likest Heaven, -Allured his eye; thither his course he bends -Through the calm firmament, (but up or down, -By center, or eccentrick, hard to tell, -Or longitude,) where the great luminary -Aloof the vulgar constellations thick, -That from his lordly eye keep distance due, -Dispenses light from far; they, as they move -Their starry dance in numbers that compute -Days, months, and years, towards his all-cheering lamp -Turn swift their various motions, or are turned -By his magnetick beam, that gently warms -The universe, and to each inward part -With gentle penetration, though unseen, -Shoots invisible virtue even to the deep; -So wonderously was set his station bright. -There lands the Fiend, a spot like which perhaps -Astronomer in the sun's lucent orb -Through his glazed optick tube yet never saw. -The place he found beyond expression bright, -Compared with aught on earth, metal or stone; -Not all parts like, but all alike informed -With radiant light, as glowing iron with fire; -If metal, part seemed gold, part silver clear; -If stone, carbuncle most or chrysolite, -Ruby or topaz, to the twelve that shone -In Aaron's breast-plate, and a stone besides -Imagined rather oft than elsewhere seen, -That stone, or like to that which here below -Philosophers in vain so long have sought, -In vain, though by their powerful art they bind -Volatile Hermes, and call up unbound -In various shapes old Proteus from the sea, -Drained through a limbeck to his native form. -What wonder then if fields and regions here -Breathe forth Elixir pure, and rivers run -Potable gold, when with one virtuous touch -The arch-chemick sun, so far from us remote, -Produces, with terrestrial humour mixed, -Here in the dark so many precious things -Of colour glorious, and effect so rare? -Here matter new to gaze the Devil met -Undazzled; far and wide his eye commands; -For sight no obstacle found here, nor shade, -But all sun-shine, as when his beams at noon -Culminate from the equator, as they now -Shot upward still direct, whence no way round -Shadow from body opaque can fall; and the air, -No where so clear, sharpened his visual ray -To objects distant far, whereby he soon -Saw within ken a glorious Angel stand, -The same whom John saw also in the sun: -His back was turned, but not his brightness hid; -Of beaming sunny rays a golden tiar -Circled his head, nor less his locks behind -Illustrious on his shoulders fledge with wings -Lay waving round; on some great charge employed -He seemed, or fixed in cogitation deep. -Glad was the Spirit impure, as now in hope -To find who might direct his wandering flight -To Paradise, the happy seat of Man, -His journey's end and our beginning woe. -But first he casts to change his proper shape, -Which else might work him danger or delay: -And now a stripling Cherub he appears, -Not of the prime, yet such as in his face -Youth smiled celestial, and to every limb -Suitable grace diffused, so well he feigned: -Under a coronet his flowing hair -In curls on either cheek played; wings he wore -Of many a coloured plume, sprinkled with gold; -His habit fit for speed succinct, and held -Before his decent steps a silver wand. -He drew not nigh unheard; the Angel bright, -Ere he drew nigh, his radiant visage turned, -Admonished by his ear, and straight was known -The Arch-Angel Uriel, one of the seven -Who in God's presence, nearest to his throne, -Stand ready at command, and are his eyes -That run through all the Heavens, or down to the Earth -Bear his swift errands over moist and dry, -O'er sea and land: him Satan thus accosts. -Uriel, for thou of those seven Spirits that stand -In sight of God's high throne, gloriously bright, -The first art wont his great authentick will -Interpreter through highest Heaven to bring, -Where all his sons thy embassy attend; -And here art likeliest by supreme decree -Like honour to obtain, and as his eye -To visit oft this new creation round; -Unspeakable desire to see, and know -All these his wonderous works, but chiefly Man, -His chief delight and favour, him for whom -All these his works so wonderous he ordained, -Hath brought me from the quires of Cherubim -Alone thus wandering. Brightest Seraph, tell -In which of all these shining orbs hath Man -His fixed seat, or fixed seat hath none, -But all these shining orbs his choice to dwell; -That I may find him, and with secret gaze -Or open admiration him behold, -On whom the great Creator hath bestowed -Worlds, and on whom hath all these graces poured; -That both in him and all things, as is meet, -The universal Maker we may praise; -Who justly hath driven out his rebel foes -To deepest Hell, and, to repair that loss, -Created this new happy race of Men -To serve him better: Wise are all his ways. -So spake the false dissembler unperceived; -For neither Man nor Angel can discern -Hypocrisy, the only evil that walks -Invisible, except to God alone, -By his permissive will, through Heaven and Earth: -And oft, though wisdom wake, suspicion sleeps -At wisdom's gate, and to simplicity -Resigns her charge, while goodness thinks no ill -Where no ill seems: Which now for once beguiled -Uriel, though regent of the sun, and held -The sharpest-sighted Spirit of all in Heaven; -Who to the fraudulent impostor foul, -In his uprightness, answer thus returned. -Fair Angel, thy desire, which tends to know -The works of God, thereby to glorify -The great Work-master, leads to no excess -That reaches blame, but rather merits praise -The more it seems excess, that led thee hither -From thy empyreal mansion thus alone, -To witness with thine eyes what some perhaps, -Contented with report, hear only in Heaven: -For wonderful indeed are all his works, -Pleasant to know, and worthiest to be all -Had in remembrance always with delight; -But what created mind can comprehend -Their number, or the wisdom infinite -That brought them forth, but hid their causes deep? -I saw when at his word the formless mass, -This world's material mould, came to a heap: -Confusion heard his voice, and wild uproar -Stood ruled, stood vast infinitude confined; -Till at his second bidding Darkness fled, -Light shone, and order from disorder sprung: -Swift to their several quarters hasted then -The cumbrous elements, earth, flood, air, fire; -And this ethereal quintessence of Heaven -Flew upward, spirited with various forms, -That rolled orbicular, and turned to stars -Numberless, as thou seest, and how they move; -Each had his place appointed, each his course; -The rest in circuit walls this universe. -Look downward on that globe, whose hither side -With light from hence, though but reflected, shines; -That place is Earth, the seat of Man; that light -His day, which else, as the other hemisphere, -Night would invade; but there the neighbouring moon -So call that opposite fair star) her aid -Timely interposes, and her monthly round -Still ending, still renewing, through mid Heaven, -With borrowed light her countenance triform -Hence fills and empties to enlighten the Earth, -And in her pale dominion checks the night. -That spot, to which I point, is Paradise, -Adam's abode; those lofty shades, his bower. -Thy way thou canst not miss, me mine requires. -Thus said, he turned; and Satan, bowing low, -As to superiour Spirits is wont in Heaven, -Where honour due and reverence none neglects, -Took leave, and toward the coast of earth beneath, -Down from the ecliptick, sped with hoped success, -Throws his steep flight in many an aery wheel; -Nor staid, till on Niphates' top he lights. - - - -Book IV - - -O, for that warning voice, which he, who saw -The Apocalypse, heard cry in Heaven aloud, -Then when the Dragon, put to second rout, -Came furious down to be revenged on men, -Woe to the inhabitants on earth! that now, -While time was, our first parents had been warned -The coming of their secret foe, and 'scaped, -Haply so 'scaped his mortal snare: For now -Satan, now first inflamed with rage, came down, -The tempter ere the accuser of mankind, -To wreak on innocent frail Man his loss -Of that first battle, and his flight to Hell: -Yet, not rejoicing in his speed, though bold -Far off and fearless, nor with cause to boast, -Begins his dire attempt; which nigh the birth -Now rolling boils in his tumultuous breast, -And like a devilish engine back recoils -Upon himself; horrour and doubt distract -His troubled thoughts, and from the bottom stir -The Hell within him; for within him Hell -He brings, and round about him, nor from Hell -One step, no more than from himself, can fly -By change of place: Now conscience wakes despair, -That slumbered; wakes the bitter memory -Of what he was, what is, and what must be -Worse; of worse deeds worse sufferings must ensue. -Sometimes towards Eden, which now in his view -Lay pleasant, his grieved look he fixes sad; -Sometimes towards Heaven, and the full-blazing sun, -Which now sat high in his meridian tower: -Then, much revolving, thus in sighs began. -O thou, that, with surpassing glory crowned, -Lookest from thy sole dominion like the God -Of this new world; at whose sight all the stars -Hide their diminished heads; to thee I call, -But with no friendly voice, and add thy name, -Of Sun! to tell thee how I hate thy beams, -That bring to my remembrance from what state -I fell, how glorious once above thy sphere; -Till pride and worse ambition threw me down -Warring in Heaven against Heaven's matchless King: -Ah, wherefore! he deserved no such return -From me, whom he created what I was -In that bright eminence, and with his good -Upbraided none; nor was his service hard. -What could be less than to afford him praise, -The easiest recompence, and pay him thanks, -How due! yet all his good proved ill in me, -And wrought but malice; lifted up so high -I sdeined subjection, and thought one step higher -Would set me highest, and in a moment quit -The debt immense of endless gratitude, -So burdensome still paying, still to owe, -Forgetful what from him I still received, -And understood not that a grateful mind -By owing owes not, but still pays, at once -Indebted and discharged; what burden then -O, had his powerful destiny ordained -Me some inferiour Angel, I had stood -Then happy; no unbounded hope had raised -Ambition! Yet why not some other Power -As great might have aspired, and me, though mean, -Drawn to his part; but other Powers as great -Fell not, but stand unshaken, from within -Or from without, to all temptations armed. -Hadst thou the same free will and power to stand? -Thou hadst: whom hast thou then or what to accuse, -But Heaven's free love dealt equally to all? -Be then his love accursed, since love or hate, -To me alike, it deals eternal woe. -Nay, cursed be thou; since against his thy will -Chose freely what it now so justly rues. -Me miserable! which way shall I fly -Infinite wrath, and infinite despair? -Which way I fly is Hell; myself am Hell; -And, in the lowest deep, a lower deep -Still threatening to devour me opens wide, -To which the Hell I suffer seems a Heaven. -O, then, at last relent: Is there no place -Left for repentance, none for pardon left? -None left but by submission; and that word -Disdain forbids me, and my dread of shame -Among the Spirits beneath, whom I seduced -With other promises and other vaunts -Than to submit, boasting I could subdue -The Omnipotent. Ay me! they little know -How dearly I abide that boast so vain, -Under what torments inwardly I groan, -While they adore me on the throne of Hell. -With diadem and scepter high advanced, -The lower still I fall, only supreme -In misery: Such joy ambition finds. -But say I could repent, and could obtain, -By act of grace, my former state; how soon -Would highth recall high thoughts, how soon unsay -What feigned submission swore? Ease would recant -Vows made in pain, as violent and void. -For never can true reconcilement grow, -Where wounds of deadly hate have pierced so deep: -Which would but lead me to a worse relapse -And heavier fall: so should I purchase dear -Short intermission bought with double smart. -This knows my Punisher; therefore as far -From granting he, as I from begging, peace; -All hope excluded thus, behold, in stead -Mankind created, and for him this world. -So farewell, hope; and with hope farewell, fear; -Farewell, remorse! all good to me is lost; -Evil, be thou my good; by thee at least -Divided empire with Heaven's King I hold, -By thee, and more than half perhaps will reign; -As Man ere long, and this new world, shall know. -Thus while he spake, each passion dimmed his face -Thrice changed with pale, ire, envy, and despair; -Which marred his borrowed visage, and betrayed -Him counterfeit, if any eye beheld. -For heavenly minds from such distempers foul -Are ever clear. Whereof he soon aware, -Each perturbation smoothed with outward calm, -Artificer of fraud; and was the first -That practised falsehood under saintly show, -Deep malice to conceal, couched with revenge: -Yet not enough had practised to deceive -Uriel once warned; whose eye pursued him down - The way he went, and on the Assyrian mount - Saw him disfigured, more than could befall - Spirit of happy sort; his gestures fierce - He marked and mad demeanour, then alone, - As he supposed, all unobserved, unseen. - So on he fares, and to the border comes - Of Eden, where delicious Paradise, - Now nearer, crowns with her enclosure green, - As with a rural mound, the champaign head - Of a steep wilderness, whose hairy sides -Access denied; and overhead upgrew - Insuperable height of loftiest shade, - Cedar, and pine, and fir, and branching palm, - A sylvan scene, and, as the ranks ascend, - Shade above shade, a woody theatre - Of stateliest view. Yet higher than their tops - The verdurous wall of Paradise upsprung; - - 00081429 -Which to our general sire gave prospect large -Into his nether empire neighbouring round. -And higher than that wall a circling row -Of goodliest trees, loaden with fairest fruit, -Blossoms and fruits at once of golden hue, -Appeared, with gay enamelled colours mixed: -On which the sun more glad impressed his beams -Than in fair evening cloud, or humid bow, -When God hath showered the earth; so lovely seemed -That landskip: And of pure now purer air -Meets his approach, and to the heart inspires -Vernal delight and joy, able to drive -All sadness but despair: Now gentle gales, -Fanning their odoriferous wings, dispense -Native perfumes, and whisper whence they stole -Those balmy spoils. As when to them who fail -Beyond the Cape of Hope, and now are past -Mozambick, off at sea north-east winds blow -Sabean odours from the spicy shore -Of Araby the blest; with such delay -Well pleased they slack their course, and many a league -Cheered with the grateful smell old Ocean smiles: -So entertained those odorous sweets the Fiend, -Who came their bane; though with them better pleased -Than Asmodeus with the fishy fume -That drove him, though enamoured, from the spouse -Of Tobit's son, and with a vengeance sent -From Media post to Egypt, there fast bound. -Now to the ascent of that steep savage hill -Satan had journeyed on, pensive and slow; -But further way found none, so thick entwined, -As one continued brake, the undergrowth -Of shrubs and tangling bushes had perplexed -All path of man or beast that passed that way. -One gate there only was, and that looked east -On the other side: which when the arch-felon saw, -Due entrance he disdained; and, in contempt, -At one flight bound high over-leaped all bound -Of hill or highest wall, and sheer within -Lights on his feet. As when a prowling wolf, -Whom hunger drives to seek new haunt for prey, -Watching where shepherds pen their flocks at eve -In hurdled cotes amid the field secure, -Leaps o'er the fence with ease into the fold: -Or as a thief, bent to unhoard the cash -Of some rich burgher, whose substantial doors, -Cross-barred and bolted fast, fear no assault, -In at the window climbs, or o'er the tiles: -So clomb this first grand thief into God's fold; -So since into his church lewd hirelings climb. -Thence up he flew, and on the tree of life, -The middle tree and highest there that grew, -Sat like a cormorant; yet not true life -Thereby regained, but sat devising death -To them who lived; nor on the virtue thought -Of that life-giving plant, but only used -For prospect, what well used had been the pledge -Of immortality. So little knows -Any, but God alone, to value right -The good before him, but perverts best things -To worst abuse, or to their meanest use. -Beneath him with new wonder now he views, -To all delight of human sense exposed, -In narrow room, Nature's whole wealth, yea more, -A Heaven on Earth: For blissful Paradise -Of God the garden was, by him in the east -Of Eden planted; Eden stretched her line -From Auran eastward to the royal towers -Of great Seleucia, built by Grecian kings, -Of where the sons of Eden long before -Dwelt in Telassar: In this pleasant soil -His far more pleasant garden God ordained; -Out of the fertile ground he caused to grow -All trees of noblest kind for sight, smell, taste; -And all amid them stood the tree of life, -High eminent, blooming ambrosial fruit -Of vegetable gold; and next to life, -Our death, the tree of knowledge, grew fast by, -Knowledge of good bought dear by knowing ill. -Southward through Eden went a river large, -Nor changed his course, but through the shaggy hill -Passed underneath ingulfed; for God had thrown -That mountain as his garden-mould high raised -Upon the rapid current, which, through veins -Of porous earth with kindly thirst up-drawn, -Rose a fresh fountain, and with many a rill -Watered the garden; thence united fell -Down the steep glade, and met the nether flood, -Which from his darksome passage now appears, -And now, divided into four main streams, -Runs diverse, wandering many a famous realm -And country, whereof here needs no account; -But rather to tell how, if Art could tell, -How from that sapphire fount the crisped brooks, -Rolling on orient pearl and sands of gold, -With mazy errour under pendant shades -Ran nectar, visiting each plant, and fed -Flowers worthy of Paradise, which not nice Art -In beds and curious knots, but Nature boon -Poured forth profuse on hill, and dale, and plain, -Both where the morning sun first warmly smote -The open field, and where the unpierced shade -Imbrowned the noontide bowers: Thus was this place -A happy rural seat of various view; -Groves whose rich trees wept odorous gums and balm, -Others whose fruit, burnished with golden rind, -Hung amiable, Hesperian fables true, -If true, here only, and of delicious taste: -Betwixt them lawns, or level downs, and flocks -Grazing the tender herb, were interposed, -Or palmy hillock; or the flowery lap -Of some irriguous valley spread her store, -Flowers of all hue, and without thorn the rose: -Another side, umbrageous grots and caves -Of cool recess, o'er which the mantling vine -Lays forth her purple grape, and gently creeps -Luxuriant; mean while murmuring waters fall -Down the slope hills, dispersed, or in a lake, -That to the fringed bank with myrtle crowned -Her crystal mirrour holds, unite their streams. -The birds their quire apply; airs, vernal airs, -Breathing the smell of field and grove, attune -The trembling leaves, while universal Pan, -Knit with the Graces and the Hours in dance, -Led on the eternal Spring. Not that fair field -Of Enna, where Proserpine gathering flowers, -Herself a fairer flower by gloomy Dis -Was gathered, which cost Ceres all that pain -To seek her through the world; nor that sweet grove -Of Daphne by Orontes, and the inspired -Castalian spring, might with this Paradise -Of Eden strive; nor that Nyseian isle -Girt with the river Triton, where old Cham, -Whom Gentiles Ammon call and Libyan Jove, -Hid Amalthea, and her florid son -Young Bacchus, from his stepdame Rhea's eye; -Nor where Abassin kings their issue guard, -Mount Amara, though this by some supposed -True Paradise under the Ethiop line -By Nilus' head, enclosed with shining rock, -A whole day's journey high, but wide remote -From this Assyrian garden, where the Fiend -Saw, undelighted, all delight, all kind -Of living creatures, new to sight, and strange -Two of far nobler shape, erect and tall, -Godlike erect, with native honour clad -In naked majesty seemed lords of all: -And worthy seemed; for in their looks divine -The image of their glorious Maker shone, -Truth, wisdom, sanctitude severe and pure, -(Severe, but in true filial freedom placed,) -Whence true authority in men; though both -Not equal, as their sex not equal seemed; -For contemplation he and valour formed; -For softness she and sweet attractive grace; -He for God only, she for God in him: -His fair large front and eye sublime declared -Absolute rule; and hyacinthine locks -Round from his parted forelock manly hung -Clustering, but not beneath his shoulders broad: -She, as a veil, down to the slender waist -Her unadorned golden tresses wore -Dishevelled, but in wanton ringlets waved -As the vine curls her tendrils, which implied -Subjection, but required with gentle sway, -And by her yielded, by him best received, -Yielded with coy submission, modest pride, -And sweet, reluctant, amorous delay. -Nor those mysterious parts were then concealed; -Then was not guilty shame, dishonest shame -Of nature's works, honour dishonourable, -Sin-bred, how have ye troubled all mankind -With shows instead, mere shows of seeming pure, -And banished from man's life his happiest life, -Simplicity and spotless innocence! -So passed they naked on, nor shunned the sight -Of God or Angel; for they thought no ill: -So hand in hand they passed, the loveliest pair, -That ever since in love's embraces met; -Adam the goodliest man of men since born -His sons, the fairest of her daughters Eve. -Under a tuft of shade that on a green -Stood whispering soft, by a fresh fountain side -They sat them down; and, after no more toil -Of their sweet gardening labour than sufficed -To recommend cool Zephyr, and made ease -More easy, wholesome thirst and appetite -More grateful, to their supper-fruits they fell, -Nectarine fruits which the compliant boughs -Yielded them, side-long as they sat recline -On the soft downy bank damasked with flowers: -The savoury pulp they chew, and in the rind, -Still as they thirsted, scoop the brimming stream; -Nor gentle purpose, nor endearing smiles -Wanted, nor youthful dalliance, as beseems -Fair couple, linked in happy nuptial league, -Alone as they. About them frisking played -All beasts of the earth, since wild, and of all chase -In wood or wilderness, forest or den; -Sporting the lion ramped, and in his paw -Dandled the kid; bears, tigers, ounces, pards, -Gambolled before them; the unwieldy elephant, -To make them mirth, used all his might, and wreathed -His?kithetmroboscis; close the serpent sly, -Insinuating, wove with Gordian twine -His braided train, and of his fatal guile -Gave proof unheeded; others on the grass -Couched, and now filled with pasture gazing sat, -Or bedward ruminating; for the sun, -Declined, was hasting now with prone career -To the ocean isles, and in the ascending scale -Of Heaven the stars that usher evening rose: -When Satan still in gaze, as first he stood, -Scarce thus at length failed speech recovered sad. -O Hell! what do mine eyes with grief behold! -Into our room of bliss thus high advanced -Creatures of other mould, earth-born perhaps, -Not Spirits, yet to heavenly Spirits bright -Little inferiour; whom my thoughts pursue -With wonder, and could love, so lively shines -In them divine resemblance, and such grace -The hand that formed them on their shape hath poured. -Ah! gentle pair, ye little think how nigh -Your change approaches, when all these delights -Will vanish, and deliver ye to woe; -More woe, the more your taste is now of joy; -Happy, but for so happy ill secured -Long to continue, and this high seat your Heaven -Ill fenced for Heaven to keep out such a foe -As now is entered; yet no purposed foe -To you, whom I could pity thus forlorn, -Though I unpitied: League with you I seek, -And mutual amity, so strait, so close, -That I with you must dwell, or you with me -Henceforth; my dwelling haply may not please, -Like this fair Paradise, your sense; yet such -Accept your Maker's work; he gave it me, -Which I as freely give: Hell shall unfold, -To entertain you two, her widest gates, -And send forth all her kings; there will be room, -Not like these narrow limits, to receive -Your numerous offspring; if no better place, -Thank him who puts me loth to this revenge -On you who wrong me not for him who wronged. -And should I at your harmless innocence -Melt, as I do, yet publick reason just, -Honour and empire with revenge enlarged, -By conquering this new world, compels me now -To do what else, though damned, I should abhor. -So spake the Fiend, and with necessity, -The tyrant's plea, excused his devilish deeds. -Then from his lofty stand on that high tree -Down he alights among the sportful herd -Of those four-footed kinds, himself now one, -Now other, as their shape served best his end -Nearer to view his prey, and, unespied, -To mark what of their state he more might learn, -By word or action marked. About them round -A lion now he stalks with fiery glare; -Then as a tiger, who by chance hath spied -In some purlieu two gentle fawns at play, -Straight couches close, then, rising, changes oft -His couchant watch, as one who chose his ground, -Whence rushing, he might surest seize them both, -Griped in each paw: when, Adam first of men -To first of women Eve thus moving speech, -Turned him, all ear to hear new utterance flow. -Sole partner, and sole part, of all these joys, -Dearer thyself than all; needs must the Power -That made us, and for us this ample world, -Be infinitely good, and of his good -As liberal and free as infinite; -That raised us from the dust, and placed us here -In all this happiness, who at his hand -Have nothing merited, nor can perform -Aught whereof he hath need; he who requires -From us no other service than to keep -This one, this easy charge, of all the trees -In Paradise that bear delicious fruit -So various, not to taste that only tree -Of knowledge, planted by the tree of life; -So near grows death to life, whate'er death is, -Some dreadful thing no doubt; for well thou knowest -God hath pronounced it death to taste that tree, -The only sign of our obedience left, -Among so many signs of power and rule -Conferred upon us, and dominion given -Over all other creatures that possess -Earth, air, and sea. Then let us not think hard -One easy prohibition, who enjoy -Free leave so large to all things else, and choice -Unlimited of manifold delights: -But let us ever praise him, and extol -His bounty, following our delightful task, -To prune these growing plants, and tend these flowers, -Which were it toilsome, yet with thee were sweet. -To whom thus Eve replied. O thou for whom -And from whom I was formed, flesh of thy flesh, -And without whom am to no end, my guide -And head! what thou hast said is just and right. -For we to him indeed all praises owe, -And daily thanks; I chiefly, who enjoy -So far the happier lot, enjoying thee -Pre-eminent by so much odds, while thou -Like consort to thyself canst no where find. -That day I oft remember, when from sleep -I first awaked, and found myself reposed -Under a shade on flowers, much wondering where -And what I was, whence thither brought, and how. -Not distant far from thence a murmuring sound -Of waters issued from a cave, and spread -Into a liquid plain, then stood unmoved -Pure as the expanse of Heaven; I thither went -With unexperienced thought, and laid me down -On the green bank, to look into the clear -Smooth lake, that to me seemed another sky. -As I bent down to look, just opposite -A shape within the watery gleam appeared, -Bending to look on me: I started back, -It started back; but pleased I soon returned, -Pleased it returned as soon with answering looks -Of sympathy and love: There I had fixed -Mine eyes till now, and pined with vain desire, -Had not a voice thus warned me; 'What thou seest, -'What there thou seest, fair Creature, is thyself; -'With thee it came and goes: but follow me, -'And I will bring thee where no shadow stays -'Thy coming, and thy soft embraces, he -'Whose image thou art; him thou shalt enjoy -'Inseparably thine, to him shalt bear -'Multitudes like thyself, and thence be called -'Mother of human race.' What could I do, -But follow straight, invisibly thus led? -Till I espied thee, fair indeed and tall, -Under a platane; yet methought less fair, -Less winning soft, less amiably mild, -Than that smooth watery image: Back I turned; -Thou following cryedst aloud, 'Return, fair Eve; -'Whom flyest thou? whom thou flyest, of him thou art, -'His flesh, his bone; to give thee being I lent -'Out of my side to thee, nearest my heart, -'Substantial life, to have thee by my side -'Henceforth an individual solace dear; -'Part of my soul I seek thee, and thee claim -'My other half:' With that thy gentle hand -Seised mine: I yielded;and from that time see -How beauty is excelled by manly grace, -And wisdom, which alone is truly fair. -So spake our general mother, and with eyes -Of conjugal attraction unreproved, -And meek surrender, half-embracing leaned -On our first father; half her swelling breast -Naked met his, under the flowing gold -Of her loose tresses hid: he in delight -Both of her beauty, and submissive charms, -Smiled with superiour love, as Jupiter -On Juno smiles, when he impregns the clouds -That shed Mayflowers; and pressed her matron lip -With kisses pure: Aside the Devil turned -For envy; yet with jealous leer malign -Eyed them askance, and to himself thus plained. -Sight hateful, sight tormenting! thus these two, -Imparadised in one another's arms, -The happier Eden, shall enjoy their fill -Of bliss on bliss; while I to Hell am thrust, -Where neither joy nor love, but fierce desire, -Among our other torments not the least, -Still unfulfilled with pain of longing pines. -Yet let me not forget what I have gained -From their own mouths: All is not theirs, it seems; -One fatal tree there stands, of knowledge called, -Forbidden them to taste: Knowledge forbidden -Suspicious, reasonless. Why should their Lord -Envy them that? Can it be sin to know? -Can it be death? And do they only stand -By ignorance? Is that their happy state, -The proof of their obedience and their faith? -O fair foundation laid whereon to build -Their ruin! hence I will excite their minds -With more desire to know, and to reject -Envious commands, invented with design -To keep them low, whom knowledge might exalt -Equal with Gods: aspiring to be such, -They taste and die: What likelier can ensue -But first with narrow search I must walk round -This garden, and no corner leave unspied; -A chance but chance may lead where I may meet -Some wandering Spirit of Heaven by fountain side, -Or in thick shade retired, from him to draw -What further would be learned. Live while ye may, -Yet happy pair; enjoy, till I return, -Short pleasures, for long woes are to succeed! -So saying, his proud step he scornful turned, -But with sly circumspection, and began -Through wood, through waste, o'er hill, o'er dale, his roam -Mean while in utmost longitude, where Heaven -With earth and ocean meets, the setting sun -Slowly descended, and with right aspect -Against the eastern gate of Paradise -Levelled his evening rays: It was a rock -Of alabaster, piled up to the clouds, -Conspicuous far, winding with one ascent -Accessible from earth, one entrance high; -The rest was craggy cliff, that overhung -Still as it rose, impossible to climb. -Betwixt these rocky pillars Gabriel sat, -Chief of the angelick guards, awaiting night; -About him exercised heroick games -The unarmed youth of Heaven, but nigh at hand -Celestial armoury, shields, helms, and spears, -Hung high with diamond flaming, and with gold. -Thither came Uriel, gliding through the even -On a sun-beam, swift as a shooting star -In autumn thwarts the night, when vapours fired -Impress the air, and shows the mariner -From what point of his compass to beware -Impetuous winds: He thus began in haste. -Gabriel, to thee thy course by lot hath given -Charge and strict watch, that to this happy place -No evil thing approach or enter in. -This day at highth of noon came to my sphere -A Spirit, zealous, as he seemed, to know -More of the Almighty's works, and chiefly Man, -God's latest image: I described his way -Bent all on speed, and marked his aery gait; -But in the mount that lies from Eden north, -Where he first lighted, soon discerned his looks -Alien from Heaven, with passions foul obscured: -Mine eye pursued him still, but under shade -Lost sight of him: One of the banished crew, -I fear, hath ventured from the deep, to raise -New troubles; him thy care must be to find. -To whom the winged warriour thus returned. -Uriel, no wonder if thy perfect sight, -Amid the sun's bright circle where thou sitst, -See far and wide: In at this gate none pass -The vigilance here placed, but such as come -Well known from Heaven; and since meridian hour -No creature thence: If Spirit of other sort, -So minded, have o'er-leaped these earthly bounds -On purpose, hard thou knowest it to exclude -Spiritual substance with corporeal bar. -But if within the circuit of these walks, -In whatsoever shape he lurk, of whom -Thou tellest, by morrow dawning I shall know. -So promised he; and Uriel to his charge -Returned on that bright beam, whose point now raised -Bore him slope downward to the sun now fallen -Beneath the Azores; whether the prime orb, -Incredible how swift, had thither rolled -Diurnal, or this less volubil earth, -By shorter flight to the east, had left him there -Arraying with reflected purple and gold -The clouds that on his western throne attend. -Now came still Evening on, and Twilight gray -Had in her sober livery all things clad; -Silence accompanied; for beast and bird, -They to their grassy couch, these to their nests -Were slunk, all but the wakeful nightingale; -She all night long her amorous descant sung; -Silence was pleased: Now glowed the firmament -With living sapphires: Hesperus, that led -The starry host, rode brightest, till the moon, -Rising in clouded majesty, at length -Apparent queen unveiled her peerless light, -And o'er the dark her silver mantle threw. -When Adam thus to Eve. Fair Consort, the hour -Of night, and all things now retired to rest, -Mind us of like repose; since God hath set -Labour and rest, as day and night, to men -Successive; and the timely dew of sleep, -Now falling with soft slumbrous weight, inclines -Our eye-lids: Other creatures all day long -Rove idle, unemployed, and less need rest; -Man hath his daily work of body or mind -Appointed, which declares his dignity, -And the regard of Heaven on all his ways; -While other animals unactive range, -And of their doings God takes no account. -To-morrow, ere fresh morning streak the east -With first approach of light, we must be risen, -And at our pleasant labour, to reform -Yon flowery arbours, yonder alleys green, -Our walk at noon, with branches overgrown, -That mock our scant manuring, and require -More hands than ours to lop their wanton growth: -Those blossoms also, and those dropping gums, -That lie bestrown, unsightly and unsmooth, -Ask riddance, if we mean to tread with ease; -Mean while, as Nature wills, night bids us rest. -To whom thus Eve, with perfect beauty adorned -My Author and Disposer, what thou bidst -Unargued I obey: So God ordains; -God is thy law, thou mine: To know no more -Is woman's happiest knowledge, and her praise. -With thee conversing I forget all time; -All seasons, and their change, all please alike. -Sweet is the breath of Morn, her rising sweet, -With charm of earliest birds: pleasant the sun, -When first on this delightful land he spreads -His orient beams, on herb, tree, fruit, and flower, -Glistering with dew; fragrant the fertile earth -After soft showers; and sweet the coming on -Of grateful Evening mild; then silent Night, -With this her solemn bird, and this fair moon, -And these the gems of Heaven, her starry train: -But neither breath of Morn, when she ascends -With charm of earliest birds; nor rising sun -On this delightful land; nor herb, fruit, flower, -Glistering with dew; nor fragrance after showers; -Nor grateful Evening mild; nor silent Night, -With this her solemn bird, nor walk by moon, -Or glittering star-light, without thee is sweet. -But wherefore all night long shine these? for whom -This glorious sight, when sleep hath shut all eyes? -To whom our general ancestor replied. -Daughter of God and Man, accomplished Eve, -These have their course to finish round the earth, -By morrow evening, and from land to land -In order, though to nations yet unborn, -Ministring light prepared, they set and rise; -Lest total Darkness should by night regain -Her old possession, and extinguish life -In Nature and all things; which these soft fires -Not only enlighten, but with kindly heat -Of various influence foment and warm, -Temper or nourish, or in part shed down -Their stellar virtue on all kinds that grow -On earth, made hereby apter to receive -Perfection from the sun's more potent ray. -These then, though unbeheld in deep of night, -Shine not in vain; nor think, though men were none, -That Heaven would want spectators, God want praise: -Millions of spiritual creatures walk the earth -Unseen, both when we wake, and when we sleep: -All these with ceaseless praise his works behold -Both day and night: How often from the steep -Of echoing hill or thicket have we heard -Celestial voices to the midnight air, -Sole, or responsive each to others note, -Singing their great Creator? oft in bands -While they keep watch, or nightly rounding walk, -With heavenly touch of instrumental sounds -In full harmonick number joined, their songs -Divide the night, and lift our thoughts to Heaven. -Thus talking, hand in hand alone they passed -On to their blissful bower: it was a place -Chosen by the sovran Planter, when he framed -All things to Man's delightful use; the roof -Of thickest covert was inwoven shade -Laurel and myrtle, and what higher grew -Of firm and fragrant leaf; on either side -Acanthus, and each odorous bushy shrub, -Fenced up the verdant wall; each beauteous flower, -Iris all hues, roses, and jessamin, -Reared high their flourished heads between, and wrought -Mosaick; underfoot the violet, -Crocus, and hyacinth, with rich inlay -Broidered the ground, more coloured than with stone -Of costliest emblem: Other creature here, -Bird, beast, insect, or worm, durst enter none, -Such was their awe of Man. In shadier bower -More sacred and sequestered, though but feigned, -Pan or Sylvanus never slept, nor Nymph -Nor Faunus haunted. Here, in close recess, -With flowers, garlands, and sweet-smelling herbs, -Espoused Eve decked first her nuptial bed; -And heavenly quires the hymenaean sung, -What day the genial Angel to our sire -Brought her in naked beauty more adorned, -More lovely, than Pandora, whom the Gods -Endowed with all their gifts, and O! too like -In sad event, when to the unwiser son -Of Japhet brought by Hermes, she ensnared -Mankind with her fair looks, to be avenged -On him who had stole Jove's authentick fire. -Thus, at their shady lodge arrived, both stood, -Both turned, and under open sky adored -The God that made both sky, air, earth, and heaven, -Which they beheld, the moon's resplendent globe, -And starry pole: Thou also madest the night, -Maker Omnipotent, and thou the day, -Which we, in our appointed work employed, -Have finished, happy in our mutual help -And mutual love, the crown of all our bliss -Ordained by thee; and this delicious place -For us too large, where thy abundance wants -Partakers, and uncropt falls to the ground. -But thou hast promised from us two a race -To fill the earth, who shall with us extol -Thy goodness infinite, both when we wake, -And when we seek, as now, thy gift of sleep. -This said unanimous, and other rites -Observing none, but adoration pure -Which God likes best, into their inmost bower -Handed they went; and, eased the putting off -These troublesome disguises which we wear, -Straight side by side were laid; nor turned, I ween, -Adam from his fair spouse, nor Eve the rites -Mysterious of connubial love refused: -Whatever hypocrites austerely talk -Of purity, and place, and innocence, -Defaming as impure what God declares -Pure, and commands to some, leaves free to all. -Our Maker bids encrease; who bids abstain -But our Destroyer, foe to God and Man? -Hail, wedded Love, mysterious law, true source -Of human offspring, sole propriety -In Paradise of all things common else! -By thee adulterous Lust was driven from men -Among the bestial herds to range; by thee -Founded in reason, loyal, just, and pure, -Relations dear, and all the charities -Of father, son, and brother, first were known. -Far be it, that I should write thee sin or blame, -Or think thee unbefitting holiest place, -Perpetual fountain of domestick sweets, -Whose bed is undefiled and chaste pronounced, -Present, or past, as saints and patriarchs used. -Here Love his golden shafts employs, here lights -His constant lamp, and waves his purple wings, -Reigns here and revels; not in the bought smile -Of harlots, loveless, joyless, unendeared, -Casual fruition; nor in court-amours, -Mixed dance, or wanton mask, or midnight ball, -Or serenate, which the starved lover sings -To his proud fair, best quitted with disdain. -These, lulled by nightingales, embracing slept, -And on their naked limbs the flowery roof -Showered roses, which the morn repaired. Sleep on, -Blest pair; and O!yet happiest, if ye seek -No happier state, and know to know no more. -Now had night measured with her shadowy cone -Half way up hill this vast sublunar vault, -And from their ivory port the Cherubim, -Forth issuing at the accustomed hour, stood armed -To their night watches in warlike parade; -When Gabriel to his next in power thus spake. -Uzziel, half these draw off, and coast the south -With strictest watch; these other wheel the north; -Our circuit meets full west. As flame they part, -Half wheeling to the shield, half to the spear. -From these, two strong and subtle Spirits he called -That near him stood, and gave them thus in charge. -Ithuriel and Zephon, with winged speed -Search through this garden, leave unsearched no nook; -But chiefly where those two fair creatures lodge, -Now laid perhaps asleep, secure of harm. -This evening from the sun's decline arrived, -Who tells of some infernal Spirit seen -Hitherward bent (who could have thought?) escaped -The bars of Hell, on errand bad no doubt: -Such, where ye find, seise fast, and hither bring. -So saying, on he led his radiant files, -Dazzling the moon; these to the bower direct -In search of whom they sought: Him there they found -Squat like a toad, close at the ear of Eve, -Assaying by his devilish art to reach -The organs of her fancy, and with them forge -Illusions, as he list, phantasms and dreams; -Or if, inspiring venom, he might taint -The animal spirits, that from pure blood arise -Like gentle breaths from rivers pure, thence raise -At least distempered, discontented thoughts, -Vain hopes, vain aims, inordinate desires, -Blown up with high conceits ingendering pride. -Him thus intent Ithuriel with his spear -Touched lightly; for no falshood can endure -Touch of celestial temper, but returns -Of force to its own likeness: Up he starts -Discovered and surprised. As when a spark -Lights on a heap of nitrous powder, laid -Fit for the tun some magazine to store -Against a rumoured war, the smutty grain, -With sudden blaze diffused, inflames the air; -So started up in his own shape the Fiend. -Back stept those two fair Angels, half amazed -So sudden to behold the grisly king; -Yet thus, unmoved with fear, accost him soon. -Which of those rebel Spirits adjudged to Hell -Comest thou, escaped thy prison? and, transformed, -Why sat'st thou like an enemy in wait, -Here watching at the head of these that sleep? -Know ye not then said Satan, filled with scorn, -Know ye not me? ye knew me once no mate -For you, there sitting where ye durst not soar: -Not to know me argues yourselves unknown, -The lowest of your throng; or, if ye know, -Why ask ye, and superfluous begin -Your message, like to end as much in vain? -To whom thus Zephon, answering scorn with scorn. -Think not, revolted Spirit, thy shape the same, -Or undiminished brightness to be known, -As when thou stoodest in Heaven upright and pure; -That glory then, when thou no more wast good, -Departed from thee; and thou resemblest now -Thy sin and place of doom obscure and foul. -But come, for thou, be sure, shalt give account -To him who sent us, whose charge is to keep -This place inviolable, and these from harm. -So spake the Cherub; and his grave rebuke, -Severe in youthful beauty, added grace -Invincible: Abashed the Devil stood, -And felt how awful goodness is, and saw -Virtue in her shape how lovely; saw, and pined -His loss; but chiefly to find here observed -His lustre visibly impaired; yet seemed -Undaunted. If I must contend, said he, -Best with the best, the sender, not the sent, -Or all at once; more glory will be won, -Or less be lost. Thy fear, said Zephon bold, -Will save us trial what the least can do -Single against thee wicked, and thence weak. -The Fiend replied not, overcome with rage; -But, like a proud steed reined, went haughty on, -Champing his iron curb: To strive or fly -He held it vain; awe from above had quelled -His heart, not else dismayed. Now drew they nigh -The western point, where those half-rounding guards -Just met, and closing stood in squadron joined, -A waiting next command. To whom their Chief, -Gabriel, from the front thus called aloud. -O friends! I hear the tread of nimble feet -Hasting this way, and now by glimpse discern -Ithuriel and Zephon through the shade; -And with them comes a third of regal port, -But faded splendour wan; who by his gait -And fierce demeanour seems the Prince of Hell, -Not likely to part hence without contest; -Stand firm, for in his look defiance lours. -He scarce had ended, when those two approached, -And brief related whom they brought, where found, -How busied, in what form and posture couched. -To whom with stern regard thus Gabriel spake. -Why hast thou, Satan, broke the bounds prescribed -To thy transgressions, and disturbed the charge -Of others, who approve not to transgress -By thy example, but have power and right -To question thy bold entrance on this place; -Employed, it seems, to violate sleep, and those -Whose dwelling God hath planted here in bliss! -To whom thus Satan with contemptuous brow. -Gabriel? thou hadst in Heaven the esteem of wise, -And such I held thee; but this question asked -Puts me in doubt. Lives there who loves his pain! -Who would not, finding way, break loose from Hell, -Though thither doomed! Thou wouldst thyself, no doubt -And boldly venture to whatever place -Farthest from pain, where thou mightst hope to change -Torment with ease, and soonest recompense -Dole with delight, which in this place I sought; -To thee no reason, who knowest only good, -But evil hast not tried: and wilt object -His will who bounds us! Let him surer bar -His iron gates, if he intends our stay -In that dark durance: Thus much what was asked. -The rest is true, they found me where they say; -But that implies not violence or harm. -Thus he in scorn. The warlike Angel moved, -Disdainfully half smiling, thus replied. -O loss of one in Heaven to judge of wise -Since Satan fell, whom folly overthrew, -And now returns him from his prison 'scaped, -Gravely in doubt whether to hold them wise -Or not, who ask what boldness brought him hither -Unlicensed from his bounds in Hell prescribed; -So wise he judges it to fly from pain -However, and to 'scape his punishment! -So judge thou still, presumptuous! till the wrath, -Which thou incurrest by flying, meet thy flight -Sevenfold, and scourge that wisdom back to Hell, -Which taught thee yet no better, that no pain -Can equal anger infinite provoked. -But wherefore thou alone? wherefore with thee -Came not all hell broke loose? or thou than they -Less hardy to endure? Courageous Chief! -The first in flight from pain! hadst thou alleged -To thy deserted host this cause of flight, -Thou surely hadst not come sole fugitive. -To which the Fiend thus answered, frowning stern. -Not that I less endure, or shrink from pain, -Insulting Angel! well thou knowest I stood -Thy fiercest, when in battle to thy aid -The blasting vollied thunder made all speed, -And seconded thy else not dreaded spear. -But still thy words at random, as before, -Argue thy inexperience what behoves -From hard assays and ill successes past -A faithful leader, not to hazard all -Through ways of danger by himself untried: -I, therefore, I alone first undertook -To wing the desolate abyss, and spy -This new created world, whereof in Hell -Fame is not silent, here in hope to find -Better abode, and my afflicted Powers -To settle here on earth, or in mid air; -Though for possession put to try once more -What thou and thy gay legions dare against; -Whose easier business were to serve their Lord -High up in Heaven, with songs to hymn his throne, -And practised distances to cringe, not fight, -To whom the warriour Angel soon replied. -To say and straight unsay, pretending first -Wise to fly pain, professing next the spy, -Argues no leader but a liear traced, -Satan, and couldst thou faithful add? O name, -O sacred name of faithfulness profaned! -Faithful to whom? to thy rebellious crew? -Army of Fiends, fit body to fit head. -Was this your discipline and faith engaged, -Your military obedience, to dissolve -Allegiance to the acknowledged Power supreme? -And thou, sly hypocrite, who now wouldst seem -Patron of liberty, who more than thou -Once fawned, and cringed, and servily adored -Heaven's awful Monarch? wherefore, but in hope -To dispossess him, and thyself to reign? -But mark what I arreed thee now, Avant; -Fly neither whence thou fledst! If from this hour -Within these hallowed limits thou appear, -Back to the infernal pit I drag thee chained, -And seal thee so, as henceforth not to scorn -The facile gates of Hell too slightly barred. -So threatened he; but Satan to no threats -Gave heed, but waxing more in rage replied. -Then when I am thy captive talk of chains, -Proud limitary Cherub! but ere then -Far heavier load thyself expect to feel -From my prevailing arm, though Heaven's King -Ride on thy wings, and thou with thy compeers, -Us'd to the yoke, drawest his triumphant wheels -In progress through the road of Heaven star-paved. -While thus he spake, the angelick squadron bright -Turned fiery red, sharpening in mooned horns -Their phalanx, and began to hem him round -With ported spears, as thick as when a field -Of Ceres ripe for harvest waving bends -Her bearded grove of ears, which way the wind -Sways them; the careful plowman doubting stands, -Left on the threshing floor his hopeless sheaves -Prove chaff. On the other side, Satan, alarmed, -Collecting all his might, dilated stood, -Like Teneriff or Atlas, unremoved: -His stature reached the sky, and on his crest -Sat Horrour plumed; nor wanted in his grasp -What seemed both spear and shield: Now dreadful deeds -Might have ensued, nor only Paradise -In this commotion, but the starry cope -Of Heaven perhaps, or all the elements -At least had gone to wrack, disturbed and torn -With violence of this conflict, had not soon -The Eternal, to prevent such horrid fray, -Hung forth in Heaven his golden scales, yet seen -Betwixt Astrea and the Scorpion sign, -Wherein all things created first he weighed, -The pendulous round earth with balanced air -In counterpoise, now ponders all events, -Battles and realms: In these he put two weights, -The sequel each of parting and of fight: -The latter quick up flew, and kicked the beam, -Which Gabriel spying, thus bespake the Fiend. -Satan, I know thy strength, and thou knowest mine; -Neither our own, but given: What folly then -To boast what arms can do? since thine no more -Than Heaven permits, nor mine, though doubled now -To trample thee as mire: For proof look up, -And read thy lot in yon celestial sign; -Where thou art weighed, and shown how light, how weak, -If thou resist. The Fiend looked up, and knew -His mounted scale aloft: Nor more;but fled -Murmuring, and with him fled the shades of night. - - - -Book V - - -Now Morn, her rosy steps in the eastern clime -Advancing, sowed the earth with orient pearl, -When Adam waked, so customed; for his sleep -Was aery-light, from pure digestion bred, -And temperate vapours bland, which the only sound -Of leaves and fuming rills, Aurora's fan, -Lightly dispersed, and the shrill matin song -Of birds on every bough; so much the more -His wonder was to find unwakened Eve -With tresses discomposed, and glowing cheek, -As through unquiet rest: He, on his side -Leaning half raised, with looks of cordial love -Hung over her enamoured, and beheld -Beauty, which, whether waking or asleep, -Shot forth peculiar graces; then with voice -Mild, as when Zephyrus on Flora breathes, -Her hand soft touching, whispered thus. Awake, -My fairest, my espoused, my latest found, -Heaven's last best gift, my ever new delight! -Awake: The morning shines, and the fresh field -Calls us; we lose the prime, to mark how spring -Our tender plants, how blows the citron grove, -What drops the myrrh, and what the balmy reed, -How nature paints her colours, how the bee -Sits on the bloom extracting liquid sweet. -Such whispering waked her, but with startled eye -On Adam, whom embracing, thus she spake. -O sole in whom my thoughts find all repose, -My glory, my perfection! glad I see -Thy face, and morn returned; for I this night -(Such night till this I never passed) have dreamed, -If dreamed, not, as I oft am wont, of thee, -Works of day past, or morrow's next design, -But of offence and trouble, which my mind -Knew never till this irksome night: Methought, -Close at mine ear one called me forth to walk -With gentle voice; I thought it thine: It said, -'Why sleepest thou, Eve? now is the pleasant time, -'The cool, the silent, save where silence yields -'To the night-warbling bird, that now awake -'Tunes sweetest his love-laboured song; now reigns -'Full-orbed the moon, and with more pleasing light -'Shadowy sets off the face of things; in vain, -'If none regard; Heaven wakes with all his eyes, -'Whom to behold but thee, Nature's desire? -'In whose sight all things joy, with ravishment -'Attracted by thy beauty still to gaze.' -I rose as at thy call, but found thee not; -To find thee I directed then my walk; -And on, methought, alone I passed through ways -That brought me on a sudden to the tree -Of interdicted knowledge: fair it seemed, -Much fairer to my fancy than by day: -And, as I wondering looked, beside it stood -One shaped and winged like one of those from Heaven -By us oft seen; his dewy locks distilled -Ambrosia; on that tree he also gazed; -And 'O fair plant,' said he, 'with fruit surcharged, -'Deigns none to ease thy load, and taste thy sweet, -'Nor God, nor Man? Is knowledge so despised? -'Or envy, or what reserve forbids to taste? -'Forbid who will, none shall from me withhold -'Longer thy offered good; why else set here? -This said, he paused not, but with venturous arm -He plucked, he tasted; me damp horrour chilled -At such bold words vouched with a deed so bold: -But he thus, overjoyed; 'O fruit divine, -'Sweet of thyself, but much more sweet thus cropt, -'Forbidden here, it seems, as only fit -'For Gods, yet able to make Gods of Men: -'And why not Gods of Men; since good, the more -'Communicated, more abundant grows, -'The author not impaired, but honoured more? -'Here, happy creature, fair angelick Eve! -'Partake thou also; happy though thou art, -'Happier thou mayest be, worthier canst not be: -'Taste this, and be henceforth among the Gods -'Thyself a Goddess, not to earth confined, -'But sometimes in the air, as we, sometimes -'Ascend to Heaven, by merit thine, and see -'What life the Gods live there, and such live thou!' -So saying, he drew nigh, and to me held, -Even to my mouth of that same fruit held part -Which he had plucked; the pleasant savoury smell -So quickened appetite, that I, methought, -Could not but taste. Forthwith up to the clouds -With him I flew, and underneath beheld -The earth outstretched immense, a prospect wide -And various: Wondering at my flight and change -To this high exaltation; suddenly -My guide was gone, and I, methought, sunk down, -And fell asleep; but O, how glad I waked -To find this but a dream! Thus Eve her night -Related, and thus Adam answered sad. -Best image of myself, and dearer half, -The trouble of thy thoughts this night in sleep -Affects me equally; nor can I like -This uncouth dream, of evil sprung, I fear; -Yet evil whence? in thee can harbour none, -Created pure. But know that in the soul -Are many lesser faculties, that serve -Reason as chief; among these Fancy next -Her office holds; of all external things -Which the five watchful senses represent, -She forms imaginations, aery shapes, -Which Reason, joining or disjoining, frames -All what we affirm or what deny, and call -Our knowledge or opinion; then retires -Into her private cell, when nature rests. -Oft in her absence mimick Fancy wakes -To imitate her; but, misjoining shapes, -Wild work produces oft, and most in dreams; -Ill matching words and deeds long past or late. -Some such resemblances, methinks, I find -Of our last evening's talk, in this thy dream, -But with addition strange; yet be not sad. -Evil into the mind of God or Man -May come and go, so unreproved, and leave -No spot or blame behind: Which gives me hope -That what in sleep thou didst abhor to dream, -Waking thou never will consent to do. -Be not disheartened then, nor cloud those looks, -That wont to be more cheerful and serene, -Than when fair morning first smiles on the world; -And let us to our fresh employments rise -Among the groves, the fountains, and the flowers -That open now their choisest bosomed smells, -Reserved from night, and kept for thee in store. -So cheered he his fair spouse, and she was cheered; -But silently a gentle tear let fall -From either eye, and wiped them with her hair; -Two other precious drops that ready stood, -Each in their crystal sluice, he ere they fell -Kissed, as the gracious signs of sweet remorse -And pious awe, that feared to have offended. -So all was cleared, and to the field they haste. -But first, from under shady arborous roof -Soon as they forth were come to open sight -Of day-spring, and the sun, who, scarce up-risen, -With wheels yet hovering o'er the ocean-brim, -Shot parallel to the earth his dewy ray, -Discovering in wide landskip all the east -Of Paradise and Eden's happy plains, -Lowly they bowed adoring, and began -Their orisons, each morning duly paid -In various style; for neither various style -Nor holy rapture wanted they to praise -Their Maker, in fit strains pronounced, or sung -Unmeditated; such prompt eloquence -Flowed from their lips, in prose or numerous verse, -More tuneable than needed lute or harp -To add more sweetness; and they thus began. -These are thy glorious works, Parent of good, -Almighty! Thine this universal frame, -Thus wonderous fair; Thyself how wonderous then! -Unspeakable, who sitst above these heavens -To us invisible, or dimly seen -In these thy lowest works; yet these declare -Thy goodness beyond thought, and power divine. -Speak, ye who best can tell, ye sons of light, -Angels; for ye behold him, and with songs -And choral symphonies, day without night, -Circle his throne rejoicing; ye in Heaven -On Earth join all ye Creatures to extol -Him first, him last, him midst, and without end. -Fairest of stars, last in the train of night, -If better thou belong not to the dawn, -Sure pledge of day, that crownest the smiling morn -With thy bright circlet, praise him in thy sphere, -While day arises, that sweet hour of prime. -Thou Sun, of this great world both eye and soul, -Acknowledge him thy greater; sound his praise -In thy eternal course, both when thou climbest, -And when high noon hast gained, and when thou fallest. -Moon, that now meetest the orient sun, now flyest, -With the fixed Stars, fixed in their orb that flies; -And ye five other wandering Fires, that move -In mystick dance not without song, resound -His praise, who out of darkness called up light. -Air, and ye Elements, the eldest birth -Of Nature's womb, that in quaternion run -Perpetual circle, multiform; and mix -And nourish all things; let your ceaseless change -Vary to our great Maker still new praise. -Ye Mists and Exhalations, that now rise -From hill or steaming lake, dusky or gray, -Till the sun paint your fleecy skirts with gold, -In honour to the world's great Author rise; -Whether to deck with clouds the uncoloured sky, -Or wet the thirsty earth with falling showers, -Rising or falling still advance his praise. -His praise, ye Winds, that from four quarters blow, -Breathe soft or loud; and, wave your tops, ye Pines, -With every plant, in sign of worship wave. -Fountains, and ye that warble, as ye flow, -Melodious murmurs, warbling tune his praise. -Join voices, all ye living Souls: Ye Birds, -That singing up to Heaven-gate ascend, -Bear on your wings and in your notes his praise. -Ye that in waters glide, and ye that walk -The earth, and stately tread, or lowly creep; -Witness if I be silent, morn or even, -To hill, or valley, fountain, or fresh shade, -Made vocal by my song, and taught his praise. -Hail, universal Lord, be bounteous still -To give us only good; and if the night -Have gathered aught of evil, or concealed, -Disperse it, as now light dispels the dark! -So prayed they innocent, and to their thoughts -Firm peace recovered soon, and wonted calm. -On to their morning's rural work they haste, -Among sweet dews and flowers; where any row -Of fruit-trees over-woody reached too far -Their pampered boughs, and needed hands to check -Fruitless embraces: or they led the vine -To wed her elm; she, spoused, about him twines -Her marriageable arms, and with him brings -Her dower, the adopted clusters, to adorn -His barren leaves. Them thus employed beheld -With pity Heaven's high King, and to him called -Raphael, the sociable Spirit, that deigned -To travel with Tobias, and secured -His marriage with the seventimes-wedded maid. -Raphael, said he, thou hearest what stir on Earth -Satan, from Hell 'scaped through the darksome gulf, -Hath raised in Paradise; and how disturbed -This night the human pair; how he designs -In them at once to ruin all mankind. -Go therefore, half this day as friend with friend -Converse with Adam, in what bower or shade -Thou findest him from the heat of noon retired, -To respite his day-labour with repast, -Or with repose; and such discourse bring on, -As may advise him of his happy state, -Happiness in his power left free to will, -Left to his own free will, his will though free, -Yet mutable; whence warn him to beware -He swerve not, too secure: Tell him withal -His danger, and from whom; what enemy, -Late fallen himself from Heaven, is plotting now -The fall of others from like state of bliss; -By violence? no, for that shall be withstood; -But by deceit and lies: This let him know, -Lest, wilfully transgressing, he pretend -Surprisal, unadmonished, unforewarned. -So spake the Eternal Father, and fulfilled -All justice: Nor delayed the winged Saint -After his charge received; but from among -Thousand celestial Ardours, where he stood -Veiled with his gorgeous wings, up springing light, -Flew through the midst of Heaven; the angelick quires, -On each hand parting, to his speed gave way -Through all the empyreal road; till, at the gate -Of Heaven arrived, the gate self-opened wide -On golden hinges turning, as by work -Divine the sovran Architect had framed. -From hence no cloud, or, to obstruct his sight, -Star interposed, however small he sees, -Not unconformed to other shining globes, -Earth, and the garden of God, with cedars crowned -Above all hills. As when by night the glass -Of Galileo, less assured, observes -Imagined lands and regions in the moon: -Or pilot, from amidst the Cyclades -Delos or Samos first appearing, kens -A cloudy spot. Down thither prone in flight -He speeds, and through the vast ethereal sky -Sails between worlds and worlds, with steady wing -Now on the polar winds, then with quick fan -Winnows the buxom air; till, within soar -Of towering eagles, to all the fowls he seems -A phoenix, gazed by all as that sole bird, -When, to enshrine his reliques in the Sun's -Bright temple, to Egyptian Thebes he flies. -At once on the eastern cliff of Paradise -He lights, and to his proper shape returns -A Seraph winged: Six wings he wore, to shade -His lineaments divine; the pair that clad -Each shoulder broad, came mantling o'er his breast -With regal ornament; the middle pair -Girt like a starry zone his waist, and round -Skirted his loins and thighs with downy gold -And colours dipt in Heaven; the third his feet -Shadowed from either heel with feathered mail, -Sky-tinctured grain. Like Maia's son he stood, -And shook his plumes, that heavenly fragrance filled -The circuit wide. Straight knew him all the bands -Of Angels under watch; and to his state, -And to his message high, in honour rise; -For on some message high they guessed him bound. -Their glittering tents he passed, and now is come -Into the blissful field, through groves of myrrh, -And flowering odours, cassia, nard, and balm; -A wilderness of sweets; for Nature here -Wantoned as in her prime, and played at will -Her virgin fancies pouring forth more sweet, -Wild above rule or art, enormous bliss. -Him through the spicy forest onward come -Adam discerned, as in the door he sat -Of his cool bower, while now the mounted sun -Shot down direct his fervid rays to warm -Earth's inmost womb, more warmth than Adam needs: -And Eve within, due at her hour prepared -For dinner savoury fruits, of taste to please -True appetite, and not disrelish thirst -Of nectarous draughts between, from milky stream, -Berry or grape: To whom thus Adam called. -Haste hither, Eve, and worth thy sight behold -Eastward among those trees, what glorious shape -Comes this way moving; seems another morn -Risen on mid-noon; some great behest from Heaven -To us perhaps he brings, and will vouchsafe -This day to be our guest. But go with speed, -And, what thy stores contain, bring forth, and pour -Abundance, fit to honour and receive -Our heavenly stranger: Well we may afford -Our givers their own gifts, and large bestow -From large bestowed, where Nature multiplies -Her fertile growth, and by disburthening grows -More fruitful, which instructs us not to spare. -To whom thus Eve. Adam, earth's hallowed mould, -Of God inspired! small store will serve, where store, -All seasons, ripe for use hangs on the stalk; -Save what by frugal storing firmness gains -To nourish, and superfluous moist consumes: -But I will haste, and from each bough and brake, -Each plant and juciest gourd, will pluck such choice -To entertain our Angel-guest, as he -Beholding shall confess, that here on Earth -God hath dispensed his bounties as in Heaven. -So saying, with dispatchful looks in haste -She turns, on hospitable thoughts intent -What choice to choose for delicacy best, -What order, so contrived as not to mix -Tastes, not well joined, inelegant, but bring -Taste after taste upheld with kindliest change; -Bestirs her then, and from each tender stalk -Whatever Earth, all-bearing mother, yields -In India East or West, or middle shore -In Pontus or the Punick coast, or where -Alcinous reigned, fruit of all kinds, in coat -Rough, or smooth rind, or bearded husk, or shell, -She gathers, tribute large, and on the board -Heaps with unsparing hand; for drink the grape -She crushes, inoffensive must, and meaths -From many a berry, and from sweet kernels pressed -She tempers dulcet creams; nor these to hold -Wants her fit vessels pure; then strows the ground -With rose and odours from the shrub unfumed. -Mean while our primitive great sire, to meet -His God-like guest, walks forth, without more train -Accompanied than with his own complete -Perfections; in himself was all his state, -More solemn than the tedious pomp that waits -On princes, when their rich retinue long -Of horses led, and grooms besmeared with gold, -Dazzles the croud, and sets them all agape. -Nearer his presence Adam, though not awed, -Yet with submiss approach and reverence meek, -As to a superiour nature bowing low, -Thus said. Native of Heaven, for other place -None can than Heaven such glorious shape contain; -Since, by descending from the thrones above, -Those happy places thou hast deigned a while -To want, and honour these, vouchsafe with us -Two only, who yet by sovran gift possess -This spacious ground, in yonder shady bower -To rest; and what the garden choicest bears -To sit and taste, till this meridian heat -Be over, and the sun more cool decline. -Whom thus the angelick Virtue answered mild. -Adam, I therefore came; nor art thou such -Created, or such place hast here to dwell, -As may not oft invite, though Spirits of Heaven, -To visit thee; lead on then where thy bower -O'ershades; for these mid-hours, till evening rise, -I have at will. So to the sylvan lodge -They came, that like Pomona's arbour smiled, -With flowerets decked, and fragrant smells; but Eve, -Undecked save with herself, more lovely fair -Than Wood-Nymph, or the fairest Goddess feigned -Of three that in mount Ida naked strove, -Stood to entertain her guest from Heaven; no veil -She needed, virtue-proof; no thought infirm -Altered her cheek. On whom the Angel Hail -Bestowed, the holy salutation used -Long after to blest Mary, second Eve. -Hail, Mother of Mankind, whose fruitful womb -Shall fill the world more numerous with thy sons, -Than with these various fruits the trees of God -Have heaped this table!--Raised of grassy turf -Their table was, and mossy seats had round, -And on her ample square from side to side -All autumn piled, though spring and autumn here -Danced hand in hand. A while discourse they hold; -No fear lest dinner cool; when thus began -Our author. Heavenly stranger, please to taste -These bounties, which our Nourisher, from whom -All perfect good, unmeasured out, descends, -To us for food and for delight hath caused -The earth to yield; unsavoury food perhaps -To spiritual natures; only this I know, -That one celestial Father gives to all. -To whom the Angel. Therefore what he gives -(Whose praise be ever sung) to Man in part -Spiritual, may of purest Spirits be found -No ingrateful food: And food alike those pure -Intelligential substances require, -As doth your rational; and both contain -Within them every lower faculty -Of sense, whereby they hear, see, smell, touch, taste, -Tasting concoct, digest, assimilate, -And corporeal to incorporeal turn. -For know, whatever was created, needs -To be sustained and fed: Of elements -The grosser feeds the purer, earth the sea, -Earth and the sea feed air, the air those fires -Ethereal, and as lowest first the moon; -Whence in her visage round those spots, unpurged -Vapours not yet into her substance turned. -Nor doth the moon no nourishment exhale -From her moist continent to higher orbs. -The sun that light imparts to all, receives -From all his alimental recompence -In humid exhalations, and at even -Sups with the ocean. Though in Heaven the trees -Of life ambrosial fruitage bear, and vines -Yield nectar; though from off the boughs each morn -We brush mellifluous dews, and find the ground -Covered with pearly grain: Yet God hath here -Varied his bounty so with new delights, -As may compare with Heaven; and to taste -Think not I shall be nice. So down they sat, -And to their viands fell; nor seemingly -The Angel, nor in mist, the common gloss -Of Theologians; but with keen dispatch -Of real hunger, and concoctive heat -To transubstantiate: What redounds, transpires -Through Spirits with ease; nor wonder;if by fire -Of sooty coal the empirick alchemist -Can turn, or holds it possible to turn, -Metals of drossiest ore to perfect gold, -As from the mine. Mean while at table Eve -Ministered naked, and their flowing cups -With pleasant liquours crowned: O innocence -Deserving Paradise! if ever, then, -Then had the sons of God excuse to have been -Enamoured at that sight; but in those hearts -Love unlibidinous reigned, nor jealousy -Was understood, the injured lover's hell. -Thus when with meats and drinks they had sufficed, -Not burdened nature, sudden mind arose -In Adam, not to let the occasion pass -Given him by this great conference to know -Of things above his world, and of their being -Who dwell in Heaven, whose excellence he saw -Transcend his own so far; whose radiant forms, -Divine effulgence, whose high power, so far -Exceeded human; and his wary speech -Thus to the empyreal minister he framed. -Inhabitant with God, now know I well -Thy favour, in this honour done to Man; -Under whose lowly roof thou hast vouchsafed -To enter, and these earthly fruits to taste, -Food not of Angels, yet accepted so, -As that more willingly thou couldst not seem -At Heaven's high feasts to have fed: yet what compare -To whom the winged Hierarch replied. -O Adam, One Almighty is, from whom -All things proceed, and up to him return, -If not depraved from good, created all -Such to perfection, one first matter all, -Endued with various forms, various degrees -Of substance, and, in things that live, of life; -But more refined, more spiritous, and pure, -As nearer to him placed, or nearer tending -Each in their several active spheres assigned, -Till body up to spirit work, in bounds -Proportioned to each kind. So from the root -Springs lighter the green stalk, from thence the leaves -More aery, last the bright consummate flower -Spirits odorous breathes: flowers and their fruit, -Man's nourishment, by gradual scale sublimed, -To vital spirits aspire, to animal, -To intellectual; give both life and sense, -Fancy and understanding; whence the soul -Reason receives, and reason is her being, -Discursive, or intuitive; discourse -Is oftest yours, the latter most is ours, -Differing but in degree, of kind the same. -Wonder not then, what God for you saw good -If I refuse not, but convert, as you -To proper substance. Time may come, when Men -With Angels may participate, and find -No inconvenient diet, nor too light fare; -And from these corporal nutriments perhaps -Your bodies may at last turn all to spirit, -Improved by tract of time, and, winged, ascend -Ethereal, as we; or may, at choice, -Here or in heavenly Paradises dwell; -If ye be found obedient, and retain -Unalterably firm his love entire, -Whose progeny you are. Mean while enjoy -Your fill what happiness this happy state -Can comprehend, incapable of more. -To whom the patriarch of mankind replied. -O favourable Spirit, propitious guest, -Well hast thou taught the way that might direct -Our knowledge, and the scale of nature set -From center to circumference; whereon, -In contemplation of created things, -By steps we may ascend to God. But say, -What meant that caution joined, If ye be found -Obedient? Can we want obedience then -To him, or possibly his love desert, -Who formed us from the dust and placed us here -Full to the utmost measure of what bliss -Human desires can seek or apprehend? -To whom the Angel. Son of Heaven and Earth, -Attend! That thou art happy, owe to God; -That thou continuest such, owe to thyself, -That is, to thy obedience; therein stand. -This was that caution given thee; be advised. -God made thee perfect, not immutable; -And good he made thee, but to persevere -He left it in thy power; ordained thy will -By nature free, not over-ruled by fate -Inextricable, or strict necessity: -Our voluntary service he requires, -Not our necessitated; such with him -Finds no acceptance, nor can find; for how -Can hearts, not free, be tried whether they serve -Willing or no, who will but what they must -By destiny, and can no other choose? -Myself, and all the angelick host, that stand -In sight of God, enthroned, our happy state -Hold, as you yours, while our obedience holds; -On other surety none: Freely we serve, -Because we freely love, as in our will -To love or not; in this we stand or fall: -And some are fallen, to disobedience fallen, -And so from Heaven to deepest Hell; O fall -From what high state of bliss, into what woe! -To whom our great progenitor. Thy words -Attentive, and with more delighted ear, -Divine instructer, I have heard, than when -Cherubick songs by night from neighbouring hills -Aereal musick send: Nor knew I not -To be both will and deed created free; -Yet that we never shall forget to love -Our Maker, and obey him whose command -Single is yet so just, my constant thoughts -Assured me, and still assure: Though what thou tellest -Hath passed in Heaven, some doubt within me move, -But more desire to hear, if thou consent, -The full relation, which must needs be strange, -Worthy of sacred silence to be heard; -And we have yet large day, for scarce the sun -Hath finished half his journey, and scarce begins -His other half in the great zone of Heaven. -Thus Adam made request; and Raphael, -After short pause assenting, thus began. -High matter thou enjoinest me, O prime of men, -Sad task and hard: For how shall I relate -To human sense the invisible exploits -Of warring Spirits? how, without remorse, -The ruin of so many glorious once -And perfect while they stood? how last unfold -The secrets of another world, perhaps -Not lawful to reveal? yet for thy good -This is dispensed; and what surmounts the reach -Of human sense, I shall delineate so, -By likening spiritual to corporal forms, -As may express them best; though what if Earth -Be but a shadow of Heaven, and things therein -Each to other like, more than on earth is thought? -As yet this world was not, and Chaos wild -Reigned where these Heavens now roll, where Earth now rests -Upon her center poised; when on a day -(For time, though in eternity, applied -To motion, measures all things durable -By present, past, and future,) on such day -As Heaven's great year brings forth, the empyreal host -Of Angels by imperial summons called, -Innumerable before the Almighty's throne -Forthwith, from all the ends of Heaven, appeared -Under their Hierarchs in orders bright: -Ten thousand thousand ensigns high advanced, -Standards and gonfalons 'twixt van and rear -Stream in the air, and for distinction serve -Of hierarchies, of orders, and degrees; -Or in their glittering tissues bear imblazed -Holy memorials, acts of zeal and love -Recorded eminent. Thus when in orbs -Of circuit inexpressible they stood, -Orb within orb, the Father Infinite, -By whom in bliss imbosomed sat the Son, -Amidst as from a flaming mount, whose top -Brightness had made invisible, thus spake. -Hear, all ye Angels, progeny of light, -Thrones, Dominations, Princedoms, Virtues, Powers; -Hear my decree, which unrevoked shall stand. -This day I have begot whom I declare -My only Son, and on this holy hill -Him have anointed, whom ye now behold -At my right hand; your head I him appoint; -And by myself have sworn, to him shall bow -All knees in Heaven, and shall confess him Lord: -Under his great vice-gerent reign abide -United, as one individual soul, -For ever happy: Him who disobeys, -Me disobeys, breaks union, and that day, -Cast out from God and blessed vision, falls -Into utter darkness, deep ingulfed, his place -Ordained without redemption, without end. -So spake the Omnipotent, and with his words -All seemed well pleased; all seemed, but were not all. -That day, as other solemn days, they spent -In song and dance about the sacred hill; -Mystical dance, which yonder starry sphere -Of planets, and of fixed, in all her wheels -Resembles nearest, mazes intricate, -Eccentrick, intervolved, yet regular -Then most, when most irregular they seem; -And in their motions harmony divine -So smooths her charming tones, that God's own ear -Listens delighted. Evening now approached, -(For we have also our evening and our morn, -We ours for change delectable, not need;) -Forthwith from dance to sweet repast they turn -Desirous; all in circles as they stood, -Tables are set, and on a sudden piled -With Angels food, and rubied nectar flows -In pearl, in diamond, and massy gold, -Fruit of delicious vines, the growth of Heaven. -On flowers reposed, and with fresh flowerets crowned, -They eat, they drink, and in communion sweet -Quaff immortality and joy, secure -Of surfeit, where full measure only bounds -Excess, before the all-bounteous King, who showered -With copious hand, rejoicing in their joy. -Now when ambrosial night with clouds exhaled -From that high mount of God, whence light and shade -Spring both, the face of brightest Heaven had changed -To grateful twilight, (for night comes not there -In darker veil,) and roseat dews disposed -All but the unsleeping eyes of God to rest; -Wide over all the plain, and wider far -Than all this globous earth in plain outspread, -(Such are the courts of God) the angelick throng, -Dispersed in bands and files, their camp extend -By living streams among the trees of life, -Pavilions numberless, and sudden reared, -Celestial tabernacles, where they slept -Fanned with cool winds; save those, who, in their course, -Melodious hymns about the sovran throne -Alternate all night long: but not so waked -Satan; so call him now, his former name -Is heard no more in Heaven; he of the first, -If not the first Arch-Angel, great in power, -In favour and pre-eminence, yet fraught -With envy against the Son of God, that day -Honoured by his great Father, and proclaimed -Messiah King anointed, could not bear -Through pride that sight, and thought himself impaired. -Deep malice thence conceiving and disdain, -Soon as midnight brought on the dusky hour -Friendliest to sleep and silence, he resolved -With all his legions to dislodge, and leave -Unworshipt, unobeyed, the throne supreme, -Contemptuous; and his next subordinate -Awakening, thus to him in secret spake. -Sleepest thou, Companion dear? What sleep can close -Thy eye-lids? and rememberest what decree -Of yesterday, so late hath passed the lips -Of Heaven's Almighty. Thou to me thy thoughts -Wast wont, I mine to thee was wont to impart; -Both waking we were one; how then can now -Thy sleep dissent? New laws thou seest imposed; -New laws from him who reigns, new minds may raise -In us who serve, new counsels to debate -What doubtful may ensue: More in this place -To utter is not safe. Assemble thou -Of all those myriads which we lead the chief; -Tell them, that by command, ere yet dim night -Her shadowy cloud withdraws, I am to haste, -And all who under me their banners wave, -Homeward, with flying march, where we possess -The quarters of the north; there to prepare -Fit entertainment to receive our King, -The great Messiah, and his new commands, -Who speedily through all the hierarchies -Intends to pass triumphant, and give laws. -So spake the false Arch-Angel, and infused -Bad influence into the unwary breast -Of his associate: He together calls, -Or several one by one, the regent Powers, -Under him Regent; tells, as he was taught, -That the Most High commanding, now ere night, -Now ere dim night had disincumbered Heaven, -The great hierarchal standard was to move; -Tells the suggested cause, and casts between -Ambiguous words and jealousies, to sound -Or taint integrity: But all obeyed -The wonted signal, and superiour voice -Of their great Potentate; for great indeed -His name, and high was his degree in Heaven; -His countenance, as the morning-star that guides -The starry flock, allured them, and with lies -Drew after him the third part of Heaven's host. -Mean while the Eternal eye, whose sight discerns -Abstrusest thoughts, from forth his holy mount, -And from within the golden lamps that burn -Nightly before him, saw without their light -Rebellion rising; saw in whom, how spread -Among the sons of morn, what multitudes -Were banded to oppose his high decree; -And, smiling, to his only Son thus said. -Son, thou in whom my glory I behold -In full resplendence, Heir of all my might, -Nearly it now concerns us to be sure -Of our Omnipotence, and with what arms -We mean to hold what anciently we claim -Of deity or empire: Such a foe -Is rising, who intends to erect his throne -Equal to ours, throughout the spacious north; -Nor so content, hath in his thought to try -In battle, what our power is, or our right. -Let us advise, and to this hazard draw -With speed what force is left, and all employ -In our defence; lest unawares we lose -This our high place, our sanctuary, our hill. -To whom the Son with calm aspect and clear, -Lightning divine, ineffable, serene, -Made answer. Mighty Father, thou thy foes -Justly hast in derision, and, secure, -Laughest at their vain designs and tumults vain, -Matter to me of glory, whom their hate -Illustrates, when they see all regal power -Given me to quell their pride, and in event -Know whether I be dextrous to subdue -Thy rebels, or be found the worst in Heaven. -So spake the Son; but Satan, with his Powers, -Far was advanced on winged speed; an host -Innumerable as the stars of night, -Or stars of morning, dew-drops, which the sun -Impearls on every leaf and every flower. -Regions they passed, the mighty regencies -Of Seraphim, and Potentates, and Thrones, -In their triple degrees; regions to which -All thy dominion, Adam, is no more -Than what this garden is to all the earth, -And all the sea, from one entire globose -Stretched into longitude; which having passed, -At length into the limits of the north -They came; and Satan to his royal seat -High on a hill, far blazing, as a mount -Raised on a mount, with pyramids and towers -From diamond quarries hewn, and rocks of gold; -The palace of great Lucifer, (so call -That structure in the dialect of men -Interpreted,) which not long after, he -Affecting all equality with God, -In imitation of that mount whereon -Messiah was declared in sight of Heaven, -The Mountain of the Congregation called; -For thither he assembled all his train, -Pretending so commanded to consult -About the great reception of their King, -Thither to come, and with calumnious art -Of counterfeited truth thus held their ears. -Thrones, Dominations, Princedoms, Virtues, Powers; -If these magnifick titles yet remain -Not merely titular, since by decree -Another now hath to himself engrossed -All power, and us eclipsed under the name -Of King anointed, for whom all this haste -Of midnight-march, and hurried meeting here, -This only to consult how we may best, -With what may be devised of honours new, -Receive him coming to receive from us -Knee-tribute yet unpaid, prostration vile! -Too much to one! but double how endured, -To one, and to his image now proclaimed? -But what if better counsels might erect -Our minds, and teach us to cast off this yoke? -Will ye submit your necks, and choose to bend -The supple knee? Ye will not, if I trust -To know ye right, or if ye know yourselves -Natives and sons of Heaven possessed before -By none; and if not equal all, yet free, -Equally free; for orders and degrees -Jar not with liberty, but well consist. -Who can in reason then, or right, assume -Monarchy over such as live by right -His equals, if in power and splendour less, -In freedom equal? or can introduce -Law and edict on us, who without law -Err not? much less for this to be our Lord, -And look for adoration, to the abuse -Of those imperial titles, which assert -Our being ordained to govern, not to serve. -Thus far his bold discourse without controul -Had audience; when among the Seraphim -Abdiel, than whom none with more zeal adored -The Deity, and divine commands obeyed, -Stood up, and in a flame of zeal severe -The current of his fury thus opposed. -O argument blasphemous, false, and proud! -Words which no ear ever to hear in Heaven -Expected, least of all from thee, Ingrate, -In place thyself so high above thy peers. -Canst thou with impious obloquy condemn -The just decree of God, pronounced and sworn, -That to his only Son, by right endued -With regal scepter, every soul in Heaven -Shall bend the knee, and in that honour due -Confess him rightful King? unjust, thou sayest, -Flatly unjust, to bind with laws the free, -And equal over equals to let reign, -One over all with unsucceeded power. -Shalt thou give law to God? shalt thou dispute -With him the points of liberty, who made -Thee what thou art, and formed the Powers of Heaven -Such as he pleased, and circumscribed their being? -Yet, by experience taught, we know how good, -And of our good and of our dignity -How provident he is; how far from thought -To make us less, bent rather to exalt -Our happy state, under one head more near -United. But to grant it thee unjust, -That equal over equals monarch reign: -Thyself, though great and glorious, dost thou count, -Or all angelick nature joined in one, -Equal to him begotten Son? by whom, -As by his Word, the Mighty Father made -All things, even thee; and all the Spirits of Heaven -By him created in their bright degrees, -Crowned them with glory, and to their glory named -Thrones, Dominations, Princedoms, Virtues, Powers, -Essential Powers; nor by his reign obscured, -But more illustrious made; since he the head -One of our number thus reduced becomes; -His laws our laws; all honour to him done -Returns our own. Cease then this impious rage, -And tempt not these; but hasten to appease -The incensed Father, and the incensed Son, -While pardon may be found in time besought. -So spake the fervent Angel; but his zeal -None seconded, as out of season judged, -Or singular and rash: Whereat rejoiced -The Apostate, and, more haughty, thus replied. -That we were formed then sayest thou? and the work -Of secondary hands, by task transferred -From Father to his Son? strange point and new! -Doctrine which we would know whence learned: who saw -When this creation was? rememberest thou -Thy making, while the Maker gave thee being? -We know no time when we were not as now; -Know none before us, self-begot, self-raised -By our own quickening power, when fatal course -Had circled his full orb, the birth mature -Of this our native Heaven, ethereal sons. -Our puissance is our own; our own right hand -Shall teach us highest deeds, by proof to try -Who is our equal: Then thou shalt behold -Whether by supplication we intend -Address, and to begirt the almighty throne -Beseeching or besieging. This report, -These tidings carry to the anointed King; -And fly, ere evil intercept thy flight. -He said; and, as the sound of waters deep, -Hoarse murmur echoed to his words applause -Through the infinite host; nor less for that -The flaming Seraph fearless, though alone -Encompassed round with foes, thus answered bold. -O alienate from God, O Spirit accursed, -Forsaken of all good! I see thy fall -Determined, and thy hapless crew involved -In this perfidious fraud, contagion spread -Both of thy crime and punishment: Henceforth -No more be troubled how to quit the yoke -Of God's Messiah; those indulgent laws -Will not be now vouchsafed; other decrees -Against thee are gone forth without recall; -That golden scepter, which thou didst reject, -Is now an iron rod to bruise and break -Thy disobedience. Well thou didst advise; -Yet not for thy advice or threats I fly -These wicked tents devoted, lest the wrath -Impendent, raging into sudden flame, -Distinguish not: For soon expect to feel -His thunder on thy head, devouring fire. -Then who created thee lamenting learn, -When who can uncreate thee thou shalt know. -So spake the Seraph Abdiel, faithful found -Among the faithless, faithful only he; -Among innumerable false, unmoved, -Unshaken, unseduced, unterrified, -His loyalty he kept, his love, his zeal; -Nor number, nor example, with him wrought -To swerve from truth, or change his constant mind, -Though single. From amidst them forth he passed, -Long way through hostile scorn, which he sustained -Superiour, nor of violence feared aught; -And, with retorted scorn, his back he turned -On those proud towers to swift destruction doomed. - - - -Book VI - - -All night the dreadless Angel, unpursued, -Through Heaven's wide champain held his way; till Morn, -Waked by the circling Hours, with rosy hand -Unbarred the gates of light. There is a cave -Within the mount of God, fast by his throne, -Where light and darkness in perpetual round -Lodge and dislodge by turns, which makes through Heaven -Grateful vicissitude, like day and night; -Light issues forth, and at the other door -Obsequious darkness enters, till her hour -To veil the Heaven, though darkness there might well -Seem twilight here: And now went forth the Morn -Such as in highest Heaven arrayed in gold -Empyreal; from before her vanished Night, -Shot through with orient beams; when all the plain -Covered with thick embattled squadrons bright, -Chariots, and flaming arms, and fiery steeds, -Reflecting blaze on blaze, first met his view: -War he perceived, war in procinct; and found -Already known what he for news had thought -To have reported: Gladly then he mixed -Among those friendly Powers, who him received -With joy and acclamations loud, that one, -That of so many myriads fallen, yet one -Returned not lost. On to the sacred hill -They led him high applauded, and present -Before the seat supreme; from whence a voice, -From midst a golden cloud, thus mild was heard. -Servant of God. Well done; well hast thou fought -The better fight, who single hast maintained -Against revolted multitudes the cause -Of truth, in word mightier than they in arms; -And for the testimony of truth hast borne -Universal reproach, far worse to bear -Than violence; for this was all thy care -To stand approved in sight of God, though worlds -Judged thee perverse: The easier conquest now -Remains thee, aided by this host of friends, -Back on thy foes more glorious to return, -Than scorned thou didst depart; and to subdue -By force, who reason for their law refuse, -Right reason for their law, and for their King -Messiah, who by right of merit reigns. -Go, Michael, of celestial armies prince, -And thou, in military prowess next, -Gabriel, lead forth to battle these my sons -Invincible; lead forth my armed Saints, -By thousands and by millions, ranged for fight, -Equal in number to that Godless crew -Rebellious: Them with fire and hostile arms -Fearless assault; and, to the brow of Heaven -Pursuing, drive them out from God and bliss, -Into their place of punishment, the gulf -Of Tartarus, which ready opens wide -His fiery Chaos to receive their fall. -So spake the Sovran Voice, and clouds began -To darken all the hill, and smoke to roll -In dusky wreaths, reluctant flames, the sign -Of wrath awaked; nor with less dread the loud -Ethereal trumpet from on high 'gan blow: -At which command the Powers militant, -That stood for Heaven, in mighty quadrate joined -Of union irresistible, moved on -In silence their bright legions, to the sound -Of instrumental harmony, that breathed -Heroick ardour to adventurous deeds -Under their God-like leaders, in the cause -Of God and his Messiah. On they move -Indissolubly firm; nor obvious hill, -Nor straitening vale, nor wood, nor stream, divides -Their perfect ranks; for high above the ground -Their march was, and the passive air upbore -Their nimble tread; as when the total kind -Of birds, in orderly array on wing, -Came summoned over Eden to receive -Their names of thee; so over many a tract -Of Heaven they marched, and many a province wide, -Tenfold the length of this terrene: At last, -Far in the horizon to the north appeared -From skirt to skirt a fiery region, stretched -In battailous aspect, and nearer view -Bristled with upright beams innumerable -Of rigid spears, and helmets thronged, and shields -Various, with boastful argument portrayed, -The banded Powers of Satan hasting on -With furious expedition; for they weened -That self-same day, by fight or by surprise, -To win the mount of God, and on his throne -To set the Envier of his state, the proud -Aspirer; but their thoughts proved fond and vain -In the mid way: Though strange to us it seemed -At first, that Angel should with Angel war, -And in fierce hosting meet, who wont to meet -So oft in festivals of joy and love -Unanimous, as sons of one great Sire, -Hymning the Eternal Father: But the shout -Of battle now began, and rushing sound -Of onset ended soon each milder thought. -High in the midst, exalted as a God, -The Apostate in his sun-bright chariot sat, -Idol of majesty divine, enclosed -With flaming Cherubim, and golden shields; -Then lighted from his gorgeous throne, for now -"twixt host and host but narrow space was left, -A dreadful interval, and front to front -Presented stood in terrible array -Of hideous length: Before the cloudy van, -On the rough edge of battle ere it joined, -Satan, with vast and haughty strides advanced, -Came towering, armed in adamant and gold; -Abdiel that sight endured not, where he stood -Among the mightiest, bent on highest deeds, -And thus his own undaunted heart explores. -O Heaven! that such resemblance of the Highest -Should yet remain, where faith and realty -Remain not: Wherefore should not strength and might -There fail where virtue fails, or weakest prove -Where boldest, though to fight unconquerable? -His puissance, trusting in the Almighty's aid, -I mean to try, whose reason I have tried -Unsound and false; nor is it aught but just, -That he, who in debate of truth hath won, -Should win in arms, in both disputes alike -Victor; though brutish that contest and foul, -When reason hath to deal with force, yet so -Most reason is that reason overcome. -So pondering, and from his armed peers -Forth stepping opposite, half-way he met -His daring foe, at this prevention more -Incensed, and thus securely him defied. -Proud, art thou met? thy hope was to have reached -The highth of thy aspiring unopposed, -The throne of God unguarded, and his side -Abandoned, at the terrour of thy power -Or potent tongue: Fool!not to think how vain -Against the Omnipotent to rise in arms; -Who out of smallest things could, without end, -Have raised incessant armies to defeat -Thy folly; or with solitary hand -Reaching beyond all limit, at one blow, -Unaided, could have finished thee, and whelmed -Thy legions under darkness: But thou seest -All are not of thy train; there be, who faith -Prefer, and piety to God, though then -To thee not visible, when I alone -Seemed in thy world erroneous to dissent -From all: My sect thou seest;now learn too late -How few sometimes may know, when thousands err. -Whom the grand foe, with scornful eye askance, -Thus answered. Ill for thee, but in wished hour -Of my revenge, first sought for, thou returnest -From flight, seditious Angel! to receive -Thy merited reward, the first assay -Of this right hand provoked, since first that tongue, -Inspired with contradiction, durst oppose -A third part of the Gods, in synod met -Their deities to assert; who, while they feel -Vigour divine within them, can allow -Omnipotence to none. But well thou comest -Before thy fellows, ambitious to win -From me some plume, that thy success may show -Destruction to the rest: This pause between, -(Unanswered lest thou boast) to let thee know, -At first I thought that Liberty and Heaven -To heavenly souls had been all one; but now -I see that most through sloth had rather serve, -Ministring Spirits, trained up in feast and song! -Such hast thou armed, the minstrelsy of Heaven, -Servility with freedom to contend, -As both their deeds compared this day shall prove. -To whom in brief thus Abdiel stern replied. -Apostate! still thou errest, nor end wilt find -Of erring, from the path of truth remote: -Unjustly thou depravest it with the name -Of servitude, to serve whom God ordains, -Or Nature: God and Nature bid the same, -When he who rules is worthiest, and excels -Them whom he governs. This is servitude, -To serve the unwise, or him who hath rebelled -Against his worthier, as thine now serve thee, -Thyself not free, but to thyself enthralled; -Yet lewdly darest our ministring upbraid. -Reign thou in Hell, thy kingdom; let me serve -In Heaven God ever blest, and his divine -Behests obey, worthiest to be obeyed; -Yet chains in Hell, not realms, expect: Mean while -From me returned, as erst thou saidst, from flight, -This greeting on thy impious crest receive. -So saying, a noble stroke he lifted high, -Which hung not, but so swift with tempest fell -On the proud crest of Satan, that no sight, -Nor motion of swift thought, less could his shield, -Such ruin intercept: Ten paces huge -He back recoiled; the tenth on bended knee -His massy spear upstaid; as if on earth -Winds under ground, or waters forcing way, -Sidelong had pushed a mountain from his seat, -Half sunk with all his pines. Amazement seised -The rebel Thrones, but greater rage, to see -Thus foiled their mightiest; ours joy filled, and shout, -Presage of victory, and fierce desire -Of battle: Whereat Michael bid sound -The Arch-Angel trumpet; through the vast of Heaven -It sounded, and the faithful armies rung -Hosanna to the Highest: Nor stood at gaze -The adverse legions, nor less hideous joined -The horrid shock. Now storming fury rose, -And clamour such as heard in Heaven till now -Was never; arms on armour clashing brayed -Horrible discord, and the madding wheels -Of brazen chariots raged; dire was the noise -Of conflict; over head the dismal hiss -Of fiery darts in flaming vollies flew, -And flying vaulted either host with fire. -So under fiery cope together rushed -Both battles main, with ruinous assault -And inextinguishable rage. All Heaven -Resounded; and had Earth been then, all Earth -Had to her center shook. What wonder? when -Millions of fierce encountering Angels fought -On either side, the least of whom could wield -These elements, and arm him with the force -Of all their regions: How much more of power -Army against army numberless to raise -Dreadful combustion warring, and disturb, -Though not destroy, their happy native seat; -Had not the Eternal King Omnipotent, -From his strong hold of Heaven, high over-ruled -And limited their might; though numbered such -As each divided legion might have seemed -A numerous host; in strength each armed hand -A legion; led in fight, yet leader seemed -Each warriour single as in chief, expert -When to advance, or stand, or turn the sway -Of battle, open when, and when to close -The ridges of grim war: No thought of flight, -None of retreat, no unbecoming deed -That argued fear; each on himself relied, -As only in his arm the moment lay -Of victory: Deeds of eternal fame -Were done, but infinite; for wide was spread -That war and various; sometimes on firm ground -A standing fight, then, soaring on main wing, -Tormented all the air; all air seemed then -Conflicting fire. Long time in even scale -The battle hung; till Satan, who that day -Prodigious power had shown, and met in arms -No equal, ranging through the dire attack -Of fighting Seraphim confused, at length -Saw where the sword of Michael smote, and felled -Squadrons at once; with huge two-handed sway -Brandished aloft, the horrid edge came down -Wide-wasting; such destruction to withstand -He hasted, and opposed the rocky orb -Of tenfold adamant, his ample shield, -A vast circumference. At his approach -The great Arch-Angel from his warlike toil -Surceased, and glad, as hoping here to end -Intestine war in Heaven, the arch-foe subdued -Or captive dragged in chains, with hostile frown -And visage all inflamed first thus began. -Author of evil, unknown till thy revolt, -Unnamed in Heaven, now plenteous as thou seest -These acts of hateful strife, hateful to all, -Though heaviest by just measure on thyself, -And thy adherents: How hast thou disturbed -Heaven's blessed peace, and into nature brought -Misery, uncreated till the crime -Of thy rebellion! how hast thou instilled -Thy malice into thousands, once upright -And faithful, now proved false! But think not here -To trouble holy rest; Heaven casts thee out -From all her confines. Heaven, the seat of bliss, -Brooks not the works of violence and war. -Hence then, and evil go with thee along, -Thy offspring, to the place of evil, Hell; -Thou and thy wicked crew! there mingle broils, -Ere this avenging sword begin thy doom, -Or some more sudden vengeance, winged from God, -Precipitate thee with augmented pain. -So spake the Prince of Angels; to whom thus -The Adversary. Nor think thou with wind -Of aery threats to awe whom yet with deeds -Thou canst not. Hast thou turned the least of these -To flight, or if to fall, but that they rise -Unvanquished, easier to transact with me -That thou shouldst hope, imperious, and with threats -To chase me hence? err not, that so shall end -The strife which thou callest evil, but we style -The strife of glory; which we mean to win, -Or turn this Heaven itself into the Hell -Thou fablest; here however to dwell free, -If not to reign: Mean while thy utmost force, -And join him named Almighty to thy aid, -I fly not, but have sought thee far and nigh. -They ended parle, and both addressed for fight -Unspeakable; for who, though with the tongue -Of Angels, can relate, or to what things -Liken on earth conspicuous, that may lift -Human imagination to such highth -Of Godlike power? for likest Gods they seemed, -Stood they or moved, in stature, motion, arms, -Fit to decide the empire of great Heaven. -Now waved their fiery swords, and in the air -Made horrid circles; two broad suns their shields -Blazed opposite, while Expectation stood -In horrour: From each hand with speed retired, -Where erst was thickest fight, the angelick throng, -And left large field, unsafe within the wind -Of such commotion; such as, to set forth -Great things by small, if, nature's concord broke, -Among the constellations war were sprung, -Two planets, rushing from aspect malign -Of fiercest opposition, in mid sky -Should combat, and their jarring spheres confound. -Together both with next to almighty arm -Up-lifted imminent, one stroke they aimed -That might determine, and not need repeat, -As not of power at once; nor odds appeared -In might or swift prevention: But the sword -Of Michael from the armoury of God -Was given him tempered so, that neither keen -Nor solid might resist that edge: it met -The sword of Satan, with steep force to smite -Descending, and in half cut sheer; nor staid, -But with swift wheel reverse, deep entering, shared -All his right side: Then Satan first knew pain, -And writhed him to and fro convolved; so sore -The griding sword with discontinuous wound -Passed through him: But the ethereal substance closed, -Not long divisible; and from the gash -A stream of necturous humour issuing flowed -Sanguine, such as celestial Spirits may bleed, -And all his armour stained, ere while so bright. -Forthwith on all sides to his aid was run -By Angels many and strong, who interposed -Defence, while others bore him on their shields -Back to his chariot, where it stood retired -From off the files of war: There they him laid -Gnashing for anguish, and despite, and shame, -To find himself not matchless, and his pride -Humbled by such rebuke, so far beneath -His confidence to equal God in power. -Yet soon he healed; for Spirits that live throughout -Vital in every part, not as frail man -In entrails, heart of head, liver or reins, -Cannot but by annihilating die; -Nor in their liquid texture mortal wound -Receive, no more than can the fluid air: -All heart they live, all head, all eye, all ear, -All intellect, all sense; and, as they please, -They limb themselves, and colour, shape, or size -Assume, as?kikes them best, condense or rare. -Mean while in other parts like deeds deserved -Memorial, where the might of Gabriel fought, -And with fierce ensigns pierced the deep array -Of Moloch, furious king; who him defied, -And at his chariot-wheels to drag him bound -Threatened, nor from the Holy One of Heaven -Refrained his tongue blasphemous; but anon -Down cloven to the waist, with shattered arms -And uncouth pain fled bellowing. On each wing -Uriel, and Raphael, his vaunting foe, -Though huge, and in a rock of diamond armed, -Vanquished Adramelech, and Asmadai, -Two potent Thrones, that to be less than Gods -Disdained, but meaner thoughts learned in their flight, -Mangled with ghastly wounds through plate and mail. -Nor stood unmindful Abdiel to annoy -The atheist crew, but with redoubled blow -Ariel, and Arioch, and the violence -Of Ramiel scorched and blasted, overthrew. -I might relate of thousands, and their names -Eternize here on earth; but those elect -Angels, contented with their fame in Heaven, -Seek not the praise of men: The other sort, -In might though wonderous and in acts of war, -Nor of renown less eager, yet by doom -Cancelled from Heaven and sacred memory, -Nameless in dark oblivion let them dwell. -For strength from truth divided, and from just, -Illaudable, nought merits but dispraise -And ignominy; yet to glory aspires -Vain-glorious, and through infamy seeks fame: -Therefore eternal silence be their doom. -And now, their mightiest quelled, the battle swerved, -With many an inroad gored; deformed rout -Entered, and foul disorder; all the ground -With shivered armour strown, and on a heap -Chariot and charioteer lay overturned, -And fiery-foaming steeds; what stood, recoiled -O'er-wearied, through the faint Satanick host -Defensive scarce, or with pale fear surprised, -Then first with fear surprised, and sense of pain, -Fled ignominious, to such evil brought -By sin of disobedience; till that hour -Not liable to fear, or flight, or pain. -Far otherwise the inviolable Saints, -In cubick phalanx firm, advanced entire, -Invulnerable, impenetrably armed; -Such high advantages their innocence -Gave them above their foes; not to have sinned, -Not to have disobeyed; in fight they stood -Unwearied, unobnoxious to be pained -By wound, though from their place by violence moved, -Now Night her course began, and, over Heaven -Inducing darkness, grateful truce imposed, -And silence on the odious din of war: -Under her cloudy covert both retired, -Victor and vanquished: On the foughten field -Michael and his Angels prevalent -Encamping, placed in guard their watches round, -Cherubick waving fires: On the other part, -Satan with his rebellious disappeared, -Far in the dark dislodged; and, void of rest, -His potentates to council called by night; -And in the midst thus undismayed began. -O now in danger tried, now known in arms -Not to be overpowered, Companions dear, -Found worthy not of liberty alone, -Too mean pretence! but what we more affect, -Honour, dominion, glory, and renown; -Who have sustained one day in doubtful fight, -(And if one day, why not eternal days?) -What Heaven's Lord had powerfullest to send -Against us from about his throne, and judged -Sufficient to subdue us to his will, -But proves not so: Then fallible, it seems, -Of future we may deem him, though till now -Omniscient thought. True is, less firmly armed, -Some disadvantage we endured and pain, -Till now not known, but, known, as soon contemned; -Since now we find this our empyreal form -Incapable of mortal injury, -Imperishable, and, though pierced with wound, -Soon closing, and by native vigour healed. -Of evil then so small as easy think -The remedy; perhaps more valid arms, -Weapons more violent, when next we meet, -May serve to better us, and worse our foes, -Or equal what between us made the odds, -In nature none: If other hidden cause -Left them superiour, while we can preserve -Unhurt our minds, and understanding sound, -Due search and consultation will disclose. -He sat; and in the assembly next upstood -Nisroch, of Principalities the prime; -As one he stood escaped from cruel fight, -Sore toiled, his riven arms to havock hewn, -And cloudy in aspect thus answering spake. -Deliverer from new Lords, leader to free -Enjoyment of our right as Gods; yet hard -For Gods, and too unequal work we find, -Against unequal arms to fight in pain, -Against unpained, impassive; from which evil -Ruin must needs ensue; for what avails -Valour or strength, though matchless, quelled with pain -Which all subdues, and makes remiss the hands -Of mightiest? Sense of pleasure we may well -Spare out of life perhaps, and not repine, -But live content, which is the calmest life: -But pain is perfect misery, the worst -Of evils, and, excessive, overturns -All patience. He, who therefore can invent -With what more forcible we may offend -Our yet unwounded enemies, or arm -Ourselves with like defence, to me deserves -No less than for deliverance what we owe. -Whereto with look composed Satan replied. -Not uninvented that, which thou aright -Believest so main to our success, I bring. -Which of us who beholds the bright surface -Of this ethereous mould whereon we stand, -This continent of spacious Heaven, adorned -With plant, fruit, flower ambrosial, gems, and gold; -Whose eye so superficially surveys -These things, as not to mind from whence they grow -Deep under ground, materials dark and crude, -Of spiritous and fiery spume, till touched -With Heaven's ray, and tempered, they shoot forth -So beauteous, opening to the ambient light? -These in their dark nativity the deep -Shall yield us, pregnant with infernal flame; -Which, into hollow engines, long and round, -Thick rammed, at the other bore with touch of fire -Dilated and infuriate, shall send forth -From far, with thundering noise, among our foes -Such implements of mischief, as shall dash -To pieces, and o'erwhelm whatever stands -Adverse, that they shall fear we have disarmed -The Thunderer of his only dreaded bolt. -Nor long shall be our labour; yet ere dawn, -Effect shall end our wish. Mean while revive; -Abandon fear; to strength and counsel joined -Think nothing hard, much less to be despaired. -He ended, and his words their drooping cheer -Enlightened, and their languished hope revived. -The invention all admired, and each, how he -To be the inventer missed; so easy it seemed -Once found, which yet unfound most would have thought -Impossible: Yet, haply, of thy race -In future days, if malice should abound, -Some one intent on mischief, or inspired -With devilish machination, might devise -Like instrument to plague the sons of men -For sin, on war and mutual slaughter bent. -Forthwith from council to the work they flew; -None arguing stood; innumerable hands -Were ready; in a moment up they turned -Wide the celestial soil, and saw beneath -The originals of nature in their crude -Conception; sulphurous and nitrous foam -They found, they mingled, and, with subtle art, -Concocted and adusted they reduced -To blackest grain, and into store conveyed: -Part hidden veins digged up (nor hath this earth -Entrails unlike) of mineral and stone, -Whereof to found their engines and their balls -Of missive ruin; part incentive reed -Provide, pernicious with one touch to fire. -So all ere day-spring, under conscious night, -Secret they finished, and in order set, -With silent circumspection, unespied. -Now when fair morn orient in Heaven appeared, -Up rose the victor-Angels, and to arms -The matin trumpet sung: In arms they stood -Of golden panoply, refulgent host, -Soon banded; others from the dawning hills -Look round, and scouts each coast light-armed scour, -Each quarter to descry the distant foe, -Where lodged, or whither fled, or if for fight, -In motion or in halt: Him soon they met -Under spread ensigns moving nigh, in slow -But firm battalion; back with speediest sail -Zophiel, of Cherubim the swiftest wing, -Came flying, and in mid air aloud thus cried. -Arm, Warriours, arm for fight; the foe at hand, -Whom fled we thought, will save us long pursuit -This day; fear not his flight;so thick a cloud -He comes, and settled in his face I see -Sad resolution, and secure: Let each -His adamantine coat gird well, and each -Fit well his helm, gripe fast his orbed shield, -Borne even or high; for this day will pour down, -If I conjecture aught, no drizzling shower, -But rattling storm of arrows barbed with fire. -So warned he them, aware themselves, and soon -In order, quit of all impediment; -Instant without disturb they took alarm, -And onward moved embattled: When behold! -Not distant far with heavy pace the foe -Approaching gross and huge, in hollow cube -Training his devilish enginery, impaled -On every side with shadowing squadrons deep, -To hide the fraud. At interview both stood -A while; but suddenly at head appeared -Satan, and thus was heard commanding loud. -Vanguard, to right and left the front unfold; -That all may see who hate us, how we seek -Peace and composure, and with open breast -Stand ready to receive them, if they like -Our overture; and turn not back perverse: -But that I doubt; however witness, Heaven! -Heaven, witness thou anon! while we discharge -Freely our part: ye, who appointed stand -Do as you have in charge, and briefly touch -What we propound, and loud that all may hear! -So scoffing in ambiguous words, he scarce -Had ended; when to right and left the front -Divided, and to either flank retired: -Which to our eyes discovered, new and strange, -A triple mounted row of pillars laid -On wheels (for like to pillars most they seemed, -Or hollowed bodies made of oak or fir, -With branches lopt, in wood or mountain felled,) -Brass, iron, stony mould, had not their mouths -With hideous orifice gaped on us wide, -Portending hollow truce: At each behind -A Seraph stood, and in his hand a reed -Stood waving tipt with fire; while we, suspense, -Collected stood within our thoughts amused, -Not long; for sudden all at once their reeds -Put forth, and to a narrow vent applied -With nicest touch. Immediate in a flame, -But soon obscured with smoke, all Heaven appeared, -From those deep-throated engines belched, whose roar -Embowelled with outrageous noise the air, -And all her entrails tore, disgorging foul -Their devilish glut, chained thunderbolts and hail -Of iron globes; which, on the victor host -Levelled, with such impetuous fury smote, -That, whom they hit, none on their feet might stand, -Though standing else as rocks, but down they fell -By thousands, Angel on Arch-Angel rolled; -The sooner for their arms; unarmed, they might -Have easily, as Spirits, evaded swift -By quick contraction or remove; but now -Foul dissipation followed, and forced rout; -Nor served it to relax their serried files. -What should they do? if on they rushed, repulse -Repeated, and indecent overthrow -Doubled, would render them yet more despised, -And to their foes a laughter; for in view -Stood ranked of Seraphim another row, -In posture to displode their second tire -Of thunder: Back defeated to return -They worse abhorred. Satan beheld their plight, -And to his mates thus in derision called. -O Friends! why come not on these victors proud -Ere while they fierce were coming; and when we, -To entertain them fair with open front -And breast, (what could we more?) propounded terms -Of composition, straight they changed their minds, -Flew off, and into strange vagaries fell, -As they would dance; yet for a dance they seemed -Somewhat extravagant and wild; perhaps -For joy of offered peace: But I suppose, -If our proposals once again were heard, -We should compel them to a quick result. -To whom thus Belial, in like gamesome mood. -Leader! the terms we sent were terms of weight, -Of hard contents, and full of force urged home; -Such as we might perceive amused them all, -And stumbled many: Who receives them right, -Had need from head to foot well understand; -Not understood, this gift they have besides, -They show us when our foes walk not upright. -So they among themselves in pleasant vein -Stood scoffing, hightened in their thoughts beyond -All doubt of victory: Eternal Might -To match with their inventions they presumed -So easy, and of his thunder made a scorn, -And all his host derided, while they stood -A while in trouble: But they stood not long; -Rage prompted them at length, and found them arms -Against such hellish mischief fit to oppose. -Forthwith (behold the excellence, the power, -Which God hath in his mighty Angels placed!) -Their arms away they threw, and to the hills -(For Earth hath this variety from Heaven -Of pleasure situate in hill and dale,) -Light as the lightning glimpse they ran, they flew; -From their foundations loosening to and fro, -They plucked the seated hills, with all their load, -Rocks, waters, woods, and by the shaggy tops -Up-lifting bore them in their hands: Amaze, -Be sure, and terrour, seized the rebel host, -When coming towards them so dread they saw -The bottom of the mountains upward turned; -Till on those cursed engines' triple-row -They saw them whelmed, and all their confidence -Under the weight of mountains buried deep; -Themselves invaded next, and on their heads -Main promontories flung, which in the air -Came shadowing, and oppressed whole legions armed; -Their armour helped their harm, crushed in and bruised -Into their substance pent, which wrought them pain -Implacable, and many a dolorous groan; -Long struggling underneath, ere they could wind -Out of such prison, though Spirits of purest light, -Purest at first, now gross by sinning grown. -The rest, in imitation, to like arms -Betook them, and the neighbouring hills uptore: -So hills amid the air encountered hills, -Hurled to and fro with jaculation dire; -That under ground they fought in dismal shade; -Infernal noise! war seemed a civil game -To this uproar; horrid confusion heaped -Upon confusion rose: And now all Heaven -Had gone to wrack, with ruin overspread; -Had not the Almighty Father, where he sits -Shrined in his sanctuary of Heaven secure, -Consulting on the sum of things, foreseen -This tumult, and permitted all, advised: -That his great purpose he might so fulfil, -To honour his anointed Son avenged -Upon his enemies, and to declare -All power on him transferred: Whence to his Son, -The Assessour of his throne, he thus began. -Effulgence of my glory, Son beloved, -Son, in whose face invisible is beheld -Visibly, what by Deity I am; -And in whose hand what by decree I do, -Second Omnipotence! two days are past, -Two days, as we compute the days of Heaven, -Since Michael and his Powers went forth to tame -These disobedient: Sore hath been their fight, -As likeliest was, when two such foes met armed; -For to themselves I left them; and thou knowest, -Equal in their creation they were formed, -Save what sin hath impaired; which yet hath wrought -Insensibly, for I suspend their doom; -Whence in perpetual fight they needs must last -Endless, and no solution will be found: -War wearied hath performed what war can do, -And to disordered rage let loose the reins -With mountains, as with weapons, armed; which makes -Wild work in Heaven, and dangerous to the main. -Two days are therefore past, the third is thine; -For thee I have ordained it; and thus far -Have suffered, that the glory may be thine -Of ending this great war, since none but Thou -Can end it. Into thee such virtue and grace -Immense I have transfused, that all may know -In Heaven and Hell thy power above compare; -And, this perverse commotion governed thus, -To manifest thee worthiest to be Heir -Of all things; to be Heir, and to be King -By sacred unction, thy deserved right. -Go then, Thou Mightiest, in thy Father's might; -Ascend my chariot, guide the rapid wheels -That shake Heaven's basis, bring forth all my war, -My bow and thunder, my almighty arms -Gird on, and sword upon thy puissant thigh; -Pursue these sons of darkness, drive them out -From all Heaven's bounds into the utter deep: -There let them learn, as likes them, to despise -God, and Messiah his anointed King. -He said, and on his Son with rays direct -Shone full; he all his Father full expressed -Ineffably into his face received; -And thus the Filial Godhead answering spake. -O Father, O Supreme of heavenly Thrones, -First, Highest, Holiest, Best; thou always seek'st -To glorify thy Son, I always thee, -As is most just: This I my glory account, -My exaltation, and my whole delight, -That thou, in me well pleased, declarest thy will -Fulfilled, which to fulfil is all my bliss. -Scepter and power, thy giving, I assume, -And gladlier shall resign, when in the end -Thou shalt be all in all, and I in thee -For ever; and in me all whom thou lovest: -But whom thou hatest, I hate, and can put on -Thy terrours, as I put thy mildness on, -Image of thee in all things; and shall soon, -Armed with thy might, rid Heaven of these rebelled; -To their prepared ill mansion driven down, -To chains of darkness, and the undying worm; -That from thy just obedience could revolt, -Whom to obey is happiness entire. -Then shall thy Saints unmixed, and from the impure -Far separate, circling thy holy mount, -Unfeigned Halleluiahs to thee sing, -Hymns of high praise, and I among them Chief. -So said, he, o'er his scepter bowing, rose -From the right hand of Glory where he sat; -And the third sacred morn began to shine, -Dawning through Heaven. Forth rushed with whirlwind sound -The chariot of Paternal Deity, -Flashing thick flames, wheel within wheel undrawn, -Itself instinct with Spirit, but convoyed -By four Cherubick shapes; four faces each -Had wonderous; as with stars, their bodies all -And wings were set with eyes; with eyes the wheels -Of beryl, and careering fires between; -Over their heads a crystal firmament, -Whereon a sapphire throne, inlaid with pure -Amber, and colours of the showery arch. -He, in celestial panoply all armed -Of radiant Urim, work divinely wrought, -Ascended; at his right hand Victory -Sat eagle-winged; beside him hung his bow -And quiver with three-bolted thunder stored; -And from about him fierce effusion rolled -Of smoke, and bickering flame, and sparkles dire: -Attended with ten thousand thousand Saints, -He onward came; far off his coming shone; -And twenty thousand (I their number heard) -Chariots of God, half on each hand, were seen; -He on the wings of Cherub rode sublime -On the crystalline sky, in sapphire throned, -Illustrious far and wide; but by his own -First seen: Them unexpected joy surprised, -When the great ensign of Messiah blazed -Aloft by Angels borne, his sign in Heaven; -Under whose conduct Michael soon reduced -His army, circumfused on either wing, -Under their Head imbodied all in one. -Before him Power Divine his way prepared; -At his command the uprooted hills retired -Each to his place; they heard his voice, and went -Obsequious; Heaven his wonted face renewed, -And with fresh flowerets hill and valley smiled. -This saw his hapless foes, but stood obdured, -And to rebellious fight rallied their Powers, -Insensate, hope conceiving from despair. -In heavenly Spirits could such perverseness dwell? -But to convince the proud what signs avail, -Or wonders move the obdurate to relent? -They, hardened more by what might most reclaim, -Grieving to see his glory, at the sight -Took envy; and, aspiring to his highth, -Stood re-embattled fierce, by force or fraud -Weening to prosper, and at length prevail -Against God and Messiah, or to fall -In universal ruin last; and now -To final battle drew, disdaining flight, -Or faint retreat; when the great Son of God -To all his host on either hand thus spake. -Stand still in bright array, ye Saints; here stand, -Ye Angels armed; this day from battle rest: -Faithful hath been your warfare, and of God -Accepted, fearless in his righteous cause; -And as ye have received, so have ye done, -Invincibly: But of this cursed crew -The punishment to other hand belongs; -Vengeance is his, or whose he sole appoints: -Number to this day's work is not ordained, -Nor multitude; stand only, and behold -God's indignation on these godless poured -By me; not you, but me, they have despised, -Yet envied; against me is all their rage, -Because the Father, to whom in Heaven s'preme -Kingdom, and power, and glory appertains, -Hath honoured me, according to his will. -Therefore to me their doom he hath assigned; -That they may have their wish, to try with me -In battle which the stronger proves; they all, -Or I alone against them; since by strength -They measure all, of other excellence -Not emulous, nor care who them excels; -Nor other strife with them do I vouchsafe. -So spake the Son, and into terrour changed -His countenance too severe to be beheld, -And full of wrath bent on his enemies. -At once the Four spread out their starry wings -With dreadful shade contiguous, and the orbs -Of his fierce chariot rolled, as with the sound -Of torrent floods, or of a numerous host. -He on his impious foes right onward drove, -Gloomy as night; under his burning wheels -The stedfast empyrean shook throughout, -All but the throne itself of God. Full soon -Among them he arrived; in his right hand -Grasping ten thousand thunders, which he sent -Before him, such as in their souls infixed -Plagues: They, astonished, all resistance lost, -All courage; down their idle weapons dropt: -O'er shields, and helms, and helmed heads he rode -Of Thrones and mighty Seraphim prostrate, -That wished the mountains now might be again -Thrown on them, as a shelter from his ire. -Nor less on either side tempestuous fell -His arrows, from the fourfold-visaged Four -Distinct with eyes, and from the living wheels -Distinct alike with multitude of eyes; -One Spirit in them ruled; and every eye -Glared lightning, and shot forth pernicious fire -Among the accursed, that withered all their strength, -And of their wonted vigour left them drained, -Exhausted, spiritless, afflicted, fallen. -Yet half his strength he put not forth, but checked -His thunder in mid volley; for he meant -Not to destroy, but root them out of Heaven: -The overthrown he raised, and as a herd -Of goats or timorous flock together thronged -Drove them before him thunder-struck, pursued -With terrours, and with furies, to the bounds -And crystal wall of Heaven; which, opening wide, -Rolled inward, and a spacious gap disclosed -Into the wasteful deep: The monstrous sight -Struck them with horrour backward, but far worse -Urged them behind: Headlong themselves they threw -Down from the verge of Heaven; eternal wrath -Burnt after them to the bottomless pit. -Hell heard the unsufferable noise, Hell saw -Heaven ruining from Heaven, and would have fled -Affrighted; but strict Fate had cast too deep -Her dark foundations, and too fast had bound. -Nine days they fell: Confounded Chaos roared, -And felt tenfold confusion in their fall -Through his wild anarchy, so huge a rout -Incumbered him with ruin: Hell at last -Yawning received them whole, and on them closed; -Hell, their fit habitation, fraught with fire -Unquenchable, the house of woe and pain. -Disburdened Heaven rejoiced, and soon repaired -Her mural breach, returning whence it rolled. -Sole victor, from the expulsion of his foes, -Messiah his triumphal chariot turned: -To meet him all his Saints, who silent stood -Eye-witnesses of his almighty acts, -With jubilee advanced; and, as they went, -Shaded with branching palm, each Order bright, -Sung triumph, and him sung victorious King, -Son, Heir, and Lord, to him dominion given, -Worthiest to reign: He, celebrated, rode -Triumphant through mid Heaven, into the courts -And temple of his Mighty Father throned -On high; who into glory him received, -Where now he sits at the right hand of bliss. -Thus, measuring things in Heaven by things on Earth, -At thy request, and that thou mayest beware -By what is past, to thee I have revealed -What might have else to human race been hid; -The discord which befel, and war in Heaven -Among the angelick Powers, and the deep fall -Of those too high aspiring, who rebelled -With Satan; he who envies now thy state, -Who now is plotting how he may seduce -Thee also from obedience, that, with him -Bereaved of happiness, thou mayest partake -His punishment, eternal misery; -Which would be all his solace and revenge, -As a despite done against the Most High, -Thee once to gain companion of his woe. -But listen not to his temptations, warn -Thy weaker; let it profit thee to have heard, -By terrible example, the reward -Of disobedience; firm they might have stood, -Yet fell; remember, and fear to transgress. - - - -Book VII - - -Descend from Heaven, Urania, by that name -If rightly thou art called, whose voice divine -Following, above the Olympian hill I soar, -Above the flight of Pegasean wing! -The meaning, not the name, I call: for thou -Nor of the Muses nine, nor on the top -Of old Olympus dwellest; but, heavenly-born, -Before the hills appeared, or fountain flowed, -Thou with eternal Wisdom didst converse, -Wisdom thy sister, and with her didst play -In presence of the Almighty Father, pleased -With thy celestial song. Up led by thee -Into the Heaven of Heavens I have presumed, -An earthly guest, and drawn empyreal air, -Thy tempering: with like safety guided down -Return me to my native element: -Lest from this flying steed unreined, (as once -Bellerophon, though from a lower clime,) -Dismounted, on the Aleian field I fall, -Erroneous there to wander, and forlorn. -Half yet remains unsung, but narrower bound -Within the visible diurnal sphere; -Standing on earth, not rapt above the pole, -More safe I sing with mortal voice, unchanged -To hoarse or mute, though fallen on evil days, -On evil days though fallen, and evil tongues; -In darkness, and with dangers compassed round, -And solitude; yet not alone, while thou -Visitest my slumbers nightly, or when morn -Purples the east: still govern thou my song, -Urania, and fit audience find, though few. -But drive far off the barbarous dissonance -Of Bacchus and his revellers, the race -Of that wild rout that tore the Thracian bard -In Rhodope, where woods and rocks had ears -To rapture, till the savage clamour drowned -Both harp and voice; nor could the Muse defend -Her son. So fail not thou, who thee implores: -For thou art heavenly, she an empty dream. -Say, Goddess, what ensued when Raphael, -The affable Arch-Angel, had forewarned -Adam, by dire example, to beware -Apostasy, by what befel in Heaven -To those apostates; lest the like befall -In Paradise to Adam or his race, -Charged not to touch the interdicted tree, -If they transgress, and slight that sole command, -So easily obeyed amid the choice -Of all tastes else to please their appetite, -Though wandering. He, with his consorted Eve, -The story heard attentive, and was filled -With admiration and deep muse, to hear -Of things so high and strange; things, to their thought -So unimaginable, as hate in Heaven, -And war so near the peace of God in bliss, -With such confusion: but the evil, soon -Driven back, redounded as a flood on those -From whom it sprung; impossible to mix -With blessedness. Whence Adam soon repealed -The doubts that in his heart arose: and now -Led on, yet sinless, with desire to know -What nearer might concern him, how this world -Of Heaven and Earth conspicuous first began; -When, and whereof created; for what cause; -What within Eden, or without, was done -Before his memory; as one whose drouth -Yet scarce allayed still eyes the current stream, -Whose liquid murmur heard new thirst excites, -Proceeded thus to ask his heavenly guest. -Great things, and full of wonder in our ears, -Far differing from this world, thou hast revealed, -Divine interpreter! by favour sent -Down from the empyrean, to forewarn -Us timely of what might else have been our loss, -Unknown, which human knowledge could not reach; -For which to the infinitely Good we owe -Immortal thanks, and his admonishment -Receive, with solemn purpose to observe -Immutably his sovran will, the end -Of what we are. But since thou hast vouchsafed -Gently, for our instruction, to impart -Things above earthly thought, which yet concerned -Our knowing, as to highest wisdom seemed, -Deign to descend now lower, and relate -What may no less perhaps avail us known, -How first began this Heaven which we behold -Distant so high, with moving fires adorned -Innumerable; and this which yields or fills -All space, the ambient air wide interfused -Embracing round this floried Earth; what cause -Moved the Creator, in his holy rest -Through all eternity, so late to build -In Chaos; and the work begun, how soon -Absolved; if unforbid thou mayest unfold -What we, not to explore the secrets ask -Of his eternal empire, but the more -To magnify his works, the more we know. -And the great light of day yet wants to run -Much of his race though steep; suspense in Heaven, -Held by thy voice, thy potent voice, he hears, -And longer will delay to hear thee tell -His generation, and the rising birth -Of Nature from the unapparent Deep: -Or if the star of evening and the moon -Haste to thy audience, Night with her will bring, -Silence; and Sleep, listening to thee, will watch; -Or we can bid his absence, till thy song -End, and dismiss thee ere the morning shine. -Thus Adam his illustrious guest besought: -And thus the Godlike Angel answered mild. -This also thy request, with caution asked, -Obtain; though to recount almighty works -What words or tongue of Seraph can suffice, -Or heart of man suffice to comprehend? -Yet what thou canst attain, which best may serve -To glorify the Maker, and infer -Thee also happier, shall not be withheld -Thy hearing; such commission from above -I have received, to answer thy desire -Of knowledge within bounds; beyond, abstain -To ask; nor let thine own inventions hope -Things not revealed, which the invisible King, -Only Omniscient, hath suppressed in night; -To none communicable in Earth or Heaven: -Enough is left besides to search and know. -But knowledge is as food, and needs no less -Her temperance over appetite, to know -In measure what the mind may well contain; -Oppresses else with surfeit, and soon turns -Wisdom to folly, as nourishment to wind. -Know then, that, after Lucifer from Heaven -(So call him, brighter once amidst the host -Of Angels, than that star the stars among,) -Fell with his flaming legions through the deep -Into his place, and the great Son returned -Victorious with his Saints, the Omnipotent -Eternal Father from his throne beheld -Their multitude, and to his Son thus spake. -At least our envious Foe hath failed, who thought -All like himself rebellious, by whose aid -This inaccessible high strength, the seat -Of Deity supreme, us dispossessed, -He trusted to have seised, and into fraud -Drew many, whom their place knows here no more: -Yet far the greater part have kept, I see, -Their station; Heaven, yet populous, retains -Number sufficient to possess her realms -Though wide, and this high temple to frequent -With ministeries due, and solemn rites: -But, lest his heart exalt him in the harm -Already done, to have dispeopled Heaven, -My damage fondly deemed, I can repair -That detriment, if such it be to lose -Self-lost; and in a moment will create -Another world, out of one man a race -Of men innumerable, there to dwell, -Not here; till, by degrees of merit raised, -They open to themselves at length the way -Up hither, under long obedience tried; -And Earth be changed to Heaven, and Heaven to Earth, -One kingdom, joy and union without end. -Mean while inhabit lax, ye Powers of Heaven; -And thou my Word, begotten Son, by thee -This I perform; speak thou, and be it done! -My overshadowing Spirit and Might with thee -I send along; ride forth, and bid the Deep -Within appointed bounds be Heaven and Earth; -Boundless the Deep, because I Am who fill -Infinitude, nor vacuous the space. -Though I, uncircumscribed myself, retire, -And put not forth my goodness, which is free -To act or not, Necessity and Chance -Approach not me, and what I will is Fate. -So spake the Almighty, and to what he spake -His Word, the Filial Godhead, gave effect. -Immediate are the acts of God, more swift -Than time or motion, but to human ears -Cannot without process of speech be told, -So told as earthly notion can receive. -Great triumph and rejoicing was in Heaven, -When such was heard declared the Almighty's will; -Glory they sung to the Most High, good will -To future men, and in their dwellings peace; -Glory to Him, whose just avenging ire -Had driven out the ungodly from his sight -And the habitations of the just; to Him -Glory and praise, whose wisdom had ordained -Good out of evil to create; instead -Of Spirits malign, a better race to bring -Into their vacant room, and thence diffuse -His good to worlds and ages infinite. -So sang the Hierarchies: Mean while the Son -On his great expedition now appeared, -Girt with Omnipotence, with radiance crowned -Of Majesty Divine; sapience and love -Immense, and all his Father in him shone. -About his chariot numberless were poured -Cherub, and Seraph, Potentates, and Thrones, -And Virtues, winged Spirits, and chariots winged -From the armoury of God; where stand of old -Myriads, between two brazen mountains lodged -Against a solemn day, harnessed at hand, -Celestial equipage; and now came forth -Spontaneous, for within them Spirit lived, -Attendant on their Lord: Heaven opened wide -Her ever-during gates, harmonious sound -On golden hinges moving, to let forth -The King of Glory, in his powerful Word -And Spirit, coming to create new worlds. -On heavenly ground they stood; and from the shore -They viewed the vast immeasurable abyss -Outrageous as a sea, dark, wasteful, wild, -Up from the bottom turned by furious winds -And surging waves, as mountains, to assault -Heaven's highth, and with the center mix the pole. -Silence, ye troubled Waves, and thou Deep, peace, -Said then the Omnifick Word; your discord end! -Nor staid; but, on the wings of Cherubim -Uplifted, in paternal glory rode -Far into Chaos, and the world unborn; -For Chaos heard his voice: Him all his train -Followed in bright procession, to behold -Creation, and the wonders of his might. -Then staid the fervid wheels, and in his hand -He took the golden compasses, prepared -In God's eternal store, to circumscribe -This universe, and all created things: -One foot he centered, and the other turned -Round through the vast profundity obscure; -And said, Thus far extend, thus far thy bounds, -This be thy just circumference, O World! -Thus God the Heaven created, thus the Earth, -Matter unformed and void: Darkness profound -Covered the abyss: but on the watery calm -His brooding wings the Spirit of God outspread, -And vital virtue infused, and vital warmth -Throughout the fluid mass; but downward purged -The black tartareous cold infernal dregs, -Adverse to life: then founded, then conglobed -Like things to like; the rest to several place -Disparted, and between spun out the air; -And Earth self-balanced on her center hung. -Let there be light, said God; and forthwith Light -Ethereal, first of things, quintessence pure, -Sprung from the deep; and from her native east -To journey through the aery gloom began, -Sphered in a radiant cloud, for yet the sun -Was not; she in a cloudy tabernacle -Sojourned the while. God saw the light was good; -And light from darkness by the hemisphere -Divided: light the Day, and darkness Night, -He named. Thus was the first day even and morn: -Nor past uncelebrated, nor unsung -By the celestial quires, when orient light -Exhaling first from darkness they beheld; -Birth-day of Heaven and Earth; with joy and shout -The hollow universal orb they filled, -And touched their golden harps, and hymning praised -God and his works; Creator him they sung, -Both when first evening was, and when first morn. -Again, God said, Let there be firmament -Amid the waters, and let it divide -The waters from the waters; and God made -The firmament, expanse of liquid, pure, -Transparent, elemental air, diffused -In circuit to the uttermost convex -Of this great round; partition firm and sure, -The waters underneath from those above -Dividing: for as earth, so he the world -Built on circumfluous waters calm, in wide -Crystalline ocean, and the loud misrule -Of Chaos far removed; lest fierce extremes -Contiguous might distemper the whole frame: -And Heaven he named the Firmament: So even -And morning chorus sung the second day. -The Earth was formed, but in the womb as yet -Of waters, embryon immature involved, -Appeared not: over all the face of Earth -Main ocean flowed, not idle; but, with warm -Prolifick humour softening all her globe, -Fermented the great mother to conceive, -Satiate with genial moisture; when God said, -Be gathered now ye waters under Heaven -Into one place, and let dry land appear. -Immediately the mountains huge appear -Emergent, and their broad bare backs upheave -Into the clouds; their tops ascend the sky: -So high as heaved the tumid hills, so low -Down sunk a hollow bottom broad and deep, -Capacious bed of waters: Thither they -Hasted with glad precipitance, uprolled, -As drops on dust conglobing from the dry: -Part rise in crystal wall, or ridge direct, -For haste; such flight the great command impressed -On the swift floods: As armies at the call -Of trumpet (for of armies thou hast heard) -Troop to their standard; so the watery throng, -Wave rolling after wave, where way they found, -If steep, with torrent rapture, if through plain, -Soft-ebbing; nor withstood them rock or hill; -But they, or under ground, or circuit wide -With serpent errour wandering, found their way, -And on the washy oose deep channels wore; -Easy, ere God had bid the ground be dry, -All but within those banks, where rivers now -Stream, and perpetual draw their humid train. -The dry land, Earth; and the great receptacle -Of congregated waters, he called Seas: -And saw that it was good; and said, Let the Earth -Put forth the verdant grass, herb yielding seed, -And fruit-tree yielding fruit after her kind, -Whose seed is in herself upon the Earth. -He scarce had said, when the bare Earth, till then -Desart and bare, unsightly, unadorned, -Brought forth the tender grass, whose verdure clad -Her universal face with pleasant green; -Then herbs of every leaf, that sudden flowered -Opening their various colours, and made gay -Her bosom, smelling sweet: and, these scarce blown, -Forth flourished thick the clustering vine, forth crept -The swelling gourd, up stood the corny reed -Embattled in her field, and the humble shrub, -And bush with frizzled hair implicit: Last -Rose, as in dance, the stately trees, and spread -Their branches hung with copious fruit, or gemmed -Their blossoms: With high woods the hills were crowned; -With tufts the valleys, and each fountain side; -With borders long the rivers: that Earth now -Seemed like to Heaven, a seat where Gods might dwell, -Or wander with delight, and love to haunt -Her sacred shades: though God had yet not rained -Upon the Earth, and man to till the ground -None was; but from the Earth a dewy mist -Went up, and watered all the ground, and each -Plant of the field; which, ere it was in the Earth, -God made, and every herb, before it grew -On the green stem: God saw that it was good: -So even and morn recorded the third day. -Again the Almighty spake, Let there be lights -High in the expanse of Heaven, to divide -The day from night; and let them be for signs, -For seasons, and for days, and circling years; -And let them be for lights, as I ordain -Their office in the firmament of Heaven, -To give light on the Earth; and it was so. -And God made two great lights, great for their use -To Man, the greater to have rule by day, -The less by night, altern; and made the stars, -And set them in the firmament of Heaven -To illuminate the Earth, and rule the day -In their vicissitude, and rule the night, -And light from darkness to divide. God saw, -Surveying his great work, that it was good: -For of celestial bodies first the sun -A mighty sphere he framed, unlightsome first, -Though of ethereal mould: then formed the moon -Globose, and every magnitude of stars, -And sowed with stars the Heaven, thick as a field: -Of light by far the greater part he took, -Transplanted from her cloudy shrine, and placed -In the sun's orb, made porous to receive -And drink the liquid light; firm to retain -Her gathered beams, great palace now of light. -Hither, as to their fountain, other stars -Repairing, in their golden urns draw light, -And hence the morning-planet gilds her horns; -By tincture or reflection they augment -Their small peculiar, though from human sight -So far remote, with diminution seen, -First in his east the glorious lamp was seen, -Regent of day, and all the horizon round -Invested with bright rays, jocund to run -His longitude through Heaven's high road; the gray -Dawn, and the Pleiades, before him danced, -Shedding sweet influence: Less bright the moon, -But opposite in levelled west was set, -His mirrour, with full face borrowing her light -From him; for other light she needed none -In that aspect, and still that distance keeps -Till night; then in the east her turn she shines, -Revolved on Heaven's great axle, and her reign -With thousand lesser lights dividual holds, -With thousand thousand stars, that then appeared -Spangling the hemisphere: Then first adorned -With their bright luminaries that set and rose, -Glad evening and glad morn crowned the fourth day. -And God said, Let the waters generate -Reptile with spawn abundant, living soul: -And let fowl fly above the Earth, with wings -Displayed on the open firmament of Heaven. -And God created the great whales, and each -Soul living, each that crept, which plenteously -The waters generated by their kinds; -And every bird of wing after his kind; -And saw that it was good, and blessed them, saying. -Be fruitful, multiply, and in the seas, -And lakes, and running streams, the waters fill; -And let the fowl be multiplied, on the Earth. -Forthwith the sounds and seas, each creek and bay, -With fry innumerable swarm, and shoals -Of fish that with their fins, and shining scales, -Glide under the green wave, in sculls that oft -Bank the mid sea: part single, or with mate, -Graze the sea-weed their pasture, and through groves -Of coral stray; or, sporting with quick glance, -Show to the sun their waved coats dropt with gold; -Or, in their pearly shells at ease, attend -Moist nutriment; or under rocks their food -In jointed armour watch: on smooth the seal -And bended dolphins play: part huge of bulk -Wallowing unwieldy, enormous in their gait, -Tempest the ocean: there leviathan, -Hugest of living creatures, on the deep -Stretched like a promontory sleeps or swims, -And seems a moving land; and at his gills -Draws in, and at his trunk spouts out, a sea. -Mean while the tepid caves, and fens, and shores, -Their brood as numerous hatch, from the egg that soon -Bursting with kindly rupture forth disclosed -Their callow young; but feathered soon and fledge -They summed their pens; and, soaring the air sublime, -With clang despised the ground, under a cloud -In prospect; there the eagle and the stork -On cliffs and cedar tops their eyries build: -Part loosely wing the region, part more wise -In common, ranged in figure, wedge their way, -Intelligent of seasons, and set forth -Their aery caravan, high over seas -Flying, and over lands, with mutual wing -Easing their flight; so steers the prudent crane -Her annual voyage, borne on winds; the air -Floats as they pass, fanned with unnumbered plumes: -From branch to branch the smaller birds with song -Solaced the woods, and spread their painted wings -Till even; nor then the solemn nightingale -Ceased warbling, but all night tun'd her soft lays: -Others, on silver lakes and rivers, bathed -Their downy breast; the swan with arched neck, -Between her white wings mantling proudly, rows -Her state with oary feet; yet oft they quit -The dank, and, rising on stiff pennons, tower -The mid aereal sky: Others on ground -Walked firm; the crested cock whose clarion sounds -The silent hours, and the other whose gay train -Adorns him, coloured with the florid hue -Of rainbows and starry eyes. The waters thus -With fish replenished, and the air with fowl, -Evening and morn solemnized the fifth day. -The sixth, and of creation last, arose -With evening harps and matin; when God said, -Let the Earth bring forth soul living in her kind, -Cattle, and creeping things, and beast of the Earth, -Each in their kind. The Earth obeyed, and straight -Opening her fertile womb teemed at a birth -Innumerous living creatures, perfect forms, -Limbed and full grown: Out of the ground up rose, -As from his lair, the wild beast where he wons -In forest wild, in thicket, brake, or den; -Among the trees in pairs they rose, they walked: -The cattle in the fields and meadows green: -Those rare and solitary, these in flocks -Pasturing at once, and in broad herds upsprung. -The grassy clods now calved; now half appeared -The tawny lion, pawing to get free -His hinder parts, then springs as broke from bonds, -And rampant shakes his brinded mane; the ounce, -The libbard, and the tiger, as the mole -Rising, the crumbled earth above them threw -In hillocks: The swift stag from under ground -Bore up his branching head: Scarce from his mould -Behemoth biggest born of earth upheaved -His vastness: Fleeced the flocks and bleating rose, -As plants: Ambiguous between sea and land -The river-horse, and scaly crocodile. -At once came forth whatever creeps the ground, -Insect or worm: those waved their limber fans -For wings, and smallest lineaments exact -In all the liveries decked of summer's pride -With spots of gold and purple, azure and green: -These, as a line, their long dimension drew, -Streaking the ground with sinuous trace; not all -Minims of nature; some of serpent-kind, -Wonderous in length and corpulence, involved -Their snaky folds, and added wings. First crept -The parsimonious emmet, provident -Of future; in small room large heart enclosed; -Pattern of just equality perhaps -Hereafter, joined in her popular tribes -Of commonalty: Swarming next appeared -The female bee, that feeds her husband drone -Deliciously, and builds her waxen cells -With honey stored: The rest are numberless, -And thou their natures knowest, and gavest them names, -Needless to thee repeated; nor unknown -The serpent, subtlest beast of all the field, -Of huge extent sometimes, with brazen eyes -And hairy mane terrifick, though to thee -Not noxious, but obedient at thy call. -Now Heaven in all her glory shone, and rolled -Her motions, as the great first Mover's hand -First wheeled their course: Earth in her rich attire -Consummate lovely smiled; air, water, earth, -By fowl, fish, beast, was flown, was swum, was walked, -Frequent; and of the sixth day yet remained: -There wanted yet the master-work, the end -Of all yet done; a creature, who, not prone -And brute as other creatures, but endued -With sanctity of reason, might erect -His stature, and upright with front serene -Govern the rest, self-knowing; and from thence -Magnanimous to correspond with Heaven, -But grateful to acknowledge whence his good -Descends, thither with heart, and voice, and eyes -Directed in devotion, to adore -And worship God Supreme, who made him chief -Of all his works: therefore the Omnipotent -Eternal Father (for where is not he -Present?) thus to his Son audibly spake. -Let us make now Man in our image, Man -In our similitude, and let them rule -Over the fish and fowl of sea and air, -Beast of the field, and over all the Earth, -And every creeping thing that creeps the ground. -This said, he formed thee, Adam, thee, O Man, -Dust of the ground, and in thy nostrils breathed -The breath of life; in his own image he -Created thee, in the image of God -Express; and thou becamest a living soul. -Male he created thee; but thy consort -Female, for race; then blessed mankind, and said, -Be fruitful, multiply, and fill the Earth; -Subdue it, and throughout dominion hold -Over fish of the sea, and fowl of the air, -And every living thing that moves on the Earth. -Wherever thus created, for no place -Is yet distinct by name, thence, as thou knowest, -He brought thee into this delicious grove, -This garden, planted with the trees of God, -Delectable both to behold and taste; -And freely all their pleasant fruit for food -Gave thee; all sorts are here that all the Earth yields, -Variety without end; but of the tree, -Which, tasted, works knowledge of good and evil, -Thou mayest not; in the day thou eatest, thou diest; -Death is the penalty imposed; beware, -And govern well thy appetite; lest Sin -Surprise thee, and her black attendant Death. -Here finished he, and all that he had made -Viewed, and behold all was entirely good; -So even and morn accomplished the sixth day: -Yet not till the Creator from his work -Desisting, though unwearied, up returned, -Up to the Heaven of Heavens, his high abode; -Thence to behold this new created world, -The addition of his empire, how it showed -In prospect from his throne, how good, how fair, -Answering his great idea. Up he rode -Followed with acclamation, and the sound -Symphonious of ten thousand harps, that tuned -Angelick harmonies: The earth, the air -Resounded, (thou rememberest, for thou heardst,) -The heavens and all the constellations rung, -The planets in their station listening stood, -While the bright pomp ascended jubilant. -Open, ye everlasting gates! they sung, -Open, ye Heavens! your living doors;let in -The great Creator from his work returned -Magnificent, his six days work, a World; -Open, and henceforth oft; for God will deign -To visit oft the dwellings of just men, -Delighted; and with frequent intercourse -Thither will send his winged messengers -On errands of supernal grace. So sung -The glorious train ascending: He through Heaven, -That opened wide her blazing portals, led -To God's eternal house direct the way; -A broad and ample road, whose dust is gold -And pavement stars, as stars to thee appear, -Seen in the galaxy, that milky way, -Which nightly, as a circling zone, thou seest -Powdered with stars. And now on Earth the seventh -Evening arose in Eden, for the sun -Was set, and twilight from the east came on, -Forerunning night; when at the holy mount -Of Heaven's high-seated top, the imperial throne -Of Godhead, fixed for ever firm and sure, -The Filial Power arrived, and sat him down -With his great Father; for he also went -Invisible, yet staid, (such privilege -Hath Omnipresence) and the work ordained, -Author and End of all things; and, from work -Now resting, blessed and hallowed the seventh day, -As resting on that day from all his work, -But not in silence holy kept: the harp -Had work and rested not; the solemn pipe, -And dulcimer, all organs of sweet stop, -All sounds on fret by string or golden wire, -Tempered soft tunings, intermixed with voice -Choral or unison: of incense clouds, -Fuming from golden censers, hid the mount. -Creation and the six days acts they sung: -Great are thy works, Jehovah! infinite -Thy power! what thought can measure thee, or tongue -Relate thee! Greater now in thy return -Than from the giant Angels: Thee that day -Thy thunders magnified; but to create -Is greater than created to destroy. -Who can impair thee, Mighty King, or bound -Thy empire! Easily the proud attempt -Of Spirits apostate, and their counsels vain, -Thou hast repelled; while impiously they thought -Thee to diminish, and from thee withdraw -The number of thy worshippers. Who seeks -To lessen thee, against his purpose serves -To manifest the more thy might: his evil -Thou usest, and from thence createst more good. -Witness this new-made world, another Heaven -From Heaven-gate not far, founded in view -On the clear hyaline, the glassy sea; -Of amplitude almost immense, with stars -Numerous, and every star perhaps a world -Of destined habitation; but thou knowest -Their seasons: among these the seat of Men, -Earth, with her nether ocean circumfused, -Their pleasant dwelling-place. Thrice happy Men, -And sons of Men, whom God hath thus advanced! -Created in his image, there to dwell -And worship him; and in reward to rule -Over his works, on earth, in sea, or air, -And multiply a race of worshippers -Holy and just: Thrice happy, if they know -Their happiness, and persevere upright! -So sung they, and the empyrean rung -With halleluiahs: Thus was sabbath kept. -And thy request think now fulfilled, that asked -How first this world and face of things began, -And what before thy memory was done -From the beginning; that posterity, -Informed by thee, might know: If else thou seekest -Aught, not surpassing human measure, say. - - - -Book VIII - - -The Angel ended, and in Adam's ear -So charming left his voice, that he a while -Thought him still speaking, still stood fixed to hear; -Then, as new waked, thus gratefully replied. -What thanks sufficient, or what recompence -Equal, have I to render thee, divine -Historian, who thus largely hast allayed -The thirst I had of knowledge, and vouchsafed -This friendly condescension to relate -Things, else by me unsearchable; now heard -With wonder, but delight, and, as is due, -With glory attributed to the high -Creator! Something yet of doubt remains, -Which only thy solution can resolve. -When I behold this goodly frame, this world, -Of Heaven and Earth consisting; and compute -Their magnitudes; this Earth, a spot, a grain, -An atom, with the firmament compared -And all her numbered stars, that seem to roll -Spaces incomprehensible, (for such -Their distance argues, and their swift return -Diurnal,) merely to officiate light -Round this opacous Earth, this punctual spot, -One day and night; in all her vast survey -Useless besides; reasoning I oft admire, -How Nature wise and frugal could commit -Such disproportions, with superfluous hand -So many nobler bodies to create, -Greater so manifold, to this one use, -For aught appears, and on their orbs impose -Such restless revolution day by day -Repeated; while the sedentary Earth, -That better might with far less compass move, -Served by more noble than herself, attains -Her end without least motion, and receives, -As tribute, such a sumless journey brought -Of incorporeal speed, her warmth and light; -Speed, to describe whose swiftness number fails. -So spake our sire, and by his countenance seemed -Entering on studious thoughts abstruse; which Eve -Perceiving, where she sat retired in sight, -With lowliness majestick from her seat, -And grace that won who saw to wish her stay, -Rose, and went forth among her fruits and flowers, -To visit how they prospered, bud and bloom, -Her nursery; they at her coming sprung, -And, touched by her fair tendance, gladlier grew. -Yet went she not, as not with such discourse -Delighted, or not capable her ear -Of what was high: such pleasure she reserved, -Adam relating, she sole auditress; -Her husband the relater she preferred -Before the Angel, and of him to ask -Chose rather; he, she knew, would intermix -Grateful digressions, and solve high dispute -With conjugal caresses: from his lip -Not words alone pleased her. O! when meet now -Such pairs, in love and mutual honour joined? -With Goddess-like demeanour forth she went, -Not unattended; for on her, as Queen, -A pomp of winning Graces waited still, -And from about her shot darts of desire -Into all eyes, to wish her still in sight. -And Raphael now, to Adam's doubt proposed, -Benevolent and facile thus replied. -To ask or search, I blame thee not; for Heaven -Is as the book of God before thee set, -Wherein to read his wonderous works, and learn -His seasons, hours, or days, or months, or years: -This to attain, whether Heaven move or Earth, -Imports not, if thou reckon right; the rest -From Man or Angel the great Architect -Did wisely to conceal, and not divulge -His secrets to be scanned by them who ought -Rather admire; or, if they list to try -Conjecture, he his fabrick of the Heavens -Hath left to their disputes, perhaps to move -His laughter at their quaint opinions wide -Hereafter; when they come to model Heaven -And calculate the stars, how they will wield -The mighty frame; how build, unbuild, contrive -To save appearances; how gird the sphere -With centrick and eccentrick scribbled o'er, -Cycle and epicycle, orb in orb: -Already by thy reasoning this I guess, -Who art to lead thy offspring, and supposest -That bodies bright and greater should not serve -The less not bright, nor Heaven such journeys run, -Earth sitting still, when she alone receives -The benefit: Consider first, that great -Or bright infers not excellence: the Earth -Though, in comparison of Heaven, so small, -Nor glistering, may of solid good contain -More plenty than the sun that barren shines; -Whose virtue on itself works no effect, -But in the fruitful Earth; there first received, -His beams, unactive else, their vigour find. -Yet not to Earth are those bright luminaries -Officious; but to thee, Earth's habitant. -And for the Heaven's wide circuit, let it speak -The Maker's high magnificence, who built -So spacious, and his line stretched out so far; -That Man may know he dwells not in his own; -An edifice too large for him to fill, -Lodged in a small partition; and the rest -Ordained for uses to his Lord best known. -The swiftness of those circles attribute, -Though numberless, to his Omnipotence, -That to corporeal substances could add -Speed almost spiritual: Me thou thinkest not slow, -Who since the morning-hour set out from Heaven -Where God resides, and ere mid-day arrived -In Eden; distance inexpressible -By numbers that have name. But this I urge, -Admitting motion in the Heavens, to show -Invalid that which thee to doubt it moved; -Not that I so affirm, though so it seem -To thee who hast thy dwelling here on Earth. -God, to remove his ways from human sense, -Placed Heaven from Earth so far, that earthly sight, -If it presume, might err in things too high, -And no advantage gain. What if the sun -Be center to the world; and other stars, -By his attractive virtue and their own -Incited, dance about him various rounds? -Their wandering course now high, now low, then hid, -Progressive, retrograde, or standing still, -In six thou seest; and what if seventh to these -The planet earth, so stedfast though she seem, -Insensibly three different motions move? -Which else to several spheres thou must ascribe, -Moved contrary with thwart obliquities; -Or save the sun his labour, and that swift -Nocturnal and diurnal rhomb supposed, -Invisible else above all stars, the wheel -Of day and night; which needs not thy belief, -If earth, industrious of herself, fetch day -Travelling east, and with her part averse -From the sun's beam meet night, her other part -Still luminous by his ray. What if that light, -Sent from her through the wide transpicuous air, -To the terrestrial moon be as a star, -Enlightening her by day, as she by night -This earth? reciprocal, if land be there, -Fields and inhabitants: Her spots thou seest -As clouds, and clouds may rain, and rain produce -Fruits in her softened soil for some to eat -Allotted there; and other suns perhaps, -With their attendant moons, thou wilt descry, -Communicating male and female light; -Which two great sexes animate the world, -Stored in each orb perhaps with some that live. -For such vast room in Nature unpossessed -By living soul, desart and desolate, -Only to shine, yet scarce to contribute -Each orb a glimpse of light, conveyed so far -Down to this habitable, which returns -Light back to them, is obvious to dispute. -But whether thus these things, or whether not; -But whether the sun, predominant in Heaven, -Rise on the earth; or earth rise on the sun; -He from the east his flaming road begin; -Or she from west her silent course advance, -With inoffensive pace that spinning sleeps -On her soft axle, while she paces even, -And bears thee soft with the smooth hair along; -Sollicit not thy thoughts with matters hid; -Leave them to God above; him serve, and fear! -Of other creatures, as him pleases best, -Wherever placed, let him dispose; joy thou -In what he gives to thee, this Paradise -And thy fair Eve; Heaven is for thee too high -To know what passes there; be lowly wise: -Think only what concerns thee, and thy being; -Dream not of other worlds, what creatures there -Live, in what state, condition, or degree; -Contented that thus far hath been revealed -Not of Earth only, but of highest Heaven. -To whom thus Adam, cleared of doubt, replied. -How fully hast thou satisfied me, pure -Intelligence of Heaven, Angel serene! -And, freed from intricacies, taught to live -The easiest way; nor with perplexing thoughts -To interrupt the sweet of life, from which -God hath bid dwell far off all anxious cares, -And not molest us; unless we ourselves -Seek them with wandering thoughts, and notions vain. -But apt the mind or fancy is to rove -Unchecked, and of her roving is no end; -Till warned, or by experience taught, she learn, -That, not to know at large of things remote -From use, obscure and subtle; but, to know -That which before us lies in daily life, -Is the prime wisdom: What is more, is fume, -Or emptiness, or fond impertinence: -And renders us, in things that most concern, -Unpractised, unprepared, and still to seek. -Therefore from this high pitch let us descend -A lower flight, and speak of things at hand -Useful; whence, haply, mention may arise -Of something not unseasonable to ask, -By sufferance, and thy wonted favour, deigned. -Thee I have heard relating what was done -Ere my remembrance: now, hear me relate -My story, which perhaps thou hast not heard; -And day is not yet spent; till then thou seest -How subtly to detain thee I devise; -Inviting thee to hear while I relate; -Fond! were it not in hope of thy reply: -For, while I sit with thee, I seem in Heaven; -And sweeter thy discourse is to my ear -Than fruits of palm-tree pleasantest to thirst -And hunger both, from labour, at the hour -Of sweet repast; they satiate, and soon fill, -Though pleasant; but thy words, with grace divine -Imbued, bring to their sweetness no satiety. -To whom thus Raphael answered heavenly meek. -Nor are thy lips ungraceful, Sire of men, -Nor tongue ineloquent; for God on thee -Abundantly his gifts hath also poured -Inward and outward both, his image fair: -Speaking, or mute, all comeliness and grace -Attends thee; and each word, each motion, forms; -Nor less think we in Heaven of thee on Earth -Than of our fellow-servant, and inquire -Gladly into the ways of God with Man: -For God, we see, hath honoured thee, and set -On Man his equal love: Say therefore on; -For I that day was absent, as befel, -Bound on a voyage uncouth and obscure, -Far on excursion toward the gates of Hell; -Squared in full legion (such command we had) -To see that none thence issued forth a spy, -Or enemy, while God was in his work; -Lest he, incensed at such eruption bold, -Destruction with creation might have mixed. -Not that they durst without his leave attempt; -But us he sends upon his high behests -For state, as Sovran King; and to inure -Our prompt obedience. Fast we found, fast shut, -The dismal gates, and barricadoed strong; -But long ere our approaching heard within -Noise, other than the sound of dance or song, -Torment, and loud lament, and furious rage. -Glad we returned up to the coasts of light -Ere sabbath-evening: so we had in charge. -But thy relation now; for I attend, -Pleased with thy words no less than thou with mine. -So spake the Godlike Power, and thus our Sire. -For Man to tell how human life began -Is hard; for who himself beginning knew -Desire with thee still longer to converse -Induced me. As new waked from soundest sleep, -Soft on the flowery herb I found me laid, -In balmy sweat; which with his beams the sun -Soon dried, and on the reeking moisture fed. -Straight toward Heaven my wondering eyes I turned, -And gazed a while the ample sky; till, raised -By quick instinctive motion, up I sprung, -As thitherward endeavouring, and upright -Stood on my feet: about me round I saw -Hill, dale, and shady woods, and sunny plains, -And liquid lapse of murmuring streams; by these, -Creatures that lived and moved, and walked, or flew; -Birds on the branches warbling; all things smiled; -With fragrance and with joy my heart o'erflowed. -Myself I then perused, and limb by limb -Surveyed, and sometimes went, and sometimes ran -With supple joints, as lively vigour led: -But who I was, or where, or from what cause, -Knew not; to speak I tried, and forthwith spake; -My tongue obeyed, and readily could name -Whate'er I saw. Thou Sun, said I, fair light, -And thou enlightened Earth, so fresh and gay, -Ye Hills, and Dales, ye Rivers, Woods, and Plains, -And ye that live and move, fair Creatures, tell, -Tell, if ye saw, how I came thus, how here?-- -Not of myself;--by some great Maker then, -In goodness and in power pre-eminent: -Tell me, how may I know him, how adore, -From whom I have that thus I move and live, -And feel that I am happier than I know.-- -While thus I called, and strayed I knew not whither, -From where I first drew air, and first beheld -This happy light; when, answer none returned, -On a green shady bank, profuse of flowers, -Pensive I sat me down: There gentle sleep -First found me, and with soft oppression seised -My droused sense, untroubled, though I thought -I then was passing to my former state -Insensible, and forthwith to dissolve: -When suddenly stood at my head a dream, -Whose inward apparition gently moved -My fancy to believe I yet had being, -And lived: One came, methought, of shape divine, -And said, 'Thy mansion wants thee, Adam; rise, -'First Man, of men innumerable ordained -'First Father! called by thee, I come thy guide -'To the garden of bliss, thy seat prepared.' -So saying, by the hand he took me raised, -And over fields and waters, as in air -Smooth-sliding without step, last led me up -A woody mountain; whose high top was plain, -A circuit wide, enclosed, with goodliest trees -Planted, with walks, and bowers; that what I saw -Of Earth before scarce pleasant seemed. Each tree, -Loaden with fairest fruit that hung to the eye -Tempting, stirred in me sudden appetite -To pluck and eat; whereat I waked, and found -Before mine eyes all real, as the dream -Had lively shadowed: Here had new begun -My wandering, had not he, who was my guide -Up hither, from among the trees appeared, -Presence Divine. Rejoicing, but with awe, -In adoration at his feet I fell -Submiss: He reared me, and 'Whom thou soughtest I am,' -Said mildly, 'Author of all this thou seest -'Above, or round about thee, or beneath. -'This Paradise I give thee, count it thine -'To till and keep, and of the fruit to eat: -'Of every tree that in the garden grows -'Eat freely with glad heart; fear here no dearth: -'But of the tree whose operation brings -'Knowledge of good and ill, which I have set -'The pledge of thy obedience and thy faith, -'Amid the garden by the tree of life, -'Remember what I warn thee, shun to taste, -'And shun the bitter consequence: for know, -'The day thou eatest thereof, my sole command -'Transgressed, inevitably thou shalt die, -'From that day mortal; and this happy state -'Shalt lose, expelled from hence into a world -'Of woe and sorrow.' Sternly he pronounced -The rigid interdiction, which resounds -Yet dreadful in mine ear, though in my choice -Not to incur; but soon his clear aspect -Returned, and gracious purpose thus renewed. -'Not only these fair bounds, but all the Earth -'To thee and to thy race I give; as lords -'Possess it, and all things that therein live, -'Or live in sea, or air; beast, fish, and fowl. -'In sign whereof, each bird and beast behold -'After their kinds; I bring them to receive -'From thee their names, and pay thee fealty -'With low subjection; understand the same -'Of fish within their watery residence, -'Not hither summoned, since they cannot change -'Their element, to draw the thinner air.' -As thus he spake, each bird and beast behold -Approaching two and two; these cowering low -With blandishment; each bird stooped on his wing. -I named them, as they passed, and understood -Their nature, with such knowledge God endued -My sudden apprehension: But in these -I found not what methought I wanted still; -And to the heavenly Vision thus presumed. -O, by what name, for thou above all these, -Above mankind, or aught than mankind higher, -Surpassest far my naming; how may I -Adore thee, Author of this universe, -And all this good to man? for whose well being -So amply, and with hands so liberal, -Thou hast provided all things: But with me -I see not who partakes. In solitude -What happiness, who can enjoy alone, -Or, all enjoying, what contentment find? -Thus I presumptuous; and the Vision bright, -As with a smile more brightened, thus replied. -What callest thou solitude? Is not the Earth -With various living creatures, and the air -Replenished, and all these at thy command -To come and play before thee? Knowest thou not -Their language and their ways? They also know, -And reason not contemptibly: With these -Find pastime, and bear rule; thy realm is large. -So spake the Universal Lord, and seemed -So ordering: I, with leave of speech implored, -And humble deprecation, thus replied. -Let not my words offend thee, Heavenly Power; -My Maker, be propitious while I speak. -Hast thou not made me here thy substitute, -And these inferiour far beneath me set? -Among unequals what society -Can sort, what harmony, or true delight? -Which must be mutual, in proportion due -Given and received; but, in disparity -The one intense, the other still remiss, -Cannot well suit with either, but soon prove -Tedious alike: Of fellowship I speak -Such as I seek, fit to participate -All rational delight: wherein the brute -Cannot be human consort: They rejoice -Each with their kind, lion with lioness; -So fitly them in pairs thou hast combined: -Much less can bird with beast, or fish with fowl -So well converse, nor with the ox the ape; -Worse then can man with beast, and least of all. -Whereto the Almighty answered, not displeased. -A nice and subtle happiness, I see, -Thou to thyself proposest, in the choice -Of thy associates, Adam! and wilt taste -No pleasure, though in pleasure, solitary. -What thinkest thou then of me, and this my state? -Seem I to thee sufficiently possessed -Of happiness, or not? who am alone -From all eternity; for none I know -Second to me or like, equal much less. -How have I then with whom to hold converse, -Save with the creatures which I made, and those -To me inferiour, infinite descents -Beneath what other creatures are to thee? -He ceased; I lowly answered. To attain -The highth and depth of thy eternal ways -All human thoughts come short, Supreme of things! -Thou in thyself art perfect, and in thee -Is no deficience found: Not so is Man, -But in degree; the cause of his desire -By conversation with his like to help -Or solace his defects. No need that thou -Shouldst propagate, already Infinite; -And through all numbers absolute, though One: -But Man by number is to manifest -His single imperfection, and beget -Like of his like, his image multiplied, -In unity defective; which requires -Collateral love, and dearest amity. -Thou in thy secresy although alone, -Best with thyself accompanied, seekest not -Social communication; yet, so pleased, -Canst raise thy creature to what highth thou wilt -Of union or communion, deified: -I, by conversing, cannot these erect -From prone; nor in their ways complacence find. -Thus I emboldened spake, and freedom used -Permissive, and acceptance found; which gained -This answer from the gracious Voice Divine. -Thus far to try thee, Adam, I was pleased; -And find thee knowing, not of beasts alone, -Which thou hast rightly named, but of thyself; -Expressing well the spirit within thee free, -My image, not imparted to the brute; -Whose fellowship therefore unmeet for thee -Good reason was thou freely shouldst dislike; -And be so minded still: I, ere thou spakest, -Knew it not good for Man to be alone; -And no such company as then thou sawest -Intended thee; for trial only brought, -To see how thou couldest judge of fit and meet: -What next I bring shall please thee, be assured, -Thy likeness, thy fit help, thy other self, -Thy wish exactly to thy heart's desire. -He ended, or I heard no more; for now -My earthly by his heavenly overpowered, -Which it had long stood under, strained to the highth -In that celestial colloquy sublime, -As with an object that excels the sense -Dazzled and spent, sunk down; and sought repair -Of sleep, which instantly fell on me, called -By Nature as in aid, and closed mine eyes. -Mine eyes he closed, but open left the cell -Of fancy, my internal sight; by which, -Abstract as in a trance, methought I saw, -Though sleeping, where I lay, and saw the shape -Still glorious before whom awake I stood: -Who stooping opened my left side, and took -From thence a rib, with cordial spirits warm, -And life-blood streaming fresh; wide was the wound, -But suddenly with flesh filled up and healed: -The rib he formed and fashioned with his hands; -Under his forming hands a creature grew, -Man-like, but different sex; so lovely fair, -That what seemed fair in all the world, seemed now -Mean, or in her summed up, in her contained -And in her looks; which from that time infused -Sweetness into my heart, unfelt before, -And into all things from her air inspired -The spirit of love and amorous delight. -She disappeared, and left me dark; I waked -To find her, or for ever to deplore -Her loss, and other pleasures all abjure: -When out of hope, behold her, not far off, -Such as I saw her in my dream, adorned -With what all Earth or Heaven could bestow -To make her amiable: On she came, -Led by her heavenly Maker, though unseen, -And guided by his voice; nor uninformed -Of nuptial sanctity, and marriage rites: -Grace was in all her steps, Heaven in her eye, -In every gesture dignity and love. -I, overjoyed, could not forbear aloud. -This turn hath made amends; thou hast fulfilled -Thy words, Creator bounteous and benign, -Giver of all things fair! but fairest this -Of all thy gifts! nor enviest. I now see -Bone of my bone, flesh of my flesh, myself -Before me: Woman is her name;of Man -Extracted: for this cause he shall forego -Father and mother, and to his wife adhere; -And they shall be one flesh, one heart, one soul. -She heard me thus; and though divinely brought, -Yet innocence, and virgin modesty, -Her virtue, and the conscience of her worth, -That would be wooed, and not unsought be won, -Not obvious, not obtrusive, but, retired, -The more desirable; or, to say all, -Nature herself, though pure of sinful thought, -Wrought in her so, that, seeing me, she turned: -I followed her; she what was honour knew, -And with obsequious majesty approved -My pleaded reason. To the nuptial bower -I led her blushing like the morn: All Heaven, -And happy constellations, on that hour -Shed their selectest influence; the Earth -Gave sign of gratulation, and each hill; -Joyous the birds; fresh gales and gentle airs -Whispered it to the woods, and from their wings -Flung rose, flung odours from the spicy shrub, -Disporting, till the amorous bird of night -Sung spousal, and bid haste the evening-star -On his hill top, to light the bridal lamp. -Thus have I told thee all my state, and brought -My story to the sum of earthly bliss, -Which I enjoy; and must confess to find -In all things else delight indeed, but such -As, used or not, works in the mind no change, -Nor vehement desire; these delicacies -I mean of taste, sight, smell, herbs, fruits, and flowers, -Walks, and the melody of birds: but here -Far otherwise, transported I behold, -Transported touch; here passion first I felt, -Commotion strange! in all enjoyments else -Superiour and unmoved; here only weak -Against the charm of Beauty's powerful glance. -Or Nature failed in me, and left some part -Not proof enough such object to sustain; -Or, from my side subducting, took perhaps -More than enough; at least on her bestowed -Too much of ornament, in outward show -Elaborate, of inward less exact. -For well I understand in the prime end -Of Nature her the inferiour, in the mind -And inward faculties, which most excel; -In outward also her resembling less -His image who made both, and less expressing -The character of that dominion given -O'er other creatures: Yet when I approach -Her loveliness, so absolute she seems -And in herself complete, so well to know -Her own, that what she wills to do or say, -Seems wisest, virtuousest, discreetest, best: -All higher knowledge in her presence falls -Degraded; Wisdom in discourse with her -Loses discountenanced, and like Folly shows; -Authority and Reason on her wait, -As one intended first, not after made -Occasionally; and, to consummate all, -Greatness of mind and Nobleness their seat -Build in her loveliest, and create an awe -About her, as a guard angelick placed. -To whom the Angel with contracted brow. -Accuse not Nature, she hath done her part; -Do thou but thine; and be not diffident -Of Wisdom; she deserts thee not, if thou -Dismiss not her, when most thou needest her nigh, -By attributing overmuch to things -Less excellent, as thou thyself perceivest. -For, what admirest thou, what transports thee so, -An outside? fair, no doubt, and worthy well -Thy cherishing, thy honouring, and thy love; -Not thy subjection: Weigh with her thyself; -Then value: Oft-times nothing profits more -Than self-esteem, grounded on just and right -Well managed; of that skill the more thou knowest, -The more she will acknowledge thee her head, -And to realities yield all her shows: -Made so adorn for thy delight the more, -So awful, that with honour thou mayest love -Thy mate, who sees when thou art seen least wise. -But if the sense of touch, whereby mankind -Is propagated, seem such dear delight -Beyond all other; think the same vouchsafed -To cattle and each beast; which would not be -To them made common and divulged, if aught -Therein enjoyed were worthy to subdue -The soul of man, or passion in him move. -What higher in her society thou findest -Attractive, human, rational, love still; -In loving thou dost well, in passion not, -Wherein true love consists not: Love refines -The thoughts, and heart enlarges; hath his seat -In reason, and is judicious; is the scale -By which to heavenly love thou mayest ascend, -Not sunk in carnal pleasure; for which cause, -Among the beasts no mate for thee was found. -To whom thus, half abashed, Adam replied. -Neither her outside formed so fair, nor aught -In procreation common to all kinds, -(Though higher of the genial bed by far, -And with mysterious reverence I deem,) -So much delights me, as those graceful acts, -Those thousand decencies, that daily flow -From all her words and actions mixed with love -And sweet compliance, which declare unfeigned -Union of mind, or in us both one soul; -Harmony to behold in wedded pair -More grateful than harmonious sound to the ear. -Yet these subject not; I to thee disclose -What inward thence I feel, not therefore foiled, -Who meet with various objects, from the sense -Variously representing; yet, still free, -Approve the best, and follow what I approve. -To love, thou blamest me not; for Love, thou sayest, -Leads up to Heaven, is both the way and guide; -Bear with me then, if lawful what I ask: -Love not the heavenly Spirits, and how their love -Express they? by looks only? or do they mix -Irradiance, virtual or immediate touch? -To whom the Angel, with a smile that glowed -Celestial rosy red, Love's proper hue, -Answered. Let it suffice thee that thou knowest -Us happy, and without love no happiness. -Whatever pure thou in the body enjoyest, -(And pure thou wert created) we enjoy -In eminence; and obstacle find none -Of membrane, joint, or limb, exclusive bars; -Easier than air with air, if Spirits embrace, -Total they mix, union of pure with pure -Desiring, nor restrained conveyance need, -As flesh to mix with flesh, or soul with soul. -But I can now no more; the parting sun -Beyond the Earth's green Cape and verdant Isles -Hesperian sets, my signal to depart. -Be strong, live happy, and love! But, first of all, -Him, whom to love is to obey, and keep -His great command; take heed lest passion sway -Thy judgement to do aught, which else free will -Would not admit: thine, and of all thy sons, -The weal or woe in thee is placed; beware! -I in thy persevering shall rejoice, -And all the Blest: Stand fast;to stand or fall -Free in thine own arbitrement it lies. -Perfect within, no outward aid require; -And all temptation to transgress repel. -So saying, he arose; whom Adam thus -Followed with benediction. Since to part, -Go, heavenly guest, ethereal Messenger, -Sent from whose sovran goodness I adore! -Gentle to me and affable hath been -Thy condescension, and shall be honoured ever -With grateful memory: Thou to mankind -Be good and friendly still, and oft return! -So parted they; the Angel up to Heaven -From the thick shade, and Adam to his bower. - - - -Book IX - - -No more of talk where God or Angel guest -With Man, as with his friend, familiar us'd, -To sit indulgent, and with him partake -Rural repast; permitting him the while -Venial discourse unblam'd. I now must change -Those notes to tragick; foul distrust, and breach -Disloyal on the part of Man, revolt, -And disobedience: on the part of Heaven -Now alienated, distance and distaste, -Anger and just rebuke, and judgement given, -That brought into this world a world of woe, -Sin and her shadow Death, and Misery -Death's harbinger: Sad talk!yet argument -Not less but more heroick than the wrath -Of stern Achilles on his foe pursued -Thrice fugitive about Troy wall; or rage -Of Turnus for Lavinia disespous'd; -Or Neptune's ire, or Juno's, that so long -Perplexed the Greek, and Cytherea's son: - - 00482129 -If answerable style I can obtain -Of my celestial patroness, who deigns -Her nightly visitation unimplor'd, -And dictates to me slumbering; or inspires -Easy my unpremeditated verse: -Since first this subject for heroick song -Pleas'd me long choosing, and beginning late; -Not sedulous by nature to indite -Wars, hitherto the only argument -Heroick deem'd chief mastery to dissect -With long and tedious havock fabled knights -In battles feign'd; the better fortitude -Of patience and heroick martyrdom -Unsung; or to describe races and games, -Or tilting furniture, imblazon'd shields, -Impresses quaint, caparisons and steeds, -Bases and tinsel trappings, gorgeous knights -At joust and tournament; then marshall'd feast -Serv'd up in hall with sewers and seneshals; -The skill of artifice or office mean, -Not that which justly gives heroick name -To person, or to poem. Me, of these -Nor skill'd nor studious, higher argument -Remains; sufficient of itself to raise -That name, unless an age too late, or cold -Climate, or years, damp my intended wing -Depress'd; and much they may, if all be mine, -Not hers, who brings it nightly to my ear. -The sun was sunk, and after him the star -Of Hesperus, whose office is to bring -Twilight upon the earth, short arbiter -"twixt day and night, and now from end to end -Night's hemisphere had veil'd the horizon round: -When satan, who late fled before the threats -Of Gabriel out of Eden, now improv'd -In meditated fraud and malice, bent -On Man's destruction, maugre what might hap -Of heavier on himself, fearless returned -From compassing the earth; cautious of day, -Since Uriel, regent of the sun, descried -His entrance, and foreworned the Cherubim -That kept their watch; thence full of anguish driven, -The space of seven continued nights he rode -With darkness; thrice the equinoctial line -He circled; four times crossed the car of night -From pole to pole, traversing each colure; -On the eighth returned; and, on the coast averse -From entrance or Cherubick watch, by stealth -Found unsuspected way. There was a place, -Now not, though sin, not time, first wrought the change, -Where Tigris, at the foot of Paradise, -Into a gulf shot under ground, till part -Rose up a fountain by the tree of life: -In with the river sunk, and with it rose -Satan, involved in rising mist; then sought -Where to lie hid; sea he had searched, and land, -From Eden over Pontus and the pool -Maeotis, up beyond the river Ob; -Downward as far antarctick; and in length, -West from Orontes to the ocean barred -At Darien ; thence to the land where flows -Ganges and Indus: Thus the orb he roamed -With narrow search; and with inspection deep -Considered every creature, which of all -Most opportune might serve his wiles; and found -The Serpent subtlest beast of all the field. -Him after long debate, irresolute -Of thoughts revolved, his final sentence chose -Fit vessel, fittest imp of fraud, in whom -To enter, and his dark suggestions hide -From sharpest sight: for, in the wily snake -Whatever sleights, none would suspicious mark, -As from his wit and native subtlety -Proceeding; which, in other beasts observed, -Doubt might beget of diabolick power -Active within, beyond the sense of brute. -Thus he resolved, but first from inward grief -His bursting passion into plaints thus poured. -More justly, seat worthier of Gods, as built -With second thoughts, reforming what was old! -O Earth, how like to Heaven, if not preferred -For what God, after better, worse would build? -Terrestrial Heaven, danced round by other Heavens -That shine, yet bear their bright officious lamps, -Light above light, for thee alone, as seems, -In thee concentring all their precious beams -Of sacred influence! As God in Heaven -Is center, yet extends to all; so thou, -Centring, receivest from all those orbs: in thee, -Not in themselves, all their known virtue appears -Productive in herb, plant, and nobler birth -Of creatures animate with gradual life -Of growth, sense, reason, all summed up in Man. -With what delight could I have walked thee round, -If I could joy in aught, sweet interchange -Of hill, and valley, rivers, woods, and plains, -Now land, now sea and shores with forest crowned, -Rocks, dens, and caves! But I in none of these -Find place or refuge; and the more I see -Pleasures about me, so much more I feel -Torment within me, as from the hateful siege -Of contraries: all good to me becomes -Bane, and in Heaven much worse would be my state. -But neither here seek I, no nor in Heaven -To dwell, unless by mastering Heaven's Supreme; -Nor hope to be myself less miserable -By what I seek, but others to make such -As I, though thereby worse to me redound: -For only in destroying I find ease -To my relentless thoughts; and, him destroyed, -Or won to what may work his utter loss, -For whom all this was made, all this will soon -Follow, as to him linked in weal or woe; -In woe then; that destruction wide may range: -To me shall be the glory sole among -The infernal Powers, in one day to have marred -What he, Almighty styled, six nights and days -Continued making; and who knows how long -Before had been contriving? though perhaps -Not longer than since I, in one night, freed -From servitude inglorious well nigh half -The angelick name, and thinner left the throng -Of his adorers: He, to be avenged, -And to repair his numbers thus impaired, -Whether such virtue spent of old now failed -More Angels to create, if they at least -Are his created, or, to spite us more, -Determined to advance into our room -A creature formed of earth, and him endow, -Exalted from so base original, -With heavenly spoils, our spoils: What he decreed, -He effected; Man he made, and for him built -Magnificent this world, and earth his seat, -Him lord pronounced; and, O indignity! -Subjected to his service angel-wings, -And flaming ministers to watch and tend -Their earthly charge: Of these the vigilance -I dread; and, to elude, thus wrapt in mist -Of midnight vapour glide obscure, and pry -In every bush and brake, where hap may find -The serpent sleeping; in whose mazy folds -To hide me, and the dark intent I bring. -O foul descent! that I, who erst contended -With Gods to sit the highest, am now constrained -Into a beast; and, mixed with bestial slime, -This essence to incarnate and imbrute, -That to the highth of Deity aspired! -But what will not ambition and revenge -Descend to? Who aspires, must down as low -As high he soared; obnoxious, first or last, -To basest things. Revenge, at first though sweet, -Bitter ere long, back on itself recoils: -Let it; I reck not, so it light well aimed, -Since higher I fall short, on him who next -Provokes my envy, this new favourite -Of Heaven, this man of clay, son of despite, -Whom, us the more to spite, his Maker raised -From dust: Spite then with spite is best repaid. -So saying, through each thicket dank or dry, -Like a black mist low-creeping, he held on -His midnight-search, where soonest he might find -The serpent; him fast-sleeping soon he found -In labyrinth of many a round self-rolled, -His head the midst, well stored with subtile wiles: -Not yet in horrid shade or dismal den, -Nor nocent yet; but, on the grassy herb, -Fearless unfeared he slept: in at his mouth -The Devil entered; and his brutal sense, -In heart or head, possessing, soon inspired -With act intelligential; but his sleep -Disturbed not, waiting close the approach of morn. -Now, when as sacred light began to dawn -In Eden on the humid flowers, that breathed -Their morning incense, when all things, that breathe, -From the Earth's great altar send up silent praise -To the Creator, and his nostrils fill -With grateful smell, forth came the human pair, -And joined their vocal worship to the quire -Of creatures wanting voice; that done, partake -The season prime for sweetest scents and airs: -Then commune, how that day they best may ply -Their growing work: for much their work out-grew -The hands' dispatch of two gardening so wide, -And Eve first to her husband thus began. -Adam, well may we labour still to dress -This garden, still to tend plant, herb, and flower, -Our pleasant task enjoined; but, till more hands -Aid us, the work under our labour grows, -Luxurious by restraint; what we by day -Lop overgrown, or prune, or prop, or bind, -One night or two with wanton growth derides -Tending to wild. Thou therefore now advise, -Or bear what to my mind first thoughts present: -Let us divide our labours; thou, where choice -Leads thee, or where most needs, whether to wind -The woodbine round this arbour, or direct -The clasping ivy where to climb; while I, -In yonder spring of roses intermixed -With myrtle, find what to redress till noon: -For, while so near each other thus all day -Our task we choose, what wonder if so near -Looks intervene and smiles, or object new -Casual discourse draw on; which intermits -Our day's work, brought to little, though begun -Early, and the hour of supper comes unearned? -To whom mild answer Adam thus returned. -Sole Eve, associate sole, to me beyond -Compare above all living creatures dear! -Well hast thou motioned, well thy thoughts employed, -How we might best fulfil the work which here -God hath assigned us; nor of me shalt pass -Unpraised: for nothing lovelier can be found -In woman, than to study houshold good, -And good works in her husband to promote. -Yet not so strictly hath our Lord imposed -Labour, as to debar us when we need -Refreshment, whether food, or talk between, -Food of the mind, or this sweet intercourse -Of looks and smiles; for smiles from reason flow, -To brute denied, and are of love the food; -Love, not the lowest end of human life. -For not to irksome toil, but to delight, -He made us, and delight to reason joined. -These paths and bowers doubt not but our joint hands -Will keep from wilderness with ease, as wide -As we need walk, till younger hands ere long -Assist us; But, if much converse perhaps -Thee satiate, to short absence I could yield: -For solitude sometimes is best society, -And short retirement urges sweet return. -But other doubt possesses me, lest harm -Befall thee severed from me; for thou knowest -What hath been warned us, what malicious foe -Envying our happiness, and of his own -Despairing, seeks to work us woe and shame -By sly assault; and somewhere nigh at hand -Watches, no doubt, with greedy hope to find -His wish and best advantage, us asunder; -Hopeless to circumvent us joined, where each -To other speedy aid might lend at need: -Whether his first design be to withdraw -Our fealty from God, or to disturb -Conjugal love, than which perhaps no bliss -Enjoyed by us excites his envy more; -Or this, or worse, leave not the faithful side -That gave thee being, still shades thee, and protects. -The wife, where danger or dishonour lurks, -Safest and seemliest by her husband stays, -Who guards her, or with her the worst endures. -To whom the virgin majesty of Eve, -As one who loves, and some unkindness meets, -With sweet austere composure thus replied. -Offspring of Heaven and Earth, and all Earth's Lord! -That such an enemy we have, who seeks -Our ruin, both by thee informed I learn, -And from the parting Angel over-heard, -As in a shady nook I stood behind, -Just then returned at shut of evening flowers. -But, that thou shouldst my firmness therefore doubt -To God or thee, because we have a foe -May tempt it, I expected not to hear. -His violence thou fearest not, being such -As we, not capable of death or pain, -Can either not receive, or can repel. -His fraud is then thy fear; which plain infers -Thy equal fear, that my firm faith and love -Can by his fraud be shaken or seduced; -Thoughts, which how found they harbour in thy breast, -Adam, mis-thought of her to thee so dear? -To whom with healing words Adam replied. -Daughter of God and Man, immortal Eve! -For such thou art; from sin and blame entire: -Not diffident of thee do I dissuade -Thy absence from my sight, but to avoid -The attempt itself, intended by our foe. -For he who tempts, though in vain, at least asperses -The tempted with dishonour foul; supposed -Not incorruptible of faith, not proof -Against temptation: Thou thyself with scorn -And anger wouldst resent the offered wrong, -Though ineffectual found: misdeem not then, -If such affront I labour to avert -From thee alone, which on us both at once -The enemy, though bold, will hardly dare; -Or daring, first on me the assault shall light. -Nor thou his malice and false guile contemn; -Subtle he needs must be, who could seduce -Angels; nor think superfluous other's aid. -I, from the influence of thy looks, receive -Access in every virtue; in thy sight -More wise, more watchful, stronger, if need were -Of outward strength; while shame, thou looking on, -Shame to be overcome or over-reached, -Would utmost vigour raise, and raised unite. -Why shouldst not thou like sense within thee feel -When I am present, and thy trial choose -With me, best witness of thy virtue tried? -So spake domestick Adam in his care -And matrimonial love; but Eve, who thought -Less attributed to her faith sincere, -Thus her reply with accent sweet renewed. -If this be our condition, thus to dwell -In narrow circuit straitened by a foe, -Subtle or violent, we not endued -Single with like defence, wherever met; -How are we happy, still in fear of harm? -But harm precedes not sin: only our foe, -Tempting, affronts us with his foul esteem -Of our integrity: his foul esteem -Sticks no dishonour on our front, but turns -Foul on himself; then wherefore shunned or feared -By us? who rather double honour gain -From his surmise proved false; find peace within, -Favour from Heaven, our witness, from the event. -And what is faith, love, virtue, unassayed -Alone, without exteriour help sustained? -Let us not then suspect our happy state -Left so imperfect by the Maker wise, -As not secure to single or combined. -Frail is our happiness, if this be so, -And Eden were no Eden, thus exposed. -To whom thus Adam fervently replied. -O Woman, best are all things as the will -Of God ordained them: His creating hand -Nothing imperfect or deficient left -Of all that he created, much less Man, -Or aught that might his happy state secure, -Secure from outward force; within himself -The danger lies, yet lies within his power: -Against his will he can receive no harm. -But God left free the will; for what obeys -Reason, is free; and Reason he made right, -But bid her well be ware, and still erect; -Lest, by some fair-appearing good surprised, -She dictate false; and mis-inform the will -To do what God expressly hath forbid. -Not then mistrust, but tender love, enjoins, -That I should mind thee oft; and mind thou me. -Firm we subsist, yet possible to swerve; -Since Reason not impossibly may meet -Some specious object by the foe suborned, -And fall into deception unaware, -Not keeping strictest watch, as she was warned. -Seek not temptation then, which to avoid -Were better, and most likely if from me -Thou sever not: Trial will come unsought. -Wouldst thou approve thy constancy, approve -First thy obedience; the other who can know, -Not seeing thee attempted, who attest? -But, if thou think, trial unsought may find -Us both securer than thus warned thou seemest, -Go; for thy stay, not free, absents thee more; -Go in thy native innocence, rely -On what thou hast of virtue; summon all! -For God towards thee hath done his part, do thine. -So spake the patriarch of mankind; but Eve -Persisted; yet submiss, though last, replied. -With thy permission then, and thus forewarned -Chiefly by what thy own last reasoning words -Touched only; that our trial, when least sought, -May find us both perhaps far less prepared, -The willinger I go, nor much expect -A foe so proud will first the weaker seek; -So bent, the more shall shame him his repulse. -Thus saying, from her husband's hand her hand -Soft she withdrew; and, like a Wood-Nymph light, -Oread or Dryad, or of Delia's train, -Betook her to the groves; but Delia's self -In gait surpassed, and Goddess-like deport, -Though not as she with bow and quiver armed, -But with such gardening tools as Art yet rude, -Guiltless of fire, had formed, or Angels brought. -To Pales, or Pomona, thus adorned, -Likest she seemed, Pomona when she fled -Vertumnus, or to Ceres in her prime, -Yet virgin of Proserpina from Jove. -Her long with ardent look his eye pursued -Delighted, but desiring more her stay. -Oft he to her his charge of quick return -Repeated; she to him as oft engaged -To be returned by noon amid the bower, -And all things in best order to invite -Noontide repast, or afternoon's repose. -O much deceived, much failing, hapless Eve, -Of thy presumed return! event perverse! -Thou never from that hour in Paradise -Foundst either sweet repast, or sound repose; -Such ambush, hid among sweet flowers and shades, -Waited with hellish rancour imminent -To intercept thy way, or send thee back -Despoiled of innocence, of faith, of bliss! -For now, and since first break of dawn, the Fiend, -Mere serpent in appearance, forth was come; -And on his quest, where likeliest he might find -The only two of mankind, but in them -The whole included race, his purposed prey. -In bower and field he sought, where any tuft -Of grove or garden-plot more pleasant lay, -Their tendance, or plantation for delight; -By fountain or by shady rivulet -He sought them both, but wished his hap might find -Eve separate; he wished, but not with hope -Of what so seldom chanced; when to his wish, -Beyond his hope, Eve separate he spies, -Veiled in a cloud of fragrance, where she stood, -Half spied, so thick the roses blushing round -About her glowed, oft stooping to support -Each flower of slender stalk, whose head, though gay -Carnation, purple, azure, or specked with gold, -Hung drooping unsustained; them she upstays -Gently with myrtle band, mindless the while -Herself, though fairest unsupported flower, -From her best prop so far, and storm so nigh. -Nearer he drew, and many a walk traversed -Of stateliest covert, cedar, pine, or palm; -Then voluble and bold, now hid, now seen, -Among thick-woven arborets, and flowers -Imbordered on each bank, the hand of Eve: -Spot more delicious than those gardens feigned -Or of revived Adonis, or renowned -Alcinous, host of old Laertes' son; -Or that, not mystick, where the sapient king -Held dalliance with his fair Egyptian spouse. -Much he the place admired, the person more. -As one who long in populous city pent, -Where houses thick and sewers annoy the air, -Forth issuing on a summer's morn, to breathe -Among the pleasant villages and farms -Adjoined, from each thing met conceives delight; -The smell of grain, or tedded grass, or kine, -Or dairy, each rural sight, each rural sound; -If chance, with nymph-like step, fair virgin pass, -What pleasing seemed, for her now pleases more; -She most, and in her look sums all delight: -Such pleasure took the Serpent to behold -This flowery plat, the sweet recess of Eve -Thus early, thus alone: Her heavenly form -Angelick, but more soft, and feminine, -Her graceful innocence, her every air -Of gesture, or least action, overawed -His malice, and with rapine sweet bereaved -His fierceness of the fierce intent it brought: -That space the Evil-one abstracted stood -From his own evil, and for the time remained -Stupidly good; of enmity disarmed, -Of guile, of hate, of envy, of revenge: -But the hot Hell that always in him burns, -Though in mid Heaven, soon ended his delight, -And tortures him now more, the more he sees -Of pleasure, not for him ordained: then soon -Fierce hate he recollects, and all his thoughts -Of mischief, gratulating, thus excites. -Thoughts, whither have ye led me! with what sweet -Compulsion thus transported, to forget -What hither brought us! hate, not love;nor hope -Of Paradise for Hell, hope here to taste -Of pleasure; but all pleasure to destroy, -Save what is in destroying; other joy -To me is lost. Then, let me not let pass -Occasion which now smiles; behold alone -The woman, opportune to all attempts, -Her husband, for I view far round, not nigh, -Whose higher intellectual more I shun, -And strength, of courage haughty, and of limb -Heroick built, though of terrestrial mould; -Foe not informidable! exempt from wound, -I not; so much hath Hell debased, and pain -Enfeebled me, to what I was in Heaven. -She fair, divinely fair, fit love for Gods! -Not terrible, though terrour be in love -And beauty, not approached by stronger hate, -Hate stronger, under show of love well feigned; -The way which to her ruin now I tend. -So spake the enemy of mankind, enclosed -In serpent, inmate bad! and toward Eve -Addressed his way: not with indented wave, -Prone on the ground, as since; but on his rear, -Circular base of rising folds, that towered -Fold above fold, a surging maze! his head -Crested aloft, and carbuncle his eyes; -With burnished neck of verdant gold, erect -Amidst his circling spires, that on the grass -Floated redundant: pleasing was his shape -And lovely; never since of serpent-kind -Lovelier, not those that in Illyria changed, -Hermione and Cadmus, or the god -In Epidaurus; nor to which transformed -Ammonian Jove, or Capitoline, was seen; -He with Olympias; this with her who bore -Scipio, the highth of Rome. With tract oblique -At first, as one who sought access, but feared -To interrupt, side-long he works his way. -As when a ship, by skilful steersmen wrought -Nigh river's mouth or foreland, where the wind -Veers oft, as oft so steers, and shifts her sail: -So varied he, and of his tortuous train -Curled many a wanton wreath in sight of Eve, -To lure her eye; she, busied, heard the sound -Of rusling leaves, but minded not, as used -To such disport before her through the field, -From every beast; more duteous at her call, -Than at Circean call the herd disguised. -He, bolder now, uncalled before her stood, -But as in gaze admiring: oft he bowed -His turret crest, and sleek enamelled neck, -Fawning; and licked the ground whereon she trod. -His gentle dumb expression turned at length -The eye of Eve to mark his play; he, glad -Of her attention gained, with serpent-tongue -Organick, or impulse of vocal air, -His fraudulent temptation thus began. -Wonder not, sovran Mistress, if perhaps -Thou canst, who art sole wonder! much less arm -Thy looks, the Heaven of mildness, with disdain, -Displeased that I approach thee thus, and gaze -Insatiate; I thus single;nor have feared -Thy awful brow, more awful thus retired. -Fairest resemblance of thy Maker fair, -Thee all things living gaze on, all things thine -By gift, and thy celestial beauty adore -With ravishment beheld! there best beheld, -Where universally admired; but here -In this enclosure wild, these beasts among, -Beholders rude, and shallow to discern -Half what in thee is fair, one man except, -Who sees thee? and what is one? who should be seen -A Goddess among Gods, adored and served -By Angels numberless, thy daily train. -So glozed the Tempter, and his proem tuned: -Into the heart of Eve his words made way, -Though at the voice much marvelling; at length, -Not unamazed, she thus in answer spake. -What may this mean? language of man pronounced -By tongue of brute, and human sense expressed? -The first, at least, of these I thought denied -To beasts; whom God, on their creation-day, -Created mute to all articulate sound: -The latter I demur; for in their looks -Much reason, and in their actions, oft appears. -Thee, Serpent, subtlest beast of all the field -I knew, but not with human voice endued; -Redouble then this miracle, and say, -How camest thou speakable of mute, and how -To me so friendly grown above the rest -Of brutal kind, that daily are in sight? -Say, for such wonder claims attention due. -To whom the guileful Tempter thus replied. -Empress of this fair world, resplendent Eve! -Easy to me it is to tell thee all -What thou commandest; and right thou shouldst be obeyed: -I was at first as other beasts that graze -The trodden herb, of abject thoughts and low, -As was my food; nor aught but food discerned -Or sex, and apprehended nothing high: -Till, on a day roving the field, I chanced -A goodly tree far distant to behold -Loaden with fruit of fairest colours mixed, -Ruddy and gold: I nearer drew to gaze; -When from the boughs a savoury odour blown, -Grateful to appetite, more pleased my sense -Than smell of sweetest fennel, or the teats -Of ewe or goat dropping with milk at even, -Unsucked of lamb or kid, that tend their play. -To satisfy the sharp desire I had -Of tasting those fair apples, I resolved -Not to defer; hunger and thirst at once, -Powerful persuaders, quickened at the scent -Of that alluring fruit, urged me so keen. -About the mossy trunk I wound me soon; -For, high from ground, the branches would require -Thy utmost reach or Adam's: Round the tree -All other beasts that saw, with like desire -Longing and envying stood, but could not reach. -Amid the tree now got, where plenty hung -Tempting so nigh, to pluck and eat my fill -I spared not; for, such pleasure till that hour, -At feed or fountain, never had I found. -Sated at length, ere long I might perceive -Strange alteration in me, to degree -Of reason in my inward powers; and speech -Wanted not long; though to this shape retained. -Thenceforth to speculations high or deep -I turned my thoughts, and with capacious mind -Considered all things visible in Heaven, -Or Earth, or Middle; all things fair and good: -But all that fair and good in thy divine -Semblance, and in thy beauty's heavenly ray, -United I beheld; no fair to thine -Equivalent or second! which compelled -Me thus, though importune perhaps, to come -And gaze, and worship thee of right declared -Sovran of creatures, universal Dame! -So talked the spirited sly Snake; and Eve, -Yet more amazed, unwary thus replied. -Serpent, thy overpraising leaves in doubt -The virtue of that fruit, in thee first proved: -But say, where grows the tree? from hence how far? -For many are the trees of God that grow -In Paradise, and various, yet unknown -To us; in such abundance lies our choice, -As leaves a greater store of fruit untouched, -Still hanging incorruptible, till men -Grow up to their provision, and more hands -Help to disburden Nature of her birth. -To whom the wily Adder, blithe and glad. -Empress, the way is ready, and not long; -Beyond a row of myrtles, on a flat, -Fast by a fountain, one small thicket past -Of blowing myrrh and balm: if thou accept -My conduct, I can bring thee thither soon -Lead then, said Eve. He, leading, swiftly rolled -In tangles, and made intricate seem straight, -To mischief swift. Hope elevates, and joy -Brightens his crest; as when a wandering fire, -Compact of unctuous vapour, which the night -Condenses, and the cold environs round, -Kindled through agitation to a flame, -Which oft, they say, some evil Spirit attends, -Hovering and blazing with delusive light, -Misleads the amazed night-wanderer from his way -To bogs and mires, and oft through pond or pool; -There swallowed up and lost, from succour far. -So glistered the dire Snake, and into fraud -Led Eve, our credulous mother, to the tree -Of prohibition, root of all our woe; -Which when she saw, thus to her guide she spake. -Serpent, we might have spared our coming hither, -Fruitless to me, though fruit be here to excess, -The credit of whose virtue rest with thee; -Wonderous indeed, if cause of such effects. -But of this tree we may not taste nor touch; -God so commanded, and left that command -Sole daughter of his voice; the rest, we live -Law to ourselves; our reason is our law. -To whom the Tempter guilefully replied. -Indeed! hath God then said that of the fruit -Of all these garden-trees ye shall not eat, -Yet Lords declared of all in earth or air$? -To whom thus Eve, yet sinless. Of the fruit -Of each tree in the garden we may eat; -But of the fruit of this fair tree amidst -The garden, God hath said, Ye shall not eat -Thereof, nor shall ye touch it, lest ye die. -She scarce had said, though brief, when now more bold -The Tempter, but with show of zeal and love -To Man, and indignation at his wrong, -New part puts on; and, as to passion moved, -Fluctuates disturbed, yet comely and in act -Raised, as of some great matter to begin. -As when of old some orator renowned, -In Athens or free Rome, where eloquence -Flourished, since mute! to some great cause addressed, -Stood in himself collected; while each part, -Motion, each act, won audience ere the tongue; -Sometimes in highth began, as no delay -Of preface brooking, through his zeal of right: -So standing, moving, or to highth up grown, -The Tempter, all impassioned, thus began. -O sacred, wise, and wisdom-giving Plant, -Mother of science! now I feel thy power -Within me clear; not only to discern -Things in their causes, but to trace the ways -Of highest agents, deemed however wise. -Queen of this universe! do not believe -Those rigid threats of death: ye shall not die: -How should you? by the fruit? it gives you life -To knowledge; by the threatener? look on me, -Me, who have touched and tasted; yet both live, -And life more perfect have attained than Fate -Meant me, by venturing higher than my lot. -Shall that be shut to Man, which to the Beast -Is open? or will God incense his ire -For such a petty trespass? and not praise -Rather your dauntless virtue, whom the pain -Of death denounced, whatever thing death be, -Deterred not from achieving what might lead -To happier life, knowledge of good and evil; -Of good, how just? of evil, if what is evil -Be real, why not known, since easier shunned? -God therefore cannot hurt ye, and be just; -Not just, not God; not feared then, nor obeyed: -Your fear itself of death removes the fear. -Why then was this forbid? Why, but to awe; -Why, but to keep ye low and ignorant, -His worshippers? He knows that in the day -Ye eat thereof, your eyes that seem so clear, -Yet are but dim, shall perfectly be then -Opened and cleared, and ye shall be as Gods, -Knowing both good and evil, as they know. -That ye shall be as Gods, since I as Man, -Internal Man, is but proportion meet; -I, of brute, human; ye, of human, Gods. -So ye shall die perhaps, by putting off -Human, to put on Gods; death to be wished, -Though threatened, which no worse than this can bring. -And what are Gods, that Man may not become -As they, participating God-like food? -The Gods are first, and that advantage use -On our belief, that all from them proceeds: -I question it; for this fair earth I see, -Warmed by the sun, producing every kind; -Them, nothing: if they all things, who enclosed -Knowledge of good and evil in this tree, -That whoso eats thereof, forthwith attains -Wisdom without their leave? and wherein lies -The offence, that Man should thus attain to know? -What can your knowledge hurt him, or this tree -Impart against his will, if all be his? -Or is it envy? and can envy dwell -In heavenly breasts? These, these, and many more -Causes import your need of this fair fruit. -Goddess humane, reach then, and freely taste! -He ended; and his words, replete with guile, -Into her heart too easy entrance won: -Fixed on the fruit she gazed, which to behold -Might tempt alone; and in her ears the sound -Yet rung of his persuasive words, impregned -With reason, to her seeming, and with truth: -Mean while the hour of noon drew on, and waked -An eager appetite, raised by the smell -So savoury of that fruit, which with desire, -Inclinable now grown to touch or taste, -Solicited her longing eye; yet first -Pausing a while, thus to herself she mused. -Great are thy virtues, doubtless, best of fruits, -Though kept from man, and worthy to be admired; -Whose taste, too long forborn, at first assay -Gave elocution to the mute, and taught -The tongue not made for speech to speak thy praise: -Thy praise he also, who forbids thy use, -Conceals not from us, naming thee the tree -Of knowledge, knowledge both of good and evil; -Forbids us then to taste! but his forbidding -Commends thee more, while it infers the good -By thee communicated, and our want: -For good unknown sure is not had; or, had -And yet unknown, is as not had at all. -In plain then, what forbids he but to know, -Forbids us good, forbids us to be wise? -Such prohibitions bind not. But, if death -Bind us with after-bands, what profits then -Our inward freedom? In the day we eat -Of this fair fruit, our doom is, we shall die! -How dies the Serpent? he hath eaten and lives, -And knows, and speaks, and reasons, and discerns, -Irrational till then. For us alone -Was death invented? or to us denied -This intellectual food, for beasts reserved? -For beasts it seems: yet that one beast which first -Hath tasted envies not, but brings with joy -The good befallen him, author unsuspect, -Friendly to man, far from deceit or guile. -What fear I then? rather, what know to fear -Under this ignorance of good and evil, -Of God or death, of law or penalty? -Here grows the cure of all, this fruit divine, -Fair to the eye, inviting to the taste, -Of virtue to make wise: What hinders then -To reach, and feed at once both body and mind? -So saying, her rash hand in evil hour -Forth reaching to the fruit, she plucked, she eat! -Earth felt the wound; and Nature from her seat, -Sighing through all her works, gave signs of woe, -That all was lost. Back to the thicket slunk -The guilty Serpent; and well might;for Eve, -Intent now wholly on her taste, nought else -Regarded; such delight till then, as seemed, -In fruit she never tasted, whether true -Or fancied so, through expectation high -Of knowledge; not was Godhead from her thought. -Greedily she ingorged without restraint, -And knew not eating death: Satiate at length, -And hightened as with wine, jocund and boon, -Thus to herself she pleasingly began. -O sovran, virtuous, precious of all trees -In Paradise! of operation blest -To sapience, hitherto obscured, infamed. -And thy fair fruit let hang, as to no end -Created; but henceforth my early care, -Not without song, each morning, and due praise, -Shall tend thee, and the fertile burden ease -Of thy full branches offered free to all; -Till, dieted by thee, I grow mature -In knowledge, as the Gods, who all things know; -Though others envy what they cannot give: -For, had the gift been theirs, it had not here -Thus grown. Experience, next, to thee I owe, -Best guide; not following thee, I had remained -In ignorance; thou openest wisdom's way, -And givest access, though secret she retire. -And I perhaps am secret: Heaven is high, -High, and remote to see from thence distinct -Each thing on Earth; and other care perhaps -May have diverted from continual watch -Our great Forbidder, safe with all his spies -About him. But to Adam in what sort -Shall I appear? shall I to him make known -As yet my change, and give him to partake -Full happiness with me, or rather not, -But keeps the odds of knowledge in my power -Without copartner? so to add what wants -In female sex, the more to draw his love, -And render me more equal; and perhaps, -A thing not undesirable, sometime -Superiour; for, inferiour, who is free -This may be well: But what if God have seen, -And death ensue? then I shall be no more! -And Adam, wedded to another Eve, -Shall live with her enjoying, I extinct; -A death to think! Confirmed then I resolve, -Adam shall share with me in bliss or woe: -So dear I love him, that with him all deaths -I could endure, without him live no life. -So saying, from the tree her step she turned; -But first low reverence done, as to the Power -That dwelt within, whose presence had infused -Into the plant sciential sap, derived -From nectar, drink of Gods. Adam the while, -Waiting desirous her return, had wove -Of choicest flowers a garland, to adorn -Her tresses, and her rural labours crown; -As reapers oft are wont their harvest-queen. -Great joy he promised to his thoughts, and new -Solace in her return, so long delayed: -Yet oft his heart, divine of something ill, -Misgave him; he the faltering measure felt; -And forth to meet her went, the way she took -That morn when first they parted: by the tree -Of knowledge he must pass; there he her met, -Scarce from the tree returning; in her hand -A bough of fairest fruit, that downy smiled, -New gathered, and ambrosial smell diffused. -To him she hasted; in her face excuse -Came prologue, and apology too prompt; -Which, with bland words at will, she thus addressed. -Hast thou not wondered, Adam, at my stay? -Thee I have missed, and thought it long, deprived -Thy presence; agony of love till now -Not felt, nor shall be twice; for never more -Mean I to try, what rash untried I sought, -The pain of absence from thy sight. But strange -Hath been the cause, and wonderful to hear: -This tree is not, as we are told, a tree -Of danger tasted, nor to evil unknown -Opening the way, but of divine effect -To open eyes, and make them Gods who taste; -And hath been tasted such: The serpent wise, -Or not restrained as we, or not obeying, -Hath eaten of the fruit; and is become, -Not dead, as we are threatened, but thenceforth -Endued with human voice and human sense, -Reasoning to admiration; and with me -Persuasively hath so prevailed, that I -Have also tasted, and have also found -The effects to correspond; opener mine eyes, -Dim erst, dilated spirits, ampler heart, -And growing up to Godhead; which for thee -Chiefly I sought, without thee can despise. -For bliss, as thou hast part, to me is bliss; -Tedious, unshared with thee, and odious soon. -Thou therefore also taste, that equal lot -May join us, equal joy, as equal love; -Lest, thou not tasting, different degree -Disjoin us, and I then too late renounce -Deity for thee, when Fate will not permit. -Thus Eve with countenance blithe her story told; -But in her cheek distemper flushing glowed. -On the other side Adam, soon as he heard -The fatal trespass done by Eve, amazed, -Astonied stood and blank, while horrour chill -Ran through his veins, and all his joints relaxed; -From his slack hand the garland wreathed for Eve -Down dropt, and all the faded roses shed: -Speechless he stood and pale, till thus at length -First to himself he inward silence broke. -O fairest of Creation, last and best -Of all God's works, Creature in whom excelled -Whatever can to sight or thought be formed, -Holy, divine, good, amiable, or sweet! -How art thou lost! how on a sudden lost, -Defaced, deflowered, and now to death devote! -Rather, how hast thou yielded to transgress -The strict forbiddance, how to violate -The sacred fruit forbidden! Some cursed fraud -Of enemy hath beguiled thee, yet unknown, -And me with thee hath ruined; for with thee -Certain my resolution is to die: -How can I live without thee! how forego -Thy sweet converse, and love so dearly joined, -To live again in these wild woods forlorn! -Should God create another Eve, and I -Another rib afford, yet loss of thee -Would never from my heart: no, no!I feel -The link of Nature draw me: flesh of flesh, -Bone of my bone thou art, and from thy state -Mine never shall be parted, bliss or woe. -So having said, as one from sad dismay -Recomforted, and after thoughts disturbed -Submitting to what seemed remediless, -Thus in calm mood his words to Eve he turned. -Bold deed thou hast presumed, adventurous Eve, -And peril great provoked, who thus hast dared, -Had it been only coveting to eye -That sacred fruit, sacred to abstinence, -Much more to taste it under ban to touch. -But past who can recall, or done undo? -Not God Omnipotent, nor Fate; yet so -Perhaps thou shalt not die, perhaps the fact -Is not so heinous now, foretasted fruit, -Profaned first by the serpent, by him first -Made common, and unhallowed, ere our taste; -Nor yet on him found deadly; yet he lives; -Lives, as thou saidst, and gains to live, as Man, -Higher degree of life; inducement strong -To us, as likely tasting to attain -Proportional ascent; which cannot be -But to be Gods, or Angels, demi-Gods. -Nor can I think that God, Creator wise, -Though threatening, will in earnest so destroy -Us his prime creatures, dignified so high, -Set over all his works; which in our fall, -For us created, needs with us must fail, -Dependant made; so God shall uncreate, -Be frustrate, do, undo, and labour lose; -Not well conceived of God, who, though his power -Creation could repeat, yet would be loth -Us to abolish, lest the Adversary -Triumph, and say; "Fickle their state whom God -"Most favours; who can please him long? Me first -"He ruined, now Mankind; whom will he next?" -Matter of scorn, not to be given the Foe. -However I with thee have fixed my lot, -Certain to undergo like doom: If death -Consort with thee, death is to me as life; -So forcible within my heart I feel -The bond of Nature draw me to my own; -My own in thee, for what thou art is mine; -Our state cannot be severed; we are one, -One flesh; to lose thee were to lose myself. -So Adam; and thus Eve to him replied. -O glorious trial of exceeding love, -Illustrious evidence, example high! -Engaging me to emulate; but, short -Of thy perfection, how shall I attain, -Adam, from whose dear side I boast me sprung, -And gladly of our union hear thee speak, -One heart, one soul in both; whereof good proof -This day affords, declaring thee resolved, -Rather than death, or aught than death more dread, -Shall separate us, linked in love so dear, -To undergo with me one guilt, one crime, -If any be, of tasting this fair fruit; -Whose virtue for of good still good proceeds, -Direct, or by occasion, hath presented -This happy trial of thy love, which else -So eminently never had been known? -Were it I thought death menaced would ensue -This my attempt, I would sustain alone -The worst, and not persuade thee, rather die -Deserted, than oblige thee with a fact -Pernicious to thy peace; chiefly assured -Remarkably so late of thy so true, -So faithful, love unequalled: but I feel -Far otherwise the event; not death, but life -Augmented, opened eyes, new hopes, new joys, -Taste so divine, that what of sweet before -Hath touched my sense, flat seems to this, and harsh. -On my experience, Adam, freely taste, -And fear of death deliver to the winds. -So saying, she embraced him, and for joy -Tenderly wept; much won, that he his love -Had so ennobled, as of choice to incur -Divine displeasure for her sake, or death. -In recompence for such compliance bad -Such recompence best merits from the bough -She gave him of that fair enticing fruit -With liberal hand: he scrupled not to eat, -Against his better knowledge; not deceived, -But fondly overcome with female charm. -Earth trembled from her entrails, as again -In pangs; and Nature gave a second groan; -Sky loured; and, muttering thunder, some sad drops -Wept at completing of the mortal sin -Original: while Adam took no thought, -Eating his fill; nor Eve to iterate -Her former trespass feared, the more to sooth -Him with her loved society; that now, -As with new wine intoxicated both, -They swim in mirth, and fancy that they feel -Divinity within them breeding wings, -Wherewith to scorn the earth: But that false fruit -Far other operation first displayed, -Carnal desire inflaming; he on Eve -Began to cast lascivious eyes; she him -As wantonly repaid; in lust they burn: -Till Adam thus 'gan Eve to dalliance move. -Eve, now I see thou art exact of taste, -And elegant, of sapience no small part; -Since to each meaning savour we apply, -And palate call judicious; I the praise -Yield thee, so well this day thou hast purveyed. -Much pleasure we have lost, while we abstained -From this delightful fruit, nor known till now -True relish, tasting; if such pleasure be -In things to us forbidden, it might be wished, -For this one tree had been forbidden ten. -But come, so well refreshed, now let us play, -As meet is, after such delicious fare; -For never did thy beauty, since the day -I saw thee first and wedded thee, adorned -With all perfections, so inflame my sense -With ardour to enjoy thee, fairer now -Than ever; bounty of this virtuous tree! -So said he, and forbore not glance or toy -Of amorous intent; well understood -Of Eve, whose eye darted contagious fire. -Her hand he seised; and to a shady bank, -Thick over-head with verdant roof imbowered, -He led her nothing loth; flowers were the couch, -Pansies, and violets, and asphodel, -And hyacinth; Earth's freshest softest lap. -There they their fill of love and love's disport -Took largely, of their mutual guilt the seal, -The solace of their sin; till dewy sleep -Oppressed them, wearied with their amorous play, -Soon as the force of that fallacious fruit, -That with exhilarating vapour bland -About their spirits had played, and inmost powers -Made err, was now exhaled; and grosser sleep, -Bred of unkindly fumes, with conscious dreams -Incumbered, now had left them; up they rose -As from unrest; and, each the other viewing, -Soon found their eyes how opened, and their minds -How darkened; innocence, that as a veil -Had shadowed them from knowing ill, was gone; -Just confidence, and native righteousness, -And honour, from about them, naked left -To guilty Shame; he covered, but his robe -Uncovered more. So rose the Danite strong, -Herculean Samson, from the harlot-lap -Of Philistean Dalilah, and waked -Shorn of his strength. They destitute and bare -Of all their virtue: Silent, and in face -Confounded, long they sat, as strucken mute: -Till Adam, though not less than Eve abashed, -At length gave utterance to these words constrained. -O Eve, in evil hour thou didst give ear -To that false worm, of whomsoever taught -To counterfeit Man's voice; true in our fall, -False in our promised rising; since our eyes -Opened we find indeed, and find we know -Both good and evil; good lost, and evil got; -Bad fruit of knowledge, if this be to know; -Which leaves us naked thus, of honour void, -Of innocence, of faith, of purity, -Our wonted ornaments now soiled and stained, -And in our faces evident the signs -Of foul concupiscence; whence evil store; -Even shame, the last of evils; of the first -Be sure then.--How shall I behold the face -Henceforth of God or Angel, erst with joy -And rapture so oft beheld? Those heavenly shapes -Will dazzle now this earthly with their blaze -Insufferably bright. O! might I here -In solitude live savage; in some glade -Obscured, where highest woods, impenetrable -To star or sun-light, spread their umbrage broad -And brown as evening: Cover me, ye Pines! -Ye Cedars, with innumerable boughs -Hide me, where I may never see them more!-- -But let us now, as in bad plight, devise -What best may for the present serve to hide -The parts of each from other, that seem most -To shame obnoxious, and unseemliest seen; -Some tree, whose broad smooth leaves together sewed, -And girded on our loins, may cover round -Those middle parts; that this new comer, Shame, -There sit not, and reproach us as unclean. -So counselled he, and both together went -Into the thickest wood; there soon they chose -The fig-tree; not that kind for fruit renowned, -But such as at this day, to Indians known, -In Malabar or Decan spreads her arms -Branching so broad and long, that in the ground -The bended twigs take root, and daughters grow -About the mother tree, a pillared shade -High over-arched, and echoing walks between: -There oft the Indian herdsman, shunning heat, -Shelters in cool, and tends his pasturing herds -At loop-holes cut through thickest shade: Those leaves -They gathered, broad as Amazonian targe; -And, with what skill they had, together sewed, -To gird their waist; vain covering, if to hide -Their guilt and dreaded shame! O, how unlike -To that first naked glory! Such of late -Columbus found the American, so girt -With feathered cincture; naked else, and wild -Among the trees on isles and woody shores. -Thus fenced, and, as they thought, their shame in part -Covered, but not at rest or ease of mind, -They sat them down to weep; nor only tears -Rained at their eyes, but high winds worse within -Began to rise, high passions, anger, hate, -Mistrust, suspicion, discord; and shook sore -Their inward state of mind, calm region once -And full of peace, now tost and turbulent: -For Understanding ruled not, and the Will -Heard not her lore; both in subjection now -To sensual Appetite, who from beneath -Usurping over sovran Reason claimed -Superiour sway: From thus distempered breast, -Adam, estranged in look and altered style, -Speech intermitted thus to Eve renewed. -Would thou hadst hearkened to my words, and staid -With me, as I besought thee, when that strange -Desire of wandering, this unhappy morn, -I know not whence possessed thee; we had then -Remained still happy; not, as now, despoiled -Of all our good; shamed, naked, miserable! -Let none henceforth seek needless cause to approve -The faith they owe; when earnestly they seek -Such proof, conclude, they then begin to fail. -To whom, soon moved with touch of blame, thus Eve. -What words have passed thy lips, Adam severe! -Imputest thou that to my default, or will -Of wandering, as thou callest it, which who knows -But might as ill have happened thou being by, -Or to thyself perhaps? Hadst thou been there, -Or here the attempt, thou couldst not have discerned -Fraud in the Serpent, speaking as he spake; -No ground of enmity between us known, -Why he should mean me ill, or seek to harm. -Was I to have never parted from thy side? -As good have grown there still a lifeless rib. -Being as I am, why didst not thou, the head, -Command me absolutely not to go, -Going into such danger, as thou saidst? -Too facile then, thou didst not much gainsay; -Nay, didst permit, approve, and fair dismiss. -Hadst thou been firm and fixed in thy dissent, -Neither had I transgressed, nor thou with me. -To whom, then first incensed, Adam replied. -Is this the love, is this the recompence -Of mine to thee, ingrateful Eve! expressed -Immutable, when thou wert lost, not I; -Who might have lived, and joyed immortal bliss, -Yet willingly chose rather death with thee? -And am I now upbraided as the cause -Of thy transgressing? Not enough severe, -It seems, in thy restraint: What could I more -I warned thee, I admonished thee, foretold -The danger, and the lurking enemy -That lay in wait; beyond this, had been force; -And force upon free will hath here no place. -But confidence then bore thee on; secure -Either to meet no danger, or to find -Matter of glorious trial; and perhaps -I also erred, in overmuch admiring -What seemed in thee so perfect, that I thought -No evil durst attempt thee; but I rue -The errour now, which is become my crime, -And thou the accuser. Thus it shall befall -Him, who, to worth in women overtrusting, -Lets her will rule: restraint she will not brook; -And, left to herself, if evil thence ensue, -She first his weak indulgence will accuse. -Thus they in mutual accusation spent -The fruitless hours, but neither self-condemning; -And of their vain contest appeared no end. - - - -Book X - - -Mean while the heinous and despiteful act -Of Satan, done in Paradise; and how -He, in the serpent, had perverted Eve, -Her husband she, to taste the fatal fruit, -Was known in Heaven; for what can 'scape the eye -Of God all-seeing, or deceive his heart -Omniscient? who, in all things wise and just, -Hindered not Satan to attempt the mind -Of Man, with strength entire and free will armed, -Complete to have discovered and repulsed -Whatever wiles of foe or seeming friend. -For still they knew, and ought to have still remembered, -The high injunction, not to taste that fruit, -Whoever tempted; which they not obeying, -(Incurred what could they less?) the penalty; -And, manifold in sin, deserved to fall. -Up into Heaven from Paradise in haste -The angelick guards ascended, mute, and sad, -For Man; for of his state by this they knew, -Much wondering how the subtle Fiend had stolen -Entrance unseen. Soon as the unwelcome news -From Earth arrived at Heaven-gate, displeased -All were who heard; dim sadness did not spare -That time celestial visages, yet, mixed -With pity, violated not their bliss. -About the new-arrived, in multitudes -The ethereal people ran, to hear and know -How all befel: They towards the throne supreme, -Accountable, made haste, to make appear, -With righteous plea, their utmost vigilance -And easily approved; when the Most High -Eternal Father, from his secret cloud, -Amidst in thunder uttered thus his voice. -Assembled Angels, and ye Powers returned -From unsuccessful charge; be not dismayed, -Nor troubled at these tidings from the earth, -Which your sincerest care could not prevent; -Foretold so lately what would come to pass, -When first this tempter crossed the gulf from Hell. -I told ye then he should prevail, and speed -On his bad errand; Man should be seduced, -And flattered out of all, believing lies -Against his Maker; no decree of mine -Concurring to necessitate his fall, -Or touch with lightest moment of impulse -His free will, to her own inclining left -In even scale. But fallen he is; and now -What rests, but that the mortal sentence pass -On his transgression,--death denounced that day? -Which he presumes already vain and void, -Because not yet inflicted, as he feared, -By some immediate stroke; but soon shall find -Forbearance no acquittance, ere day end. -Justice shall not return as bounty scorned. -But whom send I to judge them? whom but thee, -Vicegerent Son? To thee I have transferred -All judgement, whether in Heaven, or Earth, or Hell. -Easy it may be seen that I intend -Mercy colleague with justice, sending thee -Man's friend, his Mediator, his designed -Both ransom and Redeemer voluntary, -And destined Man himself to judge Man fallen. -So spake the Father; and, unfolding bright -Toward the right hand his glory, on the Son -Blazed forth unclouded Deity: He full -Resplendent all his Father manifest -Expressed, and thus divinely answered mild. -Father Eternal, thine is to decree; -Mine, both in Heaven and Earth, to do thy will -Supreme; that thou in me, thy Son beloved, -Mayest ever rest well pleased. I go to judge -On earth these thy transgressours; but thou knowest, -Whoever judged, the worst on me must light, -When time shall be; for so I undertook -Before thee; and, not repenting, this obtain -Of right, that I may mitigate their doom -On me derived; yet I shall temper so -Justice with mercy, as may illustrate most -Them fully satisfied, and thee appease. -Attendance none shall need, nor train, where none -Are to behold the judgement, but the judged, -Those two; the third best absent is condemned, -Convict by flight, and rebel to all law: -Conviction to the serpent none belongs. -Thus saying, from his radiant seat he rose -Of high collateral glory: Him Thrones, and Powers, -Princedoms, and Dominations ministrant, -Accompanied to Heaven-gate; from whence -Eden, and all the coast, in prospect lay. -Down he descended straight; the speed of Gods -Time counts not, though with swiftest minutes winged. -Now was the sun in western cadence low -From noon, and gentle airs, due at their hour, -To fan the earth now waked, and usher in -The evening cool; when he, from wrath more cool, -Came the mild Judge, and Intercessour both, -To sentence Man: The voice of God they heard -Now walking in the garden, by soft winds -Brought to their ears, while day declined; they heard, -And from his presence hid themselves among -The thickest trees, both man and wife; till God, -Approaching, thus to Adam called aloud. -Where art thou, Adam, wont with joy to meet -My coming seen far off? I miss thee here, -Not pleased, thus entertained with solitude, -Where obvious duty ere while appeared unsought: -Or come I less conspicuous, or what change -Absents thee, or what chance detains?--Come forth! -He came; and with him Eve, more loth, though first -To offend; discountenanced both, and discomposed; -Love was not in their looks, either to God, -Or to each other; but apparent guilt, -And shame, and perturbation, and despair, -Anger, and obstinacy, and hate, and guile. -Whence Adam, faltering long, thus answered brief. -I heard thee in the garden, and of thy voice -Afraid, being naked, hid myself. To whom -The gracious Judge without revile replied. -My voice thou oft hast heard, and hast not feared, -But still rejoiced; how is it now become -So dreadful to thee? That thou art naked, who -Hath told thee? Hast thou eaten of the tree, -Whereof I gave thee charge thou shouldst not eat? -To whom thus Adam sore beset replied. -O Heaven! in evil strait this day I stand -Before my Judge; either to undergo -Myself the total crime, or to accuse -My other self, the partner of my life; -Whose failing, while her faith to me remains, -I should conceal, and not expose to blame -By my complaint: but strict necessity -Subdues me, and calamitous constraint; -Lest on my head both sin and punishment, -However insupportable, be all -Devolved; though should I hold my peace, yet thou -Wouldst easily detect what I conceal.-- -This Woman, whom thou madest to be my help, -And gavest me as thy perfect gift, so good, -So fit, so acceptable, so divine, -That from her hand I could suspect no ill, -And what she did, whatever in itself, -Her doing seemed to justify the deed; -She gave me of the tree, and I did eat. -To whom the Sovran Presence thus replied. -Was she thy God, that her thou didst obey -Before his voice? or was she made thy guide, -Superiour, or but equal, that to her -Thou didst resign thy manhood, and the place -Wherein God set thee above her made of thee, -And for thee, whose perfection far excelled -Hers in all real dignity? Adorned -She was indeed, and lovely, to attract -Thy love, not thy subjection; and her gifts -Were such, as under government well seemed; -Unseemly to bear rule; which was thy part -And person, hadst thou known thyself aright. -So having said, he thus to Eve in few. -Say, Woman, what is this which thou hast done? -To whom sad Eve, with shame nigh overwhelmed, -Confessing soon, yet not before her Judge -Bold or loquacious, thus abashed replied. -The Serpent me beguiled, and I did eat. -Which when the Lord God heard, without delay -To judgement he proceeded on the accused -Serpent, though brute; unable to transfer -The guilt on him, who made him instrument -Of mischief, and polluted from the end -Of his creation; justly then accursed, -As vitiated in nature: More to know -Concerned not Man, (since he no further knew) -Nor altered his offence; yet God at last -To Satan first in sin his doom applied, -Though in mysterious terms, judged as then best: -And on the Serpent thus his curse let fall. -Because thou hast done this, thou art accursed -Above all cattle, each beast of the field; -Upon thy belly groveling thou shalt go, -And dust shalt eat all the days of thy life. -Between thee and the woman I will put -Enmity, and between thine and her seed; -Her seed shall bruise thy head, thou bruise his heel. -So spake this oracle, then verified -When Jesus, Son of Mary, second Eve, -Saw Satan fall, like lightning, down from Heaven, -Prince of the air; then, rising from his grave -Spoiled Principalities and Powers, triumphed -In open show; and, with ascension bright, -Captivity led captive through the air, -The realm itself of Satan, long usurped; -Whom he shall tread at last under our feet; -Even he, who now foretold his fatal bruise; -And to the Woman thus his sentence turned. -Thy sorrow I will greatly multiply -By thy conception; children thou shalt bring -In sorrow forth; and to thy husband's will -Thine shall submit; he over thee shall rule. -On Adam last thus judgement he pronounced. -Because thou hast hearkened to the voice of thy wife, -And eaten of the tree, concerning which -I charged thee, saying, Thou shalt not eat thereof: -Cursed is the ground for thy sake; thou in sorrow -Shalt eat thereof, all the days of thy life; -Thorns also and thistles it shall bring thee forth -Unbid; and thou shalt eat the herb of the field; -In the sweat of thy face shalt thou eat bread, -Till thou return unto the ground; for thou -Out of the ground wast taken, know thy birth, -For dust thou art, and shalt to dust return. -So judged he Man, both Judge and Saviour sent; -And the instant stroke of death, denounced that day, -Removed far off; then, pitying how they stood -Before him naked to the air, that now -Must suffer change, disdained not to begin -Thenceforth the form of servant to assume; -As when he washed his servants feet; so now, -As father of his family, he clad -Their nakedness with skins of beasts, or slain, -Or as the snake with youthful coat repaid; -And thought not much to clothe his enemies; -Nor he their outward only with the skins -Of beasts, but inward nakedness, much more. -Opprobrious, with his robe of righteousness, -Arraying, covered from his Father's sight. -To him with swift ascent he up returned, -Into his blissful bosom reassumed -In glory, as of old; to him appeased -All, though all-knowing, what had passed with Man -Recounted, mixing intercession sweet. -Mean while, ere thus was sinned and judged on Earth, -Within the gates of Hell sat Sin and Death, -In counterview within the gates, that now -Stood open wide, belching outrageous flame -Far into Chaos, since the Fiend passed through, -Sin opening; who thus now to Death began. -O Son, why sit we here each other viewing -Idly, while Satan, our great author, thrives -In other worlds, and happier seat provides -For us, his offspring dear? It cannot be -But that success attends him; if mishap, -Ere this he had returned, with fury driven -By his avengers; since no place like this -Can fit his punishment, or their revenge. -Methinks I feel new strength within me rise, -Wings growing, and dominion given me large -Beyond this deep; whatever draws me on, -Or sympathy, or some connatural force, -Powerful at greatest distance to unite, -With secret amity, things of like kind, -By secretest conveyance. Thou, my shade -Inseparable, must with me along; -For Death from Sin no power can separate. -But, lest the difficulty of passing back -Stay his return perhaps over this gulf -Impassable, impervious; let us try -Adventurous work, yet to thy power and mine -Not unagreeable, to found a path -Over this main from Hell to that new world, -Where Satan now prevails; a monument -Of merit high to all the infernal host, -Easing their passage hence, for intercourse, -Or transmigration, as their lot shall lead. -Nor can I miss the way, so strongly drawn -By this new-felt attraction and instinct. -Whom thus the meager Shadow answered soon. -Go, whither Fate, and inclination strong, -Leads thee; I shall not lag behind, nor err -The way, thou leading; such a scent I draw -Of carnage, prey innumerable, and taste -The savour of death from all things there that live: -Nor shall I to the work thou enterprisest -Be wanting, but afford thee equal aid. -So saying, with delight he snuffed the smell -Of mortal change on earth. As when a flock -Of ravenous fowl, though many a league remote, -Against the day of battle, to a field, -Where armies lie encamped, come flying, lured -With scent of living carcasses designed -For death, the following day, in bloody fight: -So scented the grim Feature, and upturned -His nostril wide into the murky air; -Sagacious of his quarry from so far. -Then both from out Hell-gates, into the waste -Wide anarchy of Chaos, damp and dark, -Flew diverse; and with power (their power was great) -Hovering upon the waters, what they met -Solid or slimy, as in raging sea -Tost up and down, together crouded drove, -From each side shoaling towards the mouth of Hell; -As when two polar winds, blowing adverse -Upon the Cronian sea, together drive -Mountains of ice, that stop the imagined way -Beyond Petsora eastward, to the rich -Cathaian coast. The aggregated soil -Death with his mace petrifick, cold and dry, -As with a trident, smote; and fixed as firm -As Delos, floating once; the rest his look -Bound with Gorgonian rigour not to move; -And with Asphaltick slime, broad as the gate, -Deep to the roots of Hell the gathered beach -They fastened, and the mole immense wrought on -Over the foaming deep high-arched, a bridge -Of length prodigious, joining to the wall -Immoveable of this now fenceless world, -Forfeit to Death; from hence a passage broad, -Smooth, easy, inoffensive, down to Hell. -So, if great things to small may be compared, -Xerxes, the liberty of Greece to yoke, -From Susa, his Memnonian palace high, -Came to the sea: and, over Hellespont -Bridging his way, Europe with Asia joined, -And scourged with many a stroke the indignant waves. -Now had they brought the work by wonderous art -Pontifical, a ridge of pendant rock, -Over the vexed abyss, following the track -Of Satan to the self-same place where he -First lighted from his wing, and landed safe -From out of Chaos, to the outside bare -Of this round world: With pins of adamant -And chains they made all fast, too fast they made -And durable! And now in little space -The confines met of empyrean Heaven, -And of this World; and, on the left hand, Hell -With long reach interposed; three several ways -In sight, to each of these three places led. -And now their way to Earth they had descried, -To Paradise first tending; when, behold! -Satan, in likeness of an Angel bright, -Betwixt the Centaur and the Scorpion steering -His zenith, while the sun in Aries rose: -Disguised he came; but those his children dear -Their parent soon discerned, though in disguise. -He, after Eve seduced, unminded slunk -Into the wood fast by; and, changing shape, -To observe the sequel, saw his guileful act -By Eve, though all unweeting, seconded -Upon her husband; saw their shame that sought -Vain covertures; but when he saw descend -The Son of God to judge them, terrified -He fled; not hoping to escape, but shun -The present; fearing, guilty, what his wrath -Might suddenly inflict; that past, returned -By night, and listening where the hapless pair -Sat in their sad discourse, and various plaint, -Thence gathered his own doom; which understood -Not instant, but of future time, with joy -And tidings fraught, to Hell he now returned; -And at the brink of Chaos, near the foot -Of this new wonderous pontifice, unhoped -Met, who to meet him came, his offspring dear. -Great joy was at their meeting, and at sight -Of that stupendious bridge his joy encreased. -Long he admiring stood, till Sin, his fair -Enchanting daughter, thus the silence broke. -O Parent, these are thy magnifick deeds, -Thy trophies! which thou viewest as not thine own; -Thou art their author, and prime architect: -For I no sooner in my heart divined, -My heart, which by a secret harmony -Still moves with thine, joined in connexion sweet, -That thou on earth hadst prospered, which thy looks -Now also evidence, but straight I felt, -Though distant from thee worlds between, yet felt, -That I must after thee, with this thy son; -Such fatal consequence unites us three! -Hell could no longer hold us in our bounds, -Nor this unvoyageable gulf obscure -Detain from following thy illustrious track. -Thou hast achieved our liberty, confined -Within Hell-gates till now; thou us impowered -To fortify thus far, and overlay, -With this portentous bridge, the dark abyss. -Thine now is all this world; thy virtue hath won -What thy hands builded not; thy wisdom gained -With odds what war hath lost, and fully avenged -Our foil in Heaven; here thou shalt monarch reign, -There didst not; there let him still victor sway, -As battle hath adjudged; from this new world -Retiring, by his own doom alienated; -And henceforth monarchy with thee divide -Of all things, parted by the empyreal bounds, -His quadrature, from thy orbicular world; -Or try thee now more dangerous to his throne. -Whom thus the Prince of darkness answered glad. -Fair Daughter, and thou Son and Grandchild both; -High proof ye now have given to be the race -Of Satan (for I glory in the name, -Antagonist of Heaven's Almighty King,) -Amply have merited of me, of all -The infernal empire, that so near Heaven's door -Triumphal with triumphal act have met, -Mine, with this glorious work; and made one realm, -Hell and this world, one realm, one continent -Of easy thorough-fare. Therefore, while I -Descend through darkness, on your road with ease, -To my associate Powers, them to acquaint -With these successes, and with them rejoice; -You two this way, among these numerous orbs, -All yours, right down to Paradise descend; -There dwell, and reign in bliss; thence on the earth -Dominion exercise and in the air, -Chiefly on Man, sole lord of all declared; -Him first make sure your thrall, and lastly kill. -My substitutes I send ye, and create -Plenipotent on earth, of matchless might -Issuing from me: on your joint vigour now -My hold of this new kingdom all depends, -Through Sin to Death exposed by my exploit. -If your joint power prevail, the affairs of Hell -No detriment need fear; go, and be strong! -So saying he dismissed them; they with speed -Their course through thickest constellations held, -Spreading their bane; the blasted stars looked wan, -And planets, planet-struck, real eclipse -Then suffered. The other way Satan went down -The causey to Hell-gate: On either side -Disparted Chaos overbuilt exclaimed, -And with rebounding surge the bars assailed, -That scorned his indignation: Through the gate, -Wide open and unguarded, Satan passed, -And all about found desolate; for those, -Appointed to sit there, had left their charge, -Flown to the upper world; the rest were all -Far to the inland retired, about the walls -Of Pandemonium; city and proud seat -Of Lucifer, so by allusion called -Of that bright star to Satan paragoned; -There kept their watch the legions, while the Grand -In council sat, solicitous what chance -Might intercept their emperour sent; so he -Departing gave command, and they observed. -As when the Tartar from his Russian foe, -By Astracan, over the snowy plains, -Retires; or Bactrin Sophi, from the horns -Of Turkish crescent, leaves all waste beyond -The realm of Aladule, in his retreat -To Tauris or Casbeen: So these, the late -Heaven-banished host, left desart utmost Hell -Many a dark league, reduced in careful watch -Round their metropolis; and now expecting -Each hour their great adventurer, from the search -Of foreign worlds: He through the midst unmarked, -In show plebeian Angel militant -Of lowest order, passed; and from the door -Of that Plutonian hall, invisible -Ascended his high throne; which, under state -Of richest texture spread, at the upper end -Was placed in regal lustre. Down a while -He sat, and round about him saw unseen: -At last, as from a cloud, his fulgent head -And shape star-bright appeared, or brighter; clad -With what permissive glory since his fall -Was left him, or false glitter: All amazed -At that so sudden blaze the Stygian throng -Bent their aspect, and whom they wished beheld, -Their mighty Chief returned: loud was the acclaim: -Forth rushed in haste the great consulting peers, -Raised from their dark Divan, and with like joy -Congratulant approached him; who with hand -Silence, and with these words attention, won. -Thrones, Dominations, Princedoms, Virtues, Powers; -For in possession such, not only of right, -I call ye, and declare ye now; returned -Successful beyond hope, to lead ye forth -Triumphant out of this infernal pit -Abominable, accursed, the house of woe, -And dungeon of our tyrant: Now possess, -As Lords, a spacious world, to our native Heaven -Little inferiour, by my adventure hard -With peril great achieved. Long were to tell -What I have done; what suffered;with what pain -Voyaged th' unreal, vast, unbounded deep -Of horrible confusion; over which -By Sin and Death a broad way now is paved, -To expedite your glorious march; but I -Toiled out my uncouth passage, forced to ride -The untractable abyss, plunged in the womb -Of unoriginal Night and Chaos wild; -That, jealous of their secrets, fiercely opposed -My journey strange, with clamorous uproar -Protesting Fate supreme; thence how I found -The new created world, which fame in Heaven -Long had foretold, a fabrick wonderful -Of absolute perfection! therein Man -Placed in a Paradise, by our exile -Made happy: Him by fraud I have seduced -From his Creator; and, the more to encrease -Your wonder, with an apple; he, thereat -Offended, worth your laughter! hath given up -Both his beloved Man, and all his world, -To Sin and Death a prey, and so to us, -Without our hazard, labour, or alarm; -To range in, and to dwell, and over Man -To rule, as over all he should have ruled. -True is, me also he hath judged, or rather -Me not, but the brute serpent in whose shape -Man I deceived: that which to me belongs, -Is enmity which he will put between -Me and mankind; I am to bruise his heel; -His seed, when is not set, shall bruise my head: -A world who would not purchase with a bruise, -Or much more grievous pain?--Ye have the account -Of my performance: What remains, ye Gods, -But up, and enter now into full bliss? -So having said, a while he stood, expecting -Their universal shout, and high applause, -To fill his ear; when, contrary, he hears -On all sides, from innumerable tongues, -A dismal universal hiss, the sound -Of publick scorn; he wondered, but not long -Had leisure, wondering at himself now more, -His visage drawn he felt to sharp and spare; -His arms clung to his ribs; his legs entwining -Each other, till supplanted down he fell -A monstrous serpent on his belly prone, -Reluctant, but in vain; a greater power -Now ruled him, punished in the shape he sinned, -According to his doom: he would have spoke, -But hiss for hiss returned with forked tongue -To forked tongue; for now were all transformed -Alike, to serpents all, as accessories -To his bold riot: Dreadful was the din -Of hissing through the hall, thick swarming now -With complicated monsters head and tail, -Scorpion, and Asp, and Amphisbaena dire, -Cerastes horned, Hydrus, and Elops drear, -And Dipsas; (not so thick swarmed once the soil -Bedropt with blood of Gorgon, or the isle -Ophiusa,) but still greatest he the midst, -Now Dragon grown, larger than whom the sun -Ingendered in the Pythian vale or slime, -Huge Python, and his power no less he seemed -Above the rest still to retain; they all -Him followed, issuing forth to the open field, -Where all yet left of that revolted rout, -Heaven-fallen, in station stood or just array; -Sublime with expectation when to see -In triumph issuing forth their glorious Chief; -They saw, but other sight instead! a croud -Of ugly serpents; horrour on them fell, -And horrid sympathy; for, what they saw, -They felt themselves, now changing; down their arms, -Down fell both spear and shield; down they as fast; -And the dire hiss renewed, and the dire form -Catched, by contagion; like in punishment, -As in their crime. Thus was the applause they meant, -Turned to exploding hiss, triumph to shame -Cast on themselves from their own mouths. There stood -A grove hard by, sprung up with this their change, -His will who reigns above, to aggravate -Their penance, laden with fair fruit, like that -Which grew in Paradise, the bait of Eve -Used by the Tempter: on that prospect strange -Their earnest eyes they fixed, imagining -For one forbidden tree a multitude -Now risen, to work them further woe or shame; -Yet, parched with scalding thirst and hunger fierce, -Though to delude them sent, could not abstain; -But on they rolled in heaps, and, up the trees -Climbing, sat thicker than the snaky locks -That curled Megaera: greedily they plucked -The fruitage fair to sight, like that which grew -Near that bituminous lake where Sodom flamed; -This more delusive, not the touch, but taste -Deceived; they, fondly thinking to allay -Their appetite with gust, instead of fruit -Chewed bitter ashes, which the offended taste -With spattering noise rejected: oft they assayed, -Hunger and thirst constraining; drugged as oft, -With hatefullest disrelish writhed their jaws, -With soot and cinders filled; so oft they fell -Into the same illusion, not as Man -Whom they triumphed once lapsed. Thus were they plagued -And worn with famine, long and ceaseless hiss, -Till their lost shape, permitted, they resumed; -Yearly enjoined, some say, to undergo, -This annual humbling certain numbered days, -To dash their pride, and joy, for Man seduced. -However, some tradition they dispersed -Among the Heathen, of their purchase got, -And fabled how the Serpent, whom they called -Ophion, with Eurynome, the wide-- -Encroaching Eve perhaps, had first the rule -Of high Olympus; thence by Saturn driven -And Ops, ere yet Dictaean Jove was born. -Mean while in Paradise the hellish pair -Too soon arrived; Sin, there in power before, -Once actual; now in body, and to dwell -Habitual habitant; behind her Death, -Close following pace for pace, not mounted yet -On his pale horse: to whom Sin thus began. -Second of Satan sprung, all-conquering Death! -What thinkest thou of our empire now, though earned -With travel difficult, not better far -Than still at Hell's dark threshold to have sat watch, -Unnamed, undreaded, and thyself half starved? -Whom thus the Sin-born monster answered soon. -To me, who with eternal famine pine, -Alike is Hell, or Paradise, or Heaven; -There best, where most with ravine I may meet; -Which here, though plenteous, all too little seems -To stuff this maw, this vast unhide-bound corps. -To whom the incestuous mother thus replied. -Thou therefore on these herbs, and fruits, and flowers, -Feed first; on each beast next, and fish, and fowl; -No homely morsels! and, whatever thing -The sithe of Time mows down, devour unspared; -Till I, in Man residing, through the race, -His thoughts, his looks, words, actions, all infect; -And season him thy last and sweetest prey. -This said, they both betook them several ways, -Both to destroy, or unimmortal make -All kinds, and for destruction to mature -Sooner or later; which the Almighty seeing, -From his transcendent seat the Saints among, -To those bright Orders uttered thus his voice. -See, with what heat these dogs of Hell advance -To waste and havock yonder world, which I -So fair and good created; and had still -Kept in that state, had not the folly of Man -Let in these wasteful furies, who impute -Folly to me; so doth the Prince of Hell -And his adherents, that with so much ease -I suffer them to enter and possess -A place so heavenly; and, conniving, seem -To gratify my scornful enemies, -That laugh, as if, transported with some fit -Of passion, I to them had quitted all, -At random yielded up to their misrule; -And know not that I called, and drew them thither, -My Hell-hounds, to lick up the draff and filth -Which Man's polluting sin with taint hath shed -On what was pure; til, crammed and gorged, nigh burst -With sucked and glutted offal, at one sling -Of thy victorious arm, well-pleasing Son, -Both Sin, and Death, and yawning Grave, at last, -Through Chaos hurled, obstruct the mouth of Hell -For ever, and seal up his ravenous jaws. -Then Heaven and Earth renewed shall be made pure -To sanctity, that shall receive no stain: -Till then, the curse pronounced on both precedes. -He ended, and the heavenly audience loud -Sung Halleluiah, as the sound of seas, -Through multitude that sung: Just are thy ways, -Righteous are thy decrees on all thy works; -Who can extenuate thee? Next, to the Son, -Destined Restorer of mankind, by whom -New Heaven and Earth shall to the ages rise, -Or down from Heaven descend.--Such was their song; -While the Creator, calling forth by name -His mighty Angels, gave them several charge, -As sorted best with present things. The sun -Had first his precept so to move, so shine, -As might affect the earth with cold and heat -Scarce tolerable; and from the north to call -Decrepit winter; from the south to bring -Solstitial summer's heat. To the blanc moon -Her office they prescribed; to the other five -Their planetary motions, and aspects, -In sextile, square, and trine, and opposite, -Of noxious efficacy, and when to join -In synod unbenign; and taught the fixed -Their influence malignant when to shower, -Which of them rising with the sun, or falling, -Should prove tempestuous: To the winds they set -Their corners, when with bluster to confound -Sea, air, and shore; the thunder when to roll -With terrour through the dark aereal hall. -Some say, he bid his Angels turn ascanse -The poles of earth, twice ten degrees and more, -From the sun's axle; they with labour pushed -Oblique the centrick globe: Some say, the sun -Was bid turn reins from the equinoctial road -Like distant breadth to Taurus with the seven -Atlantick Sisters, and the Spartan Twins, -Up to the Tropick Crab: thence down amain -By Leo, and the Virgin, and the Scales, -As deep as Capricorn; to bring in change -Of seasons to each clime; else had the spring -Perpetual smiled on earth with vernant flowers, -Equal in days and nights, except to those -Beyond the polar circles; to them day -Had unbenighted shone, while the low sun, -To recompense his distance, in their sight -Had rounded still the horizon, and not known -Or east or west; which had forbid the snow -From cold Estotiland, and south as far -Beneath Magellan. At that tasted fruit -The sun, as from Thyestean banquet, turned -His course intended; else, how had the world -Inhabited, though sinless, more than now, -Avoided pinching cold and scorching heat? -These changes in the Heavens, though slow, produced -Like change on sea and land; sideral blast, -Vapour, and mist, and exhalation hot, -Corrupt and pestilent: Now from the north -Of Norumbega, and the Samoed shore, -Bursting their brazen dungeon, armed with ice, -And snow, and hail, and stormy gust and flaw, -Boreas, and Caecias, and Argestes loud, -And Thrascias, rend the woods, and seas upturn; -With adverse blast upturns them from the south -Notus, and Afer black with thunderous clouds -From Serraliona; thwart of these, as fierce, -Forth rush the Levant and the Ponent winds, -Eurus and Zephyr, with their lateral noise, -Sirocco and Libecchio. Thus began -Outrage from lifeless things; but Discord first, -Daughter of Sin, among the irrational -Death introduced, through fierce antipathy: -Beast now with beast 'gan war, and fowl with fowl, -And fish with fish; to graze the herb all leaving, -Devoured each other; nor stood much in awe -Of Man, but fled him; or, with countenance grim, -Glared on him passing. These were from without -The growing miseries, which Adam saw -Already in part, though hid in gloomiest shade, -To sorrow abandoned, but worse felt within; -And, in a troubled sea of passion tost, -Thus to disburden sought with sad complaint. -O miserable of happy! Is this the end -Of this new glorious world, and me so late -The glory of that glory, who now become -Accursed, of blessed? hide me from the face -Of God, whom to behold was then my highth -Of happiness!--Yet well, if here would end -The misery; I deserved it, and would bear -My own deservings; but this will not serve: -All that I eat or drink, or shall beget, -Is propagated curse. O voice, once heard -Delightfully, Encrease and multiply; -Now death to hear! for what can I encrease, -Or multiply, but curses on my head? -Who of all ages to succeed, but, feeling -The evil on him brought by me, will curse -My head? Ill fare our ancestor impure, -For this we may thank Adam! but his thanks -Shall be the execration: so, besides -Mine own that bide upon me, all from me -Shall with a fierce reflux on me rebound; -On me, as on their natural center, light -Heavy, though in their place. O fleeting joys -Of Paradise, dear bought with lasting woes! -Did I request thee, Maker, from my clay -To mould me Man? did I solicit thee -From darkness to promote me, or here place -In this delicious garden? As my will -Concurred not to my being, it were but right -And equal to reduce me to my dust; -Desirous to resign and render back -All I received; unable to perform -Thy terms too hard, by which I was to hold -The good I sought not. To the loss of that, -Sufficient penalty, why hast thou added -The sense of endless woes? Inexplicable -Why am I mocked with death, and lengthened out -To deathless pain? How gladly would I meet -Mortality my sentence, and be earth -Insensible! How glad would lay me down -As in my mother's lap! There I should rest, -And sleep secure; his dreadful voice no more -Would thunder in my ears; no fear of worse -To me, and to my offspring, would torment me -With cruel expectation. Yet one doubt -Pursues me still, lest all I cannot die; -Lest that pure breath of life, the spirit of Man -Which God inspired, cannot together perish -With this corporeal clod; then, in the grave, -Or in some other dismal place, who knows -But I shall die a living death? O thought -Horrid, if true! Yet why? It was but breath -Of life that sinned; what dies but what had life -And sin? The body properly had neither, -All of me then shall die: let this appease -The doubt, since human reach no further knows. -For though the Lord of all be infinite, -Is his wrath also? Be it, Man is not so, -But mortal doomed. How can he exercise -Wrath without end on Man, whom death must end? -Can he make deathless death? That were to make -Strange contradiction, which to God himself -Impossible is held; as argument -Of weakness, not of power. Will he draw out, -For anger's sake, finite to infinite, -In punished Man, to satisfy his rigour, -Satisfied never? That were to extend -His sentence beyond dust and Nature's law; -By which all causes else, according still -To the reception of their matter, act; -Not to the extent of their own sphere. But say -That death be not one stroke, as I supposed, -Bereaving sense, but endless misery -From this day onward; which I feel begun -Both in me, and without me; and so last -To perpetuity;--Ay me!that fear -Comes thundering back with dreadful revolution -On my defenceless head; both Death and I -Am found eternal, and incorporate both; -Nor I on my part single; in me all -Posterity stands cursed: Fair patrimony -That I must leave ye, Sons! O, were I able -To waste it all myself, and leave ye none! -So disinherited, how would you bless -Me, now your curse! Ah, why should all mankind, -For one man's fault, thus guiltless be condemned, -It guiltless? But from me what can proceed, -But all corrupt; both mind and will depraved -Not to do only, but to will the same -With me? How can they then acquitted stand -In sight of God? Him, after all disputes, -Forced I absolve: all my evasions vain, -And reasonings, though through mazes, lead me still -But to my own conviction: first and last -On me, me only, as the source and spring -Of all corruption, all the blame lights due; -So might the wrath! Fond wish!couldst thou support -That burden, heavier than the earth to bear; -Than all the world much heavier, though divided -With that bad Woman? Thus, what thou desirest, -And what thou fearest, alike destroys all hope -Of refuge, and concludes thee miserable -Beyond all past example and future; -To Satan only like both crime and doom. -O Conscience! into what abyss of fears -And horrours hast thou driven me; out of which -I find no way, from deep to deeper plunged! -Thus Adam to himself lamented loud, -Through the still night; not now, as ere Man fell, -Wholesome, and cool, and mild, but with black air -Accompanied; with damps, and dreadful gloom; -Which to his evil conscience represented -All things with double terrour: On the ground -Outstretched he lay, on the cold ground; and oft -Cursed his creation; Death as oft accused -Of tardy execution, since denounced -The day of his offence. Why comes not Death, -Said he, with one thrice-acceptable stroke -To end me? Shall Truth fail to keep her word, -Justice Divine not hasten to be just? -But Death comes not at call; Justice Divine -Mends not her slowest pace for prayers or cries, -O woods, O fountains, hillocks, dales, and bowers! -With other echo late I taught your shades -To answer, and resound far other song.-- -Whom thus afflicted when sad Eve beheld, -Desolate where she sat, approaching nigh, -Soft words to his fierce passion she assayed: -But her with stern regard he thus repelled. -Out of my sight, thou Serpent! That name best -Befits thee with him leagued, thyself as false -And hateful; nothing wants, but that thy shape, -Like his, and colour serpentine, may show -Thy inward fraud; to warn all creatures from thee -Henceforth; lest that too heavenly form, pretended -To hellish falshood, snare them! But for thee -I had persisted happy; had not thy pride -And wandering vanity, when least was safe, -Rejected my forewarning, and disdained -Not to be trusted; longing to be seen, -Though by the Devil himself; him overweening -To over-reach; but, with the serpent meeting, -Fooled and beguiled; by him thou, I by thee -To trust thee from my side; imagined wise, -Constant, mature, proof against all assaults; -And understood not all was but a show, -Rather than solid virtue; all but a rib -Crooked by nature, bent, as now appears, -More to the part sinister, from me drawn; -Well if thrown out, as supernumerary -To my just number found. O! why did God, -Creator wise, that peopled highest Heaven -With Spirits masculine, create at last -This novelty on earth, this fair defect -Of nature, and not fill the world at once -With Men, as Angels, without feminine; -Or find some other way to generate -Mankind? This mischief had not been befallen, -And more that shall befall; innumerable -Disturbances on earth through female snares, -And strait conjunction with this sex: for either -He never shall find out fit mate, but such -As some misfortune brings him, or mistake; -Or whom he wishes most shall seldom gain -Through her perverseness, but shall see her gained -By a far worse; or, if she love, withheld -By parents; or his happiest choice too late -Shall meet, already linked and wedlock-bound -To a fell adversary, his hate or shame: -Which infinite calamity shall cause -To human life, and houshold peace confound. -He added not, and from her turned; but Eve, -Not so repulsed, with tears that ceased not flowing -And tresses all disordered, at his feet -Fell humble; and, embracing them, besought -His peace, and thus proceeded in her plaint. -Forsake me not thus, Adam! witness Heaven -What love sincere, and reverence in my heart -I bear thee, and unweeting have offended, -Unhappily deceived! Thy suppliant -I beg, and clasp thy knees; bereave me not, -Whereon I live, thy gentle looks, thy aid, -Thy counsel, in this uttermost distress, -My only strength and stay: Forlorn of thee, -Whither shall I betake me, where subsist? -While yet we live, scarce one short hour perhaps, -Between us two let there be peace; both joining, -As joined in injuries, one enmity -Against a foe by doom express assigned us, -That cruel Serpent: On me exercise not -Thy hatred for this misery befallen; -On me already lost, me than thyself -More miserable! Both have sinned;but thou -Against God only; I against God and thee; -And to the place of judgement will return, -There with my cries importune Heaven; that all -The sentence, from thy head removed, may light -On me, sole cause to thee of all this woe; -Me, me only, just object of his ire! -She ended weeping; and her lowly plight, -Immoveable, till peace obtained from fault -Acknowledged and deplored, in Adam wrought -Commiseration: Soon his heart relented -Towards her, his life so late, and sole delight, -Now at his feet submissive in distress; -Creature so fair his reconcilement seeking, -His counsel, whom she had displeased, his aid: -As one disarmed, his anger all he lost, -And thus with peaceful words upraised her soon. -Unwary, and too desirous, as before, -So now of what thou knowest not, who desirest -The punishment all on thyself; alas! -Bear thine own first, ill able to sustain -His full wrath, whose thou feelest as yet least part, -And my displeasure bearest so ill. If prayers -Could alter high decrees, I to that place -Would speed before thee, and be louder heard, -That on my head all might be visited; -Thy frailty and infirmer sex forgiven, -To me committed, and by me exposed. -But rise;--let us no more contend, nor blame -Each other, blamed enough elsewhere; but strive -In offices of love, how we may lighten -Each other's burden, in our share of woe; -Since this day's death denounced, if aught I see, -Will prove no sudden, but a slow-paced evil; -A long day's dying, to augment our pain; -And to our seed (O hapless seed!) derived. -To whom thus Eve, recovering heart, replied. -Adam, by sad experiment I know -How little weight my words with thee can find, -Found so erroneous; thence by just event -Found so unfortunate: Nevertheless, -Restored by thee, vile as I am, to place -Of new acceptance, hopeful to regain -Thy love, the sole contentment of my heart -Living or dying, from thee I will not hide -What thoughts in my unquiet breast are risen, -Tending to some relief of our extremes, -Or end; though sharp and sad, yet tolerable, -As in our evils, and of easier choice. -If care of our descent perplex us most, -Which must be born to certain woe, devoured -By Death at last; and miserable it is -To be to others cause of misery, -Our own begotten, and of our loins to bring -Into this cursed world a woeful race, -That after wretched life must be at last -Food for so foul a monster; in thy power -It lies, yet ere conception to prevent -The race unblest, to being yet unbegot. -Childless thou art, childless remain: so Death -Shall be deceived his glut, and with us two -Be forced to satisfy his ravenous maw. -But if thou judge it hard and difficult, -Conversing, looking, loving, to abstain -From love's due rights, nuptial embraces sweet; -And with desire to languish without hope, -Before the present object languishing -With like desire; which would be misery -And torment less than none of what we dread; -Then, both ourselves and seed at once to free -From what we fear for both, let us make short, -- -Let us seek Death; -- or, he not found, supply -With our own hands his office on ourselves: -Why stand we longer shivering under fears, -That show no end but death, and have the power, -Of many ways to die the shortest choosing, -Destruction with destruction to destroy? -- -She ended here, or vehement despair -Broke off the rest: so much of death her thoughts -Had entertained, as dyed her cheeks with pale. -But Adam, with such counsel nothing swayed, -To better hopes his more attentive mind -Labouring had raised; and thus to Eve replied. -Eve, thy contempt of life and pleasure seems -To argue in thee something more sublime -And excellent, than what thy mind contemns; -But self-destruction therefore sought, refutes -That excellence thought in thee; and implies, -Not thy contempt, but anguish and regret -For loss of life and pleasure overloved. -Or if thou covet death, as utmost end -Of misery, so thinking to evade -The penalty pronounced; doubt not but God -Hath wiselier armed his vengeful ire, than so -To be forestalled; much more I fear lest death, -So snatched, will not exempt us from the pain -We are by doom to pay; rather, such acts -Of contumacy will provoke the Highest -To make death in us live: Then let us seek -Some safer resolution, which methinks -I have in view, calling to mind with heed -Part of our sentence, that thy seed shall bruise -The Serpent's head; piteous amends! unless -Be meant, whom I conjecture, our grand foe, -Satan; who, in the serpent, hath contrived -Against us this deceit: To crush his head -Would be revenge indeed! which will be lost -By death brought on ourselves, or childless days -Resolved, as thou proposest; so our foe -Shal 'scape his punishment ordained, and we -Instead shall double ours upon our heads. -No more be mentioned then of violence -Against ourselves; and wilful barrenness, -That cuts us off from hope; and savours only -Rancour and pride, impatience and despite, -Reluctance against God and his just yoke -Laid on our necks. Remember with what mild -And gracious temper he both heard, and judged, -Without wrath or reviling; we expected -Immediate dissolution, which we thought -Was meant by death that day; when lo!to thee -Pains only in child-bearing were foretold, -And bringing forth; soon recompensed with joy, -Fruit of thy womb: On me the curse aslope -Glanced on the ground; with labour I must earn -My bread; what harm? Idleness had been worse; -My labour will sustain me; and, lest cold -Or heat should injure us, his timely care -Hath, unbesought, provided; and his hands -Clothed us unworthy, pitying while he judged; -How much more, if we pray him, will his ear -Be open, and his heart to pity incline, -And teach us further by what means to shun -The inclement seasons, rain, ice, hail, and snow! -Which now the sky, with various face, begins -To show us in this mountain; while the winds -Blow moist and keen, shattering the graceful locks -Of these fair spreading trees; which bids us seek -Some better shroud, some better warmth to cherish -Our limbs benummed, ere this diurnal star -Leave cold the night, how we his gathered beams -Reflected may with matter sere foment; -Or, by collision of two bodies, grind -The air attrite to fire; as late the clouds -Justling, or pushed with winds, rude in their shock, -Tine the slant lightning; whose thwart flame, driven down -Kindles the gummy bark of fir or pine; -And sends a comfortable heat from far, -Which might supply the sun: Such fire to use, -And what may else be remedy or cure -To evils which our own misdeeds have wrought, -He will instruct us praying, and of grace -Beseeching him; so as we need not fear -To pass commodiously this life, sustained -By him with many comforts, till we end -In dust, our final rest and native home. -What better can we do, than, to the place -Repairing where he judged us, prostrate fall -Before him reverent; and there confess -Humbly our faults, and pardon beg; with tears -Watering the ground, and with our sighs the air -Frequenting, sent from hearts contrite, in sign -Of sorrow unfeigned, and humiliation meek - - - -Book XI - - -Undoubtedly he will relent, and turn -From his displeasure; in whose look serene, -When angry most he seemed and most severe, -What else but favour, grace, and mercy, shone? -So spake our father penitent; nor Eve -Felt less remorse: they, forthwith to the place -Repairing where he judged them, prostrate fell -Before him reverent; and both confessed -Humbly their faults, and pardon begged; with tears -Watering the ground, and with their sighs the air -Frequenting, sent from hearts contrite, in sign -Of sorrow unfeigned, and humiliation meek. -Thus they, in lowliest plight, repentant stood -Praying; for from the mercy-seat above -Prevenient grace descending had removed -The stony from their hearts, and made new flesh -Regenerate grow instead; that sighs now breathed -Unutterable; which the Spirit of prayer -Inspired, and winged for Heaven with speedier flight -Than loudest oratory: Yet their port -Not of mean suitors; nor important less -Seemed their petition, than when the ancient pair -In fables old, less ancient yet than these, -Deucalion and chaste Pyrrha, to restore -The race of mankind drowned, before the shrine -Of Themis stood devout. To Heaven their prayers -Flew up, nor missed the way, by envious winds -Blown vagabond or frustrate: in they passed -Dimensionless through heavenly doors; then clad -With incense, where the golden altar fumed, -By their great intercessour, came in sight -Before the Father's throne: them the glad Son -Presenting, thus to intercede began. -See$ Father, what first-fruits on earth are sprung -From thy implanted grace in Man; these sighs -And prayers, which in this golden censer mixed -With incense, I thy priest before thee bring; -Fruits of more pleasing savour, from thy seed -Sown with contrition in his heart, than those -Which, his own hand manuring, all the trees -Of Paradise could have produced, ere fallen -From innocence. Now therefore, bend thine ear -To supplication; hear his sighs, though mute; -Unskilful with what words to pray, let me -Interpret for him; me, his advocate -And propitiation; all his works on me, -Good, or not good, ingraft; my merit those -Shall perfect, and for these my death shall pay. -Accept me; and, in me, from these receive -The smell of peace toward mankind: let him live -Before thee reconciled, at least his days -Numbered, though sad; till death, his doom, (which I -To mitigate thus plead, not to reverse,) -To better life shall yield him: where with me -All my redeemed may dwell in joy and bliss; -Made one with me, as I with thee am one. -To whom the Father, without cloud, serene. -All thy request for Man, accepted Son, -Obtain; all thy request was my decree: -But, longer in that Paradise to dwell, -The law I gave to Nature him forbids: -Those pure immortal elements, that know, -No gross, no unharmonious mixture foul, -Eject him, tainted now; and purge him off, -As a distemper, gross, to air as gross, -And mortal food; as may dispose him best -For dissolution wrought by sin, that first -Distempered all things, and of incorrupt -Corrupted. I, at first, with two fair gifts -Created him endowed; with happiness, -And immortality: that fondly lost, -This other served but to eternize woe; -Till I provided death: so death becomes -His final remedy; and, after life, -Tried in sharp tribulation, and refined -By faith and faithful works, to second life, -Waked in the renovation of the just, -Resigns him up with Heaven and Earth renewed. -But let us call to synod all the Blest, -Through Heaven's wide bounds: from them I will not hide -My judgements; how with mankind I proceed, -As how with peccant Angels late they saw, -And in their state, though firm, stood more confirmed. -He ended, and the Son gave signal high -To the bright minister that watched; he blew -His trumpet, heard in Oreb since perhaps -When God descended, and perhaps once more -To sound at general doom. The angelick blast -Filled all the regions: from their blisful bowers -Of amarantine shade, fountain or spring, -By the waters of life, where'er they sat -In fellowships of joy, the sons of light -Hasted, resorting to the summons high; -And took their seats; till from his throne supreme -The Almighty thus pronounced his sovran will. -O Sons, like one of us Man is become -To know both good and evil, since his taste -Of that defended fruit; but let him boast -His knowledge of good lost, and evil got; -Happier! had it sufficed him to have known -Good by itself, and evil not at all. -He sorrows now, repents, and prays contrite, -My motions in him; longer than they move, -His heart I know, how variable and vain, -Self-left. Lest therefore his now bolder hand -Reach also of the tree of life, and eat, -And live for ever, dream at least to live -For ever, to remove him I decree, -And send him from the garden forth to till -The ground whence he was taken, fitter soil. -Michael, this my behest have thou in charge; -Take to thee from among the Cherubim -Thy choice of flaming warriours, lest the Fiend, -Or in behalf of Man, or to invade -Vacant possession, some new trouble raise: -Haste thee, and from the Paradise of God -Without remorse drive out the sinful pair; -From hallowed ground the unholy; and denounce -To them, and to their progeny, from thence -Perpetual banishment. Yet, lest they faint -At the sad sentence rigorously urged, -(For I behold them softened, and with tears -Bewailing their excess,) all terrour hide. -If patiently thy bidding they obey, -Dismiss them not disconsolate; reveal -To Adam what shall come in future days, -As I shall thee enlighten; intermix -My covenant in the Woman's seed renewed; -So send them forth, though sorrowing, yet in peace: -And on the east side of the garden place, -Where entrance up from Eden easiest climbs, -Cherubick watch; and of a sword the flame -Wide-waving; all approach far off to fright, -And guard all passage to the tree of life: -Lest Paradise a receptacle prove -To Spirits foul, and all my trees their prey; -With whose stolen fruit Man once more to delude. -He ceased; and the arch-angelick Power prepared -For swift descent; with him the cohort bright -Of watchful Cherubim: four faces each -Had, like a double Janus; all their shape -Spangled with eyes more numerous than those -Of Argus, and more wakeful than to drouse, -Charmed with Arcadian pipe, the pastoral reed -Of Hermes, or his opiate rod. Mean while, -To re-salute the world with sacred light, -Leucothea waked; and with fresh dews imbalmed -The earth; when Adam and first matron Eve -Had ended now their orisons, and found -Strength added from above; new hope to spring -Out of despair; joy, but with fear yet linked; -Which thus to Eve his welcome words renewed. -Eve, easily my faith admit, that all -The good which we enjoy from Heaven descends; -But, that from us aught should ascend to Heaven -So prevalent as to concern the mind -Of God high-blest, or to incline his will, -Hard to belief may seem; yet this will prayer -Or one short sigh of human breath, upborne -Even to the seat of God. For since I sought -By prayer the offended Deity to appease; -Kneeled, and before him humbled all my heart; -Methought I saw him placable and mild, -Bending his ear; persuasion in me grew -That I was heard with favour; peace returned -Home to my breast, and to my memory -His promise, that thy seed shall bruise our foe; -Which, then not minded in dismay, yet now -Assures me that the bitterness of death -Is past, and we shall live. Whence hail to thee, -Eve rightly called, mother of all mankind, -Mother of all things living, since by thee -Man is to live; and all things live for Man. -To whom thus Eve with sad demeanour meek. -Ill-worthy I such title should belong -To me transgressour; who, for thee ordained -A help, became thy snare; to me reproach -Rather belongs, distrust, and all dispraise: -But infinite in pardon was my Judge, -That I, who first brought death on all, am graced -The source of life; next favourable thou, -Who highly thus to entitle me vouchsaf'st, -Far other name deserving. But the field -To labour calls us, now with sweat imposed, -Though after sleepless night; for see!the morn, -All unconcerned with our unrest, begins -Her rosy progress smiling: let us forth; -I never from thy side henceforth to stray, -Where'er our day's work lies, though now enjoined -Laborious, till day droop; while here we dwell, -What can be toilsome in these pleasant walks? -Here let us live, though in fallen state, content. -So spake, so wished much humbled Eve; but Fate -Subscribed not: Nature first gave signs, impressed -On bird, beast, air; air suddenly eclipsed, -After short blush of morn; nigh in her sight -The bird of Jove, stooped from his aery tour, -Two birds of gayest plume before him drove; -Down from a hill the beast that reigns in woods, -First hunter then, pursued a gentle brace, -Goodliest of all the forest, hart and hind; -Direct to the eastern gate was bent their flight. -Adam observed, and with his eye the chase -Pursuing, not unmoved, to Eve thus spake. -O Eve, some further change awaits us nigh, -Which Heaven, by these mute signs in Nature, shows -Forerunners of his purpose; or to warn -Us, haply too secure, of our discharge -From penalty, because from death released -Some days: how long, and what till then our life, -Who knows? or more than this, that we are dust, -And thither must return, and be no more? -Why else this double object in our sight -Of flight pursued in the air, and o'er the ground, -One way the self-same hour? why in the east -Darkness ere day's mid-course, and morning-light -More orient in yon western cloud, that draws -O'er the blue firmament a radiant white, -And slow descends with something heavenly fraught? -He erred not; for by this the heavenly bands -Down from a sky of jasper lighted now -In Paradise, and on a hill made halt; -A glorious apparition, had not doubt -And carnal fear that day dimmed Adam's eye. -Not that more glorious, when the Angels met -Jacob in Mahanaim, where he saw -The field pavilioned with his guardians bright; -Nor that, which on the flaming mount appeared -In Dothan, covered with a camp of fire, -Against the Syrian king, who to surprise -One man, assassin-like, had levied war, -War unproclaimed. The princely Hierarch -In their bright stand there left his Powers, to seise -Possession of the garden; he alone, -To find where Adam sheltered, took his way, -Not unperceived of Adam; who to Eve, -While the great visitant approached, thus spake. -Eve$ now expect great tidings, which perhaps -Of us will soon determine, or impose -New laws to be observed; for I descry, -From yonder blazing cloud that veils the hill, -One of the heavenly host; and, by his gait, -None of the meanest; some great Potentate -Or of the Thrones above; such majesty -Invests him coming! yet not terrible, -That I should fear; nor sociably mild, -As Raphael, that I should much confide; -But solemn and sublime; whom not to offend, -With reverence I must meet, and thou retire. -He ended: and the Arch-Angel soon drew nigh, -Not in his shape celestial, but as man -Clad to meet man; over his lucid arms -A military vest of purple flowed, -Livelier than Meliboean, or the grain -Of Sarra, worn by kings and heroes old -In time of truce; Iris had dipt the woof; -His starry helm unbuckled showed him prime -In manhood where youth ended; by his side, -As in a glistering zodiack, hung the sword, -Satan's dire dread; and in his hand the spear. -Adam bowed low; he, kingly, from his state -Inclined not, but his coming thus declared. -Adam, Heaven's high behest no preface needs: -Sufficient that thy prayers are heard; and Death, -Then due by sentence when thou didst transgress, -Defeated of his seisure many days -Given thee of grace; wherein thou mayest repent, -And one bad act with many deeds well done -Mayest cover: Well may then thy Lord, appeased, -Redeem thee quite from Death's rapacious claim; -But longer in this Paradise to dwell -Permits not: to remove thee I am come, -And send thee from the garden forth to till -The ground whence thou wast taken, fitter soil. -He added not; for Adam at the news -Heart-struck with chilling gripe of sorrow stood, -That all his senses bound; Eve, who unseen -Yet all had heard, with audible lament -Discovered soon the place of her retire. -O unexpected stroke, worse than of Death! -Must I thus leave thee$ Paradise? thus leave -Thee, native soil! these happy walks and shades, -Fit haunt of Gods? where I had hope to spend, -Quiet though sad, the respite of that day -That must be mortal to us both. O flowers, -That never will in other climate grow, -My early visitation, and my last - ;t even, which I bred up with tender hand -From the first opening bud, and gave ye names! -Who now shall rear ye to the sun, or rank -Your tribes, and water from the ambrosial fount? -Thee lastly, nuptial bower! by me adorned -With what to sight or smell was sweet! from thee -How shall I part, and whither wander down -Into a lower world; to this obscure -And wild? how shall we breathe in other air -Less pure, accustomed to immortal fruits? -Whom thus the Angel interrupted mild. -Lament not, Eve, but patiently resign -What justly thou hast lost, nor set thy heart, -Thus over-fond, on that which is not thine: -Thy going is not lonely; with thee goes -Thy husband; whom to follow thou art bound; -Where he abides, think there thy native soil. -Adam, by this from the cold sudden damp -Recovering, and his scattered spirits returned, -To Michael thus his humble words addressed. -Celestial, whether among the Thrones, or named -Of them the highest; for such of shape may seem -Prince above princes! gently hast thou told -Thy message, which might else in telling wound, -And in performing end us; what besides -Of sorrow, and dejection, and despair, -Our frailty can sustain, thy tidings bring, -Departure from this happy place, our sweet -Recess, and only consolation left -Familiar to our eyes! all places else -Inhospitable appear, and desolate; -Nor knowing us, nor known: And, if by prayer -Incessant I could hope to change the will -Of Him who all things can, I would not cease -To weary him with my assiduous cries: -But prayer against his absolute decree -No more avails than breath against the wind, -Blown stifling back on him that breathes it forth: -Therefore to his great bidding I submit. -This most afflicts me, that, departing hence, -As from his face I shall be hid, deprived -His blessed countenance: Here I could frequent -With worship place by place where he vouchsafed -Presence Divine; and to my sons relate, -'On this mount he appeared; under this tree -'Stood visible; among these pines his voice -'I heard; here with him at this fountain talked: -So many grateful altars I would rear -Of grassy turf, and pile up every stone -Of lustre from the brook, in memory, -Or monument to ages; and theron -Offer sweet-smelling gums, and fruits, and flowers: -In yonder nether world where shall I seek -His bright appearances, or foot-step trace? -For though I fled him angry, yet recalled -To life prolonged and promised race, I now -Gladly behold though but his utmost skirts -Of glory; and far off his steps adore. -To whom thus Michael with regard benign. -Adam, thou knowest Heaven his, and all the Earth; -Not this rock only; his Omnipresence fills -Land, sea, and air, and every kind that lives, -Fomented by his virtual power and warmed: -All the earth he gave thee to possess and rule, -No despicable gift; surmise not then -His presence to these narrow bounds confined -Of Paradise, or Eden: this had been -Perhaps thy capital seat, from whence had spread -All generations; and had hither come -From all the ends of the earth, to celebrate -And reverence thee, their great progenitor. -But this pre-eminence thou hast lost, brought down -To dwell on even ground now with thy sons: -Yet doubt not but in valley, and in plain, -God is, as here; and will be found alike -Present; and of his presence many a sign -Still following thee, still compassing thee round -With goodness and paternal love, his face -Express, and of his steps the track divine. -Which that thou mayest believe, and be confirmed -Ere thou from hence depart; know, I am sent -To show thee what shall come in future days -To thee, and to thy offspring: good with bad -Expect to hear; supernal grace contending -With sinfulness of men; thereby to learn -True patience, and to temper joy with fear -And pious sorrow; equally inured -By moderation either state to bear, -Prosperous or adverse: so shalt thou lead -Safest thy life, and best prepared endure -Thy mortal passage when it comes.--Ascend -This hill; let Eve (for I have drenched her eyes) -Here sleep below; while thou to foresight wakest; -As once thou sleptst, while she to life was formed. -To whom thus Adam gratefully replied. -Ascend, I follow thee, safe Guide, the path -Thou leadest me; and to the hand of Heaven submit, -However chastening; to the evil turn -My obvious breast; arming to overcome -By suffering, and earn rest from labour won, -If so I may attain. -- So both ascend -In the visions of God. It was a hill, -Of Paradise the highest; from whose top -The hemisphere of earth, in clearest ken, -Stretched out to the amplest reach of prospect lay. -Not higher that hill, nor wider looking round, -Whereon, for different cause, the Tempter set -Our second Adam, in the wilderness; -To show him all Earth's kingdoms, and their glory. -His eye might there command wherever stood -City of old or modern fame, the seat -Of mightiest empire, from the destined walls -Of Cambalu, seat of Cathaian Can, -And Samarchand by Oxus, Temir's throne, -To Paquin of Sinaean kings; and thence -To Agra and Lahor of great Mogul, -Down to the golden Chersonese; or where -The Persian in Ecbatan sat, or since -In Hispahan; or where the Russian Ksar -In Mosco; or the Sultan in Bizance, -Turchestan-born; nor could his eye not ken -The empire of Negus to his utmost port -Ercoco, and the less maritim kings -Mombaza, and Quiloa, and Melind, -And Sofala, thought Ophir, to the realm -Of Congo, and Angola farthest south; -Or thence from Niger flood to Atlas mount -The kingdoms of Almansor, Fez and Sus, -Morocco, and Algiers, and Tremisen; -On Europe thence, and where Rome was to sway -The world: in spirit perhaps he also saw -Rich Mexico, the seat of Montezume, -And Cusco in Peru, the richer seat -Of Atabalipa; and yet unspoiled -Guiana, whose great city Geryon's sons -Call El Dorado. But to nobler sights -Michael from Adam's eyes the film removed, -Which that false fruit that promised clearer sight -Had bred; then purged with euphrasy and rue -The visual nerve, for he had much to see; -And from the well of life three drops instilled. -So deep the power of these ingredients pierced, -Even to the inmost seat of mental sight, -That Adam, now enforced to close his eyes, -Sunk down, and all his spirits became entranced; -But him the gentle Angel by the hand -Soon raised, and his attention thus recalled. -Adam, now ope thine eyes; and first behold -The effects, which thy original crime hath wrought -In some to spring from thee; who never touched -The excepted tree; nor with the snake conspired; -Nor sinned thy sin; yet from that sin derive -Corruption, to bring forth more violent deeds. -His eyes he opened, and beheld a field, -Part arable and tilth, whereon were sheaves -New reaped; the other part sheep-walks and folds; -I' the midst an altar as the land-mark stood, -Rustick, of grassy sord; thither anon -A sweaty reaper from his tillage brought -First fruits, the green ear, and the yellow sheaf, -Unculled, as came to hand; a shepherd next, -More meek, came with the firstlings of his flock, -Choicest and best; then, sacrificing, laid -The inwards and their fat, with incense strowed, -On the cleft wood, and all due rights performed: -His offering soon propitious fire from Heaven -Consumed with nimble glance, and grateful steam; -The other's not, for his was not sincere; -Whereat he inly raged, and, as they talked, -Smote him into the midriff with a stone -That beat out life; he fell;and, deadly pale, -Groaned out his soul with gushing blood effused. -Much at that sight was Adam in his heart -Dismayed, and thus in haste to the Angel cried. -O Teacher, some great mischief hath befallen -To that meek man, who well had sacrificed; -Is piety thus and pure devotion paid? -To whom Michael thus, he also moved, replied. -These two are brethren, Adam, and to come -Out of thy loins; the unjust the just hath slain, -For envy that his brother's offering found -From Heaven acceptance; but the bloody fact -Will be avenged; and the other's faith, approved, -Lose no reward; though here thou see him die, -Rolling in dust and gore. To which our sire. -Alas! both for the deed, and for the cause! -But have I now seen Death? Is this the way -I must return to native dust? O sight -Of terrour, foul and ugly to behold, -Horrid to think, how horrible to feel! -To whom thus Michael. Death thou hast seen -In his first shape on Man; but many shapes -Of Death, and many are the ways that lead -To his grim cave, all dismal; yet to sense -More terrible at the entrance, than within. -Some, as thou sawest, by violent stroke shall die; -By fire, flood, famine, by intemperance more -In meats and drinks, which on the earth shall bring -Diseases dire, of which a monstrous crew -Before thee shall appear; that thou mayest know -What misery the inabstinence of Eve -Shall bring on Men. Immediately a place -Before his eyes appeared, sad, noisome, dark; -A lazar-house it seemed; wherein were laid -Numbers of all diseased; all maladies -Of ghastly spasm, or racking torture, qualms -Of heart-sick agony, all feverous kinds, -Convulsions, epilepsies, fierce catarrhs, -Intestine stone and ulcer, colick-pangs, -Demoniack phrenzy, moaping melancholy, -And moon-struck madness, pining atrophy, -Marasmus, and wide-wasting pestilence, -Dropsies, and asthmas, and joint-racking rheums. -Dire was the tossing, deep the groans; Despair -Tended the sick busiest from couch to couch; -And over them triumphant Death his dart -Shook, but delayed to strike, though oft invoked -With vows, as their chief good, and final hope. -Sight so deform what heart of rock could long -Dry-eyed behold? Adam could not, but wept, -Though not of woman born; compassion quelled -His best of man, and gave him up to tears -A space, till firmer thoughts restrained excess; -And, scarce recovering words, his plaint renewed. -O miserable mankind, to what fall -Degraded, to what wretched state reserved! -Better end here unborn. Why is life given -To be thus wrested from us? rather, why -Obtruded on us thus? who, if we knew -What we receive, would either no accept -Life offered, or soon beg to lay it down; -Glad to be so dismissed in peace. Can thus -The image of God in Man, created once -So goodly and erect, though faulty since, -To such unsightly sufferings be debased -Under inhuman pains? Why should not Man, -Retaining still divine similitude -In part, from such deformities be free, -And, for his Maker's image sake, exempt? -Their Maker's image, answered Michael, then -Forsook them, when themselves they vilified -To serve ungoverned Appetite; and took -His image whom they served, a brutish vice, -Inductive mainly to the sin of Eve. -Therefore so abject is their punishment, -Disfiguring not God's likeness, but their own; -Or if his likeness, by themselves defaced; -While they pervert pure Nature's healthful rules -To loathsome sickness; worthily, since they -God's image did not reverence in themselves. -I yield it just, said Adam, and submit. -But is there yet no other way, besides -These painful passages, how we may come -To death, and mix with our connatural dust? -There is, said Michael, if thou well observe -The rule of Not too much; by temperance taught, -In what thou eatest and drinkest; seeking from thence -Due nourishment, not gluttonous delight, -Till many years over thy head return: -So mayest thou live; till, like ripe fruit, thou drop -Into thy mother's lap; or be with ease -Gathered, nor harshly plucked; for death mature: -This is Old Age; but then, thou must outlive -Thy youth, thy strength, thy beauty; which will change -To withered, weak, and gray; thy senses then, -Obtuse, all taste of pleasure must forego, -To what thou hast; and, for the air of youth, -Hopeful and cheerful, in thy blood will reign -A melancholy damp of cold and dry -To weigh thy spirits down, and last consume -The balm of life. To whom our ancestor. -Henceforth I fly not death, nor would prolong -Life much; bent rather, how I may be quit, -Fairest and easiest, of this cumbrous charge; -Which I must keep till my appointed day -Of rendering up, and patiently attend -My dissolution. Michael replied. -Nor love thy life, nor hate; but what thou livest -Live well; how long, or short, permit to Heaven: -And now prepare thee for another sight. -He looked, and saw a spacious plain, whereon -Were tents of various hue; by some, were herds -Of cattle grazing; others, whence the sound -Of instruments, that made melodious chime, -Was heard, of harp and organ; and, who moved -Their stops and chords, was seen; his volant touch, -Instinct through all proportions, low and high, -Fled and pursued transverse the resonant fugue. -In other part stood one who, at the forge -Labouring, two massy clods of iron and brass -Had melted, (whether found where casual fire -Had wasted woods on mountain or in vale, -Down to the veins of earth; thence gliding hot -To some cave's mouth; or whether washed by stream -From underground;) the liquid ore he drained -Into fit moulds prepared; from which he formed -First his own tools; then, what might else be wrought -Fusil or graven in metal. After these, -But on the hither side, a different sort -From the high neighbouring hills, which was their seat, -Down to the plain descended; by their guise -Just men they seemed, and all their study bent -To worship God aright, and know his works -Not hid; nor those things last, which might preserve -Freedom and peace to Men; they on the plain -Long had not walked, when from the tents, behold! -A bevy of fair women, richly gay -In gems and wanton dress; to the harp they sung -Soft amorous ditties, and in dance came on: -The men, though grave, eyed them; and let their eyes -Rove without rein; till, in the amorous net -Fast caught, they liked; and each his liking chose; -And now of love they treat, till the evening-star, -Love's harbinger, appeared; then, all in heat -They light the nuptial torch, and bid invoke -Hymen, then first to marriage rites invoked: -With feast and musick all the tents resound. -Such happy interview, and fair event -Of love and youth not lost, songs, garlands, flowers, -And charming symphonies, attached the heart -Of Adam, soon inclined to admit delight, -The bent of nature; which he thus expressed. -True opener of mine eyes, prime Angel blest; -Much better seems this vision, and more hope -Of peaceful days portends, than those two past; -Those were of hate and death, or pain much worse; -Here Nature seems fulfilled in all her ends. -To whom thus Michael. Judge not what is best -By pleasure, though to nature seeming meet; -Created, as thou art, to nobler end -Holy and pure, conformity divine. -Those tents thou sawest so pleasant, were the tents -Of wickedness, wherein shall dwell his race -Who slew his brother; studious they appear -Of arts that polish life, inventers rare; -Unmindful of their Maker, though his Spirit -Taught them; but they his gifts acknowledged none. -Yet they a beauteous offspring shall beget; -For that fair female troop thou sawest, that seemed -Of Goddesses, so blithe, so smooth, so gay, -Yet empty of all good wherein consists -Woman's domestick honour and chief praise; -Bred only and completed to the taste -Of lustful appetence, to sing, to dance, -To dress, and troll the tongue, and roll the eye: -To these that sober race of men, whose lives -Religious titled them the sons of God, -Shall yield up all their virtue, all their fame -Ignobly, to the trains and to the smiles -Of these fair atheists; and now swim in joy, -Erelong to swim at large; and laugh, for which -The world erelong a world of tears must weep. -To whom thus Adam, of short joy bereft. -O pity and shame, that they, who to live well -Entered so fair, should turn aside to tread -Paths indirect, or in the mid way faint! -But still I see the tenour of Man's woe -Holds on the same, from Woman to begin. -From Man's effeminate slackness it begins, -Said the Angel, who should better hold his place -By wisdom, and superiour gifts received. -But now prepare thee for another scene. -He looked, and saw wide territory spread -Before him, towns, and rural works between; -Cities of men with lofty gates and towers, -Concourse in arms, fierce faces threatening war, -Giants of mighty bone and bold emprise; -Part wield their arms, part curb the foaming steed, -Single or in array of battle ranged -Both horse and foot, nor idly mustering stood; -One way a band select from forage drives -A herd of beeves, fair oxen and fair kine, -From a fat meadow ground; or fleecy flock, -Ewes and their bleating lambs over the plain, -Their booty; scarce with life the shepherds fly, -But call in aid, which makes a bloody fray; -With cruel tournament the squadrons join; -Where cattle pastured late, now scattered lies -With carcasses and arms the ensanguined field, -Deserted: Others to a city strong -Lay siege, encamped; by battery, scale, and mine, -Assaulting; others from the wall defend -With dart and javelin, stones, and sulphurous fire; -On each hand slaughter, and gigantick deeds. -In other part the sceptered heralds call -To council, in the city-gates; anon -Gray-headed men and grave, with warriours mixed, -Assemble, and harangues are heard; but soon, -In factious opposition; till at last, -Of middle age one rising, eminent -In wise deport, spake much of right and wrong, -Of justice, or religion, truth, and peace, -And judgement from above: him old and young -Exploded, and had seized with violent hands, -Had not a cloud descending snatched him thence -Unseen amid the throng: so violence -Proceeded, and oppression, and sword-law, -Through all the plain, and refuge none was found. -Adam was all in tears, and to his guide -Lamenting turned full sad; O!what are these, -Death's ministers, not men? who thus deal death -Inhumanly to men, and multiply -Ten thousandfold the sin of him who slew -His brother: for of whom such massacre -Make they, but of their brethren; men of men -But who was that just man, whom had not Heaven -Rescued, had in his righteousness been lost? -To whom thus Michael. These are the product -Of those ill-mated marriages thou sawest; -Where good with bad were matched, who of themselves -Abhor to join; and, by imprudence mixed, -Produce prodigious births of body or mind. -Such were these giants, men of high renown; -For in those days might only shall be admired, -And valour and heroick virtue called; -To overcome in battle, and subdue -Nations, and bring home spoils with infinite -Man-slaughter, shall be held the highest pitch -Of human glory; and for glory done -Of triumph, to be styled great conquerours -Patrons of mankind, Gods, and sons of Gods; -Destroyers rightlier called, and plagues of men. -Thus fame shall be achieved, renown on earth; -And what most merits fame, in silence hid. -But he, the seventh from thee, whom thou beheldst -The only righteous in a world preverse, -And therefore hated, therefore so beset -With foes, for daring single to be just, -And utter odious truth, that God would come -To judge them with his Saints; him the Most High -Rapt in a balmy cloud with winged steeds -Did, as thou sawest, receive, to walk with God -High in salvation and the climes of bliss, -Exempt from death; to show thee what reward -Awaits the good; the rest what punishment; -Which now direct thine eyes and soon behold. -He looked, and saw the face of things quite changed; -The brazen throat of war had ceased to roar; -All now was turned to jollity and game, -To luxury and riot, feast and dance; -Marrying or prostituting, as befel, -Rape or adultery, where passing fair -Allured them; thence from cups to civil broils. -At length a reverend sire among them came, -And of their doings great dislike declared, -And testified against their ways; he oft -Frequented their assemblies, whereso met, -Triumphs or festivals; and to them preached -Conversion and repentance, as to souls -In prison, under judgements imminent: -But all in vain: which when he saw, he ceased -Contending, and removed his tents far off; -Then, from the mountain hewing timber tall, -Began to build a vessel of huge bulk; -Measured by cubit, length, and breadth, and highth; -Smeared round with pitch; and in the side a door -Contrived; and of provisions laid in large, -For man and beast: when lo, a wonder strange! -Of every beast, and bird, and insect small, -Came sevens, and pairs; and entered in as taught -Their order: last the sire and his three sons, -With their four wives; and God made fast the door. -Mean while the south-wind rose, and, with black wings -Wide-hovering, all the clouds together drove -From under Heaven; the hills to their supply -Vapour, and exhalation dusk and moist, -Sent up amain; and now the thickened sky -Like a dark cieling stood; down rushed the rain -Impetuous; and continued, till the earth -No more was seen: the floating vessel swum -Uplifted, and secure with beaked prow -Rode tilting o'er the waves; all dwellings else -Flood overwhelmed, and them with all their pomp -Deep under water rolled; sea covered sea, -Sea without shore; and in their palaces, -Where luxury late reigned, sea-monsters whelped -And stabled; of mankind, so numerous late, -All left, in one small bottom swum imbarked. -How didst thou grieve then, Adam, to behold -The end of all thy offspring, end so sad, -Depopulation! Thee another flood, -Of tears and sorrow a flood, thee also drowned, -And sunk thee as thy sons; till, gently reared -By the Angel, on thy feet thou stoodest at last, -Though comfortless; as when a father mourns -His children, all in view destroyed at once; -And scarce to the Angel utter'dst thus thy plaint. -O visions ill foreseen! Better had I -Lived ignorant of future! so had borne -My part of evil only, each day's lot -Enough to bear; those now, that were dispensed -The burden of many ages, on me light -At once, by my foreknowledge gaining birth -Abortive, to torment me ere their being, -With thought that they must be. Let no man seek -Henceforth to be foretold, what shall befall -Him or his children; evil he may be sure, -Which neither his foreknowing can prevent; -And he the future evil shall no less -In apprehension than in substance feel, -Grievous to bear: but that care now is past, -Man is not whom to warn: those few escaped -Famine and anguish will at last consume, -Wandering that watery desart: I had hope, -When violence was ceased, and war on earth, -All would have then gone well; peace would have crowned -With length of happy days the race of Man; -But I was far deceived; for now I see -Peace to corrupt no less than war to waste. -How comes it thus? unfold, celestial Guide, -And whether here the race of Man will end. -To whom thus Michael. Those, whom last thou sawest -In triumph and luxurious wealth, are they -First seen in acts of prowess eminent -And great exploits, but of true virtue void; -Who, having spilt much blood, and done much wast -Subduing nations, and achieved thereby -Fame in the world, high titles, and rich prey; -Shall change their course to pleasure, ease, and sloth, -Surfeit, and lust; till wantonness and pride -Raise out of friendship hostile deeds in peace. -The conquered also, and enslaved by war, -Shall, with their freedom lost, all virtue lose -And fear of God; from whom their piety feigned -In sharp contest of battle found no aid -Against invaders; therefore, cooled in zeal, -Thenceforth shall practice how to live secure, -Worldly or dissolute, on what their lords -Shall leave them to enjoy; for the earth shall bear -More than enough, that temperance may be tried: -So all shall turn degenerate, all depraved; -Justice and temperance, truth and faith, forgot; -One man except, the only son of light -In a dark age, against example good, -Against allurement, custom, and a world -Offended: fearless of reproach and scorn, -The grand-child, with twelve sons encreased, departs -From Canaan, to a land hereafter called -Egypt, divided by the river Nile; -See where it flows, disgorging at seven mouths -Into the sea: To sojourn in that land -He comes, invited by a younger son -In time of dearth; a son, whose worthy deeds -Raise him to be the second in that realm -Of Pharaoh: There he dies, and leaves his race -Growing into a nation, and now grown -Suspected to a sequent king, who seeks -To stop their overgrowth, as inmate guests -Or violence, he of their wicked ways -Shall them admonish; and before them set -The paths of righteousness, how much more safe -And full of peace; denouncing wrath to come -On their impenitence; and shall return -Of them derided, but of God observed -The one just man alive; by his command -Shall build a wonderous ark, as thou beheldst, -To save himself, and houshold, from amidst -A world devote to universal wrack. -No sooner he, with them of man and beast -Select for life, shall in the ark be lodged, -And sheltered round; but all the cataracts -Of Heaven set open on the Earth shall pour -Rain, day and night; all fountains of the deep, -Broke up, shall heave the ocean to usurp -Beyond all bounds; till inundation rise -Above the highest hills: Then shall this mount -Of Paradise by might of waves be moved -Out of his place, pushed by the horned flood, -With all his verdure spoiled, and trees adrift, -Down the great river to the opening gulf, -And there take root an island salt and bare, -The haunt of seals, and orcs, and sea-mews' clang: -To teach thee that God attributes to place -No sanctity, if none be thither brought -By men who there frequent, or therein dwell. -And now, what further shall ensue, behold. -He looked, and saw the ark hull on the flood, -Which now abated; for the clouds were fled, -Driven by a keen north-wind, that, blowing dry, -Wrinkled the face of deluge, as decayed; -And the clear sun on his wide watery glass -Gazed hot, and of the fresh wave largely drew, -As after thirst; which made their flowing shrink -From standing lake to tripping ebb, that stole -With soft foot towards the deep; who now had stopt -His sluces, as the Heaven his windows shut. -The ark no more now floats, but seems on ground, -Fast on the top of some high mountain fixed. -And now the tops of hills, as rocks, appear; -With clamour thence the rapid currents drive, -Towards the retreating sea, their furious tide. -Forthwith from out the ark a raven flies, -And after him, the surer messenger, -A dove sent forth once and again to spy -Green tree or ground, whereon his foot may light: -The second time returning, in his bill -An olive-leaf he brings, pacifick sign: -Anon dry ground appears, and from his ark -The ancient sire descends, with all his train; -Then with uplifted hands, and eyes devout, -Grateful to Heaven, over his head beholds -A dewy cloud, and in the cloud a bow -Conspicuous with three lifted colours gay, -Betokening peace from God, and covenant new. -Whereat the heart of Adam, erst so sad, -Greatly rejoiced; and thus his joy broke forth. -O thou, who future things canst represent -As present, heavenly Instructer! I revive -At this last sight; assured that Man shall live, -With all the creatures, and their seed preserve. -Far less I now lament for one whole world -Of wicked sons destroyed, than I rejoice -For one man found so perfect, and so just, -That God vouchsafes to raise another world -From him, and all his anger to forget. -But say, what mean those coloured streaks in Heaven -Distended, as the brow of God appeased? -Or serve they, as a flowery verge, to bind -The fluid skirts of that same watery cloud, -Lest it again dissolve, and shower the earth? -To whom the Arch-Angel. Dextrously thou aimest; -So willingly doth God remit his ire, -Though late repenting him of Man depraved; -Grieved at his heart, when looking down he saw -The whole earth filled with violence, and all flesh -Corrupting each their way; yet, those removed, -Such grace shall one just man find in his sight, -That he relents, not to blot out mankind; -And makes a covenant never to destroy -The earth again by flood; nor let the sea -Surpass his bounds; nor rain to drown the world, -With man therein or beast; but, when he brings -Over the earth a cloud, will therein set -His triple-coloured bow, whereon to look, -And call to mind his covenant: Day and night, -Seed-time and harvest, heat and hoary frost, -Shall hold their course; till fire purge all things new, -Both Heaven and Earth, wherein the just shall dwell. - - - -Book XII - - -As one who in his journey bates at noon, -Though bent on speed; so here the Arch-Angel paused -Betwixt the world destroyed and world restored, -If Adam aught perhaps might interpose; -Then, with transition sweet, new speech resumes. -Thus thou hast seen one world begin, and end; -And Man, as from a second stock, proceed. -Much thou hast yet to see; but I perceive -Thy mortal sight to fail; objects divine -Must needs impair and weary human sense: -Henceforth what is to come I will relate; -Thou therefore give due audience, and attend. -This second source of Men, while yet but few, -And while the dread of judgement past remains -Fresh in their minds, fearing the Deity, -With some regard to what is just and right -Shall lead their lives, and multiply apace; -Labouring the soil, and reaping plenteous crop, -Corn, wine, and oil; and, from the herd or flock, -Oft sacrificing bullock, lamb, or kid, -With large wine-offerings poured, and sacred feast, -Shall spend their days in joy unblamed; and dwell -Long time in peace, by families and tribes, -Under paternal rule: till one shall rise -Of proud ambitious heart; who, not content -With fair equality, fraternal state, -Will arrogate dominion undeserved -Over his brethren, and quite dispossess -Concord and law of nature from the earth; -Hunting (and men not beasts shall be his game) -With war, and hostile snare, such as refuse -Subjection to his empire tyrannous: -A mighty hunter thence he shall be styled -Before the Lord; as in despite of Heaven, -Or from Heaven, claiming second sovranty; -And from rebellion shall derive his name, -Though of rebellion others he accuse. -He with a crew, whom like ambition joins -With him or under him to tyrannize, -Marching from Eden towards the west, shall find -The plain, wherein a black bituminous gurge -Boils out from under ground, the mouth of Hell: -Of brick, and of that stuff, they cast to build -A city and tower, whose top may reach to Heaven; -And get themselves a name; lest, far dispersed -In foreign lands, their memory be lost; -Regardless whether good or evil fame. -But God, who oft descends to visit men -Unseen, and through their habitations walks -To mark their doings, them beholding soon, -Comes down to see their city, ere the tower -Obstruct Heaven-towers, and in derision sets -Upon their tongues a various spirit, to rase -Quite out their native language; and, instead, -To sow a jangling noise of words unknown: -Forthwith a hideous gabble rises loud, -Among the builders; each to other calls -Not understood; till hoarse, and all in rage, -As mocked they storm: great laughter was in Heaven, -And looking down, to see the hubbub strange, -And hear the din: Thus was the building left -Ridiculous, and the work Confusion named. -Whereto thus Adam, fatherly displeased. -O execrable son! so to aspire -Above his brethren; to himself assuming -Authority usurped, from God not given: -He gave us only over beast, fish, fowl, -Dominion absolute; that right we hold -By his donation; but man over men -He made not lord; such title to himself -Reserving, human left from human free. -But this usurper his encroachment proud -Stays not on Man; to God his tower intends -Siege and defiance: Wretched man!what food -Will he convey up thither, to sustain -Himself and his rash army; where thin air -Above the clouds will pine his entrails gross, -And famish him of breath, if not of bread? -To whom thus Michael. Justly thou abhorrest -That son, who on the quiet state of men -Such trouble brought, affecting to subdue -Rational liberty; yet know withal, -Since thy original lapse, true liberty -Is lost, which always with right reason dwells -Twinned, and from her hath no dividual being: -Reason in man obscured, or not obeyed, -Immediately inordinate desires, -And upstart passions, catch the government -From reason; and to servitude reduce -Man, till then free. Therefore, since he permits -Within himself unworthy powers to reign -Over free reason, God, in judgement just, -Subjects him from without to violent lords; -Who oft as undeservedly enthrall -His outward freedom: Tyranny must be; -Though to the tyrant thereby no excuse. -Yet sometimes nations will decline so low -From virtue, which is reason, that no wrong, -But justice, and some fatal curse annexed, -Deprives them of their outward liberty; -Their inward lost: Witness the irreverent son -Of him who built the ark; who, for the shame -Done to his father, heard this heavy curse, -Servant of servants, on his vicious race. -Thus will this latter, as the former world, -Still tend from bad to worse; till God at last, -Wearied with their iniquities, withdraw -His presence from among them, and avert -His holy eyes; resolving from thenceforth -To leave them to their own polluted ways; -And one peculiar nation to select -From all the rest, of whom to be invoked, -A nation from one faithful man to spring: -Him on this side Euphrates yet residing, -Bred up in idol-worship: O, that men -(Canst thou believe?) should be so stupid grown, -While yet the patriarch lived, who 'scaped the flood, -As to forsake the living God, and fall -To worship their own work in wood and stone -For Gods! Yet him God the Most High vouchsafes -To call by vision, from his father's house, -His kindred, and false Gods, into a land -Which he will show him; and from him will raise -A mighty nation; and upon him shower -His benediction so, that in his seed -All nations shall be blest: he straight obeys; -Not knowing to what land, yet firm believes: -I see him, but thou canst not, with what faith -He leaves his Gods, his friends, and native soil, -Ur of Chaldaea, passing now the ford -To Haran; after him a cumbrous train -Of herds and flocks, and numerous servitude; -Not wandering poor, but trusting all his wealth -With God, who called him, in a land unknown. -Canaan he now attains; I see his tents -Pitched about Sechem, and the neighbouring plain -Of Moreh; there by promise he receives -Gift to his progeny of all that land, -From Hameth northward to the Desart south; -(Things by their names I call, though yet unnamed;) -From Hermon east to the great western Sea; -Mount Hermon, yonder sea; each place behold -In prospect, as I point them; on the shore -Mount Carmel; here, the double-founted stream, -Jordan, true limit eastward; but his sons -Shall dwell to Senir, that long ridge of hills. -This ponder, that all nations of the earth -Shall in his seed be blessed: By that seed -Is meant thy great Deliverer, who shall bruise -The Serpent's head; whereof to thee anon -Plainlier shall be revealed. This patriarch blest, -Whom faithful Abraham due time shall call, -A son, and of his son a grand-child, leaves; -Like him in faith, in wisdom, and renown: -The grandchild, with twelve sons increased, departs -From Canaan to a land hereafter called -Egypt, divided by the river Nile -See where it flows, disgorging at seven mouths -Into the sea. To sojourn in that land -He comes, invited by a younger son -In time of dearth, a son whose worthy deeds -Raise him to be the second in that realm -Of Pharaoh. There he dies, and leaves his race -Growing into a nation, and now grown -Suspected to a sequent king, who seeks -To stop their overgrowth, as inmate guests -Too numerous; whence of guests he makes them slaves -Inhospitably, and kills their infant males: -Till by two brethren (these two brethren call -Moses and Aaron) sent from God to claim -His people from enthralment, they return, -With glory and spoil, back to their promised land. -But first, the lawless tyrant, who denies -To know their God, or message to regard, -Must be compelled by signs and judgements dire; -To blood unshed the rivers must be turned; -Frogs, lice, and flies, must all his palace fill -With loathed intrusion, and fill all the land; -His cattle must of rot and murren die; -Botches and blains must all his flesh emboss, -And all his people; thunder mixed with hail, -Hail mixed with fire, must rend the Egyptians sky, -And wheel on the earth, devouring where it rolls; -What it devours not, herb, or fruit, or grain, -A darksome cloud of locusts swarming down -Must eat, and on the ground leave nothing green; -Darkness must overshadow all his bounds, -Palpable darkness, and blot out three days; -Last, with one midnight stroke, all the first-born -Of Egypt must lie dead. Thus with ten wounds -The river-dragon tamed at length submits -To let his sojourners depart, and oft -Humbles his stubborn heart; but still, as ice -More hardened after thaw; till, in his rage -Pursuing whom he late dismissed, the sea -Swallows him with his host; but them lets pass, -As on dry land, between two crystal walls; -Awed by the rod of Moses so to stand -Divided, till his rescued gain their shore: -Such wondrous power God to his saint will lend, -Though present in his Angel; who shall go -Before them in a cloud, and pillar of fire; -By day a cloud, by night a pillar of fire; -To guide them in their journey, and remove -Behind them, while the obdurate king pursues: -All night he will pursue; but his approach -Darkness defends between till morning watch; -Then through the fiery pillar, and the cloud, -God looking forth will trouble all his host, -And craze their chariot-wheels: when by command -Moses once more his potent rod extends -Over the sea; the sea his rod obeys; -On their embattled ranks the waves return, -And overwhelm their war: The race elect -Safe toward Canaan from the shore advance -Through the wild Desart, not the readiest way; -Lest, entering on the Canaanite alarmed, -War terrify them inexpert, and fear -Return them back to Egypt, choosing rather -Inglorious life with servitude; for life -To noble and ignoble is more sweet -Untrained in arms, where rashness leads not on. -This also shall they gain by their delay -In the wide wilderness; there they shall found -Their government, and their great senate choose -Through the twelve tribes, to rule by laws ordained: -God from the mount of Sinai, whose gray top -Shall tremble, he descending, will himself -In thunder, lightning, and loud trumpets' sound, -Ordain them laws; part, such as appertain -To civil justice; part, religious rites -Of sacrifice; informing them, by types -And shadows, of that destined Seed to bruise -The Serpent, by what means he shall achieve -Mankind's deliverance. But the voice of God -To mortal ear is dreadful: They beseech -That Moses might report to them his will, -And terrour cease; he grants what they besought, -Instructed that to God is no access -Without Mediator, whose high office now -Moses in figure bears; to introduce -One greater, of whose day he shall foretel, -And all the Prophets in their age the times -Of great Messiah shall sing. Thus, laws and rites -Established, such delight hath God in Men -Obedient to his will, that he vouchsafes -Among them to set up his tabernacle; -The Holy One with mortal Men to dwell: -By his prescript a sanctuary is framed -Of cedar, overlaid with gold; therein -An ark, and in the ark his testimony, -The records of his covenant; over these -A mercy-seat of gold, between the wings -Of two bright Cherubim; before him burn -Seven lamps as in a zodiack representing -The heavenly fires; over the tent a cloud -Shall rest by day, a fiery gleam by night; -Save when they journey, and at length they come, -Conducted by his Angel, to the land -Promised to Abraham and his seed:--The rest -Were long to tell; how many battles fought -How many kings destroyed; and kingdoms won; -Or how the sun shall in mid Heaven stand still -A day entire, and night's due course adjourn, -Man's voice commanding, 'Sun, in Gibeon stand, -'And thou moon in the vale of Aialon, -'Till Israel overcome! so call the third -From Abraham, son of Isaac; and from him -His whole descent, who thus shall Canaan win. -Here Adam interposed. O sent from Heaven, -Enlightener of my darkness, gracious things -Thou hast revealed; those chiefly, which concern -Just Abraham and his seed: now first I find -Mine eyes true-opening, and my heart much eased; -Erewhile perplexed with thoughts, what would become -Of me and all mankind: But now I see -His day, in whom all nations shall be blest; -Favour unmerited by me, who sought -Forbidden knowledge by forbidden means. -This yet I apprehend not, why to those -Among whom God will deign to dwell on earth -So many and so various laws are given; -So many laws argue so many sins -Among them; how can God with such reside? -To whom thus Michael. Doubt not but that sin -Will reign among them, as of thee begot; -And therefore was law given them, to evince -Their natural pravity, by stirring up -Sin against law to fight: that when they see -Law can discover sin, but not remove, -Save by those shadowy expiations weak, -The blood of bulls and goats, they may conclude -Some blood more precious must be paid for Man; -Just for unjust; that, in such righteousness -To them by faith imputed, they may find -Justification towards God, and peace -Of conscience; which the law by ceremonies -Cannot appease; nor Man the mortal part -Perform; and, not performing, cannot live. -So law appears imperfect; and but given -With purpose to resign them, in full time, -Up to a better covenant; disciplined -From shadowy types to truth; from flesh to spirit; -From imposition of strict laws to free -Acceptance of large grace; from servile fear -To filial; works of law to works of faith. -And therefore shall not Moses, though of God -Highly beloved, being but the minister -Of law, his people into Canaan lead; -But Joshua, whom the Gentiles Jesus call, -His name and office bearing, who shall quell -The adversary-Serpent, and bring back -Through the world's wilderness long-wandered Man -Safe to eternal Paradise of rest. -Mean while they, in their earthly Canaan placed, -Long time shall dwell and prosper, but when sins -National interrupt their publick peace, -Provoking God to raise them enemies; -From whom as oft he saves them penitent -By Judges first, then under Kings; of whom -The second, both for piety renowned -And puissant deeds, a promise shall receive -Irrevocable, that his regal throne -For ever shall endure; the like shall sing -All Prophecy, that of the royal stock -Of David (so I name this king) shall rise -A Son, the Woman's seed to thee foretold, -Foretold to Abraham, as in whom shall trust -All nations; and to kings foretold, of kings -The last; for of his reign shall be no end. -But first, a long succession must ensue; -And his next son, for wealth and wisdom famed, -The clouded ark of God, till then in tents -Wandering, shall in a glorious temple enshrine. -Such follow him, as shall be registered -Part good, part bad; of bad the longer scroll; -Whose foul idolatries, and other faults -Heaped to the popular sum, will so incense -God, as to leave them, and expose their land, -Their city, his temple, and his holy ark, -With all his sacred things, a scorn and prey -To that proud city, whose high walls thou sawest -Left in confusion; Babylon thence called. -There in captivity he lets them dwell -The space of seventy years; then brings them back, -Remembering mercy, and his covenant sworn -To David, stablished as the days of Heaven. -Returned from Babylon by leave of kings -Their lords, whom God disposed, the house of God -They first re-edify; and for a while -In mean estate live moderate; till, grown -In wealth and multitude, factious they grow; -But first among the priests dissention springs, -Men who attend the altar, and should most -Endeavour peace: their strife pollution brings -Upon the temple itself: at last they seise -The scepter, and regard not David's sons; -Then lose it to a stranger, that the true -Anointed King Messiah might be born -Barred of his right; yet at his birth a star, -Unseen before in Heaven, proclaims him come; -And guides the eastern sages, who inquire -His place, to offer incense, myrrh, and gold: -His place of birth a solemn Angel tells -To simple shepherds, keeping watch by night; -They gladly thither haste, and by a quire -Of squadroned Angels hear his carol sung. -A virgin is his mother, but his sire -The power of the Most High: He shall ascend -The throne hereditary, and bound his reign -With Earth's wide bounds, his glory with the Heavens. -He ceased, discerning Adam with such joy -Surcharged, as had like grief been dewed in tears, -Without the vent of words; which these he breathed. -O prophet of glad tidings, finisher -Of utmost hope! now clear I understand -What oft my steadiest thoughts have searched in vain; -Why our great Expectation should be called -The seed of Woman: Virgin Mother, hail, -High in the love of Heaven; yet from my loins -Thou shalt proceed, and from thy womb the Son -Of God Most High: so God with Man unites! -Needs must the Serpent now his capital bruise -Expect with mortal pain: Say where and when -Their fight, what stroke shall bruise the victor's heel. -To whom thus Michael. Dream not of their fight, -As of a duel, or the local wounds -Of head or heel: Not therefore joins the Son -Manhood to Godhead, with more strength to foil -Thy enemy; nor so is overcome -Satan, whose fall from Heaven, a deadlier bruise, -Disabled, not to give thee thy death's wound: -Which he, who comes thy Saviour, shall recure, -Not by destroying Satan, but his works -In thee, and in thy seed: Nor can this be, -But by fulfilling that which thou didst want, -Obedience to the law of God, imposed -On penalty of death, and suffering death; -The penalty to thy transgression due, -And due to theirs which out of thine will grow: -So only can high Justice rest appaid. -The law of God exact he shall fulfil -Both by obedience and by love, though love -Alone fulfil the law; thy punishment -He shall endure, by coming in the flesh -To a reproachful life, and cursed death; -Proclaiming life to all who shall believe -In his redemption; and that his obedience, -Imputed, becomes theirs by faith; his merits -To save them, not their own, though legal, works. -For this he shall live hated, be blasphemed, -Seised on by force, judged, and to death condemned -A shameful and accursed, nailed to the cross -By his own nation; slain for bringing life: -But to the cross he nails thy enemies, -The law that is against thee, and the sins -Of all mankind, with him there crucified, -Never to hurt them more who rightly trust -In this his satisfaction; so he dies, -But soon revives; Death over him no power -Shall long usurp; ere the third dawning light -Return, the stars of morn shall see him rise -Out of his grave, fresh as the dawning light, -Thy ransom paid, which Man from death redeems, -His death for Man, as many as offered life -Neglect not, and the benefit embrace -By faith not void of works: This God-like act -Annuls thy doom, the death thou shouldest have died, -In sin for ever lost from life; this act -Shall bruise the head of Satan, crush his strength, -Defeating Sin and Death, his two main arms; -And fix far deeper in his head their stings -Than temporal death shall bruise the victor's heel, -Or theirs whom he redeems; a death, like sleep, -A gentle wafting to immortal life. -Nor after resurrection shall he stay -Longer on earth, than certain times to appear -To his disciples, men who in his life -Still followed him; to them shall leave in charge -To teach all nations what of him they learned -And his salvation; them who shall believe -Baptizing in the profluent stream, the sign -Of washing them from guilt of sin to life -Pure, and in mind prepared, if so befall, -For death, like that which the Redeemer died. -All nations they shall teach; for, from that day, -Not only to the sons of Abraham's loins -Salvation shall be preached, but to the sons -Of Abraham's faith wherever through the world; -So in his seed all nations shall be blest. -Then to the Heaven of Heavens he shall ascend -With victory, triumphing through the air -Over his foes and thine; there shall surprise -The Serpent, prince of air, and drag in chains -Through all his realm, and there confounded leave; -Then enter into glory, and resume -His seat at God's right hand, exalted high -Above all names in Heaven; and thence shall come, -When this world's dissolution shall be ripe, -With glory and power to judge both quick and dead; -To judge the unfaithful dead, but to reward -His faithful, and receive them into bliss, -Whether in Heaven or Earth; for then the Earth -Shall all be Paradise, far happier place -Than this of Eden, and far happier days. -So spake the Arch-Angel Michael; then paused, -As at the world's great period; and our sire, -Replete with joy and wonder, thus replied. -O Goodness infinite, Goodness immense! -That all this good of evil shall produce, -And evil turn to good; more wonderful -Than that which by creation first brought forth -Light out of darkness! Full of doubt I stand, -Whether I should repent me now of sin -By me done, and occasioned; or rejoice -Much more, that much more good thereof shall spring; -To God more glory, more good-will to Men -From God, and over wrath grace shall abound. -But say, if our Deliverer up to Heaven -Must re-ascend, what will betide the few -His faithful, left among the unfaithful herd, -The enemies of truth? Who then shall guide -His people, who defend? Will they not deal -Worse with his followers than with him they dealt? -Be sure they will, said the Angel; but from Heaven -He to his own a Comforter will send, -The promise of the Father, who shall dwell -His Spirit within them; and the law of faith, -Working through love, upon their hearts shall write, -To guide them in all truth; and also arm -With spiritual armour, able to resist -Satan's assaults, and quench his fiery darts; -What man can do against them, not afraid, -Though to the death; against such cruelties -With inward consolations recompensed, -And oft supported so as shall amaze -Their proudest persecutors: For the Spirit, -Poured first on his Apostles, whom he sends -To evangelize the nations, then on all -Baptized, shall them with wonderous gifts endue -To speak all tongues, and do all miracles, -As did their Lord before them. Thus they win -Great numbers of each nation to receive -With joy the tidings brought from Heaven: At length -Their ministry performed, and race well run, -Their doctrine and their story written left, -They die; but in their room, as they forewarn, -Wolves shall succeed for teachers, grievous wolves, -Who all the sacred mysteries of Heaven -To their own vile advantages shall turn -Of lucre and ambition; and the truth -With superstitions and traditions taint, -Left only in those written records pure, -Though not but by the Spirit understood. -Then shall they seek to avail themselves of names, -Places, and titles, and with these to join -Secular power; though feigning still to act -By spiritual, to themselves appropriating -The Spirit of God, promised alike and given -To all believers; and, from that pretence, -Spiritual laws by carnal power shall force -On every conscience; laws which none shall find -Left them inrolled, or what the Spirit within -Shall on the heart engrave. What will they then -But force the Spirit of Grace itself, and bind -His consort Liberty? what, but unbuild -His living temples, built by faith to stand, -Their own faith, not another's? for, on earth, -Who against faith and conscience can be heard -Infallible? yet many will presume: -Whence heavy persecution shall arise -On all, who in the worship persevere -Of spirit and truth; the rest, far greater part, -Will deem in outward rites and specious forms -Religion satisfied; Truth shall retire -Bestuck with slanderous darts, and works of faith -Rarely be found: So shall the world go on, -To good malignant, to bad men benign; -Under her own weight groaning; till the day -Appear of respiration to the just, -And vengeance to the wicked, at return -Of him so lately promised to thy aid, -The Woman's Seed; obscurely then foretold, -Now ampler known thy Saviour and thy Lord; -Last, in the clouds, from Heaven to be revealed -In glory of the Father, to dissolve -Satan with his perverted world; then raise -From the conflagrant mass, purged and refined, -New Heavens, new Earth, ages of endless date, -Founded in righteousness, and peace, and love; -To bring forth fruits, joy and eternal bliss. -He ended; and thus Adam last replied. -How soon hath thy prediction, Seer blest, -Measured this transient world, the race of time, -Till time stand fixed! Beyond is all abyss, -Eternity, whose end no eye can reach. -Greatly-instructed I shall hence depart; -Greatly in peace of thought; and have my fill -Of knowledge, what this vessel can contain; -Beyond which was my folly to aspire. -Henceforth I learn, that to obey is best, -And love with fear the only God; to walk -As in his presence; ever to observe -His providence; and on him sole depend, -Merciful over all his works, with good -Still overcoming evil, and by small -Accomplishing great things, by things deemed weak -Subverting worldly strong, and worldly wise -By simply meek: that suffering for truth's sake -Is fortitude to highest victory, -And, to the faithful, death the gate of life; -Taught this by his example, whom I now -Acknowledge my Redeemer ever blest. -To whom thus also the Angel last replied. -This having learned, thou hast attained the sum -Of wisdom; hope no higher, though all the stars -Thou knewest by name, and all the ethereal powers, -All secrets of the deep, all Nature's works, -Or works of God in Heaven, air, earth, or sea, -And all the riches of this world enjoyedst, -And all the rule, one empire; only add -Deeds to thy knowledge answerable; add faith, -Add virtue, patience, temperance; add love, -By name to come called charity, the soul -Of all the rest: then wilt thou not be loth -To leave this Paradise, but shalt possess -A Paradise within thee, happier far.-- -Let us descend now therefore from this top -Of speculation; for the hour precise -Exacts our parting hence; and see!the guards, -By me encamped on yonder hill, expect -Their motion; at whose front a flaming sword, -In signal of remove, waves fiercely round: -We may no longer stay: go, waken Eve; -Her also I with gentle dreams have calmed -Portending good, and all her spirits composed -To meek submission: thou, at season fit, -Let her with thee partake what thou hast heard; -Chiefly what may concern her faith to know, -The great deliverance by her seed to come -(For by the Woman's seed) on all mankind: -That ye may live, which will be many days, -Both in one faith unanimous, though sad, -With cause, for evils past; yet much more cheered -With meditation on the happy end. -He ended, and they both descend the hill; -Descended, Adam to the bower, where Eve -Lay sleeping, ran before; but found her waked; -And thus with words not sad she him received. -Whence thou returnest, and whither wentest, I know; -For God is also in sleep; and dreams advise, -Which he hath sent propitious, some great good -Presaging, since with sorrow and heart's distress -Wearied I fell asleep: But now lead on; -In me is no delay; with thee to go, -Is to stay here; without thee here to stay, -Is to go hence unwilling; thou to me -Art all things under $Heaven, all places thou, -Who for my wilful crime art banished hence. -This further consolation yet secure -I carry hence; though all by me is lost, -Such favour I unworthy am vouchsafed, -By me the Promised Seed shall all restore. -So spake our mother Eve; and Adam heard -Well pleased, but answered not: For now, too nigh -The Arch-Angel stood; and, from the other hill -To their fixed station, all in bright array -The Cherubim descended; on the ground -Gliding meteorous, as evening-mist -Risen from a river o'er the marish glides, -And gathers ground fast at the labourer's heel -Homeward returning. High in front advanced, -The brandished sword of God before them blazed, -Fierce as a comet; which with torrid heat, -And vapour as the Libyan air adust, -Began to parch that temperate clime; whereat -In either hand the hastening Angel caught -Our lingering parents, and to the eastern gate -Led them direct, and down the cliff as fast -To the subjected plain; then disappeared. -They, looking back, all the eastern side beheld -Of Paradise, so late their happy seat, -Waved over by that flaming brand; the gate -With dreadful faces thronged, and fiery arms: -Some natural tears they dropt, but wiped them soon; -The world was all before them, where to choose -Their place of rest, and Providence their guide: -They, hand in hand, with wandering steps and slow, -Through Eden took their solitary way. - -[The End] diff --git a/vendor/snap/data/urls.10K b/vendor/snap/data/urls.10K deleted file mode 100644 index eaf0633766..0000000000 --- a/vendor/snap/data/urls.10K +++ /dev/null @@ -1,10000 +0,0 @@ -http://ftp.sektornet.dk/tucows/herdwin0904.html -http://209.143.244.16/directory/us/nd/fargo/insurance/automotive.html -http://bellona.itworld.com:8080/cwi/reprint/0,1926,NAV63-128-1357-1367_STO46538,00.html -http://www.legis.state.ia.us/usr/ns-home/docs/GA/76GA/Session.2/SJournal/01600/01644.html -http://www.centc251.org/forums/aca-1/dispatch.cgi/isowg4/showFolder/100001/1211898 -http://www.burstnet.com/ads/ad7826a-map.cgi/271412263 -http://topcu.tucows.com/winme/adnload/137036_30095.html -http://topcu.tucows.com/winme/adnload/145034_49120.html -http://link.fastpartner.com/do/session/600342/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/bitconomy.php -http://www.retrobytes.org/classiccmp/9911/msg01245.html -http://www.localbusiness.com/Story/Print/0,1197,DFW_196102,00.html -http://bbs.kh.edu.tw/treasure/childhood/M.962620586.A/M.966031025.A/M.966031098.A.html -http://www.hig.se/(accessed,clientname,return)/~jackson/roxen/testform.html -http://www.ipclub.ru:8102/cgi-bin/linkmaker/linklist-view.cgi?owner=elvis&Sector=434 -http://www.dulux.co.uk/UKRETAIL:229853034:DFinity.1QJiP4jMofi7bof -http://www.dominionpost.com/cgi-bin/redirect.exe/85288 -http://br.egroups.com/message/anedotas/3988 -http://www.ing.iac.es/~cfg/group_notes/texinfo/spec/file$_must$_exist_$28appendfile$29.html -http://hurweb01.hurriyetim.com.tr/hur/turk/99/06/22/yasam/14yas.htm -http://www3.plala.or.jp/shinchi/niltuki/mai0416.htm -http://www3.plala.or.jp/shinchi/niltuki/mai0420.htm -http://213.36.119.69/do/session/152968/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www3.travelprice.com/voyages/recherche.phtml -http://www.meristation.es/Trucos/s/starcraft_brood.htm -http://www.meristation.es/Trucos/trainer/train_star_war.htm -http://www.askme.com/cat/ShowCategory_3104_an_9.htm -http://mozilla.org/newlayout/testcases/css/sec542cm.htm -http://ampec.ampec.it/ted/box04/page36.htm -http://ampec.ampec.it/ted/box04/page39.htm -http://ampec.ampec.it/ted/box04/page42.htm -http://ampec.ampec.it/ted/box04/page58.htm -http://ampec.ampec.it/ted/box04/page62.htm -http://www.businesswire.com/webbox/bw.080300/202160192.htm -http://www.businesswire.com/webbox/bw.062700/201790580.htm -http://www.businesswire.com/webbox/bw.040300/200940796.htm -http://retailer.gocollect.com/do/session/1912606/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/product_display/top_ten.asp?pagenum=1 -http://retailer.gocollect.com/do/session/1912606/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/clubhouse/suggestions.asp -http://genforum.genealogy.com/cgi-bin/print.cgi?ivy::116.html -http://www.spiral.at/Katalog/Artikel/6150331/ -http://www.spiral.at/Katalog/Artikel/6150390/ -http://www.spiral.at/Katalog/Artikel/6150411/ -http://bbs.msquare.or.kr/list.bbs/writer/Soohah/8.html -http://www.eskimo.com/~wesn/waflyfishers/msg03537.html -http://denniscares.mp2.homes.com/content/glossary.html?Letter=A -http://library.bangor.ac.uk/search/aChandler,+Peter,+1936-/achandler+peter+1936/-5,-1,0,B/bibandlinks&F=achandler+raymond+1888+1959&5,,6 -http://www.kimkihong.pe.kr/ -http://mayu.sourceforge.net/cgi-bin/nph-ml.cgi/000/http/www.geocrawler.com/archives/3/199/1998/6/0/1323673/ -http://musictz.com/user/fernman.html -http://tucows.concepts.nl/winnt/adnload/1381_28803.html -http://www.mirror.kiev.ua:8083/paper/2000/03/1251/text/03-06-6.htm -http://ring.crl.go.jp/pub/linux/debian/debian-jp/dists/stable/non-free/binary-arm/x11/?N=D -http://news.novgorod.ru/news/2000/4/23/2/9 -http://www.egroups.com/dir/World/Deutsch/Gesellschaft/Bildung/Schule?st=167 -http://www.egroups.com/group/abitur98 -http://genforum.genealogy.com/cgi-genforum/forums/casey.cgi?1477 -http://www.tvstore.com/browse/TV/BOXERSHO/s.UtRroVXF -http://www.tvstore.com/browse/TV/COLLECTI/s.UtRroVXF -http://www.tvstore.com/browse/TV/EARRINGS/s.UtRroVXF -http://polygraph.ircache.net:8181/text/m90/http_-2ewp.aliant.com/attivita.htm -http://rosebay.1000pages.com/ceclgt12.htm -http://www02.u-page.so-net.ne.jp/sb3/mizo/home/sub1/link2/?M=A -http://community.webshots.com/photo/5827455/5827535oqdRLPNiek -http://troy.lib.sfu.ca/search/dbiology+periodicals/dbiology+periodicals/19,-1,0,B/frameset&F=dbiology+religious+aspects&1,1 -http://213.36.119.69/do/session/152973/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/special/alitalia.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/programs/simple/linux/math/computers/tunes.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/programs/simple/linux/math/lit/hasard.html -http://www.elop.de/l0-1011-xx-3006-top.html -http://britanica.com/bcom/eb/article/idxref/0/0,5716,364643,00.html -http://britanica.com/bcom/eb/article/7/0,5716,28557+1+28108,00.html -http://www.geocrawler.com/archives/3/3174/2000/5/50/3724502/ -http://www.geocrawler.com/archives/3/3174/2000/5/50/3699557/ -http://www.geocrawler.com/archives/3/3174/2000/5/50/3689003/ -http://ftp.sunet.se/pub/FreeBSD/ports/ports-stable/net/slirp/files/ -http://www.duluxvalentine.com/FRANCE:219793321:DFinity.1QJiP4jmPgUaedp -http://mundo.ole.es/ocio/articulo/html/oci4270.htm -http://www.maasvlakte-cam.nl/webcams/43/etna__italy/1999/08/29/01:28:02.html -http://www.chinabyte.com/staticpages/builder/builder_course_next/HIPR/builder_course_next_219_HIPR.html -http://www.prospects2.csu.ac.uk/servlet/postgrad.TcAssess?pgid=9634 -http://ftp.sunet.se/pub/lang/perl/CPAN/authors/id/SPP/?N=D -http://www.egroups.com/message/WDT/7751 -http://pub8.ezboard.com/fapricotyarn.unsubscribeUnregisteredToTopic?topicID=4.topic -http://support.tandy.com/support_audio/doc9/9679.htm -http://megalink.tucows.com/winme/preview/74862.html -http://mayu.sourceforge.net/cgi-bin/nph-ml.cgi/000/http/www.geocrawler.com/archives/3/199/1996/2/0/2460450/ -http://www.monaco.gouv.mc/dataweb/gouvmc.nsf/(NewsActu)/d28eaee29b3287d4c1256905004e1ef1!OpenDocument&ExpandSection=10.3,10.4,7,9,4,6 -http://www.fao.org/montes/foda/wforcong/PUBLI/V2/T8S/1-3.HTM -http://library.cuhk.edu.hk/search*chi/a蔡淙霖,+1965-/a%7B215572%7D%7B214758%7D%7B215f60%7D+1965/-5,-1,0,B/browse -http://www.nrk.no/finnmark/x31_12_97/nyh6.htm -http://www.dailyrush.dk/stories/129/comments/pages/1 -http://home.wanadoo.nl/pieter.heres/nedbaskteam/nbt/Web%20Album%20nbt%20spelers/page3.htm -http://members.tripod.co.jp/masa_selfish/?M=A -http://bsd.sinica.edu.tw/cgi-bin/cvsweb.cgi/ports/misc/lile/patches/Attic/?sortby=date -http://www.chaos.dk/sexriddle/z/l/x/y/m/ -http://www.chaos.dk/sexriddle/z/l/x/y/p/ -http://users.sexyboards.com/amandaslut/messages/17.html -http://pub11.ezboard.com/fusscroatiastartrekanimators.showAddTopicScreenFromWeb -http://retailer.gocollect.com/do/session/1912610/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/help/site_tour/index.asp -http://ftp.sunet.se/pub/FreeBSD/ports/ports-current/misc/boxes/pkg-comment -http://www.ce-europe2.philips.com/do/session/80299/vsid/1034/tid/1034/cid/28533/mid/1020/rid/1021/chid/1024/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkZHbjbHrolLmbkKmefLifmLpkZHljlKmoaLl0/url/http://www.eu.microsoft.com/windows/ie_intl/es/ -http://www.peopledaily.co.jp/199904/26/newfiles/col_990426001084_tyxw.html -http://www.peopledaily.co.jp/199904/26/newfiles/col_990426001087_tyxw.html -http://iraustralia.com/listco/hk/swire/profile.htm -http://jefferson.village.virginia.edu/wax/slow/english/3pix/BRight2/1/1a5a15a1.html -http://infoserv2.ita.doc.gov/efm/efm.nsf/Sources!OpenView&Start=35.16&Count=30&Expand=37 -http://www.affiliate.hpstore.hp.co.uk/do/session/380772/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/entry1.asp -http://www.trax.nilex.co.uk/trax.cgi/A1S/B1U/B1R/A3S/A4R/C2U/ -http://www.trax.nilex.co.uk/trax.cgi/A1S/B1U/B1R/A3S/A4R/C2S/ -http://www.quia.com/email.cgi?7106&fc -http://www.mirror.edu.cn/res/sunsite/pub/academic/agriculture/sustainable_agriculture/news+mail-archives/6/ -http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/Beholder/CVSROOT/config?only_with_tag=MAIN -http://collection.nlc-bnc.ca/100/201/300/info_tabac/html/1998/bull21/poumon.html -http://www.erotism.com/sweetlostcherry/g3.htm -http://adex3.flycast.com/server/socket/127.0.0.1:2800/click/SharewareMusicMachine/MusicSoftware1/96457 -http://members.tripod.com/~tonarcos/paginas/Nancy1.html -http://www.gbnf.com/genealog2/stout/html/d0024/I2144.HTM -http://ftp.du.se/disk4/FreeBSD/branches/4.0-stable/ports/deskutils/cbb/ -http://www.hri.org/docs//statedep/95-09-13.std.html -http://ftp.univie.ac.at/packages/tex/macros/latex//contrib/supported/eurofont/adobeuro/readme.txt -http://forum.rai.it/aca-finestre/dispatch.cgi/FORUM/showNextUnseen/fol/100001/1513138 -http://tucows.ipv.pt/winnt/adnload/1891_28712.html -http://www.tucsonweekly.com/tw/02-09-95/danehy.htm -http://message/artefactphil/87?expand=1 -http://www.kiarchive.ru:8091/pub/FreeBSD/FreeBSD-current/src/gnu/Makefile/ -http://retailer.gocollect.com/do/session/1912644/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/index.asp -http://retailer.gocollect.com/do/session/1912644/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/about.asp -http://park.org:8888/Cdrom/TheNot/Mail/NotPark/msg00070.html -http://citeseer.nj.nec.com/cachedpage/67611/1 -http://citeseer.nj.nec.com/cidcontext/1053642 -http://www.3w-buecher.de/GiacamanGeorge/GiacamanGeorge0745312381.htm -http://au.yahoo.com/Regional/U_S__States/Colorado/Cities/Littleton/Real_Estate/Agencies/ -http://www.power2lead.com/Global/English.nsf/pgWWLocations!OpenPage&ExpandSection=21,28,29,32,22 -http://hem.fyristorg.com/bfo/gagarin/WWW.SAMIRADIO.ORG/svenska/sport-sv.html -http://www.chaos.dk/sexriddle/e/n/q/v/m/ -http://www.hig.se/(formoutput,remove_cookie,sort,sql,sqlquery)/~jackson/roxen/ -http://129.142.8.149/ds/it/isodocs/122400/12240011/12240000117900/ -http://129.142.8.149/ds/it/isodocs/122400/12240011/12240000116400/ -http://129.142.8.149/ds/it/isodocs/122400/12240011/12240000116200/ -http://129.142.8.149/ds/it/isodocs/122400/12240011/12240000113100/ -http://129.142.8.149/ds/it/isodocs/122400/12240011/12240000110800/ -http://koi.www.citycat.ru/funny/fido/2000_10/07.html -http://koi.www.citycat.ru/funny/fido/2000_10/09.html -http://www.hig.se/(countdown,debug,header,if,return)/~jackson/roxen/ -http://www.findtravel.to/search_engine_directory/north_america_usa_canada/united_states/michigan/_travel_guides/ -http://mediate.magicbutton.net/do/session/625534/vsid/3255/tid/3255/cid/87978/mid/2008/rid/2157/chid/2581/url/http://www1.getmapping.com/competition/index.cfm -http://mediate.magicbutton.net/do/session/625534/vsid/3255/tid/3255/cid/87978/mid/2008/rid/2157/chid/2581/url/http://www1.getmapping.com/aboutus/partners2.cfm -http://www.petropages.com/products/p9827.htm -http://www.egroups.com/login.cgi?login_target=%2Fmessage%2Fspynews%2F54 -http://health.sx.zj.cn/Treatment/SuperGuide/2000-3-8/4716.htm -http://www.nease.net/~qin/chardware.htm -http://www.argos.asso.fr/bourges/pratiq/emploi/texte/anpesud.htm -http://ftp.sunet.se/pub/FreeBSD/ports/ports-current/www/p5-Apache-Session/?S=A -http://www.eveclub.com/cgi-bin/eveclub.front/972959425847/Catalog/1000046 -http://retailer.gocollect.com/do/session/1912628/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/product_display/top_ten.asp?pagenum=1 -http://yp.gates96.com/1/10/21/73.html -http://yp.gates96.com/1/10/21/95.html -http://yp.gates96.com/1/10/22/21.html -http://yp.gates96.com/1/10/22/31.html -http://yp.gates96.com/1/10/22/52.html -http://yp.gates96.com/1/10/22/76.html -http://yp.gates96.com/1/10/22/79.html -http://yp.gates96.com/1/10/23/57.html -http://yp.gates96.com/1/10/23/73.html -http://yp.gates96.com/1/10/25/20.html -http://yp.gates96.com/1/10/25/46.html -http://yp.gates96.com/1/10/25/87.html -http://yp.gates96.com/1/10/26/76.html -http://yp.gates96.com/1/10/26/84.html -http://yp.gates96.com/1/10/27/67.html -http://yp.gates96.com/1/10/28/70.html -http://yp.gates96.com/1/10/28/91.html -http://live.excite.com/lifestyle/politics_and_society/countries/asia/uzbekistan/guides_and_reference/ -http://biblioteca.upv.es/bib/doc/doc_fisbd/367/114176//C/1825519/0////25/S/MLTPAI -http://mai.flora.org/forum/5322 -http://mai.flora.org/forum/5318 -http://www.brickshelf.com/scans/0000/0715/0715-03.html -http://www.brickshelf.com/scans/0000/0715/0715-12.html -http://www.brickshelf.com/scans/0000/0715/0715-21.html -http://www.msb.malmo.se/search*swe/dManikyr/dmanikyr/-5,-1,0,B/frameset&F=dmani&1,1 -http://message/cinematik/2441?expand=1 -http://message/cinematik/2447?expand=1 -http://www.jamba.de/KNet/_KNet-Rco8j1-WDd-137sh/showInfo-special1.de/node.0/cde7f1uou -http://www.jamba.de/KNet/_KNet-Rco8j1-WDd-137ss/showInfo-hilfe.de/node.0/cde7f1uou -http://acmepet.petsmart.com/canine/breeds/labrador/bboard/messages/5245.html -http://acmepet.petsmart.com/canine/breeds/labrador/bboard/messages/5226.html -http://config.tucows.com/winnt/adnload/67680_29009.html -http://config.tucows.com/winnt/adnload/55386_29005.html -http://us.mandrakesoft.com/cgi-bin/cvsweb.cgi/kdeutils/knotes/Attic/renamedlg.cpp?r1=1.7&only_with_tag=MAIN -http://www.imagestation.com/member/?name=Twiggy5&c=1 -http://cometweb01.comet.co.uk/do!tid=20&rtid=3&vsid=700&session=131981&mid=1000&rid=1060&cid=37030&chid=1713&url=eqqLmwlGltt5tkZHljbLqkZHlkrHhlZHljbLqleHqjiLlel5jblKqlmLkeq5j1 -http://community.webshots.com/photo/1921549/2334169DWEIWPyCoH -http://www.fogdog.com/cedroID/ssd3040183158605/nav/stores/skateboarding/ -http://www.fogdog.com/cedroID/ssd3040183158605/content/fan/subway_series/ -http://www.fogdog.com/cedroID/ssd3040183158605/boutique/ashworth/ -http://www.fogdog.com/cedroID/ssd3040183158605/customer_service/our_partners.html -http://www.jacksonhewitt.com/ctg/cgi-bin/JacksonHewitt/media_center/AAAksrACwAAACCOAAl -http://www.jacksonhewitt.com/ctg/cgi-bin/JacksonHewitt/talktous/AAAksrACwAAACCOAAl -http://arabia.com/jordan/article/print/1,5130,3048|Life,00.html -http://198.3.99.101/reference/politics_and_govt/humor/games/ -http://www.pocketbible.co.kr/old/Leviticus/Leviticus24/Leviticus24-14.htm -http://www.ozon.ru/detail.cfm/ent=5&id=12&txt=1 -http://www.ozon.ru/detail.cfm/ent=2&id=2141 -http://www.chaos.dk/sexriddle/m/t/i/t/j/ -http://www.outpersonals.com/cgi-bin/w3com/pws/out/5VhIq3rCy0eiHAzs1LOyTswNBIR33Wxc8NtFBCnYVNlrV5p9laRchaQrPWdU7-F739tsfX-p5-IA-j1rTm1YLCRAwn1FAriW9Ps21GP6CvyIL7YFYjLtOcez03i6Q9Xw3LRDtJY2CIzGQuZp-sH_-s_D66j9 -http://www.outpersonals.com/cgi-bin/w3com/pws/out/lKhIoWbn-weE729M1n0JT8Ina4qOfm_FI2ROg8RdrrVu5kq_AK_urPMHafLCMwWCiOLuc8OIIHCFnJaCfz2LSrURBHFjDJP1fBO0X58Y28opSv0qVXWAKYtub7NbCIIWMbE_ldcypBmh -http://www.outpersonals.com/cgi-bin/w3com/pws/out/PbhIoduIKw3faQWbBTWSK5aq7Y-nGqcvK3flLaTRo02t7k7GMY8rPlupJIheD8869wCXUAer4VimzyYa25qUx7ef2l2VdMR9i_p-pJ5gg2S6ZcP-G6RuPfdDS3TEsJNXGVsOTs1rA605 -http://www.linux.com/networking/network/development/web_server/performance/?printable=yes -http://www.linux.com/networking/network/development/web_server/performance/IBM/ -http://sunsite.icm.edu.pl/Linux/Documentation/HOWTO/mini/IP-Subnetworking-3.html -http://dreamcity.gaiax.com/www/dreamcity/m/s/musou/frame.html -http://guardian.co.uk/Widgets/Read_It_Later/TR/1,4694,4043922,00.html -http://www.gpul.org/ftp/os/infinite/?M=A -http://www.gpul.org/ftp/os/infinite/infinite_OS.txt -http://retailer.gocollect.com/do/session/1912666/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/exclusives/exclusives.asp -http://yp.gates96.com/13/77/10/66.html -http://yp.gates96.com/13/77/10/91.html -http://yp.gates96.com/13/77/11/82.html -http://yp.gates96.com/13/77/12/17.html -http://yp.gates96.com/13/77/13/68.html -http://yp.gates96.com/13/77/13/80.html -http://yp.gates96.com/13/77/16/3.html -http://yp.gates96.com/13/77/16/17.html -http://yp.gates96.com/13/77/16/49.html -http://yp.gates96.com/13/77/17/8.html -http://yp.gates96.com/13/77/18/4.html -http://yp.gates96.com/13/77/18/61.html -http://yp.gates96.com/13/77/18/71.html -http://yp.gates96.com/13/77/19/3.html -http://yp.gates96.com/13/77/19/24.html -http://yp.gates96.com/13/77/19/48.html -http://yp.gates96.com/13/77/19/98.html -http://yp.gates96.com/13/77/19/99.html -http://scsinternet.tucows.com/winnt/mail95.html -http://tolm.terrashare.com/45.htm -http://news.dreamwiz.com/news/08/20001030/kukmin/200010301903081903261.html -http://www.tccomputers.com/cgi-bin/bp/1463655603/services/info/tci.htm -http://www.tccomputers.com/cgi-bin/bp/1463655603/services/csc/csc.htm -http://www.2pl.com/b/pl/to/1/01/04/v2/1010400016-6-2r.htm -http://www.2pl.com/b/pl/to/1/01/04/v2/1010400016-3-2r.htm -http://www.2pl.com/b/pl/to/1/01/04/v2/1010400016-18-2r.htm -http://www.2pl.com/b/pl/to/1/01/04/v2/1010400016-1r.htm -http://www.123bestphonerates.com/q/001p/vn/vR85aEOIaY.htm -http://www.thisislancashire.co.uk/lancashire/archive/1997/07/17/SPORTST5VQ.html -http://www.thisislancashire.co.uk/lancashire/archive/1997/07/17/SPORTST7VQ.html -http://www.thisislancashire.co.uk/lancashire/archive/1997/07/17/SPORTST11VQ.html -http://www.elsur.cl/archivo/marzo2000/13marzo2000/elsur/deportes/ind3.php3 -http://home.no.net/fristart/kvasir816/ -http://www.fun7.de/party/cafe_europa/_vti_cnf/?D=A -http://www.users.yun.co.jp/cgi-bin/moriq/pigeon/pigeon.cgi/%C5%E7%BA%AC%B8%A9.%C2%E7%B8%B6%B7%B4%C2%E7%C5%EC%C4%AE?c=e -http://polygraph.ircache.net:8181/http_-2www.whowhere.com/http_-2www.expired.com/html/service.html -http://home.t-online.de/home/mtc.hannover/head1655833.htm -http://moneycentral.msn.com/investor/invsub/insider/Details.asp?Pval=1&Symbol=MKSI -http://www.sohu.com/Regional/hunan/City_County/Yiyang/Firms/Food_Beverage/ -http://www.kulturkreis-rhein-lahn.de/lauer/fax.htm -http://ustlib.ust.hk/search*chi/aporter+bill+1943/aporter+bill+1943/7,-1,0,B/browse -http://www.brio.de/BRIO.catalog/39fe2f3708fb3c8e2740d472aa7806d5/UserTemplate/2 -http://www.brio.de/BRIO.catalog/39fe2f3708fb3c8e2740d472aa7806d5/UserTemplate/6 -http://rcsl.auto.inha.ac.kr/~treeman/Documents/HOWTO/Keyboard-and-Console-HOWTO-19.html -http://www.etoys.com/cat/toy/category/construction/brio_builder_system/1 -http://www.kxmd.com/now/story/0,1597,194790-295,00.shtml -http://www.ferien-immobilien.de/DominikanischeRep/verkauf/GmbH-Kauf-Verkauf-Insolvenz-konkurs/Startseite/Gemeinsam/Gemeinsam/versicherungen/gebaeude/IIM-Teil/Startseite/froben.htm -http://hiv.medscape.com/LWW/SMD/1999/v21.n03/smd2103.01.html -http://www.egroups.com/message/dk-jaws/530 -http://no.egroups.com/message/daemon-news-announce/12 -http://ring.toyama-ix.net/archives/text/elisp/jaist/yamaoka/apel/00_THIS_DIRECTORY_WILL_NOT_BE_UPDATED_UNTIL_2000-10-26 -http://pub12.ezboard.com/ftibesataxg1637tibes.subscribeUnregisteredToTopic?topicID=7.topic -http://ustlib.ust.hk/search*chi/ali+huan+1827+1891/ali+huan+1827+1891/-5,-1,0,E/frameset&F=ali+huan&4,,0 -http://ustlib.ust.hk/search*chi/ali+huan+1827+1891/ali+huan+1827+1891/-5,-1,0,E/frameset&F=ali+huang+1895&1,,0 -http://www.digitalcity.com/cincinnati/sports/log.dci?league=NCF&team=NNF -http://ftp.nacamar.de/pub/debian/dists/potato/main/disks-m68k/2.2.16-2000-07-14/mac/images-1.44/?D=A -http://www.academyfloral.com/state/arboo/flowers/thanksabunchbouquet2.html -http://dante.bdp.it/cgi-bin/poseidon_v2.0/reflect/poseidon/disc/peacelink-scuola/2015003604/view/8 -http://ring.omp.ad.jp/pub/NetBSD/NetBSD-current/pkgsrc/lang/smalltalk/files/?S=A -http://ring.omp.ad.jp/pub/NetBSD/NetBSD-current/pkgsrc/lang/smalltalk/files/patch-sum -http://carriage.de/Schoner/Sammlungen/literature/collections/literature/modelle/ -http://www.buybuddy.com/sleuth/27/1/11001/1692/ -http://193.120.14.241/pub/languages/perl/CPAN/src/5.0/devel/ -http://lastminutetravel.bedandbreakfast.com/bbc/p208900.asp -http://chat.sportsline.com/u/wire/stories/0,1169,2957692_59,00.html -http://acad.uis.edu/sas/qc/q-index.htm -http://acad.uis.edu/sas/qc/s-index.htm -http://library.cuhk.edu.hk/search*chi/aPan,+Zhuonan./apan+zhuonan/-5,1,1,B/frameset&F=apan+zhichang+1956&1,1, -http://www.linux.com/networking/network/install/tools/updates/new/ -http://www.linux.com/networking/network/install/tools/updates/Standards/ -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=13,31,5,11,26 -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=23,31,5,11,26 -http://www.mfa.no/fin/norsk/publ/stprp/006005-991562/index-hov017-b-n-a.html -http://ftp.sunet.se/pub/lang/perl/CPAN/authors/id/DBEAZLEY/?N=D -http://fi.egroups.com/messages/infoespo/6?expand=1 -http://ibc.cn.net/2000/0718/it-1message.html -http://www.shaggysguide.com/conhtml/adnload/51647_1809.html -http://www.shaggysguide.com/conhtml/adnload/51657_5567.html -http://www.shaggysguide.com/conhtml/adnload/74370_17872.html -http://www.shaggysguide.com/conhtml/adnload/78469_19520.html -http://www.shaggysguide.com/conhtml/adnload/78940_19788.html -http://www.backflip.com/members/jhferrara/5171381/page=1/sort=1/linkspp=10 -http://www.amcity.com/philadelphia/stories/1998/08/24/newscolumn3.html?t=printable -http://www.rge.com/pub/tex/biblio/bibtex/ms-dos/demel/?N=D -http://www.v2music.com/Scripts/WebObjects-ISAPI.dll/V2_New_Publisher.woa/67841000005885200000309700000064451/Giveaways.wo/257820000054451/2.0.0.6.0/3/Webobjects1 -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/www-gds.desy.de:8080/zeitpl/zpl.htm -http://click-to.tell-a-friend.boardhost.com/tell-a-friend-confirm.cgi?chudtvlogic&msg=1596 -http://retailer.gocollect.com/do/session/1912639/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/clubhouse/suggestions.asp -http://www.jpc-music.com/5590216.htm -http://huntingfishing.tripod.com/sturgeonmain.htm -http://polygraph.ircache.net:8181/wwwboard/prodev/seminar/fast/http_-2www.centennialcc.org/bps.html -http://www.chaos.dk/sexriddle/s/t/c/x/l/ -http://www.chaos.dk/sexriddle/s/t/c/x/z/ -http://es.egroups.com/messages/plato-meno/1285 -http://tonggu-gch.ed.seoul.kr/home/2grade/2-10/981001/hang.htm -http://sjsulib1.sjsu.edu:81/search/dreligion/-5,-1,0,E/exact&dreligion+libraries&1,3 -http://www.generation-formation.fr/chiffrec.htm---o21zAo0UPwo0Ol9A074fo6Td4ezyr6feZJPAPfVbNyqHSezTHkekydMfeZJPdspt6dsSAtdsNhJdspt6dsrvrdjlhkfbd.htm -http://www.generation-formation.fr/dicoguid/diclogin.htm---o21zAo0UPwo0Ol9A074fo6Td4ezyr6feZJPAPfVbNyqureds5cezwhlezMpDeH7vGebI1yoKkfMd4vmMAxaAooKkfMd4u5xdfb7rmdfbT.htm -http://www.hollywoodonline.com/asplocal/mgvideoad.asp?rushhour-video-holdon-mov -http://www.ifg.uni-kiel.de/doc-clients/kdelibs-doc/html/kdeui/full-list-KRestrictedLine.html -http://www.3w-sciencefiction.de/ShapiroLarry/ShapiroLarry0760306729.htm -http://202.96.140.98/js/wenge/ -http://www.great-cyber-mall.com/SelectCompany.asp?CityID=230&CatID=19 -http://www.great-cyber-mall.com/SelectCompany.asp?CityID=230&CatID=34 -http://www.amazon.com.hk/exec/obidos/tg/stores/browse/-/books/13361/ -http://www.hole.kommune.no/hole/journweb.nsf/weboffjournal!OpenView&Start=99&Count=50&Collapse=116 -http://www.pbase.com/image/35702/small -http://www.infoscape.com.cn:8171/nf/0010/21/nfzy2104.htm -http://dell.excite.com/photo/topic/weather/national/19 -http://www.linux.com/networking/network/network/firewall/microsoft/government/ -http://www.gasex.com/gay.photo/gay.penis.pics.html -http://hausarbeiten.de/cgi-bin/superDBinters.pl/archiv/geschichte/gesch-stedinger.shtml -http://polygraph.ircache.net:8181/http_-2www.microsoft.com/frontpage/http_-2www.exploreuw.com/cards/ssoenews.html -http://www.fogdog.com/cedroID/ssd3040183137325/cgi-bin/MyFogdog -http://www.fogdog.com/cedroID/ssd3040183137325/cgi-bin/CedroCommerce?func=EditBasket -http://www.fogdog.com/cedroID/ssd3040183137325/nav/stores/cycling/ -http://www.fogdog.com/cedroID/ssd3040183137325/nav/stores/snowboarding/ -http://tucows.wanadoo.nl/win2k/organ2k_license.html -http://tucows.wanadoo.nl/win2k/preview/59164.html -http://windows.tucows.com/preview/001-009-005-005C.html -http://anekdotwall.boom.ru/car/html/75.htm -http://tucows.concepts.nl/win2k/clipb2k_size.html -http://tucows.concepts.nl/win2k/adnload/37291_29917.html -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=cricrila&l=pt -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=cricrilava&l=pt -http://www.trax.nilex.co.uk/trax.cgi/A1C/1AR/A2S/A3S/A3D/D1S/ -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/12_ngqyjt_ngqyjt.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/12_rtnucb_tyciyrg.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/12_kiektgt_fpwif.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/12_rjdbc_rjdbc.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/12_xsygo_xsygo.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/12_bovqcy_mkaqta.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/12_lgbrnl_psnjjt.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/12_lgbrnl_ybvfp.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/12_vermn_xmxmm.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/12_keojvu_faoex.html -http://info-china.hypermart.net/enterprise/company/messages/25.html -http://ring.yamanashi.ac.jp/pub/linux/debian/debian-jp/dists/potato/non-US/contrib/binary-m68k/Release -http://www.amigos.com/cgi-bin/w3com/pws/ffe/R7RIRASjZ5ATyRjNyXQBbwzK4LLK-rhgzZEBqJsLaR1cdnaeB7LT1xORWRg6aQmLxO7QWLEpsdjuf2ZqAnUO1IKpfrRctaIMYIzMNy1DSb7dp8_5z39WdF7oxbKUAByA -http://indigotrem1.chemie.uni-mainz.de/~manng001/Filme/S/SexLuegenundVideo.html -http://se.egroups.com/message/hur/387 -http://www.ilmessaggero.it/hermes/19990111/07_MARCHE/MARCHE_REGIONE/DUE.htm -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/computers/lit/quizz/misc/colorart/lit/pushkin.html -http://www.amzn.com/exec/obidos/ts/artist-glance/201040/ref=pm_dp_ln_m_6/ -http://tucows.netpower.no/winme/adnload/138674_29970.html -http://www.chaos.dk/sexriddle/z/d/q/p/c/ -http://www.chaos.dk/sexriddle/z/d/q/p/u/ -http://sv.pachinkovillage.co.jp/catalog/DinoVaderB/3.html -http://ww2.comune.fe.it/cgi-win/hiweb.exe/a2/B1,a,1f,6,6,3a,3a,,5,,1f,5, -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=deflazioneranno&l=it -http://polygraph.ircache.net:8181/company/html/http_-2www.io.com/~kinnaman/pchealth/f-agents.html -http://polygraph.ircache.net:8181/company/html/http_-2www.io.com/~kinnaman/pchealth/f-leisureworld.html -http://ftp.univie.ac.at/packages/perl/modules/by-module/Tie/ILYAZ/cperl-mode/rms-emacs-20.2-patch-narrow-buffer+dirfiles -http://www.expressindia.com/ie/daily/19991126/ige26097p.html -http://l-infonet.phkk.fi/fi/TIETOPALVELUT/ELINKEINO-+JA+YRITYSTOIMINTA/yritt%E4jyys/lukio/oppimateriaali/itseopiskelu/ -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=36,23,11,33,18 -http://www.trib.com/scjournal/ARC/1996/MAR/3_24_96/marines.html -http://www.slac.stanford.edu/BFROOT/www/Computing/Programming/QA/QaBetaTools/6.7.5a/SunOS5/?S=D -http://pokemonplant.tripod.com/150yellow.html -http://ftp.debian.org/dists/potato/contrib/binary-all/devel/?N=D -http://sunsite.org.uk/packages/tcl/Collections/ftp.neosoft.com/sorted/packages-8.0/print/frink/1.2p35/ -http://library.bangor.ac.uk/search/m304.6+LIN/m304.6+lin/-5,-1,0,B/frameset&F=m304.6+jos&1,1 -http://members.tripod.lycos.nl/janninksweg145/huis.htm -http://www.uib.no/People/mihtr/PS01/PS01_219.htm -http://www.kfi640.com/shared/mod_perl/looksmart/looksmart/eus1/eus141561/eus174865/eus327367/eus327602/eus329879/ -http://www.kfi640.com/shared/mod_perl/looksmart/looksmart/eus1/eus141561/eus174865/eus327367/eus327602/eus327608/ -http://sound-dist.secured.co.uk/cgi-bin/psShop.cgi/add|39P02|972959512|Communications|user|0|1,0,0,1 -http://www.bluefreds.f9.co.uk/vote2.html -http://www.hri.org/docs//statedep/1999/99-05-07.std.html -http://polygraph.ircache.net:8181/http_-2www.hblinfo.com/f_snowbuddies.html -http://mediate.magicbutton.net/do/session/625565/vsid/3342/tid/3342/cid/88020/mid/2008/rid/2313/chid/2648/url/http://www1.getmapping.com/products.cfm -http://cometweb01.comet.co.uk/do!tid=20&rtid=2&vsid=692&session=131975&mid=1000&rid=1060&cid=37051&chid=1702&url=eqqLmwlGltt5tkZHljbLqkZHlkrHhlZHdfjKYfkLlkZ5ljjLboZLbplG5ubLZDXLZolLl3l5jbqLlci5XqVLkXsLkao4tloHbmlLoq5 -http://digilander.iol.it/net4free/spedia.htm -http://totalsports.aol.com/stats/bbo/mlb/20000425/col.at.mon.prvw.html -http://210.178.135.1/netbbs/Bbs.cgi/nhic32042/qry/pno/0/zka/B2-kB2Zk/qqatt/^ -http://cikkek.lezlisoft.com/kikelet/spiritualitas/spirit3v9.shtml -http://www.wingateinns.com/ctg/cgi-bin/Wingate/aarp/AAAksrACwAAACCPAAl -http://sunsite.berkeley.edu/PhiloBiblon/BITAGAP/BIB/BIB1848.html -http://sunsite.uakom.sk/tucows/adnload/69390_28371.html -http://sunsite.uakom.sk/tucows/preview/77630.html -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=(22,0+9,0-~0,3 -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=(22,0+9,0-~9,6 -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=(22,0+9,0-~21,0 -http://sirac.inrialpes.fr/Infos/Personnes/Christophe.Rippert/ressources/jdk1.2.2/docs/api/java/security/ -http://polygraph.ircache.net:8181/getting_started/http_-2www.microsoft.com/powered/radio/email_pal/email_pal.htm -http://mirror.nucba.ac.jp/mirror/FreeBSD/branches/2.2-stable/ports/net/tund/?M=A -http://mirror.nucba.ac.jp/mirror/FreeBSD/branches/2.2-stable/ports/net/tund/?D=A -http://library.bangor.ac.uk/search/tNursing+times+clinical+monographs+&%2359%3B+no.+51/tnursing+times+clinical+monographs+no+++51/-17,-1,0,B/browse -http://library.bangor.ac.uk/search/tNursing+times+clinical+monographs+&%2359%3B+no.+51/tnursing+times+clinical+monographs+no+++51/-5,-1,0,B/frameset&F=tnursing+times+complementary+therapy&1,1 -http://ftp.chg.ru/pub/FreeBSD/doc/en_US.ISO_8859-1/articles/programming-tools/ -http://polygraph.ircache.net:8181/getting_started/http_-2www.microsoft.com/powered/bomb/bomb.htm -http://linux.tucows.inwind.it/conhtml/adnload/8523_5414.html -http://www.magicvillage.de/magicvillage/KonferenzPlaza/fbs/%2328835852?NextInThread -http://www.shopworks.com/samplers/index.cfm/action/cart/userid/0009CECE-2EE1-19FE-9038010B0A0ADCF2 -http://dailynews.sina.com/newsCenter/taiwan/udn/2000/1021/2051701_b5.html -http://us.mandrakesoft.com/cgi-bin/cvsweb.cgi/kdeutils/khexedit/pics/Attic/?hideattic=1&sortby=date -http://moviestore.zap2it.com/browse/MOVIES/BOWL/s.zchC6lsi -http://moviestore.zap2it.com/browse/MOVIES/MUSIC/s.zchC6lsi -http://ww2.comune.fe.it/cgi-win/hiweb.exe/a2/d13/b12,c,1f,18,18,,13,,1f,13,17,,1f,17, -http://ww2.comune.fe.it/cgi-win/hiweb.exe/a2/d14/b12,c,1f,18,18,,13,,1f,13,17,,1f,17, -http://209.50.251.176/~bb/ -http://tucows.energy.it/winnt/adnload/59163_30035.html -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=circundara&l=pt -http://vishvesha.tripod.com/4/068d.htm -http://www.hot.ee/timbsy/kass_files/pildikogu.html -http://www3.newstimes.com/archive99/jan2599/rga.htm -http://pub11.ezboard.com/fmarjoriesdmboardpostyourdmpedigreeshere.showMessage?topicID=21.topic -http://www.geocities.com/Heartland/Plains/4825/bennyn.html -http://citeseer.nj.nec.com/site/115145 -http://www.techsupplies.com/sleuth/17/1/40406/254200/ -http://ccmnet.xj.cei.gov.cn/10/b10/b1007/99-05-02/a5-02.asp -http://206.251.18.85/FEATURES/home_improvement/1999/10/01/fall_lawncare3.html -http://www.dulux.co.uk/UKRETAIL:1355333640:DFinity.1QJiP4jmPgimjKlA -http://cometweb01.comet.co.uk/do!tid=20&rtid=2&vsid=700&session=131985&mid=1000&rid=1060&cid=37030&chid=1713&url=eqqLmwlGltt5tkZHljbLqkZHlkrHhlZHdfjKYfkLlkZ5ljjLboZLbplG5ubLZDXLZolLl3l5jbqLlci5XqVLkXsLkao4tloHbmlLoq5 -http://cometweb01.comet.co.uk/do!tid=20&rtid=1&vsid=700&session=131985&mid=1000&rid=1060&cid=37030&chid=1713&url=eqqLmwlGltt5tkZHljbLqkZHlkrHhlZHdfjKYfkLlkZ5ljjLboZLbplGGolLarZLq4fLpmiLXv-KmooLckYLoznGmpq0qsc0mojLbkYLozvGotc0ZdoLckYLozvGsmv0qmc0jXfLkVZLdocLkYoLzcj1XfkLVZXLqkXLjbzKcob5qroLkVrLoizKlZd5fjYHfklKkZlLjjbLoZbLpl51ubZLDXZLollK3ljLbqlKjXfLkkaHotl4obmLloqL -http://www.berliner-morgenpost.de/bm/inhalt/990928/berlin/story14.html -http://gb.toget.com.tw/article/printer_tool/19990825_3210_p1.html -http://sbtr42.sbsusa.com/ncsamples/base1.htm -http://halflife02.opasia.dk/cs3stats/players/_AMNeSIA_.html -http://mediate.magicbutton.net/do/session/625570/vsid/3342/tid/3342/cid/88020/mid/2008/rid/2313/chid/2648/url/http://www1.getmapping.com/basket.cfm -http://mediate.magicbutton.net/do/session/625570/vsid/3342/tid/3342/cid/88020/mid/2008/rid/2313/chid/2648/url/http://www1.getmapping.com/viewer.cfm -http://www.citythek.de/erfurt/rheinhyp/fsinhalt.htm -http://my.egroups.com/group/mall-komputer -http://www-bd.cricket.org/link_to_database/ARCHIVE/1997-98/PAK_IN_RSA/PAK_IN_RSA_JAN-APR1998_PAK-SQUAD.html -http://www-bd.cricket.org/link_to_database/GROUNDS/RSA/ST-GEORGE_PARK_PT-ELIZ/ -http://www-bd.cricket.org/link_to_database/ARCHIVE/1997-98/PAK_IN_RSA/PAK_RSA_T3_06-10MAR1998_ET_MR.html -http://www.bemi-immobilien.de/Startseite/www.ferien-immobilien.de/ferien-ib/startseite/Gemeinsam/versicherungen/unfall/Gemeinsam/erreichenPartner/Gemeinsam/MarketingStrategie/Gemeinsam/versicherungen/gebaeude/Gemeinsam/Top-Darlehens-Konditionen/anforderungsformular.htm -http://www.online.kokusai.co.jp/Qa/V0043459/wrd/G800/qa/ -http://iland.tucows.com/win2k/adnload/59229_29990.html -http://iland.tucows.com/win2k/preview/144411.html -http://iland.tucows.com/win2k/adnload/38173_29963.html -http://www.arm.com/sitearchitek/armtech.ns4/8ab0ea422fba51238025691f00399e13/9cb09cb360a967848025691f004e28b2!OpenDocument&ExpandSection=6,13,12,-1 -http://ftp.uni-mannheim.de/languages/perl/CPAN/modules/by-authors/id/JMURPHY/?N=D -http://proam.golfonline.com/tours/2000/hooters/silversprings/scores2.html -http://ftp.du.se/pub/FreeBSD/branches/4.0-stable/src/games/grdc/ -http://ftp.du.se/pub/FreeBSD/branches/4.0-stable/src/games/pom/ -http://ftp.du.se/pub/FreeBSD/branches/4.0-stable/src/games/Makefile -http://www.artex.firenze.it/_qualitart/articoli/zoom/03651.htm -http://www.chaos.dk/sexriddle/m/k/v/b/p/ -http://www.chaos.dk/sexriddle/m/k/v/b/s/ -http://www.chaos.dk/sexriddle/t/j/d/n/n/ -http://www.daysinn.com/ctg/cgi-bin/DaysInn/media_center/AAAksrACwAAACCQAAM -http://tukela.heha.net/ys/ll/boyuan.htm -http://tukela.heha.net/ys/ll/jinciming.htm -http://genforum.genealogy.com/ai/messages/4299.html -http://genforum.genealogy.com/ai/messages/4221.html -http://genforum.genealogy.com/ai/messages/4225.html -http://www.linkclub.or.jp/~sticky/index1/diary/1999/199906.html -http://ww.egroups.com/subscribe/lexingtonkystrapon -http://chita.fi.upm.es/docs/info/en_US/a_doc_lib/motif/motifsg/About.htm -http://chita.fi.upm.es/docs/info/en_US/a_doc_lib/motif/motifsg/motifsg41.htm -http://chita.fi.upm.es/docs/info/en_US/a_doc_lib/motif/motifsg/motifsg43.htm -http://hakuba-net.gr.jp/guide/rest/spa_each/spa_2.html -http://yp.gates96.com/6/16/40/22.html -http://yp.gates96.com/6/16/40/44.html -http://yp.gates96.com/6/16/40/50.html -http://yp.gates96.com/6/16/40/69.html -http://yp.gates96.com/6/16/40/83.html -http://yp.gates96.com/6/16/41/49.html -http://yp.gates96.com/6/16/41/50.html -http://yp.gates96.com/6/16/41/67.html -http://yp.gates96.com/6/16/42/15.html -http://yp.gates96.com/6/16/42/51.html -http://yp.gates96.com/6/16/42/56.html -http://yp.gates96.com/6/16/43/8.html -http://yp.gates96.com/6/16/43/69.html -http://yp.gates96.com/6/16/43/71.html -http://yp.gates96.com/6/16/44/11.html -http://yp.gates96.com/6/16/44/51.html -http://yp.gates96.com/6/16/45/20.html -http://yp.gates96.com/6/16/45/43.html -http://yp.gates96.com/6/16/46/12.html -http://yp.gates96.com/6/16/46/25.html -http://yp.gates96.com/6/16/46/64.html -http://yp.gates96.com/6/16/47/42.html -http://yp.gates96.com/6/16/47/80.html -http://yp.gates96.com/6/16/48/54.html -http://yp.gates96.com/6/16/48/85.html -http://yp.gates96.com/6/16/49/51.html -http://yp.gates96.com/6/16/49/62.html -http://assgay.com/main.html?fuck.cock.gaysex -http://ring.yamanashi.ac.jp/pub/linux/linuxppc/contrib/software/System_Environment/Libraries/?S=A -http://computalynx.tucows.com/winme/adnload/138681_29976.html -http://computalynx.tucows.com/winme/adnload/138706_29992.html -http://computalynx.tucows.com/winme/adnload/138690_29990.html -http://computalynx.tucows.com/winme/adnload/138694_29981.html -http://iceberg.adhomeworld.com/cgi-win/redirect.exe/851857198 -http://link.fastpartner.com/do/session/600337/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/mondosoft.php -http://link.fastpartner.com/do/session/600337/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/nordicliving.php -http://link.fastpartner.com/do/session/600337/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/create/learn.htm -http://www.linux.com/networking/network/applications/hardware/device/development/ -http://www.linux.com/networking/network/applications/hardware/device/Corel/ -http://www.linux.com/networking/network/applications/hardware/device/?kw_offset=50 -http://ftp.gigabell.net/debian/dists/unstable/main/binary-m68k/sound/?M=A -http://no.egroups.com/message/slfxpzur/36 -http://no.egroups.com/message/slfxpzur/38 -http://nuance.dhs.org/lbo-talk/0004/2286.html -http://www.jamba.de/KNet/_KNet-XEk8j1-ADd-136sq/showInfo-datenschutz.de/node.0/cde7f1uou -http://yp.gates96.com/2/37/60/0.html -http://yp.gates96.com/2/37/60/13.html -http://yp.gates96.com/2/37/61/24.html -http://yp.gates96.com/2/37/61/66.html -http://yp.gates96.com/2/37/62/5.html -http://yp.gates96.com/2/37/62/31.html -http://yp.gates96.com/2/37/63/31.html -http://yp.gates96.com/2/37/63/43.html -http://yp.gates96.com/2/37/63/48.html -http://yp.gates96.com/2/37/63/60.html -http://yp.gates96.com/2/37/63/88.html -http://yp.gates96.com/2/37/64/62.html -http://yp.gates96.com/2/37/64/74.html -http://yp.gates96.com/2/37/65/0.html -http://yp.gates96.com/2/37/66/20.html -http://yp.gates96.com/2/37/67/41.html -http://yp.gates96.com/2/37/68/2.html -http://yp.gates96.com/2/37/68/50.html -http://yp.gates96.com/2/37/69/15.html -http://yp.gates96.com/2/37/69/41.html -http://yp.gates96.com/2/37/69/47.html -http://yp.gates96.com/2/37/69/60.html -http://yp.gates96.com/2/37/69/75.html -http://yp.gates96.com/2/37/69/76.html -http://gettosdownloads.subportal.com/sn/Palm_Pilot/Games/12428.html -http://news.novgorod.ru/read/65/2000/10/27/10/49 -http://www.schwan.de/links-biografie.html -http://www.fogdog.com/cedroID/ssd3040183124617/cgi-bin/MyFogdog -http://www.nrk.no/finnmark/x27_6_97/nyh9.htm -http://www.aelita.net/products/news/services/sitemap/~archive/Download_redirect/company/Copyright.htm -http://www.staroriental.net/nav/soeg_c/ihf,aol,n15,149,TVB香港小姐2000.html -http://members.xoom.com/agent187/politics.htm -http://sunsite.org.uk/public/packages/perl/collections/cis.ufl/comp.lang.perl.announce/1998-03/724 -http://www.thestateofcolorado.com/gcecommercialsales.html -http://ftp.du.se/pub/redhat/rawhide/sparc/RedHat/RPMS/?M=A -http://www.linux.com/networking/network/community/trade_show/magazine/open_source/ -http://www.linux.com/networking/network/community/trade_show/magazine/Slashdot/ -http://www.linux.com/networking/network/community/trade_show/magazine/investors/ -http://scifi.emerchandise.com/browse/TV/PIN/b.TV/s.KkOtzPMn -http://scifi.emerchandise.com/browse/DILBERT/_/b.TV/s.KkOtzPMn -http://scifi.emerchandise.com/browse/DR.KATZ/_/b.TV/s.KkOtzPMn -http://scifi.emerchandise.com/browse/FRIENDS/_/b.TV/s.KkOtzPMn -http://scifi.emerchandise.com/browse/FUTURAMA/_/b.TV/s.KkOtzPMn -http://scifi.emerchandise.com/browse/LOIS-CLARK/_/b.TV/s.KkOtzPMn -http://scifi.emerchandise.com/browse/SPEEDRACER/_/b.TV/s.KkOtzPMn -http://scifi.emerchandise.com/browse/THUNDERCATS/_/b.TV/s.KkOtzPMn -http://scifi.emerchandise.com/browse/WCW/_/b.TV/s.KkOtzPMn -http://www.railion.de/home/db_reise_touristik/region/bremen/db_rt_firmenreisedienst_reisezentrum_hb.shtml -http://pegasus.infor.kanazawa-it.ac.jp/~hara/bsd4.1-release/D/N_GETFLAG_NET.html -http://yp.gates96.com/5/54/20/19.html -http://yp.gates96.com/5/54/21/5.html -http://yp.gates96.com/5/54/21/42.html -http://yp.gates96.com/5/54/21/60.html -http://yp.gates96.com/5/54/21/69.html -http://yp.gates96.com/5/54/21/81.html -http://yp.gates96.com/5/54/21/96.html -http://yp.gates96.com/5/54/22/6.html -http://yp.gates96.com/5/54/22/29.html -http://yp.gates96.com/5/54/22/33.html -http://yp.gates96.com/5/54/22/64.html -http://yp.gates96.com/5/54/22/83.html -http://yp.gates96.com/5/54/22/94.html -http://yp.gates96.com/5/54/22/98.html -http://yp.gates96.com/5/54/23/17.html -http://yp.gates96.com/5/54/23/41.html -http://yp.gates96.com/5/54/24/2.html -http://yp.gates96.com/5/54/24/5.html -http://yp.gates96.com/5/54/24/9.html -http://yp.gates96.com/5/54/24/90.html -http://yp.gates96.com/5/54/25/89.html -http://yp.gates96.com/5/54/26/41.html -http://yp.gates96.com/5/54/27/83.html -http://yp.gates96.com/6/59/21/52.html -http://yp.gates96.com/6/59/22/63.html -http://yp.gates96.com/6/59/23/37.html -http://yp.gates96.com/6/59/23/95.html -http://yp.gates96.com/6/59/24/3.html -http://yp.gates96.com/6/59/24/9.html -http://yp.gates96.com/6/59/25/26.html -http://yp.gates96.com/6/59/25/55.html -http://yp.gates96.com/6/59/25/84.html -http://yp.gates96.com/6/59/25/94.html -http://yp.gates96.com/6/59/26/53.html -http://yp.gates96.com/6/59/26/73.html -http://yp.gates96.com/6/59/27/15.html -http://yp.gates96.com/6/59/27/29.html -http://yp.gates96.com/6/59/27/49.html -http://yp.gates96.com/6/59/27/97.html -http://yp.gates96.com/6/59/28/31.html -http://yp.gates96.com/6/59/28/32.html -http://yp.gates96.com/6/59/28/39.html -http://yp.gates96.com/6/59/28/98.html -http://yp.gates96.com/6/59/29/22.html -http://yp.gates96.com/6/59/29/83.html -http://www.gbnf.com/genealogy/royal92/html/d0016/I1249.HTM -http://www.gbnf.com/genealogy/royal92/html/d0018/I734.HTM -http://hifichoice.co.uk/archive/perl/193_printreview.htm -http://hifichoice.co.uk/archive/perl/313_printreview.htm -http://www.highwired.net/Paper/UniversalNav/Redirect/0,5314,2623-7802,00.html -http://www.mrlinux.notrix.de/ -http://www.ucalgary.ca/UofC/faculties/medicine/CHS/nhrdb/area/anat/fr.htm -http://home.pchome.com.tw/tv/pili0614/xing-sh/capric/capric47.htm -http://home.pchome.com.tw/tv/pili0614/xing-sh/capric/capric21.htm -http://home.pchome.com.tw/tv/pili0614/xing-sh/capric/caf26.htm -http://user.chollian.net/~pleiad7s/josun/3-37.htm -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=233&discrim=81,3,15 -http://mediate.magicbutton.net/do/session/625571/vsid/3342/tid/3342/cid/88020/mid/2008/rid/2313/chid/2648/url/http://www1.getmapping.com/aboutus/index.cfm -http://www.telecombrokers.com/q/001p/atn8/2aS9DLAZRXc.htm -http://www.telecomrefunds.com/q/001p/atn8/4SeFiiXvs2A.htm -http://soho.nascom.nasa.gov/solarsoft/soho/lasco/lasco/data_anal/data/9701/?M=A -http://members.xoom.com/mindnare -http://people.freenet.de/TheChamp/nachhilfe.htm -http://people.freenet.de/TheChamp/cheats.htm -http://www.zinezone.com/movies/1,4003,1040-23080,00.html -http://kulichki-win.rambler.ru/moshkow/TURIZM/kutsajo6.txt_with-icons.html -http://www.linux.com/networking/network/release/availability/hardware/?printable=yes -http://www.linux.com/networking/network/release/availability/hardware/applications/ -http://www.shopworks.com/flmp/index.cfm/action/cart/userid/000D1850-2F00-19FE-9038010B0A0ADCF2 -http://shrike.depaul.edu/~afranz/multimedia/?S=A -http://totalsports.net/news/20001014/bbo/mlb/sea/001014.0024.html -http://totalsports.net/news/20001009/bbo/mlb/sea/001009.0039.html -http://totalsports.net/news/20001006/bbo/mlb/sea/001006.0354.html -http://cometweb01.comet.co.uk/do!session=131986&vsid=700&tid=20&cid=37030&mid=1000&rid=1060&chid=1713&url=eqqLmwlGltt5tkkHbqpLZXmLbkZHljlKaltLkilLXalKfkaLbukKeqjLi1 -http://html.tucows.ciaoweb.it/adnload/berglincondlbind.html -http://www.tiscover.com/1Root/Interessante_Region/127151/sportfreizeit/m_sportfreizeit.wm_sport_freibad..1.html -http://f24.parsimony.net/forum54080/messages/97.htm -http://f24.parsimony.net/forum54080/messages/68.htm -http://www.amulation.com/md-l-archive/199702/msg00210.html -http://netpower.tucows.com/winnt/adnload/2821_29573.html -http://kutschen.de/Schoner/Info-d/literature/collections/collections/Geschichte/ -http://webtools.myschoolonline.com/page/0,1871,0-353-38-44534,00.html -http://www.linux.com/networking/network/help/hardware/open_source/GNOME/ -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=12,25,26,17,24 -http://retailer.gocollect.com/do/session/1912664/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/exclusives/exclusives.asp -http://retailer.gocollect.com/do/session/1912665/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/news/index.asp -http://ring.nihon-u.ac.jp/pub/doc/jpnic/members/WORLDNET/members.txt -http://www.123webagent.com/q/001p/atn8/zImXxARDSm.htm -http://www.tu-chemnitz.de/~jflo/DOSDemos/cost_b.txt -http://yp.gates96.com/5/54/27/97.html -http://yp.gates96.com/5/54/28/23.html -http://yp.gates96.com/5/54/29/33.html -http://yp.gates96.com/5/54/29/64.html -http://rex.skyline.net/html/Medical_Equipment.html?224,software,equipment,agriculture,science -http://adex3.flycast.com/server/socket/127.0.0.1:2800/click/OnlineCitiesSM/OnlineCitiesInteractiveCityGuides/bd434602591 -http://www.dispatch.co.za/1998/05/29/business/BA.HTM -http://www.dispatch.co.za/1998/05/29/business/JSE.HTM -http://retailer.gocollect.com/do/session/1912663/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/help/site_tour/index.asp -http://retailer.gocollect.com/do/session/1912663/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/about.asp -http://retailer.gocollect.com/do/session/1912663/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/contact.asp -http://www.hblb.org.uk/hblbweb.nsf/$Pages/NewsArchive1!OpenDocument&ExpandSection=8,9,3,6,1,11,13 -http://retailer.gocollect.com/do/session/1912620/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/product_display/gifts/gift_floor.asp -http://genforum.genealogy.com/ga/messages/4583.html -http://genforum.genealogy.com/ga/messages/4582.html -http://genforum.genealogy.com/ga/messages/4570.html -http://genforum.genealogy.com/ga/messages/4561.html -http://genforum.genealogy.com/ga/messages/5575.html -http://ftp.gnu.org/software/sather/ICSI_Sather/whoswho.html -http://dk.egroups.com/group/GHSBasketball -http://dk.egroups.com/group/lovebasket -http://biblioteca.upv.es/bib/doc/doc_fisbd/10/131276//V/1820145/0////25/S/MLTPAID -http://www.qth.net/archive/packfr/200009/20000921.html -http://213.36.119.69/do/session/152975/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/preparer/sante.htm -http://ftp.lip6.fr/pub8/FreeBSD/FreeBSD-current/ports/emulators/mtools/ -http://ftp.lip6.fr/pub8/FreeBSD/FreeBSD-current/ports/emulators/sim6811/ -http://fyi.cnn.com/ASIANOW/asiaweek/97/0328/aa7.html -http://pub21.ezboard.com/fbeauxbatonfrm32.showMessage?topicID=6.topic -http://www.tente.de/us/produkte/produkteigenschaften/aa000001609.htm -http://www.tente.de/us/produkte/produkteigenschaften/aa000001630.htm -http://ftp.sunet.se/pub/FreeBSD/ports/ports-stable/net/rboot/?N=D -http://www.geocities.co.jp/Technopolis-Mars/3952/link.html -http://saleonall.com/cat/software/reference/5112/969434/advanced-search.html -http://www.jazzbude.de/EddieLockjawDavis/B000026F24.htm -http://www6.freeweb.ne.jp/art/iftaka/art/ -http://www.canit.se/(ftp,irc,k15,www)/support/kontakt.html -http://www.mirror.edu.cn/res/sunsite/pub/academic/chemistry/iupac/Download/publications/pac/special/0199/ -http://cinemabilia.de/details/katnr/234764/ -http://polygraph.ircache.net:8181/services/design/http_-2www.infolane.com/dallas.htm -http://ftp.sunet.se/pub/FreeBSD/ports/ports-stable/games/crafty-open-medium/pkg-comment -http://uk.dir.yahoo.com/Education/Primary_and_Secondary/Schools/Middle_Schools/By_Region/U_S__States/Virginia/Complete_List/ -http://yp.gates96.com/6/2/10/13.html -http://yp.gates96.com/6/2/10/41.html -http://yp.gates96.com/6/2/10/83.html -http://yp.gates96.com/6/2/11/51.html -http://yp.gates96.com/6/2/11/89.html -http://yp.gates96.com/6/2/12/22.html -http://yp.gates96.com/6/2/12/58.html -http://yp.gates96.com/6/2/12/62.html -http://yp.gates96.com/6/2/12/79.html -http://yp.gates96.com/6/2/13/19.html -http://yp.gates96.com/6/2/13/51.html -http://yp.gates96.com/6/2/13/64.html -http://yp.gates96.com/6/2/14/75.html -http://yp.gates96.com/6/2/15/91.html -http://yp.gates96.com/6/2/16/83.html -http://yp.gates96.com/6/2/18/15.html -http://yp.gates96.com/6/2/18/54.html -http://yp.gates96.com/6/2/19/35.html -http://yp.gates96.com/6/2/19/68.html -http://yp.gates96.com/6/2/19/75.html -http://yp.gates96.com/6/2/19/82.html -http://yp.gates96.com/6/2/19/87.html -http://www.chaos.dk/sexriddle/z/w/c/b/v/ -http://itcareers.careercast.com/texis/it/itjs/+bwwBmeg5986wwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewhTwdGpdGwBna5dhBiwGnawppcoqwBodD5amnVncdpMnDBaiw5roDtBdDamwBwaoDqc1moDtamn5otDanLpnGonDqnawDwcO5o5aMFqhTfR20Dzme8hwwwpBmeMWD86etmwww5rmeHdwwwBrmeZpwww/jobpage.html -http://itcareers.careercast.com/texis/it/itjs/+3wwBmeV6D86euhwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewhTwdGpdGwBna5dhBiwGnawppcoqwBodD5amnVncdpMnDBaiw5roDtBdDamwBwaoDqc1moDtamn5otDanLpnGonDqnawDwcO5o5aMFqhTfR20Dzme8hwwwpBmeMWD86etmwww5rmeidwwwBrmeZpwww/jobpage.html -http://itcareers.careercast.com/texis/it/itjs/+iwwBmeiWD86zwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewhTwdGpdGwBna5dhBiwGnawppcoqwBodD5amnVncdpMnDBaiw5roDtBdDamwBwaoDqc1moDtamn5otDanLpnGonDqnawDwcO5o5aMFqhTfR20Dzme8hwwwpBmeMWD86etmwww5rme3dwwwBrmeZpwww/jobpage.html -http://sanming.ebigchina.com/ -http://www.bestinfo.net.cn/bsti_kjxn/gn/guoneifagui/17hebei3.htm -http://www.detroitfreepress.com/photos/umgallery/g8/g8.1.htm -http://www.detroitfreepress.com/photos/umgallery/g8/g8.3.htm -http://xgll.soyou.edu.cn/item/2000-04-07/43733.html43733.html -http://se.egroups.com/message/bunyan/903 -http://l-infonet.phkk.fi/fi/TIETOPALVELUT/KIRJASTO-+JA+TIETOPALVELUT/p%E4ij%E4t-h%E4meen+koulutuskonserni/tietokannat/kirjastot/viitetietokannat/ -http://channel.nytimes.com/2000/05/19/technology/ -http://www.ycwb.com.cn/gb/2000/04/15/jrzk/jrms/5.html -http://no.egroups.com/message/healthdigest/97 -http://no.egroups.com/message/healthdigest/119 -http://www.securitiestimes.com.cn/199909/10/ssgs_19990910007_xw.html -http://javatest.a-net.nl/servlet/pedit.Main/http://www.dohistory.org/interests/i_teaching.html -http://www.buybuddy.com/sleuth/27/1/11009/518452/ -http://www.buybuddy.com/sleuth/27/1/11001/518452/ -http://www.buybuddy.com/sleuth/27/1/11004/518452/ -http://ring.omp.ad.jp/archives/text/CTAN/fonts/metrics/tools/?D=A -http://www.jamba.de/KNet/_KNet-CIq8j1-hEd-138qo/showInfo-special1.de/node.0/cde7f1uou -http://cafe4.daum.net/Cafe-bin/Bbs.cgi/sdfamilypds/qry/zka/B2-kBI7p/qqatt/^ -http://www.insurequotes.com/oh3/1AB2.html -http://www.egroups.com/login.cgi?login_target=%2Fmessage%2FWHKPNews%2F190 -http://www.linux.com/networking/network/performance/reliability/linux/?printable=yes -http://preview.egroups.com/message/tattoos88/32 -http://ring.shibaura-it.ac.jp/archives/NetBSD/packages/1.5/cobalt/math/ -http://ring.shibaura-it.ac.jp/archives/NetBSD/packages/1.5/cobalt/sysutils/ -http://in.us.biz.yahoo.com/z/a/p/prgx/prgx_f0149933.html -http://www.backflip.org/members/robeeena/6484057 -http://www.accesslasvegas.com/shared/health/adam/ency/article/003481res.html -http://library.cuhk.edu.hk/search*chi/dAir+--+Pollution+--+China+--+Hong+Kong./dair+pollution+china+hong+kong/-17,1,1,B/frameset&F=dair+pilots+united+states+biography&7,,7 -http://innopac.lib.tsinghua.edu.cn:2082/search*chi/cTM-62+C288/ctm-62+c288/-5,-1,,B/browse -http://www.nd.edu/~rarebook/coins/bnl-mg/BNL-index-B/BNL-index-BU/BNL-index-bursley.html -http://home.kimo.com.tw/lcl566/布告欄.htm -http://www.northampton.ac.uk/cgi-bin/liberation/betsie/betsie.pl/1005/www.northampton.ac.uk/stu/commdev/chap.htm -http://www.peopledaily.co.jp/199905/11/newfiles/col_990511001040_zyxw.html -http://missuniverse.studiostore.com/browse/PAGEANTS/CAP/s.pJicQfVY -http://ftp.up.pt/Linux/Linus/kernel/v2.1/patch-html/patch-2.2.0-pre6/linux_drivers_misc_parport_procfs.c.html -http://ftp.up.pt/Linux/Linus/kernel/v2.1/patch-html/patch-2.2.0-pre6/linux_drivers_sound_es1370.c.html -http://ftp.up.pt/Linux/Linus/kernel/v2.1/patch-html/patch-2.2.0-pre6/linux_include_asm-arm_arch-vnc_system.h.html -http://ftp.up.pt/Linux/Linus/kernel/v2.1/patch-html/patch-2.2.0-pre6/linux_include_asm-arm_dec21285.h.html -http://www.gbnf.com/genealog2/dezarn/html/d0004/I1071.HTM -http://dogbert.wu-wien.ac.at/UniverCD/cc/td/doc/product/access/acs_mod/cis4000/4000/c4000him/22693/ -http://www.uralweb.ru:8081/stats/who -http://www.rrz.uni-hamburg.de/biologie/b_online/kegg/kegg/db/ligand/cpdhtm/C04881.html -http://www.la.digitalcity.com/fortwaynein/health/conditions.dci?condition=badbreath -http://ibelong.digitalcity.com/uticaarea/guygirlmidwest/main.dci?page=guyssept2000 -http://moviestore.zap2it.com/browse/MOVIES/JACKET/s.jNIqMaLO -http://www.doc.ic.ac.uk/~ace97/whoknows/whoknows.cgi?topic=applescript -http://www.doc.ic.ac.uk/~ace97/whoknows/whoknows.cgi?topic=prolog -http://www.doc.ic.ac.uk/~ace97/whoknows/whoknows.cgi?topic=samba -http://209.52.189.2/discussions.cfm/3031/1757-1776 -http://209.52.189.2/discussions.cfm/3031/757-776 -http://209.52.189.2/discussions.cfm/3031/57-76 -http://itcareers.careercast.com/texis/it/itjs/+DwwBmeOWD86OwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewVtqDhdGMwBodDanDtoDnnGaoDBntGwBodDaMwDwtnMnDBanDBnGpGo5na5nGVnG5anLpnGonDqnaDnBidGAa5O5BnMawppcoqwBodDaMFqhTfR20DzmeitwwwpBme2WD86e1xwww5rmenDwwwBrmeZpwww/morelike.html -http://volunteersolutions.org/austin/volunteer/opp/one_100634_printer_detailed.html -http://www.changeyourhome.net/PropertiesToLet/WithamLet/LOO606/pages/DCP_0421_JPG.htm -http://www.users.qwest.net/~eagletac/ -http://www.motorradversand.de/cgi-bin/bekleidung/integralhelm/NG94G933/beurteilung.htm -http://stol.list.ru/catalog/25440.html -http://stol.list.ru/catalog/25301.html -http://www.eveclub.com/cgi-bin/eveclub.front/972959436300/Club/start/1000000 -http://www.gohamptonroads.com/sportsticker/events/06-12/0447.CWS.FSUTEXCURRENT.html -http://genforum.genealogy.com/merriman/messages/228.html -http://genforum.genealogy.com/merriman/messages/223.html -http://genforum.genealogy.com/merriman/messages/163.html -http://genforum.genealogy.com/merriman/messages/495.html -http://genforum.genealogy.com/merriman/messages/232.html -http://genforum.genealogy.com/merriman/messages/351.html -http://genforum.genealogy.com/merriman/messages/324.html -http://genforum.genealogy.com/merriman/messages/510.html -http://genforum.genealogy.com/merriman/messages/57.html -http://genforum.genealogy.com/merriman/messages/12.html -http://genforum.genealogy.com/merriman/messages/263.html -http://genforum.genealogy.com/merriman/messages/15.html -http://retailer.gocollect.com/do/session/1912656/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/clubhouse/suggestions.asp -http://www.kfi640.com/shared/mod_perl/looksmart/looksmart/eus1/eus53832/eus53833/eus328722/eus129553/eus129564/ -http://cma.arabia.com:8008/jordan/article/print/arabic/0,5195,3750,00.html -http://webhome.ai-lab.fh-furtwangen.de/for_local_use_only/CD-TMFUMV/daten/mathema/01121m/?N=D -http://store1.europe.yahoo.com/brink2/2000000141305.html -http://www.contractorresource.com/Vermont/Westford/Architects.shtml -http://www.bemi-immobilien.de/Startseite/www.ferien-immobilien.de/ferien-ib/startseite/Gemeinsam/3d-service/Top-Darlehens-Konditionen/Startseite/Gemeinsam/versicherungen/gebaeude/Startseite/www.ferien-immobilien.de/ferien-ib/startseite/Top-Darlehens-Konditionen/anforderungsformular.htm -http://free.polbox.pl/p/pphromar/OFERTA.htm -http://www.burstnet.com/ads/ad5788a-map.cgi/tr00010005_12 -http://www.private-immobilien-boerse.de/ungarn/verkauf/GmbH-Kauf-Verkauf-Insolvenz-konkurs/Startseite/Gemeinsam/Immolink/3d-service/IIM-Teil/Startseite/froben.htm -http://l-infonet.phkk.fi/fi/TIETOPALVELUT/KIRJASTO-+JA+TIETOPALVELUT/ammattikorkeakoulukirjastot/lahti/toisen+asteen+koulutus/ammattikorkeakoulut/ -http://www.geomag.com/pirates/html/4books.html -http://www.lithoquoter.com/Scripts/WebObjects.exe/Printers.woa/559420000049560000009753100000548302/main.wo/7016200000448302/0/-/prime -http://www.adventurecentre.com/Framesets/intrside/csh.htm -http://mitglied.tripod.de/vox0/negrostodos/de_sexo_dobles.html -http://www.sasinstitute.com/offices/asiapacific/taiwan/whatsnew/art1999/art091601.html -http://oss.sgi.com/cgi-bin/cvsweb.cgi/gdb/sim/ppc/Attic/ppc-opcode-complex?only_with_tag=HEAD -http://www.yorosiku.net:8080/-_-http://www.suntory.co.jp/eco/what.html -http://www.yorosiku.net:8080/-_-http://www.suntory.co.jp/culture/birds/welcome.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/linux/music/misc/unitest/lit/pushkin.html -http://sunsite.uakom.sk/tucows/adnload/69291_28346.html -http://members.tripod.com/yamabito2/gardening_000416_0502_n22.htm -http://www.affiliate.hpstore.hp.co.uk/do/session/380775/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/REGISTRATION/entry.asp -http://www.onsemi.com.cn/pub/prod/0,1193,products1_Disty_order=MC100H642FNR2,00.html -http://perso.wanadoo.fr/michel.brunel/Infographie/content/contacts.htm -http://mindit.netmind.com/proxy/http://www.film.com/RGI/FC.(/watch/broadband.jhtml).def...RGI//reviews/features/mow/blairwitch2.jhtml -http://www.doc.ic.ac.uk/lab/labsrc_area/firstyear/submissions/1997-98/jmc1/labs/Ex09/gv197/?N=D -http://www-d0.fnal.gov/d0dist/dist/releases/test/l3fmuo_unpack/rcp/?N=D -http://students.lsu.edu/students/main.nsf/c81d2bf8cb0b80ff862566fb00105ab2/44dc495cc7534894862566fe00127751!OpenDocument&ExpandSection=7,10,4,9 -http://www.zdnet.com/gamespot/filters/printerfriendly/0,10855,2531809-95,00.html -http://l-infonet.phkk.fi/fi/TIETOPALVELUT/asiasanahaku/el%25C3%2583%25C2%25A4kelaitokset/vakuutuslaitokset/rahoitus/el%E4kerahastot/ -http://coe.ier.hit-u.ac.jp/BibEc/data/Papers/fthteavfo2-96.html -http://polygraph.ircache.net:8181/http_-2ESPN.SportsZone.com/nfl/mall/http_-2www.excite.com/http_-2www.exploreuw.com/cards/ -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=cosido&l=pt -http://fazmali.bigsmart.com/mall/allinone/comparison_chart_new.html -http://sunsite.ualberta.ca/pub/Mirror/gnu/etc/ORDERS -http://www.bumppo.net/lists/realbasic-dr/1998/12/msg00347.html -http://www.bumppo.net/lists/realbasic-dr/1998/12/msg00363.html -http://www.bumppo.net/lists/realbasic-dr/1998/12/msg00482.html -http://www.bumppo.net/lists/realbasic-dr/1998/12/msg00483.html -http://www.bumppo.net/lists/realbasic-dr/1998/12/msg00499.html -http://www.bumppo.net/lists/realbasic-dr/1998/12/msg00508.html -http://www.bumppo.net/lists/realbasic-dr/1998/12/msg00518.html -http://it.sports.yahoo.com/000911/90/of8m.html -http://ftp.support.compaq.com/public/dunix/v3.2g/TruCluster_V1.0/?M=A -http://ftp.support.compaq.com/public/dunix/v3.2g/TruCluster_V1.0/ReleaseNotes.pdf -http://www.quzhou.gov.cn/flfg.nsf/0a043ae26eb50247002564640039f21d/e3cb86464a9f805a002564ac0039422d!OpenDocument&ExpandSection=5,1,9 -http://www.quzhou.gov.cn/flfg.nsf/0a043ae26eb50247002564640039f21d/e3cb86464a9f805a002564ac0039422d!OpenDocument&ExpandSection=6,1,9 -http://polygraph.ircache.net:8181/Keyboards/http_-2www.sky.net/~robertf/http_-2domino.findyn.com/fdi.nsf/http_-2home.netscape.com/ -http://www.nv.cc.va.us/home/jakim -http://itcareers.careercast.com/texis/it/itjs/+nwwBmJe0B-deVmwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewXhmoBGnaqdGpdGwBodDaDnBidGAoDta5O5BnM5amo5BGox1BnmanDtoDnnGaMw55wqr15nBB5a51ppdGBamnVncdpaBn5BaMFqhTfR20DzmeQtwwwpBme-WD86eyxwww5rmesdwwwBrmeZpwww/morelike.html -http://itcareers.careercast.com/texis/it/itjs/+MwwBme7WD86JwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewXhmoBGnaqdGpdGwBodDaDnBidGAoDta5O5BnM5amo5BGox1BnmanDtoDnnGaMw55wqr15nBB5a51ppdGBamnVncdpaBn5BaMFqhTfR20DzmeQtwwwpBme-WD86eyxwww5rme4dwwwBrmeZpwww/jobpage.html -http://my.dreamwiz.com/hideyu/couple/couplemain.htm -http://www.noras.bizland.com/top_pages/top_gen_1.htm -http://www.nomade.fr/catm6/entreprises_economi/electricite_electro/electricite/composants_fournitu/index5.shtml -http://www.staroriental.net/nav/soeg_c/ihf,aeb,s0,363,黎明.html -http://online.excite.de/lifestyle/katalog/27990 -http://www.linux.com/networking/network/performance/install/news/Linux/ -http://www.linux.com/networking/network/performance/install/news/kernel/ -http://tw.yahoo.com/Regional/Countries_and_Regions/China/Provinces__Regions_and_Municipalities/Shandong/Cities_and_Towns/He_Zhe/Government/ -http://kernel2.adver.com.tw/Counter/log/kernel2.adver.com.tw/ReadAdverData/2000-10-29/12/972792271154.txt -http://independent-sun-01.whoc.theplanet.co.uk/news/Sport/Football/Bradford/ipswich221000.shtml -http://www.emis.de/journals/EJDE/Monographs/Volumes/Monographs/1996/05-Hetzer/Hetzer-tex -http://oss.sgi.com/cgi-bin/cvsweb.cgi/linux-2.3-4/linux/arch/arm/def-configs/assabet?only_with_tag=LINUX-2_4_0-test1 -http://www.nrk.no/finnmark/x22_8_96/arkivet/ -http://pelit.saunalahti.fi/.9/telenation/valveworld/games/Half-Life/?S=A -http://pelit.saunalahti.fi/.9/telenation/valveworld/games/Half-Life/_Dedicated.txt -http://pelit.saunalahti.fi/.9/telenation/valveworld/games/Half-Life/_Mods.txt -http://ftp.sunet.se/pub/FreeBSD/ports/ports-stable/games/bugsx/?N=D -http://ring.yamanashi.ac.jp/archives/NetBSD/packages/1.4.1/sparc/databases/ -http://citeseer.nj.nec.com/cidcontext/260967 -http://members.tripod.co.jp/jojo6251/sasamineHP.htm -http://www.segodnya.ru/w3s.nsf/Archive/2000_96_life_vrez_noname2.html -http://www.citybrasil.com.br/rs/ivora/cidadefala.htm -http://web62.com/engl/fashion/pompoes/nav.htm -http://www.jufo.com/netcenter/house/item/bglz/477_lmt.html -http://gatekeeper.dec.com/pub/BSD/FreeBSD/FreeBSD-current/src/gnu/libexec/uucp/uupick/ -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/lelandsystems.stanford.edu/announce/pubsw/ -http://www.schleuse.de/maschine/World/Deutsch/Kultur/Literatur/Autoren_und_Autorinnen/D/Dominik,_Hans/ -http://www.elsur.cl/archivo/mayo2000/8mayo2000/elsur/espectaculos/ind2.php3 -http://www.jpc-neuheiten.de/2881737.htm -http://www.digitaldrucke.de/(aktuell,arbeitsvermittlung,computer,creaccess,gaestebuch,hilfe,hilfeallgemein,individualverkehr,kultur,onlineservice,schnellübersicht,sense,veranstaltungen,verkehr,von)/_fort/html/themen/computer/soft/links/softquad.htm -http://bbs.syu.ac.kr/NetBBS/Bbs.dll/groupbbs031/rcm/zka/B2-kB23m/qqo/004A/qqatt/^ -http://www.city-map.de/city/print/nl/Niedersachsen/Osterholz/actueel_&_nieuw/onroerendgoed_&_woningen/k012700681.html -http://members.tripod.com/sultana_2/thiskindalife.htm -http://members.tripod.com/sultana_2/thisthing.htm -http://members.tripod.com/sultana_2/believeinthis.html -http://tulips.ntu.edu.tw/search*chi/m586.47+4412/m586.47+4412/-5,-1,0,B/frameset&F=m586.48+0146&1,1 -http://btp1da.phy.uni-bayreuth.de/ftp/pub/FreeBSD/ports/www/linbot/?S=A -http://pub6.ezboard.com/fbiblediscussionandsharingparableorversesharing.subscribeUnregisteredToTopic?topicID=113.topic -http://www.cs.rit.edu/usr/local/pub/atk/course_descr/481.dir/?M=A -http://neptune.guestworld.com/gear/gateway.cfm?action=manage&owner=Nickdays -http://retailer.gocollect.com/do/session/1912673/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/shipping_policy.asp -http://tucows.minorisa.es/adnload/001-006-009-001.html -http://www.cwi.nl/~jack/spunk/texts/pubs/sekhmet/8/sp001225.txt -http://homepage.yesky.com/33554432/36700160/103524.htm -http://cvs.php.net/viewcvs.cgi/php3/functions/gd.c?annotate=1.65&sortby=log -http://www.genexchange.com/deathreg.cfm?state=nc&county=pasquotank -http://www.genexchange.com/schoolreg.cfm?state=nc&county=pasquotank -http://www.tagnet.org/uva/Eventos/Emergencia99/Fotos/FotosOccidente01.htm -http://itcareers.careercast.com/texis/it/itjs/+CwwBmue0B-dswwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqew6nmoBGnaqdGpdGwBodDa5oBnaoDqc1mnanLqnca15naGn31oGnma5Aocc5awqqd1DBoDtamn5oGwxcnaMFqhTfR20Dzme9twwwpBme+6D865www5rmesDwwwBrmeRdwww/jobpage.html -http://retailer.gocollect.com/do/session/1912638/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/clubhouse/suggestions.asp -http://kulichki-win.rambler.ru/inkwell/bio/zitinsk.htm -http://www.thestateofcolorado.com/e1tatpiercing.html -http://www.pc-schulmusik.purespace.de/seminar/START.HTM -http://www.feeler.nl/rubrieken/index.xml/818004059 -http://ftp.dartmouth.edu/~mcb/faculty/fiering.html -http://ustlib.ust.hk/search*chi/cHD30.28+.C56+1995/chd+++30.28+c56+1995/-17,-1,0,E/2browse -http://herndon1.sdrdc.com/cgi-bin/com_detail/C00325258/ -http://www.linux.com/networking/network/industry/press_release/linuxworld/Linux/ -http://mindit.netmind.com/proxy/http://www.abc.net.au/children/bananas/dreamtime/page1.htm -http://www.allkorea.co.jp/cgi-bin/allkorea.front/972959860700/Catalog/1000188 -http://207.87.5.36/pc/news/saa7108/ -http://musicalproducts.asiaep.com/muspro5a.htm -http://www.trax.nilex.co.uk/trax.cgi/A1S/A1U/1AL/A1S/A2S/C1L/ -http://www.cjga.com/JamMoviesCanadianO/obsessed.html -http://www.symantec.se/region/jp/support/mac/utiliti/num352/num352up.html -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=catapultaras&l=pt -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=catapultai&l=pt -http://no.egroups.com/group/Chenzhou-families -http://www.teenplatinum.com/barelylegal/anal-sexass/young-adultbest-friends/hardaction/slutsnude/red-toenail-polishfoot-fetish/toenail-polish.html -http://beatles.sonicnet.com/allmusic/ai_links.jhtml?ai_id=1000 -http://www.luecos.de/wow/art/fu_satir_30142.html -http://nw1.newsweek.com/nw-srv/inetguide/iguide_4505343.html -http://www.si.uniovi.es/mirror/squid/mail-archive/squid-users/200002/0637.html -http://sunsite.compapp.dcu.ie/pub/perl/modules/by-category/08_User_Interfaces/Tk/NI-S/Tk402.004.readme -http://www.amzn.com/exec/obidos/tg/feature/-/44435/ -http://www.amzn.com/exec/obidos/tg/feature/-/2869/ -http://www.hanter21.co.kr/NetBBS/Bbs.dll/dhliter02/lst/qqeq/1/zka/B2-kBINo/qqo/PRMY -http://www.linux.com/networking/network/help/email/web/security/ -http://www.linux.com/networking/network/help/email/web/Slackware/ -http://www.linux.com/networking/network/help/email/web/e-commerce/ -http://www.linux.com/networking/network/help/email/web/release/ -http://debian.tod.net/debian/dists/stable/contrib/binary-all/web/?S=A -http://ftp.sunet.se/pub/FreeBSD/ports/ports-current/devel/fastcrc/pkg-descr -http://www.trax.nilex.co.uk/trax.cgi/A1C/A2S/B1S/B3S/B1S/C1U/ -http://www.trax.nilex.co.uk/trax.cgi/A1C/A2S/B1S/B3S/B1S/C1D/ -http://rex.skyline.net/html/Metalurgy.html?266,supplies,hobbies,painting,arts -http://infoseek.wunderground.com/geo/BigtempBannerPromo/US/CO/Cortez.html -http://www.kaernten.at/1Root/Kontinent/6/Staat/7/Bundesland/17/Ort/820/Pension/304806/Homepage/h_homepage...1.html -http://dellnet.excite.de/nachrichten/katalog/6663 -http://www.users.skynet.be/eloymarc/infomobil2/sobeen13.htm -http://www.outpersonals.com/cgi-bin/w3com/pws/out/hXRIA9gT9KNJakAdbkyW2SaEFRyXAJCa2tpUDiYF1BHxbpYG0_go-roWL4XPWFopknXRvCQG4gmCQLNceomD4GJpJ4hvR4eYeQbgN2CFeSPhxakPczINPvttFOQK3IDjjmYz66jR -http://www.outpersonals.com/cgi-bin/w3com/pws/out/_cRIZWRepq55uG8fC8ijlWOJrkBzrY7AXdlxz7fhosBeDRNPqhpYFY3uMBgWodvLAPXL2sPRQ7GqKF66xzHYxHZISDRz4dfZjEKnEShXdRFhDxBcOPx4ufr7uXHA0sNvRvMq6Z1j -http://polygraph.ircache.net:8181/health/http_-2cyril.com/http_-2www.americanexpress.com/corp/consumerinfo/privacy/privacystatement.shtml -http://polygraph.ircache.net:8181/health/http_-2cyril.com/arch.html -http://www.villager.com/ctg/cgi-bin/Villager/home/AAAksrACwAAACCOAAI -http://www.medoc-ias.u-psud.fr:81/synoptic/gif/950829/?D=A -http://members.tripod.lycos.nl/unlimited_pagez/pld2.html -http://www.thisislancashire.co.uk/lancashire/archive/1996/01/25/FEATURES0VQ.html -http://members.tripod.com/rebelstrange/buxoms.html -http://fi.egroups.com/message/TEZKo/3 -http://www.yamato.jp.ibm.com/servers/eserver/xseries/about/availa.html -http://polygraph.ircache.net:8181/NetworkInfo/http_-2www.thepetsupply.com/3d/web.html -http://polygraph.ircache.net:8181/NetworkInfo/http_-2www.thepetsupply.com/3d/http_-2www.sccsi.com/welcome.html -http://www.luf.org/wiki/edit/GIG/GenericCodingTerm -http://208.178.109.85/msgshow.cfm/msgboard=822531545582878&msg=50215618980084&page=1&idDispSub=-1 -http://mercury.spaceports.com/~xenical/diet-food.html -http://de.news.yahoo.com/991202/3/echc.html -http://web.tiscalinet.it/ipsiang/uviafede/tertulli.html -http://www.brio.de/BRIO.catalog/39fdb8820423a4d82740d472aa780733/Customer/Register -http://rainforest.parentsplace.com/dialog/thread.pl/bradley2/16/2.html?dir=prevResponse -http://www.centc251.org/forums/aca-1/dispatch.cgi/isowg4/folderFrame/100012/0/def/1208103 -http://www.bemi-immobilien.de/Startseite/www.ferien-immobilien.de/ferien-ib/startseite/Gemeinsam/versicherungen/gebaeude/Gemeinsam/Inserieren/Gemeinsam/MarketingStrategie/Gemeinsam/erreichenPartner/Gemeinsam/versicherungen/unfall/Top-Darlehens-Konditionen/anforderungsformular.htm -http://www.planetit.com/techcenters/docs/internet_&_intranet/news/PIT20000630S0024/threads?comment_status=on -http://ftp.eq.uc.pt/software/unix/Linux/redhat/redhat-6.2/doc/HOWTOS/localization/Hellenic-HOWTO-html/Hellenic-HOWTO-8.html -http://help.sap.com/saphelp_45b/helpdata/de/20/7be8341545ab06e10000009b38f83b/applet.htm -http://www.imagestation.com/member/?name=RonnyClas6&c=1 -http://www.egroups.com/messages/cmass-syd-talk/1170 -http://bellsouth-cl.tucows.com/winnt/xwinservernt_size.html -http://ftp.surfnet.nl/os/FreeBSD/cdrom/development/FreeBSD-CVS/ports/mail/youbin/patches/home.html -http://chat.bigchurch.com/cgi-bin/w3com/pws/bc/PDhIf1s64yA1us4SS1FzmCsroIgpwrmcmdaKEhvT295b5JjMxs9ttaP_gpBzDbn5VR9hkgTaiz3efTGjRK64ORbhJMs0Q8ONiYshBhnFHdkQjl3uSSwZim5B5Layd_SDwYDTVgHM659c -http://www.starshop.co.uk/Masson-Andre/Masson-Andre-Soleil-3200802.html -http://www.21hk.com/book/wx1/wx/zpj/h/huanzhulouzhu/shushan/4/ -http://www.dietrich-computer.de/creativegrafik.htm -http://forum.kf.kommorg.no/forum/agenda21/dispatch.cgi/disk_1/showFolder/100005/9206559 -http://mindit.netmind.com/proxy/http://abc.net.au/rn/schedule/wed.htm -http://www.fogdog.com/cedroID/ssd3040183156802/nav/stores/adventure_travel/ -http://www.fogdog.com/cedroID/ssd3040183156802/nav/stores/tennis/ -http://link.fastpartner.com/do/session/600349/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/nordicliving.php -http://members2.clubphoto.com/luisf216501/TAMARINDO/icons.phtml -http://www.affiliate.hpstore.hp.co.uk/do/session/380795/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/SMARTTIPS/brocdesign.asp -http://www.hblb.org.uk/hblbweb.nsf/$Pages/NewsArchive1!OpenDocument&ExpandSection=3,7,14,5,13,4,12 -http://www.chaos.dk/sexriddle/d/l/t/i/a/ -http://www.crutchfield.com/S-s7BJxKzNmKr/shop/ -http://www.crutchfield.com/cgi-bin/S-s7BJxKzNmKr/email.asp?sid=S-s7BJxKzNmKr -http://tucows.interbaun.com/winme/adnload/137104_47064.html -http://iland.tucows.com/win2k/adnload/73990_29810.html -http://ftp.uk.debian.org/debian/dists/woody/contrib/binary-alpha/text/?M=A -http://sound-dist.secured.co.uk/cgi-bin/psShop.cgi/add|10P02|972959526|Warm===and===Dry|user|0|1,0,0,1 -http://pub14.ezboard.com/fjavagateforum69255multibasicboard -http://www.xrefer.com/entry/317621 -http://library.cuhk.edu.hk/search*chi/aChen,+Jih-peng./achen+jih+peng/-5,-1,0,B/frameset&F=achen+jie+qi&1,1 -http://library.cuhk.edu.hk/search*chi/aChen,+Jih-peng./achen+jih+peng/-5,-1,0,B/exact&F=achen+jih+hsin&1,2 -http://yp.gates96.com/5/50/60/53.html -http://yp.gates96.com/5/50/60/98.html -http://yp.gates96.com/5/50/61/14.html -http://yp.gates96.com/5/50/61/60.html -http://yp.gates96.com/5/50/62/0.html -http://yp.gates96.com/5/50/63/12.html -http://yp.gates96.com/5/50/63/14.html -http://yp.gates96.com/5/50/63/51.html -http://yp.gates96.com/5/50/63/52.html -http://yp.gates96.com/5/50/64/2.html -http://yp.gates96.com/5/50/64/31.html -http://yp.gates96.com/5/50/65/36.html -http://yp.gates96.com/5/50/65/44.html -http://yp.gates96.com/5/50/65/58.html -http://yp.gates96.com/5/50/65/78.html -http://yp.gates96.com/5/50/66/33.html -http://yp.gates96.com/5/50/66/38.html -http://yp.gates96.com/5/50/67/3.html -http://yp.gates96.com/5/50/67/83.html -http://yp.gates96.com/5/50/68/40.html -http://yp.gates96.com/5/50/69/2.html -http://yp.gates96.com/5/50/69/36.html -http://yp.gates96.com/5/50/69/49.html -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=cochichastes&l=pt -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=cochicharam&l=pt -http://www.affiliate.hpstore.hp.co.uk/do/session/380791/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp.com/cposupport/fr/?CTRYcod=FR -http://www.affiliate.hpstore.hp.co.uk/do/session/380791/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/FR/REGISTRATION/entry.asp -http://pub22.ezboard.com/fworldofmugenfrm2.showMessage?topicID=131.topic&index=1 -http://pub23.ezboard.com/fmugenshowdownfrm8.showMessage?topicID=36.topic&index=1 -http://www.questlink.com/QL/CDA/Research/ProductBrief/1,1768,0_11203_135680_85724,00.html -http://www.jamba.de/KNet/_KNet-KBq8j1-gEd-138pd/showInfo-special1.de/node.0/cde7f1uou -http://www.leg.wa.gov/pub/rcw%20-%20text/title_41/chapter_050/rcw_41_50_650.txt -http://www.tiscover.ch/1Root/Kontinent/6/Staat/30/Bundesland/31/Ort/234/Ferienpaket/20120/Homepage/buchen...1.html -http://family.go.com/Categories/Features/family_2000_02/kidv/kidv0200resourceiii/ -http://www.online.kokusai.co.jp/Service/V0043469/wrd/G200/service/service.html -http://www.linux.com/networking/network/help/hardware/website/ISP/ -http://store1.europe.yahoo.com/I/freemans_1592_58696403 -http://202.99.23.195/BIG5/channel5/745/20000427/51173.html -http://www-usa10.cricket.org/link_to_database/GROUNDS/WI/ALBION/ALBION_SPORTS_COMPLEX_00772/ -http://www16.freeweb.ne.jp/computer/taka34/ -http://books.hyperlink.co.uk/bookinfo/Caught_in_a_Tornado/Ross/James_R./155553192X -http://ftp.uni-stuttgart.de/pub/security/unix/SSLapps/doc/?S=A -http://www.moviestarpages.com/rebecca_romijn-stamos/picture05.htm -http://html.tucows.ciaoweb.it/adnload/001-009-008-022.html -http://html.tucows.ciaoweb.it/adnload/001-009-008-019.html -http://www.brio.de/BRIO.catalog/39fe2f4306cb75f4273fd472aa780708/UserTemplate/2 -http://www.hole.kommune.no/hole/journweb.nsf/weboffjournal!OpenView&Start=92&Count=50&Expand=170 -http://polygraph.ircache.net:8181/docs/Win95/MSdialer/http_-2www.fastcounter.com/http_-2home.netscape.com/home/http_-2www.bildhome.com/plantationhomes/bale1500.htm -http://polygraph.ircache.net:8181/docs/Win95/MSdialer/http_-2www.fastcounter.com/http_-2home.netscape.com/home/http_-2www.bildhome.com/plantationhomes/bale8000.htm -http://writer.heha.net/poetics/90_poetics.htm -http://yp.gates96.com/5/55/20/98.html -http://yp.gates96.com/5/55/21/17.html -http://yp.gates96.com/5/55/21/75.html -http://yp.gates96.com/5/55/22/2.html -http://yp.gates96.com/5/55/22/22.html -http://yp.gates96.com/5/55/22/92.html -http://yp.gates96.com/5/55/23/11.html -http://yp.gates96.com/5/55/23/46.html -http://yp.gates96.com/5/55/23/66.html -http://yp.gates96.com/5/55/23/90.html -http://yp.gates96.com/5/55/24/2.html -http://yp.gates96.com/5/55/24/83.html -http://yp.gates96.com/5/55/24/85.html -http://yp.gates96.com/5/55/25/62.html -http://yp.gates96.com/5/55/26/38.html -http://yp.gates96.com/5/55/26/48.html -http://yp.gates96.com/5/55/28/5.html -http://yp.gates96.com/5/55/28/77.html -http://yp.gates96.com/5/55/29/14.html -http://yp.gates96.com/6/50/40/47.html -http://yp.gates96.com/6/50/40/60.html -http://yp.gates96.com/6/50/40/62.html -http://yp.gates96.com/6/50/41/81.html -http://yp.gates96.com/6/50/41/83.html -http://yp.gates96.com/6/50/42/58.html -http://yp.gates96.com/6/50/42/90.html -http://yp.gates96.com/6/50/42/93.html -http://yp.gates96.com/6/50/43/29.html -http://yp.gates96.com/6/50/43/79.html -http://yp.gates96.com/6/50/43/85.html -http://yp.gates96.com/6/50/44/40.html -http://yp.gates96.com/6/50/44/76.html -http://yp.gates96.com/6/50/44/81.html -http://yp.gates96.com/6/50/45/15.html -http://yp.gates96.com/6/50/45/52.html -http://yp.gates96.com/6/50/46/15.html -http://yp.gates96.com/6/50/46/19.html -http://yp.gates96.com/6/50/46/92.html -http://yp.gates96.com/6/50/47/2.html -http://yp.gates96.com/6/50/47/7.html -http://yp.gates96.com/6/50/47/33.html -http://yp.gates96.com/6/50/49/29.html -http://yp.gates96.com/6/50/49/36.html -http://www.outpersonals.com/cgi-bin/w3com/pws/out/wRtIx3JBCL5wVzA1pIKradbm9z4Oo2BbPRx_FVh-j4UyLzjojbipsV0nsuM2iF9RxJ1jG2C4LUy3YP5pJl7qDqPdnqV765l2x5hJ0fIUUJuWLaccxO0svbclJ4-alyBQj6Y5dO8YdURyhf9q05q8mJ25FlvF62sm -http://213.36.119.69/do/session/152980/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www3.travelprice.com/voyages/recherche.phtml -http://yp.gates96.com/6/2/20/11.html -http://yp.gates96.com/6/2/21/12.html -http://yp.gates96.com/6/2/21/51.html -http://yp.gates96.com/6/2/21/56.html -http://yp.gates96.com/6/2/22/8.html -http://yp.gates96.com/6/2/22/38.html -http://yp.gates96.com/6/2/22/65.html -http://yp.gates96.com/6/2/23/14.html -http://yp.gates96.com/6/2/23/50.html -http://yp.gates96.com/6/2/23/57.html -http://yp.gates96.com/6/2/23/75.html -http://yp.gates96.com/6/2/24/15.html -http://yp.gates96.com/6/2/24/31.html -http://yp.gates96.com/6/2/24/43.html -http://yp.gates96.com/6/2/24/70.html -http://yp.gates96.com/6/2/24/87.html -http://yp.gates96.com/6/2/25/22.html -http://yp.gates96.com/6/2/25/53.html -http://yp.gates96.com/6/2/25/90.html -http://yp.gates96.com/6/2/26/25.html -http://yp.gates96.com/6/2/26/26.html -http://yp.gates96.com/6/2/26/45.html -http://yp.gates96.com/6/2/26/76.html -http://yp.gates96.com/6/2/27/34.html -http://yp.gates96.com/6/2/28/1.html -http://yp.gates96.com/6/2/28/25.html -http://yp.gates96.com/6/2/29/2.html -http://yp.gates96.com/6/2/29/31.html -http://yp.gates96.com/6/2/29/57.html -http://yp.gates96.com/6/2/29/74.html -http://archive.bitcon.no/tucows//winme/preview/136862.html -http://archive.bitcon.no/tucows//winme/preview/138371.html -http://archive.bitcon.no/tucows//winme/preview/137011.html -http://archive.bitcon.no/tucows//winme/preview/137897.html -http://archive.bitcon.no/tucows//winme/preview/138157.html -http://www.ngmag.com/books/reference/0792275667.html -http://socrates.berkeley.edu:4231/pth.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/lit/music/midi/lit/quizz/lit/multiple.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/lit/music/midi/lit/quizz/lit/god.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/lit/music/midi/lit/quizz/misc/colorart/ -http://retailer.gocollect.com/do/session/1912687/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/postcards/index.asp -http://www.affiliate.hpstore.hp.co.uk/do/session/380807/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/creative/entry.asp -http://home.swipnet.se/~w-29806/Tab/Guitar/Svenska/h/Jakob%20Hellman/VACKERT_.TXT -http://jupiter.u-3mrs.fr/~msc41www/releves/16860204.HTM -http://citeseer.nj.nec.com/cidcontext/1003669 -http://citeseer.nj.nec.com/cidcontext/1003675 -http://citeseer.nj.nec.com/cidcontext/1003676 -http://www.escribe.com/religion/nondualitysalon/m10801.html -http://www.escribe.com/religion/nondualitysalon/m10824.html -http://www.tvstore.com/browse/TV/PATCH/s.bCooTxTe -http://digilander.iol.it/lorciao/computer.htm -http://yosemite.epa.gov/r9/sfund/overview.nsf/ef81e03b0f6bcdb28825650f005dc4c1/1d8f2e36da9dc1de8825660b007ee696?OpenDocument&ExpandSection=-1,-8,-4 -http://cn.egroups.com/post/ukr_liga?act=reply&messageNum=40 -http://www.lithoquoter.com/Scripts/WebObjects.exe/Printers.woa/048720000079262000002260000000798302/Session_Expired_Page.wo/6144200000698302/0/-/prime -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=coadjuvaram&l=pt -http://www.craft-supplies.co.uk/cgi-bin/psProdDet.cgi/LW132|972959517|Liming_&_Patinating|user|0|0,0,1,1 -http://www.angelfire.com/va/boogiescamp -http://www.kyotei.or.jp/JLC/VS/19/991209/0212.htm -http://www.affiliate.hpstore.hp.co.uk/do/session/380800/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/assistance/entry.asp -http://www.city-map.nl/city/map/en/Niedersachsen/Landkreis_Cuxhaven/customers/Dr.rer.nat._Büro_für_Erdwiss.Untersuchungen_Udo_Lade/contact.html -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=consternais&l=pt -http://muenchen.bda.de/freizeitparks/gastbuch/gaestebuch003.html -http://www.linux.com/networking/network/industry/growth/editing/SAP/ -http://www.linux.com/networking/network/industry/growth/editing/mobile/ -http://lists.omnipotent.net/qmail/199909/msg00892.html -http://lists.omnipotent.net/qmail/199909/msg00952.html -http://lists.omnipotent.net/qmail/199909/msg00964.html -http://ftp.cc.chuo-u.ac.jp/home/pub/lang/perl/CPAN/ports/msdos/old/?N=D -http://www3.buch-per-sms.de/faq.jsp$ID=To7697mC5277111659640048At0.5320036065114109 -http://www3.buch-per-sms.de/wir_ueber_uns.jsp$ID=To7697mC5277111659640048At0.5337056452821441 -http://tradersdirectory.com/channel/jobs/insurance/insurance_policy_clerk/b.2166.g.2360.html -http://www.mapion.co.jp/custom/nikkei/admi/13/13119/takashimadaira/7chome/27/ -http://www.dispatch.co.za/1998/02/19/easterncape/MARCHANC.HTM -http://www.techsupplies.com/sleuth/33/1/10703/523434/ -http://fi.egroups.com/message/911dispatchers/171 -http://polygraph.ircache.net:8181/services/define/toast/congress2000/http_-2www.sportfish.net/fish.htm -http://polygraph.ircache.net:8181/services/define/toast/congress2000/MS.htm -http://polygraph.ircache.net:8181/services/define/toast/congress2000/http_-2leader.linkexchange.com/1/X171400/clicklogo -http://polygraph.ircache.net:8181/services/define/toast/congress2000/cfiref.htm -http://www.digitaldrucke.de/(aktuell,arbeitsvermittlung,computer,daham,hilfe,individualverkehr,kultur,literatur,veranstaltungen,verkehr)/_fort/html/themen/aktuell/events/events.htm#regional -http://dellnet.excite.de/computer/katalog/7054 -http://read.cnread.net/cnread1/ztxs/b/baitian/lmss/006.htm -http://www-d0.fnal.gov/d0dist/dist/releases/psim01.02.00/l2utils/GNUmakefile -http://www.allgemeine-immobilien-boerse.de/Frankreich/Verkauf/Private-IB/Startseite/Gemeinsam/erreichenPartner/Gemeinsam/Inserieren/Allgemeine-IB/ -http://wish.themes.tucows.com/adnload/14495.html -http://wish.themes.tucows.com/preview/14494.html -http://wish.themes.tucows.com/preview/78220.html -http://www.uwm.edu/IMT/Computing/sasdoc8/sashtml/af/z0230835.htm -http://www.bdnet.com/Taiga/H/Fulu/fiche_serie.htm -http://se.egroups.com/message/clippingts/14?source=1 -http://adelaida.net/music/texts/trex_s1.html -http://archive.bitcon.no/pub/cica/handheld/desktop/ -http://www.jacksonhewitt.com/ctg/cgi-bin/JacksonHewitt/disclaimers/AAAksrACwAAACCMAAC -http://ftp.cc.chuo-u.ac.jp/home/pub/TeX/CTAN/language/ethiopia/ethtex/lj_fonts/?N=D -http://sirac.inrialpes.fr/Infos/Personnes/Christophe.Rippert/ressources/jdk1.3/docs/guide/jdbc/spec/jdbc-spec.frame16.html -http://www.linux.com/networking/network/release/press_release/competition/web/ -http://www.linux.com/networking/network/release/press_release/competition/internet/ -http://www.linux.com/networking/network/release/press_release/competition/HTTP/ -http://hughes.tucows.com/win2k/share2k_size.html -http://icq.planetout.com/popcornq/movienews/98/10/23/money/careers -http://go3.163.com/_NTES/~cntop07/files/k20808/zengby-k201/zengby-k201-09.html -http://uunetnl.pda.tucows.com/palm/pqa_news_license.html -http://uunetnl.pda.tucows.com/palm/preview/54359.html -http://uunetnl.pda.tucows.com/palm/preview/58637.html -http://uunetnl.pda.tucows.com/palm/adnload/72726_21807.html -http://uunetnl.pda.tucows.com/palm/adnload/62079_21796.html -http://uunetnl.pda.tucows.com/palm/preview/33674.html -http://uunetnl.pda.tucows.com/palm/preview/33501.html -http://uunetnl.pda.tucows.com/palm/adnload/52518_21780.html -http://ftp.dei.uc.pt/pub/net/ip/trace/traffic/?N=D -http://dreamgallery.simplenet.com/lobby/yrestless/sets/26/yrz19.htm -http://sanqin.net/wenyuan/gudian/fengshen/a/fengshen24.html -http://windows.tucows.com/preview/001-010-005-007C.html -http://windows.tucows.com/preview/001-010-005-004C.html -http://proshikanet.tucows.com/win2k/preview/37883.html -http://www5.cplaza.ne.jp/auth/kingdom/bbs/rescue/no70/182.html -http://www5.cplaza.ne.jp/auth/kingdom/bbs/rescue/no70/84.html -http://www5.cplaza.ne.jp/auth/kingdom/bbs/rescue/no70/82.html -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=7,19,34,20,29 -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=36,19,34,20,29 -http://www.ne.jp/asahi/kume-kume/kume/photogellery/zoo/nihon_saru/html/nihon_saru04.html -http://www.ne.jp/asahi/kume-kume/kume/photogellery/zoo/nihon_saru/html/nihon_saru05.html -http://www.iabusnet.org:90/forums/aca-1/dispatch.exe/survey/showNextUnseen/fol/100001/2443194 -http://www.chaos.dk/sexriddle/t/r/p/c/p/ -http://www.ld.com/cbd/archive/1999/09(September)/13-Sep-1999/16sol007.htm -http://www.ld.com/cbd/archive/1999/09(September)/13-Sep-1999/16sol024.htm -http://www.ld.com/cbd/archive/1999/09(September)/13-Sep-1999/16sol025.htm -http://www.ld.com/cbd/archive/1999/09(September)/13-Sep-1999/16sol030.htm -http://debian.linux.org.tw/debian/dists/Debian2.1r4/non-free/binary-alpha/oldlibs/?N=D -http://www.tamil.net/list/2000-04/nav00304.html -http://www.2pl.com/b/se/to/1/01/05/v2/1010500263-7.htm -http://www.2pl.com/b/se/to/1/01/05/v2/1010500263-8.htm -http://www.mirror.ac.uk/sites/ftp.microsoft.com/deskapps/powerpt/KB/Q129/5/ -http://www.gbnf.com/genealogy/royal92/html/d0028/I307.HTM -http://www-linux.gsi.de/linux-doc/libqt2/examples/qfd/?M=A -http://www.arm.com/sitearchitek/support.ns4/html/sdt_debug!OpenDocument&ExpandSection=24,6,37,7 -http://us.mandrakesoft.com/cgi-bin/cvsweb.cgi/kdeutils/kab/kab_kab1importer.h?sortby=log&only_with_tag=KDE_2_0_RELEASE -http://www.allgemeine-immobilien-boerse.de/nordrhein-Westfalen/bielefeld/Verkauf/Allgemeine-IB/Gemeinsam/versicherungen/gebaeude/Private-IB/Gemeinsam/erreichenPartner/email3d.htm -http://www.allgemeine-immobilien-boerse.de/nordrhein-Westfalen/bielefeld/Verkauf/Allgemeine-IB/Gemeinsam/versicherungen/gebaeude/Private-IB/3d-service/info.htm -http://satlink.tucows.com/winme/htmleditme_rating.html -http://satlink.tucows.com/winme/adnload/137630_29066.html -http://satlink.tucows.com/winme/adnload/137653_29087.html -http://yp.gates96.com/5/55/40/63.html -http://yp.gates96.com/5/55/40/93.html -http://yp.gates96.com/5/55/41/8.html -http://yp.gates96.com/5/55/41/27.html -http://yp.gates96.com/5/55/41/93.html -http://yp.gates96.com/5/55/42/1.html -http://yp.gates96.com/5/55/42/65.html -http://yp.gates96.com/5/55/43/15.html -http://yp.gates96.com/5/55/43/26.html -http://yp.gates96.com/5/55/43/94.html -http://yp.gates96.com/5/55/44/70.html -http://yp.gates96.com/5/55/44/83.html -http://yp.gates96.com/5/55/45/17.html -http://yp.gates96.com/5/55/46/3.html -http://yp.gates96.com/5/55/46/39.html -http://yp.gates96.com/5/55/46/43.html -http://yp.gates96.com/5/55/47/18.html -http://yp.gates96.com/5/55/48/23.html -http://yp.gates96.com/5/55/48/40.html -http://yp.gates96.com/5/55/48/72.html -http://yp.gates96.com/5/55/48/93.html -http://yp.gates96.com/5/55/49/7.html -http://yp.gates96.com/5/55/49/8.html -http://yp.gates96.com/5/55/49/20.html -http://yp.gates96.com/5/55/49/37.html -http://yp.gates96.com/5/55/49/49.html -http://yp.gates96.com/5/55/49/60.html -http://yp.gates96.com/5/55/49/69.html -http://www.ramtron.com/pages/visiters.htm -http://genforum.genealogy.com/cgi-genforum/forums/oh/wayne.cgi?56 -http://freebsd.ntu.edu.tw/perl/modules/by-module/DB_File/STAS/?N=D -http://sunsite.org.uk/public/usenet/news-faqs/alt.answers/us-visa-faq/?D=A -http://circumstance.co.kr/www.globalvillage.com/support/software.html -http://mediate.magicbutton.net/do/session/625589/vsid/4385/tid/4385/cid/88138/mid/1702/rid/2114/chid/3393/url/http://www.worldgallery.co.uk/frameset-top50.html -http://itcareers.careercast.com/texis/it/itjs/+9wwBmev6D86wwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewGPndhBiwGna5O5BnManDtoDnnGamnVncdpoDtaBn5Baw1BdMwBodDaGn31oGnma5Aocc5anLpnGonDqnaGnwcaMFqhTfR20DzmeTtwwwpBm3eP0-dmwww5rmehDwwwBrmeZpwww/morelike.html -http://library.bangor.ac.uk/search/dProtestant+churches+--+New+York+(State)+--+History+--+19th+century/dprotestant+churches+new+york+state+history+++19th+century/-17,-1,0,B/frameset&F=dprotestant+churches+england+history+++16th+century&2,,3 -http://augustachronicle.com/stories/021299/fea_223-4914.000.shtml -http://dreamcity.gaiax.com/www/dreamcity/k/n/kint/menu.html -http://commerce.was-inc.com/cgi-bin/abtwsam.dll/LbkWebCommerceMallCategories-BBC709D6_97E3_3D628A3FC67830F4FB7BD0E0AC833504 -http://www.mirror.kiev.ua:8082/paper/2000/07/1251/text/07-09-1.htm -http://www.burstnet.com/ads/ad7826a-map.cgi/1025131450 -http://link.fastpartner.com/do/session/600341/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/se/ -http://topcu.tucows.com/winme/adnload/137966_29370.html -http://topcu.tucows.com/winme/adnload/137990_29378.html -http://itcareers.careercast.com/texis/it/itjs/+9wwBmeS+D86swwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqew6hwAwMwoaBnqrDoqwcaqdD51cBoDta5wcn5aqdD51cBwDB5aBnqrDdcdton5apGd5pnqBoVnaq15BdMnG5apGdm1qBaBnwMaMFqtwAwMwoDzmehxwwwpBmeV+D86eqxwww5rmedDwwwBrmeZpwww/jobpage.html -http://itcareers.careercast.com/texis/it/itjs/+DwwBmeoWD86eDqwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqew6hwAwMwoaBnqrDoqwcaqdD51cBoDta5wcn5aqdD51cBwDB5aBnqrDdcdton5apGd5pnqBoVnaq15BdMnG5apGdm1qBaBnwMaMFqtwAwMwoDzmehxwwwpBmeV+D86eqxwww5rmeqDwwwBrmeZpwww/morelike.html -http://itcareers.careercast.com/texis/it/itjs/+QwwBme4+D86qxwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqew6hwAwMwoaBnqrDoqwcaqdD51cBoDta5wcn5aqdD51cBwDB5aBnqrDdcdton5apGd5pnqBoVnaq15BdMnG5apGdm1qBaBnwMaMFqtwAwMwoDzmehxwwwpBmeV+D86eqxwww5rm+mwwBrmeZpwww/jobpage.html -http://wwwbackup.trinler.net/anleitungen/manual/mod/mod_dll.html -http://wwwbackup.trinler.net/anleitungen/manual/mod/mod_log_agent.html -http://as400bks.rochester.ibm.com/pubs/html/as400/v4r5/ic2962/info/RZAIENETDOTDATA.HTM -http://www.gov.ie/educ/000928.htm -http://www.gov.ie/educ/speech/000928.htm -http://pub3.ezboard.com/utaela.showPublicProfile?language=EN -http://genforum.genealogy.com/cody/messages/700.html -http://genforum.genealogy.com/cody/messages/525.html -http://genforum.genealogy.com/cody/messages/494.html -http://genforum.genealogy.com/cody/messages/447.html -http://ftp.surfnet.nl/os/FreeBSD/cdrom/development/FreeBSD-CVS/ports/editors/psgml-emacs/files/home.html -http://www.mic.hr/PGBURZA:135556 -http://pub8.ezboard.com/fthecompanionswebboardfrm19 -http://pub8.ezboard.com/fthecompanionswebboardarchive -http://gallery2.simplenet.com/lobby/main/videocaps/ghoffman/precious/ghsp36.htm -http://www.symantec.ru/avcenter/venc/data/unashamed.html -http://www.symantec.ru/avcenter/cgi-bin/virauto.cgi?vid=7000 -http://www.symantec.ru/avcenter/cgi-bin/virauto.cgi?vid=1685 -http://www.symantec.ru/avcenter/cgi-bin/virauto.cgi?vid=5358 -http://rex.skyline.net/navigate.cgi?reading,retail,hobbies,painting,arts -http://rex.skyline.net/navigate.cgi?forsale,retail,hobbies,painting,arts -http://pds.nchu.edu.tw/cpatch/ftp/cuteftp/?S=A -http://www.tel.de/s/M/MCFIT.htm -http://zeus.uni-trier.de/~ley/db/indices/a-tree/s/Stevenson:Allan.html -http://www.alsapresse.com/jdj/00/07/14/SA/article_16.html -http://link.fastpartner.com/do/session/600359/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/jobpilot.php -http://link.fastpartner.com/do/session/600359/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/index.php -http://news.dreamwiz.com/news_lg/04/20001025/joins/200010251653041653193.html -http://news.dreamwiz.com/news_lg/04/20001025/joins/200010250820040820583.html -http://windows.tucows.com/winnt/adnload/71593_30161.html -http://213.36.119.69/do/session/152979/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/reserver/encheres/ -http://213.36.119.69/do/session/152979/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/IT_IT/ -http://www.centc251.org/forums/aca-1/dispatch.cgi/isowg4/showNextUnseen/fol/100012/1220541 -http://bigpanda.net/46/alphabetical.html -http://bigpanda.net/46/io.html -http://fi.egroups.com/message/puzzles/547 -http://theaceshow.com/drawinglinda.html -http://theaceshow.com/drawingsketch.html -http://ftp.jp.debian.org/debian/dists/woody/main/binary-all/news/?D=A -http://www.trax.nilex.co.uk/trax.cgi/A1S/A2L/1AS/B3U/B4L/C2S/ -http://www.trax.nilex.co.uk/trax.cgi/A1S/A2L/1AS/B3U/B4L/C4D/ -http://in.egroups.com/message/islaam/3 -http://in.egroups.com/message/islaam/29 -http://ustlib.ust.hk/search*chi/a%7B233e68%7D%7B215976%7D%7B213e2e%7D/a%7B233e68%7D%7B215976%7D%7B213e2e%7D/-5,-1,0,B/browse -http://yp.gates96.com/13/8/20/68.html -http://yp.gates96.com/13/8/21/25.html -http://yp.gates96.com/13/8/21/32.html -http://yp.gates96.com/13/8/21/49.html -http://yp.gates96.com/13/8/21/63.html -http://yp.gates96.com/13/8/21/88.html -http://yp.gates96.com/13/8/22/2.html -http://yp.gates96.com/13/8/22/10.html -http://yp.gates96.com/13/8/22/67.html -http://yp.gates96.com/13/8/22/79.html -http://yp.gates96.com/13/8/23/19.html -http://yp.gates96.com/13/8/23/31.html -http://yp.gates96.com/13/8/25/64.html -http://yp.gates96.com/13/8/25/68.html -http://yp.gates96.com/13/8/25/73.html -http://yp.gates96.com/13/8/26/6.html -http://yp.gates96.com/13/8/26/11.html -http://yp.gates96.com/13/8/26/12.html -http://yp.gates96.com/13/8/26/39.html -http://yp.gates96.com/13/8/26/54.html -http://yp.gates96.com/13/8/26/55.html -http://yp.gates96.com/13/8/26/82.html -http://yp.gates96.com/13/8/27/89.html -http://yp.gates96.com/13/8/28/22.html -http://yp.gates96.com/13/8/28/61.html -http://yp.gates96.com/13/8/29/13.html -http://yp.gates96.com/13/8/29/33.html -http://yp.gates96.com/13/8/29/83.html -http://www.private-immobilien-boerse.de/baden-wuertemberg/ostalb-kreis/Verkauf/Versteigerungen-IB/Startseite/Gemeinsam/erreichenPartner/IIM-Teil/Startseite/GmbH-Kauf-Verkauf-Insolvenz-konkurs/Startseite/indexbeginn.htm -http://www2.so-net.ne.jp/mc/columns/nakama/1112/ -http://ring.shibaura-it.ac.jp/archives/pack/x68/personal/tokei/00_index.txt -http://yp.gates96.com/5/32/0/0.html -http://yp.gates96.com/5/32/0/99.html -http://yp.gates96.com/5/32/1/92.html -http://yp.gates96.com/5/32/1/93.html -http://yp.gates96.com/5/32/3/68.html -http://yp.gates96.com/5/32/4/21.html -http://yp.gates96.com/5/32/4/72.html -http://yp.gates96.com/5/32/5/87.html -http://yp.gates96.com/5/32/6/64.html -http://yp.gates96.com/5/32/7/25.html -http://yp.gates96.com/5/32/7/32.html -http://yp.gates96.com/5/32/7/44.html -http://yp.gates96.com/5/32/7/68.html -http://yp.gates96.com/5/32/7/78.html -http://yp.gates96.com/5/32/8/40.html -http://yp.gates96.com/5/32/8/59.html -http://yp.gates96.com/5/32/8/90.html -http://yp.gates96.com/5/32/8/95.html -http://yp.gates96.com/5/32/9/3.html -http://yp.gates96.com/5/32/9/54.html -http://yp.gates96.com/5/32/9/62.html -http://yp.gates96.com/5/32/9/77.html -http://tucows.soneraplaza.nl/winme/preview/138260.html -http://www.cnnews.com/maya/finance/cjsy/gncj/item/2000_07/206341.shtml -http://212.31.0.37/hur/turk/98/09/23/dunya/02dun.htm -http://212.31.0.37/hur/turk/98/09/12/dunya/01dun.htm -http://ftp.cwi.nl/ftp/mdr/LOCKED/ -http://ftp.cwi.nl/ftp/mdr/PICH/ -http://www.ncte.org/lists/ncte-talk/jan2000/msg02008.html -http://www.russ.ru/forums/prav-dir/conf2/695_r.htm -http://www.doc.ic.ac.uk/lab/labsrc_area/firstyear/submissions/1997-98/jmc1/labs/Ex05/mjp97/?D=A -http://www.affiliate.hpstore.hp.co.uk/do/session/380786/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/search.asp -http://www.flapjack.de/main/2ndHP/jangl43637.htm -http://195.166.55.201/vfg-uk/HTML/P145232.HTM -http://www.greenleaves.com/bookcat/gb_0689826788.html -http://webraft.its.unimelb.edu.au/730452/students/sgm/pub/ -http://ring.omp.ad.jp/pub/NetBSD/packages/pkgsrc/print/teTeX-share/files/ -http://ww.egroups.com/subscribe/wtcjk_purnawirawan -http://167.8.29.14/life/travel/ski/skinj.htm -http://www.nrk.no/finnmark/x26_5_97/fastesid/abonn.htm -http://www.brio.de/BRIO.catalog/39fe2f41050aa9b82741d472aa7806dd/UserTemplate/6 -http://207.25.71.143/golf/news/2000/04/18/heintz/ -http://weekends.worldres.com/script/gen_review.asp?hotel_id=4291&n=1231 -http://www.netitor.com/photos/schools/bc/sport/m-footbl/auto_pdf/weekly-release-082800.pdf -http://www.3w-sciencefiction.de/SmytheRH/SmytheRH0785808744.htm -http://www.zdnet.com/gamespot/stories/screens/0,10865,2617426-32,00.html -http://ftp.lip6.fr/pub2/sgml-tools/website/HOWTO/Root-RAID-HOWTO/t1450.html -http://webusers.siba.fi/doc/texmf/latex/ms/?M=A -http://www.trax.nilex.co.uk/trax.cgi/A1S/1AL/A3L/A1U/A3S/1AS/ -http://www.trax.nilex.co.uk/trax.cgi/A1S/1AL/A3L/A1U/A3S/D1U/ -http://www.trax.nilex.co.uk/trax.cgi/A1S/1AL/A3L/A1U/A3S/D3S/ -http://thaigate.rd.nacsis.ac.jp/ftp/thaisoft/nectec/linux.tle/6.01/Mandrake/?S=D -http://www-ind5.cricket.org/link_to_database/ARCHIVE/2000-01/AUS_LOCAL/GRADE/NSW/SCA/WOMEN/SCA-WOMEN_2000-01_FIXTURES.html -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=abbratend&l=de -http://www.webvillage.org/mBEDJPsite/html/downloadplugins.html -http://www.gov.karelia.ru:8081/gov/Karelia/658/8.html -http://www.private-immobilien-boerse.de/bayern/ingolstadt/Verkauf/GmbH-Kauf-Verkauf-Insolvenz-konkurs/Startseite/Gemeinsam/Inserieren/Gemeinsam/erreichenPartner/Ferien-IB/Startseite/ -http://pillsonline.00go.com/lowfatdiet/lifetime_fitness.htm -http://tecfa2.unige.ch/guides/java/examples/JavaClassLibExamples/io/FileReader/Main.class -http://www.burstnet.com/ads/ad7826a-map.cgi/1933336291 -http://l-infonet.phkk.fi/fi/TIETOPALVELUT/asiasanahaku/Hong%2520Kong/aasia/talous/pika-+ja+perustilastoja/ -http://home.tiscalinet.be/oaseidstad/vonk/optop2000.html -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=19,36,22,32,23 -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=29,36,22,32,23 -http://cn.egroups.com/messages/virtualaccess/194 -http://jerken.grida.no/nor/soeno97/ozone/frames/pressure.htm -http://online.excite.de/erotik/katalog/6213 -http://online.excite.de/erotik/katalog/6187 -http://online.excite.de/erotik/katalog/6221 -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=28,7,35,25,13 -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=31,7,35,25,13 -http://genforum.genealogy.com/cgi-genforum/forums/loughlin.cgi?11 -http://freesoftware.missouri.edu/pub/CPAN/authors/id/J/JS/JSWARTZ/?D=A -http://link.fastpartner.com/do/session/600360/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/fastpartner.php -http://www.jobvillage.com/channel/jobs/sciences/life_sciences/soil_plant_scientist/b.1041.g.251.html -http://ftp.debian.org/dists/Debian2.2r0/non-free/binary-sparc/mail/?D=A -http://generalstore.everdream.com/kore/catalog/Office_Supplies/General_Office_Supplies/Tape_Flags/Arrow/GRP-US6663/product.html -http://www.hig.se/(date,if,set,tablify,user)/~jackson/roxen/ -http://www.hig.se/(date,if,language,set,tablify)/~jackson/roxen/ -http://www.cyber-pages.com/0prog/classifieds_display.cgi?oakland=WEMP=0 -http://202.84.17.6/csnews/articles/141_18691.htm -http://202.84.17.6/csnews/articles/142_18526.htm -http://ftp.dti.ad.jp/pub/FreeBSD/FreeBSD-current/www/es/releases/1.1.5/ -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=9&discrim=247,207,129 -http://ftp.up.pt/Linux/debian/dists/unstable/main/disks-i386/?M=A -http://www.unterhaltungs-cd.de/HillJonny/B000025087.htm -http://filebox.vt.edu/users/aneal/excess/_fpclass/ -http://www.jamba.de/KNet/_KNet-JOt8j1-OEd-139q0/showInfo-presse.de/node.0/cde7f1uou -http://www.tercera.cl/diario/1997/12/05/win.html -http://yp.gates96.com/14/88/20/8.html -http://yp.gates96.com/14/88/20/13.html -http://yp.gates96.com/14/88/22/30.html -http://yp.gates96.com/14/88/25/28.html -http://yp.gates96.com/14/88/25/65.html -http://yp.gates96.com/14/88/26/3.html -http://bsdweb.pasta.cs.uit.no/bsdweb.cgi/~checkout~/pkgsrc/math/grace/pkg/ -http://ftp.tokyonet.ad.jp/pub/Linux/debian-jp/dists/unstable-jp/contrib/binary-m68k/math/?S=A -http://my.dreamwiz.com/piramos/lan.htm -http://pub8.ezboard.com/fselfreliantlivingfrm16.showMessage?topicID=11.topic -http://pub8.ezboard.com/fselfreliantlivingfrm16.showMessage?topicID=4.topic -http://www.affiliate.hpstore.hp.co.uk/do/session/380798/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/SMARTTIPS/vacationcards.asp -http://systemlogic.neoseeker.com/Companies/productportfolios/NEC_Interchannel/?sortby=sections -http://www.houses-apartment-rentals.com/Virginia/city_search_criteria.asp?state=VA&City=DALHART -http://www.wcbcourses.com/wcb2/schools/MERCED/merced/dhauser/2/forums/forum2/messages/17.html -http://www.wcbcourses.com/wcb2/schools/MERCED/merced/dhauser/2/forums/forum2/messages/10.html -http://beautifulsavers.subportal.com/sn/Shell_and_Desktop/Quick_Shutdown_Tools/2702.html -http://polygraph.ircache.net:8181/getting_started/http_-2www.lucent.com/micro/K56flex/http_-2home.netscape.com/comprod/mirror/http_-2www.wtcsf.org/mall/http_-2www.cdnow.com/http_-2www.microsoft.com/msoffice/publicaffairs.html -http://polygraph.ircache.net:8181/getting_started/http_-2www.lucent.com/micro/K56flex/http_-2home.netscape.com/comprod/mirror/http_-2www.wtcsf.org/mall/http_-2www.cdnow.com/http_-2www.microsoft.com/msoffice/videobroadcast/ -http://www.yagoo.co.kr/stats/pitching.asp?Mlbmanid=JESPEN7599 -http://www.4hotfantasy.com/acommon/guests/python4.html -http://boerseninfos.ksk-tut.de/dynamic/ak/adhoc/news/519000-20000316-150811.html -http://boerseninfos.ksk-tut.de/dynamic/ak/adhoc/news/519000-19991025-082814.html -http://cn.yahoo.com/Regional/Countries_and_Regions/China/Provinces__Regions_and_Municipalities/Zhejiang/Cities_and_Towns/Li_Hsua/Business/Companies/Books/ -http://www.affiliate.hpstore.hp.co.uk/do/session/380810/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/FR/REGISTRATION/entry.asp -http://kuyper.calvin.edu/fathers2/NPNF1-01/npnf1-01-12.htm -http://library.bangor.ac.uk/search/dModernism+(Literature)/dmodernism+literature/-5,-1,0,E/2browse -http://aleph.tau.ac.il:4500/ALEPH/ENG/ATA/AAS/AAS/SHORT/410519/1/ -http://pub1.ezboard.com/fflashboard1flashjunkiestalk.showAddReplyScreenFromWeb?topicID=190.topic&index=2 -http://www.inforiese.de/db_cargo/typ_b_files/db_cargo_cargo_ansprechpartner.shtml -http://www.gbnf.com/genealogy/dehart/html/d0005/I985.HTM -http://btclickfam.excite.co.uk/directory/categories/670199 -http://www.worldmedicus.com/servlet/Controller/$7008040516620000.sj_viewc/ -http://www.worldmedicus.com/servlet/Controller/$7008040528250000.sj/ -http://207.25.71.143/features/galleries/then_and_now/belinsky/belinsky01_lg_01.html -http://wiem.onet.pl/wiem/002c66.html -http://www.peopledaily.com.cn/GB/paper40/544/58242.html -http://www.uihealthcare.com////PatientsVisitors/MedMuseum/CenturyOfCaring/UniversityHospitals/05Quarantine.html -http://se.egroups.com/login.cgi?login_target=%2Fmessages%2Fwotccglist%2F333 -http://se.egroups.com/message/wotccglist/334 -http://se.egroups.com/message/wotccglist/350 -http://se.egroups.com/message/wotccglist/358 -http://www.msn.expedia.co.uk/wg/North_America/United_States/P30131.asp -http://www.uol.com.br/cinemaonline/starwars -http://www.perotech.ch/d/securedb/html/listtopic.php?7396 -http://moviestore.zap2it.com/browse/X-FILES/POSTCARD/s.goFzN1Lb -http://zeus.uni-trier.de/~ley/db/indices/a-tree/m/Morgoev:Vladimir_K=.html -http://www.3w-buecher.de/GilliesRobertJ/GilliesRobertJ0122839803.htm -http://www.buybuddy.com/sleuth/27/1/11002/6637/ -http://ftp.uk.debian.org/debian/dists/unstable/contrib/binary-powerpc/oldlibs/?D=A -http://no.egroups.com/login.cgi?login_target=%2Fgroup%2Fwww.members.xoom.com%2FLibertyFlame -http://www.aelita.net/products/support/sitemap/Reg/QuoteRegister/news/company/Copyright.htm -http://www.aelita.net/products/support/sitemap/Reg/QuoteRegister/news/services/default.htm -http://www.amateurplatinum.com/spankingfantasy/fertiletrophy-wife/hot-hardcore-fuckinglongest/red-toenail-polishfeet-fucking-/vietnamesewomen/chinesechi/womenpetite.html -http://www.amateurplatinum.com/spankingfantasy/fertiletrophy-wife/hot-hardcore-fuckinglongest/red-toenail-polishfeet-fucking-/vietnamesewomen/fuckinghard/actionsmacking.html -http://genforum.genealogy.com/cgi-bin/print.cgi?fikes::26.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/lit/programs/unlambda/lit/quizz/music/midi/ -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/lit/programs/unlambda/lit/quizz/computers/callcc.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/lit/programs/unlambda/lit/quizz/misc/colorart/ -http://www.musiciansfriend.com/ex/ds/live/001030182726064208037002434823 -http://www.musiciansfriend.com/ex/ds/home/funzone/001030182726064208037002434823?doc=doc,postcard.html -http://www.musiciansfriend.com/ex/ds/home/platinum/001030182726064208037002434823?g,home.platinum.html -http://www.musiciansfriend.com/ex/ds/home/articles/001030182726064208037002434823?dbase=gw,gwmain.html -http://www.musiciansfriend.com/ex/ds/home/articles/001030182726064208037002434823?dbase=info,privacy.html -http://preview.egroups.com/dir/Business/Training_and_Schools/Management_Training/Consultants?st=4 -http://hammer.prohosting.com/~nieting/html1216/lmtf015.htm -http://planetfreebies.subportal.com/sn/Information_Management/Misc__Information_Databases/12835.html -http://dada.linuxberg.com/kdehtml/adnload/61589_33448.html -http://www.wlu.ca/~wwwregi/95-96/cal/ucourses/GM/GM151.html -http://walkabout.tucows.com/win2k/adnload/61015_28629.html -http://www.1001e.net/02/qbt/09.htm -http://se.egroups.com/post/webfaaa?act=reply&messageNum=3 -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/keats.admin.virginia.edu/asbestos/home.html -http://www.hotelboulevard.com/fr/riviera/standard/htmlf752567459c6d803842381c50e94fd9f/sessionLang/ANG/gettingstarted.html -http://ring.omp.ad.jp/pub/NetBSD/packages/pkgsrc/print/transfig/?N=D -http://citeseer.nj.nec.com/cidcontext/2339336 -http://www.uk.multimap.com/p/browse.cgi?pc=LS287DR -http://topcu.linux.tucows.com/x11html/adnload/46019_3809.html -http://www.mon.de/nr/stuemges -http://www.tamil.net/list/1998-10/msg00212.html -http://retailer.gocollect.com/do/session/1912682/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/terms_and_conditions.asp -http://pl.php.net/manual/nl/function.pfpro-version.php -http://members.tripod.co.jp/millenium/top.html -http://community.webshots.com/photo/4331085/4331572GooaFzYUAJ -http://community.webshots.com/photo/4331085/4331589oKrBmsJbga -http://community.webshots.com/photo/4331085/4331620zgfyMLoSjs -http://www.utdallas.edu/~chansen/text/qabbala9.html -http://www.jobvillage.com/channel/jobs/installation_repair/safety_equipment/fire_alarm/b.2283.g.3516.html -http://www.geocities.com/Area51/Chamber/8750/DoesKitEverTalkAboutTheSubjectOnHand.html -http://www.geocities.com/Area51/Chamber/8750/TheMotherofAllMissleBoats.html -http://www.geocities.com/Area51/Chamber/8750/Tomahawk2.html -http://www.thecitizennews.com/main/archive-000628/thecitizennews/citizen.html -http://links2go.publiweb.com/expert/topic/Mp3_Hardware -http://webhelp.promovacances.net/S02/BL/BEGYP/SAI00512024/cal.htm?d=1013 -http://205.161.150.96/cgi-bin/c2k/title_talent.html&id=143786&title_star=DOMINICK -http://dennou-q.geo.kyushu-u.ac.jp/library/Linux/debian-jp/dists/stable/non-free-jp/binary-all/net/?S=A -http://wow-online.vhm.de/Wirtschaft/Unternehmen/Versicherungen/Versicherungsgesellschaften/Signal_Versicherung.html -http://www.linux.com/networking/network/firewall/web/communications/?kw_offset=50 -http://www.leg.wa.gov/pub/rcw%20-%20text/title_28b/chapter_056/rcw_28b_56_090.txt -http://pub12.ezboard.com/flalaland96545listeningbooth.showMessage?topicID=74.topic -http://www.fogdog.com/cedroID/ssd3040183156032/crs/pw__/wld/fogdog_sports/lee_sport/fan_memorabilia/apparel/new_york_yanke_2000_ameri_leagu_champ_tee_shi.html -http://www.fogdog.com/cedroID/ssd3040183156032/nav/stores/adventure_travel/ -http://www.hoovers.com/travel/cityguide/detailed/0,3368,46_119158,00.html -http://user.chollian.net/~mlsc/ -http://www.158china.com/data/stock/fundowner/default.asp?stck_cd=0548 -http://www.affiliate.hpstore.hp.co.uk/do/session/380803/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/SMARTTIPS/createbroch.asp -http://rcsl.auto.inha.ac.kr/~treeman/Documents/HOWTO/Consultants-HOWTO-3.html -http://www.diogenes.ch/4DACTION/web_rd_aut_prview/a_id=7056427&area=&ID=483330 -http://polygraph.ircache.net:8181/http_-2www.horizonfinance.com/http_-2www.netscape.com/download/http_-2www.microsoft.com/ie/http_-2207.91.150.20/links.html -http://www.multicosm.com/facade/www.adobe.com/support/techguides/printpublishing/scanning/psscanning01b.html -http://yp.gates96.com/0/50/10/62.html -http://yp.gates96.com/0/50/10/95.html -http://yp.gates96.com/0/50/11/1.html -http://yp.gates96.com/0/50/11/18.html -http://yp.gates96.com/0/50/11/49.html -http://yp.gates96.com/0/50/12/55.html -http://yp.gates96.com/0/50/13/48.html -http://yp.gates96.com/0/50/13/96.html -http://yp.gates96.com/0/50/14/15.html -http://yp.gates96.com/0/50/14/73.html -http://yp.gates96.com/0/50/15/50.html -http://yp.gates96.com/0/50/15/80.html -http://yp.gates96.com/0/50/16/1.html -http://yp.gates96.com/0/50/16/8.html -http://yp.gates96.com/0/50/17/50.html -http://yp.gates96.com/0/50/17/71.html -http://yp.gates96.com/0/50/18/25.html -http://yp.gates96.com/0/50/18/73.html -http://yp.gates96.com/0/50/18/82.html -http://yp.gates96.com/0/50/18/84.html -http://yp.gates96.com/0/50/18/90.html -http://cisne.sim.ucm.es/search*spi/dBallets+--+Gran+Bretaña+--+Discos+compactos/dballets+gran+bretan~aa+discos+compactos/-29,-1,0,B/browse -http://opac.lib.ntnu.edu.tw/search*chi/++ftlist/bp20005025/-17,-1,0,B/browse -http://www.trax.nilex.co.uk/trax.cgi/A1S/1AL/A3L/A4R/B1D/A3S/ -http://php.nic.fi/manual/html/function.cpdf-open.html -http://php.nic.fi/manual/html/function.cpdf-fill.html -http://php.nic.fi/manual/html/function.cpdf-setrgbcolor-fill.html -http://www.classiccmp.org/mail-archive/classiccmp/1998-04/1426.html -http://text.csn.ul.ie/~danny/tabs/p/proclaimers/?N=D -http://mirror.nucba.ac.jp/mirror/FreeBSD/branches/3.0-stable/ports/japanese/zangband/?N=D -http://augustachronicle.com/stories/100197/spo_fishing.html -http://www.symatrixinc.com/website/website.nsf/0/3e40df86fb357cd5882568720079613f!OpenDocument&ExpandSection=10,8,9,5 -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/linux/music/quizz/pics.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/linux/music/quizz/lit/ldvelh.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/linux/music/quizz/misc/unitest/ -http://mirror.nucba.ac.jp/mirror/FreeBSD/branches/3.0-stable/ports/japanese/ptex-pkfonts360/?N=D -http://www.2pl.com/b/ru/fi/1/24/06/b1/1240601249-11023.htm -http://galaxy.einet.net/galaxy/Community/United-States/States/Minnesota/Cities-and-Regions/Winona/Education/K--12/Middle/Public.html -http://www.hotelboulevard.com/fr/paris/standard/htmlc866e5cecf73322551f00b0108eb84bc/sessionLang/ANG/prov/browse/cp/75001/resultatSearch.html -http://btp1da.phy.uni-bayreuth.de/ftp/pub/FreeBSD/ports/japanese/dvipsk-vflib/pkg-descr -http://32548news.subportal.com/sn/Utilities/Misc__Encryption_Utilities/ -http://www.hongen.com/proedu/hext/zxks/dxyw/html/dxy62804.htm -http://www.users.globalnet.co.uk/~roy/InternetTree/WC01/WC01_226.htm -http://www2.msstate.edu/~eaddy/famtread/html/nti07339.htm -http://www.trackinfo.com/trakdocs/hound/ca/RESULTS/ARCHIVE/1996/0996/GRCA19S.HTM -http://www.idg.net/crd_essential_110984.html -http://www.zdnet.de//news/artikel/2000/09/06015-wc.html -http://www.secinfo.com/d114Cu.52.htm -http://www.kfi640.com/shared/mod_perl/looksmart/looksmart/eus1/eus141561/eus174865/eus327367/eus327527/eus331435/ -http://enjoy100.com.cn/200005/23/ -http://link.fastpartner.com/do/session/600348/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/mediatransfer.php -http://www.chaos.dk/sexriddle/t/z/p/b/b/ -http://www.brio.de/BRIO.catalog/39fe2f4106ca8ce0273fd472aa7806ff/UserTemplate/6 -http://link.fastpartner.com/do/session/600352/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/robinhus.php -http://link.fastpartner.com/do/session/600352/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/create/index.php -http://www.underground-online.com/companyfinder/filters/products/0,9996,1793-101,00.html -http://mediate.magicbutton.net/do/session/625588/vsid/3342/tid/3342/cid/88020/mid/2008/rid/2313/chid/2648/url/http://www1.getmapping.com/viewer.cfm -http://aol.digitalcity.com/houston/recreation/event.dci?eid=6452 -http://www.linux.com.hk/mirror/ldp/LDP/LG/issue10/lg_bytes10.html -http://www.linux.com.hk/mirror/ldp/LDP/LG/issue10/issue10.txt -http://www.beauty.net.cn/main/japanese/mie.htm -http://www.allgemeine-immobilien-boerse.de/kanada/verkauf/Gemeinsam/Inserieren/Allgemeine-IB/Ferien-IB/Startseite/Private-IB/Startseite/Default.htm -http://www.kodak.co.uk/US/en/corp/store/catalog/Product.jhtml?PRODID=2113&CATID=2234 -http://opac.lib.ntnu.edu.tw/search*chi/f373+017/f373+017/-5,-1,,B/browse -http://ftp.du.se/disk3/mandrake/7.1/Mandrake/mdkinst/etc/pcmcia/?M=A -http://www.teenplatinum.com/barelylegal/anal-sexass/taismall/almond-skinned/{gaylink} -http://194.128.65.4/pa/cm199697/cmhansrd/vo970318/debtext/70318-11.htm -http://netlondon.hotelbook.com/live/photos/19368 -http://www.centc251.org/forums/aca-1/dispatch.cgi/hsi/folderFrame/100205/0/author/1243894 -http://www.teacherformation.org/html/od/facilitators.cfm/task1,login/discussion_id,2/xid,5474/yid,3022999 -http://polygraph.ircache.net:8181/environment_energy/heritage/http_-2www.apache.org/ -http://plat.debian.or.jp/debian/dists/unstable/main/binary-alpha/math/?D=A -http://home.hiwaay.net/~bjacobs/genealogy/laster/html/d0054/g0000038.html -http://www.northampton.ac.uk/cgi-bin/liberation/betsie/betsie.pl/1005/www.northampton.ac.uk/cgi-bin/liberation/betsie/betsie.pl/1037/www.northampton.ac.uk/lrs/Information/refword.html -http://ustlib.ust.hk/search*chi/cPL1275+.F426+1991/cpl+1275+f426+1991/-5,1,1,E/frameset&F=cpl+1273+y36+1982&1,1, -http://stormix.com/en/resources/packages/tex/devel/debmake -http://stormix.com/en/resources/packages/tex/devel/doc++ -http://stormix.com/en/resources/packages/tex/devel/ftnchek -http://stormix.com/en/resources/packages/tex/devel/libnet0-dev -http://stormix.com/en/resources/packages/tex/devel/libobgtk-dev -http://stormix.com/en/resources/packages/tex/devel/netatalk-dev -http://stormix.com/en/resources/packages/tex/devel/pact-base -http://stormix.com/en/resources/packages/tex/devel/scalapack1-mpich -http://members.tripod.co.jp/sugisaka/?M=A -http://www.szinfo.com/book/wai/no/fa/h/hongyuhei/011.htm -http://www.szinfo.com/book/wai/no/fa/h/hongyuhei/054.htm -http://www.centc251.org/forums/aca-1/dispatch.cgi/hsi/listUnseen/fol/100205/20,0/1230074 -http://www.crutchfield.com/cgi-bin/S-p5rPnwuC0SA/Auto.asp -http://www.abb.co.uk/global/seapr/SEAPR035.NSF/viewUNID/f79b6db19a951ce0c125697300319a41!OpenDocument&ExpandSection=6,4,8,5 -http://freebsd.ntu.edu.tw/perl/authors/id/A/AO/AOCINAR/?S=A -http://www.gaymencam.com/elke.html -http://www.linux.com/networking/network/industry/new/web_server/website/ -http://www.tccomputers.com/cgi-bin/bp/1899758621/products/removeabledrives/removeabledrives.htm -http://www.tccomputers.com/cgi-bin/bp/1899758621/store/showcart.html -http://www.highwired.net/Guidance/Section/0,1860,1779-27626,00.html -http://gd.cnread.net/cnread1/net/zpj/r/repinsky/005.htm -http://www.amateurplatinum.com/tubal-ligationmilk/pregnanttubal-ligation/off-the-ragnipples/jizz-dribbling-cumshotscumming/{amateurlink} -http://home.dqt.com.cn/~why/wenzhang/ckpajq/.htm -http://ftp.fi.debian.org/debian/dists/woody/non-free/binary-all/doc/?D=A -http://www.linux.com/networking/network/website/hardware/howto/Linuxcare/ -http://www.linux.com/networking/network/website/hardware/howto/sales/ -http://shn.webmd.com/printing/asset/adam_imagepage_8626 -http://www.geocities.co.jp/Outdoors/2127/bangai_makuyama.html -http://www2.to/souhey -http://www.hotelboulevard.com/fr/paris/standard/html73b90b9d262d517e98c9d779b3b09b7a/sessionLang/ANG/prov/browse/cp/75017/resultatSearch.html -http://perso.wanadoo.fr/olivier.leieber/page22.html -http://www.computer-networking.de/studenten/dv_labor/onlinebuecher/apache/sections.html -http://saejong.pufs.ac.kr/~cilim/homepage/link.html -http://cafe3.daum.net/Cafe-bin/Bbs.cgi/hopepds/qry/zka/B2-kCYFp/qqatt/^ -http://www3.newstimes.com/archive99/jun1899/lch.htm -http://www.7thlevel.com/python/cwot/demo/ -http://www.paidmania.com/getpaid/signup/100/4632 -http://yp.gates96.com/12/14/0/31.html -http://yp.gates96.com/12/14/0/43.html -http://yp.gates96.com/12/14/0/60.html -http://yp.gates96.com/12/14/1/18.html -http://yp.gates96.com/12/14/1/44.html -http://yp.gates96.com/12/14/1/64.html -http://yp.gates96.com/12/14/1/82.html -http://yp.gates96.com/12/14/2/84.html -http://yp.gates96.com/12/14/3/61.html -http://yp.gates96.com/12/14/4/65.html -http://yp.gates96.com/12/14/5/24.html -http://yp.gates96.com/12/14/5/49.html -http://yp.gates96.com/12/14/5/60.html -http://yp.gates96.com/12/14/5/62.html -http://yp.gates96.com/12/14/6/20.html -http://yp.gates96.com/12/14/6/51.html -http://yp.gates96.com/12/14/7/28.html -http://yp.gates96.com/12/14/7/85.html -http://yp.gates96.com/12/14/7/93.html -http://planet.gaiax.com/home/kito/main -http://www.svt.se/falun/packat/program/603/images/1rep/?D=A -http://volunteersolutions.org/swt/volunteer/opp/one_151124_printer_detailed.html -http://fyi.cnn.com/ASIANOW/asiaweek/97/1003/nat1.html -http://www.farhi.org/ps09/ps09_233.htm -http://yp.gates96.com/6/8/30/27.html -http://biz.yahoo.com/apf/000929/tire_death_7.html -http://www.studentadvantage.gamers.com/game/135583 -http://www.studentadvantage.gamers.com/game/45759 -http://yp.gates96.com/6/8/30/44.html -http://yp.gates96.com/6/8/30/50.html -http://yp.gates96.com/6/8/30/72.html -http://yp.gates96.com/6/8/30/86.html -http://yp.gates96.com/6/8/30/89.html -http://yp.gates96.com/6/8/31/78.html -http://yp.gates96.com/6/8/31/88.html -http://yp.gates96.com/6/8/32/3.html -http://yp.gates96.com/6/8/32/24.html -http://yp.gates96.com/6/8/32/34.html -http://yp.gates96.com/6/8/33/14.html -http://yp.gates96.com/6/8/33/42.html -http://yp.gates96.com/6/8/33/75.html -http://yp.gates96.com/6/8/34/32.html -http://yp.gates96.com/6/8/34/97.html -http://yp.gates96.com/6/8/35/53.html -http://yp.gates96.com/6/8/35/98.html -http://yp.gates96.com/6/8/36/74.html -http://yp.gates96.com/6/8/36/99.html -http://yp.gates96.com/6/8/38/92.html -http://yp.gates96.com/6/8/38/97.html -http://yp.gates96.com/6/8/39/45.html -http://yp.gates96.com/6/8/39/69.html -http://tour.stanford.edu/tour/29.0/gMlPb -http://idl.tucows.com/winme/adnload/138396_30343.html -http://idl.tucows.com/winme/adnload/138395_29743.html -http://web.singnet.com.sg/~tay7012i/family.htm -http://www.chaos.dk/sexriddle/p/f/g/j/o/ -http://lcweb2.loc.gov/ll/llnt/070/?S=A -http://lcweb2.loc.gov/ll/llnt/070/0100/ -http://www.crosswinds.net/~lucifern/ -http://pub14.ezboard.com/fblazinofdablazinestdabattledome.subscribeUnregisteredToTopic?topicID=190.topic -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/computers/computers/lit/quizz/programs/unlambda/misc/peanuts.html -http://members.se.tripod.de/svdata/inglis/sida2.htm -http://www.fogdog.com/cedroID/ssd3040183217284/crs/hp/nav/stores/golf/ -http://198.103.152.100/search*frc/tOperations+guide+to+ZIM/toperations+guide+to+zim/-17,-1,0,E/2browse -http://herndon1.sdrdc.com/cgi-bin/com_detail/C00186353 -http://www.j2ee.com/products/javamail/javadocs/javax/mail/Flags.html -http://www.j2ee.com/products/javamail/javadocs/javax/mail/Header.html -http://www.intellicast.com/Sail/World/UnitedStates/FourCorners/Arizona/LakeMeadCanyon/LocalWinds/d1_18/ -http://genforum.genealogy.com/cgi-bin/print.cgi?guill::871.html -http://in.egroups.com/message/ucc-medicine/9 -http://in.egroups.com/message/ucc-medicine/14 -http://www-uk3.cricket.org/link_to_database/PLAYERS/WOMEN/AUS/WILSON_B_02011221/index.NSW-WOMEN.html -http://ftp.du.se/disk4/FreeBSD/FreeBSD-current/www/ja/releases/?M=A -http://www.citythek.de/koeln/eduscho/fsinhalt.htm -http://198.103.152.100/search*frc/cCA1+MPY30+97C31/cca1+mpy30+97c31/-5,-1,,E/browse -http://ftp.nsysu.edu.tw/Linux/RedHat/doc/en/HOWTOS/localization/Serbian/?N=D -http://mk158.tripod.co.jp/old/praga1/do/bio.html -http://oneplace.adbureau.net/accipiter/adclick/site=ONEPLACE/area=INDEX/POSITION=FOOTER/AAMSZ=468x60/ACC_RANDOM=449975866078 -http://members.tripod.co.jp/Primrose/honeydcolumn3.html -http://911codes.com/games/platform/n64/sect/div/cont/list_cheat/spray/y/id/0000009564/gid/0000003291/_cheats/_walkthroughs/_codes/_pc/_n64/_psx/_gameboy/_playstation/ -http://iqseek.shop.goto.com/compperiph/monfol/mon/search/detail.jhtml?MANUF=ViewSonic&MODEL=E790 -http://iqseek.shop.goto.com/compperiph/monfol/mon/search/detail.jhtml?MANUF=ViewSonic&MODEL=GA655 -http://plat.debian.or.jp/debian/dists/stable/main/binary-powerpc/shells/?M=A -http://retailer.gocollect.com/do/session/1912686/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/shipping_policy.asp -http://vvv.geocities.co.jp/Playtown-Yoyo/5287/ -http://vvv.geocities.co.jp/Playtown-Yoyo/5714/ -http://vvv.geocities.co.jp/Playtown-Yoyo/5750/ -http://genforum.genealogy.com/cgi-genforum/forums/charpia.cgi?3 -http://www.amateurplatinum.com/tubal-ligationmilk/plus-sizecoushin-for-the-pushin/best-friendsjail-bait/vietnamese/ac/dclubrication/bisexualelbow-grease.html -http://library.bangor.ac.uk/search/tContemporary+psychology+series/tcontemporary+psychology+series/-17,-1,0,B/2exact&F=tcontemporary+problems+in+geography&1,4 -http://www-d0.fnal.gov/cgi-bin/cvsweb.cgi/calreco/VERSION?only_with_tag=p05-br -http://www.158china.com/news/2000/08/21/52747.htm -http://www.ln.cei.gov.cn/dh/hgjj/wscf/hx/hx031009.txt -http://www.ln.cei.gov.cn/dh/hgjj/wscf/hx/hx031106.txt -http://www.ln.cei.gov.cn/dh/hgjj/wscf/hx/hx031208.txt -http://www.ln.cei.gov.cn/dh/hgjj/wscf/hx/hx031507.txt -http://www.ln.cei.gov.cn/dh/hgjj/wscf/hx/hx032406.txt -http://www.ln.cei.gov.cn/dh/hgjj/wscf/hx/hx032902.txt -http://www.ln.cei.gov.cn/dh/hgjj/wscf/hx/hx041501.txt -http://www.ln.cei.gov.cn/dh/hgjj/wscf/hx/hx041611.txt -http://www.ln.cei.gov.cn/dh/hgjj/wscf/hx/hx1.txt -http://wuarchive.wustl.edu/edu/math/software/multi-platform/SLATEC/G/G2/G2H/G2H2/sbols/ -http://www.loststars.net/story4/ab200-2.html -http://www.indian-express.com/ie/daily/19981219/35350564.html -http://www.indian-express.com/ie/daily/19981219/35351234.html -http://www.homestead.com/jennyb/pets.html -http://www.allgemeine-immobilien-boerse.de/kanada/verkauf/Gemeinsam/Inserieren/Allgemeine-IB/Versteigerungen-IB/Startseite/Gemeinsam/suche.htm -http://www.sankei.co.jp/databox/paper/9808/06/paper/today/sports/soccer/06soc002.htm -http://rex.skyline.net/navigate.cgi?history,collectibles,recreation,sculpture,arts -http://tjohoo.se/sport/snowboard/2.php3 -http://www.du-et.net/prof/n/nkaworu.html -http://www.iwon.com/home/movies/movies_summary_page/0,13160,383543,00.html -http://www.iwon.com/home/movies/movies_summary_page/0,13160,481885,00.html -http://www.iwon.com/home/movies/movies_summary_page/0,13160,372508,00.html -http://pub13.ezboard.com/fvisualbasicexplorergettingstarted.emailToFriend?topicID=861.topic -http://www.fogdog.com/cedroID/ssd3040183158417/customer_service/ -http://www.fogdog.com/cedroID/ssd3040183158417/cgi-bin/CedroCommerce?func=EditBasket -http://www.fogdog.com/cedroID/ssd3040183158417/nav/products/cycling/1y/software/ -http://www.niwl.se/wais/new/28/28189.htm -http://retailer.gocollect.com/do/session/1912674/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/clubhouse/suggestions.asp -http://www.trax.nilex.co.uk/trax.cgi/A1C/A2R/A2U/B3R/A1U/Resign/ -http://www.sofitware.com/books/sci05/0471969664.html -http://www.genome.wustl.edu:8021/gsc1/est/zebrafish_reports/old_rank_reports/zebrafish.rank.990322 -http://www.genome.wustl.edu:8021/gsc1/est/zebrafish_reports/old_rank_reports/zebrafish.rank.991004 -http://www.farhi.org/ps01/ps01_015.htm -http://www-usa10.cricket.org/link_to_database/ARCHIVE/WORLD_CUPS/WC99/STATS/BY_TEAM/SL/WC99_BOWL_BEST_INNS_SR_SL.html -http://www.online.kokusai.co.jp/Stock_corner/V0043480/wrd/G500/stock_corner/stock_corner.html -http://www.online.kokusai.co.jp/Mmf_corner/V0043480/mmf_corner/mmf_corner/url -http://mediate.magicbutton.net/do/session/625604/vsid/4385/tid/4385/cid/88138/mid/1702/rid/2114/chid/3393/url/http://www.worldgallery.co.uk/frameset-cust.html -http://www.malaysia.net/lists/sangkancil/1999-05/frm00449.html -http://www.bigstar.com/contest/index.cfm/4ae093fg371d8ddg3?fa=contest -http://www.bigstar.com/tv/index.cfm/4ae093fg371d8ddg3 -http://linux.tucows.dia.dk/gnomehtml/adnload/49933_5879.html -http://dc.web.aol.com/roanoke/health/directories.dci?type=professionals -http://dc.web.aol.com/roanoke/health/categories.dci?category=fitnessdiet -http://oss.sgi.com/cgi-bin/cvsweb.cgi/linux/drivers/isdn/icn/Makefile?only_with_tag=davem-cvs-merge -http://dennou-h.gfd-dennou.org/arch/cc-env.old/db/?M=A -http://www.envy.nu/wildcats/gare.html -http://www.envy.nu/wildcats/horst.html -http://www.linux.com/networking/network/release/performance/updates/Netscape/ -http://ftpsearch.belnet.be/pub/os/linux/Linux-sunsite.unc/distributions/ultra/Users-Guide/?S=A -http://www.chaos.dk/sexriddle/n/f/p/g/a/ -http://pub24.ezboard.com/fphilosophersstonefrm7.showAddTopicScreenFromWeb -http://pub24.ezboard.com/fphilosophersstonefrm7.showMessage?topicID=10.topic -http://www.yorosiku.net:8080/-_-http://www2.biglobe.ne.jp/~animenet/jan222/note/bbs2.html -http://www.web-chart.com/Detail.htm?s=2568&c=229 -http://www.brio.de/BRIO.catalog/39fe2f5009021d362740d472aa780645/UserTemplate/8 -http://www.service911.com/egghead/step/0,2743,10+55+157+24348+17295_2,00.html -http://home.pchome.com.tw/computer/judy7777/fast-7.htm -http://big5.peopledaily.com.cn/zdxw/11/20000126/200001261111.html -http://www.nhic.or.kr/netbbs/Bbs.cgi/nhic31792/lst/qqo/012D -http://sunsite.org.uk/public/usenet/news-faqs/alt.answers/paranormal/faq -http://newsone.net/nnr/listl/alt.bbs.elebbs/1 -http://ourworld.compuserve.com/homepages/hallg/mg_vor.htm -http://www.world001.com/forum/yue/1573.html -http://www.greenleaves.com/bookcat/gb_1567112730.html -http://quotidiano.monrif.net/chan/motori:1119539:/2000/10/30: -http://quotidiano.monrif.net/chan/motori:926303:/2000/10/30: -http://quotidiano.monrif.net/chan/motori:944719:/2000/10/30: -http://home.online.tj.cn/~madgoe/subtitle/nt/nt363.htm -http://home.online.tj.cn/~madgoe/subtitle/nt/nt352.htm -http://home.online.tj.cn/~madgoe/subtitle/nt/nt343.htm -http://home.online.tj.cn/~madgoe/subtitle/nt/nt327.htm -http://home.online.tj.cn/~madgoe/subtitle/nt/nt320.htm -http://www.collectingnation.com/cgi-bin/bn/request_email.mod?EHANDLE=Vincze -http://www.beanienation.com/cgi-bin/bn/view_feedback.mod?HANDLE=ving -http://www.collectingnation.com/cgi-bin/bn/request_email.mod?EHANDLE=Vinrye -http://www.collectingnation.com/cgi-bin/bn/request_email.mod?EHANDLE=Vinzy -http://www.beanienation.com/cgi-bin/bn/view_feedback.mod?HANDLE=violinist -http://www.beanienation.com/cgi-bin/bn/view_feedback.mod?HANDLE=Violin -http://www.collectingnation.com/cgi-bin/bn/request_email.mod?EHANDLE=vione -http://www.beanienation.com/cgi-bin/bn/view_feedback.mod?HANDLE=viper0669 -http://www.missouri.edu/HyperNews/get/writery/poetry/1.html?embed=-1 -http://www.missouri.edu/HyperNews/get/writery/poetry/6.html?outline=1&embed=1 -http://www.missouri.edu/HyperNews/get/writery/poetry/9.html?outline=-1&embed=1 -http://www.missouri.edu/HyperNews/get/writery/poetry/20.html?outline=3&embed=1 -http://www.missouri.edu/HyperNews/get/writery/poetry/21.html?outline=-1&embed=1 -http://www.missouri.edu/HyperNews/get/writery/poetry/23.html?outline=1&embed=1 -http://www.missouri.edu/HyperNews/get/writery/poetry/38.html?outline=1&embed=1 -http://fi.egroups.com/messages/Avon3DayBoston/5 -http://www.online.kokusai.co.jp/Demo/V0043481/wrd/G400/demo/ -http://www.jamba.de/KNet/_KNet-TQt8j1-PEd-139qr/showInfo-werbung.de/node.0/cde7f1uou -http://computalynx.tucows.com/winnt/adnload/73435_29524.html -http://www.intellicast.com/Golf/World/UnitedStates/Northwest/Oregon/OregonDunes/THUNDERcast/d2_06/ -http://202.105.55.146/h0/news/200009/20/jty7.htm -http://pda.tucows.edisontel.com/newton/newtsfiction_size.html -http://pda.tucows.edisontel.com/newton/adnload/33238_19961.html -http://hem.fyristorg.com/lottaleman/LLfar/1_2942.htm -http://www.norrblom.com/..\hund\1996\s2665496.htm -http://www.ferien-immobilien.de/niedersachsen/weserbergland/Verkauf/Gemeinsam/MarketingStrategie/Allgemeine-IB/Gemeinsam/Super-Zins-Konditionen/Private-IB/Startseite/Default.htm -http://nathanael.upi.jussieu.fr/tele6.nsf/autres+centres+de+formations!OpenPage&ExpandSection=14,18,11,9,15,8 -http://dennou-h.gfd-dennou.org/arch/cc-env.old/xtop/TEBIKI.top.rs590 -http://www.amzn.com/exec/obidos/search-handle-url/index=vhs&field-director=Jim%20Stenstrum/ -http://www.amzn.com/exec/obidos/tg/browse/-/169237/ -http://www.flora.org/flora.oclug/old-6088 -http://www.msn.expedia.co.uk/wg/Images/P24601.htm -http://www.asahi-net.or.jp/~ei2h-kdu/photos/rail/sanin/amarube3.html -http://au.yahoo.com/Business_and_Economy/Shopping_and_Services/Health/Providers/By_Region/U_S__States/Montana/Complete_List/ -http://www.staroriental.net/nav/soeg/ihf,aai,n2,118,Electric+Wave+Girl+1998.html -http://www.hig.se/(accessed,formoutput,referrer,smallcaps,sqlquery)/~jackson/roxen/ -http://carefinder.digitalcity.com/fargond/sports/team.dci?league=NF2&team=VAC -http://carefinder.digitalcity.com/fargond/sports/team.dci?league=NF2&team=GAA -http://carefinder.digitalcity.com/fargond/sports/team.dci?league=NF2&team=AAB -http://carefinder.digitalcity.com/fargond/sports/team.dci?league=NF2&team=AAF -http://newnova.tucows.com/preview/60922.html -http://www-d0.fnal.gov/d0dist/dist/releases/test/l3fsmtcluster/rcp/?S=A -http://www.cs.rit.edu/~ats/inferno/man/html/proto8.htm -http://dandini.cranfield.ac.uk/vl=-39835473/cl=140/nw=1/rpsv/cw/web/nw1/browse.htm -http://homepage.mac.com/nanameneko/job/architecture-oriented/OHP/Why/why_05.html -http://ftp.sunet.se/pub/FreeBSD/FreeBSD-current/ports/games/CaribbeanStud/?M=A -http://ftp.sunet.se/pub/FreeBSD/FreeBSD-current/ports/games/CaribbeanStud/distinfo -http://ads3.zdnet.com/c/g=r734&c=a53975&idx=2000.10.30.21.30.24/www.zdnet.com/downloads/stories/info/0,,000FDG,.html -http://yp.gates96.com/6/57/80/89.html -http://yp.gates96.com/6/57/81/42.html -http://yp.gates96.com/6/57/81/66.html -http://yp.gates96.com/6/57/82/16.html -http://yp.gates96.com/6/57/82/61.html -http://yp.gates96.com/6/57/83/37.html -http://yp.gates96.com/6/57/83/54.html -http://yp.gates96.com/6/57/84/14.html -http://yp.gates96.com/6/57/85/7.html -http://yp.gates96.com/6/57/85/24.html -http://yp.gates96.com/6/57/85/35.html -http://yp.gates96.com/6/57/85/64.html -http://yp.gates96.com/6/57/86/80.html -http://yp.gates96.com/6/57/86/96.html -http://yp.gates96.com/6/57/87/15.html -http://yp.gates96.com/6/57/89/2.html -http://yp.gates96.com/6/57/89/95.html -http://www.oncology.com/v2_MainFrame/1,1614,_12|00332|00_21|002|00_04|0039|00_38|00188,00.html -http://library.bangor.ac.uk/search/aEllis,+Gail/aellis+gail/-5,-1,0,B/exact&F=aellis+griffith+1844+1913&1,9 -http://www.rezel.enst.fr/ftp/linux/distributions/debian/CD-2/debian/dists/unstable/contrib/source/mail/?S=A -http://itcareers.careercast.com/texis/it/itjs/+SwwBmeYKD86e8hwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewhPndhBiwGna5O5BnManDtoDnnGamn5otDamnVncdpaGnwcaBoMnaoDhdGMwBodDaDnBidGAanLpnGonDqnaMFqhTfR20Dzme4twwwpBmex_D86ejxwww5rme6dwwwBrmeZpwww/morelike.html -http://esatnet.tucows.com/winnt/adnload/31316_29136.html -http://home.c2i.net/w-225961/steinare/brosjyre.htm -http://aleph.tau.ac.il:4500/ALEPH/ENG/ATA/AAS/AAS/FIND-ACC/0860271 -http://www.chaos.dk/sexriddle/v/c/w/d/r/ -http://www9.hmv.co.uk:5555/do/session/1347760/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/departments/d135_sd0_pt0.html -http://tagesanzeiger.ch/archiv/99november/991122/79295.HTM -http://www.pacifictech.com.cn/pcsoftware/sj/jq/00803.htm -http://www.pacifictech.com.cn/pcsoftware/sj/jq/00430b.htm -http://www.pacifictech.com.cn/pcsoftware/zl/syjq/dmtgj/old/tuxing/3d/20000131.html -http://www.building.com/communities/texis/db/go/+DexVFdeKmYnwrmwxerJOwrmwx3exmww/profile.html -http://my.egroups.com/message/mathies/43?source=1 -http://www.brio.de/BRIO.catalog/39fe2f5706df064c273fd472aa78067c/UserTemplate/6 -http://www.brio.de/BRIO.catalog/39fe2f5706df064c273fd472aa78067c/UserTemplate/9 -http://www.egroups.com/messages/GollyBeenz/44 -http://www.buybuddy.com/sleuth/15/1/1020507/495848/ -http://www.brio.de/BRIO.catalog/39fe2f41010c308a2742d472aa7806a7/UserTemplate/5 -http://www.ferien-immobilien.de/hessen/bad-hersfeld/Verkauf/IIM-Teil/Startseite/Private-IB/Allgemeine-IB/Gemeinsam/versicherungen/gebaeude/deckungsumfang.htm -http://www.ferien-immobilien.de/hessen/bad-hersfeld/Verkauf/IIM-Teil/Startseite/Private-IB/Allgemeine-IB/Gemeinsam/impressum.htm -http://beetle.marion.ohio-state.edu/Bratt2000/D0029/I10769.html -http://members.tripod.lycos.co.kr/RAINBOR/?D=A -http://www.eos.ncsu.edu/eos/info/bae/bae324_info/ -http://www.chez.com/mousis/vg/aqui/pages/0006.htm -http://search.chollian.net/cgi-bin/filter.cgi?cid=2052&p=1 -http://channel.nytimes.com/1998/03/15/technology/cybertimes/eurobytes/ -http://www4.nas.edu/ohr.nsf/All+Documents/Major+Units?OpenDocument&ExpandSection=13,4,2,7,11 -http://uk.dir.yahoo.com/Regional/Countries/Mexico/States/Baja_California/Cities/Ensenada/Travel_and_Transportation/Accommodation/Caravan_Parks_and_Campgrounds/ -http://ring.toyama-ix.net/archives/mac/info-mac/inet/_Mail/_Eudora/ -http://sport.voila.fr/it/calcio/euro2000/teams/por/squad/nunogomes.html -http://idefix-41.cs.kuleuven.ac.be/~henk/DPS/ -http://library.bangor.ac.uk/search/dLaw+--+Study+and+teaching+--+Great+Britain/dlaw+study+and+teaching+great+britain/-5,-1,0,B/buttonframe&F=dlaw+study+and+teaching+great+britain&7,,7 -http://www.eveclub.com/cgi-bin/eveclub.front/972959440822/Catalog/1000002 -http://www.eveclub.com/cgi-bin/eveclub.front/972959440822/Catalog/1000062 -http://ring.shibaura-it.ac.jp/archives/FreeBSD-PC98/dists/4.0-RELEASE/XF86336/PC98-Servers/?N=D -http://www.uq.edu.au/site-index/index.phtml?site_tree_data=1,91,95,203,338,344,2,6,182,148 -http://www.uq.edu.au/site-index/index.phtml?site_tree_data=1,91,95,203,338,344,2,6,182,163 -http://www.xmission.com/(apocalypse,art,caffiene,geek,misc,music,music,caffiene,art,toys,dots,edge,misc,shopping,ftp,places,privacy,geek,cuseeme,apocalypse,people,stuffiuse,people,places,shopping,stuffiuse,toys)/~bill/links.html -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=confinarias&l=pt -http://www.xmission.com/(apocalypse,art,caffiene,cuseeme,geek,misc,music,music,caffiene,art,toys,dots,edge,misc,shopping,ftp,places,privacy,geek,cuseeme,apocalypse,people,stuffiuse,places,privacy,stuffiuse,toys)/~bill/links.html -http://www.gigclub.co.jp/tanigawa/tanigawa/980915/menu.html -http://www.3w-sciencefiction.de/SmithWilliamK/SmithWilliamK0126528756.htm -http://w3c1.inria.fr/Mobile/posdep/Presentations/Mogid/sld014.htm -http://members.tripod.co.jp/view_i/p.html -http://202.99.23.245/zdxw/11/20000317/200003171117.html -http://www.jpc-music.com/7334085.htm -http://library.bangor.ac.uk/search/aLibrary+Association/alibrary+association/-5,-1,0,B/buttonframe&F=alibrary+association&2,,64 -http://www.sf.digitalcity.com/puntagordafl/sports/team.dci?league=FSL&team=CHA -http://www.sf.digitalcity.com/puntagordafl/sports/team.dci?league=FSL&team=LAK -http://brain.brent.gov.uk/__802564ff0045d739.nsf/vWebAllPagesByLocsSrvd!OpenView&Start=33&Count=60&Collapse=45 -http://www.nypost.com/news/933.htm -http://www.nypost.com/business/979.htm -http://www.nypost.com/living/951.htm -http://www.computer-networking.de/studenten/cn_intern/bauer/jobst/k07-graphik-gui/controls/swing/ -http://194.55.30.33/albanian/tema_gjermane/67823.html -http://194.55.30.33/albanian/tema_gjermane/65962.html -http://yp.gates96.com/14/85/10/12.html -http://yp.gates96.com/14/85/11/98.html -http://yp.gates96.com/14/85/12/24.html -http://yp.gates96.com/14/85/13/57.html -http://yp.gates96.com/14/85/14/92.html -http://yp.gates96.com/14/85/16/37.html -http://yp.gates96.com/14/85/16/51.html -http://yp.gates96.com/14/85/16/78.html -http://yp.gates96.com/14/85/17/38.html -http://yp.gates96.com/14/85/17/48.html -http://yp.gates96.com/14/85/17/91.html -http://yp.gates96.com/14/85/19/35.html -http://yp.gates96.com/14/85/19/88.html -http://genforum.genealogy.com/cgi-genforum/forums/deppen.cgi?3 -http://www.ferien-immobilien.de/nordrhein-Westfalen/Muehlheim-ruhr/Verkauf/Private-IB/Startseite/Gemeinsam/Inserieren/Versteigerungen-IB/Startseite/Ferien-IB/Startseite/ -http://www.redrocksports.com/sports/webSession/shopper/RR972959668-31057/store/dept-5/department/dept-5/item/51800 -http://www.redrocksports.com/sports/webSession/shopper/RR972959668-31057/store/dept-5/department/dept-5/item/53510 -http://www.redrocksports.com/sports/webSession/shopper/RR972959668-31057/store/dept-5/department/dept-5/item/52600 -http://www.redrocksports.com/sports/webSession/shopper/RR972959668-31057/store/dept-5/department/dept-5/item/50510 -http://www.redrocksports.com/sports/webSession/shopper/RR972959668-31057/store/dept-5/department/dept-5/item/50400 -http://polygraph.ircache.net:8181/http_-2www.horizonfinance.com/http_-2www.netscape.com/download/http_-2www.microsoft.com/ie/http_-2207.91.150.20/http_-2www.updowntowner.org/julyjamm/headliners.html -http://www.ccurrents.com/magazine/national/1702/nets31702.html -http://adept.subportal.com/sn/Themes/Vehicle_Themes/5090.html -http://www.fogdog.com/cedroID/ssd3040183211390/nav/products/outlet/1a/fishing/ -http://www.linux.com/networking/network/communications/article/unix/sales/ -http://fyi.cnn.com/content/US/9902/25/germans.death.penalty.ap/ -http://fyi.cnn.com/US/9902/09/monk.execute.ap.02/ -http://fyi.cnn.com/WORLD/asiapcf/9902/06/PM-Philippines-DeathPena.ap/ -http://pub11.ezboard.com/ucivik.showPublicProfile -http://playboy.software.net/PKIN005896/prod.htm -http://www.linux.com/networking/network/help/free/performance/install/ -http://www.linux.com/networking/network/help/free/performance/X/ -http://se.egroups.com/message/ghost_tales/1490 -http://niteowl.userfriendly.net/linux/RPM/rawhide/1.0/i386/usr_src_linux-2.4.0_include_Tree.html -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=coexistissem&l=pt -http://promed.univ-rennes1.fr/cerf/ico_an/IDRE/21_HADM.HTM -http://promed.univ-rennes1.fr/cerf/ico_an/IDRE/25_HADM.HTM -http://promed.univ-rennes1.fr/cerf/ico_an/IDRE/86_HADM.HTM -http://promed.univ-rennes1.fr/cerf/ico_an/IDRE/88_HADM.HTM -http://promed.univ-rennes1.fr/cerf/ico_an/IDRE/90_HADM.HTM -http://promed.univ-rennes1.fr/cerf/ico_an/IDRE/HADM6.HTM -http://www.estrelladigital.es/000814/articulos/economia/correos.htm -http://itcareers.careercast.com/texis/it/itjs/+awwBme4CD86LxwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewPPnBwpcnaqdGpdGwBnaoDhdGMwBodDahoDma5BdGnaq15BdMnGa5nGVoqnaqdDBwqBamo5BGox1BodDaMwDwtnMnDBaMFqrIRE7P0IDzme_xwwwpBmHe0B-deaqwww5rmsmwwBrme7Dwww/morelike.html -http://yp.gates96.com/3/79/50/30.html -http://yp.gates96.com/3/79/50/54.html -http://yp.gates96.com/3/79/51/1.html -http://yp.gates96.com/3/79/51/11.html -http://yp.gates96.com/3/79/51/80.html -http://yp.gates96.com/3/79/52/27.html -http://yp.gates96.com/3/79/52/81.html -http://yp.gates96.com/3/79/53/81.html -http://yp.gates96.com/3/79/54/0.html -http://yp.gates96.com/3/79/54/31.html -http://yp.gates96.com/3/79/55/74.html -http://yp.gates96.com/3/79/55/78.html -http://yp.gates96.com/3/79/56/72.html -http://yp.gates96.com/3/79/57/0.html -http://yp.gates96.com/3/79/58/27.html -http://yp.gates96.com/3/79/58/31.html -http://yp.gates96.com/3/79/58/48.html -http://yp.gates96.com/3/79/58/76.html -http://yp.gates96.com/3/79/58/99.html -http://yp.gates96.com/3/79/59/27.html -http://yp.gates96.com/3/79/59/32.html -http://yp.gates96.com/3/79/59/49.html -http://yp.gates96.com/3/79/59/81.html -http://yp.gates96.com/3/79/59/83.html -http://startribune.atevo.com/misc/print_article/0,3869,4504302,00.html -http://browse.carnaby.com/home/showcase/6/381/2078/A0638120780000EA01.html -http://www.checkout.com/music/earmail/form/1,7650,325272-1761567,00.html -http://ring.shibaura-it.ac.jp/archives/doc/jpnic/minutes/committee/200007/shiryou-4-1.txt -http://www.secinfo.com/d1ZMQs.51h.htm -http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/AtlantisPBEM/CVSROOT/modules?only_with_tag=MAIN -http://cvs.sourceforge.net/cgi-bin/cvsweb.cgi/AtlantisPBEM/CVSROOT/modules?only_with_tag=HEAD -http://ftp.bitcon.no/tucows/adnload/4961_28325.html -http://yp.gates96.com/3/37/0/21.html -http://yp.gates96.com/3/37/0/29.html -http://yp.gates96.com/3/37/0/80.html -http://yp.gates96.com/3/37/0/87.html -http://yp.gates96.com/3/37/1/9.html -http://yp.gates96.com/3/37/2/83.html -http://yp.gates96.com/3/37/2/92.html -http://yp.gates96.com/3/37/3/26.html -http://yp.gates96.com/3/37/4/9.html -http://yp.gates96.com/3/37/4/29.html -http://yp.gates96.com/3/37/5/31.html -http://yp.gates96.com/3/37/5/49.html -http://yp.gates96.com/3/37/5/51.html -http://yp.gates96.com/3/37/5/63.html -http://yp.gates96.com/3/37/5/95.html -http://yp.gates96.com/3/37/6/0.html -http://yp.gates96.com/3/37/6/4.html -http://yp.gates96.com/3/37/7/22.html -http://yp.gates96.com/3/37/8/10.html -http://yp.gates96.com/3/37/8/50.html -http://yp.gates96.com/3/37/8/92.html -http://yp.gates96.com/3/37/9/46.html -http://ftp.digex.net/debian/dists/woody/contrib/binary-sh/libs/?N=D -http://students.lsu.edu/students/main.nsf/c81d2bf8cb0b80ff862566fb00105ab2/7f3436ae9cb1268886256773006f9288!OpenDocument&ExpandSection=4,15,12,16 -http://in.egroups.com/group/bbw-uk -http://home.swipnet.se/~w-20817/ -http://shop.puretec.de/kunden/19867293/detailansicht_Aku1025B.html -http://www.rezeptkoch.de/Rezepte/Heimisches_/Gemuse/Sommerliche_Gemusegerichte/sommerliche_gemusegerichte_2.html -http://www.rezeptkoch.de/Rezepte/Heimisches_/Gemuse/Kohl/kohl_4.html -http://www.rezeptkoch.de/Rezepte/Heimisches_/Gemuse/Kohl/kohl_11.html -http://www.chinainvest.com.cn/C/Showdetail/20359.html -http://tucows.sp-plus.nl/winme/preview/141310.html -http://www.al-hujjat.grid9.net/gnomehtml/ent_enhance_rating.html -http://www.warmbloods.net/breeding/_vti_bin/shtml.dll/disc123_post.htm?1260 -http://ftp.sunet.se/pub/FreeBSD/FreeBSD-current/ports/net/ruby-snmp/Makefile -http://basil.cs.uwp.edu/Documentation/java/jdk/docs/guide/sound/prog_guide/chapter3.fm.html -http://tucows.1web.it/winme/preview/75525.html -http://uk-wire.ukinvest.com/articles/200009180701200586R.html -http://www.ozon.ru/detail.cfm/ent=33&id=953&add2navigator=1&txt=1 -http://cometweb01.comet.co.uk/do!session=131984&vsid=700&tid=20&cid=37030&mid=1000&rid=1060&chid=1713&url=eqqLmwlGltt5tkkHbqpLZXmLbkZHljlKaltLkilLXalKfkaLbukKeqjLi1 -http://community.webshots.com/photo/3922869/3923445TSuTSQIWpD -http://www.eveclub.com/cgi-bin/eveclub.front/972959447434/Catalog/1000040 -http://www.tvstore.com/browse/TV/NIGHTSHI/s.nXZNPRgQ -http://www.tvstore.com/browse/TV/COMIC/s.nXZNPRgQ -http://www.xmwb.sh.cn/xmwb/19981016/GB/13389^8101623.htm -http://helios.nlib.ee/search*est/tThe+threshold+series/tthreshold+series/-5,-1,0,B/frameset&F=tthrillers&1,1 -http://www4.nas.edu/ohr.nsf/All+Documents/Major+Units?OpenDocument&ExpandSection=23,9,7,18 -http://ftp.bitcon.no/pub/windowsce/epoc/desktop5.htm -http://ftp.lip6.fr/pub2/sgml-tools/website/HOWTO/Multicast-HOWTO/t1595.html -http://ftp.rge.com/pub/X/XFree86/3.3.3.1/untarred/xc/programs/Xserver/ -http://ftp.rge.com/pub/X/XFree86/3.3.3.1/untarred/xc/programs/xwud/ -http://syix.tucows.com/win2k/adnload/73370_29328.html -http://yp.gates96.com/0/54/80/40.html -http://yp.gates96.com/0/54/80/56.html -http://yp.gates96.com/0/54/80/61.html -http://yp.gates96.com/0/54/80/79.html -http://yp.gates96.com/0/54/81/11.html -http://yp.gates96.com/0/54/81/25.html -http://yp.gates96.com/0/54/81/58.html -http://yp.gates96.com/0/54/82/48.html -http://yp.gates96.com/0/54/82/75.html -http://yp.gates96.com/0/54/83/0.html -http://yp.gates96.com/0/54/84/12.html -http://yp.gates96.com/0/54/84/67.html -http://yp.gates96.com/0/54/85/47.html -http://yp.gates96.com/0/54/85/59.html -http://yp.gates96.com/0/54/86/52.html -http://yp.gates96.com/0/54/86/55.html -http://yp.gates96.com/0/54/86/79.html -http://yp.gates96.com/0/54/86/87.html -http://yp.gates96.com/0/54/87/12.html -http://yp.gates96.com/0/54/87/81.html -http://yp.gates96.com/0/54/88/97.html -http://yp.gates96.com/0/54/89/90.html -http://www.yorosiku.net:8080/-_-http://liinwww.ira.uka.de/bibliography/Distributed/SIGCOMM.94.html -http://news.pchome.com.tw/ftv/health/20000915/ -http://www.emis.de/journals/EJDE/Volumes/Volumes/Monographs/1998/05/?N=D -http://travelocity-dest.excite.com/DestGuides/0,1840,TRAVELOCITY|5706|3|1|159040|photo_id|4022,00.html -http://travelocity-dest.excite.com/DestGuides/0,1840,TRAVELOCITY|5706|3|1|159040|photo_id|4020,00.html -http://lhcbsoft.web.cern.ch/LHCbSoft/simmuon/v1/mgr/CVS/Root -http://tucows.soneraplaza.nl/winme/adnload/137454_28942.html -http://www.borland.nl/techpubs/jbuilder/jbuilder3/ui/wclass.html -http://fi.egroups.com/links/dssf -http://www.homestead.com/jcv2000/MBoard.html -http://careershop.resumeshotgun.com/directory/italy/sardegna/o.10.p.4408.html -http://www.hantsnet.co.uk/istcclr/cch32751.html -http://www.hantsnet.co.uk/istcclr/cch16729.html -http://www.hantsnet.co.uk/istcclr/cch03788.html -http://www.hantsnet.co.uk/istcclr/cch05491.html -http://www.hantsnet.co.uk/istcclr/cchr0418.html -http://www.hantsnet.co.uk/istcclr/cchh2289.html -http://www.hantsnet.co.uk/istcclr/cchh2074.html -http://www.hantsnet.co.uk/istcclr/cch30426.html -http://www.hantsnet.co.uk/istcclr/cch11726.html -http://www.hantsnet.co.uk/istcclr/cch03858.html -http://www.hantsnet.co.uk/istcclr/cche0920.html -http://www.hantsnet.co.uk/istcclr/cch34768.html -http://www.hantsnet.co.uk/istcclr/cchc2067.html -http://www.hantsnet.co.uk/istcclr/cche1085.html -http://www.v2music.com/Scripts/WebObjects-ISAPI.dll/V2_New_Publisher.woa/53771000000443000000339400000065451/v2tvindex.wo/614720000055451/1.14/3/Webobjects1 -http://www.sternonline.de/magazin/fotogalerie/hinz/index5.html -http://www.envy.nu/Sing.html -http://employment.subportal.com/sn/Themes/ -http://www.diogenes.ch/4DACTION/web_rd_aut_prview/a_id=7002120&area=&ID=483332 -http://wlink.tucows.com/winme/adnload/137847_29260.html -http://tucows.computalynx.net/winnt/adnload/71633_28766.html -http://ftp.up.pt/Linux/debian/dists/stable/main/disks-m68k/?M=A -http://lcweb2.loc.gov/ll/llnt/009/0000/ -http://www.magma.ca/~denisd/africa/day02.html -http://www.magma.ca/~denisd/africa/day16.html -http://content.health.msn.com/message_board_author/802072 -http://ep.com/js/about/c0/189455 -http://ep.com/js/about/c0/154005 -http://www.realbig.com/miata/miata/1999-12/2340.html -http://www.multimap.com/wi/33738.htm -http://www.multimap.com/wi/148724.htm -http://www.bemi-immobilien.de/Landhaus-Bordeaux/Gemeinsam/3d-service/Gemeinsam/versicherungen/lebensversicherung/Startseite/www.ferien-immobilien.de/ferien-ib/startseite/Gemeinsam/versicherungen/lebensversicherung/Gemeinsam/MarketingStrategie/Strategie.htm -http://link.fastpartner.com/do/session/600347/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/create/learn.htm -http://pub16.ezboard.com/fisnforumsfrm16.subscribeUnregisteredToTopic?topicID=731.topic -http://freesoftware.subportal.com/sn/Business/Application_Add-ins/726.html -http://people.freebsd.org/~knu/cgi-bin/cvsweb.cgi/ports/deskutils/genius/files/?sortby=date -http://www.madein.nnov.ru/stat/index.phtml?cid=418&t=3 -http://citeseer.nj.nec.com/correct/294145 -http://www.phillips.semiconductors.com/pip/PCF5001H -http://www.tvstore.com/browse/TV/BANK/s.Vaphccqs -http://www.tvstore.com/browse/TV/SCRIPT/s.Vaphccqs -http://www.tvstore.com/aboutus/s.Vaphccqs -http://www.fogdog.com/cedroID/ssd3040183205929/nav/products/featured_brands/3b/arm_warmers/ -http://orders.mkn.co.uk/bear/steiff/classic/order/now.en$NOK?what-e=1 -http://www.crutchfield.com/S-jtpRS1P7vRY/help/ -http://www06.u-page.so-net.ne.jp/tb3/y-miyu/azure/kodatour.htm -http://ftp.sunet.se/pub/FreeBSD/ports/ports-stable/japanese/escpf/distinfo -http://no.egroups.com/subscribe/Theater_plays -http://www.equipe.fr/Football/FootballFicheJoueur8954_0.html -http://www.equipe.fr/Football/FootballFicheJoueur6039_0.html -http://www.pmdc.org.uk/dogsdb/p00/P00133.HTM -http://ip.tosp.co.jp/i.asp?i=nononatti3 -http://tucows.wlink.com.np/adnload/144221_48889.html -http://store.yahoo.co.jp/I/naturum_1590_147867488 -http://providenet.office.tucows.com/adnload/77414_41755.html -http://providenet.office.tucows.com/adnload/73011_41097.html -http://www.goldersgreen.londonengland.co.uk/medicalequipmentrentalandleasing.htm -http://www.online.kokusai.co.jp/Mmf_corner/V0043462/mmf_corner/mmf_corner/url -http://www.qth.net/archive/packrats/200008/20000804.html -http://www.expage.com/buffykat11nelly -http://dk.egroups.com/login.cgi?login_target=%2Fmessages%2Fbbs_people -http://dk.egroups.com/message/bbs_people/23 -http://www.linux.com/networking/network/technology/free/development/learning/ -http://www.chaos.dk/sexriddle/r/x/z/t/l/ -http://www.opensecrets.org/lobbyists/98profiles/5918.htm -http://www.cbs.sportsline.com/u/football/nfl/kids/players/3418.htm -http://www.cbs.sportsline.com/u/football/nfl/kids/players/3868.htm -http://www.cbs.sportsline.com/u/football/nfl/kids/players/133268.htm -http://www.hig.se/(apre,clientname,countdown,language,set_cookie)/~jackson/roxen/ -http://www.platogmbh.de/plato/home.nsf/c81870434660ba41c125652a0029a47a/fb7566ed772f8580c12566f00036ac59!OpenDocument&ExpandSection=4,8,11,12 -http://www.fogdog.com/cedroID/ssd3040183211315/nav/products/featured_brands/2m/kick_sprint_boards/ -http://www.iabusnet.org:90/forums/aca-1/dispatch.exe/survey/folderFrame/100001/0/alpha/2458960 -http://www.jamba.de/KNet/_KNet-ONt8j1-NEd-139p9/showInfo-jobs.de/node.0/cde7f1uou -http://www.jamba.de/KNet/_KNet-ONt8j1-NEd-139pf/browse.de/node.0/cdzqggtyb -http://iland.tucows.com/win2k/adnload/38318_29882.html -http://builder.hw.net/frmRestDir/0,1112,'1~21~325~1~S~020060~04880',00.html -http://builder.hw.net/frmRestDir/0,1112,'1~21~325~1~S~020060~35840',00.html -http://builder.hw.net/frmRestDir/0,1112,'1~21~325~1~S~020060~90237',00.html -http://sunsite.org.uk/public/usenet/news.answers/alt.answers/self-impr-faq/part1 -http://ftp.bitcon.no/pub/simtelnet/win95/fileutl/?S=A -http://totalsports.aol.com/stats/bbo/mlb/20000517/bal.at.ana.game.html -http://au.yahoo.com/Regional/U_S__States/Virginia/Counties_and_Regions/Henrico_County/Business_and_Shopping/Shopping_and_Services/Travel/ -http://ftp.up.pt/Linux/debian/dists/unstable/main/binary-all/math/ -http://students.lsu.edu/students/main.nsf/c81d2bf8cb0b80ff862566fb00105ab2/7f3436ae9cb1268886256773006f9288!OpenDocument&ExpandSection=10,17,13,14 -http://ftp.sunet.se/pub/FreeBSD/ports/ports-stable/japanese/vfghostscript/Makefile -http://polygraph.ircache.net:8181/yp/User_Contribs/http_-2home.netscape.com/comprod/mirror/ -http://www.emis.de/journals/EJDE/Volumes/Monographs/Volumes/1998/26/?S=A -http://www.smartshop.com/cgi-bin/main.cgi?c=314&a=contactus -http://213.36.119.69/do/session/152986/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/BE_NL/ -http://www.outdoorwire.com/lists/dirt/200009/msg01273.html -http://chicagocow.com/top/1,1419,M-Metromix-Home-Carryout!InputReview-9757--0,00.html -http://www.lithoquoter.com/Scripts/WebObjects.exe/Printers.woa/659920000022582000008720100000129302/main.wo/9193100000029302/4/-/prime -http://groups.haas.berkeley.edu/hcs/Docs/SASv8/sasdoc/sashtml/proc/z0292493.htm -http://groups.haas.berkeley.edu/hcs/Docs/SASv8/sasdoc/sashtml/proc/z0292495.htm -http://groups.haas.berkeley.edu/hcs/Docs/SASv8/sasdoc/sashtml/proc/z0292496.htm -http://www.outpersonals.com/cgi-bin/w3com/pws/out/jlhIVflnBPgWmpC4eFAjXlk3QXcFhcK-b9D_cbZyHLtTP5aigpMrgot7TKiIhNzg8y23_mmQAn7GVTQsvALIGIvJI8RFNXRZDuyGCzJ8JFs6ysbZfjgM3ik0nyIt5yhT_ujQhRI-42lzAOeb666j -http://www.nissan.co.jp/RENAULT-DEALERS/PASSPORT/view.cgi/admission/972959588-- -http://www.intellicast.com/Golf/World/UnitedStates/MidAtlantic/Virginia/RoyalNewKentGC/LocalWinds/d1_12/ -http://gbchinese.yahoo.com/headlines/001028/sports/ycwb/ycba28c003txttyxw00102800.html -http://gbchinese.yahoo.com/headlines/001028/sports/ycwb/ycba28c004txttyxw00102800.html -http://mx.php.net/manual/hu/language.references.unset.php -http://www.cbtravelguide.com/north_america/united_states/info_2.htm?sortby=city -http://www.intellicast.com/Sail/World/UnitedStates/Northwest/Idaho/Targhee/LocalWinds/d1_03/ -http://ftp.sunet.se/pub/FreeBSD/ports/ports-current/devel/libgii/distinfo -http://biblioteca.upv.es/bib/doc/doc_fisbd/816/149599//C/1826373/0////25/S/MLTPAI -http://willsmith.sonicnet.com/events/jay_z/index_sonicnet.jhtml -http://tucows.soneraplaza.nl/winme/tucowsme_license.html -http://people.freebsd.org/~knu/cgi-bin/cvsweb.cgi/src/usr.sbin/fdcontrol/Makefile?only_with_tag=MAIN -http://www.kurit.com/ip/a5iu/dungeon/showsw1.html -http://www.mapion.co.jp/custom/AOL/admi/13/13118/minamisenju/3chome/index-30.html -http://yp.gates96.com/3/2/10/4.html -http://yp.gates96.com/3/2/10/19.html -http://yp.gates96.com/3/2/10/48.html -http://yp.gates96.com/3/2/10/52.html -http://yp.gates96.com/3/2/10/82.html -http://yp.gates96.com/3/2/11/10.html -http://yp.gates96.com/3/2/11/13.html -http://yp.gates96.com/3/2/13/31.html -http://yp.gates96.com/3/2/13/41.html -http://yp.gates96.com/3/2/13/43.html -http://yp.gates96.com/3/2/14/3.html -http://yp.gates96.com/3/2/14/19.html -http://yp.gates96.com/3/2/15/54.html -http://yp.gates96.com/3/2/15/72.html -http://yp.gates96.com/3/2/16/84.html -http://yp.gates96.com/3/2/17/22.html -http://yp.gates96.com/3/2/17/61.html -http://yp.gates96.com/3/2/18/1.html -http://yp.gates96.com/3/2/18/41.html -http://yp.gates96.com/3/2/18/58.html -http://yp.gates96.com/3/2/19/56.html -http://yp.gates96.com/3/2/19/79.html -http://www.stas.net/lonlywtrsoul/minesweeper/ms.html -http://ksu.freeyellow.com/ -http://www.genome.wustl.edu:8021/gsc10/est/yt/yt69/ -http://www.genome.wustl.edu:8021/gsc10/est/yt/yt82/ -http://www.winsite.com/info/pc/win95/miscutil/cutty10.exe/downltop.html -http://habenix.uni-muenster.de/Rektorat/Forschungsberichte-1997-1998/fo05bbe03.htm -http://www.jobvillage.com/channel/jobs/installation_repair/bicycle/g.3370.html -http://www.mordkommission.de/ratgeber/praxis/service/broschueren/40504/ -http://www.aelita.net/products/news/solutions/sitemap/company/library/default.htm -http://www.beanienation.com/cgi-bin/bn/view_feedback.mod?HANDLE=acejet -http://cgi1.washingtonpost.com/wp-dyn/metro/va/alexandria/ -http://www.linux.com/networking/network/applications/interface/linux/distro/ -http://www2.brent.gov.uk/bv1nsf.nsf/031d5c68638196618025664000760871/963fe55ca97ccaa5802568f900503269!OpenDocument&Start=57.3&Count=60&Expand=69 -http://www2.brent.gov.uk/bv1nsf.nsf/031d5c68638196618025664000760871/963fe55ca97ccaa5802568f900503269!OpenDocument&Start=57.3&Count=60&Expand=72 -http://www2.brent.gov.uk/bv1nsf.nsf/031d5c68638196618025664000760871/963fe55ca97ccaa5802568f900503269!OpenDocument&Start=57.3&Count=60&Expand=87 -http://genforum.genealogy.com/cgi-genforum/forums/youngs.cgi?26 -http://www.tvstore.com/browse/TV/CAP/s.IRspZRIy -http://210.178.135.1/netbbs/Bbs.cgi/nhic30592/qry/zka/B2-kB2-p/pno/0/qqo/012A/qqatt/^ -http://home.sol.no/~leskjerv/aner/12063.htm -http://pub6.ezboard.com/fwatckkeepersgeneralwatchkeeperdiscussion?page=5 -http://www.centc251.org/forums/aca-1/dispatch.cgi/hsi/folderFrame/100217/0/def/1210456 -http://ftp.sunet.se/pub/FreeBSD/ports/ports-stable/games/xosmulti/?S=A -http://opac.lib.rpi.edu/search/ddata+processing+english+language+style/7,-1,0,B/browse -http://yp.gates96.com/7/40/0/5.html -http://yp.gates96.com/7/40/0/33.html -http://yp.gates96.com/7/40/1/27.html -http://yp.gates96.com/7/40/3/25.html -http://yp.gates96.com/7/40/3/36.html -http://yp.gates96.com/7/40/4/67.html -http://yp.gates96.com/7/40/4/77.html -http://yp.gates96.com/7/40/6/28.html -http://yp.gates96.com/7/40/6/49.html -http://yp.gates96.com/7/40/6/89.html -http://yp.gates96.com/7/40/7/21.html -http://yp.gates96.com/7/40/9/24.html -http://indonesian.wunderground.com/geo/GizmoTempBigPromo/global/stations/07434.html -http://www.teenplatinum.com/barelylegal/anal-sexass/legsred-toenail-polish/swallowspit/submissiondiscipline/maledomspanking/hardcorebondage.html -http://cgi.cnnsi.com/basketball/college/women/scoreboards/aeast/2000/10/18/ -http://cgi.cnnsi.com/basketball/college/women/scoreboards/aeast/2000/10/16/ -http://bellona.itworld.com:8080/cwi/Printer_Friendly_Version/frame/0,1212,NAV63-128-1357-1367_STO48482-,00.html -http://cdrwww.who.int/fsf/ehec.pdf -http://tw.yahoo.com/Regional/Countries_and_Regions/China/Provinces__Regions_and_Municipalities/Jiangxi/Cities_and_Towns/Nanchang/Real_Estate/ -http://tw.yahoo.com/Regional/Countries_and_Regions/China/Provinces__Regions_and_Municipalities/Jiangxi/Cities_and_Towns/Nanchang/Society_and_Culture/ -http://www.camden-industrial.com/supply/webSession/shopper/CI972959657-31048/store/dept-8 -http://www.msb.malmo.se/search*swe/mQdfm/mqdfm/-5,-1,0,E/2browse -http://tagesanzeiger.ch/archiv/96september/960903/213235.htm -http://yp.gates96.com/3/7/20/3.html -http://yp.gates96.com/3/7/20/28.html -http://yp.gates96.com/3/7/20/42.html -http://yp.gates96.com/3/7/21/5.html -http://yp.gates96.com/3/7/21/61.html -http://yp.gates96.com/3/7/22/18.html -http://yp.gates96.com/3/7/22/20.html -http://yp.gates96.com/3/7/22/24.html -http://yp.gates96.com/3/7/23/33.html -http://yp.gates96.com/3/7/23/49.html -http://yp.gates96.com/3/7/23/57.html -http://yp.gates96.com/3/7/24/22.html -http://yp.gates96.com/3/7/24/23.html -http://yp.gates96.com/3/7/24/27.html -http://yp.gates96.com/3/7/24/36.html -http://yp.gates96.com/3/7/24/45.html -http://yp.gates96.com/3/7/25/98.html -http://yp.gates96.com/3/7/26/56.html -http://yp.gates96.com/3/7/26/77.html -http://yp.gates96.com/3/7/26/94.html -http://yp.gates96.com/3/7/27/10.html -http://yp.gates96.com/3/7/27/17.html -http://yp.gates96.com/3/7/27/61.html -http://yp.gates96.com/3/7/27/73.html -http://yp.gates96.com/3/7/27/81.html -http://yp.gates96.com/3/7/27/82.html -http://yp.gates96.com/3/7/27/87.html -http://yp.gates96.com/3/7/28/48.html -http://yp.gates96.com/3/7/29/1.html -http://yp.gates96.com/3/7/29/8.html -http://yp.gates96.com/3/7/29/32.html -http://www.crit.org/http://www-mel.nrlmry.navy.mil/%ff:words:(MEL-is-a-sponsored-distributed-environmental-data-access-system-which-allows-users-to-search-for-browse-and-retrieve-environmental-data-from-distributed-sources) -http://www.crit.org/http://crit.org/pub/radiks.net/jwoods/%ff:words:jwoods-radiks-net-(A-More-Graceful-Transition)-An-expanded-definition -http://shn.webmd.com/roundtable_reply/802056 -http://shn.webmd.com/roundtable_author/802056 -http://bbs.bianca.com/mforums/e/expounder/posts/2000_Jan_09/3067/3073.html -http://www.spaindustry.com/ita/geosearch/navarra/navarra/ESLAVA.html -http://www.backflip.org/members/rj2nagle/4643211 -http://www.backflip.org/members/rj2nagle/7211888 -http://www.backflip.org/members/rj2nagle/5066953 -http://www.backflip.org/members/rj2nagle/5346740 -http://www.backflip.org/members/rj2nagle/5382951 -http://www.linux.com/networking/network/performance/help/va_linux_systems/server/ -http://www.secinfo.com/d178s.ad.htm -http://www.secinfo.com/d178s.9d.htm -http://www.secinfo.com/d178s.8b.htm -http://www.secinfo.com/d178s.8y.htm -http://iceberg.adhomeworld.com/cgi-win/redirect.exe/1153874888 -http://tmxy.363.net/refer-e.htm -http://www.narodnaobroda.sk/20000210/10_007.html -http://retailer.gocollect.com/do/session/1912712/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/index.asp -http://retailer.gocollect.com/do/session/1912712/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/halloween/halloween.asp -http://www.larevista.elmundo.es/documentos/secciones/ciencia.html -http://ftpsearch.belnet.be/mirrors/ftp.isc.org/pub/usenet/control/brightnet/?M=A -http://www.5a8.com/book/zt/zpj/k/kelisidi/wanshenjie/006.htm -http://www.5a8.com/book/zt/zpj/k/kelisidi/wanshenjie/019.htm -http://www.northwoods.bigsmart.com/mall/cat_automotive.cfm?drop_menu=yes -http://www.leg.wa.gov/pub/rcw%20-%20text/title_41/chapter_004/rcw_41_04_220.txt -http://www.leg.wa.gov/pub/rcw%20-%20text/title_41/chapter_004/rcw_41_04_364.txt -http://www.leg.wa.gov/pub/rcw%20-%20text/title_41/chapter_004/rcw_41_04_400.txt -http://www.leg.wa.gov/pub/rcw%20-%20text/title_41/chapter_004/rcw_41_04_630.txt -http://bsd.tucows.mol.com/x11html/adnload/69206_8129.html -http://ldp.teihal.gr/LDP/LG/issue22/notes-mode.html -http://ldp.teihal.gr/LDP/LG/issue22/haters.html -http://members.nbci.com/design_res/software_ftp.htm -http://www.nativeamerican-jewelry.com/necklace53.htm -http://members.theglobe.com/pamile/Pamela0004.html -http://webtools.familyeducation.com/whatworks/item/front/0,2551,22-9696-7350-1099-49655,00.html -http://wwws.br-online.de/geld/boerse/970909/072001.html -http://212.31.0.37/fix98/75yil/1938.htm -http://212.31.0.37/fix98/75yil/1950.htm -http://212.31.0.37/fix98/75yil/26ekl.htm -http://212.31.0.37/fix98/75yil/28ekl.htm -http://212.31.0.37/fix98/75yil/38ekl.htm -http://212.31.0.37/fix98/75yil/67ekl.htm -http://212.31.0.37/fix98/75yil/92ekl.htm -http://212.31.0.37/fix98/75yil/15ekl.htm -http://www.insurequotes.com/wa2/71J2.html -http://cn.egroups.com/message/csreye/112 -http://ring.crl.go.jp/archives/lang/perl/CPAN/authors/id/J/JA/JARIAALTO/?D=A -http://ds.dial.pipex.com/town/drive/kch36/select/s31/ch027.html -http://ds.dial.pipex.com/town/drive/kch36/select/s31/ch056.html -http://ds.dial.pipex.com/town/drive/kch36/select/s31/ch043.html -http://202.99.23.245/huadong/199905/25/no_4.html -http://www.linux.com/networking/network/industry/training/services/business/ -http://www.writtenbyme.com/articles/849308468.shtml -http://members.tripod.com/TroupeLynx/index_m.htm -http://polygraph.ircache.net:8181/http_-2www.horizonfinance.com/https_-2www.truste.org/validate/http_-2www.ziplink.net/~ralphb/newsroom/http_-2www.travelsc.com/industry/home.html -http://ftp.bitcon.no/pub/tucows/preview/1095.html -http://ftp.bitcon.no/pub/tucows/preview/870.html -http://ftp.bitcon.no/pub/tucows/preview/144675.html -http://ftp.bitcon.no/pub/tucows/preview/144869.html -http://ftp.bitcon.no/pub/tucows/preview/31162.html -http://ftp.bitcon.no/pub/tucows/preview/7724.html -http://ftp.bitcon.no/pub/tucows/preview/2691.html -http://ftp.bitcon.no/pub/tucows/preview/72841.html -http://ftp.bitcon.no/pub/tucows/preview/72185.html -http://www.jacksonhewitt.com/ctg/cgi-bin/JacksonHewitt/company_profile/AAAksrACwAAABtvAAX -http://search.excaliburfilms.com/moviepgs/goodbadanddirty.htm?currency=NOK&stock=8377V1 -http://search.excaliburfilms.com/moviepgs/goodbadanddirty.htm?currency=FRF&stock=8377V1 -http://genforum.genealogy.com/cgi-bin/print.cgi?torian::44.html -http://retailer.gocollect.com/do/session/1912702/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/exclusives/newintros.asp -http://www.retrobytes.org/classiccmp/9911/msg00941.html -http://ftp.support.compaq.com/public/dunix/v3.2d-1/dce/?S=A -http://www.collectingnation.com/cgi-bin/bn/request_email.mod?EHANDLE=CoyoteChief -http://www.collectingnation.com/cgi-bin/bn/request_email.mod?EHANDLE=cpatch -http://www.beanienation.com/cgi-bin/bn/view_feedback.mod?HANDLE=cpegasus -http://www.quzhou.gov.cn/flfg.nsf/0a043ae26eb50247002564640039f21d/483ed12afec2b31d002564ac0039427a!OpenDocument&ExpandSection=7,6,5 -http://www.luecos.de/wow/art/mu_newsc_12080.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/quizz/misc/lit/programs/simple/pages_new.html -http://library.cuhk.edu.hk/search*chi/aChen,+Hui-fen./achen+hui+fen/31,-1,0,E/frameset&F=achen+hung&4,,0 -http://www.vedomosti.spb.ru/2000/arts/spbved-82-art-2.html -http://www.vedomosti.spb.ru/2000/arts/spbved-82-art-21.html -http://www.vedomosti.spb.ru/2000/arts/spbved-82-art-45.html -http://caller-times.com/1999/june/26/today/national/2447.html -http://cafe5.daum.net/Cafe-bin/Bbs.cgi/vision20pds/lst/qqeq/1/zka/B2-kB2Np -http://www.crutchfield.com/S-q8jdM6hvouc/sales.html -http://www.crutchfield.com/S-q8jdM6hvouc/cgi-bin/Catalog.asp?sid=S-q8jdM6hvouc -http://www.crutchfield.com/S-q8jdM6hvouc/copyright.html -http://deliveryc.aftonbladet.se/puls/stockholmsguiden/presentation/0,1714,2000023149,00.html -http://deliveryc.aftonbladet.se/puls/stockholmsguiden/presentation/0,1714,2000023162,00.html -http://deliveryc.aftonbladet.se/puls/stockholmsguiden/presentation/0,1714,2000023220,00.html -http://www.tnonline.com/archives/news/2000weeklies/09.20/pocono/pocono/police.html -http://retailer.gocollect.com/do/session/1912688/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/sports/index.asp -http://ftp.fas.org/irp/world/iraq/hadi/ -http://rusf.ru/kb/stories/kogda_chapaev_ne_utonul/text.htm -http://ring.yamanashi.ac.jp/pub/FreeBSD-PC98/dists/4.1-RELEASE/packages/chinese/?M=A -http://www3.buch-per-sms.de/anmeldung0.jsp$ID=To7737mC4935289641883087At0.9095524774481786 -http://www3.buch-per-sms.de/impressum.jsp$ID=To7737mC4935289641883087At0.9104482951702283 -http://ftp.uni-bremen.de/pub/linux/dist/suse/6.4/i386.de/suse/contents/ -http://ftp.uni-bremen.de/pub/linux/dist/suse/6.4/i386.de/suse/pay3/ -http://ftp.uni-bremen.de/pub/linux/dist/suse/6.4/i386.de/suse/xdev2/ -http://www.mlbworldseries.com/u/baseball/mlb/players/moreplayer_7649.htm -http://www.rismedia.com/consumer/27/5192/ -http://www.rismedia.com/consumer/27/18760/ -http://library.cuhk.edu.hk/search*chi/aZhang,+Wei-Yuan./azhang+wei+yuan/-5,-1,0,B/browse -http://itcareers.careercast.com/texis/it/itjs/+XwwBmeSFy86xwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqew8awn5otDanDtoDnnGaxdo5na5BwBnazdxanLpnGonDqnamnVncdpaBnwMahoGMiwGna31wcohoqwBodDaMFqpl0bP0RRe2PftgQE2yDzmesxwwwpBmeAFy86Kwww5rmepdwwwBrmeZpwww/morelike.html -http://itcareers.careercast.com/texis/it/itjs/+zwwBmerEy86e+xwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqew8awn5otDanDtoDnnGaxdo5na5BwBnazdxanLpnGonDqnamnVncdpaBnwMahoGMiwGna31wcohoqwBodDaMFqpl0bP0RRe2PftgQE2yDzmesxwwwpBmeAFy86Kwww5rmeADwwwBrmeZpwww/jobpage.html -http://itcareers.careercast.com/texis/it/itjs/++wwBmex8286xwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqew8awn5otDanDtoDnnGaxdo5na5BwBnazdxanLpnGonDqnamnVncdpaBnwMahoGMiwGna31wcohoqwBodDaMFqpl0bP0RRe2PftgQE2yDzmesxwwwpBmeAFy86Kwww5rm6mwwBrmeZpwww/jobpage.html -http://archive.soccerage.com/s/de/09/b2445.html -http://archive.soccerage.com/s/de/09/b2408.html -http://archive.soccerage.com/s/de/09/b2272.html -http://archive.soccerage.com/s/de/09/b2256.html -http://archive.soccerage.com/s/de/09/b2249.html -http://archive.soccerage.com/s/de/09/b2245.html -http://archive.soccerage.com/s/de/09/b2246.html -http://archive.soccerage.com/s/de/09/b2237.html -http://archive.soccerage.com/s/de/09/b2207.html -http://genforum.genealogy.com/cgi-genforum/forums/wickham.cgi?296 -http://ftpsearch.belnet.be/packages/CPAN/authors/id/N/NE/NEDKONZ/?S=A -http://www.cheatscape.com/amiga/a/game53cindex_1.htm -http://www.best.com/~radko/lounge/messages/3572.html -http://www.best.com/~radko/lounge/messages/3542.html -http://www.best.com/~radko/lounge/messages/3563.html -http://www.best.com/~radko/lounge/messages/3502.html -http://www.best.com/~radko/lounge/messages/3431.html -http://user.tninet.se/~lrg243i/leo2.htm -http://www.pocketbible.co.kr/new/hebrews/hebrews07/hebrews7-5.htm -http://www.pocketbible.co.kr/new/hebrews/hebrews07/hebrews7-10.htm -http://members.tripod.co.jp/sugart/?D=A -http://www.linux.com/networking/network/industry/growth/new/server/ -http://kdecvs.stud.fh-heilbronn.de/cvsweb/kdegames/kspaceduel/sprites/?hideattic=0&sortby=log -http://karate.list.ru/catalog/10621.html -http://www.digitaldrucke.de/(aktuell,arbeitsvermittlung,computer,hilfe,individualverkehr,kultur,mix,nuernberg,sense,software,verkehr)/_fort/html/themen/aktuell/verkehr.htm -http://www.digitaldrucke.de/(aktuell,arbeitsvermittlung,computer,hilfe,individualverkehr,kultur,mix,nuernberg,sense,software,verkehr)/_fort/html/themen/aktuell/fahrzeug/fahrzeug.htm -http://www.digitaldrucke.de/(aktuell,arbeitsvermittlung,computer,creaccess,hilfe,individualverkehr,kultur,mix,nuernberg,schnellübersicht,sense,software,verkehr,von)/_fort/html/themen/hilfe/getall.htm -http://polygraph.ircache.net:8181/http_-2www.infolane.com/http_-2www.neosoft.com/~nitemoon/technical/http_-2www2.davidweekleyhomes.com/advancedproj.html -http://wow-online.vhm.de/Regional/Sri_Lanka/Nachrichten.html -http://www.bell.bellnet.com/suchen/sport/rodeo.html -http://netway.pda.tucows.com/palm/adnload/67796_21902.html -http://netway.pda.tucows.com/palm/preview/48544.html -http://netway.pda.tucows.com/palm/adnload/139037_47478.html -http://netway.pda.tucows.com/palm/adnload/73256_21914.html -http://netway.pda.tucows.com/palm/adnload/71930_21910.html -http://netway.pda.tucows.com/palm/adnload/136499_47294.html -http://netway.pda.tucows.com/palm/adnload/77938_21926.html -http://wap.jamba.de/KNet/_KNet-g_v8j1-4Fd-13aaq/browse.de/node.0/cde7f2elw -http://www.oreilly.com/medical/autism/news/research.html -http://www.geocities.co.jp/HeartLand-Namiki/5523/kopen.html -http://br-online.de/wissenschaft/wimfs/tm/tm9611/tt9611ol.htm -http://retailer.gocollect.com/do/session/1912709/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/exclusives/preorder.asp -http://rac.co.kr/www.avm.de/ -http://rac.co.kr/www.aztech.com.sg/ -http://rac.co.kr/www.simple.com.au/drivers.htm -http://www.egroups.com/messages/Wrestlings2ndComing/263 -http://mediate.magicbutton.net/do/session/625584/vsid/3342/tid/3342/cid/88020/mid/2008/rid/2313/chid/2648/url/http://www1.getmapping.com/index.cfm -http://ben.aspads.net/ex/c/643/874990125 -http://www.hri.org/docs//statedep/1998/98-05-26.std.html -http://member1.shangdu.net/home2/longing/byzs/036.htm -http://web.tiscalinet.it/informacitta/n2Maggio2000/n2Maggio2000/Pagine/P16.htm -http://www.eveclub.com/cgi-bin/eveclub.front/972959455723/Catalog/11000155 -http://www.eveclub.com/cgi-bin/eveclub.front/972959455723/Basket/View/1000038 -http://student.monterey.edu/sz/troxellphillipju/campus/ -http://readers.thevines.com/leaf/AA0000401329/45///&act=24-1-11&bref=1601 -http://caller-times.com/1999/september/30/today/business/750.html -http://www.online.kokusai.co.jp/Mmf_corner/V0043482/mmf_corner/mmf_corner/url -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=27,33,21,19,32 -http://jupiter.u-3mrs.fr/~msc41www/GRATXT/PD6483.HTM -http://webtools.familyeducation.com/whatworks/item/front/0,2551,1-9696-7765-539-51377,00.html -http://parallel.fh-bielefeld.de/ti/vorlesung/sp/jdk_doc/java/text/class-use/FieldPosition.html -http://cinemabilia.de/details/katnr/239509/ -http://ftp.sunet.se/pub/FreeBSD/FreeBSD-current/ports/games/xgolgo/pkg-comment -http://yp.gates96.com/13/2/50/12.html -http://yp.gates96.com/13/2/50/68.html -http://yp.gates96.com/13/2/52/56.html -http://yp.gates96.com/13/2/53/71.html -http://yp.gates96.com/13/2/54/13.html -http://yp.gates96.com/13/2/54/21.html -http://yp.gates96.com/13/2/54/43.html -http://yp.gates96.com/13/2/54/52.html -http://yp.gates96.com/13/2/54/94.html -http://yp.gates96.com/13/2/55/25.html -http://yp.gates96.com/13/2/55/57.html -http://yp.gates96.com/13/2/56/95.html -http://yp.gates96.com/13/2/57/24.html -http://yp.gates96.com/13/2/57/34.html -http://yp.gates96.com/13/2/57/35.html -http://yp.gates96.com/13/2/57/64.html -http://yp.gates96.com/13/2/58/92.html -http://yp.gates96.com/13/2/59/2.html -http://yp.gates96.com/13/2/59/31.html -http://www.outpersonals.com/cgi-bin/w3com/pws/out/RLhI7rcI1D4JxQFT7-3mEP5SJK8AVzq_FCHTmPD4oB4tzM54LVISOGr6gaW80TieiLj3vEEhfqMBuYuDKIQXk3pROAhdckz6dDnbPsi72aC9ZSsK2o3j3J8YlLpw-uOtcBIEsA4ZZATUNj1D6atp66I4 -http://www.dulux.co.uk/UKRETAIL:1938649915:DFinity.1QJiP4jRabmkmb -http://www.dulux.co.uk/UKRETAIL:1938649915:DFinity.1QJiP4jMomdoclfieh -http://www.egroups.com/messages/raite-dvd/1442 -http://www3.newstimes.com/archive2000/jun28/bzd.htm -http://yp.gates96.com/2/75/20/35.html -http://yp.gates96.com/2/75/20/42.html -http://yp.gates96.com/2/75/20/48.html -http://yp.gates96.com/2/75/21/28.html -http://yp.gates96.com/2/75/21/88.html -http://yp.gates96.com/2/75/21/91.html -http://yp.gates96.com/2/75/21/93.html -http://yp.gates96.com/2/75/21/96.html -http://yp.gates96.com/2/75/22/23.html -http://yp.gates96.com/2/75/23/50.html -http://yp.gates96.com/2/75/24/13.html -http://yp.gates96.com/2/75/24/47.html -http://yp.gates96.com/2/75/24/90.html -http://yp.gates96.com/2/75/25/33.html -http://yp.gates96.com/2/75/25/46.html -http://yp.gates96.com/2/75/25/84.html -http://yp.gates96.com/2/75/26/37.html -http://yp.gates96.com/2/75/26/40.html -http://yp.gates96.com/2/75/27/30.html -http://yp.gates96.com/2/75/27/66.html -http://yp.gates96.com/2/75/27/81.html -http://yp.gates96.com/2/75/28/34.html -http://yp.gates96.com/2/75/28/55.html -http://yp.gates96.com/2/75/29/12.html -http://yp.gates96.com/2/75/29/19.html -http://yp.gates96.com/2/75/29/45.html -http://yp.gates96.com/2/75/29/56.html -http://yp.gates96.com/2/75/29/86.html -http://yp.gates96.com/2/75/29/99.html -http://cn.egroups.com/message/agribusiness1/31 -http://biblio.cesga.es:81/search*gag/jLugo+(Provincia).+Mapas+topográficos.+[1890%3F]/jlugo+provincia+mapas+topograficos+1890/31,-1,0,B/browse -http://bbs.lineone.net/news/uknews/msg01030.html -http://bbs.lineone.net/news/uknews/msg01047.html -http://bbs.lineone.net/news/uknews/msg01026.html -http://bbs.lineone.net/news/uknews/msg00976.html -http://bbs.lineone.net/news/uknews/msg00960.html -http://bbs.lineone.net/news/uknews/msg00952.html -http://idl.tucows.com/winnt/adnload/1380_28802.html -http://retailer.gocollect.com/do/session/1912681/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/christmas/holiday_shoppe.asp -http://www1.zdnet.co.uk/software/fstore/A/9/000BA9.html -http://polygraph.ircache.net:8181/home/http_-2www.tauchbali.com/SERV.HTM -http://channel.nytimes.com/1998/05/01/technology/cybertimes/artsatlarge/ -http://ftp.sunet.se/pub/FreeBSD/ports/ports/japanese/linux-netscape47-communicator/?D=A -http://www9.hmv.co.uk:5555/do/session/1347757/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/hiddenframe.html -http://www9.hmv.co.uk:5555/do/session/1347757/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/logoframe.html -http://www-usa9.cricket.org/link_to_database/ARCHIVE/1999-2000/WI_IN_NZ/ARTICLES/ -http://www-usa9.cricket.org/link_to_database/ARCHIVE/1999-2000/WI_IN_NZ/SCORECARDS/ -http://a228.g.akamai.net/7/228/289/55d96730f1ea56/news.indiainfo.com/2000/08/13/floods.html -http://caller-times.com/1999/august/08/today/texas_me/4241.html -http://ftp.uni-bremen.de/pub/doc/news.answers/movies/winona-ryder-faq/part3 -http://www.globalsources.com/gsol/owa/website.gold/GP3/8801728414/HOME.HTM -http://eds.kse.or.kr/jaemoo/jipyo_e/k_grp/E01683.htm -http://eds.kse.or.kr/jaemoo/jipyo_e/i_grp/E01116.htm -http://eds.kse.or.kr/jaemoo/jipyo_e/i_grp/E01126.htm -http://eds.kse.or.kr/jaemoo/jipyo_e/d_grp/E00366.htm -http://eds.kse.or.kr/jaemoo/jipyo_e/h_grp/E00929.htm -http://www.jobvillage.com/channel/jobs/cleaning/pruner/g.1276.html -http://www.affiliate.hpstore.hp.co.uk/do/session/380817/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/assistance/entry.asp -http://gamingplace.zeelandnet.nl/poker_rating.html -http://no.egroups.com/message/DVD-Info/111 -http://www.relax.ch/static/it/lazurigo/mercatodellavoro/oben.html -http://internet.exit.de/mees-online/left_geld.html -http://www.redrocksports.com/sports/webSession/shopper/RR972959658-31049/store/dept-5/department/dept-5/item/footwear -http://www.redrocksports.com/sports/webSession/shopper/RR972959658-31049/store/dept-5/department/dept-5/item/52550 -http://www11.cplaza.ne.jp/babyweb/bbs/bdnmp01/no16/61N.html -http://www.daimi.au.dk/dIntProg/java/jdk1.2.2/docs/api/javax/swing/plaf/basic/BasicScrollBarUI.ArrowButtonListener.html -http://www.daimi.au.dk/dIntProg/java/jdk1.2.2/docs/api/javax/swing/plaf/basic/BasicScrollBarUI.ModelListener.html -http://www.angelfire.com/nc/Percosolation/POSDerisions.html -http://yp.gates96.com/3/4/40/80.html -http://yp.gates96.com/3/4/41/23.html -http://yp.gates96.com/3/4/41/24.html -http://yp.gates96.com/3/4/41/37.html -http://yp.gates96.com/3/4/41/90.html -http://yp.gates96.com/3/4/42/26.html -http://yp.gates96.com/3/4/42/71.html -http://yp.gates96.com/3/4/42/90.html -http://yp.gates96.com/3/4/44/44.html -http://yp.gates96.com/3/4/45/52.html -http://yp.gates96.com/3/4/45/75.html -http://yp.gates96.com/3/4/45/77.html -http://yp.gates96.com/3/4/46/0.html -http://yp.gates96.com/3/4/46/85.html -http://yp.gates96.com/3/4/47/19.html -http://yp.gates96.com/3/4/47/20.html -http://yp.gates96.com/3/4/47/23.html -http://yp.gates96.com/3/4/47/72.html -http://yp.gates96.com/3/4/48/4.html -http://yp.gates96.com/3/4/48/16.html -http://yp.gates96.com/3/4/48/45.html -http://yp.gates96.com/3/4/48/51.html -http://yp.gates96.com/3/4/49/16.html -http://ftpsearch.belnet.be/pub/mirror/sunsite.cnlab-switch.ch/mirror/harvest/contrib/Example-Customizations/?S=A -http://pub9.ezboard.com/fgaprforeignrelationdepartment.showAddTopicScreenFromWeb -http://pub9.ezboard.com/fgaprforeignrelationdepartment.showMessage?topicID=4.topic -http://www.asstr.org/nifty/gay/authoritarian/adonis-brotherhood/adonis-brotherhood-3 -http://www.brio.de/BRIO.catalog/39fe2f4c06d41844273fd472aa7806a9/UserTemplate/8 -http://itcareers.careercast.com/texis/it/itjs/+HwwBmeH_D86aqwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqew6nxqdDdMoqax15oDn55a5BwhhawDwcO5o5aqd5Ban5BoMwBoDtaGo5Aa5nGVoqnaADdicnmtnaBddc5aMFqhTfR20DzmenxwwwpBmeWWD86exhwww5rmeWcwwwBrmeZpwww/jobpage.html -http://polygraph.ircache.net:8181/http_-2www.whowhere.com/http_-2www.updowntowner.org/julyjamm/frmain.htm -http://213.36.119.69/do/session/152987/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/reserver/spectacles/ -http://www.jobvillage.com/channel/jobs/health_care/physician/anesthesiologist/b.9467.g.1575.html -http://www.private-immobilien-boerse.de/friesland/verkauf/IIM-Teil/Startseite/Gemeinsam/Super-Zins-Konditionen/Gemeinsam/Inserieren/Gemeinsam/MarketingStrategie/inhalt.htm -http://se.egroups.com/message/yemdiscussion/38 -http://se.egroups.com/message/yemdiscussion/45 -http://home.bip.net/kerstin.hjelm/Stamtavla%20Z-kullen.html -http://mediate.magicbutton.net/do/session/625616/vsid/4385/tid/4385/cid/88138/mid/1702/rid/2114/chid/3393/url/http://www.worldgallery.co.uk/frameset-abou.html -http://members.tripod.lycos.co.kr/KWEN3607/?S=A -http://cpan.clix.pt/authors/id/B/BP/BPOWERS/String-StringLib-1.02.readme -http://www.gbnf.com/genealogy/bookout/html/d0001/I3283.HTM -http://m4.findmail.com/group/Opera2Developers -http://m4.findmail.com/group/acctworks -http://retailer.gocollect.com/do/session/1912690/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/product_display/top_ten.asp?pagenum=1 -http://retailer.gocollect.com/do/session/1912690/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/postcards/index.asp -http://platsbanken.amv.se/kap/text/47/001023,170030,140912,11,1276051947.shtml -http://www.gamespot.com/features/dunesg/dune6a.html -http://tucows.iquest.net/winme/preview/138053.html -http://tucows.iquest.net/winme/preview/137529.html -http://tucows.iquest.net/winme/preview/138641.html -http://archive.soccerage.com/s/pt/09/03721.html -http://archive.soccerage.com/s/pt/09/07102.html -http://www10.nytimes.com/library/national/science/health/021500hth-women-diabetes.html -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/www.phy.bnl.gov/e949/e949_update.txt -http://www.mapion.co.jp/custom/AOL/admi/13/13105/otsuka/3chome/index-7.html -http://go18.163.com/_NTES/~starseeker/gin/saga/gin01/gin0100.htm -http://village.infoweb.ne.jp/~fvgg8450/t91.html -http://clickahouse.mp2.homes.com/content/articles/locks.html -http://findmail.com/messages/studentdoctor/354 -http://ldp.mirror.nettuno.it/Linux/LDP/LDP/lkmpg/node3.html -http://ldp.mirror.nettuno.it/Linux/LDP/LDP/lkmpg/node13.html -http://fi.egroups.com/group/sandycove -http://www.fogdog.com/cedroID/ssd3040183219992/boutique/nike/ -http://www.fogdog.com/cedroID/ssd3040183219992/boutique/harbinger/ -http://www.fogdog.com/cedroID/ssd3040183219992/customer_service/employment.html -http://www.genoma.de/shop/736a8b4b4c331e80f780899842a4b0b4/99/b -http://sjsulib1.sjsu.edu:81/search/tbraille+transcription+project+of+santa+clara+county+inc/-5,-1,1,B/frameset&tbook+reviews+in+the+humanities&1,1, -http://students.washington.edu/emgall/eng481/final/ -http://www.vc-graz.ac.at/ilct/ffe_349_99.htm -http://www.vc-graz.ac.at/ilct/ffe_372_00.htm -http://www.vc-graz.ac.at/ilct/ffe_375_00.htm -http://www.escribe.com/computing/virtcom/m452.html -http://members.tripod.com/~TreasureIsland/welcom/e.htm -http://augustachronicle.com/stories/022699/obi_038-5494.001.shtml -http://augustachronicle.com/stories/022699/obi_038-5477.001.shtml -http://ring.edogawa-u.ac.jp/archives/X/opengroup/R6.5.1/xc/lib/Imakefile -http://www.elop.de/d0-1015-2044-3001-top.html -http://www.ibiblio.org/pub/languages/java/blackdown.org/JDK-1.1.7/i386/glibc/v1a/?S=D -http://www.linux.com/networking/network/enterprise/integration/management/Linux/ -http://www.mapion.co.jp/custom/AOL/admi/13/13221/matsuyama/2chome/index-7.html -http://www.mapion.co.jp/custom/AOL/admi/13/13221/matsuyama/2chome/index-12.html -http://ftp.sunet.se/pub/FreeBSD/ports/ports/japanese/tcl76/Makefile -http://ftp.lip6.fr/pub2/sgml-tools/website/HOWTO/Consultants-HOWTO/t19977.html -http://www.irishnews.com/archive2000/06072000/sportuk1.html -http://allmacintosh.ii.net/adnload/71893.html -http://allmacintosh.ii.net/adnload/70339.html -http://www.museumshops.co.uk/Bonnefoit-Alain/Bonnefoit-Alain-Die-Schoene-mit-dem-Pelz-3000062.html -http://www.timesoc.com/editions/orange/20001030/t000103758.html -http://www.musiciansfriend.com/ex/ds/bv/001030182803064208037039434033 -http://www.beneteau-owners.com/library.nsf/Library+By+System!OpenView&Start=41.4&Count=45&Expand=49 -http://www.musiciansfriend.com/ex/search/guitar/001030182759064208037059215342?FIND=BABX&q=c -http://www.musiciansfriend.com/ex/search/guitar/001030182759064208037059215342?FIND=ASAX&q=c -http://www.iabusnet.org:90/forums/aca-1/dispatch.exe/survey/showNextUnseen/fol/100001/2467632 -http://tucows.wish.net/winme/adnload/137243_28721.html -http://yp.gates96.com/3/71/10/71.html -http://yp.gates96.com/3/71/11/12.html -http://yp.gates96.com/3/71/11/27.html -http://yp.gates96.com/3/71/11/34.html -http://yp.gates96.com/3/71/11/40.html -http://yp.gates96.com/3/71/11/62.html -http://yp.gates96.com/3/71/11/78.html -http://yp.gates96.com/3/71/12/70.html -http://yp.gates96.com/3/71/13/34.html -http://yp.gates96.com/3/71/13/38.html -http://yp.gates96.com/3/71/13/82.html -http://yp.gates96.com/3/71/14/94.html -http://yp.gates96.com/3/71/15/0.html -http://yp.gates96.com/3/71/15/88.html -http://yp.gates96.com/3/71/17/28.html -http://yp.gates96.com/3/71/17/85.html -http://yp.gates96.com/3/71/18/37.html -http://yp.gates96.com/3/71/18/69.html -http://yp.gates96.com/3/71/19/55.html -http://www.kodak.ca/US/en/corp/jobs/samplingMechanicalProds.shtml -http://ring.crl.go.jp/archives/lang/perl/CPAN/authors/id/G/GR/GRICHTER/HTML-Embperl-1.3b4.readme -http://www7.freeweb.ne.jp/photo/lystra/a/n_aikawa.html -http://www.imagesofengland.org.uk/31/73/317339.htm -http://webraft.its.unimelb.edu.au/110080/students/ojb/pub/?D=A -http://pub.chinaccm.com/13/news/200010/31/155751.asp -http://pub.chinaccm.com/13/news/200010/21/162140.asp -http://go18.163.com/_NTES/~chen0580/y25.htm -http://pub17.ezboard.com/fcometalkfreetalk.showMessage?topicID=15.topic -http://pub17.ezboard.com/fcometalkfreetalk.showMessage?topicID=6.topic -http://mediate.magicbutton.net/do/session/625593/vsid/4385/tid/4385/cid/88138/mid/1702/rid/2114/chid/3393/url/http://www.worldgallery.co.uk/frameset-tips.html -http://213.36.119.69/do/session/152982/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/wap/lancement.html -http://wap.jamba.de/KNet/_KNet-Drs8j1-yEd-1395x/showInfo-presse.de/node.0/cde7f1uou -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=choramingar&l=pt -http://www.amcity.com/philadelphia/stories/1998/11/09/story5.html?t=email_story -http://www.mic.hr/PGMARKET:553666 -http://cn.egroups.com/messages/KristinChenoweth/2280 -http://quest7.proteome.com/databases/YPD/PombePD/SPAC343.03.html -http://www.engines.org.uk/white/fld19/ -http://www.engines.org.uk/white/fld27/ -http://se.egroups.com/subscribe/plusgothswap -http://www.headlight.com/invoice_process/1,1074,adpa-4049-2423-69-718,00.html -http://www.findarticles.com/cf_0/m4PRN/1999_Nov_3/57153314/p1/article.jhtml -http://www.iabusnet.org:90/forums/aca-1/dispatch.exe/survey/folderFrame/100001/0/alpha/2480022 -http://archive.soccerage.com/s/it/06/10903.html -http://innopac.lib.tsinghua.edu.cn/search*chi/dProduction+engineering/dproduction+engineering/-5,-1,0,B/browse -http://www.consource.com/communities/profile_categories/1759/1510 -http://column.daum.net/Column-bin/Bbs.cgi/thinkaboutrbs/new/zka/B2-kB2Np -http://wwws.br-online.de/geld/boerse/960301/0730.html -http://www.2pl.com/asp/tools/fili1.asp?sp=ro&fi=pppp0003zi -http://www.proviser.co.uk/regional/towns/alford/property_prices/compare_current_prices/terraced.html -http://cometweb01.comet.co.uk/do!session=131998&vsid=700&tid=20&cid=37030&mid=1000&rid=1060&chid=1713&url=eqqLmwlGltt5tkZHljbLqkZHlkrHhlZHdfjKYfkLlkZ5ljjLboZLbplG3XqLbdlLov4LfpmLiXvL-Zd5jbkLYozKvot0cZd5ockLYozKvsm0utt0cZX5qkXLjbzKMfaLblpLbom0bos0bom04M4Lbom0miXLvboLp1 -http://cometweb01.comet.co.uk/do!session=131998&vsid=700&tid=20&cid=37030&mid=1000&rid=1060&chid=1713&url=eqqLmwlGltt5tkZHljbLqkZHlkrHhlZHdfjKYfkLlkZ5ljjLboZLbplG3XqLbdlLov4LfpmLiXvL-Zd5jbkLYozKvot0cZd5ockLYozKvsm0uqo0cZX5qkXLjbzKG3pLibo0miX5mqlLmpbKomb0osb0oml1odXLkfpLbopL -http://www.geocities.co.jp/Milano/8578/profile.html -http://ftp.dti.ad.jp/pub/XFree86/3.3.3/binaries/NetBSD-1.2/Servers/?N=D -http://ftp.dti.ad.jp/pub/XFree86/3.3.3/binaries/NetBSD-1.2/Servers/?D=A -http://www.best.com/~radko/lounge/messages/3742.html -http://www.best.com/~radko/lounge/messages/3711.html -http://www.best.com/~radko/lounge/messages/3619.html -http://www.linux.com/networking/network/help/email/business/RuleSpace/ -http://www.financialexpress.com/fe/daily/20000918/fco17026.html -http://209.67.27.70/comics/dilbert/scott/dawn/pg19.html -http://209.67.27.70/comics/dilbert/scott/dawn/pg22.html -http://flamingo.promote.ru/href.pl?fct_051 -http://pda.saa.net/palm/adnload/34404_22152.html -http://www.outpersonals.com/cgi-bin/w3com/pws/out/q6tIzhLNlKeaaMXYVAPJiOq7V33Ul08VcQoPAomjWMQzOxA0cR6_kRLx42D4nA_uumPVc2DRZtv6CVpWQCyNUgVZQ2P9F7bqqvcf_5WqCdUM7UIRKBdjb9lTbrCrrl5_jZ6cQsstJDqry3XrFI0toILqSCSm66j2 -http://www.home.ch/~spaw9012/ps11/ps11_003.htm -http://help.sap.com/saphelp_45b/helpdata/de/1c/e464b20437d1118b3f0060b03ca329/frameset.htm -http://abc.ru/cgi-bin/get_firminfo.pl?firm=comsys -http://www.pressa.spb.ru/newspapers/nevrem/arts/nevrem-1749-art-28.html -http://www.pressa.spb.ru/newspapers/nevrem/arts/nevrem-1749-art-32.html -http://admin.afiliando.com/do/session/189435/vsid/1507/tid/1507/cid/23455/mid/1025/rid/1168/chid/1205/parser/yes/imref/eqqLmwlGltt5tkpHrYjLXofLklkKZljLkju5lZa5l0/url/http://www.submarino.com.mx/pesquisa/jutherC.asp?id_categoria=57&id_tipo=C -http://admin.afiliando.com/do/session/189435/vsid/1507/tid/1507/cid/23455/mid/1025/rid/1168/chid/1205/parser/yes/imref/eqqLmwlGltt5tkpHrYjLXofLklkKZljLkju5lZa5l0/url/http://www.submarino.com.mx/extra/talk_to_sub.asp -http://cometweb01.comet.co.uk/do!session=131998&vsid=700&tid=20&cid=37030&mid=1000&rid=1060&chid=1713&url=eqqLmwlGltt5tkZHljbLqkZHlkrHhlZHdfjKYfkLlkZ5ljjLboZLbplG3XqLbdlLov4LfpmLiXvL-Zd5jbkLYozKvot0cZd5ockLYozKvsn0mvm0cZX5qkXLjbzKGelLkbpL -http://yp.gates96.com/3/39/30/1.html -http://yp.gates96.com/3/39/30/53.html -http://yp.gates96.com/3/39/31/22.html -http://yp.gates96.com/3/39/32/0.html -http://yp.gates96.com/3/39/32/39.html -http://yp.gates96.com/3/39/32/41.html -http://yp.gates96.com/3/39/32/45.html -http://yp.gates96.com/3/39/32/97.html -http://yp.gates96.com/3/39/34/39.html -http://yp.gates96.com/3/39/34/50.html -http://yp.gates96.com/3/39/34/68.html -http://yp.gates96.com/3/39/34/72.html -http://yp.gates96.com/3/39/35/14.html -http://yp.gates96.com/3/39/35/84.html -http://yp.gates96.com/3/39/36/3.html -http://yp.gates96.com/3/39/36/19.html -http://yp.gates96.com/3/39/36/20.html -http://yp.gates96.com/3/39/36/84.html -http://yp.gates96.com/3/39/36/88.html -http://yp.gates96.com/3/39/37/37.html -http://yp.gates96.com/3/39/38/60.html -http://yp.gates96.com/3/39/38/63.html -http://yp.gates96.com/3/39/39/52.html -http://yp.gates96.com/3/39/39/56.html -http://yp.gates96.com/3/39/39/58.html -http://yp.gates96.com/3/39/39/63.html -http://yp.gates96.com/13/9/80/14.html -http://yp.gates96.com/13/9/80/92.html -http://yp.gates96.com/13/9/81/23.html -http://yp.gates96.com/13/9/81/47.html -http://yp.gates96.com/13/9/82/45.html -http://yp.gates96.com/13/9/82/59.html -http://yp.gates96.com/13/9/82/65.html -http://yp.gates96.com/13/9/82/71.html -http://yp.gates96.com/13/9/82/77.html -http://yp.gates96.com/13/9/83/86.html -http://yp.gates96.com/13/9/83/88.html -http://yp.gates96.com/13/9/84/4.html -http://yp.gates96.com/13/9/84/28.html -http://yp.gates96.com/13/9/84/77.html -http://yp.gates96.com/13/9/85/34.html -http://yp.gates96.com/13/9/85/59.html -http://yp.gates96.com/13/9/86/22.html -http://yp.gates96.com/13/9/86/28.html -http://yp.gates96.com/13/9/86/30.html -http://yp.gates96.com/13/9/86/37.html -http://yp.gates96.com/13/9/86/85.html -http://yp.gates96.com/13/9/87/1.html -http://yp.gates96.com/13/9/87/2.html -http://yp.gates96.com/13/9/88/58.html -http://yp.gates96.com/13/9/89/17.html -http://yp.gates96.com/13/9/89/49.html -http://yp.gates96.com/13/9/89/51.html -http://yp.gates96.com/13/9/89/64.html -http://yp.gates96.com/13/9/89/69.html -http://yp.gates96.com/13/9/89/79.html -http://www.diogenes.ch/4DACTION/web_rd_aut_frlist_az/ID=483337&chr=D -http://ngi.tucows.com/win2k/adnload/37473_28857.html -http://www4.nas.edu/ohr.nsf/All+Documents/Major+Units?OpenDocument&ExpandSection=1,4,21,7,17 -http://www4.nas.edu/ohr.nsf/All+Documents/Major+Units?OpenDocument&ExpandSection=2,4,21,7,17 -http://www4.nas.edu/ohr.nsf/All+Documents/Major+Units?OpenDocument&ExpandSection=15,4,21,7,17 -http://www4.nas.edu/ohr.nsf/All+Documents/Major+Units?OpenDocument&ExpandSection=16,4,21,7,17 -http://www.susi.de/cgi-bin/order/segelzentrum-kagerer/c134-5021905270003,de -http://www.egroups.com/messages/iraq-l/9973 -http://www2.kbank.no/Web/nlpublish.nsf/Published/ord_og_uttrykk!OpenDocument&ExpandSection=29,24,30,11 -http://www.etoys.com/prod/book/51604361 -http://link.fastpartner.com/do/session/600358/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/itjobbank.php -http://link.fastpartner.com/do/session/600358/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/shopnett.php -http://mirror.nucba.ac.jp/mirror/FreeBSD/branches/2.2-stable/ports/devel/mips64orion-rtems-objc/?S=A -http://www-uk5.cricket.org/link_to_database/NATIONAL/ENG/FC_TEAMS/SOMERSET/STATS/CAREER/SOMERSET_CAREER_J.html -http://www.linux.com/networking/network/performance/install/distro/industry/ -http://www.linux.com/networking/network/performance/install/distro/tools/ -http://www.linux.com/networking/network/performance/install/distro/enterprise/ -http://mx.php.net/manual/de/language.basic-syntax.php -http://mx.php.net/manual/fr/language.basic-syntax.php -http://moviestore.zap2it.com/browse/MOVIES/SCRIPT/s.UxBwM3db -http://www.armouries.org.uk/bjarni/introduction.htm -http://mirror.cc.utsunomiya-u.ac.jp/mirror/CPAN/authors/id/C/CT/CTWETEN/?D=A -http://atlanta.webmd.com/related_results/1/25/article/1738.50204 -http://www.ccnet.com/tzimmer/?M=A -http://go2.163.com/~xinhua/ -http://www.ualberta.ca/FTP/OpenBSD/src/regress/lib/libc/_setjmp/CVS/Root -http://www.dqt.com.cn/wymb/military/jinyong/金庸全集.htm -http://www.hole.kommune.no/hole/journweb.nsf/7e180336094ef23a412568cd004a5093/2fd09f96f20814cac12568e300443d50!Navigate&To=Next -http://classifieds.alberta.com/js/mi/c16000/b16000/n15/858640.html -http://classifieds.alberta.com/js/mi/c16000/b16000/n15/861013.html -http://homepages.go.com/homepages/b/n/g/bngholo/ -http://www.aelita.net/products/news/library/support/Reg/Subscribe/library/default.htm -http://www.chaos.dk/sexriddle/j/a/b/s/e/ -http://www.chaos.dk/sexriddle/j/a/b/s/t/ -http://213.36.119.69/do/session/152985/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/contact/info-publicite.html -http://www.indian-express.com/fe/daily/19990807/corporate.html -http://web.cln.com/archives/atlanta/newsstand/atl100795/1316.htm -http://web.cln.com/archives/atlanta/newsstand/atl100795/1317.htm -http://plaza.gaiax.com/www/plaza/k/n/kenta/friends.html -http://polygraph.ircache.net:8181/docs/eudora/http_-2www.kentuckylake.com/rates/http_-2www.hubbell-wiring.com/NEMA/admin/additional.html -http://gd.cnread.net/cnread1/wxxs/d/dongfangying/pljc/015.htm -http://www.bemi-immobilien.de/Startseite/www.ferien-immobilien.de/ferien-ib/startseite/Startseite/Gemeinsam/versicherungen/gebaeude/Gemeinsam/versicherungen/unfall/Startseite/www.ferien-immobilien.de/ferien-ib/startseite/Gemeinsam/versicherungen/lebensversicherung/Gemeinsam/versicherungen/gebaeude/anforderungsformular.htm -http://www.linux.com/networking/network/help/free/red_hat/competition/ -http://www.linux.com/networking/network/help/free/red_hat/development/ -http://www.linux.com/networking/network/help/free/red_hat/SuSE/ -http://search.chollian.net/d/%b1%e2%be%f7,%c8%b8%bb%e7/%b0%e1%c8%a5/%c5%e4%c5%bb%bf%fe%b5%f9%bc%ad%ba%f1%bd%ba/16.html -http://no.egroups.com/message/plowshares/840 -http://www.pressa.spb.ru/newspapers/nevrem/arts/nevrem-1872-art-13.html -http://www.bemi-immobilien.de/Startseite/www.allgemeine-immobilien-boerse.de/allgemeine-ib/landkreiszwickau/Verkauf/29109700708107kirchbergvillamü/Gemeinsam/erreichenPartner/Startseite/Gemeinsam/versicherungen/lebensversicherung/Top-Darlehens-Konditionen/Gemeinsam/versicherungen/unfall/anforderungsformular.htm -http://www.affiliate.hpstore.hp.co.uk/do/session/380819/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.france.hp.com/main/respect/ -http://www-rn.informatik.uni-bremen.de/home/ftp/pub/linux/redhat/updates/6.2EE/i586/ -http://archive.soccerage.com/s/es/09/12718.html -http://www.intel.es/kr/hangul/pressroom/archive/releases/dp990218.htm -http://www.intel.es/kr/hangul/pressroom/archive/releases/dp990105.htm -http://sunsite.informatik.rwth-aachen.de/cgi-bin/ftp/ftpshow/pub/Linux/sunsite.unc.edu/distributions/caldera/eServer/updates/2.3/021/RPMS/ -http://library.bangor.ac.uk/search/aMatis,+James+H/amatis+james+h/-5,-1,0,B/browse -http://polygraph.ircache.net:8181/http_-2www.microsoft.com/frontpage/html/http_-2www.sharkyextreme.com/hardware/hercules_tnt/ -http://ring.nihon-u.ac.jp/archives/pack/win95/net/fee/?N=D -http://dbc.copystar.com.tw/bcbchat/199804/msg03730.htm -http://dbc.copystar.com.tw/bcbchat/199804/msg03761.htm -http://dbc.copystar.com.tw/bcbchat/199804/msg03787.htm -http://www.private-immobilien-boerse.de/nordrhein-Westfalen/grevenbroich/Verkauf/Gemeinsam/Super-Zins-Konditionen/Exklusiv-IB/Startseite/IIM-Teil/Startseite/Gemeinsam/IIMMitglieder.htm -http://www.private-immobilien-boerse.de/nordrhein-Westfalen/grevenbroich/Verkauf/Gemeinsam/Super-Zins-Konditionen/Exklusiv-IB/Startseite/IIM-Teil/Startseite/Gemeinsam/vertriebspartner.htm -http://pd.shiseido.co.jp/s9604tub/html_00/win00051.htm -http://solaris.license.virginia.edu/os_product_patches/patches/5.7/107094-04/SUNWdtbas/pkgmap -http://www.eveclub.com/cgi-bin/eveclub.front/972959470432/Catalog/11000034 -http://www.sportinggreen.com/news/20001007/fbo/fbc/aar/001007.0607.html -http://www-x500-1.uni-giessen.de:8890/Lcn%3dBelloch%20Belloch%5c,%20Juana%20Maria,ou%3dFacultad%20de%20Medicina%20y%20Odontologia,o%3dUniversidad%20de%20Valencia,c%3dES -http://retailer.gocollect.com/do/session/1912723/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/exclusives/limited_editions.asp -http://www.jufo.com/netcenter/chemistry/item/000904/16888.htm -http://ww2.comune.fe.it/cgi-win/hiweb.exe/a2/d29/b14,8,1f,1d,1d,,19,,1f,19, -http://www.2pl.com/b/ru/to/1/24/16/v2/1241600107-8.htm -http://ring.htcn.ne.jp/pub/text/CTAN/fonts/metrics/polish/plpsfont/?D=A -http://config.tucows.com/winme/adnload/26398_28890.html -http://ocean.ntou.edu.tw/search*chi/aRadojcic,+Riko,+jt.+auth./aradojcic+riko/-5,-1,0,B/frameset&F=aradomsky+nellie+a&1,1 -http://www.intellicast.com/Sail/World/UnitedStates/Northwest/Montana/Beaverhead/LocalWinds/d1_09/ -http://www.bild.de/service/archiv/2000/mar/31/sport/coulthard/coulthard.html -http://ustlib.ust.hk/search*chi/a%7B215a36%7D%7B213246%7D%7B215e42%7D+1926/a{215a36}{213246}{215e42}+1926/-5,-1,0,B/frameset&F=a{215a36}{213230}{214e70}&1,1 -http://mediate.magicbutton.net/do/session/625620/vsid/4385/tid/4385/cid/88138/mid/1702/rid/2114/chid/3393/url/http://www.worldgallery.co.uk/frameset-top50.html -http://mediate.magicbutton.net/do/session/625620/vsid/4385/tid/4385/cid/88138/mid/1702/rid/2114/chid/3393/url/http://www.worldgallery.co.uk/frameset-corp.html -http://www.amateurplatinum.com/mouthlicking/eunuchhershey-highway/bad-girlsubmission/petitebeauties/actionno-boundaries/fellatiogoing-down-on/give-headcock-suckers.html -http://www.brd.net/brd-cgi/brd_dkameras/filmscanner_fotodrucker/FZ00F0EF/beurteilung/ci=972751646.htm -http://www.niwl.se/WAIS/31607/31607073.htm -http://www.magicvillage.de/Login/magicvillage/magiclife/Lucullus/%2328706045/Reply -http://polygraph.ircache.net:8181/consumer/rel_meet_main.html -http://sunsite.informatik.rwth-aachen.de/cgi-bin/ftp/ftpshow/pub/Linux/sunsite.unc.edu/distributions/debian/dists/potato/non-free/binary-i386/x11/ -http://www.great-cyber-mall.com/SelectCompany.asp?CityID=67&CatID=5 -http://www.great-cyber-mall.com/SelectCompany.asp?CityID=67&CatID=50 -http://rainforest.parentsplace.com/dialog/get/bradley2/39/1/1.html?embed=2 -http://www.users.yun.co.jp/cgi-bin/moriq/pigeon/pigeon.cgi/DataSet.after_post?c=e -http://www.chaos.dk/sexriddle/n/f/p/x/x/ -http://www.amcity.com/dayton/stories/2000/03/20/smallb1.html?t=email_story -http://www.linux.com/networking/network/industry/web_server/windows_nt/Red_Hat/ -http://www.du-et.net/cgi/mail.cgi?NickName=naiki -http://gameboyz.com/g/demos_p1_c41_lV_w2.html -http://intelinfo.subportal.com/sn/Games/Strategy_Games/9289.html -http://home.kimo.com.tw/maso-kid/index2.html -http://citeseer.nj.nec.com/nrelated/1377121/289677 -http://citeseer.nj.nec.com/nrelated/0/289677 -http://ccar.ust.hk/~dataop/rs_ocean_cd/WVS/wvsplus/wvs003m/bat/q/h/lf/ -http://home.baoding.cn.net/~tjhlove/dzrwy/l11.htm -http://home.baoding.cn.net/~tjhlove/dzrwy/l23.htm -http://208.178.109.85/msgshow.cfm/msgboard=129014524422386&msg=3558983275052&page=1&idDispSub=-1 -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=4,9,33,27,35 -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=29,9,33,27,35 -http://config.tucows.com/win2k/adnload/76944_30007.html -http://www1.zdnet.com/zdnn/stories/news/0,4586,1021147,00.html -http://www.fogdog.com/cedroID/ssd3040183236187/nav/stores/snowboarding/ -http://www.fogdog.com/cedroID/ssd3040183236187/nav/stores/institutional/ -http://debian.linux.org.tw/debian/dists/sid/main/disks-powerpc/current/source/?M=A -http://satftp.soest.hawaii.edu/dlr/slides/ql21176.html -http://www.linux.com/networking/network/industry/new/help/internet/ -http://www.linux.com/networking/network/industry/new/help/growth/ -http://flint.freethemes.com/skins/winamp/preview/46994.html -http://flint.freethemes.com/skins/winamp/preview/24628.html -http://flint.freethemes.com/skins/winamp/preview/25113.html -http://flint.freethemes.com/skins/winamp/preview/24645.html -http://flint.freethemes.com/skins/winamp/preview/25319.html -http://flint.freethemes.com/skins/winamp/preview/25017.html -http://flint.freethemes.com/skins/winamp/preview/26154.html -http://flint.freethemes.com/skins/winamp/preview/24669.html -http://flint.freethemes.com/skins/winamp/preview/24674.html -http://flint.freethemes.com/skins/winamp/preview/69522.html -http://flint.freethemes.com/skins/winamp/preview/58805.html -http://flint.freethemes.com/skins/winamp/preview/71909.html -http://flint.freethemes.com/skins/winamp/preview/24389.html -http://flint.freethemes.com/skins/winamp/preview/25052.html -http://flint.freethemes.com/skins/winamp/preview/77185.html -http://flint.freethemes.com/skins/winamp/preview/56733.html -http://flint.freethemes.com/skins/winamp/preview/24736.html -http://flint.freethemes.com/skins/winamp/preview/24408.html -http://flint.freethemes.com/skins/winamp/preview/24744.html -http://flint.freethemes.com/skins/winamp/preview/24424.html -http://flint.freethemes.com/skins/winamp/preview/25075.html -http://flint.freethemes.com/skins/winamp/preview/71807.html -http://nomade.fr/cat/informatique_tele/informatique/progiciels_logiciel/utilitaires/communication -http://pub9.ezboard.com/umetalman5566.showPublicProfile?language=EN -http://archiv.leo.org/pub/comp/usenet/comp.binaries.atari.st/texinfo31/texif31b.zoo/ -http://www.maas.ccr.it/cgi-win/hiweb.exe/a18/d13/b261,4,d,,be,d, -http://citeseer.nj.nec.com/cidcontext/608466 -http://l-infonet.phkk.fi/fi/TIETOPALVELUT/asiasanahaku/strategia/kansainv%E4listyminen/ulkomaankauppa/kansainv%E4linen+kauppa/ -http://cms.letsmusic.com/directory/search/albuminfo/1,1125,af0127818000000,00.asp -http://www.musiciansfriend.com/ex/ds/other/001030182805064208037054818832 -http://www.musiciansfriend.com/ex/search/other/001030182805064208037054818832?FIND=IBAX&q=c -http://www.mapion.co.jp/custom/tv/admi/13/13106/kuramae/3chome/19/ -http://dblab.comeng.chungnam.ac.kr/~dolphin//db/journals/ac/ac11.html -http://archive.soccerage.com/s/de/09/c4816.html -http://archive.soccerage.com/s/de/09/c4698.html -http://archive.soccerage.com/s/de/09/c4664.html -http://archive.soccerage.com/s/de/09/c4463.html -http://archive.soccerage.com/s/de/09/c4423.html -http://archive.soccerage.com/s/de/09/c4422.html -http://workingfamilies.digitalcity.com/tampabay/penpals/browse.dci?cat=teens&sort=f -http://www.bemi-immobilien.de/Startseite/www.allgemeine-immobilien-boerse.de/allgemeine-ib/landkreiszwickau/Verkauf/29109700708107kirchbergvillamü/Gemeinsam/Inserieren/Startseite/Gemeinsam/immolink/Top-Darlehens-Konditionen/Gemeinsam/versicherungen/unfall/anforderungsformular.htm -http://www.samba.org/cgi-bin/cvsweb/gnokii/xgnokii/docs/help/en_US/windows/main/?sortby=log -http://www.accesslasvegas.com/shared/health/adam/ency/article/002669sym.html -http://www.egroups.com/message/gaywrestle/33 -http://lfs.cyf-kr.edu.pl:8888/3Lcn%3dDirectory%20Manager,%20o%3dSPRITEL,%20c%3dES -http://www.acfas.ca/congres/congres66/S10.htm -http://hansard.www.act.gov.au/2000/week02/423.htm -http://207.25.71.142/cycling/2000/tour_de_france/stages/4/ -http://207.25.71.142/cycling/2000/tour_de_france/news/2000/07/20/pantani_reflects -http://207.25.71.142/cycling/2000/tour_de_france/news/2000/07/19/driver_charged/ -http://207.25.71.142/POLL/results/1142011.html -http://www2.kbank.no/Web/nlpublish.nsf/Published/ord_og_uttrykk!OpenDocument&ExpandSection=6,14,27,22 -http://www2.kbank.no/Web/nlpublish.nsf/Published/ord_og_uttrykk!OpenDocument&ExpandSection=29,14,27,22 -http://www.affiliate.hpstore.hp.co.uk/do/session/380816/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.france.hp.com/ -http://www.affiliate.hpstore.hp.co.uk/do/session/380816/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/products/entry.asp -http://ads.carltononline.com/accipiter/adclick/site=purejamba/area=jamba.home_page/AAMSZ=POPUP/ACC_RANDOM=972959547609 -http://retailer.gocollect.com/do/session/1912714/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/contact.asp -http://208.178.101.41/news/1998/12/10newsd.html -http://208.178.101.41/news/1998/03/05news.html -http://208.178.101.41/news/1998/03/03news.html -http://208.178.101.41/news/1998/01/09news.html -http://hff.shunde.net/mobile/radio2000.163.net/radio2000.163.html -http://hff.shunde.net/mobile/www.tohome.net/www.tohome.html -http://www.egroups.com/login.cgi?login_target=%2Fmessages%2FShayrs%2F31 -http://moviestore.zap2it.com/browse/MOVIES/BANK/s.bsk4qCBs -http://moviestore.zap2it.com/browse/MOVIES/STATION/s.bsk4qCBs -http://moviestore.zap2it.com/browse/MOVIES/VIDEO/s.bsk4qCBs -http://ftp.fi.debian.org/debian/dists/unstable/contrib/source/x11/?N=D -http://link.fastpartner.com/do/session/600364/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/company/jobs.htm -http://pub16.ezboard.com/uprieni.showPublicProfile -http://ftp.du.se/disk4/FreeBSD/branches/4.0-stable/ports/x11-servers/XFree86-4-FontServer/ -http://ftp.du.se/disk4/FreeBSD/branches/4.0-stable/ports/x11-servers/XttXF98srv-NKVNEC/ -http://www.generation-formation.fr/services/adrutils/GUIDES/CCI.HTM---o21zAo0UaWo0Ol9A074fo65iyfmKlze8SUeecTAseLvI5ehw7se7NeCfeZJPAPfVbNyqgBecVktePbBxehwwlezc9fAb0vyApuRtAhGqGdisSLdspt6dsSAtdsNhJdspt6dsrvrdjlhkfbu.htm -http://www.generation-formation.fr/services/adrutils/GUIDES/DRIRE.HTM---o21zAo0UaWo0Ol9A074fo65iyfmKlze8SUeecTAseLvI5ehw7se7NeCfeZJPAPfVbNyqgBecVktePbBxehwwlezc9fAb0vyApuRudNnJpo1XCjdRsR3djaPfdNjfcdRsR3djakUApvGdhcmdfbv.htm -http://198.103.152.100/search*frc/aMayer,+Anita/amayer+anita/-5,-1,0,B/frameset&F=amaybank+j+e&1,1 -http://198.103.152.100/search*frc/aMayer,+Anita/amayer+anita/-5,-1,0,B/2exact&F=amaycunich+ann&1,3 -http://kobenhavn.icepage.se/hilfe/XFree86/3.9.18/DECtga2.html -http://itcareers.careercast.com/texis/it/itjs/+YwwBmeJf5C6wwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewyhw1Bdmn5AanLnq1BoVnawmMoDo5BGwBoVnazdxamnpwGBMnDBaGnpdGB5a5BdGnaqddGmoDwBnanMwoca5Aocc5aMFqoEuRZy0IQDzmeJqwwwpBmeBFZ86mwww5rmehpwwwBrmeZpwww/morelike.html -http://itcareers.careercast.com/texis/it/itjs/+cwwBmetKD86eMmwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewyhw1Bdmn5AanLnq1BoVnawmMoDo5BGwBoVnazdxamnpwGBMnDBaGnpdGB5a5BdGnaqddGmoDwBnanMwoca5Aocc5aMFqoEuRZy0IQDzmeJqwwwpBmeBFZ86mwww5rmeODwwwBrmeZpwww/morelike.html -http://bbs.syu.ac.kr/NetBBS/Bbs.dll/scbbs008/rcm/zka/B2-kB27p/qqo/005A/qqatt/^ -http://musicmabey.subportal.com/sn/Themes/Misc__Themes/ -http://www.intel.it/eBusiness/pdf/prod/ia64/SAS_IA-64_Paper.pdf -http://elflife.bigpanda.net/2866/io.html -http://www.excelsior.com.mx/9609/960911/nac11.html -http://www.allgemeine-immobilien-boerse.de/ungarn/verkauf/Private-IB/Ferien-IB/Startseite/Allgemeine-IB/GmbH-Kauf-Verkauf-Insolvenz-konkurs/Startseite/indexbeginn.htm -http://www.allgemeine-immobilien-boerse.de/ungarn/verkauf/Private-IB/Ferien-IB/Startseite/Allgemeine-IB/Gemeinsam/geschaeftsbedingungen.htm -http://www.wingateinns.com/ctg/cgi-bin/Wingate/look_over/AAAksrACwAAACCPAAT -http://my.netian.com/~rakyun/?N=D -http://www.bemi-immobilien.de/Landhaus-Bordeaux/Gemeinsam/versicherungen/gebaeude/Gemeinsam/immolink/Top-Darlehens-Konditionen/Gemeinsam/Inserieren/Gemeinsam/suche.htm -http://www.mirror.kiev.ua:8083/paper/2000/04/1251/text/04-07-5.htm -http://ring.toyama-u.ac.jp/archives/NetBSD/packages/1.4.2/sun3/?N=D -http://ring.toyama-u.ac.jp/archives/NetBSD/packages/1.4.2/sun3/lang/ -http://www.vstore.com/vstorecomputers/8store/ -http://indiadirectory.indiatimes.com/webdirectory/1514pg1.htm -http://indiadirectory.indiatimes.com/webdirectory/1513pg1.htm -http://www.online.kokusai.co.jp/Map/V0002508/wrd/G400/demo/ -http://www.gamespot.com.au/features/everquest_gg/creatures1.html -http://www.jxi.gov.cn/yw-ty001.nsf/view!OpenView&Start=38.11&Count=30&Expand=40 -http://www.jxi.gov.cn/yw-ty001.nsf/view!OpenView&Start=38.11&Count=30&Expand=42 -http://yp.gates96.com/6/0/40/22.html -http://yp.gates96.com/6/0/40/85.html -http://yp.gates96.com/6/0/41/26.html -http://yp.gates96.com/6/0/41/94.html -http://yp.gates96.com/6/0/42/50.html -http://yp.gates96.com/6/0/43/30.html -http://yp.gates96.com/6/0/43/76.html -http://yp.gates96.com/6/0/44/43.html -http://yp.gates96.com/6/0/44/61.html -http://yp.gates96.com/6/0/44/99.html -http://yp.gates96.com/6/0/45/37.html -http://yp.gates96.com/6/0/45/84.html -http://yp.gates96.com/6/0/47/33.html -http://yp.gates96.com/6/0/47/43.html -http://yp.gates96.com/6/0/47/54.html -http://yp.gates96.com/6/0/48/30.html -http://yp.gates96.com/6/0/48/47.html -http://yp.gates96.com/6/0/49/5.html -http://hammer.prohosting.com/~kobeweb/cgi-bin/nagaya/nagaya.cgi?room=036&action=mente -http://www.petropages.com/kproduct/k4267p.htm -http://webraft.its.unimelb.edu.au/536029/students/plam/pub/?M=A -http://www.ld.com/cbd/archive/1999/09(September)/13-Sep-1999/Fawd001.htm -http://www.caijing.yesky.com/33554432/36700160/122010.htm -http://yp.gates96.com/14/85/0/7.html -http://yp.gates96.com/14/85/2/86.html -http://yp.gates96.com/14/85/3/90.html -http://yp.gates96.com/14/85/6/37.html -http://yp.gates96.com/14/85/8/82.html -http://yp.gates96.com/14/85/8/88.html -http://cn.egroups.com/messages/Toledo_Storm/228 -http://mediate.magicbutton.net/do/session/625598/vsid/4385/tid/4385/cid/88138/mid/1702/rid/2114/chid/3393/url/http://www.worldgallery.co.uk/frameset-cart.html -http://rainforest.parentsplace.com/dialog/thread.pl/bradley2/10/2.html?dir=prevResponse -http://tvstore.zap2it.com/browse/TV/JACKET/s.CmMildAx -http://tvstore.zap2it.com/browse/TV/CLOCK/s.CmMildAx -http://findmail.com/post/studentdoctor?act=forward&messageNum=2315 -http://www.chaos.dk/sexriddle/d/j/l/a/y/ -http://gandalf.neark.org/pub/distributions/OpenBSD/src/gnu/egcs/libstdc++/testsuite/libstdc++.tests/?D=A -http://gd.cnread.net/cnread1/net/zpj/s/shenfang/004.htm -http://www.imagesignworks.com/vinylmasksforacidetching/index.nhtml -http://209.249.170.32/stores/dir/bycat/Holiday_and_Seasonal/Christmas.shtml -http://www.allkorea.co.jp/cgi-bin/allkorea.front/972959867726/Catalog/1000107 -http://www.allkorea.co.jp/cgi-bin/allkorea.front/972959867726/Catalog/1000108 -http://www.linux.com/networking/network/applications/interface/microsoft/IBM/ -http://www.linux.com/networking/network/applications/interface/microsoft/Corel/ -http://www.linux.com/networking/network/applications/interface/microsoft/?kw_offset=50 -http://www.tiefbau-suhl.de/Leistung/Stuetzmauern/stuetzmauern2.htm -http://providenet.tucows.com/win2k/adnload/38394_29124.html -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/index.opentext.net/weather/detail.cgi?us-dc -http://iceberg.adhomeworld.com/cgi-win/redirect.exe/2133549064 -http://www.dc.digitalcity.com/charlestonwvarea/announce/main.dci?page=letusknow -http://members.tripod.co.jp/yoshihiro_2/yotete.html -http://www.bemi-immobilien.de/Startseite/www.allgemeine-immobilien-boerse.de/allgemeine-ib/landkreiszwickau/Verkauf/29109700708107kirchbergvillamü/Gemeinsam/immolink/Startseite/Gemeinsam/versicherungen/lebensversicherung/Gemeinsam/Startseite/www.ferien-immobilien.de/ferien-ib/startseite/ -http://ftp.debian.org/dists/Debian2.2r0/non-free/binary-arm/web/?N=D -http://www.complete-skier.co.uk/resorts/survey/submit.asp?ResortID=1755 -http://members.tripod.com/~BHS_CC/boys_times_1997.html -http://fi.egroups.com/post/mens-health?act=forward&messageNum=11 -http://nomade.fr/cat/famille_sante/sante/medecine_pratique/medecine_generale/ -http://home.att.net/~mlbvault/mac8.htm -http://mirror.nucba.ac.jp/mirror/Perl/authors/id/ROSCH/String-ShellQuote-1.00.readme -http://www.nrk.no/finnmark/x12_9_96/nyh6.htm -http://ftp.debian.org/dists/Debian2.2r0/non-free/binary-m68k/editors/?N=D -http://134.84.160.1/infoserv/lists/nih-image/archives/nih-image-9702/0141.html -http://www.philly.digitalcity.com/saintjosephmo/penpals/browse.dci?cat=seniors&sort=m -http://www.idg.net/crd_percent_19960.html -http://204.202.130.51/playerfile/profile/mark_karcher.html -http://www.redrocksports.com/sports/webSession/shopper/RR972959692-31077/store/dept-5/department/dept-5/item/52800 -http://www.redrocksports.com/sports/webSession/shopper/RR972959692-31077/store/dept-5/department/dept-5/item/52900 -http://www.online.kokusai.co.jp/Service/V0043510/wrd/G200/service/service.html -http://www.service911.com/mvu/step/0,2632,1+13+139+23899+17191_4,00.html -http://216.34.146.180/141000afp/14worl21.htm -http://www.chaos.dk/sexriddle/t/p/v/r/i/ -http://www.chaos.dk/sexriddle/t/p/v/r/x/ -http://www.ualberta.ca/FTP/Mirror/debian/dists/potato-proposed-updates/eruby_0.0.9-1potato1_arm.changes -http://www.hbdaily.com.cn/scznb/20000622/BIG5/scznb^1104^16^Zn16014.htm -http://www.linux.com/networking/network/administrator/internet/ftp/install/ -http://bsdweb.pasta.cs.uit.no/bsdweb.cgi/xsrc/xc/lib/Xt/PassivGrab.c?sortby=author -http://bsdweb.pasta.cs.uit.no/bsdweb.cgi/xsrc/xc/lib/Xt/ConstrainP.h?sortby=author -http://www.jamba.de/KNet/_KNet-EAA8j1-vFd-13b95/browse.de/node.0/cdel3j591 -http://vvv.geocities.co.jp/SiliconValley-SanJose/5688/sn-3.html -http://vvv.geocities.co.jp/SiliconValley-SanJose/5688/n.html -http://www.amel.net/english/computer/games/b/X0006_Backstab__.html -http://www.amel.net/english/computer/games/b/X0059_Bumper_Ships_1.1.html -http://retailer.gocollect.com/do/session/1912693/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/sports/index.asp -http://www.hig.se/(apre,formoutput,modified,set,set_cookie)/~jackson/roxen/ -http://yp.gates96.com/3/73/80/18.html -http://yp.gates96.com/3/73/81/27.html -http://yp.gates96.com/3/73/81/48.html -http://yp.gates96.com/3/73/81/58.html -http://yp.gates96.com/3/73/82/38.html -http://yp.gates96.com/3/73/83/30.html -http://yp.gates96.com/3/73/83/43.html -http://yp.gates96.com/3/73/83/49.html -http://yp.gates96.com/3/73/83/52.html -http://yp.gates96.com/3/73/84/33.html -http://yp.gates96.com/3/73/84/75.html -http://yp.gates96.com/3/73/85/2.html -http://yp.gates96.com/3/73/85/44.html -http://yp.gates96.com/3/73/85/70.html -http://yp.gates96.com/3/73/86/37.html -http://yp.gates96.com/3/73/86/59.html -http://yp.gates96.com/3/73/87/97.html -http://yp.gates96.com/3/73/87/99.html -http://yp.gates96.com/3/73/88/58.html -http://yp.gates96.com/3/73/88/63.html -http://yp.gates96.com/3/73/88/97.html -http://yp.gates96.com/3/73/89/31.html -http://yp.gates96.com/3/73/89/40.html -http://deseretbook.com/products/4108132/stock-38.html -http://workingfamilies.digitalcity.com/madison/search/ -http://debian.linux.org.tw/debian/dists/Debian2.2r0/main/disks-sparc/current/?D=A -http://debian.linux.org.tw/debian/dists/Debian2.2r0/main/disks-sparc/current/base-contents.txt -http://www.wizardsoftheweb.com/news/183.shtml -http://mathematics.fiz-karlsruhe.de/stn/whyonline/why_0367.html -http://www.nrk.no/finnmark/x27_11_98/nyh3.htm -http://rex.skyline.net/navigate.cgi?computers,agriculture,nature,agriculture,computers -http://www.secinfo.com/d1ZG7r.78.htm -http://www.secinfo.com/d1ZG7r.74.htm -http://www.freesoftware.com.cn/python.org.cn/doc/essays/ppt/hp-training/tsld051.htm -http://www.nrk.no/finnmark/x28_5_96/nyh1.htm -http://www.areteoutdoors.com/channel/snow/downhilling/b.354.g.2944.html -http://www.areteoutdoors.com/channel/snow/downhilling/b.357.g.2944.html -http://www.mywebmd.net/roundtable_message/662348 -http://lovers-lane.porncity.net/216/ -http://myhome.thrunet.com/~estefe/seng/sen18.htm -http://myhome.thrunet.com/~estefe/seng/sen42.htm -http://myhome.thrunet.com/~estefe/seng/sen52.htm -http://myhome.thrunet.com/~estefe/seng/sen73.htm -http://no.egroups.com/login.cgi?login_target=%2Fmessages%2Fenglish-zone -http://www.uzp.gov.pl/biulety/1998/100/100_1327.html -http://www.uzp.gov.pl/biulety/1998/100/100_1341.html -http://www.uzp.gov.pl/biulety/1998/100/100_1372.html -http://www.uzp.gov.pl/biulety/1998/100/100_1377.html -http://www.uzp.gov.pl/biulety/1998/100/100_1428.html -http://www.hotelboulevard.com/fr/riviera/standard/html40f8403856d2fa84c9080a860b7608ba/sessionLang/ANG/prov/browse/lstLieu[0]/Saint-Tropez/resultatSearch.html -http://polygraph.ircache.net:8181/http_-2www.microsoft.com/frontpage/speeches/Pages/funds/portfolio.html -http://www9.hmv.co.uk:5555/do/session/1347778/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/departments/d40_sd0_pt0.html -http://edc.uni-augsburg.de/doc/susehilf/pak/paket_doinst_insure.html -http://www.schlagerplatten.de/NewmanJimmyC/B000009PXU.htm -http://cn.egroups.com/message/pro92/604 -http://wwws.br-online.de/geld/boerse/980107/190001.html -http://faqs.bilkent.edu.tr/faqs/sgi/faq/performer/section-3.html -http://faqs.bilkent.edu.tr/faqs/sgi/faq/performer/section-46.html -http://faqs.bilkent.edu.tr/faqs/sgi/faq/performer/section-105.html -http://faqs.bilkent.edu.tr/faqs/sgi/faq/performer/section-111.html -http://newsone.net/nnr/prep/maus.soziales.recht -http://www.mapion.co.jp/custom/tv/admi/14/14131/yako/3chome/1/ -http://info.verwaltung.uni-freiburg.de/doc/packages/qt/html/qpicture-members.html -http://www.allkorea.co.jp/cgi-bin/allkorea.front/972959870915/ContentView/1000091/1/1200207 -http://tour.stanford.edu/cgi/locate2.prl/135.5/jltA -http://mapquest.digitalcity.com/daytonarea/salaries/main.dci?page=admin -http://linuxberg.zeelandnet.nl/x11html/adnload/9146_6809.html -http://medwebplus.com/subject/Alternative%20and%20Complementary%20Medicine/Population/Lists%20of%20Internet%20Resources?^ftc=240&^cc=ftc -http://ftp.du.se/disk0/slackware/slackware-current/contrib/ham/login/package_descriptions -http://yp.gates96.com/12/56/70/0.html -http://yp.gates96.com/12/56/70/14.html -http://yp.gates96.com/12/56/70/62.html -http://yp.gates96.com/12/56/71/19.html -http://yp.gates96.com/12/56/71/38.html -http://yp.gates96.com/12/56/71/46.html -http://yp.gates96.com/12/56/72/49.html -http://yp.gates96.com/12/56/72/78.html -http://yp.gates96.com/12/56/72/91.html -http://yp.gates96.com/12/56/73/18.html -http://yp.gates96.com/12/56/73/52.html -http://yp.gates96.com/12/56/74/15.html -http://yp.gates96.com/12/56/74/54.html -http://yp.gates96.com/12/56/74/79.html -http://yp.gates96.com/12/56/75/28.html -http://yp.gates96.com/12/56/75/68.html -http://yp.gates96.com/12/56/75/71.html -http://yp.gates96.com/12/56/75/76.html -http://yp.gates96.com/12/56/75/88.html -http://yp.gates96.com/12/56/75/94.html -http://yp.gates96.com/12/56/76/27.html -http://yp.gates96.com/12/56/76/57.html -http://yp.gates96.com/12/56/76/73.html -http://yp.gates96.com/12/56/77/60.html -http://yp.gates96.com/12/56/78/3.html -http://yp.gates96.com/12/56/78/45.html -http://yp.gates96.com/12/56/78/64.html -http://yp.gates96.com/12/56/78/86.html -http://yp.gates96.com/12/56/78/91.html -http://yp.gates96.com/12/56/78/95.html -http://yp.gates96.com/12/56/79/39.html -http://yp.gates96.com/12/56/79/75.html -http://www.alldata.com/TSB/19/831915CS.html -http://polygraph.ircache.net:8181/iisadmin/libraries/http_-2www.travelsc.com/welcome_v3/form1.html -http://majordomo.cgu.edu/cgi-bin/lwgate/NEMAI/archives/nemai.archive.0003/Date/article-9.html -http://home.tiscalinet.be/fysinet/studententips/tipsVanStudentenNicolas/sld007.htm -http://www4.netease.com/~abac/writting/zpnr/xw.htm -http://64.209.212.162/learnlots/step/0,2891,47+75+26299+10981_5,00.html -http://www.adcentral.com/cgi-bin/w3com/pws/adsites/KLhIZjY9X9xD5moK2JGI9yyxCV4tsONpzxjYyzP1Uq5ZFTlQAg3Wd-d9dlZbdFK8g3p8_O5GT8q_tKPHmrHXekF-PEpGmxPO69EhQYYR0fwhi_k2GqJa7eAy8n4PQUv0fLw2IIBwNP_qQkQpWEvx666v -http://www.nrc.nl/W2/Nieuws/1998/08/01/ -http://online.excite.de/unterhaltung/katalog/38320 -http://202.167.121.158/ebooks/jetro/tra1-1-1.html -http://ftp.uni-paderborn.de/aminet/aminet/demo/tp94/Blur.readme -http://www.symatrixinc.com/website/website.nsf/0/3e40df86fb357cd5882568720079613f!OpenDocument&ExpandSection=11,14,12,26 -http://www.intellicast.com/Ski/World/UnitedStates/Northeast/NewYork/WingedFootGCWest/WindChill/d1_12/ -http://yp.gates96.com/10/17/80/25.html -http://yp.gates96.com/10/17/80/66.html -http://yp.gates96.com/10/17/80/92.html -http://yp.gates96.com/10/17/82/56.html -http://yp.gates96.com/10/17/82/80.html -http://yp.gates96.com/10/17/83/48.html -http://yp.gates96.com/10/17/83/71.html -http://yp.gates96.com/10/17/83/85.html -http://yp.gates96.com/10/17/84/9.html -http://yp.gates96.com/10/17/84/20.html -http://yp.gates96.com/10/17/84/56.html -http://yp.gates96.com/10/17/84/63.html -http://yp.gates96.com/10/17/85/88.html -http://yp.gates96.com/10/17/86/4.html -http://yp.gates96.com/10/17/86/43.html -http://yp.gates96.com/10/17/86/45.html -http://yp.gates96.com/10/17/86/89.html -http://yp.gates96.com/10/17/86/97.html -http://yp.gates96.com/10/17/87/2.html -http://yp.gates96.com/10/17/87/46.html -http://yp.gates96.com/10/17/88/0.html -http://yp.gates96.com/10/17/89/21.html -http://yp.gates96.com/10/17/89/83.html -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/www.w3.org/International/O-URL-and-ident -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=(9,6)+21,0+3,0 -http://polygraph.ircache.net:8181/http_-2www.hystuff.com/nrc.htm -http://jproxy.uol.es/jproxy/http://www.ocregister.com/beaches/capistrano -http://www1.zdnet.com/companyfinder/filters/products/0,9996,38071-58,00.html -http://www.ftp.uni-erlangen.de/pub/mirrors/_other/afterstep.foo.net/AfterStep/binaries/?M=A -http://www.genome.wustl.edu:8021/gsc10/mouse/up/?D=A -http://www.genome.wustl.edu:8021/gsc10/mouse/up/up24/ -http://rotten-tomatoes.com/movies/browse/1074473/reviews.php?view=reviews.source -http://www.virtual-impact-mktg.com/fx110001.htm -http://genforum.genealogy.com/hagen/messages/164.html -http://genforum.genealogy.com/hagen/messages/111.html -http://genforum.genealogy.com/hagen/messages/7.html -http://genforum.genealogy.com/hagen/messages/271.html -http://genforum.genealogy.com/hagen/messages/40.html -http://nt.mortgage101.com/partner-scripts/1024.asp?p=cashsolutions -http://nt.mortgage101.com/partner-scripts/1026.asp?p=cashsolutions -http://library.cuhk.edu.hk/search*chi/t龍情三地+%26%2359%3B+[3]/t%7B21632b%7D%7B213e5b%7D%7B213024%7D%7B213779%7D++++3/-5,-1,0,B/browse -http://ftp.net.uni-c.dk/pub/linux/redhat/redhat-6.2/sparc/misc/src/anaconda/isys/?S=A -http://ftp.net.uni-c.dk/pub/linux/redhat/redhat-6.2/sparc/misc/src/anaconda/isys/modutils/ -http://cobrand.altrec.com/shop/detail/8273/30 -http://pegasus.infor.kanazawa-it.ac.jp/~hatlab/kaga/docs/jdk1.3-beta_api/jdk1.3/docs/api/java/lang/class-use/ClassFormatError.html -http://bci.tucows.com/winnt/adnload/58788_28761.html -http://www.buybuddy.com/sleuth/33/1/1020503/300/ -http://203.116.23.91/computer/pages2/it120800e.html -http://203.116.23.91/special/newspapers/2000/pages4/computer030700.html -http://203.116.23.91/computer/pages1/software131197.html -http://dic.empas.com/show.tsp/?q=anarchically&f=B -http://noodle.tigris.org/source/browse/subversion/subversion/libsvn_vcdiff/tests/target0.txt -http://www.dbservicestore.de/home/db_reise_touristik/angebote/db_rt_gat_muenster.shtml -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=2&discrim=16,237,275 -http://www.narodnaobroda.sk/20000926/06_006.html -http://mandijin.chinamarket.com.cn/C/Showdetail_company/22591.html -http://202.167.121.158/ebooks/jetro/t6.html -http://a228.g.akamai.net/7/228/289/dd50406be5fc91/news.indiainfo.com/2000/08/17/world-index.html -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=disaminerei&l=it -http://polygraph.ircache.net:8181/http_-2www.eastnebr.net/html/conversions.htm -http://www.secinfo.com/d2wVq.7ar.htm -http://www.secinfo.com/d2wVq.7B5.htm -http://www.secinfo.com/d2wVq.6cd.htm -http://www.secinfo.com/d2wVq.59x.htm -http://www.jamba.de/KNet/_KNet-xdz8j1-mFd-13b2b/browse.de/node.0/cenv0b09a -http://213.36.119.69/do/session/152991/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/jeux/jeux_himalaya.html -http://www.dailyexcelsior.com/99sep30/edit.htm -http://www.dailyexcelsior.com/99sep30/sports.htm -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/misc/misc/music/lit/quizz/computers/netwars.html -http://cometweb01.comet.co.uk/do!session=132020&vsid=700&tid=20&cid=37030&mid=1000&rid=1060&chid=1713&url=eqqLmwlGltt5tkjHfZoLlplLcqkKZljLlfb5lal5tkiLlXaLl0 -http://www.affiliate.hpstore.hp.co.uk/do/session/380832/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/search.asp -http://208.216.182.15/exec/obidos/ASIN/0516206443/qid=972959559/sr=1-22/ -http://fi.egroups.com/messages/alau/2350 -http://ads.puntopartenza.com/cgi-bin/redirect.cgi/31033631 -http://pds.nchu.edu.tw/cpatch/ftp/ftpctrl/?N=D -http://www.brio.de/BRIO.catalog/39fe2f5606def942273fd472aa7806e2/UserTemplate/5 -http://ep.com/js/mi/c7246/b0/832275.html -http://ep.com/js/mi/c7246/b0/837505.html -http://ep.com/js/mi/c7246/b0/764046.html -http://www.fogdog.com/cedroID/ssd3040183223072/nav/products/nhl/pittsburgh_penguins/fan/gender/autographed_pucks/ -http://netway.pda.tucows.com/palm/preview/33567.html -http://netway.pda.tucows.com/palm/preview/34007.html -http://cometweb01.comet.co.uk/do!session=132006&vsid=700&tid=20&cid=37030&mid=1000&rid=1060&chid=1713&url=eqqLmwlGltt5tkjHfZoLlplLcqkKZljLlfb5lal5tkiLlXaLl0 -http://www.udn.com.tw/ARCHIVE/2000/08/04/DOMESTIC/YUNLIN/587058.htm -http://www.linux.com/networking/network/support/web/news/services/ -http://www.linux.com/networking/network/support/web/news/website/ -http://www.linux.com/networking/network/support/web/news/business/ -http://ads.carltononline.com/accipiter/adclick/site=purejamba/area=jamba.home_page/AAMSZ=IAB_FULL_BANNER//ACC_RANDOM=972959548213 -http://www-x500-1.uni-giessen.de:8890/Lcn%3dConsuelo%20Alvarez,ou%3dDpto.%20Fisiologia%20y%20Biologia%20Animal,o%3dUniversidad%20de%20Sevilla,c%3dES -http://www.chaos.dk/sexriddle/b/q/v/y/n/ -http://www.cs.kuleuven.ac.be/~java/docs/tutorial/uiswing/converting/example-1dot1/ListDemo.html -http://golfonline.comfluent.net/cgi.pan$player&lpga82&Debbie_Raso&lpga?golfstats -http://acetoys.com/cgi-bin/exec/modify_cart_button=1&cart_id=1999923.7130.303&page=/tystore/htmlfiles/eden/dw.html -http://www.bigchurch.com/cgi-bin/w3com/pws/bc/y1hIyNzn0Bl2XX5GzG9wVnUEhWD8GTd-XbpDm6aNI4ZMGTnV_YsP2OjB0RrwLpDbJub1pKlzEMrInSQi9hRM-Rz4WNq8C1vKJ9STiU9leUD_a3PBVh-7OMZDzJtyEBAXTehiRqme6jBR -http://www.bigchurch.com/cgi-bin/w3com/pws/bc/mChIR_iy1798J8x9InaTkzOfisuwH2hv2KUj0e64IQ9CeS327muTnTo70bT5YC4YznUddEOY5WdX70keIPRlsQibJtG6uzZtaaPmL58O5zJ0z_2PkJNxmBS5dj5-gWoeBgE0zaSvCbi66Grq -http://wap.jamba.de/KNet/_KNet-8qB8j1-FFd-13blo/browse.de/node.0/cde7f2elw -http://collection.nlc-bnc.ca/100/201/300/info_tabac/html/1997/bull7/fdacarol.html -http://pub17.ezboard.com/fzhaostempleofenlightenmentzhaosforum.showMessage?topicID=116.topic -http://www.home.ch/~spaw4360/HOWTO_fr/Ethernet-HOWTO-5.html -http://www.chaos.dk/sexriddle/s/g/n/y/j/ -http://polygraph.ircache.net:8181/http_-2www.horizonfinance.com/https_-2www.truste.org/validate/page3.html -http://marketbiz.subportal.com/sn/Themes/Sports_Themes/288.html -http://www.chinaccm.com/04/news/200004/20/120305.asp -http://www.american.webtourist.net/travel/northamerica/usa/lagunabeach/bwlagunareefinn.htm -http://elib.zib.de/pub/visual/avs/mirror/imperial/new/?S=A -http://www.burstnet.com/ads/ad7826a-map.cgi/969206790 -http://yp.gates96.com/14/82/10/81.html -http://yp.gates96.com/14/82/12/82.html -http://yp.gates96.com/14/82/13/55.html -http://yp.gates96.com/14/82/14/27.html -http://yp.gates96.com/14/82/14/31.html -http://yp.gates96.com/14/82/15/52.html -http://yp.gates96.com/14/82/17/16.html -http://yp.gates96.com/14/82/17/93.html -http://www.outpersonals.com/cgi-bin/w3com/pws/out/P2hI5ODQEZ1-vIl-agOzeOeNg4wShDlZrsCbdT5YZ3TrprEU4rb4NnnDXiGmf5cX3dh8ltMer04TMDd3q-cE5Mne85eH57ltxsi4ZQfER6vkktoaaYlS9JFTzylmCJZ2_PAT9uu2oWvIjgMzt9toyeuV -http://www.mirror.ac.uk/sites/ftp.microsoft.com/deskapps/powerpt/KB/Q226/7/ -http://mirror.nucba.ac.jp/mirror/Perl/authors/id/MIKEKING/?M=A -http://lists.insecure.org/linux-kernel/2000/Jun/4357.html -http://www.nlc-bnc.ca/indexmus-bin/resultsum/m=0/e=0/h=25/p=1/f=AU/t=Siroir,+Maryse+Angrignon -http://genforum.genealogy.com/cgi-bin/print.cgi?leavy::19.html -http://www.egroups.com/message/malaysiakini/219 -http://wuarchive.wustl.edu/graphics/mirrors/ftp.povray.org/.3/netlib/ode/rksuite/?S=A -http://www.earthsystems.org/list/greenyes/jan2000/1999-2/0858.html -http://pp3.shef.ac.uk:4040/search=browse/dn=countryName%3DGB%40organizationName%3DUniversity+of+Sheffield%40organizationalUnitName%3DAutomatic+Control+and+Systems+Engineering%40commonName%3DI+D+Durkacz -http://cobrand.altrec.com/shop/detail/6133/15/sizing -http://cobrand.altrec.com/shop/detail/5624/17/write -http://members.theglobe.com/inwardpath/history.htm -http://findmail.com/post/studentdoctor?act=reply&messageNum=5168 -http://www.service911.com/everythingtele/step/0,2675,3+26057+24201+16394_0,00.html -http://www.linux.com/networking/network/free/release/development/mysql/ -http://www.nbip.com.cn/books/xdwx/Hongyan/hongyan14.html -http://ftp.jp.debian.org/debian-non-US/dists/sid/non-US/non-free/binary-hurd-i386/?N=D -http://homepage.swissonline.ch/chico_logo/www.Link008 -http://homepage.swissonline.ch/chico_logo/www.Link009 -http://citeseer.nj.nec.com/cidcontext/3719857 -http://itcareers.careercast.com/texis/it/itjs/+CwwBme3AT+6e-xwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewXnmoBGnamwBwxw5naBnqrDdcdtOaOnwGaMdDBramwOaqmwBwamn5otDamnVncdpoDtanDtoDnnGoDtaMFqhTfR20DzmebmwwwpBme3AT+6ekxwww5rmeXdwwwBrmeZpwww/jobpage.html -http://www.amazon.com.hk/exec/obidos/tg/stores/detail/-/pro-tools/B0000224UB/customer-reviews/ref=th_hp_rs_2_6/ -http://www.ard-buffet.de/buffet/teledoktor/1998/02/16/ -http://pub19.ezboard.com/fmissionimplausiblewhatpeoplearesaying.emailToFriend?topicID=41.topic -http://no.egroups.com/message/NikonCoolPix/211 -http://www.gasex.com/free.gay.sex/gay.men.dick.dicks.html -http://www.centc251.org/forums/aca-1/dispatch.cgi/hsi/showFolder/100001/1255931 -http://www.uni-duesseldorf.de/ftp/ftp/pf/s/yagirc-0.65.6/?N=D -http://www.outpersonals.com/cgi-bin/w3com/pws/out/uIhI1DhpdvAdxVFONIJuaNcvtSTejSMmZIBgOwsZamHFS4JpS3i6VWNOSb8LsLcmqmG0gp2hs1YjuScHwXmociV5L_3_fCYngafHC4CIYDuKoI-rOZldw1RU5K3jOfh5d3PxatRmmHqB662F -http://www.kfi640.com/shared/mod_perl/looksmart/looksmart/elax176954/eus53832/eus155852/eus53907/eus62316/ -http://www.magictraders.com/cgi-bin/ubb/ubbmisc.cgi?action=getbio&UserName=Ammo187 -http://fi.egroups.com/login.cgi?login_target=%2Fgroup%2Fweirdchicks -http://www.accesslasvegas.com/shared/health/adam/ency/article/000589.images.html -http://pp3.shef.ac.uk:4040/search=browse/dn=countryName%3DGB%40organizationName%3DAberdeen+University%40organizationalUnitName%3DGeneral+Practice%40commonName%3DMorrison+S -http://worldres.lycos.com/script/gen_amen.asp?hotel_id=2252&n=2089 -http://tulips.ntu.edu.tw/search*chi/dSymbolism+in+fairy+tales/dsymbolism+in+fairy+tales/-5,-1,0,B/browse -http://ftp.du.se/disk4/FreeBSD/branches/4.0-stable/ports/x11-clocks/pclock/ -http://ftp.du.se/disk4/FreeBSD/branches/4.0-stable/ports/x11-clocks/xtimer/ -http://polygraph.ircache.net:8181/cgi-win/lincoln/$cgi4wpro.exe/http_-2www.k56.com/http_-2www.webexplorer.net/c/SHLFFREZ.HTM -http://www.ecs.soton.ac.uk/~seg7/private/contact.html -http://wiem.onet.pl/wiem/00de68-s.html -http://lcweb2.loc.gov/ll/llnt/008/?M=A -http://www.alladvantage.com/pressroom.asp?refid=CBI-463 -http://herndon1.sdrdc.com/cgi-bin/ind_detail/FERRELL|PORTER|FORT+WORTH|TX|76107|SINGLE+SERVER+COMMUNICATIONS/ -http://herndon1.sdrdc.com/cgi-bin/ind_detail/HARRIS|WILLIAM|FAIRFAX|VA|22031|HARRIS+AND+ASSOCIATES/ -http://herndon1.sdrdc.com/cgi-bin/ind_detail/HUTCHER|LARRY|NEW+YORK|NY|10023|DAVIDOFF+AND+MALITO/ -http://herndon1.sdrdc.com/cgi-bin/ind_detail/ISIKOFF|NATHAN+R|WASHINGTON|DC|20007|CAREY-WINSTON+CO/ -http://www.linux.com/networking/network/communications/security/wireless/protocol/ -http://www.linux.com/networking/network/communications/security/wireless/technology/ -http://retailer.gocollect.com/do/session/1912719/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/about.asp -http://retailer.gocollect.com/do/session/1912719/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/exclusives/limited_editions.asp -http://retailer.gocollect.com/do/session/1912719/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/clubhouse/suggestions.asp -http://www9.hmv.co.uk:5555/do/session/1347779/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/hiddenframe.html -http://pub9.ezboard.com/fwestlifedublinmessageboardwestlifemessageboard.showMessage?topicID=8.topic -http://no.egroups.com/subscribe/hardzero -http://link.fastpartner.com/do/session/600378/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/index.php -http://link.fastpartner.com/do/session/600378/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/gosafe.php -http://link.fastpartner.com/do/session/600378/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/bitconomy.php -http://www.hello.co.jp/~daichi2/ -http://bbs.nsysu.edu.tw/txtVersion/treasure/ChiaYi/M.937783175.A/M.959916136.M.html -http://chat.hani.co.kr/NetBBS/Bbs.dll/chosun21/lst/qqeq/1/zka/B2-kB2Bp/qqo/PRMY -http://www.gartenfachmarkt.de/haus/schleifen/so.htm -http://links2go.publiweb.com/topic/US_Department_of_Agriculture -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=14,15,6,36,22 -http://www.linux.com/networking/network/new/hardware/open_source/operating_system/ -http://www.linux.com/networking/network/new/hardware/open_source/availability/ -http://tokyo.cool.ne.jp/pure0101/Oblivion_dust.html -http://www.digitaldrucke.de/(aktuell,computer,gaestebuch,hilfe,hilfeallgemein,individualverkehr,kultur,onlineservice,peripherie,sense,veranstaltungen,verkehr)/_fort/html/themen/computer/hard/links/mitsu.htm -http://www.gbnf.com/genealogy/jenkins/html/d0097/I4129.HTM -http://www.geocities.co.jp/Outdoors-River/1625/hakuba0502.htm -http://ftp.fi.debian.org/OpenBSD/src/regress/share/man/ -http://www3.buch-per-sms.de/angemeldet.jsp$ID=To7767mC050667397857644736At0.8818825373175998 -http://www2.kbank.no/Web/nlpublish.nsf/Published/ord_og_uttrykk!OpenDocument&ExpandSection=15,25,16,27 -http://debian.tod.net/debian/dists/sid/main/binary-sparc/electronics/?D=A -http://hs1.takeoff.ne.jp/~hatuse/ -http://polygraph.ircache.net:8181/Keyboards/http_-2www.sky.net/~robertf/handson/engine.html -http://www.gbnf.com/genealogy/jenkins/html/d0005/I3818.HTM -http://sepwww.stanford.edu/oldreports/sep67/old_src/jon/extend/junk.listing -http://www.kol.net/~calldj/cyberstar/map/dw25a.htm -http://citeseer.nj.nec.com/cidcontext/1297195 -http://citeseer.nj.nec.com/cidcontext/1297207 -http://books.hyperlink.co.uk/xt2/Peace_Verses_War/Cole/Derek/0722329539 -http://www.spousehouse.com/ -http://futures.homeway.com.cn/lbi-html/news/special/zhzt/jdht/twparty/zhengfu94652.shtml -http://www.yorosiku.net:8080/-_-http://www.zdnet.co.jp/zdii/interviews/interviews.html -http://library.cwu.edu/search/aIdaho+State+University/aidaho+state+university/-5,-1,0,E/frameset&F=aidaho+state+university&2,,0 -http://pelit.saunalahti.fi/.1/tucows/preview/68721.html -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=34,20,30,36,32 -http://pike-community.org/(base=/forums/show.html,forum=7,show=146,t=972959487953431)/forums/show.html -http://pike-community.org/(base=/forums/show.html,forum=7,show=185,t=972959487953431)/forums/show.html -http://pike-community.org/(base=/forums/show.html,explode=763,forum=7,t=972959487953431)/forums/show.html -http://pike-community.org/(base=/forums/show.html,forum=7,show=870,t=972959487953431)/forums/show.html -http://pike-community.org/(base=/forums/show.html,forum=7,show=890,t=972959487953431)/forums/show.html -http://ww2.comune.fe.it/cgi-win/hiweb.exe/a2/d3/b34,8,1,,1f,1,65,,1f,65, -http://www.telematik.informatik.uni-karlsruhe.de/osf/sw/v4.0x/lp2/bst320/kit/ -http://cafe3.daum.net/Cafe-bin/Bbs.cgi/harukypds/rnw/zka/B2-kB2Zq -http://www.digitaldrucke.de/(computer,hilfe)/_fort/html/themen/computer/hard/links/escom.htm -http://www2.ipc.pku.edu.cn/scop/pdb.cgi?sid=d6stdb_ -http://www2.ipc.pku.edu.cn/scop/pdb.cgi?sid=d4stdc_ -http://www.shopworks.com/index.cfm/action/specials/userid/00029735-2E1C-19FE-AF65010C0A0A8CF2 -http://www.shopworks.com/index.cfm/action/search/userid/00029735-2E1C-19FE-AF65010C0A0A8CF2 -http://www.helpnow.net.cn/helpnow/hardware/bbs/cpu/?D=A -http://books.hyperlink.co.uk/xt1/Light_My_Fire/Manzarek/Ray/0099280655 -http://bsd.sinica.edu.tw/cgi-bin/cvsweb.cgi/src/crypto/heimdal/appl/ftp/ftp/?sortby=author -http://tucows.interbaun.com/winme/adnload/5147_28523.html -http://tucows.interbaun.com/winme/adnload/137019_28530.html -http://moviestore.zap2it.com/browse/MOVIES/COLLECTI/s.NedNjpDf -http://moviestore.zap2it.com/browse/MOVIES/STRAW/s.NedNjpDf -http://www.online.kokusai.co.jp/Words/V0043505/wrd/G700/words/kana_main.html -http://www.mirror.edu.cn/res/sunsite/pub/X11/contrib/window_managers/gwm/patches/gwm_patch_1.8a_001 -http://www.musicblvd.com/cgi-bin/tw/270242907922133_20_hip -http://www.cowo.de/archiv/1991/21/9121c045.html -http://www.russ.ru:8080/netcult/nevod/19990827-pr.html -http://usol.linux.tucows.com/x11html/preview/26680.html -http://usol.linux.tucows.com/x11html/preview/10385.html -http://yp.gates96.com/7/22/20/54.html -http://yp.gates96.com/7/22/20/67.html -http://yp.gates96.com/7/22/20/71.html -http://yp.gates96.com/7/22/22/26.html -http://yp.gates96.com/7/22/22/55.html -http://yp.gates96.com/7/22/22/74.html -http://yp.gates96.com/7/22/22/94.html -http://yp.gates96.com/7/22/23/38.html -http://yp.gates96.com/7/22/23/59.html -http://yp.gates96.com/7/22/24/43.html -http://yp.gates96.com/7/22/24/60.html -http://yp.gates96.com/7/22/24/64.html -http://yp.gates96.com/7/22/24/66.html -http://yp.gates96.com/7/22/24/72.html -http://yp.gates96.com/7/22/24/85.html -http://yp.gates96.com/7/22/26/11.html -http://yp.gates96.com/7/22/26/69.html -http://yp.gates96.com/7/22/27/3.html -http://yp.gates96.com/7/22/27/11.html -http://yp.gates96.com/7/22/27/22.html -http://yp.gates96.com/7/22/27/48.html -http://yp.gates96.com/7/22/27/69.html -http://yp.gates96.com/7/22/28/13.html -http://yp.gates96.com/7/22/28/30.html -http://yp.gates96.com/7/22/29/39.html -http://yp.gates96.com/7/22/29/58.html -http://www.allgemeine-immobilien-boerse.de/frankfurt/verkauf/Gemeinsam/Super-Zins-Konditionen/Private-IB/Startseite/IIM-Teil/Startseite/Gemeinsam/Super-Zins-Konditionen/anforderungsformular.htm -http://cobrand.altrec.com/shop/detail/8470/9/description -http://oa-nett.no/0/73/90/2.html -http://www.nordi.no/~steinsk/ -http://www02.geocities.co.jp/Stylish/6692/ -http://no.egroups.com/login.cgi?login_target=%2Fmessages%2Fsan-diego-tango -http://no.egroups.com/message/san-diego-tango/390 -http://www.jamba.de/KNet/_KNet-m_C8j1-PFd-13bt7/showInfo-special1.de/node.0/cenv0b09a -http://www.bemi-immobilien.de/Ferien-IB/Startseite/Gemeinsam/immolink/Startseite/www.ferien-immobilien.de/ferien-ib/startseite/Startseite/Gemeinsam/versicherungen/gebaeude/Startseite/froben.htm -http://it.egroups.com/post/pimnews-homeworker?act=reply&messageNum=661 -http://members.es.tripod.de/remoto/t2/p3b.htm -http://no.egroups.com/post/Translat2000?act=reply&messageNum=530 -http://www.opengroup.com/pabooks/081/0816631352.shtml -http://www6.freeweb.ne.jp/feminine/ki18/portrait10/p21.htm -http://genforum.genealogy.com/cgi-genforum/forums/cantrell.cgi?2117 -http://www9.hmv.co.uk:5555/do/session/1347769/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/departments/d30_sd0_pt0.html -http://polygraph.ircache.net:8181/docs/Win95/MSdialer/http_-2www.fastcounter.com/http_-2www.perrypip.com/http_-2www.scruz.net/~dvb/cam.html -http://polygraph.ircache.net:8181/docs/Win95/MSdialer/http_-2www.fastcounter.com/http_-2www.perrypip.com/~logan/ -http://polygraph.ircache.net:8181/docs/Win95/MSdialer/http_-2www.fastcounter.com/http_-2www.perrypip.com/http_-2hits.omino.com/ -http://javatest.a-net.nl/servlet/pedit.Main/http://epidem13.plantsci.cam.ac.uk/~js/glossary/course-glossary.html -http://www.hellefors.se/ulf/akno/alla/p0349c5e1e.html -http://home.no.net/islamnor/had.sira.html -http://www.gutenberg2000.de/immerman/muenchim/muen1171.htm -http://www.gutenberg2000.de/immerman/muenchim/muen3091.htm -http://www.gutenberg2000.de/immerman/muenchim/muen7011.htm -http://www.sikhnet.com/sikhnet/music.nsf/by%20Shabad!OpenView&Start=30&Count=20&Expand=2 -http://www.proteome.com/databases/PombePD/reports/SPCC613.01.html -http://www.midwestvanlines.com/oh/indexC.html -http://ring.tains.tohoku.ac.jp/pub/linux/debian/debian-jp/dists/stable/contrib/binary-arm/electronics/?S=A -http://members.tripod.com/~infolog/Genhouses/Chap12.htm -http://www.4positiveimages.com/4positiveimages/1998693855/UserTemplate/2 -http://www.greenleaves.com/bookcat/gb_096855900X.html -http://www-rn.informatik.uni-bremen.de/home/X11R6/xc/doc/hardcopy/test/?M=A -http://rex.skyline.net/html/Shipping_of_Goods.html?48,airplanes,transportation,collectibles,transportation -http://rex.skyline.net/html/Automobile_Classified_Listings.html?59,airplanes,transportation,collectibles,transportation -http://www.admin.co.martin.fl.us/GOVT/depts/cas/corresp/2000/cas00l.133.html -http://www.admin.co.martin.fl.us/GOVT/depts/cas/corresp/2000/cas00l.126.html -http://www.affiliate.hpstore.hp.co.uk/do/session/380834/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hpstore.hewlett-packard.fr/gp -http://link.fastpartner.com/do/session/600367/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/no/ -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/www-library.lbl.gov/photo/gallery/ -http://dogbert.wu-wien.ac.at/UniverCD/cc/td/doc/product/core/cis12012/bfrcfig/4334acps/?M=A -http://ftp.uni-stuttgart.de/pub/tex/nonfree/support/latexdraw/doc/ltdmanual.html.g/node10.html -http://se.egroups.com/message/911dispatchers/718 -http://ftp.eecs.umich.edu/.1/people/jfr/Pinata_Book/?D=A -http://community.bigchalk.com/servlet/schools_ProcServ/DBPAGE=cge&GID=66001000660906746080215398&PG=66001000660906746080492039 -http://www2.kbank.no/Web/nlpublish.nsf/Published/ord_og_uttrykk!OpenDocument&ExpandSection=16,27,29,4 -http://www2.kbank.no/Web/nlpublish.nsf/Published/ord_og_uttrykk!OpenDocument&ExpandSection=22,27,29,4 -http://pds.nchu.edu.tw/cpatch/ftp/dap/cdap_4002.txt -http://pds.nchu.edu.tw/cpatch/ftp/dap/source/ -http://kuyper.calvin.edu/fathers2/ANF-03/anf03-22.htm -http://kuyper.calvin.edu/fathers2/ANF-03/anf03-27.htm -http://blisty.internet.cz/1250/9908/19990813a.html -http://ring.shibaura-it.ac.jp/archives/doc/jpnic/minutes/committee/200008/shiryou-2-8-2.txt -http://194.128.65.4/pa/cm199697/cmhansrd/vo970306/text/70306w14.htm -http://www.mortgagemag.com/guide/c096/c096573.htm -http://link.fastpartner.com/do/session/600369/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/mondosoft.php -http://link.fastpartner.com/do/session/600369/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/gosafe.php -http://cometweb01.comet.co.uk/do!session=132008&vsid=692&tid=20&cid=37051&mid=1000&rid=1060&chid=1702&url=eqqLmwlGltt5tkjHfZoLlplLcqkKZljLlfb5lal5tkiLlXaLl0 -http://www.vh.org///////Patients/IHB/FamilyPractice/AFP/November1994/HormoneReplacement.html -http://ftp.sunet.se/pub/unix/OpenBSD/distfiles/md5/74892a6ae002937d011d3e1102269b7f/?M=A -http://www.pcdads.com/pressroom/archive/releases/cn112999.htm -http://www.pcdads.com/pressroom/archive/releases/Fe90199a.htm -http://www.pcdads.com/pressroom/archive/releases/Cn042199.htm -http://www.cheap-cds.com/surf/order/017172 -http://www.hani.co.kr/ECONOMY/data/9909/day09/print/p00909060.html -http://www.bemi-immobilien.de/Startseite/www.allgemeine-immobilien-boerse.de/allgemeine-ib/landkreiszwickau/Verkauf/29109700708107kirchbergvillamü/Gemeinsam/MarketingStrategie/Startseite/Gemeinsam/Inserieren/Gemeinsam/Gemeinsam/versicherungen/unfall/anforderungsformular.htm -http://www.sj-rmall.com/Mall/Catalog/Product/ASP/product-id/57419/store-id/1000400121.html -http://www.travelodge.com/ctg/cgi-bin/Travelodge/home/AAAksrACwAAABvTAAd -http://ctc.org.cn/ctc2/news/internet/develop/news0322-6.htm -http://www.schlagertempel.de/FallbachTrio/B000025MBP.htm -http://www.fogdog.com/cedroID/ssd3040183238127/nav/products/nike/1b/all/10.html -http://www.fogdog.com/cedroID/ssd3040183238127/customer_service/security_policy.html -http://in.egroups.com/login.cgi?login_target=%2Fgroup%2Fradiotutorium -http://yp.gates96.com/7/87/70/43.html -http://yp.gates96.com/7/87/70/61.html -http://yp.gates96.com/7/87/71/85.html -http://yp.gates96.com/7/87/72/75.html -http://yp.gates96.com/7/87/73/1.html -http://yp.gates96.com/7/87/73/5.html -http://yp.gates96.com/7/87/73/60.html -http://yp.gates96.com/7/87/74/34.html -http://yp.gates96.com/7/87/75/9.html -http://yp.gates96.com/7/87/75/50.html -http://yp.gates96.com/7/87/75/92.html -http://yp.gates96.com/7/87/76/2.html -http://yp.gates96.com/7/87/76/59.html -http://yp.gates96.com/7/87/76/92.html -http://yp.gates96.com/7/87/78/30.html -http://yp.gates96.com/7/87/78/32.html -http://yp.gates96.com/7/87/78/75.html -http://yp.gates96.com/7/87/78/85.html -http://yp.gates96.com/7/87/78/93.html -http://yp.gates96.com/7/87/79/30.html -http://yp.gates96.com/7/87/79/50.html -http://yp.gates96.com/7/87/79/71.html -http://yp.gates96.com/7/87/79/85.html -http://interhotel.com/luxembourg/es/hoteles/45691.html -http://interhotel.com/luxembourg/es/hoteles/73094.html -http://bart.kullen.rwth-aachen.de/~quake3/Html_log/471_chat.html -http://search.yam.com.tw/en/search/rec/travel/domest/resorts/miaolir/ -http://www.narodnaobroda.sk/19991009/23_006.html -http://news.china.com/zh_cn/social/1007/20001027/7624.html -http://www.fila.com.br/ -http://www.jobvillage.com/channel/jobs/health_care/female_health/b.3122.g.2360.html -http://online.excite.de/bildung/katalog/35461 -http://deportes.ole.com/ocio/articulo/articulo.cfm?ID=OCI8055 -http://yp.gates96.com/3/36/90/2.html -http://yp.gates96.com/3/36/90/37.html -http://yp.gates96.com/3/36/90/55.html -http://yp.gates96.com/3/36/90/79.html -http://yp.gates96.com/3/36/91/7.html -http://yp.gates96.com/3/36/92/59.html -http://yp.gates96.com/3/36/92/95.html -http://yp.gates96.com/3/36/93/76.html -http://yp.gates96.com/3/36/93/88.html -http://yp.gates96.com/3/36/94/41.html -http://yp.gates96.com/3/36/94/64.html -http://yp.gates96.com/3/36/95/16.html -http://yp.gates96.com/3/36/95/33.html -http://yp.gates96.com/3/36/95/39.html -http://yp.gates96.com/3/36/96/36.html -http://yp.gates96.com/3/36/96/53.html -http://yp.gates96.com/3/36/99/30.html -http://yp.gates96.com/3/36/99/73.html -http://download.sourceforge.net/mirrors/turbolinux/turbolinux-cn/pub/turbolinux/updates/TLC3.0.2/?S=D -http://www.jobvillage.com/channel/jobs/administrative/mrd/courier/b.4728.g.3366.html -http://www.jobvillage.com/channel/jobs/administrative/mrd/shipping_clerk/b.4713.g.3366.html -http://quote.fool.com/simple.asp?symbols=NS -http://itcareers.careercast.com/texis/it/itjs/+NwwBmeIXD86dxwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewXhmoBGnaqdGpdGwBodDaqdMp1BnGadpnGwBodD5aMw55wqr15nBB5aqdGpdGwBnahoDwDqowcaMwocaBn5BoDtapGdxcnMaMFqhTfR20DzmetmwwwpBme_9D86eYmwww5rme1DwwwBrmeZpwww/jobpage.html -http://www.shopworks.com/index.cfm/action/info/userid/00066256-1160-19FE-A703010D0A0A8CF2 -http://isbn.nu/0716723212/fatbrain -http://isbn.nu/0716723212/amazon.ceo.html -http://ftp.nacamar.de/pub/NetBSD/NetBSD-current/pkgsrc/www/p5-URI/?N=D -http://213.36.119.69/do/session/152993/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/preparer/sante.htm -http://213.36.119.69/do/session/152993/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/jeux/jeux_himalaya.html -http://213.36.119.69/do/session/152993/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/DE_DE/ -http://www.linux.com/networking/network/support/open_source/investors/consulting/ -http://www.linux.com/networking/network/support/open_source/investors/research/ -http://sunsite.uakom.sk/doc/FAQ/alt-sex/fetish-fashion/?S=A -http://sunsite.uakom.sk/doc/FAQ/alt-sex/fetish-fashion/?D=A -http://phnet.tucows.com/winme/preview/75994.html -http://www.fivedoves.com/letters/june99/trish67.htm -http://www.teacherformation.org/html/od/facilitators.cfm/task1,about/discussion_id,2/xid,8571/yid,4064381 -http://pub24.ezboard.com/fnightmagicfrm1.showMessage?topicID=3.topic -http://infoserv2.ita.doc.gov/efm/efm.nsf/Sources!OpenView&Start=53.28&Count=30&Expand=54 -http://www.linux.com/networking/network/communications/management/windows_nt/website/ -http://www.linux.com/networking/network/communications/management/windows_nt/?kw_offset=50 -http://www.epinions.com/cmd-review-593A-C9BAC2B-3987B6DC-prod1 -http://www.bande-dessinee.org/bd/bd02.nsf/InterDescenaristes!OpenView&Start=1&Count=50&Collapse=51 -http://www.business-partner.ch/static/fr/pourlesfirmes/lesgrandesentreprises/whateveryouwant/solutionsspecifiquesalabranche/transport/main.html -http://ads.carltononline.com/accipiter/adclick/site=purejamba/area=JAMBA.HOME_PAGE/AAMSZ=KSJAMBA//ACC_RANDOM=972959547161 -http://expert.cc.purdue.edu/~yoko/simpsons/front.html -http://dailynews.sina.com.cn/society/2000-06-14/97332.html -http://ftp.dti.ad.jp/pub/Linux/debian-jp/dists/potato/main/binary-all/editors/?M=A -http://www.babyheirlooms.com/catalog/htmlos.cat/041124.1.5608817466 -http://www9.hmv.co.uk:5555/do/session/1347791/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/departments/d100_sd0_pt0.html -http://www.jobvillage.com/channel/jobs/health_care/pharmaceutical/pharmacist/b.3231.g.1267.html -http://yp.gates96.com/11/24/80/12.html -http://yp.gates96.com/11/24/80/18.html -http://yp.gates96.com/11/24/80/84.html -http://yp.gates96.com/11/24/80/90.html -http://yp.gates96.com/11/24/81/6.html -http://yp.gates96.com/11/24/81/9.html -http://yp.gates96.com/11/24/81/54.html -http://yp.gates96.com/11/24/81/74.html -http://yp.gates96.com/11/24/81/98.html -http://yp.gates96.com/11/24/82/17.html -http://yp.gates96.com/11/24/82/96.html -http://yp.gates96.com/11/24/83/54.html -http://yp.gates96.com/11/24/83/58.html -http://yp.gates96.com/11/24/84/44.html -http://yp.gates96.com/11/24/84/52.html -http://yp.gates96.com/11/24/84/63.html -http://yp.gates96.com/11/24/85/35.html -http://yp.gates96.com/11/24/85/77.html -http://yp.gates96.com/11/24/85/78.html -http://yp.gates96.com/11/24/87/15.html -http://yp.gates96.com/11/24/87/77.html -http://yp.gates96.com/11/24/88/0.html -http://yp.gates96.com/11/24/88/63.html -http://yp.gates96.com/11/24/89/93.html -http://www.iabusnet.org:90/forums/aca-1/dispatch.exe/survey/listUnseen/fol/100001/20,0/2498053 -http://www.zeenzone.com/movies/1,4003,1040-21565,00.html -http://www.zeenzone.com/movies/1,4003,1040-99354,00.html -http://www.zeenzone.com/movies/1,4003,1040-109493,00.html -http://forum.rai.it/aca-finestre/dispatch.cgi/FORUM/folderFrame/100001/0/author/627181 -http://moshkow.rsl.ru/alt/MORUA/letters.txt -http://members.tripod.co.jp/muttley2000/?M=A -http://www.shopworks.com/index.cfm/action/specials/userid/000A8C31-2EFD-19FE-9038010B0A0ADCF2 -http://www.bookhome.net/xiandangdai/other1/chunjiang/006.html -http://www.bookhome.net/xiandangdai/other1/chunjiang/013.html -http://www.dailyrush.dk/clans/145 -http://www.berlinonline.de/wissen/berliner_kurier/archiv/2000/0429/auto/0210/ -http://www.berlinonline.de/wissen/berliner_kurier/archiv/2000/0429/brandenburg/0011/ -http://www.berlinonline.de/wissen/berliner_kurier/archiv/2000/0429/lokales/0077/ -http://www.berlinonline.de/wissen/berliner_kurier/archiv/2000/0429/lokales/0009/ -http://www.berlinonline.de/wissen/berliner_kurier/archiv/2000/0429/lokales/0111/ -http://www.berlinonline.de/wissen/berliner_kurier/archiv/2000/0429/lokales/0117/ -http://www.berlinonline.de/wissen/berliner_kurier/archiv/2000/0429/lokales/0014/ -http://www.berlinonline.de/wissen/berliner_kurier/archiv/2000/0429/sport/0018/ -http://www.berlinonline.de/wissen/berliner_kurier/archiv/2000/0429/sport/0158/ -http://www.berlinonline.de/wissen/berliner_kurier/archiv/2000/0429/tv/0209/ -http://www.multicosm.com/facade/www.contigo.com/ -http://www.boston.digitalcity.com/cincinnati/health/conditions.dci?condition=sids -http://www.onlineathens.com/1998/041498/0414.a2zbriefs.html -http://ist.linux.tucows.com/conhtml/adnload/52224_1782.html -http://www.outpersonals.com/cgi-bin/w3com/pws/out/-2hIv4VApV7948YHO6tPdd62dgSdHSwg0xTrLhYidK4__IjhefvQTQrwpTMkkPdR5C5XRGbdA57_pJIxtMRvHJmrtjKdnzn_di6Er9p9vwIk1rLYwssqdvQbgeNAvSgd2M1a7O5NWleCth4ETxMfqPQS -http://www.outpersonals.com/cgi-bin/w3com/pws/out/VwhIXbmwUfG9PK362Tf07_xy8BQY7YBwNspFlCmPD_syQhuUcYEAU2eNoW3Liccn5fOj3JHbx2nCG9Tkl-PZwI9bR0uW5_3bO8O3kRwFm2Sp0E8MBNqJ9FvuLKt4pS_X3qzA8sbHcygn7lFrBe9ZZqi565Rs -http://www.crutchfield.com/cgi-bin/S-5ILchLS19Z9/auto.asp -http://www.quzhou.gov.cn/flfg.nsf/0a043ae26eb50247002564640039f21d/7cdda9dbc7e2b2bb002564ac00393b48!OpenDocument&ExpandSection=1,7,6 -http://opac.lib.ntnu.edu.tw/search*chi/m92+R627/m92+r627/-5,-1,0,B/buttonframe&F=m92+r449m&1,1 -http://www03.u-page.so-net.ne.jp/fc4/kazumasa/tdl/side2/side2.html -http://launchbase.com/Home/Personal_Organization/communication/information/Bank_Rates_&_Info.htm -http://launchbase.com/Home/Personal_Organization/communication/entertainment/Sports.htm -http://launchbase.com/Home/Personal_Organization/communication/shopping/Flowers.htm -http://launchbase.com/Home/Personal_Organization/communication/shopping/Pro-Audio.htm -http://www.nissan.co.jp/RENAULT-DEALERS/PASSPORT/view.cgi/admission/972959587-- -http://channel.nytimes.com/1998/10/15/technology/ -http://www.la.gunma-u.ac.jp/S97/thtml/m/kiso/41808.html -http://www1.ocn.ne.jp/~yaiba/_private/kobanasi/tyouhen/haraguroido/noroi.htm -http://www.duluxvalentine.com/FRANCE:1161209847:DFinity.1QJiP4jmPgipihoa -http://fi.egroups.com/messages/mediamalle-letter/6 -http://personal.wol.com.cn/lxz20a/gp13.htm -http://eclat.gaiax.com/www/eclat/y/k/yoko_mama/main.html -http://eclat.gaiax.com/www/eclat/y/k/yoko_mama/bbs.html -http://findmail.com/login.cgi?login_target=%2Fgroup%2Fohsama-iroiro -http://www.fogdog.com/cedroID/ssd3040183248487/crs/po__/wld/fogdog_sports/superfeet/outdoor/footwear/green_hi-profile.html -http://www.fogdog.com/cedroID/ssd3040183248487/nav/stores/baseball/ -http://www.fogdog.com/cedroID/ssd3040183248487/nav/stores/winter_sports/ -http://www.consource.com/members/signup/signup_temp_user.html?tAccountID=561 -http://213.36.119.69/do/session/152994/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/reserver/voit.htm -http://213.36.119.69/do/session/152994/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/BE_NL/ -http://webcvs.kde.org/cgi-bin/cvsweb.cgi/kdevelop/Attic/configure.in?r1=1.62&sortby=rev -http://webcvs.kde.org/cgi-bin/cvsweb.cgi/kdevelop/Attic/configure.in?annotate=1.53&sortby=rev -http://webcvs.kde.org/cgi-bin/cvsweb.cgi/kdevelop/Attic/configure.in?r1=1.46&sortby=rev -http://www.aelita.net/products/solutions/sitemap/Reg/QuoteRegister/solutions/products/default.htm -http://sunsite.org.uk/public/public/packages/pine/docs/?S=A -http://sunsite.org.uk/public/public/packages/pine/docs/QandA.txt -http://www.sfc.keio.ac.jp/~s98008na/miniproject/0.html -http://www.allkorea.co.jp/cgi-bin/allkorea.front/972959867760/Catalog/1000023 -http://www.msn.expedia.co.uk/wg/Africa/Mauritius/P39048.asp -http://l-infonet.phkk.fi/fi/TIETOPALVELUT/asiasanahaku/rakennesuunnittelu/talonrakennus/rakennukset/ohjeet/ -http://www.ericsson.cl/education/centers/dtmexic.shtml -http://ftp.gigabell.net/debian/dists/Debian2.2r0/main/binary-powerpc/web/?S=A -http://dirs.educationamerica.net/Colorado/Localities/C/Colorado_Springs/News_and_Media/Television/ -http://polygraph.ircache.net:8181/services/define/jeff/http_-2web01.hq.cyberserv.com/ryanhomes/http_-2www.travelsc.com/cgi-bin/news/NewsList.cfm?ID=1 -http://salinas2000.com/index.cfm/r/960/a/95.htm -http://213.36.119.69/do/session/152988/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www3.travelprice.com/voyages/recherche.phtml -http://213.36.119.69/do/session/152988/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/connaitre/questions-reponses.htm -http://ftp.cpan.org/src/5.0/sperl-2000-08-05/?D=A -http://virtualpubliclibrary.com/hallofanima/moresports/JOELOUIS.ORG//hallofanima/music/ -http://x500.rz.uni-karlsruhe.de:8000/Lcn%3dMonika%20Vogel,%20ou%3dPersonalabteilung,%20ou%3dUniversitaetsleitung%20und%20-verwaltung,%20o%3dUniversitaet%20Konstanz,%20c%3dDE -http://bsd.sinica.edu.tw/cgi-bin/cvsweb.cgi/ports/korean/pine/files/patch-ai?only_with_tag=RELEASE_2_2_2 -http://ftp.ring.gr.jp/archives/XFree86/4.0.1/binaries/Linux-ix86-glibc21/RELNOTES -http://homepage1.nifty.com/SAKURAISANS/itoshi.html -http://www.expage.com/savetucker -http://ring.edogawa-u.ac.jp/archives/pack/os2/prog/rexx/?N=D -http://www.saarreisen.de/rueckel-reisen/fluege-buchen/barbados/reise-ibiza.htm -http://debian.linux.org.tw/debian/dists/sid/contrib/binary-powerpc/interpreters/?S=A -http://ricoh.co.jp/rtoss/School/other/other/lotus_syo/pg7.html -http://www.kfi640.com/shared/mod_perl/looksmart/looksmart/eus1/eus52213/eus52841/eus236353/eus591199/eus937052/ -http://www.mapion.co.jp/custom/AOL/admi/23/23101/higashiyamatori/4chome/index-17.html -http://stocks.tradingcharts.com/stocks/charts/swti-bb/w/javachart -http://ftp.univ-lyon1.fr/gnu/Manuals/diffutils-2.7/html_chapter/diff_15.html -http://www.elfoco.com/EL_Foco/CDA/PrintPage/1,2171,2_53_28444,00.html -http://www.debian.org.cn/Bugs/db/61/61000.html -http://www.debian.org.cn/Bugs/db/66/66591.html -http://www.debian.org.cn/Bugs/db/57/57112.html -http://www.gxrb.com.cn/26/tbzl.htm -http://opac.lib.rpi.edu/search/dyosemite+national+park+water+resources+development+research+california/-5,-1,0,E/2browse -http://ring.omp.ad.jp/pub/NetBSD/NetBSD-current/src/usr.sbin/dhcp/client/scripts/openbsd -http://attach1.egroups.com/attach/1087162/28/gs-108=71=1087162/10-1-10-160/application=octet-stream/IntOrganist.htm -http://www.brainerddispatch.com/stories/071299/obi_0712990015.shtml -http://webusers.siba.fi/doc/HOWTO/en-html/Multi-Disk-HOWTO-27.html -http://www.pressa.spb.ru/newspapers/nevrem/arts/nevrem-1667-art-30.html -http://www4.ocn.ne.jp/~l-tommy/C1024.html -http://pub13.ezboard.com/fsequelossavannasoftwaredevelopment.showMessage?topicID=74.topic -http://pub13.ezboard.com/fsequelossavannasoftwaredevelopment.showMessage?topicID=109.topic -http://www.z-plus.de/freizeit/kino/galerie/unhold/kritikdpa.html -http://www.tiscover.com/1Root/Kontinent/6/Staat/7/Bundesland/16/Ort/515/Privatvermieter/326225/Homepage/m_homepage...2.html -http://wap.jamba.de/KNet/_KNet-NKE8j1-2Gd-13c6l/showInfo-wir.de/node.0/cde7f1uou -http://www.refdag.nl/kl/990706kl02.html -http://www.ferien-immobilien.de/nordrhein-Westfalen/soest/Verkauf/Versteigerungen-IB/Startseite/Gemeinsam/versicherungen/gebaeude/Versteigerungen-IB/Startseite/Gemeinsam/Super-Zins-Konditionen/anforderungsformular.htm -http://caller-times.com/1999/september/18/today/local_sp/78.html -http://link.fastpartner.com/do/session/600350/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/mondosoft.php -http://providenet.tukids.tucows.com/mac/9-12/adnload/11899_25711.html -http://providenet.tukids.tucows.com/mac/9-12/adnload/51475_24795.html -http://fivestar.subportal.com/sn/Network_and_Internet/Dial-up_Networking_Dialers/11735.html -http://www.kenley.londonengland.co.uk/newspaperandmagazinepublishers.htm -http://builder.hw.net/frmRestDir/0,1112,'1~21~325~1~C~013800~07790',00.html -http://builder.hw.net/frmRestDir/0,1112,'1~21~325~1~C~013800~54357',00.html -http://ftp1.support.compaq.com/public/vms/vax/v6.0/sls/2.6/?M=A -http://cpan.clix.pt/authors/id/I/IL/ILYAM/Mail-CheckUser-0.15.readme -http://www.maasvlakte-cam.nl/webcams/23/stavanger__norway/2000/10/12/?D=A -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/computers/music/midi/computers/quizz/lit/arnheim.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/computers/music/midi/computers/quizz/misc/colorart/ -http://www.taftp.com/A555D3/WebDir.nsf/MBC!OpenView&Start=89.2&Count=30&Expand=106 -http://jundavid.subportal.com/sn/Shell_and_Desktop/Animal_Cursors/11879.html -http://www.netitor.com/photos/schools/ucla/sports/m-wpolo/98-99action/?M=A -http://cpan.nitco.com/modules/by-module/Devel/MSCHWERN/Class-DBI-0.03.readme -http://cpan.nitco.com/modules/by-module/Devel/MSCHWERN/Text-Metaphone-0.02.readme -http://www.digitaldrucke.de/(aktuell,computer,gaestebuch,kino,literatur,nuernberg,rundfunk,sense,veranstaltungen,zeitschriften)/_fort/html/themen/kultur/literat/links/bin.htm -http://194.128.65.4/pa/cm199899/cmhansrd/vo990727/text/90727w01.htm -http://194.128.65.4/pa/cm199899/cmhansrd/vo990727/text/90727w15.htm -http://213.36.119.69/do/session/152989/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/jeux/jeux_himalaya.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/computers/misc/quizz/lit/misc/cv.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/computers/misc/quizz/lit/misc/lit/larme.html -http://www.hblb.org.uk/hblbweb.nsf/$Pages/NewsArchive1!OpenDocument&ExpandSection=6,7,3,5,1,8,11 -http://www.identer.co.kr/삶의여유/데이트정보/데이트정보/ -http://allmacintosh.arrakis.es/adnload/54801.html -http://link.fastpartner.com/do/session/600380/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/brleksaker.php -http://link.fastpartner.com/do/session/600380/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/local/redirect.php -http://icm.html.tucows.com/adnload/001-009-003-014.html -http://www.rakuten.co.jp/coffee/forum/forum-w.cgi?p=131&url=coffee -http://jxi.gov.cn/yw-cj001.nsf/6770fc9e7685796c482568c70008a30a!OpenView&Start=69&Count=30&Expand=70 -http://jxi.gov.cn/yw-cj001.nsf/6770fc9e7685796c482568c70008a30a!OpenView&Start=69&Count=30&Expand=72 -http://freehomepage.taconet.com.tw/This/is/taconet/top_hosts//tsyang/test9g.htm -http://www11.cplaza.ne.jp/babyweb/bbs/bdnm01/no33/130N.html -http://library.cuhk.edu.hk/search*chi/a憪���/a{213972}{213230}/-5,-1,0,B/frameset&F=a{213972}{213233}{215b34}&1,1 -http://library.cuhk.edu.hk/search*chi/a憪���/a{213972}{213230}/-5,-1,0,B/frameset&F=a{213972}{21323e}{213165}+1947&1,1 -http://library.cuhk.edu.hk/search*chi/a撱嗅ˊ,+904-975./a{213d32}{213877}++904++975/-5,-1,0,B/frameset&F=a{213d32}{213a67}{213779}{213455}+china+{215f7a}{213579}{213966}{21363e}{21435a}+{214241}{213c37}&1,1 -http://www.online.kokusai.co.jp/Service/V0043539/wrd/G200/service/service.html -http://quote.morningstar.com/Quote.html?ticker=GASFX -http://uoi.linux.tucows.com/x11html/adnload/9826_7194.html -http://dk.egroups.com/post/batoco?act=forward&messageNum=2017 -http://www.chaos.dk/sexriddle/b/h/l/o/h/ -http://www.picktips.com/category-1031-1174_1171_1170-4_3_2 -http://www.schmunzelecke.de/pic18.htm -http://sun1.rrzn-user.uni-hannover.de/zzzzgart/matlab/help/techdoc/umg/chhand20.html -http://sun1.rrzn-user.uni-hannover.de/zzzzgart/matlab/help/techdoc/umg/chhand25.html -http://sun1.rrzn-user.uni-hannover.de/zzzzgart/matlab/help/techdoc/umg/chhand30.html -http://sun1.rrzn-user.uni-hannover.de/zzzzgart/matlab/help/techdoc/umg/chimag16.html -http://sun1.rrzn-user.uni-hannover.de/zzzzgart/matlab/help/techdoc/umg/chimag26.html -http://sun1.rrzn-user.uni-hannover.de/zzzzgart/matlab/help/techdoc/umg/chlight3.html -http://sun1.rrzn-user.uni-hannover.de/zzzzgart/matlab/help/techdoc/umg/chspec34.html -http://sun1.rrzn-user.uni-hannover.de/zzzzgart/matlab/help/techdoc/umg/chspec35.html -http://sun1.rrzn-user.uni-hannover.de/zzzzgart/matlab/help/techdoc/umg/chview15.html -http://sun1.rrzn-user.uni-hannover.de/zzzzgart/matlab/help/techdoc/umg/chvolvi5.html -http://www.t-onlien.de/dtag/mail/kontaktseite/1,3606,160,00.html -http://yumemi.ne.jp/bbs/hiroba/ky/view/h/hiroba3/8_wdsmcn_wdsmcn.html -http://yumemi.ne.jp/bbs/hiroba/ky/view/h/hiroba3/8_mrlinl_tcincn.html -http://yumemi.ne.jp/bbs/hiroba/ky/view/h/hiroba3/8_caouny_hixlcy.html -http://students.lsu.edu/students/main.nsf/c81d2bf8cb0b80ff862566fb00105ab2/7f3436ae9cb1268886256773006f9288!OpenDocument&ExpandSection=20,9,13,16 -http://www.crn.com/sections/BreakingNews/breakingnews.asp?ArticleID=5760 -http://dennou-h.ees.hokudai.ac.jp/library/Linux/debian-jp/dists/hamm/main-jp/binary-all/tex/?M=A -http://www.cmyk21.com/photo1-3.htm -http://www.cs.ruu.nl/mirror/CPAN/modules/by-category/14_Security_and_Encryption/User/ILYAZ/images/?N=D -http://www.egroups.com/login.cgi?login_target=%2Fmessage%2FFloodsystems%2F45 -http://www.mirnet.org/ccsi/nisorgs/ukraine/kyiv/renaisnc.htm -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=231&discrim=2,125,10 -http://ring.omp.ad.jp/archives/lang/perl/CPAN/authors/id/BRADAPP/PodParser-1.17.readme -http://www.amzn.com.ref.digital-price.com/redir/amzn.com/prods/0553373730 -http://library.cwu.edu/search/dGermany+--+Politics+and+government+--+1918-1933/dgermany+politics+and+government+1918+1933/-5,-1,0,B/marc&F=dgermany+politics+and+government+1918+1933+bibliography&1,1, -http://www.multicosm.com/facade/www.unisys.com/partners/default.asp?cn=su -http://enjoy100.com.cn/200006/08/sssh/sssh_ssjp.html -http://enjoy100.com.cn/200006/08/yskj/b_s_big3_f.jpg.html -http://www.hoops.ne.jp/~zuikaku/photo2000/0811/rie11.html -http://pub23.ezboard.com/fiolaniy2kmessageboardfrm1.showMessage?topicID=66.topic -http://ring.htcn.ne.jp/archives/lang/perl/CPAN/modules/by-module/CGI/ULPFR/Wais-2.301.readme -http://www3.newstimes.com/archive99/mar1199/spg.htm -http://ftp1.support.compaq.com/public/vms/axp/v6.2-1h2/dsnlink/2.2/dsnlinkd022.CVRLET_TXT -http://ftp.nacamar.de/pub/redhat/cpan/6.2/CPAN-archive/doc/manual/html/pod/perldsc.html -http://ftp.nacamar.de/pub/redhat/cpan/6.2/CPAN-archive/doc/manual/html/pod/perlfaq5.html -http://info.cs.unitn.it/sdb/de/html/keylist.SOFTWARE.html -http://www.online.kokusai.co.jp/Mmf_corner/V0043545/mmf_corner/mmf_corner/url -http://www.office.com/global/0,2724,66-15915,FF.html -http://polygraph.ircache.net:8181/home/ISO9001.htm -http://www.allgemeine-immobilien-boerse.de/niedersachsen/emsland/Verkauf/Versteigerungen-IB/Startseite/Allgemeine-IB/GmbH-Kauf-Verkauf-Insolvenz-konkurs/Startseite/Gemeinsam/hilfe.htm -http://launchbase.com/Health/Home_Health/communication/information/Science.htm -http://library.cwu.edu/search/aLockyer,+Norman,+Sir,+1836-1920/alockyer+norman+sir+1836+1920/-17,-1,0,B/frameset&F=alockwood+victoria+s+1953&1,1 -http://bbs.kcm.co.kr/NetBBS/Bbs.dll/chbod05/lst/qqa/r/qqo/004D/zka/B2-kCYFl -http://www.egroups.com/post/bhagavad_gita?act=forward&messageNum=101 -http://carriage.de/Schoner/Literatur/info-e/Geschichte/modelle/ -http://carriage.de/Schoner/Literatur/info-e/Geschichte/history/ -http://carriage.de/Schoner/Literatur/info-e/Geschichte/literature/ -http://wwwftp.ciril.fr/pub/linux/kernel///people/andrea/kernels -http://www.inctechnology.com/guide/item/0,7462,AGD6_GDE79,00.html -http://live.sportsline.com/u/basketball/college/teams/injuries/VATECH.htm -http://www-1.cisco.com/univercd/cc/td/doc/product/lan/28201900/1928v67x/28icg67x/28icpref.pdf -http://www.hitlist.com/music/presult/003948.php3 -http://ip.tosp.co.jp/Eki/TosiE000.asp?I=Jerryfish -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=(20,0)-16,0-9,2 -http://www.bigchurch.com/cgi-bin/w3com/pws/bc/RLhIotYxW-B0bt7seq4d876RzKIuJDYbydJP1qooxhzSKDVca77BUHQv6tsO2JdNpkx837SBl7FHRIEy00rmcLBk9Y1kQEmni0_YSk5mrym8WALtovIPQU_vlEtiMcNswNyh9z6CjU-2oS2uurrk666t -http://www.secinfo.com/d2wVq.7hv.htm -http://www.secinfo.com/d2wVq.6yd.htm -http://www.secinfo.com/d2wVq.6Y5.htm -http://www.secinfo.com/d2wVq.5gf.htm -http://www.secinfo.com/d2wVq.5hp.htm -http://www.secinfo.com/d2wVq.5y4.htm -http://ring.htcn.ne.jp/pub/text/CTAN/graphics/psfig/unsupported/macdemo/macfigs/?N=D -http://ring.htcn.ne.jp/pub/text/CTAN/graphics/psfig/unsupported/macdemo/macfigs/?M=A -http://books.hyperlink.co.uk/xt2/Drakelow_Unearthed/Stokes/Paul/0904015408 -http://www.homestead.com/rebeccah/files/ -http://sunsite.compapp.dcu.ie/pub/linux/redhat/redhat-6.1/alpha/usr/share/locale/ga_IE/LC_TIME -http://www.gbnf.com/genealogy/rockwel4/html/d0037/I2684.HTM -http://www.yorosiku.net:8080/-_-http://www.dd.iij4u.or.jp/~oni9/skebe/aindex18.html -http://www.yorosiku.net:8080/-_-http://www.dd.iij4u.or.jp/~oni9/skebe/aindex12.html -http://www.yorosiku.net:8080/-_-http://www.dd.iij4u.or.jp/~oni9/skebe/atg05.html -http://shn.webmd.net/content/article/1700.50808 -http://home.clara.net/cornell/woodcraft/spring2000/contents.htm -http://dic.empas.com/show.tsp/EDACITY -http://www.sanxia.net/beauty/Eriimai/417.htm -http://www.judds-resort.com/judds/Lake-Winni-pike-lodge/97menu/fallphoto/playground/boat/photo/12.html -http://www.judds-resort.com/judds/Lake-Winni-pike-lodge/97menu/fallphoto/playground/boat/fallphoto/2.html -http://imageserver2.tibetart.com:8087/fif=fpxbuddhistreverse/56.fpx&init=0.0,0.0,1.0,1.0&rect=0.0,0.25,0.5,0.75&wid=1443&hei=400&lng=en_US&enablePastMaxZoom=OFF&page=image.html&obj=uv,1.0&cmd=W -http://www.jamba.nl/KNet/_KNet-krE8j1-KC4-pv5y/showInfo-hilfe.nl/node.0/ce6u2jadf -http://www.babyheirlooms.com/catalog/htmlos.cat/011639.1.3372173854 -http://community.webshots.com/photo/441160/441363 -http://www.kaos.dk/sexriddle/x/n/d/x/b/ -http://isbn.nu/088730866X/chapters -http://login.hq.cricinfo.org/link_to_database/ARCHIVE/1992-93/AUS_LOCAL/MMC/WA_NSW_MMC_11OCT1992.html -http://login.hq.cricinfo.org/link_to_database/ARCHIVE/1991-92/AUS_LOCAL/FAI/WA_TAS_FAI_11OCT1991.html -http://login.hq.cricinfo.org/link_to_database/ARCHIVE/1991-92/AUS_LOCAL/FAI/WA_QLD_FAI-SEMI_19OCT1991.html -http://login.hq.cricinfo.org/link_to_database/ARCHIVE/1980S/1987-88/AUS_LOCAL/MDC/WA_SOA_MDC_06MAR1988.html -http://login.hq.cricinfo.org/link_to_database/ARCHIVE/1980S/1981-82/AUS_LOCAL/MDC/QLD_WA_MDC_08NOV1981.html -http://www.chaos.dk/sexriddle/x/k/l/y/h/ -http://tucows.teihal.gr/winnt/preview/6004.html -http://tucows.teihal.gr/winnt/preview/5986.html -http://tucows.teihal.gr/winnt/preview/71328.html -http://tucows.teihal.gr/winnt/preview/2757.html -http://www.medoc-ias.u-psud.fr:81/synoptic/gif/950724/?N=D -http://www4.nas.edu/ohr.nsf/All+Documents/Major+Units?OpenDocument&ExpandSection=18,7,21,20,4 -http://members.xoom.fr/logart/Anciens/Liste25/Selection_Navlist25.html -http://polygraph.ircache.net:8181/http_-2www.arthritis.org/http_-2pathfinder.com/si/swimsuit/swim97/terms2.html -http://polygraph.ircache.net:8181/http_-2www.arthritis.org/http_-2pathfinder.com/si/swimsuit/swim97/products2.html -http://debian.linux.org.tw/debian/dists/Debian2.2r0/main/disks-m68k/current/doc/ -http://findmail.com/dir/Arts/Writing/Fan_Fiction?st=1943 -http://www.telecombroker.com/q/001p/tgcb/4izQYz7mc.htm -http://www.free-phone.com/q/001p/tgcb/ItMd2D3jdEM.htm -http://www.123bestlongdistance.com/q/001p/tgcb/msN54jfl4mE.htm -http://www.netitor.com/photos/schools/nw/sport/w-baskbl/97action/?S=A -http://excite.de/katalog/katalog/33823 -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/programs/simple/music/midi/lit/misc/unitest/programs/ -http://yp.gates96.com/14/43/40/9.html -http://yp.gates96.com/14/43/40/43.html -http://yp.gates96.com/14/43/40/82.html -http://yp.gates96.com/14/43/40/85.html -http://yp.gates96.com/14/43/41/6.html -http://yp.gates96.com/14/43/41/18.html -http://yp.gates96.com/14/43/41/44.html -http://yp.gates96.com/14/43/41/96.html -http://yp.gates96.com/14/43/42/12.html -http://yp.gates96.com/14/43/46/38.html -http://yp.gates96.com/14/43/46/66.html -http://yp.gates96.com/14/43/46/68.html -http://yp.gates96.com/14/43/47/4.html -http://yp.gates96.com/14/43/47/37.html -http://yp.gates96.com/14/43/47/64.html -http://yp.gates96.com/14/43/47/68.html -http://yp.gates96.com/14/43/47/70.html -http://yp.gates96.com/14/43/48/68.html -http://yp.gates96.com/14/43/48/69.html -http://yp.gates96.com/14/43/49/7.html -http://yp.gates96.com/14/43/49/36.html -http://yp.gates96.com/14/43/49/37.html -http://yp.gates96.com/14/43/49/52.html -http://sound-dist.secured.co.uk/cgi-bin/psProdDet.cgi/5P005|972959562|Accessories|user|0|1,0,0,1 -http://school.educities.org/card/judy180.html -http://207.138.41.133/message/the-voice1/123 -http://207.138.41.133/message/the-voice1/124 -http://www-d0.fnal.gov/d0dist/dist/releases/p05.00.00/muo_analyze/?S=A -http://sjsulib1.sjsu.edu:81/search/cernest+haberkern+director/-5,-1,0,B/frameset&cgeorge+miller+director&1,1 -http://ring.nii.ac.jp/pub/pack/x68/net/00_index.txt -http://pub24.ezboard.com/fdoyoustillneedtoventfrm43.showMessage?topicID=19.topic -http://pub24.ezboard.com/fdoyoustillneedtoventfrm43.showMessage?topicID=15.topic -http://ukinvest.ukwire.com/articles/200007200700261473O.html -http://www.brd.net/brd-cgi/brd_multimedia/lautsprecher/LZ7460LK/ci=972822952.htm -http://my.netian.com/~haeng14/tatler_july6.htm -http://genforum.genealogy.com/cgi-genforum/forums/anderton.cgi?122 -http://www.excelsior.com.mx/0001/000125/for03.html -http://www.jobvillage.com/channel/jobs/sciences/b.9070.g.1675.html -http://us.mandrakesoft.com/cgi-bin/cvsweb.cgi/www/contact.html?annotate=1.19&sortby=author -http://us.mandrakesoft.com/cgi-bin/cvsweb.cgi/www/contact.html?r1=1.12&sortby=author -http://www.doc.ic.ac.uk/lab/labsrc_area/firstyear/submissions/1998-99/jmc1/labs/Ex06/skw98/?N=D -http://www.jamba.de/KNet/_KNet-fNw8j1-6Fd-13acp/browse.de/node.0/cde7f1uou -http://www.jamba.de/KNet/_KNet-fNw8j1-6Fd-13act/browse.de/node.0/cdel3j591 -http://www.nedstat.nl/cgi-bin/viewstat?name=mrbertmat -http://no.egroups.com/message/acessibilidade/1092 -http://no.egroups.com/message/acessibilidade/1099 -http://sound-dist.secured.co.uk/cgi-bin/psShop.cgi/add|38P08A|972959552|Communications|user|0|1,0,0,1 -http://213.36.119.69/do/session/152990/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/reserver/spectacles/ -http://213.36.119.69/do/session/152990/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/CA_EN/ -http://wiki2.parsimony.net/wiki2954/ -http://www.f2.parsimony.net/forum2954/messages/214.htm -http://www.f2.parsimony.net/forum2954/messages/181.htm -http://www.f2.parsimony.net/forum2954/messages/292.htm -http://www.f2.parsimony.net/forum2954/messages/115.htm -http://www.f2.parsimony.net/forum2954/messages/290.htm -http://www.f2.parsimony.net/forum2954/messages/54.htm -http://home.pchome.com.tw/cool/162203/wunew15.htm -http://hem.fyristorg.com/lottaleman/LLfar/1_6721.htm -http://www.babyheirlooms.com/catalog/htmlos.cat/011628.1.4596216338 -http://www.affiliate.hpstore.hp.co.uk/do/session/380833/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/search.asp -http://www.outdoorwire.com/content/lists/dirt/200007/msg00127.html?{LoadingFrameset} -http://adept.subportal.com/sn/Programming/ActiveX/11674.html -http://www.staroriental.net/nav/soeg/ihf,aog,s0,10,Lam+Hei-Lui.html -http://www-d0.fnal.gov/d0dist/dist/releases/p05.00.01/man/?N=D -http://members.tripod.com/bluti/PSX/V/VACUUM.HTM -http://connexus.tucows.com/winme/adnload/138384_29728.html -http://wwwtios.cs.utwente.nl/archive/wilyfans/msg00265.html -http://custom.clubnet.zeelandnet.nl/eckhardt/myself.htm -http://ftp.tokyonet.ad.jp/pub/Linux/debian/dists/potato/contrib/binary-arm/otherosfs/?D=A -http://www.amcity.com/charlotte/stories/1997/07/07/daily4.html?t=email_story -http://www.generation-formation.fr/chiffrec.htm---o21zAo0UbDo0Ol9A074fo6Td4ezyr6feZJPAPfVbNyqHSezTHkekydMfeZJPdspt6dsSAtdsNhJdspt6dsrvrdjlhkfbi.htm -http://tv.thevines.com/leaf/AA0000369140/2 -http://kuyper.calvin.edu/fathers2/NPNF2-02/Npnf2-02-06.htm -http://www.intellicast.com/Ski/World/UnitedStates/Southeast/Florida/FortWaltonBeach/TEMPcast/d0_12/ -http://stevebarnes.studiostore.com/aboutus/b.EMERCH/s.P01EBK2I -http://student.monterey.edu/Students_N-R/richterheidil/private/ -http://ds.dial.pipex.com/town/drive/kch36/select/s30/ch052.html -http://ds.dial.pipex.com/town/drive/kch36/select/s30/ch027.html -http://ds.dial.pipex.com/town/drive/kch36/select/s30/ch077.html -http://ds.dial.pipex.com/town/drive/kch36/select/s30/ch092.html -http://soneraplaza.tucows.com/winme/adnload/137026_28536.html -http://www.egroups.com/post/realtyindia -http://www.kita.or.kr/untpdc/incubator/zwe/tphar/ZIMB0037.htm -http://citeseer.nj.nec.com/nrelated/126165/187254 -http://citeseer.nj.nec.com/cachedpage/187254/1 -http://citeseer.nj.nec.com/cidcontext/2417551 -http://yp.gates96.com/13/6/1/36.html -http://yp.gates96.com/13/6/1/61.html -http://yp.gates96.com/13/6/1/83.html -http://yp.gates96.com/13/6/1/91.html -http://yp.gates96.com/13/6/3/39.html -http://yp.gates96.com/13/6/3/45.html -http://yp.gates96.com/13/6/3/65.html -http://yp.gates96.com/13/6/4/46.html -http://yp.gates96.com/13/6/4/57.html -http://yp.gates96.com/13/6/5/44.html -http://yp.gates96.com/13/6/6/21.html -http://yp.gates96.com/13/6/6/42.html -http://yp.gates96.com/13/6/7/0.html -http://yp.gates96.com/13/6/7/30.html -http://yp.gates96.com/13/6/7/69.html -http://yp.gates96.com/13/6/7/82.html -http://yp.gates96.com/13/6/8/5.html -http://yp.gates96.com/13/6/8/98.html -http://yp.gates96.com/13/6/9/45.html -http://home.wanadoo.nl/hockeyclub.nieuwegein/Teams/Dames/Dames_IV/body_dames_iv.html -http://pub3.ezboard.com/fthe4thdimensiongeneralinsanity.subscribeUnregisteredToTopic?topicID=38.topic -http://pub3.ezboard.com/fthe4thdimensiongeneralinsanity.unsubscribeUnregisteredToTopic?topicID=38.topic -http://moviestore.zap2it.com/help_shipping/s.hXCLyc56 -http://www.geocities.co.jp/Outdoors/2363/typoon1.html -http://ua.php.net/manual/it/function.pg-numrows.php -http://kidneyfailure.shn.net/roundtable_reply/727640 -http://itcareers.careercast.com/texis/it/itjs/+HwwBmje0B-deZqwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewyPxGwproqamn5otDnGaoDm15BGowcamn5otDapGdm1qBamnVncdpa5dhBiwGna5BGwBnton5ah1DqBodDanD51GnaMFqnFZI0DzmzwwwpBmje0B-deZqwww5rmeZpwwwBrmeZpwww/morelike.html -http://itcareers.careercast.com/texis/it/itjs/+lwwBmex6D86egqwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewyPxGwproqamn5otDnGaoDm15BGowcamn5otDapGdm1qBamnVncdpa5dhBiwGna5BGwBnton5ah1DqBodDanD51GnaMFqnFZI0DzmzwwwpBmje0B-deZqwww5rmeacwwwBrmeZpwww/morelike.html -http://pub23.ezboard.com/fhardoverclockfrm1.showAddReplyScreenFromWeb?topicID=43.topic&index=3 -http://www.adquest3d.com/content.cfm?BRD=1578&PAG=63 -http://pelit.saunalahti.fi/.1/tucows/adnload/51_28438.html -http://pelit.saunalahti.fi/.1/tucows/preview/70307.html -http://www.maillist.com.tw/maillist/publicboard_newform.pl?maillist_id=softuse -http://dennou-t.ms.u-tokyo.ac.jp/arch/cc-env/Linux/debian-jp/dists/woody/non-free-jp/binary-alpha/news/?M=A -http://ustlib.ust.hk/search*chi/amarcot+bruce+g/amarcot+bruce+g/-5,-1,0,B/frameset&F=amarcotty+michael+1931&1,1 -http://wine.cc.chuo-u.ac.jp/home/pub/TeX/CTAN/support/rtf2tex/?M=A -http://netchief.tucows.com/winme/preview/75911.html -http://yp.gates96.com/4/57/60/83.html -http://yp.gates96.com/4/57/60/99.html -http://yp.gates96.com/4/57/62/17.html -http://yp.gates96.com/4/57/62/88.html -http://yp.gates96.com/4/57/63/9.html -http://yp.gates96.com/4/57/63/39.html -http://yp.gates96.com/4/57/63/64.html -http://yp.gates96.com/4/57/64/33.html -http://yp.gates96.com/4/57/65/41.html -http://yp.gates96.com/4/57/65/70.html -http://yp.gates96.com/4/57/66/18.html -http://yp.gates96.com/4/57/66/56.html -http://yp.gates96.com/4/57/66/61.html -http://yp.gates96.com/4/57/66/94.html -http://yp.gates96.com/4/57/67/0.html -http://yp.gates96.com/4/57/67/63.html -http://yp.gates96.com/4/57/67/85.html -http://yp.gates96.com/4/57/69/1.html -http://yp.gates96.com/4/57/69/56.html -http://citeseer.nj.nec.com/cs?q=dbnum%3D1,DID%3D9262,qtype%3Dsamesite: -http://citeseer.nj.nec.com/cidcontext/163444 -http://www.amazon.com.au/exec/obidos/change-style/tg/stores/detail/-/books/0873995562/e-mail-friend/ -http://www.sdinfonet.com.cn/411/24/411249999.htm -http://pub14.ezboard.com/fallpodsgotoroswellsayhello.threadControl?topicID=17.topic -http://in.egroups.com/message/sexualidades-noticias/14 -http://in.egroups.com/message/sexualidades-noticias/37 -http://library.cuhk.edu.hk/search*chi/dChinese+literature+--+20th+century+--+Periodicals/dchinese+literature+++20th+century+periodicals/-5,-1,0,B/frameset&F=dchinese+literature+++20th+century+periodicals&26,,188 -http://www.3w-zeitschriften.de/EyreLinda/EyreLinda1582380570.htm -http://cometweb01.comet.co.uk/do!session=132027&vsid=700&tid=20&cid=37030&mid=1000&rid=1060&chid=1713&url=eqqLmwlGltt5tkjHfZoLlplLcqkKZljLlfb5lal5tkiLlXaLl0 -http://retailer.gocollect.com/do/session/1912774/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/contact.asp -http://providenet.games.tucows.com/adnload/71993_40744.html -http://www.geocities.co.jp/playtown-Toys/6366/bbsp.html -http://www.hnby.com.cn/docroot/jzrb/200001/19/km01/19031711.htm -http://213.36.119.69/do/session/152997/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/IT_IT/ -http://www.jamba.de/KNet/_KNet-p7t8j1-FEd-139gj/showInfo-datenschutz.de/node.0/cde7f1uou -http://www.jamba.de/KNet/_KNet-p7t8j1-FEd-139gn/browse.de/node.0/cdzqggtyb -http://www.paidmania.com/getpaid/signup/42/2518 -http://www.pressa.spb.ru/newspapers/nevrem/arts/nevrem-1679-art-13.html -http://jproxy.uol.es/jproxy/http://jama.ama-assn.org/issues/current/related/joc00479.html -http://www.mirror.kiev.ua:8082/paper/2000/11/1251/text/11-08-2.htm -http://my.netian.com/~eco71/wzmain.html -http://www.craft-supplies.co.uk/cgi-bin/psProdDet.cgi/HT206|972959540|Deluxe_Dividers|user|0|0,0,1,1 -http://www.trax.nilex.co.uk/trax.cgi/A1S/1AR/A3R/B3D/A4R/A4S/ -http://www.linux.com/networking/network/network/development/project/growth/ -http://www.linux.com/networking/network/development/project/growth/sales/ -http://www.icopyright.com/1.1653.134616 -http://retailer.gocollect.com/do/session/1912718/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/about.asp -http://www.dw-tv.de/indonesia/sari_pers/19793.html -http://freethemes.netc.pt/skins/icq/preview/44470.html -http://freethemes.netc.pt/skins/icq/adnload/26145.html -http://freethemes.netc.pt/skins/icq/preview/52524.html -http://freethemes.netc.pt/skins/icq/adnload/52040.html -http://students.lsu.edu/students/main.nsf/c81d2bf8cb0b80ff862566fb00105ab2/7f3436ae9cb1268886256773006f9288!OpenDocument&ExpandSection=7,18,9,16 -http://golfonline.comfluent.net/cgi.pan$player&pga93&John_Morse&pga?golfstats -http://wai.camera.it/_presidenti/003.htm -http://www.pcmagazine.de/produkte/artikel/komp/200003/mainboards01_00-wc.html -http://www.pcmagazine.de/produkte/artikel/komp/199908/asus_00-wc.html -http://se.sslug.dk/emailarkiv/locale/2000_09/msg00053.html -http://se.sslug.dk/emailarkiv/locale/2000_09/msg00057.html -http://se.sslug.dk/emailarkiv/locale/2000_09/msg00115.html -http://www.brio.de/BRIO.catalog/39fe2f7406fad828273fd472aa7806ff/UserTemplate/8 -http://link.fastpartner.com/do/session/600389/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/jobpilot.php -http://www.shopworks.com/grizzlygulch/index.cfm/action/search/userid/000B40E3-1177-19FE-A703010D0A0A8CF2 -http://www.shopworks.com/grizzlygulch/index.cfm/action/product/prodid/0001AF94-3FC3-19E7-A703010D0A0A8CF2/userid/000B40E3-1177-19FE-A703010D0A0A8CF2 -http://spiritwolf52.subportal.com/sn/Web_Authoring/Misc__Programming_Tools/2670.html -http://www.chaos.dk/sexriddle/o/g/j/h/t/ -http://link.fastpartner.com/do/session/600394/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/learn/ -http://opac.lib.rpi.edu/search/dpolitical+corruption+united+states/-5,-1,0,B/frameset&dpolitical+corruption+united+states&7,,22 -http://cnnsi.com/baseball/mlb/news/2000/01/28/ -http://amrr.com/agents/contact.html?Agents_id=3707 -http://www.dulux.co.uk/UKRETAIL:1489107816:DFinity.1QJiP4jMomdkbEc -http://www.geocities.com/SiliconValley/Screen/9059/ -http://www.nrk.no/finnmark/x17_4_96/nyh4.htm -http://in.egroups.com/message/islaam/288 -http://www.incestpornstories.com/knocked-upepisiotomy/fertileoff-the-rag/one-night-standlubrication/japaneseslanted-eyes/{storieslink} -http://kuyper.calvin.edu/fathers2/ANF-04/anf04-30.htm -http://wuarchive.wustl.edu/systems/unix/NetBSD/NetBSD-release/src/sys/arch/sun3/stand/bootxx/ -http://polygraph.ircache.net:8181/services/define/noframes/http_-2www.microsoft.com/ie/download/http_-2www.microsoft.com/infoserv/about.html -http://pub23.ezboard.com/fferion80369frm4.showMessage?topicID=192.topic -http://pub23.ezboard.com/fferion80369frm4.showMessage?topicID=182.topic -http://www.cs.ruu.nl/mirror/CPAN/authors/id/N/NO/?S=A -http://yp.gates96.com/1/40/30/16.html -http://yp.gates96.com/1/40/30/72.html -http://yp.gates96.com/1/40/30/99.html -http://yp.gates96.com/1/40/31/25.html -http://yp.gates96.com/1/40/31/42.html -http://yp.gates96.com/1/40/31/54.html -http://yp.gates96.com/1/40/31/61.html -http://yp.gates96.com/1/40/31/95.html -http://yp.gates96.com/1/40/32/39.html -http://yp.gates96.com/1/40/32/88.html -http://yp.gates96.com/1/40/32/92.html -http://yp.gates96.com/1/40/33/33.html -http://yp.gates96.com/1/40/34/24.html -http://yp.gates96.com/1/40/34/51.html -http://yp.gates96.com/1/40/34/62.html -http://yp.gates96.com/1/40/34/72.html -http://yp.gates96.com/1/40/35/38.html -http://yp.gates96.com/1/40/36/80.html -http://yp.gates96.com/1/40/36/98.html -http://yp.gates96.com/1/40/37/35.html -http://yp.gates96.com/1/40/37/89.html -http://yp.gates96.com/1/40/38/13.html -http://yp.gates96.com/1/40/38/67.html -http://yp.gates96.com/1/40/39/8.html -http://yp.gates96.com/1/40/39/11.html -http://yp.gates96.com/1/40/39/42.html -http://netway.pda.tucows.com/palm/preview/33466.html -http://netway.pda.tucows.com/palm/preview/70276.html -http://netway.pda.tucows.com/palm/adnload/76963_22012.html -http://netway.pda.tucows.com/palm/preview/33676.html -http://www.private-immobilien-boerse.de/berlin-immobilien/verkauf/Private-IB/Startseite/Gemeinsam/versicherungen/gebaeude/Gemeinsam/Immolink/Gemeinsam/Super-Zins-Konditionen/anforderungsformular.htm -http://www.ne.jp/asahi/matinami/gallery/mati/hokkaido/hakodate/ph_l011.html -http://www.findarticles.com/cf_0/m0EKF/14_46/61415465/p1/article.jhtml -http://www.trax.nilex.co.uk/trax.cgi/A1C/A2S/B1S/B1L/B4S/A1S/ -http://students.lsu.edu/students/main.nsf/c81d2bf8cb0b80ff862566fb00105ab2/7f3436ae9cb1268886256773006f9288!OpenDocument&ExpandSection=1,21,16,5 -http://students.lsu.edu/students/main.nsf/c81d2bf8cb0b80ff862566fb00105ab2/7f3436ae9cb1268886256773006f9288!OpenDocument&ExpandSection=18,21,16,5 -http://ddb.libnet.kulib.kyoto-u.ac.jp/exhibit/fl3/image/fl3lhf/fl3lh0344.html -http://www.trnonline.com/archives/2000archives/04072000/sports/26732.shtml -http://www.linux.com/networking/network/new/press_release/management/editor/ -http://www.linux.com/networking/network/new/press_release/management/experiences/ -http://jundavid.subportal.com/sn/Business/Misc__Phone_Tools/index3.html -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=27,9,23,14,19 -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/music/misc/thoughts/lit/music/midi/mirroring.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/music/misc/thoughts/lit/music/midi/legendes/ -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/music/misc/thoughts/lit/music/midi/lit/laurent.txt -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/music/misc/thoughts/lit/music/midi/misc/colorart/ -http://www.lz.gs.cninfo.net/news/shenghuo/messages/361.html -http://www.egroups.com/messages/skarmflyg/683 -http://www.egroups.com/message/skarmflyg/675 -http://www.egroups.com/message/skarmflyg/681 -http://www.genoma.de/shop/0d79e8c12cc42ea8242eafc8a0c5586a/99/b -http://travelocity-dest.excite.com/Vacations/Reviews/Cruise/Submit/1,2586,0_228__,00.html -http://www02.geocities.co.jp/HeartLand-Sakura/1068/history.html -http://www.streetprices.com/Electronics/Computer_Software_PC/Programming/MAKE+DIGITAL/sortproductbyhighprice/SP275945.html -http://www.streetprices.com/Electronics/Computer_Software_PC/Programming/MAKE+DIGITAL/sortproductbyhighprice/SP246217.html -http://www.emerchandise.com/help_privacy/b.TV%20SATNIGHTLIVE/s.BOkfj8Vk -http://ftp.ccu.edu.tw/pub/documents/faq/mail/setup/?S=A -http://iceberg.adhomeworld.com/cgi-win/redirect.exe/304063772 -http://pdacentral.zeelandnet.nl/rim/email_license.htm -http://pdacentral.zeelandnet.nl/rim/adnload/139471_47673.html -http://www.loisirs.ch/tfhglx/17/ltxeld.html -http://au.yahoo.com/Business_and_Economy/Shopping_and_Services/Health/Providers/By_Region/U_S__States/Mississippi/Cities/ -http://sound-dist.secured.co.uk/cgi-bin/psProdDet.cgi/15P02A|972959527|Helmet|user|0|1,0,0,0 -http://news.dreamwiz.com/news_lg/04/20001030/yonhap/200010301014041007292.html -http://news.dreamwiz.com/news_lg/04/20001028/yonhap/ -http://pds.nchu.edu.tw/cpatch/ftp/ftpnav/?D=A -http://members.tripod.lycos.co.kr/BONGBAE/?N=D -http://www9.hmv.co.uk:5555/do/session/1347758/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/departments/d50_sd0_pt0.html -http://itcareers.careercast.com/texis/it/itjs/+xwwBmeHWD86YwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewDhmoBGnaqdGpdGwBodDarGo5awDwcO5Baiw5roDtBdDaGn31n5BaGn31oGnmamnVncdpar1MwDaGn5d1Gqn5aMFqhTfR20DzmehrwwwpBmefWD86mwww5rmeddwwwBrmeZpwww/morelike.html -http://www.3w-buecher.de/GibbonsRob/GibbonsRob1572152214.htm -http://sennka.hoops.livedoor.com/%91%90%8a%a0%93%fa%98a%81%f4.htm -http://www.uni-duesseldorf.de/ftp/ftp/pf/s/netscape-v451/?S=A -http://www.outpersonals.com/cgi-bin/w3com/pws/out/0nhIQeA1Kelaujy0pUaBOo2AAoNruJ7MPpvxwl5qu-YeCeEn6SDc5vURHb5rk8dZP84c_4bSWkIDaPe8dCV5mfxj4LA69UDbXc_J2Z-eZg7dURZLZinceqCXYFUYC4pqT29R1BQKpdPvHP0APgIYRhQG -http://208.178.109.85/msgshow.cfm/msgboard=4779506785434&msg=80064825094809&page=1&idDispSub=-1 -http://interbox.tucows.com/preview/61367.html -http://www.crutchfield.com/cgi-bin/S-CI62JsDkHYX/viewcart.asp -http://www.hig.se/(aconf,formoutput,if,modified,set_cookie)/~jackson/roxen/ -http://www.trax.nilex.co.uk/trax.cgi/A1C/1AS/B1D/A3L/A1S/1AR/ -http://www.trax.nilex.co.uk/trax.cgi/A1C/1AS/B1D/A3L/A1S/C1R/ -http://www.trax.nilex.co.uk/trax.cgi/A1C/1AS/B1D/A3L/A1S/B4L/ -http://www.haikou.hi.cn/pandect/nj/n96ei3.htm -http://se.egroups.com/message/dailydreamers/36 -http://sunsite.org.uk/Mirrors/ftp.cdrom.com/pub/linux/slackware/contrib/contrib-sources/gcc-2.7.2.3/ -http://hp-partner.whowhere.lycos.com/hp/excite/Online_Communities/Angelfire/wi/index9.html -http://www.cse.unsw.edu.au/archives/linux/redhat/beta/?M=A -http://www.webcrawler.com/entertainment/music/artists_and_genres/folk_and_acoustic/artists_s/simon_and_garfunkel/garfunkel_art/interviews/ -http://www.russ.ru:8081/journal/media/98-05-21/telen0.htm -http://www.chaos.dk/sexriddle/x/r/k/o/w/ -http://www.jt.com.br/noticias/98/06/22/sd2.htm -http://retailer.gocollect.com/do/session/1912734/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/product_display/gifts/gift_floor.asp -http://www.ualberta.ca/CNS/RESEARCH/Software/SAS/gis/z0782606.htm -http://www.sentientnet.com/univercd/cc/td/doc/product/rtrmgmt/bluelist/cwblue21/cwbwsug/features.htm -http://pub5.ezboard.com/fthekojiroestrogenbrigadeconsolegaming.threadControl?topicID=16.topic -http://www.zjrs.zei.gov.cn/economy/text/policy/LHB/LHBA0909.TXT -http://seascape.tucows.com/winnt/adnload/2060_29646.html -http://seascape.tucows.com/winnt/adnload/2063_29648.html -http://seascape.tucows.com/winnt/adnload/2066_29651.html -http://ben.aspads.net/ex/c/641/517693268 -http://yp.gates96.com/7/63/80/20.html -http://yp.gates96.com/7/63/80/22.html -http://yp.gates96.com/7/63/80/80.html -http://yp.gates96.com/7/63/80/87.html -http://yp.gates96.com/7/63/81/50.html -http://yp.gates96.com/7/63/81/77.html -http://yp.gates96.com/7/63/81/79.html -http://yp.gates96.com/7/63/81/91.html -http://yp.gates96.com/7/63/82/36.html -http://yp.gates96.com/7/63/82/73.html -http://yp.gates96.com/7/63/84/6.html -http://yp.gates96.com/7/63/84/91.html -http://yp.gates96.com/7/63/85/30.html -http://yp.gates96.com/7/63/85/57.html -http://yp.gates96.com/7/63/85/98.html -http://yp.gates96.com/7/63/89/13.html -http://yp.gates96.com/7/63/89/20.html -http://yp.gates96.com/7/63/89/32.html -http://yp.gates96.com/7/63/89/65.html -http://www.rarf.riken.go.jp/archives/tex-archive/macros/latex//contrib/supported/linguex/?M=A -http://members.tripod.com/shelly34/shellyphotos/page12.html -http://ftp.nsysu.edu.tw/Unix/Perl/modules/by-category/23_Miscellaneous_Modules/Bundle/PlRPC-0.2003.readme -http://www.affiliate.hpstore.hp.co.uk/do/session/380827/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/SMARTTIPS/vacationcards.asp -http://www.marktplatz-hs.de/cgi-bin/ChioEditionShop.s/39fe2ee3005fd9642740d47540f806e1/IconBar -http://home.sprynet.com/~keithco/london.htm -http://earth.collectingnation.com/cgi-bin/bn/post.mod/aupn?B=cna&R=48 -http://earth.collectingnation.com/cgi-bin/bn/post.mod/aupn?B=cna&R=38 -http://www.realize.com/am747b81.htm,qt=e784fe2f=2a38a234-e-1adebfb-80000000-0-0-3-- -http://www.opengroup.com/dfbooks/009/0091856140.shtml -http://www.egroups.org/message/fotografya/216 -http://www.cn.informatik.fh-furtwangen.de/studenten/dv_labor/onlinebuecher/php/function.yaz-errno.html -http://www.cn.informatik.fh-furtwangen.de/studenten/dv_labor/onlinebuecher/php/function.yaz-hits.html -http://www.cn.informatik.fh-furtwangen.de/studenten/dv_labor/onlinebuecher/php/function.yaz-wait.html -http://www.catholicstore.com/search/index.cfm/FuseAction/detailSearch/SKU/17311/category/Bo/subCategory/G/subject/1 -http://www.cc.ntut.edu.tw/~584ce040/anne-1.htm -http://www.intervoz.com.ar/2000/09/23/sociedad_n11.htm -http://pub22.ezboard.com/frecipegoldminesharearecipe.showAddReplyScreenFromWeb?topicID=4.topic -http://opencity.kulichki.ru/moshkow/PROZA/LIPSKEROV/okno.txt -http://www.tccomputers.com/cgi-bin/bp/1021890426/products/modems/modems.htm -http://www.tccomputers.com/cgi-bin/bp/1021890426/services/sitemap.htm -http://library.bangor.ac.uk/search/dCrystallography+--+Periodicals/dcrystallography+periodicals/-5,-1,0,B/frameset&F=dcrystallography+mathematical&8,,9 -http://music.excite.ca/artist/-264813 -http://www.gameboyz.com/g/review_465_p4_n3.html -http://library.cwu.edu/search/aCarande,+Robert/acarande+robert/-5,-1,0,B/2exact&F=acarande+robert&1,2 -http://www.townstuff.com/search.cfm?directory=1040&town=285 -http://bsd.sinica.edu.tw/cgi-bin/cvsweb.cgi/ports/graphics/png/files/patch-aa?only_with_tag=RELEASE_2_2_7 -http://www.amcity.com/columbus/stories/1997/07/07/focus6.html?t=email_story -http://retailer.gocollect.com/do/session/1912716/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/checkout/shopping_cart.asp -http://ds.dial.pipex.com/town/drive/kch36/select/s12/ch034.html -http://ds.dial.pipex.com/town/drive/kch36/select/s12/ch118.html -http://www.dbring.de/160/16005-09.html -http://198.103.152.100/search*frc/lHQ+769+E3614/lhq++769+e3614/7,-1,0,B/frameset&F=lhq++777.4+d47&1,1 -http://yp.gates96.com/7/27/70/14.html -http://yp.gates96.com/7/27/70/27.html -http://yp.gates96.com/7/27/70/35.html -http://yp.gates96.com/7/27/70/37.html -http://yp.gates96.com/7/27/70/62.html -http://yp.gates96.com/7/27/71/38.html -http://yp.gates96.com/7/27/71/80.html -http://yp.gates96.com/7/27/72/62.html -http://yp.gates96.com/7/27/72/80.html -http://yp.gates96.com/7/27/73/10.html -http://yp.gates96.com/7/27/73/61.html -http://yp.gates96.com/7/27/73/78.html -http://yp.gates96.com/7/27/74/7.html -http://yp.gates96.com/7/27/74/16.html -http://yp.gates96.com/7/27/75/62.html -http://yp.gates96.com/7/27/76/90.html -http://yp.gates96.com/7/27/77/7.html -http://yp.gates96.com/7/27/77/92.html -http://yp.gates96.com/7/27/78/21.html -http://yp.gates96.com/7/27/79/21.html -http://yp.gates96.com/7/27/79/57.html -http://yp.gates96.com/7/27/79/96.html -http://moviestore.zap2it.com/help/b.STARWARSSAGA%20STARWARS-ROJ/s.nrF6V2sr -http://www2.kbank.no/Web/nlpublish.nsf/Published/ord_og_uttrykk!OpenDocument&ExpandSection=8,27,13,5 -http://newspaper.swww.com.cn/1999/cdwb/199912/26/html/1003.html -http://newspaper.swww.com.cn/1999/cdwb/199912/26/html/1008.html -http://iworld.freethemes.com/adnload/77752.html -http://iworld.freethemes.com/adnload/15251.html -http://iworld.freethemes.com/adnload/54697.html -http://iworld.freethemes.com/adnload/15232.html -http://www.fogdog.com/cedroID/ssd3040183238457/nav/products/ice_hockey/1d/gear_accessories/ -http://www.ftp.uni-erlangen.de/pub/Linux/DEBIAN/dists/Debian2.2r0/main/binary-m68k/doc/ -http://www.ftp.uni-erlangen.de/pub/Linux/DEBIAN/dists/Debian2.2r0/main/binary-m68k/sound/ -http://library.cwu.edu/search/aThimbleby,+Harold/athimbleby+harold/-5,-1,0,B/exact&F=athilde+jean&1,2 -http://www5.pconline.com.cn/pcedu/soft/doc/001024/2.htm -http://member.nifty.ne.jp/kaito-mist/nifty5.htm -http://www.cc.yamaguchi-u.ac.jp/~archive/doc/jdk1.2.2/docs/api/java/awt/image/BandedSampleModel.html -http://www.sandiego.digitalcity.com/honolulu/arts/occurrence.dci?ecid=75 -http://ubahn.exit.de/ffm/pic/pp/?S=A -http://www.visiobroker.com/opcvm/details/4/43591.html -http://www.visiobroker.com/opcvm/details/9/9765.html -http://ring.toyama-ix.net/archives/linux/debian/debian-jp/dists/woody-towns/?M=A -http://www.asahi-net.or.jp/~ZI3H-KWRZ/lawylegalaid.html -http://mayu.sourceforge.net/cgi-bin/nph-ml.cgi/000/http/www.geocrawler.com/archives/3/195/1999/7/0/ -http://www.buybuddy.com/sleuth/27/1/1060103/490578/ -http://java.javasoft.com/products/jdk/1.2/ja/docs/ja/api/java/awt/image/BandedSampleModel.html -http://mitglied.tripod.de/~HTTC/mannschaften/3LigaGr1_0001.htm -http://opac.lib.rpi.edu/search/anightingale+peggy+1942/-5,-1,0,B/browse -http://ftp.unina.it/pub/Amiga/NetBSD/NetBSD-current/pkgsrc/editors/ssam/files/ -http://kikakusvr3.city.yokohama.jp/y/j/e25/ktt/ktt.html -http://members.spree.com/entertainment/juskickit/http//members.spree.com/sports/comicus1 -http://www.butuanon.tsx.org/ -http://archive.soccerage.com/s/de/07/05375.html -http://mayu.sourceforge.net/cgi-bin/nph-ml.cgi/000/http/www.geocrawler.com/archives/3/151/1995/10/0/859255/ -http://mayu.sourceforge.net/cgi-bin/nph-ml.cgi/000/http/www.geocrawler.com/archives/3/151/1995/10/50 -http://polygraph.ircache.net:8181/http_-2www.soniajekums.com/docs/Http_-2ua.battle-zone.com/html/html/on_line.html -http://www.affiliate.hpstore.hp.co.uk/do/session/380855/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-creativeworld.com/creativeworld.asp?lang=f -http://mirror.cc.utsunomiya-u.ac.jp/mirror/CPAN/authors/id/T/TO/TOSTI/vstadaf-0.01.readme -http://www.xmission.com/~dkenison/cgi/lwgate.cgi/KLR650/archives/v02.n1633/Subject/article-16.html -http://www.realize.com/p25581.htm,qt=e784fe2f=2a38a234-7-da710e-0-0-0-1-- -http://www.realize.com/am947681.htm,qt=e784fe2f=2a38a234-7-da6e1d-80000000-0-0-3-- -http://www.realize.com/am2c3a81.htm,qt=e784fe2f=2a38a234-7-da6e1d-80000000-0-0-3-- -http://www.realize.com/amd15381.htm,qt=e784fe2f=2a38a234-7-da6e1d-1-84-0-3-- -http://link.fastpartner.com/do/session/600403/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/speednames.php -http://home.freeuk.net/lyne/work.htm -http://www.gotocity.com/local/2/us/AZ/p/85643/people/ -http://www.service911.com/egghead/step/0,2743,6+33+121+25440+18092_4,00.html -http://www.jamba.de/KNet/_KNet-irv8j1-WEd-139z7/showInfo-werbung.de/node.0/cenv0b09a -http://ustlib.ust.hk/search*chi/dbeijing+mandarin+dialects+china+slang/dbeijing+mandarin+dialects+china+slang/-5,1,1,B/frameset&F=dbeijing+mayors+china+fiction&1,1, -http://www.linux.org.tw/~chester/xlib/GC/convenience-functions/XSetGraphicsExposures.html -http://www.linux.org.tw/~chester/xlib/graphics/font-metrics/XUnloadFont.html -http://www.chaos.dk/sexriddle/c/f/j/u/c/ -http://www.chaos.dk/sexriddle/c/f/j/u/q/ -http://www.bornloser.com/comics/committed/archive/committed-20001027.html -http://tulips.ntu.edu.tw/search*chi/dDeath+lc/ddeath+lc/-17,-1,0,E/frameset&F=ddeath+in+adolescence+abstracts&1,,0 -http://hem.fyristorg.com/lottaleman/LLfar/1_6955.htm -http://preview.egroups.com/post/scoresheet-talk?act=reply&messageNum=7013 -http://209.52.189.2/profile.cfm/TimmyJ -http://archive.soccerage.com/s/pt/37/04816.html -http://pub16.ezboard.com/fleftbehindmessageboardfellowshiphall.showMessage?topicID=456.topic&index=16 -http://www.2pl.com/asp/tools/fili1.asp?sp=se&fi=pppp0005s8 -http://link.fastpartner.com/do/session/600382/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/company/jobs.htm -http://us.mandrakesoft.com/cgi-bin/cvsweb.cgi/kdenetwork/kppp/Rules/Poland/?only_with_tag=MAIN -http://genforum.genealogy.com/cgi-genforum/forums/flippin.cgi?30 -http://pub.chinaccm.com/23/news/200010/28/114339.asp -http://pub.chinaccm.com/23/news/200010/27/134259.asp -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=21,9,14,35,15 -http://gamesearcher.com/games/pc/returnofphantom-cheatsfaqs.html -http://ua.php.net/manual/es/function.pg-errormessage.php -http://findmail.com/group/prairydog -http://www.loria.fr/projets/dilib/DILIB_ROOT/SYSTEMS/Linux/Dilib/Data/NLM/MedLine/ -http://www.daysinn.com/ctg/cgi-bin/DaysInn/programs/AAAksrACwAAACEaAAQ -http://www.leo.org/leoclick/35dd60550f1ba90ed5bb7952eebae0d3+L+1__ -http://members.fortunecity.com/abbalink/songs/lyrics/wg.htm -http://chat.sportsline.com/u/football/nfl/xword/answers/091500.htm -http://210.173.172.13/entertainments/sports/sydney/kanrenkiji/0924/0925m096-500.html -http://210.173.172.13/entertainments/sports/sydney/kanrenkiji/0924/0925m094-500.html -http://www.private-immobilien-boerse.de/nordrhein-Westfalen/Muehlheim-ruhr/Verkauf/3d-service/Gemeinsam/Inserieren/3d-service/Gemeinsam/versicherungen/gebaeude/deckungsumfang.htm -http://www.private-immobilien-boerse.de/nordrhein-Westfalen/Muehlheim-ruhr/Verkauf/3d-service/Gemeinsam/Inserieren/3d-service/Gemeinsam/IIMMitglieder.htm -http://www.realize.com/amcf7781.htm,qt=e784fe2f=2a38a234-4-7cf2ef-80000000-0-0-3-- -http://family.go.com/Categories/Features/family_1998_12/penn/penn128urban/ -http://www.loria.fr/projets/dilib/DILIB_ROOT/ApplicationsTest/Dilib/newBD/Prog/?N=D -http://www.loisirs.ch/xfeoav/7/kqbmsh.html -http://tucows.tu-graz.ac.at/herdwin0807.html -http://www-d0.fnal.gov/cgi-bin/cvsweb.cgi/gtr_htf/dat/?sortby=log -http://www.buybuddy.com/sleuth/17/1/2006/32619/ -http://www.aelita.net/products/Reg/QuoteRegister/products/library/products/company/Privacy.htm -http://www.refdag.nl/bui/990803bui08.html -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=3,0+9,6-14,0+0,2 -http://www.aelita.net/products/services/support/sitemap/news/solutions/default.htm -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=26,5,30,16,12 -http://www.ericsson.cl/gsmpro/contact.shtml -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/maheuitu/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/mangoo333/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/maomizhijia/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/masaki_hamada/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/maxiaofei/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/maz0503/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/menghuanboy/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/michealshen/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/mike717/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/mikeshang_2/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/mingyueyaze/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/mm3/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/mnbv89/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/morsia/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/move/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/mslug/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/msshi/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/muwei/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/my1799/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/mychat2000/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/myesky/ -http://members.tripodasia.com.cn/maolin_photo/maolin_suzuki/maolin_suzuki/mzlzq/ -http://www.ring.gr.jp/pub/linux/Vine/VineSeed/alpha/mnt/source/sbin/loader -http://www.nrk.no/finnmark/x8_5_96/nyh7.htm -http://202.99.23.245/rmrb/200001/27/no_txb_6.html -http://www-d0.fnal.gov/d0dist/dist/releases/test/smt_hit/test/?N=D -http://www-d0.fnal.gov/d0dist/dist/releases/test/smt_hit/test/LIBRARIES -http://jupiter.u-3mrs.fr/~msc41www/releves/13440405.HTM -http://ftp.univie.ac.at/packages/perl/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/CGI/ANDK/Apache-correct_headers.readme.html -http://www.linux.com/networking/network/networking/free/windows_nt/distro/ -http://www.linux.com/networking/network/networking/free/windows_nt/tip/ -http://australia-holiday-guide.com/Englisch/Queensland_1/QLD_Furher_North_1/qld_further_north_1.html -http://australia-holiday-guide.com/Englisch/Queensland_1/QLD_Great_Barrier_Reef_1/qld_great_barrier_reef_1.html -http://ftp.uni-paderborn.de/aminet/aminet/demo/aga/Ayrton.readme -http://ftp.uni-paderborn.de/aminet/aminet/demo/aga/Deadline_1.readme -http://ftp.uni-paderborn.de/aminet/aminet/demo/aga/DiamondPPC.readme -http://ftp.uni-paderborn.de/aminet/aminet/demo/aga/Gravity2_inv.readme -http://ftp.uni-paderborn.de/aminet/aminet/demo/aga/HJB-BCFix.readme -http://ftp.uni-paderborn.de/aminet/aminet/demo/aga/ImpPos.readme -http://ftp.uni-paderborn.de/aminet/aminet/demo/aga/Nat-AutF.readme -http://ftp.uni-paderborn.de/aminet/aminet/demo/aga/PSB-Desperado2.readme -http://ftp.uni-paderborn.de/aminet/aminet/demo/aga/PSB-PUK_final.readme -http://genforum.genealogy.com/cgi-genforum/forums/kilroy.cgi?34 -http://genforum.genealogy.com/cgi-bin/print.cgi?kilroy::34.html -http://content.health.msn.com/ef/message/803324/content.health.msn.com%2fmessage_board_message%2f803324/803324 -http://de.excite.de/gesundheit/katalog/6107 -http://de.excite.de/gesundheit/katalog/4909 -http://de.excite.de/gesundheit/katalog/5941 -http://de.excite.de/gesundheit/katalog/4924 -http://de.excite.de/gesundheit/katalog/5898 -http://de.excite.de/gesundheit/katalog/4949 -http://de.excite.de/gesundheit/katalog/5987 -http://de.excite.de/gesundheit/katalog/5855 -http://de.excite.de/gesundheit/katalog/39862 -http://de.excite.de/gesundheit/katalog/5852 -http://de.excite.de/gesundheit/katalog/5645 -http://de.excite.de/gesundheit/katalog/6078 -http://de.excite.de/gesundheit/katalog/5834 -http://yp.gates96.com/11/26/80/31.html -http://yp.gates96.com/11/26/80/47.html -http://yp.gates96.com/11/26/80/91.html -http://yp.gates96.com/11/26/81/61.html -http://yp.gates96.com/11/26/81/86.html -http://yp.gates96.com/11/26/82/37.html -http://yp.gates96.com/11/26/82/49.html -http://yp.gates96.com/11/26/83/38.html -http://yp.gates96.com/11/26/83/52.html -http://yp.gates96.com/11/26/83/58.html -http://yp.gates96.com/11/26/83/84.html -http://yp.gates96.com/11/26/84/0.html -http://yp.gates96.com/11/26/84/59.html -http://yp.gates96.com/11/26/84/75.html -http://yp.gates96.com/11/26/84/99.html -http://yp.gates96.com/11/26/85/37.html -http://yp.gates96.com/11/26/85/63.html -http://yp.gates96.com/11/26/85/78.html -http://yp.gates96.com/11/26/86/36.html -http://yp.gates96.com/11/26/86/40.html -http://yp.gates96.com/11/26/87/66.html -http://yp.gates96.com/11/26/87/87.html -http://yp.gates96.com/11/26/89/7.html -http://yp.gates96.com/11/26/89/21.html -http://yp.gates96.com/11/26/89/38.html -http://providenet.tukids.tucows.com/mac/9-12/macspell912_license.html -http://providenet.tukids.tucows.com/mac/9-12/adnload/25805_25780.html -http://www04.u-page.so-net.ne.jp/zb3/eiji-m/dog6.htm -http://school.educities.org/card/jou0731.html -http://school.educities.org/card/ke234.html -http://school.educities.org/card/aaaaaqqqqqqq.html -http://school.educities.org/card/cso.html -http://school.educities.org/card/g40203.html -http://school.educities.org/card/h123915388.html -http://school.educities.org/card/k1084211.html -http://www.cigar-pipe.de/SP/dhuc3112.htm -http://www.newquestcity.com/cities/MA///news/3675.htm -http://caowei_814.home.chinaren.com//wenxue/wenxue-mood/love147.htm -http://www.amulation.com/md-l-archive/199805/msg00065.html -http://in.egroups.com/messages/conventions/51?viscount=-30 -http://yp.gates96.com/11/63/20/4.html -http://yp.gates96.com/11/63/20/21.html -http://yp.gates96.com/11/63/20/51.html -http://yp.gates96.com/11/63/21/29.html -http://yp.gates96.com/11/63/21/41.html -http://yp.gates96.com/11/63/21/74.html -http://yp.gates96.com/11/63/22/4.html -http://yp.gates96.com/11/63/22/29.html -http://yp.gates96.com/11/63/22/80.html -http://yp.gates96.com/11/63/22/86.html -http://yp.gates96.com/11/63/23/7.html -http://yp.gates96.com/11/63/23/24.html -http://yp.gates96.com/11/63/23/39.html -http://yp.gates96.com/11/63/24/1.html -http://yp.gates96.com/11/63/25/35.html -http://yp.gates96.com/11/63/25/78.html -http://yp.gates96.com/11/63/25/83.html -http://yp.gates96.com/11/63/26/37.html -http://yp.gates96.com/11/63/27/3.html -http://yp.gates96.com/11/63/27/9.html -http://yp.gates96.com/11/63/27/14.html -http://yp.gates96.com/11/63/28/16.html -http://yp.gates96.com/11/63/28/26.html -http://yp.gates96.com/11/63/28/54.html -http://yp.gates96.com/11/63/28/55.html -http://yp.gates96.com/11/63/29/13.html -http://yp.gates96.com/11/63/29/64.html -http://yp.gates96.com/11/63/29/69.html -http://spaceports.tucows.com/winnt/httpservernt_license.html -http://www.affiliate.hpstore.hp.co.uk/do/session/380848/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/FR/REGISTRATION/entry.asp -http://incrediblegolfsavings.subportal.com/sn/Games/Simulation_Games/11310.html -http://incrediblegolfsavings.subportal.com/sn/Games/Simulation_Games/12064.html -http://www.linux.com/networking/linux/industry/gnu/operating_system/Corel/ -http://www.linux.com/networking/linux/industry/gnu/operating_system/Updates/ -http://www.fogdog.com/cedroID/ssd3040183307418/womens/ -http://www.fogdog.com/cedroID/ssd3040183307418/nav/products/featured_brands/1o/casual_sunglasses/ -http://www.fogdog.com/cedroID/ssd3040183307418/nav/products/featured_brands/1o/hockey_skates/ -http://www.fogdog.com/cedroID/ssd3040183307418/nav/products/featured_brands/1o/sweatshirts_fleece/ -http://www.fogdog.com/cedroID/ssd3040183307418/crs/nvCZ/wld/fogdog_sports/nike/football/equipment/500r_series_football.html -http://www.seoul.co.kr/dmaeil/199908/0820j015.htm -http://www-trn.bards.ru/Lobanovskiy/part13.htm -http://www-trn.bards.ru/Vahnuk/part27.htm -http://www-trn.bards.ru/Vetrova_Svetlana/part9.htm -http://www-trn.bards.ru/Tretiyakov/part22.htm -http://www-trn.bards.ru/Okoudjava/part202.htm -http://www-trn.bards.ru/Panyushkin/part100.htm -http://www-trn.bards.ru/Gorodnicky/part287.htm -http://yumemi.ne.jp/bbs/ky/view/f/forum9/1_jpbshj_vvvzil.html -http://yumemi.ne.jp/bbs/ky/view/f/forum9/1_xxosis_czhmrb.html -http://yumemi.ne.jp/bbs/ky/view/f/forum9/1_yikriy_qjvins.html -http://www.peopledaily.co.jp/shch/199907/28/newfiles/D103.html -http://legalminds.lp.findlaw.com/list/newlawbooks-l/frm00336.html -http://tucows.sp-plus.nl/winme/phoneme.html -http://ustlib.ust.hk/search*chi/dalcoholic+beverages+china/dalcoholic+beverages+china/7,-1,0,E/2browse -http://ustlib.ust.hk/search*chi/dalcoholic+beverages+china/dalcoholic+beverages+china/-5,-1,0,E/frameset&F=dalcoholic+beverages+great+britain&1,,0 -http://www.canit.se/(k10,k13,k16,k6)/support/faq/faq.html -http://aecjobbank.com/texis/script/jobbank/+Owwrmwxeri2wBV6evNVpwwwF6eWYqkwwwn6eXmcOwwwn6ekmyjwwwn6eULpOwwqn6eUCBZwwwn6e22QuwwwefPY9GepmwwmeiP46eczdwwmeOTB6eXhzwwwnmBVve89AHwwxeY44Ie-pxwww+vejWRhwwxealYTeXjzwwwhvep9q9wwwxveoA6kwwqe0PYieqFzwwwv6eFRFrwwwt6eSGxDwwwetNY1e8drwwqeT53Amwww0h7mwww1tzmwwweb-3qmwwww/jobdirectory.html -http://www9.hmv.co.uk:5555/do/session/1347780/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/newmenu.html -http://www9.hmv.co.uk:5555/do/session/1347780/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/departments/d30_sd0_pt0.html -http://www9.hmv.co.uk:5555/do/session/1347780/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/departments/d70_sd0_pt0.html -http://www9.hmv.co.uk:5555/do/session/1347780/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/departments/d90_sd0_pt0.html -http://www9.hmv.co.uk:5555/do/session/1347780/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/departments/d120_sd0_pt0.html -http://www.hbdaily.com.cn/hbrb/20000622/BIG5/hbrb^18323^12^0622h016.htm -http://excite.de/immobilien/katalog/6877 -http://excite.de/immobilien/katalog/7012 -http://www.globalmart.com/housewares/appliances/household/irons/blackanddecker/S680.htm -http://mediate.magicbutton.net/do/session/625631/vsid/4385/tid/4385/cid/88138/mid/1702/rid/2114/chid/3393/url/http://www.worldgallery.co.uk/frameset-artc.html -http://ddb.libnet.kulib.kyoto-u.ac.jp/exhibit/mt3/image/mt3shf/mt3sh0192.html -http://us.parsimony.net/forum26166/messages/410.htm -http://linux.tnc.edu.tw/CPAN/authors/id/A/AZ/AZEMGI/?M=A -http://linux.tnc.edu.tw/CPAN/authors/id/A/AZ/AZEMGI/CHECKSUMS -http://launchbase.com/Shopping/Visual_Arts/communication/entertainment/Pictures_&_Images.htm -http://launchbase.com/Shopping/Visual_Arts/communication/shopping/Gifts.htm -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/programs/simple/music/midi/lit/lit/quizz/quizz1.html -http://home02.wxs.nl/~nash0002/amber-94.htm -http://www.redrocksports.com/sports/webSession/shopper/RR972959711-31098/store/dept-5/department/dept-5/item/52400 -http://www.redrocksports.com/sports/webSession/shopper/RR972959711-31098/store/dept-5/department/dept-5/item/52550 -http://www.redrocksports.com/sports/webSession/shopper/RR972959711-31098/store/dept-5/department/dept-5/item/50900 -http://gnu.archive.sunet.se/software/sather/ICSI_Sather/Documentation/Compiler/CompilerBrowser/shortflat-FLIST{_}.html -http://mailman.real-time.com/rte-crossfire/1992/Dec/mail1.html -http://de.nedstat.net/viewstat.asp?name=larsen -http://ftp.ring.gr.jp/archives/pc/gnu-win32/latest/man/?S=A -http://src.openresources.com/debian/src/graphics/HTML/D/S_ISSOCK.html -http://www.perotech.ch/d/securedb/html/listtopic.php?4277 -http://web.health.aol.thriveonline.oxygen.com/medical/library/article/003558res.html -http://cn.egroups.com/message/Website_Warez/346 -http://adex3.flycast.com/server/socket/127.0.0.1:2800/click/OnlineCitiesSM/OnlineCitiesInteractiveCityGuides/bd510213891 -http://ring.nii.ac.jp/pub/pack/x68/personal/calendar/ -http://www.zeal.com/Government/U_S__Government/State___Local_Governments/South_Carolina/Politics/Elections/State_wide/ -http://ftp.unina.it/pub/TeX/macros/latex209/contrib/manual/?S=A -http://www.perotech.ch/d/securedb/html/listtopic.php?5376 -http://polygraph.ircache.net:8181/lci/https_-2ssl.galaxy-net.net/jazzee/http_-2www.microsoft.com/truetype/fontpack/win.htm -http://python.konbib.nl/dutchess.ned/83/00/info-1592.html -http://www.excite.com/lifestyle/cultures_and_groups/world_cultures/regions/north_america/ethnic_communities/african_american/history/military_history/ -http://www.bluemonutain.com/engy/david/CHI1-educk.html -http://www.bluemonutain.com/engy/susie/CHI1-edaddog.html -http://cn.egroups.com/messages/childhoodepilepsy/3349 -http://cn.egroups.com/messages/childhoodepilepsy/648 -http://cn.egroups.com/messages/childhoodepilepsy/1189 -http://polygraph.ircache.net:8181/services/design/http_-2www.swnebr.net/~cambridg/http_-2www.bikininet.com/climate.htm -http://www.annuairefrancais.com/54/France/I/INTERNET/Fournisseurs-d'acces/Fournisseurs-d -http://polygraph.ircache.net:8181/http_-2www.monarchcom.net/http_-2www.netscape.com/comprod/mirror/http_-2bible.gospelcom.net/http_-2www.rehablinks.com/ptlinks.htm -http://findmail.com/message/studentdoctor/4312?source=1 -http://mediate.magicbutton.net/do/session/625624/vsid/4385/tid/4385/cid/88138/mid/1702/rid/2114/chid/3393/url/http://www.worldgallery.co.uk/frameset-cart.html -http://ring.htcn.ne.jp/archives/lang/perl/CPAN/authors/id/P/PG/?M=A -http://www.buybuddy.com/sleuth/33/1/10601/526343/ -http://www1.zdnet.com/products/stories/reviews/0,4161,2470142,00.html -http://www1.zdnet.com/companyfinder/filters/products/0,9996,2256-82,00.html -http://webcvs.kde.org/cgi-bin/cvsweb.cgi/kdeutils/ark/doc/en/Attic/index-2.html?only_with_tag=MAIN -http://tv.thevines.com/leaf/AA0000364048/45///&act=24-1-11&bref=1601 -http://link.fastpartner.com/do/session/600384/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/local/redirect.php -http://www.excite.com/lifestyle/politics_and_society/community_and_cultures/world_cultures/diaspora/jewish/judaism/congregations/humanistic_judaism/ -http://biblio.cesga.es:81/search*gag/aXove,+Xosé/axove+xose/7,-1,0,B/frameset&F=axuntanza&1,,3 -http://biblio.cesga.es:81/search*gag/aXove,+Xosé/axove+xose/7,-1,0,B/frameset&F=axuntanza&3,,3 -http://db.zaq.ne.jp/asp/bbs/jttk_baasc506_1/article/36 -http://db.zaq.ne.jp/asp/bbs/jttk_baasc506_1/article/37 -http://db.zaq.ne.jp/asp/bbs/jttk_baasc506_1/article/35 -http://db.zaq.ne.jp/asp/bbs/jttk_baasc506_1/article/21 -http://www.tiroler-adler.com/1Root/Kontinent/6/Staat/7/Bundesland/16/Ort/691/Homepage/f_homepage...1.html -http://yp.gates96.com/4/52/90/87.html -http://yp.gates96.com/4/52/90/95.html -http://yp.gates96.com/4/52/91/4.html -http://yp.gates96.com/4/52/91/39.html -http://yp.gates96.com/4/52/91/42.html -http://yp.gates96.com/4/52/92/33.html -http://yp.gates96.com/4/52/92/93.html -http://yp.gates96.com/4/52/93/6.html -http://yp.gates96.com/4/52/93/98.html -http://yp.gates96.com/4/52/94/8.html -http://yp.gates96.com/4/52/94/14.html -http://yp.gates96.com/4/52/95/92.html -http://yp.gates96.com/4/52/96/16.html -http://yp.gates96.com/4/52/96/32.html -http://yp.gates96.com/4/52/96/72.html -http://yp.gates96.com/4/52/96/90.html -http://yp.gates96.com/4/52/97/1.html -http://yp.gates96.com/4/52/97/53.html -http://yp.gates96.com/4/52/98/34.html -http://yp.gates96.com/4/52/98/84.html -http://yp.gates96.com/4/52/98/97.html -http://yp.gates96.com/4/52/99/55.html -http://yp.gates96.com/4/52/99/68.html -http://yp.gates96.com/14/40/10/3.html -http://yp.gates96.com/14/40/10/86.html -http://yp.gates96.com/14/40/11/53.html -http://yp.gates96.com/14/40/12/74.html -http://yp.gates96.com/14/40/13/11.html -http://yp.gates96.com/14/40/13/34.html -http://yp.gates96.com/14/40/13/45.html -http://yp.gates96.com/14/40/13/79.html -http://yp.gates96.com/14/40/14/3.html -http://yp.gates96.com/14/40/14/6.html -http://yp.gates96.com/14/40/14/25.html -http://yp.gates96.com/14/40/14/84.html -http://yp.gates96.com/14/40/14/88.html -http://yp.gates96.com/14/40/15/39.html -http://yp.gates96.com/14/40/15/40.html -http://yp.gates96.com/14/40/16/64.html -http://yp.gates96.com/14/40/16/92.html -http://yp.gates96.com/14/40/17/69.html -http://yp.gates96.com/14/40/18/42.html -http://yp.gates96.com/14/40/18/82.html -http://yp.gates96.com/14/40/19/36.html -http://www.4positiveimages.com/4positiveimages/727410225/IconBar -http://www.teacherformation.org/html/od/facilitators.cfm/task1,login/discussion_id,2/xid,6559/yid,6157439 -http://www.secinfo.com/dSU5m.74.htm -http://www.secinfo.com/dSU5m.7v.htm -http://www.secinfo.com/dSU5m.6y.htm -http://www.secinfo.com/dSU5m.5c.htm -http://linux.softhouse.com.cn/linux/knowledge/tech/qs/linux5.htm -http://linux.softhouse.com.cn/linux/knowledge/tech/qs/linux10.htm -http://freesoftware.subportal.com/sn/Programming/Visual_Basic_Components_H-P/993.html -http://dk.egroups.com/message/NGHILUAN/2881 -http://dk.egroups.com/message/NGHILUAN/2889 -http://www.cga.state.ct.us/ps98/cbs/H/hj-0084.htm -http://apple.excite.com/entertainment/music/artists_and_genres/jazz/new_world_jazz/afro_cuban/ -http://www.euronet.nl/users/hiroshi/ksweb/interest.htm -http://library.bangor.ac.uk/search/aMollica,+Anthony/amollica+anthony/-5,-1,0,B/browse -http://www.fogdog.com/cedroID/ssd3040183308040/nav/products/featured_brands/14t/all/ -http://www.brio.de/BRIO.catalog/39fe2f8d0912d4962740d472aa780701/UserTemplate/9 -http://www.hig.se/(accessed,autoformat,referrer,sqloutput,tablify)/~jackson/roxen/ -http://www.newstimescybermall.com/Mall/Catalog/Product/ASP/product-id/206059/store-id/1000010991.html -http://www6.163.com/news/p-item/0,1587,economy_1916,00.html -http://ftp.uni-stuttgart.de/pub/systems/sgi/graphics/lib/?D=A -http://preview.egroups.com/message/abdou3/152 -http://ch.php.net/manual/it/function.pg-loimport.php -http://yp.gates96.com/1/94/30/39.html -http://yp.gates96.com/1/94/30/78.html -http://yp.gates96.com/1/94/31/11.html -http://yp.gates96.com/1/94/31/72.html -http://yp.gates96.com/1/94/31/85.html -http://yp.gates96.com/1/94/32/25.html -http://yp.gates96.com/1/94/32/45.html -http://yp.gates96.com/1/94/32/74.html -http://yp.gates96.com/1/94/33/20.html -http://yp.gates96.com/1/94/33/68.html -http://yp.gates96.com/1/94/34/92.html -http://yp.gates96.com/1/94/35/1.html -http://yp.gates96.com/1/94/35/50.html -http://yp.gates96.com/1/94/35/60.html -http://yp.gates96.com/1/94/37/0.html -http://yp.gates96.com/1/94/37/46.html -http://yp.gates96.com/1/94/37/47.html -http://yp.gates96.com/1/94/37/61.html -http://yp.gates96.com/1/94/38/19.html -http://yp.gates96.com/1/94/39/49.html -http://yp.gates96.com/1/94/39/57.html -http://www.gartenfachmarkt.de/beratung_garten/duengen_und_kompostieren/anlage_und_vorarbeiten/fertig.htm -http://support.dell.com/docs/storage/4955r/en/Hw/setup.htm -http://www.hig.se/(clientname,header,sort,sqlquery,sqltable)/~jackson/roxen/ -http://www.mic.hr/PGBURZA:423870 -http://www.mic.hr/PGNEWS:423870 -http://members.tripod.com/Tess_Tom/my_photoalbum/page12.html -http://legalminds.lp.findlaw.com/list/courtinterp-spanish/nav05815.html -http://www.fogdog.com/cedroID/ssd3040183239698/crs/pn__/wld/fogdog_sports/pearl_izumi/road_cycling/apparel/classic_vest.html -http://www.fogdog.com/cedroID/ssd3040183239698/nav/stores/wakeboarding/ -http://troy.lib.sfu.ca/search/slogos/slogos/-5,-1,0,E/frameset&F=slogistics+and+transportation+review&1,,0 -http://themes.tucows.dia.dk/skins/icq/preview/54718.html -http://php.nic.fi/manual/html/function.shm_open.html -http://ftp.fi.debian.org/debian/dists/woody/non-free/binary-m68k/misc/?S=A -http://www.csupomona.edu/reference/java/jdk1.2/docs/api/org/omg/CORBA/class-use/CompletionStatus.html -http://www.trax.nilex.co.uk/trax.cgi/A1C/B1U/A1D/C1R/A1D/B1R/ -http://www.uni-duesseldorf.de/ftp/ftp/software/opt/cpio-2.4.2/?M=A -http://ep.com/js/about/c9079/b0/250918.html -http://polygraph.ircache.net:8181/busi/html/http_-2www.dirtsports.com/index.html-ssi -http://www.chabadlibrary.org/ecatalog/EC06/EC06232.HTM -http://chat.hani.co.kr/NetBBS/Bbs.dll/brief/lst/qqa/f/qqo/PRMY/zka/B23qB2Bm -http://209.207.239.212/bkindex/c1047/f1128.html -http://tv.thevines.com/leaf/AA0000364429/4/1 -http://tv.thevines.com/leaf/AA0000364429/4//&order_by=WORST -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=12,17,20,5,16 -http://yp.gates96.com/4/4/40/22.html -http://yp.gates96.com/4/4/40/29.html -http://yp.gates96.com/4/4/41/11.html -http://yp.gates96.com/4/4/42/0.html -http://yp.gates96.com/4/4/42/27.html -http://yp.gates96.com/4/4/42/89.html -http://yp.gates96.com/4/4/42/99.html -http://yp.gates96.com/4/4/43/40.html -http://yp.gates96.com/4/4/43/69.html -http://yp.gates96.com/4/4/43/85.html -http://yp.gates96.com/4/4/44/27.html -http://yp.gates96.com/4/4/44/28.html -http://yp.gates96.com/4/4/44/36.html -http://yp.gates96.com/4/4/44/86.html -http://yp.gates96.com/4/4/45/76.html -http://yp.gates96.com/4/4/45/82.html -http://yp.gates96.com/4/4/45/86.html -http://yp.gates96.com/4/4/46/61.html -http://yp.gates96.com/4/4/47/1.html -http://yp.gates96.com/4/4/47/41.html -http://yp.gates96.com/4/4/47/42.html -http://yp.gates96.com/4/4/48/66.html -http://people.freebsd.org/~knu/cgi-bin/cvsweb.cgi/ports/misc/geekcode/pkg-descr?only_with_tag=RELEASE_3_4_0 -http://perso.wanadoo.fr/genealogie.aubert.jm/geweb/ff100.htm -http://www.securitiestimes.com.cn/199904/29/data/newfiles/0060080.htm -http://autos.yahoo.co.jp/ucar/m1015/k10152012199906/g21/a101520120210248821003520208199906.html -http://dg.galaxy.com/galaxy/Community/United-States/States/Connecticut/Cities-and-Regions/Guilford/Education/K--12/Middle.html -http://carriage.de/Schoner/info-e/literature/collections/models/ -http://www.amcity.com/orlando/stories/1998/06/29/weekinbiz.html?t=email_story -http://www.icopyright.com/1.1655.94549 -http://biblio.cesga.es:81/search*gag/dMicrosoft+Visual+BASIC+(Archivo+de+ordenador)/dmicrosoft+visual+basic+archivo+de+ordenador/-5,1,1,B/frameset&F=dmicrosoft+project+archivo+de+ordenador&1,1, -http://www.jamba.de/KNet/_KNet-AzI8j1-tGd-13d56/browse.de/node.0/cde7f1uou -http://www.jamba.de/KNet/_KNet-AzI8j1-tGd-13d5e/browse.de/node.0/cde7f1uou -http://www.ioppublishing.com/PEL/help/article/ja30010l2/refs/?topic=refs -http://members.tripod.lycos.co.kr/uuujsh/?N=D -http://www.wlu.ca/~wwwregi/95-96/cal/ucourses/CP/CP417.html -http://books.hyperlink.co.uk/bookinfo/Essential_Papers_on_Messianic_Movements_and_Personalities_in_Jewish_History/0814779433 -http://generalstore.everdream.com/kore/catalog/Office_Supplies/Furniture_&_Accessories/File_Cabinets/Vertical/GRP-US747/product.html -http://satlink.tucows.com/winnt/adnload/54136_29678.html -http://dc.web.aol.com/myrtlebeacharea/penpals/browse.dci?cat=twenties&sort=m -http://itcareers.careercast.com/texis/it/itjs/+nwwBme4WD86e4rwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewDthDo5O5apGdtGwMaBGnDBdDaqd1DBGon5aoDqc1moDtax15oDn55amnVncdpoDta5dc1BodD5adppdGB1DoBon5aqdMpnBoBoVnaMFqtuNfIjIDzmYqwwpBme68D86eihwww5rmerdwwwBrmeZpwww/jobpage.html -http://ring.yamanashi.ac.jp/pub/linux/debian/debian-jp/dists/hamm-jp/hamm/disks-i386/current/base14-3.bin.2.0.11.2-i386 -http://www.ibm.co.jp/pc/thinkpad/pt110/look110.html -http://retailer.gocollect.com/do/session/1912720/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/postcards/index.asp -http://www-rn.informatik.uni-bremen.de/home/X11R6/xc/doc/hardcopy/XProtocol/?N=D -http://cafe3.daum.net/Cafe-bin/bbsList?bbsgrp=SIXTEEN&bbscode=SIXTEENbbs -http://allmacintosh.arrakis.es/adnload/12140.html -http://allmacintosh.arrakis.es/adnload/2476.html -http://www.msb.malmo.se/search*swe/dSkönlitteratur/dskz~cnlitteratur/-5,-1,0,B/2exact&F=dskz~cnliteratur&1,2 -http://tucows.syix.com/winme/preview/137803.html -http://pages.prodigy.net/patotoole/musicman/page6.htm -http://yp.gates96.com/14/43/0/39.html -http://yp.gates96.com/14/43/0/78.html -http://yp.gates96.com/14/43/0/79.html -http://yp.gates96.com/14/43/0/99.html -http://yp.gates96.com/14/43/1/3.html -http://yp.gates96.com/14/43/1/57.html -http://yp.gates96.com/14/43/1/86.html -http://yp.gates96.com/14/43/2/74.html -http://yp.gates96.com/14/43/2/80.html -http://yp.gates96.com/14/43/3/2.html -http://yp.gates96.com/14/43/3/97.html -http://yp.gates96.com/14/43/3/99.html -http://yp.gates96.com/14/43/4/37.html -http://yp.gates96.com/14/43/4/51.html -http://yp.gates96.com/14/43/4/72.html -http://yp.gates96.com/14/43/6/4.html -http://yp.gates96.com/14/43/7/20.html -http://yp.gates96.com/14/43/7/39.html -http://yp.gates96.com/14/43/7/45.html -http://yp.gates96.com/14/43/9/41.html -http://yp.gates96.com/14/43/9/58.html -http://yp.gates96.com/14/43/9/60.html -http://ftp.support.compaq.com/public/dunix/v3.2g/ASE_V1.3/ReleaseNotes.htm -http://seniorfriendfinder.com/cgi-bin/w3com/pws/ffsenior/mchI1k9vDw6DGJ19bljzJPwhHhJYxAcnAIKgudPEJtzjiTWMWT4U-YMr4m-AccPn7sEIqMzfFTZnQEQBZNx-lh8DEr_c1F3DXpcc4PzhALzHJ76GytRWNCSauwtfVocYmy_RKsP-H9T-UhQgoc9_uexBhD4a -http://seniorfriendfinder.com/cgi-bin/w3com/pws/ffsenior/IqtI3V1hdRxfYW_4AHOzeXZkuTzyKfveVl4qdYM_2WFldvLDKFgK8SvYa0mSlrWDVodDERGv2jvb2dEN1-mRmY3TBKURFCsqneanb8BNMBeBfqmSnBYuou5RMCmHxXCedHy3TQnL51n3TYbg5exYBWl9FJTcQEIJt2wyyrfB66jP -http://seniorfriendfinder.com/cgi-bin/w3com/pws/ffsenior/Hk1ILVbQbFwze5TrhlBima0MylJ0gTqcnVeTbMTcn7Gy5GkelYKhUQ7m8P8_K3IkOWfIWbpGOJEuHqJLX5jY_7ygFevbtkNXPvb1yztdy9qzCTsCJvS5uaHN3cZd0LtuoMX3lX7d_-L_PrwRXSfTE3TNvWl-RHiY4Xmxk1fXhD_uwwjDvC7DDsxz66j6 -http://seniorfriendfinder.com/cgi-bin/w3com/pws/ffsenior/T41IiB449vZ7nrOl2Z_klJHCHQZhigz52e9YVMztVI-K01klBYQrw4VmiKN8JDs9xaeMSWopQs1euSbr6BAiyuqpbSFiiVWObVmWHv031jtdQ1y93wnHhx8PkbrA4hkNhjTPs2mUhBF9wIAJSPCYLkf6W7mCB8ObikqLTuIwBfRtSgMK4Hz9e7Bp -http://seniorfriendfinder.com/cgi-bin/w3com/pws/ffsenior/CI1IlJNaoNrBcwJYSEcjLyxBnpQHK3wpRPeCR_0u07GznNXQ3Ug57ciOqlfXKlYM1HbRfcvrF5s214yaEHiIizneyWrbSEW_xal49NjQDbWj6R2nEZvDQdDMQEMoTuQlSetyUwMidLBmJJ5v5w9m066en6Yxuzt3RkGIyoHKaVmXgVIYD2Fc40eA -http://www.secinfo.com/dSm4r.997.htm -http://www.secinfo.com/dSm4r.68c.htm -http://www.secinfo.com/dSm4r.69c.htm -http://mirror.cc.utsunomiya-u.ac.jp/mirror/CPAN/modules/by-module/MD5/GAAS/HTML-Parser-3.04.readme -http://polygraph.ircache.net:8181/Game+Controllers/http_-2www.real-e-video.com/price-abuse.html -http://ecomonly.shop.goto.com/z/netadp/search/matches.jhtml?MANUF=Linksys -http://ecomonly.shop.goto.com/z/netadp/search/matches.jhtml?MANUF=Madge -http://freesoftware.subportal.com/sn/Web_Authoring/Misc__Programming_Tools/3100.html -http://www.sam.hi-ho.ne.jp/m-saka/stepwgn/himeji/6scene/ -http://ftp.unina.it/pub/Unix/linux/SuSE/ftp.suse.com/projects/3d/kernel/?N=D -http://www.ld.com/cbd/archive/1999/08(August)/10-Aug-1999/61awd001.htm -http://www.ld.com/cbd/archive/1999/08(August)/10-Aug-1999/61awd004.htm -http://statweb.byu.edu/sasdoc/sashtml/stat/chap2/sect5.htm -http://www.diogenes.de/4DACTION/web_rd_aut_show_authorlist/ID=483367&chr=F -http://web1.localbusiness.com/Story/Email/1,1198,RDU_461041,00.html -http://www.clientwire.com/A55697/tmr.nsf/vwApprovedResumesbyDate!OpenView&Start=55&Count=50&Collapse=48 -http://cpan.nitco.com/modules/by-module/Mail/JWIED/SNMP-Monitor-0.1011.readme -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=237&discrim=178,16,10 -http://www6.compaq.com/products/quickspecs/10135_na/10135_na.PDF -http://www.suk2.com/user/777/20001012.html -http://www.jamba.de/KNet/_KNet-vAy8j1-iFd-13az6/browse.de/node.0/cde7f2elw -http://www.imagesofengland.org.uk/41/69/416915.htm -http://ocean.ntou.edu.tw/search*chi/aLaplante,+Phillip+A./alaplante+phillip+a/7,-1,0,B/frameset&F=alappe+frances+moore&1,,2 -http://ocean.ntou.edu.tw/search*chi/aLaplante,+Phillip+A./alaplante+phillip+a/7,-1,0,B/frameset&F=alappe+frances+moore&2,,2 -http://wap.jamba.de/KNet/_KNet-6Fz8j1-oFd-13b3x/admLogin.de/node.0/cde7f1uou -http://yp.gates96.com/14/49/20/26.html -http://yp.gates96.com/14/49/20/37.html -http://yp.gates96.com/14/49/20/39.html -http://yp.gates96.com/14/49/20/86.html -http://yp.gates96.com/14/49/20/94.html -http://yp.gates96.com/14/49/20/97.html -http://yp.gates96.com/14/49/21/19.html -http://yp.gates96.com/14/49/21/43.html -http://yp.gates96.com/14/49/21/68.html -http://yp.gates96.com/14/49/21/78.html -http://yp.gates96.com/14/49/24/6.html -http://yp.gates96.com/14/49/24/62.html -http://yp.gates96.com/14/49/24/77.html -http://yp.gates96.com/14/49/24/83.html -http://yp.gates96.com/14/49/25/30.html -http://yp.gates96.com/14/49/25/41.html -http://yp.gates96.com/14/49/26/17.html -http://yp.gates96.com/14/49/26/53.html -http://yp.gates96.com/14/49/27/21.html -http://yp.gates96.com/14/49/27/27.html -http://yp.gates96.com/14/49/27/45.html -http://yp.gates96.com/14/49/27/65.html -http://yp.gates96.com/14/49/28/71.html -http://www.boston.digitalcity.com/orangecounty/entertainment/article.dci?aid=1293&start=10 -http://tucows.allnet.it/winme/adnload/143-006-005-021.html -http://tucows.allnet.it/winme/adnload/143-006-005-030.html -http://www.trax.nilex.co.uk/trax.cgi/A1C/B1U/A1D/C1R/A2D/A1U/ -http://www.crosswinds.net/~klinnia/DragonsDomain/Nest/nest.htm -http://mirrors.valueclick.com/backup.pause/modules/by-category/99_Not_In_Modulelist/Memoize/?S=A -http://www.tgw.com/EJr.5ajd/customer/category/product.html?SUBCATEGORY_ID=557 -http://www.sohu.com/business_economy/Company/Computer_Internet/Network_System/Network/ -http://china-water.51.net/oicq/oicq_down.htm -http://ftp.lip6.fr/pub/FreeBSD/development/FreeBSD-CVS/ports/math/plplot/patches/Attic/patch-ac,v -http://library.cuhk.edu.hk/search*chi/cHC427.92.C59/chc++427.92+c59/-5,-1,,E/browse -http://yp.gates96.com/4/8/60/2.html -http://yp.gates96.com/4/8/60/19.html -http://yp.gates96.com/4/8/62/9.html -http://yp.gates96.com/4/8/62/23.html -http://yp.gates96.com/4/8/62/59.html -http://yp.gates96.com/4/8/63/26.html -http://yp.gates96.com/4/8/63/41.html -http://yp.gates96.com/4/8/64/48.html -http://yp.gates96.com/4/8/65/0.html -http://yp.gates96.com/4/8/65/42.html -http://yp.gates96.com/4/8/66/13.html -http://yp.gates96.com/4/8/66/88.html -http://yp.gates96.com/4/8/67/23.html -http://yp.gates96.com/4/8/67/51.html -http://yp.gates96.com/4/8/68/11.html -http://yp.gates96.com/4/8/68/16.html -http://yp.gates96.com/4/8/68/78.html -http://www.outpersonals.com/cgi-bin/w3com/pws/out/CehIaxpSN7cGOeOUjXx_FtrylkakPWisW0DYq0MYmHwGxLBo7shB2XGSeXyvbnsBzHMJTZtmYOUK-XaaAW0Yh88wTY-Mms-hxw67Xaw8WMk3-vUJ4sXm4U7yIGdiN9XoPOqfnODrkqXYztjU6Var -http://www.brd.net/brd-cgi/brd_netzwerk?mailto&router&BZ85G0IL -http://power.luneng.com/power/library/jxgcs/jxgc99/jxgc9912/991204.htm -http://www.egroups.com/messages/Creative_Teaching/72?viscount=-30 -http://www.egroups.com/message/Creative_Teaching/85 -http://ftp.eecs.umich.edu/.1/people/elta/cusm-Javajae-elta/?D=A -http://polygraph.ircache.net:8181/cagliari/WHOWOULD.HTM -http://www.tiscover.ch/1Root/Kontinent/6/Staat/30/Bundesland/33/Ort/1564/Homepage/h_homepage...2.html -http://t-online.de/computer/haupt/intcoh87.htm -http://prodigy-sports.excite.com/ncaab/news/025uwire1 -http://wwwold.ifi.uni-klu.ac.at/Manuals/jdk1.1b3/docs/guide/awt/designspec/graphics/imagescale.html -http://www.taconet.com.tw/a6983/ -http://www.mapion.co.jp/custom/AOL/admi/13/13107/higashimukojima/3chome/index-3.html -http://www.mapion.co.jp/custom/AOL/admi/13/13107/higashimukojima/3chome/index-13.html -http://caller-times.com/autoconv/kickoff98/kickoff30.html -http://www.incestpornstories.com/bisexualbisexual/big-bonedmen/beautiesslanted-eyes/plus-sizeoverweight/{teenlink} -http://qcardsccg.safeshopper.com/8/359.htm?923 -http://qcardsccg.safeshopper.com/8/429.htm?923 -http://qcardsccg.safeshopper.com/8/433.htm?923 -http://lib1.nippon-foundation.or.jp/1997/0486/contents/011.htm -http://commerce.was-inc.com/cgi-bin/abtwsam.dll/LbkWebCommerceOrderStatusOverview-BBC709F1_97EF_F357031944376B6D965FDC23BED4C6F4 -http://in.egroups.com/subscribe/muovimallit -http://multichat.de/fp/talk/cb-funk/4.htm -http://multichat.de/fp/talk/cb-funk/5.htm -http://www.jamba.de/KNet/_KNet-zfB8j1-EFd-13bkr/browse.de/node.0/cde7f2elw -http://www.jamba.de/KNet/_KNet-zfB8j1-EFd-13bl7/showInfo-jobs.de/node.0/cenv0b09a -http://152.80.49.210/PUBLIC/WXMAP/GLOBAL/AVN/2000103000/avn.prp.00-36.swasia.htm -http://retailer.gocollect.com/do/session/1912741/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/help/site_tour/index.asp -http://retailer.gocollect.com/do/session/1912741/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/product_display/top_ten.asp?pagenum=2 -http://www.fogdog.com/cedroID/ssd3040183248168/nav/products/winter_sports/1b/shell_jackets/ -http://www.fogdog.com/cedroID/ssd3040183248168/nav/products/featured_brands/3c/all/ -http://kutschen.de/Schoner/literature/Sammlungen/modelle/collections/ -http://el-mundo.es/1999/06/04/television/04N0121.html -http://bitwise.tucows.com/win2k/htmlval2k_license.html -http://bbs.ee.ntu.edu.tw/boards/Saturn/3/7/12/5.html -http://ustlib.ust.hk/search*chi/deconomic+conditions+cameroon+to+1960/deconomic+conditions+cameroon+to+1960/-5,-1,0,B/browse -http://excite.de/kunst/katalog/865 -http://www2.hindustantimes.com/ht/nonfram/280498/detFRO07.htm -http://yp.gates96.com/11/69/0/60.html -http://yp.gates96.com/11/69/1/60.html -http://yp.gates96.com/11/69/1/72.html -http://yp.gates96.com/11/69/2/80.html -http://yp.gates96.com/11/69/3/7.html -http://yp.gates96.com/11/69/3/54.html -http://yp.gates96.com/11/69/3/66.html -http://yp.gates96.com/11/69/3/90.html -http://yp.gates96.com/11/69/3/91.html -http://yp.gates96.com/11/69/4/13.html -http://yp.gates96.com/11/69/4/18.html -http://yp.gates96.com/11/69/4/26.html -http://yp.gates96.com/11/69/4/70.html -http://yp.gates96.com/11/69/5/45.html -http://yp.gates96.com/11/69/5/77.html -http://yp.gates96.com/11/69/6/10.html -http://yp.gates96.com/11/69/6/80.html -http://yp.gates96.com/11/69/7/43.html -http://yp.gates96.com/11/69/7/76.html -http://yp.gates96.com/11/69/8/17.html -http://yp.gates96.com/11/69/8/33.html -http://yp.gates96.com/11/69/8/98.html -http://yp.gates96.com/11/69/9/3.html -http://yp.gates96.com/11/69/9/41.html -http://yp.gates96.com/11/69/9/92.html -http://store.peoplestour.com/kore/catalog/Music/R&B/G_by_artist/104757/product.html -http://free.prohosting.com/~seikyo/speak2.htm -http://pub.chinaccm.com/12/news/200009/16/160724.asp -http://pub.chinaccm.com/12/news/200008/11/155448.asp -http://www.fogdog.com/cedroID/ssd3040183305379/nav/products/featured_brands/12r/spa_products/ -http://itcareers.careercast.com/texis/it/itjs/+EwwBmev6D86ebtwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewGtmoBGnaqdGpdGwBodDacnwmaADdicnmtnaMwDwtnMnDBanDtoDnnGaMw55wqr15nBB5aqwpB1GnaoDhdGMwBodDaBnqrDdcdton5aMFqhTfR20DzmewrwwwpBmGeP0-dmwww5rmeNDwwwBrmeZpwww/jobpage.html -http://www.outdoorwire.com/content/lists/dirt/200004/msg00354.html?{LoadingFrameset} -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=5&discrim=186,22,8 -http://www.teleparc.com/sports/funski/02/03.htm -http://cn.egroups.com/post/safrica_bridge?act=reply&messageNum=43 -http://www.dfae.diplomatie.gouv.fr/culture/france/cinema/documentaires/recherche/francais/ethique.html -http://ring.toyama-ix.net/archives/mac/info-mac/_Communication/ctb/?D=A -http://www.eveclub.com/cgi-bin/eveclub.front/972959528284/Catalog/11000155 -http://www.eveclub.com/cgi-bin/eveclub.front/972959528284/Catalog/2000019 -http://cometweb01.comet.co.uk/do!session=132005&vsid=700&tid=20&cid=37030&mid=1000&rid=1060&chid=1713&url=eqqLmwlGltt5tkZHljbLqkZHlkrHhlZHdfjKYfkLlkZ5ljjLboZLbplG5ubLZDXLZolLl3l5jbqLljX5fkkKaotHlob5mloLq1 -http://cometweb01.comet.co.uk/do!session=132005&vsid=700&tid=20&cid=37030&mid=1000&rid=1060&chid=1713&url=eqqLmwlGltt5tkZHljbLqkZHlkrHhlZHdfjKYfkLlkZ5ljjLboZLbplG3XqLbdlLov4LfpmLiXvL-Zd5jbkLYozKvot0cZd5ockLYozKvsm0uts0cZX5qkXLjbzKKbiLbsfLpflLkp5 -http://www.ualberta.ca/CNS/RESEARCH/Software/SAS/cms/zfor-hex.htm -http://www.ualberta.ca/CNS/RESEARCH/Software/SAS/os390/zlibname.htm -http://genforum.genealogy.com/cgi-bin/print.cgi?hanrahan::175.html -http://library.bangor.ac.uk/search/dAIDS+(Disease)+--+Risk+factors+--+Psychological+aspects+--+Periodicals/daids+disease+risk+factors+psychological+aspects+periodicals/-5,1,1,B/frameset&F=daids+disease+research&1,1, -http://www.rismedia.com/consumer/27/12194/ -http://www.hole.kommune.no/hole/journweb.nsf/weboffjournal!OpenView&Start=39&Count=50&Expand=38 -http://www.etoys.com/prod/toy/53097261 -http://www.outpersonals.com/cgi-bin/w3com/pws/out/J6tI5danl1CaEvxOmyBVl8pzyaGqhs1RWIGq0aJ2_fwvzv4y9T7bHlxQKPzsrhMRN5HEI_Y9ZKrSvboCZvKhdwPPYK2klPp0EqNMO7Mb8fDTcz6xykQv8YQCQ2dy_iLZjbXwrknXqcH32HVSXAq7iUr4yIVG66IK -http://www.amcity.com/jacksonville/stories/1999/11/22/daily16.html?t=printable -http://moviestore.zap2it.com/browse/MOVIES/BOXERSHO/s.F0FWmEHm -http://moviestore.zap2it.com/browse/MOVIES/SHIRT/s.F0FWmEHm -http://moviestore.zap2it.com/browse/MOVIES/TIE/s.F0FWmEHm -http://moviestore.zap2it.com/browse/MOVIES/WATCH/s.F0FWmEHm -http://yp.gates96.com/11/25/30/0.html -http://yp.gates96.com/11/25/30/47.html -http://yp.gates96.com/11/25/31/87.html -http://yp.gates96.com/11/25/32/3.html -http://yp.gates96.com/11/25/32/61.html -http://yp.gates96.com/11/25/32/97.html -http://yp.gates96.com/11/25/33/6.html -http://yp.gates96.com/11/25/33/81.html -http://yp.gates96.com/11/25/33/83.html -http://yp.gates96.com/11/25/34/10.html -http://yp.gates96.com/11/25/34/35.html -http://yp.gates96.com/11/25/34/88.html -http://yp.gates96.com/11/25/34/90.html -http://yp.gates96.com/11/25/35/95.html -http://yp.gates96.com/11/25/36/19.html -http://yp.gates96.com/11/25/36/98.html -http://yp.gates96.com/11/25/37/61.html -http://yp.gates96.com/11/25/37/74.html -http://yp.gates96.com/11/25/38/2.html -http://yp.gates96.com/11/25/38/62.html -http://yp.gates96.com/11/25/39/1.html -http://yp.gates96.com/11/25/39/25.html -http://yp.gates96.com/11/25/39/85.html -http://yp.gates96.com/11/25/39/95.html -http://www.linux.com/networking/network/industry/server/community/Red_Hat/ -http://www.linux.com/networking/network/industry/server/community/Slashdot/ -http://www.linux.com/networking/network/industry/server/community/growth/ -http://mirror.cc.utsunomiya-u.ac.jp/mirror/CPAN/modules/by-category/16_Server_and_Daemon_Utilities/Server/DRUOSO/Server-FastPL-1.0.0.readme -http://ftp.nacamar.de/pub/NetBSD/NetBSD-current/pkgsrc/parallel/clusterit/pkg/DESCR -http://dk.egroups.com/login.cgi?login_target=%2Fgroup%2FGravesrus -http://www.maxfunds.com/MF1000.nsf/FUNDanalysisPrint/FGOAX -http://www.gbnf.com/genealog2/brothers/html/d0065/I12666.HTM -http://office.net/benelux/nld/downloadcatalog/dldpowerpoint.asp -http://yam.com/en/rand/ent/music/minfo/ -http://kernel2.adver.com.tw/Counter/log/kernel2.adver.com.tw/Collect_DB_Advers2/2000-09-28/23/?N=D -http://www.arm.com/sitearchitek/support.ns4/html/cores_faq!OpenDocument&ExpandSection=22,11,35 -http://dk.egroups.com/messages/lafz/6 -http://www.online.kokusai.co.jp/Words/V0043555/wrd/G700/words/kana_main.html -http://adelaida.net/music/texts/pink75.html -http://support.tandy.com/support_audio/doc40/40914.htm -http://www.nutritionblvd.com/426162.html -http://www.nutritionblvd.com/426121.html -http://www.nutritionblvd.com/426117.html -http://www.fogdog.com/cedroID/ssd3040183301450/boutique/aaron_chang/ -http://www.fogdog.com/cedroID/ssd3040183301450/boutique/moving_comfort/ -http://www.fogdog.com/cedroID/ssd3040183301450/fly/ -http://in.egroups.com/login.cgi?login_target=%2Fmessage%2Finfogiappone%2F81 -http://in.egroups.com/post/infogiappone?act=reply&messageNum=81 -http://cn.egroups.com/message/1800list/5416 -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/www.slac.stanford.edu/grp/arb/tn/arbvol1/ARDB011.pdf -http://crrstv.tucows.com/winnt/adnload/135146_46908.html -http://syix.tucows.com/win2k/adnload/61785_28334.html -http://ftp.ccu.edu.tw/pub/language/tcl/sorted/packages-7.6/sound/xmpeg_0.5/ -http://www.eos.ncsu.edu/linux/LDP/LDP/khg/HyperNews/get/fs/fs/3.html -http://polygraph.ircache.net:8181/http_-2www.tvguide.com/sports/football/http_-2home.netscape.com/http_-2www.premaonline.com/http_-2www.ionet.net/~burndragon/form1.html -http://se.egroups.com/group/MyLuminaGoezBoom -http://www.diogenes.ch/4DACTION/web_rd_aut_show_author/a_id=7056553&tmpl=AUT_00&ID=483371 -http://www3.newstimes.com/archive97/apr0497/tvg.htm -http://dic.empas.com/show.tsp/?q=edger&f=B -http://www.brio.de/BRIO.catalog/39fe2f570905fb6a2740d472aa7806aa/UserTemplate/2 -http://itcareers.careercast.com/texis/it/itjs/+uwwBme7WD86eYtwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewGtmoBGnaqdGpdGwBodDaoDhdGMwBodDa5nq1GoBOanDtoDnnGaiw5roDtBdDanDBnGpGo5naGn31oGnmawGqroBnqB1Gna5O5BnM5aMFqhTfR20DzmehrwwwpBmeZWD86Nwww5rmekdwwwBrmeZpwww/jobpage.html -http://itcareers.careercast.com/texis/it/itjs/+pwwBmet5986twwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewGtmoBGnaqdGpdGwBodDaoDhdGMwBodDa5nq1GoBOanDtoDnnGaiw5roDtBdDanDBnGpGo5naGn31oGnmawGqroBnqB1Gna5O5BnM5aMFqhTfR20DzmehrwwwpBmeZWD86Nwww5rmekdwwwBrmeZpwww/morelike.html -http://biblioteca.upv.es/bib/doc/doc_fisbd/180/132317//C/1825784/0////25/S/MLTPAI -http://www.stanford.edu/~sevls/files/?M=D -http://library.bangor.ac.uk/search/dSystem+analysis+--+Periodicals/dsystem+analysis+periodicals/-17,-1,0,B/browse -http://mirror.ox.ac.uk/Mirrors/ftp.redhat.com/roughcuts/m68k/misc/src/install/pci-probing/CVS/ -http://yp.gates96.com/0/13/10/17.html -http://yp.gates96.com/0/13/11/26.html -http://yp.gates96.com/0/13/12/20.html -http://yp.gates96.com/0/13/12/24.html -http://yp.gates96.com/0/13/12/49.html -http://yp.gates96.com/0/13/13/22.html -http://yp.gates96.com/0/13/13/80.html -http://yp.gates96.com/0/13/15/8.html -http://yp.gates96.com/0/13/16/4.html -http://yp.gates96.com/0/13/16/18.html -http://yp.gates96.com/0/13/16/64.html -http://yp.gates96.com/0/13/17/15.html -http://yp.gates96.com/0/13/18/11.html -http://yp.gates96.com/0/13/18/18.html -http://yp.gates96.com/0/13/19/5.html -http://yp.gates96.com/0/13/19/22.html -http://yp.gates96.com/0/13/19/60.html -http://library.cuhk.edu.hk/search*chi/aYen-shou,+Shih,+904-975./ayen+shou+shih++904++975/-5,-1,0,E/2browse -http://china.sydney2000.com/StaticNews/2000-07-29/News372a86.htm -http://www.fujian-window.com/Fujian_w/news/mzrb1/20000724/3_1.html -http://www.fujian-window.com/Fujian_w/news/mzrb1/20000724/3_2.html -http://legalminds.lp.findlaw.com/list/law-lib/nav07807.html -http://ftp.fi.debian.org/debian/dists/woody/contrib/binary-sparc/tex/?N=D -http://community.webshots.com/photo/3635718/3636284GcTotmmONR -http://www.power2lead.com/Global/English.nsf/pgWWLocations!OpenPage&ExpandSection=23,24,25,17,10 -http://spaindustry.com/por/exp/911.html -http://niagara.tucows.com/winme/preview/10464.html -http://niagara.tucows.com/winme/adnload/138750_30032.html -http://niagara.tucows.com/winme/adnload/138743_30025.html -http://niagara.tucows.com/winme/adnload/138740_30023.html -http://retailer.gocollect.com/do/session/1912780/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/product_display/advanced_search.asp -http://preview.egroups.com/messages/UKMatrix -http://fi.egroups.com/login.cgi?login_target=%2Fmessage%2Fhecates_news%2F21 -http://pub.chinaccm.com/02/news/200005/31/133146.asp -http://pub.chinaccm.com/02/news/200005/31/133212.asp -http://localhost/test, -http://kuyper.calvin.edu/fathers2/ANF-02/anf02-25.htm -http://kuyper.calvin.edu/fathers2/ANF-02/anf02-56.htm -http://totalsports.aol.com/stats/bbo/mlb/mlb/990910.cle.AT.cws.box.html -http://totalsports.aol.com/stats/bbo/mlb/mlb/990915.nym.AT.col.box.html -http://totalsports.aol.com/stats/bbo/mlb/mlb/990919.cws.AT.tor.box.html -http://totalsports.aol.com/stats/bbo/mlb/mlb/990926.hou.AT.mil.box.html -http://totalsports.aol.com/stats/bbo/mlb/mlb/991003.nyy.AT.tam.box.html -http://totalsports.aol.com/stats/bbo/mlb/mlb/991006.bos.AT.cle.box.html -http://totalsports.aol.com/stats/bbo/mlb/mlb/ALscores.html -http://totalsports.aol.com/stats/bbo/mlb/mlb/CAT.ROS.pit.html -http://totalsports.aol.com/stats/bbo/mlb/mlb/NYY.CLE.pit.html -http://totalsports.aol.com/stats/bbo/mlb/mlb/mlb.ARI.recap.html -http://totalsports.aol.com/stats/bbo/mlb/mlb/mlb.atl.vs.hou.stat.html -http://www.jpc-music.com/2241771.htm -http://sunsite.org.uk/packages/TeX/uk-tex/macros/latex/contrib/supported/europs/?M=A -http://mitglied.tripod.de/blueblood/forum.html -http://kuyper.calvin.edu/fathers2/NPNF1-06/npnf1-06-92.htm -http://garbage.sonicnet.com/classical/features/Thomas,_Tilson/060500/index04.jhtml -http://dk.egroups.com/post/danish?act=forward&messageNum=6 -http://www.bornloser.com/comics/peanuts/f_profiles/html/f4b1.html -http://www.online.kokusai.co.jp/Home/V0043517/wrd/G100/ -http://www.affiliate.hpstore.hp.co.uk/do/session/380823/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.france.hp.com/Main/acheterhp/ -http://www.bemi-immobilien.de/Landhaus-Bordeaux/Gemeinsam/versicherungen/lebensversicherung/Gemeinsam/Startseite/Top-Darlehens-Konditionen/Gemeinsam/erreichenPartner/email3d.htm -http://sunsite.org.uk/public/pub/Mirrors/ftp.hpc.uh.edu/pub/?D=A -http://genforum.genealogy.com/cgi-bin/print.cgi?tillery::418.html -http://ring.omp.ad.jp/archives/lang/perl/CPAN/authors/id/MSCHWARTZ/?M=A -http://montxsuz.all-hotels.com/usa/massachusetts/plymouth_e1.htm -http://montxsuz.all-hotels.com/usa/massachusetts/brewster_e1.htm -http://montxsuz.all-hotels.com/usa/massachusetts/edgartown_e1.htm -http://montxsuz.all-hotels.com/usa/massachusetts/north_dartmouth_e1.htm -http://montxsuz.all-hotels.com/usa/massachusetts/washington_e1.htm -http://romeo.univ-savoie.fr/winnt/adnload/51179_28892.html -http://www.dispatch.co.za/1998/12/02/sport/FALDO.HTM -http://www.dispatch.co.za/1998/12/02/sport/RACE2.HTM -http://store1.europe.yahoo.com/brink2/2000074707407.html -http://www34.yahoo.co.jp/horse/1999/tokyo/0530/result_08.html -http://members.tripod.co.jp/suiha_izumi/gallery-taikoubou-.htm -http://linuxberg.vol.at/gnomehtml/adnload/020-008-002-004_6145.html -http://books.hyperlink.com/bookdetails/Nuclear_Power_Plants_Worldwide/0810388804 -http://www.hudecek.de/gen/gen57.htm -http://www.hudecek.de/gen/gen61.htm -http://unofficial.capital.edu/students/kralph/ -http://web6.peopledaily.com.cn/gjjrb/200004/home.htm -http://www.gov.hk/hkma/eng/public/sccr/toc.htm -http://www4.50megs.com/johnphil29/86week3injury.htm -http://www4.50megs.com/johnphil29/86week3loupitlog.htm -http://naver22.juniornaver.co.kr/Entertainment_and_Arts/Performing_Arts/Theater/Musical/ -http://198.103.152.100/search*frc/dInfrastructure+(Economics)+--+Canada/dinfrastructure+economics+canada/-5,-1,0,B/frameset&F=dinfrastructure+economics&3,,0 -http://198.103.152.100/search*frc/dInfrastructure+(Economics)+--+Canada/dinfrastructure+economics+canada/-5,-1,0,B/frameset&F=dinfrastructure+economics&5,,0 -http://www.playgirl.dk/oncampus/feature/collegemovies/06.html -http://www.linux.com/networking/support/red_hat/internet/consumer/growth/ -http://www.linux.com/networking/support/red_hat/internet/consumer/mainstream/ -http://no.egroups.com/message/tengu-l/224 -http://no.egroups.com/message/tengu-l/229 -http://oss.sgi.com/cgi-bin/cvsweb.cgi/linux-2.3-4/linux/Documentation/filesystems/romfs.txt?only_with_tag=LINUX-2_3_24 -http://oss.sgi.com/cgi-bin/cvsweb.cgi/linux-2.3-4/linux/Documentation/filesystems/romfs.txt?only_with_tag=LINUX-2_3_22 -http://oss.sgi.com/cgi-bin/cvsweb.cgi/linux-2.3-4/linux/Documentation/filesystems/romfs.txt?only_with_tag=LINUX-2_3_16 -http://sunsite.informatik.rwth-aachen.de/LinuxArchives/slackware/slackware/source/a/e2fsprog/?M=A -http://bbs.syu.ac.kr/NetBBS/Bbs.dll/ipspds018/lst/qqa/f/qqo/008A/zka/B2-kB2-p -http://stulchik.list.ru/catalog/13346.html -http://katalog.wp.pl/www/Biznes_i_Ekonomia/Firmy_Podzial_wg_Branz/Elektrotechnika_i_Energetyka/index25.html -http://www.fogdog.com/cedroID/ssd3040183313356/nav/stores/tennis/ -http://www.fogdog.com/cedroID/ssd3040183313356/customer_service/shop_by_catalog.html -http://193.207.57.3/cgi-win/hiweb.exe/a2/d13/b4,4,1f,4,4,, -http://ring.omp.ad.jp/archives/lang/perl/CPAN/modules/by-authors/id/JPRIT/Envy-2.45.readme -http://193.207.57.3/cgi-win/hiweb.exe/a2/d1342/b4,4,1f,e,e,, -http://library.wuhee.edu.cn/dzsy/military/china/army/002.htm -http://library.wuhee.edu.cn/dzsy/military/china/army/006.htm -http://library.wuhee.edu.cn/dzsy/military/china/army/059.htm -http://library.wuhee.edu.cn/dzsy/military/china/army/095.htm -http://polygraph.ircache.net:8181/http_-2www.geocities.com/TimesSquare/Maze/2075/http_-2www.yahoo.com/Science/Engineering/Mechanical_Engineering/corporate.htm -http://198.103.152.100/search*frc/aGundavaram,+Shishir/agundavaram+shishir/-17,-1,0,B/frameset&F=aguirdham+maureen&1,1 -http://findmail.com/message/geewhiz/21 -http://sound-dist.secured.co.uk/cgi-bin/psProdDet.cgi/19P02|972959597|Luggage|user|0|1,0,0,1 -http://sound-dist.secured.co.uk/cgi-bin/psShop.cgi/add|19P03|972959597|Luggage|user|0|1,0,0,1 -http://nme.com/AST/Discussion_Groups/CDA/Message_Search/1,1105,37_92-0-0-7,00.html -http://namviet.subportal.com/sn/Programming/Visual_Basic_Components_H-P/5638.html -http://www2.so-net.ne.jp/cinet/board/log/200001/messages/4963.html -http://www2.so-net.ne.jp/cinet/board/log/200001/messages/4810.html -http://www2.so-net.ne.jp/cinet/board/log/200001/messages/4735.html -http://www2.so-net.ne.jp/cinet/board/log/200001/messages/3294.html -http://www2.so-net.ne.jp/cinet/board/log/200001/messages/3329.html -http://www2.so-net.ne.jp/cinet/board/log/200001/messages/4689.html -http://www2.so-net.ne.jp/cinet/board/log/200001/messages/4646.html -http://www2.so-net.ne.jp/cinet/board/log/200001/messages/4582.html -http://www2.so-net.ne.jp/cinet/board/log/200001/messages/4587.html -http://www2.so-net.ne.jp/cinet/board/log/200001/messages/4154.html -http://www2.so-net.ne.jp/cinet/board/log/200001/messages/4607.html -http://www2.so-net.ne.jp/cinet/board/log/200001/messages/4600.html -http://www2.so-net.ne.jp/cinet/board/log/200001/messages/4571.html -http://www.gotocity.com/local/2/us/KS/g/67455/shopping/ -http://www.mapion.co.jp/custom/AOL/admi/13/13115/ogikubo/1chome/index-1.html -http://www.mapion.co.jp/custom/AOL/admi/13/13115/ogikubo/1chome/index-21.html -http://neuro-www.mgh.harvard.edu/forum_2/ChronicPainF/Capornottocapthatisthe.html -http://www.yagoo.co.kr/stats/pitching.asp?Mlbmanid=MIGDEL7299 -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=50&discrim=165,233,7 -http://www.mirror.edu.cn/res/sunsite/pub/academic/literature/book-reviews/1994/8-August/?N=D -http://www.ferien-immobilien.de/ungarn/verkauf/Versteigerungen-IB/Startseite/Allgemeine-IB/Gemeinsam/versicherungen/gebaeude/Gemeinsam/vertriebspartner.htm -http://www.ferien-immobilien.de/ungarn/verkauf/Versteigerungen-IB/Startseite/Allgemeine-IB/Gemeinsam/versicherungen/gebaeude/Gemeinsam/feedback.html -http://www.bjd.com.cn/BJWB/20000401/GB/BJWB^10199^1^01W136.htm -http://pluto.beseen.com/boardroom/u/49766/ -http://amadeus.siba.fi/doc/bitchx/documentation/color.txt -http://www.ealingcommon.londonengland.co.uk/pensions.htm -http://pub8.ezboard.com/fthecriticalpoetsmessageboartheartofcritiquing.showMessage?topicID=11.topic&index=13 -http://pub8.ezboard.com/fthecriticalpoetsmessageboareverythingelse.showMessage?topicID=223.topic&index=10 -http://www.endocrine.ru/Meln_09_10_00/_vti_bin/shtml.exe/meln_post.htm?79 -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=9,0+9,3-12,0+18,0 -http://www.jobvillage.com/channel/jobs/media_communication/b.9255.g.1733.html -http://www.teenplatinum.com/barelylegal/no-boundarieshardcore/flashingbarely-legal/sweatingendurance/cuntamateur/chinesepetite/bootygay-bar/lubricationfellatio.html -http://www.babyheirlooms.com/catalog/htmlos.cat/001222.1.5246799112 -http://src.openresources.com/debian/src/utils/HTML/R/change_cur_jutil.html -http://genforum.genealogy.com/caudill/messages/389.html -http://www.allkorea.co.jp/cgi-bin/allkorea.front/972959928076/Catalog/1000003 -http://www.allkorea.co.jp/cgi-bin/allkorea.front/972959928076/ContentView/1000188/1/1201981 -http://www.marketingtool.com/contribute/webfirm/b.435.r.2416.html -http://dell.excite.co.jp/member_encounters/mailing_list/ml_for_women -http://www.angeredsgymn.se/doc/sdb/en/html/keylist.SIGNSET.html -http://map.ipc.co.jp/asp/onmap/r/new/g-27/f-525628/ -http://www.jpc-music.com/2549026.htm -http://www.egroups.com/message/nandscarolina/324?source=1 -http://www.jpc-music.com/2226499.htm -http://www.jpc-music.com/2226480.htm -http://tucows.bigskysoft.com/winnt/miscaudiont_rating.html -http://tucows.bigskysoft.com/winnt/adnload/69355_28370.html -http://www.hole.kommune.no/hole/journweb.nsf/weboffjournal!OpenView&Start=115.23&Count=50&Expand=130 -http://personal.atl.bellsouth.net/mia/a/j/ajcubas/ -http://yp.gates96.com/7/49/21/96.html -http://yp.gates96.com/7/49/22/39.html -http://yp.gates96.com/7/49/22/60.html -http://yp.gates96.com/7/49/22/70.html -http://yp.gates96.com/7/49/22/75.html -http://yp.gates96.com/7/49/23/8.html -http://yp.gates96.com/7/49/23/30.html -http://yp.gates96.com/7/49/23/43.html -http://yp.gates96.com/7/49/24/7.html -http://yp.gates96.com/7/49/24/8.html -http://yp.gates96.com/7/49/24/27.html -http://yp.gates96.com/7/49/24/49.html -http://yp.gates96.com/7/49/25/92.html -http://yp.gates96.com/7/49/26/56.html -http://yp.gates96.com/7/49/26/77.html -http://yp.gates96.com/7/49/28/23.html -http://yp.gates96.com/7/49/28/34.html -http://yp.gates96.com/7/49/29/56.html -http://yp.gates96.com/7/49/29/60.html -http://sound-dist.secured.co.uk/cgi-bin/psShop.cgi/add|38P08B|972959501|Communications|user|0|1,0,0,1 -http://193.207.57.3/cgi-win/hiweb.exe/a2/d170/b9,4,1f,1c,1c,, -http://wuarchive.wustl.edu/systems/linux/replay/debian/dists/unstable/non-US/binary-hurd-i386/?M=D -http://www.private-immobilien-boerse.de/friesland/verkauf/Ferien-IB/Startseite/Gemeinsam/MarketingStrategie/Allgemeine-IB/Startseite/Exklusiv-IB/Startseite/ -http://citeseer.nj.nec.com/update/269184 -http://citeseer.nj.nec.com/cidcontext/3266491 -http://citeseer.nj.nec.com/cidcontext/3266502 -http://genforum.genealogy.com/cgi-genforum/forums/hinkle.cgi?786 -http://eagle.synet.edu.cn/mirror/www.wisc.edu/grad/catalog/cals/biometry.html -http://cisne.sim.ucm.es/search*spi/cCDR7(035)TRA/ccdr7(035)tra/-5,-1,0,B/frameset&F=ccdr7(058)may&1,1 -http://www.wfg-rhein-lahn.de/goldenes-fass/schrott2.htm -http://www.jamba.nl/KNet/_KNet-6Aw8j1-pC4-ptt0/browse.nl/node.0/cdn40t70v -http://www.dcc.ufmg.br/Entnet/estrem/tsld018.htm -http://sites.uol.com.br/knaumann/DorstnerDrahtwerke.html -http://64.209.212.162/learnlots/step/0,2891,9+47+95+23413+12412_0,00.html -http://www.on-semiconductor.com/pub/prod/0,1824,productsm_ProductSummary_BasePartNumber=LM337A,00.html -http://jxi.gov.cn/yw-gn001.nsf/view!OpenView&Start=39.19&Count=30&Expand=53 -http://systemlogic.neoseeker.com/Games/Products/PC/dropship/dropship_reviews.html -http://link.fastpartner.com/do/session/600373/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/smartguy.php -http://www.bsv.ch/ch/d/sr/0_211_222_1/a10.html -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/contact.netscape.com/contact -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/entertainment.netscape.com/entertainment/ -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/games.netscape.com/computing/games/features/ -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/home.netscape.com/finance/taxes/ -http://link.fastpartner.com/do/session/600379/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/brleksaker.php -http://itcareers.careercast.com/texis/it/itjs/+TwwBmeOWD86eDhwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewPXwotoBwcaqconDBahoDwDqnaqddGmoDwBdGaqdMpwDon5aBnwMax1mtnBoDtaMwoDBnDwDqnapGdqn55n5aGn51MnaMFqryfHfREIDzmUwwwpBme+9D86Exww5rme7dwwwBrmeZpwww/jobpage.html -http://fi.egroups.com/message/handebol_aaagm/5?source=1 -http://www.crutchfield.com/cgi-bin/S-SHC3792E7De/viewcart.asp -http://www.links2go.org/more/www.asle.umn.edu/ -http://yp.gates96.com/7/69/10/58.html -http://yp.gates96.com/7/69/10/64.html -http://yp.gates96.com/7/69/10/76.html -http://yp.gates96.com/7/69/10/91.html -http://yp.gates96.com/7/69/11/31.html -http://yp.gates96.com/7/69/11/67.html -http://yp.gates96.com/7/69/11/70.html -http://yp.gates96.com/7/69/11/88.html -http://yp.gates96.com/7/69/11/96.html -http://yp.gates96.com/7/69/12/25.html -http://yp.gates96.com/7/69/12/29.html -http://yp.gates96.com/7/69/12/61.html -http://yp.gates96.com/7/69/12/65.html -http://yp.gates96.com/7/69/12/73.html -http://yp.gates96.com/7/69/13/30.html -http://yp.gates96.com/7/69/13/36.html -http://yp.gates96.com/7/69/14/8.html -http://yp.gates96.com/7/69/14/32.html -http://yp.gates96.com/7/69/14/54.html -http://yp.gates96.com/7/69/14/62.html -http://yp.gates96.com/7/69/14/83.html -http://yp.gates96.com/7/69/15/34.html -http://yp.gates96.com/7/69/15/87.html -http://yp.gates96.com/7/69/16/18.html -http://yp.gates96.com/7/69/17/5.html -http://yp.gates96.com/7/69/17/22.html -http://yp.gates96.com/7/69/17/44.html -http://yp.gates96.com/7/69/17/86.html -http://yp.gates96.com/7/69/17/88.html -http://yp.gates96.com/7/69/18/16.html -http://yp.gates96.com/7/69/18/83.html -http://yp.gates96.com/7/69/18/88.html -http://yp.gates96.com/7/69/19/0.html -http://yp.gates96.com/7/69/19/1.html -http://yp.gates96.com/7/69/19/97.html -http://213.36.119.69/do/session/152995/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/jeux/jeux_himalaya.html -http://www.egroups.com/post/sikhstudent?act=forward&messageNum=77 -http://ca.yahoo.com/Regional/U_S__States/Wisconsin/Metropolitan_Areas/Milwaukee_Metro/Business_and_Shopping/Shopping_and_Services/Food_and_Drink/Beverages/ -http://www.aelita.net/products/services/library/~archive/Download_redirect/company/news/default.htm -http://mindex.tucows.com/winme/preview/430.html -http://coda.nctu.edu.tw/vendors/DBMaker/DBMaker/driver/PHP/?S=A -http://www.streetprices.com/Electronics/Computer_Hardware_PC/Switches/Monitor/MAKE+BELKIN+COMPONENTS/sortproductbydesc/SP151043.html -http://wynnsystems.com/y9I_5aVd/careerlink.html -http://www.volny.cz/alik/akordy/zizen.htm -http://www.houses-apartment-listings.com/Michigan/city_search_criteria.asp?state=MI&City=CHAMPION -http://pub9.ezboard.com/fpyro1394pyro1394.showAddReplyScreenFromWeb?topicID=345.topic -http://www.maastrek.de/maas/01851471b455eff5cd01/1/0/1 -http://beta.mkn.co.uk/wine/order/champ2?what-mnw9=1 -http://beta.mkn.co.uk/wine/order/champ2?what-mnw14=1 -http://sunsite.org.uk/public/pub/packages/andrew/auis-6.3/overhead/ -http://www.ferien-immobilien.de/Spanien/Verkauf/GmbH-Kauf-Verkauf-Insolvenz-konkurs/Startseite/Gemeinsam/Exklusiv-IB/Startseite/Gemeinsam/geschaeftsbedingungen.htm -http://www.trax.nilex.co.uk/trax.cgi/A1S/A2S/A3S/1AL/A2D/A1S/ -http://www.trax.nilex.co.uk/trax.cgi/A1S/A2S/A3S/1AL/A2D/C2S/ -http://tv.thevines.com/leaf/AA0000369148/3/1 -http://tv.thevines.com/leaf/AA0000369148/37/0/&favorite[join]=yes -http://www.centc251.org/forums/aca-1/dispatch.cgi/isowg4/showFolder/100001/1304571 -http://freebsd.ntu.edu.tw/perl/modules/by-module/FileCache/ILYAZ/?D=A -http://www.highwired.net/Sport/Player/0,2291,2037-46698,00.html -http://www.nl.sco.com/unixware/adminguide/qs-11-32.html -http://www.online.kokusai.co.jp/Service/V0043502/wrd/G200/service/service.html -http://www.realize.com/ambe7581.htm,qt=e784fe2f=2a38a234-14-26557ed-80000000-0-0-3-- -http://www.realize.com/am9a7d81.htm,qt=e784fe2f=2a38a234-14-26557ed-80000000-0-0-3-- -http://www.geocities.co.jp/Colosseum/7952/dragon3.html -http://uk.dir.clubs.yahoo.com/Entertainment___Arts/Magic/~other/~White_Pages/2.html -http://yp.gates96.com/13/9/60/95.html -http://yp.gates96.com/13/9/60/97.html -http://yp.gates96.com/13/9/61/12.html -http://yp.gates96.com/13/9/61/42.html -http://yp.gates96.com/13/9/61/52.html -http://yp.gates96.com/13/9/62/13.html -http://yp.gates96.com/13/9/62/19.html -http://yp.gates96.com/13/9/62/32.html -http://yp.gates96.com/13/9/62/44.html -http://yp.gates96.com/13/9/62/75.html -http://yp.gates96.com/13/9/63/71.html -http://yp.gates96.com/13/9/63/89.html -http://yp.gates96.com/13/9/64/16.html -http://yp.gates96.com/13/9/64/64.html -http://yp.gates96.com/13/9/64/83.html -http://yp.gates96.com/13/9/65/15.html -http://yp.gates96.com/13/9/65/39.html -http://yp.gates96.com/13/9/65/81.html -http://yp.gates96.com/13/9/66/19.html -http://yp.gates96.com/13/9/66/51.html -http://yp.gates96.com/13/9/67/72.html -http://yp.gates96.com/13/9/67/75.html -http://yp.gates96.com/13/9/67/93.html -http://yp.gates96.com/13/9/67/94.html -http://yp.gates96.com/13/9/68/9.html -http://yp.gates96.com/13/9/68/14.html -http://yp.gates96.com/13/9/68/23.html -http://yp.gates96.com/13/9/68/39.html -http://yp.gates96.com/13/9/68/68.html -http://yp.gates96.com/13/9/69/22.html -http://yp.gates96.com/13/9/69/62.html -http://shop.intouch.de/cgi-bin/Eternit-Shop/1678827467/IconBar -http://www.jango.com/home_and_garden/outdoor_and_garden/gardening/outdoor_furniture/miscellaneous/?num=1&prod=7 -http://ring.omp.ad.jp/archives/lang/perl/CPAN/authors/id/SHERWOOD/CHECKSUMS -http://www.acad.polyu.edu.hk/spkg/sas8/sasdoc/hrddoc/indfiles/57263.htm -http://ftp.te.fcu.edu.tw/cpatch/system/mbm/source/?D=A -http://web1.localbusiness.com/Story/0,1118,SAN_11751,00.html -http://www.amulation.com/md-l-archive/199902/msg00357.html -http://ads3.zdnet.com/c/g=r1517&c=a53585&camp=c13878&idx=2000.10.30.21.32.11/www.sega.com/seganet -http://pub.chinaccm.com/23/news/200009/30/111206.asp -http://www.online.kokusai.co.jp/Service/V0043534/wrd/G200/service/service.html -http://www.buybuddy.com/sleuth/27/1/1060204/2992/ -http://www.friend4life.com/foreign-affair/infopage/info12655.htm -http://www.friend4life.com/women/info7867.htm -http://www.friend4life.com/women/info11637.htm -http://www.chabadlibrary.org/ecatalog/EC07/EC07328.HTM -http://tulips.ntu.edu.tw/search*chi/cJC311+S275+1992/cjc++311+s275+1992/7,-1,0,E/2browse -http://stationradio.subportal.com/sn/Network_and_Internet/Misc__Networking_Tools/866.html -http://www.canlii.org/ca/regu/sor88-278/sec2.html -http://www.rottentomato.com/movies/titles/traffic/click.php?review=1 -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=4,26,16,35,15 -http://www.staroriental.net/nav/soeg/ihf,aai,n2,169,Electric+Wave+Girl+1998.html -http://www.staroriental.net/nav/soeg/ihf,aai,n2,176,Electric+Wave+Girl+1998.html -http://www.teenplatinum.com/barelylegal/bellyovary/parkingjail-bait/oral-sexoral-sex/big-bonedmen/sex/main.html -http://troy.lib.sfu.ca/search/snewsinc/snewsinc/-5,1,1,B/frameset&F=snewsbrief&1,,2 -http://biblio.cesga.es:81/search*gag/dLó%3Bpez+de+Medina,+Juan/dlopez+de+medina+juan/-5,-1,0,B/frameset&F=dlopez+de+ayala+pedro+critica+e+interpretacion&1,,2 -http://proxy.rmcnet.fr/udsp68/commissions.htm -http://proxy.rmcnet.fr/udsp68/csp_colmar.htm -http://yp.gates96.com/4/0/70/88.html -http://yp.gates96.com/4/0/71/51.html -http://yp.gates96.com/4/0/71/57.html -http://yp.gates96.com/4/0/71/84.html -http://yp.gates96.com/4/0/71/85.html -http://yp.gates96.com/4/0/72/84.html -http://yp.gates96.com/4/0/72/94.html -http://yp.gates96.com/4/0/73/15.html -http://yp.gates96.com/4/0/73/92.html -http://yp.gates96.com/4/0/74/96.html -http://yp.gates96.com/4/0/75/23.html -http://yp.gates96.com/4/0/75/94.html -http://yp.gates96.com/4/0/76/41.html -http://yp.gates96.com/4/0/76/82.html -http://yp.gates96.com/4/0/77/64.html -http://yp.gates96.com/4/0/78/93.html -http://yp.gates96.com/4/0/79/72.html -http://yp.gates96.com/4/0/79/82.html -http://fi.egroups.com/message/morehealth/13?source=1 -http://cn.egroups.com/message/Multicultural/489 -http://cn.egroups.com/message/Multicultural/495 -http://cn.egroups.com/message/Multicultural/497 -http://yp.gates96.com/4/1/60/54.html -http://yp.gates96.com/4/1/60/69.html -http://yp.gates96.com/4/1/61/83.html -http://yp.gates96.com/4/1/62/68.html -http://yp.gates96.com/4/1/63/13.html -http://yp.gates96.com/4/1/63/42.html -http://yp.gates96.com/4/1/63/61.html -http://yp.gates96.com/4/1/63/73.html -http://yp.gates96.com/4/1/64/15.html -http://yp.gates96.com/4/1/64/49.html -http://yp.gates96.com/4/1/64/54.html -http://yp.gates96.com/4/1/65/19.html -http://yp.gates96.com/4/1/65/26.html -http://yp.gates96.com/4/1/65/69.html -http://yp.gates96.com/4/1/65/98.html -http://yp.gates96.com/4/1/66/57.html -http://yp.gates96.com/4/1/66/62.html -http://yp.gates96.com/4/1/66/79.html -http://yp.gates96.com/4/1/66/86.html -http://yp.gates96.com/4/1/66/88.html -http://yp.gates96.com/4/1/67/6.html -http://yp.gates96.com/4/1/67/49.html -http://yp.gates96.com/4/1/67/76.html -http://yp.gates96.com/4/1/67/78.html -http://yp.gates96.com/4/1/68/57.html -http://yp.gates96.com/4/1/69/10.html -http://yp.gates96.com/4/1/69/47.html -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=blich&l=de -http://www.secinfo.com/d17xw.53m.htm -http://www.cs.unm.edu/sheppard-bin/igmdesc.cgi/n=shep/I1475 -http://home.pchome.com.tw/computer/54915491/data/data2.htm -http://forum.rai.it/aca-finestre/dispatch.cgi/FORUM/folderFrame/100001/0/author/3910318 -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=215&discrim=164,80,165 -http://library.bangor.ac.uk/search/cHN582+.R45+1991/chn++582+r45+1991/-5,-1,0,B/bibandlinks&F=chn++573+h313&1,1 -http://mai.flora.org/forum/new-2110 -http://www.tucows.telia.no/winnt/adnload/68747_30295.html -http://www.tucows.telia.no/winnt/adnload/135780_47081.html -http://www.annotate.net/html/Annotate_Directory/Top/Regional/North_America/United_States/Louisiana/Localities/C/Coushatta -http://wine.cc.chuo-u.ac.jp/home/pub/TeX/CTAN/support/mctex/?D=A -http://pub21.ezboard.com/ujaletheadmin.showPublicProfile?language=EN -http://ftp.lip6.fr/pub11/NetBSD/NetBSD-current/src/usr.sbin/quot/Makefile -http://www.hrdc.gc.ca/socpol/cfs/bulletins/jan97/man_f.shtml -http://www.loveme.com/infopage/info23899.htm -http://polygraph.ircache.net:8181/http_-2www.fsa.org/MutareMap.asp -http://www.sdrt.com.cn/tiyuzhichuang/wangqiu/mingxingdangan/4/gelafu.htm -http://home.netvigator.com/~raympoon/digital7.htm -http://www.bemi-immobilien.de/Startseite/www.allgemeine-immobilien-boerse.de/allgemeine-ib/landkreiszwickau/Verkauf/29109700708107kirchbergvillamü/Gemeinsam/3d-service/Top-Darlehens-Konditionen/Startseite/Gemeinsam/immolink/Startseite/froben.htm -http://www.hum.auc.dk/~magnus/MHonArc/NTSEC/frm00999.html -http://www.hum.auc.dk/~magnus/MHonArc/NTSEC/frm09255.html -http://www.affiliate.hpstore.hp.co.uk/do/session/380849/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/entry.asp -http://genforum.genealogy.com/cgi-genforum/forums/skeen.cgi?265 -http://wiem.onet.pl/wiem/00f59f.html -http://www2.ipc.pku.edu.cn/scop/data/scop.1.007.033.001.002.000.html -http://splitrock.themes.tucows.com/cursors/adnload/15789.html -http://splitrock.themes.tucows.com/cursors/adnload/15884.html -http://www.cpami.gov.tw/ymsnp/animal/insect/34654text.htm -http://lateline.muzi.net/ll/fanti/89027.shtml -http://www.hig.se/(accessed,comment,date,header,quote)/~jackson/roxen/ -http://ftpsearch.belnet.be/ftp/packages/Linux-RedHat/up2date/rhl-6.0/alpha/README -http://ftpsearch.belnet.be/ftp/packages/Linux-RedHat/up2date/rhl-6.0/alpha/etc/ -http://ftpsearch.belnet.be/ftp/packages/Linux-RedHat/up2date/rhl-6.0/alpha/lib/ -http://polygraph.ircache.net:8181/services/define/http_-2www.microsoft.com/http_-2www.microsoft.com/ntserver/http_-2www.netscape.com/comprod/mirror/http_-2gateway.olympcfunding.com/products.html -http://polygraph.ircache.net:8181/services/define/http_-2www.microsoft.com/http_-2www.microsoft.com/ntserver/http_-2www.netscape.com/comprod/mirror/http_-2gateway.olympcfunding.com/products/ -http://f7.parsimony.net/forum9177/messages/638.htm -http://f7.parsimony.net/forum9177/messages/594.htm -http://japan.medscape.com/medscape/HIV/journal/1998/v04.n03/expert1098/expert1098.html -http://golfonline.comfluent.net/cgi.pan$advsts&Dicky_Pride&102&lwfth&pga?golfstats -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=93&discrim=5,200,183 -http://girls.4gee.com/japan/azumi_kawashima/big_page/0023.htm -http://www.jobvillage.com/channel/jobs/travel/travel_guide/b.4899.g.37.html -http://www.chaos.dk/sexriddle/b/o/q/p/ -http://www.osiris.978.org/~brianr/mirrors/olga/cowpie/m/mellencamp_john/?N=D -http://www.jpc-music.com/1695294.htm -http://sunsite.org.uk/packages/TeX/uk-tex/macros/latex/contrib/supported/t-angles/?D=A -http://www.shopworks.com/index.cfm/action/info/userid/000B34B5-2F17-19FE-9038010B0A0ADCF2 -http://www.bemi-immobilien.de/Startseite/www.ferien-immobilien.de/ferien-ib/startseite/Top-Darlehens-Konditionen/Gemeinsam/Startseite/Gemeinsam/Gemeinsam/versicherungen/gebaeude/Gemeinsam/Inserieren/onlineInserieren.htm -http://www.idgnet.com/crd_playstation_254384.html -http://www.3wbooks.de/BauerGunter/BauerGunter3406402798.htm -http://library.cwu.edu/search/dSports+--+Washington+(State)+--+Periodicals/dsports+washington+state+periodicals/-5,-1,0,B/request&F=dsports+university+of+michigan&1,,2 -http://www.aelita.net/products/library/sitemap/Reg/Subscribe/sitemap/Reg/QuoteRegister/Default.htm -http://topcu.tucows.com/winme/preview/76604.html -http://tonet.com.cn/zhuanyejihua/kaoshijihua/ligonglei/dianzizhuanyezhuanke.htm -http://tonet.com.cn/zhuanyejihua/kaoshijihua/falv2001.htm -http://tonet.com.cn/zhuanyejihua/kaoshijihua/caijinglei/gongshangqiyeguanlibenke.htm -http://ftp.univ-lyon1.fr/faq/by-name/cats-faq/breeds/american-curl -http://www.videos-erotism.com/xhuge/1/hardMid3.html -http://www.zope.org/Wikis/DevSite/Projects/CoreSessionTracking/WikiWikiWeb/map -http://www.v2music.com/Scripts/WebObjects-ISAPI.dll/V2_New_Publisher.woa/74461000003304200000112720000087451/Labels.wo/603110000077451/2.0.0.5.0/3/Webobjects1 -http://books.hyperlink.co.uk/bookinfo/Willa_Cathers_Transforming_Vision/Brienzo/Gary_W./0945636660 -http://ftp.darenet.dk/tucows/winme/adnload/137112_28604.html -http://l-infonet.phkk.fi/fi/TIETOPALVELUT/TEKNIIKKA/korkeakoulukirjastot/yliopisto-+ja+korkeakoulukirjastot/insin%F6%F6rit/kirjastot/ -http://www.pokers.com/asp/sp-asp/_/SZ--2/PD--10017288/posters.htm -http://itcareers.careercast.com/texis/it/itjs/+RwwBmelXD86elmwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewhXwotoBwcaMnmowamoGnqBdGaDntdBowBodD5aqconDBaMwGAnBoDtapd5oBodDaMwDwtnainxawqqd1DBaMFqryfHfREIDzmbwwwpBmezWD86Wwww5rme9cwwwBrmeZpwww/jobpage.html -http://berlin-charlottenburg.de/deutsch/politik/ma/062.htm -http://www.ericsson.cl/cables/protection/index.shtml -http://209.207.239.212/bkindex/c1007/f1401.html -http://209.207.239.212/bkindex/c1007/f1418.html -http://www.neoseeker.com/forums/index.php?function=edit_message&messageid=1037 -http://www.neoseeker.com/forums/index.php?function=edit_message&messageid=1199 -http://www.geocities.co.jp/SweetHome-Green/3692/PROFILE.HTML -http://www.geocities.co.jp/SweetHome-Green/3692/MELINDEX.HTML -http://myhome.naver.com/bora1234/photo.html -http://www.magicvillage.de/magicvillage/computercenter/Grafik%20%26%20Layout/Software/Macintosh/Hotline/PowerBooks/ -http://student.monterey.edu/nr/panditharatnesha/world/ -http://in.egroups.com/message/Michelles__Miracles/657 -http://www.babyheirlooms.com/catalog/htmlos.cat/001248.1.5492769465 -http://republika.pl/raduczulu/counter.html -http://adex3.flycast.com/server/socket/127.0.0.1:2800/click/OnlineCitiesSM/OnlineCitiesInteractiveCityGuides/bd378258019 -http://www.8848.net/fjnews/200007/0728/2000072811393979.htm -http://www.chaos.dk/sexriddle/m/n/x/t/ -http://www.maastrek.de/maas/01eea86f59dac641c053/1/0/4 -http://yp.gates96.com/14/79/82/8.html -http://yp.gates96.com/14/79/82/95.html -http://yp.gates96.com/14/79/82/98.html -http://yp.gates96.com/14/79/83/10.html -http://yp.gates96.com/14/79/83/16.html -http://yp.gates96.com/14/79/83/48.html -http://yp.gates96.com/14/79/84/4.html -http://yp.gates96.com/14/79/84/96.html -http://yp.gates96.com/14/79/85/34.html -http://yp.gates96.com/14/79/85/96.html -http://yp.gates96.com/14/79/86/9.html -http://yp.gates96.com/14/79/86/11.html -http://yp.gates96.com/14/79/86/28.html -http://yp.gates96.com/14/79/86/32.html -http://yp.gates96.com/14/79/86/86.html -http://yp.gates96.com/14/79/86/96.html -http://yp.gates96.com/14/79/87/96.html -http://yp.gates96.com/14/79/88/38.html -http://yp.gates96.com/14/79/88/74.html -http://yp.gates96.com/14/79/88/95.html -http://yp.gates96.com/14/79/89/57.html -http://autos.yahoo.co.jp/ucar/m1010/k10102006199904/g24/a101020060240158710008510205199904_4.html -http://www02.geocities.co.jp/HeartLand-Keyaki/7483/ -http://online.excite.de/wirtschaft/katalog/32476 -http://www9.hmv.co.uk:5555/do/session/1347777/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/Top_Navigation_Bar/top_navbar.html -http://www9.hmv.co.uk:5555/do/session/1347777/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/departments/d90_sd0_pt0.html -http://infoserv2.ita.doc.gov/efm/efm.nsf/Sources!OpenView&Start=5&Count=30&Collapse=54 -http://users.ai-lab.fh-furtwangen.de/for_local_use_only/CD-TMFUMV/daten/beisp/05321/?D=A -http://www.babyheirlooms.com/catalog/htmlos.cat/011629.1.0871727476 -http://www.fogdog.com/cedroID/ssd3040183241146/cgi-bin/MyFogdog -http://www.3w-geschichte.de/OReillyJamesT/OReillyJamesT0471287237.htm -http://www.annotate.net/html/Annotate_Directory/Top/Arts/Movies/Titles/W/World_According_to_Garp,The/ -http://dandini.cranfield.ac.uk/vl=-39536559/cl=151/nw=1/rpsv/cw/web/nw1/bargen.htm -http://cgi.superonline.com/cgi-bin/sworld43/thread.pl/forums/sworld43/oss2000/45.html?dir=nextResponse -http://cgi.superonline.com/cgi-bin/sworld43/get/forums/sworld43/oss2000/45.html?admin -http://dogbert.bizit.net/debian/dists/unstable/non-US/non-free/binary-sparc/?M=A -http://ftp.eecs.umich.edu/debian/dists/potato/main/binary-i386/misc/?D=A -http://fi.egroups.com/message/girlscouting/3383 -http://dk.egroups.com/group/scaleauto -http://members.tripod.lycos.co.kr/SM4/paper.htm -http://www.jamba.nl/KNet/_KNet-BqE8j1-JC4-pv4w/browse.nl/node.0/cde7f2elw -http://yp.gates96.com/4/6/10/47.html -http://yp.gates96.com/4/6/10/52.html -http://yp.gates96.com/4/6/10/96.html -http://yp.gates96.com/4/6/11/25.html -http://yp.gates96.com/4/6/11/61.html -http://yp.gates96.com/4/6/11/67.html -http://yp.gates96.com/4/6/11/93.html -http://yp.gates96.com/4/6/12/11.html -http://yp.gates96.com/4/6/12/28.html -http://yp.gates96.com/4/6/12/66.html -http://yp.gates96.com/4/6/12/81.html -http://yp.gates96.com/4/6/12/93.html -http://yp.gates96.com/4/6/13/86.html -http://yp.gates96.com/4/6/13/94.html -http://yp.gates96.com/4/6/14/17.html -http://yp.gates96.com/4/6/14/76.html -http://yp.gates96.com/4/6/15/61.html -http://yp.gates96.com/4/6/16/47.html -http://yp.gates96.com/4/6/16/71.html -http://yp.gates96.com/4/6/17/62.html -http://yp.gates96.com/4/6/18/1.html -http://yp.gates96.com/4/6/18/24.html -http://yp.gates96.com/4/6/18/28.html -http://158.169.50.70/eur-lex/it/lif/dat/1994/it_294D1217_09.html -http://158.169.50.70/eur-lex/it/lif/dat/1995/it_295D0928_02.html -http://158.169.50.70/eur-lex/it/lif/dat/1997/it_297D0904_03.html -http://www.irishnews.com/k_archive/181299/local4.html -http://www.irishnews.com/k_archive/181299/local14.html -http://www.irishnews.com/k_archive/181299/local16.html -http://uk.dir.yahoo.com/Regional/U_S__States/North_Carolina/Cities/Charlotte/Business_and_Shopping/Business_to_Business/Manufacturing/Casting__Moulding__and_Machining/ -http://www.uwec.edu/Academic/English/Projects/VonHaden/ -http://www.playease.com/et/beauty/img/jijinglian/jjl054.htm -http://www.digitaldrucke.de/(aktuell,für,marktplatz,metamorphose,raum,sense)/_fort/html/themen/kultur/digital/digital.htm -http://pub6.ezboard.com/fzfreesubmissiondirectoryplacestosubmitforfree.showMessage?topicID=35.topic -http://pub6.ezboard.com/fzfreesubmissiondirectoryplacestosubmitforfree.showMessage?topicID=12.topic -http://www.emerchandise.com/browse/DISNEY/TOY/b.FAVORITES%20COMICS%20CARTOONS%20DISNEY/s.CgJlPxcV -http://www.centc251.org/forums/aca-1/dispatch.cgi/hsi/showNextUnseen/fol/100001/1302769 -http://911codes.com/games/platform/gameboy/sect/div/cont/list_cheat/spray/y/id/0000010187/gid/0000003974/_cheats/_walkthroughs/_codes/_pc/_n64/_psx/_gameboy/_playstation/ -http://library.bangor.ac.uk/search/dPolice+regulations+--+Great+Britain/dpolice+regulations+great+britain/7,-1,0,E/frameset&F=dpolice+social+work+great+britain+congresses&1,1 -http://www02.u-page.so-net.ne.jp/ta2/grosh/Training/Training9.html -http://ring.shibaura-it.ac.jp/archives/linux/RedHat/redhat/code/i18n/trans/?D=A -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=15,35,22,28,26 -http://ftp.nacamar.de/pub/NetBSD/NetBSD-current/pkgsrc/graphics/ruby-gl/?S=A -http://www.academyfloral.com/state/aliro/flowers/birthdaybouquet1.html -http://l-infonet.phkk.fi/fi/TIETOPALVELUT/KIRJASTO-+JA+TIETOPALVELUT/ammattikorkeakoulukirjastot/ammattikorkeakoulut/p%E4ij%E4t-h%E4meen+koulutuskonserni/kirjastot/ -http://www.jpc-music.com/1409509.htm -http://chat.sportsline.com/u/ce/feature/0,1518,2565545_56,00.html -http://chat.sportsline.com/u/ce/feature/0,1518,1675610_56,00.html -http://www.affiliate.hpstore.hp.co.uk/do/session/380831/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hpstore.hewlett-packard.fr/gp -http://209.207.239.212/bkindex/c1016/f1419.html -http://209.207.239.212/bkindex/c1016/f1424.html -http://www.sports.aol.fr/Jo/Perec_2.html -http://www.citybrazil.com.br/go/smiguelaraguaia/transporte.htm -http://www.fileamerica.com/states/texas/local/cameron/ptax.html -http://www.angelfire.com/nv/bellea -http://school.educities.org/card/a4711862.html -http://school.educities.org/card/a60902.html -http://school.educities.org/card/amy60630.html -http://school.educities.org/card/aney1.html -http://school.educities.org/card/christinelee.html -http://school.educities.org/card/grace3721.html -http://school.educities.org/card/jj1245j.html -http://school.educities.org/card/jyik.html -http://school.educities.org/card/k3813813.html -http://school.educities.org/card/k78780606.html -http://school.educities.org/card/kitty1snoopy.html -http://school.educities.org/card/landy1.html -http://school.educities.org/card/m0522.html -http://school.educities.org/card/mark747.html -http://school.educities.org/card/okdh.html -http://school.educities.org/card/poppybaby.html -http://school.educities.org/card/ry21.html -http://www.secinfo.com/dvtBm.7a.htm -http://www.craft-supplies.co.uk/cgi-bin/psProdDet.cgi/HT206|972959537|Deluxe_Dividers|user|0|0,0,1,1 -http://in.egroups.com/post/book-readers?act=forward&messageNum=3829 -http://www.nacion.co.cr/ln_ee/2000/enero/31/mundo10.html -http://www.bigstar.com/news/sb/index.cfm/4ae0978g371d907g1?fa=today -http://www.bigstar.com/cs/index.cfm/4ae0978g371d907g1?fa=privacy -http://v2.bdnet.com/I/Cailleaux/I/Cannabissimo/fiche_serie.htm -http://ftp.darenet.dk/tucows/winnt/adnload/12475_29978.html -http://ftp.darenet.dk/tucows/winnt/adnload/1879_29966.html -http://www.canit.se/(h1,k15,mail,unix,www)/support/ -http://byron17.home.chinaren.com/lit/novle/maio.htm -http://www.emerchandise.com/browse/PAGEANTS/MUG/b.FAVORITES%20PAGEANTS/s.Q8q0znEj -http://stulchik.list.ru/catalog/10310.html -http://stulchik.list.ru/catalog/10967.2.html -http://dada.tucows.com/adnload/70717_30131.html -http://forum.rai.it/aca-finestre/dispatch.cgi/FORUM/folderFrame/100001/0/alpha/7677890 -http://webraft.its.unimelb.edu.au/196024/students/cabong/pub/?M=A -http://www.crutchfield.com/S-fFFHlZKyKNq/shop/ -http://www.earthsystems.org/gopher/seacnet/announce97-08-03-14/1994/aug94/94-08-25-18:%20Violence%20in%20Indian%20Country%20Over%20Waste -http://www.brio.de/BRIO.catalog/39fdb65f08c44c28273fd472aa7806e3/UserTemplate/10 -http://www.qsl.net/hj3ufa -http://www-jl.jl.cninfo.net/jlweb/book/wxtd/gu_long/chuliuxiang/bat/009.htm -http://www.intel.fr/support/netport/pro/21402.htm -http://shopping.lycos.co.kr/cgi-bin/LCWB.cgi/957423999/957522544/Catalog/1375/001 -http://www01.u-page.so-net.ne.jp/qc4/sam-ft/gallerycraftspace.html -http://rpmfind.net/linux/RPM/mandrake/usr_src_linux-2.2.16_pcmcia-cs-3.1.14_doc_Tree.html -http://www.chrisgraef.de/chg/webdesigner_medien.html -http://www.opengroup.com/trbooks/186/1864501634.shtml -http://moviestore.zap2it.com/shopcart/s.1GUFVsoF -http://moviestore.zap2it.com/browse/MOVIES/ACTIONFI/s.1GUFVsoF -http://moviestore.zap2it.com/browse/MOVIES/PUPPET/s.1GUFVsoF -http://ocean.ntou.edu.tw/search*chi/m387.224+M178t/m387.224+m178+t/-5,-1,0,E/buttonframe&F=m387.224+m178+m&1,,0 -http://www.egroups.com/message/BalletBuds/25 -http://link.fastpartner.com/do/session/600375/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/create/learn.htm -http://www.vedomosti.spb.ru/2000/arts/spbved-2180-art-27.html -http://www.vedomosti.spb.ru/2000/arts/spbved-2180-art-42.html -http://www.vedomosti.spb.ru/2000/arts/spbved-2180-art-45.html -http://www.vedomosti.spb.ru/2000/arts/spbved-2180-art-46.html -http://www2.ipc.pku.edu.cn/scop/rsgen.cgi?pd=3nla -http://www.allkorea.co.jp/cgi-bin/allkorea.front/972959900763/Catalog/1000006 -http://www.allkorea.co.jp/cgi-bin/allkorea.front/972959900763/Catalog/1000031 -http://fi.egroups.com/message/gailporter/199 -http://fi.egroups.com/message/gailporter/222 -http://www.egroups.com/messages/X-Air_Ultralight_Aircraft/359 -http://dia.tucows.com/winme/adnload/136838_28375.html -http://dia.tucows.com/winme/adnload/136846_28383.html -http://www.letsmusic.co.kr/directory/weblink/weblink_list/1,1011,100000000186810,00.html -http://www.smcworld.com/smcworld/bp/large/0744_2_1611_2_1611b.html -http://news.pchome.com.tw/ettoday/entertainment/20001028/index-20001028155543020439.html -http://www2.stas.net/lostlane/J.html -http://allmacintosh.arrakis.es/utilsmac_rating.html -http://novel.hichinese.net/zt/zpj/k/kelisidi/kill/008.htm -http://194.174.50.23/cgi-bin/FisRun/InsertExhibitorIntoNotebook/1/interpack99/d/2891 -http://www.loisirs.ch/jifmuf/14/roedrz.html -http://www.linux.com/networking/server/business/operating_system/learning/consumer/ -http://dandini.cranfield.ac.uk/vl=-39685335/cl=158/nw=1/rpsv/cw/www/faqs.htm -http://blisty.internet.cz/1250/9901/19990108a.html -http://www.staroriental.net/nav/soeg/ihf,aai,n2,247,Electric+Wave+Girl+1998.html -http://www.multimania.com/excave/vicking.html -http://students.lsu.edu/students/main.nsf/Pages/CSISAJ1!OpenDocument&ExpandSection=5,14,21,12 -http://www.secinfo.com/dWXc8.bz.htm -http://www.secinfo.com/dWXc8.9d.htm -http://bbs.ee.ntu.edu.tw/boards/RomanceNovel/11/2/9/2/ -http://ftp.nacamar.de/pub/NetBSD/packages/1.4/amiga/emulators/?M=A -http://no.egroups.com/subscribe/windows98 -http://ftp.dei.uc.pt/pub/netscape/communicator/english/4.76/unix/unsupported/linux20_libc5/?D=A -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/www.gsb.stanford.edu/sloan/sloan_fellows.html -http://apple.excite.com/entertainment/music/artists_and_genres/alternative_rock/grunge/stone_temple_pilots/merchandise/ -http://home.sprynet.com/~tales/asw2.html -http://fi.egroups.com/post/audiovision?act=reply&messageNum=145 -http://www.zema.ru/post/forum/komi_respublika/usinsk/messages/712 -http://opac.lib.rpi.edu/search/ddesert+ecology/-5,-1,0,B/browse -http://www.arm.com/sitearchitek/support.ns4/html/sdt_debug!OpenDocument&ExpandSection=6,32,7,5 -http://www.linux.com/networking/network/technology/security/community/open_source/ -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=9,33,15,36,22 -http://isbn.nu/0505523892/borders -http://www.informika.ru/text/database/geom/Draw/ris/ris34_1.htm -http://caselaw.lp.findlaw.com/casecode/uscodes/42/chapters/77/subchapters/iii/parts/h/sections/section_6374_notes.html -http://www.cyd.com.cn/zqb/19991104/GB/9672^Q805.htm -http://providenet.tukids.tucows.com/win95nt/9-12/adnload/132963_46167.html -http://www.chaos.dk/sexriddle/e/o/g/k/i/ -http://www2.brent.gov.uk/planning.nsf/013459d30f2ad00680256623005fcc0a/8af30b42469a1215802568720046524a!OpenDocument&ExpandSection=16,13,11,9,15 -http://jje.subportal.com/sn/Multimedia_and_Graphics/MPEG_Audio_Players_and_Editors/9126.html -http://www.ropnet.ru/HyperNews/edit-response.pl/case/2856.html -http://www.eveclub.com/cgi-bin/eveclub.front/972959508447/Catalog/1000045 -http://itcareers.careercast.com/texis/it/itjs/+rwwBmeO9D86MwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewDXnnqrDoqwcaiGoBnapd5oBodDaxw5nmamdq1MnDBwBodDawppcoqwBodD5a15naM15BapGdm1qBodDawxcnaMFqtPfRRZNDzme8xwwwpBme7WD86eLrwww5rm-mwwBrmeZpwww/jobpage.html -http://www.iucr.ac.uk/iucr-top/journalsonline/iucr-top/cif/software/hiccup/prods/?M=A -http://lists.omnipotent.net/mysql/199707/msg00381.html -http://www.yescall.co.kr/kyungheein/ -http://minyos.its.rmit.edu.au/~s9763278/sparks/sparks.html -http://www.movieguide.com/pressroom/events/nbcpresstour/festival_nbcpresstour9.html -http://www.gamers.net/game/190940/reviews -http://www.staroriental.net/nav/soeg/ihf,aai,n2,198,Electric+Wave+Girl+1998.html -http://marysz.freeservers.com/cgi-bin/c/736/64/dXNlcmJhbm5lcg==/gn/6616/ -http://subversion.tigris.org/source/browse/subversion/subversion/libsvn_delta/delta.h?annotate=1.34&sortby=rev -http://subversion.tigris.org/source/browse/subversion/subversion/libsvn_delta/delta.h?annotate=1.28&sortby=rev -http://sunsite.org.uk/public/public/packages/WWW/spinner/?D=A -http://sunsite.org.uk/public/public/packages/WWW/spinner/untared/ -http://www.realbig.com/miata/miata/1998-01/1635.html -http://cky.8k.com/cgi-bin/framed/1359/info/jess.html -http://cky.8k.com/cgi-bin/framed/1359/info/bran.html -http://www.loisirs.ch/jifmuf/10/bhcqud.html -http://naver22.jrnaver.co.kr/Entertainment_and_Arts/Design_Arts/Architecture/Organizations/ -http://www.zing.com/member/?name=birchpole&c=1 -http://student.monterey.edu/nr/porrasjohnny/campus/ -http://ftp.lip6.fr/pub/FreeBSD/development/FreeBSD-CVS/ports/misc/peq/files/patch-ab,v -http://www.multimania.com/lesoir2/news/sept99/quake4.htm -http://www.multimania.com/lesoir2/news/sept99/2309-12.txt -http://www.multimania.com/lesoir2/news/sept99/0609-06.txt -http://www.multimania.com/lesoir2/news/sept99/1309-13.txt -http://homepage1.nifty.com/shiraishi/school/school2.htm -http://ring.htcn.ne.jp/pub/NetBSD/NetBSD-current/pkgsrc/mbone/sdr/pkg/PLIST -http://www.chaos.dk/sexriddle/m/c/z/b/ -http://www.chaos.dk/sexriddle/m/c/z/p/ -http://map.ipc.co.jp/asp/onmap/r/new/g-26/f-523824/ -http://www.nissan.co.jp/RENAULT-DEALERS/PASSPORT/view.cgi/admission/972959650-- -http://novel.hichinese.net/xd/gt/zpj/l/liangfengyi/jingrong/010.htm -http://www.tvstore.com/browse/TV/MAGNET/s.l03qOWiP -http://www.tvstore.com/browse/TV/KEYCHAIN/s.l03qOWiP -http://www.gbnf.com/genealog2/burt/html/d0002/I1199.HTM -http://www.gbnf.com/genealog2/burt/html/d0006/I1187.HTM -http://www.gbnf.com/genealog2/burt/html/d0004/I1521.HTM -http://src.openresources.com/debian/src/graphics/HTML/R/HVcreate.html -http://yomama.tgm.ac.at/doc/susehilf/gnu/vip/Changing.html -http://www.science.uva.nl/pub/NetBSD/NetBSD-current/pkgsrc/sysutils/gmc/pkg/ -http://news.fm365.com/zonghe/20001009/156610.htm -http://homepage1.nifty.com/tojo/shin13.htm -http://www.sf.digitalcity.com/naplesfl/personals/browse.dci?cat=wsw&sort=t -http://plat.debian.or.jp/debian/dists/woody/non-free/binary-hppa/otherosfs/?M=A -http://people.freebsd.org/~knu/cgi-bin/cvsweb.cgi/ports/databases/gdbm/distinfo?only_with_tag=RELEASE_4_1_0 -http://bbs.csie.ntu.edu.tw/txt/Emprisenovel/ebooks/mystery/alisanderla/wsyz/013.txt -http://www.legis.state.ia.us/GA/78GA/Legislation/SCR/00000/SCR00018/?M=D -http://www.mapion.co.jp/custom/AOL/admi/23/23104/kaminagoya/2chome/index-2.html -http://ciscom.cnet.com/hardware/member/entry/0,10285,0-1069-419-1544825,00.html -http://wow-online.vhm.de/Regional/Grossbritannien/Kunst.html -http://www.cs.rit.edu/~hpb/Man/_Man_Openwin_html/html2/sigaction.2.html -http://in.egroups.com/message/talksigncreate/287 -http://rainforest.parentsplace.com/dialog/thread.pl/newclubfoot8/19.html?dir=nextThread -http://ftp.jp.debian.org/debian-non-US/dists/potato/non-US/main/binary-arm/?N=D -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=baumelte&l=de -http://www.chaos.dk/sexriddle/i/f/p/k/h/ -http://unionsoft.narod.ru/3d/anatomy/pages/head1.htm -http://src.openresources.com/debian/src/electronics/acs_021.orig/acs-021.orig/ -http://www.mapion.co.jp/custom/AOL/admi/23/23111/takagicho/2chome/index-45.html -http://dennou-q.geo.kyushu-u.ac.jp/library/Linux/debian-jp/dists/unstable/contrib-jp/binary-m68k/tex/?N=D -http://rapidus.tucows.com/winnt/adnload/54123_28460.html -http://193.207.119.193/MV/gazzette_ufficiali/303-99/8.htm -http://www.emerchandise.com/help_security/b.TV%20FRASIER/s.LoO0xS99 -http://gpul.org/ftp/os/linux/cd-images/other/ISO/suse/?M=A -http://opac.lib.rpi.edu/search/arush+sean+c/-17,-1,0,E/frameset&arush+homer+f&1,,0 -http://genforum.genealogy.com/cgi-genforum/forums/griffin.cgi?3823 -http://www.leo.org/leoclick/dce2b1c893db6a8193428ecad9ecd878+L+1__ -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=55&discrim=178,230,174 -http://www.msb.malmo.se/search*swe/aKling,+Rolf/akling+rolf/7,-1,0,B/browse -http://retailer.gocollect.com/do/session/1912785/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/checkout/shopping_cart.asp -http://st3.yahoo.co.jp/nihondo/k4932828003023.html -http://webtools.familyeducation.com/whatworks/review/front/0,2562,1-10641-2316_-7233-3,00.html -http://www.bretagne-online.com/telegram/htdocs/archive/1997/19970618/sommaire/stpoldeleon.htm -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=234&discrim=235,230,183 -http://www.yagoo.co.kr/stats/batting.asp?Mlbmanid=HAMPAT7709 -http://www.linux.com/networking/network/new/website/suse/SAP/ -http://www.linux.com/networking/network/new/website/suse/security/ -http://javatest.a-net.nl/servlet/pedit.Main/http://www.cdc.gov/ncidod/dpd/parasiticpathways/drinkingwater.htm -http://www.across.or.jp/shizuoka/nbbs.cgi/seibu:n52/post -http://www.across.or.jp/shizuoka/nbbs.cgi/seibu:n52/450 -http://www.across.or.jp/shizuoka/nbbs.cgi/seibu:n52/607 -http://dangerous.co.kr/www.sony.co.jp/ProductsPark/Consumer/Peripheral/MDData/page6.html -http://www2.sega.co.jp/bbs/article/s/sports/47/xvwixh/jlvcgk.html -http://troy.lib.sfu.ca/search/alondon+mathematical+society/alondon+mathematical+society/-5,-1,0,B/frameset&F=alondon+m+c+s&2,,3 -http://pub14.ezboard.com/fbrlproductionsfrm10.showAddTopicScreenFromWeb -http://rex.skyline.net/html/Computers_-_Monitors.html?16,computers,radio,electronics,communication -http://rex.skyline.net/html/Software_-_Developers.html?20,computers,radio,electronics,communication -http://ftp.cwi.nl/static/publications/reports/abs/MAS-R9815.html -http://www.jt.com.br/noticias/98/09/28/sd2.htm -http://www.kentuckyconnect.com/heraldleader/news/080899/sportsdocs/08chuck.htm -http://pix.egroups.com/post/ipe?act=forward&messageNum=5302 -http://tulips.ntu.edu.tw/search*chi/cHT392+Un3/cht++392+un3/-5,-1,,B/browse -http://magazines.sina.com/gourmet/contents/199912/199912-006_3_gb.html -http://collection.nlc-bnc.ca/100/201/300/january/2000/00-06-05/sanctuary.html -http://collection.nlc-bnc.ca/100/201/300/january/2000/00-06-05/blue1.html -http://www.vorlesungen.uni-osnabrueck.de/informatik/pt/code/DiagramPalettes/Components.dpalette2/Image45 -http://www.vorlesungen.uni-osnabrueck.de/informatik/pt/code/DiagramPalettes/Components.dpalette2/Image5 -http://playsite.top263.net/software/hh-13.htm -http://www.dispatch.co.za/1998/12/21/sport/MISS.HTM -http://www.allhealth.com/parentsplace/send/0,3288,14-844-1-fertility-INFERTILITY,00.html -http://www.tucows.telia.no/win2k/preview/37705.html -http://www.peopledaily.co.jp/9803/09/current/newfiles/j1020.html -http://shopping.lycos.co.kr/cgi-bin/LCWB.cgi/957424007/957522556/Catalog/1320/001 -http://shopping.lycos.co.kr/cgi-bin/LCWB.cgi/957424007/957522556/Catalog/1321/001 -http://shopping.lycos.co.kr/cgi-bin/LCWB.cgi/957424007/957522556/Catalog/1328/001 -http://shopping.lycos.co.kr/cgi-bin/LCWB.cgi/957424007/957522556/Catalog/1350/001 -http://shopping.lycos.co.kr/cgi-bin/LCWB.cgi/957424007/957522556/Catalog/1359/001 -http://shopping.lycos.co.kr/cgi-bin/LCWB.cgi/957424007/957522556/ProductView/26897 -http://www.uftree.com/UFT/WebPages/Don_MacFarlane/FEB99/d1/i0001285.htm -http://wap.jamba.de/KNet/_KNet-n4B8j1-DFd-13bgt/showInfo-jambabanner.de/node.0/cde7f1uou -http://launchbase.com/Shopping/Visual_Arts/entertainment/information/Politics.htm -http://launchbase.com/Shopping/Visual_Arts/entertainment/shopping/Electronics.htm -http://www.aoyun.sina.com.cn/news/sports/table/2000-09-15/1/4622.shtml -http://www.eggerwirt.at/1Root/Kontinent/6/Staat/7/Bundesland/21/Ort/129509/Homepage/m_homepage...1.html -http://198.103.152.100/search*frc/dSociologie+rurale+--+Ontario/dsociologie+rurale+ontario/-5,-1,0,B/frameset&F=dsociologie+religieuse+islam&1,,0 -http://msn.excite.co.jp/travel/the_country/kinki/wakayama/hot_spring_of_accommodations/inn_tourist_home_in_wakayama?summary=false -http://search.ibm.co.jp/as400/year2000/v3r2.html -http://www.allgemeine-immobilien-boerse.de/nordrhein-Westfalen/Muehlheim-ruhr/Verkauf/Allgemeine-IB/Startseite/3d-service/Private-IB/Startseite/Gemeinsam/Super-Zins-Konditionen/anforderungsformular.htm -http://spaceports.tucows.com/winnt/adnload/78908_28797.html -http://www.trax.nilex.co.uk/trax.cgi/A1S/A2R/A3R/B1S/A1D/A1S/ -http://www.babyheirlooms.com/catalog/htmlos.cat/041130.1.3206884924 -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/music/misc/thoughts/lit/misc/colorart/misc/freespeech.html -http://www.cs.rit.edu/~hpb/Lectures/2000/JRMS_590/all-2.7.html -http://www.cs.rit.edu/~hpb/Lectures/2000/JRMS_590/all-4.11.html -http://www.refdag.nl/kl/990615klfo01.html -http://pub20.ezboard.com/ftheimperiumknightsfrm11.showMessage?topicID=9.topic -http://retailer.gocollect.com/do/session/1912767/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/product_display/advanced_search.asp -http://www.thestateofcolorado.com/saudealersnew.html -http://awelymor.weblogs.co.uk/sdb/en/html/ftp://ftp.suse.com/pub/suse/i386/6.2/suse/n1/ -http://www.mirror.kiev.ua:8083/paper/2000/21/1251/text/21-13-3.htm -http://www.recipezaar.com/browse/0110FC1070110A301109901109E00F06D -http://www.linux.com/networking/network/vpn/server/Unix/ -http://www.gasex.com/main.html?m4m.gallery.twinks -http://www.xtdnet.nl/listarch/linux-router/1998-05-01/nav00046.html -http://www.fogdog.com/cedroID/ssd3040183325831/cgi-bin/CedroCommerce?func=EditBasket -http://www.totalmarketing.com/an/basket.pl/cancel/xwxm6773.94076 -http://ciaoweb.tucows.com/winnt/adnload/56695_29112.html -http://www.brio.de/BRIO.catalog/39fe2f6006e4fc48273fd472aa7806e0/UserTemplate/1 -http://retailer.gocollect.com/do/session/1912715/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/product_display/top_ten.asp?pagenum=2 -http://retailer.gocollect.com/do/session/1912715/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/dealer_lookup.asp -http://www.streetprices.com/Electronics/Computer_Hardware_PC/Motherboards/ATX/Slot1/Via_Pro133/sortproductbymake/sortcategorybylowprice/ -http://www.streetprices.com/Electronics/Computer_Hardware_PC/Projectors/MAKE+CTX/sortdetailbystock/sortproductbyhighprice/sortcategorybycount/SP318392.html -http://www.multimania.com/egypt95/img0017.htm -http://dic.empas.com/show.tsp/?q=fourteenthly&f=B -http://linux2.ipc.pku.edu.cn/scop/pdb.cgi?sid=d1repc2 -http://www.schlagertempel.de/RobertPayer/B00000B8D2.htm -http://www.cricinfo.com/link_to_database/INTERACTIVE/MAGAZINE/1996-97/SL_IN_NZ/SL_IN_NZ_FEEDBACK_1.html -http://mediate.magicbutton.net/do/session/625637/vsid/4385/tid/4385/cid/88138/mid/1702/rid/2114/chid/3393/url/http://www.worldgallery.co.uk/frameset-top50.html -http://www.clickm.dk/Clickmusic_Web_Guide/Bands_and_Artists/B/Better_Than_Ezra/ -http://www.clickm.dk/Clickmusic_Web_Guide/Bands_and_Artists/B/Breeders,_The/ -http://www.maastrek.de/maas/71eb3baf4c78ed98ef94/1/0/4 -http://www.trnonline.com/archives/1999archives/07221999/obits/24620.shtml -http://www.recipezaar.com/browse/0110FC1070110A100F06D0110A00110A3 -http://www.areaguide.net/addlisting.asp?book=box&CatID=516 -http://webraft.its.unimelb.edu.au/196023/students/lucym/ -http://sunsite.org.uk/public/0-Most-Packages/quake/utils/frontends/qshel15b.txt -http://pub14.ezboard.com/flfiaglarafabianisagoddess.emailToFriend?topicID=858.topic -http://www.realize.com/am4d0481.htm,qt=e784fe2f=2a38a234-4-7cf2ef-1-1-0-3-- -http://www.realize.com/am7bcd81.htm,qt=e784fe2f=2a38a234-4-7cf2ef-1-10-0-3-- -http://mailman.real-time.com/rte-crossfire/1993/Dec/msg00022.html -http://mailman.real-time.com/rte-crossfire/1993/Dec/msg00000.html -http://mailman.real-time.com/rte-crossfire/1993/Dec/msg00009.html -http://www.eallinfo.com/A55782/sameeron.nsf/homeFood!OpenPage&ExpandSection=8,4,3,6 -http://www.ami.dk/udgivelser/emne/36.html -http://www-x500-1.uni-giessen.de:8890/Lcn%3dKai%20Cheong%20HO,ou%3dEstates%20Management%20Office,o%3dHong%20Kong%20University%20of%20Science%20and%20Technology,c%3dHK -http://ftp.telepac.pt/pub/cpan/modules/by-module/DBD/DMOW/?D=A -http://members.se.tripod.de/aah/jochumsen/per02614.htm -http://www.academyfloral.com/state/cacat/flowers/funeralofferingshare.html -http://www.hotelboulevard.com/fr/paris/standard/htmlb877e62937802c0678f4638130be1ef0/sessionLang/ANG/prov/browse/cp/75013/resultatSearch.html -http://www.alsapresse.com/jdj/00/03/24/AK/article_4.html -http://www.mairie-montreuil93.fr/ville_pratique/environ/democrat/printemps/_vti_cnf/interstice.htm -http://variety.studiostore.com/help/b.FAVORITES%20COMICS%20CARTOONS%20POWERPUFF/s.UAREyMtL -http://ftp.sektornet.dk/tucows/winme/adnload/137341_28799.html -http://www.eveclub.com/cgi-bin/eveclub.front/972959532302/Catalog/1000046 -http://www.eveclub.com/cgi-bin/eveclub.front/972959532302/ClubBoard/list/1000022 -http://findmail.com/post/geewhiz?act=reply&messageNum=2039 -http://orders.mkn.co.uk/toy/rattles/order/now.en$NOK?what-bells=1 -http://www.buybuddy.com.au/sleuth/26/1/502/10134/ -http://spokesmanreview.sportshuddle.com/sports/baseball/playbetter/ask-expert/vincent3.asp -http://ant.i.hosei.ac.jp/Ant.WWW/PCD0420/HTMLE/29.html -http://ant.i.hosei.ac.jp/Ant.WWW/PCD0420/HTMLE/34.html -http://builder.hw.net/frmRestDir/0,1112,'1~21~325~1~S~074800~90270',00.html -http://builder.hw.net/frmRestDir/0,1112,'1~21~325~1~S~074800~09890',00.html -http://dennou-h.ees.hokudai.ac.jp/library/Linux/debian-jp/dists/hamm-jp/non-free/binary-i386/games/?M=A -http://www.peopledaily.com.cn/GB/paper68/1469/236625.html -http://us.mandrakesoft.com/cgi-bin/cvsweb.cgi/koffice/kformula/BracketElement.cc?hideattic=1&sortby=rev -http://us.mandrakesoft.com/cgi-bin/cvsweb.cgi/koffice/kformula/FractionElement.cc?hideattic=1&sortby=rev -http://us.mandrakesoft.com/cgi-bin/cvsweb.cgi/koffice/kformula/MIMETYPE-Format?hideattic=1&sortby=rev -http://linuxberg.ii.net/conhtml/preview/7963.html -http://213.36.119.69/do/session/152992/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/reserver/hotels.html -http://213.36.119.69/do/session/152992/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.spycamera.com/webcam/ -http://ftp.netc.pt/pub/idgames/levels/doom/d-f/deathme.txt -http://ftp.netc.pt/pub/idgames/levels/doom/d-f/dork.txt -http://ustlib.ust.hk/search*chi/dsea+stories/dsea+stories/-5,-1,0,B/browse -http://members.fortunecity.com/skinweaver/nf/nfpin01.htm -http://se.egroups.com/group/French_ -http://www.gencat.es/cgi-bin/bc/drawer.cgi/LD/0074/L00465?101 -http://oss.sgi.com/cgi-bin/cvsweb.cgi/projects/ogl-sample/main/gfx/lib/glut/glut_shapes.c?sortby=author -http://www.teacherformation.org/html/od/facilitators.cfm/task1,about/discussion_id,2/xid,9456/yid,7276398 -http://genforum.genealogy.com/cgi-genforum/forums/getchell.cgi?230 -http://www9.hmv.co.uk:5555/do/session/1347795/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/departments/d100_sd0_pt0.html -http://www.brd.net/brd-cgi/brd_multimedia/bildbearbeitung/WZ01K0DJ/beurteilung/ci=972850465.htm -http://retailer.gocollect.com/do/session/1912745/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/affiliate_network.asp -http://www.fao.org/icatalog/orders/basket.asp?prev2=yes&aries_id=1310 -http://www.realestate-mls.com/list.cgi/VACANT_LAND|WATERFRONT|Edenville!Midland!MI -http://www.geocities.co.jp/SilkRoad-Desert/1661/profile/profile.html -http://hp-partner.whowhere.lycos.com/hp/chick/com/nj/ -http://hp-partner.whowhere.lycos.com/hp/chick/com/next/ -http://hp-partner.whowhere.lycos.com/hp/chick/com/nightflight/ -http://www.emerchandise.com/browse/FRIENDS/TSHIRT/20/10/b.TV%20FRIENDS/s.kGIgjr5i -http://dk.egroups.com/group/anarchymcgill -http://bbs.gznet.edu.cn/cgi-bin/getannounce//groups/GROUP_3/WinNT_Win2k/smthbbs/Dir002 -http://de.excite.de/computer/katalog/12947 -http://www.bizline.co.kr/library/data/002/001/007/008/020/002/000017.html -http://www.bizline.co.kr/library/data/002/001/007/008/020/002/000046.html -http://saleonall.com/cat/OPTOMA/6492/video/projectors/145336/oneprod.html -http://sun1.rrzn-user.uni-hannover.de/jgaertner/matlab/help/techdoc/newfeat/ch213.html -http://sun1.rrzn-user.uni-hannover.de/jgaertner/matlab/help/techdoc/newfeat/newfeat.html -http://excite.de/wirtschaft/katalog/37737 -http://www.digitaldrucke.de/(aktuell,kino,kultur,werbung)/_fort/html/themen/aktuell/events/events.htm -http://www.digitaldrucke.de/(aktuell,kino,kultur,kunst)/suche/uebersicht.html -http://www.online.kokusai.co.jp/Stock_corner/V0043566/wrd/G500/stock_corner/stock_corner.html -http://yp.gates96.com/4/37/0/92.html -http://yp.gates96.com/4/37/1/3.html -http://yp.gates96.com/4/37/1/38.html -http://yp.gates96.com/4/37/1/58.html -http://yp.gates96.com/4/37/2/21.html -http://yp.gates96.com/4/37/3/56.html -http://yp.gates96.com/4/37/3/68.html -http://yp.gates96.com/4/37/3/79.html -http://yp.gates96.com/4/37/4/1.html -http://yp.gates96.com/4/37/4/48.html -http://yp.gates96.com/4/37/4/99.html -http://yp.gates96.com/4/37/5/27.html -http://yp.gates96.com/4/37/6/1.html -http://yp.gates96.com/4/37/6/7.html -http://yp.gates96.com/4/37/6/80.html -http://yp.gates96.com/4/37/7/0.html -http://yp.gates96.com/4/37/7/5.html -http://yp.gates96.com/4/37/7/9.html -http://yp.gates96.com/4/37/7/12.html -http://yp.gates96.com/4/37/7/49.html -http://yp.gates96.com/4/37/7/97.html -http://yp.gates96.com/4/37/8/15.html -http://yp.gates96.com/4/37/8/32.html -http://yp.gates96.com/4/37/8/62.html -http://yp.gates96.com/4/37/8/76.html -http://yp.gates96.com/4/37/8/96.html -http://yp.gates96.com/4/37/9/12.html -http://yp.gates96.com/4/37/9/14.html -http://yp.gates96.com/4/37/9/23.html -http://yp.gates96.com/4/37/9/78.html -http://yp.gates96.com/4/37/9/80.html -http://cgi.cnn.com/US/9601/state_union_poll/state_union_speech/pm/ -http://freethemes.netc.pt/cursors/adnload/16904.html -http://freethemes.netc.pt/cursors/preview/16926.html -http://freethemes.netc.pt/cursors/adnload/16953.html -http://library.bangor.ac.uk/search/dTelevision+broadcasting+of+news+--+Wales/dtelevision+broadcasting+of+news+wales/-17,-1,0,B/frameset&F=dtelevision+broadcasting+moral+and+ethical+aspects&1,1 -http://home.baoding.cn.net/~snowcxm/photoshop/newpage6tp.htm -http://home.baoding.cn.net/~snowcxm/photoshop/newpage6xq2.htm -http://dennou-q.geo.kyushu-u.ac.jp/library/Linux/debian-jp/dists/woody/non-free-jp/binary-sparc/otherosfs/?D=A -http://www.tucows.ch/winnt/toolnt_size.html -http://www.sdinfonet.com.cn/379/26/379269983.htm -http://www.sdinfonet.com.cn/379/26/379269980.htm -http://www.egroups.com/message/wdf/3368 -http://de.excite.de/bildung/katalog/35821 -http://kidneyfailure.shn.net/content/article/1677.57596 -http://kidneyfailure.shn.net/content/article/1677.57625 -http://kidneyfailure.shn.net/content/article/1677.57517 -http://kidneyfailure.shn.net/content/article/1677.57456 -http://kidneyfailure.shn.net/content/article/1677.57562 -http://dia.tucows.com/winme/adnload/138490_29803.html -http://www.nhic.or.kr/netbbs/Bbs.cgi/nhic31062/lst/qqo/004A -http://www.nhic.or.kr/netbbs/Bbs.cgi/nhic31062/qry/zka/B2-kB23p/pno/0/qqatt/^ -http://www.nhic.or.kr/netbbs/Bbs.cgi/nhic31062/qry/zka/B2-kB2-n/pno/0/qqatt/^ -http://www.nhic.or.kr/netbbs/Bbs.cgi/nhic31062/qry/zka/B2-kB2-o/pno/0/qqatt/^ -http://dk.egroups.com/message/tw2002/3626 -http://dk.egroups.com/message/tw2002/3644 -http://www.spiral.at/Katalog/Artikel/8908435/ -http://www.spiral.at/Katalog/Artikel/8908842/ -http://168.160.224.62/insurance/200006/10/114941.asp -http://168.160.224.62/insurance/200006/10/114219.asp -http://tucows.soneraplaza.nl/termnt_license.html -http://pub13.ezboard.com/ubelegruin.showPublicProfile?language=EN -http://troy.lib.sfu.ca/search/tbiometrics/tbiometrics/-5,-1,0,B/exact&F=tbiometrical+genetics+the+study+of+continuous+variation&1,2/limit -http://futures.homeway.com.cn/lbi-html/news/content/20001013/172026.shtml -http://jproxy.uol.es/jproxy/http://www.channel6000.com/sh/sports/columnist/stories/columnists-20001030-154321.html -http://www.linux.com/networking/network/free/release/community/development/ -http://pub17.ezboard.com/fskysurfingskysurfersubb.showAddReplyScreenFromWeb?topicID=4.topic -http://ring.tains.tohoku.ac.jp/pub/linux/debian/debian-jp/dists/woody/contrib-jp/binary-m68k/oldlibs/?D=A -http://10000downloads.subportal.com/sn/Network_and_Internet/Misc__Communications_Tools/12507.html -http://www.hbdaily.com.cn/ctdsb/19991101/GB/ctdsb^1042^06^Ct06b08.htm -http://cytobase.cnusc.fr:8101/textes/PURDmail/1998-12/nav00129.html -http://www.brio.de/BRIO.catalog/39fe2f73050d53aa2741d472aa7806d2/UserTemplate/9 -http://www.anekdot.ru:8084/an/an0007/t000731.html -http://statweb.byu.edu/sasdoc/sashtml/gref/z0265802.htm -http://oss.sgi.com/cgi-bin/cvsweb.cgi/linux/drivers/char/ftape/Makefile?only_with_tag=davem-cvs-merge -http://www.intellicast.com/Golf/World/UnitedStates/Southeast/NorthCarolina/Hawksnest/WINDcast/d1_00/bannerAd.shtml -http://dailynews.sina.com.hk/sinaNews/wiser/hkStock/2000/0720/1418727.html -http://ftp.dti.ad.jp/pub/lang/CPAN/authors/id/A/AG/AGUL/?S=A -http://link.fastpartner.com/do/session/600392/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/jobpilot.php -http://link.fastpartner.com/do/session/600392/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/smartguy.php -http://citeseer.nj.nec.com/cidcontext/1024594 -http://www.burstnet.com/ads/ad4820b-map.cgi/1395444997 -http://us.mandrakesoft.com/cgi-bin/cvsweb.cgi/kdeutils/kpm/proc.h?r1=1.6&only_with_tag=HEAD -http://www.uftree.com/UFT/WebPages/JenHawkins/ALL/d0/i0001501.htm -http://www.uftree.com/UFT/WebPages/JenHawkins/ALL/d0/i0000641.htm -http://www.uftree.com/UFT/WebPages/JenHawkins/ALL/d1/i0000932.htm -http://www.uftree.com/UFT/WebPages/JenHawkins/ALL/d1/i0000762.htm -http://www.uftree.com/UFT/WebPages/JenHawkins/ALL/d1/i0000997.htm -http://www.uftree.com/UFT/WebPages/JenHawkins/ALL/d1/i0001325.htm -http://www.uftree.com/UFT/WebPages/JenHawkins/ALL/nindex.htm -http://www.primenet.com/~g-lady/Farewell/_borders/ -http://imasy.or.jp/~iwao/hokkaido/kushiro.html -http://citeseer.nj.nec.com/nrelated/0/208436 -http://www.zeal.com/Arts___Entertainment/Literature/Authors/Lovecraft__H_P_/Books/Cthulhu_Campus_Crusade_for_Cthulhu/ -http://ftp1.se.debian.org/debian/dists/woody/contrib/binary-mipsel/mail/?M=A -http://ftp1.se.debian.org/debian/dists/woody/contrib/binary-mipsel/mail/?S=A -http://webtools.familyeducation.com/whatworks/item/front/0,2551,1-10698-1981-,00.html -http://www.affiliate.hpstore.hp.co.uk/do/session/380859/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/REGISTRATION/entry.asp -http://www.collectingnation.com/cgi-bin/bn/view_feedback.mod/pn?HANDLE=pokeweed -http://www.egroups.com/messages/Future-History-L/213 -http://www.egroups.com/message/Future-History-L/192 -http://www.burstnet.com/ads/cb7826a-map.cgi/1384588733 -http://www.cs.com.cn/csnews/articles/142_23823.htm -http://search.yam.com.tw/en/new/edu/hs/voca/tpc_vs/ -http://ftp.univie.ac.at/packages/tex/macros/latex2e/contrib/supported/vmargin/?D=A -http://citeseer.nj.nec.com/cidcontext/3145269 -http://yp.gates96.com/11/72/80/34.html -http://yp.gates96.com/11/72/80/36.html -http://yp.gates96.com/11/72/80/76.html -http://yp.gates96.com/11/72/81/26.html -http://yp.gates96.com/11/72/81/67.html -http://yp.gates96.com/11/72/83/68.html -http://yp.gates96.com/11/72/84/29.html -http://yp.gates96.com/11/72/84/39.html -http://yp.gates96.com/11/72/85/56.html -http://yp.gates96.com/11/72/85/63.html -http://yp.gates96.com/11/72/85/96.html -http://yp.gates96.com/11/72/86/3.html -http://yp.gates96.com/11/72/86/28.html -http://yp.gates96.com/11/72/86/59.html -http://yp.gates96.com/11/72/86/63.html -http://yp.gates96.com/11/72/88/43.html -http://yp.gates96.com/11/72/89/8.html -http://yp.gates96.com/11/72/89/13.html -http://yp.gates96.com/11/72/89/20.html -http://cometweb01.comet.co.uk/do!session=132039&vsid=700&tid=20&cid=37030&mid=1000&rid=1060&chid=1713&url=eqqLmwlGltt5tkkHbqpLZXmLbkZHljlKaltLkilLXalKfkaLbukKeqjLi1 -http://iworld.freethemes.com/savers/adnload/77213.html -http://iworld.freethemes.com/savers/adnload/35420.html -http://www.questlink.com/QL/CDA/Research/ProductBrief/1,1768,0_11201_353170_43264,00.html -http://www.questlink.com/QL/CDA/Research/ProductBrief/1,1768,0_11201_353170_43305,00.html -http://www2.eunet.lv/library/iso/HISTORY/RUSSIA/Mirrors -http://nathanael.upi.jussieu.fr/tele6.nsf/autres+centres+de+formations!OpenPage&ExpandSection=10,3,5,16,14,6 -http://nathanael.upi.jussieu.fr/tele6.nsf/autres+centres+de+formations!OpenPage&ExpandSection=17,3,5,16,14,6 -http://opac.lib.rpi.edu/search/dnatural+history+united+states+historiography+dictionaries/-17,-1,0,B/browse -http://opac.lib.rpi.edu/search/dnatural+history+united+states+historiography+dictionaries/7,-1,0,B/browse -http://www.sportinggreen.com/news/20001014/fbo/fbc/abb/001014.0391.html -http://yp.gates96.com/0/14/10/63.html -http://yp.gates96.com/0/14/10/80.html -http://yp.gates96.com/0/14/11/32.html -http://yp.gates96.com/0/14/11/37.html -http://yp.gates96.com/0/14/11/80.html -http://yp.gates96.com/0/14/13/21.html -http://yp.gates96.com/0/14/13/23.html -http://yp.gates96.com/0/14/13/38.html -http://yp.gates96.com/0/14/13/49.html -http://yp.gates96.com/0/14/13/90.html -http://yp.gates96.com/0/14/14/53.html -http://yp.gates96.com/0/14/14/63.html -http://yp.gates96.com/0/14/14/77.html -http://yp.gates96.com/0/14/15/12.html -http://yp.gates96.com/0/14/15/88.html -http://yp.gates96.com/0/14/15/96.html -http://yp.gates96.com/0/14/16/27.html -http://yp.gates96.com/0/14/16/62.html -http://yp.gates96.com/0/14/16/67.html -http://yp.gates96.com/0/14/16/86.html -http://yp.gates96.com/0/14/16/92.html -http://yp.gates96.com/0/14/17/15.html -http://yp.gates96.com/0/14/17/22.html -http://yp.gates96.com/0/14/17/44.html -http://yp.gates96.com/0/14/18/27.html -http://yp.gates96.com/0/14/18/29.html -http://yp.gates96.com/0/14/18/83.html -http://yp.gates96.com/0/14/19/35.html -http://yp.gates96.com/0/14/19/58.html -http://www.123bestphonerates.com/q/001p/vn/ZWUdEJwdxM.htm -http://www.trax.nilex.co.uk/trax.cgi/A1C/B1U/A2S/B3L/A4S/B1L/ -http://www.trax.nilex.co.uk/trax.cgi/A1C/B1U/A2S/B3L/A4S/C2D/ -http://southwind.themes.tucows.com/skins/icq/preview/68532.html -http://southwind.themes.tucows.com/skins/icq/adnload/77797.html -http://southwind.themes.tucows.com/skins/icq/preview/55623.html -http://southwind.themes.tucows.com/skins/icq/adnload/51324.html -http://southwind.themes.tucows.com/skins/icq/adnload/26609.html -http://southwind.themes.tucows.com/skins/icq/adnload/48629.html -http://southwind.themes.tucows.com/skins/icq/adnload/48628.html -http://www.webcom.com.mx/cronica/1999/mar/09/neg01.html -http://jproxy.uol.es/jproxy/http://mars.jpl.nasa.gov/msp98/news/mpl000207.html -http://jproxy.uol.es/jproxy/http://mars.jpl.nasa.gov/msp98/news/news61.html -http://jproxy.uol.es/jproxy/http://mars.jpl.nasa.gov/msp98/ds2/fact.html -http://jproxy.uol.es/jproxy/http://mars.jpl.nasa.gov/mgs/sci/mola/98lander.html -http://jproxy.uol.es/jproxy/http://mars.jpl.nasa.gov/msp98/news/status990123.html -http://ustlib.ust.hk/search*chi/dmarriage/dmarriage/-5,-1,0,B/exact&F=dmarriage+china&1,4/limit -http://mediate.magicbutton.net/do/session/625641/vsid/4385/tid/4385/cid/88138/mid/1702/rid/2114/chid/3393/url/http://www.worldgallery.co.uk/frameset-artc.html -http://www.scifi.com/cgi-bin/rbox/articles.pl?1&6&1721&20 -http://www.areteoutdoors.com/contribute/earth/b.97.r.54.g.1706.html -http://members.tripod.lycos.co.kr/ifoo6981/?M=A -http://link.fastpartner.com/do/session/600395/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/bol.php -http://link.fastpartner.com/do/session/600395/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/mediatransfer.php -http://link.fastpartner.com/do/session/600395/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/smartguy.php -http://www.safrex.com/catalog/elite08/elite084c.html -http://www.911codes.com/games/platform/psx/sect/div/cont/list_cheat/spray/y/id/0000005511/gid/0000003893/_cheats/_walkthroughs/_codes/_pc/_n64/_psx/_gameboy/_playstation/ -http://yp.gates96.com/7/44/10/4.html -http://yp.gates96.com/7/44/10/15.html -http://yp.gates96.com/7/44/10/30.html -http://yp.gates96.com/7/44/10/32.html -http://yp.gates96.com/7/44/10/36.html -http://yp.gates96.com/7/44/11/1.html -http://yp.gates96.com/7/44/11/41.html -http://yp.gates96.com/7/44/11/44.html -http://yp.gates96.com/7/44/12/29.html -http://yp.gates96.com/7/44/12/76.html -http://yp.gates96.com/7/44/12/81.html -http://yp.gates96.com/7/44/13/56.html -http://yp.gates96.com/7/44/14/19.html -http://yp.gates96.com/7/44/15/14.html -http://yp.gates96.com/7/44/15/52.html -http://yp.gates96.com/7/44/15/62.html -http://yp.gates96.com/7/44/15/72.html -http://yp.gates96.com/7/44/15/78.html -http://yp.gates96.com/7/44/15/81.html -http://yp.gates96.com/7/44/15/82.html -http://yp.gates96.com/7/44/16/78.html -http://yp.gates96.com/7/44/16/93.html -http://yp.gates96.com/7/44/17/51.html -http://yp.gates96.com/7/44/17/75.html -http://yp.gates96.com/7/44/18/43.html -http://yp.gates96.com/7/44/18/92.html -http://yp.gates96.com/7/44/19/26.html -http://www3.newstimes.com/archive2000/oct17/bze.htm -http://member.aol.co%20m/askmo/ -http://home.excite.co.uk/directory/categories/528195 -http://www.scifi.com/bboard/browse.cgi/1/5/545/11566?pnum=1 -http://member.shangdu.net/home1/havdone/game/gonglue/ljcq.htm -http://member.shangdu.net/home1/havdone/game/gonglue/lishou.htm -http://archiv.leo.org/cgi-bin/leo-md5.pl/pub/comp/usenet/comp.sources.misc/dostrace/ -http://yp.gates96.com/8/70/91/12.html -http://yp.gates96.com/8/70/91/20.html -http://yp.gates96.com/8/70/91/45.html -http://yp.gates96.com/8/70/92/29.html -http://yp.gates96.com/8/70/92/40.html -http://yp.gates96.com/8/70/92/74.html -http://yp.gates96.com/8/70/93/9.html -http://yp.gates96.com/8/70/93/11.html -http://yp.gates96.com/8/70/94/10.html -http://yp.gates96.com/8/70/94/90.html -http://yp.gates96.com/8/70/95/4.html -http://yp.gates96.com/8/70/95/13.html -http://yp.gates96.com/8/70/95/58.html -http://yp.gates96.com/8/70/95/74.html -http://yp.gates96.com/8/70/95/80.html -http://yp.gates96.com/8/70/96/34.html -http://yp.gates96.com/8/70/96/65.html -http://yp.gates96.com/8/70/97/0.html -http://yp.gates96.com/8/70/97/16.html -http://yp.gates96.com/8/70/97/75.html -http://yp.gates96.com/8/70/98/27.html -http://yp.gates96.com/8/70/98/60.html -http://www.icopyright.com/1.1638.306154 -http://www.zeal.com/category/be_zealous.jhtml?cid=828 -http://lib1.nippon-foundation.or.jp/1996/0621/contents/004.htm -http://www.haikou.hainan.gov.cn/pandect/nj/n96jada.htm -http://www.chaos.dk/sexriddle/s/e/x/p/b/m/s/ -http://www.symantec.ca/region/uk/resources/mobile/nav.html -http://retailer.gocollect.com/do/session/1912798/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/product_display/products/product_lines.asp -http://polygraph.ircache.net:8181/services/define/http_-2www.microsoft.com/ie/Tabitha/http_-2www.adultlinks.net/gallery.shtml -http://f22.parsimony.net/forum42460/messages/1.htm -http://www.greenleaves.com/bookcat/gb_0722530986.html -http://www.classiccmp.org/mail-archive/classiccmp/1998-06/0638.html -http://www1.onelist.com/dir/Society/Paranormal/UFOs/Biblical_Perspectives -http://home.hiwaay.net/~bjacobs/genealogy/laster/html/d0055/g0000045.html -http://link.fastpartner.com/do/session/600374/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/netmaling.php -http://big5.peopledaily.com.cn/haiwai/200003/03/newfiles/A104.html -http://ustlib.ust.hk/search*chi/achang+chieh+mei/achang+chieh+mei/-5,-1,0,B/frameset&F=achang+chieh+fu&1,,2 -http://teleline.terra.es/personal/mgsair/chtml/ejemplos/marcos1.html -http://myhome.naver.com/toktok01/bbs.php3?p_work=admin&p_page=1 -http://netway.pda.tucows.com/palm/adnload/34443_22051.html -http://netway.pda.tucows.com/palm/adnload/34930_22057.html -http://netway.pda.tucows.com/palm/adnload/34435_22044.html -http://us.mandrakesoft.com/cgi-bin/cvsweb.cgi/kmusic/brahms/qtWaveTrack.h?sortby=rev&only_with_tag=HEAD -http://sinr.net/book/content/39/8411.html -http://www.egroups.com/post/gvocsa?act=reply&messageNum=145 -http://www.diogenes.ch/4DACTION/web_rd_aut_prview/a_id=7056669&area=&ID=483352 -http://www.brio.de/BRIO.catalog/39fe2f7d06fe4a08273fd472aa7806a9/UserTemplate/1 -http://www3.newstimes.com/archive2000/sep01/rgd.htm -http://community.webshots.com/photo/5886633/5886821zAagKCgZhs -http://community.webshots.com/photo/5886633/5917061PxBHHqElgV -http://www.dnai.com/~mbaum/anita/html/eng/art/images/image38.html -http://www.houses-apartment-listings.com/Michigan/city_search_criteria.asp?state=MI&City=CLINTON -http://www.brio.de/BRIO.catalog/39fdb87c09896af6273fd472aa78076c/UserTemplate/10 -http://www.expressindia.com/ie/daily/19990129/02950495p.html -http://www.linux.com/networking/web/unix/internet/project/security/ -http://www.linux.com/networking/web/unix/internet/project/Red_Hat/ -http://www.linux.com/networking/web/unix/internet/project/freshmeat/ -http://www.linux.com/networking/web/unix/internet/project/?kw_offset=50 -http://ring.yamanashi.ac.jp/pub/linux/debian/debian/dists/Debian2.2r0/non-free/binary-i386/science/?N=D -http://ftp.task.gda.pl/pub/games/idgames/utils/level_edit/acaddoom.txt -http://www.affiliate.hpstore.hp.co.uk/do/session/380864/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/FR/REGISTRATION/entry.asp -http://fi.egroups.com/post/allianc?act=reply&messageNum=2305 -http://polygraph.ircache.net:8181/services/design/company/http_-2burn.ucsd.edu/~abcf -http://polygraph.ircache.net:8181/services/design/company/miami.htm -http://www.utexas.edu/ftp/admin/AI_ATTIC/ATW/Mosaic.instruct/?D=A -http://ftp.du.se/disk3/redhat/updates/powertools/current/alpha/ -http://www.multicosm.com/facade/demo.multicosm.com/facade/www.informationweek.com/mediakit/00/default.html -http://www.multicosm.com/facade/demo.multicosm.com/facade/www.informationweek.com/mediakit/00/about_overview.html -http://www7.tok2.com/home/maki67/menu.htm -http://www.mapion.co.jp/custom/AOL/admi/23/23103/tsujicho/2chome/index-24.html -http://sunsite.org.uk/public/computing/networks/internet/ietf/printmib/printmib-attendees-97apr.txt -http://ftp.univie.ac.at/packages/tex/macros/latex2e/contrib/supported/nomencl/?N=D -http://spaceports.tucows.com/winme/adnload/137993_30287.html -http://habenix.uni-muenster.de/Rektorat/Forschungsberichte-1997-1998/fo05acd01.htm -http://www.power2lead.com/Global/English.nsf/pgWWLocations!OpenPage&ExpandSection=2,25,7,32,18 -http://www.teacherformation.org/html/od/facilitators.cfm/task1,help/discussion_id,2/xid,6155/yid,3651726 -http://itcareers.careercast.com/texis/it/itjs/+IwwBmeS9D867xwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqew7hmwGAnBoDtapGdtGwMamnVncdpa51ppdGBaqconDBaqdMM1DoqwBodDaoDVn5BMnDBapGdm1qBaMwDwtnaqGnwBoVnaMFqhgfHNEDzm7wwwpBmeg9D86exqwww5rmeqDwwwBrmeZpwww/morelike.html -http://itcareers.careercast.com/texis/it/itjs/+XwwBmie0B-deaqwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqew7hmwGAnBoDtapGdtGwMamnVncdpa51ppdGBaqconDBaqdMM1DoqwBodDaoDVn5BMnDBapGdm1qBaMwDwtnaqGnwBoVnaMFqhgfHNEDzm7wwwpBmeg9D86exqwww5rm-mwwBrmeZpwww/morelike.html -http://members.iinet.net.au/~scott3/legacy/matt.html -http://cn.egroups.com/post/bastardimage?act=forward&messageNum=11 -http://ftp.nodomainname.net/pub/mirrors/.2/gnu/tasks/?N=D -http://ftp.nodomainname.net/pub/mirrors/.2/gnu/tasks/standards.text -http://10000downloads.subportal.com/sn/Utilities/Misc__Utilities/11320.html -http://mindit.netmind.com/proxy/http://www.altera.com/html/tools/swupdates.html -http://www.next.com.hk/mag/419/news/an06.htm -http://www.areteoutdoors.com/channel/air/b.283.g.3871.html -http://troop485.tripod.com/documents/johnwayne.htm -http://troop485.tripod.com/documents/bp-churchhill.htm -http://sound-dist.secured.co.uk/cgi-bin/psProdDet.cgi/22P03|972959558|Security|user|0|1,0,0,1 -http://www9.hmv.co.uk:5555/do/session/1347794/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/departments/d120_sd0_pt0.html -http://ftp.du.se/debian/dists/Debian2.2r0/main/disks-m68k/2.2.16-2000-07-14/mac/images-1.44/?S=A -http://opac.lib.ntnu.edu.tw/search*chi/++ftlist/bp20043193/-5,-1,0,B/buttonframe&F=bp20043190&1,1 -http://www.parlament.ch/internet98/Poly/Suchen_amtl_Bulletin/ce98/ete/275.HTM -http://in.egroups.com/messages/svpvril/5195?viscount=-30 -http://in.egroups.com/messages/svpvril/?expand=1 -http://retailer.gocollect.com/do/session/1912744/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/checkout/shopping_cart.asp -http://retailer.gocollect.com/do/session/1912744/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/clubhouse/suggestions.asp -http://www18.freeweb.ne.jp/sports/imamako/ -http://www.cs.ucc.ie/javadocs/jdk1.2.2/docs/api/java/awt/geom/class-use/QuadCurve2D.Double.html -http://click-to.tell-a-friend.boardhost.com/tell-a-friend-confirm.cgi?stigmaonline&msg=172 -http://www.emerchandise.com/aboutus/b.TV%20ANGEL/s.2YYjVOgH -http://www.leyou.com/product/ShowResult.php?LY_Category=0531&page=3 -http://cafe6.daum.net/Cafe-bin/Bbs.cgi/rest114pds/qry/zka/B2-kB23o/qqatt/^ -http://sunsite.informatik.rwth-aachen.de/LinuxArchives/sunsite.unc.edu/distributions/linux-router/dists/2.9.6/base/?N=D -http://www-uk5.cricket.org/link_to_database/ARCHIVE/1999-2000/PAK_IN_SL/FANTASY/ -http://findmail.com/message/sangersreview/99 -http://phase.etl.go.jp/mirrors/netlib/utk/people/JackDongarra/SLIDES/osu-498/sld011.htm -http://tucows.datasync.com/winme/preview/75261.html -http://secure.danysoft.com/asp/dany.tienda/1266636789/Catalog -http://www.birding.about.com/hobbies/birding/cs/placesecuador/index_2.htm -http://www.cpami.gov.tw/ymsnp/animal/fauna/nospc385text.htm -http://www.fh-telekom-leipzig.de/hilfe/pak_e/paket_inhalt_jade_dsl.html -http://home.vicnet.net.au/~nunayl/feedback.html -http://www.expage.com/nibina -http://www.expage.com/virtuaalisiittolantallivihko -http://www.expage.com/muittentallijenkisoja -http://www.arm.com/sitearchitek/support.ns4/html/cores_faq!OpenDocument&ExpandSection=9,39,33 -http://retailer.gocollect.com/do/session/1912707/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/product_display/top_ten.asp?pagenum=2 -http://www.streetprices.com/Electronics/Other/MAKE+SYMANTEC/sortdetailbystock/SP322647.html -http://www.peopledaily.co.jp/haiwai/199810/09/no_981009003024_6.html -http://mediate.magicbutton.net/do/session/625622/vsid/4385/tid/4385/cid/88138/mid/1702/rid/2114/chid/3393/url/http://www.worldgallery.co.uk/frameset-artc.html -http://mediate.magicbutton.net/do/session/625622/vsid/4385/tid/4385/cid/88138/mid/1702/rid/2114/chid/3393/url/http://www.worldgallery.co.uk/frameset-top50.html -http://www.nada.kth.se/systemgruppen/docs/javadoc/jdk-1.3/docs/api/javax/swing/plaf/basic/class-use/BasicSliderUI.ChangeHandler.html -http://kernel2.adver.com.tw/Counter/log/kernel2.adver.com.tw/Collect_DB_Advers2/2000-09-10/08/?N=D -http://yp.gates96.com/12/57/30/53.html -http://yp.gates96.com/12/57/32/14.html -http://yp.gates96.com/12/57/32/97.html -http://yp.gates96.com/12/57/33/1.html -http://yp.gates96.com/12/57/33/37.html -http://yp.gates96.com/12/57/37/91.html -http://yp.gates96.com/12/57/37/98.html -http://yp.gates96.com/12/57/38/23.html -http://yp.gates96.com/12/57/38/34.html -http://yp.gates96.com/12/57/38/51.html -http://yp.gates96.com/12/57/38/53.html -http://yp.gates96.com/12/57/39/43.html -http://yp.gates96.com/12/57/39/56.html -http://yp.gates96.com/12/57/39/68.html -http://yp.gates96.com/12/57/39/70.html -http://www3.sympatico.ca/jacques.m.boisvert/Data_Distribution.html -http://www.garekiya.com/female/female02-25.html -http://www.brio.de/BRIO.catalog/39fe2f6c06f4cd8e273fd472aa780734/UserTemplate/5 -http://202.99.23.195/GB/channel1/13/20001030/291723.html -http://db.bbc.co.uk/education/gcsebitesize/maths/shape_and_space_i_h/loci_rev.shtml -http://commerce.was-inc.com/cgi-bin/abtwsam.dll/LbkWebCommerceStoreCategories-BBC709F9_97F3_1F2D7EFC4CA45617D914720977E88400 -http://commerce.was-inc.com/cgi-bin/abtwsam.dll/LbkWebCommerceShoppingCartPage-BBC709F9_97F3_1F2D7EFC4CA45617D914720977E88400 -http://polygraph.ircache.net:8181/http_-2www.microsoft.com/frontpage/http_-2www.hercules.com/history.htm -http://www.jbc.org/cgi/content/short/275/36/27501 -http://brazil.mit.edu/sdb/de/html/keylist.NNTP.html -http://ads3.zdnet.com/c/g=r771&c=a53605&idx=2000.10.30.21.30.57/www.micronpc.com/zd/max1299 -http://webtools.familyeducation.com/whatworks/item/front/0,2551,22-9696-6689-473-46499,00.html -http://www.dispatch.co.za/2000/04/08/business/HIGHLOW.HTM -http://generalstore.everdream.com/kore/catalog/Office_Supplies/Forms,_Record_Keeping_&_Reference/Human_Resources/Motivational/brand.html?sort=price&count=0 -http://www.laria.u-picardie.fr/docs/www.linux-france.org/article/securite/intro.html -http://ftp.uni-stuttgart.de/pub/netscape/communicator/slovenian/4.51/windows/windows95_or_nt/ -http://cafe4.daum.net/Cafe-bin/Bbs.cgi/monjatingpds/lst/qqeq/1/zka/B2-kBnNt -http://myhome.shinbiro.com/~funky27/novel18.htm -http://www.apcmag.com/apcweb/reviewsdisc.nsf/aac7d56ca8fd884b852563be00610639/25858e2d9c878e294a2567060015364d!EditDocument -http://www.private-immobilien-boerse.de/nordrhein-Westfalen/luedinghausen/Verkauf/3d-service/Gemeinsam/Immolink/Gemeinsam/erreichenPartner/Private-IB/ -http://www.eos.dk/archive/swing/msg00405.html -http://www.jobvillage.com/channel/jobs/human_resources/benefits_analysis/b.2807.g.1757.html -http://www.hanaga.com.cn/gbjc/tc/jq.htm -http://www.multimap.com/wi/33747.htm -http://www.multimap.com/wi/143959.htm -http://home.freeuk.net/jdl/Left_Navigate.htm -http://www.crit.org/nph-edit.cgi/http://crit.org/pub/ifi.unizh.ch/wagner/just-testing.html -http://www.interessengemeinschaft-musik.de/catalog%20data/body_22.html -http://aleph.tau.ac.il:4500/ALEPH/ENG/ATA/AAS/AAS/FIND-ACC/0333501 -http://www.mojahedin.org/Pages/Mojahed/Mojahed451/rp/rp09.html -http://genforum.genealogy.com/cgi-genforum/forums/lenhart.cgi?158 -http://carriage.de/Schoner/collections/Geschichte/Sammlungen/info-e/ -http://cafe4.daum.net/Cafe-bin/Bbs.cgi/pflhs11pds/rnw/zka/B2-kB2-s -http://ftp.lip6.fr/pub11/NetBSD/arch/hpcmips/pkgstat/20001008.0536/textproc/xerces-j-current/ -http://dk.egroups.com/message/scotdisinfo/306 -http://groups.haas.berkeley.edu/hcs/Docs/SASv8/sasdoc/sashtml/proc/z0360708.htm -http://www.legend-net.com/news/tiyu/messages/474.html -http://www.legend-net.com/news/tiyu/messages/466.html -http://tv.thevines.com/leaf/AA0000373887/3/0/0/&hmode=on -http://vorg1.subportal.com/sn/Business/Enhanced_Calculators/5511.html -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=7,28,31,24,35 -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=24,5,17,30,11 -http://ftp.gwdg.de/pub/eff/Global/USA/Legislation/gtda_export.regulations -http://www.dein-schicksal.de/Fotoanzeigen/April_2000/7/17/27/body_57.html -http://www.fujian-window.com/Fujian_w/news/mzrb1/20000630/2_14.html -http://www.webswap.com/shelf/2/17559/sell.html -http://search.leg.wa.gov/wslrcw/RCW%20%2036%20%20TITLE/RCW%20%2036%20.100%20%20CHAPTER/RCW%20%2036%20.100%20.060.htm -http://www.doc.ic.ac.uk/lab/labsrc_area/firstyear/submissions/1997-98/jmc1/labs/Ex02/icc97/?M=A -http://school.educities.org/card/abc0609.html -http://school.educities.org/card/huangmei.html -http://school.educities.org/card/a126457822.html -http://school.educities.org/card/a8911.html -http://school.educities.org/card/aa5117.html -http://school.educities.org/card/b3575610.html -http://school.educities.org/card/c5625.html -http://school.educities.org/card/h1230997.html -http://school.educities.org/card/h224153937.html -http://school.educities.org/card/julie9.html -http://school.educities.org/card/lefe135.html -http://school.educities.org/card/nl123.html -http://school.educities.org/card/s5802.html -http://school.educities.org/card/s58120.html -http://school.educities.org/card/s5931.html -http://school.educities.org/card/s6197.html -http://school.educities.org/card/vov.html -http://school.educities.org/card/xx5331.html -http://darkwing.uoregon.edu/~cblanksh/GeneratedItems/?M=A -http://ciscom.gamecenter.com/Tipcheat/PC/Item/0,128,0-202,00.html -http://rotten-tomatoes.com/movies/browse/1010942/video.php -http://rotten-tomatoes.com/movies/browse/1076825/reviews.php -http://archive.soccerage.com/s/fr/09/98335.html -http://www.ferien-immobilien.de/nordrhein-Westfalen/aachen/Verkauf/GmbH-Kauf-Verkauf-Insolvenz-konkurs/Startseite/3d-service/Gemeinsam/erreichenPartner/Gemeinsam/impressum.htm -http://www.ebigchina.com/tool_tellfriend.phtml?code=msg&mid=3174 -http://people.freebsd.org/~knu/cgi-bin/cvsweb.cgi/src/libexec/rpc.rwalld/Makefile?only_with_tag=RELENG_3 -http://people.freebsd.org/~knu/cgi-bin/cvsweb.cgi/src/libexec/rpc.rwalld/Makefile?only_with_tag=MAIN -http://people.freebsd.org/~knu/cgi-bin/cvsweb.cgi/src/libexec/rpc.rwalld/Makefile?only_with_tag=RELENG_3_BP -http://ring.jec.ad.jp/pub/linux/debian/debian/dists/unstable/contrib/binary-sh/admin/?M=A -http://www2.eunet.lv/library/alt/URIKOVA/FORTUNE_D/Mirrors -http://www.hermes.dk/departments/om/publica.shtml -http://208.194.150.10/Ski/Articles/DrDewpoint/001/bannerAd.shtml -http://us.mandrakesoft.com/cgi-bin/cvsweb.cgi/quanta/quanta/widgets/?sortby=log&only_with_tag=start -http://biblio.cesga.es:81/search*gag/aSempere+Navarro,+Antonio-Vicente/asempere+navarro+antonio+vicente/-5,-1,0,E/frameset&F=asempere+y+guarinos+juan+trad&1,1 -http://www.fractal.com.ru/Component/Toshiba/74Cxx/TC74HC74DS.pdf -http://www.staroriental.net/nav/soeg/ihf,aai,n3,7,Electric+Wave+Girl+1998.html -http://excite.de/auto/katalog/11803 -http://gatekeeper.dec.com/pub/BSD/NetBSD/NetBSD-current/pkgsrc/sysutils/amanda-client/pkg/ -http://www.smcworld.com/smcworld/bp_e/large/0524_2301_002x2301_003x2301_004x2301_005x2301_006x2301_007_2301_005b.html -http://www.kaos.dk/sexriddle/x/j/t/z/d/ -http://www.kaos.dk/sexriddle/x/j/t/z/e/ -http://spartanburg2.edgate.com/blgspringes/school_athletics/parent/ -http://www-personal.engin.umich.edu/~mhaanpaa/?S=D -http://www.amcity.com/jacksonville/stories/2000/05/15/story8.html?t=email_story -http://yp.gates96.com/7/47/40/13.html -http://yp.gates96.com/7/47/42/7.html -http://yp.gates96.com/7/47/43/2.html -http://yp.gates96.com/7/47/43/22.html -http://yp.gates96.com/7/47/43/54.html -http://yp.gates96.com/7/47/44/0.html -http://yp.gates96.com/7/47/45/3.html -http://yp.gates96.com/7/47/45/30.html -http://yp.gates96.com/7/47/45/78.html -http://yp.gates96.com/7/47/45/89.html -http://yp.gates96.com/7/47/46/41.html -http://yp.gates96.com/7/47/46/71.html -http://yp.gates96.com/7/47/48/1.html -http://yp.gates96.com/7/47/48/68.html -http://yp.gates96.com/7/47/48/92.html -http://yp.gates96.com/7/47/49/6.html -http://yp.gates96.com/7/47/49/43.html -http://yp.gates96.com/7/47/49/86.html -http://yp.gates96.com/7/47/49/97.html -http://de.excite.de/bildung/katalog/24692 -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=90&discrim=226,20,231 -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=90&discrim=226,20,4 -http://www.affiliate.hpstore.hp.co.uk/do/session/380862/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/search.asp -http://www1.zdnet.co.uk/news/news1/ns-1511.html -http://bellona.itworld.com:8080/cwi/reprint/0,1926,NAV63-128-1357-1367_STO48730,00.html -http://wwwhome.cs.utwente.nl/~zwiers/projects/docs/jdk/api/java/util/class-use/SortedMap.html -http://cgi.cnnsi.com/football/nfl/players/Ed.McCaffrey/ -http://fi.egroups.com/messages/philmusic/12006 -http://fi.egroups.com/messages/philmusic/12123 -http://fi.egroups.com/messages/philmusic/213 -http://fi.egroups.com/messages/philmusic/1826 -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=22,0+20,0-9,2-~ -http://my.egroups.com/message/gps4gis/164 -http://www.bemi-immobilien.de/Startseite/www.allgemeine-immobilien-boerse.de/allgemeine-ib/landkreiszwickau/Verkauf/29109700708107kirchbergvillamü/Gemeinsam/MarketingStrategie/Gemeinsam/Inserieren/Startseite/Startseite/Gemeinsam/versicherungen/gebaeude/anforderungsformular.htm -http://apple.excite.com/entertainment/fine_arts/classical_music/composers/baroque_composers/albinoni_tomaso/works/ -http://www.lithoquoter.com/Scripts/WebObjects.exe/Printers.woa/609420000046582000001552000000949302/main.wo/7834100000849302/4/-/prime -http://yp.gates96.com/11/75/40/25.html -http://yp.gates96.com/11/75/40/38.html -http://yp.gates96.com/11/75/40/88.html -http://yp.gates96.com/11/75/40/91.html -http://yp.gates96.com/11/75/42/1.html -http://yp.gates96.com/11/75/42/74.html -http://yp.gates96.com/11/75/42/81.html -http://yp.gates96.com/11/75/43/45.html -http://yp.gates96.com/11/75/43/51.html -http://yp.gates96.com/11/75/46/25.html -http://yp.gates96.com/11/75/46/72.html -http://yp.gates96.com/11/75/46/89.html -http://yp.gates96.com/11/75/46/91.html -http://yp.gates96.com/11/75/47/5.html -http://yp.gates96.com/11/75/48/67.html -http://yp.gates96.com/11/75/49/89.html -http://users.telerama.com/~mross/jenny/forsale.html -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=14&discrim=212,57 -http://ring.htcn.ne.jp/archives/NetBSD/NetBSD-1.4.2/atari/binary/security/?N=D -http://library.bangor.ac.uk/search/dCanada+--+Agricultural+resources+--+19th+century/dcanada+agricultural+resources+++19th+century/-5,-1,0,B/exact&F=dcanaanites&1,3 -http://www.brio.de/BRIO.catalog/39fe2f6406e8eec4273fd472aa780738/UserTemplate/5 -http://kuyper.calvin.edu/fathers2/NPNF1-05/npnf1-05-04.htm -http://kuyper.calvin.edu/fathers2/NPNF1-05/npnf1-05-08.htm -http://kuyper.calvin.edu/fathers2/NPNF1-05/npnf1-05-20.htm -http://polygraph.ircache.net:8181/http_-2www.sgi.net/http_-2www.itools.com/research-it/http_-2www.aardvarkclay.com/Themes/http_-2www.snapsite.com/guests/sk8ctrl/public/html/sitemap/sitemap.htm -http://www.genexchange.com/cemlist.cfm?state=mo&county=webster -http://newsone.net/nnr/showart/alt.current-events.haiti/911 -http://212.11.11.62/voyages_degriffes/MEXIQUE/PARIS+-+MEXICO+A%2FR/SAI00511790/ -http://bitwise.linux.tucows.com/x11html/adnload/131942_45932.html -http://www.brio.de/BRIO.catalog/39fe2f740910301a2740d472aa7806aa/UserTemplate/1 -http://singles-ads.theshoppe.com/cgi-bin/c/736/64/dXNlcmJhbm5lcg==/gn/3585/ -http://www.chaos.dk/sexriddle/j/l/v/y/t/ -http://www.interlog.com/~prandall/relations/d0003/g0000795.html -http://ftp.jp.debian.org/debian/dists/woody/non-free/binary-arm/oldlibs/?M=A -http://biblioteca.upv.es/bib/doc/doc_fisbd/129/97268//V/1828099/6////25/N/MLTPAID -http://biblioteca.upv.es/bib/doc/doc_fisbd/129/147168//V/1828099/11////25/N/MLTPAID -http://biblioteca.upv.es/bib/doc/doc_fisbd/129/124846//V/1828099/24////25/N/MLTPAID -http://mirrortucows.technet.it/winme/htmlbeginnerme_size.html -http://www.bcbsal.org/Provider_Dir/pharmacy/state/Georgia/HAWKINSVILLE/index_10201.html -http://www.incestpornstories.com/tinkerbellbeard/ac/plus-sizehealthy/petitevietnamese/slanted-eyes/cuntschoolgirls/high-schoolteenager/cherryunderage.html -http://www.0563.net/imode2/hazu/play/outdoor/nature/nature1.htm -http://www.launch.com/music/songpage/pvn_content/0,5259,1074221,00.html -http://ftp.jp.debian.org/debian/dists/unstable/main/binary-alpha/tex/?S=A -http://iceberg.adhomeworld.com/cgi-win/redirect.exe/896425026 -http://www.nrc-handelsblad.nl/W2/Lab/Baan/000726-a.html -http://www.nrc-handelsblad.nl/W2/Lab/Baan/000718-a.html -http://members.tripod.co.jp/muzyaki/?M=A -http://alfa.nic.in/lsdeb/ls12/ses4/0413039930.htm -http://excite.de/immobilien/katalog/26640 -http://excite.de/immobilien/katalog/27591 -http://excite.de/immobilien/katalog/28370 -http://excite.de/immobilien/katalog/28376 -http://excite.de/immobilien/katalog/26426 -http://excite.de/immobilien/katalog/28458 -http://www.emerchandise.com/aboutus/b.TV%20THE60S/s.qxmvd5Gr -http://www.computerworld.com.cn/99/week/9920/9920c13.asp -http://www.stud.ntnu.no/~oystena/oystena/cache/dvx70a.html -http://nealet.subportal.com/sn/Shell_and_Desktop/Holiday_Screen_Savers/ -http://dk.egroups.com/message/ugm/40?source=1 -http://www1.bdaserver.de/bda/nat/pzt/formel1/gp/mon.html -http://www17.freeweb.ne.jp/diary/t-soken/love-love.htm -http://kernel2.adver.com.tw/Counter/log/kernel2.adver.com.tw/SaveCounter/2000-10-12/14/971332013437.txt -http://pub3.ezboard.com/f80sxchangegeneraldiscussion.showMessage?topicID=60.topic -http://www.northampton.ac.uk/cgi-bin/liberation/betsie/betsie.pl/0005/www.nene.ac.uk/ncr/enrol/sectn4/pdf/4-5.pdf -http://www.xmission.com/~dkenison/cgi/lwgate.cgi/LDS-BOOKSHELF/archives/v01.n676/Date/article-15.html -http://www.eos.dk/archive/swing/nav08574.html -http://nathanael.upi.jussieu.fr/tele6.nsf/autres+centres+de+formations!OpenPage&ExpandSection=1,4,11,18,5,17 -http://nathanael.upi.jussieu.fr/tele6.nsf/autres+centres+de+formations!OpenPage&ExpandSection=6,4,11,18,5,17 -http://cn.egroups.com/message/highlanderswaps/3351 -http://cn.egroups.com/message/highlanderswaps/3356 -http://www.mobygames.com/user/sheet/view/havelist/so,game_title(game_id)+DESC,game_havelist_id+DESC/userHaveListId,18/userSheetId,832/offset,15/ -http://www.mobygames.com/user/sheet/view/havelist/so,game_title(game_id)+DESC,game_havelist_id+DESC/userHaveListId,18/userSheetId,832/offset,60/ -http://gettosdownloads.subportal.com/sn/Palm_Pilot/Home_and_Hobby/12385.html -http://biblio.cesga.es:81/search*gag/aOurense+(Di%26oacute%3Bcesis).+Obispado+de+Ourense,+ed./aourense+diocesis+obispado+de+ourense+ed/-5,-1,0,B/browse -http://www.beneteau-owners.com/beneteau.nsf/userlistbyboat!OpenView&Start=21.24&Count=45&Expand=39 -http://www.geocities.com/Yosemite/8908/ -http://www.geocities.com/Yosemite/3295/ -http://lists.insecure.org/linux-kernel/2000/Apr/4105.html -http://www.telematik.informatik.uni-karlsruhe.de/osf/sw/v5.0x/lp2/dna500/ -http://atlas.web.cern.ch/Atlas/GROUPS/SOFTWARE/OO/dist/0.0.28/graphics/TreeBuilder/TreeMaker/CVS/?M=A -http://www.21hk.com/book/zt/zt/zpj/c/chichuancilang/txmoxj/012.htm -http://chat.hani.co.kr/NetBBS/Bbs.dll/brief/rcm/zka/B23lBn-t/qqatt/^ -http://www3.buch-per-sms.de/impressum.jsp$ID=To7770mC6889218603037781At0.41865389376542195 -http://mayu.sourceforge.net/cgi-bin/nph-ml.cgi/000/http/www.geocrawler.com/archives/3/151/1997/7/0/904457/ -http://www.mets.com/gameinfo/990504-recap.htm -http://www.mets.com/Video/990709-PiazzaHR_lr.asp -http://www.people.zeelandnet.nl/cn.atlas/compatlasw1.html -http://www.digitaldrucke.de/(aktuell,bekanntschaften,hilfe,marktplatz,nuernberg)/_fort/html/themen/markt/bekannt/bekannt.htm -http://www.staroriental.net/nav/soeg/ihf,acf,s0,359,Gigi+Leung+Wing-Kay.html -http://rapidus.tucows.com/winme/adnload/137435_28887.html -http://library.bangor.ac.uk/search/aBerthoff,+Ann+E/aberthoff+ann+e/-5,-1,0,B/frameset&F=aberthier+rene&1,1 -http://www.teenplatinum.com/barelylegal/underagevirgin/abductionbondage/amateurco-ed/chijapanese/{gaylink} -http://www.paisvirtual.com/informatica/freeware/cltorres/contra.htm -http://library.cuhk.edu.hk/search*chi/aInstitution+of+Civil+Engineers+(Great+Britain)/ainstitution+of+civil+engineers+great+britain/-5,-1,0,B/browse -http://www.digitaldrucke.de/(aktuell,computer,hersteller,hilfe)/_fort/html/themen/computer/hard/links/dell.htm -http://www.angelfire.com/ar/jimbowles/weekofoct3.html -http://www.dtic.mil/envirodod/derpreport95/vol_2/b2_1991.html -http://www.dtic.mil/envirodod/derpreport95/vol_2/b2_2010.html -http://kobe.cool.ne.jp/heartisland/y_top0004.html -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=146&discrim=10,97,3 -http://www.channel7000.com/partners/tv/consumer/partners-tv-consumer-20000207-231308.html -http://www.channel7000.com/partners/tv/consumer/partners-tv-consumer-19991206-195152.html -http://www.channel7000.com/partners/tv/consumer/partners-tv-consumer-990920-105620.html -http://www.channel7000.com/partners/tv/consumer/partners-tv-consumer-990810-082554.html -http://gallery2.simplenet.com/lobby/main/videocaps/lalbrght/conair/laca26.htm -http://www.ld.com/cbd/archive/1999/09(September)/30-Sep-1999/Bawd007.htm -http://www.ld.com/cbd/archive/1999/09(September)/30-Sep-1999/Bawd013.htm -http://chunma.yeungnam.ac.kr/~j4390071/ -http://www.chaos.dk/sexriddle/h/y/z/m/ -http://www.maas.ccr.it/cgi-win/hiweb.exe/a18/d262/b190,8,be,29,29,,b,,be,b, -http://pub17.ezboard.com/fanimesandrpgslinkstositesandotherforums.showMessage?topicID=2.topic -http://www.hotelboulevard.com/fr/riviera/standard/htmled1e03872682f66e105b3c38b4506d50/sessionLang/ANG/search.html -http://bbs.msquare.or.kr/list.bbs/course/old/DiscMath95/9.html -http://www.rezel.enst.fr/ftp/linux/distributions/debian/CD-1/dists/unstable/main/binary-all/mail/?N=D -http://www.ee/epbe/pangandus/9910/0.2.txt -http://shitty.10pics.com/buttfucking/rear/ -http://www.thestateofcolorado.com/hsiwindowdoorlettering.html -http://www.generation-formation.fr/brevesc.htm---o21zAo0UtDo0Ol9A074fo6Td4ezyr6feZJPAPfVbNyqruePl9neNHhIeOkatAhcgNA074wNV8XzAhcgNAPfVbdsNhJI.htm -http://netscape.digitalcity.com/boston/sports/standings.dci?league=NBA&team=BOS -http://netscape.digitalcity.com/boston/sports/attcompare.dci?league=NBA&team=BOS -http://retailer.gocollect.com/do/session/1912752/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/clubhouse/suggestions.asp -http://mindit.netmind.com/proxy/http://www.skepdic.com/sympathetic.html -http://mindit.netmind.com/proxy/http://faculty.washington.edu/chudler/moon.html -http://itcareers.careercast.com/texis/it/itjs/++wwBmeE_D86esmwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqew8Qwo5qda5dc1BodDawGnwaGn31oGnmaoDmnpBraADdicnmtnapGdm1qBaBnqrDoqwcatGd1pamnVncdpaMFqoET02fgENDzmezxwwwpBmeC_D86Qwww5rmkmwwBrmeyDwww/morelike.html -http://retailer.gocollect.com/do/session/1912762/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/terms_and_conditions.asp -http://retailer.gocollect.com/do/session/1912762/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/clubhouse/suggestions.asp -http://www.writtenbyme.com/cgi-bin/rw_readarticle.cgi/141339880.shtml -http://www.writtenbyme.com/cgi-bin/rw_readarticle.cgi/410769654.shtml -http://www.writtenbyme.com/cgi-bin/rw_readarticle.cgi/190045923.shtml -http://tucows.megalink.com/winme/preview/76155.html -http://www.buybuddy.com/sleuth/17/1/2006/32184/ -http://www.affiliate.hpstore.hp.co.uk/do/session/380853/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/FR/REGISTRATION/entry.asp -http://pchome.net:81/ch/Hw/CAMERA/canoneosd30/canoneosd30.htm -http://pchome.net:81/ch/Hw/CAMERA/kodaknew.htm -http://pchome.net:81/ch/Hw/MODEM/twluc562w2k.htm -http://pchome.net:81/ch/Hw/MONITOR/mag796fd.htm -http://pchome.net:81/ch/Hw/cool/anquanshuileng/anquanshuileng.htm -http://pchome.net:81/ch/Hw/DISPLAY/3dbenchmarks/3dbenchmarks.htm -http://pchome.net:81/ch/Hw/CAMERA/Microdrive.htm -http://pchome.net:81/ch/Hw/harddisk/niyaomaishime.htm -http://www.civila.com/guitar/desenredada/chat/logos/index.html-ssi -http://members.xoom.it/scialpinismo/gitaappenparm/PreviewPages/PreviewPage7.htm -http://cpan.nitco.com/modules/by-module/Mail/ASPIERS/URI-Bookmarks-0.92.readme -http://polygraph.ircache.net:8181/services/design/http_-2www.swnebr.net/~cambridg/http_-2www.cauce.org/Malcolm/ -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/16_aswkit_aswkit.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/16_nbilwv_rbpobu.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/16_jkawvi_messod.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/16_jkawvi_otdbms.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/16_jkawvi_hoktlo.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/16_uhfkhdn_ilaeh.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/16_xyhsj_pfepjoa.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/16_alkqaay_mogsts.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/16_ighrg_ighrg.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/16_cbfjod_parbe.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/16_dqnlq_jfspcj.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/16_phcro_bwlah.html -http://www.asahi-net.or.jp/~yd7k-itu/sbbsindex/old/16_phcro_xoxchqb.html -http://seniorfriendfinder.com/cgi-bin/w3com/pws/ffsenior/IkhI2h2UISFGhSJ4dK-jGu69npNFUTS7n0SO4q6b8rSzWq_RIDBJOsj9QRxPcb3IZgZlQ5jvjGikzJWNeK-85DucH1Ag5dhhL0czi-GMxyHC1dmfKc0hW5TzqJpnm938SIT3xNrWgjZN66P6 -http://seniorfriendfinder.com/cgi-bin/w3com/pws/ffsenior/oo1IpLu33emgRiskeudWkzY7LxFY35wz6EqyQ42lguNadi_4qnt4FhGUPOob_C5Wt99hQSEKEuRTRevsau9UYJ9lySivV-u51_OF4aSEhYXTt98QpjnIOFYPV6acMb20In922uOHMyYdC8HXvwhIP-8o8oM4wLBMdll6aW8xe922WllgXE1F5qlvFqyA -http://msdn.microsoft.com/library/devprods/vs6/visualj/vjref/java.sql.DatabaseMetaData136.html -http://msdn.microsoft.com/library/devprods/vs6/visualj/vjref/java.sql.DatabaseMetaData090.html -http://romulus.ehs.uiuc.edu/cgi-bin/lwgate/RADSAFE/archives/radsafe9902/Date/article-572.html -http://spaceports.tucows.com/winme/preview/76400.html -http://www.telecombroker.com/q/001p/ppc3/qG4gs1ewhU.htm -http://ftp.nodomainname.net/pub/mirrors/.2/gnu/graphics/?N=D -http://retailer.gocollect.com/do/session/1912813/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/help/site_tour/index.asp -http://retailer.gocollect.com/do/session/1912813/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/news/index.asp -http://retailer.gocollect.com/do/session/1912813/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/privacy_policy.asp -http://202.101.106.19/dir/100/10a/zzgk/bszn/111.htm -http://www.eveclub.com/cgi-bin/eveclub.front/972959538910/Catalog/1000084 -http://www.eveclub.com/cgi-bin/eveclub.front/972959538910/Club/start/1000000 -http://www.slis.ua.edu/cgi-bin/clickthrough.cgi/CT=http_3a_2f_2fwww_2edermis_2enet_2fbilddb_2fdiagnose_2fenglisch_2fi697015_2ehtm -http://forum.rai.it/aca-finestre/dispatch.cgi/FORUM/folderFrame/100001/0/rnumber/8467604 -http://www-personal.engin.umich.edu/~vernage/teamweb/team.building/effective.meetings/effective.meetings.facilitation.htm -http://www4.law.cornell.edu/uscode/42/ch87subchIV.head.html -http://yp.gates96.com/7/27/90/10.html -http://yp.gates96.com/7/27/90/11.html -http://yp.gates96.com/7/27/90/30.html -http://yp.gates96.com/7/27/91/72.html -http://yp.gates96.com/7/27/91/76.html -http://yp.gates96.com/7/27/91/85.html -http://yp.gates96.com/7/27/91/92.html -http://yp.gates96.com/7/27/92/61.html -http://yp.gates96.com/7/27/92/72.html -http://yp.gates96.com/7/27/93/10.html -http://yp.gates96.com/7/27/93/17.html -http://yp.gates96.com/7/27/93/30.html -http://yp.gates96.com/7/27/93/65.html -http://yp.gates96.com/7/27/93/76.html -http://yp.gates96.com/7/27/93/99.html -http://yp.gates96.com/7/27/94/37.html -http://yp.gates96.com/7/27/94/85.html -http://yp.gates96.com/7/27/95/5.html -http://yp.gates96.com/7/27/95/14.html -http://yp.gates96.com/7/27/95/55.html -http://yp.gates96.com/7/27/95/57.html -http://yp.gates96.com/7/27/96/21.html -http://yp.gates96.com/7/27/96/49.html -http://yp.gates96.com/7/27/96/50.html -http://yp.gates96.com/7/27/96/55.html -http://yp.gates96.com/7/27/96/92.html -http://yp.gates96.com/7/27/97/24.html -http://yp.gates96.com/7/27/97/73.html -http://yp.gates96.com/7/27/97/98.html -http://yp.gates96.com/7/27/98/26.html -http://yp.gates96.com/7/27/98/62.html -http://yp.gates96.com/7/27/99/15.html -http://yp.gates96.com/7/27/99/52.html -http://www.nrk.no/finnmark/x2_9_98/nyh11.htm -http://www.excelsior.com.mx/9701/970105/nac18.html -http://www.symantec.co.kr/sabu/igear/igear_educ/stories.html -http://www.smcworld.com/smcworld/bp/pre/0204_1_1070.html -http://www.cpami.gov.tw/ymsnp/animal/fauna/nospc708choice.htm -http://pub9.ezboard.com/fdawsonscreek50374helpwanted -http://pub9.ezboard.com/fdawsonscreek50374frm17 -http://www.happychannel.it/turismo/europa/top_news/schede/scheda_991209110434.shtml -http://www.happychannel.it/turismo/europa/top_news/schede/scheda_991111111106.shtml -http://dirs.educationamerica.net/New_York/Localities/N/New_York_City/Manhattan/Business_and_Economy/ -http://dirs.educationamerica.net/New_York/Localities/N/New_York_City/Manhattan/Government/ -http://china-water.51.net/life/life_20.htm -http://china-water.51.net/life/life_22.htm -http://www.egroups.com/message/ramtalk/17801 -http://www.usahardware.com/inet/webSession/shopper/US972959720-31113/store/dept-1 -http://www.usahardware.com/inet/webSession/shopper/US972959720-31113/store/specials -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=97&discrim=2,68,201 -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/quizz/legendes/misc/music/lit/hasard.html -http://findmail.com/group/ken2061 -http://www.affiliate.hpstore.hp.co.uk/do/session/380852/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-photoworld.com/photoworld.asp?lang=f -http://www.affiliate.hpstore.hp.co.uk/do/session/380852/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/SMARTTIPS/traveljournal.asp -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/www-med.stanford.edu/school/banner.html -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/www-med.stanford.edu/school/neurosurgery.html -http://hotop.on.net.cn/diguo/club/disp.asp?owner=A201&ID=894 -http://hotop.on.net.cn/diguo/club/disp.asp?owner=A201&ID=846 -http://interbaun.tucows.com/winme/preview/577.html -http://www.ferien-immobilien.de/ungarn/verkauf/Gemeinsam/Immolink/Exklusiv-IB/Startseite/3d-service/Private-IB/Startseite/Default.htm -http://www.eos.dk/archive/swing/msg10936.html -http://www.egroups.com/message/ICSIA-PublicForum/138 -http://www.online.kokusai.co.jp/Service/V0043601/wrd/G200/service/service.html -http://debian.tod.net/debian/dists/unstable/main/source/libs/?N=D -http://www.maas.ccr.it/cgi-win/hiweb.exe/a17/d79/b77,e,4d,51,51,819,819,,2,,51,2,4e,,4d,4e, -http://www.redhat.com/mirrors/LDP/LDP/khg/HyperNews/get/fs/fs/9/?N=D -http://ftp.oleane.net/pub/CTAN/systems/knuth/local/man1/?D=A -http://www.jamba.de/KNet/_KNet-_UA8j1-xFd-13bat/browse.de/node.0/cde7f1uou -http://www.jamba.de/KNet/_KNet-_UA8j1-xFd-13bbg/showInfo-jambabanner.de/node.0/cenv0b09a -http://www.tente.de/us/produkte/artikel/af000000736.htm -http://dwp.bigplanet.com/bloomingprairie/look/sitemap.nhtml -http://www.kfh-mainz.de/Organisationen/Ketteler/pf/ws0001.html -http://extreme-dm.com/tracking/reports/dj/nph-reloads.cgi?tag=agmusik -http://www.chaos.dk/sexriddle/c/v/m/v/y/ -http://ring.jec.ad.jp/pub/linux/debian/debian/dists/woody/non-free/binary-i386/electronics/?D=A -http://tongbang-gh.ed.taejon.kr/1998대전시/math/olym/function/m103_003/html/m103_003h01.html -http://www.company-product.com/23063/ -http://members.tripod.lycos.co.kr/re22/CPUCOOL5195/uni2k15/?N=D -http://209.52.189.2/print_message.cfm/stepparents/8279/173602 -http://216.33.87.17/sports/baseball/sba/sba04r.htm -http://www.mc99.co.jp/mvp/member/new/honda/16kr3fj2/search.cgi?_file=038 -http://www.emerchandise.com/browse/EMERCH/COASTERS/s.cU6lmV05 -http://www.emerchandise.com/browse/CHARMED/s.cU6lmV05 -http://www.across.or.jp/nbbs/nbbs.cgi/talk:n18/replyto/462 -http://www.vins-siffert-scea.fr/lycee-seijo/guide/staff/yoshida.htm -http://www.egroups.com/messages/grebel-list/2305 -http://polygraph.ircache.net:8181/services/design/http_-2www.abcjewelry.com/http_-2www.1045fm.com/http_-2www.4sitedesign.com/stp/nbm.html -http://bsd.sinica.edu.tw/cgi-bin/cvsweb.cgi/ports/astro/wmmoonclock/pkg/Attic/DESCR?only_with_tag=RELEASE_4_0_0 -http://biblio.cesga.es:81/search*gag/tMariposas+negras.+1:08,50+min/tmariposas+negras++++1+++08+++50+min/-5,-1,0,B/frameset&F=tmariposa+y+la+hormiga&1,1 -http://polygraph.ircache.net:8181/Cameras/order/rr962.htm -http://polygraph.ircache.net:8181/Cameras/order/dfwmap.htm -http://support.tandy.com/support_audio/doc45/45827.htm -http://image.tulips.tsukuba.ac.jp:70/fif=picture/ECWP/001.fpx&init=-0.23170732,0.0,1.2317073,1.0&rect=0.5,0.25,0.6829269,0.375&wid=600&hei=600&lng=ja&enablePastMaxZoom=OFF&page=uv1-en.html&obj=uv,1.0&cmd=NW -http://pub23.ezboard.com/fcaribbeanvoiceforumsfrm3.showAddTopicScreenFromWeb -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=9,1+0,0-19,0+9,4 -http://vipnet.tucows.com/win2k/adnload/51108_28465.html -http://vipnet.tucows.com/win2k/adnload/38782_28482.html -http://www4.50megs.com/tstazer/edhtms/edbeats.htm -http://www.unterhaltungs-cd.de/ObervellacherBuam/B000025KMT.htm -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=bocarderont&l=fr -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=146&discrim=10,3,211 -http://variety.studiostore.com/help_security/b.TV%20HERCULES/s.cD15jQkr -http://variety.studiostore.com/help_shipping/b.TV%20HERCULES/s.cD15jQkr -http://variety.studiostore.com/product/TSHER0001/b.TV%20HERCULES/s.cD15jQkr -http://variety.studiostore.com/aboutus/b.TV%20HERCULES/s.cD15jQkr -http://www.redrocksports.com/sports/webSession/shopper/RR972959753-31163/store/dept-5/department/dept-5/item/51530 -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=135&discrim=165,71,194 -http://www.kagtech.com/SpitfrireKennels -http://www.expage.com/page/thekatshow -http://www.jobvillage.com/channel/jobs/cleaning/gardener/b.4255.g.3878.html -http://www.xmwb.sh.cn/xmwb/20000704/BIG5/14016^6070408.htm -http://www.xmwb.sh.cn/xmwb/20000704/BIG5/14016^7070414.htm -http://dennou-t.ms.u-tokyo.ac.jp/arch/cc-env/Linux/debian-jp/dists/woody-jp/contrib/binary-all/tex/?S=A -http://genforum.genealogy.com/ny/monroe/messages/350.html -http://genforum.genealogy.com/ny/monroe/messages/296.html -http://genforum.genealogy.com/ny/monroe/messages/306.html -http://genforum.genealogy.com/ny/monroe/messages/213.html -http://otenet.themes.tucows.com/fonts/preview/18792.html -http://otenet.themes.tucows.com/fonts/adnload/18828.html -http://otenet.themes.tucows.com/fonts/adnload/18876.html -http://otenet.themes.tucows.com/fonts/preview/18877.html -http://otenet.themes.tucows.com/fonts/adnload/18894.html -http://otenet.themes.tucows.com/fonts/adnload/18910.html -http://otenet.themes.tucows.com/fonts/adnload/18941.html -http://otenet.themes.tucows.com/fonts/adnload/18949.html -http://otenet.themes.tucows.com/fonts/adnload/25945.html -http://ww.egroups.com/message/schoolnet_sadc/96 -http://ww.egroups.com/message/schoolnet_sadc/98 -http://www6.pasta.cs.uit.no/ietf/ietf45/proceedings/I-D/webdav-dublin-core-01.txt -http://www-uk9.cricket.org/link_to_database/INTERACTIVE/SURVEYS/POLLS_DEC1998.html -http://www.ucp.org/ucp_generaldsc.cfm/151/8/35/ucp_disctpc/292/263 -http://www.ucp.org/ucp_generaldsc.cfm/151/8/35/ucp_disctpc/79/79 -http://se.egroups.com/message/DBA/1700 -http://mayu.sourceforge.net/cgi-bin/nph-ml.cgi/000/http/www.geocrawler.com/archives/3/138/2000/6/0/ -http://mayu.sourceforge.net/cgi-bin/nph-ml.cgi/000/http/www.geocrawler.com/archives/3/138/2000/7/0/ -http://www.inf.fu-berlin.de/lehre/WS00/SWT/material/rosebeispiele/interaccess/logicalview/cat32862112022a/cat36e7162c0192/msg343269780227.htm -http://www.private-immobilien-boerse.de/leipzig/verkauf/Gemeinsam/erreichenPartner/IIM-Teil/Startseite/Gemeinsam/versicherungen/gebaeude/Allgemeine-IB/Startseite/ -http://www.private-immobilien-boerse.de/leipzig/verkauf/Gemeinsam/erreichenPartner/IIM-Teil/Startseite/Gemeinsam/versicherungen/gebaeude/Gemeinsam/Immolink/link.htm -http://freetravel.bedandbreakfast.com/Canada/Prince%20Edward%20Island/Little%20Sands.asp -http://freetravel.bedandbreakfast.com/Canada/Prince%20Edward%20Island/Miscouche.asp -http://freetravel.bedandbreakfast.com/Canada/Prince%20Edward%20Island/O'Leary.asp -http://www.buybuddy.com/sleuth/15/1/1070306/519432/ -http://l-infonet.phkk.fi/fi/TIETOPALVELUT/KIRJASTO-+JA+TIETOPALVELUT/ammattikorkeakoulukirjastot/ammattikorkeakoulut/lahti/p%E4ij%E4t-h%E4me/ -http://www.3w-buecher.de/GravesRobert/GravesRobert0140171991.htm -http://www.3w-buecher.de/GravesRobert/GravesRobert1559948345.htm -http://www.3w-buecher.de/GravesRobert/GravesRobert1850897506.htm -http://members.theglobe.com/heliox2/pokepages/ninepic.htm -http://taiwan.vh.org//////Providers/Textbooks/MuscleInjuries/Fig2.html -http://www.globalgarden.com/Tomato/Archives/vol.1/1147.html -http://www.mojahedin.org/Pages/Mojahed/Mojahed442/articles/articlesftx03.html -http://216.34.146.180/161000reu/16hlth6.htm -http://moshkow.sstu.samara.ru/win/BESTER/Encoding_koi -http://in.egroups.com/message/Girl-Scout-Swaps/9 -http://in.egroups.com/message/Girl-Scout-Swaps/31 -http://members.tripod.com/floydechoes/more.htm -http://nanjingnews.jlonline.com/nanjingnews/njrb/20000222/08dushi.htm -http://www.egroups.com/messages/archery/38?expand=1 -http://retailer.gocollect.com/do/session/1912759/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/index.asp -http://home.dqt.com.cn/~ying_jia/wangwen/new/111.htm -http://canoe.com/MLB97FLASF/sep30_fla_sf.html -http://pub2.ezboard.com/fespguitarsmessageboardltdguitarandbassreviews.subscribeUnregisteredToTopic?topicID=8.topic -http://www.catholicstore.com/search/index.cfm/FuseAction/largeImage/SKU/2558/category/Bo/subCategory/AE/subject/17 -http://www.allgemeine-immobilien-boerse.de/bayern/augsburg/Verkauf/Private-IB/Startseite/Gemeinsam/Inserieren/Private-IB/IIM-Teil/Startseite/froben.htm -http://www.infoscape.com.cn:8171/nf/0004/18/nfga1801.htm -http://www.infoscape.com.cn:8171/nf/0004/18/nfga1809.htm -http://www.linux.com/networking/network/kernel/apache/applications/HTTP/ -http://www.linux.com/networking/network/kernel/apache/applications/Linuxcare/ -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=exacerbate&l=en -http://dopey.rediris.es/ftp/mirror/CPAN/modules/by-module/overload/GSAR/Archive-Tar-0.071.readme -http://dopey.rediris.es/ftp/mirror/CPAN/modules/by-module/overload/GSAR/Tie-IxHash-1.21.readme -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=207&discrim=3,201,226 -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=207&discrim=3,201,85 -http://www.gsnet.com/bdltg/es/1_136243.html?num=2 -http://www.pinoycentral.com/img/UBB.nsf/e39d540ca6a9104b4825694d006ed185/6668efca7b60518648256966000fd202?Navigate&To=Prev -http://www.academyfloral.com/state/cabel/flowers/harmony.html -http://trading.rakuten.co.jp/items001/4c/0d/10138895/bidlist.html -http://www.cs.uwa.edu.au/programming/jdk1.2.2/api/javax/swing/event/class-use/TableColumnModelListener.html -http://secure.danysoft.com/asp/dany.tienda/803039052/IconBar -http://ftp-stud.fht-esslingen.de/pub/Mirrors/CPAN/modules/by-authors/id/L/LH/LHS/?S=A -http://genforum.genealogy.com/ga/messages/6297.html -http://genforum.genealogy.com/ga/messages/7843.html -http://genforum.genealogy.com/ga/messages/7281.html -http://www.jsinc.com/dd/destnat/sep00/fromcol10090800.asp -http://www.secinfo.com/$/SEC/Filing.asp?T=nDA3.7c_9i4 -http://www.secinfo.com/$/SEC/Filing.asp?T=nDA3.7c_b19 -http://www.sd.digitalcity.com/maconga/penpals/browse.dci?cat=teens -http://www.sd.digitalcity.com/maconga/penpals/browse.dci?cat=seniors&sort=f -http://www.picktips.com/category-1031-1172_1170_1174-4_1_3 -http://www-us6.semiconductors.com/acrobat/datasheets/CR6627_1.pdf -http://ftp.netc.pt/pub/idgames/levels/doom2/deathmatch/p-r/pimp.txt -http://ftp.netc.pt/pub/idgames/levels/doom2/deathmatch/p-r/radiated.txt -http://commerce.was-inc.com/cgi-bin/abtwsam.dll/LbkWebCommerceMallCategories-BBC709FC_97F7_9E91E7C8C7066684B664C77C8575B940 -http://commerce.was-inc.com/cgi-bin/abtwsam.dll/LbkWebCommerceOrderStatusOverview-BBC709FC_97F7_9E91E7C8C7066684B664C77C8575B940 -http://ads.puntopartenza.com/cgi-bin/redirect.cgi/31033638 -http://mediate.magicbutton.net/do/session/625642/vsid/4385/tid/4385/cid/88138/mid/1702/rid/2114/chid/3393/url/http://www.worldgallery.co.uk/frameset-top50.html -http://link.fastpartner.com/do/session/600388/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/netmaling.php -http://www.egroups.com/message/RecipeCollectors2/3785 -http://plat.debian.or.jp/debian/dists/woody/contrib/binary-alpha/admin/?S=A -http://198.103.152.100/search*frc/aFILIPPELLI,+R.L/afilippelli+r+l/-5,-1,0,B/frameset&F=afilion+louis+jacques&1,,0 -http://de.excite.de/wetter/katalog/4206 -http://www.burstnet.com/ads/ad8386a-map.cgi/973225252.925077 -http://www.branchenfuehreronline.de/A/hauptteil_a.html -http://www.linux.com/networking/support/red_hat/internet/test/simple/ -http://www.shopworks.com/ccfarm/index.cfm/action/search/userid/00061450-2F40-19FE-9038010B0A0ADCF2 -http://www.shopworks.com/index.cfm/userid/00061450-2F40-19FE-9038010B0A0ADCF2 -http://pelit.saunalahti.fi/.1/tucows/preview/144491.html -http://pelit.saunalahti.fi/.1/tucows/preview/52377.html -http://www.teacherformation.org/html/od/facilitators.cfm/xid,7238/yid,4053212 -http://tw.yahoo.com/Regional/Countries_and_Regions/China/Provinces__Regions_and_Municipalities/Tianjin/Business/Companies/Utilities/ -http://brain.brent.gov.uk/WebPages.nsf/vWebAllPagesByKey!OpenView&Start=174&Count=60&Expand=194 -http://brain.brent.gov.uk/WebPages.nsf/vWebAllPagesByKey!OpenView&Start=174&Count=60&Expand=227 -http://www.bemi-immobilien.de/Landhaus-Bordeaux/Gemeinsam/versicherungen/unfall/Gemeinsam/erreichenPartner/Startseite/Gemeinsam/MarketingStrategie/Startseite/froben.htm -http://www.bemi-immobilien.de/Landhaus-Bordeaux/Gemeinsam/versicherungen/unfall/Gemeinsam/erreichenPartner/Startseite/Gemeinsam/MarketingStrategie/Gemeinsam/versicherungen/gebaeude/deckungsumfang.htm -http://www.3wposter.com/hake/hkg1701.htm -http://www.citybrazil.com.br/go/mossamedes/utilpub.htm -http://oss.software.ibm.com/developerworks/opensource/cvs/icu4j/icu4j/src/com/ibm/demo/translit/Attic/?sortby=date -http://www.linux.com/networking/network/management/operating_system/enterprise/research/ -http://www.angelfire.com/pq/Prophetess/Prophetess.page3.html -http://www.3w-nostalgie.de/ZeigerMimi/ZeigerMimi007072833X.htm -http://www.excelsior.com.mx/9801/980128/for01.html -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=11&discrim=49,235,5 -http://retailer.gocollect.com/do/session/1912802/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/contact.asp -http://citeseer.nj.nec.com/track/64292/4220924 -http://citeseer.nj.nec.com/correct/318910 -http://citeseer.nj.nec.com/correct/249393 -http://www.chaos.dk/sexriddle/h/y/r/k/ -http://www.hig.se/(aconf,date,doc,insert,return)/~jackson/roxen/ -http://www.hig.se/(aconf,date,doc,gtext,insert)/~jackson/roxen/ -http://mediate.magicbutton.net/do/session/625608/vsid/4573/tid/4573/cid/88043/mid/2247/rid/2383/chid/3527/url/http://www.winesmart.com/expert.asp -http://magazines.sina.com/education/renbun/93/13.html -http://www6.freeweb.ne.jp/art/cilter/kamijo02.htm -http://yp.gates96.com/11/25/50/28.html -http://yp.gates96.com/11/25/50/41.html -http://yp.gates96.com/11/25/50/65.html -http://yp.gates96.com/11/25/50/74.html -http://yp.gates96.com/11/25/50/91.html -http://yp.gates96.com/11/25/50/93.html -http://yp.gates96.com/11/25/50/94.html -http://yp.gates96.com/11/25/51/59.html -http://yp.gates96.com/11/25/51/93.html -http://yp.gates96.com/11/25/52/66.html -http://yp.gates96.com/11/25/54/46.html -http://yp.gates96.com/11/25/54/68.html -http://yp.gates96.com/11/25/54/83.html -http://yp.gates96.com/11/25/54/95.html -http://yp.gates96.com/11/25/54/98.html -http://yp.gates96.com/11/25/55/1.html -http://yp.gates96.com/11/25/55/6.html -http://yp.gates96.com/11/25/55/96.html -http://yp.gates96.com/11/25/56/83.html -http://yp.gates96.com/11/25/56/89.html -http://yp.gates96.com/11/25/57/30.html -http://yp.gates96.com/11/25/57/68.html -http://yp.gates96.com/11/25/58/56.html -http://yp.gates96.com/11/25/58/67.html -http://yp.gates96.com/11/25/59/7.html -http://yp.gates96.com/11/25/59/40.html -http://yp.gates96.com/11/25/59/58.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/lit/misc/legendes/lit/misc/quizz/quizz2.html -http://excite.de/kleinanzeigen/katalog/7100 -http://www.egroups.org/messages/stepup/97 -http://sunsite.org.uk/pub/packages/proftpd/misc/?S=A -http://ring.htcn.ne.jp/archives/lang/perl/CPAN/modules/by-module/CGI/DOUGM/?M=A -http://ring.htcn.ne.jp/archives/lang/perl/CPAN/modules/by-module/CGI/DOUGM/Apache-Scoreboard-0.10.readme -http://ring.htcn.ne.jp/archives/lang/perl/CPAN/modules/by-module/CGI/DOUGM/B-Size-0.04.readme -http://herndon1.sdrdc.com/cgi-bin/can_ind/S8NY00082/1/Y/ -http://in.egroups.com/message/msu-foi/20?source=1 -http://www.worldstocks.de/htm/boersen/asien/indonesien_boerse.htm -http://members.xoom.com/pvmnieuws/movies/movies.html -http://gb.toget.com.tw/article/screensaver/index_a_2.html -http://www.emis.de/journals/EJDE/Volumes/Monographs/Volumes/2000/64/?N=D -http://bsd.wj.o3.net/8/1/18/4.html -http://www.ftp.uni-erlangen.de/pub/mirrors/_other/afterstep.foo.net/apps/asprint/?S=A -http://citeseer.nj.nec.com/cidcontext/3597768 -http://m4.findmail.com/dir/Sports/Soccer/Academic_Study_of_Soccer/History -http://genforum.genealogy.com/cgi-bin/print.cgi?westerman::121.html -http://www-koi.bards.ru/Egorov/part84.htm -http://www-koi.bards.ru/Egorov/part29.htm -http://www-koi.bards.ru/Egorov/part127.htm -http://www-koi.bards.ru/Egorov/part68.htm -http://www.loisirs.ch/emjius/10/brglll.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/quizz/music/computers/legendes/lit/hellequin.html -http://www.redrival.com/dejanss/muzika/exploited/themassacre.html -http://kernel2.adver.com.tw/Counter/log/kernel2.adver.com.tw/SaveCounter/2000-08-31/13/967698323786.txt -http://kernel2.adver.com.tw/Counter/log/kernel2.adver.com.tw/SaveCounter/2000-08-31/13/967699453627.txt -http://kernel2.adver.com.tw/Counter/log/kernel2.adver.com.tw/SaveCounter/2000-08-31/13/967699813970.txt -http://www.chaos.dk/sexriddle/c/v/w/l/o/ -http://www.chaos.dk/sexriddle/c/v/w/l/x/ -http://www.allgemeine-immobilien-boerse.de/Oesterreich/verkauf/IIM-Teil/Startseite/Allgemeine-IB/Gemeinsam/3d-service/info.htm -http://www.marktplatz-hs.de/cgi-bin/ChioEditionShop.s/39fe2eeb0239a4a4273fd47540f806ea/IconBar -http://www.jamba.nl/KNet/_KNet-sDD8j1-GC4-puzu/browse.nl/node.0/cde7f1uou -http://www.icopyright.com/1.1635.66362 -http://www.ld.com/cbd/archive/1999/05(May)/07-May-1999/Vsol004.htm -http://www.infoscape.com.cn:8171/nf/0007/05/nfgz0517.htm -http://209.207.239.212/bkindex/c1034/f1392.html -http://www.gbnf.com/genealogy/rockwel4/html/d0007/I1584.HTM -http://www.gbnf.com/genealogy/rockwel4/html/d0023/I3700.HTM -http://www.hornchurch.londonengland.co.uk/designersgraphic.htm -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/computers/computers/lit/misc/colorart/lit/quizz/ -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/computers/computers/lit/misc/colorart/lit/misc/orders_mag.html -http://www.multimap.com/wi/141313.htm -http://www.multimap.com/wi/141326.htm -http://www.thestateofcolorado.com/aconplumbing.html -http://www.thestateofcolorado.com/aconstairs.html -http://ftp.netc.pt/pub/idgames/levels/doom2/0-9/10level.txt -http://members.tripod.com.br/Magoo13/musicas.htm -http://tucows.bigskysoft.com/winme/adnload/137256_30133.html -http://www.houses-apartment-rentals.com/Texas/city_search_criteria.asp?state=TX&City=CHICOTA -http://se.egroups.com/message/trabalhoseguro/186 -http://www.daysinn.com/ctg/cgi-bin/DaysInn/financial_support/AAAksrACwAAABvyAAQ -http://www.long-life.de/lt040.htm -http://smartnet.tucows.com/winme/meditme_rating.html -http://smartnet.tucows.com/winme/meditme_size.html -http://www.kmoviefc-jp.com/db/prod/pd/k1000003.htm -http://ftp.rge.com/pub/usenet/readers/mac/Mews/?S=A -http://fi.egroups.com/messages/lasermail/298 -http://fi.egroups.com/message/lasermail/295 -http://www.voter.com/home/message/post/1,1559,24-60_2976_2473-,00.html -http://se.egroups.com/message/rv8list/1122 -http://www.ferien-immobilien.de/Rhein-Sieg-kreis/verkauf/GmbH-Kauf-Verkauf-Insolvenz-konkurs/Startseite/3d-service/Gemeinsam/Inserieren/Private-IB/Startseite/Default.htm -http://library.bangor.ac.uk/search/aUnited+Kingdom+Reading+Association/aunited+kingdom+reading+association/-17,-1,0,B/exact&F=aunited+kingdom+environmental+law+association&1,2/limit -http://webcenter.travelocity-leisure.netscape.com/DestGuides/0,1840,TRAVELOCITY|1987|5|2,00.html -http://yokohama.cool.ne.jp/michirur/dragon/maria/m2.htm -http://ring.omp.ad.jp/archives/NetBSD/packages/pkgsrc/graphics/Ngraph/patches/?D=A -http://mitglied.tripod.de/argewesterwald/jr/jrfo3.htm -http://www.arm.com/sitearchitek/support.ns4/html/cores_faq!OpenDocument&ExpandSection=3,16,10 -http://www.arm.com/sitearchitek/support.ns4/html/cores_faq!OpenDocument&ExpandSection=28,16,10 -http://avdistrict.edgate.com/hhs/pa_rc_gre.html -http://pub26.ezboard.com/fdysfuctionalrealityfrm2.showAddReplyScreenFromWeb?topicID=32.topic&index=1 -http://www.geocities.co.jp/Playtown-Domino/5245/guti.html -http://www.haikou.hi.cn/Pandect/hknj98/nj98d1.html -http://retailer.gocollect.com/do/session/1912800/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/help/site_tour/index.asp -http://ftp.unina.it/pub/Pcibm/pcdemos/ftp.hornet.org/graphics/images/1998/b/?M=A -http://variety.studiostore.com/browse/ABUGSLIFE/FIGURINE/s.qjEoNLlG -http://yp.gates96.com/11/76/10/13.html -http://yp.gates96.com/11/76/10/18.html -http://yp.gates96.com/11/76/11/63.html -http://yp.gates96.com/11/76/14/45.html -http://yp.gates96.com/11/76/14/65.html -http://yp.gates96.com/11/76/14/77.html -http://yp.gates96.com/11/76/15/1.html -http://yp.gates96.com/11/76/15/68.html -http://yp.gates96.com/11/76/15/97.html -http://yp.gates96.com/11/76/16/2.html -http://yp.gates96.com/11/76/16/59.html -http://yp.gates96.com/11/76/16/64.html -http://yp.gates96.com/11/76/16/79.html -http://yp.gates96.com/11/76/17/10.html -http://yp.gates96.com/11/76/17/52.html -http://yp.gates96.com/11/76/19/9.html -http://yp.gates96.com/11/76/19/11.html -http://yp.gates96.com/11/76/19/17.html -http://yp.gates96.com/11/76/19/19.html -http://www.debian.org.cn/Bugs/db/67/67207-b.html -http://www.bemi-immobilien.de/Exklusiv-IB/Startseite/Gemeinsam/immolink/Gemeinsam/Inserieren/Startseite/Gemeinsam/versicherungen/unfall/Gemeinsam/3d-service/info.htm -http://www.private-immobilien-boerse.de/baden-wuertemberg/calw/Verkauf/Gemeinsam/versicherungen/gebaeude/Gemeinsam/erreichenPartner/Private-IB/IIM-Teil/Startseite/frinfo.htm -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=21,0-(14,0)+9,5 -http://www.thesite.msnbc.com/tlkbck/comment/2100652/0,7436,80913-291181,00.html -http://202.109.72.57:8077/article/19991130/1741.htm -http://www.mit.edu/afs/athena.mit.edu/astaff/project/eolcdev/arch/sgi_62/ -http://www.metromix.com/top/1,1419,M-Metromix-Home-reviews!PlaceDetail-13623,00.html -http://ring.jec.ad.jp/pub/linux/debian/debian/dists/woody/non-free/binary-powerpc/news/?M=A -http://commerce.was-inc.com/cgi-bin/abtwsam.dll/LbkWebCommerceStoreCategories-BBC70A07_97FC_42E663949129E2030ACC2E97E71CD8B3 -http://grwy.online.ha.cn/paoe/about/aoe2.htm -http://www.2pl.com/b/ar/to/1/01/01/v1/1010178470-3.htm -http://www.digitaldrucke.de/(aktuell,marktplatz,nuernberg,sense,werbung)/suche/uebersicht.html -http://ustlib.ust.hk/search*chi/aswiss+radio+symphony+orchestra/aswiss+radio+symphony+orchestra/-5,-1,0,B/frameset&F=aswiss+society+for+soil+and+rock+mechanics&1,1 -http://www.ecatsbridge.com/BiB/static/sims/bbljuly99/00000101843221172F1.htm -http://www.videogames.com/psx/sports/freestyle99/screen.html?page=19 -http://www.mojahedin.org/Pages/Mojahed/Mojahed474/sci/sci02.html -http://www.shopworks.com/bigmountain/index.cfm/action/cart/userid/000E50D6-1185-19FE-A703010D0A0A8CF2 -http://polygraph.ircache.net:8181/http_-2www.horizonfinance.com/~xionthia/as/ -http://yp.gates96.com/14/76/30/16.html -http://yp.gates96.com/14/76/30/81.html -http://yp.gates96.com/14/76/31/12.html -http://yp.gates96.com/14/76/31/37.html -http://yp.gates96.com/14/76/31/68.html -http://yp.gates96.com/14/76/32/11.html -http://yp.gates96.com/14/76/32/50.html -http://yp.gates96.com/14/76/32/68.html -http://yp.gates96.com/14/76/33/26.html -http://yp.gates96.com/14/76/33/53.html -http://yp.gates96.com/14/76/35/11.html -http://yp.gates96.com/14/76/35/26.html -http://yp.gates96.com/14/76/35/47.html -http://yp.gates96.com/14/76/35/74.html -http://yp.gates96.com/14/76/36/16.html -http://yp.gates96.com/14/76/37/23.html -http://yp.gates96.com/14/76/37/56.html -http://yp.gates96.com/14/76/37/82.html -http://yp.gates96.com/14/76/38/76.html -http://yp.gates96.com/14/76/39/20.html -http://yp.gates96.com/14/76/39/25.html -http://yp.gates96.com/14/76/39/28.html -http://yp.gates96.com/14/76/39/33.html -http://yp.gates96.com/14/76/39/61.html -http://yp.gates96.com/14/76/39/69.html -http://yp.gates96.com/14/76/39/91.html -http://www-usa8.cricket.org/link_to_database/ARCHIVE/ARTICLES/JAN-JUN_1996/PRESS_REACTIONS_AUS_18MAR1996 -http://www-usa8.cricket.org/link_to_database/ARCHIVE/ARTICLES/JAN-JUN_1996/LOSS_WI_CRICKET_11MAR1996.html -http://www-usa8.cricket.org/link_to_database/ARCHIVE/ARTICLES/JAN-JUN_1996/SPINNERS_TALES_11JAN1996 -http://hurweb01.hurriyetim.com.tr/hur/turk/98/11/19/gundem/31gun.htm -http://library.cuhk.edu.hk/search*chi/aKuan,+Jui-hsuan./akuan+jui+hsuan/-5,-1,0,E/exact&F=akuan+jui+hsuan&1,22 -http://library.cuhk.edu.hk/search*chi/aKuan,+Jui-hsuan./akuan+jui+hsuan/-5,-1,0,E/frameset&F=akuan+jung&1,,0 -http://ring.toyama-ix.net/archives/pc/winsock-l/Windows95/Finger/fing32l.txt -http://cometweb01.comet.co.uk/do!tid=20&rtid=1&vsid=700&session=132044&mid=1000&rid=1060&cid=37030&chid=1713&url=eqqLmwlGltt5tkZHljbLqkZHlkrHhlZHdfjKYfkLlkZ5ljjLboZLbplGGolLarZLq4fLpmiLXv-KmooLckYLoznGmpq0qsc0mojLbkYLozvGotc0ZdoLckYLozvGsmv0qmc0jXfLkVZLdocLkYoLzcj1XfkLVZXLqkXLjbzKcob5qroLkVrLoizKlZd5fjYHfklKkZlLjjbLoZbLpl51ubZLDXZLollK3ljLbqlKjXfLkkaHotl4obmLloqL -http://student.monterey.edu/nr/riveradebranepom/campus/ -http://forum.rai.it/aca-finestre/dispatch.cgi/FORUM/listUnseen/fol/100001/20,0/5170254 -http://www.ibiblio.org/pub/Linux/distributions/debian/contrib/binary-all/otherosfs/?D=D -http://www.ilmessaggero.it/hermes/19980909/01_NAZIONALE/SPETTACOLI/E.htm -http://ayasii.virtualspace.net/html/1207/12071611_himemiya02.htm -http://retailer.gocollect.com/do/session/1912732/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/about.asp -http://retailer.gocollect.com/do/session/1912732/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/exclusives/newintros.asp -http://retailer.gocollect.com/do/session/1912732/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/dealer_lookup.asp -http://se.egroups.com/subscribe/pretty_of_five -http://home.neo.rr.com/keeter/pics.html -http://www.peopledaily.co.jp/haiwai/199910/12/newfiles/E108.html -http://www.telematik.informatik.uni-karlsruhe.de/osf/sw/v4.0x/lp2/snt100/?M=A -http://www.alyon.org/perso/1001-sciences/sciences_citoyens/agronomie/agronomie/intervenants.htm -http://www.2pl.com/b/no/fi/3/02/24/b1/3022400016-11131.htm -http://channel.nytimes.com/indexes/2000/07/21/sports/hockey/ -http://space.tin.it/io/fivird/REM/eng/albums/lyrics/documentfr.html -http://www.kurit.com/girls/galleryf.cgi?mp_code=7332&service=girls -http://store.efunctional.com/nokia.html -http://dk.egroups.com/login.cgi?login_target=%2Fmessage%2Fbonsai-cz%2F274 -http://bbs.kcm.co.kr/NetBBS/Bbs.dll/boliviabbs/opn/zka/B2-kB2Fq/qqo/007D/qqatt/^ -http://www.loisirs.ch/cvljnq/10/yrespd.html -http://www.primenet.com/~trakker/events/abcforum.htm -http://www.primenet.com/~trakker/events/frame_abcforum.htm -http://www.fogdog.com/cedroID/ssd3040183253760/nav/products/featured_brands/12r/gift_packs/ -http://www.fogdog.com/cedroID/ssd3040183253760/nav/products/featured_brands/12r/windshirts/ -http://www.oreilly.com/homepages/dtdparse/docbook/3.0/dtdent/simmod02.htm -http://dk.egroups.com/group/SCMHCSC -http://www.ycwb.com.cn/gb/2000/01/11/ycwb/dsxw/9.html -http://dk.egroups.com/message/teenhealth/1620 -http://nbzhuhq1.top263.net/htm/y/y14-5.htm -http://adserver.latimes.com/editions/orange/20001030/t000103739.html -http://adserver.latimes.com/editions/orange/20001030/t000103751.html -http://library.bangor.ac.uk/search/cWS+200+G4655+1999/cws++200+g4655+1999/-17,-1,0,B/frameset&F=cws++141+j74+h+1989&2,,2 -http://ftpsearch.belnet.be/pub/os/linux/SuSE-Linux/i386/6.4/disks/rescue -http://www.rarf.riken.go.jp/archives/tex-archive/macros/latex//contrib/supported/elsevier/model-harv.pdf -http://www.diogenes.ch/4DACTION/web_glob_showhtml/path=leser/verlag/index.html&ID=483373 -http://crn.com/Components/emailArticle.asp?ArticleID=2114 -http://link.fastpartner.com/do/session/600410/vsid/1970/tid/1970/cid/135878/mid/1060/rid/1488/chid/1970/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/speednames.php -http://link.fastpartner.com/do/session/600410/vsid/1970/tid/1970/cid/135878/mid/1060/rid/1488/chid/1970/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/nordicliving.php -http://ftp.gigabell.net/pub/FreeBSD/FreeBSD-stable/packages/emulators/ -http://ftp.gigabell.net/pub/FreeBSD/FreeBSD-stable/packages/print/ -http://emplois.fr.net/archive062000/2348.html -http://variety.studiostore.com/browse/ANASTASIA/_/b.FAVORITES%20COMICS%20ANIMFEAT/s.eKoxAPfo -http://www.geocities.co.jp/HeartLand-Gaien/3163/choko.htm -http://members.tripod.com/~moviemaniac1/moviesR/Rocketman.html -http://wiem.onet.pl/wiem/0006ac-sp1.html -http://msdn.microsoft.com/library/devprods/vs6/visualj/vjref/java.net.UnknownHostException001.html -http://www.tiscover.ch/1Root/Kontinent/6/Staat/30/Bundesland/31/Ort/1732/Homepage/m_homepage...2.html -http://power.luneng.com/power/library/jzjs/jzjs99/jzjs9903/990311.htm -http://citeseer.nj.nec.com/cidcontext/1976718 -http://in.egroups.com/messages/srcg/2 -http://sunsite.informatik.rwth-aachen.de/cgi-bin/ftp/ftpshow/pub/comp/Linux/debian/dists/potato/main/disks-sparc -http://pd.shiseido.co.jp/s9701unt/html/unt00025.htm -http://www.kame.tadaima.com/9721036/taro1.html -http://www.kame.tadaima.com/9721036/taro8.html -http://www.unc.edu/courses/chem41/classnotes/41s6/sld008.htm -http://a1sexpics.com/butts/buttfucking/ -http://moundoflove.com/buttfucking/butts/asslickinganal.html -http://www.digitaldrucke.de/(arbeitsvermittlung,hilfe,nuernberg)/_fort/html/themen/hilfe/hilfe.htm -http://freethemes.netc.pt/preview/15221.html -http://freethemes.netc.pt/preview/51972.html -http://freethemes.netc.pt/preview/74442.html -http://cn.tech.yahoo.com/000913/23/1dpl.html -http://cn.tech.yahoo.com/000913/23/1dp2.html -http://wap.jamba.de/KNet/_KNet-JgK8j1-FGd-13di8/browse.de/node.0/cde7f1uou -http://imageserver2.tibetart.com:8087/fif=fpxbuddhist/43.fpx&init=0.0,0.0,1.0,1.0&rect=-0.25,0.25,0.25,0.75&wid=280&hei=400&lng=en_US&enablePastMaxZoom=OFF&page=image.html&obj=uv,1.0&cmd=S -http://www.ozemail.com.au/~pballard/gnt_hidden123/mar12.htm -http://www.ozemail.com.au/~pballard/gnt_hidden123/act9.htm -http://www.ozemail.com.au/~pballard/gnt_hidden123/rom7.htm -http://www.ozemail.com.au/~pballard/gnt_hidden123/2co13.htm -http://www.ozemail.com.au/~pballard/gnt_hidden123/heb12.htm -http://www.ozemail.com.au/~pballard/gnt_hidden123/jam4.htm -http://ftp.darenet.dk/tucows/winnt/adnload/1449_29554.html -http://www.chaos.dk/sexriddle/w/j/u/o/ -http://www.chaos.dk/sexriddle/w/j/u/v/ -http://opac.lib.rpi.edu/search/tmcgraw+hill+series+in+advanced+chemistry/-5,-1,0,B/frameset&tmcgraw+hill+series+in+advanced+chemistry&9,,42 -http://www.zcu.cz/ftp/mirrors/pgp/6.5/6.5.1/win/ -http://webpolitik.subportal.com/sn/Multimedia_and_Graphics/Misc__Graphics_Tools/12852.html -http://ftp.lip6.fr/pub2/perl/CPAN/doc/manual/html/lib/SysV/SysV.html -http://bbs.gznet.edu.cn/cgi-bin/getannounce//groups/GROUP_9/Telecom/friend/fbf/ewqtr -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9709/date/article-10.html -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9709/date/article-88.html -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9709/date/article-92.html -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9709/date/article-177.html -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9709/date/article-178.html -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9709/date/article-229.html -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9709/date/article-288.html -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9709/date/article-293.html -http://www.usq.edu.au/unit-1997/fullspec/54081s2x.htm -http://sound-dist.secured.co.uk/cgi-bin/psProdDet.cgi/15P04|972959617|Helmet|user|0|1,0,0,0 -http://www.buybuddy.com.au/sleuth/8/1/5010204/40843/ -http://www.maxpages.com/vote.cgi?site=pokemonyellow1&pg=Home -http://rex.skyline.net/html/Automobiles_-_Dealers_-_Used.html?64,outdoor,transportation,collectibles,transportation -http://www.linux.com/networking/network/communications/management/updates/Windows_NT/ -http://retailer.gocollect.com/do/session/1912735/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/product_display/top_ten.asp?pagenum=1 -http://amarilloglobenews.com/stories/031000/ -http://www.egroups.com/post/swish?act=reply&messageNum=275 -http://www.apcmag.com/apcweb/reviewsdisc.nsf/aac7d56ca8fd884b852563be00610639/af5bb64432e7f9444a2565240026bbbf!Navigate&To=PrevMain -http://best.netease.com/guestbook/personal/zhuirinew3.html -http://best.netease.com/cgi-bin/view/viewbasic.cgi?japanboy4 -http://www.ftp.uni-erlangen.de/cgi-bin/view/pub/mirrors/redhat/current/i386/doc/gsg/ch-basics.htm -http://www.ftp.uni-erlangen.de/cgi-bin/view/pub/mirrors/redhat/current/i386/doc/gsg/p5202.htm -http://splitrock.themes.tucows.com/preview/77000.html -http://splitrock.themes.tucows.com/preview/25855.html -http://splitrock.themes.tucows.com/preview/134493.html -http://splitrock.themes.tucows.com/preview/14722.html -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=13,0-22,0+15,0-0,2 -http://www.icopyright.com/1.1634.64625 -http://mvweb.de/olympia/nachrichten/sportarten/ergebnisse/bdt-190900-438-dpa_153140.html -http://www.rge.com/pub/tex/fonts/armtex/v2.0/examples/plain/ -http://www.club-internet.fr/cgi-bin/h?Antibes -http://www.caprili.it/santantimo.htm -http://dic.empas.com/show.tsp/?q=%C3%EB%C8%EF%20%F6%AD%FD%E9&f=B -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=98&discrim=2,38 -http://www.artex.firenze.it/_qualitart/articoli/zoom/02235.htm -http://home.powertech.no/huftis/w3c/TR/WAI-WEBCONTENT-NO-NYN/checkpoint-list.txt -http://mtlab.biol.tsukuba.ac.jp/WWW/PDB2/PCD0467/htmls/07.html -http://library.cuhk.edu.hk/search*chi/aShu,+Tien-min./ashu+tien+min/-5,-1,0,B/exact&F=ashu+tsung+chiao&1,6 -http://www.trnonline.com/archives/2000archives/05242000/how_now_joe_brown/23506.shtml -http://www.bemi-immobilien.de/Exklusiv-IB/Startseite/Gemeinsam/versicherungen/gebaeude/Gemeinsam/MarketingStrategie/Gemeinsam/erreichenPartner/Gemeinsam/versicherungen/lebensversicherung/Startseite/frinfo.htm -http://santabarbarashops.com/Mall/Stores/StoreInfo/asp/store-id/1000007121.html -http://www.angelfire.com/ok/americassweetheart/UNique.html -http://ukinvest.ukwire.com/articles/199909070731000375A.html -http://www.streetprices.com/Electronics/Consumer/Camcorders/Digital/sortproductbylowprice/SP374033.html -http://www.streetprices.com/Electronics/Consumer/Camcorders/Digital/sortproductbylowprice/SP363722.html -http://www.streetprices.com/Electronics/Consumer/Camcorders/Digital/sortproductbylowprice/SP288187.html -http://www.streetprices.com/Electronics/Consumer/Camcorders/Digital/sortproductbylowprice/SP288192.html -http://www.bemi-immobilien.de/Startseite/www.ferien-immobilien.de/ferien-ib/startseite/Gemeinsam/Gemeinsam/versicherungen/gebaeude/Startseite/Gemeinsam/Gemeinsam/immolink/Top-Darlehens-Konditionen/anforderungsformular.htm -http://celes.subportal.com/sn/Business/Standard_Calculators/index1.html -http://www.linux.com/networking/network/networking/it/future/firewall/ -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=198&discrim=87,19,3 -http://www.hig.se/(append,define,language,quote,tablify)/~jackson/roxen/ -http://www.guba.com/114/236/12fE/index-3.phtml -http://genforum.genealogy.com/tn/messages/7906.html -http://207.138.41.133/message/BienestarCalifornia/16 -http://207.138.41.133/message/BienestarCalifornia/26 -http://chasnaz.freeyellow.com/email.html -http://genforum.genealogy.com/cgi-bin/print.cgi?mcevoy::217.html -http://www.civila.com/brasil/fov/ -http://www.emerchandise.com/associates/b.FAVORITES%20PAGEANTS/s.oAq5vp1w -http://www.emerchandise.com/help_security/b.FAVORITES%20PAGEANTS/s.oAq5vp1w -http://www.z-plus.de/freizeit/kino/galerie/roula/kritikwelt.html -http://www.angelfire.com/mo2/MrMime2000/wewon.html -http://www.gazeta.com/Iso/Regiony/Lodz/Raporty/Jedzenie/Jedz/020jed.html -http://www.sportas.de/ddsup00.htm -http://muc-zvs-web1.goethe.de/an/mel/wabhorst/dtourism.htm -http://www.cardina.net/~erps -http://www.polbox.com/p/paruwa/spec.html -http://ww2.comune.fe.it/cgi-win/hiweb.exe/a2/d72/b31,e,1f,b,b,50,50,,3,,1f,3,9,,1f,9, -http://www.ld.com/cbd/archive/1999/03(March)/29-Mar-1999/15awd002.htm -http://dk.egroups.com/post/cbradio?act=reply&messageNum=823 -http://aecjobbank.com/texis/script/newjobs/+lww7mwww0xBV6e52iHwwwesPBB2eZmwwwt6erV0Vwwwh6er6Gswwwt6er6bgwwwt6etDL-www+6ethrCwwxeRT43eR4mwwwt6etrvuwwwn6KeU-wwwmcmrmwxerjmx7mwww1hzmww-eHxww/jobdirectory.html -http://www.envy.nu/summerslip/past.html -http://www.envy.nu/summerslip/leave.html -http://home.pacific.net.sg/~kinnkinn/ -http://www.bluesapphires.net/ladies/lv0444.shtml -http://www.freerepublic.com/forum/a4148bd.htm -http://www.sdinfonet.com.cn/024/32/024329969.htm -http://www.sdinfonet.com.cn/024/32/024329953.htm -http://www.jpc-music.com/8754347.htm -http://www.jpc-music.com/5183511.htm -http://www.jamba.nl/KNet/_KNet-ytO8j1-7D4-pwef/browse.nl/node.0/cde7f38ny -http://dk.egroups.com/message/noholdsbarred/210 -http://uoi.tucows.com/winme/preview/75912.html -http://207.197.132.133/lobbyists/98profiles/556.htm -http://www.jobvillage.com/channel/jobs/protective_services/private_investigator/g.4.html -http://www.jobvillage.com/channel/jobs/protective_services/private_investigator/b.8946.g.4179.html -http://aleph.tau.ac.il:4500/ALEPH/eng/ATA/AAS/AAS/SET-MAIL/381462/11/ -http://www-rn.informatik.uni-bremen.de/home/X11R6/xc/lib/font/Speedo/?D=A -http://www.brio.de/BRIO.catalog/39fe2f7006f69fb6273fd472aa78073d/UserTemplate/6 -http://cardiology.medscape.com/IMNG/ClinPsychNews/1998/v26.n07/cpn2607.34.01.html -http://www.incestpornstories.com/hot-hardcore-fuckingbanging/plus-sizewhale/slutspretty/slutsbest-friends/erectionfellatio/bisexualtinkerbell.html -http://yp.gates96.com/7/65/10/40.html -http://yp.gates96.com/7/65/11/15.html -http://yp.gates96.com/7/65/11/34.html -http://yp.gates96.com/7/65/11/69.html -http://yp.gates96.com/7/65/11/88.html -http://yp.gates96.com/7/65/12/95.html -http://yp.gates96.com/7/65/13/82.html -http://yp.gates96.com/7/65/13/91.html -http://yp.gates96.com/7/65/13/93.html -http://yp.gates96.com/7/65/14/2.html -http://yp.gates96.com/7/65/14/8.html -http://yp.gates96.com/7/65/15/31.html -http://yp.gates96.com/7/65/15/38.html -http://yp.gates96.com/7/65/15/51.html -http://yp.gates96.com/7/65/15/95.html -http://yp.gates96.com/7/65/15/96.html -http://yp.gates96.com/7/65/16/4.html -http://yp.gates96.com/7/65/16/20.html -http://yp.gates96.com/7/65/16/58.html -http://yp.gates96.com/7/65/17/22.html -http://yp.gates96.com/7/65/17/66.html -http://yp.gates96.com/7/65/18/37.html -http://yp.gates96.com/7/65/18/69.html -http://yp.gates96.com/7/65/18/97.html -http://yp.gates96.com/7/65/19/0.html -http://yp.gates96.com/7/65/19/12.html -http://yp.gates96.com/7/65/19/16.html -http://yp.gates96.com/7/65/19/28.html -http://yp.gates96.com/7/65/19/37.html -http://yp.gates96.com/7/65/19/44.html -http://dyade.inrialpes.fr/aaa/public/java/jdk1.3/docs/api/javax/swing/plaf/basic/class-use/BasicSplitPaneUI.KeyboardUpLeftHandler.html -http://l-infonet.phkk.fi/fi/TIETOPALVELUT/asiasanahaku/kalatalous/ty%F6voimapolitiikka/pienet+ja+keskisuuret+yritykset/maatilatalous/ -http://www.ferien-immobilien.de/ungarn/verkauf/Gemeinsam/MarketingStrategie/Allgemeine-IB/Private-IB/Private-IB/Startseite/Default.htm -http://ftp.du.se/disk2/CPAN/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/WWW/libwww-perl-5.43.readme -http://ftp.du.se/disk2/CPAN/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/WWW/libwww-perl-5.46.readme -http://ftp.du.se/disk2/CPAN/modules/by-category/15_World_Wide_Web_HTML_HTTP_CGI/WWW/webchat-0.05.readme -http://209.0.220.240/biz/541519/541-389-1493.htm -http://www.shsu.edu/wcb/schools/SHSU/sed/rmzoubi/12/forums/forum54/wwwboard.html -http://retailer.gocollect.com/do/session/1912768/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/news/index.asp -http://romulus.ehs.uiuc.edu/cgi-bin/lwgate/RADSAFE/archives/radsafe9610/Date/article-33.html -http://romulus.ehs.uiuc.edu/cgi-bin/lwgate/RADSAFE/archives/radsafe9610/Date/article-31.html -http://www.acfas.ca/congres/congres67/S408.htm -http://pub1.ezboard.com/fthehawkeyehotspotfrm16.showMessage?topicID=178.topic -http://archives.marshall.edu/~mccomas/cd315-spring00-list/1549.html -http://www.asiastockwatch.com/AsiaStockWatch_-_Cached/Articles/asw_recommend_friend_con/1,1145,617_1_1:3,00.html -http://wiem.onet.pl/wiem/014a7e.html -http://linux99.inrialpes.fr/linux/RPM/kondara/1.2/errata/bugfixes/i586/System_Environment_Daemons.html -http://linux99.inrialpes.fr/linux/RPM/kondara/1.2/errata/bugfixes/i586/User_Interface_X.html -http://cn.egroups.com/login.cgi?login_target=%2Fmessage%2FWeb_Holidays%2F35 -http://library.bangor.ac.uk/search/aEuropean+Academy+of+Allergology+and+Clinical+Immunology/aeuropean+academy+of+allergology+and+clinical+immunology/7,-1,0,B/bibandlinks&F=aeuropean+association+for+animal+production+commission+on+animal+management&1,1 -http://www4.freeweb.ne.jp/art/fujiso/gehp/pge222.html -http://pnews.jcc.co.jp/scoop/9905/990506kk2-3ss.html -http://ring.nii.ac.jp/archives/linux/Vine/Vine-1.1/kernel-2.2.x-kit/RPMS/ -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=81&discrim=8,230,214 -http://www.emerchandise.com/browse/BUFFYTHEVAMP/KEYCHAIN/b.TV%20BUFFYTHEVAMP/s.DfgPpLQw -http://www.emerchandise.com/browse/BUFFYTHEVAMP/MAGNET/s.DfgPpLQw -http://www.koms.de/I-Data/Upgrades/HostCom/Cx/isp/?S=A -http://www.back2roots.org/Aminet/Forums/Util--Wb--Amero36/ -http://www.hig.se/(autoformat,define,en,modified,referrer)/~jackson/roxen/ -http://216.35.79.131/sites/gunits/052302u.html -http://216.35.79.131/sites/gunits/052303u.html -http://216.35.79.131/sites/gunits/032883u.html -http://itcareers.careercast.com/texis/it/itjs/+4wwBmecXD86ExwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewShwAwMwoacnwmamnpcdOMnDBaMwoDBnDwDqnanDtoDnnGaDnBidGAaoDqc1mna5BGdDtaADdicnmtnaGn31oGnmaMFqtwAwMwoDzmeZxwwwpBmIe0B-decrwww5rmeAdwwwBrmeZpwww/morelike.html -http://troy.lib.sfu.ca/search/tadvocate+vanc/tadvocate+vanc/7,-1,0,B/browse -http://210.159.30.200:8080/-_-http://www2s.biglobe.ne.jp/~proton/kokuritu/ -http://210.159.30.200:8080/-_-http://www2s.biglobe.ne.jp/~proton/mituzawa/mitusta.html -http://config.tucows.com/win2k/monitor2k_size.html -http://config.tucows.com/win2k/adnload/136674_47327.html -http://www.thisisyork.com/york/news/YORK_NEWS_CAMPAIGNS_POSTOFFICE5.html -http://yp.gates96.com/5/78/0/35.html -http://yp.gates96.com/5/78/0/41.html -http://yp.gates96.com/5/78/0/65.html -http://yp.gates96.com/5/78/0/79.html -http://yp.gates96.com/5/78/0/81.html -http://yp.gates96.com/5/78/1/33.html -http://yp.gates96.com/5/78/1/76.html -http://yp.gates96.com/5/78/2/0.html -http://yp.gates96.com/5/78/2/65.html -http://yp.gates96.com/5/78/3/37.html -http://yp.gates96.com/5/78/4/31.html -http://yp.gates96.com/5/78/4/60.html -http://yp.gates96.com/5/78/4/73.html -http://yp.gates96.com/5/78/5/28.html -http://yp.gates96.com/5/78/5/65.html -http://yp.gates96.com/5/78/6/12.html -http://yp.gates96.com/5/78/6/38.html -http://yp.gates96.com/5/78/6/99.html -http://yp.gates96.com/5/78/7/48.html -http://yp.gates96.com/5/78/8/49.html -http://yp.gates96.com/5/78/8/55.html -http://yp.gates96.com/5/78/8/71.html -http://yp.gates96.com/5/78/9/19.html -http://yp.gates96.com/5/78/9/94.html -http://link.fastpartner.com/do/session/600420/vsid/2870/tid/2870/cid/136966/mid/1060/rid/1926/chid/2870/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/fastpartner.php -http://www.highwired.net/Guidance/UniversalNav/Redirect/0,5314,15089-15089-728,00.html -http://ring.tains.tohoku.ac.jp/archives/lang/perl/CPAN/modules/by-module/Math/ILYAZ/os2/?S=A -http://www.outpersonals.com/cgi-bin/w3com/pws/out/DzRIZER-v0LffJEf3raIMcG3_vXLUQncNB0JHLK7Xt_XcNu5W9Xwg3bnK7e0BWrbchX2jMSNnK6eY6UuDPq6GFLMrzB0DcydY5VgMGVRUFbdksWiDCuTI0LBo3psuJxBJjEd -http://www.outpersonals.com/cgi-bin/w3com/pws/out/vihIvBk0g-CdjheZ4MILAcJAB--YtsE3nzjAldQSrSojV9JzVQJV-1yVbCi9rsPamZBGc9GfXE6dq1sCz-CnrfwDCHqr_nfUtl2qUN5oWAHphPSuuQXCc2fjfBv3EI-W4XBgp-ANhxEJS0536665 -http://www.outpersonals.com/cgi-bin/w3com/pws/out/VihIDgZ6TF6W8zfPesIFMiw-CNzcKPLyYr5OXnsaqepOa1j4Wz2V-pVOhRfX5lUkxRpYs_BkTdpvjf7zUAk3RdhEaXDfmzm4RA2CLjQ84zSbEZ_Vil1cFFmY0FFZr5oIErljk11AnTlYM6y066jO -http://www.outpersonals.com/cgi-bin/w3com/pws/out/dRhIQJ3pEIfD5uG_JFeaP3_7Bke37Z5pJi0A-hZ_-kxEK4Z1jl3HNb6d3hgJ7UZ34jMQGSNzhYuMNxB-oyBon62h9GWx3Xt1Zk_o4kS3s9ybikCpzetMwprVGDCC-YzllwvEWxmP66jF -http://www.v2music.com/Scripts/WebObjects-ISAPI.dll/V2_New_Publisher.woa/24161000003783000000741030000081551/v2tvindex.wo/810000000071551/1.0.4/3/Webobjects1 -http://www.maas.ccr.it/cgi-win/hiweb.exe/a17/d3345/b77,c,4d,469,469,46e,46e,168e,168e,,51,,4d,51, -http://findmail.com/messages/themcse/102 -http://netcon.tucows.com/winme/adnload/136907_28427.html -http://netcon.tucows.com/winme/adnload/136906_30076.html -http://www.jyu.fi/~heili/tietoverkot/?S=A -http://www1.onelist.com/dir/1/16/483/32773?st=10 -http://www1.onelist.com/messages/animadores -http://seussville.com/teachers/authors/ayre.html -http://seussville.com/teachers/authors/corm.html -http://www.tente.de/sw/produkte/rubriksuche/aa000001461.htm -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=57&discrim=165,57,164 -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=57&discrim=165,57,207 -http://jars.developer.com//classes/jresout.cgi?resource=2897 -http://members.tripod.co.jp/spirits/?S=A -http://homepages.go.com/homepages/i/u/g/iuguy22/ -http://www.arm.com/sitearchitek/support.ns4/html/cores_faq!OpenDocument&ExpandSection=21,5,24 -http://www.arm.com/sitearchitek/support.ns4/html/cores_faq!OpenDocument&ExpandSection=31,5,24 -http://troy.lib.sfu.ca/search/delectrolytes+periodicals/delectrolytes+periodicals/-5,-1,0,B/exact&F=delectrolytes+congresses&1,3 -http://www.rdg.ac.uk/ITS/Topic/Stats/StGSAS8_01/SAS8/af/z0254912.htm -http://www.rdg.ac.uk/ITS/Topic/Stats/StGSAS8_01/SAS8/af/z0254924.htm -http://ring.jec.ad.jp/local/mirror/FreeBSD-current/snapshots/i386/5.0-20000902-CURRENT/compat20/ -http://ring.jec.ad.jp/local/mirror/FreeBSD-current/snapshots/i386/5.0-20000902-CURRENT/dict/ -http://ring.jec.ad.jp/local/mirror/FreeBSD-current/snapshots/i386/5.0-20000902-CURRENT/manpages/ -http://www.xmission.com/~dkenison/cgi/lwgate.cgi/KLR650/archives/v02.n1682/date/article-7.html -http://ring.toyama-ix.net/pub/linux/Vine/Vine-2.0/ppc/?S=A -http://romulus.ehs.uiuc.edu/cgi-bin/lwgate/RADSAFE/archives/radsafe9907/Date/article-80.html -http://www.officeqmart.com/cgi-bin/qmart.front/972959552267/Catalog/3000033 -http://www.checkout.com/member/movies/title/member_reviews_form/1,7722,882122,00.html -http://mindit.netmind.com/proxy/http://www.siennasoft.com/english/order/orders_retail.shtml -http://pelit.saunalahti.fi/.1/tucows/adnload/267_29529.html -http://pelit.saunalahti.fi/.1/tucows/adnload/7574_29534.html -http://zenha.myrice.com/2/23.htm -http://zenha.myrice.com/2/20.htm -http://citeseer.nj.nec.com/cachedpage/62677/1 -http://citeseer.nj.nec.com/check/248055 -http://www.3wbooks.de/BrackRuth/BrackRuth3258053200.htm -http://preview.egroups.com/group/u_exactus -http://preview.egroups.com/group/ticovista -http://www.linux.com/networking/linux/support/va_linux_systems/price/sales/ -http://kulichki-mac.rambler.ru/moshkow/akm/zercalo/kosmix/03.html -http://innopac.lib.tsinghua.edu.cn:2080/search*chi/tStructure+and+bonding+&%2359%3B+70/tstructure+and+bonding+++70/19,-1,0,B/browse -http://www.science.uva.nl/pub/NetBSD/NetBSD-current/pkgsrc/archivers/gcpio/files/ -http://www-d0.fnal.gov/d0dist/dist/releases/pmc04.00.00/calibration_management/?S=A -http://mvweb.de/olympia/nachrichten/sportarten/news/bdt-290900-158-dpa_173282.html -http://www.scifi.com/bboard/browse.cgi/3/1/69/57?pnum=2 -http://www.diogenes.ch/4DACTION/web_rd_aut_prview/a_id=7056459&area=&ID=483365 -http://mirror.cc.utsunomiya-u.ac.jp/mirror/CPAN/authors/id/L/LA/LAXEN/?D=A -http://www.affiliate.hpstore.hp.co.uk/do/session/380856/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.france.hp.com/Main/acheterhp/ -http://library.cuhk.edu.hk/search*chi/aLu,+Li,+1914-/alu+li+1914/-5,-1,0,B/frameset&F=alu+li+chun&1,1 -http://www-usa4.cricket.org/link_to_database/ARCHIVE/2000-01/IND_LOCAL/WOMEN/OTHERS/KLCA-SL/SQUADS/ -http://www.babyheirlooms.com/catalog/htmlos.cat/041141.1.4425650346 -http://193.207.57.3/cgi-win/hiweb.exe/a2/d9/b1305,4,5,,1f,5, -http://www.icopyright.com/1.1664.228033 -http://www.trax.nilex.co.uk/trax.cgi/A1C/B1S/1AR/A2S/A1S/D1L/ -http://www.trax.nilex.co.uk/trax.cgi/A1C/B1S/1AR/A2S/A1S/A2S/ -http://www.ferien-immobilien.de/baden-wuertemberg/calw/Verkauf/Gemeinsam/Inserieren/Private-IB/Gemeinsam/Super-Zins-Konditionen/3d-service/info.htm -http://sunsite.informatik.rwth-aachen.de/LinuxArchives/redhat/releases/guinness/i386/en/dosutils/fips15c/restorrb/ -http://213.36.119.69/do/session/153002/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/connaitre/revue-presse_titres.html -http://pub19.ezboard.com/uvinylangel.showPublicProfile?language=EN -http://boeing_dude.tripod.com/id125_m.htm -http://members.fortunecity.com/greatway1/gallery-pageother-0.htm -http://www.searchtraffic.com/wsignup.php3?owor12 -http://www.staroriental.net/nav/soeg_c/ihf,acv,s0,194,陳慧琳.html -http://www.jpc-music.com/5864555.htm -http://oaziz.narod.ru/kuhn/uzb/sal_f1.html -http://preview.egroups.com/message/4aromatherapy/1112 -http://www.luecos.de/webguides/reisen/travelpictures/europe -http://www.maas.ccr.it/cgi-win/hiweb.exe/a18/d47/b47,8,be,29,29,,38,,be,38, -http://www.chaos.dk/sexriddle/k/u/u/a/ -http://www.chaos.dk/sexriddle/k/u/u/d/ -http://student.monterey.edu/nr/nielsenadamp/campus/ -http://excite.de/gesundheit/katalog/3727 -http://www.ozemail.com.au/~jcai/page19.html -http://www.ozemail.com.au/~jcai/page24.html -http://www.hantsnet.co.uk/scrmxn/c23173.html -http://www.fogdog.com/cedroID/ssd3040183334784/content/fan/subway_series/ -http://www.fogdog.com/cedroID/ssd3040183334784/boutique/arnette/ -http://www.fogdog.com/cedroID/ssd3040183334784/boutique/hi-tec/ -http://www.fogdog.com/cedroID/ssd3040183334784/boutique/marmot/ -http://ftpsearch.belnet.be/packages/CPAN/modules/by-module/Stat/ENNO/ -http://go1.163.com/_NTES/~yejingsong/03/y18/506.htm -http://sinr.net/book/content/343/26710.html -http://www.ramada.com/ctg/cgi-bin/Ramada/progpack/AAAksrACwAAABtrAAV -http://library.bangor.ac.uk/search/aBoer,+J.+H.+de+(Jan+Hendrik),+1899-/aboer+j+h+de+jan+hendrik+1899/-5,-1,0,B/buttonframe&F=aboer+dirk+jan+den&1,1 -http://library.cuhk.edu.hk/search*chi/a三省堂(千代田區,+Tokyo,+Japan)/a%7B213024%7D%7B214d49%7D%7B213840%7D+%7B213458%7D%7B213073%7D%7B214c24%7D%7B213455%7D+tokyo+japan/-5,-1,0,B/browse -http://ibm1.cicrp.jussieu.fr/ibmc/classref/ref/ISetCanvas--Style_DSC.htm -http://amateur-alley.porncity.net/169/ -http://www.teacherformation.org/html/od/facilitators.cfm/task1,about/discussion_id,2/xid,1989/yid,5768630 -http://www.shopworks.com/index.cfm/action/mallcat/mallcatlevel/2/parentmallcat/6/userid/000056F0-2E26-19FE-AF65010C0A0A8CF2 -http://retailer.gocollect.com/do/session/1912760/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/shipping_policy.asp -http://news.novgorod.ru/news/2001/4/1/8/-1 -http://news.novgorod.ru/news/2001/4/3/8/-1 -http://sp201.unige.ch:49213/cxxdoc/classref/ref/ITimingTestStopwatch_DSC.htm -http://netscape.digitalcity.com/boston/localexperts/profile.dci?screenName=PSYWU -http://netscape.digitalcity.com/boston/localexperts/profile.dci?screenName=Mende67 -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=17,2,26,33,23 -http://www.multicosm.com/facade/www.isinet.com/isilinks/isilinks.html -http://kutschen.de/Schoner/Info-d/history/history/literature/ -http://troy.lib.sfu.ca/search/dengineering+research+periodicals/dengineering+research+periodicals/-5,-1,0,B/frameset&F=dengineering+research+grants+canada&3,,4 -http://member.nifty.ne.jp/y-shibata/pc/pch2.htm -http://stocks.tradingcharts.com/stocks/charts/iops-bb/m -http://www.kaos.dk/sexriddle/x/j/c/s/z/ -http://www.bioimages.org.uk/HTML/R138925.HTM -http://pub22.ezboard.com/fawolpaintballfrm1.threadControl?topicID=82.topic -http://www.incestpornstories.com/hot-hardcore-fuckingbanging/plus-sizewhale/body-shotstounge/fuckinghardcore/barely-legalbackseat/{gaylink} -http://www.buybuddy.com/sleuth/27/1/1060904/5811/ -http://www.loisirs.ch/gtfmjv/9/nkrlua.html -http://vorg1.subportal.com/sn/Utilities/File_Maintenance_and_Repair_Utilities/6387.html -http://smartnet.tucows.com/winme/adnload/138584_30392.html -http://ftpsearch.belnet.be/mirrors/src.doc.ic.ac.uk/usenet/usenet-by-hierarchy/comp/emacs/?D=A -http://genforum.genealogy.com/cgi-genforum/forums/green.cgi?7578 -http://cio.cisco.com/warp/public/789/33.html -http://www7.freeweb.ne.jp/diary/bru_dog/tk/ -http://www.chinabyte.com/staticpages/software/software_download/GRBA/software_download_23274_GRBA.html -http://www.chinabyte.com/staticpages/software/software_download/GRBA/software_download_9599_GRBA.html -http://www.seekon.com/L/US/IL/Abingdon -http://freethemes.arrakis.es/skins/winamp/adnload/25359.html -http://www.hig.se/(accessed,modified,remove_cookie,smallcaps,sqlquery)/~jackson/roxen/ -http://cn.egroups.com/message/SF-users/218 -http://cn.egroups.com/message/SF-users/235 -http://www.chaos.dk/sexriddle/r/f/y/c/ -http://www.chaos.dk/sexriddle/r/f/y/e/ -http://www.chaos.dk/sexriddle/r/f/y/g/ -http://yp.gates96.com/13/50/10/33.html -http://yp.gates96.com/13/50/10/49.html -http://yp.gates96.com/13/50/10/55.html -http://yp.gates96.com/13/50/10/98.html -http://yp.gates96.com/13/50/11/35.html -http://yp.gates96.com/13/50/11/73.html -http://yp.gates96.com/13/50/11/94.html -http://yp.gates96.com/13/50/12/39.html -http://yp.gates96.com/13/50/13/8.html -http://yp.gates96.com/13/50/13/67.html -http://yp.gates96.com/13/50/14/8.html -http://yp.gates96.com/13/50/14/11.html -http://yp.gates96.com/13/50/14/47.html -http://yp.gates96.com/13/50/16/18.html -http://yp.gates96.com/13/50/16/58.html -http://yp.gates96.com/13/50/17/33.html -http://yp.gates96.com/13/50/18/13.html -http://yp.gates96.com/13/50/18/49.html -http://yp.gates96.com/13/50/18/54.html -http://yp.gates96.com/13/50/19/0.html -http://cn.egroups.com/post/romtrade?act=reply&messageNum=3851 -http://members.fortunecity.com/toleransi/sorbonne.html -http://ring.htcn.ne.jp/pub/lang/perl/CPAN/modules/by-module/PPM/MURRAY/?S=A -http://sunsite.berkeley.edu/PhiloBiblon/BITAGAP/BIB/BIB5648.html -http://sunsite.berkeley.edu/PhiloBiblon/BITAGAP/BIB/BIB7392.html -http://www.kfi640.com/shared/mod_perl/looksmart/looksmart/eus1/eus53940/eus53960/eus54753/eus543189/eus550516/ -http://www.kfi640.com/shared/mod_perl/looksmart/looksmart/eus1/eus53940/eus53960/eus54753/eus543189/eus550528/ -http://shn.webmd.com/roundtable_printing/774674 -http://www.zi.unizh.ch/software/unix/statmath/sas/sasdoc/lgref/z0205140.htm -http://www.hblb.org.uk/hblbweb.nsf/$Pages/NewsArchive1!OpenDocument&ExpandSection=16,12,3,13,5,6,9 -http://www.uni-duesseldorf.de/ftp/ftp/pf/share/fvwm-2.0.45/?S=A -http://members.tripod.com/~PhyrePhox/mcse/70-088.htm -http://extreme-dm.com/tracking/reports/dj/nph-ref1.cgi?tag=nimrood -http://opac.lib.ntnu.edu.tw/search*chi/++ftlist/bp20040397/-5,-1,0,B/frameset&F=bp20040402&1,1 -http://209.0.220.240/spec/txve.htm -http://209.0.220.240/spec/tyai.htm -http://ftp.up.pt/Linux/Linus/net-source/www/clients/netscape/?M=A -http://ftp.up.pt/Linux/Linus/net-source/www/clients/netscape/?D=A -http://www.jobvillage.com/channel/jobs/health_care/nursing/licensed_practical_nurse/b.9505.g.1766.html -http://www.zope.org/Members/stevea/CoadObjectModels/BackLinks/backlinks -http://www.mairie-montreuil93.fr/ville_pratique/environ/energie/mve/media/?D=A -http://member.shangdu.net/home2/chr/jishang/hongkong/inxg-6.html -http://www.wild-dog.com/activity/touring/idx/page_18_1.html -http://members.tripod.co.jp/susu/?M=A -http://www.dulux.co.uk/UKRETAIL:623356687:DFinity.1QJiP4jMLco -http://www.kordic.re.kr/~trend/Content326/agriculture04.html -http://www.kordic.re.kr/~trend/Content326/agriculture09.html -http://ftp.lip6.fr/pub12/OpenBSD/src/gnu/egcs/config/mh-aix43 -http://ftp.lip6.fr/pub12/OpenBSD/src/gnu/egcs/config/mh-elfalphapic -http://ftp.lip6.fr/pub12/OpenBSD/src/gnu/egcs/config/mt-x86pic -http://www.ecatsbridge.com/BiB/static/sims/bbljuly99/00000101758612773F1.htm -http://pub20.ezboard.com/faustralianslotcarreviewhoracing.showMessage?topicID=2.topic&index=47 -http://ring.omp.ad.jp/archives/NetBSD/packages/pkgsrc/games/exchess/pkg/DESCR -http://homepage.renren.com/sandybay/help.htm -http://no.egroups.com/post/oslosynth?act=reply&messageNum=634 -http://www.brio.de/BRIO.catalog/39fe2f940703266c273fd472aa7806a8/UserTemplate/2 -http://www.50megs.com/prettysenshi/captures/ep3/SMep3.html -http://www.thisislancashire.co.uk/lancashire/archive/1999/11/05/CHORNEWS5VQ.html -http://au.yahoo.com/Regional/U_S__States/California/Metropolitan_Areas/San_Francisco_Bay_Area/Entertainment_and_Arts/Restaurants/Coffee_and_Tea_Houses/ -http://www.niwl.se/WAIS/30002/30002360.htm -http://www.infoscape.com.cn:8178/gb/content/2000-08/16/content_6082.htm -http://link.fastpartner.com/do/session/600419/vsid/2870/tid/2870/cid/136966/mid/1060/rid/1926/chid/2870/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/mondosoft.php -http://www.canit.se/(c1,f3,ftp,generellt,irc,mail)/support/ -http://citeseer.nj.nec.com/cidcontext/3787443 -http://www.affiliate.hpstore.hp.co.uk/do/session/380878/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/entry.asp -http://www.usq.edu.au/unit-1997/fullspec/51129s3x.htm -http://worldres.lycos.com/script/gen_mr.asp?hotel_id=6354&n=1518 -http://www.members.aon.at/~kleindlp/neue_seite_4.htm -http://210.169.76.95/html/tai_0043/bat_1180.html -http://oneplace.adbureau.net/accipiter/adclick/site=ONEPLACE/area=INDEX/POSITION=FOOTER/AAMSZ=468x60/ACC_RANDOM=262411779164 -http://www.service911.com/mvu/step/0,2632,6+34+90+23506+13880_4,00.html -http://ftp.lip6.fr/pub11/NetBSD/NetBSD-current/src/usr.sbin/kvm_mkdb/Makefile -http://www.bemi-immobilien.de/Private-IB/Startseite/Startseite/Gemeinsam/versicherungen/unfall/Gemeinsam/immolink/Startseite/www.ferien-immobilien.de/ferien-ib/startseite/Gemeinsam/versicherungen/gebaeude/anforderungsformular.htm -http://wap.jamba.de/KNet/_KNet-BOC8j1-LFd-13bpy/showInfo-hilfe.de/node.0/cenv0b09a -http://wap.jamba.de/KNet/_KNet-BOC8j1-LFd-13bq0/browse.de/node.0/cde7f1uou -http://cnnews.sina.com/kwongzhou/china/2000/1026/2083022_2.html -http://www.msb.malmo.se/search*swe/dFlygplanskonstruktion/dflygplanskonstruktion/-5,-1,0,B/frameset&F=dflygolyckor&4,,6 -http://home.hanmir.com/~100sun/joo4.htm -http://www.szed.com/szsb/19990629/GB/default.htm -http://www.szed.com/szsb/19990629/GB/4-NPCLASS.HTM -http://www.szed.com/szsb/19990629/GB/7-NPCLASS.HTM -http://www2.kbank.no/Web/nlpublish.nsf/Published/ord_og_uttrykk!OpenDocument&ExpandSection=15,24,26,25 -http://movies.exit.de/lichtsammler/images/tunnel/gross/sw_kb/?D=A -http://www.arm.com/sitearchitek/support.ns4/html/cores_faq!OpenDocument&ExpandSection=5,34,38 -http://www.arm.com/sitearchitek/support.ns4/html/cores_faq!OpenDocument&ExpandSection=21,34,38 -http://www.arm.com/sitearchitek/support.ns4/html/cores_faq!OpenDocument&ExpandSection=31,34,38 -http://fi.egroups.com/login.cgi?login_target=%2Fmessage%2Fgamp%2F1734 -http://de.excite.de/katalog/katalog/9231 -http://www-win.rusf.ru/esli/rubr/books/es0500di.htm -http://www.jamba.de/KNet/_KNet-yjF8j1-8Gd-13cj6/browse.de/node.0/cde7f1uou -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/misc/lit/programs/misc/math/lit/athalie.html -http://ftp.fi.debian.org/debian/dists/Debian2.2r0/contrib/binary-powerpc/interpreters/?S=A -http://jupiter.u-3mrs.fr/~msc41www/releves/04350110.HTM -http://ocean.ntou.edu.tw/search*chi/dDigital+modulation/ddigital+modulation/7,-1,0,E/frameset&F=ddigital+techniques+signal+processing&4,,0 -http://pub20.ezboard.com/fcharmingtailsresourcetradeyoursportscardshere.unsubscribeUnregisteredToTopic?topicID=43.topic -http://www.kaos.dk/sexriddle/x/w/k/u/q/ -http://www.kaos.dk/sexriddle/x/w/k/u/t/ -http://216.205.158.3/smm/programs/CDG_Player/wwwboard/messages/27.html -http://216.205.158.3/smm/programs/CDG_Player/wwwboard/messages/60.html -http://fen.com/whatworks/review/edit/1,2560,1-9696-5539-0-45394,00.html -http://yp.gates96.com/8/74/30/30.html -http://yp.gates96.com/8/74/31/1.html -http://yp.gates96.com/8/74/32/12.html -http://yp.gates96.com/8/74/32/60.html -http://yp.gates96.com/8/74/32/92.html -http://yp.gates96.com/8/74/33/41.html -http://yp.gates96.com/8/74/33/55.html -http://yp.gates96.com/8/74/33/57.html -http://yp.gates96.com/8/74/33/95.html -http://yp.gates96.com/8/74/34/21.html -http://yp.gates96.com/8/74/34/23.html -http://yp.gates96.com/8/74/34/79.html -http://yp.gates96.com/8/74/35/3.html -http://yp.gates96.com/8/74/35/22.html -http://yp.gates96.com/8/74/35/79.html -http://yp.gates96.com/8/74/36/31.html -http://yp.gates96.com/8/74/36/84.html -http://yp.gates96.com/8/74/37/58.html -http://yp.gates96.com/8/74/37/77.html -http://yp.gates96.com/8/74/37/89.html -http://yp.gates96.com/8/74/37/97.html -http://yp.gates96.com/8/74/39/43.html -http://yp.gates96.com/8/74/39/63.html -http://yp.gates96.com/8/74/39/88.html -http://www9.hmv.co.uk:5555/do/session/1347828/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/newmenu.html -http://www9.hmv.co.uk:5555/do/session/1347828/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/departments/d80_sd0_pt0.html -http://gladstone.uoregon.edu/~sme28057/arch181-202/assign2/?M=A -http://cco.cisco.com/univercd/cc/td/doc/product/core/7206/7206ig/trble6ug.pdf -http://210.32.1.18/goldbook/humor/mh/c/changgu/1/028.htm -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=17,28,24,31,11 -http://www.spiral.at/Katalog/Artikel/7561032/ -http://www.crutchfield.com/cgi-bin/S-Ql7dbZlSZa2/viewcart.asp -http://www.fogdog.com/cedroID/ssd3040183327788/nav/products/winter_sports/1b/shell_pants/ -http://www.fogdog.com/cedroID/ssd3040183327788/nav/products/winter_sports/1j/oakley/ -http://www.fogdog.com/cedroID/ssd3040183327788/nav/products/winter_sports/1l/day_packs/ -http://www.thestateofcolorado.com/pglblock.html -http://www.staroriental.net/nav/soeg/ihf,adj,s0,259,Kristy+Yeung+Gung-Yu.html -http://pcmcia.sourceforge.org/cgi-bin/HyperNews/get/pcmcia/toshiba/38.html -http://sunsite.org.uk/public/public/packages/Dr-Fun/df9412/?N=D -http://nt.mortgage101.com/partner-scripts/1144.asp?p=mig&pw=600 -http://biblioteca.upv.es/bib/doc/doc_fisbd/17/87050//C/1828104/3////25/N/MLTPAI -http://130.80.29.3/content/houston/k-12/hanc/ -http://javatest.a-net.nl/exhibits/default.htm -http://javatest.a-net.nl/museum_info/job_opportunities.asp -http://books.hyperlink.co.uk/booklist/Alphabet_Workbook/Cheney/Martha/1565658396 -http://kobe.cool.ne.jp/orera/guestbook.html -http://ftp.eecs.umich.edu/pub/NetBSD/packages/1.4.1/vax/audio/ -http://ftp.eecs.umich.edu/pub/NetBSD/packages/1.4.1/vax/editors/ -http://ftp.eecs.umich.edu/pub/NetBSD/packages/1.4.1/vax/tk80/ -http://www.zdnet.de//news/artikel/1999/03/09001-wc.html -http://neptune.guestworld.com/gear/gateway.cfm?action=private&owner=sitonga7 -http://www.de.lycos.de/dir/Reisen_und_Regionen/L%E4nder_und_St%E4dte/Deutschland/Schleswig-Holstein/St%E4dte_und_Orte/St%E4dte_und_Orte_P_bis_S/ -http://www.mirror.edu.cn/res/sunsite/pub/academic/music/album-reviews/1995/9-September/?M=A -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=213&discrim=176,11,57 -http://europa.eu.int/abc/doc/off/bull/el/9705/x085.htm -http://europa.eu.int/abc/doc/off/bull/el/9705/x209.htm -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=15,0+17,0-3,0-9,0 -http://www.ferien-immobilien.de/baden-wuertemberg/stuttgart/Verkauf/Gemeinsam/MarketingStrategie/Ferien-IB/Startseite/Gemeinsam/Super-Zins-Konditionen/GmbH-Kauf-Verkauf-Insolvenz-konkurs/Startseite/indexbeginn.htm -http://www.ferien-immobilien.de/baden-wuertemberg/stuttgart/Verkauf/Gemeinsam/MarketingStrategie/Ferien-IB/Startseite/Gemeinsam/Super-Zins-Konditionen/Gemeinsam/impressum.htm -http://www.chaos.dk/sexriddle/s/e/x/v/i/a/w/ -http://pub4.ezboard.com/fscarletstreethorroritalianstyle.showAddReplyScreenFromWeb?topicID=15.topic -http://ftp.dti.ad.jp/pub/lang/CPAN/authors/id/P/PJ/PJF/ -http://www.highwired.net/Paper/EmailToFriend/1,2102,302-183023,00.html -http://ftpsearch.belnet.be/mirror3/ftp.kde.org/pub/kde/Incoming/Attic/old/1.1.2/apps/ide/?D=A -http://www.affiliate.hpstore.hp.co.uk/do/session/380877/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-creativeworld.com/creativeworld.asp?lang=f -http://expert.cc.purdue.edu/~steinfoc/assignment3/assig3.html -http://www.wyborcza.com/Ascii/Raporty/Filmowa/277rap.html -http://www.redhat.com/mirrors/LDP/LDP/LG/issue50/misc/pollman/?D=A -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=148&discrim=142,11,200 -http://www.marktplatz-hs.de/cgi-bin/ChioEditionShop.s/39fe2ee602379b7e273fd47540f806e1/Catalog -http://www.affiliate.hpstore.hp.co.uk/do/session/380836/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/SMARTTIPS/createbroch.asp -http://joy1.alpha-g.ne.jp/tree/user/a/amuro/2_index.shtml -http://time.188.net/movie/star/taiwan/2/pic/image36.htm -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=25,1,36,31,11 -http://bsd.sinica.edu.tw/cgi-bin/cvsweb.cgi/ports/audio/kdemultimedia11-i18n/Attic/pkg-comment?only_with_tag=RELEASE_2_2_7 -http://www.landfield.com/ftp/usenet/news.answers/bicycles-faq/?S=A -http://wap.jamba.de/KNet/_KNet-puF8j1-aGd-13clg/browse.de/node.0/cenv0b09a -http://www.empas.com/search/all.html?q=%C0%CC%B7%D3%B4%D9 -http://www.linux.com/networking/server/install/howto/website/developers/ -http://aecjobbank.com/texis/script/newjobs/+NwxBm6ev7I1wwwhmrmwxetiAw/jobdirectory.html -http://www.egroups.com/message/ijtihadmk/5 -http://www.egroups.com/message/ijtihadmk/11 -http://www.realize.com/am67bd81.htm,qt=e784fe2f=2a38a234-7-da6e2d-0-0-0-3-- -http://www.realize.com/p643c81.htm,qt=e784fe2f=2a38a234-7-da6e80-0-0-0-3-- -http://moneysaver.net/netcall/?almktng -http://www.agria.hu/bikersmeeting/archivum/talalkozo/foto/taj.cgi?15n -http://link.fastpartner.com/do/session/600401/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/company/ -http://198.103.152.100/search*frc/aDidsbury,+Howard+F.,+1924-/adidsbury+howard+f+1924/-5,-1,0,B/frameset&F=adidier+marcel&1,,0 -http://198.103.152.100/search*frc/aDidsbury,+Howard+F.,+1924-/adidsbury+howard+f+1924/-5,-1,0,B/frameset&F=adidier+michel&1,,0 -http://www.medoc-ias.u-psud.fr:81/synoptic/gif/001020/?D=A -http://shop.goto.com/compperiph/periph/cdrom/search/sidexside.jhtml?s=1&sort_up=LOW_PRICE -http://excite.de/wirtschaft/katalog/1356 -http://excite.de/wirtschaft/katalog/2631 -http://www.areteoutdoors.com/channel/earth/caving/b.89.g.473.html -http://www.areteoutdoors.com/channel/earth/caving/b.91.g.473.html -http://bo.ole.com/actualidad/articulo/html/act13873.htm -http://www.dulux.co.uk/UKRETAIL:446033260:DFinity.1QJiP4jMomdoclfieh -http://www.linux.com/networking/network/release/sap/hardware/firewall/ -http://genforum.genealogy.com/cgi-genforum/forums/hendrix.cgi?430 -http://www.chaos.dk/sexriddle/s/p/w/c/ -http://198.103.152.100/search*frc/tCanada+in+the+21st+century.+II,+Resources+and+technology/tcanada+in+the+21st+century+ii+resources+and+technology/-5,-1,0,B/frameset&F=tcanada+in+the+21st+century+no+01&1,1 -http://books.hyperlink.co.uk/bookinfo/Sunk_Costs_and_Market_Structure/Sutton/John/0262193051 -http://members.tripod.com/theshavedbeaver/site2/s2laststand.html -http://members.tripod.com/theshavedbeaver/site2/s2s1ep21.html -http://www.ytmag.com/cgi-bin/redirect.cgi/602479760 -http://www18.freeweb.ne.jp/school/syodou/you005.htm -http://www.fogdog.com/cedroID/ssd3040183334500/nav/products/featured_brands/2h/replica_jerseys/ -http://www.fogdog.com/cedroID/ssd3040183334500/nav/products/featured_brands/2h/replica_jerseys/4.html -http://www.fogdog.com/cedroID/ssd3040183334500/crs/nvCZ/wld/fogdog_sports/champion/fan_memorabilia/apparel/vlade_divac_replica_jersey.html -http://www.jobvillage.com/channel/jobs/travel/travel_guide/b.4897.g.5299.html -http://www.bcbsal.org/Provider_Dir/pharmacy/state/Oregon/HILLSBORO/index_29061.html -http://www.maas.ccr.it/cgi-win/hiweb.exe/a17/d2066/b77,c,4d,469,469,1b65,1b65,,51,811,4d,51,811,, -http://www.loisirs.ch/bbewxu/2/wofyff.html -http://mitglied.tripod.de/Jag3/jag3b.htm -http://linuxberg.starhub.net.sg/x11html/preview/9016.html -http://linuxberg.starhub.net.sg/x11html/preview/9062.html -http://linuxberg.starhub.net.sg/x11html/preview/9103.html -http://linuxberg.starhub.net.sg/x11html/preview/9820.html -http://linuxberg.starhub.net.sg/x11html/preview/10370.html -http://linuxberg.starhub.net.sg/x11html/preview/9965.html -http://linuxberg.starhub.net.sg/x11html/preview/10117.html -http://linuxberg.starhub.net.sg/x11html/preview/10129.html -http://linuxberg.starhub.net.sg/x11html/preview/10152.html -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=150&discrim=251,11,3 -http://totalsports.aol.com/stats/bbo/int/20000624/tol.at.swb.game.html -http://excite.de/gesundheit/katalog/41575 -http://bbs.csie.ntu.edu.tw/txt/Emprisenovel/ebooks/other/hsiao_yi/jqhy/007.txt -http://www.memorialcup99.com/HockeyStLouisArchive/nov17_stl.html -http://www.letsmusic.com/directory/theme/genre_each/1,1137,Z-ㄴ-124-2-2,00.asp -http://rainforest.parentsplace.com/dialog/get/bedwetting/29/2.html?outline=-1 -http://www.volny.cz/j_medkova/p05.html -http://www.maas.ccr.it/cgi-win/hiweb.exe/a17/d2072/b77,c,4d,51,51,815,815,818,7d9,,51,7d9,818,, -http://collection.nlc-bnc.ca/100/200/301/ccmd-ccg/ccmd_report-e/rpt1e.pdf -http://cn.egroups.com/post/export-import-indonesia?act=forward&messageNum=595 -http://www.secinfo.com/$/SEC/Filing.asp?T=1zBgb.6t_9yc -http://www.realize.com/am81.htm,qt=4619dc8c=279e650e-c-16fba7d-1-0-0-0-- -http://amadeus.siba.fi/doc/php3-ldap/html/features.html -http://amadeus.siba.fi/doc/php3-ldap/html/function.ada-fetchrow.html -http://amadeus.siba.fi/doc/php3-ldap/html/function.array-pop.html -http://amadeus.siba.fi/doc/php3-ldap/html/function.current.html -http://amadeus.siba.fi/doc/php3-ldap/html/function.ftp-size.html -http://amadeus.siba.fi/doc/php3-ldap/html/function.getmyinode.html -http://amadeus.siba.fi/doc/php3-ldap/html/function.gmdate.html -http://amadeus.siba.fi/doc/php3-ldap/html/function.hw-getusername.html -http://amadeus.siba.fi/doc/php3-ldap/html/function.icap-list-alarms.html -http://amadeus.siba.fi/doc/php3-ldap/html/function.ifx-free-char.html -http://amadeus.siba.fi/doc/php3-ldap/html/function.imap-reopen.html -http://amadeus.siba.fi/doc/php3-ldap/html/function.is-link.html -http://amadeus.siba.fi/doc/php3-ldap/html/function.is-string.html -http://amadeus.siba.fi/doc/php3-ldap/html/function.mcal-event-set-recur-monthly-wday.html -http://amadeus.siba.fi/doc/php3-ldap/html/function.mhash-get-block-size.html -http://wwws.br-online.de/geld/boerse/980420/110001.html -http://family.go.com/Categories/reviews/Features/family_2000_01/dony/dony0100craftapple/ -http://family.go.com/Categories/reviews/Features/family_2000_01/dony/dony0100craftcactus/ -http://family.go.com/Categories/reviews/Features/family_2000_01/dony/dony0100petvetticks/ -http://www.maastrek.de/maas/d49da6854db9e797f212/1/0/1 -http://astro1.chungnam.ac.kr/NetBBS/Bbs.dll/astromov/lst/qqadm/1/zka/B2-kB2Bl/qqo/004D -http://channel.cnnsi.com/basketball/college/2000/ncaa_tourney/west/news/2000/03/25/keady_ap/lg_keady_ap.html -http://incmagazine.com/articles/details/0,3532,AGD5_ART13806_CNT56_GDE30,00.html -http://incmagazine.com/research/details/0,3470,AGD5_CNT49_GDE30_RSC16754,00.html -http://gatekeeper.dec.com/pub/linux/lorax/i386/misc/src/anaconda/balkan/CVS/ -http://adex3.flycast.com/server/socket/127.0.0.1:2800/click/OnlineCitiesSM/OnlineCitiesInteractiveCityGuides/bd720350329 -http://www.proviser.co.uk/regional/towns/alford/street_maps/alpha_b.html -http://www.fogdog.com/cedroID/ssd3040183255203/ -http://www.columbia.edu/~wl158/OCD.htm -http://www.irishnews.com/Archive2000/29052000/international.html -http://www.irishnews.com/Archive2000/29052000/sportinter.html -http://38scbshop.freeyellow.com/download.html -http://news.dinf.ne.jp/news/fj/rec/animation/msg01441.html -http://datastore.tucows.com/winnt/adnload/5372_28388.html -http://pages.infinit.net/limal/visage/chap17.htm -http://www.hotelboulevard.com/fr/paris/standard/htmlc258073cfbe254c1722c86e0aec5f5da/sessionLang/ANG/search.html -http://www.icopyright.com/1.1642.213678 -http://wiem.onet.pl/wiem/012aa2.html -http://www.secinfo.com/dRRsz.9e.htm -http://lily.nju.edu.cn/literature/cangshu/wx/wra/ysz/16.htm -http://home.swipnet.se/~w-15978/ -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/www.stanford.edu/dept/EIS/moral_responsibility.htm -http://smb.slac.stanford.edu/cgi-bin/nph-proxy.cgi/000/http/www.stanford.edu/dept/EIS/hardin_review.htm -http://www.uni-duesseldorf.de/ftp/pf/share/flex-2.5.2/man/man1/?S=A -http://mindit.netmind.com/proxy/http://www.ninds.nih.gov/health_and_medical/pubs/chronic_pain_htr.htm -http://mindit.netmind.com/proxy/http://www.smalltime.com/notvictims/cutting.html -http://www.peopledaily.co.jp/zdxw/7/19991231/19991231001085.html -http://pokemonothin.8m.com/cgi-bin/c/736/64/dXNlcmJhbm5lcg==/gn/4638/ -http://www.chaos.dk/sexriddle/s/e/x/u/y/n/d/ -http://www.bestinfo.net.cn/bsti_kjhy/kyys/bjkyys/arim/technical.html -http://www.leicos.de/webguides/fun_lifestyle/unterhaltung/43101.html -http://209.207.239.212/bkindex/c1047/f1423.html -http://cylis.lib.cycu.edu.tw/search*chi/tEncyclopaedia+of+mathematical+sciences+&%2359%3B+v.+65/tencyclopaedia+of+mathematical+sciences+v+++65/-17,-1,0,B/frameset&F=tencyclopaedia+of+mathematical+sciences+v+++48&1,1 -http://www.sanxia.net/beauty/Nanako/313.htm -http://www.sanxia.net/beauty/Nanako/323.htm -http://mirrortucows.technet.it/winme/adnload/138469_29790.html -http://www.fogdog.com/cedroID/ssd3040183321970/nav/stores/walking/ -http://www.fogdog.com/cedroID/ssd3040183321970/customer_service/employment.html -http://mirror.pku.edu.cn/www.berkeley.edu/ls.berkeley.edu/lscr/services/backups/UCBackup.html -http://retailer.gocollect.com/do/session/1912804/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/postcards/index.asp -http://www.uni-duesseldorf.de/ftp/pf/share/ddd-1.4d/man/man1/?M=A -http://www.uni-duesseldorf.de/ftp/pf/share/ddd-1.4d/man/man1/?S=A -http://javatest.a-net.nl/servlet/pedit.Main/http://www.zdnet.com/special/stories/wireless/0,10676,2557092-8,00.html -http://ftp.sunet.se/pub/os/FreeBSD/development/FreeBSD-CVS/ports/archivers/makeself/ -http://www.jamba.nl/KNet/_KNet-QYL8j1-2D4-pw4k/browse.nl/node.0/cde7f1uou -http://www.discoveromaha.com/shared/health/adam/ency/imagepage/1090.000233.html -http://home.dqt.com.cn/cgi-bin/push/setluntan?luntan=64 -http://sjsulib1.sjsu.edu:81/search/dbusiness+periodicals/-5,-1,1,B/frameset&dbusiness+vocational+guidance&2,,3 -http://www-d0.fnal.gov/d0dist/dist/releases/psim01.01.00/cft_tuple/VERSION -http://pub3.ezboard.com/fmcdonaldscollectorsclubauctions.subscribeUnregisteredToTopic?topicID=136.topic -http://shopping.lycos.co.kr/cgi-bin/LCWB.cgi/957424027/957522583/Catalog/1301/001 -http://www.cs.kuleuven.ac.be/~java/docs/jdk1.3/docs/api/java/sql/class-use/DriverPropertyInfo.html -http://www.buybuddy.com/sleuth/27/1/1060701/505427/ -http://web4.sportsline.com/u/football/nfl/players/splits/4451_split.htm -http://mirror.cc.utsunomiya-u.ac.jp/mirror/FreeBSD/ports/alpha/packages-5-current/japanese/?M=A -http://no.egroups.com/login.cgi?login_target=%2Fgroup%2Ftkd-full -http://www.bemi-immobilien.de/Ferien-IB/Startseite/Gemeinsam/MarketingStrategie/Gemeinsam/immolink/Gemeinsam/3d-service/Startseite/www.ferien-immobilien.de/ferien-ib/startseite/Gemeinsam/MarketingStrategie/Strategie.htm -http://www.bemi-immobilien.de/Ferien-IB/Startseite/Gemeinsam/MarketingStrategie/Gemeinsam/immolink/Gemeinsam/3d-service/Startseite/www.ferien-immobilien.de/ferien-ib/startseite/Gemeinsam/versicherungen/gebaeude/deckungsumfang.htm -http://www.3wposter.com/czaja/czj2002.htm -http://pub19.ezboard.com/fallamericanbaseballleagueplayersneeded.showMessage?topicID=6.topic -http://ftp.uni-mannheim.de/info/OReilly/nutshell/practcpp/disk/doit/?N=D -http://www02.geocities.co.jp/HeartLand-Kaede/4970/index2.htm -http://www.selbstmachen.de/shops/pop/infotext/8008.htm -http://dennou-t.ms.u-tokyo.ac.jp/arch/cc-env/Linux/debian-jp/dists/unstable/contrib-jp/binary-alpha/doc/?D=A -http://genforum.genealogy.com/cgi-genforum/forums/flynn.cgi?1004 -http://www.iwon.com/home/movies/movies_filmography_page/0,13178,Marguerite+Hickey,00.html -http://cometweb01.comet.co.uk/do!tid=20&rtid=2&vsid=700&session=132028&mid=1000&rid=1060&cid=37030&chid=1713&url=eqqLmwlGltt5tkZHljbLqkZHlkrHhlZHdfjKYfkLlkZ5ljjLboZLbplG5ubLZDXLZolLl3l5jbqLlci5XqVLkXsLkao4tloHbmlLoq5 -http://www.kfi640.com/shared/mod_perl/looksmart/looksmart/eus1/eus65300/eus65303/eus77824/eus541028/eus168664/ -http://user.chollian.net/~iipuni/pds1/?M=A -http://tucows.ciaoweb.it/winnt/adnload/73935_29937.html -http://home2.keyciti.com/x2001/ -http://www.amateurplatinum.com/teenagerclique/fagbodyshots/elbow-greaseac/plus-sizemen/butt-fuckpartner/actionextreme/hitting-itendurance.html -http://oss.sgi.com/cgi-bin/cvsweb.cgi/linux-2.3-4/linux/Documentation/filesystems/vfs.txt?only_with_tag=LINUX-2_3_99_pre4 -http://oss.sgi.com/cgi-bin/cvsweb.cgi/linux-2.3-4/linux/Documentation/filesystems/vfs.txt?only_with_tag=LINUX-2_3_17 -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=3,0+18,0-0,0-3,0 -http://www.skaninforma.no/nord-troendelag/leksvik-h.htm -http://194.128.65.4/pa/cm199798/cmwib/wb971115/nil.htm -http://www.on.fuchu.or.jp/~oimatudo/englishmisomanzyu.htm -http://map.ipc.co.jp/asp/onmap/connect/g-2/a-719/ -http://cherokee1.edgate.com/goucheres/ed_current.html -http://www.online.kokusai.co.jp/Service/V0043594/wrd/G200/service/service.html -http://www.arm.com/sitearchitek/support.ns4/html/cores_faq!OpenDocument&ExpandSection=21,16,7 -http://binary.tucows.com/winnt/adnload/70807_30160.html -http://binary.tucows.com/winnt/adnload/1422_28846.html -http://genforum.genealogy.com/cgi-genforum/forums/theroux.cgi?69 -http://rex.skyline.net/navigate.cgi?news,ice,women,resources,living -http://umweb2.unitedmedia.com/creators/rugrats/archive/rugrats-20001015.html -http://retailer.gocollect.com/do/session/1912824/vsid/2089/tid/2089/cid/621609/mid/1540/rid/1520/chid/2083/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLlmo5larLZqVLafpLmiXLvlmHolaLrZqLpl4/url/http://www.gocollect.com/product_display/products/product_lines.asp -http://retailer.gocollect.com/do/session/1912824/vsid/2089/tid/2089/cid/621609/mid/1540/rid/1520/chid/2083/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLlmo5larLZqVLafpLmiXLvlmHolaLrZqLpl4/url/http://www.gocollect.com/clubhouse/suggestions.asp -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=146&discrim=146,7,19 -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=146&discrim=146,7,231 -http://login.hq.cricinfo.org/link_to_database/ARCHIVE/1996-97/OD_TOURNEYS/SINWS/SINWS-MATCHES/SL_ZIM_SINWS_ODI5_03SEP1996_DAILY_MR.html -http://preview.egroups.com/group/God_Calling -http://www.fogdog.com/cedroID/ssd3040183340945/nav/products/outlet/1b/sunglasses_optics/ -http://www.fogdog.com/cedroID/ssd3040183340945/nav/products/outlet/1c/dc/ -http://www.fogdog.com/cedroID/ssd3040183340945/customer_service/contact_us.html -http://link.fastpartner.com/do/session/600424/vsid/2870/tid/2870/cid/136966/mid/1060/rid/1926/chid/2870/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/itjobbank.php -http://link.fastpartner.com/do/session/600424/vsid/2870/tid/2870/cid/136966/mid/1060/rid/1926/chid/2870/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/index.php -http://pub2.ezboard.com/fteamnexgenforumhelpnexgennexencodestudio.unsubscribeUnregisteredToTopic?topicID=29.topic -http://www02.geocities.co.jp/SiliconValley-PaloAlto/1763/event/ni2k/ni2k.htm -http://yp.gates96.com/7/89/60/35.html -http://yp.gates96.com/7/89/61/4.html -http://yp.gates96.com/7/89/61/38.html -http://yp.gates96.com/7/89/62/80.html -http://yp.gates96.com/7/89/63/8.html -http://yp.gates96.com/7/89/63/16.html -http://yp.gates96.com/7/89/65/10.html -http://yp.gates96.com/7/89/65/42.html -http://yp.gates96.com/7/89/65/54.html -http://yp.gates96.com/7/89/65/88.html -http://yp.gates96.com/7/89/65/98.html -http://yp.gates96.com/7/89/66/26.html -http://yp.gates96.com/7/89/66/55.html -http://yp.gates96.com/7/89/67/28.html -http://yp.gates96.com/7/89/68/67.html -http://yp.gates96.com/7/89/69/63.html -http://yp.gates96.com/7/89/69/73.html -http://www.mediko.de/news/alt.support.eating-disord/19944.html -http://www.mediko.de/news/alt.support.eating-disord/19975.html -http://www13.cplaza.ne.jp/musicnavi/i-mode/id/KICS113.html -http://home.beseen.com/community/alienpilot/AbductionTheory.html -http://www.hausbau-finder.de/festpreis/anbieter/A11/A11_05_eg.htm -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=237&discrim=10,15,200 -http://ftp.eecs.umich.edu/pub/NetBSD/packages/1.3.3/mac68k/kde/ -http://www.leg.wa.gov/pub/rcw%20-%20text/title_49/chapter_028/rcw_49_28_065.txt -http://fi.egroups.com/login.cgi?login_target=%2Fmessages%2Fdfbl%2F77 -http://ring.omp.ad.jp/pub/NetBSD/NetBSD-current/src/sys/arch/sgimips/dev/?D=A -http://retailer.gocollect.com/do/session/1912781/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/postcards/index.asp -http://providenet.tucows.com/win2k/adnload/136128_47180.html -http://providenet.tucows.com/win2k/adnload/38527_29571.html -http://no.egroups.com/dir/1/16/476/32069/32291/104313/293356 -http://www.playease.com/et/beauty/img/lingmuyamei/lmam043.htm -http://202.99.23.201/gb/special/node_484.htm -http://202.99.23.201/gb/special/node_518.htm -http://202.99.23.201/gb/special/node_531.htm -http://ring.jec.ad.jp/archives/NetBSD/NetBSD-current/pkgsrc/fonts/acroread-chsfont/README.html -http://www.gaiax.com/~dengeki/lineb.html?haru_da_pump -http://cafe2.daum.net/Cafe-bin/Bbs.cgi/naturalproductspds/qry/zka/B2-kB27p/qqatt/^ -http://cafe2.daum.net/Cafe-bin/Bbs.cgi/naturalproductspds/qry/zka/B2-kB23t/qqatt/^ -http://cafe2.daum.net/Cafe-bin/Bbs.cgi/naturalproductspds/qry/zka/B2-kB23r/qqatt/^ -http://my.egroups.com/group/uk-mac-dev -http://www.f20.parsimony.net/forum35990/archiv.htm -http://findmail.com/group/Costumers -http://variety.studiostore.com/browse/PEOPLE/b.FAVORITES%20PEOPLE/s.ZaC1r6Q6 -http://www.chinawolf.com/~warson/japan/chichuan/cat/jiangzuo/020.htm -http://www.branchen-vermittler.de/Branchen/Mecklenburg/Mecklenburg_Region_3/Neustrelitz/kopf_neustrelitz.html -http://www.xmission.com/(art,ftp,geek,music,music,caffiene,art,toys,dots,edge,misc,shopping,ftp,places,privacy,geek,cuseeme,apocalypse,people,stuffiuse,places,privacy,stuffiuse)/~bill/links.html -http://www.cs.helsinki.fi/linux/linux-kernel/Year-1999/1999-49/1283.html -http://www.ecotec.co.jp/view/arc/f/free/33/umcotk/zxlqox.html -http://www.ecotec.co.jp/view/arc/f/free/33/tgiotk/uftfwm.html -http://www.ecotec.co.jp/view/arc/f/free/33/purotk/qxxotk.html -http://www.ecotec.co.jp/view/arc/f/free/33/purotk/sewotk.html -http://www.ecotec.co.jp/view/arc/f/free/33/purotk/sjkfwm.html -http://www.ecotec.co.jp/view/arc/f/free/33/hazfwm/llhetk.html -http://www.ecotec.co.jp/view/arc/f/free/33/bvtctk/eptrik.html -http://www.ecotec.co.jp/view/arc/f/free/33/rvkptk/syurzz.html -http://library.cuhk.edu.hk/search*chi/a��頦��哨蕭嚙賢��鞈�嚙踝���+1934-/a{214b33}{213021}{214451}+1934/-5,-1,0,B/frameset&F=a{214b33}{213021}{213c63}&6,,7 -http://mitglied.tripod.de/~haubentaucher/bilder.htm -http://amc.hollywood.com/maltin/v/valleyofthekings-1954.htm -http://amc.hollywood.com/maltin/v/vannuysblvd-1979.htm -http://amc.hollywood.com/maltin/v/venicevenice-1992.htm -http://amc.hollywood.com/maltin/v/vicesquad-1931.htm -http://amc.hollywood.com/maltin/v/violette-1978.htm -http://amc.hollywood.com/maltin/v/voiceofthewhistler-1945.htm -http://amc.hollywood.com/maltin/v/vulturethe-1967.htm -http://members.tripod.co.jp/hatahata/hikoki/?D=A -http://kernel2.adver.com.tw/Counter/log/kernel2.adver.com.tw/SaveCounter/2000-10-23/07/972255822718.txt -http://www.mapion.co.jp/custom/AOL/admi/23/23105/matsubaracho/5chome/index-43.html -http://search.chollian.net/cgi-bin/filter.cgi?cid=1109&g=11 -http://search.chollian.net/cgi-bin/filter.cgi?cid=1109&p=5 -http://www.linux.com/networking/network/new/website/applications/business/ -http://www.fogdog.com/cedroID/ssd3040183313598/nav/products/w_golf/1s/ball_retrievers/ -http://www.fogdog.com/cedroID/ssd3040183313598/nav/products/w_golf/1t/biographical_books/ -http://rammstein.sonicnet.com/artists/news/1090.jhtml -http://rammstein.sonicnet.com/allmusic/ai_bio.jhtml?ai_id=1090 -http://www.ycwb.com.cn/gb/2000/08/18/ycwb/gnxw/7.html -http://www.vorlesungen.uni-osnabrueck.de/informatik/c98/code/19/?D=A -http://kernel2.adver.com.tw/Counter/log/kernel2.adver.com.tw/SaveCounter/2000-10-23/11/972270515716.txt -http://www.affiliate.hpstore.hp.co.uk/do/session/380869/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/entry1.asp -http://uk.biz.yahoo.com/mutual_funds/micropal/lf/fund/008776/properf.html -http://troy.lib.sfu.ca/search/aasociacion+argentina+de+ciencias+naturales/aasociacion+argentina+de+ciencias+naturales/-5,-1,0,E/frameset&F=aasociacion+argentina+de+ciencias+naturales&1,,0 -http://uk.dir.yahoo.com/Regional/U_S__States/Virginia/Metropolitan_Areas/Charlottesville_Metro/Travel_and_Transportation/Accommodation/Caravan_Parks_and_Camp_Sites/ -http://uk.dir.yahoo.com/Regional/U_S__States/Virginia/Metropolitan_Areas/Charlottesville_Metro/Travel_and_Transportation/Accommodation/Hotels/ -http://library.cwu.edu/search/cQA76.73.A35+T75/cqa+++76.73+a35+t75/-5,-1,0,B/marc&F=cqa+++76.73+a8+j33+1985&1,1, -http://www.tages-anzeiger.ch/sport/nagano/0902/olymp_art4.htm -http://finance.sina.com.cn/globe/globe/2000-03-16/23725.html -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=9,3-9,0+0,1-0,3 -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=9,3-9,0+0,1-9,3 -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=9,3-9,0+0,1-19,0 -http://temps-libre.promovacances.net/D02/BH/BDANE/voyagealacarte.htm -http://sunsite.org.uk/public/computing/networks/internet/ietf/98aug/imapext-attendees-98aug.txt -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=124&discrim=221,178 -http://cpan.nettuno.it/authors/Ilya_Zakharevich/modules/FreezeThaw-0.41.readme -http://cpan.nettuno.it/authors/Ilya_Zakharevich/modules/Math-Pari-2.001700.readme -http://ricoh.co.jp/SHOGI/emate/tanigawa/tume0069a.html -http://troy.lib.sfu.ca/search/dlatin+america+periodicals/dlatin+america+periodicals/-5,-1,0,B/marc&F=dlatin+america+pest+control+industry&1,1, -http://moviestore.zap2it.com/browse/MOVIES/COLLECTI/s.w2bwHPkr -http://moviestore.zap2it.com/browse/MOVIES/BUNDLE/s.w2bwHPkr -http://moviestore.zap2it.com/browse/MOVIES/BOWL/s.w2bwHPkr -http://moviestore.zap2it.com/browse/MOVIES/JEWELRY/s.w2bwHPkr -http://moviestore.zap2it.com/browse/MOVIES/COMIC/s.w2bwHPkr -http://www9.hmv.co.uk:5555/do/session/1347801/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/Top_Navigation_Bar/top_banner.html -http://www3.adobe.com/type/browser/F/P_103/F_FRAK-70005000.html -http://ftp.netc.pt/pub/idgames/levels/doom2/deathmatch/j-l/kewl.txt -http://ftp.netc.pt/pub/idgames/levels/doom2/deathmatch/j-l/ledges-z.txt -http://park.org:8888/Japan/CSK/hyakki/zukan/turezure/ue/c_tirizuka.html -http://pub4.ezboard.com/fscarletstreetfilmmusic.unsubscribeUnregisteredToTopic?topicID=54.topic -http://tucows.niagara.com/win2k/adnload/37364_29149.html -http://wap.jamba.de/KNet/_KNet-JGG8j1-eGd-13cre/showInfo-special1.de/node.0/cde7f1uou -http://www.personalmd.com/news/n0706062122.shtml -http://ds.dial.pipex.com/tmc/ConfPresentations/s2000/NetworkingJ/msconfig.htm -http://calcul.si.uji.es/Programes/SAS/proc/z0325264.htm -http://www.kaos.dk/sexriddle/x/m/k/i/i/ -http://ring.toyama-ix.net/archives/lang/perl/CPAN/clpa/1998-08/?N=D -http://ring.toyama-ix.net/archives/lang/perl/CPAN/clpa/1998-08/?S=A -http://www.spiral.at/Katalog/Artikel/0879070/ -http://homepage1.nifty.com/nao~nao/pages/profile.html -http://www.ferien-immobilien.de/friesland/verkauf/Gemeinsam/Inserieren/Allgemeine-IB/3d-service/Allgemeine-IB/Startseite/ -http://www.ferien-immobilien.de/friesland/verkauf/Gemeinsam/Inserieren/Allgemeine-IB/3d-service/Gemeinsam/erreichenPartner/email3d.htm -http://www.thestateofcolorado.com/m1jerepair.html -http://www.legis.state.pa.us/WU01/LI/BI/TI/1989/0/MNTENNIS.HTM -http://www.legis.state.pa.us/WU01/LI/BI/TI/1989/0/MNTRASH.HTM -http://www.shop4magazines.com/pg004752.htm -http://www.shop4magazines.com/pg005070.htm -http://www.shop4magazines.com/pg005084.htm -http://fi.egroups.com/login.cgi?login_target=%2Fmessage%2Fsocalscan%2F5293 -http://www.incestpornstories.com/hot-hardcore-fuckingbanging/bootsfeet-/hitting-itsmacking/{hardcorelink} -http://www.columbia.edu/~mkn12/Nominees.html -http://www.generation-formation.fr/pdetail.htm---o21zAo06Rxo0Ol9A074fo6s0Md6jIHeNHhIeOkn2ApvFFo6s5dfexiWo2W81N3OsPeaR2VeuzlEdRsR3djaPfdNjfco41qrfP6sWd6wuCoz4ZteOgKHekLVSePl8vNhiWhAhcgNAPfVbdsNhJl.htm -http://tiscover.at/1Root/Kontinent/6/Staat/7/Bundesland/20/Ort/212/Sonstige_Sportstaette/276591/Bericht/berw...1.html -http://fi.egroups.com/message/meterreader/207?source=1 -http://polygraph.ircache.net:8181/services/design/http_-2www.arthritis.org/http_-2www.alameda-vcf.org/http_-2www.microsoft.com/ie/ie.htm -http://www.fortunecity.com/lavender/deathrace/251/billy.html -http://ftpsearch.belnet.be/packages/CPAN/modules/by-module/AppleII/?N=D -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=7,34,29,16,25 -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=21,34,29,16,25 -http://www.ftp.uni-erlangen.de/pub/unix/BSD/FreeBSD/FreeBSD-current/ports/irc/tirc/ -http://retailer.gocollect.com/do/session/1912840/vsid/1696/tid/1696/cid/604361/mid/1540/rid/1420/chid/1725/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLlmo5larLZqVLafpLmiXLvlmHolaLrZqLpl4/url/http://www.gocollect.com/company_info/about.asp -http://retailer.gocollect.com/do/session/1912840/vsid/1696/tid/1696/cid/604361/mid/1540/rid/1420/chid/1725/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLlmo5larLZqVLafpLmiXLvlmHolaLrZqLpl4/url/http://www.gocollect.com/company_info/terms_and_conditions.asp -http://businessrecorder.com/story/S0024/S2401/S2401113.htm -http://arabia.com/article/0,1690,Sports|20732,00.html -http://www.worldmedicus.com/servlet/Controller/$7006041629a50000.sj_viewa/ -http://myhome.naver.com/chocobini/company.html -http://builder.hw.net/frmMessageFront/1,1079,'1~21~0~8~1~2348~9590',00.html -http://pub1.ezboard.com/fcrossstitchcorner504212000shepherdsbushretreat.showAddReplyScreenFromWeb?topicID=48.topic&index=5 -http://www.parisnights.de/fanfiction/archive/authors/andrews/stories/bright.htm -http://198.103.152.100/search*frc/cCA1+MPR+NS51+98Y25/cca1+mpr+ns51+98y25/7,-1,0,E/2browse -http://www.kfi640.com/shared/mod_perl/looksmart/looksmart/eus1/eus51605/eus147927/eus269761/eus269920/eus918452/ -http://www.kfi640.com/shared/mod_perl/looksmart/looksmart/eus1/eus51605/eus147927/eus269761/eus269920/eus918493/ -http://www.computing.net/cgi-bin/report.pl/windows95/wwwboard/forum/3119.html|21 -http://www.kiarchive.ru:8093/pub/misc/books/Camelot/Vasilyev/Forgotten_Road/ -http://yp.gates96.com/4/9/50/30.html -http://yp.gates96.com/4/9/51/1.html -http://yp.gates96.com/4/9/51/88.html -http://yp.gates96.com/4/9/51/92.html -http://yp.gates96.com/4/9/52/3.html -http://yp.gates96.com/4/9/52/53.html -http://yp.gates96.com/4/9/52/67.html -http://yp.gates96.com/4/9/53/25.html -http://yp.gates96.com/4/9/53/50.html -http://yp.gates96.com/4/9/53/96.html -http://yp.gates96.com/4/9/54/40.html -http://yp.gates96.com/4/9/54/57.html -http://yp.gates96.com/4/9/54/77.html -http://yp.gates96.com/4/9/55/57.html -http://yp.gates96.com/4/9/55/71.html -http://yp.gates96.com/4/9/56/1.html -http://yp.gates96.com/4/9/56/98.html -http://yp.gates96.com/4/9/57/6.html -http://yp.gates96.com/4/9/57/90.html -http://yp.gates96.com/4/9/58/91.html -http://yp.gates96.com/4/9/58/96.html -http://yp.gates96.com/4/9/59/29.html -http://yp.gates96.com/4/9/59/33.html -http://yp.gates96.com/4/9/59/84.html -http://yp.gates96.com/4/9/59/97.html -http://mayu.sourceforge.net/cgi-bin/nph-ml.cgi/000/http/www.geocrawler.com/archives/3/151/1997/5/0/900308/ -http://www2.odn.ne.jp/~cao20970/affair/oh/ha-342 -http://www2.odn.ne.jp/~cao20970/affair/oh/ha-346 -http://wap.jamba.de/KNet/_KNet-lvH8j1-nGd-13d1j/browse.de/node.0/cdzqggtyb -http://www.danielwebster.org//hallofusa/thestampact/HENDRICKFISHER.COM//thestampact/ -http://news.cn.tom.com/maya/cnnav/01/item/2000_09/309490.shtml -http://polygraph.ircache.net:8181/services/design/http_-2www.paducahrotary.org/pbcmap.htm -http://polygraph.ircache.net:8181/services/design/http_-2www.paducahrotary.org/mainpage.htm -http://www.debian.org.cn/Bugs/db/23/23547.html -http://www.debian.org.cn/Bugs/db/54/54172.html -http://www.adetti.iscte.pt/ADETTI/Security/HowTo/Java/jdk1.2.1/docs/guide/beans/spec/beancontext.fm7.html -http://www.users.qwest.net/~campputz/page413.htm -http://flybird.soyou.edu.cn/item/2000-07-31/164671.html -http://www.cognigen.net/corporate/trainers.cgi?full-timer -http://www.babyheirlooms.com/catalog/htmlos.cat/041143.1.1156359481 -http://ramdam.com/art/k/katerine.htm -http://ramdam.com/art/k/krapulax.htm -http://aleph.tau.ac.il:4501/ALEPH/eng/ATA/AAM/AAM/SET-MAIL///1249009 -http://online.linux.tucows.com/conhtml/adnload/8973_2294.html -http://www.arrakis.es/~lady_cel/frcontenf.htm -http://online.linux.tucows.com/conhtml/adnload/39034_1349.html -http://online.linux.tucows.com/conhtml/adnload/51651_2248.html -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=23,0+14,0-13,0-13,0 -http://www.ferien-immobilien.de/Westerwald/verkauf/GmbH-Kauf-Verkauf-Insolvenz-konkurs/Startseite/Gemeinsam/Inserieren/Private-IB/Gemeinsam/suche.htm -http://www.linux.com/networking/network/it/alternative/developers/Apple/ -http://www.sanxia.net/beauty/Nanako/418.htm -http://www-usa8.cricket.org/link_to_database/ARCHIVE/1999-2000/OTHERS+ICC/NORTHANTS_IN_WI/ARTICLES/ -http://gds.cc.va.us:8888/Mcn%3dMELISSA%20BACK,%20ou%3dSV.CC.VA.US,%20ou%3dFaculty%20%26%20Staff,%20o%3dvccs,%20c%3dUS -http://www.allgemeine-immobilien-boerse.de/nordrhein-Westfalen/luedinghausen/Verkauf/Ferien-IB/Startseite/Gemeinsam/erreichenPartner/Versteigerungen-IB/Startseite/IIM-Teil/Startseite/froben.htm -http://198.103.152.100/search*frc/dIndustrial+relations+--+Germany+(West)+--+History/dindustrial+relations+germany+west+history/-5,-1,0,B/frameset&F=dindustrial+relations+germany+dictionaries&1,,0 -http://secure.danysoft.com/asp/dany.tienda/892496425/Catalog -http://yp.gates96.com/13/57/90/23.html -http://yp.gates96.com/13/57/90/91.html -http://yp.gates96.com/13/57/91/68.html -http://yp.gates96.com/13/57/92/22.html -http://yp.gates96.com/13/57/92/49.html -http://yp.gates96.com/13/57/92/73.html -http://yp.gates96.com/13/57/93/75.html -http://yp.gates96.com/13/57/94/16.html -http://yp.gates96.com/13/57/94/62.html -http://yp.gates96.com/13/57/94/99.html -http://yp.gates96.com/13/57/95/19.html -http://yp.gates96.com/13/57/95/34.html -http://yp.gates96.com/13/57/95/84.html -http://yp.gates96.com/13/57/96/22.html -http://yp.gates96.com/13/57/96/24.html -http://yp.gates96.com/13/57/96/52.html -http://yp.gates96.com/13/57/96/70.html -http://yp.gates96.com/13/57/97/39.html -http://yp.gates96.com/13/57/97/55.html -http://yp.gates96.com/13/57/98/4.html -http://yp.gates96.com/13/57/98/41.html -http://yp.gates96.com/13/57/98/58.html -http://yp.gates96.com/13/57/98/98.html -http://yp.gates96.com/13/57/98/99.html -http://yp.gates96.com/13/57/99/79.html -http://carriage.de/Schoner/Info-d/history/literature/literature/ -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/lit/lit/computers/misc/unitest/misc/computers/programs/simple/simple.html -http://kwic.tucows.com/partners/flyswat/get_acx.html -http://sp201.unige.ch:49213/cxxdoc/ioc/concepts/c2g2rcsm.htm -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=0,2-0,1-21,0+9,1 -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=237&discrim=10,2,183 -http://firstweb.tucows.com/win2k/adnload/58783_28760.html -http://www.boerseninfos.de/dynamic/ak/mk/news/719350-20000830-104827.html -http://baseball.mainichi.co.jp/life/family/syuppan/wakaru/wakaru-j/10/01/01.html -http://helios.nlib.ee/search*est/dsÃĩjalised+blokid/dsw~ajalised+blokid/-5,-1,0,B/exact&F=dsw~ajalised+konfliktid&1,58/limit -http://helios.nlib.ee/search*est/dsÃĩjalised+blokid/dsw~ajalised+blokid/-5,-1,0,B/frameset&F=dsw~ajalised+konfliktid&11,,58 -http://lexicon.linux.tucows.com/conhtml/adnload/8642_2088.html -http://ua.php.net/manual/es/function.pg-fieldisnull.php -http://www.babyheirlooms.com/catalog/htmlos.cat/041132.1.4352706945 -http://www.civila.com/guitar/chat/desenredada/juegos/ -http://sunsite.org.uk/public/pub/packages/info-mac/pilot/?N=D -http://www.aelita.net/products/products/support/news/Reg/Subscribe/company/contact/default.htm -http://cn.egroups.com/message/newsclips/295 -http://www.jornada.unam.mx/2000/sep00/000922/oriente-y.htm -http://members.tripod.co.jp/mosokke/dubair01ghe.html -http://202.99.23.245/zdxw/21/20000217/200002172112.html -http://link.fastpartner.com/do/session/600412/vsid/2870/tid/2870/cid/136966/mid/1060/rid/1926/chid/2870/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/speednames.php -http://link.fastpartner.com/do/session/600412/vsid/2870/tid/2870/cid/136966/mid/1060/rid/1926/chid/2870/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/nordicliving.php -http://link.fastpartner.com/do/session/600412/vsid/2870/tid/2870/cid/136966/mid/1060/rid/1926/chid/2870/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/local/redirect.php -http://iant.subportal.com/sn/Utilities/System_Maintenance_and_Repair_Utilities/2128.html -http://polygraph.ircache.net:8181/client/http_-2www.scubaring.com/http_-2www.aaainvestments.com/http_-2www.primenet.com/~stmmoon/stmbik.html -http://itcareers.careercast.com/texis/it/itjs/+wwwBme89D86qxwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewGtmoBGnaqdGpdGwBodDanDtoDnnGaMw55wqr15nBB5aoDhdGMwBodDa5nq1GoBOaDnBidGAapGdBdqdc5aGn31oGnmanLpnGonDqnaMFqhTfR20DzmehrwwwpBme26D86eSqwww5rmePdwwwBrmeZpwww/morelike.html -http://itcareers.careercast.com/texis/it/itjs/+awwBme3AT+6ezqwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewGtmoBGnaqdGpdGwBodDanDtoDnnGaMw55wqr15nBB5aoDhdGMwBodDa5nq1GoBOaDnBidGAapGdBdqdc5aGn31oGnmanLpnGonDqnaMFqhTfR20DzmehrwwwpBme26D86eSqwww5rmeEdwwwBrmeZpwww/jobpage.html -http://itcareers.careercast.com/texis/it/itjs/+vwwBme26D86eSqwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewGtmoBGnaqdGpdGwBodDanDtoDnnGaMw55wqr15nBB5aoDhdGMwBodDa5nq1GoBOaDnBidGAapGdBdqdc5aGn31oGnmanLpnGonDqnaMFqhTfR20DzmehrwwwpBme26D86eSqwwwGzmwwww5rmeEdwwwBrmeZpwww/morelike.html -http://www.starcities.com/usa/ca/carlsbad/ -http://www.3w-geschichten.de/PlumptreGeorge/PlumptreGeorge1857938461.htm -http://residence.educities.edu.tw/goyen/ -http://polygraph.ircache.net:8181/http_-2www.whowhere.com/http_-2www.primenet.com/~mmfact/http_-2www.microsoft.com/ie/download/ -http://polygraph.ircache.net:8181/http_-2www.whowhere.com/http_-2www.primenet.com/~mmfact/http_-2www.infohwy.com/odframes.html -http://www.linux.com/networking/network/management/industry/internet/services/ -http://cn.egroups.com/message/ruosulista/1176 -http://ftp.jp.debian.org/debian/dists/unstable/main/binary-i386/tex/?M=A -http://de.excite.de/bildung/katalog/17722 -http://de.excite.de/bildung/katalog/17893 -http://de.excite.de/bildung/katalog/17879 -http://www.emerchandise.com/browse/BUFFYTHEVAMP/PIN/b.TV%20BUFFYTHEVAMP/s.Xpiu5LCZ -http://variety.studiostore.com/browse/VARIETY/CAMERA/s.dmZspziz -http://carriage.de/Schoner/Sammlungen/models/info-e/Info-d/ -http://www.gazeta.com/Iso/Plus/Kraj/Prezyden/Ak/700kwa.html -http://www.linux.com/networking/network/networking/developers/operating_system/Debian/ -http://online.linux.tucows.com/conhtml/adnload/8808_32695.html -http://149.221.91.10/news/lokales/wermelskirchen/ -http://opac.lib.rpi.edu/search/avirgin+vision+limited/7,-1,0,B/frameset&avirginia+cooperative+fisheries+research+unit&1,1 -http://www.emerchandise.com/browse/DISNEY-FAM/ACTIONFI/b.FAVORITES%20KIDSSTUFF%20DISNEY-FAM/s.erm2bF5K -http://polit.kulichki.net/moshkow/PXESY/GORIN/ -http://polit.kulichki.net/moshkow/COPYRIGHT/stolyarov.txt -http://www.science.uva.nl/pub/NetBSD/NetBSD-current/pkgsrc/textproc/rman/pkg/DESCR -http://cgi.www.4tourism.com/uk/wareham65426.html -http://cgi.www.4tourism.com/uk/wareham22477.html -http://www.ccnet.com/affif/_themes/sumipntg/_vti_cnf/?M=A -http://web.tin.it/regionesardegna/ital/lavpubb/bandi_contratti/schema5_1q.htm -http://ring.htcn.ne.jp/archives/text/CTAN/macros/latex/contrib/other/apa/ -http://ftpsearch.belnet.be/packages/CPAN/modules/by-module/Callback/Callback-1.02.readme -http://iant.subportal.com/sn/Utilities/Misc__Utilities/12800.html -http://yp.gates96.com/2/51/0/86.html -http://yp.gates96.com/2/51/1/72.html -http://yp.gates96.com/2/51/2/10.html -http://yp.gates96.com/2/51/3/7.html -http://yp.gates96.com/2/51/3/50.html -http://yp.gates96.com/2/51/4/90.html -http://yp.gates96.com/2/51/5/6.html -http://yp.gates96.com/2/51/5/42.html -http://yp.gates96.com/2/51/5/50.html -http://yp.gates96.com/2/51/6/49.html -http://yp.gates96.com/2/51/8/12.html -http://yp.gates96.com/2/51/8/50.html -http://yp.gates96.com/2/51/9/82.html -http://yp.gates96.com/2/51/9/94.html -http://archive.soccerage.com/s/fr/09/37602.html -http://archive.soccerage.com/s/fr/09/39203.html -http://ftp.ring.gr.jp/archives/NetBSD/NetBSD-1.4.1/pmax/binary/security/ -http://www.yorosiku.net:8080/-_-http://www.us-japan.org/otr/ -http://support.dell.com/docs/storage/dlt1/ug/sp/jumpers.htm -http://moviestore.zap2it.com/browse/MOVIES/MOUSEPAD/s.uiIfdEiW -http://moviestore.zap2it.com/browse/MOVIES/STANDUP/s.uiIfdEiW -http://focusin.ads.targetnet.com/ad/id=animeart&opt=cin&cv=210&uid=972942857 -http://www.emerchandise.com/browse/SATNIGHTLIVE/SWEATSHI/s.pJ2FFfba -http://www.realize.com/p5dee81.htm,qt=e784fe2f=2a38a234-e-1ade986-0-0-0-3-- -http://support.tandy.com/support_audio/doc30/30780.htm -http://sun1.rrzn-user.uni-hannover.de/jgaertner/matlab/help/techdoc/umg/chlabel2.html -http://sun1.rrzn-user.uni-hannover.de/jgaertner/matlab/help/techdoc/umg/chprin12.html -http://www.es.co.nz/~rotary.home.html -http://www.excelsior.com.mx/9802/980217/nac18.html -http://dante.bdp.it/cgi-bin/poseidon_v2.0/reflect/poseidon/disc/biblioteca1/1316779952/prevarticle -http://dennou-t.ms.u-tokyo.ac.jp/arch/cc-env/Linux/debian-jp/dists/stable/non-free-jp/binary-alpha/net/?D=A -http://guest/forestpatholog/diseases/annosus.html -http://guest/forestpatholog/diseases/rot.html -http://no.egroups.com/message/readbygrade3/2029 -http://www.cybercd.de/artist/Fabri,+Stafke.htm -http://www.jamba.de/KNet/_KNet-zQG8j1-hGd-13cwi/admLogin.de/node.0/cenv0b09a -http://www.digitaldrucke.de/(aktuell,computer,marktplatz,sense,tausch)/_fort/html/themen/computer/computer.htm -http://ring.tains.tohoku.ac.jp/pub/linux/debian/debian-jp/dists/potato/contrib-jp/source/news/?S=A -http://strategis.ic.gc.ca/sc_indps/recboats/frndoc/3g.html -http://ftp.eq.uc.pt/software/unix/Linux/redhat/redhat-6.2/i386/doc/gsg/figs/rpmlite/?M=A -http://www.judds-resort.com/judds/Lake-Winni-pike-lodge/upload/upload/photo/fallphoto/boat/12.html -http://ftp.eecs.umich.edu/.7/NetBSD/NetBSD-current/src/usr.sbin/cnwctl/ -http://ftp.eecs.umich.edu/.7/NetBSD/NetBSD-current/src/usr.sbin/mailwrapper/ -http://ftp.eecs.umich.edu/.7/NetBSD/NetBSD-current/src/usr.sbin/traceroute6/ -http://ftp.eecs.umich.edu/.7/NetBSD/NetBSD-current/src/usr.sbin/yppoll/ -http://pelit.saunalahti.fi/.3/linuxberg/conhtml/preview/8785.html -http://www.asahi-net.or.jp/~rz3n-snd/kitakan/kamiyosida.html -http://www.chaos.dk/sexriddle/s/e/x/q/x/k/l/ -http://www.chaos.dk/sexriddle/s/e/x/q/x/k/y/ -http://ring.jec.ad.jp/archives/text/CTAN/dviware/umddvi/libcompat/?S=A -http://seniorfriendfinder.com/cgi-bin/w3com/pws/ffsenior/OCtIhwK0_lecIJU9yN87J4DTFWqXdztVO8nfP1zxdwq79fkod_IhHN3-iHbCrlaXZ5ATMMc_Gb5Zt_RdtVOloKJ1Z7DGqz2vE9vOjESyOqryETO-lNa0NWtCoTJH_QGCfq7ss5VGa1MO3iLryKZ2gIVI_Lonfx_bC9m7 -http://seniorfriendfinder.com/cgi-bin/w3com/pws/ffsenior/D-tI2p4N__5TTgffRqVzdrKNYFZc3jj2Oatw29gt_YiNBPXUlYZaTA2ndP2CrwlrdiMS8YzPKxDR7Vp4ZBqD3d5o3MwYrYIxk31YsVtP3yFS2bLdZcBGLKdyNUc9yYgvGsGMXAMcEAUJPjtRqUVzDpuhHzS6V_U76I6G -http://my.egroups.com/subscribe/enemapix -http://yp.gates96.com/0/23/40/60.html -http://yp.gates96.com/0/23/40/82.html -http://yp.gates96.com/0/23/41/67.html -http://yp.gates96.com/0/23/43/71.html -http://yp.gates96.com/0/23/43/75.html -http://yp.gates96.com/0/23/44/64.html -http://yp.gates96.com/0/23/44/73.html -http://yp.gates96.com/0/23/44/84.html -http://yp.gates96.com/0/23/45/19.html -http://yp.gates96.com/0/23/46/9.html -http://yp.gates96.com/0/23/46/26.html -http://yp.gates96.com/0/23/46/37.html -http://yp.gates96.com/0/23/46/92.html -http://yp.gates96.com/0/23/47/39.html -http://yp.gates96.com/0/23/47/52.html -http://yp.gates96.com/0/23/48/52.html -http://yp.gates96.com/0/23/49/12.html -http://yp.gates96.com/0/23/49/90.html -http://retailer.gocollect.com/do/session/1912812/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/help/index.asp -http://retailer.gocollect.com/do/session/1912812/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/sports/index.asp -http://203.93.50.148:2222/*0110http://www.snweb.com/gb/people_daily/2000/10/20/i1020004.htm -http://cn.egroups.com/messages/romtrade/5024 -http://members.tripod.co.jp/medo/_private/ -http://dbc.copystar.com.tw/DelphiChat/200001/msg0325.htm -http://tucows.pi.be/winnt/diskcnt_license.html -http://millennium.fortunecity.com/ruthven/144/5041.htm -http://news.pchome.com.tw/ttv/finance/20000616/ -http://library.bangor.ac.uk/search/dEcology+--+Poland+--+Periodicals/decology+poland+periodicals/-17,-1,0,B/frameset&F=decology+north+america+congresses&1,1 -http://www.could.be/travel/north_america/united_states/lodge_2.htm -http://genforum.genealogy.com/cgi-bin/print.cgi?huntington::195.html -http://www.bemi-immobilien.de/Ferien-IB/Startseite/Gemeinsam/immolink/Gemeinsam/MarketingStrategie/Gemeinsam/erreichenPartner/Gemeinsam/3d-service/Top-Darlehens-Konditionen/anforderungsformular.htm -http://members.tripod.co.jp/snowmen/?D=A -http://ftp.unicamp.br/pub/FAQ/sf/alt_history/part6 -http://www.affiliate.hpstore.hp.co.uk/do/session/380884/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/REGISTRATION/entry.asp -http://grid9.linux.tucows.com/x11html/adnload/9444_3744.html -http://www.linux.com/networking/network/communications/tools/web/support/ -http://www.linux.com/networking/network/communications/tools/web/alternative/ -http://cometweb01.comet.co.uk/do!tid=20&rtid=1&vsid=700&session=132030&mid=1000&rid=1060&cid=37030&chid=1713&url=eqqLmwlGltt5tkZHljbLqkZHlkrHhlZHdfjKYfkLlkZ5ljjLboZLbplGGolLarZLq4fLpmiLXv-KmooLckYLoznGmpq0qsc0mojLbkYLozvGotc0ZdoLckYLozvGsmv0qmc0jXfLkVZLdocLkYoLzcj1XfkLVZXLqkXLjbzKcob5qroLkVrLoizKlZd5fjYHfklKkZlLjjbLoZbLpl51ubZLDXZLollK3ljLbqlKjXfLkkaHotl4obmLloqL -http://yp.gates96.com/14/77/20/1.html -http://yp.gates96.com/14/77/20/3.html -http://yp.gates96.com/14/77/20/32.html -http://yp.gates96.com/14/77/20/55.html -http://yp.gates96.com/14/77/21/7.html -http://yp.gates96.com/14/77/22/20.html -http://yp.gates96.com/14/77/22/26.html -http://yp.gates96.com/14/77/22/50.html -http://yp.gates96.com/14/77/23/63.html -http://yp.gates96.com/14/77/23/96.html -http://yp.gates96.com/14/77/25/53.html -http://yp.gates96.com/14/77/26/8.html -http://yp.gates96.com/14/77/26/32.html -http://yp.gates96.com/14/77/27/0.html -http://yp.gates96.com/14/77/27/55.html -http://yp.gates96.com/14/77/27/78.html -http://yp.gates96.com/14/77/28/8.html -http://yp.gates96.com/14/77/28/53.html -http://yp.gates96.com/14/77/28/57.html -http://yp.gates96.com/14/77/28/99.html -http://yp.gates96.com/14/77/29/96.html -http://mirror.nucba.ac.jp/mirror/FreeBSD/FreeBSD-stable/ports/cad/xcircuit/files/?D=A -http://pub3.ezboard.com/BBSForum.showForumSearch?boardName=jenxforum&forumName=jenxforumfrm0 -http://genforum.genealogy.com/cgi-genforum/forums/hi.cgi?415 -http://elib.zib.de/pub/opt-net/msc/msc-90-xx/90c15/v93w20n4 -http://biblio.cesga.es:81/search*gag/aDittrich,+Stefan/adittrich+stefan/-5,-1,0,E/frameset&F=adittman+richard+h+coaut&1,,0 -http://biblio.cesga.es:81/search*gag/aDittrich,+Stefan/adittrich+stefan/-5,-1,0,E/frameset&F=adittmar+jorge&1,1 -http://biblio.cesga.es:81/search*gag/aDittrich,+Stefan/adittrich+stefan/-5,-1,0,E/exact&F=adivis+jan&1,4 -http://www.doc.ic.ac.uk/~gwsb98/bucket/Wine-20001026/etc/?D=A -http://news.fm365.com/xinwen/guoji/20000531/72641.htm -http://www.newquestcity.com/templates/eventout.cfm?nqc=TN0730 -http://www.rhena.de/kempinsk1.htm -http://www.jamba.de/KNet/_KNet-tkL8j1-PGd-13dss/showInfo-wir.de/node.0/cenvd8eze -http://www.jamba.de/KNet/_KNet-tkL8j1-PGd-13dsv/browse.de/node.0/ceo0fdeye -http://cpan.nitco.com/modules/by-module/String/BLCKSMTH/?N=D -http://www.digitaldrucke.de/(hilfe,nuernberg)/_fort/html/themen/computer/soft/links/intuit.htm -http://www.jeunesdocteurs.com/fplr/56/08.html -http://simf1.tripod.com/Rio.htm -http://www.mirror.kiev.ua:8083/paper/1998/17/1251/people.htm -http://web2.sportsline.com/u/baseball/mlb/2000PO_stats/tpSTLw.htm -http://www15.freeweb.ne.jp/art/charukun/yusuke.htm -http://map.ipc.co.jp/asp/onmap/r/new/g-24/f-905972/ -http://www.affiliate.hpstore.hp.co.uk/do/session/380882/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/REGISTRATION/entry.asp -http://www.webcrawler.com/education/arts_and_humanities/visual_arts/art_history/c19th/arts_and_crafts/mackintosh_cr/structures/ -http://polygraph.ircache.net:8181/wwwboard/http_-2www.microsoft.com/msoffice/frontpage/http_-2www.linkstar.com/home/partners/marketlink-international-inc -http://polygraph.ircache.net:8181/wwwboard/http_-2www.microsoft.com/msoffice/frontpage/ECA2.htm -http://polygraph.ircache.net:8181/wwwboard/http_-2www.microsoft.com/msoffice/frontpage/http_-2www.intac.com/~dversch/catalog.html -http://excite.de.netscape.com/kunst/katalog/24315 -http://www.outpersonals.com/cgi-bin/w3com/pws/out/KhhIzVYqtXJlJzGPqrqzbJbUw7ERB8P7PSm9mTaj3BkJF6tLfllGlz2yKgLweoM1LPKLdHjjKv8zfb9tb2yojpTmzt6264ZE3V9vWzxY1mZnhDOG1vlwPrnwH5OCJM6C98fbjgZX66II -http://mirror.nucba.ac.jp/mirror/Netscape/netscape6/french/6_PR2/windows/win32/?S=A -http://www.linux.com/networking/server/install/howto/red_hat/package/ -http://www.nissan.co.jp/RENAULT-DEALERS/PASSPORT/view.cgi/proof/972959618-- -http://brain.brent.gov.uk/WebPages.nsf/vWebAllPagesByKey!OpenView&Start=97&Count=60&Expand=152 -http://i-mode.kakiko.com/deaitomo/mag/magurox/1405b.html -http://www.ring.gr.jp/pub/NetBSD/arch/amiga/snapshot/20000115-1.4P/binary/security/ -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=18,0+20,0-17,0-0,0 -http://us.mandrakesoft.com/cgi-bin/cvsweb.cgi/www/anoncvs.html?annotate=1.2&sortby=rev -http://ftp.jp.debian.org/debian/dists/woody/non-free/binary-sh/hamradio/?M=A -http://netscape.complete-skier.com/resorts/survey/submit.asp?ResortID=772 -http://nathanael.upi.jussieu.fr/tele6.nsf/autres+centres+de+formations!OpenPage&ExpandSection=9,17,2,16,5,14 -http://www.egroups.com/messages/zingiber/238 -http://www.umr.edu/~rhall/class/sap/sap8/demo.html -http://209.207.239.212/bkindex/c1043/f1202.html -http://se.egroups.com/message/ackmud/104 -http://school.educities.org/card/cug55.html -http://school.educities.org/card/wgl.html -http://school.educities.org/card/a77125.html -http://school.educities.org/card/apple6128.html -http://school.educities.org/card/c369852.html -http://school.educities.org/card/cges4216.html -http://school.educities.org/card/cges6307.html -http://school.educities.org/card/eaa.html -http://school.educities.org/card/f129235832.html -http://school.educities.org/card/g1546.html -http://school.educities.org/card/h223422022.html -http://school.educities.org/card/lemon6112.html -http://school.educities.org/card/st6408.html -http://www.dulux.co.uk/UKRETAIL:1243142410:DFinity.1QJiP4jRACol -http://www.iagora.com/pages/bbaddpost/::bb_id=148:mid=43302:thread_id=8185:parent_id=43302::lang=de -http://www.iagora.com/pages/bbaddpost/::bb_id=148:mid=43431:thread_id=8185:parent_id=43431::lang=de -http://www.egroups.com/message/intelligent_humor/875 -http://club.telepolis.com/klvinbc/fotosb.htm -http://plat.debian.or.jp/debian/dists/woody/non-free/binary-mips/editors/?D=A -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=207&discrim=3,12,63 -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=207&discrim=3,12,237 -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=207&discrim=3,12,120 -http://www.jamba.de/KNet/_KNet-_tJ8j1-AGd-13ddq/browse.de/node.0/cdel3j591 -http://immihelpdownloads.subportal.com/sn/Utilities/System_Analysis_Utilities/2980.html -http://dwp.bigplanet.com/crestinginc/discussion/edit.nhtml -http://dwp.bigplanet.com/crestinginc/discussion/list.nhtml?profile=discussion -http://194.128.65.4/pa/cm199900/cmwib/wb991127/ahead.htm -http://61.128.218.34/book/hhsh/wu/wolongsheng/jiangxue/055.htm -http://gd.cnread.net/cnread1/wgwx/t/tuwen/kxj/035.htm -http://gd.cnread.net/cnread1/wgwx/t/tuwen/kxj/041.htm -http://www.redrocksports.com/sports/webSession/shopper/RR972959743-31143/store/dept-5/department/dept-5/item/50110 -http://www.redrocksports.com/sports/webSession/shopper/RR972959743-31143/store/dept-5/department/dept-5/item/51530 -http://www.redrocksports.com/sports/webSession/shopper/RR972959743-31143/store/dept-5/department/dept-5/item/51510 -http://www.yorku.ca/org/yusa/who99/wh02.html -http://www1.onelist.com/message/ar8200/3350 -http://www.kodak.se/US/en/corp/features/kern/jodi/index.shtml -http://cafe3.daum.net/Cafe-bin/Bbs.cgi/semtle15pds/rnw/zka/B2-kB27k -http://my.egroups.com/messages/dcfwriters/187?expand=1 -http://link.fastpartner.com/do/session/600414/vsid/1970/tid/1970/cid/135878/mid/1060/rid/1488/chid/1970/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/gosafe.php -http://www.tiscover.com/1Root/Kontinent/6/Staat/7/Bundesland/20/Ort/108147/Bauernhof/315126/Homepage/f_homepage...2.html -http://ring.omp.ad.jp/archives/NetBSD/packages/pkgsrc/net/gnut/patches/?D=A -http://www.mtranslations.cz/40/cs/dictionary/dictionary_index.html -http://pub10.ezboard.com/BBSSystem.handleLoginCheck?action=forgotPassword&boardName=alakazamslair -http://tour.stanford.edu/cgi/locate3.prl/139.6/jMtlo -http://www.shopworks.com/index.cfm/action/search/userid/00042DDE-2F63-19FE-9038010B0A0ADCF2 -http://thestar.com/back_issues/ED20001004/life/20000820LFE01_AH-BATH.html -http://thestar.com/back_issues/ED20001004/life/20000818LFE01_LI-DEPRESS.html -http://thestar.com/back_issues/ED20001004/life/20000806LFE01_AH-DAHLIAS.html -http://www.hole.kommune.no/hole/journweb.nsf/7e180336094ef23a412568cd004a5093/466e7592a4c6c7ccc12568e3004402e8!Navigate&To=Prev -http://mailthat.subportal.com/sn/Multimedia_and_Graphics/Graphics_Editors/3752.html -http://www.gbnf.com/genealogy/rockwel4/html/d0014/I6348.HTM -http://www.lookforforestry.com/catalog/FORSALE/FORKLIFT/JCB/930RTFL/ -http://www.espl.org/mearscol/pagendxs/stockley/d1828.htm -http://in.egroups.com/messages/eyecandy/1290 -http://in.egroups.com/message/eyecandy/1264 -http://in.egroups.com/message/eyecandy/1271 -http://www.ferien-immobilien.de/bayern/deggendorf/Verkauf/Exklusiv-IB/Startseite/3d-service/Gemeinsam/Immolink/Gemeinsam/vertriebspartner.htm -http://linux99.inrialpes.fr/linux/RPM/redhat/6.2/i386/Distribs.html -http://students.lsu.edu/students/main.nsf/Pages/CSISAJ1!OpenDocument&ExpandSection=4,13,11,10 -http://www.doc.ic.ac.uk/lab/labsrc_area/firstyear/submissions/1997-98/jmc1/labs/Ex04/jwb97/?S=A -http://www.iabusnet.org:90/forums/aca-1/dispatch.exe/survey/folderFrame/100001/0/alpha/2509069 -http://www.scifi.com/bboard/browse.cgi/1/5/545?lnum=4223 -http://www.fogdog.com/cedroID/ssd3040183304719/customer_service/ -http://www.fogdog.com/cedroID/ssd3040183304719/nav/products/winter_sports/1b/suits/ -http://www.gpul.org/ftp/lang/java/JDK/jdk1.1.6-docs/api/java.lang.Math.html -http://www.gpul.org/ftp/lang/java/JDK/jdk1.1.6-docs/api/java.lang.IncompatibleClassChangeError.html -http://www.staroriental.net/nav/soeg/ihf,aai,n2,418,Electric+Wave+Girl+1998.html -http://www.parentsplace.com/expert/lactation/basics/qa/0,3459,5757,00.html -http://www.francetrade.fr/opcvm/details/4/44200.html -http://www.francetrade.fr/opcvm/details/4/42876.html -http://genforum.genealogy.com/cgi-bin/print.cgi?phillippines::319.html -http://www.affiliate.hpstore.hp.co.uk/do/session/380860/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-photoworld.com/photoworld.asp?lang=f -http://ftp.eq.uc.pt/software/unix/Linux/docs/HOWTO/translations/italian/distributions/?M=A -http://store1.europe.yahoo.com/brink2/2000074017704.html -http://store1.europe.yahoo.com/brink2/2000073276003.html -http://www.cbe21.com.cn/xueke/dili/jiaoxuezs/ziliaojn/tupianhc/i0733.htm -http://www.networkpatternmatching.com/inventory/L/Limoges-American/Limoges-American-Tea-Rose-(Green).html -http://www.networkpatternmatching.com/inventory/L/Limoges-American/Limoges-American-Toledo-Delight-(Sand).html -http://ftp.debian.org/dists/sid/non-free/binary-hppa/games/?M=A -http://www.angelfire.com/vt/kAoZzZ -http://yp.gates96.com/14/28/60/15.html -http://yp.gates96.com/14/28/60/17.html -http://yp.gates96.com/14/28/60/41.html -http://yp.gates96.com/14/28/60/75.html -http://yp.gates96.com/14/28/60/83.html -http://yp.gates96.com/14/28/60/87.html -http://yp.gates96.com/14/28/61/96.html -http://yp.gates96.com/14/28/62/12.html -http://yp.gates96.com/14/28/62/28.html -http://yp.gates96.com/14/28/62/45.html -http://yp.gates96.com/14/28/62/74.html -http://yp.gates96.com/14/28/63/24.html -http://yp.gates96.com/14/28/63/45.html -http://yp.gates96.com/14/28/64/33.html -http://yp.gates96.com/14/28/65/84.html -http://yp.gates96.com/14/28/66/28.html -http://yp.gates96.com/14/28/66/49.html -http://yp.gates96.com/14/28/67/15.html -http://yp.gates96.com/14/28/67/17.html -http://yp.gates96.com/14/28/67/92.html -http://yp.gates96.com/14/28/67/95.html -http://yp.gates96.com/14/28/68/10.html -http://yp.gates96.com/14/28/69/20.html -http://yp.gates96.com/14/28/69/64.html -http://yp.gates96.com/14/28/69/74.html -http://www.cs.kuleuven.ac.be/documentation/Sun/WorkShop/html_docs/c-plusplus/stdlibcr/deq_4164.htm -http://no.egroups.com/message/Holiday-Best/571?source=1 -http://www.outpersonals.com/cgi-bin/w3com/pws/out/G1hIPcWIQWr-i3fHpjDuaPPPdDR9n25II-MFpjX9vR_df0A3ukwPXLd19bYe7oxRH5Zr5z3G_wJnwM6gAVSOlRUN-p5MKYEBVJa1T-GaZS44Z98yjSST2LfXzEdc9Xqp8W0jRiNL6iAX -http://msn.expedia.co.uk/wg/Asia/China/P31642.asp -http://www.angelfire.com/fl2/gulfcoastsoftball/images/?N=D -http://www.greenleaves.com/bookcat/gb_0879513802.html -http://cn.egroups.com/post/Digitrends_Daily?act=reply&messageNum=210 -http://www.bookhome.net/wuxia/hzlz/li/031.html -http://gb.toget.com.tw/intro/game_action/game_action_click/19990804_3190_dl.html -http://www.mbnet.mb.ca/gray/cgrcc.html -http://www.civila.com/noticias/chat/logos/juegos/esgratis/logos/index.html-ssi -http://www.ytmag.com/cgi-bin/redirect.cgi/1197948180 -http://debian.tod.net/debian/dists/sid/contrib/binary-arm/admin/?M=A -http://haste.co.kr/www.amaquest.com.tw/support.htm -http://www.diogenes.ch/4DACTION/web_rd_aut_frlist_az/ID=483376&chr=A -http://ads.neoseeker.com/remoteclick/GB972959289/ -http://urawa.cool.ne.jp/whoinside/cg/cgframe2.htm -http://excite.de/bildung/katalog/33148 -http://plat.debian.or.jp/debian-archive/dists/Debian-2.0/hamm/binary-m68k/news/ -http://wwwpriv.uni-koblenz.de:81/~admin/Doku/HtmlTutor/tcdkc.htm -http://platsbanken.amv.se/kap/text/62/000907,150090,120901,40,1427050362.shtml -http://216.35.79.131/sites/gunits/022140u.html -http://www.hotelboulevard.com/fr/paris/standard/htmle55cd396d0d1450ad1eddadf65bd6574/sessionLang/ANG/prov/browse/cp/75011/resultatSearch.html -http://www.ftp.uni-erlangen.de/cgi-bin/view/pub/unix/Linux/MIRROR.KDE/unstable/apps/README -http://www.ftp.uni-erlangen.de/pub/unix/Linux/MIRROR.KDE/unstable/apps/network/ -http://www.ycwb.com.cn/gb/2000/04/28/dnzk/itkx/3.html -http://polygraph.ircache.net:8181/http_-2www.microsoft.com/guestbook/http_-2www.nmpinc.com/cfiguest.htm -http://www.our-home.org/giulianovallemani/success.htm -http://retailer.gocollect.com/do/session/1912838/vsid/2312/tid/2312/cid/573127/mid/1020/rid/2147/chid/2210/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLlZe5ofpLqjXLpl4/url/http://www.gocollect.com/product_display/products/product_lines.asp -http://binary.tucows.com/win2k/adnload/60913_29719.html -http://www.allhealth.com/kickbutt/qa/0,4801,6565_168263-1,00.html -http://library.cuhk.edu.hk/search*chi/tChinese+history+series.+[Motion+picture]/tchinese+history+series/-5,1,1,B/frameset&F=tchinese+history+index+to+learned+articles+1902+1962&1,1, -http://cafe4.daum.net/Cafe-bin/Bbs.cgi/culturalistpds/lst/qqeq/1/zka/B2-kB27p -http://lib1.nippon-foundation.or.jp/1997/0012/contents/086.htm -http://members.tripod.com/~theernest/lit/long.html -http://de.excite.de/auto/katalog/13030 -http://www.szinfo.com/book/ke/fam/nk1/wlsf/001.htm -http://www.backflip.com/members/cquinn/466730/sort=1/ -http://130.158.208.53/WWW/PDB2/PCD4711/htmls/49.html -http://astronomysite.com/mapug1/15/msg15752.htm -http://astronomysite.com/mapug1/15/msg15922.htm -http://astronomysite.com/mapug1/15/msg15970.htm -http://astronomysite.com/mapug1/12/msg12909.htm -http://astronomysite.com/mapug1/9/msg9909.htm -http://astronomysite.com/mapug1/7/msg7248.htm -http://astronomysite.com/mapug1/7/msg7288.htm -http://astronomysite.com/mapug1/7/msg7300.htm -http://astronomysite.com/mapug1/7/msg7277.htm -http://astronomysite.com/mapug1/3/msg3386.htm -http://astronomysite.com/mapug1/0/msg898.htm -http://astronomysite.com/mapug1/2/msg2146.htm -http://people.freebsd.org/~knu/cgi-bin/cvsweb.cgi/ports/x11-fm/systemg/pkg/Attic/DESCR -http://www.posterwelt.de/byers/bye2506.htm -http://www.5a8.com/book/wg/zpj/f/fajieyefu/huimie/003.htm -http://www.5a8.com/book/wg/zpj/f/fajieyefu/huimie/015.htm -http://businessrecorder.com/story/S0015/S1510/top -http://sunsite.org.uk/Mirrors/ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/nt351/hotfixes-postsp5/sec-fix/?S=A -http://sunsite.org.uk/Mirrors/ftp.microsoft.com/bussys/winnt/winnt-public/fixes/usa/nt351/hotfixes-postsp5/sec-fix/readme.txt -http://www.angelfire.com/ky/dodone/HistJ.html -http://www.cricinfo.com/link_to_database/ARCHIVE/1997-98/WI_IN_PAK/WI_IN_PAK_NOV-DEC1997_WI-SQUAD.html -http://www.egroups.com/message/-Girlhelp-/3251 -http://www.egroups.com/message/-Girlhelp-/3268 -http://202.130.244.3/wuliwangye/help/help.htm -http://ftp.gwdg.de/pub/EMIS/EMS/journals/SLC/divers/mirror.html -http://ftp.gwdg.de/pub/EMIS/EMS/journals/SLC/divers/s20ghinelli.html -http://ftp.gwdg.de/pub/EMIS/EMS/journals/SLC/divers/s25dress.html -http://ftp.gwdg.de/pub/EMIS/EMS/journals/SLC/divers/s30wen.html -http://ftp.gwdg.de/pub/EMIS/EMS/journals/SLC/divers/slc41email.html -http://guardian.co.uk/Print/0,3858,3889048,00.html -http://genforum.genealogy.com/mccallum/messages/187.html -http://genforum.genealogy.com/mccallum/messages/192.html -http://genforum.genealogy.com/mccallum/messages/133.html -http://genforum.genealogy.com/mccallum/messages/95.html -http://genforum.genealogy.com/mccallum/messages/82.html -http://genforum.genealogy.com/mccallum/messages/30.html -http://dekooi.tucows.com/win2k/adnload/37333_29427.html -http://dekooi.tucows.com/win2k/adnload/37624_29418.html -http://dekooi.tucows.com/win2k/preview/139483.html -http://www.zurich-schweiz.ch/static/it/peraziende/grandiimprese/riskmanagement/procedere_con_metodo/gestione_del_rischio/ -http://cn.egroups.com/login.cgi?login_target=%2Fmessage%2Fcertdev%2F373 -http://www.angelfire.com/pa2/DreamAvs/ -http://www.madisonmag.com/sh/entertainment/stories/entertainment-20000713-013454.html -http://variety.studiostore.com/browse/WHATSNEW/SHIRT/b.FAVORITES%20WHATSNEW/s.GqXR0UHu -http://variety.studiostore.com/browse/WHATSNEW/MUG/b.FAVORITES%20WHATSNEW/s.GqXR0UHu -http://www.ecs.soton.ac.uk/~ecc/teaching/java/ExampleCode/Chapter10/s03/ -http://ftp.nacamar.de/pub/NetBSD/packages/1.4/alpha/cross/?M=A -http://www.he.ctc.org.cn/ctc2/news/internet/develop/news0413-7.htm -http://www.he.ctc.org.cn/ctc2/news/internet/invest/news0523-4.htm -http://www.he.ctc.org.cn/ctc2/news/internet/invest/news0514-1.htm -http://www.he.ctc.org.cn/ctc2/news/internet/politics/news0518-1.htm -http://www.linux.com/networking/network/applications/industry/trade_show/internet/ -http://www.linux.com/networking/network/applications/industry/trade_show/Motorola/ -http://www.linux.com/networking/network/applications/industry/trade_show/distro/ -http://iinet.tukids.tucows.com/mac/5-8/macmulti58_license.html -http://www.leg.wa.gov/pub/rcw%20-%20text/title_48/chapter_098/rcw_48_98_005.txt -http://universal.eud.com/1999/02/28/28304AA.shtml -http://www.firstview.com/WRTWfall97/MAX_MARA/P033.html -http://l-infonet.phkk.fi/fi/TIETOPALVELUT/SOSIAALI-+JA+TERVEYSALA/tietoverkot/suositukset/tietotekniikka/sanat/getdoc.akM?document_id=479 -http://l-infonet.phkk.fi/fi/TIETOPALVELUT/SOSIAALI-+JA+TERVEYSALA/tietoverkot/suositukset/tietotekniikka/sanat/www/ -http://ns.studenti.to.it/~s86852/applets/tetris.htm -http://www.egroups.com/message/grebel-list/1014 -http://emedici.net/www.homesbyavi.com/canadian_site/communities/evergreen/evergreen.html -http://ring.toyama-ix.net/pub/net/wu-ftpd/wu-ftpd/binaries/?N=D -http://ring.nii.ac.jp/archives/text/CTAN/support/vmspell/?N=D -http://ftpsearch.belnet.be/packages/CPAN/modules/by-authors/John_Macdonald/CHECKSUMS -http://students.depaul.edu/~eephrem/piazza123 -http://students.depaul.edu/~eephrem/maqdoomi.html -http://ftp.unina.it/pub/Unix/KDE/stable/2.0/distribution/deb/?D=A -http://www.dulux.co.uk/UKRETAIL:1433075516:DFinity.1QJiP4jMofi7bof -http://yp.gates96.com/14/20/10/26.html -http://yp.gates96.com/14/20/10/34.html -http://yp.gates96.com/14/20/10/63.html -http://yp.gates96.com/14/20/11/36.html -http://yp.gates96.com/14/20/11/73.html -http://yp.gates96.com/14/20/12/93.html -http://yp.gates96.com/14/20/13/42.html -http://yp.gates96.com/14/20/13/44.html -http://yp.gates96.com/14/20/14/9.html -http://yp.gates96.com/14/20/15/62.html -http://yp.gates96.com/14/20/15/77.html -http://yp.gates96.com/14/20/16/52.html -http://yp.gates96.com/14/20/16/70.html -http://yp.gates96.com/14/20/16/83.html -http://yp.gates96.com/14/20/17/91.html -http://yp.gates96.com/14/20/17/98.html -http://yp.gates96.com/14/20/18/8.html -http://yp.gates96.com/14/20/18/73.html -http://yp.gates96.com/14/20/19/38.html -http://yp.gates96.com/14/20/19/42.html -http://yp.gates96.com/14/20/19/56.html -http://www.wco.com/~havok/wellington.html -http://opac.lib.ntnu.edu.tw/search*chi/++ftlist/bbm0019678/7,-1,0,E/frameset&F=bbm0019685&1,1 -http://cdrom.zeelandnet.nl/elfsound/archief.htm -http://businessrecorder.com/story/S0055/S5527/top -http://www.private-immobilien-boerse.de/DominikanischeRep/verkauf/Versteigerungen-IB/Startseite/Gemeinsam/GmbH-Kauf-Verkauf-Insolvenz-konkurs/Startseite/IIM-Teil/Startseite/froben.htm -http://ring.nii.ac.jp/archives/lang/perl/CPAN/doc/manual/html/pod/perlfunc/utime.html -http://yp.gates96.com/14/21/10/71.html -http://yp.gates96.com/14/21/11/15.html -http://yp.gates96.com/14/21/12/55.html -http://yp.gates96.com/14/21/12/58.html -http://yp.gates96.com/14/21/13/94.html -http://yp.gates96.com/14/21/14/7.html -http://yp.gates96.com/14/21/14/12.html -http://yp.gates96.com/14/21/14/32.html -http://yp.gates96.com/14/21/14/96.html -http://yp.gates96.com/14/21/15/3.html -http://yp.gates96.com/14/21/15/51.html -http://yp.gates96.com/14/21/16/32.html -http://yp.gates96.com/14/21/16/87.html -http://yp.gates96.com/14/21/17/19.html -http://yp.gates96.com/14/21/17/31.html -http://yp.gates96.com/14/21/18/15.html -http://yp.gates96.com/14/21/18/68.html -http://yp.gates96.com/14/21/19/56.html -http://cafe2.daum.net/Cafe-bin/Bbs.cgi/kjbugopds/lst/qqa/f/zka/B2-kB2Rt -http://legalminds.lp.findlaw.com/list/courtinterp-spanish/frm04580.html -http://legalminds.lp.findlaw.com/list/courtinterp-spanish/frm04611.html -http://genforum.genealogy.com/cgi-genforum/forums/sweden.cgi?5207 -http://variety.studiostore.com/main/b.FAVORITES%20NOSTALGI%20CLASTV%20ILOVELUCY/s.VfgR3aEr -http://variety.studiostore.com/help/b.FAVORITES%20NOSTALGI%20CLASTV%20ILOVELUCY/s.VfgR3aEr -http://bsd.sinica.edu.tw/cgi-bin/cvsweb.cgi/ports/x11-clocks/xalarm/patches/Attic/patch-aa?only_with_tag=RELEASE_2_2_8 -http://gd.cnread.net/cnread1/ztxs/h/henggouzhengshi/eld/013.htm -http://gd.cnread.net/cnread1/ztxs/h/henggouzhengshi/eld/022.htm -http://gd.cnread.net/cnread1/ztxs/h/henggouzhengshi/eld/024.htm -http://ftp.unina.it/pub/Amiga/NetBSD/NetBSD-current/xsrc/xc/lib/xkbfile/?N=D -http://202.99.23.245/zdxw/17/20000217/200002171734.html -http://sunsite.org.uk/packages/netbsd/NetBSD-current/pkgsrc/net/batchftp/files/ -http://www.highwired.net/Activity/PrintArticle/0,1640,1326-186648,00.html -http://phpbuilder.net/forum/archives/1/2000/10/1/104426?&print_mode=1 -http://www.cognos.co.uk/de/vertriebspartner/vertriebspartner_plz.html -http://citeseer.nj.nec.com/cidcontext/3974259 -http://fi.egroups.com/message/free-classifieds/4556?source=1 -http://genforum.genealogy.com/cgi-genforum/forums/epler.cgi?2 -http://no.egroups.com/post/relations_iVillage?act=reply&messageNum=5 -http://198.103.152.100/search*frc/lHD69+P75H84/lhd+++69+p75+h84/-5,-1,0,E/frameset&F=lhd+++69+p75+k47+1984&1,1 -http://www.4positiveimages.com/4positiveimages/921456486/UserTemplate/2 -http://haha.3322.net/donghua/agui/adi/6.htm -http://mediate.magicbutton.net/do/session/625591/vsid/4573/tid/4573/cid/88043/mid/2247/rid/2383/chid/3527/url/http://www.winesmart.com/CaseDetails.asp?idCase=66 -http://www.lettera.de/tp/deutsch/inhalt/lis/8676/1.html -http://www.citybrazil.com.br/sc/regioes/joinville/expressoes.htm -http://webcvs.kde.org/cgi-bin/cvsweb.cgi/www/food/worse_is_better.html?sortby=date -http://yp.gates96.com/7/45/60/13.html -http://yp.gates96.com/7/45/61/3.html -http://yp.gates96.com/7/45/61/60.html -http://yp.gates96.com/7/45/62/37.html -http://yp.gates96.com/7/45/62/48.html -http://yp.gates96.com/7/45/62/70.html -http://yp.gates96.com/7/45/64/9.html -http://yp.gates96.com/7/45/64/33.html -http://yp.gates96.com/7/45/64/43.html -http://yp.gates96.com/7/45/64/55.html -http://yp.gates96.com/7/45/65/14.html -http://yp.gates96.com/7/45/65/48.html -http://yp.gates96.com/7/45/65/57.html -http://yp.gates96.com/7/45/66/27.html -http://yp.gates96.com/7/45/67/51.html -http://yp.gates96.com/7/45/68/12.html -http://yp.gates96.com/7/45/68/78.html -http://yp.gates96.com/7/45/69/25.html -http://www.msb.malmo.se/search*swe/aHarley,+Robert/aharley+robert/-5,-1,0,B/browse -http://www.superdownloads.com.br/linkinvalido.cfm?ID=748 -http://linuz.sns.it/doc/howto/en/html/AI-Alife-HOWTO-6.html -http://www.linux.com/networking/network/market/tools/applications/ -http://www.linux.com/networking/network/market/tools/frame_relay/ -http://www.linux.com/networking/network/market/tools/e-commerce/ -http://opac.lib.ntnu.edu.tw/search*chi/aUnited+Nations.+Dept.+of+Economic+and+Social+Affairs/aunited+nations+dept+of+economic+and+social+affairs/7,-1,0,B/frameset&F=aunited+nations+economic+and+social+commission+for+asia+and+the+pacific&6,,7 -http://www.affiliate.hpstore.hp.co.uk/do/session/380863/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/assistance/entry.asp -http://www.affiliate.hpstore.hp.co.uk/do/session/380863/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/entry.asp -http://www.shmoo.com/mail/ids/oct99/msg00288.html -http://bsd.sinica.edu.tw/ftp_pub/NetBSD/packages/1.3/hp300/?M=A -http://bsd.sinica.edu.tw/ftp_pub/NetBSD/packages/1.3/hp300/archivers/ -http://www.affiliate.hpstore.hp.co.uk/do/session/380868/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/REGISTRATION/entry.asp -http://www.insideneworleans.com/shared/health/adam/ency/imagepage/1562.000872.html -http://ring.omp.ad.jp/archives/NetBSD/packages/pkgsrc/devel/xxgdb/patches/patch-ac -http://genforum.genealogy.com/casey/messages/327.html -http://genforum.genealogy.com/casey/messages/164.html -http://genforum.genealogy.com/casey/messages/337.html -http://genforum.genealogy.com/casey/messages/73.html -http://genforum.genealogy.com/casey/messages/57.html -http://genforum.genealogy.com/casey/messages/50.html -http://genforum.genealogy.com/casey/messages/23.html -http://genforum.genealogy.com/casey/messages/116.html -http://www.msb.malmo.se/search*swe/aNorman,+Karin,+1947-/anorman+karin+1947/-5,-1,0,B/frameset&F=anorman+leslie&1,1 -http://forum.rai.it/aca-finestre/dispatch.cgi/FORUM/folderFrame/100001/0/rnumber/9096335 -http://www.mindspring.com/~arachnid/?S=D -http://www6.freeweb.ne.jp/business/n-bns/hre/ -http://news.swww.com.cn/wccdaily/review/200005/29/html/0908.htm -http://tucows.hom.net/croomnt_rating.html -http://www.trax.nilex.co.uk/trax.cgi/A1C/A2S/1AS/A4L/A4D/B1R/ -http://www.trax.nilex.co.uk/trax.cgi/A1C/A2S/1AS/A4L/A4D/A5L/ -http://www.5a8.com/book/kh/zg/zpj/h/heju/001.htm -http://www.5a8.com/book/kh/zg/zpj/h/heju/002.htm -http://www.luckyman.de/computer/hpaccess/java_cgi/java_applet/linien/applet_linien_nav1.htm -http://www.secure-me.net/information/kb/POP -http://in.egroups.com/message/BodybuildingContests/2804 -http://in.egroups.com/message/BodybuildingContests/2820 -http://in.egroups.com/message/BodybuildingContests/2822 -http://theconnection.vnunet.com/Analysis/Stfriend/70206 -http://www.yorosiku.net:8080/-_-http://www.nrcse.washington.edu/newsletter/newsletter.pdf -http://www.britishairways.nl/regional/barbados/docs/spec_world_offer.shtml -http://www.xmwb.sh.cn/xmwb/19981117/BIG5/13421^4111719.htm -http://www.z-plus.de/TEXTE/HOMEPAGE/HILFE/HILFE_SURFTIPS201099/text5.html -http://uzgamez.subportal.com/games/previews/0900/westwood/russian_general.html -http://bsd.sinica.edu.tw/ftp_pub/NetBSD/packages/1.3/sun3/?D=A -http://my.egroups.com/messages/dcfwriters/132?expand=1 -http://my.egroups.com/message/dcfwriters/147 -http://my.egroups.com/message/dcfwriters/149 -http://oss.sgi.com/cgi-bin/cvsweb.cgi/projects/failsafe/FailSafe/failsafe/scripts/?only_with_tag=MAIN -http://sound-dist.secured.co.uk/cgi-bin/psShop.cgi/add|8P007|972959615|Warm===and===Dry|user|0|1,0,0,1 -http://www.alsapresse.com/jdj/00/01/13/MA/photo_6.html -http://www.highwired.net/ESchoolDrive/Frameset/0,5592,13577-52,00.html -http://uk.sports.yahoo.com/000922/59/ak705.html -http://universal.eud.com/1999/02/26/26204DD.shtml -http://people.freebsd.org/~knu/cgi-bin/cvsweb.cgi/ports/audio/gkrellmvolume/pkg-descr?only_with_tag=MAIN -http://www3.skolverket.se/kursinfo/99_00/skolform/21/alt_nav/S_52S_10S_36VAV_SVSTEK_1715.HTML -http://www3.skolverket.se/kursinfo/99_00/skolform/21/alt_nav/S_52S_10S_36VAV_SVSTEK_1719.HTML -http://www.wsrn.com/apps/research/history.xpl?s=CMDCD&f=HISTORY -http://www.wsrn.com/apps/charts/?s=CMDCD&data=Z10 -http://pub3.ezboard.com/utherealcharron.showPublicProfile?language=EN -http://ring.shibaura-it.ac.jp/archives/graphics/gimp/gtk/binary/DEBIAN/stable/?S=A -http://209.52.189.2/discussion.cfm/autism/29762/198522 -http://www.affiliate.hpstore.hp.co.uk/do/session/380851/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/assistance/entry.asp -http://www01.sankei.co.jp/advertising/furusato/tokuhain/9810/1018sindou.html -http://kulichki-mac.rambler.ru/abiturient/ak.htm -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=3,0+9,1-20,0+9,0 -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=3,0+9,1-20,0+18,0 -http://ballesta.inrialpes.fr/Infos/Personnes/Christophe.Rippert/ressources/tutorial/security1.2/summary/glossary.html -http://www.affiliate.hpstore.hp.co.uk/do/session/380872/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.france.hp.com/main/respect/ -http://www11.cplaza.ne.jp/babyweb/bbs/bdnmp01/no24/99N.html -http://www.homeway.com.cn/lbi-html/news/zhxw/gatxw/20000922/165807.shtml -http://gd.cnread.net/cnread1/yqxs/d/dingqianrou/ssqj/009.htm -http://library.bangor.ac.uk/search/tBiol.+philos/tbiol+philos/-17,-1,0,B/frameset&F=tbioindicators+and+environmental+management&1,1 -http://dante.bdp.it/cgi-bin/poseidon_v2.0/reflect/poseidon/disc/peacelink-scuola/70630505/view/1 -http://www.indian-express.com/ie/daily/19980626/17750374.html -http://www.indian-express.com/ie/daily/19980626/17751044.html -http://www.indian-express.com/ie/daily/19980626/17751334.html -http://www.indian-express.com/ie/daily/19980626/17751494.html -http://polygraph.ircache.net:8181/services/define/http_-2www.disney.com/links.html -http://pub10.ezboard.com/fsavings4yousavings4you.subscribeUnregisteredToTopic?topicID=56.topic -http://www8.freeweb.ne.jp/shopping/arthome/arthome/menu.html -http://rainforest.parentsplace.com/dialog/get/medinfo/4/1.html?outline=3 -http://www.emerchandise.com/aboutus/b.TV%20SATNIGHTLIVE/s.afJ7iGE2 -http://ring.omp.ad.jp/archives/NetBSD/packages/pkgsrc/net/arpwatch/pkg/?S=A -http://ring.omp.ad.jp/archives/NetBSD/packages/pkgsrc/net/arpwatch/pkg/DESCR -http://210.178.135.1/netbbs/Bbs.cgi/nhic30872/qry/zka/B2-kBI-o/pno/0/qqo/004A/qqatt/^ -http://yp.gates96.com/8/48/0/54.html -http://yp.gates96.com/8/48/1/98.html -http://yp.gates96.com/8/48/2/23.html -http://yp.gates96.com/8/48/3/13.html -http://yp.gates96.com/8/48/3/14.html -http://yp.gates96.com/8/48/3/23.html -http://yp.gates96.com/8/48/3/84.html -http://yp.gates96.com/8/48/4/5.html -http://yp.gates96.com/8/48/4/72.html -http://yp.gates96.com/8/48/5/4.html -http://yp.gates96.com/8/48/5/49.html -http://yp.gates96.com/8/48/6/38.html -http://yp.gates96.com/8/48/6/89.html -http://yp.gates96.com/8/48/8/10.html -http://yp.gates96.com/8/48/8/41.html -http://yp.gates96.com/8/48/8/87.html -http://news.medscape.com/adis/CDI/2000/v19.n02/cdi1902.02.biel/cdi1902.02.biel-01.html -http://www.parsonstech.com/genealogy/trees/PKINGMAN/d2438.htm -http://www.parsonstech.com/genealogy/trees/PKINGMAN/d2502.htm -http://www.chaos.dk/sexriddle/j/c/b/o/ -http://www.outpersonals.com/cgi-bin/w3com/pws/out/FahI8ikSPIvk79ErK106-87Jy3U1_XgCksR4DWkUOldKaD_pciJBXOOmI2Sr4jXlDCT9Mkz59aBZhyyi3xxBeYROt0IpVObKZD4YcwBAhl9afrfb6y3nWI3SwdRE_Vp3d80RzmrDkPVZYQkJyvOgorzS -http://opac.lib.rpi.edu/search/dchemicals+dictionaries/-5,-1,0,E/frameset&dchemicals+catalogs&3,,0 -http://opac.lib.rpi.edu/search/dchemicals+dictionaries/-5,-1,0,E/frameset&dchemicals+catalogs+periodicals&1,1 -http://opac.lib.rpi.edu/search/dchemicals+dictionaries/-5,-1,0,E/frameset&dchemicals+dictionaries&3,,0 -http://opac.lib.rpi.edu/search/dchemicals+dictionaries/-5,-1,0,E/frameset&dchemicals+economic+aspects+united+states&1,,0 -http://www.jsonline.com/news/state/oct00/lambeau31103000a.asp -http://polygraph.ircache.net:8181/used/http_-2www.scubaring.com/http_-2www.alpinehotel.com/chinese/chine.htm -http://www.kaos.dk/sex-riddle/k/a/k/i/p/g/g/e/ -http://haikou.hainan.gov.cn/ghgl/ghsc/hkfg3020.html -http://variety.studiostore.com/main/VARIETY/s.Fz90iGDh -http://library.cuhk.edu.hk/search*chi/cPN595.C6I18+1993/cpn++595+c6+i18+1993/-5,1,1,E/frameset&F=cpn++595+c6+k6+1997&1,1, -http://library.cuhk.edu.hk/search*chi/cPN595.C6I18+1993/cpn++595+c6+i18+1993/-5,1,1,E/frameset&F=cpn++595+c6+l515&1,1, -http://link.fastpartner.com/do/session/600425/vsid/2870/tid/2870/cid/136966/mid/1060/rid/1926/chid/2870/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/learn.htm -http://www.nanyang.com.my/20001020/articles/15-10-2000k16.htm -http://202.99.23.245/rmrb/199912/11/newfiles/col_19991211001063_zhxw.html -http://help.sap.com/saphelp_45b/helpdata/en/a7/2872510a6c11d28a220000e829fbbd/frameset.htm -http://www.s10.sexshare.com/~pornking/hardcore/43.html -http://www.gbnf.com/genealogy/Lawler99/html/d0102/I1772.HTM -http://ring.edogawa-u.ac.jp/pub/linux/RedHat/aic/OLD/aic7xxx-5.0.x/boot_disks/5.0.11/SuSE/?D=A -http://www.t-online.de/sport/inhalte/adispi51.htm -http://ftp.lip6.fr/pub11/FreeBSD/development/FreeBSD-CVS/src/kerberos5/usr.sbin/k5stash/ -http://education.legend-net.com/xinwen/gaokao/zl5/zhsh/3/zhshyk.html -http://www.contractorresource.com/Wyoming/Cody/ -http://213.36.119.69/do/session/152998/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/boutique/ -http://213.36.119.69/do/session/153000/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/reserver/hotels.html -http://213.36.119.69/do/session/153000/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www3.travelprice.com/voyages/recherche.phtml -http://ftp.unina.it/pub/TeX/macros/latex/contrib/supported/combine/?D=A -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=237&discrim=178,2,11 -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=237&discrim=178,2,233 -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=237&discrim=178,2,5 -http://www12.freeweb.ne.jp/novel/urufu24/linkz/ug1.html -http://www12.freeweb.ne.jp/novel/urufu24/linkz/pv.html -http://computers.kharkov.ua/win/43/ -http://www.1001e.net/nk4/022.htm -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=4&discrim=93,164,176 -http://dic.empas.com/show.tsp/?q=revisable&f=B -http://yp.gates96.com/0/28/30/45.html -http://yp.gates96.com/0/28/30/46.html -http://yp.gates96.com/0/28/31/24.html -http://yp.gates96.com/0/28/32/64.html -http://yp.gates96.com/0/28/33/28.html -http://yp.gates96.com/0/28/33/85.html -http://yp.gates96.com/0/28/33/87.html -http://yp.gates96.com/0/28/33/96.html -http://yp.gates96.com/0/28/34/52.html -http://yp.gates96.com/0/28/35/7.html -http://yp.gates96.com/0/28/36/23.html -http://yp.gates96.com/0/28/36/52.html -http://yp.gates96.com/0/28/37/50.html -http://yp.gates96.com/0/28/38/85.html -http://yp.gates96.com/0/28/39/16.html -http://www.fan590.com/JamMoviesReviewsE/earth_king.html -http://www.sportbuecher.de/shop/3-88034-750-6.html -http://www.msb.malmo.se/search*swe/aWhitaker,+Galvin,+Utgivare/awhitaker+galvin/-5,-1,0,B/exact&F=awhitburn+joel&1,2 -http://ftp.sunet.se/pub/security/vendor/microsoft/winnt/frn/nt40/?M=A -http://www.intervoz.com.ar/2000/03/02/op_n04.htm -http://www.ntut.edu.tw/~s7370840/8-19.htm -http://www.back2roots.org/Music/Files/Wondergirl%20-%20You%26Me/ -http://www.private-immobilien-boerse.de/nordrhein-Westfalen/Muehlheim-ruhr/Verkauf/3d-service/IIM-Teil/Startseite/Gemeinsam/Inserieren/IIM-Teil/Startseite/frinfo.htm -http://web.singnet.com.sg/~spirit5/letters/oct2000/frankm1025-3.htm -http://web.singnet.com.sg/~spirit5/letters/oct2000/davidp1025.htm -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=decuplicavamo&l=it -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=decuplichiate&l=it -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=decuplichereste&l=it -http://members.tripod.com/~OZEMU/cgi-bin/ -http://ring.tains.tohoku.ac.jp/archives/pack/dos/hardware/midi/?D=A -http://kutschen.de/Schoner/info-e/info-e/collections/literature/ -http://www.jamba.de/KNet/_KNet-MJJ8j1-DGd-13dgc/showInfo-special1.de/node.0/cde7f1uou -http://www.jamba.de/KNet/_KNet-MJJ8j1-DGd-13dgy/browse.de/node.0/cenv0b09a -http://in.egroups.com/message/sfconsim-l/6415 -http://genforum.genealogy.com/cgi-genforum/forums/vt.cgi?4123 -http://www.linux.com/networking/network/sap/article/price/VA_Linux_Systems/ -http://www.linux.com/networking/network/sap/article/price/regulation/ -http://slacvx.slac.stanford.edu/sldmcwww/mc/MC74BB_98R16B_WIN_ALL.HTML -http://www.xmission.com/~dkenison/cgi/lwgate.cgi/KLR650/archives/v02.n1611/date/article-15.html -http://www.iwon.com/home/movies/movies_filmography_page/0,13178,Macon+McCalman,00.html -http://excite.de/spiele/katalog/26997 -http://www.trax.nilex.co.uk/trax.cgi/A1C/B1S/B2R/A2U/B3S/B1R/ -http://www.power2lead.com/Global/English.nsf/pgWWLocations!OpenPage&ExpandSection=2,6,27,9,26 -http://itcareers.careercast.com/texis/it/itjs/+owwBm1eP0-dzwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewDPwdGpdGwBodDa5dhBiwGna5O5BnManDtoDnnGa5nDodGa5BwhhaidGAanLpnGonDqnaqdMp1BnGamnVncdpaMFqhTfR20Dzme8twwwpBmer+D86e9qwww5rmeZpwwwBrmeZpwww/morelike.html -http://pub4.ezboard.com/fnationoferidinegeneral.showAddReplyScreenFromWeb?topicID=615.topic&index=2 -http://www.chaos.dk/sexriddle/m/i/s/x/ -http://kiasuplanet.subportal.com/sn/Games/Tetris_Clone_Games/5532.html -http://kiasuplanet.subportal.com/sn/Games/Tetris_Clone_Games/11418.html -http://kiasuplanet.subportal.com/sn/Games/Tetris_Clone_Games/676.html -http://www.rge.com/pub/networking/ldap/umich/max500/beta/?M=A -http://my.egroups.com/dir/Health/Fitness/Exercise_Equipment -http://my.egroups.com/messages/prevention -http://pub4.ezboard.com/factiveprodiscussioncommunityactivitiesquestions.showMessage?topicID=12.topic -http://www.look4cranes.com/catalog/AUCTIONRESULT/AGGREGATE+-+CONVEYOR+%2F+FEEDER+%2F+STACKER/POWERSCREEN/ -http://www.fogdog.com/cedroID/ssd3040183344300/cgi-bin/MyFogdog -http://www.fogdog.com/cedroID/ssd3040183344300/nav/products/featured_brands/3b/gloves_mittens/ -http://www.houses-apartment-listings.com/Washington/city_search_criteria.asp?state=WA&City=CONCONULLY -http://www.brunel.ac.uk/~ccusjpe/linux/howto/Consultants-HOWTO/c23417.html -http://www.brunel.ac.uk/~ccusjpe/linux/howto/Consultants-HOWTO/x12810.html -http://www.brunel.ac.uk/~ccusjpe/linux/howto/Consultants-HOWTO/x14250.html -http://www.brunel.ac.uk/~ccusjpe/linux/howto/Consultants-HOWTO/x14507.html -http://www.brunel.ac.uk/~ccusjpe/linux/howto/Consultants-HOWTO/x15988.html -http://www.brunel.ac.uk/~ccusjpe/linux/howto/Consultants-HOWTO/x17214.html -http://www.brunel.ac.uk/~ccusjpe/linux/howto/Consultants-HOWTO/x18550.html -http://www.brunel.ac.uk/~ccusjpe/linux/howto/Consultants-HOWTO/x19113.html -http://www.brunel.ac.uk/~ccusjpe/linux/howto/Consultants-HOWTO/x1949.html -http://www.brunel.ac.uk/~ccusjpe/linux/howto/Consultants-HOWTO/x21473.html -http://www.brunel.ac.uk/~ccusjpe/linux/howto/Consultants-HOWTO/x31101.html -http://www.brunel.ac.uk/~ccusjpe/linux/howto/Consultants-HOWTO/x3585.html -http://www.brunel.ac.uk/~ccusjpe/linux/howto/Consultants-HOWTO/x44035.html -http://www.brunel.ac.uk/~ccusjpe/linux/howto/Consultants-HOWTO/x4711.html -http://www.online.kokusai.co.jp/Home/V0043638/wrd/G100/ -http://ftp.lip6.fr/pub5/FreeBSD/branches/-current/ports/print/ghostscript5/ -http://ftp.lip6.fr/pub5/FreeBSD/branches/-current/ports/print/texinfo/ -http://ftpsearch.belnet.be/mirrors/ftp.isc.org/pub/usenet/control/ats/?N=D -http://garbo.uwasa.fi/pub/linux/distributions/SuSE/7.0/dosutils/exceed/USER/HOSTEX/SCHEME/?D=A -http://forum.rai.it/aca-finestre/dispatch.cgi/FORUM/showNextUnseen/fol/100001/922702 -http://link.fastpartner.com/do/session/600391/vsid/1314/tid/1314/cid/134340/mid/1060/rid/1180/chid/1314/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/local/redirect.php -http://www.jamba.de/KNet/_KNet-wEF8j1-bGd-13cma/showInfo-datenschutz.de/node.0/cenvptf1i -http://www.jamba.de/KNet/_KNet-wEF8j1-bGd-13cmd/browse.de/node.0/cenv0b09a -http://www-usa6.cricket.org/link_to_database/PLAYERS/RSA/T/THOMPSON_DS_03003252/ -http://sunsite.org.uk/public/public/packages/WWW/emacs-w3/?S=A -http://www.excelsior.com.mx/9811/981129/buh25.html -http://www.anixter.nl/SBJEVE/170699-2155-01.html -http://innopac.lib.tsinghua.edu.cn:2082/search*chi/aBrooks,+Jane+B./abrooks+jane+b/-5,-1,0,B/browse -http://tour.stanford.edu/cgi/options.prl/95.70/gMcto -http://www.cksd.edgate.com/emeraldheightses/elections/students/the_parties/ -http://novel.hichinese.net/comment/comment.php?page=2091&action=write -http://205.161.150.96/cgi-bin/c2k/additem.html&item=204578 -http://www.nhic.or.kr/netbbs/Bbs.cgi/nhic31282/qry/zka/B2-kB2-m/pno/0/qqo/004A/qqatt/^ -http://scripts.infoart.ru/magazine/znamia/n4-20/shpakov.htm -http://excite.de/bildung/katalog/19909 -http://911codes.com/games/platform/n64/sect/div/cont/list_cheat/spray/y/id/0000009557/gid/0000003573/_cheats/_walkthroughs/_codes/_pc/_n64/_psx/_gameboy/_playstation/ -http://ftp.jp.debian.org/debian/dists/stable/main/source/web/?M=A -http://www.fogdog.com/cedroID/ssd3040183335913/nav/products/featured_brands/3c/all/ -http://his.luky.org/ML/linux-users.3/msg08073.html -http://yomiuri-1422.excite.co.jp/entertainment/animated_cartoon_comic/each_work_title/ha_line/ha -http://yomiuri-1422.excite.co.jp/entertainment/animated_cartoon_comic/each_work_title/ha_line/hu_he/berserk -http://library.cwu.edu/search/dWorld+War,+1914-1918+--+Diplomatic+history/dworld+war+1914+1918+diplomatic+history/-5,-1,0,B/exact&F=dworld+war+1914+1918+diplomatic+history&1,49 -http://www.utdallas.edu/dept/sci_ed/Caribbean/images/Jennifer%20Jordan/Antigua%20Mangrove/?N=D -http://www.baustoffhandel.de/service/faqs/faq-tapezieren.htm -http://muc-zvs-web1.goethe.de/ms/bud/film/un_f2.htm -http://www.online.kokusai.co.jp/Map/V0043636/wrd/G1000/map/sitemap.html -http://win.www.citycat.ru/funny/fido/2000_05/25.html -http://nathanael.upi.jussieu.fr/tele6.nsf/autres+centres+de+formations!OpenPage&ExpandSection=9,1,7,13,15,6 -http://yp.gates96.com/11/79/50/1.html -http://yp.gates96.com/11/79/50/92.html -http://yp.gates96.com/11/79/52/64.html -http://yp.gates96.com/11/79/54/79.html -http://yp.gates96.com/11/79/54/81.html -http://yp.gates96.com/11/79/56/28.html -http://yp.gates96.com/11/79/56/30.html -http://yp.gates96.com/11/79/56/46.html -http://yp.gates96.com/11/79/56/83.html -http://yp.gates96.com/11/79/57/10.html -http://yp.gates96.com/11/79/57/33.html -http://yp.gates96.com/11/79/58/1.html -http://yp.gates96.com/11/79/58/48.html -http://yp.gates96.com/11/79/58/82.html -http://yp.gates96.com/11/79/59/62.html -http://l-infonet.phkk.fi/fi/TIETOPALVELUT/ELINKEINO-+JA+YRITYSTOIMINTA/Matkailu+-+maantiede/matkailu/linja-autoliikenne/joukkoliikenne/aikataulut/ -http://cn.egroups.com/message/romtrade/3823 -http://www.idgnet.com/idgns/1999/07/16/SmallFrenchBusinessesMoveSlowlyTo.shtml -http://www-d0.fnal.gov/d0dist/dist/releases/psim01.01.00/Exceptions/?M=A -http://www.4positiveimages.com/4positiveimages/781560892/Catalog -http://dellnet.excite.fr/yellow_pages/annuaire/823 -http://ftp.chg.ru/pub/math/grace/MIRRORS -http://ftp.chg.ru/pub/math/grace/aux/ -http://legalminds.lp.findlaw.com/list/lawlibref-l/mail8.html -http://carriage.de/Schoner/modelle/models/Info-d/Sammlungen/ -http://chunma.yeungnam.ac.kr/~j4390214/경기상승.htm -http://members.tripod.co.jp/stpp/?M=A -http://map.ipc.co.jp/asp/onmap/connect/f-525598/g-28/ -http://www.fortunecity.com/business/lerner/101/form.html -http://www.sportskorea.net/BBS/Bbs/db/L019/act/new/bnum/000060/zka/6/o/6/drc/f -http://ftp.jp.debian.org/debian/dists/Debian2.2r0/main/binary-all/hamradio/?M=A -http://admin.afiliando.com/do/session/189476/vsid/1507/tid/1507/cid/23455/mid/1025/rid/1168/chid/1205/parser/yes/imref/eqqLmwlGltt5tkpHrYjLXofLklkKZljLkju5lZa5l0/url/http://www.submarino.com.mx/toy/home.asp -http://www.gasex.com/gay.male.erotica/penis.gay.twink.men.html -http://ftpsearch.belnet.be/mirrors/ftp.isc.org/pub/usenet/control/ak/?S=A -http://gb.toget.com.tw/intro/desktop_wallpaper/desktop_wallpaper_idol/20000417_7747_dl.html -http://yp.gates96.com/13/50/50/27.html -http://yp.gates96.com/13/50/52/20.html -http://yp.gates96.com/13/50/52/31.html -http://yp.gates96.com/13/50/52/44.html -http://yp.gates96.com/13/50/53/33.html -http://yp.gates96.com/13/50/53/45.html -http://yp.gates96.com/13/50/53/72.html -http://yp.gates96.com/13/50/54/34.html -http://yp.gates96.com/13/50/54/62.html -http://yp.gates96.com/13/50/54/83.html -http://yp.gates96.com/13/50/54/84.html -http://yp.gates96.com/13/50/55/5.html -http://yp.gates96.com/13/50/55/61.html -http://yp.gates96.com/13/50/55/75.html -http://yp.gates96.com/13/50/56/0.html -http://yp.gates96.com/13/50/56/15.html -http://yp.gates96.com/13/50/56/21.html -http://yp.gates96.com/13/50/56/29.html -http://yp.gates96.com/13/50/57/2.html -http://yp.gates96.com/13/50/57/54.html -http://yp.gates96.com/13/50/58/9.html -http://yp.gates96.com/13/50/58/34.html -http://yp.gates96.com/13/50/59/64.html -http://yp.gates96.com/13/50/59/70.html -http://yp.gates96.com/13/50/59/75.html -http://yp.gates96.com/13/50/59/85.html -http://www.ilmessaggero.it/hermes/19990419/07_MARCHE/40/AGRI.htm -http://www.ilmessaggero.it/hermes/19990419/07_MARCHE/40/NERA.htm -http://amigos.com/cgi-bin/w3com/pws/ffe/IURImAxosglBgN4t3Iz538S9DOsFp6mHl6tpYJehgGibFrnWNcTM3WIsDckFomPqZ-JB8f_Qj8Aua4sE4AFvcFyidtj2iI6k1zPchuFbLwWMCo3hr8eXPNuxbHPQdRvo8J246667 -http://amigos.com/cgi-bin/w3com/pws/ffe/F3hIBiydr9mPRNSqk-dll3MTqIZCaRN3wRH0-H7o4qF0vlfPBXUV-Vhn028iva56e-GCSyYZKBQxuCJO8Y2JF25fVTkPHzFtrNMoOVhEp2n7Y11PhN9pvFNyqgssdZW8Eay0XJsP0vuD4oCbmJVx -http://home.digitalcity.com/boston/sportsguy/main.dci?page=curse2 -http://ftpsearch.belnet.be/mirror/ftp.funet.fi/pub/Linux/doc/logos/.cap/?S=A -http://ftpsearch.belnet.be/mirror/ftp.funet.fi/pub/Linux/doc/logos/.cap/?D=A -http://my.netian.com/~52tour/kyung1.html -http://aol.weather.com/weather/radar/single_site/us_ny_allegany.html -http://www-usa16.cricket.org/link_to_database/GROUNDS/RSA/CENTURION/ -http://polygraph.ircache.net:8181/prodev/career/http_-2www.getstats.com/http_-2www.shindex.com/in_dex/in_dex.html -http://polygraph.ircache.net:8181/prodev/career/http_-2www.getstats.com/http_-2www.microsoft.com/msoffice -http://www.5a8.com/book/wg/cp/p/puge/zhizhunv/005.htm -http://tukids.raha.com/crafts/preview/52044.html -http://tukids.raha.com/crafts/preview/52401.html -http://buc.co.kr/www.ecs.com.tw/ -http://wap.jamba.de/KNet/_KNet-EDS8j1-KHd-13gbq/showInfo-werbung.de/node.0/cde7f1uou -http://www.launch.com/music/songpage/1,4425,322514,00.html -http://www.emerchandise.com/browse/BUFFYTHEVAMP/CAP/b.TV%20BUFFYTHEVAMP/s.NGdTZGLC -http://www.emerchandise.com/browse/BUFFYTHEVAMP/STICKER/b.TV%20BUFFYTHEVAMP/s.NGdTZGLC -http://www.emerchandise.com/help_security/b.TV%20BUFFYTHEVAMP/s.NGdTZGLC -http://yp.gates96.com/14/70/50/9.html -http://yp.gates96.com/14/70/50/23.html -http://yp.gates96.com/14/70/50/24.html -http://yp.gates96.com/14/70/50/40.html -http://yp.gates96.com/14/70/50/47.html -http://yp.gates96.com/14/70/50/79.html -http://yp.gates96.com/14/70/50/89.html -http://yp.gates96.com/14/70/51/83.html -http://yp.gates96.com/14/70/52/98.html -http://yp.gates96.com/14/70/53/46.html -http://yp.gates96.com/14/70/54/4.html -http://yp.gates96.com/14/70/54/24.html -http://yp.gates96.com/14/70/54/97.html -http://yp.gates96.com/14/70/55/51.html -http://yp.gates96.com/14/70/57/51.html -http://yp.gates96.com/14/70/58/3.html -http://yp.gates96.com/14/70/58/84.html -http://yp.gates96.com/14/70/59/0.html -http://opac.lib.ntnu.edu.tw/search*chi/++ftlist/bp20046027/-5,-1,0,B/frameset&F=bp20046031&1,1 -http://www.free-phone.com/q/001p/ppc2/KtIYye9a8Pw.htm -http://www.1stemlm.com/q/001p/ppc2/7kwUxQYfGMk.htm -http://sports.excite.com/ten/grand_german -http://www.omniseek.com/dir/Arts+%26+Humanities/Fine+Arts/Ceramics/Organizations/Australia/ -http://ftp1.service.digital.com/patches/public/vms/axp/v7.1-2/dec-axpvms-vms712_usb-v0100--4.pcsi-dcx_axpexe -http://ftp1.service.digital.com/patches/public/vms/axp/v7.1-2/vms712_acrtl-v0100.README -http://ftp1.service.digital.com/patches/public/vms/axp/v7.1-2/vms712_acrtl-v0100.html -http://ftp1.service.digital.com/patches/public/vms/axp/v7.1-2/vms712_dqconfig-v0200.README -http://ftp1.service.digital.com/patches/public/vms/axp/v7.1-2/vms712_ds20e-v0100.html -http://ftp1.service.digital.com/patches/public/vms/axp/v7.1-2/vms712_shadowing-v0300.CVRLET_TXT -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=barrissait&l=fr -http://dk.egroups.com/message/M-1911/4394 -http://www.netsh.com.cn/wwwboardm/526/messages/2116.html -http://www.netsh.com.cn/wwwboardm/526/messages/2270.html -http://www.netsh.com.cn/wwwboardm/526/messages/773.html -http://www.netsh.com.cn/wwwboardm/526/messages/2058.html -http://www.netsh.com.cn/wwwboardm/526/messages/2329.html -http://www.netsh.com.cn/wwwboardm/526/messages/1813.html -http://linux.softhouse.com.cn/linux/knowledge/tech/HOWTO/Java-CGI-HOWTO-7.html -http://news.novgorod.ru/news/2000/9/22/2/12 -http://news.novgorod.ru/news/2000/9/24/2/12 -http://homepage1.nifty.com/sigenyan/nikki9.htm -http://perso.club-internet.fr/guige/ncpc78.htm -http://www.vr-homes.com/usa/California/Cities/Victorville/Travel/Maps_Images/ -http://www.incestpornstories.com/cum-sex-pics/underagecoed/spankingsweating/hardendurance.html -http://www.freeforums.com/forums/Hardball/000008-000007.asp -http://www.freeforums.com/forums/Hardball/000005-000001.asp -http://www.freeforums.com/forums/Hardball/000004-000001.asp -http://rex.skyline.net/html/Internet_Chat_Sites.html?315,computers,video,internet,computers -http://rex.skyline.net/html/Computers_-_Hardware.html?14,computers,video,internet,computers -http://194.128.65.4/pa/cm199899/cmhansrd/vo990216/text/90216w20.htm -http://pub14.ezboard.com/fyamguyskoflastblade.showMessage?topicID=3.topic -http://plant.reedexpo.ca/www.partnership.ca/?S=A -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=168&discrim=109,5,168 -http://www.aelita.net/products/~archive/Download_redirect/solutions/solutions/services/products/default.htm -http://www.jpc-music.com/7041801.htm -http://home.c2i.net/entreprenor/java/ra.html -http://gxschool.beelink.com.cn/mid_edu/midschool/geography3/t4cd7z/4d7z3.3_1.htm -http://ricoh.co.jp/SHOGI/emate/basic/mate3003a.html -http://www.diogenes.ch/4DACTION/web_rd_aut_frlist_az/ID=483385&chr=K -http://www.ebigchina.com/msg_post.phtml?cu=1003 -http://www.bemi-immobilien.de/allgemeine-ib/startseite/Gemeinsam/erreichenPartner/Gemeinsam/versicherungen/lebensversicherung/Gemeinsam/immolink/Gemeinsam/MarketingStrategie/Gemeinsam/Inserieren/onlineInserieren.htm -http://ftp.tku.edu.tw/OS/Linux/distributions/RedHat/rawhide/i386/doc/rhinst/stylesheet-images/?S=A -http://www.egroups.com/message/kicken/284 -http://www.guangmingdaily.com.cn/0_gm/1999/12/19991222/big5/gm^18278^2^GM2-2216.htm -http://brightnet.pda.tucows.com/www.psionsite.rcsed.ac.uk/ -http://www.symatrixinc.com/website/website.nsf/0/3e40df86fb357cd5882568720079613f!OpenDocument&ExpandSection=9,22,1,11 -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=durereste&l=it -http://click-to.tell-a-friend.boardhost.com/tell-a-friend-confirm.cgi?ylihilseen&msg=25 -http://www.gbgm-umc.org/EllisvilleMO/10-04-00.pdf -http://www.marketingtool.com/contribute/webfirm/b.435.r.2626.g.4134.html -http://www.chaos.dk/sexriddle/h/a/w/l/ -http://www.chaos.dk/sexriddle/h/a/w/t/ -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=3,0+9,5-0,3+( -http://www.guba.net/101/136/125E/index-4.phtml -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=3,0+9,5-0,3+21,0 -http://www.guba.net/101/136/125E/index-7.phtml -http://www.guba.net/101/136/125E/index-15.phtml -http://ftpsearch.belnet.be/ftp/mirror2/ftp.cert.dfn.de/pub/vendor/sun/security-alert/security-alert-108.txt -http://ftpsearch.belnet.be/ftp/mirror2/ftp.cert.dfn.de/pub/vendor/sun/security-alert/security-alert-170.txt -http://www.tente.de/us/produkte/rubriksuche/ad000000699.htm -http://www.angelfire.com/ky/kysweetpea/ -http://yp.gates96.com/7/69/60/1.html -http://www.amulation.com/md-l-archive/199908/frm00208.html -http://yp.gates96.com/7/69/60/4.html -http://yp.gates96.com/7/69/60/33.html -http://yp.gates96.com/7/69/60/49.html -http://yp.gates96.com/7/69/60/71.html -http://nanjingnews.jlonline.com/nanjingnews/njrb/20000226/04tiyu.htm -http://yp.gates96.com/7/69/61/44.html -http://yp.gates96.com/7/69/61/69.html -http://yp.gates96.com/7/69/61/82.html -http://yp.gates96.com/7/69/61/85.html -http://yp.gates96.com/7/69/62/4.html -http://yp.gates96.com/7/69/63/34.html -http://yp.gates96.com/7/69/63/48.html -http://yp.gates96.com/7/69/63/66.html -http://yp.gates96.com/7/69/64/22.html -http://www.bemi-immobilien.de/IIM-Teil/Startseite/Gemeinsam/MarketingStrategie/Gemeinsam/Inserieren/Startseite/Gemeinsam/versicherungen/unfall/Gemeinsam/3d-service/info.htm -http://yp.gates96.com/7/69/64/26.html -http://yp.gates96.com/7/69/65/89.html -http://yp.gates96.com/7/69/67/11.html -http://yp.gates96.com/7/69/67/28.html -http://yp.gates96.com/7/69/67/33.html -http://yp.gates96.com/7/69/67/70.html -http://yp.gates96.com/7/69/68/22.html -http://yp.gates96.com/7/69/68/72.html -http://yp.gates96.com/7/69/68/92.html -http://members.tripod.com/~katenleo/fading21.html -http://yp.gates96.com/7/69/69/6.html -http://members.tripod.com/~katenleo/fading26.html -http://yp.gates96.com/7/69/69/36.html -http://yp.gates96.com/7/69/69/91.html -http://yp.gates96.com/7/69/69/98.html -http://www.tribuneindia.com/98oct11/head1.htm -http://fi.egroups.com/message/internet-sig-announce/3 -http://info.verwaltung.uni-freiburg.de/doc/susehilf/pak/paket_inhalt_libxml.html -http://www.planetweb.com/cgi-bin/listmanager.pl/NETLINK-CUST/archives/1998Mar30-Apr05.archive/Date/article-23.html -http://www.maasvlakte-cam.nl/webcams/11/katowice__poland/2000/06/13/ -http://www.eveclub.com/cgi-bin/eveclub.front/972959521459/Home -http://totalsports.aol.com/stats/bbo/int/20000413/nor.at.lou.box.html -http://totalsports.aol.com/stats/bbo/int/20000413/ott.at.buf.game.html -http://fi.egroups.com/message/stccg-badlands/67 -http://www.fogdog.com/cedroID/ssd3040183315704/nav/stores/books_videos/ -http://xf-bbs.hb.cninfo.net/~socrates/sportold/images/football/_vti_cnf/ -http://cisc.tu-graz.ac.at/igi/lehre/semD_ss99/gruppe3/node10.html -http://in.egroups.com/message/sfconsim-l/8643 -http://ftp.cc.chuo-u.ac.jp/home/pub/lang/perl/CPAN/modules/by-authors/Karl_Glazebrook/ExtUtils-F77-1.13.readme -http://ftp.cc.chuo-u.ac.jp/home/pub/lang/perl/CPAN/modules/by-authors/Karl_Glazebrook/PGPLOT-2.17.readme -http://coe.ier.hit-u.ac.jp/BibEc/data/Papers/wopwobaiu2243.html -http://coe.ier.hit-u.ac.jp/BibEc/data/Papers/wopwobaiu2386.html -http://books.hyperlink.co.uk/bookinfo/Travel_Journal/0864427972 -http://dbc.copystar.com.tw/DelphiChat/200001/msg0650.htm -http://dbc.copystar.com.tw/DelphiChat/200001/msg0655.htm -http://dbc.copystar.com.tw/DelphiChat/200001/msg0666.htm -http://dbc.copystar.com.tw/DelphiChat/200001/msg0673.htm -http://dbc.copystar.com.tw/DelphiChat/200001/msg0681.htm -http://dbc.copystar.com.tw/DelphiChat/200001/msg0692.htm -http://www.expage.com/page/cavypigsponser -http://kernel2.adver.com.tw/Counter/log/kernel2.adver.com.tw/SaveCounter/2000-10-05/13/?S=A -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=210&discrim=214,253 -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=2&discrim=247,212,237 -http://wwwtios.cs.utwente.nl/archive/wilyfans/frm01740.html -http://z-06.land-sbg.gv.at/pressebuero/lpb/unserland/apr00/3.htm -http://z-06.land-sbg.gv.at/pressebuero/lpb/unserland/apr00/52.htm -http://gladstone.uoregon.edu/~sola/Stories/ -http://adetti.iscte.pt/RSI/HowTo/Java/jdk1.2.1/docs/guide/2d/api-jpeg/serialized-form.html -http://ocean.ntou.edu.tw/search*chi/aSloan,+Richard+P.,+jt.+ed./asloan+richard+p/-5,-1,0,E/frameset&F=asloan+irving+j&2,,0 -http://ttzcomputers.subportal.com/sn/Programming/C_and_C___Tools_and_Components/13286.html -http://ttzcomputers.subportal.com/sn/Programming/C_and_C___Tools_and_Components/1551.html -http://ftp.uni-stuttgart.de/pub/unix/tools/system/top/m/?N=D -http://no.egroups.com/message/romtrade/5216 -http://dk.egroups.com/message/Gunsmithing/80 -http://www.msb.malmo.se/search*swe/dMichelsen,+Hans/dmichelsen+hans/-5,-1,0,B/frameset&F=dmichels+robert&1,1 -http://solar.rtd.utk.edu/friends/news/omri/1998/05/980506I.html(opt,mozilla,pc,russian,koi8,default) -http://www.geocities.co.jp/HeartLand/6163/link8.htm -http://tucows.austria.com/sync95_size.html -http://tucows.austria.com/adnload/1082_30337.html -http://www.hotelboulevard.com/fr/paris/standard/html7752b1d358fd6459ebca66776e896614/sessionLang/ANG/prov/browse/cp/75015/resultatSearch.html -http://210.178.135.1/netbbs/Bbs.cgi/nhic30872/qry/zka/B2-kB2-o/pno/0/qqo/000A/qqatt/^ -http://210.178.135.1/netbbs/Bbs.cgi/nhic30872/new/pno/0/pno/0/qqo/000A -http://cometweb01.comet.co.uk/do!tid=20&rtid=2&vsid=700&session=132041&mid=1000&rid=1060&cid=37030&chid=1713&url=eqqLmwlGltt5tkZHljbLqkZHlkrHhlZHdfjKYfkLlkZ5ljjLboZLbplG5ubLZDXLZolLl3l5jbqLlci5XqVLkXsLkao4tloHbmlLoq5 -http://polygraph.ircache.net:8181/http_-2www.webtechs.com/html-val-svc/f-agents.html -http://www.linux.com/networking/network/development/communications/server/distro/ -http://www.linux.com/networking/network/development/communications/server/competition/ -http://www.linux.com/networking/network/development/communications/server/certification/ -http://www.linux.com/networking/network/development/communications/server/future/ -http://www.linux.com/networking/network/development/communications/server/Updates/ -http://people.freebsd.org/~knu/cgi-bin/cvsweb.cgi/ports/net/epic4/pkg/Attic/ -http://polygraph.ircache.net:8181/mo/mo_links/http_-2www.whowhere.com/tax_cuts.html -http://www.gov.ie/iveagh/angloirish/bloodysunday/summary4.htm -http://polygraph.ircache.net:8181/http_-2www.real-e-video.com/ftp_-2ftp.mpgn.com/Gaming/ADND/Worlds/BirthRight/MailingListArchive/Contents.htm -http://www.centc251.org/forums/aca-1/dispatch.cgi/isowg4/showNextUnseen/fol/100001/1323398 -http://www.centc251.org/forums/aca-1/dispatch.cgi/isowg4/folderFrame/100008/0/def/1323639 -http://user.alpha.co.kr/~selly/profile/main2.htm -http://polygraph.ircache.net:8181/company/http_-2www.aaainvestments.com/http_-2triad.cyberserv.com/http_-2207.90.134.3/miami/ -http://ring.htcn.ne.jp/pub/FreeBSD/FreeBSD-current/ports/archivers/zip/ -http://www.medoc-ias.u-psud.fr:81/synoptic/gif/950902/?S=A -http://in.egroups.com/message/GQRP/975 -http://idgnow.uol.com.br/idgnow/pcnews/2000/07/0046 -http://us.mandrakesoft.com/cgi-bin/cvsweb.cgi/kdebase/po/Attic/kdmconfig.pot?only_with_tag=beta1-0_2 -http://us.mandrakesoft.com/cgi-bin/cvsweb.cgi/kdebase/po/Attic/kwm.pot?only_with_tag=beta1-0_2 -http://lists.omnipotent.net/mysql/199912/msg02189.html -http://kyoto.cool.ne.jp/ryou_1125/lmax/list2.html -http://www.infodog.com/RESULTS/1998092302/1998092302800.HTM -http://www.infodog.com/RESULTS/1998092302/1998092302575.HTM -http://bedandbreakfast.com/bbc/p618230.asp -http://solaris.license.virginia.edu/os_product_patches/patches/5.5.1/103640-28/SUNWscpu/ -http://www.secinfo.com/d1Z36p.5n.htm -http://cn.egroups.com/messages/conscious_creation/2087 -http://www.brio.de/BRIO.catalog/39fdb4fb08541c02273fd472aa7806a2/UserTemplate/13 -http://www.chaos.dk/sexriddle/o/m/e/z/ -http://cgi.tbs.co.jp/cdtv/songdb/song1897-j.html -http://www.niwl.se/wais/new/12/12116.htm -http://bsdweb.pasta.cs.uit.no/bsdweb.cgi/~checkout~/pkgsrc/editors/vim-xaw/pkg/?sortby=log -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=boguerait&l=fr -http://www.medbulletin.com/scripts/medscape/jobsbystate.pl/diima00001/ND -http://ttz.soyou.edu.cn/tgyd/item/2000-05-31/3214.html -http://ttz.soyou.edu.cn/tgyd/item/2000-05-25/2973.html -http://ttz.soyou.edu.cn/tgyd/item/2000-05-23/2825.html -http://javatest.a-net.nl/servlet/pedit.Main/http://salon.com/tech/feature/2000/02/25/chatscan/ -http://javatest.a-net.nl/servlet/pedit.Main/http://www.wired.com/news/news/technology/story/20734.html -http://www.jps.net/fehlberg/diem9.html -http://chellobe.linux.tucows.com/x11html/adnload/9798_3876.html -http://chellobe.linux.tucows.com/x11html/preview/58190.html -http://internet.exit.de/akpolitik/Extern.htm -http://www.launch.com/music/albumpage/pvn_content/0,5258,163242_track,00.html -http://merumo.ne.jp/backno/i/00005163/20001001060103_024859.html -http://ftpsearch.belnet.be/mirrors/ftp.isc.org/pub/usenet/control/bc/?N=D -http://www-lehre.inf.uos.de/manuals/jdk1.2/docs/api/javax/swing/text/html/parser/class-use/Element.html -http://ftp.tku.edu.tw/OS/FreeBSD/ports/biology/deft/distinfo -http://javatest.a-net.nl/servlet/pedit.Main/http://www.cavejunction.com/phones/gower1.html -http://javatest.a-net.nl/servlet/pedit.Main/http://www.cavejunction.com/phones/contel1.html -http://www.allkorea.co.jp/cgi-bin/allkorea.front/972959966349/Catalog/1000002 -http://yp.gates96.com/5/82/41/1.html -http://yp.gates96.com/5/82/41/52.html -http://yp.gates96.com/5/82/41/59.html -http://yp.gates96.com/5/82/42/40.html -http://yp.gates96.com/5/82/42/73.html -http://yp.gates96.com/5/82/43/4.html -http://yp.gates96.com/5/82/43/20.html -http://yp.gates96.com/5/82/44/60.html -http://yp.gates96.com/5/82/44/95.html -http://yp.gates96.com/5/82/45/36.html -http://yp.gates96.com/5/82/45/43.html -http://yp.gates96.com/5/82/45/90.html -http://yp.gates96.com/5/82/46/37.html -http://yp.gates96.com/5/82/46/83.html -http://yp.gates96.com/5/82/47/22.html -http://yp.gates96.com/5/82/47/53.html -http://yp.gates96.com/5/82/48/8.html -http://yp.gates96.com/5/82/48/23.html -http://yp.gates96.com/5/82/48/41.html -http://yp.gates96.com/5/82/48/76.html -http://yp.gates96.com/5/82/49/5.html -http://yp.gates96.com/5/82/49/22.html -http://yp.gates96.com/5/82/49/37.html -http://yp.gates96.com/5/82/49/39.html -http://yp.gates96.com/5/82/49/65.html -http://yp.gates96.com/5/82/49/90.html -http://www.mirror.kiev.ua:8084/paper/1998/35/1251/power.htm -http://www.science.uva.nl/pub/NetBSD/NetBSD-current/pkgsrc/textproc/html/Makefile -http://www.fiss.at/1Root/Kontinent/6/Staat/7/Bundesland/16/Ort/708/Infrastruktur/7435/Homepage/homepage...1.html -http://linux.tnc.edu.tw/CPAN/authors/id/C/CH/CHOGAN/Apache-SetWWWTheme-1.02.readme -http://linux.tnc.edu.tw/CPAN/authors/id/C/CH/CHOGAN/Apache-SetWWWTheme-1.04.readme -http://linux.tnc.edu.tw/CPAN/authors/id/C/CH/CHOGAN/Apache-SetWWWTheme-1.05.readme -http://wufs.wustl.edu/vlander/vl_0002/browse/html/B0XX/22b090b4.htm -http://www.dnet.org/My_Locality/View_Statement.dnet/OH/43230-1863&SubjectItemID=6406&IssueID=47541&ElectionActivityID=4443&SubjectHolder=3462&type=Office&debate=yes -http://members.tripod.co.jp/suguruE/_private/ -http://members.tripod.lycos.nl/Kreeklaan/id19_cf.htm -http://forums.multimania.fr/general/login/login.phtml?_login=%2Flire%2Fjeuxvideospro%2Findex.phtml%3Fcollapse%3D1 -http://excite.de.netscape.com/jobs/katalog/30434 -http://excite.de.netscape.com/jobs/katalog/27370 -http://excite.de.netscape.com/jobs/katalog/127 -http://yp.gates96.com/2/54/20/79.html -http://yp.gates96.com/2/54/21/27.html -http://yp.gates96.com/2/54/22/14.html -http://yp.gates96.com/2/54/22/48.html -http://yp.gates96.com/2/54/22/78.html -http://yp.gates96.com/2/54/23/20.html -http://yp.gates96.com/2/54/23/62.html -http://yp.gates96.com/2/54/23/69.html -http://yp.gates96.com/2/54/24/1.html -http://yp.gates96.com/2/54/24/61.html -http://yp.gates96.com/2/54/24/95.html -http://yp.gates96.com/2/54/25/2.html -http://yp.gates96.com/2/54/25/16.html -http://yp.gates96.com/2/54/25/53.html -http://yp.gates96.com/2/54/25/67.html -http://yp.gates96.com/2/54/25/94.html -http://yp.gates96.com/2/54/26/3.html -http://yp.gates96.com/2/54/26/30.html -http://yp.gates96.com/2/54/26/65.html -http://yp.gates96.com/2/54/27/31.html -http://yp.gates96.com/2/54/27/41.html -http://yp.gates96.com/2/54/27/53.html -http://yp.gates96.com/2/54/27/71.html -http://yp.gates96.com/2/54/27/79.html -http://yp.gates96.com/2/54/27/80.html -http://yp.gates96.com/2/54/28/13.html -http://yp.gates96.com/2/54/28/14.html -http://yp.gates96.com/2/54/28/24.html -http://yp.gates96.com/2/54/28/34.html -http://yp.gates96.com/2/54/28/96.html -http://yp.gates96.com/2/54/29/49.html -http://ftp.sunet.se/pub/NT/mirror-microsoft/KB/Q134/3/40.TXT -http://members.tripod.com/joellogan/_cranedisc/000001d9.htm -http://members.tripod.com/joellogan/_cranedisc/000001cd.htm -http://www.ualberta.ca/CNS/RESEARCH/Software/SAS/vms/z-inf-zd.htm -http://www1.galaxy.com/galaxy/Leisure-and-Recreation/Games/Computer-Games/Titles/Virtual-Reality/Golf.html -http://www1.galaxy.com/galaxy/Leisure-and-Recreation/Games/Computer-Games/Titles/Virtual-Reality/Red-Planet.html -http://www.uni-duesseldorf.de/ftp/ftp/software/opt/zlib-1.1.2/?N=D -http://acbanks.know-where.com/acbanks/cgi/selection?place=Cavecreek&state=AZ -http://yp.gates96.com/10/26/70/49.html -http://yp.gates96.com/10/26/70/83.html -http://yp.gates96.com/10/26/72/40.html -http://yp.gates96.com/10/26/74/89.html -http://yp.gates96.com/10/26/75/15.html -http://yp.gates96.com/10/26/75/19.html -http://yp.gates96.com/10/26/76/87.html -http://yp.gates96.com/10/26/78/18.html -http://yp.gates96.com/10/26/78/76.html -http://yp.gates96.com/10/26/78/78.html -http://yp.gates96.com/10/26/78/81.html -http://cpan.nitco.com/modules/by-module/Devel/ADESC/Pod-DocBook-0.03.readme -http://www2.el-mundo.es/nuevaeconomia/2000/NE047/NE047-03b.html -http://www.familyeducation.com/whatworks/inappr_material/entry/1,2549,1-10119-1948-3469,00.html -http://ftp.nodomainname.net/pub/linux/daemons/raid/beta/ -http://192.80.57.161/corp/press/vannet.html -http://digilander.iol.it/mirkodeli/Stagioni/CI6_index.html -http://www.world-of-webs.de/magdeburg-in-bildern/_inhalt/_statnif/rechts/035.htm -http://ftpsearch.belnet.be/mirrors/src.doc.ic.ac.uk/usenet/usenet-by-hierarchy/rec/travel/?D=A -http://mirrortucows.technet.it/winme/netmiscme_rating.html -http://my.egroups.com/message/imperiumlarp/3148 -http://ep.com/js/about/c7857/b0/34551.html -http://webcrawler-sports.excite.com/ncaab/matchup/pafmax/ -http://www2.dbusiness.com/Quotes/1,1125,MSP_CORE,00.html?Ticker=CORE -http://tucows.wlink.com.np/regist95_size.html -http://www.babyheirlooms.com/catalog/htmlos.cat/041162.1.5960744054 -http://www.v2music.com/Scripts/WebObjects-ISAPI.dll/V2_New_Publisher.woa/71113000008423000000947720000021551/Labels.wo/168310000011551/1.0.1/3/Webobjects1 -http://www.v2music.com/Scripts/WebObjects-ISAPI.dll/V2_New_Publisher.woa/71113000008423000000947720000021551/Labels.wo/168310000011551/1.1.3.0.0/3/Webobjects1 -http://www.adcentral.com/cgi-bin/w3com/pws/adsites/vNhIXgVh_sji0rjcKc_GbuSlgBaEnCmKXU4ARmeefaqktCE3zwLsoXKDK_dlzoBzk2Ygr2cAuqN51PKOA0JxjzLEpPe-kic9TtvUJMbXG9Dlw8SggmHugQpwzjo-NiuofbUz4obq -http://ring.omp.ad.jp/archives/NetBSD/NetBSD-current/src/distrib/i386/floppies/ramdisk-big/Makefile -http://unofficial.capital.edu/students/alittle/ -http://213.36.119.69/do/session/153005/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/reserver/promotions/promo9.html -http://213.36.119.69/do/session/153005/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/GB_EN/ -http://www.riello-hamburg.de/mSerieRSBLU_130_465kw.htm -http://tucows.knoware.nl/winnt/filesplitnt_license.html -http://www.kaos.dk/sex-riddle/k/a/k/i/n/h/b/b/ -http://www.kaos.dk/sex-riddle/k/a/k/i/n/h/b/c/ -http://caller-times.com/1999/july/13/today/national/3143.html -http://news.fm365.com/jiaoyu/20000804/113896.htm -http://variety.studiostore.com/browse/ILOVELUCY/CAP/b.FAVORITES%20NOSTALGI%20CLASTV%20ILOVELUCY/s.qyPsT2fz -http://www.ferien-immobilien.de/bayern/ingolstadt/Verkauf/Gemeinsam/Immolink/3d-service/Private-IB/Startseite/Gemeinsam/vertriebspartner.htm -http://jefferson.village.virginia.edu/wax/japanese/0front/cd/1/1a2a9a2.html -http://space.tin.it/scuola/ermenegh/thewall/il2.htm -http://www.maasvlakte-cam.nl/webcams/17/kremlin__moscou__russia/2000/02/29/?D=A -http://pub17.ezboard.com/fecilordsoflightgeneral.showMessage?topicID=211.topic -http://pub17.ezboard.com/fecilordsoflightgeneral.showMessage?topicID=214.topic -http://pub17.ezboard.com/fecilordsoflightgeneral.showMessage?topicID=210.topic -http://www.kaos.dk/sexriddle/x/u/e/s/p/ -http://www.kaos.dk/sexriddle/x/u/e/s/q/ -http://amc.hollywood.com/maltin/k/kellysheroes-1970.htm -http://amc.hollywood.com/maltin/k/kidsarealrightthe-1979.htm -http://amc.hollywood.com/maltin/k/killingofsistergeorgethe-1968.htm -http://amc.hollywood.com/maltin/k/kingandcountry-1964.htm -http://amc.hollywood.com/maltin/k/kinglear-1987.htm -http://amc.hollywood.com/maltin/k/kingofthezombies-1941.htm -http://amc.hollywood.com/maltin/k/kingqueenknave-1972.htm -http://amc.hollywood.com/maltin/k/kissthe-1988.htm -http://www.egroups.com/login.cgi?login_target=%2Fgroup%2Ft-ida -http://polygraph.ircache.net:8181/faculty/http_-2www.stopwaste.org/freecontent.html -http://kutschen.de/Schoner/literature/Literatur/models/collections/ -http://www.incestpornstories.com/cum-sex-pics/anal-sexone-night-stand/big-bonedpleasantly-plump/smallwomen/{hardcorelink} -http://www.nytimes.com/library/financial/102897market-turmoil.html -http://polygraph.ircache.net:8181/services/define/http_-2www.microsoft.com/ie/http_-2www.ci.alameda.ca.us/main_left.html -http://polygraph.ircache.net:8181/services/define/http_-2www.microsoft.com/ie/http_-2www.ci.alameda.ca.us/dream.htm -http://www.chiayi.gob.tw/ -http://www.maas.ccr.it/cgi-win/hiweb.exe/a17/d77/b77,c,4d,51,51,df1,df1,,4e,2b62,4d,4e,2b62,, -http://citeseer.nj.nec.com/cidcontext/6361 -http://citeseer.nj.nec.com/cidcontext/6456 -http://utenti.tripod.it/Psychozine/Grunge/Creed_MyOwnPrison.htm -http://tucows.multiweb.net/winme/adnload/138210_30315.html -http://tucows.multiweb.net/winme/adnload/138190_29551.html -http://tucows.multiweb.net/winme/adnload/138218_29576.html -http://tucows.multiweb.net/winme/preview/138219.html -http://playsky.home.chinaren.com/star_region/11.htm -http://tucows.phnet.fi/winme/adnload/137614_29054.html -http://www.fortunecity.com/millennium/blyton/118/www.bih.net.ba/~sda -http://www11.informatik.tu-muenchen.de/lehre/lectures/ws2000-01/hypermedia/extension/html-kurz/hm2.2.4.2-navigation.html -http://ads.puntopartenza.com/cgi-bin/redirect.cgi/31033737 -http://www.eud.com/1997/03/20/20324A.shtml -http://ftp.net.uni-c.dk/pub/linux/mandrake/i586/Mandrake/mdkinst/usr/share/locale/gl/?N=D -http://no.sport.yahoo.com/s/snowboard-1.html -http://www.egroups.com/login.cgi?login_target=%2Fmessages%2Fshamanism%2F1311 -http://yp.gates96.com/5/82/70/13.html -http://yp.gates96.com/5/82/70/74.html -http://yp.gates96.com/5/82/71/30.html -http://yp.gates96.com/5/82/71/44.html -http://yp.gates96.com/5/82/72/22.html -http://yp.gates96.com/5/82/72/72.html -http://yp.gates96.com/5/82/72/88.html -http://yp.gates96.com/5/82/73/60.html -http://yp.gates96.com/5/82/73/79.html -http://yp.gates96.com/5/82/74/21.html -http://yp.gates96.com/5/82/74/59.html -http://yp.gates96.com/5/82/74/62.html -http://yp.gates96.com/5/82/74/75.html -http://yp.gates96.com/5/82/74/78.html -http://yp.gates96.com/5/82/75/30.html -http://yp.gates96.com/5/82/75/32.html -http://yp.gates96.com/5/82/75/82.html -http://yp.gates96.com/5/82/76/16.html -http://yp.gates96.com/5/82/76/43.html -http://yp.gates96.com/5/82/76/72.html -http://yp.gates96.com/5/82/77/48.html -http://yp.gates96.com/5/82/77/99.html -http://yp.gates96.com/5/82/78/73.html -http://yp.gates96.com/5/82/79/28.html -http://yp.gates96.com/5/82/79/70.html -http://yp.gates96.com/5/82/79/83.html -http://polygraph.ircache.net:8181/http_-2www.microsoft.com/ie/http_-2www.petrophysics.com/http_-2www.uio.no/~thomas/lists/info.html -http://www.munster-express.ie/000623/sports1.htm -http://cisne.sim.ucm.es/search*spi/aThiollier,+François-Joël,+int./athiollier+francois+joel+int/-5,-1,0,B/marc&F=athion+soriano+molla+dolores&2,,2 -http://www.zjdaily.com.cn/gb/2000/10/05/zjrb0625/guoji/6.htm -http://commerce.was-inc.com/cgi-bin/abtwsam.dll/LbkWebCommerceStoreCategories-BBC70A38_9815_E7A26CDF19A4AB167DD4B69EFB5B17FC -http://commerce.was-inc.com/cgi-bin/abtwsam.dll/LbkWebCommerceUserProfile-BBC70A38_9815_E7A26CDF19A4AB167DD4B69EFB5B17FC -http://www.shopworks.com/tools/index.cfm/action/search/userid/0003875B-2E5B-19FE-AF65010C0A0A8CF2 -http://www.doofpot.nl/~lists/bugtraq/October-99/frm00087.html -http://shop.citde.net/b79923.htm -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=divinizzarono&l=it -http://pub8.ezboard.com/fwrestlecarwwf.showAddReplyScreenFromWeb?topicID=38.topic -http://amrr.com/agents/contact.html?Agents_id=4046 -http://www.intellicast.com/LocalWeather/World/UnitedStates/Southeast/NorthCarolina/CarolinaBeach/RAINcast/d1_12/bannerAd.shtml -http://www.ferien-immobilien.de/schleswig-holstein/nordfriesland/Verkauf/Gemeinsam/versicherungen/gebaeude/Allgemeine-IB/IIM-Teil/Startseite/Gemeinsam/Inserieren/inserieren.htm -http://www.ferien-immobilien.de/schleswig-holstein/nordfriesland/Verkauf/Gemeinsam/versicherungen/gebaeude/Allgemeine-IB/IIM-Teil/Startseite/Gemeinsam/feedback.html -http://de.excite.com/jobs/katalog/10349 -http://pub16.ezboard.com/frealitycheck95307youadoreus.showAddReplyScreenFromWeb?topicID=33.topic -http://www.maas.ccr.it/cgi-win/hiweb.exe/a17/d2424/b77,e,4d,51,51,df1,df1,,978,,51,978,815,,51,815, -http://dk.egroups.com/message/noholdsbarred/2138 -http://kr.news.yahoo.com/headlines/so/20001029/hankook/2000102919513187338.html -http://www.buybuddy.com/sleuth/27/1/11002/508910/ -http://yp.gates96.com/13/95/50/10.html -http://yp.gates96.com/13/95/50/47.html -http://yp.gates96.com/13/95/51/16.html -http://yp.gates96.com/13/95/51/17.html -http://yp.gates96.com/13/95/51/21.html -http://yp.gates96.com/13/95/51/76.html -http://yp.gates96.com/13/95/53/5.html -http://yp.gates96.com/13/95/54/17.html -http://yp.gates96.com/13/95/54/44.html -http://yp.gates96.com/13/95/54/67.html -http://yp.gates96.com/13/95/54/80.html -http://yp.gates96.com/13/95/55/67.html -http://yp.gates96.com/13/95/56/15.html -http://yp.gates96.com/13/95/56/91.html -http://yp.gates96.com/13/95/57/9.html -http://yp.gates96.com/13/95/57/12.html -http://yp.gates96.com/13/95/57/24.html -http://yp.gates96.com/13/95/57/30.html -http://yp.gates96.com/13/95/57/46.html -http://yp.gates96.com/13/95/58/38.html -http://yp.gates96.com/13/95/58/52.html -http://yp.gates96.com/13/95/58/80.html -http://yp.gates96.com/13/95/59/40.html -http://yp.gates96.com/13/95/59/78.html -http://ftp.net.uni-c.dk/pub/linux/mandrake/i586/Mandrake/mdkinst/usr/share/locale/gv/?S=A -http://home.swipnet.se/~w-10458/sksida.htm -http://www.irishnews.com/k_archive/260799/nnews14.html -http://dennou-q.geo.kyushu-u.ac.jp/library/Linux/debian-jp/dists/potato-jp/contrib/binary-all/admin/?M=A -http://ayasii.virtualspace.net/html/1104/11041141_syuuei_yosimi008.htm -http://ayasii.virtualspace.net/html/1104/11041104_nakamura_yuma_2_027.htm -http://kikakusvr3.city.yokohama.jp/yhspot/ysc/prelaunch.html -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=0,1-20,0-9,1-9,2 -http://209.52.189.2/discussion.cfm/disco_music/7738/79749 -http://www.du-et.net/cgi/mail.cgi?NickName=coota -http://ustlib.ust.hk/search*chi/a%7B214c7d%7D%7B213837%7D%7B213c44%7D%7B213779%7D%7B214267%7D%7B21586d%7D%7B21515b%7D%7B21517c%7D%7B213966%7D/a{214c7d}{213837}{213c44}{213779}{214267}{21586d}{21515b}{21517c}{213966}/7,-1,0,B/browse -http://user.alpha.co.kr/~backspin/CGI-BIN/upload/files/ -http://194.174.50.23/cgi-bin/FisRun/InsertExhibitorIntoNotebook/1/interpack99/e/1217 -http://www.paxcapital.com/news/datacenter/200010/27/20001027180508_01.shtml -http://www.paxcapital.com/news/datacenter/200010/27/20001027175828_07.shtml -http://www.paxcapital.com/news/datacenter/200010/27/20001027173309_53.shtml -http://www.paxcapital.com/news/datacenter/200010/27/20001027165004_52.shtml -http://genforum.genealogy.com/cgi-bin/print.cgi?lantz::325.html -http://mirror.cc.utsunomiya-u.ac.jp/mirror/FreeBSD/ports/alpha/packages-current/x11-toolkits/?D=A -http://hotop.on.net.cn/diguo/club/disp.asp?owner=A205&ID=914 -http://www.babyheirlooms.com/catalog/htmlos.cat/041137.1.3501106310 -http://debian.linux.org.tw/debian/dists/frozen/non-free/binary-m68k/mail/?N=D -http://cafe5.daum.net/Cafe-bin/Cafe.cgi/member?cafe=LOTTEcleaning -http://www-d0.fnal.gov/cgi-bin/cvsweb.cgi/root_gui/data/?sortby=date -http://www.concentric.net/~Psaros/DbzUncensored/editorial/edit06-07-98.html -http://www.jobvillage.com/channel/jobs/travel/travel_guide/b.4897.g.5093.html -http://www.jobvillage.com/channel/jobs/travel/travel_guide/b.4897.g.5070.html -http://www.cricket.org/link_to_database/ARCHIVE/1999/OTHERS+ICC/NL_LOCAL/EERSTEKL/VCC_ASIAN-SHAH_EERSTEKL_16MAY1999.html -http://health.phinfo.sc.cn/navigator/illness_treatment/diseases_conditions/bone_diseases/spinal_column_injury/default.htm -http://cn.egroups.com/message/dfwscan/1412 -http://www.babyheirlooms.com/catalog/htmlos.cat/001255.1.1999922108 -http://ibm1.cicrp.jussieu.fr/ibmc/classref/ref/UFullStopNumber_DSC.htm -http://pda.tucows.fi/palm/adnload/33651_21862.html -http://www.fogdog.com/cedroID/ssd3040183330232/nav/products/nhl/chicago_blackhawks/fan/gender/fashion_polo_shirts/ -http://www.fogdog.com/cedroID/ssd3040183330232/nav/products/nhl/chicago_blackhawks/fan/gender/nylon_jackets/ -http://www.5a8.com/book/wg/zpj/d/delaisai/mgbj/004.htm -http://www.5a8.com/book/wg/zpj/d/delaisai/mgbj/050.htm -http://jars.developer.com//classes/jresout.cgi?resource=1133 -http://dwp.bigplanet.com/billbritton/files/edit.nhtml -http://members.tripod.co.jp/snow4/?D=A -http://www.lanoticia.com.ni/cronologico/2000/julio/15sabado/capital/capital5.html -http://mayu.sourceforge.net/cgi-bin/nph-ml.cgi/000/http/www.geocrawler.com/archives/3/151/1996/4/0/870960/ -http://mayu.sourceforge.net/cgi-bin/nph-ml.cgi/000/http/www.geocrawler.com/archives/3/151/1996/4/0/870950/ -http://ftp.ccu.edu.tw/pub/packages/dns/bind/src/8.1.1/ -http://www.chez.com/photographies/photos/paysage/page8.htm -http://www.ayto-malaga.es/Organismos/Urbanismo/PGMOM/Hojas/calificacion/3/47/34734.htm -http://www.symatrixinc.com/website/website.nsf/0/3e40df86fb357cd5882568720079613f!OpenDocument&ExpandSection=3,24,5,18 -http://www.symatrixinc.com/website/website.nsf/0/3e40df86fb357cd5882568720079613f!OpenDocument&ExpandSection=9,24,5,18 -http://variety.studiostore.com/browse/STARWARSTRIL/PHOTO/b.MOVIES%20STARWARSSAGA%20STARWARSTRIL/s.5FhZToe4 -http://www.stud.ntnu.no/~kjonigse/pod/ -http://eastday.com/epublish/gb/paper10/20001025/class001000011/hwz225792.htm -http://eastday.com/epublish/gb/paper10/20001025/class001000011/hwz225253.htm -http://www.jamba.de/KNet/_KNet-KdS8j1-IHd-13g8y/browse.de/node.0/cergpnwyt -http://www.la-verdad.com/pg000828/suscr/primera.htm -http://www.centc251.org/forums/aca-1/dispatch.cgi/hsi/listUnseen/fol/100020/20,0/1338881 -http://ftp.du.se/disk4/FreeBSD/ports/ports/japanese/libicq/pkg-comment -http://www.geocities.com/SunsetStrip/Towers/2395/ -http://www.geocities.com/joanna_luo -http://www.geocities.com/eric_wang_tafe -http://www.geocities.com/shsugiharto -http://wynnsystems.com/79I_5ase/seek/modifyUser.html -http://www.uk.cricket.org/link_to_database/INTERACTIVE/REVIEWS/BOOKS/barry14.html -http://perso.wanadoo.fr/alain.falgas/poesie1.htm -http://www.linux.com/networking/network/windows_nt/support/tools/SAP/ -http://www.rdnet.nl/provstaten1999/491ps.html -http://www.thisislancashire.co.uk/lancashire/archive/1998/03/19/FEATURES3VQ.html -http://myhome.naver.com/myclass46 -http://www.bride.ru/htcgi/ladies/in-26-30/index3.html -http://www.internet-verzeichnis.de/branchen/schuhreparaturen/nordrhein-westfalen/ -http://dk.egroups.com/post/SonyMavica?act=reply&messageNum=3370 -http://www.sneezy.org/Databases/Composers/Instrumentation/008889.html -http://www.sneezy.org/Databases/Composers/Instrumentation/009161.html -http://fatema2.math.nat.tu-bs.de/doc/sdb/de/html/keylist.LARGEEBDA.html -http://ssb.no/kommuner/hoyre_side.cgi?region=1931 -http://www.egroups.com/subscribe/mentemalata -http://www.debian.org.cn/Bugs/db/67/67056-b.html -http://dk.egroups.com/message/ssrdistribution/775?source=1 -http://link.fastpartner.com/do/session/600429/vsid/2870/tid/2870/cid/136966/mid/1060/rid/1926/chid/2870/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/shopnett.php -http://ftp.uk.debian.org/debian/dists/stable/main/binary-arm/text/?D=A -http://www.bemi-immobilien.de/IIM-Teil/Startseite/Top-Darlehens-Konditionen/Gemeinsam/3d-service/Startseite/Gemeinsam/erreichenPartner/Top-Darlehens-Konditionen/anforderungsformular.htm -http://www.fujian-window.com/Fujian_w/news/mdrb/000816t/1_4.html -http://scholar.lib.vt.edu/VA-news/WDBJ-7/script_archives/98/0798/070498/?D=A -http://polygraph.ircache.net:8181/services/define/html/President.asp -http://old-maps.co.uk/10lancs191/HTML/nav_19034001g.htm -http://www.hanter21.co.kr/NetBBS/Bbs.dll/prdata/lst/qqa/f/qqo/000D/zka/B2-kB2-r -http://w3.webtourist.net/travel/europe/italy/milan/quarkallsuites.htm -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=9,5+0,0-9,6-0,1 -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=brillantant&l=fr -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=brillantais&l=fr -http://www.mathquest.com/~sarah/HTMLthreads/geopre.descriptions.html -http://www.retrobytes.org/classiccmp/9706/msg00827.html -http://www.retrobytes.org/classiccmp/9706/msg01408.html -http://www.rdnet.nl/provstaten1999/552ps.html -http://retailer.gocollect.com/do/session/1912828/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/checkout/shopping_cart.asp -http://retailer.gocollect.com/do/session/1912828/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/exclusives/limited_editions.asp -http://retailer.gocollect.com/do/session/1912828/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/company_info/privacy_policy.asp -http://de.news.yahoo.com/000322/36/nfqj.html -http://www.kl.gz.cn/~cco/FUNA022K.htm -http://www.launch.com/music/artistpage/pvn_content/0,5219,1013738_videos,00.html -http://www14.freeweb.ne.jp/play/kiryuus/keith-burn1-end.htm -http://variety.studiostore.com/help/b.MOVIES%20STARWARSSAGA%20STARWARSTRIL/s.BmesFhV7 -http://biblioteca.upv.es/bib/doc/doc_siglibros/1828105/26/25/////MLTPAID/Materia%20Lengua%20inglesa%20técnica:%20254/V -http://www.outpersonals.com/cgi-bin/w3com/pws/out/_AhIPkFr0_eq7P6TUMbkQGJgpHJOXqtNLZQ55qFmeZARJaJUKHP9RBX3tPWaLEWVLZ_-PAErnbukTTJzs-x0hew4G_r3S85M8fDFaJcIVi3EA4TxNjTbbGIaSLhr8VdNICuBwhPmgZEt662B -http://www.outpersonals.com/cgi-bin/w3com/pws/out/IxhI6dPotFAZDugwPbV2pjvsgvIvAP-oFtIZfMptEKMo48cUO8RmvG3Akuk2tktzM_RYBY3yIQE6nl7I2moLEV_nScO7wTfWpFfPR7LHZ3ntJxKS8-a_IukWT4q_o6mjhGw8SSwm -http://www.rge.com/pub/languages/perl/clpa/1995-11/171 -http://www.rge.com/pub/languages/perl/clpa/1995-11/186 -http://www.newmgm.com/cgi-bin/c2k/title_talent.html&id=146091&title_star=FOURFEAT -http://www.koreaweekly.co.kr/entertain/book/200009/en20000922185938E701133.htm -http://www.koreaweekly.co.kr/entertain/book/200008/en20000824183337E701112.htm -http://www.genome.wustl.edu:8021/pub/gsc10/nci/wl/wl72/?N=D -http://yp.gates96.com/13/50/70/33.html -http://yp.gates96.com/13/50/70/36.html -http://yp.gates96.com/13/50/70/53.html -http://yp.gates96.com/13/50/71/74.html -http://yp.gates96.com/13/50/72/13.html -http://yp.gates96.com/13/50/72/17.html -http://yp.gates96.com/13/50/72/83.html -http://yp.gates96.com/13/50/73/48.html -http://yp.gates96.com/13/50/73/79.html -http://yp.gates96.com/13/50/73/96.html -http://yp.gates96.com/13/50/74/14.html -http://yp.gates96.com/13/50/74/57.html -http://yp.gates96.com/13/50/75/13.html -http://yp.gates96.com/13/50/75/19.html -http://yp.gates96.com/13/50/75/30.html -http://yp.gates96.com/13/50/75/42.html -http://yp.gates96.com/13/50/75/53.html -http://yp.gates96.com/13/50/75/90.html -http://yp.gates96.com/13/50/77/45.html -http://yp.gates96.com/13/50/77/51.html -http://yp.gates96.com/13/50/77/79.html -http://yp.gates96.com/13/50/78/12.html -http://yp.gates96.com/13/50/78/47.html -http://yp.gates96.com/13/50/78/69.html -http://yp.gates96.com/13/50/78/96.html -http://www.tel.de/s/M/MSS.htm -http://linux.usu.edu/LDP/LDP/LG/issue23/shoham/node4.html -http://www.monaco.gouv.mc/dataweb/gouvmc.nsf/(NewsActu)/d28eaee29b3287d4c1256905004e1ef1!OpenDocument&ExpandSection=9,3,10.1,7,10.4,10.2,5,8,4 -http://fi.egroups.com/post/romtrade?act=reply&messageNum=5198 -http://www.outpersonals.com/cgi-bin/w3com/pws/out/erhIHCd-6X--WwWIQBR9tYYraJWo8ugur0GyAl8pg21sE-lotAURKodv9HAYnRuTT4ZM0aCKsA5ZVLlq8sgiFNqA4DyAY_GVTyPIEARrzArj8JrWabVCSpg03afQ_Xg3DaCQA17080y7T4EZ -http://oneplace.adbureau.net/accipiter/adclick/site=ONEPLACE/area=INDEX/POSITION=BLOCK_1/AAMSZ=120x90/ACC_RANDOM=619055616855 -http://cafe6.daum.net/Cafe-bin/Bbs.cgi/MyLoveNYpds/qry/zka/B2-kB23m/qqatt/^ -http://cafe6.daum.net/Cafe-bin/Bbs.cgi/MyLoveNYpds/qry/zka/B2-kB2-s/qqatt/^ -http://sas.uoregon.edu/sashtml/proc/z0292518.htm -http://www02.geocities.co.jp/PowderRoom-Rose/1346/flower02image.html -http://www02.geocities.co.jp/PowderRoom-Rose/1346/sozaiheart2.html -http://www.jamba.de/KNet/_KNet-sXN8j1-9Hd-13ej3/admLogin.de/node.0/cdn3r3qy3 -http://iccardreader.co.kr/ -http://online.linux.tucows.com/conhtml/ser_irc_size.html -http://www.fogdog.com/cedroID/ssd3040183339940/nav/products/winter_sports/1b/bibs/ -http://www.fogdog.com/cedroID/ssd3040183339940/nav/products/winter_sports/1c/jackets/ -http://www.fogdog.com/cedroID/ssd3040183339940/nav/products/winter_sports/1d/heavyweight_tops/ -http://www.affiliate.hpstore.hp.co.uk/do/session/380883/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/assistance/entry.asp -http://www.kaos.dk/sex-riddle/k/a/k/i/l/y/t/c/ -http://www.kaos.dk/sex-riddle/k/a/k/i/l/y/t/o/ -http://ftp1.se.debian.org/debian/dists/stable/main/disks-alpha/2.2.8-2000-03-08/jensen/ -http://213.36.119.69/do/session/153006/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/FR/contact/recrute.htm -http://www10.freeweb.ne.jp/photo/myukun2/cosplay/000130/0130_40.htm -http://l-infonet.phkk.fi/fi/TIETOPALVELUT/JULKINEN+HALLINTO/tiedonhaku/artikkelit/hakupalvelut/l%E4%E4ketiede/tietokannat/ -http://202.109.72.57/article/20000903/67099.htm -http://www.outpersonals.com/cgi-bin/w3com/pws/out/5xhIsrJ5LBhn_gBogN2-VgQ1DA6WvBlLMjSoxYeQAJ1ig69sK1i1DhQ5hA3iOw7y6Wb_HDA2rkG5aJy9DrUMZxD31cyUqEqg7LeZ3pssb70DsyPc1sGCTVIRFBz1Nb_1ikEcJ3ds -http://ftp.gwdg.de/pub/misc/standards/infomagic/nist/oiw/agreemnt/read_me.txt -http://linuxberg.arrakis.es/conhtml/adnload/8894_17109.html -http://ring.toyama-ix.net/archives/pc/winsock-l/WWW-Browsers/Plug-In/ppp16124.txt -http://opac.lib.ntnu.edu.tw/search*chi/++ftlist/bp20040288/-5,-1,0,B/frameset&F=bp20040286&1,1 -http://ftp.darenet.dk/tucows/winme/adnload/137475_28966.html -http://ftp.darenet.dk/tucows/winme/adnload/137525_29009.html -http://elib.zib.de/pub/UserHome/Mueller/Course/Tutorial/Postscript/US/?M=A -http://greenpeace.lu/Admin/usage/weekly/1999/01/03/ -http://greenpeace.lu/Admin/usage/weekly/1998/04/26/ -http://greenpeace.lu/Admin/usage/weekly/1998/08/16/ -http://greenpeace.lu/Admin/usage/weekly/1997/10/12/ -http://retailer.gocollect.com/do/session/1912819/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/clubhouse/index.asp -http://www.kusastro.kyoto-u.ac.jp/LCs/index/AURAU.html -http://www.linux.com/networking/network/windows_nt/support/microsoft/Red_Hat/ -http://www.linux.com/networking/network/windows_nt/support/microsoft/operating_system/ -http://www.linux.com/networking/network/windows_nt/support/microsoft/SAP/ -http://www.linux.com/networking/network/windows_nt/support/microsoft/Unix/ -http://www.linux.com/networking/network/windows_nt/support/microsoft/pop-3/ -http://www.cs.rit.edu/photo_album/smr3632.html -http://www.cpan.dk/CPAN/modules/by-authors/id/C/CH/CHRMASTO/?D=A -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/computers/lit/misc/unitest/lit/music/midi/ego.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/computers/lit/misc/unitest/lit/music/midi/lit/multiple.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/computers/lit/misc/unitest/lit/music/midi/misc/dissert.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/computers/lit/misc/unitest/lit/music/midi/misc/peanuts.html -http://www.eastsidejournal.com/sited/retr_story.pl/25409 -http://yp.gates96.com/8/46/50/23.html -http://yp.gates96.com/8/46/52/6.html -http://yp.gates96.com/8/46/52/10.html -http://yp.gates96.com/8/46/52/18.html -http://yp.gates96.com/8/46/52/25.html -http://yp.gates96.com/8/46/53/78.html -http://yp.gates96.com/8/46/53/95.html -http://yp.gates96.com/8/46/54/26.html -http://yp.gates96.com/8/46/54/41.html -http://yp.gates96.com/8/46/54/64.html -http://yp.gates96.com/8/46/54/76.html -http://yp.gates96.com/8/46/54/92.html -http://yp.gates96.com/8/46/55/62.html -http://yp.gates96.com/8/46/55/94.html -http://yp.gates96.com/8/46/55/98.html -http://yp.gates96.com/8/46/56/19.html -http://yp.gates96.com/8/46/56/42.html -http://yp.gates96.com/8/46/56/86.html -http://yp.gates96.com/8/46/58/53.html -http://yp.gates96.com/8/46/58/57.html -http://yp.gates96.com/8/46/59/41.html -http://yp.gates96.com/8/46/59/44.html -http://yp.gates96.com/8/46/59/84.html -http://yp.gates96.com/8/46/59/99.html -http://www.158.com.cn/news/2000/09/03/58946.htm -http://www.pobladores.com/territorios/juegos/Shanodin/pagina/2 -http://www.otemachi.ibm.co.jp/pc/vlp/ca20/32l9068/price.html -http://www.gutenberg2000.de/lessing/sinnged/sinna10.htm -http://www.gutenberg2000.de/lessing/sinnged/sinn138.htm -http://www.gutenberg2000.de/lessing/sinnged/sinnc27.htm -http://www.gutenberg2000.de/lessing/sinnged/sinnc06.htm -http://calcul.si.uji.es/Programes/SAS/stat/chap4/sect5.htm -http://calcul.si.uji.es/Programes/SAS/stat/chap4/sect6.htm -http://link.fastpartner.com/do/session/600436/vsid/3194/tid/3194/cid/137201/mid/1060/rid/2105/chid/3194/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/learn.htm -http://www.linux.com/networking/network/red_hat/performance/workstations/business/ -http://ftp.dei.uc.pt/pub/faqs/backrubs/faq/?D=A -http://www2.el-mundo.es/nuevaeconomia/2000/NE022/NE022-16b.html -http://ring.toyama-ix.net/pub/linux/linuxppc-jp/2.0/UsersGuide/?N=D -http://www.egroups.com/message/swchicks-rpg/763 -http://webraft.its.unimelb.edu.au/705195/students/caitlinb/pub/?N=D -http://cn.egroups.com/message/indexinvesting/17 -http://networkdesigner.subportal.com/sn/Programming/Setup_Utilities/11753.html -http://www.imagestation.com/member/?name=Mermaid34v&c=1 -http://crn.com/Components/TalkBack/tb-read.asp?ArticleId=8463 -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/lit/misc/lit/computers/music/linux/misc/thoughts/turingtest.html -http://www.egroups.com/message/house_caliburnus/1479 -http://pub14.ezboard.com/BBSForum.showForumSearch?boardName=bleemtest -http://spaceports.tucows.com/winme/adnload/136943_28461.html -http://www.cerent.com/warp/public/767/spcl/vaccess/req-lab.html -http://www.ualberta.ca/icons/icons/numbers/Big-orange-thin/ -http://www.gencat.es/cgi-bin/bc/drawer.cgi/LD/0004/A00027?98 -http://interhotel.com/romania/en/hoteles/49235.html -http://www.infoscape.com.cn:8171/nf/0001/19/nfzx1908.htm -http://www.hurriyetim.com/akdeniz/turk/00/05/25/akdhab/62akd.htm -http://www.hurriyetim.com/akdeniz/turk/00/05/25/akdhab/38akd.htm -http://dennou-t.ms.u-tokyo.ac.jp/arch/cc-env/Linux/debian-jp/dists/woody-jp/contrib/binary-ia64/misc/?M=A -http://www.angelfire.com/vt/Mystical2 -http://www.indonesiansources.com/HELP/COOKIES.HTM -http://members.nbci.com/cmeadows/gvi/45regt/45gvibat.html -http://members.nbci.com/cmeadows/gvi/45regt/45gvicob.html -http://landview.census.gov/hhes/www/housing/soma/char96/ch96tab5.html -http://www.legis.state.pa.us/WU01/LI/BI/TI/1985/0/MNPENNSYLVANIAdENERGYdASSISTANCEdANDdCONSERVATIONdACT.HTM -http://www.legis.state.pa.us/WU01/LI/BI/TI/1985/0/MNPENNSYLVANIAdSEWAGEdFACILITIESdACT.HTM -http://www.legis.state.pa.us/WU01/LI/BI/TI/1985/0/MNPODIATRYdPRACTICEdACT.HTM -http://www.legis.state.pa.us/WU01/LI/BI/TI/1985/0/MNPRESIDENT.HTM -http://www.legis.state.pa.us/WU01/LI/BI/TI/1985/0/MNPRIVATEdMORTGAGEdINSURANCEdACT.HTM -http://www.legis.state.pa.us/WU01/LI/BI/TI/1985/0/MNPROJECTd500.HTM -http://www.legis.state.pa.us/WU01/LI/BI/TI/1985/0/MNPUBLICdWORKSdCONTRACTdREGULATIONdLAW.HTM -http://oss.sgi.com/cgi-bin/cvsweb.cgi/inventor/apps/samples/4view/Attic/Imakefile?only_with_tag=MAIN -http://oss.sgi.com/cgi-bin/cvsweb.cgi/inventor/apps/samples/4view/Attic/Imakefile?only_with_tag=HEAD -http://www4.50megs.com/justiceinn/charpages/leaves/707.html -http://www4.50megs.com/justiceinn/charpages/leaves/859.html -http://www4.50megs.com/justiceinn/charpages/leaves/171.html -http://www4.50megs.com/justiceinn/charpages/leaves/114.html -http://megalink.tucows.com/win2k/adnload/38582_28844.html -http://members.tripod.lycos.nl/monthlysports/hello_and_welkom_at_the_new.htm -http://coe.ier.hit-u.ac.jp/BibEc/data/Papers/nbrnberwo4558.html -http://coe.ier.hit-u.ac.jp/BibEc/data/Papers/nbrnberwo4462.html -http://coe.ier.hit-u.ac.jp/BibEc/data/Papers/nbrnberwo4813.html -http://pub4.ezboard.com/factiveprodiscussioncommunityhottopicsresidentsandalcohol.showMessage?topicID=3.topic -http://207.138.41.133/subscribe/IndoVStudio -http://www.biuemountain.com/eng3/karen/EArejoice.html -http://polygraph.ircache.net:8181/wwwboard/capabilities/http_-2www.westnebr.net/http_-2www.excite.com/grservic.htm -http://pub7.ezboard.com/fturonneuemissionennebenwerteundsonstigewerte.showAddReplyScreenFromWeb?topicID=58.topic -http://dk.egroups.com/post/badbart-showdown?act=forward&messageNum=679 -http://www.kfi640.com/shared/mod_perl/looksmart/looksmart/eus1/eus62920/eus62921/eus64894/eus170276/eus163832/ -http://www.algonet.se/~d88628/engelsk/various.htm -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=220&discrim=220,215,11 -http://www.z-plus.de/TEXTE/INETCO/AUSG20000524/text7.html -http://www.gbnf.com/genealog2/varner/html/d0059/I11636.HTM -http://www.musiciansfriend.com/ex/ds/live/001030183152064208037007463633 -http://www.musiciansfriend.com/ex/ds/home/001030183152064208037007463633?dbase=info,order_info.html -http://www.musiciansfriend.com/ex/ds/guitar/amps/001030183152064208037007463633?dbase=info,contact.html -http://pix.egroups.com/message/ipe/1642?source=1 -http://213.36.119.69/do/session/153008/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://resa.travelprice.com/CallCenter/InitCommunicationAgence -http://213.36.119.69/do/session/153008/vsid/1113/tid/1113/cid/28507/mid/1020/rid/1041/chid/1103/parser/yes/imref/eqqLmwlGltt5tkqHoXsLbimLofZLbkZHljlK6IlK/url/http://www.travelprice.com/DE_DE/ -http://www.egroups.com/message/peninsulaserv/567 -http://www.scifi.com/bboard/browse.cgi/1/5/545/12425?pnum=3 -http://no.egroups.com/post/icc-info?act=reply&messageNum=759 -http://www.chaos.dk/sexriddle/s/e/x/e/c/s/l/ -http://www.chaos.dk/sexriddle/s/e/x/e/c/s/t/ -http://www.nissan.co.jp/RENAULT-DEALERS/PASSPORT/view.cgi/search/972959630-- -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=6,29,20,36,32 -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=7,29,20,36,32 -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=27,29,20,36,32 -http://dada.linuxberg.com/gnomehtml/adnload/31471_2540.html -http://augustasports.com/football99/college/box_50347.shtml -http://augustasports.com/football99/college/box_50365.shtml -http://augustasports.com/football99/college/box_50423.shtml -http://www.linux.com/networking/network/enterprise/e-commerce/management/open_source/ -http://usol.pdacentral.com/winnt/preview/1946.html -http://usol.pdacentral.com/winnt/preview/78287.html -http://usol.pdacentral.com/winnt/preview/1338.html -http://usol.pdacentral.com/winnt/preview/12860.html -http://usol.pdacentral.com/winnt/preview/6920.html -http://usol.pdacentral.com/winnt/preview/51381.html -http://ring.htcn.ne.jp/pub/lang/perl/CPAN/authors/id/W/WO/?N=D -http://grybrd.subportal.com/sn/Network_and_Internet/Text_Chat_Clients/index1.html -http://www.gurlpages.com/lacej/part13.html -http://ring.shibaura-it.ac.jp/archives/mac/info-mac/game/com/wolf/?D=A -http://cgi.cnnsi.com/baseball/mlb/nl/gamelog/2000/10/07/mets_giants/ -http://my.egroups.com/messages/not_honyaku/236 -http://members.tripod.com/agran_gassendi/Countdown.htm -http://www.tccomputers.com/cgi-bin/bp/1878637479/showcase/showcase.htm -http://207.138.41.133/message/AikensTrivia/264 -http://207.138.41.133/message/AikensTrivia/276 -http://www.shumway.org/thetree/ped13583.htm -http://link.fastpartner.com/do/session/600421/vsid/2870/tid/2870/cid/136966/mid/1060/rid/1926/chid/2870/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/dk/ -http://link.fastpartner.com/do/session/600421/vsid/2870/tid/2870/cid/136966/mid/1060/rid/1926/chid/2870/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/politiken.php -http://link.fastpartner.com/do/session/600421/vsid/2870/tid/2870/cid/136966/mid/1060/rid/1926/chid/2870/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/company/jobs.htm -http://in.egroups.com/message/canada/856 -http://in.egroups.com/message/canada/883 -http://debian.tod.net/OpenBSD/src/lib/libssl/README.OPENBSD -http://www.emerchandise.com/main/EMERCH/s.1M38gYrZ -http://www.emerchandise.com/browse/TOYSTORY2/FIGURINE/b.FAVORITES%20COMICS%20ANIMFEAT%20TOYSTORY2/s.1M38gYrZ -http://quotidiano.monrif.net/chan/cronaca_nazionale:410879.1:/1999/12/24 -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=baignes&l=fr -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=baignas&l=fr -http://www.egroups.com/message/swchicks-rpg/93 -http://usuarios.tripod.es/jlgolis/id142_l.htm -http://www9.freeweb.ne.jp/shopping/nossy/baby/200-59.html -http://www9.freeweb.ne.jp/shopping/nossy/baby/305-36.html -http://ftp.tku.edu.tw/OS/NetBSD/NetBSD-1.3.2/alpha/binary/kernel/?D=A -http://www-1.cisco.com/univercd/cc/td/doc/product/wanbu/82/access/fpmpmm12/fpmmappe.pdf -http://pub17.ezboard.com/fartofnorrathfavoritepaintings.threadControl?topicID=56.topic -http://itcareers.careercast.com/texis/it/itjs/+pwwBmew_D86eGrwwwqFqygdMpwDOeWXqqBcneWkjnwBneWkxqBOeWRlmmOtFqewyXwotoBwcaMwDwtnanmowcdt1naqconDBaGncwBodD5ropa5BGwBnton5amnVncdpaMwGAnBoDtanMwocaGn51MnaMFqryfHfREIDzmbwwwpBmFe-B-dehxwww5rmXmwwBrmeZpwww/morelike.html -http://www.thestateofcolorado.com/aoubicycling.html -http://www.freespeech.org/DISjak/disnews/maillist.html -http://www.freespeech.org/DISjak/sport/schwimm/bestlist.html -http://www.amigos.com/cgi-bin/w3com/pws/ffe/_MhIXE2wgPJZ1X047wqRwM-olUgaV3vI6fBPmDsoD0c26y7TrHjLUhhhTSIZ2PRmqLmBVyInWJLkLGkKScrdFyX1uyXCZhvaWFvbnSFioewAURJcXQC-hJE5KczVcMUiq3ncgKjQh7nynQEu662C -http://m.home.cern.ch/m/mrashid/www/cuisine/cuisin13.htm -http://m.home.cern.ch/m/mrashid/www/cuisine/cuisin28.htm -http://www.dayoo.com/channel/stock/news/cjzh/09/0921/06.htm -http://webcvs.kde.org/cgi-bin/cvsweb.cgi/KodeKnight/lib/Makefile.am?r1=1.3&sortby=rev -http://www.fogdog.com/cedroID/ssd3040183315779/nav/products/featured_brands/12p/all/ -http://www.fogdog.com/cedroID/ssd3040183315779/nav/stores/baseball/ -http://www.fogdog.com/cedroID/ssd3040183315779/nav/stores/squash/ -http://www9.hmv.co.uk:5555/do/session/1347832/vsid/199/tid/199/cid/1061396/mid/1020/rid/1052/chid/1029/parser/yes/imref/eqqLmwlGltt5tkeHjskKZlkKrhlK/url/http://www.hmv.co.uk/hmv/newmenu.html -http://www.arm.com/sitearchitek/support.ns4/html/cores_faq!OpenDocument&ExpandSection=9,36,8 -http://www.arm.com/sitearchitek/support.ns4/html/cores_faq!OpenDocument&ExpandSection=24,36,8 -http://www.hig.se/(append,countdown,set,sqloutput,sqltable)/~jackson/roxen/ -http://ring.jec.ad.jp/archives/linux/kernel.org/kernel/people/mingo/raid-patches/raid-2.2.17-A0 -http://www.wsrn.com/apps/links/?s=BKIRF -http://www.auto.ru/wwwboards/mercedes/0163/ -http://www.auto.ru/wwwboards/mercedes/0142/ -http://www.auto.ru/wwwboards/mercedes/0132/ -http://www.auto.ru/wwwboards/mercedes/0002/ -http://www.auto.ru/wwwboard/mercedes/0014/ -http://www.presa.spb.ru/newspapers/dp/arts/dp-178-art-12.html -http://pub8.ezboard.com/fnirlcomcenterracetalk.showMessage?topicID=8.topic -http://www.allhealth.com/pregnancy/labor/qa/0,3105,599,00.html -http://www3.newstimes.com/archive99/sep0499/lce.htm -http://jupiter.u-3mrs.fr/~msc41www/PSHTM/PS4330.HTM -http://www.gpul.org/ftp/os/linux/cd-images/other/suse/dosutils/pfdisktc/ -http://platsbanken.amv.se/kap/text/88/001025,010050,240907,10,0107051488.shtml -http://www.angel-bastel-zoo.de/detail/detail_811_3.htm -http://members.nbci.com/cmeadows/gvi/3battn/3bgvicob.html -http://www.chaos.dk/sexriddle/s/e/x/x/p/o/r/ -http://www.asiastockwatch.com/sg/Forum/ForumDetails/0,1819,561_1_2:15,00.html -http://mysanantonio.sportshuddle.com/sports/football/health/advisors/workouts/huff12.asp -http://mysanantonio.sportshuddle.com/sports/football/health/advisors/workouts/huff1.asp -http://ring.data-hotel.net/pub/linux/debian/debian-jp/dists/unstable/contrib/source/math/ -http://www.tel.de/s/I/IFG.htm -http://www.tel.de/s/I/IFHV.htm -http://chat.hr-online.de/fs/buecherbuecher/buch/kerr.html -http://mirror.cc.utsunomiya-u.ac.jp/mirror/FreeBSD/branches/2.2-stable/src/sys/dev/ -http://mirror.cc.utsunomiya-u.ac.jp/mirror/FreeBSD/branches/2.2-stable/src/sys/nfs/ -http://www.malaysia.net/lists/sangkancil/1998-12/msg01044.html -http://biblio.cesga.es:81/search*gag/aFerreiro,+Martín/aferreiro+martin/-5,1,1,E/frameset&F=aferreiro+manuel&4,,4 -http://www.ferien-immobilien.de/DominikanischeRep/verkauf/Exklusiv-IB/Startseite/Gemeinsam/MarketingStrategie/Exklusiv-IB/Startseite/Gemeinsam/erreichenPartner/email3d.htm -http://www.ferien-immobilien.de/DominikanischeRep/verkauf/Exklusiv-IB/Startseite/Gemeinsam/MarketingStrategie/Exklusiv-IB/Startseite/Gemeinsam/IIMMitglieder.htm -http://chunma.yeungnam.ac.kr/~home/home13/msgboard/msgboard.cgi?cmd=list&stat=start -http://link.fastpartner.com/do/session/600413/vsid/2870/tid/2870/cid/136966/mid/1060/rid/1926/chid/2870/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/local/redirect.php -http://www.eyeball.symantec.co.uk/region/se/sepress/20000418111220.htm -http://www.rezel.enst.fr/ftp/linux/distributions/debian/CD-1/dists/frozen/main/binary-all/news/?D=A -http://www.latimes.com/editions/orange/20001028/p000103070_ome0014.html -http://www.chaos.dk/sexriddle/j/c/u/t/ -http://cometweb01.comet.co.uk/do!session=132050&vsid=694&tid=20&cid=37044&mid=1000&rid=1060&chid=1711&url=eqqLmwlGltt5tkkHbqpLZXmLbkZHljlKaltLkilLXalKfkaLbukKeqjLi1 -http://perso.wanadoo.fr/jm.michaud/electronique_index.htm -http://dk.egroups.com/messages/Gunsmithing/1446?viscount=-30 -http://www-d0.fnal.gov/d0dist/dist/releases/psim01.02.00/pmcs_met/VERSION -http://mirror.cc.utsunomiya-u.ac.jp/mirror/CPAN/authors/id/P/PM/?N=D -http://www.movieguide.com/pressroom/events/amcinema96/award_amcinema965.html -http://www.sda.t-online.de/reise/index/aktrex201.htm -http://dic.empas.com/show.tsp/SMASHER -http://www.3w-posters.com/tomlinson.htm -http://www.3w-posters.com/tuttle.htm -http://www.xmission.com/(art,dots,ftp,geek,misc,music,caffiene,art,toys,dots,edge,misc,shopping,ftp,places,privacy,geek,cuseeme,apocalypse,people,stuffiuse,places,stuffiuse)/~bill/links.html -http://www.osiris.978.org/~brianr/mirrors/olga/main/g/gangi_mike/?N=D -http://www.best.com/~workpage/g/57/300g.htm -http://www.cyd.com.cn/zqb/19991109/GB/9677^Q212.htm -http://edu.news.chinaren.com/161/10112157.shtml -http://users.info.unicaen.fr/~jjousset/perso/html/entrainperso/page.html -http://www.wordtheque.com/owa-wt/wordtheque_dba.w.t?w=destituiscono&l=it -http://www.uk.multimap.com/p/browse.cgi?pc=B771AA&cat=loc -http://www.auxerre.culture.gouv.fr/culture/actualites/conferen/bonneuil-duffour.htm -http://www.auxerre.culture.gouv.fr/culture/actualites/communiq/mediaBonneuil-Duffour.htm -http://www.ancientsites.com/~Ftagn_Sithathor -http://biblioteca.upv.es/bib/doc/doc_fisbd/86/127697//C/1820009/0////25/N/MLTPAI -http://www.kfi640.com/shared/mod_perl/looksmart/looksmart/eus1/eus53930/eus169714/eus169722/eus542057/eus542410/ -http://www.kfi640.com/shared/mod_perl/looksmart/looksmart/eus1/eus53930/eus169714/eus169722/eus542057/eus542106/ -http://pub26.ezboard.com/fathanasiafrm1.showMessage?topicID=113.topic -http://www.sourceforge.net/softwaremap/trove_list.php?form_cat=186&discrim=186,226,251 -http://www.linux.com/networking/network/community/future/news/services/ -http://www.linux.com/networking/network/community/future/news/operating_system/ -http://www.linux.com/networking/network/community/future/news/?kw_offset=50 -http://www.linux.com/networking/network/development/unix/open_source/commercial/ -http://ring.shibaura-it.ac.jp/pub/misc/ham/funet/packet/00Index -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=3,0+20,0+17,0-( -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=3,0+20,0+17,0-9,1 -http://www.vorlesungen.uni-osnabrueck.de/informatik/c98/aufgaben/code/aufg50/ProcessInfo/ProcessInfo.bundle/Resources/?D=A -http://wap.jamba.de/KNet/_KNet-xOQ8j1-xHd-13fk7/showInfo-special1.de/node.0/cde7f1uou -http://nx5.salon.com/books/col/keil/2000/05/02/too_old/index2.html -http://pcmagazin.de/news/artikel/1999/04/29016-wf.htm -http://www.redrival.com/rgrascher/ -http://208.184.36.144/cwi/subscriptions/privacy_policy/0,1323,NAV47-68-85-98_STO52856,00.html -http://www.staroriental.net/nav/soeg_c/ihf,aol,n12,1,TVB香港小姐2000.html -http://www.staroriental.net/nav/soeg_c/ihf,aol,n12,6,TVB香港小姐2000.html -http://166.111.104.242/uscode/30/541b.head.html -http://stocks.tradingcharts.com/stocks/charts/fwrx/dchart.php?S=fwrx&T=d -http://genforum.genealogy.com/cgi-bin/print.cgi?plemmons::57.html -http://www.geocities.co.jp/Hollywood-Studio/3572/geodiary.html -http://www.luf.org/~jwills/LufWiki/view.cgi/Tech/ -http://www.doc.ic.ac.uk/lab/labsrc_area/firstyear/submissions/cs1/labs/Ex01/arr00/?M=A -http://citeseer.nj.nec.com/ps/332798 -http://citeseer.nj.nec.com/addcomment/332798 -http://citeseer.nj.nec.com/cidcontext/4075337 -http://ftp.te.fcu.edu.tw/cpatch/helputil/answerworks/?M=A -http://ftp.te.fcu.edu.tw/cpatch/helputil/answerworks/d2hpro4ethanks.htm -http://link.fastpartner.com/do/session/600423/vsid/2870/tid/2870/cid/136966/mid/1060/rid/1926/chid/2870/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/join/programmes/mondosoft.php -http://link.fastpartner.com/do/session/600423/vsid/2870/tid/2870/cid/136966/mid/1060/rid/1926/chid/2870/parser/yes/imref/eqqLmwlGltt5tkcHXpqLmXoLqkbLokZHljlK/url/http://www.fastpartner.com/company/ -http://library.cuhk.edu.hk/search*chi/dEnglish+language+--+Clauses./denglish+language+clauses/7,-1,0,B/browse -http://www04.u-page.so-net.ne.jp/yd5/yuma/top/home.html -http://www.smartshop.com/cgi-bin/main.cgi?c=1905&ssa=26 -http://www.smartshop.com/cgi-bin/main.cgi?c=1943&ssa=26 -http://se.egroups.com/dir/Business/Management/Project_and_Program_Management/Training?st=10 -http://www.hpl.online.sh.cn/WENXUE/tongsuo/wuxia/gulong/xueying/_vti_cnf/hs~001.htm -http://news.medscape.com/adis/PEON/public/archive/1999/toc-0221.html -http://news.medscape.com/adis/PEON/public/archive/1999/toc-0197.html -http://tucows.hongkong.com/winnt/adnload/4256_29575.html -http://www.etang.com/local/shenzhen/shopping/shop/0318mans02.htm -http://www.etang.com/local/shenzhen/shopping/shop/0319foll.htm -http://www.etang.com/local/shenzhen/shopping/shop/0319jialjs.htm -http://www.staffan.addr.com/cgi-bin/woda/icq.cgi/Edit?_id=2a5e -http://www.linux.com/networking/network/operating_system/kernel/distro/?printable=yes -http://www.linux.com/networking/network/operating_system/kernel/distro/commercial/ -http://www.linux.com/networking/network/operating_system/kernel/distro/white_dwarf/ -http://dir.dig.co.kr/parents/textbook/20301030101.html -http://www.affiliate.hpstore.hp.co.uk/do/session/380895/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/fr/CASHBACK/entry.asp -http://ccuftp.ccu.edu.tw/pub1/chinese/linux/clinux/c1/?N=D -http://cgi.cnnsi.com/basketball/college/women/boxscores/2000/03/07/cbp_rak -http://www.adcentral.com/cgi-bin/w3com/pws/adsites/5BRIztXQWHs_H_kyq8hmyrHpmCLb5RfQ09-DcKP1B6mZibAiJTLy1w3iiFS15WkFiCHMuMtjNK5FtHPDtZ7rxwckgoj0GaicnAZxhJLQ3zWaLoNUq8eTpG7wCxe3TWAb66jt -http://www.varsity.cam.ac.uk/varsity/live/2000/listings.nsf/44bbd1c2a6305036802567fb0081c76b!OpenView&Grid=1&Date=1999-04-06 -http://students.lsu.edu/students/main.nsf/Pages/CSISAJ1!OpenDocument&ExpandSection=15,21,5,4 -http://students.lsu.edu/students/main.nsf/Pages/CSISAJ1!OpenDocument&ExpandSection=18,21,5,4 -http://www.getplus.co.jp/category/catinet.homepagew2.asp -http://www.motorradversand.de/cgi-bin/antrieb/kettensatz_komplett_suzuki/RK82K872/beurteilung.htm -http://202.99.23.245/zdxw/13/20000328/200003281335.html -http://proxy.tiscover.com/1Root/Kontinent/6/Staat/7/Bundesland/22/Ort/120/Infrastruktur/299270/Homepage/homepage...1.html -http://www.jamba.de/KNet/_KNet-RcO8j1-cHd-13eq4/browse.de/node.0/cdel3j591 -http://www.jamba.de/KNet/_KNet-RcO8j1-cHd-13eqf/showInfo-wir.de/node.0/cde7f1uou -http://pub6.ezboard.com/fcrazyassmb47001generalshiznit.threadControl?topicID=685.topic -http://perso.infonie.fr/imagestld/photojyg5/images/alive5/?D=A -http://members.spree.com/sip1/take5planet/videos.htm -http://ae.boston.com/haiku/vote?haiku_id=4484 -http://adex3.flycast.com/server/socket/127.0.0.1:2800/click/OnlineCitiesSM/OnlineCitiesInteractiveCityGuides/bd129601192 -http://www.digitaldrucke.de/(aktuell,computer,marktplatz,shopping,verkehr)/suche/uebersicht.html -http://www.digitaldrucke.de/(aktuell,computer,hersteller,marktplatz,verkehr)/_fort/html/themen/computer/hard/herstell.htm -http://bbs.kcm.co.kr/NetBBS/Bbs.dll/kcmmission/lst/qqeq/1/zka/B2-kD2-l/qqo/004A -http://bbs.kcm.co.kr/NetBBS/Bbs.dll/kcmmission/rcm/zka/B2-kD2-l/qqo/004A/qqatt/^ -http://ftp.eq.uc.pt/software/lang/tcl/ftp.scriptics.com/nightly-cvs/tk/library/?S=A -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9704/Subject/article-141.html -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9704/Subject/article-165.html -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9704/Subject/article-241.html -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9704/Subject/article-239.html -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9704/Subject/article-150.html -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9704/Subject/article-44.html -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9704/Subject/article-12.html -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9704/Subject/article-4.html -http://www.infomedia.it/cgi-bin/lwgate/JAVA-IT/archives/java-it.log.9704/Subject/article-27.html -http://yp.gates96.com/5/88/50/47.html -http://yp.gates96.com/5/88/50/94.html -http://yp.gates96.com/5/88/51/20.html -http://yp.gates96.com/5/88/52/11.html -http://yp.gates96.com/5/88/52/26.html -http://yp.gates96.com/5/88/53/86.html -http://yp.gates96.com/5/88/53/99.html -http://yp.gates96.com/5/88/54/48.html -http://yp.gates96.com/5/88/55/29.html -http://yp.gates96.com/5/88/55/31.html -http://yp.gates96.com/5/88/55/41.html -http://yp.gates96.com/5/88/55/62.html -http://yp.gates96.com/5/88/55/77.html -http://yp.gates96.com/5/88/56/62.html -http://yp.gates96.com/5/88/56/93.html -http://yp.gates96.com/5/88/59/61.html -http://ceu.fi.udc.es:8000/mc/maillist/99-02/2090.918081010.176207534.html -http://ceu.fi.udc.es:8000/mc/maillist/99-02/1123.920140263.921690399.html -http://ceu.fi.udc.es:8000/mc/maillist/99-02/19089.918231855.610311830.html -http://ceu.fi.udc.es:8000/mc/maillist/99-02/16059.919279797.801472096.html -http://ceu.fi.udc.es:8000/mc/maillist/99-02/24001.919906575.275033199.html -http://ceu.fi.udc.es:8000/mc/maillist/99-02/14848.918256026.548154577.html -http://ceu.fi.udc.es:8000/mc/maillist/99-02/10783.918253985.660158806.html -http://ceu.fi.udc.es:8000/mc/maillist/99-02/27581.918670666.1055622954.html -http://www.activedayton.com/sportsticker/stnd/current/BBH.STAT.FSLKISLTRT.html -http://www.teenplatinum.com/barelylegal/japanesewomen/boots/petitesmall/explodingblowjob/eunuchbodyshots/homosexualass.html -http://books.hyperlink.co.uk/xt1/Methodology_for_the_Harmonization_of_European_Occupational_Accident_Statistics/9282641007 -http://www.jpc-music.com/2563637.htm -http://www.jpc-music.com/8168850.htm -http://www.expage.com/sugarshackstablesapryl -http://www.egroups.com/messages/svlug/31105 -http://www.chinawolf.com/~warson/japan/chichuan/bride/mldxn/009.htm -http://www.chinawolf.com/~warson/japan/chichuan/bride/mldxn/011.htm -http://yp.gates96.com/11/78/70/19.html -http://yp.gates96.com/11/78/70/95.html -http://yp.gates96.com/11/78/71/64.html -http://yp.gates96.com/11/78/71/65.html -http://yp.gates96.com/11/78/72/30.html -http://yp.gates96.com/11/78/73/35.html -http://yp.gates96.com/11/78/74/0.html -http://yp.gates96.com/11/78/75/58.html -http://yp.gates96.com/11/78/76/75.html -http://yp.gates96.com/11/78/77/36.html -http://yp.gates96.com/11/78/77/64.html -http://yp.gates96.com/11/78/78/20.html -http://yp.gates96.com/11/78/78/33.html -http://yp.gates96.com/11/78/78/70.html -http://yp.gates96.com/11/78/78/93.html -http://yp.gates96.com/11/78/79/3.html -http://yp.gates96.com/11/78/79/50.html -http://ben.aspads.net/ex/c/190/649604396 -http://www.lifl.fr/PRIVATE/Manuals/java/jdk1.2/docs/api/java/applet/class-use/AudioClip.html -http://dic.empas.com/show.tsp/?q=cea&f=B -http://beautifulthemes.subportal.com/sn/Utilities/Disk_Maintenance_and_Repair_Utilities/5294.html -http://ustlib.ust.hk/search*chi/anational+bureau+of+economic+research/anational+bureau+of+economic+research/-5,-1,0,E/frameset&F=anational+bureau+of+asian+and+soviet+research+u+s&1,,0 -http://www.canlii.org/ca/regl/dors99-120/art5.html -http://www.canlii.org/ca/regl/dors99-120/partie144284.html -http://www.incestpornstories.com/freshmanteen/eggbirth-canal/loverdrag-queen/birth-canalfull-term/stomachvagina.html -http://www.fashion-j.com/bs/013/013/19.html -http://www.fjtcm.edu.cn/Fujian_w/news/fjgsb/990311t/1-3.htm -http://www.kaos.dk/sex-riddle/k/a/k/i/s/z/r/d/ -http://www.kaos.dk/sex-riddle/k/a/k/i/s/z/r/f/ -http://www.tccomputers.com/cgi-bin/bp/41291345/products/specials/mbbundle.htm -http://www.tccomputers.com/cgi-bin/bp/41291345/services/insight.htm -http://www.tccomputers.com/cgi-bin/bp/41291345/products/batterybackups/batterybackups.htm -http://cartografia.comune.modena.it/Ril_Whip/menuogg/001-100/ME0068c.htm -http://library.bangor.ac.uk/search/cWS+5+V196a+2000/cws++++5+v196+a+2000/7,-1,0,B/frameset&F=cws+++21+e84+1989&5,,12 -http://mindit.netmind.com/proxy/http://www.exposure.aust.com/~promote1/auspalaeo/tectonix/tect1.htm -http://ftp.fi.debian.org/debian/dists/unstable/non-free/binary-i386/shells/?S=A -http://excite.de.netscape.com/unterhaltung/katalog/19344 -http://www.symatrixinc.com/website/website.nsf/0/3e40df86fb357cd5882568720079613f!OpenDocument&ExpandSection=25,20,21,29 -http://www.burstnet.com/ads/ad7826a-map.cgi/1708189811 -http://dic.empas.com/show.tsp/?s=b&q=CONSIDERABLE -http://www.kaos.dk/sex-riddle/k/a/k/i/p/g/t/c/ -http://www.kaos.dk/sex-riddle/k/a/k/i/p/g/t/h/ -http://www.kaos.dk/sex-riddle/k/a/k/i/p/g/t/n/ -http://www.kaos.dk/sex-riddle/k/a/k/i/p/g/t/x/ -http://www.cbe21.com.cn/xueke/dili/jiaoxuezs/ziliaojn/tupianhc/i0602.htm -http://babycenter.netscape.com/bbs/3788/thread530/message9.html -http://polygraph.ircache.net:8181/http_-2www.harborbay.com/home/webstuff/companyprofile.htm -http://dante.bdp.it/cgi-bin/poseidon_v2.0/reflect/poseidon/disc/bibl-uno/512098188/threadconfig -http://dante.bdp.it/cgi-bin/poseidon_v2.0/reflect/poseidon/disc/bibl-uno/512098188/newconfig -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=5,1,16,25,13 -http://www2.hgo.se/Kurskatalogen.nsf/a49e2126c83c4922412566f60052f831/f24cc45affc890eec12565d80055e0b9!OpenDocument&ExpandSection=28,1,16,25,13 -http://ftp.sunet.se/pub/lang/perl/CPAN/authors/id/R/RH/?D=A -http://www.geocities.co.jp/SilkRoad/1618/nixxki/010799.html -http://genforum.genealogy.com/cgi-genforum/forums/americanrev.cgi?4444 -http://in.egroups.com/message/djgppgames/358 -http://freehost.crazyhost.com/teengallery/apbh/panty.html -http://buffy.acmecity.com/xander/366/EDpt2.htm -http://www.tccomputers.com/cgi-bin/bp/505218695/promotional/deals.htm -http://www.tccomputers.com/cgi-bin/bp/505218695/products/cooling/cooling.htm -http://www.tccomputers.com/cgi-bin/bp/505218695/products/dvds/dvds.htm -http://www.tccomputers.com/cgi-bin/bp/505218695/products/mice/mice.htm -http://www.tccomputers.com/cgi-bin/bp/505218695/services/register.htm -http://www.foxsports.com/nba/scores/2000/000129_playbyplay_clewas.sml -http://pub1.ezboard.com/fcellofuncellistsbynightsemiprooramateur.showAddReplyScreenFromWeb?topicID=513.topic&index=9 -http://yp.gates96.com/0/22/30/81.html -http://yp.gates96.com/0/22/31/89.html -http://yp.gates96.com/0/22/32/1.html -http://yp.gates96.com/0/22/32/12.html -http://yp.gates96.com/0/22/32/48.html -http://yp.gates96.com/0/22/32/78.html -http://yp.gates96.com/0/22/34/48.html -http://yp.gates96.com/0/22/34/75.html -http://yp.gates96.com/0/22/34/85.html -http://yp.gates96.com/0/22/35/38.html -http://yp.gates96.com/0/22/35/73.html -http://yp.gates96.com/0/22/36/40.html -http://yp.gates96.com/0/22/36/92.html -http://yp.gates96.com/0/22/37/0.html -http://yp.gates96.com/0/22/37/61.html -http://yp.gates96.com/0/22/37/96.html -http://yp.gates96.com/0/22/39/13.html -http://yp.gates96.com/0/22/39/94.html -http://www.incestpornstories.com/underageflashing/plus-sizereal-size/beautiesasian/purpleanal-sex/maledomfantasy/high-schoolpretty/cherrybest-friends.html -http://variety.studiostore.com/browse/ELMOINGROU/TOY/s.2vzELAA2 -http://members.tripod.lycos.nl/BOGAERT/off2.htm -http://www.eveclub.com/cgi-bin/eveclub.front/972959555004/Catalog/2000019 -http://genforum.genealogy.com/cgi-genforum/forums/noel.cgi?662 -http://www.affiliate.hpstore.hp.co.uk/do/session/380888/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-expo.com/FR/REGISTRATION/entry.asp -http://yp.gates96.com/5/88/10/35.html -http://yp.gates96.com/5/88/10/44.html -http://yp.gates96.com/5/88/11/36.html -http://yp.gates96.com/5/88/13/1.html -http://yp.gates96.com/5/88/13/23.html -http://yp.gates96.com/5/88/13/77.html -http://yp.gates96.com/5/88/13/86.html -http://yp.gates96.com/5/88/14/47.html -http://yp.gates96.com/5/88/14/83.html -http://yp.gates96.com/5/88/15/11.html -http://yp.gates96.com/5/88/16/43.html -http://yp.gates96.com/5/88/16/86.html -http://yp.gates96.com/5/88/17/6.html -http://yp.gates96.com/5/88/17/12.html -http://yp.gates96.com/5/88/17/73.html -http://yp.gates96.com/5/88/18/1.html -http://yp.gates96.com/5/88/18/38.html -http://yp.gates96.com/5/88/18/47.html -http://yp.gates96.com/5/88/18/79.html -http://newnova.tucows.com/winme/adnload/138430_29763.html -http://yp.gates96.com/8/43/60/48.html -http://yp.gates96.com/8/43/60/55.html -http://yp.gates96.com/8/43/61/22.html -http://yp.gates96.com/8/43/62/40.html -http://yp.gates96.com/8/43/62/52.html -http://yp.gates96.com/8/43/62/94.html -http://yp.gates96.com/8/43/63/79.html -http://yp.gates96.com/8/43/64/73.html -http://yp.gates96.com/8/43/64/80.html -http://yp.gates96.com/8/43/66/26.html -http://yp.gates96.com/8/43/66/70.html -http://yp.gates96.com/8/43/67/16.html -http://yp.gates96.com/8/43/68/11.html -http://yp.gates96.com/8/43/69/74.html -http://www.fogdog.com/cedroID/ssd3040183354487/nav/products/winter_sports/1d/mid-weight_bottoms/ -http://www.fogdog.com/cedroID/ssd3040183354487/nav/products/winter_sports/1r/avalanche_safety/ -http://www.fogdog.com/cedroID/ssd3040183354487/boutique/marmot/ -http://www.affiliate.hpstore.hp.co.uk/do/session/380898/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.france.hp.com/Main/acheterhp/ -http://www.nd.edu/~dtl/cheg258/unix/unixhelp1.2/Pages/tasks_rm1.1.1.html -http://se.egroups.com/post/cyclesi?act=reply&messageNum=137 -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=22,0+18,0+22,0+9,4 -http://cidade.subportal.com/sn/Games/Action_Games/8120.html -http://wiem.onet.pl/wiem/0115d9-rp1.html -http://www.ferien-immobilien.de/detmold/Verkauf/Gemeinsam/Inserieren/Allgemeine-IB/Startseite/Gemeinsam/MarketingStrategie/Gemeinsam/erreichen.htm -http://retailer.gocollect.com/do/session/1912826/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/product_display/products/product_lines.asp -http://retailer.gocollect.com/do/session/1912826/vsid/2092/tid/2092/cid/569192/mid/1540/rid/1980/chid/2085/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLl0/url/http://www.gocollect.com/halloween/halloween.asp -http://www.iabusnet.org:90/forums/aca-1/dispatch.exe/survey/listUnseen/fol/100001/20,0/2542788 -http://www.dispatch.co.za/1998/06/25/easterncape/BISHO.HTM -http://pub24.ezboard.com/fsosatanfrm1.showMessage?topicID=48.topic -http://ftpsearch.belnet.be/ftp/packages/Linux-docs/howto/other-formats/INDEX -http://www.crosswinds.net/~mluotto/noframe/feedback/form2.htm -http://www.schoolweb.nl/studentensteden/Rotterdam/SVRGaudium/info.cfm -http://www.shopworks.com/index.cfm/action/directory/userid/0000BD9A-2F67-19FE-9038010B0A0ADCF2 -http://findmail.com/messages/masterhuen/802 -http://www.t-dialin.net/navkopf/service/websvkaa.htm -http://gallery2.simplenet.com/lobby/main/videocaps/ebaral/bigvalley/ebbva19.htm -http://gallery2.simplenet.com/lobby/main/videocaps/ebaral/bigvalley/ebbva31.htm -http://www.outpersonals.com/cgi-bin/w3com/pws/out/44hIVEhY5ZrKWoMKb0FtjCXhqcpntVLId5WTaJdeZmonn200jiiswYnK2vORJkjpm-x643ZCeLyy6kJnIAKa5rNx_42I13Ud9N03G9xPob7Hoci92HJhOlbEv4WsB85Au-cLXFlIHPd866jS -http://ftp.debian.org/debian/dists/Debian2.2r0/main/binary-all/editors/?D=A -http://ftp1.support.compaq.com/patches/public/Digital_UNIX/v3.2g/mailworks/2.0/?S=A -http://www.digitalhearth.com/Recipes/World_Cuisines/South_Asian/Indian/index5.html -http://ftp.gigabell.net/pub/Stormix/dists/rain/main/?M=A -http://www.stas.net/1/theparamanor/apartment.htm -http://www.netcom.com/~gfenzil/free.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/lit/misc/misc/thoughts/math/legendes/pages_new.html -http://www.eleves.ens.fr:8080/home/madore/index.shtml.fr/lit/misc/misc/thoughts/math/legendes/misc/orders_mag.html -http://dandini.cranfield.ac.uk/vl=-39658948/cl=171/nw=1/rpsv/catchword/routledg/13606719/contp1-1.htm -http://genforum.genealogy.com/cgi-genforum/forums/pugsley.cgi?81 -http://www.users.globalnet.co.uk/~mmayes/pages/cross.htm -http://dic.empas.com/show.tsp/?s=d&q=%C4%A7%BD%C7 -http://www.jamba.de/KNet/_KNet-rHP8j1-lHd-13f16/browse.de/node.0/cde7f1uou -http://library.bangor.ac.uk/search/aHolmgren,+Nils+Fritiof,+1877-1954/aholmgren+nils+fritiof+1877+1954/7,1,1,B/marc&F=aholmlund+chris&1,1, -http://www.spiral.at/Katalog/Artikel/0181030/ -http://www.spiral.at/Katalog/Artikel/0181242/ -http://www.generation-formation.fr/navig.htm---o21zAo06L2o0Ol9A074fo6VJGezMkEeIgI8eOkn2ApvFFo6Td4ezyr6feZJPdspt6dsSAtdsNhJdspt6dsrvrdjlhkfbz.htm -http://www.nextmedia.com.hk/netgirl/sport/images/chelsea/ch-30.htm -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=9,5-9,0-15,0-17,0 -http://www.realize.com/i82.htm,qt=35665aa9=645a273f-1a-31fa805-1-0-0-0-- -http://www.eud.com/1998/06/21/21121AA.shtml -http://www.eud.com/1998/06/21/21414AA.shtml -http://www.eud.com/1998/06/21/21434AA.shtml -http://chemtech.chinamarket.com.cn/E/Showdetail_company/5569.html -http://chemtech.chinamarket.com.cn/E/Showdetail_company/1095.html -http://www.ferien-immobilien.de/baden-wuertemberg/konstanz/Verkauf/Private-IB/Allgemeine-IB/Startseite/Gemeinsam/Immolink/Gemeinsam/MarketingStrategie/inhalt.htm -http://www.ferien-immobilien.de/baden-wuertemberg/konstanz/Verkauf/Private-IB/Allgemeine-IB/Startseite/Gemeinsam/Immolink/Gemeinsam/versicherungen/gebaeude/deckungsumfang.htm -http://retailer.gocollect.com/do/session/1912886/vsid/2312/tid/2312/cid/573127/mid/1020/rid/2147/chid/2210/parser/yes/imtarget/ImMainFrame/imref/eqqLmwlGltt5tkdHlZlLiibLZqkKZljLlZe5ofpLqjXLpl4/url/http://www.gocollect.com/company_info/terms_and_conditions.asp -http://eagle.synet.edu.cn/mirror/www.tuc.org.uk/ -http://eagle.synet.edu.cn/mirror/dcarolco.lanminds.com/home/ -http://www.chez.com/carabanon/Pagecabanon.htm -http://poetry.lezlisoft.com/kikelet/spiritualitas/lelekszinpad.shtml -http://lateline.muzi.net/ll/fanti/81373.shtml -http://www.egroups.com/message/vacuum/1140 -http://www.egroups.com/message/vacuum/1153 -http://www.egroups.com/message/vacuum/1157 -http://no.egroups.com/message/-1friendsliste/401 -http://no.egroups.com/message/-1friendsliste/411 -http://pike-community.org/(base=/forums/show.html,explode=146,forum=7,t=972959520359311)/forums/show.html -http://pike-community.org/(base=/forums/show.html,explode=512,forum=7,t=972959520359311)/forums/show.html -http://pike-community.org/(base=/forums/show.html,forum=7,show=413,t=972959520359311)/forums/show.html -http://pike-community.org/(base=/forums/show.html,forum=7,show=423,t=972959520359311)/forums/show.html -http://pike-community.org/(base=/forums/show.html,forum=7,show=761,t=972959520359311)/forums/show.html -http://pike-community.org/(base=/forums/show.html,forum=7,show=777,t=972959520359311)/forums/show.html -http://pike-community.org/(base=/forums/show.html,forum=7,show=831,t=972959520359311)/forums/show.html -http://astro1.cnu.ac.kr/NetBBS/Bbs.dll/bulletin/qry/zka/B2-kC2Jo/qqa/r -http://www.gbnf.com/genealog2/brothers/html/d0049/I1011.HTM -http://www.intellicast.com/Golf/World/UnitedStates/Midwest/Ohio/Zanesville/CurrentWinds/ -http://www.nada.kth.se/systemgruppen/docs/javadoc/jdk-1.3/docs/api/javax/swing/text/class-use/TabSet.html -http://www.my-cat.de/hunde/zucht/file24.htm -http://194.128.65.4/pa/cm199899/cmwib/wb981128/edms.htm -http://www.gutenberg2000.de/sagen/austria/tirol/adasbub.htm -http://www1.onelist.com/message/osaki/22 -http://www.highwired.net/ESchoolDrive/JumpPage/1,5565,25179-46,00.html -http://pcmagazin.de/download/library/deADW-wc.htm -http://www.affiliate.hpstore.hp.co.uk/do/session/380873/vsid/1148/tid/1148/cid/74115/mid/1001/rid/1003/chid/1050/parser/yes/imref/eqqLmwlGltt5tkeHmjbHumlLkZl5jlcHol4/url/http://www.hp-creativeworld.com/creativeworld.asp?lang=f -http://cscns.csc.gifu.gifu.jp/pushcorn-kit/tanigumi/paged/0300214020000147.html -http://cscns.csc.gifu.gifu.jp/pushcorn-kit/tanigumi/paged/0300214020002363.html -http://cscns.csc.gifu.gifu.jp/pushcorn-kit/tanigumi/paged/0300214020001617.html -http://cpan.nitco.com/modules/by-module/String/MLEHMANN/?N=D -http://www.rge.com/pub/tex/language/ethiopia/ethtex/lqh_fonts/ -http://130.158.208.53/WWW/PDB2/PCD4711/htmls/41.html -http://www.thisislancashire.co.uk/lancashire/archive/1997/05/15/LEIGH0VQ.html -http://www.thisislancashire.co.uk/lancashire/archive/1997/05/15/LEIGH10VQ.html -http://southwind.tukids.tucows.com/mac/parents/adnload/72310_26093.html -http://ftp1.support.compaq.com/public/vms/vax/v7.2/dsnlink/2.2/dsnlinke022.a-dcx_vaxexe -http://wynnsystems.com/i.I_5aGd/search/listCompanies.html -http://www.pobladores.com/territorios/juegos/Zhief_Fantasy_World/info -http://www.pobladores.com/territorios/juegos/Zhief_Fantasy_World/pagina/9 -http://www.aebius.com/rpm2html/contrib/libc5/i386/usr_sbin_Tree.html -http://info.rutgers.edu/cgi-bin/RUInfo/TallyStats/name=WebRequest&exec=buildlimit&limit=9,0-22,0-0,0-9,4 -http://polygraph.ircache.net:8181/services/define/http_-2www.fastcounter.com/noframes/specials.htm -http://polygraph.ircache.net:8181/services/define/http_-2www.fastcounter.com/noframes/sitebuilder.htm -http://www.jamba.nl/KNet/_KNet-7YT8j1-nD4-pxan/browse.nl/node.0/cdmvcam7k -http://www.outdoorwire.com/content/lists/jeepoffroad/200010/msg00234.html?{LoadingFrameset} -http://www-uk8.cricket.org/link_to_database/ARCHIVE/2000-01/ENG_IN_PAK/ENG_IN_PAK_OCT-DEC2000_ENG-SQUAD.html -http://www-uk8.cricket.org/link_to_database/ARCHIVE/CRICKET_NEWS/2000/OCT/057670_CI_25OCT2000.html -http://www.chaos.dk/sexriddle/c/c/e/k/ -http://ben.aspads.net/ex/c/190/608504034 -http://forum.rai.it/aca-finestre/dispatch.cgi/FORUM/folderFrame/100001/0/alpha/2040958 -http://www.teacherformation.org/html/od/facilitators.cfm/task1,help/discussion_id,2/xid,5237/yid,3113916 -http://www.mirror.edu.cn/res/www.isoc.org/inet98/proceedings/7d/ -http://www.sumthin.nu/archives/bugtraq/Nov_1998/msg00058.html -http://proxy.tiscover.com/1Root/Kontinent/6/Staat/7/Bundesland/20/Regionen/regionen_az...2.html -http://www.streetprices.com/products/sortdetailbylowprice/SP142252.html -http://www.streetprices.com/products/sortdetailby1day/SP142252.html -http://pp3.shef.ac.uk:4040/form/path=1,+%3A%22countryName%3DGB%40organizationName%3DUniversity+of+Sheffield%40organizationalUnitName%3DFinance%40commonName%3DS+Green%22 -http://travelocity-dest.excite.com/DestGuides/0,1840,TRAVELOCITY|2662|3|1|239114,00.html -http://www.maastrek.de/maas/4a73999ddfd2d79be20a/1/0/5 -http://aol.weather.com/weather/cities/us_pa_fairview.html -http://aol.weather.com/weather/cities/us_pa_fort_loudon.html -http://javatest.a-net.nl/servlet/pedit.Main/http://www.tigerden.com/junkmail/compladdr.html -http://ftp.dti.ad.jp/pub/windows/forest/file/backup/press1/?M=A -http://www.contest.edu.tw/85/endshow/5/baseball/news/97feb/0225t_1c.html -http://www.contest.edu.tw/85/endshow/5/baseball/news/97feb/0225c_3c.html -http://www.contest.edu.tw/85/endshow/5/baseball/news/97feb/0217c_2c.html -http://www.contest.edu.tw/85/endshow/5/baseball/news/97feb/0216c_play.html -http://www.contest.edu.tw/85/endshow/5/baseball/news/97feb/0214co_1c.html -http://preview.egroups.com/messages/decoratingplusnews/6 -http://astro1.chungnam.ac.kr/NetBBS/Bbs.dll/bulletin/rcm/zka/B2-kC23n/qqatt/^ \ No newline at end of file diff --git a/vendor/snap/src/error.rs b/vendor/snap/src/error.rs index be23d795b8..8f0b400a6d 100644 --- a/vendor/snap/src/error.rs +++ b/vendor/snap/src/error.rs @@ -61,7 +61,7 @@ impl fmt::Debug for IntoInnerError { /// `From for std::io::Error` is provided so that any Snappy /// errors will be converted to a `std::io::Error` automatically when using /// `try!`. -#[derive(Debug)] +#[derive(Clone, Debug)] pub enum Error { /// This error occurs when the given input is too big. This can happen /// during compression or decompression. diff --git a/vendor/snap/src/lib.rs b/vendor/snap/src/lib.rs index 06fbfeda75..231b047550 100644 --- a/vendor/snap/src/lib.rs +++ b/vendor/snap/src/lib.rs @@ -10,7 +10,7 @@ decompress data at about 800 MB/sec or more. # Install To use this crate with -[Cargo](http://doc.crates.io/index.html), +[Cargo](https://doc.rust-lang.org/cargo/), simply add it as a dependency to your `Cargo.toml`: ```ignore diff --git a/vendor/snap/src/read.rs b/vendor/snap/src/read.rs index 362c2d7ba0..89dd832066 100644 --- a/vendor/snap/src/read.rs +++ b/vendor/snap/src/read.rs @@ -100,7 +100,7 @@ impl io::Read for FrameDecoder { fn read(&mut self, buf: &mut [u8]) -> io::Result { macro_rules! fail { ($err:expr) => { - return Err(io::Error::from($err)); + return Err(io::Error::from($err)) }; } loop { diff --git a/vendor/syn/.cargo-checksum.json b/vendor/syn/.cargo-checksum.json index 4a594d40fb..19959a3fe6 100644 --- a/vendor/syn/.cargo-checksum.json +++ b/vendor/syn/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"028c85104d33394dbca3aa76819eac6169141739beb3e2d7f6595174fb1446b3","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"03f3b53cf858536a0883aa5b5882ee61dcd0f1e71c0930c9106fcfa1d6aad2df","benches/file.rs":"b4724fc7c0f48b8f488e2632a1064f6c0bf16ded3969680fc3f4a2369536269b","benches/rust.rs":"ea6291ef2d2a83d94a3312fe179d48259f8ec0b04c961993ddd181d0a4ab740e","build.rs":"241f9e3af93b32d2d928ef9251d8ed2e67c6c64acc4aacce81f3aca58778e655","src/attr.rs":"41bb00e06cdebe3e3145ee7c68c4dd7c05c099bfc3e9fc858fb0a3a174d31730","src/await.rs":"8aa22e3c201cb2bdb6b4817fa00901f308ab06817607aa7b884c58c957705969","src/bigint.rs":"efc7f64959980653d73fe4f8bc2a3a2904dc05f45b02c6dc15cd316fa3d7c338","src/buffer.rs":"a5d6692938c2ec6ec140f70ec89fa93659fa227b52e8d381e9da7dd440f0249e","src/custom_keyword.rs":"9842ed7fafd6ebc15d4c9b060d3d97ae21bfd0c0c64bc34a5a0858549fc125db","src/custom_punctuation.rs":"ec75d5f83607cf6fa282e4290031c645ac3f95798cef6fd26886aa10e3a1e74f","src/data.rs":"767f2964b8f12d87b0f218aa43ffbdec411e26a702e61e93dda4f131277c8adb","src/derive.rs":"ee24a202be2d36ccdff576dd9cd765e94b33ef2286946e6725d75b08e777d462","src/discouraged.rs":"a1f3d85e20dedf50b1b7b4571d970a3a6e9b2de4afde7dd0c986fe240df2ba46","src/error.rs":"6c70d6b27f12674cf629ee7dc3c007435430ef3a3781c4d4c2b00a64f02062dd","src/export.rs":"d18438464c7ee1de7092c7c5d48dd9d114bdf184c1ea452c4fa709265cd19469","src/expr.rs":"c3ae2fe2e5c4bb761a5d8052435b716f36c7ce90a6ce76d3740037e7ec5dc550","src/ext.rs":"1f648cff1d705a1cea64b32b77482b97a82d2fe0aaf63b40cade91e5c02dc969","src/file.rs":"f86697655222ae294215114f4eae8e6b0b5e2a935d6c479ff8f8f889c4efd2e2","src/gen/clone.rs":"8db60fc2bf515f9a65f4e98669427ce02ed0ccc9ffdad25d8fb39b38768ecaf1","src/gen/debug.rs":"facf4fb5c7e017dd890c4a9531f337659d7b55475aa44124abf48e088ad56fc5","src/gen/eq.rs":"576a4f1e4030434b0f0170f4d681d2c46292fda64ad5f3913623e1c6e858c24f","src/gen/fold.rs":"3f59e59ed8ad2ab5dd347bfbe41bbc785c2aabd8ae902087a584a6daed597182","src/gen/hash.rs":"458052bb0d64b2a722eaeef4461af80bce109cd97d19bd44dbd608e4c53a6520","src/gen/visit.rs":"23008c170d4dd3975232876a0a654921d9b6af57372cb9fcc133ca740588d666","src/gen/visit_mut.rs":"42886c3ee02ded72d9c3eec006e20431eaee0c6b90ddefc1a36ec7bf50c6a24a","src/gen_helper.rs":"ea6c66388365971db6a2fc86cbb208f7eacde77e245bc8623f27a3642a3d7741","src/generics.rs":"e96cdc4e4d85cd686fa4eaadf3a7f845a11f8316a82de066814cc7dc5f3a56c6","src/group.rs":"d9cd30ea5bd4d453293e8e8debbe388a0360c3c766f67c8499fec453a9a43cdc","src/ident.rs":"d67975d3dd89becde96579c0454a1357aa7c62da11bdf94f29ccf63514ffbc9d","src/item.rs":"ece06a3d7e231deaad93f2734adcad21a3dfed65505e6af465c7b6f111e364dd","src/lib.rs":"a14b479c7b17a87834891382805f370767491e955ab76b215a32acd03edb2b8f","src/lifetime.rs":"957fcf3923f6cb27d9d6f7caf920fdf0882a131fe5ac3806eab68d934051c2a3","src/lit.rs":"28eb28df4312070dc39e60906cf7abdf7becf18dce5c4654123dfbec61f15e95","src/lookahead.rs":"92ee63b48de02d3f6f1b09121f0fbac41d55cebc5771c8320e27df8482906152","src/mac.rs":"004cb89f9697564f6c9ee837e08ead68463ef946fb4c13c6c105adf2ba364b2b","src/macros.rs":"266590fd63a4a9d8637c6f8d36702acaace4ba59ab74c0883859efd1e260bae5","src/op.rs":"9d499022902743a6a0a19223b356449a979b90e60552d0446497d72750e646a4","src/parse.rs":"8b4aa518660dfd6310a5455b5624de01ad7ba42d11527b217f811b687b26e1fc","src/parse_macro_input.rs":"88929a1a7e5e72aa2d0b3459e52d8975afea856d159047ba4ab02ecbc5878a9c","src/parse_quote.rs":"80db945403d9731c5f3299a5819a5e2bb726c19fd9f256d50240bc32703c96b1","src/pat.rs":"a2df706ce090ccb8ad157570d8e3c4ef8196b96cc7ae98696105395b5d0b530d","src/path.rs":"92860452db410e754b9b2afd6eddb4e2a594629c2def43409ed94887b132e95b","src/print.rs":"da6529c1d9d21aaf6c835f66b4e67eacb7cf91a10eb5e9a2143b49bf99b3b5e1","src/punctuated.rs":"8d0384b2320ed76de06b566fd84d0a7a59a606e1f7e898fc607b384d7d9f480d","src/reserved.rs":"e70e028bd55cfa43e23cab4ba29e4dc53a3d91eff685ef2b6e57efc2b87a3428","src/sealed.rs":"896a495a5340eec898527f18bd4ddca408ea03ea0ee3af30074ff48deace778d","src/span.rs":"748c51c6feb223c26d3b1701f5bb98aee823666c775c98106cfa24fe29d8cec1","src/spanned.rs":"3ca016a943637653ab98e373dfb826a120f3c159867346fa38a844439944eb39","src/stmt.rs":"e68f76530606aab24e3587aa697fcd862c176e1cca0a50ab883c76bb91464f3d","src/thread.rs":"815eca6bd64f4eef7c447f0809e84108f5428ff50225224b373efd8fbb696874","src/token.rs":"5e423a696f80e281c322f37c87577f9fdc28607e9c007e24896a2b12da62d5ad","src/tt.rs":"32402645b6e82ef1e882945721b59b5fb7b0ee337d1972876362ecacef643d0f","src/ty.rs":"f574845ed494241393479459e1d007f26b55d991cb2aa7aeb098807916123fc7","src/verbatim.rs":"802a97df997432f18cac6e6200ff6ea29fb2474986005e0fcdbc2b65197f87f7","src/whitespace.rs":"e63dd0aa3d34029f17766a8b09c1a6e4479e36c552c8b7023d710a399333aace","tests/.gitignore":"22e782449a3c216db3f7215d5fb8882e316768e40beeec3833aae419ad8941db","tests/common/eq.rs":"c3a510628fa0e8f86691dacf3570897a197c3211163ab4b7bf92d1965a5f3570","tests/common/mod.rs":"25ef6d7daa09bad3198a0e9e91b2812425f92db7c585c1e34a03a84d7362ccd8","tests/common/parse.rs":"81580f23583723f7a2a337c4d13ebc021057cd825562fb4e474caa7cc641fed9","tests/debug/gen.rs":"e30e2b6c61feb15abe11cee86c4edff9f7e7c9c79080447d44be97869c9a3adb","tests/debug/mod.rs":"868763d0ef1609a3ad5e05e9f1bfa0f813e91e7e9a36653414a188bb2fdaa425","tests/macros/mod.rs":"a93136b172377ffebe8b68fd596a86d6625f64ed6c3d5e7f5d6ad859e25d5623","tests/repo/mod.rs":"10fa8a5b8d7838c4c6313a7d6e0aa1e14831cdd41328ae91e0fdffb509f76efe","tests/repo/progress.rs":"c08d0314a7f3ecf760d471f27da3cd2a500aeb9f1c8331bffb2aa648f9fabf3f","tests/test_asyncness.rs":"cff01db49d28ab23b0b258bc6c0a5cc4071be4fe7248eef344a5d79d2fb649b7","tests/test_attribute.rs":"0ffd99384e1a52ae17d9fed5c4053e411e8f9018decef07ffa621d1faa7329d8","tests/test_derive_input.rs":"610444351e3bf99366976bbf1da109c334a70ac9500caef366bcf9b68819829f","tests/test_expr.rs":"0ee83f6f6de950018c043efcc3e85776b4227dae3068309998a8d9709f2fc66c","tests/test_generics.rs":"9d713f90a79d6145efc89fb6f946029ca03486c632219950889da39940152ba0","tests/test_grouping.rs":"6276c3c73bba649dec5c97904ad2492879f918bc887a2c425d095c654ca0d925","tests/test_ident.rs":"9eb53d1e21edf23e7c9e14dc74dcc2b2538e9221e19dbcc0a44e3acc2e90f3f6","tests/test_item.rs":"6e327bc2ba815c2bcebb71b45a2b3ecb55a86dab3331c9c0caa3c84e96448b5e","tests/test_iterators.rs":"53ed6078d37550bd6765d2411e3660be401aef8a31a407350cc064a7d08c7c33","tests/test_lit.rs":"ef3f39da6ed67ba73b05eab3dda299887a455bac8e97701a90a94b636681588f","tests/test_meta.rs":"bd6910ec0eba05e814dad27dda0ea65e1f8b483e64d943213066ffd114a82b45","tests/test_parse_buffer.rs":"8bbe2d24ca8a3788f72c6908fc96c26d546f11c69687bf8d72727f851d5e2d27","tests/test_parse_stream.rs":"2f449a2c41a3dee6fd14bee24e1666a453cb808eda17332fd91afd127fcdd2a6","tests/test_pat.rs":"134091ba20e86c982dadbae668aebe66b1edd9619a01dedee989d1c7efde6b80","tests/test_path.rs":"13ae78e958f0d7334d11f32519f593968e5503d46e29ec345feede025f16113d","tests/test_precedence.rs":"976788a6593440f4cd7e791e5faaeabc6dbf8050ea76f8aeb53f4989ded22c1a","tests/test_receiver.rs":"084eca59984b9a18651da52f2c4407355da3de1335916a12477652999e2d01cc","tests/test_round_trip.rs":"e5a9e8c546f43fba741028716f1f34596822accdbc52d0eccb92f98d98bad804","tests/test_shebang.rs":"f5772cadad5b56e3112cb16308b779f92bce1c3a48091fc9933deb2276a69331","tests/test_should_parse.rs":"1d3535698a446e2755bfc360676bdb161841a1f454cdef6e7556c6d06a95c89d","tests/test_size.rs":"5fae772bab66809d6708232f35cfb4a287882486763b0f763feec2ad79fbb68b","tests/test_stmt.rs":"ff6f6f447f46a52fb544353b7dcd2cd9e60781b297dcc86551bee613beaf2280","tests/test_token_trees.rs":"43e56a701817e3c3bfd0cae54a457dd7a38ccb3ca19da41e2b995fdf20e6ed18","tests/test_ty.rs":"01d33c67a72d0e030736b1be22cea916fde14681ee0253b8183905bccfcc5798","tests/test_visibility.rs":"7456fcb3a6634db509748aededff9c2d8b242d511a3e5ee3022e40b232892704","tests/zzz_stable.rs":"2a862e59cb446235ed99aec0e6ada8e16d3ecc30229b29d825b7c0bbc2602989"},"package":"c700597eca8a5a762beb35753ef6b94df201c81cca676604f547495a0d7f0081"} \ No newline at end of file +{"files":{"Cargo.toml":"7e402452414058c63bd46bb6e4c762b8b4744519f3951eb51e27dc6b3f1ddf34","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"03f3b53cf858536a0883aa5b5882ee61dcd0f1e71c0930c9106fcfa1d6aad2df","benches/file.rs":"b4724fc7c0f48b8f488e2632a1064f6c0bf16ded3969680fc3f4a2369536269b","benches/rust.rs":"ea6291ef2d2a83d94a3312fe179d48259f8ec0b04c961993ddd181d0a4ab740e","build.rs":"241f9e3af93b32d2d928ef9251d8ed2e67c6c64acc4aacce81f3aca58778e655","src/attr.rs":"41bb00e06cdebe3e3145ee7c68c4dd7c05c099bfc3e9fc858fb0a3a174d31730","src/await.rs":"8aa22e3c201cb2bdb6b4817fa00901f308ab06817607aa7b884c58c957705969","src/bigint.rs":"efc7f64959980653d73fe4f8bc2a3a2904dc05f45b02c6dc15cd316fa3d7c338","src/buffer.rs":"a5d6692938c2ec6ec140f70ec89fa93659fa227b52e8d381e9da7dd440f0249e","src/custom_keyword.rs":"9842ed7fafd6ebc15d4c9b060d3d97ae21bfd0c0c64bc34a5a0858549fc125db","src/custom_punctuation.rs":"ec75d5f83607cf6fa282e4290031c645ac3f95798cef6fd26886aa10e3a1e74f","src/data.rs":"767f2964b8f12d87b0f218aa43ffbdec411e26a702e61e93dda4f131277c8adb","src/derive.rs":"ee24a202be2d36ccdff576dd9cd765e94b33ef2286946e6725d75b08e777d462","src/discouraged.rs":"a1f3d85e20dedf50b1b7b4571d970a3a6e9b2de4afde7dd0c986fe240df2ba46","src/error.rs":"6c70d6b27f12674cf629ee7dc3c007435430ef3a3781c4d4c2b00a64f02062dd","src/export.rs":"d18438464c7ee1de7092c7c5d48dd9d114bdf184c1ea452c4fa709265cd19469","src/expr.rs":"f5302ed6e00b313f07cc38b48d93d489e48bf471a37d46320c49a1e6d381fb72","src/ext.rs":"1f648cff1d705a1cea64b32b77482b97a82d2fe0aaf63b40cade91e5c02dc969","src/file.rs":"f86697655222ae294215114f4eae8e6b0b5e2a935d6c479ff8f8f889c4efd2e2","src/gen/clone.rs":"8db60fc2bf515f9a65f4e98669427ce02ed0ccc9ffdad25d8fb39b38768ecaf1","src/gen/debug.rs":"facf4fb5c7e017dd890c4a9531f337659d7b55475aa44124abf48e088ad56fc5","src/gen/eq.rs":"576a4f1e4030434b0f0170f4d681d2c46292fda64ad5f3913623e1c6e858c24f","src/gen/fold.rs":"3f59e59ed8ad2ab5dd347bfbe41bbc785c2aabd8ae902087a584a6daed597182","src/gen/hash.rs":"458052bb0d64b2a722eaeef4461af80bce109cd97d19bd44dbd608e4c53a6520","src/gen/visit.rs":"23008c170d4dd3975232876a0a654921d9b6af57372cb9fcc133ca740588d666","src/gen/visit_mut.rs":"42886c3ee02ded72d9c3eec006e20431eaee0c6b90ddefc1a36ec7bf50c6a24a","src/gen_helper.rs":"ea6c66388365971db6a2fc86cbb208f7eacde77e245bc8623f27a3642a3d7741","src/generics.rs":"e96cdc4e4d85cd686fa4eaadf3a7f845a11f8316a82de066814cc7dc5f3a56c6","src/group.rs":"d9cd30ea5bd4d453293e8e8debbe388a0360c3c766f67c8499fec453a9a43cdc","src/ident.rs":"d67975d3dd89becde96579c0454a1357aa7c62da11bdf94f29ccf63514ffbc9d","src/item.rs":"4c22a35a082cf1f504829997add0465151fe465a2aae38312f000527b261d2c6","src/lib.rs":"5cc55c9fbfbdf50d54f437ce7eb544e5665fdd27ceb2e04db92c71dbfb9b90aa","src/lifetime.rs":"bd206f4471091498a8ac270c5f99d7d4b10eb614f452cd3ee614cab9e1b2f5e3","src/lit.rs":"c60c9840301504969040c409e0d328f5d574a2efbd15ebf638906f8d7e429761","src/lookahead.rs":"92ee63b48de02d3f6f1b09121f0fbac41d55cebc5771c8320e27df8482906152","src/mac.rs":"004cb89f9697564f6c9ee837e08ead68463ef946fb4c13c6c105adf2ba364b2b","src/macros.rs":"266590fd63a4a9d8637c6f8d36702acaace4ba59ab74c0883859efd1e260bae5","src/op.rs":"9d499022902743a6a0a19223b356449a979b90e60552d0446497d72750e646a4","src/parse.rs":"8b4aa518660dfd6310a5455b5624de01ad7ba42d11527b217f811b687b26e1fc","src/parse_macro_input.rs":"88929a1a7e5e72aa2d0b3459e52d8975afea856d159047ba4ab02ecbc5878a9c","src/parse_quote.rs":"80db945403d9731c5f3299a5819a5e2bb726c19fd9f256d50240bc32703c96b1","src/pat.rs":"a2df706ce090ccb8ad157570d8e3c4ef8196b96cc7ae98696105395b5d0b530d","src/path.rs":"92860452db410e754b9b2afd6eddb4e2a594629c2def43409ed94887b132e95b","src/print.rs":"da6529c1d9d21aaf6c835f66b4e67eacb7cf91a10eb5e9a2143b49bf99b3b5e1","src/punctuated.rs":"ac2b0bd8ffa6ce6d07ed6e0af7384a1120db7a0918406da89a45e929feac49ba","src/reserved.rs":"e70e028bd55cfa43e23cab4ba29e4dc53a3d91eff685ef2b6e57efc2b87a3428","src/sealed.rs":"896a495a5340eec898527f18bd4ddca408ea03ea0ee3af30074ff48deace778d","src/span.rs":"748c51c6feb223c26d3b1701f5bb98aee823666c775c98106cfa24fe29d8cec1","src/spanned.rs":"3ca016a943637653ab98e373dfb826a120f3c159867346fa38a844439944eb39","src/stmt.rs":"e68f76530606aab24e3587aa697fcd862c176e1cca0a50ab883c76bb91464f3d","src/thread.rs":"815eca6bd64f4eef7c447f0809e84108f5428ff50225224b373efd8fbb696874","src/token.rs":"5e423a696f80e281c322f37c87577f9fdc28607e9c007e24896a2b12da62d5ad","src/tt.rs":"32402645b6e82ef1e882945721b59b5fb7b0ee337d1972876362ecacef643d0f","src/ty.rs":"f574845ed494241393479459e1d007f26b55d991cb2aa7aeb098807916123fc7","src/verbatim.rs":"802a97df997432f18cac6e6200ff6ea29fb2474986005e0fcdbc2b65197f87f7","src/whitespace.rs":"e63dd0aa3d34029f17766a8b09c1a6e4479e36c552c8b7023d710a399333aace","tests/.gitignore":"22e782449a3c216db3f7215d5fb8882e316768e40beeec3833aae419ad8941db","tests/common/eq.rs":"8abdbfa71e480674626f7e3b560dd7df9c591871244088615f81a7f1b19b7b55","tests/common/mod.rs":"25ef6d7daa09bad3198a0e9e91b2812425f92db7c585c1e34a03a84d7362ccd8","tests/common/parse.rs":"81580f23583723f7a2a337c4d13ebc021057cd825562fb4e474caa7cc641fed9","tests/debug/gen.rs":"e30e2b6c61feb15abe11cee86c4edff9f7e7c9c79080447d44be97869c9a3adb","tests/debug/mod.rs":"868763d0ef1609a3ad5e05e9f1bfa0f813e91e7e9a36653414a188bb2fdaa425","tests/macros/mod.rs":"a93136b172377ffebe8b68fd596a86d6625f64ed6c3d5e7f5d6ad859e25d5623","tests/repo/mod.rs":"9db8af4588d16ff6bfe812b09807e8172a97f62ec4acf88082134e1acac084b6","tests/repo/progress.rs":"c08d0314a7f3ecf760d471f27da3cd2a500aeb9f1c8331bffb2aa648f9fabf3f","tests/test_asyncness.rs":"cff01db49d28ab23b0b258bc6c0a5cc4071be4fe7248eef344a5d79d2fb649b7","tests/test_attribute.rs":"0ffd99384e1a52ae17d9fed5c4053e411e8f9018decef07ffa621d1faa7329d8","tests/test_derive_input.rs":"610444351e3bf99366976bbf1da109c334a70ac9500caef366bcf9b68819829f","tests/test_expr.rs":"0ee83f6f6de950018c043efcc3e85776b4227dae3068309998a8d9709f2fc66c","tests/test_generics.rs":"9d713f90a79d6145efc89fb6f946029ca03486c632219950889da39940152ba0","tests/test_grouping.rs":"6276c3c73bba649dec5c97904ad2492879f918bc887a2c425d095c654ca0d925","tests/test_ident.rs":"9eb53d1e21edf23e7c9e14dc74dcc2b2538e9221e19dbcc0a44e3acc2e90f3f6","tests/test_item.rs":"4420ccd47fadbe6a5a5bc4d2284a6ff3124d0a89bea2aaab5ba198faf5eb01bb","tests/test_iterators.rs":"53ed6078d37550bd6765d2411e3660be401aef8a31a407350cc064a7d08c7c33","tests/test_lit.rs":"ef3f39da6ed67ba73b05eab3dda299887a455bac8e97701a90a94b636681588f","tests/test_meta.rs":"bd6910ec0eba05e814dad27dda0ea65e1f8b483e64d943213066ffd114a82b45","tests/test_parse_buffer.rs":"8bbe2d24ca8a3788f72c6908fc96c26d546f11c69687bf8d72727f851d5e2d27","tests/test_parse_stream.rs":"2f449a2c41a3dee6fd14bee24e1666a453cb808eda17332fd91afd127fcdd2a6","tests/test_pat.rs":"134091ba20e86c982dadbae668aebe66b1edd9619a01dedee989d1c7efde6b80","tests/test_path.rs":"13ae78e958f0d7334d11f32519f593968e5503d46e29ec345feede025f16113d","tests/test_precedence.rs":"976788a6593440f4cd7e791e5faaeabc6dbf8050ea76f8aeb53f4989ded22c1a","tests/test_receiver.rs":"084eca59984b9a18651da52f2c4407355da3de1335916a12477652999e2d01cc","tests/test_round_trip.rs":"e5a9e8c546f43fba741028716f1f34596822accdbc52d0eccb92f98d98bad804","tests/test_shebang.rs":"f5772cadad5b56e3112cb16308b779f92bce1c3a48091fc9933deb2276a69331","tests/test_should_parse.rs":"1d3535698a446e2755bfc360676bdb161841a1f454cdef6e7556c6d06a95c89d","tests/test_size.rs":"5fae772bab66809d6708232f35cfb4a287882486763b0f763feec2ad79fbb68b","tests/test_stmt.rs":"ff6f6f447f46a52fb544353b7dcd2cd9e60781b297dcc86551bee613beaf2280","tests/test_token_trees.rs":"43e56a701817e3c3bfd0cae54a457dd7a38ccb3ca19da41e2b995fdf20e6ed18","tests/test_ty.rs":"01d33c67a72d0e030736b1be22cea916fde14681ee0253b8183905bccfcc5798","tests/test_visibility.rs":"7456fcb3a6634db509748aededff9c2d8b242d511a3e5ee3022e40b232892704","tests/zzz_stable.rs":"2a862e59cb446235ed99aec0e6ada8e16d3ecc30229b29d825b7c0bbc2602989"},"package":"8fd9bc7ccc2688b3344c2f48b9b546648b25ce0b20fc717ee7fa7981a8ca9717"} \ No newline at end of file diff --git a/vendor/syn/Cargo.toml b/vendor/syn/Cargo.toml index feec55e95f..1b5a0e17ec 100644 --- a/vendor/syn/Cargo.toml +++ b/vendor/syn/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "syn" -version = "1.0.60" +version = "1.0.63" authors = ["David Tolnay "] include = ["/benches/**", "/build.rs", "/Cargo.toml", "/LICENSE-APACHE", "/LICENSE-MIT", "/README.md", "/src/**", "/tests/**"] description = "Parser for Rust source code" diff --git a/vendor/syn/src/expr.rs b/vendor/syn/src/expr.rs index 8e054cc7a5..510592de26 100644 --- a/vendor/syn/src/expr.rs +++ b/vendor/syn/src/expr.rs @@ -827,7 +827,11 @@ impl Expr { | Expr::TryBlock(ExprTryBlock { attrs, .. }) | Expr::Yield(ExprYield { attrs, .. }) => mem::replace(attrs, new), Expr::Verbatim(_) => Vec::new(), - Expr::__TestExhaustive(_) => unreachable!(), + + #[cfg(test)] + Expr::__TestExhaustive(_) => unimplemented!(), + #[cfg(not(test))] + _ => unreachable!(), } } } @@ -2326,7 +2330,11 @@ pub(crate) mod parsing { Pat::Type(_) => unreachable!(), Pat::Verbatim(_) => {} Pat::Wild(pat) => pat.attrs = attrs, - Pat::__TestExhaustive(_) => unreachable!(), + + #[cfg(test)] + Pat::__TestExhaustive(_) => unimplemented!(), + #[cfg(not(test))] + _ => unreachable!(), } Ok(pat) } diff --git a/vendor/syn/src/item.rs b/vendor/syn/src/item.rs index d5c3b277bd..4c168508cc 100644 --- a/vendor/syn/src/item.rs +++ b/vendor/syn/src/item.rs @@ -380,7 +380,11 @@ impl Item { | Item::Macro(ItemMacro { attrs, .. }) | Item::Macro2(ItemMacro2 { attrs, .. }) => mem::replace(attrs, new), Item::Verbatim(_) => Vec::new(), - Item::__TestExhaustive(_) => unreachable!(), + + #[cfg(test)] + Item::__TestExhaustive(_) => unimplemented!(), + #[cfg(not(test))] + _ => unreachable!(), } } } @@ -1164,7 +1168,6 @@ pub mod parsing { semi_token: Token![;], } - #[cfg_attr(doc_cfg, doc(cfg(feature = "parsing")))] impl Parse for FlexibleItemType { fn parse(input: ParseStream) -> Result { let vis: Visibility = input.parse()?; @@ -1176,14 +1179,14 @@ pub mod parsing { let mut bounds = Punctuated::new(); if colon_token.is_some() { loop { - bounds.push_value(input.parse::()?); if input.peek(Token![where]) || input.peek(Token![=]) || input.peek(Token![;]) { break; } - bounds.push_punct(input.parse::()?); + bounds.push_value(input.parse::()?); if input.peek(Token![where]) || input.peek(Token![=]) || input.peek(Token![;]) { break; } + bounds.push_punct(input.parse::()?); } } generics.where_clause = input.parse()?; @@ -1497,11 +1500,11 @@ pub mod parsing { abi, fn_token, ident, + generics, paren_token, inputs, - output, variadic, - generics, + output, }) } } @@ -1787,7 +1790,11 @@ pub mod parsing { ForeignItem::Type(item) => &mut item.attrs, ForeignItem::Macro(item) => &mut item.attrs, ForeignItem::Verbatim(_) => return Ok(item), - ForeignItem::__TestExhaustive(_) => unreachable!(), + + #[cfg(test)] + ForeignItem::__TestExhaustive(_) => unimplemented!(), + #[cfg(not(test))] + _ => unreachable!(), }; attrs.extend(item_attrs.drain(..)); *item_attrs = attrs; @@ -2265,7 +2272,12 @@ pub mod parsing { TraitItem::Method(item) => &mut item.attrs, TraitItem::Type(item) => &mut item.attrs, TraitItem::Macro(item) => &mut item.attrs, - TraitItem::Verbatim(_) | TraitItem::__TestExhaustive(_) => unreachable!(), + TraitItem::Verbatim(_) => unreachable!(), + + #[cfg(test)] + TraitItem::__TestExhaustive(_) => unimplemented!(), + #[cfg(not(test))] + _ => unreachable!(), }; attrs.extend(item_attrs.drain(..)); *item_attrs = attrs; @@ -2596,7 +2608,11 @@ pub mod parsing { ImplItem::Type(item) => &mut item.attrs, ImplItem::Macro(item) => &mut item.attrs, ImplItem::Verbatim(_) => return Ok(item), - ImplItem::__TestExhaustive(_) => unreachable!(), + + #[cfg(test)] + ImplItem::__TestExhaustive(_) => unimplemented!(), + #[cfg(not(test))] + _ => unreachable!(), }; attrs.extend(item_attrs.drain(..)); *item_attrs = attrs; diff --git a/vendor/syn/src/lib.rs b/vendor/syn/src/lib.rs index 2c201c9900..a364a6553d 100644 --- a/vendor/syn/src/lib.rs +++ b/vendor/syn/src/lib.rs @@ -250,7 +250,7 @@ //! dynamic library libproc_macro from rustc toolchain. // Syn types in rustdoc of other crates get linked to here. -#![doc(html_root_url = "https://docs.rs/syn/1.0.60")] +#![doc(html_root_url = "https://docs.rs/syn/1.0.63")] #![cfg_attr(doc_cfg, feature(doc_cfg))] #![allow(non_camel_case_types)] // Ignored clippy lints. @@ -259,7 +259,9 @@ clippy::eval_order_dependence, clippy::inherent_to_string, clippy::large_enum_variant, + clippy::manual_map, // https://github.com/rust-lang/rust-clippy/issues/6795 clippy::match_on_vec_items, + clippy::missing_panics_doc, clippy::needless_doctest_main, clippy::needless_pass_by_value, clippy::never_loop, diff --git a/vendor/syn/src/lifetime.rs b/vendor/syn/src/lifetime.rs index 9cec5eec3a..28cd7e3622 100644 --- a/vendor/syn/src/lifetime.rs +++ b/vendor/syn/src/lifetime.rs @@ -57,6 +57,17 @@ impl Lifetime { ident: Ident::new(&symbol[1..], span), } } + + pub fn span(&self) -> Span { + self.apostrophe + .join(self.ident.span()) + .unwrap_or(self.apostrophe) + } + + pub fn set_span(&mut self, span: Span) { + self.apostrophe = span; + self.ident.set_span(span); + } } impl Display for Lifetime { diff --git a/vendor/syn/src/lit.rs b/vendor/syn/src/lit.rs index d67ee88426..0aa50a590c 100644 --- a/vendor/syn/src/lit.rs +++ b/vendor/syn/src/lit.rs @@ -505,6 +505,24 @@ impl Display for LitFloat { } } +impl LitBool { + pub fn new(value: bool, span: Span) -> Self { + LitBool { value, span } + } + + pub fn value(&self) -> bool { + self.value + } + + pub fn span(&self) -> Span { + self.span + } + + pub fn set_span(&mut self, span: Span) { + self.span = span; + } +} + #[cfg(feature = "extra-traits")] mod debug_impls { use super::*; diff --git a/vendor/syn/src/punctuated.rs b/vendor/syn/src/punctuated.rs index 4d3496976c..f94edc2915 100644 --- a/vendor/syn/src/punctuated.rs +++ b/vendor/syn/src/punctuated.rs @@ -162,7 +162,11 @@ impl Punctuated { /// Panics if the sequence does not already have a trailing punctuation when /// this method is called. pub fn push_value(&mut self, value: T) { - assert!(self.empty_or_trailing()); + assert!( + self.empty_or_trailing(), + "Punctuated::push_value: cannot push value if Punctuated is missing trailing punctuation", + ); + self.last = Some(Box::new(value)); } @@ -174,7 +178,11 @@ impl Punctuated { /// /// Panics if the sequence is empty or already has a trailing punctuation. pub fn push_punct(&mut self, punctuation: P) { - assert!(self.last.is_some()); + assert!( + self.last.is_some(), + "Punctuated::push_punct: cannot push punctuation if Punctuated is empty or already has trailing punctuation", + ); + let last = self.last.take().unwrap(); self.inner.push((*last, punctuation)); } @@ -228,7 +236,10 @@ impl Punctuated { where P: Default, { - assert!(index <= self.len()); + assert!( + index <= self.len(), + "Punctuated::insert: index out of range", + ); if index == self.len() { self.push(value); @@ -454,7 +465,11 @@ impl FromIterator> for Punctuated { impl Extend> for Punctuated { fn extend>>(&mut self, i: I) { - assert!(self.empty_or_trailing()); + assert!( + self.empty_or_trailing(), + "Punctuated::extend: Punctuated is not empty or does not have a trailing punctuation", + ); + let mut nomore = false; for pair in i { if nomore { diff --git a/vendor/syn/tests/common/eq.rs b/vendor/syn/tests/common/eq.rs index 7830163d55..51fb7c77cd 100644 --- a/vendor/syn/tests/common/eq.rs +++ b/vendor/syn/tests/common/eq.rs @@ -7,17 +7,17 @@ use rustc_ast::ast::{ AssocTyConstraintKind, Async, AttrId, AttrItem, AttrKind, AttrStyle, Attribute, BareFnTy, BinOpKind, BindingMode, Block, BlockCheckMode, BorrowKind, CaptureBy, Const, Crate, CrateSugar, Defaultness, EnumDef, Expr, ExprKind, Extern, Field, FieldPat, FloatTy, FnDecl, FnHeader, - FnRetTy, FnSig, ForeignItemKind, ForeignMod, GenericArg, GenericArgs, GenericBound, - GenericParam, GenericParamKind, Generics, GlobalAsm, ImplPolarity, InlineAsm, InlineAsmOperand, - InlineAsmOptions, InlineAsmRegOrRegClass, InlineAsmTemplatePiece, IntTy, IsAuto, Item, - ItemKind, Label, Lifetime, Lit, LitFloatType, LitIntType, LitKind, LlvmAsmDialect, - LlvmInlineAsm, LlvmInlineAsmOutput, Local, MacArgs, MacCall, MacCallStmt, MacDelimiter, - MacStmtStyle, MacroDef, Mod, Movability, MutTy, Mutability, NodeId, Param, ParenthesizedArgs, - Pat, PatKind, Path, PathSegment, PolyTraitRef, QSelf, RangeEnd, RangeLimits, RangeSyntax, Stmt, - StmtKind, StrLit, StrStyle, StructField, StructRest, TraitBoundModifier, TraitObjectSyntax, - TraitRef, Ty, TyKind, UintTy, UnOp, Unsafe, UnsafeSource, UseTree, UseTreeKind, Variant, - VariantData, Visibility, VisibilityKind, WhereBoundPredicate, WhereClause, WhereEqPredicate, - WherePredicate, WhereRegionPredicate, + FnKind, FnRetTy, FnSig, ForeignItemKind, ForeignMod, GenericArg, GenericArgs, GenericBound, + GenericParam, GenericParamKind, Generics, GlobalAsm, ImplKind, ImplPolarity, Inline, InlineAsm, + InlineAsmOperand, InlineAsmOptions, InlineAsmRegOrRegClass, InlineAsmTemplatePiece, IntTy, + IsAuto, Item, ItemKind, Label, Lifetime, Lit, LitFloatType, LitIntType, LitKind, + LlvmAsmDialect, LlvmInlineAsm, LlvmInlineAsmOutput, Local, MacArgs, MacCall, MacCallStmt, + MacDelimiter, MacStmtStyle, MacroDef, ModKind, Movability, MutTy, Mutability, NodeId, Param, + ParenthesizedArgs, Pat, PatKind, Path, PathSegment, PolyTraitRef, QSelf, RangeEnd, RangeLimits, + RangeSyntax, Stmt, StmtKind, StrLit, StrStyle, StructField, StructRest, TraitBoundModifier, + TraitKind, TraitObjectSyntax, TraitRef, Ty, TyAliasKind, TyKind, UintTy, UnOp, Unsafe, + UnsafeSource, UseTree, UseTreeKind, Variant, VariantData, Visibility, VisibilityKind, + WhereBoundPredicate, WhereClause, WhereEqPredicate, WherePredicate, WhereRegionPredicate, }; use rustc_ast::ptr::P; use rustc_ast::token::{self, CommentKind, DelimToken, Nonterminal, Token, TokenKind}; @@ -32,6 +32,12 @@ pub trait SpanlessEq { fn eq(&self, other: &Self) -> bool; } +impl SpanlessEq for Box { + fn eq(&self, other: &Self) -> bool { + SpanlessEq::eq(&**self, &**other) + } +} + impl SpanlessEq for P { fn eq(&self, other: &Self) -> bool { SpanlessEq::eq(&**self, &**other) @@ -129,47 +135,47 @@ spanless_eq_partial_eq!(token::LitKind); macro_rules! spanless_eq_struct { { - $($name:ident)::+ $(<$param:ident>)?; - $([$field:ident $other:ident])* - $(![$ignore:ident])* + $($name:ident)::+ $(<$param:ident>)? + $([$field:tt $this:ident $other:ident])* + $(![$ignore:tt])*; } => { impl $(<$param: SpanlessEq>)* SpanlessEq for $($name)::+ $(<$param>)* { fn eq(&self, other: &Self) -> bool { - let $($name)::+ { $($field,)* $($ignore: _,)* } = self; + let $($name)::+ { $($field: $this,)* $($ignore: _,)* } = self; let $($name)::+ { $($field: $other,)* $($ignore: _,)* } = other; - true $(&& SpanlessEq::eq($field, $other))* + true $(&& SpanlessEq::eq($this, $other))* } } }; { - $($name:ident)::+ $(<$param:ident>)?; - $([$field:ident $other:ident])* - $(![$ignore:ident])* - $next:ident + $($name:ident)::+ $(<$param:ident>)? + $([$field:tt $this:ident $other:ident])* + $(![$ignore:tt])*; + !$next:tt $($rest:tt)* } => { spanless_eq_struct! { - $($name)::+ $(<$param>)*; - $([$field $other])* - [$next other] + $($name)::+ $(<$param>)* + $([$field $this $other])* $(![$ignore])* + ![$next]; $($rest)* } }; { - $($name:ident)::+ $(<$param:ident>)?; - $([$field:ident $other:ident])* - $(![$ignore:ident])* - !$next:ident + $($name:ident)::+ $(<$param:ident>)? + $([$field:tt $this:ident $other:ident])* + $(![$ignore:tt])*; + $next:tt $($rest:tt)* } => { spanless_eq_struct! { - $($name)::+ $(<$param>)*; - $([$field $other])* - $(![$ignore])* - ![$next] + $($name)::+ $(<$param>)* + $([$field $this $other])* + [$next this other] + $(![$ignore])*; $($rest)* } }; @@ -282,18 +288,20 @@ spanless_eq_struct!(AttrItem; path args tokens); spanless_eq_struct!(Attribute; kind id style span); spanless_eq_struct!(BareFnTy; unsafety ext generic_params decl); spanless_eq_struct!(Block; stmts id rules span tokens); -spanless_eq_struct!(Crate; module attrs span proc_macros); +spanless_eq_struct!(Crate; attrs items span proc_macros); spanless_eq_struct!(EnumDef; variants); spanless_eq_struct!(Expr; id kind span attrs !tokens); spanless_eq_struct!(Field; attrs id span ident expr is_shorthand is_placeholder); spanless_eq_struct!(FieldPat; ident pat is_shorthand attrs id span is_placeholder); spanless_eq_struct!(FnDecl; inputs output); spanless_eq_struct!(FnHeader; constness asyncness unsafety ext); +spanless_eq_struct!(FnKind; 0 1 2 3); spanless_eq_struct!(FnSig; header decl span); spanless_eq_struct!(ForeignMod; unsafety abi items); spanless_eq_struct!(GenericParam; id ident attrs bounds is_placeholder kind); spanless_eq_struct!(Generics; params where_clause span); spanless_eq_struct!(GlobalAsm; asm); +spanless_eq_struct!(ImplKind; unsafety polarity defaultness constness generics of_trait self_ty items); spanless_eq_struct!(InlineAsm; template operands options line_spans); spanless_eq_struct!(Item; attrs id span vis ident kind !tokens); spanless_eq_struct!(Label; ident); @@ -305,7 +313,6 @@ spanless_eq_struct!(Local; pat ty init id span attrs !tokens); spanless_eq_struct!(MacCall; path args prior_type_ascription); spanless_eq_struct!(MacCallStmt; mac style attrs tokens); spanless_eq_struct!(MacroDef; body macro_rules); -spanless_eq_struct!(Mod; inner unsafety items inline); spanless_eq_struct!(MutTy; ty mutbl); spanless_eq_struct!(ParenthesizedArgs; span inputs inputs_span output); spanless_eq_struct!(Pat; id kind span tokens); @@ -317,8 +324,10 @@ spanless_eq_struct!(Stmt; id kind span); spanless_eq_struct!(StrLit; style symbol suffix span symbol_unescaped); spanless_eq_struct!(StructField; attrs id span vis ident ty is_placeholder); spanless_eq_struct!(Token; kind span); +spanless_eq_struct!(TraitKind; 0 1 2 3 4); spanless_eq_struct!(TraitRef; path ref_id); spanless_eq_struct!(Ty; id kind span tokens); +spanless_eq_struct!(TyAliasKind; 0 1 2 3); spanless_eq_struct!(UseTree; prefix kind span); spanless_eq_struct!(Variant; attrs id span !vis ident data disr_expr is_placeholder); spanless_eq_struct!(Visibility; kind span tokens); @@ -328,7 +337,7 @@ spanless_eq_struct!(WhereEqPredicate; id span lhs_ty rhs_ty); spanless_eq_struct!(WhereRegionPredicate; span lifetime bounds); spanless_eq_struct!(token::Lit; kind symbol suffix); spanless_eq_enum!(AngleBracketedArg; Arg(0) Constraint(0)); -spanless_eq_enum!(AssocItemKind; Const(0 1 2) Fn(0 1 2 3) TyAlias(0 1 2 3) MacCall(0)); +spanless_eq_enum!(AssocItemKind; Const(0 1 2) Fn(0) TyAlias(0) MacCall(0)); spanless_eq_enum!(AssocTyConstraintKind; Equality(ty) Bound(bounds)); spanless_eq_enum!(Async; Yes(span closure_id return_impl_trait_id) No); spanless_eq_enum!(AttrStyle; Outer Inner); @@ -343,12 +352,13 @@ spanless_eq_enum!(Defaultness; Default(0) Final); spanless_eq_enum!(Extern; None Implicit Explicit(0)); spanless_eq_enum!(FloatTy; F32 F64); spanless_eq_enum!(FnRetTy; Default(0) Ty(0)); -spanless_eq_enum!(ForeignItemKind; Static(0 1 2) Fn(0 1 2 3) TyAlias(0 1 2 3) MacCall(0)); +spanless_eq_enum!(ForeignItemKind; Static(0 1 2) Fn(0) TyAlias(0) MacCall(0)); spanless_eq_enum!(GenericArg; Lifetime(0) Type(0) Const(0)); spanless_eq_enum!(GenericArgs; AngleBracketed(0) Parenthesized(0)); spanless_eq_enum!(GenericBound; Trait(0 1) Outlives(0)); spanless_eq_enum!(GenericParamKind; Lifetime Type(default) Const(ty kw_span default)); spanless_eq_enum!(ImplPolarity; Positive Negative(0)); +spanless_eq_enum!(Inline; Yes No); spanless_eq_enum!(InlineAsmRegOrRegClass; Reg(0) RegClass(0)); spanless_eq_enum!(InlineAsmTemplatePiece; String(0) Placeholder(operand_idx modifier span)); spanless_eq_enum!(IntTy; Isize I8 I16 I32 I64 I128); @@ -359,6 +369,7 @@ spanless_eq_enum!(LlvmAsmDialect; Att Intel); spanless_eq_enum!(MacArgs; Empty Delimited(0 1 2) Eq(0 1)); spanless_eq_enum!(MacDelimiter; Parenthesis Bracket Brace); spanless_eq_enum!(MacStmtStyle; Semicolon Braces NoBraces); +spanless_eq_enum!(ModKind; Loaded(0 1 2) Unloaded); spanless_eq_enum!(Movability; Static Movable); spanless_eq_enum!(Mutability; Mut Not); spanless_eq_enum!(RangeEnd; Included(0) Excluded); @@ -389,10 +400,8 @@ spanless_eq_enum!(InlineAsmOperand; In(reg expr) Out(reg late expr) InOut(reg late expr) SplitInOut(reg late in_expr out_expr) Const(expr) Sym(expr)); spanless_eq_enum!(ItemKind; ExternCrate(0) Use(0) Static(0 1 2) Const(0 1 2) - Fn(0 1 2 3) Mod(0) ForeignMod(0) GlobalAsm(0) TyAlias(0 1 2 3) Enum(0 1) - Struct(0 1) Union(0 1) Trait(0 1 2 3 4) TraitAlias(0 1) - Impl(unsafety polarity defaultness constness generics of_trait self_ty items) - MacCall(0) MacroDef(0)); + Fn(0) Mod(0 1) ForeignMod(0) GlobalAsm(0) TyAlias(0) Enum(0 1) Struct(0 1) + Union(0 1) Trait(0) TraitAlias(0 1) Impl(0) MacCall(0) MacroDef(0)); spanless_eq_enum!(LitKind; Str(0 1) ByteStr(0) Byte(0) Char(0) Int(0 1) Float(0 1) Bool(0) Err(0)); spanless_eq_enum!(PatKind; Wild Ident(0 1 2) Struct(0 1 2) TupleStruct(0 1) diff --git a/vendor/syn/tests/repo/mod.rs b/vendor/syn/tests/repo/mod.rs index afb712731d..1aec125535 100644 --- a/vendor/syn/tests/repo/mod.rs +++ b/vendor/syn/tests/repo/mod.rs @@ -8,7 +8,7 @@ use std::path::Path; use tar::Archive; use walkdir::DirEntry; -const REVISION: &str = "72da5a9d85a522b11e80d0fdd1fd95247d442604"; +const REVISION: &str = "e708cbd91c9cae4426d69270248362b423324556"; #[rustfmt::skip] static EXCLUDE: &[&str] = &[ @@ -27,11 +27,11 @@ static EXCLUDE: &[&str] = &[ "src/test/rustdoc-ui/test-compile-fail3.rs", "src/test/ui/include-single-expr-helper.rs", "src/test/ui/include-single-expr-helper-1.rs", - "src/test/ui/issues/auxiliary/issue-21146-inc.rs", "src/test/ui/json-bom-plus-crlf-multifile-aux.rs", "src/test/ui/lint/expansion-time-include.rs", "src/test/ui/macros/auxiliary/macro-comma-support.rs", "src/test/ui/macros/auxiliary/macro-include-items-expr.rs", + "src/test/ui/parser/auxiliary/issue-21146-inc.rs", ]; pub fn base_dir_filter(entry: &DirEntry) -> bool { diff --git a/vendor/syn/tests/test_item.rs b/vendor/syn/tests/test_item.rs index 7695f19906..712c6c6f42 100644 --- a/vendor/syn/tests/test_item.rs +++ b/vendor/syn/tests/test_item.rs @@ -241,3 +241,28 @@ fn test_supertraits() { } "###); } + +#[test] +fn test_type_empty_bounds() { + #[rustfmt::skip] + let tokens = quote! { + trait Foo { + type Bar: ; + } + }; + + snapshot!(tokens as ItemTrait, @r###" + ItemTrait { + vis: Inherited, + ident: "Foo", + generics: Generics, + items: [ + TraitItem::Type { + ident: "Bar", + generics: Generics, + colon_token: Some, + }, + ], + } + "###); +} diff --git a/vendor/thread_local/.cargo-checksum.json b/vendor/thread_local/.cargo-checksum.json index b49909dabb..661a82967a 100644 --- a/vendor/thread_local/.cargo-checksum.json +++ b/vendor/thread_local/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"6e84425a819ffa4b199926a3b476162077382042cc0778ac95514178ed039ba3","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"44a77143b8ea0cba5a64873fa77c76aad209d8d80068b2bd11986dadb9f97ed7","benches/thread_local.rs":"29f8fbc4fc7cf0b93b02bbf20e73113cbde2388d962cd5c617918f900a6893ec","src/cached.rs":"253cb48da470265f4c4702a4f9f6b8670860cb092d8304d807717d751d0b3350","src/lib.rs":"ab159446e933b71ace4eb8df8b41b7bd1a86196f40939a92929759128d9d310d","src/thread_id.rs":"53ae035d18d31eae822c9ff82219da34deed1234686d6fe3a82ca5da51ffd6a1","src/unreachable.rs":"f0c65f1b0516cc92fbd7df2c8c8edfdac5362377d27ae5b91a12204673e2fd73"},"package":"d8208a331e1cb318dd5bd76951d2b8fc48ca38a69f5f4e4af1b6a9f8c6236915"} \ No newline at end of file +{"files":{"Cargo.toml":"c541795414106f6f9994c300e11baf0ce8883dd932e61cfcc06bdda9c61a1f87","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"c9a75f18b9ab2927829a208fc6aa2cf4e63b8420887ba29cdb265d6619ae82d5","README.md":"44a77143b8ea0cba5a64873fa77c76aad209d8d80068b2bd11986dadb9f97ed7","benches/thread_local.rs":"29f8fbc4fc7cf0b93b02bbf20e73113cbde2388d962cd5c617918f900a6893ec","src/cached.rs":"253cb48da470265f4c4702a4f9f6b8670860cb092d8304d807717d751d0b3350","src/lib.rs":"0ac16df46dc9980aa09ed6327733bfc0485bc0b5925f16415b100f5c0293419e","src/thread_id.rs":"53ae035d18d31eae822c9ff82219da34deed1234686d6fe3a82ca5da51ffd6a1","src/unreachable.rs":"f0c65f1b0516cc92fbd7df2c8c8edfdac5362377d27ae5b91a12204673e2fd73"},"package":"8018d24e04c95ac8790716a5987d0fec4f8b27249ffa0f7d33f1369bdfb88cbd"} \ No newline at end of file diff --git a/vendor/thread_local/Cargo.toml b/vendor/thread_local/Cargo.toml index bc4c390de6..3e76c4c375 100644 --- a/vendor/thread_local/Cargo.toml +++ b/vendor/thread_local/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "thread_local" -version = "1.1.2" +version = "1.1.3" authors = ["Amanieu d'Antras "] description = "Per-object thread-local storage" documentation = "https://docs.rs/thread_local/" diff --git a/vendor/thread_local/src/lib.rs b/vendor/thread_local/src/lib.rs index 98387edb7a..f26f6edc43 100644 --- a/vendor/thread_local/src/lib.rs +++ b/vendor/thread_local/src/lib.rs @@ -119,6 +119,16 @@ struct Entry { value: UnsafeCell>, } +impl Drop for Entry { + fn drop(&mut self) { + unsafe { + if *self.present.get_mut() { + ptr::drop_in_place((*self.value.get()).as_mut_ptr()); + } + } + } +} + // ThreadLocal is always Sync, even if T isn't unsafe impl Sync for ThreadLocal {} @@ -602,6 +612,23 @@ mod tests { assert_eq!(vec![1, 2, 3], v); } + #[test] + fn test_drop() { + let local = ThreadLocal::new(); + struct Dropped(Arc); + impl Drop for Dropped { + fn drop(&mut self) { + self.0.fetch_add(1, Relaxed); + } + } + + let dropped = Arc::new(AtomicUsize::new(0)); + local.get_or(|| Dropped(dropped.clone())); + assert_eq!(dropped.load(Relaxed), 0); + drop(local); + assert_eq!(dropped.load(Relaxed), 1); + } + #[test] fn is_sync() { fn foo() {} diff --git a/vendor/time/.cargo-checksum.json b/vendor/time/.cargo-checksum.json index 901b364212..f6085da3f1 100644 --- a/vendor/time/.cargo-checksum.json +++ b/vendor/time/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"37a749b23d43c8ad48eecfa03b7483b76dded90290150fab232c014a59350e00","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"35b591c7481ec3ae59210fa4f9b7cecb1b16e632bfd6193b032239e74f9bfdb8","src/display.rs":"52d16abaa37b3ab577747c7d9d2ed6ded1b126458e980dc3e1a571fa6e1f9fda","src/duration.rs":"c706d392bdb7f65b23fcc20189a9a77c50b765b9c548e247238424ed6fb56a46","src/lib.rs":"fcd2f8739dab93a8e39aed1464b48f0f11d7bb0a3e2516b683af41dc8920d298","src/parse.rs":"65bd9142d8c15eb54a8d4db6e2c48bf1adbcc875953141c17e07ba58f356a027","src/sys.rs":"cb604129e4b83ad701234562e62a137cde2ba52c9eb1b1f17d4f308e182cabaa"},"package":"6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255"} \ No newline at end of file +{"files":{"Cargo.toml":"ddebccd9128093c3fdf84b4f6a131fe634c85e8fc2059afed9ea30e02fe22c58","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"35b591c7481ec3ae59210fa4f9b7cecb1b16e632bfd6193b032239e74f9bfdb8","src/display.rs":"52d16abaa37b3ab577747c7d9d2ed6ded1b126458e980dc3e1a571fa6e1f9fda","src/duration.rs":"c706d392bdb7f65b23fcc20189a9a77c50b765b9c548e247238424ed6fb56a46","src/lib.rs":"720e380829cda276466bce34d6a29a2f7aec1f750e4b4522b217c57930380545","src/parse.rs":"65bd9142d8c15eb54a8d4db6e2c48bf1adbcc875953141c17e07ba58f356a027","src/sys.rs":"851994516ff29dd9f5749fa19b1db13b7afe484e4bd1d279b420fda7ed8404ab"},"package":"ca8a50ef2360fbd1eeb0ecd46795a87a19024eb4b53c5dc916ca1fd95fe62438"} \ No newline at end of file diff --git a/vendor/time/Cargo.toml b/vendor/time/Cargo.toml index 02b0f6af96..51e5ab1d10 100644 --- a/vendor/time/Cargo.toml +++ b/vendor/time/Cargo.toml @@ -12,7 +12,7 @@ [package] name = "time" -version = "0.1.44" +version = "0.1.43" authors = ["The Rust Project Developers"] exclude = [".github", "benches"] description = "Utilities for working with time-related functions in Rust.\n" @@ -33,8 +33,6 @@ version = "0.4" [dev-dependencies.winapi] version = "0.3.0" features = ["std", "processthreadsapi", "winbase"] -[target."cfg(target_os = \"wasi\")".dependencies.wasi] -version = "=0.10.0" [target."cfg(windows)".dependencies.winapi] version = "0.3.0" features = ["std", "minwinbase", "minwindef", "ntdef", "profileapi", "sysinfoapi", "timezoneapi"] diff --git a/vendor/time/src/lib.rs b/vendor/time/src/lib.rs index 2627cc1648..07c38e4066 100644 --- a/vendor/time/src/lib.rs +++ b/vendor/time/src/lib.rs @@ -42,8 +42,6 @@ #[cfg(windows)] extern crate winapi; #[cfg(feature = "rustc-serialize")] extern crate rustc_serialize; -#[cfg(target_os = "wasi")] extern crate wasi; - #[cfg(test)] #[macro_use] extern crate log; use std::cmp::Ordering; diff --git a/vendor/time/src/sys.rs b/vendor/time/src/sys.rs index 22b77e1079..80de8fa2c2 100644 --- a/vendor/time/src/sys.rs +++ b/vendor/time/src/sys.rs @@ -69,7 +69,7 @@ mod common { } } -#[cfg(all(target_arch = "wasm32", not(any(target_os = "emscripten", target_os = "wasi"))))] +#[cfg(all(target_arch = "wasm32", not(target_os = "emscripten")))] mod inner { use std::ops::{Add, Sub}; use Tm; @@ -121,7 +121,7 @@ mod inner { impl Sub for SteadyTime { type Output = SteadyTime; fn sub(self, _other: Duration) -> SteadyTime { - unimplemented!() + unimplemented!() } } @@ -133,84 +133,6 @@ mod inner { } } -#[cfg(target_os = "wasi")] -mod inner { - use std::ops::{Add, Sub}; - use Tm; - use Duration; - use super::common::{time_to_tm, tm_to_time}; - use wasi::{clock_time_get, CLOCKID_MONOTONIC, CLOCKID_REALTIME}; - - #[derive(Copy, Clone, Debug, PartialOrd, Ord, PartialEq, Eq)] - pub struct SteadyTime { - t: u64 - } - - pub fn time_to_utc_tm(sec: i64, tm: &mut Tm) { - time_to_tm(sec, tm); - } - - pub fn time_to_local_tm(sec: i64, tm: &mut Tm) { - // FIXME: Add timezone logic - time_to_tm(sec, tm); - } - - pub fn utc_tm_to_time(tm: &Tm) -> i64 { - tm_to_time(tm) - } - - pub fn local_tm_to_time(tm: &Tm) -> i64 { - // FIXME: Add timezone logic - tm_to_time(tm) - } - - pub fn get_time() -> (i64, i32) { - let ts = get_precise_ns(); - ( - ts as i64 / 1_000_000_000, - (ts as i64 % 1_000_000_000) as i32, - ) - } - - pub fn get_precise_ns() -> u64 { - unsafe { clock_time_get(CLOCKID_REALTIME, 1_000_000_000) } - .expect("Host doesn't implement a real-time clock") - } - - impl SteadyTime { - pub fn now() -> SteadyTime { - SteadyTime { - t: unsafe { clock_time_get(CLOCKID_MONOTONIC, 1_000_000_000) } - .expect("Host doesn't implement a monotonic clock"), - } - } - } - - impl Sub for SteadyTime { - type Output = Duration; - fn sub(self, other: SteadyTime) -> Duration { - Duration::nanoseconds(self.t as i64 - other.t as i64) - } - } - - impl Sub for SteadyTime { - type Output = SteadyTime; - fn sub(self, other: Duration) -> SteadyTime { - self + -other - } - } - - impl Add for SteadyTime { - type Output = SteadyTime; - fn add(self, other: Duration) -> SteadyTime { - let delta = other.num_nanoseconds().unwrap(); - SteadyTime { - t: (self.t as i64 + delta) as u64, - } - } - } -} - #[cfg(target_env = "sgx")] mod inner { use std::ops::{Add, Sub}; diff --git a/vendor/tracing-attributes/.cargo-checksum.json b/vendor/tracing-attributes/.cargo-checksum.json index 73c289bade..8ab6b11889 100644 --- a/vendor/tracing-attributes/.cargo-checksum.json +++ b/vendor/tracing-attributes/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"483134d90f901256469597413c86d93dfbc52ae7693f624396a9575f75164688","Cargo.toml":"4ac3312e593bfe10f9063e575417d3052a14fafdb78bad84f016d5c28da7d6c8","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"44464cf3efa1446c86625c75158b863ab8b460ba4806e74e26856a75784aeae0","src/lib.rs":"04f984d096d877b62d57ec33c652558d641f0958721ed891ee9cd8b2f93c70d5","tests/async_fn.rs":"192895c1ce82f6bff2b39f82b5e9f8a20d8ee1c83bd3d39570a28b5b69bd3a58","tests/destructuring.rs":"9f3b48bd2566074936ae6e5923415d1ec629cb38b66448b9a92564fdfc9370aa","tests/err.rs":"742610ea3907b012135c7363aa0309f7e8cf0d17985aaf6a9a9a481cc4b805e2","tests/fields.rs":"29098441508e3339fdd9de9dcc3d6639eae1f81fabaf3cc9ae7163cc7bf716bd","tests/instrument.rs":"916ad553bfab6b32603bed32c2f4ac6c0eb86d998e9f0006940d764b4f500bf6","tests/levels.rs":"5d82ef5c55d1e53c240ad8d6ad3ecaeb330207a0c18a73a0ae46d75f6ca2679a","tests/names.rs":"89cf1d423d9fdfea1c1d08f6b05bd02564eaa58c10e17c41c8b4c8aba1a52c45","tests/support.rs":"7dcd5ee94222daec2e116bb65d0a9f0bcc38a5199b2cfa51eadd2d330b3c5159","tests/targets.rs":"6dc10489a505f1d2124a38c10eaaeaf8f9108ab50d925c77f9b9214d058d716b"},"package":"80e0ccfc3378da0cce270c946b676a376943f5cd16aeba64568e7939806f4ada"} \ No newline at end of file +{"files":{"CHANGELOG.md":"17bc8cba03dc84e386f1b751b8e4af2c10dedf0d1d2fb7a8e4a9c465d583c1e7","Cargo.toml":"c921ec9f8f123776df6470121794be53baf54aa3e1641406cf8dd734625b850d","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"7a9b58a50273f92618758b577e646e5f142ffbedfa1f3cc6673142854fa4e71b","src/lib.rs":"a641953f60568e59e4fdcfebc97012b65aab64fe1ad1b9e1bb2b14b9dfd7888e","tests/async_fn.rs":"93b107fc0a55dfb894536e68029152d111aef90bf3e309b6a4518b02f14c4311","tests/destructuring.rs":"9f3b48bd2566074936ae6e5923415d1ec629cb38b66448b9a92564fdfc9370aa","tests/err.rs":"c820f0a596d1f7fdd32dd6912b9027560cc11805d354e84341856ff5dcb6ab62","tests/fields.rs":"29098441508e3339fdd9de9dcc3d6639eae1f81fabaf3cc9ae7163cc7bf716bd","tests/instrument.rs":"0b6b7584eeab44f80d6d9108daf64c6bed62f187656fddc071e010f8119bf246","tests/levels.rs":"5d82ef5c55d1e53c240ad8d6ad3ecaeb330207a0c18a73a0ae46d75f6ca2679a","tests/names.rs":"89cf1d423d9fdfea1c1d08f6b05bd02564eaa58c10e17c41c8b4c8aba1a52c45","tests/support.rs":"7dcd5ee94222daec2e116bb65d0a9f0bcc38a5199b2cfa51eadd2d330b3c5159","tests/targets.rs":"6dc10489a505f1d2124a38c10eaaeaf8f9108ab50d925c77f9b9214d058d716b"},"package":"a8a9bd1db7706f2373a190b0d067146caa39350c486f3d455b0e33b431f94c07"} \ No newline at end of file diff --git a/vendor/tracing-attributes/CHANGELOG.md b/vendor/tracing-attributes/CHANGELOG.md index 97ae930af4..4f6a55871e 100644 --- a/vendor/tracing-attributes/CHANGELOG.md +++ b/vendor/tracing-attributes/CHANGELOG.md @@ -1,3 +1,38 @@ + +# 0.1.13 (February 17, 2021) + +### Fixed + +- Compiler error when using `#[instrument(err)]` on functions which return `impl + Trait` ([#1236]) + +[#1236]: https://github.com/tokio-rs/tracing/pull/1236 + +# 0.1.12 (February 4, 2021) + +### Fixed + +- Compiler error when using `#[instrument(err)]` on functions with mutable + parameters ([#1167]) +- Missing function visibility modifier when using `#[instrument]` with + `async-trait` ([#977]) +- Multiple documentation fixes and improvements ([#965], [#981], [#1215]) + +### Changed + +- `tracing-futures` dependency is no longer required when using `#[instrument]` + on async functions ([#808]) + +Thanks to @nagisa, @Txuritan, @TaKO8Ki, and @okready for contributing to this +release! + +[#1167]: https://github.com/tokio-rs/tracing/pull/1167 +[#977]: https://github.com/tokio-rs/tracing/pull/977 +[#965]: https://github.com/tokio-rs/tracing/pull/965 +[#981]: https://github.com/tokio-rs/tracing/pull/981 +[#1215]: https://github.com/tokio-rs/tracing/pull/1215 +[#808]: https://github.com/tokio-rs/tracing/pull/808 + # 0.1.11 (August 18, 2020) ### Fixed @@ -5,7 +40,7 @@ - Corrected wrong minimum supported Rust version note in docs (#941) - Removed unused `syn` features (#928) -Thanks to new contributor @jhpratt for contributing to this release!` +Thanks to new contributor @jhpratt for contributing to this release! # 0.1.10 (August 10, 2020) diff --git a/vendor/tracing-attributes/Cargo.toml b/vendor/tracing-attributes/Cargo.toml index 564626cf75..24c78c9363 100644 --- a/vendor/tracing-attributes/Cargo.toml +++ b/vendor/tracing-attributes/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "tracing-attributes" -version = "0.1.11" +version = "0.1.13" authors = ["Tokio Contributors ", "Eliza Weisman ", "David Barsky "] description = "Procedural macro attributes for automatically instrumenting functions.\n" homepage = "https://tokio.rs" @@ -47,9 +47,6 @@ version = "0.1" [dev-dependencies.tracing-core] version = "0.1" -[dev-dependencies.tracing-futures] -version = "0.2" - [features] async-await = [] [badges.maintenance] diff --git a/vendor/tracing-attributes/README.md b/vendor/tracing-attributes/README.md index a1dc2ee714..e13e2badc1 100644 --- a/vendor/tracing-attributes/README.md +++ b/vendor/tracing-attributes/README.md @@ -18,7 +18,7 @@ Macro attributes for application-level tracing. [crates-badge]: https://img.shields.io/crates/v/tracing-attributes.svg [crates-url]: https://crates.io/crates/tracing-attributes [docs-badge]: https://docs.rs/tracing-attributes/badge.svg -[docs-url]: https://docs.rs/tracing-attributes/0.1.11 +[docs-url]: https://docs.rs/tracing-attributes/0.1.13 [docs-master-badge]: https://img.shields.io/badge/docs-master-blue [docs-master-url]: https://tracing-rs.netlify.com/tracing_attributes [mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg @@ -37,7 +37,7 @@ structured, event-based diagnostic information. This crate provides the Note that this macro is also re-exported by the main `tracing` crate. -*Compiler support: [requires `rustc` 1.40+][msrv]* +*Compiler support: [requires `rustc` 1.42+][msrv]* [msrv]: #supported-rust-versions @@ -47,7 +47,7 @@ First, add this to your `Cargo.toml`: ```toml [dependencies] -tracing-attributes = "0.1.11" +tracing-attributes = "0.1.13" ``` @@ -69,7 +69,7 @@ pub fn my_function(my_arg: usize) { ## Supported Rust Versions Tracing is built against the latest stable release. The minimum supported -version is 1.40. The current Tracing version is not guaranteed to build on Rust +version is 1.42. The current Tracing version is not guaranteed to build on Rust versions earlier than the minimum supported version. Tracing follows the same compiler support policies as the rest of the Tokio diff --git a/vendor/tracing-attributes/src/lib.rs b/vendor/tracing-attributes/src/lib.rs index c8dd2cc5cc..65a2b216ec 100644 --- a/vendor/tracing-attributes/src/lib.rs +++ b/vendor/tracing-attributes/src/lib.rs @@ -6,7 +6,7 @@ //! //! Note that this macro is also re-exported by the main `tracing` crate. //! -//! *Compiler support: [requires `rustc` 1.40+][msrv]* +//! *Compiler support: [requires `rustc` 1.42+][msrv]* //! //! [msrv]: #supported-rust-versions //! @@ -16,7 +16,7 @@ //! //! ```toml //! [dependencies] -//! tracing-attributes = "0.1.11" +//! tracing-attributes = "0.1.13" //! ``` //! //! The [`#[instrument]`][instrument] attribute can now be added to a function @@ -41,7 +41,7 @@ //! ## Supported Rust Versions //! //! Tracing is built against the latest stable release. The minimum supported -//! version is 1.40. The current Tracing version is not guaranteed to build on +//! version is 1.42. The current Tracing version is not guaranteed to build on //! Rust versions earlier than the minimum supported version. //! //! Tracing follows the same compiler support policies as the rest of the Tokio @@ -52,11 +52,12 @@ //! supported compiler version is not considered a semver breaking change as //! long as doing so complies with this policy. //! -#![doc(html_root_url = "https://docs.rs/tracing-attributes/0.1.11")] +#![doc(html_root_url = "https://docs.rs/tracing-attributes/0.1.13")] #![doc( - html_logo_url = "https://raw.githubusercontent.com/tokio-rs/tracing/master/assets/logo.svg", + html_logo_url = "https://raw.githubusercontent.com/tokio-rs/tracing/master/assets/logo-type.png", issue_tracker_base_url = "https://github.com/tokio-rs/tracing/issues/" )] +#![cfg_attr(docsrs, deny(broken_intra_doc_links))] #![warn( missing_debug_implementations, missing_docs, @@ -99,27 +100,210 @@ use syn::{ /// Instruments a function to create and enter a `tracing` [span] every time /// the function is called. /// -/// The generated span's name will be the name of the function. Any arguments -/// to that function will be recorded as fields using [`fmt::Debug`]. To skip -/// recording a function's or method's argument, pass the argument's name -/// to the `skip` argument on the `#[instrument]` macro. For example, -/// `skip` can be used when an argument to an instrumented function does -/// not implement [`fmt::Debug`], or to exclude an argument with a verbose -/// or costly Debug implementation. Note that: +/// By default, the generated span's [name] will be the name of the function, +/// the span's [target] will be the current module path, and the span's [level] +/// will be [`INFO`], although these properties can be overridden. Any arguments +/// to that function will be recorded as fields using [`fmt::Debug`]. +/// +/// # Overriding Span Attributes +/// +/// To change the [name] of the generated span, add a `name` argument to the +/// `#[instrument]` macro, followed by an equals sign and a string literal. For +/// example: +/// +/// ``` +/// # use tracing_attributes::instrument; +/// +/// // The generated span's name will be "my_span" rather than "my_function". +/// #[instrument(name = "my_span")] +/// pub fn my_function() { +/// // ... do something incredibly interesting and important ... +/// } +/// ``` +/// +/// To override the [target] of the generated span, add a `target` argument to +/// the `#[instrument]` macro, followed by an equals sign and a string literal +/// for the new target. The [module path] is still recorded separately. For +/// example: +/// +/// ``` +/// pub mod my_module { +/// # use tracing_attributes::instrument; +/// // The generated span's target will be "my_crate::some_special_target", +/// // rather than "my_crate::my_module". +/// #[instrument(target = "my_crate::some_special_target")] +/// pub fn my_function() { +/// // ... all kinds of neat code in here ... +/// } +/// } +/// ``` +/// +/// Finally, to override the [level] of the generated span, add a `level` +/// argument, followed by an equals sign and a string literal with the name of +/// the desired level. Level names are not case sensitive. For example: +/// +/// ``` +/// # use tracing_attributes::instrument; +/// // The span's level will be TRACE rather than INFO. +/// #[instrument(level = "trace")] +/// pub fn my_function() { +/// // ... I have written a truly marvelous implementation of this function, +/// // which this example is too narrow to contain ... +/// } +/// ``` +/// +/// # Skipping Fields +/// +/// To skip recording one or more arguments to a function or method, pass +/// the argument's name inside the `skip()` argument on the `#[instrument]` +/// macro. This can be used when an argument to an instrumented function does +/// not implement [`fmt::Debug`], or to exclude an argument with a verbose or +/// costly `Debug` implementation. Note that: +/// /// - multiple argument names can be passed to `skip`. /// - arguments passed to `skip` do _not_ need to implement `fmt::Debug`. /// -/// You can also pass additional fields (key-value pairs with arbitrary data) -/// to the generated span. This is achieved using the `fields` argument on the -/// `#[instrument]` macro. You can use a string, integer or boolean literal as -/// a value for each field. The name of the field must be a single valid Rust -/// identifier, nested (dotted) field names are not supported. +/// ## Examples +/// +/// ``` +/// # use tracing_attributes::instrument; +/// // This type doesn't implement `fmt::Debug`! +/// struct NonDebug; +/// +/// // `arg` will be recorded, while `non_debug` will not. +/// #[instrument(skip(non_debug))] +/// fn my_function(arg: usize, non_debug: NonDebug) { +/// // ... +/// } +/// ``` +/// +/// Skipping the `self` parameter: +/// +/// ``` +/// # use tracing_attributes::instrument; +/// #[derive(Debug)] +/// struct MyType { +/// data: Vec, // Suppose this buffer is often quite long... +/// } +/// +/// impl MyType { +/// // Suppose we don't want to print an entire kilobyte of `data` +/// // every time this is called... +/// #[instrument(skip(self))] +/// pub fn my_method(&mut self, an_interesting_argument: usize) { +/// // ... do something (hopefully, using all that `data`!) +/// } +/// } +/// ``` +/// +/// # Adding Fields +/// +/// Additional fields (key-value pairs with arbitrary data) may be added to the +/// generated span using the `fields` argument on the `#[instrument]` macro. Any +/// Rust expression can be used as a field value in this manner. These +/// expressions will be evaluated at the beginning of the function's body, so +/// arguments to the function may be used in these expressions. Field names may +/// also be specified *without* values. Doing so will result in an [empty field] +/// whose value may be recorded later within the function body. +/// +/// This supports the same [field syntax] as the `span!` and `event!` macros. /// /// Note that overlap between the names of fields and (non-skipped) arguments /// will result in a compile error. /// +/// ## Examples +/// +/// Adding a new field based on the value of an argument: +/// +/// ``` +/// # use tracing_attributes::instrument; +/// +/// // This will record a field named "i" with the value of `i` *and* a field +/// // named "next" with the value of `i` + 1. +/// #[instrument(fields(next = i + 1))] +/// pub fn my_function(i: usize) { +/// // ... +/// } +/// ``` +/// +/// Recording specific properties of a struct as their own fields: +/// +/// ``` +/// # mod http { +/// # pub struct Error; +/// # pub struct Response { pub(super) _b: std::marker::PhantomData } +/// # pub struct Request { _b: B } +/// # impl std::fmt::Debug for Request { +/// # fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { +/// # f.pad("request") +/// # } +/// # } +/// # impl Request { +/// # pub fn uri(&self) -> &str { "fake" } +/// # pub fn method(&self) -> &str { "GET" } +/// # } +/// # } +/// # use tracing_attributes::instrument; +/// +/// // This will record the request's URI and HTTP method as their own separate +/// // fields. +/// #[instrument(fields(http.uri = req.uri(), http.method = req.method()))] +/// pub fn handle_request(req: http::Request) -> http::Response { +/// // ... handle the request ... +/// # http::Response { _b: std::marker::PhantomData } +/// } +/// ``` +/// +/// This can be used in conjunction with `skip` to record only some fields of a +/// struct: +/// ``` +/// # use tracing_attributes::instrument; +/// // Remember the struct with the very large `data` field from the earlier +/// // example? Now it also has a `name`, which we might want to include in +/// // our span. +/// #[derive(Debug)] +/// struct MyType { +/// name: &'static str, +/// data: Vec, +/// } +/// +/// impl MyType { +/// // This will skip the `data` field, but will include `self.name`, +/// // formatted using `fmt::Display`. +/// #[instrument(skip(self), fields(self.name = %self.name))] +/// pub fn my_method(&mut self, an_interesting_argument: usize) { +/// // ... do something (hopefully, using all that `data`!) +/// } +/// } +/// ``` +/// +/// Adding an empty field to be recorded later: +/// +/// ``` +/// # use tracing_attributes::instrument; +/// +/// // This function does a very interesting and important mathematical calculation. +/// // Suppose we want to record both the inputs to the calculation *and* its result... +/// #[instrument(fields(result))] +/// pub fn do_calculation(input_1: usize, input_2: usize) -> usize { +/// // Rerform the calculation. +/// let result = input_1 + input_2; +/// +/// // Record the result as part of the current span. +/// tracing::Span::current().record("result", &result); +/// +/// // Now, the result will also be included on this event! +/// tracing::info!("calculation complete!"); +/// +/// // ... etc ... +/// # 0 +/// } +/// ``` +/// /// # Examples +/// /// Instrumenting a function: +/// /// ``` /// # use tracing_attributes::instrument; /// #[instrument] @@ -167,7 +351,7 @@ use syn::{ /// } /// ``` /// -/// To add an additional context to the span, you can pass key-value pairs to `fields`: +/// To add an additional context to the span, pass key-value pairs to `fields`: /// /// ``` /// # use tracing_attributes::instrument; @@ -188,7 +372,6 @@ use syn::{ /// } /// ``` /// -/// If `tracing_futures` is specified as a dependency in `Cargo.toml`, /// `async fn`s may also be instrumented: /// /// ``` @@ -248,10 +431,15 @@ use syn::{ /// ``` /// Instead, you should manually rewrite any `Self` types as the type for /// which you implement the trait: `#[instrument(fields(tmp = std::any::type_name::()))]`. - /// /// [span]: https://docs.rs/tracing/latest/tracing/span/index.html -/// [`tracing`]: https://github.com/tokio-rs/tracing +/// [name]: https://docs.rs/tracing/latest/tracing/struct.Metadata.html#method.name +/// [target]: https://docs.rs/tracing/latest/tracing/struct.Metadata.html#method.target +/// [level]: https://docs.rs/tracing/latest/tracing/struct.Level.html +/// [module path]: https://docs.rs/tracing/latest/tracing/struct.Metadata.html#method.module_path +/// [`INFO`]: https://docs.rs/tracing/latest/tracing/struct.Level.html#associatedconstant.INFO +/// [empty field]: https://docs.rs/tracing/latest/tracing/field/struct.Empty.html +/// [field syntax]: https://docs.rs/tracing/latest/tracing/#recording-fields /// [`fmt::Debug`]: https://doc.rust-lang.org/std/fmt/trait.Debug.html #[proc_macro_attribute] pub fn instrument( @@ -285,11 +473,12 @@ pub fn instrument( } } + let vis = &input.vis; let sig = &input.sig; let attrs = &input.attrs; quote!( #(#attrs) * - #sig { + #vis #sig { #(#stmts) * } ) @@ -443,8 +632,9 @@ fn gen_body( if err { quote_spanned! {block.span()=> let __tracing_attr_span = #span; - tracing_futures::Instrument::instrument(async move { + tracing::Instrument::instrument(async move { match async move { #block }.await { + #[allow(clippy::unit_arg)] Ok(x) => Ok(x), Err(e) => { tracing::error!(error = %e); @@ -456,7 +646,7 @@ fn gen_body( } else { quote_spanned!(block.span()=> let __tracing_attr_span = #span; - tracing_futures::Instrument::instrument( + tracing::Instrument::instrument( async move { #block }, __tracing_attr_span ) @@ -467,7 +657,9 @@ fn gen_body( quote_spanned!(block.span()=> let __tracing_attr_span = #span; let __tracing_attr_guard = __tracing_attr_span.enter(); - match { #block } { + #[allow(clippy::redundant_closure_call)] + match (move || #block)() { + #[allow(clippy::unit_arg)] Ok(x) => Ok(x), Err(e) => { tracing::error!(error = %e); diff --git a/vendor/tracing-attributes/tests/async_fn.rs b/vendor/tracing-attributes/tests/async_fn.rs index ac95e94d2e..f7e5f3b743 100644 --- a/vendor/tracing-attributes/tests/async_fn.rs +++ b/vendor/tracing-attributes/tests/async_fn.rs @@ -223,7 +223,7 @@ fn async_fn_with_async_trait_and_fields_expressions_with_generic_parameter() { async fn call_with_self(&self) {} #[instrument(fields(Self=std::any::type_name::()))] - async fn call_with_mut_self(self: &mut Self) {} + async fn call_with_mut_self(&mut self) {} } //let span = span::mock().named("call"); diff --git a/vendor/tracing-attributes/tests/err.rs b/vendor/tracing-attributes/tests/err.rs index eb8b00218d..cfa30c0361 100644 --- a/vendor/tracing-attributes/tests/err.rs +++ b/vendor/tracing-attributes/tests/err.rs @@ -62,3 +62,88 @@ fn test_async() { }); handle.assert_finished(); } + +#[instrument(err)] +fn err_mut(out: &mut u8) -> Result<(), TryFromIntError> { + *out = u8::try_from(1234)?; + Ok(()) +} + +#[test] +fn test_mut() { + let span = span::mock().named("err_mut"); + let (subscriber, handle) = subscriber::mock() + .new_span(span.clone()) + .enter(span.clone()) + .event(event::mock().at_level(Level::ERROR)) + .exit(span.clone()) + .drop_span(span) + .done() + .run_with_handle(); + with_default(subscriber, || err_mut(&mut 0).ok()); + handle.assert_finished(); +} + +#[instrument(err)] +async fn err_mut_async(polls: usize, out: &mut u8) -> Result<(), TryFromIntError> { + let future = PollN::new_ok(polls); + tracing::trace!(awaiting = true); + future.await.ok(); + *out = u8::try_from(1234)?; + Ok(()) +} + +#[test] +fn test_mut_async() { + let span = span::mock().named("err_mut_async"); + let (subscriber, handle) = subscriber::mock() + .new_span(span.clone()) + .enter(span.clone()) + .event( + event::mock() + .with_fields(field::mock("awaiting").with_value(&true)) + .at_level(Level::TRACE), + ) + .exit(span.clone()) + .enter(span.clone()) + .event(event::mock().at_level(Level::ERROR)) + .exit(span.clone()) + .drop_span(span) + .done() + .run_with_handle(); + with_default(subscriber, || { + block_on_future(async { err_mut_async(2, &mut 0).await }).ok(); + }); + handle.assert_finished(); +} + +#[test] +fn impl_trait_return_type() { + // Reproduces https://github.com/tokio-rs/tracing/issues/1227 + + #[instrument(err)] + fn returns_impl_trait(x: usize) -> Result, String> { + Ok(0..x) + } + + let span = span::mock().named("returns_impl_trait"); + + let (subscriber, handle) = subscriber::mock() + .new_span( + span.clone() + .with_field(field::mock("x").with_value(&format_args!("10")).only()), + ) + .enter(span.clone()) + .exit(span.clone()) + .drop_span(span) + .done() + .run_with_handle(); + + with_default(subscriber, || { + for _ in returns_impl_trait(10).unwrap() { + // nop + } + }); + + handle.assert_finished(); +} diff --git a/vendor/tracing-attributes/tests/instrument.rs b/vendor/tracing-attributes/tests/instrument.rs index d4ebcdba25..e010c166cb 100644 --- a/vendor/tracing-attributes/tests/instrument.rs +++ b/vendor/tracing-attributes/tests/instrument.rs @@ -200,3 +200,32 @@ fn methods() { handle.assert_finished(); } + +#[test] +fn impl_trait_return_type() { + #[instrument] + fn returns_impl_trait(x: usize) -> impl Iterator { + 0..x + } + + let span = span::mock().named("returns_impl_trait"); + + let (subscriber, handle) = subscriber::mock() + .new_span( + span.clone() + .with_field(field::mock("x").with_value(&format_args!("10")).only()), + ) + .enter(span.clone()) + .exit(span.clone()) + .drop_span(span) + .done() + .run_with_handle(); + + with_default(subscriber, || { + for _ in returns_impl_trait(10) { + // nop + } + }); + + handle.assert_finished(); +} diff --git a/vendor/tracing-log/.cargo-checksum.json b/vendor/tracing-log/.cargo-checksum.json index 189d365c19..781f02835b 100644 --- a/vendor/tracing-log/.cargo-checksum.json +++ b/vendor/tracing-log/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"4022dc6df73c745b02ca891050d57b58dfa237d5daa1e002dbfea2dd3c4fab5c","Cargo.toml":"4319bfbba9b512058e9f7ea2ace35a8256a97e3ff9fa95115da47ce27a6b44b3","README.md":"8d7705c733b1d7909af9b5f491b8b026ea73475cb6b1fc5fa297ccd04e52d9c7","src/env_logger.rs":"90c47c11a5754d01d830e11115b231f035e6011dac1f73ef1fc2abcf94518968","src/lib.rs":"01ad5d641ff0e8fe1f3d40eb81783d8b3ce6c5b6f269a8575a2cc4b8829d00a0","src/log_tracer.rs":"abdff776d7cdf1698d992d070116053068c81fe6246da28261d21e7c9a836b39","src/trace_logger.rs":"68033c39b866fc0f5087458b99a4b84ff52dcd2fb51f0d425c6262cab94bcbea","tests/log_tracer.rs":"5553b5a2b58dd822619012169cd72da7bc8f1d42add9fcaf790a76f17d3e7b1a"},"package":"5e0f8c7178e13481ff6765bd169b33e8d554c5d2bbede5e32c356194be02b9b9"} \ No newline at end of file +{"files":{"CHANGELOG.md":"49f18002aa5e4dd309d768bf332404a2336962765f26731849211af4dfab5d1f","Cargo.toml":"c228dea14cd77370166254e437e2247d92249952dfc3cf2ccc8eab4144074a48","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"a3e506b399965a77f3f9da8c5397490dd44798da1f88cd4b31466a2799dfbf73","src/env_logger.rs":"853d961ef431fcad924d07b90e4fc9f73413ed45e7bd7b9aaba95a1fdc28349a","src/lib.rs":"1c7b96aa4d987bc30eaaddf39a76977f1ab98c3eaa76f8b7c5141f23e96cc113","src/log_tracer.rs":"34e1b77368fbdb753792632f6f8bf123526380c0d7adc4c95a88314a36365537","src/trace_logger.rs":"3476baf5915b1231ca609e44d6d895b26d4797f5d90a2f2cf142c92b1c16f175","tests/log_tracer.rs":"bbd22c276c05e595e3e48e2ff97bc5ad0cb778b713dc165d131569c770af1466","tests/reexport_log_crate.rs":"1eb4672784ecda75743494b0662d90fd48b1252b44b68afa898fa0bec3699683"},"package":"a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3"} \ No newline at end of file diff --git a/vendor/tracing-log/CHANGELOG.md b/vendor/tracing-log/CHANGELOG.md index 0a21cbdc78..7a1370e31a 100644 --- a/vendor/tracing-log/CHANGELOG.md +++ b/vendor/tracing-log/CHANGELOG.md @@ -1,3 +1,29 @@ +# 0.1.2 (February 19th, 2020) + +### Added + +- Re-export the `log` crate so that users can ensure consistent versions ([#602]) +- `AsLog` implementation for `tracing::LevelFilter` ([#1248]) +- `AsTrace` implementation for `log::LevelFilter` ([#1248]) + +### Fixed + +- **log-tracer**: Fixed `Log::enabled` implementation for `LogTracer` not + calling `Subscriber::enabled` ([#1254]) +- **log-tracer**: Fixed `Log::enabled` implementation for `LogTracer` not + checking the max level hint ([#1247]) +- Several documentation fixes ([#483], [#485], [#537], [#595], [#941], [#981]) + +[#483]: https://github.com/tokio-rs/tracing/pulls/483 +[#485]: https://github.com/tokio-rs/tracing/pulls/485 +[#537]: https://github.com/tokio-rs/tracing/pulls/537 +[#595]: https://github.com/tokio-rs/tracing/pulls/595 +[#605]: https://github.com/tokio-rs/tracing/pulls/604 +[#941]: https://github.com/tokio-rs/tracing/pulls/941 +[#1247]: https://github.com/tokio-rs/tracing/pulls/1247 +[#1248]: https://github.com/tokio-rs/tracing/pulls/1248 +[#1254]: https://github.com/tokio-rs/tracing/pulls/1254 + # 0.1.1 (October 29, 2019) ### Deprecated diff --git a/vendor/tracing-log/Cargo.toml b/vendor/tracing-log/Cargo.toml index 9a8e5e848b..feb49cdf73 100644 --- a/vendor/tracing-log/Cargo.toml +++ b/vendor/tracing-log/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "tracing-log" -version = "0.1.1" +version = "0.1.2" authors = ["Tokio Contributors "] description = "Provides compatibility between `tracing` and the `log` crate.\n" homepage = "https://tokio.rs" @@ -22,8 +22,11 @@ keywords = ["logging", "tracing", "log"] categories = ["development-tools::debugging", "asynchronous"] license = "MIT" repository = "https://github.com/tokio-rs/tracing" +[package.metadata.docs.rs] +all-features = true +rustdoc-args = ["--cfg", "docsrs"] [dependencies.env_logger] -version = "0.6" +version = "0.7" optional = true [dependencies.lazy_static] @@ -33,7 +36,7 @@ version = "1.3.0" version = "0.4" [dependencies.tracing-core] -version = "0.1.2" +version = "0.1.17" [dev-dependencies.tracing] version = "0.1" @@ -42,10 +45,5 @@ default = ["log-tracer", "trace-logger", "std"] log-tracer = [] std = ["log/std"] trace-logger = [] -[badges.azure-devops] -build = "1" -pipeline = "tokio-rs.tracing" -project = "tracing/tracing" - [badges.maintenance] status = "actively-maintained" diff --git a/vendor/tracing-log/LICENSE b/vendor/tracing-log/LICENSE new file mode 100644 index 0000000000..cdb28b4b56 --- /dev/null +++ b/vendor/tracing-log/LICENSE @@ -0,0 +1,25 @@ +Copyright (c) 2019 Tokio Contributors + +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/tracing-log/README.md b/vendor/tracing-log/README.md index 5d29e0371c..6ee18175ad 100644 --- a/vendor/tracing-log/README.md +++ b/vendor/tracing-log/README.md @@ -1,3 +1,7 @@ +![Tracing — Structured, application-level diagnostics][splash] + +[splash]: https://raw.githubusercontent.com/tokio-rs/tracing/master/assets/splash.svg + # tracing-log [`log`] compatibility for [`tracing`]. @@ -6,11 +10,10 @@ [![Documentation][docs-badge]][docs-url] [![Documentation (master)][docs-master-badge]][docs-master-url] [![MIT licensed][mit-badge]][mit-url] -[![Build Status][azure-badge]][azure-url] +[![Build Status][actions-badge]][actions-url] [![Discord chat][discord-badge]][discord-url] ![maintenance status][maint-badge] - [Documentation][docs-url] | [Chat (discord)][discord-url] @@ -22,10 +25,10 @@ [docs-master-url]: https://tracing-rs.netlify.com/tracing_log [mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg [mit-url]: LICENSE -[azure-badge]: https://dev.azure.com/tracing/tracing/_apis/build/status/tokio-rs.tracing?branchName=master -[azure-url]: https://dev.azure.com/tracing/tracing/_build/latest?definitionId=1&branchName=master +[actions-badge]: https://github.com/tokio-rs/tracing/workflows/CI/badge.svg +[actions-url]:https://github.com/tokio-rs/tracing/actions?query=workflow%3ACI [discord-badge]: https://img.shields.io/discord/500028886025895936?logo=discord&label=discord&logoColor=white -[discord-url]: https://discordapp.com/invite/XdPzyTZ +[discord-url]: https://discord.gg/EeF3cQw [maint-badge]: https://img.shields.io/badge/maintenance-experimental-blue.svg ## Overview @@ -41,7 +44,7 @@ This crate provides: - [`LogTracer`], a [`log::Log`] implementation that consumes [`log::Record`]s and outputs them as [`tracing::Event`]s. - An [`env_logger`] module, with helpers for using the [`env_logger` crate] - with `tracing` (optional, enabled by the `env-logger` feature). + with `tracing` (optional, enabled by the `env_logger` feature). [`tracing`]: https://crates.io/crates/tracing [`log`]: https://crates.io/crates/log @@ -53,6 +56,24 @@ This crate provides: [`tracing::Subscriber`]: https://docs.rs/tracing/latest/tracing/trait.Subscriber.html [`tracing::Event`]: https://docs.rs/tracing/latest/tracing/struct.Event.html +*Compiler support: [requires `rustc` 1.42+][msrv]* + +[msrv]: #supported-rust-versions + +## Supported Rust Versions + +Tracing is built against the latest stable release. The minimum supported +version is 1.42. The current Tracing version is not guaranteed to build on Rust +versions earlier than the minimum supported version. + +Tracing follows the same compiler support policies as the rest of the Tokio +project. The current stable Rust compiler and the three most recent minor +versions before it will always be supported. For example, if the current stable +compiler version is 1.45, the minimum supported version will not be increased +past 1.42, three minor versions prior. Increasing the minimum supported compiler +version is not considered a semver breaking change as long as doing so complies +with this policy. + ## License This project is licensed under the [MIT license](LICENSE). diff --git a/vendor/tracing-log/src/env_logger.rs b/vendor/tracing-log/src/env_logger.rs index 21e8933167..74922d1dc6 100644 --- a/vendor/tracing-log/src/env_logger.rs +++ b/vendor/tracing-log/src/env_logger.rs @@ -1,6 +1,4 @@ //! Utilities for configuring the `env_logger` crate to emit `tracing` events. -use env_logger; -use log; /// Extension trait to configure an `env_logger::Builder` to emit traces. pub trait BuilderExt: crate::sealed::Sealed { diff --git a/vendor/tracing-log/src/lib.rs b/vendor/tracing-log/src/lib.rs index a0e70a49b1..a814431765 100644 --- a/vendor/tracing-log/src/lib.rs +++ b/vendor/tracing-log/src/lib.rs @@ -16,6 +16,10 @@ //! - An [`env_logger`] module, with helpers for using the [`env_logger` crate] //! with `tracing` (optional, enabled by the `env-logger` feature). //! +//! *Compiler support: [requires `rustc` 1.42+][msrv]* +//! +//! [msrv]: #supported-rust-versions +//! //! # Usage //! //! ## Convert log records to tracing `Event`s @@ -71,6 +75,20 @@ //! * `env_logger`: enables the `env_logger` module, with helpers for working //! with the [`env_logger` crate]. //! +//! ## Supported Rust Versions +//! +//! Tracing is built against the latest stable release. The minimum supported +//! version is 1.42. The current Tracing version is not guaranteed to build on +//! Rust versions earlier than the minimum supported version. +//! +//! Tracing follows the same compiler support policies as the rest of the Tokio +//! project. The current stable Rust compiler and the three most recent minor +//! versions before it will always be supported. For example, if the current +//! stable compiler version is 1.45, the minimum supported version will not be +//! increased past 1.42, three minor versions prior. Increasing the minimum +//! supported compiler version is not considered a semver breaking change as +//! long as doing so complies with this policy. +//! //! [`init`]: struct.LogTracer.html#method.init //! [`init_with_filter`]: struct.LogTracer.html#method.init_with_filter //! [`AsTrace`]: trait.AsTrace.html @@ -86,7 +104,13 @@ //! [`tracing::Subscriber`]: https://docs.rs/tracing/latest/tracing/trait.Subscriber.html //! [`Subscriber`]: https://docs.rs/tracing/latest/tracing/trait.Subscriber.html //! [`tracing::Event`]: https://docs.rs/tracing/latest/tracing/struct.Event.html -#![doc(html_root_url = "https://docs.rs/tracing-log/0.1.1")] +//! [flags]: https://docs.rs/tracing/latest/tracing/#crate-feature-flags +#![doc(html_root_url = "https://docs.rs/tracing-log/0.1.2")] +#![doc( + html_logo_url = "https://raw.githubusercontent.com/tokio-rs/tracing/master/assets/logo-type.png", + issue_tracker_base_url = "https://github.com/tokio-rs/tracing/issues/" +)] +#![cfg_attr(docsrs, feature(doc_cfg), deny(broken_intra_doc_links))] #![warn( missing_debug_implementations, missing_docs, @@ -96,15 +120,12 @@ const_err, dead_code, improper_ctypes, - legacy_directory_ownership, non_shorthand_field_patterns, no_mangle_generic_items, overflowing_literals, path_statements, patterns_in_fns_without_body, - plugin_as_library, private_in_public, - safe_extern_statics, unconditional_recursion, unused, unused_allocation, @@ -126,16 +147,20 @@ use tracing_core::{ }; #[cfg(feature = "log-tracer")] +#[cfg_attr(docsrs, doc(cfg(feature = "log-tracer")))] pub mod log_tracer; #[cfg(feature = "trace-logger")] +#[cfg_attr(docsrs, doc(cfg(feature = "trace-logger")))] pub mod trace_logger; #[cfg(feature = "log-tracer")] +#[cfg_attr(docsrs, doc(cfg(feature = "log-tracer")))] #[doc(inline)] pub use self::log_tracer::LogTracer; #[cfg(feature = "trace-logger")] +#[cfg_attr(docsrs, doc(cfg(feature = "trace-logger")))] #[deprecated( since = "0.1.1", note = "use the `tracing` crate's \"log\" feature flag instead" @@ -145,39 +170,50 @@ pub use self::log_tracer::LogTracer; pub use self::trace_logger::TraceLogger; #[cfg(feature = "env_logger")] +#[cfg_attr(docsrs, doc(cfg(feature = "env_logger")))] pub mod env_logger; +pub use log; + /// Format a log record as a trace event in the current span. pub fn format_trace(record: &log::Record<'_>) -> io::Result<()> { - let filter_meta = record.as_trace(); - if !dispatcher::get_default(|dispatch| dispatch.enabled(&filter_meta)) { - return Ok(()); - }; - - let (cs, keys) = loglevel_to_cs(record.level()); - - let log_module = record.module_path(); - let log_file = record.file(); - let log_line = record.line(); - - let module = log_module.as_ref().map(|s| s as &dyn field::Value); - let file = log_file.as_ref().map(|s| s as &dyn field::Value); - let line = log_line.as_ref().map(|s| s as &dyn field::Value); - - let meta = cs.metadata(); - Event::dispatch( - &meta, - &meta.fields().value_set(&[ - (&keys.message, Some(record.args() as &dyn field::Value)), - (&keys.target, Some(&record.target())), - (&keys.module, module), - (&keys.file, file), - (&keys.line, line), - ]), - ); + dispatch_record(record); Ok(()) } +// XXX(eliza): this is factored out so that we don't have to deal with the pub +// function `format_trace`'s `Result` return type...maybe we should get rid of +// that in 0.2... +pub(crate) fn dispatch_record(record: &log::Record<'_>) { + dispatcher::get_default(|dispatch| { + let filter_meta = record.as_trace(); + if !dispatch.enabled(&filter_meta) { + return; + } + + let (_, keys, meta) = loglevel_to_cs(record.level()); + + let log_module = record.module_path(); + let log_file = record.file(); + let log_line = record.line(); + + let module = log_module.as_ref().map(|s| s as &dyn field::Value); + let file = log_file.as_ref().map(|s| s as &dyn field::Value); + let line = log_line.as_ref().map(|s| s as &dyn field::Value); + + dispatch.event(&Event::new( + meta, + &meta.fields().value_set(&[ + (&keys.message, Some(record.args() as &dyn field::Value)), + (&keys.target, Some(&record.target())), + (&keys.module, module), + (&keys.file, file), + (&keys.line, line), + ]), + )); + }); +} + /// Trait implemented for `tracing` types that can be converted to a `log` /// equivalent. pub trait AsLog: crate::sealed::Sealed { @@ -207,6 +243,24 @@ impl<'a> AsLog for Metadata<'a> { .build() } } +impl<'a> crate::sealed::Sealed for log::Metadata<'a> {} + +impl<'a> AsTrace for log::Metadata<'a> { + type Trace = Metadata<'a>; + fn as_trace(&self) -> Self::Trace { + let cs_id = identify_callsite!(loglevel_to_cs(self.level()).0); + Metadata::new( + "log record", + self.target(), + self.level().as_trace(), + None, + None, + None, + field::FieldSet::new(FIELD_NAMES, cs_id), + Kind::EVENT, + ) + } +} struct Fields { message: field::Field, @@ -216,7 +270,7 @@ struct Fields { line: field::Field, } -static FIELD_NAMES: &'static [&'static str] = &[ +static FIELD_NAMES: &[&str] = &[ "message", "log.target", "log.module_path", @@ -243,62 +297,81 @@ impl Fields { } macro_rules! log_cs { - ($level:expr) => {{ - struct Callsite; - static CALLSITE: Callsite = Callsite; - static META: Metadata<'static> = Metadata::new( + ($level:expr, $cs:ident, $meta:ident, $ty:ident) => { + struct $ty; + static $cs: $ty = $ty; + static $meta: Metadata<'static> = Metadata::new( "log event", "log", $level, None, None, None, - field::FieldSet::new(FIELD_NAMES, identify_callsite!(&CALLSITE)), + field::FieldSet::new(FIELD_NAMES, identify_callsite!(&$cs)), Kind::EVENT, ); - impl callsite::Callsite for Callsite { + impl callsite::Callsite for $ty { fn set_interest(&self, _: subscriber::Interest) {} fn metadata(&self) -> &'static Metadata<'static> { - &META + &$meta } } - - &CALLSITE - }}; + }; } -static TRACE_CS: &'static dyn Callsite = log_cs!(tracing_core::Level::TRACE); -static DEBUG_CS: &'static dyn Callsite = log_cs!(tracing_core::Level::DEBUG); -static INFO_CS: &'static dyn Callsite = log_cs!(tracing_core::Level::INFO); -static WARN_CS: &'static dyn Callsite = log_cs!(tracing_core::Level::WARN); -static ERROR_CS: &'static dyn Callsite = log_cs!(tracing_core::Level::ERROR); +log_cs!( + tracing_core::Level::TRACE, + TRACE_CS, + TRACE_META, + TraceCallsite +); +log_cs!( + tracing_core::Level::DEBUG, + DEBUG_CS, + DEBUG_META, + DebugCallsite +); +log_cs!(tracing_core::Level::INFO, INFO_CS, INFO_META, InfoCallsite); +log_cs!(tracing_core::Level::WARN, WARN_CS, WARN_META, WarnCallsite); +log_cs!( + tracing_core::Level::ERROR, + ERROR_CS, + ERROR_META, + ErrorCallsite +); lazy_static! { - static ref TRACE_FIELDS: Fields = Fields::new(TRACE_CS); - static ref DEBUG_FIELDS: Fields = Fields::new(DEBUG_CS); - static ref INFO_FIELDS: Fields = Fields::new(INFO_CS); - static ref WARN_FIELDS: Fields = Fields::new(WARN_CS); - static ref ERROR_FIELDS: Fields = Fields::new(ERROR_CS); + static ref TRACE_FIELDS: Fields = Fields::new(&TRACE_CS); + static ref DEBUG_FIELDS: Fields = Fields::new(&DEBUG_CS); + static ref INFO_FIELDS: Fields = Fields::new(&INFO_CS); + static ref WARN_FIELDS: Fields = Fields::new(&WARN_CS); + static ref ERROR_FIELDS: Fields = Fields::new(&ERROR_CS); } -fn level_to_cs(level: &Level) -> (&'static dyn Callsite, &'static Fields) { - match *level { - Level::TRACE => (TRACE_CS, &*TRACE_FIELDS), - Level::DEBUG => (DEBUG_CS, &*DEBUG_FIELDS), - Level::INFO => (INFO_CS, &*INFO_FIELDS), - Level::WARN => (WARN_CS, &*WARN_FIELDS), - Level::ERROR => (ERROR_CS, &*ERROR_FIELDS), +fn level_to_cs(level: Level) -> (&'static dyn Callsite, &'static Fields) { + match level { + Level::TRACE => (&TRACE_CS, &*TRACE_FIELDS), + Level::DEBUG => (&DEBUG_CS, &*DEBUG_FIELDS), + Level::INFO => (&INFO_CS, &*INFO_FIELDS), + Level::WARN => (&WARN_CS, &*WARN_FIELDS), + Level::ERROR => (&ERROR_CS, &*ERROR_FIELDS), } } -fn loglevel_to_cs(level: log::Level) -> (&'static dyn Callsite, &'static Fields) { +fn loglevel_to_cs( + level: log::Level, +) -> ( + &'static dyn Callsite, + &'static Fields, + &'static Metadata<'static>, +) { match level { - log::Level::Trace => (TRACE_CS, &*TRACE_FIELDS), - log::Level::Debug => (DEBUG_CS, &*DEBUG_FIELDS), - log::Level::Info => (INFO_CS, &*INFO_FIELDS), - log::Level::Warn => (WARN_CS, &*WARN_FIELDS), - log::Level::Error => (ERROR_CS, &*ERROR_FIELDS), + log::Level::Trace => (&TRACE_CS, &*TRACE_FIELDS, &TRACE_META), + log::Level::Debug => (&DEBUG_CS, &*DEBUG_FIELDS, &DEBUG_META), + log::Level::Info => (&INFO_CS, &*INFO_FIELDS, &INFO_META), + log::Level::Warn => (&WARN_CS, &*WARN_FIELDS, &WARN_META), + log::Level::Error => (&ERROR_CS, &*ERROR_FIELDS, &ERROR_META), } } @@ -340,6 +413,7 @@ impl crate::sealed::Sealed for log::Level {} impl AsTrace for log::Level { type Trace = tracing_core::Level; + #[inline] fn as_trace(&self) -> tracing_core::Level { match self { log::Level::Error => tracing_core::Level::ERROR, @@ -351,6 +425,39 @@ impl AsTrace for log::Level { } } +impl crate::sealed::Sealed for log::LevelFilter {} + +impl AsTrace for log::LevelFilter { + type Trace = tracing_core::LevelFilter; + #[inline] + fn as_trace(&self) -> tracing_core::LevelFilter { + match self { + log::LevelFilter::Off => tracing_core::LevelFilter::OFF, + log::LevelFilter::Error => tracing_core::LevelFilter::ERROR, + log::LevelFilter::Warn => tracing_core::LevelFilter::WARN, + log::LevelFilter::Info => tracing_core::LevelFilter::INFO, + log::LevelFilter::Debug => tracing_core::LevelFilter::DEBUG, + log::LevelFilter::Trace => tracing_core::LevelFilter::TRACE, + } + } +} + +impl crate::sealed::Sealed for tracing_core::LevelFilter {} + +impl AsLog for tracing_core::LevelFilter { + type Log = log::LevelFilter; + #[inline] + fn as_log(&self) -> Self::Log { + match *self { + tracing_core::LevelFilter::OFF => log::LevelFilter::Off, + tracing_core::LevelFilter::ERROR => log::LevelFilter::Error, + tracing_core::LevelFilter::WARN => log::LevelFilter::Warn, + tracing_core::LevelFilter::INFO => log::LevelFilter::Info, + tracing_core::LevelFilter::DEBUG => log::LevelFilter::Debug, + tracing_core::LevelFilter::TRACE => log::LevelFilter::Trace, + } + } +} /// Extends log `Event`s to provide complete `Metadata`. /// /// In `tracing-log`, an `Event` produced by a log (through [`AsTrace`]) has an hard coded @@ -387,13 +494,13 @@ impl<'a> NormalizeEvent<'a> for Event<'a> { fn normalized_metadata(&'a self) -> Option> { let original = self.metadata(); if self.is_log() { - let mut fields = LogVisitor::new_for(self, level_to_cs(original.level()).1); + let mut fields = LogVisitor::new_for(self, level_to_cs(*original.level()).1); self.record(&mut fields); Some(Metadata::new( "log event", fields.target.unwrap_or("log"), - original.level().clone(), + *original.level(), fields.file, fields.line.map(|l| l as u32), fields.module_path, @@ -406,7 +513,7 @@ impl<'a> NormalizeEvent<'a> for Event<'a> { } fn is_log(&self) -> bool { - self.metadata().callsite() == identify_callsite!(level_to_cs(self.metadata().level()).0) + self.metadata().callsite() == identify_callsite!(level_to_cs(*self.metadata().level()).0) } } @@ -479,7 +586,7 @@ mod test { .build(); let meta = record.as_trace(); - let (cs, _keys) = loglevel_to_cs(record.level()); + let (cs, _keys, _) = loglevel_to_cs(record.level()); let cs_meta = cs.metadata(); assert_eq!( meta.callsite(), diff --git a/vendor/tracing-log/src/log_tracer.rs b/vendor/tracing-log/src/log_tracer.rs index 71dfc864a2..e0038bb489 100644 --- a/vendor/tracing-log/src/log_tracer.rs +++ b/vendor/tracing-log/src/log_tracer.rs @@ -19,15 +19,12 @@ //! such as when a crate emits both `tracing` diagnostics _and_ log records by //! default. //! -//! [`LogTracer`]: struct.LogTracer.html -//! [`log`]: https://docs.rs/log/0.4.8/log/ -//! [logger interface]: https://docs.rs/log/0.4.8/log/trait.Log.html -//! [`init`]: struct.LogTracer.html#method.init.html -//! [`init_with_filter`]: struct.LogTracer.html#method.init_with_filter.html -//! [builder]: struct.LogTracer.html#method.builder -//! [ignore]: struct.Builder.html#method.ignore_crate -use crate::{format_trace, AsTrace}; -use log; +//! [logger interface]: log::Log +//! [`init`]: LogTracer.html#method.init +//! [`init_with_filter`]: LogTracer.html#method.init_with_filter +//! [builder]: LogTracer::builder() +//! [ignore]: Builder::ignore_crate() +use crate::AsTrace; pub use log::SetLoggerError; use tracing_core::dispatcher; @@ -112,6 +109,7 @@ impl LogTracer { /// /// [`builder`]: #method.builder #[cfg(feature = "std")] + #[cfg_attr(docsrs, doc(cfg(feature = "std")))] pub fn init_with_filter(level: log::LevelFilter) -> Result<(), SetLoggerError> { Self::builder().with_max_level(level).init() } @@ -146,6 +144,7 @@ impl LogTracer { /// [`init_with_filter`]: #method.init_with_filter /// [`builder`]: #method.builder #[cfg(feature = "std")] + #[cfg_attr(docsrs, doc(cfg(feature = "std")))] pub fn init() -> Result<(), SetLoggerError> { Self::builder().init() } @@ -159,33 +158,32 @@ impl Default for LogTracer { impl log::Log for LogTracer { fn enabled(&self, metadata: &log::Metadata<'_>) -> bool { - if self.ignore_crates.is_empty() { - return true; + // First, check the log record against the current max level enabled by + // the current `tracing` subscriber. + if metadata.level().as_trace() > tracing_core::LevelFilter::current() { + // If the log record's level is above that, disable it. + return false; } - // If we are ignoring certain module paths, ensure that the metadata - // does not start with one of those paths. - let target = metadata.target(); - !self - .ignore_crates - .iter() - .any(|ignored| target.starts_with(ignored)) + // Okay, it wasn't disabled by the max level — do we have any specific + // modules to ignore? + if !self.ignore_crates.is_empty() { + // If we are ignoring certain module paths, ensure that the metadata + // does not start with one of those paths. + let target = metadata.target(); + for ignored in &self.ignore_crates[..] { + if target.starts_with(ignored) { + return false; + } + } + } + + // Finally, check if the current `tracing` dispatcher cares about this. + dispatcher::get_default(|dispatch| dispatch.enabled(&metadata.as_trace())) } fn log(&self, record: &log::Record<'_>) { - let enabled = dispatcher::get_default(|dispatch| { - // TODO: can we cache this for each log record, so we can get - // similar to the callsite cache? - dispatch.enabled(&record.as_trace()) - }); - - if enabled { - // TODO: if the record is enabled, we'll get the current dispatcher - // twice --- once to check if enabled, and again to dispatch the event. - // If we could construct events without dispatching them, we could - // re-use the dispatcher reference... - format_trace(record).unwrap(); - } + crate::dispatch_record(record); } fn flush(&self) {} @@ -241,6 +239,7 @@ impl Builder { /// /// Setting a global logger can only be done once. #[cfg(feature = "std")] + #[cfg_attr(docsrs, doc(cfg(feature = "std")))] pub fn init(self) -> Result<(), SetLoggerError> { let ignore_crates = self.ignore_crates.into_boxed_slice(); let logger = Box::new(LogTracer { ignore_crates }); diff --git a/vendor/tracing-log/src/trace_logger.rs b/vendor/tracing-log/src/trace_logger.rs index 776f9c9994..a2c931c68f 100644 --- a/vendor/tracing-log/src/trace_logger.rs +++ b/vendor/tracing-log/src/trace_logger.rs @@ -12,8 +12,11 @@ //! [`Subscriber`]: https://docs.rs/tracing/0.1.7/tracing/subscriber/trait.Subscriber.html //! [`TraceLogger`]: struct.TraceLogger.html //! [`log::Record`]: https://docs.rs/log/0.4.8/log/struct.Record.html -//! [flags]: https://docs.rs/tracing/0.1.10/tracing/#crate-feature-flags -#![deprecated(since = "0.1.1", note = "use the `tracing` crate's \"log\" feature flag instead")] +//! [flags]: https://docs.rs/tracing/latest/tracing/#crate-feature-flags +#![deprecated( + since = "0.1.1", + note = "use the `tracing` crate's \"log\" feature flag instead" +)] use crate::AsLog; use std::{ cell::RefCell, @@ -38,6 +41,7 @@ use tracing_core::{ /// flags][flags] on the `tracing` crate should be used instead. /// /// [`Subscriber`]: https://docs.rs/tracing/0.1.7/tracing/subscriber/trait.Subscriber.html +/// [flags]: https://docs.rs/tracing/latest/tracing/#crate-feature-flags pub struct TraceLogger { settings: Builder, spans: Mutex>, diff --git a/vendor/tracing-log/tests/log_tracer.rs b/vendor/tracing-log/tests/log_tracer.rs index 136ba74d4e..6945aecc97 100644 --- a/vendor/tracing-log/tests/log_tracer.rs +++ b/vendor/tracing-log/tests/log_tracer.rs @@ -21,7 +21,8 @@ struct OwnedMetadata { struct TestSubscriber(Arc); impl Subscriber for TestSubscriber { - fn enabled(&self, _: &Metadata<'_>) -> bool { + fn enabled(&self, meta: &Metadata<'_>) -> bool { + dbg!(meta); true } @@ -34,12 +35,13 @@ impl Subscriber for TestSubscriber { fn record_follows_from(&self, _span: &span::Id, _follows: &span::Id) {} fn event(&self, event: &Event<'_>) { + dbg!(event); *self.0.last_normalized_metadata.lock().unwrap() = ( event.is_log(), event.normalized_metadata().map(|normalized| OwnedMetadata { name: normalized.name().to_string(), target: normalized.target().to_string(), - level: normalized.level().clone(), + level: *normalized.level(), module_path: normalized.module_path().map(String::from), file: normalized.file().map(String::from), line: normalized.line(), @@ -107,7 +109,9 @@ fn normalized_metadata() { } fn last(state: &State, should_be_log: bool, expected: Option) { - let metadata = state.last_normalized_metadata.lock().unwrap(); - assert_eq!(metadata.0, should_be_log); - assert_eq!(metadata.1, expected); + let lock = state.last_normalized_metadata.lock().unwrap(); + let (is_log, metadata) = &*lock; + dbg!(&metadata); + assert_eq!(dbg!(*is_log), should_be_log); + assert_eq!(metadata.as_ref(), expected.as_ref()); } diff --git a/vendor/tracing-log/tests/reexport_log_crate.rs b/vendor/tracing-log/tests/reexport_log_crate.rs new file mode 100644 index 0000000000..1540941f2f --- /dev/null +++ b/vendor/tracing-log/tests/reexport_log_crate.rs @@ -0,0 +1,10 @@ +use tracing_log::{log::LevelFilter, LogTracer}; + +/// This test makes sure we can access `log::LevelFilter` through the `tracing_log` crate and don't +/// have to depend on `log` separately. +/// +/// See https://github.com/tokio-rs/tracing/issues/552. +#[test] +fn can_initialize_log_tracer_with_level() { + LogTracer::init_with_filter(LevelFilter::Error).unwrap(); +} diff --git a/vendor/tracing-subscriber/.cargo-checksum.json b/vendor/tracing-subscriber/.cargo-checksum.json index 2021bfa746..864c9a1a27 100644 --- a/vendor/tracing-subscriber/.cargo-checksum.json +++ b/vendor/tracing-subscriber/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"736c0bc82c5a9b7d7f3b4099d647c3eda4275035adcae233435e841259242ee4","Cargo.toml":"4406761dd955fc4a1c86262e5e67bed5a36b15f56c1a717f7ed62675855677c8","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"547ea6686c775b501d310688db04a37ea31ff3c4e8b39e975a8a8268589be5a7","benches/enter.rs":"4a94a04e2abd07950ef2f0b646f4dcdf4ff00abf6396edb5a53c8b41b7691b1a","benches/filter.rs":"6374005ffa47fa19880bb95e3e37406f40ea72a02c5136f4d5eb4c663d452b18","benches/filter_log.rs":"612716bdf9a188093e84d014a4847f18157f148f7d64e54150cd5c91ac709a8a","benches/fmt.rs":"5a0ff37967ffef3a221eebb78855d031e2e883a8a67528c8e794cc6f16cbee8a","benches/support/mod.rs":"72bef51154da9c9b3d81300195c1929a818858fa4b4fc2aa07b49ca586f4cd39","src/field/debug.rs":"852bae8f62a867d518a5e27a03922059e68ddca63ab432eb67d045013bc0bc9f","src/field/delimited.rs":"cfafcad5b3e9a3f018149ec4803ce53277ebc54a92a8eaf05bbb191b2058d691","src/field/display.rs":"8af1b6e78e33e77415a89bf40aa1414797c8d3b1f62f4609b5ddef6c90faa038","src/field/mod.rs":"f2ca796d2bff95289d1b7f451b31e7ff85ceacb5247bc59c06569b05cf870e84","src/filter/env/directive.rs":"4eee7cc8b6ddd586419a2e18a5bf7a2fd768648dafb52eb1e78572963b46d9a2","src/filter/env/field.rs":"1199ce273e012eaadc9c0c51727fbd97d7700ce90f6e186218a3096898fc6bbb","src/filter/env/mod.rs":"8818cc04c16ea652e31e5114471890b2d45689012491bdaf6093aa32d4712ca3","src/filter/level.rs":"51715f375c439fb5e7e3f73b1669a34631b07eb90f12a992618dece8e641a485","src/filter/mod.rs":"e88b2e0b8f1d1931d099ad7f3116fd784de586afff1412f273929af4f914da9b","src/fmt/fmt_layer.rs":"573cd02773b1ec4376d83f0d21574c6e9f66cf0a7a9ba01a34c824622a95f10b","src/fmt/format/json.rs":"bddd3725503c9640b3ef186ec7be0e78b4796a63f016c847165470d394ecfae6","src/fmt/format/mod.rs":"d665122300a8a0f6684ae70ca51ea9abcf9a32cc0217fd5c792d46d8201f747a","src/fmt/format/pretty.rs":"c9be796ebd8b1d433095e4d9bd609e78a31fbff2756d61998d8903f019768605","src/fmt/mod.rs":"8875f2107d6891f15654552d206eb8d480d441c0c1658c35a625c7406e9264c5","src/fmt/time/datetime.rs":"1e77f550fa9bf9d019f8337aedb84a1077bd4d054a89080c3babf97a88ca6911","src/fmt/time/mod.rs":"1459a86d7ae7f527590b53910daf90ba6343234aac932cc87644fbe3c39dda01","src/fmt/writer.rs":"71b61c68bafe872a86b63e772a6d13d37a4694cb21c23716478d428a8af7d869","src/layer.rs":"c8a9b3fe87a38fcd2fd18b88023522222d53f431bc9d9ea26a47d25815a8b2cf","src/lib.rs":"3796d89a2be21772d00e6daf0777779edaaa38f300898b33c96eaff6e3eab468","src/prelude.rs":"021efd74aa80979fb23e8d4818a21ee1c4609566c32fcb3a3810d19c29c908b8","src/registry/extensions.rs":"7a6b001491308540abba6ae56dc8b93ab216469165253c1f45647a22bfc58cac","src/registry/mod.rs":"4e5b4b413969594b11ee873771f705a88d71049fd9d2501b1dabab782b3dfad6","src/registry/sharded.rs":"166091c80e6de66f96a7ff5f617351419b5aa0011862f775b8c3c19671f2f876","src/registry/stack.rs":"e992ba71d66d6dbd6524c7ce65087a8fe374a8b1e9281527910c37c38b88764e","src/reload.rs":"4ac190528a0a2471ec88d2a44aa8cf6abcecfe017defe3b843dc40f9bddbe7d0","src/sync.rs":"b837a6d9352982920d192933d0abe7cd17f90fed07f0da3a0cd807e770ebe336","src/thread.rs":"32f03a56d68c494c999f58a5d242a5e43b82b00d40ffde424280a4343945099d","src/util.rs":"7fd88f607414a0a7be0a0c067f969bb53fbe179b7dae5de39bd43a4b4a87e209","tests/duplicate_spans.rs":"802d28d567815613a4d8c28b58169b8117297c2ae82f89900516d55f34ef1735","tests/field_filter.rs":"4f66367414dcda76ea85aa30f52177feefee55303e1e8e9b6fefa7d403334b26","tests/filter.rs":"97eee1b5b6684badef3649815eafe52f0e8a6e0268792d207ea4ce1b7df8fd2a","tests/filter_log.rs":"60d9182027d56c0fdbe37243f858f0d563a570caf0c951370094ac45204d9b92","tests/registry_with_subscriber.rs":"06427f7d2848edb6c584351cc1ed5c43a1620db070bdd6105dd1e7dc57baeca3","tests/reload.rs":"463705d3850ca512c672a80a44fd0339b0ac834b2fa510ec8279cfef2cc3d594","tests/same_len_filters.rs":"a6eeac01fc1079fe747e14e481d78c76a190f6140b0616fac0ac037697af92f1","tests/support.rs":"2c5664c5bf285ed188bff045d2d0fef4638126e6b1a83f769a0d42773cc0eee4","tests/utils.rs":"07ac1c4b6e8a051352375c1f9e9b4d99ce3a0d0627b15dd3253e870498d275aa"},"package":"a1fa8f0c8f4c594e4fc9debc1990deab13238077271ba84dd853d54902ee3401"} \ No newline at end of file +{"files":{"CHANGELOG.md":"b182fed7355557840dfc2d25be1deb6d77449a4a4b45f0ee248c44f8fa50baa9","Cargo.toml":"57238207bda614625b4566ff8da16a5af121a7a419924da96a3c1c314932d011","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"7c18429a43832c9e69ed39131c3a190c4f1711d2e5dc9c23f8077fb09c5607c7","benches/enter.rs":"4a94a04e2abd07950ef2f0b646f4dcdf4ff00abf6396edb5a53c8b41b7691b1a","benches/filter.rs":"6374005ffa47fa19880bb95e3e37406f40ea72a02c5136f4d5eb4c663d452b18","benches/filter_log.rs":"612716bdf9a188093e84d014a4847f18157f148f7d64e54150cd5c91ac709a8a","benches/fmt.rs":"5a0ff37967ffef3a221eebb78855d031e2e883a8a67528c8e794cc6f16cbee8a","benches/support/mod.rs":"72bef51154da9c9b3d81300195c1929a818858fa4b4fc2aa07b49ca586f4cd39","src/field/debug.rs":"852bae8f62a867d518a5e27a03922059e68ddca63ab432eb67d045013bc0bc9f","src/field/delimited.rs":"cfafcad5b3e9a3f018149ec4803ce53277ebc54a92a8eaf05bbb191b2058d691","src/field/display.rs":"8af1b6e78e33e77415a89bf40aa1414797c8d3b1f62f4609b5ddef6c90faa038","src/field/mod.rs":"f2ca796d2bff95289d1b7f451b31e7ff85ceacb5247bc59c06569b05cf870e84","src/filter/env/directive.rs":"cbee4db7f49b44a18145040d85a24d828168996aa73f89276a5448b17eef926f","src/filter/env/field.rs":"1199ce273e012eaadc9c0c51727fbd97d7700ce90f6e186218a3096898fc6bbb","src/filter/env/mod.rs":"8818cc04c16ea652e31e5114471890b2d45689012491bdaf6093aa32d4712ca3","src/filter/level.rs":"51715f375c439fb5e7e3f73b1669a34631b07eb90f12a992618dece8e641a485","src/filter/mod.rs":"e88b2e0b8f1d1931d099ad7f3116fd784de586afff1412f273929af4f914da9b","src/fmt/fmt_layer.rs":"573cd02773b1ec4376d83f0d21574c6e9f66cf0a7a9ba01a34c824622a95f10b","src/fmt/format/json.rs":"bddd3725503c9640b3ef186ec7be0e78b4796a63f016c847165470d394ecfae6","src/fmt/format/mod.rs":"882cad054e41924764ec23730d4116de1bc6190d317c1a224dba601f372b5893","src/fmt/format/pretty.rs":"c9be796ebd8b1d433095e4d9bd609e78a31fbff2756d61998d8903f019768605","src/fmt/mod.rs":"5d4c0888293a5cca5e1756cb82d56741c8bcd08c87c9320668a8c776c10ce738","src/fmt/time/datetime.rs":"1e77f550fa9bf9d019f8337aedb84a1077bd4d054a89080c3babf97a88ca6911","src/fmt/time/mod.rs":"1459a86d7ae7f527590b53910daf90ba6343234aac932cc87644fbe3c39dda01","src/fmt/writer.rs":"71b61c68bafe872a86b63e772a6d13d37a4694cb21c23716478d428a8af7d869","src/layer.rs":"c8a9b3fe87a38fcd2fd18b88023522222d53f431bc9d9ea26a47d25815a8b2cf","src/lib.rs":"278271e9c2f4954e02c4ba85b30234bc340572c097ff2a9ec67b54f7c1e3c5db","src/prelude.rs":"021efd74aa80979fb23e8d4818a21ee1c4609566c32fcb3a3810d19c29c908b8","src/registry/extensions.rs":"7a6b001491308540abba6ae56dc8b93ab216469165253c1f45647a22bfc58cac","src/registry/mod.rs":"4e5b4b413969594b11ee873771f705a88d71049fd9d2501b1dabab782b3dfad6","src/registry/sharded.rs":"166091c80e6de66f96a7ff5f617351419b5aa0011862f775b8c3c19671f2f876","src/registry/stack.rs":"e992ba71d66d6dbd6524c7ce65087a8fe374a8b1e9281527910c37c38b88764e","src/reload.rs":"4ac190528a0a2471ec88d2a44aa8cf6abcecfe017defe3b843dc40f9bddbe7d0","src/sync.rs":"b837a6d9352982920d192933d0abe7cd17f90fed07f0da3a0cd807e770ebe336","src/thread.rs":"32f03a56d68c494c999f58a5d242a5e43b82b00d40ffde424280a4343945099d","src/util.rs":"119e16eb0423eacebc10bc9b1952ad24b698c5054e68cf74a076d12935e78961","tests/duplicate_spans.rs":"802d28d567815613a4d8c28b58169b8117297c2ae82f89900516d55f34ef1735","tests/field_filter.rs":"4f66367414dcda76ea85aa30f52177feefee55303e1e8e9b6fefa7d403334b26","tests/filter.rs":"97eee1b5b6684badef3649815eafe52f0e8a6e0268792d207ea4ce1b7df8fd2a","tests/filter_log.rs":"f79092e7b42a1fc15ee0ff86349bd6d1604d65be66752e95792d25195f70eff7","tests/fmt_max_level_hint.rs":"abb09add1492d54e2766b2db035036952bc3c4f38a6c9c7aefb07ea0cf85c744","tests/registry_max_level_hint.rs":"a11d7a42672494b309d5ba10fcd5aa3b5c2ba45f4d1a31435da408f8caab59f0","tests/registry_with_subscriber.rs":"06427f7d2848edb6c584351cc1ed5c43a1620db070bdd6105dd1e7dc57baeca3","tests/reload.rs":"463705d3850ca512c672a80a44fd0339b0ac834b2fa510ec8279cfef2cc3d594","tests/same_len_filters.rs":"a6eeac01fc1079fe747e14e481d78c76a190f6140b0616fac0ac037697af92f1","tests/support.rs":"2c5664c5bf285ed188bff045d2d0fef4638126e6b1a83f769a0d42773cc0eee4","tests/utils.rs":"07ac1c4b6e8a051352375c1f9e9b4d99ce3a0d0627b15dd3253e870498d275aa"},"package":"8ab8966ac3ca27126141f7999361cc97dd6fb4b71da04c02044fa9045d98bb96"} \ No newline at end of file diff --git a/vendor/tracing-subscriber/CHANGELOG.md b/vendor/tracing-subscriber/CHANGELOG.md index 9ff61fee7f..1347b5668c 100644 --- a/vendor/tracing-subscriber/CHANGELOG.md +++ b/vendor/tracing-subscriber/CHANGELOG.md @@ -1,3 +1,26 @@ +# 0.2.16 (February 19, 2020) + +### Fixed + +- **env-filter**: Fixed directives where the level is in mixed case (such as + `Info`) failing to parse ([#1126]) +- **fmt**: Fixed `fmt::Subscriber` not providing a max-level hint ([#1251]) +- `tracing-subscriber` no longer enables `tracing` and `tracing-core`'s default + features ([#1144]) + +### Changed + +- **chrono**: Updated `chrono` dependency to 0.4.16 ([#1189]) +- **log**: Updated `tracing-log` dependency to 0.1.2 + +Thanks to @salewski, @taiki-e, @davidpdrsn and @markdingram for contributing to +this release! + +[#1126]: https://github.com/tokio-rs/tracing/pull/1126 +[#1251]: https://github.com/tokio-rs/tracing/pull/1251 +[#1144]: https://github.com/tokio-rs/tracing/pull/1144 +[#1189]: https://github.com/tokio-rs/tracing/pull/1189 + # 0.2.15 (November 2, 2020) ### Fixed diff --git a/vendor/tracing-subscriber/Cargo.toml b/vendor/tracing-subscriber/Cargo.toml index 2f0b524430..1f05d24831 100644 --- a/vendor/tracing-subscriber/Cargo.toml +++ b/vendor/tracing-subscriber/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "tracing-subscriber" -version = "0.2.15" +version = "0.2.16" authors = ["Eliza Weisman ", "David Barsky ", "Tokio Contributors "] description = "Utilities for implementing and composing `tracing` subscribers.\n" homepage = "https://tokio.rs" @@ -46,8 +46,10 @@ version = "0.12" optional = true [dependencies.chrono] -version = "0.4" +version = "0.4.16" +features = ["clock", "std"] optional = true +default-features = false [dependencies.lazy_static] version = "1" @@ -89,13 +91,15 @@ optional = true [dependencies.tracing] version = "0.1" +features = ["std"] optional = true +default-features = false [dependencies.tracing-core] version = "0.1.17" [dependencies.tracing-log] -version = "0.1" +version = "0.1.2" features = ["log-tracer", "std"] optional = true default-features = false @@ -128,7 +132,7 @@ features = ["std-future", "std"] default-features = false [dev-dependencies.tracing-log] -version = "0.1" +version = "0.1.2" [features] ansi = ["fmt", "ansi_term"] diff --git a/vendor/tracing-subscriber/README.md b/vendor/tracing-subscriber/README.md index 71e4b4ec4b..442a980f62 100644 --- a/vendor/tracing-subscriber/README.md +++ b/vendor/tracing-subscriber/README.md @@ -21,7 +21,7 @@ Utilities for implementing and composing [`tracing`][tracing] subscribers. [crates-badge]: https://img.shields.io/crates/v/tracing-subscriber.svg [crates-url]: https://crates.io/crates/tracing-subscriber [docs-badge]: https://docs.rs/tracing-subscriber/badge.svg -[docs-url]: https://docs.rs/tracing-subscriber/0.2.15 +[docs-url]: https://docs.rs/tracing-subscriber/0.2.16 [docs-master-badge]: https://img.shields.io/badge/docs-master-blue [docs-master-url]: https://tracing-rs.netlify.com/tracing_subscriber [mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg diff --git a/vendor/tracing-subscriber/src/filter/env/directive.rs b/vendor/tracing-subscriber/src/filter/env/directive.rs index 64c1dc7c3f..82c1eae3f1 100644 --- a/vendor/tracing-subscriber/src/filter/env/directive.rs +++ b/vendor/tracing-subscriber/src/filter/env/directive.rs @@ -178,13 +178,17 @@ impl FromStr for Directive { lazy_static! { static ref DIRECTIVE_RE: Regex = Regex::new( r"(?x) - ^(?Ptrace|TRACE|debug|DEBUG|info|INFO|warn|WARN|error|ERROR|off|OFF|[0-5])$ | + ^(?P(?i:trace|debug|info|warn|error|off|[0-5]))$ | + # ^^^. + # `note: we match log level names case-insensitively ^ (?: # target name or span name (?P[\w:-]+)|(?P\[[^\]]*\]) ){1,2} (?: # level or nothing - =(?Ptrace|TRACE|debug|DEBUG|info|INFO|warn|WARN|error|ERROR|off|OFF|[0-5])? + =(?P(?i:trace|debug|info|warn|error|off|[0-5]))? + # ^^^. + # `note: we match log level names case-insensitively )? $ " @@ -831,6 +835,32 @@ mod test { assert_eq!(dirs[1].in_span, None); } + #[test] + fn parse_directives_ralith_uc() { + let dirs = parse_directives("common=INFO,server=DEBUG"); + assert_eq!(dirs.len(), 2, "\nparsed: {:#?}", dirs); + assert_eq!(dirs[0].target, Some("common".to_string())); + assert_eq!(dirs[0].level, LevelFilter::INFO); + assert_eq!(dirs[0].in_span, None); + + assert_eq!(dirs[1].target, Some("server".to_string())); + assert_eq!(dirs[1].level, LevelFilter::DEBUG); + assert_eq!(dirs[1].in_span, None); + } + + #[test] + fn parse_directives_ralith_mixed() { + let dirs = parse_directives("common=iNfo,server=dEbUg"); + assert_eq!(dirs.len(), 2, "\nparsed: {:#?}", dirs); + assert_eq!(dirs[0].target, Some("common".to_string())); + assert_eq!(dirs[0].level, LevelFilter::INFO); + assert_eq!(dirs[0].in_span, None); + + assert_eq!(dirs[1].target, Some("server".to_string())); + assert_eq!(dirs[1].level, LevelFilter::DEBUG); + assert_eq!(dirs[1].in_span, None); + } + #[test] fn parse_directives_valid() { let dirs = parse_directives("crate1::mod1=error,crate1::mod2,crate2=debug,crate3=off"); @@ -1003,6 +1033,39 @@ mod test { assert_eq!(dirs[1].in_span, None); } + // helper function for tests below + fn test_parse_bare_level(directive_to_test: &str, level_expected: LevelFilter) { + let dirs = parse_directives(directive_to_test); + assert_eq!( + dirs.len(), + 1, + "\ninput: \"{}\"; parsed: {:#?}", + directive_to_test, + dirs + ); + assert_eq!(dirs[0].target, None); + assert_eq!(dirs[0].level, level_expected); + assert_eq!(dirs[0].in_span, None); + } + + #[test] + fn parse_directives_global_bare_warn_lc() { + // test parse_directives with no crate, in isolation, all lowercase + test_parse_bare_level("warn", LevelFilter::WARN); + } + + #[test] + fn parse_directives_global_bare_warn_uc() { + // test parse_directives with no crate, in isolation, all uppercase + test_parse_bare_level("WARN", LevelFilter::WARN); + } + + #[test] + fn parse_directives_global_bare_warn_mixed() { + // test parse_directives with no crate, in isolation, mixed case + test_parse_bare_level("wArN", LevelFilter::WARN); + } + #[test] fn parse_directives_valid_with_spans() { let dirs = parse_directives("crate1::mod1[foo]=error,crate1::mod2[bar],crate2[baz]=debug"); diff --git a/vendor/tracing-subscriber/src/fmt/format/mod.rs b/vendor/tracing-subscriber/src/fmt/format/mod.rs index 9020a6390f..c00825ac06 100644 --- a/vendor/tracing-subscriber/src/fmt/format/mod.rs +++ b/vendor/tracing-subscriber/src/fmt/format/mod.rs @@ -45,6 +45,74 @@ use fmt::{Debug, Display}; /// This trait is already implemented for function pointers with the same /// signature as `format_event`. /// +/// # Examples +/// +/// ```rust +/// use std::fmt::{self, Write}; +/// use tracing_core::{Subscriber, Event}; +/// use tracing_subscriber::fmt::{FormatEvent, FormatFields, FmtContext, FormattedFields}; +/// use tracing_subscriber::registry::LookupSpan; +/// +/// struct MyFormatter; +/// +/// impl FormatEvent for MyFormatter +/// where +/// S: Subscriber + for<'a> LookupSpan<'a>, +/// N: for<'a> FormatFields<'a> + 'static, +/// { +/// fn format_event( +/// &self, +/// ctx: &FmtContext<'_, S, N>, +/// writer: &mut dyn fmt::Write, +/// event: &Event<'_>, +/// ) -> fmt::Result { +/// // Write level and target +/// let level = *event.metadata().level(); +/// let target = event.metadata().target(); +/// write!( +/// writer, +/// "{} {}: ", +/// level, +/// target, +/// )?; +/// +/// // Write spans and fields of each span +/// ctx.visit_spans(|span| { +/// write!(writer, "{}", span.name())?; +/// +/// let ext = span.extensions(); +/// +/// // `FormattedFields` is a a formatted representation of the span's +/// // fields, which is stored in its extensions by the `fmt` layer's +/// // `new_span` method. The fields will have been formatted +/// // by the same field formatter that's provided to the event +/// // formatter in the `FmtContext`. +/// let fields = &ext +/// .get::>() +/// .expect("will never be `None`"); +/// +/// if !fields.is_empty() { +/// write!(writer, "{{{}}}", fields)?; +/// } +/// write!(writer, ": ")?; +/// +/// Ok(()) +/// })?; +/// +/// // Write fields on the event +/// ctx.field_format().format_fields(writer, event)?; +/// +/// writeln!(writer) +/// } +/// } +/// ``` +/// +/// This formatter will print events like this: +/// +/// ```text +/// DEBUG yak_shaving::shaver: some-span{field-on-span=foo}: started shaving yak +/// ``` +/// /// [`fmt::Subscriber`]: ../struct.Subscriber.html /// [`fmt::Layer`]: ../struct.Layer.html pub trait FormatEvent diff --git a/vendor/tracing-subscriber/src/fmt/mod.rs b/vendor/tracing-subscriber/src/fmt/mod.rs index 8b3c64eb48..5880e6550d 100644 --- a/vendor/tracing-subscriber/src/fmt/mod.rs +++ b/vendor/tracing-subscriber/src/fmt/mod.rs @@ -489,6 +489,11 @@ where self.inner.try_close(id) } + #[inline] + fn max_level_hint(&self) -> Option { + self.inner.max_level_hint() + } + unsafe fn downcast_raw(&self, id: TypeId) -> Option<*const ()> { if id == TypeId::of::() { Some(self as *const Self as *const ()) @@ -547,12 +552,9 @@ where /// because a global subscriber was already installed by another /// call to `try_init`. pub fn try_init(self) -> Result<(), Box> { - #[cfg(feature = "tracing-log")] - tracing_log::LogTracer::init().map_err(Box::new)?; + use crate::util::SubscriberInitExt; + self.finish().try_init()?; - tracing_core::dispatcher::set_global_default(tracing_core::dispatcher::Dispatch::new( - self.finish(), - ))?; Ok(()) } diff --git a/vendor/tracing-subscriber/src/lib.rs b/vendor/tracing-subscriber/src/lib.rs index 32af55e0ab..5508296ffe 100644 --- a/vendor/tracing-subscriber/src/lib.rs +++ b/vendor/tracing-subscriber/src/lib.rs @@ -67,7 +67,7 @@ //! [`env_logger` crate]: https://crates.io/crates/env_logger //! [`parking_lot`]: https://crates.io/crates/parking_lot //! [`registry`]: registry/index.html -#![doc(html_root_url = "https://docs.rs/tracing-subscriber/0.2.15")] +#![doc(html_root_url = "https://docs.rs/tracing-subscriber/0.2.16")] #![doc( html_logo_url = "https://raw.githubusercontent.com/tokio-rs/tracing/master/assets/logo-type.png", issue_tracker_base_url = "https://github.com/tokio-rs/tracing/issues/" diff --git a/vendor/tracing-subscriber/src/util.rs b/vendor/tracing-subscriber/src/util.rs index 48d62c50a5..e1d72b2a24 100644 --- a/vendor/tracing-subscriber/src/util.rs +++ b/vendor/tracing-subscriber/src/util.rs @@ -2,6 +2,8 @@ //! ergonomic. use std::{error::Error, fmt}; use tracing_core::dispatcher::{self, Dispatch}; +#[cfg(feature = "tracing-log")] +use tracing_log::AsLog; /// Extension trait adding utility methods for subscriber initialization. /// @@ -50,11 +52,20 @@ where /// [global default subscriber]: https://docs.rs/tracing/0.1.21/tracing/dispatcher/index.html#setting-the-default-subscriber /// [`log`]: https://crates.io/log fn try_init(self) -> Result<(), TryInitError> { - #[cfg(feature = "tracing-log")] - tracing_log::LogTracer::init().map_err(TryInitError::new)?; - dispatcher::set_global_default(self.into()).map_err(TryInitError::new)?; + // Since we are setting the global default subscriber, we can + // opportunistically go ahead and set its global max level hint as + // the max level for the `log` crate as well. This should make + // skipping `log` diagnostics much faster. + #[cfg(feature = "tracing-log")] + tracing_log::LogTracer::builder() + // Note that we must call this *after* setting the global default + // subscriber, so that we get its max level hint. + .with_max_level(tracing_core::LevelFilter::current().as_log()) + .init() + .map_err(TryInitError::new)?; + Ok(()) } diff --git a/vendor/tracing-subscriber/tests/filter_log.rs b/vendor/tracing-subscriber/tests/filter_log.rs index 21cbda527a..ec1f2481e9 100644 --- a/vendor/tracing-subscriber/tests/filter_log.rs +++ b/vendor/tracing-subscriber/tests/filter_log.rs @@ -1,21 +1,36 @@ mod support; use self::support::*; -use tracing::{self, subscriber::with_default, Level}; +use tracing::{self, Level}; use tracing_subscriber::{filter::EnvFilter, prelude::*}; +mod my_module { + pub(crate) fn test_records() { + log::trace!("this should be disabled"); + log::info!("this shouldn't be"); + log::debug!("this should be disabled"); + log::warn!("this should be enabled"); + log::warn!(target: "something else", "this shouldn't be enabled"); + log::error!("this should be enabled too"); + } + + pub(crate) fn test_log_enabled() { + assert!( + log::log_enabled!(log::Level::Info), + "info should be enabled inside `my_module`" + ); + assert!( + !log::log_enabled!(log::Level::Debug), + "debug should not be enabled inside `my_module`" + ); + assert!( + log::log_enabled!(log::Level::Warn), + "warn should be enabled inside `my_module`" + ); + } +} + #[test] fn log_is_enabled() { - mod my_module { - pub(crate) fn do_test() { - log::trace!("this should be disabled"); - log::info!("this shouldn't be"); - log::debug!("this should be disabled"); - log::warn!("this should be enabled"); - log::warn!(target: "something else", "this shouldn't be enabled"); - log::error!("this should be enabled too"); - } - } - tracing_log::LogTracer::init().expect("logger should be unset"); let filter: EnvFilter = "filter_log::my_module=info" .parse() .expect("filter should parse"); @@ -25,11 +40,23 @@ fn log_is_enabled() { .event(event::mock().at_level(Level::ERROR)) .done() .run_with_handle(); - let subscriber = subscriber.with(filter); - with_default(subscriber, || { - my_module::do_test(); - }); + // Note: we have to set the global default in order to set the `log` max + // level, which can only be set once. + subscriber.with(filter).init(); + + my_module::test_records(); + log::info!("this is disabled"); + + my_module::test_log_enabled(); + assert!( + !log::log_enabled!(log::Level::Info), + "info should not be enabled outside `my_module`" + ); + assert!( + !log::log_enabled!(log::Level::Warn), + "warn should not be enabled outside `my_module`" + ); finished.assert_finished(); } diff --git a/vendor/tracing-subscriber/tests/fmt_max_level_hint.rs b/vendor/tracing-subscriber/tests/fmt_max_level_hint.rs new file mode 100644 index 0000000000..8af7b043ed --- /dev/null +++ b/vendor/tracing-subscriber/tests/fmt_max_level_hint.rs @@ -0,0 +1,9 @@ +use tracing_subscriber::filter::LevelFilter; + +#[test] +fn fmt_sets_max_level_hint() { + tracing_subscriber::fmt() + .with_max_level(LevelFilter::DEBUG) + .init(); + assert_eq!(LevelFilter::current(), LevelFilter::DEBUG); +} diff --git a/vendor/tracing-subscriber/tests/registry_max_level_hint.rs b/vendor/tracing-subscriber/tests/registry_max_level_hint.rs new file mode 100644 index 0000000000..f76617a5f7 --- /dev/null +++ b/vendor/tracing-subscriber/tests/registry_max_level_hint.rs @@ -0,0 +1,10 @@ +use tracing_subscriber::{filter::LevelFilter, prelude::*}; + +#[test] +fn registry_sets_max_level_hint() { + tracing_subscriber::registry() + .with(tracing_subscriber::fmt::layer()) + .with(LevelFilter::DEBUG) + .init(); + assert_eq!(LevelFilter::current(), LevelFilter::DEBUG); +} diff --git a/vendor/tracing-tree/.cargo-checksum.json b/vendor/tracing-tree/.cargo-checksum.json index 18aca62b8b..8c4ce54fe7 100644 --- a/vendor/tracing-tree/.cargo-checksum.json +++ b/vendor/tracing-tree/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.lock":"d7afea5a5b069ccc37c2e1653f8e0acb93997f7f8c911133494c75017aae5bc5","Cargo.toml":"6906385f3fbb71d79aff8b2dda8709b6ee6b8c80591e82db934ae42d151b4b8b","README.md":"589c2534836513b4edfa2811269767a9ac3c48da909c8ab936db3e646410dcf7","examples/basic.rs":"7cb92d08c2672f0e4f3e66aa4e9026e4201abdf2958435c2034235b7b2d03dff","examples/basic.stdout":"2dc1b6fb7b3975f2b3cef31ab7a1eebd71b2a3306ca6036d756f285ff2bb335e","examples/quiet.rs":"319105dbaff8ba53e4d4601cccd0d90e5c07eacbd36ceade83bc73b13da54772","examples/quiet.stdout":"312867cfaab17f3f897f1d3b4e447d75fc073d4b5369d34bd02db403ab012472","examples/stderr.rs":"934aa949f84cec0ef3a311a3e8076542362a2aedff45cf2d70c5d6ab87c45fec","examples/stderr.stderr":"dec95b9cf852eeb9f0144e2a2b40aa4d5ed8ecdeb77cd458a4c63cb6e869e87a","examples/wraparound.rs":"ce658ca6bb1a0b7b624ac1ac422c7734254641ca08d215da96be422e2ccf6bd1","examples/wraparound.stdout":"4c55e02dd27b6eb2d4a4fdab28881f5da419eb9e1c8816423a09f9ecd3f87757","src/format.rs":"550d5ab88bf932ce2336b6fde09eeb3de529b7620651daac93295f4778a51256","src/lib.rs":"70ff8d712e612e0a36fefecaab104a5e2b491ddc7487f2b2522c9afdf7a0f6c8","tests/ui.rs":"32a02ef41ae5cbabe13164f8d665b287b0bb764b2dc5bcb80443cb551df5289a"},"package":"023e80cdb7c8468b7aade1d756afa2acbe2ae0a6142a25ec664b5239d6ef2794"} \ No newline at end of file +{"files":{"Cargo.lock":"88075b2bed31f213f55ed3cb792a380205fc9ffae2b0246ca8d1fc4f75148a1a","Cargo.toml":"4b7352be236cd31cff3c4562e39fa8afe9aef3c32247f87578c17c26ae57a899","README.md":"589c2534836513b4edfa2811269767a9ac3c48da909c8ab936db3e646410dcf7","examples/basic.rs":"7cb92d08c2672f0e4f3e66aa4e9026e4201abdf2958435c2034235b7b2d03dff","examples/basic.stdout":"49767873eb520f3e457b48d930fa86583d9ca5ef5571d67582b08dcb788ff6f2","examples/quiet.rs":"319105dbaff8ba53e4d4601cccd0d90e5c07eacbd36ceade83bc73b13da54772","examples/quiet.stdout":"d58a3240258279821b5d08e0d39ea60dee2dbd6a955f8639daf0d149ad0616fa","examples/stderr.rs":"934aa949f84cec0ef3a311a3e8076542362a2aedff45cf2d70c5d6ab87c45fec","examples/stderr.stderr":"8a0f6553fee903f159c6ea528dda6c5b193064ef9b58c765d1f3f60ecba5ac1f","examples/wraparound.rs":"ce658ca6bb1a0b7b624ac1ac422c7734254641ca08d215da96be422e2ccf6bd1","examples/wraparound.stdout":"1c042231b3f8b20a843c18af063e43a51fcc852597dd1713f5878d4a8128271c","src/format.rs":"7cd765183d2bf6f8424571eb71e1f1657da5b5b10cc4f3667124b38e9f6ec301","src/lib.rs":"d911a6c20632677d847eeb109cdfa27c3d406ce1a3ce9ec94f62bf1a762f1b57","tests/ui.rs":"32a02ef41ae5cbabe13164f8d665b287b0bb764b2dc5bcb80443cb551df5289a"},"package":"1712b40907f8d9bc2bc66763ab61dec914b7123d7149e59feb0d4e2a95fc4967"} \ No newline at end of file diff --git a/vendor/tracing-tree/Cargo.lock b/vendor/tracing-tree/Cargo.lock index 6914066cbb..b0b8dc0d2c 100644 --- a/vendor/tracing-tree/Cargo.lock +++ b/vendor/tracing-tree/Cargo.lock @@ -1,5 +1,7 @@ # This file is automatically @generated by Cargo. # It is not intended for manual editing. +version = 3 + [[package]] name = "ansi_term" version = "0.12.1" @@ -33,12 +35,6 @@ dependencies = [ "winapi", ] -[[package]] -name = "autocfg" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" - [[package]] name = "cc" version = "1.0.66" @@ -57,19 +53,6 @@ version = "1.0.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" -[[package]] -name = "chrono" -version = "0.4.19" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "670ad68c9088c2a963aaa298cb369688cf3f9465ce5e2d4ca10e6e0098a1ce73" -dependencies = [ - "libc", - "num-integer", - "num-traits", - "time", - "winapi", -] - [[package]] name = "difference" version = "2.0.0" @@ -150,25 +133,6 @@ dependencies = [ "serde_json", ] -[[package]] -name = "num-integer" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2cc698a63b549a70bc047073d2949cce27cd1c7b0a4a862d08a8031bc2801db" -dependencies = [ - "autocfg", - "num-traits", -] - -[[package]] -name = "num-traits" -version = "0.2.14" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9a64b1ec5cda2586e284722486d802acf1f7dbdc623e2bfc57e65ca1cd099290" -dependencies = [ - "autocfg", -] - [[package]] name = "pin-project-lite" version = "0.2.0" @@ -325,17 +289,6 @@ dependencies = [ "lazy_static", ] -[[package]] -name = "time" -version = "0.1.44" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6db9e6914ab8b1ae1c260a4ae7a49b6c5611b40328a735b21862567685e73255" -dependencies = [ - "libc", - "wasi", - "winapi", -] - [[package]] name = "tracing" version = "0.1.22" @@ -392,12 +345,11 @@ dependencies = [ [[package]] name = "tracing-tree" -version = "0.1.7" +version = "0.1.9" dependencies = [ "ansi_term", "assert_cmd", "atty", - "chrono", "glob", "log", "termcolor", @@ -427,12 +379,6 @@ dependencies = [ "libc", ] -[[package]] -name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f" - [[package]] name = "winapi" version = "0.3.9" diff --git a/vendor/tracing-tree/Cargo.toml b/vendor/tracing-tree/Cargo.toml index c67d66d654..f77b41b5d9 100644 --- a/vendor/tracing-tree/Cargo.toml +++ b/vendor/tracing-tree/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "tracing-tree" -version = "0.1.7" +version = "0.1.9" authors = ["David Barsky ", "Nathan Whitaker"] description = "A Tracing Layer which prints a tree of spans and events." readme = "README.md" @@ -29,9 +29,6 @@ version = "0.12" [dependencies.atty] version = "0.2" -[dependencies.chrono] -version = "0.4" - [dependencies.termcolor] version = "1.1" diff --git a/vendor/tracing-tree/examples/basic.stdout b/vendor/tracing-tree/examples/basic.stdout index 2610ec2efd..4a2d83f113 100644 --- a/vendor/tracing-tree/examples/basic.stdout +++ b/vendor/tracing-tree/examples/basic.stdout @@ -1,4 +1,4 @@ -1:mainbasic::hierarchical-example version=0.1 +1:main┐basic::hierarchical-example version=0.1 1:main├┐basic::hierarchical-example version=0.1 1:main│└┐basic::server host="localhost", port=8080 1:main│ ├─ms INFO basic starting @@ -38,4 +38,4 @@ 1:main│ ├─ms INFO basic exit 1:main│┌┘basic::server host="localhost", port=8080 1:main├┘basic::hierarchical-example version=0.1 -1:mainbasic::hierarchical-example version=0.1 +1:main┘basic::hierarchical-example version=0.1 diff --git a/vendor/tracing-tree/examples/quiet.stdout b/vendor/tracing-tree/examples/quiet.stdout index 4ee111e4c5..96589655a1 100644 --- a/vendor/tracing-tree/examples/quiet.stdout +++ b/vendor/tracing-tree/examples/quiet.stdout @@ -1,4 +1,4 @@ -1:mainquiet::hierarchical-example version=0.1 +1:main┐quiet::hierarchical-example version=0.1 1:main├─┐quiet::server host="localhost", port=8080 1:main│ ├─ms INFO quiet starting 1:main│ ├─ms INFO quiet listening @@ -25,4 +25,4 @@ 1:main│ ├─ms WARN quiet internal error 1:main│ ├─ms INFO quiet exit 1:main├─┘ -1:main +1:main┘ diff --git a/vendor/tracing-tree/examples/stderr.stderr b/vendor/tracing-tree/examples/stderr.stderr index b22aa39d19..0060f268fc 100644 --- a/vendor/tracing-tree/examples/stderr.stderr +++ b/vendor/tracing-tree/examples/stderr.stderr @@ -1,4 +1,4 @@ -fibonacci_seq{to=5} +┐fibonacci_seq{to=5} ├─ms DEBUG Pushing 0 fibonacci ├─┐nth_fibonacci{n=0} │ ├─ms DEBUG Base case @@ -107,5 +107,5 @@ fibonacci_seq{to=5} │ │ ├─┘ │ ├─┘ ├─┘ - +┘ INFO The first 5 fibonacci numbers are [1, 1, 2, 3, 5, 8] diff --git a/vendor/tracing-tree/examples/wraparound.stdout b/vendor/tracing-tree/examples/wraparound.stdout index 81b7bc5596..bbf422545c 100644 --- a/vendor/tracing-tree/examples/wraparound.stdout +++ b/vendor/tracing-tree/examples/wraparound.stdout @@ -1,4 +1,4 @@ -1:mainwraparound::recurse i=0 +1:main┐wraparound::recurse i=0 1:main├─ms WARN wraparound boop 1:main├─┐wraparound::recurse i=1 1:main│ ├─ms WARN wraparound boop @@ -7,8 +7,9 @@ 1:main│ │ ├─┐wraparound::recurse i=3 1:main│ │ │ ├─ms WARN wraparound boop 1:main│ │ │ ├─┐wraparound::recurse i=4 +1:main────────┘ 1:mainms WARN wraparound boop -1:mainwraparound::recurse i=5 +1:main┐wraparound::recurse i=5 1:main├─ms WARN wraparound boop 1:main├─┐wraparound::recurse i=6 1:main│ ├─ms WARN wraparound boop @@ -17,8 +18,9 @@ 1:main│ │ ├─┐wraparound::recurse i=8 1:main│ │ │ ├─ms WARN wraparound boop 1:main│ │ │ ├─┐wraparound::recurse i=9 +1:main────────┘ 1:mainms WARN wraparound boop -1:mainwraparound::recurse i=10 +1:main┐wraparound::recurse i=10 1:main├─ms WARN wraparound boop 1:main├─┐wraparound::recurse i=11 1:main│ ├─ms WARN wraparound boop @@ -27,8 +29,9 @@ 1:main│ │ ├─┐wraparound::recurse i=13 1:main│ │ │ ├─ms WARN wraparound boop 1:main│ │ │ ├─┐wraparound::recurse i=14 +1:main────────┘ 1:mainms WARN wraparound boop -1:mainwraparound::recurse i=15 +1:main┐wraparound::recurse i=15 1:main├─ms WARN wraparound boop 1:main├─┐wraparound::recurse i=16 1:main│ ├─ms WARN wraparound boop @@ -37,16 +40,18 @@ 1:main│ │ ├─┐wraparound::recurse i=18 1:main│ │ │ ├─ms WARN wraparound boop 1:main│ │ │ ├─┐wraparound::recurse i=19 +1:main────────┘ 1:mainms WARN wraparound boop -1:mainwraparound::recurse i=20 +1:main┐wraparound::recurse i=20 1:main├─ms WARN wraparound boop 1:main├─┐wraparound::recurse i=21 1:main│ ├─ms WARN wraparound boop 1:main│ ├─ms WARN wraparound bop 1:main├─┘ 1:main├─ms WARN wraparound bop -1:main +1:main┘ 1:mainms WARN wraparound bop +1:main────────┐ 1:main│ │ │ ├─┘ 1:main│ │ │ ├─ms WARN wraparound bop 1:main│ │ ├─┘ @@ -55,8 +60,9 @@ 1:main│ ├─ms WARN wraparound bop 1:main├─┘ 1:main├─ms WARN wraparound bop -1:main +1:main┘ 1:mainms WARN wraparound bop +1:main────────┐ 1:main│ │ │ ├─┘ 1:main│ │ │ ├─ms WARN wraparound bop 1:main│ │ ├─┘ @@ -65,8 +71,9 @@ 1:main│ ├─ms WARN wraparound bop 1:main├─┘ 1:main├─ms WARN wraparound bop -1:main +1:main┘ 1:mainms WARN wraparound bop +1:main────────┐ 1:main│ │ │ ├─┘ 1:main│ │ │ ├─ms WARN wraparound bop 1:main│ │ ├─┘ @@ -75,8 +82,9 @@ 1:main│ ├─ms WARN wraparound bop 1:main├─┘ 1:main├─ms WARN wraparound bop -1:main +1:main┘ 1:mainms WARN wraparound bop +1:main────────┐ 1:main│ │ │ ├─┘ 1:main│ │ │ ├─ms WARN wraparound bop 1:main│ │ ├─┘ @@ -85,4 +93,4 @@ 1:main│ ├─ms WARN wraparound bop 1:main├─┘ 1:main├─ms WARN wraparound bop -1:main +1:main┘ diff --git a/vendor/tracing-tree/src/format.rs b/vendor/tracing-tree/src/format.rs index 77202b89fa..fd1ffc0529 100644 --- a/vendor/tracing-tree/src/format.rs +++ b/vendor/tracing-tree/src/format.rs @@ -14,6 +14,7 @@ pub(crate) const LINE_BRANCH: &str = "├"; pub(crate) const LINE_CLOSE: &str = "┘"; pub(crate) const LINE_OPEN: &str = "┐"; +#[derive(Copy, Clone)] pub(crate) enum SpanMode { PreOpen, Open { verbose: bool }, @@ -167,17 +168,53 @@ impl Buffers { pub(crate) fn indent_current(&mut self, indent: usize, config: &Config, style: SpanMode) { self.current_buf.push('\n'); + let prefix = config.prefix(); + + // Render something when wraparound occurs so the user is aware of it + if config.indent_lines { + match style { + SpanMode::Close { .. } | SpanMode::PostClose => { + if indent > 0 && (indent + 1) % config.wraparound == 0 { + self.indent_buf.push_str(&prefix); + for _ in 0..(indent % config.wraparound * config.indent_amount) { + self.indent_buf.push_str(LINE_HORIZ); + } + self.indent_buf.push_str(LINE_OPEN); + self.indent_buf.push('\n'); + } + } + _ => {} + } + } + indent_block( &mut self.current_buf, &mut self.indent_buf, indent % config.wraparound, config.indent_amount, config.indent_lines, - &config.prefix(), + &prefix, style, ); self.current_buf.clear(); self.flush_indent_buf(); + + // Render something when wraparound occurs so the user is aware of it + if config.indent_lines { + match style { + SpanMode::PreOpen | SpanMode::Open { .. } => { + if indent > 0 && (indent + 1) % config.wraparound == 0 { + self.current_buf.push_str(&prefix); + for _ in 0..(indent % config.wraparound * config.indent_amount) { + self.current_buf.push_str(LINE_HORIZ); + } + self.current_buf.push_str(LINE_CLOSE); + self.current_buf.push('\n'); + } + } + _ => {} + } + } } } @@ -235,6 +272,15 @@ fn indent_block_with_lines( } else if indent_spaces == 0 { for line in lines { buf.push_str(prefix); + // The first indent is special, we only need to print open/close and nothing else + if indent == 0 { + match style { + SpanMode::Open { .. } => buf.push_str(LINE_OPEN), + SpanMode::Close { .. } => buf.push_str(LINE_CLOSE), + SpanMode::PreOpen | SpanMode::PostClose => {} + SpanMode::Event => {} + } + } buf.push_str(line); buf.push('\n'); } diff --git a/vendor/tracing-tree/src/lib.rs b/vendor/tracing-tree/src/lib.rs index d1b10c5134..338b3920e5 100644 --- a/vendor/tracing-tree/src/lib.rs +++ b/vendor/tracing-tree/src/lib.rs @@ -1,12 +1,12 @@ pub(crate) mod format; use ansi_term::{Color, Style}; -use chrono::{DateTime, Local}; use format::{Buffers, ColorLevel, Config, FmtEvent, SpanMode}; use std::{ fmt::{self, Write as _}, io, sync::Mutex, + time::Instant, }; use tracing::{ field::{Field, Visit}, @@ -22,14 +22,14 @@ use tracing_subscriber::{ }; pub(crate) struct Data { - start: DateTime, + start: Instant, kvs: Vec<(&'static str, String)>, } impl Data { pub fn new(attrs: &tracing::span::Attributes<'_>) -> Self { let mut span = Self { - start: Local::now(), + start: Instant::now(), kvs: Vec::new(), }; attrs.record(&mut span); @@ -322,16 +322,12 @@ where }, None => None, }; - let now = Local::now(); if let Some(start) = start { - let elapsed = now - start; + let elapsed = start.elapsed(); write!( &mut event_buf, "{timestamp}{unit} ", - timestamp = self.styled( - Style::new().dimmed(), - elapsed.num_milliseconds().to_string() - ), + timestamp = self.styled(Style::new().dimmed(), elapsed.as_millis().to_string()), unit = self.styled(Style::new().dimmed(), "ms"), ) .expect("Unable to write to buffer"); diff --git a/vendor/tracing/.cargo-checksum.json b/vendor/tracing/.cargo-checksum.json index fcb092a3a3..9d757243ce 100644 --- a/vendor/tracing/.cargo-checksum.json +++ b/vendor/tracing/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CHANGELOG.md":"c10928b768694439a84a3a2f55c494e4c22def90d05073c6410d6ab5213a8d9e","Cargo.toml":"43f730c8da76c66f5956df24e7520b3834eebbd8d39abe123ed4829bf26b952d","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"51b28c82dbee63ef93f99e89936c28815dc41d3d3aab8692cd5f3da0a2085bb7","benches/no_subscriber.rs":"799c293113c78255e1cb45eec3656ee85c0f8910458bc3412f3175c44c2bff46","benches/subscriber.rs":"066a69119ffc8dc5ccf2801b0d75fb73cbd563dbaadb824121b9a68301a68a4e","src/dispatcher.rs":"8279c019ecceae81e47407323cebe8f7a017abbf4fd6b5314fb88b7b1c9ec26e","src/field.rs":"f5537ea28cc98850a27f86dc6b937e8baff40869b8999b17751ae3f559500ab0","src/instrument.rs":"fe0a173f404b970f0ce78785f151f56a8f53ded97a9ac56214864f7670527a9d","src/level_filters.rs":"8b81db76629b00a802b40a91f4a617b97a6f78b3d9fda233b6d9ec99ecb4bb8a","src/lib.rs":"d9cddbbedbbc08e7e3a7117ca1755ed2ef895c705734e74e3e46d6a7135cb2d6","src/macros.rs":"aba201cd59e0ff119794b1af6774db678d556e18ddedb4a39415680e8fc20fdb","src/span.rs":"24304f752eb893aa912bcf73ac748f6df679327d5a75ba4a052bc91349e1c3b4","src/stdlib.rs":"248514a9bae6106e436358aee44c92abf8e7f79022895c4a25136ddef211d198","src/subscriber.rs":"4d489dfa55b29db439b447bb42eedd5fa030579634b9f403603afb0055fb9371","tests/event.rs":"7c043893e2ec6202906043ac0a2b9433b53ba6156b59afdd264bf4b9e38fc712","tests/filter_caching_is_lexically_scoped.rs":"0845255a0cf0b3288f8d641fd7d72277051b759fdbce6ff24e266523219ee68c","tests/filters_are_not_reevaluated_for_the_same_span.rs":"d3287dabe73e321870128e87b4084e20548ec18964004cd73cc3ca6383b73c26","tests/filters_are_reevaluated_for_different_call_sites.rs":"98c891a0ebd8c2297c9f4a38a7a0406b0a55757f99cc0deea968929d2a998092","tests/filters_dont_leak.rs":"f302ea2ba976f32400206b81a8de6110aa53a4d4555cd4c284242d0417220dab","tests/macro_imports.rs":"d5de857162185d4a2384f3cb644bfcf76c7f5c1a3b5f72bfa0d2620ac6e3873c","tests/macros.rs":"846a3ce9fbd3f781000b8557485b5dc99f8ff89915e602d4e0c17e3775a50627","tests/max_level_hint.rs":"973124e340f6250ecb2ef8a8e5602623702ddfc75885187b15107accfb378e08","tests/multiple_max_level_hints.rs":"c8339fe81dafdc89ab4a86658be2a44d0ddd70d639522a76cd273f03f563d09c","tests/span.rs":"399615f8a2d8e2f4cce9c63adb0c1f2bbf7eaa70347adb3dc1e4c5ba3522f449","tests/subscriber.rs":"51035f71f9642dea4c5b9348691d47611b1d77fe78dd217931187f7b7549e5db","tests/support/event.rs":"ffcfa68f305782b393bb30ac4514308751757d2d81001ef5e774588141b595db","tests/support/field.rs":"bc221de91feb5f6705fedf1440fb6fccc5d7e1e0906c8a8d01a3029b1af77054","tests/support/metadata.rs":"408f9cb169e7a9330f1db0db25bdff7eaa8580143c99b3aca0d3653d8e155ea8","tests/support/mod.rs":"c67ea2e17f9cf8642069972ee6b02acd23e6d782a4382b57828810d3130de24d","tests/support/span.rs":"769690c93c2766a7a3ba683c59c41ccbd24e183d14e8151f028960785918e636","tests/support/subscriber.rs":"8c24fbb0e96bb3d3d03c0cd3f8b344bf78cbb4e946878f4d3c3a75107cd53b0d"},"package":"9f47026cdc4080c07e49b37087de021820269d996f581aac150ef9e5583eefe3"} \ No newline at end of file +{"files":{"CHANGELOG.md":"b67f32e4c7430af771d0608900534fd1b86b39c504a76eed31f6f3a7967b14aa","Cargo.toml":"0d6e95abb289b5b071b85204f2f8f32d741f554f9ffbb642e68847f482d83440","LICENSE":"898b1ae9821e98daf8964c8d6c7f61641f5f5aa78ad500020771c0939ee0dea1","README.md":"5991778ac2b982ba87db844b12eef4a762d6c41f5aa65f928ff7ddca298dc753","benches/no_subscriber.rs":"799c293113c78255e1cb45eec3656ee85c0f8910458bc3412f3175c44c2bff46","benches/subscriber.rs":"066a69119ffc8dc5ccf2801b0d75fb73cbd563dbaadb824121b9a68301a68a4e","src/dispatcher.rs":"8279c019ecceae81e47407323cebe8f7a017abbf4fd6b5314fb88b7b1c9ec26e","src/field.rs":"f5537ea28cc98850a27f86dc6b937e8baff40869b8999b17751ae3f559500ab0","src/instrument.rs":"fe0a173f404b970f0ce78785f151f56a8f53ded97a9ac56214864f7670527a9d","src/level_filters.rs":"b763c481137d2f46d9cf82616cb2dc0eb493c205ee8638ae8948ae3478ea2580","src/lib.rs":"1d0bbf9a88db40cc60bbd044efb0ce65dee952d115ffdb3f3becf2e79dd78c9a","src/macros.rs":"ca665a6d830bd67f218950d4f4c8c22240f379a5488540f49e3902225a0641fa","src/span.rs":"85bc3b9efd9e8e8ad640225e82cdd73fd02f1ff7e48b8087fae6aad9b9c4ee0f","src/stdlib.rs":"248514a9bae6106e436358aee44c92abf8e7f79022895c4a25136ddef211d198","src/subscriber.rs":"4d489dfa55b29db439b447bb42eedd5fa030579634b9f403603afb0055fb9371","tests/event.rs":"7c043893e2ec6202906043ac0a2b9433b53ba6156b59afdd264bf4b9e38fc712","tests/filter_caching_is_lexically_scoped.rs":"0845255a0cf0b3288f8d641fd7d72277051b759fdbce6ff24e266523219ee68c","tests/filters_are_not_reevaluated_for_the_same_span.rs":"d3287dabe73e321870128e87b4084e20548ec18964004cd73cc3ca6383b73c26","tests/filters_are_reevaluated_for_different_call_sites.rs":"98c891a0ebd8c2297c9f4a38a7a0406b0a55757f99cc0deea968929d2a998092","tests/filters_dont_leak.rs":"f302ea2ba976f32400206b81a8de6110aa53a4d4555cd4c284242d0417220dab","tests/macro_imports.rs":"d5de857162185d4a2384f3cb644bfcf76c7f5c1a3b5f72bfa0d2620ac6e3873c","tests/macros.rs":"5a5891cf694c9e652da01695483fd0ca761ef109336071b0866d4047a5f23502","tests/max_level_hint.rs":"973124e340f6250ecb2ef8a8e5602623702ddfc75885187b15107accfb378e08","tests/multiple_max_level_hints.rs":"c8339fe81dafdc89ab4a86658be2a44d0ddd70d639522a76cd273f03f563d09c","tests/span.rs":"140c009514db18ab0fe2d4d183fd81f9cb20267bd332ae6d60d957431e8f2c51","tests/subscriber.rs":"51035f71f9642dea4c5b9348691d47611b1d77fe78dd217931187f7b7549e5db","tests/support/event.rs":"ffcfa68f305782b393bb30ac4514308751757d2d81001ef5e774588141b595db","tests/support/field.rs":"bc221de91feb5f6705fedf1440fb6fccc5d7e1e0906c8a8d01a3029b1af77054","tests/support/metadata.rs":"408f9cb169e7a9330f1db0db25bdff7eaa8580143c99b3aca0d3653d8e155ea8","tests/support/mod.rs":"c67ea2e17f9cf8642069972ee6b02acd23e6d782a4382b57828810d3130de24d","tests/support/span.rs":"769690c93c2766a7a3ba683c59c41ccbd24e183d14e8151f028960785918e636","tests/support/subscriber.rs":"727eeb5c325653c6aea9adb8862dd4b0b3ddcfd02baa4ab6d91ba79eecf09e48"},"package":"01ebdc2bb4498ab1ab5f5b73c5803825e60199229ccba0698170e3be0e7f959f"} \ No newline at end of file diff --git a/vendor/tracing/CHANGELOG.md b/vendor/tracing/CHANGELOG.md index 0c200ff436..09fef9ae6f 100644 --- a/vendor/tracing/CHANGELOG.md +++ b/vendor/tracing/CHANGELOG.md @@ -1,3 +1,67 @@ +# 0.1.25 (February 23, 2021) + +### Added + +- `Span::entered` method for entering a span and moving it into a guard by value + rather than borrowing it ([#1252]) + +Thanks to @matklad for contributing to this release! + +[#1252]: https://github.com/tokio-rs/tracing/pull/1252 + +# 0.1.24 (February 17, 2021) + +### Fixed + +- **attributes**: Compiler error when using `#[instrument(err)]` on functions + which return `impl Trait` ([#1236]) +- Fixed broken match arms in event macros ([#1239]) +- Documentation improvements ([#1232]) + +Thanks to @bkchr and @lfranke for contributing to this release! + +[#1236]: https://github.com/tokio-rs/tracing/pull/1236 +[#1239]: https://github.com/tokio-rs/tracing/pull/1239 +[#1232]: https://github.com/tokio-rs/tracing/pull/1232 + +# 0.1.23 (February 4, 2021) + +### Fixed + +- **attributes**: Compiler error when using `#[instrument(err)]` on functions + with mutable parameters ([#1167]) +- **attributes**: Missing function visibility modifier when using + `#[instrument]` with `async-trait` ([#977]) +- **attributes** Removed unused `syn` features ([#928]) +- **log**: Fixed an issue where the `tracing` macros would generate code for + events whose levels are disabled statically by the `log` crate's + `static_max_level_XXX` features ([#1175]) +- Fixed deprecations and clippy lints ([#1195]) +- Several documentation fixes and improvements ([#941], [#965], [#981], [#1146], + [#1215]) + +### Changed + +- **attributes**: `tracing-futures` dependency is no longer required when using + `#[instrument]` on async functions ([#808]) +- **attributes**: Updated `tracing-attributes` minimum dependency to v0.1.12 + ([#1222]) + +Thanks to @nagisa, @Txuritan, @TaKO8Ki, @okready, and @krojew for contributing +to this release! + +[#1167]: https://github.com/tokio-rs/tracing/pull/1167 +[#977]: https://github.com/tokio-rs/tracing/pull/977 +[#965]: https://github.com/tokio-rs/tracing/pull/965 +[#981]: https://github.com/tokio-rs/tracing/pull/981 +[#1215]: https://github.com/tokio-rs/tracing/pull/1215 +[#808]: https://github.com/tokio-rs/tracing/pull/808 +[#941]: https://github.com/tokio-rs/tracing/pull/941 +[#1146]: https://github.com/tokio-rs/tracing/pull/1146 +[#1175]: https://github.com/tokio-rs/tracing/pull/1175 +[#1195]: https://github.com/tokio-rs/tracing/pull/1195 +[#1222]: https://github.com/tokio-rs/tracing/pull/1222 + # 0.1.22 (November 23, 2020) ### Changed diff --git a/vendor/tracing/Cargo.toml b/vendor/tracing/Cargo.toml index 3d76e28d13..98e4c7c75b 100644 --- a/vendor/tracing/Cargo.toml +++ b/vendor/tracing/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "tracing" -version = "0.1.22" +version = "0.1.25" authors = ["Eliza Weisman ", "Tokio Contributors "] description = "Application-level tracing for Rust.\n" homepage = "https://tokio.rs" @@ -44,7 +44,7 @@ optional = true version = "0.2" [dependencies.tracing-attributes] -version = "0.1.10" +version = "0.1.13" optional = true [dependencies.tracing-core] diff --git a/vendor/tracing/README.md b/vendor/tracing/README.md index dc444e5b8d..0780e211ed 100644 --- a/vendor/tracing/README.md +++ b/vendor/tracing/README.md @@ -16,9 +16,9 @@ Application-level tracing for Rust. [Documentation][docs-url] | [Chat][discord-url] [crates-badge]: https://img.shields.io/crates/v/tracing.svg -[crates-url]: https://crates.io/crates/tracing/0.1.22 +[crates-url]: https://crates.io/crates/tracing/0.1.25 [docs-badge]: https://docs.rs/tracing/badge.svg -[docs-url]: https://docs.rs/tracing/0.1.22 +[docs-url]: https://docs.rs/tracing/0.1.25 [docs-master-badge]: https://img.shields.io/badge/docs-master-blue [docs-master-url]: https://tracing-rs.netlify.com/tracing [mit-badge]: https://img.shields.io/badge/license-MIT-blue.svg @@ -174,8 +174,7 @@ pub fn shave_all(yaks: usize) -> usize { // // local variables (`yaks`) can be used as field values // without an assignment, similar to struct initializers. - let span = span!(Level::TRACE, "shaving_yaks", yaks); - let _enter = span.enter(); + let _span_ = span!(Level::TRACE, "shaving_yaks", yaks).entered(); info!("shaving yaks"); @@ -212,7 +211,7 @@ If you are instrumenting code that make use of [`std::future::Future`](https://doc.rust-lang.org/stable/std/future/trait.Future.html) or async/await, be sure to use the [`tracing-futures`](https://docs.rs/tracing-futures) crate. This is needed -because the following example _will not_ work: +because the following examples _will not_ work: ```rust async { @@ -220,6 +219,12 @@ async { // ... } ``` +```rust +async { + let _s = tracing::span!(...).entered(); + // ... +} +``` The span guard `_s` will not exit until the future generated by the `async` block is complete. Since futures and spans can be entered and exited _multiple_ times without them completing, @@ -246,7 +251,7 @@ my_future is as long as the future's. The second, and preferred, option is through the -[`#[instrument]`](https://docs.rs/tracing/0.1.22/tracing/attr.instrument.html) +[`#[instrument]`](https://docs.rs/tracing/0.1.25/tracing/attr.instrument.html) attribute: ```rust @@ -293,7 +298,7 @@ span.in_scope(|| { // Dropping the span will close it, indicating that it has ended. ``` -The [`#[instrument]`](https://docs.rs/tracing/0.1.22/tracing/attr.instrument.html) attribute macro +The [`#[instrument]`](https://docs.rs/tracing/0.1.25/tracing/attr.instrument.html) attribute macro can reduce some of this boilerplate: ```rust diff --git a/vendor/tracing/src/level_filters.rs b/vendor/tracing/src/level_filters.rs index df9405b5e4..cfacee2efe 100644 --- a/vendor/tracing/src/level_filters.rs +++ b/vendor/tracing/src/level_filters.rs @@ -33,10 +33,23 @@ //! [dependencies] //! tracing = { version = "0.1", features = ["max_level_debug", "release_max_level_warn"] } //! ``` +//! ## Notes //! -//! *Compiler support: requires rustc 1.39+* +//! Please note that `tracing`'s static max level features do *not* control the +//! [`log`] records that may be emitted when [`tracing`'s "log" feature flag][f] is +//! enabled. This is to allow `tracing` to be disabled entirely at compile time +//! while still emitting `log` records --- such as when a library using +//! `tracing` is used by an application using `log` that doesn't want to +//! generate any `tracing`-related code, but does want to collect `log` records. //! -//! [`log` crate]: https://docs.rs/log/0.4.6/log/#compile-time-filters +//! This means that if the "log" feature is in use, some code may be generated +//! for `log` records emitted by disabled `tracing` events. If this is not +//! desirable, `log` records may be disabled separately using [`log`'s static +//! max level features][`log` crate]. +//! +//! [`log`]: https://docs.rs/log/ +//! [`log` crate]: https://docs.rs/log/latest/log/#compile-time-filters +//! [f]: https://docs.rs/tracing/latest/tracing/#emitting-log-records pub use tracing_core::{metadata::ParseLevelFilterError, LevelFilter}; /// The statically configured maximum trace level. diff --git a/vendor/tracing/src/lib.rs b/vendor/tracing/src/lib.rs index 43975c87db..5500f21493 100644 --- a/vendor/tracing/src/lib.rs +++ b/vendor/tracing/src/lib.rs @@ -192,8 +192,8 @@ //! //! ## Using the Macros //! -//! The [`span!`] and [`event!`] macros use fairly similar syntax, with some -//! exceptions. +//! The [`span!`] and [`event!`] macros as well as the `#[instrument]` attribute +//! use fairly similar syntax, with some exceptions. //! //! ### Configuring Attributes //! @@ -495,8 +495,7 @@ //! // //! // local variables (`yaks`) can be used as field values //! // without an assignment, similar to struct initializers. -//! let span = span!(Level::TRACE, "shaving_yaks", yaks); -//! let _enter = span.enter(); +//! let _span = span!(Level::TRACE, "shaving_yaks", yaks).entered(); //! //! info!("shaving yaks"); //! @@ -722,6 +721,7 @@ //! - [`diesel-tracing`] provides integration with [`diesel`] database connections. //! - [`tracing-tracy`] provides a way to collect [Tracy] profiles in instrumented //! applications. +//! - [`tracing-elastic-apm`] provides a layer for reporting traces to [Elastic APM]. //! //! If you're the maintainer of a `tracing` ecosystem crate not listed above, //! please let us know! We'd love to add your project to the list! @@ -747,6 +747,8 @@ //! [`diesel-tracing`]: https://crates.io/crates/diesel-tracing //! [`tracing-tracy`]: https://crates.io/crates/tracing-tracy //! [Tracy]: https://github.com/wolfpld/tracy +//! [`tracing-elastic-apm`]: https://crates.io/crates/tracing-elastic-apm +//! [Elastic APM]: https://www.elastic.co/apm //! //!
    //!
    ⓘNote
    @@ -781,7 +783,7 @@ //! //! ```toml //! [dependencies] -//! tracing = { version = "0.1.22", default-features = false } +//! tracing = { version = "0.1.25", default-features = false } //! ``` //! //!
    @@ -837,7 +839,7 @@ //! [flags]: #crate-feature-flags #![cfg_attr(not(feature = "std"), no_std)] #![cfg_attr(docsrs, feature(doc_cfg), deny(broken_intra_doc_links))] -#![doc(html_root_url = "https://docs.rs/tracing/0.1.22")] +#![doc(html_root_url = "https://docs.rs/tracing/0.1.25")] #![doc( html_logo_url = "https://raw.githubusercontent.com/tokio-rs/tracing/master/assets/logo-type.png", issue_tracker_base_url = "https://github.com/tokio-rs/tracing/issues/" diff --git a/vendor/tracing/src/macros.rs b/vendor/tracing/src/macros.rs index 3222abb741..797138eb33 100644 --- a/vendor/tracing/src/macros.rs +++ b/vendor/tracing/src/macros.rs @@ -45,7 +45,7 @@ macro_rules! span { ) } else { let span = CALLSITE.disabled_span(); - $crate::if_log_enabled! {{ + $crate::if_log_enabled! { $lvl, { span.record_all(&$crate::valueset!(CALLSITE.metadata().fields(), $($fields)*)); }}; span @@ -75,7 +75,7 @@ macro_rules! span { ) } else { let span = CALLSITE.disabled_span(); - $crate::if_log_enabled! {{ + $crate::if_log_enabled! { $lvl, { span.record_all(&$crate::valueset!(CALLSITE.metadata().fields(), $($fields)*)); }}; span @@ -920,14 +920,14 @@ macro_rules! trace { (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => ( $crate::event!(target: $target, $crate::Level::TRACE, { $($field)* }, $($arg)*) ); - (target: $target:expr, $($k:ident).+ $($field:tt)+ ) => ( - $crate::event!(target: $target, $crate::Level::TRACE, { $($k).+ $($field)+ }) + (target: $target:expr, $($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::TRACE, { $($k).+ $($field)* }) ); - (target: $target:expr, ?$($k:ident).+ $($field:tt)+ ) => ( - $crate::event!(target: $target, $crate::Level::TRACE, { $($k).+ $($field)+ }) + (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::TRACE, { ?$($k).+ $($field)* }) ); - (target: $target:expr, %$($k:ident).+ $($field:tt)+ ) => ( - $crate::event!(target: $target, $crate::Level::TRACE, { $($k).+ $($field)+ }) + (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::TRACE, { %$($k).+ $($field)* }) ); (target: $target:expr, $($arg:tt)+ ) => ( $crate::event!(target: $target, $crate::Level::TRACE, {}, $($arg)+) @@ -1107,14 +1107,14 @@ macro_rules! debug { (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => ( $crate::event!(target: $target, $crate::Level::DEBUG, { $($field)* }, $($arg)*) ); - (target: $target:expr, $($k:ident).+ $($field:tt)+ ) => ( - $crate::event!(target: $target, $crate::Level::DEBUG, { $($k).+ $($field)+ }) + (target: $target:expr, $($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::DEBUG, { $($k).+ $($field)* }) ); - (target: $target:expr, ?$($k:ident).+ $($field:tt)+ ) => ( - $crate::event!(target: $target, $crate::Level::DEBUG, { $($k).+ $($field)+ }) + (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::DEBUG, { ?$($k).+ $($field)* }) ); - (target: $target:expr, %$($k:ident).+ $($field:tt)+ ) => ( - $crate::event!(target: $target, $crate::Level::DEBUG, { $($k).+ $($field)+ }) + (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::DEBUG, { %$($k).+ $($field)* }) ); (target: $target:expr, $($arg:tt)+ ) => ( $crate::event!(target: $target, $crate::Level::DEBUG, {}, $($arg)+) @@ -1319,14 +1319,14 @@ macro_rules! info { (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => ( $crate::event!(target: $target, $crate::Level::INFO, { $($field)* }, $($arg)*) ); - (target: $target:expr, $($k:ident).+ $($field:tt)+ ) => ( - $crate::event!(target: $target, $crate::Level::INFO, { $($k).+ $($field)+ }) + (target: $target:expr, $($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::INFO, { $($k).+ $($field)* }) ); - (target: $target:expr, ?$($k:ident).+ $($field:tt)+ ) => ( - $crate::event!(target: $target, $crate::Level::INFO, { $($k).+ $($field)+ }) + (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::INFO, { ?$($k).+ $($field)* }) ); - (target: $target:expr, %$($k:ident).+ $($field:tt)+ ) => ( - $crate::event!(target: $target, $crate::Level::INFO, { $($k).+ $($field)+ }) + (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::INFO, { $($k).+ $($field)* }) ); (target: $target:expr, $($arg:tt)+ ) => ( $crate::event!(target: $target, $crate::Level::INFO, {}, $($arg)+) @@ -1356,7 +1356,7 @@ macro_rules! info { (%$($k:ident).+ = $($field:tt)*) => ( $crate::event!( target: module_path!(), - $crate::Level::TRACE, + $crate::Level::INFO, { %$($k).+ = $($field)*} ) ); @@ -1524,14 +1524,14 @@ macro_rules! warn { (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => ( $crate::event!(target: $target, $crate::Level::WARN, { $($field)* }, $($arg)*) ); - (target: $target:expr, $($k:ident).+ $($field:tt)+ ) => ( - $crate::event!(target: $target, $crate::Level::WARN, { $($k).+ $($field)+ }) + (target: $target:expr, $($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::WARN, { $($k).+ $($field)* }) ); - (target: $target:expr, ?$($k:ident).+ $($field:tt)+ ) => ( - $crate::event!(target: $target, $crate::Level::WARN, { $($k).+ $($field)+ }) + (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::WARN, { ?$($k).+ $($field)* }) ); - (target: $target:expr, %$($k:ident).+ $($field:tt)+ ) => ( - $crate::event!(target: $target, $crate::Level::WARN, { $($k).+ $($field)+ }) + (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::WARN, { %$($k).+ $($field)* }) ); (target: $target:expr, $($arg:tt)+ ) => ( $crate::event!(target: $target, $crate::Level::WARN, {}, $($arg)+) @@ -1725,14 +1725,14 @@ macro_rules! error { (target: $target:expr, { $($field:tt)* }, $($arg:tt)* ) => ( $crate::event!(target: $target, $crate::Level::ERROR, { $($field)* }, $($arg)*) ); - (target: $target:expr, $($k:ident).+ $($field:tt)+ ) => ( - $crate::event!(target: $target, $crate::Level::ERROR, { $($k).+ $($field)+ }) + (target: $target:expr, $($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::ERROR, { $($k).+ $($field)* }) ); - (target: $target:expr, ?$($k:ident).+ $($field:tt)+ ) => ( - $crate::event!(target: $target, $crate::Level::ERROR, { $($k).+ $($field)+ }) + (target: $target:expr, ?$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::ERROR, { ?$($k).+ $($field)* }) ); - (target: $target:expr, %$($k:ident).+ $($field:tt)+ ) => ( - $crate::event!(target: $target, $crate::Level::ERROR, { $($k).+ $($field)+ }) + (target: $target:expr, %$($k:ident).+ $($field:tt)* ) => ( + $crate::event!(target: $target, $crate::Level::ERROR, { %$($k).+ $($field)* }) ); (target: $target:expr, $($arg:tt)+ ) => ( $crate::event!(target: $target, $crate::Level::ERROR, {}, $($arg)+) @@ -1762,7 +1762,7 @@ macro_rules! error { (%$($k:ident).+ = $($field:tt)*) => ( $crate::event!( target: module_path!(), - $crate::Level::TRACE, + $crate::Level::ERROR, { %$($k).+ = $($field)*} ) ); @@ -2295,10 +2295,10 @@ macro_rules! __mk_format_args { #[macro_export] macro_rules! __tracing_log { (target: $target:expr, $level:expr, $($field:tt)+ ) => { - $crate::if_log_enabled! {{ + $crate::if_log_enabled! { $level, { use $crate::log; let level = $crate::level_to_log!($level); - if level <= log::STATIC_MAX_LEVEL && level <= log::max_level() { + if level <= log::max_level() { let log_meta = log::Metadata::builder() .level(level) .target($target) @@ -2322,13 +2322,13 @@ macro_rules! __tracing_log { #[doc(hidden)] #[macro_export] macro_rules! if_log_enabled { - ($e:expr;) => { - $crate::if_log_enabled! { $e } + ($lvl:expr, $e:expr;) => { + $crate::if_log_enabled! { $lvl, $e } }; - ($if_log:block) => { - $crate::if_log_enabled! { $if_log else {} } + ($lvl:expr, $if_log:block) => { + $crate::if_log_enabled! { $lvl, $if_log else {} } }; - ($if_log:block else $else_block:block) => { + ($lvl:expr, $if_log:block else $else_block:block) => { $else_block }; } @@ -2337,15 +2337,19 @@ macro_rules! if_log_enabled { #[doc(hidden)] #[macro_export] macro_rules! if_log_enabled { - ($e:expr;) => { - $crate::if_log_enabled! { $e } + ($lvl:expr, $e:expr;) => { + $crate::if_log_enabled! { $lvl, $e } }; - ($if_log:block) => { - $crate::if_log_enabled! { $if_log else {} } + ($lvl:expr, $if_log:block) => { + $crate::if_log_enabled! { $lvl, $if_log else {} } }; - ($if_log:block else $else_block:block) => { - if !$crate::dispatcher::has_been_set() { - $if_log + ($lvl:expr, $if_log:block else $else_block:block) => { + if $crate::level_to_log!($lvl) <= $crate::log::STATIC_MAX_LEVEL { + if !$crate::dispatcher::has_been_set() { + $if_log + } else { + $else_block + } } else { $else_block } @@ -2356,14 +2360,18 @@ macro_rules! if_log_enabled { #[doc(hidden)] #[macro_export] macro_rules! if_log_enabled { - ($e:expr;) => { - $crate::if_log_enabled! { $e } + ($lvl:expr, $e:expr;) => { + $crate::if_log_enabled! { $lvl, $e } }; - ($if_log:block) => { - $crate::if_log_enabled! { $if_log else {} } + ($lvl:expr, $if_log:block) => { + $crate::if_log_enabled! { $lvl, $if_log else {} } }; - ($if_log:block else $else_block:block) => { - #[allow(unused_braces)] - $if_log + ($lvl:expr, $if_log:block else $else_block:block) => { + if $crate::level_to_log!($lvl) <= $crate::log::STATIC_MAX_LEVEL { + #[allow(unused_braces)] + $if_log + } else { + $else_block + } }; } diff --git a/vendor/tracing/src/span.rs b/vendor/tracing/src/span.rs index c1e0ee1a0c..9b08ed0502 100644 --- a/vendor/tracing/src/span.rs +++ b/vendor/tracing/src/span.rs @@ -57,13 +57,12 @@ //! //! A thread of execution is said to _enter_ a span when it begins executing, //! and _exit_ the span when it switches to another context. Spans may be -//! entered through the [`enter`] and [`in_scope`] methods. +//! entered through the [`enter`], [`entered`], and [`in_scope`] methods. //! -//! The `enter` method enters a span, returning a [guard] that exits the span +//! The [`enter`] method enters a span, returning a [guard] that exits the span //! when dropped //! ``` -//! # #[macro_use] extern crate tracing; -//! # use tracing::Level; +//! # use tracing::{span, Level}; //! let my_var: u64 = 5; //! let my_span = span!(Level::TRACE, "my_span", my_var); //! @@ -86,11 +85,28 @@ //! for details. //!
    //! -//! `in_scope` takes a closure or function pointer and executes it inside the -//! span. +//! The [`entered`] method is analogous to [`enter`], but moves the span into +//! the returned guard, rather than borrowing it. This allows creating and +//! entering a span in a single expression: +//! //! ``` -//! # #[macro_use] extern crate tracing; -//! # use tracing::Level; +//! # use tracing::{span, Level}; +//! // Create a span and enter it, returning a guard: +//! let span = span!(Level::INFO, "my_span").entered(); +//! +//! // We are now inside the span! Like `enter()`, the guard returned by +//! // `entered()` will exit the span when it is dropped... +//! +//! // ...but, it can also be exited explicitly, returning the `Span` +//! // struct: +//! let span = span.exit(); +//! ``` +//! +//! Finally, [`in_scope`] takes a closure or function pointer and executes it +//! inside the span: +//! +//! ``` +//! # use tracing::{span, Level}; //! let my_var: u64 = 5; //! let my_span = span!(Level::TRACE, "my_span", my_var = &my_var); //! @@ -309,6 +325,7 @@ //! [`Subscriber`]: ../subscriber/trait.Subscriber.html //! [`Attributes`]: struct.Attributes.html //! [`enter`]: struct.Span.html#method.enter +//! [`entered`]: struct.Span.html#method.entered //! [`in_scope`]: struct.Span.html#method.in_scope //! [`follows_from`]: struct.Span.html#method.follows_from //! [guard]: struct.Entered.html @@ -318,6 +335,9 @@ pub use tracing_core::span::{Attributes, Id, Record}; use crate::stdlib::{ cmp, fmt, hash::{Hash, Hasher}, + marker::PhantomData, + mem, + ops::Deref, }; use crate::{ dispatcher::{self, Dispatch}, @@ -381,6 +401,28 @@ pub struct Entered<'a> { span: &'a Span, } +/// An owned version of [`Entered`], a guard representing a span which has been +/// entered and is currently executing. +/// +/// When the guard is dropped, the span will be exited. +/// +/// This is returned by the [`Span::entered`] function. +/// +/// [`Span::entered`]: super::Span::entered() +#[derive(Debug)] +#[must_use = "once a span has been entered, it should be exited"] +pub struct EnteredSpan { + span: Span, + + /// ```compile_fail + /// use tracing::span::*; + /// trait AssertSend: Send {} + /// + /// impl AssertSend for EnteredSpan {} + /// ``` + _not_send: PhantomNotSend, +} + /// `log` target for all span lifecycle (creation/enter/exit/close) records. #[cfg(feature = "log")] const LIFECYCLE_LOG_TARGET: &str = "tracing::span"; @@ -544,7 +586,7 @@ impl Span { meta: Some(meta), }; - if_log_enabled! {{ + if_log_enabled! { *meta.level(), { let target = if attrs.is_empty() { LIFECYCLE_LOG_TARGET } else { @@ -555,6 +597,7 @@ impl Span { span } + /// Enters this span, returning a guard that will exit the span when dropped. /// /// If this span is enabled by the current subscriber, then this function will @@ -744,18 +787,157 @@ impl Span { /// [`Subscriber::enter`]: ../subscriber/trait.Subscriber.html#method.enter /// [`Subscriber::exit`]: ../subscriber/trait.Subscriber.html#method.exit /// [`Id`]: ../struct.Id.html + #[inline] pub fn enter(&self) -> Entered<'_> { - if let Some(ref inner) = self.inner.as_ref() { + self.do_enter(); + Entered { span: self } + } + + /// Enters this span, consuming it and returning a [guard][`EnteredSpan`] + /// that will exit the span when dropped. + /// + /// If this span is enabled by the current subscriber, then this function will + /// call [`Subscriber::enter`] with the span's [`Id`], and dropping the guard + /// will call [`Subscriber::exit`]. If the span is disabled, this does + /// nothing. + /// + /// This is similar to the [`Span::enter`] method, except that it moves the + /// span by value into the returned guard, rather than borrowing it. + /// Therefore, this method can be used to create and enter a span in a + /// single expression, without requiring a `let`-binding. For example: + /// + /// ``` + /// # use tracing::info_span; + /// let _span = info_span!("something_interesting").entered(); + /// ``` + /// rather than: + /// ``` + /// # use tracing::info_span; + /// let span = info_span!("something_interesting"); + /// let _e = span.enter(); + /// ``` + /// + /// Furthermore, `entered` may be used when the span must be stored in some + /// other struct or be passed to a function while remaining entered. + /// + ///
    + ///
    ⓘNote
    + ///
    + ///
    + ///
    +    ///
    +    /// **Note**: The returned [`EnteredSpan`] guard does not
    +    /// implement `Send`. Dropping the guard will exit *this* span,
    +    /// and if the guard is sent to another thread and dropped there, that thread may
    +    /// never have entered this span. Thus, `EnteredSpan`s should not be sent
    +    /// between threads.
    +    ///
    +    /// 
    + /// + /// **Warning**: in asynchronous code that uses [async/await syntax][syntax], + /// [`Span::entered`] should be used very carefully or avoided entirely. Holding + /// the drop guard returned by `Span::entered` across `.await` points will + /// result in incorrect traces. See the documentation for the + /// [`Span::enter`] method for details. + /// + /// [syntax]: https://rust-lang.github.io/async-book/01_getting_started/04_async_await_primer.html + /// + /// # Examples + /// + /// The returned guard can be [explicitly exited][EnteredSpan::exit], + /// returning the un-entered span: + /// + /// ``` + /// # use tracing::{Level, span}; + /// let span = span!(Level::INFO, "doing_something").entered(); + /// + /// // code here is within the span + /// + /// // explicitly exit the span, returning it + /// let span = span.exit(); + /// + /// // code here is no longer within the span + /// + /// // enter the span again + /// let span = span.entered(); + /// + /// // now we are inside the span once again + /// ``` + /// + /// Guards need not be explicitly dropped: + /// + /// ``` + /// # use tracing::trace_span; + /// fn my_function() -> String { + /// // enter a span for the duration of this function. + /// let span = trace_span!("my_function").entered(); + /// + /// // anything happening in functions we call is still inside the span... + /// my_other_function(); + /// + /// // returning from the function drops the guard, exiting the span. + /// return "Hello world".to_owned(); + /// } + /// + /// fn my_other_function() { + /// // ... + /// } + /// ``` + /// + /// Since the [`EnteredSpan`] guard can dereference to the [`Span`] itself, + /// the span may still be accessed while entered. For example: + /// + /// ```rust + /// # use tracing::info_span; + /// use tracing::field; + /// + /// // create the span with an empty field, and enter it. + /// let span = info_span!("my_span", some_field = field::Empty).entered(); + /// + /// // we can still record a value for the field while the span is entered. + /// span.record("some_field", &"hello world!"); + /// ``` + /// + /// [`Subscriber::enter`]: ../subscriber/trait.Subscriber.html#method.enter + /// [`Subscriber::exit`]: ../subscriber/trait.Subscriber.html#method.exit + /// [`Id`]: ../struct.Id.html + #[inline] + pub fn entered(self) -> EnteredSpan { + self.do_enter(); + EnteredSpan { + span: self, + _not_send: PhantomNotSend, + } + } + + #[inline] + fn do_enter(&self) { + if let Some(inner) = self.inner.as_ref() { inner.subscriber.enter(&inner.id); } - if_log_enabled! {{ + if_log_enabled! { crate::Level::TRACE, { if let Some(ref meta) = self.meta { self.log(ACTIVITY_LOG_TARGET, log::Level::Trace, format_args!("-> {}", meta.name())); } }} + } - Entered { span: self } + // Called from [`Entered`] and [`EnteredSpan`] drops. + // + // Running this behaviour on drop rather than with an explicit function + // call means that spans may still be exited when unwinding. + #[inline] + fn do_exit(&self) { + if let Some(inner) = self.inner.as_ref() { + inner.subscriber.exit(&inner.id); + } + + if_log_enabled! { crate::Level::TRACE, { + if let Some(ref _meta) = self.meta { + self.log(ACTIVITY_LOG_TARGET, log::Level::Trace, format_args!("<- {}", _meta.name())); + } + }} } /// Executes the given function in the context of this span. @@ -916,16 +1098,16 @@ impl Span { inner.record(&record); } - if_log_enabled! {{ - if let Some(ref meta) = self.meta { + if let Some(ref _meta) = self.meta { + if_log_enabled! { *_meta.level(), { let target = if record.is_empty() { LIFECYCLE_LOG_TARGET } else { - meta.target() + _meta.target() }; - self.log(target, level_to_log!(*meta.level()), format_args!("{}{}", meta.name(), FmtValues(&record))); - } - }} + self.log(target, level_to_log!(*_meta.level()), format_args!("{}{}", _meta.name(), FmtValues(&record))); + }} + } self } @@ -1146,15 +1328,15 @@ impl Drop for Span { subscriber.try_close(id.clone()); } - if_log_enabled!({ - if let Some(ref meta) = self.meta { + if let Some(ref _meta) = self.meta { + if_log_enabled! { crate::Level::TRACE, { self.log( LIFECYCLE_LOG_TARGET, log::Level::Trace, - format_args!("-- {}", meta.name()), + format_args!("-- {}", _meta.name()), ); - } - }) + }} + } } } @@ -1220,25 +1402,66 @@ impl Clone for Inner { // ===== impl Entered ===== +impl EnteredSpan { + /// Exits this span, returning the underlying [`Span`]. + #[inline] + pub fn exit(mut self) -> Span { + // One does not simply move out of a struct with `Drop`. + let span = mem::replace(&mut self.span, Span::none()); + span.do_exit(); + span + } +} + +impl Deref for EnteredSpan { + type Target = Span; + + #[inline] + fn deref(&self) -> &Span { + &self.span + } +} + impl<'a> Drop for Entered<'a> { #[inline] fn drop(&mut self) { - // Dropping the guard exits the span. - // - // Running this behaviour on drop rather than with an explicit function - // call means that spans may still be exited when unwinding. - if let Some(inner) = self.span.inner.as_ref() { - inner.subscriber.exit(&inner.id); - } + self.span.do_exit() + } +} - if_log_enabled! {{ - if let Some(ref meta) = self.span.meta { - self.span.log(ACTIVITY_LOG_TARGET, log::Level::Trace, format_args!("<- {}", meta.name())); - } - }} +impl Drop for EnteredSpan { + #[inline] + fn drop(&mut self) { + self.span.do_exit() } } +/// Technically, `EnteredSpan` _can_ implement both `Send` *and* +/// `Sync` safely. It doesn't, because it has a `PhantomNotSend` field, +/// specifically added in order to make it `!Send`. +/// +/// Sending an `EnteredSpan` guard between threads cannot cause memory unsafety. +/// However, it *would* result in incorrect behavior, so we add a +/// `PhantomNotSend` to prevent it from being sent between threads. This is +/// because it must be *dropped* on the same thread that it was created; +/// otherwise, the span will never be exited on the thread where it was entered, +/// and it will attempt to exit the span on a thread that may never have entered +/// it. However, we still want them to be `Sync` so that a struct holding an +/// `Entered` guard can be `Sync`. +/// +/// Thus, this is totally safe. +#[derive(Debug)] +struct PhantomNotSend { + ghost: PhantomData<*mut ()>, +} +#[allow(non_upper_case_globals)] +const PhantomNotSend: PhantomNotSend = PhantomNotSend { ghost: PhantomData }; + +/// # Safety +/// +/// Trivially safe, as `PhantomNotSend` doesn't have any API. +unsafe impl Sync for PhantomNotSend {} + #[cfg(feature = "log")] struct FmtValues<'a>(&'a Record<'a>); @@ -1280,4 +1503,6 @@ mod test { trait AssertSync: Sync {} impl AssertSync for Span {} + impl AssertSync for Entered<'_> {} + impl AssertSync for EnteredSpan {} } diff --git a/vendor/tracing/tests/macros.rs b/vendor/tracing/tests/macros.rs index 39642667f7..445d17aa43 100644 --- a/vendor/tracing/tests/macros.rs +++ b/vendor/tracing/tests/macros.rs @@ -407,6 +407,12 @@ fn trace() { trace!(?foo); trace!(%foo); trace!(foo); + trace!(target: "foo_events", ?foo); + trace!(target: "foo_events", %foo); + trace!(target: "foo_events", foo); + trace!(target: "foo_events", ?foo, true, "message"); + trace!(target: "foo_events", %foo, true, "message"); + trace!(target: "foo_events", foo, true, "message"); } #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] @@ -437,6 +443,12 @@ fn debug() { debug!(?foo); debug!(%foo); debug!(foo); + debug!(target: "foo_events", ?foo); + debug!(target: "foo_events", %foo); + debug!(target: "foo_events", foo); + debug!(target: "foo_events", ?foo, true, "message"); + debug!(target: "foo_events", %foo, true, "message"); + debug!(target: "foo_events", foo, true, "message"); } #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] @@ -467,6 +479,12 @@ fn info() { info!(?foo); info!(%foo); info!(foo); + info!(target: "foo_events", ?foo); + info!(target: "foo_events", %foo); + info!(target: "foo_events", foo); + info!(target: "foo_events", ?foo, true, "message"); + info!(target: "foo_events", %foo, true, "message"); + info!(target: "foo_events", foo, true, "message"); } #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] @@ -497,6 +515,12 @@ fn warn() { warn!(?foo); warn!(%foo); warn!(foo); + warn!(target: "foo_events", ?foo); + warn!(target: "foo_events", %foo); + warn!(target: "foo_events", foo); + warn!(target: "foo_events", ?foo, true, "message"); + warn!(target: "foo_events", %foo, true, "message"); + warn!(target: "foo_events", foo, true, "message"); } #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] @@ -527,6 +551,12 @@ fn error() { error!(?foo); error!(%foo); error!(foo); + error!(target: "foo_events", ?foo); + error!(target: "foo_events", %foo); + error!(target: "foo_events", foo); + error!(target: "foo_events", ?foo, true, "message"); + error!(target: "foo_events", %foo, true, "message"); + error!(target: "foo_events", foo, true, "message"); } #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] diff --git a/vendor/tracing/tests/span.rs b/vendor/tracing/tests/span.rs index 79914950c2..406207d9c5 100644 --- a/vendor/tracing/tests/span.rs +++ b/vendor/tracing/tests/span.rs @@ -297,6 +297,44 @@ fn enter() { handle.assert_finished(); } +#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] +#[test] +fn entered() { + let (subscriber, handle) = subscriber::mock() + .enter(span::mock().named("foo")) + .event(event::mock()) + .exit(span::mock().named("foo")) + .drop_span(span::mock().named("foo")) + .done() + .run_with_handle(); + with_default(subscriber, || { + let _span = span!(Level::TRACE, "foo").entered(); + debug!("dropping guard..."); + }); + + handle.assert_finished(); +} + +#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] +#[test] +fn entered_api() { + let (subscriber, handle) = subscriber::mock() + .enter(span::mock().named("foo")) + .event(event::mock()) + .exit(span::mock().named("foo")) + .drop_span(span::mock().named("foo")) + .done() + .run_with_handle(); + with_default(subscriber, || { + let span = span!(Level::TRACE, "foo").entered(); + let _derefs_to_span = span.id(); + debug!("exiting span..."); + let _: Span = span.exit(); + }); + + handle.assert_finished(); +} + #[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)] #[test] fn moved_field() { diff --git a/vendor/tracing/tests/support/subscriber.rs b/vendor/tracing/tests/support/subscriber.rs index 17269616a8..1163aab0c5 100644 --- a/vendor/tracing/tests/support/subscriber.rs +++ b/vendor/tracing/tests/support/subscriber.rs @@ -536,7 +536,7 @@ impl MockHandle { } impl Expect { - fn bad<'a>(&self, name: impl AsRef, what: fmt::Arguments<'a>) { + fn bad(&self, name: impl AsRef, what: fmt::Arguments<'_>) { let name = name.as_ref(); match self { Expect::Event(e) => panic!("[{}] expected event {}, but {} instead", name, e, what,), diff --git a/vendor/unicode-normalization/.cargo-checksum.json b/vendor/unicode-normalization/.cargo-checksum.json index 901d13fcb1..2d548085b0 100644 --- a/vendor/unicode-normalization/.cargo-checksum.json +++ b/vendor/unicode-normalization/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"COPYRIGHT":"23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d","Cargo.toml":"a66e297908e9d2ed7eb9c1d1b9035764b2cdbd8e30f5d88ac91d1923806b3dee","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"a068614cf58d3ae4d95d1fd10e96c8db8a2fa3c863833db765a2e490a9ec228c","benches/bench.rs":"827e5343b059a732904be29717c2797203bfd0a633edf08042afea65372a3e2c","scripts/unicode.py":"f91580185aaae204679afa51fc36792d32bea69870a48ed5f6d6aabe0cd8bc0e","src/__test_api.rs":"78e21bfa0b98894f545c8ed3e31cec20d7a48951a7f3ed69a6130c4b3d463aee","src/decompose.rs":"c0eb774843a545356e63bbcd7fb926f80d3c97ef4601ca3701fc34154f2e9905","src/lib.rs":"559d7f0c6adec647981c34a2630abe7573252239702e84fda5cadcc9e196b92b","src/lookups.rs":"ea57b62da71574f8716aaec7f5c6765b2201a1fde30f4ac2f56afeddd1e85fa0","src/no_std_prelude.rs":"602e81e67b8952b6571826f431e3b6787be3073bc10f38a0d3374278f81a6a1f","src/normalize.rs":"8b76a87c3eb3e9b38e5a245ff7bbf0c8d3837b9a646a29178dd48a9d4263fa84","src/perfect_hash.rs":"400c84e2f467f61bd55d55d08672da6a9ad7a57c938ce5d0c701a6994b1b273b","src/quick_check.rs":"9756312d75fc31b67fca954e44a4812945a7e436b03ba18b9a2441f6de570f6f","src/recompose.rs":"a6228ad7561a5c7a1ef1d510159bdde1eea8a161007c80e470432e9b844d5536","src/stream_safe.rs":"34df53904c417ab493c2eb83b9e83de2529ed5d3e1704d48c713a72e800d5fc8","src/tables.rs":"fda786487c6a59ca14ed5eca4817ecc09a7144db965c284ea0d5560fcaa02c85","src/test.rs":"0def2cb0a013fba29938262b3cd3533fbb10eacaf6bcd82eef1f91759fe0a2eb"},"package":"a13e63ab62dbe32aeee58d1c5408d35c36c392bba5d9d3142287219721afe606"} \ No newline at end of file +{"files":{"COPYRIGHT":"23860c2a7b5d96b21569afedf033469bab9fe14a1b24a35068b8641c578ce24d","Cargo.toml":"75ef456fcad532510d3063ac2498196f67028235ec1b22208bca89e596067f88","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"7b63ecd5f1902af1b63729947373683c32745c16a10e8e6292e2e2dcd7e90ae0","README.md":"a068614cf58d3ae4d95d1fd10e96c8db8a2fa3c863833db765a2e490a9ec228c","benches/bench.rs":"827e5343b059a732904be29717c2797203bfd0a633edf08042afea65372a3e2c","scripts/unicode.py":"b5e089288ccfe98515119bf2a4321f695c4be16dee09f01e396488aa05d626c6","src/__test_api.rs":"78e21bfa0b98894f545c8ed3e31cec20d7a48951a7f3ed69a6130c4b3d463aee","src/decompose.rs":"c0eb774843a545356e63bbcd7fb926f80d3c97ef4601ca3701fc34154f2e9905","src/lib.rs":"91e5c0523715dd59de8535c0e941fb912996ff81465964efa3aac001bc24a43c","src/lookups.rs":"ca7022bf19a82108df1f5bd78c7fc30806f931d932a65538be818caaa5f7049d","src/no_std_prelude.rs":"602e81e67b8952b6571826f431e3b6787be3073bc10f38a0d3374278f81a6a1f","src/normalize.rs":"de2670b4437d335d42884af844a750f70e541467ecd34077dfe032103cb9b041","src/perfect_hash.rs":"400c84e2f467f61bd55d55d08672da6a9ad7a57c938ce5d0c701a6994b1b273b","src/quick_check.rs":"9756312d75fc31b67fca954e44a4812945a7e436b03ba18b9a2441f6de570f6f","src/recompose.rs":"a6228ad7561a5c7a1ef1d510159bdde1eea8a161007c80e470432e9b844d5536","src/replace.rs":"b24c904f3e00851a78820e30ddfa4ff10c795f8925fd0ee7f5870f31fdfa770b","src/stream_safe.rs":"383d71f0da401af8e735877e43855c7e16cb06deb2263539cdec2a407dbe257d","src/tables.rs":"8b01a7499a1789bafc6875d2c724d5fa0a1ea1d68d56bfe9796273cf26bd571e","src/test.rs":"0def2cb0a013fba29938262b3cd3533fbb10eacaf6bcd82eef1f91759fe0a2eb"},"package":"07fbfce1c8a97d547e8b5334978438d9d6ec8c20e38f56d4a4374d181493eaef"} \ No newline at end of file diff --git a/vendor/unicode-normalization/Cargo.toml b/vendor/unicode-normalization/Cargo.toml index 628482ea1d..92de01010b 100644 --- a/vendor/unicode-normalization/Cargo.toml +++ b/vendor/unicode-normalization/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "unicode-normalization" -version = "0.1.16" +version = "0.1.17" authors = ["kwantam ", "Manish Goregaokar "] 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" diff --git a/vendor/unicode-normalization/scripts/unicode.py b/vendor/unicode-normalization/scripts/unicode.py index 7786dc19cd..74164fe470 100644 --- a/vendor/unicode-normalization/scripts/unicode.py +++ b/vendor/unicode-normalization/scripts/unicode.py @@ -14,9 +14,10 @@ # - DerivedNormalizationProps.txt # - NormalizationTest.txt # - UnicodeData.txt +# - StandardizedVariants.txt # # Since this should not require frequent updates, we just store this -# out-of-line and check the unicode.rs file into git. +# out-of-line and check the tables.rs and normalization_tests.rs files into git. import collections import urllib.request @@ -57,6 +58,11 @@ expanded_categories = { 'Cc': ['C'], 'Cf': ['C'], 'Cs': ['C'], 'Co': ['C'], 'Cn': ['C'], } +# Constants from Unicode 9.0.0 Section 3.12 Conjoining Jamo Behavior +# http://www.unicode.org/versions/Unicode9.0.0/ch03.pdf#M9.32468.Heading.310.Combining.Jamo.Behavior +S_BASE, L_COUNT, V_COUNT, T_COUNT = 0xAC00, 19, 21, 28 +S_COUNT = L_COUNT * V_COUNT * T_COUNT + class UnicodeData(object): def __init__(self): self._load_unicode_data() @@ -66,6 +72,9 @@ class UnicodeData(object): self.canon_comp = self._compute_canonical_comp() self.canon_fully_decomp, self.compat_fully_decomp = self._compute_fully_decomposed() + self.cjk_compat_variants_fully_decomp = {} + self._load_cjk_compat_ideograph_variants() + def stats(name, table): count = sum(len(v) for v in table.values()) print("%s: %d chars => %d decomposed chars" % (name, len(table), count)) @@ -75,6 +84,7 @@ class UnicodeData(object): stats("Compatible decomp", self.compat_decomp) stats("Canonical fully decomp", self.canon_fully_decomp) stats("Compatible fully decomp", self.compat_fully_decomp) + stats("CJK Compat Variants fully decomp", self.cjk_compat_variants_fully_decomp) self.ss_leading, self.ss_trailing = self._compute_stream_safe_tables() @@ -83,6 +93,7 @@ class UnicodeData(object): return resp.read().decode('utf-8') def _load_unicode_data(self): + self.name_to_char_int = {} self.combining_classes = {} self.compat_decomp = {} self.canon_decomp = {} @@ -95,6 +106,9 @@ class UnicodeData(object): char, category, cc, decomp = pieces[0], pieces[2], pieces[3], pieces[5] char_int = int(char, 16) + name = pieces[1].strip() + self.name_to_char_int[name] = char_int + if cc != '0': self.combining_classes[char_int] = cc @@ -106,6 +120,41 @@ class UnicodeData(object): if category == 'M' or 'M' in expanded_categories.get(category, []): self.general_category_mark.append(char_int) + def _load_cjk_compat_ideograph_variants(self): + for line in self._fetch("StandardizedVariants.txt").splitlines(): + strip_comments = line.split('#', 1)[0].strip() + if not strip_comments: + continue + + variation_sequence, description, differences = strip_comments.split(';') + description = description.strip() + + # Don't use variations that only apply in particular shaping environments. + if differences: + continue + + # Look for entries where the description field is a codepoint name. + if description not in self.name_to_char_int: + continue + + # Only consider the CJK Compatibility Ideographs. + if not description.startswith('CJK COMPATIBILITY IDEOGRAPH-'): + continue + + char_int = self.name_to_char_int[description] + + assert not char_int in self.combining_classes, "Unexpected: CJK compat variant with a combining class" + assert not char_int in self.compat_decomp, "Unexpected: CJK compat variant and compatibility decomposition" + assert len(self.canon_decomp[char_int]) == 1, "Unexpected: CJK compat variant and non-singleton canonical decomposition" + # If we ever need to handle Hangul here, we'll need to handle it separately. + assert not (S_BASE <= char_int < S_BASE + S_COUNT) + + cjk_compat_variant_parts = [int(c, 16) for c in variation_sequence.split()] + for c in cjk_compat_variant_parts: + assert not c in self.canon_decomp, "Unexpected: CJK compat variant is unnormalized (canon)" + assert not c in self.compat_decomp, "Unexpected: CJK compat variant is unnormalized (compat)" + self.cjk_compat_variants_fully_decomp[char_int] = cjk_compat_variant_parts + def _load_norm_props(self): props = collections.defaultdict(list) @@ -178,11 +227,6 @@ class UnicodeData(object): The upshot is that decomposition code is very simple and easy to inline at mild code size cost. """ - # Constants from Unicode 9.0.0 Section 3.12 Conjoining Jamo Behavior - # http://www.unicode.org/versions/Unicode9.0.0/ch03.pdf#M9.32468.Heading.310.Combining.Jamo.Behavior - S_BASE, L_COUNT, V_COUNT, T_COUNT = 0xAC00, 19, 21, 28 - S_COUNT = L_COUNT * V_COUNT * T_COUNT - def _decompose(char_int, compatible): # 7-bit ASCII never decomposes if char_int <= 0x7f: @@ -320,8 +364,8 @@ def gen_composition_table(canon_comp, out): out.write(" }\n") out.write("}\n") -def gen_decomposition_tables(canon_decomp, compat_decomp, out): - tables = [(canon_decomp, 'canonical'), (compat_decomp, 'compatibility')] +def gen_decomposition_tables(canon_decomp, compat_decomp, cjk_compat_variants_decomp, out): + tables = [(canon_decomp, 'canonical'), (compat_decomp, 'compatibility'), (cjk_compat_variants_decomp, 'cjk_compat_variants')] for table, name in tables: gen_mph_data(name + '_decomposed', table, "(u32, &'static [char])", lambda k: "(0x{:x}, &[{}])".format(k, @@ -491,7 +535,7 @@ if __name__ == '__main__': gen_composition_table(data.canon_comp, out) out.write("\n") - gen_decomposition_tables(data.canon_fully_decomp, data.compat_fully_decomp, out) + gen_decomposition_tables(data.canon_fully_decomp, data.compat_fully_decomp, data.cjk_compat_variants_fully_decomp, out) gen_combining_mark(data.general_category_mark, out) out.write("\n") diff --git a/vendor/unicode-normalization/src/lib.rs b/vendor/unicode-normalization/src/lib.rs index 6749adc1e1..cb623ba7c8 100644 --- a/vendor/unicode-normalization/src/lib.rs +++ b/vendor/unicode-normalization/src/lib.rs @@ -59,6 +59,7 @@ pub use crate::quick_check::{ IsNormalized, }; pub use crate::recompose::Recompositions; +pub use crate::replace::Replacements; pub use crate::stream_safe::StreamSafe; pub use crate::tables::UNICODE_VERSION; use core::str::Chars; @@ -71,6 +72,7 @@ mod normalize; mod perfect_hash; mod quick_check; mod recompose; +mod replace; mod stream_safe; #[rustfmt::skip] @@ -83,7 +85,9 @@ mod test; /// Methods for composing and decomposing characters. pub mod char { - pub use crate::normalize::{compose, decompose_canonical, decompose_compatible}; + pub use crate::normalize::{ + compose, decompose_canonical, decompose_cjk_compat_variants, decompose_compatible, + }; pub use crate::lookups::{canonical_combining_class, is_combining_mark}; } @@ -108,6 +112,18 @@ pub trait UnicodeNormalization> { /// (compatibility decomposition followed by canonical composition). fn nfkc(self) -> Recompositions; + /// A transformation which replaces CJK Compatibility Ideograph codepoints + /// with normal forms using Standardized Variation Sequences. This is not + /// part of the canonical or compatibility decomposition algorithms, but + /// performing it before those algorithms produces normalized output which + /// better preserves the intent of the original text. + /// + /// Note that many systems today ignore variation selectors, so these + /// may not immediately help text display as intended, but they at + /// least preserve the information in a standardized form, giving + /// implementations the option to recognize them. + fn cjk_compat_variants(self) -> Replacements; + /// An Iterator over the string with Conjoining Grapheme Joiner characters /// inserted according to the Stream-Safe Text Process (UAX15-D4) fn stream_safe(self) -> StreamSafe; @@ -134,6 +150,11 @@ impl<'a> UnicodeNormalization> for &'a str { recompose::new_compatible(self.chars()) } + #[inline] + fn cjk_compat_variants(self) -> Replacements> { + replace::new_cjk_compat_variants(self.chars()) + } + #[inline] fn stream_safe(self) -> StreamSafe> { StreamSafe::new(self.chars()) @@ -161,6 +182,11 @@ impl> UnicodeNormalization for I { recompose::new_compatible(self) } + #[inline] + fn cjk_compat_variants(self) -> Replacements { + replace::new_cjk_compat_variants(self) + } + #[inline] fn stream_safe(self) -> StreamSafe { StreamSafe::new(self) diff --git a/vendor/unicode-normalization/src/lookups.rs b/vendor/unicode-normalization/src/lookups.rs index 5bf5090b88..0111d204cc 100644 --- a/vendor/unicode-normalization/src/lookups.rs +++ b/vendor/unicode-normalization/src/lookups.rs @@ -64,6 +64,17 @@ pub(crate) fn compatibility_fully_decomposed(c: char) -> Option<&'static [char]> ) } +pub(crate) fn cjk_compat_variants_fully_decomposed(c: char) -> Option<&'static [char]> { + mph_lookup( + c.into(), + CJK_COMPAT_VARIANTS_DECOMPOSED_SALT, + CJK_COMPAT_VARIANTS_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( diff --git a/vendor/unicode-normalization/src/no_std_prelude.rs b/vendor/unicode-normalization/src/no_std_prelude.rs old mode 100644 new mode 100755 diff --git a/vendor/unicode-normalization/src/normalize.rs b/vendor/unicode-normalization/src/normalize.rs index 1097c423df..b144bd7c15 100644 --- a/vendor/unicode-normalization/src/normalize.rs +++ b/vendor/unicode-normalization/src/normalize.rs @@ -10,7 +10,8 @@ //! Functions for computing canonical and compatible decompositions for Unicode characters. use crate::lookups::{ - canonical_fully_decomposed, compatibility_fully_decomposed, composition_table, + canonical_fully_decomposed, cjk_compat_variants_fully_decomposed, + compatibility_fully_decomposed, composition_table, }; use core::{char, ops::FnMut}; @@ -36,6 +37,39 @@ pub fn decompose_compatible(c: char, emit_char: F) { decompose(c, decompose_char, emit_char) } +/// Compute standard-variation decomposition for character. +/// +/// [Standardized Variation Sequences] are used instead of the standard canonical +/// decompositions, notably for CJK codepoints with singleton canonical decompositions, +/// to avoid losing information. See the +/// [Unicode Variation Sequence FAQ](http://unicode.org/faq/vs.html) and the +/// "Other Enhancements" section of the +/// [Unicode 6.3 Release Summary](https://www.unicode.org/versions/Unicode6.3.0/#Summary) +/// for more information. +#[inline] +pub fn decompose_cjk_compat_variants(c: char, mut emit_char: F) +where + F: FnMut(char), +{ + // 7-bit ASCII never decomposes + if c <= '\x7f' { + emit_char(c); + return; + } + + // Don't perform decomposition for Hangul + + if let Some(decomposed) = cjk_compat_variants_fully_decomposed(c) { + for &d in decomposed { + emit_char(d); + } + return; + } + + // Finally bottom out. + emit_char(c); +} + #[inline] fn decompose(c: char, decompose_char: D, mut emit_char: F) where diff --git a/vendor/unicode-normalization/src/replace.rs b/vendor/unicode-normalization/src/replace.rs new file mode 100644 index 0000000000..8d8cb423fc --- /dev/null +++ b/vendor/unicode-normalization/src/replace.rs @@ -0,0 +1,61 @@ +// 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 or the MIT license +// , at your +// option. This file may not be copied, modified, or distributed +// except according to those terms. +use core::fmt::{self, Write}; +use tinyvec::ArrayVec; + +/// External iterator for replacements for a string's characters. +#[derive(Clone)] +pub struct Replacements { + iter: I, + // At this time, the longest replacement sequence has length 2, so we just + // need buffer space for 1 codepoint. + buffer: Option, +} + +#[inline] +pub fn new_cjk_compat_variants>(iter: I) -> Replacements { + Replacements { iter, buffer: None } +} + +impl> Iterator for Replacements { + type Item = char; + + #[inline] + fn next(&mut self) -> Option { + if let Some(c) = self.buffer.take() { + return Some(c); + } + + match self.iter.next() { + Some(ch) => { + // At this time, the longest replacement sequence has length 2. + let mut buffer = ArrayVec::<[char; 2]>::new(); + super::char::decompose_cjk_compat_variants(ch, |d| buffer.push(d)); + self.buffer = buffer.get(1).copied(); + Some(buffer[0]) + } + None => None, + } + } + + fn size_hint(&self) -> (usize, Option) { + let (lower, _) = self.iter.size_hint(); + (lower, None) + } +} + +impl + Clone> fmt::Display for Replacements { + fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { + for c in self.clone() { + f.write_char(c)?; + } + Ok(()) + } +} diff --git a/vendor/unicode-normalization/src/stream_safe.rs b/vendor/unicode-normalization/src/stream_safe.rs index 7ee71c97e8..30fe8100dc 100644 --- a/vendor/unicode-normalization/src/stream_safe.rs +++ b/vendor/unicode-normalization/src/stream_safe.rs @@ -32,25 +32,26 @@ impl> Iterator for StreamSafe { #[inline] fn next(&mut self) -> Option { - if let Some(ch) = self.buffer.take() { - return Some(ch); - } - let next_ch = match self.iter.next() { + let next_ch = match self.buffer.take().or_else(|| self.iter.next()) { None => return None, Some(c) => c, }; let d = classify_nonstarters(next_ch); if self.nonstarter_count + d.leading_nonstarters > MAX_NONSTARTERS { + // Since we're emitting a CGJ, the suffix of the emitted string in NFKD has no trailing + // nonstarters, so we can reset the counter to zero. Put `next_ch` back into the + // iterator (via `self.buffer`), and we'll reclassify it next iteration. + self.nonstarter_count = 0; self.buffer = Some(next_ch); - self.nonstarter_count = d.decomposition_len; return Some(COMBINING_GRAPHEME_JOINER); } - // No starters in the decomposition, so keep accumulating + // Is the character all nonstarters in NFKD? If so, increment our counter of contiguous + // nonstarters in NKFD. if d.leading_nonstarters == d.decomposition_len { self.nonstarter_count += d.decomposition_len; } - // Otherwise, restart the nonstarter counter. + // Otherwise, reset the counter to the decomposition's number of trailing nonstarters. else { self.nonstarter_count = d.trailing_nonstarters; } @@ -131,6 +132,13 @@ mod tests { assert_eq!(stream_safe(woah_nelly), its_cool); } + #[test] + fn test_all_nonstarters() { + let s = "\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}\u{0300}"; + let expected = "\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{034F}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}\u{300}"; + assert_eq!(stream_safe(s), expected); + } + #[test] fn test_classify_nonstarters() { // Highest character in the `compat_fully_decomp` table is 2FA1D diff --git a/vendor/unicode-normalization/src/tables.rs b/vendor/unicode-normalization/src/tables.rs index f90dedd113..81ebf232ac 100644 --- a/vendor/unicode-normalization/src/tables.rs +++ b/vendor/unicode-normalization/src/tables.rs @@ -15161,6 +15161,2015 @@ pub(crate) const COMPATIBILITY_DECOMPOSED_KV: &[(u32, &'static [char])] = &[ (0x2106, &['\u{0063}', '\u{002F}', '\u{0075}']), ]; +pub(crate) const CJK_COMPAT_VARIANTS_DECOMPOSED_SALT: &[u16] = &[ + 0x5, + 0x0, + 0x0, + 0x0, + 0x162, + 0x14, + 0xb6, + 0x0, + 0x183, + 0xd, + 0x0, + 0x0, + 0x35, + 0x11, + 0x7, + 0x0, + 0x1c, + 0x0, + 0x1, + 0x0, + 0xd3, + 0xb, + 0xa, + 0xe1, + 0x0, + 0x0, + 0x0, + 0x48, + 0x72, + 0xc7, + 0x2, + 0x21, + 0x15, + 0x2c, + 0x0, + 0x0, + 0x0, + 0x5, + 0x1f, + 0x8, + 0x7, + 0x0, + 0x4, + 0x0, + 0x7, + 0x10, + 0x0, + 0x0, + 0x0, + 0x4e, + 0x0, + 0x6, + 0x0, + 0x11, + 0x14, + 0x4, + 0x1a, + 0x2, + 0x58, + 0x0, + 0x17, + 0x0, + 0x0, + 0x0, + 0x4, + 0x0, + 0x1, + 0x0, + 0x1, + 0x0, + 0x4, + 0x6, + 0x16, + 0x20, + 0x4, + 0x0, + 0x1e, + 0x30, + 0x0, + 0x24, + 0x1a, + 0x17, + 0x0, + 0xa0, + 0x29, + 0x34, + 0x2, + 0x0, + 0x4, + 0x0, + 0x23, + 0x29, + 0x21, + 0x0, + 0x0, + 0xb, + 0x0, + 0x20, + 0x1, + 0x7, + 0x8, + 0x9, + 0x8, + 0x0, + 0x1, + 0x0, + 0x1, + 0x4, + 0x3, + 0x1d, + 0x0, + 0x0, + 0x0, + 0x1, + 0x29, + 0xd, + 0x7, + 0x0, + 0x0, + 0x2, + 0xe, + 0x9, + 0x4, + 0xc, + 0x1, + 0x13, + 0x5, + 0x6, + 0x5, + 0x1, + 0x9, + 0x1, + 0xa, + 0x2, + 0x0, + 0x8, + 0x29, + 0x0, + 0x8, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0xd, + 0x0, + 0x9, + 0x10, + 0xf, + 0x0, + 0x11, + 0xf, + 0x0, + 0x8, + 0x1, + 0x1, + 0x5, + 0x0, + 0x1, + 0x26, + 0x5, + 0x39, + 0x8, + 0x1, + 0x17, + 0xd, + 0x4, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0xe, + 0x0, + 0x5, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x0, + 0x1, + 0x2, + 0x4, + 0x3, + 0x35, + 0x1, + 0x2, + 0x1, + 0x7, + 0x0, + 0x0, + 0x3, + 0x2, + 0x11, + 0x0, + 0xd, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x5, + 0x0, + 0xe, + 0x0, + 0x0, + 0x3, + 0x6, + 0x2, + 0xb, + 0x2, + 0x1, + 0x3, + 0x12, + 0xb, + 0x0, + 0x0, + 0x0, + 0x2, + 0xb, + 0x1, + 0x4, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2f, + 0x1, + 0x13, + 0xb, + 0x4, + 0x2, + 0x4, + 0x4, + 0x0, + 0xb, + 0x4, + 0x0, + 0xb, + 0x4, + 0xd, + 0xc, + 0x0, + 0x1e, + 0x0, + 0x21, + 0xd, + 0x2, + 0x7, + 0x0, + 0x0, + 0x0, + 0x1, + 0x2, + 0x0, + 0x20, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1f, + 0x1, + 0x2, + 0x0, + 0x0, + 0x5, + 0x0, + 0x0, + 0x4, + 0x0, + 0x11, + 0x2, + 0x8, + 0x7, + 0x0, + 0x0, + 0xc, + 0x3, + 0x0, + 0x4, + 0xe, + 0x23, + 0x4, + 0x1, + 0x0, + 0x2, + 0x0, + 0x4, + 0x8, + 0x10, + 0x2, + 0x0, + 0x13, + 0xd, + 0x0, + 0xb, + 0x9, + 0x6, + 0x0, + 0x0, + 0x9, + 0xc, + 0xa, + 0x4, + 0x1a, + 0x3, + 0x1, + 0x3, + 0x0, + 0x1, + 0x0, + 0x6, + 0x3, + 0xa, + 0x0, + 0xa, + 0x6, + 0x8, + 0x8, + 0x3, + 0x19, + 0x0, + 0x0, + 0x0, + 0x0, + 0xc, + 0x5, + 0x0, + 0x5, + 0x1, + 0x0, + 0x2, + 0x0, + 0x8, + 0x0, + 0xc, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x2, + 0x15, + 0x0, + 0x4, + 0x1, + 0x12, + 0x4, + 0x3, + 0xc, + 0x4, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x5, + 0x2, + 0x0, + 0x1, + 0x2, + 0x1, + 0x10, + 0x4, + 0x0, + 0x5, + 0x2, + 0x1, + 0x6, + 0x0, + 0x0, + 0x0, + 0x0, + 0xa, + 0x8, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x4, + 0x4, + 0xc, + 0x2, + 0x0, + 0x6, + 0x3, + 0x3, + 0xf, + 0x0, + 0x3, + 0x5, + 0x1, + 0x0, + 0x0, + 0x8, + 0x0, + 0x2, + 0x4, + 0x2, + 0x13, + 0x0, + 0x0, + 0x0, + 0xa, + 0x6, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0xa, + 0x0, + 0x5, + 0x0, + 0x5, + 0x0, + 0x6, + 0x0, + 0x1, + 0x1, + 0x5, + 0x1, + 0xa, + 0x9, + 0x5, + 0x1, + 0x0, + 0x7, + 0x1, + 0x1, + 0x7, + 0x1, + 0x1f, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x11, + 0x5, + 0x3, + 0x5, + 0x3, + 0x1, + 0x1, + 0x0, + 0x4, + 0x1, + 0x4, + 0x1, + 0x8, + 0x0, + 0x19, + 0x0, + 0x4, + 0x3, + 0x5, + 0x6, + 0x0, + 0x11, + 0xe, + 0x5, + 0x1, + 0x0, + 0x1a, + 0x4, + 0x0, + 0x3, + 0x0, + 0x0, + 0x5, + 0x0, + 0x0, + 0x1, + 0x17, + 0x0, + 0x6, + 0x3, + 0xf, + 0x1, + 0x6, + 0x9, + 0x0, + 0x5, + 0x0, + 0x3, + 0x1, + 0x17, + 0x7, + 0x0, + 0x2, + 0x5, + 0x3, + 0x2, + 0x0, + 0x7, + 0x1, + 0x0, + 0x4, + 0x0, + 0x0, + 0x5, + 0x15, + 0x4, + 0x0, + 0x3, + 0x1, + 0x3, + 0x7, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x9, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x9, + 0x0, + 0x0, + 0x0, + 0x1, + 0x3, + 0x0, + 0x0, + 0x3, + 0x1, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x3, + 0x8, + 0x0, + 0x2, + 0x2, + 0x3, + 0x5, + 0x0, + 0x0, + 0x0, + 0x8, + 0x3, + 0x2, + 0x0, + 0x9, + 0x4, + 0x0, + 0x6, + 0xf, + 0x1, + 0x0, + 0x0, + 0x4, + 0x2, + 0x2, + 0x4, + 0x4, + 0xd, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x2, + 0x5, + 0x0, + 0x0, + 0xc, + 0x4, + 0x9, + 0x2, + 0x8, + 0x1, + 0x0, + 0x5, + 0x4, + 0x1, + 0x2, + 0x1, + 0x5, + 0x2, + 0xb, + 0x4, + 0xd, + 0x4, + 0x0, + 0x1, + 0x18, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x3, + 0x0, + 0x2, + 0xa, + 0x2, + 0x4, + 0x4, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0xc, + 0x1, + 0xc, + 0x1, + 0x9, + 0xb, + 0x0, + 0x1, + 0x0, + 0x2, + 0x0, + 0x5, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x7, + 0x2, + 0x0, + 0x6, + 0x4, + 0xa, + 0x1, + 0x1, + 0x5, + 0x2, + 0x6, + 0x4, + 0x3, + 0xd, + 0x2, + 0x2, + 0x0, + 0x1, + 0x2, + 0x3, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x3, + 0x2, + 0x0, + 0x5, + 0x2, + 0x5, + 0x2, + 0x1, + 0x4, + 0x1, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x7, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x2, + 0x0, + 0x0, + 0x4, + 0x8, + 0x0, + 0x3, + 0x2, + 0x2, + 0x2, + 0x2, + 0x4, + 0x1, + 0x4, + 0x2, + 0x0, + 0x1, + 0x4, + 0x1, + 0x1, + 0x2, + 0x0, + 0x0, + 0xc, + 0x0, + 0x1, + 0x2, + 0x0, + 0x6, + 0x2, + 0x0, + 0x0, + 0x8, + 0x1, + 0x9, + 0x1, + 0x3, + 0x0, + 0x4, + 0x1, + 0x0, + 0x6, + 0x0, + 0x3, + 0x7, + 0x0, + 0x0, + 0x2, + 0x1, + 0x0, + 0x3, + 0x2, + 0x0, + 0x2, + 0x7, + 0x0, + 0x0, + 0x0, + 0x0, + 0x5, + 0x3, + 0x1, + 0x3, + 0x0, + 0x5, + 0x0, + 0x1, + 0x0, + 0x3, + 0x1, + 0x1, + 0x2, + 0x3, + 0x0, + 0x2, + 0x3, + 0x0, + 0x0, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x0, + 0x4, + 0x3, + 0x2, + 0x4, + 0x3, + 0x5, + 0x2, + 0x0, + 0x0, + 0x1, + 0x3, + 0x2, + 0x0, + 0x0, + 0x4, + 0x3, + 0x0, + 0x1, + 0x6, + 0x1, + 0x4, + 0x0, + 0x2, + 0x2, + 0x1, + 0x0, + 0xd, + 0x1, + 0x0, + 0x0, + 0x1, + 0x0, + 0x2, + 0x3, + 0x8, + 0x5, + 0x7, + 0x6, + 0x0, + 0x1, + 0x6, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x1, + 0x0, + 0x0, + 0x1, + 0x1, + 0x2, + 0x4, + 0x2, + 0x1, + 0x1, + 0x2, + 0x0, + 0x0, + 0x0, + 0x1, + 0x5, + 0x1, + 0x0, + 0x2, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x4, + 0x0, + 0x2, + 0x0, + 0x1, + 0x3, + 0x3, + 0x1, + 0x0, + 0x4, + 0x0, + 0x1, + 0x1, + 0x1, + 0x1, + 0x1, + 0x4, + 0x0, + 0x0, + 0x3, + 0x1, + 0x3, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x1, + 0x2, + 0x0, + 0x0, + 0x1, + 0x3, + 0x2, + 0x1, + 0x2, + 0x1, + 0x9, + 0x1, + 0x0, + 0x1, + 0x3, + 0x4, + 0x0, + 0x0, + 0x0, + 0x2, + 0x0, + 0x3, + 0x1, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x0, + 0x2, + 0x1, + 0x4, + 0x1, + 0x1, + 0x1, + 0x2, + 0x1, + 0x6, + 0x1, + 0x1, + 0x2, + 0x1, + 0x0, + 0x0, + 0x0, + 0x3, + 0x1, + 0x0, + 0x5, + 0x1, +]; +pub(crate) const CJK_COMPAT_VARIANTS_DECOMPOSED_KV: &[(u32, &'static [char])] = &[ + (0xfa08, &['\u{884C}', '\u{FE00}']), + (0x2f825, &['\u{52C7}', '\u{FE01}']), + (0x2f838, &['\u{20B63}', '\u{FE00}']), + (0x2f95b, &['\u{7A4F}', '\u{FE00}']), + (0x2f8fb, &['\u{23CBC}', '\u{FE00}']), + (0x2f83a, &['\u{53F1}', '\u{FE00}']), + (0x2f8a7, &['\u{614C}', '\u{FE00}']), + (0x2f856, &['\u{5832}', '\u{FE00}']), + (0x2f810, &['\u{5164}', '\u{FE00}']), + (0xfa8b, &['\u{61F2}', '\u{FE01}']), + (0xfa7a, &['\u{5599}', '\u{FE00}']), + (0x2f9ef, &['\u{4995}', '\u{FE00}']), + (0x2f959, &['\u{7A40}', '\u{FE01}']), + (0xf9c8, &['\u{677B}', '\u{FE00}']), + (0xf9c4, &['\u{9F8D}', '\u{FE00}']), + (0x2f833, &['\u{537F}', '\u{FE02}']), + (0xf96c, &['\u{585E}', '\u{FE00}']), + (0xf9a1, &['\u{8AAA}', '\u{FE01}']), + (0xf906, &['\u{53E5}', '\u{FE00}']), + (0x2fa01, &['\u{295B6}', '\u{FE00}']), + (0xf94c, &['\u{6A13}', '\u{FE00}']), + (0xf90f, &['\u{7F85}', '\u{FE00}']), + (0x2f8dd, &['\u{233C3}', '\u{FE00}']), + (0xfa55, &['\u{7A81}', '\u{FE00}']), + (0x2f860, &['\u{216A8}', '\u{FE00}']), + (0x2f999, &['\u{831D}', '\u{FE00}']), + (0xfabc, &['\u{8B01}', '\u{FE01}']), + (0x2f9b9, &['\u{870E}', '\u{FE00}']), + (0xf943, &['\u{5F04}', '\u{FE00}']), + (0x2f952, &['\u{25626}', '\u{FE00}']), + (0x2f8f1, &['\u{6B54}', '\u{FE00}']), + (0xf99c, &['\u{5217}', '\u{FE00}']), + (0xf969, &['\u{6578}', '\u{FE00}']), + (0xf98d, &['\u{8F62}', '\u{FE00}']), + (0xfa7f, &['\u{5954}', '\u{FE00}']), + (0x2f9d6, &['\u{8D1B}', '\u{FE00}']), + (0x2f81b, &['\u{51B5}', '\u{FE01}']), + (0xfa9d, &['\u{77A7}', '\u{FE00}']), + (0x2f8e4, &['\u{688E}', '\u{FE00}']), + (0xfa94, &['\u{6756}', '\u{FE00}']), + (0x2f890, &['\u{5EFE}', '\u{FE00}']), + (0xf93d, &['\u{7DA0}', '\u{FE00}']), + (0x2f924, &['\u{7280}', '\u{FE00}']), + (0x2f983, &['\u{8103}', '\u{FE00}']), + (0xfa2f, &['\u{96B7}', '\u{FE00}']), + (0x2f891, &['\u{22331}', '\u{FE00}']), + (0x2f934, &['\u{7524}', '\u{FE00}']), + (0x2f835, &['\u{7070}', '\u{FE00}']), + (0x2f899, &['\u{5F62}', '\u{FE00}']), + (0x2f8ae, &['\u{61AF}', '\u{FE00}']), + (0xf9d6, &['\u{6DEA}', '\u{FE00}']), + (0x2f9a0, &['\u{8353}', '\u{FE00}']), + (0xfac2, &['\u{8F38}', '\u{FE00}']), + (0x2f851, &['\u{58EE}', '\u{FE00}']), + (0x2f804, &['\u{4F60}', '\u{FE00}']), + (0x2f90d, &['\u{23ED1}', '\u{FE00}']), + (0xf95e, &['\u{4E39}', '\u{FE00}']), + (0x2f8da, &['\u{6721}', '\u{FE00}']), + (0x2f885, &['\u{5E28}', '\u{FE00}']), + (0x2f96a, &['\u{7D00}', '\u{FE00}']), + (0xf907, &['\u{9F9C}', '\u{FE00}']), + (0xf9f9, &['\u{7C92}', '\u{FE00}']), + (0xf94b, &['\u{5C62}', '\u{FE00}']), + (0x2f915, &['\u{701B}', '\u{FE00}']), + (0xf9f1, &['\u{96A3}', '\u{FE00}']), + (0x2f86d, &['\u{5BC3}', '\u{FE00}']), + (0x2f921, &['\u{7235}', '\u{FE01}']), + (0xfa96, &['\u{6BBA}', '\u{FE01}']), + (0xf9e0, &['\u{6613}', '\u{FE00}']), + (0xf921, &['\u{5D50}', '\u{FE00}']), + (0x2f99f, &['\u{8457}', '\u{FE01}']), + (0x2f8b2, &['\u{6210}', '\u{FE00}']), + (0xfab1, &['\u{7F3E}', '\u{FE00}']), + (0xfa6c, &['\u{242EE}', '\u{FE00}']), + (0x2f819, &['\u{4ECC}', '\u{FE00}']), + (0x2f910, &['\u{23F5E}', '\u{FE00}']), + (0x2f8dc, &['\u{6753}', '\u{FE00}']), + (0x2f9d3, &['\u{27CA8}', '\u{FE00}']), + (0x2f8a3, &['\u{6094}', '\u{FE01}']), + (0xf915, &['\u{6D1B}', '\u{FE00}']), + (0x2f88a, &['\u{387C}', '\u{FE00}']), + (0xf9f6, &['\u{81E8}', '\u{FE00}']), + (0x2f9f1, &['\u{28D77}', '\u{FE00}']), + (0xf98e, &['\u{5E74}', '\u{FE00}']), + (0xfad5, &['\u{25249}', '\u{FE00}']), + (0xf93b, &['\u{788C}', '\u{FE00}']), + (0x2f91e, &['\u{719C}', '\u{FE00}']), + (0xf9eb, &['\u{533F}', '\u{FE00}']), + (0xfa42, &['\u{65E2}', '\u{FE00}']), + (0x2f958, &['\u{412F}', '\u{FE00}']), + (0xfa19, &['\u{795E}', '\u{FE00}']), + (0xfaaa, &['\u{7740}', '\u{FE00}']), + (0x2f949, &['\u{4039}', '\u{FE01}']), + (0x2f978, &['\u{7F95}', '\u{FE00}']), + (0x2f8a9, &['\u{614C}', '\u{FE01}']), + (0x2f90a, &['\u{3D33}', '\u{FE00}']), + (0x2f89a, &['\u{5F6B}', '\u{FE00}']), + (0x2f8b5, &['\u{62B1}', '\u{FE00}']), + (0x2f94c, &['\u{4096}', '\u{FE00}']), + (0xfa43, &['\u{6691}', '\u{FE00}']), + (0xf997, &['\u{806F}', '\u{FE00}']), + (0x2f8ba, &['\u{62FC}', '\u{FE00}']), + (0xfa00, &['\u{5207}', '\u{FE00}']), + (0xfac3, &['\u{9072}', '\u{FE00}']), + (0x2f948, &['\u{774A}', '\u{FE01}']), + (0x2f9f4, &['\u{5DB2}', '\u{FE00}']), + (0xfa99, &['\u{6ECB}', '\u{FE00}']), + (0x2f976, &['\u{7F7A}', '\u{FE00}']), + (0xf978, &['\u{5169}', '\u{FE00}']), + (0x2f8fe, &['\u{6C67}', '\u{FE00}']), + (0x2f8e3, &['\u{2346D}', '\u{FE00}']), + (0xf919, &['\u{916A}', '\u{FE00}']), + (0x2f8ef, &['\u{6B21}', '\u{FE00}']), + (0xf939, &['\u{9B6F}', '\u{FE00}']), + (0x2f8c9, &['\u{656C}', '\u{FE00}']), + (0x2f844, &['\u{5563}', '\u{FE00}']), + (0xfabb, &['\u{8ACB}', '\u{FE00}']), + (0x2f9c4, &['\u{8863}', '\u{FE00}']), + (0x2f984, &['\u{440B}', '\u{FE00}']), + (0x2f802, &['\u{4E41}', '\u{FE00}']), + (0xfa15, &['\u{51DE}', '\u{FE00}']), + (0xf9be, &['\u{6599}', '\u{FE00}']), + (0xf942, &['\u{58DF}', '\u{FE00}']), + (0x2f852, &['\u{57CE}', '\u{FE00}']), + (0xfaae, &['\u{7C7B}', '\u{FE00}']), + (0x2fa17, &['\u{9EF9}', '\u{FE00}']), + (0x2f92d, &['\u{3EB8}', '\u{FE01}']), + (0x2f83f, &['\u{5468}', '\u{FE00}']), + (0xf90c, &['\u{5948}', '\u{FE00}']), + (0xf931, &['\u{6AD3}', '\u{FE00}']), + (0xf9c1, &['\u{7642}', '\u{FE00}']), + (0x2f873, &['\u{5C06}', '\u{FE00}']), + (0x2f965, &['\u{25C80}', '\u{FE00}']), + (0xf902, &['\u{8ECA}', '\u{FE00}']), + (0x2f805, &['\u{4FAE}', '\u{FE01}']), + (0x2f8ca, &['\u{2300A}', '\u{FE00}']), + (0xf9c7, &['\u{5289}', '\u{FE00}']), + (0x2f8f4, &['\u{6B9F}', '\u{FE00}']), + (0xfa0d, &['\u{55C0}', '\u{FE00}']), + (0xfa5c, &['\u{81ED}', '\u{FE00}']), + (0xfa4c, &['\u{793E}', '\u{FE00}']), + (0x2f865, &['\u{59D8}', '\u{FE00}']), + (0x2f876, &['\u{3781}', '\u{FE00}']), + (0x2f9d7, &['\u{8D77}', '\u{FE00}']), + (0xf975, &['\u{63A0}', '\u{FE00}']), + (0x2f9bb, &['\u{8779}', '\u{FE01}']), + (0x2f9d2, &['\u{8C55}', '\u{FE00}']), + (0xf9ed, &['\u{541D}', '\u{FE00}']), + (0x2f9b4, &['\u{865C}', '\u{FE01}']), + (0xfa6d, &['\u{8218}', '\u{FE00}']), + (0xf9e5, &['\u{75E2}', '\u{FE00}']), + (0x2f8d8, &['\u{6717}', '\u{FE02}']), + (0x2f93d, &['\u{25044}', '\u{FE00}']), + (0xfa03, &['\u{7CD6}', '\u{FE00}']), + (0xf9a0, &['\u{88C2}', '\u{FE00}']), + (0x2fa12, &['\u{2A105}', '\u{FE00}']), + (0xfa63, &['\u{8B39}', '\u{FE00}']), + (0xf920, &['\u{9E1E}', '\u{FE00}']), + (0xf91f, &['\u{862D}', '\u{FE00}']), + (0x2f97d, &['\u{8060}', '\u{FE00}']), + (0xf990, &['\u{6200}', '\u{FE00}']), + (0xfa57, &['\u{7DF4}', '\u{FE01}']), + (0x2f975, &['\u{262D9}', '\u{FE00}']), + (0xfad8, &['\u{9F43}', '\u{FE00}']), + (0xfab3, &['\u{8352}', '\u{FE00}']), + (0x2f9f3, &['\u{96C3}', '\u{FE00}']), + (0xf9fb, &['\u{7099}', '\u{FE00}']), + (0xf918, &['\u{843D}', '\u{FE00}']), + (0x2f8c3, &['\u{6469}', '\u{FE00}']), + (0xf9ca, &['\u{6D41}', '\u{FE00}']), + (0xf952, &['\u{52D2}', '\u{FE00}']), + (0x2fa0b, &['\u{9C40}', '\u{FE00}']), + (0x2f941, &['\u{250F3}', '\u{FE00}']), + (0x2f862, &['\u{59EC}', '\u{FE00}']), + (0x2f8ff, &['\u{6D16}', '\u{FE00}']), + (0x2f85d, &['\u{591A}', '\u{FE00}']), + (0xf9d9, &['\u{6144}', '\u{FE00}']), + (0x2f855, &['\u{578B}', '\u{FE00}']), + (0x2f98f, &['\u{8291}', '\u{FE00}']), + (0xf9d4, &['\u{502B}', '\u{FE00}']), + (0xf99e, &['\u{54BD}', '\u{FE00}']), + (0x2f850, &['\u{5207}', '\u{FE01}']), + (0xfa22, &['\u{8AF8}', '\u{FE00}']), + (0x2f94f, &['\u{788C}', '\u{FE01}']), + (0xfaa9, &['\u{774A}', '\u{FE00}']), + (0xfa71, &['\u{51B5}', '\u{FE00}']), + (0xf95d, &['\u{8AFE}', '\u{FE00}']), + (0x2f8bd, &['\u{63E4}', '\u{FE00}']), + (0x2fa02, &['\u{98E2}', '\u{FE00}']), + (0x2f93f, &['\u{4008}', '\u{FE00}']), + (0x2f808, &['\u{507A}', '\u{FE00}']), + (0x2f950, &['\u{78CC}', '\u{FE01}']), + (0x2f933, &['\u{3F1B}', '\u{FE00}']), + (0x2f853, &['\u{57F4}', '\u{FE00}']), + (0x2f8f0, &['\u{238A7}', '\u{FE00}']), + (0xf967, &['\u{4E0D}', '\u{FE00}']), + (0xfa16, &['\u{732A}', '\u{FE00}']), + (0xfaa6, &['\u{76CA}', '\u{FE01}']), + (0x2f8b3, &['\u{621B}', '\u{FE00}']), + (0x2f9f7, &['\u{2921A}', '\u{FE00}']), + (0xf986, &['\u{95AD}', '\u{FE00}']), + (0x2f99d, &['\u{83BD}', '\u{FE00}']), + (0x2f9b8, &['\u{8688}', '\u{FE00}']), + (0xf998, &['\u{8F26}', '\u{FE00}']), + (0x2f82b, &['\u{5317}', '\u{FE01}']), + (0x2f872, &['\u{5BFF}', '\u{FE00}']), + (0xfab9, &['\u{8ABF}', '\u{FE00}']), + (0xfa9b, &['\u{701E}', '\u{FE00}']), + (0xf9b0, &['\u{8046}', '\u{FE00}']), + (0xf98b, &['\u{66C6}', '\u{FE00}']), + (0xfad1, &['\u{233D5}', '\u{FE00}']), + (0xf917, &['\u{73DE}', '\u{FE00}']), + (0x2f989, &['\u{23393}', '\u{FE00}']), + (0x2f866, &['\u{5A66}', '\u{FE00}']), + (0xf932, &['\u{7210}', '\u{FE00}']), + (0x2fa0e, &['\u{4CED}', '\u{FE00}']), + (0xfa07, &['\u{8F3B}', '\u{FE00}']), + (0xf9bd, &['\u{5C3F}', '\u{FE00}']), + (0x2f88c, &['\u{5EB3}', '\u{FE00}']), + (0xfa56, &['\u{7BC0}', '\u{FE00}']), + (0xfa64, &['\u{8CD3}', '\u{FE00}']), + (0xfa04, &['\u{5B85}', '\u{FE00}']), + (0xfa9e, &['\u{7235}', '\u{FE00}']), + (0x2f9e0, &['\u{285D2}', '\u{FE00}']), + (0x2f89d, &['\u{5FCD}', '\u{FE00}']), + (0x2f9ee, &['\u{958B}', '\u{FE00}']), + (0xf9db, &['\u{7387}', '\u{FE01}']), + (0xf923, &['\u{85CD}', '\u{FE00}']), + (0x2f841, &['\u{54F6}', '\u{FE00}']), + (0x2f81a, &['\u{51AC}', '\u{FE00}']), + (0xf911, &['\u{87BA}', '\u{FE00}']), + (0xfaad, &['\u{7BC0}', '\u{FE01}']), + (0xfac1, &['\u{8D08}', '\u{FE01}']), + (0x2f928, &['\u{737A}', '\u{FE00}']), + (0x2f935, &['\u{24C36}', '\u{FE00}']), + (0x2f8d5, &['\u{669C}', '\u{FE00}']), + (0xf92e, &['\u{51B7}', '\u{FE00}']), + (0xfa59, &['\u{7E41}', '\u{FE00}']), + (0x2f96b, &['\u{25F86}', '\u{FE00}']), + (0x2f8b9, &['\u{633D}', '\u{FE00}']), + (0x2f877, &['\u{5C60}', '\u{FE00}']), + (0x2fa00, &['\u{9829}', '\u{FE00}']), + (0xfa05, &['\u{6D1E}', '\u{FE00}']), + (0xf9e8, &['\u{88E1}', '\u{FE00}']), + (0x2f8c6, &['\u{6477}', '\u{FE00}']), + (0xf97a, &['\u{6881}', '\u{FE00}']), + (0x2f9ea, &['\u{927C}', '\u{FE00}']), + (0xf944, &['\u{7C60}', '\u{FE00}']), + (0x2f8c4, &['\u{647E}', '\u{FE00}']), + (0x2f9cd, &['\u{46BE}', '\u{FE00}']), + (0x2f8e5, &['\u{681F}', '\u{FE00}']), + (0x2f9d9, &['\u{20804}', '\u{FE00}']), + (0x2f980, &['\u{2335F}', '\u{FE00}']), + (0x2f9a8, &['\u{84F1}', '\u{FE00}']), + (0x2f92f, &['\u{745C}', '\u{FE00}']), + (0x2f951, &['\u{40E3}', '\u{FE00}']), + (0x2f9f9, &['\u{4A76}', '\u{FE00}']), + (0xfab4, &['\u{83EF}', '\u{FE00}']), + (0xf985, &['\u{792A}', '\u{FE00}']), + (0x2f829, &['\u{5305}', '\u{FE00}']), + (0x2f8a2, &['\u{391C}', '\u{FE00}']), + (0x2f9c3, &['\u{8860}', '\u{FE00}']), + (0x2f936, &['\u{753E}', '\u{FE00}']), + (0x2f9af, &['\u{4561}', '\u{FE00}']), + (0xfa77, &['\u{52FA}', '\u{FE00}']), + (0xf956, &['\u{7A1C}', '\u{FE00}']), + (0xfa5f, &['\u{8457}', '\u{FE00}']), + (0x2f93b, &['\u{24FA1}', '\u{FE00}']), + (0xf914, &['\u{6A02}', '\u{FE00}']), + (0x2f994, &['\u{82B3}', '\u{FE00}']), + (0x2f91b, &['\u{20525}', '\u{FE00}']), + (0x2f880, &['\u{5D7C}', '\u{FE00}']), + (0x2f956, &['\u{798F}', '\u{FE01}']), + (0xf958, &['\u{83F1}', '\u{FE00}']), + (0x2f99b, &['\u{83AD}', '\u{FE00}']), + (0x2fa06, &['\u{99C2}', '\u{FE00}']), + (0xfabf, &['\u{8B39}', '\u{FE01}']), + (0x2f8b6, &['\u{62D4}', '\u{FE00}']), + (0x2f8a0, &['\u{6081}', '\u{FE00}']), + (0xfa87, &['\u{614E}', '\u{FE00}']), + (0x2f8ea, &['\u{69EA}', '\u{FE00}']), + (0x2f867, &['\u{36EE}', '\u{FE00}']), + (0xf97d, &['\u{8AD2}', '\u{FE00}']), + (0xf968, &['\u{6CCC}', '\u{FE00}']), + (0xfa5a, &['\u{7F72}', '\u{FE00}']), + (0xf97b, &['\u{7CE7}', '\u{FE00}']), + (0x2fa10, &['\u{2A0CE}', '\u{FE00}']), + (0xfa2b, &['\u{98FC}', '\u{FE00}']), + (0xfa75, &['\u{5180}', '\u{FE00}']), + (0xf94d, &['\u{6DDA}', '\u{FE00}']), + (0xfad4, &['\u{4039}', '\u{FE00}']), + (0x2f8cc, &['\u{66F8}', '\u{FE00}']), + (0xfa8a, &['\u{6160}', '\u{FE00}']), + (0xf9f4, &['\u{6797}', '\u{FE00}']), + (0xfac6, &['\u{967C}', '\u{FE00}']), + (0xfa9c, &['\u{716E}', '\u{FE01}']), + (0xfa10, &['\u{585A}', '\u{FE00}']), + (0xf9e2, &['\u{68A8}', '\u{FE00}']), + (0xf947, &['\u{78CA}', '\u{FE00}']), + (0xf941, &['\u{8AD6}', '\u{FE00}']), + (0xfa4e, &['\u{7948}', '\u{FE00}']), + (0x2f9da, &['\u{8DCB}', '\u{FE00}']), + (0x2f893, &['\u{8201}', '\u{FE00}']), + (0xf96f, &['\u{8AAA}', '\u{FE00}']), + (0xf983, &['\u{65C5}', '\u{FE00}']), + (0xf9f5, &['\u{6DCB}', '\u{FE00}']), + (0xf962, &['\u{7570}', '\u{FE00}']), + (0x2f968, &['\u{7CE8}', '\u{FE00}']), + (0x2f923, &['\u{24608}', '\u{FE00}']), + (0x2fa18, &['\u{9EFE}', '\u{FE00}']), + (0x2f930, &['\u{7471}', '\u{FE01}']), + (0xfa90, &['\u{6556}', '\u{FE00}']), + (0xfa54, &['\u{7A40}', '\u{FE00}']), + (0xf9d8, &['\u{5F8B}', '\u{FE00}']), + (0x2f9e4, &['\u{9111}', '\u{FE00}']), + (0x2fa05, &['\u{99A7}', '\u{FE00}']), + (0x2f964, &['\u{4227}', '\u{FE00}']), + (0xf99f, &['\u{70C8}', '\u{FE00}']), + (0x2f94b, &['\u{4046}', '\u{FE00}']), + (0x2f9a9, &['\u{84F3}', '\u{FE00}']), + (0xfa0c, &['\u{5140}', '\u{FE00}']), + (0x2f986, &['\u{5AB5}', '\u{FE00}']), + (0xfa85, &['\u{5FAD}', '\u{FE00}']), + (0x2f95f, &['\u{7AEE}', '\u{FE00}']), + (0xf9f8, &['\u{7B20}', '\u{FE00}']), + (0xf9b4, &['\u{9818}', '\u{FE00}']), + (0x2f82e, &['\u{535A}', '\u{FE00}']), + (0xfad9, &['\u{9F8E}', '\u{FE00}']), + (0x2f937, &['\u{24C92}', '\u{FE00}']), + (0xf9cf, &['\u{7D10}', '\u{FE00}']), + (0xfaa1, &['\u{7471}', '\u{FE00}']), + (0x2f917, &['\u{704A}', '\u{FE00}']), + (0xfaa5, &['\u{761F}', '\u{FE00}']), + (0xfa3b, &['\u{5C64}', '\u{FE00}']), + (0x2f88d, &['\u{5EB6}', '\u{FE00}']), + (0x2f906, &['\u{23D1E}', '\u{FE00}']), + (0x2f901, &['\u{6D77}', '\u{FE01}']), + (0x2f97a, &['\u{8005}', '\u{FE02}']), + (0xfa60, &['\u{8910}', '\u{FE00}']), + (0x2f92c, &['\u{3EB8}', '\u{FE00}']), + (0x2f80a, &['\u{50E7}', '\u{FE01}']), + (0x2f99a, &['\u{8363}', '\u{FE00}']), + (0x2fa13, &['\u{2A20E}', '\u{FE00}']), + (0x2f938, &['\u{7570}', '\u{FE01}']), + (0x2f813, &['\u{34B9}', '\u{FE00}']), + (0x2f831, &['\u{537F}', '\u{FE00}']), + (0xfa1c, &['\u{9756}', '\u{FE00}']), + (0xfacc, &['\u{983B}', '\u{FE01}']), + (0xfa5e, &['\u{8279}', '\u{FE01}']), + (0x2f995, &['\u{82BD}', '\u{FE00}']), + (0x2f8d3, &['\u{5195}', '\u{FE00}']), + (0xfacd, &['\u{9B12}', '\u{FE00}']), + (0x2f81d, &['\u{51F5}', '\u{FE00}']), + (0x2f97b, &['\u{264DA}', '\u{FE00}']), + (0xfa3a, &['\u{58A8}', '\u{FE00}']), + (0xf9c6, &['\u{962E}', '\u{FE00}']), + (0xfabd, &['\u{8AFE}', '\u{FE01}']), + (0xf92d, &['\u{4F86}', '\u{FE00}']), + (0xf99b, &['\u{934A}', '\u{FE00}']), + (0xf91d, &['\u{6B04}', '\u{FE00}']), + (0x2f84d, &['\u{5717}', '\u{FE00}']), + (0x2f8ad, &['\u{61A4}', '\u{FE00}']), + (0xf9d3, &['\u{9678}', '\u{FE00}']), + (0x2f843, &['\u{5553}', '\u{FE00}']), + (0xf97c, &['\u{826F}', '\u{FE00}']), + (0xfa30, &['\u{4FAE}', '\u{FE00}']), + (0x2f858, &['\u{58AC}', '\u{FE00}']), + (0x2f8a5, &['\u{60C7}', '\u{FE00}']), + (0x2f988, &['\u{267B5}', '\u{FE00}']), + (0x2f9e1, &['\u{285ED}', '\u{FE00}']), + (0xfa74, &['\u{5145}', '\u{FE00}']), + (0x2f882, &['\u{5DE2}', '\u{FE00}']), + (0x2f879, &['\u{5CC0}', '\u{FE00}']), + (0x2f8b7, &['\u{6350}', '\u{FE00}']), + (0xf940, &['\u{9E7F}', '\u{FE00}']), + (0x2f9e5, &['\u{2872E}', '\u{FE00}']), + (0x2f9cf, &['\u{8AA0}', '\u{FE00}']), + (0xfa8e, &['\u{641C}', '\u{FE00}']), + (0x2f90c, &['\u{6EC7}', '\u{FE00}']), + (0x2f985, &['\u{813E}', '\u{FE00}']), + (0x2f849, &['\u{55B3}', '\u{FE00}']), + (0x2f960, &['\u{4202}', '\u{FE00}']), + (0x2f8c2, &['\u{3A2E}', '\u{FE00}']), + (0x2f85f, &['\u{5962}', '\u{FE00}']), + (0x2f916, &['\u{3D96}', '\u{FE00}']), + (0xf9fa, &['\u{72C0}', '\u{FE00}']), + (0x2f824, &['\u{3515}', '\u{FE00}']), + (0xf936, &['\u{865C}', '\u{FE00}']), + (0x2f94a, &['\u{778B}', '\u{FE00}']), + (0x2f80e, &['\u{514D}', '\u{FE01}']), + (0x2f913, &['\u{7039}', '\u{FE00}']), + (0x2f94d, &['\u{2541D}', '\u{FE00}']), + (0xf999, &['\u{84EE}', '\u{FE00}']), + (0x2f979, &['\u{7FFA}', '\u{FE00}']), + (0x2f926, &['\u{24735}', '\u{FE00}']), + (0xf9ea, &['\u{96E2}', '\u{FE00}']), + (0xfa3f, &['\u{618E}', '\u{FE00}']), + (0x2f83b, &['\u{5406}', '\u{FE00}']), + (0xfa5b, &['\u{8005}', '\u{FE00}']), + (0xfa93, &['\u{671B}', '\u{FE00}']), + (0xf913, &['\u{908F}', '\u{FE00}']), + (0xf98c, &['\u{6B77}', '\u{FE00}']), + (0x2f8c0, &['\u{63C5}', '\u{FE00}']), + (0xfad7, &['\u{27ED3}', '\u{FE00}']), + (0xf98a, &['\u{529B}', '\u{FE00}']), + (0xfa26, &['\u{90FD}', '\u{FE00}']), + (0xfabe, &['\u{8AED}', '\u{FE00}']), + (0x2f977, &['\u{2633E}', '\u{FE00}']), + (0xf954, &['\u{51DC}', '\u{FE00}']), + (0xf91a, &['\u{99F1}', '\u{FE00}']), + (0x2f8cd, &['\u{6649}', '\u{FE00}']), + (0x2f8a4, &['\u{226D4}', '\u{FE00}']), + (0xfa84, &['\u{5F69}', '\u{FE00}']), + (0x2f85e, &['\u{5922}', '\u{FE00}']), + (0xfa9f, &['\u{72AF}', '\u{FE00}']), + (0xf9b1, &['\u{9234}', '\u{FE00}']), + (0x2f9ca, &['\u{34BB}', '\u{FE00}']), + (0xfac4, &['\u{9199}', '\u{FE00}']), + (0xf927, &['\u{881F}', '\u{FE00}']), + (0xfa01, &['\u{5EA6}', '\u{FE00}']), + (0xf929, &['\u{6717}', '\u{FE00}']), + (0xf9f3, &['\u{9E9F}', '\u{FE00}']), + (0x2f9e6, &['\u{911B}', '\u{FE00}']), + (0xfa70, &['\u{4E26}', '\u{FE00}']), + (0x2f820, &['\u{523B}', '\u{FE00}']), + (0xf9a9, &['\u{56F9}', '\u{FE00}']), + (0x2f9bf, &['\u{45D7}', '\u{FE00}']), + (0x2f922, &['\u{7250}', '\u{FE00}']), + (0x2f9de, &['\u{8ED4}', '\u{FE00}']), + (0x2f8ec, &['\u{236A3}', '\u{FE00}']), + (0xf9b5, &['\u{4F8B}', '\u{FE00}']), + (0x2f9b7, &['\u{86A9}', '\u{FE00}']), + (0x2f981, &['\u{43D5}', '\u{FE00}']), + (0xfa31, &['\u{50E7}', '\u{FE00}']), + (0x2f9c1, &['\u{8801}', '\u{FE00}']), + (0x2f874, &['\u{5F53}', '\u{FE00}']), + (0xf9d0, &['\u{985E}', '\u{FE00}']), + (0xf94a, &['\u{58D8}', '\u{FE00}']), + (0x2f998, &['\u{82E5}', '\u{FE01}']), + (0x2f91c, &['\u{7145}', '\u{FE00}']), + (0x2f9df, &['\u{8F38}', '\u{FE01}']), + (0x2f859, &['\u{214E4}', '\u{FE00}']), + (0x2f883, &['\u{382F}', '\u{FE00}']), + (0xf9cc, &['\u{7409}', '\u{FE00}']), + (0x2f9b5, &['\u{8667}', '\u{FE00}']), + (0x2f970, &['\u{7E45}', '\u{FE00}']), + (0x2f814, &['\u{5167}', '\u{FE00}']), + (0x2f9ff, &['\u{980B}', '\u{FE02}']), + (0x2f84c, &['\u{5606}', '\u{FE01}']), + (0x2f9a4, &['\u{26C36}', '\u{FE00}']), + (0x2f966, &['\u{7CD2}', '\u{FE00}']), + (0xfa1e, &['\u{7FBD}', '\u{FE00}']), + (0x2fa0c, &['\u{9CFD}', '\u{FE00}']), + (0x2f863, &['\u{5A1B}', '\u{FE00}']), + (0xfaa2, &['\u{7506}', '\u{FE00}']), + (0x2f91a, &['\u{70AD}', '\u{FE00}']), + (0x2f8f8, &['\u{21D0B}', '\u{FE00}']), + (0x2f8a6, &['\u{6148}', '\u{FE00}']), + (0x2f895, &['\u{5F22}', '\u{FE01}']), + (0xf90b, &['\u{5587}', '\u{FE00}']), + (0x2f993, &['\u{82B1}', '\u{FE00}']), + (0x2f8be, &['\u{22BF1}', '\u{FE00}']), + (0xf948, &['\u{8CC2}', '\u{FE00}']), + (0x2f80d, &['\u{2063A}', '\u{FE00}']), + (0x2f81f, &['\u{34DF}', '\u{FE00}']), + (0xf9e4, &['\u{7406}', '\u{FE00}']), + (0x2f823, &['\u{5277}', '\u{FE00}']), + (0x2f9fa, &['\u{97E0}', '\u{FE00}']), + (0x2f8fa, &['\u{6C4E}', '\u{FE00}']), + (0xfa6a, &['\u{983B}', '\u{FE00}']), + (0x2f9f0, &['\u{95B7}', '\u{FE00}']), + (0x2f967, &['\u{42A0}', '\u{FE00}']), + (0xfa8f, &['\u{6452}', '\u{FE00}']), + (0xfa06, &['\u{66B4}', '\u{FE00}']), + (0xf982, &['\u{5EEC}', '\u{FE00}']), + (0xf989, &['\u{9ECE}', '\u{FE00}']), + (0x2f990, &['\u{828B}', '\u{FE00}']), + (0xfac9, &['\u{97DB}', '\u{FE00}']), + (0x2f8ed, &['\u{6ADB}', '\u{FE00}']), + (0x2f822, &['\u{5272}', '\u{FE00}']), + (0xf9cb, &['\u{6E9C}', '\u{FE00}']), + (0xfa4d, &['\u{7949}', '\u{FE00}']), + (0x2f944, &['\u{25133}', '\u{FE00}']), + (0x2f9e8, &['\u{92D7}', '\u{FE00}']), + (0x2f8d2, &['\u{5192}', '\u{FE00}']), + (0x2f97c, &['\u{26523}', '\u{FE00}']), + (0xfa68, &['\u{96E3}', '\u{FE00}']), + (0xfa53, &['\u{798E}', '\u{FE00}']), + (0x2f8f5, &['\u{6BBA}', '\u{FE02}']), + (0x2f945, &['\u{771E}', '\u{FE00}']), + (0xfa95, &['\u{6B79}', '\u{FE00}']), + (0xfa2e, &['\u{90DE}', '\u{FE00}']), + (0xf91b, &['\u{4E82}', '\u{FE00}']), + (0x2f837, &['\u{53DF}', '\u{FE00}']), + (0x2f894, &['\u{5F22}', '\u{FE00}']), + (0x2fa09, &['\u{29B30}', '\u{FE00}']), + (0x2f974, &['\u{4359}', '\u{FE00}']), + (0xf9ba, &['\u{4E86}', '\u{FE00}']), + (0x2f80b, &['\u{50CF}', '\u{FE00}']), + (0xfaca, &['\u{97FF}', '\u{FE01}']), + (0x2f969, &['\u{7CE3}', '\u{FE00}']), + (0x2f8b1, &['\u{61F6}', '\u{FE01}']), + (0x2f8d1, &['\u{3AE4}', '\u{FE00}']), + (0x2f91d, &['\u{24263}', '\u{FE00}']), + (0x2f9d4, &['\u{8CAB}', '\u{FE00}']), + (0x2fa15, &['\u{9EBB}', '\u{FE00}']), + (0x2f954, &['\u{2569A}', '\u{FE00}']), + (0xfa81, &['\u{5B28}', '\u{FE00}']), + (0x2f9a5, &['\u{26D6B}', '\u{FE00}']), + (0x2f90f, &['\u{6F6E}', '\u{FE00}']), + (0xf92a, &['\u{6D6A}', '\u{FE00}']), + (0x2fa19, &['\u{9F05}', '\u{FE00}']), + (0x2f943, &['\u{25119}', '\u{FE00}']), + (0x2f947, &['\u{771F}', '\u{FE01}']), + (0x2fa0a, &['\u{9B12}', '\u{FE01}']), + (0x2f963, &['\u{7BC9}', '\u{FE00}']), + (0xf9bb, &['\u{50DA}', '\u{FE00}']), + (0x2f8ac, &['\u{61B2}', '\u{FE00}']), + (0xf9c5, &['\u{6688}', '\u{FE00}']), + (0x2f97e, &['\u{265A8}', '\u{FE00}']), + (0x2f889, &['\u{22183}', '\u{FE00}']), + (0x2f8e9, &['\u{69A3}', '\u{FE00}']), + (0xf9da, &['\u{6817}', '\u{FE00}']), + (0xface, &['\u{9F9C}', '\u{FE02}']), + (0x2f920, &['\u{7228}', '\u{FE00}']), + (0xf951, &['\u{964B}', '\u{FE00}']), + (0xf9bc, &['\u{5BEE}', '\u{FE00}']), + (0x2f940, &['\u{76F4}', '\u{FE01}']), + (0x2f84e, &['\u{5651}', '\u{FE00}']), + (0xfa48, &['\u{716E}', '\u{FE00}']), + (0x2fa08, &['\u{4BCE}', '\u{FE00}']), + (0xf9e6, &['\u{7F79}', '\u{FE00}']), + (0x2f8c8, &['\u{654F}', '\u{FE01}']), + (0xf912, &['\u{88F8}', '\u{FE00}']), + (0x2f8f7, &['\u{23A8D}', '\u{FE00}']), + (0x2f904, &['\u{6D78}', '\u{FE00}']), + (0xfa76, &['\u{52C7}', '\u{FE00}']), + (0x2f8e8, &['\u{6942}', '\u{FE00}']), + (0x2f9e2, &['\u{9094}', '\u{FE00}']), + (0xf903, &['\u{8CC8}', '\u{FE00}']), + (0xfa9a, &['\u{6F22}', '\u{FE01}']), + (0xf996, &['\u{7DF4}', '\u{FE00}']), + (0x2f8db, &['\u{675E}', '\u{FE00}']), + (0xfa4a, &['\u{7422}', '\u{FE00}']), + (0xfa6b, &['\u{6075}', '\u{FE00}']), + (0x2f8fd, &['\u{6CCD}', '\u{FE00}']), + (0xfa79, &['\u{5555}', '\u{FE00}']), + (0xf987, &['\u{9A6A}', '\u{FE00}']), + (0x2f8f2, &['\u{3C4E}', '\u{FE00}']), + (0xf90d, &['\u{61F6}', '\u{FE00}']), + (0xf922, &['\u{6FEB}', '\u{FE00}']), + (0xfa88, &['\u{6108}', '\u{FE00}']), + (0xf91c, &['\u{5375}', '\u{FE00}']), + (0x2f870, &['\u{5BF3}', '\u{FE00}']), + (0x2f9ac, &['\u{8564}', '\u{FE00}']), + (0x2f839, &['\u{53EB}', '\u{FE00}']), + (0x2fa03, &['\u{4B33}', '\u{FE00}']), + (0x2f854, &['\u{580D}', '\u{FE00}']), + (0x2f92a, &['\u{3EAC}', '\u{FE00}']), + (0xfa35, &['\u{5351}', '\u{FE00}']), + (0x2f9e7, &['\u{9238}', '\u{FE00}']), + (0x2f9a6, &['\u{26CD5}', '\u{FE00}']), + (0xfaaf, &['\u{7D5B}', '\u{FE00}']), + (0x2f911, &['\u{23F8E}', '\u{FE00}']), + (0x2f95d, &['\u{25AA7}', '\u{FE00}']), + (0x2f89c, &['\u{5F9A}', '\u{FE00}']), + (0xfa45, &['\u{6D77}', '\u{FE00}']), + (0xfa1b, &['\u{798F}', '\u{FE00}']), + (0xfa3d, &['\u{6094}', '\u{FE00}']), + (0xf980, &['\u{5442}', '\u{FE00}']), + (0xfa8c, &['\u{6234}', '\u{FE00}']), + (0x2f9e9, &['\u{92D8}', '\u{FE00}']), + (0x2f9f8, &['\u{4A6E}', '\u{FE00}']), + (0x2f902, &['\u{6D41}', '\u{FE02}']), + (0x2fa1d, &['\u{2A600}', '\u{FE00}']), + (0xfab6, &['\u{8941}', '\u{FE00}']), + (0xf995, &['\u{79CA}', '\u{FE00}']), + (0x2f832, &['\u{537F}', '\u{FE01}']), + (0x2f955, &['\u{256C5}', '\u{FE00}']), + (0x2f8fc, &['\u{6CBF}', '\u{FE00}']), + (0x2f875, &['\u{5C22}', '\u{FE00}']), + (0x2f82a, &['\u{5306}', '\u{FE00}']), + (0x2f811, &['\u{5177}', '\u{FE00}']), + (0x2f868, &['\u{36FC}', '\u{FE00}']), + (0x2f925, &['\u{7295}', '\u{FE00}']), + (0xfa20, &['\u{8612}', '\u{FE00}']), + (0x2f83e, &['\u{5448}', '\u{FE00}']), + (0xf9af, &['\u{7F9A}', '\u{FE00}']), + (0x2f997, &['\u{26B3C}', '\u{FE00}']), + (0x2f9ec, &['\u{9415}', '\u{FE00}']), + (0xf9ab, &['\u{5DBA}', '\u{FE00}']), + (0xf935, &['\u{8606}', '\u{FE00}']), + (0xfa80, &['\u{5A62}', '\u{FE00}']), + (0x2f95c, &['\u{2597C}', '\u{FE00}']), + (0xfa92, &['\u{6717}', '\u{FE01}']), + (0xf95b, &['\u{62CF}', '\u{FE00}']), + (0xf93e, &['\u{83C9}', '\u{FE00}']), + (0xf9de, &['\u{540F}', '\u{FE00}']), + (0xf9f0, &['\u{85FA}', '\u{FE00}']), + (0x2f847, &['\u{5599}', '\u{FE01}']), + (0xfa98, &['\u{6EDB}', '\u{FE00}']), + (0xf90e, &['\u{7669}', '\u{FE00}']), + (0xfa4f, &['\u{7950}', '\u{FE00}']), + (0xfaa4, &['\u{761D}', '\u{FE00}']), + (0x2f9c0, &['\u{87E1}', '\u{FE00}']), + (0x2f8bf, &['\u{6422}', '\u{FE00}']), + (0xfa62, &['\u{8B01}', '\u{FE00}']), + (0xf9b6, &['\u{79AE}', '\u{FE00}']), + (0x2f826, &['\u{52C9}', '\u{FE01}']), + (0xf9c9, &['\u{67F3}', '\u{FE00}']), + (0x2f992, &['\u{52B3}', '\u{FE00}']), + (0x2f8e1, &['\u{6852}', '\u{FE00}']), + (0xf959, &['\u{9675}', '\u{FE00}']), + (0x2f892, &['\u{22331}', '\u{FE01}']), + (0xfa18, &['\u{793C}', '\u{FE00}']), + (0x2f87d, &['\u{21DE6}', '\u{FE00}']), + (0xf970, &['\u{6BBA}', '\u{FE00}']), + (0x2f92b, &['\u{73A5}', '\u{FE00}']), + (0x2fa04, &['\u{9929}', '\u{FE00}']), + (0xfa89, &['\u{618E}', '\u{FE01}']), + (0x2f9e3, &['\u{90F1}', '\u{FE00}']), + (0x2f9c2, &['\u{45F9}', '\u{FE00}']), + (0xfacb, &['\u{980B}', '\u{FE00}']), + (0x2f9c8, &['\u{4635}', '\u{FE00}']), + (0x2f908, &['\u{6E2F}', '\u{FE00}']), + (0x2f86f, &['\u{5BE7}', '\u{FE02}']), + (0x2f98a, &['\u{2339C}', '\u{FE00}']), + (0xf9a8, &['\u{4EE4}', '\u{FE00}']), + (0x2f8c7, &['\u{3A6C}', '\u{FE00}']), + (0x2fa16, &['\u{4D56}', '\u{FE00}']), + (0xfa4b, &['\u{7891}', '\u{FE00}']), + (0x2f878, &['\u{5C6E}', '\u{FE01}']), + (0x2f8bb, &['\u{6368}', '\u{FE00}']), + (0x2f816, &['\u{2054B}', '\u{FE00}']), + (0x2f86a, &['\u{5B3E}', '\u{FE00}']), + (0xf9c3, &['\u{907C}', '\u{FE00}']), + (0xf945, &['\u{807E}', '\u{FE00}']), + (0x2f9fe, &['\u{980B}', '\u{FE01}']), + (0xfa86, &['\u{60D8}', '\u{FE00}']), + (0x2f82c, &['\u{5349}', '\u{FE00}']), + (0xf988, &['\u{9E97}', '\u{FE00}']), + (0xfac5, &['\u{9276}', '\u{FE00}']), + (0xfa66, &['\u{8FB6}', '\u{FE00}']), + (0x2f840, &['\u{54A2}', '\u{FE00}']), + (0xf9ee, &['\u{71D0}', '\u{FE00}']), + (0x2f830, &['\u{537D}', '\u{FE00}']), + (0x2f914, &['\u{701E}', '\u{FE01}']), + (0x2f942, &['\u{250F2}', '\u{FE00}']), + (0xfaa3, &['\u{753B}', '\u{FE00}']), + (0xf974, &['\u{82E5}', '\u{FE00}']), + (0x2f807, &['\u{5002}', '\u{FE00}']), + (0x2f905, &['\u{6D85}', '\u{FE00}']), + (0x2f9b2, &['\u{456B}', '\u{FE00}']), + (0x2f887, &['\u{5E69}', '\u{FE00}']), + (0x2f912, &['\u{6FC6}', '\u{FE00}']), + (0xf9ae, &['\u{7469}', '\u{FE00}']), + (0xf96a, &['\u{7D22}', '\u{FE00}']), + (0xf9b7, &['\u{91B4}', '\u{FE00}']), + (0x2f932, &['\u{74CA}', '\u{FE00}']), + (0x2f98d, &['\u{8F9E}', '\u{FE00}']), + (0xfa25, &['\u{9038}', '\u{FE00}']), + (0xf993, &['\u{7149}', '\u{FE00}']), + (0x2f9f5, &['\u{9723}', '\u{FE00}']), + (0xf9df, &['\u{5C65}', '\u{FE00}']), + (0x2f9c7, &['\u{88DE}', '\u{FE00}']), + (0x2f996, &['\u{82E6}', '\u{FE00}']), + (0x2f842, &['\u{5510}', '\u{FE00}']), + (0x2f869, &['\u{5B08}', '\u{FE00}']), + (0x2f861, &['\u{216EA}', '\u{FE00}']), + (0x2f8af, &['\u{61DE}', '\u{FE00}']), + (0x2f8c5, &['\u{649D}', '\u{FE00}']), + (0x2f962, &['\u{7BC6}', '\u{FE00}']), + (0x2f98b, &['\u{8201}', '\u{FE01}']), + (0x2f9a1, &['\u{83CA}', '\u{FE00}']), + (0xfad2, &['\u{3B9D}', '\u{FE00}']), + (0x2f9ae, &['\u{455D}', '\u{FE00}']), + (0x2f8bc, &['\u{6383}', '\u{FE00}']), + (0xf9b3, &['\u{9748}', '\u{FE00}']), + (0x2f88f, &['\u{2A392}', '\u{FE00}']), + (0xf965, &['\u{4FBF}', '\u{FE00}']), + (0x2f953, &['\u{7956}', '\u{FE01}']), + (0x2f84b, &['\u{5716}', '\u{FE00}']), + (0x2f90b, &['\u{6ECB}', '\u{FE01}']), + (0x2f834, &['\u{20A2C}', '\u{FE00}']), + (0xfa2d, &['\u{9DB4}', '\u{FE00}']), + (0x2f8e6, &['\u{6914}', '\u{FE00}']), + (0xf971, &['\u{8FB0}', '\u{FE00}']), + (0x2fa1c, &['\u{9F3B}', '\u{FE00}']), + (0xfa61, &['\u{8996}', '\u{FE00}']), + (0x2f98e, &['\u{446B}', '\u{FE00}']), + (0x2f9c9, &['\u{88FA}', '\u{FE00}']), + (0xfa0b, &['\u{5ED3}', '\u{FE00}']), + (0x2f86b, &['\u{5B3E}', '\u{FE01}']), + (0xf949, &['\u{96F7}', '\u{FE00}']), + (0xfac7, &['\u{96E3}', '\u{FE01}']), + (0xf96e, &['\u{8449}', '\u{FE00}']), + (0xf966, &['\u{5FA9}', '\u{FE00}']), + (0xf955, &['\u{51CC}', '\u{FE00}']), + (0x2f8d0, &['\u{3B08}', '\u{FE00}']), + (0x2f93a, &['\u{7610}', '\u{FE00}']), + (0xf9ff, &['\u{523A}', '\u{FE00}']), + (0xfac8, &['\u{9756}', '\u{FE01}']), + (0xf93c, &['\u{797F}', '\u{FE00}']), + (0x2f845, &['\u{5584}', '\u{FE00}']), + (0x2f9ce, &['\u{46C7}', '\u{FE00}']), + (0xfad6, &['\u{25CD0}', '\u{FE00}']), + (0x2f95a, &['\u{7A4A}', '\u{FE00}']), + (0xf9e9, &['\u{91CC}', '\u{FE00}']), + (0x2f91f, &['\u{243AB}', '\u{FE00}']), + (0xf950, &['\u{7E37}', '\u{FE00}']), + (0x2f8c1, &['\u{63A9}', '\u{FE00}']), + (0x2f9ad, &['\u{26F2C}', '\u{FE00}']), + (0x2f97f, &['\u{8070}', '\u{FE00}']), + (0xfa83, &['\u{5ED9}', '\u{FE00}']), + (0x2f82d, &['\u{5351}', '\u{FE01}']), + (0x2f8df, &['\u{67FA}', '\u{FE00}']), + (0x2f87c, &['\u{5D43}', '\u{FE00}']), + (0xfa58, &['\u{7E09}', '\u{FE00}']), + (0x2f846, &['\u{5584}', '\u{FE01}']), + (0xfa37, &['\u{5606}', '\u{FE00}']), + (0xfa78, &['\u{559D}', '\u{FE01}']), + (0x2f9f6, &['\u{29145}', '\u{FE00}']), + (0x2f99e, &['\u{83E7}', '\u{FE00}']), + (0xfad3, &['\u{4018}', '\u{FE00}']), + (0xfad0, &['\u{22844}', '\u{FE00}']), + (0xf9d5, &['\u{5D19}', '\u{FE00}']), + (0xfab7, &['\u{8986}', '\u{FE00}']), + (0xfa09, &['\u{964D}', '\u{FE00}']), + (0x2f8ce, &['\u{3B19}', '\u{FE00}']), + (0xf957, &['\u{7DBE}', '\u{FE00}']), + (0xf991, &['\u{649A}', '\u{FE00}']), + (0xfab8, &['\u{8996}', '\u{FE01}']), + (0x2f8eb, &['\u{6AA8}', '\u{FE00}']), + (0x2f9b1, &['\u{270D2}', '\u{FE00}']), + (0xfa2a, &['\u{98EF}', '\u{FE00}']), + (0x2f93c, &['\u{24FB8}', '\u{FE00}']), + (0xfa72, &['\u{5168}', '\u{FE00}']), + (0x2f96f, &['\u{7E02}', '\u{FE00}']), + (0x2f8d6, &['\u{80AD}', '\u{FE00}']), + (0x2f886, &['\u{5E3D}', '\u{FE00}']), + (0xf9fd, &['\u{4EC0}', '\u{FE00}']), + (0xf9c0, &['\u{71CE}', '\u{FE00}']), + (0x2f9be, &['\u{8786}', '\u{FE00}']), + (0xf9b8, &['\u{96B8}', '\u{FE00}']), + (0x2f81e, &['\u{5203}', '\u{FE00}']), + (0xf900, &['\u{8C48}', '\u{FE00}']), + (0x2f98c, &['\u{8204}', '\u{FE00}']), + (0x2f93e, &['\u{3FFC}', '\u{FE00}']), + (0xfaa0, &['\u{732A}', '\u{FE01}']), + (0x2f8f3, &['\u{6B72}', '\u{FE00}']), + (0xf961, &['\u{7387}', '\u{FE00}']), + (0x2f83d, &['\u{5438}', '\u{FE00}']), + (0x2f8f6, &['\u{6BBB}', '\u{FE00}']), + (0xf9d2, &['\u{622E}', '\u{FE00}']), + (0x2f84a, &['\u{55C2}', '\u{FE00}']), + (0xf9e1, &['\u{674E}', '\u{FE00}']), + (0xfa7c, &['\u{585A}', '\u{FE01}']), + (0x2f9aa, &['\u{8516}', '\u{FE00}']), + (0xfa51, &['\u{795D}', '\u{FE00}']), + (0x2f8b8, &['\u{22B0C}', '\u{FE00}']), + (0x2f931, &['\u{7485}', '\u{FE00}']), + (0xfa7e, &['\u{5944}', '\u{FE00}']), + (0xf9a6, &['\u{7C3E}', '\u{FE00}']), + (0xf976, &['\u{7565}', '\u{FE00}']), + (0xfa97, &['\u{6D41}', '\u{FE01}']), + (0x2f8e7, &['\u{3B9D}', '\u{FE01}']), + (0x2f88b, &['\u{5EB0}', '\u{FE00}']), + (0x2f9c6, &['\u{88D7}', '\u{FE00}']), + (0x2f8d9, &['\u{671B}', '\u{FE01}']), + (0xfa52, &['\u{798D}', '\u{FE00}']), + (0x2fa0d, &['\u{4CCE}', '\u{FE00}']), + (0x2f900, &['\u{6D3E}', '\u{FE00}']), + (0x2f836, &['\u{53CA}', '\u{FE00}']), + (0xf9ad, &['\u{73B2}', '\u{FE00}']), + (0xf934, &['\u{8001}', '\u{FE00}']), + (0xfab0, &['\u{7DF4}', '\u{FE02}']), + (0x2f809, &['\u{5099}', '\u{FE00}']), + (0x2f9f2, &['\u{49E6}', '\u{FE00}']), + (0x2f86c, &['\u{219C8}', '\u{FE00}']), + (0xf9fc, &['\u{8B58}', '\u{FE00}']), + (0x2f95e, &['\u{25AA7}', '\u{FE01}']), + (0xf9a3, &['\u{5FF5}', '\u{FE00}']), + (0x2f971, &['\u{4334}', '\u{FE00}']), + (0x2f89b, &['\u{38E3}', '\u{FE00}']), + (0xf977, &['\u{4EAE}', '\u{FE00}']), + (0xfa1a, &['\u{7965}', '\u{FE00}']), + (0xfa3c, &['\u{5C6E}', '\u{FE00}']), + (0x2f9bd, &['\u{876B}', '\u{FE00}']), + (0xf928, &['\u{5ECA}', '\u{FE00}']), + (0x2f864, &['\u{5A27}', '\u{FE00}']), + (0x2f9d1, &['\u{8B8A}', '\u{FE01}']), + (0x2f982, &['\u{80B2}', '\u{FE00}']), + (0xf9dc, &['\u{9686}', '\u{FE00}']), + (0x2f972, &['\u{26228}', '\u{FE00}']), + (0x2f8cb, &['\u{65E3}', '\u{FE00}']), + (0xf960, &['\u{6012}', '\u{FE00}']), + (0xf992, &['\u{6F23}', '\u{FE00}']), + (0x2f8b4, &['\u{625D}', '\u{FE00}']), + (0x2f803, &['\u{20122}', '\u{FE00}']), + (0x2f818, &['\u{51A4}', '\u{FE00}']), + (0xf9f7, &['\u{7ACB}', '\u{FE00}']), + (0x2f827, &['\u{52E4}', '\u{FE01}']), + (0x2f9fb, &['\u{2940A}', '\u{FE00}']), + (0x2f987, &['\u{267A7}', '\u{FE00}']), + (0xfaab, &['\u{78CC}', '\u{FE00}']), + (0xfa39, &['\u{5840}', '\u{FE00}']), + (0x2fa07, &['\u{99FE}', '\u{FE00}']), + (0xf9b9, &['\u{60E1}', '\u{FE00}']), + (0x2f86e, &['\u{5BD8}', '\u{FE00}']), + (0x2f8e0, &['\u{6785}', '\u{FE00}']), + (0xfaa7, &['\u{76DB}', '\u{FE00}']), + (0x2f8a8, &['\u{614E}', '\u{FE01}']), + (0xfa0a, &['\u{898B}', '\u{FE00}']), + (0x2fa14, &['\u{2A291}', '\u{FE00}']), + (0x2f888, &['\u{3862}', '\u{FE00}']), + (0x2f9a2, &['\u{83CC}', '\u{FE00}']), + (0x2f848, &['\u{55AB}', '\u{FE00}']), + (0xfaa8, &['\u{76F4}', '\u{FE00}']), + (0xfa67, &['\u{9038}', '\u{FE01}']), + (0xf946, &['\u{7262}', '\u{FE00}']), + (0x2f946, &['\u{771F}', '\u{FE00}']), + (0xfa7d, &['\u{58B3}', '\u{FE00}']), + (0xfa1d, &['\u{7CBE}', '\u{FE00}']), + (0x2fa11, &['\u{4CF8}', '\u{FE00}']), + (0xfa2c, &['\u{9928}', '\u{FE00}']), + (0xf924, &['\u{8964}', '\u{FE00}']), + (0x2f96e, &['\u{7DC7}', '\u{FE00}']), + (0xf96d, &['\u{7701}', '\u{FE00}']), + (0xf95a, &['\u{8B80}', '\u{FE00}']), + (0x2f85c, &['\u{5906}', '\u{FE00}']), + (0xf92b, &['\u{72FC}', '\u{FE00}']), + (0xfac0, &['\u{8B8A}', '\u{FE00}']), + (0xfa8d, &['\u{63C4}', '\u{FE00}']), + (0x2f9d8, &['\u{27F2F}', '\u{FE00}']), + (0xf938, &['\u{9732}', '\u{FE00}']), + (0x2f821, &['\u{5246}', '\u{FE00}']), + (0xf9aa, &['\u{5BE7}', '\u{FE01}']), + (0xf9ce, &['\u{786B}', '\u{FE00}']), + (0xfa47, &['\u{6F22}', '\u{FE00}']), + (0x2f8aa, &['\u{617A}', '\u{FE00}']), + (0x2f918, &['\u{707D}', '\u{FE00}']), + (0x2f8ee, &['\u{3C18}', '\u{FE00}']), + (0xf96b, &['\u{53C3}', '\u{FE00}']), + (0xf909, &['\u{5951}', '\u{FE00}']), + (0x2f87f, &['\u{5D6B}', '\u{FE00}']), + (0xf908, &['\u{9F9C}', '\u{FE01}']), + (0xfa5d, &['\u{8279}', '\u{FE00}']), + (0xf9ac, &['\u{601C}', '\u{FE00}']), + (0x2f896, &['\u{38C7}', '\u{FE00}']), + (0x2f9b0, &['\u{26FB1}', '\u{FE00}']), + (0xf9a7, &['\u{7375}', '\u{FE00}']), + (0xf99d, &['\u{52A3}', '\u{FE00}']), + (0x2f957, &['\u{79EB}', '\u{FE00}']), + (0xf905, &['\u{4E32}', '\u{FE00}']), + (0x2f9bc, &['\u{8728}', '\u{FE00}']), + (0x2f8f9, &['\u{23AFA}', '\u{FE00}']), + (0x2f8b0, &['\u{61F2}', '\u{FE02}']), + (0x2f881, &['\u{5DE1}', '\u{FE00}']), + (0x2fa1b, &['\u{9F16}', '\u{FE00}']), + (0x2f9dd, &['\u{208DE}', '\u{FE00}']), + (0x2f9ed, &['\u{28BFA}', '\u{FE00}']), + (0x2f871, &['\u{21B18}', '\u{FE00}']), + (0x2f8ab, &['\u{618E}', '\u{FE02}']), + (0x2f812, &['\u{2051C}', '\u{FE00}']), + (0xf933, &['\u{76E7}', '\u{FE00}']), + (0xf9f2, &['\u{9C57}', '\u{FE00}']), + (0xf984, &['\u{6FFE}', '\u{FE00}']), + (0x2f90e, &['\u{6DF9}', '\u{FE00}']), + (0xfab2, &['\u{8005}', '\u{FE01}']), + (0xfa32, &['\u{514D}', '\u{FE00}']), + (0x2f96d, &['\u{4301}', '\u{FE00}']), + (0x2f9a7, &['\u{452B}', '\u{FE00}']), + (0xf94f, &['\u{7D2F}', '\u{FE00}']), + (0x2fa0f, &['\u{9D67}', '\u{FE00}']), + (0xf925, &['\u{62C9}', '\u{FE00}']), + (0xfa91, &['\u{6674}', '\u{FE01}']), + (0xf972, &['\u{6C88}', '\u{FE00}']), + (0xf90a, &['\u{91D1}', '\u{FE00}']), + (0xfa02, &['\u{62D3}', '\u{FE00}']), + (0xf92f, &['\u{52DE}', '\u{FE00}']), + (0xf9dd, &['\u{5229}', '\u{FE00}']), + (0xfa17, &['\u{76CA}', '\u{FE00}']), + (0xf93f, &['\u{9304}', '\u{FE00}']), + (0x2f898, &['\u{261DA}', '\u{FE00}']), + (0x2f907, &['\u{6D34}', '\u{FE00}']), + (0xf9ec, &['\u{6EBA}', '\u{FE00}']), + (0xf9e3, &['\u{6CE5}', '\u{FE00}']), + (0xfab5, &['\u{8779}', '\u{FE00}']), + (0xfa40, &['\u{61F2}', '\u{FE00}']), + (0x2f815, &['\u{518D}', '\u{FE00}']), + (0x2f9db, &['\u{8DBC}', '\u{FE00}']), + (0xf91e, &['\u{721B}', '\u{FE00}']), + (0xf92c, &['\u{90CE}', '\u{FE00}']), + (0x2f884, &['\u{5DFD}', '\u{FE00}']), + (0xfa46, &['\u{6E1A}', '\u{FE00}']), + (0x2f9b3, &['\u{8650}', '\u{FE00}']), + (0x2f85b, &['\u{58F7}', '\u{FE00}']), + (0xf9cd, &['\u{7559}', '\u{FE00}']), + (0xf93a, &['\u{9DFA}', '\u{FE00}']), + (0xf97e, &['\u{91CF}', '\u{FE00}']), + (0xfa3e, &['\u{6168}', '\u{FE00}']), + (0x2f9eb, &['\u{93F9}', '\u{FE00}']), + (0x2f8e2, &['\u{6885}', '\u{FE01}']), + (0x2f9b6, &['\u{8669}', '\u{FE00}']), + (0xf916, &['\u{70D9}', '\u{FE00}']), + (0x2f8de, &['\u{3B49}', '\u{FE00}']), + (0xf98f, &['\u{6190}', '\u{FE00}']), + (0xfa12, &['\u{6674}', '\u{FE00}']), + (0xfa44, &['\u{6885}', '\u{FE00}']), + (0xf981, &['\u{5973}', '\u{FE00}']), + (0x2f9dc, &['\u{8DF0}', '\u{FE00}']), + (0xf95c, &['\u{6A02}', '\u{FE01}']), + (0xf937, &['\u{8DEF}', '\u{FE00}']), + (0x2f87a, &['\u{5C8D}', '\u{FE00}']), + (0x2f903, &['\u{6D69}', '\u{FE00}']), + (0x2f9c5, &['\u{27667}', '\u{FE00}']), + (0x2f8cf, &['\u{6691}', '\u{FE01}']), + (0x2f909, &['\u{6E6E}', '\u{FE00}']), + (0x2f991, &['\u{829D}', '\u{FE00}']), + (0xfa65, &['\u{8D08}', '\u{FE00}']), + (0xfa73, &['\u{4F80}', '\u{FE00}']), + (0x2f88e, &['\u{5ECA}', '\u{FE01}']), + (0xf9ef, &['\u{7498}', '\u{FE00}']), + (0x2f9cb, &['\u{278AE}', '\u{FE00}']), + (0x2f9a3, &['\u{83DC}', '\u{FE00}']), + (0x2f99c, &['\u{8323}', '\u{FE00}']), + (0x2f919, &['\u{7077}', '\u{FE00}']), + (0x2f857, &['\u{5831}', '\u{FE00}']), + (0x2f96c, &['\u{7D63}', '\u{FE00}']), + (0x2f800, &['\u{4E3D}', '\u{FE00}']), + (0x2fa1a, &['\u{9F0F}', '\u{FE00}']), + (0xf97f, &['\u{52F5}', '\u{FE00}']), + (0xfaba, &['\u{8AF8}', '\u{FE01}']), + (0xfa82, &['\u{5ED2}', '\u{FE00}']), + (0x2f92e, &['\u{7447}', '\u{FE00}']), + (0xf9fe, &['\u{8336}', '\u{FE00}']), + (0xf994, &['\u{7489}', '\u{FE00}']), + (0x2f83c, &['\u{549E}', '\u{FE00}']), + (0xfa50, &['\u{7956}', '\u{FE00}']), + (0x2f817, &['\u{5197}', '\u{FE00}']), + (0xfa38, &['\u{5668}', '\u{FE00}']), + (0xfa69, &['\u{97FF}', '\u{FE00}']), + (0xfaac, &['\u{7AB1}', '\u{FE00}']), + (0xf901, &['\u{66F4}', '\u{FE00}']), + (0xfa33, &['\u{52C9}', '\u{FE00}']), + (0xf9bf, &['\u{6A02}', '\u{FE02}']), + (0xf9d1, &['\u{516D}', '\u{FE00}']), + (0xf95f, &['\u{5BE7}', '\u{FE00}']), + (0x2f82f, &['\u{5373}', '\u{FE00}']), + (0xf9a4, &['\u{637B}', '\u{FE00}']), + (0x2f89e, &['\u{5FD7}', '\u{FE00}']), + (0x2f801, &['\u{4E38}', '\u{FE00}']), + (0x2f84f, &['\u{5674}', '\u{FE00}']), + (0x2f961, &['\u{25BAB}', '\u{FE00}']), + (0x2f87e, &['\u{5D6E}', '\u{FE00}']), + (0x2f9d5, &['\u{8CC1}', '\u{FE00}']), + (0xf9e7, &['\u{88CF}', '\u{FE00}']), + (0xf973, &['\u{62FE}', '\u{FE00}']), + (0xf9c2, &['\u{84FC}', '\u{FE00}']), + (0x2f9d0, &['\u{8AED}', '\u{FE01}']), + (0xf9a5, &['\u{6BAE}', '\u{FE00}']), + (0x2f80c, &['\u{349E}', '\u{FE00}']), + (0xf930, &['\u{64C4}', '\u{FE00}']), + (0x2f8a1, &['\u{393A}', '\u{FE00}']), + (0x2f828, &['\u{52FA}', '\u{FE01}']), + (0x2f89f, &['\u{5FF9}', '\u{FE00}']), + (0xf964, &['\u{78FB}', '\u{FE00}']), + (0xf94e, &['\u{6F0F}', '\u{FE00}']), + (0x2f8d7, &['\u{43D9}', '\u{FE00}']), + (0x2f806, &['\u{4FBB}', '\u{FE00}']), + (0x2f9cc, &['\u{27966}', '\u{FE00}']), + (0x2f94e, &['\u{784E}', '\u{FE00}']), + (0x2f929, &['\u{738B}', '\u{FE00}']), + (0xfa34, &['\u{52E4}', '\u{FE00}']), + (0x2f939, &['\u{2219F}', '\u{FE00}']), + (0xf910, &['\u{863F}', '\u{FE00}']), + (0xf926, &['\u{81D8}', '\u{FE00}']), + (0xf9a2, &['\u{5EC9}', '\u{FE00}']), + (0xfa49, &['\u{722B}', '\u{FE00}']), + (0xf953, &['\u{808B}', '\u{FE00}']), + (0x2f80f, &['\u{5154}', '\u{FE00}']), + (0xf963, &['\u{5317}', '\u{FE00}']), + (0x2f8d4, &['\u{6700}', '\u{FE00}']), + (0xf9b2, &['\u{96F6}', '\u{FE00}']), + (0x2f973, &['\u{26247}', '\u{FE00}']), + (0x2f897, &['\u{232B8}', '\u{FE00}']), + (0x2f9fc, &['\u{4AB2}', '\u{FE00}']), + (0xf99a, &['\u{9023}', '\u{FE00}']), + (0x2f85a, &['\u{58F2}', '\u{FE00}']), + (0xfacf, &['\u{2284A}', '\u{FE00}']), + (0x2f9ab, &['\u{273CA}', '\u{FE00}']), + (0x2f927, &['\u{24814}', '\u{FE00}']), + (0x2f9fd, &['\u{29496}', '\u{FE00}']), + (0xfa36, &['\u{559D}', '\u{FE00}']), + (0xf904, &['\u{6ED1}', '\u{FE00}']), + (0x2f81c, &['\u{291DF}', '\u{FE00}']), + (0xfa7b, &['\u{55E2}', '\u{FE00}']), + (0xfa41, &['\u{654F}', '\u{FE00}']), + (0x2f87b, &['\u{21DE4}', '\u{FE00}']), + (0x2f9ba, &['\u{86E2}', '\u{FE00}']), + (0xf979, &['\u{51C9}', '\u{FE00}']), + (0xf9d7, &['\u{8F2A}', '\u{FE00}']), +]; + pub(crate) const COMBINING_MARK_SALT: &[u16] = &[ 0x0, 0x10, diff --git a/vendor/unified-diff/.cargo-checksum.json b/vendor/unified-diff/.cargo-checksum.json new file mode 100644 index 0000000000..f05cedbd20 --- /dev/null +++ b/vendor/unified-diff/.cargo-checksum.json @@ -0,0 +1 @@ +{"files":{"Cargo.lock":"9b2054193327a3fe1b5c1f415e79724b986049b91e47ea65076c82a739f25661","Cargo.toml":"bb089781e8727948b88b3605033fd7803b2285fb2ad4d50c00396f4ccc34ecb0","LICENSE-APACHE":"62c7a1e35f56406896d7aa7ca52d0cc0d272ac022b5d2796e7d6905db8a3636a","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","README.md":"e17f411d50ca5c7b920da38366b407c25f76b723598c87501723444a0799ecf8","src/lib.rs":"165ea387f42d59fd98f4fc48b07b09ddff0bd00426431827f5fbb18d94fecdfc","src/main.rs":"7be0771064cce707d6e071f8613cded6cb310e1849c1a86918ff9aa7d515c5b6"},"package":"496a3d395ed0c30f411ceace4a91f7d93b148fb5a9b383d5d4cff7850f048d5f"} \ No newline at end of file diff --git a/vendor/unified-diff/Cargo.lock b/vendor/unified-diff/Cargo.lock new file mode 100644 index 0000000000..a8e784589f --- /dev/null +++ b/vendor/unified-diff/Cargo.lock @@ -0,0 +1,16 @@ +# This file is automatically @generated by Cargo. +# It is not intended for manual editing. +version = 3 + +[[package]] +name = "diff" +version = "0.1.12" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" + +[[package]] +name = "unified-diff" +version = "0.2.1" +dependencies = [ + "diff", +] diff --git a/vendor/unified-diff/Cargo.toml b/vendor/unified-diff/Cargo.toml new file mode 100644 index 0000000000..fe895fb303 --- /dev/null +++ b/vendor/unified-diff/Cargo.toml @@ -0,0 +1,26 @@ +# 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 = "unified-diff" +version = "0.2.1" +authors = ["Michael Howell ", "The Rust Project Developers"] +exclude = ["fuzz"] +description = "An implementation of the GNU unified diff format" +license = "MIT OR Apache-2.0" +repository = "https://github.com/notriddle/rust-unified-diff" + +[[bin]] +name = "unified-diff" +[dependencies.diff] +version = "0.1.10" diff --git a/vendor/unified-diff/LICENSE-APACHE b/vendor/unified-diff/LICENSE-APACHE new file mode 100644 index 0000000000..1b5ec8b78e --- /dev/null +++ b/vendor/unified-diff/LICENSE-APACHE @@ -0,0 +1,176 @@ + 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 diff --git a/vendor/crossbeam-queue-0.1.2/LICENSE-MIT b/vendor/unified-diff/LICENSE-MIT similarity index 100% rename from vendor/crossbeam-queue-0.1.2/LICENSE-MIT rename to vendor/unified-diff/LICENSE-MIT diff --git a/vendor/unified-diff/README.md b/vendor/unified-diff/README.md new file mode 100644 index 0000000000..103c010538 --- /dev/null +++ b/vendor/unified-diff/README.md @@ -0,0 +1,41 @@ +A GNU unified diff generator. Oracle tested against GNU patch 2.7.6 + +Based on the incomplete diff generator in https://github.com/rust-lang/rust/blob/master/src/tools/compiletest/src/runtest.rs, +but it implements a different format. + +``` +~/unified-diff$ cargo run Cargo.lock Cargo.toml + Finished dev [unoptimized + debuginfo] target(s) in 0.00s + Running `target/debug/unified-diff Cargo.lock Cargo.toml` +--- Cargo.lock ++++ Cargo.toml +@@ -1,14 +1,14 @@ +-# This file is automatically @generated by Cargo. +-# It is not intended for manual editing. +-[[package]] +-name = "diff" +-version = "0.1.12" +-source = "registry+https://github.com/rust-lang/crates.io-index" +-checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499" +- +-[[package]] ++[package] + name = "unified-diff" + version = "0.1.0" +-dependencies = [ +- "diff", ++authors = [ ++ "Michael Howell ", ++ "The Rust Project Developers" + ] ++edition = "2018" ++ ++[[bin]] ++name = "unified-diff" ++ ++[dependencies] ++diff = "0.1.10" +~/unified-diff$ rustup override set nightly +~/unified-diff$ cargo fuzz run fuzz_patch +``` + diff --git a/vendor/unified-diff/src/lib.rs b/vendor/unified-diff/src/lib.rs new file mode 100644 index 0000000000..2b756a4812 --- /dev/null +++ b/vendor/unified-diff/src/lib.rs @@ -0,0 +1,782 @@ +use std::collections::VecDeque; +use std::io::Write; + +#[derive(Debug, PartialEq)] +pub enum DiffLine { + Context(Vec), + Expected(Vec), + Actual(Vec), + MissingNL, +} + +#[derive(Debug, PartialEq)] +struct Mismatch { + pub line_number_expected: u32, + pub line_number_actual: u32, + pub lines: Vec, +} + +impl Mismatch { + fn new(line_number_expected: u32, line_number_actual: u32) -> Mismatch { + Mismatch { + line_number_expected, + line_number_actual, + lines: Vec::new(), + } + } +} + +// Produces a diff between the expected output and actual output. +fn make_diff(expected: &[u8], actual: &[u8], context_size: usize) -> Vec { + let mut line_number_expected = 1; + let mut line_number_actual = 1; + let mut context_queue: VecDeque<&[u8]> = VecDeque::with_capacity(context_size); + let mut lines_since_mismatch = context_size + 1; + let mut results = Vec::new(); + let mut mismatch = Mismatch::new(0, 0); + + let mut expected_lines: Vec<&[u8]> = expected.split(|&c| c == b'\n').collect(); + let mut actual_lines: Vec<&[u8]> = actual.split(|&c| c == b'\n').collect(); + + debug_assert_eq!(b"".split(|&c| c == b'\n').count(), 1); + // ^ means that underflow here is impossible + let expected_lines_count = expected_lines.len() as u32 - 1; + let actual_lines_count = actual_lines.len() as u32 - 1; + + if expected_lines.last() == Some(&&b""[..]) { + expected_lines.pop(); + } + + if actual_lines.last() == Some(&&b""[..]) { + actual_lines.pop(); + } + + for result in diff::slice(&expected_lines, &actual_lines) { + match result { + diff::Result::Left(str) => { + if lines_since_mismatch >= context_size && lines_since_mismatch > 0 { + results.push(mismatch); + mismatch = Mismatch::new( + line_number_expected - context_queue.len() as u32, + line_number_actual - context_queue.len() as u32, + ); + } + + while let Some(line) = context_queue.pop_front() { + mismatch.lines.push(DiffLine::Context(line.to_vec())); + } + + if mismatch.lines.last() == Some(&DiffLine::MissingNL) { + mismatch.lines.pop(); + match mismatch.lines.pop() { + Some(DiffLine::Actual(res)) => { + // We have to make sure that Actual (the + lines) + // always come after Expected (the - lines) + mismatch.lines.push(DiffLine::Expected(str.to_vec())); + if line_number_expected > expected_lines_count { + mismatch.lines.push(DiffLine::MissingNL) + } + mismatch.lines.push(DiffLine::Actual(res)); + mismatch.lines.push(DiffLine::MissingNL); + } + _ => unreachable!("unterminated Left and Common lines shouldn't be followed by more Left lines"), + } + } else { + mismatch.lines.push(DiffLine::Expected(str.to_vec())); + if line_number_expected > expected_lines_count { + mismatch.lines.push(DiffLine::MissingNL) + } + } + line_number_expected += 1; + lines_since_mismatch = 0; + } + diff::Result::Right(str) => { + if lines_since_mismatch >= context_size && lines_since_mismatch > 0 { + results.push(mismatch); + mismatch = Mismatch::new( + line_number_expected - context_queue.len() as u32, + line_number_actual - context_queue.len() as u32, + ); + } + + while let Some(line) = context_queue.pop_front() { + debug_assert!(mismatch.lines.last() != Some(&DiffLine::MissingNL)); + mismatch.lines.push(DiffLine::Context(line.to_vec())); + } + + mismatch.lines.push(DiffLine::Actual(str.to_vec())); + if line_number_actual > actual_lines_count { + mismatch.lines.push(DiffLine::MissingNL) + } + line_number_actual += 1; + lines_since_mismatch = 0; + } + diff::Result::Both(str, _) => { + // if one of them is missing a newline and the other isn't, then they don't actually match + if (line_number_actual > actual_lines_count) + && (line_number_expected > expected_lines_count) + { + if context_queue.len() < context_size { + while let Some(line) = context_queue.pop_front() { + debug_assert!(mismatch.lines.last() != Some(&DiffLine::MissingNL)); + mismatch.lines.push(DiffLine::Context(line.to_vec())); + } + if lines_since_mismatch < context_size { + mismatch.lines.push(DiffLine::Context(str.to_vec())); + mismatch.lines.push(DiffLine::MissingNL); + } + } + lines_since_mismatch = 0; + } else if line_number_actual > actual_lines_count { + if lines_since_mismatch >= context_size && lines_since_mismatch > 0 { + results.push(mismatch); + mismatch = Mismatch::new( + line_number_expected - context_queue.len() as u32, + line_number_actual - context_queue.len() as u32, + ); + } + while let Some(line) = context_queue.pop_front() { + debug_assert!(mismatch.lines.last() != Some(&DiffLine::MissingNL)); + mismatch.lines.push(DiffLine::Context(line.to_vec())); + } + mismatch.lines.push(DiffLine::Expected(str.to_vec())); + mismatch.lines.push(DiffLine::Actual(str.to_vec())); + mismatch.lines.push(DiffLine::MissingNL); + lines_since_mismatch = 0; + } else if line_number_expected > expected_lines_count { + if lines_since_mismatch >= context_size && lines_since_mismatch > 0 { + results.push(mismatch); + mismatch = Mismatch::new( + line_number_expected - context_queue.len() as u32, + line_number_actual - context_queue.len() as u32, + ); + } + while let Some(line) = context_queue.pop_front() { + debug_assert!(mismatch.lines.last() != Some(&DiffLine::MissingNL)); + mismatch.lines.push(DiffLine::Context(line.to_vec())); + } + mismatch.lines.push(DiffLine::Expected(str.to_vec())); + mismatch.lines.push(DiffLine::MissingNL); + mismatch.lines.push(DiffLine::Actual(str.to_vec())); + lines_since_mismatch = 0; + } else { + debug_assert!(context_queue.len() <= context_size); + if context_queue.len() >= context_size { + let _ = context_queue.pop_front(); + } + if lines_since_mismatch < context_size { + mismatch.lines.push(DiffLine::Context(str.to_vec())); + } else if context_size > 0 { + context_queue.push_back(str); + } + lines_since_mismatch += 1; + } + line_number_expected += 1; + line_number_actual += 1; + } + } + } + + results.push(mismatch); + results.remove(0); + + if results.len() == 0 && expected_lines_count != actual_lines_count { + let mut mismatch = Mismatch::new(expected_lines.len() as u32, actual_lines.len() as u32); + // empty diff and only expected lines has a missing line at end + if expected_lines_count != expected_lines.len() as u32 { + mismatch.lines.push(DiffLine::Expected( + expected_lines + .pop() + .expect("can't be empty; produced by split()") + .to_vec(), + )); + mismatch.lines.push(DiffLine::MissingNL); + mismatch.lines.push(DiffLine::Actual( + actual_lines + .pop() + .expect("can't be empty; produced by split()") + .to_vec(), + )); + results.push(mismatch); + } else if actual_lines_count != actual_lines.len() as u32 { + mismatch.lines.push(DiffLine::Expected( + expected_lines + .pop() + .expect("can't be empty; produced by split()") + .to_vec(), + )); + mismatch.lines.push(DiffLine::Actual( + actual_lines + .pop() + .expect("can't be empty; produced by split()") + .to_vec(), + )); + mismatch.lines.push(DiffLine::MissingNL); + results.push(mismatch); + } + } + + results +} + +pub fn diff( + expected: &[u8], + expected_filename: &str, + actual: &[u8], + actual_filename: &str, + context_size: usize, +) -> Vec { + let mut output = + format!("--- {}\t\n+++ {}\t\n", expected_filename, actual_filename).into_bytes(); + let diff_results = make_diff(expected, actual, context_size); + if diff_results.len() == 0 { + return Vec::new(); + }; + for result in diff_results { + let mut line_number_expected = result.line_number_expected; + let mut line_number_actual = result.line_number_actual; + let mut expected_count = 0; + let mut actual_count = 0; + for line in &result.lines { + match line { + DiffLine::Expected(_) => { + expected_count += 1; + } + DiffLine::Context(_) => { + expected_count += 1; + actual_count += 1; + } + DiffLine::Actual(_) => { + actual_count += 1; + } + DiffLine::MissingNL => {} + } + } + // Let's imagine this diff file + // + // --- a/something + // +++ b/something + // @@ -2,0 +3,1 @@ + // + x + // + // In the unified diff format as implemented by GNU diff and patch, + // this is an instruction to insert the x *after* the preexisting line 2, + // not before. You can demonstrate it this way: + // + // $ echo -ne '--- a/something\t\n+++ b/something\t\n@@ -2,0 +3,1 @@\n+ x\n' > diff + // $ echo -ne 'a\nb\nc\nd\n' > something + // $ patch -p1 < diff + // patching file something + // $ cat something + // a + // b + // x + // c + // d + // + // Notice how the x winds up at line 3, not line 2. This requires contortions to + // work with our diffing algorithm, which keeps track of the "intended destination line", + // not a line that things are supposed to be placed after. It's changing the first number, + // not the second, that actually affects where the x goes. + // + // # change the first number from 2 to 3, and now the x is on line 4 (it's placed after line 3) + // $ echo -ne '--- a/something\t\n+++ b/something\t\n@@ -3,0 +3,1 @@\n+ x\n' > diff + // $ echo -ne 'a\nb\nc\nd\n' > something + // $ patch -p1 < diff + // patching file something + // $ cat something + // a + // b + // c + // x + // d + // # change the third number from 3 to 1000, and it's obvious that it's the first number that's + // # actually being read + // $ echo -ne '--- a/something\t\n+++ b/something\t\n@@ -2,0 +1000,1 @@\n+ x\n' > diff + // $ echo -ne 'a\nb\nc\nd\n' > something + // $ patch -p1 < diff + // patching file something + // $ cat something + // a + // b + // x + // c + // d + // + // Now watch what happens if I add a context line: + // + // $ echo -ne '--- a/something\t\n+++ b/something\t\n@@ -2,1 +3,2 @@\n+ x\n c\n' > diff + // $ echo -ne 'a\nb\nc\nd\n' > something + // $ patch -p1 < diff + // patching file something + // Hunk #1 succeeded at 3 (offset 1 line). + // + // It technically "succeeded", but this is a warning. We want to produce clean diffs. + // Now that I have a context line, I'm supposed to say what line it's actually on, which is the + // line that the x will wind up on, and not the line immediately before. + // + // $ echo -ne '--- a/something\t\n+++ b/something\t\n@@ -3,1 +3,2 @@\n+ x\n c\n' > diff + // $ echo -ne 'a\nb\nc\nd\n' > something + // $ patch -p1 < diff + // patching file something + // $ cat something + // a + // b + // x + // c + // d + // + // I made this comment because this stuff is not obvious from GNU's + // documentation on the format at all. + if expected_count == 0 { + line_number_expected -= 1 + } + if actual_count == 0 { + line_number_actual -= 1 + } + let exp_ct = if expected_count == 1 { + String::new() + } else { + format!(",{}", expected_count) + }; + let act_ct = if actual_count == 1 { + String::new() + } else { + format!(",{}", actual_count) + }; + writeln!( + output, + "@@ -{}{} +{}{} @@", + line_number_expected, exp_ct, line_number_actual, act_ct + ) + .expect("write to Vec is infallible"); + for line in result.lines { + match line { + DiffLine::Expected(e) => { + write!(output, "-").expect("write to Vec is infallible"); + output.write_all(&e).expect("write to Vec is infallible"); + writeln!(output).unwrap(); + } + DiffLine::Context(c) => { + write!(output, " ").expect("write to Vec is infallible"); + output.write_all(&c).expect("write to Vec is infallible"); + writeln!(output).unwrap(); + } + DiffLine::Actual(r) => { + write!(output, "+",).expect("write to Vec is infallible"); + output.write_all(&r).expect("write to Vec is infallible"); + writeln!(output).unwrap(); + } + DiffLine::MissingNL => { + writeln!(output, r"\ No newline at end of file") + .expect("write to Vec is infallible"); + } + } + } + } + output +} + +#[test] +fn test_permutations() { + // test all possible six-line files. + for &a in &[0, 1, 2] { + for &b in &[0, 1, 2] { + for &c in &[0, 1, 2] { + for &d in &[0, 1, 2] { + for &e in &[0, 1, 2] { + for &f in &[0, 1, 2] { + use std::fs::{self, File}; + use std::io::Write; + use std::process::Command; + let mut alef = Vec::new(); + let mut bet = Vec::new(); + alef.write_all(if a == 0 { b"a\n" } else { b"b\n" }) + .unwrap(); + if a != 2 { + bet.write_all(b"b\n").unwrap(); + } + alef.write_all(if b == 0 { b"c\n" } else { b"d\n" }) + .unwrap(); + if b != 2 { + bet.write_all(b"d\n").unwrap(); + } + alef.write_all(if c == 0 { b"e\n" } else { b"f\n" }) + .unwrap(); + if c != 2 { + bet.write_all(b"f\n").unwrap(); + } + alef.write_all(if d == 0 { b"g\n" } else { b"h\n" }) + .unwrap(); + if d != 2 { + bet.write_all(b"h\n").unwrap(); + } + alef.write_all(if e == 0 { b"i\n" } else { b"j\n" }) + .unwrap(); + if e != 2 { + bet.write_all(b"j\n").unwrap(); + } + alef.write_all(if f == 0 { b"k\n" } else { b"l\n" }) + .unwrap(); + if f != 2 { + bet.write_all(b"l\n").unwrap(); + } + // This test diff is intentionally reversed. + // We want it to turn the alef into bet. + let diff = diff(&alef, "a/alef", &bet, "target/alef", 2); + File::create("target/ab.diff") + .unwrap() + .write_all(&diff) + .unwrap(); + let mut fa = File::create("target/alef").unwrap(); + fa.write_all(&alef[..]).unwrap(); + let mut fb = File::create("target/bet").unwrap(); + fb.write_all(&bet[..]).unwrap(); + let _ = fa; + let _ = fb; + let output = Command::new("patch") + .arg("-p0") + .stdin(File::open("target/ab.diff").unwrap()) + .output() + .unwrap(); + if !output.status.success() { + panic!("{:?}", output); + } + //println!("{}", String::from_utf8_lossy(&output.stdout)); + //println!("{}", String::from_utf8_lossy(&output.stderr)); + let alef = fs::read("target/alef").unwrap(); + assert_eq!(alef, bet); + } + } + } + } + } + } +} + +#[test] +fn test_permutations_missing_line_ending() { + // test all possible six-line files with missing newlines. + for &a in &[0, 1, 2] { + for &b in &[0, 1, 2] { + for &c in &[0, 1, 2] { + for &d in &[0, 1, 2] { + for &e in &[0, 1, 2] { + for &f in &[0, 1, 2] { + for &g in &[0, 1, 2] { + use std::fs::{self, File}; + use std::io::Write; + use std::process::Command; + let mut alef = Vec::new(); + let mut bet = Vec::new(); + alef.write_all(if a == 0 { b"a\n" } else { b"b\n" }) + .unwrap(); + if a != 2 { + bet.write_all(b"b\n").unwrap(); + } + alef.write_all(if b == 0 { b"c\n" } else { b"d\n" }) + .unwrap(); + if b != 2 { + bet.write_all(b"d\n").unwrap(); + } + alef.write_all(if c == 0 { b"e\n" } else { b"f\n" }) + .unwrap(); + if c != 2 { + bet.write_all(b"f\n").unwrap(); + } + alef.write_all(if d == 0 { b"g\n" } else { b"h\n" }) + .unwrap(); + if d != 2 { + bet.write_all(b"h\n").unwrap(); + } + alef.write_all(if e == 0 { b"i\n" } else { b"j\n" }) + .unwrap(); + if e != 2 { + bet.write_all(b"j\n").unwrap(); + } + alef.write_all(if f == 0 { b"k\n" } else { b"l\n" }) + .unwrap(); + if f != 2 { + bet.write_all(b"l\n").unwrap(); + } + match g { + 0 => { + alef.pop(); + } + 1 => { + bet.pop(); + } + 2 => { + alef.pop(); + bet.pop(); + } + _ => unreachable!(), + } + // This test diff is intentionally reversed. + // We want it to turn the alef into bet. + let diff = diff(&alef, "a/alefn", &bet, "target/alefn", 2); + File::create("target/abn.diff") + .unwrap() + .write_all(&diff) + .unwrap(); + let mut fa = File::create("target/alefn").unwrap(); + fa.write_all(&alef[..]).unwrap(); + let mut fb = File::create("target/betn").unwrap(); + fb.write_all(&bet[..]).unwrap(); + let _ = fa; + let _ = fb; + let output = Command::new("patch") + .arg("-p0") + .stdin(File::open("target/abn.diff").unwrap()) + .output() + .unwrap(); + if !output.status.success() { + panic!("{:?}", output); + } + //println!("{}", String::from_utf8_lossy(&output.stdout)); + //println!("{}", String::from_utf8_lossy(&output.stderr)); + let alef = fs::read("target/alefn").unwrap(); + assert_eq!(alef, bet); + } + } + } + } + } + } + } +} + +#[test] +fn test_permutations_empty_lines() { + // test all possible six-line files with missing newlines. + for &a in &[0, 1, 2] { + for &b in &[0, 1, 2] { + for &c in &[0, 1, 2] { + for &d in &[0, 1, 2] { + for &e in &[0, 1, 2] { + for &f in &[0, 1, 2] { + for &g in &[0, 1, 2, 3] { + use std::fs::{self, File}; + use std::io::Write; + use std::process::Command; + let mut alef = Vec::new(); + let mut bet = Vec::new(); + alef.write_all(if a == 0 { b"\n" } else { b"b\n" }).unwrap(); + if a != 2 { + bet.write_all(b"b\n").unwrap(); + } + alef.write_all(if b == 0 { b"\n" } else { b"d\n" }).unwrap(); + if b != 2 { + bet.write_all(b"d\n").unwrap(); + } + alef.write_all(if c == 0 { b"\n" } else { b"f\n" }).unwrap(); + if c != 2 { + bet.write_all(b"f\n").unwrap(); + } + alef.write_all(if d == 0 { b"\n" } else { b"h\n" }).unwrap(); + if d != 2 { + bet.write_all(b"h\n").unwrap(); + } + alef.write_all(if e == 0 { b"\n" } else { b"j\n" }).unwrap(); + if e != 2 { + bet.write_all(b"j\n").unwrap(); + } + alef.write_all(if f == 0 { b"\n" } else { b"l\n" }).unwrap(); + if f != 2 { + bet.write_all(b"l\n").unwrap(); + } + match g { + 0 => { + alef.pop(); + } + 1 => { + bet.pop(); + } + 2 => { + alef.pop(); + bet.pop(); + } + 3 => {} + _ => unreachable!(), + } + // This test diff is intentionally reversed. + // We want it to turn the alef into bet. + let diff = diff(&alef, "a/alef_", &bet, "target/alef_", 2); + File::create("target/ab_.diff") + .unwrap() + .write_all(&diff) + .unwrap(); + let mut fa = File::create("target/alef_").unwrap(); + fa.write_all(&alef[..]).unwrap(); + let mut fb = File::create("target/bet_").unwrap(); + fb.write_all(&bet[..]).unwrap(); + let _ = fa; + let _ = fb; + let output = Command::new("patch") + .arg("-p0") + .stdin(File::open("target/ab_.diff").unwrap()) + .output() + .unwrap(); + if !output.status.success() { + panic!("{:?}", output); + } + //println!("{}", String::from_utf8_lossy(&output.stdout)); + //println!("{}", String::from_utf8_lossy(&output.stderr)); + let alef = fs::read("target/alef_").unwrap(); + assert_eq!(alef, bet); + } + } + } + } + } + } + } +} + +#[test] +fn test_permutations_missing_lines() { + // test all possible six-line files. + for &a in &[0, 1, 2] { + for &b in &[0, 1, 2] { + for &c in &[0, 1, 2] { + for &d in &[0, 1, 2] { + for &e in &[0, 1, 2] { + for &f in &[0, 1, 2] { + use std::fs::{self, File}; + use std::io::Write; + use std::process::Command; + let mut alef = Vec::new(); + let mut bet = Vec::new(); + alef.write_all(if a == 0 { b"a\n" } else { b"" }).unwrap(); + if a != 2 { + bet.write_all(b"b\n").unwrap(); + } + alef.write_all(if b == 0 { b"c\n" } else { b"" }).unwrap(); + if b != 2 { + bet.write_all(b"d\n").unwrap(); + } + alef.write_all(if c == 0 { b"e\n" } else { b"" }).unwrap(); + if c != 2 { + bet.write_all(b"f\n").unwrap(); + } + alef.write_all(if d == 0 { b"g\n" } else { b"" }).unwrap(); + if d != 2 { + bet.write_all(b"h\n").unwrap(); + } + alef.write_all(if e == 0 { b"i\n" } else { b"" }).unwrap(); + if e != 2 { + bet.write_all(b"j\n").unwrap(); + } + alef.write_all(if f == 0 { b"k\n" } else { b"" }).unwrap(); + if f != 2 { + bet.write_all(b"l\n").unwrap(); + } + // This test diff is intentionally reversed. + // We want it to turn the alef into bet. + let diff = diff(&alef, "a/alefx", &bet, "target/alefx", 2); + File::create("target/abx.diff") + .unwrap() + .write_all(&diff) + .unwrap(); + let mut fa = File::create("target/alefx").unwrap(); + fa.write_all(&alef[..]).unwrap(); + let mut fb = File::create("target/betx").unwrap(); + fb.write_all(&bet[..]).unwrap(); + let _ = fa; + let _ = fb; + let output = Command::new("patch") + .arg("-p0") + .stdin(File::open("target/abx.diff").unwrap()) + .output() + .unwrap(); + if !output.status.success() { + panic!("{:?}", output); + } + //println!("{}", String::from_utf8_lossy(&output.stdout)); + //println!("{}", String::from_utf8_lossy(&output.stderr)); + let alef = fs::read("target/alefx").unwrap(); + assert_eq!(alef, bet); + } + } + } + } + } + } +} + +#[test] +fn test_permutations_reverse() { + // test all possible six-line files. + for &a in &[0, 1, 2] { + for &b in &[0, 1, 2] { + for &c in &[0, 1, 2] { + for &d in &[0, 1, 2] { + for &e in &[0, 1, 2] { + for &f in &[0, 1, 2] { + use std::fs::{self, File}; + use std::io::Write; + use std::process::Command; + let mut alef = Vec::new(); + let mut bet = Vec::new(); + alef.write_all(if a == 0 { b"a\n" } else { b"f\n" }) + .unwrap(); + if a != 2 { + bet.write_all(b"a\n").unwrap(); + } + alef.write_all(if b == 0 { b"b\n" } else { b"e\n" }) + .unwrap(); + if b != 2 { + bet.write_all(b"b\n").unwrap(); + } + alef.write_all(if c == 0 { b"c\n" } else { b"d\n" }) + .unwrap(); + if c != 2 { + bet.write_all(b"c\n").unwrap(); + } + alef.write_all(if d == 0 { b"d\n" } else { b"c\n" }) + .unwrap(); + if d != 2 { + bet.write_all(b"d\n").unwrap(); + } + alef.write_all(if e == 0 { b"e\n" } else { b"b\n" }) + .unwrap(); + if e != 2 { + bet.write_all(b"e\n").unwrap(); + } + alef.write_all(if f == 0 { b"f\n" } else { b"a\n" }) + .unwrap(); + if f != 2 { + bet.write_all(b"f\n").unwrap(); + } + // This test diff is intentionally reversed. + // We want it to turn the alef into bet. + let diff = diff(&alef, "a/alefr", &bet, "target/alefr", 2); + File::create("target/abr.diff") + .unwrap() + .write_all(&diff) + .unwrap(); + let mut fa = File::create("target/alefr").unwrap(); + fa.write_all(&alef[..]).unwrap(); + let mut fb = File::create("target/betr").unwrap(); + fb.write_all(&bet[..]).unwrap(); + let _ = fa; + let _ = fb; + let output = Command::new("patch") + .arg("-p0") + .stdin(File::open("target/abr.diff").unwrap()) + .output() + .unwrap(); + if !output.status.success() { + panic!("{:?}", output); + } + //println!("{}", String::from_utf8_lossy(&output.stdout)); + //println!("{}", String::from_utf8_lossy(&output.stderr)); + let alef = fs::read("target/alefr").unwrap(); + assert_eq!(alef, bet); + } + } + } + } + } + } +} diff --git a/vendor/unified-diff/src/main.rs b/vendor/unified-diff/src/main.rs new file mode 100644 index 0000000000..16ff8e2280 --- /dev/null +++ b/vendor/unified-diff/src/main.rs @@ -0,0 +1,55 @@ +// Sample program. Do not use. +use std::env; +use std::fs; +use std::io::{self, Write}; +use std::process; +fn main() { + let mut o = env::args_os(); + // parse CLI + let exe = match o.next() { + Some(from) => from, + None => { + eprintln!("Usage: [exe] [from] [to]"); + process::exit(1); + } + }; + let from = match o.next() { + Some(from) => from, + None => { + eprintln!("Usage: {} [from] [to]", exe.to_string_lossy()); + process::exit(1); + } + }; + let to = match o.next() { + Some(from) => from, + None => { + eprintln!("Usage: {} [from] [to]", exe.to_string_lossy()); + process::exit(1); + } + }; + // read files + let from_content = match fs::read(&from) { + Ok(from_content) => from_content, + Err(e) => { + eprintln!("Failed to read from-file: {}", e); + process::exit(2); + } + }; + let to_content = match fs::read(&to) { + Ok(to_content) => to_content, + Err(e) => { + eprintln!("Failed to read to-file: {}", e); + process::exit(2); + } + }; + // run diff + io::stdout() + .write_all(&unified_diff::diff( + &from_content, + &from.to_string_lossy(), + &to_content, + &to.to_string_lossy(), + 1, + )) + .unwrap(); +} diff --git a/vendor/url/.cargo-checksum.json b/vendor/url/.cargo-checksum.json index 00fb27c15c..f944417633 100644 --- a/vendor/url/.cargo-checksum.json +++ b/vendor/url/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"Cargo.toml":"a902cef5c474f41f0b9e3e6f146a3d47e92b176e998183db96ecae92a9be79b8","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e","src/host.rs":"05440e5171a90dc1e783b4ecc4844d591a11085f2603c06c7ead253c72bfa602","src/lib.rs":"d1a84d49bef9e5f24dd68a2ec35991394b3b063ffc1ea75cf8ace943818902c5","src/origin.rs":"2b967dd04fa5852b4a89f13cc628f3bfd84d1432e9447b2d3cbc6fee8aba3738","src/parser.rs":"9dc1dd073a63b66038d513913e29de066aa1438b9895ec27e085102a075e522d","src/path_segments.rs":"7c5b357a3b695623b51e2c9f5ae2da550ced09fce8b9e341d02d28c66c0598e3","src/quirks.rs":"7e0656d4e5f455da7e9781ccc378f6322fbfff887fa6e8ca159bfa17fba1e17b","src/slicing.rs":"25425fc5c4100a3a5da49d1e0b497f6536066afcc91c4ba4dff5ace0860acd40"},"package":"5909f2b0817350449ed73e8bcd81c8c3c8d9a7a5d8acba4b27db277f1868976e"} \ No newline at end of file +{"files":{"Cargo.toml":"19fca960f97843c9be43184f70a739cb8e5726ceb2e6beb56d0993b8abd50511","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"20c7855c364d57ea4c97889a5e8d98470a9952dade37bd9248b9a54431670e5e","src/host.rs":"88adbe3a8dc691a4e32d7ed664dc7f17f8a1a863ffa4cde4d618032a00ec6653","src/lib.rs":"ba642e730dd8215da5af5a4b77b45fe10747e0b4523f41535f55728321e5a99c","src/origin.rs":"2b967dd04fa5852b4a89f13cc628f3bfd84d1432e9447b2d3cbc6fee8aba3738","src/parser.rs":"eab4f6c7bffc021e9722375447a259683b8257dc6dff784c715032c39d4b4923","src/path_segments.rs":"dd6b637245b2ad77ce96221df3f80c8b4ad858cd52aecc86b97166dec386882a","src/quirks.rs":"6953a58322e3e593395fb5c8b4aae649cd02978ce0b4b5744e3026bff7fae209","src/slicing.rs":"25425fc5c4100a3a5da49d1e0b497f6536066afcc91c4ba4dff5ace0860acd40","tests/data.rs":"dace394aed466df0e8afea0037bb8c90306d30ce75efdaff39feb00dbd07fa79","tests/setters_tests.json":"486f6d129960d0d0d99b533caf9bef21113b31adcdb83296dfc4a59cd8431715","tests/unit.rs":"008335a21998a8851fd50b8615ea93a1a55991e3b2c5768d2fe30080f47e457e","tests/urltestdata.json":"afe55dd9583d125305d31e152478de9cc19801006b413c5f4fb7d430c50b1d11"},"package":"9ccd964113622c8e9322cfac19eb1004a07e636c545f325da085d5cdde6f1f8b"} \ No newline at end of file diff --git a/vendor/url/Cargo.toml b/vendor/url/Cargo.toml index 7b670a5bf8..6e0b2babda 100644 --- a/vendor/url/Cargo.toml +++ b/vendor/url/Cargo.toml @@ -13,9 +13,9 @@ [package] edition = "2018" name = "url" -version = "2.2.0" +version = "2.2.1" authors = ["The rust-url developers"] -include = ["src/**/*", "LICENSE-*", "README.md"] +include = ["src/**/*", "LICENSE-*", "README.md", "tests/**"] description = "URL library for Rust, based on the WHATWG URL Standard" documentation = "https://docs.rs/url" readme = "../README.md" diff --git a/vendor/url/src/host.rs b/vendor/url/src/host.rs index c91215f627..9537436490 100644 --- a/vendor/url/src/host.rs +++ b/vendor/url/src/host.rs @@ -38,7 +38,7 @@ impl From> for HostInternal { /// The host name of an URL. #[cfg_attr(feature = "serde", derive(Deserialize, Serialize))] -#[derive(Clone, Debug, Eq, PartialEq, Ord, PartialOrd, Hash)] +#[derive(Clone, Debug, Eq, Ord, PartialOrd, Hash)] pub enum Host { /// A DNS domain name, as '.' dot-separated labels. /// Non-ASCII labels are encoded in punycode per IDNA if this is the host of @@ -172,6 +172,20 @@ impl> fmt::Display for Host { } } +impl PartialEq> for Host +where + S: PartialEq, +{ + fn eq(&self, other: &Host) -> bool { + match (self, other) { + (Host::Domain(a), Host::Domain(b)) => a == b, + (Host::Ipv4(a), Host::Ipv4(b)) => a == b, + (Host::Ipv6(a), Host::Ipv6(b)) => a == b, + (_, _) => false, + } + } +} + fn write_ipv6(addr: &Ipv6Addr, f: &mut Formatter<'_>) -> fmt::Result { let segments = addr.segments(); let (compress_start, compress_end) = longest_zero_sequence(&segments); @@ -249,11 +263,11 @@ fn parse_ipv4number(mut input: &str) -> Result, ()> { // So instead we check if the input looks like a real number and only return // an error when it's an overflow. let valid_number = match r { - 8 => input.chars().all(|c| c >= '0' && c <= '7'), - 10 => input.chars().all(|c| c >= '0' && c <= '9'), - 16 => input - .chars() - .all(|c| (c >= '0' && c <= '9') || (c >= 'a' && c <= 'f') || (c >= 'A' && c <= 'F')), + 8 => input.chars().all(|c| ('0'..='7').contains(&c)), + 10 => input.chars().all(|c| ('0'..='9').contains(&c)), + 16 => input.chars().all(|c| { + ('0'..='9').contains(&c) || ('a'..='f').contains(&c) || ('A'..='F').contains(&c) + }), _ => false, }; @@ -288,7 +302,7 @@ fn parse_ipv4addr(input: &str) -> ParseResult> { let mut numbers: Vec = Vec::new(); let mut overflow = false; for part in parts { - if part == "" { + if part.is_empty() { return Ok(None); } match parse_ipv4number(part) { diff --git a/vendor/url/src/lib.rs b/vendor/url/src/lib.rs index f9830f2724..afe511efda 100644 --- a/vendor/url/src/lib.rs +++ b/vendor/url/src/lib.rs @@ -73,6 +73,9 @@ assert!(data_url.fragment() == Some("")); # run().unwrap(); ``` +## Serde + +Enable the `serde` feature to include `Deserialize` and `Serialize` implementations for `url::Url`. # Base URL @@ -103,9 +106,21 @@ assert_eq!(css_url.as_str(), "http://servo.github.io/rust-url/main.css"); # Ok(()) # } # run().unwrap(); +``` + +# Feature: `serde` + +If you enable the `serde` feature, [`Url`](struct.Url.html) will implement +[`serde::Serialize`](https://docs.rs/serde/1/serde/trait.Serialize.html) and +[`serde::Deserialize`](https://docs.rs/serde/1/serde/trait.Deserialize.html). +See [serde documentation](https://serde.rs) for more information. + +```toml +url = { version = "2", features = ["serde"] } +``` */ -#![doc(html_root_url = "https://docs.rs/url/2.1.1")] +#![doc(html_root_url = "https://docs.rs/url/2.2.1")] #[macro_use] extern crate matches; @@ -119,8 +134,6 @@ use crate::parser::{to_u32, Context, Parser, SchemeType, PATH_SEGMENT, USERINFO} use percent_encoding::{percent_decode, percent_encode, utf8_percent_encode}; use std::borrow::Borrow; use std::cmp; -#[cfg(feature = "serde")] -use std::error::Error; use std::fmt::{self, Write}; use std::hash; use std::io; @@ -717,8 +730,9 @@ impl Url { /// # run().unwrap(); /// ``` pub fn username(&self) -> &str { - if self.has_authority() { - self.slice(self.scheme_end + ("://".len() as u32)..self.username_end) + let scheme_separator_len = "://".len() as u32; + if self.has_authority() && self.username_end > self.scheme_end + scheme_separator_len { + self.slice(self.scheme_end + scheme_separator_len..self.username_end) } else { "" } @@ -789,7 +803,8 @@ impl Url { /// Return the string representation of the host (domain or IP address) for this URL, if any. /// - /// Non-ASCII domains are punycode-encoded per IDNA. + /// Non-ASCII domains are punycode-encoded per IDNA if this is the host + /// of a special URL, or percent encoded for non-special URLs. /// IPv6 addresses are given between `[` and `]` brackets. /// /// Cannot-be-a-base URLs (typical of `data:` and `mailto:`) and some `file:` URLs @@ -828,7 +843,8 @@ impl Url { } /// Return the parsed representation of the host for this URL. - /// Non-ASCII domain labels are punycode-encoded per IDNA. + /// Non-ASCII domain labels are punycode-encoded per IDNA if this is the host + /// of a special URL, or percent encoded for non-special URLs. /// /// Cannot-be-a-base URLs (typical of `data:` and `mailto:`) and some `file:` URLs /// don’t have a host. @@ -867,6 +883,8 @@ impl Url { } /// If this URL has a host and it is a domain name (not an IP address), return it. + /// Non-ASCII domains are punycode-encoded per IDNA if this is the host + /// of a special URL, or percent encoded for non-special URLs. /// /// # Examples /// @@ -1080,6 +1098,7 @@ impl Url { /// # } /// # run().unwrap(); /// ``` + #[allow(clippy::manual_strip)] // introduced in 1.45, MSRV is 1.36 pub fn path_segments(&self) -> Option> { let path = self.path(); if path.starts_with('/') { @@ -1414,6 +1433,7 @@ impl Url { /// Return an object with methods to manipulate this URL’s path segments. /// /// Return `Err(())` if this URL is cannot-be-a-base. + #[allow(clippy::clippy::result_unit_err)] pub fn path_segments_mut(&mut self) -> Result, ()> { if self.cannot_be_a_base() { Err(()) @@ -1497,6 +1517,7 @@ impl Url { /// # } /// # run().unwrap(); /// ``` + #[allow(clippy::clippy::result_unit_err)] pub fn set_port(&mut self, mut port: Option) -> Result<(), ()> { // has_host implies !cannot_be_a_base if !self.has_host() || self.host() == Some(Host::Domain("")) || self.scheme() == "file" { @@ -1636,7 +1657,7 @@ impl Url { } if let Some(host) = host { - if host == "" && SchemeType::from(self.scheme()).is_special() { + if host.is_empty() && SchemeType::from(self.scheme()).is_special() { return Err(ParseError::EmptyHost); } let mut host_substr = host; @@ -1767,6 +1788,7 @@ impl Url { /// # run().unwrap(); /// ``` /// + #[allow(clippy::clippy::result_unit_err)] pub fn set_ip_host(&mut self, address: IpAddr) -> Result<(), ()> { if self.cannot_be_a_base() { return Err(()); @@ -1806,6 +1828,7 @@ impl Url { /// # } /// # run().unwrap(); /// ``` + #[allow(clippy::clippy::result_unit_err)] pub fn set_password(&mut self, password: Option<&str>) -> Result<(), ()> { // has_host implies !cannot_be_a_base if !self.has_host() || self.host() == Some(Host::Domain("")) || self.scheme() == "file" { @@ -1898,6 +1921,7 @@ impl Url { /// # } /// # run().unwrap(); /// ``` + #[allow(clippy::clippy::result_unit_err)] pub fn set_username(&mut self, username: &str) -> Result<(), ()> { // has_host implies !cannot_be_a_base if !self.has_host() || self.host() == Some(Host::Domain("")) || self.scheme() == "file" { @@ -2059,6 +2083,7 @@ impl Url { /// # } /// # run().unwrap(); /// ``` + #[allow(clippy::result_unit_err, clippy::suspicious_operation_groupings)] pub fn set_scheme(&mut self, scheme: &str) -> Result<(), ()> { let mut parser = Parser::for_setter(String::new()); let remaining = parser.parse_scheme(parser::Input::new(scheme))?; @@ -2138,6 +2163,7 @@ impl Url { /// # } /// ``` #[cfg(any(unix, windows, target_os = "redox"))] + #[allow(clippy::clippy::result_unit_err)] pub fn from_file_path>(path: P) -> Result { let mut serialization = "file://".to_owned(); let host_start = serialization.len() as u32; @@ -2174,6 +2200,7 @@ impl Url { /// Note that `std::path` does not consider trailing slashes significant /// and usually does not include them (e.g. in `Path::parent()`). #[cfg(any(unix, windows, target_os = "redox"))] + #[allow(clippy::clippy::result_unit_err)] pub fn from_directory_path>(path: P) -> Result { let mut url = Url::from_file_path(path)?; if !url.serialization.ends_with('/') { @@ -2290,6 +2317,7 @@ impl Url { /// for a Windows path, is not UTF-8.) #[inline] #[cfg(any(unix, windows, target_os = "redox"))] + #[allow(clippy::clippy::result_unit_err)] pub fn to_file_path(&self) -> Result { if let Some(segments) = self.path_segments() { let host = match self.host() { @@ -2354,6 +2382,8 @@ impl fmt::Debug for Url { formatter .debug_struct("Url") .field("scheme", &self.scheme()) + .field("username", &self.username()) + .field("password", &self.password()) .field("host", &self.host()) .field("port", &self.port()) .field("path", &self.path()) @@ -2471,8 +2501,10 @@ impl<'de> serde::Deserialize<'de> for Url { where E: Error, { - Url::parse(s) - .map_err(|err| Error::invalid_value(Unexpected::Str(s), &err.description())) + Url::parse(s).map_err(|err| { + let err_s = format!("{}", err); + Error::invalid_value(Unexpected::Str(s), &err_s.as_str()) + }) } } diff --git a/vendor/url/src/parser.rs b/vendor/url/src/parser.rs index be7992e00c..57be110523 100644 --- a/vendor/url/src/parser.rs +++ b/vendor/url/src/parser.rs @@ -295,17 +295,17 @@ impl<'i> Input<'i> { } pub trait Pattern { - fn split_prefix<'i>(self, input: &mut Input<'i>) -> bool; + fn split_prefix(self, input: &mut Input) -> bool; } impl Pattern for char { - fn split_prefix<'i>(self, input: &mut Input<'i>) -> bool { + fn split_prefix(self, input: &mut Input) -> bool { input.next() == Some(self) } } impl<'a> Pattern for &'a str { - fn split_prefix<'i>(self, input: &mut Input<'i>) -> bool { + fn split_prefix(self, input: &mut Input) -> bool { for c in self.chars() { if input.next() != Some(c) { return false; @@ -316,7 +316,7 @@ impl<'a> Pattern for &'a str { } impl bool> Pattern for F { - fn split_prefix<'i>(self, input: &mut Input<'i>) -> bool { + fn split_prefix(self, input: &mut Input) -> bool { input.next().map_or(false, self) } } @@ -1071,7 +1071,7 @@ impl<'a> Parser<'a> { Ok((has_host, host, remaining)) } - pub fn file_host<'i>(input: Input<'i>) -> ParseResult<(bool, String, Input<'i>)> { + pub fn file_host(input: Input) -> ParseResult<(bool, String, Input)> { // Undo the Input abstraction here to avoid allocating in the common case // where the host part of the input does not contain any tab or newline let input_str = input.chars.as_str(); diff --git a/vendor/url/src/path_segments.rs b/vendor/url/src/path_segments.rs index f2ae67e49d..29afc1e7e9 100644 --- a/vendor/url/src/path_segments.rs +++ b/vendor/url/src/path_segments.rs @@ -123,6 +123,9 @@ impl<'a> PathSegmentsMut<'a> { /// # run().unwrap(); /// ``` pub fn pop_if_empty(&mut self) -> &mut Self { + if self.after_first_slash >= self.url.serialization.len() { + return self; + } if self.url.serialization[self.after_first_slash..].ends_with('/') { self.url.serialization.pop(); } @@ -135,6 +138,9 @@ impl<'a> PathSegmentsMut<'a> { /// /// Returns `&mut Self` so that method calls can be chained. pub fn pop(&mut self) -> &mut Self { + if self.after_first_slash >= self.url.serialization.len() { + return self; + } let last_slash = self.url.serialization[self.after_first_slash..] .rfind('/') .unwrap_or(0); diff --git a/vendor/url/src/quirks.rs b/vendor/url/src/quirks.rs index 4cd6e9974f..72dadaa72c 100644 --- a/vendor/url/src/quirks.rs +++ b/vendor/url/src/quirks.rs @@ -56,6 +56,7 @@ pub fn protocol(url: &Url) -> &str { } /// Setter for https://url.spec.whatwg.org/#dom-url-protocol +#[allow(clippy::clippy::result_unit_err)] pub fn set_protocol(url: &mut Url, mut new_protocol: &str) -> Result<(), ()> { // The scheme state in the spec ignores everything after the first `:`, // but `set_scheme` errors if there is more. @@ -72,6 +73,7 @@ pub fn username(url: &Url) -> &str { } /// Setter for https://url.spec.whatwg.org/#dom-url-username +#[allow(clippy::clippy::result_unit_err)] pub fn set_username(url: &mut Url, new_username: &str) -> Result<(), ()> { url.set_username(new_username) } @@ -83,6 +85,7 @@ pub fn password(url: &Url) -> &str { } /// Setter for https://url.spec.whatwg.org/#dom-url-password +#[allow(clippy::clippy::result_unit_err)] pub fn set_password(url: &mut Url, new_password: &str) -> Result<(), ()> { url.set_password(if new_password.is_empty() { None @@ -98,6 +101,7 @@ pub fn host(url: &Url) -> &str { } /// Setter for https://url.spec.whatwg.org/#dom-url-host +#[allow(clippy::clippy::result_unit_err)] pub fn set_host(url: &mut Url, new_host: &str) -> Result<(), ()> { // If context object’s url’s cannot-be-a-base-URL flag is set, then return. if url.cannot_be_a_base() { @@ -154,6 +158,7 @@ pub fn hostname(url: &Url) -> &str { } /// Setter for https://url.spec.whatwg.org/#dom-url-hostname +#[allow(clippy::clippy::result_unit_err)] pub fn set_hostname(url: &mut Url, new_hostname: &str) -> Result<(), ()> { if url.cannot_be_a_base() { return Err(()); @@ -195,6 +200,7 @@ pub fn port(url: &Url) -> &str { } /// Setter for https://url.spec.whatwg.org/#dom-url-port +#[allow(clippy::clippy::result_unit_err)] pub fn set_port(url: &mut Url, new_port: &str) -> Result<(), ()> { let result; { diff --git a/vendor/url/tests/data.rs b/vendor/url/tests/data.rs new file mode 100644 index 0000000000..b72c333063 --- /dev/null +++ b/vendor/url/tests/data.rs @@ -0,0 +1,233 @@ +// 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. + +//! Data-driven tests + +use std::ops::Deref; +use std::str::FromStr; + +use serde_json::Value; +use url::{quirks, Url}; + +#[test] +fn urltestdata() { + // Copied form https://github.com/w3c/web-platform-tests/blob/master/url/ + let mut json = Value::from_str(include_str!("urltestdata.json")) + .expect("JSON parse error in urltestdata.json"); + + let mut passed = true; + for entry in json.as_array_mut().unwrap() { + if entry.is_string() { + continue; // ignore comments + } + + let base = entry.take_string("base"); + let input = entry.take_string("input"); + let failure = entry.take_key("failure").is_some(); + + let base = match Url::parse(&base) { + Ok(base) => base, + Err(_) if failure => continue, + Err(message) => { + eprint_failure( + format!(" failed: error parsing base {:?}: {}", base, message), + &format!("parse base for {:?}", input), + None, + ); + passed = false; + continue; + } + }; + + let url = match (base.join(&input), failure) { + (Ok(url), false) => url, + (Err(_), true) => continue, + (Err(message), false) => { + eprint_failure( + format!(" failed: {}", message), + &format!("parse URL for {:?}", input), + None, + ); + passed = false; + continue; + } + (Ok(_), true) => { + eprint_failure( + format!(" failed: expected parse error for URL {:?}", input), + &format!("parse URL for {:?}", input), + None, + ); + passed = false; + continue; + } + }; + + passed &= check_invariants(&url, &format!("invariants for {:?}", input), None); + + for &attr in ATTRIBS { + passed &= test_eq_eprint( + entry.take_string(attr), + get(&url, attr), + &format!("{:?} - {}", input, attr), + None, + ); + } + + if let Some(expected_origin) = entry.take_key("origin").map(|s| s.string()) { + passed &= test_eq_eprint( + expected_origin, + &quirks::origin(&url), + &format!("origin for {:?}", input), + None, + ); + } + } + + assert!(passed) +} + +#[allow(clippy::option_as_ref_deref)] // introduced in 1.40, MSRV is 1.36 +#[test] +fn setters_tests() { + let mut json = Value::from_str(include_str!("setters_tests.json")) + .expect("JSON parse error in setters_tests.json"); + + let mut passed = true; + for &attr in ATTRIBS { + if attr == "href" { + continue; + } + + let mut tests = json.take_key(attr).unwrap(); + for mut test in tests.as_array_mut().unwrap().drain(..) { + let comment = test.take_key("comment").map(|s| s.string()); + let href = test.take_string("href"); + let new_value = test.take_string("new_value"); + let name = format!("{:?}.{} = {:?}", href, attr, new_value); + let mut expected = test.take_key("expected").unwrap(); + + let mut url = Url::parse(&href).unwrap(); + let comment_ref = comment.as_ref().map(|s| s.deref()); + passed &= check_invariants(&url, &name, comment_ref); + let _ = set(&mut url, attr, &new_value); + + for attr in ATTRIBS { + if let Some(value) = expected.take_key(attr) { + passed &= test_eq_eprint(value.string(), get(&url, attr), &name, comment_ref); + }; + } + + passed &= check_invariants(&url, &name, comment_ref); + } + } + + assert!(passed); +} + +fn check_invariants(url: &Url, name: &str, comment: Option<&str>) -> bool { + let mut passed = true; + if let Err(e) = url.check_invariants() { + passed = false; + eprint_failure( + format!(" failed: invariants checked -> {:?}", e), + name, + comment, + ); + } + + #[cfg(feature = "serde")] + { + let bytes = serde_json::to_vec(url).unwrap(); + let new_url: Url = serde_json::from_slice(&bytes).unwrap(); + passed &= test_eq_eprint(url.to_string(), &new_url.to_string(), name, comment); + } + + passed +} + +trait JsonExt { + fn take_key(&mut self, key: &str) -> Option; + fn string(self) -> String; + fn take_string(&mut self, key: &str) -> String; +} + +impl JsonExt for Value { + fn take_key(&mut self, key: &str) -> Option { + self.as_object_mut().unwrap().remove(key) + } + + fn string(self) -> String { + if let Value::String(s) = self { + s + } else { + panic!("Not a Value::String") + } + } + + fn take_string(&mut self, key: &str) -> String { + self.take_key(key).unwrap().string() + } +} + +fn get<'a>(url: &'a Url, attr: &str) -> &'a str { + match attr { + "href" => quirks::href(url), + "protocol" => quirks::protocol(url), + "username" => quirks::username(url), + "password" => quirks::password(url), + "hostname" => quirks::hostname(url), + "host" => quirks::host(url), + "port" => quirks::port(url), + "pathname" => quirks::pathname(url), + "search" => quirks::search(url), + "hash" => quirks::hash(url), + _ => unreachable!(), + } +} + +#[allow(clippy::unit_arg)] +fn set<'a>(url: &'a mut Url, attr: &str, new: &str) { + let _ = match attr { + "protocol" => quirks::set_protocol(url, new), + "username" => quirks::set_username(url, new), + "password" => quirks::set_password(url, new), + "hostname" => quirks::set_hostname(url, new), + "host" => quirks::set_host(url, new), + "port" => quirks::set_port(url, new), + "pathname" => Ok(quirks::set_pathname(url, new)), + "search" => Ok(quirks::set_search(url, new)), + "hash" => Ok(quirks::set_hash(url, new)), + _ => unreachable!(), + }; +} + +fn test_eq_eprint(expected: String, actual: &str, name: &str, comment: Option<&str>) -> bool { + if expected == actual { + return true; + } + eprint_failure( + format!("expected: {}\n actual: {}", expected, actual), + name, + comment, + ); + false +} + +fn eprint_failure(err: String, name: &str, comment: Option<&str>) { + eprintln!(" test: {}\n{}", name, err); + if let Some(comment) = comment { + eprintln!("{}\n", comment); + } else { + eprintln!(); + } +} + +const ATTRIBS: &[&str] = &[ + "href", "protocol", "username", "password", "host", "hostname", "port", "pathname", "search", + "hash", +]; diff --git a/vendor/url/tests/setters_tests.json b/vendor/url/tests/setters_tests.json new file mode 100644 index 0000000000..4280032a2f --- /dev/null +++ b/vendor/url/tests/setters_tests.json @@ -0,0 +1,1876 @@ +{ + "comment": [ + "AS OF https://github.com/jsdom/whatwg-url/commit/35f04dfd3048cf6362f4398745bb13375c5020c2", + "## Tests for setters of https://url.spec.whatwg.org/#urlutils-members", + "", + "This file contains a JSON object.", + "Other than 'comment', each key is an attribute of the `URL` interface", + "defined in WHATWG’s URL Standard.", + "The values are arrays of test case objects for that attribute.", + "", + "To run a test case for the attribute `attr`:", + "", + "* Create a new `URL` object with the value for the 'href' key", + " the constructor single parameter. (Without a base URL.)", + " This must not throw.", + "* Set the attribute `attr` to (invoke its setter with)", + " with the value of for 'new_value' key.", + "* The value for the 'expected' key is another object.", + " For each `key` / `value` pair of that object,", + " get the attribute `key` (invoke its getter).", + " The returned string must be equal to `value`.", + "", + "Note: the 'href' setter is already covered by urltestdata.json." + ], + "protocol": [ + { + "comment": "The empty string is not a valid scheme. Setter leaves the URL unchanged.", + "href": "a://example.net", + "new_value": "", + "expected": { + "href": "a://example.net", + "protocol": "a:" + } + }, + { + "href": "a://example.net", + "new_value": "b", + "expected": { + "href": "b://example.net", + "protocol": "b:" + } + }, + { + "href": "javascript:alert(1)", + "new_value": "defuse", + "expected": { + "href": "defuse:alert(1)", + "protocol": "defuse:" + } + }, + { + "comment": "Upper-case ASCII is lower-cased", + "href": "a://example.net", + "new_value": "B", + "expected": { + "href": "b://example.net", + "protocol": "b:" + } + }, + { + "comment": "Non-ASCII is rejected", + "href": "a://example.net", + "new_value": "é", + "expected": { + "href": "a://example.net", + "protocol": "a:" + } + }, + { + "comment": "No leading digit", + "href": "a://example.net", + "new_value": "0b", + "expected": { + "href": "a://example.net", + "protocol": "a:" + } + }, + { + "comment": "No leading punctuation", + "href": "a://example.net", + "new_value": "+b", + "expected": { + "href": "a://example.net", + "protocol": "a:" + } + }, + { + "href": "a://example.net", + "new_value": "bC0+-.", + "expected": { + "href": "bc0+-.://example.net", + "protocol": "bc0+-.:" + } + }, + { + "comment": "Only some punctuation is acceptable", + "href": "a://example.net", + "new_value": "b,c", + "expected": { + "href": "a://example.net", + "protocol": "a:" + } + }, + { + "comment": "Non-ASCII is rejected", + "href": "a://example.net", + "new_value": "bé", + "expected": { + "href": "a://example.net", + "protocol": "a:" + } + }, + { + "comment": "Can’t switch from URL containing username/password/port to file", + "href": "http://test@example.net", + "new_value": "file", + "expected": { + "href": "http://test@example.net/", + "protocol": "http:" + } + }, + { + "href": "gopher://example.net:1234", + "new_value": "file", + "expected": { + "href": "gopher://example.net:1234", + "protocol": "gopher:" + } + }, + { + "href": "wss://x:x@example.net:1234", + "new_value": "file", + "expected": { + "href": "wss://x:x@example.net:1234/", + "protocol": "wss:" + } + }, + { + "comment": "Can’t switch from file URL with no host", + "href": "file://localhost/", + "new_value": "http", + "expected": { + "href": "file:///", + "protocol": "file:" + } + }, + { + "href": "file:///test", + "new_value": "gopher", + "expected": { + "href": "file:///test", + "protocol": "file:" + } + }, + { + "href": "file:", + "new_value": "wss", + "expected": { + "href": "file:///", + "protocol": "file:" + } + }, + { + "comment": "Can’t switch from special scheme to non-special", + "href": "http://example.net", + "new_value": "b", + "expected": { + "href": "http://example.net/", + "protocol": "http:" + } + }, + { + "href": "file://hi/path", + "new_value": "s", + "expected": { + "href": "file://hi/path", + "protocol": "file:" + } + }, + { + "href": "https://example.net", + "new_value": "s", + "expected": { + "href": "https://example.net/", + "protocol": "https:" + } + }, + { + "href": "ftp://example.net", + "new_value": "test", + "expected": { + "href": "ftp://example.net/", + "protocol": "ftp:" + } + }, + { + "comment": "Cannot-be-a-base URL doesn’t have a host, but URL in a special scheme must.", + "href": "mailto:me@example.net", + "new_value": "http", + "expected": { + "href": "mailto:me@example.net", + "protocol": "mailto:" + } + }, + { + "comment": "Can’t switch from non-special scheme to special", + "href": "ssh://me@example.net", + "new_value": "http", + "expected": { + "href": "ssh://me@example.net", + "protocol": "ssh:" + } + }, + { + "href": "ssh://me@example.net", + "new_value": "https", + "expected": { + "href": "ssh://me@example.net", + "protocol": "ssh:" + } + }, + { + "href": "ssh://me@example.net", + "new_value": "file", + "expected": { + "href": "ssh://me@example.net", + "protocol": "ssh:" + } + }, + { + "href": "ssh://example.net", + "new_value": "file", + "expected": { + "href": "ssh://example.net", + "protocol": "ssh:" + } + }, + { + "href": "nonsense:///test", + "new_value": "https", + "expected": { + "href": "nonsense:///test", + "protocol": "nonsense:" + } + }, + { + "comment": "Stuff after the first ':' is ignored", + "href": "http://example.net", + "new_value": "https:foo : bar", + "expected": { + "href": "https://example.net/", + "protocol": "https:" + } + }, + { + "comment": "Stuff after the first ':' is ignored", + "href": "data:text/html,

    Test", + "new_value": "view-source+data:foo : bar", + "expected": { + "href": "view-source+data:text/html,

    Test", + "protocol": "view-source+data:" + } + }, + { + "comment": "Port is set to null if it is the default for new scheme.", + "href": "http://foo.com:443/", + "new_value": "https", + "expected": { + "href": "https://foo.com/", + "protocol": "https:", + "port": "" + } + } + ], + "username": [ + { + "comment": "No host means no username", + "href": "file:///home/you/index.html", + "new_value": "me", + "expected": { + "href": "file:///home/you/index.html", + "username": "" + } + }, + { + "comment": "No host means no username", + "href": "unix:/run/foo.socket", + "new_value": "me", + "expected": { + "href": "unix:/run/foo.socket", + "username": "" + } + }, + { + "comment": "Cannot-be-a-base means no username", + "href": "mailto:you@example.net", + "new_value": "me", + "expected": { + "href": "mailto:you@example.net", + "username": "" + } + }, + { + "href": "javascript:alert(1)", + "new_value": "wario", + "expected": { + "href": "javascript:alert(1)", + "username": "" + } + }, + { + "href": "http://example.net", + "new_value": "me", + "expected": { + "href": "http://me@example.net/", + "username": "me" + } + }, + { + "href": "http://:secret@example.net", + "new_value": "me", + "expected": { + "href": "http://me:secret@example.net/", + "username": "me" + } + }, + { + "href": "http://me@example.net", + "new_value": "", + "expected": { + "href": "http://example.net/", + "username": "" + } + }, + { + "href": "http://me:secret@example.net", + "new_value": "", + "expected": { + "href": "http://:secret@example.net/", + "username": "" + } + }, + { + "comment": "UTF-8 percent encoding with the userinfo encode set.", + "href": "http://example.net", + "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", + "expected": { + "href": "http://%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/", + "username": "%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9" + } + }, + { + "comment": "Bytes already percent-encoded are left as-is.", + "href": "http://example.net", + "new_value": "%c3%89té", + "expected": { + "href": "http://%c3%89t%C3%A9@example.net/", + "username": "%c3%89t%C3%A9" + } + }, + { + "href": "sc:///", + "new_value": "x", + "expected": { + "href": "sc:///", + "username": "" + } + }, + { + "href": "javascript://x/", + "new_value": "wario", + "expected": { + "href": "javascript://wario@x/", + "username": "wario" + } + }, + { + "href": "file://test/", + "new_value": "test", + "expected": { + "href": "file://test/", + "username": "" + } + } + ], + "password": [ + { + "comment": "No host means no password", + "href": "file:///home/me/index.html", + "new_value": "secret", + "expected": { + "href": "file:///home/me/index.html", + "password": "" + } + }, + { + "comment": "No host means no password", + "href": "unix:/run/foo.socket", + "new_value": "secret", + "expected": { + "href": "unix:/run/foo.socket", + "password": "" + } + }, + { + "comment": "Cannot-be-a-base means no password", + "href": "mailto:me@example.net", + "new_value": "secret", + "expected": { + "href": "mailto:me@example.net", + "password": "" + } + }, + { + "href": "http://example.net", + "new_value": "secret", + "expected": { + "href": "http://:secret@example.net/", + "password": "secret" + } + }, + { + "href": "http://me@example.net", + "new_value": "secret", + "expected": { + "href": "http://me:secret@example.net/", + "password": "secret" + } + }, + { + "href": "http://:secret@example.net", + "new_value": "", + "expected": { + "href": "http://example.net/", + "password": "" + } + }, + { + "href": "http://me:secret@example.net", + "new_value": "", + "expected": { + "href": "http://me@example.net/", + "password": "" + } + }, + { + "comment": "UTF-8 percent encoding with the userinfo encode set.", + "href": "http://example.net", + "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", + "expected": { + "href": "http://:%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9@example.net/", + "password": "%00%01%09%0A%0D%1F%20!%22%23$%&'()*+,-.%2F09%3A%3B%3C%3D%3E%3F%40AZ%5B%5C%5D%5E_%60az%7B%7C%7D~%7F%C2%80%C2%81%C3%89%C3%A9" + } + }, + { + "comment": "Bytes already percent-encoded are left as-is.", + "href": "http://example.net", + "new_value": "%c3%89té", + "expected": { + "href": "http://:%c3%89t%C3%A9@example.net/", + "password": "%c3%89t%C3%A9" + } + }, + { + "href": "sc:///", + "new_value": "x", + "expected": { + "href": "sc:///", + "password": "" + } + }, + { + "href": "javascript://x/", + "new_value": "bowser", + "expected": { + "href": "javascript://:bowser@x/", + "password": "bowser" + } + }, + { + "href": "file://test/", + "new_value": "test", + "expected": { + "href": "file://test/", + "password": "" + } + } + ], + "host": [ + { + "comment": "Non-special scheme", + "href": "sc://x/", + "new_value": "\u0000", + "expected": { + "href": "sc://x/", + "host": "x", + "hostname": "x" + } + }, + { + "href": "sc://x/", + "new_value": "\u0009", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "\u000A", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "\u000D", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": " ", + "expected": { + "href": "sc://x/", + "host": "x", + "hostname": "x" + } + }, + { + "href": "sc://x/", + "new_value": "#", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "/", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "?", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "@", + "expected": { + "href": "sc://x/", + "host": "x", + "hostname": "x" + } + }, + { + "href": "sc://x/", + "new_value": "ß", + "expected": { + "href": "sc://%C3%9F/", + "host": "%C3%9F", + "hostname": "%C3%9F" + } + }, + { + "comment": "IDNA Nontransitional_Processing", + "href": "https://x/", + "new_value": "ß", + "expected": { + "href": "https://xn--zca/", + "host": "xn--zca", + "hostname": "xn--zca" + } + }, + { + "comment": "Cannot-be-a-base means no host", + "href": "mailto:me@example.net", + "new_value": "example.com", + "expected": { + "href": "mailto:me@example.net", + "host": "" + } + }, + { + "comment": "Cannot-be-a-base means no host", + "href": "data:text/plain,Stuff", + "new_value": "example.net", + "expected": { + "href": "data:text/plain,Stuff", + "host": "" + } + }, + { + "href": "http://example.net", + "new_value": "example.com:8080", + "expected": { + "href": "http://example.com:8080/", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Port number is unchanged if not specified in the new value", + "href": "http://example.net:8080", + "new_value": "example.com", + "expected": { + "href": "http://example.com:8080/", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Port number is unchanged if not specified", + "href": "http://example.net:8080", + "new_value": "example.com:", + "expected": { + "href": "http://example.com:8080/", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "The empty host is not valid for special schemes", + "href": "http://example.net", + "new_value": "", + "expected": { + "href": "http://example.net/", + "host": "example.net" + } + }, + { + "comment": "The empty host is OK for non-special schemes", + "href": "view-source+http://example.net/foo", + "new_value": "", + "expected": { + "href": "view-source+http:///foo", + "host": "" + } + }, + { + "comment": "Path-only URLs can gain a host", + "href": "a:/foo", + "new_value": "example.net", + "expected": { + "href": "a://example.net/foo", + "host": "example.net" + } + }, + { + "comment": "IPv4 address syntax is normalized", + "href": "http://example.net", + "new_value": "0x7F000001:8080", + "expected": { + "href": "http://127.0.0.1:8080/", + "host": "127.0.0.1:8080", + "hostname": "127.0.0.1", + "port": "8080" + } + }, + { + "comment": "IPv6 address syntax is normalized", + "href": "http://example.net", + "new_value": "[::0:01]:2", + "expected": { + "href": "http://[::1]:2/", + "host": "[::1]:2", + "hostname": "[::1]", + "port": "2" + } + }, + { + "comment": "IPv6 literal address with port, crbug.com/1012416", + "href": "http://example.net", + "new_value": "[2001:db8::2]:4002", + "expected": { + "href": "http://[2001:db8::2]:4002/", + "host": "[2001:db8::2]:4002", + "hostname": "[2001:db8::2]", + "port": "4002" + } + }, + { + "comment": "Default port number is removed", + "href": "http://example.net", + "new_value": "example.com:80", + "expected": { + "href": "http://example.com/", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Default port number is removed", + "href": "https://example.net", + "new_value": "example.com:443", + "expected": { + "href": "https://example.com/", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Default port number is only removed for the relevant scheme", + "href": "https://example.net", + "new_value": "example.com:80", + "expected": { + "href": "https://example.com:80/", + "host": "example.com:80", + "hostname": "example.com", + "port": "80" + } + }, + { + "comment": "Port number is removed if new port is scheme default and existing URL has a non-default port", + "href": "http://example.net:8080", + "new_value": "example.com:80", + "expected": { + "href": "http://example.com/", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a / delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com/stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a / delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com:8080/stuff", + "expected": { + "href": "http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Stuff after a ? delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com?stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a ? delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com:8080?stuff", + "expected": { + "href": "http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Stuff after a # delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com#stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a # delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com:8080#stuff", + "expected": { + "href": "http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Stuff after a \\ delimiter is ignored for special schemes", + "href": "http://example.net/path", + "new_value": "example.com\\stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a \\ delimiter is ignored for special schemes", + "href": "http://example.net/path", + "new_value": "example.com:8080\\stuff", + "expected": { + "href": "http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "\\ is not a delimiter for non-special schemes, but still forbidden in hosts", + "href": "view-source+http://example.net/path", + "new_value": "example.com\\stuff", + "expected": { + "href": "view-source+http://example.net/path", + "host": "example.net", + "hostname": "example.net", + "port": "" + } + }, + { + "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error", + "href": "view-source+http://example.net/path", + "new_value": "example.com:8080stuff2", + "expected": { + "href": "view-source+http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error", + "href": "http://example.net/path", + "new_value": "example.com:8080stuff2", + "expected": { + "href": "http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error", + "href": "http://example.net/path", + "new_value": "example.com:8080+2", + "expected": { + "href": "http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Port numbers are 16 bit integers", + "href": "http://example.net/path", + "new_value": "example.com:65535", + "expected": { + "href": "http://example.com:65535/path", + "host": "example.com:65535", + "hostname": "example.com", + "port": "65535" + } + }, + { + "comment": "Port numbers are 16 bit integers, overflowing is an error. Hostname is still set, though.", + "href": "http://example.net/path", + "new_value": "example.com:65536", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Broken IPv6", + "href": "http://example.net/", + "new_value": "[google.com]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.2.3.4x]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.2.3.]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.2.]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "file://y/", + "new_value": "x:123", + "expected": { + "href": "file://y/", + "host": "y", + "hostname": "y", + "port": "" + } + }, + { + "href": "file://y/", + "new_value": "loc%41lhost", + "expected": { + "href": "file:///", + "host": "", + "hostname": "", + "port": "" + } + }, + { + "href": "sc://test@test/", + "new_value": "", + "expected": { + "href": "sc://test@test/", + "host": "test", + "hostname": "test", + "username": "test" + } + }, + { + "href": "sc://test:12/", + "new_value": "", + "expected": { + "href": "sc://test:12/", + "host": "test:12", + "hostname": "test", + "port": "12" + } + } + ], + "hostname": [ + { + "comment": "Non-special scheme", + "href": "sc://x/", + "new_value": "\u0000", + "expected": { + "href": "sc://x/", + "host": "x", + "hostname": "x" + } + }, + { + "href": "sc://x/", + "new_value": "\u0009", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "\u000A", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "\u000D", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": " ", + "expected": { + "href": "sc://x/", + "host": "x", + "hostname": "x" + } + }, + { + "href": "sc://x/", + "new_value": "#", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "/", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "?", + "expected": { + "href": "sc:///", + "host": "", + "hostname": "" + } + }, + { + "href": "sc://x/", + "new_value": "@", + "expected": { + "href": "sc://x/", + "host": "x", + "hostname": "x" + } + }, + { + "comment": "Cannot-be-a-base means no host", + "href": "mailto:me@example.net", + "new_value": "example.com", + "expected": { + "href": "mailto:me@example.net", + "host": "" + } + }, + { + "comment": "Cannot-be-a-base means no host", + "href": "data:text/plain,Stuff", + "new_value": "example.net", + "expected": { + "href": "data:text/plain,Stuff", + "host": "" + } + }, + { + "href": "http://example.net:8080", + "new_value": "example.com", + "expected": { + "href": "http://example.com:8080/", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "The empty host is not valid for special schemes", + "href": "http://example.net", + "new_value": "", + "expected": { + "href": "http://example.net/", + "host": "example.net" + } + }, + { + "comment": "The empty host is OK for non-special schemes", + "href": "view-source+http://example.net/foo", + "new_value": "", + "expected": { + "href": "view-source+http:///foo", + "host": "" + } + }, + { + "comment": "Path-only URLs can gain a host", + "href": "a:/foo", + "new_value": "example.net", + "expected": { + "href": "a://example.net/foo", + "host": "example.net" + } + }, + { + "comment": "IPv4 address syntax is normalized", + "href": "http://example.net:8080", + "new_value": "0x7F000001", + "expected": { + "href": "http://127.0.0.1:8080/", + "host": "127.0.0.1:8080", + "hostname": "127.0.0.1", + "port": "8080" + } + }, + { + "comment": "IPv6 address syntax is normalized", + "href": "http://example.net", + "new_value": "[::0:01]", + "expected": { + "href": "http://[::1]/", + "host": "[::1]", + "hostname": "[::1]", + "port": "" + } + }, + { + "comment": "Stuff after a : delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com:8080", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a : delimiter is ignored", + "href": "http://example.net:8080/path", + "new_value": "example.com:", + "expected": { + "href": "http://example.com:8080/path", + "host": "example.com:8080", + "hostname": "example.com", + "port": "8080" + } + }, + { + "comment": "Stuff after a / delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com/stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a ? delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com?stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a # delimiter is ignored", + "href": "http://example.net/path", + "new_value": "example.com#stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "Stuff after a \\ delimiter is ignored for special schemes", + "href": "http://example.net/path", + "new_value": "example.com\\stuff", + "expected": { + "href": "http://example.com/path", + "host": "example.com", + "hostname": "example.com", + "port": "" + } + }, + { + "comment": "\\ is not a delimiter for non-special schemes, but still forbidden in hosts", + "href": "view-source+http://example.net/path", + "new_value": "example.com\\stuff", + "expected": { + "href": "view-source+http://example.net/path", + "host": "example.net", + "hostname": "example.net", + "port": "" + } + }, + { + "comment": "Broken IPv6", + "href": "http://example.net/", + "new_value": "[google.com]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.2.3.4x]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.2.3.]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.2.]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "http://example.net/", + "new_value": "[::1.]", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net" + } + }, + { + "href": "file://y/", + "new_value": "x:123", + "expected": { + "href": "file://y/", + "host": "y", + "hostname": "y", + "port": "" + } + }, + { + "href": "file://y/", + "new_value": "loc%41lhost", + "expected": { + "href": "file:///", + "host": "", + "hostname": "", + "port": "" + } + }, + { + "href": "sc://test@test/", + "new_value": "", + "expected": { + "href": "sc://test@test/", + "host": "test", + "hostname": "test", + "username": "test" + } + }, + { + "href": "sc://test:12/", + "new_value": "", + "expected": { + "href": "sc://test:12/", + "host": "test:12", + "hostname": "test", + "port": "12" + } + } + ], + "port": [ + { + "href": "http://example.net", + "new_value": "8080", + "expected": { + "href": "http://example.net:8080/", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Port number is removed if empty is the new value", + "href": "http://example.net:8080", + "new_value": "", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net", + "port": "" + } + }, + { + "comment": "Default port number is removed", + "href": "http://example.net:8080", + "new_value": "80", + "expected": { + "href": "http://example.net/", + "host": "example.net", + "hostname": "example.net", + "port": "" + } + }, + { + "comment": "Default port number is removed", + "href": "https://example.net:4433", + "new_value": "443", + "expected": { + "href": "https://example.net/", + "host": "example.net", + "hostname": "example.net", + "port": "" + } + }, + { + "comment": "Default port number is only removed for the relevant scheme", + "href": "https://example.net", + "new_value": "80", + "expected": { + "href": "https://example.net:80/", + "host": "example.net:80", + "hostname": "example.net", + "port": "80" + } + }, + { + "comment": "Stuff after a / delimiter is ignored", + "href": "http://example.net/path", + "new_value": "8080/stuff", + "expected": { + "href": "http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Stuff after a ? delimiter is ignored", + "href": "http://example.net/path", + "new_value": "8080?stuff", + "expected": { + "href": "http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Stuff after a # delimiter is ignored", + "href": "http://example.net/path", + "new_value": "8080#stuff", + "expected": { + "href": "http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Stuff after a \\ delimiter is ignored for special schemes", + "href": "http://example.net/path", + "new_value": "8080\\stuff", + "expected": { + "href": "http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error", + "href": "view-source+http://example.net/path", + "new_value": "8080stuff2", + "expected": { + "href": "view-source+http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error", + "href": "http://example.net/path", + "new_value": "8080stuff2", + "expected": { + "href": "http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Anything other than ASCII digit stops the port parser in a setter but is not an error", + "href": "http://example.net/path", + "new_value": "8080+2", + "expected": { + "href": "http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Port numbers are 16 bit integers", + "href": "http://example.net/path", + "new_value": "65535", + "expected": { + "href": "http://example.net:65535/path", + "host": "example.net:65535", + "hostname": "example.net", + "port": "65535" + } + }, + { + "comment": "Port numbers are 16 bit integers, overflowing is an error", + "href": "http://example.net:8080/path", + "new_value": "65536", + "expected": { + "href": "http://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "comment": "Port numbers are 16 bit integers, overflowing is an error", + "href": "non-special://example.net:8080/path", + "new_value": "65536", + "expected": { + "href": "non-special://example.net:8080/path", + "host": "example.net:8080", + "hostname": "example.net", + "port": "8080" + } + }, + { + "href": "file://test/", + "new_value": "12", + "expected": { + "href": "file://test/", + "port": "" + } + }, + { + "href": "file://localhost/", + "new_value": "12", + "expected": { + "href": "file:///", + "port": "" + } + }, + { + "href": "non-base:value", + "new_value": "12", + "expected": { + "href": "non-base:value", + "port": "" + } + }, + { + "href": "sc:///", + "new_value": "12", + "expected": { + "href": "sc:///", + "port": "" + } + }, + { + "href": "sc://x/", + "new_value": "12", + "expected": { + "href": "sc://x:12/", + "port": "12" + } + }, + { + "href": "javascript://x/", + "new_value": "12", + "expected": { + "href": "javascript://x:12/", + "port": "12" + } + } + ], + "pathname": [ + { + "comment": "Cannot-be-a-base don’t have a path", + "href": "mailto:me@example.net", + "new_value": "/foo", + "expected": { + "href": "mailto:me@example.net", + "pathname": "me@example.net" + } + }, + { + "href": "unix:/run/foo.socket?timeout=10", + "new_value": "/var/log/../run/bar.socket", + "expected": { + "href": "unix:/var/run/bar.socket?timeout=10", + "pathname": "/var/run/bar.socket" + } + }, + { + "href": "https://example.net#nav", + "new_value": "home", + "expected": { + "href": "https://example.net/home#nav", + "pathname": "/home" + } + }, + { + "href": "https://example.net#nav", + "new_value": "../home", + "expected": { + "href": "https://example.net/home#nav", + "pathname": "/home" + } + }, + { + "comment": "\\ is a segment delimiter for 'special' URLs", + "href": "http://example.net/home?lang=fr#nav", + "new_value": "\\a\\%2E\\b\\%2e.\\c", + "expected": { + "href": "http://example.net/a/c?lang=fr#nav", + "pathname": "/a/c" + } + }, + { + "comment": "\\ is *not* a segment delimiter for non-'special' URLs", + "href": "view-source+http://example.net/home?lang=fr#nav", + "new_value": "\\a\\%2E\\b\\%2e.\\c", + "expected": { + "href": "view-source+http://example.net/\\a\\%2E\\b\\%2e.\\c?lang=fr#nav", + "pathname": "/\\a\\%2E\\b\\%2e.\\c" + } + }, + { + "comment": "UTF-8 percent encoding with the default encode set. Tabs and newlines are removed.", + "href": "a:/", + "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", + "expected": { + "href": "a:/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9", + "pathname": "/%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E%3F@AZ[\\]^_%60az%7B|%7D~%7F%C2%80%C2%81%C3%89%C3%A9" + } + }, + { + "comment": "Bytes already percent-encoded are left as-is, including %2E outside dotted segments.", + "href": "http://example.net", + "new_value": "%2e%2E%c3%89té", + "expected": { + "href": "http://example.net/%2e%2E%c3%89t%C3%A9", + "pathname": "/%2e%2E%c3%89t%C3%A9" + } + }, + { + "comment": "? needs to be encoded", + "href": "http://example.net", + "new_value": "?", + "expected": { + "href": "http://example.net/%3F", + "pathname": "/%3F" + } + }, + { + "comment": "# needs to be encoded", + "href": "http://example.net", + "new_value": "#", + "expected": { + "href": "http://example.net/%23", + "pathname": "/%23" + } + }, + { + "comment": "? needs to be encoded, non-special scheme", + "href": "sc://example.net", + "new_value": "?", + "expected": { + "href": "sc://example.net/%3F", + "pathname": "/%3F" + } + }, + { + "comment": "# needs to be encoded, non-special scheme", + "href": "sc://example.net", + "new_value": "#", + "expected": { + "href": "sc://example.net/%23", + "pathname": "/%23" + } + }, + { + "comment": "File URLs and (back)slashes", + "href": "file://monkey/", + "new_value": "\\\\", + "expected": { + "href": "file://monkey/", + "pathname": "/" + } + }, + { + "comment": "File URLs and (back)slashes", + "href": "file:///unicorn", + "new_value": "//\\/", + "expected": { + "href": "file:///", + "pathname": "/" + } + }, + { + "comment": "File URLs and (back)slashes", + "href": "file:///unicorn", + "new_value": "//monkey/..//", + "expected": { + "href": "file:///", + "pathname": "/" + } + } + ], + "search": [ + { + "href": "https://example.net#nav", + "new_value": "lang=fr", + "expected": { + "href": "https://example.net/?lang=fr#nav", + "search": "?lang=fr" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "lang=fr", + "expected": { + "href": "https://example.net/?lang=fr#nav", + "search": "?lang=fr" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "?lang=fr", + "expected": { + "href": "https://example.net/?lang=fr#nav", + "search": "?lang=fr" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "??lang=fr", + "expected": { + "href": "https://example.net/??lang=fr#nav", + "search": "??lang=fr" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "?", + "expected": { + "href": "https://example.net/?#nav", + "search": "" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "", + "expected": { + "href": "https://example.net/#nav", + "search": "" + } + }, + { + "href": "https://example.net?lang=en-US", + "new_value": "", + "expected": { + "href": "https://example.net/", + "search": "" + } + }, + { + "href": "https://example.net", + "new_value": "", + "expected": { + "href": "https://example.net/", + "search": "" + } + }, + { + "comment": "UTF-8 percent encoding with the query encode set. Tabs and newlines are removed.", + "href": "a:/", + "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", + "expected": { + "href": "a:/?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9", + "search": "?%00%01%1F%20!%22%23$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_`az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" + } + }, + { + "comment": "Bytes already percent-encoded are left as-is", + "href": "http://example.net", + "new_value": "%c3%89té", + "expected": { + "href": "http://example.net/?%c3%89t%C3%A9", + "search": "?%c3%89t%C3%A9" + } + } + ], + "hash": [ + { + "href": "https://example.net", + "new_value": "main", + "expected": { + "href": "https://example.net/#main", + "hash": "#main" + } + }, + { + "href": "https://example.net#nav", + "new_value": "main", + "expected": { + "href": "https://example.net/#main", + "hash": "#main" + } + }, + { + "href": "https://example.net?lang=en-US", + "new_value": "##nav", + "expected": { + "href": "https://example.net/?lang=en-US##nav", + "hash": "##nav" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "#main", + "expected": { + "href": "https://example.net/?lang=en-US#main", + "hash": "#main" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "#", + "expected": { + "href": "https://example.net/?lang=en-US#", + "hash": "" + } + }, + { + "href": "https://example.net?lang=en-US#nav", + "new_value": "", + "expected": { + "href": "https://example.net/?lang=en-US", + "hash": "" + } + }, + { + "href": "http://example.net", + "new_value": "#foo bar", + "expected": { + "href": "http://example.net/#foo%20bar", + "hash": "#foo%20bar" + } + }, + { + "href": "http://example.net", + "new_value": "#foo\"bar", + "expected": { + "href": "http://example.net/#foo%22bar", + "hash": "#foo%22bar" + } + }, + { + "href": "http://example.net", + "new_value": "#foobar", + "expected": { + "href": "http://example.net/#foo%3Ebar", + "hash": "#foo%3Ebar" + } + }, + { + "href": "http://example.net", + "new_value": "#foo`bar", + "expected": { + "href": "http://example.net/#foo%60bar", + "hash": "#foo%60bar" + } + }, + { + "comment": "Simple percent-encoding; tabs and newlines are removed", + "href": "a:/", + "new_value": "\u0000\u0001\t\n\r\u001f !\"#$%&'()*+,-./09:;<=>?@AZ[\\]^_`az{|}~\u007f\u0080\u0081Éé", + "expected": { + "href": "a:/#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9", + "hash": "#%00%01%1F%20!%22#$%&'()*+,-./09:;%3C=%3E?@AZ[\\]^_%60az{|}~%7F%C2%80%C2%81%C3%89%C3%A9" + } + }, + { + "comment": "Percent-encode NULLs in fragment", + "href": "http://example.net", + "new_value": "a\u0000b", + "expected": { + "href": "http://example.net/#a%00b", + "hash": "#a%00b" + } + }, + { + "comment": "Percent-encode NULLs in fragment", + "href": "non-spec:/", + "new_value": "a\u0000b", + "expected": { + "href": "non-spec:/#a%00b", + "hash": "#a%00b" + } + }, + { + "comment": "Bytes already percent-encoded are left as-is", + "href": "http://example.net", + "new_value": "%c3%89té", + "expected": { + "href": "http://example.net/#%c3%89t%C3%A9", + "hash": "#%c3%89t%C3%A9" + } + }, + { + "href": "javascript:alert(1)", + "new_value": "castle", + "expected": { + "href": "javascript:alert(1)#castle", + "hash": "#castle" + } + } + ] +} diff --git a/vendor/url/tests/unit.rs b/vendor/url/tests/unit.rs new file mode 100644 index 0000000000..4c25198bd0 --- /dev/null +++ b/vendor/url/tests/unit.rs @@ -0,0 +1,681 @@ +// 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. + +//! Unit tests + +use std::borrow::Cow; +use std::cell::{Cell, RefCell}; +use std::net::{Ipv4Addr, Ipv6Addr}; +use std::path::{Path, PathBuf}; +use url::{form_urlencoded, Host, Url}; + +#[test] +fn size() { + use std::mem::size_of; + assert_eq!(size_of::(), size_of::>()); +} + +#[test] +fn test_relative() { + let base: Url = "sc://%C3%B1".parse().unwrap(); + let url = base.join("/resources/testharness.js").unwrap(); + assert_eq!(url.as_str(), "sc://%C3%B1/resources/testharness.js"); +} + +#[test] +fn test_relative_empty() { + let base: Url = "sc://%C3%B1".parse().unwrap(); + let url = base.join("").unwrap(); + assert_eq!(url.as_str(), "sc://%C3%B1"); +} + +#[test] +fn test_set_empty_host() { + let mut base: Url = "moz://foo:bar@servo/baz".parse().unwrap(); + base.set_username("").unwrap(); + assert_eq!(base.as_str(), "moz://:bar@servo/baz"); + base.set_host(None).unwrap(); + assert_eq!(base.as_str(), "moz:/baz"); + base.set_host(Some("servo")).unwrap(); + assert_eq!(base.as_str(), "moz://servo/baz"); +} + +#[test] +fn test_set_empty_hostname() { + use url::quirks; + let mut base: Url = "moz://foo@servo/baz".parse().unwrap(); + assert!( + quirks::set_hostname(&mut base, "").is_err(), + "setting an empty hostname to a url with a username should fail" + ); + base = "moz://:pass@servo/baz".parse().unwrap(); + assert!( + quirks::set_hostname(&mut base, "").is_err(), + "setting an empty hostname to a url with a password should fail" + ); + base = "moz://servo/baz".parse().unwrap(); + quirks::set_hostname(&mut base, "").unwrap(); + assert_eq!(base.as_str(), "moz:///baz"); +} + +macro_rules! assert_from_file_path { + ($path: expr) => { + assert_from_file_path!($path, $path) + }; + ($path: expr, $url_path: expr) => {{ + let url = Url::from_file_path(Path::new($path)).unwrap(); + assert_eq!(url.host(), None); + assert_eq!(url.path(), $url_path); + assert_eq!(url.to_file_path(), Ok(PathBuf::from($path))); + }}; +} + +#[test] +fn new_file_paths() { + if cfg!(unix) { + assert_eq!(Url::from_file_path(Path::new("relative")), Err(())); + assert_eq!(Url::from_file_path(Path::new("../relative")), Err(())); + } + if cfg!(windows) { + assert_eq!(Url::from_file_path(Path::new("relative")), Err(())); + assert_eq!(Url::from_file_path(Path::new(r"..\relative")), Err(())); + assert_eq!(Url::from_file_path(Path::new(r"\drive-relative")), Err(())); + assert_eq!(Url::from_file_path(Path::new(r"\\ucn\")), Err(())); + } + + if cfg!(unix) { + assert_from_file_path!("/foo/bar"); + assert_from_file_path!("/foo/ba\0r", "/foo/ba%00r"); + assert_from_file_path!("/foo/ba%00r", "/foo/ba%2500r"); + } +} + +#[test] +#[cfg(unix)] +fn new_path_bad_utf8() { + use std::ffi::OsStr; + use std::os::unix::prelude::*; + + let url = Url::from_file_path(Path::new(OsStr::from_bytes(b"/foo/ba\x80r"))).unwrap(); + let os_str = OsStr::from_bytes(b"/foo/ba\x80r"); + assert_eq!(url.to_file_path(), Ok(PathBuf::from(os_str))); +} + +#[test] +fn new_path_windows_fun() { + if cfg!(windows) { + assert_from_file_path!(r"C:\foo\bar", "/C:/foo/bar"); + assert_from_file_path!("C:\\foo\\ba\0r", "/C:/foo/ba%00r"); + + // Invalid UTF-8 + assert!(Url::parse("file:///C:/foo/ba%80r") + .unwrap() + .to_file_path() + .is_err()); + + // test windows canonicalized path + let path = PathBuf::from(r"\\?\C:\foo\bar"); + assert!(Url::from_file_path(path).is_ok()); + + // Percent-encoded drive letter + let url = Url::parse("file:///C%3A/foo/bar").unwrap(); + assert_eq!(url.to_file_path(), Ok(PathBuf::from(r"C:\foo\bar"))); + } +} + +#[test] +fn new_directory_paths() { + if cfg!(unix) { + assert_eq!(Url::from_directory_path(Path::new("relative")), Err(())); + assert_eq!(Url::from_directory_path(Path::new("../relative")), Err(())); + + let url = Url::from_directory_path(Path::new("/foo/bar")).unwrap(); + assert_eq!(url.host(), None); + assert_eq!(url.path(), "/foo/bar/"); + } + if cfg!(windows) { + assert_eq!(Url::from_directory_path(Path::new("relative")), Err(())); + assert_eq!(Url::from_directory_path(Path::new(r"..\relative")), Err(())); + assert_eq!( + Url::from_directory_path(Path::new(r"\drive-relative")), + Err(()) + ); + assert_eq!(Url::from_directory_path(Path::new(r"\\ucn\")), Err(())); + + let url = Url::from_directory_path(Path::new(r"C:\foo\bar")).unwrap(); + assert_eq!(url.host(), None); + assert_eq!(url.path(), "/C:/foo/bar/"); + } +} + +#[test] +fn path_backslash_fun() { + let mut special_url = "http://foobar.com".parse::().unwrap(); + special_url.path_segments_mut().unwrap().push("foo\\bar"); + assert_eq!(special_url.as_str(), "http://foobar.com/foo%5Cbar"); + + let mut nonspecial_url = "thing://foobar.com".parse::().unwrap(); + nonspecial_url.path_segments_mut().unwrap().push("foo\\bar"); + assert_eq!(nonspecial_url.as_str(), "thing://foobar.com/foo\\bar"); +} + +#[test] +fn from_str() { + assert!("http://testing.com/this".parse::().is_ok()); +} + +#[test] +fn parse_with_params() { + let url = Url::parse_with_params( + "http://testing.com/this?dont=clobberme", + &[("lang", "rust")], + ) + .unwrap(); + + assert_eq!( + url.as_str(), + "http://testing.com/this?dont=clobberme&lang=rust" + ); +} + +#[test] +fn issue_124() { + let url: Url = "file:a".parse().unwrap(); + assert_eq!(url.path(), "/a"); + let url: Url = "file:...".parse().unwrap(); + assert_eq!(url.path(), "/..."); + let url: Url = "file:..".parse().unwrap(); + assert_eq!(url.path(), "/"); +} + +#[test] +fn test_equality() { + use std::collections::hash_map::DefaultHasher; + use std::hash::{Hash, Hasher}; + + fn check_eq(a: &Url, b: &Url) { + assert_eq!(a, b); + + let mut h1 = DefaultHasher::new(); + a.hash(&mut h1); + let mut h2 = DefaultHasher::new(); + b.hash(&mut h2); + assert_eq!(h1.finish(), h2.finish()); + } + + fn url(s: &str) -> Url { + let rv = s.parse().unwrap(); + check_eq(&rv, &rv); + rv + } + + // Doesn't care if default port is given. + let a: Url = url("https://example.com/"); + let b: Url = url("https://example.com:443/"); + check_eq(&a, &b); + + // Different ports + let a: Url = url("http://example.com/"); + let b: Url = url("http://example.com:8080/"); + assert!(a != b, "{:?} != {:?}", a, b); + + // Different scheme + let a: Url = url("http://example.com/"); + let b: Url = url("https://example.com/"); + assert_ne!(a, b); + + // Different host + let a: Url = url("http://foo.com/"); + let b: Url = url("http://bar.com/"); + assert_ne!(a, b); + + // Missing path, automatically substituted. Semantically the same. + let a: Url = url("http://foo.com"); + let b: Url = url("http://foo.com/"); + check_eq(&a, &b); +} + +#[test] +fn host() { + fn assert_host(input: &str, host: Host<&str>) { + assert_eq!(Url::parse(input).unwrap().host(), Some(host)); + } + assert_host("http://www.mozilla.org", Host::Domain("www.mozilla.org")); + assert_host( + "http://1.35.33.49", + Host::Ipv4(Ipv4Addr::new(1, 35, 33, 49)), + ); + assert_host( + "http://[2001:0db8:85a3:08d3:1319:8a2e:0370:7344]", + Host::Ipv6(Ipv6Addr::new( + 0x2001, 0x0db8, 0x85a3, 0x08d3, 0x1319, 0x8a2e, 0x0370, 0x7344, + )), + ); + assert_host("http://1.35.+33.49", Host::Domain("1.35.+33.49")); + assert_host( + "http://[::]", + Host::Ipv6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 0)), + ); + assert_host( + "http://[::1]", + Host::Ipv6(Ipv6Addr::new(0, 0, 0, 0, 0, 0, 0, 1)), + ); + assert_host( + "http://0x1.0X23.0x21.061", + Host::Ipv4(Ipv4Addr::new(1, 35, 33, 49)), + ); + assert_host("http://0x1232131", Host::Ipv4(Ipv4Addr::new(1, 35, 33, 49))); + assert_host("http://111", Host::Ipv4(Ipv4Addr::new(0, 0, 0, 111))); + assert_host("http://2..2.3", Host::Domain("2..2.3")); + assert!(Url::parse("http://42.0x1232131").is_err()); + assert!(Url::parse("http://192.168.0.257").is_err()); + + assert_eq!(Host::Domain("foo"), Host::Domain("foo").to_owned()); + assert_ne!(Host::Domain("foo"), Host::Domain("bar").to_owned()); +} + +#[test] +fn host_serialization() { + // libstd’s `Display for Ipv6Addr` serializes 0:0:0:0:0:0:_:_ and 0:0:0:0:0:ffff:_:_ + // using IPv4-like syntax, as suggested in https://tools.ietf.org/html/rfc5952#section-4 + // but https://url.spec.whatwg.org/#concept-ipv6-serializer specifies not to. + + // Not [::0.0.0.2] / [::ffff:0.0.0.2] + assert_eq!( + Url::parse("http://[0::2]").unwrap().host_str(), + Some("[::2]") + ); + assert_eq!( + Url::parse("http://[0::ffff:0:2]").unwrap().host_str(), + Some("[::ffff:0:2]") + ); +} + +#[test] +fn test_idna() { + assert!("http://goșu.ro".parse::().is_ok()); + assert_eq!( + Url::parse("http://☃.net/").unwrap().host(), + Some(Host::Domain("xn--n3h.net")) + ); + assert!("https://r2---sn-huoa-cvhl.googlevideo.com/crossdomain.xml" + .parse::() + .is_ok()); +} + +#[test] +fn test_serialization() { + let data = [ + ("http://example.com/", "http://example.com/"), + ("http://addslash.com", "http://addslash.com/"), + ("http://@emptyuser.com/", "http://emptyuser.com/"), + ("http://:@emptypass.com/", "http://emptypass.com/"), + ("http://user@user.com/", "http://user@user.com/"), + ( + "http://user:pass@userpass.com/", + "http://user:pass@userpass.com/", + ), + ( + "http://slashquery.com/path/?q=something", + "http://slashquery.com/path/?q=something", + ), + ( + "http://noslashquery.com/path?q=something", + "http://noslashquery.com/path?q=something", + ), + ]; + for &(input, result) in &data { + let url = Url::parse(input).unwrap(); + assert_eq!(url.as_str(), result); + } +} + +#[test] +fn test_form_urlencoded() { + let pairs: &[(Cow<'_, str>, Cow<'_, str>)] = &[ + ("foo".into(), "é&".into()), + ("bar".into(), "".into()), + ("foo".into(), "#".into()), + ]; + let encoded = form_urlencoded::Serializer::new(String::new()) + .extend_pairs(pairs) + .finish(); + assert_eq!(encoded, "foo=%C3%A9%26&bar=&foo=%23"); + assert_eq!( + form_urlencoded::parse(encoded.as_bytes()).collect::>(), + pairs.to_vec() + ); +} + +#[test] +fn test_form_serialize() { + let encoded = form_urlencoded::Serializer::new(String::new()) + .append_pair("foo", "é&") + .append_pair("bar", "") + .append_pair("foo", "#") + .append_key_only("json") + .finish(); + assert_eq!(encoded, "foo=%C3%A9%26&bar=&foo=%23&json"); +} + +#[test] +fn form_urlencoded_encoding_override() { + let encoded = form_urlencoded::Serializer::new(String::new()) + .encoding_override(Some(&|s| s.as_bytes().to_ascii_uppercase().into())) + .append_pair("foo", "bar") + .append_key_only("xml") + .finish(); + assert_eq!(encoded, "FOO=BAR&XML"); +} + +#[test] +/// https://github.com/servo/rust-url/issues/61 +fn issue_61() { + let mut url = Url::parse("http://mozilla.org").unwrap(); + url.set_scheme("https").unwrap(); + assert_eq!(url.port(), None); + assert_eq!(url.port_or_known_default(), Some(443)); + url.check_invariants().unwrap(); +} + +#[test] +#[cfg(not(windows))] +/// https://github.com/servo/rust-url/issues/197 +fn issue_197() { + let mut url = Url::from_file_path("/").expect("Failed to parse path"); + url.check_invariants().unwrap(); + assert_eq!( + url, + Url::parse("file:///").expect("Failed to parse path + protocol") + ); + url.path_segments_mut() + .expect("path_segments_mut") + .pop_if_empty(); +} + +#[test] +fn issue_241() { + Url::parse("mailto:").unwrap().cannot_be_a_base(); +} + +#[test] +/// https://github.com/servo/rust-url/issues/222 +fn append_trailing_slash() { + let mut url: Url = "http://localhost:6767/foo/bar?a=b".parse().unwrap(); + url.check_invariants().unwrap(); + url.path_segments_mut().unwrap().push(""); + url.check_invariants().unwrap(); + assert_eq!(url.to_string(), "http://localhost:6767/foo/bar/?a=b"); +} + +#[test] +/// https://github.com/servo/rust-url/issues/227 +fn extend_query_pairs_then_mutate() { + let mut url: Url = "http://localhost:6767/foo/bar".parse().unwrap(); + url.query_pairs_mut() + .extend_pairs(vec![("auth", "my-token")].into_iter()); + url.check_invariants().unwrap(); + assert_eq!( + url.to_string(), + "http://localhost:6767/foo/bar?auth=my-token" + ); + url.path_segments_mut().unwrap().push("some_other_path"); + url.check_invariants().unwrap(); + assert_eq!( + url.to_string(), + "http://localhost:6767/foo/bar/some_other_path?auth=my-token" + ); +} + +#[test] +/// https://github.com/servo/rust-url/issues/222 +fn append_empty_segment_then_mutate() { + let mut url: Url = "http://localhost:6767/foo/bar?a=b".parse().unwrap(); + url.check_invariants().unwrap(); + url.path_segments_mut().unwrap().push("").pop(); + url.check_invariants().unwrap(); + assert_eq!(url.to_string(), "http://localhost:6767/foo/bar?a=b"); +} + +#[test] +/// https://github.com/servo/rust-url/issues/243 +fn test_set_host() { + let mut url = Url::parse("https://example.net/hello").unwrap(); + url.set_host(Some("foo.com")).unwrap(); + assert_eq!(url.as_str(), "https://foo.com/hello"); + assert!(url.set_host(None).is_err()); + assert_eq!(url.as_str(), "https://foo.com/hello"); + assert!(url.set_host(Some("")).is_err()); + assert_eq!(url.as_str(), "https://foo.com/hello"); + + let mut url = Url::parse("foobar://example.net/hello").unwrap(); + url.set_host(None).unwrap(); + assert_eq!(url.as_str(), "foobar:/hello"); + + let mut url = Url::parse("foo://ș").unwrap(); + assert_eq!(url.as_str(), "foo://%C8%99"); + url.set_host(Some("goșu.ro")).unwrap(); + assert_eq!(url.as_str(), "foo://go%C8%99u.ro"); +} + +#[test] +// https://github.com/servo/rust-url/issues/166 +fn test_leading_dots() { + assert_eq!( + Host::parse(".org").unwrap(), + Host::Domain(".org".to_owned()) + ); + assert_eq!(Url::parse("file://./foo").unwrap().domain(), Some(".")); +} + +#[test] +/// https://github.com/servo/rust-url/issues/302 +fn test_origin_hash() { + use std::collections::hash_map::DefaultHasher; + use std::hash::{Hash, Hasher}; + + fn hash(value: &T) -> u64 { + let mut hasher = DefaultHasher::new(); + value.hash(&mut hasher); + hasher.finish() + } + + let origin = &Url::parse("http://example.net/").unwrap().origin(); + + let origins_to_compare = [ + Url::parse("http://example.net:80/").unwrap().origin(), + Url::parse("http://example.net:81/").unwrap().origin(), + Url::parse("http://example.net").unwrap().origin(), + Url::parse("http://example.net/hello").unwrap().origin(), + Url::parse("https://example.net").unwrap().origin(), + Url::parse("ftp://example.net").unwrap().origin(), + Url::parse("file://example.net").unwrap().origin(), + Url::parse("http://user@example.net/").unwrap().origin(), + Url::parse("http://user:pass@example.net/") + .unwrap() + .origin(), + ]; + + for origin_to_compare in &origins_to_compare { + if origin == origin_to_compare { + assert_eq!(hash(origin), hash(origin_to_compare)); + } else { + assert_ne!(hash(origin), hash(origin_to_compare)); + } + } + + let opaque_origin = Url::parse("file://example.net").unwrap().origin(); + let same_opaque_origin = Url::parse("file://example.net").unwrap().origin(); + let other_opaque_origin = Url::parse("file://other").unwrap().origin(); + + assert_ne!(hash(&opaque_origin), hash(&same_opaque_origin)); + assert_ne!(hash(&opaque_origin), hash(&other_opaque_origin)); +} + +#[test] +fn test_windows_unc_path() { + if !cfg!(windows) { + return; + } + + let url = Url::from_file_path(Path::new(r"\\host\share\path\file.txt")).unwrap(); + assert_eq!(url.as_str(), "file://host/share/path/file.txt"); + + let url = Url::from_file_path(Path::new(r"\\höst\share\path\file.txt")).unwrap(); + assert_eq!(url.as_str(), "file://xn--hst-sna/share/path/file.txt"); + + let url = Url::from_file_path(Path::new(r"\\192.168.0.1\share\path\file.txt")).unwrap(); + assert_eq!(url.host(), Some(Host::Ipv4(Ipv4Addr::new(192, 168, 0, 1)))); + + let path = url.to_file_path().unwrap(); + assert_eq!(path.to_str(), Some(r"\\192.168.0.1\share\path\file.txt")); + + // Another way to write these: + let url = Url::from_file_path(Path::new(r"\\?\UNC\host\share\path\file.txt")).unwrap(); + assert_eq!(url.as_str(), "file://host/share/path/file.txt"); + + // Paths starting with "\\.\" (Local Device Paths) are intentionally not supported. + let url = Url::from_file_path(Path::new(r"\\.\some\path\file.txt")); + assert!(url.is_err()); +} + +#[test] +fn test_syntax_violation_callback() { + use url::SyntaxViolation::*; + let violation = Cell::new(None); + let url = Url::options() + .syntax_violation_callback(Some(&|v| violation.set(Some(v)))) + .parse("http:////mozilla.org:42") + .unwrap(); + assert_eq!(url.port(), Some(42)); + + let v = violation.take().unwrap(); + assert_eq!(v, ExpectedDoubleSlash); + assert_eq!(v.description(), "expected //"); + assert_eq!(v.to_string(), "expected //"); +} + +#[test] +fn test_syntax_violation_callback_lifetimes() { + use url::SyntaxViolation::*; + let violation = Cell::new(None); + let vfn = |s| violation.set(Some(s)); + + let url = Url::options() + .syntax_violation_callback(Some(&vfn)) + .parse("http:////mozilla.org:42") + .unwrap(); + assert_eq!(url.port(), Some(42)); + assert_eq!(violation.take(), Some(ExpectedDoubleSlash)); + + let url = Url::options() + .syntax_violation_callback(Some(&vfn)) + .parse("http://mozilla.org\\path") + .unwrap(); + assert_eq!(url.path(), "/path"); + assert_eq!(violation.take(), Some(Backslash)); +} + +#[test] +fn test_options_reuse() { + use url::SyntaxViolation::*; + let violations = RefCell::new(Vec::new()); + let vfn = |v| violations.borrow_mut().push(v); + + let options = Url::options().syntax_violation_callback(Some(&vfn)); + let url = options.parse("http:////mozilla.org").unwrap(); + + let options = options.base_url(Some(&url)); + let url = options.parse("/sub\\path").unwrap(); + assert_eq!(url.as_str(), "http://mozilla.org/sub/path"); + assert_eq!(*violations.borrow(), vec!(ExpectedDoubleSlash, Backslash)); +} + +/// https://github.com/servo/rust-url/issues/505 +#[cfg(windows)] +#[test] +fn test_url_from_file_path() { + use std::path::PathBuf; + use url::Url; + + let p = PathBuf::from("c:///"); + let u = Url::from_file_path(p).unwrap(); + let path = u.to_file_path().unwrap(); + assert_eq!("C:\\", path.to_str().unwrap()); +} + +/// https://github.com/servo/rust-url/issues/505 +#[cfg(not(windows))] +#[test] +fn test_url_from_file_path() { + use std::path::PathBuf; + use url::Url; + + let p = PathBuf::from("/c:/"); + let u = Url::from_file_path(p).unwrap(); + let path = u.to_file_path().unwrap(); + assert_eq!("/c:/", path.to_str().unwrap()); +} + +#[test] +fn test_non_special_path() { + let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap(); + assert_eq!(db_url.as_str(), "postgres://postgres@localhost/"); + db_url.set_path("diesel_foo"); + assert_eq!(db_url.as_str(), "postgres://postgres@localhost/diesel_foo"); + assert_eq!(db_url.path(), "/diesel_foo"); +} + +#[test] +fn test_non_special_path2() { + let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap(); + assert_eq!(db_url.as_str(), "postgres://postgres@localhost/"); + db_url.set_path(""); + assert_eq!(db_url.path(), ""); + assert_eq!(db_url.as_str(), "postgres://postgres@localhost"); + db_url.set_path("foo"); + assert_eq!(db_url.path(), "/foo"); + assert_eq!(db_url.as_str(), "postgres://postgres@localhost/foo"); + db_url.set_path("/bar"); + assert_eq!(db_url.path(), "/bar"); + assert_eq!(db_url.as_str(), "postgres://postgres@localhost/bar"); +} + +#[test] +fn test_non_special_path3() { + let mut db_url = url::Url::parse("postgres://postgres@localhost/").unwrap(); + assert_eq!(db_url.as_str(), "postgres://postgres@localhost/"); + db_url.set_path("/"); + assert_eq!(db_url.as_str(), "postgres://postgres@localhost/"); + assert_eq!(db_url.path(), "/"); + db_url.set_path("/foo"); + assert_eq!(db_url.as_str(), "postgres://postgres@localhost/foo"); + assert_eq!(db_url.path(), "/foo"); +} + +#[test] +fn test_set_scheme_to_file_with_host() { + let mut url: Url = "http://localhost:6767/foo/bar".parse().unwrap(); + let result = url.set_scheme("file"); + assert_eq!(url.to_string(), "http://localhost:6767/foo/bar"); + assert_eq!(result, Err(())); +} + +#[test] +fn no_panic() { + let mut url = Url::parse("arhttpsps:/.//eom/dae.com/\\\\t\\:").unwrap(); + url::quirks::set_hostname(&mut url, "//eom/datcom/\\\\t\\://eom/data.cs").unwrap(); +} + +#[test] +fn pop_if_empty_in_bounds() { + let mut url = Url::parse("m://").unwrap(); + let mut segments = url.path_segments_mut().unwrap(); + segments.pop_if_empty(); + segments.pop(); +} diff --git a/vendor/url/tests/urltestdata.json b/vendor/url/tests/urltestdata.json new file mode 100644 index 0000000000..554e61914b --- /dev/null +++ b/vendor/url/tests/urltestdata.json @@ -0,0 +1,6991 @@ +[ + "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/segments.js", + "# AS OF https://github.com/jsdom/whatwg-url/commit/35f04dfd3048cf6362f4398745bb13375c5020c2", + { + "input": "http://example\t.\norg", + "base": "http://example.org/foo/bar", + "href": "http://example.org/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://user:pass@foo:21/bar;par?b#c", + "base": "http://example.org/foo/bar", + "href": "http://user:pass@foo:21/bar;par?b#c", + "origin": "http://foo:21", + "protocol": "http:", + "username": "user", + "password": "pass", + "host": "foo:21", + "hostname": "foo", + "port": "21", + "pathname": "/bar;par", + "search": "?b", + "hash": "#c" + }, + { + "input": "https://test:@test", + "base": "about:blank", + "href": "https://test@test/", + "origin": "https://test", + "protocol": "https:", + "username": "test", + "password": "", + "host": "test", + "hostname": "test", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https://:@test", + "base": "about:blank", + "href": "https://test/", + "origin": "https://test", + "protocol": "https:", + "username": "", + "password": "", + "host": "test", + "hostname": "test", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "non-special://test:@test/x", + "base": "about:blank", + "href": "non-special://test@test/x", + "origin": "null", + "protocol": "non-special:", + "username": "test", + "password": "", + "host": "test", + "hostname": "test", + "port": "", + "pathname": "/x", + "search": "", + "hash": "" + }, + { + "input": "non-special://:@test/x", + "base": "about:blank", + "href": "non-special://test/x", + "origin": "null", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "test", + "hostname": "test", + "port": "", + "pathname": "/x", + "search": "", + "hash": "" + }, + { + "input": "http:foo.com", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/foo.com", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/foo.com", + "search": "", + "hash": "" + }, + { + "input": "\t :foo.com \n", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:foo.com", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:foo.com", + "search": "", + "hash": "" + }, + { + "input": " foo.com ", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/foo.com", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/foo.com", + "search": "", + "hash": "" + }, + { + "input": "a:\t foo.com", + "base": "http://example.org/foo/bar", + "href": "a: foo.com", + "origin": "null", + "protocol": "a:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": " foo.com", + "search": "", + "hash": "" + }, + { + "input": "http://f:21/ b ? d # e ", + "base": "http://example.org/foo/bar", + "href": "http://f:21/%20b%20?%20d%20#%20e", + "origin": "http://f:21", + "protocol": "http:", + "username": "", + "password": "", + "host": "f:21", + "hostname": "f", + "port": "21", + "pathname": "/%20b%20", + "search": "?%20d%20", + "hash": "#%20e" + }, + { + "input": "lolscheme:x x#x x", + "base": "about:blank", + "href": "lolscheme:x x#x%20x", + "protocol": "lolscheme:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "x x", + "search": "", + "hash": "#x%20x" + }, + { + "input": "http://f:/c", + "base": "http://example.org/foo/bar", + "href": "http://f/c", + "origin": "http://f", + "protocol": "http:", + "username": "", + "password": "", + "host": "f", + "hostname": "f", + "port": "", + "pathname": "/c", + "search": "", + "hash": "" + }, + { + "input": "http://f:0/c", + "base": "http://example.org/foo/bar", + "href": "http://f:0/c", + "origin": "http://f:0", + "protocol": "http:", + "username": "", + "password": "", + "host": "f:0", + "hostname": "f", + "port": "0", + "pathname": "/c", + "search": "", + "hash": "" + }, + { + "input": "http://f:00000000000000/c", + "base": "http://example.org/foo/bar", + "href": "http://f:0/c", + "origin": "http://f:0", + "protocol": "http:", + "username": "", + "password": "", + "host": "f:0", + "hostname": "f", + "port": "0", + "pathname": "/c", + "search": "", + "hash": "" + }, + { + "input": "http://f:00000000000000000000080/c", + "base": "http://example.org/foo/bar", + "href": "http://f/c", + "origin": "http://f", + "protocol": "http:", + "username": "", + "password": "", + "host": "f", + "hostname": "f", + "port": "", + "pathname": "/c", + "search": "", + "hash": "" + }, + { + "input": "http://f:b/c", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://f: /c", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://f:\n/c", + "base": "http://example.org/foo/bar", + "href": "http://f/c", + "origin": "http://f", + "protocol": "http:", + "username": "", + "password": "", + "host": "f", + "hostname": "f", + "port": "", + "pathname": "/c", + "search": "", + "hash": "" + }, + { + "input": "http://f:fifty-two/c", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://f:999999/c", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "non-special://f:999999/c", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://f: 21 / b ? d # e ", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "" + }, + { + "input": " \t", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "" + }, + { + "input": ":foo.com/", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:foo.com/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:foo.com/", + "search": "", + "hash": "" + }, + { + "input": ":foo.com\\", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:foo.com/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:foo.com/", + "search": "", + "hash": "" + }, + { + "input": ":", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:", + "search": "", + "hash": "" + }, + { + "input": ":a", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:a", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:a", + "search": "", + "hash": "" + }, + { + "input": ":/", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:/", + "search": "", + "hash": "" + }, + { + "input": ":\\", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:/", + "search": "", + "hash": "" + }, + { + "input": ":#", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:#", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:", + "search": "", + "hash": "" + }, + { + "input": "#", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar#", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "#/", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar#/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "#/" + }, + { + "input": "#\\", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar#\\", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "#\\" + }, + { + "input": "#;?", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar#;?", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "#;?" + }, + { + "input": "?", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar?", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "/", + "base": "http://example.org/foo/bar", + "href": "http://example.org/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": ":23", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:23", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:23", + "search": "", + "hash": "" + }, + { + "input": "/:23", + "base": "http://example.org/foo/bar", + "href": "http://example.org/:23", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/:23", + "search": "", + "hash": "" + }, + { + "input": "::", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/::", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/::", + "search": "", + "hash": "" + }, + { + "input": "::23", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/::23", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/::23", + "search": "", + "hash": "" + }, + { + "input": "foo://", + "base": "http://example.org/foo/bar", + "href": "foo://", + "origin": "null", + "protocol": "foo:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "", + "search": "", + "hash": "" + }, + { + "input": "http://a:b@c:29/d", + "base": "http://example.org/foo/bar", + "href": "http://a:b@c:29/d", + "origin": "http://c:29", + "protocol": "http:", + "username": "a", + "password": "b", + "host": "c:29", + "hostname": "c", + "port": "29", + "pathname": "/d", + "search": "", + "hash": "" + }, + { + "input": "http::@c:29", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/:@c:29", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/:@c:29", + "search": "", + "hash": "" + }, + { + "input": "http://&a:foo(b]c@d:2/", + "base": "http://example.org/foo/bar", + "href": "http://&a:foo(b%5Dc@d:2/", + "origin": "http://d:2", + "protocol": "http:", + "username": "&a", + "password": "foo(b%5Dc", + "host": "d:2", + "hostname": "d", + "port": "2", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://::@c@d:2", + "base": "http://example.org/foo/bar", + "href": "http://:%3A%40c@d:2/", + "origin": "http://d:2", + "protocol": "http:", + "username": "", + "password": "%3A%40c", + "host": "d:2", + "hostname": "d", + "port": "2", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://foo.com:b@d/", + "base": "http://example.org/foo/bar", + "href": "http://foo.com:b@d/", + "origin": "http://d", + "protocol": "http:", + "username": "foo.com", + "password": "b", + "host": "d", + "hostname": "d", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://foo.com/\\@", + "base": "http://example.org/foo/bar", + "href": "http://foo.com//@", + "origin": "http://foo.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo.com", + "hostname": "foo.com", + "port": "", + "pathname": "//@", + "search": "", + "hash": "" + }, + { + "input": "http:\\\\foo.com\\", + "base": "http://example.org/foo/bar", + "href": "http://foo.com/", + "origin": "http://foo.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo.com", + "hostname": "foo.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:\\\\a\\b:c\\d@foo.com\\", + "base": "http://example.org/foo/bar", + "href": "http://a/b:c/d@foo.com/", + "origin": "http://a", + "protocol": "http:", + "username": "", + "password": "", + "host": "a", + "hostname": "a", + "port": "", + "pathname": "/b:c/d@foo.com/", + "search": "", + "hash": "" + }, + { + "input": "foo:/", + "base": "http://example.org/foo/bar", + "href": "foo:/", + "origin": "null", + "protocol": "foo:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "foo:/bar.com/", + "base": "http://example.org/foo/bar", + "href": "foo:/bar.com/", + "origin": "null", + "protocol": "foo:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/bar.com/", + "search": "", + "hash": "" + }, + { + "input": "foo://///////", + "base": "http://example.org/foo/bar", + "href": "foo://///////", + "origin": "null", + "protocol": "foo:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "///////", + "search": "", + "hash": "" + }, + { + "input": "foo://///////bar.com/", + "base": "http://example.org/foo/bar", + "href": "foo://///////bar.com/", + "origin": "null", + "protocol": "foo:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "///////bar.com/", + "search": "", + "hash": "" + }, + { + "input": "foo:////://///", + "base": "http://example.org/foo/bar", + "href": "foo:////://///", + "origin": "null", + "protocol": "foo:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "//://///", + "search": "", + "hash": "" + }, + { + "input": "c:/foo", + "base": "http://example.org/foo/bar", + "href": "c:/foo", + "origin": "null", + "protocol": "c:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/foo", + "search": "", + "hash": "" + }, + { + "input": "//foo/bar", + "base": "http://example.org/foo/bar", + "href": "http://foo/bar", + "origin": "http://foo", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/bar", + "search": "", + "hash": "" + }, + { + "input": "http://foo/path;a??e#f#g", + "base": "http://example.org/foo/bar", + "href": "http://foo/path;a??e#f#g", + "origin": "http://foo", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/path;a", + "search": "??e", + "hash": "#f#g" + }, + { + "input": "http://foo/abcd?efgh?ijkl", + "base": "http://example.org/foo/bar", + "href": "http://foo/abcd?efgh?ijkl", + "origin": "http://foo", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/abcd", + "search": "?efgh?ijkl", + "hash": "" + }, + { + "input": "http://foo/abcd#foo?bar", + "base": "http://example.org/foo/bar", + "href": "http://foo/abcd#foo?bar", + "origin": "http://foo", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/abcd", + "search": "", + "hash": "#foo?bar" + }, + { + "input": "[61:24:74]:98", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/[61:24:74]:98", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/[61:24:74]:98", + "search": "", + "hash": "" + }, + { + "input": "http:[61:27]/:foo", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/[61:27]/:foo", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/[61:27]/:foo", + "search": "", + "hash": "" + }, + { + "input": "http://[1::2]:3:4", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://2001::1", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://2001::1]", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://2001::1]:80", + "base": "http://example.org/foo/bar", + "failure": true + }, + { + "input": "http://[2001::1]", + "base": "http://example.org/foo/bar", + "href": "http://[2001::1]/", + "origin": "http://[2001::1]", + "protocol": "http:", + "username": "", + "password": "", + "host": "[2001::1]", + "hostname": "[2001::1]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://[::127.0.0.1]", + "base": "http://example.org/foo/bar", + "href": "http://[::7f00:1]/", + "origin": "http://[::7f00:1]", + "protocol": "http:", + "username": "", + "password": "", + "host": "[::7f00:1]", + "hostname": "[::7f00:1]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://[0:0:0:0:0:0:13.1.68.3]", + "base": "http://example.org/foo/bar", + "href": "http://[::d01:4403]/", + "origin": "http://[::d01:4403]", + "protocol": "http:", + "username": "", + "password": "", + "host": "[::d01:4403]", + "hostname": "[::d01:4403]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://[2001::1]:80", + "base": "http://example.org/foo/bar", + "href": "http://[2001::1]/", + "origin": "http://[2001::1]", + "protocol": "http:", + "username": "", + "password": "", + "host": "[2001::1]", + "hostname": "[2001::1]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:/example.com/", + "base": "http://example.org/foo/bar", + "href": "http://example.org/example.com/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "ftp:/example.com/", + "base": "http://example.org/foo/bar", + "href": "ftp://example.com/", + "origin": "ftp://example.com", + "protocol": "ftp:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https:/example.com/", + "base": "http://example.org/foo/bar", + "href": "https://example.com/", + "origin": "https://example.com", + "protocol": "https:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "madeupscheme:/example.com/", + "base": "http://example.org/foo/bar", + "href": "madeupscheme:/example.com/", + "origin": "null", + "protocol": "madeupscheme:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "file:/example.com/", + "base": "http://example.org/foo/bar", + "href": "file:///example.com/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "file://example:1/", + "base": "about:blank", + "failure": true + }, + { + "input": "file://example:test/", + "base": "about:blank", + "failure": true + }, + { + "input": "file://example%/", + "base": "about:blank", + "failure": true + }, + { + "input": "file://[example]/", + "base": "about:blank", + "failure": true + }, + { + "input": "ftps:/example.com/", + "base": "http://example.org/foo/bar", + "href": "ftps:/example.com/", + "origin": "null", + "protocol": "ftps:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "gopher:/example.com/", + "base": "http://example.org/foo/bar", + "href": "gopher:/example.com/", + "origin": "null", + "protocol": "gopher:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "ws:/example.com/", + "base": "http://example.org/foo/bar", + "href": "ws://example.com/", + "origin": "ws://example.com", + "protocol": "ws:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss:/example.com/", + "base": "http://example.org/foo/bar", + "href": "wss://example.com/", + "origin": "wss://example.com", + "protocol": "wss:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "data:/example.com/", + "base": "http://example.org/foo/bar", + "href": "data:/example.com/", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "javascript:/example.com/", + "base": "http://example.org/foo/bar", + "href": "javascript:/example.com/", + "origin": "null", + "protocol": "javascript:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "mailto:/example.com/", + "base": "http://example.org/foo/bar", + "href": "mailto:/example.com/", + "origin": "null", + "protocol": "mailto:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "http:example.com/", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/example.com/", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/example.com/", + "search": "", + "hash": "" + }, + { + "input": "ftp:example.com/", + "base": "http://example.org/foo/bar", + "href": "ftp://example.com/", + "origin": "ftp://example.com", + "protocol": "ftp:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https:example.com/", + "base": "http://example.org/foo/bar", + "href": "https://example.com/", + "origin": "https://example.com", + "protocol": "https:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "madeupscheme:example.com/", + "base": "http://example.org/foo/bar", + "href": "madeupscheme:example.com/", + "origin": "null", + "protocol": "madeupscheme:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "ftps:example.com/", + "base": "http://example.org/foo/bar", + "href": "ftps:example.com/", + "origin": "null", + "protocol": "ftps:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "gopher:example.com/", + "base": "http://example.org/foo/bar", + "href": "gopher:example.com/", + "origin": "null", + "protocol": "gopher:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "ws:example.com/", + "base": "http://example.org/foo/bar", + "href": "ws://example.com/", + "origin": "ws://example.com", + "protocol": "ws:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss:example.com/", + "base": "http://example.org/foo/bar", + "href": "wss://example.com/", + "origin": "wss://example.com", + "protocol": "wss:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "data:example.com/", + "base": "http://example.org/foo/bar", + "href": "data:example.com/", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "javascript:example.com/", + "base": "http://example.org/foo/bar", + "href": "javascript:example.com/", + "origin": "null", + "protocol": "javascript:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "mailto:example.com/", + "base": "http://example.org/foo/bar", + "href": "mailto:example.com/", + "origin": "null", + "protocol": "mailto:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "/a/b/c", + "base": "http://example.org/foo/bar", + "href": "http://example.org/a/b/c", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/a/b/c", + "search": "", + "hash": "" + }, + { + "input": "/a/ /c", + "base": "http://example.org/foo/bar", + "href": "http://example.org/a/%20/c", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/a/%20/c", + "search": "", + "hash": "" + }, + { + "input": "/a%2fc", + "base": "http://example.org/foo/bar", + "href": "http://example.org/a%2fc", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/a%2fc", + "search": "", + "hash": "" + }, + { + "input": "/a/%2f/c", + "base": "http://example.org/foo/bar", + "href": "http://example.org/a/%2f/c", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/a/%2f/c", + "search": "", + "hash": "" + }, + { + "input": "#β", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar#%CE%B2", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "#%CE%B2" + }, + { + "input": "data:text/html,test#test", + "base": "http://example.org/foo/bar", + "href": "data:text/html,test#test", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "text/html,test", + "search": "", + "hash": "#test" + }, + { + "input": "tel:1234567890", + "base": "http://example.org/foo/bar", + "href": "tel:1234567890", + "origin": "null", + "protocol": "tel:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "1234567890", + "search": "", + "hash": "" + }, + "# Based on https://felixfbecker.github.io/whatwg-url-custom-host-repro/", + { + "input": "ssh://example.com/foo/bar.git", + "base": "http://example.org/", + "href": "ssh://example.com/foo/bar.git", + "origin": "null", + "protocol": "ssh:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/bar.git", + "search": "", + "hash": "" + }, + "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/file.html", + { + "input": "file:c:\\foo\\bar.html", + "base": "file:///tmp/mock/path", + "href": "file:///c:/foo/bar.html", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/c:/foo/bar.html", + "search": "", + "hash": "" + }, + { + "input": " File:c|////foo\\bar.html", + "base": "file:///tmp/mock/path", + "href": "file:///c:////foo/bar.html", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/c:////foo/bar.html", + "search": "", + "hash": "" + }, + { + "input": "C|/foo/bar", + "base": "file:///tmp/mock/path", + "href": "file:///C:/foo/bar", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "/C|\\foo\\bar", + "base": "file:///tmp/mock/path", + "href": "file:///C:/foo/bar", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "//C|/foo/bar", + "base": "file:///tmp/mock/path", + "href": "file:///C:/foo/bar", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "//server/file", + "base": "file:///tmp/mock/path", + "href": "file://server/file", + "protocol": "file:", + "username": "", + "password": "", + "host": "server", + "hostname": "server", + "port": "", + "pathname": "/file", + "search": "", + "hash": "" + }, + { + "input": "\\\\server\\file", + "base": "file:///tmp/mock/path", + "href": "file://server/file", + "protocol": "file:", + "username": "", + "password": "", + "host": "server", + "hostname": "server", + "port": "", + "pathname": "/file", + "search": "", + "hash": "" + }, + { + "input": "/\\server/file", + "base": "file:///tmp/mock/path", + "href": "file://server/file", + "protocol": "file:", + "username": "", + "password": "", + "host": "server", + "hostname": "server", + "port": "", + "pathname": "/file", + "search": "", + "hash": "" + }, + { + "input": "file:///foo/bar.txt", + "base": "file:///tmp/mock/path", + "href": "file:///foo/bar.txt", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/foo/bar.txt", + "search": "", + "hash": "" + }, + { + "input": "file:///home/me", + "base": "file:///tmp/mock/path", + "href": "file:///home/me", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/home/me", + "search": "", + "hash": "" + }, + { + "input": "//", + "base": "file:///tmp/mock/path", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "///", + "base": "file:///tmp/mock/path", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "///test", + "base": "file:///tmp/mock/path", + "href": "file:///test", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "", + "hash": "" + }, + { + "input": "file://test", + "base": "file:///tmp/mock/path", + "href": "file://test/", + "protocol": "file:", + "username": "", + "password": "", + "host": "test", + "hostname": "test", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file://localhost", + "base": "file:///tmp/mock/path", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file://localhost/", + "base": "file:///tmp/mock/path", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file://localhost/test", + "base": "file:///tmp/mock/path", + "href": "file:///test", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "", + "hash": "" + }, + { + "input": "test", + "base": "file:///tmp/mock/path", + "href": "file:///tmp/mock/test", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/tmp/mock/test", + "search": "", + "hash": "" + }, + { + "input": "file:test", + "base": "file:///tmp/mock/path", + "href": "file:///tmp/mock/test", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/tmp/mock/test", + "search": "", + "hash": "" + }, + "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/path.js", + { + "input": "http://example.com/././foo", + "base": "about:blank", + "href": "http://example.com/foo", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/./.foo", + "base": "about:blank", + "href": "http://example.com/.foo", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/.foo", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/.", + "base": "about:blank", + "href": "http://example.com/foo/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/./", + "base": "about:blank", + "href": "http://example.com/foo/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/bar/..", + "base": "about:blank", + "href": "http://example.com/foo/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/bar/../", + "base": "about:blank", + "href": "http://example.com/foo/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/..bar", + "base": "about:blank", + "href": "http://example.com/foo/..bar", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/..bar", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/bar/../ton", + "base": "about:blank", + "href": "http://example.com/foo/ton", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/ton", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/bar/../ton/../../a", + "base": "about:blank", + "href": "http://example.com/a", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/a", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/../../..", + "base": "about:blank", + "href": "http://example.com/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/../../../ton", + "base": "about:blank", + "href": "http://example.com/ton", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/ton", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/%2e", + "base": "about:blank", + "href": "http://example.com/foo/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/%2e%2", + "base": "about:blank", + "href": "http://example.com/foo/%2e%2", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/%2e%2", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/%2e./%2e%2e/.%2e/%2e.bar", + "base": "about:blank", + "href": "http://example.com/%2e.bar", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%2e.bar", + "search": "", + "hash": "" + }, + { + "input": "http://example.com////../..", + "base": "about:blank", + "href": "http://example.com//", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "//", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/bar//../..", + "base": "about:blank", + "href": "http://example.com/foo/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo/bar//..", + "base": "about:blank", + "href": "http://example.com/foo/bar/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo/bar/", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo", + "base": "about:blank", + "href": "http://example.com/foo", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/%20foo", + "base": "about:blank", + "href": "http://example.com/%20foo", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%20foo", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo%", + "base": "about:blank", + "href": "http://example.com/foo%", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo%", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo%2", + "base": "about:blank", + "href": "http://example.com/foo%2", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo%2", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo%2zbar", + "base": "about:blank", + "href": "http://example.com/foo%2zbar", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo%2zbar", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo%2©zbar", + "base": "about:blank", + "href": "http://example.com/foo%2%C3%82%C2%A9zbar", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo%2%C3%82%C2%A9zbar", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo%41%7a", + "base": "about:blank", + "href": "http://example.com/foo%41%7a", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo%41%7a", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo\t\u0091%91", + "base": "about:blank", + "href": "http://example.com/foo%C2%91%91", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo%C2%91%91", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo%00%51", + "base": "about:blank", + "href": "http://example.com/foo%00%51", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foo%00%51", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/(%28:%3A%29)", + "base": "about:blank", + "href": "http://example.com/(%28:%3A%29)", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/(%28:%3A%29)", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/%3A%3a%3C%3c", + "base": "about:blank", + "href": "http://example.com/%3A%3a%3C%3c", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%3A%3a%3C%3c", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/foo\tbar", + "base": "about:blank", + "href": "http://example.com/foobar", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/foobar", + "search": "", + "hash": "" + }, + { + "input": "http://example.com\\\\foo\\\\bar", + "base": "about:blank", + "href": "http://example.com//foo//bar", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "//foo//bar", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd", + "base": "about:blank", + "href": "http://example.com/%7Ffp3%3Eju%3Dduvgw%3Dd", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%7Ffp3%3Eju%3Dduvgw%3Dd", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/@asdf%40", + "base": "about:blank", + "href": "http://example.com/@asdf%40", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/@asdf%40", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/你好你好", + "base": "about:blank", + "href": "http://example.com/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%E4%BD%A0%E5%A5%BD%E4%BD%A0%E5%A5%BD", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/‥/foo", + "base": "about:blank", + "href": "http://example.com/%E2%80%A5/foo", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%E2%80%A5/foo", + "search": "", + "hash": "" + }, + { + "input": "http://example.com//foo", + "base": "about:blank", + "href": "http://example.com/%EF%BB%BF/foo", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%EF%BB%BF/foo", + "search": "", + "hash": "" + }, + { + "input": "http://example.com/‮/foo/‭/bar", + "base": "about:blank", + "href": "http://example.com/%E2%80%AE/foo/%E2%80%AD/bar", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/%E2%80%AE/foo/%E2%80%AD/bar", + "search": "", + "hash": "" + }, + "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/script-tests/relative.js", + { + "input": "http://www.google.com/foo?bar=baz#", + "base": "about:blank", + "href": "http://www.google.com/foo?bar=baz#", + "origin": "http://www.google.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.google.com", + "hostname": "www.google.com", + "port": "", + "pathname": "/foo", + "search": "?bar=baz", + "hash": "" + }, + { + "input": "http://www.google.com/foo?bar=baz# »", + "base": "about:blank", + "href": "http://www.google.com/foo?bar=baz#%20%C2%BB", + "origin": "http://www.google.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.google.com", + "hostname": "www.google.com", + "port": "", + "pathname": "/foo", + "search": "?bar=baz", + "hash": "#%20%C2%BB" + }, + { + "input": "data:test# »", + "base": "about:blank", + "href": "data:test#%20%C2%BB", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "test", + "search": "", + "hash": "#%20%C2%BB" + }, + { + "input": "http://www.google.com", + "base": "about:blank", + "href": "http://www.google.com/", + "origin": "http://www.google.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.google.com", + "hostname": "www.google.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://192.0x00A80001", + "base": "about:blank", + "href": "http://192.168.0.1/", + "origin": "http://192.168.0.1", + "protocol": "http:", + "username": "", + "password": "", + "host": "192.168.0.1", + "hostname": "192.168.0.1", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://www/foo%2Ehtml", + "base": "about:blank", + "href": "http://www/foo%2Ehtml", + "origin": "http://www", + "protocol": "http:", + "username": "", + "password": "", + "host": "www", + "hostname": "www", + "port": "", + "pathname": "/foo%2Ehtml", + "search": "", + "hash": "" + }, + { + "input": "http://www/foo/%2E/html", + "base": "about:blank", + "href": "http://www/foo/html", + "origin": "http://www", + "protocol": "http:", + "username": "", + "password": "", + "host": "www", + "hostname": "www", + "port": "", + "pathname": "/foo/html", + "search": "", + "hash": "" + }, + { + "input": "http://user:pass@/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://%25DOMAIN:foobar@foodomain.com/", + "base": "about:blank", + "href": "http://%25DOMAIN:foobar@foodomain.com/", + "origin": "http://foodomain.com", + "protocol": "http:", + "username": "%25DOMAIN", + "password": "foobar", + "host": "foodomain.com", + "hostname": "foodomain.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:\\\\www.google.com\\foo", + "base": "about:blank", + "href": "http://www.google.com/foo", + "origin": "http://www.google.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.google.com", + "hostname": "www.google.com", + "port": "", + "pathname": "/foo", + "search": "", + "hash": "" + }, + { + "input": "http://foo:80/", + "base": "about:blank", + "href": "http://foo/", + "origin": "http://foo", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://foo:81/", + "base": "about:blank", + "href": "http://foo:81/", + "origin": "http://foo:81", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo:81", + "hostname": "foo", + "port": "81", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "httpa://foo:80/", + "base": "about:blank", + "href": "httpa://foo:80/", + "origin": "null", + "protocol": "httpa:", + "username": "", + "password": "", + "host": "foo:80", + "hostname": "foo", + "port": "80", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://foo:-80/", + "base": "about:blank", + "failure": true + }, + { + "input": "https://foo:443/", + "base": "about:blank", + "href": "https://foo/", + "origin": "https://foo", + "protocol": "https:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https://foo:80/", + "base": "about:blank", + "href": "https://foo:80/", + "origin": "https://foo:80", + "protocol": "https:", + "username": "", + "password": "", + "host": "foo:80", + "hostname": "foo", + "port": "80", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ftp://foo:21/", + "base": "about:blank", + "href": "ftp://foo/", + "origin": "ftp://foo", + "protocol": "ftp:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ftp://foo:80/", + "base": "about:blank", + "href": "ftp://foo:80/", + "origin": "ftp://foo:80", + "protocol": "ftp:", + "username": "", + "password": "", + "host": "foo:80", + "hostname": "foo", + "port": "80", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "gopher://foo:70/", + "base": "about:blank", + "href": "gopher://foo:70/", + "origin": "null", + "protocol": "gopher:", + "username": "", + "password": "", + "host": "foo:70", + "hostname": "foo", + "port": "70", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "gopher://foo:443/", + "base": "about:blank", + "href": "gopher://foo:443/", + "origin": "null", + "protocol": "gopher:", + "username": "", + "password": "", + "host": "foo:443", + "hostname": "foo", + "port": "443", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ws://foo:80/", + "base": "about:blank", + "href": "ws://foo/", + "origin": "ws://foo", + "protocol": "ws:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ws://foo:81/", + "base": "about:blank", + "href": "ws://foo:81/", + "origin": "ws://foo:81", + "protocol": "ws:", + "username": "", + "password": "", + "host": "foo:81", + "hostname": "foo", + "port": "81", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ws://foo:443/", + "base": "about:blank", + "href": "ws://foo:443/", + "origin": "ws://foo:443", + "protocol": "ws:", + "username": "", + "password": "", + "host": "foo:443", + "hostname": "foo", + "port": "443", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ws://foo:815/", + "base": "about:blank", + "href": "ws://foo:815/", + "origin": "ws://foo:815", + "protocol": "ws:", + "username": "", + "password": "", + "host": "foo:815", + "hostname": "foo", + "port": "815", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss://foo:80/", + "base": "about:blank", + "href": "wss://foo:80/", + "origin": "wss://foo:80", + "protocol": "wss:", + "username": "", + "password": "", + "host": "foo:80", + "hostname": "foo", + "port": "80", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss://foo:81/", + "base": "about:blank", + "href": "wss://foo:81/", + "origin": "wss://foo:81", + "protocol": "wss:", + "username": "", + "password": "", + "host": "foo:81", + "hostname": "foo", + "port": "81", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss://foo:443/", + "base": "about:blank", + "href": "wss://foo/", + "origin": "wss://foo", + "protocol": "wss:", + "username": "", + "password": "", + "host": "foo", + "hostname": "foo", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss://foo:815/", + "base": "about:blank", + "href": "wss://foo:815/", + "origin": "wss://foo:815", + "protocol": "wss:", + "username": "", + "password": "", + "host": "foo:815", + "hostname": "foo", + "port": "815", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:/example.com/", + "base": "about:blank", + "href": "http://example.com/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ftp:/example.com/", + "base": "about:blank", + "href": "ftp://example.com/", + "origin": "ftp://example.com", + "protocol": "ftp:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https:/example.com/", + "base": "about:blank", + "href": "https://example.com/", + "origin": "https://example.com", + "protocol": "https:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "madeupscheme:/example.com/", + "base": "about:blank", + "href": "madeupscheme:/example.com/", + "origin": "null", + "protocol": "madeupscheme:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "file:/example.com/", + "base": "about:blank", + "href": "file:///example.com/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "ftps:/example.com/", + "base": "about:blank", + "href": "ftps:/example.com/", + "origin": "null", + "protocol": "ftps:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "gopher:/example.com/", + "base": "about:blank", + "href": "gopher:/example.com/", + "origin": "null", + "protocol": "gopher:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "ws:/example.com/", + "base": "about:blank", + "href": "ws://example.com/", + "origin": "ws://example.com", + "protocol": "ws:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss:/example.com/", + "base": "about:blank", + "href": "wss://example.com/", + "origin": "wss://example.com", + "protocol": "wss:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "data:/example.com/", + "base": "about:blank", + "href": "data:/example.com/", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "javascript:/example.com/", + "base": "about:blank", + "href": "javascript:/example.com/", + "origin": "null", + "protocol": "javascript:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "mailto:/example.com/", + "base": "about:blank", + "href": "mailto:/example.com/", + "origin": "null", + "protocol": "mailto:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/example.com/", + "search": "", + "hash": "" + }, + { + "input": "http:example.com/", + "base": "about:blank", + "href": "http://example.com/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ftp:example.com/", + "base": "about:blank", + "href": "ftp://example.com/", + "origin": "ftp://example.com", + "protocol": "ftp:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https:example.com/", + "base": "about:blank", + "href": "https://example.com/", + "origin": "https://example.com", + "protocol": "https:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "madeupscheme:example.com/", + "base": "about:blank", + "href": "madeupscheme:example.com/", + "origin": "null", + "protocol": "madeupscheme:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "ftps:example.com/", + "base": "about:blank", + "href": "ftps:example.com/", + "origin": "null", + "protocol": "ftps:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "gopher:example.com/", + "base": "about:blank", + "href": "gopher:example.com/", + "origin": "null", + "protocol": "gopher:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "ws:example.com/", + "base": "about:blank", + "href": "ws://example.com/", + "origin": "ws://example.com", + "protocol": "ws:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "wss:example.com/", + "base": "about:blank", + "href": "wss://example.com/", + "origin": "wss://example.com", + "protocol": "wss:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "data:example.com/", + "base": "about:blank", + "href": "data:example.com/", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "javascript:example.com/", + "base": "about:blank", + "href": "javascript:example.com/", + "origin": "null", + "protocol": "javascript:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + { + "input": "mailto:example.com/", + "base": "about:blank", + "href": "mailto:example.com/", + "origin": "null", + "protocol": "mailto:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "example.com/", + "search": "", + "hash": "" + }, + "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/segments-userinfo-vs-host.html", + { + "input": "http:@www.example.com", + "base": "about:blank", + "href": "http://www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:/@www.example.com", + "base": "about:blank", + "href": "http://www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://@www.example.com", + "base": "about:blank", + "href": "http://www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:a:b@www.example.com", + "base": "about:blank", + "href": "http://a:b@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "a", + "password": "b", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:/a:b@www.example.com", + "base": "about:blank", + "href": "http://a:b@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "a", + "password": "b", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://a:b@www.example.com", + "base": "about:blank", + "href": "http://a:b@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "a", + "password": "b", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://@pple.com", + "base": "about:blank", + "href": "http://pple.com/", + "origin": "http://pple.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "pple.com", + "hostname": "pple.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http::b@www.example.com", + "base": "about:blank", + "href": "http://:b@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "b", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:/:b@www.example.com", + "base": "about:blank", + "href": "http://:b@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "b", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://:b@www.example.com", + "base": "about:blank", + "href": "http://:b@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "b", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:/:@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http://user@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http:@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http:/@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http://@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "https:@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http:a:b@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http:/a:b@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http://a:b@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http::@/www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http:a:@www.example.com", + "base": "about:blank", + "href": "http://a@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "a", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:/a:@www.example.com", + "base": "about:blank", + "href": "http://a@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "a", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://a:@www.example.com", + "base": "about:blank", + "href": "http://a@www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "a", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://www.@pple.com", + "base": "about:blank", + "href": "http://www.@pple.com/", + "origin": "http://pple.com", + "protocol": "http:", + "username": "www.", + "password": "", + "host": "pple.com", + "hostname": "pple.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http:@:www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http:/@:www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http://@:www.example.com", + "base": "about:blank", + "failure": true + }, + { + "input": "http://:@www.example.com", + "base": "about:blank", + "href": "http://www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "# Others", + { + "input": "/", + "base": "http://www.example.com/test", + "href": "http://www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "/test.txt", + "base": "http://www.example.com/test", + "href": "http://www.example.com/test.txt", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/test.txt", + "search": "", + "hash": "" + }, + { + "input": ".", + "base": "http://www.example.com/test", + "href": "http://www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "..", + "base": "http://www.example.com/test", + "href": "http://www.example.com/", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "test.txt", + "base": "http://www.example.com/test", + "href": "http://www.example.com/test.txt", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/test.txt", + "search": "", + "hash": "" + }, + { + "input": "./test.txt", + "base": "http://www.example.com/test", + "href": "http://www.example.com/test.txt", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/test.txt", + "search": "", + "hash": "" + }, + { + "input": "../test.txt", + "base": "http://www.example.com/test", + "href": "http://www.example.com/test.txt", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/test.txt", + "search": "", + "hash": "" + }, + { + "input": "../aaa/test.txt", + "base": "http://www.example.com/test", + "href": "http://www.example.com/aaa/test.txt", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/aaa/test.txt", + "search": "", + "hash": "" + }, + { + "input": "../../test.txt", + "base": "http://www.example.com/test", + "href": "http://www.example.com/test.txt", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/test.txt", + "search": "", + "hash": "" + }, + { + "input": "中/test.txt", + "base": "http://www.example.com/test", + "href": "http://www.example.com/%E4%B8%AD/test.txt", + "origin": "http://www.example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example.com", + "hostname": "www.example.com", + "port": "", + "pathname": "/%E4%B8%AD/test.txt", + "search": "", + "hash": "" + }, + { + "input": "http://www.example2.com", + "base": "http://www.example.com/test", + "href": "http://www.example2.com/", + "origin": "http://www.example2.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example2.com", + "hostname": "www.example2.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "//www.example2.com", + "base": "http://www.example.com/test", + "href": "http://www.example2.com/", + "origin": "http://www.example2.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.example2.com", + "hostname": "www.example2.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file:...", + "base": "http://www.example.com/test", + "href": "file:///...", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/...", + "search": "", + "hash": "" + }, + { + "input": "file:..", + "base": "http://www.example.com/test", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file:a", + "base": "http://www.example.com/test", + "href": "file:///a", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/a", + "search": "", + "hash": "" + }, + "# Based on http://trac.webkit.org/browser/trunk/LayoutTests/fast/url/host.html", + "Basic canonicalization, uppercase should be converted to lowercase", + { + "input": "http://ExAmPlE.CoM", + "base": "http://other.com/", + "href": "http://example.com/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://example example.com", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://Goo%20 goo%7C|.com", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://[]", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://[:]", + "base": "http://other.com/", + "failure": true + }, + "U+3000 is mapped to U+0020 (space) which is disallowed", + { + "input": "http://GOO\u00a0\u3000goo.com", + "base": "http://other.com/", + "failure": true + }, + "Other types of space (no-break, zero-width, zero-width-no-break) are name-prepped away to nothing. U+200B, U+2060, and U+FEFF, are ignored", + { + "input": "http://GOO\u200b\u2060\ufeffgoo.com", + "base": "http://other.com/", + "href": "http://googoo.com/", + "origin": "http://googoo.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "googoo.com", + "hostname": "googoo.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Leading and trailing C0 control or space", + { + "input": "\u0000\u001b\u0004\u0012 http://example.com/\u001f \u000d ", + "base": "about:blank", + "href": "http://example.com/", + "origin": "http://example.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Ideographic full stop (full-width period for Chinese, etc.) should be treated as a dot. U+3002 is mapped to U+002E (dot)", + { + "input": "http://www.foo。bar.com", + "base": "http://other.com/", + "href": "http://www.foo.bar.com/", + "origin": "http://www.foo.bar.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "www.foo.bar.com", + "hostname": "www.foo.bar.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Invalid unicode characters should fail... U+FDD0 is disallowed; %ef%b7%90 is U+FDD0", + { + "input": "http://\ufdd0zyx.com", + "base": "http://other.com/", + "failure": true + }, + "This is the same as previous but escaped", + { + "input": "http://%ef%b7%90zyx.com", + "base": "http://other.com/", + "failure": true + }, + "U+FFFD", + { + "input": "https://\ufffd", + "base": "about:blank", + "failure": true + }, + { + "input": "https://%EF%BF%BD", + "base": "about:blank", + "failure": true + }, + { + "input": "https://x/\ufffd?\ufffd#\ufffd", + "base": "about:blank", + "href": "https://x/%EF%BF%BD?%EF%BF%BD#%EF%BF%BD", + "origin": "https://x", + "protocol": "https:", + "username": "", + "password": "", + "host": "x", + "hostname": "x", + "port": "", + "pathname": "/%EF%BF%BD", + "search": "?%EF%BF%BD", + "hash": "#%EF%BF%BD" + }, + "Test name prepping, fullwidth input should be converted to ASCII and NOT IDN-ized. This is 'Go' in fullwidth UTF-8/UTF-16.", + { + "input": "http://Go.com", + "base": "http://other.com/", + "href": "http://go.com/", + "origin": "http://go.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "go.com", + "hostname": "go.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "URL spec forbids the following. https://www.w3.org/Bugs/Public/show_bug.cgi?id=24257", + { + "input": "http://%41.com", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://%ef%bc%85%ef%bc%94%ef%bc%91.com", + "base": "http://other.com/", + "failure": true + }, + "...%00 in fullwidth should fail (also as escaped UTF-8 input)", + { + "input": "http://%00.com", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://%ef%bc%85%ef%bc%90%ef%bc%90.com", + "base": "http://other.com/", + "failure": true + }, + "Basic IDN support, UTF-8 and UTF-16 input should be converted to IDN", + { + "input": "http://你好你好", + "base": "http://other.com/", + "href": "http://xn--6qqa088eba/", + "origin": "http://xn--6qqa088eba", + "protocol": "http:", + "username": "", + "password": "", + "host": "xn--6qqa088eba", + "hostname": "xn--6qqa088eba", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https://faß.ExAmPlE/", + "base": "about:blank", + "href": "https://xn--fa-hia.example/", + "origin": "https://xn--fa-hia.example", + "protocol": "https:", + "username": "", + "password": "", + "host": "xn--fa-hia.example", + "hostname": "xn--fa-hia.example", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "sc://faß.ExAmPlE/", + "base": "about:blank", + "href": "sc://fa%C3%9F.ExAmPlE/", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "fa%C3%9F.ExAmPlE", + "hostname": "fa%C3%9F.ExAmPlE", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Invalid escaped characters should fail and the percents should be escaped. https://www.w3.org/Bugs/Public/show_bug.cgi?id=24191", + { + "input": "http://%zz%66%a.com", + "base": "http://other.com/", + "failure": true + }, + "If we get an invalid character that has been escaped.", + { + "input": "http://%25", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://hello%00", + "base": "http://other.com/", + "failure": true + }, + "Escaped numbers should be treated like IP addresses if they are.", + { + "input": "http://%30%78%63%30%2e%30%32%35%30.01", + "base": "http://other.com/", + "href": "http://192.168.0.1/", + "origin": "http://192.168.0.1", + "protocol": "http:", + "username": "", + "password": "", + "host": "192.168.0.1", + "hostname": "192.168.0.1", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://%30%78%63%30%2e%30%32%35%30.01%2e", + "base": "http://other.com/", + "href": "http://192.168.0.1/", + "origin": "http://192.168.0.1", + "protocol": "http:", + "username": "", + "password": "", + "host": "192.168.0.1", + "hostname": "192.168.0.1", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://192.168.0.257", + "base": "http://other.com/", + "failure": true + }, + "Invalid escaping in hosts causes failure", + { + "input": "http://%3g%78%63%30%2e%30%32%35%30%2E.01", + "base": "http://other.com/", + "failure": true + }, + "A space in a host causes failure", + { + "input": "http://192.168.0.1 hello", + "base": "http://other.com/", + "failure": true + }, + { + "input": "https://x x:12", + "base": "about:blank", + "failure": true + }, + "Fullwidth and escaped UTF-8 fullwidth should still be treated as IP", + { + "input": "http://0Xc0.0250.01", + "base": "http://other.com/", + "href": "http://192.168.0.1/", + "origin": "http://192.168.0.1", + "protocol": "http:", + "username": "", + "password": "", + "host": "192.168.0.1", + "hostname": "192.168.0.1", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Domains with empty labels", + { + "input": "http://./", + "base": "about:blank", + "href": "http://./", + "origin": "http://.", + "protocol": "http:", + "username": "", + "password": "", + "host": ".", + "hostname": ".", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://../", + "base": "about:blank", + "href": "http://../", + "origin": "http://..", + "protocol": "http:", + "username": "", + "password": "", + "host": "..", + "hostname": "..", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://0..0x300/", + "base": "about:blank", + "href": "http://0..0x300/", + "origin": "http://0..0x300", + "protocol": "http:", + "username": "", + "password": "", + "host": "0..0x300", + "hostname": "0..0x300", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Broken IPv6", + { + "input": "http://[www.google.com]/", + "base": "about:blank", + "failure": true + }, + { + "input": "http://[google.com]", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://[::1.2.3.4x]", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://[::1.2.3.]", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://[::1.2.]", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://[::1.]", + "base": "http://other.com/", + "failure": true + }, + "Misc Unicode", + { + "input": "http://foo:💩@example.com/bar", + "base": "http://other.com/", + "href": "http://foo:%F0%9F%92%A9@example.com/bar", + "origin": "http://example.com", + "protocol": "http:", + "username": "foo", + "password": "%F0%9F%92%A9", + "host": "example.com", + "hostname": "example.com", + "port": "", + "pathname": "/bar", + "search": "", + "hash": "" + }, + "# resolving a fragment against any scheme succeeds", + { + "input": "#", + "base": "test:test", + "href": "test:test#", + "origin": "null", + "protocol": "test:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "test", + "search": "", + "hash": "" + }, + { + "input": "#x", + "base": "mailto:x@x.com", + "href": "mailto:x@x.com#x", + "origin": "null", + "protocol": "mailto:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "x@x.com", + "search": "", + "hash": "#x" + }, + { + "input": "#x", + "base": "data:,", + "href": "data:,#x", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": ",", + "search": "", + "hash": "#x" + }, + { + "input": "#x", + "base": "about:blank", + "href": "about:blank#x", + "origin": "null", + "protocol": "about:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "blank", + "search": "", + "hash": "#x" + }, + { + "input": "#", + "base": "test:test?test", + "href": "test:test?test#", + "origin": "null", + "protocol": "test:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "test", + "search": "?test", + "hash": "" + }, + "# multiple @ in authority state", + { + "input": "https://@test@test@example:800/", + "base": "http://doesnotmatter/", + "href": "https://%40test%40test@example:800/", + "origin": "https://example:800", + "protocol": "https:", + "username": "%40test%40test", + "password": "", + "host": "example:800", + "hostname": "example", + "port": "800", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https://@@@example", + "base": "http://doesnotmatter/", + "href": "https://%40%40@example/", + "origin": "https://example", + "protocol": "https:", + "username": "%40%40", + "password": "", + "host": "example", + "hostname": "example", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "non-az-09 characters", + { + "input": "http://`{}:`{}@h/`{}?`{}", + "base": "http://doesnotmatter/", + "href": "http://%60%7B%7D:%60%7B%7D@h/%60%7B%7D?`{}", + "origin": "http://h", + "protocol": "http:", + "username": "%60%7B%7D", + "password": "%60%7B%7D", + "host": "h", + "hostname": "h", + "port": "", + "pathname": "/%60%7B%7D", + "search": "?`{}", + "hash": "" + }, + "byte is ' and url is special", + { + "input": "http://host/?'", + "base": "about:blank", + "href": "http://host/?%27", + "origin": "http://host", + "protocol": "http:", + "username": "", + "password": "", + "host": "host", + "hostname": "host", + "port": "", + "pathname": "/", + "search": "?%27", + "hash": "" + }, + { + "input": "notspecial://host/?'", + "base": "about:blank", + "href": "notspecial://host/?'", + "origin": "null", + "protocol": "notspecial:", + "username": "", + "password": "", + "host": "host", + "hostname": "host", + "port": "", + "pathname": "/", + "search": "?'", + "hash": "" + }, + "# Credentials in base", + { + "input": "/some/path", + "base": "http://user@example.org/smth", + "href": "http://user@example.org/some/path", + "origin": "http://example.org", + "protocol": "http:", + "username": "user", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/some/path", + "search": "", + "hash": "" + }, + { + "input": "", + "base": "http://user:pass@example.org:21/smth", + "href": "http://user:pass@example.org:21/smth", + "origin": "http://example.org:21", + "protocol": "http:", + "username": "user", + "password": "pass", + "host": "example.org:21", + "hostname": "example.org", + "port": "21", + "pathname": "/smth", + "search": "", + "hash": "" + }, + { + "input": "/some/path", + "base": "http://user:pass@example.org:21/smth", + "href": "http://user:pass@example.org:21/some/path", + "origin": "http://example.org:21", + "protocol": "http:", + "username": "user", + "password": "pass", + "host": "example.org:21", + "hostname": "example.org", + "port": "21", + "pathname": "/some/path", + "search": "", + "hash": "" + }, + "# a set of tests designed by zcorpan for relative URLs with unknown schemes", + { + "input": "i", + "base": "sc:sd", + "failure": true + }, + { + "input": "i", + "base": "sc:sd/sd", + "failure": true + }, + { + "input": "i", + "base": "sc:/pa/pa", + "href": "sc:/pa/i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pa/i", + "search": "", + "hash": "" + }, + { + "input": "i", + "base": "sc://ho/pa", + "href": "sc://ho/i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "ho", + "hostname": "ho", + "port": "", + "pathname": "/i", + "search": "", + "hash": "" + }, + { + "input": "i", + "base": "sc:///pa/pa", + "href": "sc:///pa/i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pa/i", + "search": "", + "hash": "" + }, + { + "input": "../i", + "base": "sc:sd", + "failure": true + }, + { + "input": "../i", + "base": "sc:sd/sd", + "failure": true + }, + { + "input": "../i", + "base": "sc:/pa/pa", + "href": "sc:/i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/i", + "search": "", + "hash": "" + }, + { + "input": "../i", + "base": "sc://ho/pa", + "href": "sc://ho/i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "ho", + "hostname": "ho", + "port": "", + "pathname": "/i", + "search": "", + "hash": "" + }, + { + "input": "../i", + "base": "sc:///pa/pa", + "href": "sc:///i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/i", + "search": "", + "hash": "" + }, + { + "input": "/i", + "base": "sc:sd", + "failure": true + }, + { + "input": "/i", + "base": "sc:sd/sd", + "failure": true + }, + { + "input": "/i", + "base": "sc:/pa/pa", + "href": "sc:/i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/i", + "search": "", + "hash": "" + }, + { + "input": "/i", + "base": "sc://ho/pa", + "href": "sc://ho/i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "ho", + "hostname": "ho", + "port": "", + "pathname": "/i", + "search": "", + "hash": "" + }, + { + "input": "/i", + "base": "sc:///pa/pa", + "href": "sc:///i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/i", + "search": "", + "hash": "" + }, + { + "input": "?i", + "base": "sc:sd", + "failure": true + }, + { + "input": "?i", + "base": "sc:sd/sd", + "failure": true + }, + { + "input": "?i", + "base": "sc:/pa/pa", + "href": "sc:/pa/pa?i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pa/pa", + "search": "?i", + "hash": "" + }, + { + "input": "?i", + "base": "sc://ho/pa", + "href": "sc://ho/pa?i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "ho", + "hostname": "ho", + "port": "", + "pathname": "/pa", + "search": "?i", + "hash": "" + }, + { + "input": "?i", + "base": "sc:///pa/pa", + "href": "sc:///pa/pa?i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pa/pa", + "search": "?i", + "hash": "" + }, + { + "input": "#i", + "base": "sc:sd", + "href": "sc:sd#i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "sd", + "search": "", + "hash": "#i" + }, + { + "input": "#i", + "base": "sc:sd/sd", + "href": "sc:sd/sd#i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "sd/sd", + "search": "", + "hash": "#i" + }, + { + "input": "#i", + "base": "sc:/pa/pa", + "href": "sc:/pa/pa#i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pa/pa", + "search": "", + "hash": "#i" + }, + { + "input": "#i", + "base": "sc://ho/pa", + "href": "sc://ho/pa#i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "ho", + "hostname": "ho", + "port": "", + "pathname": "/pa", + "search": "", + "hash": "#i" + }, + { + "input": "#i", + "base": "sc:///pa/pa", + "href": "sc:///pa/pa#i", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pa/pa", + "search": "", + "hash": "#i" + }, + "# make sure that relative URL logic works on known typically non-relative schemes too", + { + "input": "about:/../", + "base": "about:blank", + "href": "about:/", + "origin": "null", + "protocol": "about:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "data:/../", + "base": "about:blank", + "href": "data:/", + "origin": "null", + "protocol": "data:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "javascript:/../", + "base": "about:blank", + "href": "javascript:/", + "origin": "null", + "protocol": "javascript:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "mailto:/../", + "base": "about:blank", + "href": "mailto:/", + "origin": "null", + "protocol": "mailto:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "# unknown schemes and their hosts", + { + "input": "sc://ñ.test/", + "base": "about:blank", + "href": "sc://%C3%B1.test/", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%C3%B1.test", + "hostname": "%C3%B1.test", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "sc://\u0000/", + "base": "about:blank", + "failure": true + }, + { + "input": "sc:// /", + "base": "about:blank", + "failure": true + }, + { + "input": "sc://%/", + "base": "about:blank", + "href": "sc://%/", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%", + "hostname": "%", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "sc://@/", + "base": "about:blank", + "failure": true + }, + { + "input": "sc://te@s:t@/", + "base": "about:blank", + "failure": true + }, + { + "input": "sc://:/", + "base": "about:blank", + "failure": true + }, + { + "input": "sc://:12/", + "base": "about:blank", + "failure": true + }, + { + "input": "sc://[/", + "base": "about:blank", + "failure": true + }, + { + "input": "sc://\\/", + "base": "about:blank", + "failure": true + }, + { + "input": "sc://]/", + "base": "about:blank", + "failure": true + }, + { + "input": "x", + "base": "sc://ñ", + "href": "sc://%C3%B1/x", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%C3%B1", + "hostname": "%C3%B1", + "port": "", + "pathname": "/x", + "search": "", + "hash": "" + }, + "# unknown schemes and backslashes", + { + "input": "sc:\\../", + "base": "about:blank", + "href": "sc:\\../", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "\\../", + "search": "", + "hash": "" + }, + "# unknown scheme with path looking like a password", + { + "input": "sc::a@example.net", + "base": "about:blank", + "href": "sc::a@example.net", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": ":a@example.net", + "search": "", + "hash": "" + }, + "# unknown scheme with bogus percent-encoding", + { + "input": "wow:%NBD", + "base": "about:blank", + "href": "wow:%NBD", + "origin": "null", + "protocol": "wow:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "%NBD", + "search": "", + "hash": "" + }, + { + "input": "wow:%1G", + "base": "about:blank", + "href": "wow:%1G", + "origin": "null", + "protocol": "wow:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "%1G", + "search": "", + "hash": "" + }, + "# unknown scheme with non-URL characters in the path", + { + "input": "wow:\uFFFF", + "base": "about:blank", + "href": "wow:%EF%BF%BF", + "origin": "null", + "protocol": "wow:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "%EF%BF%BF", + "search": "", + "hash": "" + }, + "Forbidden host code points", + { + "input": "http://ab", + "base": "about:blank", + "failure": true + }, + { + "input": "http://a^b", + "base": "about:blank", + "failure": true + }, + { + "input": "non-special://ab", + "base": "about:blank", + "failure": true + }, + { + "input": "non-special://a^b", + "base": "about:blank", + "failure": true + }, + "Allowed host code points", + { + "input": "http://\u001F!\"$&'()*+,-.;=_`{|}~/", + "base": "about:blank", + "href": "http://\u001F!\"$&'()*+,-.;=_`{|}~/", + "origin": "http://\u001F!\"$&'()*+,-.;=_`{|}~", + "protocol": "http:", + "username": "", + "password": "", + "host": "\u001F!\"$&'()*+,-.;=_`{|}~", + "hostname": "\u001F!\"$&'()*+,-.;=_`{|}~", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "sc://\u001F!\"$&'()*+,-.;=_`{|}~/", + "base": "about:blank", + "href": "sc://%1F!\"$&'()*+,-.;=_`{|}~/", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%1F!\"$&'()*+,-.;=_`{|}~", + "hostname": "%1F!\"$&'()*+,-.;=_`{|}~", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "# Hosts and percent-encoding", + { + "input": "ftp://example.com%80/", + "base": "about:blank", + "failure": true + }, + { + "input": "ftp://example.com%A0/", + "base": "about:blank", + "failure": true + }, + { + "input": "https://example.com%80/", + "base": "about:blank", + "failure": true + }, + { + "input": "https://example.com%A0/", + "base": "about:blank", + "failure": true + }, + { + "input": "ftp://%e2%98%83", + "base": "about:blank", + "href": "ftp://xn--n3h/", + "origin": "ftp://xn--n3h", + "protocol": "ftp:", + "username": "", + "password": "", + "host": "xn--n3h", + "hostname": "xn--n3h", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https://%e2%98%83", + "base": "about:blank", + "href": "https://xn--n3h/", + "origin": "https://xn--n3h", + "protocol": "https:", + "username": "", + "password": "", + "host": "xn--n3h", + "hostname": "xn--n3h", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "# tests from jsdom/whatwg-url designed for code coverage", + { + "input": "http://127.0.0.1:10100/relative_import.html", + "base": "about:blank", + "href": "http://127.0.0.1:10100/relative_import.html", + "origin": "http://127.0.0.1:10100", + "protocol": "http:", + "username": "", + "password": "", + "host": "127.0.0.1:10100", + "hostname": "127.0.0.1", + "port": "10100", + "pathname": "/relative_import.html", + "search": "", + "hash": "" + }, + { + "input": "http://facebook.com/?foo=%7B%22abc%22", + "base": "about:blank", + "href": "http://facebook.com/?foo=%7B%22abc%22", + "origin": "http://facebook.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "facebook.com", + "hostname": "facebook.com", + "port": "", + "pathname": "/", + "search": "?foo=%7B%22abc%22", + "hash": "" + }, + { + "input": "https://localhost:3000/jqueryui@1.2.3", + "base": "about:blank", + "href": "https://localhost:3000/jqueryui@1.2.3", + "origin": "https://localhost:3000", + "protocol": "https:", + "username": "", + "password": "", + "host": "localhost:3000", + "hostname": "localhost", + "port": "3000", + "pathname": "/jqueryui@1.2.3", + "search": "", + "hash": "" + }, + "# tab/LF/CR", + { + "input": "h\tt\nt\rp://h\to\ns\rt:9\t0\n0\r0/p\ta\nt\rh?q\tu\ne\rry#f\tr\na\rg", + "base": "about:blank", + "href": "http://host:9000/path?query#frag", + "origin": "http://host:9000", + "protocol": "http:", + "username": "", + "password": "", + "host": "host:9000", + "hostname": "host", + "port": "9000", + "pathname": "/path", + "search": "?query", + "hash": "#frag" + }, + "# Stringification of URL.searchParams", + { + "input": "?a=b&c=d", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar?a=b&c=d", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "?a=b&c=d", + "searchParams": "a=b&c=d", + "hash": "" + }, + { + "input": "??a=b&c=d", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar??a=b&c=d", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "??a=b&c=d", + "searchParams": "%3Fa=b&c=d", + "hash": "" + }, + "# Scheme only", + { + "input": "http:", + "base": "http://example.org/foo/bar", + "href": "http://example.org/foo/bar", + "origin": "http://example.org", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/foo/bar", + "search": "", + "searchParams": "", + "hash": "" + }, + { + "input": "http:", + "base": "https://example.org/foo/bar", + "failure": true + }, + { + "input": "sc:", + "base": "https://example.org/foo/bar", + "href": "sc:", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "", + "search": "", + "searchParams": "", + "hash": "" + }, + "# Percent encoding of fragments", + { + "input": "http://foo.bar/baz?qux#foo\bbar", + "base": "about:blank", + "href": "http://foo.bar/baz?qux#foo%08bar", + "origin": "http://foo.bar", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo.bar", + "hostname": "foo.bar", + "port": "", + "pathname": "/baz", + "search": "?qux", + "searchParams": "qux=", + "hash": "#foo%08bar" + }, + { + "input": "http://foo.bar/baz?qux#foo\"bar", + "base": "about:blank", + "href": "http://foo.bar/baz?qux#foo%22bar", + "origin": "http://foo.bar", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo.bar", + "hostname": "foo.bar", + "port": "", + "pathname": "/baz", + "search": "?qux", + "searchParams": "qux=", + "hash": "#foo%22bar" + }, + { + "input": "http://foo.bar/baz?qux#foobar", + "base": "about:blank", + "href": "http://foo.bar/baz?qux#foo%3Ebar", + "origin": "http://foo.bar", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo.bar", + "hostname": "foo.bar", + "port": "", + "pathname": "/baz", + "search": "?qux", + "searchParams": "qux=", + "hash": "#foo%3Ebar" + }, + { + "input": "http://foo.bar/baz?qux#foo`bar", + "base": "about:blank", + "href": "http://foo.bar/baz?qux#foo%60bar", + "origin": "http://foo.bar", + "protocol": "http:", + "username": "", + "password": "", + "host": "foo.bar", + "hostname": "foo.bar", + "port": "", + "pathname": "/baz", + "search": "?qux", + "searchParams": "qux=", + "hash": "#foo%60bar" + }, + "# IPv4 parsing (via https://github.com/nodejs/node/pull/10317)", + { + "input": "http://192.168.257", + "base": "http://other.com/", + "href": "http://192.168.1.1/", + "origin": "http://192.168.1.1", + "protocol": "http:", + "username": "", + "password": "", + "host": "192.168.1.1", + "hostname": "192.168.1.1", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://192.168.257.com", + "base": "http://other.com/", + "href": "http://192.168.257.com/", + "origin": "http://192.168.257.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "192.168.257.com", + "hostname": "192.168.257.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://256", + "base": "http://other.com/", + "href": "http://0.0.1.0/", + "origin": "http://0.0.1.0", + "protocol": "http:", + "username": "", + "password": "", + "host": "0.0.1.0", + "hostname": "0.0.1.0", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://256.com", + "base": "http://other.com/", + "href": "http://256.com/", + "origin": "http://256.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "256.com", + "hostname": "256.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://999999999", + "base": "http://other.com/", + "href": "http://59.154.201.255/", + "origin": "http://59.154.201.255", + "protocol": "http:", + "username": "", + "password": "", + "host": "59.154.201.255", + "hostname": "59.154.201.255", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://999999999.com", + "base": "http://other.com/", + "href": "http://999999999.com/", + "origin": "http://999999999.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "999999999.com", + "hostname": "999999999.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://10000000000", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://10000000000.com", + "base": "http://other.com/", + "href": "http://10000000000.com/", + "origin": "http://10000000000.com", + "protocol": "http:", + "username": "", + "password": "", + "host": "10000000000.com", + "hostname": "10000000000.com", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://4294967295", + "base": "http://other.com/", + "href": "http://255.255.255.255/", + "origin": "http://255.255.255.255", + "protocol": "http:", + "username": "", + "password": "", + "host": "255.255.255.255", + "hostname": "255.255.255.255", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://4294967296", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://0xffffffff", + "base": "http://other.com/", + "href": "http://255.255.255.255/", + "origin": "http://255.255.255.255", + "protocol": "http:", + "username": "", + "password": "", + "host": "255.255.255.255", + "hostname": "255.255.255.255", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://0xffffffff1", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://256.256.256.256", + "base": "http://other.com/", + "failure": true + }, + { + "input": "http://256.256.256.256.256", + "base": "http://other.com/", + "href": "http://256.256.256.256.256/", + "origin": "http://256.256.256.256.256", + "protocol": "http:", + "username": "", + "password": "", + "host": "256.256.256.256.256", + "hostname": "256.256.256.256.256", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "https://0x.0x.0", + "base": "about:blank", + "href": "https://0.0.0.0/", + "origin": "https://0.0.0.0", + "protocol": "https:", + "username": "", + "password": "", + "host": "0.0.0.0", + "hostname": "0.0.0.0", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "More IPv4 parsing (via https://github.com/jsdom/whatwg-url/issues/92)", + { + "input": "https://0x100000000/test", + "base": "about:blank", + "failure": true + }, + { + "input": "https://256.0.0.1/test", + "base": "about:blank", + "failure": true + }, + "# file URLs containing percent-encoded Windows drive letters (shouldn't work)", + { + "input": "file:///C%3A/", + "base": "about:blank", + "href": "file:///C%3A/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C%3A/", + "search": "", + "hash": "" + }, + { + "input": "file:///C%7C/", + "base": "about:blank", + "href": "file:///C%7C/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C%7C/", + "search": "", + "hash": "" + }, + "# file URLs relative to other file URLs (via https://github.com/jsdom/whatwg-url/pull/60)", + { + "input": "pix/submit.gif", + "base": "file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/anchor.html", + "href": "file:///C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/pix/submit.gif", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/Users/Domenic/Dropbox/GitHub/tmpvar/jsdom/test/level2/html/files/pix/submit.gif", + "search": "", + "hash": "" + }, + { + "input": "..", + "base": "file:///C:/", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "..", + "base": "file:///", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "# More file URL tests by zcorpan and annevk", + { + "input": "/", + "base": "file:///C:/a/b", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "//d:", + "base": "file:///C:/a/b", + "href": "file:///d:", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/d:", + "search": "", + "hash": "" + }, + { + "input": "//d:/..", + "base": "file:///C:/a/b", + "href": "file:///d:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/d:/", + "search": "", + "hash": "" + }, + { + "input": "..", + "base": "file:///ab:/", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "..", + "base": "file:///1:/", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "", + "base": "file:///test?test#test", + "href": "file:///test?test", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "?test", + "hash": "" + }, + { + "input": "file:", + "base": "file:///test?test#test", + "href": "file:///test?test", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "?test", + "hash": "" + }, + { + "input": "?x", + "base": "file:///test?test#test", + "href": "file:///test?x", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "?x", + "hash": "" + }, + { + "input": "file:?x", + "base": "file:///test?test#test", + "href": "file:///test?x", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "?x", + "hash": "" + }, + { + "input": "#x", + "base": "file:///test?test#test", + "href": "file:///test?test#x", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "?test", + "hash": "#x" + }, + { + "input": "file:#x", + "base": "file:///test?test#test", + "href": "file:///test?test#x", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "?test", + "hash": "#x" + }, + "# File URLs and many (back)slashes", + { + "input": "file:\\\\//", + "base": "about:blank", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file:\\\\\\\\", + "base": "about:blank", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file:\\\\\\\\?fox", + "base": "about:blank", + "href": "file:///?fox", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "?fox", + "hash": "" + }, + { + "input": "file:\\\\\\\\#guppy", + "base": "about:blank", + "href": "file:///#guppy", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "#guppy" + }, + { + "input": "file://spider///", + "base": "about:blank", + "href": "file://spider/", + "protocol": "file:", + "username": "", + "password": "", + "host": "spider", + "hostname": "spider", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file:\\\\localhost//", + "base": "about:blank", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file:///localhost//cat", + "base": "about:blank", + "href": "file:///localhost//cat", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/localhost//cat", + "search": "", + "hash": "" + }, + { + "input": "file://\\/localhost//cat", + "base": "about:blank", + "href": "file:///localhost//cat", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/localhost//cat", + "search": "", + "hash": "" + }, + { + "input": "file://localhost//a//../..//", + "base": "about:blank", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "/////mouse", + "base": "file:///elephant", + "href": "file:///mouse", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/mouse", + "search": "", + "hash": "" + }, + { + "input": "\\//pig", + "base": "file://lion/", + "href": "file:///pig", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pig", + "search": "", + "hash": "" + }, + { + "input": "\\/localhost//pig", + "base": "file://lion/", + "href": "file:///pig", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pig", + "search": "", + "hash": "" + }, + { + "input": "//localhost//pig", + "base": "file://lion/", + "href": "file:///pig", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/pig", + "search": "", + "hash": "" + }, + { + "input": "/..//localhost//pig", + "base": "file://lion/", + "href": "file://lion/localhost//pig", + "protocol": "file:", + "username": "", + "password": "", + "host": "lion", + "hostname": "lion", + "port": "", + "pathname": "/localhost//pig", + "search": "", + "hash": "" + }, + { + "input": "file://", + "base": "file://ape/", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "# File URLs with non-empty hosts", + { + "input": "/rooibos", + "base": "file://tea/", + "href": "file://tea/rooibos", + "protocol": "file:", + "username": "", + "password": "", + "host": "tea", + "hostname": "tea", + "port": "", + "pathname": "/rooibos", + "search": "", + "hash": "" + }, + { + "input": "/?chai", + "base": "file://tea/", + "href": "file://tea/?chai", + "protocol": "file:", + "username": "", + "password": "", + "host": "tea", + "hostname": "tea", + "port": "", + "pathname": "/", + "search": "?chai", + "hash": "" + }, + "# Windows drive letter handling with the 'file:' base URL", + { + "input": "C|", + "base": "file://host/dir/file", + "href": "file:///C:", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:", + "search": "", + "hash": "" + }, + { + "input": "C|#", + "base": "file://host/dir/file", + "href": "file:///C:#", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:", + "search": "", + "hash": "" + }, + { + "input": "C|?", + "base": "file://host/dir/file", + "href": "file:///C:?", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:", + "search": "", + "hash": "" + }, + { + "input": "C|/", + "base": "file://host/dir/file", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "C|\n/", + "base": "file://host/dir/file", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "C|\\", + "base": "file://host/dir/file", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "C", + "base": "file://host/dir/file", + "href": "file://host/dir/C", + "protocol": "file:", + "username": "", + "password": "", + "host": "host", + "hostname": "host", + "port": "", + "pathname": "/dir/C", + "search": "", + "hash": "" + }, + { + "input": "C|a", + "base": "file://host/dir/file", + "href": "file://host/dir/C|a", + "protocol": "file:", + "username": "", + "password": "", + "host": "host", + "hostname": "host", + "port": "", + "pathname": "/dir/C|a", + "search": "", + "hash": "" + }, + "# Windows drive letter quirk in the file slash state", + { + "input": "/c:/foo/bar", + "base": "file:///c:/baz/qux", + "href": "file:///c:/foo/bar", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/c:/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "/c|/foo/bar", + "base": "file:///c:/baz/qux", + "href": "file:///c:/foo/bar", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/c:/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "file:\\c:\\foo\\bar", + "base": "file:///c:/baz/qux", + "href": "file:///c:/foo/bar", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/c:/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "/c:/foo/bar", + "base": "file://host/path", + "href": "file:///c:/foo/bar", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/c:/foo/bar", + "search": "", + "hash": "" + }, + "# Windows drive letter quirk with not empty host", + { + "input": "file://example.net/C:/", + "base": "about:blank", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "file://1.2.3.4/C:/", + "base": "about:blank", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "file://[1::8]/C:/", + "base": "about:blank", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + "# Windows drive letter quirk (no host)", + { + "input": "file:/C|/", + "base": "about:blank", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + { + "input": "file://C|/", + "base": "about:blank", + "href": "file:///C:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/C:/", + "search": "", + "hash": "" + }, + "# file URLs without base URL by Rimas Misevičius", + { + "input": "file:", + "base": "about:blank", + "href": "file:///", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "file:?q=v", + "base": "about:blank", + "href": "file:///?q=v", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "?q=v", + "hash": "" + }, + { + "input": "file:#frag", + "base": "about:blank", + "href": "file:///#frag", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "#frag" + }, + "# file: drive letter cases from https://crbug.com/1078698", + { + "input": "file:///Y:", + "base": "about:blank", + "href": "file:///Y:", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/Y:", + "search": "", + "hash": "" + }, + { + "input": "file:///Y:/", + "base": "about:blank", + "href": "file:///Y:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/Y:/", + "search": "", + "hash": "" + }, + { + "input": "file:///./Y", + "base": "about:blank", + "href": "file:///Y", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/Y", + "search": "", + "hash": "" + }, + { + "input": "file:///./Y:", + "base": "about:blank", + "href": "file:///Y:", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/Y:", + "search": "", + "hash": "" + }, + { + "input": "\\\\\\.\\Y:", + "base": "about:blank", + "failure": true + }, + "# file: drive letter cases from https://crbug.com/1078698 but lowercased", + { + "input": "file:///y:", + "base": "about:blank", + "href": "file:///y:", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/y:", + "search": "", + "hash": "" + }, + { + "input": "file:///y:/", + "base": "about:blank", + "href": "file:///y:/", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/y:/", + "search": "", + "hash": "" + }, + { + "input": "file:///./y", + "base": "about:blank", + "href": "file:///y", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/y", + "search": "", + "hash": "" + }, + { + "input": "file:///./y:", + "base": "about:blank", + "href": "file:///y:", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/y:", + "search": "", + "hash": "" + }, + { + "input": "\\\\\\.\\y:", + "base": "about:blank", + "failure": true + }, + "# IPv6 tests", + { + "input": "http://[1:0::]", + "base": "http://example.net/", + "href": "http://[1::]/", + "origin": "http://[1::]", + "protocol": "http:", + "username": "", + "password": "", + "host": "[1::]", + "hostname": "[1::]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://[0:1:2:3:4:5:6:7:8]", + "base": "http://example.net/", + "failure": true + }, + { + "input": "https://[0::0::0]", + "base": "about:blank", + "failure": true + }, + { + "input": "https://[0:.0]", + "base": "about:blank", + "failure": true + }, + { + "input": "https://[0:0:]", + "base": "about:blank", + "failure": true + }, + { + "input": "https://[0:1:2:3:4:5:6:7.0.0.0.1]", + "base": "about:blank", + "failure": true + }, + { + "input": "https://[0:1.00.0.0.0]", + "base": "about:blank", + "failure": true + }, + { + "input": "https://[0:1.290.0.0.0]", + "base": "about:blank", + "failure": true + }, + { + "input": "https://[0:1.23.23]", + "base": "about:blank", + "failure": true + }, + "# Empty host", + { + "input": "http://?", + "base": "about:blank", + "failure": true + }, + { + "input": "http://#", + "base": "about:blank", + "failure": true + }, + "Port overflow (2^32 + 81)", + { + "input": "http://f:4294967377/c", + "base": "http://example.org/", + "failure": true + }, + "Port overflow (2^64 + 81)", + { + "input": "http://f:18446744073709551697/c", + "base": "http://example.org/", + "failure": true + }, + "Port overflow (2^128 + 81)", + { + "input": "http://f:340282366920938463463374607431768211537/c", + "base": "http://example.org/", + "failure": true + }, + "# Non-special-URL path tests", + { + "input": "sc://ñ", + "base": "about:blank", + "href": "sc://%C3%B1", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%C3%B1", + "hostname": "%C3%B1", + "port": "", + "pathname": "", + "search": "", + "hash": "" + }, + { + "input": "sc://ñ?x", + "base": "about:blank", + "href": "sc://%C3%B1?x", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%C3%B1", + "hostname": "%C3%B1", + "port": "", + "pathname": "", + "search": "?x", + "hash": "" + }, + { + "input": "sc://ñ#x", + "base": "about:blank", + "href": "sc://%C3%B1#x", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%C3%B1", + "hostname": "%C3%B1", + "port": "", + "pathname": "", + "search": "", + "hash": "#x" + }, + { + "input": "#x", + "base": "sc://ñ", + "href": "sc://%C3%B1#x", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%C3%B1", + "hostname": "%C3%B1", + "port": "", + "pathname": "", + "search": "", + "hash": "#x" + }, + { + "input": "?x", + "base": "sc://ñ", + "href": "sc://%C3%B1?x", + "origin": "null", + "protocol": "sc:", + "username": "", + "password": "", + "host": "%C3%B1", + "hostname": "%C3%B1", + "port": "", + "pathname": "", + "search": "?x", + "hash": "" + }, + { + "input": "sc://?", + "base": "about:blank", + "href": "sc://?", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "", + "search": "", + "hash": "" + }, + { + "input": "sc://#", + "base": "about:blank", + "href": "sc://#", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "", + "search": "", + "hash": "" + }, + { + "input": "///", + "base": "sc://x/", + "href": "sc:///", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "////", + "base": "sc://x/", + "href": "sc:////", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "//", + "search": "", + "hash": "" + }, + { + "input": "////x/", + "base": "sc://x/", + "href": "sc:////x/", + "protocol": "sc:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "//x/", + "search": "", + "hash": "" + }, + { + "input": "tftp://foobar.com/someconfig;mode=netascii", + "base": "about:blank", + "href": "tftp://foobar.com/someconfig;mode=netascii", + "origin": "null", + "protocol": "tftp:", + "username": "", + "password": "", + "host": "foobar.com", + "hostname": "foobar.com", + "port": "", + "pathname": "/someconfig;mode=netascii", + "search": "", + "hash": "" + }, + { + "input": "telnet://user:pass@foobar.com:23/", + "base": "about:blank", + "href": "telnet://user:pass@foobar.com:23/", + "origin": "null", + "protocol": "telnet:", + "username": "user", + "password": "pass", + "host": "foobar.com:23", + "hostname": "foobar.com", + "port": "23", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "ut2004://10.10.10.10:7777/Index.ut2", + "base": "about:blank", + "href": "ut2004://10.10.10.10:7777/Index.ut2", + "origin": "null", + "protocol": "ut2004:", + "username": "", + "password": "", + "host": "10.10.10.10:7777", + "hostname": "10.10.10.10", + "port": "7777", + "pathname": "/Index.ut2", + "search": "", + "hash": "" + }, + { + "input": "redis://foo:bar@somehost:6379/0?baz=bam&qux=baz", + "base": "about:blank", + "href": "redis://foo:bar@somehost:6379/0?baz=bam&qux=baz", + "origin": "null", + "protocol": "redis:", + "username": "foo", + "password": "bar", + "host": "somehost:6379", + "hostname": "somehost", + "port": "6379", + "pathname": "/0", + "search": "?baz=bam&qux=baz", + "hash": "" + }, + { + "input": "rsync://foo@host:911/sup", + "base": "about:blank", + "href": "rsync://foo@host:911/sup", + "origin": "null", + "protocol": "rsync:", + "username": "foo", + "password": "", + "host": "host:911", + "hostname": "host", + "port": "911", + "pathname": "/sup", + "search": "", + "hash": "" + }, + { + "input": "git://github.com/foo/bar.git", + "base": "about:blank", + "href": "git://github.com/foo/bar.git", + "origin": "null", + "protocol": "git:", + "username": "", + "password": "", + "host": "github.com", + "hostname": "github.com", + "port": "", + "pathname": "/foo/bar.git", + "search": "", + "hash": "" + }, + { + "input": "irc://myserver.com:6999/channel?passwd", + "base": "about:blank", + "href": "irc://myserver.com:6999/channel?passwd", + "origin": "null", + "protocol": "irc:", + "username": "", + "password": "", + "host": "myserver.com:6999", + "hostname": "myserver.com", + "port": "6999", + "pathname": "/channel", + "search": "?passwd", + "hash": "" + }, + { + "input": "dns://fw.example.org:9999/foo.bar.org?type=TXT", + "base": "about:blank", + "href": "dns://fw.example.org:9999/foo.bar.org?type=TXT", + "origin": "null", + "protocol": "dns:", + "username": "", + "password": "", + "host": "fw.example.org:9999", + "hostname": "fw.example.org", + "port": "9999", + "pathname": "/foo.bar.org", + "search": "?type=TXT", + "hash": "" + }, + { + "input": "ldap://localhost:389/ou=People,o=JNDITutorial", + "base": "about:blank", + "href": "ldap://localhost:389/ou=People,o=JNDITutorial", + "origin": "null", + "protocol": "ldap:", + "username": "", + "password": "", + "host": "localhost:389", + "hostname": "localhost", + "port": "389", + "pathname": "/ou=People,o=JNDITutorial", + "search": "", + "hash": "" + }, + { + "input": "git+https://github.com/foo/bar", + "base": "about:blank", + "href": "git+https://github.com/foo/bar", + "origin": "null", + "protocol": "git+https:", + "username": "", + "password": "", + "host": "github.com", + "hostname": "github.com", + "port": "", + "pathname": "/foo/bar", + "search": "", + "hash": "" + }, + { + "input": "urn:ietf:rfc:2648", + "base": "about:blank", + "href": "urn:ietf:rfc:2648", + "origin": "null", + "protocol": "urn:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "ietf:rfc:2648", + "search": "", + "hash": "" + }, + { + "input": "tag:joe@example.org,2001:foo/bar", + "base": "about:blank", + "href": "tag:joe@example.org,2001:foo/bar", + "origin": "null", + "protocol": "tag:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "joe@example.org,2001:foo/bar", + "search": "", + "hash": "" + }, + "# percent encoded hosts in non-special-URLs", + { + "input": "non-special://%E2%80%A0/", + "base": "about:blank", + "href": "non-special://%E2%80%A0/", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "%E2%80%A0", + "hostname": "%E2%80%A0", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "non-special://H%4fSt/path", + "base": "about:blank", + "href": "non-special://H%4fSt/path", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "H%4fSt", + "hostname": "H%4fSt", + "port": "", + "pathname": "/path", + "search": "", + "hash": "" + }, + "# IPv6 in non-special-URLs", + { + "input": "non-special://[1:2:0:0:5:0:0:0]/", + "base": "about:blank", + "href": "non-special://[1:2:0:0:5::]/", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "[1:2:0:0:5::]", + "hostname": "[1:2:0:0:5::]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "non-special://[1:2:0:0:0:0:0:3]/", + "base": "about:blank", + "href": "non-special://[1:2::3]/", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "[1:2::3]", + "hostname": "[1:2::3]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "non-special://[1:2::3]:80/", + "base": "about:blank", + "href": "non-special://[1:2::3]:80/", + "protocol": "non-special:", + "username": "", + "password": "", + "host": "[1:2::3]:80", + "hostname": "[1:2::3]", + "port": "80", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "non-special://[:80/", + "base": "about:blank", + "failure": true + }, + { + "input": "blob:https://example.com:443/", + "base": "about:blank", + "href": "blob:https://example.com:443/", + "protocol": "blob:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "https://example.com:443/", + "search": "", + "hash": "" + }, + { + "input": "blob:d3958f5c-0777-0845-9dcf-2cb28783acaf", + "base": "about:blank", + "href": "blob:d3958f5c-0777-0845-9dcf-2cb28783acaf", + "protocol": "blob:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "d3958f5c-0777-0845-9dcf-2cb28783acaf", + "search": "", + "hash": "" + }, + "Invalid IPv4 radix digits", + { + "input": "http://0177.0.0.0189", + "base": "about:blank", + "href": "http://0177.0.0.0189/", + "protocol": "http:", + "username": "", + "password": "", + "host": "0177.0.0.0189", + "hostname": "0177.0.0.0189", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://0x7f.0.0.0x7g", + "base": "about:blank", + "href": "http://0x7f.0.0.0x7g/", + "protocol": "http:", + "username": "", + "password": "", + "host": "0x7f.0.0.0x7g", + "hostname": "0x7f.0.0.0x7g", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://0X7F.0.0.0X7G", + "base": "about:blank", + "href": "http://0x7f.0.0.0x7g/", + "protocol": "http:", + "username": "", + "password": "", + "host": "0x7f.0.0.0x7g", + "hostname": "0x7f.0.0.0x7g", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Invalid IPv4 portion of IPv6 address", + { + "input": "http://[::127.0.0.0.1]", + "base": "about:blank", + "failure": true + }, + "Uncompressed IPv6 addresses with 0", + { + "input": "http://[0:1:0:1:0:1:0:1]", + "base": "about:blank", + "href": "http://[0:1:0:1:0:1:0:1]/", + "protocol": "http:", + "username": "", + "password": "", + "host": "[0:1:0:1:0:1:0:1]", + "hostname": "[0:1:0:1:0:1:0:1]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + { + "input": "http://[1:0:1:0:1:0:1:0]", + "base": "about:blank", + "href": "http://[1:0:1:0:1:0:1:0]/", + "protocol": "http:", + "username": "", + "password": "", + "host": "[1:0:1:0:1:0:1:0]", + "hostname": "[1:0:1:0:1:0:1:0]", + "port": "", + "pathname": "/", + "search": "", + "hash": "" + }, + "Percent-encoded query and fragment", + { + "input": "http://example.org/test?\u0022", + "base": "about:blank", + "href": "http://example.org/test?%22", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?%22", + "hash": "" + }, + { + "input": "http://example.org/test?\u0023", + "base": "about:blank", + "href": "http://example.org/test?#", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "", + "hash": "" + }, + { + "input": "http://example.org/test?\u003C", + "base": "about:blank", + "href": "http://example.org/test?%3C", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?%3C", + "hash": "" + }, + { + "input": "http://example.org/test?\u003E", + "base": "about:blank", + "href": "http://example.org/test?%3E", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?%3E", + "hash": "" + }, + { + "input": "http://example.org/test?\u2323", + "base": "about:blank", + "href": "http://example.org/test?%E2%8C%A3", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?%E2%8C%A3", + "hash": "" + }, + { + "input": "http://example.org/test?%23%23", + "base": "about:blank", + "href": "http://example.org/test?%23%23", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?%23%23", + "hash": "" + }, + { + "input": "http://example.org/test?%GH", + "base": "about:blank", + "href": "http://example.org/test?%GH", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?%GH", + "hash": "" + }, + { + "input": "http://example.org/test?a#%EF", + "base": "about:blank", + "href": "http://example.org/test?a#%EF", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?a", + "hash": "#%EF" + }, + { + "input": "http://example.org/test?a#%GH", + "base": "about:blank", + "href": "http://example.org/test?a#%GH", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?a", + "hash": "#%GH" + }, + "URLs that require a non-about:blank base. (Also serve as invalid base tests.)", + { + "input": "a", + "base": "about:blank", + "failure": true + }, + { + "input": "a/", + "base": "about:blank", + "failure": true + }, + { + "input": "a//", + "base": "about:blank", + "failure": true + }, + "Bases that don't fail to parse but fail to be bases", + { + "input": "test-a-colon.html", + "base": "a:", + "failure": true + }, + { + "input": "test-a-colon-b.html", + "base": "a:b", + "failure": true + }, + "Other base URL tests, that must succeed", + { + "input": "test-a-colon-slash.html", + "base": "a:/", + "href": "a:/test-a-colon-slash.html", + "protocol": "a:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test-a-colon-slash.html", + "search": "", + "hash": "" + }, + { + "input": "test-a-colon-slash-slash.html", + "base": "a://", + "href": "a:///test-a-colon-slash-slash.html", + "protocol": "a:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test-a-colon-slash-slash.html", + "search": "", + "hash": "" + }, + { + "input": "test-a-colon-slash-b.html", + "base": "a:/b", + "href": "a:/test-a-colon-slash-b.html", + "protocol": "a:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test-a-colon-slash-b.html", + "search": "", + "hash": "" + }, + { + "input": "test-a-colon-slash-slash-b.html", + "base": "a://b", + "href": "a://b/test-a-colon-slash-slash-b.html", + "protocol": "a:", + "username": "", + "password": "", + "host": "b", + "hostname": "b", + "port": "", + "pathname": "/test-a-colon-slash-slash-b.html", + "search": "", + "hash": "" + }, + "Null code point in fragment", + { + "input": "http://example.org/test?a#b\u0000c", + "base": "about:blank", + "href": "http://example.org/test?a#b%00c", + "protocol": "http:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?a", + "hash": "#b%00c" + }, + { + "input": "non-spec://example.org/test?a#b\u0000c", + "base": "about:blank", + "href": "non-spec://example.org/test?a#b%00c", + "protocol": "non-spec:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/test", + "search": "?a", + "hash": "#b%00c" + }, + { + "input": "non-spec:/test?a#b\u0000c", + "base": "about:blank", + "href": "non-spec:/test?a#b%00c", + "protocol": "non-spec:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/test", + "search": "?a", + "hash": "#b%00c" + }, + "First scheme char - not allowed: https://github.com/whatwg/url/issues/464", + { + "input": "10.0.0.7:8080/foo.html", + "base": "file:///some/dir/bar.html", + "href": "file:///some/dir/10.0.0.7:8080/foo.html", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/some/dir/10.0.0.7:8080/foo.html", + "search": "", + "hash": "" + }, + "Subsequent scheme chars - not allowed", + { + "input": "a!@$*=/foo.html", + "base": "file:///some/dir/bar.html", + "href": "file:///some/dir/a!@$*=/foo.html", + "protocol": "file:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "/some/dir/a!@$*=/foo.html", + "search": "", + "hash": "" + }, + "First and subsequent scheme chars - allowed", + { + "input": "a1234567890-+.:foo/bar", + "base": "http://example.com/dir/file", + "href": "a1234567890-+.:foo/bar", + "protocol": "a1234567890-+.:", + "username": "", + "password": "", + "host": "", + "hostname": "", + "port": "", + "pathname": "foo/bar", + "search": "", + "hash": "" + }, + "IDNA ignored code points in file URLs hosts", + { + "input": "file://a\u00ADb/p", + "base": "about:blank", + "href": "file://ab/p", + "protocol": "file:", + "username": "", + "password": "", + "host": "ab", + "hostname": "ab", + "port": "", + "pathname": "/p", + "search": "", + "hash": "" + }, + { + "input": "file://a%C2%ADb/p", + "base": "about:blank", + "href": "file://ab/p", + "protocol": "file:", + "username": "", + "password": "", + "host": "ab", + "hostname": "ab", + "port": "", + "pathname": "/p", + "search": "", + "hash": "" + }, + "Empty host after the domain to ASCII", + { + "input": "file://\u00ad/p", + "base": "about:blank", + "failure": true + }, + { + "input": "file://%C2%AD/p", + "base": "about:blank", + "failure": true + }, + { + "input": "file://xn--/p", + "base": "about:blank", + "failure": true + }, + "https://bugzilla.mozilla.org/show_bug.cgi?id=1647058", + { + "input": "#link", + "base": "https://example.org/##link", + "href": "https://example.org/#link", + "protocol": "https:", + "username": "", + "password": "", + "host": "example.org", + "hostname": "example.org", + "port": "", + "pathname": "/", + "search": "", + "hash": "#link" + } +] diff --git a/vendor/wasi-0.9.0+wasi-snapshot-preview1/.cargo-checksum.json b/vendor/wasi-0.9.0+wasi-snapshot-preview1/.cargo-checksum.json deleted file mode 100644 index 05c3a22697..0000000000 --- a/vendor/wasi-0.9.0+wasi-snapshot-preview1/.cargo-checksum.json +++ /dev/null @@ -1 +0,0 @@ -{"files":{"CODE_OF_CONDUCT.md":"a13aaaf393818bd91207c618724d3fb74944ca5161201822a84af951bcf655ef","CONTRIBUTING.md":"2c908a3e263dc35dfed131c02ff907cd72fafb2c2096e4ba9b1e0cbb7a1b76df","Cargo.toml":"2ecba6e9e633226bc0a26ca5dd580c97c510be660fa348cea248125d90e85bf2","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-Apache-2.0_WITH_LLVM-exception":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","ORG_CODE_OF_CONDUCT.md":"a62b69bf86e605ee1bcbb2f0a12ba79e4cebb6983a7b6491949750aecc4f2178","README.md":"9412b3834687f28f0fae01a6e45b1309733ac92dcf04ef3ef36a823e76a6fed2","SECURITY.md":"4d75afb09dd28eb5982e3a1f768ee398d90204669ceef3240a16b31dcf04148a","old-bitflags.patch":"6a35cdbe866fbb51608195b74f0e6c0d37201ed933e473588cc2ab6211916b40","src/error.rs":"96818880fab83125079842e35aacb49333ac66699e223f896699e4fdb88b99e8","src/lib.rs":"7bfc4ffb02d1abfe25f3682affa3a50ca1e7b9d67a478a3d0f2e7788aeaab2b4","src/lib_generated.rs":"7983898c5fc69db19047cf5c3da5ed615b68859094cad8de9a3bc63d1a28de15"},"package":"cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"} \ No newline at end of file diff --git a/vendor/wasi-0.9.0+wasi-snapshot-preview1/CODE_OF_CONDUCT.md b/vendor/wasi-0.9.0+wasi-snapshot-preview1/CODE_OF_CONDUCT.md deleted file mode 100644 index 5c5ebdd259..0000000000 --- a/vendor/wasi-0.9.0+wasi-snapshot-preview1/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,49 +0,0 @@ -# Contributor Covenant Code of Conduct - -*Note*: this Code of Conduct pertains to individuals' behavior. Please also see the [Organizational Code of Conduct][OCoC]. - -## 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 Bytecode Alliance CoC team at [report@bytecodealliance.org](mailto:report@bytecodealliance.org). The CoC team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The CoC 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 Bytecode Alliance'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] - -[OCoC]: ORG_CODE_OF_CONDUCT.md -[homepage]: https://www.contributor-covenant.org -[version]: https://www.contributor-covenant.org/version/1/4/ diff --git a/vendor/wasi-0.9.0+wasi-snapshot-preview1/CONTRIBUTING.md b/vendor/wasi-0.9.0+wasi-snapshot-preview1/CONTRIBUTING.md deleted file mode 100644 index 2db6d0ddf3..0000000000 --- a/vendor/wasi-0.9.0+wasi-snapshot-preview1/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.9.0+wasi-snapshot-preview1/Cargo.toml b/vendor/wasi-0.9.0+wasi-snapshot-preview1/Cargo.toml deleted file mode 100644 index cd0dfb5351..0000000000 --- a/vendor/wasi-0.9.0+wasi-snapshot-preview1/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] -edition = "2018" -name = "wasi" -version = "0.9.0+wasi-snapshot-preview1" -authors = ["The Cranelift Project Developers"] -description = "Experimental WASI API bindings for Rust" -documentation = "https://docs.rs/wasi" -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/bytecodealliance/wasi" -[dependencies.compiler_builtins] -version = "0.1" -optional = true - -[dependencies.core] -version = "1.0" -optional = true -package = "rustc-std-workspace-core" - -[dependencies.rustc-std-workspace-alloc] -version = "1.0" -optional = true - -[features] -default = ["std"] -rustc-dep-of-std = ["compiler_builtins", "core", "rustc-std-workspace-alloc"] -std = [] -[badges.maintenance] -status = "experimental" diff --git a/vendor/wasi-0.9.0+wasi-snapshot-preview1/LICENSE-Apache-2.0_WITH_LLVM-exception b/vendor/wasi-0.9.0+wasi-snapshot-preview1/LICENSE-Apache-2.0_WITH_LLVM-exception deleted file mode 100644 index f9d81955f4..0000000000 --- a/vendor/wasi-0.9.0+wasi-snapshot-preview1/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.9.0+wasi-snapshot-preview1/ORG_CODE_OF_CONDUCT.md b/vendor/wasi-0.9.0+wasi-snapshot-preview1/ORG_CODE_OF_CONDUCT.md deleted file mode 100644 index 6f4fb3f537..0000000000 --- a/vendor/wasi-0.9.0+wasi-snapshot-preview1/ORG_CODE_OF_CONDUCT.md +++ /dev/null @@ -1,143 +0,0 @@ -# Bytecode Alliance Organizational Code of Conduct (OCoC) - -*Note*: this Code of Conduct pertains to organizations' behavior. Please also see the [Individual Code of Conduct](CODE_OF_CONDUCT.md). - -## Preamble - -The Bytecode Alliance (BA) welcomes involvement from organizations, -including commercial organizations. This document is an -*organizational* code of conduct, intended particularly to provide -guidance to commercial organizations. It is distinct from the -[Individual Code of Conduct (ICoC)](CODE_OF_CONDUCT.md), and does not -replace the ICoC. This OCoC applies to any group of people acting in -concert as a BA member or as a participant in BA activities, whether -or not that group is formally incorporated in some jurisdiction. - -The code of conduct described below is not a set of rigid rules, and -we did not write it to encompass every conceivable scenario that might -arise. For example, it is theoretically possible there would be times -when asserting patents is in the best interest of the BA community as -a whole. In such instances, consult with the BA, strive for -consensus, and interpret these rules with an intent that is generous -to the community the BA serves. - -While we may revise these guidelines from time to time based on -real-world experience, overall they are based on a simple principle: - -*Bytecode Alliance members should observe the distinction between - public community functions and private functions — especially - commercial ones — and should ensure that the latter support, or at - least do not harm, the former.* - -## Guidelines - - * **Do not cause confusion about Wasm standards or interoperability.** - - Having an interoperable WebAssembly core is a high priority for - the BA, and members should strive to preserve that core. It is fine - to develop additional non-standard features or APIs, but they - should always be clearly distinguished from the core interoperable - Wasm. - - Treat the WebAssembly name and any BA-associated names with - respect, and follow BA trademark and branding guidelines. If you - distribute a customized version of software originally produced by - the BA, or if you build a product or service using BA-derived - software, use names that clearly distinguish your work from the - original. (You should still provide proper attribution to the - original, of course, wherever such attribution would normally be - given.) - - Further, do not use the WebAssembly name or BA-associated names in - other public namespaces in ways that could cause confusion, e.g., - in company names, names of commercial service offerings, domain - names, publicly-visible social media accounts or online service - accounts, etc. It may sometimes be reasonable, however, to - register such a name in a new namespace and then immediately donate - control of that account to the BA, because that would help the project - maintain its identity. - - For further guidance, see the BA Trademark and Branding Policy - [TODO: create policy, then insert link]. - - * **Do not restrict contributors.** If your company requires - employees or contractors to sign non-compete agreements, those - agreements must not prevent people from participating in the BA or - contributing to related projects. - - This does not mean that all non-compete agreements are incompatible - with this code of conduct. For example, a company may restrict an - employee's ability to solicit the company's customers. However, an - agreement must not block any form of technical or social - participation in BA activities, including but not limited to the - implementation of particular features. - - The accumulation of experience and expertise in individual persons, - who are ultimately free to direct their energy and attention as - they decide, is one of the most important drivers of progress in - open source projects. A company that limits this freedom may hinder - the success of the BA's efforts. - - * **Do not use patents as offensive weapons.** If any BA participant - prevents the adoption or development of BA technologies by - asserting its patents, that undermines the purpose of the - coalition. The collaboration fostered by the BA cannot include - members who act to undermine its work. - - * **Practice responsible disclosure** for security vulnerabilities. - Use designated, non-public reporting channels to disclose technical - vulnerabilities, and give the project a reasonable period to - respond, remediate, and patch. [TODO: optionally include the - security vulnerability reporting URL here.] - - Vulnerability reporters may patch their company's own offerings, as - long as that patching does not significantly delay the reporting of - the vulnerability. Vulnerability information should never be used - for unilateral commercial advantage. Vendors may legitimately - compete on the speed and reliability with which they deploy - security fixes, but withholding vulnerability information damages - everyone in the long run by risking harm to the BA project's - reputation and to the security of all users. - - * **Respect the letter and spirit of open source practice.** While - there is not space to list here all possible aspects of standard - open source practice, some examples will help show what we mean: - - * Abide by all applicable open source license terms. Do not engage - in copyright violation or misattribution of any kind. - - * Do not claim others' ideas or designs as your own. - - * When others engage in publicly visible work (e.g., an upcoming - demo that is coordinated in a public issue tracker), do not - unilaterally announce early releases or early demonstrations of - that work ahead of their schedule in order to secure private - advantage (such as marketplace advantage) for yourself. - - The BA reserves the right to determine what constitutes good open - source practices and to take action as it deems appropriate to - encourage, and if necessary enforce, such practices. - -## Enforcement - -Instances of organizational behavior in violation of the OCoC may -be reported by contacting the Bytecode Alliance CoC team at -[report@bytecodealliance.org](mailto:report@bytecodealliance.org). The -CoC team will review and investigate all complaints, and will respond -in a way that it deems appropriate to the circumstances. The CoC team -is obligated to maintain confidentiality with regard to the reporter of -an incident. Further details of specific enforcement policies may be -posted separately. - -When the BA deems an organization in violation of this OCoC, the BA -will, at its sole discretion, determine what action to take. The BA -will decide what type, degree, and duration of corrective action is -needed, if any, before a violating organization can be considered for -membership (if it was not already a member) or can have its membership -reinstated (if it was a member and the BA canceled its membership due -to the violation). - -In practice, the BA's first approach will be to start a conversation, -with punitive enforcement used only as a last resort. Violations -often turn out to be unintentional and swiftly correctable with all -parties acting in good faith. diff --git a/vendor/wasi-0.9.0+wasi-snapshot-preview1/README.md b/vendor/wasi-0.9.0+wasi-snapshot-preview1/README.md deleted file mode 100644 index e92f50e3f5..0000000000 --- a/vendor/wasi-0.9.0+wasi-snapshot-preview1/README.md +++ /dev/null @@ -1,76 +0,0 @@ -

    - -This crate contains API bindings for [WASI](https://github.com/WebAssembly/WASI) -system calls in Rust, and currently reflects the `wasi_snapshot_preview1` -module. 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. - -The `wasi` crate is also entirely procedurally generated from the `*.witx` files -describing the WASI apis. While some conveniences are provided the bindings here -are intentionally low-level! - -# Usage - -First you can depend on this crate via `Cargo.toml`: - -```toml -[dependencies] -wasi = "0.8.0" -``` - -Next you can use the APIs in the root of the module like so: - -```rust -fn main() { - let stdout = 1; - let message = "Hello, World!\n"; - let data = [wasi::Ciovec { - buf: message.as_ptr(), - buf_len: message.len(), - }]; - wasi::fd_write(stdout, &data).unwrap(); -} -``` - -Next you can use a tool like [`cargo -wasi`](https://github.com/bytecodealliance/cargo-wasi) to compile and run your -project: - -To compile Rust projects to wasm using WASI, use the `wasm32-wasi` target, -like this: - -``` -$ cargo wasi run - Compiling wasi v0.8.0+wasi-snapshot-preview1 - Compiling wut v0.1.0 (/code) - Finished dev [unoptimized + debuginfo] target(s) in 0.34s - Running `/.cargo/bin/cargo-wasi target/wasm32-wasi/debug/wut.wasm` - Running `target/wasm32-wasi/debug/wut.wasm` -Hello, World! -``` - -# License - -This project is licensed under the Apache 2.0 license with the LLVM exception. -See [LICENSE](LICENSE) for more details. - -### Contribution - -Unless you explicitly state otherwise, any contribution intentionally submitted -for inclusion in this project by you, as defined in the Apache-2.0 license, -shall be licensed as above, without any additional terms or conditions. diff --git a/vendor/wasi-0.9.0+wasi-snapshot-preview1/SECURITY.md b/vendor/wasi-0.9.0+wasi-snapshot-preview1/SECURITY.md deleted file mode 100644 index 3513b9cb35..0000000000 --- a/vendor/wasi-0.9.0+wasi-snapshot-preview1/SECURITY.md +++ /dev/null @@ -1,29 +0,0 @@ -# Security Policy - -Building secure foundations for software development is at the core of what we do in the Bytecode Alliance. Contributions of external security researchers are a vital part of that. - -## Scope - -If you believe you've found a security issue in any website, service, or software owned or operated by the Bytecode Alliance, we encourage you to notify us. - -## How to Submit a Report - -To submit a vulnerability report to the Bytecode Alliance, please contact us at [security@bytecodealliance.org](mailto:security@bytecodealliance.org). Your submission will be reviewed and validated by a member of our security team. - -## Safe Harbor - -The Bytecode Alliance supports safe harbor for security researchers who: - -* Make a good faith effort to avoid privacy violations, destruction of data, and interruption or degradation of our services. -* Only interact with accounts you own or with explicit permission of the account holder. If you do encounter Personally Identifiable Information (PII) contact us immediately, do not proceed with access, and immediately purge any local information. -* Provide us with a reasonable amount of time to resolve vulnerabilities prior to any disclosure to the public or a third-party. - -We will consider activities conducted consistent with this policy to constitute "authorized" conduct and will not pursue civil action or initiate a complaint to law enforcement. We will help to the extent we can if legal action is initiated by a third party against you. - -Please submit a report to us before engaging in conduct that may be inconsistent with or unaddressed by this policy. - -## Preferences - -* Please provide detailed reports with reproducible steps and a clearly defined impact. -* Submit one vulnerability per report. -* Social engineering (e.g. phishing, vishing, smishing) is prohibited. diff --git a/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/error.rs b/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/error.rs deleted file mode 100644 index 2f2aaf4b90..0000000000 --- a/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/error.rs +++ /dev/null @@ -1,51 +0,0 @@ -use super::Errno; -use core::fmt; -use core::num::NonZeroU16; - -/// A raw error returned by wasi APIs, internally containing a 16-bit error -/// code. -#[derive(Copy, Clone, PartialEq, Eq, Ord, PartialOrd)] -pub struct Error { - code: NonZeroU16, -} - -impl Error { - /// Constructs a new error from a raw error code, returning `None` if the - /// error code is zero (which means success). - pub fn from_raw_error(error: Errno) -> Option { - Some(Error { - code: NonZeroU16::new(error)?, - }) - } - - /// Returns the raw error code that this error represents. - pub fn raw_error(&self) -> u16 { - self.code.get() - } -} - -impl fmt::Display for Error { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - write!( - f, - "{} (error {})", - super::strerror(self.code.get()), - self.code - )?; - Ok(()) - } -} - -impl fmt::Debug for Error { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("Error") - .field("code", &self.code) - .field("message", &super::strerror(self.code.get())) - .finish() - } -} - -#[cfg(feature = "std")] -extern crate std; -#[cfg(feature = "std")] -impl std::error::Error for Error {} diff --git a/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib.rs b/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib.rs deleted file mode 100644 index 45c2469277..0000000000 --- a/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib.rs +++ /dev/null @@ -1,36 +0,0 @@ -//! Raw API bindings to the WebAssembly System Interface (WASI) -//! -//! This crate provides Rust API bindings to WASI APIs. All WASI APIs are -//! exported from this crate and provided with the appropriate type signatures. -//! This crate is entirely procedurally generated from the `*.witx` files that -//! describe the WASI API. -//! -//! # WASI API Version -//! -//! The WASI API is evolving over time. It is both gaining new features as well -//! as tweaking the ABI of existing features. As a result it's important to -//! understand what version of this crate you're using and how it relates to -//! the WASI version of the spec. -//! -//! The WASI specification is organized into phases where there is a snapshot -//! at any one point in time describing the current state of the specification. -//! This crate implements a particular snapshot. You can find the snapshot -//! version implemented in this crate in the build metadata of the crate -//! version number. For example something like `0.9.0+wasi-snapshot-preview1` -//! means that this crate's own personal version is 0.9.0 and it implements the -//! `wasi-snapshot-preview1` snapshot. A major release of this crate (i.e. -//! bumping the "0.9.0") is expected whenever the generated code changes -//! or a new WASI snapshot is used. -//! -//! # Crate Features -//! -//! This crate supports one feature, `std`, which implements the standard -//! `Error` trait for the exported [`Error`] type in this crate. This is -//! enabled by default but can be disabled to make the library `no_std` -//! compatible. - -#![no_std] - -mod error; -mod lib_generated; -pub use lib_generated::*; diff --git a/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib_generated.rs b/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib_generated.rs deleted file mode 100644 index 8adf466470..0000000000 --- a/vendor/wasi-0.9.0+wasi-snapshot-preview1/src/lib_generated.rs +++ /dev/null @@ -1,1853 +0,0 @@ -// This file is automatically generated, DO NOT EDIT -// -// To regenerate this file run the `crates/generate-raw` command - -use core::mem::MaybeUninit; - -pub use crate::error::Error; -pub type Result = core::result::Result; -pub type Size = usize; -pub type Filesize = u64; -pub type Timestamp = u64; -pub type Clockid = u32; -/// The clock measuring real time. Time value zero corresponds with -/// 1970-01-01T00:00:00Z. -pub const CLOCKID_REALTIME: Clockid = 0; -/// The store-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. -pub const CLOCKID_MONOTONIC: Clockid = 1; -/// The CPU-time clock associated with the current process. -pub const CLOCKID_PROCESS_CPUTIME_ID: Clockid = 2; -/// The CPU-time clock associated with the current thread. -pub const CLOCKID_THREAD_CPUTIME_ID: Clockid = 3; -pub type Errno = u16; -/// No error occurred. System call completed successfully. -pub const ERRNO_SUCCESS: Errno = 0; -/// Argument list too long. -pub const ERRNO_2BIG: Errno = 1; -/// Permission denied. -pub const ERRNO_ACCES: Errno = 2; -/// Address in use. -pub const ERRNO_ADDRINUSE: Errno = 3; -/// Address not available. -pub const ERRNO_ADDRNOTAVAIL: Errno = 4; -/// Address family not supported. -pub const ERRNO_AFNOSUPPORT: Errno = 5; -/// Resource unavailable, or operation would block. -pub const ERRNO_AGAIN: Errno = 6; -/// Connection already in progress. -pub const ERRNO_ALREADY: Errno = 7; -/// Bad file descriptor. -pub const ERRNO_BADF: Errno = 8; -/// Bad message. -pub const ERRNO_BADMSG: Errno = 9; -/// Device or resource busy. -pub const ERRNO_BUSY: Errno = 10; -/// Operation canceled. -pub const ERRNO_CANCELED: Errno = 11; -/// No child processes. -pub const ERRNO_CHILD: Errno = 12; -/// Connection aborted. -pub const ERRNO_CONNABORTED: Errno = 13; -/// Connection refused. -pub const ERRNO_CONNREFUSED: Errno = 14; -/// Connection reset. -pub const ERRNO_CONNRESET: Errno = 15; -/// Resource deadlock would occur. -pub const ERRNO_DEADLK: Errno = 16; -/// Destination address required. -pub const ERRNO_DESTADDRREQ: Errno = 17; -/// Mathematics argument out of domain of function. -pub const ERRNO_DOM: Errno = 18; -/// Reserved. -pub const ERRNO_DQUOT: Errno = 19; -/// File exists. -pub const ERRNO_EXIST: Errno = 20; -/// Bad address. -pub const ERRNO_FAULT: Errno = 21; -/// File too large. -pub const ERRNO_FBIG: Errno = 22; -/// Host is unreachable. -pub const ERRNO_HOSTUNREACH: Errno = 23; -/// Identifier removed. -pub const ERRNO_IDRM: Errno = 24; -/// Illegal byte sequence. -pub const ERRNO_ILSEQ: Errno = 25; -/// Operation in progress. -pub const ERRNO_INPROGRESS: Errno = 26; -/// Interrupted function. -pub const ERRNO_INTR: Errno = 27; -/// Invalid argument. -pub const ERRNO_INVAL: Errno = 28; -/// I/O error. -pub const ERRNO_IO: Errno = 29; -/// Socket is connected. -pub const ERRNO_ISCONN: Errno = 30; -/// Is a directory. -pub const ERRNO_ISDIR: Errno = 31; -/// Too many levels of symbolic links. -pub const ERRNO_LOOP: Errno = 32; -/// File descriptor value too large. -pub const ERRNO_MFILE: Errno = 33; -/// Too many links. -pub const ERRNO_MLINK: Errno = 34; -/// Message too large. -pub const ERRNO_MSGSIZE: Errno = 35; -/// Reserved. -pub const ERRNO_MULTIHOP: Errno = 36; -/// Filename too long. -pub const ERRNO_NAMETOOLONG: Errno = 37; -/// Network is down. -pub const ERRNO_NETDOWN: Errno = 38; -/// Connection aborted by network. -pub const ERRNO_NETRESET: Errno = 39; -/// Network unreachable. -pub const ERRNO_NETUNREACH: Errno = 40; -/// Too many files open in system. -pub const ERRNO_NFILE: Errno = 41; -/// No buffer space available. -pub const ERRNO_NOBUFS: Errno = 42; -/// No such device. -pub const ERRNO_NODEV: Errno = 43; -/// No such file or directory. -pub const ERRNO_NOENT: Errno = 44; -/// Executable file format error. -pub const ERRNO_NOEXEC: Errno = 45; -/// No locks available. -pub const ERRNO_NOLCK: Errno = 46; -/// Reserved. -pub const ERRNO_NOLINK: Errno = 47; -/// Not enough space. -pub const ERRNO_NOMEM: Errno = 48; -/// No message of the desired type. -pub const ERRNO_NOMSG: Errno = 49; -/// Protocol not available. -pub const ERRNO_NOPROTOOPT: Errno = 50; -/// No space left on device. -pub const ERRNO_NOSPC: Errno = 51; -/// Function not supported. -pub const ERRNO_NOSYS: Errno = 52; -/// The socket is not connected. -pub const ERRNO_NOTCONN: Errno = 53; -/// Not a directory or a symbolic link to a directory. -pub const ERRNO_NOTDIR: Errno = 54; -/// Directory not empty. -pub const ERRNO_NOTEMPTY: Errno = 55; -/// State not recoverable. -pub const ERRNO_NOTRECOVERABLE: Errno = 56; -/// Not a socket. -pub const ERRNO_NOTSOCK: Errno = 57; -/// Not supported, or operation not supported on socket. -pub const ERRNO_NOTSUP: Errno = 58; -/// Inappropriate I/O control operation. -pub const ERRNO_NOTTY: Errno = 59; -/// No such device or address. -pub const ERRNO_NXIO: Errno = 60; -/// Value too large to be stored in data type. -pub const ERRNO_OVERFLOW: Errno = 61; -/// Previous owner died. -pub const ERRNO_OWNERDEAD: Errno = 62; -/// Operation not permitted. -pub const ERRNO_PERM: Errno = 63; -/// Broken pipe. -pub const ERRNO_PIPE: Errno = 64; -/// Protocol error. -pub const ERRNO_PROTO: Errno = 65; -/// Protocol not supported. -pub const ERRNO_PROTONOSUPPORT: Errno = 66; -/// Protocol wrong type for socket. -pub const ERRNO_PROTOTYPE: Errno = 67; -/// Result too large. -pub const ERRNO_RANGE: Errno = 68; -/// Read-only file system. -pub const ERRNO_ROFS: Errno = 69; -/// Invalid seek. -pub const ERRNO_SPIPE: Errno = 70; -/// No such process. -pub const ERRNO_SRCH: Errno = 71; -/// Reserved. -pub const ERRNO_STALE: Errno = 72; -/// Connection timed out. -pub const ERRNO_TIMEDOUT: Errno = 73; -/// Text file busy. -pub const ERRNO_TXTBSY: Errno = 74; -/// Cross-device link. -pub const ERRNO_XDEV: Errno = 75; -/// Extension: Capabilities insufficient. -pub const ERRNO_NOTCAPABLE: Errno = 76; -pub(crate) fn strerror(code: u16) -> &'static str { - match code { - ERRNO_SUCCESS => "No error occurred. System call completed successfully.", - ERRNO_2BIG => "Argument list too long.", - ERRNO_ACCES => "Permission denied.", - ERRNO_ADDRINUSE => "Address in use.", - ERRNO_ADDRNOTAVAIL => "Address not available.", - ERRNO_AFNOSUPPORT => "Address family not supported.", - ERRNO_AGAIN => "Resource unavailable, or operation would block.", - ERRNO_ALREADY => "Connection already in progress.", - ERRNO_BADF => "Bad file descriptor.", - ERRNO_BADMSG => "Bad message.", - ERRNO_BUSY => "Device or resource busy.", - ERRNO_CANCELED => "Operation canceled.", - ERRNO_CHILD => "No child processes.", - ERRNO_CONNABORTED => "Connection aborted.", - ERRNO_CONNREFUSED => "Connection refused.", - ERRNO_CONNRESET => "Connection reset.", - ERRNO_DEADLK => "Resource deadlock would occur.", - ERRNO_DESTADDRREQ => "Destination address required.", - ERRNO_DOM => "Mathematics argument out of domain of function.", - ERRNO_DQUOT => "Reserved.", - ERRNO_EXIST => "File exists.", - ERRNO_FAULT => "Bad address.", - ERRNO_FBIG => "File too large.", - ERRNO_HOSTUNREACH => "Host is unreachable.", - ERRNO_IDRM => "Identifier removed.", - ERRNO_ILSEQ => "Illegal byte sequence.", - ERRNO_INPROGRESS => "Operation in progress.", - ERRNO_INTR => "Interrupted function.", - ERRNO_INVAL => "Invalid argument.", - ERRNO_IO => "I/O error.", - ERRNO_ISCONN => "Socket is connected.", - ERRNO_ISDIR => "Is a directory.", - ERRNO_LOOP => "Too many levels of symbolic links.", - ERRNO_MFILE => "File descriptor value too large.", - ERRNO_MLINK => "Too many links.", - ERRNO_MSGSIZE => "Message too large.", - ERRNO_MULTIHOP => "Reserved.", - ERRNO_NAMETOOLONG => "Filename too long.", - ERRNO_NETDOWN => "Network is down.", - ERRNO_NETRESET => "Connection aborted by network.", - ERRNO_NETUNREACH => "Network unreachable.", - ERRNO_NFILE => "Too many files open in system.", - ERRNO_NOBUFS => "No buffer space available.", - ERRNO_NODEV => "No such device.", - ERRNO_NOENT => "No such file or directory.", - ERRNO_NOEXEC => "Executable file format error.", - ERRNO_NOLCK => "No locks available.", - ERRNO_NOLINK => "Reserved.", - ERRNO_NOMEM => "Not enough space.", - ERRNO_NOMSG => "No message of the desired type.", - ERRNO_NOPROTOOPT => "Protocol not available.", - ERRNO_NOSPC => "No space left on device.", - ERRNO_NOSYS => "Function not supported.", - ERRNO_NOTCONN => "The socket is not connected.", - ERRNO_NOTDIR => "Not a directory or a symbolic link to a directory.", - ERRNO_NOTEMPTY => "Directory not empty.", - ERRNO_NOTRECOVERABLE => "State not recoverable.", - ERRNO_NOTSOCK => "Not a socket.", - ERRNO_NOTSUP => "Not supported, or operation not supported on socket.", - ERRNO_NOTTY => "Inappropriate I/O control operation.", - ERRNO_NXIO => "No such device or address.", - ERRNO_OVERFLOW => "Value too large to be stored in data type.", - ERRNO_OWNERDEAD => "Previous owner died.", - ERRNO_PERM => "Operation not permitted.", - ERRNO_PIPE => "Broken pipe.", - ERRNO_PROTO => "Protocol error.", - ERRNO_PROTONOSUPPORT => "Protocol not supported.", - ERRNO_PROTOTYPE => "Protocol wrong type for socket.", - ERRNO_RANGE => "Result too large.", - ERRNO_ROFS => "Read-only file system.", - ERRNO_SPIPE => "Invalid seek.", - ERRNO_SRCH => "No such process.", - ERRNO_STALE => "Reserved.", - ERRNO_TIMEDOUT => "Connection timed out.", - ERRNO_TXTBSY => "Text file busy.", - ERRNO_XDEV => "Cross-device link.", - ERRNO_NOTCAPABLE => "Extension: Capabilities insufficient.", - _ => "Unknown error.", - } -} -pub type Rights = u64; -/// The right to invoke `fd_datasync`. -/// If `path_open` is set, includes the right to invoke -/// `path_open` with `fdflag::dsync`. -pub const RIGHTS_FD_DATASYNC: Rights = 0x1; -/// The right to invoke `fd_read` and `sock_recv`. -/// If `rights::fd_seek` is set, includes the right to invoke `fd_pread`. -pub const RIGHTS_FD_READ: Rights = 0x2; -/// The right to invoke `fd_seek`. This flag implies `rights::fd_tell`. -pub const RIGHTS_FD_SEEK: Rights = 0x4; -/// The right to invoke `fd_fdstat_set_flags`. -pub const RIGHTS_FD_FDSTAT_SET_FLAGS: Rights = 0x8; -/// The right to invoke `fd_sync`. -/// If `path_open` is set, includes the right to invoke -/// `path_open` with `fdflag::rsync` and `fdflag::dsync`. -pub const RIGHTS_FD_SYNC: Rights = 0x10; -/// The right to invoke `fd_seek` in such a way that the file offset -/// remains unaltered (i.e., `WHENCE_CUR` with offset zero), or to -/// invoke `fd_tell`. -pub const RIGHTS_FD_TELL: Rights = 0x20; -/// The right to invoke `fd_write` and `sock_send`. -/// If `rights::fd_seek` is set, includes the right to invoke `fd_pwrite`. -pub const RIGHTS_FD_WRITE: Rights = 0x40; -/// The right to invoke `fd_advise`. -pub const RIGHTS_FD_ADVISE: Rights = 0x80; -/// The right to invoke `fd_allocate`. -pub const RIGHTS_FD_ALLOCATE: Rights = 0x100; -/// The right to invoke `path_create_directory`. -pub const RIGHTS_PATH_CREATE_DIRECTORY: Rights = 0x200; -/// If `path_open` is set, the right to invoke `path_open` with `oflags::creat`. -pub const RIGHTS_PATH_CREATE_FILE: Rights = 0x400; -/// The right to invoke `path_link` with the file descriptor as the -/// source directory. -pub const RIGHTS_PATH_LINK_SOURCE: Rights = 0x800; -/// The right to invoke `path_link` with the file descriptor as the -/// target directory. -pub const RIGHTS_PATH_LINK_TARGET: Rights = 0x1000; -/// The right to invoke `path_open`. -pub const RIGHTS_PATH_OPEN: Rights = 0x2000; -/// The right to invoke `fd_readdir`. -pub const RIGHTS_FD_READDIR: Rights = 0x4000; -/// The right to invoke `path_readlink`. -pub const RIGHTS_PATH_READLINK: Rights = 0x8000; -/// The right to invoke `path_rename` with the file descriptor as the source directory. -pub const RIGHTS_PATH_RENAME_SOURCE: Rights = 0x10000; -/// The right to invoke `path_rename` with the file descriptor as the target directory. -pub const RIGHTS_PATH_RENAME_TARGET: Rights = 0x20000; -/// The right to invoke `path_filestat_get`. -pub const RIGHTS_PATH_FILESTAT_GET: Rights = 0x40000; -/// The right to change a file's size (there is no `path_filestat_set_size`). -/// If `path_open` is set, includes the right to invoke `path_open` with `oflags::trunc`. -pub const RIGHTS_PATH_FILESTAT_SET_SIZE: Rights = 0x80000; -/// The right to invoke `path_filestat_set_times`. -pub const RIGHTS_PATH_FILESTAT_SET_TIMES: Rights = 0x100000; -/// The right to invoke `fd_filestat_get`. -pub const RIGHTS_FD_FILESTAT_GET: Rights = 0x200000; -/// The right to invoke `fd_filestat_set_size`. -pub const RIGHTS_FD_FILESTAT_SET_SIZE: Rights = 0x400000; -/// The right to invoke `fd_filestat_set_times`. -pub const RIGHTS_FD_FILESTAT_SET_TIMES: Rights = 0x800000; -/// The right to invoke `path_symlink`. -pub const RIGHTS_PATH_SYMLINK: Rights = 0x1000000; -/// The right to invoke `path_remove_directory`. -pub const RIGHTS_PATH_REMOVE_DIRECTORY: Rights = 0x2000000; -/// The right to invoke `path_unlink_file`. -pub const RIGHTS_PATH_UNLINK_FILE: Rights = 0x4000000; -/// If `rights::fd_read` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype::fd_read`. -/// If `rights::fd_write` is set, includes the right to invoke `poll_oneoff` to subscribe to `eventtype::fd_write`. -pub const RIGHTS_POLL_FD_READWRITE: Rights = 0x8000000; -/// The right to invoke `sock_shutdown`. -pub const RIGHTS_SOCK_SHUTDOWN: Rights = 0x10000000; -pub type Fd = u32; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Iovec { - /// The address of the buffer to be filled. - pub buf: *mut u8, - /// The length of the buffer to be filled. - pub buf_len: Size, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Ciovec { - /// The address of the buffer to be written. - pub buf: *const u8, - /// The length of the buffer to be written. - pub buf_len: Size, -} -pub type IovecArray<'a> = &'a [Iovec]; -pub type CiovecArray<'a> = &'a [Ciovec]; -pub type Filedelta = i64; -pub type Whence = u8; -/// Seek relative to start-of-file. -pub const WHENCE_SET: Whence = 0; -/// Seek relative to current position. -pub const WHENCE_CUR: Whence = 1; -/// Seek relative to end-of-file. -pub const WHENCE_END: Whence = 2; -pub type Dircookie = u64; -pub type Dirnamlen = u32; -pub type Inode = u64; -pub type Filetype = u8; -/// The type of the file descriptor or file is unknown or is different from any of the other types specified. -pub const FILETYPE_UNKNOWN: Filetype = 0; -/// The file descriptor or file refers to a block device inode. -pub const FILETYPE_BLOCK_DEVICE: Filetype = 1; -/// The file descriptor or file refers to a character device inode. -pub const FILETYPE_CHARACTER_DEVICE: Filetype = 2; -/// The file descriptor or file refers to a directory inode. -pub const FILETYPE_DIRECTORY: Filetype = 3; -/// The file descriptor or file refers to a regular file inode. -pub const FILETYPE_REGULAR_FILE: Filetype = 4; -/// The file descriptor or file refers to a datagram socket. -pub const FILETYPE_SOCKET_DGRAM: Filetype = 5; -/// The file descriptor or file refers to a byte-stream socket. -pub const FILETYPE_SOCKET_STREAM: Filetype = 6; -/// The file refers to a symbolic link inode. -pub const FILETYPE_SYMBOLIC_LINK: Filetype = 7; -#[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: Dirnamlen, - /// The type of the file referred to by this directory entry. - pub d_type: Filetype, -} -pub type Advice = u8; -/// The application has no advice to give on its behavior with respect to the specified data. -pub const ADVICE_NORMAL: Advice = 0; -/// The application expects to access the specified data sequentially from lower offsets to higher offsets. -pub const ADVICE_SEQUENTIAL: Advice = 1; -/// The application expects to access the specified data in a random order. -pub const ADVICE_RANDOM: Advice = 2; -/// The application expects to access the specified data in the near future. -pub const ADVICE_WILLNEED: Advice = 3; -/// The application expects that it will not access the specified data in the near future. -pub const ADVICE_DONTNEED: Advice = 4; -/// The application expects to access the specified data once and then not reuse it thereafter. -pub const ADVICE_NOREUSE: Advice = 5; -pub type Fdflags = u16; -/// Append mode: Data written to the file is always appended to the file's end. -pub const FDFLAGS_APPEND: Fdflags = 0x1; -/// Write according to synchronized I/O data integrity completion. Only the data stored in the file is synchronized. -pub const FDFLAGS_DSYNC: Fdflags = 0x2; -/// Non-blocking mode. -pub const FDFLAGS_NONBLOCK: Fdflags = 0x4; -/// Synchronized read I/O operations. -pub const FDFLAGS_RSYNC: Fdflags = 0x8; -/// Write according to synchronized I/O file integrity completion. In -/// addition to synchronizing the data stored in the file, the implementation -/// may also synchronously update the file's metadata. -pub const FDFLAGS_SYNC: Fdflags = 0x10; -#[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 may be installed on new file descriptors that - /// are created through this file descriptor, e.g., through `path_open`. - pub fs_rights_inheriting: Rights, -} -pub type Device = u64; -pub type Fstflags = u16; -/// Adjust the last data access timestamp to the value stored in `filestat::st_atim`. -pub const FSTFLAGS_ATIM: Fstflags = 0x1; -/// Adjust the last data access timestamp to the time of clock `clock::realtime`. -pub const FSTFLAGS_ATIM_NOW: Fstflags = 0x2; -/// Adjust the last data modification timestamp to the value stored in `filestat::st_mtim`. -pub const FSTFLAGS_MTIM: Fstflags = 0x4; -/// Adjust the last data modification timestamp to the time of clock `clock::realtime`. -pub const FSTFLAGS_MTIM_NOW: Fstflags = 0x8; -pub type Lookupflags = u32; -/// As long as the resolved path corresponds to a symbolic link, it is expanded. -pub const LOOKUPFLAGS_SYMLINK_FOLLOW: Lookupflags = 0x1; -pub type Oflags = u16; -/// Create file if it does not exist. -pub const OFLAGS_CREAT: Oflags = 0x1; -/// Fail if not a directory. -pub const OFLAGS_DIRECTORY: Oflags = 0x2; -/// Fail if file already exists. -pub const OFLAGS_EXCL: Oflags = 0x4; -/// Truncate file to size 0. -pub const OFLAGS_TRUNC: Oflags = 0x8; -pub type Linkcount = u64; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Filestat { - /// Device ID of device containing the file. - pub dev: Device, - /// File serial number. - pub ino: Inode, - /// File type. - pub filetype: Filetype, - /// Number of hard links to the file. - pub 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 size: Filesize, - /// Last data access timestamp. - pub atim: Timestamp, - /// Last data modification timestamp. - pub mtim: Timestamp, - /// Last file status change timestamp. - pub ctim: Timestamp, -} -pub type Userdata = u64; -pub type Eventtype = u8; -/// The time value of clock `subscription::u.clock.clock_id` has -/// reached timestamp `subscription::u.clock.timeout`. -pub const EVENTTYPE_CLOCK: Eventtype = 0; -/// File descriptor `subscription::u.fd_readwrite.fd` has data -/// available for reading. This event always triggers for regular files. -pub const EVENTTYPE_FD_READ: Eventtype = 1; -/// File descriptor `subscription::u.fd_readwrite.fd` has capacity -/// available for writing. This event always triggers for regular files. -pub const EVENTTYPE_FD_WRITE: Eventtype = 2; -pub type Eventrwflags = u16; -/// The peer of this socket has closed or disconnected. -pub const EVENTRWFLAGS_FD_READWRITE_HANGUP: Eventrwflags = 0x1; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct EventFdReadwrite { - /// The number of bytes available for reading or writing. - pub nbytes: Filesize, - /// The state of the file descriptor. - pub flags: Eventrwflags, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union EventU { - /// When type is `eventtype::fd_read` or `eventtype::fd_write`: - pub fd_readwrite: EventFdReadwrite, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Event { - /// User-provided value that got attached to `subscription::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 r#type: Eventtype, - /// The contents of the event. - pub u: EventU, -} -pub type Subclockflags = u16; -/// If set, treat the timestamp provided in -/// `subscription::u.clock.timeout` as an absolute timestamp of clock -/// `subscription::u.clock.clock_id.` If clear, treat the timestamp -/// provided in `subscription::u.clock.timeout` relative to the -/// current time value of clock `subscription::u.clock.clock_id.` -pub const SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME: Subclockflags = 0x1; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct SubscriptionClock { - /// The clock against which to compare the timestamp. - pub id: Clockid, - /// The absolute or relative timestamp. - pub timeout: Timestamp, - /// The amount of time that the implementation 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 SubscriptionFdReadwrite { - /// The file descriptor on which to wait for it to become ready for reading or writing. - pub file_descriptor: Fd, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union SubscriptionU { - /// When type is `eventtype::clock`: - pub clock: SubscriptionClock, - /// When type is `eventtype::fd_read` or `eventtype::fd_write`: - pub fd_readwrite: SubscriptionFdReadwrite, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Subscription { - /// User-provided value that is attached to the subscription in the - /// implementation and returned through `event::userdata`. - pub userdata: Userdata, - /// The type of the event to which to subscribe. - pub r#type: Eventtype, - /// The contents of the subscription. - pub u: SubscriptionU, -} -pub type Exitcode = u32; -pub type Signal = u8; -/// No signal. Note that POSIX has special semantics for `kill(pid, 0)`, -/// so this value is reserved. -pub const SIGNAL_NONE: Signal = 0; -/// Hangup. -/// Action: Terminates the process. -pub const SIGNAL_HUP: Signal = 1; -/// Terminate interrupt signal. -/// Action: Terminates the process. -pub const SIGNAL_INT: Signal = 2; -/// Terminal quit signal. -/// Action: Terminates the process. -pub const SIGNAL_QUIT: Signal = 3; -/// Illegal instruction. -/// Action: Terminates the process. -pub const SIGNAL_ILL: Signal = 4; -/// Trace/breakpoint trap. -/// Action: Terminates the process. -pub const SIGNAL_TRAP: Signal = 5; -/// Process abort signal. -/// Action: Terminates the process. -pub const SIGNAL_ABRT: Signal = 6; -/// Access to an undefined portion of a memory object. -/// Action: Terminates the process. -pub const SIGNAL_BUS: Signal = 7; -/// Erroneous arithmetic operation. -/// Action: Terminates the process. -pub const SIGNAL_FPE: Signal = 8; -/// Kill. -/// Action: Terminates the process. -pub const SIGNAL_KILL: Signal = 9; -/// User-defined signal 1. -/// Action: Terminates the process. -pub const SIGNAL_USR1: Signal = 10; -/// Invalid memory reference. -/// Action: Terminates the process. -pub const SIGNAL_SEGV: Signal = 11; -/// User-defined signal 2. -/// Action: Terminates the process. -pub const SIGNAL_USR2: Signal = 12; -/// Write on a pipe with no one to read it. -/// Action: Ignored. -pub const SIGNAL_PIPE: Signal = 13; -/// Alarm clock. -/// Action: Terminates the process. -pub const SIGNAL_ALRM: Signal = 14; -/// Termination signal. -/// Action: Terminates the process. -pub const SIGNAL_TERM: Signal = 15; -/// Child process terminated, stopped, or continued. -/// Action: Ignored. -pub const SIGNAL_CHLD: Signal = 16; -/// Continue executing, if stopped. -/// Action: Continues executing, if stopped. -pub const SIGNAL_CONT: Signal = 17; -/// Stop executing. -/// Action: Stops executing. -pub const SIGNAL_STOP: Signal = 18; -/// Terminal stop signal. -/// Action: Stops executing. -pub const SIGNAL_TSTP: Signal = 19; -/// Background process attempting read. -/// Action: Stops executing. -pub const SIGNAL_TTIN: Signal = 20; -/// Background process attempting write. -/// Action: Stops executing. -pub const SIGNAL_TTOU: Signal = 21; -/// High bandwidth data is available at a socket. -/// Action: Ignored. -pub const SIGNAL_URG: Signal = 22; -/// CPU time limit exceeded. -/// Action: Terminates the process. -pub const SIGNAL_XCPU: Signal = 23; -/// File size limit exceeded. -/// Action: Terminates the process. -pub const SIGNAL_XFSZ: Signal = 24; -/// Virtual timer expired. -/// Action: Terminates the process. -pub const SIGNAL_VTALRM: Signal = 25; -/// Profiling timer expired. -/// Action: Terminates the process. -pub const SIGNAL_PROF: Signal = 26; -/// Window changed. -/// Action: Ignored. -pub const SIGNAL_WINCH: Signal = 27; -/// I/O possible. -/// Action: Terminates the process. -pub const SIGNAL_POLL: Signal = 28; -/// Power failure. -/// Action: Terminates the process. -pub const SIGNAL_PWR: Signal = 29; -/// Bad system call. -/// Action: Terminates the process. -pub const SIGNAL_SYS: Signal = 30; -pub type Riflags = u16; -/// Returns the message without removing it from the socket's receive queue. -pub const RIFLAGS_RECV_PEEK: Riflags = 0x1; -/// On byte-stream sockets, block until the full amount of data can be returned. -pub const RIFLAGS_RECV_WAITALL: Riflags = 0x2; -pub type Roflags = u16; -/// Returned by `sock_recv`: Message data has been truncated. -pub const ROFLAGS_RECV_DATA_TRUNCATED: Roflags = 0x1; -pub type Siflags = u16; -pub type Sdflags = u8; -/// Disables further receive operations. -pub const SDFLAGS_RD: Sdflags = 0x1; -/// Disables further send operations. -pub const SDFLAGS_WR: Sdflags = 0x2; -pub type Preopentype = u8; -/// A pre-opened directory. -pub const PREOPENTYPE_DIR: Preopentype = 0; -#[repr(C)] -#[derive(Copy, Clone)] -pub struct PrestatDir { - /// The length of the directory name for use with `fd_prestat_dir_name`. - pub pr_name_len: Size, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub union PrestatU { - /// When type is `preopentype::dir`: - pub dir: PrestatDir, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct Prestat { - /// The type of the pre-opened capability. - pub pr_type: Preopentype, - /// The contents of the information. - pub u: PrestatU, -} -/// Read command-line argument data. -/// The size of the array should match that returned by `wasi_args_sizes_get()` -pub unsafe fn args_get(argv: *mut *mut u8, argv_buf: *mut u8) -> Result<()> { - let rc = wasi_snapshot_preview1::args_get(argv, argv_buf); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Return command-line argument data sizes. -/// -/// ## Return -/// -/// * `argc` - The number of arguments. -/// * `argv_buf_size` - The size of the argument string data. -pub unsafe fn args_sizes_get() -> Result<(Size, Size)> { - let mut argc = MaybeUninit::uninit(); - let mut argv_buf_size = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::args_sizes_get(argc.as_mut_ptr(), argv_buf_size.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok((argc.assume_init(), argv_buf_size.assume_init())) - } -} - -/// Read environment variable data. -/// The sizes of the buffers should match that returned by `environ.sizes_get()`. -pub unsafe fn environ_get(environ: *mut *mut u8, environ_buf: *mut u8) -> Result<()> { - let rc = wasi_snapshot_preview1::environ_get(environ, environ_buf); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Return command-line argument data sizes. -/// -/// ## Return -/// -/// * `argc` - The number of arguments. -/// * `argv_buf_size` - The size of the argument string data. -pub unsafe fn environ_sizes_get() -> Result<(Size, Size)> { - let mut argc = MaybeUninit::uninit(); - let mut argv_buf_size = MaybeUninit::uninit(); - let rc = - wasi_snapshot_preview1::environ_sizes_get(argc.as_mut_ptr(), argv_buf_size.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok((argc.assume_init(), argv_buf_size.assume_init())) - } -} - -/// Return the resolution of a clock. -/// Implementations are required to provide a non-zero value for supported clocks. For unsupported clocks, return `WASI_EINVAL` -/// Note: This is similar to `clock_getres` in POSIX. -/// -/// ## Parameters -/// -/// * `id` - The clock for which to return the resolution. -/// -/// ## Return -/// -/// * `resolution` - The resolution of the clock. -pub unsafe fn clock_res_get(id: Clockid) -> Result { - let mut resolution = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::clock_res_get(id, resolution.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(resolution.assume_init()) - } -} - -/// Return the time value of a clock. -/// Note: This is similar to `clock_gettime` in POSIX. -/// -/// ## Parameters -/// -/// * `id` - The clock for which to return the time. -/// * `precision` - The maximum lag (exclusive) that the returned time value may have, compared to its actual value. -/// -/// ## Return -/// -/// * `time` - The time value of the clock. -pub unsafe fn clock_time_get(id: Clockid, precision: Timestamp) -> Result { - let mut time = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::clock_time_get(id, precision, time.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(time.assume_init()) - } -} - -/// Provide file advisory information on a file descriptor. -/// Note: This is similar to `posix_fadvise` in POSIX. -/// -/// ## Parameters -/// -/// * `offset` - The offset within the file to which the advisory applies. -/// * `len` - The length of the region to which the advisory applies. -/// * `advice` - The advice. -pub unsafe fn fd_advise(fd: Fd, offset: Filesize, len: Filesize, advice: Advice) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_advise(fd, offset, len, advice); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Force the allocation of space in a file. -/// Note: This is similar to `posix_fallocate` in POSIX. -/// -/// ## Parameters -/// -/// * `offset` - The offset at which to start the allocation. -/// * `len` - The length of the area that is allocated. -pub unsafe fn fd_allocate(fd: Fd, offset: Filesize, len: Filesize) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_allocate(fd, offset, len); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Close a file descriptor. -/// Note: This is similar to `close` in POSIX. -pub unsafe fn fd_close(fd: Fd) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_close(fd); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Synchronize the data of a file to disk. -/// Note: This is similar to `fdatasync` in POSIX. -pub unsafe fn fd_datasync(fd: Fd) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_datasync(fd); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Get the attributes of a file descriptor. -/// Note: This returns similar flags to `fsync(fd, F_GETFL)` in POSIX, as well as additional fields. -/// -/// ## Return -/// -/// * `stat` - The buffer where the file descriptor's attributes are stored. -pub unsafe fn fd_fdstat_get(fd: Fd) -> Result { - let mut stat = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_fdstat_get(fd, stat.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(stat.assume_init()) - } -} - -/// Adjust the flags associated with a file descriptor. -/// Note: This is similar to `fcntl(fd, F_SETFL, flags)` in POSIX. -/// -/// ## Parameters -/// -/// * `flags` - The desired values of the file descriptor flags. -pub unsafe fn fd_fdstat_set_flags(fd: Fd, flags: Fdflags) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_fdstat_set_flags(fd, flags); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Adjust the rights associated with a file descriptor. -/// This can only be used to remove rights, and returns `ENOTCAPABLE` if called in a way that would attempt to add rights -/// -/// ## Parameters -/// -/// * `fs_rights_base` - The desired rights of the file descriptor. -pub unsafe fn fd_fdstat_set_rights( - fd: Fd, - fs_rights_base: Rights, - fs_rights_inheriting: Rights, -) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_fdstat_set_rights(fd, fs_rights_base, fs_rights_inheriting); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Return the attributes of an open file. -/// -/// ## Return -/// -/// * `buf` - The buffer where the file's attributes are stored. -pub unsafe fn fd_filestat_get(fd: Fd) -> Result { - let mut buf = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_filestat_get(fd, buf.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(buf.assume_init()) - } -} - -/// Adjust the size of an open file. If this increases the file's size, the extra bytes are filled with zeros. -/// Note: This is similar to `ftruncate` in POSIX. -/// -/// ## Parameters -/// -/// * `size` - The desired file size. -pub unsafe fn fd_filestat_set_size(fd: Fd, size: Filesize) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_filestat_set_size(fd, size); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Adjust the timestamps of an open file or directory. -/// Note: This is similar to `futimens` in POSIX. -/// -/// ## Parameters -/// -/// * `atim` - The desired values of the data access timestamp. -/// * `mtim` - The desired values of the data modification timestamp. -/// * `fst_flags` - A bitmask indicating which timestamps to adjust. -pub unsafe fn fd_filestat_set_times( - fd: Fd, - atim: Timestamp, - mtim: Timestamp, - fst_flags: Fstflags, -) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_filestat_set_times(fd, atim, mtim, fst_flags); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Read from a file descriptor, without using and updating the file descriptor's offset. -/// Note: This is similar to `preadv` in POSIX. -/// -/// ## Parameters -/// -/// * `iovs` - List of scatter/gather vectors in which to store data. -/// * `offset` - The offset within the file at which to read. -/// -/// ## Return -/// -/// * `nread` - The number of bytes read. -pub unsafe fn fd_pread(fd: Fd, iovs: IovecArray, offset: Filesize) -> Result { - let mut nread = MaybeUninit::uninit(); - let rc = - wasi_snapshot_preview1::fd_pread(fd, iovs.as_ptr(), iovs.len(), offset, nread.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(nread.assume_init()) - } -} - -/// Return a description of the given preopened file descriptor. -/// -/// ## Return -/// -/// * `buf` - The buffer where the description is stored. -pub unsafe fn fd_prestat_get(fd: Fd) -> Result { - let mut buf = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_prestat_get(fd, buf.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(buf.assume_init()) - } -} - -/// Return a description of the given preopened file descriptor. -/// -/// ## Parameters -/// -/// * `path` - A buffer into which to write the preopened directory name. -pub unsafe fn fd_prestat_dir_name(fd: Fd, path: *mut u8, path_len: Size) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_prestat_dir_name(fd, path, path_len); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Write to a file descriptor, without using and updating the file descriptor's offset. -/// Note: This is similar to `pwritev` in POSIX. -/// -/// ## Parameters -/// -/// * `iovs` - List of scatter/gather vectors from which to retrieve data. -/// * `offset` - The offset within the file at which to write. -/// -/// ## Return -/// -/// * `nwritten` - The number of bytes written. -pub unsafe fn fd_pwrite(fd: Fd, iovs: CiovecArray, offset: Filesize) -> Result { - let mut nwritten = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_pwrite( - fd, - iovs.as_ptr(), - iovs.len(), - offset, - nwritten.as_mut_ptr(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(nwritten.assume_init()) - } -} - -/// Read from a file descriptor. -/// Note: This is similar to `readv` in POSIX. -/// -/// ## Parameters -/// -/// * `iovs` - List of scatter/gather vectors to which to store data. -/// -/// ## Return -/// -/// * `nread` - The number of bytes read. -pub unsafe fn fd_read(fd: Fd, iovs: IovecArray) -> Result { - let mut nread = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_read(fd, iovs.as_ptr(), iovs.len(), nread.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(nread.assume_init()) - } -} - -/// Read directory entries from a directory. -/// When successful, the contents of the output buffer consist of a sequence of -/// directory entries. Each directory entry consists of a dirent_t object, -/// followed by dirent_t::d_namlen bytes holding the name of the directory -/// entry. -/// This function fills the output buffer as much as possible, potentially -/// truncating the last directory entry. This allows the caller to grow its -/// read buffer size in case it's too small to fit a single large directory -/// entry, or skip the oversized directory entry. -/// -/// ## Parameters -/// -/// * `buf` - The buffer where directory entries are stored -/// * `cookie` - The location within the directory to start reading -/// -/// ## Return -/// -/// * `bufused` - The number of bytes stored in the read buffer. If less than the size of the read buffer, the end of the directory has been reached. -pub unsafe fn fd_readdir(fd: Fd, buf: *mut u8, buf_len: Size, cookie: Dircookie) -> Result { - let mut bufused = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_readdir(fd, buf, buf_len, cookie, bufused.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(bufused.assume_init()) - } -} - -/// Atomically replace a file descriptor by renumbering another file descriptor. -/// Due to the strong focus on thread safety, this environment does not provide -/// a mechanism to duplicate or renumber a file descriptor to an arbitrary -/// number, like `dup2()`. This would be prone to race conditions, as an actual -/// file descriptor with the same number could be allocated by a different -/// thread at the same time. -/// This function provides a way to atomically renumber file descriptors, which -/// would disappear if `dup2()` were to be removed entirely. -/// -/// ## Parameters -/// -/// * `to` - The file descriptor to overwrite. -pub unsafe fn fd_renumber(fd: Fd, to: Fd) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_renumber(fd, to); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Move the offset of a file descriptor. -/// Note: This is similar to `lseek` in POSIX. -/// -/// ## Parameters -/// -/// * `offset` - The number of bytes to move. -/// * `whence` - The base from which the offset is relative. -/// -/// ## Return -/// -/// * `newoffset` - The new offset of the file descriptor, relative to the start of the file. -pub unsafe fn fd_seek(fd: Fd, offset: Filedelta, whence: Whence) -> Result { - let mut newoffset = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_seek(fd, offset, whence, newoffset.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(newoffset.assume_init()) - } -} - -/// Synchronize the data and metadata of a file to disk. -/// Note: This is similar to `fsync` in POSIX. -pub unsafe fn fd_sync(fd: Fd) -> Result<()> { - let rc = wasi_snapshot_preview1::fd_sync(fd); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Return the current offset of a file descriptor. -/// Note: This is similar to `lseek(fd, 0, SEEK_CUR)` in POSIX. -/// -/// ## Return -/// -/// * `offset` - The current offset of the file descriptor, relative to the start of the file. -pub unsafe fn fd_tell(fd: Fd) -> Result { - let mut offset = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_tell(fd, offset.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(offset.assume_init()) - } -} - -/// Write to a file descriptor. -/// Note: This is similar to `writev` in POSIX. -/// -/// ## Parameters -/// -/// * `iovs` - List of scatter/gather vectors from which to retrieve data. -/// -/// ## Return -/// -/// * `nwritten` - The number of bytes written. -pub unsafe fn fd_write(fd: Fd, iovs: CiovecArray) -> Result { - let mut nwritten = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::fd_write(fd, iovs.as_ptr(), iovs.len(), nwritten.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(nwritten.assume_init()) - } -} - -/// Create a directory. -/// Note: This is similar to `mkdirat` in POSIX. -/// -/// ## Parameters -/// -/// * `path` - The path at which to create the directory. -pub unsafe fn path_create_directory(fd: Fd, path: &str) -> Result<()> { - let rc = wasi_snapshot_preview1::path_create_directory(fd, path.as_ptr(), path.len()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Return the attributes of a file or directory. -/// Note: This is similar to `stat` in POSIX. -/// -/// ## Parameters -/// -/// * `flags` - Flags determining the method of how the path is resolved. -/// * `path` - The path of the file or directory to inspect. -/// -/// ## Return -/// -/// * `buf` - The buffer where the file's attributes are stored. -pub unsafe fn path_filestat_get(fd: Fd, flags: Lookupflags, path: &str) -> Result { - let mut buf = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::path_filestat_get( - fd, - flags, - path.as_ptr(), - path.len(), - buf.as_mut_ptr(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(buf.assume_init()) - } -} - -/// Adjust the timestamps of a file or directory. -/// Note: This is similar to `utimensat` in POSIX. -/// -/// ## Parameters -/// -/// * `flags` - Flags determining the method of how the path is resolved. -/// * `path` - The path of the file or directory to operate on. -/// * `atim` - The desired values of the data access timestamp. -/// * `mtim` - The desired values of the data modification timestamp. -/// * `fst_flags` - A bitmask indicating which timestamps to adjust. -pub unsafe fn path_filestat_set_times( - fd: Fd, - flags: Lookupflags, - path: &str, - atim: Timestamp, - mtim: Timestamp, - fst_flags: Fstflags, -) -> Result<()> { - let rc = wasi_snapshot_preview1::path_filestat_set_times( - fd, - flags, - path.as_ptr(), - path.len(), - atim, - mtim, - fst_flags, - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Create a hard link. -/// Note: This is similar to `linkat` in POSIX. -/// -/// ## Parameters -/// -/// * `old_flags` - Flags determining the method of how the path is resolved. -/// * `old_path` - The source path from which to link. -/// * `new_fd` - The working directory at which the resolution of the new path starts. -/// * `new_path` - The destination path at which to create the hard link. -pub unsafe fn path_link( - old_fd: Fd, - old_flags: Lookupflags, - old_path: &str, - new_fd: Fd, - new_path: &str, -) -> Result<()> { - let rc = wasi_snapshot_preview1::path_link( - old_fd, - old_flags, - old_path.as_ptr(), - old_path.len(), - new_fd, - new_path.as_ptr(), - new_path.len(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Open a file or directory. -/// The returned file descriptor is not guaranteed to be the lowest-numbered -/// file descriptor not currently open; it is randomized to prevent -/// applications from depending on making assumptions about indexes, since this -/// is error-prone in multi-threaded contexts. The returned file descriptor is -/// guaranteed to be less than 2**31. -/// Note: This is similar to `openat` in POSIX. -/// -/// ## Parameters -/// -/// * `dirflags` - Flags determining the method of how the path is resolved. -/// * `path` - The relative path of the file or directory to open, relative to the -/// `dirfd` directory. -/// * `oflags` - The method by which to open the file. -/// * `fs_rights_base` - The initial rights of the newly created file descriptor. The -/// implementation is allowed to return a file descriptor with fewer rights -/// than specified, if and only if those rights do not apply to the type of -/// file being opened. -/// The *base* rights are rights that will apply to operations using the file -/// descriptor itself, while the *inheriting* rights are rights that apply to -/// file descriptors derived from it. -/// -/// ## Return -/// -/// * `opened_fd` - The file descriptor of the file that has been opened. -pub unsafe fn path_open( - fd: Fd, - dirflags: Lookupflags, - path: &str, - oflags: Oflags, - fs_rights_base: Rights, - fs_rights_inherting: Rights, - fdflags: Fdflags, -) -> Result { - let mut opened_fd = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::path_open( - fd, - dirflags, - path.as_ptr(), - path.len(), - oflags, - fs_rights_base, - fs_rights_inherting, - fdflags, - opened_fd.as_mut_ptr(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(opened_fd.assume_init()) - } -} - -/// Read the contents of a symbolic link. -/// Note: This is similar to `readlinkat` in POSIX. -/// -/// ## Parameters -/// -/// * `path` - The path of the symbolic link from which to read. -/// * `buf` - The buffer to which to write the contents of the symbolic link. -/// -/// ## Return -/// -/// * `bufused` - The number of bytes placed in the buffer. -pub unsafe fn path_readlink(fd: Fd, path: &str, buf: *mut u8, buf_len: Size) -> Result { - let mut bufused = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::path_readlink( - fd, - path.as_ptr(), - path.len(), - buf, - buf_len, - bufused.as_mut_ptr(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(bufused.assume_init()) - } -} - -/// Remove a directory. -/// Return `ENOTEMPTY` if the directory is not empty. -/// Note: This is similar to `unlinkat(fd, path, AT_REMOVEDIR)` in POSIX. -/// -/// ## Parameters -/// -/// * `path` - The path to a directory to remove. -pub unsafe fn path_remove_directory(fd: Fd, path: &str) -> Result<()> { - let rc = wasi_snapshot_preview1::path_remove_directory(fd, path.as_ptr(), path.len()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Rename a file or directory. -/// Note: This is similar to `renameat` in POSIX. -/// -/// ## Parameters -/// -/// * `old_path` - The source path of the file or directory to rename. -/// * `new_fd` - The working directory at which the resolution of the new path starts. -/// * `new_path` - The destination path to which to rename the file or directory. -pub unsafe fn path_rename(fd: Fd, old_path: &str, new_fd: Fd, new_path: &str) -> Result<()> { - let rc = wasi_snapshot_preview1::path_rename( - fd, - old_path.as_ptr(), - old_path.len(), - new_fd, - new_path.as_ptr(), - new_path.len(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Create a symbolic link. -/// Note: This is similar to `symlinkat` in POSIX. -/// -/// ## Parameters -/// -/// * `old_path` - The contents of the symbolic link. -/// * `new_path` - The destination path at which to create the symbolic link. -pub unsafe fn path_symlink(old_path: &str, fd: Fd, new_path: &str) -> Result<()> { - let rc = wasi_snapshot_preview1::path_symlink( - old_path.as_ptr(), - old_path.len(), - fd, - new_path.as_ptr(), - new_path.len(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Unlink a file. -/// Return `EISDIR` if the path refers to a directory. -/// Note: This is similar to `unlinkat(fd, path, 0)` in POSIX. -/// -/// ## Parameters -/// -/// * `path` - The path to a file to unlink. -pub unsafe fn path_unlink_file(fd: Fd, path: &str) -> Result<()> { - let rc = wasi_snapshot_preview1::path_unlink_file(fd, path.as_ptr(), path.len()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Concurrently poll for the occurrence of a set of events. -/// -/// ## Parameters -/// -/// * `r#in` - The events to which to subscribe. -/// * `out` - The events that have occurred. -/// * `nsubscriptions` - Both the number of subscriptions and events. -/// -/// ## Return -/// -/// * `nevents` - The number of events stored. -pub unsafe fn poll_oneoff( - r#in: *const Subscription, - out: *mut Event, - nsubscriptions: Size, -) -> Result { - let mut nevents = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::poll_oneoff(r#in, out, nsubscriptions, nevents.as_mut_ptr()); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(nevents.assume_init()) - } -} - -/// Terminate the process normally. An exit code of 0 indicates successful -/// termination of the program. The meanings of other values is dependent on -/// the environment. -/// -/// ## Parameters -/// -/// * `rval` - The exit code returned by the process. -pub unsafe fn proc_exit(rval: Exitcode) { - wasi_snapshot_preview1::proc_exit(rval); -} - -/// Send a signal to the process of the calling thread. -/// Note: This is similar to `raise` in POSIX. -/// -/// ## Parameters -/// -/// * `sig` - The signal condition to trigger. -pub unsafe fn proc_raise(sig: Signal) -> Result<()> { - let rc = wasi_snapshot_preview1::proc_raise(sig); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Temporarily yield execution of the calling thread. -/// Note: This is similar to `sched_yield` in POSIX. -pub unsafe fn sched_yield() -> Result<()> { - let rc = wasi_snapshot_preview1::sched_yield(); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Write high-quality random data into a buffer. -/// This function blocks when the implementation is unable to immediately -/// provide sufficient high-quality random data. -/// This function may execute slowly, so when large mounts of random data are -/// required, it's advisable to use this function to seed a pseudo-random -/// number generator, rather than to provide the random data directly. -/// -/// ## Parameters -/// -/// * `buf` - The buffer to fill with random data. -pub unsafe fn random_get(buf: *mut u8, buf_len: Size) -> Result<()> { - let rc = wasi_snapshot_preview1::random_get(buf, buf_len); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -/// Receive a message from a socket. -/// Note: This is similar to `recv` in POSIX, though it also supports reading -/// the data into multiple buffers in the manner of `readv`. -/// -/// ## Parameters -/// -/// * `ri_data` - List of scatter/gather vectors to which to store data. -/// * `ri_flags` - Message flags. -/// -/// ## Return -/// -/// * `ro_datalen` - Number of bytes stored in ri_data. -/// * `ro_flags` - Message flags. -pub unsafe fn sock_recv(fd: Fd, ri_data: IovecArray, ri_flags: Riflags) -> Result<(Size, Roflags)> { - let mut ro_datalen = MaybeUninit::uninit(); - let mut ro_flags = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::sock_recv( - fd, - ri_data.as_ptr(), - ri_data.len(), - ri_flags, - ro_datalen.as_mut_ptr(), - ro_flags.as_mut_ptr(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok((ro_datalen.assume_init(), ro_flags.assume_init())) - } -} - -/// Send a message on a socket. -/// Note: This is similar to `send` in POSIX, though it also supports writing -/// the data from multiple buffers in the manner of `writev`. -/// -/// ## Parameters -/// -/// * `si_data` - List of scatter/gather vectors to which to retrieve data -/// * `si_flags` - Message flags. -/// -/// ## Return -/// -/// * `so_datalen` - Number of bytes transmitted. -pub unsafe fn sock_send(fd: Fd, si_data: CiovecArray, si_flags: Siflags) -> Result { - let mut so_datalen = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::sock_send( - fd, - si_data.as_ptr(), - si_data.len(), - si_flags, - so_datalen.as_mut_ptr(), - ); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(so_datalen.assume_init()) - } -} - -/// Shut down socket send and receive channels. -/// Note: This is similar to `shutdown` in POSIX. -/// -/// ## Parameters -/// -/// * `how` - Which channels on the socket to shut down. -pub unsafe fn sock_shutdown(fd: Fd, how: Sdflags) -> Result<()> { - let rc = wasi_snapshot_preview1::sock_shutdown(fd, how); - if let Some(err) = Error::from_raw_error(rc) { - Err(err) - } else { - Ok(()) - } -} - -pub mod wasi_snapshot_preview1 { - use super::*; - #[link(wasm_import_module = "wasi_snapshot_preview1")] - extern "C" { - /// Read command-line argument data. - /// The size of the array should match that returned by `wasi_args_sizes_get()` - pub fn args_get(argv: *mut *mut u8, argv_buf: *mut u8) -> Errno; - /// Return command-line argument data sizes. - pub fn args_sizes_get(argc: *mut Size, argv_buf_size: *mut Size) -> Errno; - /// Read environment variable data. - /// The sizes of the buffers should match that returned by `environ.sizes_get()`. - pub fn environ_get(environ: *mut *mut u8, environ_buf: *mut u8) -> Errno; - /// Return command-line argument data sizes. - pub fn environ_sizes_get(argc: *mut Size, argv_buf_size: *mut Size) -> Errno; - /// Return the resolution of a clock. - /// Implementations are required to provide a non-zero value for supported clocks. For unsupported clocks, return `WASI_EINVAL` - /// Note: This is similar to `clock_getres` in POSIX. - pub fn clock_res_get(id: Clockid, resolution: *mut Timestamp) -> Errno; - /// Return the time value of a clock. - /// Note: This is similar to `clock_gettime` in POSIX. - pub fn clock_time_get(id: Clockid, precision: Timestamp, time: *mut Timestamp) -> Errno; - /// Provide file advisory information on a file descriptor. - /// Note: This is similar to `posix_fadvise` in POSIX. - pub fn fd_advise(fd: Fd, offset: Filesize, len: Filesize, advice: Advice) -> Errno; - /// Force the allocation of space in a file. - /// Note: This is similar to `posix_fallocate` in POSIX. - pub fn fd_allocate(fd: Fd, offset: Filesize, len: Filesize) -> Errno; - /// Close a file descriptor. - /// Note: This is similar to `close` in POSIX. - pub fn fd_close(fd: Fd) -> Errno; - /// Synchronize the data of a file to disk. - /// Note: This is similar to `fdatasync` in POSIX. - pub fn fd_datasync(fd: Fd) -> Errno; - /// Get the attributes of a file descriptor. - /// Note: This returns similar flags to `fsync(fd, F_GETFL)` in POSIX, as well as additional fields. - pub fn fd_fdstat_get(fd: Fd, stat: *mut Fdstat) -> Errno; - /// Adjust the flags associated with a file descriptor. - /// Note: This is similar to `fcntl(fd, F_SETFL, flags)` in POSIX. - pub fn fd_fdstat_set_flags(fd: Fd, flags: Fdflags) -> Errno; - /// Adjust the rights associated with a file descriptor. - /// This can only be used to remove rights, and returns `ENOTCAPABLE` if called in a way that would attempt to add rights - pub fn fd_fdstat_set_rights( - fd: Fd, - fs_rights_base: Rights, - fs_rights_inheriting: Rights, - ) -> Errno; - /// Return the attributes of an open file. - pub fn fd_filestat_get(fd: Fd, buf: *mut Filestat) -> Errno; - /// Adjust the size of an open file. If this increases the file's size, the extra bytes are filled with zeros. - /// Note: This is similar to `ftruncate` in POSIX. - pub fn fd_filestat_set_size(fd: Fd, size: Filesize) -> Errno; - /// Adjust the timestamps of an open file or directory. - /// Note: This is similar to `futimens` in POSIX. - pub fn fd_filestat_set_times( - fd: Fd, - atim: Timestamp, - mtim: Timestamp, - fst_flags: Fstflags, - ) -> Errno; - /// Read from a file descriptor, without using and updating the file descriptor's offset. - /// Note: This is similar to `preadv` in POSIX. - pub fn fd_pread( - fd: Fd, - iovs_ptr: *const Iovec, - iovs_len: usize, - offset: Filesize, - nread: *mut Size, - ) -> Errno; - /// Return a description of the given preopened file descriptor. - pub fn fd_prestat_get(fd: Fd, buf: *mut Prestat) -> Errno; - /// Return a description of the given preopened file descriptor. - pub fn fd_prestat_dir_name(fd: Fd, path: *mut u8, path_len: Size) -> Errno; - /// Write to a file descriptor, without using and updating the file descriptor's offset. - /// Note: This is similar to `pwritev` in POSIX. - pub fn fd_pwrite( - fd: Fd, - iovs_ptr: *const Ciovec, - iovs_len: usize, - offset: Filesize, - nwritten: *mut Size, - ) -> Errno; - /// Read from a file descriptor. - /// Note: This is similar to `readv` in POSIX. - pub fn fd_read(fd: Fd, iovs_ptr: *const Iovec, iovs_len: usize, nread: *mut Size) -> Errno; - /// Read directory entries from a directory. - /// When successful, the contents of the output buffer consist of a sequence of - /// directory entries. Each directory entry consists of a dirent_t object, - /// followed by dirent_t::d_namlen bytes holding the name of the directory - /// entry. - /// This function fills the output buffer as much as possible, potentially - /// truncating the last directory entry. This allows the caller to grow its - /// read buffer size in case it's too small to fit a single large directory - /// entry, or skip the oversized directory entry. - pub fn fd_readdir( - fd: Fd, - buf: *mut u8, - buf_len: Size, - cookie: Dircookie, - bufused: *mut Size, - ) -> Errno; - /// Atomically replace a file descriptor by renumbering another file descriptor. - /// Due to the strong focus on thread safety, this environment does not provide - /// a mechanism to duplicate or renumber a file descriptor to an arbitrary - /// number, like `dup2()`. This would be prone to race conditions, as an actual - /// file descriptor with the same number could be allocated by a different - /// thread at the same time. - /// This function provides a way to atomically renumber file descriptors, which - /// would disappear if `dup2()` were to be removed entirely. - pub fn fd_renumber(fd: Fd, to: Fd) -> Errno; - /// Move the offset of a file descriptor. - /// Note: This is similar to `lseek` in POSIX. - pub fn fd_seek( - fd: Fd, - offset: Filedelta, - whence: Whence, - newoffset: *mut Filesize, - ) -> Errno; - /// Synchronize the data and metadata of a file to disk. - /// Note: This is similar to `fsync` in POSIX. - pub fn fd_sync(fd: Fd) -> Errno; - /// Return the current offset of a file descriptor. - /// Note: This is similar to `lseek(fd, 0, SEEK_CUR)` in POSIX. - pub fn fd_tell(fd: Fd, offset: *mut Filesize) -> Errno; - /// Write to a file descriptor. - /// Note: This is similar to `writev` in POSIX. - pub fn fd_write( - fd: Fd, - iovs_ptr: *const Ciovec, - iovs_len: usize, - nwritten: *mut Size, - ) -> Errno; - /// Create a directory. - /// Note: This is similar to `mkdirat` in POSIX. - pub fn path_create_directory(fd: Fd, path_ptr: *const u8, path_len: usize) -> Errno; - /// Return the attributes of a file or directory. - /// Note: This is similar to `stat` in POSIX. - pub fn path_filestat_get( - fd: Fd, - flags: Lookupflags, - path_ptr: *const u8, - path_len: usize, - buf: *mut Filestat, - ) -> Errno; - /// Adjust the timestamps of a file or directory. - /// Note: This is similar to `utimensat` in POSIX. - pub fn path_filestat_set_times( - fd: Fd, - flags: Lookupflags, - path_ptr: *const u8, - path_len: usize, - atim: Timestamp, - mtim: Timestamp, - fst_flags: Fstflags, - ) -> Errno; - /// Create a hard link. - /// Note: This is similar to `linkat` in POSIX. - pub fn path_link( - old_fd: Fd, - old_flags: Lookupflags, - old_path_ptr: *const u8, - old_path_len: usize, - new_fd: Fd, - new_path_ptr: *const u8, - new_path_len: usize, - ) -> Errno; - /// Open a file or directory. - /// The returned file descriptor is not guaranteed to be the lowest-numbered - /// file descriptor not currently open; it is randomized to prevent - /// applications from depending on making assumptions about indexes, since this - /// is error-prone in multi-threaded contexts. The returned file descriptor is - /// guaranteed to be less than 2**31. - /// Note: This is similar to `openat` in POSIX. - pub fn path_open( - fd: Fd, - dirflags: Lookupflags, - path_ptr: *const u8, - path_len: usize, - oflags: Oflags, - fs_rights_base: Rights, - fs_rights_inherting: Rights, - fdflags: Fdflags, - opened_fd: *mut Fd, - ) -> Errno; - /// Read the contents of a symbolic link. - /// Note: This is similar to `readlinkat` in POSIX. - pub fn path_readlink( - fd: Fd, - path_ptr: *const u8, - path_len: usize, - buf: *mut u8, - buf_len: Size, - bufused: *mut Size, - ) -> Errno; - /// Remove a directory. - /// Return `ENOTEMPTY` if the directory is not empty. - /// Note: This is similar to `unlinkat(fd, path, AT_REMOVEDIR)` in POSIX. - pub fn path_remove_directory(fd: Fd, path_ptr: *const u8, path_len: usize) -> Errno; - /// Rename a file or directory. - /// Note: This is similar to `renameat` in POSIX. - pub fn path_rename( - fd: Fd, - old_path_ptr: *const u8, - old_path_len: usize, - new_fd: Fd, - new_path_ptr: *const u8, - new_path_len: usize, - ) -> Errno; - /// Create a symbolic link. - /// Note: This is similar to `symlinkat` in POSIX. - pub fn path_symlink( - old_path_ptr: *const u8, - old_path_len: usize, - fd: Fd, - new_path_ptr: *const u8, - new_path_len: usize, - ) -> Errno; - /// Unlink a file. - /// Return `EISDIR` if the path refers to a directory. - /// Note: This is similar to `unlinkat(fd, path, 0)` in POSIX. - pub fn path_unlink_file(fd: Fd, path_ptr: *const u8, path_len: usize) -> Errno; - /// Concurrently poll for the occurrence of a set of events. - pub fn poll_oneoff( - r#in: *const Subscription, - out: *mut Event, - nsubscriptions: Size, - nevents: *mut Size, - ) -> Errno; - /// Terminate the process normally. An exit code of 0 indicates successful - /// termination of the program. The meanings of other values is dependent on - /// the environment. - pub fn proc_exit(rval: Exitcode) -> !; - /// Send a signal to the process of the calling thread. - /// Note: This is similar to `raise` in POSIX. - pub fn proc_raise(sig: Signal) -> Errno; - /// Temporarily yield execution of the calling thread. - /// Note: This is similar to `sched_yield` in POSIX. - pub fn sched_yield() -> Errno; - /// Write high-quality random data into a buffer. - /// This function blocks when the implementation is unable to immediately - /// provide sufficient high-quality random data. - /// This function may execute slowly, so when large mounts of random data are - /// required, it's advisable to use this function to seed a pseudo-random - /// number generator, rather than to provide the random data directly. - pub fn random_get(buf: *mut u8, buf_len: Size) -> Errno; - /// Receive a message from a socket. - /// Note: This is similar to `recv` in POSIX, though it also supports reading - /// the data into multiple buffers in the manner of `readv`. - pub fn sock_recv( - fd: Fd, - ri_data_ptr: *const Iovec, - ri_data_len: usize, - ri_flags: Riflags, - ro_datalen: *mut Size, - ro_flags: *mut Roflags, - ) -> Errno; - /// Send a message on a socket. - /// Note: This is similar to `send` in POSIX, though it also supports writing - /// the data from multiple buffers in the manner of `writev`. - pub fn sock_send( - fd: Fd, - si_data_ptr: *const Ciovec, - si_data_len: usize, - si_flags: Siflags, - so_datalen: *mut Size, - ) -> Errno; - /// Shut down socket send and receive channels. - /// Note: This is similar to `shutdown` in POSIX. - pub fn sock_shutdown(fd: Fd, how: Sdflags) -> Errno; - } -} diff --git a/vendor/wasi/.cargo-checksum.json b/vendor/wasi/.cargo-checksum.json index 534dc6e205..05c3a22697 100644 --- a/vendor/wasi/.cargo-checksum.json +++ b/vendor/wasi/.cargo-checksum.json @@ -1 +1 @@ -{"files":{"CODE_OF_CONDUCT.md":"a13aaaf393818bd91207c618724d3fb74944ca5161201822a84af951bcf655ef","CONTRIBUTING.md":"2c908a3e263dc35dfed131c02ff907cd72fafb2c2096e4ba9b1e0cbb7a1b76df","Cargo.toml":"0507b220e56fe90becc31c95576b3c42f05b6453659af34e43eaab219274a14b","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-Apache-2.0_WITH_LLVM-exception":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","ORG_CODE_OF_CONDUCT.md":"a62b69bf86e605ee1bcbb2f0a12ba79e4cebb6983a7b6491949750aecc4f2178","README.md":"9412b3834687f28f0fae01a6e45b1309733ac92dcf04ef3ef36a823e76a6fed2","SECURITY.md":"4d75afb09dd28eb5982e3a1f768ee398d90204669ceef3240a16b31dcf04148a","src/error.rs":"96818880fab83125079842e35aacb49333ac66699e223f896699e4fdb88b99e8","src/lib.rs":"ce2e7ee6a6e4d5900f3835568b168afc70870d601b2bb94f1a6b9ddd2f046c3a","src/lib_generated.rs":"352b56bdb0f87dc18592a2241b312710c8326a415c2b3e3e7af26a8e36c2d303"},"package":"1a143597ca7c7793eff794def352d41792a93c481eb1042423ff7ff72ba2c31f"} \ No newline at end of file +{"files":{"CODE_OF_CONDUCT.md":"a13aaaf393818bd91207c618724d3fb74944ca5161201822a84af951bcf655ef","CONTRIBUTING.md":"2c908a3e263dc35dfed131c02ff907cd72fafb2c2096e4ba9b1e0cbb7a1b76df","Cargo.toml":"2ecba6e9e633226bc0a26ca5dd580c97c510be660fa348cea248125d90e85bf2","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-Apache-2.0_WITH_LLVM-exception":"268872b9816f90fd8e85db5a28d33f8150ebb8dd016653fb39ef1f94f2686bc5","LICENSE-MIT":"23f18e03dc49df91622fe2a76176497404e46ced8a715d9d2b67a7446571cca3","ORG_CODE_OF_CONDUCT.md":"a62b69bf86e605ee1bcbb2f0a12ba79e4cebb6983a7b6491949750aecc4f2178","README.md":"9412b3834687f28f0fae01a6e45b1309733ac92dcf04ef3ef36a823e76a6fed2","SECURITY.md":"4d75afb09dd28eb5982e3a1f768ee398d90204669ceef3240a16b31dcf04148a","old-bitflags.patch":"6a35cdbe866fbb51608195b74f0e6c0d37201ed933e473588cc2ab6211916b40","src/error.rs":"96818880fab83125079842e35aacb49333ac66699e223f896699e4fdb88b99e8","src/lib.rs":"7bfc4ffb02d1abfe25f3682affa3a50ca1e7b9d67a478a3d0f2e7788aeaab2b4","src/lib_generated.rs":"7983898c5fc69db19047cf5c3da5ed615b68859094cad8de9a3bc63d1a28de15"},"package":"cccddf32554fecc6acb585f82a32a72e28b48f8c4c1883ddfeeeaa96f7d8e519"} \ No newline at end of file diff --git a/vendor/wasi/Cargo.toml b/vendor/wasi/Cargo.toml index 00fe5b3cd4..cd0dfb5351 100644 --- a/vendor/wasi/Cargo.toml +++ b/vendor/wasi/Cargo.toml @@ -13,7 +13,7 @@ [package] edition = "2018" name = "wasi" -version = "0.10.0+wasi-snapshot-preview1" +version = "0.9.0+wasi-snapshot-preview1" authors = ["The Cranelift Project Developers"] description = "Experimental WASI API bindings for Rust" documentation = "https://docs.rs/wasi" diff --git a/vendor/wasi-0.9.0+wasi-snapshot-preview1/old-bitflags.patch b/vendor/wasi/old-bitflags.patch similarity index 100% rename from vendor/wasi-0.9.0+wasi-snapshot-preview1/old-bitflags.patch rename to vendor/wasi/old-bitflags.patch diff --git a/vendor/wasi/src/lib.rs b/vendor/wasi/src/lib.rs index 51f488907f..45c2469277 100644 --- a/vendor/wasi/src/lib.rs +++ b/vendor/wasi/src/lib.rs @@ -34,15 +34,3 @@ mod error; mod lib_generated; pub use lib_generated::*; - -/// Special `Dircookie` value indicating the start of a directory. -pub const DIRCOOKIE_START: Dircookie = 0; - -/// The "standard input" descriptor number. -pub const FD_STDIN: Fd = 0; - -/// The "standard output" descriptor number. -pub const FD_STDOUT: Fd = 1; - -/// The "standard error" descriptor number. -pub const FD_STDERR: Fd = 2; diff --git a/vendor/wasi/src/lib_generated.rs b/vendor/wasi/src/lib_generated.rs index 422794153d..8adf466470 100644 --- a/vendor/wasi/src/lib_generated.rs +++ b/vendor/wasi/src/lib_generated.rs @@ -262,7 +262,7 @@ pub(crate) fn strerror(code: u16) -> &'static str { pub type Rights = u64; /// The right to invoke `fd_datasync`. /// If `path_open` is set, includes the right to invoke -/// `path_open` with `fdflags::dsync`. +/// `path_open` with `fdflag::dsync`. pub const RIGHTS_FD_DATASYNC: Rights = 0x1; /// The right to invoke `fd_read` and `sock_recv`. /// If `rights::fd_seek` is set, includes the right to invoke `fd_pread`. @@ -273,10 +273,10 @@ pub const RIGHTS_FD_SEEK: Rights = 0x4; pub const RIGHTS_FD_FDSTAT_SET_FLAGS: Rights = 0x8; /// The right to invoke `fd_sync`. /// If `path_open` is set, includes the right to invoke -/// `path_open` with `fdflags::rsync` and `fdflags::dsync`. +/// `path_open` with `fdflag::rsync` and `fdflag::dsync`. pub const RIGHTS_FD_SYNC: Rights = 0x10; /// The right to invoke `fd_seek` in such a way that the file offset -/// remains unaltered (i.e., `whence::cur` with offset zero), or to +/// remains unaltered (i.e., `WHENCE_CUR` with offset zero), or to /// invoke `fd_tell`. pub const RIGHTS_FD_TELL: Rights = 0x20; /// The right to invoke `fd_write` and `sock_send`. @@ -332,7 +332,7 @@ pub const RIGHTS_POLL_FD_READWRITE: Rights = 0x8000000; pub const RIGHTS_SOCK_SHUTDOWN: Rights = 0x10000000; pub type Fd = u32; #[repr(C)] -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone)] pub struct Iovec { /// The address of the buffer to be filled. pub buf: *mut u8, @@ -340,7 +340,7 @@ pub struct Iovec { pub buf_len: Size, } #[repr(C)] -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone)] pub struct Ciovec { /// The address of the buffer to be written. pub buf: *const u8, @@ -378,7 +378,7 @@ pub const FILETYPE_SOCKET_STREAM: Filetype = 6; /// The file refers to a symbolic link inode. pub const FILETYPE_SYMBOLIC_LINK: Filetype = 7; #[repr(C)] -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone)] pub struct Dirent { /// The offset of the next directory entry stored in this directory. pub d_next: Dircookie, @@ -416,7 +416,7 @@ pub const FDFLAGS_RSYNC: Fdflags = 0x8; /// may also synchronously update the file's metadata. pub const FDFLAGS_SYNC: Fdflags = 0x10; #[repr(C)] -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone)] pub struct Fdstat { /// File type. pub fs_filetype: Filetype, @@ -430,13 +430,13 @@ pub struct Fdstat { } pub type Device = u64; pub type Fstflags = u16; -/// Adjust the last data access timestamp to the value stored in `filestat::atim`. +/// Adjust the last data access timestamp to the value stored in `filestat::st_atim`. pub const FSTFLAGS_ATIM: Fstflags = 0x1; -/// Adjust the last data access timestamp to the time of clock `clockid::realtime`. +/// Adjust the last data access timestamp to the time of clock `clock::realtime`. pub const FSTFLAGS_ATIM_NOW: Fstflags = 0x2; -/// Adjust the last data modification timestamp to the value stored in `filestat::mtim`. +/// Adjust the last data modification timestamp to the value stored in `filestat::st_mtim`. pub const FSTFLAGS_MTIM: Fstflags = 0x4; -/// Adjust the last data modification timestamp to the time of clock `clockid::realtime`. +/// Adjust the last data modification timestamp to the time of clock `clock::realtime`. pub const FSTFLAGS_MTIM_NOW: Fstflags = 0x8; pub type Lookupflags = u32; /// As long as the resolved path corresponds to a symbolic link, it is expanded. @@ -452,7 +452,7 @@ pub const OFLAGS_EXCL: Oflags = 0x4; pub const OFLAGS_TRUNC: Oflags = 0x8; pub type Linkcount = u64; #[repr(C)] -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone)] pub struct Filestat { /// Device ID of device containing the file. pub dev: Device, @@ -473,20 +473,20 @@ pub struct Filestat { } pub type Userdata = u64; pub type Eventtype = u8; -/// The time value of clock `subscription_clock::id` has -/// reached timestamp `subscription_clock::timeout`. +/// The time value of clock `subscription::u.clock.clock_id` has +/// reached timestamp `subscription::u.clock.timeout`. pub const EVENTTYPE_CLOCK: Eventtype = 0; -/// File descriptor `subscription_fd_readwrite::file_descriptor` has data +/// File descriptor `subscription::u.fd_readwrite.fd` has data /// available for reading. This event always triggers for regular files. pub const EVENTTYPE_FD_READ: Eventtype = 1; -/// File descriptor `subscription_fd_readwrite::file_descriptor` has capacity +/// File descriptor `subscription::u.fd_readwrite.fd` has capacity /// available for writing. This event always triggers for regular files. pub const EVENTTYPE_FD_WRITE: Eventtype = 2; pub type Eventrwflags = u16; /// The peer of this socket has closed or disconnected. pub const EVENTRWFLAGS_FD_READWRITE_HANGUP: Eventrwflags = 0x1; #[repr(C)] -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone)] pub struct EventFdReadwrite { /// The number of bytes available for reading or writing. pub nbytes: Filesize, @@ -494,27 +494,32 @@ pub struct EventFdReadwrite { pub flags: Eventrwflags, } #[repr(C)] -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone)] +pub union EventU { + /// When type is `eventtype::fd_read` or `eventtype::fd_write`: + pub fd_readwrite: EventFdReadwrite, +} +#[repr(C)] +#[derive(Copy, Clone)] pub struct Event { /// User-provided value that got attached to `subscription::userdata`. pub userdata: Userdata, /// If non-zero, an error that occurred while processing the subscription request. pub error: Errno, - /// The type of event that occured + /// The type of the event that occurred. pub r#type: Eventtype, - /// The contents of the event, if it is an `eventtype::fd_read` or - /// `eventtype::fd_write`. `eventtype::clock` events ignore this field. - pub fd_readwrite: EventFdReadwrite, + /// The contents of the event. + pub u: EventU, } pub type Subclockflags = u16; /// If set, treat the timestamp provided in -/// `subscription_clock::timeout` as an absolute timestamp of clock -/// `subscription_clock::id`. If clear, treat the timestamp -/// provided in `subscription_clock::timeout` relative to the -/// current time value of clock `subscription_clock::id`. +/// `subscription::u.clock.timeout` as an absolute timestamp of clock +/// `subscription::u.clock.clock_id.` If clear, treat the timestamp +/// provided in `subscription::u.clock.timeout` relative to the +/// current time value of clock `subscription::u.clock.clock_id.` pub const SUBCLOCKFLAGS_SUBSCRIPTION_CLOCK_ABSTIME: Subclockflags = 0x1; #[repr(C)] -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone)] pub struct SubscriptionClock { /// The clock against which to compare the timestamp. pub id: Clockid, @@ -527,32 +532,28 @@ pub struct SubscriptionClock { pub flags: Subclockflags, } #[repr(C)] -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone)] pub struct SubscriptionFdReadwrite { /// The file descriptor on which to wait for it to become ready for reading or writing. pub file_descriptor: Fd, } #[repr(C)] #[derive(Copy, Clone)] -pub union SubscriptionUU { +pub union SubscriptionU { + /// When type is `eventtype::clock`: pub clock: SubscriptionClock, - pub fd_read: SubscriptionFdReadwrite, - pub fd_write: SubscriptionFdReadwrite, -} -#[repr(C)] -#[derive(Copy, Clone)] -pub struct SubscriptionU { - pub tag: Eventtype, - pub u: SubscriptionUU, + /// When type is `eventtype::fd_read` or `eventtype::fd_write`: + pub fd_readwrite: SubscriptionFdReadwrite, } - #[repr(C)] #[derive(Copy, Clone)] pub struct Subscription { /// User-provided value that is attached to the subscription in the /// implementation and returned through `event::userdata`. pub userdata: Userdata, - /// The type of the event to which to subscribe, and its contents + /// The type of the event to which to subscribe. + pub r#type: Eventtype, + /// The contents of the subscription. pub u: SubscriptionU, } pub type Exitcode = u32; @@ -668,7 +669,7 @@ pub type Preopentype = u8; /// A pre-opened directory. pub const PREOPENTYPE_DIR: Preopentype = 0; #[repr(C)] -#[derive(Copy, Clone, Debug)] +#[derive(Copy, Clone)] pub struct PrestatDir { /// The length of the directory name for use with `fd_prestat_dir_name`. pub pr_name_len: Size, @@ -676,17 +677,19 @@ pub struct PrestatDir { #[repr(C)] #[derive(Copy, Clone)] pub union PrestatU { + /// When type is `preopentype::dir`: pub dir: PrestatDir, } #[repr(C)] #[derive(Copy, Clone)] pub struct Prestat { - pub tag: Preopentype, + /// The type of the pre-opened capability. + pub pr_type: Preopentype, + /// The contents of the information. pub u: PrestatU, } - /// Read command-line argument data. -/// The size of the array should match that returned by `args_sizes_get` +/// The size of the array should match that returned by `wasi_args_sizes_get()` pub unsafe fn args_get(argv: *mut *mut u8, argv_buf: *mut u8) -> Result<()> { let rc = wasi_snapshot_preview1::args_get(argv, argv_buf); if let Some(err) = Error::from_raw_error(rc) { @@ -714,7 +717,7 @@ pub unsafe fn args_sizes_get() -> Result<(Size, Size)> { } /// Read environment variable data. -/// The sizes of the buffers should match that returned by `environ_sizes_get`. +/// The sizes of the buffers should match that returned by `environ.sizes_get()`. pub unsafe fn environ_get(environ: *mut *mut u8, environ_buf: *mut u8) -> Result<()> { let rc = wasi_snapshot_preview1::environ_get(environ, environ_buf); if let Some(err) = Error::from_raw_error(rc) { @@ -724,29 +727,26 @@ pub unsafe fn environ_get(environ: *mut *mut u8, environ_buf: *mut u8) -> Result } } -/// Return environment variable data sizes. +/// Return command-line argument data sizes. /// /// ## Return /// -/// * `environc` - The number of environment variable arguments. -/// * `environ_buf_size` - The size of the environment variable data. +/// * `argc` - The number of arguments. +/// * `argv_buf_size` - The size of the argument string data. pub unsafe fn environ_sizes_get() -> Result<(Size, Size)> { - let mut environc = MaybeUninit::uninit(); - let mut environ_buf_size = MaybeUninit::uninit(); - let rc = wasi_snapshot_preview1::environ_sizes_get( - environc.as_mut_ptr(), - environ_buf_size.as_mut_ptr(), - ); + let mut argc = MaybeUninit::uninit(); + let mut argv_buf_size = MaybeUninit::uninit(); + let rc = + wasi_snapshot_preview1::environ_sizes_get(argc.as_mut_ptr(), argv_buf_size.as_mut_ptr()); if let Some(err) = Error::from_raw_error(rc) { Err(err) } else { - Ok((environc.assume_init(), environ_buf_size.assume_init())) + Ok((argc.assume_init(), argv_buf_size.assume_init())) } } /// Return the resolution of a clock. -/// Implementations are required to provide a non-zero value for supported clocks. For unsupported clocks, -/// return `errno::inval`. +/// Implementations are required to provide a non-zero value for supported clocks. For unsupported clocks, return `WASI_EINVAL` /// Note: This is similar to `clock_getres` in POSIX. /// /// ## Parameters @@ -874,7 +874,7 @@ pub unsafe fn fd_fdstat_set_flags(fd: Fd, flags: Fdflags) -> Result<()> { } /// Adjust the rights associated with a file descriptor. -/// This can only be used to remove rights, and returns `errno::notcapable` if called in a way that would attempt to add rights +/// This can only be used to remove rights, and returns `ENOTCAPABLE` if called in a way that would attempt to add rights /// /// ## Parameters /// @@ -1279,7 +1279,7 @@ pub unsafe fn path_link( /// /// * `dirflags` - Flags determining the method of how the path is resolved. /// * `path` - The relative path of the file or directory to open, relative to the -/// `path_open::fd` directory. +/// `dirfd` directory. /// * `oflags` - The method by which to open the file. /// * `fs_rights_base` - The initial rights of the newly created file descriptor. The /// implementation is allowed to return a file descriptor with fewer rights @@ -1349,7 +1349,7 @@ pub unsafe fn path_readlink(fd: Fd, path: &str, buf: *mut u8, buf_len: Size) -> } /// Remove a directory. -/// Return `errno::notempty` if the directory is not empty. +/// Return `ENOTEMPTY` if the directory is not empty. /// Note: This is similar to `unlinkat(fd, path, AT_REMOVEDIR)` in POSIX. /// /// ## Parameters @@ -1411,7 +1411,7 @@ pub unsafe fn path_symlink(old_path: &str, fd: Fd, new_path: &str) -> Result<()> } /// Unlink a file. -/// Return `errno::isdir` if the path refers to a directory. +/// Return `EISDIR` if the path refers to a directory. /// Note: This is similar to `unlinkat(fd, path, 0)` in POSIX. /// /// ## Parameters @@ -1586,18 +1586,17 @@ pub mod wasi_snapshot_preview1 { #[link(wasm_import_module = "wasi_snapshot_preview1")] extern "C" { /// Read command-line argument data. - /// The size of the array should match that returned by `args_sizes_get` + /// The size of the array should match that returned by `wasi_args_sizes_get()` pub fn args_get(argv: *mut *mut u8, argv_buf: *mut u8) -> Errno; /// Return command-line argument data sizes. pub fn args_sizes_get(argc: *mut Size, argv_buf_size: *mut Size) -> Errno; /// Read environment variable data. - /// The sizes of the buffers should match that returned by `environ_sizes_get`. + /// The sizes of the buffers should match that returned by `environ.sizes_get()`. pub fn environ_get(environ: *mut *mut u8, environ_buf: *mut u8) -> Errno; - /// Return environment variable data sizes. - pub fn environ_sizes_get(environc: *mut Size, environ_buf_size: *mut Size) -> Errno; + /// Return command-line argument data sizes. + pub fn environ_sizes_get(argc: *mut Size, argv_buf_size: *mut Size) -> Errno; /// Return the resolution of a clock. - /// Implementations are required to provide a non-zero value for supported clocks. For unsupported clocks, - /// return `errno::inval`. + /// Implementations are required to provide a non-zero value for supported clocks. For unsupported clocks, return `WASI_EINVAL` /// Note: This is similar to `clock_getres` in POSIX. pub fn clock_res_get(id: Clockid, resolution: *mut Timestamp) -> Errno; /// Return the time value of a clock. @@ -1622,7 +1621,7 @@ pub mod wasi_snapshot_preview1 { /// Note: This is similar to `fcntl(fd, F_SETFL, flags)` in POSIX. pub fn fd_fdstat_set_flags(fd: Fd, flags: Fdflags) -> Errno; /// Adjust the rights associated with a file descriptor. - /// This can only be used to remove rights, and returns `errno::notcapable` if called in a way that would attempt to add rights + /// This can only be used to remove rights, and returns `ENOTCAPABLE` if called in a way that would attempt to add rights pub fn fd_fdstat_set_rights( fd: Fd, fs_rights_base: Rights, @@ -1776,7 +1775,7 @@ pub mod wasi_snapshot_preview1 { bufused: *mut Size, ) -> Errno; /// Remove a directory. - /// Return `errno::notempty` if the directory is not empty. + /// Return `ENOTEMPTY` if the directory is not empty. /// Note: This is similar to `unlinkat(fd, path, AT_REMOVEDIR)` in POSIX. pub fn path_remove_directory(fd: Fd, path_ptr: *const u8, path_len: usize) -> Errno; /// Rename a file or directory. @@ -1799,7 +1798,7 @@ pub mod wasi_snapshot_preview1 { new_path_len: usize, ) -> Errno; /// Unlink a file. - /// Return `errno::isdir` if the path refers to a directory. + /// Return `EISDIR` if the path refers to a directory. /// Note: This is similar to `unlinkat(fd, path, 0)` in POSIX. pub fn path_unlink_file(fd: Fd, path_ptr: *const u8, path_len: usize) -> Errno; /// Concurrently poll for the occurrence of a set of events. diff --git a/version b/version index 8bcf838c39..4fc37672f7 100644 --- a/version +++ b/version @@ -1 +1 @@ -1.51.0 (2fd73fabe 2021-03-23) \ No newline at end of file +1.52.0-beta.3 (215738137 2021-04-06) \ No newline at end of file -- 2.39.2
    -

    wasi

    - -A
    Bytecode Alliance project - -

    - WASI API Bindings for Rust -

    - -

    - Crates.io version - Download - docs.rs docs -

    -